diff --git a/lib/crypto.js b/lib/crypto.js index c95103f3dfb..2a9225ae160 100644 --- a/lib/crypto.js +++ b/lib/crypto.js @@ -36,7 +36,7 @@ try { } -function Credentials(secureProtocol) { +function Credentials(secureProtocol, context) { if (!(this instanceof Credentials)) { return new Credentials(secureProtocol); } @@ -45,22 +45,28 @@ function Credentials(secureProtocol) { throw new Error('node.js not compiled with openssl crypto support.'); } - this.context = new SecureContext(); - - if (secureProtocol) { - this.context.init(secureProtocol); + if (context) { + this.context = context; + this.reuseContext = true; } else { - this.context.init(); - } + this.context = new SecureContext(); + if (secureProtocol) { + this.context.init(secureProtocol); + } else { + this.context.init(); + } + } } exports.Credentials = Credentials; -exports.createCredentials = function(options) { +exports.createCredentials = function(options, context) { if (!options) options = {}; - var c = new Credentials(options.secureProtocol); + var c = new Credentials(options.secureProtocol, context); + + if (context) return c; if (options.key) c.context.setKey(options.key); diff --git a/lib/tls.js b/lib/tls.js index 295c95a6308..781f4c53922 100644 --- a/lib/tls.js +++ b/lib/tls.js @@ -713,16 +713,23 @@ function Server(/* [options], listener */) { var self = this; + // Handle option defaults: + this.setOptions(options); + + var sharedCreds = crypto.createCredentials({ + key: self.key, + cert: self.cert, + ca: self.ca, + ciphers: self.ciphers, + secureProtocol: self.secureProtocol, + crl: self.crl + }); + + sharedCreds.context.setCiphers('RC4-SHA:AES128-SHA:AES256-SHA'); + // constructor call net.Server.call(this, function(socket) { - var creds = crypto.createCredentials({ - key: self.key, - cert: self.cert, - ca: self.ca, - secureProtocol: self.secureProtocol, - crl: self.crl - }); - creds.context.setCiphers('RC4-SHA:AES128-SHA:AES256-SHA'); + var creds = crypto.createCredentials(null, sharedCreds.context); var pair = new SecurePair(creds, true,