From bd3ddd458d8ccb72595422b5ea5b133da99f0a80 Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Fri, 30 Dec 2022 18:22:02 -0800 Subject: [PATCH] WebCrypto: improved exception wording for invalid key formats. --- external/njs_webcrypto_module.c | 60 +++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/external/njs_webcrypto_module.c b/external/njs_webcrypto_module.c index bedc0c22..4c03609c 100644 --- a/external/njs_webcrypto_module.c +++ b/external/njs_webcrypto_module.c @@ -122,6 +122,7 @@ static njs_int_t njs_ext_get_random_values(njs_vm_t *vm, njs_value_t *args, static void njs_webcrypto_cleanup_pkey(void *data); static njs_webcrypto_key_format_t njs_key_format(njs_vm_t *vm, njs_value_t *value); +static njs_str_t *njs_format_string(njs_webcrypto_key_format_t fmt); static njs_int_t njs_key_usage(njs_vm_t *vm, njs_value_t *value, unsigned *mask); static njs_webcrypto_algorithm_t *njs_key_algorithm(njs_vm_t *vm, @@ -278,6 +279,15 @@ static njs_webcrypto_entry_t njs_webcrypto_curve[] = { }; +static njs_webcrypto_entry_t njs_webcrypto_format[] = { + { njs_str("raw"), NJS_KEY_FORMAT_RAW }, + { njs_str("pkcs8"), NJS_KEY_FORMAT_PKCS8 }, + { njs_str("spki"), NJS_KEY_FORMAT_SPKI }, + { njs_str("jwk"), NJS_KEY_FORMAT_JWK }, + { njs_null_str, NJS_KEY_FORMAT_UNKNOWN } +}; + + static njs_webcrypto_entry_t njs_webcrypto_usage[] = { { njs_str("decrypt"), NJS_KEY_USAGE_DECRYPT }, { njs_str("deriveBits"), NJS_KEY_USAGE_DERIVE_BITS }, @@ -1693,7 +1703,8 @@ njs_ext_import_key(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, } if (njs_slow_path(!(fmt & alg->fmt))) { - njs_type_error(vm, "unsupported key fmt for \"%V\" key", + njs_type_error(vm, "unsupported key fmt \"%V\" for \"%V\" key", + njs_format_string(fmt), njs_algorithm_string(alg)); goto fail; } @@ -2511,46 +2522,45 @@ njs_webcrypto_cleanup_pkey(void *data) static njs_webcrypto_key_format_t njs_key_format(njs_vm_t *vm, njs_value_t *value) { - njs_int_t ret; - njs_str_t format; - njs_uint_t fmt; - njs_value_t string; - - static const struct { - njs_str_t name; - njs_uint_t value; - } formats[] = { - { njs_str("raw"), NJS_KEY_FORMAT_RAW }, - { njs_str("pkcs8"), NJS_KEY_FORMAT_PKCS8 }, - { njs_str("spki"), NJS_KEY_FORMAT_SPKI }, - { njs_str("jwk"), NJS_KEY_FORMAT_JWK }, - }; + njs_int_t ret; + njs_str_t format; + njs_value_t string; + njs_webcrypto_entry_t *e; ret = njs_value_to_string(vm, &string, value); if (njs_slow_path(ret != NJS_OK)) { - goto fail; + return NJS_KEY_FORMAT_UNKNOWN; } njs_string_get(&string, &format); - fmt = 0; - - while (fmt < sizeof(formats) / sizeof(formats[0])) { - if (njs_strstr_eq(&format, &formats[fmt].name)) { - return formats[fmt].value; + for (e = &njs_webcrypto_format[0]; e->name.length != 0; e++) { + if (njs_strstr_eq(&format, &e->name)) { + return e->value; } - - fmt++; } -fail: - njs_type_error(vm, "unknown key format: \"%V\"", &format); return NJS_KEY_FORMAT_UNKNOWN; } +static njs_str_t * +njs_format_string(njs_webcrypto_key_format_t fmt) +{ + njs_webcrypto_entry_t *e; + + for (e = &njs_webcrypto_format[0]; e->name.length != 0; e++) { + if (fmt == e->value) { + break; + } + } + + return &e->name; +} + + static njs_int_t njs_key_usage_array_handler(njs_vm_t *vm, njs_iterator_args_t *args, njs_value_t *value, int64_t index) -- 2.47.3