checkstack: fix printed address
[platform/kernel/linux-starfive.git] / lib / crypto / aesgcm.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Minimal library implementation of GCM
4  *
5  * Copyright 2022 Google LLC
6  */
7
8 #include <linux/module.h>
9
10 #include <crypto/algapi.h>
11 #include <crypto/gcm.h>
12 #include <crypto/ghash.h>
13
14 #include <asm/irqflags.h>
15
16 static void aesgcm_encrypt_block(const struct crypto_aes_ctx *ctx, void *dst,
17                                  const void *src)
18 {
19         unsigned long flags;
20
21         /*
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.
28          */
29         local_irq_save(flags);
30         aes_encrypt(ctx, dst, src);
31         local_irq_restore(flags);
32 }
33
34 /**
35  * aesgcm_expandkey - Expands the AES and GHASH keys for the AES-GCM key
36  *                    schedule
37  *
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
42  *
43  * Returns: 0 on success, or -EINVAL if @keysize or @authsize contain values
44  * that are not permitted by the GCM specification.
45  */
46 int aesgcm_expandkey(struct aesgcm_ctx *ctx, const u8 *key,
47                      unsigned int keysize, unsigned int authsize)
48 {
49         u8 kin[AES_BLOCK_SIZE] = {};
50         int ret;
51
52         ret = crypto_gcm_check_authsize(authsize) ?:
53               aes_expandkey(&ctx->aes_ctx, key, keysize);
54         if (ret)
55                 return ret;
56
57         ctx->authsize = authsize;
58         aesgcm_encrypt_block(&ctx->aes_ctx, &ctx->ghash_key, kin);
59
60         return 0;
61 }
62 EXPORT_SYMBOL(aesgcm_expandkey);
63
64 static void aesgcm_ghash(be128 *ghash, const be128 *key, const void *src,
65                          int len)
66 {
67         while (len > 0) {
68                 crypto_xor((u8 *)ghash, src, min(len, GHASH_BLOCK_SIZE));
69                 gf128mul_lle(ghash, key);
70
71                 src += GHASH_BLOCK_SIZE;
72                 len -= GHASH_BLOCK_SIZE;
73         }
74 }
75
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)
78 {
79         be128 tail = { cpu_to_be64(assoc_len * 8), cpu_to_be64(src_len * 8) };
80         u8 buf[AES_BLOCK_SIZE];
81         be128 ghash = {};
82
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));
86
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);
90
91         memzero_explicit(&ghash, sizeof(ghash));
92         memzero_explicit(buf, sizeof(buf));
93 }
94
95 static void aesgcm_crypt(const struct aesgcm_ctx *ctx, u8 *dst, const u8 *src,
96                          int len, __be32 *ctr)
97 {
98         u8 buf[AES_BLOCK_SIZE];
99         unsigned int n = 2;
100
101         while (len > 0) {
102                 /*
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.
108                  */
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));
112
113                 dst += AES_BLOCK_SIZE;
114                 src += AES_BLOCK_SIZE;
115                 len -= AES_BLOCK_SIZE;
116         }
117         memzero_explicit(buf, sizeof(buf));
118 }
119
120 /**
121  * aesgcm_encrypt - Perform AES-GCM encryption on a block of data
122  *
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.
134  */
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)
138 {
139         __be32 ctr[4];
140
141         memcpy(ctr, iv, GCM_AES_IV_SIZE);
142
143         aesgcm_crypt(ctx, dst, src, crypt_len, ctr);
144         aesgcm_mac(ctx, dst, crypt_len, assoc, assoc_len, ctr, authtag);
145 }
146 EXPORT_SYMBOL(aesgcm_encrypt);
147
148 /**
149  * aesgcm_decrypt - Perform AES-GCM decryption on a block of data
150  *
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
160  *              tag is stored.
161  *
162  * Returns: true on success, or false if the ciphertext failed authentication.
163  * On failure, no plaintext will be returned.
164  */
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],
168                                  const u8 *authtag)
169 {
170         u8 tagbuf[AES_BLOCK_SIZE];
171         __be32 ctr[4];
172
173         memcpy(ctr, iv, GCM_AES_IV_SIZE);
174
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));
178                 return false;
179         }
180         aesgcm_crypt(ctx, dst, src, crypt_len, ctr);
181         return true;
182 }
183 EXPORT_SYMBOL(aesgcm_decrypt);
184
185 MODULE_DESCRIPTION("Generic AES-GCM library");
186 MODULE_AUTHOR("Ard Biesheuvel <ardb@kernel.org>");
187 MODULE_LICENSE("GPL");
188
189 #ifndef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS
190
191 /*
192  * Test code below. Vectors taken from crypto/testmgr.h
193  */
194
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";
198
199 static const u8 __initconst ptext1[16];
200
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";
206
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";
216
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";
228
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"
237         "\xba\x63\x7b\x39";
238
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"
247         "\x3d\x58\xe0\x91"
248         "\x5b\xc9\x4f\xbc\x32\x21\xa5\xdb"
249         "\x94\xfa\xe9\x5a\xe7\x12\x1a\x47";
250
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";
254
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";
260
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";
270
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";
282
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";
286
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";
292
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";
302
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";
314
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"
323         "\xba\x63\x7b\x39";
324
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"
333         "\xbc\xc9\xf6\x62"
334         "\x76\xfc\x6e\xce\x0f\x4e\x17\x68"
335         "\xcd\xdf\x88\x53\xbb\x2d\x55\x1b";
336
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"
345         "\xba\x63\x7b\x39";
346
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"
355         "\xcc\xda\x27\x10"
356         "\x25\x19\x49\x8e\x80\xf1\x47\x8f"
357         "\x37\xba\x55\xbd\x6d\x27\x61\x8c";
358
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";
450
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";
544
545 static struct {
546         const u8        *ptext;
547         const u8        *ctext;
548
549         u8              key[AES_MAX_KEY_SIZE];
550         u8              iv[GCM_AES_IV_SIZE];
551         u8              assoc[20];
552
553         int             klen;
554         int             clen;
555         int             plen;
556         int             alen;
557 } const aesgcm_tv[] __initconst = {
558         { /* From McGrew & Viega - http://citeseer.ist.psu.edu/656989.html */
559                 .klen   = 16,
560                 .ctext  = ctext0,
561                 .clen   = sizeof(ctext0),
562         }, {
563                 .klen   = 16,
564                 .ptext  = ptext1,
565                 .plen   = sizeof(ptext1),
566                 .ctext  = ctext1,
567                 .clen   = sizeof(ctext1),
568         }, {
569                 .key    = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
570                           "\x6d\x6a\x8f\x94\x67\x30\x83\x08",
571                 .klen   = 16,
572                 .iv     = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
573                           "\xde\xca\xf8\x88",
574                 .ptext  = ptext2,
575                 .plen   = sizeof(ptext2),
576                 .ctext  = ctext2,
577                 .clen   = sizeof(ctext2),
578         }, {
579                 .key    = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
580                           "\x6d\x6a\x8f\x94\x67\x30\x83\x08",
581                 .klen   = 16,
582                 .iv     = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
583                           "\xde\xca\xf8\x88",
584                 .ptext  = ptext3,
585                 .plen   = sizeof(ptext3),
586                 .assoc  = "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
587                           "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
588                           "\xab\xad\xda\xd2",
589                 .alen   = 20,
590                 .ctext  = ctext3,
591                 .clen   = sizeof(ctext3),
592         }, {
593                 .klen   = 24,
594                 .ctext  = ctext4,
595                 .clen   = sizeof(ctext4),
596         }, {
597                 .klen   = 24,
598                 .ptext  = ptext1,
599                 .plen   = sizeof(ptext1),
600                 .ctext  = ctext5,
601                 .clen   = sizeof(ctext5),
602         }, {
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",
606                 .klen   = 24,
607                 .iv     = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
608                           "\xde\xca\xf8\x88",
609                 .ptext  = ptext6,
610                 .plen   = sizeof(ptext6),
611                 .ctext  = ctext6,
612                 .clen   = sizeof(ctext6),
613         }, {
614                 .klen   = 32,
615                 .ctext  = ctext7,
616                 .clen   = sizeof(ctext7),
617         }, {
618                 .klen   = 32,
619                 .ptext  = ptext1,
620                 .plen   = sizeof(ptext1),
621                 .ctext  = ctext8,
622                 .clen   = sizeof(ctext8),
623         }, {
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",
628                 .klen   = 32,
629                 .iv     = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
630                           "\xde\xca\xf8\x88",
631                 .ptext  = ptext9,
632                 .plen   = sizeof(ptext9),
633                 .ctext  = ctext9,
634                 .clen   = sizeof(ctext9),
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  = ptext10,
644                 .plen   = sizeof(ptext10),
645                 .assoc  = "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
646                           "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
647                           "\xab\xad\xda\xd2",
648                 .alen   = 20,
649                 .ctext  = ctext10,
650                 .clen   = sizeof(ctext10),
651         }, {
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",
655                 .klen   = 24,
656                 .iv     = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
657                           "\xde\xca\xf8\x88",
658                 .ptext  = ptext11,
659                 .plen   = sizeof(ptext11),
660                 .assoc  = "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
661                           "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
662                           "\xab\xad\xda\xd2",
663                 .alen   = 20,
664                 .ctext  = ctext11,
665                 .clen   = sizeof(ctext11),
666         }, {
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",
671                 .klen   = 32,
672                 .iv     = "\x00\xff\xff\xff\xff\x00\x00\xff"
673                           "\xff\xff\x00\xff",
674                 .ptext  = ptext12,
675                 .plen   = sizeof(ptext12),
676                 .ctext  = ctext12,
677                 .clen   = sizeof(ctext12),
678         }
679 };
680
681 static int __init libaesgcm_init(void)
682 {
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)];
688
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);
692                         return -ENODEV;
693                 }
694
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);
700                         return -ENODEV;
701                 }
702
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);
708                         return -ENODEV;
709                 }
710
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);
716                         return -ENODEV;
717                 }
718         }
719         return 0;
720 }
721 module_init(libaesgcm_init);
722
723 static void __exit libaesgcm_exit(void)
724 {
725 }
726 module_exit(libaesgcm_exit);
727 #endif