comparison libtomcrypt/src/ciphers/twofish/twofish.c @ 1435:f849a5ca2efc

update to libtomcrypt 1.17 (with Dropbear changes)
author Matt Johnston <matt@ucc.asn.au>
date Sat, 24 Jun 2017 17:50:50 +0800
parents eef377591301
children 6dba84798cd5
comparison
equal deleted inserted replaced
1434:27b9ddb06b09 1435:f849a5ca2efc
4 * algorithms in a highly modular and flexible manner. 4 * algorithms in a highly modular and flexible manner.
5 * 5 *
6 * The library is free for all purposes without any express 6 * The library is free for all purposes without any express
7 * guarantee it works. 7 * guarantee it works.
8 * 8 *
9 * Tom St Denis, [email protected], http://libtomcrypt.com 9 * Tom St Denis, [email protected], http://libtom.org
10 */ 10 */
11 11
12 /** 12 /**
13 @file twofish.c 13 @file twofish.c
14 Implementation of Twofish by Tom St Denis 14 Implementation of Twofish by Tom St Denis
15 */ 15 */
16 #include "tomcrypt.h" 16 #include "tomcrypt.h"
17 17
18 #ifdef TWOFISH 18 #ifdef LTC_TWOFISH
19 19
20 /* first TWOFISH_ALL_TABLES must ensure TWOFISH_TABLES is defined */ 20 /* first LTC_TWOFISH_ALL_TABLES must ensure LTC_TWOFISH_TABLES is defined */
21 #ifdef TWOFISH_ALL_TABLES 21 #ifdef LTC_TWOFISH_ALL_TABLES
22 #ifndef TWOFISH_TABLES 22 #ifndef LTC_TWOFISH_TABLES
23 #define TWOFISH_TABLES 23 #define LTC_TWOFISH_TABLES
24 #endif 24 #endif
25 #endif 25 #endif
26 26
27 const struct ltc_cipher_descriptor twofish_desc = 27 const struct ltc_cipher_descriptor twofish_desc =
28 { 28 {
66 { 0, 1, 1, 0, 0 }, 66 { 0, 1, 1, 0, 0 },
67 { 0, 0, 0, 1, 1 }, 67 { 0, 0, 0, 1, 1 },
68 { 1, 0, 1, 1, 0 } 68 { 1, 0, 1, 1, 0 }
69 }; 69 };
70 70
71 #ifdef TWOFISH_TABLES 71 #ifdef LTC_TWOFISH_TABLES
72 72
73 #include "twofish_tab.c" 73 #include "twofish_tab.c"
74 74
75 #define sbox(i, x) ((ulong32)SBOX[i][(x)&255]) 75 #define sbox(i, x) ((ulong32)SBOX[i][(x)&255])
76 76
140 burn_stack(sizeof(unsigned char) * 11); 140 burn_stack(sizeof(unsigned char) * 11);
141 return y; 141 return y;
142 } 142 }
143 #endif /* LTC_CLEAN_STACK */ 143 #endif /* LTC_CLEAN_STACK */
144 144
145 #endif /* TWOFISH_TABLES */ 145 #endif /* LTC_TWOFISH_TABLES */
146 146
147 /* computes ab mod p */ 147 /* computes ab mod p */
148 static ulong32 gf_mult(ulong32 a, ulong32 b, ulong32 p) 148 static ulong32 gf_mult(ulong32 a, ulong32 b, ulong32 p)
149 { 149 {
150 ulong32 result, B[2], P[2]; 150 ulong32 result, B[2], P[2];
165 165
166 return result; 166 return result;
167 } 167 }
168 168
169 /* computes [y0 y1 y2 y3] = MDS . [x0] */ 169 /* computes [y0 y1 y2 y3] = MDS . [x0] */
170 #ifndef TWOFISH_TABLES 170 #ifndef LTC_TWOFISH_TABLES
171 static ulong32 mds_column_mult(unsigned char in, int col) 171 static ulong32 mds_column_mult(unsigned char in, int col)
172 { 172 {
173 ulong32 x01, x5B, xEF; 173 ulong32 x01, x5B, xEF;
174 174
175 x01 = in; 175 x01 = in;
200 } 200 }
201 /* avoid warnings, we'd never get here normally but just to calm compiler warnings... */ 201 /* avoid warnings, we'd never get here normally but just to calm compiler warnings... */
202 return 0; 202 return 0;
203 } 203 }
204 204
205 #else /* !TWOFISH_TABLES */ 205 #else /* !LTC_TWOFISH_TABLES */
206 206
207 #define mds_column_mult(x, i) mds_tab[i][x] 207 #define mds_column_mult(x, i) mds_tab[i][x]
208 208
209 #endif /* TWOFISH_TABLES */ 209 #endif /* LTC_TWOFISH_TABLES */
210 210
211 /* Computes [y0 y1 y2 y3] = MDS . [x0 x1 x2 x3] */ 211 /* Computes [y0 y1 y2 y3] = MDS . [x0 x1 x2 x3] */
212 static void mds_mult(const unsigned char *in, unsigned char *out) 212 static void mds_mult(const unsigned char *in, unsigned char *out)
213 { 213 {
214 int x; 214 int x;
217 tmp ^= mds_column_mult(in[x], x); 217 tmp ^= mds_column_mult(in[x], x);
218 } 218 }
219 STORE32L(tmp, out); 219 STORE32L(tmp, out);
220 } 220 }
221 221
222 #ifdef TWOFISH_ALL_TABLES 222 #ifdef LTC_TWOFISH_ALL_TABLES
223 /* computes [y0 y1 y2 y3] = RS . [x0 x1 x2 x3 x4 x5 x6 x7] */ 223 /* computes [y0 y1 y2 y3] = RS . [x0 x1 x2 x3 x4 x5 x6 x7] */
224 static void rs_mult(const unsigned char *in, unsigned char *out) 224 static void rs_mult(const unsigned char *in, unsigned char *out)
225 { 225 {
226 ulong32 tmp; 226 ulong32 tmp;
227 tmp = rs_tab0[in[0]] ^ rs_tab1[in[1]] ^ rs_tab2[in[2]] ^ rs_tab3[in[3]] ^ 227 tmp = rs_tab0[in[0]] ^ rs_tab1[in[1]] ^ rs_tab2[in[2]] ^ rs_tab3[in[3]] ^
228 rs_tab4[in[4]] ^ rs_tab5[in[5]] ^ rs_tab6[in[6]] ^ rs_tab7[in[7]]; 228 rs_tab4[in[4]] ^ rs_tab5[in[5]] ^ rs_tab6[in[6]] ^ rs_tab7[in[7]];
229 STORE32L(tmp, out); 229 STORE32L(tmp, out);
230 } 230 }
231 231
232 #else /* !TWOFISH_ALL_TABLES */ 232 #else /* !LTC_TWOFISH_ALL_TABLES */
233 233
234 /* computes [y0 y1 y2 y3] = RS . [x0 x1 x2 x3 x4 x5 x6 x7] */ 234 /* computes [y0 y1 y2 y3] = RS . [x0 x1 x2 x3 x4 x5 x6 x7] */
235 static void rs_mult(const unsigned char *in, unsigned char *out) 235 static void rs_mult(const unsigned char *in, unsigned char *out)
236 { 236 {
237 int x, y; 237 int x, y;
271 y[3] = (unsigned char)(sbox(0, sbox(1, sbox(1, (ulong32)y[3]) ^ M[4 * (2 + offset) + 3]) ^ M[4 * (0 + offset) + 3])); 271 y[3] = (unsigned char)(sbox(0, sbox(1, sbox(1, (ulong32)y[3]) ^ M[4 * (2 + offset) + 3]) ^ M[4 * (0 + offset) + 3]));
272 } 272 }
273 mds_mult(y, out); 273 mds_mult(y, out);
274 } 274 }
275 275
276 #ifndef TWOFISH_SMALL 276 #ifndef LTC_TWOFISH_SMALL
277 277
278 /* for GCC we don't use pointer aliases */ 278 /* for GCC we don't use pointer aliases */
279 #if defined(__GNUC__) 279 #if defined(__GNUC__)
280 #define S1 skey->twofish.S[0] 280 #define S1 skey->twofish.S[0]
281 #define S2 skey->twofish.S[1] 281 #define S2 skey->twofish.S[1]
330 burn_stack(sizeof(unsigned char) * 4 + sizeof(ulong32)); 330 burn_stack(sizeof(unsigned char) * 4 + sizeof(ulong32));
331 return y; 331 return y;
332 } 332 }
333 #endif /* LTC_CLEAN_STACK */ 333 #endif /* LTC_CLEAN_STACK */
334 334
335 #endif /* TWOFISH_SMALL */ 335 #endif /* LTC_TWOFISH_SMALL */
336 336
337 /** 337 /**
338 Initialize the Twofish block cipher 338 Initialize the Twofish block cipher
339 @param key The symmetric key you wish to pass 339 @param key The symmetric key you wish to pass
340 @param keylen The key length in bytes 340 @param keylen The key length in bytes
346 static int _twofish_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey) 346 static int _twofish_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey)
347 #else 347 #else
348 int twofish_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey) 348 int twofish_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey)
349 #endif 349 #endif
350 { 350 {
351 #ifndef TWOFISH_SMALL 351 #ifndef LTC_TWOFISH_SMALL
352 unsigned char S[4*4], tmpx0, tmpx1; 352 unsigned char S[4*4], tmpx0, tmpx1;
353 #endif 353 #endif
354 int k, x, y; 354 int k, x, y;
355 unsigned char tmp[4], tmp2[4], M[8*4]; 355 unsigned char tmp[4], tmp2[4], M[8*4];
356 ulong32 A, B; 356 ulong32 A, B;
374 for (x = 0; x < keylen; x++) { 374 for (x = 0; x < keylen; x++) {
375 M[x] = key[x] & 255; 375 M[x] = key[x] & 255;
376 } 376 }
377 377
378 /* create the S[..] words */ 378 /* create the S[..] words */
379 #ifndef TWOFISH_SMALL 379 #ifndef LTC_TWOFISH_SMALL
380 for (x = 0; x < k; x++) { 380 for (x = 0; x < k; x++) {
381 rs_mult(M+(x*8), S+(x*4)); 381 rs_mult(M+(x*8), S+(x*4));
382 } 382 }
383 #else 383 #else
384 for (x = 0; x < k; x++) { 384 for (x = 0; x < k; x++) {
408 408
409 /* K[2i+1] = (A + 2B) <<< 9 */ 409 /* K[2i+1] = (A + 2B) <<< 9 */
410 skey->twofish.K[x+x+1] = ROLc(B + B + A, 9); 410 skey->twofish.K[x+x+1] = ROLc(B + B + A, 9);
411 } 411 }
412 412
413 #ifndef TWOFISH_SMALL 413 #ifndef LTC_TWOFISH_SMALL
414 /* make the sboxes (large ram variant) */ 414 /* make the sboxes (large ram variant) */
415 if (k == 2) { 415 if (k == 2) {
416 for (x = 0; x < 256; x++) { 416 for (x = 0; x < 256; x++) {
417 tmpx0 = (unsigned char)sbox(0, x); 417 tmpx0 = (unsigned char)sbox(0, x);
418 tmpx1 = (unsigned char)sbox(1, x); 418 tmpx1 = (unsigned char)sbox(1, x);
475 int twofish_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey) 475 int twofish_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey)
476 #endif 476 #endif
477 { 477 {
478 ulong32 a,b,c,d,ta,tb,tc,td,t1,t2, *k; 478 ulong32 a,b,c,d,ta,tb,tc,td,t1,t2, *k;
479 int r; 479 int r;
480 #if !defined(TWOFISH_SMALL) && !defined(__GNUC__) 480 #if !defined(LTC_TWOFISH_SMALL) && !defined(__GNUC__)
481 ulong32 *S1, *S2, *S3, *S4; 481 ulong32 *S1, *S2, *S3, *S4;
482 #endif 482 #endif
483 483
484 LTC_ARGCHK(pt != NULL); 484 LTC_ARGCHK(pt != NULL);
485 LTC_ARGCHK(ct != NULL); 485 LTC_ARGCHK(ct != NULL);
486 LTC_ARGCHK(skey != NULL); 486 LTC_ARGCHK(skey != NULL);
487 487
488 #if !defined(TWOFISH_SMALL) && !defined(__GNUC__) 488 #if !defined(LTC_TWOFISH_SMALL) && !defined(__GNUC__)
489 S1 = skey->twofish.S[0]; 489 S1 = skey->twofish.S[0];
490 S2 = skey->twofish.S[1]; 490 S2 = skey->twofish.S[1];
491 S3 = skey->twofish.S[2]; 491 S3 = skey->twofish.S[2];
492 S4 = skey->twofish.S[3]; 492 S4 = skey->twofish.S[3];
493 #endif 493 #endif
548 int twofish_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey) 548 int twofish_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey)
549 #endif 549 #endif
550 { 550 {
551 ulong32 a,b,c,d,ta,tb,tc,td,t1,t2, *k; 551 ulong32 a,b,c,d,ta,tb,tc,td,t1,t2, *k;
552 int r; 552 int r;
553 #if !defined(TWOFISH_SMALL) && !defined(__GNUC__) 553 #if !defined(LTC_TWOFISH_SMALL) && !defined(__GNUC__)
554 ulong32 *S1, *S2, *S3, *S4; 554 ulong32 *S1, *S2, *S3, *S4;
555 #endif 555 #endif
556 556
557 LTC_ARGCHK(pt != NULL); 557 LTC_ARGCHK(pt != NULL);
558 LTC_ARGCHK(ct != NULL); 558 LTC_ARGCHK(ct != NULL);
559 LTC_ARGCHK(skey != NULL); 559 LTC_ARGCHK(skey != NULL);
560 560
561 #if !defined(TWOFISH_SMALL) && !defined(__GNUC__) 561 #if !defined(LTC_TWOFISH_SMALL) && !defined(__GNUC__)
562 S1 = skey->twofish.S[0]; 562 S1 = skey->twofish.S[0];
563 S2 = skey->twofish.S[1]; 563 S2 = skey->twofish.S[1];
564 S3 = skey->twofish.S[2]; 564 S3 = skey->twofish.S[2];
565 S4 = skey->twofish.S[3]; 565 S4 = skey->twofish.S[3];
566 #endif 566 #endif
712 #endif 712 #endif
713 713
714 714
715 715
716 716
717 /* $Source: /cvs/libtom/libtomcrypt/src/ciphers/twofish/twofish.c,v $ */ 717 /* $Source$ */
718 /* $Revision: 1.14 $ */ 718 /* $Revision$ */
719 /* $Date: 2006/12/04 21:34:03 $ */ 719 /* $Date$ */