]> git.karo-electronics.de Git - karo-tx-uboot.git/blob - lib/sha1.c
dm: add entries to Kconfig
[karo-tx-uboot.git] / lib / sha1.c
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 #ifdef SELF_TEST
393 /*
394  * FIPS-180-1 test vectors
395  */
396 static const char sha1_test_str[3][57] = {
397         {"abc"},
398         {"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"},
399         {""}
400 };
401
402 static const unsigned char sha1_test_sum[3][20] = {
403         {0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, 0xBA, 0x3E,
404          0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, 0x9C, 0xD0, 0xD8, 0x9D},
405         {0x84, 0x98, 0x3E, 0x44, 0x1C, 0x3B, 0xD2, 0x6E, 0xBA, 0xAE,
406          0x4A, 0xA1, 0xF9, 0x51, 0x29, 0xE5, 0xE5, 0x46, 0x70, 0xF1},
407         {0x34, 0xAA, 0x97, 0x3C, 0xD4, 0xC4, 0xDA, 0xA4, 0xF6, 0x1E,
408          0xEB, 0x2B, 0xDB, 0xAD, 0x27, 0x31, 0x65, 0x34, 0x01, 0x6F}
409 };
410
411 /*
412  * Checkup routine
413  */
414 int sha1_self_test (void)
415 {
416         int i, j;
417         unsigned char buf[1000];
418         unsigned char sha1sum[20];
419         sha1_context ctx;
420
421         for (i = 0; i < 3; i++) {
422                 printf ("  SHA-1 test #%d: ", i + 1);
423
424                 sha1_starts (&ctx);
425
426                 if (i < 2)
427                         sha1_update (&ctx, (unsigned char *) sha1_test_str[i],
428                                      strlen (sha1_test_str[i]));
429                 else {
430                         memset (buf, 'a', 1000);
431                         for (j = 0; j < 1000; j++)
432                                 sha1_update (&ctx, buf, 1000);
433                 }
434
435                 sha1_finish (&ctx, sha1sum);
436
437                 if (memcmp (sha1sum, sha1_test_sum[i], 20) != 0) {
438                         printf ("failed\n");
439                         return (1);
440                 }
441
442                 printf ("passed\n");
443         }
444
445         printf ("\n");
446         return (0);
447 }
448 #else
449 int sha1_self_test (void)
450 {
451         return (0);
452 }
453 #endif