#ifdef HAVE_CONFIG_H
#  include <config.h>
#endif

#include <stdlib.h>		/* for malloc() */
#include <string.h>		/* for memcpy() */

#include "private/md5.h"
#include "share/alloc.h"
#include "share/endswap.h"

/*
 * This code implements the MD5 message-digest algorithm.
 * The algorithm is due to Ron Rivest.  This code was
 * written by Colin Plumb in 1993, no copyright is claimed.
 * This code is in the public domain; do with it what you wish.
 *
 * Equivalent code is available from RSA Data Security, Inc.
 * This code has been tested against that, and is equivalent,
 * except that you don't need to include two pages of legalese
 * with every copy.
 *
 * To compute the message digest of a chunk of bytes, declare an
 * MD5Context structure, pass it to MD5Init, call MD5Update as
 * needed on buffers full of bytes, and then call MD5Final, which
 * will fill a supplied 16-byte array with the digest.
 *
 * Changed so as no longer to depend on Colin Plumb's `usual.h' header
 * definitions; now uses stuff from dpkg's config.h.
 *  - Ian Jackson <ijackson@nyx.cs.du.edu>.
 * Still in the public domain.
 *
 * Josh Coalson: made some changes to integrate with libFLAC.
 * Still in the public domain.
 */

/* The four core functions - F1 is optimized somewhat */

/* #define F1(x, y, z) (x & y | ~x & z) */
#define F1(x, y, z) (z ^ (x & (y ^ z)))
#define F2(x, y, z) F1(z, x, y)
#define F3(x, y, z) (x ^ y ^ z)
#define F4(x, y, z) (y ^ (x | ~z))

/* This is the central step in the MD5 algorithm. */
#define MD5STEP(f,w,x,y,z,in,s) \
	 (w += f(x,y,z) + in, w = (w<<s | w>>(32-s)) + x)

/*
 * The core of the MD5 algorithm, this alters an existing MD5 hash to
 * reflect the addition of 16 longwords of new data.  MD5Update blocks
 * the data and converts bytes into longwords for this routine.
 */
static void FLAC__MD5Transform(FLAC__uint32 buf[4], FLAC__uint32 const in[16])
{
	register FLAC__uint32 a, b, c, d;

	a = buf[0];
	b = buf[1];
	c = buf[2];
	d = buf[3];

	MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
	MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
	MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
	MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
	MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
	MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
	MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
	MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
	MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
	MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
	MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
	MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
	MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
	MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
	MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
	MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);

	MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
	MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
	MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
	MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
	MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
	MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
	MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
	MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
	MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
	MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
	MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
	MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
	MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
	MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
	MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
	MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);

	MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
	MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
	MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
	MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
	MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
	MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
	MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
	MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
	MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
	MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
	MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
	MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
	MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
	MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
	MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
	MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);

	MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
	MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
	MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
	MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
	MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
	MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
	MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
	MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
	MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
	MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
	MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
	MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
	MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
	MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
	MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
	MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);

	buf[0] += a;
	buf[1] += b;
	buf[2] += c;
	buf[3] += d;
}

#if WORDS_BIGENDIAN
//@@@@@@ OPT: use bswap/intrinsics
static void byteSwap(FLAC__uint32 *buf, unsigned words)
{
	register FLAC__uint32 x;
	do {
		x = *buf;
		x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff);
		*buf++ = (x >> 16) | (x << 16);
	} while (--words);
}
static void byteSwapX16(FLAC__uint32 *buf)
{
	register FLAC__uint32 x;

	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf   = (x >> 16) | (x << 16);
}
#else
#define byteSwap(buf, words)
#define byteSwapX16(buf)
#endif

/*
 * Update context to reflect the concatenation of another buffer full
 * of bytes.
 */
