]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - lib/sha1.c
arm:at91-boards: remove console_init_f where unnecessary
[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 "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, 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, 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  */
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  */
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  */
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  */
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  */
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
448 int sha1_self_test (void)
449 {
450         return (0);
451 }
452 #endif