вторник, 2 сентября 2014 г.

Эмулятор виртуальной смарткарты

В процессе изучения вопроса по использованию смарткарт в Linux наткнулся на проект Virtual Smart Card Architecture который предоставляет средства для эмуляции ридеров и самих смарткарт в Linux, Windows и MacOS X.

Features
  • Virtual smart card: Emulates a German Elektronischer Reisepass, ISO-7816 or cryptoflex cards
  • Virtual smart card: Connects to virtual reader over the internet
  • Virtual smart card: Supports relaying a local smart card to the virtual reader
  • PCSC relay: Emulates a ISO/IEC 14443 smart card relaying communication to a local smart card
  • PCSC relay: Uses OpenPICC or libnfc devices as NFC antenna for card emulation
  • nPA Library: Supports establishing a secure messaging channel to the new German identity card ("neuer Personalausweis" nPA)
  • nPA Library: Supports easy to use secure messaging implementation
  • nPA Library: Includes tool for PIN management for the nPA
  • Smart card reader emulator: Compatible with default CCID driver for windows and unix
  • Smart card reader emulator: Supports secure PIN commands
  • Smart card reader emulator: Supports PACE ("Standardleser" CAT-S)

Из всего фреймворка меня в первую очередь интересует функционал по эмуляции виртуальной смарткарты, потому я и подготовил пакет для пары экспериментов.

Установить его можно из моего репозитория

$ sudo aptitude install virtualsmartcard
$ sudo service pcscd restart

Для удобства работы со смарткартами нужно установить пакет opensc.

$ sudo aptitude install opensc

И затем проверить, что виртуальные ридеры видны в системе и доступны прикладному софту.

$ opensc-tool --list-readers
# Detected readers (pcsc)
Nr.  Card  Features  Name
0    No              Virtual PCD 00 00
1    No              Virtual PCD 00 01
2    No              Virtual PCD 00 02
3    No              Virtual PCD 00 03
4    No              Virtual PCD 00 04
5    No              Virtual PCD 00 05
6    No              Virtual PCD 00 06
7    No              Virtual PCD 00 07
8    No              Virtual PCD 00 08
9    No              Virtual PCD 00 09
10   No              Broadcom Corp 5880 [Contacted SmartCard] (0123456789ABCD) 00 00

В соседнем терминале запустим эмулятор смарткарты стандарта ISO7816 и проверим реакцию на это событие.

$ vicc -t iso7816
02.09.2014 11:24:28  [WARNING] Using default SAM parameters. PIN=1234, Card Nr=1234567890
02.09.2014 11:24:28  [INFO] Connected to virtual PCD at localhost:35963
02.09.2014 11:24:28  [INFO] Power Up
02.09.2014 11:24:29  [INFO] Power Down

Теперь обновим состояние ридеров - по идее сейчас виртуальная карта должна появиться в одном из ридеров.

$ opensc-tool --list-readers
# Detected readers (pcsc)
Nr.  Card  Features  Name
0    Yes             Virtual PCD 00 00
1    No              Virtual PCD 00 01
2    No              Virtual PCD 00 02
3    No              Virtual PCD 00 03
4    No              Virtual PCD 00 04
5    No              Virtual PCD 00 05
6    No              Virtual PCD 00 06
7    No              Virtual PCD 00 07
8    No              Virtual PCD 00 08
9    No              Virtual PCD 00 09
10   No              Broadcom Corp 5880 [Contacted SmartCard] (0123456789ABCD) 00 00

Все верно и в первом ридере статус карты сменился с "No" на "Yes". Теперь попробуем поработать с картой через opensc-explorer.

Запрос информации о корневом файле
OpenSC [3F00]> info 3F00

Dedicated File  ID 3F00

File path:     3F00
File size:     65535 bytes
ACL for SELECT:       N/A
ACL for LOCK:         N/A
ACL for DELETE:       NONE
ACL for CREATE:       NONE
ACL for REHABILITATE: NONE
ACL for INVALIDATE:   NONE
ACL for LIST FILES:   NONE
ACL for CRYPTO:       N/A
ACL for DELETE SELF:  N/A

Генерация 8 случайных чисел в смарткарте
OpenSC [3F00]> random 8
00000000: F9 B3 C9 9D 8F D6 DC 81 ........

Создаем на смарткарте файл 8888/1F00 и загружаем его обратно на диск
$ dd if=/dev/urandom of=test.bin bs=1024 count=1
1+0 записей считано
1+0 записей написано
 скопировано 1024 байта (1,0 kB), 0,000283354 c, 3,6 MB/c

$ opensc-explorer
OpenSC [3F00]> mkdir 8888 256

OpenSC [3F00]> cd 8888

OpenSC [3F00/8888]> create 1F00 1024

OpenSC [3F00/8888]> put 1F00 test.bin
Total of 1024 bytes written.

OpenSC [3F00/8888]> info 1F00

Elementary File  ID 1F00

File path:     3F00/8888/1F00
File size:     1024 bytes
EF structure:  Transparent
ACL for READ:         N/A
ACL for UPDATE:       N/A
ACL for DELETE:       N/A
ACL for WRITE:        N/A
ACL for REHABILITATE: N/A
ACL for INVALIDATE:   N/A
ACL for LIST FILES:   N/A
ACL for CRYPTO:       N/A

OpenSC [3F00/8888]> get 1F00 check.bin
Total of 1024 bytes read from 1F00 and saved to check.bin.

OpenSC [3F00/8888]> rm 1F00

OpenSC [3F00/8888]> cd ..

OpenSC [3F00]> rm 8888

Проверим, что содержимое файлов test.bin и check.bin совпадает

$ md5sum test.bin check.bin 
804420d7560e82065b74eff561cfb2c8  test.bin
804420d7560e82065b74eff561cfb2c8  check.bin

Несмотря на работу базовых функций инициализировать карту в формат PKCS15 не удастся.

Если нужна низкоуровневая работа с картой, то можно попробовать инструмент Java Smart Card Explorer.

$ wget --trust-server-names http://sourceforge.net/projects/jsmartcard/files/latest/download
$ java -jar JSmartCardExplorer.jar


Комментариев нет:

Отправить комментарий