151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/*
251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 2002, 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 Jastrzebski
2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage sun.security.ssl;
2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.*;
3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.*;
3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport javax.net.ssl.SSLException;
3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/**
3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * A list of CipherSuites. Also maintains the lists of supported and
3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * default ciphersuites and supports I/O from handshake streams.
3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Instances of this class are immutable.
3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskifinal class CipherSuiteList {
4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private final Collection<CipherSuite> cipherSuites;
4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private String[] suiteNames;
4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // flag indicating whether this list contains any ECC ciphersuites.
4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // null if not yet checked.
4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private volatile Boolean containsEC;
4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // for use by buildAvailableCache() and
5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // Handshaker.getKickstartMessage() only
5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    CipherSuiteList(Collection<CipherSuite> cipherSuites) {
5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.cipherSuites = cipherSuites;
5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Create a CipherSuiteList with a single element.
5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    CipherSuiteList(CipherSuite suite) {
6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        cipherSuites = new ArrayList<CipherSuite>(1);
6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        cipherSuites.add(suite);
6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Construct a CipherSuiteList from a array of names. We don't bother
6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * to eliminate duplicates.
6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception IllegalArgumentException if the array or any of its elements
6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * is null or if the ciphersuite name is unrecognized or unsupported
7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * using currently installed providers.
7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    CipherSuiteList(String[] names) {
7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (names == null) {
7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new IllegalArgumentException("CipherSuites may not be null");
7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        cipherSuites = new ArrayList<CipherSuite>(names.length);
7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // refresh available cache once if a CipherSuite is not available
7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // (maybe new JCE providers have been installed)
7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        boolean refreshed = false;
8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        for (int i = 0; i < names.length; i++) {
8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            String suiteName = names[i];
8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            CipherSuite suite = CipherSuite.valueOf(suiteName);
8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (suite.isAvailable() == false) {
8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (refreshed == false) {
8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    // clear the cache so that the isAvailable() call below
8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    // does a full check
8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    clearAvailableCache();
8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    refreshed = true;
8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                // still missing?
9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (suite.isAvailable() == false) {
9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    throw new IllegalArgumentException("Cannot support "
9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        + suiteName + " with currently installed providers");
9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            cipherSuites.add(suite);
9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Read a CipherSuiteList from a HandshakeInStream in V3 ClientHello
10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * format. Does not check if the listed ciphersuites are known or
10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * supported.
10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    CipherSuiteList(HandshakeInStream in) throws IOException {
10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        byte[] bytes = in.getBytes16();
10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if ((bytes.length & 1) != 0) {
10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new SSLException("Invalid ClientHello message");
10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        cipherSuites = new ArrayList<CipherSuite>(bytes.length >> 1);
11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        for (int i = 0; i < bytes.length; i += 2) {
11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            cipherSuites.add(CipherSuite.valueOf(bytes[i], bytes[i+1]));
11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Return whether this list contains the given CipherSuite.
11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    boolean contains(CipherSuite suite) {
12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return cipherSuites.contains(suite);
12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // Return whether this list contains any ECC ciphersuites
12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    boolean containsEC() {
12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (containsEC == null) {
12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            for (CipherSuite c : cipherSuites) {
12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                switch (c.keyExchange) {
12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                case K_ECDH_ECDSA:
12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                case K_ECDH_RSA:
13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                case K_ECDHE_ECDSA:
13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                case K_ECDHE_RSA:
13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                case K_ECDH_ANON:
13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    containsEC = true;
13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    return true;
13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                default:
13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    break;
13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            containsEC = false;
14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return containsEC;
14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Return an Iterator for the CipherSuites in this list.
14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    Iterator<CipherSuite> iterator() {
14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return cipherSuites.iterator();
14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Return a reference to the internal Collection of CipherSuites.
15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The Collection MUST NOT be modified.
15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    Collection<CipherSuite> collection() {
15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return cipherSuites;
15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Return the number of CipherSuites in this list.
16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    int size() {
16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return cipherSuites.size();
16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Return an array with the names of the CipherSuites in this list.
16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    synchronized String[] toStringArray() {
17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (suiteNames == null) {
17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            suiteNames = new String[cipherSuites.size()];
17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            int i = 0;
17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            for (CipherSuite c : cipherSuites) {
17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                suiteNames[i++] = c.name;
17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return suiteNames.clone();
17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public String toString() {
18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return cipherSuites.toString();
18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Write this list to an HandshakeOutStream in V3 ClientHello format.
18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    void send(HandshakeOutStream s) throws IOException {
18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        byte[] suiteBytes = new byte[cipherSuites.size() * 2];
18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int i = 0;
19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        for (CipherSuite c : cipherSuites) {
19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            suiteBytes[i] = (byte)(c.id >> 8);
19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            suiteBytes[i+1] = (byte)c.id;
19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            i += 2;
19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        s.putBytes16(suiteBytes);
19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Clear cache of available ciphersuites. If we support all ciphers
20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * internally, there is no need to clear the cache and calling this
20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * method has no effect.
20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    static synchronized void clearAvailableCache() {
20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (CipherSuite.DYNAMIC_AVAILABILITY) {
20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            CipherSuite.BulkCipher.clearAvailableCache();
20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            JsseJce.clearEcAvailable();
20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski}
210