local function J(J,F,P,T)local Z,k=common_W,sha2_K_hi local q,H,V,z,g,n,E,p=J[1],J[2],J[3],J[4],J[5],J[6],J[7],J[8]for J=P,(P+T)-1,64 do for P=1,16,1 do J=J+4 local T,k,q,H=string.byte(F,J-3,J)Z[P]=((T*256+k)*256+q)*256+H end for J=17,64,1 do local F,P=Z[J-15],Z[J-2]Z[J]=((bit32_bxor(bit32_rrotate(F,7),bit32_lrotate(F,14),bit32_rshift(F,3))+bit32_bxor(bit32_lrotate(P,15),bit32_lrotate(P,13),bit32_rshift(P,10)))+Z[J-7])+Z[J-16]end local P,T,U,v,h,D,s,u=q,H,V,z,g,n,E,p for J=1,64,1 do local F=((((bit32_bxor(bit32_rrotate(h,6),bit32_rrotate(h,11),bit32_lrotate(h,7))+bit32_band(h,D))+bit32_band(-1-h,s))+u)+k[J])+Z[J]u=s s=D D=h h=F+v v=U U=T T=P P=((F+bit32_band(v,U))+bit32_band(P,bit32_bxor(v,U)))+bit32_bxor(bit32_rrotate(P,2),bit32_rrotate(P,13),bit32_lrotate(P,10))end q,H,V,z=(P+q)%4294967296,(T+H)%4294967296,(U+V)%4294967296,(v+z)%4294967296 g,n,E,p=(h+g)%4294967296,(D+n)%4294967296,(s+E)%4294967296,(u+p)%4294967296 end J[1],J[2],J[3],J[4],J[5],J[6],J[7],J[8]=q,H,V,z,g,n,E,p end local function F(J,F,P,T,Z)local k,q,H=common_W,sha2_K_lo,sha2_K_hi local V,z,g,n,E,p,U,v=J[1],J[2],J[3],J[4],J[5],J[6],J[7],J[8]local h,D,s,u,c,w,j,G=F[1],F[2],F[3],F[4],F[5],F[6],F[7],F[8]for J=T,(T+Z)-1,128 do for F=1,32,1 do J=J+4 local T,Z,q,H=string.byte(P,J-3,J)k[F]=((T*256+Z)*256+q)*256+H end for J=34,160,2 do local F,P,T,Z=k[J-30],k[J-31],k[J-4],k[J-5]local q=((bit32_bxor(bit32_rshift(F,1)+bit32_lshift(P,31),bit32_rshift(F,8)+bit32_lshift(P,24),bit32_rshift(F,7)+bit32_lshift(P,25))%4294967296+bit32_bxor(bit32_rshift(T,19)+bit32_lshift(Z,13),bit32_lshift(T,3)+bit32_rshift(Z,29),bit32_rshift(T,6)+bit32_lshift(Z,26))%4294967296)+k[J-14])+k[J-32]local H=q%4294967296 k[J-1]=(((bit32_bxor(bit32_rshift(P,1)+bit32_lshift(F,31),bit32_rshift(P,8)+bit32_lshift(F,24),bit32_rshift(P,7))+bit32_bxor(bit32_rshift(Z,19)+bit32_lshift(T,13),bit32_lshift(Z,3)+bit32_rshift(T,29),bit32_rshift(Z,6)))+k[J-15])+k[J-33])+(q-H)/4294967296 k[J]=H end local F,T,Z,S,M,b,R,d=V,z,g,n,E,p,U,v local i,t,Y,N,y,W,l,O=h,D,s,u,c,w,j,G for J=1,80,1 do local P=2*J local V=(((bit32_bxor(bit32_rshift(M,14)+bit32_lshift(y,18),bit32_rshift(M,18)+bit32_lshift(y,14),bit32_lshift(M,23)+bit32_rshift(y,9))%4294967296+(bit32_band(M,b)+bit32_band(-1-M,R))%4294967296)+d)+q[J])+k[P]local z=V%4294967296 local g=(((((bit32_bxor(bit32_rshift(y,14)+bit32_lshift(M,18),bit32_rshift(y,18)+bit32_lshift(M,14),bit32_lshift(y,23)+bit32_rshift(M,9))+bit32_band(y,W))+bit32_band(-1-y,l))+O)+H[J])+k[P-1])+(V-z)/4294967296 d=R O=l R=b l=W b=M W=y V=z+S M=V%4294967296 y=(g+N)+(V-M)/4294967296 S=Z N=Y Z=T Y=t T=F t=i V=(z+(bit32_band(S,Z)+bit32_band(T,bit32_bxor(S,Z)))%4294967296)+bit32_bxor(bit32_rshift(T,28)+bit32_lshift(t,4),bit32_lshift(T,30)+bit32_rshift(t,2),bit32_lshift(T,25)+bit32_rshift(t,7))%4294967296 F=V%4294967296 i=((g+(bit32_band(N,Y)+bit32_band(t,bit32_bxor(N,Y))))+bit32_bxor(bit32_rshift(t,28)+bit32_lshift(T,4),bit32_lshift(t,30)+bit32_rshift(T,2),bit32_lshift(t,25)+bit32_rshift(T,7)))+(V-F)/4294967296 end F=V+F V=F%4294967296 h=((h+i)+(F-V)/4294967296)%4294967296 F=z+T z=F%4294967296 D=((D+t)+(F-z)/4294967296)%4294967296 F=g+Z g=F%4294967296 s=((s+Y)+(F-g)/4294967296)%4294967296 F=n+S n=F%4294967296 u=((u+N)+(F-n)/4294967296)%4294967296 F=E+M E=F%4294967296 c=((c+y)+(F-E)/4294967296)%4294967296 F=p+b p=F%4294967296 w=((w+W)+(F-p)/4294967296)%4294967296 F=U+R U=F%4294967296 j=((j+l)+(F-U)/4294967296)%4294967296 F=v+d v=F%4294967296 G=((G+O)+(F-v)/4294967296)%4294967296 end J[1],J[2],J[3],J[4],J[5],J[6],J[7],J[8]=V,z,g,n,E,p,U,v F[1],F[2],F[3],F[4],F[5],F[6],F[7],F[8]=h,D,s,u,c,w,j,G end local function P(J,F,P,T)local Z,k,q=common_W,md5_K,md5_next_shift local H,V,z,g=J[1],J[2],J[3],J[4]for J=P,(P+T)-1,64 do for P=1,16,1 do J=J+4 local T,k,q,H=string.byte(F,J-3,J)Z[P]=((H*256+q)*256+k)*256+T end local P,T,n,E=H,V,z,g local p=25 for J=1,16,1 do local F=bit32_rrotate((((bit32_band(T,n)+bit32_band(-1-T,E))+P)+k[J])+Z[J],p)+T p=q[p]P=E E=n n=T T=F end p=27 for J=17,32,1 do local F=bit32_rrotate((((bit32_band(E,T)+bit32_band(-1-E,n))+P)+k[J])+Z[(5*J-4)%16+1],p)+T p=q[p]P=E E=n n=T T=F end p=28 for J=33,48,1 do local F=bit32_rrotate(((bit32_bxor(bit32_bxor(T,n),E)+P)+k[J])+Z[(3*J+2)%16+1],p)+T p=q[p]P=E E=n n=T T=F end p=26 for J=49,64,1 do local F=bit32_rrotate(((bit32_bxor(n,bit32_bor(T,-1-E))+P)+k[J])+Z[(J*7-7)%16+1],p)+T p=q[p]P=E E=n n=T T=F end H=(P+H)%4294967296 V=(T+V)%4294967296 z=(n+z)%4294967296 g=(E+g)%4294967296 end J[1],J[2],J[3],J[4]=H,V,z,g end local function T(J,F,P,T)local Z=common_W local k,q,H,V,z=J[1],J[2],J[3],J[4],J[5]for J=P,(P+T)-1,64 do for P=1,16,1 do J=J+4 local T,k,q,H=string.byte(F,J-3,J)Z[P]=((T*256+k)*256+q)*256+H end for J=17,80,1 do Z[J]=bit32_lrotate(bit32_bxor(Z[J-3],Z[J-8],Z[J-14],Z[J-16]),1)end local P,T,g,n,E=k,q,H,V,z for J=1,20,1 do local F=((((bit32_lrotate(P,5)+bit32_band(T,g))+bit32_band(-1-T,n))+1518500249)+Z[J])+E E=n n=g g=bit32_rrotate(T,2)T=P P=F end for J=21,40,1 do local F=(((bit32_lrotate(P,5)+bit32_bxor(T,g,n))+1859775393)+Z[J])+E E=n n=g g=bit32_rrotate(T,2)T=P P=F end for J=41,60,1 do local F=((((bit32_lrotate(P,5)+bit32_band(n,g))+bit32_band(T,bit32_bxor(n,g)))+2400959708)+Z[J])+E E=n n=g g=bit32_rrotate(T,2)T=P P=F end for J=61,80,1 do local F=(((bit32_lrotate(P,5)+bit32_bxor(T,g,n))+3395469782)+Z[J])+E E=n n=g g=bit32_rrotate(T,2)T=P P=F end k=(P+k)%4294967296 q=(T+q)%4294967296 H=(g+H)%4294967296 V=(n+V)%4294967296 z=(E+z)%4294967296 end J[1],J[2],J[3],J[4],J[5]=k,q,H,V,z end local function Z(J,F,P,T,Z,k)local q,H=sha3_RC_lo,sha3_RC_hi local V=k/8 for T=T,(T+Z)-1,k do for Z=1,V,1 do local k,q,H,V=string.byte(P,T+1,T+4)J[Z]=bit32_bxor(J[Z],((V*256+H)*256+q)*256+k)T=T+8 k,q,H,V=string.byte(P,T-3,T)F[Z]=bit32_bxor(F[Z],((V*256+H)*256+q)*256+k)end local Z,k,z,g,n,E,p,U,v,h,D,s,u,c,w,j,G,S,M,b,R,d,i,t,Y,N,y,W,l,O,e,Q,x,a,K,A,X,m,I,C,o,r,B,L,f,J8,F8,P8,T8,Z8=J[1],F[1],J[2],F[2],J[3],F[3],J[4],F[4],J[5],F[5],J[6],F[6],J[7],F[7],J[8],F[8],J[9],F[9],J[10],F[10],J[11],F[11],J[12],F[12],J[13],F[13],J[14],F[14],J[15],F[15],J[16],F[16],J[17],F[17],J[18],F[18],J[19],F[19],J[20],F[20],J[21],F[21],J[22],F[22],J[23],F[23],J[24],F[24],J[25],F[25]for J=1,24,1 do local F=bit32_bxor(Z,D,R,e,o)local P=bit32_bxor(k,s,d,Q,r)local T=bit32_bxor(z,u,i,x,B)local V=bit32_bxor(g,c,t,a,L)local k8=bit32_bxor(n,w,Y,K,f)local q8=bit32_bxor(E,j,N,A,J8)local H8=bit32_bxor(p,G,y,X,F8)local V8=bit32_bxor(U,S,W,m,P8)local z8=bit32_bxor(v,M,l,I,T8)local g8=bit32_bxor(h,b,O,C,Z8)local n8=bit32_bxor(F,k8*2+(q8%TWO_POW_32-q8%TWO_POW_31)/TWO_POW_31)local E8=bit32_bxor(P,q8*2+(k8%TWO_POW_32-k8%TWO_POW_31)/TWO_POW_31)local p8=bit32_bxor(n8,z)local U8=bit32_bxor(E8,g)local v8=bit32_bxor(n8,u)local h8=bit32_bxor(E8,c)local D8=bit32_bxor(n8,i)local s8=bit32_bxor(E8,t)local u8=bit32_bxor(n8,x)local c8=bit32_bxor(E8,a)local w8=bit32_bxor(n8,B)local j8=bit32_bxor(E8,L)z=(v8%TWO_POW_32-v8%TWO_POW_20)/TWO_POW_20+h8*TWO_POW_12 g=(h8%TWO_POW_32-h8%TWO_POW_20)/TWO_POW_20+v8*TWO_POW_12 u=(u8%TWO_POW_32-u8%TWO_POW_19)/TWO_POW_19+c8*TWO_POW_13 c=(c8%TWO_POW_32-c8%TWO_POW_19)/TWO_POW_19+u8*TWO_POW_13 i=p8*2+(U8%TWO_POW_32-U8%TWO_POW_31)/TWO_POW_31 t=U8*2+(p8%TWO_POW_32-p8%TWO_POW_31)/TWO_POW_31 x=D8*TWO_POW_10+(s8%TWO_POW_32-s8%TWO_POW_22)/TWO_POW_22 a=s8*TWO_POW_10+(D8%TWO_POW_32-D8%TWO_POW_22)/TWO_POW_22 B=w8*TWO_POW_2+(j8%TWO_POW_32-j8%TWO_POW_30)/TWO_POW_30 L=j8*TWO_POW_2+(w8%TWO_POW_32-w8%TWO_POW_30)/TWO_POW_30 n8=bit32_bxor(T,H8*2+(V8%TWO_POW_32-V8%TWO_POW_31)/TWO_POW_31)E8=bit32_bxor(V,V8*2+(H8%TWO_POW_32-H8%TWO_POW_31)/TWO_POW_31)p8=bit32_bxor(n8,n)U8=bit32_bxor(E8,E)v8=bit32_bxor(n8,w)h8=bit32_bxor(E8,j)D8=bit32_bxor(n8,Y)s8=bit32_bxor(E8,N)u8=bit32_bxor(n8,K)c8=bit32_bxor(E8,A)w8=bit32_bxor(n8,f)j8=bit32_bxor(E8,J8)n=(D8%TWO_POW_32-D8%TWO_POW_21)/TWO_POW_21+s8*TWO_POW_11 E=(s8%TWO_POW_32-s8%TWO_POW_21)/TWO_POW_21+D8*TWO_POW_11 w=(w8%TWO_POW_32-w8%TWO_POW_3)/TWO_POW_3+(j8*TWO_POW_29)%TWO_POW_32 j=(j8%TWO_POW_32-j8%TWO_POW_3)/TWO_POW_3+(w8*TWO_POW_29)%TWO_POW_32 Y=v8*TWO_POW_6+(h8%TWO_POW_32-h8%TWO_POW_26)/TWO_POW_26 N=h8*TWO_POW_6+(v8%TWO_POW_32-v8%TWO_POW_26)/TWO_POW_26 K=u8*TWO_POW_15+(c8%TWO_POW_32-c8%TWO_POW_17)/TWO_POW_17 A=c8*TWO_POW_15+(u8%TWO_POW_32-u8%TWO_POW_17)/TWO_POW_17 f=(p8%TWO_POW_32-p8%TWO_POW_2)/TWO_POW_2+(U8*TWO_POW_30)%TWO_POW_32 J8=(U8%TWO_POW_32-U8%TWO_POW_2)/TWO_POW_2+(p8*TWO_POW_30)%TWO_POW_32 n8=bit32_bxor(k8,z8*2+(g8%TWO_POW_32-g8%TWO_POW_31)/TWO_POW_31)E8=bit32_bxor(q8,g8*2+(z8%TWO_POW_32-z8%TWO_POW_31)/TWO_POW_31)p8=bit32_bxor(n8,p)U8=bit32_bxor(E8,U)v8=bit32_bxor(n8,G)h8=bit32_bxor(E8,S)D8=bit32_bxor(n8,y)s8=bit32_bxor(E8,W)u8=bit32_bxor(n8,X)c8=bit32_bxor(E8,m)w8=bit32_bxor(n8,F8)j8=bit32_bxor(E8,P8)p=(u8*TWO_POW_21)%TWO_POW_32+(c8%TWO_POW_32-c8%TWO_POW_11)/TWO_POW_11 U=(c8*TWO_POW_21)%TWO_POW_32+(u8%TWO_POW_32-u8%TWO_POW_11)/TWO_POW_11 G=(p8*TWO_POW_28)%TWO_POW_32+(U8%TWO_POW_32-U8%TWO_POW_4)/TWO_POW_4 S=(U8*TWO_POW_28)%TWO_POW_32+(p8%TWO_POW_32-p8%TWO_POW_4)/TWO_POW_4 y=(D8*TWO_POW_25)%TWO_POW_32+(s8%TWO_POW_32-s8%TWO_POW_7)/TWO_POW_7 W=(s8*TWO_POW_25)%TWO_POW_32+(D8%TWO_POW_32-D8%TWO_POW_7)/TWO_POW_7 X=(w8%TWO_POW_32-w8%TWO_POW_8)/TWO_POW_8+(j8*TWO_POW_24)%TWO_POW_32 m=(j8%TWO_POW_32-j8%TWO_POW_8)/TWO_POW_8+(w8*TWO_POW_24)%TWO_POW_32 F8=(v8%TWO_POW_32-v8%TWO_POW_9)/TWO_POW_9+(h8*TWO_POW_23)%TWO_POW_32 P8=(h8%TWO_POW_32-h8%TWO_POW_9)/TWO_POW_9+(v8*TWO_POW_23)%TWO_POW_32 n8=bit32_bxor(H8,F*2+(P%TWO_POW_32-P%TWO_POW_31)/TWO_POW_31)E8=bit32_bxor(V8,P*2+(F%TWO_POW_32-F%TWO_POW_31)/TWO_POW_31)p8=bit32_bxor(n8,v)U8=bit32_bxor(E8,h)v8=bit32_bxor(n8,M)h8=bit32_bxor(E8,b)D8=bit32_bxor(n8,l)s8=bit32_bxor(E8,O)u8=bit32_bxor(n8,I)c8=bit32_bxor(E8,C)w8=bit32_bxor(n8,T8)j8=bit32_bxor(E8,Z8)v=w8*TWO_POW_14+(j8%TWO_POW_32-j8%TWO_POW_18)/TWO_POW_18 h=j8*TWO_POW_14+(w8%TWO_POW_32-w8%TWO_POW_18)/TWO_POW_18 M=(v8*TWO_POW_20)%TWO_POW_32+(h8%TWO_POW_32-h8%TWO_POW_12)/TWO_POW_12 b=(h8*TWO_POW_20)%TWO_POW_32+(v8%TWO_POW_32-v8%TWO_POW_12)/TWO_POW_12 l=u8*TWO_POW_8+(c8%TWO_POW_32-c8%TWO_POW_24)/TWO_POW_24 O=c8*TWO_POW_8+(u8%TWO_POW_32-u8%TWO_POW_24)/TWO_POW_24 I=(p8*TWO_POW_27)%TWO_POW_32+(U8%TWO_POW_32-U8%TWO_POW_5)/TWO_POW_5 C=(U8*TWO_POW_27)%TWO_POW_32+(p8%TWO_POW_32-p8%TWO_POW_5)/TWO_POW_5 T8=(D8%TWO_POW_32-D8%TWO_POW_25)/TWO_POW_25+s8*TWO_POW_7 Z8=(s8%TWO_POW_32-s8%TWO_POW_25)/TWO_POW_25+D8*TWO_POW_7 n8=bit32_bxor(z8,T*2+(V%TWO_POW_32-V%TWO_POW_31)/TWO_POW_31)E8=bit32_bxor(g8,V*2+(T%TWO_POW_32-T%TWO_POW_31)/TWO_POW_31)v8=bit32_bxor(n8,D)h8=bit32_bxor(E8,s)D8=bit32_bxor(n8,R)s8=bit32_bxor(E8,d)u8=bit32_bxor(n8,e)c8=bit32_bxor(E8,Q)w8=bit32_bxor(n8,o)j8=bit32_bxor(E8,r)D=D8*TWO_POW_3+(s8%TWO_POW_32-s8%TWO_POW_29)/TWO_POW_29 s=s8*TWO_POW_3+(D8%TWO_POW_32-D8%TWO_POW_29)/TWO_POW_29 R=w8*TWO_POW_18+(j8%TWO_POW_32-j8%TWO_POW_14)/TWO_POW_14 d=j8*TWO_POW_18+(w8%TWO_POW_32-w8%TWO_POW_14)/TWO_POW_14 e=(v8%TWO_POW_32-v8%TWO_POW_28)/TWO_POW_28+h8*TWO_POW_4 Q=(h8%TWO_POW_32-h8%TWO_POW_28)/TWO_POW_28+v8*TWO_POW_4 o=(u8%TWO_POW_32-u8%TWO_POW_23)/TWO_POW_23+c8*TWO_POW_9 r=(c8%TWO_POW_32-c8%TWO_POW_23)/TWO_POW_23+u8*TWO_POW_9 Z=bit32_bxor(n8,Z)k=bit32_bxor(E8,k)Z,z,n,p,v=bit32_bxor(Z,bit32_band(-1-z,n)),bit32_bxor(z,bit32_band(-1-n,p)),bit32_bxor(n,bit32_band(-1-p,v)),bit32_bxor(p,bit32_band(-1-v,Z)),bit32_bxor(v,bit32_band(-1-Z,z))k,g,E,U,h=bit32_bxor(k,bit32_band(-1-g,E)),bit32_bxor(g,bit32_band(-1-E,U)),bit32_bxor(E,bit32_band(-1-U,h)),bit32_bxor(U,bit32_band(-1-h,k)),bit32_bxor(h,bit32_band(-1-k,g))D,u,w,G,M=bit32_bxor(G,bit32_band(-1-M,D)),bit32_bxor(M,bit32_band(-1-D,u)),bit32_bxor(D,bit32_band(-1-u,w)),bit32_bxor(u,bit32_band(-1-w,G)),bit32_bxor(w,bit32_band(-1-G,M))s,c,j,S,b=bit32_bxor(S,bit32_band(-1-b,s)),bit32_bxor(b,bit32_band(-1-s,c)),bit32_bxor(s,bit32_band(-1-c,j)),bit32_bxor(c,bit32_band(-1-j,S)),bit32_bxor(j,bit32_band(-1-S,b))R,i,Y,y,l=bit32_bxor(i,bit32_band(-1-Y,y)),bit32_bxor(Y,bit32_band(-1-y,l)),bit32_bxor(y,bit32_band(-1-l,R)),bit32_bxor(l,bit32_band(-1-R,i)),bit32_bxor(R,bit32_band(-1-i,Y))d,t,N,W,O=bit32_bxor(t,bit32_band(-1-N,W)),bit32_bxor(N,bit32_band(-1-W,O)),bit32_bxor(W,bit32_band(-1-O,d)),bit32_bxor(O,bit32_band(-1-d,t)),bit32_bxor(d,bit32_band(-1-t,N))e,x,K,X,I=bit32_bxor(I,bit32_band(-1-e,x)),bit32_bxor(e,bit32_band(-1-x,K)),bit32_bxor(x,bit32_band(-1-K,X)),bit32_bxor(K,bit32_band(-1-X,I)),bit32_bxor(X,bit32_band(-1-I,e))Q,a,A,m,C=bit32_bxor(C,bit32_band(-1-Q,a)),bit32_bxor(Q,bit32_band(-1-a,A)),bit32_bxor(a,bit32_band(-1-A,m)),bit32_bxor(A,bit32_band(-1-m,C)),bit32_bxor(m,bit32_band(-1-C,Q))o,B,f,F8,T8=bit32_bxor(f,bit32_band(-1-F8,T8)),bit32_bxor(F8,bit32_band(-1-T8,o)),bit32_bxor(T8,bit32_band(-1-o,B)),bit32_bxor(o,bit32_band(-1-B,f)),bit32_bxor(B,bit32_band(-1-f,F8))r,L,J8,P8,Z8=bit32_bxor(J8,bit32_band(-1-P8,Z8)),bit32_bxor(P8,bit32_band(-1-Z8,r)),bit32_bxor(Z8,bit32_band(-1-r,L)),bit32_bxor(r,bit32_band(-1-L,J8)),bit32_bxor(L,bit32_band(-1-J8,P8))Z=bit32_bxor(Z,q[J])k=k+H[J]end J[1]=Z F[1]=k J[2]=z F[2]=g J[3]=n F[3]=E J[4]=p F[4]=U J[5]=v F[5]=h J[6]=D F[6]=s J[7]=u F[7]=c J[8]=w F[8]=j J[9]=G F[9]=S J[10]=M F[10]=b J[11]=R F[11]=d J[12]=i F[12]=t J[13]=Y F[13]=N J[14]=y F[14]=W J[15]=l F[15]=O J[16]=e F[16]=Q J[17]=x F[17]=a J[18]=K F[18]=A J[19]=X F[19]=m J[20]=I F[20]=C J[21]=o F[21]=r J[22]=B F[22]=L J[23]=f F[23]=J8 J[24]=F8 F[24]=P8 J[25]=T8 F[25]=Z8 end end

