#ifndef SHA_256
#define SHA_256 1

//void SHA256(uint8 *digest, uint8 *block0, uint8 *block1, bool notfresh){

void SHA256(uint8 *digest, uint8 *block0, uint8 *block1){

	//uint A, B, C, D, E, F, G, H;

	uint B00 = (*block0).s0;
	uint B01 = (*block0).s1;
	uint B02 = (*block0).s2;
	uint B03 = (*block0).s3;

	uint B04 = (*block0).s4;
	uint B05 = (*block0).s5;
	uint B06 = (*block0).s6;
	uint B07 = (*block0).s7;

	uint B08 = (*block1).s0;
	uint B09 = (*block1).s1;
	uint B10 = (*block1).s2;
	uint B11 = (*block1).s3;
	uint B12 = (*block1).s4;
	uint B13 = (*block1).s5;
	uint B14 = (*block1).s6;
	uint B15 = (*block1).s7;


//	if(notfresh){
	uint A = (*digest).s0;
	uint B = (*digest).s1;
	uint C = (*digest).s2;
	uint D = (*digest).s3;
	uint E = (*digest).s4;
	uint F = (*digest).s5;
	uint G = (*digest).s6;
	uint H = (*digest).s7;

	RND(A,B,C,D,E,F,G,H, B00 + K00);
	RND(H,A,B,C,D,E,F,G, B01 + K01);
	RND(G,H,A,B,C,D,E,F, B02 + K02);
	RND(F,G,H,A,B,C,D,E, B03 + K03);

/*
	}else{
		A = B03 + 0xa4ce148bU;
		B = B02 + 0x0c2e12e0U;
		C = B01 + 0xcd2a11aeU;
		D = B00 + 0x98c7e2a2U;
		E = 0x95F61999U;
		F = 0x4498517BU;
		G = 0xC3910C8EU;
		H = B00 + 0xfc08884dU;

		C += Tr1(D) + Ch(D, 0x510e527fU, 0x9b05688cU);
		G += C + Tr2(H) + Ch(H, 0xfb6feee7U, 0x2a01a605U);
		B += Tr1(C) + Ch(C,D, 0x510e527fU);
		F += B + Tr2(G) + Maj(G,H, 0x6a09e667U);
		A += Tr1(B) + Ch(B,C,D);
		E += A + Tr2(F) + Maj(F,G,H);
	}
*/
	RND(E,F,G,H,A,B,C,D, B04 + K04);
	RND(D,E,F,G,H,A,B,C, B05 + K05);
	RND(C,D,E,F,G,H,A,B, B06 + K06);
	RND(B,C,D,E,F,G,H,A, B07 + K07);

	RND(A,B,C,D,E,F,G,H, B08 + K08);
	RND(H,A,B,C,D,E,F,G, B09 + K09);
	RND(G,H,A,B,C,D,E,F, B10 + K10);
	RND(F,G,H,A,B,C,D,E, B11 + K11);

	RND(E,F,G,H,A,B,C,D, B12 + K12);
	RND(D,E,F,G,H,A,B,C, B13 + K13);
	RND(C,D,E,F,G,H,A,B, B14 + K14);
	RND(B,C,D,E,F,G,H,A, B15 + K15);

	B00 += Wr1(B14) + B09 + Wr2(B01);
	RND(A,B,C,D,E,F,G,H, B00 + K16);
	B01 += Wr1(B15) + B10 + Wr2(B02);
	RND(H,A,B,C,D,E,F,G, B01 + K17);
	B02 += Wr1(B00) + B11 + Wr2(B03);
	RND(G,H,A,B,C,D,E,F, B02 + K18);
	B03 += Wr1(B01) + B12 + Wr2(B04);
	RND(F,G,H,A,B,C,D,E, B03 + K19);

	B04 += Wr1(B02) + B13 + Wr2(B05);
	RND(E,F,G,H,A,B,C,D, B04 + K20);
	B05 += Wr1(B03) + B14 + Wr2(B06);
	RND(D,E,F,G,H,A,B,C, B05 + K21);
	B06 += Wr1(B04) + B15 + Wr2(B07);
	RND(C,D,E,F,G,H,A,B, B06 + K22);
	B07 += Wr1(B05) + B00 + Wr2(B08);
	RND(B,C,D,E,F,G,H,A, B07 + K23);

	B08 += Wr1(B06) + B01 + Wr2(B09);
	RND(A,B,C,D,E,F,G,H, B08 + K24);
	B09 += Wr1(B07) + B02 + Wr2(B10);
	RND(H,A,B,C,D,E,F,G, B09 + K25);
	B10 += Wr1(B08) + B03 + Wr2(B11);
	RND(G,H,A,B,C,D,E,F, B10 + K26);
	B11 += Wr1(B09) + B04 + Wr2(B12);
	RND(F,G,H,A,B,C,D,E, B11 + K27);

	B12 += Wr1(B10) + B05 + Wr2(B13);
	RND(E,F,G,H,A,B,C,D, B12 + K28);
	B13 += Wr1(B11) + B06 + Wr2(B14);
	RND(D,E,F,G,H,A,B,C, B13 + K29);
	B14 += Wr1(B12) + B07 + Wr2(B15);
	RND(C,D,E,F,G,H,A,B, B14 + K30);
	B15 += Wr1(B13) + B08 + Wr2(B00);
	RND(B,C,D,E,F,G,H,A, B15 + K31);

	B00 += Wr1(B14) + B09 + Wr2(B01);
	RND(A,B,C,D,E,F,G,H, B00 + K32);
	B01 += Wr1(B15) + B10 + Wr2(B02);
	RND(H,A,B,C,D,E,F,G, B01 + K33);
	B02 += Wr1(B00) + B11 + Wr2(B03);
	RND(G,H,A,B,C,D,E,F, B02 + K34);
	B03 += Wr1(B01) + B12 + Wr2(B04);
	RND(F,G,H,A,B,C,D,E, B03 + K35);

	B04 += Wr1(B02) + B13 + Wr2(B05);
	RND(E,F,G,H,A,B,C,D, B04 + K36);
	B05 += Wr1(B03) + B14 + Wr2(B06);
	RND(D,E,F,G,H,A,B,C, B05 + K37);
	B06 += Wr1(B04) + B15 + Wr2(B07);
	RND(C,D,E,F,G,H,A,B, B06 + K38);
	B07 += Wr1(B05) + B00 + Wr2(B08);
	RND(B,C,D,E,F,G,H,A, B07 + K39);

	B08 += Wr1(B06) + B01 + Wr2(B09);
	RND(A,B,C,D,E,F,G,H, B08 + K40);
	B09 += Wr1(B07) + B02 + Wr2(B10);
	RND(H,A,B,C,D,E,F,G, B09 + K41);
	B10 += Wr1(B08) + B03 + Wr2(B11);
	RND(G,H,A,B,C,D,E,F, B10 + K42);
	B11 += Wr1(B09) + B04 + Wr2(B12);
	RND(F,G,H,A,B,C,D,E, B11 + K43);

	B12 += Wr1(B10) + B05 + Wr2(B13);
	RND(E,F,G,H,A,B,C,D, B12 + K44);
	B13 += Wr1(B11) + B06 + Wr2(B14);
	RND(D,E,F,G,H,A,B,C, B13 + K45);
	B14 += Wr1(B12) + B07 + Wr2(B15);
	RND(C,D,E,F,G,H,A,B, B14 + K46);
	B15 += Wr1(B13) + B08 + Wr2(B00);
	RND(B,C,D,E,F,G,H,A, B15 + K47);

	B00 += Wr1(B14) + B09 + Wr2(B01);
	RND(A,B,C,D,E,F,G,H, B00 + K48);
	B01 += Wr1(B15) + B10 + Wr2(B02);
	RND(H,A,B,C,D,E,F,G, B01 + K49);
	B02 += Wr1(B00) + B11 + Wr2(B03);
	RND(G,H,A,B,C,D,E,F, B02 + K50);
	B03 += Wr1(B01) + B12 + Wr2(B04);
	RND(F,G,H,A,B,C,D,E, B03 + K51);

	B04 += Wr1(B02) + B13 + Wr2(B05);
	RND(E,F,G,H,A,B,C,D, B04 + K52);
	B05 += Wr1(B03) + B14 + Wr2(B06);
	RND(D,E,F,G,H,A,B,C, B05 + K53);
	B06 += Wr1(B04) + B15 + Wr2(B07);
	RND(C,D,E,F,G,H,A,B, B06 + K54);
	B07 += Wr1(B05) + B00 + Wr2(B08);
	RND(B,C,D,E,F,G,H,A, B07 + K55);

	B08 += Wr1(B06) + B01 + Wr2(B09);
	RND(A,B,C,D,E,F,G,H, B08 + K56);
	B09 += Wr1(B07) + B02 + Wr2(B10);
	RND(H,A,B,C,D,E,F,G, B09 + K57);
	B10 += Wr1(B08) + B03 + Wr2(B11);
	RND(G,H,A,B,C,D,E,F, B10 + K58);
	B11 += Wr1(B09) + B04 + Wr2(B12);
	RND(F,G,H,A,B,C,D,E, B11 + K59);

	B12 += Wr1(B10) + B05 + Wr2(B13);
	RND(E,F,G,H,A,B,C,D, B12 + K60);
	B13 += Wr1(B11) + B06 + Wr2(B14);
	RND(D,E,F,G,H,A,B,C, B13 + K61);
	B14 += Wr1(B12) + B07 + Wr2(B15);
	RND(C,D,E,F,G,H,A,B, B14 + K62);
	B15 += Wr1(B13) + B08 + Wr2(B00);
	RND(B,C,D,E,F,G,H,A, B15 + K63);

	(*digest).s0 += A;
	(*digest).s1 += B;
	(*digest).s2 += C;
	(*digest).s3 += D;
	(*digest).s4 += E;
	(*digest).s5 += F;
	(*digest).s6 += G;
	(*digest).s7 += H;
}

#endif