完成PACE令牌交换后,如何读取ePassport受保护DG4数据?
PACE认证后读取受保护DG4(访问条件10FFFF)的操作指南
针对你遇到的6982(安全状态不满足)和6986(命令不允许)错误,完成PACE GENERIC MAPPING令牌交换后,必须执行以下步骤才能访问DG4:
1. 激活并验证安全信道(SM)
PACE令牌交换仅完成密钥协商,需立即激活安全信道:
- 向芯片发送
MANAGE SECURITY ENVIRONMENT命令(示例:00 22 01 00 XX),指定后续命令的安全机制(如CMAC认证、数据加密),参数需匹配芯片配置 - 发送SM保护的测试命令(如安全信道下的
GET CHALLENGE),确认响应符合安全信道要求,验证会话密钥派生正确
2. 通过安全信道选中DG4文件
禁止使用未加密的SELECT命令访问DG4,必须走安全信道流程:
- 先发送SM保护的
SELECT命令选中EF.DIR(FID:0100),获取DG4的文件标识符(通常为0104) - 再发送带SM保护的
SELECT命令选中DG4,命令格式示例:00 A4 02 0C 02 01 04(需附加CMAC或加密封装)
3. 使用SM保护的命令读取DG4数据
所有访问受保护DG的命令必须经过安全信道处理:
- 若启用CMAC认证:命令尾部需附加会话密钥生成的CMAC校验值
- 若启用数据加密:命令参数和芯片响应都需用会话加密密钥加密
- 禁止直接发送未保护的
READ BINARY命令(如00 B0 00 00 FF),否则会触发6986错误
4. 验证访问权限匹配
访问条件10FFFF对应PACE认证后SM保护访问,需确认:
- PACE认证使用的凭证(MRZ/CAN/PIN)具备DG4的访问权限(部分芯片要求PIN认证才能访问敏感DG)
- 会话密钥的权限级别正确:需派生具备读取权限的SM密钥(而非仅认证密钥)
关键代码调整(基于你的C#实现)
在PACE认证函数完成令牌交换后,添加SM激活与文件访问逻辑:
// 激活安全信道(示例:设置CMAC认证+数据加密) var activateSmCmd = new CommandApdu(0x00, 0x22, 0x01, 0x00, new byte[] { 0x80, 0x01, 0x02 }); var smResponse = SendApdu(activateSmCmd); // 通过安全信道选中EF.DIR var selectDirCmd = new CommandApdu(0x00, 0xA4, 0x02, 0x0C, new byte[] { 0x01, 0x00 }); var dirResponse = SendSecureApdu(selectDirCmd); // 封装SM保护的命令 // 通过安全信道选中DG4 var selectDg4Cmd = new CommandApdu(0x00, 0xA4, 0x02, 0x0C, new byte[] { 0x01, 0x04 }); var dg4SelectResponse = SendSecureApdu(selectDg4Cmd); // 读取DG4数据(SM保护) var readDg4Cmd = new CommandApdu(0x00, 0xB0, 0x00, 0x00, 0xFF); var dg4Data = SendSecureApdu(readDg4Cmd);
注意:
SendSecureApdu方法需实现SM的加密/CMAC生成逻辑,严格遵循ICAO Doc 9303 Part11的安全信道规范
内容的提问来源于stack exchange,提问作者Bouls
相关产品推荐
相关产品推荐

