SASC-NG
DVBSoftCAM

stream.c

Go to the documentation of this file.
00001 /* FFdecsa -- fast decsa algorithm
00002  *
00003  * Copyright (C) 2003-2004  fatih89r
00004  *
00005  * This program is free software; you can redistribute it and/or modify
00006  * it under the terms of the GNU General Public License as published by
00007  * the Free Software Foundation; either version 2 of the License, or
00008  * (at your option) any later version.
00009  *
00010  * This program is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013  * GNU General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU General Public License
00016  * along with this program; if not, write to the Free Software
00017  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00018  */
00019 
00020 
00021 
00022 // define statics only once, when STREAM_INIT
00023 #ifdef STREAM_INIT
00024 struct stream_regs {
00025   group A[32+10][4]; // 32 because we will move back (virtual shift register)
00026   group B[32+10][4]; // 32 because we will move back (virtual shift register)
00027   group X[4];
00028   group Y[4];
00029   group Z[4];
00030   group D[4];
00031   group E[4];
00032   group F[4];
00033   group p;
00034   group q;
00035   group r;
00036   };
00037 
00038 static inline void trasp64_32_88ccw(unsigned char *data){
00039 /* 64 rows of 32 bits transposition (bytes transp. - 8x8 rotate counterclockwise)*/
00040 #define row ((unsigned int *)data)
00041   int i,j;
00042   for(j=0;j<64;j+=32){
00043     unsigned int t,b;
00044     for(i=0;i<16;i++){
00045       t=row[j+i];
00046       b=row[j+16+i];
00047       row[j+i]   = (t&0x0000ffff)      | ((b           )<<16);
00048       row[j+16+i]=((t           )>>16) |  (b&0xffff0000) ;
00049     }
00050   }
00051   for(j=0;j<64;j+=16){
00052     unsigned int t,b;
00053     for(i=0;i<8;i++){
00054       t=row[j+i];
00055       b=row[j+8+i];
00056       row[j+i]   = (t&0x00ff00ff)     | ((b&0x00ff00ff)<<8);
00057       row[j+8+i] =((t&0xff00ff00)>>8) |  (b&0xff00ff00);
00058     }
00059   }
00060   for(j=0;j<64;j+=8){
00061     unsigned int t,b;
00062     for(i=0;i<4;i++){
00063       t=row[j+i];
00064       b=row[j+4+i];
00065       row[j+i]   =((t&0x0f0f0f0f)<<4) |  (b&0x0f0f0f0f);
00066       row[j+4+i] = (t&0xf0f0f0f0)     | ((b&0xf0f0f0f0)>>4);
00067     }
00068   }
00069   for(j=0;j<64;j+=4){
00070     unsigned int t,b;
00071     for(i=0;i<2;i++){
00072       t=row[j+i];
00073       b=row[j+2+i];
00074       row[j+i]   =((t&0x33333333)<<2) |  (b&0x33333333);
00075       row[j+2+i] = (t&0xcccccccc)     | ((b&0xcccccccc)>>2);
00076     }
00077   }
00078   for(j=0;j<64;j+=2){
00079     unsigned int t,b;
00080     for(i=0;i<1;i++){
00081       t=row[j+i];
00082       b=row[j+1+i];
00083       row[j+i]   =((t&0x55555555)<<1) |  (b&0x55555555);
00084       row[j+1+i] = (t&0xaaaaaaaa)     | ((b&0xaaaaaaaa)>>1);
00085     }
00086   }
00087 #undef row
00088 }
00089 
00090 static inline void trasp64_32_88cw(unsigned char *data){
00091 /* 64 rows of 32 bits transposition (bytes transp. - 8x8 rotate clockwise)*/
00092 #define row ((unsigned int *)data)
00093   int i,j;
00094   for(j=0;j<64;j+=32){
00095     unsigned int t,b;
00096     for(i=0;i<16;i++){
00097       t=row[j+i];
00098       b=row[j+16+i];
00099       row[j+i]   = (t&0x0000ffff)      | ((b           )<<16);
00100       row[j+16+i]=((t           )>>16) |  (b&0xffff0000) ;
00101     }
00102   }
00103   for(j=0;j<64;j+=16){
00104     unsigned int t,b;
00105     for(i=0;i<8;i++){
00106       t=row[j+i];
00107       b=row[j+8+i];
00108       row[j+i]   = (t&0x00ff00ff)     | ((b&0x00ff00ff)<<8);
00109       row[j+8+i] =((t&0xff00ff00)>>8) |  (b&0xff00ff00);
00110     }
00111   }
00112   for(j=0;j<64;j+=8){
00113     unsigned int t,b;
00114     for(i=0;i<4;i++){
00115       t=row[j+i];
00116       b=row[j+4+i];
00117       row[j+i]  =((t&0xf0f0f0f0)>>4) |   (b&0xf0f0f0f0);
00118       row[j+4+i]= (t&0x0f0f0f0f)     |  ((b&0x0f0f0f0f)<<4);
00119     }
00120   }
00121   for(j=0;j<64;j+=4){
00122     unsigned int t,b;
00123     for(i=0;i<2;i++){
00124       t=row[j+i];
00125       b=row[j+2+i];
00126       row[j+i]  =((t&0xcccccccc)>>2) |  (b&0xcccccccc);
00127       row[j+2+i]= (t&0x33333333)     | ((b&0x33333333)<<2);
00128     }
00129   }
00130   for(j=0;j<64;j+=2){
00131     unsigned int t,b;
00132     for(i=0;i<1;i++){
00133       t=row[j+i];
00134       b=row[j+1+i];
00135       row[j+i]  =((t&0xaaaaaaaa)>>1) |  (b&0xaaaaaaaa);
00136       row[j+1+i]= (t&0x55555555)     | ((b&0x55555555)<<1);
00137     }
00138   }
00139 #undef row
00140 }
00141 
00142 //64-64----------------------------------------------------------
00143 static inline void trasp64_64_88ccw(unsigned char *data){
00144 /* 64 rows of 64 bits transposition (bytes transp. - 8x8 rotate counterclockwise)*/
00145 #define row ((unsigned long long int *)data)
00146   int i,j;
00147   for(j=0;j<64;j+=64){
00148     unsigned long long int t,b;
00149     for(i=0;i<32;i++){
00150       t=row[j+i];
00151       b=row[j+32+i];
00152       row[j+i]   = (t&0x00000000ffffffffULL)      | ((b                      )<<32);
00153       row[j+32+i]=((t                      )>>32) |  (b&0xffffffff00000000ULL) ;
00154     }
00155   }
00156   for(j=0;j<64;j+=32){
00157     unsigned long long int t,b;
00158     for(i=0;i<16;i++){
00159       t=row[j+i];
00160       b=row[j+16+i];
00161       row[j+i]   = (t&0x0000ffff0000ffffULL)      | ((b&0x0000ffff0000ffffULL)<<16);
00162       row[j+16+i]=((t&0xffff0000ffff0000ULL)>>16) |  (b&0xffff0000ffff0000ULL) ;
00163     }
00164   }
00165   for(j=0;j<64;j+=16){
00166     unsigned long long int t,b;
00167     for(i=0;i<8;i++){
00168       t=row[j+i];
00169       b=row[j+8+i];
00170       row[j+i]   = (t&0x00ff00ff00ff00ffULL)     | ((b&0x00ff00ff00ff00ffULL)<<8);
00171       row[j+8+i] =((t&0xff00ff00ff00ff00ULL)>>8) |  (b&0xff00ff00ff00ff00ULL);
00172     }
00173   }
00174   for(j=0;j<64;j+=8){
00175     unsigned long long int t,b;
00176     for(i=0;i<4;i++){
00177       t=row[j+i];
00178       b=row[j+4+i];
00179       row[j+i]   =((t&0x0f0f0f0f0f0f0f0fULL)<<4) |  (b&0x0f0f0f0f0f0f0f0fULL);
00180       row[j+4+i] = (t&0xf0f0f0f0f0f0f0f0ULL)     | ((b&0xf0f0f0f0f0f0f0f0ULL)>>4);
00181     }
00182   }
00183   for(j=0;j<64;j+=4){
00184     unsigned long long int t,b;
00185     for(i=0;i<2;i++){
00186       t=row[j+i];
00187       b=row[j+2+i];
00188       row[j+i]   =((t&0x3333333333333333ULL)<<2) |  (b&0x3333333333333333ULL);
00189       row[j+2+i] = (t&0xccccccccccccccccULL)     | ((b&0xccccccccccccccccULL)>>2);
00190     }
00191   }
00192   for(j=0;j<64;j+=2){
00193     unsigned long long int t,b;
00194     for(i=0;i<1;i++){
00195       t=row[j+i];
00196       b=row[j+1+i];
00197       row[j+i]   =((t&0x5555555555555555ULL)<<1) |  (b&0x5555555555555555ULL);
00198       row[j+1+i] = (t&0xaaaaaaaaaaaaaaaaULL)     | ((b&0xaaaaaaaaaaaaaaaaULL)>>1);
00199     }
00200   }
00201 #undef row
00202 }
00203 
00204 static inline void trasp64_64_88cw(unsigned char *data){
00205 /* 64 rows of 64 bits transposition (bytes transp. - 8x8 rotate clockwise)*/
00206 #define row ((unsigned long long int *)data)
00207   int i,j;
00208   for(j=0;j<64;j+=64){
00209     unsigned long long int t,b;
00210     for(i=0;i<32;i++){
00211       t=row[j+i];
00212       b=row[j+32+i];
00213       row[j+i]   = (t&0x00000000ffffffffULL)      | ((b                      )<<32);
00214       row[j+32+i]=((t                      )>>32) |  (b&0xffffffff00000000ULL) ;
00215     }
00216   }
00217   for(j=0;j<64;j+=32){
00218     unsigned long long int t,b;
00219     for(i=0;i<16;i++){
00220       t=row[j+i];
00221       b=row[j+16+i];
00222       row[j+i]   = (t&0x0000ffff0000ffffULL)      | ((b&0x0000ffff0000ffffULL)<<16);
00223       row[j+16+i]=((t&0xffff0000ffff0000ULL)>>16) |  (b&0xffff0000ffff0000ULL) ;
00224     }
00225   }
00226   for(j=0;j<64;j+=16){
00227     unsigned long long int t,b;
00228     for(i=0;i<8;i++){
00229       t=row[j+i];
00230       b=row[j+8+i];
00231       row[j+i]   = (t&0x00ff00ff00ff00ffULL)     | ((b&0x00ff00ff00ff00ffULL)<<8);
00232       row[j+8+i] =((t&0xff00ff00ff00ff00ULL)>>8) |  (b&0xff00ff00ff00ff00ULL);
00233     }
00234   }
00235   for(j=0;j<64;j+=8){
00236     unsigned long long int t,b;
00237     for(i=0;i<4;i++){
00238       t=row[j+i];
00239       b=row[j+4+i];
00240       row[j+i]   =((t&0xf0f0f0f0f0f0f0f0ULL)>>4) |   (b&0xf0f0f0f0f0f0f0f0ULL);
00241       row[j+4+i] = (t&0x0f0f0f0f0f0f0f0fULL)     |  ((b&0x0f0f0f0f0f0f0f0fULL)<<4);
00242     }
00243   }
00244   for(j=0;j<64;j+=4){
00245     unsigned long long int t,b;
00246     for(i=0;i<2;i++){
00247       t=row[j+i];
00248       b=row[j+2+i];
00249       row[j+i]   =((t&0xccccccccccccccccULL)>>2) |  (b&0xccccccccccccccccULL);
00250       row[j+2+i] = (t&0x3333333333333333ULL)     | ((b&0x3333333333333333ULL)<<2);
00251     }
00252   }
00253   for(j=0;j<64;j+=2){
00254     unsigned long long int t,b;
00255     for(i=0;i<1;i++){
00256       t=row[j+i];
00257       b=row[j+1+i];
00258       row[j+i]   =((t&0xaaaaaaaaaaaaaaaaULL)>>1) |  (b&0xaaaaaaaaaaaaaaaaULL);
00259       row[j+1+i] = (t&0x5555555555555555ULL)     | ((b&0x5555555555555555ULL)<<1);
00260     }
00261   }
00262 #undef row
00263 }
00264 
00265 //64-128----------------------------------------------------------
00266 static inline void trasp64_128_88ccw(unsigned char *data){
00267 /* 64 rows of 128 bits transposition (bytes transp. - 8x8 rotate counterclockwise)*/
00268 #define halfrow ((unsigned long long int *)data)
00269   int i,j;
00270   for(j=0;j<64;j+=64){
00271     unsigned long long int t,b;
00272     for(i=0;i<32;i++){
00273       t=halfrow[2*(j+i)];
00274       b=halfrow[2*(j+32+i)];
00275       halfrow[2*(j+i)]   = (t&0x00000000ffffffffULL)      | ((b                      )<<32);
00276       halfrow[2*(j+32+i)]=((t                      )>>32) |  (b&0xffffffff00000000ULL) ;
00277       t=halfrow[2*(j+i)+1];
00278       b=halfrow[2*(j+32+i)+1];
00279       halfrow[2*(j+i)+1]   = (t&0x00000000ffffffffULL)      | ((b                      )<<32);
00280       halfrow[2*(j+32+i)+1]=((t                      )>>32) |  (b&0xffffffff00000000ULL) ;
00281     }
00282   }
00283   for(j=0;j<64;j+=32){
00284     unsigned long long int t,b;
00285     for(i=0;i<16;i++){
00286       t=halfrow[2*(j+i)];
00287       b=halfrow[2*(j+16+i)];
00288       halfrow[2*(j+i)]   = (t&0x0000ffff0000ffffULL)      | ((b&0x0000ffff0000ffffULL)<<16);
00289       halfrow[2*(j+16+i)]=((t&0xffff0000ffff0000ULL)>>16) |  (b&0xffff0000ffff0000ULL) ;
00290       t=halfrow[2*(j+i)+1];
00291       b=halfrow[2*(j+16+i)+1];
00292       halfrow[2*(j+i)+1]   = (t&0x0000ffff0000ffffULL)      | ((b&0x0000ffff0000ffffULL)<<16);
00293       halfrow[2*(j+16+i)+1]=((t&0xffff0000ffff0000ULL)>>16) |  (b&0xffff0000ffff0000ULL) ;
00294     }
00295   }
00296   for(j=0;j<64;j+=16){
00297     unsigned long long int t,b;
00298     for(i=0;i<8;i++){
00299       t=halfrow[2*(j+i)];
00300       b=halfrow[2*(j+8+i)];
00301       halfrow[2*(j+i)]   = (t&0x00ff00ff00ff00ffULL)     | ((b&0x00ff00ff00ff00ffULL)<<8);
00302       halfrow[2*(j+8+i)] =((t&0xff00ff00ff00ff00ULL)>>8) |  (b&0xff00ff00ff00ff00ULL);
00303       t=halfrow[2*(j+i)+1];
00304       b=halfrow[2*(j+8+i)+1];
00305       halfrow[2*(j+i)+1]   = (t&0x00ff00ff00ff00ffULL)     | ((b&0x00ff00ff00ff00ffULL)<<8);
00306       halfrow[2*(j+8+i)+1] =((t&0xff00ff00ff00ff00ULL)>>8) |  (b&0xff00ff00ff00ff00ULL);
00307     }
00308   }
00309   for(j=0;j<64;j+=8){
00310     unsigned long long int t,b;
00311     for(i=0;i<4;i++){
00312       t=halfrow[2*(j+i)];
00313       b=halfrow[2*(j+4+i)];
00314       halfrow[2*(j+i)]   =((t&0x0f0f0f0f0f0f0f0fULL)<<4) |  (b&0x0f0f0f0f0f0f0f0fULL);
00315       halfrow[2*(j+4+i)] = (t&0xf0f0f0f0f0f0f0f0ULL)     | ((b&0xf0f0f0f0f0f0f0f0ULL)>>4);
00316       t=halfrow[2*(j+i)+1];
00317       b=halfrow[2*(j+4+i)+1];
00318       halfrow[2*(j+i)+1]   =((t&0x0f0f0f0f0f0f0f0fULL)<<4) |  (b&0x0f0f0f0f0f0f0f0fULL);
00319       halfrow[2*(j+4+i)+1] = (t&0xf0f0f0f0f0f0f0f0ULL)     | ((b&0xf0f0f0f0f0f0f0f0ULL)>>4);
00320     }
00321   }
00322   for(j=0;j<64;j+=4){
00323     unsigned long long int t,b;
00324     for(i=0;i<2;i++){
00325       t=halfrow[2*(j+i)];
00326       b=halfrow[2*(j+2+i)];
00327       halfrow[2*(j+i)]   =((t&0x3333333333333333ULL)<<2) |  (b&0x3333333333333333ULL);
00328       halfrow[2*(j+2+i)] = (t&0xccccccccccccccccULL)     | ((b&0xccccccccccccccccULL)>>2);
00329       t=halfrow[2*(j+i)+1];
00330       b=halfrow[2*(j+2+i)+1];
00331       halfrow[2*(j+i)+1]   =((t&0x3333333333333333ULL)<<2) |  (b&0x3333333333333333ULL);
00332       halfrow[2*(j+2+i)+1] = (t&0xccccccccccccccccULL)     | ((b&0xccccccccccccccccULL)>>2);
00333     }
00334   }
00335   for(j=0;j<64;j+=2){
00336     unsigned long long int t,b;
00337     for(i=0;i<1;i++){
00338       t=halfrow[2*(j+i)];
00339       b=halfrow[2*(j+1+i)];
00340       halfrow[2*(j+i)]   =((t&0x5555555555555555ULL)<<1) |  (b&0x5555555555555555ULL);
00341       halfrow[2*(j+1+i)] = (t&0xaaaaaaaaaaaaaaaaULL)     | ((b&0xaaaaaaaaaaaaaaaaULL)>>1);
00342       t=halfrow[2*(j+i)+1];
00343       b=halfrow[2*(j+1+i)+1];
00344       halfrow[2*(j+i)+1]   =((t&0x5555555555555555ULL)<<1) |  (b&0x5555555555555555ULL);
00345       halfrow[2*(j+1+i)+1] = (t&0xaaaaaaaaaaaaaaaaULL)     | ((b&0xaaaaaaaaaaaaaaaaULL)>>1);
00346     }
00347   }
00348 #undef halfrow
00349 }
00350 
00351 static inline void trasp64_128_88cw(unsigned char *data){
00352 /* 64 rows of 128 bits transposition (bytes transp. - 8x8 rotate clockwise)*/
00353 #define halfrow ((unsigned long long int *)data)
00354   int i,j;
00355   for(j=0;j<64;j+=64){
00356     unsigned long long int t,b;
00357     for(i=0;i<32;i++){
00358       t=halfrow[2*(j+i)];
00359       b=halfrow[2*(j+32+i)];
00360       halfrow[2*(j+i)]   = (t&0x00000000ffffffffULL)      | ((b                      )<<32);
00361       halfrow[2*(j+32+i)]=((t                      )>>32) |  (b&0xffffffff00000000ULL) ;
00362       t=halfrow[2*(j+i)+1];
00363       b=halfrow[2*(j+32+i)+1];
00364       halfrow[2*(j+i)+1]   = (t&0x00000000ffffffffULL)      | ((b                      )<<32);
00365       halfrow[2*(j+32+i)+1]=((t                      )>>32) |  (b&0xffffffff00000000ULL) ;
00366     }
00367   }
00368   for(j=0;j<64;j+=32){
00369     unsigned long long int t,b;
00370     for(i=0;i<16;i++){
00371       t=halfrow[2*(j+i)];
00372       b=halfrow[2*(j+16+i)];
00373       halfrow[2*(j+i)]   = (t&0x0000ffff0000ffffULL)      | ((b&0x0000ffff0000ffffULL)<<16);
00374       halfrow[2*(j+16+i)]=((t&0xffff0000ffff0000ULL)>>16) |  (b&0xffff0000ffff0000ULL) ;
00375       t=halfrow[2*(j+i)+1];
00376       b=halfrow[2*(j+16+i)+1];
00377       halfrow[2*(j+i)+1]   = (t&0x0000ffff0000ffffULL)      | ((b&0x0000ffff0000ffffULL)<<16);
00378       halfrow[2*(j+16+i)+1]=((t&0xffff0000ffff0000ULL)>>16) |  (b&0xffff0000ffff0000ULL) ;
00379     }
00380   }
00381   for(j=0;j<64;j+=16){
00382     unsigned long long int t,b;
00383     for(i=0;i<8;i++){
00384       t=halfrow[2*(j+i)];
00385       b=halfrow[2*(j+8+i)];
00386       halfrow[2*(j+i)]   = (t&0x00ff00ff00ff00ffULL)     | ((b&0x00ff00ff00ff00ffULL)<<8);
00387       halfrow[2*(j+8+i)] =((t&0xff00ff00ff00ff00ULL)>>8) |  (b&0xff00ff00ff00ff00ULL);
00388       t=halfrow[2*(j+i)+1];
00389       b=halfrow[2*(j+8+i)+1];
00390       halfrow[2*(j+i)+1]   = (t&0x00ff00ff00ff00ffULL)     | ((b&0x00ff00ff00ff00ffULL)<<8);
00391       halfrow[2*(j+8+i)+1] =((t&0xff00ff00ff00ff00ULL)>>8) |  (b&0xff00ff00ff00ff00ULL);
00392     }
00393   }
00394   for(j=0;j<64;j+=8){
00395     unsigned long long int t,b;
00396     for(i=0;i<4;i++){
00397       t=halfrow[2*(j+i)];
00398       b=halfrow[2*(j+4+i)];
00399       halfrow[2*(j+i)]   =((t&0xf0f0f0f0f0f0f0f0ULL)>>4) |   (b&0xf0f0f0f0f0f0f0f0ULL);
00400       halfrow[2*(j+4+i)] = (t&0x0f0f0f0f0f0f0f0fULL)     |  ((b&0x0f0f0f0f0f0f0f0fULL)<<4);
00401       t=halfrow[2*(j+i)+1];
00402       b=halfrow[2*(j+4+i)+1];
00403       halfrow[2*(j+i)+1]   =((t&0xf0f0f0f0f0f0f0f0ULL)>>4) |   (b&0xf0f0f0f0f0f0f0f0ULL);
00404       halfrow[2*(j+4+i)+1] = (t&0x0f0f0f0f0f0f0f0fULL)     |  ((b&0x0f0f0f0f0f0f0f0fULL)<<4);
00405     }
00406   }
00407   for(j=0;j<64;j+=4){
00408     unsigned long long int t,b;
00409     for(i=0;i<2;i++){
00410       t=halfrow[2*(j+i)];
00411       b=halfrow[2*(j+2+i)];
00412       halfrow[2*(j+i)]   =((t&0xccccccccccccccccULL)>>2) |  (b&0xccccccccccccccccULL);
00413       halfrow[2*(j+2+i)] = (t&0x3333333333333333ULL)     | ((b&0x3333333333333333ULL)<<2);
00414       t=halfrow[2*(j+i)+1];
00415       b=halfrow[2*(j+2+i)+1];
00416       halfrow[2*(j+i)+1]   =((t&0xccccccccccccccccULL)>>2) |  (b&0xccccccccccccccccULL);
00417       halfrow[2*(j+2+i)+1] = (t&0x3333333333333333ULL)     | ((b&0x3333333333333333ULL)<<2);
00418     }
00419   }
00420   for(j=0;j<64;j+=2){
00421     unsigned long long int t,b;
00422     for(i=0;i<1;i++){
00423       t=halfrow[2*(j+i)];
00424       b=halfrow[2*(j+1+i)];
00425       halfrow[2*(j+i)]   =((t&0xaaaaaaaaaaaaaaaaULL)>>1) |  (b&0xaaaaaaaaaaaaaaaaULL);
00426       halfrow[2*(j+1+i)] = (t&0x5555555555555555ULL)     | ((b&0x5555555555555555ULL)<<1);
00427       t=halfrow[2*(j+i)+1];
00428       b=halfrow[2*(j+1+i)+1];
00429       halfrow[2*(j+i)+1]   =((t&0xaaaaaaaaaaaaaaaaULL)>>1) |  (b&0xaaaaaaaaaaaaaaaaULL);
00430       halfrow[2*(j+1+i)+1] = (t&0x5555555555555555ULL)     | ((b&0x5555555555555555ULL)<<1);
00431     }
00432   }
00433 #undef halfrow
00434 }
00435 #endif
00436 
00437 
00438 #ifdef STREAM_INIT
00439 void stream_cypher_group_init(
00440   struct stream_regs *regs,
00441   group         iA[8][4], // [In]  iA00,iA01,...iA73 32 groups  | Derived from key.
00442   group         iB[8][4], // [In]  iB00,iB01,...iB73 32 groups  | Derived from key.
00443   unsigned char *sb)      // [In]  (SB0,SB1,...SB7)...x32 32*8 bytes | Extra input.
00444 #endif
00445 #ifdef STREAM_NORMAL
00446 void stream_cypher_group_normal(
00447   struct stream_regs *regs,
00448   unsigned char *cb)    // [Out] (CB0,CB1,...CB7)...x32 32*8 bytes | Output.
00449 #endif
00450 {
00451 #ifdef STREAM_INIT
00452   group in1[4];
00453   group in2[4];
00454 #endif
00455   group extra_B[4];
00456   group fa,fb,fc,fd,fe;
00457   group s1a,s1b,s2a,s2b,s3a,s3b,s4a,s4b,s5a,s5b,s6a,s6b,s7a,s7b;
00458   group next_E[4];
00459   group tmp0,tmp1,tmp2,tmp3,tmp4;
00460 #ifdef STREAM_INIT
00461   group *sb_g=(group *)sb;
00462 #endif
00463 #ifdef STREAM_NORMAL
00464   group *cb_g=(group *)cb;
00465 #endif
00466   int aboff;
00467   int i,j,k,b;
00468   int dbg;
00469 
00470 #ifdef STREAM_INIT
00471   DBG(fprintf(stderr,":::::::::: BEGIN STREAM INIT\n"));
00472 #endif
00473 #ifdef STREAM_NORMAL
00474   DBG(fprintf(stderr,":::::::::: BEGIN STREAM NORMAL\n"));
00475 #endif
00476 #ifdef STREAM_INIT
00477 for(j=0;j<64;j++){
00478   DBG(fprintf(stderr,"precall prerot stream_in[%2i]=",j));
00479   DBG(dump_mem("",sb+BYPG*j,BYPG,BYPG));
00480 }
00481 
00482 DBG(dump_mem("stream_prerot ",sb,GROUP_PARALLELISM*8,BYPG));
00483 #if GROUP_PARALLELISM==32
00484 trasp64_32_88ccw(sb);
00485 #endif
00486 #if GROUP_PARALLELISM==64
00487 trasp64_64_88ccw(sb);
00488 #endif
00489 #if GROUP_PARALLELISM==128
00490 trasp64_128_88ccw(sb);
00491 #endif
00492 DBG(dump_mem("stream_postrot",sb,GROUP_PARALLELISM*8,BYPG));
00493 
00494 for(j=0;j<64;j++){
00495   DBG(fprintf(stderr,"precall stream_in[%2i]=",j));
00496   DBG(dump_mem("",sb+BYPG*j,BYPG,BYPG));
00497 }
00498 #endif
00499 
00500   aboff=32;
00501 
00502 #ifdef STREAM_INIT
00503   // load first 32 bits of ck into A[aboff+0]..A[aboff+7]
00504   // load last  32 bits of ck into B[aboff+0]..B[aboff+7]
00505   // all other regs = 0
00506   for(i=0;i<8;i++){
00507     for(b=0;b<4;b++){
00508 DBG(fprintf(stderr,"dbg from iA A[%i][%i]=",i,b));
00509 DBG(dump_mem("",(unsigned char *)&iA[i][b],BYPG,BYPG));
00510 DBG(fprintf(stderr,"                                       dbg from iB B[%i][%i]=",i,b));
00511 DBG(dump_mem("",(unsigned char *)&iB[i][b],BYPG,BYPG));
00512       regs->A[aboff+i][b]=iA[i][b];
00513       regs->B[aboff+i][b]=iB[i][b];
00514     }
00515   }
00516   for(b=0;b<4;b++){
00517     regs->A[aboff+8][b]=FF0();
00518     regs->A[aboff+9][b]=FF0();
00519     regs->B[aboff+8][b]=FF0();
00520     regs->B[aboff+9][b]=FF0();
00521   }
00522   for(b=0;b<4;b++){
00523     regs->X[b]=FF0();
00524     regs->Y[b]=FF0();
00525     regs->Z[b]=FF0();
00526     regs->D[b]=FF0();
00527     regs->E[b]=FF0();
00528     regs->F[b]=FF0();
00529   }
00530   regs->p=FF0();
00531   regs->q=FF0();
00532   regs->r=FF0();
00533 #endif
00534 
00535 for(dbg=0;dbg<4;dbg++){
00536   DBG(fprintf(stderr,"dbg A0[%i]=",dbg));
00537   DBG(dump_mem("",(unsigned char *)&regs->A[aboff+0][dbg],BYPG,BYPG));
00538   DBG(fprintf(stderr,"dbg B0[%i]=",dbg));
00539   DBG(dump_mem("",(unsigned char *)&regs->B[aboff+0][dbg],BYPG,BYPG));
00540 }
00541 
00543 
00544   // EXTERNAL LOOP - 8 bytes per operation
00545   for(i=0;i<8;i++){
00546 
00547     DBG(fprintf(stderr,"--BEGIN EXTERNAL LOOP %i\n",i));
00548 
00549 #ifdef STREAM_INIT
00550     for(b=0;b<4;b++){
00551       in1[b]=sb_g[8*i+4+b];
00552       in2[b]=sb_g[8*i+b];
00553     }
00554 #endif
00555 
00556     // INTERNAL LOOP - 2 bits per iteration
00557     for(j=0; j<4; j++){
00558 
00559       DBG(fprintf(stderr,"---BEGIN INTERNAL LOOP %i (EXT %i, INT %i)\n",j,i,j));
00560 
00561       // from A0..A9, 35 bits are selected as inputs to 7 s-boxes
00562       // 5 bits input per s-box, 2 bits output per s-box
00563 
00564       // we can select bits with zero masking and shifting operations
00565       // and synthetize s-boxes with optimized boolean functions.
00566       // this is the actual reason we do all the crazy transposition
00567       // stuff to switch between normal and bit slice representations.
00568       // this code really flies.
00569 
00570       fe=regs->A[aboff+3][0];fa=regs->A[aboff+0][2];fb=regs->A[aboff+5][1];fc=regs->A[aboff+6][3];fd=regs->A[aboff+8][0];
00571 /* 1000 1110  1110 0001   : lev  7: */ //tmp0=( fa^( fb^( ( ( ( fa|fb )^fc )|( fc^fd ) )^ALL_ONES ) ) );
00572 /* 1110 0010  0011 0011   : lev  6: */ //tmp1=( ( fa|fb )^( ( fc&( fa|( fb^fd ) ) )^ALL_ONES ) );
00573 /* 0011 0110  1000 1101   : lev  5: */ //tmp2=( fa^( ( fb&fd )^( ( fa&fd )|fc ) ) );
00574 /* 0101 0101  1001 0011   : lev  5: */ //tmp3=( ( fa&fc )^( fa^( ( fa&fb )|fd ) ) );
00575 /* 1000 1110  1110 0001   : lev  7: */ tmp0=FFXOR(fa,FFXOR(fb,FFXOR(FFOR(FFXOR(FFOR(fa,fb),fc),FFXOR(fc,fd)),FF1())));
00576 /* 1110 0010  0011 0011   : lev  6: */ tmp1=FFXOR(FFOR(fa,fb),FFXOR(FFAND(fc,FFOR(fa,FFXOR(fb,fd))),FF1()));
00577 /* 0011 0110  1000 1101   : lev  5: */ tmp2=FFXOR(fa,FFXOR(FFAND(fb,fd),FFOR(FFAND(fa,fd),fc)));
00578 /* 0101 0101  1001 0011   : lev  5: */ tmp3=FFXOR(FFAND(fa,fc),FFXOR(fa,FFOR(FFAND(fa,fb),fd)));
00579       s1a=FFXOR(tmp0,FFAND(fe,tmp1));
00580       s1b=FFXOR(tmp2,FFAND(fe,tmp3));
00581 //dump_mem("s1as1b-fe",&fe,BYPG,BYPG);
00582 //dump_mem("s1as1b-fa",&fa,BYPG,BYPG);
00583 //dump_mem("s1as1b-fb",&fb,BYPG,BYPG);
00584 //dump_mem("s1as1b-fc",&fc,BYPG,BYPG);
00585 //dump_mem("s1as1b-fd",&fd,BYPG,BYPG);
00586 
00587       fe=regs->A[aboff+1][1];fa=regs->A[aboff+2][2];fb=regs->A[aboff+5][3];fc=regs->A[aboff+6][0];fd=regs->A[aboff+8][1];
00588 /* 1001 1110  0110 0001   : lev  6: */ //tmp0=( fa^( ( fb&( fc|fd ) )^( fc^( fd^ALL_ONES ) ) ) );
00589 /* 0000 0011  0111 1011   : lev  5: */ //tmp1=( ( fa&( fb^fd ) )|( ( fa|fb )&fc ) );
00590 /* 1100 0110  1101 0010   : lev  6: */ //tmp2=( ( fb&fd )^( ( fa&fd )|( fb^( fc^ALL_ONES ) ) ) );
00591 /* 0001 1110  1111 0101   : lev  5: */ //tmp3=( ( fa&fd )|( fa^( fb^( fc&fd ) ) ) );
00592 /* 1001 1110  0110 0001   : lev  6: */ tmp0=FFXOR(fa,FFXOR(FFAND(fb,FFOR(fc,fd)),FFXOR(fc,FFXOR(fd,FF1()))));
00593 /* 0000 0011  0111 1011   : lev  5: */ tmp1=FFOR(FFAND(fa,FFXOR(fb,fd)),FFAND(FFOR(fa,fb),fc));
00594 /* 1100 0110  1101 0010   : lev  6: */ tmp2=FFXOR(FFAND(fb,fd),FFOR(FFAND(fa,fd),FFXOR(fb,FFXOR(fc,FF1()))));
00595 /* 0001 1110  1111 0101   : lev  5: */ tmp3=FFOR(FFAND(fa,fd),FFXOR(fa,FFXOR(fb,FFAND(fc,fd))));
00596       s2a=FFXOR(tmp0,FFAND(fe,tmp1));
00597       s2b=FFXOR(tmp2,FFAND(fe,tmp3));
00598 
00599       fe=regs->A[aboff+0][3];fa=regs->A[aboff+1][0];fb=regs->A[aboff+4][1];fc=regs->A[aboff+4][3];fd=regs->A[aboff+5][2];
00600 /* 0100 1011  1001 0110   : lev  5: */ //tmp0=( fa^( fb^( ( fc&( fa|fd ) )^fd ) ) );
00601 /* 1101 0101  1000 1100   : lev  7: */ //tmp1=( ( fa&fc )^( ( fa^fd )|( ( fb|fc )^( fd^ALL_ONES ) ) ) );
00602 /* 0010 0111  1101 1000   : lev  4: */ //tmp2=( fa^( ( ( fb^fc )&fd )^fc ) );
00603 /* 1111 1111  1111 1111   : lev  0: */ //tmp3=ALL_ONES;
00604 /* 0100 1011  1001 0110   : lev  5: */ tmp0=FFXOR(fa,FFXOR(fb,FFXOR(FFAND(fc,FFOR(fa,fd)),fd)));
00605 /* 1101 0101  1000 1100   : lev  7: */ tmp1=FFXOR(FFAND(fa,fc),FFOR(FFXOR(fa,fd),FFXOR(FFOR(fb,fc),FFXOR(fd,FF1()))));
00606 /* 0010 0111  1101 1000   : lev  4: */ tmp2=FFXOR(fa,FFXOR(FFAND(FFXOR(fb,fc),fd),fc));
00607 /* 1111 1111  1111 1111   : lev  0: */ tmp3=FF1();
00608       s3a=FFXOR(tmp0,FFAND(FFNOT(fe),tmp1));
00609       s3b=FFXOR(tmp2,FFAND(fe,tmp3));
00610 
00611       fe=regs->A[aboff+2][3];fa=regs->A[aboff+0][1];fb=regs->A[aboff+1][3];fc=regs->A[aboff+3][2];fd=regs->A[aboff+7][0];
00612 /* 1011 0101  0100 1001   : lev  7: */ //tmp0=( fa^( ( fc&( fa^fd ) )|( fb^( fc|( fd^ALL_ONES ) ) ) ) );
00613 /* 0010 1101  0110 0110   : lev  6: */ //tmp1=( ( fa&fb )^( fb^( ( ( fa|fc )&fd )^fc ) ) );
00614 /* 0110 0111  1101 0000   : lev  7: */ //tmp2=( fa^( ( fb&fc )|( ( ( fa&( fb^fd ) )|fc )^fd ) ) );
00615 /* 1111 1111  1111 1111   : lev  0: */ //tmp3=ALL_ONES;
00616 /* 1011 0101  0100 1001   : lev  7: */ tmp0=FFXOR(fa,FFOR(FFAND(fc,FFXOR(fa,fd)),FFXOR(fb,FFOR(fc,FFXOR(fd,FF1())))));
00617 /* 0010 1101  0110 0110   : lev  6: */ tmp1=FFXOR(FFAND(fa,fb),FFXOR(fb,FFXOR(FFAND(FFOR(fa,fc),fd),fc)));
00618 /* 0110 0111  1101 0000   : lev  7: */ tmp2=FFXOR(fa,FFOR(FFAND(fb,fc),FFXOR(FFOR(FFAND(fa,FFXOR(fb,fd)),fc),fd)));
00619 /* 1111 1111  1111 1111   : lev  0: */ tmp3=FF1();
00620       s4a=FFXOR(tmp0,FFAND(fe,FFXOR(tmp1,tmp0)));
00621       s4b=FFXOR(FFXOR(s4a,tmp2),FFAND(fe,tmp3));
00622 
00623       fe=regs->A[aboff+4][2];fa=regs->A[aboff+3][3];fb=regs->A[aboff+5][0];fc=regs->A[aboff+7][1];fd=regs->A[aboff+8][2];
00624 /* 1000 1111  0011 0010   : lev  7: */ //tmp0=( ( ( fa&( fb|fc ) )^fb )|( ( ( fa^fc )|fd )^ALL_ONES ) );
00625 /* 0110 1011  0000 1011   : lev  6: */ //tmp1=( fb^( ( fc^fd )&( fc^( fb|( fa^fd ) ) ) ) );
00626 /* 0001 1010  0111 1001   : lev  6: */ //tmp2=( ( fa&fc )^( fb^( ( fb|( fa^fc ) )&fd ) ) );
00627 /* 0101 1101  1101 0101   : lev  4: */ //tmp3=( ( ( fa^fb )&( fc^ALL_ONES ) )|fd );
00628 /* 1000 1111  0011 0010   : lev  7: */ tmp0=FFOR(FFXOR(FFAND(fa,FFOR(fb,fc)),fb),FFXOR(FFOR(FFXOR(fa,fc),fd),FF1()));
00629 /* 0110 1011  0000 1011   : lev  6: */ tmp1=FFXOR(fb,FFAND(FFXOR(fc,fd),FFXOR(fc,FFOR(fb,FFXOR(fa,fd)))));
00630 /* 0001 1010  0111 1001   : lev  6: */ tmp2=FFXOR(FFAND(fa,fc),FFXOR(fb,FFAND(FFOR(fb,FFXOR(fa,fc)),fd)));
00631 /* 0101 1101  1101 0101   : lev  4: */ tmp3=FFOR(FFAND(FFXOR(fa,fb),FFXOR(fc,FF1())),fd);
00632       s5a=FFXOR(tmp0,FFAND(fe,tmp1));
00633       s5b=FFXOR(tmp2,FFAND(fe,tmp3));
00634 
00635       fe=regs->A[aboff+2][1];fa=regs->A[aboff+3][1];fb=regs->A[aboff+4][0];fc=regs->A[aboff+6][2];fd=regs->A[aboff+8][3];
00636 /* 0011 0110  0010 1101   : lev  6: */ //tmp0=( ( ( fa&fc )&fd )^( ( fb&( fa|fd ) )^fc ) );
00637 /* 1110 1110  1011 1011   : lev  3: */ //tmp1=( ( ( fa^fc )&fd )^ALL_ONES );
00638 /* 0101 1000  0110 0111   : lev  6: */ //tmp2=( ( fa&( fb|fc ) )^( fb^( ( fb&fc )|fd ) ) );
00639 /* 0001 0011  0000 0001   : lev  5: */ //tmp3=( fc&( ( fa&( fb^fd ) )^( fb|fd ) ) );
00640 /* 0011 0110  0010 1101   : lev  6: */ tmp0=FFXOR(FFAND(FFAND(fa,fc),fd),FFXOR(FFAND(fb,FFOR(fa,fd)),fc));
00641 /* 1110 1110  1011 1011   : lev  3: */ tmp1=FFXOR(FFAND(FFXOR(fa,fc),fd),FF1());
00642 /* 0101 1000  0110 0111   : lev  6: */ tmp2=FFXOR(FFAND(fa,FFOR(fb,fc)),FFXOR(fb,FFOR(FFAND(fb,fc),fd)));
00643 /* 0001 0011  0000 0001   : lev  5: */ tmp3=FFAND(fc,FFXOR(FFAND(fa,FFXOR(fb,fd)),FFOR(fb,fd)));
00644       s6a=FFXOR(tmp0,FFAND(fe,tmp1));
00645       s6b=FFXOR(tmp2,FFAND(fe,tmp3));
00646 
00647       fe=regs->A[aboff+1][2];fa=regs->A[aboff+2][0];fb=regs->A[aboff+6][1];fc=regs->A[aboff+7][2];fd=regs->A[aboff+7][3];
00648 /* 0111 1000  1001 0110   : lev  5: */ //tmp0=( fb^( ( fc&fd )|( fa^( fc^fd ) ) ) );
00649 /* 0100 1001  0101 1011   : lev  6: */ //tmp1=( ( fb|fd )&( ( fa&fc )|( fb^( fc^fd ) ) ) );
00650 /* 0100 1001  1011 1001   : lev  5: */ //tmp2=( ( fa|fb )^( ( fc&( fb|fd ) )^fd ) );
00651 /* 1111 1111  1101 1101   : lev  3: */ //tmp3=( fd|( ( fa&fc )^ALL_ONES ) );
00652 /* 0111 1000  1001 0110   : lev  5: */ tmp0=FFXOR(fb,FFOR(FFAND(fc,fd),FFXOR(fa,FFXOR(fc,fd))));
00653 /* 0100 1001  0101 1011   : lev  6: */ tmp1=FFAND(FFOR(fb,fd),FFOR(FFAND(fa,fc),FFXOR(fb,FFXOR(fc,fd))));
00654 /* 0100 1001  1011 1001   : lev  5: */ tmp2=FFXOR(FFOR(fa,fb),FFXOR(FFAND(fc,FFOR(fb,fd)),fd));
00655 /* 1111 1111  1101 1101   : lev  3: */ tmp3=FFOR(fd,FFXOR(FFAND(fa,fc),FF1()));
00656       s7a=FFXOR(tmp0,FFAND(fe,tmp1));
00657       s7b=FFXOR(tmp2,FFAND(fe,tmp3));
00658 
00659 
00660 /*
00661       we have just done this:
00662       
00663       int sbox1[0x20] = {2,0,1,1,2,3,3,0, 3,2,2,0,1,1,0,3, 0,3,3,0,2,2,1,1, 2,2,0,3,1,1,3,0};
00664       int sbox2[0x20] = {3,1,0,2,2,3,3,0, 1,3,2,1,0,0,1,2, 3,1,0,3,3,2,0,2, 0,0,1,2,2,1,3,1};
00665       int sbox3[0x20] = {2,0,1,2,2,3,3,1, 1,1,0,3,3,0,2,0, 1,3,0,1,3,0,2,2, 2,0,1,2,0,3,3,1};
00666       int sbox4[0x20] = {3,1,2,3,0,2,1,2, 1,2,0,1,3,0,0,3, 1,0,3,1,2,3,0,3, 0,3,2,0,1,2,2,1};
00667       int sbox5[0x20] = {2,0,0,1,3,2,3,2, 0,1,3,3,1,0,2,1, 2,3,2,0,0,3,1,1, 1,0,3,2,3,1,0,2};
00668       int sbox6[0x20] = {0,1,2,3,1,2,2,0, 0,1,3,0,2,3,1,3, 2,3,0,2,3,0,1,1, 2,1,1,2,0,3,3,0};
00669       int sbox7[0x20] = {0,3,2,2,3,0,0,1, 3,0,1,3,1,2,2,1, 1,0,3,3,0,1,1,2, 2,3,1,0,2,3,0,2};
00670 
00671       s12 = sbox1[ (((A3>>0)&1)<<4) | (((A0>>2)&1)<<3) | (((A5>>1)&1)<<2) | (((A6>>3)&1)<<1) | (((A8>>0)&1)<<0) ]
00672            |sbox2[ (((A1>>1)&1)<<4) | (((A2>>2)&1)<<3) | (((A5>>3)&1)<<2) | (((A6>>0)&1)<<1) | (((A8>>1)&1)<<0) ];
00673       s34 = sbox3[ (((A0>>3)&1)<<4) | (((A1>>0)&1)<<3) | (((A4>>1)&1)<<2) | (((A4>>3)&1)<<1) | (((A5>>2)&1)<<0) ]
00674            |sbox4[ (((A2>>3)&1)<<4) | (((A0>>1)&1)<<3) | (((A1>>3)&1)<<2) | (((A3>>2)&1)<<1) | (((A7>>0)&1)<<0) ];
00675       s56 = sbox5[ (((A4>>2)&1)<<4) | (((A3>>3)&1)<<3) | (((A5>>0)&1)<<2) | (((A7>>1)&1)<<1) | (((A8>>2)&1)<<0) ]
00676            |sbox6[ (((A2>>1)&1)<<4) | (((A3>>1)&1)<<3) | (((A4>>0)&1)<<2) | (((A6>>2)&1)<<1) | (((A8>>3)&1)<<0) ];
00677       s7 =  sbox7[ (((A1>>2)&1)<<4) | (((A2>>0)&1)<<3) | (((A6>>1)&1)<<2) | (((A7>>2)&1)<<1) | (((A7>>3)&1)<<0) ];
00678 */
00679 
00680       // use 4x4 xor to produce extra nibble for T3
00681 
00682       extra_B[3]=FFXOR(FFXOR(FFXOR(regs->B[aboff+2][0],regs->B[aboff+5][1]),regs->B[aboff+6][2]),regs->B[aboff+8][3]);
00683       extra_B[2]=FFXOR(FFXOR(FFXOR(regs->B[aboff+5][0],regs->B[aboff+7][1]),regs->B[aboff+2][3]),regs->B[aboff+3][2]);
00684       extra_B[1]=FFXOR(FFXOR(FFXOR(regs->B[aboff+4][3],regs->B[aboff+7][2]),regs->B[aboff+3][0]),regs->B[aboff+4][1]);
00685       extra_B[0]=FFXOR(FFXOR(FFXOR(regs->B[aboff+8][2],regs->B[aboff+5][3]),regs->B[aboff+2][1]),regs->B[aboff+7][0]);
00686 for(dbg=0;dbg<4;dbg++){
00687   DBG(fprintf(stderr,"extra_B[%i]=",dbg));
00688   DBG(dump_mem("",(unsigned char *)&extra_B[dbg],BYPG,BYPG));
00689 }
00690 
00691       // T1 = xor all inputs
00692       // in1, in2, D are only used in T1 during initialisation, not generation
00693       for(b=0;b<4;b++){
00694         regs->A[aboff-1][b]=FFXOR(regs->A[aboff+9][b],regs->X[b]);
00695       }
00696 
00697 #ifdef STREAM_INIT
00698       for(b=0;b<4;b++){
00699         regs->A[aboff-1][b]=FFXOR(FFXOR(regs->A[aboff-1][b],regs->D[b]),((j % 2) ? in2[b] : in1[b]));
00700       }
00701 #endif
00702 
00703 for(dbg=0;dbg<4;dbg++){
00704   DBG(fprintf(stderr,"next_A0[%i]=",dbg));
00705   DBG(dump_mem("",(unsigned char *)&regs->A[aboff-1][dbg],BYPG,BYPG));
00706 }
00707 
00708       // T2 =  xor all inputs
00709       // in1, in2 are only used in T1 during initialisation, not generation
00710       // if p=0, use this, if p=1, rotate the result left
00711       for(b=0;b<4;b++){
00712         regs->B[aboff-1][b]=FFXOR(FFXOR(regs->B[aboff+6][b],regs->B[aboff+9][b]),regs->Y[b]);
00713       }
00714 
00715 #ifdef STREAM_INIT
00716       for(b=0;b<4;b++){
00717         regs->B[aboff-1][b]=FFXOR(regs->B[aboff-1][b],((j % 2) ? in1[b] : in2[b]));
00718       }
00719 #endif
00720 
00721 for(dbg=0;dbg<4;dbg++){
00722   DBG(fprintf(stderr,"next_B0[%i]=",dbg));
00723   DBG(dump_mem("",(unsigned char *)&regs->B[aboff-1][dbg],BYPG,BYPG));
00724 }
00725 
00726       // if p=1, rotate left (yes, this is what we're doing)
00727       tmp3=regs->B[aboff-1][3];
00728       regs->B[aboff-1][3]=FFXOR(regs->B[aboff-1][3],FFAND(FFXOR(regs->B[aboff-1][3],regs->B[aboff-1][2]),regs->p));
00729       regs->B[aboff-1][2]=FFXOR(regs->B[aboff-1][2],FFAND(FFXOR(regs->B[aboff-1][2],regs->B[aboff-1][1]),regs->p));
00730       regs->B[aboff-1][1]=FFXOR(regs->B[aboff-1][1],FFAND(FFXOR(regs->B[aboff-1][1],regs->B[aboff-1][0]),regs->p));
00731       regs->B[aboff-1][0]=FFXOR(regs->B[aboff-1][0],FFAND(FFXOR(regs->B[aboff-1][0],tmp3),regs->p));
00732 
00733 for(dbg=0;dbg<4;dbg++){
00734   DBG(fprintf(stderr,"next_B0[%i]=",dbg));
00735   DBG(dump_mem("",(unsigned char *)&regs->B[aboff-1][dbg],BYPG,BYPG));
00736 }
00737 
00738       // T3 = xor all inputs
00739       for(b=0;b<4;b++){
00740         regs->D[b]=FFXOR(FFXOR(regs->E[b],regs->Z[b]),extra_B[b]);
00741       }
00742 
00743 for(dbg=0;dbg<4;dbg++){
00744   DBG(fprintf(stderr,"D[%i]=",dbg));
00745   DBG(dump_mem("",(unsigned char *)&regs->D[dbg],BYPG,BYPG));
00746 }
00747 
00748       // T4 = sum, carry of Z + E + r
00749       for(b=0;b<4;b++){
00750         next_E[b]=regs->F[b];
00751       }
00752 
00753       tmp0=FFXOR(regs->Z[0],regs->E[0]);
00754       tmp1=FFAND(regs->Z[0],regs->E[0]);
00755       regs->F[0]=FFXOR(regs->E[0],FFAND(regs->q,FFXOR(regs->Z[0],regs->r)));
00756       tmp3=FFAND(tmp0,regs->r);
00757       tmp4=FFOR(tmp1,tmp3);
00758 
00759       tmp0=FFXOR(regs->Z[1],regs->E[1]);
00760       tmp1=FFAND(regs->Z[1],regs->E[1]);
00761       regs->F[1]=FFXOR(regs->E[1],FFAND(regs->q,FFXOR(regs->Z[1],tmp4)));
00762       tmp3=FFAND(tmp0,tmp4);
00763       tmp4=FFOR(tmp1,tmp3);
00764 
00765       tmp0=FFXOR(regs->Z[2],regs->E[2]);
00766       tmp1=FFAND(regs->Z[2],regs->E[2]);
00767       regs->F[2]=FFXOR(regs->E[2],FFAND(regs->q,FFXOR(regs->Z[2],tmp4)));
00768       tmp3=FFAND(tmp0,tmp4);
00769       tmp4=FFOR(tmp1,tmp3);
00770 
00771       tmp0=FFXOR(regs->Z[3],regs->E[3]);
00772       tmp1=FFAND(regs->Z[3],regs->E[3]);
00773       regs->F[3]=FFXOR(regs->E[3],FFAND(regs->q,FFXOR(regs->Z[3],tmp4)));
00774       tmp3=FFAND(tmp0,tmp4);
00775       regs->r=FFXOR(regs->r,FFAND(regs->q,FFXOR(FFOR(tmp1,tmp3),regs->r))); // ultimate carry
00776 
00777 /*
00778       we have just done this: (believe it or not)
00779       
00780       if (q) {
00781         F = Z + E + r;
00782         r = (F >> 4) & 1;
00783         F = F & 0x0f;
00784       }
00785       else {
00786           F = E;
00787       }
00788 */
00789       for(b=0;b<4;b++){
00790         regs->E[b]=next_E[b];
00791       }
00792 for(dbg=0;dbg<4;dbg++){
00793   DBG(fprintf(stderr,"F[%i]=",dbg));
00794   DBG(dump_mem("",(unsigned char *)&regs->F[dbg],BYPG,BYPG));
00795 }
00796 DBG(fprintf(stderr,"r="));
00797 DBG(dump_mem("",(unsigned char *)&regs->r,BYPG,BYPG));
00798 for(dbg=0;dbg<4;dbg++){
00799   DBG(fprintf(stderr,"E[%i]=",dbg));
00800   DBG(dump_mem("",(unsigned char *)&regs->E[dbg],BYPG,BYPG));
00801 }
00802 
00803       // this simple instruction is virtually shifting all the shift registers
00804       aboff--;
00805 
00806 /*
00807       we've just done this:
00808 
00809       A9=A8;A8=A7;A7=A6;A6=A5;A5=A4;A4=A3;A3=A2;A2=A1;A1=A0;A0=next_A0;
00810       B9=B8;B8=B7;B7=B6;B6=B5;B5=B4;B4=B3;B3=B2;B2=B1;B1=B0;B0=next_B0;
00811 */
00812 
00813       regs->X[0]=s1a;
00814       regs->X[1]=s2a;
00815       regs->X[2]=s3b;
00816       regs->X[3]=s4b;
00817       regs->Y[0]=s3a;
00818       regs->Y[1]=s4a;
00819       regs->Y[2]=s5b;
00820       regs->Y[3]=s6b;
00821       regs->Z[0]=s5a;
00822       regs->Z[1]=s6a;
00823       regs->Z[2]=s1b;
00824       regs->Z[3]=s2b;
00825       regs->p=s7a;
00826       regs->q=s7b;
00827 for(dbg=0;dbg<4;dbg++){
00828   DBG(fprintf(stderr,"X[%i]=",dbg));
00829   DBG(dump_mem("",(unsigned char *)&regs->X[dbg],BYPG,BYPG));
00830 }
00831 for(dbg=0;dbg<4;dbg++){
00832   DBG(fprintf(stderr,"Y[%i]=",dbg));
00833   DBG(dump_mem("",(unsigned char *)&regs->Y[dbg],BYPG,BYPG));
00834 }
00835 for(dbg=0;dbg<4;dbg++){
00836   DBG(fprintf(stderr,"Z[%i]=",dbg));
00837   DBG(dump_mem("",(unsigned char *)&regs->Z[dbg],BYPG,BYPG));
00838 }
00839 DBG(fprintf(stderr,"p="));
00840 DBG(dump_mem("",(unsigned char *)&regs->p,BYPG,BYPG));
00841 DBG(fprintf(stderr,"q="));
00842 DBG(dump_mem("",(unsigned char *)&regs->q,BYPG,BYPG));
00843 
00844 #ifdef STREAM_NORMAL
00845       // require 4 loops per output byte
00846       // 2 output bits are a function of the 4 bits of D
00847       // xor 2 by 2
00848       cb_g[8*i+7-2*j]=FFXOR(regs->D[2],regs->D[3]);
00849       cb_g[8*i+6-2*j]=FFXOR(regs->D[0],regs->D[1]);
00850 for(dbg=0;dbg<8;dbg++){
00851   DBG(fprintf(stderr,"op[%i]=",dbg));
00852   DBG(dump_mem("",(unsigned char *)&cb_g[8*i+dbg],BYPG,BYPG));
00853 }
00854 #endif
00855 
00856 DBG(fprintf(stderr,"---END INTERNAL LOOP\n"));
00857 
00858     } // INTERNAL LOOP
00859 
00860 DBG(fprintf(stderr,"--END EXTERNAL LOOP\n"));
00861 
00862   } // EXTERNAL LOOP
00863 
00864   // move 32 steps forward, ready for next call
00865   for(k=0;k<10;k++){
00866     for(b=0;b<4;b++){
00867 DBG(fprintf(stderr,"moving forward AB k=%i b=%i\n",k,b));
00868       regs->A[32+k][b]=regs->A[k][b];
00869       regs->B[32+k][b]=regs->B[k][b];
00870     }
00871   }
00872 
00873 
00875 
00876 #ifdef STREAM_NORMAL
00877 for(j=0;j<64;j++){
00878   DBG(fprintf(stderr,"postcall prerot cb[%2i]=",j));
00879   DBG(dump_mem("",(unsigned char *)(cb+BYPG*j),BYPG,BYPG));
00880 }
00881 
00882 #if GROUP_PARALLELISM==32
00883 trasp64_32_88cw(cb);
00884 #endif
00885 #if GROUP_PARALLELISM==64
00886 trasp64_64_88cw(cb);
00887 #endif
00888 #if GROUP_PARALLELISM==128
00889 trasp64_128_88cw(cb);
00890 #endif
00891 
00892 for(j=0;j<64;j++){
00893   DBG(fprintf(stderr,"postcall postrot cb[%2i]=",j));
00894   DBG(dump_mem("",(unsigned char *)(cb+BYPG*j),BYPG,BYPG));
00895 }
00896 #endif
00897 
00898 #ifdef STREAM_INIT
00899   DBG(fprintf(stderr,":::::::::: END STREAM INIT\n"));
00900 #endif
00901 #ifdef STREAM_NORMAL
00902   DBG(fprintf(stderr,":::::::::: END STREAM NORMAL\n"));
00903 #endif
00904 
00905 }
00906 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines