comparison src/ciphers/aes/aes.c @ 380:d5faf4814ddb libtomcrypt-orig libtomcrypt-1.16

Update to LibTomCrypt 1.16
author Matt Johnston <matt@ucc.asn.au>
date Thu, 11 Jan 2007 02:22:00 +0000
parents 59400faa4b44
children 999a5eb4ed10
comparison
equal deleted inserted replaced
280:59400faa4b44 380:d5faf4814ddb
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.org 9 * Tom St Denis, [email protected], http://libtomcrypt.com
10 */ 10 */
11 11
12 /* AES implementation by Tom St Denis 12 /* AES implementation by Tom St Denis
13 * 13 *
14 * Derived from the Public Domain source code by 14 * Derived from the Public Domain source code by
47 { 47 {
48 "rijndael", 48 "rijndael",
49 6, 49 6,
50 16, 32, 16, 10, 50 16, 32, 16, 10,
51 SETUP, ECB_ENC, ECB_DEC, ECB_TEST, ECB_DONE, ECB_KS, 51 SETUP, ECB_ENC, ECB_DEC, ECB_TEST, ECB_DONE, ECB_KS,
52 NULL, NULL, NULL, NULL, NULL, NULL, NULL 52 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
53 }; 53 };
54 54
55 const struct ltc_cipher_descriptor aes_desc = 55 const struct ltc_cipher_descriptor aes_desc =
56 { 56 {
57 "aes", 57 "aes",
58 6, 58 6,
59 16, 32, 16, 10, 59 16, 32, 16, 10,
60 SETUP, ECB_ENC, ECB_DEC, ECB_TEST, ECB_DONE, ECB_KS, 60 SETUP, ECB_ENC, ECB_DEC, ECB_TEST, ECB_DONE, ECB_KS,
61 NULL, NULL, NULL, NULL, NULL, NULL, NULL 61 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
62 }; 62 };
63 63
64 #else 64 #else
65 65
66 #define SETUP rijndael_enc_setup 66 #define SETUP rijndael_enc_setup
72 { 72 {
73 "rijndael", 73 "rijndael",
74 6, 74 6,
75 16, 32, 16, 10, 75 16, 32, 16, 10,
76 SETUP, ECB_ENC, NULL, NULL, ECB_DONE, ECB_KS, 76 SETUP, ECB_ENC, NULL, NULL, ECB_DONE, ECB_KS,
77 NULL, NULL, NULL, NULL, NULL, NULL, NULL 77 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
78 }; 78 };
79 79
80 const struct ltc_cipher_descriptor aes_enc_desc = 80 const struct ltc_cipher_descriptor aes_enc_desc =
81 { 81 {
82 "aes", 82 "aes",
83 6, 83 6,
84 16, 32, 16, 10, 84 16, 32, 16, 10,
85 SETUP, ECB_ENC, NULL, NULL, ECB_DONE, ECB_KS, 85 SETUP, ECB_ENC, NULL, NULL, ECB_DONE, ECB_KS,
86 NULL, NULL, NULL, NULL, NULL, NULL, NULL 86 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
87 }; 87 };
88 88
89 #endif 89 #endif
90 90
91 #include "aes_tab.c" 91 #include "aes_tab.c"
279 /** 279 /**
280 Encrypts a block of text with AES 280 Encrypts a block of text with AES
281 @param pt The input plaintext (16 bytes) 281 @param pt The input plaintext (16 bytes)
282 @param ct The output ciphertext (16 bytes) 282 @param ct The output ciphertext (16 bytes)
283 @param skey The key as scheduled 283 @param skey The key as scheduled
284 @return CRYPT_OK if successful
284 */ 285 */
285 #ifdef LTC_CLEAN_STACK 286 #ifdef LTC_CLEAN_STACK
286 static void _rijndael_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey) 287 static int _rijndael_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey)
287 #else 288 #else
288 void ECB_ENC(const unsigned char *pt, unsigned char *ct, symmetric_key *skey) 289 int ECB_ENC(const unsigned char *pt, unsigned char *ct, symmetric_key *skey)
289 #endif 290 #endif
290 { 291 {
291 ulong32 s0, s1, s2, s3, t0, t1, t2, t3, *rk; 292 ulong32 s0, s1, s2, s3, t0, t1, t2, t3, *rk;
292 int Nr, r; 293 int Nr, r;
293 294
304 */ 305 */
305 LOAD32H(s0, pt ); s0 ^= rk[0]; 306 LOAD32H(s0, pt ); s0 ^= rk[0];
306 LOAD32H(s1, pt + 4); s1 ^= rk[1]; 307 LOAD32H(s1, pt + 4); s1 ^= rk[1];
307 LOAD32H(s2, pt + 8); s2 ^= rk[2]; 308 LOAD32H(s2, pt + 8); s2 ^= rk[2];
308 LOAD32H(s3, pt + 12); s3 ^= rk[3]; 309 LOAD32H(s3, pt + 12); s3 ^= rk[3];
309
310 310
311 #ifdef LTC_SMALL_CODE 311 #ifdef LTC_SMALL_CODE
312 312
313 for (r = 0; ; r++) { 313 for (r = 0; ; r++) {
314 rk += 4; 314 rk += 4;
438 (Te4_2[byte(t0, 2)]) ^ 438 (Te4_2[byte(t0, 2)]) ^
439 (Te4_1[byte(t1, 1)]) ^ 439 (Te4_1[byte(t1, 1)]) ^
440 (Te4_0[byte(t2, 0)]) ^ 440 (Te4_0[byte(t2, 0)]) ^
441 rk[3]; 441 rk[3];
442 STORE32H(s3, ct+12); 442 STORE32H(s3, ct+12);
443
444 return CRYPT_OK;
443 } 445 }
444 446
445 #ifdef LTC_CLEAN_STACK 447 #ifdef LTC_CLEAN_STACK
446 void ECB_ENC(const unsigned char *pt, unsigned char *ct, symmetric_key *skey) 448 int ECB_ENC(const unsigned char *pt, unsigned char *ct, symmetric_key *skey)
447 { 449 {
448 _rijndael_ecb_encrypt(pt, ct, skey); 450 int err = _rijndael_ecb_encrypt(pt, ct, skey);
449 burn_stack(sizeof(unsigned long)*8 + sizeof(unsigned long*) + sizeof(int)*2); 451 burn_stack(sizeof(unsigned long)*8 + sizeof(unsigned long*) + sizeof(int)*2);
452 return err;
450 } 453 }
451 #endif 454 #endif
452 455
453 #ifndef ENCRYPT_ONLY 456 #ifndef ENCRYPT_ONLY
454 457
455 /** 458 /**
456 Decrypts a block of text with AES 459 Decrypts a block of text with AES
457 @param ct The input ciphertext (16 bytes) 460 @param ct The input ciphertext (16 bytes)
458 @param pt The output plaintext (16 bytes) 461 @param pt The output plaintext (16 bytes)
459 @param skey The key as scheduled 462 @param skey The key as scheduled
463 @return CRYPT_OK if successful
460 */ 464 */
461 #ifdef LTC_CLEAN_STACK 465 #ifdef LTC_CLEAN_STACK
462 static void _rijndael_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey) 466 static int _rijndael_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey)
463 #else 467 #else
464 void ECB_DEC(const unsigned char *ct, unsigned char *pt, symmetric_key *skey) 468 int ECB_DEC(const unsigned char *ct, unsigned char *pt, symmetric_key *skey)
465 #endif 469 #endif
466 { 470 {
467 ulong32 s0, s1, s2, s3, t0, t1, t2, t3, *rk; 471 ulong32 s0, s1, s2, s3, t0, t1, t2, t3, *rk;
468 int Nr, r; 472 int Nr, r;
469 473
613 (Td4[byte(t2, 2)] & 0x00ff0000) ^ 617 (Td4[byte(t2, 2)] & 0x00ff0000) ^
614 (Td4[byte(t1, 1)] & 0x0000ff00) ^ 618 (Td4[byte(t1, 1)] & 0x0000ff00) ^
615 (Td4[byte(t0, 0)] & 0x000000ff) ^ 619 (Td4[byte(t0, 0)] & 0x000000ff) ^
616 rk[3]; 620 rk[3];
617 STORE32H(s3, pt+12); 621 STORE32H(s3, pt+12);
622
623 return CRYPT_OK;
618 } 624 }
619 625
620 626
621 #ifdef LTC_CLEAN_STACK 627 #ifdef LTC_CLEAN_STACK
622 void ECB_DEC(const unsigned char *ct, unsigned char *pt, symmetric_key *skey) 628 int ECB_DEC(const unsigned char *ct, unsigned char *pt, symmetric_key *skey)
623 { 629 {
624 _rijndael_ecb_decrypt(ct, pt, skey); 630 int err = _rijndael_ecb_decrypt(ct, pt, skey);
625 burn_stack(sizeof(unsigned long)*8 + sizeof(unsigned long*) + sizeof(int)*2); 631 burn_stack(sizeof(unsigned long)*8 + sizeof(unsigned long*) + sizeof(int)*2);
632 return err;
626 } 633 }
627 #endif 634 #endif
628 635
629 /** 636 /**
630 Performs a self-test of the AES block cipher 637 Performs a self-test of the AES block cipher
679 return err; 686 return err;
680 } 687 }
681 688
682 rijndael_ecb_encrypt(tests[i].pt, tmp[0], &key); 689 rijndael_ecb_encrypt(tests[i].pt, tmp[0], &key);
683 rijndael_ecb_decrypt(tmp[0], tmp[1], &key); 690 rijndael_ecb_decrypt(tmp[0], tmp[1], &key);
684 if (memcmp(tmp[0], tests[i].ct, 16) || memcmp(tmp[1], tests[i].pt, 16)) { 691 if (XMEMCMP(tmp[0], tests[i].ct, 16) || XMEMCMP(tmp[1], tests[i].pt, 16)) {
685 #if 0 692 #if 0
686 printf("\n\nTest %d failed\n", i); 693 printf("\n\nTest %d failed\n", i);
687 if (memcmp(tmp[0], tests[i].ct, 16)) { 694 if (XMEMCMP(tmp[0], tests[i].ct, 16)) {
688 printf("CT: "); 695 printf("CT: ");
689 for (i = 0; i < 16; i++) { 696 for (i = 0; i < 16; i++) {
690 printf("%02x ", tmp[0][i]); 697 printf("%02x ", tmp[0][i]);
691 } 698 }
692 printf("\n"); 699 printf("\n");
747 754
748 #endif 755 #endif
749 756
750 757
751 /* $Source: /cvs/libtom/libtomcrypt/src/ciphers/aes/aes.c,v $ */ 758 /* $Source: /cvs/libtom/libtomcrypt/src/ciphers/aes/aes.c,v $ */
752 /* $Revision: 1.8 $ */ 759 /* $Revision: 1.14 $ */
753 /* $Date: 2005/05/05 14:35:58 $ */ 760 /* $Date: 2006/11/08 23:01:06 $ */