2013-04-23 125 views
2

我试图从JC 2.2.2卡发送数据文件到主机应用程序。所有文件都小于256字节。但是数据需要加密和签名(用于安全消息),如下所示。将MAC添加到加密数据后,某些文件的长度会超过256个字节。但我使用扩展长度,所以我认为一次发送超过256个字节没有问题。如果结果密码加上MAC小于256字节,程序工作正常。以下是一段将响应apdu发送给主机的代码。扩展长度不适用于T = 1

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接口。任何有用的信息请

+0

您确定该卡支持扩展长度的APDU吗?你是否发送了命令,它是由你的代码以扩展长度的APDU格式实现的? – guidot 2013-04-24 07:47:44

+0

对于你的第一个问题,我会说是,因为我使用JC 2.2.2和T = 1协议。对于第二个问题,我不确定,我不知道我是否必须做这样的事情。请给我一个扩展长度格式化的APDU的例子,你会更有帮助吗? – ally 2013-04-24 08:40:55

+0

我只能参考ISO 7816第4部分,它描述了字节格式。 LC的第一个字节为零的3字节规范表示扩展长度的LC字段,这也要求LE字段的扩展格式为2字节)。在没有LC的情况下,LE规范具有额外的前导零字节,接着是两个字节长度。如果你给你的应用程序语言和使用的API可能是别人可以帮助你进一步。 – guidot 2013-04-24 10:28:27

回答

2

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

即使该卡支持扩展长度,也可能需要多次拨打sendBytesLong()。扩展长度可达64KiB(Java Card只能达到规范之外的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的扩展长度错误相对安全。

+0

我的答案Ally中有任何遗漏吗? – 2013-05-05 09:20:51

+1

通过回答密码问题,我已经获得了超过10K的分数,这真是太神奇了,因为这根本不会产生任何分数。 – 2013-05-12 21:36:54

+0

+1,现在它确实;-) – 2013-06-24 08:00:13