xref: /openbmc/u-boot/lib/sha1.c (revision 5957ac2a)
1 /*
2  *  Heiko Schocher, DENX Software Engineering, hs@denx.de.
3  *  based on:
4  *  FIPS-180-1 compliant SHA-1 implementation
5  *
6  *  Copyright (C) 2003-2006  Christophe Devine
7  *
8  *  This library is free software; you can redistribute it and/or
9  *  modify it under the terms of the GNU Lesser General Public
10  *  License, version 2.1 as published by the Free Software Foundation.
11  *
12  *  This library is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  *  Lesser General Public License for more details.
16  *
17  *  You should have received a copy of the GNU Lesser General Public
18  *  License along with this library; if not, write to the Free Software
19  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
20  *  MA  02110-1301  USA
21  */
22 /*
23  *  The SHA-1 standard was published by NIST in 1993.
24  *
25  *  http://www.itl.nist.gov/fipspubs/fip180-1.htm
26  */
27 
28 #ifndef _CRT_SECURE_NO_DEPRECATE
29 #define _CRT_SECURE_NO_DEPRECATE 1
30 #endif
31 
32 #ifndef USE_HOSTCC
33 #include <common.h>
34 #include <linux/string.h>
35 #else
36 #include <string.h>
37 #endif /* USE_HOSTCC */
38 #include <watchdog.h>
39 #include <u-boot/sha1.h>
40 
41 /*
42  * 32-bit integer manipulation macros (big endian)
43  */
44 #ifndef GET_UINT32_BE
45 #define GET_UINT32_BE(n,b,i) {				\
46 	(n) = ( (unsigned long) (b)[(i)    ] << 24 )	\
47 	    | ( (unsigned long) (b)[(i) + 1] << 16 )	\
48 	    | ( (unsigned long) (b)[(i) + 2] <<  8 )	\
49 	    | ( (unsigned long) (b)[(i) + 3]       );	\
50 }
51 #endif
52 #ifndef PUT_UINT32_BE
53 #define PUT_UINT32_BE(n,b,i) {				\
54 	(b)[(i)    ] = (unsigned char) ( (n) >> 24 );	\
55 	(b)[(i) + 1] = (unsigned char) ( (n) >> 16 );	\
56 	(b)[(i) + 2] = (unsigned char) ( (n) >>  8 );	\
57 	(b)[(i) + 3] = (unsigned char) ( (n)       );	\
58 }
59 #endif
60 
61 /*
62  * SHA-1 context setup
63  */
64 void sha1_starts (sha1_context * ctx)
65 {
66 	ctx->total[0] = 0;
67 	ctx->total[1] = 0;
68 
69 	ctx->state[0] = 0x67452301;
70 	ctx->state[1] = 0xEFCDAB89;
71 	ctx->state[2] = 0x98BADCFE;
72 	ctx->state[3] = 0x10325476;
73 	ctx->state[4] = 0xC3D2E1F0;
74 }
75 
76 static void sha1_process(sha1_context *ctx, const unsigned char data[64])
77 {
78 	unsigned long temp, W[16], A, B, C, D, E;
79 
80 	GET_UINT32_BE (W[0], data, 0);
81 	GET_UINT32_BE (W[1], data, 4);
82 	GET_UINT32_BE (W[2], data, 8);
83 	GET_UINT32_BE (W[3], data, 12);
84 	GET_UINT32_BE (W[4], data, 16);
85 	GET_UINT32_BE (W[5], data, 20);
86 	GET_UINT32_BE (W[6], data, 24);
87 	GET_UINT32_BE (W[7], data, 28);
88 	GET_UINT32_BE (W[8], data, 32);
89 	GET_UINT32_BE (W[9], data, 36);
90 	GET_UINT32_BE (W[10], data, 40);
91 	GET_UINT32_BE (W[11], data, 44);
92 	GET_UINT32_BE (W[12], data, 48);
93 	GET_UINT32_BE (W[13], data, 52);
94 	GET_UINT32_BE (W[14], data, 56);
95 	GET_UINT32_BE (W[15], data, 60);
96 
97 #define S(x,n)	((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
98 
99 #define R(t) (						\
100 	temp = W[(t -  3) & 0x0F] ^ W[(t - 8) & 0x0F] ^	\
101 	       W[(t - 14) & 0x0F] ^ W[ t      & 0x0F],	\
102 	( W[t & 0x0F] = S(temp,1) )			\
103 )
104 
105 #define P(a,b,c,d,e,x)	{				\
106 	e += S(a,5) + F(b,c,d) + K + x; b = S(b,30);	\
107 }
108 
109 	A = ctx->state[0];
110 	B = ctx->state[1];
111 	C = ctx->state[2];
112 	D = ctx->state[3];
113 	E = ctx->state[4];
114 
115 #define F(x,y,z) (z ^ (x & (y ^ z)))
116 #define K 0x5A827999
117 
118 	P (A, B, C, D, E, W[0]);
119 	P (E, A, B, C, D, W[1]);
120 	P (D, E, A, B, C, W[2]);
121 	P (C, D, E, A, B, W[3]);
122 	P (B, C, D, E, A, W[4]);
123 	P (A, B, C, D, E, W[5]);
124 	P (E, A, B, C, D, W[6]);
125 	P (D, E, A, B, C, W[7]);
126 	P (C, D, E, A, B, W[8]);
127 	P (B, C, D, E, A, W[9]);
128 	P (A, B, C, D, E, W[10]);
129 	P (E, A, B, C, D, W[11]);
130 	P (D, E, A, B, C, W[12]);
131 	P (C, D, E, A, B, W[13]);
132 	P (B, C, D, E, A, W[14]);
133 	P (A, B, C, D, E, W[15]);
134 	P (E, A, B, C, D, R (16));
135 	P (D, E, A, B, C, R (17));
136 	P (C, D, E, A, B, R (18));
137 	P (B, C, D, E, A, R (19));
138 
139 #undef K
140 #undef F
141 
142 #define F(x,y,z) (x ^ y ^ z)
143 #define K 0x6ED9EBA1
144 
145 	P (A, B, C, D, E, R (20));
146 	P (E, A, B, C, D, R (21));
147 	P (D, E, A, B, C, R (22));
148 	P (C, D, E, A, B, R (23));
149 	P (B, C, D, E, A, R (24));
150 	P (A, B, C, D, E, R (25));
151 	P (E, A, B, C, D, R (26));
152 	P (D, E, A, B, C, R (27));
153 	P (C, D, E, A, B, R (28));
154 	P (B, C, D, E, A, R (29));
155 	P (A, B, C, D, E, R (30));
156 	P (E, A, B, C, D, R (31));
157 	P (D, E, A, B, C, R (32));
158 	P (C, D, E, A, B, R (33));
159 	P (B, C, D, E, A, R (34));
160 	P (A, B, C, D, E, R (35));
161 	P (E, A, B, C, D, R (36));
162 	P (D, E, A, B, C, R (37));
163 	P (C, D, E, A, B, R (38));
164 	P (B, C, D, E, A, R (39));
165 
166 #undef K
167 #undef F
168 
169 #define F(x,y,z) ((x & y) | (z & (x | y)))
170 #define K 0x8F1BBCDC
171 
172 	P (A, B, C, D, E, R (40));
173 	P (E, A, B, C, D, R (41));
174 	P (D, E, A, B, C, R (42));
175 	P (C, D, E, A, B, R (43));
176 	P (B, C, D, E, A, R (44));
177 	P (A, B, C, D, E, R (45));
178 	P (E, A, B, C, D, R (46));
179 	P (D, E, A, B, C, R (47));
180 	P (C, D, E, A, B, R (48));
181 	P (B, C, D, E, A, R (49));
182 	P (A, B, C, D, E, R (50));
183 	P (E, A, B, C, D, R (51));
184 	P (D, E, A, B, C, R (52));
185 	P (C, D, E, A, B, R (53));
186 	P (B, C, D, E, A, R (54));
187 	P (A, B, C, D, E, R (55));
188 	P (E, A, B, C, D, R (56));
189 	P (D, E, A, B, C, R (57));
190 	P (C, D, E, A, B, R (58));
191 	P (B, C, D, E, A, R (59));
192 
193 #undef K
194 #undef F
195 
196 #define F(x,y,z) (x ^ y ^ z)
197 #define K 0xCA62C1D6
198 
199 	P (A, B, C, D, E, R (60));
200 	P (E, A, B, C, D, R (61));
201 	P (D, E, A, B, C, R (62));
202 	P (C, D, E, A, B, R (63));
203 	P (B, C, D, E, A, R (64));
204 	P (A, B, C, D, E, R (65));
205 	P (E, A, B, C, D, R (66));
206 	P (D, E, A, B, C, R (67));
207 	P (C, D, E, A, B, R (68));
208 	P (B, C, D, E, A, R (69));
209 	P (A, B, C, D, E, R (70));
210 	P (E, A, B, C, D, R (71));
211 	P (D, E, A, B, C, R (72));
212 	P (C, D, E, A, B, R (73));
213 	P (B, C, D, E, A, R (74));
214 	P (A, B, C, D, E, R (75));
215 	P (E, A, B, C, D, R (76));
216 	P (D, E, A, B, C, R (77));
217 	P (C, D, E, A, B, R (78));
218 	P (B, C, D, E, A, R (79));
219 
220 #undef K
221 #undef F
222 
223 	ctx->state[0] += A;
224 	ctx->state[1] += B;
225 	ctx->state[2] += C;
226 	ctx->state[3] += D;
227 	ctx->state[4] += E;
228 }
229 
230 /*
231  * SHA-1 process buffer
232  */
233 void sha1_update(sha1_context *ctx, const unsigned char *input,
234 		 unsigned int ilen)
235 {
236 	int fill;
237 	unsigned long left;
238 
239 	if (ilen <= 0)
240 		return;
241 
242 	left = ctx->total[0] & 0x3F;
243 	fill = 64 - left;
244 
245 	ctx->total[0] += ilen;
246 	ctx->total[0] &= 0xFFFFFFFF;
247 
248 	if (ctx->total[0] < (unsigned long) ilen)
249 		ctx->total[1]++;
250 
251 	if (left && ilen >= fill) {
252 		memcpy ((void *) (ctx->buffer + left), (void *) input, fill);
253 		sha1_process (ctx, ctx->buffer);
254 		input += fill;
255 		ilen -= fill;
256 		left = 0;
257 	}
258 
259 	while (ilen >= 64) {
260 		sha1_process (ctx, input);
261 		input += 64;
262 		ilen -= 64;
263 	}
264 
265 	if (ilen > 0) {
266 		memcpy ((void *) (ctx->buffer + left), (void *) input, ilen);
267 	}
268 }
269 
270 static const unsigned char sha1_padding[64] = {
271 	0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
272 	   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
273 	   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
274 	   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
275 };
276 
277 /*
278  * SHA-1 final digest
279  */
280 void sha1_finish (sha1_context * ctx, unsigned char output[20])
281 {
282 	unsigned long last, padn;
283 	unsigned long high, low;
284 	unsigned char msglen[8];
285 
286 	high = (ctx->total[0] >> 29)
287 		| (ctx->total[1] << 3);
288 	low = (ctx->total[0] << 3);
289 
290 	PUT_UINT32_BE (high, msglen, 0);
291 	PUT_UINT32_BE (low, msglen, 4);
292 
293 	last = ctx->total[0] & 0x3F;
294 	padn = (last < 56) ? (56 - last) : (120 - last);
295 
296 	sha1_update (ctx, (unsigned char *) sha1_padding, padn);
297 	sha1_update (ctx, msglen, 8);
298 
299 	PUT_UINT32_BE (ctx->state[0], output, 0);
300 	PUT_UINT32_BE (ctx->state[1], output, 4);
301 	PUT_UINT32_BE (ctx->state[2], output, 8);
302 	PUT_UINT32_BE (ctx->state[3], output, 12);
303 	PUT_UINT32_BE (ctx->state[4], output, 16);
304 }
305 
306 /*
307  * Output = SHA-1( input buffer )
308  */
309 void sha1_csum(const unsigned char *input, unsigned int ilen,
310 	       unsigned char *output)
311 {
312 	sha1_context ctx;
313 
314 	sha1_starts (&ctx);
315 	sha1_update (&ctx, input, ilen);
316 	sha1_finish (&ctx, output);
317 }
318 
319 /*
320  * Output = SHA-1( input buffer ). Trigger the watchdog every 'chunk_sz'
321  * bytes of input processed.
322  */
323 void sha1_csum_wd(const unsigned char *input, unsigned int ilen,
324 		  unsigned char *output, unsigned int chunk_sz)
325 {
326 	sha1_context ctx;
327 #if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
328 	const unsigned char *end, *curr;
329 	int chunk;
330 #endif
331 
332 	sha1_starts (&ctx);
333 
334 #if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
335 	curr = input;
336 	end = input + ilen;
337 	while (curr < end) {
338 		chunk = end - curr;
339 		if (chunk > chunk_sz)
340 			chunk = chunk_sz;
341 		sha1_update (&ctx, curr, chunk);
342 		curr += chunk;
343 		WATCHDOG_RESET ();
344 	}
345 #else
346 	sha1_update (&ctx, input, ilen);
347 #endif
348 
349 	sha1_finish (&ctx, output);
350 }
351 
352 /*
353  * Output = HMAC-SHA-1( input buffer, hmac key )
354  */
355 void sha1_hmac(const unsigned char *key, int keylen,
356 	       const unsigned char *input, unsigned int ilen,
357 	       unsigned char *output)
358 {
359 	int i;
360 	sha1_context ctx;
361 	unsigned char k_ipad[64];
362 	unsigned char k_opad[64];
363 	unsigned char tmpbuf[20];
364 
365 	memset (k_ipad, 0x36, 64);
366 	memset (k_opad, 0x5C, 64);
367 
368 	for (i = 0; i < keylen; i++) {
369 		if (i >= 64)
370 			break;
371 
372 		k_ipad[i] ^= key[i];
373 		k_opad[i] ^= key[i];
374 	}
375 
376 	sha1_starts (&ctx);
377 	sha1_update (&ctx, k_ipad, 64);
378 	sha1_update (&ctx, input, ilen);
379 	sha1_finish (&ctx, tmpbuf);
380 
381 	sha1_starts (&ctx);
382 	sha1_update (&ctx, k_opad, 64);
383 	sha1_update (&ctx, tmpbuf, 20);
384 	sha1_finish (&ctx, output);
385 
386 	memset (k_ipad, 0, 64);
387 	memset (k_opad, 0, 64);
388 	memset (tmpbuf, 0, 20);
389 	memset (&ctx, 0, sizeof (sha1_context));
390 }
391 
392 static const char _sha1_src[] = "_sha1_src";
393 
394 #ifdef SELF_TEST
395 /*
396  * FIPS-180-1 test vectors
397  */
398 static const char sha1_test_str[3][57] = {
399 	{"abc"},
400 	{"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"},
401 	{""}
402 };
403 
404 static const unsigned char sha1_test_sum[3][20] = {
405 	{0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, 0xBA, 0x3E,
406 	 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, 0x9C, 0xD0, 0xD8, 0x9D},
407 	{0x84, 0x98, 0x3E, 0x44, 0x1C, 0x3B, 0xD2, 0x6E, 0xBA, 0xAE,
408 	 0x4A, 0xA1, 0xF9, 0x51, 0x29, 0xE5, 0xE5, 0x46, 0x70, 0xF1},
409 	{0x34, 0xAA, 0x97, 0x3C, 0xD4, 0xC4, 0xDA, 0xA4, 0xF6, 0x1E,
410 	 0xEB, 0x2B, 0xDB, 0xAD, 0x27, 0x31, 0x65, 0x34, 0x01, 0x6F}
411 };
412 
413 /*
414  * Checkup routine
415  */
416 int sha1_self_test (void)
417 {
418 	int i, j;
419 	unsigned char buf[1000];
420 	unsigned char sha1sum[20];
421 	sha1_context ctx;
422 
423 	for (i = 0; i < 3; i++) {
424 		printf ("  SHA-1 test #%d: ", i + 1);
425 
426 		sha1_starts (&ctx);
427 
428 		if (i < 2)
429 			sha1_update (&ctx, (unsigned char *) sha1_test_str[i],
430 				     strlen (sha1_test_str[i]));
431 		else {
432 			memset (buf, 'a', 1000);
433 			for (j = 0; j < 1000; j++)
434 				sha1_update (&ctx, buf, 1000);
435 		}
436 
437 		sha1_finish (&ctx, sha1sum);
438 
439 		if (memcmp (sha1sum, sha1_test_sum[i], 20) != 0) {
440 			printf ("failed\n");
441 			return (1);
442 		}
443 
444 		printf ("passed\n");
445 	}
446 
447 	printf ("\n");
448 	return (0);
449 }
450 #else
451 int sha1_self_test (void)
452 {
453 	return (0);
454 }
455 #endif
456