JavaCard T = 0处理案例2 APDU(0x61XX(GET RESPONSE)对比0x6CXX)

时间:2017-04-06 14:15:56

标签: javacard

我在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?

2 个答案:

答案 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()返回数据。