Open10

公開鍵の継続使用による信用醸成プロトコル - scrap

mugwort_rcmugwort_rc

PKCS電子署名

PKCS#7で仕様が定められている。

mugwort_rcmugwort_rc

ContentType

  • data (MUST)
  • signed-data (MUST)
  • enveloped-data (MUST)
  • digested-data (MAY)
  • encrypted-data (MAY)
  • authenticated-data (MAY)
mugwort_rcmugwort_rc

ASN.1 definitions

id-ct-contentInfo

1.2.840.113549.1.9.16.1.6

      id-ct-contentInfo OBJECT IDENTIFIER ::= { iso(1) member-body(2)
         us(840) rsadsi(113549) pkcs(1) pkcs9(9) smime(16) ct(1) 6 }

ContentInfo

      ContentInfo ::= SEQUENCE {
        contentType ContentType,
        content [0] EXPLICIT ANY DEFINED BY contentType }

      ContentType ::= OBJECT IDENTIFIER

Data

1.2.840.113549.1.7.1

      id-data OBJECT IDENTIFIER ::= { iso(1) member-body(2)
         us(840) rsadsi(113549) pkcs(1) pkcs7(7) 1 }

Signed-data

1.2.840.113549.1.7.2

      id-signedData OBJECT IDENTIFIER ::= { iso(1) member-body(2)
         us(840) rsadsi(113549) pkcs(1) pkcs7(7) 2 }
      SignedData ::= SEQUENCE {
        version CMSVersion,
        digestAlgorithms DigestAlgorithmIdentifiers,
        encapContentInfo EncapsulatedContentInfo,
        certificates [0] IMPLICIT CertificateSet OPTIONAL,
        crls [1] IMPLICIT RevocationInfoChoices OPTIONAL,
        signerInfos SignerInfos }

      DigestAlgorithmIdentifiers ::= SET OF DigestAlgorithmIdentifier

      SignerInfos ::= SET OF SignerInfo
mugwort_rcmugwort_rc

Signed-data

作成概要:

  1. コンテンツのメッセージダイジェストを算出
  2. 秘密鍵を用いて電子署名
  3. SignerInfoに署名値と署名者を記録する
  4. SignedDataにSignerInfoを記録

検証概要:

  1. コンテンツのメッセージダイジェストを算出
  2. ダイジェストと署名者の公開鍵を使用して署名を検証
  • 発行者識別名と発行シリアル番号を使用して証明書を特定
  • サブジェクトキー識別子を使用して証明書を特定
  • SignedDataの証明書フィールドから取得
mugwort_rcmugwort_rc
mugwort_rcmugwort_rc
import pdfreader
fp = open("signed.pdf", "rb")
doc = pdfreader.PDFDocument(fp)
catalog = doc.obj_by_ref(doc.trailer.root)
# Signature dictionary (see Table 252 in 12.8.2)
sig = catalog["AcroForm"]["Fields"][0]["V"]