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