ソースを参照

* Added src/crypto/
* Added our own MD5 functions, now to just make:
AES
SHA1


svn: 702

OpenSSL Project (Ported by Bryan) 22 年 前
コミット
0a63b97d95
12 ファイル変更384 行追加16 行削除
  1. 7 6
      Makefile.in
  2. 1 1
      autotools/configure.ac
  3. 1 1
      autotools/includes/depend.m4
  4. 4 3
      configure
  5. 8 3
      src/Makefile.in
  6. 1 0
      src/crypt.c
  7. 3 1
      src/crypt.h
  8. 41 0
      src/crypto/Makefile.in
  9. 8 0
      src/crypto/crypto.h
  10. 280 0
      src/crypto/md5.c
  11. 29 0
      src/crypto/md5.h
  12. 1 1
      src/mod/Makefile.in

+ 7 - 6
Makefile.in

@@ -17,6 +17,7 @@ LEAFEXEC = leaf
 HUBEXEC = hub
 DISTROFILES = config.h.in doc/ misc/ scripts/ ChangeLog Makefile.in build configure pack/ src/
 EXCLUDES = pack/pack.cfg misc/ind doc/DEVEL src/Makefile src/compat/Makefile src/mod/Makefile \
+           src/crypto/Makefile src/crypto/.deps src/crypto/.cvsignore \
            src/mod/dns.mod/Makefile src/mod/*.mod/.deps/ src/mod/*.mod/.cvsignore \
            src/.deps src/compat/.deps misc/commit misc/grep autotools/ \
            config.cache config.log config.status config.h stamp.* misc/.cvsignore src/compat/.cvsignore \
@@ -80,15 +81,16 @@ cleanutils:
 clean:  cleanutils
 	+@cd src && $(MAKE) clean
 	+@cd src/compat && $(MAKE) clean
+	+@cd src/crypto && $(MAKE) clean
 	+@cd src/mod && $(MAKE) distclean
 	@rm -f $(HUBEXEC) $(LEAFEXEC) *.stamp *~ src/*~ configure.temp .mangled
 	@rm -f $(HUBEXEC).* $(LEAFEXEC).* src/settings.c src/salt.h src/help.h utctime
 
 distclean: clean
-	@rm -f Makefile src/Makefile src/compat/Makefile src/mod/Makefile
+	@rm -f Makefile src/Makefile src/compat/Makefile src/mod/Makefile src/crypto/Makefile
 	@rm -f config.cache config.log config.status config.h stamp.*
 	@rm -rf *-$(VERSION)/ autom4te.cache/ autoscan.log configure.scan src/salt.h.tmp
-	@rm -rf src/.deps/ src/compat/.deps/ src/mod/*.mod/.deps/
+	@rm -rf src/.deps/ src/compat/.deps/ src/mod/*.mod/.deps/ src/crypto/.deps
 
 
 distrib: clean
@@ -167,6 +169,9 @@ sorthelp: src/sorthelp.c
 
 utils: makesettings stringfix makehelp
 
+crypto:
+	+@cd src/crypto && ${MAKE_UTILS} crypto
+
 dostrings: stringfix
 	@misc/dostrings
 
@@ -179,7 +184,6 @@ leaf:	general
 	@./misc/maketype leaf
 	@echo ""
 	+@cd src/mod && $(MAKE_LEAF) static
-	@echo ""
 	+@cd src && $(MAKE_LEAF) $(LEAFEXEC)
 	@echo ""
 
@@ -190,7 +194,6 @@ dleaf:  general
 	@./misc/maketype leaf
 	@echo ""
 	+@cd src/mod && $(MAKE_DLEAF) static
-	@echo ""
 	+@cd src && $(MAKE_DLEAF) $(LEAFEXEC)
 	@echo ""
 
@@ -201,7 +204,6 @@ hub:	general
 	@./misc/maketype hub
 	@echo ""
 	+@cd src/mod && $(MAKE_HUB) static
-	@echo ""
 	+@cd src && $(MAKE_HUB) $(HUBEXEC)
 	@echo ""
 
@@ -212,7 +214,6 @@ dhub:   general
 	@./misc/maketype hub
 	@echo ""
 	+@cd src/mod && $(MAKE_DHUB) static
-	@echo ""
 	+@cd src && $(MAKE_DHUB) $(HUBEXEC)
 	@echo ""
 

+ 1 - 1
autotools/configure.ac

@@ -148,5 +148,5 @@ DO_PACK_CFG
 EGG_SUBST_MOD_UPDIR
 DO_DEPS
 
-AC_CONFIG_FILES([Makefile src/Makefile src/compat/Makefile src/mod/Makefile src/mod/dns.mod/Makefile])
+AC_CONFIG_FILES([Makefile src/Makefile src/compat/Makefile src/crypto/Makefile src/mod/Makefile src/mod/dns.mod/Makefile])
 AC_OUTPUT

+ 1 - 1
autotools/includes/depend.m4

@@ -15,7 +15,7 @@ AC_SUBST(CCDEPMODE)dnl
 
 AC_DEFUN([DO_DEPS],
 [
-files="src/Makefile.in src/compat/Makefile.in src/mod/channels.mod/Makefile src/mod/compress.mod/Makefile src/mod/console.mod/Makefile src/mod/ctcp.mod/Makefile src/mod/dns.mod/Makefile.in src/mod/irc.mod/Makefile src/mod/notes.mod/Makefile src/mod/server.mod/Makefile src/mod/share.mod/Makefile src/mod/transfer.mod/Makefile src/mod/update.mod/Makefile"
+files="src/Makefile.in src/compat/Makefile.in src/crypto/Makefile.in src/mod/channels.mod/Makefile src/mod/compress.mod/Makefile src/mod/console.mod/Makefile src/mod/ctcp.mod/Makefile src/mod/dns.mod/Makefile.in src/mod/irc.mod/Makefile src/mod/notes.mod/Makefile src/mod/server.mod/Makefile src/mod/share.mod/Makefile src/mod/transfer.mod/Makefile src/mod/update.mod/Makefile"
 for mf in $files; do
   # Strip MF so we end up with the name of the file.
 #  echo "MF: $mf"

+ 4 - 3
configure

@@ -1,5 +1,5 @@
 #! /bin/sh
-# From configure.ac Revision: 1.15 .
+# From configure.ac Revision: 1.16 .
 # Guess values for system-dependent variables and create Makefiles.
 # Generated by GNU Autoconf 2.59.
 #
@@ -11942,7 +11942,7 @@ case "$srcdir" in
 esac
 
 
-files="src/Makefile.in src/compat/Makefile.in src/mod/channels.mod/Makefile src/mod/compress.mod/Makefile src/mod/console.mod/Makefile src/mod/ctcp.mod/Makefile src/mod/dns.mod/Makefile.in src/mod/irc.mod/Makefile src/mod/notes.mod/Makefile src/mod/server.mod/Makefile src/mod/share.mod/Makefile src/mod/transfer.mod/Makefile src/mod/update.mod/Makefile"
+files="src/Makefile.in src/compat/Makefile.in src/crypto/Makefile.in src/mod/channels.mod/Makefile src/mod/compress.mod/Makefile src/mod/console.mod/Makefile src/mod/ctcp.mod/Makefile src/mod/dns.mod/Makefile.in src/mod/irc.mod/Makefile src/mod/notes.mod/Makefile src/mod/server.mod/Makefile src/mod/share.mod/Makefile src/mod/transfer.mod/Makefile src/mod/update.mod/Makefile"
 for mf in $files; do
   # Strip MF so we end up with the name of the file.
 #  echo "MF: $mf"
@@ -11990,7 +11990,7 @@ echo X"$mf" |
 done
 
 
-                                                  ac_config_files="$ac_config_files Makefile src/Makefile src/compat/Makefile src/mod/Makefile src/mod/dns.mod/Makefile"
+                                                            ac_config_files="$ac_config_files Makefile src/Makefile src/compat/Makefile src/crypto/Makefile src/mod/Makefile src/mod/dns.mod/Makefile"
 
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -12519,6 +12519,7 @@ do
   "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
   "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
   "src/compat/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/compat/Makefile" ;;
+  "src/crypto/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/crypto/Makefile" ;;
   "src/mod/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/mod/Makefile" ;;
   "src/mod/dns.mod/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/mod/dns.mod/Makefile" ;;
   "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;

+ 8 - 3
src/Makefile.in

@@ -86,11 +86,11 @@ stringfix: stringfix.c common.h ../config.h ../pack/pack.cfg eggdrop.h
 	@$(CC) $(CFLAGS) -I$(top_srcdir) -I$(top_srcdir)/pack $(CPPFLAGS) stringfix.c -o stringfix
 	@$(STRIP) stringfix
 
-../$(EGGEXEC): build_msg $(OBJS) compatability
+../$(EGGEXEC): build_msg $(OBJS) mycrypto compatability
 	@echo ""
 	@echo "Linking wraith... $(EGGBUILD)"
 	@echo ""
-	@$(LD) -o ../$(EGGEXEC) $(OBJS) $(MODOBJS) $(LIBS) compat/*.o
+	@$(LD) -o ../$(EGGEXEC) $(OBJS) $(MODOBJS) $(LIBS) compat/*.o crypto/*.o
 	@$(STRIP) ../$(EGGEXEC)
 	@$(OBJCOPY) ../$(EGGEXEC)
 	@echo "Successful compile: $(EGGEXEC)"
@@ -107,8 +107,13 @@ build_msg:
 
 
 compatability:
+	@echo "[*] Compiling compatability components"
 	+@cd compat && $(MAKE_GENERIC) compat
-	@echo "---------- Yeah! that's the compiling, now the linking! ----------"
+	@echo "[*] Linking"
+
+mycrypto:
+	@echo "[*] Compiling crypto"
+	+@cd crypto && $(MAKE_GENERIC) crypto
 
 eggdrop.h:
 	@echo "You do not have the eggdrop source!"

+ 1 - 0
src/crypt.c

@@ -10,6 +10,7 @@
 #include "crypt.h"
 #include "salt.h"
 #include "misc.h"
+#include "src/crypto/crypto.h"
 #include <stdarg.h>
 
 #define CRYPT_BLOCKSIZE AES_BLOCK_SIZE

+ 3 - 1
src/crypt.h

@@ -6,11 +6,13 @@
 #  include "config.h"
 #endif
 
+#include "src/crypto/crypto.h"
+
 #ifdef HAVE_OPENSSL_SSL_H
 #  include <openssl/crypto.h>
 #  include <openssl/aes.h>
 #  include <openssl/sha.h>
-#  include <openssl/md5.h>
+//#  include <openssl/md5.h>
 #endif /* HAVE_OPENSSL_SSL_H */
 
 #define SHA_HASH_LENGTH (SHA_DIGEST_LENGTH * 2)

