#include <stdio.h>



//main function

#define leftrotate(x,n) (((x) << (n)) | ((x) >> (32 - (n))))

#define F(A,B,C,D,F,TEMP,W,I,G) (F) = (D) ^ ((B) & ((C) ^ (D))); (TEMP) = (D); (D) = (C); (C) = (B); (B) = (B) + leftrotate((A) + (F) + K##I + (W)[(G)] , R##I); (A) = (TEMP);

#define G(A,B,C,D,F,TEMP,W,I,G) (F) = (C) ^ ((D) & ((B) ^ (C))); (TEMP) = (D); (D) = (C); (C) = (B); (B) = (B) + leftrotate((A) + (F) + K##I + (W)[(G)] , R##I); (A) = (TEMP);

#define H(A,B,C,D,F,TEMP,W,I,G) (F) = (B) ^ (C) ^ (D); (TEMP) = (D); (D) = (C); (C) = (B); (B) = (B) + leftrotate((A) + (F) + K##I + (W)[(G)] , R##I); (A) = (TEMP);

#define I(A,B,C,D,F,TEMP,W,I,G) (F) = (C) ^ ((B) | ~(D)); (TEMP) = (D); (D) = (C); (C) = (B); (B) = (B) + leftrotate((A) + (F) + K##I + (W)[(G)] , R##I); (A) = (TEMP);


#define FF(A,B,C,D,F,TEMP,W,I) (F) = (D) ^ ((B) & ((C) ^ (D))); (TEMP) = (D); (D) = (C); (C) = (B); (B) = (B) + leftrotate((A) + (F) + K##I, R##I); (A) = (TEMP);

#define GG(A,B,C,D,F,TEMP,W,I) (F) = (C) ^ ((D) & ((B) ^ (C))); (TEMP) = (D); (D) = (C); (C) = (B); (B) = (B) + leftrotate((A) + (F) + K##I, R##I); (A) = (TEMP);

#define HH(A,B,C,D,F,TEMP,W,I) (F) = (B) ^ (C) ^ (D); (TEMP) = (D); (D) = (C); (C) = (B); (B) = (B) + leftrotate((A) + (F) + K##I, R##I); (A) = (TEMP);

#define II(A,B,C,D,F,TEMP,W,I) (F) = (C) ^ ((B) | ~(D)); (TEMP) = (D); (D) = (C); (C) = (B); (B) = (B) + leftrotate((A) + (F) + K##I, R##I); (A) = (TEMP);


//Initialize variables:

#define H0 0x67452301

#define H1 0xEFCDAB89

#define H2 0x98BADCFE

#define H3 0x10325476


//k[i] := floor(abs(sin(i + 1)) × (2 pow 32))

#define K0 0xd76aa478

#define K1 0xe8c7b756

#define K2 0x242070db

#define K3 0xc1bdceee

#define K4 0xf57c0faf

#define K5 0x4787c62a

#define K6 0xa8304613

#define K7 0xfd469501

#define K8 0x698098d8

#define K9 0x8b44f7af

#define K10 0xffff5bb1

#define K11 0x895cd7be

#define K12 0x6b901122

#define K13 0xfd987193

#define K14 0xa679438e

#define K15 0x49b40821

#define K16 0xf61e2562

#define K17 0xc040b340

#define K18 0x265e5a51

#define K19 0xe9b6c7aa

#define K20 0xd62f105d

#define K21 0x02441453

#define K22 0xd8a1e681

#define K23 0xe7d3fbc8

#define K24 0x21e1cde6

#define K25 0xc33707d6

#define K26 0xf4d50d87

#define K27 0x455a14ed

#define K28 0xa9e3e905

#define K29 0xfcefa3f8

#define K30 0x676f02d9

#define K31 0x8d2a4c8a

#define K32 0xfffa3942

#define K33 0x8771f681

#define K34 0x6d9d6122

#define K35 0xfde5380c

#define K36 0xa4beea44

#define K37 0x4bdecfa9

#define K38 0xf6bb4b60

#define K39 0xbebfbc70

#define K40 0x289b7ec6

#define K41 0xeaa127fa

#define K42 0xd4ef3085

#define K43 0x04881d05

#define K44 0xd9d4d039

#define K45 0xe6db99e5

#define K46 0x1fa27cf8

