public virtual PkixCertPathBuilderResult Build(PkixBuilderParameters pkixParams)
    {
        IX509Selector targetConstraints = pkixParams.GetTargetConstraints();

        if (!(targetConstraints is X509AttrCertStoreSelector))
        {
            throw new PkixCertPathBuilderException("TargetConstraints must be an instance of " + typeof(X509AttrCertStoreSelector).FullName + " for " + typeof(PkixAttrCertPathBuilder).FullName + " class.");
        }
        ICollection collection;

        try
        {
            collection = PkixCertPathValidatorUtilities.FindCertificates((X509AttrCertStoreSelector)targetConstraints, pkixParams.GetStores());
        }
        catch (Exception exception)
        {
            throw new PkixCertPathBuilderException("Error finding target attribute certificate.", exception);
        }
        if (collection.Count == 0)
        {
            throw new PkixCertPathBuilderException("No attribute certificate found matching targetContraints.");
        }
        PkixCertPathBuilderResult pkixCertPathBuilderResult = null;

        foreach (IX509AttributeCertificate item in collection)
        {
            X509CertStoreSelector x509CertStoreSelector = new X509CertStoreSelector();
            X509Name[]            principals            = item.Issuer.GetPrincipals();
            ISet set = new HashSet();
            for (int i = 0; i < principals.Length; i++)
            {
                try
                {
                    x509CertStoreSelector.Subject = principals[i];
                    set.AddAll(PkixCertPathValidatorUtilities.FindCertificates(x509CertStoreSelector, pkixParams.GetStores()));
                }
                catch (Exception exception2)
                {
                    throw new PkixCertPathBuilderException("Public key certificate for attribute certificate cannot be searched.", exception2);
                }
            }
            if (set.IsEmpty)
            {
                throw new PkixCertPathBuilderException("Public key certificate for attribute certificate cannot be found.");
            }
            IList tbvPath = Platform.CreateArrayList();
            foreach (X509Certificate item2 in set)
            {
                pkixCertPathBuilderResult = Build(item, item2, pkixParams, tbvPath);
                if (pkixCertPathBuilderResult != null)
                {
                    break;
                }
            }
            if (pkixCertPathBuilderResult != null)
            {
                break;
            }
        }
        if (pkixCertPathBuilderResult == null && certPathException != null)
        {
            throw new PkixCertPathBuilderException("Possible certificate chain could not be validated.", certPathException);
        }
        if (pkixCertPathBuilderResult == null && certPathException == null)
        {
            throw new PkixCertPathBuilderException("Unable to find certificate chain.");
        }
        return(pkixCertPathBuilderResult);
    }