[njs] Crypto: added Hash.copy() method.

Dmitry Volyntsev xeioex at nginx.com
Tue Mar 21 04:26:39 UTC 2023


details:   https://hg.nginx.org/njs/rev/edf1c2aef957
branches:  
changeset: 2074:edf1c2aef957
user:      Dmitry Volyntsev <xeioex at nginx.com>
date:      Mon Mar 20 21:25:47 2023 -0700
description:
Crypto: added Hash.copy() method.

This closes #625 issue on Github.

diffstat:

 external/njs_crypto_module.c |  42 ++++++++++++++++++++++++++++++++++++++++++
 src/test/njs_unit_test.c     |  20 ++++++++++++++++++++
 2 files changed, 62 insertions(+), 0 deletions(-)

diffs (96 lines):

diff -r fbd36220ea17 -r edf1c2aef957 external/njs_crypto_module.c
--- a/external/njs_crypto_module.c	Mon Mar 20 21:09:58 2023 -0700
+++ b/external/njs_crypto_module.c	Mon Mar 20 21:25:47 2023 -0700
@@ -67,6 +67,8 @@ static njs_int_t njs_hash_prototype_upda
     njs_uint_t nargs, njs_index_t hmac);
 static njs_int_t njs_hash_prototype_digest(njs_vm_t *vm, njs_value_t *args,
     njs_uint_t nargs, njs_index_t hmac);
+static njs_int_t njs_hash_prototype_copy(njs_vm_t *vm, njs_value_t *args,
+    njs_uint_t nargs, njs_index_t hmac);
 static njs_int_t njs_crypto_create_hmac(njs_vm_t *vm, njs_value_t *args,
     njs_uint_t nargs, njs_index_t unused);
 
@@ -173,6 +175,16 @@ static njs_external_t  njs_ext_crypto_ha
 
     {
         .flags = NJS_EXTERN_METHOD,
+        .name.string = njs_str("copy"),
+        .writable = 1,
+        .configurable = 1,
+        .u.method = {
+            .native = njs_hash_prototype_copy,
+        }
+    },
+
+    {
+        .flags = NJS_EXTERN_METHOD,
         .name.string = njs_str("constructor"),
         .writable = 1,
         .configurable = 1,
@@ -471,6 +483,36 @@ exception:
 
 
 static njs_int_t
+njs_hash_prototype_copy(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
+    njs_index_t unused)
+{
+    njs_digest_t  *dgst, *copy;
+
+    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");
+        return NJS_ERROR;
+    }
+
+    if (njs_slow_path(dgst->alg == NULL)) {
+        njs_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);
+        return NJS_ERROR;
+    }
+
+    memcpy(copy, dgst, sizeof(njs_digest_t));
+
+    return njs_vm_external_create(vm, njs_vm_retval(vm),
+                                  njs_crypto_hash_proto_id, copy, 0);
+}
+
+
+static njs_int_t
 njs_crypto_create_hmac(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
diff -r fbd36220ea17 -r edf1c2aef957 src/test/njs_unit_test.c
--- a/src/test/njs_unit_test.c	Mon Mar 20 21:09:58 2023 -0700
+++ b/src/test/njs_unit_test.c	Mon Mar 20 21:25:47 2023 -0700
@@ -20360,6 +20360,26 @@ static njs_unit_test_t  njs_crypto_modul
               "OBZPvRdgPXP2lri01yZk1zW7anyIV3aH/SrjP9aWQVM=,"
               "OBZPvRdgPXP2lri01yZk1zW7anyIV3aH_SrjP9aWQVM") },
 
+    { njs_str("const crypto = require('crypto');"
+              "let hash = crypto.createHash('sha256');"
+              "let digests = [];"
+              "hash.update('one');"
+              "digests.push(hash.copy().digest('hex'));"
+              "hash.update('two');"
+              "digests.push(hash.copy().digest('hex'));"
+              "hash.update('three');"
+              "digests.push(hash.copy().digest('hex'));"
+              "digests"),
+      njs_str("7692c3ad3540bb803c020b3aee66cd8887123234ea0c6e7143c0add73ff431ed,"
+              "25b6746d5172ed6352966a013d93ac846e1110d5a25e8f183b5931f4688842a1,"
+              "4592092e1061c7ea85af2aed194621cc17a2762bae33a79bf8ce33fd0168b801") },
+
+    { njs_str("const crypto = require('crypto');"
+              "let hash = crypto.createHash('sha256');"
+              "hash.update('one').digest();"
+              "hash.copy()"),
+      njs_str("Error: Digest already called") },
+
     { njs_str("var hash = require('crypto').createHash;"
               "njs.dump(['', 'abc'.repeat(100)].map(v => {"
               "    return ['md5', 'sha1', 'sha256'].map(h => {"


More information about the nginx-devel mailing list