+template<int h>
+void myhash(uchar *X, uchar* RM2, uchar *Sbox2) {
+ uchar Y[h];
+ uchar X2[h];
+
+ for(int k=0;k<h;k++) {
+
+
+ for(int a=0;a<h;a+=4) {
+ X2[a]=RM2[a]^X[k*h+a];
+ X2[a+1]=RM2[a+1]^X[k*h+a+1];
+ X2[a+2]=RM2[a+2]^X[k*h+a+2];
+ X2[a+3]=RM2[a+3]^X[k*h+a+3];
+ }
+
+
+ Y[0]=X2[0]^X2[h-1];
+ Y[1]=Y[0]^X2[0];
+ Y[2]=Y[1]^X2[1];
+ Y[3]=Y[2]^X2[2];
+ for(int a=4;a<h;a+=4) {
+ Y[a]=Y[a-1]^X2[a-1];
+ Y[a+1]=Y[a]^X2[a];
+ Y[a+2]=Y[a+1]^X2[a+1];
+ Y[a+3]=Y[a+2]^X2[a+2];
+ }
+
+
+ for(int a=0;a<h;a+=4) {
+ Y[a]=Sbox2[Y[a]];
+ Y[a+1]=Sbox2[Y[a+1]];
+ Y[a+2]=Sbox2[Y[a+2]];
+ Y[a+3]=Sbox2[Y[a+3]];
+ }
+
+
+
+ RM2[h-1]=Y[h-1]^Y[0];
+ RM2[h-2]=RM2[h-1]^Y[h-1];
+ RM2[h-3]=RM2[h-2]^Y[h-2];
+ RM2[h-4]=RM2[h-3]^Y[h-3];
+ for(int a=h-4;a>0;a-=4) {
+ RM2[a-1]=RM2[a]^Y[a];
+ RM2[a-2]=RM2[a-1]^Y[a-1];
+ RM2[a-3]=RM2[a-2]^Y[a-2];
+ RM2[a-4]=RM2[a-3]^Y[a-3];
+ }
+ }
+}