#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <math.h>

#define rotl(x,y) ( (x << y) | (x >> (32 - y)) )
#define Ch(x,y,z) ((x & (y ^ z)) ^ z)
//#define CH(x,y,z) (((x) & (y)) ^ (~(x) & (z)))
//#define rotl(x,y) rotate(x,y)
//#define Ch(x,y,z) bitselect(z,y,x)
#define Maj(x,y,z) Ch((x^z),y,z)
#define EndianSwapa(n) (Ch(E0, rotl(n, 8U), rotl(n, 24U)))
#define EndianSwapb(n) (rotl(n & E0, 24U)|rotl(n & E1, 8U))
#define Tr2(x)      (rotl(x, 30U) ^ rotl(x, 19U) ^ rotl(x, 10U))
#define Tr1(x)      (rotl(x, 26U) ^ rotl(x, 21U) ^ rotl(x, 7U))
#define Wr2(x)      (rotl(x, 25U) ^ rotl(x, 14U) ^ (x>>3U))
#define Wr1(x)      (rotl(x, 15U) ^ rotl(x, 13U) ^ (x>>10U))

#define ROTR(x, n)      ((x >> n) | (x << (32 - n)))
#define S0(x)           (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22))
#define S1(x)           (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25))
#define s0(x)           (ROTR(x, 7) ^ ROTR(x, 18) ^ (x >> 3))
#define s1(x)           (ROTR(x, 17) ^ ROTR(x, 19) ^ (x >> 10))

//B00 += Wr1(B14) + B09 + Wr2(B01);

//B00 += (rotl(B14, 15U) ^ rotl(B14, 13U) ^ (B14>>10U)) + B09 + (rotl(B01, 25U) ^ rotl(B01, 14U) ^ (B01>>3U))


//B00 += (( (B14 << 15U) | (B14 >> (32 - 15U)) ) ^ ( (B14 << 13U) | (B14 >> (32 - 13U)) ) ^ ( (B14 << 10U) | (B14 >> (32 - 10U)))
//+ B09 + (( (B01 << 25U) | (B01 >> (32 - 25U)) ) ^ ( (B01 << 14U) | (B01 >> (32 - 14U)) ) ^ ( (B01 << 3U) | (B01 >> (32 - 3U)))

//B00 == 0xf59b89c2U


#define RND(a, b, c, d, e, f, g, h, k)  \
    h += Tr1(e);            \
    h += Ch(e, f, g);       \
    h += k;             \
    d += h;             \
    h += Tr2(a);            \
    h += Maj(a, b, c);


#define RNDr(S, W, i) \
    RND(S[(64 - i) % 8], S[(65 - i) % 8], \
        S[(66 - i) % 8], S[(67 - i) % 8], \
        S[(68 - i) % 8], S[(69 - i) % 8], \
        S[(70 - i) % 8], S[(71 - i) % 8], \
        W[i] + K[i])



const uint32_t K[] = {
0x428a2f98U, 0x71374491U, 0xb5c0fbcfU, 0xe9b5dba5U, 0x3956c25bU, 0x59f111f1U, 0x923f82a4U, 0xab1c5ed5U, 0xd807aa98U, 0x12835b01U, 0x243185beU, 0x550c7dc3U, 0x72be5d74U, 0x80deb1feU, 0x9bdc06a7U, 0xc19bf174U,
0xe49b69c1U, 0xefbe4786U, 0x0fc19dc6U, 0x240ca1ccU, 0x2de92c6fU, 0x4a7484aaU, 0x5cb0a9dcU, 0x76f988daU, 0x983e5152U, 0xa831c66dU, 0xb00327c8U, 0xbf597fc7U, 0xc6e00bf3U, 0xd5a79147U, 0x06ca6351U, 0x14292967U,
0x27b70a85U, 0x2e1b2138U, 0x4d2c6dfcU, 0x53380d13U, 0x650a7354U, 0x766a0abbU, 0x81c2c92eU, 0x92722c85U, 0xa2bfe8a1U, 0xa81a664bU, 0xc24b8b70U, 0xc76c51a3U, 0xd192e819U, 0xd6990624U, 0xf40e3585U, 0x106aa070U,
0x19a4c116U, 0x1e376c08U, 0x2748774cU, 0x34b0bcb5U, 0x391c0cb3U, 0x4ed8aa4aU, 0x5b9cca4fU, 0x682e6ff3U, 0x748f82eeU, 0x78a5636fU, 0x84c87814U, 0x8cc70208U, 0x90befffaU, 0xa4506cebU, 0xbef9a3f7U, 0xc67178f2U};


