package asn1

import “encoding/asn1”

asn1包实现了DER编码的ASN.1数据结构的解析,参见ITU-T Rec X.690。

其他细节参见”A Layman’s Guide to a Subset of ASN.1, BER, and DER”。

网址http://luca.ntop.org/Teaching/Appunti/asn1.html

Index 返回首页

type SyntaxError func (e SyntaxError) Error() string type StructuralError func (e StructuralError) Error() string type RawContent type RawValue type Flag type Enumerated type BitString func (b BitString) At(i int) int func (b BitString) RightAlign() []byte type ObjectIdentifier func (oi ObjectIdentifier) Equal(other ObjectIdentifier) bool func (oi ObjectIdentifier) String() string func Marshal(val interface{}) ([]byte, error) func Unmarshal(b []byte, val interface{}) (rest []byte, err error) func UnmarshalWithParams(b []byte, val interface{}, params string) (rest []byte, err error) type SyntaxError type SyntaxError struct { Msg string } SyntaxErrorLeixing表示ASN.1数据不合法。

func (SyntaxError) Error

func (e SyntaxError) Error() string type StructuralError type StructuralError struct { Msg string } StructuralError表示ASN.1数据合法但接收的Go类型不匹配。

func (StructuralError) Error

func (e StructuralError) Error() string type RawContent type RawContent []byte RawContent用于标记未解码的应被结构体保留的DER数据。如要使用它,结构体的第一个字段必须是本类型,其它字段不能是本类型。

type RawValue type RawValue struct { Class, Tag int IsCompound bool Bytes []byte FullBytes []byte // 包括标签和长度 } RawValue代表一个未解码的ASN.1对象。

type Flag type Flag bool Flag接收任何数据,如果数据存在就设自身为真。

type Enumerated type Enumerated int Enumerated表示一个明文整数。

type BitString type BitString struct { Bytes []byte // 字位流打包在字节流里 BitLength int // 字位流的长度 } BitString类型是用于表示ASN.1 BIT STRING类型的结构体。字位流补齐到最近的字节数保存在内存里并记录合法字位数,补齐的位可以为0个。

func (BitString) At

func (b BitString) At(i int) int At方法发挥index位置的字位,如果index出界则返回0。

func (BitString) RightAlign

func (b BitString) RightAlign() []byte RightAlign方法返回b表示的字位流的右对齐版本(即补位在开始部分)切片,该切片可能和b共享底层内存。

type ObjectIdentifier type ObjectIdentifier []int ObjectIdentifier类型用于表示ASN.1 OBJECT IDENTIFIER类型。

func (ObjectIdentifier) Equal

func (oi ObjectIdentifier) Equal(other ObjectIdentifier) bool 如果oi和other代表同一个标识符,Equal方法返回真。

func (ObjectIdentifier) String

func (oi ObjectIdentifier) String() string func Marshal func Marshal(val interface{}) ([]byte, error) Marshal函数返回val的ASN.1编码。

此外还提供了供Unmarshal函数识别的结构体标签,可用如下标签:

ia5: 使字符串序列化为ASN.1 IA5String类型 omitempty: 使空切片被跳过 printable: 使字符串序列化为ASN.1 PrintableString类型 utf8: 使字符串序列化为ASN.1 UTF8字符串 func Unmarshal func Unmarshal(b []byte, val interface{}) (rest []byte, err error) Unmarshal函数解析DER编码的ASN.1结构体数据并使用reflect包填写val指向的任意类型值。因为本函数使用了reflect包,结构体必须使用大写字母起始的字段名。

ASN.1 INTEGER 类型值可以写入int、int32、int64或*big.Int(math/big包)类型。类型不匹配会返回解析错误。

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类型,ASN.1整型对应int64。

如果类型x可以写入切片的成员类型,则类型x的ASN.1 SEQUENCE或SET类型可以写入该切片。

ASN.1 SEQUENCE或SET类型如果其每一个成员都可以写入某结构体的对应字段,则可以写入该结构体

对Unmarshal函数,下列字段标签有特殊含义:

application 指明使用了APPLICATION标签 default:x 设置一个可选整数字段的默认值 explicit 给一个隐式的标签设置一个额外的显式标签 optional 标记字段为ASN.1 OPTIONAL的 set 表示期望一个SET而不是SEQUENCE类型 tag:x 指定ASN.1标签码,隐含ASN.1 CONTEXT SPECIFIC 如果结构体的第一个字段的类型为RawContent,则会将原始ASN1结构体内容包存在该字段。

如果切片成员的类型名以”SET”结尾,则视为该字段有”set”标签。这是给不能使用标签的嵌套切片使用的。

其它ASN.1类型不支持,如果遭遇这些类型,Unmarshal返回解析错误。

func UnmarshalWithParams func UnmarshalWithParams(b []byte, val interface{}, params string) (rest []byte, err error) UnmarshalWithParams允许指定val顶层成员的字段参数,格式和字段标签相同