diff options
Diffstat (limited to 'src/md5.c')
-rw-r--r-- | src/md5.c | 102 |
1 files changed, 48 insertions, 54 deletions
@@ -17,7 +17,7 @@ /* #include "config.h" */ -#include <string.h> /* for memcpy() */ +#include <string.h> /* for memcpy() */ #include "md5.h" static void byteReverse(unsigned char *buf, unsigned longs); @@ -30,69 +30,66 @@ static void byteReverse(unsigned char *buf, unsigned longs); b ^= a; \ a ^= b; \ } while(0) -static void byteReverse(unsigned char *buf, unsigned longs) -{ - /*uint32 t;*/ +static void byteReverse(unsigned char *buf, unsigned longs) { + /*uint32 t; */ do { /* - t = (uint32) ((unsigned) buf[3] << 8 | buf[2]) << 16 | - ((unsigned) buf[1] << 8 | buf[0]); - *(uint32 *) buf = t; - */ + t = (uint32) ((unsigned) buf[3] << 8 | buf[2]) << 16 | + ((unsigned) buf[1] << 8 | buf[0]); + *(uint32 *) buf = t; + */ byteSwap(buf[0], buf[3]); byteSwap(buf[1], buf[2]); buf += 4; - } while (--longs); + } while(--longs); } /* * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious * initialization constants. */ -void MD5Init(struct MD5Context *ctx, int brokenEndian) -{ +void MD5Init(struct MD5Context *ctx, int brokenEndian) { ctx->buf[0] = 0x67452301; ctx->buf[1] = 0xefcdab89; ctx->buf[2] = 0x98badcfe; ctx->buf[3] = 0x10325476; - + ctx->bits[0] = 0; ctx->bits[1] = 0; - - /*#ifdef WORDS_BIGENDIAN*/ + + /*#ifdef WORDS_BIGENDIAN */ if (brokenEndian) { ctx->doByteReverse = 0; } else { ctx->doByteReverse = 1; } /*#else - ctx->doByteReverse = 0; - #endif - */ + ctx->doByteReverse = 0; + #endif + */ } /* * Update context to reflect the concatenation of another buffer full * of bytes. */ -void MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len) -{ +void MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len) { uint32 t; - + /* Update bitcount */ - + t = ctx->bits[0]; if ((ctx->bits[0] = t + ((uint32) len << 3)) < t) - ctx->bits[1]++; /* Carry from low to high */ + ctx->bits[1]++; /* Carry from low to high */ ctx->bits[1] += len >> 29; - - t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ - + + t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ + /* Handle any leading odd-sized chunks */ - + if (t) { unsigned char *p = (unsigned char *) ctx->in + t; - + t = 64 - t; if (len < t) { memcpy(p, buf, len); @@ -106,8 +103,8 @@ void MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len) len -= t; } /* Process data in 64-byte chunks */ - - while (len >= 64) { + + while(len >= 64) { memcpy(ctx->in, buf, 64); if (ctx->doByteReverse) byteReverse(ctx->in, 16); @@ -115,9 +112,9 @@ void MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len) buf += 64; len -= 64; } - + /* Handle any remaining bytes of data. */ - + memcpy(ctx->in, buf, len); } @@ -125,22 +122,21 @@ void MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len) * Final wrapup - pad to 64-byte boundary with the bit pattern * 1 0* (64-bit count of bits processed, MSB-first) */ -void MD5Final(unsigned char digest[16], struct MD5Context *ctx) -{ +void MD5Final(unsigned char digest[16], struct MD5Context *ctx) { unsigned count; unsigned char *p; - + /* Compute number of bytes mod 64 */ count = (ctx->bits[0] >> 3) & 0x3F; - + /* Set the first char of padding to 0x80. This is safe since there is - always at least one byte free */ + always at least one byte free */ p = ctx->in + count; *p++ = 0x80; - + /* Bytes of padding needed to make 64 bytes */ count = 64 - 1 - count; - + /* Pad out to 56 mod 64 */ if (count < 8) { /* Two lots of padding: Pad the first block to 64 bytes */ @@ -148,7 +144,7 @@ void MD5Final(unsigned char digest[16], struct MD5Context *ctx) if (ctx->doByteReverse) byteReverse(ctx->in, 16); MD5Transform(ctx->buf, (uint32 *) ctx->in); - + /* Now fill the next block with 56 bytes */ memset(ctx->in, 0, 56); } else { @@ -157,19 +153,19 @@ void MD5Final(unsigned char digest[16], struct MD5Context *ctx) } if (ctx->doByteReverse) byteReverse(ctx->in, 14); - + /* Append length in bits and transform */ /* Note: see patch for PAM from Tomas Mraz */ - memcpy((uint32 *)ctx->in + 14, ctx->bits, 2*sizeof(uint32)); + memcpy((uint32 *) ctx->in + 14, ctx->bits, 2 * sizeof(uint32)); /*((uint32 *) ctx->in)[14] = ctx->bits[0]; - ((uint32 *) ctx->in)[15] = ctx->bits[1]; - */ - + ((uint32 *) ctx->in)[15] = ctx->bits[1]; + */ + MD5Transform(ctx->buf, (uint32 *) ctx->in); if (ctx->doByteReverse) byteReverse((unsigned char *) ctx->buf, 4); memcpy(digest, ctx->buf, 16); - memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */ + memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */ } /* The four core functions - F1 is optimized somewhat */ @@ -189,15 +185,14 @@ void MD5Final(unsigned char digest[16], struct MD5Context *ctx) * reflect the addition of 16 longwords of new data. MD5Update blocks * the data and converts bytes into longwords for this routine. */ -void MD5Transform(uint32 buf[4], uint32 const in[16]) -{ +void MD5Transform(uint32 buf[4], uint32 const in[16]) { register uint32 a, b, c, d; - + a = buf[0]; b = buf[1]; c = buf[2]; d = buf[3]; - + MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); @@ -214,7 +209,7 @@ void MD5Transform(uint32 buf[4], uint32 const in[16]) MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); - + MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); @@ -231,7 +226,7 @@ void MD5Transform(uint32 buf[4], uint32 const in[16]) MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); - + MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); @@ -248,7 +243,7 @@ void MD5Transform(uint32 buf[4], uint32 const in[16]) MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); - + MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); @@ -265,10 +260,9 @@ void MD5Transform(uint32 buf[4], uint32 const in[16]) MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); - + buf[0] += a; buf[1] += b; buf[2] += c; buf[3] += d; } - |