static const uint32_t sha256_k[64] = {
    0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
    0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
    0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
    0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,

    0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
    0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
    0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
    0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,

    0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
    0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
    0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
    0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,

    0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
    0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
    0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
    0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
};




/*
0x428a2f98U,
0x71374491U,
0xb5c0fbcfU,
0xe9b5dba5U,
0x3956c25bU,
0x59f111f1U,
0x923f82a4U,
0xab1c5ed5U,
0xd807aa98U,
0x12835b01U,
0x243185beU, // 10
0x550c7dc3U,
0x72be5d74U,
0x80deb1feU,
0x9bdc06a7U,
0xe49b69c1U,
0xefbe4786U,
0x0fc19dc6U,
0x240ca1ccU,
0x2de92c6fU,
0x4a7484aaU, // 20
0x5cb0a9dcU,
0x76f988daU,
0x983e5152U,
0xa831c66dU,
0xb00327c8U,
0xbf597fc7U,
0xc6e00bf3U,
0xd5a79147U,
0x06ca6351U,
0x14292967U, // 30
0x27b70a85U,
0x2e1b2138U,
0x4d2c6dfcU,
0x53380d13U,
0x650a7354U,
0x766a0abbU,
0x81c2c92eU,
0x92722c85U,
0xa2bfe8a1U,
0xa81a664bU, // 40
0xc24b8b70U,
0xc76c51a3U,
0xd192e819U,
0xd6990624U,
0xf40e3585U,
0x106aa070U,
0x19a4c116U,
0x1e376c08U,
0x2748774cU,
0x34b0bcb5U, // 50
0x391c0cb3U,
0x4ed8aa4aU,
0x5b9cca4fU,
0x682e6ff3U,
0x748f82eeU,
0x78a5636fU,
0x84c87814U,
0x8cc70208U,
0x90befffaU,
0xa4506cebU, // 60
0xbef9a3f7U,
0xc67178f2U,
0x98c7e2a2U,
0xfc08884dU,
0xcd2a11aeU,
0x510e527fU,
0x9b05688cU,
0xC3910C8EU,
0xfb6feee7U,
0x2a01a605U, // 70
0x0c2e12e0U,
0x4498517BU,
0x6a09e667U,
0xa4ce148bU,
0x95F61999U,
0xc19bf174U,
0xBB67AE85U,
0x3C6EF372U,
0xA54FF53AU,
0x1F83D9ABU, // 80
0x5BE0CD19U,
0x5C5C5C5CU,
0x36363636U,
0x80000000U,
0x000003FFU,
0x00000280U,
0x000004a0U,
0x00000300U
};
*/

void sha1(uint32_t *a, uint32_t *b, uint32_t *c){

uint32_t A = a[0];
uint32_t B = a[1];
uint32_t C = a[2];
uint32_t D = a[3];
uint32_t E = a[4];
uint32_t F = a[5];
uint32_t G = a[6];
uint32_t H = a[7];
uint32_t B00 = c[0];
uint32_t B01 = c[1];
uint32_t B02 = c[2];
uint32_t B03 = c[3];


H += Tr1(E);
H += Ch(E, F, G);
H += K[0]+B00;
D += H;
H += Tr2(A);
H += Maj(A, B, C);

G += Tr1(D);
G += Ch(D, E, F);
G += K[1]+B01;
C += G;
G += Tr2(H);
G += Maj(H, A, B);

F += Tr1(C);
F += Ch(C, D, E);
F += K[2]+B02;
B += F;
F += Tr2(G);
F += Maj(G, H, A);

E += Tr1(B);
E += Ch(B, C, D);
E += K[3]+B03;
A += E;
E += Tr2(F);
E += Maj(F, G, H);

printf("%u %u %u %u %u %u %u %u\n", A, B, C, D, E, F, G, H);

printf("%u %u %u %u %u %u %u %u\n", A+b[0], B+b[1], C+b[2], D+b[3], E+b[4], F+b[5], G+b[6], H+b[7]);
}


