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

TimeStampResponseGenerator

using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Asn1.Cmp; using Org.BouncyCastle.Asn1.Cms; using Org.BouncyCastle.Asn1.Tsp; using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.Math; using System; using System.Collections.Generic; using System.IO; namespace Org.BouncyCastle.Tsp { public class TimeStampResponseGenerator { private class FailInfo : DerBitString { internal FailInfo(int failInfoValue) : base(failInfoValue) { } } private PkiStatus status; private Asn1EncodableVector statusStrings; private int failInfo; private TimeStampTokenGenerator tokenGenerator; private IList<string> acceptedAlgorithms; private IList<string> acceptedPolicies; private IList<string> acceptedExtensions; public TimeStampResponseGenerator(TimeStampTokenGenerator tokenGenerator, IList<string> acceptedAlgorithms) : this(tokenGenerator, acceptedAlgorithms, null, null) { } public TimeStampResponseGenerator(TimeStampTokenGenerator tokenGenerator, IList<string> acceptedAlgorithms, IList<string> acceptedPolicy) : this(tokenGenerator, acceptedAlgorithms, acceptedPolicy, null) { } public TimeStampResponseGenerator(TimeStampTokenGenerator tokenGenerator, IList<string> acceptedAlgorithms, IList<string> acceptedPolicies, IList<string> acceptedExtensions) { this.tokenGenerator = tokenGenerator; this.acceptedAlgorithms = acceptedAlgorithms; this.acceptedPolicies = acceptedPolicies; this.acceptedExtensions = acceptedExtensions; statusStrings = new Asn1EncodableVector(); } private void AddStatusString(string statusString) { statusStrings.Add(new DerUtf8String(statusString)); } private void SetFailInfoField(int field) { failInfo |= field; } private PkiStatusInfo GetPkiStatusInfo() { Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector(new DerInteger((int)status)); if (statusStrings.Count > 0) asn1EncodableVector.Add(new PkiFreeText(new DerSequence(statusStrings))); if (failInfo != 0) asn1EncodableVector.Add(new FailInfo(failInfo)); return PkiStatusInfo.GetInstance(new DerSequence(asn1EncodableVector)); } public TimeStampResponse Generate(TimeStampRequest request, BigInteger serialNumber, DateTime? genTime) { TimeStampResp resp; try { if (!genTime.HasValue) throw new TspValidationException("The time source is not available.", 512); request.Validate(acceptedAlgorithms, acceptedPolicies, acceptedExtensions); status = PkiStatus.Granted; AddStatusString("Operation Okay"); PkiStatusInfo pkiStatusInfo = GetPkiStatusInfo(); ContentInfo instance; try { instance = ContentInfo.GetInstance(Asn1Object.FromByteArray(tokenGenerator.Generate(request, serialNumber, genTime.Value).ToCmsSignedData().GetEncoded())); } catch (IOException innerException) { throw new TspException("Timestamp token received cannot be converted to ContentInfo", innerException); } resp = new TimeStampResp(pkiStatusInfo, instance); } catch (TspValidationException ex) { status = PkiStatus.Rejection; SetFailInfoField(ex.FailureCode); AddStatusString(ex.Message); resp = new TimeStampResp(GetPkiStatusInfo(), null); } try { return new TimeStampResponse(resp); } catch (IOException innerException2) { throw new TspException("created badly formatted response!", innerException2); } } public TimeStampResponse GenerateGrantedResponse(TimeStampRequest request, BigInteger serialNumber, DateTime? genTime, string statusString, X509Extensions additionalExtensions) { TimeStampResp resp; try { if (!genTime.HasValue) throw new TspValidationException("The time source is not available.", 512); request.Validate(acceptedAlgorithms, acceptedPolicies, acceptedExtensions); status = PkiStatus.Granted; AddStatusString(statusString); PkiStatusInfo pkiStatusInfo = GetPkiStatusInfo(); ContentInfo instance; try { instance = ContentInfo.GetInstance(Asn1Object.FromByteArray(tokenGenerator.Generate(request, serialNumber, genTime.Value, additionalExtensions).ToCmsSignedData().GetEncoded())); } catch (IOException innerException) { throw new TspException("Timestamp token received cannot be converted to ContentInfo", innerException); } resp = new TimeStampResp(pkiStatusInfo, instance); } catch (TspValidationException ex) { status = PkiStatus.Rejection; SetFailInfoField(ex.FailureCode); AddStatusString(ex.Message); resp = new TimeStampResp(GetPkiStatusInfo(), null); } try { return new TimeStampResponse(resp); } catch (IOException innerException2) { throw new TspException("created badly formatted response!", innerException2); } } public TimeStampResponse GenerateFailResponse(PkiStatus status, int failInfoField, string statusString) { this.status = status; SetFailInfoField(failInfoField); if (statusString != null) AddStatusString(statusString); TimeStampResp resp = new TimeStampResp(GetPkiStatusInfo(), null); try { return new TimeStampResponse(resp); } catch (IOException innerException) { throw new TspException("created badly formatted response!", innerException); } } } }