| /* SSLContext.java -- an SSL protocol context. |
| Copyright (C) 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 javax.net.ssl; |
| |
| import gnu.java.security.Engine; |
| |
| import java.lang.reflect.InvocationTargetException; |
| import java.security.KeyManagementException; |
| import java.security.NoSuchAlgorithmException; |
| import java.security.NoSuchProviderException; |
| import java.security.Provider; |
| import java.security.SecureRandom; |
| import java.security.Security; |
| |
| /** |
| * A "meta-factory" for protocol-specific socket and server socket |
| * factories. This class serves as a clearinghouse for socket |
| * factories and cached session contexts for a particular protocol, |
| * such as SSLv3. |
| * |
| * @author Casey Marshall (rsdio@metastatic.org) |
| */ |
| public class SSLContext |
| { |
| // Constants and fields. |
| // ------------------------------------------------------------------ |
| |
| /** Service name for SSL contexts. */ |
| private static final String SSL_CONTEXT = "SSLContext"; |
| |
| /** The underlying engine. */ |
| private final SSLContextSpi ctxSpi; |
| |
| /** The provider of the engine class. */ |
| private final Provider provider; |
| |
| /** The protocal name. */ |
| private final String protocol; |
| |
| // Constructor. |
| // ------------------------------------------------------------------ |
| |
| /** |
| * Create a new SSL context. |
| * |
| * @param ctxSpi The context engine. |
| * @param provider The provider of the implementation. |
| * @param protocol The name of the SSL protocol. |
| */ |
| protected SSLContext(SSLContextSpi ctxSpi, Provider provider, |
| String protocol) |
| { |
| this.ctxSpi = ctxSpi; |
| this.provider = provider; |
| this.protocol = protocol; |
| } |
| |
| // Class methods. |
| // ------------------------------------------------------------------ |
| |
| /** |
| * Get an instance of a context for the specified protocol from the |
| * first provider that implements it. |
| * |
| * @param protocol The name of the protocol to get a context for. |
| * @return The new context. |
| * @throws NoSuchAlgorithm If no provider implements the given |
| * protocol. |
| */ |
| public static final SSLContext getInstance(String protocol) |
| throws NoSuchAlgorithmException |
| { |
| Provider[] provs = Security.getProviders(); |
| for (int i = 0; i < provs.length; i++) |
| { |
| try |
| { |
| return getInstance(protocol, provs[i]); |
| } |
| catch (NoSuchAlgorithmException ignore) |
| { |
| } |
| } |
| throw new NoSuchAlgorithmException(protocol); |
| } |
| |
| /** |
| * Get an instance of a context for the specified protocol from the |
| * named provider. |
| * |
| * @param protocol The name of the protocol to get a context for. |
| * @param provider The name of the provider to get the |
| * implementation from. |
| * @return The new context. |
| * @throws NoSuchAlgorithmException If the provider does not |
| * implement the given protocol. |
| * @throws NoSuchProviderException If the named provider does not |
| * exist. |
| * @throws IllegalArgumentException If <i>provider</i> is null. |
| */ |
| public static final SSLContext getInstance(String protocol, |
| String provider) |
| throws NoSuchAlgorithmException, NoSuchProviderException |
| { |
| if (provider == null) |
| { |
| throw new IllegalArgumentException("null provider"); |
| } |
| Provider p = Security.getProvider(provider); |
| if (p == null) |
| { |
| throw new NoSuchProviderException(provider); |
| } |
| return getInstance(protocol, p); |
| } |
| |
| /** |
| * Get an instance of a context for the specified protocol from the |
| * specified provider. |
| * |
| * @param protocol The name of the protocol to get a context for. |
| * @param provider The name of the provider to get the |
| * implementation from. |
| * @return The new context. |
| * @throws NoSuchAlgorithmException If the provider does not |
| * implement the given protocol. |
| * @throws IllegalArgumentException If <i>provider</i> is null. |
| */ |
| public static final SSLContext getInstance(String protocol, |
| Provider provider) |
| throws NoSuchAlgorithmException |
| { |
| try |
| { |
| return new SSLContext((SSLContextSpi) |
| Engine.getInstance(SSL_CONTEXT, protocol, provider), |
| provider, protocol); |
| } |
| catch (InvocationTargetException ite) |
| { |
| NoSuchAlgorithmException nsae = new NoSuchAlgorithmException(protocol); |
| throw (NoSuchAlgorithmException) nsae.initCause(ite); |
| } |
| catch (ClassCastException cce) |
| { |
| NoSuchAlgorithmException nsae = new NoSuchAlgorithmException(protocol); |
| throw (NoSuchAlgorithmException) nsae.initCause(cce); |
| } |
| } |
| |
| // Instance methods. |
| // ----------------------------------------------------------------- |
| |
| /** |
| * Returns the set of SSL contexts available for client connections. |
| * |
| * @return The set of SSL contexts available for client connections. |
| */ |
| public final SSLSessionContext getClientSessionContext() |
| { |
| return ctxSpi.engineGetClientSessionContext(); |
| } |
| |
| /** |
| * Returns the protocol name of this context. |
| * |
| * @return The protocol name of this context. |
| */ |
| public final String getProtocol() |
| { |
| return protocol; |
| } |
| |
| /** |
| * Returns the provider of this implementation. |
| * |
| * @return The provider of this implementation. |
| */ |
| public final Provider getProvider() |
| { |
| return provider; |
| } |
| |
| /** |
| * Returns the set of SSL contexts available for server connections. |
| * |
| * @return The set of SSL contexts available for server connections. |
| */ |
| public final SSLSessionContext getServerSessionContext() |
| { |
| return ctxSpi.engineGetServerSessionContext(); |
| } |
| |
| /** |
| * Returns the factory for server SSL sockets. |
| * |
| * @return The factory for server SSL sockets. |
| */ |
| public final SSLServerSocketFactory getServerSocketFactory() |
| { |
| return ctxSpi.engineGetServerSocketFactory(); |
| } |
| |
| /** |
| * Returns the factory for client SSL sockets. |
| * |
| * @return The factory for client SSL sockets. |
| */ |
| public final SSLSocketFactory getSocketFactory() |
| { |
| return ctxSpi.engineGetSocketFactory(); |
| } |
| |
| /** |
| * Initializes this context and prepares it for producing socket |
| * factories. All of the parameters are optional; default values are |
| * used if left unspecified. |
| * |
| * @param keyManagers The set of key managers to use. |
| * @param trustManagers The set of trust managers to use. |
| * @param random A source of random bits to use. |
| * @throws KeyManagementException If initialization fails. |
| */ |
| public final void init(KeyManager[] keyManagers, |
| TrustManager[] trustManagers, |
| SecureRandom random) |
| throws KeyManagementException |
| { |
| ctxSpi.engineInit(keyManagers, trustManagers, random); |
| } |
| } |