扩展长度不适用于T = 1

时间:2013-04-23 17:08:21

标签: smartcard javacard apdu

我正在尝试将数据文件从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)期间发生了错误。另外我的applet类实现了ExtendedLength interfcace。任何有用的信息,请

1 个答案:

答案 0 :(得分:3)

您是否忘记为扩展javacardx.apdu.ExtendedLength课程的班级实施Applet“标记”界面?请注意,该卡应支持此功能(它位于javacardx名称空间,而不是javacard)。此外,为了使读卡器正确操作,卡应向读卡器指示扩展长度支持(使用ATR或EF.ATR作为ISO 14443 B型非接触式接口)。

即使卡支持延长的长度,也可能需要多次拨打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的扩展长度错误相对安全。