]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - crypto/testmgr.c
Merge tag 'regulator-v3.11-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git...
[karo-tx-linux.git] / crypto / testmgr.c
1 /*
2  * Algorithm testing framework and tests.
3  *
4  * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
5  * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
6  * Copyright (c) 2007 Nokia Siemens Networks
7  * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
8  *
9  * Updated RFC4106 AES-GCM testing.
10  *    Authors: Aidan O'Mahony (aidan.o.mahony@intel.com)
11  *             Adrian Hoban <adrian.hoban@intel.com>
12  *             Gabriele Paoloni <gabriele.paoloni@intel.com>
13  *             Tadeusz Struk (tadeusz.struk@intel.com)
14  *    Copyright (c) 2010, Intel Corporation.
15  *
16  * This program is free software; you can redistribute it and/or modify it
17  * under the terms of the GNU General Public License as published by the Free
18  * Software Foundation; either version 2 of the License, or (at your option)
19  * any later version.
20  *
21  */
22
23 #include <crypto/hash.h>
24 #include <linux/err.h>
25 #include <linux/module.h>
26 #include <linux/scatterlist.h>
27 #include <linux/slab.h>
28 #include <linux/string.h>
29 #include <crypto/rng.h>
30
31 #include "internal.h"
32
33 #ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS
34
35 /* a perfect nop */
36 int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
37 {
38         return 0;
39 }
40
41 #else
42
43 #include "testmgr.h"
44
45 /*
46  * Need slab memory for testing (size in number of pages).
47  */
48 #define XBUFSIZE        8
49
50 /*
51  * Indexes into the xbuf to simulate cross-page access.
52  */
53 #define IDX1            32
54 #define IDX2            32400
55 #define IDX3            1
56 #define IDX4            8193
57 #define IDX5            22222
58 #define IDX6            17101
59 #define IDX7            27333
60 #define IDX8            3000
61
62 /*
63 * Used by test_cipher()
64 */
65 #define ENCRYPT 1
66 #define DECRYPT 0
67
68 struct tcrypt_result {
69         struct completion completion;
70         int err;
71 };
72
73 struct aead_test_suite {
74         struct {
75                 struct aead_testvec *vecs;
76                 unsigned int count;
77         } enc, dec;
78 };
79
80 struct cipher_test_suite {
81         struct {
82                 struct cipher_testvec *vecs;
83                 unsigned int count;
84         } enc, dec;
85 };
86
87 struct comp_test_suite {
88         struct {
89                 struct comp_testvec *vecs;
90                 unsigned int count;
91         } comp, decomp;
92 };
93
94 struct pcomp_test_suite {
95         struct {
96                 struct pcomp_testvec *vecs;
97                 unsigned int count;
98         } comp, decomp;
99 };
100
101 struct hash_test_suite {
102         struct hash_testvec *vecs;
103         unsigned int count;
104 };
105
106 struct cprng_test_suite {
107         struct cprng_testvec *vecs;
108         unsigned int count;
109 };
110
111 struct alg_test_desc {
112         const char *alg;
113         int (*test)(const struct alg_test_desc *desc, const char *driver,
114                     u32 type, u32 mask);
115         int fips_allowed;       /* set if alg is allowed in fips mode */
116
117         union {
118                 struct aead_test_suite aead;
119                 struct cipher_test_suite cipher;
120                 struct comp_test_suite comp;
121                 struct pcomp_test_suite pcomp;
122                 struct hash_test_suite hash;
123                 struct cprng_test_suite cprng;
124         } suite;
125 };
126
127 static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
128
129 static void hexdump(unsigned char *buf, unsigned int len)
130 {
131         print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
132                         16, 1,
133                         buf, len, false);
134 }
135
136 static void tcrypt_complete(struct crypto_async_request *req, int err)
137 {
138         struct tcrypt_result *res = req->data;
139
140         if (err == -EINPROGRESS)
141                 return;
142
143         res->err = err;
144         complete(&res->completion);
145 }
146
147 static int testmgr_alloc_buf(char *buf[XBUFSIZE])
148 {
149         int i;
150
151         for (i = 0; i < XBUFSIZE; i++) {
152                 buf[i] = (void *)__get_free_page(GFP_KERNEL);
153                 if (!buf[i])
154                         goto err_free_buf;
155         }
156
157         return 0;
158
159 err_free_buf:
160         while (i-- > 0)
161                 free_page((unsigned long)buf[i]);
162
163         return -ENOMEM;
164 }
165
166 static void testmgr_free_buf(char *buf[XBUFSIZE])
167 {
168         int i;
169
170         for (i = 0; i < XBUFSIZE; i++)
171                 free_page((unsigned long)buf[i]);
172 }
173
174 static int do_one_async_hash_op(struct ahash_request *req,
175                                 struct tcrypt_result *tr,
176                                 int ret)
177 {
178         if (ret == -EINPROGRESS || ret == -EBUSY) {
179                 ret = wait_for_completion_interruptible(&tr->completion);
180                 if (!ret)
181                         ret = tr->err;
182                 INIT_COMPLETION(tr->completion);
183         }
184         return ret;
185 }
186
187 static int __test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
188                        unsigned int tcount, bool use_digest,
189                        const int align_offset)
190 {
191         const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
192         unsigned int i, j, k, temp;
193         struct scatterlist sg[8];
194         char result[64];
195         struct ahash_request *req;
196         struct tcrypt_result tresult;
197         void *hash_buff;
198         char *xbuf[XBUFSIZE];
199         int ret = -ENOMEM;
200
201         if (testmgr_alloc_buf(xbuf))
202                 goto out_nobuf;
203
204         init_completion(&tresult.completion);
205
206         req = ahash_request_alloc(tfm, GFP_KERNEL);
207         if (!req) {
208                 printk(KERN_ERR "alg: hash: Failed to allocate request for "
209                        "%s\n", algo);
210                 goto out_noreq;
211         }
212         ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
213                                    tcrypt_complete, &tresult);
214
215         j = 0;
216         for (i = 0; i < tcount; i++) {
217                 if (template[i].np)
218                         continue;
219
220                 ret = -EINVAL;
221                 if (WARN_ON(align_offset + template[i].psize > PAGE_SIZE))
222                         goto out;
223
224                 j++;
225                 memset(result, 0, 64);
226
227                 hash_buff = xbuf[0];
228                 hash_buff += align_offset;
229
230                 memcpy(hash_buff, template[i].plaintext, template[i].psize);
231                 sg_init_one(&sg[0], hash_buff, template[i].psize);
232
233                 if (template[i].ksize) {
234                         crypto_ahash_clear_flags(tfm, ~0);
235                         ret = crypto_ahash_setkey(tfm, template[i].key,
236                                                   template[i].ksize);
237                         if (ret) {
238                                 printk(KERN_ERR "alg: hash: setkey failed on "
239                                        "test %d for %s: ret=%d\n", j, algo,
240                                        -ret);
241                                 goto out;
242                         }
243                 }
244
245                 ahash_request_set_crypt(req, sg, result, template[i].psize);
246                 if (use_digest) {
247                         ret = do_one_async_hash_op(req, &tresult,
248                                                    crypto_ahash_digest(req));
249                         if (ret) {
250                                 pr_err("alg: hash: digest failed on test %d "
251                                        "for %s: ret=%d\n", j, algo, -ret);
252                                 goto out;
253                         }
254                 } else {
255                         ret = do_one_async_hash_op(req, &tresult,
256                                                    crypto_ahash_init(req));
257                         if (ret) {
258                                 pr_err("alt: hash: init failed on test %d "
259                                        "for %s: ret=%d\n", j, algo, -ret);
260                                 goto out;
261                         }
262                         ret = do_one_async_hash_op(req, &tresult,
263                                                    crypto_ahash_update(req));
264                         if (ret) {
265                                 pr_err("alt: hash: update failed on test %d "
266                                        "for %s: ret=%d\n", j, algo, -ret);
267                                 goto out;
268                         }
269                         ret = do_one_async_hash_op(req, &tresult,
270                                                    crypto_ahash_final(req));
271                         if (ret) {
272                                 pr_err("alt: hash: final failed on test %d "
273                                        "for %s: ret=%d\n", j, algo, -ret);
274                                 goto out;
275                         }
276                 }
277
278                 if (memcmp(result, template[i].digest,
279                            crypto_ahash_digestsize(tfm))) {
280                         printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
281                                j, algo);
282                         hexdump(result, crypto_ahash_digestsize(tfm));
283                         ret = -EINVAL;
284                         goto out;
285                 }
286         }
287
288         j = 0;
289         for (i = 0; i < tcount; i++) {
290                 /* alignment tests are only done with continuous buffers */
291                 if (align_offset != 0)
292                         break;
293
294                 if (template[i].np) {
295                         j++;
296                         memset(result, 0, 64);
297
298                         temp = 0;
299                         sg_init_table(sg, template[i].np);
300                         ret = -EINVAL;
301                         for (k = 0; k < template[i].np; k++) {
302                                 if (WARN_ON(offset_in_page(IDX[k]) +
303                                             template[i].tap[k] > PAGE_SIZE))
304                                         goto out;
305                                 sg_set_buf(&sg[k],
306                                            memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
307                                                   offset_in_page(IDX[k]),
308                                                   template[i].plaintext + temp,
309                                                   template[i].tap[k]),
310                                            template[i].tap[k]);
311                                 temp += template[i].tap[k];
312                         }
313
314                         if (template[i].ksize) {
315                                 crypto_ahash_clear_flags(tfm, ~0);
316                                 ret = crypto_ahash_setkey(tfm, template[i].key,
317                                                           template[i].ksize);
318
319                                 if (ret) {
320                                         printk(KERN_ERR "alg: hash: setkey "
321                                                "failed on chunking test %d "
322                                                "for %s: ret=%d\n", j, algo,
323                                                -ret);
324                                         goto out;
325                                 }
326                         }
327
328                         ahash_request_set_crypt(req, sg, result,
329                                                 template[i].psize);
330                         ret = crypto_ahash_digest(req);
331                         switch (ret) {
332                         case 0:
333                                 break;
334                         case -EINPROGRESS:
335                         case -EBUSY:
336                                 ret = wait_for_completion_interruptible(
337                                         &tresult.completion);
338                                 if (!ret && !(ret = tresult.err)) {
339                                         INIT_COMPLETION(tresult.completion);
340                                         break;
341                                 }
342                                 /* fall through */
343                         default:
344                                 printk(KERN_ERR "alg: hash: digest failed "
345                                        "on chunking test %d for %s: "
346                                        "ret=%d\n", j, algo, -ret);
347                                 goto out;
348                         }
349
350                         if (memcmp(result, template[i].digest,
351                                    crypto_ahash_digestsize(tfm))) {
352                                 printk(KERN_ERR "alg: hash: Chunking test %d "
353                                        "failed for %s\n", j, algo);
354                                 hexdump(result, crypto_ahash_digestsize(tfm));
355                                 ret = -EINVAL;
356                                 goto out;
357                         }
358                 }
359         }
360
361         ret = 0;
362
363 out:
364         ahash_request_free(req);
365 out_noreq:
366         testmgr_free_buf(xbuf);
367 out_nobuf:
368         return ret;
369 }
370
371 static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
372                      unsigned int tcount, bool use_digest)
373 {
374         unsigned int alignmask;
375         int ret;
376
377         ret = __test_hash(tfm, template, tcount, use_digest, 0);
378         if (ret)
379                 return ret;
380
381         /* test unaligned buffers, check with one byte offset */
382         ret = __test_hash(tfm, template, tcount, use_digest, 1);
383         if (ret)
384                 return ret;
385
386         alignmask = crypto_tfm_alg_alignmask(&tfm->base);
387         if (alignmask) {
388                 /* Check if alignment mask for tfm is correctly set. */
389                 ret = __test_hash(tfm, template, tcount, use_digest,
390                                   alignmask + 1);
391                 if (ret)
392                         return ret;
393         }
394
395         return 0;
396 }
397
398 static int __test_aead(struct crypto_aead *tfm, int enc,
399                        struct aead_testvec *template, unsigned int tcount,
400                        const bool diff_dst, const int align_offset)
401 {
402         const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
403         unsigned int i, j, k, n, temp;
404         int ret = -ENOMEM;
405         char *q;
406         char *key;
407         struct aead_request *req;
408         struct scatterlist *sg;
409         struct scatterlist *asg;
410         struct scatterlist *sgout;
411         const char *e, *d;
412         struct tcrypt_result result;
413         unsigned int authsize;
414         void *input;
415         void *output;
416         void *assoc;
417         char iv[MAX_IVLEN];
418         char *xbuf[XBUFSIZE];
419         char *xoutbuf[XBUFSIZE];
420         char *axbuf[XBUFSIZE];
421
422         if (testmgr_alloc_buf(xbuf))
423                 goto out_noxbuf;
424         if (testmgr_alloc_buf(axbuf))
425                 goto out_noaxbuf;
426
427         if (diff_dst && testmgr_alloc_buf(xoutbuf))
428                 goto out_nooutbuf;
429
430         /* avoid "the frame size is larger than 1024 bytes" compiler warning */
431         sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 3 : 2), GFP_KERNEL);
432         if (!sg)
433                 goto out_nosg;
434         asg = &sg[8];
435         sgout = &asg[8];
436
437         if (diff_dst)
438                 d = "-ddst";
439         else
440                 d = "";
441
442         if (enc == ENCRYPT)
443                 e = "encryption";
444         else
445                 e = "decryption";
446
447         init_completion(&result.completion);
448
449         req = aead_request_alloc(tfm, GFP_KERNEL);
450         if (!req) {
451                 pr_err("alg: aead%s: Failed to allocate request for %s\n",
452                        d, algo);
453                 goto out;
454         }
455
456         aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
457                                   tcrypt_complete, &result);
458
459         for (i = 0, j = 0; i < tcount; i++) {
460                 if (!template[i].np) {
461                         j++;
462
463                         /* some templates have no input data but they will
464                          * touch input
465                          */
466                         input = xbuf[0];
467                         input += align_offset;
468                         assoc = axbuf[0];
469
470                         ret = -EINVAL;
471                         if (WARN_ON(align_offset + template[i].ilen >
472                                     PAGE_SIZE || template[i].alen > PAGE_SIZE))
473                                 goto out;
474
475                         memcpy(input, template[i].input, template[i].ilen);
476                         memcpy(assoc, template[i].assoc, template[i].alen);
477                         if (template[i].iv)
478                                 memcpy(iv, template[i].iv, MAX_IVLEN);
479                         else
480                                 memset(iv, 0, MAX_IVLEN);
481
482                         crypto_aead_clear_flags(tfm, ~0);
483                         if (template[i].wk)
484                                 crypto_aead_set_flags(
485                                         tfm, CRYPTO_TFM_REQ_WEAK_KEY);
486
487                         key = template[i].key;
488
489                         ret = crypto_aead_setkey(tfm, key,
490                                                  template[i].klen);
491                         if (!ret == template[i].fail) {
492                                 pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n",
493                                        d, j, algo, crypto_aead_get_flags(tfm));
494                                 goto out;
495                         } else if (ret)
496                                 continue;
497
498                         authsize = abs(template[i].rlen - template[i].ilen);
499                         ret = crypto_aead_setauthsize(tfm, authsize);
500                         if (ret) {
501                                 pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n",
502                                        d, authsize, j, algo);
503                                 goto out;
504                         }
505
506                         sg_init_one(&sg[0], input,
507                                     template[i].ilen + (enc ? authsize : 0));
508
509                         if (diff_dst) {
510                                 output = xoutbuf[0];
511                                 output += align_offset;
512                                 sg_init_one(&sgout[0], output,
513                                             template[i].ilen +
514                                                 (enc ? authsize : 0));
515                         } else {
516                                 output = input;
517                         }
518
519                         sg_init_one(&asg[0], assoc, template[i].alen);
520
521                         aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
522                                                template[i].ilen, iv);
523
524                         aead_request_set_assoc(req, asg, template[i].alen);
525
526                         ret = enc ?
527                                 crypto_aead_encrypt(req) :
528                                 crypto_aead_decrypt(req);
529
530                         switch (ret) {
531                         case 0:
532                                 if (template[i].novrfy) {
533                                         /* verification was supposed to fail */
534                                         pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n",
535                                                d, e, j, algo);
536                                         /* so really, we got a bad message */
537                                         ret = -EBADMSG;
538                                         goto out;
539                                 }
540                                 break;
541                         case -EINPROGRESS:
542                         case -EBUSY:
543                                 ret = wait_for_completion_interruptible(
544                                         &result.completion);
545                                 if (!ret && !(ret = result.err)) {
546                                         INIT_COMPLETION(result.completion);
547                                         break;
548                                 }
549                         case -EBADMSG:
550                                 if (template[i].novrfy)
551                                         /* verification failure was expected */
552                                         continue;
553                                 /* fall through */
554                         default:
555                                 pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n",
556                                        d, e, j, algo, -ret);
557                                 goto out;
558                         }
559
560                         q = output;
561                         if (memcmp(q, template[i].result, template[i].rlen)) {
562                                 pr_err("alg: aead%s: Test %d failed on %s for %s\n",
563                                        d, j, e, algo);
564                                 hexdump(q, template[i].rlen);
565                                 ret = -EINVAL;
566                                 goto out;
567                         }
568                 }
569         }
570
571         for (i = 0, j = 0; i < tcount; i++) {
572                 /* alignment tests are only done with continuous buffers */
573                 if (align_offset != 0)
574                         break;
575
576                 if (template[i].np) {
577                         j++;
578
579                         if (template[i].iv)
580                                 memcpy(iv, template[i].iv, MAX_IVLEN);
581                         else
582                                 memset(iv, 0, MAX_IVLEN);
583
584                         crypto_aead_clear_flags(tfm, ~0);
585                         if (template[i].wk)
586                                 crypto_aead_set_flags(
587                                         tfm, CRYPTO_TFM_REQ_WEAK_KEY);
588                         key = template[i].key;
589
590                         ret = crypto_aead_setkey(tfm, key, template[i].klen);
591                         if (!ret == template[i].fail) {
592                                 pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n",
593                                        d, j, algo, crypto_aead_get_flags(tfm));
594                                 goto out;
595                         } else if (ret)
596                                 continue;
597
598                         authsize = abs(template[i].rlen - template[i].ilen);
599
600                         ret = -EINVAL;
601                         sg_init_table(sg, template[i].np);
602                         if (diff_dst)
603                                 sg_init_table(sgout, template[i].np);
604                         for (k = 0, temp = 0; k < template[i].np; k++) {
605                                 if (WARN_ON(offset_in_page(IDX[k]) +
606                                             template[i].tap[k] > PAGE_SIZE))
607                                         goto out;
608
609                                 q = xbuf[IDX[k] >> PAGE_SHIFT] +
610                                     offset_in_page(IDX[k]);
611
612                                 memcpy(q, template[i].input + temp,
613                                        template[i].tap[k]);
614
615                                 n = template[i].tap[k];
616                                 if (k == template[i].np - 1 && enc)
617                                         n += authsize;
618                                 if (offset_in_page(q) + n < PAGE_SIZE)
619                                         q[n] = 0;
620
621                                 sg_set_buf(&sg[k], q, template[i].tap[k]);
622
623                                 if (diff_dst) {
624                                         q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
625                                             offset_in_page(IDX[k]);
626
627                                         memset(q, 0, template[i].tap[k]);
628                                         if (offset_in_page(q) + n < PAGE_SIZE)
629                                                 q[n] = 0;
630
631                                         sg_set_buf(&sgout[k], q,
632                                                    template[i].tap[k]);
633                                 }
634
635                                 temp += template[i].tap[k];
636                         }
637
638                         ret = crypto_aead_setauthsize(tfm, authsize);
639                         if (ret) {
640                                 pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n",
641                                        d, authsize, j, algo);
642                                 goto out;
643                         }
644
645                         if (enc) {
646                                 if (WARN_ON(sg[k - 1].offset +
647                                             sg[k - 1].length + authsize >
648                                             PAGE_SIZE)) {
649                                         ret = -EINVAL;
650                                         goto out;
651                                 }
652
653                                 sg[k - 1].length += authsize;
654
655                                 if (diff_dst)
656                                         sgout[k - 1].length += authsize;
657                         }
658
659                         sg_init_table(asg, template[i].anp);
660                         ret = -EINVAL;
661                         for (k = 0, temp = 0; k < template[i].anp; k++) {
662                                 if (WARN_ON(offset_in_page(IDX[k]) +
663                                             template[i].atap[k] > PAGE_SIZE))
664                                         goto out;
665                                 sg_set_buf(&asg[k],
666                                            memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
667                                                   offset_in_page(IDX[k]),
668                                                   template[i].assoc + temp,
669                                                   template[i].atap[k]),
670                                            template[i].atap[k]);
671                                 temp += template[i].atap[k];
672                         }
673
674                         aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
675                                                template[i].ilen,
676                                                iv);
677
678                         aead_request_set_assoc(req, asg, template[i].alen);
679
680                         ret = enc ?
681                                 crypto_aead_encrypt(req) :
682                                 crypto_aead_decrypt(req);
683
684                         switch (ret) {
685                         case 0:
686                                 if (template[i].novrfy) {
687                                         /* verification was supposed to fail */
688                                         pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n",
689                                                d, e, j, algo);
690                                         /* so really, we got a bad message */
691                                         ret = -EBADMSG;
692                                         goto out;
693                                 }
694                                 break;
695                         case -EINPROGRESS:
696                         case -EBUSY:
697                                 ret = wait_for_completion_interruptible(
698                                         &result.completion);
699                                 if (!ret && !(ret = result.err)) {
700                                         INIT_COMPLETION(result.completion);
701                                         break;
702                                 }
703                         case -EBADMSG:
704                                 if (template[i].novrfy)
705                                         /* verification failure was expected */
706                                         continue;
707                                 /* fall through */
708                         default:
709                                 pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n",
710                                        d, e, j, algo, -ret);
711                                 goto out;
712                         }
713
714                         ret = -EINVAL;
715                         for (k = 0, temp = 0; k < template[i].np; k++) {
716                                 if (diff_dst)
717                                         q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
718                                             offset_in_page(IDX[k]);
719                                 else
720                                         q = xbuf[IDX[k] >> PAGE_SHIFT] +
721                                             offset_in_page(IDX[k]);
722
723                                 n = template[i].tap[k];
724                                 if (k == template[i].np - 1)
725                                         n += enc ? authsize : -authsize;
726
727                                 if (memcmp(q, template[i].result + temp, n)) {
728                                         pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n",
729                                                d, j, e, k, algo);
730                                         hexdump(q, n);
731                                         goto out;
732                                 }
733
734                                 q += n;
735                                 if (k == template[i].np - 1 && !enc) {
736                                         if (!diff_dst &&
737                                                 memcmp(q, template[i].input +
738                                                       temp + n, authsize))
739                                                 n = authsize;
740                                         else
741                                                 n = 0;
742                                 } else {
743                                         for (n = 0; offset_in_page(q + n) &&
744                                                     q[n]; n++)
745                                                 ;
746                                 }
747                                 if (n) {
748                                         pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
749                                                d, j, e, k, algo, n);
750                                         hexdump(q, n);
751                                         goto out;
752                                 }
753
754                                 temp += template[i].tap[k];
755                         }
756                 }
757         }
758
759         ret = 0;
760
761 out:
762         aead_request_free(req);
763         kfree(sg);
764 out_nosg:
765         if (diff_dst)
766                 testmgr_free_buf(xoutbuf);
767 out_nooutbuf:
768         testmgr_free_buf(axbuf);
769 out_noaxbuf:
770         testmgr_free_buf(xbuf);
771 out_noxbuf:
772         return ret;
773 }
774
775 static int test_aead(struct crypto_aead *tfm, int enc,
776                      struct aead_testvec *template, unsigned int tcount)
777 {
778         unsigned int alignmask;
779         int ret;
780
781         /* test 'dst == src' case */
782         ret = __test_aead(tfm, enc, template, tcount, false, 0);
783         if (ret)
784                 return ret;
785
786         /* test 'dst != src' case */
787         ret = __test_aead(tfm, enc, template, tcount, true, 0);
788         if (ret)
789                 return ret;
790
791         /* test unaligned buffers, check with one byte offset */
792         ret = __test_aead(tfm, enc, template, tcount, true, 1);
793         if (ret)
794                 return ret;
795
796         alignmask = crypto_tfm_alg_alignmask(&tfm->base);
797         if (alignmask) {
798                 /* Check if alignment mask for tfm is correctly set. */
799                 ret = __test_aead(tfm, enc, template, tcount, true,
800                                   alignmask + 1);
801                 if (ret)
802                         return ret;
803         }
804
805         return 0;
806 }
807
808 static int test_cipher(struct crypto_cipher *tfm, int enc,
809                        struct cipher_testvec *template, unsigned int tcount)
810 {
811         const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm));
812         unsigned int i, j, k;
813         char *q;
814         const char *e;
815         void *data;
816         char *xbuf[XBUFSIZE];
817         int ret = -ENOMEM;
818
819         if (testmgr_alloc_buf(xbuf))
820                 goto out_nobuf;
821
822         if (enc == ENCRYPT)
823                 e = "encryption";
824         else
825                 e = "decryption";
826
827         j = 0;
828         for (i = 0; i < tcount; i++) {
829                 if (template[i].np)
830                         continue;
831
832                 j++;
833
834                 ret = -EINVAL;
835                 if (WARN_ON(template[i].ilen > PAGE_SIZE))
836                         goto out;
837
838                 data = xbuf[0];
839                 memcpy(data, template[i].input, template[i].ilen);
840
841                 crypto_cipher_clear_flags(tfm, ~0);
842                 if (template[i].wk)
843                         crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
844
845                 ret = crypto_cipher_setkey(tfm, template[i].key,
846                                            template[i].klen);
847                 if (!ret == template[i].fail) {
848                         printk(KERN_ERR "alg: cipher: setkey failed "
849                                "on test %d for %s: flags=%x\n", j,
850                                algo, crypto_cipher_get_flags(tfm));
851                         goto out;
852                 } else if (ret)
853                         continue;
854
855                 for (k = 0; k < template[i].ilen;
856                      k += crypto_cipher_blocksize(tfm)) {
857                         if (enc)
858                                 crypto_cipher_encrypt_one(tfm, data + k,
859                                                           data + k);
860                         else
861                                 crypto_cipher_decrypt_one(tfm, data + k,
862                                                           data + k);
863                 }
864
865                 q = data;
866                 if (memcmp(q, template[i].result, template[i].rlen)) {
867                         printk(KERN_ERR "alg: cipher: Test %d failed "
868                                "on %s for %s\n", j, e, algo);
869                         hexdump(q, template[i].rlen);
870                         ret = -EINVAL;
871                         goto out;
872                 }
873         }
874
875         ret = 0;
876
877 out:
878         testmgr_free_buf(xbuf);
879 out_nobuf:
880         return ret;
881 }
882
883 static int __test_skcipher(struct crypto_ablkcipher *tfm, int enc,
884                            struct cipher_testvec *template, unsigned int tcount,
885                            const bool diff_dst, const int align_offset)
886 {
887         const char *algo =
888                 crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm));
889         unsigned int i, j, k, n, temp;
890         char *q;
891         struct ablkcipher_request *req;
892         struct scatterlist sg[8];
893         struct scatterlist sgout[8];
894         const char *e, *d;
895         struct tcrypt_result result;
896         void *data;
897         char iv[MAX_IVLEN];
898         char *xbuf[XBUFSIZE];
899         char *xoutbuf[XBUFSIZE];
900         int ret = -ENOMEM;
901
902         if (testmgr_alloc_buf(xbuf))
903                 goto out_nobuf;
904
905         if (diff_dst && testmgr_alloc_buf(xoutbuf))
906                 goto out_nooutbuf;
907
908         if (diff_dst)
909                 d = "-ddst";
910         else
911                 d = "";
912
913         if (enc == ENCRYPT)
914                 e = "encryption";
915         else
916                 e = "decryption";
917
918         init_completion(&result.completion);
919
920         req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
921         if (!req) {
922                 pr_err("alg: skcipher%s: Failed to allocate request for %s\n",
923                        d, algo);
924                 goto out;
925         }
926
927         ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
928                                         tcrypt_complete, &result);
929
930         j = 0;
931         for (i = 0; i < tcount; i++) {
932                 if (template[i].iv)
933                         memcpy(iv, template[i].iv, MAX_IVLEN);
934                 else
935                         memset(iv, 0, MAX_IVLEN);
936
937                 if (!(template[i].np) || (template[i].also_non_np)) {
938                         j++;
939
940                         ret = -EINVAL;
941                         if (WARN_ON(align_offset + template[i].ilen >
942                                     PAGE_SIZE))
943                                 goto out;
944
945                         data = xbuf[0];
946                         data += align_offset;
947                         memcpy(data, template[i].input, template[i].ilen);
948
949                         crypto_ablkcipher_clear_flags(tfm, ~0);
950                         if (template[i].wk)
951                                 crypto_ablkcipher_set_flags(
952                                         tfm, CRYPTO_TFM_REQ_WEAK_KEY);
953
954                         ret = crypto_ablkcipher_setkey(tfm, template[i].key,
955                                                        template[i].klen);
956                         if (!ret == template[i].fail) {
957                                 pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n",
958                                        d, j, algo,
959                                        crypto_ablkcipher_get_flags(tfm));
960                                 goto out;
961                         } else if (ret)
962                                 continue;
963
964                         sg_init_one(&sg[0], data, template[i].ilen);
965                         if (diff_dst) {
966                                 data = xoutbuf[0];
967                                 data += align_offset;
968                                 sg_init_one(&sgout[0], data, template[i].ilen);
969                         }
970
971                         ablkcipher_request_set_crypt(req, sg,
972                                                      (diff_dst) ? sgout : sg,
973                                                      template[i].ilen, iv);
974                         ret = enc ?
975                                 crypto_ablkcipher_encrypt(req) :
976                                 crypto_ablkcipher_decrypt(req);
977
978                         switch (ret) {
979                         case 0:
980                                 break;
981                         case -EINPROGRESS:
982                         case -EBUSY:
983                                 ret = wait_for_completion_interruptible(
984                                         &result.completion);
985                                 if (!ret && !((ret = result.err))) {
986                                         INIT_COMPLETION(result.completion);
987                                         break;
988                                 }
989                                 /* fall through */
990                         default:
991                                 pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n",
992                                        d, e, j, algo, -ret);
993                                 goto out;
994                         }
995
996                         q = data;
997                         if (memcmp(q, template[i].result, template[i].rlen)) {
998                                 pr_err("alg: skcipher%s: Test %d failed on %s for %s\n",
999                                        d, j, e, algo);
1000                                 hexdump(q, template[i].rlen);
1001                                 ret = -EINVAL;
1002                                 goto out;
1003                         }
1004                 }
1005         }
1006
1007         j = 0;
1008         for (i = 0; i < tcount; i++) {
1009                 /* alignment tests are only done with continuous buffers */
1010                 if (align_offset != 0)
1011                         break;
1012
1013                 if (template[i].iv)
1014                         memcpy(iv, template[i].iv, MAX_IVLEN);
1015                 else
1016                         memset(iv, 0, MAX_IVLEN);
1017
1018                 if (template[i].np) {
1019                         j++;
1020
1021                         crypto_ablkcipher_clear_flags(tfm, ~0);
1022                         if (template[i].wk)
1023                                 crypto_ablkcipher_set_flags(
1024                                         tfm, CRYPTO_TFM_REQ_WEAK_KEY);
1025
1026                         ret = crypto_ablkcipher_setkey(tfm, template[i].key,
1027                                                        template[i].klen);
1028                         if (!ret == template[i].fail) {
1029                                 pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n",
1030                                        d, j, algo,
1031                                        crypto_ablkcipher_get_flags(tfm));
1032                                 goto out;
1033                         } else if (ret)
1034                                 continue;
1035
1036                         temp = 0;
1037                         ret = -EINVAL;
1038                         sg_init_table(sg, template[i].np);
1039                         if (diff_dst)
1040                                 sg_init_table(sgout, template[i].np);
1041                         for (k = 0; k < template[i].np; k++) {
1042                                 if (WARN_ON(offset_in_page(IDX[k]) +
1043                                             template[i].tap[k] > PAGE_SIZE))
1044                                         goto out;
1045
1046                                 q = xbuf[IDX[k] >> PAGE_SHIFT] +
1047                                     offset_in_page(IDX[k]);
1048
1049                                 memcpy(q, template[i].input + temp,
1050                                        template[i].tap[k]);
1051
1052                                 if (offset_in_page(q) + template[i].tap[k] <
1053                                     PAGE_SIZE)
1054                                         q[template[i].tap[k]] = 0;
1055
1056                                 sg_set_buf(&sg[k], q, template[i].tap[k]);
1057                                 if (diff_dst) {
1058                                         q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
1059                                             offset_in_page(IDX[k]);
1060
1061                                         sg_set_buf(&sgout[k], q,
1062                                                    template[i].tap[k]);
1063
1064                                         memset(q, 0, template[i].tap[k]);
1065                                         if (offset_in_page(q) +
1066                                             template[i].tap[k] < PAGE_SIZE)
1067                                                 q[template[i].tap[k]] = 0;
1068                                 }
1069
1070                                 temp += template[i].tap[k];
1071                         }
1072
1073                         ablkcipher_request_set_crypt(req, sg,
1074                                         (diff_dst) ? sgout : sg,
1075                                         template[i].ilen, iv);
1076
1077                         ret = enc ?
1078                                 crypto_ablkcipher_encrypt(req) :
1079                                 crypto_ablkcipher_decrypt(req);
1080
1081                         switch (ret) {
1082                         case 0:
1083                                 break;
1084                         case -EINPROGRESS:
1085                         case -EBUSY:
1086                                 ret = wait_for_completion_interruptible(
1087                                         &result.completion);
1088                                 if (!ret && !((ret = result.err))) {
1089                                         INIT_COMPLETION(result.completion);
1090                                         break;
1091                                 }
1092                                 /* fall through */
1093                         default:
1094                                 pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n",
1095                                        d, e, j, algo, -ret);
1096                                 goto out;
1097                         }
1098
1099                         temp = 0;
1100                         ret = -EINVAL;
1101                         for (k = 0; k < template[i].np; k++) {
1102                                 if (diff_dst)
1103                                         q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
1104                                             offset_in_page(IDX[k]);
1105                                 else
1106                                         q = xbuf[IDX[k] >> PAGE_SHIFT] +
1107                                             offset_in_page(IDX[k]);
1108
1109                                 if (memcmp(q, template[i].result + temp,
1110                                            template[i].tap[k])) {
1111                                         pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n",
1112                                                d, j, e, k, algo);
1113                                         hexdump(q, template[i].tap[k]);
1114                                         goto out;
1115                                 }
1116
1117                                 q += template[i].tap[k];
1118                                 for (n = 0; offset_in_page(q + n) && q[n]; n++)
1119                                         ;
1120                                 if (n) {
1121                                         pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
1122                                                d, j, e, k, algo, n);
1123                                         hexdump(q, n);
1124                                         goto out;
1125                                 }
1126                                 temp += template[i].tap[k];
1127                         }
1128                 }
1129         }
1130
1131         ret = 0;
1132
1133 out:
1134         ablkcipher_request_free(req);
1135         if (diff_dst)
1136                 testmgr_free_buf(xoutbuf);
1137 out_nooutbuf:
1138         testmgr_free_buf(xbuf);
1139 out_nobuf:
1140         return ret;
1141 }
1142
1143 static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
1144                          struct cipher_testvec *template, unsigned int tcount)
1145 {
1146         unsigned int alignmask;
1147         int ret;
1148
1149         /* test 'dst == src' case */
1150         ret = __test_skcipher(tfm, enc, template, tcount, false, 0);
1151         if (ret)
1152                 return ret;
1153
1154         /* test 'dst != src' case */
1155         ret = __test_skcipher(tfm, enc, template, tcount, true, 0);
1156         if (ret)
1157                 return ret;
1158
1159         /* test unaligned buffers, check with one byte offset */
1160         ret = __test_skcipher(tfm, enc, template, tcount, true, 1);
1161         if (ret)
1162                 return ret;
1163
1164         alignmask = crypto_tfm_alg_alignmask(&tfm->base);
1165         if (alignmask) {
1166                 /* Check if alignment mask for tfm is correctly set. */
1167                 ret = __test_skcipher(tfm, enc, template, tcount, true,
1168                                       alignmask + 1);
1169                 if (ret)
1170                         return ret;
1171         }
1172
1173         return 0;
1174 }
1175
1176 static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate,
1177                      struct comp_testvec *dtemplate, int ctcount, int dtcount)
1178 {
1179         const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
1180         unsigned int i;
1181         char result[COMP_BUF_SIZE];
1182         int ret;
1183
1184         for (i = 0; i < ctcount; i++) {
1185                 int ilen;
1186                 unsigned int dlen = COMP_BUF_SIZE;
1187
1188                 memset(result, 0, sizeof (result));
1189
1190                 ilen = ctemplate[i].inlen;
1191                 ret = crypto_comp_compress(tfm, ctemplate[i].input,
1192                                            ilen, result, &dlen);
1193                 if (ret) {
1194                         printk(KERN_ERR "alg: comp: compression failed "
1195                                "on test %d for %s: ret=%d\n", i + 1, algo,
1196                                -ret);
1197                         goto out;
1198                 }
1199
1200                 if (dlen != ctemplate[i].outlen) {
1201                         printk(KERN_ERR "alg: comp: Compression test %d "
1202                                "failed for %s: output len = %d\n", i + 1, algo,
1203                                dlen);
1204                         ret = -EINVAL;
1205                         goto out;
1206                 }
1207
1208                 if (memcmp(result, ctemplate[i].output, dlen)) {
1209                         printk(KERN_ERR "alg: comp: Compression test %d "
1210                                "failed for %s\n", i + 1, algo);
1211                         hexdump(result, dlen);
1212                         ret = -EINVAL;
1213                         goto out;
1214                 }
1215         }
1216
1217         for (i = 0; i < dtcount; i++) {
1218                 int ilen;
1219                 unsigned int dlen = COMP_BUF_SIZE;
1220
1221                 memset(result, 0, sizeof (result));
1222
1223                 ilen = dtemplate[i].inlen;
1224                 ret = crypto_comp_decompress(tfm, dtemplate[i].input,
1225                                              ilen, result, &dlen);
1226                 if (ret) {
1227                         printk(KERN_ERR "alg: comp: decompression failed "
1228                                "on test %d for %s: ret=%d\n", i + 1, algo,
1229                                -ret);
1230                         goto out;
1231                 }
1232
1233                 if (dlen != dtemplate[i].outlen) {
1234                         printk(KERN_ERR "alg: comp: Decompression test %d "
1235                                "failed for %s: output len = %d\n", i + 1, algo,
1236                                dlen);
1237                         ret = -EINVAL;
1238                         goto out;
1239                 }
1240
1241                 if (memcmp(result, dtemplate[i].output, dlen)) {
1242                         printk(KERN_ERR "alg: comp: Decompression test %d "
1243                                "failed for %s\n", i + 1, algo);
1244                         hexdump(result, dlen);
1245                         ret = -EINVAL;
1246                         goto out;
1247                 }
1248         }
1249
1250         ret = 0;
1251
1252 out:
1253         return ret;
1254 }
1255
1256 static int test_pcomp(struct crypto_pcomp *tfm,
1257                       struct pcomp_testvec *ctemplate,
1258                       struct pcomp_testvec *dtemplate, int ctcount,
1259                       int dtcount)
1260 {
1261         const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm));
1262         unsigned int i;
1263         char result[COMP_BUF_SIZE];
1264         int res;
1265
1266         for (i = 0; i < ctcount; i++) {
1267                 struct comp_request req;
1268                 unsigned int produced = 0;
1269
1270                 res = crypto_compress_setup(tfm, ctemplate[i].params,
1271                                             ctemplate[i].paramsize);
1272                 if (res) {
1273                         pr_err("alg: pcomp: compression setup failed on test "
1274                                "%d for %s: error=%d\n", i + 1, algo, res);
1275                         return res;
1276                 }
1277
1278                 res = crypto_compress_init(tfm);
1279                 if (res) {
1280                         pr_err("alg: pcomp: compression init failed on test "
1281                                "%d for %s: error=%d\n", i + 1, algo, res);
1282                         return res;
1283                 }
1284
1285                 memset(result, 0, sizeof(result));
1286
1287                 req.next_in = ctemplate[i].input;
1288                 req.avail_in = ctemplate[i].inlen / 2;
1289                 req.next_out = result;
1290                 req.avail_out = ctemplate[i].outlen / 2;
1291
1292                 res = crypto_compress_update(tfm, &req);
1293                 if (res < 0 && (res != -EAGAIN || req.avail_in)) {
1294                         pr_err("alg: pcomp: compression update failed on test "
1295                                "%d for %s: error=%d\n", i + 1, algo, res);
1296                         return res;
1297                 }
1298                 if (res > 0)
1299                         produced += res;
1300
1301                 /* Add remaining input data */
1302                 req.avail_in += (ctemplate[i].inlen + 1) / 2;
1303
1304                 res = crypto_compress_update(tfm, &req);
1305                 if (res < 0 && (res != -EAGAIN || req.avail_in)) {
1306                         pr_err("alg: pcomp: compression update failed on test "
1307                                "%d for %s: error=%d\n", i + 1, algo, res);
1308                         return res;
1309                 }
1310                 if (res > 0)
1311                         produced += res;
1312
1313                 /* Provide remaining output space */
1314                 req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2;
1315
1316                 res = crypto_compress_final(tfm, &req);
1317                 if (res < 0) {
1318                         pr_err("alg: pcomp: compression final failed on test "
1319                                "%d for %s: error=%d\n", i + 1, algo, res);
1320                         return res;
1321                 }
1322                 produced += res;
1323
1324                 if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) {
1325                         pr_err("alg: comp: Compression test %d failed for %s: "
1326                                "output len = %d (expected %d)\n", i + 1, algo,
1327                                COMP_BUF_SIZE - req.avail_out,
1328                                ctemplate[i].outlen);
1329                         return -EINVAL;
1330                 }
1331
1332                 if (produced != ctemplate[i].outlen) {
1333                         pr_err("alg: comp: Compression test %d failed for %s: "
1334                                "returned len = %u (expected %d)\n", i + 1,
1335                                algo, produced, ctemplate[i].outlen);
1336                         return -EINVAL;
1337                 }
1338
1339                 if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) {
1340                         pr_err("alg: pcomp: Compression test %d failed for "
1341                                "%s\n", i + 1, algo);
1342                         hexdump(result, ctemplate[i].outlen);
1343                         return -EINVAL;
1344                 }
1345         }
1346
1347         for (i = 0; i < dtcount; i++) {
1348                 struct comp_request req;
1349                 unsigned int produced = 0;
1350
1351                 res = crypto_decompress_setup(tfm, dtemplate[i].params,
1352                                               dtemplate[i].paramsize);
1353                 if (res) {
1354                         pr_err("alg: pcomp: decompression setup failed on "
1355                                "test %d for %s: error=%d\n", i + 1, algo, res);
1356                         return res;
1357                 }
1358
1359                 res = crypto_decompress_init(tfm);
1360                 if (res) {
1361                         pr_err("alg: pcomp: decompression init failed on test "
1362                                "%d for %s: error=%d\n", i + 1, algo, res);
1363                         return res;
1364                 }
1365
1366                 memset(result, 0, sizeof(result));
1367
1368                 req.next_in = dtemplate[i].input;
1369                 req.avail_in = dtemplate[i].inlen / 2;
1370                 req.next_out = result;
1371                 req.avail_out = dtemplate[i].outlen / 2;
1372
1373                 res = crypto_decompress_update(tfm, &req);
1374                 if (res < 0 && (res != -EAGAIN || req.avail_in)) {
1375                         pr_err("alg: pcomp: decompression update failed on "
1376                                "test %d for %s: error=%d\n", i + 1, algo, res);
1377                         return res;
1378                 }
1379                 if (res > 0)
1380                         produced += res;
1381
1382                 /* Add remaining input data */
1383                 req.avail_in += (dtemplate[i].inlen + 1) / 2;
1384
1385                 res = crypto_decompress_update(tfm, &req);
1386                 if (res < 0 && (res != -EAGAIN || req.avail_in)) {
1387                         pr_err("alg: pcomp: decompression update failed on "
1388                                "test %d for %s: error=%d\n", i + 1, algo, res);
1389                         return res;
1390                 }
1391                 if (res > 0)
1392                         produced += res;
1393
1394                 /* Provide remaining output space */
1395                 req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2;
1396
1397                 res = crypto_decompress_final(tfm, &req);
1398                 if (res < 0 && (res != -EAGAIN || req.avail_in)) {
1399                         pr_err("alg: pcomp: decompression final failed on "
1400                                "test %d for %s: error=%d\n", i + 1, algo, res);
1401                         return res;
1402                 }
1403                 if (res > 0)
1404                         produced += res;
1405
1406                 if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) {
1407                         pr_err("alg: comp: Decompression test %d failed for "
1408                                "%s: output len = %d (expected %d)\n", i + 1,
1409                                algo, COMP_BUF_SIZE - req.avail_out,
1410                                dtemplate[i].outlen);
1411                         return -EINVAL;
1412                 }
1413
1414                 if (produced != dtemplate[i].outlen) {
1415                         pr_err("alg: comp: Decompression test %d failed for "
1416                                "%s: returned len = %u (expected %d)\n", i + 1,
1417                                algo, produced, dtemplate[i].outlen);
1418                         return -EINVAL;
1419                 }
1420
1421                 if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) {
1422                         pr_err("alg: pcomp: Decompression test %d failed for "
1423                                "%s\n", i + 1, algo);
1424                         hexdump(result, dtemplate[i].outlen);
1425                         return -EINVAL;
1426                 }
1427         }
1428
1429         return 0;
1430 }
1431
1432
1433 static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template,
1434                       unsigned int tcount)
1435 {
1436         const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
1437         int err = 0, i, j, seedsize;
1438         u8 *seed;
1439         char result[32];
1440
1441         seedsize = crypto_rng_seedsize(tfm);
1442
1443         seed = kmalloc(seedsize, GFP_KERNEL);
1444         if (!seed) {
1445                 printk(KERN_ERR "alg: cprng: Failed to allocate seed space "
1446                        "for %s\n", algo);
1447                 return -ENOMEM;
1448         }
1449
1450         for (i = 0; i < tcount; i++) {
1451                 memset(result, 0, 32);
1452
1453                 memcpy(seed, template[i].v, template[i].vlen);
1454                 memcpy(seed + template[i].vlen, template[i].key,
1455                        template[i].klen);
1456                 memcpy(seed + template[i].vlen + template[i].klen,
1457                        template[i].dt, template[i].dtlen);
1458
1459                 err = crypto_rng_reset(tfm, seed, seedsize);
1460                 if (err) {
1461                         printk(KERN_ERR "alg: cprng: Failed to reset rng "
1462                                "for %s\n", algo);
1463                         goto out;
1464                 }
1465
1466                 for (j = 0; j < template[i].loops; j++) {
1467                         err = crypto_rng_get_bytes(tfm, result,
1468                                                    template[i].rlen);
1469                         if (err != template[i].rlen) {
1470                                 printk(KERN_ERR "alg: cprng: Failed to obtain "
1471                                        "the correct amount of random data for "
1472                                        "%s (requested %d, got %d)\n", algo,
1473                                        template[i].rlen, err);
1474                                 goto out;
1475                         }
1476                 }
1477
1478                 err = memcmp(result, template[i].result,
1479                              template[i].rlen);
1480                 if (err) {
1481                         printk(KERN_ERR "alg: cprng: Test %d failed for %s\n",
1482                                i, algo);
1483                         hexdump(result, template[i].rlen);
1484                         err = -EINVAL;
1485                         goto out;
1486                 }
1487         }
1488
1489 out:
1490         kfree(seed);
1491         return err;
1492 }
1493
1494 static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
1495                          u32 type, u32 mask)
1496 {
1497         struct crypto_aead *tfm;
1498         int err = 0;
1499
1500         tfm = crypto_alloc_aead(driver, type, mask);
1501         if (IS_ERR(tfm)) {
1502                 printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
1503                        "%ld\n", driver, PTR_ERR(tfm));
1504                 return PTR_ERR(tfm);
1505         }
1506
1507         if (desc->suite.aead.enc.vecs) {
1508                 err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
1509                                 desc->suite.aead.enc.count);
1510                 if (err)
1511                         goto out;
1512         }
1513
1514         if (!err && desc->suite.aead.dec.vecs)
1515                 err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
1516                                 desc->suite.aead.dec.count);
1517
1518 out:
1519         crypto_free_aead(tfm);
1520         return err;
1521 }
1522
1523 static int alg_test_cipher(const struct alg_test_desc *desc,
1524                            const char *driver, u32 type, u32 mask)
1525 {
1526         struct crypto_cipher *tfm;
1527         int err = 0;
1528
1529         tfm = crypto_alloc_cipher(driver, type, mask);
1530         if (IS_ERR(tfm)) {
1531                 printk(KERN_ERR "alg: cipher: Failed to load transform for "
1532                        "%s: %ld\n", driver, PTR_ERR(tfm));
1533                 return PTR_ERR(tfm);
1534         }
1535
1536         if (desc->suite.cipher.enc.vecs) {
1537                 err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1538                                   desc->suite.cipher.enc.count);
1539                 if (err)
1540                         goto out;
1541         }
1542
1543         if (desc->suite.cipher.dec.vecs)
1544                 err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1545                                   desc->suite.cipher.dec.count);
1546
1547 out:
1548         crypto_free_cipher(tfm);
1549         return err;
1550 }
1551
1552 static int alg_test_skcipher(const struct alg_test_desc *desc,
1553                              const char *driver, u32 type, u32 mask)
1554 {
1555         struct crypto_ablkcipher *tfm;
1556         int err = 0;
1557
1558         tfm = crypto_alloc_ablkcipher(driver, type, mask);
1559         if (IS_ERR(tfm)) {
1560                 printk(KERN_ERR "alg: skcipher: Failed to load transform for "
1561                        "%s: %ld\n", driver, PTR_ERR(tfm));
1562                 return PTR_ERR(tfm);
1563         }
1564
1565         if (desc->suite.cipher.enc.vecs) {
1566                 err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1567                                     desc->suite.cipher.enc.count);
1568                 if (err)
1569                         goto out;
1570         }
1571
1572         if (desc->suite.cipher.dec.vecs)
1573                 err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1574                                     desc->suite.cipher.dec.count);
1575
1576 out:
1577         crypto_free_ablkcipher(tfm);
1578         return err;
1579 }
1580
1581 static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
1582                          u32 type, u32 mask)
1583 {
1584         struct crypto_comp *tfm;
1585         int err;
1586
1587         tfm = crypto_alloc_comp(driver, type, mask);
1588         if (IS_ERR(tfm)) {
1589                 printk(KERN_ERR "alg: comp: Failed to load transform for %s: "
1590                        "%ld\n", driver, PTR_ERR(tfm));
1591                 return PTR_ERR(tfm);
1592         }
1593
1594         err = test_comp(tfm, desc->suite.comp.comp.vecs,
1595                         desc->suite.comp.decomp.vecs,
1596                         desc->suite.comp.comp.count,
1597                         desc->suite.comp.decomp.count);
1598
1599         crypto_free_comp(tfm);
1600         return err;
1601 }
1602
1603 static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver,
1604                           u32 type, u32 mask)
1605 {
1606         struct crypto_pcomp *tfm;
1607         int err;
1608
1609         tfm = crypto_alloc_pcomp(driver, type, mask);
1610         if (IS_ERR(tfm)) {
1611                 pr_err("alg: pcomp: Failed to load transform for %s: %ld\n",
1612                        driver, PTR_ERR(tfm));
1613                 return PTR_ERR(tfm);
1614         }
1615
1616         err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs,
1617                          desc->suite.pcomp.decomp.vecs,
1618                          desc->suite.pcomp.comp.count,
1619                          desc->suite.pcomp.decomp.count);
1620
1621         crypto_free_pcomp(tfm);
1622         return err;
1623 }
1624
1625 static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
1626                          u32 type, u32 mask)
1627 {
1628         struct crypto_ahash *tfm;
1629         int err;
1630
1631         tfm = crypto_alloc_ahash(driver, type, mask);
1632         if (IS_ERR(tfm)) {
1633                 printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
1634                        "%ld\n", driver, PTR_ERR(tfm));
1635                 return PTR_ERR(tfm);
1636         }
1637
1638         err = test_hash(tfm, desc->suite.hash.vecs,
1639                         desc->suite.hash.count, true);
1640         if (!err)
1641                 err = test_hash(tfm, desc->suite.hash.vecs,
1642                                 desc->suite.hash.count, false);
1643
1644         crypto_free_ahash(tfm);
1645         return err;
1646 }
1647
1648 static int alg_test_crc32c(const struct alg_test_desc *desc,
1649                            const char *driver, u32 type, u32 mask)
1650 {
1651         struct crypto_shash *tfm;
1652         u32 val;
1653         int err;
1654
1655         err = alg_test_hash(desc, driver, type, mask);
1656         if (err)
1657                 goto out;
1658
1659         tfm = crypto_alloc_shash(driver, type, mask);
1660         if (IS_ERR(tfm)) {
1661                 printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
1662                        "%ld\n", driver, PTR_ERR(tfm));
1663                 err = PTR_ERR(tfm);
1664                 goto out;
1665         }
1666
1667         do {
1668                 struct {
1669                         struct shash_desc shash;
1670                         char ctx[crypto_shash_descsize(tfm)];
1671                 } sdesc;
1672
1673                 sdesc.shash.tfm = tfm;
1674                 sdesc.shash.flags = 0;
1675
1676                 *(u32 *)sdesc.ctx = le32_to_cpu(420553207);
1677                 err = crypto_shash_final(&sdesc.shash, (u8 *)&val);
1678                 if (err) {
1679                         printk(KERN_ERR "alg: crc32c: Operation failed for "
1680                                "%s: %d\n", driver, err);
1681                         break;
1682                 }
1683
1684                 if (val != ~420553207) {
1685                         printk(KERN_ERR "alg: crc32c: Test failed for %s: "
1686                                "%d\n", driver, val);
1687                         err = -EINVAL;
1688                 }
1689         } while (0);
1690
1691         crypto_free_shash(tfm);
1692
1693 out:
1694         return err;
1695 }
1696
1697 static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
1698                           u32 type, u32 mask)
1699 {
1700         struct crypto_rng *rng;
1701         int err;
1702
1703         rng = crypto_alloc_rng(driver, type, mask);
1704         if (IS_ERR(rng)) {
1705                 printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
1706                        "%ld\n", driver, PTR_ERR(rng));
1707                 return PTR_ERR(rng);
1708         }
1709
1710         err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count);
1711
1712         crypto_free_rng(rng);
1713
1714         return err;
1715 }
1716
1717 static int alg_test_null(const struct alg_test_desc *desc,
1718                              const char *driver, u32 type, u32 mask)
1719 {
1720         return 0;
1721 }
1722
1723 /* Please keep this list sorted by algorithm name. */
1724 static const struct alg_test_desc alg_test_descs[] = {
1725         {
1726                 .alg = "__cbc-cast5-avx",
1727                 .test = alg_test_null,
1728         }, {
1729                 .alg = "__cbc-cast6-avx",
1730                 .test = alg_test_null,
1731         }, {
1732                 .alg = "__cbc-serpent-avx",
1733                 .test = alg_test_null,
1734         }, {
1735                 .alg = "__cbc-serpent-avx2",
1736                 .test = alg_test_null,
1737         }, {
1738                 .alg = "__cbc-serpent-sse2",
1739                 .test = alg_test_null,
1740         }, {
1741                 .alg = "__cbc-twofish-avx",
1742                 .test = alg_test_null,
1743         }, {
1744                 .alg = "__driver-cbc-aes-aesni",
1745                 .test = alg_test_null,
1746                 .fips_allowed = 1,
1747         }, {
1748                 .alg = "__driver-cbc-camellia-aesni",
1749                 .test = alg_test_null,
1750         }, {
1751                 .alg = "__driver-cbc-camellia-aesni-avx2",
1752                 .test = alg_test_null,
1753         }, {
1754                 .alg = "__driver-cbc-cast5-avx",
1755                 .test = alg_test_null,
1756         }, {
1757                 .alg = "__driver-cbc-cast6-avx",
1758                 .test = alg_test_null,
1759         }, {
1760                 .alg = "__driver-cbc-serpent-avx",
1761                 .test = alg_test_null,
1762         }, {
1763                 .alg = "__driver-cbc-serpent-avx2",
1764                 .test = alg_test_null,
1765         }, {
1766                 .alg = "__driver-cbc-serpent-sse2",
1767                 .test = alg_test_null,
1768         }, {
1769                 .alg = "__driver-cbc-twofish-avx",
1770                 .test = alg_test_null,
1771         }, {
1772                 .alg = "__driver-ecb-aes-aesni",
1773                 .test = alg_test_null,
1774                 .fips_allowed = 1,
1775         }, {
1776                 .alg = "__driver-ecb-camellia-aesni",
1777                 .test = alg_test_null,
1778         }, {
1779                 .alg = "__driver-ecb-camellia-aesni-avx2",
1780                 .test = alg_test_null,
1781         }, {
1782                 .alg = "__driver-ecb-cast5-avx",
1783                 .test = alg_test_null,
1784         }, {
1785                 .alg = "__driver-ecb-cast6-avx",
1786                 .test = alg_test_null,
1787         }, {
1788                 .alg = "__driver-ecb-serpent-avx",
1789                 .test = alg_test_null,
1790         }, {
1791                 .alg = "__driver-ecb-serpent-avx2",
1792                 .test = alg_test_null,
1793         }, {
1794                 .alg = "__driver-ecb-serpent-sse2",
1795                 .test = alg_test_null,
1796         }, {
1797                 .alg = "__driver-ecb-twofish-avx",
1798                 .test = alg_test_null,
1799         }, {
1800                 .alg = "__ghash-pclmulqdqni",
1801                 .test = alg_test_null,
1802                 .fips_allowed = 1,
1803         }, {
1804                 .alg = "ansi_cprng",
1805                 .test = alg_test_cprng,
1806                 .fips_allowed = 1,
1807                 .suite = {
1808                         .cprng = {
1809                                 .vecs = ansi_cprng_aes_tv_template,
1810                                 .count = ANSI_CPRNG_AES_TEST_VECTORS
1811                         }
1812                 }
1813         }, {
1814                 .alg = "authenc(hmac(sha1),cbc(aes))",
1815                 .test = alg_test_aead,
1816                 .fips_allowed = 1,
1817                 .suite = {
1818                         .aead = {
1819                                 .enc = {
1820                                         .vecs = hmac_sha1_aes_cbc_enc_tv_template,
1821                                         .count = HMAC_SHA1_AES_CBC_ENC_TEST_VECTORS
1822                                 }
1823                         }
1824                 }
1825         }, {
1826                 .alg = "authenc(hmac(sha256),cbc(aes))",
1827                 .test = alg_test_aead,
1828                 .fips_allowed = 1,
1829                 .suite = {
1830                         .aead = {
1831                                 .enc = {
1832                                         .vecs = hmac_sha256_aes_cbc_enc_tv_template,
1833                                         .count = HMAC_SHA256_AES_CBC_ENC_TEST_VECTORS
1834                                 }
1835                         }
1836                 }
1837         }, {
1838                 .alg = "authenc(hmac(sha512),cbc(aes))",
1839                 .test = alg_test_aead,
1840                 .fips_allowed = 1,
1841                 .suite = {
1842                         .aead = {
1843                                 .enc = {
1844                                         .vecs = hmac_sha512_aes_cbc_enc_tv_template,
1845                                         .count = HMAC_SHA512_AES_CBC_ENC_TEST_VECTORS
1846                                 }
1847                         }
1848                 }
1849         }, {
1850                 .alg = "cbc(aes)",
1851                 .test = alg_test_skcipher,
1852                 .fips_allowed = 1,
1853                 .suite = {
1854                         .cipher = {
1855                                 .enc = {
1856                                         .vecs = aes_cbc_enc_tv_template,
1857                                         .count = AES_CBC_ENC_TEST_VECTORS
1858                                 },
1859                                 .dec = {
1860                                         .vecs = aes_cbc_dec_tv_template,
1861                                         .count = AES_CBC_DEC_TEST_VECTORS
1862                                 }
1863                         }
1864                 }
1865         }, {
1866                 .alg = "cbc(anubis)",
1867                 .test = alg_test_skcipher,
1868                 .suite = {
1869                         .cipher = {
1870                                 .enc = {
1871                                         .vecs = anubis_cbc_enc_tv_template,
1872                                         .count = ANUBIS_CBC_ENC_TEST_VECTORS
1873                                 },
1874                                 .dec = {
1875                                         .vecs = anubis_cbc_dec_tv_template,
1876                                         .count = ANUBIS_CBC_DEC_TEST_VECTORS
1877                                 }
1878                         }
1879                 }
1880         }, {
1881                 .alg = "cbc(blowfish)",
1882                 .test = alg_test_skcipher,
1883                 .suite = {
1884                         .cipher = {
1885                                 .enc = {
1886                                         .vecs = bf_cbc_enc_tv_template,
1887                                         .count = BF_CBC_ENC_TEST_VECTORS
1888                                 },
1889                                 .dec = {
1890                                         .vecs = bf_cbc_dec_tv_template,
1891                                         .count = BF_CBC_DEC_TEST_VECTORS
1892                                 }
1893                         }
1894                 }
1895         }, {
1896                 .alg = "cbc(camellia)",
1897                 .test = alg_test_skcipher,
1898                 .suite = {
1899                         .cipher = {
1900                                 .enc = {
1901                                         .vecs = camellia_cbc_enc_tv_template,
1902                                         .count = CAMELLIA_CBC_ENC_TEST_VECTORS
1903                                 },
1904                                 .dec = {
1905                                         .vecs = camellia_cbc_dec_tv_template,
1906                                         .count = CAMELLIA_CBC_DEC_TEST_VECTORS
1907                                 }
1908                         }
1909                 }
1910         }, {
1911                 .alg = "cbc(cast5)",
1912                 .test = alg_test_skcipher,
1913                 .suite = {
1914                         .cipher = {
1915                                 .enc = {
1916                                         .vecs = cast5_cbc_enc_tv_template,
1917                                         .count = CAST5_CBC_ENC_TEST_VECTORS
1918                                 },
1919                                 .dec = {
1920                                         .vecs = cast5_cbc_dec_tv_template,
1921                                         .count = CAST5_CBC_DEC_TEST_VECTORS
1922                                 }
1923                         }
1924                 }
1925         }, {
1926                 .alg = "cbc(cast6)",
1927                 .test = alg_test_skcipher,
1928                 .suite = {
1929                         .cipher = {
1930                                 .enc = {
1931                                         .vecs = cast6_cbc_enc_tv_template,
1932                                         .count = CAST6_CBC_ENC_TEST_VECTORS
1933                                 },
1934                                 .dec = {
1935                                         .vecs = cast6_cbc_dec_tv_template,
1936                                         .count = CAST6_CBC_DEC_TEST_VECTORS
1937                                 }
1938                         }
1939                 }
1940         }, {
1941                 .alg = "cbc(des)",
1942                 .test = alg_test_skcipher,
1943                 .suite = {
1944                         .cipher = {
1945                                 .enc = {
1946                                         .vecs = des_cbc_enc_tv_template,
1947                                         .count = DES_CBC_ENC_TEST_VECTORS
1948                                 },
1949                                 .dec = {
1950                                         .vecs = des_cbc_dec_tv_template,
1951                                         .count = DES_CBC_DEC_TEST_VECTORS
1952                                 }
1953                         }
1954                 }
1955         }, {
1956                 .alg = "cbc(des3_ede)",
1957                 .test = alg_test_skcipher,
1958                 .fips_allowed = 1,
1959                 .suite = {
1960                         .cipher = {
1961                                 .enc = {
1962                                         .vecs = des3_ede_cbc_enc_tv_template,
1963                                         .count = DES3_EDE_CBC_ENC_TEST_VECTORS
1964                                 },
1965                                 .dec = {
1966                                         .vecs = des3_ede_cbc_dec_tv_template,
1967                                         .count = DES3_EDE_CBC_DEC_TEST_VECTORS
1968                                 }
1969                         }
1970                 }
1971         }, {
1972                 .alg = "cbc(serpent)",
1973                 .test = alg_test_skcipher,
1974                 .suite = {
1975                         .cipher = {
1976                                 .enc = {
1977                                         .vecs = serpent_cbc_enc_tv_template,
1978                                         .count = SERPENT_CBC_ENC_TEST_VECTORS
1979                                 },
1980                                 .dec = {
1981                                         .vecs = serpent_cbc_dec_tv_template,
1982                                         .count = SERPENT_CBC_DEC_TEST_VECTORS
1983                                 }
1984                         }
1985                 }
1986         }, {
1987                 .alg = "cbc(twofish)",
1988                 .test = alg_test_skcipher,
1989                 .suite = {
1990                         .cipher = {
1991                                 .enc = {
1992                                         .vecs = tf_cbc_enc_tv_template,
1993                                         .count = TF_CBC_ENC_TEST_VECTORS
1994                                 },
1995                                 .dec = {
1996                                         .vecs = tf_cbc_dec_tv_template,
1997                                         .count = TF_CBC_DEC_TEST_VECTORS
1998                                 }
1999                         }
2000                 }
2001         }, {
2002                 .alg = "ccm(aes)",
2003                 .test = alg_test_aead,
2004                 .fips_allowed = 1,
2005                 .suite = {
2006                         .aead = {
2007                                 .enc = {
2008                                         .vecs = aes_ccm_enc_tv_template,
2009                                         .count = AES_CCM_ENC_TEST_VECTORS
2010                                 },
2011                                 .dec = {
2012                                         .vecs = aes_ccm_dec_tv_template,
2013                                         .count = AES_CCM_DEC_TEST_VECTORS
2014                                 }
2015                         }
2016                 }
2017         }, {
2018                 .alg = "cmac(aes)",
2019                 .test = alg_test_hash,
2020                 .suite = {
2021                         .hash = {
2022                                 .vecs = aes_cmac128_tv_template,
2023                                 .count = CMAC_AES_TEST_VECTORS
2024                         }
2025                 }
2026         }, {
2027                 .alg = "cmac(des3_ede)",
2028                 .test = alg_test_hash,
2029                 .suite = {
2030                         .hash = {
2031                                 .vecs = des3_ede_cmac64_tv_template,
2032                                 .count = CMAC_DES3_EDE_TEST_VECTORS
2033                         }
2034                 }
2035         }, {
2036                 .alg = "compress_null",
2037                 .test = alg_test_null,
2038         }, {
2039                 .alg = "crc32c",
2040                 .test = alg_test_crc32c,
2041                 .fips_allowed = 1,
2042                 .suite = {
2043                         .hash = {
2044                                 .vecs = crc32c_tv_template,
2045                                 .count = CRC32C_TEST_VECTORS
2046                         }
2047                 }
2048         }, {
2049                 .alg = "cryptd(__driver-cbc-aes-aesni)",
2050                 .test = alg_test_null,
2051                 .fips_allowed = 1,
2052         }, {
2053                 .alg = "cryptd(__driver-cbc-camellia-aesni)",
2054                 .test = alg_test_null,
2055         }, {
2056                 .alg = "cryptd(__driver-cbc-camellia-aesni-avx2)",
2057                 .test = alg_test_null,
2058         }, {
2059                 .alg = "cryptd(__driver-cbc-serpent-avx2)",
2060                 .test = alg_test_null,
2061         }, {
2062                 .alg = "cryptd(__driver-ecb-aes-aesni)",
2063                 .test = alg_test_null,
2064                 .fips_allowed = 1,
2065         }, {
2066                 .alg = "cryptd(__driver-ecb-camellia-aesni)",
2067                 .test = alg_test_null,
2068         }, {
2069                 .alg = "cryptd(__driver-ecb-camellia-aesni-avx2)",
2070                 .test = alg_test_null,
2071         }, {
2072                 .alg = "cryptd(__driver-ecb-cast5-avx)",
2073                 .test = alg_test_null,
2074         }, {
2075                 .alg = "cryptd(__driver-ecb-cast6-avx)",
2076                 .test = alg_test_null,
2077         }, {
2078                 .alg = "cryptd(__driver-ecb-serpent-avx)",
2079                 .test = alg_test_null,
2080         }, {
2081                 .alg = "cryptd(__driver-ecb-serpent-avx2)",
2082                 .test = alg_test_null,
2083         }, {
2084                 .alg = "cryptd(__driver-ecb-serpent-sse2)",
2085                 .test = alg_test_null,
2086         }, {
2087                 .alg = "cryptd(__driver-ecb-twofish-avx)",
2088                 .test = alg_test_null,
2089         }, {
2090                 .alg = "cryptd(__driver-gcm-aes-aesni)",
2091                 .test = alg_test_null,
2092                 .fips_allowed = 1,
2093         }, {
2094                 .alg = "cryptd(__ghash-pclmulqdqni)",
2095                 .test = alg_test_null,
2096                 .fips_allowed = 1,
2097         }, {
2098                 .alg = "ctr(aes)",
2099                 .test = alg_test_skcipher,
2100                 .fips_allowed = 1,
2101                 .suite = {
2102                         .cipher = {
2103                                 .enc = {
2104                                         .vecs = aes_ctr_enc_tv_template,
2105                                         .count = AES_CTR_ENC_TEST_VECTORS
2106                                 },
2107                                 .dec = {
2108                                         .vecs = aes_ctr_dec_tv_template,
2109                                         .count = AES_CTR_DEC_TEST_VECTORS
2110                                 }
2111                         }
2112                 }
2113         }, {
2114                 .alg = "ctr(blowfish)",
2115                 .test = alg_test_skcipher,
2116                 .suite = {
2117                         .cipher = {
2118                                 .enc = {
2119                                         .vecs = bf_ctr_enc_tv_template,
2120                                         .count = BF_CTR_ENC_TEST_VECTORS
2121                                 },
2122                                 .dec = {
2123                                         .vecs = bf_ctr_dec_tv_template,
2124                                         .count = BF_CTR_DEC_TEST_VECTORS
2125                                 }
2126                         }
2127                 }
2128         }, {
2129                 .alg = "ctr(camellia)",
2130                 .test = alg_test_skcipher,
2131                 .suite = {
2132                         .cipher = {
2133                                 .enc = {
2134                                         .vecs = camellia_ctr_enc_tv_template,
2135                                         .count = CAMELLIA_CTR_ENC_TEST_VECTORS
2136                                 },
2137                                 .dec = {
2138                                         .vecs = camellia_ctr_dec_tv_template,
2139                                         .count = CAMELLIA_CTR_DEC_TEST_VECTORS
2140                                 }
2141                         }
2142                 }
2143         }, {
2144                 .alg = "ctr(cast5)",
2145                 .test = alg_test_skcipher,
2146                 .suite = {
2147                         .cipher = {
2148                                 .enc = {
2149                                         .vecs = cast5_ctr_enc_tv_template,
2150                                         .count = CAST5_CTR_ENC_TEST_VECTORS
2151                                 },
2152                                 .dec = {
2153                                         .vecs = cast5_ctr_dec_tv_template,
2154                                         .count = CAST5_CTR_DEC_TEST_VECTORS
2155                                 }
2156                         }
2157                 }
2158         }, {
2159                 .alg = "ctr(cast6)",
2160                 .test = alg_test_skcipher,
2161                 .suite = {
2162                         .cipher = {
2163                                 .enc = {
2164                                         .vecs = cast6_ctr_enc_tv_template,
2165                                         .count = CAST6_CTR_ENC_TEST_VECTORS
2166                                 },
2167                                 .dec = {
2168                                         .vecs = cast6_ctr_dec_tv_template,
2169                                         .count = CAST6_CTR_DEC_TEST_VECTORS
2170                                 }
2171                         }
2172                 }
2173         }, {
2174                 .alg = "ctr(des)",
2175                 .test = alg_test_skcipher,
2176                 .suite = {
2177                         .cipher = {
2178                                 .enc = {
2179                                         .vecs = des_ctr_enc_tv_template,
2180                                         .count = DES_CTR_ENC_TEST_VECTORS
2181                                 },
2182                                 .dec = {
2183                                         .vecs = des_ctr_dec_tv_template,
2184                                         .count = DES_CTR_DEC_TEST_VECTORS
2185                                 }
2186                         }
2187                 }
2188         }, {
2189                 .alg = "ctr(des3_ede)",
2190                 .test = alg_test_skcipher,
2191                 .suite = {
2192                         .cipher = {
2193                                 .enc = {
2194                                         .vecs = des3_ede_ctr_enc_tv_template,
2195                                         .count = DES3_EDE_CTR_ENC_TEST_VECTORS
2196                                 },
2197                                 .dec = {
2198                                         .vecs = des3_ede_ctr_dec_tv_template,
2199                                         .count = DES3_EDE_CTR_DEC_TEST_VECTORS
2200                                 }
2201                         }
2202                 }
2203         }, {
2204                 .alg = "ctr(serpent)",
2205                 .test = alg_test_skcipher,
2206                 .suite = {
2207                         .cipher = {
2208                                 .enc = {
2209                                         .vecs = serpent_ctr_enc_tv_template,
2210                                         .count = SERPENT_CTR_ENC_TEST_VECTORS
2211                                 },
2212                                 .dec = {
2213                                         .vecs = serpent_ctr_dec_tv_template,
2214                                         .count = SERPENT_CTR_DEC_TEST_VECTORS
2215                                 }
2216                         }
2217                 }
2218         }, {
2219                 .alg = "ctr(twofish)",
2220                 .test = alg_test_skcipher,
2221                 .suite = {
2222                         .cipher = {
2223                                 .enc = {
2224                                         .vecs = tf_ctr_enc_tv_template,
2225                                         .count = TF_CTR_ENC_TEST_VECTORS
2226                                 },
2227                                 .dec = {
2228                                         .vecs = tf_ctr_dec_tv_template,
2229                                         .count = TF_CTR_DEC_TEST_VECTORS
2230                                 }
2231                         }
2232                 }
2233         }, {
2234                 .alg = "cts(cbc(aes))",
2235                 .test = alg_test_skcipher,
2236                 .suite = {
2237                         .cipher = {
2238                                 .enc = {
2239                                         .vecs = cts_mode_enc_tv_template,
2240                                         .count = CTS_MODE_ENC_TEST_VECTORS
2241                                 },
2242                                 .dec = {
2243                                         .vecs = cts_mode_dec_tv_template,
2244                                         .count = CTS_MODE_DEC_TEST_VECTORS
2245                                 }
2246                         }
2247                 }
2248         }, {
2249                 .alg = "deflate",
2250                 .test = alg_test_comp,
2251                 .fips_allowed = 1,
2252                 .suite = {
2253                         .comp = {
2254                                 .comp = {
2255                                         .vecs = deflate_comp_tv_template,
2256                                         .count = DEFLATE_COMP_TEST_VECTORS
2257                                 },
2258                                 .decomp = {
2259                                         .vecs = deflate_decomp_tv_template,
2260                                         .count = DEFLATE_DECOMP_TEST_VECTORS
2261                                 }
2262                         }
2263                 }
2264         }, {
2265                 .alg = "digest_null",
2266                 .test = alg_test_null,
2267         }, {
2268                 .alg = "ecb(__aes-aesni)",
2269                 .test = alg_test_null,
2270                 .fips_allowed = 1,
2271         }, {
2272                 .alg = "ecb(aes)",
2273                 .test = alg_test_skcipher,
2274                 .fips_allowed = 1,
2275                 .suite = {
2276                         .cipher = {
2277                                 .enc = {
2278                                         .vecs = aes_enc_tv_template,
2279                                         .count = AES_ENC_TEST_VECTORS
2280                                 },
2281                                 .dec = {
2282                                         .vecs = aes_dec_tv_template,
2283                                         .count = AES_DEC_TEST_VECTORS
2284                                 }
2285                         }
2286                 }
2287         }, {
2288                 .alg = "ecb(anubis)",
2289                 .test = alg_test_skcipher,
2290                 .suite = {
2291                         .cipher = {
2292                                 .enc = {
2293                                         .vecs = anubis_enc_tv_template,
2294                                         .count = ANUBIS_ENC_TEST_VECTORS
2295                                 },
2296                                 .dec = {
2297                                         .vecs = anubis_dec_tv_template,
2298                                         .count = ANUBIS_DEC_TEST_VECTORS
2299                                 }
2300                         }
2301                 }
2302         }, {
2303                 .alg = "ecb(arc4)",
2304                 .test = alg_test_skcipher,
2305                 .suite = {
2306                         .cipher = {
2307                                 .enc = {
2308                                         .vecs = arc4_enc_tv_template,
2309                                         .count = ARC4_ENC_TEST_VECTORS
2310                                 },
2311                                 .dec = {
2312                                         .vecs = arc4_dec_tv_template,
2313                                         .count = ARC4_DEC_TEST_VECTORS
2314                                 }
2315                         }
2316                 }
2317         }, {
2318                 .alg = "ecb(blowfish)",
2319                 .test = alg_test_skcipher,
2320                 .suite = {
2321                         .cipher = {
2322                                 .enc = {
2323                                         .vecs = bf_enc_tv_template,
2324                                         .count = BF_ENC_TEST_VECTORS
2325                                 },
2326                                 .dec = {
2327                                         .vecs = bf_dec_tv_template,
2328                                         .count = BF_DEC_TEST_VECTORS
2329                                 }
2330                         }
2331                 }
2332         }, {
2333                 .alg = "ecb(camellia)",
2334                 .test = alg_test_skcipher,
2335                 .suite = {
2336                         .cipher = {
2337                                 .enc = {
2338                                         .vecs = camellia_enc_tv_template,
2339                                         .count = CAMELLIA_ENC_TEST_VECTORS
2340                                 },
2341                                 .dec = {
2342                                         .vecs = camellia_dec_tv_template,
2343                                         .count = CAMELLIA_DEC_TEST_VECTORS
2344                                 }
2345                         }
2346                 }
2347         }, {
2348                 .alg = "ecb(cast5)",
2349                 .test = alg_test_skcipher,
2350                 .suite = {
2351                         .cipher = {
2352                                 .enc = {
2353                                         .vecs = cast5_enc_tv_template,
2354                                         .count = CAST5_ENC_TEST_VECTORS
2355                                 },
2356                                 .dec = {
2357                                         .vecs = cast5_dec_tv_template,
2358                                         .count = CAST5_DEC_TEST_VECTORS
2359                                 }
2360                         }
2361                 }
2362         }, {
2363                 .alg = "ecb(cast6)",
2364                 .test = alg_test_skcipher,
2365                 .suite = {
2366                         .cipher = {
2367                                 .enc = {
2368                                         .vecs = cast6_enc_tv_template,
2369                                         .count = CAST6_ENC_TEST_VECTORS
2370                                 },
2371                                 .dec = {
2372                                         .vecs = cast6_dec_tv_template,
2373                                         .count = CAST6_DEC_TEST_VECTORS
2374                                 }
2375                         }
2376                 }
2377         }, {
2378                 .alg = "ecb(cipher_null)",
2379                 .test = alg_test_null,
2380         }, {
2381                 .alg = "ecb(des)",
2382                 .test = alg_test_skcipher,
2383                 .fips_allowed = 1,
2384                 .suite = {
2385                         .cipher = {
2386                                 .enc = {
2387                                         .vecs = des_enc_tv_template,
2388                                         .count = DES_ENC_TEST_VECTORS
2389                                 },
2390                                 .dec = {
2391                                         .vecs = des_dec_tv_template,
2392                                         .count = DES_DEC_TEST_VECTORS
2393                                 }
2394                         }
2395                 }
2396         }, {
2397                 .alg = "ecb(des3_ede)",
2398                 .test = alg_test_skcipher,
2399                 .fips_allowed = 1,
2400                 .suite = {
2401                         .cipher = {
2402                                 .enc = {
2403                                         .vecs = des3_ede_enc_tv_template,
2404                                         .count = DES3_EDE_ENC_TEST_VECTORS
2405                                 },
2406                                 .dec = {
2407                                         .vecs = des3_ede_dec_tv_template,
2408                                         .count = DES3_EDE_DEC_TEST_VECTORS
2409                                 }
2410                         }
2411                 }
2412         }, {
2413                 .alg = "ecb(fcrypt)",
2414                 .test = alg_test_skcipher,
2415                 .suite = {
2416                         .cipher = {
2417                                 .enc = {
2418                                         .vecs = fcrypt_pcbc_enc_tv_template,
2419                                         .count = 1
2420                                 },
2421                                 .dec = {
2422                                         .vecs = fcrypt_pcbc_dec_tv_template,
2423                                         .count = 1
2424                                 }
2425                         }
2426                 }
2427         }, {
2428                 .alg = "ecb(khazad)",
2429                 .test = alg_test_skcipher,
2430                 .suite = {
2431                         .cipher = {
2432                                 .enc = {
2433                                         .vecs = khazad_enc_tv_template,
2434                                         .count = KHAZAD_ENC_TEST_VECTORS
2435                                 },
2436                                 .dec = {
2437                                         .vecs = khazad_dec_tv_template,
2438                                         .count = KHAZAD_DEC_TEST_VECTORS
2439                                 }
2440                         }
2441                 }
2442         }, {
2443                 .alg = "ecb(seed)",
2444                 .test = alg_test_skcipher,
2445                 .suite = {
2446                         .cipher = {
2447                                 .enc = {
2448                                         .vecs = seed_enc_tv_template,
2449                                         .count = SEED_ENC_TEST_VECTORS
2450                                 },
2451                                 .dec = {
2452                                         .vecs = seed_dec_tv_template,
2453                                         .count = SEED_DEC_TEST_VECTORS
2454                                 }
2455                         }
2456                 }
2457         }, {
2458                 .alg = "ecb(serpent)",
2459                 .test = alg_test_skcipher,
2460                 .suite = {
2461                         .cipher = {
2462                                 .enc = {
2463                                         .vecs = serpent_enc_tv_template,
2464                                         .count = SERPENT_ENC_TEST_VECTORS
2465                                 },
2466                                 .dec = {
2467                                         .vecs = serpent_dec_tv_template,
2468                                         .count = SERPENT_DEC_TEST_VECTORS
2469                                 }
2470                         }
2471                 }
2472         }, {
2473                 .alg = "ecb(tea)",
2474                 .test = alg_test_skcipher,
2475                 .suite = {
2476                         .cipher = {
2477                                 .enc = {
2478                                         .vecs = tea_enc_tv_template,
2479                                         .count = TEA_ENC_TEST_VECTORS
2480                                 },
2481                                 .dec = {
2482                                         .vecs = tea_dec_tv_template,
2483                                         .count = TEA_DEC_TEST_VECTORS
2484                                 }
2485                         }
2486                 }
2487         }, {
2488                 .alg = "ecb(tnepres)",
2489                 .test = alg_test_skcipher,
2490                 .suite = {
2491                         .cipher = {
2492                                 .enc = {
2493                                         .vecs = tnepres_enc_tv_template,
2494                                         .count = TNEPRES_ENC_TEST_VECTORS
2495                                 },
2496                                 .dec = {
2497                                         .vecs = tnepres_dec_tv_template,
2498                                         .count = TNEPRES_DEC_TEST_VECTORS
2499                                 }
2500                         }
2501                 }
2502         }, {
2503                 .alg = "ecb(twofish)",
2504                 .test = alg_test_skcipher,
2505                 .suite = {
2506                         .cipher = {
2507                                 .enc = {
2508                                         .vecs = tf_enc_tv_template,
2509                                         .count = TF_ENC_TEST_VECTORS
2510                                 },
2511                                 .dec = {
2512                                         .vecs = tf_dec_tv_template,
2513                                         .count = TF_DEC_TEST_VECTORS
2514                                 }
2515                         }
2516                 }
2517         }, {
2518                 .alg = "ecb(xeta)",
2519                 .test = alg_test_skcipher,
2520                 .suite = {
2521                         .cipher = {
2522                                 .enc = {
2523                                         .vecs = xeta_enc_tv_template,
2524                                         .count = XETA_ENC_TEST_VECTORS
2525                                 },
2526                                 .dec = {
2527                                         .vecs = xeta_dec_tv_template,
2528                                         .count = XETA_DEC_TEST_VECTORS
2529                                 }
2530                         }
2531                 }
2532         }, {
2533                 .alg = "ecb(xtea)",
2534                 .test = alg_test_skcipher,
2535                 .suite = {
2536                         .cipher = {
2537                                 .enc = {
2538                                         .vecs = xtea_enc_tv_template,
2539                                         .count = XTEA_ENC_TEST_VECTORS
2540                                 },
2541                                 .dec = {
2542                                         .vecs = xtea_dec_tv_template,
2543                                         .count = XTEA_DEC_TEST_VECTORS
2544                                 }
2545                         }
2546                 }
2547         }, {
2548                 .alg = "gcm(aes)",
2549                 .test = alg_test_aead,
2550                 .fips_allowed = 1,
2551                 .suite = {
2552                         .aead = {
2553                                 .enc = {
2554                                         .vecs = aes_gcm_enc_tv_template,
2555                                         .count = AES_GCM_ENC_TEST_VECTORS
2556                                 },
2557                                 .dec = {
2558                                         .vecs = aes_gcm_dec_tv_template,
2559                                         .count = AES_GCM_DEC_TEST_VECTORS
2560                                 }
2561                         }
2562                 }
2563         }, {
2564                 .alg = "ghash",
2565                 .test = alg_test_hash,
2566                 .fips_allowed = 1,
2567                 .suite = {
2568                         .hash = {
2569                                 .vecs = ghash_tv_template,
2570                                 .count = GHASH_TEST_VECTORS
2571                         }
2572                 }
2573         }, {
2574                 .alg = "hmac(crc32)",
2575                 .test = alg_test_hash,
2576                 .suite = {
2577                         .hash = {
2578                                 .vecs = bfin_crc_tv_template,
2579                                 .count = BFIN_CRC_TEST_VECTORS
2580                         }
2581                 }
2582         }, {
2583                 .alg = "hmac(md5)",
2584                 .test = alg_test_hash,
2585                 .suite = {
2586                         .hash = {
2587                                 .vecs = hmac_md5_tv_template,
2588                                 .count = HMAC_MD5_TEST_VECTORS
2589                         }
2590                 }
2591         }, {
2592                 .alg = "hmac(rmd128)",
2593                 .test = alg_test_hash,
2594                 .suite = {
2595                         .hash = {
2596                                 .vecs = hmac_rmd128_tv_template,
2597                                 .count = HMAC_RMD128_TEST_VECTORS
2598                         }
2599                 }
2600         }, {
2601                 .alg = "hmac(rmd160)",
2602                 .test = alg_test_hash,
2603                 .suite = {
2604                         .hash = {
2605                                 .vecs = hmac_rmd160_tv_template,
2606                                 .count = HMAC_RMD160_TEST_VECTORS
2607                         }
2608                 }
2609         }, {
2610                 .alg = "hmac(sha1)",
2611                 .test = alg_test_hash,
2612                 .fips_allowed = 1,
2613                 .suite = {
2614                         .hash = {
2615                                 .vecs = hmac_sha1_tv_template,
2616                                 .count = HMAC_SHA1_TEST_VECTORS
2617                         }
2618                 }
2619         }, {
2620                 .alg = "hmac(sha224)",
2621                 .test = alg_test_hash,
2622                 .fips_allowed = 1,
2623                 .suite = {
2624                         .hash = {
2625                                 .vecs = hmac_sha224_tv_template,
2626                                 .count = HMAC_SHA224_TEST_VECTORS
2627                         }
2628                 }
2629         }, {
2630                 .alg = "hmac(sha256)",
2631                 .test = alg_test_hash,
2632                 .fips_allowed = 1,
2633                 .suite = {
2634                         .hash = {
2635                                 .vecs = hmac_sha256_tv_template,
2636                                 .count = HMAC_SHA256_TEST_VECTORS
2637                         }
2638                 }
2639         }, {
2640                 .alg = "hmac(sha384)",
2641                 .test = alg_test_hash,
2642                 .fips_allowed = 1,
2643                 .suite = {
2644                         .hash = {
2645                                 .vecs = hmac_sha384_tv_template,
2646                                 .count = HMAC_SHA384_TEST_VECTORS
2647                         }
2648                 }
2649         }, {
2650                 .alg = "hmac(sha512)",
2651                 .test = alg_test_hash,
2652                 .fips_allowed = 1,
2653                 .suite = {
2654                         .hash = {
2655                                 .vecs = hmac_sha512_tv_template,
2656                                 .count = HMAC_SHA512_TEST_VECTORS
2657                         }
2658                 }
2659         }, {
2660                 .alg = "lrw(aes)",
2661                 .test = alg_test_skcipher,
2662                 .suite = {
2663                         .cipher = {
2664                                 .enc = {
2665                                         .vecs = aes_lrw_enc_tv_template,
2666                                         .count = AES_LRW_ENC_TEST_VECTORS
2667                                 },
2668                                 .dec = {
2669                                         .vecs = aes_lrw_dec_tv_template,
2670                                         .count = AES_LRW_DEC_TEST_VECTORS
2671                                 }
2672                         }
2673                 }
2674         }, {
2675                 .alg = "lrw(camellia)",
2676                 .test = alg_test_skcipher,
2677                 .suite = {
2678                         .cipher = {
2679                                 .enc = {
2680                                         .vecs = camellia_lrw_enc_tv_template,
2681                                         .count = CAMELLIA_LRW_ENC_TEST_VECTORS
2682                                 },
2683                                 .dec = {
2684                                         .vecs = camellia_lrw_dec_tv_template,
2685                                         .count = CAMELLIA_LRW_DEC_TEST_VECTORS
2686                                 }
2687                         }
2688                 }
2689         }, {
2690                 .alg = "lrw(cast6)",
2691                 .test = alg_test_skcipher,
2692                 .suite = {
2693                         .cipher = {
2694                                 .enc = {
2695                                         .vecs = cast6_lrw_enc_tv_template,
2696                                         .count = CAST6_LRW_ENC_TEST_VECTORS
2697                                 },
2698                                 .dec = {
2699                                         .vecs = cast6_lrw_dec_tv_template,
2700                                         .count = CAST6_LRW_DEC_TEST_VECTORS
2701                                 }
2702                         }
2703                 }
2704         }, {
2705                 .alg = "lrw(serpent)",
2706                 .test = alg_test_skcipher,
2707                 .suite = {
2708                         .cipher = {
2709                                 .enc = {
2710                                         .vecs = serpent_lrw_enc_tv_template,
2711                                         .count = SERPENT_LRW_ENC_TEST_VECTORS
2712                                 },
2713                                 .dec = {
2714                                         .vecs = serpent_lrw_dec_tv_template,
2715                                         .count = SERPENT_LRW_DEC_TEST_VECTORS
2716                                 }
2717                         }
2718                 }
2719         }, {
2720                 .alg = "lrw(twofish)",
2721                 .test = alg_test_skcipher,
2722                 .suite = {
2723                         .cipher = {
2724                                 .enc = {
2725                                         .vecs = tf_lrw_enc_tv_template,
2726                                         .count = TF_LRW_ENC_TEST_VECTORS
2727                                 },
2728                                 .dec = {
2729                                         .vecs = tf_lrw_dec_tv_template,
2730                                         .count = TF_LRW_DEC_TEST_VECTORS
2731                                 }
2732                         }
2733                 }
2734         }, {
2735                 .alg = "lzo",
2736                 .test = alg_test_comp,
2737                 .fips_allowed = 1,
2738                 .suite = {
2739                         .comp = {
2740                                 .comp = {
2741                                         .vecs = lzo_comp_tv_template,
2742                                         .count = LZO_COMP_TEST_VECTORS
2743                                 },
2744                                 .decomp = {
2745                                         .vecs = lzo_decomp_tv_template,
2746                                         .count = LZO_DECOMP_TEST_VECTORS
2747                                 }
2748                         }
2749                 }
2750         }, {
2751                 .alg = "md4",
2752                 .test = alg_test_hash,
2753                 .suite = {
2754                         .hash = {
2755                                 .vecs = md4_tv_template,
2756                                 .count = MD4_TEST_VECTORS
2757                         }
2758                 }
2759         }, {
2760                 .alg = "md5",
2761                 .test = alg_test_hash,
2762                 .suite = {
2763                         .hash = {
2764                                 .vecs = md5_tv_template,
2765                                 .count = MD5_TEST_VECTORS
2766                         }
2767                 }
2768         }, {
2769                 .alg = "michael_mic",
2770                 .test = alg_test_hash,
2771                 .suite = {
2772                         .hash = {
2773                                 .vecs = michael_mic_tv_template,
2774                                 .count = MICHAEL_MIC_TEST_VECTORS
2775                         }
2776                 }
2777         }, {
2778                 .alg = "ofb(aes)",
2779                 .test = alg_test_skcipher,
2780                 .fips_allowed = 1,
2781                 .suite = {
2782                         .cipher = {
2783                                 .enc = {
2784                                         .vecs = aes_ofb_enc_tv_template,
2785                                         .count = AES_OFB_ENC_TEST_VECTORS
2786                                 },
2787                                 .dec = {
2788                                         .vecs = aes_ofb_dec_tv_template,
2789                                         .count = AES_OFB_DEC_TEST_VECTORS
2790                                 }
2791                         }
2792                 }
2793         }, {
2794                 .alg = "pcbc(fcrypt)",
2795                 .test = alg_test_skcipher,
2796                 .suite = {
2797                         .cipher = {
2798                                 .enc = {
2799                                         .vecs = fcrypt_pcbc_enc_tv_template,
2800                                         .count = FCRYPT_ENC_TEST_VECTORS
2801                                 },
2802                                 .dec = {
2803                                         .vecs = fcrypt_pcbc_dec_tv_template,
2804                                         .count = FCRYPT_DEC_TEST_VECTORS
2805                                 }
2806                         }
2807                 }
2808         }, {
2809                 .alg = "rfc3686(ctr(aes))",
2810                 .test = alg_test_skcipher,
2811                 .fips_allowed = 1,
2812                 .suite = {
2813                         .cipher = {
2814                                 .enc = {
2815                                         .vecs = aes_ctr_rfc3686_enc_tv_template,
2816                                         .count = AES_CTR_3686_ENC_TEST_VECTORS
2817                                 },
2818                                 .dec = {
2819                                         .vecs = aes_ctr_rfc3686_dec_tv_template,
2820                                         .count = AES_CTR_3686_DEC_TEST_VECTORS
2821                                 }
2822                         }
2823                 }
2824         }, {
2825                 .alg = "rfc4106(gcm(aes))",
2826                 .test = alg_test_aead,
2827                 .suite = {
2828                         .aead = {
2829                                 .enc = {
2830                                         .vecs = aes_gcm_rfc4106_enc_tv_template,
2831                                         .count = AES_GCM_4106_ENC_TEST_VECTORS
2832                                 },
2833                                 .dec = {
2834                                         .vecs = aes_gcm_rfc4106_dec_tv_template,
2835                                         .count = AES_GCM_4106_DEC_TEST_VECTORS
2836                                 }
2837                         }
2838                 }
2839         }, {
2840                 .alg = "rfc4309(ccm(aes))",
2841                 .test = alg_test_aead,
2842                 .fips_allowed = 1,
2843                 .suite = {
2844                         .aead = {
2845                                 .enc = {
2846                                         .vecs = aes_ccm_rfc4309_enc_tv_template,
2847                                         .count = AES_CCM_4309_ENC_TEST_VECTORS
2848                                 },
2849                                 .dec = {
2850                                         .vecs = aes_ccm_rfc4309_dec_tv_template,
2851                                         .count = AES_CCM_4309_DEC_TEST_VECTORS
2852                                 }
2853                         }
2854                 }
2855         }, {
2856                 .alg = "rfc4543(gcm(aes))",
2857                 .test = alg_test_aead,
2858                 .suite = {
2859                         .aead = {
2860                                 .enc = {
2861                                         .vecs = aes_gcm_rfc4543_enc_tv_template,
2862                                         .count = AES_GCM_4543_ENC_TEST_VECTORS
2863                                 },
2864                                 .dec = {
2865                                         .vecs = aes_gcm_rfc4543_dec_tv_template,
2866                                         .count = AES_GCM_4543_DEC_TEST_VECTORS
2867                                 },
2868                         }
2869                 }
2870         }, {
2871                 .alg = "rmd128",
2872                 .test = alg_test_hash,
2873                 .suite = {
2874                         .hash = {
2875                                 .vecs = rmd128_tv_template,
2876                                 .count = RMD128_TEST_VECTORS
2877                         }
2878                 }
2879         }, {
2880                 .alg = "rmd160",
2881                 .test = alg_test_hash,
2882                 .suite = {
2883                         .hash = {
2884                                 .vecs = rmd160_tv_template,
2885                                 .count = RMD160_TEST_VECTORS
2886                         }
2887                 }
2888         }, {
2889                 .alg = "rmd256",
2890                 .test = alg_test_hash,
2891                 .suite = {
2892                         .hash = {
2893                                 .vecs = rmd256_tv_template,
2894                                 .count = RMD256_TEST_VECTORS
2895                         }
2896                 }
2897         }, {
2898                 .alg = "rmd320",
2899                 .test = alg_test_hash,
2900                 .suite = {
2901                         .hash = {
2902                                 .vecs = rmd320_tv_template,
2903                                 .count = RMD320_TEST_VECTORS
2904                         }
2905                 }
2906         }, {
2907                 .alg = "salsa20",
2908                 .test = alg_test_skcipher,
2909                 .suite = {
2910                         .cipher = {
2911                                 .enc = {
2912                                         .vecs = salsa20_stream_enc_tv_template,
2913                                         .count = SALSA20_STREAM_ENC_TEST_VECTORS
2914                                 }
2915                         }
2916                 }
2917         }, {
2918                 .alg = "sha1",
2919                 .test = alg_test_hash,
2920                 .fips_allowed = 1,
2921                 .suite = {
2922                         .hash = {
2923                                 .vecs = sha1_tv_template,
2924                                 .count = SHA1_TEST_VECTORS
2925                         }
2926                 }
2927         }, {
2928                 .alg = "sha224",
2929                 .test = alg_test_hash,
2930                 .fips_allowed = 1,
2931                 .suite = {
2932                         .hash = {
2933                                 .vecs = sha224_tv_template,
2934                                 .count = SHA224_TEST_VECTORS
2935                         }
2936                 }
2937         }, {
2938                 .alg = "sha256",
2939                 .test = alg_test_hash,
2940                 .fips_allowed = 1,
2941                 .suite = {
2942                         .hash = {
2943                                 .vecs = sha256_tv_template,
2944                                 .count = SHA256_TEST_VECTORS
2945                         }
2946                 }
2947         }, {
2948                 .alg = "sha384",
2949                 .test = alg_test_hash,
2950                 .fips_allowed = 1,
2951                 .suite = {
2952                         .hash = {
2953                                 .vecs = sha384_tv_template,
2954                                 .count = SHA384_TEST_VECTORS
2955                         }
2956                 }
2957         }, {
2958                 .alg = "sha512",
2959                 .test = alg_test_hash,
2960                 .fips_allowed = 1,
2961                 .suite = {
2962                         .hash = {
2963                                 .vecs = sha512_tv_template,
2964                                 .count = SHA512_TEST_VECTORS
2965                         }
2966                 }
2967         }, {
2968                 .alg = "tgr128",
2969                 .test = alg_test_hash,
2970                 .suite = {
2971                         .hash = {
2972                                 .vecs = tgr128_tv_template,
2973                                 .count = TGR128_TEST_VECTORS
2974                         }
2975                 }
2976         }, {
2977                 .alg = "tgr160",
2978                 .test = alg_test_hash,
2979                 .suite = {
2980                         .hash = {
2981                                 .vecs = tgr160_tv_template,
2982                                 .count = TGR160_TEST_VECTORS
2983                         }
2984                 }
2985         }, {
2986                 .alg = "tgr192",
2987                 .test = alg_test_hash,
2988                 .suite = {
2989                         .hash = {
2990                                 .vecs = tgr192_tv_template,
2991                                 .count = TGR192_TEST_VECTORS
2992                         }
2993                 }
2994         }, {
2995                 .alg = "vmac(aes)",
2996                 .test = alg_test_hash,
2997                 .suite = {
2998                         .hash = {
2999                                 .vecs = aes_vmac128_tv_template,
3000                                 .count = VMAC_AES_TEST_VECTORS
3001                         }
3002                 }
3003         }, {
3004                 .alg = "wp256",
3005                 .test = alg_test_hash,
3006                 .suite = {
3007                         .hash = {
3008                                 .vecs = wp256_tv_template,
3009                                 .count = WP256_TEST_VECTORS
3010                         }
3011                 }
3012         }, {
3013                 .alg = "wp384",
3014                 .test = alg_test_hash,
3015                 .suite = {
3016                         .hash = {
3017                                 .vecs = wp384_tv_template,
3018                                 .count = WP384_TEST_VECTORS
3019                         }
3020                 }
3021         }, {
3022                 .alg = "wp512",
3023                 .test = alg_test_hash,
3024                 .suite = {
3025                         .hash = {
3026                                 .vecs = wp512_tv_template,
3027                                 .count = WP512_TEST_VECTORS
3028                         }
3029                 }
3030         }, {
3031                 .alg = "xcbc(aes)",
3032                 .test = alg_test_hash,
3033                 .suite = {
3034                         .hash = {
3035                                 .vecs = aes_xcbc128_tv_template,
3036                                 .count = XCBC_AES_TEST_VECTORS
3037                         }
3038                 }
3039         }, {
3040                 .alg = "xts(aes)",
3041                 .test = alg_test_skcipher,
3042                 .fips_allowed = 1,
3043                 .suite = {
3044                         .cipher = {
3045                                 .enc = {
3046                                         .vecs = aes_xts_enc_tv_template,
3047                                         .count = AES_XTS_ENC_TEST_VECTORS
3048                                 },
3049                                 .dec = {
3050                                         .vecs = aes_xts_dec_tv_template,
3051                                         .count = AES_XTS_DEC_TEST_VECTORS
3052                                 }
3053                         }
3054                 }
3055         }, {
3056                 .alg = "xts(camellia)",
3057                 .test = alg_test_skcipher,
3058                 .suite = {
3059                         .cipher = {
3060                                 .enc = {
3061                                         .vecs = camellia_xts_enc_tv_template,
3062                                         .count = CAMELLIA_XTS_ENC_TEST_VECTORS
3063                                 },
3064                                 .dec = {
3065                                         .vecs = camellia_xts_dec_tv_template,
3066                                         .count = CAMELLIA_XTS_DEC_TEST_VECTORS
3067                                 }
3068                         }
3069                 }
3070         }, {
3071                 .alg = "xts(cast6)",
3072                 .test = alg_test_skcipher,
3073                 .suite = {
3074                         .cipher = {
3075                                 .enc = {
3076                                         .vecs = cast6_xts_enc_tv_template,
3077                                         .count = CAST6_XTS_ENC_TEST_VECTORS
3078                                 },
3079                                 .dec = {
3080                                         .vecs = cast6_xts_dec_tv_template,
3081                                         .count = CAST6_XTS_DEC_TEST_VECTORS
3082                                 }
3083                         }
3084                 }
3085         }, {
3086                 .alg = "xts(serpent)",
3087                 .test = alg_test_skcipher,
3088                 .suite = {
3089                         .cipher = {
3090                                 .enc = {
3091                                         .vecs = serpent_xts_enc_tv_template,
3092                                         .count = SERPENT_XTS_ENC_TEST_VECTORS
3093                                 },
3094                                 .dec = {
3095                                         .vecs = serpent_xts_dec_tv_template,
3096                                         .count = SERPENT_XTS_DEC_TEST_VECTORS
3097                                 }
3098                         }
3099                 }
3100         }, {
3101                 .alg = "xts(twofish)",
3102                 .test = alg_test_skcipher,
3103                 .suite = {
3104                         .cipher = {
3105                                 .enc = {
3106                                         .vecs = tf_xts_enc_tv_template,
3107                                         .count = TF_XTS_ENC_TEST_VECTORS
3108                                 },
3109                                 .dec = {
3110                                         .vecs = tf_xts_dec_tv_template,
3111                                         .count = TF_XTS_DEC_TEST_VECTORS
3112                                 }
3113                         }
3114                 }
3115         }, {
3116                 .alg = "zlib",
3117                 .test = alg_test_pcomp,
3118                 .fips_allowed = 1,
3119                 .suite = {
3120                         .pcomp = {
3121                                 .comp = {
3122                                         .vecs = zlib_comp_tv_template,
3123                                         .count = ZLIB_COMP_TEST_VECTORS
3124                                 },
3125                                 .decomp = {
3126                                         .vecs = zlib_decomp_tv_template,
3127                                         .count = ZLIB_DECOMP_TEST_VECTORS
3128                                 }
3129                         }
3130                 }
3131         }
3132 };
3133
3134 static bool alg_test_descs_checked;
3135
3136 static void alg_test_descs_check_order(void)
3137 {
3138         int i;
3139
3140         /* only check once */
3141         if (alg_test_descs_checked)
3142                 return;
3143
3144         alg_test_descs_checked = true;
3145
3146         for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) {
3147                 int diff = strcmp(alg_test_descs[i - 1].alg,
3148                                   alg_test_descs[i].alg);
3149
3150                 if (WARN_ON(diff > 0)) {
3151                         pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n",
3152                                 alg_test_descs[i - 1].alg,
3153                                 alg_test_descs[i].alg);
3154                 }
3155
3156                 if (WARN_ON(diff == 0)) {
3157                         pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n",
3158                                 alg_test_descs[i].alg);
3159                 }
3160         }
3161 }
3162
3163 static int alg_find_test(const char *alg)
3164 {
3165         int start = 0;
3166         int end = ARRAY_SIZE(alg_test_descs);
3167
3168         while (start < end) {
3169                 int i = (start + end) / 2;
3170                 int diff = strcmp(alg_test_descs[i].alg, alg);
3171
3172                 if (diff > 0) {
3173                         end = i;
3174                         continue;
3175                 }
3176
3177                 if (diff < 0) {
3178                         start = i + 1;
3179                         continue;
3180                 }
3181
3182                 return i;
3183         }
3184
3185         return -1;
3186 }
3187
3188 int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
3189 {
3190         int i;
3191         int j;
3192         int rc;
3193
3194         alg_test_descs_check_order();
3195
3196         if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
3197                 char nalg[CRYPTO_MAX_ALG_NAME];
3198
3199                 if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
3200                     sizeof(nalg))
3201                         return -ENAMETOOLONG;
3202
3203                 i = alg_find_test(nalg);
3204                 if (i < 0)
3205                         goto notest;
3206
3207                 if (fips_enabled && !alg_test_descs[i].fips_allowed)
3208                         goto non_fips_alg;
3209
3210                 rc = alg_test_cipher(alg_test_descs + i, driver, type, mask);
3211                 goto test_done;
3212         }
3213
3214         i = alg_find_test(alg);
3215         j = alg_find_test(driver);
3216         if (i < 0 && j < 0)
3217                 goto notest;
3218
3219         if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
3220                              (j >= 0 && !alg_test_descs[j].fips_allowed)))
3221                 goto non_fips_alg;
3222
3223         rc = 0;
3224         if (i >= 0)
3225                 rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
3226                                              type, mask);
3227         if (j >= 0)
3228                 rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
3229                                              type, mask);
3230
3231 test_done:
3232         if (fips_enabled && rc)
3233                 panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
3234
3235         if (fips_enabled && !rc)
3236                 printk(KERN_INFO "alg: self-tests for %s (%s) passed\n",
3237                        driver, alg);
3238
3239         return rc;
3240
3241 notest:
3242         printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
3243         return 0;
3244 non_fips_alg:
3245         return -EINVAL;
3246 }
3247
3248 #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
3249
3250 EXPORT_SYMBOL_GPL(alg_test);