void sha2(uint32_t *b, uint32_t *c){
uint32_t B00 = c[0];
uint32_t B01 = c[1];
uint32_t B02 = c[2];
uint32_t B03 = c[3];

	uint32_t D= K[63] +B00;
uint32_t H= K[64] +B00;
uint32_t C= K[65] +Tr1(D)+Ch(D, K[66], K[67])+B01;
uint32_t G= K[68] +C+Tr2(H)+Ch(H, K[69] ,K[70]);
uint32_t B= K[71] +Tr1(C)+Ch(C,D,K[66])+B02;
uint32_t F= K[72] +B+Tr2(G)+Maj(G,H, K[73]);
uint32_t A= K[74] +Tr1(B)+Ch(B,C,D)+B03;
uint32_t E= K[75] +A+Tr2(F)+Maj(F,G,H);
printf("%u %u %u %u %u %u %u %u\n", A+b[0], B+b[1], C+b[2], D+b[3], E+b[4], F+b[5], G+b[6], H+b[7]);

}


void sha3(void){

uint32_t i = 0;
uint32_t count = 0;
/*
uint32_t B00 = K[0];
uint32_t B01 = K[1];
uint32_t B02 = K[2];
uint32_t B03 = K[3];
uint32_t B04 = K[4];
uint32_t B05 = K[5];
uint32_t B06 = K[6];
uint32_t B07 = K[7];
uint32_t B08 = K[8];
uint32_t B09 = K[9];
uint32_t B10 = K[10];
uint32_t B11 = K[11];
uint32_t B12 = K[12];
uint32_t B13 = K[13];
uint32_t B14 = K[14];
uint32_t B15 = K[15];
*/
uint32_t A,B,C,D,E,F,G,H;
//uint32_t B00, B01, B02, B03, B04, B05, B06, B07;
//uint32_t B08, B09, B10, B11, B12, B13, B14, B15;


uint32_t B00 = 0;
uint32_t B01 = 0;
uint32_t B02 = 0;
uint32_t B03 = 0;
uint32_t B04 = 0;
uint32_t B05 = 0;
uint32_t B06 = 0;
uint32_t B07 = 0;
uint32_t B08 = 0;
uint32_t B09 = 0;
uint32_t B10 = 0;
uint32_t B11 = 0;
uint32_t B12 = 0;
uint32_t B13 = 0;
uint32_t B14 = 0;
uint32_t B15 = 0;



B00 = K[0];
B01 = K[1];
B02 = K[2];
B03 = K[3];
B04 = K[4];
B05 = K[5];
B06 = K[6];
B07 = K[7];
B08 = K[8];
B09 = K[9];
B10 = K[10];
B11 = K[11];
B12 = K[12];
B13 = K[13];
B14 = K[14];
B15 = K[15];



//0x00000001, 0x80000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000620
//0x428a2f99U, 0xf1374491U, 0xb5c0fbcfU, 0xe9b5dba5U, 0x3956c25bU, 0x59f111f1U, 0x923f82a4U, 0xab1c5ed5U, 0xd807aa98U, 0x12835b01U, 0x243185beU, 0x550c7dc3U, 0x72be5d74U, 0x80deb1feU, 0x9bdc06a7U, 0xc19bf794U
B00 = 0x00000001U;
B01 = 0x80000000U;
B02 = 0x0U;
B03 = 0x0U;
B04 = 0x0U;
B05 = 0x0U;
B06 = 0x0U;
B07 = 0x0U;
B08 = 0x0U;
B09 = 0x0U;
B10 = 0x0U;
B11 = 0x0U;
B12 = 0x0U;
B13 = 0x0U;
B14 = 0x0U;
B15 = 0x00000620U;

//uint64_t bla = 4294968864;


//1
//2147483648
//1568

uint32_t S[8];
uint32_t W[120];
W[0]= 0x00000001U;
W[1]= 0x80000000U;
W[2]= 0x0U;
W[3]= 0x0U;
W[4]= 0x0U;
W[5]= 0x0U;
W[6]= 0x0U;
W[7]= 0x0U;
W[8]= 0x0U;
W[9]= 0x0U;
W[10]= 0x0U;
W[11]= 0x0U;
W[12]= 0x0U;
W[13]= 0x0U;
W[14]= 0x0U;
W[15]= 0x00000620U;

//W[16]= 0x00000620U;



i=0;
//printf("0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU ", W[i], W[i+1], W[i+2], W[i+3], W[i+4], W[i+5], W[i+6], W[i+7]);
//printf("0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU\n", W[i+8], W[i+9], W[i+10], W[i+11], W[i+12], W[i+13], W[i+14], W[i+15]);

    for (i = 16; i < 64; i += 2) {
        W[i]   = s1(W[i - 2]) + W[i - 7] + s0(W[i - 15]) + W[i - 16];
        W[i+1] = s1(W[i - 1]) + W[i - 6] + s0(W[i - 14]) + W[i - 15];
    }

/*
    W[18] += s0(W[3]);
    W[19] += W[3];
    W[20] += s1(W[18]);
    W[21]  = s1(W[19]);
    W[22] += s1(W[20]);
    W[23] += s1(W[21]);
    W[24] += s1(W[22]);
    W[25]  = s1(W[23]) + W[18];
    W[26]  = s1(W[24]) + W[19];
    W[27]  = s1(W[25]) + W[20];
    W[28]  = s1(W[26]) + W[21];
    W[29]  = s1(W[27]) + W[22];
    W[30] += s1(W[28]) + W[23];
    W[31] += s1(W[29]) + W[24];
    for (i = 32; i < 64; i += 2) {
        W[i]   = s1(W[i - 2]) + W[i - 7] + s0(W[i - 15]) + W[i - 16];
        W[i+1] = s1(W[i - 1]) + W[i - 6] + s0(W[i - 14]) + W[i - 15];
    }
*/



for(i=0; i<64; i++){
	printf("0x%08xU ", W[i]+K[i]);
	if(i==15 || i==31 || i==47 || i==63)
		printf("\n");
}

//for (i = 16; i < 64; i += 16) {
//	printf("0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU ", K[i]+W[i], W[i+1], W[i+2], W[i+3], W[i+4], W[i+5], W[i+6], W[i+7]);
//	printf("0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU\n", W[i+8], W[i+9], W[i+10], W[i+11], W[i+12], W[i+13], W[i+14], W[i+15]);
//}



printf("\n");


for(i=0; i<4; i++){

    printf("0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU ", B00+K[i*16], B01+K[i*16+1], B02+K[i*16+2], B03+K[i*16+3], B04+K[i*16+4], B05+K[i*16+5], B06+K[i*16+6], B07+K[i*16+7]);
    printf("0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU\n", B08+K[i*16+8], B09+K[i*16+9], B10+K[i*16+10], B11+K[i*16+11], B12+K[i*16+12], B13+K[i*16+13], B14+K[i*16+14], B15+K[i*16+15]);


if(i==3)
	break;


B00 += Wr1(B14) + B09 + Wr2(B01);
B01 += Wr1(B15) + B10 + Wr2(B02);
B02 += Wr1(B00) + B11 + Wr2(B03);
B03 += Wr1(B01) + B12 + Wr2(B04);
B04 += Wr1(B02) + B13 + Wr2(B05);
B05 += Wr1(B03) + B14 + Wr2(B06);
B06 += Wr1(B04) + B15 + Wr2(B07);
B07 += Wr1(B05) + B00 + Wr2(B08);
B08 += Wr1(B06) + B01 + Wr2(B09);
B09 += Wr1(B07) + B02 + Wr2(B10);
B10 += Wr1(B08) + B03 + Wr2(B11);
B11 += Wr1(B09) + B04 + Wr2(B12);
B12 += Wr1(B10) + B05 + Wr2(B13);
B13 += Wr1(B11) + B06 + Wr2(B14);
B14 += Wr1(B12) + B07 + Wr2(B15);
B15 += Wr1(B13) + B08 + Wr2(B00);


//if(i==48)
//	break;


//B00 += Wr1(B14) + B09 + Wr2(B01);
//B01 += Wr1(B15) + B10 + Wr2(B02);


/*
W[0] += s1(W[14]) + W[9] + s0(W[1]);
W[i]   = s1(W[i - 2]) + W[i - 7] + s0(W[i - 15]) + W[i - 16];
W[i+1] = s1(W[i - 1]) + W[i - 6] + s0(W[i - 14]) + W[i - 15];
W[ ] += s1(W[ +14]) + W[ +9] + s0(W[ +1]);
W[ +1] += s1(W[ +15]) + W[ +10] + s0(W[ +2]);
W[ +2] += s1(W[ ]) + W[ +11] + s0(W[ +3]);
W[ +3] += s1(W[ +1]) + W[ +12] + s0(W[ +4]);
W[ +4] += s1(W[ +2]) + W[ +13] + s0(W[ +5]);
W[ +5] += s1(W[ +3]) + W[ +14] + s0(W[ +6]);
W[ +6] += s1(W[ +4]) + W[ +15] + s0(W[ +7]);
W[ +7] += s1(W[ +5]) + W[ ] + s0(W[ +8]);
W[ +8] += s1(W[ +6]) + W[ +1] + s0(W[ +9]);
W[ +9] += s1(W[ +7]) + W[ +2] + s0(W[ +10]);
W[ +10] += s1(W[ +8]) + W[ +3] + s0(W[ +11]);
W[ +11] += s1(W[ +9]) + W[ +4] + s0(W[ +12]);
W[ +12] += s1(W[ +10]) + W[ +5] + s0(W[ +13]);
W[ +13] += s1(W[ +11]) + W[ +6] + s0(W[ +14]);
W[ +14] += s1(W[ +12]) + W[ +7] + s0(W[ +15]);
W[ +15] += s1(W[ +13]) + W[ +8] + s0(W[ ]);
*/


}
/*
RND(A,B,C,D,E,F,G,H, B00+K[i]);
RND(H,A,B,C,D,E,F,G, B01+K[i+1]);

RND(G,H,A,B,C,D,E,F, B02+K[i+2]);
RND(F,G,H,A,B,C,D,E, B03+K[i+3]);

RND(E,F,G,H,A,B,C,D, B04+K[i+4]);
RND(D,E,F,G,H,A,B,C, B05+K[i+5]);

RND(C,D,E,F,G,H,A,B, B06+K[i+6]);
RND(B,C,D,E,F,G,H,A, B07+K[i+7]);


RND(A,B,C,D,E,F,G,H, B08+K[i+8]);
RND(H,A,B,C,D,E,F,G, B09+K[i+9]);
RND(G,H,A,B,C,D,E,F, B10+K[i+10]);
RND(F,G,H,A,B,C,D,E, B11+K[i+11]);
RND(E,F,G,H,A,B,C,D, B12+K[i+12]);
RND(D,E,F,G,H,A,B,C, B13+K[i+13]);
RND(C,D,E,F,G,H,A,B, B14+K[i+14]);
RND(B,C,D,E,F,G,H,A, B15+K[i+15]);
*/

//2      3      5      7     11     13     17     19     23     29 
//     31     37     41     43     47     53

for(count=0; count<4; count++){
    RNDr(S, W,  0);
    RNDr(S, W,  1);
    RNDr(S, W,  2);
    RNDr(S, W,  3);
    RNDr(S, W,  4);
    RNDr(S, W,  5);
    RNDr(S, W,  6);
    RNDr(S, W,  7);

//B00 = count;
//B01 = count;
//B09 = count;
//B14 = count;

//B00 = count; //(uint32_t)sqrt(2);
//B01 = count; //(uint32_t)sqrt(3);

//B02 = count; //(uint32_t)sqrt(5);
//B03 = count; //(uint32_t)sqrt(7);
//B04 = count; //(uint32_t)sqrt(11);
//B05 = count; //(uint32_t)sqrt(13);
//B06 = count; //(uint32_t)sqrt(17);
//B07 = count; //(uint32_t)sqrt(19);
//B08 = count; //(uint32_t)sqrt(23);

//B09 = count; //(uint32_t)sqrt(29);

//B10 = count; //(uint32_t)sqrt(31);
//B11 = count; //(uint32_t)sqrt(37);
//B12 = count; //(uint32_t)sqrt(41);
//B13 = count; //(uint32_t)sqrt(43);

//B14 = count; //(uint32_t)sqrt(47);

//B15 = count; //(uint32_t)sqrt(53);

/*
B00 = K[i*16];
B01 = K[i*16+1];
B02 = K[i*16+2];
B03 = K[i*16+3];
B04 = K[i*16+4];
B05 = K[i*16+5];
B06 = K[i*16+6];
B07 = K[i*16+7];
B08 = K[i*16+8];
B09 = K[i*16+9];
B10 = K[i*16+10];
B11 = K[i*16+11];
B12 = K[i*16+12];
B13 = K[i*16+13];
B14 = K[i*16+14];
B15 = K[i*16+15];
*/



//    printf("0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU ", B00, B01, B02, B03, B04, B05, B06, B07);
//    printf("0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU\n", B08, B09, B10, B11, B12, B13, B14, B15);


//B00 += 1;
//B01 += 2147483648;
//B15 -= 587166253;

//B00 += 1 + 4294967296;
//B01 += 2147483648;
//B02 += K[2];
//B03 += K[3];
//B04 += K[4];
//B05 += K[5];
//B06 += K[6];
//B07 += K[7];
//B08 += K[8];
//B09 += K[9];
//B10 += K[10];
//B11 += K[11];
//B12 += K[12];
//B13 += K[13];
//B14 += K[14];
//B15 -= 587166253;

//B00 += 4294967296;
//B01 += 2147483648;

//B08 += 1073741824;
//B09 += 2147483648;

//B08 += 2147483648;
//B09 += 4294967296;

//B00 += 1;
//B01 += 2147483648;
//B15 -= 587166253;

/*

A = K[i*16] + W[i*16];
B = K[i*16+1] + W[i*16+1];
C = K[i*16+2] + W[i*16+2];
D = K[i*16+3] + W[i*16+3];
E = K[i*16+4] + W[i*16+4];
F = K[i*16+5] + W[i*16+5];
G = K[i*16+6] + W[i*16+6];
H = K[i*16+7] + W[i*16+7];
printf("0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU ", A, B, C, D, E, F, G, H);
A = K[i*16+8] + W[i*16+8];
B = K[i*16+9] + W[i*16+9];
C = K[i*16+10] + W[i*16+10];
D = K[i*16+11] + W[i*16+11];
E = K[i*16+12] + W[i*16+12];
F = K[i*16+13] + W[i*16+13];
G = K[i*16+14] + W[i*16+14];
H = K[i*16+15] + W[i*16+15];
printf("0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU\n", A, B, C, D, E, F, G, H);
*/


//    printf("0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU ", B00, B01, B02, B03, B04, B05, B06, B07);
//  printf("0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU\n", B08, B09, B10, B11, B12, B13, B14, B15);

if(count == 3)
	break;

/*
B00 += Wr1(B14) + B09 + Wr2(B01);
B01 += Wr1(B15) + B10 + Wr2(B02);
B02 += Wr1(B00) + B11 + Wr2(B03);
B03 += Wr1(B01) + B12 + Wr2(B04);
B04 += Wr1(B02) + B13 + Wr2(B05);
B05 += Wr1(B03) + B14 + Wr2(B06);
B06 += Wr1(B04) + B15 + Wr2(B07);
B07 += Wr1(B05) + B00 + Wr2(B08);
B08 += Wr1(B06) + B01 + Wr2(B09);
B09 += Wr1(B07) + B02 + Wr2(B10);
B10 += Wr1(B08) + B03 + Wr2(B11);
B11 += Wr1(B09) + B04 + Wr2(B12);
B12 += Wr1(B10) + B05 + Wr2(B13);
B13 += Wr1(B11) + B06 + Wr2(B14);
B14 += Wr1(B12) + B07 + Wr2(B15);
B15 += Wr1(B13) + B08 + Wr2(B00);
*/


/*
W[i*16] += s1(W[i*16+14]) + W[i*16+9] + s0(W[i*16+1]);
W[i*16+1] += s1(W[i*16+15]) + W[i*16+10] + s0(W[i*16+2]);
W[i*16+2] += s1(W[i*16]) + W[i*16+11] + s0(W[i*16+3]);
W[i*16+3] += s1(W[i*16+1]) + W[i*16+12] + s0(W[i*16+4]);
W[i*16+4] += s1(W[i*16+2]) + W[i*16+13] + s0(W[i*16+5]);
W[i*16+5] += s1(W[i*16+3]) + W[i*16+14] + s0(W[i*16+6]);
W[i*16+6] += s1(W[i*16+4]) + W[i*16+15] + s0(W[i*16+7]);
W[i*16+7] += s1(W[i*16+5]) + W[i*16] + s0(W[i*16+8]);
W[i*16+8] += s1(W[i*16+6]) + W[i*16+1] + s0(W[i*16+9]);
W[i*16+9] += s1(W[i*16+7]) + W[i*16+2] + s0(W[i*16+10]);
W[i*16+10] += s1(W[i*16+8]) + W[i*16+3] + s0(W[i*16+11]);
W[i*16+11] += s1(W[i*16+9]) + W[i*16+4] + s0(W[i*16+12]);
W[i*16+12] += s1(W[i*16+10]) + W[i*16+5] + s0(W[i*16+13]);
W[i*16+13] += s1(W[i*16+11]) + W[i*16+6] + s0(W[i*16+14]);
W[i*16+14] += s1(W[i*16+12]) + W[i*16+7] + s0(W[i*16+15]);
W[i*16+15] += s1(W[i*16+13]) + W[i*16+8] + s0(W[i*16]);
*/







//W[i*16+1]
//for (i = 16; i < 64; i += 2) {
//W[i]   = s1(W[i - 2]) + W[i - 7] + s0(W[i - 15]) + W[i - 16];
//W[i+1] = s1(W[i - 1]) + W[i - 6] + s0(W[i - 14]) + W[i - 15];

//uint32_t S[8];
//#define S1(x)           (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25))
//#define s0(x)           (ROTR(x, 7) ^ ROTR(x, 18) ^ (x >> 3))

/*
W[16]   = s1(W[14]) + W[9] + s0(W[1]) + W[0];
W[17] = s1(W[15]) + W[10] + s0(W[2]) + W[1];

W[17]   = s1(W[15]) + W[10] + s0(W[2]) + W[1];
W[18] = s1(W[16]) + W[11] + s0(W[3]) + W[2];

W[18]   = s1(W[16]) + W[11] + s0(W[3]) + W[2];
W[19] = s1(W[17]) + W[12] + s0(W[4]) + W[3];

W[19]   = s1(W[17]) + W[12] + s0(W[4]) + W[3];
W[20] = s1(W[18]) + W[13] + s0(W[5]) + W[4];

W[20]   = s1(W[18]) + W[13] + s0(W[5]) + W[4];
W[21] = s1(W[19]) + W[14] + s0(W[6]) + W[5];

W[21]   = s1(W[19]) + W[14] + s0(W[6]) + W[5];
W[22] = s1(W[20]) + W[15] + s0(W[7]) + W[6];

W[22]   = s1(W[20]) + W[15] + s0(W[7]) + W[6];
W[23] = s1(W[21]) + W[16] + s0(W[8]) + W[7];

W[23]   = s1(W[21]) + W[16] + s0(W[8]) + W[7];
W[24] = s1(W[22]) + W[17] + s0(W[9]) + W[8];
*/



//if(B00 == 0xf59b89c2U){
//	printf("0x%08xU\n", count);
//	printf("-0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU ", B00, B01, B02, B03, B04, B05, B06, B07);
//	printf("0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU\n", B08, B09, B10, B11, B12, B13, B14, B15);
//}
//if(B01 == 0x73924787U){
//	printf("0x%08xU\n", count);
//	printf("0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU -\n", B00, B01, B02, B03, B04, B05, B06, B07);
//}
}

}

