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