By the way this is my code (in 2 parts)
PART 1
#define ROTATE_DOWN16(a) (((a) << 16) | ((a) >> 16))
#define ROTATE_DOWN12(a) (((a) << 20) | ((a) >> 12))
#define ROTATE_DOWN8(a) (((a) << 24) | ((a) >> 8))
#define ROTATE_DOWN7(a) (((a) << 25) | ((a) >> 7))
static const myuint IV[8] = {//initial values to hash
0x6A09E667,
0xBB67AE85,
0x3C6EF372,
0xA54FF53A,
0x510E527F,
0x9B05688C,
0x1F83D9AB,
0x5BE0CD19
};
static const myuint c_blake[16] ={
0x243F6A88,
0x85A308D3,
0x13198A2E,
0x03707344,
0xA4093822,
0x299F31D0,
0x082EFA98,
0xEC4E6C89,
0x452821E6,
0x38D01377,
0xBE5466CF,
0x34E90C6C,
0xC0AC29B7,
0xC97C50DD,
0x3F84D5B5,
0xB5470917,
};
//10 permutations
static const myuint sigma[10][16]={
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
{ 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3},
{ 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4},
{ 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8},
{ 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13},
{ 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9},
{ 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11},
{ 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10},
{ 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5},
{ 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0}
};
myuint U8_to_U32(const BitSequence *d){
return ((( myuint)(*d ))<< 24 | ((myuint)(*(d+1)) )<< 16 | ((myuint)(*(d+2))) << 8 | (myuint)(*(d+3)) );
}
void U32_to_U8(BitSequence *h, myuint s){
*h= (BitSequence)(s>>24);
*(h+1)=(BitSequence)((s <<8 )>>24);
*(h+2)=(BitSequence)((s <<16 )>>24);
*(h+3)=(BitSequence)((s <<24 )>>24);
}
void G(int i,int r,myuint m[16],myuint *a,myuint *b ,myuint *c,myuint *d){
*a = *a + *b + ( m[(sigma[r][2*i])] ^ c_blake[(sigma[r][2*i + 1])] );
*d = ROTATE_DOWN16((*d ^ *a));
*c = *c + *d;
*b = ROTATE_DOWN12((*b ^ *c));
*a = *a + *b + ( m[(sigma[r][2*i + 1])] ^ c_blake[(sigma[r][2*i])] );
*d = ROTATE_DOWN8((*d ^ *a));
*c = *c + *d;
*b = ROTATE_DOWN7((*b ^ *c));
}
void compress(hashstate *state, myuint m[16])
{
Serial.println(state->counter[0]);
Serial.println(state->counter[1]);
state->int_state[0]=state->chainvalue[0];
state->int_state[1]=state->chainvalue[1];
state->int_state[2]=state->chainvalue[2];
state->int_state[3]=state->chainvalue[3];
state->int_state[4]=state->chainvalue[4];
state->int_state[5]=state->chainvalue[5];
state->int_state[6]=state->chainvalue[6];
state->int_state[7]=state->chainvalue[7];
state->int_state[8] = state->salt[0] ^ c_blake[0];
state->int_state[9] = state->salt[1] ^ c_blake[1];
state->int_state[10] = state->salt[2] ^ c_blake[2];
state->int_state[11] = state->salt[3] ^ c_blake[3];
state->int_state[12] = state->counter[0] ^ c_blake[4];
state->int_state[13] = state->counter[0] ^ c_blake[5];
state->int_state[14] = state->counter[1] ^ c_blake[6];
state->int_state[15] = state->counter[1] ^ c_blake[7];
// for(i=0;i<16;i++)printf("%02X\n",state->int_state[i]);
//RRound
int r;
for(r=0;r<10;r++){
//COLUMN STEP
G(0,r,m,&(state->int_state[0]),&(state->int_state[4]),&(state->int_state[8]),&(state->int_state[12]));
G(1,r,m,&(state->int_state[1]),&(state->int_state[5]),&(state->int_state[9]),&(state->int_state[13]));
G(2,r,m,&(state->int_state[2]),&(state->int_state[6]),&(state->int_state[10]),&(state->int_state[14]));
G(3,r,m,&(state->int_state[3]),&(state->int_state[7]),&(state->int_state[11]),&(state->int_state[15]));
//DIAGONAL STEP
G(4,r,m,&(state->int_state[0]),&(state->int_state[5]),&(state->int_state[10]),&(state->int_state[15]));
G(5,r,m,&(state->int_state[1]),&(state->int_state[6]),&(state->int_state[11]),&(state->int_state[12]));
G(6,r,m,&(state->int_state[2]),&(state->int_state[7]),&(state->int_state[8]),&(state->int_state[13]));
G(7,r,m,&(state->int_state[3]),&(state->int_state[4]),&(state->int_state[9]),&(state->int_state[14]));
}
//finalization
state->chainvalue[0] ^= state->salt[0] ^ state->int_state[0] ^ state->int_state[8];
state->chainvalue[1] ^= state->salt[1] ^ state->int_state[1] ^ state->int_state[9];
state->chainvalue[2] ^= state->salt[2] ^ state->int_state[2] ^ state->int_state[10];
state->chainvalue[3] ^= state->salt[3] ^ state->int_state[3] ^ state->int_state[11];
state->chainvalue[4] ^= state->salt[0] ^ state->int_state[4] ^ state->int_state[12];
state->chainvalue[5] ^= state->salt[1] ^ state->int_state[5] ^ state->int_state[13];
state->chainvalue[6] ^= state->salt[2] ^ state->int_state[6] ^ state->int_state[14];
state->chainvalue[7] ^= state->salt[3] ^ state->int_state[7] ^ state->int_state[15];
}