| /* |
| * cifra - embedded cryptography library |
| * Written in 2014 by Joseph Birr-Pixton <jpixton@gmail.com> |
| * |
| * To the extent possible under law, the author(s) have dedicated all |
| * copyright and related and neighboring rights to this software to the |
| * public domain worldwide. This software is distributed without any |
| * warranty. |
| * |
| * You should have received a copy of the CC0 Public Domain Dedication |
| * along with this software. If not, see |
| * <http://creativecommons.org/publicdomain/zero/1.0/>. |
| */ |
| |
| #include "aes.h" |
| #include "modes.h" |
| #include "bitops.h" |
| #include "gf128.h" |
| |
| #include "handy.h" |
| #include "cutest.h" |
| #include "testutil.h" |
| |
| /* Some tests are too big for microcontrollers. */ |
| #if defined(CORTEX_M0) || defined(CORTEX_M3) || defined(CORTEX_M4) |
| # define MCU_TARGET 1 |
| #else |
| # define MCU_TARGET 0 |
| #endif |
| |
| static void test_cbc(void) |
| { |
| uint8_t out[16]; |
| |
| const void *iv = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"; |
| const void *key = "\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c"; |
| const void *inp = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a"; |
| const void *expect = "\x76\x49\xab\xac\x81\x19\xb2\x46\xce\xe9\x8e\x9b\x12\xe9\x19\x7d"; |
| |
| cf_aes_context aes; |
| cf_aes_init(&aes, key, 16); |
| |
| cf_cbc cbc; |
| cf_cbc_init(&cbc, &cf_aes, &aes, iv); |
| cf_cbc_encrypt(&cbc, inp, out, 1); |
| TEST_CHECK(memcmp(out, expect, 16) == 0); |
| |
| uint8_t decrypt[16]; |
| cf_cbc_init(&cbc, &cf_aes, &aes, iv); |
| cf_cbc_decrypt(&cbc, out, decrypt, 1); |
| TEST_CHECK(memcmp(decrypt, inp, 16) == 0); |
| } |
| |
| static void cbcmac_vector(const void *tag_expect, size_t ntag, |
| const void *key, size_t nkey, |
| const void *msg, size_t nmsg) |
| { |
| uint8_t tag[16]; |
| |
| cf_aes_context aes; |
| cf_aes_init(&aes, key, nkey); |
| |
| cf_cbcmac_stream cm; |
| cf_cbcmac_stream_init(&cm, &cf_aes, &aes); |
| cf_cbcmac_stream_update(&cm, msg, nmsg); |
| cf_cbcmac_stream_pad_final(&cm, tag); |
| |
| TEST_CHECK(sizeof tag == ntag); |
| TEST_CHECK(memcmp(tag, tag_expect, sizeof tag) == 0); |
| } |
| |
| static void test_cbcmac(void) |
| { |
| cbcmac_vector("\xf0\xf1\x89\x75\xa0\x85\x9d\x13\xa4\x9d\x3d\xbf\xc6\xcd\x65\xd9", 16, "\x04\xf7\xf7\x78\x62\x1d\x1e\x2c\x86\x47\x82\x2a\x50\xd9\x8a\x83", 16, "\x83\x1b\xe7\x4b\x9b\xe6\x85\xc8\x38\xe2\x2a\x25\xa3\x11\xcb\x14\x79\x62\x35\xf5\x28\x98\xd0", 23); |
| cbcmac_vector("\x0d\x6a\x13\x8f\x75\xb7\x56\x94\xd5\x15\xc5\x55\x5e\xee\xdd\x92", 16, "\xff\x84\x5a\xfc\x51\xf2\x06\x35\xa4\x8f\x6c\xec\x9f\x78\x1f\x2e", 16, "\xc5\x85\x3e\x6b\x3f\x7e\xf5\x10\x93\x6e\x30\xd5\x54\x13\x5f\x0d\x55\x43\x92\x8c\x53\xfc\x2f\x81\xa3", 25); |
| cbcmac_vector("\x96\x81\x3d\xb1\x7e\xac\x06\xb9\x79\x42\xa7\x3a\x7c\x5a\x0a\xad", 16, "\x10\x77\x16\x47\x23\x2e\xda\x40\x23\xd7\xc5\xc9\xbb\x51\x2e\x93", 16, "\x06\x53\x5f\x70\xd9\x6c\x80\x50\x85\x6b\x02\x4f\x67\xae\x87\xde\xc8\xd2\x9d\xab\xb7\x1f\x55\x93\x51\x00\x0a\x3c\x8f\xfc\x63\x60", 32); |
| cbcmac_vector("\x20\xdd\xa5\xb1\xc1\x14\x00\x90\x97\x41\xef\x3b\xc6\xac\xe8\xec", 16, "\x5b\x39\xdb\x4b\xa4\x53\x1f\x97\xf9\xca\x4b\xdd\xed\x9b\x28\x53", 16, "\x49\x91\xb3\x35\x40\xda\x4d\x8a\xdf\xe9\x37\x4b\xb4\xe1\xc5", 15); |
| cbcmac_vector("\xc0\x2f\x8f\x0a\xba\x13\x4b\x6b\x16\x69\xfb\x58\x2f\xc1\xc8\x76", 16, "\xd0\x22\xc7\xe7\x85\xd2\xfc\xa4\xd6\x7f\xaa\x18\xb1\xa9\xfd\x9d\x7a\x47\x37\x09\x33\x43\x06\x32", 24, "\x2b\xa2\x8e\xa5\x62\xdd\x9c\x5e\x80\xcc\xaf\x80\x16\x77", 14); |
| cbcmac_vector("\x05\x79\x4b\x5f\xc8\xf2\xee\x87\x74\xcd\x88\x9f\x7c\x29\xeb\xa0", 16, "\xe4\x51\xdb\x26\x8e\x2a\x26\xd1\xbf\x78\x3e\xab\x5d\xc6\xf9\x3f\xb2\xc5\xe2\x5c\xe8\x61\x28\x3c", 24, "\xea\x14\xfa\xaa\x95\x48\x12\xcb", 8); |
| cbcmac_vector("\x6a\x14\x4b\xaa\x39\xf6\x19\x71\x62\x65\xd3\x4e\x53\xb4\xc6\x7c", 16, "\xff\x46\x38\x0f\x62\xa9\x37\x7f\xb2\x41\x88\x44\x39\x2a\x97\xf5\xb9\x9a\xc0\x37\xf9\xc6\x75\x3f", 24, "\x64\x04\x53\x4c\xa8\x0a\x60\xf6\x5e\x22\xb6\xc4\xd7\xf3\xa9\x33\xf9\x3e", 18); |
| cbcmac_vector("\xf7\x1d\x16\x5c\xba\xac\x0f\xf0\x1a\x12\x75\xf8\x5b\x6a\x8e\x15", 16, "\x67\xce\x47\x6c\x11\x0e\xa1\xbc\xf0\x81\x30\x2b\x5f\xe2\x3b\xbc\x34\xc5\x4d\x46\x01\xed\x49\x04", 24, "\x94\xb1\x25\x63\x49\x49\x46\x7e\x7a\xa0\x0e\xa1\x10\x25\x21\x9a\xc9\x1f\x0d\xed\xa1\x10\x30\x7e\x08\x84\xee\x09\xe8\x31\x53\x81", 32); |
| cbcmac_vector("\x22\xfb\x7e\x4c\x77\x12\x7c\xed\x2c\xaa\xf9\x8d\x9f\x35\x15\x60", 16, "\x1c\x50\xc0\x79\x7c\xd6\x7f\x89\x26\xd1\xc9\xb9\x85\xf9\xee\xaf\x18\x3f\x07\x0b\x3a\xd2\x5f\x7e\xfa\x08\x95\xfe\x98\xe3\x43\x91", 32, "\x7d\x1e\x7e\x19\x9a\xd4\xf4\x3f\xcf\xff\x55\xf7\xc9\x81\xe6\x13\xc0\x22\xab\x7f\x83\x92\x21\x72\x65\x79\x78\xcd\xf0\x8b\x36", 31); |
| cbcmac_vector("\x40\xc1\xef\xf3\xf4\x71\x54\x58\x77\x3c\xd3\x07\x96\xdf\xfd\x54", 16, "\x3c\x1e\xae\xa7\x4a\xf6\xee\x43\x9b\xd7\xa3\x76\x38\xd6\x08\x21\x60\xe6\x1b\x23\x2b\xf8\xa4\x5d\x05\xd5\xf4\x89\x04\x3e\x2d\x19", 32, "\xd2\xa3\x38\x1a\x82\xd6\xb6\xc2\x52\x93\x43\x1d\xdc\x1d\x73\xb5\x14\x82\x40\xfe\x00\xc3\x24\x52\x8d\x69\xc6\x11\x4e\x4c\xa9\x40\xcd\xfb\x29\x17", 36); |
| cbcmac_vector("\x69\x7c\x65\x95\xa2\x1f\xa2\xfa\x3a\xd3\x60\x68\x7a\xed\x68\x37", 16, "\xc2\xda\x01\xb4\x12\xa5\xcd\x1c\x75\xb5\x08\x5f\xd2\xee\x79\xc3\x47\xd9\xf9\x12\x86\x3d\x81\xd0\x42\x89\x75\x96\x58\x70\x47\x05", 32, "\x65\x22\x9b\x77\x15\xe5\x02\x54\x04\x90\xfb\xe2\xbf\x5a\x8e\xb0\xbf\x64\xff\x7f\xb7\xab\x7f\x18\x69\x7b", 26); |
| cbcmac_vector("\xf5\x2d\x65\x16\x84\x43\x0d\xe8\x1f\x29\x51\x06\xec\xf0\xa5\xd2", 16, "\x76\xff\xb3\x38\x5b\xca\x7c\x93\xc0\x12\xd7\xbc\xb3\xa3\xd0\xf2\x87\xa7\x0a\x91\x36\x76\xa7\x8d\x28\x47\x05\x8e\x75\xae\x5e\x3c", 32, "\x12\x90\x91\x65\x32\x37\xd0\x35\xf6\x40\x42\xa7\x4f\x61\xa9\x9c\x8f\xd6\x84\x9a\x86\x0e\x57\xe7\xe4", 25); |
| } |
| |
| static void test_ctr(void) |
| { |
| uint8_t out[16]; |
| |
| const void *nonce = "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"; |
| const void *key = "\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c"; |
| const void *inp = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a"; |
| const void *expect = "\x87\x4d\x61\x91\xb6\x20\xe3\x26\x1b\xef\x68\x64\x99\x0d\xb6\xce"; |
| |
| cf_aes_context aes; |
| cf_aes_init(&aes, key, 16); |
| |
| cf_ctr ctr; |
| cf_ctr_init(&ctr, &cf_aes, &aes, nonce); |
| cf_ctr_cipher(&ctr, inp, out, 16); /* one piece */ |
| TEST_CHECK(memcmp(expect, out, 16) == 0); |
| |
| cf_ctr_init(&ctr, &cf_aes, &aes, nonce); |
| cf_ctr_cipher(&ctr, inp, out, 1); /* incremental (2 blocks) */ |
| cf_ctr_cipher(&ctr, inp, out, 16); |
| cf_ctr_cipher(&ctr, inp, out, 16); |
| |
| cf_ctr_init(&ctr, &cf_aes, &aes, nonce); |
| cf_ctr_cipher(&ctr, inp, out, 1); /* incremental */ |
| cf_ctr_cipher(&ctr, ((uint8_t *)inp) + 1, out + 1, 15); |
| TEST_CHECK(memcmp(expect, out, 16) == 0); |
| |
| uint8_t decrypt[16]; |
| cf_ctr_init(&ctr, &cf_aes, &aes, nonce); |
| cf_ctr_cipher(&ctr, out, decrypt, 16); |
| TEST_CHECK(memcmp(decrypt, inp, 16) == 0); |
| |
| /* Test we use the right number of blocks up. */ |
| uint8_t test_nonce[16], test_inp[16]; |
| memset(test_nonce, 0xff, 16); |
| memset(test_inp, 0x00, 16); |
| cf_ctr_init(&ctr, &cf_aes, &aes, test_nonce); |
| |
| /* Exercise cf_blockwise_xor code paths. */ |
| for (int i = 0; i < 1024; i++) |
| { |
| cf_ctr_cipher(&ctr, test_inp, out, i % 16); |
| } |
| |
| /* expected counter value is 1024 * 7.5 / 16 - 1: |
| * 479 = 0x1df |
| */ |
| |
| memset(test_nonce, 0, sizeof test_nonce); |
| test_nonce[15] = 0xdf; |
| test_nonce[14] = 0x01; |
| |
| TEST_CHECK(memcmp(test_nonce, ctr.nonce, 16) == 0); |
| } |
| |
| static void check_eax(const void *key, size_t nkey, |
| const void *msg, size_t nmsg, |
| const void *nonce, size_t nnonce, |
| const void *header, size_t nheader, |
| const void *expect_cipher, |
| const void *expect_tag, size_t ntag) |
| { |
| uint8_t cipher[32]; |
| uint8_t tag[16]; |
| |
| assert(nmsg <= sizeof cipher); |
| assert(ntag <= ntag); |
| |
| cf_aes_context aes; |
| cf_aes_init(&aes, key, nkey); |
| |
| cf_eax_encrypt(&cf_aes, &aes, |
| msg, nmsg, |
| header, nheader, |
| nonce, nnonce, |
| cipher, |
| tag, ntag); |
| |
| TEST_CHECK(memcmp(expect_cipher, cipher, nmsg) == 0); |
| TEST_CHECK(memcmp(expect_tag, tag, ntag) == 0); |
| |
| int rc; |
| uint8_t tmp[sizeof cipher]; |
| rc = cf_eax_decrypt(&cf_aes, &aes, |
| cipher, nmsg, |
| header, nheader, |
| nonce, nnonce, |
| tag, ntag, |
| tmp); |
| TEST_CHECK(rc == 0); |
| TEST_CHECK(memcmp(tmp, msg, nmsg) == 0); |
| |
| tag[0] ^= 0xff; |
| rc = cf_eax_decrypt(&cf_aes, &aes, |
| cipher, nmsg, |
| header, nheader, |
| nonce, nnonce, |
| tag, ntag, |
| tmp); |
| TEST_CHECK(rc == 1); |
| } |
| |
| static void test_eax(void) |
| { |
| /* Test vectors from paper. */ |
| check_eax("\x23\x39\x52\xDE\xE4\xD5\xED\x5F\x9B\x9C\x6D\x6F\xF8\x0F\xF4\x78", 16, |
| "", 0, |
| "\x62\xEC\x67\xF9\xC3\xA4\xA4\x07\xFC\xB2\xA8\xC4\x90\x31\xA8\xB3", 16, |
| "\x6B\xFB\x91\x4F\xD0\x7E\xAE\x6B", 8, |
| "", |
| "\xE0\x37\x83\x0E\x83\x89\xF2\x7B\x02\x5A\x2D\x65\x27\xE7\x9D\x01", 16); |
| |
| check_eax("\x91\x94\x5D\x3F\x4D\xCB\xEE\x0B\xF4\x5E\xF5\x22\x55\xF0\x95\xA4", 16, |
| "\xF7\xFB", 2, |
| "\xBE\xCA\xF0\x43\xB0\xA2\x3D\x84\x31\x94\xBA\x97\x2C\x66\xDE\xBD", 16, |
| "\xFA\x3B\xFD\x48\x06\xEB\x53\xFA", 8, |
| "\x19\xDD", |
| "\x5C\x4C\x93\x31\x04\x9D\x0B\xDA\xB0\x27\x74\x08\xF6\x79\x67\xE5", 16); |
| |
| check_eax("\x01\xF7\x4A\xD6\x40\x77\xF2\xE7\x04\xC0\xF6\x0A\xDA\x3D\xD5\x23", 16, |
| "\x1A\x47\xCB\x49\x33", 5, |
| "\x70\xC3\xDB\x4F\x0D\x26\x36\x84\x00\xA1\x0E\xD0\x5D\x2B\xFF\x5E", 16, |
| "\x23\x4A\x34\x63\xC1\x26\x4A\xC6", 8, |
| "\xD8\x51\xD5\xBA\xE0", |
| "\x3A\x59\xF2\x38\xA2\x3E\x39\x19\x9D\xC9\x26\x66\x26\xC4\x0F\x80", 16); |
| |
| check_eax("\xD0\x7C\xF6\xCB\xB7\xF3\x13\xBD\xDE\x66\xB7\x27\xAF\xD3\xC5\xE8", 16, |
| "\x48\x1C\x9E\x39\xB1", 5, |
| "\x84\x08\xDF\xFF\x3C\x1A\x2B\x12\x92\xDC\x19\x9E\x46\xB7\xD6\x17", 16, |
| "\x33\xCC\xE2\xEA\xBF\xF5\xA7\x9D", 8, |
| "\x63\x2A\x9D\x13\x1A", |
| "\xD4\xC1\x68\xA4\x22\x5D\x8E\x1F\xF7\x55\x93\x99\x74\xA7\xBE\xDE", 16); |
| |
| check_eax("\x35\xB6\xD0\x58\x00\x05\xBB\xC1\x2B\x05\x87\x12\x45\x57\xD2\xC2", 16, |
| "\x40\xD0\xC0\x7D\xA5\xE4", 6, |
| "\xFD\xB6\xB0\x66\x76\xEE\xDC\x5C\x61\xD7\x42\x76\xE1\xF8\xE8\x16", 16, |
| "\xAE\xB9\x6E\xAE\xBE\x29\x70\xE9", 8, |
| "\x07\x1D\xFE\x16\xC6\x75", |
| "\xCB\x06\x77\xE5\x36\xF7\x3A\xFE\x6A\x14\xB7\x4E\xE4\x98\x44\xDD", 16); |
| |
| check_eax("\xBD\x8E\x6E\x11\x47\x5E\x60\xB2\x68\x78\x4C\x38\xC6\x2F\xEB\x22", 16, |
| "\x4D\xE3\xB3\x5C\x3F\xC0\x39\x24\x5B\xD1\xFB\x7D", 12, |
| "\x6E\xAC\x5C\x93\x07\x2D\x8E\x85\x13\xF7\x50\x93\x5E\x46\xDA\x1B", 16, |
| "\xD4\x48\x2D\x1C\xA7\x8D\xCE\x0F", 8, |
| "\x83\x5B\xB4\xF1\x5D\x74\x3E\x35\x0E\x72\x84\x14", |
| "\xAB\xB8\x64\x4F\xD6\xCC\xB8\x69\x47\xC5\xE1\x05\x90\x21\x0A\x4F", 16); |
| |
| check_eax("\x7C\x77\xD6\xE8\x13\xBE\xD5\xAC\x98\xBA\xA4\x17\x47\x7A\x2E\x7D", 16, |
| "\x8B\x0A\x79\x30\x6C\x9C\xE7\xED\x99\xDA\xE4\xF8\x7F\x8D\xD6\x16\x36", 17, |
| "\x1A\x8C\x98\xDC\xD7\x3D\x38\x39\x3B\x2B\xF1\x56\x9D\xEE\xFC\x19", 16, |
| "\x65\xD2\x01\x79\x90\xD6\x25\x28", 8, |
| "\x02\x08\x3E\x39\x79\xDA\x01\x48\x12\xF5\x9F\x11\xD5\x26\x30\xDA\x30", |
| "\x13\x73\x27\xD1\x06\x49\xB0\xAA\x6E\x1C\x18\x1D\xB6\x17\xD7\xF2", 16); |
| |
| check_eax("\x5F\xFF\x20\xCA\xFA\xB1\x19\xCA\x2F\xC7\x35\x49\xE2\x0F\x5B\x0D", 16, |
| "\x1B\xDA\x12\x2B\xCE\x8A\x8D\xBA\xF1\x87\x7D\x96\x2B\x85\x92\xDD\x2D\x56", 18, |
| "\xDD\xE5\x9B\x97\xD7\x22\x15\x6D\x4D\x9A\xFF\x2B\xC7\x55\x98\x26", 16, |
| "\x54\xB9\xF0\x4E\x6A\x09\x18\x9A", 8, |
| "\x2E\xC4\x7B\x2C\x49\x54\xA4\x89\xAF\xC7\xBA\x48\x97\xED\xCD\xAE\x8C\xC3", |
| "\x3B\x60\x45\x05\x99\xBD\x02\xC9\x63\x82\x90\x2A\xEF\x7F\x83\x2A", 16); |
| |
| check_eax("\xA4\xA4\x78\x2B\xCF\xFD\x3E\xC5\xE7\xEF\x6D\x8C\x34\xA5\x61\x23", 16, |
| "\x6C\xF3\x67\x20\x87\x2B\x85\x13\xF6\xEA\xB1\xA8\xA4\x44\x38\xD5\xEF\x11", 18, |
| "\xB7\x81\xFC\xF2\xF7\x5F\xA5\xA8\xDE\x97\xA9\xCA\x48\xE5\x22\xEC", 16, |
| "\x89\x9A\x17\x58\x97\x56\x1D\x7E", 8, |
| "\x0D\xE1\x8F\xD0\xFD\xD9\x1E\x7A\xF1\x9F\x1D\x8E\xE8\x73\x39\x38\xB1\xE8", |
| "\xE7\xF6\xD2\x23\x16\x18\x10\x2F\xDB\x7F\xE5\x5F\xF1\x99\x17\x00", 16); |
| |
| check_eax("\x83\x95\xFC\xF1\xE9\x5B\xEB\xD6\x97\xBD\x01\x0B\xC7\x66\xAA\xC3", 16, |
| "\xCA\x40\xD7\x44\x6E\x54\x5F\xFA\xED\x3B\xD1\x2A\x74\x0A\x65\x9F\xFB\xBB\x3C\xEA\xB7", 21, |
| "\x22\xE7\xAD\xD9\x3C\xFC\x63\x93\xC5\x7E\xC0\xB3\xC1\x7D\x6B\x44", 16, |
| "\x12\x67\x35\xFC\xC3\x20\xD2\x5A", 8, |
| "\xCB\x89\x20\xF8\x7A\x6C\x75\xCF\xF3\x96\x27\xB5\x6E\x3E\xD1\x97\xC5\x52\xD2\x95\xA7", |
| "\xCF\xC4\x6A\xFC\x25\x3B\x46\x52\xB1\xAF\x37\x95\xB1\x24\xAB\x6E", 16); |
| |
| /* Test vector from bug #3 */ |
| check_eax("\x58\x94\x17\xB0\x32\x4B\x1B\x71\xD7\xA6\x75\x18\x52\x86\x7A\xE8", 16, |
| "\x00\x00\x1C\x40\x00\x00\x00\x48\x00\x00\x00\x73", 12, |
| "\x00\x01\x00\x00\xF6\x83", 6, |
| "", 0, |
| "\xD5\xD8\x99\x79\xAE\x79\xEB\xEE\x4E\x38\x5F\xA5", |
| "\x0E\xFB\x21\xFA\xD7\x14\xA2\x5B\x44\x14\x5F\x79\x22\x1A\x2C\x9A", 16); |
| |
| } |
| |
| static void check_cmac(const void *key, size_t nkey, |
| const void *msg, size_t nmsg, |
| const void *wanttag, size_t ntag) |
| { |
| uint8_t gottag[16]; |
| |
| TEST_CHECK(cf_aes.blocksz == ntag); |
| |
| cf_aes_context aes; |
| cf_aes_init(&aes, key, nkey); |
| |
| cf_cmac cmac; |
| cf_cmac_init(&cmac, &cf_aes, &aes); |
| cf_cmac_sign(&cmac, msg, nmsg, gottag); |
| |
| TEST_CHECK(memcmp(gottag, wanttag, cf_aes.blocksz) == 0); |
| } |
| |
| static void test_cmac(void) |
| { |
| /* These from SP800-38B */ |
| check_cmac("\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c", 16, |
| "", 0, |
| "\xbb\x1d\x69\x29\xe9\x59\x37\x28\x7f\xa3\x7d\x12\x9b\x75\x67\x46", 16); |
| check_cmac("\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c", 16, |
| "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a", 16, |
| "\x07\x0a\x16\xb4\x6b\x4d\x41\x44\xf7\x9b\xdd\x9d\xd0\x4a\x28\x7c", 16); |
| check_cmac("\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c", 16, |
| "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51\x30\xc8\x1c\x46\xa3\x5c\xe4\x11", 40, |
| "\xdf\xa6\x67\x47\xde\x9a\xe6\x30\x30\xca\x32\x61\x14\x97\xc8\x27", 16); |
| check_cmac("\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c", 16, |
| "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51\x30\xc8\x1c\x46\xa3\x5c\xe4\x11\xe5\xfb\xc1\x19\x1a\x0a\x52\xef\xf6\x9f\x24\x45\xdf\x4f\x9b\x17\xad\x2b\x41\x7b\xe6\x6c\x37\x10", 64, |
| "\x51\xf0\xbe\xbf\x7e\x3b\x9d\x92\xfc\x49\x74\x17\x79\x36\x3c\xfe", 16); |
| |
| check_cmac("\x8e\x73\xb0\xf7\xda\x0e\x64\x52\xc8\x10\xf3\x2b\x80\x90\x79\xe5\x62\xf8\xea\xd2\x52\x2c\x6b\x7b", 24, |
| "", 0, |
| "\xd1\x7d\xdf\x46\xad\xaa\xcd\xe5\x31\xca\xc4\x83\xde\x7a\x93\x67", 16); |
| check_cmac("\x8e\x73\xb0\xf7\xda\x0e\x64\x52\xc8\x10\xf3\x2b\x80\x90\x79\xe5\x62\xf8\xea\xd2\x52\x2c\x6b\x7b", 24, |
| "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a", 16, |
| "\x9e\x99\xa7\xbf\x31\xe7\x10\x90\x06\x62\xf6\x5e\x61\x7c\x51\x84", 16); |
| check_cmac("\x8e\x73\xb0\xf7\xda\x0e\x64\x52\xc8\x10\xf3\x2b\x80\x90\x79\xe5\x62\xf8\xea\xd2\x52\x2c\x6b\x7b", 24, |
| "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51\x30\xc8\x1c\x46\xa3\x5c\xe4\x11", 40, |
| "\x8a\x1d\xe5\xbe\x2e\xb3\x1a\xad\x08\x9a\x82\xe6\xee\x90\x8b\x0e", 16); |
| check_cmac("\x8e\x73\xb0\xf7\xda\x0e\x64\x52\xc8\x10\xf3\x2b\x80\x90\x79\xe5\x62\xf8\xea\xd2\x52\x2c\x6b\x7b", 24, |
| "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51\x30\xc8\x1c\x46\xa3\x5c\xe4\x11\xe5\xfb\xc1\x19\x1a\x0a\x52\xef\xf6\x9f\x24\x45\xdf\x4f\x9b\x17\xad\x2b\x41\x7b\xe6\x6c\x37\x10", 64, |
| "\xa1\xd5\xdf\x0e\xed\x79\x0f\x79\x4d\x77\x58\x96\x59\xf3\x9a\x11", 16); |
| |
| check_cmac("\x60\x3d\xeb\x10\x15\xca\x71\xbe\x2b\x73\xae\xf0\x85\x7d\x77\x81\x1f\x35\x2c\x07\x3b\x61\x08\xd7\x2d\x98\x10\xa3\x09\x14\xdf\xf4", 32, |
| "", 0, |
| "\x02\x89\x62\xf6\x1b\x7b\xf8\x9e\xfc\x6b\x55\x1f\x46\x67\xd9\x83", 16); |
| check_cmac("\x60\x3d\xeb\x10\x15\xca\x71\xbe\x2b\x73\xae\xf0\x85\x7d\x77\x81\x1f\x35\x2c\x07\x3b\x61\x08\xd7\x2d\x98\x10\xa3\x09\x14\xdf\xf4", 32, |
| "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a", 16, |
| "\x28\xa7\x02\x3f\x45\x2e\x8f\x82\xbd\x4b\xf2\x8d\x8c\x37\xc3\x5c", 16); |
| check_cmac("\x60\x3d\xeb\x10\x15\xca\x71\xbe\x2b\x73\xae\xf0\x85\x7d\x77\x81\x1f\x35\x2c\x07\x3b\x61\x08\xd7\x2d\x98\x10\xa3\x09\x14\xdf\xf4", 32, |
| "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51\x30\xc8\x1c\x46\xa3\x5c\xe4\x11", 40, |
| "\xaa\xf3\xd8\xf1\xde\x56\x40\xc2\x32\xf5\xb1\x69\xb9\xc9\x11\xe6", 16); |
| check_cmac("\x60\x3d\xeb\x10\x15\xca\x71\xbe\x2b\x73\xae\xf0\x85\x7d\x77\x81\x1f\x35\x2c\x07\x3b\x61\x08\xd7\x2d\x98\x10\xa3\x09\x14\xdf\xf4", 32, |
| "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51\x30\xc8\x1c\x46\xa3\x5c\xe4\x11\xe5\xfb\xc1\x19\x1a\x0a\x52\xef\xf6\x9f\x24\x45\xdf\x4f\x9b\x17\xad\x2b\x41\x7b\xe6\x6c\x37\x10", 64, |
| "\xe1\x99\x21\x90\x54\x9f\x6e\xd5\x69\x6a\x2c\x05\x6c\x31\x54\x10", 16); |
| } |
| |
| static void test_gf128_mul(void) |
| { |
| uint8_t bout[16]; |
| |
| const void *bx = "\x03\x88\xda\xce\x60\xb6\xa3\x92\xf3\x28\xc2\xb9\x71\xb2\xfe\x78"; |
| const void *by = "\x66\xe9\x4b\xd4\xef\x8a\x2c\x3b\x88\x4c\xfa\x59\xca\x34\x2b\x2e"; |
| const void *bexpect = "\x5e\x2e\xc7\x46\x91\x70\x62\x88\x2c\x85\xb0\x68\x53\x53\xde\xb7"; |
| |
| cf_gf128 x, y, out; |
| cf_gf128_frombytes_be(bx, x); |
| cf_gf128_frombytes_be(by, y); |
| cf_gf128_mul(x, y, out); |
| cf_gf128_tobytes_be(out, bout); |
| TEST_CHECK(memcmp(bexpect, bout, 16) == 0); |
| } |
| |
| static void check_gcm(const void *key, size_t nkey, |
| const void *plain, size_t nplain, |
| const void *aad, size_t naad, |
| const void *iv, size_t niv, |
| const void *cipher_expect, size_t ncipher, |
| const void *tag_expect, size_t ntag) |
| { |
| uint8_t plain_decrypt[64], |
| cipher[64], |
| tag[16]; |
| |
| assert(ncipher == nplain); |
| |
| cf_aes_context ctx; |
| cf_aes_init(&ctx, key, nkey); |
| |
| cf_gcm_encrypt(&cf_aes, &ctx, |
| plain, nplain, |
| aad, naad, |
| iv, niv, |
| cipher, |
| tag, ntag); |
| |
| TEST_CHECK(memcmp(tag, tag_expect, ntag) == 0); |
| TEST_CHECK(memcmp(cipher, cipher_expect, ncipher) == 0); |
| |
| int err = cf_gcm_decrypt(&cf_aes, &ctx, |
| cipher, ncipher, |
| aad, naad, |
| iv, niv, |
| tag, ntag, |
| plain_decrypt); |
| TEST_CHECK(err == 0); |
| TEST_CHECK(memcmp(plain_decrypt, plain, ncipher) == 0); |
| |
| tag[0] ^= 0xff; |
| err = cf_gcm_decrypt(&cf_aes, &ctx, |
| cipher, ncipher, |
| aad, naad, |
| iv, niv, |
| tag, ntag, |
| plain_decrypt); |
| TEST_CHECK(err == 1); |
| } |
| |
| static void test_gcm(void) |
| { |
| check_gcm("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 16, |
| "", 0, |
| "", 0, |
| "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 12, |
| "", 0, |
| "\x58\xe2\xfc\xce\xfa\x7e\x30\x61\x36\x7f\x1d\x57\xa4\xe7\x45\x5a", 16); |
| check_gcm("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 16, |
| "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 16, |
| "", 0, |
| "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 12, |
| "\x03\x88\xda\xce\x60\xb6\xa3\x92\xf3\x28\xc2\xb9\x71\xb2\xfe\x78", 16, |
| "\xab\x6e\x47\xd4\x2c\xec\x13\xbd\xf5\x3a\x67\xb2\x12\x57\xbd\xdf", 16); |
| check_gcm("\xfe\xff\xe9\x92\x86\x65\x73\x1c\x6d\x6a\x8f\x94\x67\x30\x83\x08", 16, |
| "\xd9\x31\x32\x25\xf8\x84\x06\xe5\xa5\x59\x09\xc5\xaf\xf5\x26\x9a" |
| "\x86\xa7\xa9\x53\x15\x34\xf7\xda\x2e\x4c\x30\x3d\x8a\x31\x8a\x72" |
| "\x1c\x3c\x0c\x95\x95\x68\x09\x53\x2f\xcf\x0e\x24\x49\xa6\xb5\x25" |
| "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57\xba\x63\x7b\x39\x1a\xaf\xd2\x55", 64, |
| "", 0, |
| "\xca\xfe\xba\xbe\xfa\xce\xdb\xad\xde\xca\xf8\x88", 12, |
| "\x42\x83\x1e\xc2\x21\x77\x74\x24\x4b\x72\x21\xb7\x84\xd0\xd4\x9c" |
| "\xe3\xaa\x21\x2f\x2c\x02\xa4\xe0\x35\xc1\x7e\x23\x29\xac\xa1\x2e" |
| "\x21\xd5\x14\xb2\x54\x66\x93\x1c\x7d\x8f\x6a\x5a\xac\x84\xaa\x05" |
| "\x1b\xa3\x0b\x39\x6a\x0a\xac\x97\x3d\x58\xe0\x91\x47\x3f\x59\x85", 64, |
| "\x4d\x5c\x2a\xf3\x27\xcd\x64\xa6\x2c\xf3\x5a\xbd\x2b\xa6\xfa\xb4", 16); |
| check_gcm("\xfe\xff\xe9\x92\x86\x65\x73\x1c\x6d\x6a\x8f\x94\x67\x30\x83\x08", 16, |
| "\xd9\x31\x32\x25\xf8\x84\x06\xe5\xa5\x59\x09\xc5\xaf\xf5\x26\x9a" |
| "\x86\xa7\xa9\x53\x15\x34\xf7\xda\x2e\x4c\x30\x3d\x8a\x31\x8a\x72" |
| "\x1c\x3c\x0c\x95\x95\x68\x09\x53\x2f\xcf\x0e\x24\x49\xa6\xb5\x25" |
| "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57\xba\x63\x7b\x39", 60, |
| "\xfe\xed\xfa\xce\xde\xad\xbe\xef\xfe\xed\xfa\xce\xde\xad\xbe\xef" |
| "\xab\xad\xda\xd2", 20, |
| "\xca\xfe\xba\xbe\xfa\xce\xdb\xad\xde\xca\xf8\x88", 12, |
| "\x42\x83\x1e\xc2\x21\x77\x74\x24\x4b\x72\x21\xb7\x84\xd0\xd4\x9c" |
| "\xe3\xaa\x21\x2f\x2c\x02\xa4\xe0\x35\xc1\x7e\x23\x29\xac\xa1\x2e" |
| "\x21\xd5\x14\xb2\x54\x66\x93\x1c\x7d\x8f\x6a\x5a\xac\x84\xaa\x05" |
| "\x1b\xa3\x0b\x39\x6a\x0a\xac\x97\x3d\x58\xe0\x91", 60, |
| "\x5b\xc9\x4f\xbc\x32\x21\xa5\xdb\x94\xfa\xe9\x5a\xe7\x12\x1a\x47", 16); |
| check_gcm("\xfe\xff\xe9\x92\x86\x65\x73\x1c\x6d\x6a\x8f\x94\x67\x30\x83\x08", 16, |
| "\xd9\x31\x32\x25\xf8\x84\x06\xe5\xa5\x59\x09\xc5\xaf\xf5\x26\x9a" |
| "\x86\xa7\xa9\x53\x15\x34\xf7\xda\x2e\x4c\x30\x3d\x8a\x31\x8a\x72" |
| "\x1c\x3c\x0c\x95\x95\x68\x09\x53\x2f\xcf\x0e\x24\x49\xa6\xb5\x25" |
| "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57\xba\x63\x7b\x39", 60, |
| "\xfe\xed\xfa\xce\xde\xad\xbe\xef\xfe\xed\xfa\xce\xde\xad\xbe\xef" |
| "\xab\xad\xda\xd2", 20, |
| "\xca\xfe\xba\xbe\xfa\xce\xdb\xad", 8, |
| "\x61\x35\x3b\x4c\x28\x06\x93\x4a\x77\x7f\xf5\x1f\xa2\x2a\x47\x55" |
| "\x69\x9b\x2a\x71\x4f\xcd\xc6\xf8\x37\x66\xe5\xf9\x7b\x6c\x74\x23" |
| "\x73\x80\x69\x00\xe4\x9f\x24\xb2\x2b\x09\x75\x44\xd4\x89\x6b\x42" |
| "\x49\x89\xb5\xe1\xeb\xac\x0f\x07\xc2\x3f\x45\x98", 60, |
| "\x36\x12\xd2\xe7\x9e\x3b\x07\x85\x56\x1b\xe1\x4a\xac\xa2\xfc\xcb", 16); |
| check_gcm("\xfe\xff\xe9\x92\x86\x65\x73\x1c\x6d\x6a\x8f\x94\x67\x30\x83\x08", 16, |
| "\xd9\x31\x32\x25\xf8\x84\x06\xe5\xa5\x59\x09\xc5\xaf\xf5\x26\x9a" |
| "\x86\xa7\xa9\x53\x15\x34\xf7\xda\x2e\x4c\x30\x3d\x8a\x31\x8a\x72" |
| "\x1c\x3c\x0c\x95\x95\x68\x09\x53\x2f\xcf\x0e\x24\x49\xa6\xb5\x25" |
| "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57\xba\x63\x7b\x39", 60, |
| "\xfe\xed\xfa\xce\xde\xad\xbe\xef\xfe\xed\xfa\xce\xde\xad\xbe\xef" |
| "\xab\xad\xda\xd2", 20, |
| "\x93\x13\x22\x5d\xf8\x84\x06\xe5\x55\x90\x9c\x5a\xff\x52\x69\xaa" |
| "\x6a\x7a\x95\x38\x53\x4f\x7d\xa1\xe4\xc3\x03\xd2\xa3\x18\xa7\x28" |
| "\xc3\xc0\xc9\x51\x56\x80\x95\x39\xfc\xf0\xe2\x42\x9a\x6b\x52\x54" |
| "\x16\xae\xdb\xf5\xa0\xde\x6a\x57\xa6\x37\xb3\x9b", 60, |
| "\x8c\xe2\x49\x98\x62\x56\x15\xb6\x03\xa0\x33\xac\xa1\x3f\xb8\x94" |
| "\xbe\x91\x12\xa5\xc3\xa2\x11\xa8\xba\x26\x2a\x3c\xca\x7e\x2c\xa7" |
| "\x01\xe4\xa9\xa4\xfb\xa4\x3c\x90\xcc\xdc\xb2\x81\xd4\x8c\x7c\x6f" |
| "\xd6\x28\x75\xd2\xac\xa4\x17\x03\x4c\x34\xae\xe5", 60, |
| "\x61\x9c\xc5\xae\xff\xfe\x0b\xfa\x46\x2a\xf4\x3c\x16\x99\xd0\x50", 16); |
| |
| check_gcm("\xfe\xff\xe9\x92\x86\x65\x73\x1c\x6d\x6a\x8f\x94\x67\x30\x83\x08", 16, |
| "\xd9\x31\x32\x25\xf8\x84\x06\xe5\xa5\x59\x09\xc5\xaf\xf5\x26\x9a" |
| "\x86\xa7\xa9\x53\x15\x34\xf7\xda\x2e\x4c\x30\x3d\x8a\x31\x8a\x72" |
| "\x1c\x3c\x0c\x95\x95\x68\x09\x53\x2f\xcf\x0e\x24\x49\xa6\xb5\x25" |
| "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57\xba\x63\x7b\x39", 60, |
| "\xfe\xed\xfa\xce\xde\xad\xbe\xef\xfe\xed\xfa\xce\xde\xad\xbe\xef" |
| "\xab\xad\xda\xd2", 20, |
| "\x93\x13\x22\x5d\xf8\x84\x06\xe5\x55\x90\x9c\x5a\xff\x52\x69\xaa" |
| "\x6a\x7a\x95\x38\x53\x4f\x7d\xa1\xe4\xc3\x03\xd2\xa3\x18\xa7\x28" |
| "\xc3\xc0\xc9\x51\x56\x80\x95\x39\xfc\xf0\xe2\x42\x9a\x6b\x52\x54" |
| "\x16\xae\xdb\xf5\xa0\xde\x6a\x57\xa6\x37\xb3\x9b", 60, |
| "\x8c\xe2\x49\x98\x62\x56\x15\xb6\x03\xa0\x33\xac\xa1\x3f\xb8\x94" |
| "\xbe\x91\x12\xa5\xc3\xa2\x11\xa8\xba\x26\x2a\x3c\xca\x7e\x2c\xa7" |
| "\x01\xe4\xa9\xa4\xfb\xa4\x3c\x90\xcc\xdc\xb2\x81\xd4\x8c\x7c\x6f" |
| "\xd6\x28\x75\xd2\xac\xa4\x17\x03\x4c\x34\xae\xe5", 60, |
| "\x61\x9c\xc5\xae\xff\xfe\x0b\xfa\x46\x2a\xf4\x3c\x16\x99\xd0\x50", 16); |
| check_gcm("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 24, |
| "", 0, |
| "", 0, |
| "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 12, |
| "", 0, |
| "\xcd\x33\xb2\x8a\xc7\x73\xf7\x4b\xa0\x0e\xd1\xf3\x12\x57\x24\x35", 16); |
| check_gcm("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 24, |
| "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 16, |
| "", 0, |
| "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 12, |
| "\x98\xe7\x24\x7c\x07\xf0\xfe\x41\x1c\x26\x7e\x43\x84\xb0\xf6\x00", 16, |
| "\x2f\xf5\x8d\x80\x03\x39\x27\xab\x8e\xf4\xd4\x58\x75\x14\xf0\xfb", 16); |
| check_gcm("\xfe\xff\xe9\x92\x86\x65\x73\x1c\x6d\x6a\x8f\x94\x67\x30\x83\x08" |
| "\xfe\xff\xe9\x92\x86\x65\x73\x1c", 24, |
| "\xd9\x31\x32\x25\xf8\x84\x06\xe5\xa5\x59\x09\xc5\xaf\xf5\x26\x9a" |
| "\x86\xa7\xa9\x53\x15\x34\xf7\xda\x2e\x4c\x30\x3d\x8a\x31\x8a\x72" |
| "\x1c\x3c\x0c\x95\x95\x68\x09\x53\x2f\xcf\x0e\x24\x49\xa6\xb5\x25" |
| "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57\xba\x63\x7b\x39\x1a\xaf\xd2\x55", 64, |
| "", 0, |
| "\xca\xfe\xba\xbe\xfa\xce\xdb\xad\xde\xca\xf8\x88", 12, |
| "\x39\x80\xca\x0b\x3c\x00\xe8\x41\xeb\x06\xfa\xc4\x87\x2a\x27\x57" |
| "\x85\x9e\x1c\xea\xa6\xef\xd9\x84\x62\x85\x93\xb4\x0c\xa1\xe1\x9c" |
| "\x7d\x77\x3d\x00\xc1\x44\xc5\x25\xac\x61\x9d\x18\xc8\x4a\x3f\x47" |
| "\x18\xe2\x44\x8b\x2f\xe3\x24\xd9\xcc\xda\x27\x10\xac\xad\xe2\x56", 64, |
| "\x99\x24\xa7\xc8\x58\x73\x36\xbf\xb1\x18\x02\x4d\xb8\x67\x4a\x14", 16); |
| } |
| |
| static void check_ccm(const void *key, size_t nkey, |
| const void *header, size_t nheader, |
| const void *plain, size_t nplain, |
| const void *nonce, size_t nnonce, |
| const void *expect_cipher, size_t ncipher, |
| const void *expect_tag, size_t ntag) |
| { |
| uint8_t cipher[32], tag[16], decrypted[32]; |
| |
| assert(ncipher == nplain); |
| |
| cf_aes_context ctx; |
| cf_aes_init(&ctx, key, nkey); |
| |
| cf_ccm_encrypt(&cf_aes, &ctx, |
| plain, nplain, 15 - nnonce, |
| header, nheader, |
| nonce, nnonce, |
| cipher, |
| tag, ntag); |
| |
| TEST_CHECK(memcmp(tag, expect_tag, ntag) == 0); |
| TEST_CHECK(memcmp(cipher, expect_cipher, ncipher) == 0); |
| |
| int err; |
| err = cf_ccm_decrypt(&cf_aes, &ctx, |
| expect_cipher, ncipher, 15 - nnonce, |
| header, nheader, |
| nonce, nnonce, |
| tag, ntag, |
| decrypted); |
| TEST_CHECK(err == 0); |
| TEST_CHECK(memcmp(decrypted, plain, nplain) == 0); |
| |
| tag[0] ^= 0xff; |
| |
| err = cf_ccm_decrypt(&cf_aes, &ctx, |
| expect_cipher, ncipher, 15 - nnonce, |
| header, nheader, |
| nonce, nnonce, |
| tag, ntag, |
| decrypted); |
| TEST_CHECK(err == 1); |
| } |
| |
| #if !MCU_TARGET |
| static void fill(uint8_t *buf, size_t len, uint8_t b) |
| { |
| for (size_t i = 0; i < len; i++) |
| buf[i] = b++; |
| } |
| |
| static void test_ccm_long(void) |
| { |
| /* This is example 4 from SP800-38C, to test the long AAD code path. */ |
| uint8_t header[0x10000]; |
| uint8_t key[16]; |
| uint8_t tag[14]; |
| uint8_t nonce[13]; |
| uint8_t plain[32], cipher[32]; |
| |
| fill(header, sizeof header, 0x00); |
| fill(key, sizeof key, 0x40); |
| fill(nonce, sizeof nonce, 0x10); |
| fill(plain, sizeof plain, 0x20); |
| |
| const void *expect_tag = "\xb4\xac\x6b\xec\x93\xe8\x59\x8e\x7f\x0d\xad\xbc\xea\x5b"; |
| const void *expect_cipher = "\x69\x91\x5d\xad\x1e\x84\xc6\x37\x6a\x68\xc2\x96\x7e\x4d\xab\x61\x5a\xe0\xfd\x1f\xae\xc4\x4c\xc4\x84\x82\x85\x29\x46\x3c\xcf\x72"; |
| |
| cf_aes_context ctx; |
| cf_aes_init(&ctx, key, sizeof key); |
| |
| cf_ccm_encrypt(&cf_aes, &ctx, |
| plain, sizeof plain, 15 - sizeof nonce, |
| header, sizeof header, |
| nonce, sizeof nonce, |
| cipher, |
| tag, sizeof tag); |
| |
| TEST_CHECK(memcmp(expect_tag, tag, sizeof tag) == 0); |
| TEST_CHECK(memcmp(expect_cipher, cipher, sizeof cipher) == 0); |
| } |
| #endif |
| |
| static void test_ccm(void) |
| { |
| check_ccm("\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf", 16, |
| "\x00\x01\x02\x03\x04\x05\x06\x07", 8, |
| "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e", 23, |
| "\x00\x00\x00\x03\x02\x01\x00\xa0\xa1\xa2\xa3\xa4\xa5", 13, |
| "\x58\x8c\x97\x9a\x61\xc6\x63\xd2\xf0\x66\xd0\xc2\xc0\xf9\x89\x80\x6d\x5f\x6b\x61\xda\xc3\x84", 23, |
| "\x17\xe8\xd1\x2c\xfd\xf9\x26\xe0", 8); |
| |
| check_ccm("\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f", 16, |
| "\x00\x01\x02\x03\x04\x05\x06\x07", 8, |
| "\x20\x21\x22\x23", 4, |
| "\x10\x11\x12\x13\x14\x15\x16", 7, |
| "\x71\x62\x01\x5b", 4, |
| "\x4d\xac\x25\x5d", 4); |
| |
| check_ccm("\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f", 16, |
| "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13", 20, |
| "\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37", 24, |
| "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b", 12, |
| "\xe3\xb2\x01\xa9\xf5\xb7\x1a\x7a\x9b\x1c\xea\xec\xcd\x97\xe7\x0b\x61\x76\xaa\xd9\xa4\x42\x8a\xa5", 24, |
| "\x48\x43\x92\xfb\xc1\xb0\x99\x51", 8); |
| } |
| |
| static void check_ocb(const void *key, size_t nkey, |
| const void *header, size_t nheader, |
| const void *plain, size_t nplain, |
| const void *nonce, size_t nnonce, |
| const void *expect_cipher, size_t ncipher, |
| const void *expect_tag, size_t ntag) |
| { |
| uint8_t cipher[40], tag[16]; |
| |
| assert(ncipher == nplain); |
| assert(ncipher <= sizeof cipher); |
| assert(ntag <= sizeof tag); |
| |
| cf_aes_context ctx; |
| cf_aes_init(&ctx, key, nkey); |
| |
| cf_ocb_encrypt(&cf_aes, &ctx, |
| plain, nplain, |
| header, nheader, |
| nonce, nnonce, |
| cipher, |
| tag, ntag); |
| |
| TEST_CHECK(memcmp(tag, expect_tag, ntag) == 0); |
| TEST_CHECK(memcmp(cipher, expect_cipher, ncipher) == 0); |
| |
| uint8_t decrypted[40]; |
| int err; |
| err = cf_ocb_decrypt(&cf_aes, &ctx, |
| expect_cipher, ncipher, |
| header, nheader, |
| nonce, nnonce, |
| tag, ntag, |
| decrypted); |
| TEST_CHECK(err == 0); |
| TEST_CHECK(memcmp(decrypted, plain, nplain) == 0); |
| |
| tag[0] ^= 0xff; |
| |
| err = cf_ocb_decrypt(&cf_aes, &ctx, |
| expect_cipher, ncipher, |
| header, nheader, |
| nonce, nnonce, |
| tag, ntag, |
| decrypted); |
| TEST_CHECK(err == 1); |
| } |
| |
| static void test_ocb(void) |
| { |
| check_ocb("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F", 16, |
| "", 0, |
| "", 0, |
| "\xBB\xAA\x99\x88\x77\x66\x55\x44\x33\x22\x11\x00", 12, |
| "", 0, |
| "\x78\x54\x07\xBF\xFF\xC8\xAD\x9E\xDC\xC5\x52\x0A\xC9\x11\x1E\xE6", 16); |
| |
| check_ocb("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F", 16, |
| "\x00\x01\x02\x03\x04\x05\x06\x07", 8, |
| "\x00\x01\x02\x03\x04\x05\x06\x07", 8, |
| "\xBB\xAA\x99\x88\x77\x66\x55\x44\x33\x22\x11\x01", 12, |
| "\x68\x20\xB3\x65\x7B\x6F\x61\x5A", 8, |
| "\x57\x25\xBD\xA0\xD3\xB4\xEB\x3A\x25\x7C\x9A\xF1\xF8\xF0\x30\x09", 16); |
| |
| check_ocb("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F", 16, |
| "\x00\x01\x02\x03\x04\x05\x06\x07", 8, |
| "", 0, |
| "\xBB\xAA\x99\x88\x77\x66\x55\x44\x33\x22\x11\x02", 12, |
| "", 0, |
| "\x81\x01\x7F\x82\x03\xF0\x81\x27\x71\x52\xFA\xDE\x69\x4A\x0A\x00", 16); |
| |
| check_ocb("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F", 16, |
| "", 0, |
| "\x00\x01\x02\x03\x04\x05\x06\x07", 8, |
| "\xBB\xAA\x99\x88\x77\x66\x55\x44\x33\x22\x11\x03", 12, |
| "\x45\xDD\x69\xF8\xF5\xAA\xE7\x24", 8, |
| "\x14\x05\x4C\xD1\xF3\x5D\x82\x76\x0B\x2C\xD0\x0D\x2F\x99\xBF\xA9", 16); |
| |
| check_ocb("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F", 16, |
| "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F", 16, |
| "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F", 16, |
| "\xBB\xAA\x99\x88\x77\x66\x55\x44\x33\x22\x11\x04", 12, |
| "\x57\x1D\x53\x5B\x60\xB2\x77\x18\x8B\xE5\x14\x71\x70\xA9\xA2\x2C", 16, |
| "\x3A\xD7\xA4\xFF\x38\x35\xB8\xC5\x70\x1C\x1C\xCE\xC8\xFC\x33\x58", 16); |
| |
| check_ocb("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F", 16, |
| "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F", 16, |
| "", 0, |
| "\xBB\xAA\x99\x88\x77\x66\x55\x44\x33\x22\x11\x05", 12, |
| "", 0, |
| "\x8C\xF7\x61\xB6\x90\x2E\xF7\x64\x46\x2A\xD8\x64\x98\xCA\x6B\x97", 16); |
| |
| check_ocb("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F", 16, |
| "", 0, |
| "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F", 16, |
| "\xBB\xAA\x99\x88\x77\x66\x55\x44\x33\x22\x11\x06", 12, |
| "\x5C\xE8\x8E\xC2\xE0\x69\x27\x06\xA9\x15\xC0\x0A\xEB\x8B\x23\x96", 16, |
| "\xF4\x0E\x1C\x74\x3F\x52\x43\x6B\xDF\x06\xD8\xFA\x1E\xCA\x34\x3D", 16); |
| |
| check_ocb("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F", 16, |
| "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17", 24, |
| "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17", 24, |
| "\xBB\xAA\x99\x88\x77\x66\x55\x44\x33\x22\x11\x07", 12, |
| "\x1C\xA2\x20\x73\x08\xC8\x7C\x01\x07\x56\x10\x4D\x88\x40\xCE\x19\x52\xF0\x96\x73\xA4\x48\xA1\x22", 24, |
| "\xC9\x2C\x62\x24\x10\x51\xF5\x73\x56\xD7\xF3\xC9\x0B\xB0\xE0\x7F", 16); |
| |
| check_ocb("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F", 16, |
| "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17", 24, |
| "", 0, |
| "\xBB\xAA\x99\x88\x77\x66\x55\x44\x33\x22\x11\x08", 12, |
| "", 0, |
| "\x6D\xC2\x25\xA0\x71\xFC\x1B\x9F\x7C\x69\xF9\x3B\x0F\x1E\x10\xDE", 16); |
| |
| check_ocb("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F", 16, |
| "", 0, |
| "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17", 24, |
| "\xBB\xAA\x99\x88\x77\x66\x55\x44\x33\x22\x11\x09", 12, |
| "\x22\x1B\xD0\xDE\x7F\xA6\xFE\x99\x3E\xCC\xD7\x69\x46\x0A\x0A\xF2\xD6\xCD\xED\x0C\x39\x5B\x1C\x3C", 24, |
| "\xE7\x25\xF3\x24\x94\xB9\xF9\x14\xD8\x5C\x0B\x1E\xB3\x83\x57\xFF", 16); |
| |
| check_ocb("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F", 16, |
| "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F", 32, |
| "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F", 32, |
| "\xBB\xAA\x99\x88\x77\x66\x55\x44\x33\x22\x11\x0A", 12, |
| "\xBD\x6F\x6C\x49\x62\x01\xC6\x92\x96\xC1\x1E\xFD\x13\x8A\x46\x7A\xBD\x3C\x70\x79\x24\xB9\x64\xDE\xAF\xFC\x40\x31\x9A\xF5\xA4\x85", 32, |
| "\x40\xFB\xBA\x18\x6C\x55\x53\xC6\x8A\xD9\xF5\x92\xA7\x9A\x42\x40", 16); |
| |
| check_ocb("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F", 16, |
| "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F", 32, |
| "", 0, |
| "\xBB\xAA\x99\x88\x77\x66\x55\x44\x33\x22\x11\x0B", 12, |
| "", 0, |
| "\xFE\x80\x69\x0B\xEE\x8A\x48\x5D\x11\xF3\x29\x65\xBC\x9D\x2A\x32", 16); |
| |
| check_ocb("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F", 16, |
| "", 0, |
| "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F", 32, |
| "\xBB\xAA\x99\x88\x77\x66\x55\x44\x33\x22\x11\x0C", 12, |
| "\x29\x42\xBF\xC7\x73\xBD\xA2\x3C\xAB\xC6\xAC\xFD\x9B\xFD\x58\x35\xBD\x30\x0F\x09\x73\x79\x2E\xF4\x60\x40\xC5\x3F\x14\x32\xBC\xDF", 32, |
| "\xB5\xE1\xDD\xE3\xBC\x18\xA5\xF8\x40\xB5\x2E\x65\x34\x44\xD5\xDF", 16); |
| |
| check_ocb("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F", 16, |
| "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x20\x21\x22\x23\x24\x25\x26\x27", 40, |
| "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x20\x21\x22\x23\x24\x25\x26\x27", 40, |
| "\xBB\xAA\x99\x88\x77\x66\x55\x44\x33\x22\x11\x0D", 12, |
| "\xD5\xCA\x91\x74\x84\x10\xC1\x75\x1F\xF8\xA2\xF6\x18\x25\x5B\x68\xA0\xA1\x2E\x09\x3F\xF4\x54\x60\x6E\x59\xF9\xC1\xD0\xDD\xC5\x4B\x65\xE8\x62\x8E\x56\x8B\xAD\x7A", 40, |
| "\xED\x07\xBA\x06\xA4\xA6\x94\x83\xA7\x03\x54\x90\xC5\x76\x9E\x60", 16); |
| |
| check_ocb("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F", 16, |
| "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x20\x21\x22\x23\x24\x25\x26\x27", 40, |
| "", 0, |
| "\xBB\xAA\x99\x88\x77\x66\x55\x44\x33\x22\x11\x0E", 12, |
| "", 0, |
| "\xC5\xCD\x9D\x18\x50\xC1\x41\xE3\x58\x64\x99\x94\xEE\x70\x1B\x68", 16); |
| |
| check_ocb("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F", 16, |
| "", 0, |
| "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x20\x21\x22\x23\x24\x25\x26\x27", 40, |
| "\xBB\xAA\x99\x88\x77\x66\x55\x44\x33\x22\x11\x0F", 12, |
| "\x44\x12\x92\x34\x93\xC5\x7D\x5D\xE0\xD7\x00\xF7\x53\xCC\xE0\xD1\xD2\xD9\x50\x60\x12\x2E\x9F\x15\xA5\xDD\xBF\xC5\x78\x7E\x50\xB5\xCC\x55\xEE\x50\x7B\xCB\x08\x4E", 40, |
| "\x47\x9A\xD3\x63\xAC\x36\x6B\x95\xA9\x8C\xA5\xF3\x00\x0B\x14\x79", 16); |
| |
| check_ocb("\x0F\x0E\x0D\x0C\x0B\x0A\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00", 16, |
| "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x20\x21\x22\x23\x24\x25\x26\x27", 40, |
| "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x20\x21\x22\x23\x24\x25\x26\x27", 40, |
| "\xBB\xAA\x99\x88\x77\x66\x55\x44\x33\x22\x11\x0D", 12, |
| "\x17\x92\xA4\xE3\x1E\x07\x55\xFB\x03\xE3\x1B\x22\x11\x6E\x6C\x2D\xDF\x9E\xFD\x6E\x33\xD5\x36\xF1\xA0\x12\x4B\x0A\x55\xBA\xE8\x84\xED\x93\x48\x15\x29\xC7\x6B\x6A", 40, |
| "\xD0\xC5\x15\xF4\xD1\xCD\xD4\xFD\xAC\x4F\x02\xAA", 12); |
| } |
| |
| #if !MCU_TARGET |
| static void check_ocb_long(size_t nkey, const void *expect_tag, size_t ntag) |
| { |
| uint8_t C[22400]; |
| uint8_t K[32]; |
| uint8_t S[128] = { 0 }; |
| uint8_t N[12] = { 0 }; |
| size_t nC = 0; |
| |
| memset(K, 0, sizeof K); |
| K[nkey - 1] = ntag * 8; |
| |
| cf_aes_context aes; |
| cf_aes_init(&aes, K, nkey); |
| |
| for (size_t i = 0; i < 128; i++) |
| { |
| /* N = num2str(3i+1, 96) */ |
| memset(N, 0, sizeof N); |
| write32_be(3 * i + 1, N + 8); |
| |
| /* C = C || OCB-ENCRYPT(K, N, S, S) |
| * nb. OCB-ENCRYPT(Key, Nonce, AAD, Plain) */ |
| cf_ocb_encrypt(&cf_aes, &aes, |
| S, i, /* plain */ |
| S, i, /* aad */ |
| N, sizeof N, /* nonce */ |
| C + nC, /* cipher out */ |
| C + nC + i, /* tag out */ |
| ntag); |
| nC += i + ntag; |
| |
| /* N = num2str(3i+2,96) */ |
| write32_be(3 * i + 2, N + 8); |
| |
| /* C = C || OCB-ENCRYPT(K, N, <empty string>, S) */ |
| cf_ocb_encrypt(&cf_aes, &aes, |
| S, i, |
| NULL, 0, |
| N, sizeof N, |
| C + nC, |
| C + nC + i, |
| ntag); |
| nC += i + ntag; |
| |
| /* N = num2str(3i+3,96) */ |
| write32_be(3 * i + 3, N + 8); |
| |
| /* C = C || OCB-ENCRYPT(K, N, S, <empty string>) */ |
| cf_ocb_encrypt(&cf_aes, &aes, |
| NULL, 0, |
| S, i, |
| N, sizeof N, |
| NULL, |
| C + nC, |
| ntag); |
| nC += ntag; |
| } |
| |
| /* N = num2str(385, 96) */ |
| write32_be(385, N + 8); |
| |
| /* Output : OCB-ENCRYPT(K, N, C, <empty string>) */ |
| uint8_t result[16]; |
| cf_ocb_encrypt(&cf_aes, &aes, |
| NULL, 0, |
| C, nC, |
| N, sizeof N, |
| NULL, |
| result, ntag); |
| |
| TEST_CHECK(memcmp(result, expect_tag, ntag) == 0); |
| } |
| |
| static void test_ocb_long(void) |
| { |
| check_ocb_long(16, "\x67\xE9\x44\xD2\x32\x56\xC5\xE0\xB6\xC6\x1F\xA2\x2F\xDF\x1E\xA2", 16); |
| check_ocb_long(24, "\xF6\x73\xF2\xC3\xE7\x17\x4A\xAE\x7B\xAE\x98\x6C\xA9\xF2\x9E\x17", 16); |
| check_ocb_long(32, "\xD9\x0E\xB8\xE9\xC9\x77\xC8\x8B\x79\xDD\x79\x3D\x7F\xFA\x16\x1C", 16); |
| check_ocb_long(16, "\x77\xA3\xD8\xE7\x35\x89\x15\x8D\x25\xD0\x12\x09", 12); |
| check_ocb_long(24, "\x05\xD5\x6E\xAD\x27\x52\xC8\x6B\xE6\x93\x2C\x5E", 12); |
| check_ocb_long(32, "\x54\x58\x35\x9A\xC2\x3B\x0C\xBA\x9E\x63\x30\xDD", 12); |
| check_ocb_long(16, "\x19\x2C\x9B\x7B\xD9\x0B\xA0\x6A", 8); |
| check_ocb_long(24, "\x00\x66\xBC\x6E\x0E\xF3\x4E\x24", 8); |
| check_ocb_long(32, "\x7D\x4E\xA5\xD4\x45\x50\x1C\xBE", 8); |
| } |
| #endif |
| |
| TEST_LIST = { |
| { "cbc", test_cbc }, |
| { "cbcmac", test_cbcmac }, |
| { "ctr", test_ctr }, |
| { "eax", test_eax }, |
| { "cmac", test_cmac }, |
| { "gf128-mul", test_gf128_mul }, |
| { "gcm", test_gcm }, |
| { "ccm", test_ccm }, |
| { "ocb", test_ocb }, |
| /* These remaining tests are too big for microcontroller targets. */ |
| #if !MCU_TARGET |
| { "ccm-long", test_ccm_long }, |
| { "ocb-long", test_ocb_long }, |
| #endif |
| { 0 } |
| }; |
| |