source: rtems-libbsd/freebsd/sys/crypto/sha2/sha2.c @ 04762cf

55-freebsd-126-freebsd-12freebsd-9.3
Last change on this file since 04762cf was 04762cf, checked in by Sebastian Huber <sebastian.huber@…>, on 04/27/16 at 08:28:49

Directly use <machine/endian.h> provided by Newlib

  • Property mode set to 100644
File size: 30.4 KB
Line 
1#include <machine/rtems-bsd-kernel-space.h>
2
3/*      $KAME: sha2.c,v 1.8 2001/11/08 01:07:52 itojun Exp $    */
4
5/*
6 * sha2.c
7 *
8 * Version 1.0.0beta1
9 *
10 * Written by Aaron D. Gifford <me@aarongifford.com>
11 *
12 * Copyright 2000 Aaron D. Gifford.  All rights reserved.
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions
16 * are met:
17 * 1. Redistributions of source code must retain the above copyright
18 *    notice, this list of conditions and the following disclaimer.
19 * 2. Redistributions in binary form must reproduce the above copyright
20 *    notice, this list of conditions and the following disclaimer in the
21 *    documentation and/or other materials provided with the distribution.
22 * 3. Neither the name of the copyright holder nor the names of contributors
23 *    may be used to endorse or promote products derived from this software
24 *    without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) AND CONTRIBUTOR(S) ``AS IS'' AND
27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR(S) OR CONTRIBUTOR(S) BE LIABLE
30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * SUCH DAMAGE.
37 */
38
39#include <sys/cdefs.h>
40__FBSDID("$FreeBSD$");
41
42#include <sys/types.h>
43#include <sys/time.h>
44#ifdef _KERNEL
45#include <sys/systm.h>
46#else
47#include <string.h>
48#endif
49#include <machine/endian.h>
50#include <crypto/sha2/sha2.h>
51
52/*
53 * ASSERT NOTE:
54 * Some sanity checking code is included using assert().  On my FreeBSD
55 * system, this additional code can be removed by compiling with NDEBUG
56 * defined.  Check your own systems manpage on assert() to see how to
57 * compile WITHOUT the sanity checking code on your system.
58 *
59 * UNROLLED TRANSFORM LOOP NOTE:
60 * You can define SHA2_UNROLL_TRANSFORM to use the unrolled transform
61 * loop version for the hash transform rounds (defined using macros
62 * later in this file).  Either define on the command line, for example:
63 *
64 *   cc -DSHA2_UNROLL_TRANSFORM -o sha2 sha2.c sha2prog.c
65 *
66 * or define below:
67 *
68 *   #define SHA2_UNROLL_TRANSFORM
69 *
70 */
71
72#if defined(__bsdi__) || defined(__FreeBSD__)
73#define assert(x)
74#endif
75
76
77/*** SHA-256/384/512 Machine Architecture Definitions *****************/
78/*
79 * BYTE_ORDER NOTE:
80 *
81 * Please make sure that your system defines BYTE_ORDER.  If your
82 * architecture is little-endian, make sure it also defines
83 * LITTLE_ENDIAN and that the two (BYTE_ORDER and LITTLE_ENDIAN) are
84 * equivilent.
85 *
86 * If your system does not define the above, then you can do so by
87 * hand like this:
88 *
89 *   #define LITTLE_ENDIAN 1234
90 *   #define BIG_ENDIAN    4321
91 *
92 * And for little-endian machines, add:
93 *
94 *   #define BYTE_ORDER LITTLE_ENDIAN
95 *
96 * Or for big-endian machines:
97 *
98 *   #define BYTE_ORDER BIG_ENDIAN
99 *
100 * The FreeBSD machine this was written on defines BYTE_ORDER
101 * appropriately by including <sys/types.h> (which in turn includes
102 * <machine/endian.h> where the appropriate definitions are actually
103 * made).
104 */
105#if !defined(BYTE_ORDER) || (BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN)
106#error Define BYTE_ORDER to be equal to either LITTLE_ENDIAN or BIG_ENDIAN
107#endif
108
109/*
110 * Define the followingsha2_* types to types of the correct length on
111 * the native archtecture.   Most BSD systems and Linux define u_intXX_t
112 * types.  Machines with very recent ANSI C headers, can use the
113 * uintXX_t definintions from inttypes.h by defining SHA2_USE_INTTYPES_H
114 * during compile or in the sha.h header file.
115 *
116 * Machines that support neither u_intXX_t nor inttypes.h's uintXX_t
117 * will need to define these three typedefs below (and the appropriate
118 * ones in sha.h too) by hand according to their system architecture.
119 *
120 * Thank you, Jun-ichiro itojun Hagino, for suggesting using u_intXX_t
121 * types and pointing out recent ANSI C support for uintXX_t in inttypes.h.
122 */
123#if 0 /*def SHA2_USE_INTTYPES_H*/
124
125typedef uint8_t  sha2_byte;     /* Exactly 1 byte */
126typedef uint32_t sha2_word32;   /* Exactly 4 bytes */
127typedef uint64_t sha2_word64;   /* Exactly 8 bytes */
128
129#else /* SHA2_USE_INTTYPES_H */
130
131typedef u_int8_t  sha2_byte;    /* Exactly 1 byte */
132typedef u_int32_t sha2_word32;  /* Exactly 4 bytes */
133typedef u_int64_t sha2_word64;  /* Exactly 8 bytes */
134
135#endif /* SHA2_USE_INTTYPES_H */
136
137
138/*** SHA-256/384/512 Various Length Definitions ***********************/
139/* NOTE: Most of these are in sha2.h */
140#define SHA256_SHORT_BLOCK_LENGTH       (SHA256_BLOCK_LENGTH - 8)
141#define SHA384_SHORT_BLOCK_LENGTH       (SHA384_BLOCK_LENGTH - 16)
142#define SHA512_SHORT_BLOCK_LENGTH       (SHA512_BLOCK_LENGTH - 16)
143
144
145/*** ENDIAN REVERSAL MACROS *******************************************/
146#if BYTE_ORDER == LITTLE_ENDIAN
147#define REVERSE32(w,x)  { \
148        sha2_word32 tmp = (w); \
149        tmp = (tmp >> 16) | (tmp << 16); \
150        (x) = ((tmp & 0xff00ff00UL) >> 8) | ((tmp & 0x00ff00ffUL) << 8); \
151}
152#define REVERSE64(w,x)  { \
153        sha2_word64 tmp = (w); \
154        tmp = (tmp >> 32) | (tmp << 32); \
155        tmp = ((tmp & 0xff00ff00ff00ff00ULL) >> 8) | \
156              ((tmp & 0x00ff00ff00ff00ffULL) << 8); \
157        (x) = ((tmp & 0xffff0000ffff0000ULL) >> 16) | \
158              ((tmp & 0x0000ffff0000ffffULL) << 16); \
159}
160#endif /* BYTE_ORDER == LITTLE_ENDIAN */
161
162/*
163 * Macro for incrementally adding the unsigned 64-bit integer n to the
164 * unsigned 128-bit integer (represented using a two-element array of
165 * 64-bit words):
166 */
167#define ADDINC128(w,n)  { \
168        (w)[0] += (sha2_word64)(n); \
169        if ((w)[0] < (n)) { \
170                (w)[1]++; \
171        } \
172}
173
174/*** THE SIX LOGICAL FUNCTIONS ****************************************/
175/*
176 * Bit shifting and rotation (used by the six SHA-XYZ logical functions:
177 *
178 *   NOTE:  The naming of R and S appears backwards here (R is a SHIFT and
179 *   S is a ROTATION) because the SHA-256/384/512 description document
180 *   (see http://csrc.nist.gov/cryptval/shs/sha256-384-512.pdf) uses this
181 *   same "backwards" definition.
182 */
183/* Shift-right (used in SHA-256, SHA-384, and SHA-512): */
184#define R(b,x)          ((x) >> (b))
185/* 32-bit Rotate-right (used in SHA-256): */
186#define S32(b,x)        (((x) >> (b)) | ((x) << (32 - (b))))
187/* 64-bit Rotate-right (used in SHA-384 and SHA-512): */
188#define S64(b,x)        (((x) >> (b)) | ((x) << (64 - (b))))
189
190/* Two of six logical functions used in SHA-256, SHA-384, and SHA-512: */
191#define Ch(x,y,z)       (((x) & (y)) ^ ((~(x)) & (z)))
192#define Maj(x,y,z)      (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
193
194/* Four of six logical functions used in SHA-256: */
195#define Sigma0_256(x)   (S32(2,  (x)) ^ S32(13, (x)) ^ S32(22, (x)))
196#define Sigma1_256(x)   (S32(6,  (x)) ^ S32(11, (x)) ^ S32(25, (x)))
197#define sigma0_256(x)   (S32(7,  (x)) ^ S32(18, (x)) ^ R(3 ,   (x)))
198#define sigma1_256(x)   (S32(17, (x)) ^ S32(19, (x)) ^ R(10,   (x)))
199
200/* Four of six logical functions used in SHA-384 and SHA-512: */
201#define Sigma0_512(x)   (S64(28, (x)) ^ S64(34, (x)) ^ S64(39, (x)))
202#define Sigma1_512(x)   (S64(14, (x)) ^ S64(18, (x)) ^ S64(41, (x)))
203#define sigma0_512(x)   (S64( 1, (x)) ^ S64( 8, (x)) ^ R( 7,   (x)))
204#define sigma1_512(x)   (S64(19, (x)) ^ S64(61, (x)) ^ R( 6,   (x)))
205
206/*** INTERNAL FUNCTION PROTOTYPES *************************************/
207/* NOTE: These should not be accessed directly from outside this
208 * library -- they are intended for private internal visibility/use
209 * only.
210 */
211static void SHA512_Last(SHA512_CTX*);
212static void SHA256_Transform(SHA256_CTX*, const sha2_word32*);
213static void SHA512_Transform(SHA512_CTX*, const sha2_word64*);
214
215
216/*** SHA-XYZ INITIAL HASH VALUES AND CONSTANTS ************************/
217/* Hash constant words K for SHA-256: */
218static const sha2_word32 K256[64] = {
219        0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
220        0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
221        0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
222        0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
223        0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
224        0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
225        0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
226        0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
227        0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
228        0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
229        0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
230        0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
231        0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
232        0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
233        0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
234        0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
235};
236
237/* Initial hash value H for SHA-256: */
238static const sha2_word32 sha256_initial_hash_value[8] = {
239        0x6a09e667UL,
240        0xbb67ae85UL,
241        0x3c6ef372UL,
242        0xa54ff53aUL,
243        0x510e527fUL,
244        0x9b05688cUL,
245        0x1f83d9abUL,
246        0x5be0cd19UL
247};
248
249/* Hash constant words K for SHA-384 and SHA-512: */
250static const sha2_word64 K512[80] = {
251        0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,
252        0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
253        0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
254        0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
255        0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,
256        0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
257        0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,
258        0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
259        0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
260        0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
261        0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,
262        0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
263        0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,
264        0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
265        0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
266        0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
267        0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,
268        0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
269        0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,
270        0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
271        0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
272        0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
273        0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,
274        0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
275        0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,
276        0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
277        0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
278        0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
279        0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,
280        0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
281        0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,
282        0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
283        0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
284        0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
285        0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,
286        0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
287        0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,
288        0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
289        0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
290        0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL
291};
292
293/* Initial hash value H for SHA-384 */
294static const sha2_word64 sha384_initial_hash_value[8] = {
295        0xcbbb9d5dc1059ed8ULL,
296        0x629a292a367cd507ULL,
297        0x9159015a3070dd17ULL,
298        0x152fecd8f70e5939ULL,
299        0x67332667ffc00b31ULL,
300        0x8eb44a8768581511ULL,
301        0xdb0c2e0d64f98fa7ULL,
302        0x47b5481dbefa4fa4ULL
303};
304
305/* Initial hash value H for SHA-512 */
306static const sha2_word64 sha512_initial_hash_value[8] = {
307        0x6a09e667f3bcc908ULL,
308        0xbb67ae8584caa73bULL,
309        0x3c6ef372fe94f82bULL,
310        0xa54ff53a5f1d36f1ULL,
311        0x510e527fade682d1ULL,
312        0x9b05688c2b3e6c1fULL,
313        0x1f83d9abfb41bd6bULL,
314        0x5be0cd19137e2179ULL
315};
316
317/*
318 * Constant used by SHA256/384/512_End() functions for converting the
319 * digest to a readable hexadecimal character string:
320 */
321static const char *sha2_hex_digits = "0123456789abcdef";
322
323
324/*** SHA-256: *********************************************************/
325void SHA256_Init(SHA256_CTX* context) {
326        if (context == (SHA256_CTX*)0) {
327                return;
328        }
329        bcopy(sha256_initial_hash_value, context->state, SHA256_DIGEST_LENGTH);
330        bzero(context->buffer, SHA256_BLOCK_LENGTH);
331        context->bitcount = 0;
332}
333
334#ifdef SHA2_UNROLL_TRANSFORM
335
336/* Unrolled SHA-256 round macros: */
337
338#if BYTE_ORDER == LITTLE_ENDIAN
339
340#define ROUND256_0_TO_15(a,b,c,d,e,f,g,h)       \
341        REVERSE32(*data++, W256[j]); \
342        T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + \
343             K256[j] + W256[j]; \
344        (d) += T1; \
345        (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
346        j++
347
348
349#else /* BYTE_ORDER == LITTLE_ENDIAN */
350
351#define ROUND256_0_TO_15(a,b,c,d,e,f,g,h)       \
352        T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + \
353             K256[j] + (W256[j] = *data++); \
354        (d) += T1; \
355        (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
356        j++
357
358#endif /* BYTE_ORDER == LITTLE_ENDIAN */
359
360#define ROUND256(a,b,c,d,e,f,g,h)       \
361        s0 = W256[(j+1)&0x0f]; \
362        s0 = sigma0_256(s0); \
363        s1 = W256[(j+14)&0x0f]; \
364        s1 = sigma1_256(s1); \
365        T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + K256[j] + \
366             (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0); \
367        (d) += T1; \
368        (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
369        j++
370
371static void SHA256_Transform(SHA256_CTX* context, const sha2_word32* data) {
372        sha2_word32     a, b, c, d, e, f, g, h, s0, s1;
373        sha2_word32     T1, *W256;
374        int             j;
375
376        W256 = (sha2_word32*)context->buffer;
377
378        /* Initialize registers with the prev. intermediate value */
379        a = context->state[0];
380        b = context->state[1];
381        c = context->state[2];
382        d = context->state[3];
383        e = context->state[4];
384        f = context->state[5];
385        g = context->state[6];
386        h = context->state[7];
387
388        j = 0;
389        do {
390                /* Rounds 0 to 15 (unrolled): */
391                ROUND256_0_TO_15(a,b,c,d,e,f,g,h);
392                ROUND256_0_TO_15(h,a,b,c,d,e,f,g);
393                ROUND256_0_TO_15(g,h,a,b,c,d,e,f);
394                ROUND256_0_TO_15(f,g,h,a,b,c,d,e);
395                ROUND256_0_TO_15(e,f,g,h,a,b,c,d);
396                ROUND256_0_TO_15(d,e,f,g,h,a,b,c);
397                ROUND256_0_TO_15(c,d,e,f,g,h,a,b);
398                ROUND256_0_TO_15(b,c,d,e,f,g,h,a);
399        } while (j < 16);
400
401        /* Now for the remaining rounds to 64: */
402        do {
403                ROUND256(a,b,c,d,e,f,g,h);
404                ROUND256(h,a,b,c,d,e,f,g);
405                ROUND256(g,h,a,b,c,d,e,f);
406                ROUND256(f,g,h,a,b,c,d,e);
407                ROUND256(e,f,g,h,a,b,c,d);
408                ROUND256(d,e,f,g,h,a,b,c);
409                ROUND256(c,d,e,f,g,h,a,b);
410                ROUND256(b,c,d,e,f,g,h,a);
411        } while (j < 64);
412
413        /* Compute the current intermediate hash value */
414        context->state[0] += a;
415        context->state[1] += b;
416        context->state[2] += c;
417        context->state[3] += d;
418        context->state[4] += e;
419        context->state[5] += f;
420        context->state[6] += g;
421        context->state[7] += h;
422
423        /* Clean up */
424        a = b = c = d = e = f = g = h = T1 = 0;
425}
426
427#else /* SHA2_UNROLL_TRANSFORM */
428
429static void SHA256_Transform(SHA256_CTX* context, const sha2_word32* data) {
430        sha2_word32     a, b, c, d, e, f, g, h, s0, s1;
431        sha2_word32     T1, T2, *W256;
432        int             j;
433
434        W256 = (sha2_word32*)context->buffer;
435
436        /* Initialize registers with the prev. intermediate value */
437        a = context->state[0];
438        b = context->state[1];
439        c = context->state[2];
440        d = context->state[3];
441        e = context->state[4];
442        f = context->state[5];
443        g = context->state[6];
444        h = context->state[7];
445
446        j = 0;
447        do {
448#if BYTE_ORDER == LITTLE_ENDIAN
449                /* Copy data while converting to host byte order */
450                REVERSE32(*data++,W256[j]);
451                /* Apply the SHA-256 compression function to update a..h */
452                T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + W256[j];
453#else /* BYTE_ORDER == LITTLE_ENDIAN */
454                /* Apply the SHA-256 compression function to update a..h with copy */
455                T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + (W256[j] = *data++);
456#endif /* BYTE_ORDER == LITTLE_ENDIAN */
457                T2 = Sigma0_256(a) + Maj(a, b, c);
458                h = g;
459                g = f;
460                f = e;
461                e = d + T1;
462                d = c;
463                c = b;
464                b = a;
465                a = T1 + T2;
466
467                j++;
468        } while (j < 16);
469
470        do {
471                /* Part of the message block expansion: */
472                s0 = W256[(j+1)&0x0f];
473                s0 = sigma0_256(s0);
474                s1 = W256[(j+14)&0x0f];
475                s1 = sigma1_256(s1);
476
477                /* Apply the SHA-256 compression function to update a..h */
478                T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] +
479                     (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0);
480                T2 = Sigma0_256(a) + Maj(a, b, c);
481                h = g;
482                g = f;
483                f = e;
484                e = d + T1;
485                d = c;
486                c = b;
487                b = a;
488                a = T1 + T2;
489
490                j++;
491        } while (j < 64);
492
493        /* Compute the current intermediate hash value */
494        context->state[0] += a;
495        context->state[1] += b;
496        context->state[2] += c;
497        context->state[3] += d;
498        context->state[4] += e;
499        context->state[5] += f;
500        context->state[6] += g;
501        context->state[7] += h;
502
503        /* Clean up */
504        a = b = c = d = e = f = g = h = T1 = T2 = 0;
505}
506
507#endif /* SHA2_UNROLL_TRANSFORM */
508
509void SHA256_Update(SHA256_CTX* context, const sha2_byte *data, size_t len) {
510        unsigned int    freespace, usedspace;
511
512        if (len == 0) {
513                /* Calling with no data is valid - we do nothing */
514                return;
515        }
516
517        /* Sanity check: */
518        assert(context != (SHA256_CTX*)0 && data != (sha2_byte*)0);
519
520        usedspace = (context->bitcount >> 3) % SHA256_BLOCK_LENGTH;
521        if (usedspace > 0) {
522                /* Calculate how much free space is available in the buffer */
523                freespace = SHA256_BLOCK_LENGTH - usedspace;
524
525                if (len >= freespace) {
526                        /* Fill the buffer completely and process it */
527                        bcopy(data, &context->buffer[usedspace], freespace);
528                        context->bitcount += freespace << 3;
529                        len -= freespace;
530                        data += freespace;
531                        SHA256_Transform(context, (sha2_word32*)context->buffer);
532                } else {
533                        /* The buffer is not yet full */
534                        bcopy(data, &context->buffer[usedspace], len);
535                        context->bitcount += len << 3;
536                        /* Clean up: */
537                        usedspace = freespace = 0;
538                        return;
539                }
540        }
541        while (len >= SHA256_BLOCK_LENGTH) {
542                /* Process as many complete blocks as we can */
543                SHA256_Transform(context, (const sha2_word32*)data);
544                context->bitcount += SHA256_BLOCK_LENGTH << 3;
545                len -= SHA256_BLOCK_LENGTH;
546                data += SHA256_BLOCK_LENGTH;
547        }
548        if (len > 0) {
549                /* There's left-overs, so save 'em */
550                bcopy(data, context->buffer, len);
551                context->bitcount += len << 3;
552        }
553        /* Clean up: */
554        usedspace = freespace = 0;
555}
556
557void SHA256_Final(sha2_byte digest[], SHA256_CTX* context) {
558        sha2_word32     *d = (sha2_word32*)digest;
559        unsigned int    usedspace;
560
561        /* Sanity check: */
562        assert(context != (SHA256_CTX*)0);
563
564        /* If no digest buffer is passed, we don't bother doing this: */
565        if (digest != (sha2_byte*)0) {
566                usedspace = (context->bitcount >> 3) % SHA256_BLOCK_LENGTH;
567#if BYTE_ORDER == LITTLE_ENDIAN
568                /* Convert FROM host byte order */
569                REVERSE64(context->bitcount,context->bitcount);
570#endif
571                if (usedspace > 0) {
572                        /* Begin padding with a 1 bit: */
573                        context->buffer[usedspace++] = 0x80;
574
575                        if (usedspace <= SHA256_SHORT_BLOCK_LENGTH) {
576                                /* Set-up for the last transform: */
577                                bzero(&context->buffer[usedspace], SHA256_SHORT_BLOCK_LENGTH - usedspace);
578                        } else {
579                                if (usedspace < SHA256_BLOCK_LENGTH) {
580                                        bzero(&context->buffer[usedspace], SHA256_BLOCK_LENGTH - usedspace);
581                                }
582                                /* Do second-to-last transform: */
583                                SHA256_Transform(context, (sha2_word32*)context->buffer);
584
585                                /* And set-up for the last transform: */
586                                bzero(context->buffer, SHA256_SHORT_BLOCK_LENGTH);
587                        }
588                } else {
589                        /* Set-up for the last transform: */
590                        bzero(context->buffer, SHA256_SHORT_BLOCK_LENGTH);
591
592                        /* Begin padding with a 1 bit: */
593                        *context->buffer = 0x80;
594                }
595                /* Set the bit count: */
596                *(sha2_word64*)&context->buffer[SHA256_SHORT_BLOCK_LENGTH] = context->bitcount;
597
598                /* Final transform: */
599                SHA256_Transform(context, (sha2_word32*)context->buffer);
600
601#if BYTE_ORDER == LITTLE_ENDIAN
602                {
603                        /* Convert TO host byte order */
604                        int     j;
605                        for (j = 0; j < 8; j++) {
606                                REVERSE32(context->state[j],context->state[j]);
607                                *d++ = context->state[j];
608                        }
609                }
610#else
611                bcopy(context->state, d, SHA256_DIGEST_LENGTH);
612#endif
613        }
614
615        /* Clean up state data: */
616        bzero(context, sizeof(*context));
617        usedspace = 0;
618}
619
620char *SHA256_End(SHA256_CTX* context, char buffer[]) {
621        sha2_byte       digest[SHA256_DIGEST_LENGTH], *d = digest;
622        int             i;
623
624        /* Sanity check: */
625        assert(context != (SHA256_CTX*)0);
626
627        if (buffer != (char*)0) {
628                SHA256_Final(digest, context);
629
630                for (i = 0; i < SHA256_DIGEST_LENGTH; i++) {
631                        *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
632                        *buffer++ = sha2_hex_digits[*d & 0x0f];
633                        d++;
634                }
635                *buffer = (char)0;
636        } else {
637                bzero(context, sizeof(*context));
638        }
639        bzero(digest, SHA256_DIGEST_LENGTH);
640        return buffer;
641}
642
643char* SHA256_Data(const sha2_byte* data, size_t len, char digest[SHA256_DIGEST_STRING_LENGTH]) {
644        SHA256_CTX      context;
645
646        SHA256_Init(&context);
647        SHA256_Update(&context, data, len);
648        return SHA256_End(&context, digest);
649}
650
651
652/*** SHA-512: *********************************************************/
653void SHA512_Init(SHA512_CTX* context) {
654        if (context == (SHA512_CTX*)0) {
655                return;
656        }
657        bcopy(sha512_initial_hash_value, context->state, SHA512_DIGEST_LENGTH);
658        bzero(context->buffer, SHA512_BLOCK_LENGTH);
659        context->bitcount[0] = context->bitcount[1] =  0;
660}
661
662#ifdef SHA2_UNROLL_TRANSFORM
663
664/* Unrolled SHA-512 round macros: */
665#if BYTE_ORDER == LITTLE_ENDIAN
666
667#define ROUND512_0_TO_15(a,b,c,d,e,f,g,h)       \
668        REVERSE64(*data++, W512[j]); \
669        T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + \
670             K512[j] + W512[j]; \
671        (d) += T1, \
672        (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)), \
673        j++
674
675
676#else /* BYTE_ORDER == LITTLE_ENDIAN */
677
678#define ROUND512_0_TO_15(a,b,c,d,e,f,g,h)       \
679        T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + \
680             K512[j] + (W512[j] = *data++); \
681        (d) += T1; \
682        (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)); \
683        j++
684
685#endif /* BYTE_ORDER == LITTLE_ENDIAN */
686
687#define ROUND512(a,b,c,d,e,f,g,h)       \
688        s0 = W512[(j+1)&0x0f]; \
689        s0 = sigma0_512(s0); \
690        s1 = W512[(j+14)&0x0f]; \
691        s1 = sigma1_512(s1); \
692        T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + K512[j] + \
693             (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0); \
694        (d) += T1; \
695        (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)); \
696        j++
697
698static void SHA512_Transform(SHA512_CTX* context, const sha2_word64* data) {
699        sha2_word64     a, b, c, d, e, f, g, h, s0, s1;
700        sha2_word64     T1, *W512 = (sha2_word64*)context->buffer;
701        int             j;
702
703        /* Initialize registers with the prev. intermediate value */
704        a = context->state[0];
705        b = context->state[1];
706        c = context->state[2];
707        d = context->state[3];
708        e = context->state[4];
709        f = context->state[5];
710        g = context->state[6];
711        h = context->state[7];
712
713        j = 0;
714        do {
715                ROUND512_0_TO_15(a,b,c,d,e,f,g,h);
716                ROUND512_0_TO_15(h,a,b,c,d,e,f,g);
717                ROUND512_0_TO_15(g,h,a,b,c,d,e,f);
718                ROUND512_0_TO_15(f,g,h,a,b,c,d,e);
719                ROUND512_0_TO_15(e,f,g,h,a,b,c,d);
720                ROUND512_0_TO_15(d,e,f,g,h,a,b,c);
721                ROUND512_0_TO_15(c,d,e,f,g,h,a,b);
722                ROUND512_0_TO_15(b,c,d,e,f,g,h,a);
723        } while (j < 16);
724
725        /* Now for the remaining rounds up to 79: */
726        do {
727                ROUND512(a,b,c,d,e,f,g,h);
728                ROUND512(h,a,b,c,d,e,f,g);
729                ROUND512(g,h,a,b,c,d,e,f);
730                ROUND512(f,g,h,a,b,c,d,e);
731                ROUND512(e,f,g,h,a,b,c,d);
732                ROUND512(d,e,f,g,h,a,b,c);
733                ROUND512(c,d,e,f,g,h,a,b);
734                ROUND512(b,c,d,e,f,g,h,a);
735        } while (j < 80);
736
737        /* Compute the current intermediate hash value */
738        context->state[0] += a;
739        context->state[1] += b;
740        context->state[2] += c;
741        context->state[3] += d;
742        context->state[4] += e;
743        context->state[5] += f;
744        context->state[6] += g;
745        context->state[7] += h;
746
747        /* Clean up */
748        a = b = c = d = e = f = g = h = T1 = 0;
749}
750
751#else /* SHA2_UNROLL_TRANSFORM */
752
753static void SHA512_Transform(SHA512_CTX* context, const sha2_word64* data) {
754        sha2_word64     a, b, c, d, e, f, g, h, s0, s1;
755        sha2_word64     T1 = 0, T2 = 0, *W512 = (sha2_word64*)context->buffer;
756        int             j;
757
758        /* Initialize registers with the prev. intermediate value */
759        a = context->state[0];
760        b = context->state[1];
761        c = context->state[2];
762        d = context->state[3];
763        e = context->state[4];
764        f = context->state[5];
765        g = context->state[6];
766        h = context->state[7];
767
768        j = 0;
769        do {
770#if BYTE_ORDER == LITTLE_ENDIAN
771                /* Convert TO host byte order */
772                REVERSE64(*data++, W512[j]);
773                /* Apply the SHA-512 compression function to update a..h */
774                T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + W512[j];
775#else /* BYTE_ORDER == LITTLE_ENDIAN */
776                /* Apply the SHA-512 compression function to update a..h with copy */
777                T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + (W512[j] = *data++);
778#endif /* BYTE_ORDER == LITTLE_ENDIAN */
779                T2 = Sigma0_512(a) + Maj(a, b, c);
780                h = g;
781                g = f;
782                f = e;
783                e = d + T1;
784                d = c;
785                c = b;
786                b = a;
787                a = T1 + T2;
788
789                j++;
790        } while (j < 16);
791
792        do {
793                /* Part of the message block expansion: */
794                s0 = W512[(j+1)&0x0f];
795                s0 = sigma0_512(s0);
796                s1 = W512[(j+14)&0x0f];
797                s1 =  sigma1_512(s1);
798
799                /* Apply the SHA-512 compression function to update a..h */
800                T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] +
801                     (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0);
802                T2 = Sigma0_512(a) + Maj(a, b, c);
803                h = g;
804                g = f;
805                f = e;
806                e = d + T1;
807                d = c;
808                c = b;
809                b = a;
810                a = T1 + T2;
811
812                j++;
813        } while (j < 80);
814
815        /* Compute the current intermediate hash value */
816        context->state[0] += a;
817        context->state[1] += b;
818        context->state[2] += c;
819        context->state[3] += d;
820        context->state[4] += e;
821        context->state[5] += f;
822        context->state[6] += g;
823        context->state[7] += h;
824
825        /* Clean up */
826        a = b = c = d = e = f = g = h = T1 = T2 = 0;
827}
828
829#endif /* SHA2_UNROLL_TRANSFORM */
830
831void SHA512_Update(SHA512_CTX* context, const sha2_byte *data, size_t len) {
832        unsigned int    freespace, usedspace;
833
834        if (len == 0) {
835                /* Calling with no data is valid - we do nothing */
836                return;
837        }
838
839        /* Sanity check: */
840        assert(context != (SHA512_CTX*)0 && data != (sha2_byte*)0);
841
842        usedspace = (context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH;
843        if (usedspace > 0) {
844                /* Calculate how much free space is available in the buffer */
845                freespace = SHA512_BLOCK_LENGTH - usedspace;
846
847                if (len >= freespace) {
848                        /* Fill the buffer completely and process it */
849                        bcopy(data, &context->buffer[usedspace], freespace);
850                        ADDINC128(context->bitcount, freespace << 3);
851                        len -= freespace;
852                        data += freespace;
853                        SHA512_Transform(context, (sha2_word64*)context->buffer);
854                } else {
855                        /* The buffer is not yet full */
856                        bcopy(data, &context->buffer[usedspace], len);
857                        ADDINC128(context->bitcount, len << 3);
858                        /* Clean up: */
859                        usedspace = freespace = 0;
860                        return;
861                }
862        }
863        while (len >= SHA512_BLOCK_LENGTH) {
864                /* Process as many complete blocks as we can */
865                SHA512_Transform(context, (const sha2_word64*)data);
866                ADDINC128(context->bitcount, SHA512_BLOCK_LENGTH << 3);
867                len -= SHA512_BLOCK_LENGTH;
868                data += SHA512_BLOCK_LENGTH;
869        }
870        if (len > 0) {
871                /* There's left-overs, so save 'em */
872                bcopy(data, context->buffer, len);
873                ADDINC128(context->bitcount, len << 3);
874        }
875        /* Clean up: */
876        usedspace = freespace = 0;
877}
878
879static void SHA512_Last(SHA512_CTX* context) {
880        unsigned int    usedspace;
881
882        usedspace = (context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH;
883#if BYTE_ORDER == LITTLE_ENDIAN
884        /* Convert FROM host byte order */
885        REVERSE64(context->bitcount[0],context->bitcount[0]);
886        REVERSE64(context->bitcount[1],context->bitcount[1]);
887#endif
888        if (usedspace > 0) {
889                /* Begin padding with a 1 bit: */
890                context->buffer[usedspace++] = 0x80;
891
892                if (usedspace <= SHA512_SHORT_BLOCK_LENGTH) {
893                        /* Set-up for the last transform: */
894                        bzero(&context->buffer[usedspace], SHA512_SHORT_BLOCK_LENGTH - usedspace);
895                } else {
896                        if (usedspace < SHA512_BLOCK_LENGTH) {
897                                bzero(&context->buffer[usedspace], SHA512_BLOCK_LENGTH - usedspace);
898                        }
899                        /* Do second-to-last transform: */
900                        SHA512_Transform(context, (sha2_word64*)context->buffer);
901
902                        /* And set-up for the last transform: */
903                        bzero(context->buffer, SHA512_BLOCK_LENGTH - 2);
904                }
905        } else {
906                /* Prepare for final transform: */
907                bzero(context->buffer, SHA512_SHORT_BLOCK_LENGTH);
908
909                /* Begin padding with a 1 bit: */
910                *context->buffer = 0x80;
911        }
912        /* Store the length of input data (in bits): */
913        *(sha2_word64*)&context->buffer[SHA512_SHORT_BLOCK_LENGTH] = context->bitcount[1];
914        *(sha2_word64*)&context->buffer[SHA512_SHORT_BLOCK_LENGTH+8] = context->bitcount[0];
915
916        /* Final transform: */
917        SHA512_Transform(context, (sha2_word64*)context->buffer);
918}
919
920void SHA512_Final(sha2_byte digest[], SHA512_CTX* context) {
921        sha2_word64     *d = (sha2_word64*)digest;
922
923        /* Sanity check: */
924        assert(context != (SHA512_CTX*)0);
925
926        /* If no digest buffer is passed, we don't bother doing this: */
927        if (digest != (sha2_byte*)0) {
928                SHA512_Last(context);
929
930                /* Save the hash data for output: */
931#if BYTE_ORDER == LITTLE_ENDIAN
932                {
933                        /* Convert TO host byte order */
934                        int     j;
935                        for (j = 0; j < 8; j++) {
936                                REVERSE64(context->state[j],context->state[j]);
937                                *d++ = context->state[j];
938                        }
939                }
940#else
941                bcopy(context->state, d, SHA512_DIGEST_LENGTH);
942#endif
943        }
944
945        /* Zero out state data */
946        bzero(context, sizeof(*context));
947}
948
949char *SHA512_End(SHA512_CTX* context, char buffer[]) {
950        sha2_byte       digest[SHA512_DIGEST_LENGTH], *d = digest;
951        int             i;
952
953        /* Sanity check: */
954        assert(context != (SHA512_CTX*)0);
955
956        if (buffer != (char*)0) {
957                SHA512_Final(digest, context);
958
959                for (i = 0; i < SHA512_DIGEST_LENGTH; i++) {
960                        *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
961                        *buffer++ = sha2_hex_digits[*d & 0x0f];
962                        d++;
963                }
964                *buffer = (char)0;
965        } else {
966                bzero(context, sizeof(*context));
967        }
968        bzero(digest, SHA512_DIGEST_LENGTH);
969        return buffer;
970}
971
972char* SHA512_Data(const sha2_byte* data, size_t len, char digest[SHA512_DIGEST_STRING_LENGTH]) {
973        SHA512_CTX      context;
974
975        SHA512_Init(&context);
976        SHA512_Update(&context, data, len);
977        return SHA512_End(&context, digest);
978}
979
980
981/*** SHA-384: *********************************************************/
982void SHA384_Init(SHA384_CTX* context) {
983        if (context == (SHA384_CTX*)0) {
984                return;
985        }
986        bcopy(sha384_initial_hash_value, context->state, SHA512_DIGEST_LENGTH);
987        bzero(context->buffer, SHA384_BLOCK_LENGTH);
988        context->bitcount[0] = context->bitcount[1] = 0;
989}
990
991void SHA384_Update(SHA384_CTX* context, const sha2_byte* data, size_t len) {
992        SHA512_Update((SHA512_CTX*)context, data, len);
993}
994
995void SHA384_Final(sha2_byte digest[], SHA384_CTX* context) {
996        sha2_word64     *d = (sha2_word64*)digest;
997
998        /* Sanity check: */
999        assert(context != (SHA384_CTX*)0);
1000
1001        /* If no digest buffer is passed, we don't bother doing this: */
1002        if (digest != (sha2_byte*)0) {
1003                SHA512_Last((SHA512_CTX*)context);
1004
1005                /* Save the hash data for output: */
1006#if BYTE_ORDER == LITTLE_ENDIAN
1007                {
1008                        /* Convert TO host byte order */
1009                        int     j;
1010                        for (j = 0; j < 6; j++) {
1011                                REVERSE64(context->state[j],context->state[j]);
1012                                *d++ = context->state[j];
1013                        }
1014                }
1015#else
1016                bcopy(context->state, d, SHA384_DIGEST_LENGTH);
1017#endif
1018        }
1019
1020        /* Zero out state data */
1021        bzero(context, sizeof(*context));
1022}
1023
1024char *SHA384_End(SHA384_CTX* context, char buffer[]) {
1025        sha2_byte       digest[SHA384_DIGEST_LENGTH], *d = digest;
1026        int             i;
1027
1028        /* Sanity check: */
1029        assert(context != (SHA384_CTX*)0);
1030
1031        if (buffer != (char*)0) {
1032                SHA384_Final(digest, context);
1033
1034                for (i = 0; i < SHA384_DIGEST_LENGTH; i++) {
1035                        *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
1036                        *buffer++ = sha2_hex_digits[*d & 0x0f];
1037                        d++;
1038                }
1039                *buffer = (char)0;
1040        } else {
1041                bzero(context, sizeof(*context));
1042        }
1043        bzero(digest, SHA384_DIGEST_LENGTH);
1044        return buffer;
1045}
1046
1047char* SHA384_Data(const sha2_byte* data, size_t len, char digest[SHA384_DIGEST_STRING_LENGTH]) {
1048        SHA384_CTX      context;
1049
1050        SHA384_Init(&context);
1051        SHA384_Update(&context, data, len);
1052        return SHA384_End(&context, digest);
1053}
1054
Note: See TracBrowser for help on using the repository browser.