1'use strict'; 2const common = require('../common'); 3if (!common.hasCrypto) 4 common.skip('missing crypto'); 5 6const assert = require('assert'); 7 8const { 9 generateKey, 10 generateKeySync 11} = require('crypto'); 12 13[1, true, [], {}, Infinity, null, undefined].forEach((i) => { 14 assert.throws(() => generateKey(i, 1, common.mustNotCall()), { 15 code: 'ERR_INVALID_ARG_TYPE', 16 message: /The "type" argument must be / 17 }); 18 assert.throws(() => generateKeySync(i, 1), { 19 code: 'ERR_INVALID_ARG_TYPE', 20 message: /The "type" argument must be / 21 }); 22}); 23 24['', true, [], null, undefined].forEach((i) => { 25 assert.throws(() => generateKey('aes', i, common.mustNotCall()), { 26 code: 'ERR_INVALID_ARG_TYPE', 27 message: /The "options" argument must be / 28 }); 29 assert.throws(() => generateKeySync('aes', i), { 30 code: 'ERR_INVALID_ARG_TYPE', 31 message: /The "options" argument must be / 32 }); 33}); 34 35['', true, {}, [], null, undefined].forEach((length) => { 36 assert.throws(() => generateKey('hmac', { length }, common.mustNotCall()), { 37 code: 'ERR_INVALID_ARG_TYPE', 38 message: /The "options\.length" property must be / 39 }); 40 assert.throws(() => generateKeySync('hmac', { length }), { 41 code: 'ERR_INVALID_ARG_TYPE', 42 message: /The "options\.length" property must be / 43 }); 44}); 45 46assert.throws(() => generateKey('aes', { length: 256 }), { 47 code: 'ERR_INVALID_ARG_TYPE' 48}); 49 50assert.throws(() => generateKey('hmac', { length: -1 }, common.mustNotCall()), { 51 code: 'ERR_OUT_OF_RANGE' 52}); 53 54assert.throws(() => generateKey('hmac', { length: 4 }, common.mustNotCall()), { 55 code: 'ERR_OUT_OF_RANGE' 56}); 57 58assert.throws(() => generateKey('hmac', { length: 7 }, common.mustNotCall()), { 59 code: 'ERR_OUT_OF_RANGE' 60}); 61 62assert.throws( 63 () => generateKey('hmac', { length: 2 ** 31 }, common.mustNotCall()), { 64 code: 'ERR_OUT_OF_RANGE' 65 }); 66 67assert.throws(() => generateKeySync('hmac', { length: -1 }), { 68 code: 'ERR_OUT_OF_RANGE' 69}); 70 71assert.throws(() => generateKeySync('hmac', { length: 4 }), { 72 code: 'ERR_OUT_OF_RANGE' 73}); 74 75assert.throws(() => generateKeySync('hmac', { length: 7 }), { 76 code: 'ERR_OUT_OF_RANGE' 77}); 78 79assert.throws( 80 () => generateKeySync('hmac', { length: 2 ** 31 }), { 81 code: 'ERR_OUT_OF_RANGE' 82 }); 83 84assert.throws(() => generateKeySync('aes', { length: 123 }), { 85 code: 'ERR_INVALID_ARG_VALUE', 86 message: /The property 'options\.length' must be one of: 128, 192, 256/ 87}); 88 89{ 90 const key = generateKeySync('aes', { length: 128 }); 91 assert(key); 92 const keybuf = key.export(); 93 assert.strictEqual(keybuf.byteLength, 128 / 8); 94 95 generateKey('aes', { length: 128 }, common.mustSucceed((key) => { 96 assert(key); 97 const keybuf = key.export(); 98 assert.strictEqual(keybuf.byteLength, 128 / 8); 99 })); 100} 101 102{ 103 const key = generateKeySync('aes', { length: 256 }); 104 assert(key); 105 const keybuf = key.export(); 106 assert.strictEqual(keybuf.byteLength, 256 / 8); 107 108 generateKey('aes', { length: 256 }, common.mustSucceed((key) => { 109 assert(key); 110 const keybuf = key.export(); 111 assert.strictEqual(keybuf.byteLength, 256 / 8); 112 })); 113} 114 115{ 116 const key = generateKeySync('hmac', { length: 123 }); 117 assert(key); 118 const keybuf = key.export(); 119 assert.strictEqual(keybuf.byteLength, Math.floor(123 / 8)); 120 121 generateKey('hmac', { length: 123 }, common.mustSucceed((key) => { 122 assert(key); 123 const keybuf = key.export(); 124 assert.strictEqual(keybuf.byteLength, Math.floor(123 / 8)); 125 })); 126} 127 128assert.throws( 129 () => generateKey('unknown', { length: 123 }, common.mustNotCall()), { 130 code: 'ERR_INVALID_ARG_VALUE', 131 message: /The argument 'type' must be a supported key type/ 132 }); 133 134assert.throws(() => generateKeySync('unknown', { length: 123 }), { 135 code: 'ERR_INVALID_ARG_VALUE', 136 message: /The argument 'type' must be a supported key type/ 137}); 138