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