private static NetworkStream UpgradeToSSL(javax.net.ssl.SSLServerSocketFactory xSSLServerSocketFactory, TcpClient c, int count, byte[] buffer) { NetworkStream s = null; //lock (xSSLServerSocketFactory) { Console.WriteLine("UpgradeToSSL " + new { count }); // we cannot upgrade in place because byte 0x16 was already read. // need to feed it all to the new serversocket? try { // need to bridge new Thread( delegate() { Console.WriteLine("new bridge"); Thread.Sleep(1); // accept called yet? var cc = new TcpClient(); cc.Connect("127.0.0.1", UpgradeToSSL_serverport); Console.WriteLine("new bridge connected"); // first lets flush the buffer. cc.GetStream().Write(buffer, 0, count); // at the same time start reading server to reply to client new Thread( delegate() { Console.WriteLine("new reply bridge"); var rx = new byte[2048]; var rxa = true; while (rxa) { var rxc = cc.GetStream().Read(rx, 0, rx.Length); if (rxc < 0) { rxa = false; } else { c.GetStream().Write(rx, 0, rxc); } } } ).Start(); // keep reading client and writing to server... var tx = new byte[2048]; var txa = true; while (txa) { var txc = c.GetStream().Read(tx, 0, tx.Length); if (txc < 0) { txa = false; } else { cc.GetStream().Write(tx, 0, txc); } } } ).Start(); var xSSLSocket = UpgradeToSSL_server.accept() as jvm::javax.net.ssl.SSLSocket; // need to init our context! //var f = (javax.net.ssl.SSLSocketFactory)javax.net.ssl.SSLSocketFactory.getDefault(); //var xSSLSocket = (javax.net.ssl.SSLSocket)xSSLSocketFactory.createSocket(csocket.InternalSocket, // // why we need that? // "127.0.0.1", 443, // true); //// now what? //// ssl.startHandshake(); //// xSslStream.AuthenticateAsServer( xSSLSocket.startHandshake(); var xNetworkStream = new jvm::ScriptCoreLibJava.BCLImplementation.System.Net.Sockets.__NetworkStream { //InternalDiagnostics = true, InternalInputStream = xSSLSocket.getInputStream(), InternalOutputStream = xSSLSocket.getOutputStream() }; s = xNetworkStream; } catch { throw; } } return s; }
private static NetworkStream UpgradeToSSL(javax.net.ssl.SSLServerSocketFactory xSSLServerSocketFactory, TcpClient c, int count, byte[] buffer) { NetworkStream s = null; //lock (xSSLServerSocketFactory) { Console.WriteLine("UpgradeToSSL " + new { count }); // we cannot upgrade in place because byte 0x16 was already read. // need to feed it all to the new serversocket? try { // need to bridge new Thread( delegate() { Console.WriteLine("new bridge"); Thread.Sleep(1); // accept called yet? var cc = new TcpClient(); cc.Connect("127.0.0.1", UpgradeToSSL_serverport); Console.WriteLine("new bridge connected"); // first lets flush the buffer. cc.GetStream().Write(buffer, 0, count); // at the same time start reading server to reply to client new Thread( delegate() { Console.WriteLine("new reply bridge"); var rx = new byte[2048]; var rxa = true; while (rxa) { var rxc = cc.GetStream().Read(rx, 0, rx.Length); if (rxc < 0) { rxa = false; } else { c.GetStream().Write(rx, 0, rxc); } } } ).Start(); // keep reading client and writing to server... var tx = new byte[2048]; var txa = true; while (txa) { var txc = c.GetStream().Read(tx, 0, tx.Length); if (txc < 0) { txa = false; } else { cc.GetStream().Write(tx, 0, txc); } } } ).Start(); var xSSLSocket = UpgradeToSSL_server.accept() as jvm::javax.net.ssl.SSLSocket; // need to init our context! //var f = (javax.net.ssl.SSLSocketFactory)javax.net.ssl.SSLSocketFactory.getDefault(); //var xSSLSocket = (javax.net.ssl.SSLSocket)xSSLSocketFactory.createSocket(csocket.InternalSocket, // // why we need that? // "127.0.0.1", 443, // true); //// now what? //// ssl.startHandshake(); //// xSslStream.AuthenticateAsServer( xSSLSocket.startHandshake(); var xNetworkStream = new jvm::ScriptCoreLibJava.BCLImplementation.System.Net.Sockets.__NetworkStream { //InternalDiagnostics = true, InternalInputStream = xSSLSocket.getInputStream(), InternalOutputStream = xSSLSocket.getOutputStream() }; s = xNetworkStream; } catch { throw; } } return(s); }