如何解码数字PKCS7签名的时间戳?

时间:2016-04-27 15:13:44

标签: c# cryptography timestamp digital-signature

我有一个带时间戳的签名。 我正在尝试解码时间戳并解码其属性。

 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是否正确(它的签名是否有效)

您有任何想法或经验吗? 感谢

1 个答案:

答案 0 :(得分:2)

时间戳只不过是反签名(经过身份验证的属性的签名)。您可以查看SignerInfo结构中的计数器签名。

signerInfo.CounterSignerInfos包含SignerInfo的集合,将由大多数 Authenticode签名方案使用(可能是特定于实现的)。如果您的时间戳基于RFC-3161,那么它可能在其他地方。我在SignerInfo.UnsignedAttributes属性下使用OID

将其视为未经身份验证的属性
  

1.3.6.1.4.1.311.3.3.1

使用此OID,您可以轻松找到时间戳。

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