xref: /aosp_15_r20/external/lzma/C/Sha256.c (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker /* Sha256.c -- SHA-256 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 "Sha256.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  >= 30800) \
15*f6dc9357SAndroid Build Coastguard Worker      || defined(Z7_APPLE_CLANG_VERSION) && (Z7_APPLE_CLANG_VERSION >= 50100) \
16*f6dc9357SAndroid Build Coastguard Worker      || defined(Z7_GCC_VERSION)         && (Z7_GCC_VERSION         >= 40900) \
17*f6dc9357SAndroid Build Coastguard Worker      || defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1600) \
18*f6dc9357SAndroid Build Coastguard Worker      || defined(_MSC_VER) && (_MSC_VER >= 1200)
19*f6dc9357SAndroid Build Coastguard Worker       #define Z7_COMPILER_SHA256_SUPPORTED
20*f6dc9357SAndroid Build Coastguard Worker   #endif
21*f6dc9357SAndroid Build Coastguard Worker #elif defined(MY_CPU_ARM_OR_ARM64) && defined(MY_CPU_LE)
22*f6dc9357SAndroid Build Coastguard Worker 
23*f6dc9357SAndroid Build Coastguard Worker   #if   defined(__ARM_FEATURE_SHA2) \
24*f6dc9357SAndroid Build Coastguard Worker      || defined(__ARM_FEATURE_CRYPTO)
25*f6dc9357SAndroid Build Coastguard Worker     #define Z7_COMPILER_SHA256_SUPPORTED
26*f6dc9357SAndroid Build Coastguard Worker   #else
27*f6dc9357SAndroid Build Coastguard Worker     #if  defined(MY_CPU_ARM64) \
28*f6dc9357SAndroid Build Coastguard Worker       || defined(__ARM_ARCH) && (__ARM_ARCH >= 4) \
29*f6dc9357SAndroid Build Coastguard Worker       || defined(Z7_MSC_VER_ORIGINAL)
30*f6dc9357SAndroid Build Coastguard Worker     #if  defined(__ARM_FP) && \
31*f6dc9357SAndroid Build Coastguard Worker           (   defined(Z7_CLANG_VERSION) && (Z7_CLANG_VERSION >= 30800) \
32*f6dc9357SAndroid Build Coastguard Worker            || defined(__GNUC__) && (__GNUC__ >= 6) \
33*f6dc9357SAndroid Build Coastguard Worker           ) \
34*f6dc9357SAndroid Build Coastguard Worker       || defined(Z7_MSC_VER_ORIGINAL) && (_MSC_VER >= 1910)
35*f6dc9357SAndroid Build Coastguard Worker     #if  defined(MY_CPU_ARM64) \
36*f6dc9357SAndroid Build Coastguard Worker       || !defined(Z7_CLANG_VERSION) \
37*f6dc9357SAndroid Build Coastguard Worker       || defined(__ARM_NEON) && \
38*f6dc9357SAndroid Build Coastguard Worker           (Z7_CLANG_VERSION < 170000 || \
39*f6dc9357SAndroid Build Coastguard Worker            Z7_CLANG_VERSION > 170001)
40*f6dc9357SAndroid Build Coastguard Worker       #define Z7_COMPILER_SHA256_SUPPORTED
41*f6dc9357SAndroid Build Coastguard Worker     #endif
42*f6dc9357SAndroid Build Coastguard Worker     #endif
43*f6dc9357SAndroid Build Coastguard Worker     #endif
44*f6dc9357SAndroid Build Coastguard Worker   #endif
45*f6dc9357SAndroid Build Coastguard Worker #endif
46*f6dc9357SAndroid Build Coastguard Worker 
47*f6dc9357SAndroid Build Coastguard Worker void Z7_FASTCALL Sha256_UpdateBlocks(UInt32 state[8], const Byte *data, size_t numBlocks);
48*f6dc9357SAndroid Build Coastguard Worker 
49*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_COMPILER_SHA256_SUPPORTED
50*f6dc9357SAndroid Build Coastguard Worker   void Z7_FASTCALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks);
51*f6dc9357SAndroid Build Coastguard Worker 
52*f6dc9357SAndroid Build Coastguard Worker   static SHA256_FUNC_UPDATE_BLOCKS g_SHA256_FUNC_UPDATE_BLOCKS = Sha256_UpdateBlocks;
53*f6dc9357SAndroid Build Coastguard Worker   static SHA256_FUNC_UPDATE_BLOCKS g_SHA256_FUNC_UPDATE_BLOCKS_HW;
54*f6dc9357SAndroid Build Coastguard Worker 
55*f6dc9357SAndroid Build Coastguard Worker   #define SHA256_UPDATE_BLOCKS(p) p->v.vars.func_UpdateBlocks
56*f6dc9357SAndroid Build Coastguard Worker #else
57*f6dc9357SAndroid Build Coastguard Worker   #define SHA256_UPDATE_BLOCKS(p) Sha256_UpdateBlocks
58*f6dc9357SAndroid Build Coastguard Worker #endif
59*f6dc9357SAndroid Build Coastguard Worker 
60*f6dc9357SAndroid Build Coastguard Worker 
Sha256_SetFunction(CSha256 * p,unsigned algo)61*f6dc9357SAndroid Build Coastguard Worker BoolInt Sha256_SetFunction(CSha256 *p, unsigned algo)
62*f6dc9357SAndroid Build Coastguard Worker {
63*f6dc9357SAndroid Build Coastguard Worker   SHA256_FUNC_UPDATE_BLOCKS func = Sha256_UpdateBlocks;
64*f6dc9357SAndroid Build Coastguard Worker 
65*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_COMPILER_SHA256_SUPPORTED
66*f6dc9357SAndroid Build Coastguard Worker     if (algo != SHA256_ALGO_SW)
67*f6dc9357SAndroid Build Coastguard Worker     {
68*f6dc9357SAndroid Build Coastguard Worker       if (algo == SHA256_ALGO_DEFAULT)
69*f6dc9357SAndroid Build Coastguard Worker         func = g_SHA256_FUNC_UPDATE_BLOCKS;
70*f6dc9357SAndroid Build Coastguard Worker       else
71*f6dc9357SAndroid Build Coastguard Worker       {
72*f6dc9357SAndroid Build Coastguard Worker         if (algo != SHA256_ALGO_HW)
73*f6dc9357SAndroid Build Coastguard Worker           return False;
74*f6dc9357SAndroid Build Coastguard Worker         func = g_SHA256_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 #ifdef Z7_SFX
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_SHA256_UNROLL
98*f6dc9357SAndroid Build Coastguard Worker #endif
99*f6dc9357SAndroid Build Coastguard Worker 
100*f6dc9357SAndroid Build Coastguard Worker #undef Z7_SHA256_BIG_W
101*f6dc9357SAndroid Build Coastguard Worker #if STEP_MAIN != 16
102*f6dc9357SAndroid Build Coastguard Worker   #define Z7_SHA256_BIG_W
103*f6dc9357SAndroid Build Coastguard Worker #endif
104*f6dc9357SAndroid Build Coastguard Worker 
105*f6dc9357SAndroid Build Coastguard Worker 
106*f6dc9357SAndroid Build Coastguard Worker 
107*f6dc9357SAndroid Build Coastguard Worker 
Sha256_InitState(CSha256 * p)108*f6dc9357SAndroid Build Coastguard Worker void Sha256_InitState(CSha256 *p)
109*f6dc9357SAndroid Build Coastguard Worker {
110*f6dc9357SAndroid Build Coastguard Worker   p->v.vars.count = 0;
111*f6dc9357SAndroid Build Coastguard Worker   p->state[0] = 0x6a09e667;
112*f6dc9357SAndroid Build Coastguard Worker   p->state[1] = 0xbb67ae85;
113*f6dc9357SAndroid Build Coastguard Worker   p->state[2] = 0x3c6ef372;
114*f6dc9357SAndroid Build Coastguard Worker   p->state[3] = 0xa54ff53a;
115*f6dc9357SAndroid Build Coastguard Worker   p->state[4] = 0x510e527f;
116*f6dc9357SAndroid Build Coastguard Worker   p->state[5] = 0x9b05688c;
117*f6dc9357SAndroid Build Coastguard Worker   p->state[6] = 0x1f83d9ab;
118*f6dc9357SAndroid Build Coastguard Worker   p->state[7] = 0x5be0cd19;
119*f6dc9357SAndroid Build Coastguard Worker }
120*f6dc9357SAndroid Build Coastguard Worker 
121*f6dc9357SAndroid Build Coastguard Worker 
122*f6dc9357SAndroid Build Coastguard Worker 
123*f6dc9357SAndroid Build Coastguard Worker 
124*f6dc9357SAndroid Build Coastguard Worker 
125*f6dc9357SAndroid Build Coastguard Worker 
126*f6dc9357SAndroid Build Coastguard Worker 
127*f6dc9357SAndroid Build Coastguard Worker 
Sha256_Init(CSha256 * p)128*f6dc9357SAndroid Build Coastguard Worker void Sha256_Init(CSha256 *p)
129*f6dc9357SAndroid Build Coastguard Worker {
130*f6dc9357SAndroid Build Coastguard Worker   p->v.vars.func_UpdateBlocks =
131*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_COMPILER_SHA256_SUPPORTED
132*f6dc9357SAndroid Build Coastguard Worker       g_SHA256_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   Sha256_InitState(p);
137*f6dc9357SAndroid Build Coastguard Worker }
138*f6dc9357SAndroid Build Coastguard Worker 
139*f6dc9357SAndroid Build Coastguard Worker #define S0(x) (rotrFixed(x, 2) ^ rotrFixed(x,13) ^ rotrFixed(x,22))
140*f6dc9357SAndroid Build Coastguard Worker #define S1(x) (rotrFixed(x, 6) ^ rotrFixed(x,11) ^ rotrFixed(x,25))
141*f6dc9357SAndroid Build Coastguard Worker #define s0(x) (rotrFixed(x, 7) ^ rotrFixed(x,18) ^ (x >> 3))
142*f6dc9357SAndroid Build Coastguard Worker #define s1(x) (rotrFixed(x,17) ^ rotrFixed(x,19) ^ (x >>10))
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)] = GetBe32(data + ((size_t)(j) + i) * 4))
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_SHA256_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_SHA256_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_SHA256_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 UInt32 SHA256_K_ARRAY[64];
233*f6dc9357SAndroid Build Coastguard Worker MY_ALIGN(64) const UInt32 SHA256_K_ARRAY[64] = {
234*f6dc9357SAndroid Build Coastguard Worker   0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
235*f6dc9357SAndroid Build Coastguard Worker   0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
236*f6dc9357SAndroid Build Coastguard Worker   0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
237*f6dc9357SAndroid Build Coastguard Worker   0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
238*f6dc9357SAndroid Build Coastguard Worker   0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
239*f6dc9357SAndroid Build Coastguard Worker   0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
240*f6dc9357SAndroid Build Coastguard Worker   0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
241*f6dc9357SAndroid Build Coastguard Worker   0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
242*f6dc9357SAndroid Build Coastguard Worker   0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
243*f6dc9357SAndroid Build Coastguard Worker   0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
244*f6dc9357SAndroid Build Coastguard Worker   0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
245*f6dc9357SAndroid Build Coastguard Worker   0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
246*f6dc9357SAndroid Build Coastguard Worker   0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
247*f6dc9357SAndroid Build Coastguard Worker   0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
248*f6dc9357SAndroid Build Coastguard Worker   0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
249*f6dc9357SAndroid Build Coastguard Worker   0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
250*f6dc9357SAndroid Build Coastguard Worker };
251*f6dc9357SAndroid Build Coastguard Worker 
252*f6dc9357SAndroid Build Coastguard Worker 
253*f6dc9357SAndroid Build Coastguard Worker 
254*f6dc9357SAndroid Build Coastguard Worker 
255*f6dc9357SAndroid Build Coastguard Worker 
256*f6dc9357SAndroid Build Coastguard Worker #define K SHA256_K_ARRAY
257*f6dc9357SAndroid Build Coastguard Worker 
258*f6dc9357SAndroid Build Coastguard Worker Z7_NO_INLINE
Sha256_UpdateBlocks(UInt32 state[8],const Byte * data,size_t numBlocks)259*f6dc9357SAndroid Build Coastguard Worker void Z7_FASTCALL Sha256_UpdateBlocks(UInt32 state[8], const Byte *data, size_t numBlocks)
260*f6dc9357SAndroid Build Coastguard Worker {
261*f6dc9357SAndroid Build Coastguard Worker   UInt32 W
262*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_SHA256_BIG_W
263*f6dc9357SAndroid Build Coastguard Worker       [64];
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   UInt32 a,b,c,d,e,f,g,h;
269*f6dc9357SAndroid Build Coastguard Worker #if !defined(Z7_SHA256_UNROLL) || (STEP_MAIN <= 4) || (STEP_PRE <= 4)
270*f6dc9357SAndroid Build Coastguard Worker   UInt32 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 < 64; j += STEP_MAIN)
315*f6dc9357SAndroid Build Coastguard Worker   {
316*f6dc9357SAndroid Build Coastguard Worker     #if defined(Z7_SHA256_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 += SHA256_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 Sha256_UpdateBlock(p) SHA256_UPDATE_BLOCKS(p)(p->state, p->buffer, 1)
365*f6dc9357SAndroid Build Coastguard Worker 
Sha256_Update(CSha256 * p,const Byte * data,size_t size)366*f6dc9357SAndroid Build Coastguard Worker void Sha256_Update(CSha256 *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 & (SHA256_BLOCK_SIZE - 1);
372*f6dc9357SAndroid Build Coastguard Worker     const unsigned num = SHA256_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       Sha256_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 >> 6;
389*f6dc9357SAndroid Build Coastguard Worker     // if (numBlocks)
390*f6dc9357SAndroid Build Coastguard Worker     SHA256_UPDATE_BLOCKS(p)(p->state, data, numBlocks);
391*f6dc9357SAndroid Build Coastguard Worker     size &= SHA256_BLOCK_SIZE - 1;
392*f6dc9357SAndroid Build Coastguard Worker     if (size == 0)
393*f6dc9357SAndroid Build Coastguard Worker       return;
394*f6dc9357SAndroid Build Coastguard Worker     data += (numBlocks << 6);
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 
Sha256_Final(CSha256 * p,Byte * digest)400*f6dc9357SAndroid Build Coastguard Worker void Sha256_Final(CSha256 *p, Byte *digest)
401*f6dc9357SAndroid Build Coastguard Worker {
402*f6dc9357SAndroid Build Coastguard Worker   unsigned pos = (unsigned)p->v.vars.count & (SHA256_BLOCK_SIZE - 1);
403*f6dc9357SAndroid Build Coastguard Worker   p->buffer[pos++] = 0x80;
404*f6dc9357SAndroid Build Coastguard Worker   if (pos > (SHA256_BLOCK_SIZE - 4 * 2))
405*f6dc9357SAndroid Build Coastguard Worker   {
406*f6dc9357SAndroid Build Coastguard Worker     while (pos != SHA256_BLOCK_SIZE) { p->buffer[pos++] = 0; }
407*f6dc9357SAndroid Build Coastguard Worker     // memset(&p->buf.buffer[pos], 0, SHA256_BLOCK_SIZE - pos);
408*f6dc9357SAndroid Build Coastguard Worker     Sha256_UpdateBlock(p);
409*f6dc9357SAndroid Build Coastguard Worker     pos = 0;
410*f6dc9357SAndroid Build Coastguard Worker   }
411*f6dc9357SAndroid Build Coastguard Worker   memset(&p->buffer[pos], 0, (SHA256_BLOCK_SIZE - 4 * 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     SetBe32(p->buffer + SHA256_BLOCK_SIZE - 4 * 2, (UInt32)(numBits >> 32))
415*f6dc9357SAndroid Build Coastguard Worker     SetBe32(p->buffer + SHA256_BLOCK_SIZE - 4 * 1, (UInt32)(numBits))
416*f6dc9357SAndroid Build Coastguard Worker   }
417*f6dc9357SAndroid Build Coastguard Worker   Sha256_UpdateBlock(p);
418*f6dc9357SAndroid Build Coastguard Worker #if 1 && defined(MY_CPU_BE)
419*f6dc9357SAndroid Build Coastguard Worker   memcpy(digest, p->state, SHA256_DIGEST_SIZE);
420*f6dc9357SAndroid Build Coastguard Worker #else
421*f6dc9357SAndroid Build Coastguard Worker   {
422*f6dc9357SAndroid Build Coastguard Worker     unsigned i;
423*f6dc9357SAndroid Build Coastguard Worker     for (i = 0; i < 8; i += 2)
424*f6dc9357SAndroid Build Coastguard Worker     {
425*f6dc9357SAndroid Build Coastguard Worker       const UInt32 v0 = p->state[i];
426*f6dc9357SAndroid Build Coastguard Worker       const UInt32 v1 = p->state[(size_t)i + 1];
427*f6dc9357SAndroid Build Coastguard Worker       SetBe32(digest    , v0)
428*f6dc9357SAndroid Build Coastguard Worker       SetBe32(digest + 4, v1)
429*f6dc9357SAndroid Build Coastguard Worker       digest += 4 * 2;
430*f6dc9357SAndroid Build Coastguard Worker     }
431*f6dc9357SAndroid Build Coastguard Worker   }
432*f6dc9357SAndroid Build Coastguard Worker 
433*f6dc9357SAndroid Build Coastguard Worker 
434*f6dc9357SAndroid Build Coastguard Worker 
435*f6dc9357SAndroid Build Coastguard Worker 
436*f6dc9357SAndroid Build Coastguard Worker #endif
437*f6dc9357SAndroid Build Coastguard Worker   Sha256_InitState(p);
438*f6dc9357SAndroid Build Coastguard Worker }
439*f6dc9357SAndroid Build Coastguard Worker 
440*f6dc9357SAndroid Build Coastguard Worker 
Sha256Prepare(void)441*f6dc9357SAndroid Build Coastguard Worker void Sha256Prepare(void)
442*f6dc9357SAndroid Build Coastguard Worker {
443*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_COMPILER_SHA256_SUPPORTED
444*f6dc9357SAndroid Build Coastguard Worker   SHA256_FUNC_UPDATE_BLOCKS f, f_hw;
445*f6dc9357SAndroid Build Coastguard Worker   f = Sha256_UpdateBlocks;
446*f6dc9357SAndroid Build Coastguard Worker   f_hw = NULL;
447*f6dc9357SAndroid Build Coastguard Worker #ifdef MY_CPU_X86_OR_AMD64
448*f6dc9357SAndroid Build Coastguard Worker   if (CPU_IsSupported_SHA()
449*f6dc9357SAndroid Build Coastguard Worker       && CPU_IsSupported_SSSE3()
450*f6dc9357SAndroid Build Coastguard Worker       )
451*f6dc9357SAndroid Build Coastguard Worker #else
452*f6dc9357SAndroid Build Coastguard Worker   if (CPU_IsSupported_SHA2())
453*f6dc9357SAndroid Build Coastguard Worker #endif
454*f6dc9357SAndroid Build Coastguard Worker   {
455*f6dc9357SAndroid Build Coastguard Worker     // printf("\n========== HW SHA256 ======== \n");
456*f6dc9357SAndroid Build Coastguard Worker     f = f_hw = Sha256_UpdateBlocks_HW;
457*f6dc9357SAndroid Build Coastguard Worker   }
458*f6dc9357SAndroid Build Coastguard Worker   g_SHA256_FUNC_UPDATE_BLOCKS    = f;
459*f6dc9357SAndroid Build Coastguard Worker   g_SHA256_FUNC_UPDATE_BLOCKS_HW = f_hw;
460*f6dc9357SAndroid Build Coastguard Worker #endif
461*f6dc9357SAndroid Build Coastguard Worker }
462*f6dc9357SAndroid Build Coastguard Worker 
463*f6dc9357SAndroid Build Coastguard Worker #undef U64C
464*f6dc9357SAndroid Build Coastguard Worker #undef K
465*f6dc9357SAndroid Build Coastguard Worker #undef S0
466*f6dc9357SAndroid Build Coastguard Worker #undef S1
467*f6dc9357SAndroid Build Coastguard Worker #undef s0
468*f6dc9357SAndroid Build Coastguard Worker #undef s1
469*f6dc9357SAndroid Build Coastguard Worker #undef Ch
470*f6dc9357SAndroid Build Coastguard Worker #undef Maj
471*f6dc9357SAndroid Build Coastguard Worker #undef W_MAIN
472*f6dc9357SAndroid Build Coastguard Worker #undef W_PRE
473*f6dc9357SAndroid Build Coastguard Worker #undef w
474*f6dc9357SAndroid Build Coastguard Worker #undef blk2_main
475*f6dc9357SAndroid Build Coastguard Worker #undef blk2
476*f6dc9357SAndroid Build Coastguard Worker #undef T1
477*f6dc9357SAndroid Build Coastguard Worker #undef T4
478*f6dc9357SAndroid Build Coastguard Worker #undef T8
479*f6dc9357SAndroid Build Coastguard Worker #undef R1_PRE
480*f6dc9357SAndroid Build Coastguard Worker #undef R1_MAIN
481*f6dc9357SAndroid Build Coastguard Worker #undef R2_MAIN
482*f6dc9357SAndroid Build Coastguard Worker #undef R4
483*f6dc9357SAndroid Build Coastguard Worker #undef R4_PRE
484*f6dc9357SAndroid Build Coastguard Worker #undef R4_MAIN
485*f6dc9357SAndroid Build Coastguard Worker #undef R8
486*f6dc9357SAndroid Build Coastguard Worker #undef R8_PRE
487*f6dc9357SAndroid Build Coastguard Worker #undef R8_MAIN
488*f6dc9357SAndroid Build Coastguard Worker #undef STEP_PRE
489*f6dc9357SAndroid Build Coastguard Worker #undef STEP_MAIN
490*f6dc9357SAndroid Build Coastguard Worker #undef Z7_SHA256_BIG_W
491*f6dc9357SAndroid Build Coastguard Worker #undef Z7_SHA256_UNROLL
492*f6dc9357SAndroid Build Coastguard Worker #undef Z7_COMPILER_SHA256_SUPPORTED
493