current commit
261025.12 · test,benchmark: drop OpenSSL 1.x-only coverage
// Flags: --tls-min-v1.0
'use strict';

const common = require('../common');

if (!common.hasCrypto) {
  common.skip('missing crypto');
}

const fixtures = require('../common/fixtures');
const { hasOpenSSL, hasFIPS, isBoringSSL } = require('../common/crypto');

const https = require('https');
const { constants: { SSL_OP_NO_TICKET } } = require('crypto');
const fips3 = hasFIPS(3);

const options = {
  key: fixtures.readKey('agent1-key.pem'),
  cert: fixtures.readKey('agent1-cert.pem'),
  secureOptions: SSL_OP_NO_TICKET,
};

if (fips3) {
  options.minVersion = 'TLSv1.3';
  options.maxVersion = 'TLSv1.3';
}

if (!isBoringSSL) {
  options.ciphers = fips3 ?
    'ECDHE-RSA-AES256-GCM-SHA384' : 'RSA@SECLEVEL=0';
}

// Create the initial server and cache a session from it.
https.createServer(options, function(req, res) {
  res.writeHead(200, { 'Connection': 'close' });
  res.end('ohai');
}).listen(0, function() {
  first(this);
});

// Do request and let agent cache the session
function first(server) {
  const port = server.address().port;
  const req = https.request({
    port: port,
    rejectUnauthorized: false
  }, function(res) {
    res.resume();

    server.close(function() {
      faultyServer(port);
    });
  });
  req.end();
}

// Create a server constrained to a different TLS version.
function faultyServer(port) {
  if (fips3) {
    options.minVersion = 'TLSv1.2';
    options.maxVersion = 'TLSv1.2';
  } else {
    options.secureProtocol = 'TLSv1_method';
  }
  https.createServer(options, function(req, res) {
    res.writeHead(200, { 'Connection': 'close' });
    res.end('hello faulty');
  }).listen(port, function() {
    second(this);
  });
}

// Attempt to request using cached session
function second(server, session) {
  const req = https.request({
    port: server.address().port,
    ciphers: fips3 ? 'ECDHE-RSA-AES256-GCM-SHA384' :
      (hasOpenSSL(3, 1) ? 'DEFAULT:@SECLEVEL=0' : 'DEFAULT'),
    rejectUnauthorized: false
  }, function(res) {
    res.resume();
  });

  // Offering the cached session to a server using another TLS version should
  // not prevent a fresh connection.
  req.on('response', common.mustCall(function(res) {
    // The test is now complete.
    server.close();
  }));

  req.end();
}