Pull to refresh

Работа с командами APDU на примере EToken

Reading time5 min
Views6.4K
"… Путь не так уж сложен для понимания. Силы природы, естественные наклонности, схемы событий…
Примитивное миропонимание замечает только четыре стихии и дальше этого не идёт. Словно вселенная сводится к четырём доступным созерцанию понятным явлениям."
Стивен Эриксон.
«Полночный прилив».


image

Привет, Хабр!

Тема APDU здесь поднималась неоднократно, но в основном касалась смарт карт, для которых нужен карт ридер и карта которую не жалко, плюс софт, так как работать с консольным интерфейсом OpenSC, по крайней мере в Window$, мягко говоря неудобно.
Для этого я написал небольшую программу с оконным интерфесом, работающую через winscard.
Исходники и бинарники можно скачать здесь.
Компилировалось это под Visual studio 2008, необходимо добавить в проект WinSCard.Lib из Microsoft Windows SDK.

Наверное у многих найдутся синие рыбки EToken PRO Java 72 K с истёкшими много лет назад сертификатами ЭЦП (использовать «боевой», с действующей ЭЦП, токен для экспериментов настоятельно не рекомендуется!).
Подойдут также JaCarta Pro, от етокенов отличающиеся только внешне.
Можно также попробовать работать с Gemalto SafeNet eToken 5100, у них можно просмотреть содержимое директорий, но прочитать файл не получится из-за очень маленького (вероятно несколько миллисекунд) таймаута между командами выбрать и прочитать файл, в результате чего команда прочитать файл при ручном вводе ссылается уже на пустое место (ошибка с кодом 69 85). Возможно это одна из причин того, что на некоторых платформах на этих токенах перестают видеть ключи. Относительно SafeNet eToken 5100 (с честной надписью на боку «Made in China») замечу следующее: «Единый клиент JaCarta» работать с ним не хочет и выводит сообщение, что сие изделие не поддерживается, 64-х разрядный eToken PKI Client 5.1 от Aladdin его не видит, но 32 версия под Win XP с ним работает, хотя для этого токена желательно конечно ставить оригинальный SafeNet Authentication Client.

Другие токены, в том числе семейства JaCarta, не подойдут, так как команды APDU у них всех абсолютно разные и их цифровое значение описанному в стандарте ISO7816 не соответствует.

Подробности про формат команд APDU можно прочитать например здесь.
Читатель имеющий синюю рыбку может ознакомиться с работой APDU не вставая с дивана.
Необходимо установить драйвер для eToken eToken PKI Client 5.1 или «Единый клиент JaCarta» и подключить токен.

Для подробного просмотра содержимого токена в удобном виде и сверки с тем, что дают команды APDU можно использовать написанный мной на Autoit JaCarta Editor.

Запускаем APDUExplorer, выбираем в списке ридеров «Aladdin Token JC 0» или «ARDS JaCarta 0» или «SafeNet Token JC 0» и можно вводить команды.
Вводить можно как через двоеточия так и через пробелы или всё слитно.

Для начала можно проверить работоспособность, кликнув «Check ATR» и получить ответ токена.

Первая команда — выбор апплета по умолчанию и переход в корневую директорию с идентификатором 3f00 (этот идентификатор пожалуй единственное общее у токенов любых вендоров).
00:A4:00:04:00

Далее получаем список папок корневой директории
80:01:01:00:04:09:02:00:00:CD (команда является константой «Сообщить список папок»).
Должен быть получен ответ:
0a 02 66 66 0b 01 00 90 00

Второй по счёту байт в ответе размер полученных данных — два байта, то есть только одна папка (идентификатор файла или папки в APDU всегда занимает два байта).
И мы видим только одну папку с идентификатором 66 66, называемую Aladdin AID directory.

Сообщить список файлов (тоже константа)
80:01:02:00:04:09:02:00:00:CD
Должно быть получено
0a 00 0b 01 00 90 00
Ответ в позиции 01 — файлов 00.

Переходим в директорию 66 66
00 A4 08 04 02 66 66 00
Это команда SELECT FILE, её формат: четыре байта сама команда 00 A4 08 04, далее размер поля данных полного пути (в примере 02 байта), затем сам путь (в примере 66 66) и обязательно завершение 00.

