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