local function sha256_feed_64(H, str, offs, size)
	-- offs >= 0, size >= 0, size is multiple of 64
	local W, K = common_W, sha2_K_hi
	local h1, h2, h3, h4, h5, h6, h7, h8 = H[1], H[2], H[3], H[4], H[5], H[6], H[7], H[8]
	for pos = offs, offs + size - 1, 64 do
		for j = 1, 16 do
			pos = pos + 4
			local a, b, c, d = string.byte(str, pos - 3, pos)
			W[j] = ((a * 256 + b) * 256 + c) * 256 + d
		end

		for j = 17, 64 do
			local a, b = W[j - 15], W[j - 2]
			W[j] = bit32_bxor(bit32_rrotate(a, 7), bit32_lrotate(a, 14), bit32_rshift(a, 3)) + bit32_bxor(bit32_lrotate(b, 15), bit32_lrotate(b, 13), bit32_rshift(b, 10)) + W[j - 7] + W[j - 16]
		end

		local a, b, c, d, e, f, g, h = h1, h2, h3, h4, h5, h6, h7, h8
		for j = 1, 64 do
			local z = bit32_bxor(bit32_rrotate(e, 6), bit32_rrotate(e, 11), bit32_lrotate(e, 7)) + bit32_band(e, f) + bit32_band(-1 - e, g) + h + K[j] + W[j]
			h = g
			g = f
			f = e
			e = z + d
			d = c
			c = b
			b = a
			a = z + bit32_band(d, c) + bit32_band(a, bit32_bxor(d, c)) + bit32_bxor(bit32_rrotate(a, 2), bit32_rrotate(a, 13), bit32_lrotate(a, 10))
		end

		h1, h2, h3, h4 = (a + h1) % 4294967296, (b + h2) % 4294967296, (c + h3) % 4294967296, (d + h4) % 4294967296
		h5, h6, h7, h8 = (e + h5) % 4294967296, (f + h6) % 4294967296, (g + h7) % 4294967296, (h + h8) % 4294967296
	end

	H[1], H[2], H[3], H[4], H[5], H[6], H[7], H[8] = h1, h2, h3, h4, h5, h6, h7, h8
