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

ArchiveTimeStamp

using Org.BouncyCastle.Asn1.Cms; using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Asn1.X509; using System; namespace Org.BouncyCastle.Asn1.Tsp { public class ArchiveTimeStamp : Asn1Encodable { private readonly AlgorithmIdentifier m_digestAlgorithm; private readonly Attributes m_attributes; private readonly Asn1Sequence m_reducedHashTree; private readonly Org.BouncyCastle.Asn1.Cms.ContentInfo m_timeStamp; public virtual Org.BouncyCastle.Asn1.Cms.ContentInfo TimeStamp => m_timeStamp; public static ArchiveTimeStamp GetInstance(object obj) { if (obj == null) return null; ArchiveTimeStamp archiveTimeStamp = obj as ArchiveTimeStamp; if (archiveTimeStamp != null) return archiveTimeStamp; return new ArchiveTimeStamp(Asn1Sequence.GetInstance(obj)); } public static ArchiveTimeStamp GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit) { return new ArchiveTimeStamp(Asn1Sequence.GetInstance(taggedObject, declaredExplicit)); } public ArchiveTimeStamp(AlgorithmIdentifier digestAlgorithm, PartialHashtree[] reducedHashTree, Org.BouncyCastle.Asn1.Cms.ContentInfo timeStamp) : this(digestAlgorithm, null, reducedHashTree, timeStamp) { } public ArchiveTimeStamp(Org.BouncyCastle.Asn1.Cms.ContentInfo timeStamp) : this(null, null, null, timeStamp) { } public ArchiveTimeStamp(AlgorithmIdentifier digestAlgorithm, Attributes attributes, PartialHashtree[] reducedHashTree, Org.BouncyCastle.Asn1.Cms.ContentInfo timeStamp) { m_digestAlgorithm = digestAlgorithm; m_attributes = attributes; if (reducedHashTree != null) m_reducedHashTree = new DerSequence(reducedHashTree); else m_reducedHashTree = null; m_timeStamp = timeStamp; } private ArchiveTimeStamp(Asn1Sequence sequence) { int num; if (sequence.Count < 1 || sequence.Count > 4) { num = sequence.Count; throw new ArgumentException("wrong sequence size in constructor: " + num.ToString(), "sequence"); } AlgorithmIdentifier digestAlgorithm = null; Attributes attributes = null; Asn1Sequence reducedHashTree = null; for (int i = 0; i < sequence.Count - 1; i++) { Asn1TaggedObject asn1TaggedObject = sequence[i] as Asn1TaggedObject; if (asn1TaggedObject != null) { num = asn1TaggedObject.TagNo; switch (num) { case 0: digestAlgorithm = AlgorithmIdentifier.GetInstance(asn1TaggedObject, false); break; case 1: attributes = Attributes.GetInstance(asn1TaggedObject, false); break; case 2: reducedHashTree = Asn1Sequence.GetInstance(asn1TaggedObject, false); break; default: throw new ArgumentException("invalid tag no in constructor: " + asn1TaggedObject.TagNo.ToString()); } } } m_digestAlgorithm = digestAlgorithm; m_attributes = attributes; m_reducedHashTree = reducedHashTree; m_timeStamp = Org.BouncyCastle.Asn1.Cms.ContentInfo.GetInstance(sequence[sequence.Count - 1]); } public virtual AlgorithmIdentifier GetDigestAlgorithmIdentifier() { return m_digestAlgorithm ?? GetTimeStampInfo().MessageImprint.HashAlgorithm; } public virtual byte[] GetTimeStampDigestValue() { return GetTimeStampInfo().MessageImprint.GetHashedMessage(); } private TstInfo GetTimeStampInfo() { if (!CmsObjectIdentifiers.SignedData.Equals(m_timeStamp.ContentType)) throw new InvalidOperationException("cannot identify algorithm identifier for digest"); Org.BouncyCastle.Asn1.Cms.ContentInfo encapContentInfo = Org.BouncyCastle.Asn1.Cms.SignedData.GetInstance(m_timeStamp.Content).EncapContentInfo; if (!PkcsObjectIdentifiers.IdCTTstInfo.Equals(encapContentInfo.ContentType)) throw new InvalidOperationException("cannot parse time stamp"); return TstInfo.GetInstance(Asn1OctetString.GetInstance(encapContentInfo.Content).GetOctets()); } public virtual AlgorithmIdentifier DigestAlgorithm() { return m_digestAlgorithm; } public virtual PartialHashtree GetHashTreeLeaf() { if (m_reducedHashTree == null) return null; return PartialHashtree.GetInstance(m_reducedHashTree[0]); } public virtual PartialHashtree[] GetReducedHashTree() { if (m_reducedHashTree == null) return null; return m_reducedHashTree.MapElements(PartialHashtree.GetInstance); } public override Asn1Object ToAsn1Object() { Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector(4); asn1EncodableVector.AddOptionalTagged(false, 0, m_digestAlgorithm); asn1EncodableVector.AddOptionalTagged(false, 1, m_attributes); asn1EncodableVector.AddOptionalTagged(false, 2, m_reducedHashTree); asn1EncodableVector.Add(m_timeStamp); return new DerSequence(asn1EncodableVector); } } }