1

仔细阅读 ISO/IEC 7816-3:2006,第 12.2.5 节指定了当阅读器发送一个 Lc>0,Le>0 的命令 APDU 用于 T=0 传输协议(字节流)时会发生什么。初始命令 TPDU 没有 Le 字段,如果卡响应成功,应用程序应发送 0xC0 GET RESPONSE 命令,直到收到 Le 字节。

问题:如果智能卡期望返回数据,卡返回 0x9000 以响应初始 T=0 命令(在任何 GET RESPONSE 命令之前)实际上是否有效,正如 7816-3 所指定的那样?应用程序在 0x9000 响应后发出 GET RESPONSE 命令是否有效?相比之下,通过阅读javax.smartcardio中 doTransmit和OpenSC 中 sc_transmit的用法,这些应用程序似乎只在 sw=0x61xx 响应之后尝试 GET RESPONSE,而在 sw=0x9000 响应之后从未尝试。

4

2 回答 2

1

在 ISO 7816 中,每个命令的 ISO“大小写”应该事先知道。换句话说,这些命令有:

  1. 没有命令数据和没有响应数据
  2. 没有命令数据,但有响应数据
  3. 命令数据但没有响应数据
  4. 命令数据和响应数据

通常,如果出现指示错误的状态字,命令不会发送响应数据,即使 ISO 案例声明需要响应数据。


现在在表 14 中说明了 SW1 SW2 9000

进程正常完成。在情况 1、2 和 3 中,无需采取进一步措施。在情况 4 中,收到命令数据字节后,卡应准备好接收至少一个 GET RESPONSE 命令,用于传输最多 Ne 个响应数据字节。

因此,对于 ISO 案例 4,您发送命令数据并期望响应数据,您应该发送GET RESPONSEafter 9000。但是,如果您使用的是 ISO 案例 2 并且收到 9000,那么您不应该发送GET RESPONSE.


在我看来,只要您为 ISO 案例 4CommandAPDU之一(即也包括命令数据的案例)指定一个 Ne 值,它javax.smartcardio 应该在收到SW1/SW2时发出GET RESPONSEAPDU 。9000这意味着文档不完整或实施不正确。

于 2014-01-27T16:18:01.743 回答
0

当我阅读 7816-3,案例 4S.2时,如果恰好有 C(N) 个字节可用,则卡可以用 90 00 响应。然而,由于 C(N) 在将 APDU 转换为 TPDU 以用于 case 4 命令的过程中被切断,因此对于卡来说是未知的,因此卡唯一确定的选择是返回 61xx。

对于案例 2 命令 9000 似乎是一个合理的答案 [后跟 GET REPONSE C(N)],即使此案例未在 7816-3 中单独列出。

于 2014-01-27T10:55:32.957 回答