From 965393cbb848ddb869543a5ca8f6e7fba1d0f130 Mon Sep 17 00:00:00 2001 From: knu Date: Thu, 26 Sep 2002 16:27:23 +0000 Subject: * ext/digest/md5: Use OpenSSL's MD5 engine if available. It is much faster than what we have now (md5.[ch]). Add a knob (--with-bundled-md5) to extconf.rb which makes it use the bundled one anyway. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2893 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 +++++++ ext/digest/md5/depend | 1 + ext/digest/md5/extconf.rb | 16 ++++++++++++---- ext/digest/md5/md5init.c | 4 ++++ ext/digest/md5/md5ossl.c | 28 ++++++++++++++++++++++++++++ ext/digest/md5/md5ossl.h | 11 +++++++++++ 6 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 ext/digest/md5/md5ossl.c create mode 100644 ext/digest/md5/md5ossl.h diff --git a/ChangeLog b/ChangeLog index 746f483401..2fa6789f9b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Fri Sep 27 01:23:39 2002 Akinori MUSHA + + * ext/digest/md5: Use OpenSSL's MD5 engine if available. It is + much faster than what we have now (md5.[ch]). Add a knob + (--with-bundled-md5) to extconf.rb which makes it use the + bundled one anyway. + Thu Sep 26 22:44:21 2002 Akinori MUSHA * ext/digest/digest.c (rb_digest_base_s_digest): Fix a double diff --git a/ext/digest/md5/depend b/ext/digest/md5/depend index 30ad482101..8eaec20b4b 100644 --- a/ext/digest/md5/depend +++ b/ext/digest/md5/depend @@ -3,3 +3,4 @@ md5.o: md5.c md5.h $(srcdir)/../defs.h $(hdrdir)/ruby.h $(topdir)/config.h \ md5init.o: md5init.c $(srcdir)/../digest.h $(hdrdir)/ruby.h \ $(topdir)/config.h $(hdrdir)/defines.h $(hdrdir)/intern.h md5.h \ $(srcdir)/../defs.h +md5ossl.o: md5ossl.h diff --git a/ext/digest/md5/extconf.rb b/ext/digest/md5/extconf.rb index 93a14025d0..0db0404dbe 100644 --- a/ext/digest/md5/extconf.rb +++ b/ext/digest/md5/extconf.rb @@ -5,10 +5,18 @@ require "mkmf" $CFLAGS << " -DHAVE_CONFIG_H -I#{File.dirname(__FILE__)}/.." -$objs = [ - "md5.#{$OBJEXT}", - "md5init.#{$OBJEXT}", -] +$objs = [ "md5init.#{$OBJEXT}" ] + +dir_config("openssl") + +if !with_config("bundled-md5") && + have_library("crypto") && have_header("openssl/md5.h") + $objs << "md5ossl.#{$OBJEXT}" + + $libs << " -lcrypto" +else + $objs << "md5.#{$OBJEXT}" +end have_header("sys/cdefs.h") diff --git a/ext/digest/md5/md5init.c b/ext/digest/md5/md5init.c index 7f6a6e9794..2acca16a46 100644 --- a/ext/digest/md5/md5init.c +++ b/ext/digest/md5/md5init.c @@ -2,7 +2,11 @@ /* $Id$ */ #include "digest.h" +#if defined(HAVE_OPENSSL_MD5_H) +#include "md5ossl.h" +#else #include "md5.h" +#endif static algo_t md5 = { MD5_DIGEST_LENGTH, diff --git a/ext/digest/md5/md5ossl.c b/ext/digest/md5/md5ossl.c new file mode 100644 index 0000000000..3c9f4ba49f --- /dev/null +++ b/ext/digest/md5/md5ossl.c @@ -0,0 +1,28 @@ +/* $Id$ */ + +#include "md5ossl.h" +#include + +void +MD5_End(MD5_CTX *pctx, unsigned char *hexdigest) +{ + unsigned char digest[16]; + size_t i; + + MD5_Final(digest, pctx); + + for (i = 0; i < 16; i++) + sprintf(hexdigest + i * 2, "%02x", digest[i]); +} + +int +MD5_Equal(MD5_CTX* pctx1, MD5_CTX* pctx2) { + return pctx1->num == pctx2->num + && pctx1->A == pctx2->A + && pctx1->B == pctx2->B + && pctx1->C == pctx2->C + && pctx1->D == pctx2->D + && pctx1->Nl == pctx2->Nl + && pctx1->Nh == pctx2->Nh + && memcmp(pctx1->data, pctx2->data, sizeof(pctx1->data)) == 0; +} diff --git a/ext/digest/md5/md5ossl.h b/ext/digest/md5/md5ossl.h new file mode 100644 index 0000000000..dda7c743ed --- /dev/null +++ b/ext/digest/md5/md5ossl.h @@ -0,0 +1,11 @@ +/* $Id$ */ + +#ifndef MD5OSSL_H_INCLUDED +#define MD5OSSL_H_INCLUDED + +#include + +void MD5_End(MD5_CTX *pctx, unsigned char *hexdigest); +int MD5_Equal(MD5_CTX *pctx1, MD5_CTX *pctx2); + +#endif -- cgit v1.2.3