From 80400c6f7e3ff0116551181d258767b956ff4cc1 Mon Sep 17 00:00:00 2001 From: Jack Allnutt Date: Thu, 14 Mar 2013 00:55:54 +0000 Subject: [PATCH] Support for SSL connections through SOCKS proxy --- server/socks.js | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/server/socks.js b/server/socks.js index 25ad4bb..2a4853f 100755 --- a/server/socks.js +++ b/server/socks.js @@ -2,6 +2,7 @@ var net = require('net'), tls = require('tls'), util = require('util'), EventEmitter = require('events').EventEmitter, + crypto = require('crypto'), ipaddr = require('ipaddr.js'); var SocksConnection = function (destination, socks) { @@ -13,6 +14,7 @@ var SocksConnection = function (destination, socks) { this.socksSocket = net.connect({host: socks.host, port: socks.port}, socksConnected.bind(this)); this.socksSocket.once('data', socksAuth.bind(this)); + this.socksSocket.on('error', socksError); }; util.inherits(SocksConnection, EventEmitter); @@ -143,8 +145,30 @@ var socksReply = function (data) { } }; -var emitSocket = function () { +var starttls = function () { var that = this; - this.socksSocket.setEncoding('utf8'); - this.emit('socksConnect', this.socksSocket); -}; \ No newline at end of file + + var pair = tls.createSecurePair(crypto.createCredentials(), false); + pair.encrypted.pipe(this.socksSocket); + this.socksSocket.pipe(pair.encrypted); + + pair.cleartext.socket = this.socksSocket; + pair.cleartext.encrypted = pair.encrypted; + pair.cleartext.authorised = false; + + pair.on('secure', function () { + that.emit('socksConnect', pair.cleartext, pair.encrypted); + }); +} + +var socksError = function (err) { + console.log(err); +} + +var emitSocket = function () { + if (this.destination.ssl) { + starttls.call(this); + } else { + this.emit('socksConnect', this.socksSocket); + } +}; -- 2.25.1