diff --git a/test/jwk/generate.test.js b/test/jwk/generate.test.js new file mode 100644 index 00000000..fc627c8a --- /dev/null +++ b/test/jwk/generate.test.js @@ -0,0 +1,110 @@ +const test = require('ava') + +const { JWK: { generate, generateSync } } = require('../..'); + +[ + ['rsa'], + ['RSA'], + ['RSA', undefined, undefined, true], + ['RSA', undefined, undefined, false], + ['RSA', 2048], + ['RSA', 2048, { use: 'sig' }], + ['RSA', 2048, { use: 'enc' }], + ['RSA', 2048, { use: 'sig', alg: 'PS256' }], + ['RSA', 2048, { use: 'enc', alg: 'RSA-OAEP' }], + ['RSA', 2048, { alg: 'PS256' }], + ['RSA', 2048, { alg: 'RSA-OAEP' }], + ['ec'], + ['EC'], + ['EC', undefined, undefined, true], + ['EC', undefined, undefined, false], + ['EC', 'P-256'], + ['EC', 'P-256', { use: 'sig' }], + ['EC', 'P-256', { use: 'enc' }], + ['EC', 'P-256', { use: 'sig', alg: 'ES256' }], + ['EC', 'P-256', { use: 'enc', alg: 'ECDH-ES' }], + ['EC', 'P-256', { alg: 'ES256' }], + ['EC', 'P-256', { alg: 'ECDH-ES' }], + ['EC', 'P-384'], + ['EC', 'P-384', { use: 'sig' }], + ['EC', 'P-384', { use: 'enc' }], + ['EC', 'P-384', { use: 'sig', alg: 'ES384' }], + ['EC', 'P-384', { use: 'enc', alg: 'ECDH-ES' }], + ['EC', 'P-384', { alg: 'ES384' }], + ['EC', 'P-384', { alg: 'ECDH-ES' }], + ['EC', 'P-521'], + ['EC', 'P-521', { use: 'sig' }], + ['EC', 'P-521', { use: 'enc' }], + ['EC', 'P-521', { use: 'sig', alg: 'ES512' }], + ['EC', 'P-521', { use: 'enc', alg: 'ECDH-ES' }], + ['EC', 'P-521', { alg: 'ES512' }], + ['EC', 'P-521', { alg: 'ECDH-ES' }], + ['oct'], + ['oct', 192], + ['oct', 192, { use: 'sig' }], + ['oct', 192, { use: 'enc' }], + ['oct', 192, { use: 'sig', alg: 'HS256' }], + ['oct', 192, { use: 'enc', alg: 'A192GCM' }], + ['oct', 192, { alg: 'HS256' }], + ['oct', 192, { alg: 'A192GCM' }] +].forEach((args) => { + test(`sync generates ${args[0]}(${args[1]}) with options ${JSON.stringify(args[2])}${typeof args[3] === 'boolean' ? ` and private=${args[3]}` : ''}`, t => { + const key = generateSync(args[0], args[1], args[2], args[3]) + t.truthy(key) + + if (key.kty !== 'oct') { + if (args.length === 4) { + if (args[3] === true) { + t.true(key.private) + t.false(key.public) + } else { + t.true(key.public) + t.false(key.private) + } + } else { + t.true(key.private) + t.false(key.public) + } + } + + if (args[2]) { + const { use, alg } = args[2] + t.is(key.use, use) + t.is(key.alg, alg) + + if (alg) { + t.deepEqual([...key.algorithms()], [alg]) + } + } + }) + + test(`async generates ${args[0]}(${args[1]}) with options ${JSON.stringify(args[2])}${typeof args[3] === 'boolean' ? ` and private=${args[3]}` : ''}`, async t => { + const key = await generate(args[0], args[1], args[2], args[3]) + t.truthy(key) + + if (key.kty !== 'oct') { + if (args.length === 4) { + if (args[3] === true) { + t.true(key.private) + t.false(key.public) + } else { + t.true(key.public) + t.false(key.private) + } + } else { + t.true(key.private) + t.false(key.public) + } + } + + if (args[2]) { + const { use, alg } = args[2] + t.is(key.use, use) + t.is(key.alg, alg) + + if (alg) { + t.deepEqual([...key.algorithms()], [alg]) + } + } + }) +})