/*
(uint16)(0x428a2f98U, 0x71374491U, 0xb5c0fbcfU, 0xe9b5dba5U, 0x3956c25bU, 0x59f111f1U, 0x923f82a4U, 0xab1c5ed5U, 0xd807aa98U, 0x12835b01U, 0x243185beU, 0x550c7dc3U, 0x72be5d74U, 0x80deb1feU, 0x9bdc06a7U, 0xc19bf174U),
(uint16)(0x428a2f99U, 0xf1374491U, 0xb5c0fbcfU, 0xe9b5dba5U, 0x3956c25bU, 0x59f111f1U, 0x923f82a4U, 0xab1c5ed5U, 0xd807aa98U, 0x12835b01U, 0x243185beU, 0x550c7dc3U, 0x72be5d74U, 0x80deb1feU, 0x9bdc06a7U, 0xc19bf794U),


0x428a2f98U
0x71374491U
0xc19bf174U


0x428a2f99U
0xf1374491U
0xc19bf794U


1116352408
1116352409

1899447441
4046931089

3248222580
3248224148

1
2147483648
1568

*/


int main(int argc, char **argv){
	// 8 ints fixed
	uint32_t a[8] = {K[63],K[64],K[65],K[68],K[71],K[72],K[74],K[75]};
	//ostate/tstate
	uint32_t b[8] = {0x6a09e667U, 0xBB67AE85U, 0x3C6EF372U, 0xA54FF53AU, 0x510e527fU, 0x9b05688cU, 0x1F83D9ABU, 0x5BE0CD19U};

	//uint32_t b[8] = {};
	//random 4 int block
	uint32_t c[4] = {0x6a09e667U, 0xBB67AE85U, 0x3C6EF372U, 0xA54FF53AU};

//sha1(b, b, c);

//sha2(b, c);

	sha3();

	return 0;
}