#define K47 0xc4ac5665

#define K48 0xf4292244

#define K49 0x432aff97

#define K50 0xab9423a7

#define K51 0xfc93a039

#define K52 0x655b59c3

#define K53 0x8f0ccc92

#define K54 0xffeff47d

#define K55 0x85845dd1

#define K56 0x6fa87e4f

#define K57 0xfe2ce6e0

#define K58 0xa3014314

#define K59 0x4e0811a1

#define K60 0xf7537e82

#define K61 0xbd3af235

#define K62 0x2ad7d2bb

#define K63 0xeb86d391


//R specifies the per-round shift amounts

#define R0 7

#define R1 12

#define R2 17

#define R3 22

#define R4 7

#define R5 12

#define R6 17

#define R7 22

#define R8 7

#define R9 12

#define R10 17

#define R11 22

#define R12 7

#define R13 12

#define R14 17

#define R15 22

#define R16 5

#define R17 9

#define R18 14

#define R19 20

#define R20 5

#define R21 9

#define R22 14

#define R23 20

#define R24 5

#define R25 9

#define R26 14

#define R27 20

#define R28 5

#define R29 9

#define R30 14

#define R31 20

#define R32 4

#define R33 11

#define R34 16

#define R35 23

#define R36 4

#define R37 11

#define R38 16

#define R39 23

#define R40 4

#define R41 11

#define R42 16

#define R43 23

#define R44 4

#define R45 11

#define R46 16

#define R47 23

#define R48 6

#define R49 10

#define R50 15

#define R51 21

#define R52 6

#define R53 10

#define R54 15

#define R55 21

#define R56 6

#define R57 10

#define R58 15

#define R59 21

#define R60 6

#define R61 10

#define R62 15

#define R63 21


//main modular integer

#define G0 0

#define G1 1

#define G2 2

#define G3 3

#define G4 4

#define G5 5

#define G6 6

#define G7 7

#define G8 8

#define G9 9

#define G10 10

#define G11 11

#define G12 12

#define G13 13

#define G14 14

#define G15 15

#define G16 1

#define G17 6

#define G18 11

#define G19 0

#define G20 5

#define G21 10

#define G22 15 

#define G23 4

#define G24 9

#define G25 14

#define G26 3

#define G27 8

#define G28 13

#define G29 2

#define G30 7

#define G31 12

#define G32 5

#define G33 8

#define G34 11

#define G35 14

#define G36 1

#define G37 4

#define G38 7

#define G39 10

#define G40 13

#define G41 0

#define G42 3

#define G43 6

#define G44 9

#define G45 12

#define G46 15

#define G47 2

#define G48 0

#define G49 7

#define G50 14

#define G51 5

#define G52 12

#define G53 3

#define G54 10

#define G55 1

#define G56 8

#define G57 15

#define G58 6

#define G59 13

#define G60 4

#define G61 11

#define G62 2

#define G63 9





