node/benchmark/tls/throughput-s2c.js
Adam Majer 9cde7a033e
crypto: don't disable TLS 1.3 without suites
In the manual page, there is a statement that ciphersuites contain
explicit default settings - all TLS 1.3 ciphersuites enabled.
In node, we assume that an empty setting mean no ciphersuites and
we disable TLS 1.3. A correct approach to disabling TLS 1.3 is to
disable TLS 1.3 and by not override the default ciphersuits
with an empty string.

So, only override OpenSSL's TLS 1.3 ciphersuites with an explicit
list of ciphers. If none are acceptable, the correct approach is
to disable TLS 1.3 instead elsewhere.

Fixes: https://github.com/nodejs/node/issues/43419

PR-URL: https://github.com/nodejs/node/pull/43427
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Paolo Insogna <paolo@cowtech.it>
Reviewed-By: James M Snell <jasnell@gmail.com>
2022-06-27 09:47:13 +01:00

105 lines
2.4 KiB
JavaScript

'use strict';
const common = require('../common.js');
const bench = common.createBenchmark(main, {
dur: [5],
type: ['buf', 'asc', 'utf'],
sendchunklen: [256, 32 * 1024, 128 * 1024, 16 * 1024 * 1024],
recvbuflen: [0, 64 * 1024, 1024 * 1024],
recvbufgenfn: ['true', 'false']
});
const fixtures = require('../../test/common/fixtures');
let options;
let recvbuf;
let received = 0;
const tls = require('tls');
function main({ dur, type, sendchunklen, recvbuflen, recvbufgenfn }) {
if (isFinite(recvbuflen) && recvbuflen > 0)
recvbuf = Buffer.alloc(recvbuflen);
let encoding;
let chunk;
switch (type) {
case 'buf':
chunk = Buffer.alloc(sendchunklen, 'b');
break;
case 'asc':
chunk = 'a'.repeat(sendchunklen);
encoding = 'ascii';
break;
case 'utf':
chunk = 'ü'.repeat(sendchunklen / 2);
encoding = 'utf8';
break;
default:
throw new Error('invalid type');
}
options = {
key: fixtures.readKey('rsa_private.pem'),
cert: fixtures.readKey('rsa_cert.crt'),
ca: fixtures.readKey('rsa_ca.crt'),
ciphers: 'AES256-GCM-SHA384',
maxVersion: 'TLSv1.2',
};
let socketOpts;
if (recvbuf === undefined) {
socketOpts = { port: common.PORT, rejectUnauthorized: false };
} else {
let buffer = recvbuf;
if (recvbufgenfn === 'true') {
let bufidx = -1;
const bufpool = [
recvbuf,
Buffer.from(recvbuf),
Buffer.from(recvbuf),
];
buffer = () => {
bufidx = (bufidx + 1) % bufpool.length;
return bufpool[bufidx];
};
}
socketOpts = {
port: common.PORT,
rejectUnauthorized: false,
onread: {
buffer,
callback: function(nread, buf) {
received += nread;
}
}
};
}
const server = tls.createServer(options, (socket) => {
socket.on('data', (buf) => {
socket.on('drain', write);
write();
});
function write() {
while (false !== socket.write(chunk, encoding));
}
});
let conn;
server.listen(common.PORT, () => {
conn = tls.connect(socketOpts, () => {
setTimeout(done, dur * 1000);
bench.start();
conn.write('hello');
});
conn.on('data', (chunk) => {
received += chunk.length;
});
});
function done() {
const mbits = (received * 8) / (1024 * 1024);
bench.end(mbits);
process.exit(0);
}
}