TLSSocketFactory.java

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