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