智能卡对 APDU 的响应中是否有数据字段大小的指示?

Is there any indicative of the size of the data field within a smart card's response to an APDU?

我了解到当通过智能卡发出 APDU 时 reader 结果的格式如下:

    [ [data], SW1, SW2 ]

我知道当您发布 APDU 时,您可以使用 Le 字段指定预期答案的大小,但我想知道数据字段中是否有任何字节(或任何内容)表示它的实际大小。


比如我要读主文件:

首先,我发出一个SELECT FILE apdu:

    00 A4 00 00

例如 return 61 1b,其中 1b 是使用 GET RESPONSE 读取的字节数。然后我使用 Le 发送 GET RESPONSE apdu 以获得预期的答案大小:

    00 C0 00 00 1B

还有这个returns [ [00, 01, 02, ...], 90, 00 ]

我想知道的是:有没有办法计算数据字段的大小?

您所指的消息交换格式称为 T=0 协议。这个协议很古老,现在也不是很罕见了,几乎每张卡都在谈论 T=1 协议,return 直接是数据字段和状态字,没有额外的 APDU 来请求数据。

笼统地回答你的问题,没有,但间接地和在较低的协议级别上,

APDU 消息在 ISO 7816-4 中指定,在较低级别(即 ISO7816-3 或 ISO14443-4)中,这些 APDU 作为 I-blocks 链传输,其中包含 header 字节,它有一个位标志,表示后面还有 blocks/frames。因此,只要指示更多块,直到接收到最后一个块,您就会收到,并且您连接所有没有 header 和尾部字节的数据,以形成一个 APDU command/response,该 APDU command/response 被移交给更高的协议层(7816 -4).因此,在下层,您可以通过所有接收到的数据的长度知道隐式长度,但从未明确声明过。因此在 APDU 层上,您将接收数据作为字节 [] 缓冲区(例如 Java)或者函数将 return length/write 它到目标缓冲区(WinScard.dll),具体取决于您将使用的框架。

此外,return ASN.1/TLV-encoded 数据在智能卡领域非常普遍,例如例如在文件或加密数据中,包括标签后面的长度,例如文件以 0x30 0x10 开头,这意味着后面是一个 16 字节的序列,所以你知道文件总共包含 18 个字节。

直接的答案是 因为响应(输出)数据的协议被定义(在您的示例中为 T=0)为

Response Data (X) + Status Word (2 Bytes)

所以,Total response length (-) 2是响应数据的长度。我一直都是这样计算响应数据的长度