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);
}
},
+ {
+ .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"),
}
+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)
"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 => {"