/*	$OpenBSD: sha2.c,v 1.6 2004/05/03 02:57:36 millert Exp $	*/

/*
 * FILE:	sha2.c
 * AUTHOR:	Aaron D. Gifford <me@aarongifford.com>
 *
 * Copyright (c) 2000-2001, Aaron D. Gifford
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *	  notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *	  notice, this list of conditions and the following disclaimer in the
 *	  documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the copyright holder nor the names of contributors
 *	  may be used to endorse or promote products derived from this software
 *	  without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.	IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * $From: sha2.c,v 1.1 2001/11/08 00:01:51 adg Exp adg $
 *
 * contrib/pgcrypto/sha2.c
 */

#include <random/sha2.h>

/*** SHA-256/512 Various Length Definitions ***********************/
enum {
	SHA256ShortBlockLength = (SHA256BlockLength - 8),
	SHA512ShortBlockLength = (SHA512_block_length - 16)
};

/*
 * Macro for incrementally adding the unsigned 64-bit integer n to the
 * unsigned 128-bit integer (represented using a two-element array of
 * 64-bit words):
 */
#define ADDINC128(w, n)                                                        \
	{                                                                          \
		(w)[0] += (uint64_t)(n);                                               \
		if ((w)[0] < (n)) {                                                    \
			(w)[1]++;                                                          \
		}                                                                      \
	}

/*** THE SIX LOGICAL FUNCTIONS ****************************************/
/*
 * Bit shifting and rotation (used by the six SHA-XYZ logical functions:
 *
 *   NOTE:  The naming of R and S appears backwards here (R is a SHIFT and
 *   S is a ROTATION) because the SHA-256/384/512 description document
 *   (see http://csrc.nist.gov/cryptval/shs/sha256-384-512.pdf) uses this
 *   same "backwards" definition.
 */
/* Shift-right (used in SHA-256, SHA-384, and SHA-512): */
#define R(b, x) ((x) >> (b))
/* 32-bit Rotate-right (used in SHA-256): */
#define S32(b, x) (((x) >> (b)) | ((x) << (32 - (b))))
/* 64-bit Rotate-right (used in SHA-384 and SHA-512): */
#define S64(b, x) (((x) >> (b)) | ((x) << (64 - (b))))

/* Two of six logical functions used in SHA-256, SHA-384, and SHA-512: */
#define Ch(x, y, z) (((x) & (y)) ^ ((~(x)) & (z)))
#define Maj(x, y, z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))

/* Four of six logical functions used in SHA-256: */
#define Sigma0_256(x) (S32(2, (x)) ^ S32(13, (x)) ^ S32(22, (x)))
#define Sigma1_256(x) (S32(6, (x)) ^ S32(11, (x)) ^ S32(25, (x)))
#define sigma0_256(x) (S32(7, (x)) ^ S32(18, (x)) ^ R(3, (x)))
#define sigma1_256(x) (S32(17, (x)) ^ S32(19, (x)) ^ R(10, (x)))

/* Four of six logical functions used in SHA-384 and SHA-512: */
#define Sigma0_512(x) (S64(28, (x)) ^ S64(34, (x)) ^ S64(39, (x)))
#define Sigma1_512(x) (S64(14, (x)) ^ S64(18, (x)) ^ S64(41, (x)))
#define sigma0_512(x) (S64(1, (x)) ^ S64(8, (x)) ^ R(7, (x)))
#define sigma1_512(x) (S64(19, (x)) ^ S64(61, (x)) ^ R(6, (x)))

/*** INTERNAL FUNCTION PROTOTYPES *************************************/
/* NOTE: These should not be accessed directly from outside this
 * library -- they are intended for private internal visibility/use
 * only.
 */
static void SHA512_Last(SHA512Ctx *);
static void SHA256_Transform(SHA256Ctx *, const uint32_t *);
static void SHA512_Transform(SHA512Ctx *, const uint64_t *);

/*** SHA-XYZ INITIAL HASH VALUES AND CONSTANTS ************************/
/* Hash constant words K for SHA-256: */
const uint32_t K256[64] = {
	0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL,
	0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL,
	0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL,
	0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
	0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL,
	0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL,
	0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL,
	0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
	0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL,
	0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL,
	0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL,
	0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
	0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL};

