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