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;
 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}