+ 41 - 0
src/crypto/Makefile.in

@@ -0,0 +1,41 @@
+
+top_srcdir = @top_srcdir@
+srcdir = @srcdir@
+
+SHELL = @SHELL@
+CFLAGS = @CFLAGS@ -I.. -I$(top_srcdir) -I$(top_srcdir)/pack @DEFS@ $(CFLGS)
+CPPFLAGS = @CPPFLAGS@
+CC = @CC@
+LD = @CC@
+STRIP = @STRIP@
+
+VPATH = @srcdir@
+depcomp = /bin/sh $(top_srcdir)/autotools/depcomp
+
+@SET_MAKE@
+
+OBJS = md5.o
+
+doofus:
+	@echo ""
+	@echo "Let's try this from the right directory..."
+	@echo ""
+	@cd ../../.. && $(MAKE)
+
+clean:
+	@rm -f .depend *.o *~
+
+crypto: $(OBJS)
+
+include ./.deps/includes
+
+.SUFFIXES:
+.SUFFIXES: .c .o .h
+
+.c.o:
+	@echo -e "Compiling: \033[1m`basename $< .c`\033[0m"
+	@source='$<' object='$@' depfile='.deps/$*.Po' tmpdepfile='.deps/$*.TPo' depmode=$(CCDEPMODE) $(depcomp) \
+	$(CC) $(CFLAGS) -I../.. -I$(top_srcdir) -I$(top_srcdir)/src $(CPPFLAGS) -c $<
+
+
+

