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

时间:2018-03-21 11:47:01

标签: smartcard iso apdu

据我所知,当通过智能卡读卡器发布APDU时,结果的格式如下:

    [ [data], SW1, SW2 ]

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


例如,假设我想要读取主文件:

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

    00 A4 00 00
例如,

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

    00 C0 00 00 1B

然后返回[ [00, 01, 02, ...], 90, 00 ]

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

2 个答案:

答案 0 :(得分:1)

您所指的消息交换格式称为T = 0协议。这个协议非常陈旧,现在不是很少见,几乎每张卡都在谈论T = 1协议,它会立即返回数据字段和状态字,而无需额外的APDU来请求数据。

回答您的问题一般,,但是间接地和较低的协议级别,

APDU消息在ISO 7816-4中指定,在较低级别(即ISO7816-3或ISO14443-4)上,这些APDU作为I块链传输,其中包含具有位标志的头字节表示正在跟随更多的块/帧。因此,只要在收到最后一个块之前指示了更多的块,并且在没有头部和尾部字节的情况下连接所有数据,以形成切换到更高协议层(7816-4)的APDU命令/响应,就会收到。因此,在较低层,您可以通过所有接收数据的长度知道长度的隐含,但它永远不会被明确声明。因此,在APDU层,您将接收数据作为byte []缓冲区(例如Java),或者该函数将返回长度/将其写入目标缓冲区(WinScard.dll),具体取决于您将使用的框架。 / p>

此外,在智能卡世界中,返回ASN.1 / TLV编码的数据是非常常见的,例如,例如,在文件或加密数据中,包括标签后面的长度,例如文件以0x30 0x10开头,这意味着后面有一个16字节的SEQUENCE,因此您知道该文件总共包含18个字节。

答案 1 :(得分:1)

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

  

响应数据(X)+状态字(2字节)

因此,Total response length (-) 2是响应数据的长度。我总是通过这种方式计算响应数据的长度。