|
SASC
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 struct group_t{ 00022 unsigned char s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16; 00023 }; 00024 typedef struct group_t group; 00025 00026 #define GROUP_PARALLELISM 128 00027 00028 group static inline FF0(){ 00029 group res; 00030 res.s1=0x0; 00031 res.s2=0x0; 00032 res.s3=0x0; 00033 res.s4=0x0; 00034 res.s5=0x0; 00035 res.s6=0x0; 00036 res.s7=0x0; 00037 res.s8=0x0; 00038 res.s9=0x0; 00039 res.s10=0x0; 00040 res.s11=0x0; 00041 res.s12=0x0; 00042 res.s13=0x0; 00043 res.s14=0x0; 00044 res.s15=0x0; 00045 res.s16=0x0; 00046 return res; 00047 } 00048 00049 group static inline FF1(){ 00050 group res; 00051 res.s1=0xff; 00052 res.s2=0xff; 00053 res.s3=0xff; 00054 res.s4=0xff; 00055 res.s5=0xff; 00056 res.s6=0xff; 00057 res.s7=0xff; 00058 res.s8=0xff; 00059 res.s9=0xff; 00060 res.s10=0xff; 00061 res.s11=0xff; 00062 res.s12=0xff; 00063 res.s13=0xff; 00064 res.s14=0xff; 00065 res.s15=0xff; 00066 res.s16=0xff; 00067 return res; 00068 } 00069 00070 group static inline FFAND(group a,group b){ 00071 group res; 00072 res.s1=a.s1&b.s1; 00073 res.s2=a.s2&b.s2; 00074 res.s3=a.s3&b.s3; 00075 res.s4=a.s4&b.s4; 00076 res.s5=a.s5&b.s5; 00077 res.s6=a.s6&b.s6; 00078 res.s7=a.s7&b.s7; 00079 res.s8=a.s8&b.s8; 00080 res.s9=a.s9&b.s9; 00081 res.s10=a.s10&b.s10; 00082 res.s11=a.s11&b.s11; 00083 res.s12=a.s12&b.s12; 00084 res.s13=a.s13&b.s13; 00085 res.s14=a.s14&b.s14; 00086 res.s15=a.s15&b.s15; 00087 res.s16=a.s16&b.s16; 00088 return res; 00089 } 00090 00091 group static inline FFOR(group a,group b){ 00092 group res; 00093 res.s1=a.s1|b.s1; 00094 res.s2=a.s2|b.s2; 00095 res.s3=a.s3|b.s3; 00096 res.s4=a.s4|b.s4; 00097 res.s5=a.s5|b.s5; 00098 res.s6=a.s6|b.s6; 00099 res.s7=a.s7|b.s7; 00100 res.s8=a.s8|b.s8; 00101 res.s9=a.s9|b.s9; 00102 res.s10=a.s10|b.s10; 00103 res.s11=a.s11|b.s11; 00104 res.s12=a.s12|b.s12; 00105 res.s13=a.s13|b.s13; 00106 res.s14=a.s14|b.s14; 00107 res.s15=a.s15|b.s15; 00108 res.s16=a.s16|b.s16; 00109 return res; 00110 } 00111 00112 group static inline FFXOR(group a,group b){ 00113 group res; 00114 res.s1=a.s1^b.s1; 00115 res.s2=a.s2^b.s2; 00116 res.s3=a.s3^b.s3; 00117 res.s4=a.s4^b.s4; 00118 res.s5=a.s5^b.s5; 00119 res.s6=a.s6^b.s6; 00120 res.s7=a.s7^b.s7; 00121 res.s8=a.s8^b.s8; 00122 res.s9=a.s9^b.s9; 00123 res.s10=a.s10^b.s10; 00124 res.s11=a.s11^b.s11; 00125 res.s12=a.s12^b.s12; 00126 res.s13=a.s13^b.s13; 00127 res.s14=a.s14^b.s14; 00128 res.s15=a.s15^b.s15; 00129 res.s16=a.s16^b.s16; 00130 return res; 00131 } 00132 00133 group static inline FFNOT(group a){ 00134 group res; 00135 res.s1=~a.s1; 00136 res.s2=~a.s2; 00137 res.s3=~a.s3; 00138 res.s4=~a.s4; 00139 res.s5=~a.s5; 00140 res.s6=~a.s6; 00141 res.s7=~a.s7; 00142 res.s8=~a.s8; 00143 res.s9=~a.s9; 00144 res.s10=~a.s10; 00145 res.s11=~a.s11; 00146 res.s12=~a.s12; 00147 res.s13=~a.s13; 00148 res.s14=~a.s14; 00149 res.s15=~a.s15; 00150 res.s16=~a.s16; 00151 return res; 00152 } 00153 00154 00155 /* 64 rows of 128 bits */ 00156 00157 void static inline FFTABLEIN(unsigned char *tab, int g, unsigned char *data){ 00158 *(((int *)tab)+2*g)=*((int *)data); 00159 *(((int *)tab)+2*g+1)=*(((int *)data)+1); 00160 } 00161 00162 void static inline FFTABLEOUT(unsigned char *data, unsigned char *tab, int g){ 00163 *((int *)data)=*(((int *)tab)+2*g); 00164 *(((int *)data)+1)=*(((int *)tab)+2*g+1); 00165 } 00166 00167 void static inline FFTABLEOUTXORNBY(int n, unsigned char *data, unsigned char *tab, int g){ 00168 int j; 00169 for(j=0;j<n;j++){ 00170 *(data+j)^=*(tab+8*g+j); 00171 } 00172 } 00173 00174 00175 struct batch_t{ 00176 unsigned char s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16; 00177 }; 00178 typedef struct batch_t batch; 00179 00180 #define BYTES_PER_BATCH 16 00181 00182 batch static inline B_FFAND(batch a,batch b){ 00183 batch res; 00184 res.s1=a.s1&b.s1; 00185 res.s2=a.s2&b.s2; 00186 res.s3=a.s3&b.s3; 00187 res.s4=a.s4&b.s4; 00188 res.s5=a.s5&b.s5; 00189 res.s6=a.s6&b.s6; 00190 res.s7=a.s7&b.s7; 00191 res.s8=a.s8&b.s8; 00192 res.s9=a.s9&b.s9; 00193 res.s10=a.s10&b.s10; 00194 res.s11=a.s11&b.s11; 00195 res.s12=a.s12&b.s12; 00196 res.s13=a.s13&b.s13; 00197 res.s14=a.s14&b.s14; 00198 res.s15=a.s15&b.s15; 00199 res.s16=a.s16&b.s16; 00200 return res; 00201 } 00202 00203 batch static inline B_FFOR(batch a,batch b){ 00204 batch res; 00205 res.s1=a.s1|b.s1; 00206 res.s2=a.s2|b.s2; 00207 res.s3=a.s3|b.s3; 00208 res.s4=a.s4|b.s4; 00209 res.s5=a.s5|b.s5; 00210 res.s6=a.s6|b.s6; 00211 res.s7=a.s7|b.s7; 00212 res.s8=a.s8|b.s8; 00213 res.s9=a.s9|b.s9; 00214 res.s10=a.s10|b.s10; 00215 res.s11=a.s11|b.s11; 00216 res.s12=a.s12|b.s12; 00217 res.s13=a.s13|b.s13; 00218 res.s14=a.s14|b.s14; 00219 res.s15=a.s15|b.s15; 00220 res.s16=a.s16|b.s16; 00221 return res; 00222 } 00223 00224 batch static inline B_FFXOR(batch a,batch b){ 00225 batch res; 00226 res.s1=a.s1^b.s1; 00227 res.s2=a.s2^b.s2; 00228 res.s3=a.s3^b.s3; 00229 res.s4=a.s4^b.s4; 00230 res.s5=a.s5^b.s5; 00231 res.s6=a.s6^b.s6; 00232 res.s7=a.s7^b.s7; 00233 res.s8=a.s8^b.s8; 00234 res.s9=a.s9^b.s9; 00235 res.s10=a.s10^b.s10; 00236 res.s11=a.s11^b.s11; 00237 res.s12=a.s12^b.s12; 00238 res.s13=a.s13^b.s13; 00239 res.s14=a.s14^b.s14; 00240 res.s15=a.s15^b.s15; 00241 res.s16=a.s16^b.s16; 00242 return res; 00243 } 00244 00245 00246 batch static inline B_FFN_ALL_29(){ 00247 batch res; 00248 res.s1=0x29; 00249 res.s2=0x29; 00250 res.s3=0x29; 00251 res.s4=0x29; 00252 res.s5=0x29; 00253 res.s6=0x29; 00254 res.s7=0x29; 00255 res.s8=0x29; 00256 res.s9=0x29; 00257 res.s10=0x29; 00258 res.s11=0x29; 00259 res.s12=0x29; 00260 res.s13=0x29; 00261 res.s14=0x29; 00262 res.s15=0x29; 00263 res.s16=0x29; 00264 return res; 00265 } 00266 batch static inline B_FFN_ALL_02(){ 00267 batch res; 00268 res.s1=0x02; 00269 res.s2=0x02; 00270 res.s3=0x02; 00271 res.s4=0x02; 00272 res.s5=0x02; 00273 res.s6=0x02; 00274 res.s7=0x02; 00275 res.s8=0x02; 00276 res.s9=0x02; 00277 res.s10=0x02; 00278 res.s11=0x02; 00279 res.s12=0x02; 00280 res.s13=0x02; 00281 res.s14=0x02; 00282 res.s15=0x02; 00283 res.s16=0x02; 00284 return res; 00285 } 00286 batch static inline B_FFN_ALL_04(){ 00287 batch res; 00288 res.s1=0x04; 00289 res.s2=0x04; 00290 res.s3=0x04; 00291 res.s4=0x04; 00292 res.s5=0x04; 00293 res.s6=0x04; 00294 res.s7=0x04; 00295 res.s8=0x04; 00296 res.s9=0x04; 00297 res.s10=0x04; 00298 res.s11=0x04; 00299 res.s12=0x04; 00300 res.s13=0x04; 00301 res.s14=0x04; 00302 res.s15=0x04; 00303 res.s16=0x04; 00304 return res; 00305 } 00306 batch static inline B_FFN_ALL_10(){ 00307 batch res; 00308 res.s1=0x10; 00309 res.s2=0x10; 00310 res.s3=0x10; 00311 res.s4=0x10; 00312 res.s5=0x10; 00313 res.s6=0x10; 00314 res.s7=0x10; 00315 res.s8=0x10; 00316 res.s9=0x10; 00317 res.s10=0x10; 00318 res.s11=0x10; 00319 res.s12=0x10; 00320 res.s13=0x10; 00321 res.s14=0x10; 00322 res.s15=0x10; 00323 res.s16=0x10; 00324 return res; 00325 } 00326 batch static inline B_FFN_ALL_40(){ 00327 batch res; 00328 res.s1=0x40; 00329 res.s2=0x40; 00330 res.s3=0x40; 00331 res.s4=0x40; 00332 res.s5=0x40; 00333 res.s6=0x40; 00334 res.s7=0x40; 00335 res.s8=0x40; 00336 res.s9=0x40; 00337 res.s10=0x40; 00338 res.s11=0x40; 00339 res.s12=0x40; 00340 res.s13=0x40; 00341 res.s14=0x40; 00342 res.s15=0x40; 00343 res.s16=0x40; 00344 return res; 00345 } 00346 batch static inline B_FFN_ALL_80(){ 00347 batch res; 00348 res.s1=0x80; 00349 res.s2=0x80; 00350 res.s3=0x80; 00351 res.s4=0x80; 00352 res.s5=0x80; 00353 res.s6=0x80; 00354 res.s7=0x80; 00355 res.s8=0x80; 00356 res.s9=0x80; 00357 res.s10=0x80; 00358 res.s11=0x80; 00359 res.s12=0x80; 00360 res.s13=0x80; 00361 res.s14=0x80; 00362 res.s15=0x80; 00363 res.s16=0x80; 00364 return res; 00365 } 00366 00367 batch static inline B_FFSH8L(batch a,int n){ 00368 batch res; 00369 res.s1=a.s1<<n; 00370 res.s2=a.s2<<n; 00371 res.s3=a.s3<<n; 00372 res.s4=a.s4<<n; 00373 res.s5=a.s5<<n; 00374 res.s6=a.s6<<n; 00375 res.s7=a.s7<<n; 00376 res.s8=a.s8<<n; 00377 res.s9=a.s9<<n; 00378 res.s10=a.s10<<n; 00379 res.s11=a.s11<<n; 00380 res.s12=a.s12<<n; 00381 res.s13=a.s13<<n; 00382 res.s14=a.s14<<n; 00383 res.s15=a.s15<<n; 00384 res.s16=a.s16<<n; 00385 return res; 00386 } 00387 00388 batch static inline B_FFSH8R(batch a,int n){ 00389 batch res; 00390 res.s1=a.s1>>n; 00391 res.s2=a.s2>>n; 00392 res.s3=a.s3>>n; 00393 res.s4=a.s4>>n; 00394 res.s5=a.s5>>n; 00395 res.s6=a.s6>>n; 00396 res.s7=a.s7>>n; 00397 res.s8=a.s8>>n; 00398 res.s9=a.s9>>n; 00399 res.s10=a.s10>>n; 00400 res.s11=a.s11>>n; 00401 res.s12=a.s12>>n; 00402 res.s13=a.s13>>n; 00403 res.s14=a.s14>>n; 00404 res.s15=a.s15>>n; 00405 res.s16=a.s16>>n; 00406 return res; 00407 } 00408 00409 00410 void static inline M_EMPTY(void){ 00411 }