<PackageReference Include="BouncyCastle.Cryptography" Version="2.7.0-beta.98" />

LdsSecurityObject

using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.Math; using System; namespace Org.BouncyCastle.Asn1.Icao { public class LdsSecurityObject : Asn1Encodable { public const int UBDataGroups = 16; private readonly DerInteger m_version; private readonly AlgorithmIdentifier m_hashAlgorithm; private readonly DataGroupHash[] m_datagroupHashValues; private readonly LdsVersionInfo m_ldsVersionInfo; public BigInteger Version => m_version.Value; public AlgorithmIdentifier DigestAlgorithmIdentifier => m_hashAlgorithm; public LdsVersionInfo VersionInfo => m_ldsVersionInfo; public static LdsSecurityObject GetInstance(object obj) { if (obj == null) return null; LdsSecurityObject ldsSecurityObject = obj as LdsSecurityObject; if (ldsSecurityObject != null) return ldsSecurityObject; return new LdsSecurityObject(Asn1Sequence.GetInstance(obj)); } public static LdsSecurityObject GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit) { return new LdsSecurityObject(Asn1Sequence.GetInstance(taggedObject, declaredExplicit)); } public static LdsSecurityObject GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit) { return new LdsSecurityObject(Asn1Sequence.GetTagged(taggedObject, declaredExplicit)); } private LdsSecurityObject(Asn1Sequence seq) { int count = seq.Count; int sequencePosition = 0; if (count < 3 || count > 4) throw new ArgumentException("Bad sequence size: " + count.ToString(), "seq"); m_version = DerInteger.GetInstance(seq[sequencePosition++]); m_hashAlgorithm = AlgorithmIdentifier.GetInstance(seq[sequencePosition++]); m_datagroupHashValues = ConvertDataGroupHash(Asn1Sequence.GetInstance(seq[sequencePosition++])); m_ldsVersionInfo = Asn1Utilities.ReadOptional(seq, ref sequencePosition, LdsVersionInfo.GetOptional); if (sequencePosition != count) throw new ArgumentException("Unexpected elements in sequence", "seq"); if (m_ldsVersionInfo != null && !m_version.HasValue(1)) throw new ArgumentException("'ldsVersionInfo' is present, but 'version' is NOT 'v1'"); } public LdsSecurityObject(AlgorithmIdentifier digestAlgorithmIdentifier, DataGroupHash[] datagroupHash) { m_version = DerInteger.Zero; if (digestAlgorithmIdentifier == null) throw new ArgumentNullException("digestAlgorithmIdentifier"); m_hashAlgorithm = digestAlgorithmIdentifier; if (datagroupHash == null) throw new ArgumentNullException("datagroupHash"); m_datagroupHashValues = datagroupHash; m_ldsVersionInfo = null; CheckDatagroupHashCount(m_datagroupHashValues.Length); } public LdsSecurityObject(AlgorithmIdentifier digestAlgorithmIdentifier, DataGroupHash[] datagroupHash, LdsVersionInfo versionInfo) { m_version = DerInteger.One; if (digestAlgorithmIdentifier == null) throw new ArgumentNullException("digestAlgorithmIdentifier"); m_hashAlgorithm = digestAlgorithmIdentifier; if (datagroupHash == null) throw new ArgumentNullException("datagroupHash"); m_datagroupHashValues = datagroupHash; m_ldsVersionInfo = versionInfo; CheckDatagroupHashCount(m_datagroupHashValues.Length); } public DataGroupHash[] GetDatagroupHash() { return m_datagroupHashValues; } public override Asn1Object ToAsn1Object() { Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector(4); Asn1EncodableVector asn1EncodableVector2 = asn1EncodableVector; Asn1Encodable[] obj = new Asn1Encodable[3] { m_version, m_hashAlgorithm, null }; Asn1Encodable[] datagroupHashValues = m_datagroupHashValues; obj[2] = DerSequence.FromElements(datagroupHashValues); asn1EncodableVector2.Add(obj); asn1EncodableVector.AddOptional(m_ldsVersionInfo); return new DerSequence(asn1EncodableVector); } private static void CheckDatagroupHashCount(int count) { if (count < 2 || count > 16) throw new ArgumentException("wrong size in DataGroupHashValues : not in (2.." + 16.ToString() + ")"); } private static DataGroupHash[] ConvertDataGroupHash(Asn1Sequence seq) { CheckDatagroupHashCount(seq.Count); return seq.MapElements(DataGroupHash.GetInstance); } } }