Кодировка DER - Как преобразовать неявный тег в явный тег - PullRequest
2 голосов
/ 03 сентября 2010

У меня есть сертификат 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

1 Ответ

7 голосов
/ 03 сентября 2010

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

Явный тег подобен обертке вокруг некоторого базового типа.Например, базовый тип может быть SEQUENCE.Кодируется универсальным тегом SEQUENCE, 0x30.Но во избежание двусмысленности в том, как следует интерпретировать последовательность SEQUENCE во вложенной структуре, она заключена в структуру 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).

...