summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rw-r--r--ext/openssl/ossl_digest.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/ext/openssl/ossl_digest.c b/ext/openssl/ossl_digest.c
index 9b8ced5233..30478911ba 100644
--- a/ext/openssl/ossl_digest.c
+++ b/ext/openssl/ossl_digest.c
@@ -37,18 +37,25 @@ GetDigestPtr(VALUE obj)
{
const EVP_MD *md;
- if (TYPE(obj) == T_STRING) {
- const char *name = StringValueCStr(obj);
+ if (TYPE(obj) == T_CLASS) {
+ EVP_MD_CTX *ctx;
+ VALUE digest = rb_funcall(obj, rb_intern("new"), 0, 0);
- md = EVP_get_digestbyname(name);
- if (!md)
- ossl_raise(rb_eRuntimeError, "Unsupported digest algorithm (%s).", name);
- } else {
+ SafeGetDigest(digest, ctx);
+
+ md = EVP_MD_CTX_md(ctx);
+ } else if (rb_obj_is_kind_of(obj, cDigest)) {
EVP_MD_CTX *ctx;
SafeGetDigest(obj, ctx);
md = EVP_MD_CTX_md(ctx);
+ } else {
+ const char *name = StringValueCStr(obj);
+
+ md = EVP_get_digestbyname(name);
+ if (!md)
+ ossl_raise(rb_eRuntimeError, "Unsupported digest algorithm (%s).", name);
}
return md;