Mercurial > dropbear
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 $ */ |