Кодировка DER — как преобразовать неявный тег в явный тег

У меня есть сертификат X.509, содержащий набор данных со следующим тегом IMPLICIT [0]:

A0 81 C6 (value)...

И у меня есть эта выдержка из стандартного документа:

Тег IMPLICIT [0] не используется для кодирования DER, вместо этого используется тег EXPLICIT SET OF. То есть кодирование DER тега EXPLICIT SET OF, а не тега IMPLICIT [0], ДОЛЖНО быть включено вместе с октетами длины и содержимого значения.

Я много искал, но я не могу точно понять, к чему призывает стандарт. Я ищу немного разъяснений.

РЕДАКТИРОВАТЬ: Вот стандарт, которому я следую: http://tools.ietf.org/html/rfc3852< /а>

Я пытаюсь проверить подпись X.509, и для этого мне нужно рассчитать дайджест сообщения. Этот сертификат включает необязательные атрибуты SignedAttributes в типе SignerInfo. Я хешировал подписанный контент и проверил правильность дайджеста сообщения в SignedAttributes. Стандарт говорит, что если SignedAttributes присутствует, он должен быть хеширован и зашифрован для создания подписи сертификата. В стандарте также говорится, что тег SignedAttributes должен быть изменен, как обсуждалось в исходном вопросе.

Вот грамматика Asn.1 для SignerInfo:

SignerInfo ::= SEQUENCE {
        version CMSVersion,
        sid SignerIdentifier,
        digestAlgorithm DigestAlgorithmIdentifier,
        signedAttrs [0] IMPLICIT SignedAttributes OPTIONAL,
        signatureAlgorithm SignatureAlgorithmIdentifier,
        signature SignatureValue,
        unsignedAttrs [1] IMPLICIT UnsignedAttributes OPTIONAL }

SignerIdentifier ::= CHOICE {
        issuerAndSerialNumber IssuerAndSerialNumber,
        subjectKeyIdentifier [0] SubjectKeyIdentifier }

SignedAttributes ::= SET SIZE (1..MAX) OF Attribute

UnsignedAttributes ::= SET SIZE (1..MAX) OF Attribute

Attribute ::= SEQUENCE {
        attrType OBJECT IDENTIFIER,
        attrValues SET OF AttributeValue }

AttributeValue ::= ANY

SignatureValue ::= OCTET STRING

person Ben    schedule 03.09.2010    source источник
comment
Это в конкретном расширении?   -  person Bruno    schedule 03.09.2010
comment
Поле SignedAttributes файла SignerInfo. Вот стандарт, которому я следую: tools.ietf.org/html/rfc3852#section- 5.4 Итак, я пытаюсь проверить подпись на этом сертификате X.509, и мне нужно получить данные, которые были подписаны из сертификата. Этот сертификат включает необязательное поле SignedAttributes, и в соответствии со стандартом все это поле (тег, длина и значение) хэшируется и шифруется для создания подписи. Но когда я пытаюсь проверить подпись с этим значением, это не удается. Я думаю, что мне нужно как-то изменить тег.   -  person Ben    schedule 03.09.2010


Ответы (1)


Я не уверен, как интерпретировать этот комментарий. Какой стандарт вы читаете? У вас есть грамматика ASN.1 для структуры?

Явный тег подобен оболочке некоторого базового типа. Например, базовым типом может быть SEQUENCE. Он кодируется универсальным тегом SEQUENCE, 0x30. Но чтобы избежать двусмысленности в том, как следует интерпретировать ПОСЛЕДОВАТЕЛЬНОСТЬ во внешней структуре, она заключена в структуру EXPLICIT с контекстно-зависимым тегом. Из приведенного выше фрагмента неясно, что это за тег.

Я предполагаю, что они имеют в виду такой синтаксис, как [0] EXPLICIT SET OF foo, который (используя пример из исходного вопроса в качестве значения) будет закодирован как (hex) A0 81 C9 31 81 C6 (value) ...

Обратите внимание, что исходное значение, помеченное контекстно-зависимым нулем (A0), было повторно помечено универсальным SET OF (31).


Хорошо, в данном случае, я думаю, они имеют в виду, что когда вы подписываете атрибуты, вместо использования неявного тега подпись вычисляется по тегу SET OF. Если это то, что они имеют в виду, добавление «EXPLICIT» действительно замутило воду, но что угодно. Если это так, то кодировка будет просто 31 81 C6 (value) ... (замените зависящий от контекста 0xA0 универсальным SET OF 0x31).

person erickson    schedule 03.09.2010
comment
Отредактировано, чтобы ответить на некоторые ваши вопросы. Я попробую ваше предложение, спасибо. - person Ben; 03.09.2010
comment
@Ben, посмотри мое обновление. Я думаю, что моя первая догадка была ошибочной. - person erickson; 03.09.2010
comment
изменить A0 на 31 было моей первой мыслью. Я попробовал это и не смог пройти проверку. Я думаю, что изменить A0 на 31 правильно, поскольку это имеет логический смысл, поэтому у меня может быть другая проблема. - person Ben; 03.09.2010
comment
Перебрал кучу других проблем, выяснил, что от А0 до 31 правильно. - person Ben; 23.09.2010