summaryrefslogtreecommitdiff
path: root/ext/digest
diff options
context:
space:
mode:
Diffstat (limited to 'ext/digest')
-rw-r--r--ext/digest/md5/depend1
-rw-r--r--ext/digest/md5/extconf.rb16
-rw-r--r--ext/digest/md5/md5init.c4
-rw-r--r--ext/digest/md5/md5ossl.c28
-rw-r--r--ext/digest/md5/md5ossl.h11
5 files changed, 56 insertions, 4 deletions
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 <sys/types.h>
+
+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 <openssl/md5.h>
+
+void MD5_End(MD5_CTX *pctx, unsigned char *hexdigest);
+int MD5_Equal(MD5_CTX *pctx1, MD5_CTX *pctx2);
+
+#endif