OSDN Git Service

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