Поддержка библиотеки uFCoder Машиночитаемые проездные документы (MRTD)
View Categories

Поддержка библиотеки uFCoder Машиночитаемые проездные документы (MRTD)

Введение #

В библиотеке uFCoder реализована поддержка чтения групп данных с метки NFC, встроенной в машиночитаемые проездные документы (MRTD), включая электронные паспорта, соответствующие спецификациям ИКАО.

Реализация поддерживает механизм базового контроля доступа (BAC) для доступа к чипу NFC. BAC обеспечивает аутентификацию и безопасный криптографический канал связи с меткой NFC, встроенной в MRTD. BAC основан исключительно на симметричной криптографии с использованием алгоритма 3DES и реализован в соответствии с ICAO 9303, часть 11.

ИКАО расшифровывается как Международная организация гражданской авиации (https://www.icao.int). Спецификация ИКАО 9303 стандартизирует MRTD, включая электронные паспорта. Вы можете найти всю серию документов ИКАО Doc 9303 https://www.icao.int/publications/pages/publication.aspx?docnum=9303веб-сайте.

Базовый контроль доступа MRTD поддерживается в библиотеке uFCoder версии 5.0.12.

Для того, чтобы сначала аутентифицироваться в NFC-метке, встроенной в MRTD, вы должны передать номер документа, дату рождения владельца документа и дату истечения срока действия документа для функционирования MRTD_MRZDataToMRZProtoKey(), чтобы получить «прото-ключ», из которого будут получены другие необходимые ключи безопасности. Все данные, необходимые для получения «прото-ключа» (номер документа, дата рождения владельца документа и дата истечения срока действия документа), кодируются в машиночитаемой зоне (MRZ), поэтому библиотека имеет функцию MRTD_MRZSubjacentToMRZProtoKey(), которую можно вызвать вместо MRTD_MRZDataToMRZProtoKey(). Эта функция принимает строку с нулевым завершением, содержащую подложную строку MRZ документа.На скриншоте ниже показан пример MRZ с помеченной подсоставной строкой, содержимое которой вы должны передать в качестве параметра для функционирования MRTD_MRZSubjacentToMRZProtoKey().

Электронный паспорт МРЗ

Функции библиотеки поддержки MRTD #

MRTD_MRZDataToMRZProtoKey #

Описание функции

Чтобы получить MRZ Proto Key, необходимый на последующих шагах, вы можете вызвать эту функцию и передать ей строки с нулевым окончанием, содержащие номер документа, дату рождения владельца документа и дату истечения срока действия документа. После успешного выполнения функции MRZ Proto Key будет храниться в mrz_proto_key 25-байтовом массиве.

Объявление функции (язык C)

UFR_STATUS MRTD_MRZDataToMRZProtoKey(const char *doc_number,

const char *date_of_birth,

const char *date_of_expiry,

[25]uint8_t mrz_proto_key);

Параметры

doc_number Указатель на строку с нулевым окончанием, содержащую ровно 9-значный номер документа.
date_of_birth Указатель на строку с нулевым окончанием, содержащую ровно 6 символов, представляющих дату рождения в формате "YYMMDD".
date_of_expiry Указатель на строку с нулевым окончанием, содержащую ровно 6 символов, представляющих дату истечения срока действия в формате "YYMMDD".
mrz_proto_key Этот массив байтов будет содержать вычисленный протоключ MRZ после успешного выполнения функции. Перед вызовом этой функции этому массиву должно быть выделено не менее 25 байт.

 

MRTD_MRZSubjacentToMRZProtoKey #

Описание функции

Для того, чтобы получить MRZ Proto Key, необходимый на последующих шагах, в случае формата TD3 MRZ (всего 88 символов), вы можете вызвать эту функцию и передать ей строку с нулевым окончанием, содержащую строку MRZ subjacent. Пример формата TD3 MRZ, напечатанного на документе eMRTD, выглядит следующим образом:

<УТОЭРИКССОН<<АННА<МАРИЯ<<<<<<<<<<<<<<<<<<<

L898902C36UTO7408122F1204159ZE184226B<<<<<10

Эта функция должна получить указатель на строку с нулевым завершением, содержащую подложную строку MRZ, т.е. "L898902C36UTO7408122F1204159ZE184226B<<<<<10".

Объявление функции (язык C)

UFR_STATUS MRTD_MRZSubjacentToMRZProtoKey (const char *mrz, uint8_t mrz_proto_key[25]);

Параметры  
МРЗ Указатель на строку с нулевым завершением, содержащую данные MRZ. Согласно документу ИКАО Doc 9303-10, где он имеет три формата данных MRZ: TD1, TD2 или TD3. TD1 содержит ровно 90 символов, TD2 содержит ровно 72 символа, а TD3 содержит ровно 88 символов.
mrz_proto_key Этот массив байтов будет содержать вычисленный протоключ MRZ после успешного выполнения функции. Этот массив должен выделить не менее 25 байт до вызова этой функции.

MRTDAppSelectAndAuthenticateBac #

Описание функции

Используйте эту функцию для аутентификации в NFC-метке eMRTD с помощью BAC. Эта функция устанавливает безопасный канал связи. Канал безопасности поддерживается с помощью параметра send_sequence_cnt . Сеансовыми ключами канала являются ksenc (для шифрования) и ksmac (для вычисления MAC).

Объявление функции (язык C)

UFR_STATUS MRTDAppSelectAndAuthenticateBac(const uint8_t mrz_proto_key[25], uint8_t ksenc[16],

uint8_t ксмак[16],

uint64_t *send_sequence_cnt);

Параметры

mrz_proto_key Протоключ MRZ, полученный с помощью предварительного вызова функции MRTD_MRZDataToMRZProtoKey() или MRTD_MRZSubjacentToMRZProtoKey()
ksenc Этот массив должен иметь выделенное не менее 16 байт до вызова этой функции.Этот массив будет содержать ключ шифрования сеанса после успешного выполнения функции
ксмак Этот массив должен выделить не менее 16 байт до вызова этой функции.Этот массив будет содержать сеансовый ключ для вычисления MAC после успешного выполнения функции.
send_sequence_cnt После успешного выполнения этой функции указатель на это 64-битное значение должен сохраняться и пересылаться при каждом последующем вызове MRTDFileReadBacToHeap() и/или других функций для чтения eMRTD

MRTDFileReadBacToHeap #

Описание функции

Используйте эту функцию для чтения файлов из nfc-метки eMRTD. Вызвать эту функцию можно только после успешного установления канала безопасности ранее вызываемым

Функция MRTDAppSelectAndAuthenticateBac(). Сеансовые ключи ksenc и ksmac, а также send_sequence_cnt параметров приобретаются ранее вызываемыми

Функция MRTDAppSelectAndAuthenticateBac(). После успешного вызова этой функции *output указывает на данные файла, считываемые из файла eMRTD, заданного параметром file_index. Буфер, в котором хранятся данные, автоматически выделяется на кучу памяти во время выполнения функции. Максимальный объем выделяемых данных может составлять 32 КБ. Программист несет ответственность за очистку выделенных данных (т.е. путем вызова free(), стандартной функции C) после использования.

Объявление функции (язык C)

UFR_STATUS MRTDFileReadBacToHeap(const uint8_t *file_index,

uint8_t **выход,

uint32_t *output_length,

const uint8_t ksenc[16],

const uint8_t ksmac[16],

Параметры

file_index

Параметр, указывающий файл, который мы хотим прочитать из eMRTD. Это указатель на массив байтов, содержащий ровно два байта, обозначающих файл eMRTD.Эти два байта являются идентификацией файлов (FID), и есть список FID:

EF.COM = {0x01, 0x1E}
ЭФ. DG1 = {0x01, 0x01}
ЭФ. DG2 = {0x01, 0x02}
ЭФ. DG3 = {0x01, 0x03}
ЭФ. DG4 = {0x01, 0x04}
ЭФ. DG5 = {0x01, 0x05}
ЭФ. DG6 = {0x01, 0x06}
ЭФ. DG7 = {0x01, 0x07}
ЭФ. DG8 = {0x01, 0x08}
ЭФ. DG9 = {0x01, 0x09}
ЭФ. DG10 = {0x01, 0x0A}
ЭФ. DG11 = {0x01, 0x0B}
ЭФ. DG12 = {0x01, 0x0C}
ЭФ. DG13 = {0x01, 0x0D}
ЭФ. DG14 = {0x01, 0x0E}
ЭФ. DG15 = {0x01, 0x0F}
ЭФ. DG16 = {0x01, 0x10}
ЭФ. SOD = {0x01, 0x1D}

*выпуск После успешного вызова этой функции этот указатель указывает на данные файла, считываемые из файла eMRTD, заданного параметром file_index. Буфер, в котором хранятся данные, автоматически выделяется во время выполнения функции. Максимальный объем выделяемых данных может составлять 32 КБ. Программист несет ответственность за очистку выделенных данных (т.е. путем вызова free(), стандартной функции C) после использования.
output_length После успешного вызова этой функции этот указатель указывает на размер данных файла, считываемых из файла eMRTD, заданного параметром file_index.
ksenc Ключ шифрования сеанса, полученный с помощью предварительного вызова функции MRTDAppSelectAndAuthenticateBac().
ксмак Сеансовый ключ для вычисления MAC-адресов, полученных с помощью предварительного вызова функции MRTDAppSelectAndAuthenticateBac().
send_sequence_cnt Этот указатель должен указывать на 64-битное значение, инициализированное ранее
успешный вызов функции MRTDAppSelectAndAuthenticateBac(). Указатель на это 64-битное значение должен сохраняться и пересылаться при каждом последующем вызове этой функции и/или других функций, используемых для чтения eMRTD.

uint64_t *send_sequence_cnt);

 

Пример MRTD электронного паспорта #

Этот пример можно загрузить по адресу:

https://code.d-logic.com/nfc-rfid-reader-sdk/ufr-examples-ePassport_mrtd.git

или клонировать весь проект ECLIPSE CDT с помощью:

git clone —рекурсивный https://code.d-logic.com/nfc-rfid-reader-sdk/ufr-examples-ePassport_mrtd.git

Команды.

Если вы хотите только быстрый запуск, скачайте проект и запустите двоичный исполняемый файл из соответствующей папки:

  • Для 32-разрядной версии Windows запустите win32_releaserun_me.cmd
  • Для 64-разрядной версии Windows запустите win64_releaserun_me.cmd
  • для 32-разрядной версии Linux запустите linux32_release/ePassport_mrtd
  • для 64-разрядной версии Linux начните linux64_release/ePassport_mrtd.

Пример программного обеспечения требует, чтобы устройство считывания uFR было подключено и настроено к ПК. Никакое другое приложение или служба, использующая uFR reader, не должна быть запущена на компьютере. После успешного запуска «Примера MRTD ePassport» программное обеспечение запускает основной многие, как показано ниже.

Считыватель электронных паспортов MRTD NFC

<">Теперь вы должны выбрать один из вариантов 'M' или 'P', как указано в инструкциях по использованию приложения на экране.

Если вы выбрали опцию «M», вам будет предложено ввести текст:

Вы выбрали введите подложную строку MRZ, расположенную под 'P<XXXSURNAME<<FIRSTNAME<<<<<<<<<<<<<<<<<<<<<':

Введите вложенную строку MRZ. Подвесная строка MRZ должна состоять из 44 символов.

поэтому введите вложенную строку MRZ. Пример подчиненной строки MRZ можно увидеть на первом изображении.

В противном случае, если вы выбрали опцию 'P', вам будет предложен текст:

Вы решили ввести номер документа, дату рождения и дату истечения срока действия отдельно:

Введите номер документа. Номер документа должен содержать 9 символов.

_________ …

Введите дату рождения. Формат даты должен быть YYMMDD.

______ …

Введите дату истечения срока действия. Формат даты должен быть YYMMDD.

______ …

поэтому введите данные в соответствующем формате.

После того, как вы ввели действительные данные, приложение сообщит вам сообщение:

Прото-ключ MRZ успешно установлен.

——————————————————————-

После этого сообщения вы можете продолжить операции чтения nfc-метки, встроенной в ePassport, к которой принадлежат ранее введенные данные.

Теперь вы можете поместить паспорт в поле считывателя uFR. При успешном установлении связи вы получите основную информацию о NFC-метке в поле считывателя. Например:

——————————————————————-

Тип тега: DL_GENERIC_ISO14443_4, sak = 0x??, uid[4] = ??:??:?:??

——————————————————————-

SAK и UID в этом примере маскируются и могут иметь любое произвольное значение. Электронные паспорта всегда будут распознаваться как DL_GENERIC_ISO14443_4 тип тега.

Теперь вы можете выбрать параметры чтения приложений:

'C' — эта опция считывает общие данные (EF.COM элементарный файл) из ePassport. После успешного чтения данные анализируются и отображаются в следующем формате:

EF.COM успешно прочитана. Длина файла ?? Байт

Исходные данные: 60 xx xx xx

Синтаксический анализ EF.COM необработанных данных:

Версия СПД 01.07

Версия UNICODE 04.00.00

Список существующих групп данных:

Найдено: EF. ДГ1

Найдено: EF. ДГ2

Найдено: EF. ДГ3

Найдено: EF. ДГ14

——————————————————————-

Необработанные данные в этом примере маскируются и могут иметь любое произвольное значение. Присутствовал только тег необработанных данных, и он всегда будет одинаковым (0x60). Когда вы читаете свой собственный документ, вы получаете его фактические необработанные данные здесь. Подробнее о версии СПД и версии UNICODE вы можете прочитать в документе ИКАО 9303, часть 10.

За версиями LDS и UNICODE следует список групп данных, содержащийся в ePassport. Обязательными являются только DG1 и DG2. Все остальные группы данных могут присутствовать или отсутствовать в конкретном MRTD.

'S' — этот параметр считывает объект безопасности документа (EF. SO elementary file) и сохраняет его в двоичный файл, путь и имя которого вы должны ввести при запросе. Объект безопасности документа содержит цифровую подпись в стандартном формате PKCS#7CMS. Наличие EF. ТАК на MRTD является обязательным.

D

'1'— этот параметр читает EF. DG1, разберите его и отобразите необработанные и проанализированные данные в следующем формате:

ЭФ. DG1 успешно прочитан. Длина файла ?? Байт

Необработанные данные:

61 хх хх хх

  1. xx xx xx xx xx  

Простой синтаксический анализ EF. Необработанные данные DG1:

Код документа: P (ePassport)

Государство или организация, выдавшие документ: ???

Имя владельца: ФАМИЛИЯ FIRST_NAME

Номер документа: ?????????

Национальность:???

Дата рождения (дд.ММ.гггг.): ??.??.????.

Секс:????

Дата истечения срока действия (дд.ММ.гггг.): ??.??.????.

Дополнительные данные: ??????????????

——————————————————————-

Необработанные данные в этом примере маскируются и могут иметь любое произвольное значение. Присутствует только тег необработанных данных, и он всегда будет одинаковым (0x61). Когда вы читаете свой собственный документ, вы получаете его фактические необработанные данные здесь.

'2' — эта опция читает EF. DG2 и сохраните его в двоичном файле, путь и имя которого вы должны ввести при запросе. ЭФ. DG2 содержит изображение лица держателя документа и является обязательным. ЭФ. DG2 рядом с изображением лица также может содержать биометрические черты лица. Подробнее о EF. Содержание DG2 вы можете прочитать в документе ИКАО 9303, часть 10.

'I' — эта опция читает EF. ДГ2 до. В этом случае из файла MRTD извлекается только изображение лица и сохраняется в файл, путь и имя которого вы ввели. Формат изображения определяется автоматически, и расширение файла устанавливается в соответствии с ним. Существует два возможных формата файлов изображений, определенных для этого контекста: JPEG или JP2 (т.е.jpeg 2000).

'D' — эта опция считывает любую элементарную группу данных (EF. DG) файла из MRTD и сохраняет его в двоичный файл, путь и имя которого вы должны ввести при запросе. После выбора этого параметра вам будет предложено ввести EF. Индекс DG. Индекс может находиться в диапазоне от 1 до 16 (например, 1 для EF. ГД1 и 14 для EF. ГД14). Элементарный файл, который вы хотите прочитать, должен быть указан в списке EF.COM групп данных.

Чтение некоторых необязательных элементарных файлов, особенно содержащих биометрические данные, требует специальных механизмов безопасности, которые выходят за рамки данного документа.

Текущая версия "ePassport MRTD Example" — 1.0 и зависит от библиотеки uFCoder версии 5.0.12 и прошивки uFR версии 5.0.22.