00001
00002
00003
00004
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
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
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