• source navigation  • diff markup  • identifier search  • freetext search  • 

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

This page was automatically generated by LXR 0.3.1.  •  OpenWrt