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));