summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--ext/openssl/ossl_digest.c19
2 files changed, 23 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index bbc75625d8..ad78f9936a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+Wed Feb 24 00:50:09 2010 Akinori MUSHA <knu@iDaemons.org>
+
+ * ext/openssl/ossl_digest.c (GetDigestPtr): Allow to pass the
+ OpenSSL::Digest class in place of where either an instance of
+ the class or the algorithm name was demanded. For example,
+ OpenSSL::HMAC.digest(OpenSSL::Digest::SHA1, key, data) is now
+ accepted as well as the usual
+ OpenSSL::HMAC.digest(OpenSSL::Digest::SHA1.new, key, data) and
+ OpenSSL::HMAC.digest("SHA1", key, data).
+
Wed Feb 24 00:39:17 2010 Yusuke Endoh <mame@tsg.ne.jp>
* string.c (str_new_empty): String#split, partition, rpartition
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;