Path: blob/linux/scryptjane/scrypt-jane-portable.h
1201 views
/* determine os */1#if defined(_WIN32) || defined(_WIN64) || defined(__TOS_WIN__) || defined(__WINDOWS__)2#include <windows.h>3#include <wincrypt.h>4#define OS_WINDOWS5#elif defined(sun) || defined(__sun) || defined(__SVR4) || defined(__svr4__)6#include <sys/mman.h>7#include <sys/time.h>8#include <fcntl.h>910#define OS_SOLARIS11#else12#include <sys/mman.h>13#include <sys/time.h>14#include <sys/param.h> /* need this to define BSD */15#include <unistd.h>16#include <fcntl.h>1718#define OS_NIX19#if defined(__linux__)20#include <endian.h>21#define OS_LINUX22#elif defined(BSD)23#define OS_BSD2425#if defined(MACOS_X) || (defined(__APPLE__) & defined(__MACH__))26#define OS_OSX27#elif defined(macintosh) || defined(Macintosh)28#define OS_MAC29#elif defined(__OpenBSD__)30#define OS_OPENBSD31#endif32#endif33#endif343536/* determine compiler */37#if defined(_MSC_VER)38#define COMPILER_MSVC _MSC_VER39#if ((COMPILER_MSVC > 1200) || defined(_mm_free))40#define COMPILER_MSVC6PP_AND_LATER41#endif42#if (COMPILER_MSVC >= 1500)43#define COMPILER_HAS_TMMINTRIN44#endif4546#pragma warning(disable : 4127) /* conditional expression is constant */47#pragma warning(disable : 4100) /* unreferenced formal parameter */4849#include <float.h>50#include <stdlib.h> /* _rotl */51#include <intrin.h>5253typedef unsigned char uint8_t;54typedef unsigned short uint16_t;55typedef unsigned int uint32_t;56typedef signed int int32_t;57typedef unsigned __int64 uint64_t;58typedef signed __int64 int64_t;5960#define ROTL32(a,b) _rotl(a,b)61#define ROTR32(a,b) _rotr(a,b)62#define ROTL64(a,b) _rotl64(a,b)63#define ROTR64(a,b) _rotr64(a,b)64#undef NOINLINE65#define NOINLINE __declspec(noinline)66#undef INLINE67#define INLINE __forceinline68#undef FASTCALL69#define FASTCALL __fastcall70#undef CDECL71#define CDECL __cdecl72#undef STDCALL73#define STDCALL __stdcall74#undef NAKED75#define NAKED __declspec(naked)76#define MM16 __declspec(align(16))77#endif78#if defined(__ICC)79#define COMPILER_INTEL80#endif81#if defined(__GNUC__)82#if (__GNUC__ >= 3)83#define COMPILER_GCC_PATCHLEVEL __GNUC_PATCHLEVEL__84#else85#define COMPILER_GCC_PATCHLEVEL 086#endif87#define COMPILER_GCC (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + COMPILER_GCC_PATCHLEVEL)88#define ROTL32(a,b) (((a) << (b)) | ((a) >> (32 - b)))89#define ROTR32(a,b) (((a) >> (b)) | ((a) << (32 - b)))90#define ROTL64(a,b) (((a) << (b)) | ((a) >> (64 - b)))91#define ROTR64(a,b) (((a) >> (b)) | ((a) << (64 - b)))92#undef NOINLINE93#if (COMPILER_GCC >= 30000)94#define NOINLINE __attribute__((noinline))95#else96#define NOINLINE97#endif98#undef INLINE99#if (COMPILER_GCC >= 30000)100#define INLINE __attribute__((always_inline))101#else102#define INLINE inline103#endif104#undef FASTCALL105#if (COMPILER_GCC >= 30400)106#define FASTCALL __attribute__((fastcall))107#else108#define FASTCALL109#endif110#undef CDECL111#define CDECL __attribute__((cdecl))112#undef STDCALL113#define STDCALL __attribute__((stdcall))114#define MM16 __attribute__((aligned(16)))115#include <stdint.h>116#endif117#if defined(__MINGW32__) || defined(__MINGW64__)118#define COMPILER_MINGW119#endif120#if defined(__PATHCC__)121#define COMPILER_PATHCC122#endif123124#define OPTIONAL_INLINE125#if defined(OPTIONAL_INLINE)126#undef OPTIONAL_INLINE127#define OPTIONAL_INLINE INLINE128#else129#define OPTIONAL_INLINE130#endif131132#define CRYPTO_FN NOINLINE STDCALL133134/* determine cpu */135#if defined(__amd64__) || defined(__amd64) || defined(__x86_64__ ) || defined(_M_X64)136#define CPU_X86_64137#elif defined(__i586__) || defined(__i686__) || (defined(_M_IX86) && (_M_IX86 >= 500))138#define CPU_X86 500139#elif defined(__i486__) || (defined(_M_IX86) && (_M_IX86 >= 400))140#define CPU_X86 400141#elif defined(__i386__) || (defined(_M_IX86) && (_M_IX86 >= 300)) || defined(__X86__) || defined(_X86_) || defined(__I86__)142#define CPU_X86 300143#elif defined(__ia64__) || defined(_IA64) || defined(__IA64__) || defined(_M_IA64) || defined(__ia64)144#define CPU_IA64145#endif146147#if defined(__sparc__) || defined(__sparc) || defined(__sparcv9)148#define CPU_SPARC149#if defined(__sparcv9)150#define CPU_SPARC64151#endif152#endif153154#if defined(CPU_X86_64) || defined(CPU_IA64) || defined(CPU_SPARC64) || defined(__64BIT__) || defined(__LP64__) || defined(_LP64) || (defined(_MIPS_SZLONG) && (_MIPS_SZLONG == 64))155#define CPU_64BITS156#undef FASTCALL157#define FASTCALL158#undef CDECL159#define CDECL160#undef STDCALL161#define STDCALL162#endif163164#if defined(powerpc) || defined(__PPC__) || defined(__ppc__) || defined(_ARCH_PPC) || defined(__powerpc__) || defined(__powerpc) || defined(POWERPC) || defined(_M_PPC)165#define CPU_PPC166#if defined(_ARCH_PWR7)167#define CPU_POWER7168#elif defined(__64BIT__)169#define CPU_PPC64170#else171#define CPU_PPC32172#endif173#endif174175#if defined(__hppa__) || defined(__hppa)176#define CPU_HPPA177#endif178179#if defined(__alpha__) || defined(__alpha) || defined(_M_ALPHA)180#define CPU_ALPHA181#endif182183/* endian */184185#if ((defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && (__BYTE_ORDER == __LITTLE_ENDIAN)) || \186(defined(BYTE_ORDER) && defined(LITTLE_ENDIAN) && (BYTE_ORDER == LITTLE_ENDIAN)) || \187(defined(CPU_X86) || defined(CPU_X86_64)) || \188(defined(vax) || defined(MIPSEL) || defined(_MIPSEL)))189#define CPU_LE190#elif ((defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) && (__BYTE_ORDER == __BIG_ENDIAN)) || \191(defined(BYTE_ORDER) && defined(BIG_ENDIAN) && (BYTE_ORDER == BIG_ENDIAN)) || \192(defined(CPU_SPARC) || defined(CPU_PPC) || defined(mc68000) || defined(sel)) || defined(_MIPSEB))193#define CPU_BE194#else195/* unknown endian! */196#endif197198199#define U8TO32_BE(p) \200(((uint32_t)((p)[0]) << 24) | ((uint32_t)((p)[1]) << 16) | \201((uint32_t)((p)[2]) << 8) | ((uint32_t)((p)[3]) ))202203#define U8TO32_LE(p) \204(((uint32_t)((p)[0]) ) | ((uint32_t)((p)[1]) << 8) | \205((uint32_t)((p)[2]) << 16) | ((uint32_t)((p)[3]) << 24))206207#define U32TO8_BE(p, v) \208(p)[0] = (uint8_t)((v) >> 24); (p)[1] = (uint8_t)((v) >> 16); \209(p)[2] = (uint8_t)((v) >> 8); (p)[3] = (uint8_t)((v) );210211#define U32TO8_LE(p, v) \212(p)[0] = (uint8_t)((v) ); (p)[1] = (uint8_t)((v) >> 8); \213(p)[2] = (uint8_t)((v) >> 16); (p)[3] = (uint8_t)((v) >> 24);214215#define U8TO64_BE(p) \216(((uint64_t)U8TO32_BE(p) << 32) | (uint64_t)U8TO32_BE((p) + 4))217218#define U8TO64_LE(p) \219(((uint64_t)U8TO32_LE(p)) | ((uint64_t)U8TO32_LE((p) + 4) << 32))220221#define U64TO8_BE(p, v) \222U32TO8_BE((p), (uint32_t)((v) >> 32)); \223U32TO8_BE((p) + 4, (uint32_t)((v) ));224225#define U64TO8_LE(p, v) \226U32TO8_LE((p), (uint32_t)((v) )); \227U32TO8_LE((p) + 4, (uint32_t)((v) >> 32));228229#define U32_SWAP(v) { \230(v) = (((v) << 8) & 0xFF00FF00 ) | (((v) >> 8) & 0xFF00FF ); \231(v) = ((v) << 16) | ((v) >> 16); \232}233234#define U64_SWAP(v) { \235(v) = (((v) << 8) & 0xFF00FF00FF00FF00ull ) | (((v) >> 8) & 0x00FF00FF00FF00FFull ); \236(v) = (((v) << 16) & 0xFFFF0000FFFF0000ull ) | (((v) >> 16) & 0x0000FFFF0000FFFFull ); \237(v) = ((v) << 32) | ((v) >> 32); \238}239240static int241scrypt_verify(const uint8_t *x, const uint8_t *y, size_t len) {242uint32_t differentbits = 0;243while (len--)244differentbits |= (*x++ ^ *y++);245return (1 & ((differentbits - 1) >> 8));246}247248void249scrypt_ensure_zero(void *p, size_t len) {250#if ((defined(CPU_X86) || defined(CPU_X86_64)) && defined(COMPILER_MSVC))251__stosb((unsigned char *)p, 0, len);252#elif (defined(CPU_X86) && defined(COMPILER_GCC))253__asm__ __volatile__(254"pushl %%edi;\n"255"pushl %%ecx;\n"256"rep stosb;\n"257"popl %%ecx;\n"258"popl %%edi;\n"259:: "a"(0), "D"(p), "c"(len) : "cc", "memory"260);261#elif (defined(CPU_X86_64) && defined(COMPILER_GCC))262__asm__ __volatile__(263"pushq %%rdi;\n"264"pushq %%rcx;\n"265"rep stosb;\n"266"popq %%rcx;\n"267"popq %%rdi;\n"268:: "a"(0), "D"(p), "c"(len) : "cc", "memory"269);270#else271volatile uint8_t *b = (volatile uint8_t *)p;272size_t i;273for (i = 0; i < len; i++)274b[i] = 0;275#endif276}277278#ifdef __arm__279280static size_t detect_cpu(void) {281return 0;282}283284#endif285286#include "scrypt-jane-portable-x86.h"287288289290