Basic Encoding Rules (BER) とDistinguished Encoding Rules (DER)

BM ASN.1は、BERエンコードとDERエンコードに対応しています。BERでは、ある型の値のエンコード方法としていくつかの選択肢が用意されている場合がありますが、DERではこれらの表記の'ゆれ'が許容されません。そのため、DERでエンコードされた結果のbyte列同士を比較して一致している場合、デコードした結果も一致している(また、異なっている場合はデコードした結果も異なっている)と判断することができます。DERはBERにいくつかの制限を加えたサブセットなので、DERエンコードされた結果のbyte列もBERデコーダーでデコードすることができます。BERおよびDERの詳細は、ITU-T Rec.X690に規定されています。

DERの制限

DERは、BERに以下の制限を加えます。これらの制限は、X690のclause 10 'DISTINGUISHED ENCODING RULES'および11 'RESTRICTIONS ON EMPLOYED BY BOTH CER AND DER'に規定されています。

Lengthオクテット

Lengthオクテットは、definite form(コンテンツの長さを明示する形式)のみを使用する。indefinite form(コンテンツの長さを明示せず、終端記号でコンテンツを終端する形式)は使用しない。

String型

BIT STRING、OCTET STRING、文字列型のエンコードで、constructed form(文字列を複数の要素に分割する形式)を使用しない。

SET型の要素

SET型の各要素は、タグの順序に従ってエンコードする。タグの順序は、X.680 subclause 8.6の規定(UNIVERSAL→APPLICATION→CONTEXT SPECIFIC→PRIVATE、クラスが同じ場合はタグ番号の昇順)に従う。

BOOLEAN値

BOOLEANの値がTRUEの場合、エンコード結果の全てbitに1を設定する(0xFFを設定する)。

BIT STRING値

全ての未使用bitには0を設定する。

BIT STRINGがNamedBit(名前付ビット)の定義を持つ場合、設定値内の最も後方にあるtrue(1)ビット以降のfalse(0)ビットはエンコード前に全て削除する。

REAL値

REAL値の基数が2の場合、バイナリエンコーディングを使用する。バイナリエンコーディングの基数は2で、仮数が0または奇数となるような仮数と指数を選択する。

REAL値の基数が10の場合、ISO6093NR3形式でエンコードする。エンコード結果はスペースを含まず、負値であればマイナス('-')から、正値なら数字から開始する。仮数部の先頭または末尾が'0'であってはならない。仮数部の直後に小数点('.')が続き、その直後に'E'が続く。指数が0の場合は"+0"と表記し、それ以外の場合に先頭が'0'であってはならず、'+'を含んではならない。

GeneralString

The encoding of values of the GeneralString type (and its subtypes) shall generate escape sequences to designate and invoke a new register entry only when the register entry for the character is different from that currently designated as G0, C0, or C1. All designations and invocations shall be into the G0 set or the C0 set.

※ BM ASN.1のDerEncoderでは未対応

デフォルト値のあるSEQUENCE型またはSET型の要素

SEQUENCE型またはSET型の要素にデフォルト値があり、設定値がデフォルト値に等しい場合は、その要素をエンコード結果に含めない。

SET OF型の要素

SET OF型の各要素は、各要素のエンコード結果をOCTET STRING値として比較した昇順でエンコードする。

GeneralizedTime

エンコード結果は'Z'で終端する(時刻はGMTに換算する)。秒に小数点以下の値がある場合、末尾の'0'は全て省略する。小数点以下の秒が0なら、小数点も省略する。小数点にはピリオド('.')を使用する。