Rearrange the file tree.
[u/mdw/catacomb] / symm / twofish.c
1 /* -*-c-*-
2 *
3 * Implementation of the Twofish cipher
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 /*----- Header files ------------------------------------------------------*/
29
30 #include <assert.h>
31
32 #include <mLib/bits.h>
33
34 #include "blkc.h"
35 #include "gcipher.h"
36 #include "twofish.h"
37 #include "twofish-tab.h"
38 #include "paranoia.h"
39
40 /*----- Global variables --------------------------------------------------*/
41
42 const octet twofish_keysz[] = { KSZ_RANGE, TWOFISH_KEYSZ, 0, 32, 1 };
43
44 /*----- Important tables --------------------------------------------------*/
45
46 static const octet q0[256] = TWOFISH_Q0, q1[256] = TWOFISH_Q1;
47 static const uint32 qmds[4][256] = TWOFISH_QMDS;
48 static const octet rslog[] = TWOFISH_RSLOG, rsexp[] = TWOFISH_RSEXP;
49 static const octet rs[32] = TWOFISH_RS;
50
51 /*----- Key initialization ------------------------------------------------*/
52
53 /* --- @h@ --- *
54 *
55 * Arguments: @uint32 x@ = input to the function
56 * @const uint32 *l@ = key values to mix in
57 * @unsigned k@ = number of key values there are
58 *
59 * Returns: The output of the function @h@.
60 *
61 * Use: Implements the Twofish function @h@.
62 */
63
64 static uint32 h(uint32 x, const uint32 *l, unsigned k)
65 {
66 /* --- Apply a series of @q@ tables to an integer --- */
67
68 # define Q(x, qa, qb, qc, qd) \
69 ((qa[((x) >> 0) & 0xff] << 0) | \
70 (qb[((x) >> 8) & 0xff] << 8) | \
71 (qc[((x) >> 16) & 0xff] << 16) | \
72 (qd[((x) >> 24) & 0xff] << 24))
73
74 /* --- Grind through the tables --- */
75
76 switch (k) {
77 case 4: x = Q(x, q1, q0, q0, q1) ^ l[3];
78 case 3: x = Q(x, q1, q1, q0, q0) ^ l[2];
79 case 2: x = Q(x, q0, q1, q0, q1) ^ l[1];
80 x = Q(x, q0, q0, q1, q1) ^ l[0];
81 break;
82 }
83
84 #undef Q
85
86 /* --- Apply the MDS matrix --- */
87
88 return (qmds[0][U8(x >> 0)] ^ qmds[1][U8(x >> 8)] ^
89 qmds[2][U8(x >> 16)] ^ qmds[3][U8(x >> 24)]);
90 }
91
92 /* --- @twofish_initfk@ --- *
93 *
94 * Arguments: @twofish_ctx *k@ = pointer to key block to fill in
95 * @const void *buf@ = pointer to buffer of key material
96 * @size_t sz@ = size of key material
97 * @const twofish_fk *fk@ = family-key information
98 *
99 * Returns: ---
100 *
101 * Use: Does the underlying Twofish key initialization with family
102 * key. Pass in a family-key structure initialized to
103 * all-bits-zero for a standard key schedule.
104 */
105
106 void twofish_initfk(twofish_ctx *k, const void *buf, size_t sz,
107 const twofish_fk *fk)
108 {
109 # define KMAX 4
110
111 uint32 mo[KMAX], me[KMAX];
112 octet s[4][KMAX];
113
114 /* --- Expand the key into the three word arrays --- */
115
116 {
117 size_t ssz;
118 const octet *p, *q;
119 octet b[32];
120 int i;
121
122 /* --- Sort out the key size --- */
123
124 KSZ_ASSERT(twofish, sz);
125 if (sz <= 16)
126 ssz = 16;
127 else if (sz <= 24)
128 ssz = 24;
129 else if (sz <= 32)
130 ssz = 32;
131 else
132 assert(((void)"This can't happen (bad key size in twofish_init)", 0));
133
134 /* --- Extend the key if necessary --- */
135
136 if (sz == ssz)
137 p = buf;
138 else {
139 memcpy(b, buf, sz);
140 memset(b + sz, 0, ssz - sz);
141 p = b;
142 }
143
144 /* --- Finally get the word count --- */
145
146 sz = ssz / 8;
147
148 /* --- Extract words from the key --- *
149 *
150 * The @s@ table, constructed using the Reed-Solomon matrix, is cut into
151 * sequences of bytes, since this is actually more useful for computing
152 * the S-boxes.
153 */
154
155 q = p;
156 for (i = 0; i < sz; i++) {
157 octet ss[4];
158 const octet *r = rs;
159 int j;
160
161 /* --- Extract the easy subkeys --- */
162
163 me[i] = LOAD32_L(q) ^ fk->t0[2 * i];
164 mo[i] = LOAD32_L(q + 4) ^ fk->t0[2 * i + 1];
165
166 /* --- Now do the Reed-Solomon thing --- */
167
168 for (j = 0; j < 4; j++) {
169 const octet *qq = q;
170 unsigned a = 0;
171 int k;
172
173 for (k = 0; k < 8; k++) {
174 unsigned char x = *qq ^ fk->t1[i * 8 + k];
175 if (x) a ^= rsexp[rslog[x] + *r];
176 qq++;
177 r++;
178 }
179
180 s[j][sz - 1 - i] = ss[j] = a;
181 }
182 q += 8;
183 }
184
185 /* --- Clear away the temporary buffer --- */
186
187 if (p == b)
188 BURN(b);
189 }
190
191 /* --- Construct the expanded key --- */
192
193 {
194 uint32 p = 0x01010101;
195 uint32 ip = 0;
196 int i;
197
198 for (i = 0; i < 40; i += 2) {
199 uint32 a, b;
200 a = h(ip, me, sz);
201 b = h(ip + p, mo, sz);
202 b = ROL32(b, 8);
203 a += b; b += a;
204 k->k[i] = U32(a);
205 k->k[i + 1] = ROL32(b, 9);
206 ip += 2 * p;
207 }
208
209 for (i = 0; i < 8; i++)
210 k->k[i] ^= fk->t23[i];
211 for (i = 8; i < 40; i += 2) {
212 k->k[i] ^= fk->t4[0];
213 k->k[i + 1] ^= fk->t4[1];
214 }
215 }
216
217 /* --- Construct the S-box tables --- */
218
219 {
220 unsigned i;
221 static const octet *q[4][KMAX + 1] = {
222 { q1, q0, q0, q1, q1 },
223 { q0, q0, q1, q1, q0 },
224 { q1, q1, q0, q0, q0 },
225 { q0, q1, q1, q0, q1 }
226 };
227
228 for (i = 0; i < 4; i++) {
229 unsigned j;
230 uint32 x;
231
232 for (j = 0; j < 256; j++) {
233 x = j;
234
235 /* --- Push the byte through the q tables --- */
236
237 switch (sz) {
238 case 4: x = q[i][4][x] ^ s[i][3];
239 case 3: x = q[i][3][x] ^ s[i][2];
240 case 2: x = q[i][2][x] ^ s[i][1];
241 x = q[i][1][x] ^ s[i][0];
242 break;
243 }
244
245 /* --- Write it in the key schedule --- */
246
247 k->g[i][j] = qmds[i][x];
248 }
249 }
250 }
251
252 /* --- Clear everything away --- */
253
254 BURN(me);
255 BURN(mo);
256 BURN(s);
257 }
258
259 /* --- @twofish_init@ --- *
260 *
261 * Arguments: @twofish_ctx *k@ = pointer to key block to fill in
262 * @const void *buf@ = pointer to buffer of key material
263 * @size_t sz@ = size of key material
264 *
265 * Returns: ---
266 *
267 * Use: Initializes a Twofish key buffer. Twofish accepts key sizes
268 * of up to 256 bits (32 bytes).
269 */
270
271 void twofish_init(twofish_ctx *k, const void *buf, size_t sz)
272 {
273 static const twofish_fk fk = { { 0 } };
274 twofish_initfk(k, buf, sz, &fk);
275 }
276
277 /* --- @twofish_fkinit@ --- *
278 *
279 * Arguments: @twofish_fk *fk@ = pointer to family key block
280 * @const void *buf@ = pointer to buffer of key material
281 * @size_t sz@ = size of key material
282 *
283 * Returns: ---
284 *
285 * Use: Initializes a family-key buffer. This implementation allows
286 * family keys of any size acceptable to the Twofish algorithm.
287 */
288
289 void twofish_fkinit(twofish_fk *fk, const void *buf, size_t sz)
290 {
291 twofish_ctx k;
292 uint32 pt[4], ct[4];
293 const octet *kk;
294 unsigned i;
295
296 twofish_init(&k, buf, sz);
297
298 for (i = 0; i < 4; i++) pt[i] = (uint32)-1;
299 twofish_eblk(&k, pt, fk->t0 + 4);
300
301 kk = buf; sz /= 4;
302 for (i = 0; i < sz; i++) { fk->t0[i] = LOAD32_L(kk); kk += 4; }
303
304 for (i = 0; i < 4; i++) pt[i] = 0; twofish_eblk(&k, pt, ct);
305 for (i = 0; i < 4; i++) STORE32_L(fk->t1 + i * 4, ct[i]);
306 pt[0] = 1; twofish_eblk(&k, pt, ct);
307 for (i = 0; i < 4; i++) STORE32_L(fk->t1 + 4 + i * 4, ct[i]);
308
309 pt[0] = 2; twofish_eblk(&k, pt, fk->t23 + 0);
310 pt[0] = 3; twofish_eblk(&k, pt, fk->t23 + 4);
311 pt[0] = 4; twofish_eblk(&k, pt, ct);
312 fk->t4[0] = ct[0]; fk->t4[1] = ct[1];
313
314 BURN(k);
315 }
316
317 /*----- Main encryption ---------------------------------------------------*/
318
319 /* --- Feistel function --- */
320
321 #define GG(k, t0, t1, x, y, kk) do { \
322 t0 = (k->g[0][U8(x >> 0)] ^ \
323 k->g[1][U8(x >> 8)] ^ \
324 k->g[2][U8(x >> 16)] ^ \
325 k->g[3][U8(x >> 24)]); \
326 t1 = (k->g[1][U8(y >> 0)] ^ \
327 k->g[2][U8(y >> 8)] ^ \
328 k->g[3][U8(y >> 16)] ^ \
329 k->g[0][U8(y >> 24)]); \
330 t0 += t1; \
331 t1 += t0; \
332 t0 += kk[0]; \
333 t1 += kk[1]; \
334 } while (0)
335
336 /* --- Round operations --- */
337
338 #define EROUND(k, w, x, y, z, kk) do { \
339 uint32 _t0, _t1; \
340 GG(k, _t0, _t1, w, x, kk); \
341 kk += 2; \
342 y ^= _t0; y = ROR32(y, 1); \
343 z = ROL32(z, 1); z ^= _t1; \
344 } while (0)
345
346 #define DROUND(k, w, x, y, z, kk) do { \
347 uint32 _t0, _t1; \
348 kk -= 2; \
349 GG(k, _t0, _t1, w, x, kk); \
350 y = ROL32(y, 1); y ^= _t0; \
351 z ^= _t1; z = ROR32(z, 1); \
352 } while (0)
353
354 /* --- Complete encryption functions --- */
355
356 #define EBLK(k, a, b, c, d, w, x, y, z) do { \
357 const uint32 *_kk = k->k + 8; \
358 uint32 _a = a, _b = b, _c = c, _d = d; \
359 _a ^= k->k[0]; _b ^= k->k[1]; _c ^= k->k[2]; _d ^= k->k[3]; \
360 EROUND(k, _a, _b, _c, _d, _kk); \
361 EROUND(k, _c, _d, _a, _b, _kk); \
362 EROUND(k, _a, _b, _c, _d, _kk); \
363 EROUND(k, _c, _d, _a, _b, _kk); \
364 EROUND(k, _a, _b, _c, _d, _kk); \
365 EROUND(k, _c, _d, _a, _b, _kk); \
366 EROUND(k, _a, _b, _c, _d, _kk); \
367 EROUND(k, _c, _d, _a, _b, _kk); \
368 EROUND(k, _a, _b, _c, _d, _kk); \
369 EROUND(k, _c, _d, _a, _b, _kk); \
370 EROUND(k, _a, _b, _c, _d, _kk); \
371 EROUND(k, _c, _d, _a, _b, _kk); \
372 EROUND(k, _a, _b, _c, _d, _kk); \
373 EROUND(k, _c, _d, _a, _b, _kk); \
374 EROUND(k, _a, _b, _c, _d, _kk); \
375 EROUND(k, _c, _d, _a, _b, _kk); \
376 _c ^= k->k[4]; _d ^= k->k[5]; _a ^= k->k[6]; _b ^= k->k[7]; \
377 w = U32(_c); x = U32(_d); y = U32(_a); z = U32(_b); \
378 } while (0)
379
380 #define DBLK(k, a, b, c, d, w, x, y, z) do { \
381 const uint32 *_kk = k->k + 40; \
382 uint32 _a = a, _b = b, _c = c, _d = d; \
383 _a ^= k->k[4]; _b ^= k->k[5]; _c ^= k->k[6]; _d ^= k->k[7]; \
384 DROUND(k, _a, _b, _c, _d, _kk); \
385 DROUND(k, _c, _d, _a, _b, _kk); \
386 DROUND(k, _a, _b, _c, _d, _kk); \
387 DROUND(k, _c, _d, _a, _b, _kk); \
388 DROUND(k, _a, _b, _c, _d, _kk); \
389 DROUND(k, _c, _d, _a, _b, _kk); \
390 DROUND(k, _a, _b, _c, _d, _kk); \
391 DROUND(k, _c, _d, _a, _b, _kk); \
392 DROUND(k, _a, _b, _c, _d, _kk); \
393 DROUND(k, _c, _d, _a, _b, _kk); \
394 DROUND(k, _a, _b, _c, _d, _kk); \
395 DROUND(k, _c, _d, _a, _b, _kk); \
396 DROUND(k, _a, _b, _c, _d, _kk); \
397 DROUND(k, _c, _d, _a, _b, _kk); \
398 DROUND(k, _a, _b, _c, _d, _kk); \
399 DROUND(k, _c, _d, _a, _b, _kk); \
400 _c ^= k->k[0]; _d ^= k->k[1]; _a ^= k->k[2]; _b ^= k->k[3]; \
401 w = U32(_c); x = U32(_d); y = U32(_a); z = U32(_b); \
402 } while (0)
403
404 /* --- @twofish_eblk@, @twofish_dblk@ --- *
405 *
406 * Arguments: @const twofish_ctx *k@ = pointer to key block
407 * @const uint32 s[4]@ = pointer to source block
408 * @uint32 d[4]@ = pointer to destination block
409 *
410 * Returns: ---
411 *
412 * Use: Low-level block encryption and decryption.
413 */
414
415 void twofish_eblk(const twofish_ctx *k, const uint32 *s, uint32 *d)
416 {
417 EBLK(k, s[0], s[1], s[2], s[3], d[0], d[1], d[2], d[3]);
418 }
419
420 void twofish_dblk(const twofish_ctx *k, const uint32 *s, uint32 *d)
421 {
422 DBLK(k, s[0], s[1], s[2], s[3], d[0], d[1], d[2], d[3]);
423 }
424
425 BLKC_TEST(TWOFISH, twofish)
426
427 /*----- That's all, folks -------------------------------------------------*/