void lyra2_hash(void *state, const void *input) { sph_blake256_context ctx_blake; sph_keccak256_context ctx_keccak; sph_skein256_context ctx_skein; sph_groestl256_context ctx_groestl; uint32_t hashA[8], hashB[8]; sph_blake256_init(&ctx_blake); sph_blake256(&ctx_blake, input, 80); sph_blake256_close(&ctx_blake, hashA); sph_keccak256_init(&ctx_keccak); sph_keccak256(&ctx_keccak, hashA, 32); sph_keccak256_close(&ctx_keccak, hashB); LYRA2(hashA, 32, hashB, 32, hashB, 32, 1, 8, 8); sph_skein256_init(&ctx_skein); sph_skein256(&ctx_skein, hashA, 32); sph_skein256_close(&ctx_skein, hashB); sph_groestl256_init(&ctx_groestl); sph_groestl256(&ctx_groestl, hashB, 32); sph_groestl256_close(&ctx_groestl, hashA); memcpy(state, hashA, 32); }
void lyra2re_hash(const char* input, char* output) { sph_blake256_context ctx_blake; sph_groestl256_context ctx_groestl; sph_keccak256_context ctx_keccak; sph_skein256_context ctx_skein; uint32_t hashA[8], hashB[8]; sph_blake256_init(&ctx_blake); sph_blake256 (&ctx_blake, input, 80); sph_blake256_close (&ctx_blake, hashA); sph_keccak256_init(&ctx_keccak); sph_keccak256 (&ctx_keccak,hashA, 32); sph_keccak256_close(&ctx_keccak, hashB); LYRA2((void*)hashA, 32, (const void*)hashB, 32, (const void*)hashB, 32, 1, 8, 8); sph_skein256_init(&ctx_skein); sph_skein256 (&ctx_skein, hashA, 32); sph_skein256_close(&ctx_skein, hashB); sph_groestl256_init(&ctx_groestl); sph_groestl256 (&ctx_groestl, hashB, 32); sph_groestl256_close(&ctx_groestl, hashA); memcpy(output, hashA, 32); }
void lyra2z_hash(uint64_t* wholeMatrix, void *state, const void *input) { #ifdef VERBOSE_HASH_TIMING struct timespec spec; clock_gettime(CLOCK_REALTIME, &spec); double start = spec.tv_sec + spec.tv_nsec / 1.0e9; #endif sph_blake256_context ctx_blake; uint32_t hashA[8], hashB[8]; sph_blake256_init(&ctx_blake); sph_blake256(&ctx_blake, input, 80); sph_blake256_close(&ctx_blake, hashA); // LYRA2(0, hashB, 32, hashA, 32, hashA, 32, 2, 8, 8); LYRA2(wholeMatrix, hashB, 32, hashA, 32, hashA, 32, 8, 8, 8); #ifdef VERBOSE_HASH_TIMING if (hash[0] % 32 == 0) { clock_gettime(CLOCK_REALTIME, &spec); double end = spec.tv_sec + spec.tv_nsec / 1.0e9; printf("Hash time: %f ms\n", (end - start) * 1000); } #endif memcpy(state, hashB, 32); }
void lyra2re_hash(void *state, const void *input) { lyra2re_ctx_holder ctx; memcpy(&ctx, &lyra2re_ctx, sizeof(lyra2re_ctx)); // uint32_t _ALIGN(128) hashA[8], hashB[8]; uint32_t _ALIGN(128) hash[32]; #define hashA hash #define hashB hash+16 sph_blake256(&ctx.blake, input, 80); sph_blake256_close(&ctx.blake, hashA); sph_keccak256(&ctx.keccak, hashA, 32); sph_keccak256_close(&ctx.keccak, hashB); LYRA2(hashA, 32, hashB, 32, hashB, 32, 1, 8, 8); sph_skein256(&ctx.skein, hashA, 32); sph_skein256_close(&ctx.skein, hashB); #ifdef NO_AES_NI sph_groestl256( &ctx.groestl, hashB, 32 ); sph_groestl256_close( &ctx.groestl, hashA ); #else update_groestl256( &ctx.groestl, hashB, 256 ); final_groestl256( &ctx.groestl, hashA ); #endif memcpy(state, hashA, 32); }
void lyra2z_hash(const char* input, char* output) { sph_blake256_context ctx_blake; uint32_t hashA[8], hashB[8]; sph_blake256_init(&ctx_blake); sph_blake256 (&ctx_blake, input, 80); sph_blake256_close (&ctx_blake, hashA); LYRA2(hashB, 32, hashA, 32, hashA, 32, 8, 8, 8); memcpy(output, hashB, 32); }
inline void lyra2rev2hash(void *state, const void *input) { sph_blake256_context ctx_blake; sph_bmw256_context ctx_bmw; sph_keccak256_context ctx_keccak; sph_skein256_context ctx_skein; sph_cubehash256_context ctx_cube; uint32_t hashA[8], hashB[8]; sph_blake256_init(&ctx_blake); sph_blake256 (&ctx_blake, input, 80); sph_blake256_close (&ctx_blake, hashA); sph_keccak256_init(&ctx_keccak); sph_keccak256 (&ctx_keccak,hashA, 32); sph_keccak256_close(&ctx_keccak, hashB); sph_cubehash256_init(&ctx_cube); sph_cubehash256(&ctx_cube, hashB, 32); sph_cubehash256_close(&ctx_cube, hashA); LYRA2(hashB, 32, hashA, 32, hashA, 32, 1, 4, 4); sph_skein256_init(&ctx_skein); sph_skein256 (&ctx_skein, hashB, 32); sph_skein256_close(&ctx_skein, hashA); sph_cubehash256_init(&ctx_cube); sph_cubehash256(&ctx_cube, hashA, 32); sph_cubehash256_close(&ctx_cube, hashB); sph_bmw256_init(&ctx_bmw); sph_bmw256 (&ctx_bmw, hashB, 32); sph_bmw256_close(&ctx_bmw, hashA); //printf("cpu hash %08x %08x %08x %08x\n",hashA[0],hashA[1],hashA[2],hashA[3]); memcpy(state, hashA, 32); }
void lyra2re2_hash(const char* input, char* output) { sph_blake256_context ctx_blake; sph_cubehash256_context ctx_cubehash; sph_keccak256_context ctx_keccak; sph_skein256_context ctx_skein; sph_bmw256_context ctx_bmw; uint32_t hashA[8], hashB[8]; sph_blake256_init(&ctx_blake); sph_blake256(&ctx_blake, input, 80); sph_blake256_close (&ctx_blake, hashA); sph_keccak256_init(&ctx_keccak); sph_keccak256(&ctx_keccak, hashA, 32); sph_keccak256_close(&ctx_keccak, hashB); sph_cubehash256_init(&ctx_cubehash); sph_cubehash256(&ctx_cubehash, hashB, 32); sph_cubehash256_close(&ctx_cubehash, hashA); LYRA2(hashB, 32, hashA, 32, hashA, 32, 1, 4, 4); sph_skein256_init(&ctx_skein); sph_skein256(&ctx_skein, hashB, 32); sph_skein256_close(&ctx_skein, hashA); sph_cubehash256_init(&ctx_cubehash); sph_cubehash256(&ctx_cubehash, hashA, 32); sph_cubehash256_close(&ctx_cubehash, hashB); sph_bmw256_init(&ctx_bmw); sph_bmw256(&ctx_bmw, hashB, 32); sph_bmw256_close(&ctx_bmw, hashA); memcpy(output, hashA, 32); }
inline void lyra2rehash(void *state, const void *input) { sph_blake256_context ctx_blake; sph_groestl256_context ctx_groestl; sph_keccak256_context ctx_keccak; sph_skein256_context ctx_skein; uint32_t hashA[8], hashB[8]; sph_blake256_init(&ctx_blake); sph_blake256 (&ctx_blake, input, 80); sph_blake256_close (&ctx_blake, hashA); sph_keccak256_init(&ctx_keccak); sph_keccak256 (&ctx_keccak,hashA, 32); sph_keccak256_close(&ctx_keccak, hashB); LYRA2(hashA, 32, hashB, 32, hashB, 32, 1, 8, 8); sph_skein256_init(&ctx_skein); sph_skein256 (&ctx_skein, hashA, 32); sph_skein256_close(&ctx_skein, hashB); sph_groestl256_init(&ctx_groestl); sph_groestl256 (&ctx_groestl, hashB, 32); sph_groestl256_close(&ctx_groestl, hashA); //printf("cpu hash %08x %08x %08x %08x\n",hashA[0],hashA[1],hashA[2],hashA[3]); memcpy(state, hashA, 32); }
/** * Executes Lyra2 based on the G function from Blake2b. The number of columns of the memory matrix is set to nCols = 64. * This version supports salts and passwords whose combined length is smaller than the size of the memory matrix, * (i.e., (nRows x nCols x b) bits, where "b" is the underlying sponge's bitrate) * * @param out The derived key to be output by the algorithm * @param outlen Desired key length * @param in User password * @param inlen Password length * @param salt Salt * @param saltlen Salt length * @param t_cost Parameter to determine the processing time (T) * @param m_cost Memory cost parameter (defines the number of rows of the memory matrix, R) * * @return 0 if the key is generated correctly; -1 if there is an error (usually due to lack of memory for allocation) */ int PHS(void *out, size_t outlen, const void *in, size_t inlen, const void *salt, size_t saltlen, unsigned int t_cost, unsigned int m_cost){ return LYRA2(out, outlen, in, inlen, salt, saltlen, t_cost, m_cost, N_COLS); }