chiark / gitweb /
Version bump.
[catacomb] / serpent-sbox.h
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