1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis 2 * 3 * LibTomCrypt is a library that provides various cryptographic 4 * algorithms in a highly modular and flexible manner. 5 * 6 * The library is free for all purposes without any express 7 * guarantee it works. 8 * 9 * Tom St Denis, tomstdenis (at) gmail.com, http://libtomcrypt.com 10 */ 11 #include "tomcrypt.h" 12 13 /** 14 @file lrw_test.c 15 LRW_MODE implementation, test LRW, Tom St Denis 16 */ 17 18 #ifdef LTC_LRW_MODE 19 20 /** 21 Test LRW against specs 22 @return CRYPT_OK if goodly 23 */ 24 int lrw_test(void) 25 { 26 #ifndef LTC_TEST 27 return CRYPT_NOP; 28 #else 29 static const struct { 30 unsigned char key[16], tweak[16], IV[16], P[16], expected_tweak[16], C[16]; 31 } tests[] = { 32 33 { 34 { 0x45, 0x62, 0xac, 0x25, 0xf8, 0x28, 0x17, 0x6d, 0x4c, 0x26, 0x84, 0x14, 0xb5, 0x68, 0x01, 0x85 }, 35 { 0x25, 0x8e, 0x2a, 0x05, 0xe7, 0x3e, 0x9d, 0x03, 0xee, 0x5a, 0x83, 0x0c, 0xcc, 0x09, 0x4c, 0x87 }, 36 { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, 37 { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 }, 38 { 0x25, 0x8e, 0x2a, 0x05, 0xe7, 0x3e, 0x9d, 0x03, 0xee, 0x5a, 0x83, 0x0c, 0xcc, 0x09, 0x4c, 0x87 }, 39 { 0xf1, 0xb2, 0x73, 0xcd, 0x65, 0xa3, 0xdf, 0x5f, 0xe9, 0x5d, 0x48, 0x92, 0x54, 0x63, 0x4e, 0xb8 } 40 }, 41 42 { 43 { 0x59, 0x70, 0x47, 0x14, 0xf5, 0x57, 0x47, 0x8c, 0xd7, 0x79, 0xe8, 0x0f, 0x54, 0x88, 0x79, 0x44 }, 44 { 0x35, 0x23, 0xc2, 0xde, 0xc5, 0x69, 0x4f, 0xa8, 0x72, 0xa9, 0xac, 0xa7, 0x0b, 0x2b, 0xee, 0xbc }, 45 { 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, 46 { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 }, 47 { 0x1a, 0x91, 0xe1, 0x6f, 0x62, 0xb4, 0xa7, 0xd4, 0x39, 0x54, 0xd6, 0x53, 0x85, 0x95, 0xf7, 0x5e }, 48 { 0x00, 0xc8, 0x2b, 0xae, 0x95, 0xbb, 0xcd, 0xe5, 0x27, 0x4f, 0x07, 0x69, 0xb2, 0x60, 0xe1, 0x36 }, 49 }, 50 51 { 52 { 0x59, 0x70, 0x47, 0x14, 0xf5, 0x57, 0x47, 0x8c, 0xd7, 0x79, 0xe8, 0x0f, 0x54, 0x88, 0x79, 0x44 }, 53 { 0x67, 0x53, 0xc9, 0x0c, 0xb7, 0xd8, 0xcd, 0xe5, 0x06, 0xa0, 0x47, 0x78, 0x1a, 0xad, 0x85, 0x11 }, 54 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 }, 55 { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 }, 56 { 0x1a, 0x91, 0xe1, 0x6f, 0x62, 0xb4, 0xa7, 0xd4, 0x39, 0x54, 0xd6, 0x53, 0x85, 0x95, 0xf7, 0x5e }, 57 { 0x00, 0xc8, 0x2b, 0xae, 0x95, 0xbb, 0xcd, 0xe5, 0x27, 0x4f, 0x07, 0x69, 0xb2, 0x60, 0xe1, 0x36 }, 58 }, 59 60 { 61 62 { 0xd8, 0x2a, 0x91, 0x34, 0xb2, 0x6a, 0x56, 0x50, 0x30, 0xfe, 0x69, 0xe2, 0x37, 0x7f, 0x98, 0x47 }, 63 { 0x4e, 0xb5, 0x5d, 0x31, 0x05, 0x97, 0x3a, 0x3f, 0x5e, 0x23, 0xda, 0xfb, 0x5a, 0x45, 0xd6, 0xc0 }, 64 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00 }, 65 { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 }, 66 { 0x18, 0xc9, 0x1f, 0x6d, 0x60, 0x1a, 0x1a, 0x37, 0x5d, 0x0b, 0x0e, 0xf7, 0x3a, 0xd5, 0x74, 0xc4 }, 67 { 0x76, 0x32, 0x21, 0x83, 0xed, 0x8f, 0xf1, 0x82, 0xf9, 0x59, 0x62, 0x03, 0x69, 0x0e, 0x5e, 0x01 }, 68 69 } 70 }; 71 72 int idx, err, x; 73 symmetric_LRW lrw; 74 unsigned char buf[2][16]; 75 76 idx = find_cipher("aes"); 77 if (idx == -1) { 78 idx = find_cipher("rijndael"); 79 if (idx == -1) { 80 return CRYPT_NOP; 81 } 82 } 83 84 for (x = 0; x < (int)(sizeof(tests)/sizeof(tests[0])); x++) { 85 /* schedule it */ 86 if ((err = lrw_start(idx, tests[x].IV, tests[x].key, 16, tests[x].tweak, 0, &lrw)) != CRYPT_OK) { 87 return err; 88 } 89 90 /* check pad against expected tweak */ 91 if (XMEMCMP(tests[x].expected_tweak, lrw.pad, 16)) { 92 lrw_done(&lrw); 93 return CRYPT_FAIL_TESTVECTOR; 94 } 95 96 /* process block */ 97 if ((err = lrw_encrypt(tests[x].P, buf[0], 16, &lrw)) != CRYPT_OK) { 98 lrw_done(&lrw); 99 return err; 100 } 101 102 if (XMEMCMP(buf[0], tests[x].C, 16)) { 103 lrw_done(&lrw); 104 return CRYPT_FAIL_TESTVECTOR; 105 } 106 107 /* process block */ 108 if ((err = lrw_setiv(tests[x].IV, 16, &lrw)) != CRYPT_OK) { 109 lrw_done(&lrw); 110 return err; 111 } 112 113 if ((err = lrw_decrypt(buf[0], buf[1], 16, &lrw)) != CRYPT_OK) { 114 lrw_done(&lrw); 115 return err; 116 } 117 118 if (XMEMCMP(buf[1], tests[x].P, 16)) { 119 lrw_done(&lrw); 120 return CRYPT_FAIL_TESTVECTOR; 121 } 122 if ((err = lrw_done(&lrw)) != CRYPT_OK) { 123 return err; 124 } 125 } 126 return CRYPT_OK; 127 #endif 128 } 129 130 #endif 131 132 133 134 /* $Source: /cvs/libtom/libtomcrypt/src/modes/lrw/lrw_test.c,v $ */ 135 /* $Revision: 1.11 $ */ 136 /* $Date: 2006/06/29 01:53:13 $ */ 137