Skip to content

Commit

Permalink
skein: cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
tpruvot committed Mar 5, 2015
1 parent d113be2 commit d5b6dd5
Showing 1 changed file with 24 additions and 37 deletions.
61 changes: 24 additions & 37 deletions algo/skein.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,64 +9,51 @@

void skeinhash(void *state, const void *input)
{
sph_skein512_context ctx_skein;
SHA256_CTX sha256;
sph_skein512_context ctx_skein;
SHA256_CTX sha256;

// the uint512 in the c++ source of the client are backed by an array of uint32
uint32_t hashA[16], hashB[16];
uint32_t hash[16];

sph_skein512_init(&ctx_skein);
sph_skein512 (&ctx_skein, input, 80); //6
sph_skein512_close(&ctx_skein, hashA); //7
sph_skein512_init(&ctx_skein);
sph_skein512(&ctx_skein, input, 80);
sph_skein512_close(&ctx_skein, hash);

SHA256_Init(&sha256);
SHA256_Update(&sha256, hashA, 64);
SHA256_Final((unsigned char*) hashB, &sha256);
SHA256_Init(&sha256);
SHA256_Update(&sha256, hash, 64);
SHA256_Final((unsigned char*) hash, &sha256);

memcpy(state, hashB, 32);

/* int ii;
printf("result: ");
for (ii=0; ii < 32; ii++)
{
printf ("%.2x",((uint8_t*)state)[ii]);
};
printf ("\n");
*/
memcpy(state, hash, 32);
}

int scanhash_skein(int thr_id, uint32_t *pdata, const uint32_t *ptarget,
uint32_t max_nonce, uint64_t *hashes_done)
{
uint32_t n = pdata[19] - 1;
uint32_t _ALIGN(64) hash64[8];
uint32_t _ALIGN(64) endiandata[20];

const uint32_t Htarg = ptarget[7];
const uint32_t first_nonce = pdata[19];
//const uint32_t Htarg = ptarget[7];

uint32_t _ALIGN(32) hash64[8];
uint32_t endiandata[32];

//char testdata[] = {"\x70\x00\x00\x00\x5d\x38\x5b\xa1\x14\xd0\x79\x97\x0b\x29\xa9\x41\x8f\xd0\x54\x9e\x7d\x68\xa9\x5c\x7f\x16\x86\x21\xa3\x14\x20\x10\x00\x00\x00\x00\x57\x85\x86\xd1\x49\xfd\x07\xb2\x2f\x3a\x8a\x34\x7c\x51\x6d\xe7\x05\x2f\x03\x4d\x2b\x76\xff\x68\xe0\xd6\xec\xff\x9b\x77\xa4\x54\x89\xe3\xfd\x51\x17\x32\x01\x1d\xf0\x73\x10\x00"};
uint32_t n = first_nonce;

//we need bigendian data...
//lessons learned: do NOT endianchange directly in pdata, this will all proof-of-works be considered as stale from minerd....
int kk=0;
for (; kk < 32; kk++)
{
be32enc(&endiandata[kk], ((uint32_t*)pdata)[kk]);
for (int i=0; i < 19; i++) {
be32enc(&endiandata[i], pdata[i]);
};

do {
pdata[19] = ++n;
be32enc(&endiandata[19], n);
skeinhash(hash64, endiandata);
if (((hash64[7]&0xFFFFFF00)==0) &&
fulltest(hash64, ptarget)) {
*hashes_done = n - first_nonce + 1;
if (hash64[7] < Htarg && fulltest(hash64, ptarget)) {
*hashes_done = n - first_nonce + 1;
pdata[19] = n;
return true;
}
n++;

} while (n < max_nonce && !work_restart[thr_id].restart);

*hashes_done = n - first_nonce + 1;
pdata[19] = n;

return 0;
}

0 comments on commit d5b6dd5

Please sign in to comment.