package com.blubb.gyingpan;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
public class NoGCMSslSocketFactory extends SSLSocketFactory {
SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
@Override
public Socket createSocket(Socket arg0, String arg1, int arg2, boolean arg3)
throws IOException {
Socket s = factory.createSocket(arg0, arg1, arg2, arg3);
removeGCM(s);
return s;
}
private static void removeGCM(Socket sock) {
SSLSocket socket = (SSLSocket)sock;
String[] available = socket.getEnabledCipherSuites();
ArrayList<String> allowed = new ArrayList<String>();
for(String s : available) {
if(s.contains("_GCM_")) { // ignore
} else {
allowed.add(s);
}
}
socket.setEnabledCipherSuites(allowed.toArray(new String[0]));
}
@Override
public String[] getDefaultCipherSuites() {
return factory.getDefaultCipherSuites();
}
@Override
public String[] getSupportedCipherSuites() {
return factory.getSupportedCipherSuites();
}
@Override
public Socket createSocket(String arg0, int arg1) throws IOException,
UnknownHostException {
Socket s = factory.createSocket(arg0, arg1);
removeGCM(s);
return s;
}
@Override
public Socket createSocket(InetAddress arg0, int arg1) throws IOException {
Socket s = factory.createSocket(arg0, arg1);
removeGCM(s);
return s;
}
@Override
public Socket createSocket(String arg0, int arg1, InetAddress arg2, int arg3)
throws IOException, UnknownHostException {
Socket s = factory.createSocket(arg0, arg1, arg2, arg3);
removeGCM(s);
return s;
}
@Override
public Socket createSocket(InetAddress arg0, int arg1, InetAddress arg2,
int arg3) throws IOException {
Socket s = factory.createSocket(arg0, arg1, arg2, arg3);
removeGCM(s);
return s;
}
}