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