[njs] Crypto: module is rewritten using public API.
Dmitry Volyntsev
xeioex at nginx.com
Wed May 3 04:13:29 UTC 2023
details: https://hg.nginx.org/njs/rev/b2cbf06ba017
branches:
changeset: 2100:b2cbf06ba017
user: Dmitry Volyntsev <xeioex at nginx.com>
date: Tue May 02 20:50:52 2023 -0700
description:
Crypto: module is rewritten using public API.
diffstat:
external/njs_crypto_module.c | 149 ++++++++++++++++++++----------------------
src/test/njs_unit_test.c | 30 ++++----
2 files changed, 87 insertions(+), 92 deletions(-)
diffs (421 lines):
diff -r a86328810249 -r b2cbf06ba017 external/njs_crypto_module.c
--- a/external/njs_crypto_module.c Tue May 02 20:50:46 2023 -0700
+++ b/external/njs_crypto_module.c Tue May 02 20:50:52 2023 -0700
@@ -5,7 +5,12 @@
*/
-#include <njs_main.h>
+#include <njs.h>
+#include <njs_md5.h>
+#include <njs_sha1.h>
+#include <njs_sha2.h>
+#include <njs_string.h>
+#include <njs_buffer.h>
typedef void (*njs_hash_init)(void *ctx);
@@ -56,9 +61,9 @@ typedef struct {
static njs_hash_alg_t *njs_crypto_algorithm(njs_vm_t *vm,
- const njs_value_t *value);
+ njs_value_t *value);
static njs_crypto_enc_t *njs_crypto_encoding(njs_vm_t *vm,
- const njs_value_t *value);
+ njs_value_t *value);
static njs_int_t njs_buffer_digest(njs_vm_t *vm, njs_value_t *value,
const njs_str_t *src);
static njs_int_t njs_crypto_create_hash(njs_vm_t *vm, njs_value_t *args,
@@ -298,9 +303,9 @@ njs_crypto_create_hash(njs_vm_t *vm, njs
return NJS_ERROR;
}
- dgst = njs_mp_alloc(vm->mem_pool, sizeof(njs_digest_t));
+ dgst = njs_mp_alloc(njs_vm_memory_pool(vm), sizeof(njs_digest_t));
if (njs_slow_path(dgst == NULL)) {
- njs_memory_error(vm);
+ njs_vm_memory_error(vm);
return NJS_ERROR;
}
@@ -320,24 +325,22 @@ njs_hash_prototype_update(njs_vm_t *vm,
njs_str_t data;
njs_int_t ret;
njs_hmac_t *ctx;
- njs_value_t *this, dst;
+ njs_value_t *this, *value;
njs_digest_t *dgst;
- njs_typed_array_t *array;
- const njs_value_t *value;
- njs_array_buffer_t *buffer;
- const njs_buffer_encoding_t *encoding;
+ njs_opaque_value_t result;
+ const njs_buffer_encoding_t *enc;
this = njs_argument(args, 0);
if (!hmac) {
dgst = njs_vm_external(vm, njs_crypto_hash_proto_id, this);
if (njs_slow_path(dgst == NULL)) {
- njs_type_error(vm, "\"this\" is not a hash object");
+ njs_vm_error(vm, "\"this\" is not a hash object");
return NJS_ERROR;
}
if (njs_slow_path(dgst->alg == NULL)) {
- njs_error(vm, "Digest already called");
+ njs_vm_error(vm, "Digest already called");
return NJS_ERROR;
}
@@ -346,12 +349,12 @@ njs_hash_prototype_update(njs_vm_t *vm,
} else {
ctx = njs_vm_external(vm, njs_crypto_hmac_proto_id, this);
if (njs_slow_path(ctx == NULL)) {
- njs_type_error(vm, "\"this\" is not a hmac object");
+ njs_vm_error(vm, "\"this\" is not a hmac object");
return NJS_ERROR;
}
if (njs_slow_path(ctx->alg == NULL)) {
- njs_error(vm, "Digest already called");
+ njs_vm_error(vm, "Digest already called");
return NJS_ERROR;
}
@@ -360,37 +363,27 @@ njs_hash_prototype_update(njs_vm_t *vm,
value = njs_arg(args, nargs, 1);
- switch (value->type) {
- case NJS_STRING:
- encoding = njs_buffer_encoding(vm, njs_arg(args, nargs, 2), 1);
- if (njs_slow_path(encoding == NULL)) {
+ if (njs_value_is_string(value)) {
+ enc = njs_buffer_encoding(vm, njs_arg(args, nargs, 2), 1);
+ if (njs_slow_path(enc == NULL)) {
return NJS_ERROR;
}
- ret = njs_buffer_decode_string(vm, value, &dst, encoding);
+ ret = njs_buffer_decode_string(vm, value, njs_value_arg(&result), enc);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
- njs_string_get(&dst, &data);
- break;
+ njs_value_string_get(njs_value_arg(&result), &data);
- case NJS_TYPED_ARRAY:
- case NJS_DATA_VIEW:
- array = njs_typed_array(value);
- buffer = array->buffer;
- if (njs_slow_path(njs_is_detached_buffer(buffer))) {
- njs_type_error(vm, "detached buffer");
+ } else if (njs_value_is_buffer(value)) {
+ ret = njs_value_buffer_get(vm, value, &data);
+ if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
- data.start = &buffer->u.u8[array->offset];
- data.length = array->byte_length;
- break;
-
- default:
- njs_type_error(vm, "data argument \"%s\" is not a string "
- "or Buffer-like object", njs_type_string(value->type));
+ } else {
+ njs_vm_error(vm, "data is not a string or Buffer-like object");
return NJS_ERROR;
}
@@ -425,7 +418,7 @@ njs_hash_prototype_digest(njs_vm_t *vm,
if (!hmac) {
dgst = njs_vm_external(vm, njs_crypto_hash_proto_id, this);
if (njs_slow_path(dgst == NULL)) {
- njs_type_error(vm, "\"this\" is not a hash object");
+ njs_vm_error(vm, "\"this\" is not a hash object");
return NJS_ERROR;
}
@@ -438,7 +431,7 @@ njs_hash_prototype_digest(njs_vm_t *vm,
} else {
ctx = njs_vm_external(vm, njs_crypto_hmac_proto_id, this);
if (njs_slow_path(ctx == NULL)) {
- njs_type_error(vm, "\"this\" is not a hmac object");
+ njs_vm_error(vm, "\"this\" is not a hmac object");
return NJS_ERROR;
}
@@ -477,7 +470,8 @@ njs_hash_prototype_digest(njs_vm_t *vm,
exception:
- njs_error(vm, "Digest already called");
+ njs_vm_error(vm, "Digest already called");
+
return NJS_ERROR;
}
@@ -490,18 +484,18 @@ njs_hash_prototype_copy(njs_vm_t *vm, nj
dgst = njs_vm_external(vm, njs_crypto_hash_proto_id, njs_argument(args, 0));
if (njs_slow_path(dgst == NULL)) {
- njs_type_error(vm, "\"this\" is not a hash object");
+ njs_vm_error(vm, "\"this\" is not a hash object");
return NJS_ERROR;
}
if (njs_slow_path(dgst->alg == NULL)) {
- njs_error(vm, "Digest already called");
+ njs_vm_error(vm, "Digest already called");
return NJS_ERROR;
}
copy = njs_mp_alloc(njs_vm_memory_pool(vm), sizeof(njs_digest_t));
if (njs_slow_path(copy == NULL)) {
- njs_memory_error(vm);
+ njs_vm_memory_error(vm);
return NJS_ERROR;
}
@@ -516,14 +510,15 @@ static njs_int_t
njs_crypto_create_hmac(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
njs_index_t unused, njs_value_t *retval)
{
- njs_str_t key;
- njs_uint_t i;
- njs_hmac_t *ctx;
- njs_hash_alg_t *alg;
- njs_typed_array_t *array;
- const njs_value_t *value;
- njs_array_buffer_t *buffer;
- u_char digest[32], key_buf[64];
+ njs_int_t ret;
+ njs_str_t key;
+ njs_uint_t i;
+ njs_hmac_t *ctx;
+ njs_value_t *value;
+ njs_hash_alg_t *alg;
+ njs_opaque_value_t result;
+ const njs_buffer_encoding_t *enc;
+ u_char digest[32], key_buf[64];
alg = njs_crypto_algorithm(vm, njs_arg(args, nargs, 1));
if (njs_slow_path(alg == NULL)) {
@@ -532,34 +527,34 @@ njs_crypto_create_hmac(njs_vm_t *vm, njs
value = njs_arg(args, nargs, 2);
- switch (value->type) {
- case NJS_STRING:
- njs_string_get(value, &key);
- break;
+ if (njs_value_is_string(value)) {
+ enc = njs_buffer_encoding(vm, njs_value_arg(&njs_value_undefined), 1);
+ if (njs_slow_path(enc == NULL)) {
+ return NJS_ERROR;
+ }
- case NJS_TYPED_ARRAY:
- case NJS_DATA_VIEW:
- array = njs_typed_array(value);
- buffer = array->buffer;
- if (njs_slow_path(njs_is_detached_buffer(buffer))) {
- njs_type_error(vm, "detached buffer");
+ ret = njs_buffer_decode_string(vm, value, njs_value_arg(&result), enc);
+ if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
- key.start = &buffer->u.u8[array->offset];
- key.length = array->byte_length;
- break;
+ njs_value_string_get(njs_value_arg(&result), &key);
- default:
- njs_type_error(vm, "key argument \"%s\" is not a string "
- "or Buffer-like object", njs_type_string(value->type));
+ } else if (njs_value_is_buffer(value)) {
+ ret = njs_value_buffer_get(vm, value, &key);
+ if (njs_slow_path(ret != NJS_OK)) {
+ return NJS_ERROR;
+ }
+
+ } else {
+ njs_vm_error(vm, "key is not a string or Buffer-like object");
return NJS_ERROR;
}
- ctx = njs_mp_alloc(vm->mem_pool, sizeof(njs_hmac_t));
+ ctx = njs_mp_alloc(njs_vm_memory_pool(vm), sizeof(njs_hmac_t));
if (njs_slow_path(ctx == NULL)) {
- njs_memory_error(vm);
+ njs_vm_memory_error(vm);
return NJS_ERROR;
}
@@ -596,17 +591,17 @@ njs_crypto_create_hmac(njs_vm_t *vm, njs
static njs_hash_alg_t *
-njs_crypto_algorithm(njs_vm_t *vm, const njs_value_t *value)
+njs_crypto_algorithm(njs_vm_t *vm, njs_value_t *value)
{
njs_str_t name;
njs_hash_alg_t *e;
- if (njs_slow_path(!njs_is_string(value))) {
- njs_type_error(vm, "algorithm must be a string");
+ if (njs_slow_path(!njs_value_is_string(value))) {
+ njs_vm_error(vm, "algorithm must be a string");
return NULL;
}
- njs_string_get(value, &name);
+ njs_value_string_get(value, &name);
for (e = &njs_hash_algorithms[0]; e->name.length != 0; e++) {
if (njs_strstr_eq(&name, &e->name)) {
@@ -614,28 +609,28 @@ njs_crypto_algorithm(njs_vm_t *vm, const
}
}
- njs_type_error(vm, "not supported algorithm: \"%V\"", &name);
+ njs_vm_error(vm, "not supported algorithm: \"%V\"", &name);
return NULL;
}
static njs_crypto_enc_t *
-njs_crypto_encoding(njs_vm_t *vm, const njs_value_t *value)
+njs_crypto_encoding(njs_vm_t *vm, njs_value_t *value)
{
njs_str_t name;
njs_crypto_enc_t *e;
- if (njs_slow_path(!njs_is_string(value))) {
- if (njs_is_defined(value)) {
- njs_type_error(vm, "encoding must be a string");
+ if (njs_slow_path(!njs_value_is_string(value))) {
+ if (!njs_value_is_undefined(value)) {
+ njs_vm_error(vm, "encoding must be a string");
return NULL;
}
return &njs_encodings[0];
}
- njs_string_get(value, &name);
+ njs_value_string_get(value, &name);
for (e = &njs_encodings[1]; e->name.length != 0; e++) {
if (njs_strstr_eq(&name, &e->name)) {
@@ -643,7 +638,7 @@ njs_crypto_encoding(njs_vm_t *vm, const
}
}
- njs_type_error(vm, "Unknown digest encoding: \"%V\"", &name);
+ njs_vm_error(vm, "Unknown digest encoding: \"%V\"", &name);
return NULL;
}
diff -r a86328810249 -r b2cbf06ba017 src/test/njs_unit_test.c
--- a/src/test/njs_unit_test.c Tue May 02 20:50:46 2023 -0700
+++ b/src/test/njs_unit_test.c Tue May 02 20:50:52 2023 -0700
@@ -20436,25 +20436,25 @@ static njs_unit_test_t njs_crypto_modul
"'d9f5aeb06abebb3be3f38adec9a2e3b94228d52193be923eb4e24c9b56ee0930']]") },
{ njs_str("var h = require('crypto').createHash()"),
- njs_str("TypeError: algorithm must be a string") },
+ njs_str("Error: algorithm must be a string") },
{ njs_str("var h = require('crypto').createHash([])"),
- njs_str("TypeError: algorithm must be a string") },
+ njs_str("Error: algorithm must be a string") },
{ njs_str("var h = require('crypto').createHash('sha512')"),
- njs_str("TypeError: not supported algorithm: \"sha512\"") },
+ njs_str("Error: not supported algorithm: \"sha512\"") },
{ njs_str("var h = require('crypto').createHash('sha1');"
"h.update()"),
- njs_str("TypeError: data argument \"undefined\" is not a string or Buffer-like object") },
+ njs_str("Error: data is not a string or Buffer-like object") },
{ njs_str("var h = require('crypto').createHash('sha1');"
"h.update({})"),
- njs_str("TypeError: data argument \"object\" is not a string or Buffer-like object") },
+ njs_str("Error: data is not a string or Buffer-like object") },
{ njs_str("var h = require('crypto').createHash('sha1');"
"h.update('A').digest('latin1')"),
- njs_str("TypeError: Unknown digest encoding: \"latin1\"") },
+ njs_str("Error: Unknown digest encoding: \"latin1\"") },
{ njs_str("require('crypto').createHash('sha1').digest() instanceof Buffer"),
njs_str("true") },
@@ -20554,16 +20554,16 @@ static njs_unit_test_t njs_crypto_modul
njs_str("5647b6c429701ff512f0f18232b4507065d2376ca8899a816a0a6e721bf8ddcc") },
{ njs_str("var h = require('crypto').createHmac()"),
- njs_str("TypeError: algorithm must be a string") },
+ njs_str("Error: algorithm must be a string") },
{ njs_str("var h = require('crypto').createHmac([])"),
- njs_str("TypeError: algorithm must be a string") },
+ njs_str("Error: algorithm must be a string") },
{ njs_str("var h = require('crypto').createHmac('sha512', '')"),
- njs_str("TypeError: not supported algorithm: \"sha512\"") },
+ njs_str("Error: not supported algorithm: \"sha512\"") },
{ njs_str("var h = require('crypto').createHmac('sha1', [])"),
- njs_str("TypeError: key argument \"array\" is not a string or Buffer-like object") },
+ njs_str("Error: key is not a string or Buffer-like object") },
{ njs_str("var h = require('crypto').createHmac('sha1', 'secret key');"
"h.update('A').digest('hex'); h.digest('hex')"),
@@ -20578,7 +20578,7 @@ static njs_unit_test_t njs_crypto_modul
{ njs_str("var cr = require('crypto'); var h = cr.createHash('sha1');"
"h.update.call(cr.createHmac('sha1', 's'), '')"),
- njs_str("TypeError: \"this\" is not a hash object") },
+ njs_str("Error: \"this\" is not a hash object") },
};
static njs_unit_test_t njs_querystring_module_test[] =
@@ -23233,24 +23233,24 @@ static njs_unit_test_t njs_backtraces_t
" at main (:1)\n") },
{ njs_str("require('crypto').createHash('sha')"),
- njs_str("TypeError: not supported algorithm: \"sha\"\n"
+ njs_str("Error: not supported algorithm: \"sha\"\n"
" at crypto.createHash (native)\n"
" at main (:1)\n") },
{ njs_str("var h = require('crypto').createHash('sha1');"
"h.update([])"),
- njs_str("TypeError: data argument \"array\" is not a string or Buffer-like object\n"
+ njs_str("Error: data is not a string or Buffer-like object\n"
" at Hash.update (native)\n"
" at main (:1)\n") },
{ njs_str("require('crypto').createHmac('sha1', [])"),
- njs_str("TypeError: key argument \"array\" is not a string or Buffer-like object\n"
+ njs_str("Error: key is not a string or Buffer-like object\n"
" at crypto.createHmac (native)\n"
" at main (:1)\n") },
{ njs_str("var h = require('crypto').createHmac('sha1', 'secret');"
"h.update([])"),
- njs_str("TypeError: data argument \"array\" is not a string or Buffer-like object\n"
+ njs_str("Error: data is not a string or Buffer-like object\n"
" at Hmac.update (native)\n"
" at main (:1)\n") },
More information about the nginx-devel
mailing list