3

我正在尝试将数据文件从 JC 2.2.2 卡发送到主机应用程序。所有文件都小于 256 字节。但是数据需要加密和签名(用于安全消息传递),如下所示。将 MAC 添加到加密数据后,某些文件的长度会超过 256 个字节。但是我使用的是扩展长度,所以我认为一次发送超过 256 个字节不会有问题。如果生成的密码加 MAC 小于 256 字节,则程序运行良好。下面是一段将响应 apdu 发送到主机的代码。

Util.arrayCopyNonAtomic(file, offset, buffer, (short)0, file.length);                            
respLength = secureCrypto.wrapResponseAPDU(ssc, apdu, buffOfset, file.length);
apdu.setOutgoing();  
apdu.setOutgoingLength(respLength);          // 0x6F00 error occurs during the execution of this line
apdu.sendBytesLong(buffer, (short)0, respLength);

卡详情:

Terminal found : 2
PC/SC terminal OMNIKEY CardMan 5x21 0
PC/SC terminal OMNIKEY CardMan 5x21-CL 0
ATR: 13 bytes
Card Info : PC/SC card in OMNIKEY CardMan 5x21-CL 0, protocol T=1, state OK

在主机端,我收到 0x6F00 错误代码。并且我跟踪了程序,发现错误发生在apdu.setOutgoingLenght(respLength)的执行过程中。此外,我的小程序类实现了 ExtendedLength 接口。请提供任何有用的信息

4

1 回答 1

3

您是否可能忘记为javacardx.apdu.ExtendedLength扩展类的类实现“标记”接口Applet?请注意,该卡应支持此功能(它在名称空间中,而不是)。此外,为了正确使用读卡器,该卡应指明对读卡器的扩展长度支持(使用 ISO 14443 B 型非接触式接口的 ATR 或 EF.ATR)。javacardxjavacard

即使该卡支持扩展长度,您也可能需要sendBytesLong()多次调用。扩展长度达到 64KiB(Java 卡仅达到 32KiB,这超出了规范,至少对于命令 APDU 而言),但是很少有卡——如果它们存在的话——为 APDU 提供 64KiB 的 RAM缓冲。

最后,APDU 的长度可以延长也可以不延长。这意味着 APDU 命令和 APDU 响应都必须是正常或扩展长度的 APDU。只有 ISO 类型 1 APDU 不受此限制,因为它们不包含命令或响应数据。否则,Nc(在 ISO 7816-4 中称为 Lc)和 Ne(在 ISO 标准中称为 Le)的编码都必须使用扩展长度编码。换句话说,第一个编码必须是 3 个字节长,第一个设置为00,第二个(如果存在,对于 ISO 类型 4 APDU 的)必须是两个字节大小。

请注意,javax.smartcardio处理扩展长度的 APDU 非常优雅。不幸的是,并非读卡器中的所有扩展功能都经过良好编程。当您使用 Omnikey 阅读器时,您应该相对安全地避免来自阅读器.dll 的扩展长度错误。

于 2013-04-25T20:13:20.600 回答