39#define PROTO_LIST(list) list
58 ((
unsigned char *,
UINT4 *,
unsigned int));
60 ((
UINT4 *,
const unsigned char *,
unsigned int));
63 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
64 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
65 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
70#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
71#define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
72#define H(x, y, z) ((x) ^ (y) ^ (z))
76#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
80#define FF(a, b, c, d, x, s) { \
81 (a) += F ((b), (c), (d)) + (x); \
82 (a) = ROTATE_LEFT ((a), (s)); \
84#define GG(a, b, c, d, x, s) { \
85 (a) += G ((b), (c), (d)) + (x) + (UINT4)0x5a827999; \
86 (a) = ROTATE_LEFT ((a), (s)); \
88#define HH(a, b, c, d, x, s) { \
89 (a) += H ((b), (c), (d)) + (x) + (UINT4)0x6ed9eba1; \
90 (a) = ROTATE_LEFT ((a), (s)); \
98 context->count[0] = context->count[1] = 0;
102 context->state[0] = 0x67452301;
103 context->state[1] = 0xefcdab89;
104 context->state[2] = 0x98badcfe;
105 context->state[3] = 0x10325476;
114 unsigned int inputLen)
116 unsigned int i, index, partLen;
119 index = (
unsigned int)((context->count[0] >> 3) & 0x3F);
121 if ((context->count[0] += ((
UINT4)inputLen << 3))
122 < ((
UINT4)inputLen << 3))
124 context->count[1] += ((
UINT4)inputLen >> 29);
126 partLen = 64 - index;
129 if (inputLen >= partLen) {
130 bcopy(input, &context->buffer[index], partLen);
133 for (i = partLen; i + 63 < inputLen; i += 64)
142 bcopy(&input[i], &context->buffer[index], inputLen-i);
149 unsigned char bits[8];
150 unsigned int index, padLen;
153 Encode (bits, context->count, 8);
157 index = (
unsigned int)((context->count[0] >> 3) & 0x3f);
158 padLen = (index < 56) ? (56 - index) : (120 - index);
169MD4Final(
unsigned char digest[
static 16], MD4_CTX *context)
175 Encode (digest, context->state, 16);
179 bzero(context,
sizeof (*context));
187 UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
192 FF (a, b, c, d, x[ 0],
S11);
193 FF (d, a, b, c, x[ 1],
S12);
194 FF (c, d, a, b, x[ 2],
S13);
195 FF (b, c, d, a, x[ 3],
S14);
196 FF (a, b, c, d, x[ 4],
S11);
197 FF (d, a, b, c, x[ 5],
S12);
198 FF (c, d, a, b, x[ 6],
S13);
199 FF (b, c, d, a, x[ 7],
S14);
200 FF (a, b, c, d, x[ 8],
S11);
201 FF (d, a, b, c, x[ 9],
S12);
202 FF (c, d, a, b, x[10],
S13);
203 FF (b, c, d, a, x[11],
S14);
204 FF (a, b, c, d, x[12],
S11);
205 FF (d, a, b, c, x[13],
S12);
206 FF (c, d, a, b, x[14],
S13);
207 FF (b, c, d, a, x[15],
S14);
210 GG (a, b, c, d, x[ 0],
S21);
211 GG (d, a, b, c, x[ 4],
S22);
212 GG (c, d, a, b, x[ 8],
S23);
213 GG (b, c, d, a, x[12],
S24);
214 GG (a, b, c, d, x[ 1],
S21);
215 GG (d, a, b, c, x[ 5],
S22);
216 GG (c, d, a, b, x[ 9],
S23);
217 GG (b, c, d, a, x[13],
S24);
218 GG (a, b, c, d, x[ 2],
S21);
219 GG (d, a, b, c, x[ 6],
S22);
220 GG (c, d, a, b, x[10],
S23);
221 GG (b, c, d, a, x[14],
S24);
222 GG (a, b, c, d, x[ 3],
S21);
223 GG (d, a, b, c, x[ 7],
S22);
224 GG (c, d, a, b, x[11],
S23);
225 GG (b, c, d, a, x[15],
S24);
228 HH (a, b, c, d, x[ 0],
S31);
229 HH (d, a, b, c, x[ 8],
S32);
230 HH (c, d, a, b, x[ 4],
S33);
231 HH (b, c, d, a, x[12],
S34);
232 HH (a, b, c, d, x[ 2],
S31);
233 HH (d, a, b, c, x[10],
S32);
234 HH (c, d, a, b, x[ 6],
S33);
235 HH (b, c, d, a, x[14],
S34);
236 HH (a, b, c, d, x[ 1],
S31);
237 HH (d, a, b, c, x[ 9],
S32);
238 HH (c, d, a, b, x[ 5],
S33);
239 HH (b, c, d, a, x[13],
S34);
240 HH (a, b, c, d, x[ 3],
S31);
241 HH (d, a, b, c, x[11],
S32);
242 HH (c, d, a, b, x[ 7],
S33);
243 HH (b, c, d, a, x[15],
S34);
263 for (i = 0, j = 0; j < len; i++, j += 4) {
264 output[j] = (
unsigned char)(input[i] & 0xff);
265 output[j+1] = (
unsigned char)((input[i] >> 8) & 0xff);
266 output[j+2] = (
unsigned char)((input[i] >> 16) & 0xff);
267 output[j+3] = (
unsigned char)((input[i] >> 24) & 0xff);
275Decode(
UINT4 *output,
const unsigned char *input,
unsigned int len)
279 for (i = 0, j = 0; j < len; i++, j += 4)
280 output[i] = ((
UINT4)input[j]) | (((
UINT4)input[j+1]) << 8) |
281 (((
UINT4)input[j+2]) << 16) | (((
UINT4)input[j+3]) << 24);
void MD4Final(unsigned char digest[static 16], MD4_CTX *context)
void MD4Init(MD4_CTX *context)
#define HH(a, b, c, d, x, s)
static void Encode(unsigned char *output, UINT4 *input, unsigned int len)
static void MD4Transform(UINT4 state[4], const unsigned char block[64])
#define GG(a, b, c, d, x, s)
void MD4Pad(MD4_CTX *context)
void MD4Update(MD4_CTX *context, const unsigned char *input, unsigned int inputLen)
#define FF(a, b, c, d, x, s)
static unsigned char PADDING[64]
static void Decode(UINT4 *output, const unsigned char *input, unsigned int len)