/* Initial hash value H for SHA-224: */
const uint32_t sha224_initial_hash_value[8] = {
	0xc1059ed8UL, 0x367cd507UL, 0x3070dd17UL, 0xf70e5939UL,
	0xffc00b31UL, 0x68581511UL, 0x64f98fa7UL, 0xbefa4fa4UL};

/* Initial hash value H for SHA-256: */
static const uint32_t sha256_initial_hash_value[8] = {
	0x6a09e667UL, 0xbb67ae85UL, 0x3c6ef372UL, 0xa54ff53aUL,
	0x510e527fUL, 0x9b05688cUL, 0x1f83d9abUL, 0x5be0cd19UL};

/* Hash constant words K for SHA-384 and SHA-512: */
static const uint64_t K512[80] = {
	0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, 0xb5c0fbcfec4d3b2fULL,
	0xe9b5dba58189dbbcULL, 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
	0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL, 0xd807aa98a3030242ULL,
	0x12835b0145706fbeULL, 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
	0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, 0x9bdc06a725c71235ULL,
	0xc19bf174cf692694ULL, 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
	0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL, 0x2de92c6f592b0275ULL,
	0x4a7484aa6ea6e483ULL, 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
	0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, 0xb00327c898fb213fULL,
	0xbf597fc7beef0ee4ULL, 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
	0x06ca6351e003826fULL, 0x142929670a0e6e70ULL, 0x27b70a8546d22ffcULL,
	0x2e1b21385c26c926ULL, 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
	0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, 0x81c2c92e47edaee6ULL,
	0x92722c851482353bULL, 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
	0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL, 0xd192e819d6ef5218ULL,
	0xd69906245565a910ULL, 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
	0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, 0x2748774cdf8eeb99ULL,
	0x34b0bcb5e19b48a8ULL, 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
	0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL, 0x748f82ee5defb2fcULL,
	0x78a5636f43172f60ULL, 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
	0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, 0xbef9a3f7b2c67915ULL,
	0xc67178f2e372532bULL, 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
	0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL, 0x06f067aa72176fbaULL,
	0x0a637dc5a2c898a6ULL, 0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
	0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, 0x3c9ebe0a15c9bebcULL,
	0x431d67c49c100d4cULL, 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
	0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL};

/* Initial hash value H for SHA-384 */
static const uint64_t sha384_initial_hash_value[8] = {
	0xcbbb9d5dc1059ed8ULL, 0x629a292a367cd507ULL, 0x9159015a3070dd17ULL,
	0x152fecd8f70e5939ULL, 0x67332667ffc00b31ULL, 0x8eb44a8768581511ULL,
	0xdb0c2e0d64f98fa7ULL, 0x47b5481dbefa4fa4ULL};

/* Initial hash value H for SHA-512 */
static const uint64_t sha512_initial_hash_value[8] = {
	0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL, 0x3c6ef372fe94f82bULL,
	0xa54ff53a5f1d36f1ULL, 0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL,
	0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL};

