xref: /minix3/external/bsd/dhcp/dist/dst/md5_dgst.c (revision 83ee113ee0d94f3844d44065af2311604e9a30ad)
1*83ee113eSDavid van Moolenbroek /*	$NetBSD: md5_dgst.c,v 1.1.1.3 2014/07/12 11:57:51 spz Exp $	*/
2*83ee113eSDavid van Moolenbroek /* crypto/md/md5_dgst.c */
3*83ee113eSDavid van Moolenbroek /* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
4*83ee113eSDavid van Moolenbroek  * All rights reserved.
5*83ee113eSDavid van Moolenbroek  *
6*83ee113eSDavid van Moolenbroek  * This package is an SSL implementation written
7*83ee113eSDavid van Moolenbroek  * by Eric Young (eay@cryptsoft.com).
8*83ee113eSDavid van Moolenbroek  * The implementation was written so as to conform with Netscapes SSL.
9*83ee113eSDavid van Moolenbroek  *
10*83ee113eSDavid van Moolenbroek  * This library is free for commercial and non-commercial use as long as
11*83ee113eSDavid van Moolenbroek  * the following conditions are aheared to.  The following conditions
12*83ee113eSDavid van Moolenbroek  * apply to all code found in this distribution, be it the RC4, RSA,
13*83ee113eSDavid van Moolenbroek  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
14*83ee113eSDavid van Moolenbroek  * included with this distribution is covered by the same copyright terms
15*83ee113eSDavid van Moolenbroek  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
16*83ee113eSDavid van Moolenbroek  *
17*83ee113eSDavid van Moolenbroek  * Copyright remains Eric Young's, and as such any Copyright notices in
18*83ee113eSDavid van Moolenbroek  * the code are not to be removed.
19*83ee113eSDavid van Moolenbroek  * If this package is used in a product, Eric Young should be given attribution
20*83ee113eSDavid van Moolenbroek  * as the author of the parts of the library used.
21*83ee113eSDavid van Moolenbroek  * This can be in the form of a textual message at program startup or
22*83ee113eSDavid van Moolenbroek  * in documentation (online or textual) provided with the package.
23*83ee113eSDavid van Moolenbroek  *
24*83ee113eSDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
25*83ee113eSDavid van Moolenbroek  * modification, are permitted provided that the following conditions
26*83ee113eSDavid van Moolenbroek  * are met:
27*83ee113eSDavid van Moolenbroek  * 1. Redistributions of source code must retain the copyright
28*83ee113eSDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer.
29*83ee113eSDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce the above copyright
30*83ee113eSDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer in the
31*83ee113eSDavid van Moolenbroek  *    documentation and/or other materials provided with the distribution.
32*83ee113eSDavid van Moolenbroek  * 3. All advertising materials mentioning features or use of this software
33*83ee113eSDavid van Moolenbroek  *    must display the following acknowledgement:
34*83ee113eSDavid van Moolenbroek  *    "This product includes cryptographic software written by
35*83ee113eSDavid van Moolenbroek  *     Eric Young (eay@cryptsoft.com)"
36*83ee113eSDavid van Moolenbroek  *    The word 'cryptographic' can be left out if the rouines from the library
37*83ee113eSDavid van Moolenbroek  *    being used are not cryptographic related :-).
38*83ee113eSDavid van Moolenbroek  * 4. If you include any Windows specific code (or a derivative thereof) from
39*83ee113eSDavid van Moolenbroek  *    the apps directory (application code) you must include an acknowledgement:
40*83ee113eSDavid van Moolenbroek  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
41*83ee113eSDavid van Moolenbroek  *
42*83ee113eSDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
43*83ee113eSDavid van Moolenbroek  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
44*83ee113eSDavid van Moolenbroek  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
45*83ee113eSDavid van Moolenbroek  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
46*83ee113eSDavid van Moolenbroek  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
47*83ee113eSDavid van Moolenbroek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
48*83ee113eSDavid van Moolenbroek  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
49*83ee113eSDavid van Moolenbroek  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
50*83ee113eSDavid van Moolenbroek  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
51*83ee113eSDavid van Moolenbroek  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52*83ee113eSDavid van Moolenbroek  * SUCH DAMAGE.
53*83ee113eSDavid van Moolenbroek  *
54*83ee113eSDavid van Moolenbroek  * The licence and distribution terms for any publically available version or
55*83ee113eSDavid van Moolenbroek  * derivative of this code cannot be changed.  i.e. this code cannot simply be
56*83ee113eSDavid van Moolenbroek  * copied and put under another distribution licence
57*83ee113eSDavid van Moolenbroek  * [including the GNU Public Licence.]
58*83ee113eSDavid van Moolenbroek  */
59*83ee113eSDavid van Moolenbroek 
60*83ee113eSDavid van Moolenbroek /*
61*83ee113eSDavid van Moolenbroek  * Portions Copyright (c) 2007,2009 by Internet Systems Consortium, Inc. ("ISC")
62*83ee113eSDavid van Moolenbroek  *
63*83ee113eSDavid van Moolenbroek  * Permission to use, copy, modify, and distribute this software for any
64*83ee113eSDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
65*83ee113eSDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
66*83ee113eSDavid van Moolenbroek  *
67*83ee113eSDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
68*83ee113eSDavid van Moolenbroek  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
69*83ee113eSDavid van Moolenbroek  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
70*83ee113eSDavid van Moolenbroek  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
71*83ee113eSDavid van Moolenbroek  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
72*83ee113eSDavid van Moolenbroek  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
73*83ee113eSDavid van Moolenbroek  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
74*83ee113eSDavid van Moolenbroek  *
75*83ee113eSDavid van Moolenbroek  *   Internet Systems Consortium, Inc.
76*83ee113eSDavid van Moolenbroek  *   950 Charter Street
77*83ee113eSDavid van Moolenbroek  *   Redwood City, CA 94063
78*83ee113eSDavid van Moolenbroek  *   <info@isc.org>
79*83ee113eSDavid van Moolenbroek  *   https://www.isc.org/
80*83ee113eSDavid van Moolenbroek  */
81*83ee113eSDavid van Moolenbroek 
82*83ee113eSDavid van Moolenbroek #include <sys/cdefs.h>
83*83ee113eSDavid van Moolenbroek __RCSID("$NetBSD: md5_dgst.c,v 1.1.1.3 2014/07/12 11:57:51 spz Exp $");
84*83ee113eSDavid van Moolenbroek 
85*83ee113eSDavid van Moolenbroek #include <stdio.h>
86*83ee113eSDavid van Moolenbroek #include <sys/types.h>
87*83ee113eSDavid van Moolenbroek #include <sys/socket.h>
88*83ee113eSDavid van Moolenbroek #include <netinet/in.h>
89*83ee113eSDavid van Moolenbroek #include "md5_locl.h"
90*83ee113eSDavid van Moolenbroek #include "cdefs.h"
91*83ee113eSDavid van Moolenbroek #include "osdep.h"
92*83ee113eSDavid van Moolenbroek 
93*83ee113eSDavid van Moolenbroek #ifdef USE_MD5 /* Added by ogud@tis.com 1998/1/26 */
94*83ee113eSDavid van Moolenbroek 
95*83ee113eSDavid van Moolenbroek const char *MD5_version="MD5 part of SSLeay 0.8.1 19-Jul-1997";
96*83ee113eSDavid van Moolenbroek 
97*83ee113eSDavid van Moolenbroek /* Implemented from RFC1321 The MD5 Message-Digest Algorithm
98*83ee113eSDavid van Moolenbroek  */
99*83ee113eSDavid van Moolenbroek 
100*83ee113eSDavid van Moolenbroek #define INIT_DATA_A (unsigned long)0x67452301L
101*83ee113eSDavid van Moolenbroek #define INIT_DATA_B (unsigned long)0xefcdab89L
102*83ee113eSDavid van Moolenbroek #define INIT_DATA_C (unsigned long)0x98badcfeL
103*83ee113eSDavid van Moolenbroek #define INIT_DATA_D (unsigned long)0x10325476L
104*83ee113eSDavid van Moolenbroek 
105*83ee113eSDavid van Moolenbroek #ifndef NOPROTO
106*83ee113eSDavid van Moolenbroek static void md5_block(MD5_CTX *c, unsigned long *p);
107*83ee113eSDavid van Moolenbroek #else
108*83ee113eSDavid van Moolenbroek static void md5_block();
109*83ee113eSDavid van Moolenbroek #endif
110*83ee113eSDavid van Moolenbroek 
MD5_Init(c)111*83ee113eSDavid van Moolenbroek void MD5_Init(c)
112*83ee113eSDavid van Moolenbroek MD5_CTX *c;
113*83ee113eSDavid van Moolenbroek 	{
114*83ee113eSDavid van Moolenbroek 	c->A=INIT_DATA_A;
115*83ee113eSDavid van Moolenbroek 	c->B=INIT_DATA_B;
116*83ee113eSDavid van Moolenbroek 	c->C=INIT_DATA_C;
117*83ee113eSDavid van Moolenbroek 	c->D=INIT_DATA_D;
118*83ee113eSDavid van Moolenbroek 	c->Nl=0;
119*83ee113eSDavid van Moolenbroek 	c->Nh=0;
120*83ee113eSDavid van Moolenbroek 	c->num=0;
121*83ee113eSDavid van Moolenbroek 	}
122*83ee113eSDavid van Moolenbroek 
MD5_Update(c,data,len)123*83ee113eSDavid van Moolenbroek void MD5_Update(c, data, len)
124*83ee113eSDavid van Moolenbroek MD5_CTX *c;
125*83ee113eSDavid van Moolenbroek const register unsigned char *data;
126*83ee113eSDavid van Moolenbroek unsigned long len;
127*83ee113eSDavid van Moolenbroek 	{
128*83ee113eSDavid van Moolenbroek 	register ULONG *p;
129*83ee113eSDavid van Moolenbroek 	int sw,sc;
130*83ee113eSDavid van Moolenbroek 	ULONG l;
131*83ee113eSDavid van Moolenbroek 
132*83ee113eSDavid van Moolenbroek 	if (len == 0) return;
133*83ee113eSDavid van Moolenbroek 
134*83ee113eSDavid van Moolenbroek 	l=(c->Nl+(len<<3))&0xffffffffL;
135*83ee113eSDavid van Moolenbroek 	/* 95-05-24 eay Fixed a bug with the overflow handling, thanks to
136*83ee113eSDavid van Moolenbroek 	 * Wei Dai <weidai@eskimo.com> for pointing it out. */
137*83ee113eSDavid van Moolenbroek 	if (l < c->Nl) /* overflow */
138*83ee113eSDavid van Moolenbroek 		c->Nh++;
139*83ee113eSDavid van Moolenbroek 	c->Nh+=(len>>29);
140*83ee113eSDavid van Moolenbroek 	c->Nl=l;
141*83ee113eSDavid van Moolenbroek 
142*83ee113eSDavid van Moolenbroek 	if (c->num != 0)
143*83ee113eSDavid van Moolenbroek 		{
144*83ee113eSDavid van Moolenbroek 		p=c->data;
145*83ee113eSDavid van Moolenbroek 		sw=c->num>>2;
146*83ee113eSDavid van Moolenbroek 		sc=c->num&0x03;
147*83ee113eSDavid van Moolenbroek 
148*83ee113eSDavid van Moolenbroek 		if ((c->num+len) >= MD5_CBLOCK)
149*83ee113eSDavid van Moolenbroek 			{
150*83ee113eSDavid van Moolenbroek 			l= p[sw];
151*83ee113eSDavid van Moolenbroek 			p_c2l(data,l,sc);
152*83ee113eSDavid van Moolenbroek 			p[sw++]=l;
153*83ee113eSDavid van Moolenbroek 			for (; sw<MD5_LBLOCK; sw++)
154*83ee113eSDavid van Moolenbroek 				{
155*83ee113eSDavid van Moolenbroek 				c2l(data,l);
156*83ee113eSDavid van Moolenbroek 				p[sw]=l;
157*83ee113eSDavid van Moolenbroek 				}
158*83ee113eSDavid van Moolenbroek 			len-=(MD5_CBLOCK-c->num);
159*83ee113eSDavid van Moolenbroek 
160*83ee113eSDavid van Moolenbroek 			md5_block(c,p);
161*83ee113eSDavid van Moolenbroek 			c->num=0;
162*83ee113eSDavid van Moolenbroek 			/* drop through and do the rest */
163*83ee113eSDavid van Moolenbroek 			}
164*83ee113eSDavid van Moolenbroek 		else
165*83ee113eSDavid van Moolenbroek 			{
166*83ee113eSDavid van Moolenbroek 			int ew,ec;
167*83ee113eSDavid van Moolenbroek 
168*83ee113eSDavid van Moolenbroek 			c->num+=(int)len;
169*83ee113eSDavid van Moolenbroek 			if ((sc+len) < 4) /* ugly, add char's to a word */
170*83ee113eSDavid van Moolenbroek 				{
171*83ee113eSDavid van Moolenbroek 				l= p[sw];
172*83ee113eSDavid van Moolenbroek 				p_c2l_p(data,l,sc,len);
173*83ee113eSDavid van Moolenbroek 				p[sw]=l;
174*83ee113eSDavid van Moolenbroek 				}
175*83ee113eSDavid van Moolenbroek 			else
176*83ee113eSDavid van Moolenbroek 				{
177*83ee113eSDavid van Moolenbroek 				ew=(c->num>>2);
178*83ee113eSDavid van Moolenbroek 				ec=(c->num&0x03);
179*83ee113eSDavid van Moolenbroek 				l= p[sw];
180*83ee113eSDavid van Moolenbroek 				p_c2l(data,l,sc);
181*83ee113eSDavid van Moolenbroek 				p[sw++]=l;
182*83ee113eSDavid van Moolenbroek 				for (; sw < ew; sw++)
183*83ee113eSDavid van Moolenbroek 					{ c2l(data,l); p[sw]=l; }
184*83ee113eSDavid van Moolenbroek 				if (ec)
185*83ee113eSDavid van Moolenbroek 					{
186*83ee113eSDavid van Moolenbroek 					c2l_p(data,l,ec);
187*83ee113eSDavid van Moolenbroek 					p[sw]=l;
188*83ee113eSDavid van Moolenbroek 					}
189*83ee113eSDavid van Moolenbroek 				}
190*83ee113eSDavid van Moolenbroek 			return;
191*83ee113eSDavid van Moolenbroek 			}
192*83ee113eSDavid van Moolenbroek 		}
193*83ee113eSDavid van Moolenbroek 	/* we now can process the input data in blocks of MD5_CBLOCK
194*83ee113eSDavid van Moolenbroek 	 * chars and save the leftovers to c->data. */
195*83ee113eSDavid van Moolenbroek 	p=c->data;
196*83ee113eSDavid van Moolenbroek 	while (len >= MD5_CBLOCK)
197*83ee113eSDavid van Moolenbroek 		{
198*83ee113eSDavid van Moolenbroek #if defined(L_ENDIAN) || defined(B_ENDIAN)
199*83ee113eSDavid van Moolenbroek 		memcpy(p,data,MD5_CBLOCK);
200*83ee113eSDavid van Moolenbroek 		data+=MD5_CBLOCK;
201*83ee113eSDavid van Moolenbroek #ifdef B_ENDIAN
202*83ee113eSDavid van Moolenbroek 		for (sw=(MD5_LBLOCK/4); sw; sw--)
203*83ee113eSDavid van Moolenbroek 			{
204*83ee113eSDavid van Moolenbroek 			Endian_Reverse32(p[0]);
205*83ee113eSDavid van Moolenbroek 			Endian_Reverse32(p[1]);
206*83ee113eSDavid van Moolenbroek 			Endian_Reverse32(p[2]);
207*83ee113eSDavid van Moolenbroek 			Endian_Reverse32(p[3]);
208*83ee113eSDavid van Moolenbroek 			p+=4;
209*83ee113eSDavid van Moolenbroek 			}
210*83ee113eSDavid van Moolenbroek #endif
211*83ee113eSDavid van Moolenbroek #else
212*83ee113eSDavid van Moolenbroek 		for (sw=(MD5_LBLOCK/4); sw; sw--)
213*83ee113eSDavid van Moolenbroek 			{
214*83ee113eSDavid van Moolenbroek 			c2l(data,l); *(p++)=l;
215*83ee113eSDavid van Moolenbroek 			c2l(data,l); *(p++)=l;
216*83ee113eSDavid van Moolenbroek 			c2l(data,l); *(p++)=l;
217*83ee113eSDavid van Moolenbroek 			c2l(data,l); *(p++)=l;
218*83ee113eSDavid van Moolenbroek 			}
219*83ee113eSDavid van Moolenbroek #endif
220*83ee113eSDavid van Moolenbroek 		p=c->data;
221*83ee113eSDavid van Moolenbroek 		md5_block(c,p);
222*83ee113eSDavid van Moolenbroek 		len-=MD5_CBLOCK;
223*83ee113eSDavid van Moolenbroek 		}
224*83ee113eSDavid van Moolenbroek 	sc=(int)len;
225*83ee113eSDavid van Moolenbroek 	c->num=sc;
226*83ee113eSDavid van Moolenbroek 	if (sc)
227*83ee113eSDavid van Moolenbroek 		{
228*83ee113eSDavid van Moolenbroek 		sw=sc>>2;	/* words to copy */
229*83ee113eSDavid van Moolenbroek #ifdef L_ENDIAN
230*83ee113eSDavid van Moolenbroek 		p[sw]=0;
231*83ee113eSDavid van Moolenbroek 		memcpy(p,data,sc);
232*83ee113eSDavid van Moolenbroek #else
233*83ee113eSDavid van Moolenbroek 		sc&=0x03;
234*83ee113eSDavid van Moolenbroek 		for ( ; sw; sw--)
235*83ee113eSDavid van Moolenbroek 			{ c2l(data,l); *(p++)=l; }
236*83ee113eSDavid van Moolenbroek 		c2l_p(data,l,sc);
237*83ee113eSDavid van Moolenbroek 		*p=l;
238*83ee113eSDavid van Moolenbroek #endif
239*83ee113eSDavid van Moolenbroek 		}
240*83ee113eSDavid van Moolenbroek 	}
241*83ee113eSDavid van Moolenbroek 
md5_block(c,X)242*83ee113eSDavid van Moolenbroek static void md5_block(c, X)
243*83ee113eSDavid van Moolenbroek MD5_CTX *c;
244*83ee113eSDavid van Moolenbroek register ULONG *X;
245*83ee113eSDavid van Moolenbroek 	{
246*83ee113eSDavid van Moolenbroek 	register ULONG A,B,C,D;
247*83ee113eSDavid van Moolenbroek 
248*83ee113eSDavid van Moolenbroek 	A=c->A;
249*83ee113eSDavid van Moolenbroek 	B=c->B;
250*83ee113eSDavid van Moolenbroek 	C=c->C;
251*83ee113eSDavid van Moolenbroek 	D=c->D;
252*83ee113eSDavid van Moolenbroek 
253*83ee113eSDavid van Moolenbroek 	/* Round 0 */
254*83ee113eSDavid van Moolenbroek 	LOCL_R0(A,B,C,D,X[ 0], 7,0xd76aa478L);
255*83ee113eSDavid van Moolenbroek 	LOCL_R0(D,A,B,C,X[ 1],12,0xe8c7b756L);
256*83ee113eSDavid van Moolenbroek 	LOCL_R0(C,D,A,B,X[ 2],17,0x242070dbL);
257*83ee113eSDavid van Moolenbroek 	LOCL_R0(B,C,D,A,X[ 3],22,0xc1bdceeeL);
258*83ee113eSDavid van Moolenbroek 	LOCL_R0(A,B,C,D,X[ 4], 7,0xf57c0fafL);
259*83ee113eSDavid van Moolenbroek 	LOCL_R0(D,A,B,C,X[ 5],12,0x4787c62aL);
260*83ee113eSDavid van Moolenbroek 	LOCL_R0(C,D,A,B,X[ 6],17,0xa8304613L);
261*83ee113eSDavid van Moolenbroek 	LOCL_R0(B,C,D,A,X[ 7],22,0xfd469501L);
262*83ee113eSDavid van Moolenbroek 	LOCL_R0(A,B,C,D,X[ 8], 7,0x698098d8L);
263*83ee113eSDavid van Moolenbroek 	LOCL_R0(D,A,B,C,X[ 9],12,0x8b44f7afL);
264*83ee113eSDavid van Moolenbroek 	LOCL_R0(C,D,A,B,X[10],17,0xffff5bb1L);
265*83ee113eSDavid van Moolenbroek 	LOCL_R0(B,C,D,A,X[11],22,0x895cd7beL);
266*83ee113eSDavid van Moolenbroek 	LOCL_R0(A,B,C,D,X[12], 7,0x6b901122L);
267*83ee113eSDavid van Moolenbroek 	LOCL_R0(D,A,B,C,X[13],12,0xfd987193L);
268*83ee113eSDavid van Moolenbroek 	LOCL_R0(C,D,A,B,X[14],17,0xa679438eL);
269*83ee113eSDavid van Moolenbroek 	LOCL_R0(B,C,D,A,X[15],22,0x49b40821L);
270*83ee113eSDavid van Moolenbroek 	/* Round 1 */
271*83ee113eSDavid van Moolenbroek 	LOCL_R1(A,B,C,D,X[ 1], 5,0xf61e2562L);
272*83ee113eSDavid van Moolenbroek 	LOCL_R1(D,A,B,C,X[ 6], 9,0xc040b340L);
273*83ee113eSDavid van Moolenbroek 	LOCL_R1(C,D,A,B,X[11],14,0x265e5a51L);
274*83ee113eSDavid van Moolenbroek 	LOCL_R1(B,C,D,A,X[ 0],20,0xe9b6c7aaL);
275*83ee113eSDavid van Moolenbroek 	LOCL_R1(A,B,C,D,X[ 5], 5,0xd62f105dL);
276*83ee113eSDavid van Moolenbroek 	LOCL_R1(D,A,B,C,X[10], 9,0x02441453L);
277*83ee113eSDavid van Moolenbroek 	LOCL_R1(C,D,A,B,X[15],14,0xd8a1e681L);
278*83ee113eSDavid van Moolenbroek 	LOCL_R1(B,C,D,A,X[ 4],20,0xe7d3fbc8L);
279*83ee113eSDavid van Moolenbroek 	LOCL_R1(A,B,C,D,X[ 9], 5,0x21e1cde6L);
280*83ee113eSDavid van Moolenbroek 	LOCL_R1(D,A,B,C,X[14], 9,0xc33707d6L);
281*83ee113eSDavid van Moolenbroek 	LOCL_R1(C,D,A,B,X[ 3],14,0xf4d50d87L);
282*83ee113eSDavid van Moolenbroek 	LOCL_R1(B,C,D,A,X[ 8],20,0x455a14edL);
283*83ee113eSDavid van Moolenbroek 	LOCL_R1(A,B,C,D,X[13], 5,0xa9e3e905L);
284*83ee113eSDavid van Moolenbroek 	LOCL_R1(D,A,B,C,X[ 2], 9,0xfcefa3f8L);
285*83ee113eSDavid van Moolenbroek 	LOCL_R1(C,D,A,B,X[ 7],14,0x676f02d9L);
286*83ee113eSDavid van Moolenbroek 	LOCL_R1(B,C,D,A,X[12],20,0x8d2a4c8aL);
287*83ee113eSDavid van Moolenbroek 	/* Round 2 */
288*83ee113eSDavid van Moolenbroek 	LOCL_R2(A,B,C,D,X[ 5], 4,0xfffa3942L);
289*83ee113eSDavid van Moolenbroek 	LOCL_R2(D,A,B,C,X[ 8],11,0x8771f681L);
290*83ee113eSDavid van Moolenbroek 	LOCL_R2(C,D,A,B,X[11],16,0x6d9d6122L);
291*83ee113eSDavid van Moolenbroek 	LOCL_R2(B,C,D,A,X[14],23,0xfde5380cL);
292*83ee113eSDavid van Moolenbroek 	LOCL_R2(A,B,C,D,X[ 1], 4,0xa4beea44L);
293*83ee113eSDavid van Moolenbroek 	LOCL_R2(D,A,B,C,X[ 4],11,0x4bdecfa9L);
294*83ee113eSDavid van Moolenbroek 	LOCL_R2(C,D,A,B,X[ 7],16,0xf6bb4b60L);
295*83ee113eSDavid van Moolenbroek 	LOCL_R2(B,C,D,A,X[10],23,0xbebfbc70L);
296*83ee113eSDavid van Moolenbroek 	LOCL_R2(A,B,C,D,X[13], 4,0x289b7ec6L);
297*83ee113eSDavid van Moolenbroek 	LOCL_R2(D,A,B,C,X[ 0],11,0xeaa127faL);
298*83ee113eSDavid van Moolenbroek 	LOCL_R2(C,D,A,B,X[ 3],16,0xd4ef3085L);
299*83ee113eSDavid van Moolenbroek 	LOCL_R2(B,C,D,A,X[ 6],23,0x04881d05L);
300*83ee113eSDavid van Moolenbroek 	LOCL_R2(A,B,C,D,X[ 9], 4,0xd9d4d039L);
301*83ee113eSDavid van Moolenbroek 	LOCL_R2(D,A,B,C,X[12],11,0xe6db99e5L);
302*83ee113eSDavid van Moolenbroek 	LOCL_R2(C,D,A,B,X[15],16,0x1fa27cf8L);
303*83ee113eSDavid van Moolenbroek 	LOCL_R2(B,C,D,A,X[ 2],23,0xc4ac5665L);
304*83ee113eSDavid van Moolenbroek 	/* Round 3 */
305*83ee113eSDavid van Moolenbroek 	LOCL_R3(A,B,C,D,X[ 0], 6,0xf4292244L);
306*83ee113eSDavid van Moolenbroek 	LOCL_R3(D,A,B,C,X[ 7],10,0x432aff97L);
307*83ee113eSDavid van Moolenbroek 	LOCL_R3(C,D,A,B,X[14],15,0xab9423a7L);
308*83ee113eSDavid van Moolenbroek 	LOCL_R3(B,C,D,A,X[ 5],21,0xfc93a039L);
309*83ee113eSDavid van Moolenbroek 	LOCL_R3(A,B,C,D,X[12], 6,0x655b59c3L);
310*83ee113eSDavid van Moolenbroek 	LOCL_R3(D,A,B,C,X[ 3],10,0x8f0ccc92L);
311*83ee113eSDavid van Moolenbroek 	LOCL_R3(C,D,A,B,X[10],15,0xffeff47dL);
312*83ee113eSDavid van Moolenbroek 	LOCL_R3(B,C,D,A,X[ 1],21,0x85845dd1L);
313*83ee113eSDavid van Moolenbroek 	LOCL_R3(A,B,C,D,X[ 8], 6,0x6fa87e4fL);
314*83ee113eSDavid van Moolenbroek 	LOCL_R3(D,A,B,C,X[15],10,0xfe2ce6e0L);
315*83ee113eSDavid van Moolenbroek 	LOCL_R3(C,D,A,B,X[ 6],15,0xa3014314L);
316*83ee113eSDavid van Moolenbroek 	LOCL_R3(B,C,D,A,X[13],21,0x4e0811a1L);
317*83ee113eSDavid van Moolenbroek 	LOCL_R3(A,B,C,D,X[ 4], 6,0xf7537e82L);
318*83ee113eSDavid van Moolenbroek 	LOCL_R3(D,A,B,C,X[11],10,0xbd3af235L);
319*83ee113eSDavid van Moolenbroek 	LOCL_R3(C,D,A,B,X[ 2],15,0x2ad7d2bbL);
320*83ee113eSDavid van Moolenbroek 	LOCL_R3(B,C,D,A,X[ 9],21,0xeb86d391L);
321*83ee113eSDavid van Moolenbroek 
322*83ee113eSDavid van Moolenbroek 	c->A+=A&0xffffffffL;
323*83ee113eSDavid van Moolenbroek 	c->B+=B&0xffffffffL;
324*83ee113eSDavid van Moolenbroek 	c->C+=C&0xffffffffL;
325*83ee113eSDavid van Moolenbroek 	c->D+=D&0xffffffffL;
326*83ee113eSDavid van Moolenbroek 	}
327*83ee113eSDavid van Moolenbroek 
MD5_Final(md,c)328*83ee113eSDavid van Moolenbroek void MD5_Final(md, c)
329*83ee113eSDavid van Moolenbroek unsigned char *md;
330*83ee113eSDavid van Moolenbroek MD5_CTX *c;
331*83ee113eSDavid van Moolenbroek 	{
332*83ee113eSDavid van Moolenbroek 	register int i,j;
333*83ee113eSDavid van Moolenbroek 	register ULONG l;
334*83ee113eSDavid van Moolenbroek 	register ULONG *p;
335*83ee113eSDavid van Moolenbroek 	static unsigned char end[4]={0x80,0x00,0x00,0x00};
336*83ee113eSDavid van Moolenbroek 	unsigned char *cp=end;
337*83ee113eSDavid van Moolenbroek 
338*83ee113eSDavid van Moolenbroek 	/* c->num should definitely have room for at least one more byte. */
339*83ee113eSDavid van Moolenbroek 	p=c->data;
340*83ee113eSDavid van Moolenbroek 	j=c->num;
341*83ee113eSDavid van Moolenbroek 	i=j>>2;
342*83ee113eSDavid van Moolenbroek 
343*83ee113eSDavid van Moolenbroek 	/* purify often complains about the following line as an
344*83ee113eSDavid van Moolenbroek 	 * Uninitialized Memory Read.  While this can be true, the
345*83ee113eSDavid van Moolenbroek 	 * following p_c2l macro will reset l when that case is true.
346*83ee113eSDavid van Moolenbroek 	 * This is because j&0x03 contains the number of 'valid' bytes
347*83ee113eSDavid van Moolenbroek 	 * already in p[i].  If and only if j&0x03 == 0, the UMR will
348*83ee113eSDavid van Moolenbroek 	 * occur but this is also the only time p_c2l will do
349*83ee113eSDavid van Moolenbroek 	 * l= *(cp++) instead of l|= *(cp++)
350*83ee113eSDavid van Moolenbroek 	 * Many thanks to Alex Tang <altitude@cic.net> for pickup this
351*83ee113eSDavid van Moolenbroek 	 * 'potential bug' */
352*83ee113eSDavid van Moolenbroek #ifdef PURIFY
353*83ee113eSDavid van Moolenbroek 	if ((j&0x03) == 0) p[i]=0;
354*83ee113eSDavid van Moolenbroek #endif
355*83ee113eSDavid van Moolenbroek 	l=p[i];
356*83ee113eSDavid van Moolenbroek 	p_c2l(cp,l,j&0x03);
357*83ee113eSDavid van Moolenbroek 	p[i]=l;
358*83ee113eSDavid van Moolenbroek 	i++;
359*83ee113eSDavid van Moolenbroek 	/* i is the next 'undefined word' */
360*83ee113eSDavid van Moolenbroek 	if (c->num >= MD5_LAST_BLOCK)
361*83ee113eSDavid van Moolenbroek 		{
362*83ee113eSDavid van Moolenbroek 		for (; i<MD5_LBLOCK; i++)
363*83ee113eSDavid van Moolenbroek 			p[i]=0;
364*83ee113eSDavid van Moolenbroek 		md5_block(c,p);
365*83ee113eSDavid van Moolenbroek 		i=0;
366*83ee113eSDavid van Moolenbroek 		}
367*83ee113eSDavid van Moolenbroek 	for (; i<(MD5_LBLOCK-2); i++)
368*83ee113eSDavid van Moolenbroek 		p[i]=0;
369*83ee113eSDavid van Moolenbroek 	p[MD5_LBLOCK-2]=c->Nl;
370*83ee113eSDavid van Moolenbroek 	p[MD5_LBLOCK-1]=c->Nh;
371*83ee113eSDavid van Moolenbroek 	md5_block(c,p);
372*83ee113eSDavid van Moolenbroek 	cp=md;
373*83ee113eSDavid van Moolenbroek 	l=c->A; l2c(l,cp);
374*83ee113eSDavid van Moolenbroek 	l=c->B; l2c(l,cp);
375*83ee113eSDavid van Moolenbroek 	l=c->C; l2c(l,cp);
376*83ee113eSDavid van Moolenbroek 	l=c->D; l2c(l,cp);
377*83ee113eSDavid van Moolenbroek 
378*83ee113eSDavid van Moolenbroek 	/* clear stuff, md5_block may be leaving some stuff on the stack
379*83ee113eSDavid van Moolenbroek 	 * but I'm not worried :-) */
380*83ee113eSDavid van Moolenbroek 	c->num=0;
381*83ee113eSDavid van Moolenbroek /*	memset((char *)&c,0,sizeof(c));*/
382*83ee113eSDavid van Moolenbroek 	}
383*83ee113eSDavid van Moolenbroek 
384*83ee113eSDavid van Moolenbroek #ifdef undef
printit(l)385*83ee113eSDavid van Moolenbroek int printit(l)
386*83ee113eSDavid van Moolenbroek unsigned long *l;
387*83ee113eSDavid van Moolenbroek 	{
388*83ee113eSDavid van Moolenbroek 	int i,ii;
389*83ee113eSDavid van Moolenbroek 
390*83ee113eSDavid van Moolenbroek 	for (i=0; i<2; i++)
391*83ee113eSDavid van Moolenbroek 		{
392*83ee113eSDavid van Moolenbroek 		for (ii=0; ii<8; ii++)
393*83ee113eSDavid van Moolenbroek 			{
394*83ee113eSDavid van Moolenbroek 			fprintf(stderr,"%08lx ",l[i*8+ii]);
395*83ee113eSDavid van Moolenbroek 			}
396*83ee113eSDavid van Moolenbroek 		fprintf(stderr,"\n");
397*83ee113eSDavid van Moolenbroek 		}
398*83ee113eSDavid van Moolenbroek 	}
399*83ee113eSDavid van Moolenbroek #endif
400*83ee113eSDavid van Moolenbroek #endif /* USE_MD5 */
401