X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/83c017f3fb115a67734e94dca02095b62cae5e80..8dd8c294e9f330eb6b975c2b96cf9bbfcd087e5e:/serpent-sbox.h diff --git a/serpent-sbox.h b/serpent-sbox.h new file mode 100644 index 0000000..7285bb2 --- /dev/null +++ b/serpent-sbox.h @@ -0,0 +1,238 @@ +/* -*-c-*- + * + * $Id: serpent-sbox.h,v 1.1 2000/06/17 12:08:43 mdw Exp $ + * + * Bitslice S-box implementations + * + * (c) 2000 Straylight/Edgeware + */ + +/*----- Licensing notice --------------------------------------------------* + * + * This file is part of Catacomb. + * + * Catacomb is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * Catacomb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with Catacomb; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + */ + +/*----- Revision history --------------------------------------------------* + * + * $Log: serpent-sbox.h,v $ + * Revision 1.1 2000/06/17 12:08:43 mdw + * New cipher. + * + */ + +/*----- Credit where it's due ---------------------------------------------* + * + * These S-box expressions are taken from the paper `Speeding up Serpent', by + * Dag Arne Osvik, submitted to AES3. + */ + +#ifndef CATACOMB_SERPENT_SBOX_H +#define CATACOMB_SERPENT_SBOX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/*----- Header files ------------------------------------------------------*/ + +#include + +/*----- Macros provided ---------------------------------------------------*/ + +/* --- @S0@ --- */ + +#define S0(r0, r1, r2, r3) do { \ + uint32 r4; \ + r3 ^= r0; r4 = r1; r1 &= r3; r4 ^= r2; \ + r1 ^= r0; r0 |= r3; r0 ^= r4; r4 ^= r3; \ + r3 ^= r2; r2 |= r1; r2 ^= r4; r4 = ~r4; \ + r4 |= r1; r1 ^= r3; r1 ^= r4; r3 |= r0; \ + r1 ^= r3; r4 ^= r3; \ + r3 = r0; r0 = r1; r1 = r4; \ +} while (0) + +#define IS0(r0, r1, r2, r3) do { \ + uint32 r4; \ + r2 = ~r2; r4 = r1; r1 |= r0; r4 = ~r4; \ + r1 ^= r2; r2 |= r4; r1 ^= r3; r0 ^= r4; \ + r2 ^= r0; r0 &= r3; r4 ^= r0; r0 |= r1; \ + r0 ^= r2; r3 ^= r4; r2 ^= r1; r3 ^= r0; \ + r3 ^= r1; r2 &= r3; r4 ^= r2; \ + r2 = r1; r1 = r4; \ +} while (0) + +/* --- @S1@ --- */ + +#define S1(r0, r1, r2, r3) do { \ + uint32 r4; \ + r0 = ~r0; r2 = ~r2; r4 = r0; r0 &= r1; \ + r2 ^= r0; r0 |= r3; r3 ^= r2; r1 ^= r0; \ + r0 ^= r4; r4 |= r1; r1 ^= r3; r2 |= r0; \ + r2 &= r4; r0 ^= r1; r1 &= r2; r1 ^= r0; \ + r0 &= r2; r0 ^= r4; \ + r4 = r0; r0 = r2; r2 = r3; r3 = r1; r1 = r4; \ +} while (0) + +#define IS1(r0, r1, r2, r3) do { \ + uint32 r4; \ + r4 = r1; r1 ^= r3; r3 &= r1; r4 ^= r2; \ + r3 ^= r0; r0 |= r1; r2 ^= r3; r0 ^= r4; \ + r0 |= r2; r1 ^= r3; r0 ^= r1; r1 |= r3; \ + r1 ^= r0; r4 = ~r4; r4 ^= r1; r1 |= r0; \ + r1 ^= r0; r1 |= r4; r3 ^= r1; \ + r1 = r0; r0 = r4; r4 = r2; r2 = r3; r3 = r4; \ +} while (0) + +/* --- @S2@ --- */ + +#define S2(r0, r1, r2, r3) do { \ + uint32 r4; \ + r4 = r0; r0 &= r2; r0 ^= r3; r2 ^= r1; \ + r2 ^= r0; r3 |= r4; r3 ^= r1; r4 ^= r2; \ + r1 = r3; r3 |= r4; r3 ^= r0; r0 &= r1; \ + r4 ^= r0; r1 ^= r3; r1 ^= r4; r4 = ~r4; \ + r0 = r2; r2 = r1; r1 = r3; r3 = r4; \ +} while (0) + +#define IS2(r0, r1, r2, r3) do { \ + uint32 r4; \ + r2 ^= r3; r3 ^= r0; r4 = r3; r3 &= r2; \ + r3 ^= r1; r1 |= r2; r1 ^= r4; r4 &= r3; \ + r2 ^= r3; r4 &= r0; r4 ^= r2; r2 &= r1; \ + r2 |= r0; r3 = ~r3; r2 ^= r3; r0 ^= r3; \ + r0 &= r1; r3 ^= r4; r3 ^= r0; \ + r0 = r1; r1 = r4; \ +} while (0) + +/* --- @S3@ --- */ + +#define S3(r0, r1, r2, r3) do { \ + uint32 r4; \ + r4 = r0; r0 |= r3; r3 ^= r1; r1 &= r4; \ + r4 ^= r2; r2 ^= r3; r3 &= r0; r4 |= r1; \ + r3 ^= r4; r0 ^= r1; r4 &= r0; r1 ^= r3; \ + r4 ^= r2; r1 |= r0; r1 ^= r2; r0 ^= r3; \ + r2 = r1; r1 |= r3; r1 ^= r0; \ + r0 = r1; r1 = r2; r2 = r3; r3 = r4; \ +} while (0) + +#define IS3(r0, r1, r2, r3) do { \ + uint32 r4; \ + r4 = r2; r2 ^= r1; r0 ^= r2; r4 &= r2; \ + r4 ^= r0; r0 &= r1; r1 ^= r3; r3 |= r4; \ + r2 ^= r3; r0 ^= r3; r1 ^= r4; r3 &= r2; \ + r3 ^= r1; r1 ^= r0; r1 |= r2; r0 ^= r3; \ + r1 ^= r4; r0 ^= r1; \ + r4 = r0; r0 = r2; r2 = r3; r3 = r4; \ +} while (0) + +/* --- @S4@ --- */ + +#define S4(r0, r1, r2, r3) do { \ + uint32 r4; \ + r1 ^= r3; r3 = ~r3; r2 ^= r3; r3 ^= r0; \ + r4 = r1; r1 &= r3; r1 ^= r2; r4 ^= r3; \ + r0 ^= r4; r2 &= r4; r2 ^= r0; r0 &= r1; \ + r3 ^= r0; r4 |= r1; r4 ^= r0; r0 |= r3; \ + r0 ^= r2; r2 &= r3; r0 = ~r0; r4 ^= r2; \ + r2 = r0; r0 = r1; r1 = r4; \ +} while (0) + +#define IS4(r0, r1, r2, r3) do { \ + uint32 r4; \ + r4 = r2; r2 &= r3; r2 ^= r1; r1 |= r3; \ + r1 &= r0; r4 ^= r2; r4 ^= r1; r1 &= r2; \ + r0 = ~r0; r3 ^= r4; r1 ^= r3; r3 &= r0; \ + r3 ^= r2; r0 ^= r1; r2 &= r0; r3 ^= r0; \ + r2 ^= r4, r2 |= r3; r3 ^= r0; r2 ^= r1; \ + r1 = r3; r3 = r4; \ +} while (0) + +/* --- @S5@ --- */ + +#define S5(r0, r1, r2, r3) do { \ + uint32 r4; \ + r0 ^= r1; r1 ^= r3; r3 = ~r3; r4 = r1; \ + r1 &= r0; r2 ^= r3; r1 ^= r2; r2 |= r4; \ + r4 ^= r3; r3 &= r1; r3 ^= r0; r4 ^= r1; \ + r4 ^= r2; r2 ^= r0; r0 &= r3; r2 = ~r2; \ + r0 ^= r4; r4 |= r3; r2 ^= r4; \ + r4 = r3; r3 = r2; r2 = r0; r0 = r1; r1 = r4; \ +} while (0) + +#define IS5(r0, r1, r2, r3) do { \ + uint32 r4; \ + r1 = ~r1; r4 = r3; r2 ^= r1; r3 |= r0; \ + r3 ^= r2; r2 |= r1; r2 &= r0; r4 ^= r3; \ + r2 ^= r4; r4 |= r0; r4 ^= r1; r1 &= r2; \ + r1 ^= r3; r4 ^= r2; r3 &= r4; r4 ^= r1; \ + r3 ^= r4; r4 = ~r4; r3 ^= r0; \ + r0 = r1; r1 = r4; r4 = r3; r3 = r2; r2 = r4; \ +} while (0) + +/* --- @S6@ --- */ + +#define S6(r0, r1, r2, r3) do { \ + uint32 r4; \ + r2 = ~r2; r4 = r3; r3 &= r0; r0 ^= r4; \ + r3 ^= r2; r2 |= r4; r1 ^= r3; r2 ^= r0; \ + r0 |= r1; r2 ^= r1; r4 ^= r0; r0 |= r3; \ + r0 ^= r2; r4 ^= r3; r4 ^= r0; r3 = ~r3; \ + r2 &= r4; r2 ^= r3; \ + r3 = r2; r2 = r4; \ +} while (0) + +#define IS6(r0, r1, r2, r3) do { \ + uint32 r4; \ + r0 ^= r2; r4 = r2; r2 &= r0; r4 ^= r3; \ + r2 = ~r2; r3 ^= r1; r2 ^= r3; r4 |= r0; \ + r0 ^= r2; r3 ^= r4; r4 ^= r1; r1 &= r3; \ + r1 ^= r0; r0 ^= r3; r0 |= r2; r3 ^= r1; \ + r4 ^= r0; \ + r0 = r1; r1 = r2; r2 = r4; \ +} while (0) + +/* --- @S7@ --- */ + +#define S7(r0, r1, r2, r3) do { \ + uint32 r4; \ + r4 = r1; r1 |= r2; r1 ^= r3; r4 ^= r2; \ + r2 ^= r1; r3 |= r4; r3 &= r0; r4 ^= r2; \ + r3 ^= r1; r1 |= r4; r1 ^= r0; r0 |= r4; \ + r0 ^= r2; r1 ^= r4; r2 ^= r1; r1 &= r0; \ + r1 ^= r4; r2 = ~r2; r2 |= r0; r4 ^= r2; \ + r2 = r1; r1 = r3; r3 = r0; r0 = r4; \ +} while (0) + +#define IS7(r0, r1, r2, r3) do { \ + uint32 r4; \ + r4 = r2; r2 ^= r0; r0 &= r3; r4 |= r3; \ + r2 = ~r2; r3 ^= r1; r1 |= r0; r0 ^= r2; \ + r2 &= r4; r3 &= r4; r1 ^= r2; r2 ^= r0; \ + r0 |= r2; r4 ^= r1; r0 ^= r3; r3 ^= r4; \ + r4 |= r0; r3 ^= r2; r4 ^= r2; \ + r2 = r1; r1 = r0; r0 = r3; r3 = r4; \ +} while (0) + +/*----- That's all, folks -------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif