Gather up another utility.
[u/mdw/catacomb] / serpent-sbox.h
1 /* -*-c-*-
2 *
3 * $Id: serpent-sbox.h,v 1.2 2004/04/08 01:36:15 mdw Exp $
4 *
5 * Bitslice S-box implementations
6 *
7 * (c) 2000 Straylight/Edgeware
8 */
9
10 /*----- Licensing notice --------------------------------------------------*
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.
18 *
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.
23 *
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
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; \
53 r3 ^= r0; r4 = r1; r1 &= r3; r4 ^= r2; \
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; \
63 r2 = ~r2; r4 = r1; r1 |= r0; r4 = ~r4; \
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; \
172 r1 = ~r1; r4 = r3; r2 ^= r1; r3 |= r0; \
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; \
184 r2 = ~r2; r4 = r3; r3 &= r0; r0 ^= r4; \
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; \
194 r0 ^= r2; r4 = r2; r2 &= r0; r4 ^= r3; \
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