ObjectDigestInfo
using System;
namespace Org.BouncyCastle.Asn1.X509
{
public class ObjectDigestInfo : Asn1Encodable
{
public const int PublicKey = 0;
public const int PublicKeyCert = 1;
public const int OtherObjectDigest = 2;
private readonly DerEnumerated m_digestedObjectType;
private readonly DerObjectIdentifier m_otherObjectTypeID;
private readonly AlgorithmIdentifier m_digestAlgorithm;
private readonly DerBitString m_objectDigest;
public DerEnumerated DigestedObjectType => m_digestedObjectType;
public DerObjectIdentifier OtherObjectTypeID => m_otherObjectTypeID;
public AlgorithmIdentifier DigestAlgorithm => m_digestAlgorithm;
public DerBitString ObjectDigest => m_objectDigest;
public static ObjectDigestInfo GetInstance(object obj)
{
if (obj == null)
return null;
ObjectDigestInfo objectDigestInfo = obj as ObjectDigestInfo;
if (objectDigestInfo != null)
return objectDigestInfo;
return new ObjectDigestInfo(Asn1Sequence.GetInstance(obj));
}
public static ObjectDigestInfo GetInstance(Asn1TaggedObject obj, bool isExplicit)
{
return new ObjectDigestInfo(Asn1Sequence.GetInstance(obj, isExplicit));
}
public static ObjectDigestInfo GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return new ObjectDigestInfo(Asn1Sequence.GetTagged(taggedObject, declaredExplicit));
}
private ObjectDigestInfo(Asn1Sequence seq)
{
int count = seq.Count;
int sequencePosition = 0;
if (count < 3 || count > 4)
throw new ArgumentException("Bad sequence size: " + count.ToString(), "seq");
m_digestedObjectType = DerEnumerated.GetInstance(seq[sequencePosition++]);
m_otherObjectTypeID = Asn1Utilities.ReadOptional(seq, ref sequencePosition, DerObjectIdentifier.GetOptional);
m_digestAlgorithm = AlgorithmIdentifier.GetInstance(seq[sequencePosition++]);
m_objectDigest = DerBitString.GetInstance(seq[sequencePosition++]);
if (sequencePosition != count)
throw new ArgumentException("Unexpected elements in sequence", "seq");
}
public ObjectDigestInfo(int digestedObjectType, string otherObjectTypeID, AlgorithmIdentifier digestAlgorithm, byte[] objectDigest)
{
m_digestedObjectType = new DerEnumerated(digestedObjectType);
if (digestedObjectType == 2)
m_otherObjectTypeID = new DerObjectIdentifier(otherObjectTypeID);
if (digestAlgorithm == null)
throw new ArgumentNullException("digestAlgorithm");
m_digestAlgorithm = digestAlgorithm;
m_objectDigest = new DerBitString(objectDigest);
}
public override Asn1Object ToAsn1Object()
{
if (m_otherObjectTypeID != null)
return new DerSequence(m_digestedObjectType, m_otherObjectTypeID, m_digestAlgorithm, m_objectDigest);
return new DerSequence(m_digestedObjectType, m_digestAlgorithm, m_objectDigest);
}
}
}