00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "pch.h"
00018 #define CRYPTOPP_ENABLE_NAMESPACE_WEAK 1
00019 #include "md4.h"
00020 #include "misc.h"
00021
00022 NAMESPACE_BEGIN(CryptoPP)
00023 namespace Weak1 {
00024
00025 void MD4::InitState(HashWordType *state)
00026 {
00027 state[0] = 0x67452301L;
00028 state[1] = 0xefcdab89L;
00029 state[2] = 0x98badcfeL;
00030 state[3] = 0x10325476L;
00031 }
00032
00033 void MD4::Transform (word32 *digest, const word32 *in)
00034 {
00035
00036 #define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
00037 #define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
00038 #define H(x, y, z) ((x) ^ (y) ^ (z))
00039
00040 word32 A, B, C, D;
00041
00042 A=digest[0];
00043 B=digest[1];
00044 C=digest[2];
00045 D=digest[3];
00046
00047 #define function(a,b,c,d,k,s) a=rotlFixed(a+F(b,c,d)+in[k],s);
00048 function(A,B,C,D, 0, 3);
00049 function(D,A,B,C, 1, 7);
00050 function(C,D,A,B, 2,11);
00051 function(B,C,D,A, 3,19);
00052 function(A,B,C,D, 4, 3);
00053 function(D,A,B,C, 5, 7);
00054 function(C,D,A,B, 6,11);
00055 function(B,C,D,A, 7,19);
00056 function(A,B,C,D, 8, 3);
00057 function(D,A,B,C, 9, 7);
00058 function(C,D,A,B,10,11);
00059 function(B,C,D,A,11,19);
00060 function(A,B,C,D,12, 3);
00061 function(D,A,B,C,13, 7);
00062 function(C,D,A,B,14,11);
00063 function(B,C,D,A,15,19);
00064
00065 #undef function
00066 #define function(a,b,c,d,k,s) a=rotlFixed(a+G(b,c,d)+in[k]+0x5a827999,s);
00067 function(A,B,C,D, 0, 3);
00068 function(D,A,B,C, 4, 5);
00069 function(C,D,A,B, 8, 9);
00070 function(B,C,D,A,12,13);
00071 function(A,B,C,D, 1, 3);
00072 function(D,A,B,C, 5, 5);
00073 function(C,D,A,B, 9, 9);
00074 function(B,C,D,A,13,13);
00075 function(A,B,C,D, 2, 3);
00076 function(D,A,B,C, 6, 5);
00077 function(C,D,A,B,10, 9);
00078 function(B,C,D,A,14,13);
00079 function(A,B,C,D, 3, 3);
00080 function(D,A,B,C, 7, 5);
00081 function(C,D,A,B,11, 9);
00082 function(B,C,D,A,15,13);
00083
00084 #undef function
00085 #define function(a,b,c,d,k,s) a=rotlFixed(a+H(b,c,d)+in[k]+0x6ed9eba1,s);
00086 function(A,B,C,D, 0, 3);
00087 function(D,A,B,C, 8, 9);
00088 function(C,D,A,B, 4,11);
00089 function(B,C,D,A,12,15);
00090 function(A,B,C,D, 2, 3);
00091 function(D,A,B,C,10, 9);
00092 function(C,D,A,B, 6,11);
00093 function(B,C,D,A,14,15);
00094 function(A,B,C,D, 1, 3);
00095 function(D,A,B,C, 9, 9);
00096 function(C,D,A,B, 5,11);
00097 function(B,C,D,A,13,15);
00098 function(A,B,C,D, 3, 3);
00099 function(D,A,B,C,11, 9);
00100 function(C,D,A,B, 7,11);
00101 function(B,C,D,A,15,15);
00102
00103 digest[0]+=A;
00104 digest[1]+=B;
00105 digest[2]+=C;
00106 digest[3]+=D;
00107 }
00108
00109 }
00110 NAMESPACE_END