/*
* Copyright (C) 2003 Sun Microsystems, Inc.
* Copyright (C) 2003-2010 Martin Koegler
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*/
package com.iiordanov.bVNC;
import java.net.Socket;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import android.util.Log;
public abstract class TLSTunnelBase {
private static final String TAG = "TLSTunnelBase";
public TLSTunnelBase (Socket sock_) {
sock = sock_;
}
protected void initContext (SSLContext sc) throws java.security.GeneralSecurityException {
sc.init (null, null, null);
}
public void setup (RfbProto cc) throws Exception {
try {
SSLSocketFactory sslfactory;
SSLSocket sslsock;
SSLContext sc = SSLContext.getInstance ("TLS");
Log.i(TAG, "Generating TLS context");
initContext (sc);
Log.i(TAG, "Doing TLS handshake");
sslfactory = sc.getSocketFactory ();
sslsock = (SSLSocket) sslfactory.createSocket (sock,
sock.getInetAddress().
getHostName(),
sock.getPort(), true);
sslsock.setTcpNoDelay(true);
sslsock.setSoTimeout(Constants.SOCKET_CONN_TIMEOUT);
setParam (sslsock);
sslsock.setSoTimeout(0);
/* Not necessary - just ensures that we know what cipher
* suite we are using for the output of toString()
*/
sslsock.startHandshake ();
Log.i(TAG, "TLS done");
cc.setStreams (sslsock.getInputStream(), sslsock.getOutputStream());
}
catch (java.io.IOException e) {
throw new Exception("TLS handshake failed " + e.toString ());
}
catch (java.security.GeneralSecurityException e) {
throw new Exception("TLS handshake failed " + e.toString ());
}
}
protected abstract void setParam (SSLSocket sock) throws Exception;
Socket sock;
}