Botan  1.11.15
src/lib/block/serpent/serpent_sbox.h
Go to the documentation of this file.
00001 /*
00002 * Serpent SBox Expressions
00003 * (C) 1999-2007,2013 Jack Lloyd
00004 *
00005 * The sbox expressions used here were discovered by Dag Arne Osvik and
00006 * are described in his paper "Speeding Up Serpent".
00007 *
00008 * Botan is released under the Simplified BSD License (see license.txt)
00009 */
00010 
00011 #ifndef BOTAN_SERPENT_SBOX_H__
00012 #define BOTAN_SERPENT_SBOX_H__
00013 
00014 #define SBoxE1(B0, B1, B2, B3)                    \
00015    do {                                           \
00016       B3 ^= B0;                                   \
00017       auto B4 = B1;                               \
00018       B1 &= B3;                                   \
00019       B4 ^= B2;                                   \
00020       B1 ^= B0;                                   \
00021       B0 |= B3;                                   \
00022       B0 ^= B4;                                   \
00023       B4 ^= B3;                                   \
00024       B3 ^= B2;                                   \
00025       B2 |= B1;                                   \
00026       B2 ^= B4;                                   \
00027       B4 = ~B4;                                   \
00028       B4 |= B1;                                   \
00029       B1 ^= B3;                                   \
00030       B1 ^= B4;                                   \
00031       B3 |= B0;                                   \
00032       B1 ^= B3;                                   \
00033       B4 ^= B3;                                   \
00034       B3 = B0;                                    \
00035       B0 = B1;                                    \
00036       B1 = B4;                                    \
00037    } while(0);
00038 
00039 #define SBoxE2(B0, B1, B2, B3)                    \
00040    do {                                           \
00041       B0 = ~B0;                                   \
00042       B2 = ~B2;                                   \
00043       auto B4 = B0;                               \
00044       B0 &= B1;                                   \
00045       B2 ^= B0;                                   \
00046       B0 |= B3;                                   \
00047       B3 ^= B2;                                   \
00048       B1 ^= B0;                                   \
00049       B0 ^= B4;                                   \
00050       B4 |= B1;                                   \
00051       B1 ^= B3;                                   \
00052       B2 |= B0;                                   \
00053       B2 &= B4;                                   \
00054       B0 ^= B1;                                   \
00055       B1 &= B2;                                   \
00056       B1 ^= B0;                                   \
00057       B0 &= B2;                                   \
00058       B4 ^= B0;                                   \
00059       B0 = B2;                                    \
00060       B2 = B3;                                    \
00061       B3 = B1;                                    \
00062       B1 = B4;                                    \
00063    } while(0);
00064 
00065 #define SBoxE3(B0, B1, B2, B3)                    \
00066    do {                                           \
00067       auto B4 = B0;                               \
00068       B0 &= B2;                                   \
00069       B0 ^= B3;                                   \
00070       B2 ^= B1;                                   \
00071       B2 ^= B0;                                   \
00072       B3 |= B4;                                   \
00073       B3 ^= B1;                                   \
00074       B4 ^= B2;                                   \
00075       B1 = B3;                                    \
00076       B3 |= B4;                                   \
00077       B3 ^= B0;                                   \
00078       B0 &= B1;                                   \
00079       B4 ^= B0;                                   \
00080       B1 ^= B3;                                   \
00081       B1 ^= B4;                                   \
00082       B0 = B2;                                    \
00083       B2 = B1;                                    \
00084       B1 = B3;                                    \
00085       B3 = ~B4;                                   \
00086    } while(0);
00087 
00088 #define SBoxE4(B0, B1, B2, B3)                    \
00089    do {                                           \
00090       auto B4 = B0;                               \
00091       B0 |= B3;                                   \
00092       B3 ^= B1;                                   \
00093       B1 &= B4;                                   \
00094       B4 ^= B2;                                   \
00095       B2 ^= B3;                                   \
00096       B3 &= B0;                                   \
00097       B4 |= B1;                                   \
00098       B3 ^= B4;                                   \
00099       B0 ^= B1;                                   \
00100       B4 &= B0;                                   \
00101       B1 ^= B3;                                   \
00102       B4 ^= B2;                                   \
00103       B1 |= B0;                                   \
00104       B1 ^= B2;                                   \
00105       B0 ^= B3;                                   \
00106       B2 = B1;                                    \
00107       B1 |= B3;                                   \
00108       B0 ^= B1;                                   \
00109       B1 = B2;                                    \
00110       B2 = B3;                                    \
00111       B3 = B4;                                    \
00112    } while(0);
00113 
00114 #define SBoxE5(B0, B1, B2, B3)                    \
00115    do {                                           \
00116       B1 ^= B3;                                   \
00117       B3 = ~B3;                                   \
00118       B2 ^= B3;                                   \
00119       B3 ^= B0;                                   \
00120       auto B4 = B1;                               \
00121       B1 &= B3;                                   \
00122       B1 ^= B2;                                   \
00123       B4 ^= B3;                                   \
00124       B0 ^= B4;                                   \
00125       B2 &= B4;                                   \
00126       B2 ^= B0;                                   \
00127       B0 &= B1;                                   \
00128       B3 ^= B0;                                   \
00129       B4 |= B1;                                   \
00130       B4 ^= B0;                                   \
00131       B0 |= B3;                                   \
00132       B0 ^= B2;                                   \
00133       B2 &= B3;                                   \
00134       B0 = ~B0;                                   \
00135       B4 ^= B2;                                   \
00136       B2 = B0;                                    \
00137       B0 = B1;                                    \
00138       B1 = B4;                                    \
00139    } while(0);
00140 
00141 #define SBoxE6(B0, B1, B2, B3)                    \
00142    do {                                           \
00143       B0 ^= B1;                                   \
00144       B1 ^= B3;                                   \
00145       B3 = ~B3;                                   \
00146       auto B4 = B1;                               \
00147       B1 &= B0;                                   \
00148       B2 ^= B3;                                   \
00149       B1 ^= B2;                                   \
00150       B2 |= B4;                                   \
00151       B4 ^= B3;                                   \
00152       B3 &= B1;                                   \
00153       B3 ^= B0;                                   \
00154       B4 ^= B1;                                   \
00155       B4 ^= B2;                                   \
00156       B2 ^= B0;                                   \
00157       B0 &= B3;                                   \
00158       B2 = ~B2;                                   \
00159       B0 ^= B4;                                   \
00160       B4 |= B3;                                   \
00161       B4 ^= B2;                                   \
00162       B2 = B0;                                    \
00163       B0 = B1;                                    \
00164       B1 = B3;                                    \
00165       B3 = B4;                                    \
00166    } while(0);
00167 
00168 #define SBoxE7(B0, B1, B2, B3)                    \
00169    do {                                           \
00170       B2 = ~B2;                                   \
00171       auto B4 = B3;                               \
00172       B3 &= B0;                                   \
00173       B0 ^= B4;                                   \
00174       B3 ^= B2;                                   \
00175       B2 |= B4;                                   \
00176       B1 ^= B3;                                   \
00177       B2 ^= B0;                                   \
00178       B0 |= B1;                                   \
00179       B2 ^= B1;                                   \
00180       B4 ^= B0;                                   \
00181       B0 |= B3;                                   \
00182       B0 ^= B2;                                   \
00183       B4 ^= B3;                                   \
00184       B4 ^= B0;                                   \
00185       B3 = ~B3;                                   \
00186       B2 &= B4;                                   \
00187       B3 ^= B2;                                   \
00188       B2 = B4;                                    \
00189    } while(0);
00190 
00191 #define SBoxE8(B0, B1, B2, B3)                    \
00192    do {                                           \
00193       auto B4 = B1;                               \
00194       B1 |= B2;                                   \
00195       B1 ^= B3;                                   \
00196       B4 ^= B2;                                   \
00197       B2 ^= B1;                                   \
00198       B3 |= B4;                                   \
00199       B3 &= B0;                                   \
00200       B4 ^= B2;                                   \
00201       B3 ^= B1;                                   \
00202       B1 |= B4;                                   \
00203       B1 ^= B0;                                   \
00204       B0 |= B4;                                   \
00205       B0 ^= B2;                                   \
00206       B1 ^= B4;                                   \
00207       B2 ^= B1;                                   \
00208       B1 &= B0;                                   \
00209       B1 ^= B4;                                   \
00210       B2 = ~B2;                                   \
00211       B2 |= B0;                                   \
00212       B4 ^= B2;                                   \
00213       B2 = B1;                                    \
00214       B1 = B3;                                    \
00215       B3 = B0;                                    \
00216       B0 = B4;                                    \
00217    } while(0);
00218 
00219 #define SBoxD1(B0, B1, B2, B3)                    \
00220    do {                                           \
00221       B2 = ~B2;                                   \
00222       auto B4 = B1;                               \
00223       B1 |= B0;                                   \
00224       B4 = ~B4;                                   \
00225       B1 ^= B2;                                   \
00226       B2 |= B4;                                   \
00227       B1 ^= B3;                                   \
00228       B0 ^= B4;                                   \
00229       B2 ^= B0;                                   \
00230       B0 &= B3;                                   \
00231       B4 ^= B0;                                   \
00232       B0 |= B1;                                   \
00233       B0 ^= B2;                                   \
00234       B3 ^= B4;                                   \
00235       B2 ^= B1;                                   \
00236       B3 ^= B0;                                   \
00237       B3 ^= B1;                                   \
00238       B2 &= B3;                                   \
00239       B4 ^= B2;                                   \
00240       B2 = B1;                                    \
00241       B1 = B4;                                    \
00242       } while(0);
00243 
00244 #define SBoxD2(B0, B1, B2, B3)                    \
00245    do {                                           \
00246       auto B4 = B1;                               \
00247       B1 ^= B3;                                   \
00248       B3 &= B1;                                   \
00249       B4 ^= B2;                                   \
00250       B3 ^= B0;                                   \
00251       B0 |= B1;                                   \
00252       B2 ^= B3;                                   \
00253       B0 ^= B4;                                   \
00254       B0 |= B2;                                   \
00255       B1 ^= B3;                                   \
00256       B0 ^= B1;                                   \
00257       B1 |= B3;                                   \
00258       B1 ^= B0;                                   \
00259       B4 = ~B4;                                   \
00260       B4 ^= B1;                                   \
00261       B1 |= B0;                                   \
00262       B1 ^= B0;                                   \
00263       B1 |= B4;                                   \
00264       B3 ^= B1;                                   \
00265       B1 = B0;                                    \
00266       B0 = B4;                                    \
00267       B4 = B2;                                    \
00268       B2 = B3;                                    \
00269       B3 = B4;                                    \
00270       } while(0);
00271 
00272 #define SBoxD3(B0, B1, B2, B3)                    \
00273    do {                                           \
00274       B2 ^= B3;                                   \
00275       B3 ^= B0;                                   \
00276       auto B4 = B3;                               \
00277       B3 &= B2;                                   \
00278       B3 ^= B1;                                   \
00279       B1 |= B2;                                   \
00280       B1 ^= B4;                                   \
00281       B4 &= B3;                                   \
00282       B2 ^= B3;                                   \
00283       B4 &= B0;                                   \
00284       B4 ^= B2;                                   \
00285       B2 &= B1;                                   \
00286       B2 |= B0;                                   \
00287       B3 = ~B3;                                   \
00288       B2 ^= B3;                                   \
00289       B0 ^= B3;                                   \
00290       B0 &= B1;                                   \
00291       B3 ^= B4;                                   \
00292       B3 ^= B0;                                   \
00293       B0 = B1;                                    \
00294       B1 = B4;                                    \
00295       } while(0);
00296 
00297 #define SBoxD4(B0, B1, B2, B3)                    \
00298    do {                                           \
00299       auto B4 = B2;                               \
00300       B2 ^= B1;                                   \
00301       B0 ^= B2;                                   \
00302       B4 &= B2;                                   \
00303       B4 ^= B0;                                   \
00304       B0 &= B1;                                   \
00305       B1 ^= B3;                                   \
00306       B3 |= B4;                                   \
00307       B2 ^= B3;                                   \
00308       B0 ^= B3;                                   \
00309       B1 ^= B4;                                   \
00310       B3 &= B2;                                   \
00311       B3 ^= B1;                                   \
00312       B1 ^= B0;                                   \
00313       B1 |= B2;                                   \
00314       B0 ^= B3;                                   \
00315       B1 ^= B4;                                   \
00316       B0 ^= B1;                                   \
00317       B4 = B0;                                    \
00318       B0 = B2;                                    \
00319       B2 = B3;                                    \
00320       B3 = B4;                                    \
00321       } while(0);
00322 
00323 #define SBoxD5(B0, B1, B2, B3)                    \
00324    do {                                           \
00325       auto B4 = B2;                               \
00326       B2 &= B3;                                   \
00327       B2 ^= B1;                                   \
00328       B1 |= B3;                                   \
00329       B1 &= B0;                                   \
00330       B4 ^= B2;                                   \
00331       B4 ^= B1;                                   \
00332       B1 &= B2;                                   \
00333       B0 = ~B0;                                   \
00334       B3 ^= B4;                                   \
00335       B1 ^= B3;                                   \
00336       B3 &= B0;                                   \
00337       B3 ^= B2;                                   \
00338       B0 ^= B1;                                   \
00339       B2 &= B0;                                   \
00340       B3 ^= B0;                                   \
00341       B2 ^= B4;                                   \
00342       B2 |= B3;                                   \
00343       B3 ^= B0;                                   \
00344       B2 ^= B1;                                   \
00345       B1 = B3;                                    \
00346       B3 = B4;                                    \
00347       } while(0);
00348 
00349 #define SBoxD6(B0, B1, B2, B3)                    \
00350    do {                                           \
00351       B1 = ~B1;                                   \
00352       auto B4 = B3;                               \
00353       B2 ^= B1;                                   \
00354       B3 |= B0;                                   \
00355       B3 ^= B2;                                   \
00356       B2 |= B1;                                   \
00357       B2 &= B0;                                   \
00358       B4 ^= B3;                                   \
00359       B2 ^= B4;                                   \
00360       B4 |= B0;                                   \
00361       B4 ^= B1;                                   \
00362       B1 &= B2;                                   \
00363       B1 ^= B3;                                   \
00364       B4 ^= B2;                                   \
00365       B3 &= B4;                                   \
00366       B4 ^= B1;                                   \
00367       B3 ^= B4;                                   \
00368       B4 = ~B4;                                   \
00369       B3 ^= B0;                                   \
00370       B0 = B1;                                    \
00371       B1 = B4;                                    \
00372       B4 = B3;                                    \
00373       B3 = B2;                                    \
00374       B2 = B4;                                    \
00375       } while(0);
00376 
00377 #define SBoxD7(B0, B1, B2, B3)                    \
00378    do {                                           \
00379       B0 ^= B2;                                   \
00380       auto B4 = B2;                               \
00381       B2 &= B0;                                   \
00382       B4 ^= B3;                                   \
00383       B2 = ~B2;                                   \
00384       B3 ^= B1;                                   \
00385       B2 ^= B3;                                   \
00386       B4 |= B0;                                   \
00387       B0 ^= B2;                                   \
00388       B3 ^= B4;                                   \
00389       B4 ^= B1;                                   \
00390       B1 &= B3;                                   \
00391       B1 ^= B0;                                   \
00392       B0 ^= B3;                                   \
00393       B0 |= B2;                                   \
00394       B3 ^= B1;                                   \
00395       B4 ^= B0;                                   \
00396       B0 = B1;                                    \
00397       B1 = B2;                                    \
00398       B2 = B4;                                    \
00399       } while(0);
00400 
00401 #define SBoxD8(B0, B1, B2, B3)                    \
00402    do {                                           \
00403       auto B4 = B2;                               \
00404       B2 ^= B0;                                   \
00405       B0 &= B3;                                   \
00406       B4 |= B3;                                   \
00407       B2 = ~B2;                                   \
00408       B3 ^= B1;                                   \
00409       B1 |= B0;                                   \
00410       B0 ^= B2;                                   \
00411       B2 &= B4;                                   \
00412       B3 &= B4;                                   \
00413       B1 ^= B2;                                   \
00414       B2 ^= B0;                                   \
00415       B0 |= B2;                                   \
00416       B4 ^= B1;                                   \
00417       B0 ^= B3;                                   \
00418       B3 ^= B4;                                   \
00419       B4 |= B0;                                   \
00420       B3 ^= B2;                                   \
00421       B4 ^= B2;                                   \
00422       B2 = B1;                                    \
00423       B1 = B0;                                    \
00424       B0 = B3;                                    \
00425       B3 = B4;                                    \
00426       } while(0);
00427 
00428 #endif