都立工業高等専門学校(現、東京都立産業技術高等専門学校)を卒業、
機械工学が専攻だった癖に論理回路やオーディオ関係の技術者らしい。
趣味として、音楽関係のフリーソフト開発や、DTM・チップチューン活動をしたり、
オーケストラや吹奏楽団でオーボエを吹いてる人。
上のアドレスの『@』と『nifty』の間に『spa.』を追加して下さい。
画像で記載されているアドレスでも届きますが、スパム防止のフィルターを多数導入しています。
本ホームページはリンクフリーです。
リンクは、トップページ
"http://shaw.la.coocan.jp/"
にお願いいたします。
Top Page\ Security Top\ ASN.1 Top\
※ 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フィールドの各ビットは、以下の構造を持つ。
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|
Class | P/C | Tag number |
Class | 内容 |
---|---|
00 | Universal |
01 | Application |
10 | Context-specific |
11 | Private |
Contentが、tag-numberに示される型のデータそのものである事を示す。
Contentに、Identifier, Length, Content(, End of Content)の組み合わせが並び、
その構造がtag-numberに示される型のデータとなる。
Tag numberが31であった場合は、次以降のバイトにTag numberが可変長で記される。
Contentのサイズは、この値となる。
Contentのサイズは可変長となり、End Of Content(0x00 0x00)が、データの最後である事を示す。
Contentのサイズは、この後に続くバイトの数値となる。
この数値に、0x7FのAND(論理積)した数値が、次に続くサイズを示す数値データのバイト数を示す。
つまり、Lengthフィールドは、以下の構造となる。
0x80 + サイズを示す数値が、何Byteで表現されるか。 | サイズ値 |
例えば、データサイズが1000[Byte](=0x03E8)であった場合は、
0x82 0x03 0xE8 の3Byteで符号化する事ができる。
classが00(Universal)の時に適用される。
Type | Tag | P/C | Contentの符号化方法 |
---|---|---|---|
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 Identifier | 6 | P | oid = { x . y . d[n] } において、1Byte目 = x × 40 + y 2Byte目以降 = d[n]は、可変長数値で表現される(Bit7=1の場合次の7bitのデータがある)。 |
Object Descriptor | 7 | 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/C | UTF8符号化された文字列 |
RELATIVE-OID | 13 | P | 各バイトは可変長数値で表現される(Bit7=1の場合次の7bitのデータがある)。 |
Sequence | 16 | C | "OPTINAL"か"DEFAULT"で定義されたタイプで無い限り、ASN.1で定義された通りにそれぞれのデータが並ぶ。 |
Sequence Of | 16 | C | 0若しくは1個以上の、ASN.1で定義された通りにそれぞれのデータが、SEQUENCE同様に並ぶ。 |
Set | 17 | C | "OPTINAL"か"DEFAULT"で定義されたタイプで無い限り、ASN.1で定義されたデータが順不同で並ぶ。 |
Set Of | 17 | C | 0若しくは1個以上の、ASN.1で定義された通りにそれぞれのデータが、SET同様に並ぶ。 |
Numeric String | 18 | P/C | 文字列を格納する。 |
Printable String | 19 | P/C | 文字列を格納する。 |
Teletex String | 20 | P/C | 文字列を格納する。 |
Videotex String | 21 | P/C | 文字列を格納する。 |
IA5String | 22 | P/C | 文字列を格納する。 |
UTC Time | 23 | P/C | UTC時間を文字列で格納する。 |
Generalized Time | 24 | P/C | 標準時間を文字列で格納する。 |
Graphic String | 25 | P/C | 文字列を格納する。 |
Visible String | 26 | P/C | 文字列を格納する。 |
General String | 27 | P/C | 文字列を格納する。 |
Universal String | 28 | P/C | |
Character String | 29 | P/C | |
BMP String | 30 | P/C | |
Choice | - | - | Choiceの中で定義されているASN.1と同じ符号化をする。 |
BER符号のルールを、更に厳密にしたもの。
CER, DER共通の符号化ルールは、「CER, DER共通の符号化ルール」項を参照。
IdentifierのP/Cフィールドが0(Primitive)の場合においては、
Lengthフィールドは、最小のバイト数になるように記述しなければならない。
Bit String, Octet String, 文字列データにおいて、
データ長が1000を超えない場合は、IdentifierのP/Cフィールドを0(Primitive)として符号化しなければならない。
データ長が1000を超える場合は、IdentifierのP/Cフィールドを1(Constructed)として符号化しなければならない。
その際、データの断片は、最後のデータを除き、Lengthは1000でなければならない。
要素はタグの正規化順(Universal, Application, Context-specific, Private の順、同じClassでは昇順)で符号化しなければならない。
その上、1つ以上の要素がTAG化されないChoiceTypeである時、
要素がコード化される順番を決定する目的の為、
ChoiceType若しくは、ネストされたTAG化されないChoiceType内で
最も小さいTAGと等しいTAGを持っているように、各TAG化されないChoiceTypeは順序つけされる。
BER符号のルールを、更に厳密にしたもの。
CER, DER共通の符号化ルールは、「CER, DER共通の符号化ルール」項を参照。
Lengthフィールドは、最小のバイト数になるように記述しなければならない。
Bit String, Octet String, 文字列データにおいて、
いかなる場合も、IdentifierのP/Cフィールドを0(Primitive)として符号化しなければならない。
要素はタグの正規化順(Universal, Application, Context-specific, Private の順、同じClassでは昇順)で符号化しなければならない。
TRUEは、全てのビットを1にしなければならない。(つまり、0xFF)
0にしなければならない。
別途、X.690の原文を参照。
別途、X.690の原文を参照。
何れの要素においても、値がDEFAULTと同値である場合は符号化しない。
SET OF内の要素の値は、OCTET(バイト)列として比較した際に、昇順となるようにする。
別途、X.690の原文を参照。
別途、X.690の原文を参照。