Path: blob/linux/scryptjane/scrypt-jane-chacha.h
1201 views
#define SCRYPT_MIX_BASE "ChaCha20/8"12typedef uint32_t scrypt_mix_word_t;34#define SCRYPT_WORDTO8_LE U32TO8_LE5#define SCRYPT_WORD_ENDIAN_SWAP U32_SWAP67#define SCRYPT_BLOCK_BYTES 648#define SCRYPT_BLOCK_WORDS (SCRYPT_BLOCK_BYTES / sizeof(scrypt_mix_word_t))910/* must have these here in case block bytes is ever != 64 */11#include "scrypt-jane-romix-basic.h"1213#include "scrypt-jane-mix_chacha-avx.h"14#include "scrypt-jane-mix_chacha-ssse3.h"15#include "scrypt-jane-mix_chacha-sse2.h"16#include "scrypt-jane-mix_chacha.h"1718#if defined(SCRYPT_CHACHA_AVX)19#define SCRYPT_CHUNKMIX_FN scrypt_ChunkMix_avx20#if defined(X86_INTRINSIC_AVX)21#define SCRYPT_CHUNKMIX_1_FN scrypt_ChunkMix_avx_122#define SCRYPT_CHUNKMIX_1_XOR_FN scrypt_ChunkMix_avx_1_xor23#endif24#define SCRYPT_ROMIX_FN scrypt_ROMix_avx25#define SCRYPT_MIX_FN chacha_core_avx26#define SCRYPT_ROMIX_TANGLE_FN scrypt_romix_nop27#define SCRYPT_ROMIX_UNTANGLE_FN scrypt_romix_nop28#include "scrypt-jane-romix-template.h"29#endif3031#if defined(SCRYPT_CHACHA_SSSE3)32#define SCRYPT_CHUNKMIX_FN scrypt_ChunkMix_ssse333#if defined(X86_INTRINSIC_SSSE3)34#define SCRYPT_CHUNKMIX_1_FN scrypt_ChunkMix_ssse3_135#define SCRYPT_CHUNKMIX_1_XOR_FN scrypt_ChunkMix_ssse3_1_xor36#endif37#define SCRYPT_ROMIX_FN scrypt_ROMix_ssse338#define SCRYPT_MIX_FN chacha_core_ssse339#define SCRYPT_ROMIX_TANGLE_FN scrypt_romix_nop40#define SCRYPT_ROMIX_UNTANGLE_FN scrypt_romix_nop41#include "scrypt-jane-romix-template.h"42#endif4344#if defined(SCRYPT_CHACHA_SSE2)45#define SCRYPT_CHUNKMIX_FN scrypt_ChunkMix_sse246#if defined(X86_INTRINSIC_SSE2)47#define SCRYPT_CHUNKMIX_1_FN scrypt_ChunkMix_sse2_148#define SCRYPT_CHUNKMIX_1_XOR_FN scrypt_ChunkMix_sse2_1_xor49#endif50#define SCRYPT_ROMIX_FN scrypt_ROMix_sse251#define SCRYPT_MIX_FN chacha_core_sse252#define SCRYPT_ROMIX_TANGLE_FN scrypt_romix_nop53#define SCRYPT_ROMIX_UNTANGLE_FN scrypt_romix_nop54#include "scrypt-jane-romix-template.h"55#endif5657/* cpu agnostic */58#define SCRYPT_ROMIX_FN scrypt_ROMix_basic59#define SCRYPT_MIX_FN chacha_core_basic60#define SCRYPT_ROMIX_TANGLE_FN scrypt_romix_convert_endian61#define SCRYPT_ROMIX_UNTANGLE_FN scrypt_romix_convert_endian62#include "scrypt-jane-romix-template.h"6364#if !defined(SCRYPT_CHOOSE_COMPILETIME)65static scrypt_ROMixfn66scrypt_getROMix() {67size_t cpuflags = detect_cpu();6869#if defined(SCRYPT_CHACHA_AVX)70if (cpuflags & cpu_avx)71return scrypt_ROMix_avx;72else73#endif7475#if defined(SCRYPT_CHACHA_SSSE3)76if (cpuflags & cpu_ssse3)77return scrypt_ROMix_ssse3;78else79#endif8081#if defined(SCRYPT_CHACHA_SSE2)82if (cpuflags & cpu_sse2)83return scrypt_ROMix_sse2;84else85#endif8687return scrypt_ROMix_basic;88}89#endif909192#if defined(SCRYPT_TEST_SPEED)93static size_t94available_implementations() {95size_t cpuflags = detect_cpu();96size_t flags = 0;9798#if defined(SCRYPT_CHACHA_AVX)99if (cpuflags & cpu_avx)100flags |= cpu_avx;101#endif102103#if defined(SCRYPT_CHACHA_SSSE3)104if (cpuflags & cpu_ssse3)105flags |= cpu_ssse3;106#endif107108#if defined(SCRYPT_CHACHA_SSE2)109if (cpuflags & cpu_sse2)110flags |= cpu_sse2;111#endif112113return flags;114}115#endif116117static int118scrypt_test_mix() {119static const uint8_t expected[16] = {1200x48,0x2b,0x2d,0xb8,0xa1,0x33,0x22,0x73,0xcd,0x16,0xc4,0xb4,0xb0,0x7f,0xb1,0x8a,121};122123int ret = 1;124size_t cpuflags = detect_cpu();125126#if defined(SCRYPT_CHACHA_AVX)127if (cpuflags & cpu_avx)128ret &= scrypt_test_mix_instance(scrypt_ChunkMix_avx, scrypt_romix_nop, scrypt_romix_nop, expected);129#endif130131#if defined(SCRYPT_CHACHA_SSSE3)132if (cpuflags & cpu_ssse3)133ret &= scrypt_test_mix_instance(scrypt_ChunkMix_ssse3, scrypt_romix_nop, scrypt_romix_nop, expected);134#endif135136#if defined(SCRYPT_CHACHA_SSE2)137if (cpuflags & cpu_sse2)138ret &= scrypt_test_mix_instance(scrypt_ChunkMix_sse2, scrypt_romix_nop, scrypt_romix_nop, expected);139#endif140141#if defined(SCRYPT_CHACHA_BASIC)142ret &= scrypt_test_mix_instance(scrypt_ChunkMix_basic, scrypt_romix_convert_endian, scrypt_romix_convert_endian, expected);143#endif144145return ret;146}147148149150