keccak-sse2.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /**
  2. * Author......: Jens Steube <jens.steube@gmail.com>
  3. * License.....: MIT
  4. */
  5. #ifndef KECCAK_ROUNDS
  6. #define KECCAK_ROUNDS 24
  7. #endif
  8. const uint64_t keccakf_rndc[24] =
  9. {
  10. 0x0000000000000001, 0x0000000000008082, 0x800000000000808a,
  11. 0x8000000080008000, 0x000000000000808b, 0x0000000080000001,
  12. 0x8000000080008081, 0x8000000000008009, 0x000000000000008a,
  13. 0x0000000000000088, 0x0000000080008009, 0x000000008000000a,
  14. 0x000000008000808b, 0x800000000000008b, 0x8000000000008089,
  15. 0x8000000000008003, 0x8000000000008002, 0x8000000000000080,
  16. 0x000000000000800a, 0x800000008000000a, 0x8000000080008081,
  17. 0x8000000000008080, 0x0000000080000001, 0x8000000080008008
  18. };
  19. const uint32_t keccakf_rotc[24] =
  20. {
  21. 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 2, 14,
  22. 27, 41, 56, 8, 25, 43, 62, 18, 39, 61, 20, 44
  23. };
  24. const uint32_t keccakf_piln[24] =
  25. {
  26. 10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24, 4,
  27. 15, 23, 19, 13, 12, 2, 20, 14, 22, 9, 6, 1
  28. };
  29. #define Theta1_sse(s) (digests[0 + s] ^ digests[5 + s] ^ digests[10 + s] ^ digests[15 + s] ^ digests[20 + s])
  30. #define Theta2_sse(s) \
  31. { \
  32. digests[ 0 + s] ^= t; \
  33. digests[ 5 + s] ^= t; \
  34. digests[10 + s] ^= t; \
  35. digests[15 + s] ^= t; \
  36. digests[20 + s] ^= t; \
  37. }
  38. #define Chi_sse(s) \
  39. { \
  40. bc0 = digests[0 + s]; \
  41. bc1 = digests[1 + s]; \
  42. bc2 = digests[2 + s]; \
  43. bc3 = digests[3 + s]; \
  44. bc4 = digests[4 + s]; \
  45. digests[0 + s] ^= _mm_andnot_si128 (bc1, bc2); \
  46. digests[1 + s] ^= _mm_andnot_si128 (bc2, bc3); \
  47. digests[2 + s] ^= _mm_andnot_si128 (bc3, bc4); \
  48. digests[3 + s] ^= _mm_andnot_si128 (bc4, bc0); \
  49. digests[4 + s] ^= _mm_andnot_si128 (bc0, bc1); \
  50. }
  51. #define Rho_Pi_sse(s) \
  52. { \
  53. uint32_t j = keccakf_piln[s]; \
  54. uint32_t k = keccakf_rotc[s]; \
  55. bc0 = digests[j]; \
  56. digests[j] = ROTL64_SSE (t, k); \
  57. t = bc0; \
  58. }
  59. void hashcat_keccak_64 (__m128i digests[25])
  60. {
  61. int round;
  62. for (round = 0; round < KECCAK_ROUNDS; round++)
  63. {
  64. // Theta
  65. __m128i bc0 = Theta1_sse (0);
  66. __m128i bc1 = Theta1_sse (1);
  67. __m128i bc2 = Theta1_sse (2);
  68. __m128i bc3 = Theta1_sse (3);
  69. __m128i bc4 = Theta1_sse (4);
  70. __m128i t;
  71. t = ROTL64_SSE (bc1, 1); t ^= bc4; Theta2_sse (0);
  72. t = ROTL64_SSE (bc2, 1); t ^= bc0; Theta2_sse (1);
  73. t = ROTL64_SSE (bc3, 1); t ^= bc1; Theta2_sse (2);
  74. t = ROTL64_SSE (bc4, 1); t ^= bc2; Theta2_sse (3);
  75. t = ROTL64_SSE (bc0, 1); t ^= bc3; Theta2_sse (4);
  76. // Rho Pi
  77. t = digests[1];
  78. Rho_Pi_sse (0);
  79. Rho_Pi_sse (1);
  80. Rho_Pi_sse (2);
  81. Rho_Pi_sse (3);
  82. Rho_Pi_sse (4);
  83. Rho_Pi_sse (5);
  84. Rho_Pi_sse (6);
  85. Rho_Pi_sse (7);
  86. Rho_Pi_sse (8);
  87. Rho_Pi_sse (9);
  88. Rho_Pi_sse (10);
  89. Rho_Pi_sse (11);
  90. Rho_Pi_sse (12);
  91. Rho_Pi_sse (13);
  92. Rho_Pi_sse (14);
  93. Rho_Pi_sse (15);
  94. Rho_Pi_sse (16);
  95. Rho_Pi_sse (17);
  96. Rho_Pi_sse (18);
  97. Rho_Pi_sse (19);
  98. Rho_Pi_sse (20);
  99. Rho_Pi_sse (21);
  100. Rho_Pi_sse (22);
  101. Rho_Pi_sse (23);
  102. // Chi
  103. Chi_sse (0);
  104. Chi_sse (5);
  105. Chi_sse (10);
  106. Chi_sse (15);
  107. Chi_sse (20);
  108. // Iota
  109. digests[0] ^= _mm_set1_epi64 ((__m64) keccakf_rndc[round]);
  110. }
  111. }