- Main Page
- Namespaces
- Classes
- Files

- File List
- File Members

# md4.cpp

    00001 // md4.cpp - modified by Wei Dai from Andrew M. Kuchling's md4.c
    00002 // The original code and all modifications are in the public domain.
    00003
    00004 // This is the original introductory comment:
    00005
    00006 /*
    00007  *  md4.c : MD4 hash algorithm.
    00008  *
    00009  * Part of the Python Cryptography Toolkit, version 1.1
    00010  *
    00011  * Distribute and use freely; there are no restrictions on further
    00012  * dissemination and usage except those imposed by the laws of your
    00013  * country of residence.
    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 // #define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
    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