details: https://github.com/nginx/njs/commit/54f18a1049e86a1f2d7ace387c99b38d7f3f6875 branches: master commit: 54f18a1049e86a1f2d7ace387c99b38d7f3f6875 user: Dmitry Volyntsev <xei...@nginx.com> date: Wed, 12 Feb 2025 18:07:26 -0800 description: QuickJS: added WebCrypto import tests forgotten in 75ca26f.
Import related tests are consolidated from other WebCrypto tests. --- external/qjs_webcrypto_module.c | 17 +- test/webcrypto/aes.t.mjs | 3 - test/webcrypto/import.t.mjs | 646 ++++++++++++++++++++++++++++++++++++++ test/webcrypto/rsa.pkcs8.broken2 | 16 + test/webcrypto/rsa.t.mjs | 2 - test/webcrypto/rsa_decoding.t.mjs | 2 - test/webcrypto/sign.t.mjs | 135 -------- 7 files changed, 664 insertions(+), 157 deletions(-) diff --git a/external/qjs_webcrypto_module.c b/external/qjs_webcrypto_module.c index 3cb3d2b2..4816031c 100644 --- a/external/qjs_webcrypto_module.c +++ b/external/qjs_webcrypto_module.c @@ -4167,20 +4167,7 @@ qjs_webcrypto_key_algorithm(JSContext *cx, JSValueConst this_val) return JS_EXCEPTION; } - ret = JS_NewObject(cx); - if (JS_IsException(ret)) { - JS_FreeValue(cx, obj); - return JS_EXCEPTION; - } - - if (JS_DefinePropertyValueStr(cx, ret, "name", hash, JS_PROP_C_W_E) - < 0) - { - JS_FreeValue(cx, obj); - return JS_EXCEPTION; - } - - if (JS_DefinePropertyValueStr(cx, obj, "hash", ret, JS_PROP_C_W_E) + if (JS_DefinePropertyValueStr(cx, obj, "hash", hash, JS_PROP_C_W_E) < 0) { JS_FreeValue(cx, obj); @@ -4377,7 +4364,7 @@ qjs_jwk_kty(JSContext *cx, JSValueConst value) } } - JS_ThrowTypeError(cx, "invalid JWK key type: %s", kty.start); + JS_ThrowTypeError(cx, "invalid JWK key type: \"%s\"", kty.start); JS_FreeCString(cx, (char *) kty.start); return QJS_KEY_JWK_KTY_UNKNOWN; diff --git a/test/webcrypto/aes.t.mjs b/test/webcrypto/aes.t.mjs index 80cddabb..7c482583 100644 --- a/test/webcrypto/aes.t.mjs +++ b/test/webcrypto/aes.t.mjs @@ -65,7 +65,6 @@ let aes_tsuite = { { name: "AES-GCM", data: "aabbcc", tagLength: 96 }, { name: "AES-GCM", data: "aabbcc", tagLength: 112 }, { name: "AES-GCM", data: "aabbcc", tagLength: 113, exception: "TypeError: AES-GCM Invalid tagLength" }, - { name: "AES-GCM", data: "aabbcc", key: "aabbcc", exception: "TypeError: Invalid key length" }, { name: "AES-GCM", data: "aabbcc", key: "001122330011223300112233001122330011223300112233" }, { name: "AES-GCM", data: "aabbccdd".repeat(4096) }, @@ -88,14 +87,12 @@ let aes_tsuite = { { name: "AES-CTR", data: "aabbcc", key: "001122330011223300112233001122330011223300112233" }, { name: "AES-CTR", data: "aabbccdd", length: 129, exception: "TypeError: AES-CTR algorithm.length must be between 1 and 128" }, - { name: "AES-CTR", data: "aabbcc", key: "aabbcc", exception: "TypeError: Invalid key length" }, { name: "AES-CBC", data: "aa" }, { name: "AES-CBC", data: "aabbccdd".repeat(4) }, { name: "AES-CBC", data: "aabbccdd".repeat(4096) }, { name: "AES-CBC", data: "aabbccdd".repeat(5), iv: "ffffffffffffffffffffffffffffffff" }, { name: "AES-CBC", data: "aabbcc", key: "001122330011223300112233001122330011223300112233" }, - { name: "AES-CBC", data: "aabbcc", key: "aabbcc", exception: "TypeError: Invalid key length" }, ]}; run([aes_tsuite]) diff --git a/test/webcrypto/import.t.mjs b/test/webcrypto/import.t.mjs new file mode 100644 index 00000000..1b804006 --- /dev/null +++ b/test/webcrypto/import.t.mjs @@ -0,0 +1,646 @@ +/*--- +includes: [compatNjs.js, compatFs.js, compatWebcrypto.js, runTsuite.js, webCryptoUtils.js, compareArray.js] +flags: [async] +---*/ + +async function test(params) { + let key = await crypto.subtle.importKey(params.key.fmt, + params.key.key, + params.key.alg, + params.key.extractable, + params.key.usage); + + if (params.expected && !validate_key(key, params)) { + throw Error(`failed validate`); + } + + return 'SUCCESS'; +} + +function p(args, default_opts) { + let key, pem; + let params = merge({}, default_opts); + params = merge(params, args); + + switch (params.key.fmt) { + case "spki": + pem = fs.readFileSync(`test/webcrypto/${params.key.key}`); + key = pem_to_der(pem, "PUBLIC"); + break; + case "pkcs8": + pem = fs.readFileSync(`test/webcrypto/${params.key.key}`); + key = pem_to_der(pem, "PRIVATE"); + break; + case "jwk": + key = load_jwk(params.key.key); + break; + case "raw": + key = Buffer.from(params.key.key, "base64url"); + break; + default: + throw Error("Unknown encoding key format"); + } + + params.key.key = key; + + return params; +} + +function validate_key(key, params) { + let expected = params.expected; + if (expected.algorithm) { + if (!key.algorithm) { + throw Error(`missing import key algorithm`); + } + + if (expected.algorithm.name !== key.algorithm.name) { + throw Error(`unexpected import key algorithm name: ${key.algorithm.name} != ${expected.algorithm.name}`); + } + + if (has_njs() + && expected.algorithm.name == "HMAC" + && (expected.algorithm.hash !== key.algorithm.hash)) + { + throw Error(`unexpected import key algorithm hash: ${JSON.stringify(key.algorithm.hash)} != ${expected.algorithm.hash}`); + } + } + + if (expected.type !== key.type) { + throw Error(`unexpected import key type: ${key.type} != ${expected.type}`); + } + + if (expected.extractable !== key.extractable) { + throw Error(`unexpected import key extractable: ${key.extractable} != ${expected.extractable}`); + } + + if (expected.usages && !compareArray(expected.usages, key.usages)) { + throw Error(`unexpected import key usages: ${key.usages} != ${expected.usages}`); + } + + return true; +} + +let aes_tsuite = { + name: "AES importing", + skip: () => (!has_webcrypto()), + T: test, + prepare_args: p, + opts: {}, + + tests: [ + { key: { fmt: "jwk", + key: { alg: 'A128CBC', ext: true, k: 'AAAAAAAAAAAAAAAAAAAAAA', key_ops: [ 'decrypt', 'encrypt' ], kty: 'oct' }, + alg: { name: "AES-CBC" }, + extractable: true, + usage: [ "decrypt", "encrypt" ] }, + expected: { algorithm: { name: "AES-CBC" }, + extractable: true, + type: "secret", + usages: [ "decrypt", "encrypt" ] } }, + { key: { fmt: "jwk", + key: { alg: 'A128CBC', ext: true, k: 'AAAAAAAAAAAAAAAAAAAAAA', key_ops: [ 'encrypt' ], kty: 'oct' }, + alg: { name: "AES-CBC" }, + extractable: true, + usage: [ "encrypt" ] }, + expected: { algorithm: { name: "AES-CBC" }, + extractable: true, + type: "secret", + usages: [ "encrypt" ] } }, + { key: { fmt: "jwk", + key: { alg: 'A128CBC', ext: true, k: 'AAAAAAAAAAAAAAAAAAAAAA', kty: 'oct' }, + alg: { name: "AES-CBC" }, + extractable: true, + usage: [ "encrypt" ] }, + expected: { algorithm: { name: "AES-CBC" }, + extractable: true, + type: "secret", + usages: [ "encrypt" ] } }, + { key: { fmt: "jwk", + key: { alg: 'A128CBC', k: 'AAAAAAAAAAAAAAAAAAAAAA', kty: 'oct' }, + alg: { name: "AES-CBC" }, + extractable: true, + usage: [ "encrypt" ] }, + expected: { algorithm: { name: "AES-CBC" }, + extractable: true, + type: "secret", + usages: [ "encrypt" ] } }, + { key: { fmt: "raw", + key: 'AAAAAAAAAAAAAAAAAAAAAA', + alg: { name: "AES-CBC" }, + extractable: true, + usage: [ "decrypt", "encrypt" ] }, + expected: { algorithm: { name: "AES-CBC" }, + extractable: true, + type: "secret", + usages: [ "decrypt", "encrypt" ] } }, + { key: { fmt: "raw", + key: 'AAAAAAAAAAAAAAAAAAAAAA', + alg: { name: "AES-CTR" }, + extractable: false, + usage: [ "decrypt" ] }, + expected: { algorithm: { name: "AES-CTR" }, + extractable: false, + type: "secret", + usages: [ "decrypt" ] } }, + { key: { fmt: "raw", + key: 'AAAAAAAAAAAAAAAAAAAAAA', + alg: { name: "AES-GCM" }, + extractable: true, + usage: [ "decrypt", "encrypt" ] }, + expected: { algorithm: { name: "AES-GCM" }, + extractable: true, + type: "secret", + usages: [ "decrypt", "encrypt" ] } }, + + { key: { fmt: "raw", + key: 'AA', + alg: { name: "AES-CBC" }, + extractable: true, + usage: [ "decrypt", "encrypt" ] }, + exception: "TypeError: AES Invalid key length" }, + { key: { fmt: "jwk", + key: { alg: 'A128CBC', ext: true, k: 'AA', key_ops: [ 'encrypt', 'decrypt' ], kty: 'oct' }, + alg: { name: "AES-CBC" }, + usage: [ "encrypt", "decrypt" ] }, + exception: "TypeError: key size and \"alg\" value \"A128CBC\" mismatch" }, + { key: { fmt: "jwk", + key: { alg: 'A129CBC', ext: true, k: 'AA', key_ops: [ 'encrypt', 'decrypt' ], kty: 'oct' }, + alg: { name: "AES-CBC" }, + usage: [ "encrypt", "decrypt" ] }, + exception: "TypeError: unexpected \"alg\" value \"A129CBC\" for JWK key" }, + { key: { fmt: "jwk", + key: { alg: 'A128CBC', ext: false, k: 'AAAAAAAAAAAAAAAAAAAAAA', kty: 'oct' }, + alg: { name: "AES-CBC" }, + extractable: true, + usage: [ "encrypt" ] }, + exception: "TypeError: JWK oct is not extractable" }, + { key: { fmt: "jwk", + key: { alg: 1, ext: true, k: 'AA', key_ops: ['encrypt', 'decrypt'], kty: 'oct' }, + alg: { name: "AES-CBC" }, + usage: [ "encrypt", "decrypt" ] }, + exception: "TypeError: Invalid JWK oct alg" }, +]}; + +let ec_tsuite = { + name: "EC importing", + skip: () => (!has_webcrypto()), + T: test, + prepare_args: p, + opts: {}, + + tests: [ + { key: { fmt: "jwk", + key: "ec.jwk", + alg: { name: "ECDSA", namedCurve: "P-256" }, + extractable: true, + usage: [ "sign" ] }, + expected: { algorithm: { name: "ECDSA", namedCurve: "SHA-256" }, + extractable: true, + type: "private", + usages: [ "sign" ] } }, + { key: { fmt: "spki", + key: "ec.spki", + alg: { name: "ECDSA", namedCurve: "P-256" }, + extractable: true, + usage: [ "verify" ] }, + expected: { algorithm: { name: "ECDSA", namedCurve: "SHA-256" }, + extractable: true, + type: "public", + usages: [ "verify" ] } }, + { key: { fmt: "pkcs8", + key: "ec.pkcs8", + alg: { name: "ECDSA", namedCurve: "P-256" }, + extractable: true, + usage: [ "sign" ] }, + expected: { algorithm: { name: "ECDSA", namedCurve: "SHA-256" }, + extractable: true, + type: "private", + usages: [ "sign" ] } }, + { key: { fmt: "raw", + key: "BHFFLGURrlWEXhok0JfTKke4q-nWSIMPvKTPhdKYSVnc4Nzn_7uNz0AA3U4fhpfVxSD4U5QciGyEoM4r3jC7bjI", + alg: { name: "ECDSA", namedCurve: "P-256" }, + extractable: true, + usage: [ "verify" ] }, + expected: { algorithm: { name: "ECDSA", namedCurve: "SHA-256" }, + extractable: true, + type: "public", + usages: [ "verify" ] } }, + + { key: { fmt: "jwk", + key: "ec.jwk", + alg: { name: "ECDSA", namedCurve: "P-384" }, + extractable: true, + usage: [ "sign" ] }, + exception: "TypeError: Invalid JWK EC key" }, + { key: { fmt: "jwk", + key: 1, + alg: { name: "ECDSA", namedCurve: "P-256" }, + extractable: true, + usage: [ "sign" ] }, + exception: "TypeError: invalid JWK key data" }, + { key: { fmt: "jwk", + key: { kty: "EC" }, + alg: { name: "ECDSA", namedCurve: "P-256" }, + extractable: true, + usage: [ "sign" ] }, + exception: "TypeError: Invalid JWK EC key" }, + { key: { fmt: "jwk", + key: { kty: "EC", + x: "cUUsZRGuVYReGiTQl9MqR7ir6dZIgw-8pM-F0phJWdw" }, + alg: { name: "ECDSA", namedCurve: "P-256" }, + extractable: true, + usage: [ "sign" ] }, + exception: "TypeError: Invalid JWK EC key" }, + { key: { fmt: "jwk", + key: { kty: "EC", + x: "cUUsZRGuVYReGiTQl9MqR7ir6dZIgw-8pM-F0phJWdw", + y: "4Nzn_7uNz0AA3U4fhpfVxSD4U5QciGyEoM4r3jC7bjI" }, + alg: { name: "ECDSA", namedCurve: "P-256" }, + extractable: true, + usage: [ "sign" ] }, + exception: "TypeError: Invalid JWK EC key" }, + { key: { fmt: "jwk", + key: { kty: "EC", + x: "cUUsZRGuVYReGiTQl9MqR7ir6dZIgw-8pM-F0phJWdw", + y: "4Nzn_7uNz0AA3U4fhpfVxSD4U5QciGyEoM4r3jC7bjI", + d: "E2sW0_4a3QXaSTJ0JKbSUbieKTD1UFtr7i_2CuetP6A" }, + alg: { name: "ECDSA", namedCurve: "P-256" }, + extractable: true, + usage: [ "sign" ] }, + exception: "JWK EC curve mismatch" }, + { key: { fmt: "jwk", + key: { kty: "EC", + x: "cUUsZRGuVYReGiTQl9MqR7ir6dZIgw-8pM-F0phJWdw", + y: "4Nzn_7uNz0AA3U4fhpfVxSD4U5QciGyEoM4r3jC7bjI", + d: "E2sW0_4a3QXaSTJ0JKbSUbieKTD1UFtr7i_2CuetP6A", + crv: "P-384" }, + alg: { name: "ECDSA", namedCurve: "P-256" }, + extractable: true, + usage: [ "sign" ] }, + exception: "JWK EC curve mismatch" }, + { key: { fmt: "jwk", + key: { kty: "EC", + x: "_BROKEN_", + y: "4Nzn_7uNz0AA3U4fhpfVxSD4U5QciGyEoM4r3jC7bjI", + d: "E2sW0_4a3QXaSTJ0JKbSUbieKTD1UFtr7i_2CuetP6A", + crv: "P-256" }, + alg: { name: "ECDSA", namedCurve: "P-256" }, + extractable: true, + usage: [ "sign" ] }, + exception: "TypeError: EC_KEY_set_public_key_affine_coordinates()" }, + { key: { fmt: "jwk", + key: { kty: "EC", + x: "cUUsZRGuVYReGiTQl9MqR7ir6dZIgw-8pM-F0phJWdw", + y: "4Nzn_7uNz0AA3U4fhpfVxSD4U5QciGyEoM4r3jC7bjI", + d: "E2sW0_4a3QXaSTJ0JKbSUbieKTD1UFtr7i_2CuetP6A", + crv: "P-256", + key_ops: [ "verify" ] }, + alg: { name: "ECDSA", namedCurve: "P-256" }, + extractable: true, + usage: [ "sign" ] }, + exception: "TypeError: Key operations and usage mismatch" }, + { key: { fmt: "jwk", + key: { kty: "EC", + x: "cUUsZRGuVYReGiTQl9MqR7ir6dZIgw-8pM-F0phJWdw", + y: "4Nzn_7uNz0AA3U4fhpfVxSD4U5QciGyEoM4r3jC7bjI", + d: "E2sW0_4a3QXaSTJ0JKbSUbieKTD1UFtr7i_2CuetP6A", + ext: false }, + alg: { name: "ECDSA", namedCurve: "P-256" }, + extractable: true, + usage: [ "sign" ] }, + exception: "JWK EC is not extractable" }, + { key: { fmt: "jwk", + key: { kty: "EC", + x: "cUUsZRGuVYReGiTQl9MqR7ir6dZIgw-8pM-F0phJWdw", + y: "4Nzn_7uNz0AA3U4fhpfVxSD4U5QciGyEoM4r3jC7bjI", + d: "E2sW0_4a3QXaSTJ0JKbSUbieKTD1UFtr7i_2CuetP6A", + crv: "P-256" }, + alg: { name: "ECDSA", namedCurve: "P-256" }, + extractable: true, + usage: [ "sign", "verify" ] }, + exception: "TypeError: key usage mismatch for \"ECDSA\" key" }, + { key: { fmt: "pkcs8", + key: "ec.pkcs8", + alg: { name: "ECDSA", namedCurve: "unknown_named_curve" }, + extractable: true, + usage: [ "sign" ] }, + exception: "TypeError: unknown namedCurve: \"unknown_named_curve\"" }, + { key: { fmt: "spki", + key: "rsa.spki", + alg: { name: "ECDSA", namedCurve: "P-256" }, + extractable: true, + usage: [ "verify" ] }, + exception: "TypeError: EC key is not found" }, + { key: { fmt: "spki", + key: "ec.spki", + alg: { name: "ECDSA", namedCurve: "P-384" }, + extractable: true, + usage: [ "verify" ] }, + exception: "TypeError: name curve mismatch" }, + { key: { fmt: "raw", + key: "CHFFLGURrlWEXhok0JfTKke4q-nWSIMPvKTPhdKYSVnc4Nzn_7uNz0AA3U4fhpfVxSD4U5QciGyEoM4r3jC7bjI", + alg: { name: "ECDSA", namedCurve: "P-256" }, + extractable: true, + usage: [ "verify" ] }, + exception: "TypeError: EC_POINT_oct2point()" }, +]}; + +let hmac_tsuite = { + name: "HMAC importing", + skip: () => (!has_webcrypto()), + T: test, + prepare_args: p, + opts: {}, + + tests: [ + { key: { fmt: "raw", + key: "AA", + alg: { name: "HMAC", hash: "SHA-256" }, + extractable: true, + usage: [ "sign", "verify" ] }, + expected: { algorithm: { name: "HMAC", hash: "SHA-256" }, + extractable: true, + type: "secret", + usages: [ "sign", "verify" ] } }, + { key: { fmt: "raw", + key: "AA", + alg: { name: "HMAC", hash: "SHA-384" }, + extractable: true, + usage: [ "sign", "verify" ] }, + expected: { algorithm: { name: "HMAC", hash: "SHA-384" }, + extractable: true, + type: "secret", + usages: [ "sign", "verify" ] } }, + { key: { fmt: "raw", + key: "AA", + alg: { name: "HMAC", hash: "SHA-384" }, + extractable: false, + usage: [ "sign", "verify" ] }, + expected: { algorithm: { name: "HMAC", hash: "SHA-384" }, + extractable: false, + type: "secret", + usages: [ "sign", "verify" ] } }, + + { key: { fmt: "raw", + key: "AA", + alg: { name: "HMAC", hash: "SHA-385" }, + extractable: true, + usage: [ "sign", "verify" ] }, + exception: "TypeError: unknown hash name: \"SHA-385\"" }, + { key: { fmt: "spki", + key: "ec.spki", + alg: { name: "HMAC" }, + extractable: true, + usage: [ "sign" ] }, + exception: "TypeError: unsupported key fmt \"spki\" for \"HMAC\" key" }, + { key: { fmt: "raw", + key: "AA", + alg: { name: "HMAC", hash: "SHA-384" }, + extractable: true, + usage: [ "encrypt" ] }, + exception: "TypeError: unsupported key usage for \"HMAC\" key" }, + { key: { fmt: "raw", + key: "AA", + alg: { name: "HMAC", hash: "SHA-384" }, + extractable: true, + usage: [ "invalid_usage" ] }, + exception: "TypeError: unknown key usage: \"invalid_usage\"" }, + + { key: { fmt: "jwk", + key: { alg: 'HS384', ext: true, k: 'AA', key_ops: [ 'sign', 'verify' ], kty: 'oct' }, + alg: { name: "HMAC", hash: "SHA-384" }, + extractable: true, + usage: [ "sign", "verify" ] }, + expected: { algorithm: { name: "HMAC", hash: "SHA-384" }, + extractable: true, + type: "secret", + usages: [ "sign", "verify" ] } }, + { key: { fmt: "jwk", + key: { alg: 'HS256', ext: true, k: 'AA', key_ops: [ 'sign' ], kty: 'oct' }, + alg: { name: "HMAC", hash: "SHA-256" }, + extractable: true, + usage: [ "sign" ]}, + expected: { algorithm: { name: "HMAC", hash: "SHA-256" }, + extractable: true, + type: "secret", + usages: [ "sign" ] } }, + { key: { fmt: "jwk", + key: { alg: 'HS256', k: 'AA', kty: 'oct' }, + alg: { name: "HMAC", hash: "SHA-256" }, + extractable: true, + usage: [ "sign" ]}, + expected: { algorithm: { name: "HMAC", hash: "SHA-256" }, + extractable: true, + type: "secret", + usages: [ "sign" ] } }, + + { key: { fmt: "jwk", + key: { alg: 'HS385', ext: true, k: 'AA', key_ops: [ 'sign', 'verify' ], kty: 'oct' }, + alg: { name: "HMAC", hash: "SHA-385" }, + extractable: true, + usage: [ "sign", "verify" ] }, + exception: "TypeError: unexpected \"alg\" value \"HS385\" for JWK key" }, + { key: { fmt: "jwk", + key: { alg: 'HS384', ext: true, k: 'AA', key_ops: [ 'sign', 'verify' ], kty: 'invalid_kty' }, + alg: { name: "HMAC", hash: "SHA-384" }, + extractable: true, + usage: [ "sign", "verify" ] }, + exception: "TypeError: invalid JWK key type: \"invalid_kty\"" }, + { key: { fmt: "jwk", + key: { alg: 'HS256', ext: true, key_ops: [ 'sign' ], kty: 'oct' }, + alg: { name: "HMAC", hash: "SHA-256" }, + extractable: true, + usage: [ "sign" ]}, + exception: "TypeError: Invalid JWK oct key" }, + { key: { fmt: "jwk", + key: { alg: 'HS256', k: 'AA', key_ops: [ 'sign' ], kty: 'oct' }, + alg: { name: "HMAC", hash: "SHA-256" }, + extractable: true, + usage: [ "verify" ]}, + exception: "TypeError: Key operations and usage mismatch" }, +]}; + +let rsa_tsuite = { + name: "RSA importing", + skip: () => (!has_webcrypto()), + T: test, + prepare_args: p, + opts: {}, + + tests: [ + { key: { fmt: "jwk", + key: "rsa.jwk", + alg: { name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" }, + extractable: true, + usage: [ "sign" ] }, + expected: { algorithm: { name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" }, + extractable: true, + type: "private", + usages: [ "sign" ] } }, + { key: { fmt: "pkcs8", + key: "rsa.pkcs8", + alg: { name: "RSA-OAEP", hash: "SHA-1" }, + extractable: true, + usage: [ "decrypt" ] }, + expected: { algorithm: { name: "RSA-OAEP", hash: "SHA-1" }, + extractable: true, + type: "private", + usages: [ "decrypt" ] } }, + { key: { fmt: "spki", + key: "rsa.spki", + alg: { name: "RSA-OAEP", hash: "SHA-256" }, + extractable: true, + usage: [ "encrypt" ] }, + expected: { algorithm: { name: "RSA-OAEP", hash: "SHA-256" }, + extractable: true, + type: "public", + usages: [ "encrypt" ] } }, + + { key: { fmt: "jwk", + key: 1, + alg: { name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" }, + extractable: true, + usage: [ "sign" ] }, + exception: "TypeError: invalid JWK key data" }, + { key: { fmt: "jwk", + key: "rsa.jwk", + alg: { name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" }, + extractable: true, + usage: [ "verify" ] }, + exception: "TypeError: Key operations and usage mismatch" }, + { key: { fmt: "jwk", + key: "rsa.jwk", + alg: { name: "RSASSA-PKCS1-v1_5", hash: "SHA-384" }, + extractable: true, + usage: [ "sign" ] }, + exception: "TypeError: RSA JWK hash mismatch" }, + { key: { fmt: "jwk", + key: { kty: "RSA", + n: "yUmxoJC8VAM5hyYZa-XUBZg1N1ywFMPUpWsF1kaSGed98P3XUgPzgX80wpyzd5qdGuALqnf2lMc7O8PrGBtO5YrvQlI96NX0jUo5bc5wz220ob3AUCeQnTfx-UFqM4pCwjoDSo2PlphJdWgFYymGBaBCJgnENQL9H1N_8_yNiN8" }, + alg: { name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" }, + extractable: true, + usage: [ "sign" ] }, + exception: "TypeError: Invalid JWK RSA key" }, + { key: { fmt: "jwk", + key: { kty: "RSA", + n: "yUmxoJC8VAM5hyYZa-XUBZg1N1ywFMPUpWsF1kaSGed98P3XUgPzgX80wpyzd5qdGuALqnf2lMc7O8PrGBtO5YrvQlI96NX0jUo5bc5wz220ob3AUCeQnTfx-UFqM4pCwjoDSo2PlphJdWgFYymGBaBCJgnENQL9H1N_8_yNiN8", + e: "AQAB" }, + alg: { name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" }, + extractable: true, + usage: [ "sign" ] }, + exception: "TypeError: key usage mismatch for \"RSASSA-PKCS1-v1_5\" key" }, + { key: { fmt: "jwk", + key: { kty: "RSA", + n: "yUmxoJC8VAM5hyYZa-XUBZg1N1ywFMPUpWsF1kaSGed98P3XUgPzgX80wpyzd5qdGuALqnf2lMc7O8PrGBtO5YrvQlI96NX0jUo5bc5wz220ob3AUCeQnTfx-UFqM4pCwjoDSo2PlphJdWgFYymGBaBCJgnENQL9H1N_8_yNiN8", + e: "AQAB", + d: "j06DQyCopFujYoASi0oWmGEUSjUYO8BsrdSzVCnsLLsuZBwlZ4Peouyw4Hl2IIoYniCyzYwZJzVtC5Dh2MjgcrJTG5nX3FfheuabGl4in0583C51ZYWlVpDvBWw8kJTfXjiKH4z6ZA9dWdT5Y3aH_kOf-znUc7eTvuzISs61x_k" }, + alg: { name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" }, + extractable: true, + usage: [ "sign" ] }, + exception: "TypeError: Invalid JWK RSA key" }, + { key: { fmt: "jwk", + key: { kty: "RSA", + n: "yUmxoJC8VAM5hyYZa-XUBZg1N1ywFMPUpWsF1kaSGed98P3XUgPzgX80wpyzd5qdGuALqnf2lMc7O8PrGBtO5YrvQlI96NX0jUo5bc5wz220ob3AUCeQnTfx-UFqM4pCwjoDSo2PlphJdWgFYymGBaBCJgnENQL9H1N_8_yNiN8", + e: "AQAB", + d: "j06DQyCopFujYoASi0oWmGEUSjUYO8BsrdSzVCnsLLsuZBwlZ4Peouyw4Hl2IIoYniCyzYwZJzVtC5Dh2MjgcrJTG5nX3FfheuabGl4in0583C51ZYWlVpDvBWw8kJTfXjiKH4z6ZA9dWdT5Y3aH_kOf-znUc7eTvuzISs61x_k", + p: "9ASb2yw5b8d7unrFuOyy4EDcPbnzEpbuVGASeHPqkORwHsqeGbfwGlhDYSYrY0HCwUsSBSFcO3SDeu0Z0zSvFQ" }, + alg: { name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" }, + extractable: true, + usage: [ "sign" ] }, + exception: "TypeError: Invalid JWK RSA key" }, + { key: { fmt: "jwk", + key: { kty: "RSA", + n: "yUmxoJC8VAM5hyYZa-XUBZg1N1ywFMPUpWsF1kaSGed98P3XUgPzgX80wpyzd5qdGuALqnf2lMc7O8PrGBtO5YrvQlI96NX0jUo5bc5wz220ob3AUCeQnTfx-UFqM4pCwjoDSo2PlphJdWgFYymGBaBCJgnENQL9H1N_8_yNiN8", + e: "AQAB", + d: "j06DQyCopFujYoASi0oWmGEUSjUYO8BsrdSzVCnsLLsuZBwlZ4Peouyw4Hl2IIoYniCyzYwZJzVtC5Dh2MjgcrJTG5nX3FfheuabGl4in0583C51ZYWlVpDvBWw8kJTfXjiKH4z6ZA9dWdT5Y3aH_kOf-znUc7eTvuzISs61x_k", + p: "9ASb2yw5b8d7unrFuOyy4EDcPbnzEpbuVGASeHPqkORwHsqeGbfwGlhDYSYrY0HCwUsSBSFcO3SDeu0Z0zSvFQ", + q: "0yvzzgHo_PGYSlVj-M3965AwQF2wTXz82MZHv6EfcCHKuBfCSecr-igqLHhzfynAQjjf39VrXuPuRL23REF1Iw" }, + alg: { name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" }, + extractable: true, + usage: [ "sign" ] }, + exception: "TypeError: Invalid JWK RSA key" }, + { key: { fmt: "jwk", + key: { kty: "RSA", + n: "yUmxoJC8VAM5hyYZa-XUBZg1N1ywFMPUpWsF1kaSGed98P3XUgPzgX80wpyzd5qdGuALqnf2lMc7O8PrGBtO5YrvQlI96NX0jUo5bc5wz220ob3AUCeQnTfx-UFqM4pCwjoDSo2PlphJdWgFYymGBaBCJgnENQL9H1N_8_yNiN8", + e: "AQAB", + d: "j06DQyCopFujYoASi0oWmGEUSjUYO8BsrdSzVCnsLLsuZBwlZ4Peouyw4Hl2IIoYniCyzYwZJzVtC5Dh2MjgcrJTG5nX3FfheuabGl4in0583C51ZYWlVpDvBWw8kJTfXjiKH4z6ZA9dWdT5Y3aH_kOf-znUc7eTvuzISs61x_k", + p: "9ASb2yw5b8d7unrFuOyy4EDcPbnzEpbuVGASeHPqkORwHsqeGbfwGlhDYSYrY0HCwUsSBSFcO3SDeu0Z0zSvFQ", + q: "0yvzzgHo_PGYSlVj-M3965AwQF2wTXz82MZHv6EfcCHKuBfCSecr-igqLHhzfynAQjjf39VrXuPuRL23REF1Iw", + dp: "pUXJ2jSl4lOWNcOZz5phvQmxIg2j2N9pJLS9TeAU63YNio1pb7npYa6OVGpp0JxlsE2MMvVZZtuPgd69MxPn0Q" }, + alg: { name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" }, + extractable: true, + usage: [ "sign" ] }, + exception: "TypeError: Invalid JWK RSA key" }, + { key: { fmt: "jwk", + key: { kty: "RSA", + n: "yUmxoJC8VAM5hyYZa-XUBZg1N1ywFMPUpWsF1kaSGed98P3XUgPzgX80wpyzd5qdGuALqnf2lMc7O8PrGBtO5YrvQlI96NX0jUo5bc5wz220ob3AUCeQnTfx-UFqM4pCwjoDSo2PlphJdWgFYymGBaBCJgnENQL9H1N_8_yNiN8", + e: "AQAB", + d: "j06DQyCopFujYoASi0oWmGEUSjUYO8BsrdSzVCnsLLsuZBwlZ4Peouyw4Hl2IIoYniCyzYwZJzVtC5Dh2MjgcrJTG5nX3FfheuabGl4in0583C51ZYWlVpDvBWw8kJTfXjiKH4z6ZA9dWdT5Y3aH_kOf-znUc7eTvuzISs61x_k", + p: "9ASb2yw5b8d7unrFuOyy4EDcPbnzEpbuVGASeHPqkORwHsqeGbfwGlhDYSYrY0HCwUsSBSFcO3SDeu0Z0zSvFQ", + q: "0yvzzgHo_PGYSlVj-M3965AwQF2wTXz82MZHv6EfcCHKuBfCSecr-igqLHhzfynAQjjf39VrXuPuRL23REF1Iw", + dp: "pUXJ2jSl4lOWNcOZz5phvQmxIg2j2N9pJLS9TeAU63YNio1pb7npYa6OVGpp0JxlsE2MMvVZZtuPgd69MxPn0Q", + dq: "RZoqDM-iXKTA3ldQ0TQMKnVnAgAfWRsGN-j6wxW3R_1LVOw31KYGX7iXVfsJjnNTdEBMwfkVH7yezzd8zVmJ4w" }, + alg: { name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" }, + extractable: true, + usage: [ "sign" ] }, + exception: "TypeError: Invalid JWK RSA key" }, + { key: { fmt: "jwk", + key: { kty: "RSA", + n: "yUmxoJC8VAM5hyYZa-XUBZg1N1ywFMPUpWsF1kaSGed98P3XUgPzgX80wpyzd5qdGuALqnf2lMc7O8PrGBtO5YrvQlI96NX0jUo5bc5wz220ob3AUCeQnTfx-UFqM4pCwjoDSo2PlphJdWgFYymGBaBCJgnENQL9H1N_8_yNiN8", + e: "AQAB", + d: "j06DQyCopFujYoASi0oWmGEUSjUYO8BsrdSzVCnsLLsuZBwlZ4Peouyw4Hl2IIoYniCyzYwZJzVtC5Dh2MjgcrJTG5nX3FfheuabGl4in0583C51ZYWlVpDvBWw8kJTfXjiKH4z6ZA9dWdT5Y3aH_kOf-znUc7eTvuzISs61x_k", + p: "9ASb2yw5b8d7unrFuOyy4EDcPbnzEpbuVGASeHPqkORwHsqeGbfwGlhDYSYrY0HCwUsSBSFcO3SDeu0Z0zSvFQ", + q: "0yvzzgHo_PGYSlVj-M3965AwQF2wTXz82MZHv6EfcCHKuBfCSecr-igqLHhzfynAQjjf39VrXuPuRL23REF1Iw", + dp: "pUXJ2jSl4lOWNcOZz5phvQmxIg2j2N9pJLS9TeAU63YNio1pb7npYa6OVGpp0JxlsE2MMvVZZtuPgd69MxPn0Q", + dq: "RZoqDM-iXKTA3ldQ0TQMKnVnAgAfWRsGN-j6wxW3R_1LVOw31KYGX7iXVfsJjnNTdEBMwfkVH7yezzd8zVmJ4w", + qi: "2REPnRQIaLsya5wlwFw0whwPaAbTZp2jfguhtg5gou_Yru7Cxz_b83YFPgoI6xuGE1OXsWkRTToS8FuIWCrNBQ", + ext: false }, + alg: { name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" }, + extractable: true, + usage: [ "sign" ] }, + exception: "JWK RSA is not extractable" }, + { key: { fmt: "jwk", + key: { kty: "RSA" }, + alg: { name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" }, + extractable: true, + usage: [ "sign" ] }, + exception: "TypeError: Invalid JWK RSA key" }, + { key: { fmt: "pkcs8", + key: "ec.pkcs8", + alg: { name: "RSA-OAEP", hash: "SHA-1" }, + extractable: true, + usage: [ "decrypt" ] }, + exception: "TypeError: RSA key is not found" }, + { key: { fmt: "pkcs8", + key: "rsa.pkcs8.broken", + alg: { name: "RSA-OAEP", hash: "SHA-1" }, + extractable: true, + usage: [ "decrypt" ] }, + exception: "TypeError: d2i_PKCS8_PRIV_KEY_INFO_bio() failed" }, + { key: { fmt: "pkcs8", + key: "rsa.pkcs8.broken2", + alg: { name: "RSA-OAEP", hash: "SHA-1" }, + extractable: true, + usage: [ "decrypt" ] }, + exception: "TypeError: EVP_PKCS82PKEY() failed" }, + { key: { fmt: "pkcs8", + key: "rsa.pkcs8", + alg: { name: "RSA-OAEP", hash: "XXX" }, + extractable: true, + usage: [ "decrypt" ] }, + exception: "TypeError: unknown hash name: \"XXX\"" }, + { key: { fmt: "spki", + key: "rsa.spki.broken", + alg: { name: "RSA-OAEP", hash: "SHA-256" }, + extractable: true, + usage: [ "encrypt" ] }, + exception: "TypeError: d2i_PUBKEY() failed" }, +]}; + +run([ + aes_tsuite, + ec_tsuite, + hmac_tsuite, + rsa_tsuite, +]) +.then($DONE, $DONE); diff --git a/test/webcrypto/rsa.pkcs8.broken2 b/test/webcrypto/rsa.pkcs8.broken2 new file mode 100644 index 00000000..1fdec72a --- /dev/null +++ b/test/webcrypto/rsa.pkcs8.broken2 @@ -0,0 +1,16 @@ +-----BEGIN PRIVATE KEY----- +MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGAAMlJsaCQvFQDOYcm +GWvl1AWYNTdcsBTD1KVrBdZGkhnnffD911ID84F/NMKcs3eanRrgC6p39pTHOzvD +6xgbTuWK70JSPejV9I1KOW3OcM9ttKG9wFAnkJ038flBajOKQsI6A0qNj5aYSXVo +BWMphgWgQiYJxDUC/R9Tf/P8jYjfAgMBAAECgYEAj06DQyCopFujYoASi0oWmGEU +SjUYO8BsrdSzVCnsLLsuZBwlZ4Peouyw4Hl2IIoYniCyzYwZJzVtC5Dh2MjgcrJT +G5nX3FfheuabGl4in0583C51ZYWlVpDvBWw8kJTfXjiKH4z6ZA9dWdT5Y3aH/kOf ++znUc7eTvuzISs61x/kCQQD0BJvbLDlvx3u6esW47LLgQNw9ufMSlu5UYBJ4c+qQ +5HAeyp4Zt/AaWENhJitjQcLBSxIFIVw7dIN67RnTNK8VAkEA0yvzzgHo/PGYSlVj ++M3965AwQF2wTXz82MZHv6EfcCHKuBfCSecr+igqLHhzfynAQjjf39VrXuPuRL23 +REF1IwJBAKVFydo0peJTljXDmc+aYb0JsSINo9jfaSS0vU3gFOt2DYqNaW+56WGu +jlRqadCcZbBNjDL1WWbbj4HevTMT59ECQEWaKgzPolykwN5XUNE0DCp1ZwIAH1kb +Bjfo+sMVt0f9S1TsN9SmBl+4l1X7CY5zU3RATMH5FR+8ns83fM1ZieMCQQDZEQ+d +FAhouzJrnCXAXDTCHA9oBtNmnaN+C6G2DmCi79iu7sLHP9vzdgU+CgjrG4YTU5ex +aRFNOhLwW4hYKs0F +-----END PRIVATE KEY----- diff --git a/test/webcrypto/rsa.t.mjs b/test/webcrypto/rsa.t.mjs index 977537e0..372535b1 100644 --- a/test/webcrypto/rsa.t.mjs +++ b/test/webcrypto/rsa.t.mjs @@ -127,8 +127,6 @@ let rsa_tsuite = { { data: "aabbccdd".repeat(7), enc: { hash: "SHA-384" }, dec: { hash: "SHA-384" } }, { data: "aabbcc", enc: { hash: "SHA-256" }, dec: { hash: "SHA-384" }, exception: "Error: EVP_PKEY_decrypt() failed" }, - { data: "aabbcc", enc: { hash: "XXX" }, exception: "TypeError: unknown hash name: \"XXX\"" }, - { data: "aabbcc", dec: { key: "rsa.spki.broken" }, exception: "Error: d2i_PUBKEY() failed" }, { data: "aabbcc", dec: { key: "rsa2.spki" }, exception: "Error: EVP_PKEY_decrypt() failed" }, { data: "aabbcc", enc: { fmt: "jwk", key: "rsa.enc.pub.jwk" }, dec: { fmt: "jwk", key: "rsa.dec.jwk" } }, diff --git a/test/webcrypto/rsa_decoding.t.mjs b/test/webcrypto/rsa_decoding.t.mjs index 24733279..08874491 100644 --- a/test/webcrypto/rsa_decoding.t.mjs +++ b/test/webcrypto/rsa_decoding.t.mjs @@ -33,8 +33,6 @@ let rsa_tsuite = { tests: [ { pem: "rsa.pkcs8", src: "text.base64.rsa-oaep.enc", expected: "WAKAWAKA" }, - { pem: "ec.pkcs8", src: "text.base64.rsa-oaep.enc", exception: "Error: RSA key is not found" }, - { pem: "rsa.pkcs8.broken", src: "text.base64.rsa-oaep.enc", exception: "Error: d2i_PKCS8_PRIV_KEY_INFO_bio() failed" }, ]}; run([rsa_tsuite]) diff --git a/test/webcrypto/sign.t.mjs b/test/webcrypto/sign.t.mjs index c2d52a6f..2999569f 100644 --- a/test/webcrypto/sign.t.mjs +++ b/test/webcrypto/sign.t.mjs @@ -194,12 +194,6 @@ let hmac_tsuite = { k: "c2VjcmV0S0VZ" } }, verify: true, expected: true }, - { sign_key: { fmt: "jwk", - key: { kty: "oct", - alg: "HS256", - key_ops: [ "verify" ], - k: "c2VjcmV0S0VZ" } }, - exception: "TypeError: Key operations and usage mismatch" }, { verify: true, expected: true }, { verify: true, import_alg: { hash: "SHA-384" }, expected: true }, @@ -250,59 +244,6 @@ let rsassa_pkcs1_v1_5_tsuite = { extractable: true, usage: [ "sign", "verify" ] }, expected: true }, - - { sign_key: { key: 1, fmt: "jwk" }, exception: "TypeError: invalid JWK key data" }, - { sign_key: { key: { kty: "RSA" }, fmt: "jwk" }, - exception: "TypeError: Invalid JWK RSA key" }, - { sign_key: { key: { kty: "RSA", - n: "yUmxoJC8VAM5hyYZa-XUBZg1N1ywFMPUpWsF1kaSGed98P3XUgPzgX80wpyzd5qdGuALqnf2lMc7O8PrGBtO5YrvQlI96NX0jUo5bc5wz220ob3AUCeQnTfx-UFqM4pCwjoDSo2PlphJdWgFYymGBaBCJgnENQL9H1N_8_yNiN8" }, - fmt: "jwk" }, - exception: "TypeError: Invalid JWK RSA key" }, - { sign_key: { key: { kty: "RSA", - n: "yUmxoJC8VAM5hyYZa-XUBZg1N1ywFMPUpWsF1kaSGed98P3XUgPzgX80wpyzd5qdGuALqnf2lMc7O8PrGBtO5YrvQlI96NX0jUo5bc5wz220ob3AUCeQnTfx-UFqM4pCwjoDSo2PlphJdWgFYymGBaBCJgnENQL9H1N_8_yNiN8", - e: "AQAB" }, - fmt: "jwk" }, - exception: "TypeError: key usage mismatch for a RSASSA-PKCS1-v1_5" }, - { sign_key: { key: { kty: "RSA", - n: "yUmxoJC8VAM5hyYZa-XUBZg1N1ywFMPUpWsF1kaSGed98P3XUgPzgX80wpyzd5qdGuALqnf2lMc7O8PrGBtO5YrvQlI96NX0jUo5bc5wz220ob3AUCeQnTfx-UFqM4pCwjoDSo2PlphJdWgFYymGBaBCJgnENQL9H1N_8_yNiN8", - e: "AQAB", - d: "j06DQyCopFujYoASi0oWmGEUSjUYO8BsrdSzVCnsLLsuZBwlZ4Peouyw4Hl2IIoYniCyzYwZJzVtC5Dh2MjgcrJTG5nX3FfheuabGl4in0583C51ZYWlVpDvBWw8kJTfXjiKH4z6ZA9dWdT5Y3aH_kOf-znUc7eTvuzISs61x_k" }, - fmt: "jwk" }, - exception: "TypeError: Invalid JWK RSA key" }, - { sign_key: { key: { kty: "RSA", - n: "yUmxoJC8VAM5hyYZa-XUBZg1N1ywFMPUpWsF1kaSGed98P3XUgPzgX80wpyzd5qdGuALqnf2lMc7O8PrGBtO5YrvQlI96NX0jUo5bc5wz220ob3AUCeQnTfx-UFqM4pCwjoDSo2PlphJdWgFYymGBaBCJgnENQL9H1N_8_yNiN8", - e: "AQAB", - d: "j06DQyCopFujYoASi0oWmGEUSjUYO8BsrdSzVCnsLLsuZBwlZ4Peouyw4Hl2IIoYniCyzYwZJzVtC5Dh2MjgcrJTG5nX3FfheuabGl4in0583C51ZYWlVpDvBWw8kJTfXjiKH4z6ZA9dWdT5Y3aH_kOf-znUc7eTvuzISs61x_k", - p: "9ASb2yw5b8d7unrFuOyy4EDcPbnzEpbuVGASeHPqkORwHsqeGbfwGlhDYSYrY0HCwUsSBSFcO3SDeu0Z0zSvFQ" }, - fmt: "jwk" }, - exception: "TypeError: Invalid JWK RSA key" }, - { sign_key: { key: { kty: "RSA", - n: "yUmxoJC8VAM5hyYZa-XUBZg1N1ywFMPUpWsF1kaSGed98P3XUgPzgX80wpyzd5qdGuALqnf2lMc7O8PrGBtO5YrvQlI96NX0jUo5bc5wz220ob3AUCeQnTfx-UFqM4pCwjoDSo2PlphJdWgFYymGBaBCJgnENQL9H1N_8_yNiN8", - e: "AQAB", - d: "j06DQyCopFujYoASi0oWmGEUSjUYO8BsrdSzVCnsLLsuZBwlZ4Peouyw4Hl2IIoYniCyzYwZJzVtC5Dh2MjgcrJTG5nX3FfheuabGl4in0583C51ZYWlVpDvBWw8kJTfXjiKH4z6ZA9dWdT5Y3aH_kOf-znUc7eTvuzISs61x_k", - p: "9ASb2yw5b8d7unrFuOyy4EDcPbnzEpbuVGASeHPqkORwHsqeGbfwGlhDYSYrY0HCwUsSBSFcO3SDeu0Z0zSvFQ", - q: "0yvzzgHo_PGYSlVj-M3965AwQF2wTXz82MZHv6EfcCHKuBfCSecr-igqLHhzfynAQjjf39VrXuPuRL23REF1Iw" }, - fmt: "jwk" }, - exception: "TypeError: Invalid JWK RSA key" }, - { sign_key: { key: { kty: "RSA", - n: "yUmxoJC8VAM5hyYZa-XUBZg1N1ywFMPUpWsF1kaSGed98P3XUgPzgX80wpyzd5qdGuALqnf2lMc7O8PrGBtO5YrvQlI96NX0jUo5bc5wz220ob3AUCeQnTfx-UFqM4pCwjoDSo2PlphJdWgFYymGBaBCJgnENQL9H1N_8_yNiN8", - e: "AQAB", - d: "j06DQyCopFujYoASi0oWmGEUSjUYO8BsrdSzVCnsLLsuZBwlZ4Peouyw4Hl2IIoYniCyzYwZJzVtC5Dh2MjgcrJTG5nX3FfheuabGl4in0583C51ZYWlVpDvBWw8kJTfXjiKH4z6ZA9dWdT5Y3aH_kOf-znUc7eTvuzISs61x_k", - p: "9ASb2yw5b8d7unrFuOyy4EDcPbnzEpbuVGASeHPqkORwHsqeGbfwGlhDYSYrY0HCwUsSBSFcO3SDeu0Z0zSvFQ", - q: "0yvzzgHo_PGYSlVj-M3965AwQF2wTXz82MZHv6EfcCHKuBfCSecr-igqLHhzfynAQjjf39VrXuPuRL23REF1Iw", - dp: "pUXJ2jSl4lOWNcOZz5phvQmxIg2j2N9pJLS9TeAU63YNio1pb7npYa6OVGpp0JxlsE2MMvVZZtuPgd69MxPn0Q" }, - fmt: "jwk" }, - exception: "TypeError: Invalid JWK RSA key" }, - { sign_key: { key: { kty: "RSA", - n: "yUmxoJC8VAM5hyYZa-XUBZg1N1ywFMPUpWsF1kaSGed98P3XUgPzgX80wpyzd5qdGuALqnf2lMc7O8PrGBtO5YrvQlI96NX0jUo5bc5wz220ob3AUCeQnTfx-UFqM4pCwjoDSo2PlphJdWgFYymGBaBCJgnENQL9H1N_8_yNiN8", - e: "AQAB", - d: "j06DQyCopFujYoASi0oWmGEUSjUYO8BsrdSzVCnsLLsuZBwlZ4Peouyw4Hl2IIoYniCyzYwZJzVtC5Dh2MjgcrJTG5nX3FfheuabGl4in0583C51ZYWlVpDvBWw8kJTfXjiKH4z6ZA9dWdT5Y3aH_kOf-znUc7eTvuzISs61x_k", - p: "9ASb2yw5b8d7unrFuOyy4EDcPbnzEpbuVGASeHPqkORwHsqeGbfwGlhDYSYrY0HCwUsSBSFcO3SDeu0Z0zSvFQ", - q: "0yvzzgHo_PGYSlVj-M3965AwQF2wTXz82MZHv6EfcCHKuBfCSecr-igqLHhzfynAQjjf39VrXuPuRL23REF1Iw", - dp: "pUXJ2jSl4lOWNcOZz5phvQmxIg2j2N9pJLS9TeAU63YNio1pb7npYa6OVGpp0JxlsE2MMvVZZtuPgd69MxPn0Q", - dq: "RZoqDM-iXKTA3ldQ0TQMKnVnAgAfWRsGN-j6wxW3R_1LVOw31KYGX7iXVfsJjnNTdEBMwfkVH7yezzd8zVmJ4w" }, - fmt: "jwk" }, - exception: "TypeError: Invalid JWK RSA key" }, { verify: true, sign_key: { key: { kty: "RSA", n: "yUmxoJC8VAM5hyYZa-XUBZg1N1ywFMPUpWsF1kaSGed98P3XUgPzgX80wpyzd5qdGuALqnf2lMc7O8PrGBtO5YrvQlI96NX0jUo5bc5wz220ob3AUCeQnTfx-UFqM4pCwjoDSo2PlphJdWgFYymGBaBCJgnENQL9H1N_8_yNiN8", @@ -315,43 +256,6 @@ let rsassa_pkcs1_v1_5_tsuite = { qi: "2REPnRQIaLsya5wlwFw0whwPaAbTZp2jfguhtg5gou_Yru7Cxz_b83YFPgoI6xuGE1OXsWkRTToS8FuIWCrNBQ" }, fmt: "jwk" }, expected: true }, - { sign_key: { key: { kty: "RSA", - n: "yUmxoJC8VAM5hyYZa-XUBZg1N1ywFMPUpWsF1kaSGed98P3XUgPzgX80wpyzd5qdGuALqnf2lMc7O8PrGBtO5YrvQlI96NX0jUo5bc5wz220ob3AUCeQnTfx-UFqM4pCwjoDSo2PlphJdWgFYymGBaBCJgnENQL9H1N_8_yNiN8", - e: "AQAB", - d: "j06DQyCopFujYoASi0oWmGEUSjUYO8BsrdSzVCnsLLsuZBwlZ4Peouyw4Hl2IIoYniCyzYwZJzVtC5Dh2MjgcrJTG5nX3FfheuabGl4in0583C51ZYWlVpDvBWw8kJTfXjiKH4z6ZA9dWdT5Y3aH_kOf-znUc7eTvuzISs61x_k", - p: "9ASb2yw5b8d7unrFuOyy4EDcPbnzEpbuVGASeHPqkORwHsqeGbfwGlhDYSYrY0HCwUsSBSFcO3SDeu0Z0zSvFQ", - q: "0yvzzgHo_PGYSlVj-M3965AwQF2wTXz82MZHv6EfcCHKuBfCSecr-igqLHhzfynAQjjf39VrXuPuRL23REF1Iw", - dp: "pUXJ2jSl4lOWNcOZz5phvQmxIg2j2N9pJLS9TeAU63YNio1pb7npYa6OVGpp0JxlsE2MMvVZZtuPgd69MxPn0Q", - dq: "RZoqDM-iXKTA3ldQ0TQMKnVnAgAfWRsGN-j6wxW3R_1LVOw31KYGX7iXVfsJjnNTdEBMwfkVH7yezzd8zVmJ4w", - qi: "2REPnRQIaLsya5wlwFw0whwPaAbTZp2jfguhtg5gou_Yru7Cxz_b83YFPgoI6xuGE1OXsWkRTToS8FuIWCrNBQ", - key_ops: [ "verify" ] }, - fmt: "jwk" }, - exception: "TypeError: Key operations and usage mismatch" }, - { sign_key: { key: { kty: "RSA", - n: "yUmxoJC8VAM5hyYZa-XUBZg1N1ywFMPUpWsF1kaSGed98P3XUgPzgX80wpyzd5qdGuALqnf2lMc7O8PrGBtO5YrvQlI96NX0jUo5bc5wz220ob3AUCeQnTfx-UFqM4pCwjoDSo2PlphJdWgFYymGBaBCJgnENQL9H1N_8_yNiN8", - e: "AQAB", - d: "j06DQyCopFujYoASi0oWmGEUSjUYO8BsrdSzVCnsLLsuZBwlZ4Peouyw4Hl2IIoYniCyzYwZJzVtC5Dh2MjgcrJTG5nX3FfheuabGl4in0583C51ZYWlVpDvBWw8kJTfXjiKH4z6ZA9dWdT5Y3aH_kOf-znUc7eTvuzISs61x_k", - p: "9ASb2yw5b8d7unrFuOyy4EDcPbnzEpbuVGASeHPqkORwHsqeGbfwGlhDYSYrY0HCwUsSBSFcO3SDeu0Z0zSvFQ", - q: "0yvzzgHo_PGYSlVj-M3965AwQF2wTXz82MZHv6EfcCHKuBfCSecr-igqLHhzfynAQjjf39VrXuPuRL23REF1Iw", - dp: "pUXJ2jSl4lOWNcOZz5phvQmxIg2j2N9pJLS9TeAU63YNio1pb7npYa6OVGpp0JxlsE2MMvVZZtuPgd69MxPn0Q", - dq: "RZoqDM-iXKTA3ldQ0TQMKnVnAgAfWRsGN-j6wxW3R_1LVOw31KYGX7iXVfsJjnNTdEBMwfkVH7yezzd8zVmJ4w", - qi: "2REPnRQIaLsya5wlwFw0whwPaAbTZp2jfguhtg5gou_Yru7Cxz_b83YFPgoI6xuGE1OXsWkRTToS8FuIWCrNBQ", - ext: false }, - fmt: "jwk", - extractable: true }, - exception: "TypeError: JWK RSA is not extractable" }, - { sign_key: { key: { kty: "RSA", - alg: "RS384", - n: "yUmxoJC8VAM5hyYZa-XUBZg1N1ywFMPUpWsF1kaSGed98P3XUgPzgX80wpyzd5qdGuALqnf2lMc7O8PrGBtO5YrvQlI96NX0jUo5bc5wz220ob3AUCeQnTfx-UFqM4pCwjoDSo2PlphJdWgFYymGBaBCJgnENQL9H1N_8_yNiN8", - e: "AQAB", - d: "j06DQyCopFujYoASi0oWmGEUSjUYO8BsrdSzVCnsLLsuZBwlZ4Peouyw4Hl2IIoYniCyzYwZJzVtC5Dh2MjgcrJTG5nX3FfheuabGl4in0583C51ZYWlVpDvBWw8kJTfXjiKH4z6ZA9dWdT5Y3aH_kOf-znUc7eTvuzISs61x_k", - p: "9ASb2yw5b8d7unrFuOyy4EDcPbnzEpbuVGASeHPqkORwHsqeGbfwGlhDYSYrY0HCwUsSBSFcO3SDeu0Z0zSvFQ", - q: "0yvzzgHo_PGYSlVj-M3965AwQF2wTXz82MZHv6EfcCHKuBfCSecr-igqLHhzfynAQjjf39VrXuPuRL23REF1Iw", - dp: "pUXJ2jSl4lOWNcOZz5phvQmxIg2j2N9pJLS9TeAU63YNio1pb7npYa6OVGpp0JxlsE2MMvVZZtuPgd69MxPn0Q", - dq: "RZoqDM-iXKTA3ldQ0TQMKnVnAgAfWRsGN-j6wxW3R_1LVOw31KYGX7iXVfsJjnNTdEBMwfkVH7yezzd8zVmJ4w", - qi: "2REPnRQIaLsya5wlwFw0whwPaAbTZp2jfguhtg5gou_Yru7Cxz_b83YFPgoI6xuGE1OXsWkRTToS8FuIWCrNBQ" }, - fmt: "jwk" }, - exception: "TypeError: JWK hash mismatch" }, ]}; let rsa_pss_tsuite = { @@ -422,8 +326,6 @@ let ecdsa_tsuite = { { verify: true, import_alg: { hash: "SHA-512" }, expected: true }, { verify: true, import_alg: { hash: "SHA-1" }, expected: true }, { verify: true, verify_key: { key: "ec2.spki" }, expected: false }, - { verify: true, verify_key: { key: "rsa.spki" }, exception: "Error: EC key is not found" }, - { verify: true, import_alg: { namedCurve: "P-384" }, exception: "Error: name curve mismatch" }, { verify: true, verify_key: { key: "BHFFLGURrlWEXhok0JfTKke4q-nWSIMPvKTPhdKYSVnc4Nzn_7uNz0AA3U4fhpfVxSD4U5QciGyEoM4r3jC7bjI", @@ -433,49 +335,12 @@ let ecdsa_tsuite = { { verify: true, sign_key: { key: "ec.jwk", fmt: "jwk" }, expected: true }, { verify: true, sign_key: { key: "ec.jwk", fmt: "jwk" }, verify_key: { key: "ec.pub.jwk", fmt: "jwk" }, expected: true }, - { verify: true, sign_key: { key: "ec.jwk", fmt: "jwk" }, - import_alg: { namedCurve: "P-384" }, exception: "Error: JWK EC curve mismatch" }, - { sign_key: { key: 1, fmt: "jwk" }, exception: "TypeError: Invalid JWK EC key" }, - { sign_key: { key: { kty: "EC" }, fmt: "jwk" }, exception: "TypeError: Invalid JWK EC key" }, - { sign_key: { key: { kty: "EC", x: "cUUsZRGuVYReGiTQl9MqR7ir6dZIgw-8pM-F0phJWdw"}, fmt: "jwk" }, - exception: "TypeError: Invalid JWK EC key" }, - { sign_key: { key: { kty: "EC", x: "cUUsZRGuVYReGiTQl9MqR7ir6dZIgw-8pM-F0phJWdw", - y: "4Nzn_7uNz0AA3U4fhpfVxSD4U5QciGyEoM4r3jC7bjI" }, - fmt: "jwk" }, - exception: "TypeError: Invalid JWK EC key" }, - { sign_key: { key: { kty: "EC", x: "cUUsZRGuVYReGiTQl9MqR7ir6dZIgw-8pM-F0phJWdw", - y: "4Nzn_7uNz0AA3U4fhpfVxSD4U5QciGyEoM4r3jC7bjI", - d: "E2sW0_4a3QXaSTJ0JKbSUbieKTD1UFtr7i_2CuetP6A" }, - fmt: "jwk" }, - exception: "TypeError: JWK EC curve mismatch" }, - { sign_key: { key: { kty: "EC", x: "cUUsZRGuVYReGiTQl9MqR7ir6dZIgw-8pM-F0phJWdw", - y: "4Nzn_7uNz0AA3U4fhpfVxSD4U5QciGyEoM4r3jC7bjI", - d: "E2sW0_4a3QXaSTJ0JKbSUbieKTD1UFtr7i_2CuetP6A", crv: "P-384" }, - fmt: "jwk" }, - exception: "TypeError: JWK EC curve mismatch" }, { verify: true, sign_key: { key: { kty: "EC", x: "cUUsZRGuVYReGiTQl9MqR7ir6dZIgw-8pM-F0phJWdw", y: "4Nzn_7uNz0AA3U4fhpfVxSD4U5QciGyEoM4r3jC7bjI", d: "E2sW0_4a3QXaSTJ0JKbSUbieKTD1UFtr7i_2CuetP6A", crv: "P-256" }, fmt: "jwk" }, expected: true }, - { sign_key: { key: { kty: "EC", x: "_BROKEN_", - y: "4Nzn_7uNz0AA3U4fhpfVxSD4U5QciGyEoM4r3jC7bjI", - d: "E2sW0_4a3QXaSTJ0JKbSUbieKTD1UFtr7i_2CuetP6A", crv: "P-256" }, - fmt: "jwk" }, - exception: "Error: EC_KEY_set_public_key_affine_coordinates() failed" }, - { sign_key: { key: { kty: "EC", x: "cUUsZRGuVYReGiTQl9MqR7ir6dZIgw-8pM-F0phJWdw", - y: "4Nzn_7uNz0AA3U4fhpfVxSD4U5QciGyEoM4r3jC7bjI", - d: "E2sW0_4a3QXaSTJ0JKbSUbieKTD1UFtr7i_2CuetP6A", crv: "P-256", - key_ops: [ "verify" ]}, - fmt: "jwk" }, - exception: "TypeError: Key operations and usage mismatch" }, - { sign_key: { key: { kty: "EC", x: "cUUsZRGuVYReGiTQl9MqR7ir6dZIgw-8pM-F0phJWdw", - y: "4Nzn_7uNz0AA3U4fhpfVxSD4U5QciGyEoM4r3jC7bjI", ext: false, - d: "E2sW0_4a3QXaSTJ0JKbSUbieKTD1UFtr7i_2CuetP6A", crv: "P-256" }, - extractable: true, - fmt: "jwk" }, - exception: "TypeError: JWK is not extractable" }, { sign_key: { key: { kty: "EC", x: "cUUsZRGuVYReGiTQl9MqR7ir6dZIgw-8pM-F0phJWdw", y: "4Nzn_7uNz0AA3U4fhpfVxSD4U5QciGyEoM4r3jC7bjI", d: "E2sW0_4a3QXaSTJ0JKbSUbieKTD1UFtr7i_2CuetP6A", crv: "P-256" }, _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx-devel