File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / dhcp / dst / md5_dgst.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Oct 9 09:06:54 2012 UTC (11 years, 8 months ago) by misho
Branches: dhcp, MAIN
CVS tags: v4_1_R7p0, v4_1_R7, v4_1_R4, HEAD
dhcp 4.1 r7

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>