diff --git a/algo/x16r.c b/algo/x16r.c index f6f3608..7485155 100644 --- a/algo/x16r.c +++ b/algo/x16r.c @@ -47,141 +47,174 @@ enum Algo { }; static __thread uint32_t s_ntime = UINT32_MAX; -static __thread char hashOrder[HASH_FUNC_COUNT + 1] = { 0 }; +static __thread uint8_t hashOrder[HASH_FUNC_COUNT + 1] = { 0 }; -static void getAlgoString(const uint8_t* prevblock, char *output) +static void getAlgoString(const uint8_t* prevblock, uint8_t *output) { - char *sptr = output; for (int j = 0; j < HASH_FUNC_COUNT; j++) { - uint8_t b = (15 - j) >> 1; // 16 first ascii hex chars (lsb in uint256) - uint8_t algoDigit = (j & 1) ? prevblock[b] & 0xF : prevblock[b] >> 4; - if (algoDigit >= 10) - sprintf(sptr, "%c", 'A' + (algoDigit - 10)); - else - sprintf(sptr, "%u", (uint32_t) algoDigit); - sptr++; + uint8_t b = (15 - j) >> 1; + output[j] = (j & 1) ? prevblock[j + 4] & 0x0F : prevblock[j + 4] >> 4; } - *sptr = '\0'; } -void x16r_hash(void* output, const void* input) +void x16blake(void *out, const void *in, uint32_t size) { - uint32_t _ALIGN(128) hash[64/4]; - sph_blake512_context ctx_blake; - sph_bmw512_context ctx_bmw; - sph_groestl512_context ctx_groestl; + + sph_blake512_init(&ctx_blake); + sph_blake512(&ctx_blake, in, size); + sph_blake512_close(&ctx_blake, out); +} + +void x16bmw(void *out, const void *in, uint32_t size) +{ + sph_bmw512_context ctx_bmw; + + sph_bmw512_init(&ctx_bmw); + sph_bmw512(&ctx_bmw, in, size); + sph_bmw512_close(&ctx_bmw, out); +} + +void x16groestl(void *out, const void *in, uint32_t size) +{ + sph_groestl512_context ctx_groestl; + + sph_groestl512_init(&ctx_groestl); + sph_groestl512(&ctx_groestl, in, size); + sph_groestl512_close(&ctx_groestl, out); +} + +void x16jh(void *out, const void *in, uint32_t size) +{ + sph_jh512_context ctx_jh; + + sph_jh512_init(&ctx_jh); + sph_jh512(&ctx_jh, in, size); + sph_jh512_close(&ctx_jh, out); +} + +void x16keccak(void *out, const void *in, uint32_t size) +{ + sph_keccak512_context ctx_keccak; + + sph_keccak512_init(&ctx_keccak); + sph_keccak512(&ctx_keccak, in, size); + sph_keccak512_close(&ctx_keccak, out); +} + +void x16skein(void *out, const void *in, uint32_t size) +{ sph_skein512_context ctx_skein; - sph_jh512_context ctx_jh; - sph_keccak512_context ctx_keccak; - sph_luffa512_context ctx_luffa1; - sph_cubehash512_context ctx_cubehash1; - sph_shavite512_context ctx_shavite1; - sph_simd512_context ctx_simd1; - sph_echo512_context ctx_echo1; - sph_hamsi512_context ctx_hamsi1; - sph_fugue512_context ctx_fugue1; - sph_shabal512_context ctx_shabal1; - sph_whirlpool_context ctx_whirlpool1; - sph_sha512_context ctx_sha512; + + sph_skein512_init(&ctx_skein); + sph_skein512(&ctx_skein, in, size); + sph_skein512_close(&ctx_skein, out); +} - void *in = (void*) input; - int size = 80; +void x16luffa(void *out, const void *in, uint32_t size) +{ + sph_luffa512_context ctx_luffa; + + sph_luffa512_init(&ctx_luffa); + sph_luffa512(&ctx_luffa, in, size); + sph_luffa512_close(&ctx_luffa, out); +} - if (s_ntime == UINT32_MAX) { - const uint8_t* in8 = (uint8_t*) input; - getAlgoString(&in8[4], hashOrder); - } +void x16cubehash(void *out, const void *in, uint32_t size) +{ + sph_cubehash512_context ctx_cubehash; + + sph_cubehash512_init(&ctx_cubehash); + sph_cubehash512(&ctx_cubehash, in, size); + sph_cubehash512_close(&ctx_cubehash, out); +} + +void x16shavite(void *out, const void *in, uint32_t size) +{ + sph_shavite512_context ctx_shavite; + + sph_shavite512_init(&ctx_shavite); + sph_shavite512(&ctx_shavite, in, size); + sph_shavite512_close(&ctx_shavite, out); +} +void x16simd(void *out, const void *in, uint32_t size) +{ + sph_simd512_context ctx_simd; + + sph_simd512_init(&ctx_simd); + sph_simd512(&ctx_simd, in, size); + sph_simd512_close(&ctx_simd, out); +} + +void x16echo(void *out, const void *in, uint32_t size) +{ + sph_echo512_context ctx_echo; + + sph_echo512_init(&ctx_echo); + sph_echo512(&ctx_echo, in, size); + sph_echo512_close(&ctx_echo, out); +} + +void x16hamsi(void *out, const void *in, uint32_t size) +{ + sph_hamsi512_context ctx_hamsi; + + sph_hamsi512_init(&ctx_hamsi); + sph_hamsi512(&ctx_hamsi, in, size); + sph_hamsi512_close(&ctx_hamsi, out); +} + +void x16fugue(void *out, const void *in, uint32_t size) +{ + sph_fugue512_context ctx_fugue; + + sph_fugue512_init(&ctx_fugue); + sph_fugue512(&ctx_fugue, in, size); + sph_fugue512_close(&ctx_fugue, out); +} + +void x16shabal(void *out, const void *in, uint32_t size) +{ + sph_shabal512_context ctx_shabal; + + sph_shabal512_init(&ctx_shabal); + sph_shabal512(&ctx_shabal, in, size); + sph_shabal512_close(&ctx_shabal, out); +} + +void x16whirlpool(void *out, const void *in, uint32_t size) +{ + sph_whirlpool_context ctx_whirlpool; + + sph_whirlpool_init(&ctx_whirlpool); + sph_whirlpool(&ctx_whirlpool, in, size); + sph_whirlpool_close(&ctx_whirlpool, out); +} + +void x16sha512(void *out, const void *in, uint32_t size) +{ + sph_sha512_context ctx_sha; + + sph_sha512_init(&ctx_sha); + sph_sha512(&ctx_sha, in, size); + sph_sha512_close(&ctx_sha, out); +} + +void (* const AlgoList[16])(void *, const void *, uint32_t) = {x16blake, x16bmw, x16groestl, x16jh, x16keccak, x16skein, x16luffa, x16cubehash, x16shavite, x16simd, x16echo, x16hamsi, x16fugue, x16shabal, x16whirlpool, x16sha512}; + + +void x16r_hash(void *output, const void *input) +{ + uint32_t _ALIGN(128) hash[64/4]; + void *in = (void*) input; + int size = 80; + for (int i = 0; i < 16; i++) { - const char elem = hashOrder[i]; - const uint8_t algo = elem >= 'A' ? elem - 'A' + 10 : elem - '0'; - - switch (algo) { - case BLAKE: - sph_blake512_init(&ctx_blake); - sph_blake512(&ctx_blake, in, size); - sph_blake512_close(&ctx_blake, hash); - break; - case BMW: - sph_bmw512_init(&ctx_bmw); - sph_bmw512(&ctx_bmw, in, size); - sph_bmw512_close(&ctx_bmw, hash); - break; - case GROESTL: - sph_groestl512_init(&ctx_groestl); - sph_groestl512(&ctx_groestl, in, size); - sph_groestl512_close(&ctx_groestl, hash); - break; - case SKEIN: - sph_skein512_init(&ctx_skein); - sph_skein512(&ctx_skein, in, size); - sph_skein512_close(&ctx_skein, hash); - break; - case JH: - sph_jh512_init(&ctx_jh); - sph_jh512(&ctx_jh, in, size); - sph_jh512_close(&ctx_jh, hash); - break; - case KECCAK: - sph_keccak512_init(&ctx_keccak); - sph_keccak512(&ctx_keccak, in, size); - sph_keccak512_close(&ctx_keccak, hash); - break; - case LUFFA: - sph_luffa512_init(&ctx_luffa1); - sph_luffa512(&ctx_luffa1, in, size); - sph_luffa512_close(&ctx_luffa1, hash); - break; - case CUBEHASH: - sph_cubehash512_init(&ctx_cubehash1); - sph_cubehash512(&ctx_cubehash1, in, size); - sph_cubehash512_close(&ctx_cubehash1, hash); - break; - case SHAVITE: - sph_shavite512_init(&ctx_shavite1); - sph_shavite512(&ctx_shavite1, in, size); - sph_shavite512_close(&ctx_shavite1, hash); - break; - case SIMD: - sph_simd512_init(&ctx_simd1); - sph_simd512(&ctx_simd1, in, size); - sph_simd512_close(&ctx_simd1, hash); - break; - case ECHO: - sph_echo512_init(&ctx_echo1); - sph_echo512(&ctx_echo1, in, size); - sph_echo512_close(&ctx_echo1, hash); - break; - case HAMSI: - sph_hamsi512_init(&ctx_hamsi1); - sph_hamsi512(&ctx_hamsi1, in, size); - sph_hamsi512_close(&ctx_hamsi1, hash); - break; - case FUGUE: - sph_fugue512_init(&ctx_fugue1); - sph_fugue512(&ctx_fugue1, in, size); - sph_fugue512_close(&ctx_fugue1, hash); - break; - case SHABAL: - sph_shabal512_init(&ctx_shabal1); - sph_shabal512(&ctx_shabal1, in, size); - sph_shabal512_close(&ctx_shabal1, hash); - break; - case WHIRLPOOL: - sph_whirlpool_init(&ctx_whirlpool1); - sph_whirlpool(&ctx_whirlpool1, in, size); - sph_whirlpool_close(&ctx_whirlpool1, hash); - break; - case SHA512: - sph_sha512_init(&ctx_sha512); - sph_sha512(&ctx_sha512,(const void*) in, size); - sph_sha512_close(&ctx_sha512,(void*) hash); - break; - } - in = (void*) hash; - size = 64; + const uint8_t algo = ((i & 1) ? ((uint8_t *)input)[4 + (((15 - i) >> 1))] & 0x0F : ((uint8_t *)input)[4 + (((15 - i) >> 1))] >> 4); + if(!i) AlgoList[algo](hash, input, 80); + else AlgoList[algo](hash, hash, 64); } memcpy(output, hash, 32); } @@ -202,9 +235,9 @@ int scanhash_x16r(int thr_id, struct work *work, uint32_t max_nonce, uint64_t *h if (s_ntime != pdata[17]) { uint32_t ntime = swab32(pdata[17]); - getAlgoString((const char*) (&endiandata[1]), hashOrder); + //getAlgoString((const char*) (&endiandata[1]), hashOrder); s_ntime = ntime; - if (opt_debug && !thr_id) applog(LOG_DEBUG, "hash order %s (%08x)", hashOrder, ntime); + if (opt_debug && !thr_id) applog(LOG_DEBUG, "hash order %01X%01X%01X%01X (%08x)", hashOrder[0], hashOrder[1], hashOrder[2], hashOrder[3], ntime); } if (opt_benchmark)