/*** SHA-256: *********************************************************/
void SHA256_Init(SHA256Ctx *context)
{
	if (context == NULL)
		return;
	memmove(context->state, sha256_initial_hash_value, SHA256DigestLength);
	memset(context->buffer, 0, SHA256BlockLength);
	context->bitcount = 0;
}
static void SHA256_Transform(SHA256Ctx *context, const uint32_t *data)
{
	uint32_t a, b, c, d, e, f, g, h, s0, s1;
	uint32_t T1, T2, *W256;
	int j;

	W256 = (uint32_t *)context->buffer;

	/* Initialize registers with the prev. intermediate value */
	a = context->state[0];
	b = context->state[1];
	c = context->state[2];
	d = context->state[3];
	e = context->state[4];
	f = context->state[5];
	g = context->state[6];
	h = context->state[7];

	j = 0;
	do {
		W256[j] = (uint32_t)data[3] | ((uint32_t)data[2] << 8) |
				  ((uint32_t)data[1] << 16) | ((uint32_t)data[0] << 24);
		data += 4;
		/* Apply the SHA-256 compression function to update a..h */
		T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + W256[j];
		T2 = Sigma0_256(a) + Maj(a, b, c);
		h = g;
		g = f;
		f = e;
		e = d + T1;
		d = c;
		c = b;
		b = a;
		a = T1 + T2;

		j++;
	} while (j < 16);

	do {
		/* Part of the message block expansion: */
		s0 = W256[(j + 1) & 0x0f];
		s0 = sigma0_256(s0);
		s1 = W256[(j + 14) & 0x0f];
		s1 = sigma1_256(s1);

		/* Apply the SHA-256 compression function to update a..h */
		T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] +
			 (W256[j & 0x0f] += s1 + W256[(j + 9) & 0x0f] + s0);
		T2 = Sigma0_256(a) + Maj(a, b, c);
		h = g;
		g = f;
		f = e;
		e = d + T1;
		d = c;
		c = b;
		b = a;
		a = T1 + T2;

		j++;
	} while (j < 64);

	/* Compute the current intermediate hash value */
	context->state[0] += a;
	context->state[1] += b;
	context->state[2] += c;
	context->state[3] += d;
	context->state[4] += e;
	context->state[5] += f;
	context->state[6] += g;
	context->state[7] += h;

	/* Clean up */
	a = b = c = d = e = f = g = h = T1 = T2 = 0;
}

void SHA256_Update(SHA256Ctx *context, const uint8_t *data, size_t len)
{
	size_t freespace, usedspace;

	/* Calling with no data is valid (we do nothing) */
	if (len == 0)
		return;

	usedspace = (context->bitcount >> 3) % SHA256BlockLength;
	if (usedspace > 0) {
		/* Calculate how much free space is available in the buffer */
		freespace = SHA256BlockLength - usedspace;

		if (len >= freespace) {
			/* Fill the buffer completely and process it */
			memmove(&context->buffer[usedspace], data, freespace);
			context->bitcount += freespace << 3;
			len -= freespace;
			data += freespace;
			SHA256_Transform(context, (uint32_t *)context->buffer);
		} else {
			/* The buffer is not yet full */
			memmove(&context->buffer[usedspace], data, len);
			context->bitcount += len << 3;
			/* Clean up: */
			usedspace = freespace = 0;
			return;
		}
	}
	while (len >= SHA256BlockLength) {
		/* Process as many complete blocks as we can */
		SHA256_Transform(context, (const uint32_t *)data);
		context->bitcount += SHA256BlockLength << 3;
		len -= SHA256BlockLength;
		data += SHA256BlockLength;
	}
	if (len > 0) {
		/* There's left-overs, so save 'em */
		memmove(context->buffer, data, len);
		context->bitcount += len << 3;
	}
	/* Clean up: */
	usedspace = freespace = 0;
}

static void SHA256_Last(SHA256Ctx *context)
{
	unsigned int usedspace;

	usedspace = (context->bitcount >> 3) % SHA256BlockLength;

	if (usedspace > 0) {
		/* Begin padding with a 1 bit: */
		context->buffer[usedspace++] = 0x80;

		if (usedspace <= SHA256ShortBlockLength) {
			/* Set-up for the last transform: */
			memset(&context->buffer[usedspace], 0,
				   SHA256ShortBlockLength - usedspace);
		} else {
			if (usedspace < SHA256BlockLength) {
				memset(&context->buffer[usedspace], 0,
					   SHA256BlockLength - usedspace);
			}
			/* Do second-to-last transform: */
			SHA256_Transform(context, (uint32_t *)context->buffer);

			/* And set-up for the last transform: */
			memset(context->buffer, 0, SHA256ShortBlockLength);
		}
	} else {
		/* Set-up for the last transform: */
		memset(context->buffer, 0, SHA256ShortBlockLength);

		/* Begin padding with a 1 bit: */
		*context->buffer = 0x80;
	}
	/* Set the bit count: */
	*(uint64_t *)&context->buffer[SHA256ShortBlockLength] = context->bitcount;

	/* Final transform: */
	SHA256_Transform(context, (uint32_t *)context->buffer);
}

