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