math/mpreduce.h: Missing include files.
[u/mdw/catacomb] / symm / serpent-sbox.h
1 /* -*-c-*-
2 *
3 * Bitslice S-box implementations
4 *
5 * (c) 2000 Straylight/Edgeware
6 */
7
8 /*----- Licensing notice --------------------------------------------------*
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.
16 *
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.
21 *
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
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; \
51 r3 ^= r0; r4 = r1; r1 &= r3; r4 ^= r2; \
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; \
61 r2 = ~r2; r4 = r1; r1 |= r0; r4 = ~r4; \
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; \
170 r1 = ~r1; r4 = r3; r2 ^= r1; r3 |= r0; \
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; \
182 r2 = ~r2; r4 = r3; r3 &= r0; r0 ^= r4; \
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; \
192 r0 ^= r2; r4 = r2; r2 &= r0; r4 ^= r3; \
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