xref: /aosp_15_r20/external/libcups/cups/md5.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
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