我正在尝试构建一个格式正确的GET PROCESSING OPTIONS命令,以发送到非接触式EMV卡。 This post非常有帮助,但我只需要了解更多细节。
解析PDOL时,可以安全地假设每个标记的长度为2个字节,然后是预期的数据大小吗?
例如,PDOL 9F66049F02069F37049F1A02
被分解为
9F66 04
,9F02 06
等,每个都有2个字节的标签,1个字节用于预期的数据值长度。
在解析时假设每个标记的长度是2个字节是否安全?
答案 0 :(得分:9)
不,你不能指望每个标签都包含两个字节(尽管大多数标签都有)。 EMV中的标签长度值(TLV)结构遵循ASN.1编码规则(基本编码规则,BER)。有关详细信息,请参阅以下文档:
后者是一个非常好的介绍,帮助我入门。
TLV结构(数据对象)由标记值,长度值和数据有效负载(值)组成:
+-----------+-----------+-----------+ | Tag | Length | Value | | (N Bytes) | (M Bytes) | (L bytes) | +-----------+-----------+-----------+
PDOL(以及任何其他数据对象列表,DOL)包含一个或多个此类数据对象的标记和长度部分。类似地,PDOL相关数据包含PDOL中引用的DO的值部分。标签和长度部分都可以包含一个或多个字节。
对于标签部分,规则与此类似(有关详细信息,请参阅上述参考资料):
tag[0] & 0x01F == 0x01F
),则标记至少包含两个字节。tag[i] & 0x080 == 0x080
),则标记由另外一个字节组成。对于每个后续字节重复此操作。对于长度部分,规则与此类似(有关详细信息,请参阅上述参考资料):
length[0] & 0x080 == 0
),则剩余的7位编码长度值(length[0] & 0x07F
)。length[0] & 0x080 == 0x080
),则剩余的7位编码长度部分的剩余字节数(length[0] & 0x07F
)。其余字节表示长度值为无符号整数,MSB优先。