static void FLAC__MD5Update(FLAC__MD5Context *ctx, FLAC__byte const *buf, unsigned len)
{
	FLAC__uint32 t;

	/* Update byte count */

	t = ctx->bytes[0];
	if ((ctx->bytes[0] = t + len) < t)
		ctx->bytes[1]++;	/* Carry from low to high */

	t = 64 - (t & 0x3f);	/* Space available in ctx->in (at least 1) */
	if (t > len) {
		memcpy((FLAC__byte *)ctx->in + 64 - t, buf, len);
		return;
	}
	/* First chunk is an odd size */
	memcpy((FLAC__byte *)ctx->in + 64 - t, buf, t);
	byteSwapX16(ctx->in);
	FLAC__MD5Transform(ctx->buf, ctx->in);
	buf += t;
	len -= t;

	/* Process data in 64-byte chunks */
	while (len >= 64) {
		memcpy(ctx->in, buf, 64);
		byteSwapX16(ctx->in);
		FLAC__MD5Transform(ctx->buf, ctx->in);
		buf += 64;
		len -= 64;
	}

	/* Handle any remaining bytes of data. */
	memcpy(ctx->in, buf, len);
}

/*
 * Start MD5 accumulation.  Set bit count to 0 and buffer to mysterious
 * initialization constants.
 */
void FLAC__MD5Init(FLAC__MD5Context *ctx)
{
	ctx->buf[0] = 0x67452301;
	ctx->buf[1] = 0xefcdab89;
	ctx->buf[2] = 0x98badcfe;
	ctx->buf[3] = 0x10325476;

	ctx->bytes[0] = 0;
	ctx->bytes[1] = 0;

	ctx->internal_buf.p8= 0;
	ctx->capacity = 0;
}

/*
 * Final wrapup - pad to 64-byte boundary with the bit pattern
 * 1 0* (64-bit count of bits processed, MSB-first)
 */
void FLAC__MD5Final(FLAC__byte digest[16], FLAC__MD5Context *ctx)
{
	int count = ctx->bytes[0] & 0x3f;	/* Number of bytes in ctx->in */
	FLAC__byte *p = (FLAC__byte *)ctx->in + count;

	/* Set the first char of padding to 0x80.  There is always room. */
	*p++ = 0x80;

	/* Bytes of padding needed to make 56 bytes (-8..55) */
	count = 56 - 1 - count;

	if (count < 0) {	/* Padding forces an extra block */
		memset(p, 0, count + 8);
		byteSwapX16(ctx->in);
		FLAC__MD5Transform(ctx->buf, ctx->in);
		p = (FLAC__byte *)ctx->in;
		count = 56;
	}
	memset(p, 0, count);
	byteSwap(ctx->in, 14);

	/* Append length in bits and transform */
	ctx->in[14] = ctx->bytes[0] << 3;
	ctx->in[15] = ctx->bytes[1] << 3 | ctx->bytes[0] >> 29;
	FLAC__MD5Transform(ctx->buf, ctx->in);

	byteSwap(ctx->buf, 4);
	memcpy(digest, ctx->buf, 16);
	if (0 != ctx->internal_buf.p8) {
		free(ctx->internal_buf.p8);
		ctx->internal_buf.p8= 0;
		ctx->capacity = 0;
	}
	memset(ctx, 0, sizeof(*ctx));	/* In case it's sensitive */
}

/*
 * Convert the incoming audio signal to a byte stream
 */
