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