我正在尝试构建一个格式正确的 GET PROCESSING OPTIONS 命令以发送到非接触式 EMV 卡。这个帖子非常有帮助,但我只需要了解更多细节。
解析 PDOL 时,是否可以安全地假设每个标签的长度为 2 个字节,后跟预期返回的数据大小?
例如,PDOL9F66049F02069F37049F1A02
被分解成9F66 04
, 9F02 06
等,每个都有 2 个字节标签和 1 个字节用于数据值的预期长度。
解析时假设每个标签的长度是 2 个字节是否安全?
不,您不能期望每个标签都包含两个字节(尽管大多数标签都是如此)。 EMV 中的标签长度值 (TLV) 结构遵循 ASN.1 编码规则(基本编码规则,BER)。有关更多信息,请参阅以下文档:
- ITU-T X.690:ASN.1编码规则:
基本编码规则(BER)规范,
规范编码规则 (CER) 和
杰出编码规则 (DER)
- ASN.1、BER 和 DER 子集的外行指南(作者:Burton S. Kaliski Jr.)
后者是一个非常好的介绍,帮助我入门。
一个TLV结构(数据对象)由标签值、长度值和数据负载(值)组成:
+-----------+-----------+-----------+
| Tag | Length | Value |
| (N Bytes) | (M Bytes) | (L bytes) |
+-----------+-----------+-----------+
PDOL(以及任何其他数据对象列表,DOL)包含一个或多个此类数据对象的标签和长度部分。类似地,PDOL相关数据包含PDOL中引用的DO的值部分。标签和长度部分都可以由一个或多个字节组成。
对于标签部分,规则大概是这样的(更多细节参见上面的参考资料):
- 如果第一个标签字节的低 5 位全为 1(
tag[0] & 0x01F == 0x01F
),那么标签至少由两个字节组成。
- 如果下一个标签字节的高位是一(
tag[i] & 0x080 == 0x080
),那么标签又多了一个字节。对于每个后续字节都会重复此操作。
对于长度部分,规则大约是这样的(更多细节参见上面的参考资料):
- 如果第一个长度字节的高位为零(
length[0] & 0x080 == 0
),然后剩下的七位编码长度值(length[0] & 0x07F
).
- 如果第一个长度字节的高位是一(
length[0] & 0x080 == 0x080
),那么剩下的7位编码了长度部分的剩余字节数(length[0] & 0x07F
)。其余字节将长度值表示为无符号整数,最高有效位在前。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)