7

我正在尝试构建一个格式正确的 GET PROCESSING OPTIONS 命令以发送到非接触式 EMV 卡。这篇文章非常有帮助,但我只需要了解更多细节。

在解析 PDOL 时,假设每个标签的长度为 2 个字节,然后是预期返回的数据的大小是否安全?

例如,PDOL9F66049F02069F37049F1A02分为 9F66 049F02 06等,每个都有 2 个字节标签和 1 个字节用于数据值的预期长度。

解析时假设每个标签的长度为 2 个字节是否安全?

4

1 回答 1

10

不,您不能期望每个标签都包含两个字节(尽管大多数标签都是如此)。EMV 中的标签-长度-值 (TLV) 结构遵循 ASN.1 编码规则(基本编码规则,BER)。有关详细信息,请参阅以下文档:

后者是一个非常好的介绍,帮助我入门。

TLV 结构(数据对象)由标签值、长度值和数据负载(值)组成:

+-----------+------------+------------+
| 标签 | 长度 | 价值 |
| (N 字节) | (M 字节) | (L 字节) |
+-----------+------------+------------+

PDOL(和任何其他数据对象列表,DOL)包含一个或多个此类数据对象的标签和长度部分。类似地,PDOL 相关数据包含 PDOL 中引用的 DO 的值部分。标签和长度部分都可以由一个或多个字节组成。

对于标签部分,规则大概是这样的(更详细的参见上面的参考资料):

  • 如果第一个标签字节的低 5 位全为 1 ( tag[0] & 0x01F == 0x01F),则标签至少包含两个字节。
  • 如果下一个标签字节的高位是 1 ( tag[i] & 0x080 == 0x080),则标签包含一个多字节。这对每个后续字节重复。

对于长度部分,规则大概是这样的(更详细的参见上面的参考资料):

  • 如果第一个长度字节的高位为零 ( length[0] & 0x080 == 0),则其余七位编码长度值 ( length[0] & 0x07F)。
  • 如果第一个长度字节的高位是 1 ( length[0] & 0x080 == 0x080),则剩余的 7 位编码长度部分的剩余字节数 ( length[0] & 0x07F)。其余字节将长度值表示为 MSB 在前的无符号整数。
于 2015-12-30T10:05:37.537 回答