Botan
1.11.15
|
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