import "asn1"

ITU-T勧告X.690で定義されている、DERエンコードされたASN.1データ構造の解析を実装しています。

こちらも参照ください。

“A Layman’s Guide to a Subset of ASN.1, BER, and DER,” http://luca.ntop.org/Teaching/Appunti/asn1.html

パッケージファイル

asn1.go common.go marshal.go

Marshal関数

func Marshal(out io.Writer, val interface{}) os.Error

MarshalはASN.1構造をシリアライズし結果を書き出します。エラーが発生したときは出力は行われません。

Unmarshal関数

func Unmarshal(val interface{}, b []byte) (rest []byte, err os.Error)

UnmarshalはパラメータbのDERエンコードされたASN.1データ構造を解析し、val内の任意の型にreflectパッケージを利用してセットします。reflectパッケージを使用しているため変換先が構造体のときはフィールド名が大文字である必要があります。

ASN.1 INTEGER はint型またはint64型に変換できます。ASN.1の値がGoの型と一致しなければ解析エラーを返します。
ASN.1 BIT STRINGはBitString型に変換できます。
ASN.1 OCTET STRINGは[]byte型に変換できます。
ASN.1 OBJECT IDENTIFIERはObjectIdentifier型に変換できます。
ASN.1 PrintableString またはIA5Stringはstring型に変換できます。
上に挙げたすべてのASN.1の型は、valで指定した値と型が適応すれば変換が行われます。整数なら型はint64です。

ASN.1 SEQUENCE OF xまたはSET OF xはxがスライスの要素の型と一致するならスライス型に変換できます。
ASN.1 SEQUENCE またはSETはシーケンスの各要素が構造体の要素に変換できるなら、構造体に変換できます。

下に記述する構造体フィールドのタグは、Unmarshalにとって特別な意味を持ちます。

optional		ASN.1 OPTIONALとしてマークします。
[explicit] tag:x	ASN.1のタグ番号
default:x		オプションの整数フィールドにデフォルト値をセットします。

これ以外のASN.1の型はサポートしていません。サポートしていない型が現れるとparse errorを返します。

BitString型

BitStringはASN.1 BIT STRINGを扱う構造体です。
ビット列のパッドは除去され、ビット長は保持されます。

type BitString struct {
    Bytes     []byte; // bits packed into bytes.
    BitLength int;    // length in bits.
}

(BitString) At関数

func (b BitString) At(i int) int

Atはパラメータiで指定したインデックスのビット値を返します。 インデックスがビット列の範囲を超えたときは0を返します。

(BitString) RightAlign関数

func (b BitString) RightAlign() []byte

RightAlignはパディングビットから始まるスライスを返します。
このスライスはBitStringとメモリを共有します。

ObjectIdentifier型

ObjectIdentifierはASN.1 OBJECT IDENTIFIERを扱います。

type ObjectIdentifier []int

RawValue型

RawValueはデコードされていないASN.1 オブジェクトを扱います。

type RawValue struct {
    Class, Tag int;
    IsCompound bool;
    Bytes      []byte;
}

StructuralError型

StructuralErrorはASN.1データは正しいが、それを受け取るのに適したGo言語側の型がみつからないことを示します。

type StructuralError struct {
    Msg string;
}

(StructuralError) String関数

func (e StructuralError) String() string

SyntaxError型

SyntaxErrorはASN.1データが正しくないことを示します。

type SyntaxError struct {
    Msg string;
}

(SyntaxError) String関数

func (e SyntaxError) String() string