+ 8 - 0
src/crypto/crypto.h

@@ -0,0 +1,8 @@
+#ifndef _CRYPTO_H
+#define _CRYPTO_H
+
+#include "md5.h"
+//#include "sha.h"
+//#include "aes.h"
+
+#endif /* !_CRYPTO_H */

+ 280 - 0
src/crypto/md5.c

@@ -0,0 +1,280 @@
+/*
+ * This is an OpenSSL-compatible implementation of the RSA Data Security,
+ * Inc. MD5 Message-Digest Algorithm.
+ *
+ * Written by Solar Designer <solar@openwall.com> in 2001, and placed in
+ * the public domain.  There's absolutely no warranty.
+ *
+ * This differs from Colin Plumb's older public domain implementation in
+ * that no 32-bit integer data type is required, there's no compile-time
+ * endianness configuration, and the function prototypes match OpenSSL's.
+ * The primary goals are portability and ease of use.
+ *
+ * This implementation is meant to be fast, but not as fast as possible.
+ * Some known optimizations are not included to reduce source code size
+ * and avoid compile-time configuration.
+ *
+ */
+
+#include <string.h>
+#include <stdio.h>
+#include "md5.h"
+#include "src/compat/compat.h"
+
+/*
+ * The basic MD5 functions.
+ *
+ * F is optimized compared to its RFC 1321 definition just like in Colin
+ * Plumb's implementation.
+ */
+#define F(x, y, z)			((z) ^ ((x) & ((y) ^ (z))))
+#define G(x, y, z)			((y) ^ ((z) & ((x) ^ (y))))
+#define H(x, y, z)			((x) ^ (y) ^ (z))
+#define I(x, y, z)			((y) ^ ((x) | ~(z)))
+
+/*
+ * The MD5 transformation for all four rounds.
+ */
+#define STEP(f, a, b, c, d, x, t, s) \
+	(a) += f((b), (c), (d)) + (x) + (t); \
+	(a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \
+	(a) += (b);
+
+/*
+ * SET reads 4 input bytes in little-endian byte order and stores them
+ * in a properly aligned word in host byte order.
+ *
+ * The check for little-endian architectures which tolerate unaligned
+ * memory accesses is just an optimization.  Nothing will break if it
+ * doesn't work.
+ */
+#if defined(__i386__) || defined(__vax__)
+#define SET(n) \
+	(*(MD5_u32plus *)&ptr[(n) * 4])
+#define GET(n) \
+	SET(n)
+#else
+#define SET(n) \
+	(ctx->block[(n)] = \
+	(MD5_u32plus)ptr[(n) * 4] | \
+	((MD5_u32plus)ptr[(n) * 4 + 1] << 8) | \
+	((MD5_u32plus)ptr[(n) * 4 + 2] << 16) | \
+	((MD5_u32plus)ptr[(n) * 4 + 3] << 24))
+#define GET(n) \
+	(ctx->block[(n)])
+#endif
+
+/*
+ * This processes one or more 64-byte data blocks, but does NOT update
+ * the bit counters.  There're no alignment requirements.
+ */
+static const void *body(MD5_CTX *ctx, const void *data, unsigned long size)
+{
+	const unsigned char *ptr;
+	MD5_u32plus a, b, c, d;
+	MD5_u32plus saved_a, saved_b, saved_c, saved_d;
+
+	ptr = data;
+
+	a = ctx->a;
+	b = ctx->b;
+	c = ctx->c;
+	d = ctx->d;
+
+	do {
+		saved_a = a;
+		saved_b = b;
+		saved_c = c;
+		saved_d = d;
+
+/* Round 1 */
+		STEP(F, a, b, c, d, SET(0), 0xd76aa478, 7)
+		STEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12)
+		STEP(F, c, d, a, b, SET(2), 0x242070db, 17)
+		STEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22)
+		STEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7)
+		STEP(F, d, a, b, c, SET(5), 0x4787c62a, 12)
+		STEP(F, c, d, a, b, SET(6), 0xa8304613, 17)
+		STEP(F, b, c, d, a, SET(7), 0xfd469501, 22)
+		STEP(F, a, b, c, d, SET(8), 0x698098d8, 7)
+		STEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12)
+		STEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17)
+		STEP(F, b, c, d, a, SET(11), 0x895cd7be, 22)
+		STEP(F, a, b, c, d, SET(12), 0x6b901122, 7)
+		STEP(F, d, a, b, c, SET(13), 0xfd987193, 12)
+		STEP(F, c, d, a, b, SET(14), 0xa679438e, 17)
+		STEP(F, b, c, d, a, SET(15), 0x49b40821, 22)
+
+/* Round 2 */
+		STEP(G, a, b, c, d, GET(1), 0xf61e2562, 5)
+		STEP(G, d, a, b, c, GET(6), 0xc040b340, 9)
+		STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14)
+		STEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20)
+		STEP(G, a, b, c, d, GET(5), 0xd62f105d, 5)
+		STEP(G, d, a, b, c, GET(10), 0x02441453, 9)
+		STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14)
+		STEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20)
+		STEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5)
+		STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9)
+		STEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14)
+		STEP(G, b, c, d, a, GET(8), 0x455a14ed, 20)
+		STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5)
+		STEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9)
+		STEP(G, c, d, a, b, GET(7), 0x676f02d9, 14)
+		STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20)
+
+/* Round 3 */
+		STEP(H, a, b, c, d, GET(5), 0xfffa3942, 4)
+		STEP(H, d, a, b, c, GET(8), 0x8771f681, 11)
+		STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16)
+		STEP(H, b, c, d, a, GET(14), 0xfde5380c, 23)
+		STEP(H, a, b, c, d, GET(1), 0xa4beea44, 4)
+		STEP(H, d, a, b, c, GET(4), 0x4bdecfa9, 11)
+		STEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16)
+		STEP(H, b, c, d, a, GET(10), 0xbebfbc70, 23)
+		STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4)
+		STEP(H, d, a, b, c, GET(0), 0xeaa127fa, 11)
+		STEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16)
+		STEP(H, b, c, d, a, GET(6), 0x04881d05, 23)
+		STEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4)
+		STEP(H, d, a, b, c, GET(12), 0xe6db99e5, 11)
+		STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16)
+		STEP(H, b, c, d, a, GET(2), 0xc4ac5665, 23)
+
+/* Round 4 */
+		STEP(I, a, b, c, d, GET(0), 0xf4292244, 6)
+		STEP(I, d, a, b, c, GET(7), 0x432aff97, 10)
+		STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15)
+		STEP(I, b, c, d, a, GET(5), 0xfc93a039, 21)
+		STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6)
+		STEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10)
+		STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15)
+		STEP(I, b, c, d, a, GET(1), 0x85845dd1, 21)
+		STEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6)
+		STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10)
+		STEP(I, c, d, a, b, GET(6), 0xa3014314, 15)
+		STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21)
+		STEP(I, a, b, c, d, GET(4), 0xf7537e82, 6)
+		STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10)
+		STEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15)
+		STEP(I, b, c, d, a, GET(9), 0xeb86d391, 21)
+
+		a += saved_a;
+		b += saved_b;
+		c += saved_c;
+		d += saved_d;
+
+		ptr += 64;
+	} while (size -= 64);
+
+	ctx->a = a;
+	ctx->b = b;
+	ctx->c = c;
+	ctx->d = d;
+
+	return ptr;
+}
+
+void MD5_Init(MD5_CTX *ctx)
+{
+	ctx->a = 0x67452301;
+	ctx->b = 0xefcdab89;
+	ctx->c = 0x98badcfe;
+	ctx->d = 0x10325476;
+
+	ctx->lo = 0;
+	ctx->hi = 0;
+}
+
+void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size)
+{
+	MD5_u32plus saved_lo;
+	unsigned long used, free;
+
+	saved_lo = ctx->lo;
+	if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo) ctx->hi++;
+	ctx->hi += size >> 29;
+
+	used = saved_lo & 0x3f;
+
+	if (used) {
+		free = 64 - used;
+
+		if (size < free) {
+			egg_memcpy(&ctx->buffer[used], data, size);
+			return;
+		}
+
+		egg_memcpy(&ctx->buffer[used], data, free);
+		(unsigned char *)data += free;
+		size -= free;
+		body(ctx, ctx->buffer, 64);
+	}
+
+	if (size >= 64) {
+		data = body(ctx, data, size & ~(unsigned long)0x3f);
+		size &= 0x3f;
+	}
+
+	egg_memcpy(ctx->buffer, data, size);
+}
+
+void MD5_Final(unsigned char *result, MD5_CTX *ctx)
+{
+	unsigned long used, free;
+
+	used = ctx->lo & 0x3f;
+
+	ctx->buffer[used++] = 0x80;
+
+	free = 64 - used;
+
+	if (free < 8) {
+		egg_memset(&ctx->buffer[used], 0, free);
+		body(ctx, ctx->buffer, 64);
+		used = 0;
+		free = 64;
+	}
+
+	egg_memset(&ctx->buffer[used], 0, free - 8);
+
+	ctx->lo <<= 3;
+	ctx->buffer[56] = ctx->lo;
+	ctx->buffer[57] = ctx->lo >> 8;
+	ctx->buffer[58] = ctx->lo >> 16;
+	ctx->buffer[59] = ctx->lo >> 24;
+	ctx->buffer[60] = ctx->hi;
+	ctx->buffer[61] = ctx->hi >> 8;
+	ctx->buffer[62] = ctx->hi >> 16;
+	ctx->buffer[63] = ctx->hi >> 24;
+
+	body(ctx, ctx->buffer, 64);
+
+	result[0] = ctx->a;
+	result[1] = ctx->a >> 8;
+	result[2] = ctx->a >> 16;
+	result[3] = ctx->a >> 24;
+	result[4] = ctx->b;
+	result[5] = ctx->b >> 8;
+	result[6] = ctx->b >> 16;
+	result[7] = ctx->b >> 24;
+	result[8] = ctx->c;
+	result[9] = ctx->c >> 8;
+	result[10] = ctx->c >> 16;
+	result[11] = ctx->c >> 24;
+	result[12] = ctx->d;
+	result[13] = ctx->d >> 8;
+	result[14] = ctx->d >> 16;
+	result[15] = ctx->d >> 24;
+
+	egg_memset(ctx, 0, sizeof(ctx));
+}
+
+/* Convenience function to encode the hash as a 32-char hex string.
+ * 'hash' is the 16 byte hash, 'hex' is a 33 byte output buffer. */
+void MD5_Hex(unsigned char *hash, char *hex)
+{
+	int i;
+
+	for (i = 0; i < 16; i++) sprintf(hex + (i*2), "%.2x", (int) hash[i]);
+}

