@leocuvee/wrkzcoin-multi-hashing 0.0.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.travis.yml +5 -0
- package/LICENSE +674 -0
- package/README.md +87 -0
- package/appveyor.yml +12 -0
- package/argon2/.gitattributes +10 -0
- package/argon2/.travis.yml +25 -0
- package/argon2/Argon2.sln +160 -0
- package/argon2/CHANGELOG.md +32 -0
- package/argon2/CMakeLists.txt +87 -0
- package/argon2/LICENSE +314 -0
- package/argon2/Makefile +196 -0
- package/argon2/README.md +297 -0
- package/argon2/appveyor.yml +40 -0
- package/argon2/argon2-specs.pdf +0 -0
- package/argon2/export.sh +7 -0
- package/argon2/include/argon2.h +427 -0
- package/argon2/latex/CMakeLists.txt +34 -0
- package/argon2/latex/IEEEtran.cls +6347 -0
- package/argon2/latex/Makefile +18 -0
- package/argon2/latex/argon2-specs.tex +920 -0
- package/argon2/latex/pics/argon2-par.pdf +0 -0
- package/argon2/latex/pics/compression.pdf +0 -0
- package/argon2/latex/pics/generic.pdf +0 -0
- package/argon2/latex/pics/power-distribution.jpg +0 -0
- package/argon2/latex/tradeoff.bib +822 -0
- package/argon2/libargon2.pc +16 -0
- package/argon2/man/CMakeLists.txt +8 -0
- package/argon2/man/argon2.1 +57 -0
- package/argon2/meson.build +16 -0
- package/argon2/meson_options.txt +1 -0
- package/argon2/src/CMakeLists.txt +147 -0
- package/argon2/src/argon2.c +452 -0
- package/argon2/src/argon2.pc.in +11 -0
- package/argon2/src/blake2/blake2-impl.h +156 -0
- package/argon2/src/blake2/blake2.h +89 -0
- package/argon2/src/blake2/blake2b.c +390 -0
- package/argon2/src/blake2/blamka-round-opt.h +471 -0
- package/argon2/src/blake2/blamka-round-ref.h +56 -0
- package/argon2/src/core.c +634 -0
- package/argon2/src/core.h +228 -0
- package/argon2/src/encoding.c +467 -0
- package/argon2/src/encoding.h +57 -0
- package/argon2/src/genkat.h +51 -0
- package/argon2/src/meson.build +68 -0
- package/argon2/src/opt.c +283 -0
- package/argon2/src/optimization/CMakeLists.txt +10 -0
- package/argon2/src/ref.c +194 -0
- package/argon2/src/thread.c +57 -0
- package/argon2/src/thread.h +67 -0
- package/argon2/tests/CMakeLists.txt +43 -0
- package/argon2/tests/bench.c +111 -0
- package/argon2/tests/genkat.c +207 -0
- package/argon2/tests/kats/argon2d +12304 -0
- package/argon2/tests/kats/argon2d.shasum +1 -0
- package/argon2/tests/kats/argon2d_v16 +12304 -0
- package/argon2/tests/kats/argon2d_v16.shasum +1 -0
- package/argon2/tests/kats/argon2i +12304 -0
- package/argon2/tests/kats/argon2i.shasum +1 -0
- package/argon2/tests/kats/argon2i_v16 +12304 -0
- package/argon2/tests/kats/argon2i_v16.shasum +1 -0
- package/argon2/tests/kats/argon2id +12304 -0
- package/argon2/tests/kats/argon2id.shasum +1 -0
- package/argon2/tests/kats/argon2id_v16 +12304 -0
- package/argon2/tests/kats/argon2id_v16.shasum +1 -0
- package/argon2/tests/kats/check-sums.ps1 +48 -0
- package/argon2/tests/kats/check-sums.sh +16 -0
- package/argon2/tests/kats/test.ps1 +132 -0
- package/argon2/tests/kats/test.sh +117 -0
- package/argon2/tests/meson.build +34 -0
- package/argon2/tests/test.c +289 -0
- package/argon2/tool/CMakeLists.txt +7 -0
- package/argon2/tool/main.c +339 -0
- package/argon2/tool/meson.build +8 -0
- package/argon2/vs2015/Argon2Opt/Argon2Opt.vcxproj +226 -0
- package/argon2/vs2015/Argon2Opt/Argon2Opt.vcxproj.filters +69 -0
- package/argon2/vs2015/Argon2OptBench/Argon2OptBench.vcxproj +226 -0
- package/argon2/vs2015/Argon2OptBench/Argon2OptBench.vcxproj.filters +69 -0
- package/argon2/vs2015/Argon2OptDll/Argon2OptDll.vcxproj +225 -0
- package/argon2/vs2015/Argon2OptDll/Argon2OptDll.vcxproj.filters +66 -0
- package/argon2/vs2015/Argon2OptGenKAT/Argon2OptGenKAT.vcxproj +239 -0
- package/argon2/vs2015/Argon2OptGenKAT/Argon2OptGenKAT.vcxproj.filters +72 -0
- package/argon2/vs2015/Argon2OptTestCI/Argon2OptTestCI.vcxproj +227 -0
- package/argon2/vs2015/Argon2OptTestCI/Argon2OptTestCI.vcxproj.filters +69 -0
- package/argon2/vs2015/Argon2Ref/Argon2Ref.vcxproj +226 -0
- package/argon2/vs2015/Argon2Ref/Argon2Ref.vcxproj.filters +69 -0
- package/argon2/vs2015/Argon2RefBench/Argon2RefBench.vcxproj +226 -0
- package/argon2/vs2015/Argon2RefBench/Argon2RefBench.vcxproj.filters +69 -0
- package/argon2/vs2015/Argon2RefDll/Argon2RefDll.vcxproj +225 -0
- package/argon2/vs2015/Argon2RefDll/Argon2RefDll.vcxproj.filters +66 -0
- package/argon2/vs2015/Argon2RefGenKAT/Argon2RefGenKAT.vcxproj +227 -0
- package/argon2/vs2015/Argon2RefGenKAT/Argon2RefGenKAT.vcxproj.filters +72 -0
- package/argon2/vs2015/Argon2RefTestCI/Argon2RefTestCI.vcxproj +226 -0
- package/argon2/vs2015/Argon2RefTestCI/Argon2RefTestCI.vcxproj.filters +69 -0
- package/bcrypt.c +566 -0
- package/bcrypt.h +14 -0
- package/binding.gyp +93 -0
- package/blake.c +17 -0
- package/blake.h +16 -0
- package/boolberry.cc +11 -0
- package/boolberry.h +6 -0
- package/build/Makefile +354 -0
- package/build/Release/.deps/Release/multihashing.node.d +1 -0
- package/build/Release/.deps/Release/obj.target/multihashing/argon2/src/argon2.o.d +8 -0
- package/build/Release/.deps/Release/obj.target/multihashing/argon2/src/blake2/blake2b.o.d +8 -0
- package/build/Release/.deps/Release/obj.target/multihashing/argon2/src/core.o.d +10 -0
- package/build/Release/.deps/Release/obj.target/multihashing/argon2/src/encoding.o.d +8 -0
- package/build/Release/.deps/Release/obj.target/multihashing/argon2/src/ref.o.d +14 -0
- package/build/Release/.deps/Release/obj.target/multihashing/argon2/src/thread.o.d +5 -0
- package/build/Release/.deps/Release/obj.target/multihashing/bcrypt.o.d +4 -0
- package/build/Release/.deps/Release/obj.target/multihashing/blake.o.d +7 -0
- package/build/Release/.deps/Release/obj.target/multihashing/boolberry.o.d +12 -0
- package/build/Release/.deps/Release/obj.target/multihashing/c11.o.d +20 -0
- package/build/Release/.deps/Release/obj.target/multihashing/crypto/aesb.o.d +3 -0
- package/build/Release/.deps/Release/obj.target/multihashing/crypto/c_blake256.o.d +5 -0
- package/build/Release/.deps/Release/obj.target/multihashing/crypto/c_groestl.o.d +10 -0
- package/build/Release/.deps/Release/obj.target/multihashing/crypto/c_jh.o.d +9 -0
- package/build/Release/.deps/Release/obj.target/multihashing/crypto/c_keccak.o.d +7 -0
- package/build/Release/.deps/Release/obj.target/multihashing/crypto/c_skein.o.d +10 -0
- package/build/Release/.deps/Release/obj.target/multihashing/crypto/hash.o.d +7 -0
- package/build/Release/.deps/Release/obj.target/multihashing/crypto/oaes_lib.o.d +6 -0
- package/build/Release/.deps/Release/obj.target/multihashing/crypto/wild_keccak.o.d +8 -0
- package/build/Release/.deps/Release/obj.target/multihashing/cryptonight.o.d +18 -0
- package/build/Release/.deps/Release/obj.target/multihashing/cryptonight_dark.o.d +18 -0
- package/build/Release/.deps/Release/obj.target/multihashing/cryptonight_dark_lite.o.d +18 -0
- package/build/Release/.deps/Release/obj.target/multihashing/cryptonight_fast.o.d +18 -0
- package/build/Release/.deps/Release/obj.target/multihashing/cryptonight_lite.o.d +18 -0
- package/build/Release/.deps/Release/obj.target/multihashing/cryptonight_soft_shell.o.d +18 -0
- package/build/Release/.deps/Release/obj.target/multihashing/cryptonight_turtle.o.d +18 -0
- package/build/Release/.deps/Release/obj.target/multihashing/cryptonight_turtle_lite.o.d +18 -0
- package/build/Release/.deps/Release/obj.target/multihashing/fresh.o.d +10 -0
- package/build/Release/.deps/Release/obj.target/multihashing/fugue.o.d +7 -0
- package/build/Release/.deps/Release/obj.target/multihashing/groestl.o.d +8 -0
- package/build/Release/.deps/Release/obj.target/multihashing/hefty1.o.d +12 -0
- package/build/Release/.deps/Release/obj.target/multihashing/keccak.o.d +8 -0
- package/build/Release/.deps/Release/obj.target/multihashing/multihashing.o.d +155 -0
- package/build/Release/.deps/Release/obj.target/multihashing/nist5.o.d +12 -0
- package/build/Release/.deps/Release/obj.target/multihashing/quark.o.d +14 -0
- package/build/Release/.deps/Release/obj.target/multihashing/qubit.o.d +12 -0
- package/build/Release/.deps/Release/obj.target/multihashing/scryptjane.o.d +30 -0
- package/build/Release/.deps/Release/obj.target/multihashing/scryptn.o.d +6 -0
- package/build/Release/.deps/Release/obj.target/multihashing/sha1.o.d +24 -0
- package/build/Release/.deps/Release/obj.target/multihashing/sha3/aes_helper.o.d +5 -0
- package/build/Release/.deps/Release/obj.target/multihashing/sha3/hamsi.o.d +7 -0
- package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_blake.o.d +6 -0
- package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_bmw.o.d +6 -0
- package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_cubehash.o.d +6 -0
- package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_echo.o.d +7 -0
- package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_fugue.o.d +6 -0
- package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_groestl.o.d +6 -0
- package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_hefty1.o.d +5 -0
- package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_jh.o.d +6 -0
- package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_keccak.o.d +6 -0
- package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_luffa.o.d +6 -0
- package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_shabal.o.d +6 -0
- package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_shavite.o.d +7 -0
- package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_simd.o.d +6 -0
- package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_skein.o.d +6 -0
- package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_whirlpool.o.d +8 -0
- package/build/Release/.deps/Release/obj.target/multihashing/shavite3.o.d +7 -0
- package/build/Release/.deps/Release/obj.target/multihashing/skein.o.d +8 -0
- package/build/Release/.deps/Release/obj.target/multihashing/x11.o.d +20 -0
- package/build/Release/.deps/Release/obj.target/multihashing/x13.o.d +23 -0
- package/build/Release/.deps/Release/obj.target/multihashing/x15.o.d +26 -0
- package/build/Release/.deps/Release/obj.target/multihashing.node.d +1 -0
- package/build/Release/multihashing.node +0 -0
- package/build/binding.Makefile +6 -0
- package/build/multihashing.target.mk +255 -0
- package/c11.c +85 -0
- package/c11.h +17 -0
- package/crypto/aesb.c +177 -0
- package/crypto/c_blake256.c +326 -0
- package/crypto/c_blake256.h +43 -0
- package/crypto/c_groestl.c +360 -0
- package/crypto/c_groestl.h +56 -0
- package/crypto/c_jh.c +367 -0
- package/crypto/c_jh.h +20 -0
- package/crypto/c_keccak.c +112 -0
- package/crypto/c_keccak.h +26 -0
- package/crypto/c_skein.c +2036 -0
- package/crypto/c_skein.h +45 -0
- package/crypto/crypto.h +186 -0
- package/crypto/cryptonote_core/account.cpp +50 -0
- package/crypto/cryptonote_core/account.h +61 -0
- package/crypto/cryptonote_core/cryptonote_basic_impl.cpp +186 -0
- package/crypto/cryptonote_core/cryptonote_basic_impl.h +65 -0
- package/crypto/cryptonote_core/cryptonote_format_utils.cpp +766 -0
- package/crypto/cryptonote_core/cryptonote_format_utils.h +30 -0
- package/crypto/cryptonote_protocol/cryptonote_protocol_defs.h +152 -0
- package/crypto/groestl_tables.h +38 -0
- package/crypto/hash-ops.h +57 -0
- package/crypto/hash.c +24 -0
- package/crypto/hash.h +22 -0
- package/crypto/int-util.h +230 -0
- package/crypto/oaes_config.h +50 -0
- package/crypto/oaes_lib.c +1468 -0
- package/crypto/oaes_lib.h +215 -0
- package/crypto/skein_port.h +190 -0
- package/crypto/variant2_int_sqrt.h +168 -0
- package/crypto/wild_keccak.cpp +119 -0
- package/crypto/wild_keccak.h +168 -0
- package/cryptonight.c +300 -0
- package/cryptonight.h +17 -0
- package/cryptonight_dark.c +300 -0
- package/cryptonight_dark.h +17 -0
- package/cryptonight_dark_lite.c +300 -0
- package/cryptonight_dark_lite.h +17 -0
- package/cryptonight_fast.c +300 -0
- package/cryptonight_fast.h +17 -0
- package/cryptonight_lite.c +300 -0
- package/cryptonight_lite.h +17 -0
- package/cryptonight_soft_shell.c +298 -0
- package/cryptonight_soft_shell.h +17 -0
- package/cryptonight_turtle.c +300 -0
- package/cryptonight_turtle.h +17 -0
- package/cryptonight_turtle_lite.c +300 -0
- package/cryptonight_turtle_lite.h +17 -0
- package/fresh.c +42 -0
- package/fresh.h +16 -0
- package/fugue.c +12 -0
- package/fugue.h +16 -0
- package/groestl.c +40 -0
- package/groestl.h +17 -0
- package/hefty1.c +63 -0
- package/hefty1.h +16 -0
- package/index.js +1 -0
- package/keccak.c +14 -0
- package/keccak.h +16 -0
- package/leocuvee-wrkzcoin-multi-hashing-0.0.20.tgz +0 -0
- package/multihashing.cc +699 -0
- package/nist5.c +46 -0
- package/nist5.h +16 -0
- package/package.json +56 -0
- package/quark.c +210 -0
- package/quark.h +16 -0
- package/qubit.c +45 -0
- package/qubit.h +16 -0
- package/scryptjane/scrypt-jane-chacha.h +132 -0
- package/scryptjane/scrypt-jane-hash.h +48 -0
- package/scryptjane/scrypt-jane-hash_keccak.h +168 -0
- package/scryptjane/scrypt-jane-hash_sha256.h +135 -0
- package/scryptjane/scrypt-jane-mix_chacha-avx.h +340 -0
- package/scryptjane/scrypt-jane-mix_chacha-sse2.h +371 -0
- package/scryptjane/scrypt-jane-mix_chacha-ssse3.h +348 -0
- package/scryptjane/scrypt-jane-mix_chacha.h +69 -0
- package/scryptjane/scrypt-jane-mix_salsa-avx.h +381 -0
- package/scryptjane/scrypt-jane-mix_salsa-sse2.h +443 -0
- package/scryptjane/scrypt-jane-mix_salsa.h +70 -0
- package/scryptjane/scrypt-jane-pbkdf2.h +112 -0
- package/scryptjane/scrypt-jane-portable-x86.h +364 -0
- package/scryptjane/scrypt-jane-portable.h +281 -0
- package/scryptjane/scrypt-jane-romix-basic.h +67 -0
- package/scryptjane/scrypt-jane-romix-template.h +118 -0
- package/scryptjane/scrypt-jane-romix.h +27 -0
- package/scryptjane/scrypt-jane-salsa.h +106 -0
- package/scryptjane/scrypt-jane-test-vectors.h +261 -0
- package/scryptjane.c +223 -0
- package/scryptjane.h +36 -0
- package/scryptn.c +258 -0
- package/scryptn.h +16 -0
- package/sha1.c +65 -0
- package/sha1.h +16 -0
- package/sha256.h +440 -0
- package/sha3/aes_helper.c +392 -0
- package/sha3/hamsi.c +867 -0
- package/sha3/hamsi_helper.c +39648 -0
- package/sha3/md_helper.c +347 -0
- package/sha3/sph_blake.c +1114 -0
- package/sha3/sph_blake.h +327 -0
- package/sha3/sph_bmw.c +965 -0
- package/sha3/sph_bmw.h +328 -0
- package/sha3/sph_cubehash.c +723 -0
- package/sha3/sph_cubehash.h +292 -0
- package/sha3/sph_echo.c +1031 -0
- package/sha3/sph_echo.h +320 -0
- package/sha3/sph_fugue.c +1208 -0
- package/sha3/sph_fugue.h +81 -0
- package/sha3/sph_groestl.c +3119 -0
- package/sha3/sph_groestl.h +329 -0
- package/sha3/sph_hamsi.h +321 -0
- package/sha3/sph_hefty1.c +378 -0
- package/sha3/sph_hefty1.h +66 -0
- package/sha3/sph_jh.c +1116 -0
- package/sha3/sph_jh.h +298 -0
- package/sha3/sph_keccak.c +1824 -0
- package/sha3/sph_keccak.h +293 -0
- package/sha3/sph_luffa.c +1426 -0
- package/sha3/sph_luffa.h +296 -0
- package/sha3/sph_shabal.c +806 -0
- package/sha3/sph_shabal.h +344 -0
- package/sha3/sph_shavite.c +1764 -0
- package/sha3/sph_shavite.h +314 -0
- package/sha3/sph_simd.c +1799 -0
- package/sha3/sph_simd.h +309 -0
- package/sha3/sph_skein.c +1254 -0
- package/sha3/sph_skein.h +298 -0
- package/sha3/sph_types.h +1976 -0
- package/sha3/sph_whirlpool.c +3480 -0
- package/sha3/sph_whirlpool.h +209 -0
- package/shavite3.c +24 -0
- package/shavite3.h +16 -0
- package/skein.c +26 -0
- package/skein.h +16 -0
- package/stdint.h +259 -0
- package/tests/argon2-tests.js +16 -0
- package/tests/benchmark.js +36 -0
- package/tests/cryptonight-tests.js +189 -0
- package/tests/cryptonight_monero.js +53 -0
- package/tests/test.js +16 -0
- package/x11.c +85 -0
- package/x11.h +16 -0
- package/x13.c +97 -0
- package/x13.h +5 -0
- package/x15.c +106 -0
- package/x15.h +16 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
#if defined(SCRYPT_KECCAK256)
|
|
2
|
+
#define SCRYPT_HASH "Keccak-256"
|
|
3
|
+
#define SCRYPT_HASH_DIGEST_SIZE 32
|
|
4
|
+
#else
|
|
5
|
+
#define SCRYPT_HASH "Keccak-512"
|
|
6
|
+
#define SCRYPT_HASH_DIGEST_SIZE 64
|
|
7
|
+
#endif
|
|
8
|
+
#define SCRYPT_KECCAK_F 1600
|
|
9
|
+
#define SCRYPT_KECCAK_C (SCRYPT_HASH_DIGEST_SIZE * 8 * 2) /* 256=512, 512=1024 */
|
|
10
|
+
#define SCRYPT_KECCAK_R (SCRYPT_KECCAK_F - SCRYPT_KECCAK_C) /* 256=1088, 512=576 */
|
|
11
|
+
#define SCRYPT_HASH_BLOCK_SIZE (SCRYPT_KECCAK_R / 8)
|
|
12
|
+
|
|
13
|
+
typedef uint8_t scrypt_hash_digest[SCRYPT_HASH_DIGEST_SIZE];
|
|
14
|
+
|
|
15
|
+
typedef struct scrypt_hash_state_t {
|
|
16
|
+
uint64_t state[SCRYPT_KECCAK_F / 64];
|
|
17
|
+
uint32_t leftover;
|
|
18
|
+
uint8_t buffer[SCRYPT_HASH_BLOCK_SIZE];
|
|
19
|
+
} scrypt_hash_state;
|
|
20
|
+
|
|
21
|
+
static const uint64_t keccak_round_constants[24] = {
|
|
22
|
+
0x0000000000000001ull, 0x0000000000008082ull,
|
|
23
|
+
0x800000000000808aull, 0x8000000080008000ull,
|
|
24
|
+
0x000000000000808bull, 0x0000000080000001ull,
|
|
25
|
+
0x8000000080008081ull, 0x8000000000008009ull,
|
|
26
|
+
0x000000000000008aull, 0x0000000000000088ull,
|
|
27
|
+
0x0000000080008009ull, 0x000000008000000aull,
|
|
28
|
+
0x000000008000808bull, 0x800000000000008bull,
|
|
29
|
+
0x8000000000008089ull, 0x8000000000008003ull,
|
|
30
|
+
0x8000000000008002ull, 0x8000000000000080ull,
|
|
31
|
+
0x000000000000800aull, 0x800000008000000aull,
|
|
32
|
+
0x8000000080008081ull, 0x8000000000008080ull,
|
|
33
|
+
0x0000000080000001ull, 0x8000000080008008ull
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
static void
|
|
37
|
+
keccak_block(scrypt_hash_state *S, const uint8_t *in) {
|
|
38
|
+
size_t i;
|
|
39
|
+
uint64_t *s = S->state, t[5], u[5], v, w;
|
|
40
|
+
|
|
41
|
+
/* absorb input */
|
|
42
|
+
for (i = 0; i < SCRYPT_HASH_BLOCK_SIZE / 8; i++, in += 8)
|
|
43
|
+
s[i] ^= U8TO64_LE(in);
|
|
44
|
+
|
|
45
|
+
for (i = 0; i < 24; i++) {
|
|
46
|
+
/* theta: c = a[0,i] ^ a[1,i] ^ .. a[4,i] */
|
|
47
|
+
t[0] = s[0] ^ s[5] ^ s[10] ^ s[15] ^ s[20];
|
|
48
|
+
t[1] = s[1] ^ s[6] ^ s[11] ^ s[16] ^ s[21];
|
|
49
|
+
t[2] = s[2] ^ s[7] ^ s[12] ^ s[17] ^ s[22];
|
|
50
|
+
t[3] = s[3] ^ s[8] ^ s[13] ^ s[18] ^ s[23];
|
|
51
|
+
t[4] = s[4] ^ s[9] ^ s[14] ^ s[19] ^ s[24];
|
|
52
|
+
|
|
53
|
+
/* theta: d[i] = c[i+4] ^ rotl(c[i+1],1) */
|
|
54
|
+
u[0] = t[4] ^ ROTL64(t[1], 1);
|
|
55
|
+
u[1] = t[0] ^ ROTL64(t[2], 1);
|
|
56
|
+
u[2] = t[1] ^ ROTL64(t[3], 1);
|
|
57
|
+
u[3] = t[2] ^ ROTL64(t[4], 1);
|
|
58
|
+
u[4] = t[3] ^ ROTL64(t[0], 1);
|
|
59
|
+
|
|
60
|
+
/* theta: a[0,i], a[1,i], .. a[4,i] ^= d[i] */
|
|
61
|
+
s[0] ^= u[0]; s[5] ^= u[0]; s[10] ^= u[0]; s[15] ^= u[0]; s[20] ^= u[0];
|
|
62
|
+
s[1] ^= u[1]; s[6] ^= u[1]; s[11] ^= u[1]; s[16] ^= u[1]; s[21] ^= u[1];
|
|
63
|
+
s[2] ^= u[2]; s[7] ^= u[2]; s[12] ^= u[2]; s[17] ^= u[2]; s[22] ^= u[2];
|
|
64
|
+
s[3] ^= u[3]; s[8] ^= u[3]; s[13] ^= u[3]; s[18] ^= u[3]; s[23] ^= u[3];
|
|
65
|
+
s[4] ^= u[4]; s[9] ^= u[4]; s[14] ^= u[4]; s[19] ^= u[4]; s[24] ^= u[4];
|
|
66
|
+
|
|
67
|
+
/* rho pi: b[..] = rotl(a[..], ..) */
|
|
68
|
+
v = s[ 1];
|
|
69
|
+
s[ 1] = ROTL64(s[ 6], 44);
|
|
70
|
+
s[ 6] = ROTL64(s[ 9], 20);
|
|
71
|
+
s[ 9] = ROTL64(s[22], 61);
|
|
72
|
+
s[22] = ROTL64(s[14], 39);
|
|
73
|
+
s[14] = ROTL64(s[20], 18);
|
|
74
|
+
s[20] = ROTL64(s[ 2], 62);
|
|
75
|
+
s[ 2] = ROTL64(s[12], 43);
|
|
76
|
+
s[12] = ROTL64(s[13], 25);
|
|
77
|
+
s[13] = ROTL64(s[19], 8);
|
|
78
|
+
s[19] = ROTL64(s[23], 56);
|
|
79
|
+
s[23] = ROTL64(s[15], 41);
|
|
80
|
+
s[15] = ROTL64(s[ 4], 27);
|
|
81
|
+
s[ 4] = ROTL64(s[24], 14);
|
|
82
|
+
s[24] = ROTL64(s[21], 2);
|
|
83
|
+
s[21] = ROTL64(s[ 8], 55);
|
|
84
|
+
s[ 8] = ROTL64(s[16], 45);
|
|
85
|
+
s[16] = ROTL64(s[ 5], 36);
|
|
86
|
+
s[ 5] = ROTL64(s[ 3], 28);
|
|
87
|
+
s[ 3] = ROTL64(s[18], 21);
|
|
88
|
+
s[18] = ROTL64(s[17], 15);
|
|
89
|
+
s[17] = ROTL64(s[11], 10);
|
|
90
|
+
s[11] = ROTL64(s[ 7], 6);
|
|
91
|
+
s[ 7] = ROTL64(s[10], 3);
|
|
92
|
+
s[10] = ROTL64( v, 1);
|
|
93
|
+
|
|
94
|
+
/* chi: a[i,j] ^= ~b[i,j+1] & b[i,j+2] */
|
|
95
|
+
v = s[ 0]; w = s[ 1]; s[ 0] ^= (~w) & s[ 2]; s[ 1] ^= (~s[ 2]) & s[ 3]; s[ 2] ^= (~s[ 3]) & s[ 4]; s[ 3] ^= (~s[ 4]) & v; s[ 4] ^= (~v) & w;
|
|
96
|
+
v = s[ 5]; w = s[ 6]; s[ 5] ^= (~w) & s[ 7]; s[ 6] ^= (~s[ 7]) & s[ 8]; s[ 7] ^= (~s[ 8]) & s[ 9]; s[ 8] ^= (~s[ 9]) & v; s[ 9] ^= (~v) & w;
|
|
97
|
+
v = s[10]; w = s[11]; s[10] ^= (~w) & s[12]; s[11] ^= (~s[12]) & s[13]; s[12] ^= (~s[13]) & s[14]; s[13] ^= (~s[14]) & v; s[14] ^= (~v) & w;
|
|
98
|
+
v = s[15]; w = s[16]; s[15] ^= (~w) & s[17]; s[16] ^= (~s[17]) & s[18]; s[17] ^= (~s[18]) & s[19]; s[18] ^= (~s[19]) & v; s[19] ^= (~v) & w;
|
|
99
|
+
v = s[20]; w = s[21]; s[20] ^= (~w) & s[22]; s[21] ^= (~s[22]) & s[23]; s[22] ^= (~s[23]) & s[24]; s[23] ^= (~s[24]) & v; s[24] ^= (~v) & w;
|
|
100
|
+
|
|
101
|
+
/* iota: a[0,0] ^= round constant */
|
|
102
|
+
s[0] ^= keccak_round_constants[i];
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
static void
|
|
107
|
+
scrypt_hash_init(scrypt_hash_state *S) {
|
|
108
|
+
memset(S, 0, sizeof(*S));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
static void
|
|
112
|
+
scrypt_hash_update(scrypt_hash_state *S, const uint8_t *in, size_t inlen) {
|
|
113
|
+
size_t want;
|
|
114
|
+
|
|
115
|
+
/* handle the previous data */
|
|
116
|
+
if (S->leftover) {
|
|
117
|
+
want = (SCRYPT_HASH_BLOCK_SIZE - S->leftover);
|
|
118
|
+
want = (want < inlen) ? want : inlen;
|
|
119
|
+
memcpy(S->buffer + S->leftover, in, want);
|
|
120
|
+
S->leftover += (uint32_t)want;
|
|
121
|
+
if (S->leftover < SCRYPT_HASH_BLOCK_SIZE)
|
|
122
|
+
return;
|
|
123
|
+
in += want;
|
|
124
|
+
inlen -= want;
|
|
125
|
+
keccak_block(S, S->buffer);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* handle the current data */
|
|
129
|
+
while (inlen >= SCRYPT_HASH_BLOCK_SIZE) {
|
|
130
|
+
keccak_block(S, in);
|
|
131
|
+
in += SCRYPT_HASH_BLOCK_SIZE;
|
|
132
|
+
inlen -= SCRYPT_HASH_BLOCK_SIZE;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/* handle leftover data */
|
|
136
|
+
S->leftover = (uint32_t)inlen;
|
|
137
|
+
if (S->leftover)
|
|
138
|
+
memcpy(S->buffer, in, S->leftover);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
static void
|
|
142
|
+
scrypt_hash_finish(scrypt_hash_state *S, uint8_t *hash) {
|
|
143
|
+
size_t i;
|
|
144
|
+
|
|
145
|
+
S->buffer[S->leftover] = 0x01;
|
|
146
|
+
memset(S->buffer + (S->leftover + 1), 0, SCRYPT_HASH_BLOCK_SIZE - (S->leftover + 1));
|
|
147
|
+
S->buffer[SCRYPT_HASH_BLOCK_SIZE - 1] |= 0x80;
|
|
148
|
+
keccak_block(S, S->buffer);
|
|
149
|
+
|
|
150
|
+
for (i = 0; i < SCRYPT_HASH_DIGEST_SIZE; i += 8) {
|
|
151
|
+
U64TO8_LE(&hash[i], S->state[i / 8]);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
#if defined(SCRYPT_KECCAK256)
|
|
156
|
+
static const uint8_t scrypt_test_hash_expected[SCRYPT_HASH_DIGEST_SIZE] = {
|
|
157
|
+
0x26,0xb7,0x10,0xb3,0x66,0xb1,0xd1,0xb1,0x25,0xfc,0x3e,0xe3,0x1e,0x33,0x1d,0x19,
|
|
158
|
+
0x94,0xaa,0x63,0x7a,0xd5,0x77,0x29,0xb4,0x27,0xe9,0xe0,0xf4,0x19,0xba,0x68,0xea,
|
|
159
|
+
};
|
|
160
|
+
#else
|
|
161
|
+
static const uint8_t scrypt_test_hash_expected[SCRYPT_HASH_DIGEST_SIZE] = {
|
|
162
|
+
0x17,0xc7,0x8c,0xa0,0xd9,0x08,0x1d,0xba,0x8a,0xc8,0x3e,0x07,0x90,0xda,0x91,0x88,
|
|
163
|
+
0x25,0xbd,0xd3,0xf8,0x78,0x4a,0x8d,0x5e,0xe4,0x96,0x9c,0x01,0xf3,0xeb,0xdc,0x12,
|
|
164
|
+
0xea,0x35,0x57,0xba,0x94,0xb8,0xe9,0xb9,0x27,0x45,0x0a,0x48,0x5c,0x3d,0x69,0xf0,
|
|
165
|
+
0xdb,0x22,0x38,0xb5,0x52,0x22,0x29,0xea,0x7a,0xb2,0xe6,0x07,0xaa,0x37,0x4d,0xe6,
|
|
166
|
+
};
|
|
167
|
+
#endif
|
|
168
|
+
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
#define SCRYPT_HASH "SHA-2-256"
|
|
2
|
+
#define SCRYPT_HASH_BLOCK_SIZE 64
|
|
3
|
+
#define SCRYPT_HASH_DIGEST_SIZE 32
|
|
4
|
+
|
|
5
|
+
typedef uint8_t scrypt_hash_digest[SCRYPT_HASH_DIGEST_SIZE];
|
|
6
|
+
|
|
7
|
+
typedef struct scrypt_hash_state_t {
|
|
8
|
+
uint32_t H[8];
|
|
9
|
+
uint64_t T;
|
|
10
|
+
uint32_t leftover;
|
|
11
|
+
uint8_t buffer[SCRYPT_HASH_BLOCK_SIZE];
|
|
12
|
+
} scrypt_hash_state;
|
|
13
|
+
|
|
14
|
+
static const uint32_t sha256_constants[64] = {
|
|
15
|
+
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
|
|
16
|
+
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
|
|
17
|
+
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
|
|
18
|
+
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
|
|
19
|
+
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
|
|
20
|
+
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
|
|
21
|
+
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
|
22
|
+
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
#define Ch(x,y,z) (z ^ (x & (y ^ z)))
|
|
26
|
+
#define Maj(x,y,z) (((x | y) & z) | (x & y))
|
|
27
|
+
#define S0(x) (ROTR32(x, 2) ^ ROTR32(x, 13) ^ ROTR32(x, 22))
|
|
28
|
+
#define S1(x) (ROTR32(x, 6) ^ ROTR32(x, 11) ^ ROTR32(x, 25))
|
|
29
|
+
#define G0(x) (ROTR32(x, 7) ^ ROTR32(x, 18) ^ (x >> 3))
|
|
30
|
+
#define G1(x) (ROTR32(x, 17) ^ ROTR32(x, 19) ^ (x >> 10))
|
|
31
|
+
#define W0(in,i) (U8TO32_BE(&in[i * 4]))
|
|
32
|
+
#define W1(i) (G1(w[i - 2]) + w[i - 7] + G0(w[i - 15]) + w[i - 16])
|
|
33
|
+
#define STEP(i) \
|
|
34
|
+
t1 = S0(r[0]) + Maj(r[0], r[1], r[2]); \
|
|
35
|
+
t0 = r[7] + S1(r[4]) + Ch(r[4], r[5], r[6]) + sha256_constants[i] + w[i]; \
|
|
36
|
+
r[7] = r[6]; \
|
|
37
|
+
r[6] = r[5]; \
|
|
38
|
+
r[5] = r[4]; \
|
|
39
|
+
r[4] = r[3] + t0; \
|
|
40
|
+
r[3] = r[2]; \
|
|
41
|
+
r[2] = r[1]; \
|
|
42
|
+
r[1] = r[0]; \
|
|
43
|
+
r[0] = t0 + t1;
|
|
44
|
+
|
|
45
|
+
static void
|
|
46
|
+
sha256_blocks(scrypt_hash_state *S, const uint8_t *in, size_t blocks) {
|
|
47
|
+
uint32_t r[8], w[64], t0, t1;
|
|
48
|
+
size_t i;
|
|
49
|
+
|
|
50
|
+
for (i = 0; i < 8; i++) r[i] = S->H[i];
|
|
51
|
+
|
|
52
|
+
while (blocks--) {
|
|
53
|
+
for (i = 0; i < 16; i++) { w[i] = W0(in, i); }
|
|
54
|
+
for (i = 16; i < 64; i++) { w[i] = W1(i); }
|
|
55
|
+
for (i = 0; i < 64; i++) { STEP(i); }
|
|
56
|
+
for (i = 0; i < 8; i++) { r[i] += S->H[i]; S->H[i] = r[i]; }
|
|
57
|
+
S->T += SCRYPT_HASH_BLOCK_SIZE * 8;
|
|
58
|
+
in += SCRYPT_HASH_BLOCK_SIZE;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
static void
|
|
63
|
+
scrypt_hash_init(scrypt_hash_state *S) {
|
|
64
|
+
S->H[0] = 0x6a09e667;
|
|
65
|
+
S->H[1] = 0xbb67ae85;
|
|
66
|
+
S->H[2] = 0x3c6ef372;
|
|
67
|
+
S->H[3] = 0xa54ff53a;
|
|
68
|
+
S->H[4] = 0x510e527f;
|
|
69
|
+
S->H[5] = 0x9b05688c;
|
|
70
|
+
S->H[6] = 0x1f83d9ab;
|
|
71
|
+
S->H[7] = 0x5be0cd19;
|
|
72
|
+
S->T = 0;
|
|
73
|
+
S->leftover = 0;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
static void
|
|
77
|
+
scrypt_hash_update(scrypt_hash_state *S, const uint8_t *in, size_t inlen) {
|
|
78
|
+
size_t blocks, want;
|
|
79
|
+
|
|
80
|
+
/* handle the previous data */
|
|
81
|
+
if (S->leftover) {
|
|
82
|
+
want = (SCRYPT_HASH_BLOCK_SIZE - S->leftover);
|
|
83
|
+
want = (want < inlen) ? want : inlen;
|
|
84
|
+
memcpy(S->buffer + S->leftover, in, want);
|
|
85
|
+
S->leftover += (uint32_t)want;
|
|
86
|
+
if (S->leftover < SCRYPT_HASH_BLOCK_SIZE)
|
|
87
|
+
return;
|
|
88
|
+
in += want;
|
|
89
|
+
inlen -= want;
|
|
90
|
+
sha256_blocks(S, S->buffer, 1);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/* handle the current data */
|
|
94
|
+
blocks = (inlen & ~(SCRYPT_HASH_BLOCK_SIZE - 1));
|
|
95
|
+
S->leftover = (uint32_t)(inlen - blocks);
|
|
96
|
+
if (blocks) {
|
|
97
|
+
sha256_blocks(S, in, blocks / SCRYPT_HASH_BLOCK_SIZE);
|
|
98
|
+
in += blocks;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/* handle leftover data */
|
|
102
|
+
if (S->leftover)
|
|
103
|
+
memcpy(S->buffer, in, S->leftover);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
static void
|
|
107
|
+
scrypt_hash_finish(scrypt_hash_state *S, uint8_t *hash) {
|
|
108
|
+
uint64_t t = S->T + (S->leftover * 8);
|
|
109
|
+
|
|
110
|
+
S->buffer[S->leftover] = 0x80;
|
|
111
|
+
if (S->leftover <= 55) {
|
|
112
|
+
memset(S->buffer + S->leftover + 1, 0, 55 - S->leftover);
|
|
113
|
+
} else {
|
|
114
|
+
memset(S->buffer + S->leftover + 1, 0, 63 - S->leftover);
|
|
115
|
+
sha256_blocks(S, S->buffer, 1);
|
|
116
|
+
memset(S->buffer, 0, 56);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
U64TO8_BE(S->buffer + 56, t);
|
|
120
|
+
sha256_blocks(S, S->buffer, 1);
|
|
121
|
+
|
|
122
|
+
U32TO8_BE(&hash[ 0], S->H[0]);
|
|
123
|
+
U32TO8_BE(&hash[ 4], S->H[1]);
|
|
124
|
+
U32TO8_BE(&hash[ 8], S->H[2]);
|
|
125
|
+
U32TO8_BE(&hash[12], S->H[3]);
|
|
126
|
+
U32TO8_BE(&hash[16], S->H[4]);
|
|
127
|
+
U32TO8_BE(&hash[20], S->H[5]);
|
|
128
|
+
U32TO8_BE(&hash[24], S->H[6]);
|
|
129
|
+
U32TO8_BE(&hash[28], S->H[7]);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
static const uint8_t scrypt_test_hash_expected[SCRYPT_HASH_DIGEST_SIZE] = {
|
|
133
|
+
0xee,0x36,0xae,0xa6,0x65,0xf0,0x28,0x7d,0xc9,0xde,0xd8,0xad,0x48,0x33,0x7d,0xbf,
|
|
134
|
+
0xcb,0xc0,0x48,0xfa,0x5f,0x92,0xfd,0x0a,0x95,0x6f,0x34,0x8e,0x8c,0x1e,0x73,0xad,
|
|
135
|
+
};
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
/* x86 */
|
|
2
|
+
#if defined(X86ASM_AVX) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_CHACHA_INCLUDED))
|
|
3
|
+
|
|
4
|
+
#define SCRYPT_CHACHA_AVX
|
|
5
|
+
|
|
6
|
+
asm_naked_fn_proto(void, scrypt_ChunkMix_avx)(uint32_t *Bout/*[chunkBytes]*/, uint32_t *Bin/*[chunkBytes]*/, uint32_t *Bxor/*[chunkBytes]*/, uint32_t r)
|
|
7
|
+
asm_naked_fn(scrypt_ChunkMix_avx)
|
|
8
|
+
a1(push ebx)
|
|
9
|
+
a1(push edi)
|
|
10
|
+
a1(push esi)
|
|
11
|
+
a1(push ebp)
|
|
12
|
+
a2(mov ebp,esp)
|
|
13
|
+
a2(mov edi,[ebp+20])
|
|
14
|
+
a2(mov esi,[ebp+24])
|
|
15
|
+
a2(mov eax,[ebp+28])
|
|
16
|
+
a2(mov ebx,[ebp+32])
|
|
17
|
+
a2(sub esp,64)
|
|
18
|
+
a2(and esp,~63)
|
|
19
|
+
a2(lea edx,[ebx*2])
|
|
20
|
+
a2(shl edx,6)
|
|
21
|
+
a2(lea ecx,[edx-64])
|
|
22
|
+
a2(and eax, eax)
|
|
23
|
+
a2(vmovdqa xmm4,[ssse3_rotl16_32bit])
|
|
24
|
+
a2(vmovdqa xmm5,[ssse3_rotl8_32bit])
|
|
25
|
+
a2(vmovdqa xmm0,[ecx+esi+0])
|
|
26
|
+
a2(vmovdqa xmm1,[ecx+esi+16])
|
|
27
|
+
a2(vmovdqa xmm2,[ecx+esi+32])
|
|
28
|
+
a2(vmovdqa xmm3,[ecx+esi+48])
|
|
29
|
+
a1(jz scrypt_ChunkMix_avx_no_xor1)
|
|
30
|
+
a3(vpxor xmm0,xmm0,[ecx+eax+0])
|
|
31
|
+
a3(vpxor xmm1,xmm1,[ecx+eax+16])
|
|
32
|
+
a3(vpxor xmm2,xmm2,[ecx+eax+32])
|
|
33
|
+
a3(vpxor xmm3,xmm3,[ecx+eax+48])
|
|
34
|
+
a1(scrypt_ChunkMix_avx_no_xor1:)
|
|
35
|
+
a2(xor ecx,ecx)
|
|
36
|
+
a2(xor ebx,ebx)
|
|
37
|
+
a1(scrypt_ChunkMix_avx_loop:)
|
|
38
|
+
a2(and eax, eax)
|
|
39
|
+
a3(vpxor xmm0,xmm0,[esi+ecx+0])
|
|
40
|
+
a3(vpxor xmm1,xmm1,[esi+ecx+16])
|
|
41
|
+
a3(vpxor xmm2,xmm2,[esi+ecx+32])
|
|
42
|
+
a3(vpxor xmm3,xmm3,[esi+ecx+48])
|
|
43
|
+
a1(jz scrypt_ChunkMix_avx_no_xor2)
|
|
44
|
+
a3(vpxor xmm0,xmm0,[eax+ecx+0])
|
|
45
|
+
a3(vpxor xmm1,xmm1,[eax+ecx+16])
|
|
46
|
+
a3(vpxor xmm2,xmm2,[eax+ecx+32])
|
|
47
|
+
a3(vpxor xmm3,xmm3,[eax+ecx+48])
|
|
48
|
+
a1(scrypt_ChunkMix_avx_no_xor2:)
|
|
49
|
+
a2(vmovdqa [esp+0],xmm0)
|
|
50
|
+
a2(vmovdqa [esp+16],xmm1)
|
|
51
|
+
a2(vmovdqa [esp+32],xmm2)
|
|
52
|
+
a2(vmovdqa [esp+48],xmm3)
|
|
53
|
+
a2(mov eax,8)
|
|
54
|
+
a1(scrypt_chacha_avx_loop: )
|
|
55
|
+
a3(vpaddd xmm0,xmm0,xmm1)
|
|
56
|
+
a3(vpxor xmm3,xmm3,xmm0)
|
|
57
|
+
a3(vpshufb xmm3,xmm3,xmm4)
|
|
58
|
+
a3(vpaddd xmm2,xmm2,xmm3)
|
|
59
|
+
a3(vpxor xmm1,xmm1,xmm2)
|
|
60
|
+
a3(vpsrld xmm6,xmm1,20)
|
|
61
|
+
a3(vpslld xmm1,xmm1,12)
|
|
62
|
+
a3(vpxor xmm1,xmm1,xmm6)
|
|
63
|
+
a3(vpaddd xmm0,xmm0,xmm1)
|
|
64
|
+
a3(vpxor xmm3,xmm3,xmm0)
|
|
65
|
+
a3(vpshufb xmm3,xmm3,xmm5)
|
|
66
|
+
a3(vpshufd xmm0,xmm0,0x93)
|
|
67
|
+
a3(vpaddd xmm2,xmm2,xmm3)
|
|
68
|
+
a3(vpshufd xmm3,xmm3,0x4e)
|
|
69
|
+
a3(vpxor xmm1,xmm1,xmm2)
|
|
70
|
+
a3(vpshufd xmm2,xmm2,0x39)
|
|
71
|
+
a3(vpsrld xmm6,xmm1,25)
|
|
72
|
+
a3(vpslld xmm1,xmm1,7)
|
|
73
|
+
a3(vpxor xmm1,xmm1,xmm6)
|
|
74
|
+
a2(sub eax,2)
|
|
75
|
+
a3(vpaddd xmm0,xmm0,xmm1)
|
|
76
|
+
a3(vpxor xmm3,xmm3,xmm0)
|
|
77
|
+
a3(vpshufb xmm3,xmm3,xmm4)
|
|
78
|
+
a3(vpaddd xmm2,xmm2,xmm3)
|
|
79
|
+
a3(vpxor xmm1,xmm1,xmm2)
|
|
80
|
+
a3(vpsrld xmm6,xmm1,20)
|
|
81
|
+
a3(vpslld xmm1,xmm1,12)
|
|
82
|
+
a3(vpxor xmm1,xmm1,xmm6)
|
|
83
|
+
a3(vpaddd xmm0,xmm0,xmm1)
|
|
84
|
+
a3(vpxor xmm3,xmm3,xmm0)
|
|
85
|
+
a3(vpshufb xmm3,xmm3,xmm5)
|
|
86
|
+
a3(vpshufd xmm0,xmm0,0x39)
|
|
87
|
+
a3(vpaddd xmm2,xmm2,xmm3)
|
|
88
|
+
a3(pshufd xmm3,xmm3,0x4e)
|
|
89
|
+
a3(vpxor xmm1,xmm1,xmm2)
|
|
90
|
+
a3(pshufd xmm2,xmm2,0x93)
|
|
91
|
+
a3(vpsrld xmm6,xmm1,25)
|
|
92
|
+
a3(vpslld xmm1,xmm1,7)
|
|
93
|
+
a3(vpxor xmm1,xmm1,xmm6)
|
|
94
|
+
a1(ja scrypt_chacha_avx_loop)
|
|
95
|
+
a3(vpaddd xmm0,xmm0,[esp+0])
|
|
96
|
+
a3(vpaddd xmm1,xmm1,[esp+16])
|
|
97
|
+
a3(vpaddd xmm2,xmm2,[esp+32])
|
|
98
|
+
a3(vpaddd xmm3,xmm3,[esp+48])
|
|
99
|
+
a2(lea eax,[ebx+ecx])
|
|
100
|
+
a2(xor ebx,edx)
|
|
101
|
+
a2(and eax,~0x7f)
|
|
102
|
+
a2(add ecx,64)
|
|
103
|
+
a2(shr eax,1)
|
|
104
|
+
a2(add eax, edi)
|
|
105
|
+
a2(cmp ecx,edx)
|
|
106
|
+
a2(vmovdqa [eax+0],xmm0)
|
|
107
|
+
a2(vmovdqa [eax+16],xmm1)
|
|
108
|
+
a2(vmovdqa [eax+32],xmm2)
|
|
109
|
+
a2(vmovdqa [eax+48],xmm3)
|
|
110
|
+
a2(mov eax,[ebp+28])
|
|
111
|
+
a1(jne scrypt_ChunkMix_avx_loop)
|
|
112
|
+
a2(mov esp,ebp)
|
|
113
|
+
a1(pop ebp)
|
|
114
|
+
a1(pop esi)
|
|
115
|
+
a1(pop edi)
|
|
116
|
+
a1(pop ebx)
|
|
117
|
+
a1(ret 16)
|
|
118
|
+
asm_naked_fn_end(scrypt_ChunkMix_avx)
|
|
119
|
+
|
|
120
|
+
#endif
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
/* x64 */
|
|
125
|
+
#if defined(X86_64ASM_AVX) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_CHACHA_INCLUDED))
|
|
126
|
+
|
|
127
|
+
#define SCRYPT_CHACHA_AVX
|
|
128
|
+
|
|
129
|
+
asm_naked_fn_proto(void, scrypt_ChunkMix_avx)(uint32_t *Bout/*[chunkBytes]*/, uint32_t *Bin/*[chunkBytes]*/, uint32_t *Bxor/*[chunkBytes]*/, uint32_t r)
|
|
130
|
+
asm_naked_fn(scrypt_ChunkMix_avx)
|
|
131
|
+
a2(lea rcx,[rcx*2])
|
|
132
|
+
a2(shl rcx,6)
|
|
133
|
+
a2(lea r9,[rcx-64])
|
|
134
|
+
a2(lea rax,[rsi+r9])
|
|
135
|
+
a2(lea r9,[rdx+r9])
|
|
136
|
+
a2(and rdx, rdx)
|
|
137
|
+
a2(vmovdqa xmm4,[ssse3_rotl16_32bit])
|
|
138
|
+
a2(vmovdqa xmm5,[ssse3_rotl8_32bit])
|
|
139
|
+
a2(vmovdqa xmm0,[rax+0])
|
|
140
|
+
a2(vmovdqa xmm1,[rax+16])
|
|
141
|
+
a2(vmovdqa xmm2,[rax+32])
|
|
142
|
+
a2(vmovdqa xmm3,[rax+48])
|
|
143
|
+
a1(jz scrypt_ChunkMix_avx_no_xor1)
|
|
144
|
+
a3(vpxor xmm0,xmm0,[r9+0])
|
|
145
|
+
a3(vpxor xmm1,xmm1,[r9+16])
|
|
146
|
+
a3(vpxor xmm2,xmm2,[r9+32])
|
|
147
|
+
a3(vpxor xmm3,xmm3,[r9+48])
|
|
148
|
+
a1(scrypt_ChunkMix_avx_no_xor1:)
|
|
149
|
+
a2(xor r8,r8)
|
|
150
|
+
a2(xor r9,r9)
|
|
151
|
+
a1(scrypt_ChunkMix_avx_loop:)
|
|
152
|
+
a2(and rdx, rdx)
|
|
153
|
+
a3(vpxor xmm0,xmm0,[rsi+r9+0])
|
|
154
|
+
a3(vpxor xmm1,xmm1,[rsi+r9+16])
|
|
155
|
+
a3(vpxor xmm2,xmm2,[rsi+r9+32])
|
|
156
|
+
a3(vpxor xmm3,xmm3,[rsi+r9+48])
|
|
157
|
+
a1(jz scrypt_ChunkMix_avx_no_xor2)
|
|
158
|
+
a3(vpxor xmm0,xmm0,[rdx+r9+0])
|
|
159
|
+
a3(vpxor xmm1,xmm1,[rdx+r9+16])
|
|
160
|
+
a3(vpxor xmm2,xmm2,[rdx+r9+32])
|
|
161
|
+
a3(vpxor xmm3,xmm3,[rdx+r9+48])
|
|
162
|
+
a1(scrypt_ChunkMix_avx_no_xor2:)
|
|
163
|
+
a2(vmovdqa xmm8,xmm0)
|
|
164
|
+
a2(vmovdqa xmm9,xmm1)
|
|
165
|
+
a2(vmovdqa xmm10,xmm2)
|
|
166
|
+
a2(vmovdqa xmm11,xmm3)
|
|
167
|
+
a2(mov rax,8)
|
|
168
|
+
a1(scrypt_chacha_avx_loop: )
|
|
169
|
+
a3(vpaddd xmm0,xmm0,xmm1)
|
|
170
|
+
a3(vpxor xmm3,xmm3,xmm0)
|
|
171
|
+
a3(vpshufb xmm3,xmm3,xmm4)
|
|
172
|
+
a3(vpaddd xmm2,xmm2,xmm3)
|
|
173
|
+
a3(vpxor xmm1,xmm1,xmm2)
|
|
174
|
+
a3(vpsrld xmm12,xmm1,20)
|
|
175
|
+
a3(vpslld xmm1,xmm1,12)
|
|
176
|
+
a3(vpxor xmm1,xmm1,xmm12)
|
|
177
|
+
a3(vpaddd xmm0,xmm0,xmm1)
|
|
178
|
+
a3(vpxor xmm3,xmm3,xmm0)
|
|
179
|
+
a3(vpshufb xmm3,xmm3,xmm5)
|
|
180
|
+
a3(vpshufd xmm0,xmm0,0x93)
|
|
181
|
+
a3(vpaddd xmm2,xmm2,xmm3)
|
|
182
|
+
a3(vpshufd xmm3,xmm3,0x4e)
|
|
183
|
+
a3(vpxor xmm1,xmm1,xmm2)
|
|
184
|
+
a3(vpshufd xmm2,xmm2,0x39)
|
|
185
|
+
a3(vpsrld xmm12,xmm1,25)
|
|
186
|
+
a3(vpslld xmm1,xmm1,7)
|
|
187
|
+
a3(vpxor xmm1,xmm1,xmm12)
|
|
188
|
+
a2(sub rax,2)
|
|
189
|
+
a3(vpaddd xmm0,xmm0,xmm1)
|
|
190
|
+
a3(vpxor xmm3,xmm3,xmm0)
|
|
191
|
+
a3(vpshufb xmm3,xmm3,xmm4)
|
|
192
|
+
a3(vpaddd xmm2,xmm2,xmm3)
|
|
193
|
+
a3(vpxor xmm1,xmm1,xmm2)
|
|
194
|
+
a3(vpsrld xmm12,xmm1,20)
|
|
195
|
+
a3(vpslld xmm1,xmm1,12)
|
|
196
|
+
a3(vpxor xmm1,xmm1,xmm12)
|
|
197
|
+
a3(vpaddd xmm0,xmm0,xmm1)
|
|
198
|
+
a3(vpxor xmm3,xmm3,xmm0)
|
|
199
|
+
a3(vpshufb xmm3,xmm3,xmm5)
|
|
200
|
+
a3(vpshufd xmm0,xmm0,0x39)
|
|
201
|
+
a3(vpaddd xmm2,xmm2,xmm3)
|
|
202
|
+
a3(pshufd xmm3,xmm3,0x4e)
|
|
203
|
+
a3(vpxor xmm1,xmm1,xmm2)
|
|
204
|
+
a3(pshufd xmm2,xmm2,0x93)
|
|
205
|
+
a3(vpsrld xmm12,xmm1,25)
|
|
206
|
+
a3(vpslld xmm1,xmm1,7)
|
|
207
|
+
a3(vpxor xmm1,xmm1,xmm12)
|
|
208
|
+
a1(ja scrypt_chacha_avx_loop)
|
|
209
|
+
a3(vpaddd xmm0,xmm0,xmm8)
|
|
210
|
+
a3(vpaddd xmm1,xmm1,xmm9)
|
|
211
|
+
a3(vpaddd xmm2,xmm2,xmm10)
|
|
212
|
+
a3(vpaddd xmm3,xmm3,xmm11)
|
|
213
|
+
a2(lea rax,[r8+r9])
|
|
214
|
+
a2(xor r8,rcx)
|
|
215
|
+
a2(and rax,~0x7f)
|
|
216
|
+
a2(add r9,64)
|
|
217
|
+
a2(shr rax,1)
|
|
218
|
+
a2(add rax, rdi)
|
|
219
|
+
a2(cmp r9,rcx)
|
|
220
|
+
a2(vmovdqa [rax+0],xmm0)
|
|
221
|
+
a2(vmovdqa [rax+16],xmm1)
|
|
222
|
+
a2(vmovdqa [rax+32],xmm2)
|
|
223
|
+
a2(vmovdqa [rax+48],xmm3)
|
|
224
|
+
a1(jne scrypt_ChunkMix_avx_loop)
|
|
225
|
+
a1(ret)
|
|
226
|
+
asm_naked_fn_end(scrypt_ChunkMix_avx)
|
|
227
|
+
|
|
228
|
+
#endif
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
/* intrinsic */
|
|
232
|
+
#if defined(X86_INTRINSIC_AVX) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_CHACHA_INCLUDED))
|
|
233
|
+
|
|
234
|
+
#define SCRYPT_CHACHA_AVX
|
|
235
|
+
|
|
236
|
+
static void NOINLINE
|
|
237
|
+
scrypt_ChunkMix_avx(uint32_t *Bout/*[chunkBytes]*/, uint32_t *Bin/*[chunkBytes]*/, uint32_t *Bxor/*[chunkBytes]*/, uint32_t r) {
|
|
238
|
+
uint32_t i, blocksPerChunk = r * 2, half = 0;
|
|
239
|
+
xmmi *xmmp,x0,x1,x2,x3,x6,t0,t1,t2,t3;
|
|
240
|
+
const xmmi x4 = *(xmmi *)&ssse3_rotl16_32bit, x5 = *(xmmi *)&ssse3_rotl8_32bit;
|
|
241
|
+
size_t rounds;
|
|
242
|
+
|
|
243
|
+
/* 1: X = B_{2r - 1} */
|
|
244
|
+
xmmp = (xmmi *)scrypt_block(Bin, blocksPerChunk - 1);
|
|
245
|
+
x0 = xmmp[0];
|
|
246
|
+
x1 = xmmp[1];
|
|
247
|
+
x2 = xmmp[2];
|
|
248
|
+
x3 = xmmp[3];
|
|
249
|
+
|
|
250
|
+
if (Bxor) {
|
|
251
|
+
xmmp = (xmmi *)scrypt_block(Bxor, blocksPerChunk - 1);
|
|
252
|
+
x0 = _mm_xor_si128(x0, xmmp[0]);
|
|
253
|
+
x1 = _mm_xor_si128(x1, xmmp[1]);
|
|
254
|
+
x2 = _mm_xor_si128(x2, xmmp[2]);
|
|
255
|
+
x3 = _mm_xor_si128(x3, xmmp[3]);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/* 2: for i = 0 to 2r - 1 do */
|
|
259
|
+
for (i = 0; i < blocksPerChunk; i++, half ^= r) {
|
|
260
|
+
/* 3: X = H(X ^ B_i) */
|
|
261
|
+
xmmp = (xmmi *)scrypt_block(Bin, i);
|
|
262
|
+
x0 = _mm_xor_si128(x0, xmmp[0]);
|
|
263
|
+
x1 = _mm_xor_si128(x1, xmmp[1]);
|
|
264
|
+
x2 = _mm_xor_si128(x2, xmmp[2]);
|
|
265
|
+
x3 = _mm_xor_si128(x3, xmmp[3]);
|
|
266
|
+
|
|
267
|
+
if (Bxor) {
|
|
268
|
+
xmmp = (xmmi *)scrypt_block(Bxor, i);
|
|
269
|
+
x0 = _mm_xor_si128(x0, xmmp[0]);
|
|
270
|
+
x1 = _mm_xor_si128(x1, xmmp[1]);
|
|
271
|
+
x2 = _mm_xor_si128(x2, xmmp[2]);
|
|
272
|
+
x3 = _mm_xor_si128(x3, xmmp[3]);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
t0 = x0;
|
|
276
|
+
t1 = x1;
|
|
277
|
+
t2 = x2;
|
|
278
|
+
t3 = x3;
|
|
279
|
+
|
|
280
|
+
for (rounds = 8; rounds; rounds -= 2) {
|
|
281
|
+
x0 = _mm_add_epi32(x0, x1);
|
|
282
|
+
x3 = _mm_xor_si128(x3, x0);
|
|
283
|
+
x3 = _mm_shuffle_epi8(x3, x4);
|
|
284
|
+
x2 = _mm_add_epi32(x2, x3);
|
|
285
|
+
x1 = _mm_xor_si128(x1, x2);
|
|
286
|
+
x6 = x1;
|
|
287
|
+
x1 = _mm_or_si128(_mm_slli_epi32(x1, 12), _mm_srli_epi32(x6, 20));
|
|
288
|
+
x0 = _mm_add_epi32(x0, x1);
|
|
289
|
+
x3 = _mm_xor_si128(x3, x0);
|
|
290
|
+
x3 = _mm_shuffle_epi8(x3, x5);
|
|
291
|
+
x0 = _mm_shuffle_epi32(x0, 0x93);
|
|
292
|
+
x2 = _mm_add_epi32(x2, x3);
|
|
293
|
+
x3 = _mm_shuffle_epi32(x3, 0x4e);
|
|
294
|
+
x1 = _mm_xor_si128(x1, x2);
|
|
295
|
+
x2 = _mm_shuffle_epi32(x2, 0x39);
|
|
296
|
+
x6 = x1;
|
|
297
|
+
x1 = _mm_or_si128(_mm_slli_epi32(x1, 7), _mm_srli_epi32(x6, 25));
|
|
298
|
+
x0 = _mm_add_epi32(x0, x1);
|
|
299
|
+
x3 = _mm_xor_si128(x3, x0);
|
|
300
|
+
x3 = _mm_shuffle_epi8(x3, x4);
|
|
301
|
+
x2 = _mm_add_epi32(x2, x3);
|
|
302
|
+
x1 = _mm_xor_si128(x1, x2);
|
|
303
|
+
x6 = x1;
|
|
304
|
+
x1 = _mm_or_si128(_mm_slli_epi32(x1, 12), _mm_srli_epi32(x6, 20));
|
|
305
|
+
x0 = _mm_add_epi32(x0, x1);
|
|
306
|
+
x3 = _mm_xor_si128(x3, x0);
|
|
307
|
+
x3 = _mm_shuffle_epi8(x3, x5);
|
|
308
|
+
x0 = _mm_shuffle_epi32(x0, 0x39);
|
|
309
|
+
x2 = _mm_add_epi32(x2, x3);
|
|
310
|
+
x3 = _mm_shuffle_epi32(x3, 0x4e);
|
|
311
|
+
x1 = _mm_xor_si128(x1, x2);
|
|
312
|
+
x2 = _mm_shuffle_epi32(x2, 0x93);
|
|
313
|
+
x6 = x1;
|
|
314
|
+
x1 = _mm_or_si128(_mm_slli_epi32(x1, 7), _mm_srli_epi32(x6, 25));
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
x0 = _mm_add_epi32(x0, t0);
|
|
318
|
+
x1 = _mm_add_epi32(x1, t1);
|
|
319
|
+
x2 = _mm_add_epi32(x2, t2);
|
|
320
|
+
x3 = _mm_add_epi32(x3, t3);
|
|
321
|
+
|
|
322
|
+
/* 4: Y_i = X */
|
|
323
|
+
/* 6: B'[0..r-1] = Y_even */
|
|
324
|
+
/* 6: B'[r..2r-1] = Y_odd */
|
|
325
|
+
xmmp = (xmmi *)scrypt_block(Bout, (i / 2) + half);
|
|
326
|
+
xmmp[0] = x0;
|
|
327
|
+
xmmp[1] = x1;
|
|
328
|
+
xmmp[2] = x2;
|
|
329
|
+
xmmp[3] = x3;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
#endif
|
|
334
|
+
|
|
335
|
+
#if defined(SCRYPT_CHACHA_AVX)
|
|
336
|
+
#undef SCRYPT_MIX
|
|
337
|
+
#define SCRYPT_MIX "ChaCha/8-AVX"
|
|
338
|
+
#undef SCRYPT_CHACHA_INCLUDED
|
|
339
|
+
#define SCRYPT_CHACHA_INCLUDED
|
|
340
|
+
#endif
|