2

次の IMPLICIT [0] タグを持つ一連のデータを含む X.509 証明書があります。

A0 81 C6 (value)...

そして、標準文書からの抜粋があります:

IMPLICIT [0] タグは DER エンコーディングには使用されず、EXPLICIT SET OF タグが使用されます。つまり、IMPLICIT [0] タグではなく、EXPLICIT SET OF タグの DER エンコーディングを、値の長さと内容のオクテットと共に含める必要があります。

私はたくさんの検索を行いましたが、標準が何を求めているのか正確にはわかりません。少し説明を求めています。

編集:これが私が従っている標準です: https://www.rfc-editor.org/rfc/rfc3852

X.509 署名を検証しようとしていますが、これを行うにはメッセージ ダイジェストを計算する必要があります。この証明書には、SignerInfo タイプのオプションの SignedAttributes が含まれています。署名されたコンテンツをハッシュし、SignedAttributes のメッセージ ダイジェストが正しいことを確認しました。標準では、SignedAttributes が存在する場合、それをハッシュして暗号化し、証明書の署名を作成する必要があると規定されています。この標準では、元の質問で説明したように、SignedAttributes のタグを変更する必要があるとも述べています。

SignerInfo の Asn.1 文法は次のとおりです。

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
4

1 に答える 1

8

そのコメントをどう解釈していいのかわからない。何を基準に読んでいますか?構造の ASN.1 文法はありますか?

明示的なタグは、基になる型のラッパーのようなものです。たとえば、基になる型は SEQUENCE である可能性があります。これは、ユニバーサル SEQUENCE タグ 0x30 でエンコードされます。ただし、SEQUENCE が囲んでいる構造でどのように解釈されるべきかというあいまいさを避けるために、コンテキスト固有のタグを使用して EXPLICIT 構造にラップされます。上記のスニペットからは、そのタグが何であるかは明確ではありません。

私は、彼らが意味するのは、[0] EXPLICIT SET OF foo(元の質問の例を値として使用して)のような構文であると推測しています(16進数)としてエンコードされますA0 81 C9 31 81 C6 (value) ...

コンテキスト固有のゼロ ( A0) でタグ付けされた元の値は、ユニバーサル SET OF ( ) で再タグ付けされていることに注意してください31


さて、この場合、属性に署名すると、暗黙的なタグを使用する代わりに、署名が SET OF タグで計算されるということだと思います。それが彼らの言いたいことなら、「EXPLICIT」を入れると本当に水が濁りますが、それはどうでもいいことです。その場合、エンコーディングは単純になります31 81 C6 (value) ...(コンテキスト固有の 0xA0 をユニバーサル SET OF 0x31 に置き換えます)。

于 2010-09-03T18:52:26.620 に答える