using System; using System.Collections; using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.Security; using Org.BouncyCastle.Utilities; using Org.BouncyCastle.X509.Store; namespace Org.BouncyCastle.X509 { /** * Carrying class for an attribute certificate issuer. */ public class AttributeCertificateIssuer //: CertSelector, Selector : IX509Selector { internal readonly Asn1Encodable form; /** * Set the issuer directly with the ASN.1 structure. * * @param issuer The issuer */ public AttributeCertificateIssuer( AttCertIssuer issuer) { form = issuer.Issuer; } public AttributeCertificateIssuer( X509Name principal) { // form = new V2Form(GeneralNames.GetInstance(new DerSequence(new GeneralName(principal)))); form = new V2Form(new GeneralNames(new GeneralName(principal))); } private object[] GetNames() { GeneralNames name; if (form is V2Form) { name = ((V2Form)form).IssuerName; } else { name = (GeneralNames)form; } GeneralName[] names = name.GetNames(); int count = 0; for (int i = 0; i != names.Length; i++) { if (names[i].TagNo == GeneralName.DirectoryName) { ++count; } } object[] result = new object[count]; int pos = 0; for (int i = 0; i != names.Length; i++) { if (names[i].TagNo == GeneralName.DirectoryName) { result[pos++] = X509Name.GetInstance(names[i].Name); } } return result; } /// Return any principal objects inside the attribute certificate issuer object. /// An array of IPrincipal objects (usually X509Principal). public X509Name[] GetPrincipals() { object[] p = this.GetNames(); int count = 0; for (int i = 0; i != p.Length; i++) { if (p[i] is X509Name) { ++count; } } X509Name[] result = new X509Name[count]; int pos = 0; for (int i = 0; i != p.Length; i++) { if (p[i] is X509Name) { result[pos++] = (X509Name)p[i]; } } return result; } private bool MatchesDN( X509Name subject, GeneralNames targets) { GeneralName[] names = targets.GetNames(); for (int i = 0; i != names.Length; i++) { GeneralName gn = names[i]; if (gn.TagNo == GeneralName.DirectoryName) { try { if (X509Name.GetInstance(gn.Name).Equivalent(subject)) { return true; } } catch (Exception) { } } } return false; } public object Clone() { return new AttributeCertificateIssuer(AttCertIssuer.GetInstance(form)); } public bool Match( X509Certificate x509Cert) { if (form is V2Form) { V2Form issuer = (V2Form) form; if (issuer.BaseCertificateID != null) { return issuer.BaseCertificateID.Serial.HasValue(x509Cert.SerialNumber) && MatchesDN(x509Cert.IssuerDN, issuer.BaseCertificateID.Issuer); } return MatchesDN(x509Cert.SubjectDN, issuer.IssuerName); } return MatchesDN(x509Cert.SubjectDN, (GeneralNames) form); } public override bool Equals( object obj) { if (obj == this) { return true; } if (!(obj is AttributeCertificateIssuer)) { return false; } AttributeCertificateIssuer other = (AttributeCertificateIssuer)obj; return this.form.Equals(other.form); } public override int GetHashCode() { return this.form.GetHashCode(); } public bool Match( object obj) { if (!(obj is X509Certificate)) { return false; } //return Match((Certificate)obj); return Match((X509Certificate)obj); } } }