SW = 6300从Android读取ePassport时出错

时间:2019-01-22 15:26:18

标签: authentication nfc access-control apdu contactless-smartcard

我遵循了ICAO的第7版“第11部分的附录D-实际示例:基本访问控制”,以便使用Xamarin.Android创建一个Android应用,该Android可从ePassport读取数据。但是,我在EXTERNAL AUTHENTICATE步骤中从芯片上获取了6300状态代码,并且关于该错误代码的信息不多。太模糊了...

以下是该应用执行的步骤的日志:

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 :(得分:2)

您的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密钥的奇偶校验位的密码库,否则不会有任何区别。您当前的加密库似乎忽略了它们,并给出了预期的结果。


更新(在下面的评论中总结讨论)

此外,您是否已验证文件编号,出生日期和有效日期与机器可读区域中使用的格式完全匹配?问题中的证件号码和有效日期似乎都不是真实护照的合理值。

最后,正如Maarten解释的那样,状态字6300指示身份验证失败。您不能期望该文档透露有关身份验证为何失败的更多详细信息。当然,这不是缺少国际民航组织的规范,而是从安全角度出发的必要性。例如,想象一下,护照将能够报告您用作输入的出生日期是错误的。这样,攻击者将只能对部分关键输入进行暴力破解。

答案 1 :(得分:1)

正如@Michael Roland指出的那样,所有步骤和计算都是正确的,但是按照建议仔细检查了MRZ(输入)后,我注意到我错误键入了DateOfBirth,这导致了状态码=6300。因此,该状态码可能会返回输入错误时

不幸的是,国际民航组织的文件不够清楚,无法表明这种情况。