chiark / gitweb /
math/gfx-sqr.c: Use bithacking rather than a table for squaring.
[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