我试图从电子护照(a.k.a MRTD)读取EF.COM文件。
我成功完成了什么:
- 使用AID 0xA0,0x00,0x00,0x02,0x47,0x10,0x01选择电子护照应用程序 - 从epassport芯片请求挑战nonce - 根据doc9303附录5,通过响应该挑战成功验证。 可以在此处查看Doc 9303号文件:http://www.icao.int/publications/Documents/9303_p1_v2_cons_en.pdf
它有效,现在我正在尝试使用ISO 7816-4的安全消息传递协议读取EF.COM文件,我使用doc9303附录6示例作为指南。
我的安全消息传递代码根据doc9303中的示例正确执行了哪些操作:
- 它生成完全相同的安全APDU,逐字节,与doc9303示例中给出相同输入的APDU。 - 我已经验证我的加密(3DES w / CBC)正常工作,我的MAC算法也是如此
我尝试过:
所以我搜索并找到了ePassport / MRTD / doc9303的两个开源实现。一个用Python(pyPassport-1.0),另一个用Java(JMRTD)。我订购了ACR122读卡器(使用相同的NFC芯片组 - PN532)来试用它,它确实有效。所以我接着看了代码JMRTD和pyPassport用于生成安全消息传递APDU,看起来好像我在做同样的事情。值得庆幸的是,JMRTD附带了一个将APDU转储/跟踪到日志文件的选项。当然,我正在创建与JMRTD完全相同的安全消息传递APDU,我甚至反向设计了一个会话(解密了RND.IFD,RND.ICC,K.ICC,会话密钥等等),创建了一个测试用例和我的代码实际上确实产生了相同的安全APDU输出。
所以我认为我正在构建安全消息传递APDU和DO(数据对象),但是在我执行BAC并进行身份验证并尝试使用受保护的APDU读取EF.COM文件后,我一直收到69 88错误(不正确安全消息传递(SM)数据对象)。这类似于此处报告的问题,虽然我没有使用Android但是我自己的嵌入式NFC堆栈:Android NFC read data from ePassport
我认为它可能是PN532(恩智浦NFC芯片)中的一个设置,我需要更改但我怀疑,因为我正确验证并发送和传输数据没有PN532错误。我尝试将波特率提高到424 kbits / s,但这并没有解决它。
以下是我的代码生成的安全(受保护)APDU的示例。
原始(不安全)APDU:
00 A4 02 0C 02 01 1E
受保护(安全)APDU: 0C A4 02 0C 15 87 09 01 5B B0 63 B9 2A 0D 71 C0 8E 08 E0 B6 68 D2 14 4F 28 B5 00
因此,根据doc9303,我正在构建DO87,因为存在命令参数,而DO8E因为存在校验和(MAC),但没有DO97,因为没有预期的响应有效载荷。我使用87 09 01作为DO87,因为01表示填充类型80 00 00 ...而L是09(我猜它包括01 - 填充指示符字节,这是示例和JMRTD的APDU跟踪。)
我尝试从最后删除Le = 0x00,因为7816-4 doc中的某些语言表明,以及制作Lc' 0x16而不是0x15,如上所示。我也尝试将DO87设为87 08 01而不是87 09 01,如上所示。这些都没有奏效。
我真的非常绝望,我已经做了一段时间了,只是无法解决这个问题。我的受保护APDU结构有问题吗?是否需要更改低级别的PN532设置?
2014年3月19日更新 这是PN532命令/响应跟踪(我对它进行了注释,因此它不那么精力充沛了):
-> GetFirmwareVersion (test command to verify PN532 is awake and online):
00FF02FED4022A0000
0000FF00FF0000 ->ACK
-> Response to GetFirwareVersion:
00FF06FAD50332010607E80000
-> Diagnose, NumTst=0x00:
00FF12EED400000102030405060708090A0B0C0D0E0FB40000
00FF00FF0000 ->ACK
-> Successfull diagnostic (Data returned):
00FF12EED501000102030405060708090A0B0C0D0E0FB20000
-> Diagnose NumTst=0x01:
00FF03FDD400012B0000
00FF00FF0000 ->ACK
-> Successfull diagnostic (0x00):
00FF03FDD501002A0000
-> Diagnose NumTst=0x02:
00FF03FDD400022A0000
00FF00FF0000 ->ACK
-> Successfull diagnostic (0x00):
00FF03FDD501002A0000
-> InListPassiveTarget (max targets one, 106kbit/s Type A anticollision)
00FF04FCD44A0100E10000
00FF00FF0000 ->ACK
-> Found one target, Tg=0x01, SENS_RES=0x07,0x04, SEL_RES=0x20
-> UID = 0x08,0x8B,0x05,0xCF, ATS = 0x05,0x78,0x77,0xB4,0x02 DCS=0x9E:
00FF11EFD54B010107042004088B05CF057877B4029E0000
-> inPSL (change baud to 424kbits/s)
00FF05FBD44E010202D90000
00FF00FF0000 -> ACK
00FF03FDD54F00DC0000 -> Status = 0x00, success
-> inDataExchange (select ePassport application w/ AID in doc9303):
00FF0FF1D4400100A4040C07A0000002471001360000
00FF00FF0000 -> ACK
00FF05FBD5410090005A0000 -> SW1SW2 = 9000 (success)
-> inDataExchange (get nonce/challenge)
00FF08F8D4400100840000085F0000
00FF00FF0000 -> ACK
00FF0DF3D541008EAF826F89F1E5259000A80000 -> SW1SW2 = 9000 (success), RND.ICC = 0x8E,0xAF,0x82,0x6F,0x89,0xF1,0xE5,0x25
-> inDataExchange (mutual authenticate)
00FF31CFD4400100820000284782B1700DD4F60373DA6632FCD1AB1E500D46FA11DEBDF9B88C39FCA7FDF8DBBE51F41D52D4B87928310000
00FF00FF0000 -> ACK
00FF2DD3D5410055A930856698D46C2AEF3CEDF3C56E71668150F2FECC75E28F42AB2A57CD2BA2F42727AE656CB3F49000470000 -> SW1SW2 = 9000 (success)
-> inDataExchange (select EF.COM)
00FF1EE2D440010CA4020C158709012CA8E7AB995D13248E0810061DDC725A159300DB0000
00FF00FF0000 ->ACK
00FF05FBD541006988F90000 -> SW1SW2 = 6988 (Incorrect SM Data Objects)..BAH!!
会议详情如下:
MRZ = GF043591<586012072309062
Computed values from MRZ:
Kenc = BA 43 43 3B F4 7A AE F8 75 23 4F DF 32 08 20 6D
Kmac = EA 64 45 CD 62 2C EA EC BF 7C 9B 7C B0 20 B9 5D
RND.ICC = 8E AF 82 6F 89 F1 E5 25
RND.IFD = 23 E8 5A 99 3A 9A C5 B4
K.IFD = 75 DC 87 E5 0C 8E F3 00 47 D0 B5 32 5E 83 20 4D
SSC = 89 F1 E5 25 3A 9A C5 B4
The computed E.IFD = 47 82 B1 70 0D D4 F6 03 73 DA 66 32 FC D1 AB 1E 50 0D 46 FA 11 DE BD F9 B8 8C 39 FC A7 FD F8 DB
The computed MAC of the above = BE 51 F4 1D 52 D4 B8 79
The tag's response to the mutual authenticate was:
E[Kenc](RND.ICC) = 55 A9 30 85 66 98 D4 6C
E[Kenc](RND.IFD) = 2A EF 3C ED F3 C5 6E 71
E[Kenc](K.ICC) = 66 81 50 F2 FE CC 75 E2 8F 42 AB 2A 57 CD 2B A2
MAC = F4 27 27 AE 65 6C B3 F4
The computed session keys:
KSenc = 4C E6 EF A8 3D 3E DA FB FB 02 1A F2 D5 E0 6E 4F
KSmac = EA C7 5B 64 D9 80 52 23 4F 64 7A 51 45 7F 40 1A
答案 0 :(得分:2)
好的,我明白了!感谢您让我创建PN532命令跟踪。当我将其与我的通用调试日志中的会话详细信息结合起来时,我开始编写代码来验证它。中途我意识到我的错误,即会话密钥不正确,因为我没有将整个相互认证响应解密为32字节块而是零碎,并且因为MRTD的芯片使用密码块链接K.ICC被解密不正确,因此我的K.SEED不正确,因为会话密钥错了。我纠正了这个错误,现在我可以阅读EF.COM文件!