|
@@ -225,9 +225,9 @@ static unsigned long sbox(int i, unsigned long x)
|
|
|
burn_stack(sizeof(unsigned char) * 11);
|
|
|
return y;
|
|
|
}
|
|
|
-#endif
|
|
|
+#endif /* CLEAN_STACK */
|
|
|
|
|
|
-#endif
|
|
|
+#endif /* TWOFISH_TABLES */
|
|
|
|
|
|
/* computes ab mod p */
|
|
|
static unsigned long gf_mult(unsigned long a, unsigned long b, unsigned long p)
|
|
@@ -637,70 +637,54 @@ void twofish_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_k
|
|
|
|
|
|
int twofish_test(void)
|
|
|
{
|
|
|
- static const unsigned char key128[16] = {
|
|
|
- 0x9F, 0x58, 0x9F, 0x5C, 0xF6, 0x12, 0x2C, 0x32,
|
|
|
- 0xB6, 0xBF, 0xEC, 0x2F, 0x2A, 0xE8, 0xC3, 0x5A };
|
|
|
- static const unsigned char pt128[16] = {
|
|
|
- 0xD4, 0x91, 0xDB, 0x16, 0xE7, 0xB1, 0xC3, 0x9E,
|
|
|
- 0x86, 0xCB, 0x08, 0x6B, 0x78, 0x9F, 0x54, 0x19 };
|
|
|
- static const unsigned char ct128[16] = {
|
|
|
- 0x01, 0x9F, 0x98, 0x09, 0xDE, 0x17, 0x11, 0x85,
|
|
|
- 0x8F, 0xAA, 0xC3, 0xA3, 0xBA, 0x20, 0xFB, 0xC3 };
|
|
|
-
|
|
|
- static const unsigned char key192[24] = {
|
|
|
- 0x88, 0xB2, 0xB2, 0x70, 0x6B, 0x10, 0x5E, 0x36,
|
|
|
- 0xB4, 0x46, 0xBB, 0x6D, 0x73, 0x1A, 0x1E, 0x88,
|
|
|
- 0xEF, 0xA7, 0x1F, 0x78, 0x89, 0x65, 0xBD, 0x44 };
|
|
|
- static const unsigned char pt192[16] = {
|
|
|
- 0x39, 0xDA, 0x69, 0xD6, 0xBA, 0x49, 0x97, 0xD5,
|
|
|
- 0x85, 0xB6, 0xDC, 0x07, 0x3C, 0xA3, 0x41, 0xB2 };
|
|
|
- static const unsigned char ct192[16] = {
|
|
|
- 0x18, 0x2B, 0x02, 0xD8, 0x14, 0x97, 0xEA, 0x45,
|
|
|
- 0xF9, 0xDA, 0xAC, 0xDC, 0x29, 0x19, 0x3A, 0x65 };
|
|
|
-
|
|
|
- static const unsigned char key256[32] = {
|
|
|
- 0xD4, 0x3B, 0xB7, 0x55, 0x6E, 0xA3, 0x2E, 0x46,
|
|
|
- 0xF2, 0xA2, 0x82, 0xB7, 0xD4, 0x5B, 0x4E, 0x0D,
|
|
|
- 0x57, 0xFF, 0x73, 0x9D, 0x4D, 0xC9, 0x2C, 0x1B,
|
|
|
- 0xD7, 0xFC, 0x01, 0x70, 0x0C, 0xC8, 0x21, 0x6F };
|
|
|
- static const unsigned char pt256[16] = {
|
|
|
- 0x90, 0xAF, 0xE9, 0x1B, 0xB2, 0x88, 0x54, 0x4F,
|
|
|
- 0x2C, 0x32, 0xDC, 0x23, 0x9B, 0x26, 0x35, 0xE6 };
|
|
|
- static const unsigned char ct256[16] = {
|
|
|
- 0x6C, 0xB4, 0x56, 0x1C, 0x40, 0xBF, 0x0A, 0x97,
|
|
|
- 0x05, 0x93, 0x1C, 0xB6, 0xD4, 0x08, 0xE7, 0xFA };
|
|
|
+ static const struct {
|
|
|
+ int keylen;
|
|
|
+ unsigned char key[32], pt[16], ct[16];
|
|
|
+ } tests[] = {
|
|
|
+ { 16,
|
|
|
+ { 0x9F, 0x58, 0x9F, 0x5C, 0xF6, 0x12, 0x2C, 0x32,
|
|
|
+ 0xB6, 0xBF, 0xEC, 0x2F, 0x2A, 0xE8, 0xC3, 0x5A },
|
|
|
+ { 0xD4, 0x91, 0xDB, 0x16, 0xE7, 0xB1, 0xC3, 0x9E,
|
|
|
+ 0x86, 0xCB, 0x08, 0x6B, 0x78, 0x9F, 0x54, 0x19 },
|
|
|
+ { 0x01, 0x9F, 0x98, 0x09, 0xDE, 0x17, 0x11, 0x85,
|
|
|
+ 0x8F, 0xAA, 0xC3, 0xA3, 0xBA, 0x20, 0xFB, 0xC3 }
|
|
|
+ }, {
|
|
|
+ 24,
|
|
|
+ { 0x88, 0xB2, 0xB2, 0x70, 0x6B, 0x10, 0x5E, 0x36,
|
|
|
+ 0xB4, 0x46, 0xBB, 0x6D, 0x73, 0x1A, 0x1E, 0x88,
|
|
|
+ 0xEF, 0xA7, 0x1F, 0x78, 0x89, 0x65, 0xBD, 0x44 },
|
|
|
+ { 0x39, 0xDA, 0x69, 0xD6, 0xBA, 0x49, 0x97, 0xD5,
|
|
|
+ 0x85, 0xB6, 0xDC, 0x07, 0x3C, 0xA3, 0x41, 0xB2 },
|
|
|
+ { 0x18, 0x2B, 0x02, 0xD8, 0x14, 0x97, 0xEA, 0x45,
|
|
|
+ 0xF9, 0xDA, 0xAC, 0xDC, 0x29, 0x19, 0x3A, 0x65 }
|
|
|
+ }, {
|
|
|
+ 32,
|
|
|
+ { 0xD4, 0x3B, 0xB7, 0x55, 0x6E, 0xA3, 0x2E, 0x46,
|
|
|
+ 0xF2, 0xA2, 0x82, 0xB7, 0xD4, 0x5B, 0x4E, 0x0D,
|
|
|
+ 0x57, 0xFF, 0x73, 0x9D, 0x4D, 0xC9, 0x2C, 0x1B,
|
|
|
+ 0xD7, 0xFC, 0x01, 0x70, 0x0C, 0xC8, 0x21, 0x6F },
|
|
|
+ { 0x90, 0xAF, 0xE9, 0x1B, 0xB2, 0x88, 0x54, 0x4F,
|
|
|
+ 0x2C, 0x32, 0xDC, 0x23, 0x9B, 0x26, 0x35, 0xE6 },
|
|
|
+ { 0x6C, 0xB4, 0x56, 0x1C, 0x40, 0xBF, 0x0A, 0x97,
|
|
|
+ 0x05, 0x93, 0x1C, 0xB6, 0xD4, 0x08, 0xE7, 0xFA }
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
|
|
|
symmetric_key key;
|
|
|
unsigned char tmp[2][16];
|
|
|
- int errno;
|
|
|
-
|
|
|
- if ((errno = twofish_setup(key128, 16, 0, &key)) != CRYPT_OK) {
|
|
|
- return errno;
|
|
|
- }
|
|
|
- twofish_ecb_encrypt(pt128, tmp[0], &key);
|
|
|
- twofish_ecb_decrypt(tmp[0], tmp[1], &key);
|
|
|
- if (memcmp(tmp[0], ct128, 16) || memcmp(tmp[1], pt128, 16)) {
|
|
|
- return CRYPT_FAIL_TESTVECTOR;
|
|
|
- }
|
|
|
+ int errno, i;
|
|
|
|
|
|
- if ((errno = twofish_setup(key192, 24, 0, &key)) != CRYPT_OK) {
|
|
|
- return errno;
|
|
|
- }
|
|
|
- twofish_ecb_encrypt(pt192, tmp[0], &key);
|
|
|
- twofish_ecb_decrypt(tmp[0], tmp[1], &key);
|
|
|
- if (memcmp(tmp[0], ct192, 16) || memcmp(tmp[1], pt192, 16)) {
|
|
|
- return CRYPT_FAIL_TESTVECTOR;
|
|
|
- }
|
|
|
-
|
|
|
- if ((errno = twofish_setup(key256, 32, 0, &key)) != CRYPT_OK) {
|
|
|
- return errno;
|
|
|
- }
|
|
|
- twofish_ecb_encrypt(pt256, tmp[0], &key);
|
|
|
- twofish_ecb_decrypt(tmp[0], tmp[1], &key);
|
|
|
- if (memcmp(tmp[0], ct256, 16) || memcmp(tmp[1], pt256, 16)) {
|
|
|
- return CRYPT_FAIL_TESTVECTOR;
|
|
|
- }
|
|
|
-
|
|
|
+ for (i = 0; i < (int)(sizeof(tests)/sizeof(tests[0])); i++) {
|
|
|
+ if ((errno = twofish_setup(tests[i].key, tests[i].keylen, 0, &key)) != CRYPT_OK) {
|
|
|
+ return errno;
|
|
|
+ }
|
|
|
+ twofish_ecb_encrypt(tests[i].pt, tmp[0], &key);
|
|
|
+ twofish_ecb_decrypt(tmp[0], tmp[1], &key);
|
|
|
+ if (memcmp(tmp[0], tests[i].ct, 16) || memcmp(tmp[1], tests[i].pt, 16)) {
|
|
|
+ return CRYPT_FAIL_TESTVECTOR;
|
|
|
+ }
|
|
|
+ }
|
|
|
return CRYPT_OK;
|
|
|
}
|
|
|
|