1*f6dc9357SAndroid Build Coastguard Worker /* Sha512.c -- SHA-512 Hash
2*f6dc9357SAndroid Build Coastguard Worker : Igor Pavlov : Public domain
3*f6dc9357SAndroid Build Coastguard Worker This code is based on public domain code from Wei Dai's Crypto++ library. */
4*f6dc9357SAndroid Build Coastguard Worker
5*f6dc9357SAndroid Build Coastguard Worker #include "Precomp.h"
6*f6dc9357SAndroid Build Coastguard Worker
7*f6dc9357SAndroid Build Coastguard Worker #include <string.h>
8*f6dc9357SAndroid Build Coastguard Worker
9*f6dc9357SAndroid Build Coastguard Worker #include "Sha512.h"
10*f6dc9357SAndroid Build Coastguard Worker #include "RotateDefs.h"
11*f6dc9357SAndroid Build Coastguard Worker #include "CpuArch.h"
12*f6dc9357SAndroid Build Coastguard Worker
13*f6dc9357SAndroid Build Coastguard Worker #ifdef MY_CPU_X86_OR_AMD64
14*f6dc9357SAndroid Build Coastguard Worker #if defined(Z7_LLVM_CLANG_VERSION) && (Z7_LLVM_CLANG_VERSION >= 170001) \
15*f6dc9357SAndroid Build Coastguard Worker || defined(Z7_APPLE_CLANG_VERSION) && (Z7_APPLE_CLANG_VERSION >= 170001) \
16*f6dc9357SAndroid Build Coastguard Worker || defined(Z7_GCC_VERSION) && (Z7_GCC_VERSION >= 140000) \
17*f6dc9357SAndroid Build Coastguard Worker || defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 2400) && (__INTEL_COMPILER <= 9900) \
18*f6dc9357SAndroid Build Coastguard Worker || defined(_MSC_VER) && (_MSC_VER >= 1940)
19*f6dc9357SAndroid Build Coastguard Worker #define Z7_COMPILER_SHA512_SUPPORTED
20*f6dc9357SAndroid Build Coastguard Worker #endif
21*f6dc9357SAndroid Build Coastguard Worker #elif defined(MY_CPU_ARM64) && defined(MY_CPU_LE)
22*f6dc9357SAndroid Build Coastguard Worker #if defined(__ARM_FEATURE_SHA512)
23*f6dc9357SAndroid Build Coastguard Worker #define Z7_COMPILER_SHA512_SUPPORTED
24*f6dc9357SAndroid Build Coastguard Worker #else
25*f6dc9357SAndroid Build Coastguard Worker #if (defined(Z7_CLANG_VERSION) && (Z7_CLANG_VERSION >= 130000) \
26*f6dc9357SAndroid Build Coastguard Worker || defined(__GNUC__) && (__GNUC__ >= 9) \
27*f6dc9357SAndroid Build Coastguard Worker ) \
28*f6dc9357SAndroid Build Coastguard Worker || defined(Z7_MSC_VER_ORIGINAL) && (_MSC_VER >= 1940) // fix it
29*f6dc9357SAndroid Build Coastguard Worker #define Z7_COMPILER_SHA512_SUPPORTED
30*f6dc9357SAndroid Build Coastguard Worker #endif
31*f6dc9357SAndroid Build Coastguard Worker #endif
32*f6dc9357SAndroid Build Coastguard Worker #endif
33*f6dc9357SAndroid Build Coastguard Worker
34*f6dc9357SAndroid Build Coastguard Worker
35*f6dc9357SAndroid Build Coastguard Worker
36*f6dc9357SAndroid Build Coastguard Worker
37*f6dc9357SAndroid Build Coastguard Worker
38*f6dc9357SAndroid Build Coastguard Worker
39*f6dc9357SAndroid Build Coastguard Worker
40*f6dc9357SAndroid Build Coastguard Worker
41*f6dc9357SAndroid Build Coastguard Worker
42*f6dc9357SAndroid Build Coastguard Worker
43*f6dc9357SAndroid Build Coastguard Worker
44*f6dc9357SAndroid Build Coastguard Worker
45*f6dc9357SAndroid Build Coastguard Worker
46*f6dc9357SAndroid Build Coastguard Worker
47*f6dc9357SAndroid Build Coastguard Worker void Z7_FASTCALL Sha512_UpdateBlocks(UInt64 state[8], const Byte *data, size_t numBlocks);
48*f6dc9357SAndroid Build Coastguard Worker
49*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_COMPILER_SHA512_SUPPORTED
50*f6dc9357SAndroid Build Coastguard Worker void Z7_FASTCALL Sha512_UpdateBlocks_HW(UInt64 state[8], const Byte *data, size_t numBlocks);
51*f6dc9357SAndroid Build Coastguard Worker
52*f6dc9357SAndroid Build Coastguard Worker static SHA512_FUNC_UPDATE_BLOCKS g_SHA512_FUNC_UPDATE_BLOCKS = Sha512_UpdateBlocks;
53*f6dc9357SAndroid Build Coastguard Worker static SHA512_FUNC_UPDATE_BLOCKS g_SHA512_FUNC_UPDATE_BLOCKS_HW;
54*f6dc9357SAndroid Build Coastguard Worker
55*f6dc9357SAndroid Build Coastguard Worker #define SHA512_UPDATE_BLOCKS(p) p->v.vars.func_UpdateBlocks
56*f6dc9357SAndroid Build Coastguard Worker #else
57*f6dc9357SAndroid Build Coastguard Worker #define SHA512_UPDATE_BLOCKS(p) Sha512_UpdateBlocks
58*f6dc9357SAndroid Build Coastguard Worker #endif
59*f6dc9357SAndroid Build Coastguard Worker
60*f6dc9357SAndroid Build Coastguard Worker
Sha512_SetFunction(CSha512 * p,unsigned algo)61*f6dc9357SAndroid Build Coastguard Worker BoolInt Sha512_SetFunction(CSha512 *p, unsigned algo)
62*f6dc9357SAndroid Build Coastguard Worker {
63*f6dc9357SAndroid Build Coastguard Worker SHA512_FUNC_UPDATE_BLOCKS func = Sha512_UpdateBlocks;
64*f6dc9357SAndroid Build Coastguard Worker
65*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_COMPILER_SHA512_SUPPORTED
66*f6dc9357SAndroid Build Coastguard Worker if (algo != SHA512_ALGO_SW)
67*f6dc9357SAndroid Build Coastguard Worker {
68*f6dc9357SAndroid Build Coastguard Worker if (algo == SHA512_ALGO_DEFAULT)
69*f6dc9357SAndroid Build Coastguard Worker func = g_SHA512_FUNC_UPDATE_BLOCKS;
70*f6dc9357SAndroid Build Coastguard Worker else
71*f6dc9357SAndroid Build Coastguard Worker {
72*f6dc9357SAndroid Build Coastguard Worker if (algo != SHA512_ALGO_HW)
73*f6dc9357SAndroid Build Coastguard Worker return False;
74*f6dc9357SAndroid Build Coastguard Worker func = g_SHA512_FUNC_UPDATE_BLOCKS_HW;
75*f6dc9357SAndroid Build Coastguard Worker if (!func)
76*f6dc9357SAndroid Build Coastguard Worker return False;
77*f6dc9357SAndroid Build Coastguard Worker }
78*f6dc9357SAndroid Build Coastguard Worker }
79*f6dc9357SAndroid Build Coastguard Worker #else
80*f6dc9357SAndroid Build Coastguard Worker if (algo > 1)
81*f6dc9357SAndroid Build Coastguard Worker return False;
82*f6dc9357SAndroid Build Coastguard Worker #endif
83*f6dc9357SAndroid Build Coastguard Worker
84*f6dc9357SAndroid Build Coastguard Worker p->v.vars.func_UpdateBlocks = func;
85*f6dc9357SAndroid Build Coastguard Worker return True;
86*f6dc9357SAndroid Build Coastguard Worker }
87*f6dc9357SAndroid Build Coastguard Worker
88*f6dc9357SAndroid Build Coastguard Worker
89*f6dc9357SAndroid Build Coastguard Worker /* define it for speed optimization */
90*f6dc9357SAndroid Build Coastguard Worker
91*f6dc9357SAndroid Build Coastguard Worker #if 0 // 1 for size optimization
92*f6dc9357SAndroid Build Coastguard Worker #define STEP_PRE 1
93*f6dc9357SAndroid Build Coastguard Worker #define STEP_MAIN 1
94*f6dc9357SAndroid Build Coastguard Worker #else
95*f6dc9357SAndroid Build Coastguard Worker #define STEP_PRE 2
96*f6dc9357SAndroid Build Coastguard Worker #define STEP_MAIN 4
97*f6dc9357SAndroid Build Coastguard Worker // #define Z7_SHA512_UNROLL
98*f6dc9357SAndroid Build Coastguard Worker #endif
99*f6dc9357SAndroid Build Coastguard Worker
100*f6dc9357SAndroid Build Coastguard Worker #undef Z7_SHA512_BIG_W
101*f6dc9357SAndroid Build Coastguard Worker #if STEP_MAIN != 16
102*f6dc9357SAndroid Build Coastguard Worker #define Z7_SHA512_BIG_W
103*f6dc9357SAndroid Build Coastguard Worker #endif
104*f6dc9357SAndroid Build Coastguard Worker
105*f6dc9357SAndroid Build Coastguard Worker
106*f6dc9357SAndroid Build Coastguard Worker #define U64C(x) UINT64_CONST(x)
107*f6dc9357SAndroid Build Coastguard Worker
108*f6dc9357SAndroid Build Coastguard Worker static MY_ALIGN(64) const UInt64 SHA512_INIT_ARRAYS[4][8] = {
109*f6dc9357SAndroid Build Coastguard Worker { U64C(0x8c3d37c819544da2), U64C(0x73e1996689dcd4d6), U64C(0x1dfab7ae32ff9c82), U64C(0x679dd514582f9fcf),
110*f6dc9357SAndroid Build Coastguard Worker U64C(0x0f6d2b697bd44da8), U64C(0x77e36f7304c48942), U64C(0x3f9d85a86a1d36c8), U64C(0x1112e6ad91d692a1)
111*f6dc9357SAndroid Build Coastguard Worker },
112*f6dc9357SAndroid Build Coastguard Worker { U64C(0x22312194fc2bf72c), U64C(0x9f555fa3c84c64c2), U64C(0x2393b86b6f53b151), U64C(0x963877195940eabd),
113*f6dc9357SAndroid Build Coastguard Worker U64C(0x96283ee2a88effe3), U64C(0xbe5e1e2553863992), U64C(0x2b0199fc2c85b8aa), U64C(0x0eb72ddc81c52ca2)
114*f6dc9357SAndroid Build Coastguard Worker },
115*f6dc9357SAndroid Build Coastguard Worker { U64C(0xcbbb9d5dc1059ed8), U64C(0x629a292a367cd507), U64C(0x9159015a3070dd17), U64C(0x152fecd8f70e5939),
116*f6dc9357SAndroid Build Coastguard Worker U64C(0x67332667ffc00b31), U64C(0x8eb44a8768581511), U64C(0xdb0c2e0d64f98fa7), U64C(0x47b5481dbefa4fa4)
117*f6dc9357SAndroid Build Coastguard Worker },
118*f6dc9357SAndroid Build Coastguard Worker { U64C(0x6a09e667f3bcc908), U64C(0xbb67ae8584caa73b), U64C(0x3c6ef372fe94f82b), U64C(0xa54ff53a5f1d36f1),
119*f6dc9357SAndroid Build Coastguard Worker U64C(0x510e527fade682d1), U64C(0x9b05688c2b3e6c1f), U64C(0x1f83d9abfb41bd6b), U64C(0x5be0cd19137e2179)
120*f6dc9357SAndroid Build Coastguard Worker }};
121*f6dc9357SAndroid Build Coastguard Worker
Sha512_InitState(CSha512 * p,unsigned digestSize)122*f6dc9357SAndroid Build Coastguard Worker void Sha512_InitState(CSha512 *p, unsigned digestSize)
123*f6dc9357SAndroid Build Coastguard Worker {
124*f6dc9357SAndroid Build Coastguard Worker p->v.vars.count = 0;
125*f6dc9357SAndroid Build Coastguard Worker memcpy(p->state, SHA512_INIT_ARRAYS[(size_t)(digestSize >> 4) - 1], sizeof(p->state));
126*f6dc9357SAndroid Build Coastguard Worker }
127*f6dc9357SAndroid Build Coastguard Worker
Sha512_Init(CSha512 * p,unsigned digestSize)128*f6dc9357SAndroid Build Coastguard Worker void Sha512_Init(CSha512 *p, unsigned digestSize)
129*f6dc9357SAndroid Build Coastguard Worker {
130*f6dc9357SAndroid Build Coastguard Worker p->v.vars.func_UpdateBlocks =
131*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_COMPILER_SHA512_SUPPORTED
132*f6dc9357SAndroid Build Coastguard Worker g_SHA512_FUNC_UPDATE_BLOCKS;
133*f6dc9357SAndroid Build Coastguard Worker #else
134*f6dc9357SAndroid Build Coastguard Worker NULL;
135*f6dc9357SAndroid Build Coastguard Worker #endif
136*f6dc9357SAndroid Build Coastguard Worker Sha512_InitState(p, digestSize);
137*f6dc9357SAndroid Build Coastguard Worker }
138*f6dc9357SAndroid Build Coastguard Worker
139*f6dc9357SAndroid Build Coastguard Worker #define S0(x) (Z7_ROTR64(x,28) ^ Z7_ROTR64(x,34) ^ Z7_ROTR64(x,39))
140*f6dc9357SAndroid Build Coastguard Worker #define S1(x) (Z7_ROTR64(x,14) ^ Z7_ROTR64(x,18) ^ Z7_ROTR64(x,41))
141*f6dc9357SAndroid Build Coastguard Worker #define s0(x) (Z7_ROTR64(x, 1) ^ Z7_ROTR64(x, 8) ^ (x >> 7))
142*f6dc9357SAndroid Build Coastguard Worker #define s1(x) (Z7_ROTR64(x,19) ^ Z7_ROTR64(x,61) ^ (x >> 6))
143*f6dc9357SAndroid Build Coastguard Worker
144*f6dc9357SAndroid Build Coastguard Worker #define Ch(x,y,z) (z^(x&(y^z)))
145*f6dc9357SAndroid Build Coastguard Worker #define Maj(x,y,z) ((x&y)|(z&(x|y)))
146*f6dc9357SAndroid Build Coastguard Worker
147*f6dc9357SAndroid Build Coastguard Worker
148*f6dc9357SAndroid Build Coastguard Worker #define W_PRE(i) (W[(i) + (size_t)(j)] = GetBe64(data + ((size_t)(j) + i) * 8))
149*f6dc9357SAndroid Build Coastguard Worker
150*f6dc9357SAndroid Build Coastguard Worker #define blk2_main(j, i) s1(w(j, (i)-2)) + w(j, (i)-7) + s0(w(j, (i)-15))
151*f6dc9357SAndroid Build Coastguard Worker
152*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_SHA512_BIG_W
153*f6dc9357SAndroid Build Coastguard Worker // we use +i instead of +(i) to change the order to solve CLANG compiler warning for signed/unsigned.
154*f6dc9357SAndroid Build Coastguard Worker #define w(j, i) W[(size_t)(j) + i]
155*f6dc9357SAndroid Build Coastguard Worker #define blk2(j, i) (w(j, i) = w(j, (i)-16) + blk2_main(j, i))
156*f6dc9357SAndroid Build Coastguard Worker #else
157*f6dc9357SAndroid Build Coastguard Worker #if STEP_MAIN == 16
158*f6dc9357SAndroid Build Coastguard Worker #define w(j, i) W[(i) & 15]
159*f6dc9357SAndroid Build Coastguard Worker #else
160*f6dc9357SAndroid Build Coastguard Worker #define w(j, i) W[((size_t)(j) + (i)) & 15]
161*f6dc9357SAndroid Build Coastguard Worker #endif
162*f6dc9357SAndroid Build Coastguard Worker #define blk2(j, i) (w(j, i) += blk2_main(j, i))
163*f6dc9357SAndroid Build Coastguard Worker #endif
164*f6dc9357SAndroid Build Coastguard Worker
165*f6dc9357SAndroid Build Coastguard Worker #define W_MAIN(i) blk2(j, i)
166*f6dc9357SAndroid Build Coastguard Worker
167*f6dc9357SAndroid Build Coastguard Worker
168*f6dc9357SAndroid Build Coastguard Worker #define T1(wx, i) \
169*f6dc9357SAndroid Build Coastguard Worker tmp = h + S1(e) + Ch(e,f,g) + K[(i)+(size_t)(j)] + wx(i); \
170*f6dc9357SAndroid Build Coastguard Worker h = g; \
171*f6dc9357SAndroid Build Coastguard Worker g = f; \
172*f6dc9357SAndroid Build Coastguard Worker f = e; \
173*f6dc9357SAndroid Build Coastguard Worker e = d + tmp; \
174*f6dc9357SAndroid Build Coastguard Worker tmp += S0(a) + Maj(a, b, c); \
175*f6dc9357SAndroid Build Coastguard Worker d = c; \
176*f6dc9357SAndroid Build Coastguard Worker c = b; \
177*f6dc9357SAndroid Build Coastguard Worker b = a; \
178*f6dc9357SAndroid Build Coastguard Worker a = tmp; \
179*f6dc9357SAndroid Build Coastguard Worker
180*f6dc9357SAndroid Build Coastguard Worker #define R1_PRE(i) T1( W_PRE, i)
181*f6dc9357SAndroid Build Coastguard Worker #define R1_MAIN(i) T1( W_MAIN, i)
182*f6dc9357SAndroid Build Coastguard Worker
183*f6dc9357SAndroid Build Coastguard Worker #if (!defined(Z7_SHA512_UNROLL) || STEP_MAIN < 8) && (STEP_MAIN >= 4)
184*f6dc9357SAndroid Build Coastguard Worker #define R2_MAIN(i) \
185*f6dc9357SAndroid Build Coastguard Worker R1_MAIN(i) \
186*f6dc9357SAndroid Build Coastguard Worker R1_MAIN(i + 1) \
187*f6dc9357SAndroid Build Coastguard Worker
188*f6dc9357SAndroid Build Coastguard Worker #endif
189*f6dc9357SAndroid Build Coastguard Worker
190*f6dc9357SAndroid Build Coastguard Worker
191*f6dc9357SAndroid Build Coastguard Worker
192*f6dc9357SAndroid Build Coastguard Worker #if defined(Z7_SHA512_UNROLL) && STEP_MAIN >= 8
193*f6dc9357SAndroid Build Coastguard Worker
194*f6dc9357SAndroid Build Coastguard Worker #define T4( a,b,c,d,e,f,g,h, wx, i) \
195*f6dc9357SAndroid Build Coastguard Worker h += S1(e) + Ch(e,f,g) + K[(i)+(size_t)(j)] + wx(i); \
196*f6dc9357SAndroid Build Coastguard Worker tmp = h; \
197*f6dc9357SAndroid Build Coastguard Worker h += d; \
198*f6dc9357SAndroid Build Coastguard Worker d = tmp + S0(a) + Maj(a, b, c); \
199*f6dc9357SAndroid Build Coastguard Worker
200*f6dc9357SAndroid Build Coastguard Worker #define R4( wx, i) \
201*f6dc9357SAndroid Build Coastguard Worker T4 ( a,b,c,d,e,f,g,h, wx, (i )); \
202*f6dc9357SAndroid Build Coastguard Worker T4 ( d,a,b,c,h,e,f,g, wx, (i+1)); \
203*f6dc9357SAndroid Build Coastguard Worker T4 ( c,d,a,b,g,h,e,f, wx, (i+2)); \
204*f6dc9357SAndroid Build Coastguard Worker T4 ( b,c,d,a,f,g,h,e, wx, (i+3)); \
205*f6dc9357SAndroid Build Coastguard Worker
206*f6dc9357SAndroid Build Coastguard Worker #define R4_PRE(i) R4( W_PRE, i)
207*f6dc9357SAndroid Build Coastguard Worker #define R4_MAIN(i) R4( W_MAIN, i)
208*f6dc9357SAndroid Build Coastguard Worker
209*f6dc9357SAndroid Build Coastguard Worker
210*f6dc9357SAndroid Build Coastguard Worker #define T8( a,b,c,d,e,f,g,h, wx, i) \
211*f6dc9357SAndroid Build Coastguard Worker h += S1(e) + Ch(e,f,g) + K[(i)+(size_t)(j)] + wx(i); \
212*f6dc9357SAndroid Build Coastguard Worker d += h; \
213*f6dc9357SAndroid Build Coastguard Worker h += S0(a) + Maj(a, b, c); \
214*f6dc9357SAndroid Build Coastguard Worker
215*f6dc9357SAndroid Build Coastguard Worker #define R8( wx, i) \
216*f6dc9357SAndroid Build Coastguard Worker T8 ( a,b,c,d,e,f,g,h, wx, i ); \
217*f6dc9357SAndroid Build Coastguard Worker T8 ( h,a,b,c,d,e,f,g, wx, i+1); \
218*f6dc9357SAndroid Build Coastguard Worker T8 ( g,h,a,b,c,d,e,f, wx, i+2); \
219*f6dc9357SAndroid Build Coastguard Worker T8 ( f,g,h,a,b,c,d,e, wx, i+3); \
220*f6dc9357SAndroid Build Coastguard Worker T8 ( e,f,g,h,a,b,c,d, wx, i+4); \
221*f6dc9357SAndroid Build Coastguard Worker T8 ( d,e,f,g,h,a,b,c, wx, i+5); \
222*f6dc9357SAndroid Build Coastguard Worker T8 ( c,d,e,f,g,h,a,b, wx, i+6); \
223*f6dc9357SAndroid Build Coastguard Worker T8 ( b,c,d,e,f,g,h,a, wx, i+7); \
224*f6dc9357SAndroid Build Coastguard Worker
225*f6dc9357SAndroid Build Coastguard Worker #define R8_PRE(i) R8( W_PRE, i)
226*f6dc9357SAndroid Build Coastguard Worker #define R8_MAIN(i) R8( W_MAIN, i)
227*f6dc9357SAndroid Build Coastguard Worker
228*f6dc9357SAndroid Build Coastguard Worker #endif
229*f6dc9357SAndroid Build Coastguard Worker
230*f6dc9357SAndroid Build Coastguard Worker
231*f6dc9357SAndroid Build Coastguard Worker extern
232*f6dc9357SAndroid Build Coastguard Worker MY_ALIGN(64) const UInt64 SHA512_K_ARRAY[80];
233*f6dc9357SAndroid Build Coastguard Worker MY_ALIGN(64) const UInt64 SHA512_K_ARRAY[80] = {
234*f6dc9357SAndroid Build Coastguard Worker U64C(0x428a2f98d728ae22), U64C(0x7137449123ef65cd), U64C(0xb5c0fbcfec4d3b2f), U64C(0xe9b5dba58189dbbc),
235*f6dc9357SAndroid Build Coastguard Worker U64C(0x3956c25bf348b538), U64C(0x59f111f1b605d019), U64C(0x923f82a4af194f9b), U64C(0xab1c5ed5da6d8118),
236*f6dc9357SAndroid Build Coastguard Worker U64C(0xd807aa98a3030242), U64C(0x12835b0145706fbe), U64C(0x243185be4ee4b28c), U64C(0x550c7dc3d5ffb4e2),
237*f6dc9357SAndroid Build Coastguard Worker U64C(0x72be5d74f27b896f), U64C(0x80deb1fe3b1696b1), U64C(0x9bdc06a725c71235), U64C(0xc19bf174cf692694),
238*f6dc9357SAndroid Build Coastguard Worker U64C(0xe49b69c19ef14ad2), U64C(0xefbe4786384f25e3), U64C(0x0fc19dc68b8cd5b5), U64C(0x240ca1cc77ac9c65),
239*f6dc9357SAndroid Build Coastguard Worker U64C(0x2de92c6f592b0275), U64C(0x4a7484aa6ea6e483), U64C(0x5cb0a9dcbd41fbd4), U64C(0x76f988da831153b5),
240*f6dc9357SAndroid Build Coastguard Worker U64C(0x983e5152ee66dfab), U64C(0xa831c66d2db43210), U64C(0xb00327c898fb213f), U64C(0xbf597fc7beef0ee4),
241*f6dc9357SAndroid Build Coastguard Worker U64C(0xc6e00bf33da88fc2), U64C(0xd5a79147930aa725), U64C(0x06ca6351e003826f), U64C(0x142929670a0e6e70),
242*f6dc9357SAndroid Build Coastguard Worker U64C(0x27b70a8546d22ffc), U64C(0x2e1b21385c26c926), U64C(0x4d2c6dfc5ac42aed), U64C(0x53380d139d95b3df),
243*f6dc9357SAndroid Build Coastguard Worker U64C(0x650a73548baf63de), U64C(0x766a0abb3c77b2a8), U64C(0x81c2c92e47edaee6), U64C(0x92722c851482353b),
244*f6dc9357SAndroid Build Coastguard Worker U64C(0xa2bfe8a14cf10364), U64C(0xa81a664bbc423001), U64C(0xc24b8b70d0f89791), U64C(0xc76c51a30654be30),
245*f6dc9357SAndroid Build Coastguard Worker U64C(0xd192e819d6ef5218), U64C(0xd69906245565a910), U64C(0xf40e35855771202a), U64C(0x106aa07032bbd1b8),
246*f6dc9357SAndroid Build Coastguard Worker U64C(0x19a4c116b8d2d0c8), U64C(0x1e376c085141ab53), U64C(0x2748774cdf8eeb99), U64C(0x34b0bcb5e19b48a8),
247*f6dc9357SAndroid Build Coastguard Worker U64C(0x391c0cb3c5c95a63), U64C(0x4ed8aa4ae3418acb), U64C(0x5b9cca4f7763e373), U64C(0x682e6ff3d6b2b8a3),
248*f6dc9357SAndroid Build Coastguard Worker U64C(0x748f82ee5defb2fc), U64C(0x78a5636f43172f60), U64C(0x84c87814a1f0ab72), U64C(0x8cc702081a6439ec),
249*f6dc9357SAndroid Build Coastguard Worker U64C(0x90befffa23631e28), U64C(0xa4506cebde82bde9), U64C(0xbef9a3f7b2c67915), U64C(0xc67178f2e372532b),
250*f6dc9357SAndroid Build Coastguard Worker U64C(0xca273eceea26619c), U64C(0xd186b8c721c0c207), U64C(0xeada7dd6cde0eb1e), U64C(0xf57d4f7fee6ed178),
251*f6dc9357SAndroid Build Coastguard Worker U64C(0x06f067aa72176fba), U64C(0x0a637dc5a2c898a6), U64C(0x113f9804bef90dae), U64C(0x1b710b35131c471b),
252*f6dc9357SAndroid Build Coastguard Worker U64C(0x28db77f523047d84), U64C(0x32caab7b40c72493), U64C(0x3c9ebe0a15c9bebc), U64C(0x431d67c49c100d4c),
253*f6dc9357SAndroid Build Coastguard Worker U64C(0x4cc5d4becb3e42b6), U64C(0x597f299cfc657e2a), U64C(0x5fcb6fab3ad6faec), U64C(0x6c44198c4a475817)
254*f6dc9357SAndroid Build Coastguard Worker };
255*f6dc9357SAndroid Build Coastguard Worker
256*f6dc9357SAndroid Build Coastguard Worker #define K SHA512_K_ARRAY
257*f6dc9357SAndroid Build Coastguard Worker
258*f6dc9357SAndroid Build Coastguard Worker Z7_NO_INLINE
Sha512_UpdateBlocks(UInt64 state[8],const Byte * data,size_t numBlocks)259*f6dc9357SAndroid Build Coastguard Worker void Z7_FASTCALL Sha512_UpdateBlocks(UInt64 state[8], const Byte *data, size_t numBlocks)
260*f6dc9357SAndroid Build Coastguard Worker {
261*f6dc9357SAndroid Build Coastguard Worker UInt64 W
262*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_SHA512_BIG_W
263*f6dc9357SAndroid Build Coastguard Worker [80];
264*f6dc9357SAndroid Build Coastguard Worker #else
265*f6dc9357SAndroid Build Coastguard Worker [16];
266*f6dc9357SAndroid Build Coastguard Worker #endif
267*f6dc9357SAndroid Build Coastguard Worker unsigned j;
268*f6dc9357SAndroid Build Coastguard Worker UInt64 a,b,c,d,e,f,g,h;
269*f6dc9357SAndroid Build Coastguard Worker #if !defined(Z7_SHA512_UNROLL) || (STEP_MAIN <= 4) || (STEP_PRE <= 4)
270*f6dc9357SAndroid Build Coastguard Worker UInt64 tmp;
271*f6dc9357SAndroid Build Coastguard Worker #endif
272*f6dc9357SAndroid Build Coastguard Worker
273*f6dc9357SAndroid Build Coastguard Worker if (numBlocks == 0) return;
274*f6dc9357SAndroid Build Coastguard Worker
275*f6dc9357SAndroid Build Coastguard Worker a = state[0];
276*f6dc9357SAndroid Build Coastguard Worker b = state[1];
277*f6dc9357SAndroid Build Coastguard Worker c = state[2];
278*f6dc9357SAndroid Build Coastguard Worker d = state[3];
279*f6dc9357SAndroid Build Coastguard Worker e = state[4];
280*f6dc9357SAndroid Build Coastguard Worker f = state[5];
281*f6dc9357SAndroid Build Coastguard Worker g = state[6];
282*f6dc9357SAndroid Build Coastguard Worker h = state[7];
283*f6dc9357SAndroid Build Coastguard Worker
284*f6dc9357SAndroid Build Coastguard Worker do
285*f6dc9357SAndroid Build Coastguard Worker {
286*f6dc9357SAndroid Build Coastguard Worker
287*f6dc9357SAndroid Build Coastguard Worker for (j = 0; j < 16; j += STEP_PRE)
288*f6dc9357SAndroid Build Coastguard Worker {
289*f6dc9357SAndroid Build Coastguard Worker #if STEP_PRE > 4
290*f6dc9357SAndroid Build Coastguard Worker
291*f6dc9357SAndroid Build Coastguard Worker #if STEP_PRE < 8
292*f6dc9357SAndroid Build Coastguard Worker R4_PRE(0);
293*f6dc9357SAndroid Build Coastguard Worker #else
294*f6dc9357SAndroid Build Coastguard Worker R8_PRE(0);
295*f6dc9357SAndroid Build Coastguard Worker #if STEP_PRE == 16
296*f6dc9357SAndroid Build Coastguard Worker R8_PRE(8);
297*f6dc9357SAndroid Build Coastguard Worker #endif
298*f6dc9357SAndroid Build Coastguard Worker #endif
299*f6dc9357SAndroid Build Coastguard Worker
300*f6dc9357SAndroid Build Coastguard Worker #else
301*f6dc9357SAndroid Build Coastguard Worker
302*f6dc9357SAndroid Build Coastguard Worker R1_PRE(0)
303*f6dc9357SAndroid Build Coastguard Worker #if STEP_PRE >= 2
304*f6dc9357SAndroid Build Coastguard Worker R1_PRE(1)
305*f6dc9357SAndroid Build Coastguard Worker #if STEP_PRE >= 4
306*f6dc9357SAndroid Build Coastguard Worker R1_PRE(2)
307*f6dc9357SAndroid Build Coastguard Worker R1_PRE(3)
308*f6dc9357SAndroid Build Coastguard Worker #endif
309*f6dc9357SAndroid Build Coastguard Worker #endif
310*f6dc9357SAndroid Build Coastguard Worker
311*f6dc9357SAndroid Build Coastguard Worker #endif
312*f6dc9357SAndroid Build Coastguard Worker }
313*f6dc9357SAndroid Build Coastguard Worker
314*f6dc9357SAndroid Build Coastguard Worker for (j = 16; j < 80; j += STEP_MAIN)
315*f6dc9357SAndroid Build Coastguard Worker {
316*f6dc9357SAndroid Build Coastguard Worker #if defined(Z7_SHA512_UNROLL) && STEP_MAIN >= 8
317*f6dc9357SAndroid Build Coastguard Worker
318*f6dc9357SAndroid Build Coastguard Worker #if STEP_MAIN < 8
319*f6dc9357SAndroid Build Coastguard Worker R4_MAIN(0)
320*f6dc9357SAndroid Build Coastguard Worker #else
321*f6dc9357SAndroid Build Coastguard Worker R8_MAIN(0)
322*f6dc9357SAndroid Build Coastguard Worker #if STEP_MAIN == 16
323*f6dc9357SAndroid Build Coastguard Worker R8_MAIN(8)
324*f6dc9357SAndroid Build Coastguard Worker #endif
325*f6dc9357SAndroid Build Coastguard Worker #endif
326*f6dc9357SAndroid Build Coastguard Worker
327*f6dc9357SAndroid Build Coastguard Worker #else
328*f6dc9357SAndroid Build Coastguard Worker
329*f6dc9357SAndroid Build Coastguard Worker R1_MAIN(0)
330*f6dc9357SAndroid Build Coastguard Worker #if STEP_MAIN >= 2
331*f6dc9357SAndroid Build Coastguard Worker R1_MAIN(1)
332*f6dc9357SAndroid Build Coastguard Worker #if STEP_MAIN >= 4
333*f6dc9357SAndroid Build Coastguard Worker R2_MAIN(2)
334*f6dc9357SAndroid Build Coastguard Worker #if STEP_MAIN >= 8
335*f6dc9357SAndroid Build Coastguard Worker R2_MAIN(4)
336*f6dc9357SAndroid Build Coastguard Worker R2_MAIN(6)
337*f6dc9357SAndroid Build Coastguard Worker #if STEP_MAIN >= 16
338*f6dc9357SAndroid Build Coastguard Worker R2_MAIN(8)
339*f6dc9357SAndroid Build Coastguard Worker R2_MAIN(10)
340*f6dc9357SAndroid Build Coastguard Worker R2_MAIN(12)
341*f6dc9357SAndroid Build Coastguard Worker R2_MAIN(14)
342*f6dc9357SAndroid Build Coastguard Worker #endif
343*f6dc9357SAndroid Build Coastguard Worker #endif
344*f6dc9357SAndroid Build Coastguard Worker #endif
345*f6dc9357SAndroid Build Coastguard Worker #endif
346*f6dc9357SAndroid Build Coastguard Worker #endif
347*f6dc9357SAndroid Build Coastguard Worker }
348*f6dc9357SAndroid Build Coastguard Worker
349*f6dc9357SAndroid Build Coastguard Worker a += state[0]; state[0] = a;
350*f6dc9357SAndroid Build Coastguard Worker b += state[1]; state[1] = b;
351*f6dc9357SAndroid Build Coastguard Worker c += state[2]; state[2] = c;
352*f6dc9357SAndroid Build Coastguard Worker d += state[3]; state[3] = d;
353*f6dc9357SAndroid Build Coastguard Worker e += state[4]; state[4] = e;
354*f6dc9357SAndroid Build Coastguard Worker f += state[5]; state[5] = f;
355*f6dc9357SAndroid Build Coastguard Worker g += state[6]; state[6] = g;
356*f6dc9357SAndroid Build Coastguard Worker h += state[7]; state[7] = h;
357*f6dc9357SAndroid Build Coastguard Worker
358*f6dc9357SAndroid Build Coastguard Worker data += SHA512_BLOCK_SIZE;
359*f6dc9357SAndroid Build Coastguard Worker }
360*f6dc9357SAndroid Build Coastguard Worker while (--numBlocks);
361*f6dc9357SAndroid Build Coastguard Worker }
362*f6dc9357SAndroid Build Coastguard Worker
363*f6dc9357SAndroid Build Coastguard Worker
364*f6dc9357SAndroid Build Coastguard Worker #define Sha512_UpdateBlock(p) SHA512_UPDATE_BLOCKS(p)(p->state, p->buffer, 1)
365*f6dc9357SAndroid Build Coastguard Worker
Sha512_Update(CSha512 * p,const Byte * data,size_t size)366*f6dc9357SAndroid Build Coastguard Worker void Sha512_Update(CSha512 *p, const Byte *data, size_t size)
367*f6dc9357SAndroid Build Coastguard Worker {
368*f6dc9357SAndroid Build Coastguard Worker if (size == 0)
369*f6dc9357SAndroid Build Coastguard Worker return;
370*f6dc9357SAndroid Build Coastguard Worker {
371*f6dc9357SAndroid Build Coastguard Worker const unsigned pos = (unsigned)p->v.vars.count & (SHA512_BLOCK_SIZE - 1);
372*f6dc9357SAndroid Build Coastguard Worker const unsigned num = SHA512_BLOCK_SIZE - pos;
373*f6dc9357SAndroid Build Coastguard Worker p->v.vars.count += size;
374*f6dc9357SAndroid Build Coastguard Worker if (num > size)
375*f6dc9357SAndroid Build Coastguard Worker {
376*f6dc9357SAndroid Build Coastguard Worker memcpy(p->buffer + pos, data, size);
377*f6dc9357SAndroid Build Coastguard Worker return;
378*f6dc9357SAndroid Build Coastguard Worker }
379*f6dc9357SAndroid Build Coastguard Worker if (pos != 0)
380*f6dc9357SAndroid Build Coastguard Worker {
381*f6dc9357SAndroid Build Coastguard Worker size -= num;
382*f6dc9357SAndroid Build Coastguard Worker memcpy(p->buffer + pos, data, num);
383*f6dc9357SAndroid Build Coastguard Worker data += num;
384*f6dc9357SAndroid Build Coastguard Worker Sha512_UpdateBlock(p);
385*f6dc9357SAndroid Build Coastguard Worker }
386*f6dc9357SAndroid Build Coastguard Worker }
387*f6dc9357SAndroid Build Coastguard Worker {
388*f6dc9357SAndroid Build Coastguard Worker const size_t numBlocks = size >> 7;
389*f6dc9357SAndroid Build Coastguard Worker // if (numBlocks)
390*f6dc9357SAndroid Build Coastguard Worker SHA512_UPDATE_BLOCKS(p)(p->state, data, numBlocks);
391*f6dc9357SAndroid Build Coastguard Worker size &= SHA512_BLOCK_SIZE - 1;
392*f6dc9357SAndroid Build Coastguard Worker if (size == 0)
393*f6dc9357SAndroid Build Coastguard Worker return;
394*f6dc9357SAndroid Build Coastguard Worker data += (numBlocks << 7);
395*f6dc9357SAndroid Build Coastguard Worker memcpy(p->buffer, data, size);
396*f6dc9357SAndroid Build Coastguard Worker }
397*f6dc9357SAndroid Build Coastguard Worker }
398*f6dc9357SAndroid Build Coastguard Worker
399*f6dc9357SAndroid Build Coastguard Worker
Sha512_Final(CSha512 * p,Byte * digest,unsigned digestSize)400*f6dc9357SAndroid Build Coastguard Worker void Sha512_Final(CSha512 *p, Byte *digest, unsigned digestSize)
401*f6dc9357SAndroid Build Coastguard Worker {
402*f6dc9357SAndroid Build Coastguard Worker unsigned pos = (unsigned)p->v.vars.count & (SHA512_BLOCK_SIZE - 1);
403*f6dc9357SAndroid Build Coastguard Worker p->buffer[pos++] = 0x80;
404*f6dc9357SAndroid Build Coastguard Worker if (pos > (SHA512_BLOCK_SIZE - 8 * 2))
405*f6dc9357SAndroid Build Coastguard Worker {
406*f6dc9357SAndroid Build Coastguard Worker while (pos != SHA512_BLOCK_SIZE) { p->buffer[pos++] = 0; }
407*f6dc9357SAndroid Build Coastguard Worker // memset(&p->buf.buffer[pos], 0, SHA512_BLOCK_SIZE - pos);
408*f6dc9357SAndroid Build Coastguard Worker Sha512_UpdateBlock(p);
409*f6dc9357SAndroid Build Coastguard Worker pos = 0;
410*f6dc9357SAndroid Build Coastguard Worker }
411*f6dc9357SAndroid Build Coastguard Worker memset(&p->buffer[pos], 0, (SHA512_BLOCK_SIZE - 8 * 2) - pos);
412*f6dc9357SAndroid Build Coastguard Worker {
413*f6dc9357SAndroid Build Coastguard Worker const UInt64 numBits = p->v.vars.count << 3;
414*f6dc9357SAndroid Build Coastguard Worker SetBe64(p->buffer + SHA512_BLOCK_SIZE - 8 * 2, 0) // = (p->v.vars.count >> (64 - 3)); (high 64-bits)
415*f6dc9357SAndroid Build Coastguard Worker SetBe64(p->buffer + SHA512_BLOCK_SIZE - 8 * 1, numBits)
416*f6dc9357SAndroid Build Coastguard Worker }
417*f6dc9357SAndroid Build Coastguard Worker Sha512_UpdateBlock(p);
418*f6dc9357SAndroid Build Coastguard Worker #if 1 && defined(MY_CPU_BE)
419*f6dc9357SAndroid Build Coastguard Worker memcpy(digest, p->state, digestSize);
420*f6dc9357SAndroid Build Coastguard Worker #else
421*f6dc9357SAndroid Build Coastguard Worker {
422*f6dc9357SAndroid Build Coastguard Worker const unsigned numWords = digestSize >> 3;
423*f6dc9357SAndroid Build Coastguard Worker unsigned i;
424*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < numWords; i++)
425*f6dc9357SAndroid Build Coastguard Worker {
426*f6dc9357SAndroid Build Coastguard Worker const UInt64 v = p->state[i];
427*f6dc9357SAndroid Build Coastguard Worker SetBe64(digest, v)
428*f6dc9357SAndroid Build Coastguard Worker digest += 8;
429*f6dc9357SAndroid Build Coastguard Worker }
430*f6dc9357SAndroid Build Coastguard Worker if (digestSize & 4) // digestSize == SHA512_224_DIGEST_SIZE
431*f6dc9357SAndroid Build Coastguard Worker {
432*f6dc9357SAndroid Build Coastguard Worker const UInt32 v = (UInt32)((p->state[numWords]) >> 32);
433*f6dc9357SAndroid Build Coastguard Worker SetBe32(digest, v)
434*f6dc9357SAndroid Build Coastguard Worker }
435*f6dc9357SAndroid Build Coastguard Worker }
436*f6dc9357SAndroid Build Coastguard Worker #endif
437*f6dc9357SAndroid Build Coastguard Worker Sha512_InitState(p, digestSize);
438*f6dc9357SAndroid Build Coastguard Worker }
439*f6dc9357SAndroid Build Coastguard Worker
440*f6dc9357SAndroid Build Coastguard Worker
441*f6dc9357SAndroid Build Coastguard Worker
442*f6dc9357SAndroid Build Coastguard Worker
443*f6dc9357SAndroid Build Coastguard Worker #if defined(_WIN32) && defined(Z7_COMPILER_SHA512_SUPPORTED) \
444*f6dc9357SAndroid Build Coastguard Worker && defined(MY_CPU_ARM64) // we can disable this check to debug in x64
445*f6dc9357SAndroid Build Coastguard Worker
446*f6dc9357SAndroid Build Coastguard Worker #if 1 // 0 for debug
447*f6dc9357SAndroid Build Coastguard Worker
448*f6dc9357SAndroid Build Coastguard Worker #include "7zWindows.h"
449*f6dc9357SAndroid Build Coastguard Worker // #include <stdio.h>
450*f6dc9357SAndroid Build Coastguard Worker #if 0 && defined(MY_CPU_X86_OR_AMD64)
451*f6dc9357SAndroid Build Coastguard Worker #include <intrin.h> // for debug : for __ud2()
452*f6dc9357SAndroid Build Coastguard Worker #endif
453*f6dc9357SAndroid Build Coastguard Worker
CPU_IsSupported_SHA512(void)454*f6dc9357SAndroid Build Coastguard Worker BoolInt CPU_IsSupported_SHA512(void)
455*f6dc9357SAndroid Build Coastguard Worker {
456*f6dc9357SAndroid Build Coastguard Worker #if defined(MY_CPU_ARM64)
457*f6dc9357SAndroid Build Coastguard Worker // we have no SHA512 flag for IsProcessorFeaturePresent() still.
458*f6dc9357SAndroid Build Coastguard Worker if (!CPU_IsSupported_CRYPTO())
459*f6dc9357SAndroid Build Coastguard Worker return False;
460*f6dc9357SAndroid Build Coastguard Worker #endif
461*f6dc9357SAndroid Build Coastguard Worker // printf("\nCPU_IsSupported_SHA512\n");
462*f6dc9357SAndroid Build Coastguard Worker {
463*f6dc9357SAndroid Build Coastguard Worker // we can't read ID_AA64ISAR0_EL1 register from application.
464*f6dc9357SAndroid Build Coastguard Worker // but ID_AA64ISAR0_EL1 register is mapped to "CP 4030" registry value.
465*f6dc9357SAndroid Build Coastguard Worker HKEY key = NULL;
466*f6dc9357SAndroid Build Coastguard Worker LONG res = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
467*f6dc9357SAndroid Build Coastguard Worker TEXT("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0"),
468*f6dc9357SAndroid Build Coastguard Worker 0, KEY_READ, &key);
469*f6dc9357SAndroid Build Coastguard Worker if (res != ERROR_SUCCESS)
470*f6dc9357SAndroid Build Coastguard Worker return False;
471*f6dc9357SAndroid Build Coastguard Worker {
472*f6dc9357SAndroid Build Coastguard Worker DWORD type = 0;
473*f6dc9357SAndroid Build Coastguard Worker DWORD count = sizeof(UInt64);
474*f6dc9357SAndroid Build Coastguard Worker UInt64 val = 0;
475*f6dc9357SAndroid Build Coastguard Worker res = RegQueryValueEx(key, TEXT("CP 4030"), NULL,
476*f6dc9357SAndroid Build Coastguard Worker &type, (LPBYTE)&val, &count);
477*f6dc9357SAndroid Build Coastguard Worker RegCloseKey(key);
478*f6dc9357SAndroid Build Coastguard Worker if (res != ERROR_SUCCESS
479*f6dc9357SAndroid Build Coastguard Worker || type != REG_QWORD
480*f6dc9357SAndroid Build Coastguard Worker || count != sizeof(UInt64)
481*f6dc9357SAndroid Build Coastguard Worker || ((unsigned)(val >> 12) & 0xf) != 2)
482*f6dc9357SAndroid Build Coastguard Worker return False;
483*f6dc9357SAndroid Build Coastguard Worker // we parse SHA2 field of ID_AA64ISAR0_EL1 register:
484*f6dc9357SAndroid Build Coastguard Worker // 0 : No SHA2 instructions implemented
485*f6dc9357SAndroid Build Coastguard Worker // 1 : SHA256 implemented
486*f6dc9357SAndroid Build Coastguard Worker // 2 : SHA256 and SHA512 implemented
487*f6dc9357SAndroid Build Coastguard Worker }
488*f6dc9357SAndroid Build Coastguard Worker }
489*f6dc9357SAndroid Build Coastguard Worker
490*f6dc9357SAndroid Build Coastguard Worker
491*f6dc9357SAndroid Build Coastguard Worker #if 1 // 0 for debug to disable SHA512 PROBE code
492*f6dc9357SAndroid Build Coastguard Worker
493*f6dc9357SAndroid Build Coastguard Worker /*
494*f6dc9357SAndroid Build Coastguard Worker ----- SHA512 PROBE -----
495*f6dc9357SAndroid Build Coastguard Worker
496*f6dc9357SAndroid Build Coastguard Worker We suppose that "CP 4030" registry reading is enough.
497*f6dc9357SAndroid Build Coastguard Worker But we use additional SHA512 PROBE code, because
498*f6dc9357SAndroid Build Coastguard Worker we can catch exception here, and we don't catch exceptions,
499*f6dc9357SAndroid Build Coastguard Worker if we call Sha512 functions from main code.
500*f6dc9357SAndroid Build Coastguard Worker
501*f6dc9357SAndroid Build Coastguard Worker NOTE: arm64 PROBE code doesn't work, if we call it via Wine in linux-arm64.
502*f6dc9357SAndroid Build Coastguard Worker The program just stops.
503*f6dc9357SAndroid Build Coastguard Worker Also x64 version of PROBE code doesn't work, if we run it via Intel SDE emulator
504*f6dc9357SAndroid Build Coastguard Worker without SHA512 support (-skl switch),
505*f6dc9357SAndroid Build Coastguard Worker The program stops, and we have message from SDE:
506*f6dc9357SAndroid Build Coastguard Worker TID 0 SDE-ERROR: Executed instruction not valid for specified chip (SKYLAKE): vsha512msg1
507*f6dc9357SAndroid Build Coastguard Worker But we still want to catch that exception instead of process stopping.
508*f6dc9357SAndroid Build Coastguard Worker Does this PROBE code work in native Windows-arm64 (with/without sha512 hw instructions)?
509*f6dc9357SAndroid Build Coastguard Worker Are there any ways to fix the problems with arm64-wine and x64-SDE cases?
510*f6dc9357SAndroid Build Coastguard Worker */
511*f6dc9357SAndroid Build Coastguard Worker
512*f6dc9357SAndroid Build Coastguard Worker // printf("\n========== CPU_IsSupported_SHA512 PROBE ========\n");
513*f6dc9357SAndroid Build Coastguard Worker {
514*f6dc9357SAndroid Build Coastguard Worker #ifdef __clang_major__
515*f6dc9357SAndroid Build Coastguard Worker #pragma GCC diagnostic ignored "-Wlanguage-extension-token"
516*f6dc9357SAndroid Build Coastguard Worker #endif
517*f6dc9357SAndroid Build Coastguard Worker __try
518*f6dc9357SAndroid Build Coastguard Worker {
519*f6dc9357SAndroid Build Coastguard Worker #if 0 // 1 : for debug (reduced version to detect sha512)
520*f6dc9357SAndroid Build Coastguard Worker const uint64x2_t a = vdupq_n_u64(1);
521*f6dc9357SAndroid Build Coastguard Worker const uint64x2_t b = vsha512hq_u64(a, a, a);
522*f6dc9357SAndroid Build Coastguard Worker if ((UInt32)vgetq_lane_u64(b, 0) == 0x11800002)
523*f6dc9357SAndroid Build Coastguard Worker return True;
524*f6dc9357SAndroid Build Coastguard Worker #else
525*f6dc9357SAndroid Build Coastguard Worker MY_ALIGN(16)
526*f6dc9357SAndroid Build Coastguard Worker UInt64 temp[SHA512_NUM_DIGEST_WORDS + SHA512_NUM_BLOCK_WORDS];
527*f6dc9357SAndroid Build Coastguard Worker memset(temp, 0x5a, sizeof(temp));
528*f6dc9357SAndroid Build Coastguard Worker #if 0 && defined(MY_CPU_X86_OR_AMD64)
529*f6dc9357SAndroid Build Coastguard Worker __ud2(); // for debug : that exception is not problem for SDE
530*f6dc9357SAndroid Build Coastguard Worker #endif
531*f6dc9357SAndroid Build Coastguard Worker #if 1
532*f6dc9357SAndroid Build Coastguard Worker Sha512_UpdateBlocks_HW(temp,
533*f6dc9357SAndroid Build Coastguard Worker (const Byte *)(const void *)(temp + SHA512_NUM_DIGEST_WORDS), 1);
534*f6dc9357SAndroid Build Coastguard Worker // printf("\n==== t = %x\n", (UInt32)temp[0]);
535*f6dc9357SAndroid Build Coastguard Worker if ((UInt32)temp[0] == 0xa33cfdf7)
536*f6dc9357SAndroid Build Coastguard Worker {
537*f6dc9357SAndroid Build Coastguard Worker // printf("\n=== PROBE SHA512: SHA512 supported\n");
538*f6dc9357SAndroid Build Coastguard Worker return True;
539*f6dc9357SAndroid Build Coastguard Worker }
540*f6dc9357SAndroid Build Coastguard Worker #endif
541*f6dc9357SAndroid Build Coastguard Worker #endif
542*f6dc9357SAndroid Build Coastguard Worker }
543*f6dc9357SAndroid Build Coastguard Worker __except (EXCEPTION_EXECUTE_HANDLER)
544*f6dc9357SAndroid Build Coastguard Worker {
545*f6dc9357SAndroid Build Coastguard Worker // printf("\n==== CPU_IsSupported_SHA512 EXCEPTION_EXECUTE_HANDLER\n");
546*f6dc9357SAndroid Build Coastguard Worker }
547*f6dc9357SAndroid Build Coastguard Worker }
548*f6dc9357SAndroid Build Coastguard Worker return False;
549*f6dc9357SAndroid Build Coastguard Worker #else
550*f6dc9357SAndroid Build Coastguard Worker // without SHA512 PROBE code
551*f6dc9357SAndroid Build Coastguard Worker return True;
552*f6dc9357SAndroid Build Coastguard Worker #endif
553*f6dc9357SAndroid Build Coastguard Worker
554*f6dc9357SAndroid Build Coastguard Worker }
555*f6dc9357SAndroid Build Coastguard Worker
556*f6dc9357SAndroid Build Coastguard Worker #else
557*f6dc9357SAndroid Build Coastguard Worker
CPU_IsSupported_SHA512(void)558*f6dc9357SAndroid Build Coastguard Worker BoolInt CPU_IsSupported_SHA512(void)
559*f6dc9357SAndroid Build Coastguard Worker {
560*f6dc9357SAndroid Build Coastguard Worker return False;
561*f6dc9357SAndroid Build Coastguard Worker }
562*f6dc9357SAndroid Build Coastguard Worker
563*f6dc9357SAndroid Build Coastguard Worker #endif
564*f6dc9357SAndroid Build Coastguard Worker #endif // WIN32 arm64
565*f6dc9357SAndroid Build Coastguard Worker
566*f6dc9357SAndroid Build Coastguard Worker
Sha512Prepare(void)567*f6dc9357SAndroid Build Coastguard Worker void Sha512Prepare(void)
568*f6dc9357SAndroid Build Coastguard Worker {
569*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_COMPILER_SHA512_SUPPORTED
570*f6dc9357SAndroid Build Coastguard Worker SHA512_FUNC_UPDATE_BLOCKS f, f_hw;
571*f6dc9357SAndroid Build Coastguard Worker f = Sha512_UpdateBlocks;
572*f6dc9357SAndroid Build Coastguard Worker f_hw = NULL;
573*f6dc9357SAndroid Build Coastguard Worker #ifdef MY_CPU_X86_OR_AMD64
574*f6dc9357SAndroid Build Coastguard Worker if (CPU_IsSupported_SHA512()
575*f6dc9357SAndroid Build Coastguard Worker && CPU_IsSupported_AVX2()
576*f6dc9357SAndroid Build Coastguard Worker )
577*f6dc9357SAndroid Build Coastguard Worker #else
578*f6dc9357SAndroid Build Coastguard Worker if (CPU_IsSupported_SHA512())
579*f6dc9357SAndroid Build Coastguard Worker #endif
580*f6dc9357SAndroid Build Coastguard Worker {
581*f6dc9357SAndroid Build Coastguard Worker // printf("\n========== HW SHA512 ======== \n");
582*f6dc9357SAndroid Build Coastguard Worker f = f_hw = Sha512_UpdateBlocks_HW;
583*f6dc9357SAndroid Build Coastguard Worker }
584*f6dc9357SAndroid Build Coastguard Worker g_SHA512_FUNC_UPDATE_BLOCKS = f;
585*f6dc9357SAndroid Build Coastguard Worker g_SHA512_FUNC_UPDATE_BLOCKS_HW = f_hw;
586*f6dc9357SAndroid Build Coastguard Worker #endif
587*f6dc9357SAndroid Build Coastguard Worker }
588*f6dc9357SAndroid Build Coastguard Worker
589*f6dc9357SAndroid Build Coastguard Worker
590*f6dc9357SAndroid Build Coastguard Worker #undef K
591*f6dc9357SAndroid Build Coastguard Worker #undef S0
592*f6dc9357SAndroid Build Coastguard Worker #undef S1
593*f6dc9357SAndroid Build Coastguard Worker #undef s0
594*f6dc9357SAndroid Build Coastguard Worker #undef s1
595*f6dc9357SAndroid Build Coastguard Worker #undef Ch
596*f6dc9357SAndroid Build Coastguard Worker #undef Maj
597*f6dc9357SAndroid Build Coastguard Worker #undef W_MAIN
598*f6dc9357SAndroid Build Coastguard Worker #undef W_PRE
599*f6dc9357SAndroid Build Coastguard Worker #undef w
600*f6dc9357SAndroid Build Coastguard Worker #undef blk2_main
601*f6dc9357SAndroid Build Coastguard Worker #undef blk2
602*f6dc9357SAndroid Build Coastguard Worker #undef T1
603*f6dc9357SAndroid Build Coastguard Worker #undef T4
604*f6dc9357SAndroid Build Coastguard Worker #undef T8
605*f6dc9357SAndroid Build Coastguard Worker #undef R1_PRE
606*f6dc9357SAndroid Build Coastguard Worker #undef R1_MAIN
607*f6dc9357SAndroid Build Coastguard Worker #undef R2_MAIN
608*f6dc9357SAndroid Build Coastguard Worker #undef R4
609*f6dc9357SAndroid Build Coastguard Worker #undef R4_PRE
610*f6dc9357SAndroid Build Coastguard Worker #undef R4_MAIN
611*f6dc9357SAndroid Build Coastguard Worker #undef R8
612*f6dc9357SAndroid Build Coastguard Worker #undef R8_PRE
613*f6dc9357SAndroid Build Coastguard Worker #undef R8_MAIN
614*f6dc9357SAndroid Build Coastguard Worker #undef STEP_PRE
615*f6dc9357SAndroid Build Coastguard Worker #undef STEP_MAIN
616*f6dc9357SAndroid Build Coastguard Worker #undef Z7_SHA512_BIG_W
617*f6dc9357SAndroid Build Coastguard Worker #undef Z7_SHA512_UNROLL
618*f6dc9357SAndroid Build Coastguard Worker #undef Z7_COMPILER_SHA512_SUPPORTED
619