diff options
-rw-r--r-- | ChangeLog.txt | 7 | ||||
-rw-r--r-- | Makefile.am | 93 | ||||
-rw-r--r-- | configure.ac | 1 | ||||
-rw-r--r-- | md5/Makefile.am | 6 | ||||
-rw-r--r-- | md5/md5.c | 334 | ||||
-rw-r--r-- | md5/md5.h | 51 | ||||
-rw-r--r-- | md5/md5cmp.c | 59 | ||||
-rw-r--r-- | md5/md5hl.c | 99 | ||||
-rw-r--r-- | md5cmp | 12 |
9 files changed, 609 insertions, 53 deletions
diff --git a/ChangeLog.txt b/ChangeLog.txt index 7eee85d1..83f7b129 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -1,3 +1,10 @@ +1.3.0 +===== + +[1] 'make test' now works properly on FreeBSD, and it no longer requires the +md5sum executable to be present on other Un*x platforms. + + 1.2.90 (1.3 beta1) ================== diff --git a/Makefile.am b/Makefile.am index eefccba1..f9d8942e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -152,7 +152,7 @@ exampledir = $(datadir)/doc dist_example_DATA = example.c -EXTRA_DIST = win release $(DOCS) testimages md5cmp CMakeLists.txt \ +EXTRA_DIST = win release $(DOCS) testimages CMakeLists.txt \ sharedlib/CMakeLists.txt cmakescripts libjpeg.map.in doc doxygen.config \ jccolext.c jdcolext.c jdmrgext.c @@ -160,6 +160,8 @@ dist-hook: rm -rf `find $(distdir) -name .svn` +SUBDIRS += md5 + MD5_JPEG_INT = 9a68f56bc76e466aa7e52f415d0f4a5f MD5_JPEG_FAST = 0e1502e7fa421835e376a314fac2a39f MD5_JPEG_FAST_100 = 7bf72a8e741d64eecb960c97323af77c @@ -205,72 +207,81 @@ endif ./tjunittest -yuv endif ./cjpeg -dct int -outfile testoutint.jpg $(srcdir)/testimages/testorig.ppm - sh $(srcdir)/md5cmp $(MD5_JPEG_INT) testoutint.jpg + md5/md5cmp $(MD5_JPEG_INT) testoutint.jpg ./cjpeg -dct fast -opt -outfile testoutfst.jpg $(srcdir)/testimages/testorig.ppm - sh $(srcdir)/md5cmp $(MD5_JPEG_FAST) testoutfst.jpg + md5/md5cmp $(MD5_JPEG_FAST) testoutfst.jpg ./cjpeg -dct fast -quality 100 -opt -outfile testoutfst100.jpg $(srcdir)/testimages/testorig.ppm - sh $(srcdir)/md5cmp $(MD5_JPEG_FAST_100) testoutfst100.jpg + md5/md5cmp $(MD5_JPEG_FAST_100) testoutfst100.jpg ./cjpeg -dct float -outfile testoutflt.jpg $(srcdir)/testimages/testorig.ppm if WITH_SSE_FLOAT_DCT - sh $(srcdir)/md5cmp $(MD5_JPEG_FLOAT) testoutflt.jpg + md5/md5cmp $(MD5_JPEG_FLOAT) testoutflt.jpg else - sh $(srcdir)/md5cmp $(MD5_JPEG_FLOAT_NOSIMD) testoutflt.jpg + md5/md5cmp $(MD5_JPEG_FLOAT_NOSIMD) testoutflt.jpg endif ./cjpeg -dct int -grayscale -outfile testoutgray.jpg $(srcdir)/testimages/testorig.ppm - sh $(srcdir)/md5cmp $(MD5_JPEG_INT_GRAY) testoutgray.jpg + md5/md5cmp $(MD5_JPEG_INT_GRAY) testoutgray.jpg ./djpeg -dct int -fast -ppm -outfile testoutint.ppm $(srcdir)/testimages/testorig.jpg - sh $(srcdir)/md5cmp $(MD5_PPM_INT) testoutint.ppm + md5/md5cmp $(MD5_PPM_INT) testoutint.ppm ./djpeg -dct fast -ppm -outfile testoutfst.ppm $(srcdir)/testimages/testorig.jpg - sh $(srcdir)/md5cmp $(MD5_PPM_FAST) testoutfst.ppm + md5/md5cmp $(MD5_PPM_FAST) testoutfst.ppm ./djpeg -dct float -ppm -outfile testoutflt.ppm $(srcdir)/testimages/testorig.jpg if WITH_SSE_FLOAT_DCT - sh $(srcdir)/md5cmp $(MD5_PPM_FLOAT) testoutflt.ppm + md5/md5cmp $(MD5_PPM_FLOAT) testoutflt.ppm else - sh $(srcdir)/md5cmp $(MD5_PPM_FLOAT_NOSIMD) testoutflt.ppm + md5/md5cmp $(MD5_PPM_FLOAT_NOSIMD) testoutflt.ppm endif - MD5[21]=$(MD5_PPM_INT_2_1); \ - MD5[158]=$(MD5_PPM_INT_15_8); \ - MD5[74]=$(MD5_PPM_INT_7_4); \ - MD5[138]=$(MD5_PPM_INT_13_8); \ - MD5[32]=$(MD5_PPM_INT_3_2); \ - MD5[118]=$(MD5_PPM_INT_11_8); \ - MD5[54]=$(MD5_PPM_INT_5_4); \ - MD5[98]=$(MD5_PPM_INT_9_8); \ - MD5[78]=$(MD5_PPM_INT_7_8); \ - MD5[34]=$(MD5_PPM_INT_3_4); \ - MD5[58]=$(MD5_PPM_INT_5_8); \ - MD5[12]=$(MD5_PPM_INT_1_2); \ - MD5[38]=$(MD5_PPM_INT_3_8); \ - MD5[14]=$(MD5_PPM_INT_1_4); \ - MD5[18]=$(MD5_PPM_INT_1_8); \ - for scale in 2_1 15_8 7_4 13_8 3_2 11_8 5_4 9_8 7_8 3_4 5_8 1_2 3_8 1_4 1_8; do \ - scalearg=`echo $$scale | sed s@_@/@g`; \ - arrayindex=`echo $$scale | sed s@_@@g`; \ - ./djpeg -dct int -nosmooth -scale $$scalearg -ppm -outfile testoutint$$scale.ppm $(srcdir)/testimages/testorig.jpg; \ - sh $(srcdir)/md5cmp $${MD5[$$arrayindex]} testoutint$$scale.ppm; \ - done + ./djpeg -dct int -nosmooth -scale 2/1 -ppm -outfile testoutint2_1.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_2_1) testoutint2_1.ppm; + ./djpeg -dct int -nosmooth -scale 15/8 -ppm -outfile testoutint15_8.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_15_8) testoutint15_8.ppm; + ./djpeg -dct int -nosmooth -scale 7/4 -ppm -outfile testoutint7_4.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_7_4) testoutint7_4.ppm; + ./djpeg -dct int -nosmooth -scale 13/8 -ppm -outfile testoutint13_8.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_13_8) testoutint13_8.ppm; + ./djpeg -dct int -nosmooth -scale 3/2 -ppm -outfile testoutint3_2.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_3_2) testoutint3_2.ppm; + ./djpeg -dct int -nosmooth -scale 11/8 -ppm -outfile testoutint11_8.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_11_8) testoutint11_8.ppm; + ./djpeg -dct int -nosmooth -scale 5/4 -ppm -outfile testoutint5_4.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_5_4) testoutint5_4.ppm; + ./djpeg -dct int -nosmooth -scale 9/8 -ppm -outfile testoutint9_8.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_9_8) testoutint9_8.ppm; + ./djpeg -dct int -nosmooth -scale 7/8 -ppm -outfile testoutint7_8.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_7_8) testoutint7_8.ppm; + ./djpeg -dct int -nosmooth -scale 3/4 -ppm -outfile testoutint3_4.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_3_4) testoutint3_4.ppm; + ./djpeg -dct int -nosmooth -scale 5/8 -ppm -outfile testoutint5_8.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_5_8) testoutint5_8.ppm; + ./djpeg -dct int -nosmooth -scale 1/2 -ppm -outfile testoutint1_2.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_1_2) testoutint1_2.ppm; + ./djpeg -dct int -nosmooth -scale 3/8 -ppm -outfile testoutint3_8.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_3_8) testoutint3_8.ppm; + ./djpeg -dct int -nosmooth -scale 1/4 -ppm -outfile testoutint1_4.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_1_4) testoutint1_4.ppm; + ./djpeg -dct int -nosmooth -scale 1/8 -ppm -outfile testoutint1_8.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_1_8) testoutint1_8.ppm; ./djpeg -dct fast -scale 1/2 -ppm -outfile testoutfst1_2.ppm $(srcdir)/testimages/testorig.jpg - sh $(srcdir)/md5cmp $(MD5_PPM_FAST_1_2) testoutfst1_2.ppm + md5/md5cmp $(MD5_PPM_FAST_1_2) testoutfst1_2.ppm ./djpeg -dct int -bmp -colors 256 -outfile testout.bmp $(srcdir)/testimages/testorig.jpg - sh $(srcdir)/md5cmp $(MD5_BMP_256) testout.bmp + md5/md5cmp $(MD5_BMP_256) testout.bmp if WITH_ARITH_ENC ./cjpeg -dct int -arithmetic -outfile testoutari.jpg $(srcdir)/testimages/testorig.ppm - sh $(srcdir)/md5cmp $(MD5_JPEG_ARI) testoutari.jpg + md5/md5cmp $(MD5_JPEG_ARI) testoutari.jpg ./jpegtran -arithmetic -outfile testouta.jpg $(srcdir)/testimages/testimgint.jpg - sh $(srcdir)/md5cmp $(MD5_JPEG_ARI) testouta.jpg + md5/md5cmp $(MD5_JPEG_ARI) testouta.jpg endif if WITH_ARITH_DEC ./djpeg -dct int -fast -ppm -outfile testoutari.ppm $(srcdir)/testimages/testimgari.jpg - sh $(srcdir)/md5cmp $(MD5_PPM_ARI) testoutari.ppm + md5/md5cmp $(MD5_PPM_ARI) testoutari.ppm ./jpegtran -outfile testouta.jpg $(srcdir)/testimages/testimgari.jpg - sh $(srcdir)/md5cmp $(MD5_JPEG_INT) testouta.jpg + md5/md5cmp $(MD5_JPEG_INT) testouta.jpg endif ./cjpeg -dct int -progressive -outfile testoutp.jpg $(srcdir)/testimages/testorig.ppm - sh $(srcdir)/md5cmp $(MD5_JPEG_PROG) testoutp.jpg + md5/md5cmp $(MD5_JPEG_PROG) testoutp.jpg ./jpegtran -outfile testoutt.jpg testoutp.jpg - sh $(srcdir)/md5cmp $(MD5_JPEG_INT) testoutt.jpg + md5/md5cmp $(MD5_JPEG_INT) testoutt.jpg ./jpegtran -crop 120x90+20+50 -transpose -perfect -outfile testoutcrop.jpg $(srcdir)/testimages/testorig.jpg - sh $(srcdir)/md5cmp $(MD5_JPEG_CROP) testoutcrop.jpg + md5/md5cmp $(MD5_JPEG_CROP) testoutcrop.jpg testclean: diff --git a/configure.ac b/configure.ac index 8e75dcec..3d46115d 100644 --- a/configure.ac +++ b/configure.ac @@ -421,4 +421,5 @@ fi AC_CONFIG_FILES([libjpeg.map]) AC_CONFIG_FILES([Makefile simd/Makefile]) AC_CONFIG_FILES([java/Makefile]) +AC_CONFIG_FILES([md5/Makefile]) AC_OUTPUT diff --git a/md5/Makefile.am b/md5/Makefile.am new file mode 100644 index 00000000..8349c817 --- /dev/null +++ b/md5/Makefile.am @@ -0,0 +1,6 @@ +noinst_PROGRAMS = md5cmp + +md5cmp_SOURCES = md5cmp.c md5.c md5hl.c md5.h +md5cmp_CFLAGS = -I$(srcdir) + +EXTRA_DIST = md5cmp diff --git a/md5/md5.c b/md5/md5.c new file mode 100644 index 00000000..34e16584 --- /dev/null +++ b/md5/md5.c @@ -0,0 +1,334 @@ +/* + * MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm + * + * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All + * rights reserved. + * + * License to copy and use this software is granted provided that it + * is identified as the "RSA Data Security, Inc. MD5 Message-Digest + * Algorithm" in all material mentioning or referencing this software + * or this function. + * + * License is also granted to make and use derivative works provided + * that such works are identified as "derived from the RSA Data + * Security, Inc. MD5 Message-Digest Algorithm" in all material + * mentioning or referencing the derived work. + * + * RSA Data Security, Inc. makes no representations concerning either + * the merchantability of this software or the suitability of this + * software for any particular purpose. It is provided "as is" + * without express or implied warranty of any kind. + * + * These notices must be retained in any copies of any part of this + * documentation and/or software. + * + * This code is the same as the code published by RSA Inc. It has been + * edited for clarity and style only. + */ + +#include <sys/cdefs.h> + +#include <sys/types.h> + +#ifdef _KERNEL +#include <sys/systm.h> +#else +#include <string.h> +#endif + +#include "./md5.h" + +static void MD5Transform(u_int32_t [4], const unsigned char [64]); + +#ifdef _KERNEL +#define memset(x,y,z) bzero(x,z); +#define memcpy(x,y,z) bcopy(y, x, z) +#endif + +#if (BYTE_ORDER == LITTLE_ENDIAN) +#define Encode memcpy +#define Decode memcpy +#else + +/* + * Encodes input (u_int32_t) into output (unsigned char). Assumes len is + * a multiple of 4. + */ + +static void +Encode (unsigned char *output, u_int32_t *input, unsigned int len) +{ + unsigned int i; + u_int32_t *op = (u_int32_t *)output; + + for (i = 0; i < len / 4; i++) + op[i] = htole32(input[i]); +} + +/* + * Decodes input (unsigned char) into output (u_int32_t). Assumes len is + * a multiple of 4. + */ + +static void +Decode (u_int32_t *output, const unsigned char *input, unsigned int len) +{ + unsigned int i; + const u_int32_t *ip = (const u_int32_t *)input; + + for (i = 0; i < len / 4; i++) + output[i] = le32toh(ip[i]); +} +#endif + +static unsigned char PADDING[64] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* F, G, H and I are basic MD5 functions. */ +#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define I(x, y, z) ((y) ^ ((x) | (~z))) + +/* ROTATE_LEFT rotates x left n bits. */ +#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) + +/* + * FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. + * Rotation is separate from addition to prevent recomputation. + */ +#define FF(a, b, c, d, x, s, ac) { \ + (a) += F ((b), (c), (d)) + (x) + (u_int32_t)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define GG(a, b, c, d, x, s, ac) { \ + (a) += G ((b), (c), (d)) + (x) + (u_int32_t)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define HH(a, b, c, d, x, s, ac) { \ + (a) += H ((b), (c), (d)) + (x) + (u_int32_t)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define II(a, b, c, d, x, s, ac) { \ + (a) += I ((b), (c), (d)) + (x) + (u_int32_t)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } + +/* MD5 initialization. Begins an MD5 operation, writing a new context. */ + +void +MD5Init (context) + MD5_CTX *context; +{ + + context->count[0] = context->count[1] = 0; + + /* Load magic initialization constants. */ + context->state[0] = 0x67452301; + context->state[1] = 0xefcdab89; + context->state[2] = 0x98badcfe; + context->state[3] = 0x10325476; +} + +/* + * MD5 block update operation. Continues an MD5 message-digest + * operation, processing another message block, and updating the + * context. + */ + +void +MD5Update (context, in, inputLen) + MD5_CTX *context; + const void *in; + unsigned int inputLen; +{ + unsigned int i, idx, partLen; + const unsigned char *input = in; + + /* Compute number of bytes mod 64 */ + idx = (unsigned int)((context->count[0] >> 3) & 0x3F); + + /* Update number of bits */ + if ((context->count[0] += ((u_int32_t)inputLen << 3)) + < ((u_int32_t)inputLen << 3)) + context->count[1]++; + context->count[1] += ((u_int32_t)inputLen >> 29); + + partLen = 64 - idx; + + /* Transform as many times as possible. */ + if (inputLen >= partLen) { + memcpy((void *)&context->buffer[idx], (const void *)input, + partLen); + MD5Transform (context->state, context->buffer); + + for (i = partLen; i + 63 < inputLen; i += 64) + MD5Transform (context->state, &input[i]); + + idx = 0; + } + else + i = 0; + + /* Buffer remaining input */ + memcpy ((void *)&context->buffer[idx], (const void *)&input[i], + inputLen-i); +} + +/* + * MD5 padding. Adds padding followed by original length. + */ + +void +MD5Pad (context) + MD5_CTX *context; +{ + unsigned char bits[8]; + unsigned int idx, padLen; + + /* Save number of bits */ + Encode (bits, context->count, 8); + + /* Pad out to 56 mod 64. */ + idx = (unsigned int)((context->count[0] >> 3) & 0x3f); + padLen = (idx < 56) ? (56 - idx) : (120 - idx); + MD5Update (context, PADDING, padLen); + + /* Append length (before padding) */ + MD5Update (context, bits, 8); +} + +/* + * MD5 finalization. Ends an MD5 message-digest operation, writing the + * the message digest and zeroizing the context. + */ + +void +MD5Final (digest, context) + unsigned char digest[16]; + MD5_CTX *context; +{ + /* Do padding. */ + MD5Pad (context); + + /* Store state in digest */ + Encode (digest, context->state, 16); + + /* Zeroize sensitive information. */ + memset ((void *)context, 0, sizeof (*context)); +} + +/* MD5 basic transformation. Transforms state based on block. */ + +static void +MD5Transform (state, block) + u_int32_t state[4]; + const unsigned char block[64]; +{ + u_int32_t a = state[0], b = state[1], c = state[2], d = state[3], x[16]; + + Decode (x, block, 64); + + /* Round 1 */ +#define S11 7 +#define S12 12 +#define S13 17 +#define S14 22 + FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ + FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ + FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ + FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ + FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ + FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ + FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ + FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ + FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ + FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ + FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ + FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ + FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ + FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ + FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ + FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ + + /* Round 2 */ +#define S21 5 +#define S22 9 +#define S23 14 +#define S24 20 + GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ + GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ + GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ + GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ + GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ + GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ + GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ + GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ + GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ + GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ + GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ + GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ + GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ + GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ + GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ + GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ + + /* Round 3 */ +#define S31 4 +#define S32 11 +#define S33 16 +#define S34 23 + HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ + HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ + HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ + HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ + HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ + HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ + HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ + HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ + HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ + HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ + HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ + HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ + HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ + HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ + HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ + HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ + + /* Round 4 */ +#define S41 6 +#define S42 10 +#define S43 15 +#define S44 21 + II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ + II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ + II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ + II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ + II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ + II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ + II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ + II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ + II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ + II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ + II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ + II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ + II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ + II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ + II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ + II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + + /* Zeroize sensitive information. */ + memset ((void *)x, 0, sizeof (x)); +} diff --git a/md5/md5.h b/md5/md5.h new file mode 100644 index 00000000..e7c294ac --- /dev/null +++ b/md5/md5.h @@ -0,0 +1,51 @@ +/* MD5.H - header file for MD5C.C + * $FreeBSD$ + */ + +/*- + Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All +rights reserved. + +License to copy and use this software is granted provided that it +is identified as the "RSA Data Security, Inc. MD5 Message-Digest +Algorithm" in all material mentioning or referencing this software +or this function. + +License is also granted to make and use derivative works provided +that such works are identified as "derived from the RSA Data +Security, Inc. MD5 Message-Digest Algorithm" in all material +mentioning or referencing the derived work. + +RSA Data Security, Inc. makes no representations concerning either +the merchantability of this software or the suitability of this +software for any particular purpose. It is provided "as is" +without express or implied warranty of any kind. + +These notices must be retained in any copies of any part of this +documentation and/or software. + */ + +#ifndef _SYS_MD5_H_ +#define _SYS_MD5_H_ + +#define MD5_BLOCK_LENGTH 64 +#define MD5_DIGEST_LENGTH 16 +#define MD5_DIGEST_STRING_LENGTH (MD5_DIGEST_LENGTH * 2 + 1) + +/* MD5 context. */ +typedef struct MD5Context { + u_int32_t state[4]; /* state (ABCD) */ + u_int32_t count[2]; /* number of bits, modulo 2^64 (lsb first) */ + unsigned char buffer[64]; /* input buffer */ +} MD5_CTX; + +#include <sys/cdefs.h> + +void MD5Init (MD5_CTX *); +void MD5Update (MD5_CTX *, const void *, unsigned int); +void MD5Final (unsigned char [16], MD5_CTX *); +char * MD5End(MD5_CTX *, char *); +char * MD5File(const char *, char *); +char * MD5FileChunk(const char *, char *, off_t, off_t); +char * MD5Data(const void *, unsigned int, char *); +#endif /* _SYS_MD5_H_ */ diff --git a/md5/md5cmp.c b/md5/md5cmp.c new file mode 100644 index 00000000..07acda45 --- /dev/null +++ b/md5/md5cmp.c @@ -0,0 +1,59 @@ +/* + * Copyright (C)2013 D. R. Commander. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Neither the name of the libjpeg-turbo Project nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS", + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <stdio.h> +#include <string.h> +#include <sys/types.h> +#include "./md5.h" + +int main(int argc, char *argv[]) +{ + char *md5sum = NULL, buf[65]; + + if (argc < 3) { + fprintf(stderr, "USAGE: %s <correct MD5 sum> <file>\n", argv[0]); + return -1; + } + + if (strlen(argv[1]) != 32) + fprintf(stderr, "WARNING: MD5 hash size is wrong.\n"); + + md5sum = MD5File(argv[2], buf); + if (!md5sum) { + perror("Could not obtain MD5 sum"); + return -1; + } + + if (!strcasecmp(md5sum, argv[1])) { + fprintf(stderr, "%s: OK\n", argv[2]); + return 0; + } else { + fprintf(stderr, "%s: FAILED. Checksum is %s\n", argv[2], md5sum); + return -1; + } +} diff --git a/md5/md5hl.c b/md5/md5hl.c new file mode 100644 index 00000000..530c513f --- /dev/null +++ b/md5/md5hl.c @@ -0,0 +1,99 @@ +/* mdXhl.c * ---------------------------------------------------------------------------- + * "THE BEER-WARE LICENSE" (Revision 42): + * <phk@FreeBSD.org> wrote this file. As long as you retain this notice you + * can do whatever you want with this stuff. If we meet some day, and you think + * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp + * ---------------------------------------------------------------------------- + */ + +#include <sys/cdefs.h> + +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> + +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> + +#define LENGTH 16 + +#include "./md5.h" + +char * +MD5End(MD5_CTX *ctx, char *buf) +{ + int i; + unsigned char digest[LENGTH]; + static const char hex[]="0123456789abcdef"; + + if (!buf) + buf = malloc(2*LENGTH + 1); + if (!buf) + return 0; + MD5Final(digest, ctx); + for (i = 0; i < LENGTH; i++) { + buf[i+i] = hex[digest[i] >> 4]; + buf[i+i+1] = hex[digest[i] & 0x0f]; + } + buf[i+i] = '\0'; + return buf; +} + +char * +MD5File(const char *filename, char *buf) +{ + return (MD5FileChunk(filename, buf, 0, 0)); +} + +char * +MD5FileChunk(const char *filename, char *buf, off_t ofs, off_t len) +{ + unsigned char buffer[BUFSIZ]; + MD5_CTX ctx; + struct stat stbuf; + int f, i, e; + off_t n; + + MD5Init(&ctx); + f = open(filename, O_RDONLY); + if (f < 0) + return 0; + if (fstat(f, &stbuf) < 0) + return 0; + if (ofs > stbuf.st_size) + ofs = stbuf.st_size; + if ((len == 0) || (len > stbuf.st_size - ofs)) + len = stbuf.st_size - ofs; + if (lseek(f, ofs, SEEK_SET) < 0) + return 0; + n = len; + i = 0; + while (n > 0) { + if (n > sizeof(buffer)) + i = read(f, buffer, sizeof(buffer)); + else + i = read(f, buffer, n); + if (i < 0) + break; + MD5Update(&ctx, buffer, i); + n -= i; + } + e = errno; + close(f); + errno = e; + if (i < 0) + return 0; + return (MD5End(&ctx, buf)); +} + +char * +MD5Data (const void *data, unsigned int len, char *buf) +{ + MD5_CTX ctx; + + MD5Init(&ctx); + MD5Update(&ctx,data,len); + return (MD5End(&ctx, buf)); +} diff --git a/md5cmp b/md5cmp deleted file mode 100644 index 5b92dcc6..00000000 --- a/md5cmp +++ /dev/null @@ -1,12 +0,0 @@ -if [ "$1" = "" -o "$2" = "" ]; then - echo USAGE: $0 \<correct MD5 sum\> \<file\> - exit 1 -fi - -echo "$1 $2" >md5sum.txt -if [ ! -f $2 ]; then - echo $2 does not exist! - exit 1 -fi -md5sum --check md5sum.txt || exit 1 -rm md5sum.txt |