Пакет 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 содержит байты, представляющие тип NULL ASN.1, закодированный в DER.
var NullBytes = []byte{TagNull, 0} NullRawValue — это RawValue с тегом, установленным на тег типа NULL ASN.1 (5).
var NullRawValue = RawValue{Tag: TagNull} Функция Marshal
func Marshal(val any) ([]byte, error)
Marshal возвращает кодирование val в формате ASN.1.
Помимо тегов структур, распознаваемых 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 utc: causes time.Time to be marshaled as ASN.1, UTCTime values generalized: causes time.Time to be marshaled as ASN.1, GeneralizedTime values
Функция MarshalWithParams 1.10
func MarshalWithParams(val any, params string) ([]byte, error)
MarshalWithParams позволяет задавать параметры полей для верхнего элемента. Формат параметров такой же, как у тегов полей.
Функция Unmarshal
func Unmarshal(b []byte, val any) (rest []byte, err error)
Unmarshal разбирает структуру данных ASN.1, закодированную в DER, b, и использует пакет 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 могут быть записаны в строку.
Любое из вышеперечисленных значений 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 с неявным тегом в поле строки 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
Если тип первого поля структуры равен RawContent, то необработанное содержимое ASN1 структуры будет храниться в нем.
Если имя типа среза заканчивается на «SET», оно обрабатывается так, как будто тег «set» установлен на нем. Это приводит к интерпретации типа как SET OF x, а не SEQUENCE OF x. Это можно использовать со вложенными срезами, где тег структуры не может быть задан.
Другие типы ASN.1 не поддерживаются; если он их обнаружит, Unmarshal возвращает ошибку разбора.
Функция UnmarshalWithParams
func UnmarshalWithParams(b []byte, val any, params string) (rest []byte, err error)
UnmarshalWithParams позволяет задавать параметры полей для верхнего элемента. Формат параметров такой же, как у тегов полей.
Тип 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 возвращает бит по заданному индексу. Если индекс находится вне диапазона, возвращается 0.
Функция (BitString) RightAlign
func (b BitString) RightAlign() []byte
RightAlign возвращает срез, где биты заполнения находятся в начале. Срез может использовать общую память со BitString.
Тип Enumerated
Enumerated представлен обычным целым числом.
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 один и тот же идентификатор.
Функция (ObjectIdentifier) String 1.3
func (oi ObjectIdentifier) String() string
Тип RawContent
RawContent используется для указания необходимости сохранения необработанных данных DER для структуры. Для его использования первое поле структуры должно иметь этот тип. Ошибка возникает, если любой другой из полей имеет этот тип.
type RawContent []byte
Тип RawValue
RawValue представляет собой необработанный объект ASN.1.
type RawValue struct {
Class, Tag int
IsCompound bool
Bytes []byte
FullBytes []byte // includes the tag and length
}
Тип StructuralError
StructuralError указывает на то, что данные ASN.1 допустимы, но тип Go, который их получает, не соответствует им.
type StructuralError struct {
Msg string
}
Функция (StructuralError) Error
func (e StructuralError) Error() string
Тип SyntaxError
SyntaxError указывает на то, что данные ASN.1 недействительны.
type SyntaxError struct {
Msg string
}
Функция (SyntaxError) Error
func (e SyntaxError) Error() string
© Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
http://golang.org/pkg/encoding/asn1/