我在T=0上测试了几个javacard(飞天D11CR,英飞凌,G&D Smart Cafe),下面是我观察到的。
如果小程序在情况4 APDU中返回一些数据,则JCRE向SW 0x61XX发出信号,表示有数据可用,终端应使用GET RESPONSE APDU进行检索。
但是,如果applet在情况2 APDU中返回某些数据,并且Le与要返回的字节数不匹配,则JCRE会发出错误信号SW 0x6CXX,指示必须使用正确的Le重新发送相同的C-APDU。
由于遗留原因,有些终端知道如何处理0x61XX,但无法处理0x6CXX响应。有没有办法强制JCRE使用0x61XX (GET RESPONSE)方法处理第二种情况下的APDU?
发布于 2017-04-07 20:26:18
这种行为是由T=0协议给出的,其中传输的数据字节的长度必须从TPDU交换的开始就固定(即,接口设备决定它),这与T=1/T=CL相反,其中响应长度由卡决定。
这在接口设备发送不可接受的值作为第二种情况下的命令的数据字节长度时引起麻烦--卡不能发送不同数量的数据字节,而必须发送特殊的状态字。
在T=0中,命令情况是这样传输的(非常简单):
- `CLA INS P1 P2 00`, card responds with: `SW1 SW2`
- `CLA INS P1 P2 P3`,
- card responds with:
- `[ P3 bytes of response data ] SW1 SW2` if the actual length of response data equals `P3`
- `6C XX` if value of `P3` is unacceptable
- `CLA INS P1 P2 P3 [P3 bytes of command data]`, card responds with: `SW1 SW2`
- `CLA INS P1 P2 P3 [P3 bytes of command data]`, card responds with: `61 YY`
- `CLA C0 00 00 YY` card responds with: `[YY bytes of response data] SW1 SW2`
有关详细信息,请参阅ISO7816-3 "Command-response pair transmission by T=0“一节。
(从理论上讲)要解决这个问题(即防止JCRE发送6C XX状态字),您必须将所有Case 2命令实现为Case 1命令(即不调用APDU.setOutgoing()),返回61 XX状态字并自己实现GET RESPONSE命令(如果JCRE没有自己的响应数据,则应将此命令传递给您的process()方法)。
这给支持6C XX的终端带来了一些不必要的开销。
一些额外的(随机)注释:
process()方法中对额外GET RESPONSE命令的用户级处理对我来说是有效的。我没有检查关于这个的JC规范,YMMV。希望这个答案能给sense...good带来好运!
发布于 2017-04-08 13:28:25
Feitian和Infinion卡有一个技巧,如何在"case 2“APDU中强制0x61XX响应,其中Le=0x00的诀窍是调用setIncomingAndReceive()。然而,这将不适用于其他Le值(使用正Le调用setIncomingAndReceive()将导致错误)。
出于兼容性原因,我最终在applet中实现了0x61XX支持。因此,如果收到的Le与要返回的长度不匹配,则小程序会将响应缓冲到RAM中,并返回SW 0x61XX。当进程()收到GET响应APDU时,Le将匹配缓冲的长度,并使用setOutgoingAndSend()返回数据。
https://stackoverflow.com/questions/43257816
复制相似问题