xref: /aosp_15_r20/external/lzma/C/Sha1.c (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker /* Sha1.c -- SHA-1 Hash
2*f6dc9357SAndroid Build Coastguard Worker : Igor Pavlov : Public domain
3*f6dc9357SAndroid Build Coastguard Worker This code is based on public domain code of Steve Reid 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 "Sha1.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_SHA1_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    && (!defined(Z7_MSC_VER_ORIGINAL) || (_MSC_VER >= 1929) && (_MSC_FULL_VER >= 192930037))
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_SHA1_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_SHA1_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 Sha1_UpdateBlocks(UInt32 state[5], const Byte *data, size_t numBlocks);
48*f6dc9357SAndroid Build Coastguard Worker 
49*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_COMPILER_SHA1_SUPPORTED
50*f6dc9357SAndroid Build Coastguard Worker   void Z7_FASTCALL Sha1_UpdateBlocks_HW(UInt32 state[5], const Byte *data, size_t numBlocks);
51*f6dc9357SAndroid Build Coastguard Worker 
52*f6dc9357SAndroid Build Coastguard Worker   static SHA1_FUNC_UPDATE_BLOCKS g_SHA1_FUNC_UPDATE_BLOCKS = Sha1_UpdateBlocks;
53*f6dc9357SAndroid Build Coastguard Worker   static SHA1_FUNC_UPDATE_BLOCKS g_SHA1_FUNC_UPDATE_BLOCKS_HW;
54*f6dc9357SAndroid Build Coastguard Worker 
55*f6dc9357SAndroid Build Coastguard Worker   #define SHA1_UPDATE_BLOCKS(p) p->v.vars.func_UpdateBlocks
56*f6dc9357SAndroid Build Coastguard Worker #else
57*f6dc9357SAndroid Build Coastguard Worker   #define SHA1_UPDATE_BLOCKS(p) Sha1_UpdateBlocks
58*f6dc9357SAndroid Build Coastguard Worker #endif
59*f6dc9357SAndroid Build Coastguard Worker 
60*f6dc9357SAndroid Build Coastguard Worker 
Sha1_SetFunction(CSha1 * p,unsigned algo)61*f6dc9357SAndroid Build Coastguard Worker BoolInt Sha1_SetFunction(CSha1 *p, unsigned algo)
62*f6dc9357SAndroid Build Coastguard Worker {
63*f6dc9357SAndroid Build Coastguard Worker   SHA1_FUNC_UPDATE_BLOCKS func = Sha1_UpdateBlocks;
64*f6dc9357SAndroid Build Coastguard Worker 
65*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_COMPILER_SHA1_SUPPORTED
66*f6dc9357SAndroid Build Coastguard Worker     if (algo != SHA1_ALGO_SW)
67*f6dc9357SAndroid Build Coastguard Worker     {
68*f6dc9357SAndroid Build Coastguard Worker       if (algo == SHA1_ALGO_DEFAULT)
69*f6dc9357SAndroid Build Coastguard Worker         func = g_SHA1_FUNC_UPDATE_BLOCKS;
70*f6dc9357SAndroid Build Coastguard Worker       else
71*f6dc9357SAndroid Build Coastguard Worker       {
72*f6dc9357SAndroid Build Coastguard Worker         if (algo != SHA1_ALGO_HW)
73*f6dc9357SAndroid Build Coastguard Worker           return False;
74*f6dc9357SAndroid Build Coastguard Worker         func = g_SHA1_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 // #define Z7_SHA1_UNROLL
91*f6dc9357SAndroid Build Coastguard Worker 
92*f6dc9357SAndroid Build Coastguard Worker // allowed unroll steps: (1, 2, 4, 5, 20)
93*f6dc9357SAndroid Build Coastguard Worker 
94*f6dc9357SAndroid Build Coastguard Worker #undef Z7_SHA1_BIG_W
95*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_SHA1_UNROLL
96*f6dc9357SAndroid Build Coastguard Worker   #define STEP_PRE  20
97*f6dc9357SAndroid Build Coastguard Worker   #define STEP_MAIN 20
98*f6dc9357SAndroid Build Coastguard Worker #else
99*f6dc9357SAndroid Build Coastguard Worker   #define Z7_SHA1_BIG_W
100*f6dc9357SAndroid Build Coastguard Worker   #define STEP_PRE  5
101*f6dc9357SAndroid Build Coastguard Worker   #define STEP_MAIN 5
102*f6dc9357SAndroid Build Coastguard Worker #endif
103*f6dc9357SAndroid Build Coastguard Worker 
104*f6dc9357SAndroid Build Coastguard Worker 
105*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_SHA1_BIG_W
106*f6dc9357SAndroid Build Coastguard Worker   #define kNumW 80
107*f6dc9357SAndroid Build Coastguard Worker   #define w(i) W[i]
108*f6dc9357SAndroid Build Coastguard Worker #else
109*f6dc9357SAndroid Build Coastguard Worker   #define kNumW 16
110*f6dc9357SAndroid Build Coastguard Worker   #define w(i) W[(i)&15]
111*f6dc9357SAndroid Build Coastguard Worker #endif
112*f6dc9357SAndroid Build Coastguard Worker 
113*f6dc9357SAndroid Build Coastguard Worker #define w0(i) (W[i] = GetBe32(data + (size_t)(i) * 4))
114*f6dc9357SAndroid Build Coastguard Worker #define w1(i) (w(i) = rotlFixed(w((size_t)(i)-3) ^ w((size_t)(i)-8) ^ w((size_t)(i)-14) ^ w((size_t)(i)-16), 1))
115*f6dc9357SAndroid Build Coastguard Worker 
116*f6dc9357SAndroid Build Coastguard Worker #define f0(x,y,z)  ( 0x5a827999 + (z^(x&(y^z))) )
117*f6dc9357SAndroid Build Coastguard Worker #define f1(x,y,z)  ( 0x6ed9eba1 + (x^y^z) )
118*f6dc9357SAndroid Build Coastguard Worker #define f2(x,y,z)  ( 0x8f1bbcdc + ((x&y)|(z&(x|y))) )
119*f6dc9357SAndroid Build Coastguard Worker #define f3(x,y,z)  ( 0xca62c1d6 + (x^y^z) )
120*f6dc9357SAndroid Build Coastguard Worker 
121*f6dc9357SAndroid Build Coastguard Worker /*
122*f6dc9357SAndroid Build Coastguard Worker #define T1(fx, ww) \
123*f6dc9357SAndroid Build Coastguard Worker     tmp = e + fx(b,c,d) + ww + rotlFixed(a, 5); \
124*f6dc9357SAndroid Build Coastguard Worker     e = d; \
125*f6dc9357SAndroid Build Coastguard Worker     d = c; \
126*f6dc9357SAndroid Build Coastguard Worker     c = rotlFixed(b, 30); \
127*f6dc9357SAndroid Build Coastguard Worker     b = a; \
128*f6dc9357SAndroid Build Coastguard Worker     a = tmp; \
129*f6dc9357SAndroid Build Coastguard Worker */
130*f6dc9357SAndroid Build Coastguard Worker 
131*f6dc9357SAndroid Build Coastguard Worker #define T5(a,b,c,d,e, fx, ww) \
132*f6dc9357SAndroid Build Coastguard Worker     e += fx(b,c,d) + ww + rotlFixed(a, 5); \
133*f6dc9357SAndroid Build Coastguard Worker     b = rotlFixed(b, 30); \
134*f6dc9357SAndroid Build Coastguard Worker 
135*f6dc9357SAndroid Build Coastguard Worker 
136*f6dc9357SAndroid Build Coastguard Worker /*
137*f6dc9357SAndroid Build Coastguard Worker #define R1(i, fx, wx) \
138*f6dc9357SAndroid Build Coastguard Worker     T1 ( fx, wx(i)); \
139*f6dc9357SAndroid Build Coastguard Worker 
140*f6dc9357SAndroid Build Coastguard Worker #define R2(i, fx, wx) \
141*f6dc9357SAndroid Build Coastguard Worker     R1 ( (i)    , fx, wx); \
142*f6dc9357SAndroid Build Coastguard Worker     R1 ( (i) + 1, fx, wx); \
143*f6dc9357SAndroid Build Coastguard Worker 
144*f6dc9357SAndroid Build Coastguard Worker #define R4(i, fx, wx) \
145*f6dc9357SAndroid Build Coastguard Worker     R2 ( (i)    , fx, wx); \
146*f6dc9357SAndroid Build Coastguard Worker     R2 ( (i) + 2, fx, wx); \
147*f6dc9357SAndroid Build Coastguard Worker */
148*f6dc9357SAndroid Build Coastguard Worker 
149*f6dc9357SAndroid Build Coastguard Worker #define M5(i, fx, wx0, wx1) \
150*f6dc9357SAndroid Build Coastguard Worker     T5 ( a,b,c,d,e, fx, wx0((i)  ) ) \
151*f6dc9357SAndroid Build Coastguard Worker     T5 ( e,a,b,c,d, fx, wx1((i)+1) ) \
152*f6dc9357SAndroid Build Coastguard Worker     T5 ( d,e,a,b,c, fx, wx1((i)+2) ) \
153*f6dc9357SAndroid Build Coastguard Worker     T5 ( c,d,e,a,b, fx, wx1((i)+3) ) \
154*f6dc9357SAndroid Build Coastguard Worker     T5 ( b,c,d,e,a, fx, wx1((i)+4) ) \
155*f6dc9357SAndroid Build Coastguard Worker 
156*f6dc9357SAndroid Build Coastguard Worker #define R5(i, fx, wx) \
157*f6dc9357SAndroid Build Coastguard Worker     M5 ( i, fx, wx, wx) \
158*f6dc9357SAndroid Build Coastguard Worker 
159*f6dc9357SAndroid Build Coastguard Worker 
160*f6dc9357SAndroid Build Coastguard Worker #if STEP_PRE > 5
161*f6dc9357SAndroid Build Coastguard Worker 
162*f6dc9357SAndroid Build Coastguard Worker   #define R20_START \
163*f6dc9357SAndroid Build Coastguard Worker     R5 (  0, f0, w0) \
164*f6dc9357SAndroid Build Coastguard Worker     R5 (  5, f0, w0) \
165*f6dc9357SAndroid Build Coastguard Worker     R5 ( 10, f0, w0) \
166*f6dc9357SAndroid Build Coastguard Worker     M5 ( 15, f0, w0, w1) \
167*f6dc9357SAndroid Build Coastguard Worker 
168*f6dc9357SAndroid Build Coastguard Worker   #elif STEP_PRE == 5
169*f6dc9357SAndroid Build Coastguard Worker 
170*f6dc9357SAndroid Build Coastguard Worker   #define R20_START \
171*f6dc9357SAndroid Build Coastguard Worker     { size_t i; for (i = 0; i < 15; i += STEP_PRE) \
172*f6dc9357SAndroid Build Coastguard Worker       { R5(i, f0, w0) } } \
173*f6dc9357SAndroid Build Coastguard Worker     M5 ( 15, f0, w0, w1) \
174*f6dc9357SAndroid Build Coastguard Worker 
175*f6dc9357SAndroid Build Coastguard Worker #else
176*f6dc9357SAndroid Build Coastguard Worker 
177*f6dc9357SAndroid Build Coastguard Worker   #if STEP_PRE == 1
178*f6dc9357SAndroid Build Coastguard Worker     #define R_PRE R1
179*f6dc9357SAndroid Build Coastguard Worker   #elif STEP_PRE == 2
180*f6dc9357SAndroid Build Coastguard Worker     #define R_PRE R2
181*f6dc9357SAndroid Build Coastguard Worker   #elif STEP_PRE == 4
182*f6dc9357SAndroid Build Coastguard Worker     #define R_PRE R4
183*f6dc9357SAndroid Build Coastguard Worker   #endif
184*f6dc9357SAndroid Build Coastguard Worker 
185*f6dc9357SAndroid Build Coastguard Worker   #define R20_START \
186*f6dc9357SAndroid Build Coastguard Worker     { size_t i; for (i = 0; i < 16; i += STEP_PRE) \
187*f6dc9357SAndroid Build Coastguard Worker       { R_PRE(i, f0, w0) } } \
188*f6dc9357SAndroid Build Coastguard Worker     R4 ( 16, f0, w1) \
189*f6dc9357SAndroid Build Coastguard Worker 
190*f6dc9357SAndroid Build Coastguard Worker #endif
191*f6dc9357SAndroid Build Coastguard Worker 
192*f6dc9357SAndroid Build Coastguard Worker 
193*f6dc9357SAndroid Build Coastguard Worker 
194*f6dc9357SAndroid Build Coastguard Worker #if STEP_MAIN > 5
195*f6dc9357SAndroid Build Coastguard Worker 
196*f6dc9357SAndroid Build Coastguard Worker   #define R20(ii, fx) \
197*f6dc9357SAndroid Build Coastguard Worker     R5 ( (ii)     , fx, w1) \
198*f6dc9357SAndroid Build Coastguard Worker     R5 ( (ii) + 5 , fx, w1) \
199*f6dc9357SAndroid Build Coastguard Worker     R5 ( (ii) + 10, fx, w1) \
200*f6dc9357SAndroid Build Coastguard Worker     R5 ( (ii) + 15, fx, w1) \
201*f6dc9357SAndroid Build Coastguard Worker 
202*f6dc9357SAndroid Build Coastguard Worker #else
203*f6dc9357SAndroid Build Coastguard Worker 
204*f6dc9357SAndroid Build Coastguard Worker   #if STEP_MAIN == 1
205*f6dc9357SAndroid Build Coastguard Worker     #define R_MAIN R1
206*f6dc9357SAndroid Build Coastguard Worker   #elif STEP_MAIN == 2
207*f6dc9357SAndroid Build Coastguard Worker     #define R_MAIN R2
208*f6dc9357SAndroid Build Coastguard Worker   #elif STEP_MAIN == 4
209*f6dc9357SAndroid Build Coastguard Worker     #define R_MAIN R4
210*f6dc9357SAndroid Build Coastguard Worker   #elif STEP_MAIN == 5
211*f6dc9357SAndroid Build Coastguard Worker     #define R_MAIN R5
212*f6dc9357SAndroid Build Coastguard Worker   #endif
213*f6dc9357SAndroid Build Coastguard Worker 
214*f6dc9357SAndroid Build Coastguard Worker   #define R20(ii, fx)  \
215*f6dc9357SAndroid Build Coastguard Worker     { size_t i; for (i = (ii); i < (ii) + 20; i += STEP_MAIN) \
216*f6dc9357SAndroid Build Coastguard Worker       { R_MAIN(i, fx, w1) } } \
217*f6dc9357SAndroid Build Coastguard Worker 
218*f6dc9357SAndroid Build Coastguard Worker #endif
219*f6dc9357SAndroid Build Coastguard Worker 
220*f6dc9357SAndroid Build Coastguard Worker 
221*f6dc9357SAndroid Build Coastguard Worker 
Sha1_InitState(CSha1 * p)222*f6dc9357SAndroid Build Coastguard Worker void Sha1_InitState(CSha1 *p)
223*f6dc9357SAndroid Build Coastguard Worker {
224*f6dc9357SAndroid Build Coastguard Worker   p->v.vars.count = 0;
225*f6dc9357SAndroid Build Coastguard Worker   p->state[0] = 0x67452301;
226*f6dc9357SAndroid Build Coastguard Worker   p->state[1] = 0xEFCDAB89;
227*f6dc9357SAndroid Build Coastguard Worker   p->state[2] = 0x98BADCFE;
228*f6dc9357SAndroid Build Coastguard Worker   p->state[3] = 0x10325476;
229*f6dc9357SAndroid Build Coastguard Worker   p->state[4] = 0xC3D2E1F0;
230*f6dc9357SAndroid Build Coastguard Worker }
231*f6dc9357SAndroid Build Coastguard Worker 
Sha1_Init(CSha1 * p)232*f6dc9357SAndroid Build Coastguard Worker void Sha1_Init(CSha1 *p)
233*f6dc9357SAndroid Build Coastguard Worker {
234*f6dc9357SAndroid Build Coastguard Worker   p->v.vars.func_UpdateBlocks =
235*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_COMPILER_SHA1_SUPPORTED
236*f6dc9357SAndroid Build Coastguard Worker       g_SHA1_FUNC_UPDATE_BLOCKS;
237*f6dc9357SAndroid Build Coastguard Worker   #else
238*f6dc9357SAndroid Build Coastguard Worker       NULL;
239*f6dc9357SAndroid Build Coastguard Worker   #endif
240*f6dc9357SAndroid Build Coastguard Worker   Sha1_InitState(p);
241*f6dc9357SAndroid Build Coastguard Worker }
242*f6dc9357SAndroid Build Coastguard Worker 
243*f6dc9357SAndroid Build Coastguard Worker 
244*f6dc9357SAndroid Build Coastguard Worker Z7_NO_INLINE
Sha1_UpdateBlocks(UInt32 state[5],const Byte * data,size_t numBlocks)245*f6dc9357SAndroid Build Coastguard Worker void Z7_FASTCALL Sha1_UpdateBlocks(UInt32 state[5], const Byte *data, size_t numBlocks)
246*f6dc9357SAndroid Build Coastguard Worker {
247*f6dc9357SAndroid Build Coastguard Worker   UInt32 a, b, c, d, e;
248*f6dc9357SAndroid Build Coastguard Worker   UInt32 W[kNumW];
249*f6dc9357SAndroid Build Coastguard Worker 
250*f6dc9357SAndroid Build Coastguard Worker   if (numBlocks == 0)
251*f6dc9357SAndroid Build Coastguard Worker     return;
252*f6dc9357SAndroid Build Coastguard Worker 
253*f6dc9357SAndroid Build Coastguard Worker   a = state[0];
254*f6dc9357SAndroid Build Coastguard Worker   b = state[1];
255*f6dc9357SAndroid Build Coastguard Worker   c = state[2];
256*f6dc9357SAndroid Build Coastguard Worker   d = state[3];
257*f6dc9357SAndroid Build Coastguard Worker   e = state[4];
258*f6dc9357SAndroid Build Coastguard Worker 
259*f6dc9357SAndroid Build Coastguard Worker   do
260*f6dc9357SAndroid Build Coastguard Worker   {
261*f6dc9357SAndroid Build Coastguard Worker   #if STEP_PRE < 5 || STEP_MAIN < 5
262*f6dc9357SAndroid Build Coastguard Worker   UInt32 tmp;
263*f6dc9357SAndroid Build Coastguard Worker   #endif
264*f6dc9357SAndroid Build Coastguard Worker 
265*f6dc9357SAndroid Build Coastguard Worker   R20_START
266*f6dc9357SAndroid Build Coastguard Worker   R20(20, f1)
267*f6dc9357SAndroid Build Coastguard Worker   R20(40, f2)
268*f6dc9357SAndroid Build Coastguard Worker   R20(60, f3)
269*f6dc9357SAndroid Build Coastguard Worker 
270*f6dc9357SAndroid Build Coastguard Worker   a += state[0];
271*f6dc9357SAndroid Build Coastguard Worker   b += state[1];
272*f6dc9357SAndroid Build Coastguard Worker   c += state[2];
273*f6dc9357SAndroid Build Coastguard Worker   d += state[3];
274*f6dc9357SAndroid Build Coastguard Worker   e += state[4];
275*f6dc9357SAndroid Build Coastguard Worker 
276*f6dc9357SAndroid Build Coastguard Worker   state[0] = a;
277*f6dc9357SAndroid Build Coastguard Worker   state[1] = b;
278*f6dc9357SAndroid Build Coastguard Worker   state[2] = c;
279*f6dc9357SAndroid Build Coastguard Worker   state[3] = d;
280*f6dc9357SAndroid Build Coastguard Worker   state[4] = e;
281*f6dc9357SAndroid Build Coastguard Worker 
282*f6dc9357SAndroid Build Coastguard Worker   data += SHA1_BLOCK_SIZE;
283*f6dc9357SAndroid Build Coastguard Worker   }
284*f6dc9357SAndroid Build Coastguard Worker   while (--numBlocks);
285*f6dc9357SAndroid Build Coastguard Worker }
286*f6dc9357SAndroid Build Coastguard Worker 
287*f6dc9357SAndroid Build Coastguard Worker 
288*f6dc9357SAndroid Build Coastguard Worker #define Sha1_UpdateBlock(p) SHA1_UPDATE_BLOCKS(p)(p->state, p->buffer, 1)
289*f6dc9357SAndroid Build Coastguard Worker 
Sha1_Update(CSha1 * p,const Byte * data,size_t size)290*f6dc9357SAndroid Build Coastguard Worker void Sha1_Update(CSha1 *p, const Byte *data, size_t size)
291*f6dc9357SAndroid Build Coastguard Worker {
292*f6dc9357SAndroid Build Coastguard Worker   if (size == 0)
293*f6dc9357SAndroid Build Coastguard Worker     return;
294*f6dc9357SAndroid Build Coastguard Worker   {
295*f6dc9357SAndroid Build Coastguard Worker     const unsigned pos = (unsigned)p->v.vars.count & (SHA1_BLOCK_SIZE - 1);
296*f6dc9357SAndroid Build Coastguard Worker     const unsigned num = SHA1_BLOCK_SIZE - pos;
297*f6dc9357SAndroid Build Coastguard Worker     p->v.vars.count += size;
298*f6dc9357SAndroid Build Coastguard Worker     if (num > size)
299*f6dc9357SAndroid Build Coastguard Worker     {
300*f6dc9357SAndroid Build Coastguard Worker       memcpy(p->buffer + pos, data, size);
301*f6dc9357SAndroid Build Coastguard Worker       return;
302*f6dc9357SAndroid Build Coastguard Worker     }
303*f6dc9357SAndroid Build Coastguard Worker     if (pos != 0)
304*f6dc9357SAndroid Build Coastguard Worker     {
305*f6dc9357SAndroid Build Coastguard Worker       size -= num;
306*f6dc9357SAndroid Build Coastguard Worker       memcpy(p->buffer + pos, data, num);
307*f6dc9357SAndroid Build Coastguard Worker       data += num;
308*f6dc9357SAndroid Build Coastguard Worker       Sha1_UpdateBlock(p);
309*f6dc9357SAndroid Build Coastguard Worker     }
310*f6dc9357SAndroid Build Coastguard Worker   }
311*f6dc9357SAndroid Build Coastguard Worker   {
312*f6dc9357SAndroid Build Coastguard Worker     const size_t numBlocks = size >> 6;
313*f6dc9357SAndroid Build Coastguard Worker     // if (numBlocks)
314*f6dc9357SAndroid Build Coastguard Worker     SHA1_UPDATE_BLOCKS(p)(p->state, data, numBlocks);
315*f6dc9357SAndroid Build Coastguard Worker     size &= SHA1_BLOCK_SIZE - 1;
316*f6dc9357SAndroid Build Coastguard Worker     if (size == 0)
317*f6dc9357SAndroid Build Coastguard Worker       return;
318*f6dc9357SAndroid Build Coastguard Worker     data += (numBlocks << 6);
319*f6dc9357SAndroid Build Coastguard Worker     memcpy(p->buffer, data, size);
320*f6dc9357SAndroid Build Coastguard Worker   }
321*f6dc9357SAndroid Build Coastguard Worker }
322*f6dc9357SAndroid Build Coastguard Worker 
323*f6dc9357SAndroid Build Coastguard Worker 
Sha1_Final(CSha1 * p,Byte * digest)324*f6dc9357SAndroid Build Coastguard Worker void Sha1_Final(CSha1 *p, Byte *digest)
325*f6dc9357SAndroid Build Coastguard Worker {
326*f6dc9357SAndroid Build Coastguard Worker   unsigned pos = (unsigned)p->v.vars.count & (SHA1_BLOCK_SIZE - 1);
327*f6dc9357SAndroid Build Coastguard Worker   p->buffer[pos++] = 0x80;
328*f6dc9357SAndroid Build Coastguard Worker   if (pos > (SHA1_BLOCK_SIZE - 4 * 2))
329*f6dc9357SAndroid Build Coastguard Worker   {
330*f6dc9357SAndroid Build Coastguard Worker     while (pos != SHA1_BLOCK_SIZE) { p->buffer[pos++] = 0; }
331*f6dc9357SAndroid Build Coastguard Worker     // memset(&p->buf.buffer[pos], 0, SHA1_BLOCK_SIZE - pos);
332*f6dc9357SAndroid Build Coastguard Worker     Sha1_UpdateBlock(p);
333*f6dc9357SAndroid Build Coastguard Worker     pos = 0;
334*f6dc9357SAndroid Build Coastguard Worker   }
335*f6dc9357SAndroid Build Coastguard Worker   memset(&p->buffer[pos], 0, (SHA1_BLOCK_SIZE - 4 * 2) - pos);
336*f6dc9357SAndroid Build Coastguard Worker   {
337*f6dc9357SAndroid Build Coastguard Worker     const UInt64 numBits = p->v.vars.count << 3;
338*f6dc9357SAndroid Build Coastguard Worker     SetBe32(p->buffer + SHA1_BLOCK_SIZE - 4 * 2, (UInt32)(numBits >> 32))
339*f6dc9357SAndroid Build Coastguard Worker     SetBe32(p->buffer + SHA1_BLOCK_SIZE - 4 * 1, (UInt32)(numBits))
340*f6dc9357SAndroid Build Coastguard Worker   }
341*f6dc9357SAndroid Build Coastguard Worker   Sha1_UpdateBlock(p);
342*f6dc9357SAndroid Build Coastguard Worker 
343*f6dc9357SAndroid Build Coastguard Worker   SetBe32(digest,      p->state[0])
344*f6dc9357SAndroid Build Coastguard Worker   SetBe32(digest + 4,  p->state[1])
345*f6dc9357SAndroid Build Coastguard Worker   SetBe32(digest + 8,  p->state[2])
346*f6dc9357SAndroid Build Coastguard Worker   SetBe32(digest + 12, p->state[3])
347*f6dc9357SAndroid Build Coastguard Worker   SetBe32(digest + 16, p->state[4])
348*f6dc9357SAndroid Build Coastguard Worker 
349*f6dc9357SAndroid Build Coastguard Worker   Sha1_InitState(p);
350*f6dc9357SAndroid Build Coastguard Worker }
351*f6dc9357SAndroid Build Coastguard Worker 
352*f6dc9357SAndroid Build Coastguard Worker 
Sha1_PrepareBlock(const CSha1 * p,Byte * block,unsigned size)353*f6dc9357SAndroid Build Coastguard Worker void Sha1_PrepareBlock(const CSha1 *p, Byte *block, unsigned size)
354*f6dc9357SAndroid Build Coastguard Worker {
355*f6dc9357SAndroid Build Coastguard Worker   const UInt64 numBits = (p->v.vars.count + size) << 3;
356*f6dc9357SAndroid Build Coastguard Worker   SetBe32(&((UInt32 *)(void *)block)[SHA1_NUM_BLOCK_WORDS - 2], (UInt32)(numBits >> 32))
357*f6dc9357SAndroid Build Coastguard Worker   SetBe32(&((UInt32 *)(void *)block)[SHA1_NUM_BLOCK_WORDS - 1], (UInt32)(numBits))
358*f6dc9357SAndroid Build Coastguard Worker   // SetBe32((UInt32 *)(block + size), 0x80000000);
359*f6dc9357SAndroid Build Coastguard Worker   SetUi32((UInt32 *)(void *)(block + size), 0x80)
360*f6dc9357SAndroid Build Coastguard Worker   size += 4;
361*f6dc9357SAndroid Build Coastguard Worker   while (size != (SHA1_NUM_BLOCK_WORDS - 2) * 4)
362*f6dc9357SAndroid Build Coastguard Worker   {
363*f6dc9357SAndroid Build Coastguard Worker     *((UInt32 *)(void *)(block + size)) = 0;
364*f6dc9357SAndroid Build Coastguard Worker     size += 4;
365*f6dc9357SAndroid Build Coastguard Worker   }
366*f6dc9357SAndroid Build Coastguard Worker }
367*f6dc9357SAndroid Build Coastguard Worker 
Sha1_GetBlockDigest(const CSha1 * p,const Byte * data,Byte * destDigest)368*f6dc9357SAndroid Build Coastguard Worker void Sha1_GetBlockDigest(const CSha1 *p, const Byte *data, Byte *destDigest)
369*f6dc9357SAndroid Build Coastguard Worker {
370*f6dc9357SAndroid Build Coastguard Worker   MY_ALIGN (16)
371*f6dc9357SAndroid Build Coastguard Worker   UInt32 st[SHA1_NUM_DIGEST_WORDS];
372*f6dc9357SAndroid Build Coastguard Worker 
373*f6dc9357SAndroid Build Coastguard Worker   st[0] = p->state[0];
374*f6dc9357SAndroid Build Coastguard Worker   st[1] = p->state[1];
375*f6dc9357SAndroid Build Coastguard Worker   st[2] = p->state[2];
376*f6dc9357SAndroid Build Coastguard Worker   st[3] = p->state[3];
377*f6dc9357SAndroid Build Coastguard Worker   st[4] = p->state[4];
378*f6dc9357SAndroid Build Coastguard Worker 
379*f6dc9357SAndroid Build Coastguard Worker   SHA1_UPDATE_BLOCKS(p)(st, data, 1);
380*f6dc9357SAndroid Build Coastguard Worker 
381*f6dc9357SAndroid Build Coastguard Worker   SetBe32(destDigest + 0    , st[0])
382*f6dc9357SAndroid Build Coastguard Worker   SetBe32(destDigest + 1 * 4, st[1])
383*f6dc9357SAndroid Build Coastguard Worker   SetBe32(destDigest + 2 * 4, st[2])
384*f6dc9357SAndroid Build Coastguard Worker   SetBe32(destDigest + 3 * 4, st[3])
385*f6dc9357SAndroid Build Coastguard Worker   SetBe32(destDigest + 4 * 4, st[4])
386*f6dc9357SAndroid Build Coastguard Worker }
387*f6dc9357SAndroid Build Coastguard Worker 
388*f6dc9357SAndroid Build Coastguard Worker 
Sha1Prepare(void)389*f6dc9357SAndroid Build Coastguard Worker void Sha1Prepare(void)
390*f6dc9357SAndroid Build Coastguard Worker {
391*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_COMPILER_SHA1_SUPPORTED
392*f6dc9357SAndroid Build Coastguard Worker   SHA1_FUNC_UPDATE_BLOCKS f, f_hw;
393*f6dc9357SAndroid Build Coastguard Worker   f = Sha1_UpdateBlocks;
394*f6dc9357SAndroid Build Coastguard Worker   f_hw = NULL;
395*f6dc9357SAndroid Build Coastguard Worker #ifdef MY_CPU_X86_OR_AMD64
396*f6dc9357SAndroid Build Coastguard Worker   if (CPU_IsSupported_SHA()
397*f6dc9357SAndroid Build Coastguard Worker       && CPU_IsSupported_SSSE3()
398*f6dc9357SAndroid Build Coastguard Worker       )
399*f6dc9357SAndroid Build Coastguard Worker #else
400*f6dc9357SAndroid Build Coastguard Worker   if (CPU_IsSupported_SHA1())
401*f6dc9357SAndroid Build Coastguard Worker #endif
402*f6dc9357SAndroid Build Coastguard Worker   {
403*f6dc9357SAndroid Build Coastguard Worker     // printf("\n========== HW SHA1 ======== \n");
404*f6dc9357SAndroid Build Coastguard Worker #if 1 && defined(MY_CPU_ARM_OR_ARM64) && defined(Z7_MSC_VER_ORIGINAL) && (_MSC_FULL_VER < 192930037)
405*f6dc9357SAndroid Build Coastguard Worker     /* there was bug in MSVC compiler for ARM64 -O2 before version VS2019 16.10 (19.29.30037).
406*f6dc9357SAndroid Build Coastguard Worker        It generated incorrect SHA-1 code. */
407*f6dc9357SAndroid Build Coastguard Worker       #pragma message("== SHA1 code can work incorrectly with this compiler")
408*f6dc9357SAndroid Build Coastguard Worker       #error Stop_Compiling_MSC_Compiler_BUG_SHA1
409*f6dc9357SAndroid Build Coastguard Worker #endif
410*f6dc9357SAndroid Build Coastguard Worker       {
411*f6dc9357SAndroid Build Coastguard Worker         f = f_hw = Sha1_UpdateBlocks_HW;
412*f6dc9357SAndroid Build Coastguard Worker       }
413*f6dc9357SAndroid Build Coastguard Worker   }
414*f6dc9357SAndroid Build Coastguard Worker   g_SHA1_FUNC_UPDATE_BLOCKS    = f;
415*f6dc9357SAndroid Build Coastguard Worker   g_SHA1_FUNC_UPDATE_BLOCKS_HW = f_hw;
416*f6dc9357SAndroid Build Coastguard Worker #endif
417*f6dc9357SAndroid Build Coastguard Worker }
418*f6dc9357SAndroid Build Coastguard Worker 
419*f6dc9357SAndroid Build Coastguard Worker #undef kNumW
420*f6dc9357SAndroid Build Coastguard Worker #undef w
421*f6dc9357SAndroid Build Coastguard Worker #undef w0
422*f6dc9357SAndroid Build Coastguard Worker #undef w1
423*f6dc9357SAndroid Build Coastguard Worker #undef f0
424*f6dc9357SAndroid Build Coastguard Worker #undef f1
425*f6dc9357SAndroid Build Coastguard Worker #undef f2
426*f6dc9357SAndroid Build Coastguard Worker #undef f3
427*f6dc9357SAndroid Build Coastguard Worker #undef T1
428*f6dc9357SAndroid Build Coastguard Worker #undef T5
429*f6dc9357SAndroid Build Coastguard Worker #undef M5
430*f6dc9357SAndroid Build Coastguard Worker #undef R1
431*f6dc9357SAndroid Build Coastguard Worker #undef R2
432*f6dc9357SAndroid Build Coastguard Worker #undef R4
433*f6dc9357SAndroid Build Coastguard Worker #undef R5
434*f6dc9357SAndroid Build Coastguard Worker #undef R20_START
435*f6dc9357SAndroid Build Coastguard Worker #undef R_PRE
436*f6dc9357SAndroid Build Coastguard Worker #undef R_MAIN
437*f6dc9357SAndroid Build Coastguard Worker #undef STEP_PRE
438*f6dc9357SAndroid Build Coastguard Worker #undef STEP_MAIN
439*f6dc9357SAndroid Build Coastguard Worker #undef Z7_SHA1_BIG_W
440*f6dc9357SAndroid Build Coastguard Worker #undef Z7_SHA1_UNROLL
441*f6dc9357SAndroid Build Coastguard Worker #undef Z7_COMPILER_SHA1_SUPPORTED
442