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