为 EMV 交易中的 GET PROCESSING OPTIONS 命令解析 PDOL

Parsing PDOL for GET PROCESSING OPTIONS command in EMV transaction

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

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

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

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

不,您不能指望每个标签都由两个字节组成(尽管大多数标签都是如此)。 Tag-Length-Value EMV中的(TLV)结构遵循ASN.1编码规则(basic encoding rules,BER)。有关详细信息,请参阅以下文档:

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

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

+-----------+-----------+-----------+
|    Tag    |  Length   |   Value   |
| (N Bytes) | (M Bytes) | (L bytes) |
+-----------+-----------+-----------+

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

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

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

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

  • 如果第一个长度字节的高位为零(length[0] & 0x080 == 0),则其余七位编码长度值(length[0] & 0x07F)。
  • 如果第一个长度字节的高位是一个(length[0] & 0x080 == 0x080),那么剩下的七位编码长度部分的剩余字节数(length[0] & 0x07F)。剩余字节将长度值表示为无符号整数,MSB 在前。