00001
00013 #ifndef MD5_VC_MMX_H
00014 #define MD5_VC_MMX_H
00015
00016
00017
00018
00019 #ifdef INDEPENDENT_MD5_VC_MMX_H
00020 #include <stdio.h>
00021 #define uint32 unsigned long
00022 #define uint16 unsigned short
00023 #define uint8 unsigned char
00024
00028 #define MMX_REGISTER_PUSH32(m,a)\
00029 _asm movd m,a\
00030 _asm punpckldq m,m
00031 #else
00032 #include "dkcOSIndependent.h"
00033 #include "vc_asm_misc.h"
00034 #endif
00035
00036
00037
00038
00039
00044 #define MD5_VC_MMX_F1(d,x,y,z)\
00045 _asm movq d,y\
00046 _asm pxor d,z\
00047 _asm pand d,x\
00048 _asm pxor d,z
00049
00050 #define MD5_VC_MMX_F2(d,x, y, z) MD5_VC_MMX_F1(d,z, x, y)
00051
00053 #define MD5_VC_MMX_F3(d,x,y,z)\
00054 _asm movq d,y\
00055 _asm pxor d,z\
00056 _asm pxor d,x
00057
00058
00059
00061
00062 #define MD5_VC_MMX_F4(d,x,y,z)\
00063 _asm movq d,z\
00064 _asm pandn d,mm5\
00065 _asm por d,x\
00066 _asm pxor d,y
00067
00068
00069
00070
00071
00072
00073
00074
00075
00077 #define MD5_VC_MMX_CORE(temp,w,f,x,y,z,data)\
00078 f(temp,x,y,z)\
00079 _asm paddd temp,data\
00080 _asm paddd w,temp
00081
00082
00085 #define MD5_VC_MMX_ROTATE(d,w,s)\
00086 _asm movq d,w\
00087 _asm psllq d,s\
00088 _asm psrlq w,32-s\
00089 _asm por d,w
00090
00091 #define MD5_VC_MMX_ROTATE2(d,a,s)\
00092 _asm movq d,a\
00093 _asm pslld d,s\
00094 _asm psrld a,32-s\
00095 _asm por d,a
00096
00098 #define MD5_VC_MMX_STEP(f, w, x, y, z, data, s,temp) \
00099 MD5_VC_MMX_CORE(temp,w,f,x,y,z,(data))\
00100 MD5_VC_MMX_ROTATE2(temp,w,s)\
00101 _asm paddd temp,x\
00102 _asm movq w,temp
00103
00104
00105 DKC_INLINE uint64 MD5_VC_MMX_UINT32_TO_UINT64(uint32 a,uint32 b){
00106 ULARGE_INTEGER inte;
00107 inte.LowPart = a;
00108 inte.HighPart = b;
00109 return inte.QuadPart;
00110 }
00111 DKC_INLINE void MD5_VC_MMX_UINT64_TO_UINT32(uint64 s,uint32 *a,uint32 *b)
00112 {
00113 ULARGE_INTEGER inte;
00114 inte.QuadPart = s;
00115 *a = inte.LowPart;
00116 *b = inte.HighPart;
00117
00118 }
00120 #define INSERT_TINPOW(mm,tempmm,tinpo,data)\
00121 _asm mov eax,data\
00122 MMX_REGISTER_PUSH32(mm,eax)\
00123 _asm movq tempmm,tinpo\
00124 _asm paddd mm,tempmm
00125
00126
00127
00128
00129
00130
00131
00136 static DKC_INLINE void md5_mmx_double_update(
00137
00138
00139 uint32 *abcd0,
00140 uint32 *abcd1,
00141 const uint32 in0[16],
00142 const uint32 in1[16])
00143 {
00144 uint64 a,b,c,d;
00145 uint64 tinpo[16];
00146
00147 const uint64 tempv = 0xFFFFFFFFFFFFFFFF;
00148 int i;
00149 uint64 *ptinpo;
00150
00151
00152 a = MD5_VC_MMX_UINT32_TO_UINT64(abcd0[0],abcd1[0]);
00153 b = MD5_VC_MMX_UINT32_TO_UINT64(abcd0[1],abcd1[1]);
00154 c = MD5_VC_MMX_UINT32_TO_UINT64(abcd0[2],abcd1[2]);
00155 d = MD5_VC_MMX_UINT32_TO_UINT64(abcd0[3],abcd1[3]);
00156
00157 for(i=0;i<16;i++){
00158 tinpo[i] = MD5_VC_MMX_UINT32_TO_UINT64(in0[i],in1[i]);
00159 }
00160 ptinpo = tinpo;
00161
00162 __asm{
00163
00164 _asm movq mm0,a
00165 _asm movq mm1,b
00166 _asm movq mm2,c
00167 _asm movq mm3,d
00168
00169
00170
00171 #define tinpow mm4
00172 #define temp_mm mm6
00173
00174 _asm movq mm5, tempv
00175
00176
00177 mov esi,ptinpo
00178
00179
00180
00181
00182 INSERT_TINPOW(tinpow,temp_mm,[esi+0*8],0xd76aa478);
00183 MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm0, mm1, mm2, mm3, tinpow, 7,temp_mm);
00184 INSERT_TINPOW(tinpow,temp_mm,[esi+1*8] ,0xe8c7b756);
00185 MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm3, mm0, mm1, mm2, tinpow , 12,temp_mm);
00186 INSERT_TINPOW(tinpow,temp_mm,[esi+2*8] ,0x242070db);
00187 MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm2, mm3, mm0, mm1, tinpow, 17,temp_mm);
00188 INSERT_TINPOW(tinpow,temp_mm,[esi+3*8] ,0xc1bdceee);
00189 MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm1, mm2, mm3, mm0, tinpow, 22,temp_mm);
00190 INSERT_TINPOW(tinpow,temp_mm,[esi+4*8] , 0xf57c0faf);
00191 MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm0, mm1, mm2, mm3, tinpow, 7,temp_mm);
00192 INSERT_TINPOW(tinpow,temp_mm,[esi+5*8] , 0x4787c62a);
00193 MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm3, mm0, mm1, mm2, tinpow, 12,temp_mm);
00194 INSERT_TINPOW(tinpow,temp_mm,[esi+6*8] , 0xa8304613);
00195 MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm2, mm3, mm0, mm1, tinpow, 17,temp_mm);
00196 INSERT_TINPOW(tinpow,temp_mm,[esi+7*8] , 0xfd469501);
00197 MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm1, mm2, mm3, mm0, tinpow, 22,temp_mm);
00198 INSERT_TINPOW(tinpow,temp_mm,[esi+8*8] , 0x698098d8);
00199 MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm0, mm1, mm2, mm3, tinpow, 7,temp_mm);
00200 INSERT_TINPOW(tinpow,temp_mm,[esi+9*8] , 0x8b44f7af);
00201 MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm3, mm0, mm1, mm2, tinpow, 12,temp_mm);
00202 INSERT_TINPOW(tinpow,temp_mm,[esi+10*8] , 0xffff5bb1);
00203 MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm2, mm3, mm0, mm1, tinpow, 17,temp_mm);
00204 INSERT_TINPOW(tinpow,temp_mm,[esi+11*8] , 0x895cd7be);
00205 MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm1, mm2, mm3, mm0, tinpow, 22,temp_mm);
00206 INSERT_TINPOW(tinpow,temp_mm,[esi+12*8] , 0x6b901122);
00207 MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm0, mm1, mm2, mm3, tinpow, 7,temp_mm);
00208 INSERT_TINPOW(tinpow,temp_mm,[esi+13*8] , 0xfd987193);
00209 MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm3, mm0, mm1, mm2, tinpow, 12,temp_mm);
00210 INSERT_TINPOW(tinpow,temp_mm,[esi+14*8] , 0xa679438e);
00211 MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm2, mm3, mm0, mm1, tinpow, 17,temp_mm);
00212 INSERT_TINPOW(tinpow,temp_mm,[esi+15*8] , 0x49b40821);
00213 MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm1, mm2, mm3, mm0, tinpow, 22,temp_mm);
00214
00215 INSERT_TINPOW(tinpow,temp_mm,[esi+1*8] , 0xf61e2562);
00216 MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm0, mm1, mm2, mm3, tinpow, 5,temp_mm);
00217 INSERT_TINPOW(tinpow,temp_mm,[esi+6*8] , 0xc040b340);
00218 MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm3, mm0, mm1, mm2, tinpow, 9,temp_mm);
00219 INSERT_TINPOW(tinpow,temp_mm,[esi+11*8] , 0x265e5a51);
00220 MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm2, mm3, mm0, mm1, tinpow, 14,temp_mm);
00221 INSERT_TINPOW(tinpow,temp_mm,[esi+0*8] , 0xe9b6c7aa);
00222 MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm1, mm2, mm3, mm0, tinpow, 20,temp_mm);
00223 INSERT_TINPOW(tinpow,temp_mm,[esi+5*8] , 0xd62f105d);
00224 MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm0, mm1, mm2, mm3, tinpow, 5,temp_mm);
00225 INSERT_TINPOW(tinpow,temp_mm,[esi+10*8] , 0x02441453);
00226 MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm3, mm0, mm1, mm2, tinpow, 9,temp_mm);
00227 INSERT_TINPOW(tinpow,temp_mm,[esi+15*8] , 0xd8a1e681);
00228 MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm2, mm3, mm0, mm1, tinpow, 14,temp_mm);
00229 INSERT_TINPOW(tinpow,temp_mm,[esi+4*8] , 0xe7d3fbc8);
00230 MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm1, mm2, mm3, mm0, tinpow, 20,temp_mm);
00231 INSERT_TINPOW(tinpow,temp_mm,[esi+9*8] , 0x21e1cde6);
00232 MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm0, mm1, mm2, mm3, tinpow, 5,temp_mm);
00233 INSERT_TINPOW(tinpow,temp_mm,[esi+14*8] , 0xc33707d6);
00234 MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm3, mm0, mm1, mm2, tinpow, 9,temp_mm);
00235 INSERT_TINPOW(tinpow,temp_mm,[esi+3*8] , 0xf4d50d87);
00236 MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm2, mm3, mm0, mm1, tinpow, 14,temp_mm);
00237 INSERT_TINPOW(tinpow,temp_mm, [esi+8*8] , 0x455a14ed);
00238 MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm1, mm2, mm3, mm0, tinpow, 20,temp_mm);
00239 INSERT_TINPOW(tinpow,temp_mm,[esi+13*8] , 0xa9e3e905);
00240 MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm0, mm1, mm2, mm3, tinpow, 5,temp_mm);
00241 INSERT_TINPOW(tinpow,temp_mm,[esi+2*8] , 0xfcefa3f8);
00242 MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm3, mm0, mm1, mm2, tinpow, 9,temp_mm);
00243 INSERT_TINPOW(tinpow,temp_mm,[esi+7*8] , 0x676f02d9);
00244 MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm2, mm3, mm0, mm1, tinpow, 14,temp_mm);
00245 INSERT_TINPOW(tinpow,temp_mm,[esi+12*8] , 0x8d2a4c8a);
00246 MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm1, mm2, mm3, mm0, tinpow, 20,temp_mm);
00247
00248 INSERT_TINPOW(tinpow,temp_mm,[esi+5*8] , 0xfffa3942);
00249 MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm0, mm1, mm2, mm3, tinpow, 4,temp_mm);
00250 INSERT_TINPOW(tinpow,temp_mm,[esi+8*8] , 0x8771f681);
00251 MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm3, mm0, mm1, mm2, tinpow, 11,temp_mm);
00252 INSERT_TINPOW(tinpow,temp_mm,[esi+11*8] , 0x6d9d6122);
00253 MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm2, mm3, mm0, mm1, tinpow, 16,temp_mm);
00254 INSERT_TINPOW(tinpow,temp_mm,[esi+14*8] , 0xfde5380c);
00255 MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm1, mm2, mm3, mm0, tinpow, 23,temp_mm);
00256 INSERT_TINPOW(tinpow,temp_mm,[esi+1*8] , 0xa4beea44);
00257 MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm0, mm1, mm2, mm3, tinpow, 4,temp_mm);
00258 INSERT_TINPOW(tinpow,temp_mm,[esi+4*8] , 0x4bdecfa9);
00259 MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm3, mm0, mm1, mm2, tinpow, 11,temp_mm);
00260 INSERT_TINPOW(tinpow,temp_mm,[esi+7*8] , 0xf6bb4b60);
00261 MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm2, mm3, mm0, mm1, tinpow, 16,temp_mm);
00262 INSERT_TINPOW(tinpow,temp_mm,[esi+10*8] , 0xbebfbc70);
00263 MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm1, mm2, mm3, mm0, tinpow, 23,temp_mm);
00264 INSERT_TINPOW(tinpow,temp_mm,[esi+13*8] , 0x289b7ec6);
00265 MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm0, mm1, mm2, mm3, tinpow, 4,temp_mm);
00266 INSERT_TINPOW(tinpow,temp_mm,[esi+0*8] , 0xeaa127fa);
00267 MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm3, mm0, mm1, mm2, tinpow, 11,temp_mm);
00268 INSERT_TINPOW(tinpow,temp_mm,[esi+3*8] , 0xd4ef3085);
00269 MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm2, mm3, mm0, mm1, tinpow, 16,temp_mm);
00270 INSERT_TINPOW(tinpow,temp_mm,[esi+6*8] , 0x04881d05);
00271 MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm1, mm2, mm3, mm0, tinpow, 23,temp_mm);
00272 INSERT_TINPOW(tinpow,temp_mm,[esi+9*8] , 0xd9d4d039);
00273 MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm0, mm1, mm2, mm3, tinpow, 4,temp_mm);
00274 INSERT_TINPOW(tinpow,temp_mm,[esi+12*8] , 0xe6db99e5);
00275 MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm3, mm0, mm1, mm2, tinpow, 11,temp_mm);
00276 INSERT_TINPOW(tinpow,temp_mm,[esi+15*8] , 0x1fa27cf8);
00277 MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm2, mm3, mm0, mm1, tinpow, 16,temp_mm);
00278 INSERT_TINPOW(tinpow,temp_mm,[esi+2*8] , 0xc4ac5665);
00279 MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm1, mm2, mm3, mm0, tinpow, 23,temp_mm);
00280
00281 INSERT_TINPOW(tinpow,temp_mm,[esi+0*8] , 0xf4292244);
00282 MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm0, mm1, mm2, mm3, tinpow, 6,temp_mm);
00283 INSERT_TINPOW(tinpow,temp_mm,[esi+7*8] , 0x432aff97);
00284 MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm3, mm0, mm1, mm2, tinpow, 10,temp_mm);
00285 INSERT_TINPOW(tinpow,temp_mm,[esi+14*8] , 0xab9423a7);
00286 MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm2, mm3, mm0, mm1, tinpow, 15,temp_mm);
00287 INSERT_TINPOW(tinpow,temp_mm,[esi+5*8] , 0xfc93a039);
00288 MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm1, mm2, mm3, mm0, tinpow, 21,temp_mm);
00289 INSERT_TINPOW(tinpow,temp_mm,[esi+12*8] , 0x655b59c3);
00290 MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm0, mm1, mm2, mm3, tinpow, 6,temp_mm);
00291 INSERT_TINPOW(tinpow,temp_mm,[esi+3*8] , 0x8f0ccc92);
00292 MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm3, mm0, mm1, mm2, tinpow, 10,temp_mm);
00293 INSERT_TINPOW(tinpow,temp_mm,[esi+10*8] , 0xffeff47d);
00294 MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm2, mm3, mm0, mm1, tinpow, 15,temp_mm);
00295 INSERT_TINPOW(tinpow,temp_mm,[esi+1*8] , 0x85845dd1);
00296 MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm1, mm2, mm3, mm0, tinpow, 21,temp_mm);
00297 INSERT_TINPOW(tinpow,temp_mm,[esi+8*8] , 0x6fa87e4f);
00298 MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm0, mm1, mm2, mm3, tinpow, 6,temp_mm);
00299 INSERT_TINPOW(tinpow,temp_mm,[esi+15*8] , 0xfe2ce6e0);
00300 MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm3, mm0, mm1, mm2, tinpow, 10,temp_mm);
00301 INSERT_TINPOW(tinpow,temp_mm,[esi+6*8] , 0xa3014314);
00302 MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm2, mm3, mm0, mm1, tinpow, 15,temp_mm);
00303 INSERT_TINPOW(tinpow,temp_mm,[esi+13*8] , 0x4e0811a1);
00304 MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm1, mm2, mm3, mm0, tinpow, 21,temp_mm);
00305 INSERT_TINPOW(tinpow,temp_mm,[esi+4*8] , 0xf7537e82);
00306 MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm0, mm1, mm2, mm3, tinpow, 6,temp_mm);
00307 INSERT_TINPOW(tinpow,temp_mm,[esi+11*8], 0xbd3af235);
00308 MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm3, mm0, mm1, mm2, tinpow, 10,temp_mm);
00309 INSERT_TINPOW(tinpow,temp_mm,[esi+2*8], 0x2ad7d2bb);
00310 MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm2, mm3, mm0, mm1, tinpow, 15,temp_mm);
00311 INSERT_TINPOW(tinpow,temp_mm, [esi+9*8] , 0xeb86d391);
00312 MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm1, mm2, mm3, mm0, tinpow, 21,temp_mm);
00313
00314
00315 paddd mm0,a
00316 paddd mm1,b
00317 paddd mm2,c
00318 paddd mm3,d
00319 movq a,mm0
00320 movq b,mm1
00321 movq c,mm2
00322 movq d,mm3
00323
00324
00325
00326 }
00327 MD5_VC_MMX_UINT64_TO_UINT32(a,&abcd0[0],&abcd1[0]);
00328 MD5_VC_MMX_UINT64_TO_UINT32(b,&abcd0[1],&abcd1[1]);
00329 MD5_VC_MMX_UINT64_TO_UINT32(c,&abcd0[2],&abcd1[2]);
00330 MD5_VC_MMX_UINT64_TO_UINT32(d,&abcd0[3],&abcd1[3]);
00331
00332 #undef temp_mm
00333 #undef tinpow
00334 }
00335
00336 #endif