mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			250 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			250 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Java
		
	
	
	
/* CertPathValidator -- validates certificate paths.
 | 
						|
   Copyright (C) 2003, 2004  Free Software Foundation, Inc.
 | 
						|
 | 
						|
This file is part of GNU Classpath.
 | 
						|
 | 
						|
GNU Classpath is free software; you can redistribute it and/or modify
 | 
						|
it under the terms of the GNU General Public License as published by
 | 
						|
the 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, but
 | 
						|
WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
						|
General Public License for more details.
 | 
						|
 | 
						|
You should have received a copy of the GNU General Public License
 | 
						|
along with GNU Classpath; see the file COPYING.  If not, write to the
 | 
						|
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
						|
02110-1301 USA.
 | 
						|
 | 
						|
Linking this library statically or dynamically with other modules is
 | 
						|
making a combined work based on this library.  Thus, the terms and
 | 
						|
conditions of the GNU General Public License cover the whole
 | 
						|
combination.
 | 
						|
 | 
						|
As a special exception, the copyright holders of this library give you
 | 
						|
permission to link this library with independent modules to produce an
 | 
						|
executable, regardless of the license terms of these independent
 | 
						|
modules, and to copy and distribute the resulting executable under
 | 
						|
terms of your choice, provided that you also meet, for each linked
 | 
						|
independent module, the terms and conditions of the license of that
 | 
						|
module.  An independent module is a module which is not derived from
 | 
						|
or based on this library.  If you modify this library, you may extend
 | 
						|
this exception to your version of the library, but you are not
 | 
						|
obligated to do so.  If you do not wish to do so, delete this
 | 
						|
exception statement from your version. */
 | 
						|
 | 
						|
 | 
						|
package java.security.cert;
 | 
						|
 | 
						|
import gnu.java.security.Engine;
 | 
						|
 | 
						|
import java.security.AccessController;
 | 
						|
import java.security.InvalidAlgorithmParameterException;
 | 
						|
import java.security.NoSuchAlgorithmException;
 | 
						|
import java.security.NoSuchProviderException;
 | 
						|
import java.security.PrivilegedAction;
 | 
						|
import java.security.Provider;
 | 
						|
import java.security.Security;
 | 
						|
 | 
						|
/**
 | 
						|
 * Generic interface to classes that validate certificate paths.
 | 
						|
 *
 | 
						|
 * <p>Using this class is similar to all the provider-based security
 | 
						|
 * classes; the method of interest, {@link
 | 
						|
 * #validate(java.security.cert.CertPath,java.security.cert.CertPathParameters)},
 | 
						|
 * which takes provider-specific implementations of {@link
 | 
						|
 * CertPathParameters}, and return provider-specific implementations of
 | 
						|
 * {@link CertPathValidatorResult}.
 | 
						|
 *
 | 
						|
 * @since JDK 1.4
 | 
						|
 * @see CertPath
 | 
						|
 */
 | 
						|
