ripemd.cpp

00001 // ripemd.cpp
00002 // RIPEMD-160 written and placed in the public domain by Wei Dai
00003 // RIPEMD-320, RIPEMD-128, RIPEMD-256 written by Kevin Springle
00004 // and also placed in the public domain
00005 
00006 #include "pch.h"
00007 #include "ripemd.h"
00008 #include "misc.h"
00009 
00010 NAMESPACE_BEGIN(CryptoPP)
00011 
00012 #define F(x, y, z)    (x ^ y ^ z) 
00013 #define G(x, y, z)    (z ^ (x & (y^z)))
00014 #define H(x, y, z)    (z ^ (x | ~y))
00015 #define I(x, y, z)    (y ^ (z & (x^y)))
00016 #define J(x, y, z)    (x ^ (y | ~z))
00017 
00018 #define k0 0
00019 #define k1 0x5a827999UL
00020 #define k2 0x6ed9eba1UL
00021 #define k3 0x8f1bbcdcUL
00022 #define k4 0xa953fd4eUL
00023 #define k5 0x50a28be6UL
00024 #define k6 0x5c4dd124UL
00025 #define k7 0x6d703ef3UL
00026 #define k8 0x7a6d76e9UL
00027 #define k9 0
00028 
00029 // *************************************************************
00030 
00031 // for 160 and 320
00032 #define Subround(f, a, b, c, d, e, x, s, k)        \
00033         a += f(b, c, d) + x + k;\
00034         a = rotlFixed((word32)a, s) + e;\
00035         c = rotlFixed((word32)c, 10U)
00036 
00037 void RIPEMD160::InitState(HashWordType *state)
00038 {
00039         state[0] = 0x67452301L;
00040         state[1] = 0xefcdab89L;
00041         state[2] = 0x98badcfeL;
00042         state[3] = 0x10325476L;
00043         state[4] = 0xc3d2e1f0L;
00044 }
00045 
00046 void RIPEMD160::Transform (word32 *digest, const word32 *X)
00047 {
00048         unsigned long a1, b1, c1, d1, e1, a2, b2, c2, d2, e2;
00049         a1 = a2 = digest[0];
00050         b1 = b2 = digest[1];
00051         c1 = c2 = digest[2];
00052         d1 = d2 = digest[3];
00053         e1 = e2 = digest[4];
00054 
00055         Subround(F, a1, b1, c1, d1, e1, X[ 0], 11, k0);
00056         Subround(F, e1, a1, b1, c1, d1, X[ 1], 14, k0);
00057         Subround(F, d1, e1, a1, b1, c1, X[ 2], 15, k0);
00058         Subround(F, c1, d1, e1, a1, b1, X[ 3], 12, k0);
00059         Subround(F, b1, c1, d1, e1, a1, X[ 4],  5, k0);
00060         Subround(F, a1, b1, c1, d1, e1, X[ 5],  8, k0);
00061         Subround(F, e1, a1, b1, c1, d1, X[ 6],  7, k0);
00062         Subround(F, d1, e1, a1, b1, c1, X[ 7],  9, k0);
00063         Subround(F, c1, d1, e1, a1, b1, X[ 8], 11, k0);
00064         Subround(F, b1, c1, d1, e1, a1, X[ 9], 13, k0);
00065         Subround(F, a1, b1, c1, d1, e1, X[10], 14, k0);
00066         Subround(F, e1, a1, b1, c1, d1, X[11], 15, k0);
00067         Subround(F, d1, e1, a1, b1, c1, X[12],  6, k0);
00068         Subround(F, c1, d1, e1, a1, b1, X[13],  7, k0);
00069         Subround(F, b1, c1, d1, e1, a1, X[14],  9, k0);
00070         Subround(F, a1, b1, c1, d1, e1, X[15],  8, k0);
00071 
00072         Subround(G, e1, a1, b1, c1, d1, X[ 7],  7, k1);
00073         Subround(G, d1, e1, a1, b1, c1, X[ 4],  6, k1);
00074         Subround(G, c1, d1, e1, a1, b1, X[13],  8, k1);
00075         Subround(G, b1, c1, d1, e1, a1, X[ 1], 13, k1);
00076         Subround(G, a1, b1, c1, d1, e1, X[10], 11, k1);
00077         Subround(G, e1, a1, b1, c1, d1, X[ 6],  9, k1);
00078         Subround(G, d1, e1, a1, b1, c1, X[15],  7, k1);
00079         Subround(G, c1, d1, e1, a1, b1, X[ 3], 15, k1);
00080         Subround(G, b1, c1, d1, e1, a1, X[12],  7, k1);
00081         Subround(G, a1, b1, c1, d1, e1, X[ 0], 12, k1);
00082         Subround(G, e1, a1, b1, c1, d1, X[ 9], 15, k1);
00083         Subround(G, d1, e1, a1, b1, c1, X[ 5],  9, k1);
00084         Subround(G, c1, d1, e1, a1, b1, X[ 2], 11, k1);
00085         Subround(G, b1, c1, d1, e1, a1, X[14],  7, k1);
00086         Subround(G, a1, b1, c1, d1, e1, X[11], 13, k1);
00087         Subround(G, e1, a1, b1, c1, d1, X[ 8], 12, k1);
00088 
00089         Subround(H, d1, e1, a1, b1, c1, X[ 3], 11, k2);
00090         Subround(H, c1, d1, e1, a1, b1, X[10], 13, k2);
00091         Subround(H, b1, c1, d1, e1, a1, X[14],  6, k2);
00092         Subround(H, a1, b1, c1, d1, e1, X[ 4],  7, k2);
00093         Subround(H, e1, a1, b1, c1, d1, X[ 9], 14, k2);
00094         Subround(H, d1, e1, a1, b1, c1, X[15],  9, k2);
00095         Subround(H, c1, d1, e1, a1, b1, X[ 8], 13, k2);
00096         Subround(H, b1, c1, d1, e1, a1, X[ 1], 15, k2);
00097         Subround(H, a1, b1, c1, d1, e1, X[ 2], 14, k2);
00098         Subround(H, e1, a1, b1, c1, d1, X[ 7],  8, k2);
00099         Subround(H, d1, e1, a1, b1, c1, X[ 0], 13, k2);
00100         Subround(H, c1, d1, e1, a1, b1, X[ 6],  6, k2);
00101         Subround(H, b1, c1, d1, e1, a1, X[13],  5, k2);
00102         Subround(H, a1, b1, c1, d1, e1, X[11], 12, k2);
00103         Subround(H, e1, a1, b1, c1, d1, X[ 5],  7, k2);
00104         Subround(H, d1, e1, a1, b1, c1, X[12],  5, k2);
00105 
00106         Subround(I, c1, d1, e1, a1, b1, X[ 1], 11, k3);
00107         Subround(I, b1, c1, d1, e1, a1, X[ 9], 12, k3);
00108         Subround(I, a1, b1, c1, d1, e1, X[11], 14, k3);
00109         Subround(I, e1, a1, b1, c1, d1, X[10], 15, k3);
00110         Subround(I, d1, e1, a1, b1, c1, X[ 0], 14, k3);
00111         Subround(I, c1, d1, e1, a1, b1, X[ 8], 15, k3);
00112         Subround(I, b1, c1, d1, e1, a1, X[12],  9, k3);
00113         Subround(I, a1, b1, c1, d1, e1, X[ 4],  8, k3);
00114         Subround(I, e1, a1, b1, c1, d1, X[13],  9, k3);
00115         Subround(I, d1, e1, a1, b1, c1, X[ 3], 14, k3);
00116         Subround(I, c1, d1, e1, a1, b1, X[ 7],  5, k3);
00117         Subround(I, b1, c1, d1, e1, a1, X[15],  6, k3);
00118         Subround(I, a1, b1, c1, d1, e1, X[14],  8, k3);
00119         Subround(I, e1, a1, b1, c1, d1, X[ 5],  6, k3);
00120         Subround(I, d1, e1, a1, b1, c1, X[ 6],  5, k3);
00121         Subround(I, c1, d1, e1, a1, b1, X[ 2], 12, k3);
00122 
00123         Subround(J, b1, c1, d1, e1, a1, X[ 4],  9, k4);
00124         Subround(J, a1, b1, c1, d1, e1, X[ 0], 15, k4);
00125         Subround(J, e1, a1, b1, c1, d1, X[ 5],  5, k4);
00126         Subround(J, d1, e1, a1, b1, c1, X[ 9], 11, k4);
00127         Subround(J, c1, d1, e1, a1, b1, X[ 7],  6, k4);
00128         Subround(J, b1, c1, d1, e1, a1, X[12],  8, k4);
00129         Subround(J, a1, b1, c1, d1, e1, X[ 2], 13, k4);
00130         Subround(J, e1, a1, b1, c1, d1, X[10], 12, k4);
00131         Subround(J, d1, e1, a1, b1, c1, X[14],  5, k4);
00132         Subround(J, c1, d1, e1, a1, b1, X[ 1], 12, k4);
00133         Subround(J, b1, c1, d1, e1, a1, X[ 3], 13, k4);
00134         Subround(J, a1, b1, c1, d1, e1, X[ 8], 14, k4);
00135         Subround(J, e1, a1, b1, c1, d1, X[11], 11, k4);
00136         Subround(J, d1, e1, a1, b1, c1, X[ 6],  8, k4);
00137         Subround(J, c1, d1, e1, a1, b1, X[15],  5, k4);
00138         Subround(J, b1, c1, d1, e1, a1, X[13],  6, k4);
00139 
00140         Subround(J, a2, b2, c2, d2, e2, X[ 5],  8, k5);
00141         Subround(J, e2, a2, b2, c2, d2, X[14],  9, k5);
00142         Subround(J, d2, e2, a2, b2, c2, X[ 7],  9, k5);
00143         Subround(J, c2, d2, e2, a2, b2, X[ 0], 11, k5);
00144         Subround(J, b2, c2, d2, e2, a2, X[ 9], 13, k5);
00145         Subround(J, a2, b2, c2, d2, e2, X[ 2], 15, k5);
00146         Subround(J, e2, a2, b2, c2, d2, X[11], 15, k5);
00147         Subround(J, d2, e2, a2, b2, c2, X[ 4],  5, k5);
00148         Subround(J, c2, d2, e2, a2, b2, X[13],  7, k5);
00149         Subround(J, b2, c2, d2, e2, a2, X[ 6],  7, k5);
00150         Subround(J, a2, b2, c2, d2, e2, X[15],  8, k5);
00151         Subround(J, e2, a2, b2, c2, d2, X[ 8], 11, k5);
00152         Subround(J, d2, e2, a2, b2, c2, X[ 1], 14, k5);
00153         Subround(J, c2, d2, e2, a2, b2, X[10], 14, k5);
00154         Subround(J, b2, c2, d2, e2, a2, X[ 3], 12, k5);
00155         Subround(J, a2, b2, c2, d2, e2, X[12],  6, k5);
00156 
00157         Subround(I, e2, a2, b2, c2, d2, X[ 6],  9, k6); 
00158         Subround(I, d2, e2, a2, b2, c2, X[11], 13, k6);
00159         Subround(I, c2, d2, e2, a2, b2, X[ 3], 15, k6);
00160         Subround(I, b2, c2, d2, e2, a2, X[ 7],  7, k6);
00161         Subround(I, a2, b2, c2, d2, e2, X[ 0], 12, k6);
00162         Subround(I, e2, a2, b2, c2, d2, X[13],  8, k6);
00163         Subround(I, d2, e2, a2, b2, c2, X[ 5],  9, k6);
00164         Subround(I, c2, d2, e2, a2, b2, X[10], 11, k6);
00165         Subround(I, b2, c2, d2, e2, a2, X[14],  7, k6);
00166         Subround(I, a2, b2, c2, d2, e2, X[15],  7, k6);
00167         Subround(I, e2, a2, b2, c2, d2, X[ 8], 12, k6);
00168         Subround(I, d2, e2, a2, b2, c2, X[12],  7, k6);
00169         Subround(I, c2, d2, e2, a2, b2, X[ 4],  6, k6);
00170         Subround(I, b2, c2, d2, e2, a2, X[ 9], 15, k6);
00171         Subround(I, a2, b2, c2, d2, e2, X[ 1], 13, k6);
00172         Subround(I, e2, a2, b2, c2, d2, X[ 2], 11, k6);
00173 
00174         Subround(H, d2, e2, a2, b2, c2, X[15],  9, k7);
00175         Subround(H, c2, d2, e2, a2, b2, X[ 5],  7, k7);
00176         Subround(H, b2, c2, d2, e2, a2, X[ 1], 15, k7);
00177         Subround(H, a2, b2, c2, d2, e2, X[ 3], 11, k7);
00178         Subround(H, e2, a2, b2, c2, d2, X[ 7],  8, k7);
00179         Subround(H, d2, e2, a2, b2, c2, X[14],  6, k7);
00180         Subround(H, c2, d2, e2, a2, b2, X[ 6],  6, k7);
00181         Subround(H, b2, c2, d2, e2, a2, X[ 9], 14, k7);
00182         Subround(H, a2, b2, c2, d2, e2, X[11], 12, k7);
00183         Subround(H, e2, a2, b2, c2, d2, X[ 8], 13, k7);
00184         Subround(H, d2, e2, a2, b2, c2, X[12],  5, k7);
00185         Subround(H, c2, d2, e2, a2, b2, X[ 2], 14, k7);
00186         Subround(H, b2, c2, d2, e2, a2, X[10], 13, k7);
00187         Subround(H, a2, b2, c2, d2, e2, X[ 0], 13, k7);
00188         Subround(H, e2, a2, b2, c2, d2, X[ 4],  7, k7);
00189         Subround(H, d2, e2, a2, b2, c2, X[13],  5, k7);
00190 
00191         Subround(G, c2, d2, e2, a2, b2, X[ 8], 15, k8);
00192         Subround(G, b2, c2, d2, e2, a2, X[ 6],  5, k8);
00193         Subround(G, a2, b2, c2, d2, e2, X[ 4],  8, k8);
00194         Subround(G, e2, a2, b2, c2, d2, X[ 1], 11, k8);
00195         Subround(G, d2, e2, a2, b2, c2, X[ 3], 14, k8);
00196         Subround(G, c2, d2, e2, a2, b2, X[11], 14, k8);
00197         Subround(G, b2, c2, d2, e2, a2, X[15],  6, k8);
00198         Subround(G, a2, b2, c2, d2, e2, X[ 0], 14, k8);
00199         Subround(G, e2, a2, b2, c2, d2, X[ 5],  6, k8);
00200         Subround(G, d2, e2, a2, b2, c2, X[12],  9, k8);
00201         Subround(G, c2, d2, e2, a2, b2, X[ 2], 12, k8);
00202         Subround(G, b2, c2, d2, e2, a2, X[13],  9, k8);
00203         Subround(G, a2, b2, c2, d2, e2, X[ 9], 12, k8);
00204         Subround(G, e2, a2, b2, c2, d2, X[ 7],  5, k8);
00205         Subround(G, d2, e2, a2, b2, c2, X[10], 15, k8);
00206         Subround(G, c2, d2, e2, a2, b2, X[14],  8, k8);
00207 
00208         Subround(F, b2, c2, d2, e2, a2, X[12],  8, k9);
00209         Subround(F, a2, b2, c2, d2, e2, X[15],  5, k9);
00210         Subround(F, e2, a2, b2, c2, d2, X[10], 12, k9);
00211         Subround(F, d2, e2, a2, b2, c2, X[ 4],  9, k9);
00212         Subround(F, c2, d2, e2, a2, b2, X[ 1], 12, k9);
00213         Subround(F, b2, c2, d2, e2, a2, X[ 5],  5, k9);
00214         Subround(F, a2, b2, c2, d2, e2, X[ 8], 14, k9);
00215         Subround(F, e2, a2, b2, c2, d2, X[ 7],  6, k9);
00216         Subround(F, d2, e2, a2, b2, c2, X[ 6],  8, k9);
00217         Subround(F, c2, d2, e2, a2, b2, X[ 2], 13, k9);
00218         Subround(F, b2, c2, d2, e2, a2, X[13],  6, k9);
00219         Subround(F, a2, b2, c2, d2, e2, X[14],  5, k9);
00220         Subround(F, e2, a2, b2, c2, d2, X[ 0], 15, k9);
00221         Subround(F, d2, e2, a2, b2, c2, X[ 3], 13, k9);
00222         Subround(F, c2, d2, e2, a2, b2, X[ 9], 11, k9);
00223         Subround(F, b2, c2, d2, e2, a2, X[11], 11, k9);
00224 
00225         c1        = digest[1] + c1 + d2;
00226         digest[1] = digest[2] + d1 + e2;
00227         digest[2] = digest[3] + e1 + a2;
00228         digest[3] = digest[4] + a1 + b2;
00229         digest[4] = digest[0] + b1 + c2;
00230         digest[0] = c1;
00231 }
00232 
00233 // *************************************************************
00234 
00235 void RIPEMD320::InitState(HashWordType *state)
00236 {
00237         state[0] = 0x67452301L;
00238         state[1] = 0xefcdab89L;
00239         state[2] = 0x98badcfeL;
00240         state[3] = 0x10325476L;
00241         state[4] = 0xc3d2e1f0L;
00242         state[5] = 0x76543210L;
00243         state[6] = 0xfedcba98L;
00244         state[7] = 0x89abcdefL;
00245         state[8] = 0x01234567L;
00246         state[9] = 0x3c2d1e0fL;
00247 }
00248 
00249 void RIPEMD320::Transform (word32 *digest, const word32 *X)
00250 {
00251         unsigned long a1, b1, c1, d1, e1, a2, b2, c2, d2, e2, t;
00252         a1 = digest[0];
00253         b1 = digest[1];
00254         c1 = digest[2];
00255         d1 = digest[3];
00256         e1 = digest[4];
00257         a2 = digest[5];
00258         b2 = digest[6];
00259         c2 = digest[7];
00260         d2 = digest[8];
00261         e2 = digest[9];
00262 
00263         Subround(F, a1, b1, c1, d1, e1, X[ 0], 11, k0);
00264         Subround(F, e1, a1, b1, c1, d1, X[ 1], 14, k0);
00265         Subround(F, d1, e1, a1, b1, c1, X[ 2], 15, k0);
00266         Subround(F, c1, d1, e1, a1, b1, X[ 3], 12, k0);
00267         Subround(F, b1, c1, d1, e1, a1, X[ 4],  5, k0);
00268         Subround(F, a1, b1, c1, d1, e1, X[ 5],  8, k0);
00269         Subround(F, e1, a1, b1, c1, d1, X[ 6],  7, k0);
00270         Subround(F, d1, e1, a1, b1, c1, X[ 7],  9, k0);
00271         Subround(F, c1, d1, e1, a1, b1, X[ 8], 11, k0);
00272         Subround(F, b1, c1, d1, e1, a1, X[ 9], 13, k0);
00273         Subround(F, a1, b1, c1, d1, e1, X[10], 14, k0);
00274         Subround(F, e1, a1, b1, c1, d1, X[11], 15, k0);
00275         Subround(F, d1, e1, a1, b1, c1, X[12],  6, k0);
00276         Subround(F, c1, d1, e1, a1, b1, X[13],  7, k0);
00277         Subround(F, b1, c1, d1, e1, a1, X[14],  9, k0);
00278         Subround(F, a1, b1, c1, d1, e1, X[15],  8, k0);
00279 
00280         Subround(J, a2, b2, c2, d2, e2, X[ 5],  8, k5);
00281         Subround(J, e2, a2, b2, c2, d2, X[14],  9, k5);
00282         Subround(J, d2, e2, a2, b2, c2, X[ 7],  9, k5);
00283         Subround(J, c2, d2, e2, a2, b2, X[ 0], 11, k5);
00284         Subround(J, b2, c2, d2, e2, a2, X[ 9], 13, k5);
00285         Subround(J, a2, b2, c2, d2, e2, X[ 2], 15, k5);
00286         Subround(J, e2, a2, b2, c2, d2, X[11], 15, k5);
00287         Subround(J, d2, e2, a2, b2, c2, X[ 4],  5, k5);
00288         Subround(J, c2, d2, e2, a2, b2, X[13],  7, k5);
00289         Subround(J, b2, c2, d2, e2, a2, X[ 6],  7, k5);
00290         Subround(J, a2, b2, c2, d2, e2, X[15],  8, k5);
00291         Subround(J, e2, a2, b2, c2, d2, X[ 8], 11, k5);
00292         Subround(J, d2, e2, a2, b2, c2, X[ 1], 14, k5);
00293         Subround(J, c2, d2, e2, a2, b2, X[10], 14, k5);
00294         Subround(J, b2, c2, d2, e2, a2, X[ 3], 12, k5);
00295         Subround(J, a2, b2, c2, d2, e2, X[12],  6, k5);
00296 
00297         t = a1; a1 = a2; a2 = t;
00298 
00299         Subround(G, e1, a1, b1, c1, d1, X[ 7],  7, k1);
00300         Subround(G, d1, e1, a1, b1, c1, X[ 4],  6, k1);
00301         Subround(G, c1, d1, e1, a1, b1, X[13],  8, k1);
00302         Subround(G, b1, c1, d1, e1, a1, X[ 1], 13, k1);
00303         Subround(G, a1, b1, c1, d1, e1, X[10], 11, k1);
00304         Subround(G, e1, a1, b1, c1, d1, X[ 6],  9, k1);
00305         Subround(G, d1, e1, a1, b1, c1, X[15],  7, k1);
00306         Subround(G, c1, d1, e1, a1, b1, X[ 3], 15, k1);
00307         Subround(G, b1, c1, d1, e1, a1, X[12],  7, k1);
00308         Subround(G, a1, b1, c1, d1, e1, X[ 0], 12, k1);
00309         Subround(G, e1, a1, b1, c1, d1, X[ 9], 15, k1);
00310         Subround(G, d1, e1, a1, b1, c1, X[ 5],  9, k1);
00311         Subround(G, c1, d1, e1, a1, b1, X[ 2], 11, k1);
00312         Subround(G, b1, c1, d1, e1, a1, X[14],  7, k1);
00313         Subround(G, a1, b1, c1, d1, e1, X[11], 13, k1);
00314         Subround(G, e1, a1, b1, c1, d1, X[ 8], 12, k1);
00315 
00316         Subround(I, e2, a2, b2, c2, d2, X[ 6],  9, k6); 
00317         Subround(I, d2, e2, a2, b2, c2, X[11], 13, k6);
00318         Subround(I, c2, d2, e2, a2, b2, X[ 3], 15, k6);
00319         Subround(I, b2, c2, d2, e2, a2, X[ 7],  7, k6);
00320         Subround(I, a2, b2, c2, d2, e2, X[ 0], 12, k6);
00321         Subround(I, e2, a2, b2, c2, d2, X[13],  8, k6);
00322         Subround(I, d2, e2, a2, b2, c2, X[ 5],  9, k6);
00323         Subround(I, c2, d2, e2, a2, b2, X[10], 11, k6);
00324         Subround(I, b2, c2, d2, e2, a2, X[14],  7, k6);
00325         Subround(I, a2, b2, c2, d2, e2, X[15],  7, k6);
00326         Subround(I, e2, a2, b2, c2, d2, X[ 8], 12, k6);
00327         Subround(I, d2, e2, a2, b2, c2, X[12],  7, k6);
00328         Subround(I, c2, d2, e2, a2, b2, X[ 4],  6, k6);
00329         Subround(I, b2, c2, d2, e2, a2, X[ 9], 15, k6);
00330         Subround(I, a2, b2, c2, d2, e2, X[ 1], 13, k6);
00331         Subround(I, e2, a2, b2, c2, d2, X[ 2], 11, k6);
00332 
00333         t = b1; b1 = b2; b2 = t;
00334 
00335         Subround(H, d1, e1, a1, b1, c1, X[ 3], 11, k2);
00336         Subround(H, c1, d1, e1, a1, b1, X[10], 13, k2);
00337         Subround(H, b1, c1, d1, e1, a1, X[14],  6, k2);
00338         Subround(H, a1, b1, c1, d1, e1, X[ 4],  7, k2);
00339         Subround(H, e1, a1, b1, c1, d1, X[ 9], 14, k2);
00340         Subround(H, d1, e1, a1, b1, c1, X[15],  9, k2);
00341         Subround(H, c1, d1, e1, a1, b1, X[ 8], 13, k2);
00342         Subround(H, b1, c1, d1, e1, a1, X[ 1], 15, k2);
00343         Subround(H, a1, b1, c1, d1, e1, X[ 2], 14, k2);
00344         Subround(H, e1, a1, b1, c1, d1, X[ 7],  8, k2);
00345         Subround(H, d1, e1, a1, b1, c1, X[ 0], 13, k2);
00346         Subround(H, c1, d1, e1, a1, b1, X[ 6],  6, k2);
00347         Subround(H, b1, c1, d1, e1, a1, X[13],  5, k2);
00348         Subround(H, a1, b1, c1, d1, e1, X[11], 12, k2);
00349         Subround(H, e1, a1, b1, c1, d1, X[ 5],  7, k2);
00350         Subround(H, d1, e1, a1, b1, c1, X[12],  5, k2);
00351 
00352         Subround(H, d2, e2, a2, b2, c2, X[15],  9, k7);
00353         Subround(H, c2, d2, e2, a2, b2, X[ 5],  7, k7);
00354         Subround(H, b2, c2, d2, e2, a2, X[ 1], 15, k7);
00355         Subround(H, a2, b2, c2, d2, e2, X[ 3], 11, k7);
00356         Subround(H, e2, a2, b2, c2, d2, X[ 7],  8, k7);
00357         Subround(H, d2, e2, a2, b2, c2, X[14],  6, k7);
00358         Subround(H, c2, d2, e2, a2, b2, X[ 6],  6, k7);
00359         Subround(H, b2, c2, d2, e2, a2, X[ 9], 14, k7);
00360         Subround(H, a2, b2, c2, d2, e2, X[11], 12, k7);
00361         Subround(H, e2, a2, b2, c2, d2, X[ 8], 13, k7);
00362         Subround(H, d2, e2, a2, b2, c2, X[12],  5, k7);
00363         Subround(H, c2, d2, e2, a2, b2, X[ 2], 14, k7);
00364         Subround(H, b2, c2, d2, e2, a2, X[10], 13, k7);
00365         Subround(H, a2, b2, c2, d2, e2, X[ 0], 13, k7);
00366         Subround(H, e2, a2, b2, c2, d2, X[ 4],  7, k7);
00367         Subround(H, d2, e2, a2, b2, c2, X[13],  5, k7);
00368 
00369         t = c1; c1 = c2; c2 = t;
00370 
00371         Subround(I, c1, d1, e1, a1, b1, X[ 1], 11, k3);
00372         Subround(I, b1, c1, d1, e1, a1, X[ 9], 12, k3);
00373         Subround(I, a1, b1, c1, d1, e1, X[11], 14, k3);
00374         Subround(I, e1, a1, b1, c1, d1, X[10], 15, k3);
00375         Subround(I, d1, e1, a1, b1, c1, X[ 0], 14, k3);
00376         Subround(I, c1, d1, e1, a1, b1, X[ 8], 15, k3);
00377         Subround(I, b1, c1, d1, e1, a1, X[12],  9, k3);
00378         Subround(I, a1, b1, c1, d1, e1, X[ 4],  8, k3);
00379         Subround(I, e1, a1, b1, c1, d1, X[13],  9, k3);
00380         Subround(I, d1, e1, a1, b1, c1, X[ 3], 14, k3);
00381         Subround(I, c1, d1, e1, a1, b1, X[ 7],  5, k3);
00382         Subround(I, b1, c1, d1, e1, a1, X[15],  6, k3);
00383         Subround(I, a1, b1, c1, d1, e1, X[14],  8, k3);
00384         Subround(I, e1, a1, b1, c1, d1, X[ 5],  6, k3);
00385         Subround(I, d1, e1, a1, b1, c1, X[ 6],  5, k3);
00386         Subround(I, c1, d1, e1, a1, b1, X[ 2], 12, k3);
00387 
00388         Subround(G, c2, d2, e2, a2, b2, X[ 8], 15, k8);
00389         Subround(G, b2, c2, d2, e2, a2, X[ 6],  5, k8);
00390         Subround(G, a2, b2, c2, d2, e2, X[ 4],  8, k8);
00391         Subround(G, e2, a2, b2, c2, d2, X[ 1], 11, k8);
00392         Subround(G, d2, e2, a2, b2, c2, X[ 3], 14, k8);
00393         Subround(G, c2, d2, e2, a2, b2, X[11], 14, k8);
00394         Subround(G, b2, c2, d2, e2, a2, X[15],  6, k8);
00395         Subround(G, a2, b2, c2, d2, e2, X[ 0], 14, k8);
00396         Subround(G, e2, a2, b2, c2, d2, X[ 5],  6, k8);
00397         Subround(G, d2, e2, a2, b2, c2, X[12],  9, k8);
00398         Subround(G, c2, d2, e2, a2, b2, X[ 2], 12, k8);
00399         Subround(G, b2, c2, d2, e2, a2, X[13],  9, k8);
00400         Subround(G, a2, b2, c2, d2, e2, X[ 9], 12, k8);
00401         Subround(G, e2, a2, b2, c2, d2, X[ 7],  5, k8);
00402         Subround(G, d2, e2, a2, b2, c2, X[10], 15, k8);
00403         Subround(G, c2, d2, e2, a2, b2, X[14],  8, k8);
00404 
00405         t = d1; d1 = d2; d2 = t;
00406 
00407         Subround(J, b1, c1, d1, e1, a1, X[ 4],  9, k4);
00408         Subround(J, a1, b1, c1, d1, e1, X[ 0], 15, k4);
00409         Subround(J, e1, a1, b1, c1, d1, X[ 5],  5, k4);
00410         Subround(J, d1, e1, a1, b1, c1, X[ 9], 11, k4);
00411         Subround(J, c1, d1, e1, a1, b1, X[ 7],  6, k4);
00412         Subround(J, b1, c1, d1, e1, a1, X[12],  8, k4);
00413         Subround(J, a1, b1, c1, d1, e1, X[ 2], 13, k4);
00414         Subround(J, e1, a1, b1, c1, d1, X[10], 12, k4);
00415         Subround(J, d1, e1, a1, b1, c1, X[14],  5, k4);
00416         Subround(J, c1, d1, e1, a1, b1, X[ 1], 12, k4);
00417         Subround(J, b1, c1, d1, e1, a1, X[ 3], 13, k4);
00418         Subround(J, a1, b1, c1, d1, e1, X[ 8], 14, k4);
00419         Subround(J, e1, a1, b1, c1, d1, X[11], 11, k4);
00420         Subround(J, d1, e1, a1, b1, c1, X[ 6],  8, k4);
00421         Subround(J, c1, d1, e1, a1, b1, X[15],  5, k4);
00422         Subround(J, b1, c1, d1, e1, a1, X[13],  6, k4);
00423 
00424         Subround(F, b2, c2, d2, e2, a2, X[12],  8, k9);
00425         Subround(F, a2, b2, c2, d2, e2, X[15],  5, k9);
00426         Subround(F, e2, a2, b2, c2, d2, X[10], 12, k9);
00427         Subround(F, d2, e2, a2, b2, c2, X[ 4],  9, k9);
00428         Subround(F, c2, d2, e2, a2, b2, X[ 1], 12, k9);
00429         Subround(F, b2, c2, d2, e2, a2, X[ 5],  5, k9);
00430         Subround(F, a2, b2, c2, d2, e2, X[ 8], 14, k9);
00431         Subround(F, e2, a2, b2, c2, d2, X[ 7],  6, k9);
00432         Subround(F, d2, e2, a2, b2, c2, X[ 6],  8, k9);
00433         Subround(F, c2, d2, e2, a2, b2, X[ 2], 13, k9);
00434         Subround(F, b2, c2, d2, e2, a2, X[13],  6, k9);
00435         Subround(F, a2, b2, c2, d2, e2, X[14],  5, k9);
00436         Subround(F, e2, a2, b2, c2, d2, X[ 0], 15, k9);
00437         Subround(F, d2, e2, a2, b2, c2, X[ 3], 13, k9);
00438         Subround(F, c2, d2, e2, a2, b2, X[ 9], 11, k9);
00439         Subround(F, b2, c2, d2, e2, a2, X[11], 11, k9);
00440 
00441         t = e1; e1 = e2; e2 = t;
00442 
00443         digest[0] += a1;
00444         digest[1] += b1;
00445         digest[2] += c1;
00446         digest[3] += d1;
00447         digest[4] += e1;
00448         digest[5] += a2;
00449         digest[6] += b2;
00450         digest[7] += c2;
00451         digest[8] += d2;
00452         digest[9] += e2;
00453 }
00454 
00455 #undef Subround
00456 
00457 // *************************************************************
00458 
00459 // for 128 and 256
00460 #define Subround(f, a, b, c, d, x, s, k)        \
00461         a += f(b, c, d) + x + k;\
00462         a = rotlFixed((word32)a, s);
00463 
00464 void RIPEMD128::InitState(HashWordType *state)
00465 {
00466         state[0] = 0x67452301L;
00467         state[1] = 0xefcdab89L;
00468         state[2] = 0x98badcfeL;
00469         state[3] = 0x10325476L;
00470 }
00471 
00472 void RIPEMD128::Transform (word32 *digest, const word32 *X)
00473 {
00474         unsigned long a1, b1, c1, d1, a2, b2, c2, d2;
00475         a1 = a2 = digest[0];
00476         b1 = b2 = digest[1];
00477         c1 = c2 = digest[2];
00478         d1 = d2 = digest[3];
00479 
00480         Subround(F, a1, b1, c1, d1, X[ 0], 11, k0);
00481         Subround(F, d1, a1, b1, c1, X[ 1], 14, k0);
00482         Subround(F, c1, d1, a1, b1, X[ 2], 15, k0);
00483         Subround(F, b1, c1, d1, a1, X[ 3], 12, k0);
00484         Subround(F, a1, b1, c1, d1, X[ 4],  5, k0);
00485         Subround(F, d1, a1, b1, c1, X[ 5],  8, k0);
00486         Subround(F, c1, d1, a1, b1, X[ 6],  7, k0);
00487         Subround(F, b1, c1, d1, a1, X[ 7],  9, k0);
00488         Subround(F, a1, b1, c1, d1, X[ 8], 11, k0);
00489         Subround(F, d1, a1, b1, c1, X[ 9], 13, k0);
00490         Subround(F, c1, d1, a1, b1, X[10], 14, k0);
00491         Subround(F, b1, c1, d1, a1, X[11], 15, k0);
00492         Subround(F, a1, b1, c1, d1, X[12],  6, k0);
00493         Subround(F, d1, a1, b1, c1, X[13],  7, k0);
00494         Subround(F, c1, d1, a1, b1, X[14],  9, k0);
00495         Subround(F, b1, c1, d1, a1, X[15],  8, k0);
00496 
00497         Subround(G, a1, b1, c1, d1, X[ 7],  7, k1);
00498         Subround(G, d1, a1, b1, c1, X[ 4],  6, k1);
00499         Subround(G, c1, d1, a1, b1, X[13],  8, k1);
00500         Subround(G, b1, c1, d1, a1, X[ 1], 13, k1);
00501         Subround(G, a1, b1, c1, d1, X[10], 11, k1);
00502         Subround(G, d1, a1, b1, c1, X[ 6],  9, k1);
00503         Subround(G, c1, d1, a1, b1, X[15],  7, k1);
00504         Subround(G, b1, c1, d1, a1, X[ 3], 15, k1);
00505         Subround(G, a1, b1, c1, d1, X[12],  7, k1);
00506         Subround(G, d1, a1, b1, c1, X[ 0], 12, k1);
00507         Subround(G, c1, d1, a1, b1, X[ 9], 15, k1);
00508         Subround(G, b1, c1, d1, a1, X[ 5],  9, k1);
00509         Subround(G, a1, b1, c1, d1, X[ 2], 11, k1);
00510         Subround(G, d1, a1, b1, c1, X[14],  7, k1);
00511         Subround(G, c1, d1, a1, b1, X[11], 13, k1);
00512         Subround(G, b1, c1, d1, a1, X[ 8], 12, k1);
00513 
00514         Subround(H, a1, b1, c1, d1, X[ 3], 11, k2);
00515         Subround(H, d1, a1, b1, c1, X[10], 13, k2);
00516         Subround(H, c1, d1, a1, b1, X[14],  6, k2);
00517         Subround(H, b1, c1, d1, a1, X[ 4],  7, k2);
00518         Subround(H, a1, b1, c1, d1, X[ 9], 14, k2);
00519         Subround(H, d1, a1, b1, c1, X[15],  9, k2);
00520         Subround(H, c1, d1, a1, b1, X[ 8], 13, k2);
00521         Subround(H, b1, c1, d1, a1, X[ 1], 15, k2);
00522         Subround(H, a1, b1, c1, d1, X[ 2], 14, k2);
00523         Subround(H, d1, a1, b1, c1, X[ 7],  8, k2);
00524         Subround(H, c1, d1, a1, b1, X[ 0], 13, k2);
00525         Subround(H, b1, c1, d1, a1, X[ 6],  6, k2);
00526         Subround(H, a1, b1, c1, d1, X[13],  5, k2);
00527         Subround(H, d1, a1, b1, c1, X[11], 12, k2);
00528         Subround(H, c1, d1, a1, b1, X[ 5],  7, k2);
00529         Subround(H, b1, c1, d1, a1, X[12],  5, k2);
00530 
00531         Subround(I, a1, b1, c1, d1, X[ 1], 11, k3);
00532         Subround(I, d1, a1, b1, c1, X[ 9], 12, k3);
00533         Subround(I, c1, d1, a1, b1, X[11], 14, k3);
00534         Subround(I, b1, c1, d1, a1, X[10], 15, k3);
00535         Subround(I, a1, b1, c1, d1, X[ 0], 14, k3);
00536         Subround(I, d1, a1, b1, c1, X[ 8], 15, k3);
00537         Subround(I, c1, d1, a1, b1, X[12],  9, k3);
00538         Subround(I, b1, c1, d1, a1, X[ 4],  8, k3);
00539         Subround(I, a1, b1, c1, d1, X[13],  9, k3);
00540         Subround(I, d1, a1, b1, c1, X[ 3], 14, k3);
00541         Subround(I, c1, d1, a1, b1, X[ 7],  5, k3);
00542         Subround(I, b1, c1, d1, a1, X[15],  6, k3);
00543         Subround(I, a1, b1, c1, d1, X[14],  8, k3);
00544         Subround(I, d1, a1, b1, c1, X[ 5],  6, k3);
00545         Subround(I, c1, d1, a1, b1, X[ 6],  5, k3);
00546         Subround(I, b1, c1, d1, a1, X[ 2], 12, k3);
00547 
00548         Subround(I, a2, b2, c2, d2, X[ 5],  8, k5);
00549         Subround(I, d2, a2, b2, c2, X[14],  9, k5);
00550         Subround(I, c2, d2, a2, b2, X[ 7],  9, k5);
00551         Subround(I, b2, c2, d2, a2, X[ 0], 11, k5);
00552         Subround(I, a2, b2, c2, d2, X[ 9], 13, k5);
00553         Subround(I, d2, a2, b2, c2, X[ 2], 15, k5);
00554         Subround(I, c2, d2, a2, b2, X[11], 15, k5);
00555         Subround(I, b2, c2, d2, a2, X[ 4],  5, k5);
00556         Subround(I, a2, b2, c2, d2, X[13],  7, k5);
00557         Subround(I, d2, a2, b2, c2, X[ 6],  7, k5);
00558         Subround(I, c2, d2, a2, b2, X[15],  8, k5);
00559         Subround(I, b2, c2, d2, a2, X[ 8], 11, k5);
00560         Subround(I, a2, b2, c2, d2, X[ 1], 14, k5);
00561         Subround(I, d2, a2, b2, c2, X[10], 14, k5);
00562         Subround(I, c2, d2, a2, b2, X[ 3], 12, k5);
00563         Subround(I, b2, c2, d2, a2, X[12],  6, k5);
00564 
00565         Subround(H, a2, b2, c2, d2, X[ 6],  9, k6);
00566         Subround(H, d2, a2, b2, c2, X[11], 13, k6);
00567         Subround(H, c2, d2, a2, b2, X[ 3], 15, k6);
00568         Subround(H, b2, c2, d2, a2, X[ 7],  7, k6);
00569         Subround(H, a2, b2, c2, d2, X[ 0], 12, k6);
00570         Subround(H, d2, a2, b2, c2, X[13],  8, k6);
00571         Subround(H, c2, d2, a2, b2, X[ 5],  9, k6);
00572         Subround(H, b2, c2, d2, a2, X[10], 11, k6);
00573         Subround(H, a2, b2, c2, d2, X[14],  7, k6);
00574         Subround(H, d2, a2, b2, c2, X[15],  7, k6);
00575         Subround(H, c2, d2, a2, b2, X[ 8], 12, k6);
00576         Subround(H, b2, c2, d2, a2, X[12],  7, k6);
00577         Subround(H, a2, b2, c2, d2, X[ 4],  6, k6);
00578         Subround(H, d2, a2, b2, c2, X[ 9], 15, k6);
00579         Subround(H, c2, d2, a2, b2, X[ 1], 13, k6);
00580         Subround(H, b2, c2, d2, a2, X[ 2], 11, k6);
00581 
00582         Subround(G, a2, b2, c2, d2, X[15],  9, k7);
00583         Subround(G, d2, a2, b2, c2, X[ 5],  7, k7);
00584         Subround(G, c2, d2, a2, b2, X[ 1], 15, k7);
00585         Subround(G, b2, c2, d2, a2, X[ 3], 11, k7);
00586         Subround(G, a2, b2, c2, d2, X[ 7],  8, k7);
00587         Subround(G, d2, a2, b2, c2, X[14],  6, k7);
00588         Subround(G, c2, d2, a2, b2, X[ 6],  6, k7);
00589         Subround(G, b2, c2, d2, a2, X[ 9], 14, k7);
00590         Subround(G, a2, b2, c2, d2, X[11], 12, k7);
00591         Subround(G, d2, a2, b2, c2, X[ 8], 13, k7);
00592         Subround(G, c2, d2, a2, b2, X[12],  5, k7);
00593         Subround(G, b2, c2, d2, a2, X[ 2], 14, k7);
00594         Subround(G, a2, b2, c2, d2, X[10], 13, k7);
00595         Subround(G, d2, a2, b2, c2, X[ 0], 13, k7);
00596         Subround(G, c2, d2, a2, b2, X[ 4],  7, k7);
00597         Subround(G, b2, c2, d2, a2, X[13],  5, k7);
00598 
00599         Subround(F, a2, b2, c2, d2, X[ 8], 15, k9);
00600         Subround(F, d2, a2, b2, c2, X[ 6],  5, k9);
00601         Subround(F, c2, d2, a2, b2, X[ 4],  8, k9);
00602         Subround(F, b2, c2, d2, a2, X[ 1], 11, k9);
00603         Subround(F, a2, b2, c2, d2, X[ 3], 14, k9);
00604         Subround(F, d2, a2, b2, c2, X[11], 14, k9);
00605         Subround(F, c2, d2, a2, b2, X[15],  6, k9);
00606         Subround(F, b2, c2, d2, a2, X[ 0], 14, k9);
00607         Subround(F, a2, b2, c2, d2, X[ 5],  6, k9);
00608         Subround(F, d2, a2, b2, c2, X[12],  9, k9);
00609         Subround(F, c2, d2, a2, b2, X[ 2], 12, k9);
00610         Subround(F, b2, c2, d2, a2, X[13],  9, k9);
00611         Subround(F, a2, b2, c2, d2, X[ 9], 12, k9);
00612         Subround(F, d2, a2, b2, c2, X[ 7],  5, k9);
00613         Subround(F, c2, d2, a2, b2, X[10], 15, k9);
00614         Subround(F, b2, c2, d2, a2, X[14],  8, k9);
00615 
00616         c1        = digest[1] + c1 + d2;
00617         digest[1] = digest[2] + d1 + a2;
00618         digest[2] = digest[3] + a1 + b2;
00619         digest[3] = digest[0] + b1 + c2;
00620         digest[0] = c1;
00621 }
00622 
00623 // *************************************************************
00624 
00625 void RIPEMD256::InitState(HashWordType *state)
00626 {
00627         state[0] = 0x67452301L;
00628         state[1] = 0xefcdab89L;
00629         state[2] = 0x98badcfeL;
00630         state[3] = 0x10325476L;
00631         state[4] = 0x76543210L;
00632         state[5] = 0xfedcba98L;
00633         state[6] = 0x89abcdefL;
00634         state[7] = 0x01234567L;
00635 }
00636 
00637 void RIPEMD256::Transform (word32 *digest, const word32 *X)
00638 {
00639         unsigned long a1, b1, c1, d1, a2, b2, c2, d2, t;
00640         a1 = digest[0];
00641         b1 = digest[1];
00642         c1 = digest[2];
00643         d1 = digest[3];
00644         a2 = digest[4];
00645         b2 = digest[5];
00646         c2 = digest[6];
00647         d2 = digest[7];
00648 
00649         Subround(F, a1, b1, c1, d1, X[ 0], 11, k0);
00650         Subround(F, d1, a1, b1, c1, X[ 1], 14, k0);
00651         Subround(F, c1, d1, a1, b1, X[ 2], 15, k0);
00652         Subround(F, b1, c1, d1, a1, X[ 3], 12, k0);
00653         Subround(F, a1, b1, c1, d1, X[ 4],  5, k0);
00654         Subround(F, d1, a1, b1, c1, X[ 5],  8, k0);
00655         Subround(F, c1, d1, a1, b1, X[ 6],  7, k0);
00656         Subround(F, b1, c1, d1, a1, X[ 7],  9, k0);
00657         Subround(F, a1, b1, c1, d1, X[ 8], 11, k0);
00658         Subround(F, d1, a1, b1, c1, X[ 9], 13, k0);
00659         Subround(F, c1, d1, a1, b1, X[10], 14, k0);
00660         Subround(F, b1, c1, d1, a1, X[11], 15, k0);
00661         Subround(F, a1, b1, c1, d1, X[12],  6, k0);
00662         Subround(F, d1, a1, b1, c1, X[13],  7, k0);
00663         Subround(F, c1, d1, a1, b1, X[14],  9, k0);
00664         Subround(F, b1, c1, d1, a1, X[15],  8, k0);
00665 
00666         Subround(I, a2, b2, c2, d2, X[ 5],  8, k5);
00667         Subround(I, d2, a2, b2, c2, X[14],  9, k5);
00668         Subround(I, c2, d2, a2, b2, X[ 7],  9, k5);
00669         Subround(I, b2, c2, d2, a2, X[ 0], 11, k5);
00670         Subround(I, a2, b2, c2, d2, X[ 9], 13, k5);
00671         Subround(I, d2, a2, b2, c2, X[ 2], 15, k5);
00672         Subround(I, c2, d2, a2, b2, X[11], 15, k5);
00673         Subround(I, b2, c2, d2, a2, X[ 4],  5, k5);
00674         Subround(I, a2, b2, c2, d2, X[13],  7, k5);
00675         Subround(I, d2, a2, b2, c2, X[ 6],  7, k5);
00676         Subround(I, c2, d2, a2, b2, X[15],  8, k5);
00677         Subround(I, b2, c2, d2, a2, X[ 8], 11, k5);
00678         Subround(I, a2, b2, c2, d2, X[ 1], 14, k5);
00679         Subround(I, d2, a2, b2, c2, X[10], 14, k5);
00680         Subround(I, c2, d2, a2, b2, X[ 3], 12, k5);
00681         Subround(I, b2, c2, d2, a2, X[12],  6, k5);
00682 
00683         t = a1; a1 = a2; a2 = t;
00684 
00685         Subround(G, a1, b1, c1, d1, X[ 7],  7, k1);
00686         Subround(G, d1, a1, b1, c1, X[ 4],  6, k1);
00687         Subround(G, c1, d1, a1, b1, X[13],  8, k1);
00688         Subround(G, b1, c1, d1, a1, X[ 1], 13, k1);
00689         Subround(G, a1, b1, c1, d1, X[10], 11, k1);
00690         Subround(G, d1, a1, b1, c1, X[ 6],  9, k1);
00691         Subround(G, c1, d1, a1, b1, X[15],  7, k1);
00692         Subround(G, b1, c1, d1, a1, X[ 3], 15, k1);
00693         Subround(G, a1, b1, c1, d1, X[12],  7, k1);
00694         Subround(G, d1, a1, b1, c1, X[ 0], 12, k1);
00695         Subround(G, c1, d1, a1, b1, X[ 9], 15, k1);
00696         Subround(G, b1, c1, d1, a1, X[ 5],  9, k1);
00697         Subround(G, a1, b1, c1, d1, X[ 2], 11, k1);
00698         Subround(G, d1, a1, b1, c1, X[14],  7, k1);
00699         Subround(G, c1, d1, a1, b1, X[11], 13, k1);
00700         Subround(G, b1, c1, d1, a1, X[ 8], 12, k1);
00701 
00702         Subround(H, a2, b2, c2, d2, X[ 6],  9, k6);
00703         Subround(H, d2, a2, b2, c2, X[11], 13, k6);
00704         Subround(H, c2, d2, a2, b2, X[ 3], 15, k6);
00705         Subround(H, b2, c2, d2, a2, X[ 7],  7, k6);
00706         Subround(H, a2, b2, c2, d2, X[ 0], 12, k6);
00707         Subround(H, d2, a2, b2, c2, X[13],  8, k6);
00708         Subround(H, c2, d2, a2, b2, X[ 5],  9, k6);
00709         Subround(H, b2, c2, d2, a2, X[10], 11, k6);
00710         Subround(H, a2, b2, c2, d2, X[14],  7, k6);
00711         Subround(H, d2, a2, b2, c2, X[15],  7, k6);
00712         Subround(H, c2, d2, a2, b2, X[ 8], 12, k6);
00713         Subround(H, b2, c2, d2, a2, X[12],  7, k6);
00714         Subround(H, a2, b2, c2, d2, X[ 4],  6, k6);
00715         Subround(H, d2, a2, b2, c2, X[ 9], 15, k6);
00716         Subround(H, c2, d2, a2, b2, X[ 1], 13, k6);
00717         Subround(H, b2, c2, d2, a2, X[ 2], 11, k6);
00718 
00719         t = b1; b1 = b2; b2 = t;
00720 
00721         Subround(H, a1, b1, c1, d1, X[ 3], 11, k2);
00722         Subround(H, d1, a1, b1, c1, X[10], 13, k2);
00723         Subround(H, c1, d1, a1, b1, X[14],  6, k2);
00724         Subround(H, b1, c1, d1, a1, X[ 4],  7, k2);
00725         Subround(H, a1, b1, c1, d1, X[ 9], 14, k2);
00726         Subround(H, d1, a1, b1, c1, X[15],  9, k2);
00727         Subround(H, c1, d1, a1, b1, X[ 8], 13, k2);
00728         Subround(H, b1, c1, d1, a1, X[ 1], 15, k2);
00729         Subround(H, a1, b1, c1, d1, X[ 2], 14, k2);
00730         Subround(H, d1, a1, b1, c1, X[ 7],  8, k2);
00731         Subround(H, c1, d1, a1, b1, X[ 0], 13, k2);
00732         Subround(H, b1, c1, d1, a1, X[ 6],  6, k2);
00733         Subround(H, a1, b1, c1, d1, X[13],  5, k2);
00734         Subround(H, d1, a1, b1, c1, X[11], 12, k2);
00735         Subround(H, c1, d1, a1, b1, X[ 5],  7, k2);
00736         Subround(H, b1, c1, d1, a1, X[12],  5, k2);
00737 
00738         Subround(G, a2, b2, c2, d2, X[15],  9, k7);
00739         Subround(G, d2, a2, b2, c2, X[ 5],  7, k7);
00740         Subround(G, c2, d2, a2, b2, X[ 1], 15, k7);
00741         Subround(G, b2, c2, d2, a2, X[ 3], 11, k7);
00742         Subround(G, a2, b2, c2, d2, X[ 7],  8, k7);
00743         Subround(G, d2, a2, b2, c2, X[14],  6, k7);
00744         Subround(G, c2, d2, a2, b2, X[ 6],  6, k7);
00745         Subround(G, b2, c2, d2, a2, X[ 9], 14, k7);
00746         Subround(G, a2, b2, c2, d2, X[11], 12, k7);
00747         Subround(G, d2, a2, b2, c2, X[ 8], 13, k7);
00748         Subround(G, c2, d2, a2, b2, X[12],  5, k7);
00749         Subround(G, b2, c2, d2, a2, X[ 2], 14, k7);
00750         Subround(G, a2, b2, c2, d2, X[10], 13, k7);
00751         Subround(G, d2, a2, b2, c2, X[ 0], 13, k7);
00752         Subround(G, c2, d2, a2, b2, X[ 4],  7, k7);
00753         Subround(G, b2, c2, d2, a2, X[13],  5, k7);
00754 
00755         t = c1; c1 = c2; c2 = t;
00756 
00757         Subround(I, a1, b1, c1, d1, X[ 1], 11, k3);
00758         Subround(I, d1, a1, b1, c1, X[ 9], 12, k3);
00759         Subround(I, c1, d1, a1, b1, X[11], 14, k3);
00760         Subround(I, b1, c1, d1, a1, X[10], 15, k3);
00761         Subround(I, a1, b1, c1, d1, X[ 0], 14, k3);
00762         Subround(I, d1, a1, b1, c1, X[ 8], 15, k3);
00763         Subround(I, c1, d1, a1, b1, X[12],  9, k3);
00764         Subround(I, b1, c1, d1, a1, X[ 4],  8, k3);
00765         Subround(I, a1, b1, c1, d1, X[13],  9, k3);
00766         Subround(I, d1, a1, b1, c1, X[ 3], 14, k3);
00767         Subround(I, c1, d1, a1, b1, X[ 7],  5, k3);
00768         Subround(I, b1, c1, d1, a1, X[15],  6, k3);
00769         Subround(I, a1, b1, c1, d1, X[14],  8, k3);
00770         Subround(I, d1, a1, b1, c1, X[ 5],  6, k3);
00771         Subround(I, c1, d1, a1, b1, X[ 6],  5, k3);
00772         Subround(I, b1, c1, d1, a1, X[ 2], 12, k3);
00773 
00774         Subround(F, a2, b2, c2, d2, X[ 8], 15, k9);
00775         Subround(F, d2, a2, b2, c2, X[ 6],  5, k9);
00776         Subround(F, c2, d2, a2, b2, X[ 4],  8, k9);
00777         Subround(F, b2, c2, d2, a2, X[ 1], 11, k9);
00778         Subround(F, a2, b2, c2, d2, X[ 3], 14, k9);
00779         Subround(F, d2, a2, b2, c2, X[11], 14, k9);
00780         Subround(F, c2, d2, a2, b2, X[15],  6, k9);
00781         Subround(F, b2, c2, d2, a2, X[ 0], 14, k9);
00782         Subround(F, a2, b2, c2, d2, X[ 5],  6, k9);
00783         Subround(F, d2, a2, b2, c2, X[12],  9, k9);
00784         Subround(F, c2, d2, a2, b2, X[ 2], 12, k9);
00785         Subround(F, b2, c2, d2, a2, X[13],  9, k9);
00786         Subround(F, a2, b2, c2, d2, X[ 9], 12, k9);
00787         Subround(F, d2, a2, b2, c2, X[ 7],  5, k9);
00788         Subround(F, c2, d2, a2, b2, X[10], 15, k9);
00789         Subround(F, b2, c2, d2, a2, X[14],  8, k9);
00790 
00791         t = d1; d1 = d2; d2 = t;
00792 
00793         digest[0] += a1;
00794         digest[1] += b1;
00795         digest[2] += c1;
00796         digest[3] += d1;
00797         digest[4] += a2;
00798         digest[5] += b2;
00799         digest[6] += c2;
00800         digest[7] += d2;
00801 }
00802 
00803 NAMESPACE_END

Generated on Sat Dec 23 02:07:10 2006 for Crypto++ by  doxygen 1.5.1-p1