sha256-sse2.c 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /**
  2. * Author......: Jens Steube <jens.steube@gmail.com>
  3. * License.....: MIT
  4. */
  5. #define SHA256_S0_SSE(x) (_mm_xor_si128(ROTL32_SSE ((x), 25), _mm_xor_si128(ROTL32_SSE ((x), 14),SHR32_SSE ((x), 3))))
  6. #define SHA256_S1_SSE(x) (_mm_xor_si128(ROTL32_SSE ((x), 15), _mm_xor_si128(ROTL32_SSE ((x), 13),SHR32_SSE ((x), 10))))
  7. #define SHA256_S2_SSE(x) (_mm_xor_si128(ROTL32_SSE ((x), 30), _mm_xor_si128(ROTL32_SSE ((x), 19),ROTL32_SSE ((x), 10))))
  8. #define SHA256_S3_SSE(x) (_mm_xor_si128(ROTL32_SSE ((x), 26), _mm_xor_si128(ROTL32_SSE ((x), 21),ROTL32_SSE ((x), 7))))
  9. #ifdef __XOP__
  10. #define SHA256_F0_SSE(x,y,z) _mm_cmov_si128 (x, z, _mm_xor_si128 (y, z))
  11. #else
  12. #define SHA256_F0_SSE(x,y,z) _mm_or_si128 (_mm_and_si128 (z, _mm_or_si128 (x, y)), _mm_and_si128 (x, y))
  13. #endif
  14. #ifdef __XOP__
  15. #define SHA256_F1_SSE(x,y,z) _mm_cmov_si128 (y, z, x)
  16. #else
  17. #define SHA256_F1_SSE(x,y,z) _mm_xor_si128 (z, _mm_and_si128 (x, _mm_xor_si128 (y, z)))
  18. #endif
  19. #define SHA256_STEP_SSE(F0,F1,a,b,c,d,e,f,g,h,x,K) \
  20. { \
  21. h = _mm_add_epi32 (h, _mm_set1_epi32 (K)); \
  22. h = _mm_add_epi32 (h, W[x & 0xf]); \
  23. h = _mm_add_epi32 (h, SHA256_S3_SSE (e)); \
  24. h = _mm_add_epi32 (h, F1 (e,f,g)); \
  25. d = _mm_add_epi32 (d, h); \
  26. h = _mm_add_epi32 (h, SHA256_S2_SSE (a)); \
  27. h = _mm_add_epi32 (h, F0 (a,b,c)); \
  28. }
  29. #define SHA256_EXPAND_SSE(i) \
  30. { \
  31. __m128i t0; \
  32. __m128i t1; \
  33. t0 = SHA256_S1_SSE (W[(i - 2) & 0xf]); \
  34. t0 = _mm_add_epi32 (t0, W[(i - 7) & 0xf]); \
  35. t1 = SHA256_S0_SSE (W[(i - 15) & 0xf]); \
  36. t0 = _mm_add_epi32 (t0, t1); \
  37. t0 = _mm_add_epi32 (t0, W[(i - 16) & 0xf]); \
  38. W[(i) & 0xf] = t0; \
  39. }
  40. void hashcat_sha256_64 (__m128i digests[8], __m128i W[16])
  41. {
  42. __m128i a = digests[0];
  43. __m128i b = digests[1];
  44. __m128i c = digests[2];
  45. __m128i d = digests[3];
  46. __m128i e = digests[4];
  47. __m128i f = digests[5];
  48. __m128i g = digests[6];
  49. __m128i h = digests[7];
  50. int i;
  51. for (i = 0; i < 16; i++) W[i] = SWAP32_SSE (W[i]);
  52. SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, a, b, c, d, e, f, g, h, 0, SHA256C00);
  53. SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, h, a, b, c, d, e, f, g, 1, SHA256C01);
  54. SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, g, h, a, b, c, d, e, f, 2, SHA256C02);
  55. SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, f, g, h, a, b, c, d, e, 3, SHA256C03);
  56. SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, e, f, g, h, a, b, c, d, 4, SHA256C04);
  57. SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, d, e, f, g, h, a, b, c, 5, SHA256C05);
  58. SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, c, d, e, f, g, h, a, b, 6, SHA256C06);
  59. SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, b, c, d, e, f, g, h, a, 7, SHA256C07);
  60. SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, a, b, c, d, e, f, g, h, 8, SHA256C08);
  61. SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, h, a, b, c, d, e, f, g, 9, SHA256C09);
  62. SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, g, h, a, b, c, d, e, f, 10, SHA256C0a);
  63. SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, f, g, h, a, b, c, d, e, 11, SHA256C0b);
  64. SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, e, f, g, h, a, b, c, d, 12, SHA256C0c);
  65. SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, d, e, f, g, h, a, b, c, 13, SHA256C0d);
  66. SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, c, d, e, f, g, h, a, b, 14, SHA256C0e);
  67. SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, b, c, d, e, f, g, h, a, 15, SHA256C0f);
  68. SHA256_EXPAND_SSE (16); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, a, b, c, d, e, f, g, h, 16, SHA256C10);
  69. SHA256_EXPAND_SSE (17); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, h, a, b, c, d, e, f, g, 17, SHA256C11);
  70. SHA256_EXPAND_SSE (18); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, g, h, a, b, c, d, e, f, 18, SHA256C12);
  71. SHA256_EXPAND_SSE (19); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, f, g, h, a, b, c, d, e, 19, SHA256C13);
  72. SHA256_EXPAND_SSE (20); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, e, f, g, h, a, b, c, d, 20, SHA256C14);
  73. SHA256_EXPAND_SSE (21); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, d, e, f, g, h, a, b, c, 21, SHA256C15);
  74. SHA256_EXPAND_SSE (22); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, c, d, e, f, g, h, a, b, 22, SHA256C16);
  75. SHA256_EXPAND_SSE (23); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, b, c, d, e, f, g, h, a, 23, SHA256C17);
  76. SHA256_EXPAND_SSE (24); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, a, b, c, d, e, f, g, h, 24, SHA256C18);
  77. SHA256_EXPAND_SSE (25); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, h, a, b, c, d, e, f, g, 25, SHA256C19);
  78. SHA256_EXPAND_SSE (26); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, g, h, a, b, c, d, e, f, 26, SHA256C1a);
  79. SHA256_EXPAND_SSE (27); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, f, g, h, a, b, c, d, e, 27, SHA256C1b);
  80. SHA256_EXPAND_SSE (28); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, e, f, g, h, a, b, c, d, 28, SHA256C1c);
  81. SHA256_EXPAND_SSE (29); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, d, e, f, g, h, a, b, c, 29, SHA256C1d);
  82. SHA256_EXPAND_SSE (30); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, c, d, e, f, g, h, a, b, 30, SHA256C1e);
  83. SHA256_EXPAND_SSE (31); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, b, c, d, e, f, g, h, a, 31, SHA256C1f);
  84. SHA256_EXPAND_SSE (32); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, a, b, c, d, e, f, g, h, 32, SHA256C20);
  85. SHA256_EXPAND_SSE (33); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, h, a, b, c, d, e, f, g, 33, SHA256C21);
  86. SHA256_EXPAND_SSE (34); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, g, h, a, b, c, d, e, f, 34, SHA256C22);
  87. SHA256_EXPAND_SSE (35); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, f, g, h, a, b, c, d, e, 35, SHA256C23);
  88. SHA256_EXPAND_SSE (36); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, e, f, g, h, a, b, c, d, 36, SHA256C24);
  89. SHA256_EXPAND_SSE (37); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, d, e, f, g, h, a, b, c, 37, SHA256C25);
  90. SHA256_EXPAND_SSE (38); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, c, d, e, f, g, h, a, b, 38, SHA256C26);
  91. SHA256_EXPAND_SSE (39); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, b, c, d, e, f, g, h, a, 39, SHA256C27);
  92. SHA256_EXPAND_SSE (40); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, a, b, c, d, e, f, g, h, 40, SHA256C28);
  93. SHA256_EXPAND_SSE (41); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, h, a, b, c, d, e, f, g, 41, SHA256C29);
  94. SHA256_EXPAND_SSE (42); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, g, h, a, b, c, d, e, f, 42, SHA256C2a);
  95. SHA256_EXPAND_SSE (43); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, f, g, h, a, b, c, d, e, 43, SHA256C2b);
  96. SHA256_EXPAND_SSE (44); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, e, f, g, h, a, b, c, d, 44, SHA256C2c);
  97. SHA256_EXPAND_SSE (45); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, d, e, f, g, h, a, b, c, 45, SHA256C2d);
  98. SHA256_EXPAND_SSE (46); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, c, d, e, f, g, h, a, b, 46, SHA256C2e);
  99. SHA256_EXPAND_SSE (47); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, b, c, d, e, f, g, h, a, 47, SHA256C2f);
  100. SHA256_EXPAND_SSE (48); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, a, b, c, d, e, f, g, h, 48, SHA256C30);
  101. SHA256_EXPAND_SSE (49); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, h, a, b, c, d, e, f, g, 49, SHA256C31);
  102. SHA256_EXPAND_SSE (50); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, g, h, a, b, c, d, e, f, 50, SHA256C32);
  103. SHA256_EXPAND_SSE (51); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, f, g, h, a, b, c, d, e, 51, SHA256C33);
  104. SHA256_EXPAND_SSE (52); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, e, f, g, h, a, b, c, d, 52, SHA256C34);
  105. SHA256_EXPAND_SSE (53); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, d, e, f, g, h, a, b, c, 53, SHA256C35);
  106. SHA256_EXPAND_SSE (54); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, c, d, e, f, g, h, a, b, 54, SHA256C36);
  107. SHA256_EXPAND_SSE (55); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, b, c, d, e, f, g, h, a, 55, SHA256C37);
  108. SHA256_EXPAND_SSE (56); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, a, b, c, d, e, f, g, h, 56, SHA256C38);
  109. SHA256_EXPAND_SSE (57); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, h, a, b, c, d, e, f, g, 57, SHA256C39);
  110. SHA256_EXPAND_SSE (58); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, g, h, a, b, c, d, e, f, 58, SHA256C3a);
  111. SHA256_EXPAND_SSE (59); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, f, g, h, a, b, c, d, e, 59, SHA256C3b);
  112. SHA256_EXPAND_SSE (60); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, e, f, g, h, a, b, c, d, 60, SHA256C3c);
  113. SHA256_EXPAND_SSE (61); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, d, e, f, g, h, a, b, c, 61, SHA256C3d);
  114. SHA256_EXPAND_SSE (62); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, c, d, e, f, g, h, a, b, 62, SHA256C3e);
  115. SHA256_EXPAND_SSE (63); SHA256_STEP_SSE (SHA256_F0_SSE, SHA256_F1_SSE, b, c, d, e, f, g, h, a, 63, SHA256C3f);
  116. digests[0] = _mm_add_epi32 (a, digests[0]);
  117. digests[1] = _mm_add_epi32 (b, digests[1]);
  118. digests[2] = _mm_add_epi32 (c, digests[2]);
  119. digests[3] = _mm_add_epi32 (d, digests[3]);
  120. digests[4] = _mm_add_epi32 (e, digests[4]);
  121. digests[5] = _mm_add_epi32 (f, digests[5]);
  122. digests[6] = _mm_add_epi32 (g, digests[6]);
  123. digests[7] = _mm_add_epi32 (h, digests[7]);
  124. }