void sbox_htable_word(int ii,byte *a,int n) { int w=2*sizeof(word); // number of nibbles to store in a word word T[K/w][n]; word Tp[K/w][n]; int i,k,k2,j; word r; word b[n]; byte x; byte c[n]; byte *S=sbox+ii*64; for(k=0;k<K/w;k++) { r=0; for(j=w-1;j>=0;j--) { r=r << 4; r^=S[k*w+j]; } T[k][0]=r; for(i=1;i<n;i++) T[k][i]=0; } for(i=0;i<(n-1);i++) { k2=(a[i] & 63)/w; for(k=0;k<K/w;k++) memcpy(Tp[k],T[k ^ k2],n*sizeof(word)); for(k=0;k<K/w;k++) { memcpy(T[k],Tp[k],n*sizeof(word)); refreshword(T[k],n); } } memcpy(b,T[(a[n-1] & 63)/w],n*sizeof(word)); byte Ts[w][n]; byte Tsp[w][n]; for(k=0;k<w;k++) for(i=0;i<n;i++) Ts[k][i]=(b[i] >> (k*4)) & 15; for(i=0;i<(n-1);i++) { for(k=0;k<w;k++) memcpy(Tsp[k],Ts[k ^ (a[i] & (w-1))],n); for(k=0;k<w;k++) { memcpy(Ts[k],Tsp[k],n); refresh(Ts[k],n); } } memcpy(a,Ts[a[n-1] & (w-1)],n); refresh(a,n); }
void subbyte_htable_word(byte *a,int n) // n+4 bytes { int w=sizeof(word); // number of bytes to store in a word word T[K/w][n]; // n*256 bytes word Tp[K/w][n]; // n*256 bytes int i,k,k2,j; // 16 bytes word r; // 4 bytes word b[n]; // 4*n bytes (for 32-bit registers) byte x; // 1 bytes byte c[n]; // n bytes // Memory: 518*n+25 for(k=0;k<K/w;k++) { r=0; for(j=w-1;j>=0;j--) { r=r << 8; r^=sbox[k*w+j]; } T[k][0]=r; for(i=1;i<n;i++) T[k][i]=0; } for(i=0;i<(n-1);i++) { k2=a[i]/w; for(k=0;k<K/w;k++) memcpy(Tp[k],T[k ^ k2],n*sizeof(word)); for(k=0;k<K/w;k++) { memcpy(T[k],Tp[k],n*sizeof(word)); refreshword(T[k],n); } } memcpy(b,T[a[n-1]/w],n*sizeof(word)); refreshword(b,n); // not counted above because the tables T and Tp can be discarded byte Ts[w][n]; // 4*n bytes byte Tsp[w][n]; // 4*n bytes for(k=0;k<w;k++) for(i=0;i<n;i++) Ts[k][i]=b[i] >> (k*8); for(i=0;i<(n-1);i++) { for(k=0;k<w;k++) memcpy(Tsp[k],Ts[k ^ (a[i] & (w-1))],n); for(k=0;k<w;k++) { memcpy(Ts[k],Tsp[k],n); refresh(Ts[k],n); } } memcpy(a,Ts[a[n-1] & (w-1)],n); refresh(a,n); }