Exemple #1
0
 protected virtual void SetParams(PkixParameters parameters)
 {
     Date = parameters.Date;
     SetCertPathCheckers(parameters.GetCertPathCheckers());
     IsAnyPolicyInhibited     = parameters.IsAnyPolicyInhibited;
     IsExplicitPolicyRequired = parameters.IsExplicitPolicyRequired;
     IsPolicyMappingInhibited = parameters.IsPolicyMappingInhibited;
     IsRevocationEnabled      = parameters.IsRevocationEnabled;
     SetInitialPolicies(parameters.GetInitialPolicies());
     IsPolicyQualifiersRejected = parameters.IsPolicyQualifiersRejected;
     SetTargetCertConstraints(parameters.GetTargetCertConstraints());
     SetTrustAnchors(parameters.GetTrustAnchors());
     validityModel = parameters.validityModel;
     useDeltas     = parameters.useDeltas;
     additionalLocationsEnabled = parameters.additionalLocationsEnabled;
     selector               = ((parameters.selector == null) ? null : ((IX509Selector)parameters.selector.Clone()));
     stores                 = Platform.CreateArrayList(parameters.stores);
     additionalStores       = Platform.CreateArrayList(parameters.additionalStores);
     trustedACIssuers       = new HashSet(parameters.trustedACIssuers);
     prohibitedACAttributes = new HashSet(parameters.prohibitedACAttributes);
     necessaryACAttributes  = new HashSet(parameters.necessaryACAttributes);
     attrCertCheckers       = new HashSet(parameters.attrCertCheckers);
 }
 internal static DateTime GetValidCertDateFromValidityModel(PkixParameters paramsPkix, PkixCertPath certPath, int index)
 {
     if (paramsPkix.ValidityModel != 1)
     {
         return(GetValidDate(paramsPkix));
     }
     if (index <= 0)
     {
         return(GetValidDate(paramsPkix));
     }
     if (index - 1 == 0)
     {
         DerGeneralizedTime derGeneralizedTime = null;
         try
         {
             X509Certificate x509Certificate = (X509Certificate)certPath.Certificates[index - 1];
             Asn1OctetString extensionValue  = x509Certificate.GetExtensionValue(IsisMttObjectIdentifiers.IdIsisMttATDateOfCertGen);
             derGeneralizedTime = DerGeneralizedTime.GetInstance(extensionValue);
         }
         catch (ArgumentException)
         {
             throw new Exception("Date of cert gen extension could not be read.");
         }
         if (derGeneralizedTime != null)
         {
             try
             {
                 return(derGeneralizedTime.ToDateTime());
             }
             catch (ArgumentException innerException)
             {
                 throw new Exception("Date from date of cert gen extension could not be parsed.", innerException);
             }
         }
     }
     return(((X509Certificate)certPath.Certificates[index - 1]).NotBefore);
 }
        /// <summary>
        ///
        /// </summary>
        /// <param name="certificateChain"></param>
        /// <exception cref="PkixCertPathValidatorException"></exception>
        /// <exception cref="CryptographicException"></exception>
        public SigningCertificate(string certificateChain)
        {
            StringReader           stringReader = new StringReader(certificateChain);
            PemReader              pemReader    = new PemReader(stringReader);
            List <X509Certificate> certificates = new List <X509Certificate>();

            X509Certificate certificate;

            while ((certificate = (X509Certificate)pemReader.ReadObject()) != null)
            {
                certificates.Add(certificate);
            }

            path = new PkixCertPath(certificates);

            Org.BouncyCastle.Utilities.Collections.ISet trustAnchors = new Org.BouncyCastle.Utilities.Collections.HashSet(new TrustAnchor[] { new TrustAnchor(certificates.Last(), null) });
            PkixParameters pkixParameters = new PkixParameters(trustAnchors);

            pkixParameters.IsRevocationEnabled = false;
            PkixCertPathValidator certPathValidator = new PkixCertPathValidator();

            certPathValidator.Validate(path, pkixParameters);
            VerifyDistinguishedName(path);
        }
        public override void PerformTest()
        {
            X509CertificateParser certParser = new X509CertificateParser();
            X509CrlParser         crlParser  = new X509CrlParser();

            // initialise CertStore
            X509Certificate rootCert  = certParser.ReadCertificate(CertPathTest.rootCertBin);
            X509Certificate interCert = certParser.ReadCertificate(CertPathTest.interCertBin);
            X509Certificate finalCert = certParser.ReadCertificate(CertPathTest.finalCertBin);
            X509Crl         rootCrl   = crlParser.ReadCrl(CertPathTest.rootCrlBin);
            X509Crl         interCrl  = crlParser.ReadCrl(CertPathTest.interCrlBin);

            IList x509Certs = new ArrayList();

            x509Certs.Add(rootCert);
            x509Certs.Add(interCert);
            x509Certs.Add(finalCert);

            IList x509Crls = new ArrayList();

            x509Crls.Add(rootCrl);
            x509Crls.Add(interCrl);

//			CollectionCertStoreParameters ccsp = new CollectionCertStoreParameters(list);
//			CertStore store = CertStore.GetInstance("Collection", ccsp);
//			X509CollectionStoreParameters ccsp = new X509CollectionStoreParameters(list);
            IX509Store x509CertStore = X509StoreFactory.Create(
                "Certificate/Collection",
                new X509CollectionStoreParameters(x509Certs));
            IX509Store x509CrlStore = X509StoreFactory.Create(
                "CRL/Collection",
                new X509CollectionStoreParameters(x509Crls));

            // NB: Month is 1-based in .NET
            //DateTime validDate = new DateTime(2008,9,4,14,49,10).ToUniversalTime();
            DateTime validDate = new DateTime(2008, 9, 4, 5, 49, 10);

            //validating path
            IList certchain = new ArrayList();

            certchain.Add(finalCert);
            certchain.Add(interCert);

//			CertPath cp = CertificateFactory.GetInstance("X.509").GenerateCertPath(certchain);
            PkixCertPath cp    = new PkixCertPath(certchain);
            ISet         trust = new HashSet();

            trust.Add(new TrustAnchor(rootCert, null));

//			CertPathValidator cpv = CertPathValidator.GetInstance("PKIX");
            PkixCertPathValidator cpv   = new PkixCertPathValidator();
            PkixParameters        param = new PkixParameters(trust);

            param.AddStore(x509CertStore);
            param.AddStore(x509CrlStore);
            param.Date = new DateTimeObject(validDate);
            MyChecker checker = new MyChecker();

            param.AddCertPathChecker(checker);

            PkixCertPathValidatorResult result      = (PkixCertPathValidatorResult)cpv.Validate(cp, param);
            PkixPolicyNode         policyTree       = result.PolicyTree;
            AsymmetricKeyParameter subjectPublicKey = result.SubjectPublicKey;

            if (checker.GetCount() != 2)
            {
                Fail("checker not evaluated for each certificate");
            }

            if (!subjectPublicKey.Equals(finalCert.GetPublicKey()))
            {
                Fail("wrong public key returned");
            }

            IsTrue(result.TrustAnchor.TrustedCert.Equals(rootCert));

            // try a path with trust anchor included.
            certchain.Clear();
            certchain.Add(finalCert);
            certchain.Add(interCert);
            certchain.Add(rootCert);

            cp = new PkixCertPath(certchain);

            cpv   = new PkixCertPathValidator();
            param = new PkixParameters(trust);
            param.AddStore(x509CertStore);
            param.AddStore(x509CrlStore);
            param.Date = new DateTimeObject(validDate);
            checker    = new MyChecker();
            param.AddCertPathChecker(checker);

            result = (PkixCertPathValidatorResult)cpv.Validate(cp, param);

            IsTrue(result.TrustAnchor.TrustedCert.Equals(rootCert));

            //
            // invalid path containing a valid one test
            //
            try
            {
                // initialise CertStore
                rootCert  = certParser.ReadCertificate(AC_RAIZ_ICPBRASIL);
                interCert = certParser.ReadCertificate(AC_PR);
                finalCert = certParser.ReadCertificate(schefer);

                x509Certs = new ArrayList();
                x509Certs.Add(rootCert);
                x509Certs.Add(interCert);
                x509Certs.Add(finalCert);

//				ccsp = new CollectionCertStoreParameters(list);
//				store = CertStore.GetInstance("Collection", ccsp);
//				ccsp = new X509CollectionStoreParameters(list);
                x509CertStore = X509StoreFactory.Create(
                    "Certificate/Collection",
                    new X509CollectionStoreParameters(x509Certs));

                // NB: Month is 1-based in .NET
                //validDate = new DateTime(2004,3,21,2,21,10).ToUniversalTime();
                validDate = new DateTime(2004, 3, 20, 19, 21, 10);

                //validating path
                certchain = new ArrayList();
                certchain.Add(finalCert);
                certchain.Add(interCert);

//				cp = CertificateFactory.GetInstance("X.509").GenerateCertPath(certchain);
                cp    = new PkixCertPath(certchain);
                trust = new HashSet();
                trust.Add(new TrustAnchor(rootCert, null));

//				cpv = CertPathValidator.GetInstance("PKIX");
                cpv   = new PkixCertPathValidator();
                param = new PkixParameters(trust);
                param.AddStore(x509CertStore);
                param.IsRevocationEnabled = false;
                param.Date = new DateTimeObject(validDate);

                result           = (PkixCertPathValidatorResult)cpv.Validate(cp, param);
                policyTree       = result.PolicyTree;
                subjectPublicKey = result.SubjectPublicKey;

                Fail("Invalid path validated");
            }
            catch (Exception e)
            {
                if (e is PkixCertPathValidatorException &&
                    e.Message.StartsWith("Could not validate certificate signature."))
                {
                    return;
                }
                Fail("unexpected exception", e);
            }
        }
    public virtual PkixCertPathValidatorResult Validate(PkixCertPath certPath, PkixParameters paramsPkix)
    {
        if (paramsPkix.GetTrustAnchors() == null)
        {
            throw new ArgumentException("trustAnchors is null, this is not allowed for certification path validation.", "parameters");
        }
        IList certificates = certPath.Certificates;
        int   count        = certificates.Count;

        if (certificates.Count == 0)
        {
            throw new PkixCertPathValidatorException("Certification path is empty.", null, certPath, 0);
        }
        ISet        initialPolicies = paramsPkix.GetInitialPolicies();
        TrustAnchor trustAnchor;

        try
        {
            trustAnchor = PkixCertPathValidatorUtilities.FindTrustAnchor((X509Certificate)certificates[certificates.Count - 1], paramsPkix.GetTrustAnchors());
        }
        catch (Exception ex)
        {
            throw new PkixCertPathValidatorException(ex.Message, ex, certPath, certificates.Count - 1);
        }
        if (trustAnchor == null)
        {
            throw new PkixCertPathValidatorException("Trust anchor for certification path not found.", null, certPath, -1);
        }
        int num = 0;

        IList[] array = new IList[count + 1];
        for (int i = 0; i < array.Length; i++)
        {
            array[i] = Platform.CreateArrayList();
        }
        ISet set = new HashSet();

        set.Add(Rfc3280CertPathUtilities.ANY_POLICY);
        PkixPolicyNode pkixPolicyNode = new PkixPolicyNode(Platform.CreateArrayList(), 0, set, null, new HashSet(), Rfc3280CertPathUtilities.ANY_POLICY, critical: false);

        array[0].Add(pkixPolicyNode);
        PkixNameConstraintValidator nameConstraintValidator = new PkixNameConstraintValidator();
        ISet                   acceptablePolicies           = new HashSet();
        int                    explicitPolicy   = (!paramsPkix.IsExplicitPolicyRequired) ? (count + 1) : 0;
        int                    inhibitAnyPolicy = (!paramsPkix.IsAnyPolicyInhibited) ? (count + 1) : 0;
        int                    policyMapping    = (!paramsPkix.IsPolicyMappingInhibited) ? (count + 1) : 0;
        X509Certificate        x509Certificate  = trustAnchor.TrustedCert;
        X509Name               workingIssuerName;
        AsymmetricKeyParameter asymmetricKeyParameter;

        try
        {
            if (x509Certificate != null)
            {
                workingIssuerName      = x509Certificate.SubjectDN;
                asymmetricKeyParameter = x509Certificate.GetPublicKey();
            }
            else
            {
                workingIssuerName      = new X509Name(trustAnchor.CAName);
                asymmetricKeyParameter = trustAnchor.CAPublicKey;
            }
        }
        catch (ArgumentException cause)
        {
            throw new PkixCertPathValidatorException("Subject of trust anchor could not be (re)encoded.", cause, certPath, -1);
        }
        try
        {
            PkixCertPathValidatorUtilities.GetAlgorithmIdentifier(asymmetricKeyParameter);
        }
        catch (PkixCertPathValidatorException cause2)
        {
            throw new PkixCertPathValidatorException("Algorithm identifier of public key of trust anchor could not be read.", cause2, certPath, -1);
        }
        int maxPathLength = count;
        X509CertStoreSelector targetCertConstraints = paramsPkix.GetTargetCertConstraints();

        if (targetCertConstraints != null && !targetCertConstraints.Match((X509Certificate)certificates[0]))
        {
            throw new PkixCertPathValidatorException("Target certificate in certification path does not match targetConstraints.", null, certPath, 0);
        }
        IList       certPathCheckers = paramsPkix.GetCertPathCheckers();
        IEnumerator enumerator       = certPathCheckers.GetEnumerator();

        while (enumerator.MoveNext())
        {
            ((PkixCertPathChecker)enumerator.Current).Init(forward: false);
        }
        X509Certificate x509Certificate2 = null;

        for (num = certificates.Count - 1; num >= 0; num--)
        {
            int num2 = count - num;
            x509Certificate2 = (X509Certificate)certificates[num];
            Rfc3280CertPathUtilities.ProcessCertA(certPath, paramsPkix, num, asymmetricKeyParameter, workingIssuerName, x509Certificate);
            Rfc3280CertPathUtilities.ProcessCertBC(certPath, num, nameConstraintValidator);
            pkixPolicyNode = Rfc3280CertPathUtilities.ProcessCertD(certPath, num, acceptablePolicies, pkixPolicyNode, array, inhibitAnyPolicy);
            pkixPolicyNode = Rfc3280CertPathUtilities.ProcessCertE(certPath, num, pkixPolicyNode);
            Rfc3280CertPathUtilities.ProcessCertF(certPath, num, pkixPolicyNode, explicitPolicy);
            if (num2 != count)
            {
                if (x509Certificate2 != null && x509Certificate2.Version == 1)
                {
                    throw new PkixCertPathValidatorException("Version 1 certificates can't be used as CA ones.", null, certPath, num);
                }
                Rfc3280CertPathUtilities.PrepareNextCertA(certPath, num);
                pkixPolicyNode = Rfc3280CertPathUtilities.PrepareCertB(certPath, num, array, pkixPolicyNode, policyMapping);
                Rfc3280CertPathUtilities.PrepareNextCertG(certPath, num, nameConstraintValidator);
                explicitPolicy   = Rfc3280CertPathUtilities.PrepareNextCertH1(certPath, num, explicitPolicy);
                policyMapping    = Rfc3280CertPathUtilities.PrepareNextCertH2(certPath, num, policyMapping);
                inhibitAnyPolicy = Rfc3280CertPathUtilities.PrepareNextCertH3(certPath, num, inhibitAnyPolicy);
                explicitPolicy   = Rfc3280CertPathUtilities.PrepareNextCertI1(certPath, num, explicitPolicy);
                policyMapping    = Rfc3280CertPathUtilities.PrepareNextCertI2(certPath, num, policyMapping);
                inhibitAnyPolicy = Rfc3280CertPathUtilities.PrepareNextCertJ(certPath, num, inhibitAnyPolicy);
                Rfc3280CertPathUtilities.PrepareNextCertK(certPath, num);
                maxPathLength = Rfc3280CertPathUtilities.PrepareNextCertL(certPath, num, maxPathLength);
                maxPathLength = Rfc3280CertPathUtilities.PrepareNextCertM(certPath, num, maxPathLength);
                Rfc3280CertPathUtilities.PrepareNextCertN(certPath, num);
                ISet criticalExtensionOids = x509Certificate2.GetCriticalExtensionOids();
                if (criticalExtensionOids != null)
                {
                    criticalExtensionOids = new HashSet(criticalExtensionOids);
                    criticalExtensionOids.Remove(X509Extensions.KeyUsage.Id);
                    criticalExtensionOids.Remove(X509Extensions.CertificatePolicies.Id);
                    criticalExtensionOids.Remove(X509Extensions.PolicyMappings.Id);
                    criticalExtensionOids.Remove(X509Extensions.InhibitAnyPolicy.Id);
                    criticalExtensionOids.Remove(X509Extensions.IssuingDistributionPoint.Id);
                    criticalExtensionOids.Remove(X509Extensions.DeltaCrlIndicator.Id);
                    criticalExtensionOids.Remove(X509Extensions.PolicyConstraints.Id);
                    criticalExtensionOids.Remove(X509Extensions.BasicConstraints.Id);
                    criticalExtensionOids.Remove(X509Extensions.SubjectAlternativeName.Id);
                    criticalExtensionOids.Remove(X509Extensions.NameConstraints.Id);
                }
                else
                {
                    criticalExtensionOids = new HashSet();
                }
                Rfc3280CertPathUtilities.PrepareNextCertO(certPath, num, criticalExtensionOids, certPathCheckers);
                x509Certificate   = x509Certificate2;
                workingIssuerName = x509Certificate.SubjectDN;
                try
                {
                    asymmetricKeyParameter = PkixCertPathValidatorUtilities.GetNextWorkingKey(certPath.Certificates, num);
                }
                catch (PkixCertPathValidatorException cause3)
                {
                    throw new PkixCertPathValidatorException("Next working key could not be retrieved.", cause3, certPath, num);
                }
                PkixCertPathValidatorUtilities.GetAlgorithmIdentifier(asymmetricKeyParameter);
            }
        }
        explicitPolicy = Rfc3280CertPathUtilities.WrapupCertA(explicitPolicy, x509Certificate2);
        explicitPolicy = Rfc3280CertPathUtilities.WrapupCertB(certPath, num + 1, explicitPolicy);
        ISet criticalExtensionOids2 = x509Certificate2.GetCriticalExtensionOids();

        if (criticalExtensionOids2 != null)
        {
            criticalExtensionOids2 = new HashSet(criticalExtensionOids2);
            criticalExtensionOids2.Remove(X509Extensions.KeyUsage.Id);
            criticalExtensionOids2.Remove(X509Extensions.CertificatePolicies.Id);
            criticalExtensionOids2.Remove(X509Extensions.PolicyMappings.Id);
            criticalExtensionOids2.Remove(X509Extensions.InhibitAnyPolicy.Id);
            criticalExtensionOids2.Remove(X509Extensions.IssuingDistributionPoint.Id);
            criticalExtensionOids2.Remove(X509Extensions.DeltaCrlIndicator.Id);
            criticalExtensionOids2.Remove(X509Extensions.PolicyConstraints.Id);
            criticalExtensionOids2.Remove(X509Extensions.BasicConstraints.Id);
            criticalExtensionOids2.Remove(X509Extensions.SubjectAlternativeName.Id);
            criticalExtensionOids2.Remove(X509Extensions.NameConstraints.Id);
            criticalExtensionOids2.Remove(X509Extensions.CrlDistributionPoints.Id);
        }
        else
        {
            criticalExtensionOids2 = new HashSet();
        }
        Rfc3280CertPathUtilities.WrapupCertF(certPath, num + 1, certPathCheckers, criticalExtensionOids2);
        PkixPolicyNode pkixPolicyNode2 = Rfc3280CertPathUtilities.WrapupCertG(certPath, paramsPkix, initialPolicies, num + 1, array, pkixPolicyNode, acceptablePolicies);

        if (explicitPolicy > 0 || pkixPolicyNode2 != null)
        {
            return(new PkixCertPathValidatorResult(trustAnchor, pkixPolicyNode2, x509Certificate2.GetPublicKey()));
        }
        throw new PkixCertPathValidatorException("Path processing failed on policy.", null, certPath, num);
    }
 internal static void AddAdditionalStoresFromCrlDistributionPoint(CrlDistPoint crldp, PkixParameters pkixParams)
 {
     if (crldp == null)
     {
         return;
     }
     DistributionPoint[] array = null;
     try
     {
         array = crldp.GetDistributionPoints();
     }
     catch (Exception innerException)
     {
         throw new Exception("Distribution points could not be read.", innerException);
     }
     for (int i = 0; i < array.Length; i++)
     {
         DistributionPointName distributionPointName = array[i].DistributionPointName;
         if (distributionPointName == null || distributionPointName.PointType != 0)
         {
             continue;
         }
         GeneralName[] names = GeneralNames.GetInstance(distributionPointName.Name).GetNames();
         for (int j = 0; j < names.Length; j++)
         {
             if (names[j].TagNo == 6)
             {
                 string @string = DerIA5String.GetInstance(names[j].Name).GetString();
                 AddAdditionalStoreFromLocation(@string, pkixParams);
             }
         }
     }
 }
    internal static ISet GetCompleteCrls(DistributionPoint dp, object cert, DateTime currentDate, PkixParameters paramsPKIX)
    {
        X509CrlStoreSelector x509CrlStoreSelector = new X509CrlStoreSelector();

        try
        {
            ISet set = new HashSet();
            if (cert is X509V2AttributeCertificate)
            {
                set.Add(((X509V2AttributeCertificate)cert).Issuer.GetPrincipals()[0]);
            }
            else
            {
                set.Add(GetIssuerPrincipal(cert));
            }
            GetCrlIssuersFromDistributionPoint(dp, set, x509CrlStoreSelector, paramsPKIX);
        }
        catch (Exception innerException)
        {
            throw new Exception("Could not get issuer information from distribution point.", innerException);
        }
        if (cert is X509Certificate)
        {
            x509CrlStoreSelector.CertificateChecking = (X509Certificate)cert;
        }
        else if (cert is X509V2AttributeCertificate)
        {
            x509CrlStoreSelector.AttrCertChecking = (IX509AttributeCertificate)cert;
        }
        x509CrlStoreSelector.CompleteCrlEnabled = true;
        ISet set2 = CrlUtilities.FindCrls(x509CrlStoreSelector, paramsPKIX, currentDate);

        if (set2.IsEmpty)
        {
            if (cert is IX509AttributeCertificate)
            {
                IX509AttributeCertificate iX509AttributeCertificate = (IX509AttributeCertificate)cert;
                throw new Exception("No CRLs found for issuer \"" + iX509AttributeCertificate.Issuer.GetPrincipals()[0] + "\"");
            }
            X509Certificate x509Certificate = (X509Certificate)cert;
            throw new Exception("No CRLs found for issuer \"" + x509Certificate.IssuerDN + "\"");
        }
        return(set2);
    }
    internal static void GetCrlIssuersFromDistributionPoint(DistributionPoint dp, ICollection issuerPrincipals, X509CrlStoreSelector selector, PkixParameters pkixParams)
    {
        IList list = Platform.CreateArrayList();

        if (dp.CrlIssuer != null)
        {
            GeneralName[] names = dp.CrlIssuer.GetNames();
            for (int i = 0; i < names.Length; i++)
            {
                if (names[i].TagNo == 4)
                {
                    try
                    {
                        list.Add(X509Name.GetInstance(names[i].Name.ToAsn1Object()));
                    }
                    catch (IOException innerException)
                    {
                        throw new Exception("CRL issuer information from distribution point cannot be decoded.", innerException);
                    }
                }
            }
        }
        else
        {
            if (dp.DistributionPointName == null)
            {
                throw new Exception("CRL issuer is omitted from distribution point but no distributionPoint field present.");
            }
            IEnumerator enumerator = issuerPrincipals.GetEnumerator();
            while (enumerator.MoveNext())
            {
                list.Add((X509Name)enumerator.Current);
            }
        }
        selector.Issuers = list;
    }
 internal static DateTime GetValidDate(PkixParameters paramsPKIX)
 {
     return(paramsPKIX.Date?.Value ?? DateTime.UtcNow);
 }
 internal static void CheckCrls(IX509AttributeCertificate attrCert, PkixParameters paramsPKIX, X509Certificate issuerCert, DateTime validDate, IList certPathCerts)
 {
     if (!paramsPKIX.IsRevocationEnabled)
     {
         return;
     }
     if (attrCert.GetExtensionValue(X509Extensions.NoRevAvail) == null)
     {
         CrlDistPoint crlDistPoint = null;
         try
         {
             crlDistPoint = CrlDistPoint.GetInstance(PkixCertPathValidatorUtilities.GetExtensionValue(attrCert, X509Extensions.CrlDistributionPoints));
         }
         catch (Exception cause)
         {
             throw new PkixCertPathValidatorException("CRL distribution point extension could not be read.", cause);
         }
         try
         {
             PkixCertPathValidatorUtilities.AddAdditionalStoresFromCrlDistributionPoint(crlDistPoint, paramsPKIX);
         }
         catch (Exception cause2)
         {
             throw new PkixCertPathValidatorException("No additional CRL locations could be decoded from CRL distribution point extension.", cause2);
         }
         CertStatus  certStatus  = new CertStatus();
         ReasonsMask reasonsMask = new ReasonsMask();
         Exception   cause3      = null;
         bool        flag        = false;
         if (crlDistPoint != null)
         {
             DistributionPoint[] array = null;
             try
             {
                 array = crlDistPoint.GetDistributionPoints();
             }
             catch (Exception cause4)
             {
                 throw new PkixCertPathValidatorException("Distribution points could not be read.", cause4);
             }
             try
             {
                 for (int i = 0; i < array.Length; i++)
                 {
                     if (certStatus.Status != 11)
                     {
                         break;
                     }
                     if (reasonsMask.IsAllReasons)
                     {
                         break;
                     }
                     PkixParameters paramsPKIX2 = (PkixParameters)paramsPKIX.Clone();
                     CheckCrl(array[i], attrCert, paramsPKIX2, validDate, issuerCert, certStatus, reasonsMask, certPathCerts);
                     flag = true;
                 }
             }
             catch (Exception innerException)
             {
                 cause3 = new Exception("No valid CRL for distribution point found.", innerException);
             }
         }
         if (certStatus.Status == 11 && !reasonsMask.IsAllReasons)
         {
             try
             {
                 Asn1Object asn1Object = null;
                 try
                 {
                     asn1Object = new Asn1InputStream(attrCert.Issuer.GetPrincipals()[0].GetEncoded()).ReadObject();
                 }
                 catch (Exception innerException2)
                 {
                     throw new Exception("Issuer from certificate for CRL could not be reencoded.", innerException2);
                 }
                 DistributionPoint dp          = new DistributionPoint(new DistributionPointName(0, new GeneralNames(new GeneralName(4, asn1Object))), null, null);
                 PkixParameters    paramsPKIX3 = (PkixParameters)paramsPKIX.Clone();
                 CheckCrl(dp, attrCert, paramsPKIX3, validDate, issuerCert, certStatus, reasonsMask, certPathCerts);
                 flag = true;
             }
             catch (Exception innerException3)
             {
                 cause3 = new Exception("No valid CRL for distribution point found.", innerException3);
             }
         }
         if (!flag)
         {
             throw new PkixCertPathValidatorException("No valid CRL found.", cause3);
         }
         if (certStatus.Status != 11)
         {
             string str  = certStatus.RevocationDate.Value.ToString("ddd MMM dd HH:mm:ss K yyyy");
             string str2 = "Attribute certificate revocation after " + str;
             str2 = str2 + ", reason: " + Rfc3280CertPathUtilities.CrlReasons[certStatus.Status];
             throw new PkixCertPathValidatorException(str2);
         }
         if (!reasonsMask.IsAllReasons && certStatus.Status == 11)
         {
             certStatus.Status = 12;
         }
         if (certStatus.Status == 12)
         {
             throw new PkixCertPathValidatorException("Attribute certificate status could not be determined.");
         }
     }
     else if (attrCert.GetExtensionValue(X509Extensions.CrlDistributionPoints) != null || attrCert.GetExtensionValue(X509Extensions.AuthorityInfoAccess) != null)
     {
         throw new PkixCertPathValidatorException("No rev avail extension is set, but also an AC revocation pointer.");
     }
 }
 private static void CheckCrl(DistributionPoint dp, IX509AttributeCertificate attrCert, PkixParameters paramsPKIX, DateTime validDate, X509Certificate issuerCert, CertStatus certStatus, ReasonsMask reasonMask, IList certPathCerts)
 {
     if (attrCert.GetExtensionValue(X509Extensions.NoRevAvail) == null)
     {
         DateTime utcNow = DateTime.UtcNow;
         if (validDate.CompareTo((object)utcNow) > 0)
         {
             throw new Exception("Validation time is in future.");
         }
         ISet        completeCrls = PkixCertPathValidatorUtilities.GetCompleteCrls(dp, attrCert, utcNow, paramsPKIX);
         bool        flag         = false;
         Exception   ex           = null;
         IEnumerator enumerator   = completeCrls.GetEnumerator();
         while (enumerator.MoveNext() && certStatus.Status == 11 && !reasonMask.IsAllReasons)
         {
             try
             {
                 X509Crl     x509Crl     = (X509Crl)enumerator.Current;
                 ReasonsMask reasonsMask = Rfc3280CertPathUtilities.ProcessCrlD(x509Crl, dp);
                 if (reasonsMask.HasNewReasons(reasonMask))
                 {
                     ISet keys = Rfc3280CertPathUtilities.ProcessCrlF(x509Crl, attrCert, null, null, paramsPKIX, certPathCerts);
                     AsymmetricKeyParameter key = Rfc3280CertPathUtilities.ProcessCrlG(x509Crl, keys);
                     X509Crl x509Crl2           = null;
                     if (paramsPKIX.IsUseDeltasEnabled)
                     {
                         ISet deltaCrls = PkixCertPathValidatorUtilities.GetDeltaCrls(utcNow, paramsPKIX, x509Crl);
                         x509Crl2 = Rfc3280CertPathUtilities.ProcessCrlH(deltaCrls, key);
                     }
                     if (paramsPKIX.ValidityModel != 1 && attrCert.NotAfter.CompareTo((object)x509Crl.ThisUpdate) < 0)
                     {
                         throw new Exception("No valid CRL for current time found.");
                     }
                     Rfc3280CertPathUtilities.ProcessCrlB1(dp, attrCert, x509Crl);
                     Rfc3280CertPathUtilities.ProcessCrlB2(dp, attrCert, x509Crl);
                     Rfc3280CertPathUtilities.ProcessCrlC(x509Crl2, x509Crl, paramsPKIX);
                     Rfc3280CertPathUtilities.ProcessCrlI(validDate, x509Crl2, attrCert, certStatus, paramsPKIX);
                     Rfc3280CertPathUtilities.ProcessCrlJ(validDate, x509Crl, attrCert, certStatus);
                     if (certStatus.Status == 8)
                     {
                         certStatus.Status = 11;
                     }
                     reasonMask.AddReasons(reasonsMask);
                     flag = true;
                 }
             }
             catch (Exception ex2)
             {
                 ex = ex2;
             }
         }
         if (!flag)
         {
             throw ex;
         }
     }
 }
    internal static PkixCertPath ProcessAttrCert1(IX509AttributeCertificate attrCert, PkixParameters pkixParams)
    {
        PkixCertPathBuilderResult pkixCertPathBuilderResult = null;
        ISet set = new HashSet();

        if (attrCert.Holder.GetIssuer() != null)
        {
            X509CertStoreSelector x509CertStoreSelector = new X509CertStoreSelector();
            x509CertStoreSelector.SerialNumber = attrCert.Holder.SerialNumber;
            X509Name[] issuer = attrCert.Holder.GetIssuer();
            for (int i = 0; i < issuer.Length; i++)
            {
                try
                {
                    x509CertStoreSelector.Issuer = issuer[i];
                    set.AddAll(PkixCertPathValidatorUtilities.FindCertificates(x509CertStoreSelector, pkixParams.GetStores()));
                }
                catch (Exception cause)
                {
                    throw new PkixCertPathValidatorException("Public key certificate for attribute certificate cannot be searched.", cause);
                }
            }
            if (set.IsEmpty)
            {
                throw new PkixCertPathValidatorException("Public key certificate specified in base certificate ID for attribute certificate cannot be found.");
            }
        }
        if (attrCert.Holder.GetEntityNames() != null)
        {
            X509CertStoreSelector x509CertStoreSelector2 = new X509CertStoreSelector();
            X509Name[]            entityNames            = attrCert.Holder.GetEntityNames();
            for (int j = 0; j < entityNames.Length; j++)
            {
                try
                {
                    x509CertStoreSelector2.Issuer = entityNames[j];
                    set.AddAll(PkixCertPathValidatorUtilities.FindCertificates(x509CertStoreSelector2, pkixParams.GetStores()));
                }
                catch (Exception cause2)
                {
                    throw new PkixCertPathValidatorException("Public key certificate for attribute certificate cannot be searched.", cause2);
                }
            }
            if (set.IsEmpty)
            {
                throw new PkixCertPathValidatorException("Public key certificate specified in entity name for attribute certificate cannot be found.");
            }
        }
        PkixBuilderParameters          instance = PkixBuilderParameters.GetInstance(pkixParams);
        PkixCertPathValidatorException ex       = null;

        foreach (X509Certificate item in set)
        {
            X509CertStoreSelector x509CertStoreSelector3 = new X509CertStoreSelector();
            x509CertStoreSelector3.Certificate = item;
            instance.SetTargetConstraints(x509CertStoreSelector3);
            PkixCertPathBuilder pkixCertPathBuilder = new PkixCertPathBuilder();
            try
            {
                pkixCertPathBuilderResult = pkixCertPathBuilder.Build(PkixBuilderParameters.GetInstance(instance));
            }
            catch (PkixCertPathBuilderException cause3)
            {
                ex = new PkixCertPathValidatorException("Certification path for public key certificate of attribute certificate could not be build.", cause3);
            }
        }
        if (ex != null)
        {
            throw ex;
        }
        return(pkixCertPathBuilderResult.CertPath);
    }
    internal static PkixCertPathValidatorResult ProcessAttrCert2(PkixCertPath certPath, PkixParameters pkixParams)
    {
        PkixCertPathValidator pkixCertPathValidator = new PkixCertPathValidator();

        try
        {
            return(pkixCertPathValidator.Validate(certPath, pkixParams));
        }
        catch (PkixCertPathValidatorException cause)
        {
            throw new PkixCertPathValidatorException("Certification path for issuer certificate of attribute certificate could not be validated.", cause);
        }
    }
    internal static void ProcessAttrCert7(IX509AttributeCertificate attrCert, PkixCertPath certPath, PkixCertPath holderCertPath, PkixParameters pkixParams)
    {
        ISet criticalExtensionOids = attrCert.GetCriticalExtensionOids();

        if (criticalExtensionOids.Contains(X509Extensions.TargetInformation.Id))
        {
            try
            {
                TargetInformation.GetInstance(PkixCertPathValidatorUtilities.GetExtensionValue(attrCert, X509Extensions.TargetInformation));
            }
            catch (Exception cause)
            {
                throw new PkixCertPathValidatorException("Target information extension could not be read.", cause);
            }
        }
        criticalExtensionOids.Remove(X509Extensions.TargetInformation.Id);
        foreach (PkixAttrCertChecker attrCertChecker in pkixParams.GetAttrCertCheckers())
        {
            attrCertChecker.Check(attrCert, certPath, holderCertPath, criticalExtensionOids);
        }
        if (!criticalExtensionOids.IsEmpty)
        {
            throw new PkixCertPathValidatorException("Attribute certificate contains unsupported critical extensions: " + criticalExtensionOids);
        }
    }