1 /* GLOBAL.H - RSAREF types and constants */
2 
3 #include <string.h>
4 
5 /* POINTER defines a generic pointer type */
6 typedef unsigned char *POINTER;
7 
8 /* UINT2 defines a two byte word */
9 typedef unsigned short int UINT2;
10 
11 /* UINT4 defines a four byte word */
12 #ifdef __alpha__
13 typedef unsigned int UINT4;
14 #else
15 typedef unsigned long int UINT4;
16 #endif
17 
18 
19 /* MD4.H - header file for MD4C.C */
20 
21 /* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991.
22 
23 All rights reserved.
24 
25 License to copy and use this software is granted provided that it is identified as the RSA Data Security, Inc. MD4 Message-Digest Algorithm in all material mentioning or referencing this software or this function.
26 License is also granted to make and use derivative works provided that such works are identified as derived from the RSA Data Security, Inc. MD4 Message-Digest Algorithm in all material mentioning or referencing the derived work.
27 RSA Data Security, Inc. makes no representations concerning either the merchantability of this software or the suitability of this software for any particular purpose. It is provided as is without express or implied warranty of any kind.
28 
29 These notices must be retained in any copies of any part of this documentation and/or software. */
30 
31 /* MD4 context. */
32 typedef struct {
33 	UINT4 state[4];				/* state (ABCD) */
34 	UINT4 count[2];				/* number of bits, modulo 2^64 (lsb first) */
35 	unsigned char buffer[64];			/* input buffer */
36 } MD4_CTX;
37 
38 void MD4Init (MD4_CTX *);
39 void MD4Update (MD4_CTX *, unsigned char *, unsigned int);
40 void MD4Final (unsigned char [16], MD4_CTX *);
41 
42 
43 
44 /* MD4C.C - RSA Data Security, Inc., MD4 message-digest algorithm */
45 /* Copyright (C) 1990-2, RSA Data Security, Inc. All rights reserved.
46 
47 License to copy and use this software is granted provided that it is identified as the
48 RSA Data Security, Inc. MD4 Message-Digest Algorithm
49  in all material mentioning or referencing this software or this function.
50 License is also granted to make and use derivative works provided that such works are identified as
51 derived from the RSA Data Security, Inc. MD4 Message-Digest Algorithm
52 in all material mentioning or referencing the derived work.
53 RSA Data Security, Inc. makes no representations concerning either the merchantability of this software or the suitability of this software for any particular purpose. It is provided
54 as is without express or implied warranty of any kind.
55 
56 These notices must be retained in any copies of any part of this documentation and/or software. */
57 
58 /* Constants for MD4Transform routine.  */
59 #define S11 3
60 #define S12 7
61 #define S13 11
62 #define S14 19
63 #define S21 3
64 #define S22 5
65 #define S23 9
66 #define S24 13
67 #define S31 3
68 #define S32 9
69 #define S33 11
70 #define S34 15
71 
72 static void MD4Transform (UINT4 [4], unsigned char [64]);
73 static void Encode (unsigned char *, UINT4 *, unsigned int);
74 static void Decode (UINT4 *, unsigned char *, unsigned int);
75 
76 static unsigned char PADDING[64] = {
77   0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
78   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
79   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
80   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
81   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
82   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
83   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
84   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
85 };
86 
87 /* F, G and H are basic MD4 functions. */
88 #define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
89 #define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
90 #define H(x, y, z) ((x) ^ (y) ^ (z))
91 
92 /* ROTATE_LEFT rotates x left n bits. */
93 #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
94 
95 /* FF, GG and HH are transformations for rounds 1, 2 and 3 */
96 /* Rotation is separate from addition to prevent recomputation */
97 #define FF(a, b, c, d, x, s) {(a) += F ((b), (c), (d)) + (x); (a) = ROTATE_LEFT ((a), (s));}
98 
99 #define GG(a, b, c, d, x, s) {(a) += G ((b), (c), (d)) + (x) + (UINT4)0x5a827999; (a) = ROTATE_LEFT ((a), (s));}
100 
101 #define HH(a, b, c, d, x, s) {(a) += H ((b), (c), (d)) + (x) + (UINT4)0x6ed9eba1; (a) = ROTATE_LEFT ((a), (s));}
102 
103 
104 /* MD4 initialization. Begins an MD4 operation, writing a new context. */
MD4Init(MD4_CTX * context)105 void MD4Init (MD4_CTX *context) {
106 	context->count[0] = context->count[1] = 0;
107 
108 /* Load magic initialization constants.*/
109 context->state[0] = 0x67452301;
110 context->state[1] = 0xefcdab89;
111 context->state[2] = 0x98badcfe;
112 context->state[3] = 0x10325476;
113 }
114 
115 /* MD4 block update operation. Continues an MD4 message-digest operation, processing another message block, and updating the context. */
MD4Update(MD4_CTX * context,unsigned char * input,unsigned int inputLen)116 void MD4Update (MD4_CTX *context, unsigned char *input, unsigned int inputLen)
117 {
118 	unsigned int i, index, partLen;
119 
120 	/* Compute number of bytes mod 64 */
121 	index = (unsigned int)((context->count[0] >> 3) & 0x3F);
122 
123 	/* Update number of bits */
124 	if ((context->count[0] += ((UINT4)inputLen << 3))< ((UINT4)inputLen << 3))
125 		context->count[1]++;
126 
127 	context->count[1] += ((UINT4)inputLen >> 29);
128 
129 	partLen = 64 - index;
130 
131 	/* Transform as many times as possible.*/
132 	if (inputLen >= partLen) {
133 		memcpy((POINTER)&context->buffer[index], (POINTER)input, partLen);
134 		MD4Transform (context->state, context->buffer);
135 
136 		for (i = partLen; i + 63 < inputLen; i += 64)
137 			MD4Transform (context->state, &input[i]);
138 
139 		index = 0;
140 	}
141 	else
142 		i = 0;
143 
144 	/* Buffer remaining input */
145 	memcpy ((POINTER)&context->buffer[index], (POINTER)&input[i], inputLen-i);
146 }
147 
148 
149 /* MD4 finalization. Ends an MD4 message-digest operation, writing the the message digest and zeroizing the context. */
MD4Final(unsigned char digest[16],MD4_CTX * context)150 void MD4Final (unsigned char digest[16], MD4_CTX *context)
151 {
152 	unsigned char bits[8];
153 	unsigned int index, padLen;
154 
155 	/* Save number of bits */
156 	Encode (bits, context->count, 8);
157 
158 	/* Pad out to 56 mod 64.*/
159 	index = (unsigned int)((context->count[0] >> 3) & 0x3f);
160 	padLen = (index < 56) ? (56 - index) : (120 - index);
161 	MD4Update (context, PADDING, padLen);
162 
163 	/* Append length (before padding) */
164 	MD4Update (context, bits, 8);
165 
166 	/* Store state in digest */
167 	Encode (digest, context->state, 16);
168 
169 	/* Zeroize sensitive information.*/
170 	memset ((POINTER)context, 0, sizeof (*context));
171 }
172 
173 
174 /* MD4 basic transformation. Transforms state based on block. */
MD4Transform(UINT4 state[4],unsigned char block[64])175 static void MD4Transform (UINT4 state[4], unsigned char block[64])
176 {
177 	UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
178 
179 	Decode (x, block, 64);
180 
181 	/* Round 1 */
182 	FF (a, b, c, d, x[ 0], S11);			/* 1 */
183 	FF (d, a, b, c, x[ 1], S12);			/* 2 */
184 	FF (c, d, a, b, x[ 2], S13);			/* 3 */
185 	FF (b, c, d, a, x[ 3], S14);			/* 4 */
186 	FF (a, b, c, d, x[ 4], S11);			/* 5 */
187 	FF (d, a, b, c, x[ 5], S12);			/* 6 */
188 	FF (c, d, a, b, x[ 6], S13);			/* 7 */
189 	FF (b, c, d, a, x[ 7], S14);			/* 8 */
190 	FF (a, b, c, d, x[ 8], S11);			/* 9 */
191 	FF (d, a, b, c, x[ 9], S12);			/* 10 */
192 	FF (c, d, a, b, x[10], S13);			/* 11 */
193 	FF (b, c, d, a, x[11], S14);			/* 12 */
194 	FF (a, b, c, d, x[12], S11);			/* 13 */
195 	FF (d, a, b, c, x[13], S12);			/* 14 */
196 	FF (c, d, a, b, x[14], S13);			/* 15 */
197 	FF (b, c, d, a, x[15], S14);			/* 16 */
198 
199 	/* Round 2 */
200 	GG (a, b, c, d, x[ 0], S21);			/* 17 */
201 	GG (d, a, b, c, x[ 4], S22);			/* 18 */
202 	GG (c, d, a, b, x[ 8], S23);			/* 19 */
203 	GG (b, c, d, a, x[12], S24);			/* 20 */
204 	GG (a, b, c, d, x[ 1], S21);			/* 21 */
205 	GG (d, a, b, c, x[ 5], S22);			/* 22 */
206 	GG (c, d, a, b, x[ 9], S23);			/* 23 */
207 	GG (b, c, d, a, x[13], S24);			/* 24 */
208 	GG (a, b, c, d, x[ 2], S21);			/* 25 */
209 	GG (d, a, b, c, x[ 6], S22);			/* 26 */
210 	GG (c, d, a, b, x[10], S23);			/* 27 */
211 	GG (b, c, d, a, x[14], S24);			/* 28 */
212 	GG (a, b, c, d, x[ 3], S21);			/* 29 */
213 	GG (d, a, b, c, x[ 7], S22);			/* 30 */
214 	GG (c, d, a, b, x[11], S23);			/* 31 */
215 	GG (b, c, d, a, x[15], S24);			/* 32 */
216 
217 	/* Round 3 */
218 	HH (a, b, c, d, x[ 0], S31);			/* 33 */
219 	HH (d, a, b, c, x[ 8], S32);			/* 34 */
220 	HH (c, d, a, b, x[ 4], S33);			/* 35 */
221 	HH (b, c, d, a, x[12], S34);			/* 36 */
222 	HH (a, b, c, d, x[ 2], S31);			/* 37 */
223 	HH (d, a, b, c, x[10], S32);			/* 38 */
224 	HH (c, d, a, b, x[ 6], S33);			/* 39 */
225 	HH (b, c, d, a, x[14], S34);			/* 40 */
226 	HH (a, b, c, d, x[ 1], S31);			/* 41 */
227 	HH (d, a, b, c, x[ 9], S32);			/* 42 */
228 	HH (c, d, a, b, x[ 5], S33);			/* 43 */
229 	HH (b, c, d, a, x[13], S34);			/* 44 */
230 	HH (a, b, c, d, x[ 3], S31);			/* 45 */
231 	HH (d, a, b, c, x[11], S32);			/* 46 */
232 	HH (c, d, a, b, x[ 7], S33);			/* 47 */
233 	HH (b, c, d, a, x[15], S34);			/* 48 */
234 
235 	state[0] += a;
236 	state[1] += b;
237 	state[2] += c;
238 	state[3] += d;
239 
240 	/* Zeroize sensitive information.*/
241 	memset ((POINTER)x, 0, sizeof (x));
242 }
243 
244 /* Encodes input (UINT4) into output (unsigned char). Assumes len is a multiple of 4. */
Encode(unsigned char * output,UINT4 * input,unsigned int len)245 static void Encode (unsigned char *output, UINT4 *input, unsigned int len)
246 {
247 	unsigned int i, j;
248 
249 	for (i = 0, j = 0; j < len; i++, j += 4) {
250 		output[j] = (unsigned char)(input[i] & 0xff);
251 		output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
252 		output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
253 		output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
254 	}
255 }
256 
257 /* Decodes input (unsigned char) into output (UINT4). Assumes len is a multiple of 4. */
Decode(UINT4 * output,unsigned char * input,unsigned int len)258 static void Decode (UINT4 *output, unsigned char *input, unsigned int len)
259 {
260 	unsigned int i, j;
261 
262 	for (i = 0, j = 0; j < len; i++, j += 4)
263 		output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) | (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24);
264 }
265 
266 // ==========================================================================
267 
Com_BlockChecksum(void * buffer,int length)268 unsigned int Com_BlockChecksum (void *buffer, int length)
269 {
270 	int				digest[4];
271 	unsigned int	val;
272 	MD4_CTX			ctx;
273 
274 	MD4Init (&ctx);
275 	MD4Update (&ctx, (unsigned char *)buffer, length);
276 	MD4Final ((unsigned char *)digest, &ctx);
277 
278 	val = digest[0] ^ digest[1] ^ digest[2] ^ digest[3];
279 
280 	return val;
281 }
282 
283