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);
}
}
}