alpha 0.0.1
[DHBWCampusApp.git] / app / src / main / java / de / dhbwloe / campusapp / wifi / SecureLoginSocketFactory.java
1 package de.dhbwloe.campusapp.wifi;
2
3 import android.util.Log;
4
5 import java.io.IOException;
6 import java.net.InetAddress;
7 import java.net.Socket;
8 import java.net.UnknownHostException;
9 import java.security.KeyManagementException;
10 import java.security.NoSuchAlgorithmException;
11 import java.security.SecureRandom;
12 import java.security.cert.CertificateException;
13 import java.security.cert.X509Certificate;
14
15 import javax.net.ssl.SSLContext;
16 import javax.net.ssl.SSLSocket;
17 import javax.net.ssl.SSLSocketFactory;
18 import javax.net.ssl.TrustManager;
19
20 public class SecureLoginSocketFactory extends SSLSocketFactory {
21     private static final String ENABLED_PROTOCOLS[] = {
22             "TLSv1", "TLSv1.1", "TLSv1.2"
23     };
24     private static final String ENABLED_CIPHERS[] = {
25             "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
26             "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
27             "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
28             "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
29             "TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
30             "TLS_DHE_RSA_WITH_AES_256_CBC_SHA",
31             "TLS_DHE_DSS_WITH_AES_128_CBC_SHA",
32             "TLS_ECDHE_RSA_WITH_RC4_128_SHA",
33             "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",
34             "TLS_RSA_WITH_AES_128_CBC_SHA",
35             "TLS_RSA_WITH_AES_256_CBC_SHA",
36             "SSL_RSA_WITH_3DES_EDE_CBC_SHA",
37             "SSL_RSA_WITH_RC4_128_SHA",
38             "SSL_RSA_WITH_RC4_128_MD5",
39     };
40
41     private SSLSocketFactory socketFactory;
42     public SSLContext context;
43
44     public SecureLoginSocketFactory(SSLContext context, SSLSocketFactory innerSslSocketFactory) {
45         super();
46         this.context = context;
47         this.socketFactory = innerSslSocketFactory;
48     }
49
50     @Override
51     public String[] getDefaultCipherSuites() {
52         return socketFactory.getDefaultCipherSuites();
53     }
54
55     @Override
56     public String[] getSupportedCipherSuites() {
57         return socketFactory.getSupportedCipherSuites();
58     }
59
60     @Override
61     public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
62         return enableTLSOnSocket(socketFactory.createSocket(s, host, port, autoClose));
63     }
64
65     @Override
66     public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
67         return enableTLSOnSocket(socketFactory.createSocket(host, port));
68     }
69
70     @Override
71     public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {
72         return enableTLSOnSocket(socketFactory.createSocket(host, port, localHost, localPort));
73     }
74
75     @Override
76     public Socket createSocket(InetAddress host, int port) throws IOException {
77         return enableTLSOnSocket(socketFactory.createSocket(host, port));
78     }
79
80     @Override
81     public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
82         return enableTLSOnSocket(socketFactory.createSocket(address, port, localAddress, localPort));
83     }
84
85     private Socket enableTLSOnSocket(Socket socket) {
86         if(socket != null && (socket instanceof SSLSocket)) {
87             SSLSocket sslSocket = ((SSLSocket) socket);
88
89             sslSocket.setEnabledCipherSuites(ENABLED_CIPHERS);
90             sslSocket.setEnabledProtocols(ENABLED_PROTOCOLS);
91         }
92         return socket;
93     }
94
95 }