[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