【问题标题】:JavaCard and T=1 protocol: distinguish between APDU casesJavaCard和T=1协议:区分APDU情况
【发布时间】:2017-05-06 16:49:45
【问题描述】:

在 T=0 协议的情况下,case 1 & case 2 APDU 的 TPDU 案例 3 和案例 4 APDU 是相同的, 因此,在来自智能卡的 T=0 协议的情况下 侧面无法区分情况1和2和 案例 3&4 APDU。 事实上,甚至无法区分 case 2 & 3 APDU,除非智能卡尝试读取数据字节,如果终端实际发送的 APDU 是 case 2 APDU,则会导致失败。

但是,由于在 T=1 协议中,TPDU 对应于 APDU 卡知道收到的 APDU 属于哪种情况。

问题是在 T=1 协议的情况下,Java Card API 是否提供任何方法来:

  1. 知道接收到的 APDU 是否是数据 APDU,因此可以安全地调用 setIncomingAndReceive();
  2. 从案例 4 APDU 中读取 Le 字节;
  3. 知道是否真的从终端接收到 Le 字节(在 APDU 缓冲区中的 P3 为 0x00 的模棱两可的情况下)。

【问题讨论】:

    标签: javacard


    【解决方案1】:

    1.知道接收到的 APDU 是否是数据 APDU,因此可以安全地调用 setIncomingAndReceive()

    现在这是一个有趣的问题;似乎getIncomingLength 可以用于此:

    由 APDU 报头中的 Lc 字段指示的传入字节长度。如果没有传入数据,则返回 0(案例 1)

    但它在异常描述中说:

    APDUException.ILLEGAL_USE 如果setIncomingAndReceive() 未调用或setOutgoing()setOutgoingNoChaining() 先前调用。

    对于setIncomingAndReceive(),您可以阅读:

    该方法只能在 case 3 或 case 4 命令上调用,否则可能导致错误行为。

    这里似乎有一个陷阱 22;我会问我的一个资源如何处理这个问题。同时,setIncomingAndReceivegetIncomingLength 不太可能(但并非不可能)为 case 1 或 2 APDU 抛出异常。


    2。从案例 4 APDU 中读取 Le 字节

    嗯,是的,通过读取 Nc 值,然后通过接收到的字节继续到达命令后面的 Le 字节或字节。但通常通过调用返回的setOutgoing 更容易使用 Ne(实际长度而不是长度的编码):

    Ne, the expected length of response
    

    3.知道是否真的从终端接收到 Le 字节(在 APDU 缓冲区中的 P3 为 0x00 的模棱两可的情况下)

    如果 P3 = 0x00 那么 P3 据我所知的 Le 字节。我不明白这是多么模棱两可。 Lc 被禁止有这个值。


    注意事项:

    • 大多数 APDU 命令都具有预先描述的格式,因此您可以提前知道(在使用 process 方法处理 APDU 期间)您是否应该获得特定情况 - 您可以抛出您没有的异常;李>
    • 我引用了 Java Card 3.0.5,因为它可以在线获得,并且因为它可以正确区分 Nc、Lc、Ne 和 Le - 但界面与早期版本没有区别。

    【讨论】:

    • 关于第 3 点:问题在于区分案例 1 APDU(Le 未发送)和案例 2 APDU(Le 设置为 0x00)。 AFAIK,在这两种情况下,您都会从 apdu.buffer[P3] 读取 0x00。那么还有其他可用的区分符吗?
    • 我不这么认为,请问这个问题出现在哪个协议中?我可以想到一个(相当愚蠢的)实例,您可以没有 command data 而另一个没有(SELECT by File ID with P1 = 00 without identifier)。一般来说,您应该能够知道是否有取决于 INS(可能还有 P1/P2)的命令或响应数据。是的,ISO/IEC 7816-4 在分离传输层和应用层方面非常糟糕。基本上它没有;这就是为什么此类问题不断出现的原因。请注意,您可能会争辩说,始终发送 Le 对于无响应数据是有效的。
    • 许多实现允许 Le 即使没有预期的响应数据。不幸的是,这有待讨论 - 对于许多命令来说,这是错误的 APDU/ISO“案例”,但没有地方说您必须返回响应数据。
    • 注意P30x00 对于case 1 命令表示零,但对于case 2 命令表示256。一个有趣的读物是 Java Card Runtime Environment Specification,“APDU 类”部分。 +1 因为命令应该有他们的 ISO case 指定
    • 不,P3(ISO/IEC 7816-4 中不存在该概念)对于案例 1 命令(无命令或响应数据)不存在
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    相关资源
    最近更新 更多