ASN.1
JSONのようなデータ記述言語の古いもの、型の定義方法だけ決められていて書式は決まっていないので複数ある データ型的な入門はX.690のDER から入ればいいかも仕様は BER から書かれているので差分に悩みながら読み
X.680で必要な型などを把握、module を把握するには X.681? 必要なら読むが難易度は高め?
基本的にプログラム内で使用する構造体などの情報を共有するための共通仕様をまとめたもの
文字と文字コードのように、基本型と符号化方式(フォーマット)は別々に定義されていて、複数形式で変換も可能
外側から?
これは、バイナリ形式をBASE64などで変換したものなので、バイナリ形式に変換しよう
一部暗号や署名が付与されている場合がある
DER というフォーマットのASN.1ファイルに変換できる BER/CERはたぶんもうない DERは型情報を一部持っていないので、対応する型情報も用意する
さらにJSONやXMLのテキスト形式にすると読みやすくなる
ASN.1は構造を定義したりするものなので、DERでもテキスト系のJSONやXMLなどの形式でもASN.1のデータは扱える
書式とデータ
汎用型の他、 [2] などで書かれるタグ(応用:Application, コンテキスト特定:Context-specific, プライベート: private) がある
1988版 X.208 SERIES
CCITT X.208 ASN.1 → X.680
CCITT X.209 BER for ASN.1 → X.690
1994版 X.680 SERIES, X.690 SERIES
1997
2002
2008
2015
2021
基本の型
数値、文字列などの型情報、オブジェクト識別子のようなものなど、様々な型がある。
構造
構造はSEQUENCE/SEQUENCE OFがあり、JSONのObjectのような名前は(BER/CER/DERの場合)データに含まない(省略するのであらかじめ元のスキーマ定義側の型を知っている必要あり) SEQUENCE/SEQUENCE OF/SET/SET OFの他、CHOICE、EXPLICIT,IMPLICITなども考慮しておく必要があり
SEQUENCE は Map の構造で、並び順も決まっているもの
符号化の場合はX.681の形式で書かれている定義を見ながら変換する
SEQUENCE OF, SET OF は List やSet な構造
ListやMapの構造から符号化方式によってはMapのkeyの要素などを省略するのでListかMapか判別しにくい場合もある
代わりにタグ番号を振って区別する場合がある
CHOICEは Javaでは継承やenumで表しにくいのでBER/CER/DER符号化の場合は階層を省略する。その他の場合は名前もあるので要素が1つのMapなどで代用できるかもしれない。型で区別できない場合はOBJECTIDENTIFIER やtagがつけられる場合が多い。
IMPLICIT/EXPLICITはMapのkeyが利用できる場合は不要かもしれない
IMPLICITで失われる型情報もSyntaxな定義から復元する必要あり
識別子
OCTETSTRING でDERなどの構造を入れ子構造にすることもある (SEQUENCEの階層化とは違う)
ITU-T X.680 から 683, X.690 から X.692 ぐらい読めばいい?
JIS は旧規格のX5603が残っているが新しいX5605 (引用だけで中身なし?)は廃止されているらしい
最新版は ITU-T X.680 X.690
ITU-T X.680 ISO/IEC 8824-1 JIS X 5605-1 Abstract Syntax Notation One. Specification of basic notation 基本表記の仕様 ITU-T X.681 ISO/IEC 8824-2 JIS X 5605-2 Abstract Syntax Notation One: Information Object Specification. 情報オブジェクトの仕様 ITU-T X.682 ISO/IEC 8824-3 JIS X 5605-3 Abstract Syntax Notation One: Constraint Specification. 制約仕様 ITU-T X.683 ISO/IEC 8824-4 JIS X 5605-4 Abstract Syntax Notation One: Parameterization of ASN.1 Specifications. ASN.1のパラメータ化仕様 ISO/IEC 8824 JIS X 5603:1990 (ASN.1) 仕様 (古い)
書式 ASN.1 encoding rules
BER ITU-T X.690 ISO/IEC 8825-1 JIS X 5606-1 Basic Encoding Rules 基本符号化規則 CER ITU-T X.690 ISO/IEC 8825-1 JIS X 5606-1 Canonical Encoding Rules 標準符号化規則 DER ITU-T X.690 ISO/IEC 8825-1 JIS X 5606-1 Distinguished Encoding Rules 識別符号化規則 PER ITU-T X.691 ISO/IEC 8825-2 JIS X 5606-2 Specification of Packed Encoding Rules (PER) 圧縮符号化規則 ECN ITU-T X.692 ISO/IEC 8825-3 Specification of Encoding Control Notation (ECN) エンコーディング制御表記法 XER ITU-T X.693 ISO/IEC 8825-4 XML Encoding Rules (XER) ITU-T X.694 ISO/IEC 8825-5 Mapping W3C XML schema definitions into ASN.1 PER ITU-T X.695 ISO/IEC 8825-6 Registration and application of PER encoding instructions 圧縮符号化規則 OER ITU-T X.696 ISO/IEC 8825-7 Specification of Octet Encoding Rules (OER) JER ITU-T X.697 ISO/IEC 8825-8 Specification of JavaScript Object Notation Encoding Rules (JER) GSER RFC 3641 Generic String Encoding Rules (GSER) for ASN.1 Types GSER RFC 3642 Common Elements of Generic String Encoding Rules (GSER) Encodings
のような感じ
BER はゆるい符号化ルールで1つの値を複数の表現で記述することができる
CER/DERはBERに制限を設けて1つの値を1つの形式に絞れるようにしたもの。再構築しても変わりようがなくなるのでデジタル署名などが使いやすい。 BER/CER/DERをBASE64でくるんだものがPEMだったりする(改行は64文字くらい?) 最近はDERが使われるが、そうでもないBER/CERなPEMもある。
ITU-T X.501 ISO/IEC 9594 情報技術 - Open System Interconnection - The Directory Models RFC 5911 New ASN.1 Modules for Cryptographic Message Syntax (CMS) and S/MIME RFC 5912 New ASN.1 Modules for the Public Key Infrastructure Using X.509 (PKIX) → Update 6960, 9480 RFC 6960 X.509 Internet Public Key Infrastructure Online Certificate Status Protocol - OCSP
RFC 9480 Certificate Management Protocol (CMP) Updates
暗号などの分野で標準書式っぽくDERが使われる。