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