C# 如何在时间戳令牌(Bouncy Castle)中获得签名

C# 如何在时间戳令牌(Bouncy Castle)中获得签名,c#,bouncycastle,C#,Bouncycastle,从RFC3852(和RFC3161)中,我了解到签名值存储为TimestampToken的SignerInfo类型的属性(这是一种签名数据内容类型) 如何从Bouncy Castle的TimeStampToken实例(在C#)中获取该签名值?您可以将类与助手方法一起使用: public static class TimeStampTokenHelper { public static IEnumerable<SignedData> GetTimeStampTokensAsSi

从RFC3852(和RFC3161)中,我了解到签名值存储为TimestampToken的SignerInfo类型的属性(这是一种签名数据内容类型)


如何从Bouncy Castle的TimeStampToken实例(在C#)中获取该签名值?

您可以将类与助手方法一起使用:

public static class TimeStampTokenHelper
{
    public static IEnumerable<SignedData> GetTimeStampTokensAsSignedData(byte[] input)
    {
        var cmsInputStream = new Asn1InputStream(input);
        var asn1Object = cmsInputStream.ReadObject();
        Assert.IsNotNull(asn1Object);

        var rootSequence = Asn1Sequence.GetInstance(asn1Object);
        var signedData = GetSignedData(rootSequence);
        return GetTimeStampTokensFromSignedData(signedData);
    }

    private static SignedData GetSignedData(Asn1Sequence sequence)
    {
        var rootContent = ContentInfo.GetInstance(sequence);
        Assert.That(rootContent.ContentType.Id, Is.EqualTo("1.2.840.113549.1.7.2")); // signedData
        var signedData = SignedData.GetInstance(rootContent.Content);
        return signedData;
    }

    private static IEnumerable<SignedData> GetTimeStampTokensFromSignedData(SignedData signedData)
    {
        return GetTimeStampTokensFromSignerInfos(signedData.SignerInfos);
    }

    private static IEnumerable<SignedData> GetTimeStampTokensFromSignerInfos(Asn1Set signerInfos)
    {
        var timestampTokens = signerInfos
            .OfType<Asn1Sequence>()
            .SelectMany(GetTimeStampTokensFromSignerInfo);
        return timestampTokens;
    }

    private static IEnumerable<SignedData> GetTimeStampTokensFromSignerInfo(Asn1Sequence signerInfoSequence)
    {
        var signerInfo = SignerInfo.GetInstance(signerInfoSequence);
        var result = signerInfo.UnauthenticatedAttributes.ToArray()
            .Select(Asn1Sequence.GetInstance)
            .Where(x => ((DerObjectIdentifier)x.GetObjectAt(0)).Id == "1.2.840.113549.1.9.16.2.14")
            .Select(x => GetSignedData(Asn1Sequence.GetInstance(Asn1Set.GetInstance(x.GetObjectAt(1)).GetObjectAt(0))));
        return result;
    }
作为最后的提示:

  • 您可以使用来深入了解学员签名的结构
  • 您可以使用
    Org.BouncyCastle.Asn1.Utilities.Asn1Dump.DumpAsString
    方法转储BouncyCastle的ASN.1对象的字符串表示形式

希望这有帮助。

我可以通过以下方式获得签名:

CmsSignedData tsTokenCms = timestampToken.ToCmsSignedData();
SignerInformationStore signerInfoStore = tsTokenCms.GetSignerInfos();
SignerInformation signerInfo = signerInfoStore.GetFirstSigner(timestampToken.SignerID);
byte[] signatureBytes = signerInfo.GetSignature();
string signatureString = BitConverter.ToString(signatureBytes);
Console.WriteLine("Signature is: " + signatureString);
CmsSignedData tsTokenCms = timestampToken.ToCmsSignedData();
SignerInformationStore signerInfoStore = tsTokenCms.GetSignerInfos();
SignerInformation signerInfo = signerInfoStore.GetFirstSigner(timestampToken.SignerID);
byte[] signatureBytes = signerInfo.GetSignature();
string signatureString = BitConverter.ToString(signatureBytes);
Console.WriteLine("Signature is: " + signatureString);