为 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 04
、9F02 06
等,每个都有 2 个字节的标记和 1 个字节用于数据值的预期长度。
解析时假设每个标签的长度为 2 个字节是否安全?
不,您不能指望每个标签都由两个字节组成(尽管大多数标签都是如此)。 Tag-Length-Value EMV中的(TLV)结构遵循ASN.1编码规则(basic encoding rules,BER)。有关详细信息,请参阅以下文档:
- ITU-T X.690:ASN.1编码规则:
基本编码规则 (BER) 规范,
规范编码规则 (CER) 和
可分辨编码规则 (DER)
- A Layman's Guide to a Subset of ASN.1, BER, and DER (by Burton S. Kaliski Jr.)
后者是一个非常好的介绍,帮助我入门。
一个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 在前。
我正在尝试构建格式正确的 GET PROCESSING OPTIONS 命令以发送到非接触式 EMV 卡。 This post 很有帮助,但我只需要了解更多细节。
解析 PDOL 时,假设每个标签的长度为 2 个字节,后跟 return 中预期的数据大小是否安全?
例如,PDOL 9F66049F02069F37049F1A02
被分解为
9F66 04
、9F02 06
等,每个都有 2 个字节的标记和 1 个字节用于数据值的预期长度。
解析时假设每个标签的长度为 2 个字节是否安全?
不,您不能指望每个标签都由两个字节组成(尽管大多数标签都是如此)。 Tag-Length-Value EMV中的(TLV)结构遵循ASN.1编码规则(basic encoding rules,BER)。有关详细信息,请参阅以下文档:
- ITU-T X.690:ASN.1编码规则: 基本编码规则 (BER) 规范, 规范编码规则 (CER) 和 可分辨编码规则 (DER)
- A Layman's Guide to a Subset of ASN.1, BER, and DER (by Burton S. Kaliski Jr.)
后者是一个非常好的介绍,帮助我入门。
一个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 在前。