如何解码来自数字PKCS7签名的时间戳?
问题描述:
我有一个带时间戳的签名。 我想解码时间戳并解码它的属性。如何解码来自数字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是正确的(它的签名是有效的)
你有什么想法或经验? 谢谢
答
时间戳只不过是一个反签名(您的验证属性的签名)。您可以查看SignerInfo
结构中的计数器签名。
signerInfo.CounterSignerInfos
包含SignerInfo
集合,将最验证码签名方案一起使用(可能是实现特定的)。如果您的时间戳基于RFC-3161,那么它可能在其他地方。我曾与OID
发现它作为一个未经认证的属性下SignerInfo.UnsignedAttributes
财产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
}
}
'CheckSignature'方法不是你想要的吗? –
不,它没有。 CheckSignature只检查签名。时间戳不参与此方法调用 – VoimiX