⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pkixcertpathvalidatorimpl.java

📁 gcc的组建
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* PKIXCertPathValidatorImpl.java -- PKIX certificate path validator.   Copyright (C) 2004, 2005  Free Software Foundation, Inc.This file is part of GNU Classpath.GNU Classpath is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2, or (at your option)any later version.GNU Classpath is distributed in the hope that it will be useful, butWITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNUGeneral Public License for more details.You should have received a copy of the GNU General Public Licensealong with GNU Classpath; see the file COPYING.  If not, write to theFree Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA02110-1301 USA.Linking this library statically or dynamically with other modules ismaking a combined work based on this library.  Thus, the terms andconditions of the GNU General Public License cover the wholecombination.As a special exception, the copyright holders of this library give youpermission to link this library with independent modules to produce anexecutable, regardless of the license terms of these independentmodules, and to copy and distribute the resulting executable underterms of your choice, provided that you also meet, for each linkedindependent module, the terms and conditions of the license of thatmodule.  An independent module is a module which is not derived fromor based on this library.  If you modify this library, you may extendthis exception to your version of the library, but you are notobligated to do so.  If you do not wish to do so, delete thisexception statement from your version. */package gnu.java.security.provider;import gnu.java.security.OID;import gnu.java.security.x509.GnuPKIExtension;import gnu.java.security.x509.PolicyNodeImpl;import gnu.java.security.x509.X509CRLSelectorImpl;import gnu.java.security.x509.X509CertSelectorImpl;import gnu.java.security.x509.ext.BasicConstraints;import gnu.java.security.x509.ext.CertificatePolicies;import gnu.java.security.x509.ext.Extension;import gnu.java.security.x509.ext.KeyUsage;import gnu.java.security.x509.ext.PolicyConstraint;import java.io.IOException;import java.security.InvalidAlgorithmParameterException;import java.security.InvalidKeyException;import java.security.PublicKey;import java.security.cert.CRL;import java.security.cert.CertPath;import java.security.cert.CertPathParameters;import java.security.cert.CertPathValidatorException;import java.security.cert.CertPathValidatorResult;import java.security.cert.CertPathValidatorSpi;import java.security.cert.CertStore;import java.security.cert.CertStoreException;import java.security.cert.CertificateException;import java.security.cert.PKIXCertPathChecker;import java.security.cert.PKIXCertPathValidatorResult;import java.security.cert.PKIXParameters;import java.security.cert.TrustAnchor;import java.security.cert.X509CRL;import java.security.cert.X509Certificate;import java.security.interfaces.DSAParams;import java.security.interfaces.DSAPublicKey;import java.util.Arrays;import java.util.Collection;import java.util.Collections;import java.util.Date;import java.util.HashSet;import java.util.Iterator;import java.util.LinkedList;import java.util.List;import java.util.Set;/** * An implementation of the Public Key Infrastructure's X.509 * certificate path validation algorithm. * * <p>See <a href="http://www.ietf.org/rfc/rfc3280.txt">RFC 3280: * Internet X.509 Public Key Infrastructure Certificate and * Certificate Revocation List (CRL) Profile</a>. * * @author Casey Marshall (rsdio@metastatic.org) */public class PKIXCertPathValidatorImpl extends CertPathValidatorSpi{  // Constants.  // -------------------------------------------------------------------------  private static final boolean DEBUG = false;  private static void debug (String msg)  {    System.err.print (">> PKIXCertPathValidatorImpl: ");    System.err.println (msg);  }  public static final String ANY_POLICY = "2.5.29.32.0";  // Constructor.  // -------------------------------------------------------------------------  public PKIXCertPathValidatorImpl()  {    super();  }  // Instance methods.  // -------------------------------------------------------------------------  public CertPathValidatorResult engineValidate(CertPath path,                                                CertPathParameters params)    throws CertPathValidatorException, InvalidAlgorithmParameterException  {    if (!(params instanceof PKIXParameters))      throw new InvalidAlgorithmParameterException("not a PKIXParameters object");    // First check if the certificate path is valid.    //    // This means that:    //    //   (a)  for all x in {1, ..., n-1}, the subject of certificate x is    //        the issuer of certificate x+1;    //    //   (b)  for all x in {1, ..., n}, the certificate was valid at the    //        time in question.    //    // Because this is the X.509 algorithm, we also check if all    // cerificates are of type X509Certificate.    PolicyNodeImpl rootNode = new PolicyNodeImpl();    Set initPolicies = ((PKIXParameters) params).getInitialPolicies();    rootNode.setValidPolicy(ANY_POLICY);    rootNode.setCritical(false);    rootNode.setDepth(0);    if (initPolicies != null)      rootNode.addAllExpectedPolicies(initPolicies);    else      rootNode.addExpectedPolicy(ANY_POLICY);    List checks = ((PKIXParameters) params).getCertPathCheckers();    List l = path.getCertificates();    if (l == null || l.size() == 0)      throw new CertPathValidatorException();    X509Certificate[] p = null;    try      {        p = (X509Certificate[]) l.toArray(new X509Certificate[l.size()]);      }    catch (ClassCastException cce)      {        throw new CertPathValidatorException("invalid certificate path");      }    String sigProvider = ((PKIXParameters) params).getSigProvider();    PublicKey prevKey = null;    Date now = ((PKIXParameters) params).getDate();    if (now == null)      now = new Date();    LinkedList policyConstraints = new LinkedList();    for (int i = p.length - 1; i >= 0; i--)      {        try          {            p[i].checkValidity(now);          }        catch (CertificateException ce)          {            throw new CertPathValidatorException(ce.toString());          }        Set uce = getCritExts(p[i]);        for (Iterator check = checks.iterator(); check.hasNext(); )          {            try              {                ((PKIXCertPathChecker) check.next()).check(p[i], uce);              }            catch (Exception x)              {              }          }        PolicyConstraint constr = null;        if (p[i] instanceof GnuPKIExtension)          {            Extension pcx =              ((GnuPKIExtension) p[i]).getExtension (PolicyConstraint.ID);            if (pcx != null)              constr = (PolicyConstraint) pcx.getValue();          }        else          {            byte[] pcx = p[i].getExtensionValue (PolicyConstraint.ID.toString());            if (pcx != null)              {                try                  {                    constr = new PolicyConstraint (pcx);                  }                catch (Exception x)                  {                  }              }          }        if (constr != null && constr.getRequireExplicitPolicy() >= 0)          {            policyConstraints.add (new int[]              { p.length-i, constr.getRequireExplicitPolicy() });          }        updatePolicyTree(p[i], rootNode, p.length-i, (PKIXParameters) params,                         checkExplicitPolicy (p.length-i, policyConstraints));        // The rest of the tests involve this cert's relationship with the        // next in the path. If this cert is the end entity, we can stop.        if (i == 0)          break;        basicSanity(p, i);        PublicKey pubKey = null;        try          {            pubKey = p[i].getPublicKey();            if (pubKey instanceof DSAPublicKey)              {                DSAParams dsa = ((DSAPublicKey) pubKey).getParams();                // If the DSA public key is missing its parameters, use those                // from the previous cert's key.                if (dsa == null || dsa.getP() == null || dsa.getG() == null                      || dsa.getQ() == null)                  {                    if (prevKey == null)                      throw new InvalidKeyException("DSA keys not chainable");                    if (!(prevKey instanceof DSAPublicKey))                      throw new InvalidKeyException("DSA keys not chainable");                    dsa = ((DSAPublicKey) prevKey).getParams();                    pubKey = new GnuDSAPublicKey(((DSAPublicKey) pubKey).getY(),                      dsa.getP(), dsa.getQ(), dsa.getG());                  }              }            if (sigProvider == null)              p[i-1].verify(pubKey);            else              p[i-1].verify(pubKey, sigProvider);            prevKey = pubKey;          }        catch (Exception e)          {            throw new CertPathValidatorException(e.toString());          }        if (!p[i].getSubjectDN().equals(p[i-1].getIssuerDN()))          throw new CertPathValidatorException("issuer DN mismatch");        boolean[] issuerUid = p[i-1].getIssuerUniqueID();        boolean[] subjectUid = p[i].getSubjectUniqueID();        if (issuerUid != null && subjectUid != null)          if (!Arrays.equals(issuerUid, subjectUid))            throw new CertPathValidatorException("UID mismatch");        // Check the certificate against the revocation lists.        if (((PKIXParameters) params).isRevocationEnabled())          {            X509CRLSelectorImpl selector = new X509CRLSelectorImpl();            try              {                selector.addIssuerName(p[i].getSubjectDN());              }            catch (IOException ioe)              {                throw new CertPathValidatorException("error selecting CRLs");              }            List certStores = ((PKIXParameters) params).getCertStores();            List crls = new LinkedList();            for (Iterator it = certStores.iterator(); it.hasNext(); )              {                CertStore cs = (CertStore) it.next();                try                  {                    Collection c = cs.getCRLs(selector);                    crls.addAll(c);                  }                catch (CertStoreException cse)                  {                  }              }            if (crls.isEmpty())              throw new CertPathValidatorException("no CRLs for issuer");            boolean certOk = false;            for (Iterator it = crls.iterator(); it.hasNext(); )              {                CRL crl = (CRL) it.next();                if (!(crl instanceof X509CRL))                  continue;                X509CRL xcrl = (X509CRL) crl;                if (!checkCRL(xcrl, p, now, p[i], pubKey, certStores))                  continue;                if (xcrl.isRevoked(p[i-1]))                  throw new CertPathValidatorException("certificate is revoked");                else                  certOk = true;              }            if (!certOk)              throw new CertPathValidatorException("certificate's validity could not be determined");          }      }    rootNode.setReadOnly();    // Now ensure that the first certificate in the chain was issued    // by a trust anchor.    Exception cause = null;    Set anchors = ((PKIXParameters) params).getTrustAnchors();    for (Iterator i = anchors.iterator(); i.hasNext(); )      {        TrustAnchor anchor = (TrustAnchor) i.next();        X509Certificate anchorCert = null;        PublicKey anchorKey = null;        if (anchor.getTrustedCert() != null)          {            anchorCert = anchor.getTrustedCert();            anchorKey = anchorCert.getPublicKey();          }        else          anchorKey = anchor.getCAPublicKey();        if (anchorKey == null)          continue;        try          {            if (anchorCert != null)              anchorCert.checkValidity(now);            p[p.length-1].verify(anchorKey);            if (anchorCert != null && anchorCert.getBasicConstraints() >= 0                && anchorCert.getBasicConstraints() < p.length)              continue;            if (((PKIXParameters) params).isRevocationEnabled())              {                X509CRLSelectorImpl selector = new X509CRLSelectorImpl();                if (anchorCert != null)                  try                    {                      selector.addIssuerName(anchorCert.getSubjectDN());                    }                  catch (IOException ioe)                    {                    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -