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