diff -Nurp old/ext/digest/digest.h new/ext/digest/digest.h --- old/ext/digest/digest.h 2017-06-21 12:56:09.007011362 -0400 +++ new/ext/digest/digest.h 2017-06-21 12:56:32.458975554 -0400 @@ -31,6 +31,26 @@ typedef struct { rb_digest_hash_finish_func_t finish_func; } rb_digest_metadata_t; +#define DEFINE_INIT_FUNC_FOR_EVP(upper_name, lower_name) \ +int \ +rb_digest_##upper_name##_evp_init(upper_name##_CTX* ctx) \ +{ \ + SSL_load_error_strings(); \ + EVP_MD_CTX *md_ctx = EVP_MD_CTX_create(); \ + \ + if(!EVP_DigestInit_ex(md_ctx, EVP_##lower_name(), NULL)) { \ + const char *error_message; \ + EVP_MD_CTX_destroy(md_ctx); \ + \ + error_message = ERR_reason_error_string(ERR_peek_last_error()); \ + rb_raise(rb_eRuntimeError, error_message); \ + } \ + *ctx = *(upper_name##_CTX*)md_ctx->md_data; \ + EVP_MD_CTX_destroy(md_ctx); \ + \ + return 1; \ +} + #define DEFINE_UPDATE_FUNC_FOR_UINT(name) \ void \ rb_digest_##name##_update(void *ctx, unsigned char *ptr, size_t size) \ diff -Nurp old/ext/digest/md5/md5ossl.h new/ext/digest/md5/md5ossl.h --- old/ext/digest/md5/md5ossl.h 2017-06-21 12:56:09.007011362 -0400 +++ new/ext/digest/md5/md5ossl.h 2017-06-21 12:56:32.458975554 -0400 @@ -5,9 +5,15 @@ #include #include +#include +#include #define MD5_BLOCK_LENGTH MD5_CBLOCK +static DEFINE_INIT_FUNC_FOR_EVP(MD5, md5) +#undef MD5_Init +#define MD5_Init rb_digest_MD5_evp_init + static DEFINE_FINISH_FUNC_FROM_FINAL(MD5) #undef MD5_Finish #define MD5_Finish rb_digest_MD5_finish diff -Nurp old/ext/digest/rmd160/rmd160ossl.h new/ext/digest/rmd160/rmd160ossl.h --- old/ext/digest/rmd160/rmd160ossl.h 2017-06-21 12:56:09.007011362 -0400 +++ new/ext/digest/rmd160/rmd160ossl.h 2017-06-21 12:56:32.458975554 -0400 @@ -5,6 +5,8 @@ #include #include +#include +#include #define RMD160_CTX RIPEMD160_CTX @@ -14,6 +16,10 @@ #define RMD160_BLOCK_LENGTH RIPEMD160_CBLOCK #define RMD160_DIGEST_LENGTH RIPEMD160_DIGEST_LENGTH +static DEFINE_INIT_FUNC_FOR_EVP(RIPEMD160, ripemd160) +#undef RMD160_Init +#define RMD160_Init rb_digest_RIPEMD160_evp_init + static DEFINE_FINISH_FUNC_FROM_FINAL(RIPEMD160) #define RMD160_Finish rb_digest_RIPEMD160_finish diff -Nurp old/ext/digest/sha1/sha1ossl.h new/ext/digest/sha1/sha1ossl.h --- old/ext/digest/sha1/sha1ossl.h 2017-06-21 12:56:09.007011362 -0400 +++ new/ext/digest/sha1/sha1ossl.h 2017-06-21 12:56:32.458975554 -0400 @@ -5,6 +5,8 @@ #include #include +#include +#include #define SHA1_CTX SHA_CTX @@ -15,6 +17,10 @@ #endif #define SHA1_DIGEST_LENGTH SHA_DIGEST_LENGTH +static DEFINE_INIT_FUNC_FOR_EVP(SHA1, sha1) +#undef SHA1_Init +#define SHA1_Init rb_digest_SHA1_evp_init + static DEFINE_FINISH_FUNC_FROM_FINAL(SHA1) #undef SHA1_Finish #define SHA1_Finish rb_digest_SHA1_finish diff -Nurp old/ext/digest/sha2/sha2ossl.h new/ext/digest/sha2/sha2ossl.h --- old/ext/digest/sha2/sha2ossl.h 2017-06-21 12:56:09.007011362 -0400 +++ new/ext/digest/sha2/sha2ossl.h 2017-06-21 12:56:32.458975554 -0400 @@ -3,6 +3,8 @@ #include #include +#include +#include #define SHA256_BLOCK_LENGTH SHA256_CBLOCK #define SHA384_BLOCK_LENGTH SHA512_CBLOCK @@ -14,6 +16,16 @@ typedef SHA512_CTX SHA384_CTX; +#undef SHA256_Init +#undef SHA384_Init +#undef SHA512_Init +#define SHA256_Init rb_digest_SHA256_evp_init +#define SHA384_Init rb_digest_SHA384_evp_init +#define SHA512_Init rb_digest_SHA512_evp_init +static DEFINE_INIT_FUNC_FOR_EVP(SHA256, sha256) +static DEFINE_INIT_FUNC_FOR_EVP(SHA384, sha384) +static DEFINE_INIT_FUNC_FOR_EVP(SHA512, sha512) + #undef SHA256_Finish #undef SHA384_Finish #undef SHA512_Finish