web-dev-qa-db-ja.com

SIMPLE-TLVとBER-TLV

私は彼らが参照しているドキュメントでSIMPLE-TLVBER-TLVを見つけました。私はほとんどのEMVとGPのドキュメントを調べましたが、それらは違いについて言及していません。

誰かが私が2つの違いを理解するのを手伝ってもらえますか?

18
nish1013

スマートカード用のISO/IEC7816-4のデータフィールド

BERエンコーディング

これは、ISO/IEC 7816-4で使用されるより一般的な BERエンコーディング の仕様です。

各BER-TLVデータオブジェクトは、2つまたは3つの連続したフィールドで構成されます(ISO/IEC 8825および付録Dを参照)。

タグフィールドTは、1つ以上の連続したバイトで構成されます。クラス、タイプ、および数値をエンコードします。長さフィールドは、1つ以上の連続したバイトで構成されます。整数Lをエンコードします。Lがnullでない場合、値フィールドVはL個の連続するバイトで構成されます。 Lがnullの場合、データオブジェクトは空です。値フィールドはありません。

ISO/IEC 7816は、現在の標準では最大5バイト(最大2 ^ 32-1バイトのサイズを指定)の使用のみを許可していることに注意してください。不定長エンコーディングもサポートされていません。これらの制限は、スマートカードに固有のものです。 4バイト長および5バイト長のエンコーディングはISO/IEC7816-4の新しいバージョンで導入されたことに注意してください。以前のカード/カード読み取りアプリケーションは、3バイトの長さ(つまり、4GiBではなく最大64KiBバイトの値サイズ)しかサポートしない場合があります。

SIMPLE-TLVの「単純な」部分が示すように、BERTLV仕様ははるかに拡張的です。インターネット上にはたくさんの情報があるので、詳細にはあまり触れません。

通常、BERはASN.1構造のエンコーディングとしてのみ使用し、ASN.1構文で構造を定義します。ただし、ISO 7816-4はこれを台無しにし、BERタグバイトを直接指定するだけです。

BERの代わりにDERが指定される場合があることに注意してください。その場合、多くの場合、長さフィールドのサイズに最小バイト数のみを使用します。 05以下のサンプルで。また、BERエンコーディングのISO/IEC仕様は、基本的に米国固有のX.690標準のコピーであることに注意してください。

SIMPLE-TLVエンコーディング

BER仕様の後に、ISO7816-4に固有のSIMPLE-TLV仕様が続きます。標準では、エンディアンを直接指定することを忘れていることに注意してください。 ISO/IEC7816-4内でビッグエンディアンエンコーディングを想定できます。

各SIMPLE-TLVデータオブジェクトは、2つまたは3つの連続したフィールドで構成されます。

タグフィールドTは、1から254までの数字(レコード識別子など)のみをエンコードする1バイトで構成されます。クラスも構築タイプもコーディングしません。長さフィールドは、1バイトまたは3バイトの連続バイトで構成されます。長さフィールドの先頭バイトが「00」から「FE」の範囲にある場合、長さフィールドは、0から254までの値の整数Lをエンコードする単一バイトで構成されます。先頭バイトが「FF」に等しい場合の場合、長さフィールドは、0〜65535の値を持つ整数Lをエンコードする後続の2バイトに続きます。Linがnullでない場合、値フィールド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

サンプル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**

2バイトのタグエンコーディングを使用する最後の例では、最初のバイトは40 hexであり、最初の3つの左端のビット010はアプリケーション固有のエンコーディングを指定し、それにマジック値1F(31)を追加して、別のバイトが実際のタグ番号、ここでも1Fなので、値は31です。

違い

次の違いに注意してください。

  • SIMPLE-TLVは、タグと長さをエンコードする別の方法です(ただし、エンコードは同じように見える場合があります。たとえば、長さの部分を示すために1バイトを使用する場合)。
  • SIMPLE-TLVには、フィールドのクラスに関する情報は含まれていません。 ASN.1用に定義されている場合(ASN.1にリンクされていないため)
  • SIMPLE-TLVは、プリミティブまたは構築されている場合、情報を含みません(プリミティブは値を直接指定し、構築はネストされたTLV構造を意味します)
  • SIMPLE-TLVには、タグ番号(1から254まで)と長さ(最大65535)に関する制限があります。
31
Maarten Bodewes

単純なTLVは、タグ(またはタイプ)、長さ、および値で構成されます。

BER-TLVは、値の中に1つ以上のTLVを持つ特別なTLVです。つまり、複合構造になっています。

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