【问题标题】:SIMPLE-TLV vs BER-TLVSIMPLE-TLV 与 BER-TLV
【发布时间】:2013-09-17 15:23:08
【问题描述】:

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

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

【问题讨论】:

    标签: nfc javacard apdu


    【解决方案1】:

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

    BER 编码

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

    每个 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(均为付费软件)中。

    SIMPLE-TLV 编码

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

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

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

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

    样品

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

    简单 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 hex,其中最左边的前 3 位 010 指定应用程序特定编码,将魔术值 1F (31) 添加到它以指示另一个字节将跟随使用实际的标签号,同样是 1F,所以值为 31。

    区别

    需要注意以下区别:

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

    【讨论】:

    • 防止混淆。标准 (ISO/IEC 7816-4) 附件 D 的第 4 部分描述了基本编码规则 ASN.1 的使用和使用 BER-TLV 的编码。它规定使用 BER-TLV 对交换的数据进行编码。它只是碰巧使用了 BER-TLV,但在其他方面 BER-TLV 与 ISO/IEC 7816 无关。
    • @RWC 我很确定第 6.2 段还指定了数据对象编码的 BER。这至少自 98 规范以来就存在,并且我已经检查了 2013 版本(尽管如果我没记错的话,2005 之前的版本只指定了一个 3 字节长度的字段)。
    【解决方案2】:

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

    BER-TLV 是一种特殊的 TLV,它的 Value 中有一个或多个 TLV。所以它具有复合结构。

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

    【讨论】:

    • 这不是唯一的区别。简单 TLV 为数据单元的标记和长度部分设置了长度,而 BER-TLV 可以具有可变的标记和长度长度。标签可以保存在 1 或 3 个字节中,数据长度可以保存在 1 或 5 个字节中……在简单 TLV 中,它始终为 1 或始终为 2 或始终为 3 等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多