325N/A * This is an OpenSSL-compatible implementation of the RSA Data Security, 325N/A * Inc. MD5 Message-Digest Algorithm. 325N/A * Written by Solar Designer <solar@openwall.com> in 2001, and placed in 325N/A * the public domain. There's absolutely no warranty. 325N/A * This differs from Colin Plumb's older public domain implementation in 325N/A * that no 32-bit integer data type is required, there's no compile-time 325N/A * endianness configuration, and the function prototypes match OpenSSL's. 325N/A * The primary goals are portability and ease of use. 325N/A * This implementation is meant to be fast, but not as fast as possible. 325N/A * Some known optimizations are not included to reduce source code size 325N/A * and avoid compile-time configuration. 325N/A * The basic MD5 functions. 325N/A * F is optimized compared to its RFC 1321 definition just like in Colin 325N/A * Plumb's implementation. 325N/A#
define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
325N/A#
define G(x, y, z) ((y) ^ ((z) & ((x) ^ (y))))
325N/A#
define H(x, y, z) ((x) ^ (y) ^ (z))
325N/A#
define I(x, y, z) ((y) ^ ((x) | ~(z)))
325N/A * The MD5 transformation for all four rounds. 325N/A (a) += f((b), (c), (d)) + (x) + (t); \
325N/A (a) = (((a) << (s)) | (((a) &
0xffffffff) >> (
32 - (s)))); \
325N/A * SET reads 4 input bytes in little-endian byte order and stores them 325N/A * in a properly aligned word in host byte order. 325N/A * The check for little-endian architectures which tolerate unaligned 325N/A * memory accesses is just an optimization. Nothing will break if it * This processes one or more 64-byte data blocks, but does NOT update * the bit counters. There're no alignment requirements. const unsigned char *
ptr;
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)
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)
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)
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)
}
while ((
size -=
64) != 0);