Spec-Zone.ru › Go

Пакет asn1

  • import "encoding/asn1"
  • Обзор
  • Указатель

Обзор

Пакет asn1 реализует разбор структур данных ASN.1 в кодировке DER, как определено в рекомендации ITU-T X.690.

См. также «Путеводитель для непосвящённых по подмножеству ASN.1, BER и DER» (http://luca.ntop.org/Teaching/Appunti/asn1.html).

Указатель

  • Константы
  • Переменные
  • func Marshal(val any) ([]byte, error)
  • func MarshalWithParams(val any, params string) ([]byte, error)
  • func Unmarshal(b []byte, val any) (rest []byte, err error)
  • func UnmarshalWithParams(b []byte, val any, 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 обозначают тип следующего объекта.

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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API