我在T = 0时测试了几个javacards(飞天D11CR,英飞凌JTOP,G& D智能咖啡馆),这是我观察到的。
如果applet返回案例4 APDU中的一些数据,则JCRE通过SW 0x61XX发出信号,表示有可用的数据,哪个终端应使用GET RESPONSE APDU检索。
但是,如果applet在情况2中返回一些数据,则APDU和Le与要返回的字节数不匹配,JCRE发出错误SW 0x6CXX的信号,指示必须用正确的Le重新发送相同的C-APDU。
由于遗留原因,有些终端知道如何处理0x61XX,但无法处理0x6CXX响应。有没有办法如何强制JCRE使用0x61XX(GET RESPONSE)方法处理案例2 APDU?
答案 0 :(得分:1)
此行为由T=0
协议给出,其中传输的数据字节长度必须从TPDU交换的开头(即接口设备决定它)固定 - 与T=1
相反/ T=CL
其中响应长度保持开放以供卡片决定。
当接口设备发送不可接受的值作为 Case 2 命令的数据字节长度时,会导致问题 - 卡不能传输不同数量的数据字节并且必须发送特殊状态字代替。
在T=0
中,命令案例以这种方式传输(非常简化):
案例1 :
CLA INS P1 P2 00
,卡片回复:SW1 SW2
案例2 :
CLA INS P1 P2 P3
,[ P3 bytes of response data ] SW1 SW2
P3
如果6C XX
的值不可接受,则P3
案例3 :
CLA INS P1 P2 P3 [P3 bytes of command data]
,卡片回复:SW1 SW2
案例4 :
CLA INS P1 P2 P3 [P3 bytes of command data]
,卡片回复:61 YY
CLA C0 00 00 YY
卡回复:[YY bytes of response data] SW1 SW2
参见ISO 7816-3," Command-response pair transmission by T=0"详细信息。
(理论上)要解决这个问题(即阻止JCRE发送6C XX
状态字),你必须将所有 Case 2 命令实现为案例1 命令(即不调用APDU.setOutgoing()
),返回61 XX
状态字并自行实现GET RESPONSE
命令(JCRE应将此命令传递给process()
方法如果它没有它自己的响应数据)。
这为终端支持6C XX
带来了一些不必要的开销。
一些额外的(随机)笔记:
GET RESPONSE
方法中的额外process()
命令的用户级处理对我来说很有用。我没有检查有关YCV的JC规范。
遗憾的是,您无法使用T=1
上面提出的解决方法只是一个理论。我从未实施过这种方法(但我对你可能获得的结果肯定感兴趣)
希望这个答案有道理......祝你好运!
答案 1 :(得分:0)
Feitian和Infinion卡有一个技巧如何在"情况2"中强制使用0x61XX响应。其中Le = 0x00的APDU - 技巧是调用setIncomingAndReceive()。但是,这不适用于其他Le值(使用正Le调用setIncomingAndReceive()将导致错误)。
出于兼容性原因,我最终在applet中实现了0x61XX支持。因此,如果收到的Le与要返回的长度不匹配,则applet将响应缓冲在RAM中并返回SW 0x61XX。当process()收到GET RESPONSE APDU时,Le将匹配缓冲的长度,并使用setOutgoingAndSend()返回数据。