1*2aeef50eSEric Biggers // SPDX-License-Identifier: GPL-2.0-or-later 2*2aeef50eSEric Biggers /* 3*2aeef50eSEric Biggers * KUnit test suite for AES-CCM 4*2aeef50eSEric Biggers * 5*2aeef50eSEric Biggers * Copyright 2026 Google LLC 6*2aeef50eSEric Biggers */ 7*2aeef50eSEric Biggers #include <crypto/aes-ccm.h> 8*2aeef50eSEric Biggers #include <crypto/blake2s.h> 9*2aeef50eSEric Biggers #include "test-utils.h" 10*2aeef50eSEric Biggers 11*2aeef50eSEric Biggers /* AES-CCM test vectors from external sources */ 12*2aeef50eSEric Biggers static const struct aes_ccm_testvec { 13*2aeef50eSEric Biggers const char *name; 14*2aeef50eSEric Biggers const char *key; 15*2aeef50eSEric Biggers size_t key_len; 16*2aeef50eSEric Biggers const char *nonce; 17*2aeef50eSEric Biggers size_t nonce_len; 18*2aeef50eSEric Biggers const char *ad; 19*2aeef50eSEric Biggers size_t ad_len; 20*2aeef50eSEric Biggers const char *ptext; 21*2aeef50eSEric Biggers const char *ctext; 22*2aeef50eSEric Biggers size_t data_len; 23*2aeef50eSEric Biggers const char *tag; 24*2aeef50eSEric Biggers size_t tag_len; 25*2aeef50eSEric Biggers } aes_ccm_testvecs[] = { 26*2aeef50eSEric Biggers { 27*2aeef50eSEric Biggers .name = "RFC 3610 Packet Vector #1", 28*2aeef50eSEric Biggers .key = "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7" 29*2aeef50eSEric Biggers "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf", 30*2aeef50eSEric Biggers .key_len = 16, 31*2aeef50eSEric Biggers .nonce = "\x00\x00\x00\x03\x02\x01\x00\xa0" 32*2aeef50eSEric Biggers "\xa1\xa2\xa3\xa4\xa5", 33*2aeef50eSEric Biggers .nonce_len = 13, 34*2aeef50eSEric Biggers .ad = "\x00\x01\x02\x03\x04\x05\x06\x07", 35*2aeef50eSEric Biggers .ad_len = 8, 36*2aeef50eSEric Biggers .ptext = "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" 37*2aeef50eSEric Biggers "\x10\x11\x12\x13\x14\x15\x16\x17" 38*2aeef50eSEric Biggers "\x18\x19\x1a\x1b\x1c\x1d\x1e", 39*2aeef50eSEric Biggers .ctext = "\x58\x8c\x97\x9a\x61\xc6\x63\xd2" 40*2aeef50eSEric Biggers "\xf0\x66\xd0\xc2\xc0\xf9\x89\x80" 41*2aeef50eSEric Biggers "\x6d\x5f\x6b\x61\xda\xc3\x84", 42*2aeef50eSEric Biggers .data_len = 23, 43*2aeef50eSEric Biggers .tag = "\x17\xe8\xd1\x2c\xfd\xf9\x26\xe0", 44*2aeef50eSEric Biggers .tag_len = 8, 45*2aeef50eSEric Biggers }, 46*2aeef50eSEric Biggers { 47*2aeef50eSEric Biggers .name = "RFC 3610 Packet Vector #5", 48*2aeef50eSEric Biggers .key = "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7" 49*2aeef50eSEric Biggers "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf", 50*2aeef50eSEric Biggers .key_len = 16, 51*2aeef50eSEric Biggers .nonce = "\x00\x00\x00\x07\x06\x05\x04\xa0" 52*2aeef50eSEric Biggers "\xa1\xa2\xa3\xa4\xa5", 53*2aeef50eSEric Biggers .nonce_len = 13, 54*2aeef50eSEric Biggers .ad = "\x00\x01\x02\x03\x04\x05\x06\x07" 55*2aeef50eSEric Biggers "\x08\x09\x0a\x0b", 56*2aeef50eSEric Biggers .ad_len = 12, 57*2aeef50eSEric Biggers .ptext = "\x0c\x0d\x0e\x0f\x10\x11\x12\x13" 58*2aeef50eSEric Biggers "\x14\x15\x16\x17\x18\x19\x1a\x1b" 59*2aeef50eSEric Biggers "\x1c\x1d\x1e\x1f", 60*2aeef50eSEric Biggers .ctext = "\xdc\xf1\xfb\x7b\x5d\x9e\x23\xfb" 61*2aeef50eSEric Biggers "\x9d\x4e\x13\x12\x53\x65\x8a\xd8" 62*2aeef50eSEric Biggers "\x6e\xbd\xca\x3e", 63*2aeef50eSEric Biggers .data_len = 20, 64*2aeef50eSEric Biggers .tag = "\x51\xe8\x3f\x07\x7d\x9c\x2d\x93", 65*2aeef50eSEric Biggers .tag_len = 8, 66*2aeef50eSEric Biggers }, 67*2aeef50eSEric Biggers { 68*2aeef50eSEric Biggers .name = "RFC 3610 Packet Vector #9", 69*2aeef50eSEric Biggers .key = "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7" 70*2aeef50eSEric Biggers "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf", 71*2aeef50eSEric Biggers .key_len = 16, 72*2aeef50eSEric Biggers .nonce = "\x00\x00\x00\x0b\x0a\x09\x08\xa0" 73*2aeef50eSEric Biggers "\xa1\xa2\xa3\xa4\xa5", 74*2aeef50eSEric Biggers .nonce_len = 13, 75*2aeef50eSEric Biggers .ad = "\x00\x01\x02\x03\x04\x05\x06\x07", 76*2aeef50eSEric Biggers .ad_len = 8, 77*2aeef50eSEric Biggers .ptext = "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" 78*2aeef50eSEric Biggers "\x10\x11\x12\x13\x14\x15\x16\x17" 79*2aeef50eSEric Biggers "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" 80*2aeef50eSEric Biggers "\x20", 81*2aeef50eSEric Biggers .ctext = "\x82\x53\x1a\x60\xcc\x24\x94\x5a" 82*2aeef50eSEric Biggers "\x4b\x82\x79\x18\x1a\xb5\xc8\x4d" 83*2aeef50eSEric Biggers "\xf2\x1c\xe7\xf9\xb7\x3f\x42\xe1" 84*2aeef50eSEric Biggers "\x97", 85*2aeef50eSEric Biggers .data_len = 25, 86*2aeef50eSEric Biggers .tag = "\xea\x9c\x07\xe5\x6b\x5e\xb1\x7e" 87*2aeef50eSEric Biggers "\x5f\x4e", 88*2aeef50eSEric Biggers .tag_len = 10, 89*2aeef50eSEric Biggers }, 90*2aeef50eSEric Biggers { 91*2aeef50eSEric Biggers .name = "NIST SP 800-38C Example 1", 92*2aeef50eSEric Biggers .key = "\x40\x41\x42\x43\x44\x45\x46\x47" 93*2aeef50eSEric Biggers "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f", 94*2aeef50eSEric Biggers .key_len = 16, 95*2aeef50eSEric Biggers .nonce = "\x10\x11\x12\x13\x14\x15\x16", 96*2aeef50eSEric Biggers .nonce_len = 7, 97*2aeef50eSEric Biggers .ad = "\x00\x01\x02\x03\x04\x05\x06\x07", 98*2aeef50eSEric Biggers .ad_len = 8, 99*2aeef50eSEric Biggers .ptext = "\x20\x21\x22\x23", 100*2aeef50eSEric Biggers .ctext = "\x71\x62\x01\x5b", 101*2aeef50eSEric Biggers .data_len = 4, 102*2aeef50eSEric Biggers .tag = "\x4d\xac\x25\x5d", 103*2aeef50eSEric Biggers .tag_len = 4, 104*2aeef50eSEric Biggers }, 105*2aeef50eSEric Biggers { 106*2aeef50eSEric Biggers .name = "NIST SP 800-38C Example 2", 107*2aeef50eSEric Biggers .key = "\x40\x41\x42\x43\x44\x45\x46\x47" 108*2aeef50eSEric Biggers "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f", 109*2aeef50eSEric Biggers .key_len = 16, 110*2aeef50eSEric Biggers .nonce = "\x10\x11\x12\x13\x14\x15\x16\x17", 111*2aeef50eSEric Biggers .nonce_len = 8, 112*2aeef50eSEric Biggers .ad = "\x00\x01\x02\x03\x04\x05\x06\x07" 113*2aeef50eSEric Biggers "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f", 114*2aeef50eSEric Biggers .ad_len = 16, 115*2aeef50eSEric Biggers .ptext = "\x20\x21\x22\x23\x24\x25\x26\x27" 116*2aeef50eSEric Biggers "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f", 117*2aeef50eSEric Biggers .ctext = "\xd2\xa1\xf0\xe0\x51\xea\x5f\x62" 118*2aeef50eSEric Biggers "\x08\x1a\x77\x92\x07\x3d\x59\x3d", 119*2aeef50eSEric Biggers .data_len = 16, 120*2aeef50eSEric Biggers .tag = "\x1f\xc6\x4f\xbf\xac\xcd", 121*2aeef50eSEric Biggers .tag_len = 6, 122*2aeef50eSEric Biggers }, 123*2aeef50eSEric Biggers { 124*2aeef50eSEric Biggers .name = "NIST SP 800-38C Example 3", 125*2aeef50eSEric Biggers .key = "\x40\x41\x42\x43\x44\x45\x46\x47" 126*2aeef50eSEric Biggers "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f", 127*2aeef50eSEric Biggers .key_len = 16, 128*2aeef50eSEric Biggers .nonce = "\x10\x11\x12\x13\x14\x15\x16\x17" 129*2aeef50eSEric Biggers "\x18\x19\x1a\x1b", 130*2aeef50eSEric Biggers .nonce_len = 12, 131*2aeef50eSEric Biggers .ad = "\x00\x01\x02\x03\x04\x05\x06\x07" 132*2aeef50eSEric Biggers "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" 133*2aeef50eSEric Biggers "\x10\x11\x12\x13", 134*2aeef50eSEric Biggers .ad_len = 20, 135*2aeef50eSEric Biggers .ptext = "\x20\x21\x22\x23\x24\x25\x26\x27" 136*2aeef50eSEric Biggers "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f" 137*2aeef50eSEric Biggers "\x30\x31\x32\x33\x34\x35\x36\x37", 138*2aeef50eSEric Biggers .ctext = "\xe3\xb2\x01\xa9\xf5\xb7\x1a\x7a" 139*2aeef50eSEric Biggers "\x9b\x1c\xea\xec\xcd\x97\xe7\x0b" 140*2aeef50eSEric Biggers "\x61\x76\xaa\xd9\xa4\x42\x8a\xa5", 141*2aeef50eSEric Biggers .data_len = 24, 142*2aeef50eSEric Biggers .tag = "\x48\x43\x92\xfb\xc1\xb0\x99\x51", 143*2aeef50eSEric Biggers .tag_len = 8, 144*2aeef50eSEric Biggers }, 145*2aeef50eSEric Biggers }; 146*2aeef50eSEric Biggers 147*2aeef50eSEric Biggers static void test_aes_ccm_one_test_vector(struct kunit *test, 148*2aeef50eSEric Biggers const struct aes_ccm_testvec *tv) 149*2aeef50eSEric Biggers { 150*2aeef50eSEric Biggers u8 *ctext = alloc_buf(test, tv->data_len); 151*2aeef50eSEric Biggers u8 *decrypted = alloc_buf(test, tv->data_len); 152*2aeef50eSEric Biggers u8 *tag = alloc_buf(test, tv->tag_len); 153*2aeef50eSEric Biggers struct aes_ccm_key key; 154*2aeef50eSEric Biggers int err; 155*2aeef50eSEric Biggers 156*2aeef50eSEric Biggers err = aes_ccm_preparekey(&key, tv->key, tv->key_len, tv->tag_len); 157*2aeef50eSEric Biggers KUNIT_ASSERT_EQ_MSG(test, 0, err, "Failed to prepare key for %s", 158*2aeef50eSEric Biggers tv->name); 159*2aeef50eSEric Biggers 160*2aeef50eSEric Biggers err = aes_ccm_encrypt(ctext, tv->ptext, tv->data_len, tag, tv->ad, 161*2aeef50eSEric Biggers tv->ad_len, tv->nonce, tv->nonce_len, &key); 162*2aeef50eSEric Biggers KUNIT_ASSERT_EQ_MSG(test, 0, err, "Encryption failed for %s", tv->name); 163*2aeef50eSEric Biggers KUNIT_ASSERT_MEMEQ_MSG(test, tv->ctext, ctext, tv->data_len, 164*2aeef50eSEric Biggers "Wrong ciphertext for %s", tv->name); 165*2aeef50eSEric Biggers KUNIT_ASSERT_MEMEQ_MSG(test, tag, tv->tag, tv->tag_len, 166*2aeef50eSEric Biggers "Wrong tag for %s", tv->name); 167*2aeef50eSEric Biggers 168*2aeef50eSEric Biggers err = aes_ccm_decrypt(decrypted, ctext, tv->data_len, tag, tv->ad, 169*2aeef50eSEric Biggers tv->ad_len, tv->nonce, tv->nonce_len, &key); 170*2aeef50eSEric Biggers KUNIT_ASSERT_EQ_MSG(test, 0, err, "Decryption failed for %s", tv->name); 171*2aeef50eSEric Biggers KUNIT_ASSERT_MEMEQ_MSG(test, tv->ptext, decrypted, tv->data_len, 172*2aeef50eSEric Biggers "Wrong plaintext for %s", tv->name); 173*2aeef50eSEric Biggers } 174*2aeef50eSEric Biggers 175*2aeef50eSEric Biggers static void test_aes_ccm_test_vectors(struct kunit *test) 176*2aeef50eSEric Biggers { 177*2aeef50eSEric Biggers for (size_t i = 0; i < ARRAY_SIZE(aes_ccm_testvecs); i++) 178*2aeef50eSEric Biggers test_aes_ccm_one_test_vector(test, &aes_ccm_testvecs[i]); 179*2aeef50eSEric Biggers } 180*2aeef50eSEric Biggers 181*2aeef50eSEric Biggers /* 182*2aeef50eSEric Biggers * Test NIST SP 800-38C Example 4, which uses a deterministically-generated 183*2aeef50eSEric Biggers * 65536-byte associated data string. 184*2aeef50eSEric Biggers */ 185*2aeef50eSEric Biggers static void test_aes_ccm_nist_sp800_38c_example4(struct kunit *test) 186*2aeef50eSEric Biggers { 187*2aeef50eSEric Biggers struct aes_ccm_testvec tv = { 188*2aeef50eSEric Biggers .name = "NIST SP 800-38C Example 4", 189*2aeef50eSEric Biggers .key_len = 16, 190*2aeef50eSEric Biggers .nonce_len = 13, 191*2aeef50eSEric Biggers .ad_len = 65536, 192*2aeef50eSEric Biggers .ctext = "\x69\x91\x5d\xad\x1e\x84\xc6\x37" 193*2aeef50eSEric Biggers "\x6a\x68\xc2\x96\x7e\x4d\xab\x61" 194*2aeef50eSEric Biggers "\x5a\xe0\xfd\x1f\xae\xc4\x4c\xc4" 195*2aeef50eSEric Biggers "\x84\x82\x85\x29\x46\x3c\xcf\x72", 196*2aeef50eSEric Biggers .data_len = 32, 197*2aeef50eSEric Biggers .tag = "\xb4\xac\x6b\xec\x93\xe8\x59\x8e" 198*2aeef50eSEric Biggers "\x7f\x0d\xad\xbc\xea\x5b", 199*2aeef50eSEric Biggers .tag_len = 14, 200*2aeef50eSEric Biggers }; 201*2aeef50eSEric Biggers u8 *key, *nonce, *ad, *ptext; 202*2aeef50eSEric Biggers 203*2aeef50eSEric Biggers key = alloc_buf(test, tv.key_len); 204*2aeef50eSEric Biggers for (size_t i = 0; i < tv.key_len; i++) 205*2aeef50eSEric Biggers key[i] = 0x40 + i; 206*2aeef50eSEric Biggers 207*2aeef50eSEric Biggers nonce = alloc_guarded_buf(test, tv.nonce_len); 208*2aeef50eSEric Biggers for (size_t i = 0; i < tv.nonce_len; i++) 209*2aeef50eSEric Biggers nonce[i] = 0x10 + i; 210*2aeef50eSEric Biggers 211*2aeef50eSEric Biggers ad = alloc_guarded_buf(test, tv.ad_len); 212*2aeef50eSEric Biggers for (size_t i = 0; i < tv.ad_len; i++) 213*2aeef50eSEric Biggers ad[i] = (u8)i; 214*2aeef50eSEric Biggers 215*2aeef50eSEric Biggers ptext = alloc_guarded_buf(test, tv.data_len); 216*2aeef50eSEric Biggers for (size_t i = 0; i < tv.data_len; i++) 217*2aeef50eSEric Biggers ptext[i] = 0x20 + i; 218*2aeef50eSEric Biggers 219*2aeef50eSEric Biggers tv.key = key; 220*2aeef50eSEric Biggers tv.nonce = nonce; 221*2aeef50eSEric Biggers tv.ad = ad; 222*2aeef50eSEric Biggers tv.ptext = ptext; 223*2aeef50eSEric Biggers 224*2aeef50eSEric Biggers test_aes_ccm_one_test_vector(test, &tv); 225*2aeef50eSEric Biggers } 226*2aeef50eSEric Biggers 227*2aeef50eSEric Biggers static const size_t aes_ccm_valid_key_lens[] = { 16, 24, 32 }; 228*2aeef50eSEric Biggers #define AEAD_MAX_KEY_LEN 32 229*2aeef50eSEric Biggers #define AEAD_VALID_KEY_LENS aes_ccm_valid_key_lens 230*2aeef50eSEric Biggers 231*2aeef50eSEric Biggers static const size_t aes_ccm_valid_nonce_lens[] = { 7, 8, 9, 10, 11, 12, 13 }; 232*2aeef50eSEric Biggers #define AEAD_MAX_NONCE_LEN 13 233*2aeef50eSEric Biggers #define AEAD_VALID_NONCE_LENS aes_ccm_valid_nonce_lens 234*2aeef50eSEric Biggers 235*2aeef50eSEric Biggers static const size_t aes_ccm_valid_tag_lens[] = { 4, 6, 8, 10, 12, 14, 16 }; 236*2aeef50eSEric Biggers #define AEAD_MAX_TAG_LEN 16 237*2aeef50eSEric Biggers #define AEAD_VALID_TAG_LENS aes_ccm_valid_tag_lens 238*2aeef50eSEric Biggers 239*2aeef50eSEric Biggers #define AEAD_KEY aes_ccm_key 240*2aeef50eSEric Biggers #define AEAD_CTX aes_ccm_ctx 241*2aeef50eSEric Biggers #define AEAD_PREPAREKEY aes_ccm_preparekey 242*2aeef50eSEric Biggers #define AEAD_ENCRYPT aes_ccm_encrypt 243*2aeef50eSEric Biggers #define AEAD_DECRYPT aes_ccm_decrypt 244*2aeef50eSEric Biggers 245*2aeef50eSEric Biggers #define AEAD_INIT aes_ccm_init 246*2aeef50eSEric Biggers #define AEAD_AUTH_UPDATE aes_ccm_auth_update 247*2aeef50eSEric Biggers #define AEAD_ENCRYPT_UPDATE aes_ccm_encrypt_update 248*2aeef50eSEric Biggers #define AEAD_DECRYPT_UPDATE aes_ccm_decrypt_update 249*2aeef50eSEric Biggers #define AEAD_ENCRYPT_FINAL aes_ccm_encrypt_final 250*2aeef50eSEric Biggers #define AEAD_DECRYPT_FINAL aes_ccm_decrypt_final 251*2aeef50eSEric Biggers 252*2aeef50eSEric Biggers /* This value was generated by gen-aead-testvecs.py. */ 253*2aeef50eSEric Biggers static const u8 aes_ccm_monte_carlo_checksum[BLAKE2S_HASH_SIZE] = { 254*2aeef50eSEric Biggers 0x70, 0x1c, 0xde, 0xa4, 0xe2, 0x03, 0x50, 0xb2, 0xf5, 0x9e, 0x61, 255*2aeef50eSEric Biggers 0x66, 0xe4, 0xe5, 0x13, 0x1a, 0x00, 0x95, 0x34, 0x03, 0xb7, 0x61, 256*2aeef50eSEric Biggers 0x2c, 0xdb, 0xc3, 0x15, 0x36, 0x84, 0x93, 0x7f, 0xb4, 0x5b, 257*2aeef50eSEric Biggers }; 258*2aeef50eSEric Biggers #define AEAD_MONTE_CARLO_CHECKSUM aes_ccm_monte_carlo_checksum 259*2aeef50eSEric Biggers 260*2aeef50eSEric Biggers #include "aead-test-template.h" 261*2aeef50eSEric Biggers 262*2aeef50eSEric Biggers /* 263*2aeef50eSEric Biggers * Test that for each AES-CCM nonce length, the message length is validated 264*2aeef50eSEric Biggers * against the correct corresponding maximum message length. 265*2aeef50eSEric Biggers */ 266*2aeef50eSEric Biggers static void test_aes_ccm_data_len_too_large(struct kunit *test) 267*2aeef50eSEric Biggers { 268*2aeef50eSEric Biggers static const struct { 269*2aeef50eSEric Biggers size_t nonce_len; 270*2aeef50eSEric Biggers u64 max_data_len; 271*2aeef50eSEric Biggers } lens[] = { 272*2aeef50eSEric Biggers /* clang-format off */ 273*2aeef50eSEric Biggers { 7, 0xffffffffffffffff }, /* U64_MAX */ 274*2aeef50eSEric Biggers { 8, 0xffffffffffffff }, 275*2aeef50eSEric Biggers { 9, 0xffffffffffff }, 276*2aeef50eSEric Biggers { 10, 0xffffffffff }, 277*2aeef50eSEric Biggers { 11, 0xffffffff }, 278*2aeef50eSEric Biggers { 12, 0xffffff }, 279*2aeef50eSEric Biggers { 13, 0xffff }, 280*2aeef50eSEric Biggers /* clang-format on */ 281*2aeef50eSEric Biggers }; 282*2aeef50eSEric Biggers u8 nonce[13] = {}; 283*2aeef50eSEric Biggers u8 raw_key[AES_KEYSIZE_256] = {}; 284*2aeef50eSEric Biggers int err; 285*2aeef50eSEric Biggers struct aes_ccm_key *key = alloc_buf(test, sizeof(*key)); 286*2aeef50eSEric Biggers struct aes_ccm_ctx ctx; 287*2aeef50eSEric Biggers 288*2aeef50eSEric Biggers err = aes_ccm_preparekey(key, raw_key, sizeof(raw_key), 16); 289*2aeef50eSEric Biggers KUNIT_ASSERT_EQ(test, 0, err); 290*2aeef50eSEric Biggers 291*2aeef50eSEric Biggers for (size_t i = 0; i < ARRAY_SIZE(lens); i++) { 292*2aeef50eSEric Biggers size_t nonce_len = lens[i].nonce_len; 293*2aeef50eSEric Biggers u64 max_data_len = lens[i].max_data_len; 294*2aeef50eSEric Biggers 295*2aeef50eSEric Biggers /* data_len <= max_data_len should be accepted. */ 296*2aeef50eSEric Biggers err = aes_ccm_init(&ctx, 0, 0, nonce, nonce_len, key); 297*2aeef50eSEric Biggers KUNIT_ASSERT_EQ_MSG( 298*2aeef50eSEric Biggers test, 0, err, 299*2aeef50eSEric Biggers "data_len=0 wasn't accepted with nonce_len=%zu", 300*2aeef50eSEric Biggers nonce_len); 301*2aeef50eSEric Biggers err = aes_ccm_init(&ctx, max_data_len, 0, nonce, nonce_len, 302*2aeef50eSEric Biggers key); 303*2aeef50eSEric Biggers KUNIT_ASSERT_EQ_MSG( 304*2aeef50eSEric Biggers test, 0, err, 305*2aeef50eSEric Biggers "data_len=%llu wasn't accepted with nonce_len=%zu", 306*2aeef50eSEric Biggers max_data_len, nonce_len); 307*2aeef50eSEric Biggers 308*2aeef50eSEric Biggers /* data_len > max_data_len should be rejected. */ 309*2aeef50eSEric Biggers if (max_data_len == U64_MAX) 310*2aeef50eSEric Biggers continue; 311*2aeef50eSEric Biggers err = aes_ccm_init(&ctx, max_data_len + 1, 0, nonce, nonce_len, 312*2aeef50eSEric Biggers key); 313*2aeef50eSEric Biggers KUNIT_ASSERT_EQ_MSG( 314*2aeef50eSEric Biggers test, -EOVERFLOW, err, 315*2aeef50eSEric Biggers "data_len=%llu wasn't rejected with -EOVERFLOW with nonce_len=%zu (aes_ccm_init)", 316*2aeef50eSEric Biggers max_data_len + 1, nonce_len); 317*2aeef50eSEric Biggers if (max_data_len + 1 <= SIZE_MAX) { 318*2aeef50eSEric Biggers err = aes_ccm_encrypt(NULL, NULL, max_data_len + 1, 319*2aeef50eSEric Biggers NULL, NULL, 0, nonce, nonce_len, 320*2aeef50eSEric Biggers key); 321*2aeef50eSEric Biggers KUNIT_ASSERT_EQ_MSG( 322*2aeef50eSEric Biggers test, -EOVERFLOW, err, 323*2aeef50eSEric Biggers "data_len=%llu wasn't rejected with -EOVERFLOW with nonce_len=%zu (aes_ccm_encrypt)", 324*2aeef50eSEric Biggers max_data_len + 1, nonce_len); 325*2aeef50eSEric Biggers err = aes_ccm_decrypt(NULL, NULL, max_data_len + 1, 326*2aeef50eSEric Biggers NULL, NULL, 0, nonce, nonce_len, 327*2aeef50eSEric Biggers key); 328*2aeef50eSEric Biggers KUNIT_ASSERT_EQ_MSG( 329*2aeef50eSEric Biggers test, -EOVERFLOW, err, 330*2aeef50eSEric Biggers "data_len=%llu wasn't rejected with -EOVERFLOW with nonce_len=%zu (aes_ccm_decrypt)", 331*2aeef50eSEric Biggers max_data_len + 1, nonce_len); 332*2aeef50eSEric Biggers } 333*2aeef50eSEric Biggers err = aes_ccm_init(&ctx, U64_MAX, 0, nonce, nonce_len, key); 334*2aeef50eSEric Biggers KUNIT_ASSERT_EQ_MSG( 335*2aeef50eSEric Biggers test, -EOVERFLOW, err, 336*2aeef50eSEric Biggers "data_len=U64_MAX wasn't rejected with -EOVERFLOW with nonce_len=%zu (aes_ccm_init)", 337*2aeef50eSEric Biggers nonce_len); 338*2aeef50eSEric Biggers } 339*2aeef50eSEric Biggers } 340*2aeef50eSEric Biggers 341*2aeef50eSEric Biggers static struct kunit_case aes_ccm_test_cases[] = { 342*2aeef50eSEric Biggers KUNIT_CASE(test_aes_ccm_test_vectors), 343*2aeef50eSEric Biggers KUNIT_CASE(test_aes_ccm_nist_sp800_38c_example4), 344*2aeef50eSEric Biggers KUNIT_CASE(test_aes_ccm_data_len_too_large), 345*2aeef50eSEric Biggers AEAD_KUNIT_CASES, 346*2aeef50eSEric Biggers {}, 347*2aeef50eSEric Biggers }; 348*2aeef50eSEric Biggers 349*2aeef50eSEric Biggers static struct kunit_suite aes_ccm_test_suite = { 350*2aeef50eSEric Biggers .name = "aes_ccm", 351*2aeef50eSEric Biggers .test_cases = aes_ccm_test_cases, 352*2aeef50eSEric Biggers }; 353*2aeef50eSEric Biggers kunit_test_suite(aes_ccm_test_suite); 354*2aeef50eSEric Biggers 355*2aeef50eSEric Biggers MODULE_DESCRIPTION("KUnit tests and benchmark for AES-CCM"); 356*2aeef50eSEric Biggers MODULE_LICENSE("GPL"); 357