首页 文章

扩展长度不适用于T = 1

提问于
浏览
2

我正在尝试将数据文件从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 回答

  • 3

    您是否忘记为扩展 Applet 类的类实现 javacardx.apdu.ExtendedLength "tagging"接口?请注意,该卡应支持此功能(它位于 javacardx 名称空间,而不是 javacard ) . 此外,为了使读卡器正确操作,卡应指示对读卡器的扩展长度支持(使用ATR或EF.ATR用于ISO 14443 B型非接触式接口) .

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

    最后,APDU 's can be extended length or not. This means that both the APDU command as well as the APDU response must be either be normal or extended length APDU' s . 只有ISO类型1 APDU 's are exempt from this, as they don' t包含命令或响应数据 . 否则,Nc(在ISO 7816-4中称为Lc)和Ne(在ISO标准中称为Le)的编码必须使用扩展长度编码 . 换句话说,第一个编码必须是3个字节长,第一个编码为 00 ,第二个(如果存在,对于ISO类型4 APDU)必须是两个字节大小 .

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

相关问题