chiark / gitweb /
configure.ac: Replace with a new version.
[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