2012-08-05 01:21:13 +02:00
|
|
|
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
|
|
|
|
*
|
|
|
|
* LibTomCrypt is a library that provides various cryptographic
|
|
|
|
* algorithms in a highly modular and flexible manner.
|
|
|
|
*
|
|
|
|
* The library is free for all purposes without any express
|
|
|
|
* guarantee it works.
|
|
|
|
*
|
|
|
|
* Tom St Denis, tomstdenis@gmail.com, http://libtom.org
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
@file ocb3_test.c
|
|
|
|
OCB implementation, self-test by Tom St Denis
|
|
|
|
*/
|
|
|
|
#include "tomcrypt.h"
|
|
|
|
|
|
|
|
#ifdef LTC_OCB3_MODE
|
|
|
|
|
|
|
|
/**
|
|
|
|
Test the OCB protocol
|
|
|
|
@return CRYPT_OK if successful
|
|
|
|
*/
|
|
|
|
int ocb3_test(void)
|
|
|
|
{
|
|
|
|
#ifndef LTC_TEST
|
|
|
|
return CRYPT_NOP;
|
|
|
|
#else
|
|
|
|
/* test vectors from: http://tools.ietf.org/html/draft-krovetz-ocb-03 */
|
|
|
|
unsigned char key[16] = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F };
|
|
|
|
unsigned char nonce[12] = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B };
|
|
|
|
static const struct {
|
|
|
|
int ptlen;
|
|
|
|
int aadlen;
|
|
|
|
unsigned char pt[64], aad[64], ct[64], tag[16];
|
|
|
|
} tests[] = {
|
|
|
|
|
2015-12-20 17:01:18 +01:00
|
|
|
{ /* index:0 */
|
|
|
|
0, /* PLAINTEXT length */
|
|
|
|
0, /* AAD length */
|
|
|
|
{ }, /* PLAINTEXT */
|
|
|
|
{ }, /* AAD */
|
|
|
|
{ }, /* CIPHERTEXT */
|
|
|
|
{ 0x19,0x7b,0x9c,0x3c,0x44,0x1d,0x3c,0x83,0xea,0xfb,0x2b,0xef,0x63,0x3b,0x91,0x82 }, /* TAG */
|
|
|
|
},
|
|
|
|
{ /* index:1 */
|
|
|
|
8, /* PLAINTEXT length */
|
|
|
|
8, /* AAD length */
|
|
|
|
{ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07 }, /* PLAINTEXT */
|
|
|
|
{ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07 }, /* AAD */
|
|
|
|
{ 0x92,0xb6,0x57,0x13,0x0a,0x74,0xb8,0x5a }, /* CIPHERTEXT */
|
|
|
|
{ 0x16,0xdc,0x76,0xa4,0x6d,0x47,0xe1,0xea,0xd5,0x37,0x20,0x9e,0x8a,0x96,0xd1,0x4e }, /* TAG */
|
|
|
|
},
|
|
|
|
{ /* index:2 */
|
|
|
|
0, /* PLAINTEXT length */
|
|
|
|
8, /* AAD length */
|
|
|
|
{ }, /* PLAINTEXT */
|
|
|
|
{ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07 }, /* AAD */
|
|
|
|
{ }, /* CIPHERTEXT */
|
|
|
|
{ 0x98,0xb9,0x15,0x52,0xc8,0xc0,0x09,0x18,0x50,0x44,0xe3,0x0a,0x6e,0xb2,0xfe,0x21 }, /* TAG */
|
|
|
|
},
|
|
|
|
{ /* index:3 */
|
|
|
|
8, /* PLAINTEXT length */
|
|
|
|
0, /* AAD length */
|
|
|
|
{ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07 }, /* PLAINTEXT */
|
|
|
|
{ }, /* AAD */
|
|
|
|
{ 0x92,0xb6,0x57,0x13,0x0a,0x74,0xb8,0x5a }, /* CIPHERTEXT */
|
|
|
|
{ 0x97,0x1e,0xff,0xca,0xe1,0x9a,0xd4,0x71,0x6f,0x88,0xe8,0x7b,0x87,0x1f,0xbe,0xed }, /* TAG */
|
|
|
|
},
|
|
|
|
{ /* index:4 */
|
|
|
|
16, /* PLAINTEXT length */
|
|
|
|
16, /* AAD length */
|
|
|
|
{ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f }, /* PLAINTEXT */
|
|
|
|
{ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f }, /* AAD */
|
|
|
|
{ 0xbe,0xa5,0xe8,0x79,0x8d,0xbe,0x71,0x10,0x03,0x1c,0x14,0x4d,0xa0,0xb2,0x61,0x22 }, /* CIPHERTEXT */
|
|
|
|
{ 0x77,0x6c,0x99,0x24,0xd6,0x72,0x3a,0x1f,0xc4,0x52,0x45,0x32,0xac,0x3e,0x5b,0xeb }, /* TAG */
|
|
|
|
},
|
|
|
|
{ /* index:5 */
|
|
|
|
0, /* PLAINTEXT length */
|
|
|
|
16, /* AAD length */
|
|
|
|
{ }, /* PLAINTEXT */
|
|
|
|
{ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f }, /* AAD */
|
|
|
|
{ }, /* CIPHERTEXT */
|
|
|
|
{ 0x7d,0xdb,0x8e,0x6c,0xea,0x68,0x14,0x86,0x62,0x12,0x50,0x96,0x19,0xb1,0x9c,0xc6 }, /* TAG */
|
|
|
|
},
|
|
|
|
{ /* index:6 */
|
|
|
|
16, /* PLAINTEXT length */
|
|
|
|
0, /* AAD length */
|
|
|
|
{ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f }, /* PLAINTEXT */
|
|
|
|
{ }, /* AAD */
|
|
|
|
{ 0xbe,0xa5,0xe8,0x79,0x8d,0xbe,0x71,0x10,0x03,0x1c,0x14,0x4d,0xa0,0xb2,0x61,0x22 }, /* CIPHERTEXT */
|
|
|
|
{ 0x13,0xcc,0x8b,0x74,0x78,0x07,0x12,0x1a,0x4c,0xbb,0x3e,0x4b,0xd6,0xb4,0x56,0xaf }, /* TAG */
|
|
|
|
},
|
|
|
|
{ /* index:7 */
|
|
|
|
24, /* PLAINTEXT length */
|
|
|
|
24, /* AAD length */
|
|
|
|
{ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17 }, /* PLAINTEXT */
|
|
|
|
{ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17 }, /* AAD */
|
|
|
|
{ 0xbe,0xa5,0xe8,0x79,0x8d,0xbe,0x71,0x10,0x03,0x1c,0x14,0x4d,0xa0,0xb2,0x61,0x22,0xfc,0xfc,0xee,0x7a,0x2a,0x8d,0x4d,0x48 }, /* CIPHERTEXT */
|
|
|
|
{ 0x5f,0xa9,0x4f,0xc3,0xf3,0x88,0x20,0xf1,0xdc,0x3f,0x3d,0x1f,0xd4,0xe5,0x5e,0x1c }, /* TAG */
|
|
|
|
},
|
|
|
|
{ /* index:8 */
|
|
|
|
0, /* PLAINTEXT length */
|
|
|
|
24, /* AAD length */
|
|
|
|
{ }, /* PLAINTEXT */
|
|
|
|
{ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17 }, /* AAD */
|
|
|
|
{ }, /* CIPHERTEXT */
|
|
|
|
{ 0x28,0x20,0x26,0xda,0x30,0x68,0xbc,0x9f,0xa1,0x18,0x68,0x1d,0x55,0x9f,0x10,0xf6 }, /* TAG */
|
|
|
|
},
|
|
|
|
{ /* index:9 */
|
|
|
|
24, /* PLAINTEXT length */
|
|
|
|
0, /* AAD length */
|
|
|
|
{ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17 }, /* PLAINTEXT */
|
|
|
|
{ }, /* AAD */
|
|
|
|
{ 0xbe,0xa5,0xe8,0x79,0x8d,0xbe,0x71,0x10,0x03,0x1c,0x14,0x4d,0xa0,0xb2,0x61,0x22,0xfc,0xfc,0xee,0x7a,0x2a,0x8d,0x4d,0x48 }, /* CIPHERTEXT */
|
|
|
|
{ 0x6e,0xf2,0xf5,0x25,0x87,0xfd,0xa0,0xed,0x97,0xdc,0x7e,0xed,0xe2,0x41,0xdf,0x68 }, /* TAG */
|
|
|
|
},
|
|
|
|
{ /* index:10 */
|
|
|
|
32, /* PLAINTEXT length */
|
|
|
|
32, /* AAD length */
|
|
|
|
{ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f }, /* PLAINTEXT */
|
|
|
|
{ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f }, /* AAD */
|
|
|
|
{ 0xbe,0xa5,0xe8,0x79,0x8d,0xbe,0x71,0x10,0x03,0x1c,0x14,0x4d,0xa0,0xb2,0x61,0x22,0xce,0xaa,0xb9,0xb0,0x5d,0xf7,0x71,0xa6,0x57,0x14,0x9d,0x53,0x77,0x34,0x63,0xcb }, /* CIPHERTEXT */
|
|
|
|
{ 0xb2,0xa0,0x40,0xdd,0x3b,0xd5,0x16,0x43,0x72,0xd7,0x6d,0x7b,0xb6,0x82,0x42,0x40 }, /* TAG */
|
|
|
|
},
|
|
|
|
{ /* index:11 */
|
|
|
|
0, /* PLAINTEXT length */
|
|
|
|
32, /* AAD length */
|
|
|
|
{ }, /* PLAINTEXT */
|
|
|
|
{ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f }, /* AAD */
|
|
|
|
{ }, /* CIPHERTEXT */
|
|
|
|
{ 0xe1,0xe0,0x72,0x63,0x3b,0xad,0xe5,0x1a,0x60,0xe8,0x59,0x51,0xd9,0xc4,0x2a,0x1b }, /* TAG */
|
|
|
|
},
|
|
|
|
{ /* index:12 */
|
|
|
|
32, /* PLAINTEXT length */
|
|
|
|
0, /* AAD length */
|
|
|
|
{ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f }, /* PLAINTEXT */
|
|
|
|
{ }, /* AAD */
|
|
|
|
{ 0xbe,0xa5,0xe8,0x79,0x8d,0xbe,0x71,0x10,0x03,0x1c,0x14,0x4d,0xa0,0xb2,0x61,0x22,0xce,0xaa,0xb9,0xb0,0x5d,0xf7,0x71,0xa6,0x57,0x14,0x9d,0x53,0x77,0x34,0x63,0xcb }, /* CIPHERTEXT */
|
|
|
|
{ 0x4a,0x3b,0xae,0x82,0x44,0x65,0xcf,0xda,0xf8,0xc4,0x1f,0xc5,0x0c,0x7d,0xf9,0xd9 }, /* TAG */
|
|
|
|
},
|
|
|
|
{ /* index:13 */
|
|
|
|
40, /* PLAINTEXT length */
|
|
|
|
40, /* AAD length */
|
|
|
|
{ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27 }, /* PLAINTEXT */
|
|
|
|
{ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27 }, /* AAD */
|
|
|
|
{ 0xbe,0xa5,0xe8,0x79,0x8d,0xbe,0x71,0x10,0x03,0x1c,0x14,0x4d,0xa0,0xb2,0x61,0x22,0xce,0xaa,0xb9,0xb0,0x5d,0xf7,0x71,0xa6,0x57,0x14,0x9d,0x53,0x77,0x34,0x63,0xcb,0x68,0xc6,0x57,0x78,0xb0,0x58,0xa6,0x35 }, /* CIPHERTEXT */
|
|
|
|
{ 0x65,0x9c,0x62,0x32,0x11,0xde,0xea,0x0d,0xe3,0x0d,0x2c,0x38,0x18,0x79,0xf4,0xc8 }, /* TAG */
|
|
|
|
},
|
|
|
|
{ /* index:14 */
|
|
|
|
0, /* PLAINTEXT length */
|
|
|
|
40, /* AAD length */
|
|
|
|
{ }, /* PLAINTEXT */
|
|
|
|
{ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27 }, /* AAD */
|
|
|
|
{ }, /* CIPHERTEXT */
|
|
|
|
{ 0x7a,0xeb,0x7a,0x69,0xa1,0x68,0x7d,0xd0,0x82,0xca,0x27,0xb0,0xd9,0xa3,0x70,0x96 }, /* TAG */
|
|
|
|
},
|
|
|
|
{ /* index:15 */
|
|
|
|
40, /* PLAINTEXT length */
|
|
|
|
0, /* AAD length */
|
|
|
|
{ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27 }, /* PLAINTEXT */
|
|
|
|
{ }, /* AAD */
|
|
|
|
{ 0xbe,0xa5,0xe8,0x79,0x8d,0xbe,0x71,0x10,0x03,0x1c,0x14,0x4d,0xa0,0xb2,0x61,0x22,0xce,0xaa,0xb9,0xb0,0x5d,0xf7,0x71,0xa6,0x57,0x14,0x9d,0x53,0x77,0x34,0x63,0xcb,0x68,0xc6,0x57,0x78,0xb0,0x58,0xa6,0x35 }, /* CIPHERTEXT */
|
|
|
|
{ 0x06,0x0c,0x84,0x67,0xf4,0xab,0xab,0x5e,0x8b,0x3c,0x20,0x67,0xa2,0xe1,0x15,0xdc }, /* TAG */
|
|
|
|
},
|
2012-08-05 01:21:13 +02:00
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
int err, x, idx, res;
|
|
|
|
unsigned long len;
|
|
|
|
unsigned char outct[MAXBLOCKSIZE], outtag[MAXBLOCKSIZE];
|
|
|
|
|
|
|
|
/* AES can be under rijndael or aes... try to find it */
|
|
|
|
if ((idx = find_cipher("aes")) == -1) {
|
|
|
|
if ((idx = find_cipher("rijndael")) == -1) {
|
|
|
|
return CRYPT_NOP;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (x = 0; x < (int)(sizeof(tests)/sizeof(tests[0])); x++) {
|
|
|
|
len = sizeof(outtag);
|
|
|
|
if ((err = ocb3_encrypt_authenticate_memory(idx,
|
|
|
|
key, sizeof(key),
|
|
|
|
nonce, sizeof(nonce),
|
|
|
|
tests[x].aad, tests[x].aadlen,
|
|
|
|
tests[x].pt, tests[x].ptlen,
|
|
|
|
outct, outtag, &len)) != CRYPT_OK) {
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (XMEMCMP(outtag, tests[x].tag, len) || XMEMCMP(outct, tests[x].ct, tests[x].ptlen)) {
|
|
|
|
#if 0
|
|
|
|
unsigned long y;
|
|
|
|
printf("\n\nFailure: \nCT:\n");
|
|
|
|
for (y = 0; y < (unsigned long)tests[x].ptlen; ) {
|
|
|
|
printf("0x%02x", outct[y]);
|
|
|
|
if (y < (unsigned long)(tests[x].ptlen-1)) printf(", ");
|
|
|
|
if (!(++y % 8)) printf("\n");
|
|
|
|
}
|
|
|
|
printf("\nTAG:\n");
|
|
|
|
for (y = 0; y < len; ) {
|
|
|
|
printf("0x%02x", outtag[y]);
|
|
|
|
if (y < len-1) printf(", ");
|
|
|
|
if (!(++y % 8)) printf("\n");
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
return CRYPT_FAIL_TESTVECTOR;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((err = ocb3_decrypt_verify_memory(idx,
|
|
|
|
key, sizeof(key),
|
|
|
|
nonce, sizeof(nonce),
|
|
|
|
tests[x].aad, tests[x].aadlen,
|
|
|
|
outct, tests[x].ptlen,
|
|
|
|
outct, tests[x].tag, len, &res)) != CRYPT_OK) {
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
if ((res != 1) || XMEMCMP(tests[x].pt, outct, tests[x].ptlen)) {
|
|
|
|
#if 0
|
|
|
|
unsigned long y;
|
|
|
|
printf("\n\nFailure-decrypt: \nPT:\n");
|
|
|
|
for (y = 0; y < (unsigned long)tests[x].ptlen; ) {
|
|
|
|
printf("0x%02x", outct[y]);
|
|
|
|
if (y < (unsigned long)(tests[x].ptlen-1)) printf(", ");
|
|
|
|
if (!(++y % 8)) printf("\n");
|
|
|
|
}
|
|
|
|
printf("\nres = %d\n\n", res);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return CRYPT_OK;
|
|
|
|
#endif /* LTC_TEST */
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* LTC_OCB3_MODE */
|
|
|
|
|
|
|
|
/* some comments
|
|
|
|
|
|
|
|
-- it's hard to seek
|
|
|
|
-- hard to stream [you can't emit ciphertext until full block]
|
|
|
|
-- The setup is somewhat complicated...
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* $Source$ */
|
|
|
|
/* $Revision$ */
|
|
|
|
/* $Date$ */
|