Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local bit32={
- band=function(a,b)
- local c,pow=0,1;
- while a>0 or b>0 do
- local bita,bitb=a%2,b%2;
- c,a,b,pow=c+bita*bitb*pow,(a-bita)*0.5,(b-bitb)*0.5,pow*2;
- end;
- return c;
- end;
- bnot=function(num)
- return 4294967295-num;
- end;
- bor=function(a,b)
- a,b=4294967295-a,4294967295-b;
- local c,pow=0,1;
- while a>0 or b>0 do
- local bita,bitb=a%2,b%2;
- c,a,b,pow=c+bita*bitb*pow,(a-bita)*0.5,(b-bitb)*0.5,pow*2;
- end;
- return 4294967295-c;
- end;
- bxor=function(a,b)
- local c,pow=0,1;
- while a>0 or b>0 do
- local bita,bitb=a%2,b%2;
- c,a,b,pow=c+(bita+bitb)%2*pow,(a-bita)*0.5,(b-bitb)*0.5,pow*2;
- end;
- return c;
- end;
- lshift=function(num,offset)
- return(num*2^offset)%4294967296;
- end;
- rshift=function(num,offset)
- local result=num*0.5^offset;
- return result-result%1;
- end;
- lrotate=function(num,offset)
- local high=(num*2^offset)%4294967296;
- local low=num*0.5^(32-offset);
- return high+low-low%1;
- end;
- rrotate=function(num,offset)
- local low=num*0.5^offset;
- local high=(num*2^(32-offset))%4294967296;
- return low-low%1+high;
- end;
- };
- local band,rrotate,bxor,rshift,bnot=bit32.band,bit32.rrotate,bit32.bxor,bit32.rshift,bit32.bnot;
- local string,setmetatable,table=string,setmetatable,table;
- local k={
- 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;
- };
- local function int32tostring(num)
- local b0,b1,b2=num%256,num%65536,num%16777216;
- return string.char((num-b2)/16777216,(b2-b1)/65536,(b1-b0)/256,b0);
- end;
- local function int64tostring(num)
- local b0,b1,b2,b3,b4,b5,b6=
- num%256,num%65536,num%16777216,num%4294967296,
- num%1099511627776,num%281474976710656,num%72057594037927936;
- return string.char(
- (num-b6)/72057594037927936,(b6-b5)/281474976710656,
- (b5-b4)/1099511627776,(b4-b3)/4294967296,
- (b3-b2)/16777216,(b2-b1)/65536,(b1-b0)/256,b0);
- end;
- local function toint32(str,i)
- local num=0;
- for i=i,i+3 do
- num=num*256+string.byte(str,i);
- end;
- return num;
- end;
- local function preproc(message,len)
- local extra=64-((len+1+8)%64);
- len=int64tostring(8*len);
- message=message.."\128"..string.rep("\0",extra)..len;
- return message;
- end;
- local function initH256(H)
- H[1]=0x6a09e667;
- H[2]=0xbb67ae85;
- H[3]=0x3c6ef372;
- H[4]=0xa54ff53a;
- H[5]=0x510e527f;
- H[6]=0x9b05688c;
- H[7]=0x1f83d9ab;
- H[8]=0x5be0cd19;
- end;
- local function digestblock(message,i,H)
- local w={};
- for j=1,16 do
- w[j]=toint32(message,i+(j-1)*4);
- end;
- for j=17,64 do
- local v=w[j-15]%4294967296;
- local s0=bxor(bxor(rrotate(v,7),rrotate(v,18)),rshift(v,3));
- v=w[j-2]%4294967296;
- local s1=bxor(bxor(rrotate(v,17),rrotate(v,19)),rshift(v,10));
- w[j]=w[j-16]+s0+w[j-7]+s1;
- end;
- local a,b,c,d,e,f,g,h=H[1],H[2],H[3],H[4],H[5],H[6],H[7],H[8];
- for i=1,64 do
- local s0=bxor(bxor(rrotate(a,2),rrotate(a,13)),rrotate(a,22));
- local maj=bxor(bxor(band(a,b),band(a,c)),band(b,c));
- local t2=s0+maj;
- local s1=bxor(bxor(rrotate(e,6),rrotate(e,11)),rrotate(e,25));
- local ch=bxor(band(e,f),band(bnot(e),g));
- local t1=h+s1+ch+k[i]+w[i];
- h=g;
- g=f;
- f=e;
- e=(d+t1)%4294967296;
- d=c;
- c=b;
- b=a;
- a=(t1+t2)%4294967296;
- end;
- H[1]=(H[1]+a)%4294967296;
- H[2]=(H[2]+b)%4294967296;
- H[3]=(H[3]+c)%4294967296;
- H[4]=(H[4]+d)%4294967296;
- H[5]=(H[5]+e)%4294967296;
- H[6]=(H[6]+f)%4294967296;
- H[7]=(H[7]+g)%4294967296;
- H[8]=(H[8]+h)%4294967296;
- end;
- return{
- hash=function(message)
- message=preproc(message,#message);
- local state={};
- initH256(state);
- for i=1,#message,64 do
- digestblock(message,i,state);
- end;
- return string.format("%08x%08x%08x%08x%08x%08x%08x%08x",unpack(state));
- end;
- };
Advertisement
Add Comment
Please, Sign In to add comment