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(val interface{}) ([]byte, os.Error)

Marshalは、valをASN.1エンコードしたものを返します。

Unmarshal関数

func Unmarshal(b []byte, val interface{}) (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 ENUMERATEDは、Enumerated型に変換できます。
ASN.1 UTCTIMEまたは、GENERALIZEDTIMEは、*time.Time型に変換できます。
ASN.1 PrintableString またはIA5Stringはstring型に変換できます。

上に挙げたすべてのASN.1の型は、interface{}に変換できます。インタフェースに格納された値は Goの型のどれかと一致します。たとえば整数のときは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		オプションの整数フィールドにデフォルト値をセットします。

構造体の最初のフィールドがRawContentのときは、そこにASN.1の生データが格納されます。

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

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とメモリを共有します。

Enumerated型

Enumeratedは、単なるintを表します。

type Enumerated int

Flag型

Flagはどのデータでも受け付け、そのデータが存在するときにtrueがセットされます。

type Flag bool

ObjectIdentifier型

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

type ObjectIdentifier []int

(ObjectIdentifier) Equal関数

func (oi ObjectIdentifier) Equal(other ObjectIdentifier) bool

Equalは、oiとotherがともに同じ識別子であるときtrueを返します。

RawContent型

RawContentは、DERデータをデコードされない状態で保持しておきたいことを知らせるために使います。  これを使用するときは構造体の最初のフィールドがこの型でなければなりません。それ以外のどれかのフィールドがこの型であるときはエラーとなります。

type RawContent []byte

RawValue型

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

type RawValue struct {
    Class, Tag int
    IsCompound bool
    Bytes      []byte
    FullBytes  []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