/*
* written by Colin Plumb in 1993 , no copyright is claimed .
* This code is in the public domain ; do with it what you wish .
*
* Equivalent code is available from RSA Data Security , Inc .
* This code has been tested against that , and is equivalent ,
* except that you don ' t need to include two pages of legalese
* with every copy .
*
* To compute the message digest of a chunk of bytes , declare an
* MD5Context structure , pass it to MD5Init , call MD5Update as
* needed on buffers full of bytes , and then call MD5Final , which
* will fill a supplied 16 - byte array with the digest .
*/
#include <string.h>
#include "common/md5.h"
namespace google_breakpad {
#ifndef WORDS_BIGENDIAN
#define byteReverse(buf, len) /* Nothing */
#else
/*
* Note : this code is harmless on little - endian machines .
*/
static void byteReverse(unsigned char *buf, unsigned longs)
{
u32 t;
do {
t = (u32) ((unsigned ) buf[3 ] << 8 | buf[2 ]) << 16 |
((unsigned ) buf[1 ] << 8 | buf[0 ]);
*(u32 *) buf = t;
buf += 4 ;
} while (--longs);
}
#endif
static void MD5Transform(u32 buf[4 ], u32 const in[16 ]);
/*
* Start MD5 accumulation . Set bit count to 0 and buffer to mysterious
* initialization constants .
*/
void MD5Init(struct MD5Context *ctx)
{
ctx->buf[0 ] = 0 x67452301;
ctx->buf[1 ] = 0 xefcdab89;
ctx->buf[2 ] = 0 x98badcfe;
ctx->buf[3 ] = 0 x10325476;
ctx->bits[0 ] = 0 ;
ctx->bits[1 ] = 0 ;
}
/*
* Update context to reflect the concatenation of another buffer full
* of bytes .
*/
void MD5Update(struct MD5Context *ctx, unsigned char const *buf, size_t len)
{
u32 t;
/* Update bitcount */
t = ctx->bits[0 ];
if ((ctx->bits[0 ] = t + ((u32) len << 3 )) < t)
ctx->bits[1 ]++; /* Carry from low to high */
ctx->bits[1 ] += len >> 29 ;
t = (t >> 3 ) & 0 x3f; /* 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);
return ;
}
memcpy(p, buf, t);
byteReverse(ctx->in, 16 );
MD5Transform(ctx->buf, (u32 *) ctx->in);
buf += t;
len -= t;
}
/* Process data in 64-byte chunks */
while (len >= 64 ) {
memcpy(ctx->in, buf, 64 );
byteReverse(ctx->in, 16 );
MD5Transform(ctx->buf, (u32 *) ctx->in);
buf += 64 ;
len -= 64 ;
}
/* Handle any remaining bytes of data. */
memcpy(ctx->in, buf, 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)
{
unsigned count;
unsigned char *p;
/* Compute number of bytes mod 64 */
count = (ctx->bits[0 ] >> 3 ) & 0 x3F;
/* Set the first char of padding to 0x80. This is safe since there is
always at least one byte free */
p = ctx->in + count;
*p++ = 0 x80;
/* 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 */
memset(p, 0 , count);
byteReverse(ctx->in, 16 );
MD5Transform(ctx->buf, (u32 *) ctx->in);
/* Now fill the next block with 56 bytes */
memset(ctx->in, 0 , 56 );
} else {
/* Pad block to 56 bytes */
memset(p, 0 , count - 8 );
}
byteReverse(ctx->in, 14 );
/* Append length in bits and transform */
memcpy(&ctx->in[14 ], &ctx->bits[0 ], sizeof (u32));
memcpy(&ctx->in[15 ], &ctx->bits[1 ], sizeof (u32));
MD5Transform(ctx->buf, (u32 *) ctx->in);
byteReverse((unsigned char *) ctx->buf, 4 );
memcpy(digest, ctx->buf, 16 );
memset(ctx, 0 , sizeof (*ctx)); /* In case it's sensitive */
}
/* The four core functions - F1 is optimized somewhat */
/* #define F1(x, y, z) (x & y | ~x & z) */
#define F1(x, y, z) (z ^ (x & (y ^ z)))
#define F2(x, y, z) F1(z, x, y)
#define F3(x, y, z) (x ^ y ^ z)
#define F4(x, y, z) (y ^ (x | ~z))
/* This is the central step in the MD5 algorithm. */
#define MD5STEP(f, w, x, y, z, data, s) \
( w += f(x, y, z) + data, w = w<<s | w>>(32 -s), w += x )
/*
* The core of the MD5 algorithm , this alters an existing MD5 hash to
* reflect the addition of 16 longwords of new data . MD5Update blocks
* the data and converts bytes into longwords for this routine .
*/
static void MD5Transform(u32 buf[4 ], u32 const in[16 ])
{
u32 a, b, c, d;
a = buf[0 ];
b = buf[1 ];
c = buf[2 ];
d = buf[3 ];
MD5STEP(F1, a, b, c, d, in[0 ] + 0 xd76aa478, 7 );
MD5STEP(F1, d, a, b, c, in[1 ] + 0 xe8c7b756, 12 );
MD5STEP(F1, c, d, a, b, in[2 ] + 0 x242070db, 17 );
MD5STEP(F1, b, c, d, a, in[3 ] + 0 xc1bdceee, 22 );
MD5STEP(F1, a, b, c, d, in[4 ] + 0 xf57c0faf, 7 );
MD5STEP(F1, d, a, b, c, in[5 ] + 0 x4787c62a, 12 );
MD5STEP(F1, c, d, a, b, in[6 ] + 0 xa8304613, 17 );
MD5STEP(F1, b, c, d, a, in[7 ] + 0 xfd469501, 22 );
MD5STEP(F1, a, b, c, d, in[8 ] + 0 x698098d8, 7 );
MD5STEP(F1, d, a, b, c, in[9 ] + 0 x8b44f7af, 12 );
MD5STEP(F1, c, d, a, b, in[10 ] + 0 xffff5bb1, 17 );
MD5STEP(F1, b, c, d, a, in[11 ] + 0 x895cd7be, 22 );
MD5STEP(F1, a, b, c, d, in[12 ] + 0 x6b901122, 7 );
MD5STEP(F1, d, a, b, c, in[13 ] + 0 xfd987193, 12 );
MD5STEP(F1, c, d, a, b, in[14 ] + 0 xa679438e, 17 );
MD5STEP(F1, b, c, d, a, in[15 ] + 0 x49b40821, 22 );
MD5STEP(F2, a, b, c, d, in[1 ] + 0 xf61e2562, 5 );
MD5STEP(F2, d, a, b, c, in[6 ] + 0 xc040b340, 9 );
MD5STEP(F2, c, d, a, b, in[11 ] + 0 x265e5a51, 14 );
MD5STEP(F2, b, c, d, a, in[0 ] + 0 xe9b6c7aa, 20 );
MD5STEP(F2, a, b, c, d, in[5 ] + 0 xd62f105d, 5 );
MD5STEP(F2, d, a, b, c, in[10 ] + 0 x02441453, 9 );
MD5STEP(F2, c, d, a, b, in[15 ] + 0 xd8a1e681, 14 );
MD5STEP(F2, b, c, d, a, in[4 ] + 0 xe7d3fbc8, 20 );
MD5STEP(F2, a, b, c, d, in[9 ] + 0 x21e1cde6, 5 );
MD5STEP(F2, d, a, b, c, in[14 ] + 0 xc33707d6, 9 );
MD5STEP(F2, c, d, a, b, in[3 ] + 0 xf4d50d87, 14 );
MD5STEP(F2, b, c, d, a, in[8 ] + 0 x455a14ed, 20 );
MD5STEP(F2, a, b, c, d, in[13 ] + 0 xa9e3e905, 5 );
MD5STEP(F2, d, a, b, c, in[2 ] + 0 xfcefa3f8, 9 );
MD5STEP(F2, c, d, a, b, in[7 ] + 0 x676f02d9, 14 );
MD5STEP(F2, b, c, d, a, in[12 ] + 0 x8d2a4c8a, 20 );
MD5STEP(F3, a, b, c, d, in[5 ] + 0 xfffa3942, 4 );
MD5STEP(F3, d, a, b, c, in[8 ] + 0 x8771f681, 11 );
MD5STEP(F3, c, d, a, b, in[11 ] + 0 x6d9d6122, 16 );
MD5STEP(F3, b, c, d, a, in[14 ] + 0 xfde5380c, 23 );
MD5STEP(F3, a, b, c, d, in[1 ] + 0 xa4beea44, 4 );
MD5STEP(F3, d, a, b, c, in[4 ] + 0 x4bdecfa9, 11 );
MD5STEP(F3, c, d, a, b, in[7 ] + 0 xf6bb4b60, 16 );
MD5STEP(F3, b, c, d, a, in[10 ] + 0 xbebfbc70, 23 );
MD5STEP(F3, a, b, c, d, in[13 ] + 0 x289b7ec6, 4 );
MD5STEP(F3, d, a, b, c, in[0 ] + 0 xeaa127fa, 11 );
MD5STEP(F3, c, d, a, b, in[3 ] + 0 xd4ef3085, 16 );
MD5STEP(F3, b, c, d, a, in[6 ] + 0 x04881d05, 23 );
MD5STEP(F3, a, b, c, d, in[9 ] + 0 xd9d4d039, 4 );
MD5STEP(F3, d, a, b, c, in[12 ] + 0 xe6db99e5, 11 );
MD5STEP(F3, c, d, a, b, in[15 ] + 0 x1fa27cf8, 16 );
MD5STEP(F3, b, c, d, a, in[2 ] + 0 xc4ac5665, 23 );
MD5STEP(F4, a, b, c, d, in[0 ] + 0 xf4292244, 6 );
MD5STEP(F4, d, a, b, c, in[7 ] + 0 x432aff97, 10 );
MD5STEP(F4, c, d, a, b, in[14 ] + 0 xab9423a7, 15 );
MD5STEP(F4, b, c, d, a, in[5 ] + 0 xfc93a039, 21 );
MD5STEP(F4, a, b, c, d, in[12 ] + 0 x655b59c3, 6 );
MD5STEP(F4, d, a, b, c, in[3 ] + 0 x8f0ccc92, 10 );
MD5STEP(F4, c, d, a, b, in[10 ] + 0 xffeff47d, 15 );
MD5STEP(F4, b, c, d, a, in[1 ] + 0 x85845dd1, 21 );
MD5STEP(F4, a, b, c, d, in[8 ] + 0 x6fa87e4f, 6 );
MD5STEP(F4, d, a, b, c, in[15 ] + 0 xfe2ce6e0, 10 );
MD5STEP(F4, c, d, a, b, in[6 ] + 0 xa3014314, 15 );
MD5STEP(F4, b, c, d, a, in[13 ] + 0 x4e0811a1, 21 );
MD5STEP(F4, a, b, c, d, in[4 ] + 0 xf7537e82, 6 );
MD5STEP(F4, d, a, b, c, in[11 ] + 0 xbd3af235, 10 );
MD5STEP(F4, c, d, a, b, in[2 ] + 0 x2ad7d2bb, 15 );
MD5STEP(F4, b, c, d, a, in[9 ] + 0 xeb86d391, 21 );
buf[0 ] += a;
buf[1 ] += b;
buf[2 ] += c;
buf[3 ] += d;
}
} // namespace google_breakpad
Messung V0.5 in Prozent C=82 H=93 G=87
¤ Dauer der Verarbeitung: 0.18 Sekunden
(vorverarbeitet am 2026-08-26)
¤
*© Formatika GbR, Deutschland