SW = 6300 Ошибка чтения электронного паспорта с Android - PullRequest
0 голосов
/ 22 января 2019

Я следовал седьмому изданию ИКАО «Приложение D к части 11 - Рабочий пример: базовый контроль доступа», чтобы создать приложение Android с Xamarin.Android, которое считывает данные из электронного паспорта. Тем не менее, я получаю код состояния 6300 от микросхемы на этапе EXTERNAL AUTHENTICATE, и об этом коде ошибки не так много информации. Это слишком расплывчато ...

Вот журнал шагов, выполняемых приложением:

Tag tech list from the chip: android.nfc.tech.IsoDep, android.nfc.tech.NfcA

Select AID command:
00A4040C07A0000002471001

Select AID response:
9000

GET_CHALLENGE command:
0084000008

GET_CHALLENGE response:
6211B520F00565DD9000

documentNumber:
HU1234560

dateOfBirth:
920229

dateOfExpiry:
150101

keySeed SHA1(documentNumber + checkDigit + dateOfBirth + checkDigit + dateOfExpiry + checkDigit):
F3B48FDEF6A2374676C6B8892AFA58FB

kEnc SHA1(keySeed + 00000001):
9F399B0855DAD12F04FB3CB84D1F9AB3

kMac SHA1(keySeed + 00000002):
51102BA4C6A69CEF26BD45C94537B103

rndIFD:
CC95C0CD499F6306

kIFD:
39D661B07605B175E8BEF948609556F1

rndICC:
6211B520F00565DD

S:
CC95C0CD499F63066211B520F00565DD39D661B07605B175E8BEF948609556F1

eIFD(DesEdeEngine/CBC/NoPadding):
EC95CF0953AF87CA7FE3059A4B89A018309E8FD60359F38C4BA3216E763DD1D4

mIFD(DesEngine/ISO9797Alg3Mac/ISO7816d4Padding):
CED0EA4979A35978

External Authenticate command:
0082000028EC95CF0953AF87CA7FE3059A4B89A018309E8FD60359F38C4BA3216E763DD1CED0EA4979A359780028

External Authenticate response:
6300

Любые рекомендации?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Как отметил @Michael Roland, все шаги и вычисления верны, но после двойной проверки MRZ (входных данных), как и предполагалось, я заметил, что набрал опечатку DateOfBirth, который вызвал код состояния = 6300. Таким образом, этот код состояния может быть возвращен при неправильном вводе .

К сожалению, документация ИКАО недостаточно четкая, чтобы указывать на этот сценарий.

0 голосов
/ 29 января 2019

Ваша команда EXTERNAL AUTHENTICATE неверна.Выглядит так, как будто вы копируете значение M_IFD в неправильную позицию (по одному).Следовательно, вы отсекаете последний байт E_IFD и в конце получаете нулевой байт:

00 82 0000 28 EC95CF0953AF87CA7FE3059A4B89A018309E8FD60359F38C4BA3216E763DD1 CED0EA4979A35978 00 28
                                                                           ^^                 ^^
                        Last byte of E_IFD missing (only 31 bytes here) <--/                  |
                                                                Additional zero byte here? <--/

Кроме того, ваши значения (более или менее) соответствуют значениям моего тестового стенда MRTD.Вы не исправили биты четности K_ENC и K_MAC, но это не будет иметь никакого значения, если вы не будете (в будущем) использовать криптографическую библиотеку, которая фактически проверяет биты четности ключей DES.Ваша текущая крипто-библиотека, кажется, игнорирует их и дает ожидаемый результат.


ОБНОВЛЕНИЕ (итоги обсуждения в комментариях ниже)

Кроме того, вы проверили, что номер документа, датаРождение и дата истечения точно соответствуют форме, используемой в машиночитаемой зоне?И номер документа, и дата истечения срока в вашем вопросе не кажутся приемлемыми значениями для реального паспорта.

Наконец, как объяснил Мартен, слово состояния 6300 указывает на то, что аутентификация не удалась.Вы не можете ожидать, что документ покажет дополнительную информацию о том, почему именно аутентификация не удалась.Это, конечно, не недостаток спецификаций ИКАО, а необходимость с точки зрения безопасности.Представьте, например, что паспорт сможет сообщить, что дата рождения, которую вы указали в качестве ввода, была неверной.Тогда злоумышленник сможет перебором только ту часть клавишного ввода.

...