end

local function sha512_feed_128(H_lo, H_hi, str, offs, size)
	-- offs >= 0, size >= 0, size is multiple of 128
	-- W1_hi, W1_lo, W2_hi, W2_lo, ...   Wk_hi = W[2*k-1], Wk_lo = W[2*k]
	local W, K_lo, K_hi = common_W, sha2_K_lo, sha2_K_hi
	local h1_lo, h2_lo, h3_lo, h4_lo, h5_lo, h6_lo, h7_lo, h8_lo = H_lo[1], H_lo[2], H_lo[3], H_lo[4], H_lo[5], H_lo[6], H_lo[7], H_lo[8]
	local h1_hi, h2_hi, h3_hi, h4_hi, h5_hi, h6_hi, h7_hi, h8_hi = H_hi[1], H_hi[2], H_hi[3], H_hi[4], H_hi[5], H_hi[6], H_hi[7], H_hi[8]
	for pos = offs, offs + size - 1, 128 do
		for j = 1, 16 * 2 do
			pos = pos + 4
			local a, b, c, d = string.byte(str, pos - 3, pos)
			W[j] = ((a * 256 + b) * 256 + c) * 256 + d
		end

		for jj = 34, 160, 2 do
			local a_lo, a_hi, b_lo, b_hi = W[jj - 30], W[jj - 31], W[jj - 4], W[jj - 5]
			local tmp1 = bit32_bxor(bit32_rshift(a_lo, 1) + bit32_lshift(a_hi, 31), bit32_rshift(a_lo, 8) + bit32_lshift(a_hi, 24), bit32_rshift(a_lo, 7) + bit32_lshift(a_hi, 25)) % 4294967296 +
				bit32_bxor(bit32_rshift(b_lo, 19) + bit32_lshift(b_hi, 13), bit32_lshift(b_lo, 3) + bit32_rshift(b_hi, 29), bit32_rshift(b_lo, 6) + bit32_lshift(b_hi, 26)) % 4294967296 +
				W[jj - 14] + W[jj - 32]

			local tmp2 = tmp1 % 4294967296
			W[jj - 1] = bit32_bxor(bit32_rshift(a_hi, 1) + bit32_lshift(a_lo, 31), bit32_rshift(a_hi, 8) + bit32_lshift(a_lo, 24), bit32_rshift(a_hi, 7)) +
				bit32_bxor(bit32_rshift(b_hi, 19) + bit32_lshift(b_lo, 13), bit32_lshift(b_hi, 3) + bit32_rshift(b_lo, 29), bit32_rshift(b_hi, 6)) +
				W[jj - 15] + W[jj - 33] + (tmp1 - tmp2) / 4294967296

			W[jj] = tmp2
		end

		local a_lo, b_lo, c_lo, d_lo, e_lo, f_lo, g_lo, h_lo = h1_lo, h2_lo, h3_lo, h4_lo, h5_lo, h6_lo, h7_lo, h8_lo
		local a_hi, b_hi, c_hi, d_hi, e_hi, f_hi, g_hi, h_hi = h1_hi, h2_hi, h3_hi, h4_hi, h5_hi, h6_hi, h7_hi, h8_hi
		for j = 1, 80 do
			local jj = 2 * j
			local tmp1 = bit32_bxor(bit32_rshift(e_lo, 14) + bit32_lshift(e_hi, 18), bit32_rshift(e_lo, 18) + bit32_lshift(e_hi, 14), bit32_lshift(e_lo, 23) + bit32_rshift(e_hi, 9)) % 4294967296 +
				(bit32_band(e_lo, f_lo) + bit32_band(-1 - e_lo, g_lo)) % 4294967296 +
				h_lo + K_lo[j] + W[jj]

			local z_lo = tmp1 % 4294967296
			local z_hi = bit32_bxor(bit32_rshift(e_hi, 14) + bit32_lshift(e_lo, 18), bit32_rshift(e_hi, 18) + bit32_lshift(e_lo, 14), bit32_lshift(e_hi, 23) + bit32_rshift(e_lo, 9)) +
				bit32_band(e_hi, f_hi) + bit32_band(-1 - e_hi, g_hi) +
				h_hi + K_hi[j] + W[jj - 1] +
				(tmp1 - z_lo) / 4294967296

			h_lo = g_lo
			h_hi = g_hi
			g_lo = f_lo
			g_hi = f_hi
			f_lo = e_lo
			f_hi = e_hi
			tmp1 = z_lo + d_lo
			e_lo = tmp1 % 4294967296
			e_hi = z_hi + d_hi + (tmp1 - e_lo) / 4294967296
			d_lo = c_lo
			d_hi = c_hi
			c_lo = b_lo
			c_hi = b_hi
			b_lo = a_lo
			b_hi = a_hi
			tmp1 = z_lo + (bit32_band(d_lo, c_lo) + bit32_band(b_lo, bit32_bxor(d_lo, c_lo))) % 4294967296 + bit32_bxor(bit32_rshift(b_lo, 28) + bit32_lshift(b_hi, 4), bit32_lshift(b_lo, 30) + bit32_rshift(b_hi, 2), bit32_lshift(b_lo, 25) + bit32_rshift(b_hi, 7)) % 4294967296
			a_lo = tmp1 % 4294967296
			a_hi = z_hi + (bit32_band(d_hi, c_hi) + bit32_band(b_hi, bit32_bxor(d_hi, c_hi))) + bit32_bxor(bit32_rshift(b_hi, 28) + bit32_lshift(b_lo, 4), bit32_lshift(b_hi, 30) + bit32_rshift(b_lo, 2), bit32_lshift(b_hi, 25) + bit32_rshift(b_lo, 7)) + (tmp1 - a_lo) / 4294967296
		end

		a_lo = h1_lo + a_lo
		h1_lo = a_lo % 4294967296
		h1_hi = (h1_hi + a_hi + (a_lo - h1_lo) / 4294967296) % 4294967296
		a_lo = h2_lo + b_lo
		h2_lo = a_lo % 4294967296
		h2_hi = (h2_hi + b_hi + (a_lo - h2_lo) / 4294967296) % 4294967296
		a_lo = h3_lo + c_lo
		h3_lo = a_lo % 4294967296
		h3_hi = (h3_hi + c_hi + (a_lo - h3_lo) / 4294967296) % 4294967296
		a_lo = h4_lo + d_lo
		h4_lo = a_lo % 4294967296
		h4_hi = (h4_hi + d_hi + (a_lo - h4_lo) / 4294967296) % 4294967296
		a_lo = h5_lo + e_lo
		h5_lo = a_lo % 4294967296
		h5_hi = (h5_hi + e_hi + (a_lo - h5_lo) / 4294967296) % 4294967296
		a_lo = h6_lo + f_lo
		h6_lo = a_lo % 4294967296
		h6_hi = (h6_hi + f_hi + (a_lo - h6_lo) / 4294967296) % 4294967296
		a_lo = h7_lo + g_lo
		h7_lo = a_lo % 4294967296
		h7_hi = (h7_hi + g_hi + (a_lo - h7_lo) / 4294967296) % 4294967296
		a_lo = h8_lo + h_lo
		h8_lo = a_lo % 4294967296
		h8_hi = (h8_hi + h_hi + (a_lo - h8_lo) / 4294967296) % 4294967296
	end

	H_lo[1], H_lo[2], H_lo[3], H_lo[4], H_lo[5], H_lo[6], H_lo[7], H_lo[8] = h1_lo, h2_lo, h3_lo, h4_lo, h5_lo, h6_lo, h7_lo, h8_lo
	H_hi[1], H_hi[2], H_hi[3], H_hi[4], H_hi[5], H_hi[6], H_hi[7], H_hi[8] = h1_hi, h2_hi, h3_hi, h4_hi, h5_hi, h6_hi, h7_hi, h8_hi
