<PackageReference Include="BouncyCastle.Cryptography" Version="2.6.2" />

TimeStampRequest

using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Asn1.Tsp; using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.Math; using Org.BouncyCastle.X509; using System; using System.Collections.Generic; using System.IO; namespace Org.BouncyCastle.Tsp { public class TimeStampRequest : X509ExtensionBase { private readonly TimeStampReq m_req; public TimeStampReq TimeStampReq => m_req; public int Version => m_req.Version.IntValueExact; public MessageImprint MessageImprint => m_req.MessageImprint; public AlgorithmIdentifier MessageImprintAlgID => m_req.MessageImprint.HashAlgorithm; public string MessageImprintAlgOid => m_req.MessageImprint.HashAlgorithm.Algorithm.Id; public Asn1OctetString MessageImprintDigest => m_req.MessageImprint.HashedMessage; public string ReqPolicy => m_req.ReqPolicy?.Id; public BigInteger Nonce => m_req.Nonce?.Value; public bool CertReq => (m_req.CertReq ?? DerBoolean.False).IsTrue; internal X509Extensions Extensions => m_req.Extensions; public virtual bool HasExtensions => Extensions != null; private static TimeStampReq ParseTimeStampReq(byte[] encoding) { try { return TimeStampReq.GetInstance(encoding); } catch (Exception ex) { throw new IOException("malformed request: " + ex?.ToString()); } } private static TimeStampReq ParseTimeStampReq(Stream input) { try { return TimeStampReq.GetInstance(Asn1Object.FromStream(input)); } catch (Exception ex) { throw new IOException("malformed request: " + ex?.ToString()); } } public TimeStampRequest(TimeStampReq req) { m_req = req; } public TimeStampRequest(byte[] req) : this(ParseTimeStampReq(req)) { } public TimeStampRequest(Stream input) : this(ParseTimeStampReq(input)) { } public byte[] GetMessageImprintDigest() { return m_req.MessageImprint.GetHashedMessage(); } public void Validate(IList<string> algorithms, IList<string> policies, IList<string> extensions) { if (algorithms == null) throw new TspValidationException("no algorithms associated with request", 128); MessageImprint messageImprint = MessageImprint; DerObjectIdentifier algorithm = messageImprint.HashAlgorithm.Algorithm; if (!algorithms.Contains(algorithm.GetID())) throw new TspValidationException("request contains unknown algorithm", 128); if (policies != null) { DerObjectIdentifier reqPolicy = m_req.ReqPolicy; if (reqPolicy != null && !policies.Contains(reqPolicy.GetID())) throw new TspValidationException("request contains unknown policy", 256); } if (extensions != null && Extensions != null) { foreach (DerObjectIdentifier extensionOid in Extensions.ExtensionOids) { if (!extensions.Contains(extensionOid.GetID())) throw new TspValidationException("request contains unknown extension", 8388608); } } if (TspUtil.GetDigestLength(algorithm) != messageImprint.HashedMessage.GetOctetsLength()) throw new TspValidationException("imprint digest the wrong length", 4); } public byte[] GetEncoded() { return m_req.GetEncoded(); } public virtual IList<DerObjectIdentifier> GetExtensionOids() { return TspUtil.GetExtensionOids(Extensions); } protected override X509Extensions GetX509Extensions() { return Extensions; } } }