183 lines
4.8 KiB
C
183 lines
4.8 KiB
C
#define SCRYPT_MIX_BASE "Salsa64/8"
|
|
|
|
typedef uint64_t scrypt_mix_word_t;
|
|
|
|
#define SCRYPT_WORDTO8_LE U64TO8_LE
|
|
#define SCRYPT_WORD_ENDIAN_SWAP U64_SWAP
|
|
|
|
#define SCRYPT_BLOCK_BYTES 128
|
|
#define SCRYPT_BLOCK_WORDS (SCRYPT_BLOCK_BYTES / sizeof(scrypt_mix_word_t))
|
|
|
|
/* must have these here in case block bytes is ever != 64 */
|
|
#include "scrypt-jane-romix-basic.h"
|
|
|
|
#include "scrypt-jane-mix_salsa64-avx2.h"
|
|
#include "scrypt-jane-mix_salsa64-xop.h"
|
|
#include "scrypt-jane-mix_salsa64-avx.h"
|
|
#include "scrypt-jane-mix_salsa64-ssse3.h"
|
|
#include "scrypt-jane-mix_salsa64-sse2.h"
|
|
#include "scrypt-jane-mix_salsa64.h"
|
|
|
|
#if defined(SCRYPT_SALSA64_AVX2)
|
|
#define SCRYPT_CHUNKMIX_FN scrypt_ChunkMix_avx2
|
|
#define SCRYPT_ROMIX_FN scrypt_ROMix_avx2
|
|
#define SCRYPT_ROMIX_TANGLE_FN salsa64_core_tangle_sse2
|
|
#define SCRYPT_ROMIX_UNTANGLE_FN salsa64_core_tangle_sse2
|
|
#include "scrypt-jane-romix-template.h"
|
|
#endif
|
|
|
|
#if defined(SCRYPT_SALSA64_XOP)
|
|
#define SCRYPT_CHUNKMIX_FN scrypt_ChunkMix_xop
|
|
#define SCRYPT_ROMIX_FN scrypt_ROMix_xop
|
|
#define SCRYPT_ROMIX_TANGLE_FN salsa64_core_tangle_sse2
|
|
#define SCRYPT_ROMIX_UNTANGLE_FN salsa64_core_tangle_sse2
|
|
#include "scrypt-jane-romix-template.h"
|
|
#endif
|
|
|
|
#if defined(SCRYPT_SALSA64_AVX)
|
|
#define SCRYPT_CHUNKMIX_FN scrypt_ChunkMix_avx
|
|
#define SCRYPT_ROMIX_FN scrypt_ROMix_avx
|
|
#define SCRYPT_ROMIX_TANGLE_FN salsa64_core_tangle_sse2
|
|
#define SCRYPT_ROMIX_UNTANGLE_FN salsa64_core_tangle_sse2
|
|
#include "scrypt-jane-romix-template.h"
|
|
#endif
|
|
|
|
#if defined(SCRYPT_SALSA64_SSSE3)
|
|
#define SCRYPT_CHUNKMIX_FN scrypt_ChunkMix_ssse3
|
|
#define SCRYPT_ROMIX_FN scrypt_ROMix_ssse3
|
|
#define SCRYPT_ROMIX_TANGLE_FN salsa64_core_tangle_sse2
|
|
#define SCRYPT_ROMIX_UNTANGLE_FN salsa64_core_tangle_sse2
|
|
#include "scrypt-jane-romix-template.h"
|
|
#endif
|
|
|
|
#if defined(SCRYPT_SALSA64_SSE2)
|
|
#define SCRYPT_CHUNKMIX_FN scrypt_ChunkMix_sse2
|
|
#define SCRYPT_ROMIX_FN scrypt_ROMix_sse2
|
|
#define SCRYPT_ROMIX_TANGLE_FN salsa64_core_tangle_sse2
|
|
#define SCRYPT_ROMIX_UNTANGLE_FN salsa64_core_tangle_sse2
|
|
#include "scrypt-jane-romix-template.h"
|
|
#endif
|
|
|
|
/* cpu agnostic */
|
|
#define SCRYPT_ROMIX_FN scrypt_ROMix_basic
|
|
#define SCRYPT_MIX_FN salsa64_core_basic
|
|
#define SCRYPT_ROMIX_TANGLE_FN scrypt_romix_convert_endian
|
|
#define SCRYPT_ROMIX_UNTANGLE_FN scrypt_romix_convert_endian
|
|
#include "scrypt-jane-romix-template.h"
|
|
|
|
#if !defined(SCRYPT_CHOOSE_COMPILETIME)
|
|
static scrypt_ROMixfn
|
|
scrypt_getROMix(void) {
|
|
size_t cpuflags = detect_cpu();
|
|
|
|
#if defined(SCRYPT_SALSA64_AVX2)
|
|
if (cpuflags & cpu_avx2)
|
|
return scrypt_ROMix_avx2;
|
|
else
|
|
#endif
|
|
|
|
#if defined(SCRYPT_SALSA64_XOP)
|
|
if (cpuflags & cpu_xop)
|
|
return scrypt_ROMix_xop;
|
|
else
|
|
#endif
|
|
|
|
#if defined(SCRYPT_SALSA64_AVX)
|
|
if (cpuflags & cpu_avx)
|
|
return scrypt_ROMix_avx;
|
|
else
|
|
#endif
|
|
|
|
#if defined(SCRYPT_SALSA64_SSSE3)
|
|
if (cpuflags & cpu_ssse3)
|
|
return scrypt_ROMix_ssse3;
|
|
else
|
|
#endif
|
|
|
|
#if defined(SCRYPT_SALSA64_SSE2)
|
|
if (cpuflags & cpu_sse2)
|
|
return scrypt_ROMix_sse2;
|
|
else
|
|
#endif
|
|
|
|
return scrypt_ROMix_basic;
|
|
}
|
|
#endif
|
|
|
|
|
|
#if defined(SCRYPT_TEST_SPEED)
|
|
static size_t
|
|
available_implementations(void) {
|
|
size_t cpuflags = detect_cpu();
|
|
size_t flags = 0;
|
|
|
|
#if defined(SCRYPT_SALSA64_AVX2)
|
|
if (cpuflags & cpu_avx2)
|
|
flags |= cpu_avx2;
|
|
#endif
|
|
|
|
#if defined(SCRYPT_SALSA64_XOP)
|
|
if (cpuflags & cpu_xop)
|
|
flags |= cpu_xop;
|
|
#endif
|
|
|
|
#if defined(SCRYPT_SALSA64_AVX)
|
|
if (cpuflags & cpu_avx)
|
|
flags |= cpu_avx;
|
|
#endif
|
|
|
|
#if defined(SCRYPT_SALSA64_SSSE3)
|
|
if (cpuflags & cpu_ssse3)
|
|
flags |= cpu_ssse3;
|
|
#endif
|
|
|
|
#if defined(SCRYPT_SALSA64_SSE2)
|
|
if (cpuflags & cpu_sse2)
|
|
flags |= cpu_sse2;
|
|
#endif
|
|
|
|
return flags;
|
|
}
|
|
#endif
|
|
|
|
static int
|
|
scrypt_test_mix(void) {
|
|
static const uint8_t expected[16] = {
|
|
0xf8,0x92,0x9b,0xf8,0xcc,0x1d,0xce,0x2e,0x13,0x82,0xac,0x96,0xb2,0x6c,0xee,0x2c,
|
|
};
|
|
|
|
int ret = 1;
|
|
size_t cpuflags = detect_cpu();
|
|
|
|
#if defined(SCRYPT_SALSA64_AVX2)
|
|
if (cpuflags & cpu_avx2)
|
|
ret &= scrypt_test_mix_instance(scrypt_ChunkMix_avx2, salsa64_core_tangle_sse2, salsa64_core_tangle_sse2, expected);
|
|
#endif
|
|
|
|
#if defined(SCRYPT_SALSA64_XOP)
|
|
if (cpuflags & cpu_xop)
|
|
ret &= scrypt_test_mix_instance(scrypt_ChunkMix_xop, salsa64_core_tangle_sse2, salsa64_core_tangle_sse2, expected);
|
|
#endif
|
|
|
|
#if defined(SCRYPT_SALSA64_AVX)
|
|
if (cpuflags & cpu_avx)
|
|
ret &= scrypt_test_mix_instance(scrypt_ChunkMix_avx, salsa64_core_tangle_sse2, salsa64_core_tangle_sse2, expected);
|
|
#endif
|
|
|
|
#if defined(SCRYPT_SALSA64_SSSE3)
|
|
if (cpuflags & cpu_ssse3)
|
|
ret &= scrypt_test_mix_instance(scrypt_ChunkMix_ssse3, salsa64_core_tangle_sse2, salsa64_core_tangle_sse2, expected);
|
|
#endif
|
|
|
|
#if defined(SCRYPT_SALSA64_SSE2)
|
|
if (cpuflags & cpu_sse2)
|
|
ret &= scrypt_test_mix_instance(scrypt_ChunkMix_sse2, salsa64_core_tangle_sse2, salsa64_core_tangle_sse2, expected);
|
|
#endif
|
|
|
|
#if defined(SCRYPT_SALSA64_BASIC)
|
|
ret &= scrypt_test_mix_instance(scrypt_ChunkMix_basic, scrypt_romix_convert_endian, scrypt_romix_convert_endian, expected);
|
|
#endif
|
|
|
|
return ret;
|
|
}
|
|
|