using System; using Org.BouncyCastle.Asn1.Oiw; using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.Utilities; namespace Org.BouncyCastle.Asn1.Ess { [Obsolete("Use version in Asn1.Esf instead")] public class OtherCertID : Asn1Encodable { private Asn1Encodable otherCertHash; private IssuerSerial issuerSerial; public static OtherCertID GetInstance( object o) { if (o == null || o is OtherCertID) { return (OtherCertID) o; } if (o is Asn1Sequence) { return new OtherCertID((Asn1Sequence) o); } throw new ArgumentException( "unknown object in 'OtherCertID' factory : " + Platform.GetTypeName(o) + "."); } /** * constructor */ public OtherCertID( Asn1Sequence seq) { if (seq.Count < 1 || seq.Count > 2) { throw new ArgumentException("Bad sequence size: " + seq.Count); } if (seq[0].ToAsn1Object() is Asn1OctetString) { otherCertHash = Asn1OctetString.GetInstance(seq[0]); } else { otherCertHash = DigestInfo.GetInstance(seq[0]); } if (seq.Count > 1) { issuerSerial = IssuerSerial.GetInstance(Asn1Sequence.GetInstance(seq[1])); } } public OtherCertID( AlgorithmIdentifier algId, byte[] digest) { this.otherCertHash = new DigestInfo(algId, digest); } public OtherCertID( AlgorithmIdentifier algId, byte[] digest, IssuerSerial issuerSerial) { this.otherCertHash = new DigestInfo(algId, digest); this.issuerSerial = issuerSerial; } public AlgorithmIdentifier AlgorithmHash { get { if (otherCertHash.ToAsn1Object() is Asn1OctetString) { // SHA-1 return new AlgorithmIdentifier(OiwObjectIdentifiers.IdSha1); } return DigestInfo.GetInstance(otherCertHash).AlgorithmID; } } public byte[] GetCertHash() { if (otherCertHash.ToAsn1Object() is Asn1OctetString) { // SHA-1 return ((Asn1OctetString) otherCertHash.ToAsn1Object()).GetOctets(); } return DigestInfo.GetInstance(otherCertHash).GetDigest(); } public IssuerSerial IssuerSerial { get { return issuerSerial; } } /** *
		 * OtherCertID ::= SEQUENCE {
		 *     otherCertHash    OtherHash,
		 *     issuerSerial     IssuerSerial OPTIONAL }
		 *
		 * OtherHash ::= CHOICE {
		 *     sha1Hash     OCTET STRING,
		 *     otherHash    OtherHashAlgAndValue }
		 *
		 * OtherHashAlgAndValue ::= SEQUENCE {
		 *     hashAlgorithm    AlgorithmIdentifier,
		 *     hashValue        OCTET STRING }
		 *
		 * 
*/ public override Asn1Object ToAsn1Object() { Asn1EncodableVector v = new Asn1EncodableVector(otherCertHash); v.AddOptional(issuerSerial); return new DerSequence(v); } } }