]> asedeno.scripts.mit.edu Git - linux.git/blob - crypto/testmgr.c
crypto: testmgr - reorder paes test lexicographically
[linux.git] / crypto / testmgr.c
1 /*
2  * Algorithm testing framework and tests.
3  *
4  * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
5  * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
6  * Copyright (c) 2007 Nokia Siemens Networks
7  * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
8  *
9  * Updated RFC4106 AES-GCM testing.
10  *    Authors: Aidan O'Mahony (aidan.o.mahony@intel.com)
11  *             Adrian Hoban <adrian.hoban@intel.com>
12  *             Gabriele Paoloni <gabriele.paoloni@intel.com>
13  *             Tadeusz Struk (tadeusz.struk@intel.com)
14  *    Copyright (c) 2010, Intel Corporation.
15  *
16  * This program is free software; you can redistribute it and/or modify it
17  * under the terms of the GNU General Public License as published by the Free
18  * Software Foundation; either version 2 of the License, or (at your option)
19  * any later version.
20  *
21  */
22
23 #include <crypto/aead.h>
24 #include <crypto/hash.h>
25 #include <crypto/skcipher.h>
26 #include <linux/err.h>
27 #include <linux/fips.h>
28 #include <linux/module.h>
29 #include <linux/scatterlist.h>
30 #include <linux/slab.h>
31 #include <linux/string.h>
32 #include <crypto/rng.h>
33 #include <crypto/drbg.h>
34 #include <crypto/akcipher.h>
35 #include <crypto/kpp.h>
36 #include <crypto/acompress.h>
37
38 #include "internal.h"
39
40 static bool notests;
41 module_param(notests, bool, 0644);
42 MODULE_PARM_DESC(notests, "disable crypto self-tests");
43
44 #ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS
45
46 /* a perfect nop */
47 int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
48 {
49         return 0;
50 }
51
52 #else
53
54 #include "testmgr.h"
55
56 /*
57  * Need slab memory for testing (size in number of pages).
58  */
59 #define XBUFSIZE        8
60
61 /*
62  * Indexes into the xbuf to simulate cross-page access.
63  */
64 #define IDX1            32
65 #define IDX2            32400
66 #define IDX3            1511
67 #define IDX4            8193
68 #define IDX5            22222
69 #define IDX6            17101
70 #define IDX7            27333
71 #define IDX8            3000
72
73 /*
74 * Used by test_cipher()
75 */
76 #define ENCRYPT 1
77 #define DECRYPT 0
78
79 struct aead_test_suite {
80         struct {
81                 const struct aead_testvec *vecs;
82                 unsigned int count;
83         } enc, dec;
84 };
85
86 struct cipher_test_suite {
87         struct {
88                 const struct cipher_testvec *vecs;
89                 unsigned int count;
90         } enc, dec;
91 };
92
93 struct comp_test_suite {
94         struct {
95                 const struct comp_testvec *vecs;
96                 unsigned int count;
97         } comp, decomp;
98 };
99
100 struct hash_test_suite {
101         const struct hash_testvec *vecs;
102         unsigned int count;
103 };
104
105 struct cprng_test_suite {
106         const struct cprng_testvec *vecs;
107         unsigned int count;
108 };
109
110 struct drbg_test_suite {
111         const struct drbg_testvec *vecs;
112         unsigned int count;
113 };
114
115 struct akcipher_test_suite {
116         const struct akcipher_testvec *vecs;
117         unsigned int count;
118 };
119
120 struct kpp_test_suite {
121         const struct kpp_testvec *vecs;
122         unsigned int count;
123 };
124
125 struct alg_test_desc {
126         const char *alg;
127         int (*test)(const struct alg_test_desc *desc, const char *driver,
128                     u32 type, u32 mask);
129         int fips_allowed;       /* set if alg is allowed in fips mode */
130
131         union {
132                 struct aead_test_suite aead;
133                 struct cipher_test_suite cipher;
134                 struct comp_test_suite comp;
135                 struct hash_test_suite hash;
136                 struct cprng_test_suite cprng;
137                 struct drbg_test_suite drbg;
138                 struct akcipher_test_suite akcipher;
139                 struct kpp_test_suite kpp;
140         } suite;
141 };
142
143 static const unsigned int IDX[8] = {
144         IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
145
146 static void hexdump(unsigned char *buf, unsigned int len)
147 {
148         print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
149                         16, 1,
150                         buf, len, false);
151 }
152
153 static int testmgr_alloc_buf(char *buf[XBUFSIZE])
154 {
155         int i;
156
157         for (i = 0; i < XBUFSIZE; i++) {
158                 buf[i] = (void *)__get_free_page(GFP_KERNEL);
159                 if (!buf[i])
160                         goto err_free_buf;
161         }
162
163         return 0;
164
165 err_free_buf:
166         while (i-- > 0)
167                 free_page((unsigned long)buf[i]);
168
169         return -ENOMEM;
170 }
171
172 static void testmgr_free_buf(char *buf[XBUFSIZE])
173 {
174         int i;
175
176         for (i = 0; i < XBUFSIZE; i++)
177                 free_page((unsigned long)buf[i]);
178 }
179
180 static int ahash_guard_result(char *result, char c, int size)
181 {
182         int i;
183
184         for (i = 0; i < size; i++) {
185                 if (result[i] != c)
186                         return -EINVAL;
187         }
188
189         return 0;
190 }
191
192 static int ahash_partial_update(struct ahash_request **preq,
193         struct crypto_ahash *tfm, const struct hash_testvec *template,
194         void *hash_buff, int k, int temp, struct scatterlist *sg,
195         const char *algo, char *result, struct crypto_wait *wait)
196 {
197         char *state;
198         struct ahash_request *req;
199         int statesize, ret = -EINVAL;
200         static const unsigned char guard[] = { 0x00, 0xba, 0xad, 0x00 };
201         int digestsize = crypto_ahash_digestsize(tfm);
202
203         req = *preq;
204         statesize = crypto_ahash_statesize(
205                         crypto_ahash_reqtfm(req));
206         state = kmalloc(statesize + sizeof(guard), GFP_KERNEL);
207         if (!state) {
208                 pr_err("alg: hash: Failed to alloc state for %s\n", algo);
209                 goto out_nostate;
210         }
211         memcpy(state + statesize, guard, sizeof(guard));
212         memset(result, 1, digestsize);
213         ret = crypto_ahash_export(req, state);
214         WARN_ON(memcmp(state + statesize, guard, sizeof(guard)));
215         if (ret) {
216                 pr_err("alg: hash: Failed to export() for %s\n", algo);
217                 goto out;
218         }
219         ret = ahash_guard_result(result, 1, digestsize);
220         if (ret) {
221                 pr_err("alg: hash: Failed, export used req->result for %s\n",
222                        algo);
223                 goto out;
224         }
225         ahash_request_free(req);
226         req = ahash_request_alloc(tfm, GFP_KERNEL);
227         if (!req) {
228                 pr_err("alg: hash: Failed to alloc request for %s\n", algo);
229                 goto out_noreq;
230         }
231         ahash_request_set_callback(req,
232                 CRYPTO_TFM_REQ_MAY_BACKLOG,
233                 crypto_req_done, wait);
234
235         memcpy(hash_buff, template->plaintext + temp,
236                 template->tap[k]);
237         sg_init_one(&sg[0], hash_buff, template->tap[k]);
238         ahash_request_set_crypt(req, sg, result, template->tap[k]);
239         ret = crypto_ahash_import(req, state);
240         if (ret) {
241                 pr_err("alg: hash: Failed to import() for %s\n", algo);
242                 goto out;
243         }
244         ret = ahash_guard_result(result, 1, digestsize);
245         if (ret) {
246                 pr_err("alg: hash: Failed, import used req->result for %s\n",
247                        algo);
248                 goto out;
249         }
250         ret = crypto_wait_req(crypto_ahash_update(req), wait);
251         if (ret)
252                 goto out;
253         *preq = req;
254         ret = 0;
255         goto out_noreq;
256 out:
257         ahash_request_free(req);
258 out_noreq:
259         kfree(state);
260 out_nostate:
261         return ret;
262 }
263
264 static int __test_hash(struct crypto_ahash *tfm,
265                        const struct hash_testvec *template, unsigned int tcount,
266                        bool use_digest, const int align_offset)
267 {
268         const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
269         size_t digest_size = crypto_ahash_digestsize(tfm);
270         unsigned int i, j, k, temp;
271         struct scatterlist sg[8];
272         char *result;
273         char *key;
274         struct ahash_request *req;
275         struct crypto_wait wait;
276         void *hash_buff;
277         char *xbuf[XBUFSIZE];
278         int ret = -ENOMEM;
279
280         result = kmalloc(digest_size, GFP_KERNEL);
281         if (!result)
282                 return ret;
283         key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
284         if (!key)
285                 goto out_nobuf;
286         if (testmgr_alloc_buf(xbuf))
287                 goto out_nobuf;
288
289         crypto_init_wait(&wait);
290
291         req = ahash_request_alloc(tfm, GFP_KERNEL);
292         if (!req) {
293                 printk(KERN_ERR "alg: hash: Failed to allocate request for "
294                        "%s\n", algo);
295                 goto out_noreq;
296         }
297         ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
298                                    crypto_req_done, &wait);
299
300         j = 0;
301         for (i = 0; i < tcount; i++) {
302                 if (template[i].np)
303                         continue;
304
305                 ret = -EINVAL;
306                 if (WARN_ON(align_offset + template[i].psize > PAGE_SIZE))
307                         goto out;
308
309                 j++;
310                 memset(result, 0, digest_size);
311
312                 hash_buff = xbuf[0];
313                 hash_buff += align_offset;
314
315                 memcpy(hash_buff, template[i].plaintext, template[i].psize);
316                 sg_init_one(&sg[0], hash_buff, template[i].psize);
317
318                 if (template[i].ksize) {
319                         crypto_ahash_clear_flags(tfm, ~0);
320                         if (template[i].ksize > MAX_KEYLEN) {
321                                 pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
322                                        j, algo, template[i].ksize, MAX_KEYLEN);
323                                 ret = -EINVAL;
324                                 goto out;
325                         }
326                         memcpy(key, template[i].key, template[i].ksize);
327                         ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
328                         if (ret) {
329                                 printk(KERN_ERR "alg: hash: setkey failed on "
330                                        "test %d for %s: ret=%d\n", j, algo,
331                                        -ret);
332                                 goto out;
333                         }
334                 }
335
336                 ahash_request_set_crypt(req, sg, result, template[i].psize);
337                 if (use_digest) {
338                         ret = crypto_wait_req(crypto_ahash_digest(req), &wait);
339                         if (ret) {
340                                 pr_err("alg: hash: digest failed on test %d "
341                                        "for %s: ret=%d\n", j, algo, -ret);
342                                 goto out;
343                         }
344                 } else {
345                         memset(result, 1, digest_size);
346                         ret = crypto_wait_req(crypto_ahash_init(req), &wait);
347                         if (ret) {
348                                 pr_err("alg: hash: init failed on test %d "
349                                        "for %s: ret=%d\n", j, algo, -ret);
350                                 goto out;
351                         }
352                         ret = ahash_guard_result(result, 1, digest_size);
353                         if (ret) {
354                                 pr_err("alg: hash: init failed on test %d "
355                                        "for %s: used req->result\n", j, algo);
356                                 goto out;
357                         }
358                         ret = crypto_wait_req(crypto_ahash_update(req), &wait);
359                         if (ret) {
360                                 pr_err("alg: hash: update failed on test %d "
361                                        "for %s: ret=%d\n", j, algo, -ret);
362                                 goto out;
363                         }
364                         ret = ahash_guard_result(result, 1, digest_size);
365                         if (ret) {
366                                 pr_err("alg: hash: update failed on test %d "
367                                        "for %s: used req->result\n", j, algo);
368                                 goto out;
369                         }
370                         ret = crypto_wait_req(crypto_ahash_final(req), &wait);
371                         if (ret) {
372                                 pr_err("alg: hash: final failed on test %d "
373                                        "for %s: ret=%d\n", j, algo, -ret);
374                                 goto out;
375                         }
376                 }
377
378                 if (memcmp(result, template[i].digest,
379                            crypto_ahash_digestsize(tfm))) {
380                         printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
381                                j, algo);
382                         hexdump(result, crypto_ahash_digestsize(tfm));
383                         ret = -EINVAL;
384                         goto out;
385                 }
386         }
387
388         j = 0;
389         for (i = 0; i < tcount; i++) {
390                 /* alignment tests are only done with continuous buffers */
391                 if (align_offset != 0)
392                         break;
393
394                 if (!template[i].np)
395                         continue;
396
397                 j++;
398                 memset(result, 0, digest_size);
399
400                 temp = 0;
401                 sg_init_table(sg, template[i].np);
402                 ret = -EINVAL;
403                 for (k = 0; k < template[i].np; k++) {
404                         if (WARN_ON(offset_in_page(IDX[k]) +
405                                     template[i].tap[k] > PAGE_SIZE))
406                                 goto out;
407                         sg_set_buf(&sg[k],
408                                    memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
409                                           offset_in_page(IDX[k]),
410                                           template[i].plaintext + temp,
411                                           template[i].tap[k]),
412                                    template[i].tap[k]);
413                         temp += template[i].tap[k];
414                 }
415
416                 if (template[i].ksize) {
417                         if (template[i].ksize > MAX_KEYLEN) {
418                                 pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
419                                        j, algo, template[i].ksize, MAX_KEYLEN);
420                                 ret = -EINVAL;
421                                 goto out;
422                         }
423                         crypto_ahash_clear_flags(tfm, ~0);
424                         memcpy(key, template[i].key, template[i].ksize);
425                         ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
426
427                         if (ret) {
428                                 printk(KERN_ERR "alg: hash: setkey "
429                                        "failed on chunking test %d "
430                                        "for %s: ret=%d\n", j, algo, -ret);
431                                 goto out;
432                         }
433                 }
434
435                 ahash_request_set_crypt(req, sg, result, template[i].psize);
436                 ret = crypto_wait_req(crypto_ahash_digest(req), &wait);
437                 if (ret) {
438                         pr_err("alg: hash: digest failed on chunking test %d for %s: ret=%d\n",
439                                j, algo, -ret);
440                         goto out;
441                 }
442
443                 if (memcmp(result, template[i].digest,
444                            crypto_ahash_digestsize(tfm))) {
445                         printk(KERN_ERR "alg: hash: Chunking test %d "
446                                "failed for %s\n", j, algo);
447                         hexdump(result, crypto_ahash_digestsize(tfm));
448                         ret = -EINVAL;
449                         goto out;
450                 }
451         }
452
453         /* partial update exercise */
454         j = 0;
455         for (i = 0; i < tcount; i++) {
456                 /* alignment tests are only done with continuous buffers */
457                 if (align_offset != 0)
458                         break;
459
460                 if (template[i].np < 2)
461                         continue;
462
463                 j++;
464                 memset(result, 0, digest_size);
465
466                 ret = -EINVAL;
467                 hash_buff = xbuf[0];
468                 memcpy(hash_buff, template[i].plaintext,
469                         template[i].tap[0]);
470                 sg_init_one(&sg[0], hash_buff, template[i].tap[0]);
471
472                 if (template[i].ksize) {
473                         crypto_ahash_clear_flags(tfm, ~0);
474                         if (template[i].ksize > MAX_KEYLEN) {
475                                 pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
476                                         j, algo, template[i].ksize, MAX_KEYLEN);
477                                 ret = -EINVAL;
478                                 goto out;
479                         }
480                         memcpy(key, template[i].key, template[i].ksize);
481                         ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
482                         if (ret) {
483                                 pr_err("alg: hash: setkey failed on test %d for %s: ret=%d\n",
484                                         j, algo, -ret);
485                                 goto out;
486                         }
487                 }
488
489                 ahash_request_set_crypt(req, sg, result, template[i].tap[0]);
490                 ret = crypto_wait_req(crypto_ahash_init(req), &wait);
491                 if (ret) {
492                         pr_err("alg: hash: init failed on test %d for %s: ret=%d\n",
493                                 j, algo, -ret);
494                         goto out;
495                 }
496                 ret = crypto_wait_req(crypto_ahash_update(req), &wait);
497                 if (ret) {
498                         pr_err("alg: hash: update failed on test %d for %s: ret=%d\n",
499                                 j, algo, -ret);
500                         goto out;
501                 }
502
503                 temp = template[i].tap[0];
504                 for (k = 1; k < template[i].np; k++) {
505                         ret = ahash_partial_update(&req, tfm, &template[i],
506                                 hash_buff, k, temp, &sg[0], algo, result,
507                                 &wait);
508                         if (ret) {
509                                 pr_err("alg: hash: partial update failed on test %d for %s: ret=%d\n",
510                                         j, algo, -ret);
511                                 goto out_noreq;
512                         }
513                         temp += template[i].tap[k];
514                 }
515                 ret = crypto_wait_req(crypto_ahash_final(req), &wait);
516                 if (ret) {
517                         pr_err("alg: hash: final failed on test %d for %s: ret=%d\n",
518                                 j, algo, -ret);
519                         goto out;
520                 }
521                 if (memcmp(result, template[i].digest,
522                            crypto_ahash_digestsize(tfm))) {
523                         pr_err("alg: hash: Partial Test %d failed for %s\n",
524                                j, algo);
525                         hexdump(result, crypto_ahash_digestsize(tfm));
526                         ret = -EINVAL;
527                         goto out;
528                 }
529         }
530
531         ret = 0;
532
533 out:
534         ahash_request_free(req);
535 out_noreq:
536         testmgr_free_buf(xbuf);
537 out_nobuf:
538         kfree(key);
539         kfree(result);
540         return ret;
541 }
542
543 static int test_hash(struct crypto_ahash *tfm,
544                      const struct hash_testvec *template,
545                      unsigned int tcount, bool use_digest)
546 {
547         unsigned int alignmask;
548         int ret;
549
550         ret = __test_hash(tfm, template, tcount, use_digest, 0);
551         if (ret)
552                 return ret;
553
554         /* test unaligned buffers, check with one byte offset */
555         ret = __test_hash(tfm, template, tcount, use_digest, 1);
556         if (ret)
557                 return ret;
558
559         alignmask = crypto_tfm_alg_alignmask(&tfm->base);
560         if (alignmask) {
561                 /* Check if alignment mask for tfm is correctly set. */
562                 ret = __test_hash(tfm, template, tcount, use_digest,
563                                   alignmask + 1);
564                 if (ret)
565                         return ret;
566         }
567
568         return 0;
569 }
570
571 static int __test_aead(struct crypto_aead *tfm, int enc,
572                        const struct aead_testvec *template, unsigned int tcount,
573                        const bool diff_dst, const int align_offset)
574 {
575         const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
576         unsigned int i, j, k, n, temp;
577         int ret = -ENOMEM;
578         char *q;
579         char *key;
580         struct aead_request *req;
581         struct scatterlist *sg;
582         struct scatterlist *sgout;
583         const char *e, *d;
584         struct crypto_wait wait;
585         unsigned int authsize, iv_len;
586         void *input;
587         void *output;
588         void *assoc;
589         char *iv;
590         char *xbuf[XBUFSIZE];
591         char *xoutbuf[XBUFSIZE];
592         char *axbuf[XBUFSIZE];
593
594         iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
595         if (!iv)
596                 return ret;
597         key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
598         if (!key)
599                 goto out_noxbuf;
600         if (testmgr_alloc_buf(xbuf))
601                 goto out_noxbuf;
602         if (testmgr_alloc_buf(axbuf))
603                 goto out_noaxbuf;
604         if (diff_dst && testmgr_alloc_buf(xoutbuf))
605                 goto out_nooutbuf;
606
607         /* avoid "the frame size is larger than 1024 bytes" compiler warning */
608         sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 4 : 2), GFP_KERNEL);
609         if (!sg)
610                 goto out_nosg;
611         sgout = &sg[16];
612
613         if (diff_dst)
614                 d = "-ddst";
615         else
616                 d = "";
617
618         if (enc == ENCRYPT)
619                 e = "encryption";
620         else
621                 e = "decryption";
622
623         crypto_init_wait(&wait);
624
625         req = aead_request_alloc(tfm, GFP_KERNEL);
626         if (!req) {
627                 pr_err("alg: aead%s: Failed to allocate request for %s\n",
628                        d, algo);
629                 goto out;
630         }
631
632         aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
633                                   crypto_req_done, &wait);
634
635         iv_len = crypto_aead_ivsize(tfm);
636
637         for (i = 0, j = 0; i < tcount; i++) {
638                 if (template[i].np)
639                         continue;
640
641                 j++;
642
643                 /* some templates have no input data but they will
644                  * touch input
645                  */
646                 input = xbuf[0];
647                 input += align_offset;
648                 assoc = axbuf[0];
649
650                 ret = -EINVAL;
651                 if (WARN_ON(align_offset + template[i].ilen >
652                             PAGE_SIZE || template[i].alen > PAGE_SIZE))
653                         goto out;
654
655                 memcpy(input, template[i].input, template[i].ilen);
656                 memcpy(assoc, template[i].assoc, template[i].alen);
657                 if (template[i].iv)
658                         memcpy(iv, template[i].iv, iv_len);
659                 else
660                         memset(iv, 0, iv_len);
661
662                 crypto_aead_clear_flags(tfm, ~0);
663                 if (template[i].wk)
664                         crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
665
666                 if (template[i].klen > MAX_KEYLEN) {
667                         pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
668                                d, j, algo, template[i].klen,
669                                MAX_KEYLEN);
670                         ret = -EINVAL;
671                         goto out;
672                 }
673                 memcpy(key, template[i].key, template[i].klen);
674
675                 ret = crypto_aead_setkey(tfm, key, template[i].klen);
676                 if (template[i].fail == !ret) {
677                         pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n",
678                                d, j, algo, crypto_aead_get_flags(tfm));
679                         goto out;
680                 } else if (ret)
681                         continue;
682
683                 authsize = abs(template[i].rlen - template[i].ilen);
684                 ret = crypto_aead_setauthsize(tfm, authsize);
685                 if (ret) {
686                         pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n",
687                                d, authsize, j, algo);
688                         goto out;
689                 }
690
691                 k = !!template[i].alen;
692                 sg_init_table(sg, k + 1);
693                 sg_set_buf(&sg[0], assoc, template[i].alen);
694                 sg_set_buf(&sg[k], input,
695                            template[i].ilen + (enc ? authsize : 0));
696                 output = input;
697
698                 if (diff_dst) {
699                         sg_init_table(sgout, k + 1);
700                         sg_set_buf(&sgout[0], assoc, template[i].alen);
701
702                         output = xoutbuf[0];
703                         output += align_offset;
704                         sg_set_buf(&sgout[k], output,
705                                    template[i].rlen + (enc ? 0 : authsize));
706                 }
707
708                 aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
709                                        template[i].ilen, iv);
710
711                 aead_request_set_ad(req, template[i].alen);
712
713                 ret = crypto_wait_req(enc ? crypto_aead_encrypt(req)
714                                       : crypto_aead_decrypt(req), &wait);
715
716                 switch (ret) {
717                 case 0:
718                         if (template[i].novrfy) {
719                                 /* verification was supposed to fail */
720                                 pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n",
721                                        d, e, j, algo);
722                                 /* so really, we got a bad message */
723                                 ret = -EBADMSG;
724                                 goto out;
725                         }
726                         break;
727                 case -EBADMSG:
728                         if (template[i].novrfy)
729                                 /* verification failure was expected */
730                                 continue;
731                         /* fall through */
732                 default:
733                         pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n",
734                                d, e, j, algo, -ret);
735                         goto out;
736                 }
737
738                 q = output;
739                 if (memcmp(q, template[i].result, template[i].rlen)) {
740                         pr_err("alg: aead%s: Test %d failed on %s for %s\n",
741                                d, j, e, algo);
742                         hexdump(q, template[i].rlen);
743                         ret = -EINVAL;
744                         goto out;
745                 }
746         }
747
748         for (i = 0, j = 0; i < tcount; i++) {
749                 /* alignment tests are only done with continuous buffers */
750                 if (align_offset != 0)
751                         break;
752
753                 if (!template[i].np)
754                         continue;
755
756                 j++;
757
758                 if (template[i].iv)
759                         memcpy(iv, template[i].iv, iv_len);
760                 else
761                         memset(iv, 0, MAX_IVLEN);
762
763                 crypto_aead_clear_flags(tfm, ~0);
764                 if (template[i].wk)
765                         crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
766                 if (template[i].klen > MAX_KEYLEN) {
767                         pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
768                                d, j, algo, template[i].klen, MAX_KEYLEN);
769                         ret = -EINVAL;
770                         goto out;
771                 }
772                 memcpy(key, template[i].key, template[i].klen);
773
774                 ret = crypto_aead_setkey(tfm, key, template[i].klen);
775                 if (template[i].fail == !ret) {
776                         pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n",
777                                d, j, algo, crypto_aead_get_flags(tfm));
778                         goto out;
779                 } else if (ret)
780                         continue;
781
782                 authsize = abs(template[i].rlen - template[i].ilen);
783
784                 ret = -EINVAL;
785                 sg_init_table(sg, template[i].anp + template[i].np);
786                 if (diff_dst)
787                         sg_init_table(sgout, template[i].anp + template[i].np);
788
789                 ret = -EINVAL;
790                 for (k = 0, temp = 0; k < template[i].anp; k++) {
791                         if (WARN_ON(offset_in_page(IDX[k]) +
792                                     template[i].atap[k] > PAGE_SIZE))
793                                 goto out;
794                         sg_set_buf(&sg[k],
795                                    memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
796                                           offset_in_page(IDX[k]),
797                                           template[i].assoc + temp,
798                                           template[i].atap[k]),
799                                    template[i].atap[k]);
800                         if (diff_dst)
801                                 sg_set_buf(&sgout[k],
802                                            axbuf[IDX[k] >> PAGE_SHIFT] +
803                                            offset_in_page(IDX[k]),
804                                            template[i].atap[k]);
805                         temp += template[i].atap[k];
806                 }
807
808                 for (k = 0, temp = 0; k < template[i].np; k++) {
809                         if (WARN_ON(offset_in_page(IDX[k]) +
810                                     template[i].tap[k] > PAGE_SIZE))
811                                 goto out;
812
813                         q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
814                         memcpy(q, template[i].input + temp, template[i].tap[k]);
815                         sg_set_buf(&sg[template[i].anp + k],
816                                    q, template[i].tap[k]);
817
818                         if (diff_dst) {
819                                 q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
820                                     offset_in_page(IDX[k]);
821
822                                 memset(q, 0, template[i].tap[k]);
823
824                                 sg_set_buf(&sgout[template[i].anp + k],
825                                            q, template[i].tap[k]);
826                         }
827
828                         n = template[i].tap[k];
829                         if (k == template[i].np - 1 && enc)
830                                 n += authsize;
831                         if (offset_in_page(q) + n < PAGE_SIZE)
832                                 q[n] = 0;
833
834                         temp += template[i].tap[k];
835                 }
836
837                 ret = crypto_aead_setauthsize(tfm, authsize);
838                 if (ret) {
839                         pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n",
840                                d, authsize, j, algo);
841                         goto out;
842                 }
843
844                 if (enc) {
845                         if (WARN_ON(sg[template[i].anp + k - 1].offset +
846                                     sg[template[i].anp + k - 1].length +
847                                     authsize > PAGE_SIZE)) {
848                                 ret = -EINVAL;
849                                 goto out;
850                         }
851
852                         if (diff_dst)
853                                 sgout[template[i].anp + k - 1].length +=
854                                         authsize;
855                         sg[template[i].anp + k - 1].length += authsize;
856                 }
857
858                 aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
859                                        template[i].ilen,
860                                        iv);
861
862                 aead_request_set_ad(req, template[i].alen);
863
864                 ret = crypto_wait_req(enc ? crypto_aead_encrypt(req)
865                                       : crypto_aead_decrypt(req), &wait);
866
867                 switch (ret) {
868                 case 0:
869                         if (template[i].novrfy) {
870                                 /* verification was supposed to fail */
871                                 pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n",
872                                        d, e, j, algo);
873                                 /* so really, we got a bad message */
874                                 ret = -EBADMSG;
875                                 goto out;
876                         }
877                         break;
878                 case -EBADMSG:
879                         if (template[i].novrfy)
880                                 /* verification failure was expected */
881                                 continue;
882                         /* fall through */
883                 default:
884                         pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n",
885                                d, e, j, algo, -ret);
886                         goto out;
887                 }
888
889                 ret = -EINVAL;
890                 for (k = 0, temp = 0; k < template[i].np; k++) {
891                         if (diff_dst)
892                                 q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
893                                     offset_in_page(IDX[k]);
894                         else
895                                 q = xbuf[IDX[k] >> PAGE_SHIFT] +
896                                     offset_in_page(IDX[k]);
897
898                         n = template[i].tap[k];
899                         if (k == template[i].np - 1)
900                                 n += enc ? authsize : -authsize;
901
902                         if (memcmp(q, template[i].result + temp, n)) {
903                                 pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n",
904                                        d, j, e, k, algo);
905                                 hexdump(q, n);
906                                 goto out;
907                         }
908
909                         q += n;
910                         if (k == template[i].np - 1 && !enc) {
911                                 if (!diff_dst &&
912                                         memcmp(q, template[i].input +
913                                               temp + n, authsize))
914                                         n = authsize;
915                                 else
916                                         n = 0;
917                         } else {
918                                 for (n = 0; offset_in_page(q + n) && q[n]; n++)
919                                         ;
920                         }
921                         if (n) {
922                                 pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
923                                        d, j, e, k, algo, n);
924                                 hexdump(q, n);
925                                 goto out;
926                         }
927
928                         temp += template[i].tap[k];
929                 }
930         }
931
932         ret = 0;
933
934 out:
935         aead_request_free(req);
936         kfree(sg);
937 out_nosg:
938         if (diff_dst)
939                 testmgr_free_buf(xoutbuf);
940 out_nooutbuf:
941         testmgr_free_buf(axbuf);
942 out_noaxbuf:
943         testmgr_free_buf(xbuf);
944 out_noxbuf:
945         kfree(key);
946         kfree(iv);
947         return ret;
948 }
949
950 static int test_aead(struct crypto_aead *tfm, int enc,
951                      const struct aead_testvec *template, unsigned int tcount)
952 {
953         unsigned int alignmask;
954         int ret;
955
956         /* test 'dst == src' case */
957         ret = __test_aead(tfm, enc, template, tcount, false, 0);
958         if (ret)
959                 return ret;
960
961         /* test 'dst != src' case */
962         ret = __test_aead(tfm, enc, template, tcount, true, 0);
963         if (ret)
964                 return ret;
965
966         /* test unaligned buffers, check with one byte offset */
967         ret = __test_aead(tfm, enc, template, tcount, true, 1);
968         if (ret)
969                 return ret;
970
971         alignmask = crypto_tfm_alg_alignmask(&tfm->base);
972         if (alignmask) {
973                 /* Check if alignment mask for tfm is correctly set. */
974                 ret = __test_aead(tfm, enc, template, tcount, true,
975                                   alignmask + 1);
976                 if (ret)
977                         return ret;
978         }
979
980         return 0;
981 }
982
983 static int test_cipher(struct crypto_cipher *tfm, int enc,
984                        const struct cipher_testvec *template,
985                        unsigned int tcount)
986 {
987         const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm));
988         unsigned int i, j, k;
989         char *q;
990         const char *e;
991         void *data;
992         char *xbuf[XBUFSIZE];
993         int ret = -ENOMEM;
994
995         if (testmgr_alloc_buf(xbuf))
996                 goto out_nobuf;
997
998         if (enc == ENCRYPT)
999                 e = "encryption";
1000         else
1001                 e = "decryption";
1002
1003         j = 0;
1004         for (i = 0; i < tcount; i++) {
1005                 if (template[i].np)
1006                         continue;
1007
1008                 if (fips_enabled && template[i].fips_skip)
1009                         continue;
1010
1011                 j++;
1012
1013                 ret = -EINVAL;
1014                 if (WARN_ON(template[i].ilen > PAGE_SIZE))
1015                         goto out;
1016
1017                 data = xbuf[0];
1018                 memcpy(data, template[i].input, template[i].ilen);
1019
1020                 crypto_cipher_clear_flags(tfm, ~0);
1021                 if (template[i].wk)
1022                         crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
1023
1024                 ret = crypto_cipher_setkey(tfm, template[i].key,
1025                                            template[i].klen);
1026                 if (template[i].fail == !ret) {
1027                         printk(KERN_ERR "alg: cipher: setkey failed "
1028                                "on test %d for %s: flags=%x\n", j,
1029                                algo, crypto_cipher_get_flags(tfm));
1030                         goto out;
1031                 } else if (ret)
1032                         continue;
1033
1034                 for (k = 0; k < template[i].ilen;
1035                      k += crypto_cipher_blocksize(tfm)) {
1036                         if (enc)
1037                                 crypto_cipher_encrypt_one(tfm, data + k,
1038                                                           data + k);
1039                         else
1040                                 crypto_cipher_decrypt_one(tfm, data + k,
1041                                                           data + k);
1042                 }
1043
1044                 q = data;
1045                 if (memcmp(q, template[i].result, template[i].rlen)) {
1046                         printk(KERN_ERR "alg: cipher: Test %d failed "
1047                                "on %s for %s\n", j, e, algo);
1048                         hexdump(q, template[i].rlen);
1049                         ret = -EINVAL;
1050                         goto out;
1051                 }
1052         }
1053
1054         ret = 0;
1055
1056 out:
1057         testmgr_free_buf(xbuf);
1058 out_nobuf:
1059         return ret;
1060 }
1061
1062 static int __test_skcipher(struct crypto_skcipher *tfm, int enc,
1063                            const struct cipher_testvec *template,
1064                            unsigned int tcount,
1065                            const bool diff_dst, const int align_offset)
1066 {
1067         const char *algo =
1068                 crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm));
1069         unsigned int i, j, k, n, temp;
1070         char *q;
1071         struct skcipher_request *req;
1072         struct scatterlist sg[8];
1073         struct scatterlist sgout[8];
1074         const char *e, *d;
1075         struct crypto_wait wait;
1076         void *data;
1077         char iv[MAX_IVLEN];
1078         char *xbuf[XBUFSIZE];
1079         char *xoutbuf[XBUFSIZE];
1080         int ret = -ENOMEM;
1081         unsigned int ivsize = crypto_skcipher_ivsize(tfm);
1082
1083         if (testmgr_alloc_buf(xbuf))
1084                 goto out_nobuf;
1085
1086         if (diff_dst && testmgr_alloc_buf(xoutbuf))
1087                 goto out_nooutbuf;
1088
1089         if (diff_dst)
1090                 d = "-ddst";
1091         else
1092                 d = "";
1093
1094         if (enc == ENCRYPT)
1095                 e = "encryption";
1096         else
1097                 e = "decryption";
1098
1099         crypto_init_wait(&wait);
1100
1101         req = skcipher_request_alloc(tfm, GFP_KERNEL);
1102         if (!req) {
1103                 pr_err("alg: skcipher%s: Failed to allocate request for %s\n",
1104                        d, algo);
1105                 goto out;
1106         }
1107
1108         skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1109                                       crypto_req_done, &wait);
1110
1111         j = 0;
1112         for (i = 0; i < tcount; i++) {
1113                 if (template[i].np && !template[i].also_non_np)
1114                         continue;
1115
1116                 if (fips_enabled && template[i].fips_skip)
1117                         continue;
1118
1119                 if (template[i].iv)
1120                         memcpy(iv, template[i].iv, ivsize);
1121                 else
1122                         memset(iv, 0, MAX_IVLEN);
1123
1124                 j++;
1125                 ret = -EINVAL;
1126                 if (WARN_ON(align_offset + template[i].ilen > PAGE_SIZE))
1127                         goto out;
1128
1129                 data = xbuf[0];
1130                 data += align_offset;
1131                 memcpy(data, template[i].input, template[i].ilen);
1132
1133                 crypto_skcipher_clear_flags(tfm, ~0);
1134                 if (template[i].wk)
1135                         crypto_skcipher_set_flags(tfm,
1136                                                   CRYPTO_TFM_REQ_WEAK_KEY);
1137
1138                 ret = crypto_skcipher_setkey(tfm, template[i].key,
1139                                              template[i].klen);
1140                 if (template[i].fail == !ret) {
1141                         pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n",
1142                                d, j, algo, crypto_skcipher_get_flags(tfm));
1143                         goto out;
1144                 } else if (ret)
1145                         continue;
1146
1147                 sg_init_one(&sg[0], data, template[i].ilen);
1148                 if (diff_dst) {
1149                         data = xoutbuf[0];
1150                         data += align_offset;
1151                         sg_init_one(&sgout[0], data, template[i].ilen);
1152                 }
1153
1154                 skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1155                                            template[i].ilen, iv);
1156                 ret = crypto_wait_req(enc ? crypto_skcipher_encrypt(req) :
1157                                       crypto_skcipher_decrypt(req), &wait);
1158
1159                 if (ret) {
1160                         pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n",
1161                                d, e, j, algo, -ret);
1162                         goto out;
1163                 }
1164
1165                 q = data;
1166                 if (memcmp(q, template[i].result, template[i].rlen)) {
1167                         pr_err("alg: skcipher%s: Test %d failed (invalid result) on %s for %s\n",
1168                                d, j, e, algo);
1169                         hexdump(q, template[i].rlen);
1170                         ret = -EINVAL;
1171                         goto out;
1172                 }
1173
1174                 if (template[i].iv_out &&
1175                     memcmp(iv, template[i].iv_out,
1176                            crypto_skcipher_ivsize(tfm))) {
1177                         pr_err("alg: skcipher%s: Test %d failed (invalid output IV) on %s for %s\n",
1178                                d, j, e, algo);
1179                         hexdump(iv, crypto_skcipher_ivsize(tfm));
1180                         ret = -EINVAL;
1181                         goto out;
1182                 }
1183         }
1184
1185         j = 0;
1186         for (i = 0; i < tcount; i++) {
1187                 /* alignment tests are only done with continuous buffers */
1188                 if (align_offset != 0)
1189                         break;
1190
1191                 if (!template[i].np)
1192                         continue;
1193
1194                 if (fips_enabled && template[i].fips_skip)
1195                         continue;
1196
1197                 if (template[i].iv)
1198                         memcpy(iv, template[i].iv, ivsize);
1199                 else
1200                         memset(iv, 0, MAX_IVLEN);
1201
1202                 j++;
1203                 crypto_skcipher_clear_flags(tfm, ~0);
1204                 if (template[i].wk)
1205                         crypto_skcipher_set_flags(tfm,
1206                                                   CRYPTO_TFM_REQ_WEAK_KEY);
1207
1208                 ret = crypto_skcipher_setkey(tfm, template[i].key,
1209                                              template[i].klen);
1210                 if (template[i].fail == !ret) {
1211                         pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n",
1212                                d, j, algo, crypto_skcipher_get_flags(tfm));
1213                         goto out;
1214                 } else if (ret)
1215                         continue;
1216
1217                 temp = 0;
1218                 ret = -EINVAL;
1219                 sg_init_table(sg, template[i].np);
1220                 if (diff_dst)
1221                         sg_init_table(sgout, template[i].np);
1222                 for (k = 0; k < template[i].np; k++) {
1223                         if (WARN_ON(offset_in_page(IDX[k]) +
1224                                     template[i].tap[k] > PAGE_SIZE))
1225                                 goto out;
1226
1227                         q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
1228
1229                         memcpy(q, template[i].input + temp, template[i].tap[k]);
1230
1231                         if (offset_in_page(q) + template[i].tap[k] < PAGE_SIZE)
1232                                 q[template[i].tap[k]] = 0;
1233
1234                         sg_set_buf(&sg[k], q, template[i].tap[k]);
1235                         if (diff_dst) {
1236                                 q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
1237                                     offset_in_page(IDX[k]);
1238
1239                                 sg_set_buf(&sgout[k], q, template[i].tap[k]);
1240
1241                                 memset(q, 0, template[i].tap[k]);
1242                                 if (offset_in_page(q) +
1243                                     template[i].tap[k] < PAGE_SIZE)
1244                                         q[template[i].tap[k]] = 0;
1245                         }
1246
1247                         temp += template[i].tap[k];
1248                 }
1249
1250                 skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1251                                            template[i].ilen, iv);
1252
1253                 ret = crypto_wait_req(enc ? crypto_skcipher_encrypt(req) :
1254                                       crypto_skcipher_decrypt(req), &wait);
1255
1256                 if (ret) {
1257                         pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n",
1258                                d, e, j, algo, -ret);
1259                         goto out;
1260                 }
1261
1262                 temp = 0;
1263                 ret = -EINVAL;
1264                 for (k = 0; k < template[i].np; k++) {
1265                         if (diff_dst)
1266                                 q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
1267                                     offset_in_page(IDX[k]);
1268                         else
1269                                 q = xbuf[IDX[k] >> PAGE_SHIFT] +
1270                                     offset_in_page(IDX[k]);
1271
1272                         if (memcmp(q, template[i].result + temp,
1273                                    template[i].tap[k])) {
1274                                 pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n",
1275                                        d, j, e, k, algo);
1276                                 hexdump(q, template[i].tap[k]);
1277                                 goto out;
1278                         }
1279
1280                         q += template[i].tap[k];
1281                         for (n = 0; offset_in_page(q + n) && q[n]; n++)
1282                                 ;
1283                         if (n) {
1284                                 pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
1285                                        d, j, e, k, algo, n);
1286                                 hexdump(q, n);
1287                                 goto out;
1288                         }
1289                         temp += template[i].tap[k];
1290                 }
1291         }
1292
1293         ret = 0;
1294
1295 out:
1296         skcipher_request_free(req);
1297         if (diff_dst)
1298                 testmgr_free_buf(xoutbuf);
1299 out_nooutbuf:
1300         testmgr_free_buf(xbuf);
1301 out_nobuf:
1302         return ret;
1303 }
1304
1305 static int test_skcipher(struct crypto_skcipher *tfm, int enc,
1306                          const struct cipher_testvec *template,
1307                          unsigned int tcount)
1308 {
1309         unsigned int alignmask;
1310         int ret;
1311
1312         /* test 'dst == src' case */
1313         ret = __test_skcipher(tfm, enc, template, tcount, false, 0);
1314         if (ret)
1315                 return ret;
1316
1317         /* test 'dst != src' case */
1318         ret = __test_skcipher(tfm, enc, template, tcount, true, 0);
1319         if (ret)
1320                 return ret;
1321
1322         /* test unaligned buffers, check with one byte offset */
1323         ret = __test_skcipher(tfm, enc, template, tcount, true, 1);
1324         if (ret)
1325                 return ret;
1326
1327         alignmask = crypto_tfm_alg_alignmask(&tfm->base);
1328         if (alignmask) {
1329                 /* Check if alignment mask for tfm is correctly set. */
1330                 ret = __test_skcipher(tfm, enc, template, tcount, true,
1331                                       alignmask + 1);
1332                 if (ret)
1333                         return ret;
1334         }
1335
1336         return 0;
1337 }
1338
1339 static int test_comp(struct crypto_comp *tfm,
1340                      const struct comp_testvec *ctemplate,
1341                      const struct comp_testvec *dtemplate,
1342                      int ctcount, int dtcount)
1343 {
1344         const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
1345         char *output, *decomp_output;
1346         unsigned int i;
1347         int ret;
1348
1349         output = kmalloc(COMP_BUF_SIZE, GFP_KERNEL);
1350         if (!output)
1351                 return -ENOMEM;
1352
1353         decomp_output = kmalloc(COMP_BUF_SIZE, GFP_KERNEL);
1354         if (!decomp_output) {
1355                 kfree(output);
1356                 return -ENOMEM;
1357         }
1358
1359         for (i = 0; i < ctcount; i++) {
1360                 int ilen;
1361                 unsigned int dlen = COMP_BUF_SIZE;
1362
1363                 memset(output, 0, sizeof(COMP_BUF_SIZE));
1364                 memset(decomp_output, 0, sizeof(COMP_BUF_SIZE));
1365
1366                 ilen = ctemplate[i].inlen;
1367                 ret = crypto_comp_compress(tfm, ctemplate[i].input,
1368                                            ilen, output, &dlen);
1369                 if (ret) {
1370                         printk(KERN_ERR "alg: comp: compression failed "
1371                                "on test %d for %s: ret=%d\n", i + 1, algo,
1372                                -ret);
1373                         goto out;
1374                 }
1375
1376                 ilen = dlen;
1377                 dlen = COMP_BUF_SIZE;
1378                 ret = crypto_comp_decompress(tfm, output,
1379                                              ilen, decomp_output, &dlen);
1380                 if (ret) {
1381                         pr_err("alg: comp: compression failed: decompress: on test %d for %s failed: ret=%d\n",
1382                                i + 1, algo, -ret);
1383                         goto out;
1384                 }
1385
1386                 if (dlen != ctemplate[i].inlen) {
1387                         printk(KERN_ERR "alg: comp: Compression test %d "
1388                                "failed for %s: output len = %d\n", i + 1, algo,
1389                                dlen);
1390                         ret = -EINVAL;
1391                         goto out;
1392                 }
1393
1394                 if (memcmp(decomp_output, ctemplate[i].input,
1395                            ctemplate[i].inlen)) {
1396                         pr_err("alg: comp: compression failed: output differs: on test %d for %s\n",
1397                                i + 1, algo);
1398                         hexdump(decomp_output, dlen);
1399                         ret = -EINVAL;
1400                         goto out;
1401                 }
1402         }
1403
1404         for (i = 0; i < dtcount; i++) {
1405                 int ilen;
1406                 unsigned int dlen = COMP_BUF_SIZE;
1407
1408                 memset(decomp_output, 0, sizeof(COMP_BUF_SIZE));
1409
1410                 ilen = dtemplate[i].inlen;
1411                 ret = crypto_comp_decompress(tfm, dtemplate[i].input,
1412                                              ilen, decomp_output, &dlen);
1413                 if (ret) {
1414                         printk(KERN_ERR "alg: comp: decompression failed "
1415                                "on test %d for %s: ret=%d\n", i + 1, algo,
1416                                -ret);
1417                         goto out;
1418                 }
1419
1420                 if (dlen != dtemplate[i].outlen) {
1421                         printk(KERN_ERR "alg: comp: Decompression test %d "
1422                                "failed for %s: output len = %d\n", i + 1, algo,
1423                                dlen);
1424                         ret = -EINVAL;
1425                         goto out;
1426                 }
1427
1428                 if (memcmp(decomp_output, dtemplate[i].output, dlen)) {
1429                         printk(KERN_ERR "alg: comp: Decompression test %d "
1430                                "failed for %s\n", i + 1, algo);
1431                         hexdump(decomp_output, dlen);
1432                         ret = -EINVAL;
1433                         goto out;
1434                 }
1435         }
1436
1437         ret = 0;
1438
1439 out:
1440         kfree(decomp_output);
1441         kfree(output);
1442         return ret;
1443 }
1444
1445 static int test_acomp(struct crypto_acomp *tfm,
1446                               const struct comp_testvec *ctemplate,
1447                       const struct comp_testvec *dtemplate,
1448                       int ctcount, int dtcount)
1449 {
1450         const char *algo = crypto_tfm_alg_driver_name(crypto_acomp_tfm(tfm));
1451         unsigned int i;
1452         char *output, *decomp_out;
1453         int ret;
1454         struct scatterlist src, dst;
1455         struct acomp_req *req;
1456         struct crypto_wait wait;
1457
1458         output = kmalloc(COMP_BUF_SIZE, GFP_KERNEL);
1459         if (!output)
1460                 return -ENOMEM;
1461
1462         decomp_out = kmalloc(COMP_BUF_SIZE, GFP_KERNEL);
1463         if (!decomp_out) {
1464                 kfree(output);
1465                 return -ENOMEM;
1466         }
1467
1468         for (i = 0; i < ctcount; i++) {
1469                 unsigned int dlen = COMP_BUF_SIZE;
1470                 int ilen = ctemplate[i].inlen;
1471                 void *input_vec;
1472
1473                 input_vec = kmemdup(ctemplate[i].input, ilen, GFP_KERNEL);
1474                 if (!input_vec) {
1475                         ret = -ENOMEM;
1476                         goto out;
1477                 }
1478
1479                 memset(output, 0, dlen);
1480                 crypto_init_wait(&wait);
1481                 sg_init_one(&src, input_vec, ilen);
1482                 sg_init_one(&dst, output, dlen);
1483
1484                 req = acomp_request_alloc(tfm);
1485                 if (!req) {
1486                         pr_err("alg: acomp: request alloc failed for %s\n",
1487                                algo);
1488                         kfree(input_vec);
1489                         ret = -ENOMEM;
1490                         goto out;
1491                 }
1492
1493                 acomp_request_set_params(req, &src, &dst, ilen, dlen);
1494                 acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1495                                            crypto_req_done, &wait);
1496
1497                 ret = crypto_wait_req(crypto_acomp_compress(req), &wait);
1498                 if (ret) {
1499                         pr_err("alg: acomp: compression failed on test %d for %s: ret=%d\n",
1500                                i + 1, algo, -ret);
1501                         kfree(input_vec);
1502                         acomp_request_free(req);
1503                         goto out;
1504                 }
1505
1506                 ilen = req->dlen;
1507                 dlen = COMP_BUF_SIZE;
1508                 sg_init_one(&src, output, ilen);
1509                 sg_init_one(&dst, decomp_out, dlen);
1510                 crypto_init_wait(&wait);
1511                 acomp_request_set_params(req, &src, &dst, ilen, dlen);
1512
1513                 ret = crypto_wait_req(crypto_acomp_decompress(req), &wait);
1514                 if (ret) {
1515                         pr_err("alg: acomp: compression failed on test %d for %s: ret=%d\n",
1516                                i + 1, algo, -ret);
1517                         kfree(input_vec);
1518                         acomp_request_free(req);
1519                         goto out;
1520                 }
1521
1522                 if (req->dlen != ctemplate[i].inlen) {
1523                         pr_err("alg: acomp: Compression test %d failed for %s: output len = %d\n",
1524                                i + 1, algo, req->dlen);
1525                         ret = -EINVAL;
1526                         kfree(input_vec);
1527                         acomp_request_free(req);
1528                         goto out;
1529                 }
1530
1531                 if (memcmp(input_vec, decomp_out, req->dlen)) {
1532                         pr_err("alg: acomp: Compression test %d failed for %s\n",
1533                                i + 1, algo);
1534                         hexdump(output, req->dlen);
1535                         ret = -EINVAL;
1536                         kfree(input_vec);
1537                         acomp_request_free(req);
1538                         goto out;
1539                 }
1540
1541                 kfree(input_vec);
1542                 acomp_request_free(req);
1543         }
1544
1545         for (i = 0; i < dtcount; i++) {
1546                 unsigned int dlen = COMP_BUF_SIZE;
1547                 int ilen = dtemplate[i].inlen;
1548                 void *input_vec;
1549
1550                 input_vec = kmemdup(dtemplate[i].input, ilen, GFP_KERNEL);
1551                 if (!input_vec) {
1552                         ret = -ENOMEM;
1553                         goto out;
1554                 }
1555
1556                 memset(output, 0, dlen);
1557                 crypto_init_wait(&wait);
1558                 sg_init_one(&src, input_vec, ilen);
1559                 sg_init_one(&dst, output, dlen);
1560
1561                 req = acomp_request_alloc(tfm);
1562                 if (!req) {
1563                         pr_err("alg: acomp: request alloc failed for %s\n",
1564                                algo);
1565                         kfree(input_vec);
1566                         ret = -ENOMEM;
1567                         goto out;
1568                 }
1569
1570                 acomp_request_set_params(req, &src, &dst, ilen, dlen);
1571                 acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1572                                            crypto_req_done, &wait);
1573
1574                 ret = crypto_wait_req(crypto_acomp_decompress(req), &wait);
1575                 if (ret) {
1576                         pr_err("alg: acomp: decompression failed on test %d for %s: ret=%d\n",
1577                                i + 1, algo, -ret);
1578                         kfree(input_vec);
1579                         acomp_request_free(req);
1580                         goto out;
1581                 }
1582
1583                 if (req->dlen != dtemplate[i].outlen) {
1584                         pr_err("alg: acomp: Decompression test %d failed for %s: output len = %d\n",
1585                                i + 1, algo, req->dlen);
1586                         ret = -EINVAL;
1587                         kfree(input_vec);
1588                         acomp_request_free(req);
1589                         goto out;
1590                 }
1591
1592                 if (memcmp(output, dtemplate[i].output, req->dlen)) {
1593                         pr_err("alg: acomp: Decompression test %d failed for %s\n",
1594                                i + 1, algo);
1595                         hexdump(output, req->dlen);
1596                         ret = -EINVAL;
1597                         kfree(input_vec);
1598                         acomp_request_free(req);
1599                         goto out;
1600                 }
1601
1602                 kfree(input_vec);
1603                 acomp_request_free(req);
1604         }
1605
1606         ret = 0;
1607
1608 out:
1609         kfree(decomp_out);
1610         kfree(output);
1611         return ret;
1612 }
1613
1614 static int test_cprng(struct crypto_rng *tfm,
1615                       const struct cprng_testvec *template,
1616                       unsigned int tcount)
1617 {
1618         const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
1619         int err = 0, i, j, seedsize;
1620         u8 *seed;
1621         char result[32];
1622
1623         seedsize = crypto_rng_seedsize(tfm);
1624
1625         seed = kmalloc(seedsize, GFP_KERNEL);
1626         if (!seed) {
1627                 printk(KERN_ERR "alg: cprng: Failed to allocate seed space "
1628                        "for %s\n", algo);
1629                 return -ENOMEM;
1630         }
1631
1632         for (i = 0; i < tcount; i++) {
1633                 memset(result, 0, 32);
1634
1635                 memcpy(seed, template[i].v, template[i].vlen);
1636                 memcpy(seed + template[i].vlen, template[i].key,
1637                        template[i].klen);
1638                 memcpy(seed + template[i].vlen + template[i].klen,
1639                        template[i].dt, template[i].dtlen);
1640
1641                 err = crypto_rng_reset(tfm, seed, seedsize);
1642                 if (err) {
1643                         printk(KERN_ERR "alg: cprng: Failed to reset rng "
1644                                "for %s\n", algo);
1645                         goto out;
1646                 }
1647
1648                 for (j = 0; j < template[i].loops; j++) {
1649                         err = crypto_rng_get_bytes(tfm, result,
1650                                                    template[i].rlen);
1651                         if (err < 0) {
1652                                 printk(KERN_ERR "alg: cprng: Failed to obtain "
1653                                        "the correct amount of random data for "
1654                                        "%s (requested %d)\n", algo,
1655                                        template[i].rlen);
1656                                 goto out;
1657                         }
1658                 }
1659
1660                 err = memcmp(result, template[i].result,
1661                              template[i].rlen);
1662                 if (err) {
1663                         printk(KERN_ERR "alg: cprng: Test %d failed for %s\n",
1664                                i, algo);
1665                         hexdump(result, template[i].rlen);
1666                         err = -EINVAL;
1667                         goto out;
1668                 }
1669         }
1670
1671 out:
1672         kfree(seed);
1673         return err;
1674 }
1675
1676 static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
1677                          u32 type, u32 mask)
1678 {
1679         struct crypto_aead *tfm;
1680         int err = 0;
1681
1682         tfm = crypto_alloc_aead(driver, type, mask);
1683         if (IS_ERR(tfm)) {
1684                 printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
1685                        "%ld\n", driver, PTR_ERR(tfm));
1686                 return PTR_ERR(tfm);
1687         }
1688
1689         if (desc->suite.aead.enc.vecs) {
1690                 err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
1691                                 desc->suite.aead.enc.count);
1692                 if (err)
1693                         goto out;
1694         }
1695
1696         if (!err && desc->suite.aead.dec.vecs)
1697                 err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
1698                                 desc->suite.aead.dec.count);
1699
1700 out:
1701         crypto_free_aead(tfm);
1702         return err;
1703 }
1704
1705 static int alg_test_cipher(const struct alg_test_desc *desc,
1706                            const char *driver, u32 type, u32 mask)
1707 {
1708         struct crypto_cipher *tfm;
1709         int err = 0;
1710
1711         tfm = crypto_alloc_cipher(driver, type, mask);
1712         if (IS_ERR(tfm)) {
1713                 printk(KERN_ERR "alg: cipher: Failed to load transform for "
1714                        "%s: %ld\n", driver, PTR_ERR(tfm));
1715                 return PTR_ERR(tfm);
1716         }
1717
1718         if (desc->suite.cipher.enc.vecs) {
1719                 err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1720                                   desc->suite.cipher.enc.count);
1721                 if (err)
1722                         goto out;
1723         }
1724
1725         if (desc->suite.cipher.dec.vecs)
1726                 err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1727                                   desc->suite.cipher.dec.count);
1728
1729 out:
1730         crypto_free_cipher(tfm);
1731         return err;
1732 }
1733
1734 static int alg_test_skcipher(const struct alg_test_desc *desc,
1735                              const char *driver, u32 type, u32 mask)
1736 {
1737         struct crypto_skcipher *tfm;
1738         int err = 0;
1739
1740         tfm = crypto_alloc_skcipher(driver, type, mask);
1741         if (IS_ERR(tfm)) {
1742                 printk(KERN_ERR "alg: skcipher: Failed to load transform for "
1743                        "%s: %ld\n", driver, PTR_ERR(tfm));
1744                 return PTR_ERR(tfm);
1745         }
1746
1747         if (desc->suite.cipher.enc.vecs) {
1748                 err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1749                                     desc->suite.cipher.enc.count);
1750                 if (err)
1751                         goto out;
1752         }
1753
1754         if (desc->suite.cipher.dec.vecs)
1755                 err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1756                                     desc->suite.cipher.dec.count);
1757
1758 out:
1759         crypto_free_skcipher(tfm);
1760         return err;
1761 }
1762
1763 static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
1764                          u32 type, u32 mask)
1765 {
1766         struct crypto_comp *comp;
1767         struct crypto_acomp *acomp;
1768         int err;
1769         u32 algo_type = type & CRYPTO_ALG_TYPE_ACOMPRESS_MASK;
1770
1771         if (algo_type == CRYPTO_ALG_TYPE_ACOMPRESS) {
1772                 acomp = crypto_alloc_acomp(driver, type, mask);
1773                 if (IS_ERR(acomp)) {
1774                         pr_err("alg: acomp: Failed to load transform for %s: %ld\n",
1775                                driver, PTR_ERR(acomp));
1776                         return PTR_ERR(acomp);
1777                 }
1778                 err = test_acomp(acomp, desc->suite.comp.comp.vecs,
1779                                  desc->suite.comp.decomp.vecs,
1780                                  desc->suite.comp.comp.count,
1781                                  desc->suite.comp.decomp.count);
1782                 crypto_free_acomp(acomp);
1783         } else {
1784                 comp = crypto_alloc_comp(driver, type, mask);
1785                 if (IS_ERR(comp)) {
1786                         pr_err("alg: comp: Failed to load transform for %s: %ld\n",
1787                                driver, PTR_ERR(comp));
1788                         return PTR_ERR(comp);
1789                 }
1790
1791                 err = test_comp(comp, desc->suite.comp.comp.vecs,
1792                                 desc->suite.comp.decomp.vecs,
1793                                 desc->suite.comp.comp.count,
1794                                 desc->suite.comp.decomp.count);
1795
1796                 crypto_free_comp(comp);
1797         }
1798         return err;
1799 }
1800
1801 static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
1802                          u32 type, u32 mask)
1803 {
1804         struct crypto_ahash *tfm;
1805         int err;
1806
1807         tfm = crypto_alloc_ahash(driver, type, mask);
1808         if (IS_ERR(tfm)) {
1809                 printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
1810                        "%ld\n", driver, PTR_ERR(tfm));
1811                 return PTR_ERR(tfm);
1812         }
1813
1814         err = test_hash(tfm, desc->suite.hash.vecs,
1815                         desc->suite.hash.count, true);
1816         if (!err)
1817                 err = test_hash(tfm, desc->suite.hash.vecs,
1818                                 desc->suite.hash.count, false);
1819
1820         crypto_free_ahash(tfm);
1821         return err;
1822 }
1823
1824 static int alg_test_crc32c(const struct alg_test_desc *desc,
1825                            const char *driver, u32 type, u32 mask)
1826 {
1827         struct crypto_shash *tfm;
1828         u32 val;
1829         int err;
1830
1831         err = alg_test_hash(desc, driver, type, mask);
1832         if (err)
1833                 goto out;
1834
1835         tfm = crypto_alloc_shash(driver, type, mask);
1836         if (IS_ERR(tfm)) {
1837                 printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
1838                        "%ld\n", driver, PTR_ERR(tfm));
1839                 err = PTR_ERR(tfm);
1840                 goto out;
1841         }
1842
1843         do {
1844                 SHASH_DESC_ON_STACK(shash, tfm);
1845                 u32 *ctx = (u32 *)shash_desc_ctx(shash);
1846
1847                 shash->tfm = tfm;
1848                 shash->flags = 0;
1849
1850                 *ctx = le32_to_cpu(420553207);
1851                 err = crypto_shash_final(shash, (u8 *)&val);
1852                 if (err) {
1853                         printk(KERN_ERR "alg: crc32c: Operation failed for "
1854                                "%s: %d\n", driver, err);
1855                         break;
1856                 }
1857
1858                 if (val != ~420553207) {
1859                         printk(KERN_ERR "alg: crc32c: Test failed for %s: "
1860                                "%d\n", driver, val);
1861                         err = -EINVAL;
1862                 }
1863         } while (0);
1864
1865         crypto_free_shash(tfm);
1866
1867 out:
1868         return err;
1869 }
1870
1871 static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
1872                           u32 type, u32 mask)
1873 {
1874         struct crypto_rng *rng;
1875         int err;
1876
1877         rng = crypto_alloc_rng(driver, type, mask);
1878         if (IS_ERR(rng)) {
1879                 printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
1880                        "%ld\n", driver, PTR_ERR(rng));
1881                 return PTR_ERR(rng);
1882         }
1883
1884         err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count);
1885
1886         crypto_free_rng(rng);
1887
1888         return err;
1889 }
1890
1891
1892 static int drbg_cavs_test(const struct drbg_testvec *test, int pr,
1893                           const char *driver, u32 type, u32 mask)
1894 {
1895         int ret = -EAGAIN;
1896         struct crypto_rng *drng;
1897         struct drbg_test_data test_data;
1898         struct drbg_string addtl, pers, testentropy;
1899         unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL);
1900
1901         if (!buf)
1902                 return -ENOMEM;
1903
1904         drng = crypto_alloc_rng(driver, type, mask);
1905         if (IS_ERR(drng)) {
1906                 printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for "
1907                        "%s\n", driver);
1908                 kzfree(buf);
1909                 return -ENOMEM;
1910         }
1911
1912         test_data.testentropy = &testentropy;
1913         drbg_string_fill(&testentropy, test->entropy, test->entropylen);
1914         drbg_string_fill(&pers, test->pers, test->perslen);
1915         ret = crypto_drbg_reset_test(drng, &pers, &test_data);
1916         if (ret) {
1917                 printk(KERN_ERR "alg: drbg: Failed to reset rng\n");
1918                 goto outbuf;
1919         }
1920
1921         drbg_string_fill(&addtl, test->addtla, test->addtllen);
1922         if (pr) {
1923                 drbg_string_fill(&testentropy, test->entpra, test->entprlen);
1924                 ret = crypto_drbg_get_bytes_addtl_test(drng,
1925                         buf, test->expectedlen, &addtl, &test_data);
1926         } else {
1927                 ret = crypto_drbg_get_bytes_addtl(drng,
1928                         buf, test->expectedlen, &addtl);
1929         }
1930         if (ret < 0) {
1931                 printk(KERN_ERR "alg: drbg: could not obtain random data for "
1932                        "driver %s\n", driver);
1933                 goto outbuf;
1934         }
1935
1936         drbg_string_fill(&addtl, test->addtlb, test->addtllen);
1937         if (pr) {
1938                 drbg_string_fill(&testentropy, test->entprb, test->entprlen);
1939                 ret = crypto_drbg_get_bytes_addtl_test(drng,
1940                         buf, test->expectedlen, &addtl, &test_data);
1941         } else {
1942                 ret = crypto_drbg_get_bytes_addtl(drng,
1943                         buf, test->expectedlen, &addtl);
1944         }
1945         if (ret < 0) {
1946                 printk(KERN_ERR "alg: drbg: could not obtain random data for "
1947                        "driver %s\n", driver);
1948                 goto outbuf;
1949         }
1950
1951         ret = memcmp(test->expected, buf, test->expectedlen);
1952
1953 outbuf:
1954         crypto_free_rng(drng);
1955         kzfree(buf);
1956         return ret;
1957 }
1958
1959
1960 static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver,
1961                          u32 type, u32 mask)
1962 {
1963         int err = 0;
1964         int pr = 0;
1965         int i = 0;
1966         const struct drbg_testvec *template = desc->suite.drbg.vecs;
1967         unsigned int tcount = desc->suite.drbg.count;
1968
1969         if (0 == memcmp(driver, "drbg_pr_", 8))
1970                 pr = 1;
1971
1972         for (i = 0; i < tcount; i++) {
1973                 err = drbg_cavs_test(&template[i], pr, driver, type, mask);
1974                 if (err) {
1975                         printk(KERN_ERR "alg: drbg: Test %d failed for %s\n",
1976                                i, driver);
1977                         err = -EINVAL;
1978                         break;
1979                 }
1980         }
1981         return err;
1982
1983 }
1984
1985 static int do_test_kpp(struct crypto_kpp *tfm, const struct kpp_testvec *vec,
1986                        const char *alg)
1987 {
1988         struct kpp_request *req;
1989         void *input_buf = NULL;
1990         void *output_buf = NULL;
1991         void *a_public = NULL;
1992         void *a_ss = NULL;
1993         void *shared_secret = NULL;
1994         struct crypto_wait wait;
1995         unsigned int out_len_max;
1996         int err = -ENOMEM;
1997         struct scatterlist src, dst;
1998
1999         req = kpp_request_alloc(tfm, GFP_KERNEL);
2000         if (!req)
2001                 return err;
2002
2003         crypto_init_wait(&wait);
2004
2005         err = crypto_kpp_set_secret(tfm, vec->secret, vec->secret_size);
2006         if (err < 0)
2007                 goto free_req;
2008
2009         out_len_max = crypto_kpp_maxsize(tfm);
2010         output_buf = kzalloc(out_len_max, GFP_KERNEL);
2011         if (!output_buf) {
2012                 err = -ENOMEM;
2013                 goto free_req;
2014         }
2015
2016         /* Use appropriate parameter as base */
2017         kpp_request_set_input(req, NULL, 0);
2018         sg_init_one(&dst, output_buf, out_len_max);
2019         kpp_request_set_output(req, &dst, out_len_max);
2020         kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
2021                                  crypto_req_done, &wait);
2022
2023         /* Compute party A's public key */
2024         err = crypto_wait_req(crypto_kpp_generate_public_key(req), &wait);
2025         if (err) {
2026                 pr_err("alg: %s: Party A: generate public key test failed. err %d\n",
2027                        alg, err);
2028                 goto free_output;
2029         }
2030
2031         if (vec->genkey) {
2032                 /* Save party A's public key */
2033                 a_public = kzalloc(out_len_max, GFP_KERNEL);
2034                 if (!a_public) {
2035                         err = -ENOMEM;
2036                         goto free_output;
2037                 }
2038                 memcpy(a_public, sg_virt(req->dst), out_len_max);
2039         } else {
2040                 /* Verify calculated public key */
2041                 if (memcmp(vec->expected_a_public, sg_virt(req->dst),
2042                            vec->expected_a_public_size)) {
2043                         pr_err("alg: %s: Party A: generate public key test failed. Invalid output\n",
2044                                alg);
2045                         err = -EINVAL;
2046                         goto free_output;
2047                 }
2048         }
2049
2050         /* Calculate shared secret key by using counter part (b) public key. */
2051         input_buf = kzalloc(vec->b_public_size, GFP_KERNEL);
2052         if (!input_buf) {
2053                 err = -ENOMEM;
2054                 goto free_output;
2055         }
2056
2057         memcpy(input_buf, vec->b_public, vec->b_public_size);
2058         sg_init_one(&src, input_buf, vec->b_public_size);
2059         sg_init_one(&dst, output_buf, out_len_max);
2060         kpp_request_set_input(req, &src, vec->b_public_size);
2061         kpp_request_set_output(req, &dst, out_len_max);
2062         kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
2063                                  crypto_req_done, &wait);
2064         err = crypto_wait_req(crypto_kpp_compute_shared_secret(req), &wait);
2065         if (err) {
2066                 pr_err("alg: %s: Party A: compute shared secret test failed. err %d\n",
2067                        alg, err);
2068                 goto free_all;
2069         }
2070
2071         if (vec->genkey) {
2072                 /* Save the shared secret obtained by party A */
2073                 a_ss = kzalloc(vec->expected_ss_size, GFP_KERNEL);
2074                 if (!a_ss) {
2075                         err = -ENOMEM;
2076                         goto free_all;
2077                 }
2078                 memcpy(a_ss, sg_virt(req->dst), vec->expected_ss_size);
2079
2080                 /*
2081                  * Calculate party B's shared secret by using party A's
2082                  * public key.
2083                  */
2084                 err = crypto_kpp_set_secret(tfm, vec->b_secret,
2085                                             vec->b_secret_size);
2086                 if (err < 0)
2087                         goto free_all;
2088
2089                 sg_init_one(&src, a_public, vec->expected_a_public_size);
2090                 sg_init_one(&dst, output_buf, out_len_max);
2091                 kpp_request_set_input(req, &src, vec->expected_a_public_size);
2092                 kpp_request_set_output(req, &dst, out_len_max);
2093                 kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
2094                                          crypto_req_done, &wait);
2095                 err = crypto_wait_req(crypto_kpp_compute_shared_secret(req),
2096                                       &wait);
2097                 if (err) {
2098                         pr_err("alg: %s: Party B: compute shared secret failed. err %d\n",
2099                                alg, err);
2100                         goto free_all;
2101                 }
2102
2103                 shared_secret = a_ss;
2104         } else {
2105                 shared_secret = (void *)vec->expected_ss;
2106         }
2107
2108         /*
2109          * verify shared secret from which the user will derive
2110          * secret key by executing whatever hash it has chosen
2111          */
2112         if (memcmp(shared_secret, sg_virt(req->dst),
2113                    vec->expected_ss_size)) {
2114                 pr_err("alg: %s: compute shared secret test failed. Invalid output\n",
2115                        alg);
2116                 err = -EINVAL;
2117         }
2118
2119 free_all:
2120         kfree(a_ss);
2121         kfree(input_buf);
2122 free_output:
2123         kfree(a_public);
2124         kfree(output_buf);
2125 free_req:
2126         kpp_request_free(req);
2127         return err;
2128 }
2129
2130 static int test_kpp(struct crypto_kpp *tfm, const char *alg,
2131                     const struct kpp_testvec *vecs, unsigned int tcount)
2132 {
2133         int ret, i;
2134
2135         for (i = 0; i < tcount; i++) {
2136                 ret = do_test_kpp(tfm, vecs++, alg);
2137                 if (ret) {
2138                         pr_err("alg: %s: test failed on vector %d, err=%d\n",
2139                                alg, i + 1, ret);
2140                         return ret;
2141                 }
2142         }
2143         return 0;
2144 }
2145
2146 static int alg_test_kpp(const struct alg_test_desc *desc, const char *driver,
2147                         u32 type, u32 mask)
2148 {
2149         struct crypto_kpp *tfm;
2150         int err = 0;
2151
2152         tfm = crypto_alloc_kpp(driver, type, mask);
2153         if (IS_ERR(tfm)) {
2154                 pr_err("alg: kpp: Failed to load tfm for %s: %ld\n",
2155                        driver, PTR_ERR(tfm));
2156                 return PTR_ERR(tfm);
2157         }
2158         if (desc->suite.kpp.vecs)
2159                 err = test_kpp(tfm, desc->alg, desc->suite.kpp.vecs,
2160                                desc->suite.kpp.count);
2161
2162         crypto_free_kpp(tfm);
2163         return err;
2164 }
2165
2166 static int test_akcipher_one(struct crypto_akcipher *tfm,
2167                              const struct akcipher_testvec *vecs)
2168 {
2169         char *xbuf[XBUFSIZE];
2170         struct akcipher_request *req;
2171         void *outbuf_enc = NULL;
2172         void *outbuf_dec = NULL;
2173         struct crypto_wait wait;
2174         unsigned int out_len_max, out_len = 0;
2175         int err = -ENOMEM;
2176         struct scatterlist src, dst, src_tab[2];
2177
2178         if (testmgr_alloc_buf(xbuf))
2179                 return err;
2180
2181         req = akcipher_request_alloc(tfm, GFP_KERNEL);
2182         if (!req)
2183                 goto free_xbuf;
2184
2185         crypto_init_wait(&wait);
2186
2187         if (vecs->public_key_vec)
2188                 err = crypto_akcipher_set_pub_key(tfm, vecs->key,
2189                                                   vecs->key_len);
2190         else
2191                 err = crypto_akcipher_set_priv_key(tfm, vecs->key,
2192                                                    vecs->key_len);
2193         if (err)
2194                 goto free_req;
2195
2196         err = -ENOMEM;
2197         out_len_max = crypto_akcipher_maxsize(tfm);
2198         outbuf_enc = kzalloc(out_len_max, GFP_KERNEL);
2199         if (!outbuf_enc)
2200                 goto free_req;
2201
2202         if (WARN_ON(vecs->m_size > PAGE_SIZE))
2203                 goto free_all;
2204
2205         memcpy(xbuf[0], vecs->m, vecs->m_size);
2206
2207         sg_init_table(src_tab, 2);
2208         sg_set_buf(&src_tab[0], xbuf[0], 8);
2209         sg_set_buf(&src_tab[1], xbuf[0] + 8, vecs->m_size - 8);
2210         sg_init_one(&dst, outbuf_enc, out_len_max);
2211         akcipher_request_set_crypt(req, src_tab, &dst, vecs->m_size,
2212                                    out_len_max);
2213         akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
2214                                       crypto_req_done, &wait);
2215
2216         err = crypto_wait_req(vecs->siggen_sigver_test ?
2217                               /* Run asymmetric signature generation */
2218                               crypto_akcipher_sign(req) :
2219                               /* Run asymmetric encrypt */
2220                               crypto_akcipher_encrypt(req), &wait);
2221         if (err) {
2222                 pr_err("alg: akcipher: encrypt test failed. err %d\n", err);
2223                 goto free_all;
2224         }
2225         if (req->dst_len != vecs->c_size) {
2226                 pr_err("alg: akcipher: encrypt test failed. Invalid output len\n");
2227                 err = -EINVAL;
2228                 goto free_all;
2229         }
2230         /* verify that encrypted message is equal to expected */
2231         if (memcmp(vecs->c, outbuf_enc, vecs->c_size)) {
2232                 pr_err("alg: akcipher: encrypt test failed. Invalid output\n");
2233                 hexdump(outbuf_enc, vecs->c_size);
2234                 err = -EINVAL;
2235                 goto free_all;
2236         }
2237         /* Don't invoke decrypt for vectors with public key */
2238         if (vecs->public_key_vec) {
2239                 err = 0;
2240                 goto free_all;
2241         }
2242         outbuf_dec = kzalloc(out_len_max, GFP_KERNEL);
2243         if (!outbuf_dec) {
2244                 err = -ENOMEM;
2245                 goto free_all;
2246         }
2247
2248         if (WARN_ON(vecs->c_size > PAGE_SIZE))
2249                 goto free_all;
2250
2251         memcpy(xbuf[0], vecs->c, vecs->c_size);
2252
2253         sg_init_one(&src, xbuf[0], vecs->c_size);
2254         sg_init_one(&dst, outbuf_dec, out_len_max);
2255         crypto_init_wait(&wait);
2256         akcipher_request_set_crypt(req, &src, &dst, vecs->c_size, out_len_max);
2257
2258         err = crypto_wait_req(vecs->siggen_sigver_test ?
2259                               /* Run asymmetric signature verification */
2260                               crypto_akcipher_verify(req) :
2261                               /* Run asymmetric decrypt */
2262                               crypto_akcipher_decrypt(req), &wait);
2263         if (err) {
2264                 pr_err("alg: akcipher: decrypt test failed. err %d\n", err);
2265                 goto free_all;
2266         }
2267         out_len = req->dst_len;
2268         if (out_len < vecs->m_size) {
2269                 pr_err("alg: akcipher: decrypt test failed. "
2270                        "Invalid output len %u\n", out_len);
2271                 err = -EINVAL;
2272                 goto free_all;
2273         }
2274         /* verify that decrypted message is equal to the original msg */
2275         if (memchr_inv(outbuf_dec, 0, out_len - vecs->m_size) ||
2276             memcmp(vecs->m, outbuf_dec + out_len - vecs->m_size,
2277                    vecs->m_size)) {
2278                 pr_err("alg: akcipher: decrypt test failed. Invalid output\n");
2279                 hexdump(outbuf_dec, out_len);
2280                 err = -EINVAL;
2281         }
2282 free_all:
2283         kfree(outbuf_dec);
2284         kfree(outbuf_enc);
2285 free_req:
2286         akcipher_request_free(req);
2287 free_xbuf:
2288         testmgr_free_buf(xbuf);
2289         return err;
2290 }
2291
2292 static int test_akcipher(struct crypto_akcipher *tfm, const char *alg,
2293                          const struct akcipher_testvec *vecs,
2294                          unsigned int tcount)
2295 {
2296         const char *algo =
2297                 crypto_tfm_alg_driver_name(crypto_akcipher_tfm(tfm));
2298         int ret, i;
2299
2300         for (i = 0; i < tcount; i++) {
2301                 ret = test_akcipher_one(tfm, vecs++);
2302                 if (!ret)
2303                         continue;
2304
2305                 pr_err("alg: akcipher: test %d failed for %s, err=%d\n",
2306                        i + 1, algo, ret);
2307                 return ret;
2308         }
2309         return 0;
2310 }
2311
2312 static int alg_test_akcipher(const struct alg_test_desc *desc,
2313                              const char *driver, u32 type, u32 mask)
2314 {
2315         struct crypto_akcipher *tfm;
2316         int err = 0;
2317
2318         tfm = crypto_alloc_akcipher(driver, type, mask);
2319         if (IS_ERR(tfm)) {
2320                 pr_err("alg: akcipher: Failed to load tfm for %s: %ld\n",
2321                        driver, PTR_ERR(tfm));
2322                 return PTR_ERR(tfm);
2323         }
2324         if (desc->suite.akcipher.vecs)
2325                 err = test_akcipher(tfm, desc->alg, desc->suite.akcipher.vecs,
2326                                     desc->suite.akcipher.count);
2327
2328         crypto_free_akcipher(tfm);
2329         return err;
2330 }
2331
2332 static int alg_test_null(const struct alg_test_desc *desc,
2333                              const char *driver, u32 type, u32 mask)
2334 {
2335         return 0;
2336 }
2337
2338 #define __VECS(tv)      { .vecs = tv, .count = ARRAY_SIZE(tv) }
2339
2340 /* Please keep this list sorted by algorithm name. */
2341 static const struct alg_test_desc alg_test_descs[] = {
2342         {
2343                 .alg = "ansi_cprng",
2344                 .test = alg_test_cprng,
2345                 .suite = {
2346                         .cprng = __VECS(ansi_cprng_aes_tv_template)
2347                 }
2348         }, {
2349                 .alg = "authenc(hmac(md5),ecb(cipher_null))",
2350                 .test = alg_test_aead,
2351                 .suite = {
2352                         .aead = {
2353                                 .enc = __VECS(hmac_md5_ecb_cipher_null_enc_tv_template),
2354                                 .dec = __VECS(hmac_md5_ecb_cipher_null_dec_tv_template)
2355                         }
2356                 }
2357         }, {
2358                 .alg = "authenc(hmac(sha1),cbc(aes))",
2359                 .test = alg_test_aead,
2360                 .fips_allowed = 1,
2361                 .suite = {
2362                         .aead = {
2363                                 .enc = __VECS(hmac_sha1_aes_cbc_enc_tv_temp)
2364                         }
2365                 }
2366         }, {
2367                 .alg = "authenc(hmac(sha1),cbc(des))",
2368                 .test = alg_test_aead,
2369                 .suite = {
2370                         .aead = {
2371                                 .enc = __VECS(hmac_sha1_des_cbc_enc_tv_temp)
2372                         }
2373                 }
2374         }, {
2375                 .alg = "authenc(hmac(sha1),cbc(des3_ede))",
2376                 .test = alg_test_aead,
2377                 .fips_allowed = 1,
2378                 .suite = {
2379                         .aead = {
2380                                 .enc = __VECS(hmac_sha1_des3_ede_cbc_enc_tv_temp)
2381                         }
2382                 }
2383         }, {
2384                 .alg = "authenc(hmac(sha1),ctr(aes))",
2385                 .test = alg_test_null,
2386                 .fips_allowed = 1,
2387         }, {
2388                 .alg = "authenc(hmac(sha1),ecb(cipher_null))",
2389                 .test = alg_test_aead,
2390                 .suite = {
2391                         .aead = {
2392                                 .enc = __VECS(hmac_sha1_ecb_cipher_null_enc_tv_temp),
2393                                 .dec = __VECS(hmac_sha1_ecb_cipher_null_dec_tv_temp)
2394                         }
2395                 }
2396         }, {
2397                 .alg = "authenc(hmac(sha1),rfc3686(ctr(aes)))",
2398                 .test = alg_test_null,
2399                 .fips_allowed = 1,
2400         }, {
2401                 .alg = "authenc(hmac(sha224),cbc(des))",
2402                 .test = alg_test_aead,
2403                 .suite = {
2404                         .aead = {
2405                                 .enc = __VECS(hmac_sha224_des_cbc_enc_tv_temp)
2406                         }
2407                 }
2408         }, {
2409                 .alg = "authenc(hmac(sha224),cbc(des3_ede))",
2410                 .test = alg_test_aead,
2411                 .fips_allowed = 1,
2412                 .suite = {
2413                         .aead = {
2414                                 .enc = __VECS(hmac_sha224_des3_ede_cbc_enc_tv_temp)
2415                         }
2416                 }
2417         }, {
2418                 .alg = "authenc(hmac(sha256),cbc(aes))",
2419                 .test = alg_test_aead,
2420                 .fips_allowed = 1,
2421                 .suite = {
2422                         .aead = {
2423                                 .enc = __VECS(hmac_sha256_aes_cbc_enc_tv_temp)
2424                         }
2425                 }
2426         }, {
2427                 .alg = "authenc(hmac(sha256),cbc(des))",
2428                 .test = alg_test_aead,
2429                 .suite = {
2430                         .aead = {
2431                                 .enc = __VECS(hmac_sha256_des_cbc_enc_tv_temp)
2432                         }
2433                 }
2434         }, {
2435                 .alg = "authenc(hmac(sha256),cbc(des3_ede))",
2436                 .test = alg_test_aead,
2437                 .fips_allowed = 1,
2438                 .suite = {
2439                         .aead = {
2440                                 .enc = __VECS(hmac_sha256_des3_ede_cbc_enc_tv_temp)
2441                         }
2442                 }
2443         }, {
2444                 .alg = "authenc(hmac(sha256),ctr(aes))",
2445                 .test = alg_test_null,
2446                 .fips_allowed = 1,
2447         }, {
2448                 .alg = "authenc(hmac(sha256),rfc3686(ctr(aes)))",
2449                 .test = alg_test_null,
2450                 .fips_allowed = 1,
2451         }, {
2452                 .alg = "authenc(hmac(sha384),cbc(des))",
2453                 .test = alg_test_aead,
2454                 .suite = {
2455                         .aead = {
2456                                 .enc = __VECS(hmac_sha384_des_cbc_enc_tv_temp)
2457                         }
2458                 }
2459         }, {
2460                 .alg = "authenc(hmac(sha384),cbc(des3_ede))",
2461                 .test = alg_test_aead,
2462                 .fips_allowed = 1,
2463                 .suite = {
2464                         .aead = {
2465                                 .enc = __VECS(hmac_sha384_des3_ede_cbc_enc_tv_temp)
2466                         }
2467                 }
2468         }, {
2469                 .alg = "authenc(hmac(sha384),ctr(aes))",
2470                 .test = alg_test_null,
2471                 .fips_allowed = 1,
2472         }, {
2473                 .alg = "authenc(hmac(sha384),rfc3686(ctr(aes)))",
2474                 .test = alg_test_null,
2475                 .fips_allowed = 1,
2476         }, {
2477                 .alg = "authenc(hmac(sha512),cbc(aes))",
2478                 .fips_allowed = 1,
2479                 .test = alg_test_aead,
2480                 .suite = {
2481                         .aead = {
2482                                 .enc = __VECS(hmac_sha512_aes_cbc_enc_tv_temp)
2483                         }
2484                 }
2485         }, {
2486                 .alg = "authenc(hmac(sha512),cbc(des))",
2487                 .test = alg_test_aead,
2488                 .suite = {
2489                         .aead = {
2490                                 .enc = __VECS(hmac_sha512_des_cbc_enc_tv_temp)
2491                         }
2492                 }
2493         }, {
2494                 .alg = "authenc(hmac(sha512),cbc(des3_ede))",
2495                 .test = alg_test_aead,
2496                 .fips_allowed = 1,
2497                 .suite = {
2498                         .aead = {
2499                                 .enc = __VECS(hmac_sha512_des3_ede_cbc_enc_tv_temp)
2500                         }
2501                 }
2502         }, {
2503                 .alg = "authenc(hmac(sha512),ctr(aes))",
2504                 .test = alg_test_null,
2505                 .fips_allowed = 1,
2506         }, {
2507                 .alg = "authenc(hmac(sha512),rfc3686(ctr(aes)))",
2508                 .test = alg_test_null,
2509                 .fips_allowed = 1,
2510         }, {
2511                 .alg = "cbc(aes)",
2512                 .test = alg_test_skcipher,
2513                 .fips_allowed = 1,
2514                 .suite = {
2515                         .cipher = {
2516                                 .enc = __VECS(aes_cbc_enc_tv_template),
2517                                 .dec = __VECS(aes_cbc_dec_tv_template)
2518                         }
2519                 }
2520         }, {
2521                 .alg = "cbc(anubis)",
2522                 .test = alg_test_skcipher,
2523                 .suite = {
2524                         .cipher = {
2525                                 .enc = __VECS(anubis_cbc_enc_tv_template),
2526                                 .dec = __VECS(anubis_cbc_dec_tv_template)
2527                         }
2528                 }
2529         }, {
2530                 .alg = "cbc(blowfish)",
2531                 .test = alg_test_skcipher,
2532                 .suite = {
2533                         .cipher = {
2534                                 .enc = __VECS(bf_cbc_enc_tv_template),
2535                                 .dec = __VECS(bf_cbc_dec_tv_template)
2536                         }
2537                 }
2538         }, {
2539                 .alg = "cbc(camellia)",
2540                 .test = alg_test_skcipher,
2541                 .suite = {
2542                         .cipher = {
2543                                 .enc = __VECS(camellia_cbc_enc_tv_template),
2544                                 .dec = __VECS(camellia_cbc_dec_tv_template)
2545                         }
2546                 }
2547         }, {
2548                 .alg = "cbc(cast5)",
2549                 .test = alg_test_skcipher,
2550                 .suite = {
2551                         .cipher = {
2552                                 .enc = __VECS(cast5_cbc_enc_tv_template),
2553                                 .dec = __VECS(cast5_cbc_dec_tv_template)
2554                         }
2555                 }
2556         }, {
2557                 .alg = "cbc(cast6)",
2558                 .test = alg_test_skcipher,
2559                 .suite = {
2560                         .cipher = {
2561                                 .enc = __VECS(cast6_cbc_enc_tv_template),
2562                                 .dec = __VECS(cast6_cbc_dec_tv_template)
2563                         }
2564                 }
2565         }, {
2566                 .alg = "cbc(des)",
2567                 .test = alg_test_skcipher,
2568                 .suite = {
2569                         .cipher = {
2570                                 .enc = __VECS(des_cbc_enc_tv_template),
2571                                 .dec = __VECS(des_cbc_dec_tv_template)
2572                         }
2573                 }
2574         }, {
2575                 .alg = "cbc(des3_ede)",
2576                 .test = alg_test_skcipher,
2577                 .fips_allowed = 1,
2578                 .suite = {
2579                         .cipher = {
2580                                 .enc = __VECS(des3_ede_cbc_enc_tv_template),
2581                                 .dec = __VECS(des3_ede_cbc_dec_tv_template)
2582                         }
2583                 }
2584         }, {
2585                 /* Same as cbc(aes) except the key is stored in
2586                  * hardware secure memory which we reference by index
2587                  */
2588                 .alg = "cbc(paes)",
2589                 .test = alg_test_null,
2590                 .fips_allowed = 1,
2591         }, {
2592                 .alg = "cbc(serpent)",
2593                 .test = alg_test_skcipher,
2594                 .suite = {
2595                         .cipher = {
2596                                 .enc = __VECS(serpent_cbc_enc_tv_template),
2597                                 .dec = __VECS(serpent_cbc_dec_tv_template)
2598                         }
2599                 }
2600         }, {
2601                 .alg = "cbc(twofish)",
2602                 .test = alg_test_skcipher,
2603                 .suite = {
2604                         .cipher = {
2605                                 .enc = __VECS(tf_cbc_enc_tv_template),
2606                                 .dec = __VECS(tf_cbc_dec_tv_template)
2607                         }
2608                 }
2609         }, {
2610                 .alg = "cbcmac(aes)",
2611                 .fips_allowed = 1,
2612                 .test = alg_test_hash,
2613                 .suite = {
2614                         .hash = __VECS(aes_cbcmac_tv_template)
2615                 }
2616         }, {
2617                 .alg = "ccm(aes)",
2618                 .test = alg_test_aead,
2619                 .fips_allowed = 1,
2620                 .suite = {
2621                         .aead = {
2622                                 .enc = __VECS(aes_ccm_enc_tv_template),
2623                                 .dec = __VECS(aes_ccm_dec_tv_template)
2624                         }
2625                 }
2626         }, {
2627                 .alg = "chacha20",
2628                 .test = alg_test_skcipher,
2629                 .suite = {
2630                         .cipher = {
2631                                 .enc = __VECS(chacha20_enc_tv_template),
2632                                 .dec = __VECS(chacha20_enc_tv_template),
2633                         }
2634                 }
2635         }, {
2636                 .alg = "cmac(aes)",
2637                 .fips_allowed = 1,
2638                 .test = alg_test_hash,
2639                 .suite = {
2640                         .hash = __VECS(aes_cmac128_tv_template)
2641                 }
2642         }, {
2643                 .alg = "cmac(des3_ede)",
2644                 .fips_allowed = 1,
2645                 .test = alg_test_hash,
2646                 .suite = {
2647                         .hash = __VECS(des3_ede_cmac64_tv_template)
2648                 }
2649         }, {
2650                 .alg = "compress_null",
2651                 .test = alg_test_null,
2652         }, {
2653                 .alg = "crc32",
2654                 .test = alg_test_hash,
2655                 .suite = {
2656                         .hash = __VECS(crc32_tv_template)
2657                 }
2658         }, {
2659                 .alg = "crc32c",
2660                 .test = alg_test_crc32c,
2661                 .fips_allowed = 1,
2662                 .suite = {
2663                         .hash = __VECS(crc32c_tv_template)
2664                 }
2665         }, {
2666                 .alg = "crct10dif",
2667                 .test = alg_test_hash,
2668                 .fips_allowed = 1,
2669                 .suite = {
2670                         .hash = __VECS(crct10dif_tv_template)
2671                 }
2672         }, {
2673                 .alg = "ctr(aes)",
2674                 .test = alg_test_skcipher,
2675                 .fips_allowed = 1,
2676                 .suite = {
2677                         .cipher = {
2678                                 .enc = __VECS(aes_ctr_enc_tv_template),
2679                                 .dec = __VECS(aes_ctr_dec_tv_template)
2680                         }
2681                 }
2682         }, {
2683                 .alg = "ctr(blowfish)",
2684                 .test = alg_test_skcipher,
2685                 .suite = {
2686                         .cipher = {
2687                                 .enc = __VECS(bf_ctr_enc_tv_template),
2688                                 .dec = __VECS(bf_ctr_dec_tv_template)
2689                         }
2690                 }
2691         }, {
2692                 .alg = "ctr(camellia)",
2693                 .test = alg_test_skcipher,
2694                 .suite = {
2695                         .cipher = {
2696                                 .enc = __VECS(camellia_ctr_enc_tv_template),
2697                                 .dec = __VECS(camellia_ctr_dec_tv_template)
2698                         }
2699                 }
2700         }, {
2701                 .alg = "ctr(cast5)",
2702                 .test = alg_test_skcipher,
2703                 .suite = {
2704                         .cipher = {
2705                                 .enc = __VECS(cast5_ctr_enc_tv_template),
2706                                 .dec = __VECS(cast5_ctr_dec_tv_template)
2707                         }
2708                 }
2709         }, {
2710                 .alg = "ctr(cast6)",
2711                 .test = alg_test_skcipher,
2712                 .suite = {
2713                         .cipher = {
2714                                 .enc = __VECS(cast6_ctr_enc_tv_template),
2715                                 .dec = __VECS(cast6_ctr_dec_tv_template)
2716                         }
2717                 }
2718         }, {
2719                 .alg = "ctr(des)",
2720                 .test = alg_test_skcipher,
2721                 .suite = {
2722                         .cipher = {
2723                                 .enc = __VECS(des_ctr_enc_tv_template),
2724                                 .dec = __VECS(des_ctr_dec_tv_template)
2725                         }
2726                 }
2727         }, {
2728                 .alg = "ctr(des3_ede)",
2729                 .test = alg_test_skcipher,
2730                 .fips_allowed = 1,
2731                 .suite = {
2732                         .cipher = {
2733                                 .enc = __VECS(des3_ede_ctr_enc_tv_template),
2734                                 .dec = __VECS(des3_ede_ctr_dec_tv_template)
2735                         }
2736                 }
2737         }, {
2738                 /* Same as ctr(aes) except the key is stored in
2739                  * hardware secure memory which we reference by index
2740                  */
2741                 .alg = "ctr(paes)",
2742                 .test = alg_test_null,
2743                 .fips_allowed = 1,
2744         }, {
2745                 .alg = "ctr(serpent)",
2746                 .test = alg_test_skcipher,
2747                 .suite = {
2748                         .cipher = {
2749                                 .enc = __VECS(serpent_ctr_enc_tv_template),
2750                                 .dec = __VECS(serpent_ctr_dec_tv_template)
2751                         }
2752                 }
2753         }, {
2754                 .alg = "ctr(twofish)",
2755                 .test = alg_test_skcipher,
2756                 .suite = {
2757                         .cipher = {
2758                                 .enc = __VECS(tf_ctr_enc_tv_template),
2759                                 .dec = __VECS(tf_ctr_dec_tv_template)
2760                         }
2761                 }
2762         }, {
2763                 .alg = "cts(cbc(aes))",
2764                 .test = alg_test_skcipher,
2765                 .suite = {
2766                         .cipher = {
2767                                 .enc = __VECS(cts_mode_enc_tv_template),
2768                                 .dec = __VECS(cts_mode_dec_tv_template)
2769                         }
2770                 }
2771         }, {
2772                 .alg = "deflate",
2773                 .test = alg_test_comp,
2774                 .fips_allowed = 1,
2775                 .suite = {
2776                         .comp = {
2777                                 .comp = __VECS(deflate_comp_tv_template),
2778                                 .decomp = __VECS(deflate_decomp_tv_template)
2779                         }
2780                 }
2781         }, {
2782                 .alg = "dh",
2783                 .test = alg_test_kpp,
2784                 .fips_allowed = 1,
2785                 .suite = {
2786                         .kpp = __VECS(dh_tv_template)
2787                 }
2788         }, {
2789                 .alg = "digest_null",
2790                 .test = alg_test_null,
2791         }, {
2792                 .alg = "drbg_nopr_ctr_aes128",
2793                 .test = alg_test_drbg,
2794                 .fips_allowed = 1,
2795                 .suite = {
2796                         .drbg = __VECS(drbg_nopr_ctr_aes128_tv_template)
2797                 }
2798         }, {
2799                 .alg = "drbg_nopr_ctr_aes192",
2800                 .test = alg_test_drbg,
2801                 .fips_allowed = 1,
2802                 .suite = {
2803                         .drbg = __VECS(drbg_nopr_ctr_aes192_tv_template)
2804                 }
2805         }, {
2806                 .alg = "drbg_nopr_ctr_aes256",
2807                 .test = alg_test_drbg,
2808                 .fips_allowed = 1,
2809                 .suite = {
2810                         .drbg = __VECS(drbg_nopr_ctr_aes256_tv_template)
2811                 }
2812         }, {
2813                 /*
2814                  * There is no need to specifically test the DRBG with every
2815                  * backend cipher -- covered by drbg_nopr_hmac_sha256 test
2816                  */
2817                 .alg = "drbg_nopr_hmac_sha1",
2818                 .fips_allowed = 1,
2819                 .test = alg_test_null,
2820         }, {
2821                 .alg = "drbg_nopr_hmac_sha256",
2822                 .test = alg_test_drbg,
2823                 .fips_allowed = 1,
2824                 .suite = {
2825                         .drbg = __VECS(drbg_nopr_hmac_sha256_tv_template)
2826                 }
2827         }, {
2828                 /* covered by drbg_nopr_hmac_sha256 test */
2829                 .alg = "drbg_nopr_hmac_sha384",
2830                 .fips_allowed = 1,
2831                 .test = alg_test_null,
2832         }, {
2833                 .alg = "drbg_nopr_hmac_sha512",
2834                 .test = alg_test_null,
2835                 .fips_allowed = 1,
2836         }, {
2837                 .alg = "drbg_nopr_sha1",
2838                 .fips_allowed = 1,
2839                 .test = alg_test_null,
2840         }, {
2841                 .alg = "drbg_nopr_sha256",
2842                 .test = alg_test_drbg,
2843                 .fips_allowed = 1,
2844                 .suite = {
2845                         .drbg = __VECS(drbg_nopr_sha256_tv_template)
2846                 }
2847         }, {
2848                 /* covered by drbg_nopr_sha256 test */
2849                 .alg = "drbg_nopr_sha384",
2850                 .fips_allowed = 1,
2851                 .test = alg_test_null,
2852         }, {
2853                 .alg = "drbg_nopr_sha512",
2854                 .fips_allowed = 1,
2855                 .test = alg_test_null,
2856         }, {
2857                 .alg = "drbg_pr_ctr_aes128",
2858                 .test = alg_test_drbg,
2859                 .fips_allowed = 1,
2860                 .suite = {
2861                         .drbg = __VECS(drbg_pr_ctr_aes128_tv_template)
2862                 }
2863         }, {
2864                 /* covered by drbg_pr_ctr_aes128 test */
2865                 .alg = "drbg_pr_ctr_aes192",
2866                 .fips_allowed = 1,
2867                 .test = alg_test_null,
2868         }, {
2869                 .alg = "drbg_pr_ctr_aes256",
2870                 .fips_allowed = 1,
2871                 .test = alg_test_null,
2872         }, {
2873                 .alg = "drbg_pr_hmac_sha1",
2874                 .fips_allowed = 1,
2875                 .test = alg_test_null,
2876         }, {
2877                 .alg = "drbg_pr_hmac_sha256",
2878                 .test = alg_test_drbg,
2879                 .fips_allowed = 1,
2880                 .suite = {
2881                         .drbg = __VECS(drbg_pr_hmac_sha256_tv_template)
2882                 }
2883         }, {
2884                 /* covered by drbg_pr_hmac_sha256 test */
2885                 .alg = "drbg_pr_hmac_sha384",
2886                 .fips_allowed = 1,
2887                 .test = alg_test_null,
2888         }, {
2889                 .alg = "drbg_pr_hmac_sha512",
2890                 .test = alg_test_null,
2891                 .fips_allowed = 1,
2892         }, {
2893                 .alg = "drbg_pr_sha1",
2894                 .fips_allowed = 1,
2895                 .test = alg_test_null,
2896         }, {
2897                 .alg = "drbg_pr_sha256",
2898                 .test = alg_test_drbg,
2899                 .fips_allowed = 1,
2900                 .suite = {
2901                         .drbg = __VECS(drbg_pr_sha256_tv_template)
2902                 }
2903         }, {
2904                 /* covered by drbg_pr_sha256 test */
2905                 .alg = "drbg_pr_sha384",
2906                 .fips_allowed = 1,
2907                 .test = alg_test_null,
2908         }, {
2909                 .alg = "drbg_pr_sha512",
2910                 .fips_allowed = 1,
2911                 .test = alg_test_null,
2912         }, {
2913                 .alg = "ecb(aes)",
2914                 .test = alg_test_skcipher,
2915                 .fips_allowed = 1,
2916                 .suite = {
2917                         .cipher = {
2918                                 .enc = __VECS(aes_enc_tv_template),
2919                                 .dec = __VECS(aes_dec_tv_template)
2920                         }
2921                 }
2922         }, {
2923                 .alg = "ecb(anubis)",
2924                 .test = alg_test_skcipher,
2925                 .suite = {
2926                         .cipher = {
2927                                 .enc = __VECS(anubis_enc_tv_template),
2928                                 .dec = __VECS(anubis_dec_tv_template)
2929                         }
2930                 }
2931         }, {
2932                 .alg = "ecb(arc4)",
2933                 .test = alg_test_skcipher,
2934                 .suite = {
2935                         .cipher = {
2936                                 .enc = __VECS(arc4_enc_tv_template),
2937                                 .dec = __VECS(arc4_dec_tv_template)
2938                         }
2939                 }
2940         }, {
2941                 .alg = "ecb(blowfish)",
2942                 .test = alg_test_skcipher,
2943                 .suite = {
2944                         .cipher = {
2945                                 .enc = __VECS(bf_enc_tv_template),
2946                                 .dec = __VECS(bf_dec_tv_template)
2947                         }
2948                 }
2949         }, {
2950                 .alg = "ecb(camellia)",
2951                 .test = alg_test_skcipher,
2952                 .suite = {
2953                         .cipher = {
2954                                 .enc = __VECS(camellia_enc_tv_template),
2955                                 .dec = __VECS(camellia_dec_tv_template)
2956                         }
2957                 }
2958         }, {
2959                 .alg = "ecb(cast5)",
2960                 .test = alg_test_skcipher,
2961                 .suite = {
2962                         .cipher = {
2963                                 .enc = __VECS(cast5_enc_tv_template),
2964                                 .dec = __VECS(cast5_dec_tv_template)
2965                         }
2966                 }
2967         }, {
2968                 .alg = "ecb(cast6)",
2969                 .test = alg_test_skcipher,
2970                 .suite = {
2971                         .cipher = {
2972                                 .enc = __VECS(cast6_enc_tv_template),
2973                                 .dec = __VECS(cast6_dec_tv_template)
2974                         }
2975                 }
2976         }, {
2977                 .alg = "ecb(cipher_null)",
2978                 .test = alg_test_null,
2979                 .fips_allowed = 1,
2980         }, {
2981                 .alg = "ecb(des)",
2982                 .test = alg_test_skcipher,
2983                 .suite = {
2984                         .cipher = {
2985                                 .enc = __VECS(des_enc_tv_template),
2986                                 .dec = __VECS(des_dec_tv_template)
2987                         }
2988                 }
2989         }, {
2990                 .alg = "ecb(des3_ede)",
2991                 .test = alg_test_skcipher,
2992                 .fips_allowed = 1,
2993                 .suite = {
2994                         .cipher = {
2995                                 .enc = __VECS(des3_ede_enc_tv_template),
2996                                 .dec = __VECS(des3_ede_dec_tv_template)
2997                         }
2998                 }
2999         }, {
3000                 .alg = "ecb(fcrypt)",
3001                 .test = alg_test_skcipher,
3002                 .suite = {
3003                         .cipher = {
3004                                 .enc = {
3005                                         .vecs = fcrypt_pcbc_enc_tv_template,
3006                                         .count = 1
3007                                 },
3008                                 .dec = {
3009                                         .vecs = fcrypt_pcbc_dec_tv_template,
3010                                         .count = 1
3011                                 }
3012                         }
3013                 }
3014         }, {
3015                 .alg = "ecb(khazad)",
3016                 .test = alg_test_skcipher,
3017                 .suite = {
3018                         .cipher = {
3019                                 .enc = __VECS(khazad_enc_tv_template),
3020                                 .dec = __VECS(khazad_dec_tv_template)
3021                         }
3022                 }
3023         }, {
3024                 /* Same as ecb(aes) except the key is stored in
3025                  * hardware secure memory which we reference by index
3026                  */
3027                 .alg = "ecb(paes)",
3028                 .test = alg_test_null,
3029                 .fips_allowed = 1,
3030         }, {
3031                 .alg = "ecb(seed)",
3032                 .test = alg_test_skcipher,
3033                 .suite = {
3034                         .cipher = {
3035                                 .enc = __VECS(seed_enc_tv_template),
3036                                 .dec = __VECS(seed_dec_tv_template)
3037                         }
3038                 }
3039         }, {
3040                 .alg = "ecb(serpent)",
3041                 .test = alg_test_skcipher,
3042                 .suite = {
3043                         .cipher = {
3044                                 .enc = __VECS(serpent_enc_tv_template),
3045                                 .dec = __VECS(serpent_dec_tv_template)
3046                         }
3047                 }
3048         }, {
3049                 .alg = "ecb(sm4)",
3050                 .test = alg_test_skcipher,
3051                 .suite = {
3052                         .cipher = {
3053                                 .enc = __VECS(sm4_enc_tv_template),
3054                                 .dec = __VECS(sm4_dec_tv_template)
3055                         }
3056                 }
3057         }, {
3058                 .alg = "ecb(speck128)",
3059                 .test = alg_test_skcipher,
3060                 .suite = {
3061                         .cipher = {
3062                                 .enc = __VECS(speck128_enc_tv_template),
3063                                 .dec = __VECS(speck128_dec_tv_template)
3064                         }
3065                 }
3066         }, {
3067                 .alg = "ecb(speck64)",
3068                 .test = alg_test_skcipher,
3069                 .suite = {
3070                         .cipher = {
3071                                 .enc = __VECS(speck64_enc_tv_template),
3072                                 .dec = __VECS(speck64_dec_tv_template)
3073                         }
3074                 }
3075         }, {
3076                 .alg = "ecb(tea)",
3077                 .test = alg_test_skcipher,
3078                 .suite = {
3079                         .cipher = {
3080                                 .enc = __VECS(tea_enc_tv_template),
3081                                 .dec = __VECS(tea_dec_tv_template)
3082                         }
3083                 }
3084         }, {
3085                 .alg = "ecb(tnepres)",
3086                 .test = alg_test_skcipher,
3087                 .suite = {
3088                         .cipher = {
3089                                 .enc = __VECS(tnepres_enc_tv_template),
3090                                 .dec = __VECS(tnepres_dec_tv_template)
3091                         }
3092                 }
3093         }, {
3094                 .alg = "ecb(twofish)",
3095                 .test = alg_test_skcipher,
3096                 .suite = {
3097                         .cipher = {
3098                                 .enc = __VECS(tf_enc_tv_template),
3099                                 .dec = __VECS(tf_dec_tv_template)
3100                         }
3101                 }
3102         }, {
3103                 .alg = "ecb(xeta)",
3104                 .test = alg_test_skcipher,
3105                 .suite = {
3106                         .cipher = {
3107                                 .enc = __VECS(xeta_enc_tv_template),
3108                                 .dec = __VECS(xeta_dec_tv_template)
3109                         }
3110                 }
3111         }, {
3112                 .alg = "ecb(xtea)",
3113                 .test = alg_test_skcipher,
3114                 .suite = {
3115                         .cipher = {
3116                                 .enc = __VECS(xtea_enc_tv_template),
3117                                 .dec = __VECS(xtea_dec_tv_template)
3118                         }
3119                 }
3120         }, {
3121                 .alg = "ecdh",
3122                 .test = alg_test_kpp,
3123                 .fips_allowed = 1,
3124                 .suite = {
3125                         .kpp = __VECS(ecdh_tv_template)
3126                 }
3127         }, {
3128                 .alg = "gcm(aes)",
3129                 .test = alg_test_aead,
3130                 .fips_allowed = 1,
3131                 .suite = {
3132                         .aead = {
3133                                 .enc = __VECS(aes_gcm_enc_tv_template),
3134                                 .dec = __VECS(aes_gcm_dec_tv_template)
3135                         }
3136                 }
3137         }, {
3138                 .alg = "ghash",
3139                 .test = alg_test_hash,
3140                 .fips_allowed = 1,
3141                 .suite = {
3142                         .hash = __VECS(ghash_tv_template)
3143                 }
3144         }, {
3145                 .alg = "hmac(crc32)",
3146                 .test = alg_test_hash,
3147                 .suite = {
3148                         .hash = __VECS(bfin_crc_tv_template)
3149                 }
3150         }, {
3151                 .alg = "hmac(md5)",
3152                 .test = alg_test_hash,
3153                 .suite = {
3154                         .hash = __VECS(hmac_md5_tv_template)
3155                 }
3156         }, {
3157                 .alg = "hmac(rmd128)",
3158                 .test = alg_test_hash,
3159                 .suite = {
3160                         .hash = __VECS(hmac_rmd128_tv_template)
3161                 }
3162         }, {
3163                 .alg = "hmac(rmd160)",
3164                 .test = alg_test_hash,
3165                 .suite = {
3166                         .hash = __VECS(hmac_rmd160_tv_template)
3167                 }
3168         }, {
3169                 .alg = "hmac(sha1)",
3170                 .test = alg_test_hash,
3171                 .fips_allowed = 1,
3172                 .suite = {
3173                         .hash = __VECS(hmac_sha1_tv_template)
3174                 }
3175         }, {
3176                 .alg = "hmac(sha224)",
3177                 .test = alg_test_hash,
3178                 .fips_allowed = 1,
3179                 .suite = {
3180                         .hash = __VECS(hmac_sha224_tv_template)
3181                 }
3182         }, {
3183                 .alg = "hmac(sha256)",
3184                 .test = alg_test_hash,
3185                 .fips_allowed = 1,
3186                 .suite = {
3187                         .hash = __VECS(hmac_sha256_tv_template)
3188                 }
3189         }, {
3190                 .alg = "hmac(sha3-224)",
3191                 .test = alg_test_hash,
3192                 .fips_allowed = 1,
3193                 .suite = {
3194                         .hash = __VECS(hmac_sha3_224_tv_template)
3195                 }
3196         }, {
3197                 .alg = "hmac(sha3-256)",
3198                 .test = alg_test_hash,
3199                 .fips_allowed = 1,
3200                 .suite = {
3201                         .hash = __VECS(hmac_sha3_256_tv_template)
3202                 }
3203         }, {
3204                 .alg = "hmac(sha3-384)",
3205                 .test = alg_test_hash,
3206                 .fips_allowed = 1,
3207                 .suite = {
3208                         .hash = __VECS(hmac_sha3_384_tv_template)
3209                 }
3210         }, {
3211                 .alg = "hmac(sha3-512)",
3212                 .test = alg_test_hash,
3213                 .fips_allowed = 1,
3214                 .suite = {
3215                         .hash = __VECS(hmac_sha3_512_tv_template)
3216                 }
3217         }, {
3218                 .alg = "hmac(sha384)",
3219                 .test = alg_test_hash,
3220                 .fips_allowed = 1,
3221                 .suite = {
3222                         .hash = __VECS(hmac_sha384_tv_template)
3223                 }
3224         }, {
3225                 .alg = "hmac(sha512)",
3226                 .test = alg_test_hash,
3227                 .fips_allowed = 1,
3228                 .suite = {
3229                         .hash = __VECS(hmac_sha512_tv_template)
3230                 }
3231         }, {
3232                 .alg = "jitterentropy_rng",
3233                 .fips_allowed = 1,
3234                 .test = alg_test_null,
3235         }, {
3236                 .alg = "kw(aes)",
3237                 .test = alg_test_skcipher,
3238                 .fips_allowed = 1,
3239                 .suite = {
3240                         .cipher = {
3241                                 .enc = __VECS(aes_kw_enc_tv_template),
3242                                 .dec = __VECS(aes_kw_dec_tv_template)
3243                         }
3244                 }
3245         }, {
3246                 .alg = "lrw(aes)",
3247                 .test = alg_test_skcipher,
3248                 .suite = {
3249                         .cipher = {
3250                                 .enc = __VECS(aes_lrw_enc_tv_template),
3251                                 .dec = __VECS(aes_lrw_dec_tv_template)
3252                         }
3253                 }
3254         }, {
3255                 .alg = "lrw(camellia)",
3256                 .test = alg_test_skcipher,
3257                 .suite = {
3258                         .cipher = {
3259                                 .enc = __VECS(camellia_lrw_enc_tv_template),
3260                                 .dec = __VECS(camellia_lrw_dec_tv_template)
3261                         }
3262                 }
3263         }, {
3264                 .alg = "lrw(cast6)",
3265                 .test = alg_test_skcipher,
3266                 .suite = {
3267                         .cipher = {
3268                                 .enc = __VECS(cast6_lrw_enc_tv_template),
3269                                 .dec = __VECS(cast6_lrw_dec_tv_template)
3270                         }
3271                 }
3272         }, {
3273                 .alg = "lrw(serpent)",
3274                 .test = alg_test_skcipher,
3275                 .suite = {
3276                         .cipher = {
3277                                 .enc = __VECS(serpent_lrw_enc_tv_template),
3278                                 .dec = __VECS(serpent_lrw_dec_tv_template)
3279                         }
3280                 }
3281         }, {
3282                 .alg = "lrw(twofish)",
3283                 .test = alg_test_skcipher,
3284                 .suite = {
3285                         .cipher = {
3286                                 .enc = __VECS(tf_lrw_enc_tv_template),
3287                                 .dec = __VECS(tf_lrw_dec_tv_template)
3288                         }
3289                 }
3290         }, {
3291                 .alg = "lz4",
3292                 .test = alg_test_comp,
3293                 .fips_allowed = 1,
3294                 .suite = {
3295                         .comp = {
3296                                 .comp = __VECS(lz4_comp_tv_template),
3297                                 .decomp = __VECS(lz4_decomp_tv_template)
3298                         }
3299                 }
3300         }, {
3301                 .alg = "lz4hc",
3302                 .test = alg_test_comp,
3303                 .fips_allowed = 1,
3304                 .suite = {
3305                         .comp = {
3306                                 .comp = __VECS(lz4hc_comp_tv_template),
3307                                 .decomp = __VECS(lz4hc_decomp_tv_template)
3308                         }
3309                 }
3310         }, {
3311                 .alg = "lzo",
3312                 .test = alg_test_comp,
3313                 .fips_allowed = 1,
3314                 .suite = {
3315                         .comp = {
3316                                 .comp = __VECS(lzo_comp_tv_template),
3317                                 .decomp = __VECS(lzo_decomp_tv_template)
3318                         }
3319                 }
3320         }, {
3321                 .alg = "md4",
3322                 .test = alg_test_hash,
3323                 .suite = {
3324                         .hash = __VECS(md4_tv_template)
3325                 }
3326         }, {
3327                 .alg = "md5",
3328                 .test = alg_test_hash,
3329                 .suite = {
3330                         .hash = __VECS(md5_tv_template)
3331                 }
3332         }, {
3333                 .alg = "michael_mic",
3334                 .test = alg_test_hash,
3335                 .suite = {
3336                         .hash = __VECS(michael_mic_tv_template)
3337                 }
3338         }, {
3339                 .alg = "ofb(aes)",
3340                 .test = alg_test_skcipher,
3341                 .fips_allowed = 1,
3342                 .suite = {
3343                         .cipher = {
3344                                 .enc = __VECS(aes_ofb_enc_tv_template),
3345                                 .dec = __VECS(aes_ofb_dec_tv_template)
3346                         }
3347                 }
3348         }, {
3349                 /* Same as ofb(aes) except the key is stored in
3350                  * hardware secure memory which we reference by index
3351                  */
3352                 .alg = "ofb(paes)",
3353                 .test = alg_test_null,
3354                 .fips_allowed = 1,
3355         }, {
3356                 .alg = "pcbc(fcrypt)",
3357                 .test = alg_test_skcipher,
3358                 .suite = {
3359                         .cipher = {
3360                                 .enc = __VECS(fcrypt_pcbc_enc_tv_template),
3361                                 .dec = __VECS(fcrypt_pcbc_dec_tv_template)
3362                         }
3363                 }
3364         }, {
3365                 .alg = "pkcs1pad(rsa,sha224)",
3366                 .test = alg_test_null,
3367                 .fips_allowed = 1,
3368         }, {
3369                 .alg = "pkcs1pad(rsa,sha256)",
3370                 .test = alg_test_akcipher,
3371                 .fips_allowed = 1,
3372                 .suite = {
3373                         .akcipher = __VECS(pkcs1pad_rsa_tv_template)
3374                 }
3375         }, {
3376                 .alg = "pkcs1pad(rsa,sha384)",
3377                 .test = alg_test_null,
3378                 .fips_allowed = 1,
3379         }, {
3380                 .alg = "pkcs1pad(rsa,sha512)",
3381                 .test = alg_test_null,
3382                 .fips_allowed = 1,
3383         }, {
3384                 .alg = "poly1305",
3385                 .test = alg_test_hash,
3386                 .suite = {
3387                         .hash = __VECS(poly1305_tv_template)
3388                 }
3389         }, {
3390                 .alg = "rfc3686(ctr(aes))",
3391                 .test = alg_test_skcipher,
3392                 .fips_allowed = 1,
3393                 .suite = {
3394                         .cipher = {
3395                                 .enc = __VECS(aes_ctr_rfc3686_enc_tv_template),
3396                                 .dec = __VECS(aes_ctr_rfc3686_dec_tv_template)
3397                         }
3398                 }
3399         }, {
3400                 .alg = "rfc4106(gcm(aes))",
3401                 .test = alg_test_aead,
3402                 .fips_allowed = 1,
3403                 .suite = {
3404                         .aead = {
3405                                 .enc = __VECS(aes_gcm_rfc4106_enc_tv_template),
3406                                 .dec = __VECS(aes_gcm_rfc4106_dec_tv_template)
3407                         }
3408                 }
3409         }, {
3410                 .alg = "rfc4309(ccm(aes))",
3411                 .test = alg_test_aead,
3412                 .fips_allowed = 1,
3413                 .suite = {
3414                         .aead = {
3415                                 .enc = __VECS(aes_ccm_rfc4309_enc_tv_template),
3416                                 .dec = __VECS(aes_ccm_rfc4309_dec_tv_template)
3417                         }
3418                 }
3419         }, {
3420                 .alg = "rfc4543(gcm(aes))",
3421                 .test = alg_test_aead,
3422                 .suite = {
3423                         .aead = {
3424                                 .enc = __VECS(aes_gcm_rfc4543_enc_tv_template),
3425                                 .dec = __VECS(aes_gcm_rfc4543_dec_tv_template),
3426                         }
3427                 }
3428         }, {
3429                 .alg = "rfc7539(chacha20,poly1305)",
3430                 .test = alg_test_aead,
3431                 .suite = {
3432                         .aead = {
3433                                 .enc = __VECS(rfc7539_enc_tv_template),
3434                                 .dec = __VECS(rfc7539_dec_tv_template),
3435                         }
3436                 }
3437         }, {
3438                 .alg = "rfc7539esp(chacha20,poly1305)",
3439                 .test = alg_test_aead,
3440                 .suite = {
3441                         .aead = {
3442                                 .enc = __VECS(rfc7539esp_enc_tv_template),
3443                                 .dec = __VECS(rfc7539esp_dec_tv_template),
3444                         }
3445                 }
3446         }, {
3447                 .alg = "rmd128",
3448                 .test = alg_test_hash,
3449                 .suite = {
3450                         .hash = __VECS(rmd128_tv_template)
3451                 }
3452         }, {
3453                 .alg = "rmd160",
3454                 .test = alg_test_hash,
3455                 .suite = {
3456                         .hash = __VECS(rmd160_tv_template)
3457                 }
3458         }, {
3459                 .alg = "rmd256",
3460                 .test = alg_test_hash,
3461                 .suite = {
3462                         .hash = __VECS(rmd256_tv_template)
3463                 }
3464         }, {
3465                 .alg = "rmd320",
3466                 .test = alg_test_hash,
3467                 .suite = {
3468                         .hash = __VECS(rmd320_tv_template)
3469                 }
3470         }, {
3471                 .alg = "rsa",
3472                 .test = alg_test_akcipher,
3473                 .fips_allowed = 1,
3474                 .suite = {
3475                         .akcipher = __VECS(rsa_tv_template)
3476                 }
3477         }, {
3478                 .alg = "salsa20",
3479                 .test = alg_test_skcipher,
3480                 .suite = {
3481                         .cipher = {
3482                                 .enc = __VECS(salsa20_stream_enc_tv_template)
3483                         }
3484                 }
3485         }, {
3486                 .alg = "sha1",
3487                 .test = alg_test_hash,
3488                 .fips_allowed = 1,
3489                 .suite = {
3490                         .hash = __VECS(sha1_tv_template)
3491                 }
3492         }, {
3493                 .alg = "sha224",
3494                 .test = alg_test_hash,
3495                 .fips_allowed = 1,
3496                 .suite = {
3497                         .hash = __VECS(sha224_tv_template)
3498                 }
3499         }, {
3500                 .alg = "sha256",
3501                 .test = alg_test_hash,
3502                 .fips_allowed = 1,
3503                 .suite = {
3504                         .hash = __VECS(sha256_tv_template)
3505                 }
3506         }, {
3507                 .alg = "sha3-224",
3508                 .test = alg_test_hash,
3509                 .fips_allowed = 1,
3510                 .suite = {
3511                         .hash = __VECS(sha3_224_tv_template)
3512                 }
3513         }, {
3514                 .alg = "sha3-256",
3515                 .test = alg_test_hash,
3516                 .fips_allowed = 1,
3517                 .suite = {
3518                         .hash = __VECS(sha3_256_tv_template)
3519                 }
3520         }, {
3521                 .alg = "sha3-384",
3522                 .test = alg_test_hash,
3523                 .fips_allowed = 1,
3524                 .suite = {
3525                         .hash = __VECS(sha3_384_tv_template)
3526                 }
3527         }, {
3528                 .alg = "sha3-512",
3529                 .test = alg_test_hash,
3530                 .fips_allowed = 1,
3531                 .suite = {
3532                         .hash = __VECS(sha3_512_tv_template)
3533                 }
3534         }, {
3535                 .alg = "sha384",
3536                 .test = alg_test_hash,
3537                 .fips_allowed = 1,
3538                 .suite = {
3539                         .hash = __VECS(sha384_tv_template)
3540                 }
3541         }, {
3542                 .alg = "sha512",
3543                 .test = alg_test_hash,
3544                 .fips_allowed = 1,
3545                 .suite = {
3546                         .hash = __VECS(sha512_tv_template)
3547                 }
3548         }, {
3549                 .alg = "sm3",
3550                 .test = alg_test_hash,
3551                 .suite = {
3552                         .hash = __VECS(sm3_tv_template)
3553                 }
3554         }, {
3555                 .alg = "tgr128",
3556                 .test = alg_test_hash,
3557                 .suite = {
3558                         .hash = __VECS(tgr128_tv_template)
3559                 }
3560         }, {
3561                 .alg = "tgr160",
3562                 .test = alg_test_hash,
3563                 .suite = {
3564                         .hash = __VECS(tgr160_tv_template)
3565                 }
3566         }, {
3567                 .alg = "tgr192",
3568                 .test = alg_test_hash,
3569                 .suite = {
3570                         .hash = __VECS(tgr192_tv_template)
3571                 }
3572         }, {
3573                 .alg = "vmac(aes)",
3574                 .test = alg_test_hash,
3575                 .suite = {
3576                         .hash = __VECS(aes_vmac128_tv_template)
3577                 }
3578         }, {
3579                 .alg = "wp256",
3580                 .test = alg_test_hash,
3581                 .suite = {
3582                         .hash = __VECS(wp256_tv_template)
3583                 }
3584         }, {
3585                 .alg = "wp384",
3586                 .test = alg_test_hash,
3587                 .suite = {
3588                         .hash = __VECS(wp384_tv_template)
3589                 }
3590         }, {
3591                 .alg = "wp512",
3592                 .test = alg_test_hash,
3593                 .suite = {
3594                         .hash = __VECS(wp512_tv_template)
3595                 }
3596         }, {
3597                 .alg = "xcbc(aes)",
3598                 .test = alg_test_hash,
3599                 .suite = {
3600                         .hash = __VECS(aes_xcbc128_tv_template)
3601                 }
3602         }, {
3603                 .alg = "xts(aes)",
3604                 .test = alg_test_skcipher,
3605                 .fips_allowed = 1,
3606                 .suite = {
3607                         .cipher = {
3608                                 .enc = __VECS(aes_xts_enc_tv_template),
3609                                 .dec = __VECS(aes_xts_dec_tv_template)
3610                         }
3611                 }
3612         }, {
3613                 .alg = "xts(camellia)",
3614                 .test = alg_test_skcipher,
3615                 .suite = {
3616                         .cipher = {
3617                                 .enc = __VECS(camellia_xts_enc_tv_template),
3618                                 .dec = __VECS(camellia_xts_dec_tv_template)
3619                         }
3620                 }
3621         }, {
3622                 .alg = "xts(cast6)",
3623                 .test = alg_test_skcipher,
3624                 .suite = {
3625                         .cipher = {
3626                                 .enc = __VECS(cast6_xts_enc_tv_template),
3627                                 .dec = __VECS(cast6_xts_dec_tv_template)
3628                         }
3629                 }
3630         }, {
3631                 /* Same as xts(aes) except the key is stored in
3632                  * hardware secure memory which we reference by index
3633                  */
3634                 .alg = "xts(paes)",
3635                 .test = alg_test_null,
3636                 .fips_allowed = 1,
3637         }, {
3638                 .alg = "xts(serpent)",
3639                 .test = alg_test_skcipher,
3640                 .suite = {
3641                         .cipher = {
3642                                 .enc = __VECS(serpent_xts_enc_tv_template),
3643                                 .dec = __VECS(serpent_xts_dec_tv_template)
3644                         }
3645                 }
3646         }, {
3647                 .alg = "xts(speck128)",
3648                 .test = alg_test_skcipher,
3649                 .suite = {
3650                         .cipher = {
3651                                 .enc = __VECS(speck128_xts_enc_tv_template),
3652                                 .dec = __VECS(speck128_xts_dec_tv_template)
3653                         }
3654                 }
3655         }, {
3656                 .alg = "xts(speck64)",
3657                 .test = alg_test_skcipher,
3658                 .suite = {
3659                         .cipher = {
3660                                 .enc = __VECS(speck64_xts_enc_tv_template),
3661                                 .dec = __VECS(speck64_xts_dec_tv_template)
3662                         }
3663                 }
3664         }, {
3665                 .alg = "xts(twofish)",
3666                 .test = alg_test_skcipher,
3667                 .suite = {
3668                         .cipher = {
3669                                 .enc = __VECS(tf_xts_enc_tv_template),
3670                                 .dec = __VECS(tf_xts_dec_tv_template)
3671                         }
3672                 }
3673         }, {
3674                 .alg = "xts4096(paes)",
3675                 .test = alg_test_null,
3676                 .fips_allowed = 1,
3677         }, {
3678                 .alg = "xts512(paes)",
3679                 .test = alg_test_null,
3680                 .fips_allowed = 1,
3681         }, {
3682                 .alg = "zlib-deflate",
3683                 .test = alg_test_comp,
3684                 .fips_allowed = 1,
3685                 .suite = {
3686                         .comp = {
3687                                 .comp = __VECS(zlib_deflate_comp_tv_template),
3688                                 .decomp = __VECS(zlib_deflate_decomp_tv_template)
3689                         }
3690                 }
3691         }, {
3692                 .alg = "zstd",
3693                 .test = alg_test_comp,
3694                 .fips_allowed = 1,
3695                 .suite = {
3696                         .comp = {
3697                                 .comp = __VECS(zstd_comp_tv_template),
3698                                 .decomp = __VECS(zstd_decomp_tv_template)
3699                         }
3700                 }
3701         }
3702 };
3703
3704 static bool alg_test_descs_checked;
3705
3706 static void alg_test_descs_check_order(void)
3707 {
3708         int i;
3709
3710         /* only check once */
3711         if (alg_test_descs_checked)
3712                 return;
3713
3714         alg_test_descs_checked = true;
3715
3716         for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) {
3717                 int diff = strcmp(alg_test_descs[i - 1].alg,
3718                                   alg_test_descs[i].alg);
3719
3720                 if (WARN_ON(diff > 0)) {
3721                         pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n",
3722                                 alg_test_descs[i - 1].alg,
3723                                 alg_test_descs[i].alg);
3724                 }
3725
3726                 if (WARN_ON(diff == 0)) {
3727                         pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n",
3728                                 alg_test_descs[i].alg);
3729                 }
3730         }
3731 }
3732
3733 static int alg_find_test(const char *alg)
3734 {
3735         int start = 0;
3736         int end = ARRAY_SIZE(alg_test_descs);
3737
3738         while (start < end) {
3739                 int i = (start + end) / 2;
3740                 int diff = strcmp(alg_test_descs[i].alg, alg);
3741
3742                 if (diff > 0) {
3743                         end = i;
3744                         continue;
3745                 }
3746
3747                 if (diff < 0) {
3748                         start = i + 1;
3749                         continue;
3750                 }
3751
3752                 return i;
3753         }
3754
3755         return -1;
3756 }
3757
3758 int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
3759 {
3760         int i;
3761         int j;
3762         int rc;
3763
3764         if (!fips_enabled && notests) {
3765                 printk_once(KERN_INFO "alg: self-tests disabled\n");
3766                 return 0;
3767         }
3768
3769         alg_test_descs_check_order();
3770
3771         if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
3772                 char nalg[CRYPTO_MAX_ALG_NAME];
3773
3774                 if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
3775                     sizeof(nalg))
3776                         return -ENAMETOOLONG;
3777
3778                 i = alg_find_test(nalg);
3779                 if (i < 0)
3780                         goto notest;
3781
3782                 if (fips_enabled && !alg_test_descs[i].fips_allowed)
3783                         goto non_fips_alg;
3784
3785                 rc = alg_test_cipher(alg_test_descs + i, driver, type, mask);
3786                 goto test_done;
3787         }
3788
3789         i = alg_find_test(alg);
3790         j = alg_find_test(driver);
3791         if (i < 0 && j < 0)
3792                 goto notest;
3793
3794         if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
3795                              (j >= 0 && !alg_test_descs[j].fips_allowed)))
3796                 goto non_fips_alg;
3797
3798         rc = 0;
3799         if (i >= 0)
3800                 rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
3801                                              type, mask);
3802         if (j >= 0 && j != i)
3803                 rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
3804                                              type, mask);
3805
3806 test_done:
3807         if (fips_enabled && rc)
3808                 panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
3809
3810         if (fips_enabled && !rc)
3811                 pr_info("alg: self-tests for %s (%s) passed\n", driver, alg);
3812
3813         return rc;
3814
3815 notest:
3816         printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
3817         return 0;
3818 non_fips_alg:
3819         return -EINVAL;
3820 }
3821
3822 #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
3823
3824 EXPORT_SYMBOL_GPL(alg_test);