static void format_input_(FLAC__multibyte *mbuf, const FLAC__int32 * const signal[], unsigned channels, unsigned samples, unsigned bytes_per_sample)
{
	FLAC__byte *buf_ = mbuf->p8;
	FLAC__int16 *buf16 = mbuf->p16;
	FLAC__int32 *buf32 = mbuf->p32;
	FLAC__int32 a_word;
	unsigned channel, sample;

	/* Storage in the output buffer, buf, is little endian. */

#define BYTES_CHANNEL_SELECTOR(bytes, channels)   (bytes * 100 + channels)

	/* First do the most commonly used combinations. */
	switch (BYTES_CHANNEL_SELECTOR (bytes_per_sample, channels)) {
		/* One byte per sample. */
		case (BYTES_CHANNEL_SELECTOR (1, 1)):
			for (sample = 0; sample < samples; sample++)
				*buf_++ = signal[0][sample];
			return;

		case (BYTES_CHANNEL_SELECTOR (1, 2)):
			for (sample = 0; sample < samples; sample++) {
				*buf_++ = signal[0][sample];
				*buf_++ = signal[1][sample];
			}
			return;

		case (BYTES_CHANNEL_SELECTOR (1, 4)):
			for (sample = 0; sample < samples; sample++) {
				*buf_++ = signal[0][sample];
				*buf_++ = signal[1][sample];
				*buf_++ = signal[2][sample];
				*buf_++ = signal[3][sample];
			}
			return;

		case (BYTES_CHANNEL_SELECTOR (1, 6)):
			for (sample = 0; sample < samples; sample++) {
				*buf_++ = signal[0][sample];
				*buf_++ = signal[1][sample];
				*buf_++ = signal[2][sample];
				*buf_++ = signal[3][sample];
				*buf_++ = signal[4][sample];
				*buf_++ = signal[5][sample];
			}
			return;

		case (BYTES_CHANNEL_SELECTOR (1, 8)):
			for (sample = 0; sample < samples; sample++) {
				*buf_++ = signal[0][sample];
				*buf_++ = signal[1][sample];
				*buf_++ = signal[2][sample];
				*buf_++ = signal[3][sample];
				*buf_++ = signal[4][sample];
				*buf_++ = signal[5][sample];
				*buf_++ = signal[6][sample];
				*buf_++ = signal[7][sample];
			}
			return;

		/* Two bytes per sample. */
		case (BYTES_CHANNEL_SELECTOR (2, 1)):
			for (sample = 0; sample < samples; sample++)
				*buf16++ = H2LE_16(signal[0][sample]);
			return;

		case (BYTES_CHANNEL_SELECTOR (2, 2)):
			for (sample = 0; sample < samples; sample++) {
				*buf16++ = H2LE_16(signal[0][sample]);
				*buf16++ = H2LE_16(signal[1][sample]);
			}
			return;

		case (BYTES_CHANNEL_SELECTOR (2, 4)):
			for (sample = 0; sample < samples; sample++) {
				*buf16++ = H2LE_16(signal[0][sample]);
				*buf16++ = H2LE_16(signal[1][sample]);
				*buf16++ = H2LE_16(signal[2][sample]);
				*buf16++ = H2LE_16(signal[3][sample]);
			}
			return;

		case (BYTES_CHANNEL_SELECTOR (2, 6)):
			for (sample = 0; sample < samples; sample++) {
				*buf16++ = H2LE_16(signal[0][sample]);
				*buf16++ = H2LE_16(signal[1][sample]);
				*buf16++ = H2LE_16(signal[2][sample]);
				*buf16++ = H2LE_16(signal[3][sample]);
				*buf16++ = H2LE_16(signal[4][sample]);
				*buf16++ = H2LE_16(signal[5][sample]);
			}
			return;

		case (BYTES_CHANNEL_SELECTOR (2, 8)):
			for (sample = 0; sample < samples; sample++) {
				*buf16++ = H2LE_16(signal[0][sample]);
				*buf16++ = H2LE_16(signal[1][sample]);
				*buf16++ = H2LE_16(signal[2][sample]);
				*buf16++ = H2LE_16(signal[3][sample]);
				*buf16++ = H2LE_16(signal[4][sample]);
				*buf16++ = H2LE_16(signal[5][sample]);
				*buf16++ = H2LE_16(signal[6][sample]);
				*buf16++ = H2LE_16(signal[7][sample]);
			}
			return;

		/* Three bytes per sample. */
		case (BYTES_CHANNEL_SELECTOR (3, 1)):
			for (sample = 0; sample < samples; sample++) {
				a_word = signal[0][sample];
				*buf_++ = (FLAC__byte)a_word; a_word >>= 8;
				*buf_++ = (FLAC__byte)a_word; a_word >>= 8;
				*buf_++ = (FLAC__byte)a_word;
			}
			return;

		case (BYTES_CHANNEL_SELECTOR (3, 2)):
			for (sample = 0; sample < samples; sample++) {
				a_word = signal[0][sample];
				*buf_++ = (FLAC__byte)a_word; a_word >>= 8;
				*buf_++ = (FLAC__byte)a_word; a_word >>= 8;
				*buf_++ = (FLAC__byte)a_word;
				a_word = signal[1][sample];
				*buf_++ = (FLAC__byte)a_word; a_word >>= 8;
				*buf_++ = (FLAC__byte)a_word; a_word >>= 8;
				*buf_++ = (FLAC__byte)a_word;
			}
			return;

		/* Four bytes per sample. */
		case (BYTES_CHANNEL_SELECTOR (4, 1)):
			for (sample = 0; sample < samples; sample++)
				*buf32++ = H2LE_32(signal[0][sample]);
			return;

		case (BYTES_CHANNEL_SELECTOR (4, 2)):
			for (sample = 0; sample < samples; sample++) {
				*buf32++ = H2LE_32(signal[0][sample]);
				*buf32++ = H2LE_32(signal[1][sample]);
			}
			return;

		case (BYTES_CHANNEL_SELECTOR (4, 4)):
			for (sample = 0; sample < samples; sample++) {
				*buf32++ = H2LE_32(signal[0][sample]);
				*buf32++ = H2LE_32(signal[1][sample]);
				*buf32++ = H2LE_32(signal[2][sample]);
				*buf32++ = H2LE_32(signal[3][sample]);
			}
			return;

		case (BYTES_CHANNEL_SELECTOR (4, 6)):
			for (sample = 0; sample < samples; sample++) {
				*buf32++ = H2LE_32(signal[0][sample]);
				*buf32++ = H2LE_32(signal[1][sample]);
				*buf32++ = H2LE_32(signal[2][sample]);
				*buf32++ = H2LE_32(signal[3][sample]);
				*buf32++ = H2LE_32(signal[4][sample]);
				*buf32++ = H2LE_32(signal[5][sample]);
			}
			return;

		case (BYTES_CHANNEL_SELECTOR (4, 8)):
			for (sample = 0; sample < samples; sample++) {
				*buf32++ = H2LE_32(signal[0][sample]);
				*buf32++ = H2LE_32(signal[1][sample]);
				*buf32++ = H2LE_32(signal[2][sample]);
				*buf32++ = H2LE_32(signal[3][sample]);
				*buf32++ = H2LE_32(signal[4][sample]);
				*buf32++ = H2LE_32(signal[5][sample]);
				*buf32++ = H2LE_32(signal[6][sample]);
				*buf32++ = H2LE_32(signal[7][sample]);
			}
			return;

		default:
			break;
	}

	/* General version. */
	switch (bytes_per_sample) {
		case 1:
			for (sample = 0; sample < samples; sample++)
				for (channel = 0; channel < channels; channel++)
					*buf_++ = signal[channel][sample];
			return;

		case 2:
			for (sample = 0; sample < samples; sample++)
				for (channel = 0; channel < channels; channel++)
					*buf16++ = H2LE_16(signal[channel][sample]);
			return;

		case 3:
			for (sample = 0; sample < samples; sample++)
				for (channel = 0; channel < channels; channel++) {
					a_word = signal[channel][sample];
					*buf_++ = (FLAC__byte)a_word; a_word >>= 8;
					*buf_++ = (FLAC__byte)a_word; a_word >>= 8;
					*buf_++ = (FLAC__byte)a_word;
				}
			return;

		case 4:
			for (sample = 0; sample < samples; sample++)
				for (channel = 0; channel < channels; channel++)
					*buf32++ = H2LE_32(signal[channel][sample]);
			return;

		default:
			break;
	}
}

