@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
|
+
// keccak.h
|
|
2
|
+
// 19-Nov-11 Markku-Juhani O. Saarinen <mjos@iki.fi>
|
|
3
|
+
|
|
4
|
+
// Copyright (c) 2014 The Boolberry developers
|
|
5
|
+
// Distributed under the MIT/X11 software license, see the accompanying
|
|
6
|
+
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
#pragma once
|
|
10
|
+
|
|
11
|
+
#include <stdint.h>
|
|
12
|
+
#include <string.h>
|
|
13
|
+
#include "hash.h"
|
|
14
|
+
|
|
15
|
+
#ifndef KECCAK_ROUNDS
|
|
16
|
+
#define KECCAK_ROUNDS 24
|
|
17
|
+
#endif
|
|
18
|
+
|
|
19
|
+
#ifndef ROTL64
|
|
20
|
+
#define ROTL64(x, y) (((x) << (y)) | ((x) >> (64 - (y))))
|
|
21
|
+
#endif
|
|
22
|
+
|
|
23
|
+
// compute a keccak hash (md) of given byte length from "in"
|
|
24
|
+
|
|
25
|
+
#define KK_MIXIN_SIZE 24
|
|
26
|
+
|
|
27
|
+
namespace crypto
|
|
28
|
+
{
|
|
29
|
+
template<typename pod_operand_a, typename pod_operand_b>
|
|
30
|
+
pod_operand_a xor_pod(const pod_operand_a& a, const pod_operand_b& b)
|
|
31
|
+
{
|
|
32
|
+
static_assert(sizeof(pod_operand_a) == sizeof(pod_operand_b), "invalid xor_h usage: different sizes");
|
|
33
|
+
static_assert(sizeof(pod_operand_a)%8 == 0, "invalid xor_h usage: wrong size");
|
|
34
|
+
|
|
35
|
+
hash r;
|
|
36
|
+
for(size_t i = 0; i != 4; i++)
|
|
37
|
+
{
|
|
38
|
+
((uint64_t*)&r)[i] = ((const uint64_t*)&a)[i] ^ ((const uint64_t*)&b)[i];
|
|
39
|
+
}
|
|
40
|
+
return r;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
#define XOR_2(A, B) crypto::xor_pod(A, B)
|
|
44
|
+
#define XOR_3(A, B, C) crypto::xor_pod(A, XOR_2(B, C))
|
|
45
|
+
#define XOR_4(A, B, C, D) crypto::xor_pod(A, XOR_3(B, C, D))
|
|
46
|
+
#define XOR_5(A, B, C, D, E) crypto::xor_pod(A, XOR_4(B, C, D, E))
|
|
47
|
+
#define XOR_8(A, B, C, D, F, G, H, I) crypto::xor_pod(XOR_4(A, B, C, D), XOR_4(F, G, H, I))
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
typedef uint64_t state_t_m[25];
|
|
53
|
+
typedef uint64_t mixin_t[KK_MIXIN_SIZE];
|
|
54
|
+
|
|
55
|
+
//with multiplication, for tests
|
|
56
|
+
template<class f_traits>
|
|
57
|
+
int keccak_generic(const uint8_t *in, size_t inlen, uint8_t *md, size_t mdlen)
|
|
58
|
+
{
|
|
59
|
+
state_t_m st;
|
|
60
|
+
uint8_t temp[144];
|
|
61
|
+
size_t i, rsiz, rsizw;
|
|
62
|
+
|
|
63
|
+
rsiz = sizeof(state_t_m) == mdlen ? HASH_DATA_AREA : 200 - 2 * mdlen;
|
|
64
|
+
rsizw = rsiz / 8;
|
|
65
|
+
|
|
66
|
+
memset(st, 0, sizeof(st));
|
|
67
|
+
|
|
68
|
+
for ( ; inlen >= rsiz; inlen -= rsiz, in += rsiz) {
|
|
69
|
+
for (i = 0; i < rsizw; i++)
|
|
70
|
+
st[i] ^= ((uint64_t *) in)[i];
|
|
71
|
+
f_traits::keccakf(st, KECCAK_ROUNDS);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
// last block and padding
|
|
76
|
+
memcpy(temp, in, inlen);
|
|
77
|
+
temp[inlen++] = 1;
|
|
78
|
+
memset(temp + inlen, 0, rsiz - inlen);
|
|
79
|
+
temp[rsiz - 1] |= 0x80;
|
|
80
|
+
|
|
81
|
+
for (i = 0; i < rsizw; i++)
|
|
82
|
+
st[i] ^= ((uint64_t *) temp)[i];
|
|
83
|
+
|
|
84
|
+
f_traits::keccakf(st, KECCAK_ROUNDS);
|
|
85
|
+
|
|
86
|
+
memcpy(md, st, mdlen);
|
|
87
|
+
|
|
88
|
+
return 0;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
template<class f_traits, class callback_t>
|
|
92
|
+
int wild_keccak(const uint8_t *in, size_t inlen, uint8_t *md, size_t mdlen, callback_t cb)
|
|
93
|
+
{
|
|
94
|
+
state_t_m st;
|
|
95
|
+
uint8_t temp[144];
|
|
96
|
+
uint64_t rsiz, rsizw;
|
|
97
|
+
|
|
98
|
+
rsiz = sizeof(state_t_m) == mdlen ? HASH_DATA_AREA : 200 - 2 * mdlen;
|
|
99
|
+
rsizw = rsiz / 8;
|
|
100
|
+
memset(&st[0], 0, 25*sizeof(st[0]));
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
for ( ; inlen >= rsiz; inlen -= rsiz, in += rsiz)
|
|
104
|
+
{
|
|
105
|
+
for (size_t i = 0; i < rsizw; i++)
|
|
106
|
+
st[i] ^= ((uint64_t *) in)[i];
|
|
107
|
+
|
|
108
|
+
for(size_t ll = 0; ll != KECCAK_ROUNDS; ll++)
|
|
109
|
+
{
|
|
110
|
+
if(ll != 0)
|
|
111
|
+
{//skip first round
|
|
112
|
+
mixin_t mix_in;
|
|
113
|
+
cb(st, mix_in);
|
|
114
|
+
for (size_t k = 0; k < KK_MIXIN_SIZE; k++)
|
|
115
|
+
st[k] ^= mix_in[k];
|
|
116
|
+
}
|
|
117
|
+
f_traits::keccakf(st, 1);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// last block and padding
|
|
122
|
+
memcpy(temp, in, inlen);
|
|
123
|
+
temp[inlen++] = 1;
|
|
124
|
+
memset(temp + inlen, 0, rsiz - inlen);
|
|
125
|
+
temp[rsiz - 1] |= 0x80;
|
|
126
|
+
|
|
127
|
+
for (size_t i = 0; i < rsizw; i++)
|
|
128
|
+
st[i] ^= ((uint64_t *) temp)[i];
|
|
129
|
+
|
|
130
|
+
for(size_t ll = 0; ll != KECCAK_ROUNDS; ll++)
|
|
131
|
+
{
|
|
132
|
+
if(ll != 0)
|
|
133
|
+
{//skip first state with
|
|
134
|
+
mixin_t mix_in;
|
|
135
|
+
cb(st, mix_in);
|
|
136
|
+
for (size_t k = 0; k < KK_MIXIN_SIZE; k++)
|
|
137
|
+
st[k] ^= mix_in[k];
|
|
138
|
+
}
|
|
139
|
+
f_traits::keccakf(st, 1);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
memcpy(md, st, mdlen);
|
|
143
|
+
|
|
144
|
+
return 0;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
template<class f_traits, class callback_t>
|
|
148
|
+
int wild_keccak_dbl(const uint8_t *in, size_t inlen, uint8_t *md, size_t mdlen, callback_t cb)
|
|
149
|
+
{
|
|
150
|
+
//Satoshi's classic
|
|
151
|
+
wild_keccak<f_traits>(in, inlen, md, mdlen, cb);
|
|
152
|
+
wild_keccak<f_traits>(md, mdlen, md, mdlen, cb);
|
|
153
|
+
return 0;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
class regular_f
|
|
157
|
+
{
|
|
158
|
+
public:
|
|
159
|
+
static void keccakf(uint64_t st[25], int rounds);
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
class mul_f
|
|
163
|
+
{
|
|
164
|
+
public:
|
|
165
|
+
static void keccakf(uint64_t st[25], int rounds);
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
package/cryptonight.c
ADDED
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
// Copyright (c) 2012-2013 The Cryptonote developers
|
|
2
|
+
// Distributed under the MIT/X11 software license, see the accompanying
|
|
3
|
+
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
4
|
+
// Portions Copyright (c) 2018 The Monero developers
|
|
5
|
+
// Portions Copyright (c) 2018 The TurtleCoin Developers
|
|
6
|
+
|
|
7
|
+
#include <stdio.h>
|
|
8
|
+
#include <stdlib.h>
|
|
9
|
+
#include "crypto/oaes_lib.h"
|
|
10
|
+
#include "crypto/c_keccak.h"
|
|
11
|
+
#include "crypto/c_groestl.h"
|
|
12
|
+
#include "crypto/c_blake256.h"
|
|
13
|
+
#include "crypto/c_jh.h"
|
|
14
|
+
#include "crypto/c_skein.h"
|
|
15
|
+
#include "crypto/int-util.h"
|
|
16
|
+
#include "crypto/hash-ops.h"
|
|
17
|
+
#include "crypto/variant2_int_sqrt.h"
|
|
18
|
+
|
|
19
|
+
#if defined(_MSC_VER)
|
|
20
|
+
#include <malloc.h>
|
|
21
|
+
#endif
|
|
22
|
+
|
|
23
|
+
#define MEMORY 2097152 /* 2 MiB 2^21 */
|
|
24
|
+
#define ITER 1048576 /* 2^20 */
|
|
25
|
+
#define ITER_DIV 524288 /* 2^19 */
|
|
26
|
+
#define AES_BLOCK_SIZE 16
|
|
27
|
+
#define AES_KEY_SIZE 32 /*16*/
|
|
28
|
+
#define INIT_SIZE_BLK 8
|
|
29
|
+
#define INIT_SIZE_BYTE (INIT_SIZE_BLK * AES_BLOCK_SIZE)
|
|
30
|
+
#define CN_INIT (MEMORY / INIT_SIZE_BYTE)
|
|
31
|
+
#define CN_AES_INIT (MEMORY / AES_BLOCK_SIZE)
|
|
32
|
+
|
|
33
|
+
#define VARIANT1_1(p) \
|
|
34
|
+
do if (variant == 1) \
|
|
35
|
+
{ \
|
|
36
|
+
const uint8_t tmp = ((const uint8_t*)(p))[11]; \
|
|
37
|
+
static const uint32_t table = 0x75310; \
|
|
38
|
+
const uint8_t index = (((tmp >> 3) & 6) | (tmp & 1)) << 1; \
|
|
39
|
+
((uint8_t*)(p))[11] = tmp ^ ((table >> index) & 0x30); \
|
|
40
|
+
} while(0)
|
|
41
|
+
|
|
42
|
+
#define VARIANT1_2(p) \
|
|
43
|
+
do if (variant == 1) \
|
|
44
|
+
{ \
|
|
45
|
+
((uint64_t*)p)[1] ^= tweak1_2; \
|
|
46
|
+
} while(0)
|
|
47
|
+
|
|
48
|
+
#define VARIANT1_INIT() \
|
|
49
|
+
if (variant == 1 && len < 43) \
|
|
50
|
+
{ \
|
|
51
|
+
fprintf(stderr, "Cryptonight variant 1 needs at least 43 bytes of data"); \
|
|
52
|
+
_exit(1); \
|
|
53
|
+
} \
|
|
54
|
+
const uint64_t tweak1_2 = (variant == 1) ? *(const uint64_t*)(((const uint8_t*)input)+35) ^ ctx->state.hs.w[24] : 0
|
|
55
|
+
|
|
56
|
+
#define U64(p) ((uint64_t*)(p))
|
|
57
|
+
|
|
58
|
+
#define VARIANT2_INIT(b, state) \
|
|
59
|
+
uint64_t division_result; \
|
|
60
|
+
uint64_t sqrt_result; \
|
|
61
|
+
do if (variant >= 2) \
|
|
62
|
+
{ \
|
|
63
|
+
U64(b)[2] = state.hs.w[8] ^ state.hs.w[10]; \
|
|
64
|
+
U64(b)[3] = state.hs.w[9] ^ state.hs.w[11]; \
|
|
65
|
+
division_result = state.hs.w[12]; \
|
|
66
|
+
sqrt_result = state.hs.w[13]; \
|
|
67
|
+
} while (0)
|
|
68
|
+
|
|
69
|
+
#define VARIANT2_SHUFFLE_ADD(base_ptr, offset, a, b) \
|
|
70
|
+
do if (variant >= 2) \
|
|
71
|
+
{ \
|
|
72
|
+
uint64_t* chunk1 = U64((base_ptr) + ((offset) ^ 0x10)); \
|
|
73
|
+
uint64_t* chunk2 = U64((base_ptr) + ((offset) ^ 0x20)); \
|
|
74
|
+
uint64_t* chunk3 = U64((base_ptr) + ((offset) ^ 0x30)); \
|
|
75
|
+
\
|
|
76
|
+
const uint64_t chunk1_old[2] = { chunk1[0], chunk1[1] }; \
|
|
77
|
+
\
|
|
78
|
+
chunk1[0] = chunk3[0] + U64(b + 16)[0]; \
|
|
79
|
+
chunk1[1] = chunk3[1] + U64(b + 16)[1]; \
|
|
80
|
+
\
|
|
81
|
+
chunk3[0] = chunk2[0] + U64(a)[0]; \
|
|
82
|
+
chunk3[1] = chunk2[1] + U64(a)[1]; \
|
|
83
|
+
\
|
|
84
|
+
chunk2[0] = chunk1_old[0] + U64(b)[0]; \
|
|
85
|
+
chunk2[1] = chunk1_old[1] + U64(b)[1]; \
|
|
86
|
+
} while (0)
|
|
87
|
+
|
|
88
|
+
#define VARIANT2_INTEGER_MATH_DIVISION_STEP(b, ptr) \
|
|
89
|
+
((uint64_t*)(b))[0] ^= division_result ^ (sqrt_result << 32); \
|
|
90
|
+
{ \
|
|
91
|
+
const uint64_t dividend = ((uint64_t*)(ptr))[1]; \
|
|
92
|
+
const uint32_t divisor = (((uint32_t*)(ptr))[0] + (uint32_t)(sqrt_result << 1)) | 0x80000001UL; \
|
|
93
|
+
division_result = ((uint32_t)(dividend / divisor)) + \
|
|
94
|
+
(((uint64_t)(dividend % divisor)) << 32); \
|
|
95
|
+
} \
|
|
96
|
+
const uint64_t sqrt_input = ((uint64_t*)(ptr))[0] + division_result
|
|
97
|
+
|
|
98
|
+
#define VARIANT2_INTEGER_MATH(b, ptr) \
|
|
99
|
+
do if (variant >= 2) \
|
|
100
|
+
{ \
|
|
101
|
+
VARIANT2_INTEGER_MATH_DIVISION_STEP(b, ptr); \
|
|
102
|
+
VARIANT2_INTEGER_MATH_SQRT_STEP_FP64(); \
|
|
103
|
+
VARIANT2_INTEGER_MATH_SQRT_FIXUP(sqrt_result); \
|
|
104
|
+
} while (0)
|
|
105
|
+
|
|
106
|
+
#define VARIANT2_2() \
|
|
107
|
+
do if (variant >= 2) { \
|
|
108
|
+
((uint64_t*)(ctx->long_state + ((j * AES_BLOCK_SIZE) ^ 0x10)))[0] ^= hi; \
|
|
109
|
+
((uint64_t*)(ctx->long_state + ((j * AES_BLOCK_SIZE) ^ 0x10)))[1] ^= lo; \
|
|
110
|
+
hi ^= ((uint64_t*)(ctx->long_state + ((j * AES_BLOCK_SIZE) ^ 0x20)))[0]; \
|
|
111
|
+
lo ^= ((uint64_t*)(ctx->long_state + ((j * AES_BLOCK_SIZE) ^ 0x20)))[1]; \
|
|
112
|
+
} while (0)
|
|
113
|
+
|
|
114
|
+
#pragma pack(push, 1)
|
|
115
|
+
union cn_slow_hash_state {
|
|
116
|
+
union hash_state hs;
|
|
117
|
+
struct {
|
|
118
|
+
uint8_t k[64];
|
|
119
|
+
uint8_t init[INIT_SIZE_BYTE];
|
|
120
|
+
};
|
|
121
|
+
};
|
|
122
|
+
#pragma pack(pop)
|
|
123
|
+
|
|
124
|
+
static void do_blake_hash(const void* input, size_t len, char* output) {
|
|
125
|
+
blake256_hash((uint8_t*)output, input, len);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
void do_groestl_hash(const void* input, size_t len, char* output) {
|
|
129
|
+
groestl(input, len * 8, (uint8_t*)output);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
static void do_jh_hash(const void* input, size_t len, char* output) {
|
|
133
|
+
int r = jh_hash(HASH_SIZE * 8, input, 8 * len, (uint8_t*)output);
|
|
134
|
+
assert(SUCCESS == r);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
static void do_skein_hash(const void* input, size_t len, char* output) {
|
|
138
|
+
int r = c_skein_hash(8 * HASH_SIZE, input, 8 * len, (uint8_t*)output);
|
|
139
|
+
assert(SKEIN_SUCCESS == r);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
static void (* const extra_hashes[4])(const void *, size_t, char *) = {
|
|
143
|
+
do_blake_hash, do_groestl_hash, do_jh_hash, do_skein_hash
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
extern int aesb_single_round(const uint8_t *in, uint8_t*out, const uint8_t *expandedKey);
|
|
147
|
+
extern int aesb_pseudo_round(const uint8_t *in, uint8_t *out, const uint8_t *expandedKey);
|
|
148
|
+
|
|
149
|
+
static inline size_t e2i(const uint8_t* a) {
|
|
150
|
+
return (*((uint64_t*) a) / AES_BLOCK_SIZE) & (CN_AES_INIT - 1);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
static void mul(const uint8_t* a, const uint8_t* b, uint8_t* res) {
|
|
154
|
+
((uint64_t*) res)[1] = mul128(((uint64_t*) a)[0], ((uint64_t*) b)[0], (uint64_t*) res);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
static void sum_half_blocks(uint8_t* a, const uint8_t* b) {
|
|
158
|
+
uint64_t a0, a1, b0, b1;
|
|
159
|
+
|
|
160
|
+
a0 = SWAP64LE(((uint64_t*) a)[0]);
|
|
161
|
+
a1 = SWAP64LE(((uint64_t*) a)[1]);
|
|
162
|
+
b0 = SWAP64LE(((uint64_t*) b)[0]);
|
|
163
|
+
b1 = SWAP64LE(((uint64_t*) b)[1]);
|
|
164
|
+
a0 += b0;
|
|
165
|
+
a1 += b1;
|
|
166
|
+
((uint64_t*) a)[0] = SWAP64LE(a0);
|
|
167
|
+
((uint64_t*) a)[1] = SWAP64LE(a1);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
static inline void copy_block(uint8_t* dst, const uint8_t* src) {
|
|
171
|
+
((uint64_t*) dst)[0] = ((uint64_t*) src)[0];
|
|
172
|
+
((uint64_t*) dst)[1] = ((uint64_t*) src)[1];
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
static void swap_blocks(uint8_t* a, uint8_t* b) {
|
|
176
|
+
size_t i;
|
|
177
|
+
uint8_t t;
|
|
178
|
+
for (i = 0; i < AES_BLOCK_SIZE; i++) {
|
|
179
|
+
t = a[i];
|
|
180
|
+
a[i] = b[i];
|
|
181
|
+
b[i] = t;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
static inline void xor_blocks(uint8_t* a, const uint8_t* b) {
|
|
186
|
+
((uint64_t*) a)[0] ^= ((uint64_t*) b)[0];
|
|
187
|
+
((uint64_t*) a)[1] ^= ((uint64_t*) b)[1];
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
static inline void xor_blocks_dst(const uint8_t* a, const uint8_t* b, uint8_t* dst) {
|
|
191
|
+
((uint64_t*) dst)[0] = ((uint64_t*) a)[0] ^ ((uint64_t*) b)[0];
|
|
192
|
+
((uint64_t*) dst)[1] = ((uint64_t*) a)[1] ^ ((uint64_t*) b)[1];
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
struct cryptonight_ctx {
|
|
196
|
+
uint8_t long_state[MEMORY];
|
|
197
|
+
union cn_slow_hash_state state;
|
|
198
|
+
uint8_t text[INIT_SIZE_BYTE];
|
|
199
|
+
uint8_t a[AES_BLOCK_SIZE];
|
|
200
|
+
uint8_t b[AES_BLOCK_SIZE * 2];
|
|
201
|
+
uint8_t c[AES_BLOCK_SIZE];
|
|
202
|
+
uint8_t aes_key[AES_KEY_SIZE];
|
|
203
|
+
oaes_ctx* aes_ctx;
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
void cryptonight_hash(const char* input, char* output, uint32_t len, int variant) {
|
|
207
|
+
#if defined(_MSC_VER)
|
|
208
|
+
struct cryptonight_ctx *ctx = _malloca(sizeof(struct cryptonight_ctx));
|
|
209
|
+
#else
|
|
210
|
+
struct cryptonight_ctx *ctx = alloca(sizeof(struct cryptonight_ctx));
|
|
211
|
+
#endif
|
|
212
|
+
hash_process(&ctx->state.hs, (const uint8_t*) input, len);
|
|
213
|
+
memcpy(ctx->text, ctx->state.init, INIT_SIZE_BYTE);
|
|
214
|
+
memcpy(ctx->aes_key, ctx->state.hs.b, AES_KEY_SIZE);
|
|
215
|
+
ctx->aes_ctx = (oaes_ctx*) oaes_alloc();
|
|
216
|
+
size_t i, j;
|
|
217
|
+
|
|
218
|
+
VARIANT1_INIT();
|
|
219
|
+
VARIANT2_INIT(ctx->b, ctx->state);
|
|
220
|
+
|
|
221
|
+
oaes_key_import_data(ctx->aes_ctx, ctx->aes_key, AES_KEY_SIZE);
|
|
222
|
+
for (i = 0; i < CN_INIT; i++) {
|
|
223
|
+
for (j = 0; j < INIT_SIZE_BLK; j++) {
|
|
224
|
+
aesb_pseudo_round(&ctx->text[AES_BLOCK_SIZE * j],
|
|
225
|
+
&ctx->text[AES_BLOCK_SIZE * j],
|
|
226
|
+
ctx->aes_ctx->key->exp_data);
|
|
227
|
+
}
|
|
228
|
+
memcpy(&ctx->long_state[i * INIT_SIZE_BYTE], ctx->text, INIT_SIZE_BYTE);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
for (i = 0; i < 16; i++) {
|
|
232
|
+
ctx->a[i] = ctx->state.k[i] ^ ctx->state.k[32 + i];
|
|
233
|
+
ctx->b[i] = ctx->state.k[16 + i] ^ ctx->state.k[48 + i];
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
for (i = 0; i < ITER_DIV; i++) {
|
|
237
|
+
/* Dependency chain: address -> read value ------+
|
|
238
|
+
* written value <-+ hard function (AES or MUL) <+
|
|
239
|
+
* next address <-+
|
|
240
|
+
*/
|
|
241
|
+
/* Iteration 1 */
|
|
242
|
+
j = e2i(ctx->a);
|
|
243
|
+
aesb_single_round(&ctx->long_state[j * AES_BLOCK_SIZE], ctx->c, ctx->a);
|
|
244
|
+
VARIANT2_SHUFFLE_ADD(ctx->long_state, j * AES_BLOCK_SIZE, ctx->a, ctx->b);
|
|
245
|
+
xor_blocks_dst(ctx->c, ctx->b, &ctx->long_state[j * AES_BLOCK_SIZE]);
|
|
246
|
+
VARIANT1_1((uint8_t*)&ctx->long_state[j * AES_BLOCK_SIZE]);
|
|
247
|
+
/* Iteration 2 */
|
|
248
|
+
j = e2i(ctx->c);
|
|
249
|
+
|
|
250
|
+
uint64_t* dst = (uint64_t*)&ctx->long_state[j * AES_BLOCK_SIZE];
|
|
251
|
+
|
|
252
|
+
uint64_t t[2];
|
|
253
|
+
t[0] = dst[0];
|
|
254
|
+
t[1] = dst[1];
|
|
255
|
+
|
|
256
|
+
VARIANT2_INTEGER_MATH(t, ctx->c);
|
|
257
|
+
|
|
258
|
+
uint64_t hi;
|
|
259
|
+
uint64_t lo = mul128(((uint64_t*)ctx->c)[0], t[0], &hi);
|
|
260
|
+
|
|
261
|
+
VARIANT2_2();
|
|
262
|
+
VARIANT2_SHUFFLE_ADD(ctx->long_state, j * AES_BLOCK_SIZE, ctx->a, ctx->b);
|
|
263
|
+
|
|
264
|
+
((uint64_t*)ctx->a)[0] += hi;
|
|
265
|
+
((uint64_t*)ctx->a)[1] += lo;
|
|
266
|
+
|
|
267
|
+
dst[0] = ((uint64_t*)ctx->a)[0];
|
|
268
|
+
dst[1] = ((uint64_t*)ctx->a)[1];
|
|
269
|
+
|
|
270
|
+
((uint64_t*)ctx->a)[0] ^= t[0];
|
|
271
|
+
((uint64_t*)ctx->a)[1] ^= t[1];
|
|
272
|
+
|
|
273
|
+
VARIANT1_2((uint8_t*)&ctx->long_state[j * AES_BLOCK_SIZE]);
|
|
274
|
+
copy_block(ctx->b + AES_BLOCK_SIZE, ctx->b);
|
|
275
|
+
copy_block(ctx->b, ctx->c);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
memcpy(ctx->text, ctx->state.init, INIT_SIZE_BYTE);
|
|
279
|
+
oaes_key_import_data(ctx->aes_ctx, &ctx->state.hs.b[32], AES_KEY_SIZE);
|
|
280
|
+
for (i = 0; i < CN_INIT; i++) {
|
|
281
|
+
for (j = 0; j < INIT_SIZE_BLK; j++) {
|
|
282
|
+
xor_blocks(&ctx->text[j * AES_BLOCK_SIZE],
|
|
283
|
+
&ctx->long_state[i * INIT_SIZE_BYTE + j * AES_BLOCK_SIZE]);
|
|
284
|
+
aesb_pseudo_round(&ctx->text[j * AES_BLOCK_SIZE],
|
|
285
|
+
&ctx->text[j * AES_BLOCK_SIZE],
|
|
286
|
+
ctx->aes_ctx->key->exp_data);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
memcpy(ctx->state.init, ctx->text, INIT_SIZE_BYTE);
|
|
290
|
+
hash_permutation(&ctx->state.hs);
|
|
291
|
+
/*memcpy(hash, &state, 32);*/
|
|
292
|
+
extra_hashes[ctx->state.hs.b[0] & 3](&ctx->state, 200, output);
|
|
293
|
+
oaes_free((OAES_CTX **) &ctx->aes_ctx);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
void cryptonight_fast_hash(const char* input, char* output, uint32_t len) {
|
|
297
|
+
union hash_state state;
|
|
298
|
+
hash_process(&state, (const uint8_t*) input, len);
|
|
299
|
+
memcpy(output, &state, HASH_SIZE);
|
|
300
|
+
}
|
package/cryptonight.h
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#ifndef CRYPTONIGHT_H
|
|
2
|
+
#define CRYPTONIGHT_H
|
|
3
|
+
|
|
4
|
+
#ifdef __cplusplus
|
|
5
|
+
extern "C" {
|
|
6
|
+
#endif
|
|
7
|
+
|
|
8
|
+
#include <stdint.h>
|
|
9
|
+
|
|
10
|
+
void cryptonight_hash(const char* input, char* output, uint32_t len, int variant);
|
|
11
|
+
void cryptonight_fast_hash(const char* input, char* output, uint32_t len);
|
|
12
|
+
|
|
13
|
+
#ifdef __cplusplus
|
|
14
|
+
}
|
|
15
|
+
#endif
|
|
16
|
+
|
|
17
|
+
#endif
|