end

local function md5_feed_64(H, str, offs, size)
	-- offs >= 0, size >= 0, size is multiple of 64
	local W, K, md5_next_shift = common_W, md5_K, md5_next_shift
	local h1, h2, h3, h4 = H[1], H[2], H[3], H[4]
	for pos = offs, offs + size - 1, 64 do
		for j = 1, 16 do
			pos = pos + 4
			local a, b, c, d = string.byte(str, pos - 3, pos)
			W[j] = ((d * 256 + c) * 256 + b) * 256 + a
		end

		local a, b, c, d = h1, h2, h3, h4
		local s = 25
		for j = 1, 16 do
			local F = bit32_rrotate(bit32_band(b, c) + bit32_band(-1 - b, d) + a + K[j] + W[j], s) + b
			s = md5_next_shift[s]
			a = d
			d = c
			c = b
			b = F
		end

		s = 27
		for j = 17, 32 do
			local F = bit32_rrotate(bit32_band(d, b) + bit32_band(-1 - d, c) + a + K[j] + W[(5 * j - 4) % 16 + 1], s) + b
			s = md5_next_shift[s]
			a = d
			d = c
			c = b
			b = F
		end

		s = 28
		for j = 33, 48 do
			local F = bit32_rrotate(bit32_bxor(bit32_bxor(b, c), d) + a + K[j] + W[(3 * j + 2) % 16 + 1], s) + b
			s = md5_next_shift[s]
			a = d
			d = c
			c = b
			b = F
		end

		s = 26
		for j = 49, 64 do
			local F = bit32_rrotate(bit32_bxor(c, bit32_bor(b, -1 - d)) + a + K[j] + W[(j * 7 - 7) % 16 + 1], s) + b
			s = md5_next_shift[s]
			a = d
			d = c
			c = b
			b = F
		end

		h1 = (a + h1) % 4294967296
		h2 = (b + h2) % 4294967296
		h3 = (c + h3) % 4294967296
		h4 = (d + h4) % 4294967296
	end

	H[1], H[2], H[3], H[4] = h1, h2, h3, h4
