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
この勧告 | 国際標準は、Rec. ITU-T X.680 | ISO/IEC 8824-1、Rec. ITU-T X.681 | ISO/IEC 8824-2、Rec. ITU-T X.682 | ISO/IEC 8824-3、および Rec. ITU-T X.683 | ISO/IEC 8824-4 で指定された表記法 (まとめて抽象構文記法 1 または ASN.1 と呼ばれます) を使用して定義された型の値の転送構文の仕様を導出するために使用できる一連の基本的なエンコード規則を指定します。これらの基本的なエンコード規則は、転送されるデータ値を識別するために、このような転送構文をデコードするためにも適用されます。また、値のエンコードを、基本的なエンコード規則によって提供される選択肢の 1 つだけに制限する一連の標準および区別されたエンコード規則も指定します。
2 規範的参照 Normative references
以下の勧告および国際標準には、このテキストで参照されることにより、この勧告 | 国際標準の規定を構成する規定が含まれています。発行時点では、示されている版が有効でした。すべての勧告および規格は改訂される可能性があり、この勧告 | 国際標準に基づく契約の当事者は、以下にリストされている勧告および規格の最新版を適用する可能性を調査することが推奨されます。IEC および ISO のメンバーは、現在有効な国際規格の登録を維持しています。ITU の電気通信標準化局は、現在有効な ITU-T 勧告のリストを維持しています。
注意 – この勧告 | 国際標準は ISO/IEC 10646:2003 に基づいています。この規格のそれ以降のバージョンを使用して適用することはできません。
2.1 同一の勧告 | 国際標準
3 定義 Definitions
4 略語 Abbreviations
5 表記 Notation
この勧告 | 国際標準は、Rec. ITU-T X.680 | ISO/IEC 8824-1 で定義された表記法を参照します。
6 慣例 Convention
6.1 この勧告 | 国際標準では、「最上位ビット」 "most significant bit" と「最下位ビット」 "least significant bit" という用語を使用して、エンコード内の各オクテットの値を指定します。
注 – 下位層の仕様では、シリアル ラインでのビット送信の順序、または並列チャネルへのビットの割り当てを定義するために同じ表記法が使用されます。
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 標準符号化規則(CER)または識別符号化規則(DER)では、代替エンコーディングは許可されません。
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: 図2 別の構築形エンコーディング
識別子 長さ 内容 内容終端
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) ビット8と7は、表1に指定されているタグのクラスを表すためにエンコードされるものとする。
b) ビット6は8.1.2.5の規則に従って0または1になる。
c) ビット 5 から 1 は、ビット 5 を最上位ビットとして、タグの番号を 2 進整数としてエンコードします。
table: 表1 タグのクラスの符号化
Class Bit 8 Bit 7
Universal 汎用 0 0
Application 応用 0 1
Context-specific 文脈依存 1 0
Private 私用 1 1
8.1.2.3 図 3 は、タグ番号が 0 から 30 (両端を含む) の範囲にあるタイプの識別子オクテットの形式を示しています。
table: 図3 識別子オクテット (low tag number)
identifier octet
Bits 8 7 6 5 4 3 2 1
Class P/C Tag番号
0 = 基本型 Primitive
1 = 構造型 Constructed
8.1.2.4 31 以上の番号を持つタグの場合、識別子は先頭のオクテットとそれに続く 1 つ以上の後続のオクテットで構成されます。
8.1.2.4.1 先頭オクテットは次のようにエンコードされます:
a) ビット 8 と 7 は、表 1 に記載されているタグのクラスを表すようにエンコードされます。
b) ビット 6 は、8.1.2.5 の規則に従って 0 または 1 になります。
c) ビット 5 から 1 は、$ 11111_2 としてエンコードされます。
8.1.2.4.2 後続のオクテットは、タグの番号を次のようにエンコードするものとする:
a) 各オクテットのビット 8 は、識別子オクテットの最後のオクテットでない限り、1 に設定されるものとする。
b) 最初の後続オクテットのビット 7 から 1、それに続く 2 番目の後続オクテットのビット 7 から 1、さらに続く各オクテットのビット 7 から 1 は、識別子オクテットの最後の後続オクテットまで、タグ番号に等しい符号なし 2 進整数のエンコードであり、最初の後続オクテットのビット 7 が最上位ビットとなるものとする。
c) 最初の後続オクテットのビット 7 から 1 はすべてゼロであってはならない。
8.1.2.4.3 図 4 は、タグの番号が 30 より大きいタイプの識別子オクテットの形式を示しています。
8.1.2.5 ビット 6 は、エンコーディングがプリミティブの場合は 0 に設定され、エンコーディングが構築されている場合は 1 に設定されます。
注 - 後続のサブ句では、各タイプに対してエンコーディングがプリミティブか構築かを指定します。
8.1.2.6 Rec. ITU-T X.680 | ISO/IEC 8824-1 では、CHOICE キーワードを使用して定義されたタイプのタグは、選択されたデータ値が取得されるタイプのタグの値を取得することが規定されています。
8.1.2.7 Rec. ITU-T X.681 | ISO/IEC 8824-2、14.2 および 14.4 では、「ObjectClassFieldType」を使用して定義されたタイプのタグは、タイプ フィールド、可変タイプ値フィールド、または可変タイプ値セット フィールドのいずれであるかは不確定であると規定されています。このタイプはその後 ASN.1 タイプとして定義され、完全なエンコードは割り当てられたタイプ (識別子オクテットを含む) の値のエンコードと同一になります。
8.1.3 長さオクテット Length octets
8.1.3.1 長さオクテットには 2 つの形式が指定されています。これらは、
a) 確定形式 (8.1.3.3 を参照)
b) 不確定形式 (8.1.3.6 を参照) です。
8.1.3.2 送信者は以下を行うものとします。
a) エンコーディングがプリミティブである場合は、定形形式 (8.1.3.3 を参照) を使用します。
b) エンコーディングが構築されており、すべてがすぐに利用できる場合は、送信者のオプションとして、定形形式 (8.1.3.3 を参照) または不定形形式 (8.1.3.6 を参照) を使用します。
c) エンコーディングが構築されており、すべてがすぐに利用できるわけではない場合は、不定形形式 (8.1.3.6 を参照) を使用します。
8.1.3.3 確定形式の場合、長さオクテットは 1 つ以上のオクテットで構成され、送信者のオプションとして短縮形式 (short form 8.1.3.4 を参照) または長い形式 (long form 8.1.3.5 を参照) のいずれかを使用してコンテンツ オクテット内のオクテットの数を表すものとします。
注 – 短縮形式は、コンテンツ オクテット内のオクテット数が 127 以下の場合にのみ使用できます。
8.1.3.4 短縮形式では、長さオクテットは、ビット 8 がゼロで、ビット 7 から 1 が内容オクテット内のオクテット数 (ゼロの場合もある) を、ビット 7 を最上位ビットとする符号なし 2 進整数としてエンコードする単一のオクテットで構成されます。
例
L = 38 は $ 00100110_2 として符号化できる
8.1.3.5 長い形式では、長さオクテットは最初のオクテットと 1 つ以上の後続オクテットで構成されます。最初のオクテットは次のようにエンコードされます:
a) ビット 8 は 1 です。
b) ビット 7 から 1 は、長さオクテット内の後続オクテットの数を、ビット 7 を最上位ビットとする符号なし 2 進整数としてエンコードします。
c) 値 $ 11111111_2 は使用されません。
注 1 – この制限は、将来の拡張の可能性を考慮して導入されました。
最初の後続オクテットのビット 8 から 1、それに続く 2 番目の後続オクテットのビット 8 から 1、さらに最後の後続オクテットまでの各オクテットのビット 8 から 1 は、内容オクテットのオクテット数に等しい符号なし 2 進整数のエンコードであり、最初の後続オクテットのビット 8 が最上位ビットとなります。
例
L = 201 は次のように符号化できる:
$ 10000001_2
$ 11001001_2
注 2 – 長い形式では、必要最小限の長さよりも長いオクテットを使用するかどうかは送信者のオプションです。
8.1.3.6 不確定形式の場合、長さオクテットは、コンテンツオクテットがコンテンツ終了オクテット(8.1.5 を参照)によって終了し、単一のオクテットで構成されることを示します。
8.1.3.6.1 単一のオクテットでは、ビット 8 が 1 に設定され、ビット 7 から 1 が 0 に設定されます。
8.1.3.6.2 この形式の長さが使用される場合、コンテンツオクテットの後にエンコーディング内にコンテンツ終了オクテット(8.1.5 を参照)が存在する必要があります。
8.1.4 コンテンツ(内容)オクテット Contents octets
コンテンツオクテットは、0、1、またはそれ以上のオクテットで構成され、後続の条項で指定されているデータ値をエンコードするものとします。
注 – コンテンツオクテットはデータ値のタイプに依存します。後続の条項は、ASN.1 のタイプの定義と同じ順序に従います。
8.1.5 コンテンツ終端オクテット End-of-contents octets
コンテンツ終端オクテットは、長さが 8.1.3.6 で指定されているとおりにエンコードされている場合に存在し、それ以外の場合は存在しません。
コンテンツ終了オクテットは、2 つのゼロ オクテットで構成されます。
注 – コンテンツ終了オクテットは、タグがユニバーサル クラス、形式がプリミティブ、タグの番号がゼロ、コンテンツが存在しない値のエンコードと見なすことができます。
コンテンツ終端 長さ 内容
$ 00_{16} $ 00_{16} 存在しない
8.2 boolean値の符号化 Encoding of a boolean value
8.2.1 boolean値のエンコードはプリミティブでなければなりません。コンテンツオクテットは単一のオクテットで構成されます。
8.2.2 boolean値が次の場合:
FALSE
オクテットはゼロになります。
boolean値が次の場合:
TRUE
オクテットは送信者のオプションとしてゼロ以外の値になります
例
BOOLEAN 型の場合、値 TRUE は次のようにエンコードできます。
Boolean 長さ 内容
$ 01_{16} $ 01_{16} $ FF_{16}
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 の範囲です。
8.6.2.3 ビット文字列が空の場合、後続のオクテットは存在せず、最初のオクテットはゼロになります。
8.6.2.4 Rec. ITU-T X.680 | ISO/IEC 8824-1、22.7 が適用される場合、BER エンコーダー/デコーダーは値の末尾の 0 ビットを追加または削除できます。
注 – ビット文字列値に 1 ビットがない場合、エンコーダー (送信者のオプション) は、長さ 1 で最初のオクテットを 0 に設定して値をエンコードするか、最初のオクテットの後に 1 つ以上の 0 ビットが続くビット文字列としてエンコードできます。
8.6.3 構築型エンコーディングのコンテンツ オクテットは、0、1、またはそれ以上のネストされたエンコーディングで構成されます。
注 – このような各エンコーディングには、識別子、長さ、およびコンテンツ オクテットが含まれ、構築型の場合はコンテンツ終了オクテット(End-of-contents)が含まれる場合があります。
8.6.4 ビット文字列値をこのようにエンコードするには、セグメント化します。各セグメントは値の連続するビットの列で構成され、最後の例外を除いて、8 の倍数のビット数が含まれます。全体の値の各ビットは 1 つのセグメントに正確に含まれますが、セグメントの境界に意味はありません。
注 – セグメントのサイズは 0 で、ビットが含まれない場合があります。
8.6.4.1 コンテンツ オクテット内の各エンコーディングは、全体のビット文字列のセグメントを表すものとし、このサブ条項の再帰的適用から生じるエンコーディングです。この再帰的適用では、各セグメントはビット文字列値であるかのように扱われます。セグメントのエンコーディングは、全体の値にビットが現れる順序でコンテンツ オクテットに現れます。
注 1 – この再帰の結果として、コンテンツ オクテット内の各エンコーディングは、それ自体がプリミティブまたは構築型の可能性があります。ただし、このようなエンコーディングは通常プリミティブです。
注 2 – 特に、コンテンツ オクテット内のタグは常にユニバーサル クラス、番号 3 です。
8.6.4.2 例
BIT STRING 型の場合、値 '0A3B5F291CD'H は以下のようにエンコードできます。この例では、ビット文字列はプリミティブとして表されます。
BitString 長さ 内容
$ 03_{16} $ 07_{16} $ 040A3B5F291CD0_{16}
上記の値は、以下のようにエンコードすることもできます。この例では、ビット文字列は構築型(constructer)として表されます。
BitString 長さ 内容
$ 23_{16} $ 80_{16} BitString 長さ 内容
$ 03_{16}$ 03_{16}$ 000A3B_{16}
$ 03_{16} $ 05_{16} $ 045F291CD0_{16} EOC 長さ
$ 00_{16} $ 00_{16}
8.7 octetstring値の符号化 Encoding of an octetstring value
8.7.1 octetstring値のエンコードは送信者の選択によりプリミティブまたは構築型です。
注 – オクテット文字列全体が利用可能になる前にオクテット文字列の一部を転送する必要がある場合は、構築型エンコードが使用されます。
8.7.2 プリミティブ エンコーディングには、データ値内のオクテットと同じ値の 0 個、1 個、または複数のコンテンツ オクテットが、データ値に出現する順序で含まれ、データ値のオクテットの最上位ビットがコンテンツ オクテットのオクテットの最上位ビットと揃えられます。
8.7.3 構築型エンコーディングのコンテンツ オクテットは、0、1、またはそれ以上のエンコーディングで構成されます。
注 – このようなエンコーディングにはそれぞれ、識別子、長さ、およびコンテンツ オクテットが含まれ、構築型の場合はコンテンツ終了(end-of-contetns)オクテットが含まれる場合があります。
8.7.3.1 このようにオクテット文字列値をエンコードするには、セグメント化します。各セグメントは、値の連続したオクテットの列で構成されます。セグメントの境界には意味はありません。
注 – セグメントのサイズは 0 の場合があり、つまり、オクテットが含まれない場合があります。
8.7.3.2 コンテンツ オクテット内の各エンコーディングは、このサブ条項の再帰的適用から生じるエンコーディングである、全体のオクテット文字列のセグメントを表すものとします。この再帰的適用では、各セグメントはオクテット文字列値であるかのように扱われます。
セグメントのエンコーディングは、そのオクテットが全体の値に現れる順序でコンテンツ オクテットに現れます。
注 1 – この再帰の結果として、コンテンツ オクテット内の各エンコーディングは、それ自体がプリミティブまたは構築型の可能性があります。ただし、このようなエンコーディングは通常、プリミティブになります。
注 2 – 特に、コンテンツ オクテット内のタグは常にユニバーサル クラス、番号 4 です。
8.8 null値の符号化 Encoding of a null value
8.8.1 null値のエンコードはプリミティブです。
8.8.2 内容にオクテットは含みません。
注 オクテットの長さが0
例
NULL型のNULL値は次のように符号化されます:
table:NULL
Null 長さ
$ 05_{16} $ 00_{16}
8.9 sequence値の符号化 Encoding of a sequence value
8.9.1 sequence値のエンコーディングは構築型です。
8.9.2 コンテンツ オクテットは、シーケンス タイプの ASN.1 定義にリストされている各タイプの 1 つのデータ値の完全なエンコードで構成されます。ただし、タイプがキーワード OPTIONAL またはキーワード DEFAULT で参照されている場合は除きます。
8.9.3 データ値のエンコーディングは、キーワード OPTIONAL またはキーワード DEFAULT で参照された型に対して存在する場合がありますが、必ずしも存在するとは限りません。存在する場合は、ASN.1 定義の型の出現に対応するエンコーディングのポイントに出現する必要があります。
例
次の型の場合:
SEQUENCE [name IA5String, ok BOOLEAN}
値:
{name "Smith", ok TRUE}
table:符号化:
Sequence Length Contents
30 0A
IA5String Length Contents
16 05 "Smith"
Boolean Length Contents
01 01 FF
8.10 sequence-of値の符号化 Encoding of sequence-of value
8.10.1 sequence-of値のエンコーディングは構築型です。
8.10.2 コンテンツオクテットは、ASN.1 定義にリストされているタイプのデータ値の 0 個、1 個、または複数の完全なエンコードで構成されます。
8.10.3 データ値のエンコードの順序は、エンコードされる値のシーケンス内のデータ値の順序と同じである必要があります。
8.11 set値の符号化 Encoding of a set value
8.11.1 set値のエンコーディングは構築型です。
8.11.2 コンテンツ オクテットは、セット タイプの ASN.1 定義にリストされている各タイプのデータ値の完全なエンコードで構成され、タイプがキーワード OPTIONAL またはキーワード DEFAULT で参照されていない限り、送信者が選択した順序で構成する必要があります。
8.11.3 データ値のエンコードは、キーワード OPTIONAL またはキーワード DEFAULT で参照された型に対して存在する場合がありますが、必ずしも存在するとは限りません。
注 – セット値内のデータ値の順序は重要ではなく、転送中に順序に制約はありません。
8.12 set-of値の符号化 Encoding of a set-of value
8.12.1 set-of値のエンコーディングは構築型です。
8.12.2 8.10.2のテキストが適用されます。
8.12.3 データ値の順序は、エンコードとその後のデコードによって保持される必要はありません。
8.13 choice値の符号化 Encoding of a choice value
choice(選択)値のエンコードは、選択されたタイプの値のエンコードと同じでなければなりません。
注 1 – エンコードは、選択されたタイプに応じてプリミティブまたは構築型になります。
注 2 – 識別子オクテットで使用されるタグは、choiceタイプの ASN.1 定義で指定されている、選択されたタイプのタグです。
8.14 prefixed type 値の符号化 Encoding of a value of a prefixed type
8.14.1 プレフィックス付きタイプが「EncodingPrefixedType」の場合、エンコーディングは「EncodingPrefixedType」の「Type」のエンコーディングになります。プレフィックス付きタイプが「TaggedType」の場合、次のサブ句が適用されます。
8.14.2 タグ付き値のエンコーディングは、8.14.3 および 8.14.4 で指定されている「TaggedType」表記法 (基本エンコーディングと呼ばれる) に表示されるタイプの対応するデータ値の完全なエンコーディングから派生されるものとします。
8.14.3 暗黙的な(implicit)タグ付け(Rec. ITU-T X.680 | ISO/IEC 8824-1、31.2.7 を参照)がタイプの定義で使用されなかった場合、エンコーディングが構築され、コンテンツ オクテットは完全な基本エンコーディングになります。
8.14.4 暗黙的な(implicit)タグ付けが型の定義で使用された場合、次のようになります:
a) 基本エンコーディングが構築型(constructed)の場合はエンコーディングは構築型(constructed)になり、それ以外の場合はプリミティブになります。
b) コンテンツ オクテットは、基本エンコーディングのコンテンツ オクテットと同じになります。
code:例
ASN.1 型定義 (明示的なタグ付け環境内):
Type1 ::= VisibleString
Type5 ::= 2 IMPLICIT Type 値:
"Jones"
の符号化:
table: Type1:
VisibleString Length Contents
1A 05 4A6F6E6573
table:Type2
[Application 3] Length Contents
43 05 4A6F6E6573
table:Type3
A2 07
[APPLICATION 3] Length Contents
43 05 4A6F6E6573
table:Type4
[Application 7] Length Contents
67 07
[APPLICATION 3] Length Contents
43 05 4A6F6E6573
8.15 open typeの符号化 Encoding of an open type
オープン タイプの値は、何らかの (他の) ASN.1 タイプの値でもあります。このような値のエンコードは、その他のタイプであると見なされる値に対してここで指定されている完全なエンコードでなければなりません。
8.16 instance-of 値の符号化 Encoding of an instance-of value
8.16.1 instance-of型のエンコーディングは、8.16.2 で指定された値を持つ次のシーケンス型の BER エンコーディングでなければなりません。
code:UNIVERSAL 8
[UNIVERSAL 8] IMPLICIT SEQUENCE {
type-id <DefinedObjectClass> $id,
value 0 EXPLICIT <DefinedObjectClass>.%Type }
ここで、「<DefinedObjectClass>」は、「InstanceOfType」表記法で使用される特定の「DefinedObjectClass」に置き換えられます。
注 – 値が単一の ASN.1 タイプの値であり、BER エンコーディングが使用されている場合、このタイプのエンコーディングは、抽象値を表すために構文の代替が使用されている外部タイプの対応する値のエンコーディングと同一です。
8.16.2 8.16.1 のシーケンス タイプのコンポーネントの値は、Rec. ITU-T X.681 | ISO/IEC 8824-2、C.7 の関連タイプの対応するコンポーネントの値と同じでなければなりません。
8.17 embedded-pdv型値の符号化 Encoding of a value of the embedded-pdv type
8.17.1
8.17.2
8.18 外部型の値の符号化 Encoding of a value of the external type
8.18.1
8.18.2
8.18.3
8.18.4
8.18.5
8.18.6
8.18.7
8.19 object 識別子の値の符号化 Encoding of an object identifier value
8.20 相対 object 識別子の値の符号化 Encoding of a relative object identifier value
8.21 OID国際化リソース識別子の値の符号化 Encoding of an OID internationalized resource identifier value
8.22 相対OID国際化リソース識別子の値の符号化 Encoding of a relative OID internationalized resource identifier value
8.23 Encoding for value of the restricted character string type
8.24 Encoding for values of the unrestricted character string type
8.24.1 制限なし文字列型の値のエンコードは、Rec. ITU-T X.680 | ISO/IEC 8824-1 の 44.5 で定義されている型の BER エンコードでなければなりません。
8.24.2
8.25 useful 型の値の符号化 Encoding for values of the useful types
以下の「有用な型」は、勧告 ITU-T X.680 | ISO/IEC 8824-1 の条項 46 ~ 48 で定義されている定義に置き換えられたかのようにエンコードされます:
一般化された時間 generalized time
世界時 universal time
オブジェクト記述子 object descriptor
8.26 TIME型とuseful time型の値の符号化 Encoding for values of the TIME type ans the useful time types
8.26.1 TIME型の値の符号化 Encoding for values of the TIME type
8.26.1.1 TIME型の符号化はプリミティブ型です。
8.26.1.2 内容オクテットは、最初と最後のQUOTATION MARK(34)文字を削除した後の値表記のUTF-8エンコードでなければなりません。
8.26.2 DATE型の値の符号化
8.26.2.1 DATE 型の符号化はプリミティブ型です。
8.26.2.2 内容オクテットは、最初と最後の引用符 (34) 文字とすべてのハイフンマイナス (45) 文字を削除した後の値表記の UTF-8 エンコードになります。
8.26.3 TIME-OF-DAY型の値の符号化
8.26.3.1 TIME-OF-DAY型の符号化はプリミティブ型です。
8.26.3.2 内容オクテットは、最初と最後の引用符 (34) 文字とすべてのコロン (58) 文字を削除した後の値表記の UTF-8 エンコードになります。
8.26.4 DATE-TIME型の値の符号化
8.26.4.1 DATE-TIME型の符号化はプリミティブ型です。
8.26.4.2 内容オクテットは、最初と最後の引用符 (34) 文字、すべてのハイフンマイナス (45) 文字、すべてのコロン (58) 文字、およびラテン大文字 T 文字を削除した後の値表記の UTF-8 エンコードになります。
8.26.5 DURATION型の値の符号化
8.26.5.1 DURATION型の符号化はプリミティブ型です。
8.26.5.2 内容オクテットは、最初と最後の引用符(34)文字とラテン大文字のP文字を削除した後の値表記のUTF-8エンコードでなければなりません。
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