uint8_t inner_block[4][16] = { 0 };
uint32_t tmp = 0x61707865;
memcpy_(inner_block[0], &tmp, 4);
tmp = 0x3320646e;
memcpy_(inner_block[0]+4, &tmp, 4);
tmp = 0x79622d32;
memcpy_(inner_block[0]+8, &tmp, 4);
tmp = 0x6b206574;
memcpy_(inner_block[0]+12, &tmp, 4);
str_reverse((unsigned char *)inner_block[0], 4);
str_reverse((unsigned char*)inner_block[0]+4, 4);
str_reverse((unsigned char*)inner_block[0]+8, 4);
str_reverse((unsigned char*)inner_block[0]+12, 4);
//chacha20
//built inner block
inner_block[0] = big_little_swap32(0x61707865);
inner_block[1] = big_little_swap32(0x3320646e);
inner_block[2] = big_little_swap32(0x79622d32);
inner_block[3] = big_little_swap32(0x6b206574);
for (int i = 0; i < 8; i++)
{
memcpy_((void*)&inner_block[i + 4], (void*)&key1[i * 4], 4);
inner_block[i + 4] = big_little_swap32(inner_block[i + 4]);
}
inner_block[12] = big_little_swap32(block_count);
for (int i = 0; i < 3; i++)
{
memcpy_((void*)&inner_block[i + 13], (void*)&nonce[i * 4], 4);
inner_block[i + 13] = big_little_swap32(inner_block[i + 13]);
}
memcpy_(initial_block, inner_block, 16 * 4);
//20 rounds
for (int i = 0; i < 16; i++)
{
inner_block[i] = big_little_swap32(inner_block[i]);
initial_block[i] = big_little_swap32(initial_block[i]);
}
//20 rounds
for (int i = 0; i < 10; i++)
{
Quarter_Round(&inner_block[0], &inner_block[4], &inner_block[8], &inner_block[12]);
Quarter_Round(&inner_block[1], &inner_block[5], &inner_block[9], &inner_block[13]);
Quarter_Round(&inner_block[2], &inner_block[6], &inner_block[10], &inner_block[14]);
Quarter_Round(&inner_block[3], &inner_block[7], &inner_block[11], &inner_block[15]);
Quarter_Round(&inner_block[0], &inner_block[5], &inner_block[10], &inner_block[15]);
Quarter_Round(&inner_block[1], &inner_block[6], &inner_block[11], &inner_block[12]);
Quarter_Round(&inner_block[2], &inner_block[7], &inner_block[8], &inner_block[13]);
Quarter_Round(&inner_block[3], &inner_block[4], &inner_block[9], &inner_block[14]);
}
for (int i = 0; i < 16; i++)
{
inner_block[i] += initial_block[i];
}
for (int i = 1; i <= 16; i++)
{
printf("%08x ", inner_block[i - 1]);
if (i % 4 == 0)
printf("\n");
}