From bd3c0fac624c6b31ccbb8d72ae4ced958a40ddee Mon Sep 17 00:00:00 2001 From: Doug Hogan Date: Fri, 21 Dec 2018 07:53:24 -0800 Subject: Make hash ctx init internal to hash.c per PR feedback --- lib/crypto/c_src/crypto.c | 11 ++--------- lib/crypto/c_src/hash.c | 23 +++++++++++++++++++++-- lib/crypto/c_src/hash.h | 9 +-------- 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/lib/crypto/c_src/crypto.c b/lib/crypto/c_src/crypto.c index 5b697ba5aa..df2e4a9f4b 100644 --- a/lib/crypto/c_src/crypto.c +++ b/lib/crypto/c_src/crypto.c @@ -184,17 +184,10 @@ static int initialize(ErlNifEnv* env, ERL_NIF_TERM load_info) if (!init_hmac_ctx(env)) { return __LINE__; } - -#if OPENSSL_VERSION_NUMBER >= PACKED_OPENSSL_VERSION_PLAIN(1,0,0) - evp_md_ctx_rtype = enif_open_resource_type(env, NULL, "EVP_MD_CTX", - (ErlNifResourceDtor*) evp_md_ctx_dtor, - ERL_NIF_RT_CREATE|ERL_NIF_RT_TAKEOVER, - NULL); - if (!evp_md_ctx_rtype) { - PRINTF_ERR0("CRYPTO: Could not open resource type 'EVP_MD_CTX'"); + if (!init_hash_ctx(env)) { return __LINE__; } -#endif + #ifdef HAVE_EVP_AES_CTR evp_cipher_ctx_rtype = enif_open_resource_type(env, NULL, "EVP_CIPHER_CTX", (ErlNifResourceDtor*) evp_cipher_ctx_dtor, diff --git a/lib/crypto/c_src/hash.c b/lib/crypto/c_src/hash.c index 44704329ab..52748dc933 100644 --- a/lib/crypto/c_src/hash.c +++ b/lib/crypto/c_src/hash.c @@ -26,14 +26,33 @@ #define RIPEMD160_CTX_LEN (sizeof(RIPEMD160_CTX)) #if OPENSSL_VERSION_NUMBER >= PACKED_OPENSSL_VERSION_PLAIN(1,0,0) +struct evp_md_ctx { + EVP_MD_CTX* ctx; +}; + /* Define resource types for OpenSSL context structures. */ -ErlNifResourceType* evp_md_ctx_rtype; +static ErlNifResourceType* evp_md_ctx_rtype; -void evp_md_ctx_dtor(ErlNifEnv* env, struct evp_md_ctx *ctx) { +static void evp_md_ctx_dtor(ErlNifEnv* env, struct evp_md_ctx *ctx) { EVP_MD_CTX_free(ctx->ctx); } #endif +int init_hash_ctx(ErlNifEnv* env) { +#if OPENSSL_VERSION_NUMBER >= PACKED_OPENSSL_VERSION_PLAIN(1,0,0) + evp_md_ctx_rtype = enif_open_resource_type(env, NULL, "EVP_MD_CTX", + (ErlNifResourceDtor*) evp_md_ctx_dtor, + ERL_NIF_RT_CREATE|ERL_NIF_RT_TAKEOVER, + NULL); + if (evp_md_ctx_rtype == NULL) { + PRINTF_ERR0("CRYPTO: Could not open resource type 'EVP_MD_CTX'"); + return 0; + } +#endif + + return 1; +} + ERL_NIF_TERM hash_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {/* (Type, Data) */ struct digest_type_t *digp = NULL; diff --git a/lib/crypto/c_src/hash.h b/lib/crypto/c_src/hash.h index 9b82d9356c..8bae07f39a 100644 --- a/lib/crypto/c_src/hash.h +++ b/lib/crypto/c_src/hash.h @@ -23,14 +23,7 @@ #include "common.h" -#if OPENSSL_VERSION_NUMBER >= PACKED_OPENSSL_VERSION_PLAIN(1,0,0) -struct evp_md_ctx { - EVP_MD_CTX* ctx; -}; -extern ErlNifResourceType* evp_md_ctx_rtype; - -void evp_md_ctx_dtor(ErlNifEnv* env, struct evp_md_ctx *ctx); -#endif +int init_hash_ctx(ErlNifEnv *env); ERL_NIF_TERM hash_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); ERL_NIF_TERM hash_init_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); -- cgit v1.2.3