11cb0ef41Sopenharmony_ci'use strict';
21cb0ef41Sopenharmony_ci
31cb0ef41Sopenharmony_ciconst common = require('../common');
41cb0ef41Sopenharmony_ciconst fixtures = require('../common/fixtures');
51cb0ef41Sopenharmony_ci
61cb0ef41Sopenharmony_ciif (!common.hasCrypto)
71cb0ef41Sopenharmony_ci  common.skip('missing crypto');
81cb0ef41Sopenharmony_ci
91cb0ef41Sopenharmony_ciconst assert = require('assert');
101cb0ef41Sopenharmony_ciconst tls = require('tls');
111cb0ef41Sopenharmony_ci
121cb0ef41Sopenharmony_cifunction toArrayBuffer(buf) {
131cb0ef41Sopenharmony_ci  const ab = new ArrayBuffer(buf.length);
141cb0ef41Sopenharmony_ci  const view = new Uint8Array(ab);
151cb0ef41Sopenharmony_ci  return buf.map((b, i) => view[i] = b);
161cb0ef41Sopenharmony_ci}
171cb0ef41Sopenharmony_ci
181cb0ef41Sopenharmony_cifunction toDataView(buf) {
191cb0ef41Sopenharmony_ci  const ab = new ArrayBuffer(buf.length);
201cb0ef41Sopenharmony_ci  const view = new DataView(ab);
211cb0ef41Sopenharmony_ci  return buf.map((b, i) => view[i] = b);
221cb0ef41Sopenharmony_ci}
231cb0ef41Sopenharmony_ci
241cb0ef41Sopenharmony_ciconst keyBuff = fixtures.readKey('agent1-key.pem');
251cb0ef41Sopenharmony_ciconst certBuff = fixtures.readKey('agent1-cert.pem');
261cb0ef41Sopenharmony_ciconst keyBuff2 = fixtures.readKey('ec-key.pem');
271cb0ef41Sopenharmony_ciconst certBuff2 = fixtures.readKey('ec-cert.pem');
281cb0ef41Sopenharmony_ciconst caCert = fixtures.readKey('ca1-cert.pem');
291cb0ef41Sopenharmony_ciconst caCert2 = fixtures.readKey('ca2-cert.pem');
301cb0ef41Sopenharmony_ciconst keyStr = keyBuff.toString();
311cb0ef41Sopenharmony_ciconst certStr = certBuff.toString();
321cb0ef41Sopenharmony_ciconst keyStr2 = keyBuff2.toString();
331cb0ef41Sopenharmony_ciconst certStr2 = certBuff2.toString();
341cb0ef41Sopenharmony_ciconst caCertStr = caCert.toString();
351cb0ef41Sopenharmony_ciconst caCertStr2 = caCert2.toString();
361cb0ef41Sopenharmony_ciconst keyArrBuff = toArrayBuffer(keyBuff);
371cb0ef41Sopenharmony_ciconst certArrBuff = toArrayBuffer(certBuff);
381cb0ef41Sopenharmony_ciconst caArrBuff = toArrayBuffer(caCert);
391cb0ef41Sopenharmony_ciconst keyDataView = toDataView(keyBuff);
401cb0ef41Sopenharmony_ciconst certDataView = toDataView(certBuff);
411cb0ef41Sopenharmony_ciconst caArrDataView = toDataView(caCert);
421cb0ef41Sopenharmony_ci
431cb0ef41Sopenharmony_ci// Checks to ensure tls.createServer doesn't throw an error
441cb0ef41Sopenharmony_ci// Format ['key', 'cert']
451cb0ef41Sopenharmony_ci[
461cb0ef41Sopenharmony_ci  [keyBuff, certBuff],
471cb0ef41Sopenharmony_ci  [false, certBuff],
481cb0ef41Sopenharmony_ci  [keyBuff, false],
491cb0ef41Sopenharmony_ci  [keyStr, certStr],
501cb0ef41Sopenharmony_ci  [false, certStr],
511cb0ef41Sopenharmony_ci  [keyStr, false],
521cb0ef41Sopenharmony_ci  [false, false],
531cb0ef41Sopenharmony_ci  [keyArrBuff, certArrBuff],
541cb0ef41Sopenharmony_ci  [keyArrBuff, false],
551cb0ef41Sopenharmony_ci  [false, certArrBuff],
561cb0ef41Sopenharmony_ci  [keyDataView, certDataView],
571cb0ef41Sopenharmony_ci  [keyDataView, false],
581cb0ef41Sopenharmony_ci  [false, certDataView],
591cb0ef41Sopenharmony_ci  [[keyBuff, keyBuff2], [certBuff, certBuff2]],
601cb0ef41Sopenharmony_ci  [[keyStr, keyStr2], [certStr, certStr2]],
611cb0ef41Sopenharmony_ci  [[keyStr, keyStr2], false],
621cb0ef41Sopenharmony_ci  [false, [certStr, certStr2]],
631cb0ef41Sopenharmony_ci  [[{ pem: keyBuff }], false],
641cb0ef41Sopenharmony_ci  [[{ pem: keyBuff }, { pem: keyBuff }], false],
651cb0ef41Sopenharmony_ci].forEach(([key, cert]) => {
661cb0ef41Sopenharmony_ci  tls.createServer({ key, cert });
671cb0ef41Sopenharmony_ci});
681cb0ef41Sopenharmony_ci
691cb0ef41Sopenharmony_ci// Checks to ensure tls.createServer predictably throws an error
701cb0ef41Sopenharmony_ci// Format ['key', 'cert', 'expected message']
711cb0ef41Sopenharmony_ci[
721cb0ef41Sopenharmony_ci  [true, certBuff],
731cb0ef41Sopenharmony_ci  [true, certStr],
741cb0ef41Sopenharmony_ci  [true, certArrBuff],
751cb0ef41Sopenharmony_ci  [true, certDataView],
761cb0ef41Sopenharmony_ci  [true, false],
771cb0ef41Sopenharmony_ci  [true, false],
781cb0ef41Sopenharmony_ci  [{ pem: keyBuff }, false],
791cb0ef41Sopenharmony_ci  [[keyBuff, true], [certBuff, certBuff2], 1],
801cb0ef41Sopenharmony_ci  [[true, keyStr2], [certStr, certStr2], 0],
811cb0ef41Sopenharmony_ci  [[true, false], [certBuff, certBuff2], 0],
821cb0ef41Sopenharmony_ci  [true, [certBuff, certBuff2]],
831cb0ef41Sopenharmony_ci].forEach(([key, cert, index]) => {
841cb0ef41Sopenharmony_ci  const val = index === undefined ? key : key[index];
851cb0ef41Sopenharmony_ci  assert.throws(() => {
861cb0ef41Sopenharmony_ci    tls.createServer({ key, cert });
871cb0ef41Sopenharmony_ci  }, {
881cb0ef41Sopenharmony_ci    code: 'ERR_INVALID_ARG_TYPE',
891cb0ef41Sopenharmony_ci    name: 'TypeError',
901cb0ef41Sopenharmony_ci    message: 'The "options.key" property must be of type string or an ' +
911cb0ef41Sopenharmony_ci             'instance of Buffer, TypedArray, or DataView.' +
921cb0ef41Sopenharmony_ci             common.invalidArgTypeHelper(val)
931cb0ef41Sopenharmony_ci  });
941cb0ef41Sopenharmony_ci});
951cb0ef41Sopenharmony_ci
961cb0ef41Sopenharmony_ci[
971cb0ef41Sopenharmony_ci  [keyBuff, true],
981cb0ef41Sopenharmony_ci  [keyStr, true],
991cb0ef41Sopenharmony_ci  [keyArrBuff, true],
1001cb0ef41Sopenharmony_ci  [keyDataView, true],
1011cb0ef41Sopenharmony_ci  [true, true],
1021cb0ef41Sopenharmony_ci  [false, true],
1031cb0ef41Sopenharmony_ci  [false, { pem: keyBuff }],
1041cb0ef41Sopenharmony_ci  [false, 1],
1051cb0ef41Sopenharmony_ci  [[keyBuff, keyBuff2], [true, certBuff2], 0],
1061cb0ef41Sopenharmony_ci  [[keyStr, keyStr2], [certStr, true], 1],
1071cb0ef41Sopenharmony_ci  [[keyStr, keyStr2], [true, false], 0],
1081cb0ef41Sopenharmony_ci  [[keyStr, keyStr2], true],
1091cb0ef41Sopenharmony_ci].forEach(([key, cert, index]) => {
1101cb0ef41Sopenharmony_ci  const val = index === undefined ? cert : cert[index];
1111cb0ef41Sopenharmony_ci  assert.throws(() => {
1121cb0ef41Sopenharmony_ci    tls.createServer({ key, cert });
1131cb0ef41Sopenharmony_ci  }, {
1141cb0ef41Sopenharmony_ci    code: 'ERR_INVALID_ARG_TYPE',
1151cb0ef41Sopenharmony_ci    name: 'TypeError',
1161cb0ef41Sopenharmony_ci    message: 'The "options.cert" property must be of type string or an ' +
1171cb0ef41Sopenharmony_ci             'instance of Buffer, TypedArray, or DataView.' +
1181cb0ef41Sopenharmony_ci             common.invalidArgTypeHelper(val)
1191cb0ef41Sopenharmony_ci  });
1201cb0ef41Sopenharmony_ci});
1211cb0ef41Sopenharmony_ci
1221cb0ef41Sopenharmony_ci// Checks to ensure tls.createServer works with the CA parameter
1231cb0ef41Sopenharmony_ci// Format ['key', 'cert', 'ca']
1241cb0ef41Sopenharmony_ci[
1251cb0ef41Sopenharmony_ci  [keyBuff, certBuff, caCert],
1261cb0ef41Sopenharmony_ci  [keyBuff, certBuff, [caCert, caCert2]],
1271cb0ef41Sopenharmony_ci  [keyBuff, certBuff, caCertStr],
1281cb0ef41Sopenharmony_ci  [keyBuff, certBuff, [caCertStr, caCertStr2]],
1291cb0ef41Sopenharmony_ci  [keyBuff, certBuff, caArrBuff],
1301cb0ef41Sopenharmony_ci  [keyBuff, certBuff, caArrDataView],
1311cb0ef41Sopenharmony_ci  [keyBuff, certBuff, false],
1321cb0ef41Sopenharmony_ci].forEach(([key, cert, ca]) => {
1331cb0ef41Sopenharmony_ci  tls.createServer({ key, cert, ca });
1341cb0ef41Sopenharmony_ci});
1351cb0ef41Sopenharmony_ci
1361cb0ef41Sopenharmony_ci// Checks to ensure tls.createServer throws an error for CA assignment
1371cb0ef41Sopenharmony_ci// Format ['key', 'cert', 'ca']
1381cb0ef41Sopenharmony_ci[
1391cb0ef41Sopenharmony_ci  [keyBuff, certBuff, true],
1401cb0ef41Sopenharmony_ci  [keyBuff, certBuff, {}],
1411cb0ef41Sopenharmony_ci  [keyBuff, certBuff, 1],
1421cb0ef41Sopenharmony_ci  [keyBuff, certBuff, true],
1431cb0ef41Sopenharmony_ci  [keyBuff, certBuff, [caCert, true], 1],
1441cb0ef41Sopenharmony_ci].forEach(([key, cert, ca, index]) => {
1451cb0ef41Sopenharmony_ci  const val = index === undefined ? ca : ca[index];
1461cb0ef41Sopenharmony_ci  assert.throws(() => {
1471cb0ef41Sopenharmony_ci    tls.createServer({ key, cert, ca });
1481cb0ef41Sopenharmony_ci  }, {
1491cb0ef41Sopenharmony_ci    code: 'ERR_INVALID_ARG_TYPE',
1501cb0ef41Sopenharmony_ci    name: 'TypeError',
1511cb0ef41Sopenharmony_ci    message: 'The "options.ca" property must be of type string or an instance' +
1521cb0ef41Sopenharmony_ci             ' of Buffer, TypedArray, or DataView.' +
1531cb0ef41Sopenharmony_ci             common.invalidArgTypeHelper(val)
1541cb0ef41Sopenharmony_ci  });
1551cb0ef41Sopenharmony_ci});
1561cb0ef41Sopenharmony_ci
1571cb0ef41Sopenharmony_ci// Checks to ensure tls.createSecureContext works with false-y input
1581cb0ef41Sopenharmony_ci// Format ['key', 'cert', 'ca']
1591cb0ef41Sopenharmony_ci[
1601cb0ef41Sopenharmony_ci  [null, null, null],
1611cb0ef41Sopenharmony_ci  [false, false, false],
1621cb0ef41Sopenharmony_ci  [undefined, undefined, undefined],
1631cb0ef41Sopenharmony_ci  ['', '', ''],
1641cb0ef41Sopenharmony_ci  [0, 0, 0],
1651cb0ef41Sopenharmony_ci].forEach(([key, cert, ca]) => {
1661cb0ef41Sopenharmony_ci  tls.createSecureContext({ key, cert, ca });
1671cb0ef41Sopenharmony_ci});
168