?
? ????? PHP ??? ???? ??? ?? ??
import "encoding/asn1"
概述
索引
按照 ITU-T Rec X.690 的規(guī)定,asn1 包實(shí)現(xiàn)了對 DER 編碼的 ASN.1 數(shù)據(jù)結(jié)構(gòu)的解析。
另見“ ASN.1,BER 和 DER 子集的外行指南”,http://luca.ntop.org/Teaching/Appunti/asn1.html。
常量
變量
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 BitString
func (b BitString) At(i int) int
func (b BitString) RightAlign() []byte
type Enumerated
type Flag
type ObjectIdentifier
func (oi ObjectIdentifier) Equal(other ObjectIdentifier) bool
func (oi ObjectIdentifier) String() string
type RawContent
type RawValue
type StructuralError
func (e StructuralError) Error() string
type SyntaxError
func (e SyntaxError) Error() string
asn1.go common.go marshal.go
ASN.1 標(biāo)簽表示以下對象的類型。
const ( TagBoolean = 1 TagInteger = 2 TagBitString = 3 TagOctetString = 4 TagNull = 5 TagOID = 6 TagEnum = 10 TagUTF8String = 12 TagSequence = 16 TagSet = 17 TagPrintableString = 19 TagT61String = 20 TagIA5String = 22 TagUTCTime = 23 TagGeneralizedTime = 24 TagGeneralString = 27)
ASN.1 類類型表示標(biāo)簽的名稱空間。
const ( ClassUniversal = 0 ClassApplication = 1 ClassContextSpecific = 2 ClassPrivate = 3)
NullBytes 包含表示 DER 編碼的 ASN.1 NULL 類型的字節(jié)。
var NullBytes = []byte{TagNull, 0}
NullRawValue 是一個(gè) RawValue,其標(biāo)簽設(shè)置為 ASN.1 NULL 類型 tag(5)。
var NullRawValue = RawValue{Tag: TagNull}
func Marshal(val interface{}) ([]byte, error)
Marshal 返回 val 的 ASN.1 編碼。
除了由 Unmarshal 識別的結(jié)構(gòu)標(biāo)簽之外,還可以使用以下內(nèi)容:
ia5:導(dǎo)致字符串被封送為ASN.1,IA5String值 omitempty:導(dǎo)致跳過空切片 printable:導(dǎo)致字符串被封送為ASN.1,PrintableString值 utf8:導(dǎo)致字符串被封送為ASN.1,UTF8String值 utc:導(dǎo)致time.Time被封送為ASN.1,UTCTime值 generalized:導(dǎo)致time.Time被封送為ASN.1,GeneralizedTime值
func Unmarshal(b []byte, val interface{}) (rest []byte, err error)
Unmarshal 分析 DER 編碼的 ASN.1 數(shù)據(jù)結(jié)構(gòu) b 并使用反射包填充 val 指向的任意值。由于 Unmarshal 使用反射包,因此寫入的結(jié)構(gòu)必須使用大寫字段名稱。
ASN.1 INTEGER 可以寫入 int,int32,int64 或 *big.Int(來自 math/big package)。如果編碼值不適合 Go 類型,Unmarshal 會返回解析錯(cuò)誤。
一個(gè) ASN.1 BIT STRING 可以寫入一個(gè) BitString。
ASN.1 OCTET STRING 可以寫入 []byte。
一個(gè) ASN.1 OBJECT IDENTIFIER 可以寫入一個(gè) ObjectIdentifier。
一個(gè) ASN.1 枚舉可以被寫入枚舉。
一次 ASN.1 UTCTIME 或 GENERALIZEDTIME 可寫入一次。
ASN.1 PrintableString 或 IA5String 可寫入字符串。
任何上面的 ASN.1 值都可以寫入 interface{}。存儲在接口中的值具有相應(yīng)的 Go 類型。對于整數(shù),該類型是 int64。
如果可以將 x 寫入片段的元素類型,則可以將 x 或 x 的 ASN.1 序列寫入片段。
如果可以將序列中的每個(gè)元素寫入結(jié)構(gòu)中的相應(yīng)元素,則可以將 ASN.1 SEQUENCE 或 SET 寫入結(jié)構(gòu)。
結(jié)構(gòu)字段上的以下標(biāo)記對 Unmarshal 具有特殊意義:
application指定使用APPLICATION標(biāo)記default:x設(shè)置可選整數(shù)字段的默認(rèn)值(僅在可選的整數(shù)字段存在時(shí)使用) explicit指定附加的顯式標(biāo)記包裝隱式標(biāo)記 可選標(biāo)記該字段為ASN.1可選set會導(dǎo)致SET,而不是SEQUENCE類型 tag:x指定ASN.1標(biāo)記號; 暗示ASN.1特定背景
如果結(jié)構(gòu)的第一個(gè)字段的類型是 RawContent,那么該結(jié)構(gòu)的原始 ASN1 內(nèi)容將被存儲在其中。
如果一個(gè)切片元素的類型名稱以“SET”結(jié)尾,那么它將被視為設(shè)置了“set”標(biāo)簽。這可以用于無法給出 struct 標(biāo)記的嵌套切片。
其他 ASN.1 類型不受支持;如果遇到,Unmarshal 將返回一個(gè)分析錯(cuò)誤。
func UnmarshalWithParams(b []byte, val interface{}, params string) (rest []byte, err error)
UnmarshalWithParams 允許為頂層元素指定字段參數(shù)。參數(shù)的形式與字段標(biāo)簽相同。
當(dāng)您需要 ASN.1 BIT STRING 類型時(shí),BitString 是要使用的結(jié)構(gòu)。位串被填充到內(nèi)存中最近的字節(jié)并記錄有效位的數(shù)量。填充位將為零。
type BitString struct { Bytes []byte // 比特打包成字節(jié)。 BitLength int // 比特長度。}
func (b BitString) At(i int) int
返回給定索引處的位。如果索引超出范圍,則返回 false。
func (b BitString) RightAlign() []byte
RightAlign 返回填充位在開始位置的片。切片可以與 BitString 共享內(nèi)存。
Enumerated 被表示為一個(gè)純(plain) int。
type Enumerated int
Flag 接受任何數(shù)據(jù),如果存在則設(shè)置為 true。
type Flag bool
一個(gè) ObjectIdentifier 表示一個(gè) ASN.1 對象標(biāo)識符。
type ObjectIdentifier []int
func (oi ObjectIdentifier) Equal(other ObjectIdentifier) bool
平等報(bào)告 oi 和其他是否表示相同的標(biāo)識符。
func (oi ObjectIdentifier) String() string
RawContent 用于表示未解碼的 DER 數(shù)據(jù)需要為結(jié)構(gòu)體保留。要使用它,結(jié)構(gòu)的第一個(gè)字段必須有這種類型。任何其他字段都有這種類型的錯(cuò)誤。
type RawContent []byte
一個(gè) RawValue 表示一個(gè)未解碼的 ASN.1 對象。
type RawValue struct { Class, Tag int IsCompound bool Bytes []byte FullBytes []byte // 包括標(biāo)簽和長度}
StructuralError 表明 ASN.1 數(shù)據(jù)是有效的,但是接收它的 Go 類型不匹配。
type StructuralError struct { Msg string}
func (e StructuralError) Error() string
SyntaxError 表明 ASN.1 數(shù)據(jù)無效。
type SyntaxError struct { Msg string}
func (e SyntaxError) Error() string