/*
 * Convert the incoming audio signal to a byte stream and FLAC__MD5Update it.
 */
FLAC__bool FLAC__MD5Accumulate(FLAC__MD5Context *ctx, const FLAC__int32 * const signal[], unsigned channels, unsigned samples, unsigned bytes_per_sample)
{
	const size_t bytes_needed = (size_t)channels * (size_t)samples * (size_t)bytes_per_sample;

	/* overflow check */
	if ((size_t)channels > SIZE_MAX / (size_t)bytes_per_sample)
		return false;
	if ((size_t)channels * (size_t)bytes_per_sample > SIZE_MAX / (size_t)samples)
		return false;

	if (ctx->capacity < bytes_needed) {
		FLAC__byte *tmp = realloc(ctx->internal_buf.p8, bytes_needed);
		if (0 == tmp) {
			free(ctx->internal_buf.p8);
			if (0 == (ctx->internal_buf.p8= safe_malloc_(bytes_needed)))
				return false;
		}
		else
			ctx->internal_buf.p8= tmp;
		ctx->capacity = bytes_needed;
	}

	format_input_(&ctx->internal_buf, signal, channels, samples, bytes_per_sample);

	FLAC__MD5Update(ctx, ctx->internal_buf.p8, bytes_needed);

	return true;
}
