001 #include "U8Set.HC";
002 class CSHA256_State {
003   U32 H[16];
004   I32 N;
005   U32 *M;
006 };
007 U32 ROTR(U64 x,U64 n) {
008   return ((x>>n)|(x<<(32-n)))&U32_MAX;
009 }
010 U32 _CH(U64 x,U64 y,U64 z) {
011   return (x&y)^(~x&z);
012 }
013 U32 MAJ(U64 x,U64 y,U64 z) {
014   return (x&y)^(x&z)^(y&z);
015 }
016 U32 BSIG0(U64 x) {
017   return ROTR(x,2)^ROTR(x,13)^ROTR(x,22);
018 }
019 U32 BSIG1(U64 x) {
020   return ROTR(x,6)^ROTR(x,11)^ROTR(x,25);
021 }
022 U32 SSIG0(U64 x) {
023   return ROTR(x,7)^ROTR(x,18)^(x>>3);
024 }
025 U32 SSIG1(U64 x) {
026   return ROTR(x,17)^ROTR(x,19)^(x>>10);
027 }
028 U32 K[64]={
029   0x428a2f98,
030         0x71374491,
031         0xb5c0fbcf,
032         0xe9b5dba5,
033         0x3956c25b,
034         0x59f111f1,
035         0x923f82a4,
036         0xab1c5ed5,
037         0xd807aa98,
038         0x12835b01,
039         0x243185be,
040         0x550c7dc3,
041         0x72be5d74,
042         0x80deb1fe,
043         0x9bdc06a7,
044         0xc19bf174,
045         0xe49b69c1,
046         0xefbe4786,
047         0x0fc19dc6,
048         0x240ca1cc,
049         0x2de92c6f,
050         0x4a7484aa,
051         0x5cb0a9dc,
052         0x76f988da,
053         0x983e5152,
054         0xa831c66d,
055         0xb00327c8,
056         0xbf597fc7,
057         0xc6e00bf3,
058         0xd5a79147,
059         0x06ca6351,
060         0x14292967,
061         0x27b70a85,
062         0x2e1b2138,
063         0x4d2c6dfc,
064         0x53380d13,
065         0x650a7354,
066         0x766a0abb,
067         0x81c2c92e,
068         0x92722c85,
069         0xa2bfe8a1,
070         0xa81a664b,
071         0xc24b8b70,
072         0xc76c51a3,
073         0xd192e819,
074         0xd6990624,
075         0xf40e3585,
076         0x106aa070,
077         0x19a4c116,
078         0x1e376c08,
079         0x2748774c,
080         0x34b0bcb5,
081         0x391c0cb3,
082         0x4ed8aa4a,
083         0x5b9cca4f,
084         0x682e6ff3,
085         0x748f82ee,
086         0x78a5636f,
087         0x84c87814,
088         0x8cc70208,
089         0x90befffa,
090         0xa4506ceb,
091         0xbef9a3f7,
092         0xc67178f2
093 };
094 U0 DoSHA256(CSHA256_State *st) {
095   U32 W[64];
096   I64 t,poo;
097   U32 a,b,c,d,e,f,g,h,T1,T2;
098   for(t=0;t!=16;t++) {
099     W[t]=EndianU32(st->M[t]);
100   } 
101   for(t=16;t!=64;t++) {
102     W[t]=SSIG1(W[t-2])+W[t-7]+SSIG0(W[t-15])+W[t-16];
103   }
104   a=st->H[0];
105   b=st->H[1];
106   c=st->H[2];
107   d=st->H[3];
108   e=st->H[4];
109   f=st->H[5];
110   g=st->H[6];
111   h=st->H[7];
112 
113   for(t=0;t!=64;t++) {
114     T1=h+BSIG1(e)+_CH(e,f,g)+K[t]+W[t];
115     T2=BSIG0(a)+MAJ(a,b,c);
116     h=g;
117     g=f;
118     f=e;
119     e=d+T1;
120     d=c;
121     c=b;
122     b=a;
123     a=T1+T2;
124 "W%d\n",t;
125 "a,%x\n",a;
126     for(poo=31;poo>=0;--poo)
127       "%d",Bt(&a,poo);
128     "\n";
129 "b,%x\n",b;
130     for(poo=31;poo>=0;--poo)
131       "%d",Bt(&b,poo);
132     "\n";
133 "c,%x\n",c;
134     for(poo=31;poo>=0;--poo)
135       "%d",Bt(&c,poo);
136     "\n";
137 "e,%x\n",e;
138     for(poo=31;poo>=0;--poo)
139       "%d",Bt(&e,poo);
140     "\n";
141 "f,%x\n",f;
142     for(poo=31;poo>=0;--poo)
143       "%d",Bt(&f,poo);
144     "\n";
145   }
146 
147   st->H[0]+=a;
148   st->H[1]+=b;
149   st->H[2]+=c;
150   st->H[3]+=d;
151   st->H[4]+=e;
152   st->H[5]+=f;
153   st->H[6]+=g;
154   st->H[7]+=h;
155 }
156 CU8Set *Pad(U8 *data,I64 len) {
157   I64 ammend=EndianI64(len*8);
158   CU8Set *set=U8SetNew;
159   U8SetAddBytes(set,data,len);
160   U8SetAdd(set,0x80);
161   while(set->cnt%64!=56)
162     U8SetAdd(set,0);
163   U8SetAddBytes(set,&ammend,8);
164   return set;
165 }
166 U32 *SHA256(U32 *out,U8 *data,I64 len) {
167   CU8Set *set=Pad(data,len);
168   CSHA256_State st;
169   st.N=set->cnt/64;
170   st.M=set->body;
171   st.H[0]=0x6a09e667;
172   st.H[1]=0xbb67ae85;
173   st.H[2]=0x3c6ef372;
174   st.H[3]=0xa54ff53a;
175   st.H[4]=0x510e527f;
176   st.H[5]=0x9b05688c;
177   st.H[6]=0x1f83d9ab;
178   st.H[7]=0x5be0cd19;
179   while(--st.N>=0) {
180     DoSHA256(&st);
181     st.M+=16;
182   }
183   U8SetDel(set);
184   MemCpy(out,st.H,8*4);
185   I64 p;
186   for(p=0;p!=8;p++)
187    "%02X",out[p];
188   "\n";
189   return out;
190 }
191 U8 *str="severing lusts leaveth upbraid wipe instinctive fruitful hearing stolen wondrous anonymous sensitive apprehended ";
192 SHA256(CAlloc(64),str,StrLen(str));