Skip to content
Permalink
Browse files

crypto: better error message for createHash

calling digest or update on a hash object after digest has been called
now gives a topical error message instead of an error message saying that the
hash failed to initialize.

PR-URL: #6042
Reviewed-By: Brian White <mscdex@mscdex.net>
Reviewed-By: James M Snell <jasnell@gmail.com>
  • Loading branch information...
calvinmetcalf authored and jasnell committed Apr 4, 2016
1 parent 7097212 commit 1d9451bb5aef0733f6fb5c5b95d33a31e04f5462
Showing with 25 additions and 1 deletion.
  1. +12 −1 src/node_crypto.cc
  2. +1 −0 src/node_crypto.h
  3. +12 −0 test/parallel/test-crypto-hash.js
@@ -3676,6 +3676,7 @@ bool Hash::HashInit(const char* hash_type) {
return false;
}
initialised_ = true;
finalized_ = false;
return true;
}

@@ -3695,6 +3696,13 @@ void Hash::HashUpdate(const FunctionCallbackInfo<Value>& args) {

THROW_AND_RETURN_IF_NOT_STRING_OR_BUFFER(args[0], "Data");

if (!hash->initialised_) {
return env->ThrowError("Not initialized");
}
if (hash->finalized_) {
return env->ThrowError("Digest already called");
}

// Only copy the data if we have to, because it's a string
bool r;
if (args[0]->IsString()) {
@@ -3722,6 +3730,9 @@ void Hash::HashDigest(const FunctionCallbackInfo<Value>& args) {
if (!hash->initialised_) {
return env->ThrowError("Not initialized");
}
if (hash->finalized_) {
return env->ThrowError("Digest already called");
}

enum encoding encoding = BUFFER;
if (args.Length() >= 1) {
@@ -3735,7 +3746,7 @@ void Hash::HashDigest(const FunctionCallbackInfo<Value>& args) {

EVP_DigestFinal_ex(&hash->mdctx_, md_value, &md_len);
EVP_MD_CTX_cleanup(&hash->mdctx_);
hash->initialised_ = false;
hash->finalized_ = true;

Local<Value> rc = StringBytes::Encode(env->isolate(),
reinterpret_cast<const char*>(md_value),
@@ -538,6 +538,7 @@ class Hash : public BaseObject {
EVP_MD_CTX mdctx_; /* coverity[member_decl] */
const EVP_MD* md_; /* coverity[member_decl] */
bool initialised_;
bool finalized_;
};

class SignBase : public BaseObject {
@@ -98,3 +98,15 @@ assert.equal(
assert.notEqual(
hutf8,
crypto.createHash('sha512').update('УТФ-8 text', 'binary').digest('hex'));

var h3 = crypto.createHash('sha256');
h3.digest();
assert.throws(function() {
h3.digest();
},
/Digest already called/);

assert.throws(function() {
h3.update('foo');
},
/Digest already called/);

0 comments on commit 1d9451b

Please sign in to comment.
You can’t perform that action at this time.