|
SASC-NG
DVBSoftCAM
|
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 *)®s->A[aboff+0][dbg],BYPG,BYPG)); 00538 DBG(fprintf(stderr,"dbg B0[%i]=",dbg)); 00539 DBG(dump_mem("",(unsigned char *)®s->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 *)®s->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 *)®s->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 *)®s->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 *)®s->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 *)®s->F[dbg],BYPG,BYPG)); 00795 } 00796 DBG(fprintf(stderr,"r=")); 00797 DBG(dump_mem("",(unsigned char *)®s->r,BYPG,BYPG)); 00798 for(dbg=0;dbg<4;dbg++){ 00799 DBG(fprintf(stderr,"E[%i]=",dbg)); 00800 DBG(dump_mem("",(unsigned char *)®s->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 *)®s->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 *)®s->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 *)®s->Z[dbg],BYPG,BYPG)); 00838 } 00839 DBG(fprintf(stderr,"p=")); 00840 DBG(dump_mem("",(unsigned char *)®s->p,BYPG,BYPG)); 00841 DBG(fprintf(stderr,"q=")); 00842 DBG(dump_mem("",(unsigned char *)®s->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