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