]> git.kaiwu.me - njs.git/commitdiff
Fixed crypto update() method after digest() is called.
authorDmitry Volyntsev <xeioex@nginx.com>
Thu, 5 Apr 2018 16:06:35 +0000 (19:06 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Thu, 5 Apr 2018 16:06:35 +0000 (19:06 +0300)
njs/njs_crypto.c
njs/test/njs_unit_test.c

index db359e47113baccfa3a5d5e431226e793cd63aba..c00e29829f2b28b8a0afc2b836af9c62ac2172ba 100644 (file)
@@ -243,6 +243,12 @@ njs_hash_prototype_update(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     njs_string_get(&args[1], &data);
 
     dgst = njs_value_data(&hash->value);
+
+    if (nxt_slow_path(dgst->alg == NULL)) {
+        njs_error(vm, "Digest already called", NULL);
+        return NJS_ERROR;
+    }
+
     dgst->alg->update(&dgst->u, data.start, data.length);
 
     vm->retval = args[0];
@@ -504,6 +510,12 @@ njs_hmac_prototype_update(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     njs_string_get(&args[1], &data);
 
     ctx = njs_value_data(&hmac->value);
+
+    if (nxt_slow_path(ctx->alg == NULL)) {
+        njs_error(vm, "Digest already called", NULL);
+        return NJS_ERROR;
+    }
+
     ctx->alg->update(&ctx->u, data.start, data.length);
 
     vm->retval = args[0];
index 75a76fe514e7a362f19c90f559ee7a3bb40a40c6..693dd8563bbc55240a62b1f7265b09f5b010c6c8 100644 (file)
@@ -9142,6 +9142,10 @@ static njs_unit_test_t  njs_test[] =
                  "h.update('A').digest('hex'); h.digest('hex')"),
       nxt_string("Error: Digest already called") },
 
+    { nxt_string("var h = require('crypto').createHash('sha1');"
+                 "h.update('A').digest('hex'); h.update('B')"),
+      nxt_string("Error: Digest already called") },
+
     /* require('crypto').createHash() */
 
     { nxt_string("require('crypto').createHmac('sha1', '')"),
@@ -9239,6 +9243,14 @@ static njs_unit_test_t  njs_test[] =
     { nxt_string("var h = require('crypto').createHmac('sha1', [])"),
       nxt_string("TypeError: key must be a string") },
 
+    { nxt_string("var h = require('crypto').createHmac('sha1', 'secret key');"
+                 "h.update('A').digest('hex'); h.digest('hex')"),
+      nxt_string("Error: Digest already called") },
+
+    { nxt_string("var h = require('crypto').createHmac('sha1', 'secret key');"
+                 "h.update('A').digest('hex'); h.update('B')"),
+      nxt_string("Error: Digest already called") },
+
     /* setTimeout(). */
 
     { nxt_string("setTimeout()"),