1// md4.cpp - modified by Wei Dai from Andrew M. Kuchling's md4.c 2// The original code and all modifications are in the public domain. 3 4// This is the original introductory comment: 5 6/* 7 * md4.c : MD4 hash algorithm. 8 * 9 * Part of the Python Cryptography Toolkit, version 1.1 10 * 11 * Distribute and use freely; there are no restrictions on further 12 * dissemination and usage except those imposed by the laws of your 13 * country of residence. 14 * 15 */ 16 17#include "pch.h" 18#define CRYPTOPP_ENABLE_NAMESPACE_WEAK 1 19#include "md4.h" 20#include "misc.h" 21 22NAMESPACE_BEGIN(CryptoPP) 23namespace Weak1 { 24 25void MD4::InitState(HashWordType *state) 26{ 27 state[0] = 0x67452301L; 28 state[1] = 0xefcdab89L; 29 state[2] = 0x98badcfeL; 30 state[3] = 0x10325476L; 31} 32 33void MD4::Transform (word32 *digest, const word32 *in) 34{ 35// #define F(x, y, z) (((x) & (y)) | ((~x) & (z))) 36#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) 37#define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z))) 38#define H(x, y, z) ((x) ^ (y) ^ (z)) 39 40 word32 A, B, C, D; 41 42 A=digest[0]; 43 B=digest[1]; 44 C=digest[2]; 45 D=digest[3]; 46 47#define function(a,b,c,d,k,s) a=rotlFixed(a+F(b,c,d)+in[k],s); 48 function(A,B,C,D, 0, 3); 49 function(D,A,B,C, 1, 7); 50 function(C,D,A,B, 2,11); 51 function(B,C,D,A, 3,19); 52 function(A,B,C,D, 4, 3); 53 function(D,A,B,C, 5, 7); 54 function(C,D,A,B, 6,11); 55 function(B,C,D,A, 7,19); 56 function(A,B,C,D, 8, 3); 57 function(D,A,B,C, 9, 7); 58 function(C,D,A,B,10,11); 59 function(B,C,D,A,11,19); 60 function(A,B,C,D,12, 3); 61 function(D,A,B,C,13, 7); 62 function(C,D,A,B,14,11); 63 function(B,C,D,A,15,19); 64 65#undef function 66#define function(a,b,c,d,k,s) a=rotlFixed(a+G(b,c,d)+in[k]+0x5a827999,s); 67 function(A,B,C,D, 0, 3); 68 function(D,A,B,C, 4, 5); 69 function(C,D,A,B, 8, 9); 70 function(B,C,D,A,12,13); 71 function(A,B,C,D, 1, 3); 72 function(D,A,B,C, 5, 5); 73 function(C,D,A,B, 9, 9); 74 function(B,C,D,A,13,13); 75 function(A,B,C,D, 2, 3); 76 function(D,A,B,C, 6, 5); 77 function(C,D,A,B,10, 9); 78 function(B,C,D,A,14,13); 79 function(A,B,C,D, 3, 3); 80 function(D,A,B,C, 7, 5); 81 function(C,D,A,B,11, 9); 82 function(B,C,D,A,15,13); 83 84#undef function 85#define function(a,b,c,d,k,s) a=rotlFixed(a+H(b,c,d)+in[k]+0x6ed9eba1,s); 86 function(A,B,C,D, 0, 3); 87 function(D,A,B,C, 8, 9); 88 function(C,D,A,B, 4,11); 89 function(B,C,D,A,12,15); 90 function(A,B,C,D, 2, 3); 91 function(D,A,B,C,10, 9); 92 function(C,D,A,B, 6,11); 93 function(B,C,D,A,14,15); 94 function(A,B,C,D, 1, 3); 95 function(D,A,B,C, 9, 9); 96 function(C,D,A,B, 5,11); 97 function(B,C,D,A,13,15); 98 function(A,B,C,D, 3, 3); 99 function(D,A,B,C,11, 9); 100 function(C,D,A,B, 7,11); 101 function(B,C,D,A,15,15); 102 103 digest[0]+=A; 104 digest[1]+=B; 105 digest[2]+=C; 106 digest[3]+=D; 107} 108 109} 110NAMESPACE_END 111