X.690
ISO/IEC 8825-1 JIS X 5606-1
ITU-T X.680 ASN.1 の基本書式 BER / CER / DER などを決めたもの 8. Basic Encoding Rules 基本符号化規則
Canonical Encodnig Rules 標準符号化規則
Distinguished Encoding Rules 識別符号化規則
他 シリーズ
X.691 PER Packed Encoding Rules
X.692 ECN
X.693 XER XML Encoding Rules X.696 OER
X.697 JER JavaScript Object Notation (JSON) Encoding Rules 現在では DER がよく利用されている
読みたいところだけ翻訳しているのでどこが抜けているかは原文で確認してください
個人用なので翻訳された内容は保証しません
ISO/IEC 8825-1:2021 (E)
国際標準
ITU-T 勧告
情報技術 - ASN.1符号化規則: Information technology - ASN.1 encoding rules:
基本符号化規則 (BER), Specification of Basic Encoding Rules (BER),
標準符号化規則 (CER) Canonical Encoding Rules (CER)
と識別符号化規則 (DER) and Distinguished Encoding Rules (DER)
1 範囲 Scope
2 規範的参照 Normative references
3 定義 Definitions
4 略語 Abbreviations
5 表記 Notation
6 慣例 Convention
6.1 この勧告 | 国際標準では、「最上位ビット」と「最下位ビット」という用語を使用して、エンコード内の各オクテットの値を指定します。
注 – 下位層の仕様では、シリアル ラインでのビット送信の順序、または並列チャネルへのビットの割り当てを定義するために同じ表記法が使用されます。
6.2 この勧告 | 国際標準の目的のためだけに、オクテットのビットは 8 から 1 まで番号が付けられ、ビット 8 は「最上位ビット」、ビット 1 は「最下位ビット」です。
6.3 この勧告 | 国際標準の目的のために、2 つのオクテット文字列を比較することができます。1 つのオクテット文字列が他のオクテット文字列と等しいのは、それらの長さが同じで、各オクテット位置が同じである場合です。オクテット文字列 S1 が他のオクテット文字列 S2 より大きいのは、次のいずれかの場合のみです。
a) S1 と S2 は、S2 の最後のオクテットまでのすべての位置で同一のオクテットを持つが、S1 の方が長い。または
b) S1 と S2 は 1 つ以上の位置で異なるオクテットを持ち、最初の位置では、オクテットを符号なし 2 進数として、ビット n の重みが $ 2^{n–1} であるとすると、S1 のオクテットが S2 のオクテットよりも大きい。
7 適合性 Conformance
7.1 動的適合性は、条項 8 から 12 までで規定されます。
7.2 静的適合性は、これらのエンコード ルールの 1 つ以上の適用を指定する標準によって指定されます。
7.3 代替エンコーディングは、送信者のオプションとして基本符号化規則で許可されています。基本符号化規則への準拠を主張する受信者は、すべての代替エンコーディングをサポートする必要があります。
注 – このような代替エンコーディングの例は、8.1.3.2 b) および表 3 に記載されています。
7.4 標準符号化規則または識別符号化規則では、代替エンコーディングは許可されません。
8. 基本符号化規則 Basic encoding rules
8.1 エンコーディングの一般規則
8.1.1 1つのエンコーディングの構造
8.1.1.1 データ値のエンコードは、次の順序で現れる 4 つのコンポーネントで構成されます:
a) identifier octets (8.1.2 参照);
b) length octets (8.1.3 参照);
c) contents octets (8.1.4 参照);
d) end-of-contents octets (8.1.5 参照).
8.1.1.2 コンテンツ終了(end-of-contents)オクテットは、長さオクテットの値によって存在する必要がある場合を除き、存在してはならない(8.1.3 を参照)。
8.1.1.3 図 1 は、エンコーディング (プリミティブまたは構築) の構造を示しています。 図 2 は、別の構築されたエンコーディングを示しています。
table:図1 an encodingの構造
Identifier octets Length octets Contents octets
↑ contents octsts
のオクテット数
(8.1.3.2参照)
table: 別のエンコーディングの構造
Identifier octets Length octets Contents octets End-of-contents octets
↑ ↑
コンテンツ オクテットが コンテンツ オクテットにそれ以上の
コンテンツの終了 オクテットに エンコーディングがないことを示します。
よって終了することを示します。
(8.1.3.6参照)
長さが定まらない構造(constructed)の場合はLengthを未確定にしてEnd-of-contents で終わる形にすることができる (DERでは不可)
8.1.1.4 この勧告 | 国際標準で指定されているエンコーディングは、ASN.1 サブタイプ表記法または ASN.1 タイプ拡張表記法のいずれの影響も受けません。
注 – これは、エンコーディングを決定するときにすべての制約表記法が無視され、CHOICE、SEQUENCE、および SET のすべての拡張マーカーが無視され、拡張機能がタイプの拡張ルートにあるかのように扱われることを意味します。
8.1.1.5 この勧告 | 国際標準で指定されているエンコード規則に対して定義されたエンコード命令はありません (Rec. ITU-T X.680 | ISO/IEC 8824-1、3.8.27 を参照)。
8.1.2 識別子オクテット Identifier octets
8.1.2.1 識別子オクテットは、データ値の型の ASN.1 タグ (クラスと番号) をエンコードする必要があります。
8.1.2.2 0 から 30 までの番号を持つタグの場合、識別子オクテットは次のようにエンコードされた 1 つのオクテットで構成されます。:
a)
b)
c)
8.1.2.3
8.2 boolean値の符号化 Encoding of a boolean value
8.3 integer値の符号化 Encoding of an integer value
8.4 列挙値の符号化 Encoding of an enumerated value
列挙値のエンコードは、それが関連付けられている整数値のエンコードと同じでなければなりません。
注 – これはプリミティブです
8.5 実数値の符号化 Encoding of a real value
8.5.1 実数値(real value)のエンコードはプリミティブでなければなりません。
8.5.2 実数値がプラスゼロの場合、エンコーディングには内容オクテットは存在しません。
8.5.3 実際値がマイナスゼロである場合、8.5.9 で指定されているようにエンコードされます。
8.5.4 ゼロ以外の実数値の場合、抽象値の底が 10 の場合、エンコードされた値の底は 10 になり、抽象値の底が 2 の場合、エンコードされた値の底は 送信者のオプションとして 2, 8, または 16 を選択できます。
8.5.5 実数値がゼロ以外の場合、エンコードに使用される基数は 8.5.4 で指定されているように B' になります。 B' が 2、8、または 16 の場合、8.5.7 で指定されたバイナリエンコーディングが使用されます。 B' が 10 の場合、8.5.8 で指定された文字エンコーディングが使用されます。
8.5.6 最初の内容オクテットのビット 8 は次のように設定されます:
a) bit 8 = 1, の場合 8.5.7 で指定されたバイナリ エンコーディングが適用されます。
b) ビット 8 = 0 およびビット 7 = 0 の場合、8.5.8 で指定されている 10 進エンコーディングが適用されます。
c) ビット 8 = 0 およびビット 7 = 1 の場合、「SpecialRealValue」(Rec. ITU-T X.680 | ISO/IEC 8824-1 を参照) または
マイナスゼロの値は、8.5.9 で指定されているようにエンコードされます。
8.5.7 バイナリ エンコーディングが使用される場合 (ビット 8 = 1)、仮数 M がゼロ以外の場合、それは符号 S、正の整数値 N、およびバイナリ スケーリング ファクタ F によって表されます。
$ M = S × N × 2^F
$ 0 ≤ F < 4
$ S = +1 or -1
注 – バイナリスケール係数 F は、仮数の暗黙の小数点をこの節のエンコード規則で要求される位置に揃えるために、特定の状況下で必要となります。 この位置合わせは、指数 E の変更によって常に実現できるとは限りません。エンコードに使用される基数 B' が 8 または 16 の場合、暗黙のポイントは、コンポーネント E を変更することによって、それぞれ 3 ビットまたは 4 ビットのステップでのみ移動できます。 、暗黙の点を必要な位置に移動するには、ゼロ以外のバイナリ スケーリング係数 F の値が必要になる場合があります。
8.5.7.1 最初の内容オクテットのビット 7 は、S が –1 の場合は 1、それ以外の場合は 0 になります。
8.5.7.2 最初の内容オクテットのビット 6 ~ 5 は、ベース B' の値を次のようにエンコードします。
table:base
Bits 6 to 5 Base
00 base 2
01 base 8
10 base 16
11 この勧告 | 国際標準の今後の版のために予約されています
8.5.7.3 最初の内容オクテットのビット 4 ~ 3 は、バイナリ スケーリング ファクタ F の値を符号なし 2 進整数としてエンコードします。
8.5.7.4 最初の内容オクテットのビット 2 ~ 1 は、次のように指数の形式をエンコードします:
a) ビット 2 ~ 1 が 00 の場合、2 番目の内容オクテットは指数の値を 2 の補数の 2 進数としてエンコードします。
b) ビット 2 ~ 1 が 01 の場合、2 番目と 3 番目の内容オクテットは指数の値を 2 の補数の 2 進数としてエンコードします。
c) ビット 2 ~ 1 が 10 の場合、2 番目、3 番目、および 4 番目の内容オクテットは、指数の値を 2 の補数の 2 進数としてエンコードします。
d) ビット 2 ~ 1 が 11 の場合、2 番目の内容のオクテットは、指数の値をエンコードするために使用されるオクテットの数 (X など) をエンコードし、3 番目は (X プラス 3) 番目までをエンコードします。 (包括的な) 内容オクテットは、指数の値を 2 の補数の 2 進数としてエンコードします。 X の値は少なくとも 1 でなければなりません。 送信される指数の最初の 9 ビットは、すべて 0 またはすべて 1 であってはなりません。
8.5.7.5 残りの内容オクテットは、整数 N (8.5.7 を参照) の値を符号なし 2 進数としてエンコードします。
注 1 – 非標準 BER の場合、仮数の浮動小数点正規化は必要ありません。 これにより、実装者はメモリ内の仮数に対してシフト関数を実行することなく、仮数を含むオクテットを送信できるようになります。 Canonical Encoding Rules と Distinguished Encoding Rules では正規化が指定されており、仮数部 (0 でない場合) は最下位ビットが 1 になるまで繰り返しシフトされる必要があります。
注 2 – 実数のこの表現は、浮動小数点ハードウェアで通常使用される形式とは大きく異なりますが、そのような形式との間で簡単に変換できるように設計されています (付録 C を参照)。
8.5.8 10 進エンコードが使用される場合 (ビット 8 ~ 7 = 00)、最初の内容オクテットに続くすべての内容オクテットは、ISO 6093 (JIS X 0210)で用語が使用されるように、送信者が選択した長さのフィールドを形成し、ISO 6093 に従ってエンコードされます。 ISO 6093 の数値表現の選択は、次のように最初の内容オクテットのビット 6 ~ 1 で指定されます。
table:bits
Bits 6 ~ 1 数値表現
00 0001 ISO 6093 (JIS X 0210) NR1 form
00 0010 ISO 6093 (JIS X 0210) NR2 form
00 0011 ISO 6093 (JIS X 0210) NR3 form
ビット 6 ~ 1 の残りの値は、この勧告|国際規格の今後の版のために予約されています。
付属文書で指定されているスケーリング係数を使用してはなりません (ISO 6093 を参照)。
注 1 – 小数点の左側に少なくとも 1 桁の使用に関する ISO 6093 の勧告は、この勧告|国際規格でも推奨されていますが、必須ではありません。
注 2 – 正規化形式 (ISO 6093 を参照) の使用は送信者のオプションであり、意味はありません。
8.5.9 「SpecialRealValues」またはマイナス ゼロがエンコードされる場合 (ビット 8 ~ 7 = 01)、次のような値を持つ内容オクテットが 1 つだけ存在します。
01000000 値は PLUS-INFINITY です
01000001 値は MINUS-INFINITY です
01000010 値は NOT-A-NUMBER です
01000011 値はマイナスゼロです
ビット 8 と 7 がそれぞれ 0 と 1 に等しい他のすべての値は、この勧告|国際標準への追加用に予約されています。
8.6 bitstring値の符号化 Encoding of a bitstring value
8.6.1 bitstring値のエンコードは、送信者の選択により、プリミティブまたは構築(constructed)とします。
注 – ビット文字列全体が利用可能になる前にビット文字列の一部を転送する必要がある場合は、構築されたエンコードが使用されます。
8.6.2 プリミティブエンコーディングのコンテンツオクテットには、最初のオクテットと、それに続く 0 個、1 個、または複数の後続オクテットが含まれます。
8.6.2.1 bitstring値のビットは、先頭ビットから末尾ビットまで、最初の後続オクテットのビット 8 から 1 に配置され、その後に 2 番目の後続オクテットのビット 8 から 1 が続き、その後に各オクテットのビット 8 から 1 が順番に続き、その後に最後の後続オクテットの必要な数のビットがビット 8 から始まり、配置されます。
注 – 「先頭ビット」および「末尾ビット」という用語は、Rec. ITU-T X.680 | ISO/IEC 8824-1、22.2 で定義されています。
8.6.2.2 最初のオクテットは、ビット 1 を最下位ビットとする符号なし 2 進整数として、最後の後続オクテット内の未使用ビットの数をエンコードします。その数は 0 から 7 の範囲です。
9 標準符号化規則 Canonical encoding rules
標準符号化規則(Canonical encoding rule)で使用されるデータ値のエンコーディングは、第 8 条で説明されている基本的なエンコーディングであり、以下の制限と第 11 条にもリストされている制限があります。
9.1 Length forms
9.2 String encoding forms
ビット文字列、オクテット文字列、および制限された文字列値は、1000 以下の内容オクテットを必要とする場合はプリミティブ エンコードでエンコードされ、それ以外の場合は構築されたエンコードとしてエンコードされます。 構築されたエンコーディングに含まれる文字列フラグメントは、プリミティブ エンコーディングでエンコードされます。 おそらく最後のフラグメントを除いて、各フラグメントのエンコーディングは 1000 コンテンツ オクテットを持つものとします。 (8.23.6 と対比してください。) 最後のフラグメントには、少なくとも 1 つ、最大 1000 個の内容オクテットが含まれます。
9.3 Set コンポーネント
Set値のコンポーネント値のエンコーディングは、Rec. ITU-T X.680 | ISO/IEC 8824-1 の 8.6 で指定されているように、タグによって決定された順序で表示されます。 さらに、1 つ以上のコンポーネントがタグなしの選択肢タイプである場合に、コンポーネントがエンコードされる順序を決定する目的で、タグなしの各選択肢タイプは、その選択肢タイプの最小のタグと同じタグを持つかのように順序付けされます。 タグなしの選択タイプがその中にネストされています。
例
以下では、IMPLICIT TAGSのタグ付け環境を想定しています。
code:例
A ::= SET
{
{
},
e CHOICE
{
f CHOICE
{
},
i CHOICE
{
}
}
}
セットのコンポーネントがエンコードされる順序は常に e、b、a になります。これは、タグ 0 が最も低く、次に 1、3 の順になるためです。 10 識別符号化規則 Distinguished encoding rules
識別符号化規則によって使用されるデータ値のエンコーディングは、第 8 条で説明されている基本的なエンコーディングであり、以下の制限と第 11 条にもリストされている制限が伴います。
10.1 Length forms
10.2 String encoding forms
ビット文字列(bitstring)、オクテット文字列(octetstring)、および制限された文字列タイプ(restricted character string types)の場合、構築された(constructed)形式のエンコーディングは使用しません。 (8.23.6 と比較してください。)
10.3 Setコンポーネント
設定値のコンポーネント値のエンコーディングは、Rec. ITU-T X.680 | ISO/IEC 8824-1 の8.6 で指定されているように、タグによって決定された順序で表示されます。
注 – セットのコンポーネントがタグなしの選択肢タイプである場合、順序付けにおけるそのコンポーネントの位置は、エンコードされる選択肢コンポーネントのタグによって異なります。
11 CER と DER の両方で採用されている BER の制限
第 8 条およびその副次条項における「BER エンコーディングであるものとする」への言及は、「必要に応じて CER または DER エンコーディングであるものとする」と解釈されます。 (8.16.1、8.17.1、8.18.1、および 8.24.1 を参照。)
11.1 Boolean値
エンコーディングがブール値 TRUE を表す場合、その単一内容オクテットの 8 ビットすべてが 1 に設定されます。 (8.2.2 と比較してください。)
11.2 未使用ビット
11.2.1 ビット文字列値のエンコードの最後のオクテット内の未使用の各ビットは、ゼロに設定されます。
11.2.2 Rec. ITU-T X.680 | ISO/IEC 8824-1、22.7 が適用される場合、ビット文字列はエンコードされる前に末尾の 0 ビットをすべて削除する必要があります。
注 1 – サイズ制約が適用されている場合、デコーダによってアプリケーションに配信される抽象値は、サイズ制約を満たすものの 1 つであり、後続の 0 ビットの数のみが送信値と異なります。
注 2 – ビット文字列値に 1 ビットがない場合、エンコーダは値を長さ 1 でエンコードし、最初のオクテットを 0 に設定する必要があります。
11.3 Real値
11.3.1 エンコーディングが基数 B が 2 である実数値を表す場合、基数 2 を使用するバイナリエンコーディングが使用されます。 エンコード前に、M が 0 または奇数になるように、仮数 M と指数 E が選択されます。
注 – これが必要なのは、ゼロ以外の整数nについて、M ≠ M' である場合、同じ実数値が {M, 2, E} と {M', 2, E'} の両方としてみなされるためです:
$ M' = M × 2^{-n}
$ E' = E + n
値をエンコードする際、バイナリ スケーリング ファクタ F はゼロとし、M と E はそれぞれ必要な最小オクテットで表現する必要があります。
11.3.2 エンコーディングが底 B が 10 である実数値を表す場合、10 進エンコーディングが使用されます。 エンコーディングを形成する際には、以下が適用されます。
11.3.2.1 ISO 6093 (JIS X 0210) NR3 形式を使用しなければなりません (8.5.8 を参照)。
11.3.2.2 SPACE はエンコード内で使用しないでください。
11.3.2.3 実際の値が負の場合はマイナス記号 (-) で始まり、それ以外の場合は数字で始まります。
11.3.2.4 仮数の最初の桁も最後の桁も 0 にすることはできません。
11.3.2.5 仮数部の最後の桁の直後には終点 (.) が続き、その後に指数記号「E」が続きます。
11.3.2.6 指数の値が 0 の場合は、「+0」と書き込まれます。それ以外の場合、指数の最初の桁は 0 であってはならず、プラス記号は使用されません。
11.4 GeneralString値
GeneralString 型 (および国際コード化文字セット登録簿への参照によって定義されるその他すべての制限された文字列型) の値のエンコードでは、文字のレジスタ エントリが現在 G0、G1、G2、G3、C0、または C1 セットとして指定されていない場合にのみ、新しいレジスタ エントリを指定して呼び出すエスケープ シーケンスが生成されます。すべての指定と呼び出しは、エスケープ シーケンスで使用される国際コード化文字セット登録簿のエントリで定義されているエスケープ シーケンスがある最小番号の G または C セットに対して行われます。
注 1 – 上記の条項の目的上、G0 は最小の番号の G セットであり、その後に G1、G2、G3 が続きます。C0 は最小の番号の C セットであり、その後に C1 が続きます。
注 2 – 文字列値の各文字は、国際コード化文字セット登録簿の特定のエントリに関連付けられます。
11.5 Set と sequence コンポーネント と デフォルト値
set値またはsequence値のエンコードには、デフォルト値に等しいコンポーネント値のエンコードは含まれません。
11.6 Set-of コンポーネント
Set-of値のコンポーネント値のエンコードは昇順で表示され、エンコードはオクテット文字列として比較され、短いコンポーネントの末尾には 0 オクテットが埋め込まれます。
注 – パディングオクテットは比較目的のみで、エンコードには表示されません。
12 転送構文定義における BER、CER、DER の使用
12.1
付録 C
実数値エンコードの図解
(この附属書は、この勧告 | 国際規格の不可欠な部分を形成するものではありません。)
C.1 送信者は通常、自身のハードウェア浮動小数点表現を調べて、この浮動小数点表現と ASN.1 実数値のエンコードの長さと内容オクテットの間で値を転送するために使用する (値に依存しない) アルゴリズムを決定します。 この付録では、図 C.1 に示す仮数の (人工) ハードウェア浮動小数点表現を使用して、そのようなプロセスで実行できる手順を説明します。
指数は浮動小数点ハードウェアから整数値 E として簡単に取得できると想定されます。
C.2 (この勧告 | 国際規格の本文で指定されているように) バイナリ エンコーディングを使用してゼロ以外の値を送信するために生成する必要があるコンテンツ オクテットは次のとおりです。
1 S bb ff ee Octets for E Octets for N