我在文档中发现他们指的是SIMPLE-TLV和BER-TLV。我查看了大多数 EMV 和 GP 文档,但他们没有提到不同之处。
谁能帮我理解两者的区别?
这是ISO/IEC 7816-4 使用的更常见的BER 编码规范:
每个 BER-TLV 数据对象应由 2 或 3 个连续字段组成(见 ISO/IEC 8825 和附件 D)。
标签字段 T 由一个或多个连续字节组成。它编码一个类、一个类型和一个数字。长度字段由一个或多个连续字节组成。它编码一个整数 L。如果 L 不为空,则值字段 V 由 L 个连续字节组成。如果 L 为空,则数据对象为空:没有值字段。
请注意,在当前标准中,ISO/IEC 7816 仅允许使用最多 5 个长度字节(指定最大为 2^32 - 1 个字节的大小)。也不支持不定长编码。这些限制特定于智能卡。请注意,在 ISO/IEC 7816-4 的更高版本中引入了 4 和 5 字节长度编码;早期的卡/读卡应用程序可能仅支持 3 个长度字节(即值大小高达 64KiB 字节,而不是 4GiB)。
BER TLV 规范更加广泛(这就是 SIMPLE-TLV 被称为“简单”的原因)。我不会过多介绍细节,因为互联网上有很多可用的信息。仅举几个不同之处,标签具有语法意义,可能由多个字节组成,长度编码相当复杂。
通常,BER 应该只用作 ASN.1 结构的编码,并使用 ASN.1 语法定义结构。然而,ISO 7816-4 把这搞砸了,只直接指定了 BER 标签字节。
请注意,有时会指定 DER 而不是 BER。05
在这种情况下,您应该只使用最小字节数作为长度字段的大小 - 例如,在下面的示例中具有值的单个长度字节。BER 编码的 ISO/IEC 规范基本上是美国特定 X.690 标准的副本,也反映在国际标准 ISO/IEC 8825-1(均为付费软件)中。
ISO/IEC 7816-4 中的 BER 规范之后是 SIMPLE-TLV 规范。SIMPLE-TLV 特定于 ISO 7816-4。
每个 SIMPLE-TLV 数据对象应由 2 或 3 个连续字段组成。
标签字段 T 由仅编码从 1 到 254 的数字(例如记录标识符)的单个字节组成。它不编码类,也不编码构造类型。长度字段由 1 或 3 个连续字节组成。如果长度字段的前导字节在“00”到“FE”的范围内,则长度字段由单个字节组成,编码一个从 0 到 254 的整数 L。如果前导字节等于“FF” ,然后长度字段在两个后续字节上继续,这些字节对整数 L 进行编码,其值从 0 到 65535。如果 L不为空,则值字段 V 由连续字节组成。如果 L 为空,则数据对象为空:没有值字段。
请注意,标准忘记直接指定字节顺序。但是,您可以假设 ISO/IEC 7816-4 中的大端编码。
以下示例均用于传达相同的标签号(定义字段)和值,但为 BER 定义标签号 31 的示例除外。
示例 SIMPLE-TLV
0F 05 48656C6C6F // tag number 15, length 5 then the value
0F FF0005 48656C6C6F // tag number 15, length 5 (two bytes), then the value
样本 BER-TLV:
4F 05 48656C6C6F // *application specific*, primitive encoding of tag number 15, length 5 then the value
4F 8105 48656C6C6F // the same, using two bytes to encode the length
4F 820005 48656C6C6F // the same, using three bytes to encode the length
4F 83000005 48656C6C6F // the same, using four bytes to encode the length
4F 8400000005 48656C6C6F // the same , using five bytes to encode the length
5F0F 05 48656C6C6F // **invalid** encoding of the same, with two bytes for the tag, specifiying a tag number 15 which is smaller than 31
5F1F 05 48656C6C6F // application specific, primitive encoding of **tag number 31**
在最后一个使用两字节标签编码的例子中,第一个字节是 40 十六进制,其中最左边的前 3 位 010 指定应用程序特定的编码,将魔术值 1F (31) 添加到它以指示另一个字节将跟随实际标签号,同样是 1F,所以值为 31。
应注意以下差异:
简单 TLV 仅由标记(或类型)、长度和值组成。
BER-TLV 是一种特殊的 TLV,它的 Value 中有一个或多个 TLV。所以它具有复合结构。
Tag1 Len1 Tag2-Len2-Value2 Tag3-Len3-Value3 ... TagN-LenN-ValueN
------------------------Value1------------------------