Ejemplo n.º 1
0
static cl_int queue_whirlpoolx_kernel(struct __clState *clState, struct _dev_blk_ctx *blk, __maybe_unused cl_uint threads)
{
  uint64_t midblock[8], key[8] = { 0 }, tmp[8] = { 0 };
  cl_ulong le_target;
  cl_int status;

  le_target = *(cl_ulong *)(blk->work->device_target + 24);
  flip80(clState->cldata, blk->work->data);

  memcpy(midblock, clState->cldata, 64);

  // midblock = n, key = h
  for (int i = 0; i < 10; ++i) {
    tmp[0] = WHIRLPOOL_ROUND_CONSTANTS[i];
    whirlpool_round(key, tmp);
    tmp[0] = 0;
    whirlpool_round(midblock, tmp);

    for (int x = 0; x < 8; ++x) {
      midblock[x] ^= key[x];
    }
  }

  for (int i = 0; i < 8; ++i) {
    midblock[i] ^= ((uint64_t *)(clState->cldata))[i];
  }

  status = clSetKernelArg(clState->kernel, 0, sizeof(cl_ulong8), (cl_ulong8 *)&midblock);
  status |= clSetKernelArg(clState->kernel, 1, sizeof(cl_ulong), (void *)(((uint64_t *)clState->cldata) + 8));
  status |= clSetKernelArg(clState->kernel, 2, sizeof(cl_ulong), (void *)(((uint64_t *)clState->cldata) + 9));
  status |= clSetKernelArg(clState->kernel, 3, sizeof(cl_mem), (void *)&clState->outputBuffer);
  status |= clSetKernelArg(clState->kernel, 4, sizeof(cl_ulong), (void *)&le_target);

  return status;
}
Ejemplo n.º 2
0
void whirlpool_compress(uint8_t state[64], const uint8_t block[64]) {
	const int NUM_ROUNDS = 10;  // Any number from 0 to 32 is allowed
	uint8_t tempState[64];
	uint8_t tempBlock[64];
	int i;
	
	// Initialization
	memcpy(tempState, state, 64);
	for (i = 0; i < 64; i++)
		tempBlock[i] = block[i] ^ state[i];
	
	// Hashing rounds
	uint8_t rcon[64];
	memset(rcon + 8, 0, 56);
	for (i = 0; i < NUM_ROUNDS; i++) {
		int j;
		for (j = 0; j < 8; j++)
			rcon[j] = SBOX[(i << 3) | j];
		whirlpool_round(tempState, rcon);
		whirlpool_round(tempBlock, tempState);
	}
	
	// Final combining
	for (i = 0; i < 64; i++)
		state[i] ^= block[i] ^ tempBlock[i];
}