added README, license, and configure script
[assman] / src / md4.c
1 /* MD4C.C - RSA Data Security, Inc., MD4 message-digest algorithm
2  */
3
4 /* Copyright (C) 1990-2, RSA Data Security, Inc. All rights reserved.
5
6    License to copy and use this software is granted provided that it
7    is identified as the "RSA Data Security, Inc. MD4 Message-Digest
8    Algorithm" in all material mentioning or referencing this software
9    or this function.
10
11    License is also granted to make and use derivative works provided
12    that such works are identified as "derived from the RSA Data
13    Security, Inc. MD4 Message-Digest Algorithm" in all material
14    mentioning or referencing the derived work.
15
16    RSA Data Security, Inc. makes no representations concerning either
17    the merchantability of this software or the suitability of this
18    software for any particular purpose. It is provided "as is"
19    without express or implied warranty of any kind.
20
21    These notices must be retained in any copies of any part of this
22    documentation and/or software.
23  */
24
25 #include <stdlib.h>
26 #include <string.h>
27 #include "md4.h"
28
29 /* Constants for MD4Transform routine.
30  */
31 #define S11 3
32 #define S12 7
33 #define S13 11
34 #define S14 19
35 #define S21 3
36 #define S22 5
37 #define S23 9
38 #define S24 13
39 #define S31 3
40 #define S32 9
41 #define S33 11
42 #define S34 15
43
44 static void MD4Transform (uint32_t [4], unsigned char [64]);
45 static void Encode (unsigned char *, uint32_t *, unsigned int);
46 static void Decode (uint32_t *, unsigned char *, unsigned int);
47
48 static unsigned char PADDING[64] = {
49   0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
50   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
51   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
52 };
53
54 /* F, G and H are basic MD4 functions.
55  */
56 #define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
57 #define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
58 #define H(x, y, z) ((x) ^ (y) ^ (z))
59
60 /* ROTATE_LEFT rotates x left n bits.
61  */
62 #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
63
64 /* FF, GG and HH are transformations for rounds 1, 2 and 3 */
65 /* Rotation is separate from addition to prevent recomputation */
66
67 #define FF(a, b, c, d, x, s) { \
68     (a) += F ((b), (c), (d)) + (x); \
69     (a) = ROTATE_LEFT ((a), (s)); \
70   }
71 #define GG(a, b, c, d, x, s) { \
72     (a) += G ((b), (c), (d)) + (x) + (uint32_t)0x5a827999; \
73     (a) = ROTATE_LEFT ((a), (s)); \
74   }
75 #define HH(a, b, c, d, x, s) { \
76     (a) += H ((b), (c), (d)) + (x) + (uint32_t)0x6ed9eba1; \
77     (a) = ROTATE_LEFT ((a), (s)); \
78   }
79
80 /* MD4 initialization. Begins an MD4 operation, writing a new context.
81  */
82 void MD4Init (MD4_CTX *context)
83 {
84   context->count[0] = context->count[1] = 0;
85
86   /* Load magic initialization constants.
87    */
88   context->state[0] = 0x67452301;
89   context->state[1] = 0xefcdab89;
90   context->state[2] = 0x98badcfe;
91   context->state[3] = 0x10325476;
92 }
93
94 /* MD4 block update operation. Continues an MD4 message-digest
95      operation, processing another message block, and updating the
96      context.
97  */
98 void MD4Update (MD4_CTX *context, unsigned char *input, unsigned int inputLen)
99 {
100   unsigned int i, index, partLen;
101
102   /* Compute number of bytes mod 64 */
103   index = (unsigned int)((context->count[0] >> 3) & 0x3F);
104   /* Update number of bits */
105   if ((context->count[0] += ((uint32_t)inputLen << 3))
106       < ((uint32_t)inputLen << 3))
107     context->count[1]++;
108   context->count[1] += ((uint32_t)inputLen >> 29);
109
110   partLen = 64 - index;
111
112   /* Transform as many times as possible.
113    */
114   if (inputLen >= partLen) {
115     memcpy
116       ((unsigned char *)&context->buffer[index], (unsigned char *)input, partLen);
117     MD4Transform (context->state, context->buffer);
118
119     for (i = partLen; i + 63 < inputLen; i += 64)
120       MD4Transform (context->state, &input[i]);
121
122     index = 0;
123   }
124   else
125     i = 0;
126
127   /* Buffer remaining input */
128   memcpy
129     ((unsigned char *)&context->buffer[index], (unsigned char *)&input[i],
130      inputLen-i);
131 }
132
133 /* MD4 finalization. Ends an MD4 message-digest operation, writing the
134      the message digest and zeroizing the context.
135  */
136 void MD4Final (unsigned char digest[16], MD4_CTX *context)
137 {
138   unsigned char bits[8];
139   unsigned int index, padLen;
140
141   /* Save number of bits */
142   Encode (bits, context->count, 8);
143
144   /* Pad out to 56 mod 64.
145    */
146   index = (unsigned int)((context->count[0] >> 3) & 0x3f);
147   padLen = (index < 56) ? (56 - index) : (120 - index);
148   MD4Update (context, PADDING, padLen);
149
150   /* Append length (before padding) */
151   MD4Update (context, bits, 8);
152   /* Store state in digest */
153   Encode (digest, context->state, 16);
154
155   /* Zeroize sensitive information.
156    */
157   memset ((unsigned char *)context, 0, sizeof (*context));
158
159 }
160
161 /* MD4 basic transformation. Transforms state based on block.
162  */
163 static void MD4Transform (uint32_t state[4], unsigned char block[64])
164 {
165   uint32_t a = state[0], b = state[1], c = state[2], d = state[3], x[16];
166
167   Decode (x, block, 64);
168
169   /* Round 1 */
170   FF (a, b, c, d, x[ 0], S11); /* 1 */
171   FF (d, a, b, c, x[ 1], S12); /* 2 */
172   FF (c, d, a, b, x[ 2], S13); /* 3 */
173   FF (b, c, d, a, x[ 3], S14); /* 4 */
174   FF (a, b, c, d, x[ 4], S11); /* 5 */
175   FF (d, a, b, c, x[ 5], S12); /* 6 */
176   FF (c, d, a, b, x[ 6], S13); /* 7 */
177   FF (b, c, d, a, x[ 7], S14); /* 8 */
178   FF (a, b, c, d, x[ 8], S11); /* 9 */
179   FF (d, a, b, c, x[ 9], S12); /* 10 */
180   FF (c, d, a, b, x[10], S13); /* 11 */
181   FF (b, c, d, a, x[11], S14); /* 12 */
182   FF (a, b, c, d, x[12], S11); /* 13 */
183   FF (d, a, b, c, x[13], S12); /* 14 */
184   FF (c, d, a, b, x[14], S13); /* 15 */
185   FF (b, c, d, a, x[15], S14); /* 16 */
186
187   /* Round 2 */
188   GG (a, b, c, d, x[ 0], S21); /* 17 */
189   GG (d, a, b, c, x[ 4], S22); /* 18 */
190   GG (c, d, a, b, x[ 8], S23); /* 19 */
191   GG (b, c, d, a, x[12], S24); /* 20 */
192   GG (a, b, c, d, x[ 1], S21); /* 21 */
193   GG (d, a, b, c, x[ 5], S22); /* 22 */
194   GG (c, d, a, b, x[ 9], S23); /* 23 */
195   GG (b, c, d, a, x[13], S24); /* 24 */
196   GG (a, b, c, d, x[ 2], S21); /* 25 */
197   GG (d, a, b, c, x[ 6], S22); /* 26 */
198   GG (c, d, a, b, x[10], S23); /* 27 */
199   GG (b, c, d, a, x[14], S24); /* 28 */
200   GG (a, b, c, d, x[ 3], S21); /* 29 */
201   GG (d, a, b, c, x[ 7], S22); /* 30 */
202   GG (c, d, a, b, x[11], S23); /* 31 */
203   GG (b, c, d, a, x[15], S24); /* 32 */
204
205   /* Round 3 */
206   HH (a, b, c, d, x[ 0], S31); /* 33 */
207   HH (d, a, b, c, x[ 8], S32); /* 34 */
208   HH (c, d, a, b, x[ 4], S33); /* 35 */
209   HH (b, c, d, a, x[12], S34); /* 36 */
210   HH (a, b, c, d, x[ 2], S31); /* 37 */
211   HH (d, a, b, c, x[10], S32); /* 38 */
212   HH (c, d, a, b, x[ 6], S33); /* 39 */
213   HH (b, c, d, a, x[14], S34); /* 40 */
214   HH (a, b, c, d, x[ 1], S31); /* 41 */
215   HH (d, a, b, c, x[ 9], S32); /* 42 */
216   HH (c, d, a, b, x[ 5], S33); /* 43 */
217   HH (b, c, d, a, x[13], S34); /* 44 */
218   HH (a, b, c, d, x[ 3], S31); /* 45 */
219   HH (d, a, b, c, x[11], S32); /* 46 */
220   HH (c, d, a, b, x[ 7], S33); /* 47 */
221   HH (b, c, d, a, x[15], S34); /* 48 */
222
223   state[0] += a;
224   state[1] += b;
225   state[2] += c;
226   state[3] += d;
227
228   /* Zeroize sensitive information.
229    */
230   memset ((unsigned char *)x, 0, sizeof (x));
231 }
232
233 /* Encodes input (uint32_t) into output (unsigned char). Assumes len is
234      a multiple of 4.
235  */
236 static void Encode (unsigned char *output, uint32_t *input, unsigned int len)
237 {
238   unsigned int i, j;
239
240   for (i = 0, j = 0; j < len; i++, j += 4) {
241     output[j] = (unsigned char)(input[i] & 0xff);
242     output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
243     output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
244     output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
245   }
246 }
247
248 /* Decodes input (unsigned char) into output (uint32_t). Assumes len is
249      a multiple of 4.
250
251  */
252 static void Decode (uint32_t *output, unsigned char *input, unsigned int len)
253 {
254   unsigned int i, j;
255
256   for (i = 0, j = 0; j < len; i++, j += 4)
257     output[i] = ((uint32_t)input[j]) | (((uint32_t)input[j+1]) << 8) |
258       (((uint32_t)input[j+2]) << 16) | (((uint32_t)input[j+3]) << 24);
259 }