SIMPLE-TLV vs BER-TLV

问题描述 投票:18回答:2

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

有人可以帮助我了解两者的区别吗?

nfc javacard apdu
2个回答
32
投票

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

BER编码

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

每个BER-TLV数据对象应包含2个或3个连续字段(请参阅ISO / IEC 8825和附件D)。

标签字段T由一个或多个连续字节组成。它编码一个类,一个类型和一个数字。长度字段包含一个或多个连续字节。它编码一个整数L。如果L不为null,则值字段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标准的副本,也反映在国际标准ISO / IEC 8825-1(均为付费软件)中。

SIMPLE-TLV编码

ISO / IEC 7816-4中的BER规范后面是SIMPLE-TLV规范。 SIMPLE-TLV特定于ISO 7816-4。

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

标签字段T由单个字节组成,仅对来自1到254(例如记录标识符)。它没有分类也没有编码建筑类型。长度字段包含1或3个连续的字节。如果length字段的前导字节在以下范围内从“ 00”到“ FE”,则长度字段由单字节编码组成一个从0到254的整数L。如果前导字节等于'FF',然后长度字段在随后的两个字节上继续编码从0到65535的整数L。如果L in不如果为null,则值字段V由连续的字节组成。如果L是null,则数据对象为空:没有值字段。

请注意,标准忘记直接指定字节序。但是,您可以在ISO / IEC 7816-4中采用大端编码。

试样

以下示例均用于传达相同的标签号(定义字段)和值,除了为BER定义标签号31的示例。>

Sample 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。

差异

应注意以下差异:

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

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

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

Tag1 Len1 Tag2-Len2-Value2 Tag3-Len3-Value3 ... TagN-LenN-ValueN
          ------------------------Value1------------------------

1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.