我正在尝试将数据文件从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 回答
您是否忘记为扩展
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阅读器时,您应该相对安全地避免来自阅读器的延长长度错误 . 但是 .