我正在尝试构建一个格式正确的 GET PROCESSING OPTIONS 命令以发送到非接触式 EMV 卡。 This post 非常有帮助,但我只需要了解更多细节。
在解析 PDOL 时,假设每个标签的长度为 2 个字节,然后是预期返回的数据大小是否安全?
例如,PDOL 9F66049F02069F37049F1A02
被分解为9F66 04
、 9F02 06
等,每个都有 2 个字节的标签和 1 个字节的数据值的预期长度。
解析时假设每个标签的长度为 2 个字节是否安全?
最佳答案
不,您不能期望每个标签由两个字节组成(尽管大多数标签都是如此)。 EMV 中的 Tag-Length-Value (TLV) 结构遵循 ASN.1 编码规则(基本编码规则,BER)。有关详细信息,请参阅以下文档:
后者是一个非常好的介绍,帮助我入门。
TLV 结构(数据对象)由标签值、长度值和数据负载(值)组成:
+-----------+-----------+-----------+
|标签 |长度 |值(value) |
| (N 字节) | (M 字节) | (L 字节) |
+ ----------- + ----------- + ----------- +
PDOL(和任何其他数据对象列表,DOL)包含一个或多个此类数据对象的标签和长度部分。同样,PDOL 相关数据包含 PDOL 中引用的 DO 的值部分。标签和长度部分都可以由一个或多个字节组成。
对于标签部分,规则大概是这样的(更多细节参见上面的引用资料):
tag[0] & 0x01F == 0x01F
),那么标签至少由两个字节组成。 tag[i] & 0x080 == 0x080
),则标签包含一个多字节。对于每个后续字节重复此操作。 对于长度部分,规则大致是这样的(有关更多详细信息,请参见上述引用资料):
length[0] & 0x080 == 0
),则其余七位对长度值 ( length[0] & 0x07F
) 进行编码。 length[0] & 0x080 == 0x080
),则剩余的 7 位编码长度部分的剩余字节数 ( length[0] & 0x07F
)。其余字节将长度值表示为无符号整数,MSB 在前。 关于asn.1 - 解析 PDOL 以获取 EMV 事务中的 GET PROCESSING OPTIONS 命令,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34519566/