Beispiel #1
0
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);
}
Beispiel #2
0
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);
}