# Digest'ifying OpenSSL::Digest

**URL:** <https://www.ruby-forum.com/t/digestifying-openssl-digest/72689>\
**Category:** Development\
**Created:** [October 18, 2006, 10:40am UTC](https://www.ruby-forum.com/t/digestifying-openssl-digest/72689 "2006-10-18T10:40:46Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Akinori\_MUSHA](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/b782af/32.png) [@Akinori\_MUSHA](https://www.ruby-forum.com/u/Akinori_MUSHA)\
**Post date:** [October 18, 2006, 10:40am UTC](https://www.ruby-forum.com/t/digestifying-openssl-digest/72689/1 "2006-10-18T10:40:46Z")

</div>

(e$B\<g$Ke(B)e$B$f$\>$5$se(B

e$B!!e(BOpenSSL::Digest::\* e$B$re(B Digest::Base  
e$B$N%5%V%/%i%9$K$9$k$Y$/=$@5e(B  
e$B$7$F$_$?$N$G!"%l%S%e!\<$r$\*4j$$$7$^$9!#$J$\*e(B openssl/digest.rb  
e$B$Ne(B  
e$B=hM}$Oe(B ossl\_digest.c e$B$K\<h$j9~$_$^$7$?!#e(B

e$B!!%a%j%C%H$H$7$F$O!“6l$b$J$/e(BAPIe$B$,E}0l$5$l$k!“e(B #file()  
e$B$J$I$NDI2Ce(B  
e$B%a%=%C%I$,;H$($k!“e(B bubblebabble e$B$de(B hmac (OpenSSL  
e$B$K$b$”$k$,e(B)e$BEy$Ne(B  
e$B%”%I%$%s$N287C$r\<u$1$i$l$k!”$J$I$G$9!#e(B

e$B!!$H$3$m$G!":n6H$NCf$Ge(B

```
OpenSSL::Digest::Digest::new(name)

```

e$B$J$k%$%s%?!\<%U%'!\<%9$rH/8+$7$^$7$?!#e(BDigest  
e$B$N$@$V$j$,8+6l$7$$e(B  
e$B46$8$,$9$k$N$G!"Be$o$j$Ke(B OpenSSL::Digest(name) e$B$rDj5A$7$Fe(B

```
OpenSSL::Digest("MD5").new

```

e$B$H=q$1$k$h$&$K$7$F$\_$^$7$?$,!"$I$&$G$7$g$&$+!#e(B

e$B!!$"$H$O!"e(B size() e$B$He(B name()  
e$B$O%$%s%9%?%s%9%a%=%C%I$H$7$FB8:\_$9$Y$-e(B  
e$B$J$N$+$h$/$o$+$j$^$;$s$G$7$?$,!“8\_49@-$r9MN8$7$F;D$7$F$”$j$^$9!#e(B

e$B!!0J\>e!"$h$m$7$/$\*4j$$$7$^$9!#e(B

–  
/  
/\_\_ \_\_ [Akinori.org](http://Akinori.org) / [MUSHA.org](http://MUSHA.org)  
/ ) ) ) ) / [FreeBSD.org](http://FreeBSD.org) / [Ruby-lang.org](http://Ruby-lang.org)  
Akinori MUSHA aka / (\_ / ( (\_\_( @ [iDaemons.org](http://iDaemons.org) / and.or.jp

“Different eyes see different things,  
Different hearts beat on different strings –  
But there are times for you and me when all such things agree”

# M ext/openssl/ossl\_digest.c M ext/openssl/lib/openssl.rb R ext/openssl/lib/openssl/digest.rb M test/openssl/test\_digest.rb Index: ext/openssl/ossl\_digest.c

RCS file: /src/ruby/ext/openssl/ossl\_digest.c,v  
retrieving revision 1.7  
diff -u -r1.7 ossl\_digest.c  
— ext/openssl/ossl\_digest.c 31 Aug 2006 10:27:46 -0000 1.7  
+++ ext/openssl/ossl\_digest.c 13 Oct 2006 12:03:37 -0000  
@@ -2,6 +2,7 @@

- $Id: ossl\_digest.c,v 1.7 2006/08/31 10:27:46 matz Exp $
- ‘OpenSSL for Ruby’ project
- Copyright (C) 2001-2002 Michal R. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

- 
  - Copyright (C) 2006 Akinori MUSHA [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)
  - All rights reserved.  
_/  
/_  
@@ -10,17 +11,6 @@  
\*/  
#include “ossl.h”

-#define GetDigest(obj, ctx) do { \

- Data\_Get\_Struct(obj, EVP\_MD\_CTX, ctx); \
- if (!ctx) { \
- ossl\_raise(rb\_eRuntimeError, “Digest CTX wasn’t initialized!”); \
- }   
-} while (0)  
-#define SafeGetDigest(obj, ctx) do { \
- OSSL\_Check\_Kind(obj, cDigest); \
- GetDigest(obj, ctx);   
-} while (0)
- 

/\*

- Classes  
\*/  
@@ -28,267 +18,272 @@  
VALUE cDigest;  
VALUE eDigestError;

-static VALUE ossl\_digest\_alloc(VALUE klass);  
+static ID id\_evp\_md, id\_new;  
+  
+static const char \*digest\_names[] = {

- “DSS”,
- “DSS1”,
- “MD2”,
- “MD4”,
- “MD5”,
- “MDC2”,
- “RIPEMD160”,
- “SHA”,
- “SHA1”,  
+#if OPENSSL\_VERSION\_NUMBER \> 0x00908000
- “SHA224”,
- “SHA256”,
- “SHA384”,
- “SHA512”,  
+#endif  
+};

/\*

- 
  - Public

- 
  - Digest::Base  
\*/  
-const EVP\_MD \*  
-GetDigestPtr(VALUE obj)

- 

+static EVP\_MD \*  
+get\_digest\_base\_metadata(VALUE klass)  
{

- EVP\_MD\_CTX \*ctx;

- VALUE obj;
- EVP\_MD \*md;

- SafeGetDigest(obj, ctx);

- if (rb\_ivar\_defined(klass, id\_evp\_md) == Qfalse) {
- 

```
   return NULL;

```

- }

- return EVP\_MD\_CTX\_md(ctx); /_== ctx-\>digest_/  
-}

- obj = rb\_ivar\_get(klass, id\_evp\_md);

-VALUE  
-ossl\_digest\_new(const EVP\_MD \*md)  
-{

- VALUE ret;
- EVP\_MD\_CTX \*ctx;

- Data\_Get\_Struct(obj, EVP\_MD, md);

- ret = ossl\_digest\_alloc(cDigest);
- GetDigest(ret, ctx);
- EVP\_MD\_CTX\_init(ctx);
- EVP\_DigestInit\_ex(ctx, md, NULL);
- 
- return ret;

- return md;  
}

-/\*

- 
  - Private

- \*/  
static VALUE  
-ossl\_digest\_alloc(VALUE klass)  
+rb\_ossl\_digest\_base\_alloc(VALUE klass)  
{

- EVP\_MD \*md;  
EVP\_MD\_CTX \*ctx;  
VALUE obj;

- md = get\_digest\_base\_metadata(klass);

- 
- if (md == NULL) {

- 

```
   return Data_Wrap_Struct(klass, 0, free, 0);

```

- }

- ctx = EVP\_MD\_CTX\_create();

- if (ctx == NULL)
- ossl\_raise(rb\_eRuntimeError, “EVP\_MD\_CTX\_create() failed”);
- EVP\_MD\_CTX\_init(ctx);

- obj = Data\_Wrap\_Struct(klass, 0, EVP\_MD\_CTX\_destroy, ctx);

- 

- return obj;  
}

## -VALUE ossl\_digest\_update(VALUE, VALUE);

static VALUE  
-ossl\_digest\_initialize(int argc, VALUE \*argv, VALUE self)  
+rb\_ossl\_digest\_base\_copy(VALUE copy, VALUE obj)  
{

- EVP\_MD\_CTX \*ctx;
- const EVP\_MD \*md;
- char \*name;
- VALUE type, data;
- 
- rb\_scan\_args(argc, argv, “11”, &type, &data);
- StringValue(type);
- if (!NIL\_P(data)) StringValue(data);
- name = StringValuePtr(type);
- 
- md = EVP\_get\_digestbyname(name);
- if (!md) {
- ossl\_raise(rb\_eRuntimeError, “Unsupported digest algorithm (%s).”,  
name);

- EVP\_MD \*md;
- EVP\_MD\_CTX \*ctx1, \*ctx2;
- 
- if (copy == obj) return copy;
- rb\_check\_frozen(copy);
- md = get\_digest\_base\_metadata(rb\_obj\_class(copy));
- 
- if (md == NULL) {
- 

```
   /* initialize_copy() is undefined or something */

```

- 

```
   rb_notimplement();

```

}

- GetDigest(self, ctx);
- EVP\_DigestInit\_ex(ctx, md, NULL);
- 
- if (!NIL\_P(data)) return ossl\_digest\_update(self, data);
- return self;

- 
- /\* get\_digest\_base\_metadata() may return a NULL \*/
- if (md != get\_digest\_base\_metadata(rb\_obj\_class(obj))) {
- ossl\_raise(rb\_eTypeError, “wrong argument class”);
- }
- Data\_Get\_Struct(obj, EVP\_MD\_CTX, ctx1);
- Data\_Get\_Struct(copy, EVP\_MD\_CTX, ctx2);
- EVP\_MD\_CTX\_copy(ctx2, ctx1);
- 
- return copy;  
}

static VALUE  
-ossl\_digest\_copy(VALUE self, VALUE other)  
+rb\_ossl\_digest\_base\_update(VALUE self, VALUE str)  
{

- EVP\_MD\_CTX \*ctx1, \*ctx2;
- 
- rb\_check\_frozen(self);
- if (self == other) return self;

- EVP\_MD\_CTX \*ctx;

- GetDigest(self, ctx1);
- SafeGetDigest(other, ctx2);

- Data\_Get\_Struct(self, EVP\_MD\_CTX, ctx);

- if (!EVP\_MD\_CTX\_copy(ctx1, ctx2)) {
- ossl\_raise(eDigestError, NULL);

- if (ctx == NULL) {
- ossl\_raise(rb\_eRuntimeError, “Unsupported digest algorithm”);  
}
- 
- StringValue(str);
- EVP\_DigestUpdate(ctx, RSTRING\_PTR(str), RSTRING\_LEN(str));
- return self;  
}

static VALUE  
-ossl\_digest\_reset(VALUE self)  
+rb\_ossl\_digest\_base\_init(int argc, VALUE \*argv, VALUE self)  
{

- EVP\_MD \*md;  
EVP\_MD\_CTX \*ctx;
- VALUE arg;

- GetDigest(self, ctx);
- EVP\_DigestInit\_ex(ctx, EVP\_MD\_CTX\_md(ctx), NULL);

- md = get\_digest\_base\_metadata(rb\_obj\_class(self));

- return self;  
-}

- if (md == NULL) {
- ossl\_raise(rb\_eRuntimeError, “Unsupported digest algorithm”);
- }

-VALUE  
-ossl\_digest\_update(VALUE self, VALUE data)  
-{

- EVP\_MD\_CTX \*ctx;

- Data\_Get\_Struct(self, EVP\_MD\_CTX, ctx);

- StringValue(data);
- GetDigest(self, ctx);
- EVP\_DigestUpdate(ctx, RSTRING\_PTR(data), RSTRING\_LEN(data));

- EVP\_DigestInit\_ex(ctx, md, NULL);

- 
- rb\_scan\_args(argc, argv, “01”, &arg);

- 
- if (!NIL\_P(arg)) rb\_ossl\_digest\_base\_update(self, arg);

-static void  
-digest\_final(EVP\_MD\_CTX \*ctx, char \*\*buf, int \*buf\_len)  
+static VALUE  
+rb\_ossl\_digest\_base\_digest(VALUE self)  
{

- EVP\_MD\_CTX final;

- EVP\_MD \*md;
- EVP\_MD\_CTX \*ctx1, \*ctx2;
- size\_t ctx\_size;
- VALUE str;

- if (!EVP\_MD\_CTX\_copy(&final, ctx)) {
- ossl\_raise(eDigestError, NULL);
- }
- if (!(\*buf = OPENSSL\_malloc(EVP\_MD\_CTX\_size(&final)))) {
- EVP\_MD\_CTX\_cleanup(&final);
- ossl\_raise(eDigestError, “Cannot allocate mem for digest”);

- md = get\_digest\_base\_metadata(rb\_obj\_class(self));
- 
- if (md == NULL) {
- 

```
   /* subclasses must define update() */

```

- 

```
   rb_notimplement();

```

}

- EVP\_DigestFinal\_ex(&final, \*buf, buf\_len);
- EVP\_MD\_CTX\_cleanup(&final);  
-}

-static VALUE  
-ossl\_digest\_digest(VALUE self)  
-{

- EVP\_MD\_CTX \*ctx;
- char \*buf;
- int buf\_len;
- VALUE digest;
- 
- GetDigest(self, ctx);
- digest\_final(ctx, &buf, &buf\_len);
- digest = ossl\_buf2str(buf, buf\_len);
- 
- return digest;

- Data\_Get\_Struct(self, EVP\_MD\_CTX, ctx1);
- 
- ctx2 = EVP\_MD\_CTX\_create();
- EVP\_MD\_CTX\_copy(ctx2, ctx1);
- 
- str = rb\_str\_new(0, EVP\_MD\_CTX\_size(ctx2));
- EVP\_DigestFinal\_ex(ctx2, RSTRING\_PTR(str), NULL);
- EVP\_MD\_CTX\_destroy(ctx2);
- 
- return str;  
}

static VALUE  
-ossl\_digest\_hexdigest(VALUE self)  
+rb\_ossl\_digest\_base\_name(VALUE self)  
{

- EVP\_MD\_CTX \*ctx;
- char \*buf, \*hexbuf;
- int buf\_len;
- VALUE hexdigest;
- 
- GetDigest(self, ctx);
- digest\_final(ctx, &buf, &buf\_len);
- if (string2hex(buf, buf\_len, &hexbuf, NULL) != 2 \* buf\_len) {
- OPENSSL\_free(buf);
- ossl\_raise(eDigestError, “Memory alloc error”);

- EVP\_MD \*md;
- 
- md = get\_digest\_base\_metadata(rb\_obj\_class(self));
- 
- if (md == NULL) {
- 

```
   /* subclasses must define update() */

```

- 

```
   rb_notimplement();

```

}

- OPENSSL\_free(buf);

- hexdigest = ossl\_buf2str(hexbuf, 2 \* buf\_len);

- return hexdigest;

- return rb\_str\_new2(EVP\_MD\_name(md));  
}

static VALUE  
-ossl\_digest\_s\_digest(VALUE klass, VALUE str, VALUE data)  
+rb\_ossl\_digest\_base\_size(VALUE self)  
{

- VALUE obj = rb\_class\_new\_instance(1, &str, klass);

- EVP\_MD \*md;
- 
- md = get\_digest\_base\_metadata(rb\_obj\_class(self));

- ossl\_digest\_update(obj, data);

- if (md == NULL) {
- 

```
   /* subclasses must define update() */

```

- 

```
   rb_notimplement();

```

- }

- return ossl\_digest\_digest(obj);

- return INT2NUM(EVP\_MD\_size(md));  
}

static VALUE  
-ossl\_digest\_s\_hexdigest(VALUE klass, VALUE str, VALUE data)  
+ossl\_digest\_class\_by\_name(const char \*name)  
{

- VALUE obj = rb\_class\_new\_instance(1, &str, klass);

- VALUE klass = rb\_const\_get(mDigest, rb\_intern(name));

- ossl\_digest\_update(obj, data);

- if (klass == Qnil) {
- ossl\_raise(rb\_eRuntimeError, “Unsupported digest algorithm”);
- }

- return ossl\_digest\_hexdigest(obj);

- return klass;  
}

static VALUE  
-ossl\_digest\_equal(VALUE self, VALUE other)  
+rb\_ossl\_s\_Digest(VALUE klass, VALUE name)  
{

- EVP\_MD\_CTX \*ctx;
- VALUE str1, str2;

- StringValue(name);

- if (rb\_obj\_is\_kind\_of(other, cDigest) == Qtrue) {
- str2 = ossl\_digest\_digest(other);
- } else {
- StringValue(other);
- str2 = other;
- }
- GetDigest(self, ctx);
- if (RSTRING\_LEN(str2) == EVP\_MD\_CTX\_size(ctx)) {
- str1 = ossl\_digest\_digest(self);
- } else {
- str1 = ossl\_digest\_hexdigest(self);
- }
- if (RSTRING\_LEN(str1) == RSTRING\_LEN(str2)
- && rb\_str\_cmp(str1, str2) == 0) {
- return Qtrue;
- }
- 
- return Qfalse;

- return ossl\_digest\_class\_by\_name(RSTRING\_PTR(name));  
}

-static VALUE  
-ossl\_digest\_name(VALUE self)  
+const EVP\_MD \*  
+GetDigestPtr(VALUE obj)  
{

- EVP\_MD\_CTX \*ctx;

- EVP\_MD \*md = get\_digest\_base\_metadata(rb\_obj\_class(obj));

- GetDigest(self, ctx);

- if (md == NULL) {
- 

```
   ossl_raise(rb_eRuntimeError, "Unsupported digest algorithm");

```

- }

- return rb\_str\_new2(EVP\_MD\_name(EVP\_MD\_CTX\_md(ctx)));

- return md;  
}

-static VALUE  
-ossl\_digest\_size(VALUE self)  
+VALUE  
+ossl\_digest\_new(const EVP\_MD \*md)  
{

- EVP\_MD\_CTX \*ctx;
- 
- GetDigest(self, ctx);

- VALUE klass = ossl\_digest\_class\_by\_name(EVP\_MD\_name(md));

- return INT2NUM(EVP\_MD\_CTX\_size(ctx));

- return rb\_funcall(klass, id\_new, 0);  
}

-/\*

- 
  - INIT

- \*/  
void  
-Init\_ossl\_digest()  
+Init\_ossl\_digest(void)  
{

- int i;
- VALUE klass;
- VALUE rb\_cDigest\_Base;
- 
- id\_evp\_md = rb\_intern(“evp\_md”);
- id\_new = rb\_intern(“new”);
- 
- rb\_define\_module\_function(mOSSL, “Digest”, rb\_ossl\_s\_Digest, 1);
- mDigest = rb\_define\_module\_under(mOSSL, “Digest”);

- eDigestError = rb\_define\_class\_under(mDigest, “DigestError”,  
eOSSLError);
- 
- cDigest = rb\_define\_class\_under(mDigest, “Digest”, rb\_cObject);
- 
- rb\_define\_alloc\_func(cDigest, ossl\_digest\_alloc);
- rb\_define\_singleton\_method(cDigest, “digest”, ossl\_digest\_s\_digest,  
2);
- rb\_define\_singleton\_method(cDigest, “hexdigest”,  
ossl\_digest\_s\_hexdigest, 2);
- 
- rb\_define\_method(cDigest, “initialize”, ossl\_digest\_initialize,  
-1);
- rb\_define\_method(cDigest, “reset”, ossl\_digest\_reset, 0);
- 
- rb\_define\_copy\_func(cDigest, ossl\_digest\_copy);
- 
- rb\_define\_method(cDigest, “digest”, ossl\_digest\_digest, 0);
- rb\_define\_method(cDigest, “hexdigest”, ossl\_digest\_hexdigest, 0);
- rb\_define\_alias(cDigest, “inspect”, “hexdigest”);
- rb\_define\_alias(cDigest, “to\_s”, “hexdigest”);
- 
- rb\_define\_method(cDigest, “update”, ossl\_digest\_update, 1);
- rb\_define\_alias(cDigest, “\<\<”, “update”);
- 
- rb\_define\_method(cDigest, “==”, ossl\_digest\_equal, 1);
- 
- rb\_define\_method(cDigest, “name”, ossl\_digest\_name, 0);
- rb\_define\_method(cDigest, “size”, ossl\_digest\_size, 0);

- 
- rb\_require(“digest”);
- rb\_cDigest\_Base = rb\_path2class(“Digest::Base”);
- 
- for (i = 0; i \< sizeof(digest\_names); i++) {
- 

```
   const char *name = digest_names[i];

```

- 

```
   const EVP_MD *md = EVP_get_digestbyname(name);

```

- 
- 

```
   if (md == NULL)

```

- 

```
       continue;

```

- 
- 

```
   klass = rb_define_class_under(mDigest, name, rb_cDigest_Base);

```

- 
- 

```
   rb_ivar_set(klass, id_evp_md, Data_Wrap_Struct(rb_cObject, 0, 

```

0, (void \*)md));  
+

- 

```
   rb_define_const(klass, "DIGEST_LENGTH", 

```

INT2NUM(EVP\_MD\_size(md)));

- 

```
   rb_define_const(klass, "BLOCK_LENGTH", 

```

INT2NUM(EVP\_MD\_block\_size(md)));  
+

- 

```
   rb_define_alloc_func(klass, rb_ossl_digest_base_alloc);

```

- 
- 

```
   rb_define_method(klass, "initialize", rb_ossl_digest_base_init, 

```

-1);

- 

```
   rb_define_method(klass, "initialize_copy", 

```

rb\_ossl\_digest\_base\_copy, 1);

- 

```
   rb_define_method(klass, "update", rb_ossl_digest_base_update, 

```

1);

- 

```
   rb_define_method(klass, "digest", rb_ossl_digest_base_digest, 

```

0);  
+

- 

```
   rb_define_method(klass, "name", rb_ossl_digest_base_name, 0);

```

- 

```
   rb_define_method(klass, "size", rb_ossl_digest_base_size, 0);

```

- 

```
   rb_define_method(klass, "length", rb_ossl_digest_base_size, 0);

```

- }  
}  
Index: ext/openssl/lib/openssl.rb  
===================================================================  
RCS file: /src/ruby/ext/openssl/lib/openssl.rb,v  
retrieving revision 1.1  
diff -u -r1.1 openssl.rb  
— ext/openssl/lib/openssl.rb 23 Jul 2003 16:11:29 -0000 1.1  
+++ ext/openssl/lib/openssl.rb 13 Oct 2006 12:03:37 -0000  
@@ -18,7 +18,6 @@

require ‘openssl/bn’  
require ‘openssl/cipher’  
-require ‘openssl/digest’  
require ‘openssl/ssl’  
require ‘openssl/x509’

# Index: ext/openssl/lib/openssl/digest.rb

## RCS file: ext/openssl/lib/openssl/digest.rb diff -N ext/openssl/lib/openssl/digest.rb — ext/openssl/lib/openssl/digest.rb 8 May 2006 00:11:59 -0000 1.3 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,49 +0,0 @@ -=begin -= $RCSfile: digest.rb,v $ – Ruby-space predefined Digest subclasses

-= Info

- ‘OpenSSL for Ruby 2’ project
- Copyright (C) 2002 Michal R. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)
- All rights reserved.
- 

-= Licence

- This program is licenced under the same licence as Ruby.
- (See the file ‘LICENCE’.)
- 

-= Version

- $Id: digest.rb,v 1.3 2006/05/08 00:11:59 gotoyuzo Exp $  
-=end
- 

## -## -# Should we care what if somebody require this file directly? -#require ‘openssl’

-module OpenSSL

- module Digest
- 
- alg = %w(DSS DSS1 MD2 MD4 MD5 MDC2 RIPEMD160 SHA SHA1)
- if OPENSSL\_VERSION\_NUMBER \> 0x00908000
- 

```
 alg += %w(SHA224 SHA256 SHA384 SHA512)

```

- end
- 
- alg.each{|name|
- 

```
 klass = Class.new(Digest){

```

- 

```
   define_method(:initialize){|*data|

```

- 

```
     if data.length > 1

```

- 

```
       raise ArgumentError,

```

- 

```
         "wrong number of arguments (#{data.length} for 1)"

```

- 

```
     end

```

- 

```
     super(name, data.first)

```

- 

```
   }

```

- 

```
 }

```

- 

```
 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)

```

- }
- 
- end # Digest  
-end # OpenSSL
- 

# Index: test/openssl/test\_digest.rb

RCS file: /src/ruby/test/openssl/test\_digest.rb,v  
retrieving revision 1.3  
diff -u -r1.3 test\_digest.rb  
— test/openssl/test\_digest.rb 8 May 2006 00:12:00 -0000 1.3  
+++ test/openssl/test\_digest.rb 13 Oct 2006 12:03:38 -0000  
@@ -9,7 +9,7 @@

class OpenSSL::TestDigest \< Test::Unit::TestCase  
def setup

- @d1 = OpenSSL::Digest::Digest::new(“MD5”)

- @d1 = OpenSSL::Digest(“MD5”).new  
@d2 = OpenSSL::Digest::MD5.new  
@md = Digest::MD5.new  
@data = “DATA”

---

<div class="post-metadata">

**Author:** ![Akinori\_MUSHA](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/b782af/32.png) [@Akinori\_MUSHA](https://www.ruby-forum.com/u/Akinori_MUSHA)\
**Post date:** [October 18, 2006, 10:44am UTC](https://www.ruby-forum.com/t/digestifying-openssl-digest/72689/2 "2006-10-18T10:44:05Z")

</div>

At Fri, 13 Oct 2006 21:25:14 +0900,  
I wrote:

> e$B!!$"$H$O!"e(B size() e$B$He(B name() e$B$O%$%s%9%?%s%9%a%=%C%I$H$7$FB8:\_$9$Y$-e(B  
> e$B$J$N$+$h$/$o$+$j$^$;$s$G$7$?$,!“8\_49@-$r9MN8$7$F;D$7$F$”$j$^$9!#e(B

e$B!!%Q%i%a!\<%?$r\<h$k%“%k%4%j%:%`$N\>l9g!”%/%i%9$G$O$J$/%$%s%9%?%s%9$Ge(B  
e$B;}$?$J$$$H%@%a$G$9$M!#e(BDigest e$BA4BN$G:NMQ$7$h$&$H;W$$$^$9!#e(B

–  
/  
/\_\_ \_\_ [Akinori.org](http://Akinori.org) / [MUSHA.org](http://MUSHA.org)  
/ ) ) ) ) / [FreeBSD.org](http://FreeBSD.org) / [Ruby-lang.org](http://Ruby-lang.org)  
Akinori MUSHA aka / (\_ / ( (\_\_( @ [iDaemons.org](http://iDaemons.org) / and.or.jp

“Different eyes see different things,  
Different hearts beat on different strings –  
But there are times for you and me when all such things agree”

---

<div class="post-metadata">

**Author:** ![Akinori\_MUSHA](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/b782af/32.png) [@Akinori\_MUSHA](https://www.ruby-forum.com/u/Akinori_MUSHA)\
**Post date:** [October 18, 2006, 10:44am UTC](https://www.ruby-forum.com/t/digestifying-openssl-digest/72689/3 "2006-10-18T10:44:07Z")

</div>

In message [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid),  
`“Akinori MUSHA” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)’ wrote:

> (e$B\<g$Ke(B)e$B$f$\>$5$se(B

e$B$\*$R$5$7$V$j$G$9!#e(B

> e$B!!%a%j%C%H$H$7$F$O!“6l$b$J$/e(BAPIe$B$,E}0l$5$l$k!“e(B #file() e$B$J$I$NDI2Ce(B  
> e$B%a%=%C%I$,;H$($k!“e(B bubblebabble e$B$de(B hmac (OpenSSL e$B$K$b$”$k$,e(B)e$BEy$Ne(B  
> e$B%”%I%$%s$N287C$r\<u$1$i$l$k!”$J$I$G$9!#e(B

e$BL\E\*$K$O;?@.$7$^$9!#e(B

e$B:G6a$Ne(Bext/digeste$B$NJQ99$rDI$C$+$1$F$$$^$;$s$G$7$?$,!“FbIt$N\<Be(B  
e$BAu$K4X$o$i$J$$5!G=$G$”$l$P!"Nc$($Pe(B::Digest::Utilitiese$B$\_$?$$e(B  
e$B$J%b%8%e!\<%k$rMQ0U$7$F!"e(B

class OpenSSL::Digest::Digest  
class \<\<self  
include ::Digest::Utilities::SingletonMethods  
end  
include ::Digest::Utilities::InstanceMethods  
end

e$B$3$s$JIw$K$G$-$k$H3Z$+$J$H$b;W$$$^$7$?!#e(B

> e$B!!$H$3$m$G!":n6H$NCf$Ge(B
> 
> OpenSSL::Digest::Digest::new(name)
> 
> e$B$J$k%$%s%?!\<%U%'!\<%9$rH/8+$7$^$7$?!#e(BDigest e$B$N$@$V$j$,8+6l$7$$e(B  
> e$B46$8$,$9$k$N$G!"Be$o$j$Ke(B OpenSSL::Digest(name) e$B$rDj5A$7$Fe(B
> 
> OpenSSL::Digest(“MD5”).new
> 
> e$B$H=q$1$k$h$&$K$7$F$\_$^$7$?$,!"$I$&$G$7$g$&$+!#e(B

e$BL\>A0$,8+6l$7$$$N$O$^$C$?$/F146$G$9!#8=:\_$Ne(B  
OpenSSL::Digest::Digeste$B%/%i%9$re(BOpenSSL::Digeste$B$H$$$&L\>A0$K$7e(B  
e$B$F!"e(BOpenSSL::Digest.new(name)e$B$K$7$h$&$+$H9M$($F$O$$$^$7$?!#e(B

# 

e$B$[$+$K$be(BOpenSSL::PKey::PKeye$B$J$s$+$b$"$k$N$G!"e(B1.9e$B$G$O$^$H$ae(B

# e$B$FJQ99$9$k$3$H$r8!F$$7$^$9!#e(B

e$BL\>A0$O$5$F$\*$-!“e(B[ruby-dev:29651]e$B$N%Q%C%A$G$O%”%k%4%j%:%`Kh$Ke(B  
e$B%5%V%/%i%9$r:n@.$7!"%5%V%/%i%9Kh$K8DJL$K%a%=%C%I$rDj5A$7$F$$e(B  
e$B$k$N$,\<u$1F~$l$,$?$$$G$9!#e(B

OpenSSL::Digest::Digeste$B$Oe(BOpenSSLe$B%i%$%V%i%j$KDj5A$5$l$F$$$kG$e(B  
e$B0U$N%"%k%4%j%:%`L\>$G=i4|2=$G$-$k$h$&$K$J$C$F$$$^$9!#Nc$($P!"e(B

OpenSSL::Digest::Digest.new(“SHA256”)

e$B$G;XDj$7$F$$$kL\>A0$Oe(BEVP\_MDe$B9=B$BN$r8!:w$9$k$?$a$KMxMQ$7$F$$$ke(B  
e$B$K2a$.$^$;$s!#$=$N$\*$+$2$Ge(BOpenSSL::Digest::SHA256e$B$rDI2C$9$ke(B  
e$B0JA0$+$ie(BOpenSSL 0.9.8e$B$r;H$C$F%S%k%I$7$F$$$l$P!“$3$N%”%k%4%je(B  
e$B%:%`$r;H$&$3$H$,$G$-$F$$$^$7$?!#e(B

e$B$^$?!“e(BDSS1e$B$He(BSHA1e$B$N$h$&$K!”%“%k%4%j%:%`$OF1$8$@$1$I8x3+800E9fe(B  
e$B$N=pL\>$N%U%)!\<%^%C%HKh$K8DJL$KL\>A0$,IU$1$F$”$k$H$$$&e(BOpenSSL  
e$BFCM-$N;v\>p$b$“$C$F!”$3$l$i$,:#8e$bA}$($J$$$H$O8@$$@Z$l$J$$$Ne(B  
e$B$G!“e(BRubye$B%l%Y%k$G$OCN$i$J$$L\>A0$G$”$C$F$b=i4|2=$G$-$kM\>CO$O;De(B  
e$B$7$F$\*$-$?$$$H;W$$$^$9!#e(B

---

<div class="post-metadata">

**Author:** ![Akinori\_MUSHA](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/b782af/32.png) [@Akinori\_MUSHA](https://www.ruby-forum.com/u/Akinori_MUSHA)\
**Post date:** [October 18, 2006, 10:44am UTC](https://www.ruby-forum.com/t/digestifying-openssl-digest/72689/4 "2006-10-18T10:44:08Z")

</div>

At Sat, 14 Oct 2006 11:34:50 +0900,  
GOTOU Yuuzou wrote:

> class OpenSSL::Digest::Digest  
> class \<\<self  
> include ::Digest::Utilities::SingletonMethods  
> end  
> include ::Digest::Utilities::InstanceMethods  
> end
> 
> e$B$3$s$JIw$K$G$-$k$H3Z$+$J$H$b;W$$$^$7$?!#e(B

e$B!!3N$+$Ke(B mix-in e$B$K$7$?J}$,H~$7$$$G$9$M!#8!F$$7$^$9!#e(B

e$B!!:#$$$m$$$mG:$s$G$$$k$N$O!“%-!\<$d%O%C%7%eD9$J$I$N%Q%i%a!\<%?$re(B  
e$B\<h$k%”%k%4%j%:%`$r$I$&07$&$+$G$9!#e(B

e$B!!$?$H$($P!“$”$k%a%=%C%I$,%O%C%7%e%"%k%4%j%:%`$N;XDj$r\<u$1$k$He(B  
e$B$7$?$H$-$r9M$($^$9!#e(B

e$B!!$^$:!"e(B

```
    check_auth(cookie, "MD5")

```

e$B$HL\>\>N$rJ8;zNs$GEO$9J}K!$G$O!"%Q%i%a!\<%?$N;XDj$,:$Fq$G$9!#e(B

```
    check_auth(cookie, "HMAC;hash=MD5;key=blahblahblah")

```

e$B$He(B DBI  
e$B$\_$?$$$J46$8$K$7$?$N$G$O!";XDj$b%Q!\<%9$bLLE]$J$N$GO@30!#e(B

e$B!!$^$?!"e(B

```
    check_auth(cookie, Digest::MD5)

```

e$B$N$h$&$K%/%i%9%\*%V%8%'%/%H$rEO$9J}K!$,$“$j$^$9$,!”%Q%i%a!\<%?IU$-e(B  
e$B%“%k%4%j%:%`$N\>l9g!”%Q%i%a!\<%?e(B(e$B$NAH9g$;e(B)e$B$4$H$K8GM-$N%/%i%9$r:n$ke(B  
e$B$N$+$H$$$&$Hm4m0$7$^$9!#e(B(digest/hmac e$B$G0lEY$d$C$F$\_$^$7$?e(B)

e$B!!$+$H$$$C$F!"e(B

```
    check_auth(cookie, Digest::Tiger, 160)

```

e$B$N$h$&$K%Q%i%a!\<%?$rJB$Y$FEO$9$N$G$O!V7W;;4o!W$r$R$H$^$H$^$j$Ge(B  
e$B;XDj$G$-$F$$$J$$$N$GH~$7$/$J$$!#e(B

e$B!!7W;;4o$rEO$9!"$H$$$&0UL#$G$Oe(B

```
    check_auth(cookie, Digest::Tiger.new(160))

```

e$B$H$$$&$N$,$R$H$D$N2r7h:v$G$“$j!“8=;~E@$Ne(B digest  
e$B$O$3$N$h$&$J7A$re(B  
e$BA[Dj$7$F$$$^$9$,!”$$$/$D$+LdBj$b$”$j$^$9!#e(B

e$B!&F1;~$KJ#?t$N7W;;4o%$%s%9%?%s%9$rI,MW$H$9$k\>l9g!“e(B clone()  
e$B$7$Fe(B  
e$B$b$i$&$N$+!)e(B  
e$B!&\>uBV$N$”$k$b$N$r$d$j$H$j$9$k$N$O5$;}$A0-$$!#;HMQA0!&;HMQ8e$Ke(B  
reset() e$B$9$k@UG$$NM-L5$J$I$,5$$K$J$k!#e(B

e$B!!$D$^$j!"EO$9$Y$-$J$N$O7W;;4o$=$N$b$N$G$O$J$/$F!“7W;;4o$N@8@.e(B  
e$BJ}K!$G$”$k$H$$$&$3$H$K$J$j$^$9!#e(B

e$B!!$H$$$&$3$H$O!“@h$[$I$N%/%i%9%\*%V%8%'%/%H$rEO$9J}K!$,$$$A$P$se(B  
e$B6a$=$&$G$9!#$”$k$Y$-;Q$Oe(B

e$B!&e(BDigest e$B\<BAu%/%i%9$Oe(B new() e$B$G%Q%i%a!\<%?$r\<u$1\<h$j!“e(B  
factory  
e$B%_%V%8%'%/%H$r@8@.$9$k!#e(B  
e$B!&e(Bfactory  
e$B%_%V%8%'%/%H$O\<+?H$N@8@.;~$K;XDj$5$l$?%”%k%4%j%:%`$He(B  
e$B%Q%i%a!\<%?$K1h$C$?!V7W;;4o!W$r@8@.$9$kG=NOe(B(e$B%a%=%C%Ie(B)e$B$r;}$D!#e(B

e$B$H$$$C$?7A$G$7$g$&$+!#$G$b!“$^$8$a$K$=$&$7$F$7$^$&$H$”$s$^$je(B  
e$B;H$$$d$9$$46$8$O$7$J$$$G$9$M!#e(B

```
    tiger160 = Digest::Tiger.new(160)
    hash = tiger160.create()
    hash.update(data)
    digest = hash.digest

```

JCE e$B$Ne(B Mac e$B%/%i%9$J$I$O$3$s$J46$8$N%$%s%?!\<%U%'!\<%9$G$9$,!"e(B  
e$B2L$?$7$Fe(B Ruby e$B$K%^%C%A$9$k$N$+$I$&$+!#e(B

e$B!!%7%g!\<%H%+%C%H%a%=%C%I$r$$$m$$$m:n$l$PC;$/=q$/J}K!$rDs6!$G$-$ke(B  
e$B$G$7$g$&$,!"\>iD9$G9=B$$,$D$+$\_$K$/$$$b$N$K$J$C$F$7$^$$$=$&$G$9!#e(B

e$B!!$=$b$=$b$NOC$H$7$F$9$Y$F$N%O%C%7%e4X?t$N%$%s%?!\<%U%'!\<%9$rE}0le(B  
e$B$9$kI,MW$,$"$k$N$+$H$$$&5?Ld$O9M$($i$l$^$9!#e(BMD5 e$B$^$?$Oe(B  
HMAC-MD5e$B!“e(B  
e$B$J$I$H$$$&A\*Br$,\<B:]$”$k$N$+$I$&$+J,$+$j$^$;$s$7!#e(B

e$B!!$?$@!“8=\<B$rM=B,$9$k$N$OFq$7$$$N$G!”$b$&\>/$7M}A[$K$D$$$F9M$($Fe(B  
e$B$\_$?$$$G$9!#Ey$7$/Fq$7$$$N$J$i!#e(B

> e$BL\>A0$,8+6l$7$$$N$O$^$C$?$/F146$G$9!#8=:\_$Ne(B  
> OpenSSL::Digest::Digeste$B%/%i%9$re(BOpenSSL::Digeste$B$H$$$&L\>A0$K$7e(B  
> e$B$F!"e(BOpenSSL::Digest.new(name)e$B$K$7$h$&$+$H9M$($F$O$$$^$7$?!#e(B
> 
> # e$B$[$+$K$be(BOpenSSL::PKey::PKeye$B$J$s$+$b$"$k$N$G!"e(B1.9e$B$G$O$^$H$ae(B
> 
> # e$B$FJQ99$9$k$3$H$r8!F$$7$^$9!#e(B

e$B!!$\<$R$$$$7A$K$7$?$$$G$9$M!#e(B

> e$BL\>A0$O$5$F$\*$-!“e(B[ruby-dev:29651]e$B$N%Q%C%A$G$O%”%k%4%j%:%`Kh$Ke(B  
> e$B%5%V%/%i%9$r:n@.$7!"%5%V%/%i%9Kh$K8DJL$K%a%=%C%I$rDj5A$7$F$$e(B  
> e$B$k$N$,\<u$1F~$l$,$?$$$G$9!#e(B
> 
> OpenSSL::Digest::Digeste$B$Oe(BOpenSSLe$B%i%$%V%i%j$KDj5A$5$l$F$$$kG$e(B  
> e$B0U$N%"%k%4%j%:%`L\>$G=i4|2=$G$-$k$h$&$K$J$C$F$$$^$9!#Nc$($P!"e(B

e$B!!$J$k$[$I!#$"$/$^$GF0E\*$JL\>A0;XDj$,\<g$G!"8DJL%/%i%9$O=\>$G$9$+!#e(B  
e$BG0F,$K$\*$$$F$$$8$C$F$\_$^$9!#e(B

–  
/  
/\_\_ \_\_ [Akinori.org](http://Akinori.org) / [MUSHA.org](http://MUSHA.org)  
/ ) ) ) ) / [FreeBSD.org](http://FreeBSD.org) / [Ruby-lang.org](http://Ruby-lang.org)  
Akinori MUSHA aka / (\_ / ( (\_\_( @ [iDaemons.org](http://iDaemons.org) / and.or.jp

“Different eyes see different things,  
Different hearts beat on different strings –  
But there are times for you and me when all such things agree”

---

<div class="post-metadata">

**Author:** ![Akinori\_MUSHA](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/b782af/32.png) [@Akinori\_MUSHA](https://www.ruby-forum.com/u/Akinori_MUSHA)\
**Post date:** [November 7, 2006, 10:50am UTC](https://www.ruby-forum.com/t/digestifying-openssl-digest/72689/5 "2006-11-07T10:50:59Z")

</div>

(e$B\<g$Ke(B)e$B$f$\>$5$se(B

e$B!!e(BOpenSSL::Digest::Digest e$B%/%i%9$K!“?7@_$Ne(B Digest::Class  
e$B$r7Q\>5e(B  
e$B$5$;$F$_$^$7$?!#4pK\E\*$K%$%s%?!\<%U%'!\<%9$NHs8\_49$O$J$/!”=c?h$Ke(B  
e$B\<BAu$N6&M-$r9T$&$b$N$G$9!#e(B

e$B!!M#0l!"e(B == e$B$GJ8;zNs$rM?$($i$l$?:]$O\>o$Ke(B to\_s (hexdigest)  
e$B$NCM$He(B  
e$BHf3S$5$l!"D9$5$r8+$Fe(B digest() e$B$^$?$Oe(B hexdigest()  
e$B$NCM$HHf3S$9$ke(B  
e$B5!G=$O$J$/$J$C$F$$$^$9!#e(BDigest  
e$B%\*%V%8%'%/%H$,M?$($i$l$?\>l9g$Oe(B  
digest() e$B$N7k2LF1;N$rHf3S$7$^$9!#e(B

e$B!!$=$N$[$+$O$9$Y$F5!G=DI2C$G$9!#2~$a$F8!F$$r$\*4j$$$7$^$9!#e(B

–  
/  
/\_\_ \_\_ [Akinori.org](http://Akinori.org) / [MUSHA.org](http://MUSHA.org)  
/ ) ) ) ) / [FreeBSD.org](http://FreeBSD.org) / [Ruby-lang.org](http://Ruby-lang.org)  
Akinori MUSHA aka / (\_ / ( (\_\_( @ [iDaemons.org](http://iDaemons.org) / and.or.jp

“Different eyes see different things,  
Different hearts beat on different strings –  
But there are times for you and me when all such things agree”

# M ext/openssl/ossl\_digest.c M ext/openssl/lib/openssl/digest.rb Index: ext/openssl/ossl\_digest.c

RCS file: /src/ruby/ext/openssl/ossl\_digest.c,v  
retrieving revision 1.7  
diff -u -r1.7 ossl\_digest.c  
— ext/openssl/ossl\_digest.c 31 Aug 2006 10:27:46 -0000 1.7  
+++ ext/openssl/ossl\_digest.c 1 Nov 2006 05:02:34 -0000  
@@ -141,24 +141,8 @@  
return self;  
}

-static void  
-digest\_final(EVP\_MD\_CTX \*ctx, char \*\*buf, int \*buf\_len)  
-{

- EVP\_MD\_CTX final;
- 
- if (!EVP\_MD\_CTX\_copy(&final, ctx)) {
- ossl\_raise(eDigestError, NULL);
- }
- if (!(\*buf = OPENSSL\_malloc(EVP\_MD\_CTX\_size(&final)))) {
- EVP\_MD\_CTX\_cleanup(&final);
- ossl\_raise(eDigestError, “Cannot allocate mem for digest”);
- }
- EVP\_DigestFinal\_ex(&final, \*buf, buf\_len);
- EVP\_MD\_CTX\_cleanup(&final);  
-}
- 

static VALUE  
-ossl\_digest\_digest(VALUE self)  
+ossl\_digest\_finish(VALUE self)  
{  
EVP\_MD\_CTX \*ctx;  
char \*buf;  
@@ -166,96 +150,47 @@  
VALUE digest;

```
 GetDigest(self, ctx);

```

- digest\_final(ctx, &buf, &buf\_len);
- digest = ossl\_buf2str(buf, buf\_len);
- 
- return digest;  
-}
- 

-static VALUE  
-ossl\_digest\_hexdigest(VALUE self)  
-{

- EVP\_MD\_CTX \*ctx;

- char \*buf, \*hexbuf;

- int buf\_len;

- VALUE hexdigest;

- GetDigest(self, ctx);

- digest\_final(ctx, &buf, &buf\_len);

- if (string2hex(buf, buf\_len, &hexbuf, NULL) != 2 \* buf\_len) {

- OPENSSL\_free(buf);

- ossl\_raise(eDigestError, “Memory alloc error”);

- if (!(buf = OPENSSL\_malloc(EVP\_MD\_CTX\_size(ctx)))) {
- ossl\_raise(eDigestError, “Cannot allocate mem for digest”);  
}

- OPENSSL\_free(buf);
- hexdigest = ossl\_buf2str(hexbuf, 2 \* buf\_len);
- 
- return hexdigest;  
-}
- 

-static VALUE  
-ossl\_digest\_s\_digest(VALUE klass, VALUE str, VALUE data)  
-{

- VALUE obj = rb\_class\_new\_instance(1, &str, klass);

- 
- ossl\_digest\_update(obj, data);

- return ossl\_digest\_digest(obj);  
-}

- 

-static VALUE  
-ossl\_digest\_s\_hexdigest(VALUE klass, VALUE str, VALUE data)  
-{

- VALUE obj = rb\_class\_new\_instance(1, &str, klass);
- 
- ossl\_digest\_update(obj, data);

- EVP\_DigestFinal\_ex(ctx, buf, &buf\_len);
- EVP\_MD\_CTX\_cleanup(ctx);

- return ossl\_digest\_hexdigest(obj);

- digest = ossl\_buf2str(buf, buf\_len);
- 
- return digest;  
}

static VALUE  
-ossl\_digest\_equal(VALUE self, VALUE other)  
+ossl\_digest\_name(VALUE self)  
{  
EVP\_MD\_CTX \*ctx;

- VALUE str1, str2;

- if (rb\_obj\_is\_kind\_of(other, cDigest) == Qtrue) {

- str2 = ossl\_digest\_digest(other);

- } else {

- StringValue(other);

- str2 = other;

- }  
GetDigest(self, ctx);

- if (RSTRING\_LEN(str2) == EVP\_MD\_CTX\_size(ctx)) {

- str1 = ossl\_digest\_digest(self);

- } else {

- str1 = ossl\_digest\_hexdigest(self);

- }

- if (RSTRING\_LEN(str1) == RSTRING\_LEN(str2)

- && rb\_str\_cmp(str1, str2) == 0) {

- return Qtrue;

- }

- return Qfalse;

- return rb\_str\_new2(EVP\_MD\_name(EVP\_MD\_CTX\_md(ctx)));  
}

static VALUE  
-ossl\_digest\_name(VALUE self)  
+ossl\_digest\_size(VALUE self)  
{  
EVP\_MD\_CTX \*ctx;

```
 GetDigest(self, ctx);

```

- return rb\_str\_new2(EVP\_MD\_name(EVP\_MD\_CTX\_md(ctx)));

- return INT2NUM(EVP\_MD\_CTX\_size(ctx));  
}

static VALUE  
-ossl\_digest\_size(VALUE self)  
+ossl\_digest\_block\_length(VALUE self)  
{  
EVP\_MD\_CTX \*ctx;

```
 GetDigest(self, ctx);

```

- return INT2NUM(EVP\_MD\_CTX\_size(ctx));

- return INT2NUM(EVP\_MD\_CTX\_block\_size(ctx));  
}

/\*  
@@ -264,31 +199,24 @@  
void  
Init\_ossl\_digest()  
{

- rb\_require(“digest”);

- mDigest = rb\_define\_module\_under(mOSSL, “Digest”);

- 
- cDigest = rb\_define\_class\_under(mDigest, “Digest”, rb\_cObject);

- 
- cDigest = rb\_define\_class\_under(mDigest, “Digest”,  
rb\_path2class(“Digest::Class”));

- rb\_define\_singleton\_method(cDigest, “digest”, ossl\_digest\_s\_digest,  
2);

- rb\_define\_singleton\_method(cDigest, “hexdigest”,  
ossl\_digest\_s\_hexdigest, 2);

- rb\_define\_method(cDigest, “reset”, ossl\_digest\_reset, 0);

- rb\_define\_copy\_func(cDigest, ossl\_digest\_copy);

- 
- rb\_define\_method(cDigest, “digest”, ossl\_digest\_digest, 0);

- rb\_define\_method(cDigest, “hexdigest”, ossl\_digest\_hexdigest, 0);

- rb\_define\_alias(cDigest, “inspect”, “hexdigest”);

- rb\_define\_alias(cDigest, “to\_s”, “hexdigest”);

- 

- rb\_define\_method(cDigest, “reset”, ossl\_digest\_reset, 0);  
rb\_define\_method(cDigest, “update”, ossl\_digest\_update, 1);  
rb\_define\_alias(cDigest, “\<\<”, “update”);

- 
- rb\_define\_method(cDigest, “==”, ossl\_digest\_equal, 1);
- 

- rb\_define\_private\_method(cDigest, “finish”, ossl\_digest\_finish, 0);
- rb\_define\_method(cDigest, “digest\_length”, ossl\_digest\_size, 0);
- rb\_define\_method(cDigest, “block\_length”, ossl\_digest\_block\_length,  
0);
- rb\_define\_method(cDigest, “name”, ossl\_digest\_name, 0);

- rb\_define\_method(cDigest, “size”, ossl\_digest\_size, 0);  
}  
Index: ext/openssl/lib/openssl/digest.rb  
===================================================================  
RCS file: /src/ruby/ext/openssl/lib/openssl/digest.rb,v  
retrieving revision 1.3  
diff -u -r1.3 digest.rb  
— ext/openssl/lib/openssl/digest.rb 8 May 2006 00:11:59 -0000 1.3  
+++ ext/openssl/lib/openssl/digest.rb 1 Nov 2006 05:02:34 -0000  
@@ -36,11 +36,6 @@  
super(name, data.first)  
}  
}
- 

```
 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)

```

}

---

<div class="post-metadata">

**Author:** ![Akinori\_MUSHA](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/b782af/32.png) [@Akinori\_MUSHA](https://www.ruby-forum.com/u/Akinori_MUSHA)\
**Post date:** [October 18, 2006, 10:44am UTC](https://www.ruby-forum.com/t/digestifying-openssl-digest/72689/6 "2006-10-18T10:44:09Z")

</div>

In article [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid),  
“Akinori MUSHA” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

> e$B$N$h$&$K%/%i%9%\*%V%8%'%/%H$rEO$9J}K!$,$“$j$^$9$,!”%Q%i%a!\<%?IU$-e(B  
> e$B!!7W;;4o$rEO$9!"$H$$$&0UL#$G$Oe(B
> 
> e$B!!$D$^$j!"EO$9$Y$-$J$N$O7W;;4o$=$N$b$N$G$O$J$/$F!“7W;;4o$N@8@.e(B  
> e$BJ}K!$G$”$k$H$$$&$3$H$K$J$j$^$9!#e(B
> 
> e$B!!$H$$$&$3$H$O!“@h$[$I$N%/%i%9%\*%V%8%'%/%H$rEO$9J}K!$,$$$A$P$se(B  
> e$B6a$=$&$G$9!#$”$k$Y$-;Q$Oe(B
> 
> e$B!&e(BDigest e$B\<BAu%/%i%9$Oe(B new() e$B$G%Q%i%a!\<%?$r\<u$1\<h$j!“e(B factory  
> e$B%_%V%8%'%/%H$r@8@.$9$k!#e(B  
> e$B!&e(Bfactory e$B%_%V%8%'%/%H$O\<+?H$N@8@.;~$K;XDj$5$l$?%”%k%4%j%:%`$He(B  
> e$B%Q%i%a!\<%?$K1h$C$?!V7W;;4o!W$r@8@.$9$kG=NOe(B(e$B%a%=%C%Ie(B)e$B$r;}$D!#e(B

e$B$=$N%a%=%C%I$R$H$D$K4X$7$FB?BV$G$“$l$P$$$$$N$G$”$l$P!"$=$N%ae(B  
e$B%=%C%I$NL\>A0$re(B call e$B$K$7$F!"e(Bfactory  
e$B$N@8@.$K$O0z?t$N$J$$e(B  
lambda e$B$r;H$($P$$$$$N$G$Oe(B?

e$B%Q%i%a!\<%?$r$H$i$J$$%"%k%4%j%:%`$KBP1~$9$k%/%i%9$K$D$$$F$O%/e(B  
e$B%i%9%_%V%8%'%/%H\<+?H$,e(B call e$B$r;}$D$3$H$K$9$l$P%/%i%9%_%V%8%'e(B  
e$B%/%H\<+?H$,e(B factory e$B$H$b?6$kIq$($^$9$7!#e(B

> e$B$H$$$C$?7A$G$7$g$&$+!#$G$b!“$^$8$a$K$=$&$7$F$7$^$&$H$”$s$^$je(B  
> e$B;H$$$d$9$$46$8$O$7$J$$$G$9$M!#e(B
> 
> ```
> tiger160 = Digest::Tiger.new(160)
> hash = tiger160.create()
> hash.update(data)
> digest = hash.digest
> 
> ```
> 
> JCE e$B$Ne(B Mac e$B%/%i%9$J$I$O$3$s$J46$8$N%$%s%?!\<%U%'!\<%9$G$9$,!"e(B  
> e$B2L$?$7$Fe(B Ruby e$B$K%^%C%A$9$k$N$+$I$&$+!#e(B

class \<\< Digest::SHA256; alias call new; end  
class \<\< Digest::SHA512; alias call new; end  
…

e$B$H$7$F$\*$$$F!"e(B

p Digest::Tiger.new(160).update(data).digest  
p Digest::SHA256.new.update(data).digest

e$B$HD\>@;H$C$F$b$$$$$7!"e(B

p lambda { Digest::Tiger.new(160) }.call.update(data).digest  
p Digest::SHA256.call.update(data).digest

e$B$He(B call e$B$G8F$Y$ke(B factory  
e$B7PM3$G$d$C$F$b$$$$$H$$$&$3$H$G!"e(B

check\_auth(cookie, lambda { Digest::Tiger.new(160) })  
check\_auth(cookie, Digest::SHA256)

e$B$H$$$&$h$&$K%“%k%4%j%:%`$r\<u$1\<h$k%a%=%C%I$K$Oe(B lambda e$B$J$$$7e(B  
e$B%/%i%9$r;XDj$7!”\>l9g$K$h$C$F$Oe(B

check\_auth(cookie) { Digest::Tiger.new(160) }  
check\_auth(cookie) { Digest::SHA256.new }

e$B$H%V%m%C%/$r;H$$$?$/$J$k$+$b$7$l$J$$!"$H$+!#e(B
