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