From 15d5378684e630e341d674c7f67aecb76bd802c6 Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Fri, 19 Nov 2010 13:28:04 -0800 Subject: [PATCH] Add failing test for TLS server --- test/fixtures/agent.crt | 21 +++++ test/fixtures/agent.key | 27 ++++++ test/simple/test-securepair-server.js | 122 ++++++++++++++++++++++++++ 3 files changed, 170 insertions(+) create mode 100644 test/fixtures/agent.crt create mode 100644 test/fixtures/agent.key create mode 100644 test/simple/test-securepair-server.js diff --git a/test/fixtures/agent.crt b/test/fixtures/agent.crt new file mode 100644 index 0000000000..5883cd4496 --- /dev/null +++ b/test/fixtures/agent.crt @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDXTCCAkWgAwIBAgIJAMUSOvlaeyQHMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX +aWRnaXRzIFB0eSBMdGQwHhcNMTAxMTE2MDkzMjQ5WhcNMTMxMTE1MDkzMjQ5WjBF +MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50 +ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAz+LXZOjcQCJq3+ZKUFabj71oo/ex/XsBcFqtBThjjTw9CVEVwfPQQp4X +wtPiB204vnYXwQ1/R2NdTQqCZu47l79LssL/u2a5Y9+0NEU3nQA5qdt+1FAE0c5o +exPimXOrR3GWfKz7PmZ2O0117IeCUUXPG5U8umhDe/4mDF4ZNJiKc404WthquTqg +S7rLQZHhZ6D0EnGnOkzlmxJMYPNHSOY1/6ivdNUUcC87awNEA3lgfhy25IyBK3QJ +c+aYKNTbt70Lery3bu2wWLFGtmNiGlQTS4JsxImRsECTI727ObS7/FWAQsqW+COL +0Sa5BuMFrFIpjPrEe0ih7vRRbdmXRwIDAQABo1AwTjAdBgNVHQ4EFgQUDnV4d6mD +tOnluLoCjkUHTX/n4agwHwYDVR0jBBgwFoAUDnV4d6mDtOnluLoCjkUHTX/n4agw +DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAFwV4MQfTo+qMv9JMiyno +IEiqfOz4RgtmBqRnXUffcjS2dhc7/z+FPZnM79Kej8eLHoVfxCyWRHFlzm93vEdv +wxOCrD13EDOi08OOZfxWyIlCa6Bg8cMAKqQzd2OvQOWqlRWBTThBJIhWflU33izX +Qn5GdmYqhfpc+9ZHHGhvXNydtRQkdxVK2dZNzLBvBlLlRmtoClU7xm3A+/5dddeP +AQHEPtyFlUw49VYtZ3ru6KqPms7MKvcRhYLsy9rwSfuuniMlx4d0bDR7TOkw0QQS +A0N8MGQRQpzl4mw4jLzyM5d5QtuGBh2P6hPGa0YQxtI3RPT/p6ENzzBiAKXiSfzo +xw== +-----END CERTIFICATE----- diff --git a/test/fixtures/agent.key b/test/fixtures/agent.key new file mode 100644 index 0000000000..f31ff3d944 --- /dev/null +++ b/test/fixtures/agent.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAz+LXZOjcQCJq3+ZKUFabj71oo/ex/XsBcFqtBThjjTw9CVEV +wfPQQp4XwtPiB204vnYXwQ1/R2NdTQqCZu47l79LssL/u2a5Y9+0NEU3nQA5qdt+ +1FAE0c5oexPimXOrR3GWfKz7PmZ2O0117IeCUUXPG5U8umhDe/4mDF4ZNJiKc404 +WthquTqgS7rLQZHhZ6D0EnGnOkzlmxJMYPNHSOY1/6ivdNUUcC87awNEA3lgfhy2 +5IyBK3QJc+aYKNTbt70Lery3bu2wWLFGtmNiGlQTS4JsxImRsECTI727ObS7/FWA +QsqW+COL0Sa5BuMFrFIpjPrEe0ih7vRRbdmXRwIDAQABAoIBAGe4+9VqZfJN+dsq +8Osyuz01uQ8OmC0sAWTIqUlQgENIyf9rCJsUBlYmwR5BT6Z69XP6QhHdpSK+TiAR +XUz0EqG9HYzcxHIBaACP7j6iRoQ8R4kbbiWKo0z3WqQGIOqFjvD/mKEuQdE5mEYw +eOUCG6BnX1WY2Yr8WKd2AA/tp0/Y4d8z04u9eodMpSTbHTzYMJb5SbBN1vo6FY7q +8zSuO0BMzXlAxUsCwHsk1GQHFr8Oh3zIR7bQGtMBouI+6Lhh7sjFYsfxJboqMTBV +IKaA216M6ggHG7MU1/jeKcMGDmEfqQLQoyWp29rMK6TklUgipME2L3UD7vTyAVzz +xbVOpZkCgYEA8CXW4sZBBrSSrLR5SB+Ubu9qNTggLowOsC/kVKB2WJ4+xooc5HQo +mFhq1v/WxPQoWIxdYsfg2odlL+JclK5Qcy6vXmRSdAQ5lK9gBDKxZSYc3NwAw2HA +zyHCTK+I0n8PBYQ+yGcrxu0WqTGnlLW+Otk4CejO34WlgHwbH9bbY5UCgYEA3ZvT +C4+OoMHXlmICSt29zUrYiL33IWsR3/MaONxTEDuvgkOSXXQOl/8Ebd6Nu+3WbsSN +bjiPC/JyL1YCVmijdvFpl4gjtgvfJifs4G+QHvO6YfsYoVANk4u6g6rUuBIOwNK4 +RwYxwDc0oysp+g7tPxoSgDHReEVKJNzGBe9NGGsCgYEA4O4QP4gCEA3B9BF2J5+s +n9uPVxmiyvZUK6Iv8zP4pThTBBMIzNIf09G9AHPQ7djikU2nioY8jXKTzC3xGTHM +GJZ5m6fLsu7iH+nDvSreDSeNkTBfZqGAvoGYQ8uGE+L+ZuRfCcXYsxIOT5s6o4c3 +Dle2rVFpsuKzCY00urW796ECgYBn3go75+xEwrYGQSer6WR1nTgCV29GVYXKPooy +zmmMOT1Yw80NSkEw0pFD4cTyqVYREsTrPU0mn1sPfrOXxnGfZSVFpcR/Je9QVfQ7 +eW7GYxwfom335aqHVj10SxRqteP+UoWWnHujCPz94VRKZMakBddYCIGSan+G6YdS +7sdmwwKBgBc2qj0wvGXDF2kCLwSGfWoMf8CS1+5fIiUIdT1e/+7MfDdbmLMIFVjF +QKS3zVViXCbrG5SY6wS9hxoc57f6E2A8vcaX6zy2xkZlGHQCpWRtEM5R01OWJQaH +HsHMmQZGUQVoDm1oRkDhrTFK4K3ukc3rAxzeTZ96utOQN8/KJsTv +-----END RSA PRIVATE KEY----- diff --git a/test/simple/test-securepair-server.js b/test/simple/test-securepair-server.js new file mode 100644 index 0000000000..5905e229a3 --- /dev/null +++ b/test/simple/test-securepair-server.js @@ -0,0 +1,122 @@ +var common = require('../common'); + +var join = require('path').join; +var net = require('net'); +var assert = require('assert'); +var fs = require('fs'); +var crypto = require('crypto'); +var spawn = require('child_process').spawn; + +var connections = 0; +var key = fs.readFileSync(join(common.fixturesDir, "agent.key")).toString(); +var cert = fs.readFileSync(join(common.fixturesDir, "agent.crt")).toString(); + +function log (a) { + console.log('***server*** ' + a); +} + +var server = net.createServer(function (socket) { + connections++; + log('connection'); + var sslcontext = crypto.createCredentials({key: key, cert: cert}); + sslcontext.context.setCiphers('RC4-SHA:AES128-SHA:AES256-SHA'); + + var spair = crypto.createPair(sslcontext, true); + + spair.encrypted.pipe(socket); + socket.pipe(spair.encrypted); + + var clear = spair.cleartext; + + log('i set it secure'); + + spair.on('secure', function () { + log('connected+secure!'); + clear.write(new Buffer('hello\r\n')); + log(spair.getPeerCertificate()); + log(spair.getCipher()); + }); + + clear.on('data', function (data) { + log('read %d bytes', data.length); + clear.write(data); + }); + + socket.on('end', function (err) { + log('all done: '+ err); + clear.write(new Buffer('goodbye\r\n')); + clear.end(); + }); + + clear.on('error', function(err) { + log('got error: '); + log(err); + log(err.stack); + socket.destroy(); + }); + + spair.encrypted.on('error', function(err) { + log('encrypted error: '); + log(err); + log(err.stack); + socket.destroy(); + }); + + socket.on('error', function(err) { + log('socket error: '); + log(err); + log(err.stack); + socket.destroy(); + }); + + spair.on('error', function(err) { + log('secure error: '); + log(err); + log(err.stack); + socket.destroy(); + }); +}); + +var gotHello = false; +var sentWorld = false; +var gotWorld = false; +var opensslExitCode = -1; + +server.listen(8000, function () { + // To test use: openssl s_client -connect localhost:8000 + var client = spawn('openssl', ['s_client', '-connect', '127.0.0.1:8000']); + + + var out = ''; + + client.stdout.setEncoding('utf8'); + client.stdout.on('data', function (d) { + out += d; + + if (!gotHello && /hello/.test(out)) { + gotHello = true; + client.stdin.write('world\r\n'); + sentWorld = true; + } + + if (!gotWorld && /world/.test(out)) { + gotWorld = true; + client.stdin.end(); + } + }); + + client.stdout.pipe(process.stdout); + + client.on('exit', function (code) { + opensslExitCode = code; + server.close(); + }); +}); + +process.on('exit', function () { + assert.equal(1, connections); + assert.ok(gotHello); + assert.ok(sentWorld); + assert.ok(gotWorld); + assert.equal(0, opensslExitCode); +});