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

7
我正在尝试构建一个正确格式的GET PROCESSING OPTIONS命令,以发送到非接触式EMV卡。这篇文章非常有帮助,但我需要更多细节。在解析PDOL时,可以安全地假设每个标签的长度为2个字节,后跟期望返回的数据大小吗?例如,PDOL 9F66049F02069F37049F1A02 分解为9F66 049F02 06等,每个标签都有2个字节,期望数据值的长度为1个字节。在解析时,可以安全地假设每个标签的长度为2个字节吗?

你完成了PDOL解析吗? - Olivarsham
1
@Olivarsham 我们最终只使用了2个字节,因为我们测试的所有卡片都只使用了2个字节的PDOL标签。 Michael Rolands的回答帮助我们知道如何确定标签的长度(“如果下一个标签字节的最高位是1(tag [i]&0x080 == 0x080),则标签由一个以上的字节组成。对于每个随后的字节都会重复这个步骤。“)这是一个很好的资源,可以了解更多关于解析PDOL的内容: http://www.openscdp.org/scripts/tutorial/emv/initiateapplicationprocess.htmlEMV交易: http://www.openscdp.org/scripts/tutorial/emv/index.html - Scott Condron
我们测试的一些卡片具有仅包含两个字节的“9505”,“9A03”,“9C01”标签。看来我需要编写一个单独的解析器来处理PDOL。不管怎样,谢谢! - Olivarsham
1个回答

11
不,你不能指望每个标签都只由两个字节组成(虽然大多数标签确实如此)。EMV中的Tag-Length-Value (TLV) 结构遵循ASN.1编码规则(基本编码规则,BER)。有关更多信息,请参见以下文档: 后者是一份真正帮助我入门的好介绍。
一个TLV结构(数据对象)包含一个标签值、一个长度值和一个数据有效载荷(值):
+-----------+-----------+-----------+
|    Tag    |  Length   |   Value   |
| (N Bytes) | (M Bytes) | (L bytes) |
+-----------+-----------+-----------+
PDOL(以及任何其他数据对象列表,DOL)包含一个或多个这样的数据对象的标签和长度部分。同样,与PDOL相关的数据包含在PDOL中引用的DO的值部分。标签和长度部分都可以由一个或多个字节组成。
对于标签部分,规则大致如下(有关更多详细信息,请参见上述引用):
  • 如果第一个标签字节的低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)。剩余的字节将以最高位优先的无符号整数表示长度值。

2
感谢您提供的ASN链接。我已经对常规TLV数据对象进行了解码,但是我在将其调整为仅标签和长度DOL时遇到了一些问题。"长度部分"需要我进一步阅读。感谢您的帮助。 - Scott Condron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接