1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker * Private MD5 implementation for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker *
4*5e7646d2SAndroid Build Coastguard Worker * Copyright 2007-2017 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker * Copyright 2005 by Easy Software Products
6*5e7646d2SAndroid Build Coastguard Worker * Copyright (C) 1999 Aladdin Enterprises. All rights reserved.
7*5e7646d2SAndroid Build Coastguard Worker *
8*5e7646d2SAndroid Build Coastguard Worker * This software is provided 'as-is', without any express or implied
9*5e7646d2SAndroid Build Coastguard Worker * warranty. In no event will the authors be held liable for any damages
10*5e7646d2SAndroid Build Coastguard Worker * arising from the use of this software.
11*5e7646d2SAndroid Build Coastguard Worker *
12*5e7646d2SAndroid Build Coastguard Worker * Permission is granted to anyone to use this software for any purpose,
13*5e7646d2SAndroid Build Coastguard Worker * including commercial applications, and to alter it and redistribute it
14*5e7646d2SAndroid Build Coastguard Worker * freely, subject to the following restrictions:
15*5e7646d2SAndroid Build Coastguard Worker *
16*5e7646d2SAndroid Build Coastguard Worker * 1. The origin of this software must not be misrepresented; you must not
17*5e7646d2SAndroid Build Coastguard Worker * claim that you wrote the original software. If you use this software
18*5e7646d2SAndroid Build Coastguard Worker * in a product, an acknowledgment in the product documentation would be
19*5e7646d2SAndroid Build Coastguard Worker * appreciated but is not required.
20*5e7646d2SAndroid Build Coastguard Worker * 2. Altered source versions must be plainly marked as such, and must not be
21*5e7646d2SAndroid Build Coastguard Worker * misrepresented as being the original software.
22*5e7646d2SAndroid Build Coastguard Worker * 3. This notice may not be removed or altered from any source distribution.
23*5e7646d2SAndroid Build Coastguard Worker *
24*5e7646d2SAndroid Build Coastguard Worker * L. Peter Deutsch
25*5e7646d2SAndroid Build Coastguard Worker * [email protected]
26*5e7646d2SAndroid Build Coastguard Worker */
27*5e7646d2SAndroid Build Coastguard Worker /*
28*5e7646d2SAndroid Build Coastguard Worker Independent implementation of MD5 (RFC 1321).
29*5e7646d2SAndroid Build Coastguard Worker
30*5e7646d2SAndroid Build Coastguard Worker This code implements the MD5 Algorithm defined in RFC 1321.
31*5e7646d2SAndroid Build Coastguard Worker It is derived directly from the text of the RFC and not from the
32*5e7646d2SAndroid Build Coastguard Worker reference implementation.
33*5e7646d2SAndroid Build Coastguard Worker
34*5e7646d2SAndroid Build Coastguard Worker The original and principal author of md5.c is L. Peter Deutsch
35*5e7646d2SAndroid Build Coastguard Worker <[email protected]>. Other authors are noted in the change history
36*5e7646d2SAndroid Build Coastguard Worker that follows (in reverse chronological order):
37*5e7646d2SAndroid Build Coastguard Worker
38*5e7646d2SAndroid Build Coastguard Worker 1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
39*5e7646d2SAndroid Build Coastguard Worker 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5).
40*5e7646d2SAndroid Build Coastguard Worker 1999-05-03 lpd Original version.
41*5e7646d2SAndroid Build Coastguard Worker */
42*5e7646d2SAndroid Build Coastguard Worker
43*5e7646d2SAndroid Build Coastguard Worker #include "md5-internal.h"
44*5e7646d2SAndroid Build Coastguard Worker #include "string-private.h"
45*5e7646d2SAndroid Build Coastguard Worker
46*5e7646d2SAndroid Build Coastguard Worker #if !defined(__APPLE__)
47*5e7646d2SAndroid Build Coastguard Worker # define T1 0xd76aa478
48*5e7646d2SAndroid Build Coastguard Worker # define T2 0xe8c7b756
49*5e7646d2SAndroid Build Coastguard Worker # define T3 0x242070db
50*5e7646d2SAndroid Build Coastguard Worker # define T4 0xc1bdceee
51*5e7646d2SAndroid Build Coastguard Worker # define T5 0xf57c0faf
52*5e7646d2SAndroid Build Coastguard Worker # define T6 0x4787c62a
53*5e7646d2SAndroid Build Coastguard Worker # define T7 0xa8304613
54*5e7646d2SAndroid Build Coastguard Worker # define T8 0xfd469501
55*5e7646d2SAndroid Build Coastguard Worker # define T9 0x698098d8
56*5e7646d2SAndroid Build Coastguard Worker # define T10 0x8b44f7af
57*5e7646d2SAndroid Build Coastguard Worker # define T11 0xffff5bb1
58*5e7646d2SAndroid Build Coastguard Worker # define T12 0x895cd7be
59*5e7646d2SAndroid Build Coastguard Worker # define T13 0x6b901122
60*5e7646d2SAndroid Build Coastguard Worker # define T14 0xfd987193
61*5e7646d2SAndroid Build Coastguard Worker # define T15 0xa679438e
62*5e7646d2SAndroid Build Coastguard Worker # define T16 0x49b40821
63*5e7646d2SAndroid Build Coastguard Worker # define T17 0xf61e2562
64*5e7646d2SAndroid Build Coastguard Worker # define T18 0xc040b340
65*5e7646d2SAndroid Build Coastguard Worker # define T19 0x265e5a51
66*5e7646d2SAndroid Build Coastguard Worker # define T20 0xe9b6c7aa
67*5e7646d2SAndroid Build Coastguard Worker # define T21 0xd62f105d
68*5e7646d2SAndroid Build Coastguard Worker # define T22 0x02441453
69*5e7646d2SAndroid Build Coastguard Worker # define T23 0xd8a1e681
70*5e7646d2SAndroid Build Coastguard Worker # define T24 0xe7d3fbc8
71*5e7646d2SAndroid Build Coastguard Worker # define T25 0x21e1cde6
72*5e7646d2SAndroid Build Coastguard Worker # define T26 0xc33707d6
73*5e7646d2SAndroid Build Coastguard Worker # define T27 0xf4d50d87
74*5e7646d2SAndroid Build Coastguard Worker # define T28 0x455a14ed
75*5e7646d2SAndroid Build Coastguard Worker # define T29 0xa9e3e905
76*5e7646d2SAndroid Build Coastguard Worker # define T30 0xfcefa3f8
77*5e7646d2SAndroid Build Coastguard Worker # define T31 0x676f02d9
78*5e7646d2SAndroid Build Coastguard Worker # define T32 0x8d2a4c8a
79*5e7646d2SAndroid Build Coastguard Worker # define T33 0xfffa3942
80*5e7646d2SAndroid Build Coastguard Worker # define T34 0x8771f681
81*5e7646d2SAndroid Build Coastguard Worker # define T35 0x6d9d6122
82*5e7646d2SAndroid Build Coastguard Worker # define T36 0xfde5380c
83*5e7646d2SAndroid Build Coastguard Worker # define T37 0xa4beea44
84*5e7646d2SAndroid Build Coastguard Worker # define T38 0x4bdecfa9
85*5e7646d2SAndroid Build Coastguard Worker # define T39 0xf6bb4b60
86*5e7646d2SAndroid Build Coastguard Worker # define T40 0xbebfbc70
87*5e7646d2SAndroid Build Coastguard Worker # define T41 0x289b7ec6
88*5e7646d2SAndroid Build Coastguard Worker # define T42 0xeaa127fa
89*5e7646d2SAndroid Build Coastguard Worker # define T43 0xd4ef3085
90*5e7646d2SAndroid Build Coastguard Worker # define T44 0x04881d05
91*5e7646d2SAndroid Build Coastguard Worker # define T45 0xd9d4d039
92*5e7646d2SAndroid Build Coastguard Worker # define T46 0xe6db99e5
93*5e7646d2SAndroid Build Coastguard Worker # define T47 0x1fa27cf8
94*5e7646d2SAndroid Build Coastguard Worker # define T48 0xc4ac5665
95*5e7646d2SAndroid Build Coastguard Worker # define T49 0xf4292244
96*5e7646d2SAndroid Build Coastguard Worker # define T50 0x432aff97
97*5e7646d2SAndroid Build Coastguard Worker # define T51 0xab9423a7
98*5e7646d2SAndroid Build Coastguard Worker # define T52 0xfc93a039
99*5e7646d2SAndroid Build Coastguard Worker # define T53 0x655b59c3
100*5e7646d2SAndroid Build Coastguard Worker # define T54 0x8f0ccc92
101*5e7646d2SAndroid Build Coastguard Worker # define T55 0xffeff47d
102*5e7646d2SAndroid Build Coastguard Worker # define T56 0x85845dd1
103*5e7646d2SAndroid Build Coastguard Worker # define T57 0x6fa87e4f
104*5e7646d2SAndroid Build Coastguard Worker # define T58 0xfe2ce6e0
105*5e7646d2SAndroid Build Coastguard Worker # define T59 0xa3014314
106*5e7646d2SAndroid Build Coastguard Worker # define T60 0x4e0811a1
107*5e7646d2SAndroid Build Coastguard Worker # define T61 0xf7537e82
108*5e7646d2SAndroid Build Coastguard Worker # define T62 0xbd3af235
109*5e7646d2SAndroid Build Coastguard Worker # define T63 0x2ad7d2bb
110*5e7646d2SAndroid Build Coastguard Worker # define T64 0xeb86d391
111*5e7646d2SAndroid Build Coastguard Worker
112*5e7646d2SAndroid Build Coastguard Worker static void
_cups_md5_process(_cups_md5_state_t * pms,const unsigned char * data)113*5e7646d2SAndroid Build Coastguard Worker _cups_md5_process(_cups_md5_state_t *pms, const unsigned char *data /*[64]*/)
114*5e7646d2SAndroid Build Coastguard Worker {
115*5e7646d2SAndroid Build Coastguard Worker unsigned int
116*5e7646d2SAndroid Build Coastguard Worker a = pms->abcd[0], b = pms->abcd[1],
117*5e7646d2SAndroid Build Coastguard Worker c = pms->abcd[2], d = pms->abcd[3];
118*5e7646d2SAndroid Build Coastguard Worker unsigned int t;
119*5e7646d2SAndroid Build Coastguard Worker
120*5e7646d2SAndroid Build Coastguard Worker # ifndef ARCH_IS_BIG_ENDIAN
121*5e7646d2SAndroid Build Coastguard Worker # define ARCH_IS_BIG_ENDIAN 1 /* slower, default implementation */
122*5e7646d2SAndroid Build Coastguard Worker # endif
123*5e7646d2SAndroid Build Coastguard Worker # if ARCH_IS_BIG_ENDIAN
124*5e7646d2SAndroid Build Coastguard Worker
125*5e7646d2SAndroid Build Coastguard Worker /*
126*5e7646d2SAndroid Build Coastguard Worker * On big-endian machines, we must arrange the bytes in the right
127*5e7646d2SAndroid Build Coastguard Worker * order. (This also works on machines of unknown byte order.)
128*5e7646d2SAndroid Build Coastguard Worker */
129*5e7646d2SAndroid Build Coastguard Worker unsigned int X[16];
130*5e7646d2SAndroid Build Coastguard Worker const unsigned char *xp = data;
131*5e7646d2SAndroid Build Coastguard Worker int i;
132*5e7646d2SAndroid Build Coastguard Worker
133*5e7646d2SAndroid Build Coastguard Worker for (i = 0; i < 16; ++i, xp += 4)
134*5e7646d2SAndroid Build Coastguard Worker X[i] = (unsigned)xp[0] + ((unsigned)xp[1] << 8) +
135*5e7646d2SAndroid Build Coastguard Worker ((unsigned)xp[2] << 16) + ((unsigned)xp[3] << 24);
136*5e7646d2SAndroid Build Coastguard Worker
137*5e7646d2SAndroid Build Coastguard Worker # else /* !ARCH_IS_BIG_ENDIAN */
138*5e7646d2SAndroid Build Coastguard Worker
139*5e7646d2SAndroid Build Coastguard Worker /*
140*5e7646d2SAndroid Build Coastguard Worker * On little-endian machines, we can process properly aligned data
141*5e7646d2SAndroid Build Coastguard Worker * without copying it.
142*5e7646d2SAndroid Build Coastguard Worker */
143*5e7646d2SAndroid Build Coastguard Worker unsigned int xbuf[16];
144*5e7646d2SAndroid Build Coastguard Worker const unsigned int *X;
145*5e7646d2SAndroid Build Coastguard Worker
146*5e7646d2SAndroid Build Coastguard Worker if (!((data - (const unsigned char *)0) & 3)) {
147*5e7646d2SAndroid Build Coastguard Worker /* data are properly aligned */
148*5e7646d2SAndroid Build Coastguard Worker X = (const unsigned int *)data;
149*5e7646d2SAndroid Build Coastguard Worker } else {
150*5e7646d2SAndroid Build Coastguard Worker /* not aligned */
151*5e7646d2SAndroid Build Coastguard Worker memcpy(xbuf, data, 64);
152*5e7646d2SAndroid Build Coastguard Worker X = xbuf;
153*5e7646d2SAndroid Build Coastguard Worker }
154*5e7646d2SAndroid Build Coastguard Worker # endif
155*5e7646d2SAndroid Build Coastguard Worker
156*5e7646d2SAndroid Build Coastguard Worker # define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
157*5e7646d2SAndroid Build Coastguard Worker
158*5e7646d2SAndroid Build Coastguard Worker /* Round 1. */
159*5e7646d2SAndroid Build Coastguard Worker /* Let [abcd k s i] denote the operation
160*5e7646d2SAndroid Build Coastguard Worker a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
161*5e7646d2SAndroid Build Coastguard Worker # define F(x, y, z) (((x) & (y)) | (~(x) & (z)))
162*5e7646d2SAndroid Build Coastguard Worker # define SET(a, b, c, d, k, s, Ti)\
163*5e7646d2SAndroid Build Coastguard Worker t = a + F(b,c,d) + X[k] + Ti;\
164*5e7646d2SAndroid Build Coastguard Worker a = ROTATE_LEFT(t, s) + b
165*5e7646d2SAndroid Build Coastguard Worker /* Do the following 16 operations. */
166*5e7646d2SAndroid Build Coastguard Worker SET(a, b, c, d, 0, 7, T1);
167*5e7646d2SAndroid Build Coastguard Worker SET(d, a, b, c, 1, 12, T2);
168*5e7646d2SAndroid Build Coastguard Worker SET(c, d, a, b, 2, 17, T3);
169*5e7646d2SAndroid Build Coastguard Worker SET(b, c, d, a, 3, 22, T4);
170*5e7646d2SAndroid Build Coastguard Worker SET(a, b, c, d, 4, 7, T5);
171*5e7646d2SAndroid Build Coastguard Worker SET(d, a, b, c, 5, 12, T6);
172*5e7646d2SAndroid Build Coastguard Worker SET(c, d, a, b, 6, 17, T7);
173*5e7646d2SAndroid Build Coastguard Worker SET(b, c, d, a, 7, 22, T8);
174*5e7646d2SAndroid Build Coastguard Worker SET(a, b, c, d, 8, 7, T9);
175*5e7646d2SAndroid Build Coastguard Worker SET(d, a, b, c, 9, 12, T10);
176*5e7646d2SAndroid Build Coastguard Worker SET(c, d, a, b, 10, 17, T11);
177*5e7646d2SAndroid Build Coastguard Worker SET(b, c, d, a, 11, 22, T12);
178*5e7646d2SAndroid Build Coastguard Worker SET(a, b, c, d, 12, 7, T13);
179*5e7646d2SAndroid Build Coastguard Worker SET(d, a, b, c, 13, 12, T14);
180*5e7646d2SAndroid Build Coastguard Worker SET(c, d, a, b, 14, 17, T15);
181*5e7646d2SAndroid Build Coastguard Worker SET(b, c, d, a, 15, 22, T16);
182*5e7646d2SAndroid Build Coastguard Worker # undef SET
183*5e7646d2SAndroid Build Coastguard Worker
184*5e7646d2SAndroid Build Coastguard Worker /* Round 2. */
185*5e7646d2SAndroid Build Coastguard Worker /* Let [abcd k s i] denote the operation
186*5e7646d2SAndroid Build Coastguard Worker a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
187*5e7646d2SAndroid Build Coastguard Worker # define G(x, y, z) (((x) & (z)) | ((y) & ~(z)))
188*5e7646d2SAndroid Build Coastguard Worker # define SET(a, b, c, d, k, s, Ti)\
189*5e7646d2SAndroid Build Coastguard Worker t = a + G(b,c,d) + X[k] + Ti;\
190*5e7646d2SAndroid Build Coastguard Worker a = ROTATE_LEFT(t, s) + b
191*5e7646d2SAndroid Build Coastguard Worker /* Do the following 16 operations. */
192*5e7646d2SAndroid Build Coastguard Worker SET(a, b, c, d, 1, 5, T17);
193*5e7646d2SAndroid Build Coastguard Worker SET(d, a, b, c, 6, 9, T18);
194*5e7646d2SAndroid Build Coastguard Worker SET(c, d, a, b, 11, 14, T19);
195*5e7646d2SAndroid Build Coastguard Worker SET(b, c, d, a, 0, 20, T20);
196*5e7646d2SAndroid Build Coastguard Worker SET(a, b, c, d, 5, 5, T21);
197*5e7646d2SAndroid Build Coastguard Worker SET(d, a, b, c, 10, 9, T22);
198*5e7646d2SAndroid Build Coastguard Worker SET(c, d, a, b, 15, 14, T23);
199*5e7646d2SAndroid Build Coastguard Worker SET(b, c, d, a, 4, 20, T24);
200*5e7646d2SAndroid Build Coastguard Worker SET(a, b, c, d, 9, 5, T25);
201*5e7646d2SAndroid Build Coastguard Worker SET(d, a, b, c, 14, 9, T26);
202*5e7646d2SAndroid Build Coastguard Worker SET(c, d, a, b, 3, 14, T27);
203*5e7646d2SAndroid Build Coastguard Worker SET(b, c, d, a, 8, 20, T28);
204*5e7646d2SAndroid Build Coastguard Worker SET(a, b, c, d, 13, 5, T29);
205*5e7646d2SAndroid Build Coastguard Worker SET(d, a, b, c, 2, 9, T30);
206*5e7646d2SAndroid Build Coastguard Worker SET(c, d, a, b, 7, 14, T31);
207*5e7646d2SAndroid Build Coastguard Worker SET(b, c, d, a, 12, 20, T32);
208*5e7646d2SAndroid Build Coastguard Worker # undef SET
209*5e7646d2SAndroid Build Coastguard Worker
210*5e7646d2SAndroid Build Coastguard Worker /* Round 3. */
211*5e7646d2SAndroid Build Coastguard Worker /* Let [abcd k s t] denote the operation
212*5e7646d2SAndroid Build Coastguard Worker a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
213*5e7646d2SAndroid Build Coastguard Worker # define H(x, y, z) ((x) ^ (y) ^ (z))
214*5e7646d2SAndroid Build Coastguard Worker # define SET(a, b, c, d, k, s, Ti)\
215*5e7646d2SAndroid Build Coastguard Worker t = a + H(b,c,d) + X[k] + Ti;\
216*5e7646d2SAndroid Build Coastguard Worker a = ROTATE_LEFT(t, s) + b
217*5e7646d2SAndroid Build Coastguard Worker /* Do the following 16 operations. */
218*5e7646d2SAndroid Build Coastguard Worker SET(a, b, c, d, 5, 4, T33);
219*5e7646d2SAndroid Build Coastguard Worker SET(d, a, b, c, 8, 11, T34);
220*5e7646d2SAndroid Build Coastguard Worker SET(c, d, a, b, 11, 16, T35);
221*5e7646d2SAndroid Build Coastguard Worker SET(b, c, d, a, 14, 23, T36);
222*5e7646d2SAndroid Build Coastguard Worker SET(a, b, c, d, 1, 4, T37);
223*5e7646d2SAndroid Build Coastguard Worker SET(d, a, b, c, 4, 11, T38);
224*5e7646d2SAndroid Build Coastguard Worker SET(c, d, a, b, 7, 16, T39);
225*5e7646d2SAndroid Build Coastguard Worker SET(b, c, d, a, 10, 23, T40);
226*5e7646d2SAndroid Build Coastguard Worker SET(a, b, c, d, 13, 4, T41);
227*5e7646d2SAndroid Build Coastguard Worker SET(d, a, b, c, 0, 11, T42);
228*5e7646d2SAndroid Build Coastguard Worker SET(c, d, a, b, 3, 16, T43);
229*5e7646d2SAndroid Build Coastguard Worker SET(b, c, d, a, 6, 23, T44);
230*5e7646d2SAndroid Build Coastguard Worker SET(a, b, c, d, 9, 4, T45);
231*5e7646d2SAndroid Build Coastguard Worker SET(d, a, b, c, 12, 11, T46);
232*5e7646d2SAndroid Build Coastguard Worker SET(c, d, a, b, 15, 16, T47);
233*5e7646d2SAndroid Build Coastguard Worker SET(b, c, d, a, 2, 23, T48);
234*5e7646d2SAndroid Build Coastguard Worker # undef SET
235*5e7646d2SAndroid Build Coastguard Worker
236*5e7646d2SAndroid Build Coastguard Worker /* Round 4. */
237*5e7646d2SAndroid Build Coastguard Worker /* Let [abcd k s t] denote the operation
238*5e7646d2SAndroid Build Coastguard Worker a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
239*5e7646d2SAndroid Build Coastguard Worker # define I(x, y, z) ((y) ^ ((x) | ~(z)))
240*5e7646d2SAndroid Build Coastguard Worker # define SET(a, b, c, d, k, s, Ti)\
241*5e7646d2SAndroid Build Coastguard Worker t = a + I(b,c,d) + X[k] + Ti;\
242*5e7646d2SAndroid Build Coastguard Worker a = ROTATE_LEFT(t, s) + b
243*5e7646d2SAndroid Build Coastguard Worker /* Do the following 16 operations. */
244*5e7646d2SAndroid Build Coastguard Worker SET(a, b, c, d, 0, 6, T49);
245*5e7646d2SAndroid Build Coastguard Worker SET(d, a, b, c, 7, 10, T50);
246*5e7646d2SAndroid Build Coastguard Worker SET(c, d, a, b, 14, 15, T51);
247*5e7646d2SAndroid Build Coastguard Worker SET(b, c, d, a, 5, 21, T52);
248*5e7646d2SAndroid Build Coastguard Worker SET(a, b, c, d, 12, 6, T53);
249*5e7646d2SAndroid Build Coastguard Worker SET(d, a, b, c, 3, 10, T54);
250*5e7646d2SAndroid Build Coastguard Worker SET(c, d, a, b, 10, 15, T55);
251*5e7646d2SAndroid Build Coastguard Worker SET(b, c, d, a, 1, 21, T56);
252*5e7646d2SAndroid Build Coastguard Worker SET(a, b, c, d, 8, 6, T57);
253*5e7646d2SAndroid Build Coastguard Worker SET(d, a, b, c, 15, 10, T58);
254*5e7646d2SAndroid Build Coastguard Worker SET(c, d, a, b, 6, 15, T59);
255*5e7646d2SAndroid Build Coastguard Worker SET(b, c, d, a, 13, 21, T60);
256*5e7646d2SAndroid Build Coastguard Worker SET(a, b, c, d, 4, 6, T61);
257*5e7646d2SAndroid Build Coastguard Worker SET(d, a, b, c, 11, 10, T62);
258*5e7646d2SAndroid Build Coastguard Worker SET(c, d, a, b, 2, 15, T63);
259*5e7646d2SAndroid Build Coastguard Worker SET(b, c, d, a, 9, 21, T64);
260*5e7646d2SAndroid Build Coastguard Worker # undef SET
261*5e7646d2SAndroid Build Coastguard Worker
262*5e7646d2SAndroid Build Coastguard Worker /* Then perform the following additions. (That is increment each
263*5e7646d2SAndroid Build Coastguard Worker of the four registers by the value it had before this block
264*5e7646d2SAndroid Build Coastguard Worker was started.) */
265*5e7646d2SAndroid Build Coastguard Worker pms->abcd[0] += a;
266*5e7646d2SAndroid Build Coastguard Worker pms->abcd[1] += b;
267*5e7646d2SAndroid Build Coastguard Worker pms->abcd[2] += c;
268*5e7646d2SAndroid Build Coastguard Worker pms->abcd[3] += d;
269*5e7646d2SAndroid Build Coastguard Worker }
270*5e7646d2SAndroid Build Coastguard Worker
271*5e7646d2SAndroid Build Coastguard Worker void
_cupsMD5Init(_cups_md5_state_t * pms)272*5e7646d2SAndroid Build Coastguard Worker _cupsMD5Init(_cups_md5_state_t *pms)
273*5e7646d2SAndroid Build Coastguard Worker {
274*5e7646d2SAndroid Build Coastguard Worker pms->count[0] = pms->count[1] = 0;
275*5e7646d2SAndroid Build Coastguard Worker pms->abcd[0] = 0x67452301;
276*5e7646d2SAndroid Build Coastguard Worker pms->abcd[1] = 0xefcdab89;
277*5e7646d2SAndroid Build Coastguard Worker pms->abcd[2] = 0x98badcfe;
278*5e7646d2SAndroid Build Coastguard Worker pms->abcd[3] = 0x10325476;
279*5e7646d2SAndroid Build Coastguard Worker }
280*5e7646d2SAndroid Build Coastguard Worker
281*5e7646d2SAndroid Build Coastguard Worker void
_cupsMD5Append(_cups_md5_state_t * pms,const unsigned char * data,int nbytes)282*5e7646d2SAndroid Build Coastguard Worker _cupsMD5Append(_cups_md5_state_t *pms, const unsigned char *data, int nbytes)
283*5e7646d2SAndroid Build Coastguard Worker {
284*5e7646d2SAndroid Build Coastguard Worker const unsigned char *p = data;
285*5e7646d2SAndroid Build Coastguard Worker int left = nbytes;
286*5e7646d2SAndroid Build Coastguard Worker int offset = (pms->count[0] >> 3) & 63;
287*5e7646d2SAndroid Build Coastguard Worker unsigned int nbits = (unsigned int)(nbytes << 3);
288*5e7646d2SAndroid Build Coastguard Worker
289*5e7646d2SAndroid Build Coastguard Worker if (nbytes <= 0)
290*5e7646d2SAndroid Build Coastguard Worker return;
291*5e7646d2SAndroid Build Coastguard Worker
292*5e7646d2SAndroid Build Coastguard Worker /* Update the message length. */
293*5e7646d2SAndroid Build Coastguard Worker pms->count[1] += (unsigned)nbytes >> 29;
294*5e7646d2SAndroid Build Coastguard Worker pms->count[0] += nbits;
295*5e7646d2SAndroid Build Coastguard Worker if (pms->count[0] < nbits)
296*5e7646d2SAndroid Build Coastguard Worker pms->count[1]++;
297*5e7646d2SAndroid Build Coastguard Worker
298*5e7646d2SAndroid Build Coastguard Worker /* Process an initial partial block. */
299*5e7646d2SAndroid Build Coastguard Worker if (offset) {
300*5e7646d2SAndroid Build Coastguard Worker int copy = (offset + nbytes > 64 ? 64 - offset : nbytes);
301*5e7646d2SAndroid Build Coastguard Worker
302*5e7646d2SAndroid Build Coastguard Worker memcpy(pms->buf + offset, p, (size_t)copy);
303*5e7646d2SAndroid Build Coastguard Worker if (offset + copy < 64)
304*5e7646d2SAndroid Build Coastguard Worker return;
305*5e7646d2SAndroid Build Coastguard Worker p += copy;
306*5e7646d2SAndroid Build Coastguard Worker left -= copy;
307*5e7646d2SAndroid Build Coastguard Worker _cups_md5_process(pms, pms->buf);
308*5e7646d2SAndroid Build Coastguard Worker }
309*5e7646d2SAndroid Build Coastguard Worker
310*5e7646d2SAndroid Build Coastguard Worker /* Process full blocks. */
311*5e7646d2SAndroid Build Coastguard Worker for (; left >= 64; p += 64, left -= 64)
312*5e7646d2SAndroid Build Coastguard Worker _cups_md5_process(pms, p);
313*5e7646d2SAndroid Build Coastguard Worker
314*5e7646d2SAndroid Build Coastguard Worker /* Process a final partial block. */
315*5e7646d2SAndroid Build Coastguard Worker if (left)
316*5e7646d2SAndroid Build Coastguard Worker memcpy(pms->buf, p, (size_t)left);
317*5e7646d2SAndroid Build Coastguard Worker }
318*5e7646d2SAndroid Build Coastguard Worker
319*5e7646d2SAndroid Build Coastguard Worker void
_cupsMD5Finish(_cups_md5_state_t * pms,unsigned char digest[16])320*5e7646d2SAndroid Build Coastguard Worker _cupsMD5Finish(_cups_md5_state_t *pms, unsigned char digest[16])
321*5e7646d2SAndroid Build Coastguard Worker {
322*5e7646d2SAndroid Build Coastguard Worker static const unsigned char pad[64] = {
323*5e7646d2SAndroid Build Coastguard Worker 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
324*5e7646d2SAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
325*5e7646d2SAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
326*5e7646d2SAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
327*5e7646d2SAndroid Build Coastguard Worker };
328*5e7646d2SAndroid Build Coastguard Worker unsigned char data[8];
329*5e7646d2SAndroid Build Coastguard Worker int i;
330*5e7646d2SAndroid Build Coastguard Worker
331*5e7646d2SAndroid Build Coastguard Worker /* Save the length before padding. */
332*5e7646d2SAndroid Build Coastguard Worker for (i = 0; i < 8; ++i)
333*5e7646d2SAndroid Build Coastguard Worker data[i] = (unsigned char)(pms->count[i >> 2] >> ((i & 3) << 3));
334*5e7646d2SAndroid Build Coastguard Worker /* Pad to 56 bytes mod 64. */
335*5e7646d2SAndroid Build Coastguard Worker _cupsMD5Append(pms, pad, (int)((55 - (pms->count[0] >> 3)) & 63) + 1);
336*5e7646d2SAndroid Build Coastguard Worker /* Append the length. */
337*5e7646d2SAndroid Build Coastguard Worker _cupsMD5Append(pms, data, 8);
338*5e7646d2SAndroid Build Coastguard Worker for (i = 0; i < 16; ++i)
339*5e7646d2SAndroid Build Coastguard Worker digest[i] = (unsigned char)(pms->abcd[i >> 2] >> ((i & 3) << 3));
340*5e7646d2SAndroid Build Coastguard Worker }
341*5e7646d2SAndroid Build Coastguard Worker #endif /* !__APPLE__ */
342