diff --git a/src/Miningcore/Crypto/Hashing/Algorithms/X11Gost.cs b/src/Miningcore/Crypto/Hashing/Algorithms/X11Gost.cs new file mode 100644 index 000000000..6ab3febc7 --- /dev/null +++ b/src/Miningcore/Crypto/Hashing/Algorithms/X11Gost.cs @@ -0,0 +1,21 @@ +using Miningcore.Contracts; +using Miningcore.Native; + +namespace Miningcore.Crypto.Hashing.Algorithms; + +[Identifier("x11gost")] +public unsafe class X11Gost : IHashAlgorithm +{ + public void Digest(ReadOnlySpan data, Span result, params object[] extra) + { + Contract.Requires(result.Length >= 32); + + fixed (byte* input = data) + { + fixed (byte* output = result) + { + Multihash.x11gost(input, output, (uint) data.Length); + } + } + } +} diff --git a/src/Miningcore/Native/Multihash.cs b/src/Miningcore/Native/Multihash.cs index d08d87741..8741dde92 100644 --- a/src/Miningcore/Native/Multihash.cs +++ b/src/Miningcore/Native/Multihash.cs @@ -220,6 +220,9 @@ public static unsafe class Multihash [DllImport("libmultihash", EntryPoint = "yespowerTIDE_export", CallingConvention = CallingConvention.Cdecl)] public static extern void yespowerTIDE(byte* input, void* output, uint inputLength); + [DllImport("libmultihash", EntryPoint = "x11gost_export", CallingConvention = CallingConvention.Cdecl)] + public static extern void x11gost(byte* input, void* output, uint inputLength); + [DllImport("libmultihash", EntryPoint = "fishhash_get_context", CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr fishhashGetContext(bool fullContext = false); diff --git a/src/Native/libmultihash/Makefile b/src/Native/libmultihash/Makefile index 25ce168fc..ab1064592 100644 --- a/src/Native/libmultihash/Makefile +++ b/src/Native/libmultihash/Makefile @@ -13,7 +13,7 @@ OBJECTS = allium.o aurum.o bcrypt.o blake.o c11.o dcrypt.o fresh.o lane.o megabt sha3/sph_haval.o sha3/sph_sha2.o sha3/sph_sha2big.o sha3/sm3.o sha3/panama.o \ sha3/extra.o sha3/gost_streebog.o sha3/sph_tiger.o sha3/SWIFFTX.o KeccakP-800-reference.o \ shake/cshake.o shake/keccak.o shake/shake.o \ - shavite3.o skein.o skein2.o x11.o x13.o x15.o x17.o x16r.o x16rv2.o x16s.o x21s.o x22i.o \ + shavite3.o skein.o skein2.o x11.o x11gost.o x13.o x15.o x17.o x16r.o x16rv2.o x16s.o x21s.o x22i.o \ blake2/sse/blake2s.o blake2/sse/blake2b.o \ blake3/blake3.o blake3/blake3_dispatch.o blake3/blake3_portable.o \ blake3/blake3_sse2_x86-64_unix.o blake3/blake3_sse41_x86-64_unix.o blake3/blake3_avx2_x86-64_unix.o \ diff --git a/src/Native/libmultihash/exports.cpp b/src/Native/libmultihash/exports.cpp index f021c75de..d7d38b743 100644 --- a/src/Native/libmultihash/exports.cpp +++ b/src/Native/libmultihash/exports.cpp @@ -26,6 +26,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "skein.h" #include "skein2.h" #include "x11.h" +#include "x11gost.h" #include "groestl.h" #include "blake.h" #include "fugue.h" @@ -142,6 +143,11 @@ extern "C" MODULE_API void x11_export(const char* input, char* output, uint32_t x11_hash(input, output, input_len); } +extern "C" MODULE_API void x11gost_export(const char *input, char *output, uint32_t input_len) +{ + x11gost_hash(input, output, input_len); +} + extern "C" MODULE_API void x13_export(const char* input, char* output, uint32_t input_len) { x13_hash(input, output, input_len); diff --git a/src/Native/libmultihash/libmultihash.vcxproj b/src/Native/libmultihash/libmultihash.vcxproj index 577578c0e..744d29e13 100644 --- a/src/Native/libmultihash/libmultihash.vcxproj +++ b/src/Native/libmultihash/libmultihash.vcxproj @@ -274,6 +274,7 @@ + @@ -395,6 +396,7 @@ + diff --git a/src/Native/libmultihash/x11gost.c b/src/Native/libmultihash/x11gost.c new file mode 100644 index 000000000..fa7713834 --- /dev/null +++ b/src/Native/libmultihash/x11gost.c @@ -0,0 +1,87 @@ +#include +#include +#include +#include + +#include "sha3/sph_blake.h" +#include "sha3/sph_bmw.h" +#include "sha3/sph_groestl.h" +#include "sha3/sph_jh.h" +#include "sha3/sph_keccak.h" +#include "sha3/sph_skein.h" +#include "sha3/sph_luffa.h" +#include "sha3/sph_cubehash.h" +#include "sha3/sph_shavite.h" +#include "sha3/sph_simd.h" +#include "sha3/sph_echo.h" +#include "sha3/gost_streebog.h" + +void x11gost_hash(const char *input, char* output, uint32_t len) +{ + sph_blake512_context ctx_blake; + sph_bmw512_context ctx_bmw; + sph_groestl512_context ctx_groestl; + sph_skein512_context ctx_skein; + sph_jh512_context ctx_jh; + sph_keccak512_context ctx_keccak; + sph_gost512_context ctx_gost; + sph_luffa512_context ctx_luffa; + sph_cubehash512_context ctx_cubehash; + sph_shavite512_context ctx_shavite; + sph_simd512_context ctx_simd; + sph_echo512_context ctx_echo; + + //these uint512 in the c++ source of the client are backed by an array of uint32 + uint32_t hashA[16], hashB[16]; + + sph_blake512_init(&ctx_blake); + sph_blake512(&ctx_blake, input, 80); + sph_blake512_close(&ctx_blake, hashA); + + sph_bmw512_init(&ctx_bmw); + sph_bmw512(&ctx_bmw, hashA, 64); + sph_bmw512_close(&ctx_bmw, hashB); + + sph_groestl512_init(&ctx_groestl); + sph_groestl512(&ctx_groestl, hashB, 64); + sph_groestl512_close(&ctx_groestl, hashA); + + sph_skein512_init(&ctx_skein); + sph_skein512(&ctx_skein, hashA, 64); + sph_skein512_close(&ctx_skein, hashB); + + sph_jh512_init(&ctx_jh); + sph_jh512(&ctx_jh, hashB, 64); + sph_jh512_close(&ctx_jh, hashA); + + sph_keccak512_init(&ctx_keccak); + sph_keccak512(&ctx_keccak, hashA, 64); + sph_keccak512_close(&ctx_keccak, hashB); + + sph_gost512_init(&ctx_gost); + sph_gost512(&ctx_gost, hashB, 64); + sph_gost512_close(&ctx_gost, hashA); + + sph_luffa512_init(&ctx_luffa); + sph_luffa512(&ctx_luffa, hashA, 64); + sph_luffa512_close(&ctx_luffa, hashB); + + sph_cubehash512_init(&ctx_cubehash); + sph_cubehash512(&ctx_cubehash, hashB, 64); + sph_cubehash512_close(&ctx_cubehash, hashA); + + sph_shavite512_init(&ctx_shavite); + sph_shavite512(&ctx_shavite, hashA, 64); + sph_shavite512_close(&ctx_shavite, hashB); + + sph_simd512_init(&ctx_simd); + sph_simd512(&ctx_simd, hashB, 64); + sph_simd512_close(&ctx_simd, hashA); + + sph_echo512_init(&ctx_echo); + sph_echo512(&ctx_echo, hashA, 64); + sph_echo512_close(&ctx_echo, hashB); + + memcpy(output, hashB, 32); +} + diff --git a/src/Native/libmultihash/x11gost.h b/src/Native/libmultihash/x11gost.h new file mode 100644 index 000000000..56f6cb246 --- /dev/null +++ b/src/Native/libmultihash/x11gost.h @@ -0,0 +1,16 @@ +#ifndef X11GOST_H +#define X11GOST_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +void x11gost_hash(const char* input, char* output, uint32_t len); + +#ifdef __cplusplus +} +#endif + +#endif