md5-sse2.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /**
  2. * Author......: Jens Steube <jens.steube@gmail.com>
  3. * License.....: MIT
  4. */
  5. #ifdef __XOP__
  6. #define MD5_F(x,y,z) _mm_cmov_si128 (y, z, x)
  7. #else
  8. #define MD5_F(x,y,z) _mm_xor_si128 (z, _mm_and_si128 (x, _mm_xor_si128 (y, z)))
  9. #endif
  10. #ifdef __XOP__
  11. #define MD5_G(x,y,z) _mm_cmov_si128 (x, y, z)
  12. #else
  13. #define MD5_G(x,y,z) _mm_xor_si128 (y, _mm_and_si128 (z, _mm_xor_si128 (x, y)))
  14. #endif
  15. #define MD5_H1(x,y,z) ((tmp2 = ((x) ^ (y))) ^ (z))
  16. #define MD5_H2(x,y,z) ((x) ^ tmp2)
  17. #define MD5_I(x,y,z) _mm_xor_si128 (y, _mm_or_si128 (x, ~z))
  18. #define MD5_STEP(f,a,b,c,d,x,K,s) \
  19. { \
  20. a = _mm_add_epi32 (a, _mm_set1_epi32 (K)); \
  21. a = _mm_add_epi32 (a, x); \
  22. a = _mm_add_epi32 (a, f (b, c, d)); \
  23. a = ROTL32_SSE (a, s); \
  24. a = _mm_add_epi32 (a, b); \
  25. }
  26. void hashcat_md5_64 (__m128i digests[4], __m128i W[16])
  27. {
  28. __m128i a = digests[0];
  29. __m128i b = digests[1];
  30. __m128i c = digests[2];
  31. __m128i d = digests[3];
  32. __m128i tmp2;
  33. MD5_STEP (MD5_F , a, b, c, d, W[ 0], MD5C00, MD5S00);
  34. MD5_STEP (MD5_F , d, a, b, c, W[ 1], MD5C01, MD5S01);
  35. MD5_STEP (MD5_F , c, d, a, b, W[ 2], MD5C02, MD5S02);
  36. MD5_STEP (MD5_F , b, c, d, a, W[ 3], MD5C03, MD5S03);
  37. MD5_STEP (MD5_F , a, b, c, d, W[ 4], MD5C04, MD5S00);
  38. MD5_STEP (MD5_F , d, a, b, c, W[ 5], MD5C05, MD5S01);
  39. MD5_STEP (MD5_F , c, d, a, b, W[ 6], MD5C06, MD5S02);
  40. MD5_STEP (MD5_F , b, c, d, a, W[ 7], MD5C07, MD5S03);
  41. MD5_STEP (MD5_F , a, b, c, d, W[ 8], MD5C08, MD5S00);
  42. MD5_STEP (MD5_F , d, a, b, c, W[ 9], MD5C09, MD5S01);
  43. MD5_STEP (MD5_F , c, d, a, b, W[10], MD5C0a, MD5S02);
  44. MD5_STEP (MD5_F , b, c, d, a, W[11], MD5C0b, MD5S03);
  45. MD5_STEP (MD5_F , a, b, c, d, W[12], MD5C0c, MD5S00);
  46. MD5_STEP (MD5_F , d, a, b, c, W[13], MD5C0d, MD5S01);
  47. MD5_STEP (MD5_F , c, d, a, b, W[14], MD5C0e, MD5S02);
  48. MD5_STEP (MD5_F , b, c, d, a, W[15], MD5C0f, MD5S03);
  49. MD5_STEP (MD5_G , a, b, c, d, W[ 1], MD5C10, MD5S10);
  50. MD5_STEP (MD5_G , d, a, b, c, W[ 6], MD5C11, MD5S11);
  51. MD5_STEP (MD5_G , c, d, a, b, W[11], MD5C12, MD5S12);
  52. MD5_STEP (MD5_G , b, c, d, a, W[ 0], MD5C13, MD5S13);
  53. MD5_STEP (MD5_G , a, b, c, d, W[ 5], MD5C14, MD5S10);
  54. MD5_STEP (MD5_G , d, a, b, c, W[10], MD5C15, MD5S11);
  55. MD5_STEP (MD5_G , c, d, a, b, W[15], MD5C16, MD5S12);
  56. MD5_STEP (MD5_G , b, c, d, a, W[ 4], MD5C17, MD5S13);
  57. MD5_STEP (MD5_G , a, b, c, d, W[ 9], MD5C18, MD5S10);
  58. MD5_STEP (MD5_G , d, a, b, c, W[14], MD5C19, MD5S11);
  59. MD5_STEP (MD5_G , c, d, a, b, W[ 3], MD5C1a, MD5S12);
  60. MD5_STEP (MD5_G , b, c, d, a, W[ 8], MD5C1b, MD5S13);
  61. MD5_STEP (MD5_G , a, b, c, d, W[13], MD5C1c, MD5S10);
  62. MD5_STEP (MD5_G , d, a, b, c, W[ 2], MD5C1d, MD5S11);
  63. MD5_STEP (MD5_G , c, d, a, b, W[ 7], MD5C1e, MD5S12);
  64. MD5_STEP (MD5_G , b, c, d, a, W[12], MD5C1f, MD5S13);
  65. MD5_STEP (MD5_H1, a, b, c, d, W[ 5], MD5C20, MD5S20);
  66. MD5_STEP (MD5_H2, d, a, b, c, W[ 8], MD5C21, MD5S21);
  67. MD5_STEP (MD5_H1, c, d, a, b, W[11], MD5C22, MD5S22);
  68. MD5_STEP (MD5_H2, b, c, d, a, W[14], MD5C23, MD5S23);
  69. MD5_STEP (MD5_H1, a, b, c, d, W[ 1], MD5C24, MD5S20);
  70. MD5_STEP (MD5_H2, d, a, b, c, W[ 4], MD5C25, MD5S21);
  71. MD5_STEP (MD5_H1, c, d, a, b, W[ 7], MD5C26, MD5S22);
  72. MD5_STEP (MD5_H2, b, c, d, a, W[10], MD5C27, MD5S23);
  73. MD5_STEP (MD5_H1, a, b, c, d, W[13], MD5C28, MD5S20);
  74. MD5_STEP (MD5_H2, d, a, b, c, W[ 0], MD5C29, MD5S21);
  75. MD5_STEP (MD5_H1, c, d, a, b, W[ 3], MD5C2a, MD5S22);
  76. MD5_STEP (MD5_H2, b, c, d, a, W[ 6], MD5C2b, MD5S23);
  77. MD5_STEP (MD5_H1, a, b, c, d, W[ 9], MD5C2c, MD5S20);
  78. MD5_STEP (MD5_H2, d, a, b, c, W[12], MD5C2d, MD5S21);
  79. MD5_STEP (MD5_H1, c, d, a, b, W[15], MD5C2e, MD5S22);
  80. MD5_STEP (MD5_H2, b, c, d, a, W[ 2], MD5C2f, MD5S23);
  81. MD5_STEP (MD5_I , a, b, c, d, W[ 0], MD5C30, MD5S30);
  82. MD5_STEP (MD5_I , d, a, b, c, W[ 7], MD5C31, MD5S31);
  83. MD5_STEP (MD5_I , c, d, a, b, W[14], MD5C32, MD5S32);
  84. MD5_STEP (MD5_I , b, c, d, a, W[ 5], MD5C33, MD5S33);
  85. MD5_STEP (MD5_I , a, b, c, d, W[12], MD5C34, MD5S30);
  86. MD5_STEP (MD5_I , d, a, b, c, W[ 3], MD5C35, MD5S31);
  87. MD5_STEP (MD5_I , c, d, a, b, W[10], MD5C36, MD5S32);
  88. MD5_STEP (MD5_I , b, c, d, a, W[ 1], MD5C37, MD5S33);
  89. MD5_STEP (MD5_I , a, b, c, d, W[ 8], MD5C38, MD5S30);
  90. MD5_STEP (MD5_I , d, a, b, c, W[15], MD5C39, MD5S31);
  91. MD5_STEP (MD5_I , c, d, a, b, W[ 6], MD5C3a, MD5S32);
  92. MD5_STEP (MD5_I , b, c, d, a, W[13], MD5C3b, MD5S33);
  93. MD5_STEP (MD5_I , a, b, c, d, W[ 4], MD5C3c, MD5S30);
  94. MD5_STEP (MD5_I , d, a, b, c, W[11], MD5C3d, MD5S31);
  95. MD5_STEP (MD5_I , c, d, a, b, W[ 2], MD5C3e, MD5S32);
  96. MD5_STEP (MD5_I , b, c, d, a, W[ 9], MD5C3f, MD5S33);
  97. digests[0] = _mm_add_epi32 (a, digests[0]);
  98. digests[1] = _mm_add_epi32 (b, digests[1]);
  99. digests[2] = _mm_add_epi32 (c, digests[2]);
  100. digests[3] = _mm_add_epi32 (d, digests[3]);
  101. }