xref: /aosp_15_r20/external/flac/src/libFLAC/md5.c (revision 600f14f40d737144c998e2ec7a483122d3776fbc)
1*600f14f4SXin Li #ifdef HAVE_CONFIG_H
2*600f14f4SXin Li #  include <config.h>
3*600f14f4SXin Li #endif
4*600f14f4SXin Li 
5*600f14f4SXin Li #include <stdlib.h>		/* for malloc() */
6*600f14f4SXin Li #include <string.h>		/* for memcpy() */
7*600f14f4SXin Li 
8*600f14f4SXin Li #include "private/md5.h"
9*600f14f4SXin Li #include "share/alloc.h"
10*600f14f4SXin Li #include "share/compat.h"
11*600f14f4SXin Li #include "share/endswap.h"
12*600f14f4SXin Li 
13*600f14f4SXin Li /*
14*600f14f4SXin Li  * This code implements the MD5 message-digest algorithm.
15*600f14f4SXin Li  * The algorithm is due to Ron Rivest.  This code was
16*600f14f4SXin Li  * written by Colin Plumb in 1993, no copyright is claimed.
17*600f14f4SXin Li  * This code is in the public domain; do with it what you wish.
18*600f14f4SXin Li  *
19*600f14f4SXin Li  * Equivalent code is available from RSA Data Security, Inc.
20*600f14f4SXin Li  * This code has been tested against that, and is equivalent,
21*600f14f4SXin Li  * except that you don't need to include two pages of legalese
22*600f14f4SXin Li  * with every copy.
23*600f14f4SXin Li  *
24*600f14f4SXin Li  * To compute the message digest of a chunk of bytes, declare an
25*600f14f4SXin Li  * MD5Context structure, pass it to MD5Init, call MD5Update as
26*600f14f4SXin Li  * needed on buffers full of bytes, and then call MD5Final, which
27*600f14f4SXin Li  * will fill a supplied 16-byte array with the digest.
28*600f14f4SXin Li  *
29*600f14f4SXin Li  * Changed so as no longer to depend on Colin Plumb's `usual.h' header
30*600f14f4SXin Li  * definitions; now uses stuff from dpkg's config.h.
31*600f14f4SXin Li  *  - Ian Jackson <[email protected]>.
32*600f14f4SXin Li  * Still in the public domain.
33*600f14f4SXin Li  *
34*600f14f4SXin Li  * Josh Coalson: made some changes to integrate with libFLAC.
35*600f14f4SXin Li  * Still in the public domain.
36*600f14f4SXin Li  */
37*600f14f4SXin Li 
38*600f14f4SXin Li /* The four core functions - F1 is optimized somewhat */
39*600f14f4SXin Li 
40*600f14f4SXin Li /* #define F1(x, y, z) (x & y | ~x & z) */
41*600f14f4SXin Li #define F1(x, y, z) (z ^ (x & (y ^ z)))
42*600f14f4SXin Li #define F2(x, y, z) F1(z, x, y)
43*600f14f4SXin Li #define F3(x, y, z) (x ^ y ^ z)
44*600f14f4SXin Li #define F4(x, y, z) (y ^ (x | ~z))
45*600f14f4SXin Li 
46*600f14f4SXin Li /* This is the central step in the MD5 algorithm. */
47*600f14f4SXin Li #define MD5STEP(f,w,x,y,z,in,s) \
48*600f14f4SXin Li 	 (w += f(x,y,z) + in, w = (w<<s | w>>(32-s)) + x)
49*600f14f4SXin Li 
50*600f14f4SXin Li /*
51*600f14f4SXin Li  * The core of the MD5 algorithm, this alters an existing MD5 hash to
52*600f14f4SXin Li  * reflect the addition of 16 longwords of new data.  MD5Update blocks
53*600f14f4SXin Li  * the data and converts bytes into longwords for this routine.
54*600f14f4SXin Li  */
FLAC__MD5Transform(FLAC__uint32 buf[4],FLAC__uint32 const in[16])55*600f14f4SXin Li static void FLAC__MD5Transform(FLAC__uint32 buf[4], FLAC__uint32 const in[16])
56*600f14f4SXin Li {
57*600f14f4SXin Li 	register FLAC__uint32 a, b, c, d;
58*600f14f4SXin Li 
59*600f14f4SXin Li 	a = buf[0];
60*600f14f4SXin Li 	b = buf[1];
61*600f14f4SXin Li 	c = buf[2];
62*600f14f4SXin Li 	d = buf[3];
63*600f14f4SXin Li 
64*600f14f4SXin Li 	MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
65*600f14f4SXin Li 	MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
66*600f14f4SXin Li 	MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
67*600f14f4SXin Li 	MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
68*600f14f4SXin Li 	MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
69*600f14f4SXin Li 	MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
70*600f14f4SXin Li 	MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
71*600f14f4SXin Li 	MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
72*600f14f4SXin Li 	MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
73*600f14f4SXin Li 	MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
74*600f14f4SXin Li 	MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
75*600f14f4SXin Li 	MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
76*600f14f4SXin Li 	MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
77*600f14f4SXin Li 	MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
78*600f14f4SXin Li 	MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
79*600f14f4SXin Li 	MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
80*600f14f4SXin Li 
81*600f14f4SXin Li 	MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
82*600f14f4SXin Li 	MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
83*600f14f4SXin Li 	MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
84*600f14f4SXin Li 	MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
85*600f14f4SXin Li 	MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
86*600f14f4SXin Li 	MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
87*600f14f4SXin Li 	MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
88*600f14f4SXin Li 	MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
89*600f14f4SXin Li 	MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
90*600f14f4SXin Li 	MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
91*600f14f4SXin Li 	MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
92*600f14f4SXin Li 	MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
93*600f14f4SXin Li 	MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
94*600f14f4SXin Li 	MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
95*600f14f4SXin Li 	MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
96*600f14f4SXin Li 	MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
97*600f14f4SXin Li 
98*600f14f4SXin Li 	MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
99*600f14f4SXin Li 	MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
100*600f14f4SXin Li 	MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
101*600f14f4SXin Li 	MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
102*600f14f4SXin Li 	MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
103*600f14f4SXin Li 	MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
104*600f14f4SXin Li 	MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
105*600f14f4SXin Li 	MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
106*600f14f4SXin Li 	MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
107*600f14f4SXin Li 	MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
108*600f14f4SXin Li 	MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
109*600f14f4SXin Li 	MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
110*600f14f4SXin Li 	MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
111*600f14f4SXin Li 	MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
112*600f14f4SXin Li 	MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
113*600f14f4SXin Li 	MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
114*600f14f4SXin Li 
115*600f14f4SXin Li 	MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
116*600f14f4SXin Li 	MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
117*600f14f4SXin Li 	MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
118*600f14f4SXin Li 	MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
119*600f14f4SXin Li 	MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
120*600f14f4SXin Li 	MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
121*600f14f4SXin Li 	MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
122*600f14f4SXin Li 	MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
123*600f14f4SXin Li 	MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
124*600f14f4SXin Li 	MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
125*600f14f4SXin Li 	MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
126*600f14f4SXin Li 	MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
127*600f14f4SXin Li 	MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
128*600f14f4SXin Li 	MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
129*600f14f4SXin Li 	MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
130*600f14f4SXin Li 	MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
131*600f14f4SXin Li 
132*600f14f4SXin Li 	buf[0] += a;
133*600f14f4SXin Li 	buf[1] += b;
134*600f14f4SXin Li 	buf[2] += c;
135*600f14f4SXin Li 	buf[3] += d;
136*600f14f4SXin Li }
137*600f14f4SXin Li 
138*600f14f4SXin Li #if WORDS_BIGENDIAN
139*600f14f4SXin Li //@@@@@@ OPT: use bswap/intrinsics
byteSwap(FLAC__uint32 * buf,uint32_t words)140*600f14f4SXin Li static void byteSwap(FLAC__uint32 *buf, uint32_t words)
141*600f14f4SXin Li {
142*600f14f4SXin Li 	register FLAC__uint32 x;
143*600f14f4SXin Li 	do {
144*600f14f4SXin Li 		x = *buf;
145*600f14f4SXin Li 		x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff);
146*600f14f4SXin Li 		*buf++ = (x >> 16) | (x << 16);
147*600f14f4SXin Li 	} while (--words);
148*600f14f4SXin Li }
byteSwapX16(FLAC__uint32 * buf)149*600f14f4SXin Li static void byteSwapX16(FLAC__uint32 *buf)
150*600f14f4SXin Li {
151*600f14f4SXin Li 	register FLAC__uint32 x;
152*600f14f4SXin Li 
153*600f14f4SXin Li 	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
154*600f14f4SXin Li 	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
155*600f14f4SXin Li 	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
156*600f14f4SXin Li 	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
157*600f14f4SXin Li 	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
158*600f14f4SXin Li 	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
159*600f14f4SXin Li 	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
160*600f14f4SXin Li 	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
161*600f14f4SXin Li 	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
162*600f14f4SXin Li 	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
163*600f14f4SXin Li 	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
164*600f14f4SXin Li 	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
165*600f14f4SXin Li 	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
166*600f14f4SXin Li 	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
167*600f14f4SXin Li 	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
168*600f14f4SXin Li 	x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf   = (x >> 16) | (x << 16);
169*600f14f4SXin Li }
170*600f14f4SXin Li #else
171*600f14f4SXin Li #define byteSwap(buf, words)
172*600f14f4SXin Li #define byteSwapX16(buf)
173*600f14f4SXin Li #endif
174*600f14f4SXin Li 
175*600f14f4SXin Li /*
176*600f14f4SXin Li  * Update context to reflect the concatenation of another buffer full
177*600f14f4SXin Li  * of bytes.
178*600f14f4SXin Li  */
FLAC__MD5Update(FLAC__MD5Context * ctx,FLAC__byte const * buf,uint32_t len)179*600f14f4SXin Li static void FLAC__MD5Update(FLAC__MD5Context *ctx, FLAC__byte const *buf, uint32_t len)
180*600f14f4SXin Li {
181*600f14f4SXin Li 	FLAC__uint32 t;
182*600f14f4SXin Li 
183*600f14f4SXin Li 	/* Update byte count */
184*600f14f4SXin Li 
185*600f14f4SXin Li 	t = ctx->bytes[0];
186*600f14f4SXin Li 	if ((ctx->bytes[0] = t + len) < t)
187*600f14f4SXin Li 		ctx->bytes[1]++;	/* Carry from low to high */
188*600f14f4SXin Li 
189*600f14f4SXin Li 	t = 64 - (t & 0x3f);	/* Space available in ctx->in (at least 1) */
190*600f14f4SXin Li 	if (t > len) {
191*600f14f4SXin Li 		memcpy((FLAC__byte *)ctx->in + 64 - t, buf, len);
192*600f14f4SXin Li 		return;
193*600f14f4SXin Li 	}
194*600f14f4SXin Li 	/* First chunk is an odd size */
195*600f14f4SXin Li 	memcpy((FLAC__byte *)ctx->in + 64 - t, buf, t);
196*600f14f4SXin Li 	byteSwapX16(ctx->in);
197*600f14f4SXin Li 	FLAC__MD5Transform(ctx->buf, ctx->in);
198*600f14f4SXin Li 	buf += t;
199*600f14f4SXin Li 	len -= t;
200*600f14f4SXin Li 
201*600f14f4SXin Li 	/* Process data in 64-byte chunks */
202*600f14f4SXin Li 	while (len >= 64) {
203*600f14f4SXin Li 		memcpy(ctx->in, buf, 64);
204*600f14f4SXin Li 		byteSwapX16(ctx->in);
205*600f14f4SXin Li 		FLAC__MD5Transform(ctx->buf, ctx->in);
206*600f14f4SXin Li 		buf += 64;
207*600f14f4SXin Li 		len -= 64;
208*600f14f4SXin Li 	}
209*600f14f4SXin Li 
210*600f14f4SXin Li 	/* Handle any remaining bytes of data. */
211*600f14f4SXin Li 	memcpy(ctx->in, buf, len);
212*600f14f4SXin Li }
213*600f14f4SXin Li 
214*600f14f4SXin Li /*
215*600f14f4SXin Li  * Start MD5 accumulation.  Set bit count to 0 and buffer to mysterious
216*600f14f4SXin Li  * initialization constants.
217*600f14f4SXin Li  */
FLAC__MD5Init(FLAC__MD5Context * ctx)218*600f14f4SXin Li void FLAC__MD5Init(FLAC__MD5Context *ctx)
219*600f14f4SXin Li {
220*600f14f4SXin Li 	ctx->buf[0] = 0x67452301;
221*600f14f4SXin Li 	ctx->buf[1] = 0xefcdab89;
222*600f14f4SXin Li 	ctx->buf[2] = 0x98badcfe;
223*600f14f4SXin Li 	ctx->buf[3] = 0x10325476;
224*600f14f4SXin Li 
225*600f14f4SXin Li 	ctx->bytes[0] = 0;
226*600f14f4SXin Li 	ctx->bytes[1] = 0;
227*600f14f4SXin Li 
228*600f14f4SXin Li 	ctx->internal_buf.p8 = 0;
229*600f14f4SXin Li 	ctx->capacity = 0;
230*600f14f4SXin Li }
231*600f14f4SXin Li 
232*600f14f4SXin Li /*
233*600f14f4SXin Li  * Final wrapup - pad to 64-byte boundary with the bit pattern
234*600f14f4SXin Li  * 1 0* (64-bit count of bits processed, MSB-first)
235*600f14f4SXin Li  */
FLAC__MD5Final(FLAC__byte digest[16],FLAC__MD5Context * ctx)236*600f14f4SXin Li void FLAC__MD5Final(FLAC__byte digest[16], FLAC__MD5Context *ctx)
237*600f14f4SXin Li {
238*600f14f4SXin Li 	int count = ctx->bytes[0] & 0x3f;	/* Number of bytes in ctx->in */
239*600f14f4SXin Li 	FLAC__byte *p = (FLAC__byte *)ctx->in + count;
240*600f14f4SXin Li 
241*600f14f4SXin Li 	/* Set the first char of padding to 0x80.  There is always room. */
242*600f14f4SXin Li 	*p++ = 0x80;
243*600f14f4SXin Li 
244*600f14f4SXin Li 	/* Bytes of padding needed to make 56 bytes (-8..55) */
245*600f14f4SXin Li 	count = 56 - 1 - count;
246*600f14f4SXin Li 
247*600f14f4SXin Li 	if (count < 0) {	/* Padding forces an extra block */
248*600f14f4SXin Li 		memset(p, 0, count + 8);
249*600f14f4SXin Li 		byteSwapX16(ctx->in);
250*600f14f4SXin Li 		FLAC__MD5Transform(ctx->buf, ctx->in);
251*600f14f4SXin Li 		p = (FLAC__byte *)ctx->in;
252*600f14f4SXin Li 		count = 56;
253*600f14f4SXin Li 	}
254*600f14f4SXin Li 	memset(p, 0, count);
255*600f14f4SXin Li 	byteSwap(ctx->in, 14);
256*600f14f4SXin Li 
257*600f14f4SXin Li 	/* Append length in bits and transform */
258*600f14f4SXin Li 	ctx->in[14] = ctx->bytes[0] << 3;
259*600f14f4SXin Li 	ctx->in[15] = ctx->bytes[1] << 3 | ctx->bytes[0] >> 29;
260*600f14f4SXin Li 	FLAC__MD5Transform(ctx->buf, ctx->in);
261*600f14f4SXin Li 
262*600f14f4SXin Li 	byteSwap(ctx->buf, 4);
263*600f14f4SXin Li 	memcpy(digest, ctx->buf, 16);
264*600f14f4SXin Li 	if (0 != ctx->internal_buf.p8) {
265*600f14f4SXin Li 		free(ctx->internal_buf.p8);
266*600f14f4SXin Li 		ctx->internal_buf.p8 = 0;
267*600f14f4SXin Li 		ctx->capacity = 0;
268*600f14f4SXin Li 	}
269*600f14f4SXin Li 	memset(ctx, 0, sizeof(*ctx));	/* In case it's sensitive */
270*600f14f4SXin Li }
271*600f14f4SXin Li 
272*600f14f4SXin Li /*
273*600f14f4SXin Li  * Convert the incoming audio signal to a byte stream
274*600f14f4SXin Li  */
format_input_(FLAC__multibyte * mbuf,const FLAC__int32 * const signal[],uint32_t channels,uint32_t samples,uint32_t bytes_per_sample)275*600f14f4SXin Li static void format_input_(FLAC__multibyte *mbuf, const FLAC__int32 * const signal[], uint32_t channels, uint32_t samples, uint32_t bytes_per_sample)
276*600f14f4SXin Li {
277*600f14f4SXin Li 	FLAC__byte *buf_ = mbuf->p8;
278*600f14f4SXin Li 	FLAC__int16 *buf16 = mbuf->p16;
279*600f14f4SXin Li 	FLAC__int32 *buf32 = mbuf->p32;
280*600f14f4SXin Li 	FLAC__int32 a_word;
281*600f14f4SXin Li 	uint32_t channel, sample;
282*600f14f4SXin Li 
283*600f14f4SXin Li 	/* Storage in the output buffer, buf, is little endian. */
284*600f14f4SXin Li 
285*600f14f4SXin Li #define BYTES_CHANNEL_SELECTOR(bytes, channels)   (bytes * 100 + channels)
286*600f14f4SXin Li 
287*600f14f4SXin Li 	/* First do the most commonly used combinations. */
288*600f14f4SXin Li 	switch (BYTES_CHANNEL_SELECTOR (bytes_per_sample, channels)) {
289*600f14f4SXin Li 		/* One byte per sample. */
290*600f14f4SXin Li 		case (BYTES_CHANNEL_SELECTOR (1, 1)):
291*600f14f4SXin Li 			for (sample = 0; sample < samples; sample++)
292*600f14f4SXin Li 				*buf_++ = signal[0][sample];
293*600f14f4SXin Li 			return;
294*600f14f4SXin Li 
295*600f14f4SXin Li 		case (BYTES_CHANNEL_SELECTOR (1, 2)):
296*600f14f4SXin Li 			for (sample = 0; sample < samples; sample++) {
297*600f14f4SXin Li 				*buf_++ = signal[0][sample];
298*600f14f4SXin Li 				*buf_++ = signal[1][sample];
299*600f14f4SXin Li 			}
300*600f14f4SXin Li 			return;
301*600f14f4SXin Li 
302*600f14f4SXin Li 		case (BYTES_CHANNEL_SELECTOR (1, 4)):
303*600f14f4SXin Li 			for (sample = 0; sample < samples; sample++) {
304*600f14f4SXin Li 				*buf_++ = signal[0][sample];
305*600f14f4SXin Li 				*buf_++ = signal[1][sample];
306*600f14f4SXin Li 				*buf_++ = signal[2][sample];
307*600f14f4SXin Li 				*buf_++ = signal[3][sample];
308*600f14f4SXin Li 			}
309*600f14f4SXin Li 			return;
310*600f14f4SXin Li 
311*600f14f4SXin Li 		case (BYTES_CHANNEL_SELECTOR (1, 6)):
312*600f14f4SXin Li 			for (sample = 0; sample < samples; sample++) {
313*600f14f4SXin Li 				*buf_++ = signal[0][sample];
314*600f14f4SXin Li 				*buf_++ = signal[1][sample];
315*600f14f4SXin Li 				*buf_++ = signal[2][sample];
316*600f14f4SXin Li 				*buf_++ = signal[3][sample];
317*600f14f4SXin Li 				*buf_++ = signal[4][sample];
318*600f14f4SXin Li 				*buf_++ = signal[5][sample];
319*600f14f4SXin Li 			}
320*600f14f4SXin Li 			return;
321*600f14f4SXin Li 
322*600f14f4SXin Li 		case (BYTES_CHANNEL_SELECTOR (1, 8)):
323*600f14f4SXin Li 			for (sample = 0; sample < samples; sample++) {
324*600f14f4SXin Li 				*buf_++ = signal[0][sample];
325*600f14f4SXin Li 				*buf_++ = signal[1][sample];
326*600f14f4SXin Li 				*buf_++ = signal[2][sample];
327*600f14f4SXin Li 				*buf_++ = signal[3][sample];
328*600f14f4SXin Li 				*buf_++ = signal[4][sample];
329*600f14f4SXin Li 				*buf_++ = signal[5][sample];
330*600f14f4SXin Li 				*buf_++ = signal[6][sample];
331*600f14f4SXin Li 				*buf_++ = signal[7][sample];
332*600f14f4SXin Li 			}
333*600f14f4SXin Li 			return;
334*600f14f4SXin Li 
335*600f14f4SXin Li 		/* Two bytes per sample. */
336*600f14f4SXin Li 		case (BYTES_CHANNEL_SELECTOR (2, 1)):
337*600f14f4SXin Li 			for (sample = 0; sample < samples; sample++)
338*600f14f4SXin Li 				*buf16++ = H2LE_16(signal[0][sample]);
339*600f14f4SXin Li 			return;
340*600f14f4SXin Li 
341*600f14f4SXin Li 		case (BYTES_CHANNEL_SELECTOR (2, 2)):
342*600f14f4SXin Li 			for (sample = 0; sample < samples; sample++) {
343*600f14f4SXin Li 				*buf16++ = H2LE_16(signal[0][sample]);
344*600f14f4SXin Li 				*buf16++ = H2LE_16(signal[1][sample]);
345*600f14f4SXin Li 			}
346*600f14f4SXin Li 			return;
347*600f14f4SXin Li 
348*600f14f4SXin Li 		case (BYTES_CHANNEL_SELECTOR (2, 4)):
349*600f14f4SXin Li 			for (sample = 0; sample < samples; sample++) {
350*600f14f4SXin Li 				*buf16++ = H2LE_16(signal[0][sample]);
351*600f14f4SXin Li 				*buf16++ = H2LE_16(signal[1][sample]);
352*600f14f4SXin Li 				*buf16++ = H2LE_16(signal[2][sample]);
353*600f14f4SXin Li 				*buf16++ = H2LE_16(signal[3][sample]);
354*600f14f4SXin Li 			}
355*600f14f4SXin Li 			return;
356*600f14f4SXin Li 
357*600f14f4SXin Li 		case (BYTES_CHANNEL_SELECTOR (2, 6)):
358*600f14f4SXin Li 			for (sample = 0; sample < samples; sample++) {
359*600f14f4SXin Li 				*buf16++ = H2LE_16(signal[0][sample]);
360*600f14f4SXin Li 				*buf16++ = H2LE_16(signal[1][sample]);
361*600f14f4SXin Li 				*buf16++ = H2LE_16(signal[2][sample]);
362*600f14f4SXin Li 				*buf16++ = H2LE_16(signal[3][sample]);
363*600f14f4SXin Li 				*buf16++ = H2LE_16(signal[4][sample]);
364*600f14f4SXin Li 				*buf16++ = H2LE_16(signal[5][sample]);
365*600f14f4SXin Li 			}
366*600f14f4SXin Li 			return;
367*600f14f4SXin Li 
368*600f14f4SXin Li 		case (BYTES_CHANNEL_SELECTOR (2, 8)):
369*600f14f4SXin Li 			for (sample = 0; sample < samples; sample++) {
370*600f14f4SXin Li 				*buf16++ = H2LE_16(signal[0][sample]);
371*600f14f4SXin Li 				*buf16++ = H2LE_16(signal[1][sample]);
372*600f14f4SXin Li 				*buf16++ = H2LE_16(signal[2][sample]);
373*600f14f4SXin Li 				*buf16++ = H2LE_16(signal[3][sample]);
374*600f14f4SXin Li 				*buf16++ = H2LE_16(signal[4][sample]);
375*600f14f4SXin Li 				*buf16++ = H2LE_16(signal[5][sample]);
376*600f14f4SXin Li 				*buf16++ = H2LE_16(signal[6][sample]);
377*600f14f4SXin Li 				*buf16++ = H2LE_16(signal[7][sample]);
378*600f14f4SXin Li 			}
379*600f14f4SXin Li 			return;
380*600f14f4SXin Li 
381*600f14f4SXin Li 		/* Three bytes per sample. */
382*600f14f4SXin Li 		case (BYTES_CHANNEL_SELECTOR (3, 1)):
383*600f14f4SXin Li 			for (sample = 0; sample < samples; sample++) {
384*600f14f4SXin Li 				a_word = signal[0][sample];
385*600f14f4SXin Li 				*buf_++ = (FLAC__byte)a_word; a_word >>= 8;
386*600f14f4SXin Li 				*buf_++ = (FLAC__byte)a_word; a_word >>= 8;
387*600f14f4SXin Li 				*buf_++ = (FLAC__byte)a_word;
388*600f14f4SXin Li 			}
389*600f14f4SXin Li 			return;
390*600f14f4SXin Li 
391*600f14f4SXin Li 		case (BYTES_CHANNEL_SELECTOR (3, 2)):
392*600f14f4SXin Li 			for (sample = 0; sample < samples; sample++) {
393*600f14f4SXin Li 				a_word = signal[0][sample];
394*600f14f4SXin Li 				*buf_++ = (FLAC__byte)a_word; a_word >>= 8;
395*600f14f4SXin Li 				*buf_++ = (FLAC__byte)a_word; a_word >>= 8;
396*600f14f4SXin Li 				*buf_++ = (FLAC__byte)a_word;
397*600f14f4SXin Li 				a_word = signal[1][sample];
398*600f14f4SXin Li 				*buf_++ = (FLAC__byte)a_word; a_word >>= 8;
399*600f14f4SXin Li 				*buf_++ = (FLAC__byte)a_word; a_word >>= 8;
400*600f14f4SXin Li 				*buf_++ = (FLAC__byte)a_word;
401*600f14f4SXin Li 			}
402*600f14f4SXin Li 			return;
403*600f14f4SXin Li 
404*600f14f4SXin Li 		/* Four bytes per sample. */
405*600f14f4SXin Li 		case (BYTES_CHANNEL_SELECTOR (4, 1)):
406*600f14f4SXin Li 			for (sample = 0; sample < samples; sample++)
407*600f14f4SXin Li 				*buf32++ = H2LE_32(signal[0][sample]);
408*600f14f4SXin Li 			return;
409*600f14f4SXin Li 
410*600f14f4SXin Li 		case (BYTES_CHANNEL_SELECTOR (4, 2)):
411*600f14f4SXin Li 			for (sample = 0; sample < samples; sample++) {
412*600f14f4SXin Li 				*buf32++ = H2LE_32(signal[0][sample]);
413*600f14f4SXin Li 				*buf32++ = H2LE_32(signal[1][sample]);
414*600f14f4SXin Li 			}
415*600f14f4SXin Li 			return;
416*600f14f4SXin Li 
417*600f14f4SXin Li 		case (BYTES_CHANNEL_SELECTOR (4, 4)):
418*600f14f4SXin Li 			for (sample = 0; sample < samples; sample++) {
419*600f14f4SXin Li 				*buf32++ = H2LE_32(signal[0][sample]);
420*600f14f4SXin Li 				*buf32++ = H2LE_32(signal[1][sample]);
421*600f14f4SXin Li 				*buf32++ = H2LE_32(signal[2][sample]);
422*600f14f4SXin Li 				*buf32++ = H2LE_32(signal[3][sample]);
423*600f14f4SXin Li 			}
424*600f14f4SXin Li 			return;
425*600f14f4SXin Li 
426*600f14f4SXin Li 		case (BYTES_CHANNEL_SELECTOR (4, 6)):
427*600f14f4SXin Li 			for (sample = 0; sample < samples; sample++) {
428*600f14f4SXin Li 				*buf32++ = H2LE_32(signal[0][sample]);
429*600f14f4SXin Li 				*buf32++ = H2LE_32(signal[1][sample]);
430*600f14f4SXin Li 				*buf32++ = H2LE_32(signal[2][sample]);
431*600f14f4SXin Li 				*buf32++ = H2LE_32(signal[3][sample]);
432*600f14f4SXin Li 				*buf32++ = H2LE_32(signal[4][sample]);
433*600f14f4SXin Li 				*buf32++ = H2LE_32(signal[5][sample]);
434*600f14f4SXin Li 			}
435*600f14f4SXin Li 			return;
436*600f14f4SXin Li 
437*600f14f4SXin Li 		case (BYTES_CHANNEL_SELECTOR (4, 8)):
438*600f14f4SXin Li 			for (sample = 0; sample < samples; sample++) {
439*600f14f4SXin Li 				*buf32++ = H2LE_32(signal[0][sample]);
440*600f14f4SXin Li 				*buf32++ = H2LE_32(signal[1][sample]);
441*600f14f4SXin Li 				*buf32++ = H2LE_32(signal[2][sample]);
442*600f14f4SXin Li 				*buf32++ = H2LE_32(signal[3][sample]);
443*600f14f4SXin Li 				*buf32++ = H2LE_32(signal[4][sample]);
444*600f14f4SXin Li 				*buf32++ = H2LE_32(signal[5][sample]);
445*600f14f4SXin Li 				*buf32++ = H2LE_32(signal[6][sample]);
446*600f14f4SXin Li 				*buf32++ = H2LE_32(signal[7][sample]);
447*600f14f4SXin Li 			}
448*600f14f4SXin Li 			return;
449*600f14f4SXin Li 
450*600f14f4SXin Li 		default:
451*600f14f4SXin Li 			break;
452*600f14f4SXin Li 	}
453*600f14f4SXin Li 
454*600f14f4SXin Li 	/* General version. */
455*600f14f4SXin Li 	switch (bytes_per_sample) {
456*600f14f4SXin Li 		case 1:
457*600f14f4SXin Li 			for (sample = 0; sample < samples; sample++)
458*600f14f4SXin Li 				for (channel = 0; channel < channels; channel++)
459*600f14f4SXin Li 					*buf_++ = signal[channel][sample];
460*600f14f4SXin Li 			return;
461*600f14f4SXin Li 
462*600f14f4SXin Li 		case 2:
463*600f14f4SXin Li 			for (sample = 0; sample < samples; sample++)
464*600f14f4SXin Li 				for (channel = 0; channel < channels; channel++)
465*600f14f4SXin Li 					*buf16++ = H2LE_16(signal[channel][sample]);
466*600f14f4SXin Li 			return;
467*600f14f4SXin Li 
468*600f14f4SXin Li 		case 3:
469*600f14f4SXin Li 			for (sample = 0; sample < samples; sample++)
470*600f14f4SXin Li 				for (channel = 0; channel < channels; channel++) {
471*600f14f4SXin Li 					a_word = signal[channel][sample];
472*600f14f4SXin Li 					*buf_++ = (FLAC__byte)a_word; a_word >>= 8;
473*600f14f4SXin Li 					*buf_++ = (FLAC__byte)a_word; a_word >>= 8;
474*600f14f4SXin Li 					*buf_++ = (FLAC__byte)a_word;
475*600f14f4SXin Li 				}
476*600f14f4SXin Li 			return;
477*600f14f4SXin Li 
478*600f14f4SXin Li 		case 4:
479*600f14f4SXin Li 			for (sample = 0; sample < samples; sample++)
480*600f14f4SXin Li 				for (channel = 0; channel < channels; channel++)
481*600f14f4SXin Li 					*buf32++ = H2LE_32(signal[channel][sample]);
482*600f14f4SXin Li 			return;
483*600f14f4SXin Li 
484*600f14f4SXin Li 		default:
485*600f14f4SXin Li 			break;
486*600f14f4SXin Li 	}
487*600f14f4SXin Li }
488*600f14f4SXin Li 
489*600f14f4SXin Li /*
490*600f14f4SXin Li  * Convert the incoming audio signal to a byte stream and FLAC__MD5Update it.
491*600f14f4SXin Li  */
FLAC__MD5Accumulate(FLAC__MD5Context * ctx,const FLAC__int32 * const signal[],uint32_t channels,uint32_t samples,uint32_t bytes_per_sample)492*600f14f4SXin Li FLAC__bool FLAC__MD5Accumulate(FLAC__MD5Context *ctx, const FLAC__int32 * const signal[], uint32_t channels, uint32_t samples, uint32_t bytes_per_sample)
493*600f14f4SXin Li {
494*600f14f4SXin Li 	const size_t bytes_needed = (size_t)channels * (size_t)samples * (size_t)bytes_per_sample;
495*600f14f4SXin Li 
496*600f14f4SXin Li 	/* overflow check */
497*600f14f4SXin Li 	if ((size_t)channels > SIZE_MAX / (size_t)bytes_per_sample)
498*600f14f4SXin Li 		return false;
499*600f14f4SXin Li 	if ((size_t)channels * (size_t)bytes_per_sample > SIZE_MAX / (size_t)samples)
500*600f14f4SXin Li 		return false;
501*600f14f4SXin Li 
502*600f14f4SXin Li 	if (ctx->capacity < bytes_needed) {
503*600f14f4SXin Li 		if (0 == (ctx->internal_buf.p8 = safe_realloc_(ctx->internal_buf.p8, bytes_needed))) {
504*600f14f4SXin Li 			if (0 == (ctx->internal_buf.p8 = safe_malloc_(bytes_needed))) {
505*600f14f4SXin Li 				ctx->capacity = 0;
506*600f14f4SXin Li 				return false;
507*600f14f4SXin Li 			}
508*600f14f4SXin Li 		}
509*600f14f4SXin Li 		ctx->capacity = bytes_needed;
510*600f14f4SXin Li 	}
511*600f14f4SXin Li 
512*600f14f4SXin Li 	format_input_(&ctx->internal_buf, signal, channels, samples, bytes_per_sample);
513*600f14f4SXin Li 
514*600f14f4SXin Li 	FLAC__MD5Update(ctx, ctx->internal_buf.p8, bytes_needed);
515*600f14f4SXin Li 
516*600f14f4SXin Li 	return true;
517*600f14f4SXin Li }
518