public class CertPathValidator {
 | 
						|
 | 
						|
  // Constants and fields.
 | 
						|
  // ------------------------------------------------------------------------
 | 
						|
 | 
						|
  /** Service name for CertPathValidator. */
 | 
						|
  private static final String CERT_PATH_VALIDATOR = "CertPathValidator";
 | 
						|
 | 
						|
  /** The underlying implementation. */
 | 
						|
  private final CertPathValidatorSpi validatorSpi;
 | 
						|
 | 
						|
  /** The provider of this implementation. */
 | 
						|
  private final Provider provider;
 | 
						|
 | 
						|
  /** The algorithm's name. */
 | 
						|
  private final String algorithm;
 | 
						|
 | 
						|
  // Constructor.
 | 
						|
  // ------------------------------------------------------------------------
 | 
						|
 | 
						|
  /**
 | 
						|
   * Creates a new CertPathValidator.
 | 
						|
   *
 | 
						|
   * @param validatorSpi The underlying implementation.
 | 
						|
   * @param provider     The provider of the implementation.
 | 
						|
   * @param algorithm    The algorithm name.
 | 
						|
   */
 | 
						|
  protected CertPathValidator(CertPathValidatorSpi validatorSpi,
 | 
						|
                              Provider provider, String algorithm)
 | 
						|
  {
 | 
						|
    this.validatorSpi = validatorSpi;
 | 
						|
    this.provider = provider;
 | 
						|
    this.algorithm = algorithm;
 | 
						|
  }
 | 
						|
 | 
						|
  // Class methods.
 | 
						|
  // ------------------------------------------------------------------------
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns the default validator type.
 | 
						|
   *
 | 
						|
   * <p>This value may be set at run-time via the security property
 | 
						|
   * "certpathvalidator.type", or the value "PKIX" if this property is
 | 
						|
   * not set.
 | 
						|
   *
 | 
						|
   * @return The default validator type.
 | 
						|
   */
 | 
						|
  public static synchronized String getDefaultType() {
 | 
						|
    String type = (String) AccessController.doPrivileged(
 | 
						|
      new PrivilegedAction()
 | 
						|
        {
 | 
						|
          public Object run()
 | 
						|
          {
 | 
						|
            return Security.getProperty("certpathvalidator.type");
 | 
						|
          }
 | 
						|
        }
 | 
						|
    );
 | 
						|
    if (type == null)
 | 
						|
      type = "PKIX";
 | 
						|
    return type;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Get an instance of the given validator from the first provider that
 | 
						|
   * implements it.
 | 
						|
   *
 | 
						|
   * @param algorithm The name of the algorithm to get.
 | 
						|
   * @return The new instance.
 | 
						|
   * @throws NoSuchAlgorithmException If no installed provider
 | 
						|
   * implements the requested algorithm.
 | 
						|
   */
 | 
						|
  public static CertPathValidator getInstance(String algorithm)
 | 
						|
    throws NoSuchAlgorithmException
 | 
						|
  {
 | 
						|
    Provider[] p = Security.getProviders();
 | 
						|
    for (int i = 0; i < p.length; i++)
 | 
						|
      {
 | 
						|
        try
 | 
						|
          {
 | 
						|
            return getInstance(algorithm, p[i]);
 | 
						|
          }
 | 
						|
        catch (NoSuchAlgorithmException e)
 | 
						|
          {
 | 
						|
	    // Ignored.
 | 
						|
          }
 | 
						|
      }
 | 
						|
    throw new NoSuchAlgorithmException(algorithm);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Get an instance of the given validator from the named provider.
 | 
						|
   *
 | 
						|
   * @param algorithm The name of the algorithm to get.
 | 
						|
   * @param provider  The name of the provider from which to get the
 | 
						|
   * implementation.
 | 
						|
   * @return The new instance.
 | 
						|
   * @throws NoSuchAlgorithmException If the named provider does not
 | 
						|
   * implement the algorithm.
 | 
						|
   * @throws NoSuchProviderException If no provider named
 | 
						|
   * <i>provider</i> is installed.
 | 
						|
   */
 | 
						|
  public static CertPathValidator getInstance(String algorithm,
 | 
						|
                                              String provider)
 | 
						|
    throws NoSuchAlgorithmException, NoSuchProviderException
 | 
						|
  {
 | 
						|
    Provider p = Security.getProvider(provider);
 | 
						|
    if (p == null)
 | 
						|
      throw new NoSuchProviderException(provider);
 | 
						|
 | 
						|
    return getInstance(algorithm, p);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Get an instance of the given validator from the given provider.
 | 
						|
   *
 | 
						|
   * @param algorithm The name of the algorithm to get.
 | 
						|
   * @param provider  The provider from which to get the implementation.
 | 
						|
   * @return The new instance.
 | 
						|
   * @throws NoSuchAlgorithmException If the provider does not implement
 | 
						|
   * the algorithm.
 | 
						|
   * @throws IllegalArgumentException If <i>provider</i> is null.
 | 
						|
   */
 | 
						|
  public static CertPathValidator getInstance(String algorithm,
 | 
						|
                                              Provider provider)
 | 
						|
    throws NoSuchAlgorithmException
 | 
						|
  {
 | 
						|
    if (provider == null)
 | 
						|
      throw new IllegalArgumentException("null provider");
 | 
						|
 | 
						|
    try
 | 
						|
      {
 | 
						|
        return new CertPathValidator((CertPathValidatorSpi)
 | 
						|
          Engine.getInstance(CERT_PATH_VALIDATOR, algorithm, provider),
 | 
						|
          provider, algorithm);
 | 
						|
      }
 | 
						|
    catch (java.lang.reflect.InvocationTargetException ite)
 | 
						|
      {
 | 
						|
        throw new NoSuchAlgorithmException(algorithm);
 | 
						|
      }
 | 
						|
    catch (ClassCastException cce)
 | 
						|
      {
 | 
						|
        throw new NoSuchAlgorithmException(algorithm);
 | 
						|
      }
 | 
						|
  }
 | 
						|
 | 
						|
  // Instance methods.
 | 
						|
  // ------------------------------------------------------------------------
 | 
						|
 | 
						|
  /**
 | 
						|
   * Return the name of this validator.
 | 
						|
   *
 | 
						|
   * @return This validator's name.
 | 
						|
   */
 | 
						|
  public final String getAlgorithm()
 | 
						|
  {
 | 
						|
    return algorithm;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Return the provider of this implementation.
 | 
						|
   *
 | 
						|
   * @return The provider.
 | 
						|
   */
 | 
						|
  public final Provider getProvider()
 | 
						|
  {
 | 
						|
    return provider;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Attempt to validate a certificate path.
 | 
						|
   *
 | 
						|
   * @param certPath The path to validate.
 | 
						|
   * @param params   The algorithm-specific parameters.
 | 
						|
   * @return The result of this validation attempt.
 | 
						|
   * @throws CertPathValidatorException If the certificate path cannot
 | 
						|
   * be validated.
 | 
						|
   * @throws InvalidAlgorithmParameterException If this implementation
 | 
						|
   * rejects the specified parameters.
 | 
						|
   */
 | 
						|
  public final CertPathValidatorResult validate(CertPath certPath,
 | 
						|
                                                CertPathParameters params)
 | 
						|
    throws CertPathValidatorException, InvalidAlgorithmParameterException
 | 
						|
  {
 | 
						|
    return validatorSpi.engineValidate(certPath, params);
 | 
						|
  }
 | 
						|
}
 |