xref: /linux/lib/crypto/tests/aes_ccm_kunit.c (revision fc8c78bce3335860ff4ae9fcfd3b2eb1f674efbb)
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