summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorknu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-02-23 17:33:39 +0000
committerknu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-02-23 17:33:39 +0000
commitd22373455532e99c0adf1a1e5d0b3a864691e2f9 (patch)
tree0dcfe67a2339f2590d4fb213cb4efaa0e255029d
parent28501bb6e5a31d6ddb8b5167f2f2a87a623bf818 (diff)
Back out the series of changes pending a due discussion.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26743 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog22
-rw-r--r--ext/openssl/lib/openssl/digest.rb1
-rw-r--r--ext/openssl/ossl_digest.c19
-rw-r--r--ext/openssl/ossl_hmac.c77
-rw-r--r--test/openssl/test_hmac.rb16
5 files changed, 56 insertions, 79 deletions
diff --git a/ChangeLog b/ChangeLog
index 545c9a9..bbc7562 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,25 +1,3 @@
-Wed Feb 24 00:52:42 2010 Akinori MUSHA <knu@iDaemons.org>
-
- * ext/openssl/lib/openssl/digest.rb (OpenSSL::Digest::hexdigest):
- No need to define hexdigest() here because the super method is
- properly defined to use digest() passing through arguments.
-
-Wed Feb 24 00:51:14 2010 Akinori MUSHA <knu@iDaemons.org>
-
- * ext/openssl/ossl_hmac.c (Init_ossl_hmac): Make OpenSSL::HMAC a
- subclass of Digest::Class so it can take advantage of all those
- utility methods such as base64digest.
-
-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/lib/openssl/digest.rb b/ext/openssl/lib/openssl/digest.rb
index 7da80f2..e603c41 100644
--- a/ext/openssl/lib/openssl/digest.rb
+++ b/ext/openssl/lib/openssl/digest.rb
@@ -43,6 +43,7 @@ module OpenSSL
singleton = (class << klass; self; end)
singleton.class_eval{
define_method(:digest){|data| Digest.digest(name, data) }
+ define_method(:hexdigest){|data| Digest.hexdigest(name, data) }
}
const_set(name, klass)
}
diff --git a/ext/openssl/ossl_digest.c b/ext/openssl/ossl_digest.c
index 3047891..9b8ced5 100644
--- a/ext/openssl/ossl_digest.c
+++ b/ext/openssl/ossl_digest.c
@@ -37,25 +37,18 @@ GetDigestPtr(VALUE obj)
{
const EVP_MD *md;
- if (TYPE(obj) == T_CLASS) {
- EVP_MD_CTX *ctx;
- VALUE digest = rb_funcall(obj, rb_intern("new"), 0, 0);
-
- SafeGetDigest(digest, ctx);
+ if (TYPE(obj) == T_STRING) {
+ const char *name = StringValueCStr(obj);
- md = EVP_MD_CTX_md(ctx);
- } else if (rb_obj_is_kind_of(obj, cDigest)) {
+ md = EVP_get_digestbyname(name);
+ if (!md)
+ ossl_raise(rb_eRuntimeError, "Unsupported digest algorithm (%s).", name);
+ } else {
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;
diff --git a/ext/openssl/ossl_hmac.c b/ext/openssl/ossl_hmac.c
index 13d8d9d..aa7644a 100644
--- a/ext/openssl/ossl_hmac.c
+++ b/ext/openssl/ossl_hmac.c
@@ -125,11 +125,11 @@ hmac_final(HMAC_CTX *ctx, unsigned char **buf, unsigned int *buf_len)
/*
* call-seq:
- * hmac.finish -> aString
+ * hmac.digest -> aString
*
*/
static VALUE
-ossl_hmac_finish(VALUE self)
+ossl_hmac_digest(VALUE self)
{
HMAC_CTX *ctx;
unsigned char *buf;
@@ -145,72 +145,89 @@ ossl_hmac_finish(VALUE self)
/*
* call-seq:
- * hmac.reset -> self
+ * hmac.hexdigest -> aString
*
*/
static VALUE
-ossl_hmac_reset(VALUE self)
+ossl_hmac_hexdigest(VALUE self)
{
HMAC_CTX *ctx;
-
+ unsigned char *buf;
+ char *hexbuf;
+ unsigned int buf_len;
+ VALUE hexdigest;
+
GetHMAC(self, ctx);
- HMAC_Init_ex(ctx, NULL, 0, NULL, NULL);
+ hmac_final(ctx, &buf, &buf_len);
+ if (string2hex(buf, buf_len, &hexbuf, NULL) != 2 * buf_len) {
+ OPENSSL_free(buf);
+ ossl_raise(eHMACError, "Memory alloc error");
+ }
+ OPENSSL_free(buf);
+ hexdigest = ossl_buf2str(hexbuf, 2 * buf_len);
- return self;
+ return hexdigest;
}
/*
* call-seq:
- * hmac.digest_length -> integer
+ * hmac.reset -> self
*
*/
static VALUE
-ossl_hmac_digest_length(VALUE self)
+ossl_hmac_reset(VALUE self)
{
HMAC_CTX *ctx;
GetHMAC(self, ctx);
+ HMAC_Init_ex(ctx, NULL, 0, NULL, NULL);
- return INT2FIX(HMAC_size(ctx));
+ return self;
}
/*
* call-seq:
- * hmac.block_length -> integer
+ * HMAC.digest(digest, key, data) -> aString
*
*/
static VALUE
-ossl_hmac_block_length(VALUE self)
+ossl_hmac_s_digest(VALUE klass, VALUE digest, VALUE key, VALUE data)
{
- HMAC_CTX *ctx;
-
- GetHMAC(self, ctx);
+ unsigned char *buf;
+ unsigned int buf_len;
+
+ StringValue(key);
+ StringValue(data);
+ buf = HMAC(GetDigestPtr(digest), RSTRING_PTR(key), RSTRING_LEN(key),
+ (unsigned char *)RSTRING_PTR(data), RSTRING_LEN(data), NULL, &buf_len);
- return INT2FIX(EVP_MD_block_size(ctx->md));
+ return rb_str_new((const char *)buf, buf_len);
}
/*
* call-seq:
- * HMAC.digest(digest_class, key, data) -> aString
- * HMAC.digest(digest_object, key, data) -> aString
- * HMAC.digest(digest_name, key, data) -> aString
+ * HMAC.digest(digest, key, data) -> aString
*
- * The last three forms are still supported for backward compatibility,
- * and HMAC.digest(data, key, digest_name) is _not_ supported for
- * that reason.
*/
static VALUE
-ossl_hmac_s_digest(VALUE klass, VALUE digest, VALUE key, VALUE data)
+ossl_hmac_s_hexdigest(VALUE klass, VALUE digest, VALUE key, VALUE data)
{
unsigned char *buf;
+ char *hexbuf;
unsigned int buf_len;
+ VALUE hexdigest;
StringValue(key);
StringValue(data);
+
buf = HMAC(GetDigestPtr(digest), RSTRING_PTR(key), RSTRING_LEN(key),
(unsigned char *)RSTRING_PTR(data), RSTRING_LEN(data), NULL, &buf_len);
+ if (string2hex(buf, buf_len, &hexbuf, NULL) != 2 * buf_len) {
+ ossl_raise(eHMACError, "Cannot convert buf to hexbuf");
+ }
+ hexdigest = ossl_buf2str(hexbuf, 2 * buf_len);
- return rb_str_new((const char *)buf, buf_len);
+ return hexdigest;
}
/*
@@ -219,18 +236,17 @@ ossl_hmac_s_digest(VALUE klass, VALUE digest, VALUE key, VALUE data)
void
Init_ossl_hmac()
{
- rb_require("digest");
-
#if 0 /* let rdoc know about mOSSL */
mOSSL = rb_define_module("OpenSSL");
#endif
eHMACError = rb_define_class_under(mOSSL, "HMACError", eOSSLError);
- cHMAC = rb_define_class_under(mOSSL, "HMAC", rb_path2class("Digest::Class"));
+ cHMAC = rb_define_class_under(mOSSL, "HMAC", rb_cObject);
rb_define_alloc_func(cHMAC, ossl_hmac_alloc);
rb_define_singleton_method(cHMAC, "digest", ossl_hmac_s_digest, 3);
+ rb_define_singleton_method(cHMAC, "hexdigest", ossl_hmac_s_hexdigest, 3);
rb_define_method(cHMAC, "initialize", ossl_hmac_initialize, 2);
rb_define_copy_func(cHMAC, ossl_hmac_copy);
@@ -238,9 +254,10 @@ Init_ossl_hmac()
rb_define_method(cHMAC, "reset", ossl_hmac_reset, 0);
rb_define_method(cHMAC, "update", ossl_hmac_update, 1);
rb_define_alias(cHMAC, "<<", "update");
- rb_define_private_method(cHMAC, "finish", ossl_hmac_finish, 0);
- rb_define_method(cHMAC, "digest_length", ossl_hmac_digest_length, 0);
- rb_define_method(cHMAC, "block_length", ossl_hmac_block_length, 0);
+ rb_define_method(cHMAC, "digest", ossl_hmac_digest, 0);
+ rb_define_method(cHMAC, "hexdigest", ossl_hmac_hexdigest, 0);
+ rb_define_alias(cHMAC, "inspect", "hexdigest");
+ rb_define_alias(cHMAC, "to_s", "hexdigest");
}
#else /* NO_HMAC */
diff --git a/test/openssl/test_hmac.rb b/test/openssl/test_hmac.rb
index 1b571e6..2f8d6bb 100644
--- a/test/openssl/test_hmac.rb
+++ b/test/openssl/test_hmac.rb
@@ -8,12 +8,11 @@ if defined?(OpenSSL)
class OpenSSL::TestHMAC < Test::Unit::TestCase
def setup
- @digest = OpenSSL::Digest::MD5
+ @digest = OpenSSL::Digest::MD5.new
@key = "KEY"
@data = "DATA"
@h1 = OpenSSL::HMAC.new(@key, @digest)
- @h2 = OpenSSL::HMAC.new(@key, @digest.new)
- @h3 = OpenSSL::HMAC.new(@key, "MD5")
+ @h2 = OpenSSL::HMAC.new(@key, @digest)
end
def teardown
@@ -21,19 +20,8 @@ class OpenSSL::TestHMAC < Test::Unit::TestCase
def test_hmac
@h1.update(@data)
- @h2.update(@data)
- @h3.update(@data)
- assert_equal(@h1.digest, @h2.digest)
- assert_equal(@h2.digest, @h3.digest)
-
assert_equal(OpenSSL::HMAC.digest(@digest, @key, @data), @h1.digest, "digest")
assert_equal(OpenSSL::HMAC.hexdigest(@digest, @key, @data), @h1.hexdigest, "hexdigest")
-
- assert_equal(OpenSSL::HMAC.digest(@digest.new, @key, @data), @h2.digest, "digest")
- assert_equal(OpenSSL::HMAC.hexdigest(@digest.new, @key, @data), @h2.hexdigest, "hexdigest")
-
- assert_equal(OpenSSL::HMAC.digest("MD5", @key, @data), @h3.digest, "digest")
- assert_equal(OpenSSL::HMAC.hexdigest("MD5", @key, @data), @h3.hexdigest, "hexdigest")
end
def test_dup