void SHA256_Final(uint8_t digest[], SHA256Ctx *context)
{
	/* If no digest buffer is passed, we don't bother doing this: */
	if (digest != NULL) {
		SHA256_Last(context);

		memmove(digest, context->state, SHA256DigestLength);
	}

	/* Clean up state data: */
	memset(context, 0, sizeof(*context));
}

/*** SHA-512: *********************************************************/
void SHA512_Init(SHA512Ctx *context)
{
	if (context == NULL)
		return;
	memmove(context->state, sha512_initial_hash_value, SHA512DigestLength);
	memset(context->buffer, 0, SHA512_block_length);
	context->bitcount[0] = context->bitcount[1] = 0;
}

static void SHA512_Transform(SHA512Ctx *context, const uint64_t *data)
{
	uint64_t a, b, c, d, e, f, g, h, s0, s1;
	uint64_t T1, T2, *W512 = (uint64_t *)context->buffer;
	int j;

	/* Initialize registers with the prev. intermediate value */
	a = context->state[0];
	b = context->state[1];
	c = context->state[2];
	d = context->state[3];
	e = context->state[4];
	f = context->state[5];
	g = context->state[6];
	h = context->state[7];

	j = 0;
	do {
		W512[j] = (uint64_t)data[7] | ((uint64_t)data[6] << 8) |
				  ((uint64_t)data[5] << 16) | ((uint64_t)data[4] << 24) |
				  ((uint64_t)data[3] << 32) | ((uint64_t)data[2] << 40) |
				  ((uint64_t)data[1] << 48) | ((uint64_t)data[0] << 56);
		data += 8;
		/* Apply the SHA-512 compression function to update a..h */
		T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + W512[j];
		T2 = Sigma0_512(a) + Maj(a, b, c);
		h = g;
		g = f;
		f = e;
		e = d + T1;
		d = c;
		c = b;
		b = a;
		a = T1 + T2;

		j++;
	} while (j < 16);

	do {
		/* Part of the message block expansion: */
		s0 = W512[(j + 1) & 0x0f];
		s0 = sigma0_512(s0);
		s1 = W512[(j + 14) & 0x0f];
		s1 = sigma1_512(s1);

		/* Apply the SHA-512 compression function to update a..h */
		T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] +
			 (W512[j & 0x0f] += s1 + W512[(j + 9) & 0x0f] + s0);
		T2 = Sigma0_512(a) + Maj(a, b, c);
		h = g;
		g = f;
		f = e;
		e = d + T1;
		d = c;
		c = b;
		b = a;
		a = T1 + T2;

		j++;
	} while (j < 80);

	/* Compute the current intermediate hash value */
	context->state[0] += a;
	context->state[1] += b;
	context->state[2] += c;
	context->state[3] += d;
	context->state[4] += e;
	context->state[5] += f;
	context->state[6] += g;
	context->state[7] += h;

	/* Clean up */
	a = b = c = d = e = f = g = h = T1 = T2 = 0;
}

void SHA512_Update(SHA512Ctx *context, const uint8_t *data, size_t len)
{
	size_t freespace, usedspace;

	/* Calling with no data is valid (we do nothing) */
	if (len == 0)
		return;

	usedspace = (context->bitcount[0] >> 3) % SHA512_block_length;
	if (usedspace > 0) {
		/* Calculate how much free space is available in the buffer */
		freespace = SHA512_block_length - usedspace;

		if (len >= freespace) {
			/* Fill the buffer completely and process it */
			memmove(&context->buffer[usedspace], data, freespace);
			ADDINC128(context->bitcount, freespace << 3);
			len -= freespace;
			data += freespace;
			SHA512_Transform(context, (uint64_t *)context->buffer);
		} else {
			/* The buffer is not yet full */
			memmove(&context->buffer[usedspace], data, len);
			ADDINC128(context->bitcount, len << 3);
			/* Clean up: */
			usedspace = freespace = 0;
			return;
		}
	}
	while (len >= SHA512_block_length) {
		/* Process as many complete blocks as we can */
		SHA512_Transform(context, (const uint64_t *)data);
		ADDINC128(context->bitcount, SHA512_block_length << 3);
		len -= SHA512_block_length;
		data += SHA512_block_length;
	}
	if (len > 0) {
		/* There's left-overs, so save 'em */
		memmove(context->buffer, data, len);
		ADDINC128(context->bitcount, len << 3);
	}
	/* Clean up: */
	usedspace = freespace = 0;
}

