void veltor_4way_hash( void *output, const void *input ) { uint64_t hash0[8] __attribute__ ((aligned (64))); uint64_t hash1[8] __attribute__ ((aligned (64))); uint64_t hash2[8] __attribute__ ((aligned (64))); uint64_t hash3[8] __attribute__ ((aligned (64))); uint64_t vhash[8*4] __attribute__ ((aligned (64))); veltor_4way_ctx_holder ctx __attribute__ ((aligned (64))); memcpy( &ctx, &veltor_4way_ctx, sizeof(veltor_4way_ctx) ); skein512_4way( &ctx.skein, input, 80 ); skein512_4way_close( &ctx.skein, vhash ); mm256_deinterleave_4x64( hash0, hash1, hash2, hash3, vhash, 512 ); sph_shavite512( &ctx.shavite, hash0, 64 ); sph_shavite512_close( &ctx.shavite, hash0 ); sph_shavite512_init( &ctx.shavite ); sph_shavite512( &ctx.shavite, hash1, 64 ); sph_shavite512_close( &ctx.shavite, hash1 ); sph_shavite512_init( &ctx.shavite ); sph_shavite512( &ctx.shavite, hash2, 64 ); sph_shavite512_close( &ctx.shavite, hash2 ); sph_shavite512_init( &ctx.shavite ); sph_shavite512( &ctx.shavite, hash3, 64 ); sph_shavite512_close( &ctx.shavite, hash3 ); mm_interleave_4x32( vhash, hash0, hash1, hash2, hash3, 512 ); shabal512_4way( &ctx.shabal, vhash, 64 ); shabal512_4way_close( &ctx.shabal, vhash ); mm_deinterleave_4x32( hash0, hash1, hash2, hash3, vhash, 512 ); sph_gost512( &ctx.gost, hash0, 64 ); sph_gost512_close( &ctx.gost, hash0 ); sph_gost512_init( &ctx.gost ); sph_gost512( &ctx.gost, hash1, 64 ); sph_gost512_close( &ctx.gost, hash1 ); sph_gost512_init( &ctx.gost ); sph_gost512( &ctx.gost, hash2, 64 ); sph_gost512_close( &ctx.gost, hash2 ); sph_gost512_init( &ctx.gost ); sph_gost512( &ctx.gost, hash3, 64 ); sph_gost512_close( &ctx.gost, hash3 ); memcpy( output, hash0, 32 ); memcpy( output+32, hash1, 32 ); memcpy( output+64, hash2, 32 ); memcpy( output+96, hash3, 32 ); }
void init_veltor_ctx() { sph_gost512_init( &veltor_ctx.gost ); sph_shavite512_init( &veltor_ctx.shavite ); sph_skein512_init( &veltor_ctx.skein); sph_shabal512_init( &veltor_ctx.shabal); }
static void init_Xhash_contexts() { sph_blake512_init(&base_contexts.blake1); sph_bmw512_init(&base_contexts.bmw1); sph_groestl512_init(&base_contexts.groestl1); sph_skein512_init(&base_contexts.skein1); sph_jh512_init(&base_contexts.jh1); sph_keccak512_init(&base_contexts.keccak1); sph_gost512_init(&base_contexts.gost1); sph_luffa512_init(&base_contexts.luffa1); sph_cubehash512_init(&base_contexts.cubehash1); sph_shavite512_init(&base_contexts.shavite1); sph_simd512_init(&base_contexts.simd1); sph_echo512_init(&base_contexts.echo1); }
void phi1612_hash(void *state, const void *input) { sph_skein512_context ctx_skein; sph_jh512_context ctx_jh; sph_cubehash512_context ctx_cubehash; sph_fugue512_context ctx_fugue; sph_gost512_context ctx_gost; sph_echo512_context ctx_echo; uint8_t _ALIGN(128) hash[64]; sph_skein512_init(&ctx_skein); sph_skein512(&ctx_skein, input, 80); sph_skein512_close(&ctx_skein, (void*) hash); sph_jh512_init(&ctx_jh); sph_jh512(&ctx_jh, (const void*) hash, 64); sph_jh512_close(&ctx_jh, (void*) hash); sph_cubehash512_init(&ctx_cubehash); sph_cubehash512(&ctx_cubehash, (const void*) hash, 64); sph_cubehash512_close(&ctx_cubehash, (void*) hash); sph_fugue512_init(&ctx_fugue); sph_fugue512(&ctx_fugue, (const void*) hash, 64); sph_fugue512_close(&ctx_fugue, (void*) hash); sph_gost512_init(&ctx_gost); sph_gost512(&ctx_gost, (const void*) hash, 64); sph_gost512_close(&ctx_gost, (void*) hash); sph_echo512_init(&ctx_echo); sph_echo512(&ctx_echo, (const void*) hash, 64); sph_echo512_close(&ctx_echo, (void*) hash); memcpy(state, hash, 32); }