2010-09-03 2 views
2

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

A0 81 C6 (value)... 

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

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

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

EDIT: Вот стандартная я следующее: http://tools.ietf.org/html/rfc3852

Я пытаюсь проверить X.509 подпись, и мне нужно вычислить сообщение дайджеста, чтобы сделать это. Этот сертификат включает необязательные SignedAttributes в типе SignerInfo. Я hashed подписанный контент и проверил, что дайджест сообщения в 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 
+0

Является ли оно определенным расширением? – Bruno

+0

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

ответ

5

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

Явный тег похож на обертку вокруг некоторого базового типа. Например, базовый тип может быть SEQUENCE. Он кодируется универсальным тегом SEQUENCE, 0x30. Но чтобы избежать двусмысленности в том, как SEQUENCE следует интерпретировать в охватывающей структуре, он завернут в структуру EXPLICIT тегом, специфичным для контекста. Из фрагмента выше не видно, что это за тег.

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

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


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

+0

Отредактировано для ответа на некоторые из ваших вопросов. Я попробую ваше предложение, спасибо. – Ben

+0

@Ben - проверьте мое обновление. Я думаю, что мое первое предположение было вне базы. – erickson

+0

Изменение A0 до 31 было моей первой мыслью. Я попробовал это и не смог пройти проверку. Я думаю, что изменение A0 до 31 правильное, поскольку оно имеет логический смысл, поэтому у меня может быть другая проблема. – Ben