Сообщить список папок директории 66 66
80:01:01:00:04:09:02:00:00:CD
Resv bytes:
0a 04 50 01 50 00 0b 01 00 90 00
В поле ответа 01 (размер ответа) указано 04, т.е. 4 байта = две папки 50 01 и 50 00, при этом 50 01 — служебная, а 50 00 основная, называемая PKCS#11 directory, где хранятся все данные

Сообщить список файлов директории 66 66
80:01:02:00:04:09:02:00:00:CD
Resv bytes:
0a 00 0b 01 00 90 00
Файлов здесь нет.

Как показали исследования видимых папок и файлов в директории 50 01 нет, поэтому переходим в основную директорию 50 00
00 A4 08 04 04 66 66 50 00 00
Сообщить список папок
80:01:01:00:04:09:02:00:00:CD
Ответ будет зависить от того что хранится на токене.
Сообщить список файлов
80:01:02:00:04:09:02:00:00:CD
Resv bytes:
0a 14 00 0f 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0a 0b 01 00 90 00
Мы видим 14 файлов (поле ответа 01), далее каждые 2 байта это имена файлов, затем идёт служебная информация.

У каждого токена изучаемых моделей всегда пристутствует системная директория b000 и в ней системный файл 0002, попробуем его прочитать, по этому же принципу можно читать и другие файлы.
Переходим в директорию b0 00
00 A4 08 04 06 66 66 50 00 B0 00 00
Получаем список файлов
80:01:02:00:04:09:02:00:00:CD
Resv bytes:
0a 02 00 02 0b 01 00 90 00
Видим файл 00 02 (байт в поле ответа 01 — размер имени (каждое имя всегда занимает два байта, следующие поля — имена файлов, в данном случае файл только один, что определяем по значению поля 01).

Выбрать файл 0002 из B000 по полному пути
00 A4 08 04 08 66 66 50 00 B0 00 00 02 00
Resv bytes:
01 01 02 02 02 00 02 03 02 00 10 04 08 00 ff 00 00 ff ff ff ff 05 00 90 00
Формат ответа здесь следующий: преамбула — 2 байта, тип файла — 1 байт (02 файл, 01 папка), разделитель — 2 байта, имя файла — 2 байта, разделитель — 2 байта, размер файла — 2 байта, разделитель — 2 байта, права доступа — 1 байт (00 — доступен для всех, 63 защищён пин кодом). Далее идёт некая служебная информация, завершающаяся кодом успешного выполнения APDU команды — 90 00.

Прочитать этот файл, последние два байта команды размер буфера сколько надо прочитать (в данном случае равен размеру файла).
80 18 00 00 04 0E 02 00 00 10
Resv bytes: (значение в каждом случае будет своё):
00 06 63 61 72 64 63 66 00 00 00 00 00 00 00 00 90 00

Аутентификацию на етокене я здесь не рассматриваю, так как она состоит из последовательности команд вопрос-ответ и происходит в зашифрованном виде (существует проект Antitoken где проблему авторизации на этих изделиях решили кардинально).
Некоторые другие токены, например JaCarta ГОСТ-2 поддерживают аутентификацию простой передачей пин кода.

Получить значения APDU команд любых смарт-карт и токенов можно путём перехвата трафика WinSCard.dll, запустив сниффер, скомпилированный отсюда (как показали эксперименты, этот сниффер устанавливается и запускается только под Win XP).

Справочно, возможные результаты выполнения APDU команд:
90 00 — OK
69 85 — Conditions of use not stisfied
63 00 — Authentication of host cryptogram failed (Ext auth)
64 00 — No specific diagnosis
67 00 — Wrong length in Lc
67 XX — Error, incorrect parameter P3 (ISO code)
68 81 — Logical channel not supported or is not active
69 82 — Security status not satisfied
69 83 — Secret code locked
69 85 — No currently selected EF, no command to monitor / no Transaction Manager File
6A 80 — The parameters in the data field are incorrect
6A 81 — Card is blocked or command not supported
6A 82 — File not found
6A 85 — Lc inconsistent with TLV structure
6A 86 — Incorrect P1 P2
6A 88 — Referenced data not found (Init upd)
6D 00 — Invalid instruction
6E 00 — Invalid class
Tags:
Hubs:
Total votes 11: ↑8 and ↓3+5
Comments2

Articles