Merge branch 'master' of git.distorted.org.uk:~mdw/publish/public-git/catacomb
[u/mdw/catacomb] / serpent-sbox.h
CommitLineData
8dd8c294 1/* -*-c-*-
2 *
b817bfc6 3 * $Id: serpent-sbox.h,v 1.2 2004/04/08 01:36:15 mdw Exp $
8dd8c294 4 *
5 * Bitslice S-box implementations
6 *
7 * (c) 2000 Straylight/Edgeware
8 */
9
45c0fd36 10/*----- Licensing notice --------------------------------------------------*
8dd8c294 11 *
12 * This file is part of Catacomb.
13 *
14 * Catacomb is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU Library General Public License as
16 * published by the Free Software Foundation; either version 2 of the
17 * License, or (at your option) any later version.
45c0fd36 18 *
8dd8c294 19 * Catacomb is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU Library General Public License for more details.
45c0fd36 23 *
8dd8c294 24 * You should have received a copy of the GNU Library General Public
25 * License along with Catacomb; if not, write to the Free
26 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
27 * MA 02111-1307, USA.
28 */
29
8dd8c294 30/*----- Credit where it's due ---------------------------------------------*
31 *
32 * These S-box expressions are taken from the paper `Speeding up Serpent', by
33 * Dag Arne Osvik, submitted to AES3.
34 */
35
36#ifndef CATACOMB_SERPENT_SBOX_H
37#define CATACOMB_SERPENT_SBOX_H
38
39#ifdef __cplusplus
40 extern "C" {
41#endif
42
43/*----- Header files ------------------------------------------------------*/
44
45#include <mLib/bits.h>
46
47/*----- Macros provided ---------------------------------------------------*/
48
49/* --- @S0@ --- */
50
51#define S0(r0, r1, r2, r3) do { \
52 uint32 r4; \
45c0fd36 53 r3 ^= r0; r4 = r1; r1 &= r3; r4 ^= r2; \
8dd8c294 54 r1 ^= r0; r0 |= r3; r0 ^= r4; r4 ^= r3; \
55 r3 ^= r2; r2 |= r1; r2 ^= r4; r4 = ~r4; \
56 r4 |= r1; r1 ^= r3; r1 ^= r4; r3 |= r0; \
57 r1 ^= r3; r4 ^= r3; \
58 r3 = r0; r0 = r1; r1 = r4; \
59} while (0)
60
61#define IS0(r0, r1, r2, r3) do { \
62 uint32 r4; \
45c0fd36 63 r2 = ~r2; r4 = r1; r1 |= r0; r4 = ~r4; \
8dd8c294 64 r1 ^= r2; r2 |= r4; r1 ^= r3; r0 ^= r4; \
65 r2 ^= r0; r0 &= r3; r4 ^= r0; r0 |= r1; \
66 r0 ^= r2; r3 ^= r4; r2 ^= r1; r3 ^= r0; \
67 r3 ^= r1; r2 &= r3; r4 ^= r2; \
68 r2 = r1; r1 = r4; \
69} while (0)
70
71/* --- @S1@ --- */
72
73#define S1(r0, r1, r2, r3) do { \
74 uint32 r4; \
75 r0 = ~r0; r2 = ~r2; r4 = r0; r0 &= r1; \
76 r2 ^= r0; r0 |= r3; r3 ^= r2; r1 ^= r0; \
77 r0 ^= r4; r4 |= r1; r1 ^= r3; r2 |= r0; \
78 r2 &= r4; r0 ^= r1; r1 &= r2; r1 ^= r0; \
79 r0 &= r2; r0 ^= r4; \
80 r4 = r0; r0 = r2; r2 = r3; r3 = r1; r1 = r4; \
81} while (0)
82
83#define IS1(r0, r1, r2, r3) do { \
84 uint32 r4; \
85 r4 = r1; r1 ^= r3; r3 &= r1; r4 ^= r2; \
86 r3 ^= r0; r0 |= r1; r2 ^= r3; r0 ^= r4; \
87 r0 |= r2; r1 ^= r3; r0 ^= r1; r1 |= r3; \
88 r1 ^= r0; r4 = ~r4; r4 ^= r1; r1 |= r0; \
89 r1 ^= r0; r1 |= r4; r3 ^= r1; \
90 r1 = r0; r0 = r4; r4 = r2; r2 = r3; r3 = r4; \
91} while (0)
92
93/* --- @S2@ --- */
94
95#define S2(r0, r1, r2, r3) do { \
96 uint32 r4; \
97 r4 = r0; r0 &= r2; r0 ^= r3; r2 ^= r1; \
98 r2 ^= r0; r3 |= r4; r3 ^= r1; r4 ^= r2; \
99 r1 = r3; r3 |= r4; r3 ^= r0; r0 &= r1; \
100 r4 ^= r0; r1 ^= r3; r1 ^= r4; r4 = ~r4; \
101 r0 = r2; r2 = r1; r1 = r3; r3 = r4; \
102} while (0)
103
104#define IS2(r0, r1, r2, r3) do { \
105 uint32 r4; \
106 r2 ^= r3; r3 ^= r0; r4 = r3; r3 &= r2; \
107 r3 ^= r1; r1 |= r2; r1 ^= r4; r4 &= r3; \
108 r2 ^= r3; r4 &= r0; r4 ^= r2; r2 &= r1; \
109 r2 |= r0; r3 = ~r3; r2 ^= r3; r0 ^= r3; \
110 r0 &= r1; r3 ^= r4; r3 ^= r0; \
111 r0 = r1; r1 = r4; \
112} while (0)
113
114/* --- @S3@ --- */
115
116#define S3(r0, r1, r2, r3) do { \
117 uint32 r4; \
118 r4 = r0; r0 |= r3; r3 ^= r1; r1 &= r4; \
119 r4 ^= r2; r2 ^= r3; r3 &= r0; r4 |= r1; \
120 r3 ^= r4; r0 ^= r1; r4 &= r0; r1 ^= r3; \
121 r4 ^= r2; r1 |= r0; r1 ^= r2; r0 ^= r3; \
122 r2 = r1; r1 |= r3; r1 ^= r0; \
123 r0 = r1; r1 = r2; r2 = r3; r3 = r4; \
124} while (0)
125
126#define IS3(r0, r1, r2, r3) do { \
127 uint32 r4; \
128 r4 = r2; r2 ^= r1; r0 ^= r2; r4 &= r2; \
129 r4 ^= r0; r0 &= r1; r1 ^= r3; r3 |= r4; \
130 r2 ^= r3; r0 ^= r3; r1 ^= r4; r3 &= r2; \
131 r3 ^= r1; r1 ^= r0; r1 |= r2; r0 ^= r3; \
132 r1 ^= r4; r0 ^= r1; \
133 r4 = r0; r0 = r2; r2 = r3; r3 = r4; \
134} while (0)
135
136/* --- @S4@ --- */
137
138#define S4(r0, r1, r2, r3) do { \
139 uint32 r4; \
140 r1 ^= r3; r3 = ~r3; r2 ^= r3; r3 ^= r0; \
141 r4 = r1; r1 &= r3; r1 ^= r2; r4 ^= r3; \
142 r0 ^= r4; r2 &= r4; r2 ^= r0; r0 &= r1; \
143 r3 ^= r0; r4 |= r1; r4 ^= r0; r0 |= r3; \
144 r0 ^= r2; r2 &= r3; r0 = ~r0; r4 ^= r2; \
145 r2 = r0; r0 = r1; r1 = r4; \
146} while (0)
147
148#define IS4(r0, r1, r2, r3) do { \
149 uint32 r4; \
150 r4 = r2; r2 &= r3; r2 ^= r1; r1 |= r3; \
151 r1 &= r0; r4 ^= r2; r4 ^= r1; r1 &= r2; \
152 r0 = ~r0; r3 ^= r4; r1 ^= r3; r3 &= r0; \
153 r3 ^= r2; r0 ^= r1; r2 &= r0; r3 ^= r0; \
154 r2 ^= r4, r2 |= r3; r3 ^= r0; r2 ^= r1; \
155 r1 = r3; r3 = r4; \
156} while (0)
157
158/* --- @S5@ --- */
159
160#define S5(r0, r1, r2, r3) do { \
161 uint32 r4; \
162 r0 ^= r1; r1 ^= r3; r3 = ~r3; r4 = r1; \
163 r1 &= r0; r2 ^= r3; r1 ^= r2; r2 |= r4; \
164 r4 ^= r3; r3 &= r1; r3 ^= r0; r4 ^= r1; \
165 r4 ^= r2; r2 ^= r0; r0 &= r3; r2 = ~r2; \
166 r0 ^= r4; r4 |= r3; r2 ^= r4; \
167 r4 = r3; r3 = r2; r2 = r0; r0 = r1; r1 = r4; \
168} while (0)
169
170#define IS5(r0, r1, r2, r3) do { \
171 uint32 r4; \
45c0fd36 172 r1 = ~r1; r4 = r3; r2 ^= r1; r3 |= r0; \
8dd8c294 173 r3 ^= r2; r2 |= r1; r2 &= r0; r4 ^= r3; \
174 r2 ^= r4; r4 |= r0; r4 ^= r1; r1 &= r2; \
175 r1 ^= r3; r4 ^= r2; r3 &= r4; r4 ^= r1; \
176 r3 ^= r4; r4 = ~r4; r3 ^= r0; \
177 r0 = r1; r1 = r4; r4 = r3; r3 = r2; r2 = r4; \
178} while (0)
179
180/* --- @S6@ --- */
181
182#define S6(r0, r1, r2, r3) do { \
183 uint32 r4; \
45c0fd36 184 r2 = ~r2; r4 = r3; r3 &= r0; r0 ^= r4; \
8dd8c294 185 r3 ^= r2; r2 |= r4; r1 ^= r3; r2 ^= r0; \
186 r0 |= r1; r2 ^= r1; r4 ^= r0; r0 |= r3; \
187 r0 ^= r2; r4 ^= r3; r4 ^= r0; r3 = ~r3; \
188 r2 &= r4; r2 ^= r3; \
189 r3 = r2; r2 = r4; \
190} while (0)
191
192#define IS6(r0, r1, r2, r3) do { \
193 uint32 r4; \
45c0fd36 194 r0 ^= r2; r4 = r2; r2 &= r0; r4 ^= r3; \
8dd8c294 195 r2 = ~r2; r3 ^= r1; r2 ^= r3; r4 |= r0; \
196 r0 ^= r2; r3 ^= r4; r4 ^= r1; r1 &= r3; \
197 r1 ^= r0; r0 ^= r3; r0 |= r2; r3 ^= r1; \
198 r4 ^= r0; \
199 r0 = r1; r1 = r2; r2 = r4; \
200} while (0)
201
202/* --- @S7@ --- */
203
204#define S7(r0, r1, r2, r3) do { \
205 uint32 r4; \
206 r4 = r1; r1 |= r2; r1 ^= r3; r4 ^= r2; \
207 r2 ^= r1; r3 |= r4; r3 &= r0; r4 ^= r2; \
208 r3 ^= r1; r1 |= r4; r1 ^= r0; r0 |= r4; \
209 r0 ^= r2; r1 ^= r4; r2 ^= r1; r1 &= r0; \
210 r1 ^= r4; r2 = ~r2; r2 |= r0; r4 ^= r2; \
211 r2 = r1; r1 = r3; r3 = r0; r0 = r4; \
212} while (0)
213
214#define IS7(r0, r1, r2, r3) do { \
215 uint32 r4; \
216 r4 = r2; r2 ^= r0; r0 &= r3; r4 |= r3; \
217 r2 = ~r2; r3 ^= r1; r1 |= r0; r0 ^= r2; \
218 r2 &= r4; r3 &= r4; r1 ^= r2; r2 ^= r0; \
219 r0 |= r2; r4 ^= r1; r0 ^= r3; r3 ^= r4; \
220 r4 |= r0; r3 ^= r2; r4 ^= r2; \
221 r2 = r1; r1 = r0; r0 = r3; r3 = r4; \
222} while (0)
223
224/*----- That's all, folks -------------------------------------------------*/
225
226#ifdef __cplusplus
227 }
228#endif
229
230#endif