2016-04-27 12 views
1

タイムスタンプ付きの署名があります。 タイムスタンプをデコードし、そのプロパティをデコードしようとしています。デジタルPKCS7署名からタイムスタンプをデコードする方法は?

var contentInfo = new ContentInfo(Convert.FromBase64String(data)); 
      var signedCms = new SignedCms(contentInfo, true); 

      signedCms.Decode(Convert.FromBase64String(signature)); 
      signedCms.CheckSignature(true); 


      foreach (var signerInfo in signedCms.SignerInfos) 
      { 
       foreach (var unsignedAttribute in signerInfo.UnsignedAttributes) 
       { 

        if (unsignedAttribute.Oid.Value == "1.2.840.113549.1.9.16.2.14") 
        { 
         AsnEncodedData asnData = unsignedAttribute.Values[0]; 

         byte[] asnBinary = asnData.RawData; 
        } 


       } 
      } 

しかし、私はasnData.RawData

をデコードすることができます。少なくとも私は

あなたがいずれかを持っています(それの署名が有効である)日付を取得し、timstampが正しいことを確認する必要があるか理解しませんアイデアやexpirience? ありがとう

+0

「CheckSignature」メソッドでは、既に必要なことはしていませんか? –

+0

いいえ、それはありません。 CheckSignatureは署名のみをチェックします。 Timestapはこのメソッド呼び出しには含まれていません – VoimiX

答えて

2

タイムスタンプは、反署名(認証された属性の署名)以外の何ものでもありません。 SignerInfo構造内のカウンターシグネチャーを調べます。

signerInfo.CounterSignerInfosSignerInfoのコレクションを含み、最も Authenticodeの署名スキーム(特定の実装であってもよい)で使用されるであろう。タイムスタンプがRFC-3161に基づいている場合、それは他の場所にある可能性があります。私はあなたが自明タイムスタンプを見つけることができ、このOIDで1.3.6.1.4.1.311.3.3.1

OID

SignerInfo.UnsignedAttributesプロパティの下で認証されていない属性としてそれを発見しました。

foreach (CryptographicAttributeObject cryptoAttribute in primarySigner.UnsignedAttributes) 
{ 
    if (cryptoAttribute.Oid.Value == szOID_RFC3161_TIMESTAMP.Value) 
    { 
     Pkcs9AttributeObject rfcTimestampObj = new Pkcs9AttributeObject(cryptoAttribute.Values[0]); 
     //Decode the attribute 
     SignedCms rfcTimestampMessage = new SignedCms(); 
     rfcTimestampMessage.Decode(rfcTimestampObj.RawData); 
     //At this point you are obtained the timestamp message as a SignedCMS object - rfcTimestampMessage.SignerInfos.Count > 1 
    } 
} 
+0

*タイムスタンプは、反署名(認証された属性の署名)以外は何もありません。* RFC 3161タイムスタンプの場合、これはほぼ真ですが、メッセージダイジェスト署名属性は元の署名を直接ハッシュする代わりに、元の署名をハッシュし、付加的なタイムスタンプ関連データを含むタイムスタンプ情報構造を生成する。 – mkl

+0

OPで使用されるOID 1.2.840.113549.1.9.16.2.14は標準タイムスタンプ用ですが、1.3.6.1.4.1.311。*はMicrosoft独自のものです。 – mkl

関連する問題