You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
285 lines
8.2 KiB
285 lines
8.2 KiB
10 years ago
|
/* determine os */
|
||
|
#if defined(_WIN32) || defined(_WIN64) || defined(__TOS_WIN__) || defined(__WINDOWS__)
|
||
|
#include <windows.h>
|
||
|
#include <wincrypt.h>
|
||
|
#define OS_WINDOWS
|
||
|
#elif defined(sun) || defined(__sun) || defined(__SVR4) || defined(__svr4__)
|
||
|
#include <sys/mman.h>
|
||
|
#include <sys/time.h>
|
||
|
#include <fcntl.h>
|
||
|
|
||
|
#define OS_SOLARIS
|
||
|
#else
|
||
|
#include <sys/mman.h>
|
||
|
#include <sys/time.h>
|
||
|
#include <sys/param.h> /* need this to define BSD */
|
||
|
#include <unistd.h>
|
||
|
#include <fcntl.h>
|
||
|
|
||
|
#define OS_NIX
|
||
|
#if defined(__linux__)
|
||
|
#include <endian.h>
|
||
|
#define OS_LINUX
|
||
|
#elif defined(BSD)
|
||
|
#define OS_BSD
|
||
|
|
||
|
#if defined(MACOS_X) || (defined(__APPLE__) & defined(__MACH__))
|
||
|
#define OS_OSX
|
||
|
#elif defined(macintosh) || defined(Macintosh)
|
||
|
#define OS_MAC
|
||
|
#elif defined(__OpenBSD__)
|
||
|
#define OS_OPENBSD
|
||
|
#endif
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/* determine compiler */
|
||
|
#if defined(_MSC_VER)
|
||
|
#define COMPILER_MSVC _MSC_VER
|
||
|
#if ((COMPILER_MSVC > 1200) || defined(_mm_free))
|
||
|
#define COMPILER_MSVC6PP_AND_LATER
|
||
|
#endif
|
||
|
#if (COMPILER_MSVC >= 1500)
|
||
|
#define COMPILER_HAS_TMMINTRIN
|
||
|
#endif
|
||
|
|
||
|
#pragma warning(disable : 4127) /* conditional expression is constant */
|
||
|
#pragma warning(disable : 4100) /* unreferenced formal parameter */
|
||
|
|
||
|
#ifndef _CRT_SECURE_NO_WARNINGS
|
||
|
#define _CRT_SECURE_NO_WARNINGS
|
||
|
#endif
|
||
|
|
||
|
#include <float.h>
|
||
|
#include <stdlib.h> /* _rotl */
|
||
|
#include <intrin.h>
|
||
|
|
||
|
typedef unsigned char uint8_t;
|
||
|
typedef unsigned short uint16_t;
|
||
|
typedef unsigned int uint32_t;
|
||
|
typedef signed int int32_t;
|
||
|
typedef unsigned __int64 uint64_t;
|
||
|
typedef signed __int64 int64_t;
|
||
|
|
||
|
#define ROTL32(a,b) _rotl(a,b)
|
||
|
#define ROTR32(a,b) _rotr(a,b)
|
||
|
#define ROTL64(a,b) _rotl64(a,b)
|
||
|
#define ROTR64(a,b) _rotr64(a,b)
|
||
|
#undef NOINLINE
|
||
|
#define NOINLINE __declspec(noinline)
|
||
|
#undef INLINE
|
||
|
#define INLINE __forceinline
|
||
|
#undef FASTCALL
|
||
|
#define FASTCALL __fastcall
|
||
|
#undef CDECL
|
||
|
#define CDECL __cdecl
|
||
|
#undef STDCALL
|
||
|
#define STDCALL __stdcall
|
||
|
#undef NAKED
|
||
|
#define NAKED __declspec(naked)
|
||
|
#define MM16 __declspec(align(16))
|
||
|
#endif
|
||
|
#if defined(__ICC)
|
||
|
#define COMPILER_INTEL
|
||
|
#endif
|
||
|
#if defined(__GNUC__)
|
||
|
#if (__GNUC__ >= 3)
|
||
|
#define COMPILER_GCC_PATCHLEVEL __GNUC_PATCHLEVEL__
|
||
|
#else
|
||
|
#define COMPILER_GCC_PATCHLEVEL 0
|
||
|
#endif
|
||
|
#define COMPILER_GCC (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + COMPILER_GCC_PATCHLEVEL)
|
||
|
#define ROTL32(a,b) (((a) << (b)) | ((a) >> (32 - b)))
|
||
|
#define ROTR32(a,b) (((a) >> (b)) | ((a) << (32 - b)))
|
||
|
#define ROTL64(a,b) (((a) << (b)) | ((a) >> (64 - b)))
|
||
|
#define ROTR64(a,b) (((a) >> (b)) | ((a) << (64 - b)))
|
||
|
#undef NOINLINE
|
||
|
#if (COMPILER_GCC >= 30000)
|
||
|
#define NOINLINE __attribute__((noinline))
|
||
|
#else
|
||
|
#define NOINLINE
|
||
|
#endif
|
||
|
#undef INLINE
|
||
|
#if (COMPILER_GCC >= 30000)
|
||
|
#define INLINE __attribute__((always_inline))
|
||
|
#else
|
||
|
#define INLINE inline
|
||
|
#endif
|
||
|
#undef FASTCALL
|
||
|
#if (COMPILER_GCC >= 30400)
|
||
|
#define FASTCALL __attribute__((fastcall))
|
||
|
#else
|
||
|
#define FASTCALL
|
||
|
#endif
|
||
|
#undef CDECL
|
||
|
#define CDECL __attribute__((cdecl))
|
||
|
#undef STDCALL
|
||
|
#define STDCALL __attribute__((stdcall))
|
||
|
#define MM16 __attribute__((aligned(16)))
|
||
|
#include <stdint.h>
|
||
|
#endif
|
||
|
#if defined(__MINGW32__) || defined(__MINGW64__)
|
||
|
#define COMPILER_MINGW
|
||
|
#endif
|
||
|
#if defined(__PATHCC__)
|
||
|
#define COMPILER_PATHCC
|
||
|
#endif
|
||
|
|
||
|
#define OPTIONAL_INLINE
|
||
|
#if defined(OPTIONAL_INLINE)
|
||
|
#undef OPTIONAL_INLINE
|
||
|
#define OPTIONAL_INLINE INLINE
|
||
|
#else
|
||
|
#define OPTIONAL_INLINE
|
||
|
#endif
|
||
|
|
||
|
#define CRYPTO_FN NOINLINE STDCALL
|
||
|
|
||
|
/* determine cpu */
|
||
|
#if defined(__amd64__) || defined(__amd64) || defined(__x86_64__ ) || defined(_M_X64)
|
||
|
#define CPU_X86_64
|
||
|
#elif defined(__i586__) || defined(__i686__) || (defined(_M_IX86) && (_M_IX86 >= 500))
|
||
|
#define CPU_X86 500
|
||
|
#elif defined(__i486__) || (defined(_M_IX86) && (_M_IX86 >= 400))
|
||
|
#define CPU_X86 400
|
||
|
#elif defined(__i386__) || (defined(_M_IX86) && (_M_IX86 >= 300)) || defined(__X86__) || defined(_X86_) || defined(__I86__)
|
||
|
#define CPU_X86 300
|
||
|
#elif defined(__ia64__) || defined(_IA64) || defined(__IA64__) || defined(_M_IA64) || defined(__ia64)
|
||
|
#define CPU_IA64
|
||
|
#endif
|
||
|
|
||
|
#if defined(__sparc__) || defined(__sparc) || defined(__sparcv9)
|
||
|
#define CPU_SPARC
|
||
|
#if defined(__sparcv9)
|
||
|
#define CPU_SPARC64
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
#if defined(CPU_X86_64) || defined(CPU_IA64) || defined(CPU_SPARC64) || defined(__64BIT__) || defined(__LP64__) || defined(_LP64) || (defined(_MIPS_SZLONG) && (_MIPS_SZLONG == 64))
|
||
|
#define CPU_64BITS
|
||
|
#undef FASTCALL
|
||
|
#define FASTCALL
|
||
|
#undef CDECL
|
||
|
#define CDECL
|
||
|
#undef STDCALL
|
||
|
#define STDCALL
|
||
|
#endif
|
||
|
|
||
|
#if defined(powerpc) || defined(__PPC__) || defined(__ppc__) || defined(_ARCH_PPC) || defined(__powerpc__) || defined(__powerpc) || defined(POWERPC) || defined(_M_PPC)
|
||
|
#define CPU_PPC
|
||
|
#if defined(_ARCH_PWR7)
|
||
|
#define CPU_POWER7
|
||
|
#elif defined(__64BIT__)
|
||
|
#define CPU_PPC64
|
||
|
#else
|
||
|
#define CPU_PPC32
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
#if defined(__hppa__) || defined(__hppa)
|
||
|
#define CPU_HPPA
|
||
|
#endif
|
||
|
|
||
|
#if defined(__alpha__) || defined(__alpha) || defined(_M_ALPHA)
|
||
|
#define CPU_ALPHA
|
||
|
#endif
|
||
|
|
||
|
/* endian */
|
||
|
|
||
|
#if ((defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && (__BYTE_ORDER == __LITTLE_ENDIAN)) || \
|
||
|
(defined(BYTE_ORDER) && defined(LITTLE_ENDIAN) && (BYTE_ORDER == LITTLE_ENDIAN)) || \
|
||
|
(defined(CPU_X86) || defined(CPU_X86_64)) || \
|
||
|
(defined(vax) || defined(MIPSEL) || defined(_MIPSEL)))
|
||
|
#define CPU_LE
|
||
|
#elif ((defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) && (__BYTE_ORDER == __BIG_ENDIAN)) || \
|
||
|
(defined(BYTE_ORDER) && defined(BIG_ENDIAN) && (BYTE_ORDER == BIG_ENDIAN)) || \
|
||
|
(defined(CPU_SPARC) || defined(CPU_PPC) || defined(mc68000) || defined(sel)) || defined(_MIPSEB))
|
||
|
#define CPU_BE
|
||
|
#else
|
||
|
/* unknown endian! */
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#define U8TO32_BE(p) \
|
||
|
(((uint32_t)((p)[0]) << 24) | ((uint32_t)((p)[1]) << 16) | \
|
||
|
((uint32_t)((p)[2]) << 8) | ((uint32_t)((p)[3]) ))
|
||
|
|
||
|
#define U8TO32_LE(p) \
|
||
|
(((uint32_t)((p)[0]) ) | ((uint32_t)((p)[1]) << 8) | \
|
||
|
((uint32_t)((p)[2]) << 16) | ((uint32_t)((p)[3]) << 24))
|
||
|
|
||
|
#define U32TO8_BE(p, v) \
|
||
|
(p)[0] = (uint8_t)((v) >> 24); (p)[1] = (uint8_t)((v) >> 16); \
|
||
|
(p)[2] = (uint8_t)((v) >> 8); (p)[3] = (uint8_t)((v) );
|
||
|
|
||
|
#define U32TO8_LE(p, v) \
|
||
|
(p)[0] = (uint8_t)((v) ); (p)[1] = (uint8_t)((v) >> 8); \
|
||
|
(p)[2] = (uint8_t)((v) >> 16); (p)[3] = (uint8_t)((v) >> 24);
|
||
|
|
||
|
#define U8TO64_BE(p) \
|
||
|
(((uint64_t)U8TO32_BE(p) << 32) | (uint64_t)U8TO32_BE((p) + 4))
|
||
|
|
||
|
#define U8TO64_LE(p) \
|
||
|
(((uint64_t)U8TO32_LE(p)) | ((uint64_t)U8TO32_LE((p) + 4) << 32))
|
||
|
|
||
|
#define U64TO8_BE(p, v) \
|
||
|
U32TO8_BE((p), (uint32_t)((v) >> 32)); \
|
||
|
U32TO8_BE((p) + 4, (uint32_t)((v) ));
|
||
|
|
||
|
#define U64TO8_LE(p, v) \
|
||
|
U32TO8_LE((p), (uint32_t)((v) )); \
|
||
|
U32TO8_LE((p) + 4, (uint32_t)((v) >> 32));
|
||
|
|
||
|
#define U32_SWAP(v) { \
|
||
|
(v) = (((v) << 8) & 0xFF00FF00 ) | (((v) >> 8) & 0xFF00FF ); \
|
||
|
(v) = ((v) << 16) | ((v) >> 16); \
|
||
|
}
|
||
|
|
||
|
#define U64_SWAP(v) { \
|
||
|
(v) = (((v) << 8) & 0xFF00FF00FF00FF00ull ) | (((v) >> 8) & 0x00FF00FF00FF00FFull ); \
|
||
|
(v) = (((v) << 16) & 0xFFFF0000FFFF0000ull ) | (((v) >> 16) & 0x0000FFFF0000FFFFull ); \
|
||
|
(v) = ((v) << 32) | ((v) >> 32); \
|
||
|
}
|
||
|
|
||
|
static int
|
||
|
scrypt_verify(const uint8_t *x, const uint8_t *y, size_t len) {
|
||
|
uint32_t differentbits = 0;
|
||
|
while (len--)
|
||
|
differentbits |= (*x++ ^ *y++);
|
||
|
return (1 & ((differentbits - 1) >> 8));
|
||
|
}
|
||
|
|
||
|
void
|
||
|
scrypt_ensure_zero(void *p, size_t len) {
|
||
|
#if ((defined(CPU_X86) || defined(CPU_X86_64)) && defined(COMPILER_MSVC))
|
||
|
__stosb((unsigned char *)p, 0, len);
|
||
|
#elif (defined(CPU_X86) && defined(COMPILER_GCC))
|
||
|
__asm__ __volatile__(
|
||
|
"pushl %%edi;\n"
|
||
|
"pushl %%ecx;\n"
|
||
|
"rep stosb;\n"
|
||
|
"popl %%ecx;\n"
|
||
|
"popl %%edi;\n"
|
||
|
:: "a"(0), "D"(p), "c"(len) : "cc", "memory"
|
||
|
);
|
||
|
#elif (defined(CPU_X86_64) && defined(COMPILER_GCC))
|
||
|
__asm__ __volatile__(
|
||
|
"pushq %%rdi;\n"
|
||
|
"pushq %%rcx;\n"
|
||
|
"rep stosb;\n"
|
||
|
"popq %%rcx;\n"
|
||
|
"popq %%rdi;\n"
|
||
|
:: "a"(0), "D"(p), "c"(len) : "cc", "memory"
|
||
|
);
|
||
|
#else
|
||
|
volatile uint8_t *b = (volatile uint8_t *)p;
|
||
|
size_t i;
|
||
|
for (i = 0; i < len; i++)
|
||
|
b[i] = 0;
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
#include "scrypt-jane-portable-x86.h"
|
||
|
|