SIMPLE-TLV与BER-TLV

nis*_*013 18 apdu nfc javacard

我在docs中发现他们指的是SIMPLE-TLVBER-TLV.我查看了大多数EMV和GP文档,但他们没有提到不同的内容.

谁能帮助我理解两者的区别?

Maa*_*wes 32

ISO/IEC 7816-4中用于智能卡的数据字段

BER编码

这是ISO/IEC 7816-4使用的更常见的BER编码的规范:

每个BER-TLV数据对象应由2或3个连续字段组成(见ISO/IEC 8825和附录D).

标记字段T由一个或多个连续字节组成.它编码一个类,一个类型和一个数字.长度字段由一个或多个连续字节组成.它对整数L进行编码.如果L不为空,则值字段V由L个连续字节组成.如果L为null,则数据对象为空:没有值字段.

请注意,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标准的副本.

SIMPLE-TLV编码

BER规范之后是SIMPLE-TLV规范,该规范特定于ISO 7816-4.请注意,标准会忘记直接指定字节序.您可以在ISO/IEC 7816-4中假设大端编码.

每个SIMPLE-TLV数据对象应包含2或3个连续字段.

标记字段T由仅编码1到254的数字的单个字节组成(例如,记录标识符).它没有编码类,也没有构造类型.长度字段由1或3个连续字节组成.如果长度字段的前导字节在"00"到"FE"的范围内,则长度字段由单个字节组成,该字节编码从0到254的整数L.如果前导字节等于'FF' ,那么长度字段继续上如果L的整数l对于值编码为0〜65535的两个随后的字节不为空,则该值场V包括连续字节.如果L为null,则数据对象为空:没有值字段.

样品

以下样本都用于传达相同的标签号(定义字段)和值,除了为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
Run Code Online (Sandbox Code Playgroud)

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**
Run Code Online (Sandbox Code Playgroud)

在使用双字节标记编码的最后一个示例中,第一个字节是40十六进制,其中前三个最左边的位010指定应用程序特定的编码,向其添加魔术值1F(31)以指示另一个字节将跟随实际标签号,再1F,所以值31.

差异

应注意以下差异:

  • SIMPLE-TLV是一种不同的标签和长度编码方法(尽管编码看起来很相似,例如当使用单个字节来表示长度部分时)
  • SIMPLE-TLV不包含有关该字段类的信息,例如,如果它是为ASN.1定义的(因为它没有链接到ASN.1)
  • SIMPLE-TLV不包含信息,如果它是原始的或构造的(原语直接指定值,构造意味着嵌套的TLV结构)
  • SIMPLE-TLV对标签号(1到254之间,包括1和254)和长度(最多65535)有限制


Dav*_*vid 7

简单 TLV 仅由标签(或类型)、长度和值组成。

BER-TLV 是一种特殊的 TLV,其 Value 内包含一个或多个 TLV。因此它具有复合结构。

Tag1 Len1 Tag2-Len2-Value2 Tag3-Len3-Value3 ... TagN-LenN-ValueN
          ------------------------Value1------------------------
Run Code Online (Sandbox Code Playgroud)

  • 这并不是唯一的区别。简单 TLV 具有固定的标签长度​​和数据单元的长度部分,而 BER-TLV 可以具有可变的标签和长度。标签可以保存为 1 或 3 个字节,数据长度可以保存为 1 或 5 个字节......在简单 TLV 中,它始终为 1 或始终为 2 或始终为 3 等。 (4认同)