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 "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  */
sha1_starts(sha1_context * ctx)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 
sha1_process(sha1_context * ctx,unsigned char data[64])76 static void sha1_process (sha1_context * ctx, 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  */
sha1_update(sha1_context * ctx,unsigned char * input,int ilen)233 void sha1_update (sha1_context * ctx, unsigned char *input, int ilen)
234 {
235 	int fill;
236 	unsigned long left;
237 
238 	if (ilen <= 0)
239 		return;
240 
241 	left = ctx->total[0] & 0x3F;
242 	fill = 64 - left;
243 
244 	ctx->total[0] += ilen;
245 	ctx->total[0] &= 0xFFFFFFFF;
246 
247 	if (ctx->total[0] < (unsigned long) ilen)
248 		ctx->total[1]++;
249 
250 	if (left && ilen >= fill) {
251 		memcpy ((void *) (ctx->buffer + left), (void *) input, fill);
252 		sha1_process (ctx, ctx->buffer);
253 		input += fill;
254 		ilen -= fill;
255 		left = 0;
256 	}
257 
258 	while (ilen >= 64) {
259 		sha1_process (ctx, input);
260 		input += 64;
261 		ilen -= 64;
262 	}
263 
264 	if (ilen > 0) {
265 		memcpy ((void *) (ctx->buffer + left), (void *) input, ilen);
266 	}
267 }
268 
269 static const unsigned char sha1_padding[64] = {
270 	0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
271 	   0, 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 };
275 
276 /*
277  * SHA-1 final digest
278  */
sha1_finish(sha1_context * ctx,unsigned char output[20])279 void sha1_finish (sha1_context * ctx, unsigned char output[20])
280 {
281 	unsigned long last, padn;
282 	unsigned long high, low;
283 	unsigned char msglen[8];
284 
285 	high = (ctx->total[0] >> 29)
286 		| (ctx->total[1] << 3);
287 	low = (ctx->total[0] << 3);
288 
289 	PUT_UINT32_BE (high, msglen, 0);
290 	PUT_UINT32_BE (low, msglen, 4);
291 
292 	last = ctx->total[0] & 0x3F;
293 	padn = (last < 56) ? (56 - last) : (120 - last);
294 
295 	sha1_update (ctx, (unsigned char *) sha1_padding, padn);
296 	sha1_update (ctx, msglen, 8);
297 
298 	PUT_UINT32_BE (ctx->state[0], output, 0);
299 	PUT_UINT32_BE (ctx->state[1], output, 4);
300 	PUT_UINT32_BE (ctx->state[2], output, 8);
301 	PUT_UINT32_BE (ctx->state[3], output, 12);
302 	PUT_UINT32_BE (ctx->state[4], output, 16);
303 }
304 
305 /*
306  * Output = SHA-1( input buffer )
307  */
sha1_csum(unsigned char * input,int ilen,unsigned char output[20])308 void sha1_csum (unsigned char *input, int ilen, unsigned char output[20])
309 {
310 	sha1_context ctx;
311 
312 	sha1_starts (&ctx);
313 	sha1_update (&ctx, input, ilen);
314 	sha1_finish (&ctx, output);
315 }
316 
317 /*
318  * Output = SHA-1( input buffer ). Trigger the watchdog every 'chunk_sz'
319  * bytes of input processed.
320  */
sha1_csum_wd(unsigned char * input,int ilen,unsigned char output[20],unsigned int chunk_sz)321 void sha1_csum_wd (unsigned char *input, int ilen, unsigned char output[20],
322 			unsigned int chunk_sz)
323 {
324 	sha1_context ctx;
325 #if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
326 	unsigned char *end, *curr;
327 	int chunk;
328 #endif
329 
330 	sha1_starts (&ctx);
331 
332 #if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
333 	curr = input;
334 	end = input + ilen;
335 	while (curr < end) {
336 		chunk = end - curr;
337 		if (chunk > chunk_sz)
338 			chunk = chunk_sz;
339 		sha1_update (&ctx, curr, chunk);
340 		curr += chunk;
341 		WATCHDOG_RESET ();
342 	}
343 #else
344 	sha1_update (&ctx, input, ilen);
345 #endif
346 
347 	sha1_finish (&ctx, output);
348 }
349 
350 /*
351  * Output = HMAC-SHA-1( input buffer, hmac key )
352  */
sha1_hmac(unsigned char * key,int keylen,unsigned char * input,int ilen,unsigned char output[20])353 void sha1_hmac (unsigned char *key, int keylen,
354 		unsigned char *input, int ilen, unsigned char output[20])
355 {
356 	int i;
357 	sha1_context ctx;
358 	unsigned char k_ipad[64];
359 	unsigned char k_opad[64];
360 	unsigned char tmpbuf[20];
361 
362 	memset (k_ipad, 0x36, 64);
363 	memset (k_opad, 0x5C, 64);
364 
365 	for (i = 0; i < keylen; i++) {
366 		if (i >= 64)
367 			break;
368 
369 		k_ipad[i] ^= key[i];
370 		k_opad[i] ^= key[i];
371 	}
372 
373 	sha1_starts (&ctx);
374 	sha1_update (&ctx, k_ipad, 64);
375 	sha1_update (&ctx, input, ilen);
376 	sha1_finish (&ctx, tmpbuf);
377 
378 	sha1_starts (&ctx);
379 	sha1_update (&ctx, k_opad, 64);
380 	sha1_update (&ctx, tmpbuf, 20);
381 	sha1_finish (&ctx, output);
382 
383 	memset (k_ipad, 0, 64);
384 	memset (k_opad, 0, 64);
385 	memset (tmpbuf, 0, 20);
386 	memset (&ctx, 0, sizeof (sha1_context));
387 }
388 
389 static const char _sha1_src[] = "_sha1_src";
390 
391 #ifdef SELF_TEST
392 /*
393  * FIPS-180-1 test vectors
394  */
395 static const char sha1_test_str[3][57] = {
396 	{"abc"},
397 	{"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"},
398 	{""}
399 };
400 
401 static const unsigned char sha1_test_sum[3][20] = {
402 	{0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, 0xBA, 0x3E,
403 	 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, 0x9C, 0xD0, 0xD8, 0x9D},
404 	{0x84, 0x98, 0x3E, 0x44, 0x1C, 0x3B, 0xD2, 0x6E, 0xBA, 0xAE,
405 	 0x4A, 0xA1, 0xF9, 0x51, 0x29, 0xE5, 0xE5, 0x46, 0x70, 0xF1},
406 	{0x34, 0xAA, 0x97, 0x3C, 0xD4, 0xC4, 0xDA, 0xA4, 0xF6, 0x1E,
407 	 0xEB, 0x2B, 0xDB, 0xAD, 0x27, 0x31, 0x65, 0x34, 0x01, 0x6F}
408 };
409 
410 /*
411  * Checkup routine
412  */
sha1_self_test(void)413 int sha1_self_test (void)
414 {
415 	int i, j;
416 	unsigned char buf[1000];
417 	unsigned char sha1sum[20];
418 	sha1_context ctx;
419 
420 	for (i = 0; i < 3; i++) {
421 		printf ("  SHA-1 test #%d: ", i + 1);
422 
423 		sha1_starts (&ctx);
424 
425 		if (i < 2)
426 			sha1_update (&ctx, (unsigned char *) sha1_test_str[i],
427 				     strlen (sha1_test_str[i]));
428 		else {
429 			memset (buf, 'a', 1000);
430 			for (j = 0; j < 1000; j++)
431 				sha1_update (&ctx, buf, 1000);
432 		}
433 
434 		sha1_finish (&ctx, sha1sum);
435 
436 		if (memcmp (sha1sum, sha1_test_sum[i], 20) != 0) {
437 			printf ("failed\n");
438 			return (1);
439 		}
440 
441 		printf ("passed\n");
442 	}
443 
444 	printf ("\n");
445 	return (0);
446 }
447 #else
sha1_self_test(void)448 int sha1_self_test (void)
449 {
450 	return (0);
451 }
452 #endif
453