智能卡对 APDU 的响应中数据字段的大小是不是有任何指示?
Posted
技术标签:
【中文标题】智能卡对 APDU 的响应中数据字段的大小是不是有任何指示?【英文标题】:Is there any indicative of the size of the data field within a smart card's response to an APDU?智能卡对 APDU 的响应中数据字段的大小是否有任何指示? 【发布时间】:2018-03-21 11:47:01 【问题描述】:我了解,当通过智能卡读卡器发出 APDU 时,结果的格式如下:
[ [data], SW1, SW2 ]
我知道,当您发出 APDU 时,您可以使用 Le
字段指定预期答案的大小,但我想知道数据字段中是否有任何字节(或任何内容)指示其实际尺寸。
比如说我要读取主文件:
首先,我发出SELECT FILE
apdu:
00 A4 00 00
例如,它将返回61 1b
,其中1b
是使用GET RESPONSE
读取的字节数。然后我使用Le
发送GET RESPONSE
apdu 以获得预期的答案大小:
00 C0 00 00 1B
这会返回[ [00, 01, 02, ...], 90, 00 ]
。
我想知道的是:有没有办法计算出数据字段的大小?
【问题讨论】:
【参考方案1】:您所指的消息交换格式称为 T=0 协议。这个协议很古老,现在也不是很稀有,几乎每张卡都在说 T=1 协议,它立即返回数据字段和状态字,无需额外的 APDU 来请求数据。
一般地回答您的问题,否,但间接地在较低的协议级别上回答您的问题,是。
APDU 消息在 ISO 7816-4 中指定,在较低级别(即 ISO7816-3 或 ISO14443-4)上,这些 APDU 作为 I 块链传输,其中包含具有位标志的标头字节表示后面有更多块/帧。因此,只要指示更多块,直到接收到最后一个块,您就可以接收所有数据,并且连接所有没有头和尾字节的数据,以形成一个 APDU 命令/响应,该命令/响应被移交给更高的协议层 (7816-4)。因此,在较低层上,您通过所有接收到的数据的长度知道长度隐含性,但它从未明确声明过。因此,在 APDU 层,您将接收作为 byte[] 缓冲区(例如 Java)的数据,或者该函数将返回长度/将其写入目标缓冲区(WinScard.dll),具体取决于您将使用的框架。
此外,在智能卡世界中,返回 ASN.1/TLV 编码的数据非常常见,例如例如在文件或加密数据中,包括标签后面的长度,例如文件以 0x30 0x10 开头,这意味着后面有 16 个字节的 SEQUENCE,因此您知道文件总共包含 18 个字节。
【讨论】:
【参考方案2】:直接的答案是 NO,因为响应(输出)数据的协议被定义(在您的示例中为 T=0)为
响应数据 (X) + 状态字(2 字节)
所以,Total response length (-) 2
是响应数据的长度。我一直都是这样计算响应数据的长度的。
【讨论】:
以上是关于智能卡对 APDU 的响应中数据字段的大小是不是有任何指示?的主要内容,如果未能解决你的问题,请参考以下文章