Как [0] и [3] работают в ASN1?

Я декодирую ASN1 (как используется в X. 509 для сертификатов HTTPS). Я делаю довольно хорошо, но есть вещь, которую я просто не могу найти и понять документацию.

в парсере JS ASN1 (например,http://lapo.it/asn1js/) вы видите [0] и [3] под элементом последовательности, первый выглядит так в data: A0 03 02 01 02. Я хочу знать, что это значит и как расшифровать его.

другой пример http://www.jensign.com/JavaScience/GetTBSCert/index.html, есть [0] сразу после первых двух элементов последовательности.

чего я не понимаю, так это как A0 вписывается в схему, где первые 2 бита байта тега являются классом, следующий примитивный/построенный бит и оставшиеся 5 должны быть типом тега. A0-10100000, что означает, что значение типа тега будет равно нулю.

3 ответов


ASN.1 BER и DER используют ASN.1 теги для однозначной идентификации определенных компонентов в закодированном потоке. Существует 4 класса ASN.1 теги: универсальный, APPICATION, частный и контекстно-специфичный. [0]-это контекстно-специфичный тег, так как перед ним нет тега класса keword. UNIVERSAL зарезервирован для встроенных типов в ASN.1. Чаще всего вы видите контекстные теги для устранения потенциальной неоднозначности в последовательности, содержащей необязательные элементы. Если вы знаете, что получаете два элементы, которые не являются необязательными, один за другим, вы знаете, что есть что, даже если их теги одинаковы. Однако, если первый является необязательным, два должны иметь разные теги, или вы не сможете сказать, какой из них вы получили, если только один присутствовал в кодировке.

чаще всего сегодня, ASN.1 спецификация используйте "автоматические теги", чтобы вам не приходилось беспокоиться о такого рода неоднозначности в сообщениях, поскольку компоненты последовательности, набора и выбора будут автоматически получать контекстные теги, начиная с [0], [1], [2], etc. для каждого компонента.

вы можете найти более подробную информацию о ASN.1 теги наhttp://www.oss.com/asn1/resources/books-whitepapers-pubs/asn1-books.html где доступны две бесплатные загружаемые книги.

еще один отличный ресурс http://asn1-playground.oss.com где можно попробовать вариации АСН.1 спецификации с различными тегами в онлайн-компиляторе и шифратор/дешифратор. Там вы можете увидеть влияние изменений тегов на кодировки.


похоже, вам нужно введение в ASN.1 мечения. К этому можно подойти с двух сторон. X. 690 определяет правила кодирования BER/CER/DER. Таким образом, он отвечает на вопрос о том, как кодируются теги. Х. 680 определяет АСН.1 сам. Таким образом, он определяет синтаксис и правила для тегов. Обе спецификации можно найти на вебсайте МСЭ-т. Я дам вам краткий обзор.

Теги используются в BER/DER / CER для идентификации типов. Они особенно полезны для различения компоненты последовательности и альтернативы выбора.

тег объединяет класс тегов и номер тега. Классы тегов являются универсальными, прикладными, частными и контекстно-специфичными. Универсальный класс в основном используется для встроенных типов. Приложение обычно используется для пользовательских типов. Контекстно-специфичный обычно используется для компонентов внутри построенных типов (последовательность, выбор, последовательность). Синтаксически, когда теги указаны в ASN.Модуль 1, они записываются в скобках: [ tag_class tag_number ]; для контекста tag_class опущен. Таким образом, [приложение 10] или [0].

в то время как каждый ASN.1 тип имеет связанный тег, синтаксически, есть также "TaggedType", который используется ASN.1 Автор, чтобы указать тег для кодирования типа. В принципе, TaggedType ставит префикс тега перед типом. Например:

MyType ::= SEQUENCE {
  field_with_tagged_type [0] UTF8String
}

тег в TaggedType является явным или неявным. Если явный, это означает, что я хочу, чтобы исходный тег был явно закодирован. Если неявно, это означает, что я счастлив иметь только тег, который я указал, быть закодированным. В явном случае кодировка BER приводит к вложенному TLV (tag-length-value): внешний тег ([0] в приведенном выше примере), длина, а затем другой TLV в качестве значения. В Примере этот внутренний TLV будет иметь тег [UNIVERSAL 12] для UTF8String.

является ли тег явным или неявным, зависит от того, как вы пишете тег и среда тегов. Например:

MyType2 ::= SEQUENCE {
  field_with_explicit_tag [0] EXPLICIT UTF8String OPTIONAL,
  field_with_implicit_tag [1] IMPLICIT UTF8String OPTIONAL,
  field_with_tag [2] UTF8String OPTIONAL
}

Если вы не указываете ни неявный, ни явный, есть некоторые правила, которые определяют, является ли тег явным или неявным (см. X. 680 31). Эти правила учитывают среду тегов, определенную для ASN.Модуль 1. АСН.1 модуль может указывать среду тегов как неявные теги, явные теги или автоматические теги. грубо говоря, если вы не указываете неявный или явный для тега, тег будет явным, если среда тегов явная и неявная, если среда тегов неявная или автоматическая. Автоматическая среда тегов в основном совпадает с неявной средой тегов, за исключением того, что уникальные теги автоматически назначаются членам типов последовательности и выбора.

обратите внимание, что в приведенном выше примере три компонента MyType2 являются необязательными. В BER/CER / DER декодер будет знать, какой компонент присутствует на основе кодированного тега (что, очевидно, лучше быть уникальным).


[0] является контекстно-специфичным тегированным типом, что означает, что, чтобы выяснить, какое значение он дает полям (если установлен флаг "построенный") или значение данных (если флаг "построенный" не установлен), он обертывается; вы должны знать, в каком контексте он появляется.

кроме того, вам также нужно знать, какой объект отправитель и получатель обмениваются в потоке DER, т. е. АСН.1 модуль".

предположим, они обмениваются запросом подписи сертификата и [0] появляется как 4-е поле внутри последовательности внутри корневой последовательности:

SEQUENCE
    SEQUENCE
        INTEGER 0
        SEQUENCE { ... }
        SEQUENCE { ... }
        [0] { ... }
    }
}

затем в соответствии с RFC2968, который определяет содержимое DER для запроса подписи сертификата, приложение A, которое определяет ASN.1 модуль, значение этого конкретного поля определяется как "атрибуты" и "должно иметь построенный набор флагов":

    attributes    [0] Attributes{{ CRIAttributes }}

вы также можете пойти в другую сторону и увидеть, что "атрибуты" должны быть 4-м полем внутри первой последовательности внутри корня последовательность и метки как [0], глядя на определение корневой последовательности (раздел 4: "Тип верхнего уровня CertificationRequest"), находя размещение CertificationRequestInfo внутри этого и находя, где элемент "атрибуты" находится внутри CertificationRequestInfo, и, наконец, видя, как он помечен.

ASN.Я так прост, я не понимаю, как больше людей не понимают этого.. "Это просто формат TLV..";-)