libopkg: do not clobber package flags during parsing
[project/opkg-lede.git] / libopkg / sha256.c
1 /* sha256.c - Functions to compute SHA256 and SHA224 message digest of files or
2 memory blocks according to the NIST specification FIPS-180-2.
3
4 Copyright (C) 2005, 2006, 2008 Free Software Foundation, Inc.
5
6 This program is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
18
19 /* Written by David Madore, considerably copypasting from
20 Scott G. Miller's sha1.c
21 */
22
23 #include <config.h>
24
25 #include "sha256.h"
26
27 #include <stddef.h>
28 #include <string.h>
29
30 #if USE_UNLOCKED_IO
31 #include "unlocked-io.h"
32 #endif
33
34 #ifdef WORDS_BIGENDIAN
35 #define SWAP(n) (n)
36 #else
37 #define SWAP(n) \
38 (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
39 #endif
40
41 #define BLOCKSIZE 4096
42 #if BLOCKSIZE % 64 != 0
43 #error "invalid BLOCKSIZE"
44 #endif
45
46 /* This array contains the bytes used to pad the buffer to the next
47 64-byte boundary. */
48 static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
49
50 /*
51 Takes a pointer to a 256 bit block of data (eight 32 bit ints) and
52 intializes it to the start constants of the SHA256 algorithm. This
53 must be called before using hash in the call to sha256_hash
54 */
55 void sha256_init_ctx(struct sha256_ctx *ctx)
56 {
57 ctx->state[0] = 0x6a09e667UL;
58 ctx->state[1] = 0xbb67ae85UL;
59 ctx->state[2] = 0x3c6ef372UL;
60 ctx->state[3] = 0xa54ff53aUL;
61 ctx->state[4] = 0x510e527fUL;
62 ctx->state[5] = 0x9b05688cUL;
63 ctx->state[6] = 0x1f83d9abUL;
64 ctx->state[7] = 0x5be0cd19UL;
65
66 ctx->total[0] = ctx->total[1] = 0;
67 ctx->buflen = 0;
68 }
69
70 void sha224_init_ctx(struct sha256_ctx *ctx)
71 {
72 ctx->state[0] = 0xc1059ed8UL;
73 ctx->state[1] = 0x367cd507UL;
74 ctx->state[2] = 0x3070dd17UL;
75 ctx->state[3] = 0xf70e5939UL;
76 ctx->state[4] = 0xffc00b31UL;
77 ctx->state[5] = 0x68581511UL;
78 ctx->state[6] = 0x64f98fa7UL;
79 ctx->state[7] = 0xbefa4fa4UL;
80
81 ctx->total[0] = ctx->total[1] = 0;
82 ctx->buflen = 0;
83 }
84
85 /* Copy the value from v into the memory location pointed to by *cp,
86 If your architecture allows unaligned access this is equivalent to
87 * (uint32_t *) cp = v */
88 static inline void set_uint32(char *cp, uint32_t v)
89 {
90 memcpy(cp, &v, sizeof v);
91 }
92
93 /* Put result from CTX in first 32 bytes following RESBUF. The result
94 must be in little endian byte order. */
95 void *sha256_read_ctx(const struct sha256_ctx *ctx, void *resbuf)
96 {
97 int i;
98 char *r = resbuf;
99
100 for (i = 0; i < 8; i++)
101 set_uint32(r + i * sizeof ctx->state[0], SWAP(ctx->state[i]));
102
103 return resbuf;
104 }
105
106 void *sha224_read_ctx(const struct sha256_ctx *ctx, void *resbuf)
107 {
108 int i;
109 char *r = resbuf;
110
111 for (i = 0; i < 7; i++)
112 set_uint32(r + i * sizeof ctx->state[0], SWAP(ctx->state[i]));
113
114 return resbuf;
115 }
116
117 /* Process the remaining bytes in the internal buffer and the usual
118 prolog according to the standard and write the result to RESBUF. */
119 static void sha256_conclude_ctx(struct sha256_ctx *ctx)
120 {
121 /* Take yet unprocessed bytes into account. */
122 size_t bytes = ctx->buflen;
123 size_t size = (bytes < 56) ? 64 / 4 : 64 * 2 / 4;
124
125 /* Now count remaining bytes. */
126 ctx->total[0] += bytes;
127 if (ctx->total[0] < bytes)
128 ++ctx->total[1];
129
130 /* Put the 64-bit file length in *bits* at the end of the buffer.
131 Use set_uint32 rather than a simple assignment, to avoid risk of
132 unaligned access. */
133 set_uint32((char *)&ctx->buffer[size - 2],
134 SWAP((ctx->total[1] << 3) | (ctx->total[0] >> 29)));
135 set_uint32((char *)&ctx->buffer[size - 1], SWAP(ctx->total[0] << 3));
136
137 memcpy(&((char *)ctx->buffer)[bytes], fillbuf, (size - 2) * 4 - bytes);
138
139 /* Process last bytes. */
140 sha256_process_block(ctx->buffer, size * 4, ctx);
141 }
142
143 void *sha256_finish_ctx(struct sha256_ctx *ctx, void *resbuf)
144 {
145 sha256_conclude_ctx(ctx);
146 return sha256_read_ctx(ctx, resbuf);
147 }
148
149 void *sha224_finish_ctx(struct sha256_ctx *ctx, void *resbuf)
150 {
151 sha256_conclude_ctx(ctx);
152 return sha224_read_ctx(ctx, resbuf);
153 }
154
155 /* Compute SHA256 message digest for bytes read from STREAM. The
156 resulting message digest number will be written into the 32 bytes
157 beginning at RESBLOCK. */
158 int sha256_stream(FILE * stream, void *resblock)
159 {
160 struct sha256_ctx ctx;
161 char buffer[BLOCKSIZE + 72];
162 size_t sum;
163
164 /* Initialize the computation context. */
165 sha256_init_ctx(&ctx);
166
167 /* Iterate over full file contents. */
168 while (1) {
169 /* We read the file in blocks of BLOCKSIZE bytes. One call of the
170 computation function processes the whole buffer so that with the
171 next round of the loop another block can be read. */
172 size_t n;
173 sum = 0;
174
175 /* Read block. Take care for partial reads. */
176 while (1) {
177 n = fread(buffer + sum, 1, BLOCKSIZE - sum, stream);
178
179 sum += n;
180
181 if (sum == BLOCKSIZE)
182 break;
183
184 if (n == 0) {
185 /* Check for the error flag IFF N == 0, so that we don't
186 exit the loop after a partial read due to e.g., EAGAIN
187 or EWOULDBLOCK. */
188 if (ferror(stream))
189 return 1;
190 goto process_partial_block;
191 }
192
193 /* We've read at least one byte, so ignore errors. But always
194 check for EOF, since feof may be true even though N > 0.
195 Otherwise, we could end up calling fread after EOF. */
196 if (feof(stream))
197 goto process_partial_block;
198 }
199
200 /* Process buffer with BLOCKSIZE bytes. Note that
201 BLOCKSIZE % 64 == 0
202 */
203 sha256_process_block(buffer, BLOCKSIZE, &ctx);
204 }
205
206 process_partial_block:;
207
208 /* Process any remaining bytes. */
209 if (sum > 0)
210 sha256_process_bytes(buffer, sum, &ctx);
211
212 /* Construct result in desired memory. */
213 sha256_finish_ctx(&ctx, resblock);
214 return 0;
215 }
216
217 /* FIXME: Avoid code duplication */
218 int sha224_stream(FILE * stream, void *resblock)
219 {
220 struct sha256_ctx ctx;
221 char buffer[BLOCKSIZE + 72];
222 size_t sum;
223
224 /* Initialize the computation context. */
225 sha224_init_ctx(&ctx);
226
227 /* Iterate over full file contents. */
228 while (1) {
229 /* We read the file in blocks of BLOCKSIZE bytes. One call of the
230 computation function processes the whole buffer so that with the
231 next round of the loop another block can be read. */
232 size_t n;
233 sum = 0;
234
235 /* Read block. Take care for partial reads. */
236 while (1) {
237 n = fread(buffer + sum, 1, BLOCKSIZE - sum, stream);
238
239 sum += n;
240
241 if (sum == BLOCKSIZE)
242 break;
243
244 if (n == 0) {
245 /* Check for the error flag IFF N == 0, so that we don't
246 exit the loop after a partial read due to e.g., EAGAIN
247 or EWOULDBLOCK. */
248 if (ferror(stream))
249 return 1;
250 goto process_partial_block;
251 }
252
253 /* We've read at least one byte, so ignore errors. But always
254 check for EOF, since feof may be true even though N > 0.
255 Otherwise, we could end up calling fread after EOF. */
256 if (feof(stream))
257 goto process_partial_block;
258 }
259
260 /* Process buffer with BLOCKSIZE bytes. Note that
261 BLOCKSIZE % 64 == 0
262 */
263 sha256_process_block(buffer, BLOCKSIZE, &ctx);
264 }
265
266 process_partial_block:;
267
268 /* Process any remaining bytes. */
269 if (sum > 0)
270 sha256_process_bytes(buffer, sum, &ctx);
271
272 /* Construct result in desired memory. */
273 sha224_finish_ctx(&ctx, resblock);
274 return 0;
275 }
276
277 /* Compute SHA512 message digest for LEN bytes beginning at BUFFER. The
278 result is always in little endian byte order, so that a byte-wise
279 output yields to the wanted ASCII representation of the message
280 digest. */
281 void *sha256_buffer(const char *buffer, size_t len, void *resblock)
282 {
283 struct sha256_ctx ctx;
284
285 /* Initialize the computation context. */
286 sha256_init_ctx(&ctx);
287
288 /* Process whole buffer but last len % 64 bytes. */
289 sha256_process_bytes(buffer, len, &ctx);
290
291 /* Put result in desired memory area. */
292 return sha256_finish_ctx(&ctx, resblock);
293 }
294
295 void *sha224_buffer(const char *buffer, size_t len, void *resblock)
296 {
297 struct sha256_ctx ctx;
298
299 /* Initialize the computation context. */
300 sha224_init_ctx(&ctx);
301
302 /* Process whole buffer but last len % 64 bytes. */
303 sha256_process_bytes(buffer, len, &ctx);
304
305 /* Put result in desired memory area. */
306 return sha224_finish_ctx(&ctx, resblock);
307 }
308
309 void
310 sha256_process_bytes(const void *buffer, size_t len, struct sha256_ctx *ctx)
311 {
312 /* When we already have some bits in our internal buffer concatenate
313 both inputs first. */
314 if (ctx->buflen != 0) {
315 size_t left_over = ctx->buflen;
316 size_t add = 128 - left_over > len ? len : 128 - left_over;
317
318 memcpy(&((char *)ctx->buffer)[left_over], buffer, add);
319 ctx->buflen += add;
320
321 if (ctx->buflen > 64) {
322 sha256_process_block(ctx->buffer, ctx->buflen & ~63,
323 ctx);
324
325 ctx->buflen &= 63;
326 /* The regions in the following copy operation cannot overlap. */
327 memcpy(ctx->buffer,
328 &((char *)ctx->buffer)[(left_over + add) & ~63],
329 ctx->buflen);
330 }
331
332 buffer = (const char *)buffer + add;
333 len -= add;
334 }
335
336 /* Process available complete blocks. */
337 if (len >= 64) {
338 #if !_STRING_ARCH_unaligned
339 #define alignof(type) offsetof (struct { char c; type x; }, x)
340 #define UNALIGNED_P(p) (((size_t) p) % alignof (uint32_t) != 0)
341 if (UNALIGNED_P(buffer))
342 while (len > 64) {
343 sha256_process_block(memcpy
344 (ctx->buffer, buffer, 64),
345 64, ctx);
346 buffer = (const char *)buffer + 64;
347 len -= 64;
348 } else
349 #endif
350 {
351 sha256_process_block(buffer, len & ~63, ctx);
352 buffer = (const char *)buffer + (len & ~63);
353 len &= 63;
354 }
355 }
356
357 /* Move remaining bytes in internal buffer. */
358 if (len > 0) {
359 size_t left_over = ctx->buflen;
360
361 memcpy(&((char *)ctx->buffer)[left_over], buffer, len);
362 left_over += len;
363 if (left_over >= 64) {
364 sha256_process_block(ctx->buffer, 64, ctx);
365 left_over -= 64;
366 memcpy(ctx->buffer, &ctx->buffer[16], left_over);
367 }
368 ctx->buflen = left_over;
369 }
370 }
371
372 /* --- Code below is the primary difference between sha1.c and sha256.c --- */
373
374 /* SHA256 round constants */
375 #define K(I) sha256_round_constants[I]
376 static const uint32_t sha256_round_constants[64] = {
377 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
378 0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
379 0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
380 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
381 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
382 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
383 0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
384 0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
385 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
386 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
387 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
388 0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
389 0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
390 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
391 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
392 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL,
393 };
394
395 /* Round functions. */
396 #define F2(A,B,C) ( ( A & B ) | ( C & ( A | B ) ) )
397 #define F1(E,F,G) ( G ^ ( E & ( F ^ G ) ) )
398
399 /* Process LEN bytes of BUFFER, accumulating context into CTX.
400 It is assumed that LEN % 64 == 0.
401 Most of this code comes from GnuPG's cipher/sha1.c. */
402
403 void
404 sha256_process_block(const void *buffer, size_t len, struct sha256_ctx *ctx)
405 {
406 const uint32_t *words = buffer;
407 size_t nwords = len / sizeof(uint32_t);
408 const uint32_t *endp = words + nwords;
409 uint32_t x[16];
410 uint32_t a = ctx->state[0];
411 uint32_t b = ctx->state[1];
412 uint32_t c = ctx->state[2];
413 uint32_t d = ctx->state[3];
414 uint32_t e = ctx->state[4];
415 uint32_t f = ctx->state[5];
416 uint32_t g = ctx->state[6];
417 uint32_t h = ctx->state[7];
418
419 /* First increment the byte count. FIPS PUB 180-2 specifies the possible
420 length of the file up to 2^64 bits. Here we only compute the
421 number of bytes. Do a double word increment. */
422 ctx->total[0] += len;
423 if (ctx->total[0] < len)
424 ++ctx->total[1];
425
426 #define rol(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
427 #define S0(x) (rol(x,25)^rol(x,14)^(x>>3))
428 #define S1(x) (rol(x,15)^rol(x,13)^(x>>10))
429 #define SS0(x) (rol(x,30)^rol(x,19)^rol(x,10))
430 #define SS1(x) (rol(x,26)^rol(x,21)^rol(x,7))
431
432 #define M(I) ( tm = S1(x[(I-2)&0x0f]) + x[(I-7)&0x0f] \
433 + S0(x[(I-15)&0x0f]) + x[I&0x0f] \
434 , x[I&0x0f] = tm )
435
436 #define R(A,B,C,D,E,F,G,H,K,M) do { t0 = SS0(A) + F2(A,B,C); \
437 t1 = H + SS1(E) \
438 + F1(E,F,G) \
439 + K \
440 + M; \
441 D += t1; H = t0 + t1; \
442 } while(0)
443
444 while (words < endp) {
445 uint32_t tm;
446 uint32_t t0, t1;
447 int t;
448 /* FIXME: see sha1.c for a better implementation. */
449 for (t = 0; t < 16; t++) {
450 x[t] = SWAP(*words);
451 words++;
452 }
453
454 R(a, b, c, d, e, f, g, h, K(0), x[0]);
455 R(h, a, b, c, d, e, f, g, K(1), x[1]);
456 R(g, h, a, b, c, d, e, f, K(2), x[2]);
457 R(f, g, h, a, b, c, d, e, K(3), x[3]);
458 R(e, f, g, h, a, b, c, d, K(4), x[4]);
459 R(d, e, f, g, h, a, b, c, K(5), x[5]);
460 R(c, d, e, f, g, h, a, b, K(6), x[6]);
461 R(b, c, d, e, f, g, h, a, K(7), x[7]);
462 R(a, b, c, d, e, f, g, h, K(8), x[8]);
463 R(h, a, b, c, d, e, f, g, K(9), x[9]);
464 R(g, h, a, b, c, d, e, f, K(10), x[10]);
465 R(f, g, h, a, b, c, d, e, K(11), x[11]);
466 R(e, f, g, h, a, b, c, d, K(12), x[12]);
467 R(d, e, f, g, h, a, b, c, K(13), x[13]);
468 R(c, d, e, f, g, h, a, b, K(14), x[14]);
469 R(b, c, d, e, f, g, h, a, K(15), x[15]);
470 R(a, b, c, d, e, f, g, h, K(16), M(16));
471 R(h, a, b, c, d, e, f, g, K(17), M(17));
472 R(g, h, a, b, c, d, e, f, K(18), M(18));
473 R(f, g, h, a, b, c, d, e, K(19), M(19));
474 R(e, f, g, h, a, b, c, d, K(20), M(20));
475 R(d, e, f, g, h, a, b, c, K(21), M(21));
476 R(c, d, e, f, g, h, a, b, K(22), M(22));
477 R(b, c, d, e, f, g, h, a, K(23), M(23));
478 R(a, b, c, d, e, f, g, h, K(24), M(24));
479 R(h, a, b, c, d, e, f, g, K(25), M(25));
480 R(g, h, a, b, c, d, e, f, K(26), M(26));
481 R(f, g, h, a, b, c, d, e, K(27), M(27));
482 R(e, f, g, h, a, b, c, d, K(28), M(28));
483 R(d, e, f, g, h, a, b, c, K(29), M(29));
484 R(c, d, e, f, g, h, a, b, K(30), M(30));
485 R(b, c, d, e, f, g, h, a, K(31), M(31));
486 R(a, b, c, d, e, f, g, h, K(32), M(32));
487 R(h, a, b, c, d, e, f, g, K(33), M(33));
488 R(g, h, a, b, c, d, e, f, K(34), M(34));
489 R(f, g, h, a, b, c, d, e, K(35), M(35));
490 R(e, f, g, h, a, b, c, d, K(36), M(36));
491 R(d, e, f, g, h, a, b, c, K(37), M(37));
492 R(c, d, e, f, g, h, a, b, K(38), M(38));
493 R(b, c, d, e, f, g, h, a, K(39), M(39));
494 R(a, b, c, d, e, f, g, h, K(40), M(40));
495 R(h, a, b, c, d, e, f, g, K(41), M(41));
496 R(g, h, a, b, c, d, e, f, K(42), M(42));
497 R(f, g, h, a, b, c, d, e, K(43), M(43));
498 R(e, f, g, h, a, b, c, d, K(44), M(44));
499 R(d, e, f, g, h, a, b, c, K(45), M(45));
500 R(c, d, e, f, g, h, a, b, K(46), M(46));
501 R(b, c, d, e, f, g, h, a, K(47), M(47));
502 R(a, b, c, d, e, f, g, h, K(48), M(48));
503 R(h, a, b, c, d, e, f, g, K(49), M(49));
504 R(g, h, a, b, c, d, e, f, K(50), M(50));
505 R(f, g, h, a, b, c, d, e, K(51), M(51));
506 R(e, f, g, h, a, b, c, d, K(52), M(52));
507 R(d, e, f, g, h, a, b, c, K(53), M(53));
508 R(c, d, e, f, g, h, a, b, K(54), M(54));
509 R(b, c, d, e, f, g, h, a, K(55), M(55));
510 R(a, b, c, d, e, f, g, h, K(56), M(56));
511 R(h, a, b, c, d, e, f, g, K(57), M(57));
512 R(g, h, a, b, c, d, e, f, K(58), M(58));
513 R(f, g, h, a, b, c, d, e, K(59), M(59));
514 R(e, f, g, h, a, b, c, d, K(60), M(60));
515 R(d, e, f, g, h, a, b, c, K(61), M(61));
516 R(c, d, e, f, g, h, a, b, K(62), M(62));
517 R(b, c, d, e, f, g, h, a, K(63), M(63));
518
519 a = ctx->state[0] += a;
520 b = ctx->state[1] += b;
521 c = ctx->state[2] += c;
522 d = ctx->state[3] += d;
523 e = ctx->state[4] += e;
524 f = ctx->state[5] += f;
525 g = ctx->state[6] += g;
526 h = ctx->state[7] += h;
527 }
528 }