int main() {




unsigned int i, f, temp, msglen, w[5] = {0};

char *msg = (char*)w;

unsigned int h[4], a[4];


msg[0] = 'a';



msglen = 1;


msg[msglen] = 0x80;

msg[16] = msglen * 8;


a[0]= h[0] =H0;

a[1]= h[1] =H1;

a[2]= h[2] =H2;

a[3]= h[3] =H3;




//round1 0 ~ 15

F(a[0],a[1],a[2],a[3],f,temp,w,0,G0);

F(a[0],a[1],a[2],a[3],f,temp,w,1,G1);

F(a[0],a[1],a[2],a[3],f,temp,w,2,G2);

F(a[0],a[1],a[2],a[3],f,temp,w,3,G3);

FF(a[0],a[1],a[2],a[3],f,temp,w,4);

FF(a[0],a[1],a[2],a[3],f,temp,w,5);

FF(a[0],a[1],a[2],a[3],f,temp,w,6);

FF(a[0],a[1],a[2],a[3],f,temp,w,7);

FF(a[0],a[1],a[2],a[3],f,temp,w,8);

FF(a[0],a[1],a[2],a[3],f,temp,w,9);

FF(a[0],a[1],a[2],a[3],f,temp,w,10);

FF(a[0],a[1],a[2],a[3],f,temp,w,11);

FF(a[0],a[1],a[2],a[3],f,temp,w,12);

FF(a[0],a[1],a[2],a[3],f,temp,w,13);

F(a[0],a[1],a[2],a[3],f,temp,w,14,4);// **

FF(a[0],a[1],a[2],a[3],f,temp,w,15);


//round2 16 ~ 31

G(a[0],a[1],a[2],a[3],f,temp,w,16,G1); // 1

GG(a[0],a[1],a[2],a[3],f,temp,w,17);

GG(a[0],a[1],a[2],a[3],f,temp,w,18);

G(a[0],a[1],a[2],a[3],f,temp,w,19,G0); // 0

GG(a[0],a[1],a[2],a[3],f,temp,w,20);

GG(a[0],a[1],a[2],a[3],f,temp,w,21);

GG(a[0],a[1],a[2],a[3],f,temp,w,22);

GG(a[0],a[1],a[2],a[3],f,temp,w,23);

GG(a[0],a[1],a[2],a[3],f,temp,w,24);

G(a[0],a[1],a[2],a[3],f,temp,w,25,4); // **

G(a[0],a[1],a[2],a[3],f,temp,w,26,G3); // 3

GG(a[0],a[1],a[2],a[3],f,temp,w,27);

GG(a[0],a[1],a[2],a[3],f,temp,w,28);

G(a[0],a[1],a[2],a[3],f,temp,w,29,G2); //2

GG(a[0],a[1],a[2],a[3],f,temp,w,30);

GG(a[0],a[1],a[2],a[3],f,temp,w,31);


//round3 32 ~ 47

HH(a[0],a[1],a[2],a[3],f,temp,w,32);

HH(a[0],a[1],a[2],a[3],f,temp,w,33);

HH(a[0],a[1],a[2],a[3],f,temp,w,34);

H(a[0],a[1],a[2],a[3],f,temp,w,35,4);

H(a[0],a[1],a[2],a[3],f,temp,w,36,G1); // 1

HH(a[0],a[1],a[2],a[3],f,temp,w,37);

HH(a[0],a[1],a[2],a[3],f,temp,w,38);

HH(a[0],a[1],a[2],a[3],f,temp,w,39);

HH(a[0],a[1],a[2],a[3],f,temp,w,40);

H(a[0],a[1],a[2],a[3],f,temp,w,41,G0); // 0

H(a[0],a[1],a[2],a[3],f,temp,w,42,G3); // 3

HH(a[0],a[1],a[2],a[3],f,temp,w,43);

HH(a[0],a[1],a[2],a[3],f,temp,w,44);

HH(a[0],a[1],a[2],a[3],f,temp,w,45);

HH(a[0],a[1],a[2],a[3],f,temp,w,46);

H(a[0],a[1],a[2],a[3],f,temp,w,47,G2); // 2


//round4 48 ~ 63

I(a[0],a[1],a[2],a[3],f,temp,w,48,G0); // 0

II(a[0],a[1],a[2],a[3],f,temp,w,49);

I(a[0],a[1],a[2],a[3],f,temp,w,50,4); // **

II(a[0],a[1],a[2],a[3],f,temp,w,51);

II(a[0],a[1],a[2],a[3],f,temp,w,52);

I(a[0],a[1],a[2],a[3],f,temp,w,53,G3); // 3

II(a[0],a[1],a[2],a[3],f,temp,w,54);

I(a[0],a[1],a[2],a[3],f,temp,w,55,G1); //1

II(a[0],a[1],a[2],a[3],f,temp,w,56);

II(a[0],a[1],a[2],a[3],f,temp,w,57);

II(a[0],a[1],a[2],a[3],f,temp,w,58);

II(a[0],a[1],a[2],a[3],f,temp,w,59);

II(a[0],a[1],a[2],a[3],f,temp,w,60);

II(a[0],a[1],a[2],a[3],f,temp,w,61);

I(a[0],a[1],a[2],a[3],f,temp,w,62,G2); // 2

II(a[0],a[1],a[2],a[3],f,temp,w,63);


h[0] += a[0];

h[1] += a[1];

h[2] += a[2];

h[3] += a[3];


printf("%s\n", msg);

printf("%x " ,h[0]);

printf("%x " ,h[1]);

printf("%x " ,h[2]);

printf("%x " ,h[3]);


}


전처리의 향연