Top PageSecurity TopASN.1 Top

ASN.1 バイナリ符号化ルール (BER, CER, DER)

Basic Encoding Rule(BER)

※ BERについては、他にも日本語で書かれているサイトがあるので、ここでは詳しく説明はしないです。

asn2txt.zip
BER符号化されたデータを、テキストに整形するプログラムです。
MS-DOS(16bit)アプリケーションです。
構造の勉強の為に作っただけの物なので、使い勝手とかは考えていません。
ソースは、アセンブリ言語(MASM)で書かれています。

データは、以下の順番で書かれる。

データが固定長の場合
Identifier Contentの型を示す。
Length Contentのサイズを示す。
Content データの値や文字列。サイズはLengthに示されるバイト数。

データが可変長の場合
Identifier Dataの型を示す。
Length 0x80の1Byte
Content データの値や文字列。
End Of Content 0x00(=Identifier) 0x00(=Length)の2Byte

Identifierフィールドについて

Identifierフィールドの各ビットは、以下の構造を持つ。

76543210
Class P/C Tag number

Class

Class 内容
00 Universal
01 Application
10 Context-specific
11 Private

P/C

0(Primitive)の場合

Contentが、tag-numberに示される型のデータそのものである事を示す。

1(Constructed)の場合

Contentに、Identifier, Length, Content(, End of Content)の組み合わせが並び、 その構造がtag-numberに示される型のデータとなる。

Tag number

Tag numberが31であった場合は、次以降のバイトにTag numberが可変長で記される。

Lengthフィールドについて

0x00〜0x7Fの場合

Contentのサイズは、この値となる。

0x80の場合。

Contentのサイズは可変長となり、End Of Content(0x00 0x00)が、データの最後である事を示す。

0x81〜0xFFの場合。

Contentのサイズは、この後に続くバイトの数値となる。
この数値に、0x7FのAND(論理積)した数値が、次に続くサイズを示す数値データのバイト数を示す。
つまり、Lengthフィールドは、以下の構造となる。

0x80 + サイズを示す数値が、何Byteで表現されるか。 サイズ値

例えば、データサイズが1000[Byte](=0x03E8)であった場合は、
0x82 0x03 0xE8 の3Byteで符号化する事ができる。

Tag numberについて

classが00(Universal)の時に適用される。

Type TagP/CContentの符号化方法
End Of Content 0 P データ無し。どんなバイト列も含まない。
Boolean 1 P 0x00 : False / 0xFF : True
Integer 2 P 整数値がbig endianで格納される。
Bit String 3 P/C最初の1バイト目は最後のバイトにおいて切り捨てるビット数(0〜7)を示し、
その次のバイト(2Byte目)以降からビット列のデータが始まる。
Octet String 4 P/C バイト列がそのまま格納される。
Null 5 P データ無し。どんなバイト列も含まない。
Object Identifier6 P oid = { x . y . d[n] } において、1Byte目 = x × 40 + y
2Byte目以降 = d[n]は、可変長数値で表現される(Bit7=1の場合次の7bitのデータがある)。
Object Descriptor7 P 文字列で格納する。
External 8  C
Real 9 P 0.0の場合、Contentを無しにする。
それ以外の場合、baseが2か10かで処理が異なる。
詳細は、別途、X.690の原文を参照。
Enumerated 10 P 連想させる整数値とする。
EMBEDDED PDV 11  C
UTF8 String 12 P/CUTF8符号化された文字列
RELATIVE-OID 13 P 各バイトは可変長数値で表現される(Bit7=1の場合次の7bitのデータがある)。
Sequence 16  C"OPTINAL"か"DEFAULT"で定義されたタイプで無い限り、ASN.1で定義された通りにそれぞれのデータが並ぶ。
Sequence Of 16  C0若しくは1個以上の、ASN.1で定義された通りにそれぞれのデータが、SEQUENCE同様に並ぶ。
Set 17  C"OPTINAL"か"DEFAULT"で定義されたタイプで無い限り、ASN.1で定義されたデータが順不同で並ぶ。
Set Of 17  C0若しくは1個以上の、ASN.1で定義された通りにそれぞれのデータが、SET同様に並ぶ。
Numeric String 18 P/C文字列を格納する。
Printable String19 P/C文字列を格納する。
Teletex String 20 P/C文字列を格納する。
Videotex String 21 P/C文字列を格納する。
IA5String 22 P/C文字列を格納する。
UTC Time 23 P/CUTC時間を文字列で格納する。
Generalized Time24 P/C標準時間を文字列で格納する。
Graphic String 25 P/C文字列を格納する。
Visible String 26 P/C文字列を格納する。
General String 27 P/C文字列を格納する。
Universal String28 P/C
Character String29 P/C
BMP String 30 P/C
Choice - - Choiceの中で定義されているASN.1と同じ符号化をする。

Canonical Encoding Rules(CER)

BER符号のルールを、更に厳密にしたもの。
CER, DER共通の符号化ルールは、「CER, DER共通の符号化ルール」項を参照。

Lengthフィールド

IdentifierのP/Cフィールドが0(Primitive)の場合においては、 Lengthフィールドは、最小のバイト数になるように記述しなければならない。

ビット列、バイト列、文字列について

Bit String, Octet String, 文字列データにおいて、
データ長が1000を超えない場合は、IdentifierのP/Cフィールドを0(Primitive)として符号化しなければならない。
データ長が1000を超える場合は、IdentifierのP/Cフィールドを1(Constructed)として符号化しなければならない。
その際、データの断片は、最後のデータを除き、Lengthは1000でなければならない。

SETについて

要素はタグの正規化順(Universal, Application, Context-specific, Private の順、同じClassでは昇順)で符号化しなければならない。
その上、1つ以上の要素がTAG化されないChoiceTypeである時、 要素がコード化される順番を決定する目的の為、 ChoiceType若しくは、ネストされたTAG化されないChoiceType内で 最も小さいTAGと等しいTAGを持っているように、各TAG化されないChoiceTypeは順序つけされる。

Distinguished Encoding Rules(DER)

BER符号のルールを、更に厳密にしたもの。
CER, DER共通の符号化ルールは、「CER, DER共通の符号化ルール」項を参照。

Lengthフィールド

Lengthフィールドは、最小のバイト数になるように記述しなければならない。

ビット列、バイト列、文字列について

Bit String, Octet String, 文字列データにおいて、
いかなる場合も、IdentifierのP/Cフィールドを0(Primitive)として符号化しなければならない。

SETについて

要素はタグの正規化順(Universal, Application, Context-specific, Private の順、同じClassでは昇順)で符号化しなければならない。

CER, DER共通の符号化ルール

Boolen値

TRUEは、全てのビットを1にしなければならない。(つまり、0xFF)

使用しないビットについて

0にしなければならない。

浮動小数点値

別途、X.690の原文を参照。

GeneralString値

別途、X.690の原文を参照。

SET及びSQUENCEの初期値

何れの要素においても、値がDEFAULTと同値である場合は符号化しない。

SET OF

SET OF内の要素の値は、OCTET(バイト)列として比較した際に、昇順となるようにする。

Generalized Time

別途、X.690の原文を参照。

UTCTime

別途、X.690の原文を参照。

参考文献

  • ITU-T Recommendation X.690: Information technology - ASN.1 encoding rules:
    Specification of Basic Encoding Rules (BER),
    Canonical Encoding Rules (CER) and
    Distinguished Encoding Rules (DER)
    (※BER, CER, DER符号化について定める標準類)