end

local function sha1_feed_64(H, str, offs, size)
	-- offs >= 0, size >= 0, size is multiple of 64
	local W = common_W
	local h1, h2, h3, h4, h5 = H[1], H[2], H[3], H[4], H[5]
	for pos = offs, offs + size - 1, 64 do
		for j = 1, 16 do
			pos = pos + 4
			local a, b, c, d = string.byte(str, pos - 3, pos)
			W[j] = ((a * 256 + b) * 256 + c) * 256 + d
		end

		for j = 17, 80 do
			W[j] = bit32_lrotate(bit32_bxor(W[j - 3], W[j - 8], W[j - 14], W[j - 16]), 1)
		end

		local a, b, c, d, e = h1, h2, h3, h4, h5
		for j = 1, 20 do
			local z = bit32_lrotate(a, 5) + bit32_band(b, c) + bit32_band(-1 - b, d) + 0x5A827999 + W[j] + e -- constant = math.floor(TWO_POW_30 * sqrt(2))
			e = d
			d = c
			c = bit32_rrotate(b, 2)
			b = a
			a = z
		end

		for j = 21, 40 do
			local z = bit32_lrotate(a, 5) + bit32_bxor(b, c, d) + 0x6ED9EBA1 + W[j] + e -- TWO_POW_30 * sqrt(3)
			e = d
			d = c
			c = bit32_rrotate(b, 2)
			b = a
			a = z
		end

		for j = 41, 60 do
			local z = bit32_lrotate(a, 5) + bit32_band(d, c) + bit32_band(b, bit32_bxor(d, c)) + 0x8F1BBCDC + W[j] + e -- TWO_POW_30 * sqrt(5)
			e = d
			d = c
			c = bit32_rrotate(b, 2)
			b = a
			a = z
		end

		for j = 61, 80 do
			local z = bit32_lrotate(a, 5) + bit32_bxor(b, c, d) + 0xCA62C1D6 + W[j] + e -- TWO_POW_30 * sqrt(10)
			e = d
			d = c
			c = bit32_rrotate(b, 2)
			b = a
			a = z
		end

		h1 = (a + h1) % 4294967296
		h2 = (b + h2) % 4294967296
		h3 = (c + h3) % 4294967296
		h4 = (d + h4) % 4294967296
		h5 = (e + h5) % 4294967296
	end

	H[1], H[2], H[3], H[4], H[5] = h1, h2, h3, h4, h5
end

