C# 如何从.NET中的SHA-256签名文件中获取时间戳

C# 如何从.NET中的SHA-256签名文件中获取时间戳,c#,.net,timestamp,certificate,signature,C#,.net,Timestamp,Certificate,Signature,我已经编写了一个实用程序来获取二进制的数字签名时间戳。工具无法获取文件“Microsoft.IdentityModel.Tokens.dll”v6.7.1.10630的时间戳。 这个二进制文件似乎是用SHA256签名的。我试图用在此二进制文件中找到的值替换Oid.value,但未能转换为Pkcs9SigningTime类型。 如何更新代码以获取时间戳? 如有任何建议,将不胜感激 public static string getTimestamp(string filename) { st

我已经编写了一个实用程序来获取二进制的数字签名时间戳。工具无法获取文件“Microsoft.IdentityModel.Tokens.dll”v6.7.1.10630的时间戳。
这个二进制文件似乎是用SHA256签名的。我试图用在此二进制文件中找到的值替换
Oid.value
,但未能转换为
Pkcs9SigningTime
类型。 如何更新代码以获取时间戳?
如有任何建议,将不胜感激

public static string getTimestamp(string filename)
{
    string strTimeStamp = string.Empty;
    try
    {
        int encodingType;
        int contentType;
        int formatType;
        IntPtr certStore = IntPtr.Zero;
        IntPtr cryptMsg = IntPtr.Zero;
        IntPtr context = IntPtr.Zero;

        if (!WinCrypt.CryptQueryObject(
            WinCrypt.CERT_QUERY_OBJECT_FILE,
            Marshal.StringToHGlobalUni(filename),
            WinCrypt.CERT_QUERY_CONTENT_FLAG_ALL,
            WinCrypt.CERT_QUERY_FORMAT_FLAG_ALL,
            0,
            out encodingType,
            out contentType,
            out formatType,
            ref certStore,
            ref cryptMsg,
            ref context))
        {
            throw new Win32Exception(Marshal.GetLastWin32Error());
        }

        // Get size of the encoded message.
        int cbData = 0;
        if (!WinCrypt.CryptMsgGetParam(
            cryptMsg,
            WinCrypt.CMSG_ENCODED_MESSAGE,//Crypt32.CMSG_SIGNER_INFO_PARAM,
            0,
            IntPtr.Zero,
            ref cbData))
        {
            throw new Win32Exception(Marshal.GetLastWin32Error());
        }

        var vData = new byte[cbData];

        // Get the encoded message.
        if (!WinCrypt.CryptMsgGetParam(
            cryptMsg,
            WinCrypt.CMSG_ENCODED_MESSAGE,//Crypt32.CMSG_SIGNER_INFO_PARAM,
            0,
            vData,
            ref cbData))
        {
            throw new Win32Exception(Marshal.GetLastWin32Error());
        }

        var signedCms = new SignedCms();
        signedCms.Decode(vData);

        foreach (var signerInfo in signedCms.SignerInfos)
        {
            foreach (var unsignedAttribute in signerInfo.UnsignedAttributes)
            {
                if (unsignedAttribute.Oid.Value == "1.3.6.1.4.1.311.3.3.1")
                {
                    foreach (var signedAttribute in signerInfo.UnsignedAttributes)
                    {
                        if (signedAttribute.Oid.Value == "1.3.6.1.4.1.311.3.3.1")
                        {
                            Pkcs9AttributeObject obj = new Pkcs9AttributeObject(signedAttribute.Values[0]);
                            SignedCms rfcTimestampMessage = new SignedCms();
                            rfcTimestampMessage.Decode(obj.RawData);
                            rfcTimestampMessage.CheckSignature(true);

                            foreach(var timeStampSignerInfo in rfcTimestampMessage.SignerInfos)
                            {
                                foreach(var timeStampAttribute in timeStampSignerInfo.SignedAttributes)
                                {
                                    if (timeStampAttribute.Oid.Value == "1.2.840.113549.1.9.5")
                                    {
                                        Pkcs9SigningTime signingTime1 = (Pkcs9SigningTime)timeStampAttribute.Values[0];
                                        strTimeStamp = signingTime1.SigningTime.ToLocalTime().ToString();
                                    }
                                }
                            }

                        }
                    }
                }
            }
        }
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
    }

    return strTimeStamp;
}
更新:
似乎与SHA256没有关系。二进制
Microsoft.IdentityModel.Tokens.dll
使用
RFC3161
作为时间戳。我可以使用
SignTool
获得以下信息:

Index Algorithm Timestamp
=========================
0     sha256      RFC3161
Seach,我应该能够通过
Rfc3161TimestampTokenInfo.timestamp
获取时间戳信息,但此api在
.net Framework
中不可用。另一个关于
Rfc3161
的演示是