mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* 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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26740 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
eb845bea4c
commit
55a7a836dd
2 changed files with 51 additions and 62 deletions
|
@ -1,3 +1,9 @@
|
|||
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
|
||||
|
|
|
@ -125,11 +125,11 @@ hmac_final(HMAC_CTX *ctx, unsigned char **buf, unsigned int *buf_len)
|
|||
|
||||
/*
|
||||
* call-seq:
|
||||
* hmac.digest -> aString
|
||||
* hmac.finish -> aString
|
||||
*
|
||||
*/
|
||||
static VALUE
|
||||
ossl_hmac_digest(VALUE self)
|
||||
ossl_hmac_finish(VALUE self)
|
||||
{
|
||||
HMAC_CTX *ctx;
|
||||
unsigned char *buf;
|
||||
|
@ -143,32 +143,6 @@ ossl_hmac_digest(VALUE self)
|
|||
return digest;
|
||||
}
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* hmac.hexdigest -> aString
|
||||
*
|
||||
*/
|
||||
static VALUE
|
||||
ossl_hmac_hexdigest(VALUE self)
|
||||
{
|
||||
HMAC_CTX *ctx;
|
||||
unsigned char *buf;
|
||||
char *hexbuf;
|
||||
unsigned int buf_len;
|
||||
VALUE hexdigest;
|
||||
|
||||
GetHMAC(self, ctx);
|
||||
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 hexdigest;
|
||||
}
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* hmac.reset -> self
|
||||
|
@ -187,15 +161,50 @@ ossl_hmac_reset(VALUE self)
|
|||
|
||||
/*
|
||||
* call-seq:
|
||||
* HMAC.digest(digest, key, data) -> aString
|
||||
* hmac.digest_length -> integer
|
||||
*
|
||||
*/
|
||||
static VALUE
|
||||
ossl_hmac_digest_length(VALUE self)
|
||||
{
|
||||
HMAC_CTX *ctx;
|
||||
|
||||
GetHMAC(self, ctx);
|
||||
|
||||
return INT2FIX(HMAC_size(ctx));
|
||||
}
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* hmac.block_length -> integer
|
||||
*
|
||||
*/
|
||||
static VALUE
|
||||
ossl_hmac_block_length(VALUE self)
|
||||
{
|
||||
HMAC_CTX *ctx;
|
||||
|
||||
GetHMAC(self, ctx);
|
||||
|
||||
return INT2FIX(EVP_MD_block_size(ctx->md));
|
||||
}
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* HMAC.digest(digest_class, key, data) -> aString
|
||||
* HMAC.digest(digest_object, key, data) -> aString
|
||||
* HMAC.digest(digest_name, 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)
|
||||
{
|
||||
unsigned char *buf;
|
||||
unsigned int buf_len;
|
||||
|
||||
|
||||
StringValue(key);
|
||||
StringValue(data);
|
||||
buf = HMAC(GetDigestPtr(digest), RSTRING_PTR(key), RSTRING_LEN(key),
|
||||
|
@ -204,49 +213,24 @@ ossl_hmac_s_digest(VALUE klass, VALUE digest, VALUE key, VALUE data)
|
|||
return rb_str_new((const char *)buf, buf_len);
|
||||
}
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* HMAC.digest(digest, key, data) -> aString
|
||||
*
|
||||
*/
|
||||
static VALUE
|
||||
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 hexdigest;
|
||||
}
|
||||
|
||||
/*
|
||||
* INIT
|
||||
*/
|
||||
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_cObject);
|
||||
cHMAC = rb_define_class_under(mOSSL, "HMAC", rb_path2class("Digest::Class"));
|
||||
|
||||
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);
|
||||
|
@ -254,10 +238,9 @@ 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_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");
|
||||
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);
|
||||
}
|
||||
|
||||
#else /* NO_HMAC */
|
||||
|
|
Loading…
Reference in a new issue