local function keccak_feed(lanes_lo, lanes_hi, str, offs, size, block_size_in_bytes)
	-- This is an example of a Lua function having 79 local variables :-)
	-- offs >= 0, size >= 0, size is multiple of block_size_in_bytes, block_size_in_bytes is positive multiple of 8
	local RC_lo, RC_hi = sha3_RC_lo, sha3_RC_hi
	local qwords_qty = block_size_in_bytes / 8
	for pos = offs, offs + size - 1, block_size_in_bytes do
		for j = 1, qwords_qty do
			local a, b, c, d = string.byte(str, pos + 1, pos + 4)
			lanes_lo[j] = bit32_bxor(lanes_lo[j], ((d * 256 + c) * 256 + b) * 256 + a)
			pos = pos + 8
			a, b, c, d = string.byte(str, pos - 3, pos)
			lanes_hi[j] = bit32_bxor(lanes_hi[j], ((d * 256 + c) * 256 + b) * 256 + a)
		end

		local L01_lo, L01_hi, L02_lo, L02_hi, L03_lo, L03_hi, L04_lo, L04_hi, L05_lo, L05_hi, L06_lo, L06_hi, L07_lo, L07_hi, L08_lo, L08_hi, L09_lo, L09_hi, L10_lo, L10_hi, L11_lo, L11_hi, L12_lo, L12_hi, L13_lo, L13_hi, L14_lo, L14_hi, L15_lo, L15_hi, L16_lo, L16_hi, L17_lo, L17_hi, L18_lo, L18_hi, L19_lo, L19_hi, L20_lo, L20_hi, L21_lo, L21_hi, L22_lo, L22_hi, L23_lo, L23_hi, L24_lo, L24_hi, L25_lo, L25_hi = lanes_lo[1], lanes_hi[1], lanes_lo[2], lanes_hi[2], lanes_lo[3], lanes_hi[3], lanes_lo[4], lanes_hi[4], lanes_lo[5], lanes_hi[5], lanes_lo[6], lanes_hi[6], lanes_lo[7], lanes_hi[7], lanes_lo[8], lanes_hi[8], lanes_lo[9], lanes_hi[9], lanes_lo[10], lanes_hi[10], lanes_lo[11], lanes_hi[11], lanes_lo[12], lanes_hi[12], lanes_lo[13], lanes_hi[13], lanes_lo[14], lanes_hi[14], lanes_lo[15], lanes_hi[15], lanes_lo[16], lanes_hi[16], lanes_lo[17], lanes_hi[17], lanes_lo[18], lanes_hi[18], lanes_lo[19], lanes_hi[19], lanes_lo[20], lanes_hi[20], lanes_lo[21], lanes_hi[21], lanes_lo[22], lanes_hi[22], lanes_lo[23], lanes_hi[23], lanes_lo[24], lanes_hi[24], lanes_lo[25], lanes_hi[25]

		for round_idx = 1, 24 do
			local C1_lo = bit32_bxor(L01_lo, L06_lo, L11_lo, L16_lo, L21_lo)
			local C1_hi = bit32_bxor(L01_hi, L06_hi, L11_hi, L16_hi, L21_hi)
			local C2_lo = bit32_bxor(L02_lo, L07_lo, L12_lo, L17_lo, L22_lo)
			local C2_hi = bit32_bxor(L02_hi, L07_hi, L12_hi, L17_hi, L22_hi)
			local C3_lo = bit32_bxor(L03_lo, L08_lo, L13_lo, L18_lo, L23_lo)
			local C3_hi = bit32_bxor(L03_hi, L08_hi, L13_hi, L18_hi, L23_hi)
			local C4_lo = bit32_bxor(L04_lo, L09_lo, L14_lo, L19_lo, L24_lo)
			local C4_hi = bit32_bxor(L04_hi, L09_hi, L14_hi, L19_hi, L24_hi)
			local C5_lo = bit32_bxor(L05_lo, L10_lo, L15_lo, L20_lo, L25_lo)
			local C5_hi = bit32_bxor(L05_hi, L10_hi, L15_hi, L20_hi, L25_hi)

			local D_lo = bit32_bxor(C1_lo, C3_lo * 2 + (C3_hi % TWO_POW_32 - C3_hi % TWO_POW_31) / TWO_POW_31)
			local D_hi = bit32_bxor(C1_hi, C3_hi * 2 + (C3_lo % TWO_POW_32 - C3_lo % TWO_POW_31) / TWO_POW_31)

			local T0_lo = bit32_bxor(D_lo, L02_lo)
			local T0_hi = bit32_bxor(D_hi, L02_hi)
			local T1_lo = bit32_bxor(D_lo, L07_lo)
			local T1_hi = bit32_bxor(D_hi, L07_hi)
			local T2_lo = bit32_bxor(D_lo, L12_lo)
			local T2_hi = bit32_bxor(D_hi, L12_hi)
			local T3_lo = bit32_bxor(D_lo, L17_lo)
			local T3_hi = bit32_bxor(D_hi, L17_hi)
			local T4_lo = bit32_bxor(D_lo, L22_lo)
			local T4_hi = bit32_bxor(D_hi, L22_hi)

			L02_lo = (T1_lo % TWO_POW_32 - T1_lo % TWO_POW_20) / TWO_POW_20 + T1_hi * TWO_POW_12
			L02_hi = (T1_hi % TWO_POW_32 - T1_hi % TWO_POW_20) / TWO_POW_20 + T1_lo * TWO_POW_12
			L07_lo = (T3_lo % TWO_POW_32 - T3_lo % TWO_POW_19) / TWO_POW_19 + T3_hi * TWO_POW_13
			L07_hi = (T3_hi % TWO_POW_32 - T3_hi % TWO_POW_19) / TWO_POW_19 + T3_lo * TWO_POW_13
			L12_lo = T0_lo * 2 + (T0_hi % TWO_POW_32 - T0_hi % TWO_POW_31) / TWO_POW_31
			L12_hi = T0_hi * 2 + (T0_lo % TWO_POW_32 - T0_lo % TWO_POW_31) / TWO_POW_31
			L17_lo = T2_lo * TWO_POW_10 + (T2_hi % TWO_POW_32 - T2_hi % TWO_POW_22) / TWO_POW_22
			L17_hi = T2_hi * TWO_POW_10 + (T2_lo % TWO_POW_32 - T2_lo % TWO_POW_22) / TWO_POW_22
			L22_lo = T4_lo * TWO_POW_2 + (T4_hi % TWO_POW_32 - T4_hi % TWO_POW_30) / TWO_POW_30
			L22_hi = T4_hi * TWO_POW_2 + (T4_lo % TWO_POW_32 - T4_lo % TWO_POW_30) / TWO_POW_30

			D_lo = bit32_bxor(C2_lo, C4_lo * 2 + (C4_hi % TWO_POW_32 - C4_hi % TWO_POW_31) / TWO_POW_31)
			D_hi = bit32_bxor(C2_hi, C4_hi * 2 + (C4_lo % TWO_POW_32 - C4_lo % TWO_POW_31) / TWO_POW_31)

			T0_lo = bit32_bxor(D_lo, L03_lo)
			T0_hi = bit32_bxor(D_hi, L03_hi)
			T1_lo = bit32_bxor(D_lo, L08_lo)
			T1_hi = bit32_bxor(D_hi, L08_hi)
			T2_lo = bit32_bxor(D_lo, L13_lo)
			T2_hi = bit32_bxor(D_hi, L13_hi)
			T3_lo = bit32_bxor(D_lo, L18_lo)
			T3_hi = bit32_bxor(D_hi, L18_hi)
			T4_lo = bit32_bxor(D_lo, L23_lo)
			T4_hi = bit32_bxor(D_hi, L23_hi)

			L03_lo = (T2_lo % TWO_POW_32 - T2_lo % TWO_POW_21) / TWO_POW_21 + T2_hi * TWO_POW_11
			L03_hi = (T2_hi % TWO_POW_32 - T2_hi % TWO_POW_21) / TWO_POW_21 + T2_lo * TWO_POW_11
			L08_lo = (T4_lo % TWO_POW_32 - T4_lo % TWO_POW_3) / TWO_POW_3 + T4_hi * TWO_POW_29 % TWO_POW_32
			L08_hi = (T4_hi % TWO_POW_32 - T4_hi % TWO_POW_3) / TWO_POW_3 + T4_lo * TWO_POW_29 % TWO_POW_32
			L13_lo = T1_lo * TWO_POW_6 + (T1_hi % TWO_POW_32 - T1_hi % TWO_POW_26) / TWO_POW_26
			L13_hi = T1_hi * TWO_POW_6 + (T1_lo % TWO_POW_32 - T1_lo % TWO_POW_26) / TWO_POW_26
			L18_lo = T3_lo * TWO_POW_15 + (T3_hi % TWO_POW_32 - T3_hi % TWO_POW_17) / TWO_POW_17
			L18_hi = T3_hi * TWO_POW_15 + (T3_lo % TWO_POW_32 - T3_lo % TWO_POW_17) / TWO_POW_17
			L23_lo = (T0_lo % TWO_POW_32 - T0_lo % TWO_POW_2) / TWO_POW_2 + T0_hi * TWO_POW_30 % TWO_POW_32
			L23_hi = (T0_hi % TWO_POW_32 - T0_hi % TWO_POW_2) / TWO_POW_2 + T0_lo * TWO_POW_30 % TWO_POW_32

			D_lo = bit32_bxor(C3_lo, C5_lo * 2 + (C5_hi % TWO_POW_32 - C5_hi % TWO_POW_31) / TWO_POW_31)
			D_hi = bit32_bxor(C3_hi, C5_hi * 2 + (C5_lo % TWO_POW_32 - C5_lo % TWO_POW_31) / TWO_POW_31)

			T0_lo = bit32_bxor(D_lo, L04_lo)
			T0_hi = bit32_bxor(D_hi, L04_hi)
			T1_lo = bit32_bxor(D_lo, L09_lo)
			T1_hi = bit32_bxor(D_hi, L09_hi)
			T2_lo = bit32_bxor(D_lo, L14_lo)
			T2_hi = bit32_bxor(D_hi, L14_hi)
			T3_lo = bit32_bxor(D_lo, L19_lo)
			T3_hi = bit32_bxor(D_hi, L19_hi)
			T4_lo = bit32_bxor(D_lo, L24_lo)
			T4_hi = bit32_bxor(D_hi, L24_hi)

			L04_lo = T3_lo * TWO_POW_21 % TWO_POW_32 + (T3_hi % TWO_POW_32 - T3_hi % TWO_POW_11) / TWO_POW_11
			L04_hi = T3_hi * TWO_POW_21 % TWO_POW_32 + (T3_lo % TWO_POW_32 - T3_lo % TWO_POW_11) / TWO_POW_11
			L09_lo = T0_lo * TWO_POW_28 % TWO_POW_32 + (T0_hi % TWO_POW_32 - T0_hi % TWO_POW_4) / TWO_POW_4
			L09_hi = T0_hi * TWO_POW_28 % TWO_POW_32 + (T0_lo % TWO_POW_32 - T0_lo % TWO_POW_4) / TWO_POW_4
			L14_lo = T2_lo * TWO_POW_25 % TWO_POW_32 + (T2_hi % TWO_POW_32 - T2_hi % TWO_POW_7) / TWO_POW_7
			L14_hi = T2_hi * TWO_POW_25 % TWO_POW_32 + (T2_lo % TWO_POW_32 - T2_lo % TWO_POW_7) / TWO_POW_7
			L19_lo = (T4_lo % TWO_POW_32 - T4_lo % TWO_POW_8) / TWO_POW_8 + T4_hi * TWO_POW_24 % TWO_POW_32
			L19_hi = (T4_hi % TWO_POW_32 - T4_hi % TWO_POW_8) / TWO_POW_8 + T4_lo * TWO_POW_24 % TWO_POW_32
			L24_lo = (T1_lo % TWO_POW_32 - T1_lo % TWO_POW_9) / TWO_POW_9 + T1_hi * TWO_POW_23 % TWO_POW_32
			L24_hi = (T1_hi % TWO_POW_32 - T1_hi % TWO_POW_9) / TWO_POW_9 + T1_lo * TWO_POW_23 % TWO_POW_32

			D_lo = bit32_bxor(C4_lo, C1_lo * 2 + (C1_hi % TWO_POW_32 - C1_hi % TWO_POW_31) / TWO_POW_31)
			D_hi = bit32_bxor(C4_hi, C1_hi * 2 + (C1_lo % TWO_POW_32 - C1_lo % TWO_POW_31) / TWO_POW_31)

			T0_lo = bit32_bxor(D_lo, L05_lo)
			T0_hi = bit32_bxor(D_hi, L05_hi)
			T1_lo = bit32_bxor(D_lo, L10_lo)
			T1_hi = bit32_bxor(D_hi, L10_hi)
			T2_lo = bit32_bxor(D_lo, L15_lo)
			T2_hi = bit32_bxor(D_hi, L15_hi)
			T3_lo = bit32_bxor(D_lo, L20_lo)
			T3_hi = bit32_bxor(D_hi, L20_hi)
			T4_lo = bit32_bxor(D_lo, L25_lo)
			T4_hi = bit32_bxor(D_hi, L25_hi)

			L05_lo = T4_lo * TWO_POW_14 + (T4_hi % TWO_POW_32 - T4_hi % TWO_POW_18) / TWO_POW_18
			L05_hi = T4_hi * TWO_POW_14 + (T4_lo % TWO_POW_32 - T4_lo % TWO_POW_18) / TWO_POW_18
			L10_lo = T1_lo * TWO_POW_20 % TWO_POW_32 + (T1_hi % TWO_POW_32 - T1_hi % TWO_POW_12) / TWO_POW_12
			L10_hi = T1_hi * TWO_POW_20 % TWO_POW_32 + (T1_lo % TWO_POW_32 - T1_lo % TWO_POW_12) / TWO_POW_12
			L15_lo = T3_lo * TWO_POW_8 + (T3_hi % TWO_POW_32 - T3_hi % TWO_POW_24) / TWO_POW_24
			L15_hi = T3_hi * TWO_POW_8 + (T3_lo % TWO_POW_32 - T3_lo % TWO_POW_24) / TWO_POW_24
			L20_lo = T0_lo * TWO_POW_27 % TWO_POW_32 + (T0_hi % TWO_POW_32 - T0_hi % TWO_POW_5) / TWO_POW_5
			L20_hi = T0_hi * TWO_POW_27 % TWO_POW_32 + (T0_lo % TWO_POW_32 - T0_lo % TWO_POW_5) / TWO_POW_5
			L25_lo = (T2_lo % TWO_POW_32 - T2_lo % TWO_POW_25) / TWO_POW_25 + T2_hi * TWO_POW_7
			L25_hi = (T2_hi % TWO_POW_32 - T2_hi % TWO_POW_25) / TWO_POW_25 + T2_lo * TWO_POW_7

			D_lo = bit32_bxor(C5_lo, C2_lo * 2 + (C2_hi % TWO_POW_32 - C2_hi % TWO_POW_31) / TWO_POW_31)
			D_hi = bit32_bxor(C5_hi, C2_hi * 2 + (C2_lo % TWO_POW_32 - C2_lo % TWO_POW_31) / TWO_POW_31)

			T1_lo = bit32_bxor(D_lo, L06_lo)
			T1_hi = bit32_bxor(D_hi, L06_hi)
			T2_lo = bit32_bxor(D_lo, L11_lo)
			T2_hi = bit32_bxor(D_hi, L11_hi)
			T3_lo = bit32_bxor(D_lo, L16_lo)
			T3_hi = bit32_bxor(D_hi, L16_hi)
			T4_lo = bit32_bxor(D_lo, L21_lo)
			T4_hi = bit32_bxor(D_hi, L21_hi)

			L06_lo = T2_lo * TWO_POW_3 + (T2_hi % TWO_POW_32 - T2_hi % TWO_POW_29) / TWO_POW_29
			L06_hi = T2_hi * TWO_POW_3 + (T2_lo % TWO_POW_32 - T2_lo % TWO_POW_29) / TWO_POW_29
			L11_lo = T4_lo * TWO_POW_18 + (T4_hi % TWO_POW_32 - T4_hi % TWO_POW_14) / TWO_POW_14
			L11_hi = T4_hi * TWO_POW_18 + (T4_lo % TWO_POW_32 - T4_lo % TWO_POW_14) / TWO_POW_14
			L16_lo = (T1_lo % TWO_POW_32 - T1_lo % TWO_POW_28) / TWO_POW_28 + T1_hi * TWO_POW_4
			L16_hi = (T1_hi % TWO_POW_32 - T1_hi % TWO_POW_28) / TWO_POW_28 + T1_lo * TWO_POW_4
			L21_lo = (T3_lo % TWO_POW_32 - T3_lo % TWO_POW_23) / TWO_POW_23 + T3_hi * TWO_POW_9
			L21_hi = (T3_hi % TWO_POW_32 - T3_hi % TWO_POW_23) / TWO_POW_23 + T3_lo * TWO_POW_9

			L01_lo = bit32_bxor(D_lo, L01_lo)
			L01_hi = bit32_bxor(D_hi, L01_hi)
			L01_lo, L02_lo, L03_lo, L04_lo, L05_lo = bit32_bxor(L01_lo, bit32_band(-1 - L02_lo, L03_lo)), bit32_bxor(L02_lo, bit32_band(-1 - L03_lo, L04_lo)), bit32_bxor(L03_lo, bit32_band(-1 - L04_lo, L05_lo)), bit32_bxor(L04_lo, bit32_band(-1 - L05_lo, L01_lo)), bit32_bxor(L05_lo, bit32_band(-1 - L01_lo, L02_lo))
			L01_hi, L02_hi, L03_hi, L04_hi, L05_hi = bit32_bxor(L01_hi, bit32_band(-1 - L02_hi, L03_hi)), bit32_bxor(L02_hi, bit32_band(-1 - L03_hi, L04_hi)), bit32_bxor(L03_hi, bit32_band(-1 - L04_hi, L05_hi)), bit32_bxor(L04_hi, bit32_band(-1 - L05_hi, L01_hi)), bit32_bxor(L05_hi, bit32_band(-1 - L01_hi, L02_hi))
			L06_lo, L07_lo, L08_lo, L09_lo, L10_lo = bit32_bxor(L09_lo, bit32_band(-1 - L10_lo, L06_lo)), bit32_bxor(L10_lo, bit32_band(-1 - L06_lo, L07_lo)), bit32_bxor(L06_lo, bit32_band(-1 - L07_lo, L08_lo)), bit32_bxor(L07_lo, bit32_band(-1 - L08_lo, L09_lo)), bit32_bxor(L08_lo, bit32_band(-1 - L09_lo, L10_lo))
			L06_hi, L07_hi, L08_hi, L09_hi, L10_hi = bit32_bxor(L09_hi, bit32_band(-1 - L10_hi, L06_hi)), bit32_bxor(L10_hi, bit32_band(-1 - L06_hi, L07_hi)), bit32_bxor(L06_hi, bit32_band(-1 - L07_hi, L08_hi)), bit32_bxor(L07_hi, bit32_band(-1 - L08_hi, L09_hi)), bit32_bxor(L08_hi, bit32_band(-1 - L09_hi, L10_hi))
			L11_lo, L12_lo, L13_lo, L14_lo, L15_lo = bit32_bxor(L12_lo, bit32_band(-1 - L13_lo, L14_lo)), bit32_bxor(L13_lo, bit32_band(-1 - L14_lo, L15_lo)), bit32_bxor(L14_lo, bit32_band(-1 - L15_lo, L11_lo)), bit32_bxor(L15_lo, bit32_band(-1 - L11_lo, L12_lo)), bit32_bxor(L11_lo, bit32_band(-1 - L12_lo, L13_lo))
			L11_hi, L12_hi, L13_hi, L14_hi, L15_hi = bit32_bxor(L12_hi, bit32_band(-1 - L13_hi, L14_hi)), bit32_bxor(L13_hi, bit32_band(-1 - L14_hi, L15_hi)), bit32_bxor(L14_hi, bit32_band(-1 - L15_hi, L11_hi)), bit32_bxor(L15_hi, bit32_band(-1 - L11_hi, L12_hi)), bit32_bxor(L11_hi, bit32_band(-1 - L12_hi, L13_hi))
			L16_lo, L17_lo, L18_lo, L19_lo, L20_lo = bit32_bxor(L20_lo, bit32_band(-1 - L16_lo, L17_lo)), bit32_bxor(L16_lo, bit32_band(-1 - L17_lo, L18_lo)), bit32_bxor(L17_lo, bit32_band(-1 - L18_lo, L19_lo)), bit32_bxor(L18_lo, bit32_band(-1 - L19_lo, L20_lo)), bit32_bxor(L19_lo, bit32_band(-1 - L20_lo, L16_lo))
			L16_hi, L17_hi, L18_hi, L19_hi, L20_hi = bit32_bxor(L20_hi, bit32_band(-1 - L16_hi, L17_hi)), bit32_bxor(L16_hi, bit32_band(-1 - L17_hi, L18_hi)), bit32_bxor(L17_hi, bit32_band(-1 - L18_hi, L19_hi)), bit32_bxor(L18_hi, bit32_band(-1 - L19_hi, L20_hi)), bit32_bxor(L19_hi, bit32_band(-1 - L20_hi, L16_hi))
			L21_lo, L22_lo, L23_lo, L24_lo, L25_lo = bit32_bxor(L23_lo, bit32_band(-1 - L24_lo, L25_lo)), bit32_bxor(L24_lo, bit32_band(-1 - L25_lo, L21_lo)), bit32_bxor(L25_lo, bit32_band(-1 - L21_lo, L22_lo)), bit32_bxor(L21_lo, bit32_band(-1 - L22_lo, L23_lo)), bit32_bxor(L22_lo, bit32_band(-1 - L23_lo, L24_lo))
			L21_hi, L22_hi, L23_hi, L24_hi, L25_hi = bit32_bxor(L23_hi, bit32_band(-1 - L24_hi, L25_hi)), bit32_bxor(L24_hi, bit32_band(-1 - L25_hi, L21_hi)), bit32_bxor(L25_hi, bit32_band(-1 - L21_hi, L22_hi)), bit32_bxor(L21_hi, bit32_band(-1 - L22_hi, L23_hi)), bit32_bxor(L22_hi, bit32_band(-1 - L23_hi, L24_hi))
			L01_lo = bit32_bxor(L01_lo, RC_lo[round_idx])
			L01_hi = L01_hi + RC_hi[round_idx] -- RC_hi[] is either 0 or 0x80000000, so we could use fast addition instead of slow XOR
		end

		lanes_lo[1] = L01_lo
		lanes_hi[1] = L01_hi
		lanes_lo[2] = L02_lo
		lanes_hi[2] = L02_hi
		lanes_lo[3] = L03_lo
		lanes_hi[3] = L03_hi
		lanes_lo[4] = L04_lo
		lanes_hi[4] = L04_hi
		lanes_lo[5] = L05_lo
		lanes_hi[5] = L05_hi
		lanes_lo[6] = L06_lo
		lanes_hi[6] = L06_hi
		lanes_lo[7] = L07_lo
		lanes_hi[7] = L07_hi
		lanes_lo[8] = L08_lo
		lanes_hi[8] = L08_hi
		lanes_lo[9] = L09_lo
		lanes_hi[9] = L09_hi
		lanes_lo[10] = L10_lo
		lanes_hi[10] = L10_hi
		lanes_lo[11] = L11_lo
		lanes_hi[11] = L11_hi
		lanes_lo[12] = L12_lo
		lanes_hi[12] = L12_hi
		lanes_lo[13] = L13_lo
		lanes_hi[13] = L13_hi
		lanes_lo[14] = L14_lo
		lanes_hi[14] = L14_hi
		lanes_lo[15] = L15_lo
		lanes_hi[15] = L15_hi
		lanes_lo[16] = L16_lo
		lanes_hi[16] = L16_hi
		lanes_lo[17] = L17_lo
		lanes_hi[17] = L17_hi
		lanes_lo[18] = L18_lo
		lanes_hi[18] = L18_hi
		lanes_lo[19] = L19_lo
		lanes_hi[19] = L19_hi
		lanes_lo[20] = L20_lo
		lanes_hi[20] = L20_hi
		lanes_lo[21] = L21_lo
		lanes_hi[21] = L21_hi
		lanes_lo[22] = L22_lo
		lanes_hi[22] = L22_hi
		lanes_lo[23] = L23_lo
		lanes_hi[23] = L23_hi
		lanes_lo[24] = L24_lo
		lanes_hi[24] = L24_hi
		lanes_lo[25] = L25_lo
		lanes_hi[25] = L25_hi
	end
end
