Renamed from `rsa-decrypt', since the name was no longer appropriate.
[u/mdw/catacomb] / serpent-sbox.h
CommitLineData
8dd8c294 1/* -*-c-*-
2 *
3 * $Id: serpent-sbox.h,v 1.1 2000/06/17 12:08:43 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/*----- Revision history --------------------------------------------------*
31 *
32 * $Log: serpent-sbox.h,v $
33 * Revision 1.1 2000/06/17 12:08:43 mdw
34 * New cipher.
35 *
36 */
37
38/*----- Credit where it's due ---------------------------------------------*
39 *
40 * These S-box expressions are taken from the paper `Speeding up Serpent', by
41 * Dag Arne Osvik, submitted to AES3.
42 */
43
44#ifndef CATACOMB_SERPENT_SBOX_H
45#define CATACOMB_SERPENT_SBOX_H
46
47#ifdef __cplusplus
48 extern "C" {
49#endif
50
51/*----- Header files ------------------------------------------------------*/
52
53#include <mLib/bits.h>
54
55/*----- Macros provided ---------------------------------------------------*/
56
57/* --- @S0@ --- */
58
59#define S0(r0, r1, r2, r3) do { \
60 uint32 r4; \
61 r3 ^= r0; r4 = r1; r1 &= r3; r4 ^= r2; \
62 r1 ^= r0; r0 |= r3; r0 ^= r4; r4 ^= r3; \
63 r3 ^= r2; r2 |= r1; r2 ^= r4; r4 = ~r4; \
64 r4 |= r1; r1 ^= r3; r1 ^= r4; r3 |= r0; \
65 r1 ^= r3; r4 ^= r3; \
66 r3 = r0; r0 = r1; r1 = r4; \
67} while (0)
68
69#define IS0(r0, r1, r2, r3) do { \
70 uint32 r4; \
71 r2 = ~r2; r4 = r1; r1 |= r0; r4 = ~r4; \
72 r1 ^= r2; r2 |= r4; r1 ^= r3; r0 ^= r4; \
73 r2 ^= r0; r0 &= r3; r4 ^= r0; r0 |= r1; \
74 r0 ^= r2; r3 ^= r4; r2 ^= r1; r3 ^= r0; \
75 r3 ^= r1; r2 &= r3; r4 ^= r2; \
76 r2 = r1; r1 = r4; \
77} while (0)
78
79/* --- @S1@ --- */
80
81#define S1(r0, r1, r2, r3) do { \
82 uint32 r4; \
83 r0 = ~r0; r2 = ~r2; r4 = r0; r0 &= r1; \
84 r2 ^= r0; r0 |= r3; r3 ^= r2; r1 ^= r0; \
85 r0 ^= r4; r4 |= r1; r1 ^= r3; r2 |= r0; \
86 r2 &= r4; r0 ^= r1; r1 &= r2; r1 ^= r0; \
87 r0 &= r2; r0 ^= r4; \
88 r4 = r0; r0 = r2; r2 = r3; r3 = r1; r1 = r4; \
89} while (0)
90
91#define IS1(r0, r1, r2, r3) do { \
92 uint32 r4; \
93 r4 = r1; r1 ^= r3; r3 &= r1; r4 ^= r2; \
94 r3 ^= r0; r0 |= r1; r2 ^= r3; r0 ^= r4; \
95 r0 |= r2; r1 ^= r3; r0 ^= r1; r1 |= r3; \
96 r1 ^= r0; r4 = ~r4; r4 ^= r1; r1 |= r0; \
97 r1 ^= r0; r1 |= r4; r3 ^= r1; \
98 r1 = r0; r0 = r4; r4 = r2; r2 = r3; r3 = r4; \
99} while (0)
100
101/* --- @S2@ --- */
102
103#define S2(r0, r1, r2, r3) do { \
104 uint32 r4; \
105 r4 = r0; r0 &= r2; r0 ^= r3; r2 ^= r1; \
106 r2 ^= r0; r3 |= r4; r3 ^= r1; r4 ^= r2; \
107 r1 = r3; r3 |= r4; r3 ^= r0; r0 &= r1; \
108 r4 ^= r0; r1 ^= r3; r1 ^= r4; r4 = ~r4; \
109 r0 = r2; r2 = r1; r1 = r3; r3 = r4; \
110} while (0)
111
112#define IS2(r0, r1, r2, r3) do { \
113 uint32 r4; \
114 r2 ^= r3; r3 ^= r0; r4 = r3; r3 &= r2; \
115 r3 ^= r1; r1 |= r2; r1 ^= r4; r4 &= r3; \
116 r2 ^= r3; r4 &= r0; r4 ^= r2; r2 &= r1; \
117 r2 |= r0; r3 = ~r3; r2 ^= r3; r0 ^= r3; \
118 r0 &= r1; r3 ^= r4; r3 ^= r0; \
119 r0 = r1; r1 = r4; \
120} while (0)
121
122/* --- @S3@ --- */
123
124#define S3(r0, r1, r2, r3) do { \
125 uint32 r4; \
126 r4 = r0; r0 |= r3; r3 ^= r1; r1 &= r4; \
127 r4 ^= r2; r2 ^= r3; r3 &= r0; r4 |= r1; \
128 r3 ^= r4; r0 ^= r1; r4 &= r0; r1 ^= r3; \
129 r4 ^= r2; r1 |= r0; r1 ^= r2; r0 ^= r3; \
130 r2 = r1; r1 |= r3; r1 ^= r0; \
131 r0 = r1; r1 = r2; r2 = r3; r3 = r4; \
132} while (0)
133
134#define IS3(r0, r1, r2, r3) do { \
135 uint32 r4; \
136 r4 = r2; r2 ^= r1; r0 ^= r2; r4 &= r2; \
137 r4 ^= r0; r0 &= r1; r1 ^= r3; r3 |= r4; \
138 r2 ^= r3; r0 ^= r3; r1 ^= r4; r3 &= r2; \
139 r3 ^= r1; r1 ^= r0; r1 |= r2; r0 ^= r3; \
140 r1 ^= r4; r0 ^= r1; \
141 r4 = r0; r0 = r2; r2 = r3; r3 = r4; \
142} while (0)
143
144/* --- @S4@ --- */
145
146#define S4(r0, r1, r2, r3) do { \
147 uint32 r4; \
148 r1 ^= r3; r3 = ~r3; r2 ^= r3; r3 ^= r0; \
149 r4 = r1; r1 &= r3; r1 ^= r2; r4 ^= r3; \
150 r0 ^= r4; r2 &= r4; r2 ^= r0; r0 &= r1; \
151 r3 ^= r0; r4 |= r1; r4 ^= r0; r0 |= r3; \
152 r0 ^= r2; r2 &= r3; r0 = ~r0; r4 ^= r2; \
153 r2 = r0; r0 = r1; r1 = r4; \
154} while (0)
155
156#define IS4(r0, r1, r2, r3) do { \
157 uint32 r4; \
158 r4 = r2; r2 &= r3; r2 ^= r1; r1 |= r3; \
159 r1 &= r0; r4 ^= r2; r4 ^= r1; r1 &= r2; \
160 r0 = ~r0; r3 ^= r4; r1 ^= r3; r3 &= r0; \
161 r3 ^= r2; r0 ^= r1; r2 &= r0; r3 ^= r0; \
162 r2 ^= r4, r2 |= r3; r3 ^= r0; r2 ^= r1; \
163 r1 = r3; r3 = r4; \
164} while (0)
165
166/* --- @S5@ --- */
167
168#define S5(r0, r1, r2, r3) do { \
169 uint32 r4; \
170 r0 ^= r1; r1 ^= r3; r3 = ~r3; r4 = r1; \
171 r1 &= r0; r2 ^= r3; r1 ^= r2; r2 |= r4; \
172 r4 ^= r3; r3 &= r1; r3 ^= r0; r4 ^= r1; \
173 r4 ^= r2; r2 ^= r0; r0 &= r3; r2 = ~r2; \
174 r0 ^= r4; r4 |= r3; r2 ^= r4; \
175 r4 = r3; r3 = r2; r2 = r0; r0 = r1; r1 = r4; \
176} while (0)
177
178#define IS5(r0, r1, r2, r3) do { \
179 uint32 r4; \
180 r1 = ~r1; r4 = r3; r2 ^= r1; r3 |= r0; \
181 r3 ^= r2; r2 |= r1; r2 &= r0; r4 ^= r3; \
182 r2 ^= r4; r4 |= r0; r4 ^= r1; r1 &= r2; \
183 r1 ^= r3; r4 ^= r2; r3 &= r4; r4 ^= r1; \
184 r3 ^= r4; r4 = ~r4; r3 ^= r0; \
185 r0 = r1; r1 = r4; r4 = r3; r3 = r2; r2 = r4; \
186} while (0)
187
188/* --- @S6@ --- */
189
190#define S6(r0, r1, r2, r3) do { \
191 uint32 r4; \
192 r2 = ~r2; r4 = r3; r3 &= r0; r0 ^= r4; \
193 r3 ^= r2; r2 |= r4; r1 ^= r3; r2 ^= r0; \
194 r0 |= r1; r2 ^= r1; r4 ^= r0; r0 |= r3; \
195 r0 ^= r2; r4 ^= r3; r4 ^= r0; r3 = ~r3; \
196 r2 &= r4; r2 ^= r3; \
197 r3 = r2; r2 = r4; \
198} while (0)
199
200#define IS6(r0, r1, r2, r3) do { \
201 uint32 r4; \
202 r0 ^= r2; r4 = r2; r2 &= r0; r4 ^= r3; \
203 r2 = ~r2; r3 ^= r1; r2 ^= r3; r4 |= r0; \
204 r0 ^= r2; r3 ^= r4; r4 ^= r1; r1 &= r3; \
205 r1 ^= r0; r0 ^= r3; r0 |= r2; r3 ^= r1; \
206 r4 ^= r0; \
207 r0 = r1; r1 = r2; r2 = r4; \
208} while (0)
209
210/* --- @S7@ --- */
211
212#define S7(r0, r1, r2, r3) do { \
213 uint32 r4; \
214 r4 = r1; r1 |= r2; r1 ^= r3; r4 ^= r2; \
215 r2 ^= r1; r3 |= r4; r3 &= r0; r4 ^= r2; \
216 r3 ^= r1; r1 |= r4; r1 ^= r0; r0 |= r4; \
217 r0 ^= r2; r1 ^= r4; r2 ^= r1; r1 &= r0; \
218 r1 ^= r4; r2 = ~r2; r2 |= r0; r4 ^= r2; \
219 r2 = r1; r1 = r3; r3 = r0; r0 = r4; \
220} while (0)
221
222#define IS7(r0, r1, r2, r3) do { \
223 uint32 r4; \
224 r4 = r2; r2 ^= r0; r0 &= r3; r4 |= r3; \
225 r2 = ~r2; r3 ^= r1; r1 |= r0; r0 ^= r2; \
226 r2 &= r4; r3 &= r4; r1 ^= r2; r2 ^= r0; \
227 r0 |= r2; r4 ^= r1; r0 ^= r3; r3 ^= r4; \
228 r4 |= r0; r3 ^= r2; r4 ^= r2; \
229 r2 = r1; r1 = r0; r0 = r3; r3 = r4; \
230} while (0)
231
232/*----- That's all, folks -------------------------------------------------*/
233
234#ifdef __cplusplus
235 }
236#endif
237
238#endif