1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Minimal library implementation of GCM
4  *
5  * Copyright 2022 Google LLC
6  */
7 
8 #include <crypto/algapi.h>
9 #include <crypto/gcm.h>
10 #include <crypto/ghash.h>
11 #include <linux/export.h>
12 #include <linux/module.h>
13 #include <asm/irqflags.h>
14 
aesgcm_encrypt_block(const struct crypto_aes_ctx * ctx,void * dst,const void * src)15 static void aesgcm_encrypt_block(const struct crypto_aes_ctx *ctx, void *dst,
16 				 const void *src)
17 {
18 	unsigned long flags;
19 
20 	/*
21 	 * In AES-GCM, both the GHASH key derivation and the CTR mode
22 	 * encryption operate on known plaintext, making them susceptible to
23 	 * timing attacks on the encryption key. The AES library already
24 	 * mitigates this risk to some extent by pulling the entire S-box into
25 	 * the caches before doing any substitutions, but this strategy is more
26 	 * effective when running with interrupts disabled.
27 	 */
28 	local_irq_save(flags);
29 	aes_encrypt(ctx, dst, src);
30 	local_irq_restore(flags);
31 }
32 
33 /**
34  * aesgcm_expandkey - Expands the AES and GHASH keys for the AES-GCM key
35  *		      schedule
36  *
37  * @ctx:	The data structure that will hold the AES-GCM key schedule
38  * @key:	The AES encryption input key
39  * @keysize:	The length in bytes of the input key
40  * @authsize:	The size in bytes of the GCM authentication tag
41  *
42  * Returns: 0 on success, or -EINVAL if @keysize or @authsize contain values
43  * that are not permitted by the GCM specification.
44  */
aesgcm_expandkey(struct aesgcm_ctx * ctx,const u8 * key,unsigned int keysize,unsigned int authsize)45 int aesgcm_expandkey(struct aesgcm_ctx *ctx, const u8 *key,
46 		     unsigned int keysize, unsigned int authsize)
47 {
48 	u8 kin[AES_BLOCK_SIZE] = {};
49 	int ret;
50 
51 	ret = crypto_gcm_check_authsize(authsize) ?:
52 	      aes_expandkey(&ctx->aes_ctx, key, keysize);
53 	if (ret)
54 		return ret;
55 
56 	ctx->authsize = authsize;
57 	aesgcm_encrypt_block(&ctx->aes_ctx, &ctx->ghash_key, kin);
58 
59 	return 0;
60 }
61 EXPORT_SYMBOL(aesgcm_expandkey);
62 
aesgcm_ghash(be128 * ghash,const be128 * key,const void * src,int len)63 static void aesgcm_ghash(be128 *ghash, const be128 *key, const void *src,
64 			 int len)
65 {
66 	while (len > 0) {
67 		crypto_xor((u8 *)ghash, src, min(len, GHASH_BLOCK_SIZE));
68 		gf128mul_lle(ghash, key);
69 
70 		src += GHASH_BLOCK_SIZE;
71 		len -= GHASH_BLOCK_SIZE;
72 	}
73 }
74 
75 /**
76  * aesgcm_mac - Generates the authentication tag using AES-GCM algorithm.
77  * @ctx: The data structure that will hold the AES-GCM key schedule
78  * @src: The input source data.
79  * @src_len: Length of the source data.
80  * @assoc: Points to the associated data.
81  * @assoc_len: Length of the associated data values.
82  * @ctr: Points to the counter value.
83  * @authtag: The output buffer for the authentication tag.
84  *
85  * It takes in the AES-GCM context, source data, associated data, counter value,
86  * and an output buffer for the authentication tag.
87  */
aesgcm_mac(const struct aesgcm_ctx * ctx,const u8 * src,int src_len,const u8 * assoc,int assoc_len,__be32 * ctr,u8 * authtag)88 static void aesgcm_mac(const struct aesgcm_ctx *ctx, const u8 *src, int src_len,
89 		       const u8 *assoc, int assoc_len, __be32 *ctr, u8 *authtag)
90 {
91 	be128 tail = { cpu_to_be64(assoc_len * 8), cpu_to_be64(src_len * 8) };
92 	u8 buf[AES_BLOCK_SIZE];
93 	be128 ghash = {};
94 
95 	aesgcm_ghash(&ghash, &ctx->ghash_key, assoc, assoc_len);
96 	aesgcm_ghash(&ghash, &ctx->ghash_key, src, src_len);
97 	aesgcm_ghash(&ghash, &ctx->ghash_key, &tail, sizeof(tail));
98 
99 	ctr[3] = cpu_to_be32(1);
100 	aesgcm_encrypt_block(&ctx->aes_ctx, buf, ctr);
101 	crypto_xor_cpy(authtag, buf, (u8 *)&ghash, ctx->authsize);
102 
103 	memzero_explicit(&ghash, sizeof(ghash));
104 	memzero_explicit(buf, sizeof(buf));
105 }
106 
aesgcm_crypt(const struct aesgcm_ctx * ctx,u8 * dst,const u8 * src,int len,__be32 * ctr)107 static void aesgcm_crypt(const struct aesgcm_ctx *ctx, u8 *dst, const u8 *src,
108 			 int len, __be32 *ctr)
109 {
110 	u8 buf[AES_BLOCK_SIZE];
111 	unsigned int n = 2;
112 
113 	while (len > 0) {
114 		/*
115 		 * The counter increment below must not result in overflow or
116 		 * carry into the next 32-bit word, as this could result in
117 		 * inadvertent IV reuse, which must be avoided at all cost for
118 		 * stream ciphers such as AES-CTR. Given the range of 'int
119 		 * len', this cannot happen, so no explicit test is necessary.
120 		 */
121 		ctr[3] = cpu_to_be32(n++);
122 		aesgcm_encrypt_block(&ctx->aes_ctx, buf, ctr);
123 		crypto_xor_cpy(dst, src, buf, min(len, AES_BLOCK_SIZE));
124 
125 		dst += AES_BLOCK_SIZE;
126 		src += AES_BLOCK_SIZE;
127 		len -= AES_BLOCK_SIZE;
128 	}
129 	memzero_explicit(buf, sizeof(buf));
130 }
131 
132 /**
133  * aesgcm_encrypt - Perform AES-GCM encryption on a block of data
134  *
135  * @ctx:	The AES-GCM key schedule
136  * @dst:	Pointer to the ciphertext output buffer
137  * @src:	Pointer the plaintext (may equal @dst for encryption in place)
138  * @crypt_len:	The size in bytes of the plaintext and ciphertext.
139  * @assoc:	Pointer to the associated data,
140  * @assoc_len:	The size in bytes of the associated data
141  * @iv:		The initialization vector (IV) to use for this block of data
142  *		(must be 12 bytes in size as per the GCM spec recommendation)
143  * @authtag:	The address of the buffer in memory where the authentication
144  *		tag should be stored. The buffer is assumed to have space for
145  *		@ctx->authsize bytes.
146  */
aesgcm_encrypt(const struct aesgcm_ctx * ctx,u8 * dst,const u8 * src,int crypt_len,const u8 * assoc,int assoc_len,const u8 iv[GCM_AES_IV_SIZE],u8 * authtag)147 void aesgcm_encrypt(const struct aesgcm_ctx *ctx, u8 *dst, const u8 *src,
148 		    int crypt_len, const u8 *assoc, int assoc_len,
149 		    const u8 iv[GCM_AES_IV_SIZE], u8 *authtag)
150 {
151 	__be32 ctr[4];
152 
153 	memcpy(ctr, iv, GCM_AES_IV_SIZE);
154 
155 	aesgcm_crypt(ctx, dst, src, crypt_len, ctr);
156 	aesgcm_mac(ctx, dst, crypt_len, assoc, assoc_len, ctr, authtag);
157 }
158 EXPORT_SYMBOL(aesgcm_encrypt);
159 
160 /**
161  * aesgcm_decrypt - Perform AES-GCM decryption on a block of data
162  *
163  * @ctx:	The AES-GCM key schedule
164  * @dst:	Pointer to the plaintext output buffer
165  * @src:	Pointer the ciphertext (may equal @dst for decryption in place)
166  * @crypt_len:	The size in bytes of the plaintext and ciphertext.
167  * @assoc:	Pointer to the associated data,
168  * @assoc_len:	The size in bytes of the associated data
169  * @iv:		The initialization vector (IV) to use for this block of data
170  *		(must be 12 bytes in size as per the GCM spec recommendation)
171  * @authtag:	The address of the buffer in memory where the authentication
172  *		tag is stored.
173  *
174  * Returns: true on success, or false if the ciphertext failed authentication.
175  * On failure, no plaintext will be returned.
176  */
aesgcm_decrypt(const struct aesgcm_ctx * ctx,u8 * dst,const u8 * src,int crypt_len,const u8 * assoc,int assoc_len,const u8 iv[GCM_AES_IV_SIZE],const u8 * authtag)177 bool __must_check aesgcm_decrypt(const struct aesgcm_ctx *ctx, u8 *dst,
178 				 const u8 *src, int crypt_len, const u8 *assoc,
179 				 int assoc_len, const u8 iv[GCM_AES_IV_SIZE],
180 				 const u8 *authtag)
181 {
182 	u8 tagbuf[AES_BLOCK_SIZE];
183 	__be32 ctr[4];
184 
185 	memcpy(ctr, iv, GCM_AES_IV_SIZE);
186 
187 	aesgcm_mac(ctx, src, crypt_len, assoc, assoc_len, ctr, tagbuf);
188 	if (crypto_memneq(authtag, tagbuf, ctx->authsize)) {
189 		memzero_explicit(tagbuf, sizeof(tagbuf));
190 		return false;
191 	}
192 	aesgcm_crypt(ctx, dst, src, crypt_len, ctr);
193 	return true;
194 }
195 EXPORT_SYMBOL(aesgcm_decrypt);
196 
197 MODULE_DESCRIPTION("Generic AES-GCM library");
198 MODULE_AUTHOR("Ard Biesheuvel <ardb@kernel.org>");
199 MODULE_LICENSE("GPL");
200 
201 #ifdef CONFIG_CRYPTO_SELFTESTS
202 
203 /*
204  * Test code below. Vectors taken from crypto/testmgr.h
205  */
206 
207 static const u8 __initconst ctext0[16] __nonstring =
208 	"\x58\xe2\xfc\xce\xfa\x7e\x30\x61"
209 	"\x36\x7f\x1d\x57\xa4\xe7\x45\x5a";
210 
211 static const u8 __initconst ptext1[16];
212 
213 static const u8 __initconst ctext1[32] __nonstring =
214 	"\x03\x88\xda\xce\x60\xb6\xa3\x92"
215 	"\xf3\x28\xc2\xb9\x71\xb2\xfe\x78"
216 	"\xab\x6e\x47\xd4\x2c\xec\x13\xbd"
217 	"\xf5\x3a\x67\xb2\x12\x57\xbd\xdf";
218 
219 static const u8 __initconst ptext2[64] __nonstring =
220 	"\xd9\x31\x32\x25\xf8\x84\x06\xe5"
221 	"\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
222 	"\x86\xa7\xa9\x53\x15\x34\xf7\xda"
223 	"\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
224 	"\x1c\x3c\x0c\x95\x95\x68\x09\x53"
225 	"\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
226 	"\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
227 	"\xba\x63\x7b\x39\x1a\xaf\xd2\x55";
228 
229 static const u8 __initconst ctext2[80] __nonstring =
230 	"\x42\x83\x1e\xc2\x21\x77\x74\x24"
231 	"\x4b\x72\x21\xb7\x84\xd0\xd4\x9c"
232 	"\xe3\xaa\x21\x2f\x2c\x02\xa4\xe0"
233 	"\x35\xc1\x7e\x23\x29\xac\xa1\x2e"
234 	"\x21\xd5\x14\xb2\x54\x66\x93\x1c"
235 	"\x7d\x8f\x6a\x5a\xac\x84\xaa\x05"
236 	"\x1b\xa3\x0b\x39\x6a\x0a\xac\x97"
237 	"\x3d\x58\xe0\x91\x47\x3f\x59\x85"
238 	"\x4d\x5c\x2a\xf3\x27\xcd\x64\xa6"
239 	"\x2c\xf3\x5a\xbd\x2b\xa6\xfa\xb4";
240 
241 static const u8 __initconst ptext3[60] __nonstring =
242 	"\xd9\x31\x32\x25\xf8\x84\x06\xe5"
243 	"\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
244 	"\x86\xa7\xa9\x53\x15\x34\xf7\xda"
245 	"\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
246 	"\x1c\x3c\x0c\x95\x95\x68\x09\x53"
247 	"\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
248 	"\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
249 	"\xba\x63\x7b\x39";
250 
251 static const u8 __initconst ctext3[76] __nonstring =
252 	"\x42\x83\x1e\xc2\x21\x77\x74\x24"
253 	"\x4b\x72\x21\xb7\x84\xd0\xd4\x9c"
254 	"\xe3\xaa\x21\x2f\x2c\x02\xa4\xe0"
255 	"\x35\xc1\x7e\x23\x29\xac\xa1\x2e"
256 	"\x21\xd5\x14\xb2\x54\x66\x93\x1c"
257 	"\x7d\x8f\x6a\x5a\xac\x84\xaa\x05"
258 	"\x1b\xa3\x0b\x39\x6a\x0a\xac\x97"
259 	"\x3d\x58\xe0\x91"
260 	"\x5b\xc9\x4f\xbc\x32\x21\xa5\xdb"
261 	"\x94\xfa\xe9\x5a\xe7\x12\x1a\x47";
262 
263 static const u8 __initconst ctext4[16] __nonstring =
264 	"\xcd\x33\xb2\x8a\xc7\x73\xf7\x4b"
265 	"\xa0\x0e\xd1\xf3\x12\x57\x24\x35";
266 
267 static const u8 __initconst ctext5[32] __nonstring =
268 	"\x98\xe7\x24\x7c\x07\xf0\xfe\x41"
269 	"\x1c\x26\x7e\x43\x84\xb0\xf6\x00"
270 	"\x2f\xf5\x8d\x80\x03\x39\x27\xab"
271 	"\x8e\xf4\xd4\x58\x75\x14\xf0\xfb";
272 
273 static const u8 __initconst ptext6[64] __nonstring =
274 	"\xd9\x31\x32\x25\xf8\x84\x06\xe5"
275 	"\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
276 	"\x86\xa7\xa9\x53\x15\x34\xf7\xda"
277 	"\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
278 	"\x1c\x3c\x0c\x95\x95\x68\x09\x53"
279 	"\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
280 	"\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
281 	"\xba\x63\x7b\x39\x1a\xaf\xd2\x55";
282 
283 static const u8 __initconst ctext6[80] __nonstring =
284 	"\x39\x80\xca\x0b\x3c\x00\xe8\x41"
285 	"\xeb\x06\xfa\xc4\x87\x2a\x27\x57"
286 	"\x85\x9e\x1c\xea\xa6\xef\xd9\x84"
287 	"\x62\x85\x93\xb4\x0c\xa1\xe1\x9c"
288 	"\x7d\x77\x3d\x00\xc1\x44\xc5\x25"
289 	"\xac\x61\x9d\x18\xc8\x4a\x3f\x47"
290 	"\x18\xe2\x44\x8b\x2f\xe3\x24\xd9"
291 	"\xcc\xda\x27\x10\xac\xad\xe2\x56"
292 	"\x99\x24\xa7\xc8\x58\x73\x36\xbf"
293 	"\xb1\x18\x02\x4d\xb8\x67\x4a\x14";
294 
295 static const u8 __initconst ctext7[16] __nonstring =
296 	"\x53\x0f\x8a\xfb\xc7\x45\x36\xb9"
297 	"\xa9\x63\xb4\xf1\xc4\xcb\x73\x8b";
298 
299 static const u8 __initconst ctext8[32] __nonstring =
300 	"\xce\xa7\x40\x3d\x4d\x60\x6b\x6e"
301 	"\x07\x4e\xc5\xd3\xba\xf3\x9d\x18"
302 	"\xd0\xd1\xc8\xa7\x99\x99\x6b\xf0"
303 	"\x26\x5b\x98\xb5\xd4\x8a\xb9\x19";
304 
305 static const u8 __initconst ptext9[64] __nonstring =
306 	"\xd9\x31\x32\x25\xf8\x84\x06\xe5"
307 	"\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
308 	"\x86\xa7\xa9\x53\x15\x34\xf7\xda"
309 	"\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
310 	"\x1c\x3c\x0c\x95\x95\x68\x09\x53"
311 	"\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
312 	"\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
313 	"\xba\x63\x7b\x39\x1a\xaf\xd2\x55";
314 
315 static const u8 __initconst ctext9[80] __nonstring =
316 	"\x52\x2d\xc1\xf0\x99\x56\x7d\x07"
317 	"\xf4\x7f\x37\xa3\x2a\x84\x42\x7d"
318 	"\x64\x3a\x8c\xdc\xbf\xe5\xc0\xc9"
319 	"\x75\x98\xa2\xbd\x25\x55\xd1\xaa"
320 	"\x8c\xb0\x8e\x48\x59\x0d\xbb\x3d"
321 	"\xa7\xb0\x8b\x10\x56\x82\x88\x38"
322 	"\xc5\xf6\x1e\x63\x93\xba\x7a\x0a"
323 	"\xbc\xc9\xf6\x62\x89\x80\x15\xad"
324 	"\xb0\x94\xda\xc5\xd9\x34\x71\xbd"
325 	"\xec\x1a\x50\x22\x70\xe3\xcc\x6c";
326 
327 static const u8 __initconst ptext10[60] __nonstring =
328 	"\xd9\x31\x32\x25\xf8\x84\x06\xe5"
329 	"\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
330 	"\x86\xa7\xa9\x53\x15\x34\xf7\xda"
331 	"\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
332 	"\x1c\x3c\x0c\x95\x95\x68\x09\x53"
333 	"\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
334 	"\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
335 	"\xba\x63\x7b\x39";
336 
337 static const u8 __initconst ctext10[76] __nonstring =
338 	"\x52\x2d\xc1\xf0\x99\x56\x7d\x07"
339 	"\xf4\x7f\x37\xa3\x2a\x84\x42\x7d"
340 	"\x64\x3a\x8c\xdc\xbf\xe5\xc0\xc9"
341 	"\x75\x98\xa2\xbd\x25\x55\xd1\xaa"
342 	"\x8c\xb0\x8e\x48\x59\x0d\xbb\x3d"
343 	"\xa7\xb0\x8b\x10\x56\x82\x88\x38"
344 	"\xc5\xf6\x1e\x63\x93\xba\x7a\x0a"
345 	"\xbc\xc9\xf6\x62"
346 	"\x76\xfc\x6e\xce\x0f\x4e\x17\x68"
347 	"\xcd\xdf\x88\x53\xbb\x2d\x55\x1b";
348 
349 static const u8 __initconst ptext11[60] __nonstring =
350 	"\xd9\x31\x32\x25\xf8\x84\x06\xe5"
351 	"\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
352 	"\x86\xa7\xa9\x53\x15\x34\xf7\xda"
353 	"\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
354 	"\x1c\x3c\x0c\x95\x95\x68\x09\x53"
355 	"\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
356 	"\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
357 	"\xba\x63\x7b\x39";
358 
359 static const u8 __initconst ctext11[76] __nonstring =
360 	"\x39\x80\xca\x0b\x3c\x00\xe8\x41"
361 	"\xeb\x06\xfa\xc4\x87\x2a\x27\x57"
362 	"\x85\x9e\x1c\xea\xa6\xef\xd9\x84"
363 	"\x62\x85\x93\xb4\x0c\xa1\xe1\x9c"
364 	"\x7d\x77\x3d\x00\xc1\x44\xc5\x25"
365 	"\xac\x61\x9d\x18\xc8\x4a\x3f\x47"
366 	"\x18\xe2\x44\x8b\x2f\xe3\x24\xd9"
367 	"\xcc\xda\x27\x10"
368 	"\x25\x19\x49\x8e\x80\xf1\x47\x8f"
369 	"\x37\xba\x55\xbd\x6d\x27\x61\x8c";
370 
371 static const u8 __initconst ptext12[719] __nonstring =
372 	"\x42\xc1\xcc\x08\x48\x6f\x41\x3f"
373 	"\x2f\x11\x66\x8b\x2a\x16\xf0\xe0"
374 	"\x58\x83\xf0\xc3\x70\x14\xc0\x5b"
375 	"\x3f\xec\x1d\x25\x3c\x51\xd2\x03"
376 	"\xcf\x59\x74\x1f\xb2\x85\xb4\x07"
377 	"\xc6\x6a\x63\x39\x8a\x5b\xde\xcb"
378 	"\xaf\x08\x44\xbd\x6f\x91\x15\xe1"
379 	"\xf5\x7a\x6e\x18\xbd\xdd\x61\x50"
380 	"\x59\xa9\x97\xab\xbb\x0e\x74\x5c"
381 	"\x00\xa4\x43\x54\x04\x54\x9b\x3b"
382 	"\x77\xec\xfd\x5c\xa6\xe8\x7b\x08"
383 	"\xae\xe6\x10\x3f\x32\x65\xd1\xfc"
384 	"\xa4\x1d\x2c\x31\xfb\x33\x7a\xb3"
385 	"\x35\x23\xf4\x20\x41\xd4\xad\x82"
386 	"\x8b\xa4\xad\x96\x1c\x20\x53\xbe"
387 	"\x0e\xa6\xf4\xdc\x78\x49\x3e\x72"
388 	"\xb1\xa9\xb5\x83\xcb\x08\x54\xb7"
389 	"\xad\x49\x3a\xae\x98\xce\xa6\x66"
390 	"\x10\x30\x90\x8c\x55\x83\xd7\x7c"
391 	"\x8b\xe6\x53\xde\xd2\x6e\x18\x21"
392 	"\x01\x52\xd1\x9f\x9d\xbb\x9c\x73"
393 	"\x57\xcc\x89\x09\x75\x9b\x78\x70"
394 	"\xed\x26\x97\x4d\xb4\xe4\x0c\xa5"
395 	"\xfa\x70\x04\x70\xc6\x96\x1c\x7d"
396 	"\x54\x41\x77\xa8\xe3\xb0\x7e\x96"
397 	"\x82\xd9\xec\xa2\x87\x68\x55\xf9"
398 	"\x8f\x9e\x73\x43\x47\x6a\x08\x36"
399 	"\x93\x67\xa8\x2d\xde\xac\x41\xa9"
400 	"\x5c\x4d\x73\x97\x0f\x70\x68\xfa"
401 	"\x56\x4d\x00\xc2\x3b\x1f\xc8\xb9"
402 	"\x78\x1f\x51\x07\xe3\x9a\x13\x4e"
403 	"\xed\x2b\x2e\xa3\xf7\x44\xb2\xe7"
404 	"\xab\x19\x37\xd9\xba\x76\x5e\xd2"
405 	"\xf2\x53\x15\x17\x4c\x6b\x16\x9f"
406 	"\x02\x66\x49\xca\x7c\x91\x05\xf2"
407 	"\x45\x36\x1e\xf5\x77\xad\x1f\x46"
408 	"\xa8\x13\xfb\x63\xb6\x08\x99\x63"
409 	"\x82\xa2\xed\xb3\xac\xdf\x43\x19"
410 	"\x45\xea\x78\x73\xd9\xb7\x39\x11"
411 	"\xa3\x13\x7c\xf8\x3f\xf7\xad\x81"
412 	"\x48\x2f\xa9\x5c\x5f\xa0\xf0\x79"
413 	"\xa4\x47\x7d\x80\x20\x26\xfd\x63"
414 	"\x0a\xc7\x7e\x6d\x75\x47\xff\x76"
415 	"\x66\x2e\x8a\x6c\x81\x35\xaf\x0b"
416 	"\x2e\x6a\x49\x60\xc1\x10\xe1\xe1"
417 	"\x54\x03\xa4\x09\x0c\x37\x7a\x15"
418 	"\x23\x27\x5b\x8b\x4b\xa5\x64\x97"
419 	"\xae\x4a\x50\x73\x1f\x66\x1c\x5c"
420 	"\x03\x25\x3c\x8d\x48\x58\x71\x34"
421 	"\x0e\xec\x4e\x55\x1a\x03\x6a\xe5"
422 	"\xb6\x19\x2b\x84\x2a\x20\xd1\xea"
423 	"\x80\x6f\x96\x0e\x05\x62\xc7\x78"
424 	"\x87\x79\x60\x38\x46\xb4\x25\x57"
425 	"\x6e\x16\x63\xf8\xad\x6e\xd7\x42"
426 	"\x69\xe1\x88\xef\x6e\xd5\xb4\x9a"
427 	"\x3c\x78\x6c\x3b\xe5\xa0\x1d\x22"
428 	"\x86\x5c\x74\x3a\xeb\x24\x26\xc7"
429 	"\x09\xfc\x91\x96\x47\x87\x4f\x1a"
430 	"\xd6\x6b\x2c\x18\x47\xc0\xb8\x24"
431 	"\xa8\x5a\x4a\x9e\xcb\x03\xe7\x2a"
432 	"\x09\xe6\x4d\x9c\x6d\x86\x60\xf5"
433 	"\x2f\x48\x69\x37\x9f\xf2\xd2\xcb"
434 	"\x0e\x5a\xdd\x6e\x8a\xfb\x6a\xfe"
435 	"\x0b\x63\xde\x87\x42\x79\x8a\x68"
436 	"\x51\x28\x9b\x7a\xeb\xaf\xb8\x2f"
437 	"\x9d\xd1\xc7\x45\x90\x08\xc9\x83"
438 	"\xe9\x83\x84\xcb\x28\x69\x09\x69"
439 	"\xce\x99\x46\x00\x54\xcb\xd8\x38"
440 	"\xf9\x53\x4a\xbf\x31\xce\x57\x15"
441 	"\x33\xfa\x96\x04\x33\x42\xe3\xc0"
442 	"\xb7\x54\x4a\x65\x7a\x7c\x02\xe6"
443 	"\x19\x95\xd0\x0e\x82\x07\x63\xf9"
444 	"\xe1\x2b\x2a\xfc\x55\x92\x52\xc9"
445 	"\xb5\x9f\x23\x28\x60\xe7\x20\x51"
446 	"\x10\xd3\xed\x6d\x9b\xab\xb8\xe2"
447 	"\x5d\x9a\x34\xb3\xbe\x9c\x64\xcb"
448 	"\x78\xc6\x91\x22\x40\x91\x80\xbe"
449 	"\xd7\x78\x5c\x0e\x0a\xdc\x08\xe9"
450 	"\x67\x10\xa4\x83\x98\x79\x23\xe7"
451 	"\x92\xda\xa9\x22\x16\xb1\xe7\x78"
452 	"\xa3\x1c\x6c\x8f\x35\x7c\x4d\x37"
453 	"\x2f\x6e\x0b\x50\x5c\x34\xb9\xf9"
454 	"\xe6\x3d\x91\x0d\x32\x95\xaa\x3d"
455 	"\x48\x11\x06\xbb\x2d\xf2\x63\x88"
456 	"\x3f\x73\x09\xe2\x45\x56\x31\x51"
457 	"\xfa\x5e\x4e\x62\xf7\x90\xf9\xa9"
458 	"\x7d\x7b\x1b\xb1\xc8\x26\x6e\x66"
459 	"\xf6\x90\x9a\x7f\xf2\x57\xcc\x23"
460 	"\x59\xfa\xfa\xaa\x44\x04\x01\xa7"
461 	"\xa4\x78\xdb\x74\x3d\x8b\xb5";
462 
463 static const u8 __initconst ctext12[735] __nonstring =
464 	"\x84\x0b\xdb\xd5\xb7\xa8\xfe\x20"
465 	"\xbb\xb1\x12\x7f\x41\xea\xb3\xc0"
466 	"\xa2\xb4\x37\x19\x11\x58\xb6\x0b"
467 	"\x4c\x1d\x38\x05\x54\xd1\x16\x73"
468 	"\x8e\x1c\x20\x90\xa2\x9a\xb7\x74"
469 	"\x47\xe6\xd8\xfc\x18\x3a\xb4\xea"
470 	"\xd5\x16\x5a\x2c\x53\x01\x46\xb3"
471 	"\x18\x33\x74\x6c\x50\xf2\xe8\xc0"
472 	"\x73\xda\x60\x22\xeb\xe3\xe5\x9b"
473 	"\x20\x93\x6c\x4b\x37\x99\xb8\x23"
474 	"\x3b\x4e\xac\xe8\x5b\xe8\x0f\xb7"
475 	"\xc3\x8f\xfb\x4a\x37\xd9\x39\x95"
476 	"\x34\xf1\xdb\x8f\x71\xd9\xc7\x0b"
477 	"\x02\xf1\x63\xfc\x9b\xfc\xc5\xab"
478 	"\xb9\x14\x13\x21\xdf\xce\xaa\x88"
479 	"\x44\x30\x1e\xce\x26\x01\x92\xf8"
480 	"\x9f\x00\x4b\x0c\x4b\xf7\x5f\xe0"
481 	"\x89\xca\x94\x66\x11\x21\x97\xca"
482 	"\x3e\x83\x74\x2d\xdb\x4d\x11\xeb"
483 	"\x97\xc2\x14\xff\x9e\x1e\xa0\x6b"
484 	"\x08\xb4\x31\x2b\x85\xc6\x85\x6c"
485 	"\x90\xec\x39\xc0\xec\xb3\xb5\x4e"
486 	"\xf3\x9c\xe7\x83\x3a\x77\x0a\xf4"
487 	"\x56\xfe\xce\x18\x33\x6d\x0b\x2d"
488 	"\x33\xda\xc8\x05\x5c\xb4\x09\x2a"
489 	"\xde\x6b\x52\x98\x01\xef\x36\x3d"
490 	"\xbd\xf9\x8f\xa8\x3e\xaa\xcd\xd1"
491 	"\x01\x2d\x42\x49\xc3\xb6\x84\xbb"
492 	"\x48\x96\xe0\x90\x93\x6c\x48\x64"
493 	"\xd4\xfa\x7f\x93\x2c\xa6\x21\xc8"
494 	"\x7a\x23\x7b\xaa\x20\x56\x12\xae"
495 	"\x16\x9d\x94\x0f\x54\xa1\xec\xca"
496 	"\x51\x4e\xf2\x39\xf4\xf8\x5f\x04"
497 	"\x5a\x0d\xbf\xf5\x83\xa1\x15\xe1"
498 	"\xf5\x3c\xd8\x62\xa3\xed\x47\x89"
499 	"\x85\x4c\xe5\xdb\xac\x9e\x17\x1d"
500 	"\x0c\x09\xe3\x3e\x39\x5b\x4d\x74"
501 	"\x0e\xf5\x34\xee\x70\x11\x4c\xfd"
502 	"\xdb\x34\xb1\xb5\x10\x3f\x73\xb7"
503 	"\xf5\xfa\xed\xb0\x1f\xa5\xcd\x3c"
504 	"\x8d\x35\x83\xd4\x11\x44\x6e\x6c"
505 	"\x5b\xe0\x0e\x69\xa5\x39\xe5\xbb"
506 	"\xa9\x57\x24\x37\xe6\x1f\xdd\xcf"
507 	"\x16\x2a\x13\xf9\x6a\x2d\x90\xa0"
508 	"\x03\x60\x7a\xed\x69\xd5\x00\x8b"
509 	"\x7e\x4f\xcb\xb9\xfa\x91\xb9\x37"
510 	"\xc1\x26\xce\x90\x97\x22\x64\x64"
511 	"\xc1\x72\x43\x1b\xf6\xac\xc1\x54"
512 	"\x8a\x10\x9c\xdd\x8d\xd5\x8e\xb2"
513 	"\xe4\x85\xda\xe0\x20\x5f\xf4\xb4"
514 	"\x15\xb5\xa0\x8d\x12\x74\x49\x23"
515 	"\x3a\xdf\x4a\xd3\xf0\x3b\x89\xeb"
516 	"\xf8\xcc\x62\x7b\xfb\x93\x07\x41"
517 	"\x61\x26\x94\x58\x70\xa6\x3c\xe4"
518 	"\xff\x58\xc4\x13\x3d\xcb\x36\x6b"
519 	"\x32\xe5\xb2\x6d\x03\x74\x6f\x76"
520 	"\x93\x77\xde\x48\xc4\xfa\x30\x4a"
521 	"\xda\x49\x80\x77\x0f\x1c\xbe\x11"
522 	"\xc8\x48\xb1\xe5\xbb\xf2\x8a\xe1"
523 	"\x96\x2f\x9f\xd1\x8e\x8a\x5c\xe2"
524 	"\xf7\xd7\xd8\x54\xf3\x3f\xc4\x91"
525 	"\xb8\xfb\x86\xdc\x46\x24\x91\x60"
526 	"\x6c\x2f\xc9\x41\x37\x51\x49\x54"
527 	"\x09\x81\x21\xf3\x03\x9f\x2b\xe3"
528 	"\x1f\x39\x63\xaf\xf4\xd7\x53\x60"
529 	"\xa7\xc7\x54\xf9\xee\xb1\xb1\x7d"
530 	"\x75\x54\x65\x93\xfe\xb1\x68\x6b"
531 	"\x57\x02\xf9\xbb\x0e\xf9\xf8\xbf"
532 	"\x01\x12\x27\xb4\xfe\xe4\x79\x7a"
533 	"\x40\x5b\x51\x4b\xdf\x38\xec\xb1"
534 	"\x6a\x56\xff\x35\x4d\x42\x33\xaa"
535 	"\x6f\x1b\xe4\xdc\xe0\xdb\x85\x35"
536 	"\x62\x10\xd4\xec\xeb\xc5\x7e\x45"
537 	"\x1c\x6f\x17\xca\x3b\x8e\x2d\x66"
538 	"\x4f\x4b\x36\x56\xcd\x1b\x59\xaa"
539 	"\xd2\x9b\x17\xb9\x58\xdf\x7b\x64"
540 	"\x8a\xff\x3b\x9c\xa6\xb5\x48\x9e"
541 	"\xaa\xe2\x5d\x09\x71\x32\x5f\xb6"
542 	"\x29\xbe\xe7\xc7\x52\x7e\x91\x82"
543 	"\x6b\x6d\x33\xe1\x34\x06\x36\x21"
544 	"\x5e\xbe\x1e\x2f\x3e\xc1\xfb\xea"
545 	"\x49\x2c\xb5\xca\xf7\xb0\x37\xea"
546 	"\x1f\xed\x10\x04\xd9\x48\x0d\x1a"
547 	"\x1c\xfb\xe7\x84\x0e\x83\x53\x74"
548 	"\xc7\x65\xe2\x5c\xe5\xba\x73\x4c"
549 	"\x0e\xe1\xb5\x11\x45\x61\x43\x46"
550 	"\xaa\x25\x8f\xbd\x85\x08\xfa\x4c"
551 	"\x15\xc1\xc0\xd8\xf5\xdc\x16\xbb"
552 	"\x7b\x1d\xe3\x87\x57\xa7\x2a\x1d"
553 	"\x38\x58\x9e\x8a\x43\xdc\x57"
554 	"\xd1\x81\x7d\x2b\xe9\xff\x99\x3a"
555 	"\x4b\x24\x52\x58\x55\xe1\x49\x14";
556 
557 static struct {
558 	const u8	*ptext;
559 	const u8	*ctext;
560 
561 	u8		key[AES_MAX_KEY_SIZE] __nonstring;
562 	u8		iv[GCM_AES_IV_SIZE] __nonstring;
563 	u8		assoc[20] __nonstring;
564 
565 	int		klen;
566 	int		clen;
567 	int		plen;
568 	int		alen;
569 } const aesgcm_tv[] __initconst = {
570 	{ /* From McGrew & Viega - http://citeseer.ist.psu.edu/656989.html */
571 		.klen	= 16,
572 		.ctext	= ctext0,
573 		.clen	= sizeof(ctext0),
574 	}, {
575 		.klen	= 16,
576 		.ptext	= ptext1,
577 		.plen	= sizeof(ptext1),
578 		.ctext	= ctext1,
579 		.clen	= sizeof(ctext1),
580 	}, {
581 		.key	= "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
582 			  "\x6d\x6a\x8f\x94\x67\x30\x83\x08",
583 		.klen	= 16,
584 		.iv	= "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
585 			  "\xde\xca\xf8\x88",
586 		.ptext	= ptext2,
587 		.plen	= sizeof(ptext2),
588 		.ctext	= ctext2,
589 		.clen	= sizeof(ctext2),
590 	}, {
591 		.key	= "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
592 			  "\x6d\x6a\x8f\x94\x67\x30\x83\x08",
593 		.klen	= 16,
594 		.iv	= "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
595 			  "\xde\xca\xf8\x88",
596 		.ptext	= ptext3,
597 		.plen	= sizeof(ptext3),
598 		.assoc	= "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
599 			  "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
600 			  "\xab\xad\xda\xd2",
601 		.alen	= 20,
602 		.ctext	= ctext3,
603 		.clen	= sizeof(ctext3),
604 	}, {
605 		.klen	= 24,
606 		.ctext	= ctext4,
607 		.clen	= sizeof(ctext4),
608 	}, {
609 		.klen	= 24,
610 		.ptext	= ptext1,
611 		.plen	= sizeof(ptext1),
612 		.ctext	= ctext5,
613 		.clen	= sizeof(ctext5),
614 	}, {
615 		.key	= "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
616 			  "\x6d\x6a\x8f\x94\x67\x30\x83\x08"
617 			  "\xfe\xff\xe9\x92\x86\x65\x73\x1c",
618 		.klen	= 24,
619 		.iv	= "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
620 			  "\xde\xca\xf8\x88",
621 		.ptext	= ptext6,
622 		.plen	= sizeof(ptext6),
623 		.ctext	= ctext6,
624 		.clen	= sizeof(ctext6),
625 	}, {
626 		.klen	= 32,
627 		.ctext	= ctext7,
628 		.clen	= sizeof(ctext7),
629 	}, {
630 		.klen	= 32,
631 		.ptext	= ptext1,
632 		.plen	= sizeof(ptext1),
633 		.ctext	= ctext8,
634 		.clen	= sizeof(ctext8),
635 	}, {
636 		.key	= "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
637 			  "\x6d\x6a\x8f\x94\x67\x30\x83\x08"
638 			  "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
639 			  "\x6d\x6a\x8f\x94\x67\x30\x83\x08",
640 		.klen	= 32,
641 		.iv	= "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
642 			  "\xde\xca\xf8\x88",
643 		.ptext	= ptext9,
644 		.plen	= sizeof(ptext9),
645 		.ctext	= ctext9,
646 		.clen	= sizeof(ctext9),
647 	}, {
648 		.key	= "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
649 			  "\x6d\x6a\x8f\x94\x67\x30\x83\x08"
650 			  "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
651 			  "\x6d\x6a\x8f\x94\x67\x30\x83\x08",
652 		.klen	= 32,
653 		.iv	= "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
654 			  "\xde\xca\xf8\x88",
655 		.ptext	= ptext10,
656 		.plen	= sizeof(ptext10),
657 		.assoc	= "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
658 			  "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
659 			  "\xab\xad\xda\xd2",
660 		.alen	= 20,
661 		.ctext	= ctext10,
662 		.clen	= sizeof(ctext10),
663 	}, {
664 		.key	= "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
665 			  "\x6d\x6a\x8f\x94\x67\x30\x83\x08"
666 			  "\xfe\xff\xe9\x92\x86\x65\x73\x1c",
667 		.klen	= 24,
668 		.iv	= "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
669 			  "\xde\xca\xf8\x88",
670 		.ptext	= ptext11,
671 		.plen	= sizeof(ptext11),
672 		.assoc	= "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
673 			  "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
674 			  "\xab\xad\xda\xd2",
675 		.alen	= 20,
676 		.ctext	= ctext11,
677 		.clen	= sizeof(ctext11),
678 	}, {
679 		.key	= "\x62\x35\xf8\x95\xfc\xa5\xeb\xf6"
680 			  "\x0e\x92\x12\x04\xd3\xa1\x3f\x2e"
681 			  "\x8b\x32\xcf\xe7\x44\xed\x13\x59"
682 			  "\x04\x38\x77\xb0\xb9\xad\xb4\x38",
683 		.klen	= 32,
684 		.iv	= "\x00\xff\xff\xff\xff\x00\x00\xff"
685 			  "\xff\xff\x00\xff",
686 		.ptext	= ptext12,
687 		.plen	= sizeof(ptext12),
688 		.ctext	= ctext12,
689 		.clen	= sizeof(ctext12),
690 	}
691 };
692 
libaesgcm_init(void)693 static int __init libaesgcm_init(void)
694 {
695 	for (int i = 0; i < ARRAY_SIZE(aesgcm_tv); i++) {
696 		u8 tagbuf[AES_BLOCK_SIZE];
697 		int plen = aesgcm_tv[i].plen;
698 		struct aesgcm_ctx ctx;
699 		static u8 buf[sizeof(ptext12)];
700 
701 		if (aesgcm_expandkey(&ctx, aesgcm_tv[i].key, aesgcm_tv[i].klen,
702 				     aesgcm_tv[i].clen - plen)) {
703 			pr_err("aesgcm_expandkey() failed on vector %d\n", i);
704 			return -ENODEV;
705 		}
706 
707 		if (!aesgcm_decrypt(&ctx, buf, aesgcm_tv[i].ctext, plen,
708 				    aesgcm_tv[i].assoc, aesgcm_tv[i].alen,
709 				    aesgcm_tv[i].iv, aesgcm_tv[i].ctext + plen)
710 		    || memcmp(buf, aesgcm_tv[i].ptext, plen)) {
711 			pr_err("aesgcm_decrypt() #1 failed on vector %d\n", i);
712 			return -ENODEV;
713 		}
714 
715 		/* encrypt in place */
716 		aesgcm_encrypt(&ctx, buf, buf, plen, aesgcm_tv[i].assoc,
717 			       aesgcm_tv[i].alen, aesgcm_tv[i].iv, tagbuf);
718 		if (memcmp(buf, aesgcm_tv[i].ctext, plen)) {
719 			pr_err("aesgcm_encrypt() failed on vector %d\n", i);
720 			return -ENODEV;
721 		}
722 
723 		/* decrypt in place */
724 		if (!aesgcm_decrypt(&ctx, buf, buf, plen, aesgcm_tv[i].assoc,
725 				    aesgcm_tv[i].alen, aesgcm_tv[i].iv, tagbuf)
726 		    || memcmp(buf, aesgcm_tv[i].ptext, plen)) {
727 			pr_err("aesgcm_decrypt() #2 failed on vector %d\n", i);
728 			return -ENODEV;
729 		}
730 	}
731 	return 0;
732 }
733 module_init(libaesgcm_init);
734 
libaesgcm_exit(void)735 static void __exit libaesgcm_exit(void)
736 {
737 }
738 module_exit(libaesgcm_exit);
739 #endif
740