| 'use strict'; |
| |
| // Test return value of tlsSocket.exportKeyingMaterial |
| |
| const common = require('../common'); |
| |
| if (!common.hasCrypto) |
| common.skip('missing crypto'); |
| |
| const assert = require('assert'); |
| const net = require('net'); |
| const tls = require('tls'); |
| const fixtures = require('../common/fixtures'); |
| |
| const key = fixtures.readKey('agent1-key.pem'); |
| const cert = fixtures.readKey('agent1-cert.pem'); |
| |
| const server = net.createServer(common.mustCall((s) => { |
| const tlsSocket = new tls.TLSSocket(s, { |
| isServer: true, |
| server: server, |
| secureContext: tls.createSecureContext({ key, cert }) |
| }); |
| |
| assert.throws(() => { |
| tlsSocket.exportKeyingMaterial(128, 'label'); |
| }, { |
| name: 'Error', |
| message: 'TLS socket connection must be securely established', |
| code: 'ERR_TLS_INVALID_STATE' |
| }); |
| |
| tlsSocket.on('secure', common.mustCall(() => { |
| const label = 'client finished'; |
| |
| const validKeyingMaterial = tlsSocket.exportKeyingMaterial(128, label); |
| assert.strictEqual(validKeyingMaterial.length, 128); |
| |
| const validKeyingMaterialWithContext = tlsSocket |
| .exportKeyingMaterial(128, label, Buffer.from([0, 1, 2, 3])); |
| assert.strictEqual(validKeyingMaterialWithContext.length, 128); |
| |
| // Ensure providing a context results in a different key than without |
| assert.notStrictEqual(validKeyingMaterial, validKeyingMaterialWithContext); |
| |
| const validKeyingMaterialWithEmptyContext = tlsSocket |
| .exportKeyingMaterial(128, label, Buffer.from([])); |
| assert.strictEqual(validKeyingMaterialWithEmptyContext.length, 128); |
| |
| assert.throws(() => { |
| tlsSocket.exportKeyingMaterial(128, label, 'stringAsContextNotSupported'); |
| }, { |
| name: 'TypeError', |
| code: 'ERR_INVALID_ARG_TYPE' |
| }); |
| |
| assert.throws(() => { |
| tlsSocket.exportKeyingMaterial(128, label, 1234); |
| }, { |
| name: 'TypeError', |
| code: 'ERR_INVALID_ARG_TYPE' |
| }); |
| |
| assert.throws(() => { |
| tlsSocket.exportKeyingMaterial(10, null); |
| }, { |
| name: 'TypeError', |
| code: 'ERR_INVALID_ARG_TYPE' |
| }); |
| |
| assert.throws(() => { |
| tlsSocket.exportKeyingMaterial('length', 1234); |
| }, { |
| name: 'TypeError', |
| code: 'ERR_INVALID_ARG_TYPE' |
| }); |
| |
| assert.throws(() => { |
| tlsSocket.exportKeyingMaterial(-3, 'a'); |
| }, { |
| name: 'RangeError', |
| code: 'ERR_OUT_OF_RANGE' |
| }); |
| |
| assert.throws(() => { |
| tlsSocket.exportKeyingMaterial(0, 'a'); |
| }, { |
| name: 'RangeError', |
| code: 'ERR_OUT_OF_RANGE' |
| }); |
| |
| tlsSocket.end(); |
| server.close(); |
| })); |
| })).listen(0, () => { |
| const opts = { |
| port: server.address().port, |
| rejectUnauthorized: false |
| }; |
| |
| tls.connect(opts, common.mustCall(function() { this.end(); })); |
| }); |