+ 29 - 0
src/crypto/md5.h

@@ -0,0 +1,29 @@
+/*
+ * This is an OpenSSL-compatible implementation of the RSA Data Security,
+ * Inc. MD5 Message-Digest Algorithm.
+ *
+ * Written by Solar Designer <solar@openwall.com> in 2001, and placed in
+ * the public domain.  See md5.c for more information.
+ */
+
+#ifndef _MD5_H
+#define _MD5_H
+
+#define MD5_DIGEST_LENGTH      16
+
+/* Any 32-bit or wider integer data type will do */
+typedef unsigned long MD5_u32plus;
+
+typedef struct {
+	MD5_u32plus lo, hi;
+	MD5_u32plus a, b, c, d;
+	unsigned char buffer[64];
+	MD5_u32plus block[16];
+} MD5_CTX;
+
+void MD5_Init(MD5_CTX *ctx);
+void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size);
+void MD5_Final(unsigned char *result, MD5_CTX *ctx);
+void MD5_Hex(unsigned char *hash, char *hex);
+
+#endif /* !_MD5_H */

+ 1 - 1
src/mod/Makefile.in

@@ -60,7 +60,7 @@ doofus:
 static: build_msg $(mod_objs)
 
 build_msg:
-	@echo "[*] Building modules"
+	@echo "[*] Compiling modules"
 
 .SUFFIXES:
 .SUFFIXES: .mod .mod_o