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