public virtual bool Match(object obj)
{
X509Certificate x509Certificate = obj as X509Certificate;
if (x509Certificate == null)
{
return(false);
}
if (!X509CertStoreSelector.MatchExtension(this.authorityKeyIdentifier, x509Certificate, X509Extensions.AuthorityKeyIdentifier))
{
return(false);
}
if (this.basicConstraints != -1)
{
int num = x509Certificate.GetBasicConstraints();
if (this.basicConstraints == -2)
{
if (num != -1)
{
return(false);
}
}
else if (num < this.basicConstraints)
{
return(false);
}
}
if (this.certificate != null && !this.certificate.Equals(x509Certificate))
{
return(false);
}
if (this.certificateValid != null && !x509Certificate.IsValid(this.certificateValid.Value))
{
return(false);
}
if (this.extendedKeyUsage != null)
{
IList list = x509Certificate.GetExtendedKeyUsage();
if (list != null)
{
foreach (DerObjectIdentifier derObjectIdentifier in this.extendedKeyUsage)
{
if (!list.Contains(derObjectIdentifier.Id))
{
return(false);
}
}
}
}
if (this.issuer != null && !this.issuer.Equivalent(x509Certificate.IssuerDN, true))
{
return(false);
}
if (this.keyUsage != null)
{
bool[] array = x509Certificate.GetKeyUsage();
if (array != null)
{
for (int i = 0; i < 9; i++)
{
if (this.keyUsage[i] && !array[i])
{
return(false);
}
}
}
}
if (this.policy != null)
{
Asn1OctetString extensionValue = x509Certificate.GetExtensionValue(X509Extensions.CertificatePolicies);
if (extensionValue == null)
{
return(false);
}
Asn1Sequence instance = Asn1Sequence.GetInstance(X509ExtensionUtilities.FromExtensionValue(extensionValue));
if (this.policy.Count < 1 && instance.Count < 1)
{
return(false);
}
bool flag = false;
foreach (PolicyInformation policyInformation in instance)
{
if (this.policy.Contains(policyInformation.PolicyIdentifier))
{
flag = true;
break;
}
}
if (!flag)
{
return(false);
}
}
if (this.privateKeyValid != null)
{
Asn1OctetString extensionValue2 = x509Certificate.GetExtensionValue(X509Extensions.PrivateKeyUsagePeriod);
if (extensionValue2 == null)
{
return(false);
}
PrivateKeyUsagePeriod instance2 = PrivateKeyUsagePeriod.GetInstance(X509ExtensionUtilities.FromExtensionValue(extensionValue2));
DateTime value = this.privateKeyValid.Value;
DateTime value2 = instance2.NotAfter.ToDateTime();
DateTime value3 = instance2.NotBefore.ToDateTime();
if (value.CompareTo(value2) > 0 || value.CompareTo(value3) < 0)
{
return(false);
}
}
return((this.serialNumber == null || this.serialNumber.Equals(x509Certificate.SerialNumber)) && (this.subject == null || this.subject.Equivalent(x509Certificate.SubjectDN, true)) && X509CertStoreSelector.MatchExtension(this.subjectKeyIdentifier, x509Certificate, X509Extensions.SubjectKeyIdentifier) && (this.subjectPublicKey == null || this.subjectPublicKey.Equals(X509CertStoreSelector.GetSubjectPublicKey(x509Certificate))) && (this.subjectPublicKeyAlgID == null || this.subjectPublicKeyAlgID.Equals(X509CertStoreSelector.GetSubjectPublicKey(x509Certificate).AlgorithmID)));
}