Пакет asn1
Обзор
Пакет asn1 реализует разбор структур данных ASN.1 в кодировке DER, как определено в рекомендации ITU-T X.690.
См. также «Путеводитель для непосвящённых по подмножеству ASN.1, BER и DER» (http://luca.ntop.org/Teaching/Appunti/asn1.html).
Указатель
Файлы пакета
asn1.go common.go marshal.go
Константы
Теги ASN.1 обозначают тип следующего объекта.
const (
TagBoolean = 1
TagInteger = 2
TagBitString = 3
TagOctetString = 4
TagNull = 5
TagOID = 6
TagEnum = 10
TagUTF8String = 12
TagSequence = 16
TagSet = 17
TagNumericString = 18
TagPrintableString = 19
TagT61String = 20
TagIA5String = 22
TagUTCTime = 23
TagGeneralizedTime = 24
TagGeneralString = 27
TagBMPString = 30
) Типы классов ASN.1 обозначают пространство имён тега.
const (
ClassUniversal = 0
ClassApplication = 1
ClassContextSpecific = 2
ClassPrivate = 3
) Переменные
NullBytes содержит байты, представляющие тип ASN.1 NULL в кодировке DER.
var NullBytes = []byte{TagNull, 0} NullRawValue — это RawValue со значением Tag, установленным в тег типа ASN.1 NULL (5).
var NullRawValue = RawValue{Tag: TagNull} func Marshal
func Marshal(val any) ([]byte, error)
Marshal возвращает кодировку ASN.1 значения val.
Помимо тегов структур, распознаваемых Unmarshal, можно использовать следующие:
ia5: causes strings to be marshaled as ASN.1, IA5String values omitempty: causes empty slices to be skipped printable: causes strings to be marshaled as ASN.1, PrintableString values utf8: causes strings to be marshaled as ASN.1, UTF8String values numeric: causes strings to be marshaled as ASN.1, NumericString values utc: causes time.Time to be marshaled as ASN.1, UTCTime values generalized: causes time.Time to be marshaled as ASN.1, GeneralizedTime values
func MarshalWithParams 1.10
func MarshalWithParams(val any, params string) ([]byte, error)
MarshalWithParams позволяет указать параметры поля для элемента верхнего уровня. Формат параметров такой же, как у тегов полей.
func Unmarshal
func Unmarshal(b []byte, val any) (rest []byte, err error)
Unmarshal разбирает структуру данных ASN.1 b в кодировке DER и использует пакет reflect для заполнения произвольного значения, на которое указывает val. Поскольку Unmarshal использует пакет reflect, поля структур, в которые выполняется запись, должны начинаться с заглавной буквы. Если val равен nil или не является указателем, Unmarshal возвращает ошибку.
После разбора b все оставшиеся байты, не использованные для заполнения val, возвращаются в rest. При разборе SEQUENCE в структуру завершающие элементы SEQUENCE, которым не соответствуют поля в val, не включаются в rest, поскольку они считаются допустимыми элементами SEQUENCE, а не завершающими данными.
Значение ASN.1 INTEGER можно записать в int, int32, int64 или *big.Int. Если закодированное значение не помещается в тип Go, Unmarshal возвращает ошибку разбора.
Значение 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 или NumericString можно записать в string.
Любое из перечисленных выше значений ASN.1 можно записать в interface{}. Значение, сохранённое в интерфейсе, будет иметь соответствующий тип Go. Для целых чисел это тип int64.
Значение ASN.1 SEQUENCE OF x или SET OF x можно записать в срез, если значение x можно записать в тип элемента среза.
Значение ASN.1 SEQUENCE или SET можно записать в структуру, если каждый из элементов последовательности можно записать в соответствующий элемент структуры.
Следующие теги полей структуры имеют специальное значение для Unmarshal:
application specifies that an APPLICATION tag is used private specifies that a PRIVATE tag is used default:x sets the default value for optional integer fields (only used if optional is also present) explicit specifies that an additional, explicit tag wraps the implicit one optional marks the field as ASN.1 OPTIONAL set causes a SET, rather than a SEQUENCE type to be expected tag:x specifies the ASN.1 tag number; implies ASN.1 CONTEXT SPECIFIC
При декодировании значения ASN.1 с неявным тегом в поле string Unmarshal по умолчанию использует PrintableString, которая не поддерживает такие символы, как '@' и '&'. Чтобы принудительно использовать другие кодировки, задайте следующие теги:
ia5 causes strings to be unmarshaled as ASN.1 IA5String values numeric causes strings to be unmarshaled as ASN.1 NumericString values utf8 causes strings to be unmarshaled as ASN.1 UTF8String values
При декодировании значения ASN.1 с неявным тегом в поле time.Time Unmarshal по умолчанию использует UTCTime, которая не поддерживает часовые пояса и доли секунды. Чтобы принудительно использовать GeneralizedTime, задайте следующий тег:
generalized causes time.Times to be unmarshaled as ASN.1 GeneralizedTime values
Если первое поле структуры имеет тип RawContent, в нём будут сохранены необработанные данные ASN.1 этой структуры.
Если имя типа среза заканчивается на "SET", он обрабатывается так, как если бы для него был задан тег "set". В результате тип интерпретируется как SET OF x, а не как SEQUENCE OF x. Это можно использовать с вложенными срезами, которым нельзя задать тег структуры.
Другие типы ASN.1 не поддерживаются; при их обнаружении Unmarshal возвращает ошибку разбора.
func UnmarshalWithParams
func UnmarshalWithParams(b []byte, val any, params string) (rest []byte, err error)
UnmarshalWithParams позволяет указать параметры поля для элемента верхнего уровня. Формат параметров такой же, как у тегов полей.
type BitString
BitString — это структура для представления значения типа ASN.1 BIT STRING. Строка битов дополняется в памяти до ближайшего целого числа байтов, а количество допустимых битов сохраняется отдельно. Биты дополнения равны нулю.
type BitString struct {
Bytes []byte // bits packed into bytes.
BitLength int // length in bits.
}
func (BitString) At
func (b BitString) At(i int) int
At возвращает бит с указанным индексом. Если индекс выходит за пределы диапазона, возвращается 0.
func (BitString) RightAlign
func (b BitString) RightAlign() []byte
RightAlign возвращает срез, в котором биты дополнения находятся в начале. Срез может использовать общую память с BitString.
type Enumerated
Enumerated представляется обычным значением int.
type Enumerated int
type Flag
Flag принимает любые данные и устанавливается в true, если присутствует.
type Flag bool
type ObjectIdentifier
ObjectIdentifier представляет ASN.1 OBJECT IDENTIFIER.
type ObjectIdentifier []int
func (ObjectIdentifier) Equal
func (oi ObjectIdentifier) Equal(other ObjectIdentifier) bool
Equal сообщает, представляют ли oi и other один и тот же идентификатор.
func (ObjectIdentifier) String 1.3
func (oi ObjectIdentifier) String() string
type RawContent
RawContent используется, чтобы указать, что для структуры необходимо сохранить не декодированные данные DER. Для этого первое поле структуры должно иметь этот тип. Использовать этот тип для любого другого поля нельзя.
type RawContent []byte
type RawValue
RawValue представляет не декодированный объект ASN.1.
type RawValue struct {
Class, Tag int
IsCompound bool
Bytes []byte
FullBytes []byte // includes the tag and length
}
type StructuralError
StructuralError указывает на то, что данные ASN.1 корректны, но тип Go, в который они записываются, не соответствует им.
type StructuralError struct {
Msg string
}
func (StructuralError) Error
func (e StructuralError) Error() string
type SyntaxError
SyntaxError указывает на то, что данные ASN.1 некорректны.
type SyntaxError struct {
Msg string
}
func (SyntaxError) Error
func (e SyntaxError) Error() string
© Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
http://golang.org/pkg/encoding/asn1/