md5c.c revision 6596
1/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
2 * $FreeBSD: head/lib/libmd/md5c.c 6596 1995-02-21 06:01:49Z phk $
3 */
4
5/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
6rights reserved.
7
8License to copy and use this software is granted provided that it
9is identified as the "RSA Data Security, Inc. MD5 Message-Digest
10Algorithm" in all material mentioning or referencing this software
11or this function.
12
13License is also granted to make and use derivative works provided
14that such works are identified as "derived from the RSA Data
15Security, Inc. MD5 Message-Digest Algorithm" in all material
16mentioning or referencing the derived work.
17
18RSA Data Security, Inc. makes no representations concerning either
19the merchantability of this software or the suitability of this
20software for any particular purpose. It is provided "as is"
21without express or implied warranty of any kind.
22
23These notices must be retained in any copies of any part of this
24documentation and/or software.
25 */
26
27#include "md5.h"
28
29typedef unsigned char *POINTER;
30typedef unsigned short int UINT2;
31typedef unsigned long int UINT4;
32
33#define PROTO_LIST(list) list
34
35/* Constants for MD5Transform routine.
36 */
37#define S11 7
38#define S12 12
39#define S13 17
40#define S14 22
41#define S21 5
42#define S22 9
43#define S23 14
44#define S24 20
45#define S31 4
46#define S32 11
47#define S33 16
48#define S34 23
49#define S41 6
50#define S42 10
51#define S43 15
52#define S44 21
53
54static void MD5Transform PROTO_LIST ((UINT4 [4], const unsigned char [64]));
55
56#ifdef i386
57#define Encode memcpy
58#define Decode memcpy
59#else /* i386 */
60/* Encodes input (UINT4) into output (unsigned char). Assumes len is
61  a multiple of 4.
62 */
63static void Encode (output, input, len)
64unsigned char *output;
65UINT4 *input;
66unsigned int len;
67{
68  unsigned int i, j;
69
70  for (i = 0, j = 0; j < len; i++, j += 4) {
71    output[j] = (unsigned char)(input[i] & 0xff);
72    output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
73    output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
74    output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
75  }
76}
77
78/* Decodes input (unsigned char) into output (UINT4). Assumes len is
79  a multiple of 4.
80 */
81static void Decode (output, input, len)
82UINT4 *output;
83const unsigned char *input;
84unsigned int len;
85{
86  unsigned int i, j;
87
88  for (i = 0, j = 0; j < len; i++, j += 4)
89    output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) |
90    (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24);
91}
92#endif /* i386 */
93
94static unsigned char PADDING[64] = {
95  0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
96  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
97  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
98};
99
100/* F, G, H and I are basic MD5 functions.
101 */
102#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
103#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
104#define H(x, y, z) ((x) ^ (y) ^ (z))
105#define I(x, y, z) ((y) ^ ((x) | (~z)))
106
107/* ROTATE_LEFT rotates x left n bits.
108 */
109#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
110
111/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
112Rotation is separate from addition to prevent recomputation.
113 */
114#define FF(a, b, c, d, x, s, ac) { \
115 (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
116 (a) = ROTATE_LEFT ((a), (s)); \
117 (a) += (b); \
118  }
119#define GG(a, b, c, d, x, s, ac) { \
120 (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
121 (a) = ROTATE_LEFT ((a), (s)); \
122 (a) += (b); \
123  }
124#define HH(a, b, c, d, x, s, ac) { \
125 (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
126 (a) = ROTATE_LEFT ((a), (s)); \
127 (a) += (b); \
128  }
129#define II(a, b, c, d, x, s, ac) { \
130 (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
131 (a) = ROTATE_LEFT ((a), (s)); \
132 (a) += (b); \
133  }
134
135/* MD5 initialization. Begins an MD5 operation, writing a new context.
136 */
137void MD5Init (context)
138MD5_CTX *context;                                        /* context */
139{
140  context->count[0] = context->count[1] = 0;
141  /* Load magic initialization constants.
142*/
143  context->state[0] = 0x67452301;
144  context->state[1] = 0xefcdab89;
145  context->state[2] = 0x98badcfe;
146  context->state[3] = 0x10325476;
147}
148
149/* MD5 block update operation. Continues an MD5 message-digest
150  operation, processing another message block, and updating the
151  context.
152 */
153void MD5Update (context, input, inputLen)
154MD5_CTX *context;                                        /* context */
155const unsigned char *input;                                /* input block */
156unsigned int inputLen;                     /* length of input block */
157{
158  unsigned int i, index, partLen;
159
160  /* Compute number of bytes mod 64 */
161  index = (unsigned int)((context->count[0] >> 3) & 0x3F);
162
163  /* Update number of bits */
164  if ((context->count[0] += ((UINT4)inputLen << 3))
165   < ((UINT4)inputLen << 3))
166 context->count[1]++;
167  context->count[1] += ((UINT4)inputLen >> 29);
168
169  partLen = 64 - index;
170
171  /* Transform as many times as possible.
172*/
173  if (inputLen >= partLen) {
174 memcpy
175   ((POINTER)&context->buffer[index], (POINTER)input, partLen);
176 MD5Transform (context->state, context->buffer);
177
178 for (i = partLen; i + 63 < inputLen; i += 64)
179   MD5Transform (context->state, &input[i]);
180
181 index = 0;
182  }
183  else
184 i = 0;
185
186  /* Buffer remaining input */
187  memcpy
188 ((POINTER)&context->buffer[index], (POINTER)&input[i],
189  inputLen-i);
190}
191
192/* MD5 finalization. Ends an MD5 message-digest operation, writing the
193  the message digest and zeroizing the context.
194 */
195void MD5Final (digest, context)
196unsigned char digest[16];                         /* message digest */
197MD5_CTX *context;                                       /* context */
198{
199  unsigned char bits[8];
200  unsigned int index, padLen;
201
202  /* Save number of bits */
203  Encode (bits, context->count, 8);
204
205  /* Pad out to 56 mod 64.
206*/
207  index = (unsigned int)((context->count[0] >> 3) & 0x3f);
208  padLen = (index < 56) ? (56 - index) : (120 - index);
209  MD5Update (context, PADDING, padLen);
210
211  /* Append length (before padding) */
212  MD5Update (context, bits, 8);
213  /* Store state in digest */
214  Encode (digest, context->state, 16);
215
216  /* Zeroize sensitive information.
217*/
218  memset ((POINTER)context, 0, sizeof (*context));
219}
220
221/* MD5 basic transformation. Transforms state based on block.
222 */
223static void MD5Transform (state, block)
224UINT4 state[4];
225const unsigned char block[64];
226{
227  UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
228
229  Decode (x, block, 64);
230
231  /* Round 1 */
232  FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
233  FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
234  FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
235  FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
236  FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
237  FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
238  FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
239  FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
240  FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
241  FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
242  FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
243  FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
244  FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
245  FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
246  FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
247  FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
248
249 /* Round 2 */
250  GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
251  GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
252  GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
253  GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
254  GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
255  GG (d, a, b, c, x[10], S22,  0x2441453); /* 22 */
256  GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
257  GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
258  GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
259  GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
260  GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
261  GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
262  GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
263  GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
264  GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
265  GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
266
267  /* Round 3 */
268  HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
269  HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
270  HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
271  HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
272  HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
273  HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
274  HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
275  HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
276  HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
277  HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
278  HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
279  HH (b, c, d, a, x[ 6], S34,  0x4881d05); /* 44 */
280  HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
281  HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
282  HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
283  HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
284
285  /* Round 4 */
286  II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
287  II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
288  II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
289  II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
290  II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
291  II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
292  II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
293  II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
294  II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
295  II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
296  II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
297  II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
298  II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
299  II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
300  II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
301  II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
302
303  state[0] += a;
304  state[1] += b;
305  state[2] += c;
306  state[3] += d;
307
308  /* Zeroize sensitive information.
309*/
310  memset ((POINTER)x, 0, sizeof (x));
311}
312
313