xref: /freebsd/sys/kern/md5c.c (revision 17ee9d00bc1ae1e598c38f25826f861e4bc6c3ce)
1 /* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
2  * $FreeBSD$
3  */
4 
5 /* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
6 rights reserved.
7 
8 License to copy and use this software is granted provided that it
9 is identified as the "RSA Data Security, Inc. MD5 Message-Digest
10 Algorithm" in all material mentioning or referencing this software
11 or this function.
12 
13 License is also granted to make and use derivative works provided
14 that such works are identified as "derived from the RSA Data
15 Security, Inc. MD5 Message-Digest Algorithm" in all material
16 mentioning or referencing the derived work.
17 
18 RSA Data Security, Inc. makes no representations concerning either
19 the merchantability of this software or the suitability of this
20 software for any particular purpose. It is provided "as is"
21 without express or implied warranty of any kind.
22 
23 These notices must be retained in any copies of any part of this
24 documentation and/or software.
25  */
26 
27 #include "md5.h"
28 
29 typedef unsigned char *POINTER;
30 typedef unsigned short int UINT2;
31 typedef 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 
54 static 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  */
63 static void Encode (output, input, len)
64 unsigned char *output;
65 UINT4 *input;
66 unsigned 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  */
81 static void Decode (output, input, len)
82 UINT4 *output;
83 const unsigned char *input;
84 unsigned 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 
94 static 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.
112 Rotation 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  */
137 void MD5Init (context)
138 MD5_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  */
153 void MD5Update (context, input, inputLen)
154 MD5_CTX *context;                                        /* context */
155 const unsigned char *input;                                /* input block */
156 unsigned 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  */
195 void MD5Final (digest, context)
196 unsigned char digest[16];                         /* message digest */
197 MD5_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  */
223 static void MD5Transform (state, block)
224 UINT4 state[4];
225 const 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