static void SHA512_Last(SHA512Ctx *context)
{
	unsigned int usedspace;

	usedspace = (context->bitcount[0] >> 3) % SHA512_block_length;

	if (usedspace > 0) {
		/* Begin padding with a 1 bit: */
		context->buffer[usedspace++] = 0x80;

		if (usedspace <= SHA512ShortBlockLength) {
			/* Set-up for the last transform: */
			memset(&context->buffer[usedspace], 0,
				   SHA512ShortBlockLength - usedspace);
		} else {
			if (usedspace < SHA512_block_length) {
				memset(&context->buffer[usedspace], 0,
					   SHA512_block_length - usedspace);
			}
			/* Do second-to-last transform: */
			SHA512_Transform(context, (uint64_t *)context->buffer);

			/* And set-up for the last transform: */
			memset(context->buffer, 0, SHA512_block_length - 2);
		}
	} else {
		/* Prepare for final transform: */
		memset(context->buffer, 0, SHA512ShortBlockLength);

		/* Begin padding with a 1 bit: */
		*context->buffer = 0x80;
	}
	/* Store the length of input data (in bits): */
	*(uint64_t *)&context->buffer[SHA512ShortBlockLength] =
		context->bitcount[1];
	*(uint64_t *)&context->buffer[SHA512ShortBlockLength + 8] =
		context->bitcount[0];

	/* Final transform: */
	SHA512_Transform(context, (uint64_t *)context->buffer);
}

void SHA512_Final(uint8_t digest[], SHA512Ctx *context)
{
	/* If no digest buffer is passed, we don't bother doing this: */
	if (digest != NULL) {
		SHA512_Last(context);

		/* Save the hash data for output: */
		memmove(digest, context->state, SHA512DigestLength);
	}

	/* Zero out state data */
	memset(context, 0, sizeof(*context));
}

/*** SHA-384: *********************************************************/
void SHA384_Init(SHA384Ctx *context)
{
	if (context == NULL)
		return;
	memmove(context->state, sha384_initial_hash_value, SHA512DigestLength);
	memset(context->buffer, 0, SHA384BlockLength);
	context->bitcount[0] = context->bitcount[1] = 0;
}

void SHA384_Update(SHA384Ctx *context, const uint8_t *data, size_t len)
{
	SHA512_Update((SHA512Ctx *)context, data, len);
}

void SHA384_Final(uint8_t digest[], SHA384Ctx *context)
{
	/* If no digest buffer is passed, we don't bother doing this: */
	if (digest != NULL) {
		SHA512_Last((SHA512Ctx *)context);

		/* Save the hash data for output: */
		memmove(digest, context->state, SHA384DigestLength);
	}

	/* Zero out state data */
	memset(context, 0, sizeof(*context));
}

/*** SHA-224: *********************************************************/
void SHA224_Init(SHA224Ctx *context)
{
	if (context == NULL)
		return;
	memmove(context->state, sha224_initial_hash_value, SHA256DigestLength);
	memset(context->buffer, 0, SHA256BlockLength);
	context->bitcount = 0;
}

void SHA224_Update(SHA224Ctx *context, const uint8_t *data, size_t len)
{
	SHA256_Update((SHA256Ctx *)context, data, len);
}

void SHA224_Final(uint8_t digest[], SHA224Ctx *context)
{
	/* If no digest buffer is passed, we don't bother doing this: */
	if (digest != NULL) {
		SHA256_Last(context);

		memmove(digest, context->state, SHA224DigestLength);
	}

	/* Clean up state data: */
	memset(context, 0, sizeof(*context));
}
