diff options
author | David Benjamin <davidben@google.com> | 2017-09-22 18:51:21 -0400 |
---|---|---|
committer | Rod Vagg <rod@vagg.org> | 2017-11-11 20:42:49 +1100 |
commit | 2b28d6cfacfd0ddd7ff97536152f4ad895bf4120 (patch) | |
tree | 36a193592f152deb92f8c11c315442ede4b57f64 /src/node_crypto.cc | |
parent | 146e8f8340d2b6b4fc08e235f522a53848d01290 (diff) | |
download | android-node-v8-2b28d6cfacfd0ddd7ff97536152f4ad895bf4120.tar.gz android-node-v8-2b28d6cfacfd0ddd7ff97536152f4ad895bf4120.tar.bz2 android-node-v8-2b28d6cfacfd0ddd7ff97536152f4ad895bf4120.zip |
crypto: make Hash 1.1.0-compatible
OpenSSL 1.1.0 requires EVP_MD_CTX be heap-allocated.
PR-URL: https://github.com/nodejs/node/pull/16130
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Rod Vagg <rod@vagg.org>
Diffstat (limited to 'src/node_crypto.cc')
-rw-r--r-- | src/node_crypto.cc | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/src/node_crypto.cc b/src/node_crypto.cc index 0000188967..7bd44ac532 100644 --- a/src/node_crypto.cc +++ b/src/node_crypto.cc @@ -197,6 +197,9 @@ static int X509_up_ref(X509* cert) { CRYPTO_add(&cert->references, 1, CRYPTO_LOCK_X509); return 1; } + +#define EVP_MD_CTX_new EVP_MD_CTX_create +#define EVP_MD_CTX_free EVP_MD_CTX_destroy #endif // OPENSSL_VERSION_NUMBER < 0x10100000L // Subject DER of CNNIC ROOT CA and CNNIC EV ROOT CA are taken from @@ -3906,6 +3909,11 @@ void Hmac::HmacDigest(const FunctionCallbackInfo<Value>& args) { } +Hash::~Hash() { + EVP_MD_CTX_free(mdctx_); +} + + void Hash::Initialize(Environment* env, v8::Local<v8::Object> target) { Local<FunctionTemplate> t = env->NewFunctionTemplate(New); @@ -3935,20 +3943,22 @@ bool Hash::HashInit(const char* hash_type) { const EVP_MD* md = EVP_get_digestbyname(hash_type); if (md == nullptr) return false; - EVP_MD_CTX_init(&mdctx_); - if (EVP_DigestInit_ex(&mdctx_, md, nullptr) <= 0) { + mdctx_ = EVP_MD_CTX_new(); + if (mdctx_ == nullptr || + EVP_DigestInit_ex(mdctx_, md, nullptr) <= 0) { + EVP_MD_CTX_free(mdctx_); + mdctx_ = nullptr; return false; } - initialised_ = true; finalized_ = false; return true; } bool Hash::HashUpdate(const char* data, int len) { - if (!initialised_) + if (mdctx_ == nullptr) return false; - EVP_DigestUpdate(&mdctx_, data, len); + EVP_DigestUpdate(mdctx_, data, len); return true; } @@ -3992,8 +4002,7 @@ void Hash::HashDigest(const FunctionCallbackInfo<Value>& args) { unsigned char md_value[EVP_MAX_MD_SIZE]; unsigned int md_len; - EVP_DigestFinal_ex(&hash->mdctx_, md_value, &md_len); - EVP_MD_CTX_cleanup(&hash->mdctx_); + EVP_DigestFinal_ex(hash->mdctx_, md_value, &md_len); hash->finalized_ = true; Local<Value> error; |