1 /* test CFB/OFB/CBC modes */ 2 #include <tomcrypt_test.h> 3 4 int modes_test(void) 5 { 6 unsigned char pt[64], ct[64], tmp[64], key[16], iv[16], iv2[16]; 7 int cipher_idx; 8 #ifdef LTC_CBC_MODE 9 symmetric_CBC cbc; 10 #endif 11 #ifdef LTC_CFB_MODE 12 symmetric_CFB cfb; 13 #endif 14 #ifdef LTC_OFB_MODE 15 symmetric_OFB ofb; 16 #endif 17 unsigned long l; 18 19 /* make a random pt, key and iv */ 20 yarrow_read(pt, 64, &yarrow_prng); 21 yarrow_read(key, 16, &yarrow_prng); 22 yarrow_read(iv, 16, &yarrow_prng); 23 24 /* get idx of AES handy */ 25 cipher_idx = find_cipher("aes"); 26 if (cipher_idx == -1) { 27 fprintf(stderr, "test requires AES"); 28 return 1; 29 } 30 31 #ifdef LTC_F8_MODE 32 DO(f8_test_mode()); 33 #endif 34 35 #ifdef LTC_LRW_MODE 36 DO(lrw_test()); 37 #endif 38 39 #ifdef LTC_CBC_MODE 40 /* test CBC mode */ 41 /* encode the block */ 42 DO(cbc_start(cipher_idx, iv, key, 16, 0, &cbc)); 43 l = sizeof(iv2); 44 DO(cbc_getiv(iv2, &l, &cbc)); 45 if (l != 16 || memcmp(iv2, iv, 16)) { 46 fprintf(stderr, "cbc_getiv failed"); 47 return 1; 48 } 49 DO(cbc_encrypt(pt, ct, 64, &cbc)); 50 51 /* decode the block */ 52 DO(cbc_setiv(iv2, l, &cbc)); 53 zeromem(tmp, sizeof(tmp)); 54 DO(cbc_decrypt(ct, tmp, 64, &cbc)); 55 if (memcmp(tmp, pt, 64) != 0) { 56 fprintf(stderr, "CBC failed"); 57 return 1; 58 } 59 #endif 60 61 #ifdef LTC_CFB_MODE 62 /* test CFB mode */ 63 /* encode the block */ 64 DO(cfb_start(cipher_idx, iv, key, 16, 0, &cfb)); 65 l = sizeof(iv2); 66 DO(cfb_getiv(iv2, &l, &cfb)); 67 /* note we don't memcmp iv2/iv since cfb_start processes the IV for the first block */ 68 if (l != 16) { 69 fprintf(stderr, "cfb_getiv failed"); 70 return 1; 71 } 72 DO(cfb_encrypt(pt, ct, 64, &cfb)); 73 74 /* decode the block */ 75 DO(cfb_setiv(iv, l, &cfb)); 76 zeromem(tmp, sizeof(tmp)); 77 DO(cfb_decrypt(ct, tmp, 64, &cfb)); 78 if (memcmp(tmp, pt, 64) != 0) { 79 fprintf(stderr, "CFB failed"); 80 return 1; 81 } 82 #endif 83 84 #ifdef LTC_OFB_MODE 85 /* test OFB mode */ 86 /* encode the block */ 87 DO(ofb_start(cipher_idx, iv, key, 16, 0, &ofb)); 88 l = sizeof(iv2); 89 DO(ofb_getiv(iv2, &l, &ofb)); 90 if (l != 16 || memcmp(iv2, iv, 16)) { 91 fprintf(stderr, "ofb_getiv failed"); 92 return 1; 93 } 94 DO(ofb_encrypt(pt, ct, 64, &ofb)); 95 96 /* decode the block */ 97 DO(ofb_setiv(iv2, l, &ofb)); 98 zeromem(tmp, sizeof(tmp)); 99 DO(ofb_decrypt(ct, tmp, 64, &ofb)); 100 if (memcmp(tmp, pt, 64) != 0) { 101 fprintf(stderr, "OFB failed"); 102 return 1; 103 } 104 #endif 105 106 #ifdef LTC_CTR_MODE 107 DO(ctr_test()); 108 #endif 109 110 return 0; 111 } 112 113 /* $Source: /cvs/libtom/libtomcrypt/testprof/modes_test.c,v $ */ 114 /* $Revision: 1.14 $ */ 115 /* $Date: 2006/11/13 11:55:25 $ */ 116