xref: /aosp_15_r20/external/lzma/C/Blake2.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker /* Blake2.h -- BLAKE2sp Hash
2*f6dc9357SAndroid Build Coastguard Worker 2024-01-17 : Igor Pavlov : Public domain */
3*f6dc9357SAndroid Build Coastguard Worker 
4*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_BLAKE2_H
5*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_BLAKE2_H
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #include "7zTypes.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #if 0
10*f6dc9357SAndroid Build Coastguard Worker #include "Compiler.h"
11*f6dc9357SAndroid Build Coastguard Worker #include "CpuArch.h"
12*f6dc9357SAndroid Build Coastguard Worker #if defined(MY_CPU_X86_OR_AMD64)
13*f6dc9357SAndroid Build Coastguard Worker #if defined(__SSE2__) \
14*f6dc9357SAndroid Build Coastguard Worker     || defined(_MSC_VER) && _MSC_VER > 1200 \
15*f6dc9357SAndroid Build Coastguard Worker     || defined(Z7_GCC_VERSION) && (Z7_GCC_VERSION >= 30300) \
16*f6dc9357SAndroid Build Coastguard Worker     || defined(__clang__) \
17*f6dc9357SAndroid Build Coastguard Worker     || defined(__INTEL_COMPILER)
18*f6dc9357SAndroid Build Coastguard Worker #include <emmintrin.h> // SSE2
19*f6dc9357SAndroid Build Coastguard Worker #endif
20*f6dc9357SAndroid Build Coastguard Worker 
21*f6dc9357SAndroid Build Coastguard Worker #if defined(__AVX2__) \
22*f6dc9357SAndroid Build Coastguard Worker     || defined(Z7_GCC_VERSION) && (Z7_GCC_VERSION >= 40900) \
23*f6dc9357SAndroid Build Coastguard Worker     || defined(Z7_APPLE_CLANG_VERSION) && (Z7_APPLE_CLANG_VERSION >= 40600) \
24*f6dc9357SAndroid Build Coastguard Worker     || defined(Z7_LLVM_CLANG_VERSION) && (Z7_LLVM_CLANG_VERSION >= 30100) \
25*f6dc9357SAndroid Build Coastguard Worker     || defined(Z7_MSC_VER_ORIGINAL) && (Z7_MSC_VER_ORIGINAL >= 1800) \
26*f6dc9357SAndroid Build Coastguard Worker     || defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1400)
27*f6dc9357SAndroid Build Coastguard Worker #include <immintrin.h>
28*f6dc9357SAndroid Build Coastguard Worker #if defined(__clang__)
29*f6dc9357SAndroid Build Coastguard Worker #include <avxintrin.h>
30*f6dc9357SAndroid Build Coastguard Worker #include <avx2intrin.h>
31*f6dc9357SAndroid Build Coastguard Worker #endif
32*f6dc9357SAndroid Build Coastguard Worker #endif // avx2
33*f6dc9357SAndroid Build Coastguard Worker #endif // MY_CPU_X86_OR_AMD64
34*f6dc9357SAndroid Build Coastguard Worker #endif // 0
35*f6dc9357SAndroid Build Coastguard Worker 
36*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_BEGIN
37*f6dc9357SAndroid Build Coastguard Worker 
38*f6dc9357SAndroid Build Coastguard Worker #define Z7_BLAKE2S_BLOCK_SIZE         64
39*f6dc9357SAndroid Build Coastguard Worker #define Z7_BLAKE2S_DIGEST_SIZE        32
40*f6dc9357SAndroid Build Coastguard Worker #define Z7_BLAKE2SP_PARALLEL_DEGREE   8
41*f6dc9357SAndroid Build Coastguard Worker #define Z7_BLAKE2SP_NUM_STRUCT_WORDS  16
42*f6dc9357SAndroid Build Coastguard Worker 
43*f6dc9357SAndroid Build Coastguard Worker #if 1 || defined(Z7_BLAKE2SP_USE_FUNCTIONS)
44*f6dc9357SAndroid Build Coastguard Worker typedef void (Z7_FASTCALL *Z7_BLAKE2SP_FUNC_COMPRESS)(UInt32 *states, const Byte *data, const Byte *end);
45*f6dc9357SAndroid Build Coastguard Worker typedef void (Z7_FASTCALL *Z7_BLAKE2SP_FUNC_INIT)(UInt32 *states);
46*f6dc9357SAndroid Build Coastguard Worker #endif
47*f6dc9357SAndroid Build Coastguard Worker 
48*f6dc9357SAndroid Build Coastguard Worker // it's required that CBlake2sp is aligned for 32-bytes,
49*f6dc9357SAndroid Build Coastguard Worker // because the code can use unaligned access with sse and avx256.
50*f6dc9357SAndroid Build Coastguard Worker // but 64-bytes alignment can be better.
51*f6dc9357SAndroid Build Coastguard Worker MY_ALIGN(64)
52*f6dc9357SAndroid Build Coastguard Worker typedef struct
53*f6dc9357SAndroid Build Coastguard Worker {
54*f6dc9357SAndroid Build Coastguard Worker   union
55*f6dc9357SAndroid Build Coastguard Worker   {
56*f6dc9357SAndroid Build Coastguard Worker #if 0
57*f6dc9357SAndroid Build Coastguard Worker #if defined(MY_CPU_X86_OR_AMD64)
58*f6dc9357SAndroid Build Coastguard Worker #if defined(__SSE2__) \
59*f6dc9357SAndroid Build Coastguard Worker     || defined(_MSC_VER) && _MSC_VER > 1200 \
60*f6dc9357SAndroid Build Coastguard Worker     || defined(Z7_GCC_VERSION) && (Z7_GCC_VERSION >= 30300) \
61*f6dc9357SAndroid Build Coastguard Worker     || defined(__clang__) \
62*f6dc9357SAndroid Build Coastguard Worker     || defined(__INTEL_COMPILER)
63*f6dc9357SAndroid Build Coastguard Worker     __m128i _pad_align_128bit[4];
64*f6dc9357SAndroid Build Coastguard Worker #endif // sse2
65*f6dc9357SAndroid Build Coastguard Worker #if defined(__AVX2__) \
66*f6dc9357SAndroid Build Coastguard Worker     || defined(Z7_GCC_VERSION) && (Z7_GCC_VERSION >= 40900) \
67*f6dc9357SAndroid Build Coastguard Worker     || defined(Z7_APPLE_CLANG_VERSION) && (Z7_APPLE_CLANG_VERSION >= 40600) \
68*f6dc9357SAndroid Build Coastguard Worker     || defined(Z7_LLVM_CLANG_VERSION) && (Z7_LLVM_CLANG_VERSION >= 30100) \
69*f6dc9357SAndroid Build Coastguard Worker     || defined(Z7_MSC_VER_ORIGINAL) && (Z7_MSC_VER_ORIGINAL >= 1800) \
70*f6dc9357SAndroid Build Coastguard Worker     || defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1400)
71*f6dc9357SAndroid Build Coastguard Worker     __m256i _pad_align_256bit[2];
72*f6dc9357SAndroid Build Coastguard Worker #endif // avx2
73*f6dc9357SAndroid Build Coastguard Worker #endif // x86
74*f6dc9357SAndroid Build Coastguard Worker #endif // 0
75*f6dc9357SAndroid Build Coastguard Worker 
76*f6dc9357SAndroid Build Coastguard Worker     void * _pad_align_ptr[8];
77*f6dc9357SAndroid Build Coastguard Worker     UInt32 _pad_align_32bit[16];
78*f6dc9357SAndroid Build Coastguard Worker     struct
79*f6dc9357SAndroid Build Coastguard Worker     {
80*f6dc9357SAndroid Build Coastguard Worker       unsigned cycPos;
81*f6dc9357SAndroid Build Coastguard Worker       unsigned _pad_unused;
82*f6dc9357SAndroid Build Coastguard Worker #if 1 || defined(Z7_BLAKE2SP_USE_FUNCTIONS)
83*f6dc9357SAndroid Build Coastguard Worker       Z7_BLAKE2SP_FUNC_COMPRESS func_Compress_Fast;
84*f6dc9357SAndroid Build Coastguard Worker       Z7_BLAKE2SP_FUNC_COMPRESS func_Compress_Single;
85*f6dc9357SAndroid Build Coastguard Worker       Z7_BLAKE2SP_FUNC_INIT func_Init;
86*f6dc9357SAndroid Build Coastguard Worker       Z7_BLAKE2SP_FUNC_INIT func_Final;
87*f6dc9357SAndroid Build Coastguard Worker #endif
88*f6dc9357SAndroid Build Coastguard Worker     } header;
89*f6dc9357SAndroid Build Coastguard Worker   } u;
90*f6dc9357SAndroid Build Coastguard Worker   // MY_ALIGN(64)
91*f6dc9357SAndroid Build Coastguard Worker   UInt32 states[Z7_BLAKE2SP_PARALLEL_DEGREE * Z7_BLAKE2SP_NUM_STRUCT_WORDS];
92*f6dc9357SAndroid Build Coastguard Worker   // MY_ALIGN(64)
93*f6dc9357SAndroid Build Coastguard Worker   UInt32  buf32[Z7_BLAKE2SP_PARALLEL_DEGREE * Z7_BLAKE2SP_NUM_STRUCT_WORDS * 2];
94*f6dc9357SAndroid Build Coastguard Worker } CBlake2sp;
95*f6dc9357SAndroid Build Coastguard Worker 
96*f6dc9357SAndroid Build Coastguard Worker BoolInt Blake2sp_SetFunction(CBlake2sp *p, unsigned algo);
97*f6dc9357SAndroid Build Coastguard Worker void Blake2sp_Init(CBlake2sp *p);
98*f6dc9357SAndroid Build Coastguard Worker void Blake2sp_InitState(CBlake2sp *p);
99*f6dc9357SAndroid Build Coastguard Worker void Blake2sp_Update(CBlake2sp *p, const Byte *data, size_t size);
100*f6dc9357SAndroid Build Coastguard Worker void Blake2sp_Final(CBlake2sp *p, Byte *digest);
101*f6dc9357SAndroid Build Coastguard Worker void z7_Black2sp_Prepare(void);
102*f6dc9357SAndroid Build Coastguard Worker 
103*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_END
104*f6dc9357SAndroid Build Coastguard Worker 
105*f6dc9357SAndroid Build Coastguard Worker #endif
106