1package eu.siacs.conversations.utils;
2
3import java.io.IOException;
4import java.net.InetAddress;
5import java.net.Socket;
6import java.security.KeyManagementException;
7import java.security.NoSuchAlgorithmException;
8import java.security.SecureRandom;
9import javax.net.ssl.SSLContext;
10import javax.net.ssl.SSLSocket;
11import javax.net.ssl.SSLSocketFactory;
12import javax.net.ssl.X509TrustManager;
13
14public class TLSSocketFactory extends SSLSocketFactory {
15
16 private final SSLSocketFactory internalSSLSocketFactory;
17
18 public TLSSocketFactory(X509TrustManager[] trustManager, SecureRandom random) throws KeyManagementException, NoSuchAlgorithmException {
19 SSLContext context = SSLSocketHelper.getSSLContext();
20 context.init(null, trustManager, random);
21 this.internalSSLSocketFactory = context.getSocketFactory();
22 }
23
24 @Override
25 public String[] getDefaultCipherSuites() {
26 return CryptoHelper.getOrderedCipherSuites(internalSSLSocketFactory.getDefaultCipherSuites());
27 }
28
29 @Override
30 public String[] getSupportedCipherSuites() {
31 return internalSSLSocketFactory.getSupportedCipherSuites();
32 }
33
34 @Override
35 public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
36 return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose));
37 }
38
39 @Override
40 public Socket createSocket(String host, int port) throws IOException {
41 return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
42 }
43
44 @Override
45 public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException {
46 return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port, localHost, localPort));
47 }
48
49 @Override
50 public Socket createSocket(InetAddress host, int port) throws IOException {
51 return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
52 }
53
54 @Override
55 public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
56 return enableTLSOnSocket(internalSSLSocketFactory.createSocket(address, port, localAddress, localPort));
57 }
58
59 private static Socket enableTLSOnSocket(Socket socket) {
60 if(socket instanceof SSLSocket) {
61 SSLSocketHelper.setSecurity((SSLSocket) socket);
62 }
63 return socket;
64 }
65}