2016-04-27 4 views
1

Ich habe eine Unterschrift mit Zeitstempel. Ich versuche den Zeitstempel zu dekodieren und seine Eigenschaften zu dekodieren.Wie Zeitstempel aus digitaler PKCS7-Signatur zu decodieren?

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; 
        } 


       } 
      } 

Aber ich verstehe nicht, wie kann ich asnData.RawData

Wenigstens muss ich erhalten Datum und überprüfen dekodieren, dass die timstamp korrekt ist (es Unterschrift gültig ist)

Haben Sie irgendwelche Ideen oder Erfahrung? Danke

+0

Funktioniert die 'CheckSignature'-Methode nicht schon? –

+0

Nein, tut es nicht. CheckSignature prüft nur die Signatur. Timestap ist an diesem Methodenaufruf nicht beteiligt. – VoimiX

Antwort

2

Ein Zeitstempel ist nichts anderes als eine Gegensignatur (eine Signatur Ihrer authentifizierten Attribute). Sie würden in die Gegensignaturen innerhalb der Struktur SignerInfo schauen.

signerInfo.CounterSignerInfos enthält eine Sammlung von SignerInfo und wird von den meisten Authenticode Signaturen Schemata verwendet werden (können implementierungsspezifisch sein kann). Wenn Ihr Zeitstempel auf RFC-3161 basiert, kann es an anderer Stelle sein. Ich habe es als nicht authentifizierter Attribut unter der

1.3.6.1.4.1.311.3.3.1

Mit diesem OID SignerInfo.UnsignedAttributes Eigenschaft mit OID gefunden, Sie trivialer den Zeitstempel finden.

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

* Ein Timestamp ist nichts anderes als eine Gegensignatur (eine Signatur Ihrer authentifizierten Attribute). * - Im Falle von RFC 3161-Zeitstempeln ist dies fast wahr, das Message-Digest-Attribut jedoch nicht Hash der ursprünglichen Signatur direkt, aber stattdessen eine Zeitstempel-Informationsstruktur, die wiederum die ursprüngliche Signatur hasht und zusätzliche zeitstempelbezogene Daten enthält. – mkl

+0

Die vom OP verwendete OID 1.2.840.113549.1.9.16.2.14 ist für Standard-Zeitstempel, während 1.3.6.1.4.1.311. * Für Microsoft-proprietäre Zeug ist. – mkl