1 /*
2  * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 /*
27  * NOTE:  this file was copied from javax.net.ssl.SSLContext
28  */
29 
30 package com.sun.net.ssl;
31 
32 import java.security.*;
33 import java.util.*;
34 import javax.net.ssl.*;
35 
36 import sun.security.ssl.SSLSocketFactoryImpl;
37 import sun.security.ssl.SSLServerSocketFactoryImpl;
38 
39 /**
40  * Instances of this class represent a secure socket protocol
41  * implementation which acts as a factory for secure socket
42  * factories. This class is initialized with an optional set of
43  * key and trust managers and source of secure random bytes.
44  *
45  * @deprecated As of JDK 1.4, this implementation-specific class was
46  *      replaced by {@link javax.net.ssl.SSLContext}.
47  */
48 @Deprecated(since="1.4")
49 public class SSLContext {
50     private Provider provider;
51 
52     private SSLContextSpi contextSpi;
53 
54     private String protocol;
55 
56     /**
57      * Creates an SSLContext object.
58      *
59      * @param contextSpi the delegate
60      * @param provider the provider
61      * @param protocol the protocol
62      */
SSLContext(SSLContextSpi contextSpi, Provider provider, String protocol)63     protected SSLContext(SSLContextSpi contextSpi, Provider provider,
64         String protocol) {
65         this.contextSpi = contextSpi;
66         this.provider = provider;
67         this.protocol = protocol;
68     }
69 
70     /**
71      * Generates a <code>SSLContext</code> object that implements the
72      * specified secure socket protocol.
73      *
74      * @param protocol the standard name of the requested protocol.
75      *
76      * @return the new <code>SSLContext</code> object
77      *
78      * @exception NoSuchAlgorithmException if the specified protocol is not
79      * available in the default provider package or any of the other provider
80      * packages that were searched.
81      */
getInstance(String protocol)82     public static SSLContext getInstance(String protocol)
83         throws NoSuchAlgorithmException
84     {
85         try {
86             Object[] objs = SSLSecurity.getImpl(protocol, "SSLContext",
87                                                 (String) null);
88             return new SSLContext((SSLContextSpi)objs[0], (Provider)objs[1],
89                 protocol);
90         } catch (NoSuchProviderException e) {
91             throw new NoSuchAlgorithmException(protocol + " not found");
92         }
93     }
94 
95     /**
96      * Generates a <code>SSLContext</code> object that implements the
97      * specified secure socket protocol.
98      *
99      * @param protocol the standard name of the requested protocol.
100      * @param provider the name of the provider
101      *
102      * @return the new <code>SSLContext</code> object
103      *
104      * @exception NoSuchAlgorithmException if the specified protocol is not
105      * available from the specified provider.
106      * @exception NoSuchProviderException if the specified provider has not
107      * been configured.
108      */
getInstance(String protocol, String provider)109     public static SSLContext getInstance(String protocol, String provider)
110         throws NoSuchAlgorithmException, NoSuchProviderException
111     {
112         if (provider == null || provider.isEmpty())
113             throw new IllegalArgumentException("missing provider");
114         Object[] objs = SSLSecurity.getImpl(protocol, "SSLContext",
115                                             provider);
116         return new SSLContext((SSLContextSpi)objs[0], (Provider)objs[1],
117             protocol);
118     }
119 
120     /**
121      * Generates a <code>SSLContext</code> object that implements the
122      * specified secure socket protocol.
123      *
124      * @param protocol the standard name of the requested protocol.
125      * @param provider an instance of the provider
126      *
127      * @return the new <code>SSLContext</code> object
128      *
129      * @exception NoSuchAlgorithmException if the specified protocol is not
130      * available from the specified provider.
131      */
getInstance(String protocol, Provider provider)132     public static SSLContext getInstance(String protocol, Provider provider)
133         throws NoSuchAlgorithmException
134     {
135         if (provider == null)
136             throw new IllegalArgumentException("missing provider");
137         Object[] objs = SSLSecurity.getImpl(protocol, "SSLContext",
138                                             provider);
139         return new SSLContext((SSLContextSpi)objs[0], (Provider)objs[1],
140             protocol);
141     }
142 
143     /**
144      * Returns the protocol name of this <code>SSLContext</code> object.
145      *
146      * <p>This is the same name that was specified in one of the
147      * <code>getInstance</code> calls that created this
148      * <code>SSLContext</code> object.
149      *
150      * @return the protocol name of this <code>SSLContext</code> object.
151      */
getProtocol()152     public final String getProtocol() {
153         return this.protocol;
154     }
155 
156     /**
157      * Returns the provider of this <code>SSLContext</code> object.
158      *
159      * @return the provider of this <code>SSLContext</code> object
160      */
getProvider()161     public final Provider getProvider() {
162         return this.provider;
163     }
164 
165     /**
166      * Initializes this context. Either of the first two parameters
167      * may be null in which case the installed security providers will
168      * be searched for the highest priority implementation of the
169      * appropriate factory. Likewise, the secure random parameter may
170      * be null in which case the default implementation will be used.
171      *
172      * @param km the sources of authentication keys or null
173      * @param tm the sources of peer authentication trust decisions or null
174      * @param random the source of randomness for this generator or null
175      */
init(KeyManager[] km, TrustManager[] tm, SecureRandom random)176     public final void init(KeyManager[] km, TrustManager[] tm,
177                                 SecureRandom random)
178         throws KeyManagementException {
179         contextSpi.engineInit(km, tm, random);
180     }
181 
182     /**
183      * Returns a <code>SocketFactory</code> object for this
184      * context.
185      *
186      * @return the factory
187      */
getSocketFactory()188     public final SSLSocketFactory getSocketFactory() {
189         return contextSpi.engineGetSocketFactory();
190     }
191 
192     /**
193      * Returns a <code>ServerSocketFactory</code> object for
194      * this context.
195      *
196      * @return the factory
197      */
getServerSocketFactory()198     public final SSLServerSocketFactory getServerSocketFactory() {
199         return contextSpi.engineGetServerSocketFactory();
200     }
201 }
202