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

TimeStampResponse

public class TimeStampResponse
using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Asn1.Cmp; using Org.BouncyCastle.Asn1.Cms; using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Asn1.Tsp; using Org.BouncyCastle.Utilities; using System; using System.IO; using System.Text; namespace Org.BouncyCastle.Tsp { public class TimeStampResponse { private readonly TimeStampResp m_resp; private readonly TimeStampToken m_timeStampToken; public int Status => m_resp.Status.StatusObject.IntValueExact; public TimeStampToken TimeStampToken => m_timeStampToken; private static TimeStampResp ParseTimeStampResp(byte[] encoding) { try { return TimeStampResp.GetInstance(encoding); } catch (Exception ex) { throw new TspException("malformed timestamp response: " + ex?.ToString(), ex); } } private static TimeStampResp ParseTimeStampResp(Stream input) { try { return TimeStampResp.GetInstance(Asn1Object.FromStream(input)); } catch (Exception ex) { throw new TspException("malformed timestamp response: " + ex?.ToString(), ex); } } public TimeStampResponse(TimeStampResp resp) { m_resp = resp; if (resp.TimeStampToken != null) m_timeStampToken = new TimeStampToken(resp.TimeStampToken); } public TimeStampResponse(byte[] resp) : this(ParseTimeStampResp(resp)) { } public TimeStampResponse(Stream input) : this(ParseTimeStampResp(input)) { } public string GetStatusString() { if (m_resp.Status.StatusString == null) return null; StringBuilder stringBuilder = new StringBuilder(); PkiFreeText statusString = m_resp.Status.StatusString; for (int i = 0; i < statusString.Count; i++) { stringBuilder.Append(statusString[i].GetString()); } return stringBuilder.ToString(); } public PkiFailureInfo GetFailInfo() { if (m_resp.Status.FailInfo == null) return null; return new PkiFailureInfo(m_resp.Status.FailInfo); } public void Validate(TimeStampRequest request) { TimeStampToken timeStampToken = TimeStampToken; if (timeStampToken != null) { TimeStampTokenInfo timeStampInfo = timeStampToken.TimeStampInfo; if (request.Nonce != null && !request.Nonce.Equals(timeStampInfo.Nonce)) throw new TspValidationException("response contains wrong nonce value."); if (Status != 0 && Status != 1) throw new TspValidationException("time stamp token found in failed request."); if (!timeStampInfo.MessageImprintAlgOid.Equals(request.MessageImprintAlgOid)) throw new TspValidationException("response for different message imprint algorithm."); if (!Arrays.FixedTimeEquals(request.MessageImprintDigest.GetOctets(), timeStampInfo.MessageImprintDigest.GetOctets())) throw new TspValidationException("response for different message imprint digest."); Org.BouncyCastle.Asn1.Cms.Attribute attribute = timeStampToken.SignedAttributes[PkcsObjectIdentifiers.IdAASigningCertificate]; Org.BouncyCastle.Asn1.Cms.Attribute attribute2 = timeStampToken.SignedAttributes[PkcsObjectIdentifiers.IdAASigningCertificateV2]; if (attribute == null && attribute2 == null) throw new TspValidationException("no signing certificate attribute present."); if (attribute == null) ; DerObjectIdentifier reqPolicy = request.TimeStampReq.ReqPolicy; if (reqPolicy != null && !reqPolicy.Equals(timeStampInfo.TstInfo.Policy)) throw new TspValidationException("TSA policy wrong for request."); } else if (Status == 0 || Status == 1) { throw new TspValidationException("no time stamp token found and one expected."); } } public byte[] GetEncoded() { return m_resp.GetEncoded(); } public byte[] GetEncoded(string encoding) { Asn1Encodable asn1Encodable = m_resp; if ("DL".Equals(encoding)) asn1Encodable = ((m_timeStampToken == null) ? new DLSequence(m_resp.Status) : new DLSequence(m_resp.Status, m_timeStampToken.ToCmsSignedData().ContentInfo)); return asn1Encodable.GetEncoded(encoding); } } }