os/ossrv/ssl/libcrypto/src/crypto/md2/md2_dgst.c
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 /* crypto/md2/md2_dgst.c */
     2 /* Copyright (C) 1995-1998 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) 2006 Nokia Corporation.  All rights reserved.
    61  */
    62 
    63 #include <stdio.h>
    64 #include <stdlib.h>
    65 #include <string.h>
    66 #include <openssl/md2.h>
    67 #include <openssl/opensslv.h>
    68 #include <openssl/crypto.h>
    69 #if (defined(SYMBIAN) && (defined(__WINSCW__) || defined(__WINS__)))
    70 #include "libcrypto_wsd_macros.h"
    71 #include "libcrypto_wsd.h"
    72 #endif
    73 
    74 
    75 const char MD2_version[]="MD2" OPENSSL_VERSION_PTEXT;
    76 
    77 /* Implemented from RFC1319 The MD2 Message-Digest Algorithm
    78  */
    79 
    80 #define UCHAR	unsigned char
    81 
    82 static void md2_block(MD2_CTX *c, const unsigned char *d);
    83 
    84 
    85 #ifndef EMULATOR
    86 /* The magic S table - I have converted it to hex since it is
    87  * basically just a random byte string. */
    88 static MD2_INT S[256]={
    89 	0x29, 0x2E, 0x43, 0xC9, 0xA2, 0xD8, 0x7C, 0x01,
    90 	0x3D, 0x36, 0x54, 0xA1, 0xEC, 0xF0, 0x06, 0x13,
    91 	0x62, 0xA7, 0x05, 0xF3, 0xC0, 0xC7, 0x73, 0x8C,
    92 	0x98, 0x93, 0x2B, 0xD9, 0xBC, 0x4C, 0x82, 0xCA,
    93 	0x1E, 0x9B, 0x57, 0x3C, 0xFD, 0xD4, 0xE0, 0x16,
    94 	0x67, 0x42, 0x6F, 0x18, 0x8A, 0x17, 0xE5, 0x12,
    95 	0xBE, 0x4E, 0xC4, 0xD6, 0xDA, 0x9E, 0xDE, 0x49,
    96 	0xA0, 0xFB, 0xF5, 0x8E, 0xBB, 0x2F, 0xEE, 0x7A,
    97 	0xA9, 0x68, 0x79, 0x91, 0x15, 0xB2, 0x07, 0x3F,
    98 	0x94, 0xC2, 0x10, 0x89, 0x0B, 0x22, 0x5F, 0x21,
    99 	0x80, 0x7F, 0x5D, 0x9A, 0x5A, 0x90, 0x32, 0x27,
   100 	0x35, 0x3E, 0xCC, 0xE7, 0xBF, 0xF7, 0x97, 0x03,
   101 	0xFF, 0x19, 0x30, 0xB3, 0x48, 0xA5, 0xB5, 0xD1,
   102 	0xD7, 0x5E, 0x92, 0x2A, 0xAC, 0x56, 0xAA, 0xC6,
   103 	0x4F, 0xB8, 0x38, 0xD2, 0x96, 0xA4, 0x7D, 0xB6,
   104 	0x76, 0xFC, 0x6B, 0xE2, 0x9C, 0x74, 0x04, 0xF1,
   105 	0x45, 0x9D, 0x70, 0x59, 0x64, 0x71, 0x87, 0x20,
   106 	0x86, 0x5B, 0xCF, 0x65, 0xE6, 0x2D, 0xA8, 0x02,
   107 	0x1B, 0x60, 0x25, 0xAD, 0xAE, 0xB0, 0xB9, 0xF6,
   108 	0x1C, 0x46, 0x61, 0x69, 0x34, 0x40, 0x7E, 0x0F,
   109 	0x55, 0x47, 0xA3, 0x23, 0xDD, 0x51, 0xAF, 0x3A,
   110 	0xC3, 0x5C, 0xF9, 0xCE, 0xBA, 0xC5, 0xEA, 0x26,
   111 	0x2C, 0x53, 0x0D, 0x6E, 0x85, 0x28, 0x84, 0x09,
   112 	0xD3, 0xDF, 0xCD, 0xF4, 0x41, 0x81, 0x4D, 0x52,
   113 	0x6A, 0xDC, 0x37, 0xC8, 0x6C, 0xC1, 0xAB, 0xFA,
   114 	0x24, 0xE1, 0x7B, 0x08, 0x0C, 0xBD, 0xB1, 0x4A,
   115 	0x78, 0x88, 0x95, 0x8B, 0xE3, 0x63, 0xE8, 0x6D,
   116 	0xE9, 0xCB, 0xD5, 0xFE, 0x3B, 0x00, 0x1D, 0x39,
   117 	0xF2, 0xEF, 0xB7, 0x0E, 0x66, 0x58, 0xD0, 0xE4,
   118 	0xA6, 0x77, 0x72, 0xF8, 0xEB, 0x75, 0x4B, 0x0A,
   119 	0x31, 0x44, 0x50, 0xB4, 0x8F, 0xED, 0x1F, 0x1A,
   120 	0xDB, 0x99, 0x8D, 0x33, 0x9F, 0x11, 0x83, 0x14,
   121 	};
   122 #else
   123 static const MD2_INT S[256]={
   124 	0x29, 0x2E, 0x43, 0xC9, 0xA2, 0xD8, 0x7C, 0x01,
   125 	0x3D, 0x36, 0x54, 0xA1, 0xEC, 0xF0, 0x06, 0x13,
   126 	0x62, 0xA7, 0x05, 0xF3, 0xC0, 0xC7, 0x73, 0x8C,
   127 	0x98, 0x93, 0x2B, 0xD9, 0xBC, 0x4C, 0x82, 0xCA,
   128 	0x1E, 0x9B, 0x57, 0x3C, 0xFD, 0xD4, 0xE0, 0x16,
   129 	0x67, 0x42, 0x6F, 0x18, 0x8A, 0x17, 0xE5, 0x12,
   130 	0xBE, 0x4E, 0xC4, 0xD6, 0xDA, 0x9E, 0xDE, 0x49,
   131 	0xA0, 0xFB, 0xF5, 0x8E, 0xBB, 0x2F, 0xEE, 0x7A,
   132 	0xA9, 0x68, 0x79, 0x91, 0x15, 0xB2, 0x07, 0x3F,
   133 	0x94, 0xC2, 0x10, 0x89, 0x0B, 0x22, 0x5F, 0x21,
   134 	0x80, 0x7F, 0x5D, 0x9A, 0x5A, 0x90, 0x32, 0x27,
   135 	0x35, 0x3E, 0xCC, 0xE7, 0xBF, 0xF7, 0x97, 0x03,
   136 	0xFF, 0x19, 0x30, 0xB3, 0x48, 0xA5, 0xB5, 0xD1,
   137 	0xD7, 0x5E, 0x92, 0x2A, 0xAC, 0x56, 0xAA, 0xC6,
   138 	0x4F, 0xB8, 0x38, 0xD2, 0x96, 0xA4, 0x7D, 0xB6,
   139 	0x76, 0xFC, 0x6B, 0xE2, 0x9C, 0x74, 0x04, 0xF1,
   140 	0x45, 0x9D, 0x70, 0x59, 0x64, 0x71, 0x87, 0x20,
   141 	0x86, 0x5B, 0xCF, 0x65, 0xE6, 0x2D, 0xA8, 0x02,
   142 	0x1B, 0x60, 0x25, 0xAD, 0xAE, 0xB0, 0xB9, 0xF6,
   143 	0x1C, 0x46, 0x61, 0x69, 0x34, 0x40, 0x7E, 0x0F,
   144 	0x55, 0x47, 0xA3, 0x23, 0xDD, 0x51, 0xAF, 0x3A,
   145 	0xC3, 0x5C, 0xF9, 0xCE, 0xBA, 0xC5, 0xEA, 0x26,
   146 	0x2C, 0x53, 0x0D, 0x6E, 0x85, 0x28, 0x84, 0x09,
   147 	0xD3, 0xDF, 0xCD, 0xF4, 0x41, 0x81, 0x4D, 0x52,
   148 	0x6A, 0xDC, 0x37, 0xC8, 0x6C, 0xC1, 0xAB, 0xFA,
   149 	0x24, 0xE1, 0x7B, 0x08, 0x0C, 0xBD, 0xB1, 0x4A,
   150 	0x78, 0x88, 0x95, 0x8B, 0xE3, 0x63, 0xE8, 0x6D,
   151 	0xE9, 0xCB, 0xD5, 0xFE, 0x3B, 0x00, 0x1D, 0x39,
   152 	0xF2, 0xEF, 0xB7, 0x0E, 0x66, 0x58, 0xD0, 0xE4,
   153 	0xA6, 0x77, 0x72, 0xF8, 0xEB, 0x75, 0x4B, 0x0A,
   154 	0x31, 0x44, 0x50, 0xB4, 0x8F, 0xED, 0x1F, 0x1A,
   155 	0xDB, 0x99, 0x8D, 0x33, 0x9F, 0x11, 0x83, 0x14,
   156 	};
   157 
   158 
   159 #endif
   160 EXPORT_C const char *MD2_options(void)
   161 	{
   162 	if (sizeof(MD2_INT) == 1)
   163 		return("md2(char)");
   164 	else
   165 		return("md2(int)");
   166 	}
   167 
   168 EXPORT_C int MD2_Init(MD2_CTX *c)
   169 	{
   170 	c->num=0;
   171 	memset(c->state,0,sizeof c->state);
   172 	memset(c->cksm,0,sizeof c->cksm);
   173 	memset(c->data,0,sizeof c->data);
   174 	return 1;
   175 	}
   176 
   177 EXPORT_C int MD2_Update(MD2_CTX *c, const unsigned char *data, size_t len)
   178 	{
   179 	register UCHAR *p;
   180 
   181 	if (len == 0) return 1;
   182 
   183 	p=c->data;
   184 	if (c->num != 0)
   185 		{
   186 		if ((c->num+len) >= MD2_BLOCK)
   187 			{
   188 			memcpy(&(p[c->num]),data,MD2_BLOCK-c->num);
   189 			md2_block(c,c->data);
   190 			data+=(MD2_BLOCK - c->num);
   191 			len-=(MD2_BLOCK - c->num);
   192 			c->num=0;
   193 			/* drop through and do the rest */
   194 			}
   195 		else
   196 			{
   197 			memcpy(&(p[c->num]),data,len);
   198 			/* data+=len; */
   199 			c->num+=(int)len;
   200 			return 1;
   201 			}
   202 		}
   203 	/* we now can process the input data in blocks of MD2_BLOCK
   204 	 * chars and save the leftovers to c->data. */
   205 	while (len >= MD2_BLOCK)
   206 		{
   207 		md2_block(c,data);
   208 		data+=MD2_BLOCK;
   209 		len-=MD2_BLOCK;
   210 		}
   211 	memcpy(p,data,len);
   212 	c->num=(int)len;
   213 	return 1;
   214 	}
   215 
   216 static void md2_block(MD2_CTX *c, const unsigned char *d)
   217 	{
   218 	register MD2_INT t,*sp1,*sp2;
   219 	register int i,j;
   220 	MD2_INT state[48];
   221 
   222 	sp1=c->state;
   223 	sp2=c->cksm;
   224 	j=sp2[MD2_BLOCK-1];
   225 	for (i=0; i<16; i++)
   226 		{
   227 		state[i]=sp1[i];
   228 		state[i+16]=t=d[i];
   229 		state[i+32]=(t^sp1[i]);
   230 		j=sp2[i]^=S[t^j];
   231 		}
   232 	t=0;
   233 	for (i=0; i<18; i++)
   234 		{
   235 		for (j=0; j<48; j+=8)
   236 			{
   237 			t= state[j+ 0]^=S[t];
   238 			t= state[j+ 1]^=S[t];
   239 			t= state[j+ 2]^=S[t];
   240 			t= state[j+ 3]^=S[t];
   241 			t= state[j+ 4]^=S[t];
   242 			t= state[j+ 5]^=S[t];
   243 			t= state[j+ 6]^=S[t];
   244 			t= state[j+ 7]^=S[t];
   245 			}
   246 		t=(t+i)&0xff;
   247 		}
   248 	memcpy(sp1,state,16*sizeof(MD2_INT));
   249 	OPENSSL_cleanse(state,48*sizeof(MD2_INT));
   250 	}
   251 
   252 EXPORT_C int MD2_Final(unsigned char *md, MD2_CTX *c)
   253 	{
   254 	int i,v;
   255 	register UCHAR *cp;
   256 	register MD2_INT *p1,*p2;
   257 
   258 	cp=c->data;
   259 	p1=c->state;
   260 	p2=c->cksm;
   261 	v=MD2_BLOCK-c->num;
   262 	for (i=c->num; i<MD2_BLOCK; i++)
   263 		cp[i]=(UCHAR)v;
   264 
   265 	md2_block(c,cp);
   266 
   267 	for (i=0; i<MD2_BLOCK; i++)
   268 		cp[i]=(UCHAR)p2[i];
   269 	md2_block(c,cp);
   270 
   271 	for (i=0; i<16; i++)
   272 		md[i]=(UCHAR)(p1[i]&0xff);
   273 	memset((char *)&c,0,sizeof(c));
   274 	return 1;
   275 	}
   276