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