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

EvidenceRecord

public class EvidenceRecord : Asn1Encodable
using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.Utilities; using System; namespace Org.BouncyCastle.Asn1.Tsp { public class EvidenceRecord : Asn1Encodable { private static readonly DerObjectIdentifier Oid = new DerObjectIdentifier("1.3.6.1.5.5.11.0.2.1"); private readonly DerInteger m_version; private readonly Asn1Sequence m_digestAlgorithms; private readonly CryptoInfos m_cryptoInfos; private readonly EncryptionInfo m_encryptionInfo; private readonly ArchiveTimeStampSequence m_archiveTimeStampSequence; public virtual ArchiveTimeStampSequence ArchiveTimeStampSequence => m_archiveTimeStampSequence; public static EvidenceRecord GetInstance(object obj) { if (obj == null) return null; EvidenceRecord evidenceRecord = obj as EvidenceRecord; if (evidenceRecord != null) return evidenceRecord; return new EvidenceRecord(Asn1Sequence.GetInstance(obj)); } public static EvidenceRecord GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit) { return new EvidenceRecord(Asn1Sequence.GetInstance(taggedObject, declaredExplicit)); } private EvidenceRecord(EvidenceRecord evidenceRecord, ArchiveTimeStampSequence replacementSequence, ArchiveTimeStamp newChainTimeStamp) { m_version = evidenceRecord.m_version; if (newChainTimeStamp != null) { AlgorithmIdentifier digestAlgorithmIdentifier = newChainTimeStamp.GetDigestAlgorithmIdentifier(); Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector(); bool flag = false; foreach (Asn1Encodable digestAlgorithm in evidenceRecord.m_digestAlgorithms) { AlgorithmIdentifier instance = AlgorithmIdentifier.GetInstance(digestAlgorithm); asn1EncodableVector.Add(instance); if (instance.Equals(digestAlgorithmIdentifier)) { flag = true; break; } } if (!flag) { asn1EncodableVector.Add(digestAlgorithmIdentifier); m_digestAlgorithms = new DerSequence(asn1EncodableVector); } else m_digestAlgorithms = evidenceRecord.m_digestAlgorithms; } else m_digestAlgorithms = evidenceRecord.m_digestAlgorithms; m_cryptoInfos = evidenceRecord.m_cryptoInfos; m_encryptionInfo = evidenceRecord.m_encryptionInfo; m_archiveTimeStampSequence = replacementSequence; } public EvidenceRecord(CryptoInfos cryptoInfos, EncryptionInfo encryptionInfo, ArchiveTimeStamp archiveTimeStamp) { m_version = new DerInteger(1); m_digestAlgorithms = new DerSequence(archiveTimeStamp.GetDigestAlgorithmIdentifier()); m_cryptoInfos = cryptoInfos; m_encryptionInfo = encryptionInfo; m_archiveTimeStampSequence = new ArchiveTimeStampSequence(new ArchiveTimeStampChain(archiveTimeStamp)); } public EvidenceRecord(AlgorithmIdentifier[] digestAlgorithms, CryptoInfos cryptoInfos, EncryptionInfo encryptionInfo, ArchiveTimeStampSequence archiveTimeStampSequence) { m_version = new DerInteger(1); m_digestAlgorithms = new DerSequence(digestAlgorithms); m_cryptoInfos = cryptoInfos; m_encryptionInfo = encryptionInfo; m_archiveTimeStampSequence = archiveTimeStampSequence; } private EvidenceRecord(Asn1Sequence sequence) { int num; if (sequence.Count < 3 && sequence.Count > 5) { num = sequence.Count; throw new ArgumentException("wrong sequence size in constructor: " + num.ToString(), "sequence"); } DerInteger instance = DerInteger.GetInstance(sequence[0]); if (!instance.HasValue(1)) throw new ArgumentException("incompatible version"); m_version = instance; m_digestAlgorithms = Asn1Sequence.GetInstance(sequence[1]); for (int i = 2; i != sequence.Count - 1; i++) { Asn1Encodable asn1Encodable = sequence[i]; Asn1TaggedObject asn1TaggedObject = asn1Encodable as Asn1TaggedObject; if (asn1TaggedObject == null) throw new ArgumentException("unknown object in GetInstance: " + Platform.GetTypeName(asn1Encodable)); num = asn1TaggedObject.TagNo; switch (num) { case 0: m_cryptoInfos = CryptoInfos.GetInstance(asn1TaggedObject, false); break; case 1: m_encryptionInfo = EncryptionInfo.GetInstance(asn1TaggedObject, false); break; default: throw new ArgumentException("unknown tag in GetInstance: " + asn1TaggedObject.TagNo.ToString()); } } m_archiveTimeStampSequence = ArchiveTimeStampSequence.GetInstance(sequence[sequence.Count - 1]); } public virtual AlgorithmIdentifier[] GetDigestAlgorithms() { return m_digestAlgorithms.MapElements(AlgorithmIdentifier.GetInstance); } public virtual EvidenceRecord AddArchiveTimeStamp(ArchiveTimeStamp ats, bool newChain) { if (newChain) { ArchiveTimeStampChain chain = new ArchiveTimeStampChain(ats); return new EvidenceRecord(this, m_archiveTimeStampSequence.Append(chain), ats); } ArchiveTimeStampChain[] archiveTimeStampChains = m_archiveTimeStampSequence.GetArchiveTimeStampChains(); if (!archiveTimeStampChains[archiveTimeStampChains.Length - 1].GetArchiveTimestamps()[0].GetDigestAlgorithmIdentifier().Equals(ats.GetDigestAlgorithmIdentifier())) throw new ArgumentException("mismatch of digest algorithm in AddArchiveTimeStamp"); archiveTimeStampChains[archiveTimeStampChains.Length - 1] = archiveTimeStampChains[archiveTimeStampChains.Length - 1].Append(ats); return new EvidenceRecord(this, new ArchiveTimeStampSequence(archiveTimeStampChains), null); } public override Asn1Object ToAsn1Object() { Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector(5); asn1EncodableVector.Add(m_version); asn1EncodableVector.Add(m_digestAlgorithms); asn1EncodableVector.AddOptionalTagged(false, 0, m_cryptoInfos); asn1EncodableVector.AddOptionalTagged(false, 1, m_encryptionInfo); asn1EncodableVector.Add(m_archiveTimeStampSequence); return new DerSequence(asn1EncodableVector); } } }