151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/*
251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it
651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as
751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation.  Oracle designates this
851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided
951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code.
1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT
1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that
1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code).
1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version
1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation,
1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any
2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions.
2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage javax.net.ssl;
2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.*;
2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.*;
3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.security.jca.GetInstance;
3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/**
3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Instances of this class represent a secure socket protocol
3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementation which acts as a factory for secure socket
3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * factories or <code>SSLEngine</code>s. This class is initialized
3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * with an optional set of key and trust managers and source of
3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * secure random bytes.
3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
40fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak * <p> Android provides the following <code>SSLContext</code> protocols:
41fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak * <table>
42fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *     <thead>
43fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *         <tr>
44fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *             <th>Name</th>
45fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *             <th>Supported (API Levels)</th>
46fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *         </tr>
47fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *     </thead>
48fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *     <tbody>
49fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *         <tr>
50fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *             <td>Default</td>
51fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *             <td>10+</td>
52fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *         </tr>
53fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *         <tr>
54fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *             <td>SSL</td>
55fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *             <td>10+</td>
56fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *         </tr>
57fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *         <tr>
58fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *             <td>SSLv3</td>
59fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *             <td>10+</td>
60fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *         </tr>
61fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *         <tr>
62fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *             <td>TLS</td>
63fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *             <td>1+</td>
64fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *         </tr>
65fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *         <tr>
66fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *             <td>TLSv1</td>
67fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *             <td>10+</td>
68fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *         </tr>
69fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *         <tr>
70fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *             <td>TLSv1.1</td>
71fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *             <td>16+</td>
72fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *         </tr>
73fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *         <tr>
74fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *             <td>TLSv1.2</td>
75fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *             <td>16+</td>
76fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *         </tr>
77fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *     </tbody>
78fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak * </table>
79fba165684d995ea7afe39bb1fc15a4d09beeba71Przemyslaw Szczepaniak *
8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This protocol is described in the <a href=
81d2449bb576ad1e3a3877364e5e1ae28625f69e35Yi Kong * "{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/security/StandardNames.html#SSLContext">
8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * SSLContext section</a> of the
8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Java Cryptography Architecture Standard Algorithm Name Documentation.
8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4
8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class SSLContext {
8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private final Provider provider;
8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private final SSLContextSpi contextSpi;
9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private final String protocol;
9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Creates an SSLContext object.
9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param contextSpi the delegate
9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param provider the provider
9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param protocol the protocol
10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    protected SSLContext(SSLContextSpi contextSpi, Provider provider,
10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            String protocol) {
10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.contextSpi = contextSpi;
10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.provider = provider;
10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.protocol = protocol;
10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static SSLContext defaultContext;
10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the default SSL context.
11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>If a default context was set using the {@link #setDefault
11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * SSLContext.setDefault()} method, it is returned. Otherwise, the first
11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * call of this method triggers the call
11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>SSLContext.getInstance("Default")</code>.
11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * If successful, that object is made the default SSL context and returned.
11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>The default context is immediately
12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * usable and does not require {@linkplain #init initialization}.
12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the default SSL context
12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws NoSuchAlgorithmException if the
12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *   {@link SSLContext#getInstance SSLContext.getInstance()} call fails
12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since 1.6
12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static synchronized SSLContext getDefault()
12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throws NoSuchAlgorithmException {
12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (defaultContext == null) {
13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            defaultContext = SSLContext.getInstance("Default");
13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return defaultContext;
13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets the default SSL context. It will be returned by subsequent calls
13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * to {@link #getDefault}. The default context must be immediately usable
13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * and not require {@linkplain #init initialization}.
13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param context the SSLContext
14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  NullPointerException if context is null
14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  SecurityException if a security manager exists and its
14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          <code>checkPermission</code> method does not allow
14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          <code>SSLPermission("setDefaultSSLContext")</code>
14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since 1.6
14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static synchronized void setDefault(SSLContext context) {
14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (context == null) {
14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new NullPointerException();
15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        SecurityManager sm = System.getSecurityManager();
15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (sm != null) {
15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            sm.checkPermission(new SSLPermission("setDefaultSSLContext"));
15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        defaultContext = context;
15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns a <code>SSLContext</code> object that implements the
16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * specified secure socket protocol.
16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> This method traverses the list of registered security Providers,
16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * starting with the most preferred Provider.
16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * A new SSLContext object encapsulating the
16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * SSLContextSpi implementation from the first
16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Provider that supports the specified protocol is returned.
16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> Note that the list of registered providers may be retrieved via
16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the {@link Security#getProviders() Security.getProviders()} method.
17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param protocol the standard name of the requested protocol.
17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          See the SSLContext section in the <a href=
173d2449bb576ad1e3a3877364e5e1ae28625f69e35Yi Kong     * "{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/security/StandardNames.html#SSLContext">
17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          Java Cryptography Architecture Standard Algorithm Name
17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          Documentation</a>
17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          for information about standard protocol names.
17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the new <code>SSLContext</code> object.
17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception NoSuchAlgorithmException if no Provider supports a
18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          TrustManagerFactorySpi implementation for the
18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          specified protocol.
18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception NullPointerException if protocol is null.
18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.security.Provider
18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static SSLContext getInstance(String protocol)
18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throws NoSuchAlgorithmException {
18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        GetInstance.Instance instance = GetInstance.getInstance
19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                ("SSLContext", SSLContextSpi.class, protocol);
19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return new SSLContext((SSLContextSpi)instance.impl, instance.provider,
19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                protocol);
19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns a <code>SSLContext</code> object that implements the
19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * specified secure socket protocol.
19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> A new SSLContext object encapsulating the
20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * SSLContextSpi implementation from the specified provider
20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * is returned.  The specified provider must be registered
20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * in the security provider list.
20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> Note that the list of registered providers may be retrieved via
20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the {@link Security#getProviders() Security.getProviders()} method.
20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param protocol the standard name of the requested protocol.
20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          See the SSLContext section in the <a href=
209d2449bb576ad1e3a3877364e5e1ae28625f69e35Yi Kong     * "{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/security/StandardNames.html#SSLContext">
21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          Java Cryptography Architecture Standard Algorithm Name
21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          Documentation</a>
21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          for information about standard protocol names.
21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param provider the name of the provider.
21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the new <code>SSLContext</code> object.
21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws NoSuchAlgorithmException if a SSLContextSpi
21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          implementation for the specified protocol is not
22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          available from the specified provider.
22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws NoSuchProviderException if the specified provider is not
22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          registered in the security provider list.
22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws IllegalArgumentException if the provider name is null or empty.
22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws NullPointerException if protocol is null.
22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.security.Provider
22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static SSLContext getInstance(String protocol, String provider)
23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throws NoSuchAlgorithmException, NoSuchProviderException {
23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        GetInstance.Instance instance = GetInstance.getInstance
23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                ("SSLContext", SSLContextSpi.class, protocol, provider);
23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return new SSLContext((SSLContextSpi)instance.impl, instance.provider,
23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                protocol);
23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns a <code>SSLContext</code> object that implements the
24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * specified secure socket protocol.
24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> A new SSLContext object encapsulating the
24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * SSLContextSpi implementation from the specified Provider
24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * object is returned.  Note that the specified Provider object
24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * does not have to be registered in the provider list.
24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param protocol the standard name of the requested protocol.
24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          See the SSLContext section in the <a href=
249d2449bb576ad1e3a3877364e5e1ae28625f69e35Yi Kong     * "{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/security/StandardNames.html#SSLContext">
25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          Java Cryptography Architecture Standard Algorithm Name
25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          Documentation</a>
25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          for information about standard protocol names.
25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param provider an instance of the provider.
25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the new <code>SSLContext</code> object.
25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws NoSuchAlgorithmException if a KeyManagerFactorySpi
25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          implementation for the specified protocol is not available
26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          from the specified Provider object.
26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws IllegalArgumentException if the provider name is null.
26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws NullPointerException if protocol is null.
26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.security.Provider
26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static SSLContext getInstance(String protocol, Provider provider)
26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throws NoSuchAlgorithmException {
26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        GetInstance.Instance instance = GetInstance.getInstance
27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                ("SSLContext", SSLContextSpi.class, protocol, provider);
27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return new SSLContext((SSLContextSpi)instance.impl, instance.provider,
27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                protocol);
27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the protocol name of this <code>SSLContext</code> object.
27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>This is the same name that was specified in one of the
27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>getInstance</code> calls that created this
28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>SSLContext</code> object.
28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the protocol name of this <code>SSLContext</code> object.
28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final String getProtocol() {
28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return this.protocol;
28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the provider of this <code>SSLContext</code> object.
29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the provider of this <code>SSLContext</code> object
29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final Provider getProvider() {
29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return this.provider;
29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Initializes this context. Either of the first two parameters
29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * may be null in which case the installed security providers will
30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * be searched for the highest priority implementation of the
30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * appropriate factory. Likewise, the secure random parameter may
30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * be null in which case the default implementation will be used.
30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <P>
30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Only the first instance of a particular key and/or trust manager
30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * implementation type in the array is used.  (For example, only
30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the first javax.net.ssl.X509KeyManager in the array will be used.)
30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param km the sources of authentication keys or null
30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param tm the sources of peer authentication trust decisions or null
31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param random the source of randomness for this generator or null
31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws KeyManagementException if this operation fails
31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final void init(KeyManager[] km, TrustManager[] tm,
31451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                SecureRandom random)
31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        throws KeyManagementException {
31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        contextSpi.engineInit(km, tm, random);
31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
32051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns a <code>SocketFactory</code> object for this
32151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * context.
32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the <code>SocketFactory</code> object
32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws IllegalStateException if the SSLContextImpl requires
32551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          initialization and the <code>init()</code> has not been called
32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final SSLSocketFactory getSocketFactory() {
32851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return contextSpi.engineGetSocketFactory();
32951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
33051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
33151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
33251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns a <code>ServerSocketFactory</code> object for
33351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * this context.
33451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
33551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the <code>ServerSocketFactory</code> object
33651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws IllegalStateException if the SSLContextImpl requires
33751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          initialization and the <code>init()</code> has not been called
33851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
33951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final SSLServerSocketFactory getServerSocketFactory() {
34051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return contextSpi.engineGetServerSocketFactory();
34151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
34251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
34351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
34451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Creates a new <code>SSLEngine</code> using this context.
34551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <P>
34651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Applications using this factory method are providing no hints
34751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * for an internal session reuse strategy. If hints are desired,
34851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * {@link #createSSLEngine(String, int)} should be used
34951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * instead.
35051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <P>
35151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Some cipher suites (such as Kerberos) require remote hostname
35251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * information, in which case this factory method should not be used.
35351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
35451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  the <code>SSLEngine</code> object
35551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  UnsupportedOperationException if the underlying provider
35651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          does not implement the operation.
35751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  IllegalStateException if the SSLContextImpl requires
35851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          initialization and the <code>init()</code> has not been called
35951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since   1.5
36051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
36151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final SSLEngine createSSLEngine() {
36251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
36351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return contextSpi.engineCreateSSLEngine();
36451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } catch (AbstractMethodError e) {
36551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            UnsupportedOperationException unsup =
36651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                new UnsupportedOperationException(
36751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    "Provider: " + getProvider() +
36851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    " doesn't support this operation");
36951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            unsup.initCause(e);
37051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw unsup;
37151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
37251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
37351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
37451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
37551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Creates a new <code>SSLEngine</code> using this context using
37651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * advisory peer information.
37751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <P>
37851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Applications using this factory method are providing hints
37951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * for an internal session reuse strategy.
38051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <P>
38151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Some cipher suites (such as Kerberos) require remote hostname
38251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * information, in which case peerHost needs to be specified.
38351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
38451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   peerHost the non-authoritative name of the host
38551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   peerPort the non-authoritative port
38651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  the new <code>SSLEngine</code> object
38751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  UnsupportedOperationException if the underlying provider
38851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          does not implement the operation.
38951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  IllegalStateException if the SSLContextImpl requires
39051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          initialization and the <code>init()</code> has not been called
39151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since   1.5
39251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
39351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final SSLEngine createSSLEngine(String peerHost, int peerPort) {
39451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
39551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return contextSpi.engineCreateSSLEngine(peerHost, peerPort);
39651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } catch (AbstractMethodError e) {
39751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            UnsupportedOperationException unsup =
39851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                new UnsupportedOperationException(
39951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    "Provider: " + getProvider() +
40051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    " does not support this operation");
40151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            unsup.initCause(e);
40251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw unsup;
40351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
40451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
40551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
40651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
40751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the server session context, which represents the set of
40851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * SSL sessions available for use during the handshake phase of
40951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * server-side SSL sockets.
41051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <P>
41151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * This context may be unavailable in some environments, in which
41251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * case this method returns null. For example, when the underlying
41351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * SSL provider does not provide an implementation of SSLSessionContext
41451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * interface, this method returns null. A non-null session context
41551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * is returned otherwise.
41651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
41751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return server session context bound to this SSL context
41851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
41951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final SSLSessionContext getServerSessionContext() {
42051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return contextSpi.engineGetServerSessionContext();
42151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
42251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
42351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
42451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the client session context, which represents the set of
42551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * SSL sessions available for use during the handshake phase of
42651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * client-side SSL sockets.
42751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <P>
42851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * This context may be unavailable in some environments, in which
42951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * case this method returns null. For example, when the underlying
43051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * SSL provider does not provide an implementation of SSLSessionContext
43151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * interface, this method returns null. A non-null session context
43251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * is returned otherwise.
43351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
43451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return client session context bound to this SSL context
43551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
43651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final SSLSessionContext getClientSessionContext() {
43751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return contextSpi.engineGetClientSessionContext();
43851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
43951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
44051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
44151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns a copy of the SSLParameters indicating the default
44251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * settings for this SSL context.
44351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
44451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>The parameters will always have the ciphersuites and protocols
44551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * arrays set to non-null values.
44651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
44751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return a copy of the SSLParameters object with the default settings
44851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws UnsupportedOperationException if the default SSL parameters
44951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *   could not be obtained.
45051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since 1.6
45151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
45251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final SSLParameters getDefaultSSLParameters() {
45351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return contextSpi.engineGetDefaultSSLParameters();
45451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
45551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
45651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
45751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns a copy of the SSLParameters indicating the supported
45851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * settings for this SSL context.
45951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
46051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>The parameters will always have the ciphersuites and protocols
46151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * arrays set to non-null values.
46251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
46351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return a copy of the SSLParameters object with the supported
46451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *   settings
46551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws UnsupportedOperationException if the supported SSL parameters
46651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *   could not be obtained.
46751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since 1.6
46851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
46951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final SSLParameters getSupportedSSLParameters() {
47051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return contextSpi.engineGetSupportedSSLParameters();
47151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
47251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
47351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski}
474