次の 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