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