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

PartialHashtree

using Org.BouncyCastle.Utilities; using System; namespace Org.BouncyCastle.Asn1.Tsp { public class PartialHashtree : Asn1Encodable { private readonly Asn1Sequence m_values; public virtual int ValueCount => m_values.Count; public static PartialHashtree GetInstance(object obj) { if (obj == null) return null; PartialHashtree partialHashtree = obj as PartialHashtree; if (partialHashtree != null) return partialHashtree; return new PartialHashtree(Asn1Sequence.GetInstance(obj)); } public static PartialHashtree GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit) { return new PartialHashtree(Asn1Sequence.GetInstance(taggedObject, declaredExplicit)); } public static PartialHashtree GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit) { return new PartialHashtree(Asn1Sequence.GetTagged(taggedObject, declaredExplicit)); } private PartialHashtree(Asn1Sequence values) { for (int i = 0; i != values.Count; i++) { if (!(values[i] is Asn1OctetString)) throw new ArgumentException("unknown object in constructor: " + Platform.GetTypeName(values[i])); } m_values = values; } public PartialHashtree(params byte[][] values) { m_values = DerSequence.Map(values, DerOctetString.FromContents); } public virtual byte[][] GetValues() { return m_values.MapElements((Asn1Encodable element) => Arrays.Clone(Asn1OctetString.GetInstance(element).GetOctets())); } public virtual bool ContainsHash(byte[] hash) { foreach (Asn1OctetString value in m_values) { byte[] octets = value.GetOctets(); if (Arrays.FixedTimeEquals(hash, octets)) return true; } return false; } public override Asn1Object ToAsn1Object() { return m_values; } } }