X.690は、いくつかのASN.1エンコーディング形式を規定するITU-T規格です。
基本符号化規則(BER)は、ASN.1規格で定められた、データをバイナリ形式に符号化するための基本規則です。これらの規則は、 ASN.1用語では転送構文と総称され、データの符号化に使用される正確なオクテット(8ビットバイト)を指定します。
X.680 は、ブール値、数値、文字列、複合構造などのデータ型を宣言するための構文を定義します。各型定義には識別番号も含まれます。X.680 は、BooleanType、IntegerType、OctetStringType などのいくつかのプリミティブデータ型を定義します。(ASN.1 では、他の型から構築された型も提供されます。)型はクラスに関連付けられます。たとえば、プリミティブ型はユニバーサルクラスの一部です。他の 3 つのクラス (アプリケーション、プライベート、コンテキスト固有) は、基本的に特定のアプリケーションのカスタマイズをサポートするための異なるスコープです。クラスと型が組み合わさってタグを形成し、それが一意のデータ定義に対応します。X.690 には、これらのタグ、データ値 (コンテンツ)、およびエンコードされたデータの長さをエンコードするためのルールが含まれています。
BERは、BERの2つのサブセット(正規符号化規則と識別符号化規則)とともに、ASN.1文書シリーズの一部であるITU-TのX.690規格文書で定義されています。
基本符号化規則(BER)は、ASN.1データ構造を符号化するための、部分的に自己記述的かつ自己限定的なプロトコルを概説的に規定しています。各データ要素は、型識別子、長さ記述、実際のデータ要素、および必要に応じてコンテンツの終了マーカーとして符号化されます。これらのタイプの符号化は、一般的に型-長さ-値(TLV)符号化と呼ばれます。ただし、BERの用語では、識別子-長さ-コンテンツとなります。
このタイプのフォーマットでは、受信側はデータのサイズ、内容、意味に関する事前知識を必要とせずに、不完全なストリームからASN.1情報をデコードできますが、プロトコルの具体的な内容は、トラフィックまたはソフトウェアの代表的なサンプルから提供またはリバースエンジニアリングする必要があります。[ 1 ]
データエンコーディングは、以下の順序で3つまたは4つの要素から構成されます。
長さがゼロの場合、コンテンツオクテットは存在しません(例:NULL型)。コンテンツの末尾オクテットは、長さが不定の場合にのみ使用されます。
BER識別子オクテットはASN.1タグをエンコードします。ユニバーサルクラスタグのリストは、ITU-T勧告X.680、第8項、表1に記載されています。[ 2 ] 次のタグはASN.1固有のものです。
識別子オクテットは、ASN.1タグのクラス番号とタイプ番号をエンコードします。また、コンテンツオクテットが構築値かプリミティブ値かを示す情報もエンコードします。識別子は1つ以上のオクテットにまたがります。
最初のオクテットでは、ビット6が型がプリミティブ型か構築型かをエンコードし、ビット7~8がタグのクラスをエンコードし、ビット1~5がタグの型をエンコードします。以下の値が可能です。
タグのタイプが 5 ビット (0~30 10 ) に収まる場合、識別子は 1 バイトのみになります:短縮形式。タグのタイプが 5 ビットのタグ フィールドに対して大きすぎる場合 (> 30 10 )、さらにオクテットでエンコードする必要があります:長形式。
最初のオクテットは、以前と同様にクラスとプリミティブ/コンストラクタをエンコードし、ビット1~5は1です。タグ番号は後続のオクテットにエンコードされ、オクテットが複数ある場合は各オクテットのビット8が1になり、ビット1~7がタグ番号をエンコードします。タグ番号のビットをビッグエンディアンで組み合わせると、タグ番号がエンコードされます。エンコードされる後続オクテットの最小数、つまり最初の後続オクテットのビット1~7がすべて0であってはなりません。
長さのオクテットには、定形と不定形の2つの形式があります。
これはコンテンツのオクテット数をエンコードするもので、型がプリミティブ型または構築型でデータがすぐに利用できる場合は常に使用されます。短い形式と長い形式があり、それぞれ異なる長さの範囲をエンコードできます。数値データは符号なし整数としてエンコードされ、最下位ビットが常に最初に(右側に)配置されます。
短縮形は、ビット8が0である単一のオクテットで構成され、ビット1~7は長さ(0の場合もある)をオクテット数として符号化します。
長い形式は、最初の 1 オクテットと、それに続く 1 つ以上のオクテットで構成され、長さが含まれます。最初のオクテットでは、ビット 8 は 1 であり、ビット 1 ~ 7 (値 0 と 127 を除く) は、続くオクテットの数をエンコードします。[ 1 ] 次のオクテットは、ビッグ エンディアンで、長さ (0 の場合もある) をオクテットの数としてエンコードします。
これは長さをエンコードするのではなく、コンテンツのオクテットがマーカーオクテットで終了することを示します。これは構築型に適用され、エンコード時にコンテンツがすぐに利用できない場合によく使用されます。
これは単一のオクテットで構成され、そのオクテットではビット8が1、ビット1~7が0です。そして、2つのコンテンツ終了オクテットがコンテンツオクテットを終了させる必要があります。
内容オクテットは要素データ値をエンコードします。[ 1 ]
ASN.1オブジェクトの存在、あるいはその空性のみを記録すればよい場合は、内容オクテットが存在しない(したがって、要素の長さは0となる)場合があることに注意してください。例えば、ASN.1のNULL値がこれに該当します。
CER(Canonical Encoding Rules)は、ASN.1で記述されたデータ構造に対して明確な転送構文を生成するためのBERの制限付きバリアントです。BERはデータ値のエンコード方法について選択肢を与えますが、CER(およびDER)は基本エンコード規則で許可されているエンコードの中から1つだけを選択し、残りのオプションを排除します。CERは、エンコードを保持する必要がある場合(例えば、セキュリティ交換など)に役立ちます。
DER(Distinguished Encoding Rules)は、 ASN.1で記述されたデータ構造に対して明確な転送構文を生成するためのBERの制限付きバリアントです。CERと同様に、 DERエンコーディングは有効なBERエンコーディングです。DERは、送信者のオプションのうち1つを除くすべてを取り除いたBERと同じです。
DERはBERのサブセットであり、ASN.1値をエンコードする方法が正確に1つだけ用意されています。DERは暗号化など、一意のエンコードが必要な状況を想定しており、デジタル署名が必要なデータ構造が一意のシリアル化表現を生成することを保証します。DERはBERの標準形式とみなすことができます。例えば、BERではブール値のtrueは255個のゼロ以外のバイト値のいずれかでエンコードできますが、DERではブール値のtrueをエンコードする方法は1つだけです。
DERエンコーディングにおける最も重要な制約は以下のとおりです。
DERは、 X.509などのデジタル証明書に広く使用されています。
BER形式とCER形式またはDER形式の主な違いは、基本符号化規則によって提供される柔軟性です。 BERは、前述のとおり、ASN.1データ構造の転送のためにITU-T X.690で規定されている基本符号化規則のセットです。 BERは、送信者が送信したいデータ構造を符号化するための明確な規則を提供しますが、送信者にいくつかの符号化の選択肢も残しています。 X.690規格に記載されているように、「代替符号化は、送信者のオプションとして基本符号化規則によって許可されています。基本符号化規則への準拠を主張する受信者は、すべての代替をサポートする必要があります。」[ 1 ]
受信側は、BER準拠を正当に主張するためには、すべての合法的な符号化方式を受け入れる準備ができていなければなりません。これに対し、CERとDERは、使用可能な長さの仕様を単一のオプションに制限します。したがって、CERとDERはBERの制限された形式であり、BER規格の曖昧さを解消する役割を果たします。
CERとDERは、送信者に課す制約の点で異なります。CERとDERの基本的な違いは、DERが明確な長さ形式を使用するのに対し、CERは特定のケースで不定長形式を使用する点です。つまり、DERは常に先頭に長さ情報を持つのに対し、CERはエンコードされたデータの長さを提供する代わりに、コンテンツの末尾のオクテットを使用します。このため、CERは大きなエンコード値に対してはメタデータが少なくて済みますが、DERは小さなエンコード値に対してメタデータを必要とします。
エンコード規則の選択を容易にするため、X.690規格文書では以下のガイダンスを提供しています。
エンコードする値が利用可能なメモリに収まるほど小さく、かつネストされた値を迅速にスキップする必要がある場合は、標準エンコード規則よりも特殊なエンコード規則の方が適しています。エンコードする値が非常に大きく、利用可能なメモリに容易に収まらない場合、または値全体が利用可能になる前に値の一部をエンコードして送信する必要がある場合は、特殊なエンコード規則よりも標準エンコード規則の方が適しています。エンコードに値のセットまたは値の集合が含まれ、標準エンコード規則や特殊なエンコード規則が課す制約が不要な場合は、標準エンコード規則や特殊なエンコード規則よりも基本エンコード規則の方が適しています。
BERは、他の符号化規則と比較して「非効率的」であるという一般的な認識があります。この認識は、符号化規則自体に本質的な欠陥があるわけではなく、主に実装の不備によるものだと主張する人もいます。[ 3 ]これらの実装は、BERが提供する柔軟性を利用して、実装が容易な符号化ロジックを使用していますが、結果として必要以上に大きな符号化データストリームが生成されます。この非効率性が現実か認識かにかかわらず、BERのパフォーマンスとサイズを改善しようとするパック符号化規則 などの代替符号化方式が数多く開発されています。
BER の柔軟性を維持しつつ、別のエンコード方式を使用する代替フォーマット規則も開発されている。その中でも最も普及しているのは、XML ベースの代替方式で、XML エンコード規則や ASN.1 SOAPなどである。[ 4 ] さらに、XML スキーマを ASN.1 スキーマに変換するための標準マッピングがあり、それを BER を使用してエンコードすることができる。[ 5 ]
問題点が指摘されているにもかかわらず、BERは特に異なるネイティブデータエンコーディングを持つシステムにおいて、データ伝送のための一般的なフォーマットとなっている。
それに比べて、より確実なDERエンコーディングは、X.509などのデジタル証明書を転送するために広く使用されています。