xref: /aosp_15_r20/external/dng_sdk/source/dng_fingerprint.cpp (revision fd1fabb72dbdf09ea7034f531e6f8e9f57334c8d)
1*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
2*fd1fabb7SAndroid Build Coastguard Worker // Copyright 2006-2007 Adobe Systems Incorporated
3*fd1fabb7SAndroid Build Coastguard Worker // All Rights Reserved.
4*fd1fabb7SAndroid Build Coastguard Worker //
5*fd1fabb7SAndroid Build Coastguard Worker // NOTICE:  Adobe permits you to use, modify, and distribute this file in
6*fd1fabb7SAndroid Build Coastguard Worker // accordance with the terms of the Adobe license agreement accompanying it.
7*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
8*fd1fabb7SAndroid Build Coastguard Worker 
9*fd1fabb7SAndroid Build Coastguard Worker /* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_fingerprint.cpp#3 $ */
10*fd1fabb7SAndroid Build Coastguard Worker /* $DateTime: 2012/07/11 10:36:56 $ */
11*fd1fabb7SAndroid Build Coastguard Worker /* $Change: 838485 $ */
12*fd1fabb7SAndroid Build Coastguard Worker /* $Author: tknoll $ */
13*fd1fabb7SAndroid Build Coastguard Worker 
14*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
15*fd1fabb7SAndroid Build Coastguard Worker 
16*fd1fabb7SAndroid Build Coastguard Worker #include "dng_fingerprint.h"
17*fd1fabb7SAndroid Build Coastguard Worker 
18*fd1fabb7SAndroid Build Coastguard Worker #include "dng_assertions.h"
19*fd1fabb7SAndroid Build Coastguard Worker #include "dng_flags.h"
20*fd1fabb7SAndroid Build Coastguard Worker 
21*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
22*fd1fabb7SAndroid Build Coastguard Worker 
dng_fingerprint()23*fd1fabb7SAndroid Build Coastguard Worker dng_fingerprint::dng_fingerprint ()
24*fd1fabb7SAndroid Build Coastguard Worker 	{
25*fd1fabb7SAndroid Build Coastguard Worker 
26*fd1fabb7SAndroid Build Coastguard Worker 	for (uint32 j = 0; j < 16; j++)
27*fd1fabb7SAndroid Build Coastguard Worker 		{
28*fd1fabb7SAndroid Build Coastguard Worker 
29*fd1fabb7SAndroid Build Coastguard Worker 		data [j] = 0;
30*fd1fabb7SAndroid Build Coastguard Worker 
31*fd1fabb7SAndroid Build Coastguard Worker 		}
32*fd1fabb7SAndroid Build Coastguard Worker 
33*fd1fabb7SAndroid Build Coastguard Worker 	}
34*fd1fabb7SAndroid Build Coastguard Worker 
35*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
36*fd1fabb7SAndroid Build Coastguard Worker 
IsNull() const37*fd1fabb7SAndroid Build Coastguard Worker bool dng_fingerprint::IsNull () const
38*fd1fabb7SAndroid Build Coastguard Worker 	{
39*fd1fabb7SAndroid Build Coastguard Worker 
40*fd1fabb7SAndroid Build Coastguard Worker 	for (uint32 j = 0; j < 16; j++)
41*fd1fabb7SAndroid Build Coastguard Worker 		{
42*fd1fabb7SAndroid Build Coastguard Worker 
43*fd1fabb7SAndroid Build Coastguard Worker 		if (data [j] != 0)
44*fd1fabb7SAndroid Build Coastguard Worker 			{
45*fd1fabb7SAndroid Build Coastguard Worker 
46*fd1fabb7SAndroid Build Coastguard Worker 			return false;
47*fd1fabb7SAndroid Build Coastguard Worker 
48*fd1fabb7SAndroid Build Coastguard Worker 			}
49*fd1fabb7SAndroid Build Coastguard Worker 
50*fd1fabb7SAndroid Build Coastguard Worker 		}
51*fd1fabb7SAndroid Build Coastguard Worker 
52*fd1fabb7SAndroid Build Coastguard Worker 	return true;
53*fd1fabb7SAndroid Build Coastguard Worker 
54*fd1fabb7SAndroid Build Coastguard Worker 	}
55*fd1fabb7SAndroid Build Coastguard Worker 
56*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
57*fd1fabb7SAndroid Build Coastguard Worker 
operator ==(const dng_fingerprint & print) const58*fd1fabb7SAndroid Build Coastguard Worker bool dng_fingerprint::operator== (const dng_fingerprint &print) const
59*fd1fabb7SAndroid Build Coastguard Worker 	{
60*fd1fabb7SAndroid Build Coastguard Worker 
61*fd1fabb7SAndroid Build Coastguard Worker 	for (uint32 j = 0; j < 16; j++)
62*fd1fabb7SAndroid Build Coastguard Worker 		{
63*fd1fabb7SAndroid Build Coastguard Worker 
64*fd1fabb7SAndroid Build Coastguard Worker 		if (data [j] != print.data [j])
65*fd1fabb7SAndroid Build Coastguard Worker 			{
66*fd1fabb7SAndroid Build Coastguard Worker 
67*fd1fabb7SAndroid Build Coastguard Worker 			return false;
68*fd1fabb7SAndroid Build Coastguard Worker 
69*fd1fabb7SAndroid Build Coastguard Worker 			}
70*fd1fabb7SAndroid Build Coastguard Worker 
71*fd1fabb7SAndroid Build Coastguard Worker 		}
72*fd1fabb7SAndroid Build Coastguard Worker 
73*fd1fabb7SAndroid Build Coastguard Worker 	return true;
74*fd1fabb7SAndroid Build Coastguard Worker 
75*fd1fabb7SAndroid Build Coastguard Worker 	}
76*fd1fabb7SAndroid Build Coastguard Worker 
77*fd1fabb7SAndroid Build Coastguard Worker /******************************************************************************/
78*fd1fabb7SAndroid Build Coastguard Worker 
Collapse32() const79*fd1fabb7SAndroid Build Coastguard Worker uint32 dng_fingerprint::Collapse32 () const
80*fd1fabb7SAndroid Build Coastguard Worker 	{
81*fd1fabb7SAndroid Build Coastguard Worker 
82*fd1fabb7SAndroid Build Coastguard Worker 	uint32 x = 0;
83*fd1fabb7SAndroid Build Coastguard Worker 
84*fd1fabb7SAndroid Build Coastguard Worker 	for (uint32 j = 0; j < 4; j++)
85*fd1fabb7SAndroid Build Coastguard Worker 		{
86*fd1fabb7SAndroid Build Coastguard Worker 
87*fd1fabb7SAndroid Build Coastguard Worker 		uint32 y = 0;
88*fd1fabb7SAndroid Build Coastguard Worker 
89*fd1fabb7SAndroid Build Coastguard Worker 		for (uint32 k = 0; k < 4; k++)
90*fd1fabb7SAndroid Build Coastguard Worker 			{
91*fd1fabb7SAndroid Build Coastguard Worker 
92*fd1fabb7SAndroid Build Coastguard Worker 			y = (y << 8) + (uint32) data [j * 4 + k];
93*fd1fabb7SAndroid Build Coastguard Worker 
94*fd1fabb7SAndroid Build Coastguard Worker 			}
95*fd1fabb7SAndroid Build Coastguard Worker 
96*fd1fabb7SAndroid Build Coastguard Worker 		x = x ^ y;
97*fd1fabb7SAndroid Build Coastguard Worker 
98*fd1fabb7SAndroid Build Coastguard Worker 		}
99*fd1fabb7SAndroid Build Coastguard Worker 
100*fd1fabb7SAndroid Build Coastguard Worker 	return x;
101*fd1fabb7SAndroid Build Coastguard Worker 
102*fd1fabb7SAndroid Build Coastguard Worker 	}
103*fd1fabb7SAndroid Build Coastguard Worker 
104*fd1fabb7SAndroid Build Coastguard Worker /******************************************************************************/
105*fd1fabb7SAndroid Build Coastguard Worker 
NumToHexChar(unsigned int c)106*fd1fabb7SAndroid Build Coastguard Worker static char NumToHexChar (unsigned int c)
107*fd1fabb7SAndroid Build Coastguard Worker 	{
108*fd1fabb7SAndroid Build Coastguard Worker 
109*fd1fabb7SAndroid Build Coastguard Worker 	if (c < 10)
110*fd1fabb7SAndroid Build Coastguard Worker 		{
111*fd1fabb7SAndroid Build Coastguard Worker 		return (char) ('0' + c);
112*fd1fabb7SAndroid Build Coastguard Worker 		}
113*fd1fabb7SAndroid Build Coastguard Worker 
114*fd1fabb7SAndroid Build Coastguard Worker 	else
115*fd1fabb7SAndroid Build Coastguard Worker 		{
116*fd1fabb7SAndroid Build Coastguard Worker 		return (char) ('A' + c - 10);
117*fd1fabb7SAndroid Build Coastguard Worker 		}
118*fd1fabb7SAndroid Build Coastguard Worker 
119*fd1fabb7SAndroid Build Coastguard Worker 	}
120*fd1fabb7SAndroid Build Coastguard Worker 
121*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
122*fd1fabb7SAndroid Build Coastguard Worker 
ToUtf8HexString(char resultStr[2* kDNGFingerprintSize+1]) const123*fd1fabb7SAndroid Build Coastguard Worker void dng_fingerprint::ToUtf8HexString (char resultStr [2 * kDNGFingerprintSize + 1]) const
124*fd1fabb7SAndroid Build Coastguard Worker 	{
125*fd1fabb7SAndroid Build Coastguard Worker 
126*fd1fabb7SAndroid Build Coastguard Worker 	for (size_t i = 0; i < kDNGFingerprintSize; i++)
127*fd1fabb7SAndroid Build Coastguard Worker 		{
128*fd1fabb7SAndroid Build Coastguard Worker 
129*fd1fabb7SAndroid Build Coastguard Worker 		unsigned char c = data [i];
130*fd1fabb7SAndroid Build Coastguard Worker 
131*fd1fabb7SAndroid Build Coastguard Worker 		resultStr [i * 2] = NumToHexChar (c >> 4);
132*fd1fabb7SAndroid Build Coastguard Worker 		resultStr [i * 2 + 1] = NumToHexChar (c & 15);
133*fd1fabb7SAndroid Build Coastguard Worker 
134*fd1fabb7SAndroid Build Coastguard Worker 		}
135*fd1fabb7SAndroid Build Coastguard Worker 
136*fd1fabb7SAndroid Build Coastguard Worker 	resultStr [kDNGFingerprintSize * 2] = '\0';
137*fd1fabb7SAndroid Build Coastguard Worker 
138*fd1fabb7SAndroid Build Coastguard Worker 	}
139*fd1fabb7SAndroid Build Coastguard Worker 
140*fd1fabb7SAndroid Build Coastguard Worker /******************************************************************************/
141*fd1fabb7SAndroid Build Coastguard Worker 
HexCharToNum(char hexChar)142*fd1fabb7SAndroid Build Coastguard Worker static int HexCharToNum (char hexChar)
143*fd1fabb7SAndroid Build Coastguard Worker 	{
144*fd1fabb7SAndroid Build Coastguard Worker 
145*fd1fabb7SAndroid Build Coastguard Worker 	if (hexChar >= '0' && hexChar <= '9')
146*fd1fabb7SAndroid Build Coastguard Worker 		{
147*fd1fabb7SAndroid Build Coastguard Worker 		return hexChar - '0';
148*fd1fabb7SAndroid Build Coastguard Worker 		}
149*fd1fabb7SAndroid Build Coastguard Worker 
150*fd1fabb7SAndroid Build Coastguard Worker 	else if (hexChar >= 'A' && hexChar <= 'F')
151*fd1fabb7SAndroid Build Coastguard Worker 		{
152*fd1fabb7SAndroid Build Coastguard Worker 		return hexChar - 'A' + 10;
153*fd1fabb7SAndroid Build Coastguard Worker 		}
154*fd1fabb7SAndroid Build Coastguard Worker 
155*fd1fabb7SAndroid Build Coastguard Worker 	else if (hexChar >= 'a' && hexChar <= 'f')
156*fd1fabb7SAndroid Build Coastguard Worker 		{
157*fd1fabb7SAndroid Build Coastguard Worker 		return hexChar - 'a' + 10;
158*fd1fabb7SAndroid Build Coastguard Worker 		}
159*fd1fabb7SAndroid Build Coastguard Worker 
160*fd1fabb7SAndroid Build Coastguard Worker 	return -1;
161*fd1fabb7SAndroid Build Coastguard Worker 
162*fd1fabb7SAndroid Build Coastguard Worker 	}
163*fd1fabb7SAndroid Build Coastguard Worker 
164*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
165*fd1fabb7SAndroid Build Coastguard Worker 
FromUtf8HexString(const char inputStr[2* kDNGFingerprintSize+1])166*fd1fabb7SAndroid Build Coastguard Worker bool dng_fingerprint::FromUtf8HexString (const char inputStr [2 * kDNGFingerprintSize + 1])
167*fd1fabb7SAndroid Build Coastguard Worker 	{
168*fd1fabb7SAndroid Build Coastguard Worker 
169*fd1fabb7SAndroid Build Coastguard Worker 	for (size_t i = 0; i < kDNGFingerprintSize; i++)
170*fd1fabb7SAndroid Build Coastguard Worker 		{
171*fd1fabb7SAndroid Build Coastguard Worker 
172*fd1fabb7SAndroid Build Coastguard Worker 		int highNibble = HexCharToNum (inputStr [i * 2]);
173*fd1fabb7SAndroid Build Coastguard Worker 
174*fd1fabb7SAndroid Build Coastguard Worker 		if (highNibble < 0)
175*fd1fabb7SAndroid Build Coastguard Worker 			{
176*fd1fabb7SAndroid Build Coastguard Worker 			return false;
177*fd1fabb7SAndroid Build Coastguard Worker 			}
178*fd1fabb7SAndroid Build Coastguard Worker 
179*fd1fabb7SAndroid Build Coastguard Worker 		int lowNibble = HexCharToNum (inputStr [i * 2 + 1]);
180*fd1fabb7SAndroid Build Coastguard Worker 
181*fd1fabb7SAndroid Build Coastguard Worker 		if (lowNibble < 0)
182*fd1fabb7SAndroid Build Coastguard Worker 			{
183*fd1fabb7SAndroid Build Coastguard Worker 			return false;
184*fd1fabb7SAndroid Build Coastguard Worker 			}
185*fd1fabb7SAndroid Build Coastguard Worker 
186*fd1fabb7SAndroid Build Coastguard Worker 		data [i] = (uint8) ((highNibble << 4) + lowNibble);
187*fd1fabb7SAndroid Build Coastguard Worker 
188*fd1fabb7SAndroid Build Coastguard Worker 		}
189*fd1fabb7SAndroid Build Coastguard Worker 
190*fd1fabb7SAndroid Build Coastguard Worker 	return true;
191*fd1fabb7SAndroid Build Coastguard Worker 
192*fd1fabb7SAndroid Build Coastguard Worker 	}
193*fd1fabb7SAndroid Build Coastguard Worker 
194*fd1fabb7SAndroid Build Coastguard Worker /******************************************************************************/
195*fd1fabb7SAndroid Build Coastguard Worker 
196*fd1fabb7SAndroid Build Coastguard Worker // Derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm
197*fd1fabb7SAndroid Build Coastguard Worker 
198*fd1fabb7SAndroid Build Coastguard Worker // Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
199*fd1fabb7SAndroid Build Coastguard Worker // rights reserved.
200*fd1fabb7SAndroid Build Coastguard Worker //
201*fd1fabb7SAndroid Build Coastguard Worker // License to copy and use this software is granted provided that it
202*fd1fabb7SAndroid Build Coastguard Worker // is identified as the "RSA Data Security, Inc. MD5 Message-Digest
203*fd1fabb7SAndroid Build Coastguard Worker // Algorithm" in all material mentioning or referencing this software
204*fd1fabb7SAndroid Build Coastguard Worker // or this function.
205*fd1fabb7SAndroid Build Coastguard Worker //
206*fd1fabb7SAndroid Build Coastguard Worker // License is also granted to make and use derivative works provided
207*fd1fabb7SAndroid Build Coastguard Worker // that such works are identified as "derived from the RSA Data
208*fd1fabb7SAndroid Build Coastguard Worker // Security, Inc. MD5 Message-Digest Algorithm" in all material
209*fd1fabb7SAndroid Build Coastguard Worker // mentioning or referencing the derived work.
210*fd1fabb7SAndroid Build Coastguard Worker //
211*fd1fabb7SAndroid Build Coastguard Worker // RSA Data Security, Inc. makes no representations concerning either
212*fd1fabb7SAndroid Build Coastguard Worker // the merchantability of this software or the suitability of this
213*fd1fabb7SAndroid Build Coastguard Worker // software for any particular purpose. It is provided "as is"
214*fd1fabb7SAndroid Build Coastguard Worker // without express or implied warranty of any kind.
215*fd1fabb7SAndroid Build Coastguard Worker //
216*fd1fabb7SAndroid Build Coastguard Worker // These notices must be retained in any copies of any part of this
217*fd1fabb7SAndroid Build Coastguard Worker // documentation and/or software.
218*fd1fabb7SAndroid Build Coastguard Worker 
219*fd1fabb7SAndroid Build Coastguard Worker /******************************************************************************/
220*fd1fabb7SAndroid Build Coastguard Worker 
dng_md5_printer()221*fd1fabb7SAndroid Build Coastguard Worker dng_md5_printer::dng_md5_printer ()
222*fd1fabb7SAndroid Build Coastguard Worker 
223*fd1fabb7SAndroid Build Coastguard Worker 	:	final  (false)
224*fd1fabb7SAndroid Build Coastguard Worker 	,	result ()
225*fd1fabb7SAndroid Build Coastguard Worker 
226*fd1fabb7SAndroid Build Coastguard Worker 	{
227*fd1fabb7SAndroid Build Coastguard Worker 
228*fd1fabb7SAndroid Build Coastguard Worker 	Reset ();
229*fd1fabb7SAndroid Build Coastguard Worker 
230*fd1fabb7SAndroid Build Coastguard Worker 	}
231*fd1fabb7SAndroid Build Coastguard Worker 
232*fd1fabb7SAndroid Build Coastguard Worker /******************************************************************************/
233*fd1fabb7SAndroid Build Coastguard Worker 
Reset()234*fd1fabb7SAndroid Build Coastguard Worker void dng_md5_printer::Reset ()
235*fd1fabb7SAndroid Build Coastguard Worker 	{
236*fd1fabb7SAndroid Build Coastguard Worker 
237*fd1fabb7SAndroid Build Coastguard Worker 	// No bits processed yet.
238*fd1fabb7SAndroid Build Coastguard Worker 
239*fd1fabb7SAndroid Build Coastguard Worker 	count [0] = 0;
240*fd1fabb7SAndroid Build Coastguard Worker 	count [1] = 0;
241*fd1fabb7SAndroid Build Coastguard Worker 
242*fd1fabb7SAndroid Build Coastguard Worker 	// Load magic initialization constants.
243*fd1fabb7SAndroid Build Coastguard Worker 
244*fd1fabb7SAndroid Build Coastguard Worker 	state [0] = 0x67452301;
245*fd1fabb7SAndroid Build Coastguard Worker 	state [1] = 0xefcdab89;
246*fd1fabb7SAndroid Build Coastguard Worker 	state [2] = 0x98badcfe;
247*fd1fabb7SAndroid Build Coastguard Worker 	state [3] = 0x10325476;
248*fd1fabb7SAndroid Build Coastguard Worker 
249*fd1fabb7SAndroid Build Coastguard Worker 	// Not finalized yet.
250*fd1fabb7SAndroid Build Coastguard Worker 
251*fd1fabb7SAndroid Build Coastguard Worker 	final = false;
252*fd1fabb7SAndroid Build Coastguard Worker 
253*fd1fabb7SAndroid Build Coastguard Worker 	}
254*fd1fabb7SAndroid Build Coastguard Worker 
255*fd1fabb7SAndroid Build Coastguard Worker /******************************************************************************/
256*fd1fabb7SAndroid Build Coastguard Worker 
Process(const void * data,uint32 inputLen)257*fd1fabb7SAndroid Build Coastguard Worker void dng_md5_printer::Process (const void *data,
258*fd1fabb7SAndroid Build Coastguard Worker 					  		   uint32 inputLen)
259*fd1fabb7SAndroid Build Coastguard Worker 	{
260*fd1fabb7SAndroid Build Coastguard Worker 
261*fd1fabb7SAndroid Build Coastguard Worker 	DNG_ASSERT (!final, "Fingerprint already finalized!");
262*fd1fabb7SAndroid Build Coastguard Worker 
263*fd1fabb7SAndroid Build Coastguard Worker 	const uint8 *input = (const uint8 *) data;
264*fd1fabb7SAndroid Build Coastguard Worker 
265*fd1fabb7SAndroid Build Coastguard Worker 	// Compute number of bytes mod 64
266*fd1fabb7SAndroid Build Coastguard Worker 
267*fd1fabb7SAndroid Build Coastguard Worker 	uint32 index = (count [0] >> 3) & 0x3F;
268*fd1fabb7SAndroid Build Coastguard Worker 
269*fd1fabb7SAndroid Build Coastguard Worker 	// Update number of bits
270*fd1fabb7SAndroid Build Coastguard Worker 
271*fd1fabb7SAndroid Build Coastguard Worker 	if ((count [0] += inputLen << 3) < (inputLen << 3))
272*fd1fabb7SAndroid Build Coastguard Worker 		{
273*fd1fabb7SAndroid Build Coastguard Worker 		count [1]++;
274*fd1fabb7SAndroid Build Coastguard Worker 		}
275*fd1fabb7SAndroid Build Coastguard Worker 
276*fd1fabb7SAndroid Build Coastguard Worker 	count [1] += inputLen >> 29;
277*fd1fabb7SAndroid Build Coastguard Worker 
278*fd1fabb7SAndroid Build Coastguard Worker 	// Transform as many times as possible.
279*fd1fabb7SAndroid Build Coastguard Worker 
280*fd1fabb7SAndroid Build Coastguard Worker 	uint32 i = 0;
281*fd1fabb7SAndroid Build Coastguard Worker 
282*fd1fabb7SAndroid Build Coastguard Worker 	uint32 partLen = 64 - index;
283*fd1fabb7SAndroid Build Coastguard Worker 
284*fd1fabb7SAndroid Build Coastguard Worker 	if (inputLen >= partLen)
285*fd1fabb7SAndroid Build Coastguard Worker 		{
286*fd1fabb7SAndroid Build Coastguard Worker 
287*fd1fabb7SAndroid Build Coastguard Worker 		memcpy (&buffer [index],
288*fd1fabb7SAndroid Build Coastguard Worker 				input,
289*fd1fabb7SAndroid Build Coastguard Worker 				partLen);
290*fd1fabb7SAndroid Build Coastguard Worker 
291*fd1fabb7SAndroid Build Coastguard Worker 		MD5Transform (state, buffer);
292*fd1fabb7SAndroid Build Coastguard Worker 
293*fd1fabb7SAndroid Build Coastguard Worker 		for (i = partLen; i + 63 < inputLen; i += 64)
294*fd1fabb7SAndroid Build Coastguard Worker 			{
295*fd1fabb7SAndroid Build Coastguard Worker 
296*fd1fabb7SAndroid Build Coastguard Worker 			MD5Transform (state, &input [i]);
297*fd1fabb7SAndroid Build Coastguard Worker 
298*fd1fabb7SAndroid Build Coastguard Worker 			}
299*fd1fabb7SAndroid Build Coastguard Worker 
300*fd1fabb7SAndroid Build Coastguard Worker 		index = 0;
301*fd1fabb7SAndroid Build Coastguard Worker 
302*fd1fabb7SAndroid Build Coastguard Worker 		}
303*fd1fabb7SAndroid Build Coastguard Worker 
304*fd1fabb7SAndroid Build Coastguard Worker 	// Buffer remaining input
305*fd1fabb7SAndroid Build Coastguard Worker 
306*fd1fabb7SAndroid Build Coastguard Worker 	memcpy (&buffer [index],
307*fd1fabb7SAndroid Build Coastguard Worker 			&input [i],
308*fd1fabb7SAndroid Build Coastguard Worker 			inputLen - i);
309*fd1fabb7SAndroid Build Coastguard Worker 
310*fd1fabb7SAndroid Build Coastguard Worker 	}
311*fd1fabb7SAndroid Build Coastguard Worker 
312*fd1fabb7SAndroid Build Coastguard Worker /******************************************************************************/
313*fd1fabb7SAndroid Build Coastguard Worker 
Result()314*fd1fabb7SAndroid Build Coastguard Worker const dng_fingerprint & dng_md5_printer::Result ()
315*fd1fabb7SAndroid Build Coastguard Worker 	{
316*fd1fabb7SAndroid Build Coastguard Worker 
317*fd1fabb7SAndroid Build Coastguard Worker 	if (!final)
318*fd1fabb7SAndroid Build Coastguard Worker 		{
319*fd1fabb7SAndroid Build Coastguard Worker 
320*fd1fabb7SAndroid Build Coastguard Worker 		static uint8 PADDING [64] =
321*fd1fabb7SAndroid Build Coastguard Worker 			{
322*fd1fabb7SAndroid Build Coastguard Worker 			0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
323*fd1fabb7SAndroid Build Coastguard Worker 			0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
324*fd1fabb7SAndroid Build Coastguard Worker 			0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
325*fd1fabb7SAndroid Build Coastguard Worker 			};
326*fd1fabb7SAndroid Build Coastguard Worker 
327*fd1fabb7SAndroid Build Coastguard Worker 		// Save number of bits
328*fd1fabb7SAndroid Build Coastguard Worker 
329*fd1fabb7SAndroid Build Coastguard Worker 		uint8 bits [8];
330*fd1fabb7SAndroid Build Coastguard Worker 
331*fd1fabb7SAndroid Build Coastguard Worker 		Encode (bits, count, 8);
332*fd1fabb7SAndroid Build Coastguard Worker 
333*fd1fabb7SAndroid Build Coastguard Worker 		// Pad out to 56 mod 64.
334*fd1fabb7SAndroid Build Coastguard Worker 
335*fd1fabb7SAndroid Build Coastguard Worker 		uint32 index = (count [0] >> 3) & 0x3f;
336*fd1fabb7SAndroid Build Coastguard Worker 
337*fd1fabb7SAndroid Build Coastguard Worker 		uint32 padLen = (index < 56) ? (56 - index) : (120 - index);
338*fd1fabb7SAndroid Build Coastguard Worker 
339*fd1fabb7SAndroid Build Coastguard Worker 		Process (PADDING, padLen);
340*fd1fabb7SAndroid Build Coastguard Worker 
341*fd1fabb7SAndroid Build Coastguard Worker 		// Append length (before padding)
342*fd1fabb7SAndroid Build Coastguard Worker 
343*fd1fabb7SAndroid Build Coastguard Worker 		Process (bits, 8);
344*fd1fabb7SAndroid Build Coastguard Worker 
345*fd1fabb7SAndroid Build Coastguard Worker 		// Store state in digest
346*fd1fabb7SAndroid Build Coastguard Worker 
347*fd1fabb7SAndroid Build Coastguard Worker 		Encode (result.data, state, 16);
348*fd1fabb7SAndroid Build Coastguard Worker 
349*fd1fabb7SAndroid Build Coastguard Worker 		// We are now finalized.
350*fd1fabb7SAndroid Build Coastguard Worker 
351*fd1fabb7SAndroid Build Coastguard Worker 		final = true;
352*fd1fabb7SAndroid Build Coastguard Worker 
353*fd1fabb7SAndroid Build Coastguard Worker 		}
354*fd1fabb7SAndroid Build Coastguard Worker 
355*fd1fabb7SAndroid Build Coastguard Worker 	return result;
356*fd1fabb7SAndroid Build Coastguard Worker 
357*fd1fabb7SAndroid Build Coastguard Worker 	}
358*fd1fabb7SAndroid Build Coastguard Worker 
359*fd1fabb7SAndroid Build Coastguard Worker /******************************************************************************/
360*fd1fabb7SAndroid Build Coastguard Worker 
361*fd1fabb7SAndroid Build Coastguard Worker // Encodes input (uint32) into output (uint8). Assumes len is
362*fd1fabb7SAndroid Build Coastguard Worker // a multiple of 4.
363*fd1fabb7SAndroid Build Coastguard Worker 
Encode(uint8 * output,const uint32 * input,uint32 len)364*fd1fabb7SAndroid Build Coastguard Worker void dng_md5_printer::Encode (uint8 *output,
365*fd1fabb7SAndroid Build Coastguard Worker 							  const uint32 *input,
366*fd1fabb7SAndroid Build Coastguard Worker 							  uint32 len)
367*fd1fabb7SAndroid Build Coastguard Worker 	{
368*fd1fabb7SAndroid Build Coastguard Worker 
369*fd1fabb7SAndroid Build Coastguard Worker 	uint32 i, j;
370*fd1fabb7SAndroid Build Coastguard Worker 
371*fd1fabb7SAndroid Build Coastguard Worker 	for (i = 0, j = 0; j < len; i++, j += 4)
372*fd1fabb7SAndroid Build Coastguard Worker 		{
373*fd1fabb7SAndroid Build Coastguard Worker 		output [j  ] = (uint8) ((input [i]      ) & 0xff);
374*fd1fabb7SAndroid Build Coastguard Worker 		output [j+1] = (uint8) ((input [i] >>  8) & 0xff);
375*fd1fabb7SAndroid Build Coastguard Worker 		output [j+2] = (uint8) ((input [i] >> 16) & 0xff);
376*fd1fabb7SAndroid Build Coastguard Worker 		output [j+3] = (uint8) ((input [i] >> 24) & 0xff);
377*fd1fabb7SAndroid Build Coastguard Worker 		}
378*fd1fabb7SAndroid Build Coastguard Worker 
379*fd1fabb7SAndroid Build Coastguard Worker 	}
380*fd1fabb7SAndroid Build Coastguard Worker 
381*fd1fabb7SAndroid Build Coastguard Worker /******************************************************************************/
382*fd1fabb7SAndroid Build Coastguard Worker 
383*fd1fabb7SAndroid Build Coastguard Worker // Decodes input (uint8) into output (uint32). Assumes len is
384*fd1fabb7SAndroid Build Coastguard Worker // a multiple of 4.
385*fd1fabb7SAndroid Build Coastguard Worker 
Decode(uint32 * output,const uint8 * input,uint32 len)386*fd1fabb7SAndroid Build Coastguard Worker void dng_md5_printer::Decode (uint32 *output,
387*fd1fabb7SAndroid Build Coastguard Worker 							  const uint8 *input,
388*fd1fabb7SAndroid Build Coastguard Worker 							  uint32 len)
389*fd1fabb7SAndroid Build Coastguard Worker 	{
390*fd1fabb7SAndroid Build Coastguard Worker 
391*fd1fabb7SAndroid Build Coastguard Worker 	// Check for non-aligned case.
392*fd1fabb7SAndroid Build Coastguard Worker 
393*fd1fabb7SAndroid Build Coastguard Worker 	if (((uintptr) input) & 3)
394*fd1fabb7SAndroid Build Coastguard Worker 		{
395*fd1fabb7SAndroid Build Coastguard Worker 
396*fd1fabb7SAndroid Build Coastguard Worker 		uint32 i, j;
397*fd1fabb7SAndroid Build Coastguard Worker 
398*fd1fabb7SAndroid Build Coastguard Worker 		for (i = 0, j = 0; j < len; i++, j += 4)
399*fd1fabb7SAndroid Build Coastguard Worker 			{
400*fd1fabb7SAndroid Build Coastguard Worker 
401*fd1fabb7SAndroid Build Coastguard Worker 	 		output [i] = (((uint32) input [j  ])      ) |
402*fd1fabb7SAndroid Build Coastguard Worker 	 					 (((uint32) input [j+1]) <<  8) |
403*fd1fabb7SAndroid Build Coastguard Worker 	   					 (((uint32) input [j+2]) << 16) |
404*fd1fabb7SAndroid Build Coastguard Worker 	   					 (((uint32) input [j+3]) << 24);
405*fd1fabb7SAndroid Build Coastguard Worker 
406*fd1fabb7SAndroid Build Coastguard Worker 	   		}
407*fd1fabb7SAndroid Build Coastguard Worker 
408*fd1fabb7SAndroid Build Coastguard Worker 	   	}
409*fd1fabb7SAndroid Build Coastguard Worker 
410*fd1fabb7SAndroid Build Coastguard Worker 	// Else use optimized code for aligned case.
411*fd1fabb7SAndroid Build Coastguard Worker 
412*fd1fabb7SAndroid Build Coastguard Worker 	else
413*fd1fabb7SAndroid Build Coastguard Worker 		{
414*fd1fabb7SAndroid Build Coastguard Worker 
415*fd1fabb7SAndroid Build Coastguard Worker 		len = len >> 2;
416*fd1fabb7SAndroid Build Coastguard Worker 
417*fd1fabb7SAndroid Build Coastguard Worker 		const uint32 *sPtr = (const uint32 *) input;
418*fd1fabb7SAndroid Build Coastguard Worker 
419*fd1fabb7SAndroid Build Coastguard Worker 		uint32 *dPtr = output;
420*fd1fabb7SAndroid Build Coastguard Worker 
421*fd1fabb7SAndroid Build Coastguard Worker 		while (len--)
422*fd1fabb7SAndroid Build Coastguard Worker 			{
423*fd1fabb7SAndroid Build Coastguard Worker 
424*fd1fabb7SAndroid Build Coastguard Worker 			#if qDNGBigEndian
425*fd1fabb7SAndroid Build Coastguard Worker 
426*fd1fabb7SAndroid Build Coastguard Worker 			uint32 data = *(sPtr++);
427*fd1fabb7SAndroid Build Coastguard Worker 
428*fd1fabb7SAndroid Build Coastguard Worker 			data = (data >> 24) |
429*fd1fabb7SAndroid Build Coastguard Worker 				   ((data >> 8) & 0x0000FF00) |
430*fd1fabb7SAndroid Build Coastguard Worker 				   ((data << 8) & 0x00FF0000) |
431*fd1fabb7SAndroid Build Coastguard Worker 				   (data << 24);
432*fd1fabb7SAndroid Build Coastguard Worker 
433*fd1fabb7SAndroid Build Coastguard Worker 			*(dPtr++) = data;
434*fd1fabb7SAndroid Build Coastguard Worker 
435*fd1fabb7SAndroid Build Coastguard Worker 			#else
436*fd1fabb7SAndroid Build Coastguard Worker 
437*fd1fabb7SAndroid Build Coastguard Worker 			*(dPtr++) = *(sPtr++);
438*fd1fabb7SAndroid Build Coastguard Worker 
439*fd1fabb7SAndroid Build Coastguard Worker 			#endif
440*fd1fabb7SAndroid Build Coastguard Worker 
441*fd1fabb7SAndroid Build Coastguard Worker 			}
442*fd1fabb7SAndroid Build Coastguard Worker 
443*fd1fabb7SAndroid Build Coastguard Worker 		}
444*fd1fabb7SAndroid Build Coastguard Worker 
445*fd1fabb7SAndroid Build Coastguard Worker 	}
446*fd1fabb7SAndroid Build Coastguard Worker 
447*fd1fabb7SAndroid Build Coastguard Worker /******************************************************************************/
448*fd1fabb7SAndroid Build Coastguard Worker 
449*fd1fabb7SAndroid Build Coastguard Worker // MD5 basic transformation. Transforms state based on block.
450*fd1fabb7SAndroid Build Coastguard Worker 
451*fd1fabb7SAndroid Build Coastguard Worker #if defined(__clang__) && defined(__has_attribute)
452*fd1fabb7SAndroid Build Coastguard Worker #if __has_attribute(no_sanitize)
453*fd1fabb7SAndroid Build Coastguard Worker __attribute__((no_sanitize("unsigned-integer-overflow")))
454*fd1fabb7SAndroid Build Coastguard Worker #endif
455*fd1fabb7SAndroid Build Coastguard Worker #endif
MD5Transform(uint32 state[4],const uint8 block[64])456*fd1fabb7SAndroid Build Coastguard Worker void dng_md5_printer::MD5Transform (uint32 state [4],
457*fd1fabb7SAndroid Build Coastguard Worker 								    const uint8 block [64])
458*fd1fabb7SAndroid Build Coastguard Worker 	{
459*fd1fabb7SAndroid Build Coastguard Worker 
460*fd1fabb7SAndroid Build Coastguard Worker 	enum
461*fd1fabb7SAndroid Build Coastguard Worker 		{
462*fd1fabb7SAndroid Build Coastguard Worker 		S11 = 7,
463*fd1fabb7SAndroid Build Coastguard Worker 		S12 = 12,
464*fd1fabb7SAndroid Build Coastguard Worker 		S13 = 17,
465*fd1fabb7SAndroid Build Coastguard Worker 		S14 = 22,
466*fd1fabb7SAndroid Build Coastguard Worker 		S21 = 5,
467*fd1fabb7SAndroid Build Coastguard Worker 		S22 = 9,
468*fd1fabb7SAndroid Build Coastguard Worker 		S23 = 14,
469*fd1fabb7SAndroid Build Coastguard Worker 		S24 = 20,
470*fd1fabb7SAndroid Build Coastguard Worker 		S31 = 4,
471*fd1fabb7SAndroid Build Coastguard Worker 		S32 = 11,
472*fd1fabb7SAndroid Build Coastguard Worker 		S33 = 16,
473*fd1fabb7SAndroid Build Coastguard Worker 		S34 = 23,
474*fd1fabb7SAndroid Build Coastguard Worker 		S41 = 6,
475*fd1fabb7SAndroid Build Coastguard Worker 		S42 = 10,
476*fd1fabb7SAndroid Build Coastguard Worker 		S43 = 15,
477*fd1fabb7SAndroid Build Coastguard Worker 		S44 = 21
478*fd1fabb7SAndroid Build Coastguard Worker 		};
479*fd1fabb7SAndroid Build Coastguard Worker 
480*fd1fabb7SAndroid Build Coastguard Worker 	#if qDNGBigEndian
481*fd1fabb7SAndroid Build Coastguard Worker 
482*fd1fabb7SAndroid Build Coastguard Worker 	uint32 x [16];
483*fd1fabb7SAndroid Build Coastguard Worker 
484*fd1fabb7SAndroid Build Coastguard Worker 	Decode (x, block, 64);
485*fd1fabb7SAndroid Build Coastguard Worker 
486*fd1fabb7SAndroid Build Coastguard Worker 	#else
487*fd1fabb7SAndroid Build Coastguard Worker 
488*fd1fabb7SAndroid Build Coastguard Worker 	uint32 temp [16];
489*fd1fabb7SAndroid Build Coastguard Worker 
490*fd1fabb7SAndroid Build Coastguard Worker 	const uint32 *x;
491*fd1fabb7SAndroid Build Coastguard Worker 
492*fd1fabb7SAndroid Build Coastguard Worker 	if (((uintptr) block) & 3)
493*fd1fabb7SAndroid Build Coastguard Worker 		{
494*fd1fabb7SAndroid Build Coastguard Worker 
495*fd1fabb7SAndroid Build Coastguard Worker 		Decode (temp, block, 64);
496*fd1fabb7SAndroid Build Coastguard Worker 
497*fd1fabb7SAndroid Build Coastguard Worker 		x = temp;
498*fd1fabb7SAndroid Build Coastguard Worker 
499*fd1fabb7SAndroid Build Coastguard Worker 		}
500*fd1fabb7SAndroid Build Coastguard Worker 
501*fd1fabb7SAndroid Build Coastguard Worker 	else
502*fd1fabb7SAndroid Build Coastguard Worker 		x = (const uint32 *) block;
503*fd1fabb7SAndroid Build Coastguard Worker 
504*fd1fabb7SAndroid Build Coastguard Worker 	#endif
505*fd1fabb7SAndroid Build Coastguard Worker 
506*fd1fabb7SAndroid Build Coastguard Worker 	uint32 a = state [0];
507*fd1fabb7SAndroid Build Coastguard Worker 	uint32 b = state [1];
508*fd1fabb7SAndroid Build Coastguard Worker 	uint32 c = state [2];
509*fd1fabb7SAndroid Build Coastguard Worker 	uint32 d = state [3];
510*fd1fabb7SAndroid Build Coastguard Worker 
511*fd1fabb7SAndroid Build Coastguard Worker 	/* Round 1 */
512*fd1fabb7SAndroid Build Coastguard Worker 	FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
513*fd1fabb7SAndroid Build Coastguard Worker 	FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
514*fd1fabb7SAndroid Build Coastguard Worker 	FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
515*fd1fabb7SAndroid Build Coastguard Worker 	FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
516*fd1fabb7SAndroid Build Coastguard Worker 	FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
517*fd1fabb7SAndroid Build Coastguard Worker 	FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
518*fd1fabb7SAndroid Build Coastguard Worker 	FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
519*fd1fabb7SAndroid Build Coastguard Worker 	FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
520*fd1fabb7SAndroid Build Coastguard Worker 	FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
521*fd1fabb7SAndroid Build Coastguard Worker 	FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
522*fd1fabb7SAndroid Build Coastguard Worker 	FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
523*fd1fabb7SAndroid Build Coastguard Worker 	FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
524*fd1fabb7SAndroid Build Coastguard Worker 	FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
525*fd1fabb7SAndroid Build Coastguard Worker 	FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
526*fd1fabb7SAndroid Build Coastguard Worker 	FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
527*fd1fabb7SAndroid Build Coastguard Worker 	FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
528*fd1fabb7SAndroid Build Coastguard Worker 
529*fd1fabb7SAndroid Build Coastguard Worker 	/* Round 2 */
530*fd1fabb7SAndroid Build Coastguard Worker 	GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
531*fd1fabb7SAndroid Build Coastguard Worker 	GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
532*fd1fabb7SAndroid Build Coastguard Worker 	GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
533*fd1fabb7SAndroid Build Coastguard Worker 	GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
534*fd1fabb7SAndroid Build Coastguard Worker 	GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
535*fd1fabb7SAndroid Build Coastguard Worker 	GG (d, a, b, c, x[10], S22,  0x2441453); /* 22 */
536*fd1fabb7SAndroid Build Coastguard Worker 	GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
537*fd1fabb7SAndroid Build Coastguard Worker 	GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
538*fd1fabb7SAndroid Build Coastguard Worker 	GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
539*fd1fabb7SAndroid Build Coastguard Worker 	GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
540*fd1fabb7SAndroid Build Coastguard Worker 	GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
541*fd1fabb7SAndroid Build Coastguard Worker 	GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
542*fd1fabb7SAndroid Build Coastguard Worker 	GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
543*fd1fabb7SAndroid Build Coastguard Worker 	GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
544*fd1fabb7SAndroid Build Coastguard Worker 	GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
545*fd1fabb7SAndroid Build Coastguard Worker 	GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
546*fd1fabb7SAndroid Build Coastguard Worker 
547*fd1fabb7SAndroid Build Coastguard Worker 	/* Round 3 */
548*fd1fabb7SAndroid Build Coastguard Worker 	HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
549*fd1fabb7SAndroid Build Coastguard Worker 	HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
550*fd1fabb7SAndroid Build Coastguard Worker 	HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
551*fd1fabb7SAndroid Build Coastguard Worker 	HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
552*fd1fabb7SAndroid Build Coastguard Worker 	HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
553*fd1fabb7SAndroid Build Coastguard Worker 	HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
554*fd1fabb7SAndroid Build Coastguard Worker 	HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
555*fd1fabb7SAndroid Build Coastguard Worker 	HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
556*fd1fabb7SAndroid Build Coastguard Worker 	HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
557*fd1fabb7SAndroid Build Coastguard Worker 	HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
558*fd1fabb7SAndroid Build Coastguard Worker 	HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
559*fd1fabb7SAndroid Build Coastguard Worker 	HH (b, c, d, a, x[ 6], S34,  0x4881d05); /* 44 */
560*fd1fabb7SAndroid Build Coastguard Worker 	HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
561*fd1fabb7SAndroid Build Coastguard Worker 	HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
562*fd1fabb7SAndroid Build Coastguard Worker 	HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
563*fd1fabb7SAndroid Build Coastguard Worker 	HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
564*fd1fabb7SAndroid Build Coastguard Worker 
565*fd1fabb7SAndroid Build Coastguard Worker 	/* Round 4 */
566*fd1fabb7SAndroid Build Coastguard Worker 	II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
567*fd1fabb7SAndroid Build Coastguard Worker 	II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
568*fd1fabb7SAndroid Build Coastguard Worker 	II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
569*fd1fabb7SAndroid Build Coastguard Worker 	II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
570*fd1fabb7SAndroid Build Coastguard Worker 	II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
571*fd1fabb7SAndroid Build Coastguard Worker 	II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
572*fd1fabb7SAndroid Build Coastguard Worker 	II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
573*fd1fabb7SAndroid Build Coastguard Worker 	II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
574*fd1fabb7SAndroid Build Coastguard Worker 	II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
575*fd1fabb7SAndroid Build Coastguard Worker 	II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
576*fd1fabb7SAndroid Build Coastguard Worker 	II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
577*fd1fabb7SAndroid Build Coastguard Worker 	II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
578*fd1fabb7SAndroid Build Coastguard Worker 	II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
579*fd1fabb7SAndroid Build Coastguard Worker 	II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
580*fd1fabb7SAndroid Build Coastguard Worker 	II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
581*fd1fabb7SAndroid Build Coastguard Worker 	II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
582*fd1fabb7SAndroid Build Coastguard Worker 
583*fd1fabb7SAndroid Build Coastguard Worker 	state [0] += a;
584*fd1fabb7SAndroid Build Coastguard Worker 	state [1] += b;
585*fd1fabb7SAndroid Build Coastguard Worker 	state [2] += c;
586*fd1fabb7SAndroid Build Coastguard Worker 	state [3] += d;
587*fd1fabb7SAndroid Build Coastguard Worker 
588*fd1fabb7SAndroid Build Coastguard Worker 	}
589*fd1fabb7SAndroid Build Coastguard Worker 
590*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
591*fd1fabb7SAndroid Build Coastguard Worker 
592*fd1fabb7SAndroid Build Coastguard Worker // End of RSA Data Security, Inc. derived code.
593*fd1fabb7SAndroid Build Coastguard Worker 
594*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
595