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