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