Skip to content

Instantly share code, notes, and snippets.

@Rush
Created July 5, 2012 22:39
Show Gist options
  • Save Rush/3056914 to your computer and use it in GitHub Desktop.
Save Rush/3056914 to your computer and use it in GitHub Desktop.
Testcase for Node.JS #3638
var crypto = require('crypto');
var tls = require('tls');
var net = require('net');
function starttls(socket, options, isServer, cb) {
var credentials = crypto.createCredentials(options);
var pair = tls.createSecurePair(credentials, isServer, false, !isServer);
var cleartext = pipe(pair, socket);
pair.on('secure', function() {
try {
var ssl = pair._ssl || pair.ssl;
var verifyError = ssl.verifyError();
console.log("Secure!");
if(verifyError) {
cleartext.authorized = false;
cleartext.authorizationError = verifyError;
} else {
cleartext.authorized = true;
}
} catch(err) {
if(cb)
cb(err, undefined);
}
if(cb)
cb(undefined, cleartext);
});
cleartext._controlReleased = true;
return cleartext;
};
function pipe(pair, socket) {
pair.encrypted.pipe(socket);
socket.pipe(pair.encrypted);
pair.fd = socket.fd;
var cleartext = pair.cleartext;
cleartext.socket = socket;
cleartext.encrypted = pair.encrypted;
cleartext.authorized = false;
function onerror(e) {
if(cleartext._controlReleased) {
cleartext.emit('error', e);
}
}
function onclose() {
socket.removeListener('error', onerror);
socket.removeListener('close', onclose);
}
socket.on('error', onerror);
socket.on('close', onclose);
return cleartext;
}
var fs = require('fs');
var options = {
key: fs.readFileSync('server-key.pem'),
cert: fs.readFileSync('server-cert.pem'),
// This is necessary only if using the client certificate authentication.
requestCert: true,
// This is necessary only if the client uses the self-signed certificate.
ca: [ fs.readFileSync('client-cert.pem') ]
};
var server = net.createServer(function(s) {
console.log("Server received connection");
cleartextStream = starttls(s, options, true, function(err, cleartextStream) {
cleartextStream.write("welcome!\n", cleartextStream.authorized);
console.log("Welcome ", cleartextStream.authorized);
cleartextStream.setEncoding('utf8');
cleartextStream.pipe(cleartextStream);
console.log("");
});
});
server.listen(8000, function() {
console.log('server bound');
});
var s = net.connect(8000, '127.0.0.1');
s.on('connect', function() {
console.log("Client connected");
setInterval(function(){
s.write("dupa");
}, 1000);
}
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment