xref: /openbmc/linux/crypto/testmgr.c (revision 12773d93)
1da7f033dSHerbert Xu /*
2da7f033dSHerbert Xu  * Algorithm testing framework and tests.
3da7f033dSHerbert Xu  *
4da7f033dSHerbert Xu  * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
5da7f033dSHerbert Xu  * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
6da7f033dSHerbert Xu  * Copyright (c) 2007 Nokia Siemens Networks
7da7f033dSHerbert Xu  * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
8da7f033dSHerbert Xu  *
969435b94SAdrian Hoban  * Updated RFC4106 AES-GCM testing.
1069435b94SAdrian Hoban  *    Authors: Aidan O'Mahony (aidan.o.mahony@intel.com)
1169435b94SAdrian Hoban  *             Adrian Hoban <adrian.hoban@intel.com>
1269435b94SAdrian Hoban  *             Gabriele Paoloni <gabriele.paoloni@intel.com>
1369435b94SAdrian Hoban  *             Tadeusz Struk (tadeusz.struk@intel.com)
1469435b94SAdrian Hoban  *    Copyright (c) 2010, Intel Corporation.
1569435b94SAdrian Hoban  *
16da7f033dSHerbert Xu  * This program is free software; you can redistribute it and/or modify it
17da7f033dSHerbert Xu  * under the terms of the GNU General Public License as published by the Free
18da7f033dSHerbert Xu  * Software Foundation; either version 2 of the License, or (at your option)
19da7f033dSHerbert Xu  * any later version.
20da7f033dSHerbert Xu  *
21da7f033dSHerbert Xu  */
22da7f033dSHerbert Xu 
231ce33115SHerbert Xu #include <crypto/aead.h>
24da7f033dSHerbert Xu #include <crypto/hash.h>
2512773d93SHerbert Xu #include <crypto/skcipher.h>
26da7f033dSHerbert Xu #include <linux/err.h>
271c41b882SHerbert Xu #include <linux/fips.h>
28da7f033dSHerbert Xu #include <linux/module.h>
29da7f033dSHerbert Xu #include <linux/scatterlist.h>
30da7f033dSHerbert Xu #include <linux/slab.h>
31da7f033dSHerbert Xu #include <linux/string.h>
327647d6ceSJarod Wilson #include <crypto/rng.h>
3364d1cdfbSStephan Mueller #include <crypto/drbg.h>
34946cc463STadeusz Struk #include <crypto/akcipher.h>
35da7f033dSHerbert Xu 
36da7f033dSHerbert Xu #include "internal.h"
370b767f96SAlexander Shishkin 
38326a6346SHerbert Xu #ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS
390b767f96SAlexander Shishkin 
400b767f96SAlexander Shishkin /* a perfect nop */
410b767f96SAlexander Shishkin int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
420b767f96SAlexander Shishkin {
430b767f96SAlexander Shishkin 	return 0;
440b767f96SAlexander Shishkin }
450b767f96SAlexander Shishkin 
460b767f96SAlexander Shishkin #else
470b767f96SAlexander Shishkin 
48da7f033dSHerbert Xu #include "testmgr.h"
49da7f033dSHerbert Xu 
50da7f033dSHerbert Xu /*
51da7f033dSHerbert Xu  * Need slab memory for testing (size in number of pages).
52da7f033dSHerbert Xu  */
53da7f033dSHerbert Xu #define XBUFSIZE	8
54da7f033dSHerbert Xu 
55da7f033dSHerbert Xu /*
56da7f033dSHerbert Xu  * Indexes into the xbuf to simulate cross-page access.
57da7f033dSHerbert Xu  */
58da7f033dSHerbert Xu #define IDX1		32
59da7f033dSHerbert Xu #define IDX2		32400
60da7f033dSHerbert Xu #define IDX3		1
61da7f033dSHerbert Xu #define IDX4		8193
62da7f033dSHerbert Xu #define IDX5		22222
63da7f033dSHerbert Xu #define IDX6		17101
64da7f033dSHerbert Xu #define IDX7		27333
65da7f033dSHerbert Xu #define IDX8		3000
66da7f033dSHerbert Xu 
67da7f033dSHerbert Xu /*
68da7f033dSHerbert Xu * Used by test_cipher()
69da7f033dSHerbert Xu */
70da7f033dSHerbert Xu #define ENCRYPT 1
71da7f033dSHerbert Xu #define DECRYPT 0
72da7f033dSHerbert Xu 
73da7f033dSHerbert Xu struct tcrypt_result {
74da7f033dSHerbert Xu 	struct completion completion;
75da7f033dSHerbert Xu 	int err;
76da7f033dSHerbert Xu };
77da7f033dSHerbert Xu 
78da7f033dSHerbert Xu struct aead_test_suite {
79da7f033dSHerbert Xu 	struct {
80da7f033dSHerbert Xu 		struct aead_testvec *vecs;
81da7f033dSHerbert Xu 		unsigned int count;
82da7f033dSHerbert Xu 	} enc, dec;
83da7f033dSHerbert Xu };
84da7f033dSHerbert Xu 
85da7f033dSHerbert Xu struct cipher_test_suite {
86da7f033dSHerbert Xu 	struct {
87da7f033dSHerbert Xu 		struct cipher_testvec *vecs;
88da7f033dSHerbert Xu 		unsigned int count;
89da7f033dSHerbert Xu 	} enc, dec;
90da7f033dSHerbert Xu };
91da7f033dSHerbert Xu 
92da7f033dSHerbert Xu struct comp_test_suite {
93da7f033dSHerbert Xu 	struct {
94da7f033dSHerbert Xu 		struct comp_testvec *vecs;
95da7f033dSHerbert Xu 		unsigned int count;
96da7f033dSHerbert Xu 	} comp, decomp;
97da7f033dSHerbert Xu };
98da7f033dSHerbert Xu 
998064efb8SGeert Uytterhoeven struct pcomp_test_suite {
1008064efb8SGeert Uytterhoeven 	struct {
1018064efb8SGeert Uytterhoeven 		struct pcomp_testvec *vecs;
1028064efb8SGeert Uytterhoeven 		unsigned int count;
1038064efb8SGeert Uytterhoeven 	} comp, decomp;
1048064efb8SGeert Uytterhoeven };
1058064efb8SGeert Uytterhoeven 
106da7f033dSHerbert Xu struct hash_test_suite {
107da7f033dSHerbert Xu 	struct hash_testvec *vecs;
108da7f033dSHerbert Xu 	unsigned int count;
109da7f033dSHerbert Xu };
110da7f033dSHerbert Xu 
1117647d6ceSJarod Wilson struct cprng_test_suite {
1127647d6ceSJarod Wilson 	struct cprng_testvec *vecs;
1137647d6ceSJarod Wilson 	unsigned int count;
1147647d6ceSJarod Wilson };
1157647d6ceSJarod Wilson 
11664d1cdfbSStephan Mueller struct drbg_test_suite {
11764d1cdfbSStephan Mueller 	struct drbg_testvec *vecs;
11864d1cdfbSStephan Mueller 	unsigned int count;
11964d1cdfbSStephan Mueller };
12064d1cdfbSStephan Mueller 
121946cc463STadeusz Struk struct akcipher_test_suite {
122946cc463STadeusz Struk 	struct akcipher_testvec *vecs;
123946cc463STadeusz Struk 	unsigned int count;
124946cc463STadeusz Struk };
125946cc463STadeusz Struk 
126da7f033dSHerbert Xu struct alg_test_desc {
127da7f033dSHerbert Xu 	const char *alg;
128da7f033dSHerbert Xu 	int (*test)(const struct alg_test_desc *desc, const char *driver,
129da7f033dSHerbert Xu 		    u32 type, u32 mask);
130a1915d51SJarod Wilson 	int fips_allowed;	/* set if alg is allowed in fips mode */
131da7f033dSHerbert Xu 
132da7f033dSHerbert Xu 	union {
133da7f033dSHerbert Xu 		struct aead_test_suite aead;
134da7f033dSHerbert Xu 		struct cipher_test_suite cipher;
135da7f033dSHerbert Xu 		struct comp_test_suite comp;
1368064efb8SGeert Uytterhoeven 		struct pcomp_test_suite pcomp;
137da7f033dSHerbert Xu 		struct hash_test_suite hash;
1387647d6ceSJarod Wilson 		struct cprng_test_suite cprng;
13964d1cdfbSStephan Mueller 		struct drbg_test_suite drbg;
140946cc463STadeusz Struk 		struct akcipher_test_suite akcipher;
141da7f033dSHerbert Xu 	} suite;
142da7f033dSHerbert Xu };
143da7f033dSHerbert Xu 
144da7f033dSHerbert Xu static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
145da7f033dSHerbert Xu 
146da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len)
147da7f033dSHerbert Xu {
148da7f033dSHerbert Xu 	print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
149da7f033dSHerbert Xu 			16, 1,
150da7f033dSHerbert Xu 			buf, len, false);
151da7f033dSHerbert Xu }
152da7f033dSHerbert Xu 
153da7f033dSHerbert Xu static void tcrypt_complete(struct crypto_async_request *req, int err)
154da7f033dSHerbert Xu {
155da7f033dSHerbert Xu 	struct tcrypt_result *res = req->data;
156da7f033dSHerbert Xu 
157da7f033dSHerbert Xu 	if (err == -EINPROGRESS)
158da7f033dSHerbert Xu 		return;
159da7f033dSHerbert Xu 
160da7f033dSHerbert Xu 	res->err = err;
161da7f033dSHerbert Xu 	complete(&res->completion);
162da7f033dSHerbert Xu }
163da7f033dSHerbert Xu 
164f8b0d4d0SHerbert Xu static int testmgr_alloc_buf(char *buf[XBUFSIZE])
165f8b0d4d0SHerbert Xu {
166f8b0d4d0SHerbert Xu 	int i;
167f8b0d4d0SHerbert Xu 
168f8b0d4d0SHerbert Xu 	for (i = 0; i < XBUFSIZE; i++) {
169f8b0d4d0SHerbert Xu 		buf[i] = (void *)__get_free_page(GFP_KERNEL);
170f8b0d4d0SHerbert Xu 		if (!buf[i])
171f8b0d4d0SHerbert Xu 			goto err_free_buf;
172f8b0d4d0SHerbert Xu 	}
173f8b0d4d0SHerbert Xu 
174f8b0d4d0SHerbert Xu 	return 0;
175f8b0d4d0SHerbert Xu 
176f8b0d4d0SHerbert Xu err_free_buf:
177f8b0d4d0SHerbert Xu 	while (i-- > 0)
178f8b0d4d0SHerbert Xu 		free_page((unsigned long)buf[i]);
179f8b0d4d0SHerbert Xu 
180f8b0d4d0SHerbert Xu 	return -ENOMEM;
181f8b0d4d0SHerbert Xu }
182f8b0d4d0SHerbert Xu 
183f8b0d4d0SHerbert Xu static void testmgr_free_buf(char *buf[XBUFSIZE])
184f8b0d4d0SHerbert Xu {
185f8b0d4d0SHerbert Xu 	int i;
186f8b0d4d0SHerbert Xu 
187f8b0d4d0SHerbert Xu 	for (i = 0; i < XBUFSIZE; i++)
188f8b0d4d0SHerbert Xu 		free_page((unsigned long)buf[i]);
189f8b0d4d0SHerbert Xu }
190f8b0d4d0SHerbert Xu 
191d4c85f9bSCristian Stoica static int wait_async_op(struct tcrypt_result *tr, int ret)
192a8f1a052SDavid S. Miller {
193a8f1a052SDavid S. Miller 	if (ret == -EINPROGRESS || ret == -EBUSY) {
1948a45ac12SRabin Vincent 		wait_for_completion(&tr->completion);
19516735d02SWolfram Sang 		reinit_completion(&tr->completion);
1968a45ac12SRabin Vincent 		ret = tr->err;
197a8f1a052SDavid S. Miller 	}
198a8f1a052SDavid S. Miller 	return ret;
199a8f1a052SDavid S. Miller }
200a8f1a052SDavid S. Miller 
201da5ffe11SJussi Kivilinna static int __test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
202da5ffe11SJussi Kivilinna 		       unsigned int tcount, bool use_digest,
203da5ffe11SJussi Kivilinna 		       const int align_offset)
204da7f033dSHerbert Xu {
205da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
206da7f033dSHerbert Xu 	unsigned int i, j, k, temp;
207da7f033dSHerbert Xu 	struct scatterlist sg[8];
20829b77e5dSHoria Geanta 	char *result;
20929b77e5dSHoria Geanta 	char *key;
210da7f033dSHerbert Xu 	struct ahash_request *req;
211da7f033dSHerbert Xu 	struct tcrypt_result tresult;
212da7f033dSHerbert Xu 	void *hash_buff;
213f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
214f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
215f8b0d4d0SHerbert Xu 
21629b77e5dSHoria Geanta 	result = kmalloc(MAX_DIGEST_SIZE, GFP_KERNEL);
21729b77e5dSHoria Geanta 	if (!result)
21829b77e5dSHoria Geanta 		return ret;
21929b77e5dSHoria Geanta 	key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
22029b77e5dSHoria Geanta 	if (!key)
22129b77e5dSHoria Geanta 		goto out_nobuf;
222f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
223f8b0d4d0SHerbert Xu 		goto out_nobuf;
224da7f033dSHerbert Xu 
225da7f033dSHerbert Xu 	init_completion(&tresult.completion);
226da7f033dSHerbert Xu 
227da7f033dSHerbert Xu 	req = ahash_request_alloc(tfm, GFP_KERNEL);
228da7f033dSHerbert Xu 	if (!req) {
229da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to allocate request for "
230da7f033dSHerbert Xu 		       "%s\n", algo);
231da7f033dSHerbert Xu 		goto out_noreq;
232da7f033dSHerbert Xu 	}
233da7f033dSHerbert Xu 	ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
234da7f033dSHerbert Xu 				   tcrypt_complete, &tresult);
235da7f033dSHerbert Xu 
236a0cfae59SHerbert Xu 	j = 0;
237da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
238a0cfae59SHerbert Xu 		if (template[i].np)
239a0cfae59SHerbert Xu 			continue;
240a0cfae59SHerbert Xu 
241da5ffe11SJussi Kivilinna 		ret = -EINVAL;
242da5ffe11SJussi Kivilinna 		if (WARN_ON(align_offset + template[i].psize > PAGE_SIZE))
243da5ffe11SJussi Kivilinna 			goto out;
244da5ffe11SJussi Kivilinna 
245a0cfae59SHerbert Xu 		j++;
24629b77e5dSHoria Geanta 		memset(result, 0, MAX_DIGEST_SIZE);
247da7f033dSHerbert Xu 
248da7f033dSHerbert Xu 		hash_buff = xbuf[0];
249da5ffe11SJussi Kivilinna 		hash_buff += align_offset;
250da7f033dSHerbert Xu 
251da7f033dSHerbert Xu 		memcpy(hash_buff, template[i].plaintext, template[i].psize);
252da7f033dSHerbert Xu 		sg_init_one(&sg[0], hash_buff, template[i].psize);
253da7f033dSHerbert Xu 
254da7f033dSHerbert Xu 		if (template[i].ksize) {
255da7f033dSHerbert Xu 			crypto_ahash_clear_flags(tfm, ~0);
25629b77e5dSHoria Geanta 			if (template[i].ksize > MAX_KEYLEN) {
25729b77e5dSHoria Geanta 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
25829b77e5dSHoria Geanta 				       j, algo, template[i].ksize, MAX_KEYLEN);
25929b77e5dSHoria Geanta 				ret = -EINVAL;
26029b77e5dSHoria Geanta 				goto out;
26129b77e5dSHoria Geanta 			}
26229b77e5dSHoria Geanta 			memcpy(key, template[i].key, template[i].ksize);
26329b77e5dSHoria Geanta 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
264da7f033dSHerbert Xu 			if (ret) {
265da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: setkey failed on "
266a0cfae59SHerbert Xu 				       "test %d for %s: ret=%d\n", j, algo,
267da7f033dSHerbert Xu 				       -ret);
268da7f033dSHerbert Xu 				goto out;
269da7f033dSHerbert Xu 			}
270da7f033dSHerbert Xu 		}
271da7f033dSHerbert Xu 
272da7f033dSHerbert Xu 		ahash_request_set_crypt(req, sg, result, template[i].psize);
273a8f1a052SDavid S. Miller 		if (use_digest) {
274d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_digest(req));
275a8f1a052SDavid S. Miller 			if (ret) {
276a8f1a052SDavid S. Miller 				pr_err("alg: hash: digest failed on test %d "
277a0cfae59SHerbert Xu 				       "for %s: ret=%d\n", j, algo, -ret);
278da7f033dSHerbert Xu 				goto out;
279da7f033dSHerbert Xu 			}
280a8f1a052SDavid S. Miller 		} else {
281d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_init(req));
282a8f1a052SDavid S. Miller 			if (ret) {
283a8f1a052SDavid S. Miller 				pr_err("alt: hash: init failed on test %d "
284a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
285a8f1a052SDavid S. Miller 				goto out;
286a8f1a052SDavid S. Miller 			}
287d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_update(req));
288a8f1a052SDavid S. Miller 			if (ret) {
289a8f1a052SDavid S. Miller 				pr_err("alt: hash: update failed on test %d "
290a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
291a8f1a052SDavid S. Miller 				goto out;
292a8f1a052SDavid S. Miller 			}
293d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_final(req));
294a8f1a052SDavid S. Miller 			if (ret) {
295a8f1a052SDavid S. Miller 				pr_err("alt: hash: final failed on test %d "
296a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
297a8f1a052SDavid S. Miller 				goto out;
298a8f1a052SDavid S. Miller 			}
299a8f1a052SDavid S. Miller 		}
300da7f033dSHerbert Xu 
301da7f033dSHerbert Xu 		if (memcmp(result, template[i].digest,
302da7f033dSHerbert Xu 			   crypto_ahash_digestsize(tfm))) {
303da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
304a0cfae59SHerbert Xu 			       j, algo);
305da7f033dSHerbert Xu 			hexdump(result, crypto_ahash_digestsize(tfm));
306da7f033dSHerbert Xu 			ret = -EINVAL;
307da7f033dSHerbert Xu 			goto out;
308da7f033dSHerbert Xu 		}
309da7f033dSHerbert Xu 	}
310da7f033dSHerbert Xu 
311da7f033dSHerbert Xu 	j = 0;
312da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
313da5ffe11SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
314da5ffe11SJussi Kivilinna 		if (align_offset != 0)
315da5ffe11SJussi Kivilinna 			break;
316da5ffe11SJussi Kivilinna 
3175f2b424eSCristian Stoica 		if (!template[i].np)
3185f2b424eSCristian Stoica 			continue;
3195f2b424eSCristian Stoica 
320da7f033dSHerbert Xu 		j++;
32129b77e5dSHoria Geanta 		memset(result, 0, MAX_DIGEST_SIZE);
322da7f033dSHerbert Xu 
323da7f033dSHerbert Xu 		temp = 0;
324da7f033dSHerbert Xu 		sg_init_table(sg, template[i].np);
325fd57f22aSHerbert Xu 		ret = -EINVAL;
326da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
327fd57f22aSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
328fd57f22aSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
329fd57f22aSHerbert Xu 				goto out;
330da7f033dSHerbert Xu 			sg_set_buf(&sg[k],
331da7f033dSHerbert Xu 				   memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
332da7f033dSHerbert Xu 					  offset_in_page(IDX[k]),
333da7f033dSHerbert Xu 					  template[i].plaintext + temp,
334da7f033dSHerbert Xu 					  template[i].tap[k]),
335da7f033dSHerbert Xu 				   template[i].tap[k]);
336da7f033dSHerbert Xu 			temp += template[i].tap[k];
337da7f033dSHerbert Xu 		}
338da7f033dSHerbert Xu 
339da7f033dSHerbert Xu 		if (template[i].ksize) {
34029b77e5dSHoria Geanta 			if (template[i].ksize > MAX_KEYLEN) {
34129b77e5dSHoria Geanta 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
3425f2b424eSCristian Stoica 				       j, algo, template[i].ksize, MAX_KEYLEN);
34329b77e5dSHoria Geanta 				ret = -EINVAL;
34429b77e5dSHoria Geanta 				goto out;
34529b77e5dSHoria Geanta 			}
346da7f033dSHerbert Xu 			crypto_ahash_clear_flags(tfm, ~0);
34729b77e5dSHoria Geanta 			memcpy(key, template[i].key, template[i].ksize);
3485f2b424eSCristian Stoica 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
349da7f033dSHerbert Xu 
350da7f033dSHerbert Xu 			if (ret) {
351da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: setkey "
352da7f033dSHerbert Xu 				       "failed on chunking test %d "
3535f2b424eSCristian Stoica 				       "for %s: ret=%d\n", j, algo, -ret);
354da7f033dSHerbert Xu 				goto out;
355da7f033dSHerbert Xu 			}
356da7f033dSHerbert Xu 		}
357da7f033dSHerbert Xu 
3585f2b424eSCristian Stoica 		ahash_request_set_crypt(req, sg, result, template[i].psize);
359da7f033dSHerbert Xu 		ret = crypto_ahash_digest(req);
360da7f033dSHerbert Xu 		switch (ret) {
361da7f033dSHerbert Xu 		case 0:
362da7f033dSHerbert Xu 			break;
363da7f033dSHerbert Xu 		case -EINPROGRESS:
364da7f033dSHerbert Xu 		case -EBUSY:
3658a45ac12SRabin Vincent 			wait_for_completion(&tresult.completion);
36616735d02SWolfram Sang 			reinit_completion(&tresult.completion);
3678a45ac12SRabin Vincent 			ret = tresult.err;
3688a45ac12SRabin Vincent 			if (!ret)
369da7f033dSHerbert Xu 				break;
370da7f033dSHerbert Xu 			/* fall through */
371da7f033dSHerbert Xu 		default:
372da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: digest failed "
373da7f033dSHerbert Xu 			       "on chunking test %d for %s: "
374da7f033dSHerbert Xu 			       "ret=%d\n", j, algo, -ret);
375da7f033dSHerbert Xu 			goto out;
376da7f033dSHerbert Xu 		}
377da7f033dSHerbert Xu 
378da7f033dSHerbert Xu 		if (memcmp(result, template[i].digest,
379da7f033dSHerbert Xu 			   crypto_ahash_digestsize(tfm))) {
380da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: Chunking test %d "
381da7f033dSHerbert Xu 			       "failed for %s\n", j, algo);
382da7f033dSHerbert Xu 			hexdump(result, crypto_ahash_digestsize(tfm));
383da7f033dSHerbert Xu 			ret = -EINVAL;
384da7f033dSHerbert Xu 			goto out;
385da7f033dSHerbert Xu 		}
386da7f033dSHerbert Xu 	}
387da7f033dSHerbert Xu 
388da7f033dSHerbert Xu 	ret = 0;
389da7f033dSHerbert Xu 
390da7f033dSHerbert Xu out:
391da7f033dSHerbert Xu 	ahash_request_free(req);
392da7f033dSHerbert Xu out_noreq:
393f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
394f8b0d4d0SHerbert Xu out_nobuf:
39529b77e5dSHoria Geanta 	kfree(key);
39629b77e5dSHoria Geanta 	kfree(result);
397da7f033dSHerbert Xu 	return ret;
398da7f033dSHerbert Xu }
399da7f033dSHerbert Xu 
400da5ffe11SJussi Kivilinna static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
401da5ffe11SJussi Kivilinna 		     unsigned int tcount, bool use_digest)
402da5ffe11SJussi Kivilinna {
403da5ffe11SJussi Kivilinna 	unsigned int alignmask;
404da5ffe11SJussi Kivilinna 	int ret;
405da5ffe11SJussi Kivilinna 
406da5ffe11SJussi Kivilinna 	ret = __test_hash(tfm, template, tcount, use_digest, 0);
407da5ffe11SJussi Kivilinna 	if (ret)
408da5ffe11SJussi Kivilinna 		return ret;
409da5ffe11SJussi Kivilinna 
410da5ffe11SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
411da5ffe11SJussi Kivilinna 	ret = __test_hash(tfm, template, tcount, use_digest, 1);
412da5ffe11SJussi Kivilinna 	if (ret)
413da5ffe11SJussi Kivilinna 		return ret;
414da5ffe11SJussi Kivilinna 
415da5ffe11SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
416da5ffe11SJussi Kivilinna 	if (alignmask) {
417da5ffe11SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
418da5ffe11SJussi Kivilinna 		ret = __test_hash(tfm, template, tcount, use_digest,
419da5ffe11SJussi Kivilinna 				  alignmask + 1);
420da5ffe11SJussi Kivilinna 		if (ret)
421da5ffe11SJussi Kivilinna 			return ret;
422da5ffe11SJussi Kivilinna 	}
423da5ffe11SJussi Kivilinna 
424da5ffe11SJussi Kivilinna 	return 0;
425da5ffe11SJussi Kivilinna }
426da5ffe11SJussi Kivilinna 
427d8a32ac2SJussi Kivilinna static int __test_aead(struct crypto_aead *tfm, int enc,
428d8a32ac2SJussi Kivilinna 		       struct aead_testvec *template, unsigned int tcount,
42958dcf548SJussi Kivilinna 		       const bool diff_dst, const int align_offset)
430da7f033dSHerbert Xu {
431da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
432da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
433f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
434da7f033dSHerbert Xu 	char *q;
435da7f033dSHerbert Xu 	char *key;
436da7f033dSHerbert Xu 	struct aead_request *req;
437d8a32ac2SJussi Kivilinna 	struct scatterlist *sg;
438d8a32ac2SJussi Kivilinna 	struct scatterlist *sgout;
439d8a32ac2SJussi Kivilinna 	const char *e, *d;
440da7f033dSHerbert Xu 	struct tcrypt_result result;
441424a5da6SCristian Stoica 	unsigned int authsize, iv_len;
442da7f033dSHerbert Xu 	void *input;
443d8a32ac2SJussi Kivilinna 	void *output;
444da7f033dSHerbert Xu 	void *assoc;
4459bac019dSTadeusz Struk 	char *iv;
446f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
447d8a32ac2SJussi Kivilinna 	char *xoutbuf[XBUFSIZE];
448f8b0d4d0SHerbert Xu 	char *axbuf[XBUFSIZE];
449f8b0d4d0SHerbert Xu 
4509bac019dSTadeusz Struk 	iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
4519bac019dSTadeusz Struk 	if (!iv)
4529bac019dSTadeusz Struk 		return ret;
45329b77e5dSHoria Geanta 	key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
45429b77e5dSHoria Geanta 	if (!key)
45529b77e5dSHoria Geanta 		goto out_noxbuf;
456f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
457f8b0d4d0SHerbert Xu 		goto out_noxbuf;
458f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(axbuf))
459f8b0d4d0SHerbert Xu 		goto out_noaxbuf;
460d8a32ac2SJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
461d8a32ac2SJussi Kivilinna 		goto out_nooutbuf;
462d8a32ac2SJussi Kivilinna 
463d8a32ac2SJussi Kivilinna 	/* avoid "the frame size is larger than 1024 bytes" compiler warning */
4648a525fcdSHerbert Xu 	sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 4 : 2), GFP_KERNEL);
465d8a32ac2SJussi Kivilinna 	if (!sg)
466d8a32ac2SJussi Kivilinna 		goto out_nosg;
4678a525fcdSHerbert Xu 	sgout = &sg[16];
468d8a32ac2SJussi Kivilinna 
469d8a32ac2SJussi Kivilinna 	if (diff_dst)
470d8a32ac2SJussi Kivilinna 		d = "-ddst";
471d8a32ac2SJussi Kivilinna 	else
472d8a32ac2SJussi Kivilinna 		d = "";
473d8a32ac2SJussi Kivilinna 
474da7f033dSHerbert Xu 	if (enc == ENCRYPT)
475da7f033dSHerbert Xu 		e = "encryption";
476da7f033dSHerbert Xu 	else
477da7f033dSHerbert Xu 		e = "decryption";
478da7f033dSHerbert Xu 
479da7f033dSHerbert Xu 	init_completion(&result.completion);
480da7f033dSHerbert Xu 
481da7f033dSHerbert Xu 	req = aead_request_alloc(tfm, GFP_KERNEL);
482da7f033dSHerbert Xu 	if (!req) {
483d8a32ac2SJussi Kivilinna 		pr_err("alg: aead%s: Failed to allocate request for %s\n",
484d8a32ac2SJussi Kivilinna 		       d, algo);
485da7f033dSHerbert Xu 		goto out;
486da7f033dSHerbert Xu 	}
487da7f033dSHerbert Xu 
488da7f033dSHerbert Xu 	aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
489da7f033dSHerbert Xu 				  tcrypt_complete, &result);
490da7f033dSHerbert Xu 
491da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
49205b1d338SCristian Stoica 		if (template[i].np)
49305b1d338SCristian Stoica 			continue;
49405b1d338SCristian Stoica 
495da7f033dSHerbert Xu 		j++;
496da7f033dSHerbert Xu 
49758dcf548SJussi Kivilinna 		/* some templates have no input data but they will
498da7f033dSHerbert Xu 		 * touch input
499da7f033dSHerbert Xu 		 */
500da7f033dSHerbert Xu 		input = xbuf[0];
50158dcf548SJussi Kivilinna 		input += align_offset;
502da7f033dSHerbert Xu 		assoc = axbuf[0];
503da7f033dSHerbert Xu 
504fd57f22aSHerbert Xu 		ret = -EINVAL;
50558dcf548SJussi Kivilinna 		if (WARN_ON(align_offset + template[i].ilen >
50658dcf548SJussi Kivilinna 			    PAGE_SIZE || template[i].alen > PAGE_SIZE))
507fd57f22aSHerbert Xu 			goto out;
508fd57f22aSHerbert Xu 
509da7f033dSHerbert Xu 		memcpy(input, template[i].input, template[i].ilen);
510da7f033dSHerbert Xu 		memcpy(assoc, template[i].assoc, template[i].alen);
511424a5da6SCristian Stoica 		iv_len = crypto_aead_ivsize(tfm);
512da7f033dSHerbert Xu 		if (template[i].iv)
513424a5da6SCristian Stoica 			memcpy(iv, template[i].iv, iv_len);
514da7f033dSHerbert Xu 		else
515424a5da6SCristian Stoica 			memset(iv, 0, iv_len);
516da7f033dSHerbert Xu 
517da7f033dSHerbert Xu 		crypto_aead_clear_flags(tfm, ~0);
518da7f033dSHerbert Xu 		if (template[i].wk)
51905b1d338SCristian Stoica 			crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
520da7f033dSHerbert Xu 
52129b77e5dSHoria Geanta 		if (template[i].klen > MAX_KEYLEN) {
52229b77e5dSHoria Geanta 			pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
52329b77e5dSHoria Geanta 			       d, j, algo, template[i].klen,
52429b77e5dSHoria Geanta 			       MAX_KEYLEN);
52529b77e5dSHoria Geanta 			ret = -EINVAL;
52629b77e5dSHoria Geanta 			goto out;
52729b77e5dSHoria Geanta 		}
52829b77e5dSHoria Geanta 		memcpy(key, template[i].key, template[i].klen);
529da7f033dSHerbert Xu 
53005b1d338SCristian Stoica 		ret = crypto_aead_setkey(tfm, key, template[i].klen);
531da7f033dSHerbert Xu 		if (!ret == template[i].fail) {
532d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n",
533d8a32ac2SJussi Kivilinna 			       d, j, algo, crypto_aead_get_flags(tfm));
534da7f033dSHerbert Xu 			goto out;
535da7f033dSHerbert Xu 		} else if (ret)
536da7f033dSHerbert Xu 			continue;
537da7f033dSHerbert Xu 
538da7f033dSHerbert Xu 		authsize = abs(template[i].rlen - template[i].ilen);
539da7f033dSHerbert Xu 		ret = crypto_aead_setauthsize(tfm, authsize);
540da7f033dSHerbert Xu 		if (ret) {
541d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n",
542d8a32ac2SJussi Kivilinna 			       d, authsize, j, algo);
543da7f033dSHerbert Xu 			goto out;
544da7f033dSHerbert Xu 		}
545da7f033dSHerbert Xu 
5468a525fcdSHerbert Xu 		k = !!template[i].alen;
5478a525fcdSHerbert Xu 		sg_init_table(sg, k + 1);
5488a525fcdSHerbert Xu 		sg_set_buf(&sg[0], assoc, template[i].alen);
5498a525fcdSHerbert Xu 		sg_set_buf(&sg[k], input,
55005b1d338SCristian Stoica 			   template[i].ilen + (enc ? authsize : 0));
551d8a32ac2SJussi Kivilinna 		output = input;
552d8a32ac2SJussi Kivilinna 
5538a525fcdSHerbert Xu 		if (diff_dst) {
5548a525fcdSHerbert Xu 			sg_init_table(sgout, k + 1);
5558a525fcdSHerbert Xu 			sg_set_buf(&sgout[0], assoc, template[i].alen);
5568a525fcdSHerbert Xu 
5578a525fcdSHerbert Xu 			output = xoutbuf[0];
5588a525fcdSHerbert Xu 			output += align_offset;
5598a525fcdSHerbert Xu 			sg_set_buf(&sgout[k], output,
5608a525fcdSHerbert Xu 				   template[i].rlen + (enc ? 0 : authsize));
5618a525fcdSHerbert Xu 		}
562da7f033dSHerbert Xu 
563d8a32ac2SJussi Kivilinna 		aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
564da7f033dSHerbert Xu 				       template[i].ilen, iv);
565da7f033dSHerbert Xu 
5668a525fcdSHerbert Xu 		aead_request_set_ad(req, template[i].alen);
567da7f033dSHerbert Xu 
56805b1d338SCristian Stoica 		ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req);
569da7f033dSHerbert Xu 
570da7f033dSHerbert Xu 		switch (ret) {
571da7f033dSHerbert Xu 		case 0:
572e44a1b44SJarod Wilson 			if (template[i].novrfy) {
573e44a1b44SJarod Wilson 				/* verification was supposed to fail */
574d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n",
575d8a32ac2SJussi Kivilinna 				       d, e, j, algo);
576e44a1b44SJarod Wilson 				/* so really, we got a bad message */
577e44a1b44SJarod Wilson 				ret = -EBADMSG;
578e44a1b44SJarod Wilson 				goto out;
579e44a1b44SJarod Wilson 			}
580da7f033dSHerbert Xu 			break;
581da7f033dSHerbert Xu 		case -EINPROGRESS:
582da7f033dSHerbert Xu 		case -EBUSY:
5838a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
58416735d02SWolfram Sang 			reinit_completion(&result.completion);
5858a45ac12SRabin Vincent 			ret = result.err;
5868a45ac12SRabin Vincent 			if (!ret)
587da7f033dSHerbert Xu 				break;
588e44a1b44SJarod Wilson 		case -EBADMSG:
589e44a1b44SJarod Wilson 			if (template[i].novrfy)
590e44a1b44SJarod Wilson 				/* verification failure was expected */
591e44a1b44SJarod Wilson 				continue;
592da7f033dSHerbert Xu 			/* fall through */
593da7f033dSHerbert Xu 		default:
594d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n",
595d8a32ac2SJussi Kivilinna 			       d, e, j, algo, -ret);
596da7f033dSHerbert Xu 			goto out;
597da7f033dSHerbert Xu 		}
598da7f033dSHerbert Xu 
599d8a32ac2SJussi Kivilinna 		q = output;
600da7f033dSHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
601d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Test %d failed on %s for %s\n",
602d8a32ac2SJussi Kivilinna 			       d, j, e, algo);
603da7f033dSHerbert Xu 			hexdump(q, template[i].rlen);
604da7f033dSHerbert Xu 			ret = -EINVAL;
605da7f033dSHerbert Xu 			goto out;
606da7f033dSHerbert Xu 		}
607da7f033dSHerbert Xu 	}
608da7f033dSHerbert Xu 
609da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
61058dcf548SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
61158dcf548SJussi Kivilinna 		if (align_offset != 0)
61258dcf548SJussi Kivilinna 			break;
61358dcf548SJussi Kivilinna 
61405b1d338SCristian Stoica 		if (!template[i].np)
61505b1d338SCristian Stoica 			continue;
61605b1d338SCristian Stoica 
617da7f033dSHerbert Xu 		j++;
618da7f033dSHerbert Xu 
619da7f033dSHerbert Xu 		if (template[i].iv)
620da7f033dSHerbert Xu 			memcpy(iv, template[i].iv, MAX_IVLEN);
621da7f033dSHerbert Xu 		else
622da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
623da7f033dSHerbert Xu 
624da7f033dSHerbert Xu 		crypto_aead_clear_flags(tfm, ~0);
625da7f033dSHerbert Xu 		if (template[i].wk)
62605b1d338SCristian Stoica 			crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
62729b77e5dSHoria Geanta 		if (template[i].klen > MAX_KEYLEN) {
62829b77e5dSHoria Geanta 			pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
62905b1d338SCristian Stoica 			       d, j, algo, template[i].klen, MAX_KEYLEN);
63029b77e5dSHoria Geanta 			ret = -EINVAL;
63129b77e5dSHoria Geanta 			goto out;
63229b77e5dSHoria Geanta 		}
63329b77e5dSHoria Geanta 		memcpy(key, template[i].key, template[i].klen);
634da7f033dSHerbert Xu 
635da7f033dSHerbert Xu 		ret = crypto_aead_setkey(tfm, key, template[i].klen);
636da7f033dSHerbert Xu 		if (!ret == template[i].fail) {
637d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n",
638d8a32ac2SJussi Kivilinna 			       d, j, algo, crypto_aead_get_flags(tfm));
639da7f033dSHerbert Xu 			goto out;
640da7f033dSHerbert Xu 		} else if (ret)
641da7f033dSHerbert Xu 			continue;
642da7f033dSHerbert Xu 
643da7f033dSHerbert Xu 		authsize = abs(template[i].rlen - template[i].ilen);
644da7f033dSHerbert Xu 
645da7f033dSHerbert Xu 		ret = -EINVAL;
6468a525fcdSHerbert Xu 		sg_init_table(sg, template[i].anp + template[i].np);
647d8a32ac2SJussi Kivilinna 		if (diff_dst)
6488a525fcdSHerbert Xu 			sg_init_table(sgout, template[i].anp + template[i].np);
6498a525fcdSHerbert Xu 
6508a525fcdSHerbert Xu 		ret = -EINVAL;
6518a525fcdSHerbert Xu 		for (k = 0, temp = 0; k < template[i].anp; k++) {
6528a525fcdSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
6538a525fcdSHerbert Xu 				    template[i].atap[k] > PAGE_SIZE))
6548a525fcdSHerbert Xu 				goto out;
6558a525fcdSHerbert Xu 			sg_set_buf(&sg[k],
6568a525fcdSHerbert Xu 				   memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
6578a525fcdSHerbert Xu 					  offset_in_page(IDX[k]),
6588a525fcdSHerbert Xu 					  template[i].assoc + temp,
6598a525fcdSHerbert Xu 					  template[i].atap[k]),
6608a525fcdSHerbert Xu 				   template[i].atap[k]);
6618a525fcdSHerbert Xu 			if (diff_dst)
6628a525fcdSHerbert Xu 				sg_set_buf(&sgout[k],
6638a525fcdSHerbert Xu 					   axbuf[IDX[k] >> PAGE_SHIFT] +
6648a525fcdSHerbert Xu 					   offset_in_page(IDX[k]),
6658a525fcdSHerbert Xu 					   template[i].atap[k]);
6668a525fcdSHerbert Xu 			temp += template[i].atap[k];
6678a525fcdSHerbert Xu 		}
6688a525fcdSHerbert Xu 
669da7f033dSHerbert Xu 		for (k = 0, temp = 0; k < template[i].np; k++) {
670da7f033dSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
671da7f033dSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
672da7f033dSHerbert Xu 				goto out;
673da7f033dSHerbert Xu 
67405b1d338SCristian Stoica 			q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
67505b1d338SCristian Stoica 			memcpy(q, template[i].input + temp, template[i].tap[k]);
6768a525fcdSHerbert Xu 			sg_set_buf(&sg[template[i].anp + k],
6778a525fcdSHerbert Xu 				   q, template[i].tap[k]);
678d8a32ac2SJussi Kivilinna 
679d8a32ac2SJussi Kivilinna 			if (diff_dst) {
680d8a32ac2SJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
681d8a32ac2SJussi Kivilinna 				    offset_in_page(IDX[k]);
682d8a32ac2SJussi Kivilinna 
683d8a32ac2SJussi Kivilinna 				memset(q, 0, template[i].tap[k]);
684d8a32ac2SJussi Kivilinna 
6858a525fcdSHerbert Xu 				sg_set_buf(&sgout[template[i].anp + k],
6868a525fcdSHerbert Xu 					   q, template[i].tap[k]);
687d8a32ac2SJussi Kivilinna 			}
688d8a32ac2SJussi Kivilinna 
6898ec25c51SHoria Geanta 			n = template[i].tap[k];
6908ec25c51SHoria Geanta 			if (k == template[i].np - 1 && enc)
6918ec25c51SHoria Geanta 				n += authsize;
6928ec25c51SHoria Geanta 			if (offset_in_page(q) + n < PAGE_SIZE)
6938ec25c51SHoria Geanta 				q[n] = 0;
6948ec25c51SHoria Geanta 
695da7f033dSHerbert Xu 			temp += template[i].tap[k];
696da7f033dSHerbert Xu 		}
697da7f033dSHerbert Xu 
698da7f033dSHerbert Xu 		ret = crypto_aead_setauthsize(tfm, authsize);
699da7f033dSHerbert Xu 		if (ret) {
700d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n",
701d8a32ac2SJussi Kivilinna 			       d, authsize, j, algo);
702da7f033dSHerbert Xu 			goto out;
703da7f033dSHerbert Xu 		}
704da7f033dSHerbert Xu 
705da7f033dSHerbert Xu 		if (enc) {
7068a525fcdSHerbert Xu 			if (WARN_ON(sg[template[i].anp + k - 1].offset +
7078a525fcdSHerbert Xu 				    sg[template[i].anp + k - 1].length +
7088a525fcdSHerbert Xu 				    authsize > PAGE_SIZE)) {
709da7f033dSHerbert Xu 				ret = -EINVAL;
710da7f033dSHerbert Xu 				goto out;
711da7f033dSHerbert Xu 			}
712da7f033dSHerbert Xu 
713d8a32ac2SJussi Kivilinna 			if (diff_dst)
7148a525fcdSHerbert Xu 				sgout[template[i].anp + k - 1].length +=
7158a525fcdSHerbert Xu 					authsize;
7168a525fcdSHerbert Xu 			sg[template[i].anp + k - 1].length += authsize;
717da7f033dSHerbert Xu 		}
718da7f033dSHerbert Xu 
719d8a32ac2SJussi Kivilinna 		aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
720da7f033dSHerbert Xu 				       template[i].ilen,
721da7f033dSHerbert Xu 				       iv);
722da7f033dSHerbert Xu 
7238a525fcdSHerbert Xu 		aead_request_set_ad(req, template[i].alen);
724da7f033dSHerbert Xu 
72505b1d338SCristian Stoica 		ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req);
726da7f033dSHerbert Xu 
727da7f033dSHerbert Xu 		switch (ret) {
728da7f033dSHerbert Xu 		case 0:
729e44a1b44SJarod Wilson 			if (template[i].novrfy) {
730e44a1b44SJarod Wilson 				/* verification was supposed to fail */
731d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n",
732d8a32ac2SJussi Kivilinna 				       d, e, j, algo);
733e44a1b44SJarod Wilson 				/* so really, we got a bad message */
734e44a1b44SJarod Wilson 				ret = -EBADMSG;
735e44a1b44SJarod Wilson 				goto out;
736e44a1b44SJarod Wilson 			}
737da7f033dSHerbert Xu 			break;
738da7f033dSHerbert Xu 		case -EINPROGRESS:
739da7f033dSHerbert Xu 		case -EBUSY:
7408a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
74116735d02SWolfram Sang 			reinit_completion(&result.completion);
7428a45ac12SRabin Vincent 			ret = result.err;
7438a45ac12SRabin Vincent 			if (!ret)
744da7f033dSHerbert Xu 				break;
745e44a1b44SJarod Wilson 		case -EBADMSG:
746e44a1b44SJarod Wilson 			if (template[i].novrfy)
747e44a1b44SJarod Wilson 				/* verification failure was expected */
748e44a1b44SJarod Wilson 				continue;
749da7f033dSHerbert Xu 			/* fall through */
750da7f033dSHerbert Xu 		default:
751d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n",
752d8a32ac2SJussi Kivilinna 			       d, e, j, algo, -ret);
753da7f033dSHerbert Xu 			goto out;
754da7f033dSHerbert Xu 		}
755da7f033dSHerbert Xu 
756da7f033dSHerbert Xu 		ret = -EINVAL;
757da7f033dSHerbert Xu 		for (k = 0, temp = 0; k < template[i].np; k++) {
758d8a32ac2SJussi Kivilinna 			if (diff_dst)
759d8a32ac2SJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
760d8a32ac2SJussi Kivilinna 				    offset_in_page(IDX[k]);
761d8a32ac2SJussi Kivilinna 			else
762da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
763da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
764da7f033dSHerbert Xu 
765da7f033dSHerbert Xu 			n = template[i].tap[k];
766da7f033dSHerbert Xu 			if (k == template[i].np - 1)
767da7f033dSHerbert Xu 				n += enc ? authsize : -authsize;
768da7f033dSHerbert Xu 
769da7f033dSHerbert Xu 			if (memcmp(q, template[i].result + temp, n)) {
770d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n",
771d8a32ac2SJussi Kivilinna 				       d, j, e, k, algo);
772da7f033dSHerbert Xu 				hexdump(q, n);
773da7f033dSHerbert Xu 				goto out;
774da7f033dSHerbert Xu 			}
775da7f033dSHerbert Xu 
776da7f033dSHerbert Xu 			q += n;
777da7f033dSHerbert Xu 			if (k == template[i].np - 1 && !enc) {
778d8a32ac2SJussi Kivilinna 				if (!diff_dst &&
779d8a32ac2SJussi Kivilinna 					memcmp(q, template[i].input +
780da7f033dSHerbert Xu 					      temp + n, authsize))
781da7f033dSHerbert Xu 					n = authsize;
782da7f033dSHerbert Xu 				else
783da7f033dSHerbert Xu 					n = 0;
784da7f033dSHerbert Xu 			} else {
78505b1d338SCristian Stoica 				for (n = 0; offset_in_page(q + n) && q[n]; n++)
786da7f033dSHerbert Xu 					;
787da7f033dSHerbert Xu 			}
788da7f033dSHerbert Xu 			if (n) {
789d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
790d8a32ac2SJussi Kivilinna 				       d, j, e, k, algo, n);
791da7f033dSHerbert Xu 				hexdump(q, n);
792da7f033dSHerbert Xu 				goto out;
793da7f033dSHerbert Xu 			}
794da7f033dSHerbert Xu 
795da7f033dSHerbert Xu 			temp += template[i].tap[k];
796da7f033dSHerbert Xu 		}
797da7f033dSHerbert Xu 	}
798da7f033dSHerbert Xu 
799da7f033dSHerbert Xu 	ret = 0;
800da7f033dSHerbert Xu 
801da7f033dSHerbert Xu out:
802da7f033dSHerbert Xu 	aead_request_free(req);
803d8a32ac2SJussi Kivilinna 	kfree(sg);
804d8a32ac2SJussi Kivilinna out_nosg:
805d8a32ac2SJussi Kivilinna 	if (diff_dst)
806d8a32ac2SJussi Kivilinna 		testmgr_free_buf(xoutbuf);
807d8a32ac2SJussi Kivilinna out_nooutbuf:
808f8b0d4d0SHerbert Xu 	testmgr_free_buf(axbuf);
809f8b0d4d0SHerbert Xu out_noaxbuf:
810f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
811f8b0d4d0SHerbert Xu out_noxbuf:
81229b77e5dSHoria Geanta 	kfree(key);
8139bac019dSTadeusz Struk 	kfree(iv);
814da7f033dSHerbert Xu 	return ret;
815da7f033dSHerbert Xu }
816da7f033dSHerbert Xu 
817d8a32ac2SJussi Kivilinna static int test_aead(struct crypto_aead *tfm, int enc,
818d8a32ac2SJussi Kivilinna 		     struct aead_testvec *template, unsigned int tcount)
819d8a32ac2SJussi Kivilinna {
82058dcf548SJussi Kivilinna 	unsigned int alignmask;
821d8a32ac2SJussi Kivilinna 	int ret;
822d8a32ac2SJussi Kivilinna 
823d8a32ac2SJussi Kivilinna 	/* test 'dst == src' case */
82458dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, false, 0);
825d8a32ac2SJussi Kivilinna 	if (ret)
826d8a32ac2SJussi Kivilinna 		return ret;
827d8a32ac2SJussi Kivilinna 
828d8a32ac2SJussi Kivilinna 	/* test 'dst != src' case */
82958dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, true, 0);
83058dcf548SJussi Kivilinna 	if (ret)
83158dcf548SJussi Kivilinna 		return ret;
83258dcf548SJussi Kivilinna 
83358dcf548SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
83458dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, true, 1);
83558dcf548SJussi Kivilinna 	if (ret)
83658dcf548SJussi Kivilinna 		return ret;
83758dcf548SJussi Kivilinna 
83858dcf548SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
83958dcf548SJussi Kivilinna 	if (alignmask) {
84058dcf548SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
84158dcf548SJussi Kivilinna 		ret = __test_aead(tfm, enc, template, tcount, true,
84258dcf548SJussi Kivilinna 				  alignmask + 1);
84358dcf548SJussi Kivilinna 		if (ret)
84458dcf548SJussi Kivilinna 			return ret;
84558dcf548SJussi Kivilinna 	}
84658dcf548SJussi Kivilinna 
84758dcf548SJussi Kivilinna 	return 0;
848d8a32ac2SJussi Kivilinna }
849d8a32ac2SJussi Kivilinna 
8501aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc,
8511aa4ecd9SHerbert Xu 		       struct cipher_testvec *template, unsigned int tcount)
8521aa4ecd9SHerbert Xu {
8531aa4ecd9SHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm));
8541aa4ecd9SHerbert Xu 	unsigned int i, j, k;
8551aa4ecd9SHerbert Xu 	char *q;
8561aa4ecd9SHerbert Xu 	const char *e;
8571aa4ecd9SHerbert Xu 	void *data;
858f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
859f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
860f8b0d4d0SHerbert Xu 
861f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
862f8b0d4d0SHerbert Xu 		goto out_nobuf;
8631aa4ecd9SHerbert Xu 
8641aa4ecd9SHerbert Xu 	if (enc == ENCRYPT)
8651aa4ecd9SHerbert Xu 	        e = "encryption";
8661aa4ecd9SHerbert Xu 	else
8671aa4ecd9SHerbert Xu 		e = "decryption";
8681aa4ecd9SHerbert Xu 
8691aa4ecd9SHerbert Xu 	j = 0;
8701aa4ecd9SHerbert Xu 	for (i = 0; i < tcount; i++) {
8711aa4ecd9SHerbert Xu 		if (template[i].np)
8721aa4ecd9SHerbert Xu 			continue;
8731aa4ecd9SHerbert Xu 
8741aa4ecd9SHerbert Xu 		j++;
8751aa4ecd9SHerbert Xu 
876fd57f22aSHerbert Xu 		ret = -EINVAL;
877fd57f22aSHerbert Xu 		if (WARN_ON(template[i].ilen > PAGE_SIZE))
878fd57f22aSHerbert Xu 			goto out;
879fd57f22aSHerbert Xu 
8801aa4ecd9SHerbert Xu 		data = xbuf[0];
8811aa4ecd9SHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
8821aa4ecd9SHerbert Xu 
8831aa4ecd9SHerbert Xu 		crypto_cipher_clear_flags(tfm, ~0);
8841aa4ecd9SHerbert Xu 		if (template[i].wk)
8851aa4ecd9SHerbert Xu 			crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
8861aa4ecd9SHerbert Xu 
8871aa4ecd9SHerbert Xu 		ret = crypto_cipher_setkey(tfm, template[i].key,
8881aa4ecd9SHerbert Xu 					   template[i].klen);
8891aa4ecd9SHerbert Xu 		if (!ret == template[i].fail) {
8901aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: setkey failed "
8911aa4ecd9SHerbert Xu 			       "on test %d for %s: flags=%x\n", j,
8921aa4ecd9SHerbert Xu 			       algo, crypto_cipher_get_flags(tfm));
8931aa4ecd9SHerbert Xu 			goto out;
8941aa4ecd9SHerbert Xu 		} else if (ret)
8951aa4ecd9SHerbert Xu 			continue;
8961aa4ecd9SHerbert Xu 
8971aa4ecd9SHerbert Xu 		for (k = 0; k < template[i].ilen;
8981aa4ecd9SHerbert Xu 		     k += crypto_cipher_blocksize(tfm)) {
8991aa4ecd9SHerbert Xu 			if (enc)
9001aa4ecd9SHerbert Xu 				crypto_cipher_encrypt_one(tfm, data + k,
9011aa4ecd9SHerbert Xu 							  data + k);
9021aa4ecd9SHerbert Xu 			else
9031aa4ecd9SHerbert Xu 				crypto_cipher_decrypt_one(tfm, data + k,
9041aa4ecd9SHerbert Xu 							  data + k);
9051aa4ecd9SHerbert Xu 		}
9061aa4ecd9SHerbert Xu 
9071aa4ecd9SHerbert Xu 		q = data;
9081aa4ecd9SHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
9091aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: Test %d failed "
9101aa4ecd9SHerbert Xu 			       "on %s for %s\n", j, e, algo);
9111aa4ecd9SHerbert Xu 			hexdump(q, template[i].rlen);
9121aa4ecd9SHerbert Xu 			ret = -EINVAL;
9131aa4ecd9SHerbert Xu 			goto out;
9141aa4ecd9SHerbert Xu 		}
9151aa4ecd9SHerbert Xu 	}
9161aa4ecd9SHerbert Xu 
9171aa4ecd9SHerbert Xu 	ret = 0;
9181aa4ecd9SHerbert Xu 
9191aa4ecd9SHerbert Xu out:
920f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
921f8b0d4d0SHerbert Xu out_nobuf:
9221aa4ecd9SHerbert Xu 	return ret;
9231aa4ecd9SHerbert Xu }
9241aa4ecd9SHerbert Xu 
92512773d93SHerbert Xu static int __test_skcipher(struct crypto_skcipher *tfm, int enc,
92608d6af8cSJussi Kivilinna 			   struct cipher_testvec *template, unsigned int tcount,
9273a338f20SJussi Kivilinna 			   const bool diff_dst, const int align_offset)
928da7f033dSHerbert Xu {
929da7f033dSHerbert Xu 	const char *algo =
93012773d93SHerbert Xu 		crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm));
931da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
932da7f033dSHerbert Xu 	char *q;
93312773d93SHerbert Xu 	struct skcipher_request *req;
934da7f033dSHerbert Xu 	struct scatterlist sg[8];
93508d6af8cSJussi Kivilinna 	struct scatterlist sgout[8];
93608d6af8cSJussi Kivilinna 	const char *e, *d;
937da7f033dSHerbert Xu 	struct tcrypt_result result;
938da7f033dSHerbert Xu 	void *data;
939da7f033dSHerbert Xu 	char iv[MAX_IVLEN];
940f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
94108d6af8cSJussi Kivilinna 	char *xoutbuf[XBUFSIZE];
942f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
943f8b0d4d0SHerbert Xu 
944f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
945f8b0d4d0SHerbert Xu 		goto out_nobuf;
946da7f033dSHerbert Xu 
94708d6af8cSJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
94808d6af8cSJussi Kivilinna 		goto out_nooutbuf;
94908d6af8cSJussi Kivilinna 
95008d6af8cSJussi Kivilinna 	if (diff_dst)
95108d6af8cSJussi Kivilinna 		d = "-ddst";
95208d6af8cSJussi Kivilinna 	else
95308d6af8cSJussi Kivilinna 		d = "";
95408d6af8cSJussi Kivilinna 
955da7f033dSHerbert Xu 	if (enc == ENCRYPT)
956da7f033dSHerbert Xu 	        e = "encryption";
957da7f033dSHerbert Xu 	else
958da7f033dSHerbert Xu 		e = "decryption";
959da7f033dSHerbert Xu 
960da7f033dSHerbert Xu 	init_completion(&result.completion);
961da7f033dSHerbert Xu 
96212773d93SHerbert Xu 	req = skcipher_request_alloc(tfm, GFP_KERNEL);
963da7f033dSHerbert Xu 	if (!req) {
96408d6af8cSJussi Kivilinna 		pr_err("alg: skcipher%s: Failed to allocate request for %s\n",
96508d6af8cSJussi Kivilinna 		       d, algo);
966da7f033dSHerbert Xu 		goto out;
967da7f033dSHerbert Xu 	}
968da7f033dSHerbert Xu 
96912773d93SHerbert Xu 	skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
970da7f033dSHerbert Xu 				      tcrypt_complete, &result);
971da7f033dSHerbert Xu 
972da7f033dSHerbert Xu 	j = 0;
973da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
974bbb9a7ddSCristian Stoica 		if (template[i].np && !template[i].also_non_np)
975bbb9a7ddSCristian Stoica 			continue;
976bbb9a7ddSCristian Stoica 
977da7f033dSHerbert Xu 		if (template[i].iv)
978da7f033dSHerbert Xu 			memcpy(iv, template[i].iv, MAX_IVLEN);
979da7f033dSHerbert Xu 		else
980da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
981da7f033dSHerbert Xu 
982da7f033dSHerbert Xu 		j++;
983fd57f22aSHerbert Xu 		ret = -EINVAL;
984a1aa44a2SCristian Stoica 		if (WARN_ON(align_offset + template[i].ilen > PAGE_SIZE))
985fd57f22aSHerbert Xu 			goto out;
986fd57f22aSHerbert Xu 
987da7f033dSHerbert Xu 		data = xbuf[0];
9883a338f20SJussi Kivilinna 		data += align_offset;
989da7f033dSHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
990da7f033dSHerbert Xu 
99112773d93SHerbert Xu 		crypto_skcipher_clear_flags(tfm, ~0);
992da7f033dSHerbert Xu 		if (template[i].wk)
99312773d93SHerbert Xu 			crypto_skcipher_set_flags(tfm,
99412773d93SHerbert Xu 						  CRYPTO_TFM_REQ_WEAK_KEY);
995da7f033dSHerbert Xu 
99612773d93SHerbert Xu 		ret = crypto_skcipher_setkey(tfm, template[i].key,
997da7f033dSHerbert Xu 					     template[i].klen);
998da7f033dSHerbert Xu 		if (!ret == template[i].fail) {
99908d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n",
100012773d93SHerbert Xu 			       d, j, algo, crypto_skcipher_get_flags(tfm));
1001da7f033dSHerbert Xu 			goto out;
1002da7f033dSHerbert Xu 		} else if (ret)
1003da7f033dSHerbert Xu 			continue;
1004da7f033dSHerbert Xu 
1005da7f033dSHerbert Xu 		sg_init_one(&sg[0], data, template[i].ilen);
100608d6af8cSJussi Kivilinna 		if (diff_dst) {
100708d6af8cSJussi Kivilinna 			data = xoutbuf[0];
10083a338f20SJussi Kivilinna 			data += align_offset;
100908d6af8cSJussi Kivilinna 			sg_init_one(&sgout[0], data, template[i].ilen);
101008d6af8cSJussi Kivilinna 		}
1011da7f033dSHerbert Xu 
101212773d93SHerbert Xu 		skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1013da7f033dSHerbert Xu 					   template[i].ilen, iv);
101412773d93SHerbert Xu 		ret = enc ? crypto_skcipher_encrypt(req) :
101512773d93SHerbert Xu 			    crypto_skcipher_decrypt(req);
1016da7f033dSHerbert Xu 
1017da7f033dSHerbert Xu 		switch (ret) {
1018da7f033dSHerbert Xu 		case 0:
1019da7f033dSHerbert Xu 			break;
1020da7f033dSHerbert Xu 		case -EINPROGRESS:
1021da7f033dSHerbert Xu 		case -EBUSY:
10228a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
102316735d02SWolfram Sang 			reinit_completion(&result.completion);
10248a45ac12SRabin Vincent 			ret = result.err;
10258a45ac12SRabin Vincent 			if (!ret)
1026da7f033dSHerbert Xu 				break;
1027da7f033dSHerbert Xu 			/* fall through */
1028da7f033dSHerbert Xu 		default:
102908d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n",
103008d6af8cSJussi Kivilinna 			       d, e, j, algo, -ret);
1031da7f033dSHerbert Xu 			goto out;
1032da7f033dSHerbert Xu 		}
1033da7f033dSHerbert Xu 
1034da7f033dSHerbert Xu 		q = data;
1035da7f033dSHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
103608d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: Test %d failed on %s for %s\n",
103708d6af8cSJussi Kivilinna 			       d, j, e, algo);
1038da7f033dSHerbert Xu 			hexdump(q, template[i].rlen);
1039da7f033dSHerbert Xu 			ret = -EINVAL;
1040da7f033dSHerbert Xu 			goto out;
1041da7f033dSHerbert Xu 		}
1042da7f033dSHerbert Xu 	}
1043da7f033dSHerbert Xu 
1044da7f033dSHerbert Xu 	j = 0;
1045da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
10463a338f20SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
10473a338f20SJussi Kivilinna 		if (align_offset != 0)
10483a338f20SJussi Kivilinna 			break;
1049da7f033dSHerbert Xu 
1050bbb9a7ddSCristian Stoica 		if (!template[i].np)
1051bbb9a7ddSCristian Stoica 			continue;
1052bbb9a7ddSCristian Stoica 
1053da7f033dSHerbert Xu 		if (template[i].iv)
1054da7f033dSHerbert Xu 			memcpy(iv, template[i].iv, MAX_IVLEN);
1055da7f033dSHerbert Xu 		else
1056da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
1057da7f033dSHerbert Xu 
1058da7f033dSHerbert Xu 		j++;
105912773d93SHerbert Xu 		crypto_skcipher_clear_flags(tfm, ~0);
1060da7f033dSHerbert Xu 		if (template[i].wk)
106112773d93SHerbert Xu 			crypto_skcipher_set_flags(tfm,
106212773d93SHerbert Xu 						  CRYPTO_TFM_REQ_WEAK_KEY);
1063da7f033dSHerbert Xu 
106412773d93SHerbert Xu 		ret = crypto_skcipher_setkey(tfm, template[i].key,
1065da7f033dSHerbert Xu 					     template[i].klen);
1066da7f033dSHerbert Xu 		if (!ret == template[i].fail) {
106708d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n",
106812773d93SHerbert Xu 			       d, j, algo, crypto_skcipher_get_flags(tfm));
1069da7f033dSHerbert Xu 			goto out;
1070da7f033dSHerbert Xu 		} else if (ret)
1071da7f033dSHerbert Xu 			continue;
1072da7f033dSHerbert Xu 
1073da7f033dSHerbert Xu 		temp = 0;
1074da7f033dSHerbert Xu 		ret = -EINVAL;
1075da7f033dSHerbert Xu 		sg_init_table(sg, template[i].np);
107608d6af8cSJussi Kivilinna 		if (diff_dst)
107708d6af8cSJussi Kivilinna 			sg_init_table(sgout, template[i].np);
1078da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
1079da7f033dSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
1080da7f033dSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
1081da7f033dSHerbert Xu 				goto out;
1082da7f033dSHerbert Xu 
1083a1aa44a2SCristian Stoica 			q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
1084da7f033dSHerbert Xu 
1085a1aa44a2SCristian Stoica 			memcpy(q, template[i].input + temp, template[i].tap[k]);
1086da7f033dSHerbert Xu 
1087a1aa44a2SCristian Stoica 			if (offset_in_page(q) + template[i].tap[k] < PAGE_SIZE)
1088da7f033dSHerbert Xu 				q[template[i].tap[k]] = 0;
1089da7f033dSHerbert Xu 
1090da7f033dSHerbert Xu 			sg_set_buf(&sg[k], q, template[i].tap[k]);
109108d6af8cSJussi Kivilinna 			if (diff_dst) {
109208d6af8cSJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
109308d6af8cSJussi Kivilinna 				    offset_in_page(IDX[k]);
109408d6af8cSJussi Kivilinna 
1095a1aa44a2SCristian Stoica 				sg_set_buf(&sgout[k], q, template[i].tap[k]);
109608d6af8cSJussi Kivilinna 
109708d6af8cSJussi Kivilinna 				memset(q, 0, template[i].tap[k]);
109808d6af8cSJussi Kivilinna 				if (offset_in_page(q) +
109908d6af8cSJussi Kivilinna 				    template[i].tap[k] < PAGE_SIZE)
110008d6af8cSJussi Kivilinna 					q[template[i].tap[k]] = 0;
110108d6af8cSJussi Kivilinna 			}
1102da7f033dSHerbert Xu 
1103da7f033dSHerbert Xu 			temp += template[i].tap[k];
1104da7f033dSHerbert Xu 		}
1105da7f033dSHerbert Xu 
110612773d93SHerbert Xu 		skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1107da7f033dSHerbert Xu 					   template[i].ilen, iv);
1108da7f033dSHerbert Xu 
110912773d93SHerbert Xu 		ret = enc ? crypto_skcipher_encrypt(req) :
111012773d93SHerbert Xu 			    crypto_skcipher_decrypt(req);
1111da7f033dSHerbert Xu 
1112da7f033dSHerbert Xu 		switch (ret) {
1113da7f033dSHerbert Xu 		case 0:
1114da7f033dSHerbert Xu 			break;
1115da7f033dSHerbert Xu 		case -EINPROGRESS:
1116da7f033dSHerbert Xu 		case -EBUSY:
11178a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
111816735d02SWolfram Sang 			reinit_completion(&result.completion);
11198a45ac12SRabin Vincent 			ret = result.err;
11208a45ac12SRabin Vincent 			if (!ret)
1121da7f033dSHerbert Xu 				break;
1122da7f033dSHerbert Xu 			/* fall through */
1123da7f033dSHerbert Xu 		default:
112408d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n",
112508d6af8cSJussi Kivilinna 			       d, e, j, algo, -ret);
1126da7f033dSHerbert Xu 			goto out;
1127da7f033dSHerbert Xu 		}
1128da7f033dSHerbert Xu 
1129da7f033dSHerbert Xu 		temp = 0;
1130da7f033dSHerbert Xu 		ret = -EINVAL;
1131da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
113208d6af8cSJussi Kivilinna 			if (diff_dst)
113308d6af8cSJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
113408d6af8cSJussi Kivilinna 				    offset_in_page(IDX[k]);
113508d6af8cSJussi Kivilinna 			else
1136da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
1137da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
1138da7f033dSHerbert Xu 
1139da7f033dSHerbert Xu 			if (memcmp(q, template[i].result + temp,
1140da7f033dSHerbert Xu 				   template[i].tap[k])) {
114108d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n",
114208d6af8cSJussi Kivilinna 				       d, j, e, k, algo);
1143da7f033dSHerbert Xu 				hexdump(q, template[i].tap[k]);
1144da7f033dSHerbert Xu 				goto out;
1145da7f033dSHerbert Xu 			}
1146da7f033dSHerbert Xu 
1147da7f033dSHerbert Xu 			q += template[i].tap[k];
1148da7f033dSHerbert Xu 			for (n = 0; offset_in_page(q + n) && q[n]; n++)
1149da7f033dSHerbert Xu 				;
1150da7f033dSHerbert Xu 			if (n) {
115108d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
115208d6af8cSJussi Kivilinna 				       d, j, e, k, algo, n);
1153da7f033dSHerbert Xu 				hexdump(q, n);
1154da7f033dSHerbert Xu 				goto out;
1155da7f033dSHerbert Xu 			}
1156da7f033dSHerbert Xu 			temp += template[i].tap[k];
1157da7f033dSHerbert Xu 		}
1158da7f033dSHerbert Xu 	}
1159da7f033dSHerbert Xu 
1160da7f033dSHerbert Xu 	ret = 0;
1161da7f033dSHerbert Xu 
1162da7f033dSHerbert Xu out:
116312773d93SHerbert Xu 	skcipher_request_free(req);
116408d6af8cSJussi Kivilinna 	if (diff_dst)
116508d6af8cSJussi Kivilinna 		testmgr_free_buf(xoutbuf);
116608d6af8cSJussi Kivilinna out_nooutbuf:
1167f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
1168f8b0d4d0SHerbert Xu out_nobuf:
1169da7f033dSHerbert Xu 	return ret;
1170da7f033dSHerbert Xu }
1171da7f033dSHerbert Xu 
117212773d93SHerbert Xu static int test_skcipher(struct crypto_skcipher *tfm, int enc,
117308d6af8cSJussi Kivilinna 			 struct cipher_testvec *template, unsigned int tcount)
117408d6af8cSJussi Kivilinna {
11753a338f20SJussi Kivilinna 	unsigned int alignmask;
117608d6af8cSJussi Kivilinna 	int ret;
117708d6af8cSJussi Kivilinna 
117808d6af8cSJussi Kivilinna 	/* test 'dst == src' case */
11793a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, false, 0);
118008d6af8cSJussi Kivilinna 	if (ret)
118108d6af8cSJussi Kivilinna 		return ret;
118208d6af8cSJussi Kivilinna 
118308d6af8cSJussi Kivilinna 	/* test 'dst != src' case */
11843a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 0);
11853a338f20SJussi Kivilinna 	if (ret)
11863a338f20SJussi Kivilinna 		return ret;
11873a338f20SJussi Kivilinna 
11883a338f20SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
11893a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 1);
11903a338f20SJussi Kivilinna 	if (ret)
11913a338f20SJussi Kivilinna 		return ret;
11923a338f20SJussi Kivilinna 
11933a338f20SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
11943a338f20SJussi Kivilinna 	if (alignmask) {
11953a338f20SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
11963a338f20SJussi Kivilinna 		ret = __test_skcipher(tfm, enc, template, tcount, true,
11973a338f20SJussi Kivilinna 				      alignmask + 1);
11983a338f20SJussi Kivilinna 		if (ret)
11993a338f20SJussi Kivilinna 			return ret;
12003a338f20SJussi Kivilinna 	}
12013a338f20SJussi Kivilinna 
12023a338f20SJussi Kivilinna 	return 0;
120308d6af8cSJussi Kivilinna }
120408d6af8cSJussi Kivilinna 
1205da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate,
1206da7f033dSHerbert Xu 		     struct comp_testvec *dtemplate, int ctcount, int dtcount)
1207da7f033dSHerbert Xu {
1208da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
1209da7f033dSHerbert Xu 	unsigned int i;
1210da7f033dSHerbert Xu 	char result[COMP_BUF_SIZE];
1211da7f033dSHerbert Xu 	int ret;
1212da7f033dSHerbert Xu 
1213da7f033dSHerbert Xu 	for (i = 0; i < ctcount; i++) {
1214c79cf910SGeert Uytterhoeven 		int ilen;
1215c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1216da7f033dSHerbert Xu 
1217da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1218da7f033dSHerbert Xu 
1219da7f033dSHerbert Xu 		ilen = ctemplate[i].inlen;
1220da7f033dSHerbert Xu 		ret = crypto_comp_compress(tfm, ctemplate[i].input,
1221da7f033dSHerbert Xu 		                           ilen, result, &dlen);
1222da7f033dSHerbert Xu 		if (ret) {
1223da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: compression failed "
1224da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1225da7f033dSHerbert Xu 			       -ret);
1226da7f033dSHerbert Xu 			goto out;
1227da7f033dSHerbert Xu 		}
1228da7f033dSHerbert Xu 
1229b812eb00SGeert Uytterhoeven 		if (dlen != ctemplate[i].outlen) {
1230b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Compression test %d "
1231b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1232b812eb00SGeert Uytterhoeven 			       dlen);
1233b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1234b812eb00SGeert Uytterhoeven 			goto out;
1235b812eb00SGeert Uytterhoeven 		}
1236b812eb00SGeert Uytterhoeven 
1237da7f033dSHerbert Xu 		if (memcmp(result, ctemplate[i].output, dlen)) {
1238da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Compression test %d "
1239da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1240da7f033dSHerbert Xu 			hexdump(result, dlen);
1241da7f033dSHerbert Xu 			ret = -EINVAL;
1242da7f033dSHerbert Xu 			goto out;
1243da7f033dSHerbert Xu 		}
1244da7f033dSHerbert Xu 	}
1245da7f033dSHerbert Xu 
1246da7f033dSHerbert Xu 	for (i = 0; i < dtcount; i++) {
1247c79cf910SGeert Uytterhoeven 		int ilen;
1248c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1249da7f033dSHerbert Xu 
1250da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1251da7f033dSHerbert Xu 
1252da7f033dSHerbert Xu 		ilen = dtemplate[i].inlen;
1253da7f033dSHerbert Xu 		ret = crypto_comp_decompress(tfm, dtemplate[i].input,
1254da7f033dSHerbert Xu 		                             ilen, result, &dlen);
1255da7f033dSHerbert Xu 		if (ret) {
1256da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: decompression failed "
1257da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1258da7f033dSHerbert Xu 			       -ret);
1259da7f033dSHerbert Xu 			goto out;
1260da7f033dSHerbert Xu 		}
1261da7f033dSHerbert Xu 
1262b812eb00SGeert Uytterhoeven 		if (dlen != dtemplate[i].outlen) {
1263b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Decompression test %d "
1264b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1265b812eb00SGeert Uytterhoeven 			       dlen);
1266b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1267b812eb00SGeert Uytterhoeven 			goto out;
1268b812eb00SGeert Uytterhoeven 		}
1269b812eb00SGeert Uytterhoeven 
1270da7f033dSHerbert Xu 		if (memcmp(result, dtemplate[i].output, dlen)) {
1271da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Decompression test %d "
1272da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1273da7f033dSHerbert Xu 			hexdump(result, dlen);
1274da7f033dSHerbert Xu 			ret = -EINVAL;
1275da7f033dSHerbert Xu 			goto out;
1276da7f033dSHerbert Xu 		}
1277da7f033dSHerbert Xu 	}
1278da7f033dSHerbert Xu 
1279da7f033dSHerbert Xu 	ret = 0;
1280da7f033dSHerbert Xu 
1281da7f033dSHerbert Xu out:
1282da7f033dSHerbert Xu 	return ret;
1283da7f033dSHerbert Xu }
1284da7f033dSHerbert Xu 
12858064efb8SGeert Uytterhoeven static int test_pcomp(struct crypto_pcomp *tfm,
12868064efb8SGeert Uytterhoeven 		      struct pcomp_testvec *ctemplate,
12878064efb8SGeert Uytterhoeven 		      struct pcomp_testvec *dtemplate, int ctcount,
12888064efb8SGeert Uytterhoeven 		      int dtcount)
12898064efb8SGeert Uytterhoeven {
12908064efb8SGeert Uytterhoeven 	const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm));
12918064efb8SGeert Uytterhoeven 	unsigned int i;
12928064efb8SGeert Uytterhoeven 	char result[COMP_BUF_SIZE];
12933ce858cbSGeert Uytterhoeven 	int res;
12948064efb8SGeert Uytterhoeven 
12958064efb8SGeert Uytterhoeven 	for (i = 0; i < ctcount; i++) {
12968064efb8SGeert Uytterhoeven 		struct comp_request req;
12973ce858cbSGeert Uytterhoeven 		unsigned int produced = 0;
12988064efb8SGeert Uytterhoeven 
12993ce858cbSGeert Uytterhoeven 		res = crypto_compress_setup(tfm, ctemplate[i].params,
13008064efb8SGeert Uytterhoeven 					    ctemplate[i].paramsize);
13013ce858cbSGeert Uytterhoeven 		if (res) {
13028064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression setup failed on test "
13033ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13043ce858cbSGeert Uytterhoeven 			return res;
13058064efb8SGeert Uytterhoeven 		}
13068064efb8SGeert Uytterhoeven 
13073ce858cbSGeert Uytterhoeven 		res = crypto_compress_init(tfm);
13083ce858cbSGeert Uytterhoeven 		if (res) {
13098064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression init failed on test "
13103ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13113ce858cbSGeert Uytterhoeven 			return res;
13128064efb8SGeert Uytterhoeven 		}
13138064efb8SGeert Uytterhoeven 
13148064efb8SGeert Uytterhoeven 		memset(result, 0, sizeof(result));
13158064efb8SGeert Uytterhoeven 
13168064efb8SGeert Uytterhoeven 		req.next_in = ctemplate[i].input;
13178064efb8SGeert Uytterhoeven 		req.avail_in = ctemplate[i].inlen / 2;
13188064efb8SGeert Uytterhoeven 		req.next_out = result;
13198064efb8SGeert Uytterhoeven 		req.avail_out = ctemplate[i].outlen / 2;
13208064efb8SGeert Uytterhoeven 
13213ce858cbSGeert Uytterhoeven 		res = crypto_compress_update(tfm, &req);
13223ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
13238064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression update failed on test "
13243ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13253ce858cbSGeert Uytterhoeven 			return res;
13268064efb8SGeert Uytterhoeven 		}
13273ce858cbSGeert Uytterhoeven 		if (res > 0)
13283ce858cbSGeert Uytterhoeven 			produced += res;
13298064efb8SGeert Uytterhoeven 
13308064efb8SGeert Uytterhoeven 		/* Add remaining input data */
13318064efb8SGeert Uytterhoeven 		req.avail_in += (ctemplate[i].inlen + 1) / 2;
13328064efb8SGeert Uytterhoeven 
13333ce858cbSGeert Uytterhoeven 		res = crypto_compress_update(tfm, &req);
13343ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
13358064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression update failed on test "
13363ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13373ce858cbSGeert Uytterhoeven 			return res;
13388064efb8SGeert Uytterhoeven 		}
13393ce858cbSGeert Uytterhoeven 		if (res > 0)
13403ce858cbSGeert Uytterhoeven 			produced += res;
13418064efb8SGeert Uytterhoeven 
13428064efb8SGeert Uytterhoeven 		/* Provide remaining output space */
13438064efb8SGeert Uytterhoeven 		req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2;
13448064efb8SGeert Uytterhoeven 
13453ce858cbSGeert Uytterhoeven 		res = crypto_compress_final(tfm, &req);
13463ce858cbSGeert Uytterhoeven 		if (res < 0) {
13478064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression final failed on test "
13483ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13493ce858cbSGeert Uytterhoeven 			return res;
13508064efb8SGeert Uytterhoeven 		}
13513ce858cbSGeert Uytterhoeven 		produced += res;
13528064efb8SGeert Uytterhoeven 
13538064efb8SGeert Uytterhoeven 		if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) {
13548064efb8SGeert Uytterhoeven 			pr_err("alg: comp: Compression test %d failed for %s: "
13558064efb8SGeert Uytterhoeven 			       "output len = %d (expected %d)\n", i + 1, algo,
13568064efb8SGeert Uytterhoeven 			       COMP_BUF_SIZE - req.avail_out,
13578064efb8SGeert Uytterhoeven 			       ctemplate[i].outlen);
13588064efb8SGeert Uytterhoeven 			return -EINVAL;
13598064efb8SGeert Uytterhoeven 		}
13608064efb8SGeert Uytterhoeven 
13613ce858cbSGeert Uytterhoeven 		if (produced != ctemplate[i].outlen) {
13623ce858cbSGeert Uytterhoeven 			pr_err("alg: comp: Compression test %d failed for %s: "
13633ce858cbSGeert Uytterhoeven 			       "returned len = %u (expected %d)\n", i + 1,
13643ce858cbSGeert Uytterhoeven 			       algo, produced, ctemplate[i].outlen);
13653ce858cbSGeert Uytterhoeven 			return -EINVAL;
13663ce858cbSGeert Uytterhoeven 		}
13673ce858cbSGeert Uytterhoeven 
13688064efb8SGeert Uytterhoeven 		if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) {
13698064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: Compression test %d failed for "
13708064efb8SGeert Uytterhoeven 			       "%s\n", i + 1, algo);
13718064efb8SGeert Uytterhoeven 			hexdump(result, ctemplate[i].outlen);
13728064efb8SGeert Uytterhoeven 			return -EINVAL;
13738064efb8SGeert Uytterhoeven 		}
13748064efb8SGeert Uytterhoeven 	}
13758064efb8SGeert Uytterhoeven 
13768064efb8SGeert Uytterhoeven 	for (i = 0; i < dtcount; i++) {
13778064efb8SGeert Uytterhoeven 		struct comp_request req;
13783ce858cbSGeert Uytterhoeven 		unsigned int produced = 0;
13798064efb8SGeert Uytterhoeven 
13803ce858cbSGeert Uytterhoeven 		res = crypto_decompress_setup(tfm, dtemplate[i].params,
13818064efb8SGeert Uytterhoeven 					      dtemplate[i].paramsize);
13823ce858cbSGeert Uytterhoeven 		if (res) {
13838064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression setup failed on "
13843ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
13853ce858cbSGeert Uytterhoeven 			return res;
13868064efb8SGeert Uytterhoeven 		}
13878064efb8SGeert Uytterhoeven 
13883ce858cbSGeert Uytterhoeven 		res = crypto_decompress_init(tfm);
13893ce858cbSGeert Uytterhoeven 		if (res) {
13908064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression init failed on test "
13913ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13923ce858cbSGeert Uytterhoeven 			return res;
13938064efb8SGeert Uytterhoeven 		}
13948064efb8SGeert Uytterhoeven 
13958064efb8SGeert Uytterhoeven 		memset(result, 0, sizeof(result));
13968064efb8SGeert Uytterhoeven 
13978064efb8SGeert Uytterhoeven 		req.next_in = dtemplate[i].input;
13988064efb8SGeert Uytterhoeven 		req.avail_in = dtemplate[i].inlen / 2;
13998064efb8SGeert Uytterhoeven 		req.next_out = result;
14008064efb8SGeert Uytterhoeven 		req.avail_out = dtemplate[i].outlen / 2;
14018064efb8SGeert Uytterhoeven 
14023ce858cbSGeert Uytterhoeven 		res = crypto_decompress_update(tfm, &req);
14033ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
14048064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression update failed on "
14053ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
14063ce858cbSGeert Uytterhoeven 			return res;
14078064efb8SGeert Uytterhoeven 		}
14083ce858cbSGeert Uytterhoeven 		if (res > 0)
14093ce858cbSGeert Uytterhoeven 			produced += res;
14108064efb8SGeert Uytterhoeven 
14118064efb8SGeert Uytterhoeven 		/* Add remaining input data */
14128064efb8SGeert Uytterhoeven 		req.avail_in += (dtemplate[i].inlen + 1) / 2;
14138064efb8SGeert Uytterhoeven 
14143ce858cbSGeert Uytterhoeven 		res = crypto_decompress_update(tfm, &req);
14153ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
14168064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression update failed on "
14173ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
14183ce858cbSGeert Uytterhoeven 			return res;
14198064efb8SGeert Uytterhoeven 		}
14203ce858cbSGeert Uytterhoeven 		if (res > 0)
14213ce858cbSGeert Uytterhoeven 			produced += res;
14228064efb8SGeert Uytterhoeven 
14238064efb8SGeert Uytterhoeven 		/* Provide remaining output space */
14248064efb8SGeert Uytterhoeven 		req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2;
14258064efb8SGeert Uytterhoeven 
14263ce858cbSGeert Uytterhoeven 		res = crypto_decompress_final(tfm, &req);
14273ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
14288064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression final failed on "
14293ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
14303ce858cbSGeert Uytterhoeven 			return res;
14318064efb8SGeert Uytterhoeven 		}
14323ce858cbSGeert Uytterhoeven 		if (res > 0)
14333ce858cbSGeert Uytterhoeven 			produced += res;
14348064efb8SGeert Uytterhoeven 
14358064efb8SGeert Uytterhoeven 		if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) {
14368064efb8SGeert Uytterhoeven 			pr_err("alg: comp: Decompression test %d failed for "
14378064efb8SGeert Uytterhoeven 			       "%s: output len = %d (expected %d)\n", i + 1,
14388064efb8SGeert Uytterhoeven 			       algo, COMP_BUF_SIZE - req.avail_out,
14398064efb8SGeert Uytterhoeven 			       dtemplate[i].outlen);
14408064efb8SGeert Uytterhoeven 			return -EINVAL;
14418064efb8SGeert Uytterhoeven 		}
14428064efb8SGeert Uytterhoeven 
14433ce858cbSGeert Uytterhoeven 		if (produced != dtemplate[i].outlen) {
14443ce858cbSGeert Uytterhoeven 			pr_err("alg: comp: Decompression test %d failed for "
14453ce858cbSGeert Uytterhoeven 			       "%s: returned len = %u (expected %d)\n", i + 1,
14463ce858cbSGeert Uytterhoeven 			       algo, produced, dtemplate[i].outlen);
14473ce858cbSGeert Uytterhoeven 			return -EINVAL;
14483ce858cbSGeert Uytterhoeven 		}
14493ce858cbSGeert Uytterhoeven 
14508064efb8SGeert Uytterhoeven 		if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) {
14518064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: Decompression test %d failed for "
14528064efb8SGeert Uytterhoeven 			       "%s\n", i + 1, algo);
14538064efb8SGeert Uytterhoeven 			hexdump(result, dtemplate[i].outlen);
14548064efb8SGeert Uytterhoeven 			return -EINVAL;
14558064efb8SGeert Uytterhoeven 		}
14568064efb8SGeert Uytterhoeven 	}
14578064efb8SGeert Uytterhoeven 
14588064efb8SGeert Uytterhoeven 	return 0;
14598064efb8SGeert Uytterhoeven }
14608064efb8SGeert Uytterhoeven 
14617647d6ceSJarod Wilson 
14627647d6ceSJarod Wilson static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template,
14637647d6ceSJarod Wilson 		      unsigned int tcount)
14647647d6ceSJarod Wilson {
14657647d6ceSJarod Wilson 	const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
1466fa4ef8a6SFelipe Contreras 	int err = 0, i, j, seedsize;
14677647d6ceSJarod Wilson 	u8 *seed;
14687647d6ceSJarod Wilson 	char result[32];
14697647d6ceSJarod Wilson 
14707647d6ceSJarod Wilson 	seedsize = crypto_rng_seedsize(tfm);
14717647d6ceSJarod Wilson 
14727647d6ceSJarod Wilson 	seed = kmalloc(seedsize, GFP_KERNEL);
14737647d6ceSJarod Wilson 	if (!seed) {
14747647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to allocate seed space "
14757647d6ceSJarod Wilson 		       "for %s\n", algo);
14767647d6ceSJarod Wilson 		return -ENOMEM;
14777647d6ceSJarod Wilson 	}
14787647d6ceSJarod Wilson 
14797647d6ceSJarod Wilson 	for (i = 0; i < tcount; i++) {
14807647d6ceSJarod Wilson 		memset(result, 0, 32);
14817647d6ceSJarod Wilson 
14827647d6ceSJarod Wilson 		memcpy(seed, template[i].v, template[i].vlen);
14837647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen, template[i].key,
14847647d6ceSJarod Wilson 		       template[i].klen);
14857647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen + template[i].klen,
14867647d6ceSJarod Wilson 		       template[i].dt, template[i].dtlen);
14877647d6ceSJarod Wilson 
14887647d6ceSJarod Wilson 		err = crypto_rng_reset(tfm, seed, seedsize);
14897647d6ceSJarod Wilson 		if (err) {
14907647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Failed to reset rng "
14917647d6ceSJarod Wilson 			       "for %s\n", algo);
14927647d6ceSJarod Wilson 			goto out;
14937647d6ceSJarod Wilson 		}
14947647d6ceSJarod Wilson 
14957647d6ceSJarod Wilson 		for (j = 0; j < template[i].loops; j++) {
14967647d6ceSJarod Wilson 			err = crypto_rng_get_bytes(tfm, result,
14977647d6ceSJarod Wilson 						   template[i].rlen);
149819e60e13SStephan Mueller 			if (err < 0) {
14997647d6ceSJarod Wilson 				printk(KERN_ERR "alg: cprng: Failed to obtain "
15007647d6ceSJarod Wilson 				       "the correct amount of random data for "
150119e60e13SStephan Mueller 				       "%s (requested %d)\n", algo,
150219e60e13SStephan Mueller 				       template[i].rlen);
15037647d6ceSJarod Wilson 				goto out;
15047647d6ceSJarod Wilson 			}
15057647d6ceSJarod Wilson 		}
15067647d6ceSJarod Wilson 
15077647d6ceSJarod Wilson 		err = memcmp(result, template[i].result,
15087647d6ceSJarod Wilson 			     template[i].rlen);
15097647d6ceSJarod Wilson 		if (err) {
15107647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Test %d failed for %s\n",
15117647d6ceSJarod Wilson 			       i, algo);
15127647d6ceSJarod Wilson 			hexdump(result, template[i].rlen);
15137647d6ceSJarod Wilson 			err = -EINVAL;
15147647d6ceSJarod Wilson 			goto out;
15157647d6ceSJarod Wilson 		}
15167647d6ceSJarod Wilson 	}
15177647d6ceSJarod Wilson 
15187647d6ceSJarod Wilson out:
15197647d6ceSJarod Wilson 	kfree(seed);
15207647d6ceSJarod Wilson 	return err;
15217647d6ceSJarod Wilson }
15227647d6ceSJarod Wilson 
1523da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
1524da7f033dSHerbert Xu 			 u32 type, u32 mask)
1525da7f033dSHerbert Xu {
1526da7f033dSHerbert Xu 	struct crypto_aead *tfm;
1527da7f033dSHerbert Xu 	int err = 0;
1528da7f033dSHerbert Xu 
1529425a8829SStephan Mueller 	tfm = crypto_alloc_aead(driver, type | CRYPTO_ALG_INTERNAL, mask);
1530da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1531da7f033dSHerbert Xu 		printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
1532da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1533da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1534da7f033dSHerbert Xu 	}
1535da7f033dSHerbert Xu 
1536da7f033dSHerbert Xu 	if (desc->suite.aead.enc.vecs) {
1537da7f033dSHerbert Xu 		err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
1538da7f033dSHerbert Xu 				desc->suite.aead.enc.count);
1539da7f033dSHerbert Xu 		if (err)
1540da7f033dSHerbert Xu 			goto out;
1541da7f033dSHerbert Xu 	}
1542da7f033dSHerbert Xu 
1543da7f033dSHerbert Xu 	if (!err && desc->suite.aead.dec.vecs)
1544da7f033dSHerbert Xu 		err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
1545da7f033dSHerbert Xu 				desc->suite.aead.dec.count);
1546da7f033dSHerbert Xu 
1547da7f033dSHerbert Xu out:
1548da7f033dSHerbert Xu 	crypto_free_aead(tfm);
1549da7f033dSHerbert Xu 	return err;
1550da7f033dSHerbert Xu }
1551da7f033dSHerbert Xu 
1552da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc,
1553da7f033dSHerbert Xu 			   const char *driver, u32 type, u32 mask)
1554da7f033dSHerbert Xu {
15551aa4ecd9SHerbert Xu 	struct crypto_cipher *tfm;
1556da7f033dSHerbert Xu 	int err = 0;
1557da7f033dSHerbert Xu 
1558425a8829SStephan Mueller 	tfm = crypto_alloc_cipher(driver, type | CRYPTO_ALG_INTERNAL, mask);
1559da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1560da7f033dSHerbert Xu 		printk(KERN_ERR "alg: cipher: Failed to load transform for "
1561da7f033dSHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
1562da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1563da7f033dSHerbert Xu 	}
1564da7f033dSHerbert Xu 
1565da7f033dSHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
1566da7f033dSHerbert Xu 		err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1567da7f033dSHerbert Xu 				  desc->suite.cipher.enc.count);
1568da7f033dSHerbert Xu 		if (err)
1569da7f033dSHerbert Xu 			goto out;
1570da7f033dSHerbert Xu 	}
1571da7f033dSHerbert Xu 
1572da7f033dSHerbert Xu 	if (desc->suite.cipher.dec.vecs)
1573da7f033dSHerbert Xu 		err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1574da7f033dSHerbert Xu 				  desc->suite.cipher.dec.count);
1575da7f033dSHerbert Xu 
1576da7f033dSHerbert Xu out:
15771aa4ecd9SHerbert Xu 	crypto_free_cipher(tfm);
15781aa4ecd9SHerbert Xu 	return err;
15791aa4ecd9SHerbert Xu }
15801aa4ecd9SHerbert Xu 
15811aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc,
15821aa4ecd9SHerbert Xu 			     const char *driver, u32 type, u32 mask)
15831aa4ecd9SHerbert Xu {
158412773d93SHerbert Xu 	struct crypto_skcipher *tfm;
15851aa4ecd9SHerbert Xu 	int err = 0;
15861aa4ecd9SHerbert Xu 
158712773d93SHerbert Xu 	tfm = crypto_alloc_skcipher(driver, type | CRYPTO_ALG_INTERNAL, mask);
15881aa4ecd9SHerbert Xu 	if (IS_ERR(tfm)) {
15891aa4ecd9SHerbert Xu 		printk(KERN_ERR "alg: skcipher: Failed to load transform for "
15901aa4ecd9SHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
15911aa4ecd9SHerbert Xu 		return PTR_ERR(tfm);
15921aa4ecd9SHerbert Xu 	}
15931aa4ecd9SHerbert Xu 
15941aa4ecd9SHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
15951aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
15961aa4ecd9SHerbert Xu 				    desc->suite.cipher.enc.count);
15971aa4ecd9SHerbert Xu 		if (err)
15981aa4ecd9SHerbert Xu 			goto out;
15991aa4ecd9SHerbert Xu 	}
16001aa4ecd9SHerbert Xu 
16011aa4ecd9SHerbert Xu 	if (desc->suite.cipher.dec.vecs)
16021aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
16031aa4ecd9SHerbert Xu 				    desc->suite.cipher.dec.count);
16041aa4ecd9SHerbert Xu 
16051aa4ecd9SHerbert Xu out:
160612773d93SHerbert Xu 	crypto_free_skcipher(tfm);
1607da7f033dSHerbert Xu 	return err;
1608da7f033dSHerbert Xu }
1609da7f033dSHerbert Xu 
1610da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
1611da7f033dSHerbert Xu 			 u32 type, u32 mask)
1612da7f033dSHerbert Xu {
1613da7f033dSHerbert Xu 	struct crypto_comp *tfm;
1614da7f033dSHerbert Xu 	int err;
1615da7f033dSHerbert Xu 
1616da7f033dSHerbert Xu 	tfm = crypto_alloc_comp(driver, type, mask);
1617da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1618da7f033dSHerbert Xu 		printk(KERN_ERR "alg: comp: Failed to load transform for %s: "
1619da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1620da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1621da7f033dSHerbert Xu 	}
1622da7f033dSHerbert Xu 
1623da7f033dSHerbert Xu 	err = test_comp(tfm, desc->suite.comp.comp.vecs,
1624da7f033dSHerbert Xu 			desc->suite.comp.decomp.vecs,
1625da7f033dSHerbert Xu 			desc->suite.comp.comp.count,
1626da7f033dSHerbert Xu 			desc->suite.comp.decomp.count);
1627da7f033dSHerbert Xu 
1628da7f033dSHerbert Xu 	crypto_free_comp(tfm);
1629da7f033dSHerbert Xu 	return err;
1630da7f033dSHerbert Xu }
1631da7f033dSHerbert Xu 
16328064efb8SGeert Uytterhoeven static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver,
16338064efb8SGeert Uytterhoeven 			  u32 type, u32 mask)
16348064efb8SGeert Uytterhoeven {
16358064efb8SGeert Uytterhoeven 	struct crypto_pcomp *tfm;
16368064efb8SGeert Uytterhoeven 	int err;
16378064efb8SGeert Uytterhoeven 
16388064efb8SGeert Uytterhoeven 	tfm = crypto_alloc_pcomp(driver, type, mask);
16398064efb8SGeert Uytterhoeven 	if (IS_ERR(tfm)) {
16408064efb8SGeert Uytterhoeven 		pr_err("alg: pcomp: Failed to load transform for %s: %ld\n",
16418064efb8SGeert Uytterhoeven 		       driver, PTR_ERR(tfm));
16428064efb8SGeert Uytterhoeven 		return PTR_ERR(tfm);
16438064efb8SGeert Uytterhoeven 	}
16448064efb8SGeert Uytterhoeven 
16458064efb8SGeert Uytterhoeven 	err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs,
16468064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.decomp.vecs,
16478064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.comp.count,
16488064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.decomp.count);
16498064efb8SGeert Uytterhoeven 
16508064efb8SGeert Uytterhoeven 	crypto_free_pcomp(tfm);
16518064efb8SGeert Uytterhoeven 	return err;
16528064efb8SGeert Uytterhoeven }
16538064efb8SGeert Uytterhoeven 
1654da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
1655da7f033dSHerbert Xu 			 u32 type, u32 mask)
1656da7f033dSHerbert Xu {
1657da7f033dSHerbert Xu 	struct crypto_ahash *tfm;
1658da7f033dSHerbert Xu 	int err;
1659da7f033dSHerbert Xu 
1660425a8829SStephan Mueller 	tfm = crypto_alloc_ahash(driver, type | CRYPTO_ALG_INTERNAL, mask);
1661da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1662da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
1663da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1664da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1665da7f033dSHerbert Xu 	}
1666da7f033dSHerbert Xu 
1667a8f1a052SDavid S. Miller 	err = test_hash(tfm, desc->suite.hash.vecs,
1668a8f1a052SDavid S. Miller 			desc->suite.hash.count, true);
1669a8f1a052SDavid S. Miller 	if (!err)
1670a8f1a052SDavid S. Miller 		err = test_hash(tfm, desc->suite.hash.vecs,
1671a8f1a052SDavid S. Miller 				desc->suite.hash.count, false);
1672da7f033dSHerbert Xu 
1673da7f033dSHerbert Xu 	crypto_free_ahash(tfm);
1674da7f033dSHerbert Xu 	return err;
1675da7f033dSHerbert Xu }
1676da7f033dSHerbert Xu 
16778e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc,
16788e3ee85eSHerbert Xu 			   const char *driver, u32 type, u32 mask)
16798e3ee85eSHerbert Xu {
16808e3ee85eSHerbert Xu 	struct crypto_shash *tfm;
16818e3ee85eSHerbert Xu 	u32 val;
16828e3ee85eSHerbert Xu 	int err;
16838e3ee85eSHerbert Xu 
16848e3ee85eSHerbert Xu 	err = alg_test_hash(desc, driver, type, mask);
16858e3ee85eSHerbert Xu 	if (err)
16868e3ee85eSHerbert Xu 		goto out;
16878e3ee85eSHerbert Xu 
1688425a8829SStephan Mueller 	tfm = crypto_alloc_shash(driver, type | CRYPTO_ALG_INTERNAL, mask);
16898e3ee85eSHerbert Xu 	if (IS_ERR(tfm)) {
16908e3ee85eSHerbert Xu 		printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
16918e3ee85eSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
16928e3ee85eSHerbert Xu 		err = PTR_ERR(tfm);
16938e3ee85eSHerbert Xu 		goto out;
16948e3ee85eSHerbert Xu 	}
16958e3ee85eSHerbert Xu 
16968e3ee85eSHerbert Xu 	do {
16974c5c3024SJan-Simon Möller 		SHASH_DESC_ON_STACK(shash, tfm);
16984c5c3024SJan-Simon Möller 		u32 *ctx = (u32 *)shash_desc_ctx(shash);
16998e3ee85eSHerbert Xu 
17004c5c3024SJan-Simon Möller 		shash->tfm = tfm;
17014c5c3024SJan-Simon Möller 		shash->flags = 0;
17028e3ee85eSHerbert Xu 
17034c5c3024SJan-Simon Möller 		*ctx = le32_to_cpu(420553207);
17044c5c3024SJan-Simon Möller 		err = crypto_shash_final(shash, (u8 *)&val);
17058e3ee85eSHerbert Xu 		if (err) {
17068e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Operation failed for "
17078e3ee85eSHerbert Xu 			       "%s: %d\n", driver, err);
17088e3ee85eSHerbert Xu 			break;
17098e3ee85eSHerbert Xu 		}
17108e3ee85eSHerbert Xu 
17118e3ee85eSHerbert Xu 		if (val != ~420553207) {
17128e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Test failed for %s: "
17138e3ee85eSHerbert Xu 			       "%d\n", driver, val);
17148e3ee85eSHerbert Xu 			err = -EINVAL;
17158e3ee85eSHerbert Xu 		}
17168e3ee85eSHerbert Xu 	} while (0);
17178e3ee85eSHerbert Xu 
17188e3ee85eSHerbert Xu 	crypto_free_shash(tfm);
17198e3ee85eSHerbert Xu 
17208e3ee85eSHerbert Xu out:
17218e3ee85eSHerbert Xu 	return err;
17228e3ee85eSHerbert Xu }
17238e3ee85eSHerbert Xu 
17247647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
17257647d6ceSJarod Wilson 			  u32 type, u32 mask)
17267647d6ceSJarod Wilson {
17277647d6ceSJarod Wilson 	struct crypto_rng *rng;
17287647d6ceSJarod Wilson 	int err;
17297647d6ceSJarod Wilson 
1730425a8829SStephan Mueller 	rng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask);
17317647d6ceSJarod Wilson 	if (IS_ERR(rng)) {
17327647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
17337647d6ceSJarod Wilson 		       "%ld\n", driver, PTR_ERR(rng));
17347647d6ceSJarod Wilson 		return PTR_ERR(rng);
17357647d6ceSJarod Wilson 	}
17367647d6ceSJarod Wilson 
17377647d6ceSJarod Wilson 	err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count);
17387647d6ceSJarod Wilson 
17397647d6ceSJarod Wilson 	crypto_free_rng(rng);
17407647d6ceSJarod Wilson 
17417647d6ceSJarod Wilson 	return err;
17427647d6ceSJarod Wilson }
17437647d6ceSJarod Wilson 
174464d1cdfbSStephan Mueller 
174564d1cdfbSStephan Mueller static int drbg_cavs_test(struct drbg_testvec *test, int pr,
174664d1cdfbSStephan Mueller 			  const char *driver, u32 type, u32 mask)
174764d1cdfbSStephan Mueller {
174864d1cdfbSStephan Mueller 	int ret = -EAGAIN;
174964d1cdfbSStephan Mueller 	struct crypto_rng *drng;
175064d1cdfbSStephan Mueller 	struct drbg_test_data test_data;
175164d1cdfbSStephan Mueller 	struct drbg_string addtl, pers, testentropy;
175264d1cdfbSStephan Mueller 	unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL);
175364d1cdfbSStephan Mueller 
175464d1cdfbSStephan Mueller 	if (!buf)
175564d1cdfbSStephan Mueller 		return -ENOMEM;
175664d1cdfbSStephan Mueller 
1757425a8829SStephan Mueller 	drng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask);
175864d1cdfbSStephan Mueller 	if (IS_ERR(drng)) {
175964d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for "
176064d1cdfbSStephan Mueller 		       "%s\n", driver);
176164d1cdfbSStephan Mueller 		kzfree(buf);
176264d1cdfbSStephan Mueller 		return -ENOMEM;
176364d1cdfbSStephan Mueller 	}
176464d1cdfbSStephan Mueller 
176564d1cdfbSStephan Mueller 	test_data.testentropy = &testentropy;
176664d1cdfbSStephan Mueller 	drbg_string_fill(&testentropy, test->entropy, test->entropylen);
176764d1cdfbSStephan Mueller 	drbg_string_fill(&pers, test->pers, test->perslen);
176864d1cdfbSStephan Mueller 	ret = crypto_drbg_reset_test(drng, &pers, &test_data);
176964d1cdfbSStephan Mueller 	if (ret) {
177064d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: Failed to reset rng\n");
177164d1cdfbSStephan Mueller 		goto outbuf;
177264d1cdfbSStephan Mueller 	}
177364d1cdfbSStephan Mueller 
177464d1cdfbSStephan Mueller 	drbg_string_fill(&addtl, test->addtla, test->addtllen);
177564d1cdfbSStephan Mueller 	if (pr) {
177664d1cdfbSStephan Mueller 		drbg_string_fill(&testentropy, test->entpra, test->entprlen);
177764d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl_test(drng,
177864d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl,	&test_data);
177964d1cdfbSStephan Mueller 	} else {
178064d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl(drng,
178164d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl);
178264d1cdfbSStephan Mueller 	}
178319e60e13SStephan Mueller 	if (ret < 0) {
178464d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not obtain random data for "
178564d1cdfbSStephan Mueller 		       "driver %s\n", driver);
178664d1cdfbSStephan Mueller 		goto outbuf;
178764d1cdfbSStephan Mueller 	}
178864d1cdfbSStephan Mueller 
178964d1cdfbSStephan Mueller 	drbg_string_fill(&addtl, test->addtlb, test->addtllen);
179064d1cdfbSStephan Mueller 	if (pr) {
179164d1cdfbSStephan Mueller 		drbg_string_fill(&testentropy, test->entprb, test->entprlen);
179264d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl_test(drng,
179364d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl, &test_data);
179464d1cdfbSStephan Mueller 	} else {
179564d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl(drng,
179664d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl);
179764d1cdfbSStephan Mueller 	}
179819e60e13SStephan Mueller 	if (ret < 0) {
179964d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not obtain random data for "
180064d1cdfbSStephan Mueller 		       "driver %s\n", driver);
180164d1cdfbSStephan Mueller 		goto outbuf;
180264d1cdfbSStephan Mueller 	}
180364d1cdfbSStephan Mueller 
180464d1cdfbSStephan Mueller 	ret = memcmp(test->expected, buf, test->expectedlen);
180564d1cdfbSStephan Mueller 
180664d1cdfbSStephan Mueller outbuf:
180764d1cdfbSStephan Mueller 	crypto_free_rng(drng);
180864d1cdfbSStephan Mueller 	kzfree(buf);
180964d1cdfbSStephan Mueller 	return ret;
181064d1cdfbSStephan Mueller }
181164d1cdfbSStephan Mueller 
181264d1cdfbSStephan Mueller 
181364d1cdfbSStephan Mueller static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver,
181464d1cdfbSStephan Mueller 			 u32 type, u32 mask)
181564d1cdfbSStephan Mueller {
181664d1cdfbSStephan Mueller 	int err = 0;
181764d1cdfbSStephan Mueller 	int pr = 0;
181864d1cdfbSStephan Mueller 	int i = 0;
181964d1cdfbSStephan Mueller 	struct drbg_testvec *template = desc->suite.drbg.vecs;
182064d1cdfbSStephan Mueller 	unsigned int tcount = desc->suite.drbg.count;
182164d1cdfbSStephan Mueller 
182264d1cdfbSStephan Mueller 	if (0 == memcmp(driver, "drbg_pr_", 8))
182364d1cdfbSStephan Mueller 		pr = 1;
182464d1cdfbSStephan Mueller 
182564d1cdfbSStephan Mueller 	for (i = 0; i < tcount; i++) {
182664d1cdfbSStephan Mueller 		err = drbg_cavs_test(&template[i], pr, driver, type, mask);
182764d1cdfbSStephan Mueller 		if (err) {
182864d1cdfbSStephan Mueller 			printk(KERN_ERR "alg: drbg: Test %d failed for %s\n",
182964d1cdfbSStephan Mueller 			       i, driver);
183064d1cdfbSStephan Mueller 			err = -EINVAL;
183164d1cdfbSStephan Mueller 			break;
183264d1cdfbSStephan Mueller 		}
183364d1cdfbSStephan Mueller 	}
183464d1cdfbSStephan Mueller 	return err;
183564d1cdfbSStephan Mueller 
183664d1cdfbSStephan Mueller }
183764d1cdfbSStephan Mueller 
1838946cc463STadeusz Struk static int do_test_rsa(struct crypto_akcipher *tfm,
1839946cc463STadeusz Struk 		       struct akcipher_testvec *vecs)
1840946cc463STadeusz Struk {
1841946cc463STadeusz Struk 	struct akcipher_request *req;
1842946cc463STadeusz Struk 	void *outbuf_enc = NULL;
1843946cc463STadeusz Struk 	void *outbuf_dec = NULL;
1844946cc463STadeusz Struk 	struct tcrypt_result result;
1845946cc463STadeusz Struk 	unsigned int out_len_max, out_len = 0;
1846946cc463STadeusz Struk 	int err = -ENOMEM;
1847946cc463STadeusz Struk 
1848946cc463STadeusz Struk 	req = akcipher_request_alloc(tfm, GFP_KERNEL);
1849946cc463STadeusz Struk 	if (!req)
1850946cc463STadeusz Struk 		return err;
1851946cc463STadeusz Struk 
1852946cc463STadeusz Struk 	init_completion(&result.completion);
1853946cc463STadeusz Struk 	err = crypto_akcipher_setkey(tfm, vecs->key, vecs->key_len);
1854946cc463STadeusz Struk 	if (err)
1855946cc463STadeusz Struk 		goto free_req;
1856946cc463STadeusz Struk 
1857946cc463STadeusz Struk 	akcipher_request_set_crypt(req, vecs->m, outbuf_enc, vecs->m_size,
1858946cc463STadeusz Struk 				   out_len);
1859946cc463STadeusz Struk 	/* expect this to fail, and update the required buf len */
1860946cc463STadeusz Struk 	crypto_akcipher_encrypt(req);
1861946cc463STadeusz Struk 	out_len = req->dst_len;
1862946cc463STadeusz Struk 	if (!out_len) {
1863946cc463STadeusz Struk 		err = -EINVAL;
1864946cc463STadeusz Struk 		goto free_req;
1865946cc463STadeusz Struk 	}
1866946cc463STadeusz Struk 
1867946cc463STadeusz Struk 	out_len_max = out_len;
1868946cc463STadeusz Struk 	err = -ENOMEM;
1869946cc463STadeusz Struk 	outbuf_enc = kzalloc(out_len_max, GFP_KERNEL);
1870946cc463STadeusz Struk 	if (!outbuf_enc)
1871946cc463STadeusz Struk 		goto free_req;
1872946cc463STadeusz Struk 
1873946cc463STadeusz Struk 	akcipher_request_set_crypt(req, vecs->m, outbuf_enc, vecs->m_size,
1874946cc463STadeusz Struk 				   out_len);
1875946cc463STadeusz Struk 	akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1876946cc463STadeusz Struk 				      tcrypt_complete, &result);
1877946cc463STadeusz Struk 
1878946cc463STadeusz Struk 	/* Run RSA encrypt - c = m^e mod n;*/
1879946cc463STadeusz Struk 	err = wait_async_op(&result, crypto_akcipher_encrypt(req));
1880946cc463STadeusz Struk 	if (err) {
1881946cc463STadeusz Struk 		pr_err("alg: rsa: encrypt test failed. err %d\n", err);
1882946cc463STadeusz Struk 		goto free_all;
1883946cc463STadeusz Struk 	}
1884946cc463STadeusz Struk 	if (out_len != vecs->c_size) {
1885946cc463STadeusz Struk 		pr_err("alg: rsa: encrypt test failed. Invalid output len\n");
1886946cc463STadeusz Struk 		err = -EINVAL;
1887946cc463STadeusz Struk 		goto free_all;
1888946cc463STadeusz Struk 	}
1889946cc463STadeusz Struk 	/* verify that encrypted message is equal to expected */
1890946cc463STadeusz Struk 	if (memcmp(vecs->c, outbuf_enc, vecs->c_size)) {
1891946cc463STadeusz Struk 		pr_err("alg: rsa: encrypt test failed. Invalid output\n");
1892946cc463STadeusz Struk 		err = -EINVAL;
1893946cc463STadeusz Struk 		goto free_all;
1894946cc463STadeusz Struk 	}
1895946cc463STadeusz Struk 	/* Don't invoke decrypt for vectors with public key */
1896946cc463STadeusz Struk 	if (vecs->public_key_vec) {
1897946cc463STadeusz Struk 		err = 0;
1898946cc463STadeusz Struk 		goto free_all;
1899946cc463STadeusz Struk 	}
1900946cc463STadeusz Struk 	outbuf_dec = kzalloc(out_len_max, GFP_KERNEL);
1901946cc463STadeusz Struk 	if (!outbuf_dec) {
1902946cc463STadeusz Struk 		err = -ENOMEM;
1903946cc463STadeusz Struk 		goto free_all;
1904946cc463STadeusz Struk 	}
1905946cc463STadeusz Struk 	init_completion(&result.completion);
1906946cc463STadeusz Struk 	akcipher_request_set_crypt(req, outbuf_enc, outbuf_dec, vecs->c_size,
1907946cc463STadeusz Struk 				   out_len);
1908946cc463STadeusz Struk 
1909946cc463STadeusz Struk 	/* Run RSA decrypt - m = c^d mod n;*/
1910946cc463STadeusz Struk 	err = wait_async_op(&result, crypto_akcipher_decrypt(req));
1911946cc463STadeusz Struk 	if (err) {
1912946cc463STadeusz Struk 		pr_err("alg: rsa: decrypt test failed. err %d\n", err);
1913946cc463STadeusz Struk 		goto free_all;
1914946cc463STadeusz Struk 	}
1915946cc463STadeusz Struk 	out_len = req->dst_len;
1916946cc463STadeusz Struk 	if (out_len != vecs->m_size) {
1917946cc463STadeusz Struk 		pr_err("alg: rsa: decrypt test failed. Invalid output len\n");
1918946cc463STadeusz Struk 		err = -EINVAL;
1919946cc463STadeusz Struk 		goto free_all;
1920946cc463STadeusz Struk 	}
1921946cc463STadeusz Struk 	/* verify that decrypted message is equal to the original msg */
1922946cc463STadeusz Struk 	if (memcmp(vecs->m, outbuf_dec, vecs->m_size)) {
1923946cc463STadeusz Struk 		pr_err("alg: rsa: decrypt test failed. Invalid output\n");
1924946cc463STadeusz Struk 		err = -EINVAL;
1925946cc463STadeusz Struk 	}
1926946cc463STadeusz Struk free_all:
1927946cc463STadeusz Struk 	kfree(outbuf_dec);
1928946cc463STadeusz Struk 	kfree(outbuf_enc);
1929946cc463STadeusz Struk free_req:
1930946cc463STadeusz Struk 	akcipher_request_free(req);
1931946cc463STadeusz Struk 	return err;
1932946cc463STadeusz Struk }
1933946cc463STadeusz Struk 
1934946cc463STadeusz Struk static int test_rsa(struct crypto_akcipher *tfm, struct akcipher_testvec *vecs,
1935946cc463STadeusz Struk 		    unsigned int tcount)
1936946cc463STadeusz Struk {
1937946cc463STadeusz Struk 	int ret, i;
1938946cc463STadeusz Struk 
1939946cc463STadeusz Struk 	for (i = 0; i < tcount; i++) {
1940946cc463STadeusz Struk 		ret = do_test_rsa(tfm, vecs++);
1941946cc463STadeusz Struk 		if (ret) {
1942946cc463STadeusz Struk 			pr_err("alg: rsa: test failed on vector %d, err=%d\n",
1943946cc463STadeusz Struk 			       i + 1, ret);
1944946cc463STadeusz Struk 			return ret;
1945946cc463STadeusz Struk 		}
1946946cc463STadeusz Struk 	}
1947946cc463STadeusz Struk 	return 0;
1948946cc463STadeusz Struk }
1949946cc463STadeusz Struk 
1950946cc463STadeusz Struk static int test_akcipher(struct crypto_akcipher *tfm, const char *alg,
1951946cc463STadeusz Struk 			 struct akcipher_testvec *vecs, unsigned int tcount)
1952946cc463STadeusz Struk {
1953946cc463STadeusz Struk 	if (strncmp(alg, "rsa", 3) == 0)
1954946cc463STadeusz Struk 		return test_rsa(tfm, vecs, tcount);
1955946cc463STadeusz Struk 
1956946cc463STadeusz Struk 	return 0;
1957946cc463STadeusz Struk }
1958946cc463STadeusz Struk 
1959946cc463STadeusz Struk static int alg_test_akcipher(const struct alg_test_desc *desc,
1960946cc463STadeusz Struk 			     const char *driver, u32 type, u32 mask)
1961946cc463STadeusz Struk {
1962946cc463STadeusz Struk 	struct crypto_akcipher *tfm;
1963946cc463STadeusz Struk 	int err = 0;
1964946cc463STadeusz Struk 
1965946cc463STadeusz Struk 	tfm = crypto_alloc_akcipher(driver, type | CRYPTO_ALG_INTERNAL, mask);
1966946cc463STadeusz Struk 	if (IS_ERR(tfm)) {
1967946cc463STadeusz Struk 		pr_err("alg: akcipher: Failed to load tfm for %s: %ld\n",
1968946cc463STadeusz Struk 		       driver, PTR_ERR(tfm));
1969946cc463STadeusz Struk 		return PTR_ERR(tfm);
1970946cc463STadeusz Struk 	}
1971946cc463STadeusz Struk 	if (desc->suite.akcipher.vecs)
1972946cc463STadeusz Struk 		err = test_akcipher(tfm, desc->alg, desc->suite.akcipher.vecs,
1973946cc463STadeusz Struk 				    desc->suite.akcipher.count);
1974946cc463STadeusz Struk 
1975946cc463STadeusz Struk 	crypto_free_akcipher(tfm);
1976946cc463STadeusz Struk 	return err;
1977946cc463STadeusz Struk }
1978946cc463STadeusz Struk 
1979863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc,
1980863b557aSYouquan, Song 			     const char *driver, u32 type, u32 mask)
1981863b557aSYouquan, Song {
1982863b557aSYouquan, Song 	return 0;
1983863b557aSYouquan, Song }
1984863b557aSYouquan, Song 
1985da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */
1986da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = {
1987da7f033dSHerbert Xu 	{
19884d6d6a2cSJohannes Goetzfried 		.alg = "__cbc-cast5-avx",
19894d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
19904d6d6a2cSJohannes Goetzfried 	}, {
19914ea1277dSJohannes Goetzfried 		.alg = "__cbc-cast6-avx",
19924ea1277dSJohannes Goetzfried 		.test = alg_test_null,
19934ea1277dSJohannes Goetzfried 	}, {
19947efe4076SJohannes Goetzfried 		.alg = "__cbc-serpent-avx",
19957efe4076SJohannes Goetzfried 		.test = alg_test_null,
19967efe4076SJohannes Goetzfried 	}, {
199756d76c96SJussi Kivilinna 		.alg = "__cbc-serpent-avx2",
199856d76c96SJussi Kivilinna 		.test = alg_test_null,
199956d76c96SJussi Kivilinna 	}, {
2000937c30d7SJussi Kivilinna 		.alg = "__cbc-serpent-sse2",
2001937c30d7SJussi Kivilinna 		.test = alg_test_null,
2002937c30d7SJussi Kivilinna 	}, {
2003107778b5SJohannes Goetzfried 		.alg = "__cbc-twofish-avx",
2004107778b5SJohannes Goetzfried 		.test = alg_test_null,
2005107778b5SJohannes Goetzfried 	}, {
2006863b557aSYouquan, Song 		.alg = "__driver-cbc-aes-aesni",
2007863b557aSYouquan, Song 		.test = alg_test_null,
20086c79294fSMilan Broz 		.fips_allowed = 1,
2009863b557aSYouquan, Song 	}, {
2010d9b1d2e7SJussi Kivilinna 		.alg = "__driver-cbc-camellia-aesni",
2011d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2012d9b1d2e7SJussi Kivilinna 	}, {
2013f3f935a7SJussi Kivilinna 		.alg = "__driver-cbc-camellia-aesni-avx2",
2014f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2015f3f935a7SJussi Kivilinna 	}, {
20164d6d6a2cSJohannes Goetzfried 		.alg = "__driver-cbc-cast5-avx",
20174d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
20184d6d6a2cSJohannes Goetzfried 	}, {
20194ea1277dSJohannes Goetzfried 		.alg = "__driver-cbc-cast6-avx",
20204ea1277dSJohannes Goetzfried 		.test = alg_test_null,
20214ea1277dSJohannes Goetzfried 	}, {
20227efe4076SJohannes Goetzfried 		.alg = "__driver-cbc-serpent-avx",
20237efe4076SJohannes Goetzfried 		.test = alg_test_null,
20247efe4076SJohannes Goetzfried 	}, {
202556d76c96SJussi Kivilinna 		.alg = "__driver-cbc-serpent-avx2",
202656d76c96SJussi Kivilinna 		.test = alg_test_null,
202756d76c96SJussi Kivilinna 	}, {
2028937c30d7SJussi Kivilinna 		.alg = "__driver-cbc-serpent-sse2",
2029937c30d7SJussi Kivilinna 		.test = alg_test_null,
2030937c30d7SJussi Kivilinna 	}, {
2031107778b5SJohannes Goetzfried 		.alg = "__driver-cbc-twofish-avx",
2032107778b5SJohannes Goetzfried 		.test = alg_test_null,
2033107778b5SJohannes Goetzfried 	}, {
2034863b557aSYouquan, Song 		.alg = "__driver-ecb-aes-aesni",
2035863b557aSYouquan, Song 		.test = alg_test_null,
20366c79294fSMilan Broz 		.fips_allowed = 1,
2037863b557aSYouquan, Song 	}, {
2038d9b1d2e7SJussi Kivilinna 		.alg = "__driver-ecb-camellia-aesni",
2039d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2040d9b1d2e7SJussi Kivilinna 	}, {
2041f3f935a7SJussi Kivilinna 		.alg = "__driver-ecb-camellia-aesni-avx2",
2042f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2043f3f935a7SJussi Kivilinna 	}, {
20444d6d6a2cSJohannes Goetzfried 		.alg = "__driver-ecb-cast5-avx",
20454d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
20464d6d6a2cSJohannes Goetzfried 	}, {
20474ea1277dSJohannes Goetzfried 		.alg = "__driver-ecb-cast6-avx",
20484ea1277dSJohannes Goetzfried 		.test = alg_test_null,
20494ea1277dSJohannes Goetzfried 	}, {
20507efe4076SJohannes Goetzfried 		.alg = "__driver-ecb-serpent-avx",
20517efe4076SJohannes Goetzfried 		.test = alg_test_null,
20527efe4076SJohannes Goetzfried 	}, {
205356d76c96SJussi Kivilinna 		.alg = "__driver-ecb-serpent-avx2",
205456d76c96SJussi Kivilinna 		.test = alg_test_null,
205556d76c96SJussi Kivilinna 	}, {
2056937c30d7SJussi Kivilinna 		.alg = "__driver-ecb-serpent-sse2",
2057937c30d7SJussi Kivilinna 		.test = alg_test_null,
2058937c30d7SJussi Kivilinna 	}, {
2059107778b5SJohannes Goetzfried 		.alg = "__driver-ecb-twofish-avx",
2060107778b5SJohannes Goetzfried 		.test = alg_test_null,
2061107778b5SJohannes Goetzfried 	}, {
20629d77b6c2STadeusz Struk 		.alg = "__driver-gcm-aes-aesni",
20639d77b6c2STadeusz Struk 		.test = alg_test_null,
20649d77b6c2STadeusz Struk 		.fips_allowed = 1,
20659d77b6c2STadeusz Struk 	}, {
2066863b557aSYouquan, Song 		.alg = "__ghash-pclmulqdqni",
2067863b557aSYouquan, Song 		.test = alg_test_null,
20686c79294fSMilan Broz 		.fips_allowed = 1,
2069863b557aSYouquan, Song 	}, {
2070e08ca2daSJarod Wilson 		.alg = "ansi_cprng",
2071e08ca2daSJarod Wilson 		.test = alg_test_cprng,
2072a1915d51SJarod Wilson 		.fips_allowed = 1,
2073e08ca2daSJarod Wilson 		.suite = {
2074e08ca2daSJarod Wilson 			.cprng = {
2075e08ca2daSJarod Wilson 				.vecs = ansi_cprng_aes_tv_template,
2076e08ca2daSJarod Wilson 				.count = ANSI_CPRNG_AES_TEST_VECTORS
2077e08ca2daSJarod Wilson 			}
2078e08ca2daSJarod Wilson 		}
2079e08ca2daSJarod Wilson 	}, {
2080bca4feb0SHoria Geanta 		.alg = "authenc(hmac(md5),ecb(cipher_null))",
2081bca4feb0SHoria Geanta 		.test = alg_test_aead,
2082bca4feb0SHoria Geanta 		.fips_allowed = 1,
2083bca4feb0SHoria Geanta 		.suite = {
2084bca4feb0SHoria Geanta 			.aead = {
2085bca4feb0SHoria Geanta 				.enc = {
2086bca4feb0SHoria Geanta 					.vecs = hmac_md5_ecb_cipher_null_enc_tv_template,
2087bca4feb0SHoria Geanta 					.count = HMAC_MD5_ECB_CIPHER_NULL_ENC_TEST_VECTORS
2088bca4feb0SHoria Geanta 				},
2089bca4feb0SHoria Geanta 				.dec = {
2090bca4feb0SHoria Geanta 					.vecs = hmac_md5_ecb_cipher_null_dec_tv_template,
2091bca4feb0SHoria Geanta 					.count = HMAC_MD5_ECB_CIPHER_NULL_DEC_TEST_VECTORS
2092bca4feb0SHoria Geanta 				}
2093bca4feb0SHoria Geanta 			}
2094bca4feb0SHoria Geanta 		}
2095bca4feb0SHoria Geanta 	}, {
2096a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha1),cbc(aes))",
2097e46e9a46SHoria Geanta 		.test = alg_test_aead,
2098e46e9a46SHoria Geanta 		.fips_allowed = 1,
2099e46e9a46SHoria Geanta 		.suite = {
2100e46e9a46SHoria Geanta 			.aead = {
2101e46e9a46SHoria Geanta 				.enc = {
21025208ed2cSNitesh Lal 					.vecs =
21035208ed2cSNitesh Lal 					hmac_sha1_aes_cbc_enc_tv_temp,
21045208ed2cSNitesh Lal 					.count =
21055208ed2cSNitesh Lal 					HMAC_SHA1_AES_CBC_ENC_TEST_VEC
21065208ed2cSNitesh Lal 				}
21075208ed2cSNitesh Lal 			}
21085208ed2cSNitesh Lal 		}
21095208ed2cSNitesh Lal 	}, {
2110a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha1),cbc(des))",
21115208ed2cSNitesh Lal 		.test = alg_test_aead,
21125208ed2cSNitesh Lal 		.fips_allowed = 1,
21135208ed2cSNitesh Lal 		.suite = {
21145208ed2cSNitesh Lal 			.aead = {
21155208ed2cSNitesh Lal 				.enc = {
21165208ed2cSNitesh Lal 					.vecs =
21175208ed2cSNitesh Lal 					hmac_sha1_des_cbc_enc_tv_temp,
21185208ed2cSNitesh Lal 					.count =
21195208ed2cSNitesh Lal 					HMAC_SHA1_DES_CBC_ENC_TEST_VEC
21205208ed2cSNitesh Lal 				}
21215208ed2cSNitesh Lal 			}
21225208ed2cSNitesh Lal 		}
21235208ed2cSNitesh Lal 	}, {
2124a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha1),cbc(des3_ede))",
21255208ed2cSNitesh Lal 		.test = alg_test_aead,
21265208ed2cSNitesh Lal 		.fips_allowed = 1,
21275208ed2cSNitesh Lal 		.suite = {
21285208ed2cSNitesh Lal 			.aead = {
21295208ed2cSNitesh Lal 				.enc = {
21305208ed2cSNitesh Lal 					.vecs =
21315208ed2cSNitesh Lal 					hmac_sha1_des3_ede_cbc_enc_tv_temp,
21325208ed2cSNitesh Lal 					.count =
21335208ed2cSNitesh Lal 					HMAC_SHA1_DES3_EDE_CBC_ENC_TEST_VEC
2134e46e9a46SHoria Geanta 				}
2135e46e9a46SHoria Geanta 			}
2136e46e9a46SHoria Geanta 		}
2137e46e9a46SHoria Geanta 	}, {
2138bca4feb0SHoria Geanta 		.alg = "authenc(hmac(sha1),ecb(cipher_null))",
2139bca4feb0SHoria Geanta 		.test = alg_test_aead,
2140bca4feb0SHoria Geanta 		.fips_allowed = 1,
2141bca4feb0SHoria Geanta 		.suite = {
2142bca4feb0SHoria Geanta 			.aead = {
2143bca4feb0SHoria Geanta 				.enc = {
21445208ed2cSNitesh Lal 					.vecs =
21455208ed2cSNitesh Lal 					hmac_sha1_ecb_cipher_null_enc_tv_temp,
21465208ed2cSNitesh Lal 					.count =
21475208ed2cSNitesh Lal 					HMAC_SHA1_ECB_CIPHER_NULL_ENC_TEST_VEC
2148bca4feb0SHoria Geanta 				},
2149bca4feb0SHoria Geanta 				.dec = {
21505208ed2cSNitesh Lal 					.vecs =
21515208ed2cSNitesh Lal 					hmac_sha1_ecb_cipher_null_dec_tv_temp,
21525208ed2cSNitesh Lal 					.count =
21535208ed2cSNitesh Lal 					HMAC_SHA1_ECB_CIPHER_NULL_DEC_TEST_VEC
21545208ed2cSNitesh Lal 				}
21555208ed2cSNitesh Lal 			}
21565208ed2cSNitesh Lal 		}
21575208ed2cSNitesh Lal 	}, {
2158a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha224),cbc(des))",
21595208ed2cSNitesh Lal 		.test = alg_test_aead,
21605208ed2cSNitesh Lal 		.fips_allowed = 1,
21615208ed2cSNitesh Lal 		.suite = {
21625208ed2cSNitesh Lal 			.aead = {
21635208ed2cSNitesh Lal 				.enc = {
21645208ed2cSNitesh Lal 					.vecs =
21655208ed2cSNitesh Lal 					hmac_sha224_des_cbc_enc_tv_temp,
21665208ed2cSNitesh Lal 					.count =
21675208ed2cSNitesh Lal 					HMAC_SHA224_DES_CBC_ENC_TEST_VEC
21685208ed2cSNitesh Lal 				}
21695208ed2cSNitesh Lal 			}
21705208ed2cSNitesh Lal 		}
21715208ed2cSNitesh Lal 	}, {
2172a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha224),cbc(des3_ede))",
21735208ed2cSNitesh Lal 		.test = alg_test_aead,
21745208ed2cSNitesh Lal 		.fips_allowed = 1,
21755208ed2cSNitesh Lal 		.suite = {
21765208ed2cSNitesh Lal 			.aead = {
21775208ed2cSNitesh Lal 				.enc = {
21785208ed2cSNitesh Lal 					.vecs =
21795208ed2cSNitesh Lal 					hmac_sha224_des3_ede_cbc_enc_tv_temp,
21805208ed2cSNitesh Lal 					.count =
21815208ed2cSNitesh Lal 					HMAC_SHA224_DES3_EDE_CBC_ENC_TEST_VEC
2182bca4feb0SHoria Geanta 				}
2183bca4feb0SHoria Geanta 			}
2184bca4feb0SHoria Geanta 		}
2185bca4feb0SHoria Geanta 	}, {
2186a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha256),cbc(aes))",
2187e46e9a46SHoria Geanta 		.test = alg_test_aead,
2188e46e9a46SHoria Geanta 		.fips_allowed = 1,
2189e46e9a46SHoria Geanta 		.suite = {
2190e46e9a46SHoria Geanta 			.aead = {
2191e46e9a46SHoria Geanta 				.enc = {
21925208ed2cSNitesh Lal 					.vecs =
21935208ed2cSNitesh Lal 					hmac_sha256_aes_cbc_enc_tv_temp,
21945208ed2cSNitesh Lal 					.count =
21955208ed2cSNitesh Lal 					HMAC_SHA256_AES_CBC_ENC_TEST_VEC
21965208ed2cSNitesh Lal 				}
21975208ed2cSNitesh Lal 			}
21985208ed2cSNitesh Lal 		}
21995208ed2cSNitesh Lal 	}, {
2200a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha256),cbc(des))",
22015208ed2cSNitesh Lal 		.test = alg_test_aead,
22025208ed2cSNitesh Lal 		.fips_allowed = 1,
22035208ed2cSNitesh Lal 		.suite = {
22045208ed2cSNitesh Lal 			.aead = {
22055208ed2cSNitesh Lal 				.enc = {
22065208ed2cSNitesh Lal 					.vecs =
22075208ed2cSNitesh Lal 					hmac_sha256_des_cbc_enc_tv_temp,
22085208ed2cSNitesh Lal 					.count =
22095208ed2cSNitesh Lal 					HMAC_SHA256_DES_CBC_ENC_TEST_VEC
22105208ed2cSNitesh Lal 				}
22115208ed2cSNitesh Lal 			}
22125208ed2cSNitesh Lal 		}
22135208ed2cSNitesh Lal 	}, {
2214a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha256),cbc(des3_ede))",
22155208ed2cSNitesh Lal 		.test = alg_test_aead,
22165208ed2cSNitesh Lal 		.fips_allowed = 1,
22175208ed2cSNitesh Lal 		.suite = {
22185208ed2cSNitesh Lal 			.aead = {
22195208ed2cSNitesh Lal 				.enc = {
22205208ed2cSNitesh Lal 					.vecs =
22215208ed2cSNitesh Lal 					hmac_sha256_des3_ede_cbc_enc_tv_temp,
22225208ed2cSNitesh Lal 					.count =
22235208ed2cSNitesh Lal 					HMAC_SHA256_DES3_EDE_CBC_ENC_TEST_VEC
22245208ed2cSNitesh Lal 				}
22255208ed2cSNitesh Lal 			}
22265208ed2cSNitesh Lal 		}
22275208ed2cSNitesh Lal 	}, {
2228a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha384),cbc(des))",
22295208ed2cSNitesh Lal 		.test = alg_test_aead,
22305208ed2cSNitesh Lal 		.fips_allowed = 1,
22315208ed2cSNitesh Lal 		.suite = {
22325208ed2cSNitesh Lal 			.aead = {
22335208ed2cSNitesh Lal 				.enc = {
22345208ed2cSNitesh Lal 					.vecs =
22355208ed2cSNitesh Lal 					hmac_sha384_des_cbc_enc_tv_temp,
22365208ed2cSNitesh Lal 					.count =
22375208ed2cSNitesh Lal 					HMAC_SHA384_DES_CBC_ENC_TEST_VEC
22385208ed2cSNitesh Lal 				}
22395208ed2cSNitesh Lal 			}
22405208ed2cSNitesh Lal 		}
22415208ed2cSNitesh Lal 	}, {
2242a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha384),cbc(des3_ede))",
22435208ed2cSNitesh Lal 		.test = alg_test_aead,
22445208ed2cSNitesh Lal 		.fips_allowed = 1,
22455208ed2cSNitesh Lal 		.suite = {
22465208ed2cSNitesh Lal 			.aead = {
22475208ed2cSNitesh Lal 				.enc = {
22485208ed2cSNitesh Lal 					.vecs =
22495208ed2cSNitesh Lal 					hmac_sha384_des3_ede_cbc_enc_tv_temp,
22505208ed2cSNitesh Lal 					.count =
22515208ed2cSNitesh Lal 					HMAC_SHA384_DES3_EDE_CBC_ENC_TEST_VEC
2252e46e9a46SHoria Geanta 				}
2253e46e9a46SHoria Geanta 			}
2254e46e9a46SHoria Geanta 		}
2255e46e9a46SHoria Geanta 	}, {
2256a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha512),cbc(aes))",
2257e46e9a46SHoria Geanta 		.test = alg_test_aead,
2258e46e9a46SHoria Geanta 		.fips_allowed = 1,
2259e46e9a46SHoria Geanta 		.suite = {
2260e46e9a46SHoria Geanta 			.aead = {
2261e46e9a46SHoria Geanta 				.enc = {
22625208ed2cSNitesh Lal 					.vecs =
22635208ed2cSNitesh Lal 					hmac_sha512_aes_cbc_enc_tv_temp,
22645208ed2cSNitesh Lal 					.count =
22655208ed2cSNitesh Lal 					HMAC_SHA512_AES_CBC_ENC_TEST_VEC
22665208ed2cSNitesh Lal 				}
22675208ed2cSNitesh Lal 			}
22685208ed2cSNitesh Lal 		}
22695208ed2cSNitesh Lal 	}, {
2270a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha512),cbc(des))",
22715208ed2cSNitesh Lal 		.test = alg_test_aead,
22725208ed2cSNitesh Lal 		.fips_allowed = 1,
22735208ed2cSNitesh Lal 		.suite = {
22745208ed2cSNitesh Lal 			.aead = {
22755208ed2cSNitesh Lal 				.enc = {
22765208ed2cSNitesh Lal 					.vecs =
22775208ed2cSNitesh Lal 					hmac_sha512_des_cbc_enc_tv_temp,
22785208ed2cSNitesh Lal 					.count =
22795208ed2cSNitesh Lal 					HMAC_SHA512_DES_CBC_ENC_TEST_VEC
22805208ed2cSNitesh Lal 				}
22815208ed2cSNitesh Lal 			}
22825208ed2cSNitesh Lal 		}
22835208ed2cSNitesh Lal 	}, {
2284a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha512),cbc(des3_ede))",
22855208ed2cSNitesh Lal 		.test = alg_test_aead,
22865208ed2cSNitesh Lal 		.fips_allowed = 1,
22875208ed2cSNitesh Lal 		.suite = {
22885208ed2cSNitesh Lal 			.aead = {
22895208ed2cSNitesh Lal 				.enc = {
22905208ed2cSNitesh Lal 					.vecs =
22915208ed2cSNitesh Lal 					hmac_sha512_des3_ede_cbc_enc_tv_temp,
22925208ed2cSNitesh Lal 					.count =
22935208ed2cSNitesh Lal 					HMAC_SHA512_DES3_EDE_CBC_ENC_TEST_VEC
2294e46e9a46SHoria Geanta 				}
2295e46e9a46SHoria Geanta 			}
2296e46e9a46SHoria Geanta 		}
2297e46e9a46SHoria Geanta 	}, {
2298da7f033dSHerbert Xu 		.alg = "cbc(aes)",
22991aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2300a1915d51SJarod Wilson 		.fips_allowed = 1,
2301da7f033dSHerbert Xu 		.suite = {
2302da7f033dSHerbert Xu 			.cipher = {
2303da7f033dSHerbert Xu 				.enc = {
2304da7f033dSHerbert Xu 					.vecs = aes_cbc_enc_tv_template,
2305da7f033dSHerbert Xu 					.count = AES_CBC_ENC_TEST_VECTORS
2306da7f033dSHerbert Xu 				},
2307da7f033dSHerbert Xu 				.dec = {
2308da7f033dSHerbert Xu 					.vecs = aes_cbc_dec_tv_template,
2309da7f033dSHerbert Xu 					.count = AES_CBC_DEC_TEST_VECTORS
2310da7f033dSHerbert Xu 				}
2311da7f033dSHerbert Xu 			}
2312da7f033dSHerbert Xu 		}
2313da7f033dSHerbert Xu 	}, {
2314da7f033dSHerbert Xu 		.alg = "cbc(anubis)",
23151aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2316da7f033dSHerbert Xu 		.suite = {
2317da7f033dSHerbert Xu 			.cipher = {
2318da7f033dSHerbert Xu 				.enc = {
2319da7f033dSHerbert Xu 					.vecs = anubis_cbc_enc_tv_template,
2320da7f033dSHerbert Xu 					.count = ANUBIS_CBC_ENC_TEST_VECTORS
2321da7f033dSHerbert Xu 				},
2322da7f033dSHerbert Xu 				.dec = {
2323da7f033dSHerbert Xu 					.vecs = anubis_cbc_dec_tv_template,
2324da7f033dSHerbert Xu 					.count = ANUBIS_CBC_DEC_TEST_VECTORS
2325da7f033dSHerbert Xu 				}
2326da7f033dSHerbert Xu 			}
2327da7f033dSHerbert Xu 		}
2328da7f033dSHerbert Xu 	}, {
2329da7f033dSHerbert Xu 		.alg = "cbc(blowfish)",
23301aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2331da7f033dSHerbert Xu 		.suite = {
2332da7f033dSHerbert Xu 			.cipher = {
2333da7f033dSHerbert Xu 				.enc = {
2334da7f033dSHerbert Xu 					.vecs = bf_cbc_enc_tv_template,
2335da7f033dSHerbert Xu 					.count = BF_CBC_ENC_TEST_VECTORS
2336da7f033dSHerbert Xu 				},
2337da7f033dSHerbert Xu 				.dec = {
2338da7f033dSHerbert Xu 					.vecs = bf_cbc_dec_tv_template,
2339da7f033dSHerbert Xu 					.count = BF_CBC_DEC_TEST_VECTORS
2340da7f033dSHerbert Xu 				}
2341da7f033dSHerbert Xu 			}
2342da7f033dSHerbert Xu 		}
2343da7f033dSHerbert Xu 	}, {
2344da7f033dSHerbert Xu 		.alg = "cbc(camellia)",
23451aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2346da7f033dSHerbert Xu 		.suite = {
2347da7f033dSHerbert Xu 			.cipher = {
2348da7f033dSHerbert Xu 				.enc = {
2349da7f033dSHerbert Xu 					.vecs = camellia_cbc_enc_tv_template,
2350da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_ENC_TEST_VECTORS
2351da7f033dSHerbert Xu 				},
2352da7f033dSHerbert Xu 				.dec = {
2353da7f033dSHerbert Xu 					.vecs = camellia_cbc_dec_tv_template,
2354da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_DEC_TEST_VECTORS
2355da7f033dSHerbert Xu 				}
2356da7f033dSHerbert Xu 			}
2357da7f033dSHerbert Xu 		}
2358da7f033dSHerbert Xu 	}, {
2359a2c58260SJohannes Goetzfried 		.alg = "cbc(cast5)",
2360a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2361a2c58260SJohannes Goetzfried 		.suite = {
2362a2c58260SJohannes Goetzfried 			.cipher = {
2363a2c58260SJohannes Goetzfried 				.enc = {
2364a2c58260SJohannes Goetzfried 					.vecs = cast5_cbc_enc_tv_template,
2365a2c58260SJohannes Goetzfried 					.count = CAST5_CBC_ENC_TEST_VECTORS
2366a2c58260SJohannes Goetzfried 				},
2367a2c58260SJohannes Goetzfried 				.dec = {
2368a2c58260SJohannes Goetzfried 					.vecs = cast5_cbc_dec_tv_template,
2369a2c58260SJohannes Goetzfried 					.count = CAST5_CBC_DEC_TEST_VECTORS
2370a2c58260SJohannes Goetzfried 				}
2371a2c58260SJohannes Goetzfried 			}
2372a2c58260SJohannes Goetzfried 		}
2373a2c58260SJohannes Goetzfried 	}, {
23749b8b0405SJohannes Goetzfried 		.alg = "cbc(cast6)",
23759b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
23769b8b0405SJohannes Goetzfried 		.suite = {
23779b8b0405SJohannes Goetzfried 			.cipher = {
23789b8b0405SJohannes Goetzfried 				.enc = {
23799b8b0405SJohannes Goetzfried 					.vecs = cast6_cbc_enc_tv_template,
23809b8b0405SJohannes Goetzfried 					.count = CAST6_CBC_ENC_TEST_VECTORS
23819b8b0405SJohannes Goetzfried 				},
23829b8b0405SJohannes Goetzfried 				.dec = {
23839b8b0405SJohannes Goetzfried 					.vecs = cast6_cbc_dec_tv_template,
23849b8b0405SJohannes Goetzfried 					.count = CAST6_CBC_DEC_TEST_VECTORS
23859b8b0405SJohannes Goetzfried 				}
23869b8b0405SJohannes Goetzfried 			}
23879b8b0405SJohannes Goetzfried 		}
23889b8b0405SJohannes Goetzfried 	}, {
2389da7f033dSHerbert Xu 		.alg = "cbc(des)",
23901aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2391da7f033dSHerbert Xu 		.suite = {
2392da7f033dSHerbert Xu 			.cipher = {
2393da7f033dSHerbert Xu 				.enc = {
2394da7f033dSHerbert Xu 					.vecs = des_cbc_enc_tv_template,
2395da7f033dSHerbert Xu 					.count = DES_CBC_ENC_TEST_VECTORS
2396da7f033dSHerbert Xu 				},
2397da7f033dSHerbert Xu 				.dec = {
2398da7f033dSHerbert Xu 					.vecs = des_cbc_dec_tv_template,
2399da7f033dSHerbert Xu 					.count = DES_CBC_DEC_TEST_VECTORS
2400da7f033dSHerbert Xu 				}
2401da7f033dSHerbert Xu 			}
2402da7f033dSHerbert Xu 		}
2403da7f033dSHerbert Xu 	}, {
2404da7f033dSHerbert Xu 		.alg = "cbc(des3_ede)",
24051aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2406a1915d51SJarod Wilson 		.fips_allowed = 1,
2407da7f033dSHerbert Xu 		.suite = {
2408da7f033dSHerbert Xu 			.cipher = {
2409da7f033dSHerbert Xu 				.enc = {
2410da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_enc_tv_template,
2411da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_ENC_TEST_VECTORS
2412da7f033dSHerbert Xu 				},
2413da7f033dSHerbert Xu 				.dec = {
2414da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_dec_tv_template,
2415da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_DEC_TEST_VECTORS
2416da7f033dSHerbert Xu 				}
2417da7f033dSHerbert Xu 			}
2418da7f033dSHerbert Xu 		}
2419da7f033dSHerbert Xu 	}, {
24209d25917dSJussi Kivilinna 		.alg = "cbc(serpent)",
24219d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
24229d25917dSJussi Kivilinna 		.suite = {
24239d25917dSJussi Kivilinna 			.cipher = {
24249d25917dSJussi Kivilinna 				.enc = {
24259d25917dSJussi Kivilinna 					.vecs = serpent_cbc_enc_tv_template,
24269d25917dSJussi Kivilinna 					.count = SERPENT_CBC_ENC_TEST_VECTORS
24279d25917dSJussi Kivilinna 				},
24289d25917dSJussi Kivilinna 				.dec = {
24299d25917dSJussi Kivilinna 					.vecs = serpent_cbc_dec_tv_template,
24309d25917dSJussi Kivilinna 					.count = SERPENT_CBC_DEC_TEST_VECTORS
24319d25917dSJussi Kivilinna 				}
24329d25917dSJussi Kivilinna 			}
24339d25917dSJussi Kivilinna 		}
24349d25917dSJussi Kivilinna 	}, {
2435da7f033dSHerbert Xu 		.alg = "cbc(twofish)",
24361aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2437da7f033dSHerbert Xu 		.suite = {
2438da7f033dSHerbert Xu 			.cipher = {
2439da7f033dSHerbert Xu 				.enc = {
2440da7f033dSHerbert Xu 					.vecs = tf_cbc_enc_tv_template,
2441da7f033dSHerbert Xu 					.count = TF_CBC_ENC_TEST_VECTORS
2442da7f033dSHerbert Xu 				},
2443da7f033dSHerbert Xu 				.dec = {
2444da7f033dSHerbert Xu 					.vecs = tf_cbc_dec_tv_template,
2445da7f033dSHerbert Xu 					.count = TF_CBC_DEC_TEST_VECTORS
2446da7f033dSHerbert Xu 				}
2447da7f033dSHerbert Xu 			}
2448da7f033dSHerbert Xu 		}
2449da7f033dSHerbert Xu 	}, {
2450da7f033dSHerbert Xu 		.alg = "ccm(aes)",
2451da7f033dSHerbert Xu 		.test = alg_test_aead,
2452a1915d51SJarod Wilson 		.fips_allowed = 1,
2453da7f033dSHerbert Xu 		.suite = {
2454da7f033dSHerbert Xu 			.aead = {
2455da7f033dSHerbert Xu 				.enc = {
2456da7f033dSHerbert Xu 					.vecs = aes_ccm_enc_tv_template,
2457da7f033dSHerbert Xu 					.count = AES_CCM_ENC_TEST_VECTORS
2458da7f033dSHerbert Xu 				},
2459da7f033dSHerbert Xu 				.dec = {
2460da7f033dSHerbert Xu 					.vecs = aes_ccm_dec_tv_template,
2461da7f033dSHerbert Xu 					.count = AES_CCM_DEC_TEST_VECTORS
2462da7f033dSHerbert Xu 				}
2463da7f033dSHerbert Xu 			}
2464da7f033dSHerbert Xu 		}
2465da7f033dSHerbert Xu 	}, {
24663590ebf2SMartin Willi 		.alg = "chacha20",
24673590ebf2SMartin Willi 		.test = alg_test_skcipher,
24683590ebf2SMartin Willi 		.suite = {
24693590ebf2SMartin Willi 			.cipher = {
24703590ebf2SMartin Willi 				.enc = {
24713590ebf2SMartin Willi 					.vecs = chacha20_enc_tv_template,
24723590ebf2SMartin Willi 					.count = CHACHA20_ENC_TEST_VECTORS
24733590ebf2SMartin Willi 				},
24743590ebf2SMartin Willi 				.dec = {
24753590ebf2SMartin Willi 					.vecs = chacha20_enc_tv_template,
24763590ebf2SMartin Willi 					.count = CHACHA20_ENC_TEST_VECTORS
24773590ebf2SMartin Willi 				},
24783590ebf2SMartin Willi 			}
24793590ebf2SMartin Willi 		}
24803590ebf2SMartin Willi 	}, {
248193b5e86aSJussi Kivilinna 		.alg = "cmac(aes)",
24828f183751SStephan Mueller 		.fips_allowed = 1,
248393b5e86aSJussi Kivilinna 		.test = alg_test_hash,
248493b5e86aSJussi Kivilinna 		.suite = {
248593b5e86aSJussi Kivilinna 			.hash = {
248693b5e86aSJussi Kivilinna 				.vecs = aes_cmac128_tv_template,
248793b5e86aSJussi Kivilinna 				.count = CMAC_AES_TEST_VECTORS
248893b5e86aSJussi Kivilinna 			}
248993b5e86aSJussi Kivilinna 		}
249093b5e86aSJussi Kivilinna 	}, {
249193b5e86aSJussi Kivilinna 		.alg = "cmac(des3_ede)",
24928f183751SStephan Mueller 		.fips_allowed = 1,
249393b5e86aSJussi Kivilinna 		.test = alg_test_hash,
249493b5e86aSJussi Kivilinna 		.suite = {
249593b5e86aSJussi Kivilinna 			.hash = {
249693b5e86aSJussi Kivilinna 				.vecs = des3_ede_cmac64_tv_template,
249793b5e86aSJussi Kivilinna 				.count = CMAC_DES3_EDE_TEST_VECTORS
249893b5e86aSJussi Kivilinna 			}
249993b5e86aSJussi Kivilinna 		}
250093b5e86aSJussi Kivilinna 	}, {
2501e448370dSJussi Kivilinna 		.alg = "compress_null",
2502e448370dSJussi Kivilinna 		.test = alg_test_null,
2503e448370dSJussi Kivilinna 	}, {
2504ebb3472fSArd Biesheuvel 		.alg = "crc32",
2505ebb3472fSArd Biesheuvel 		.test = alg_test_hash,
2506ebb3472fSArd Biesheuvel 		.suite = {
2507ebb3472fSArd Biesheuvel 			.hash = {
2508ebb3472fSArd Biesheuvel 				.vecs = crc32_tv_template,
2509ebb3472fSArd Biesheuvel 				.count = CRC32_TEST_VECTORS
2510ebb3472fSArd Biesheuvel 			}
2511ebb3472fSArd Biesheuvel 		}
2512ebb3472fSArd Biesheuvel 	}, {
2513da7f033dSHerbert Xu 		.alg = "crc32c",
25148e3ee85eSHerbert Xu 		.test = alg_test_crc32c,
2515a1915d51SJarod Wilson 		.fips_allowed = 1,
2516da7f033dSHerbert Xu 		.suite = {
2517da7f033dSHerbert Xu 			.hash = {
2518da7f033dSHerbert Xu 				.vecs = crc32c_tv_template,
2519da7f033dSHerbert Xu 				.count = CRC32C_TEST_VECTORS
2520da7f033dSHerbert Xu 			}
2521da7f033dSHerbert Xu 		}
2522da7f033dSHerbert Xu 	}, {
252368411521SHerbert Xu 		.alg = "crct10dif",
252468411521SHerbert Xu 		.test = alg_test_hash,
252568411521SHerbert Xu 		.fips_allowed = 1,
252668411521SHerbert Xu 		.suite = {
252768411521SHerbert Xu 			.hash = {
252868411521SHerbert Xu 				.vecs = crct10dif_tv_template,
252968411521SHerbert Xu 				.count = CRCT10DIF_TEST_VECTORS
253068411521SHerbert Xu 			}
253168411521SHerbert Xu 		}
253268411521SHerbert Xu 	}, {
25336c79294fSMilan Broz 		.alg = "cryptd(__driver-cbc-aes-aesni)",
25346c79294fSMilan Broz 		.test = alg_test_null,
25356c79294fSMilan Broz 		.fips_allowed = 1,
25366c79294fSMilan Broz 	}, {
2537d9b1d2e7SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-camellia-aesni)",
2538d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2539d9b1d2e7SJussi Kivilinna 	}, {
2540f3f935a7SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-camellia-aesni-avx2)",
2541f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2542f3f935a7SJussi Kivilinna 	}, {
254356d76c96SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-serpent-avx2)",
254456d76c96SJussi Kivilinna 		.test = alg_test_null,
254556d76c96SJussi Kivilinna 	}, {
2546863b557aSYouquan, Song 		.alg = "cryptd(__driver-ecb-aes-aesni)",
2547863b557aSYouquan, Song 		.test = alg_test_null,
25486c79294fSMilan Broz 		.fips_allowed = 1,
2549863b557aSYouquan, Song 	}, {
2550d9b1d2e7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-camellia-aesni)",
2551d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2552d9b1d2e7SJussi Kivilinna 	}, {
2553f3f935a7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-camellia-aesni-avx2)",
2554f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2555f3f935a7SJussi Kivilinna 	}, {
25564d6d6a2cSJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-cast5-avx)",
25574d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
25584d6d6a2cSJohannes Goetzfried 	}, {
25594ea1277dSJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-cast6-avx)",
25604ea1277dSJohannes Goetzfried 		.test = alg_test_null,
25614ea1277dSJohannes Goetzfried 	}, {
25627efe4076SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-serpent-avx)",
25637efe4076SJohannes Goetzfried 		.test = alg_test_null,
25647efe4076SJohannes Goetzfried 	}, {
256556d76c96SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-serpent-avx2)",
256656d76c96SJussi Kivilinna 		.test = alg_test_null,
256756d76c96SJussi Kivilinna 	}, {
2568937c30d7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-serpent-sse2)",
2569937c30d7SJussi Kivilinna 		.test = alg_test_null,
2570937c30d7SJussi Kivilinna 	}, {
2571107778b5SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-twofish-avx)",
2572107778b5SJohannes Goetzfried 		.test = alg_test_null,
2573107778b5SJohannes Goetzfried 	}, {
25746c79294fSMilan Broz 		.alg = "cryptd(__driver-gcm-aes-aesni)",
25756c79294fSMilan Broz 		.test = alg_test_null,
25766c79294fSMilan Broz 		.fips_allowed = 1,
25776c79294fSMilan Broz 	}, {
2578863b557aSYouquan, Song 		.alg = "cryptd(__ghash-pclmulqdqni)",
2579863b557aSYouquan, Song 		.test = alg_test_null,
25806c79294fSMilan Broz 		.fips_allowed = 1,
2581863b557aSYouquan, Song 	}, {
2582f7cb80f2SJarod Wilson 		.alg = "ctr(aes)",
2583f7cb80f2SJarod Wilson 		.test = alg_test_skcipher,
2584a1915d51SJarod Wilson 		.fips_allowed = 1,
2585f7cb80f2SJarod Wilson 		.suite = {
2586f7cb80f2SJarod Wilson 			.cipher = {
2587f7cb80f2SJarod Wilson 				.enc = {
2588f7cb80f2SJarod Wilson 					.vecs = aes_ctr_enc_tv_template,
2589f7cb80f2SJarod Wilson 					.count = AES_CTR_ENC_TEST_VECTORS
2590f7cb80f2SJarod Wilson 				},
2591f7cb80f2SJarod Wilson 				.dec = {
2592f7cb80f2SJarod Wilson 					.vecs = aes_ctr_dec_tv_template,
2593f7cb80f2SJarod Wilson 					.count = AES_CTR_DEC_TEST_VECTORS
2594f7cb80f2SJarod Wilson 				}
2595f7cb80f2SJarod Wilson 			}
2596f7cb80f2SJarod Wilson 		}
2597f7cb80f2SJarod Wilson 	}, {
259885b63e34SJussi Kivilinna 		.alg = "ctr(blowfish)",
259985b63e34SJussi Kivilinna 		.test = alg_test_skcipher,
260085b63e34SJussi Kivilinna 		.suite = {
260185b63e34SJussi Kivilinna 			.cipher = {
260285b63e34SJussi Kivilinna 				.enc = {
260385b63e34SJussi Kivilinna 					.vecs = bf_ctr_enc_tv_template,
260485b63e34SJussi Kivilinna 					.count = BF_CTR_ENC_TEST_VECTORS
260585b63e34SJussi Kivilinna 				},
260685b63e34SJussi Kivilinna 				.dec = {
260785b63e34SJussi Kivilinna 					.vecs = bf_ctr_dec_tv_template,
260885b63e34SJussi Kivilinna 					.count = BF_CTR_DEC_TEST_VECTORS
260985b63e34SJussi Kivilinna 				}
261085b63e34SJussi Kivilinna 			}
261185b63e34SJussi Kivilinna 		}
261285b63e34SJussi Kivilinna 	}, {
26130840605eSJussi Kivilinna 		.alg = "ctr(camellia)",
26140840605eSJussi Kivilinna 		.test = alg_test_skcipher,
26150840605eSJussi Kivilinna 		.suite = {
26160840605eSJussi Kivilinna 			.cipher = {
26170840605eSJussi Kivilinna 				.enc = {
26180840605eSJussi Kivilinna 					.vecs = camellia_ctr_enc_tv_template,
26190840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_ENC_TEST_VECTORS
26200840605eSJussi Kivilinna 				},
26210840605eSJussi Kivilinna 				.dec = {
26220840605eSJussi Kivilinna 					.vecs = camellia_ctr_dec_tv_template,
26230840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_DEC_TEST_VECTORS
26240840605eSJussi Kivilinna 				}
26250840605eSJussi Kivilinna 			}
26260840605eSJussi Kivilinna 		}
26270840605eSJussi Kivilinna 	}, {
2628a2c58260SJohannes Goetzfried 		.alg = "ctr(cast5)",
2629a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2630a2c58260SJohannes Goetzfried 		.suite = {
2631a2c58260SJohannes Goetzfried 			.cipher = {
2632a2c58260SJohannes Goetzfried 				.enc = {
2633a2c58260SJohannes Goetzfried 					.vecs = cast5_ctr_enc_tv_template,
2634a2c58260SJohannes Goetzfried 					.count = CAST5_CTR_ENC_TEST_VECTORS
2635a2c58260SJohannes Goetzfried 				},
2636a2c58260SJohannes Goetzfried 				.dec = {
2637a2c58260SJohannes Goetzfried 					.vecs = cast5_ctr_dec_tv_template,
2638a2c58260SJohannes Goetzfried 					.count = CAST5_CTR_DEC_TEST_VECTORS
2639a2c58260SJohannes Goetzfried 				}
2640a2c58260SJohannes Goetzfried 			}
2641a2c58260SJohannes Goetzfried 		}
2642a2c58260SJohannes Goetzfried 	}, {
26439b8b0405SJohannes Goetzfried 		.alg = "ctr(cast6)",
26449b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
26459b8b0405SJohannes Goetzfried 		.suite = {
26469b8b0405SJohannes Goetzfried 			.cipher = {
26479b8b0405SJohannes Goetzfried 				.enc = {
26489b8b0405SJohannes Goetzfried 					.vecs = cast6_ctr_enc_tv_template,
26499b8b0405SJohannes Goetzfried 					.count = CAST6_CTR_ENC_TEST_VECTORS
26509b8b0405SJohannes Goetzfried 				},
26519b8b0405SJohannes Goetzfried 				.dec = {
26529b8b0405SJohannes Goetzfried 					.vecs = cast6_ctr_dec_tv_template,
26539b8b0405SJohannes Goetzfried 					.count = CAST6_CTR_DEC_TEST_VECTORS
26549b8b0405SJohannes Goetzfried 				}
26559b8b0405SJohannes Goetzfried 			}
26569b8b0405SJohannes Goetzfried 		}
26579b8b0405SJohannes Goetzfried 	}, {
26588163fc30SJussi Kivilinna 		.alg = "ctr(des)",
26598163fc30SJussi Kivilinna 		.test = alg_test_skcipher,
26608163fc30SJussi Kivilinna 		.suite = {
26618163fc30SJussi Kivilinna 			.cipher = {
26628163fc30SJussi Kivilinna 				.enc = {
26638163fc30SJussi Kivilinna 					.vecs = des_ctr_enc_tv_template,
26648163fc30SJussi Kivilinna 					.count = DES_CTR_ENC_TEST_VECTORS
26658163fc30SJussi Kivilinna 				},
26668163fc30SJussi Kivilinna 				.dec = {
26678163fc30SJussi Kivilinna 					.vecs = des_ctr_dec_tv_template,
26688163fc30SJussi Kivilinna 					.count = DES_CTR_DEC_TEST_VECTORS
26698163fc30SJussi Kivilinna 				}
26708163fc30SJussi Kivilinna 			}
26718163fc30SJussi Kivilinna 		}
26728163fc30SJussi Kivilinna 	}, {
2673e080b17aSJussi Kivilinna 		.alg = "ctr(des3_ede)",
2674e080b17aSJussi Kivilinna 		.test = alg_test_skcipher,
2675e080b17aSJussi Kivilinna 		.suite = {
2676e080b17aSJussi Kivilinna 			.cipher = {
2677e080b17aSJussi Kivilinna 				.enc = {
2678e080b17aSJussi Kivilinna 					.vecs = des3_ede_ctr_enc_tv_template,
2679e080b17aSJussi Kivilinna 					.count = DES3_EDE_CTR_ENC_TEST_VECTORS
2680e080b17aSJussi Kivilinna 				},
2681e080b17aSJussi Kivilinna 				.dec = {
2682e080b17aSJussi Kivilinna 					.vecs = des3_ede_ctr_dec_tv_template,
2683e080b17aSJussi Kivilinna 					.count = DES3_EDE_CTR_DEC_TEST_VECTORS
2684e080b17aSJussi Kivilinna 				}
2685e080b17aSJussi Kivilinna 			}
2686e080b17aSJussi Kivilinna 		}
2687e080b17aSJussi Kivilinna 	}, {
26889d25917dSJussi Kivilinna 		.alg = "ctr(serpent)",
26899d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
26909d25917dSJussi Kivilinna 		.suite = {
26919d25917dSJussi Kivilinna 			.cipher = {
26929d25917dSJussi Kivilinna 				.enc = {
26939d25917dSJussi Kivilinna 					.vecs = serpent_ctr_enc_tv_template,
26949d25917dSJussi Kivilinna 					.count = SERPENT_CTR_ENC_TEST_VECTORS
26959d25917dSJussi Kivilinna 				},
26969d25917dSJussi Kivilinna 				.dec = {
26979d25917dSJussi Kivilinna 					.vecs = serpent_ctr_dec_tv_template,
26989d25917dSJussi Kivilinna 					.count = SERPENT_CTR_DEC_TEST_VECTORS
26999d25917dSJussi Kivilinna 				}
27009d25917dSJussi Kivilinna 			}
27019d25917dSJussi Kivilinna 		}
27029d25917dSJussi Kivilinna 	}, {
2703573da620SJussi Kivilinna 		.alg = "ctr(twofish)",
2704573da620SJussi Kivilinna 		.test = alg_test_skcipher,
2705573da620SJussi Kivilinna 		.suite = {
2706573da620SJussi Kivilinna 			.cipher = {
2707573da620SJussi Kivilinna 				.enc = {
2708573da620SJussi Kivilinna 					.vecs = tf_ctr_enc_tv_template,
2709573da620SJussi Kivilinna 					.count = TF_CTR_ENC_TEST_VECTORS
2710573da620SJussi Kivilinna 				},
2711573da620SJussi Kivilinna 				.dec = {
2712573da620SJussi Kivilinna 					.vecs = tf_ctr_dec_tv_template,
2713573da620SJussi Kivilinna 					.count = TF_CTR_DEC_TEST_VECTORS
2714573da620SJussi Kivilinna 				}
2715573da620SJussi Kivilinna 			}
2716573da620SJussi Kivilinna 		}
2717573da620SJussi Kivilinna 	}, {
2718da7f033dSHerbert Xu 		.alg = "cts(cbc(aes))",
27191aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2720da7f033dSHerbert Xu 		.suite = {
2721da7f033dSHerbert Xu 			.cipher = {
2722da7f033dSHerbert Xu 				.enc = {
2723da7f033dSHerbert Xu 					.vecs = cts_mode_enc_tv_template,
2724da7f033dSHerbert Xu 					.count = CTS_MODE_ENC_TEST_VECTORS
2725da7f033dSHerbert Xu 				},
2726da7f033dSHerbert Xu 				.dec = {
2727da7f033dSHerbert Xu 					.vecs = cts_mode_dec_tv_template,
2728da7f033dSHerbert Xu 					.count = CTS_MODE_DEC_TEST_VECTORS
2729da7f033dSHerbert Xu 				}
2730da7f033dSHerbert Xu 			}
2731da7f033dSHerbert Xu 		}
2732da7f033dSHerbert Xu 	}, {
2733da7f033dSHerbert Xu 		.alg = "deflate",
2734da7f033dSHerbert Xu 		.test = alg_test_comp,
27350818904dSMilan Broz 		.fips_allowed = 1,
2736da7f033dSHerbert Xu 		.suite = {
2737da7f033dSHerbert Xu 			.comp = {
2738da7f033dSHerbert Xu 				.comp = {
2739da7f033dSHerbert Xu 					.vecs = deflate_comp_tv_template,
2740da7f033dSHerbert Xu 					.count = DEFLATE_COMP_TEST_VECTORS
2741da7f033dSHerbert Xu 				},
2742da7f033dSHerbert Xu 				.decomp = {
2743da7f033dSHerbert Xu 					.vecs = deflate_decomp_tv_template,
2744da7f033dSHerbert Xu 					.count = DEFLATE_DECOMP_TEST_VECTORS
2745da7f033dSHerbert Xu 				}
2746da7f033dSHerbert Xu 			}
2747da7f033dSHerbert Xu 		}
2748da7f033dSHerbert Xu 	}, {
2749e448370dSJussi Kivilinna 		.alg = "digest_null",
2750e448370dSJussi Kivilinna 		.test = alg_test_null,
2751e448370dSJussi Kivilinna 	}, {
275264d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes128",
275364d1cdfbSStephan Mueller 		.test = alg_test_drbg,
275464d1cdfbSStephan Mueller 		.fips_allowed = 1,
275564d1cdfbSStephan Mueller 		.suite = {
275664d1cdfbSStephan Mueller 			.drbg = {
275764d1cdfbSStephan Mueller 				.vecs = drbg_nopr_ctr_aes128_tv_template,
275864d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes128_tv_template)
275964d1cdfbSStephan Mueller 			}
276064d1cdfbSStephan Mueller 		}
276164d1cdfbSStephan Mueller 	}, {
276264d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes192",
276364d1cdfbSStephan Mueller 		.test = alg_test_drbg,
276464d1cdfbSStephan Mueller 		.fips_allowed = 1,
276564d1cdfbSStephan Mueller 		.suite = {
276664d1cdfbSStephan Mueller 			.drbg = {
276764d1cdfbSStephan Mueller 				.vecs = drbg_nopr_ctr_aes192_tv_template,
276864d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes192_tv_template)
276964d1cdfbSStephan Mueller 			}
277064d1cdfbSStephan Mueller 		}
277164d1cdfbSStephan Mueller 	}, {
277264d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes256",
277364d1cdfbSStephan Mueller 		.test = alg_test_drbg,
277464d1cdfbSStephan Mueller 		.fips_allowed = 1,
277564d1cdfbSStephan Mueller 		.suite = {
277664d1cdfbSStephan Mueller 			.drbg = {
277764d1cdfbSStephan Mueller 				.vecs = drbg_nopr_ctr_aes256_tv_template,
277864d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes256_tv_template)
277964d1cdfbSStephan Mueller 			}
278064d1cdfbSStephan Mueller 		}
278164d1cdfbSStephan Mueller 	}, {
278264d1cdfbSStephan Mueller 		/*
278364d1cdfbSStephan Mueller 		 * There is no need to specifically test the DRBG with every
278464d1cdfbSStephan Mueller 		 * backend cipher -- covered by drbg_nopr_hmac_sha256 test
278564d1cdfbSStephan Mueller 		 */
278664d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha1",
278764d1cdfbSStephan Mueller 		.fips_allowed = 1,
278864d1cdfbSStephan Mueller 		.test = alg_test_null,
278964d1cdfbSStephan Mueller 	}, {
279064d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha256",
279164d1cdfbSStephan Mueller 		.test = alg_test_drbg,
279264d1cdfbSStephan Mueller 		.fips_allowed = 1,
279364d1cdfbSStephan Mueller 		.suite = {
279464d1cdfbSStephan Mueller 			.drbg = {
279564d1cdfbSStephan Mueller 				.vecs = drbg_nopr_hmac_sha256_tv_template,
279664d1cdfbSStephan Mueller 				.count =
279764d1cdfbSStephan Mueller 				ARRAY_SIZE(drbg_nopr_hmac_sha256_tv_template)
279864d1cdfbSStephan Mueller 			}
279964d1cdfbSStephan Mueller 		}
280064d1cdfbSStephan Mueller 	}, {
280164d1cdfbSStephan Mueller 		/* covered by drbg_nopr_hmac_sha256 test */
280264d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha384",
280364d1cdfbSStephan Mueller 		.fips_allowed = 1,
280464d1cdfbSStephan Mueller 		.test = alg_test_null,
280564d1cdfbSStephan Mueller 	}, {
280664d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha512",
280764d1cdfbSStephan Mueller 		.test = alg_test_null,
280864d1cdfbSStephan Mueller 		.fips_allowed = 1,
280964d1cdfbSStephan Mueller 	}, {
281064d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha1",
281164d1cdfbSStephan Mueller 		.fips_allowed = 1,
281264d1cdfbSStephan Mueller 		.test = alg_test_null,
281364d1cdfbSStephan Mueller 	}, {
281464d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha256",
281564d1cdfbSStephan Mueller 		.test = alg_test_drbg,
281664d1cdfbSStephan Mueller 		.fips_allowed = 1,
281764d1cdfbSStephan Mueller 		.suite = {
281864d1cdfbSStephan Mueller 			.drbg = {
281964d1cdfbSStephan Mueller 				.vecs = drbg_nopr_sha256_tv_template,
282064d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_sha256_tv_template)
282164d1cdfbSStephan Mueller 			}
282264d1cdfbSStephan Mueller 		}
282364d1cdfbSStephan Mueller 	}, {
282464d1cdfbSStephan Mueller 		/* covered by drbg_nopr_sha256 test */
282564d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha384",
282664d1cdfbSStephan Mueller 		.fips_allowed = 1,
282764d1cdfbSStephan Mueller 		.test = alg_test_null,
282864d1cdfbSStephan Mueller 	}, {
282964d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha512",
283064d1cdfbSStephan Mueller 		.fips_allowed = 1,
283164d1cdfbSStephan Mueller 		.test = alg_test_null,
283264d1cdfbSStephan Mueller 	}, {
283364d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes128",
283464d1cdfbSStephan Mueller 		.test = alg_test_drbg,
283564d1cdfbSStephan Mueller 		.fips_allowed = 1,
283664d1cdfbSStephan Mueller 		.suite = {
283764d1cdfbSStephan Mueller 			.drbg = {
283864d1cdfbSStephan Mueller 				.vecs = drbg_pr_ctr_aes128_tv_template,
283964d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_pr_ctr_aes128_tv_template)
284064d1cdfbSStephan Mueller 			}
284164d1cdfbSStephan Mueller 		}
284264d1cdfbSStephan Mueller 	}, {
284364d1cdfbSStephan Mueller 		/* covered by drbg_pr_ctr_aes128 test */
284464d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes192",
284564d1cdfbSStephan Mueller 		.fips_allowed = 1,
284664d1cdfbSStephan Mueller 		.test = alg_test_null,
284764d1cdfbSStephan Mueller 	}, {
284864d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes256",
284964d1cdfbSStephan Mueller 		.fips_allowed = 1,
285064d1cdfbSStephan Mueller 		.test = alg_test_null,
285164d1cdfbSStephan Mueller 	}, {
285264d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha1",
285364d1cdfbSStephan Mueller 		.fips_allowed = 1,
285464d1cdfbSStephan Mueller 		.test = alg_test_null,
285564d1cdfbSStephan Mueller 	}, {
285664d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha256",
285764d1cdfbSStephan Mueller 		.test = alg_test_drbg,
285864d1cdfbSStephan Mueller 		.fips_allowed = 1,
285964d1cdfbSStephan Mueller 		.suite = {
286064d1cdfbSStephan Mueller 			.drbg = {
286164d1cdfbSStephan Mueller 				.vecs = drbg_pr_hmac_sha256_tv_template,
286264d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_pr_hmac_sha256_tv_template)
286364d1cdfbSStephan Mueller 			}
286464d1cdfbSStephan Mueller 		}
286564d1cdfbSStephan Mueller 	}, {
286664d1cdfbSStephan Mueller 		/* covered by drbg_pr_hmac_sha256 test */
286764d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha384",
286864d1cdfbSStephan Mueller 		.fips_allowed = 1,
286964d1cdfbSStephan Mueller 		.test = alg_test_null,
287064d1cdfbSStephan Mueller 	}, {
287164d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha512",
287264d1cdfbSStephan Mueller 		.test = alg_test_null,
287364d1cdfbSStephan Mueller 		.fips_allowed = 1,
287464d1cdfbSStephan Mueller 	}, {
287564d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha1",
287664d1cdfbSStephan Mueller 		.fips_allowed = 1,
287764d1cdfbSStephan Mueller 		.test = alg_test_null,
287864d1cdfbSStephan Mueller 	}, {
287964d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha256",
288064d1cdfbSStephan Mueller 		.test = alg_test_drbg,
288164d1cdfbSStephan Mueller 		.fips_allowed = 1,
288264d1cdfbSStephan Mueller 		.suite = {
288364d1cdfbSStephan Mueller 			.drbg = {
288464d1cdfbSStephan Mueller 				.vecs = drbg_pr_sha256_tv_template,
288564d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_pr_sha256_tv_template)
288664d1cdfbSStephan Mueller 			}
288764d1cdfbSStephan Mueller 		}
288864d1cdfbSStephan Mueller 	}, {
288964d1cdfbSStephan Mueller 		/* covered by drbg_pr_sha256 test */
289064d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha384",
289164d1cdfbSStephan Mueller 		.fips_allowed = 1,
289264d1cdfbSStephan Mueller 		.test = alg_test_null,
289364d1cdfbSStephan Mueller 	}, {
289464d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha512",
289564d1cdfbSStephan Mueller 		.fips_allowed = 1,
289664d1cdfbSStephan Mueller 		.test = alg_test_null,
289764d1cdfbSStephan Mueller 	}, {
2898863b557aSYouquan, Song 		.alg = "ecb(__aes-aesni)",
2899863b557aSYouquan, Song 		.test = alg_test_null,
29006c79294fSMilan Broz 		.fips_allowed = 1,
2901863b557aSYouquan, Song 	}, {
2902da7f033dSHerbert Xu 		.alg = "ecb(aes)",
29031aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2904a1915d51SJarod Wilson 		.fips_allowed = 1,
2905da7f033dSHerbert Xu 		.suite = {
2906da7f033dSHerbert Xu 			.cipher = {
2907da7f033dSHerbert Xu 				.enc = {
2908da7f033dSHerbert Xu 					.vecs = aes_enc_tv_template,
2909da7f033dSHerbert Xu 					.count = AES_ENC_TEST_VECTORS
2910da7f033dSHerbert Xu 				},
2911da7f033dSHerbert Xu 				.dec = {
2912da7f033dSHerbert Xu 					.vecs = aes_dec_tv_template,
2913da7f033dSHerbert Xu 					.count = AES_DEC_TEST_VECTORS
2914da7f033dSHerbert Xu 				}
2915da7f033dSHerbert Xu 			}
2916da7f033dSHerbert Xu 		}
2917da7f033dSHerbert Xu 	}, {
2918da7f033dSHerbert Xu 		.alg = "ecb(anubis)",
29191aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2920da7f033dSHerbert Xu 		.suite = {
2921da7f033dSHerbert Xu 			.cipher = {
2922da7f033dSHerbert Xu 				.enc = {
2923da7f033dSHerbert Xu 					.vecs = anubis_enc_tv_template,
2924da7f033dSHerbert Xu 					.count = ANUBIS_ENC_TEST_VECTORS
2925da7f033dSHerbert Xu 				},
2926da7f033dSHerbert Xu 				.dec = {
2927da7f033dSHerbert Xu 					.vecs = anubis_dec_tv_template,
2928da7f033dSHerbert Xu 					.count = ANUBIS_DEC_TEST_VECTORS
2929da7f033dSHerbert Xu 				}
2930da7f033dSHerbert Xu 			}
2931da7f033dSHerbert Xu 		}
2932da7f033dSHerbert Xu 	}, {
2933da7f033dSHerbert Xu 		.alg = "ecb(arc4)",
29341aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2935da7f033dSHerbert Xu 		.suite = {
2936da7f033dSHerbert Xu 			.cipher = {
2937da7f033dSHerbert Xu 				.enc = {
2938da7f033dSHerbert Xu 					.vecs = arc4_enc_tv_template,
2939da7f033dSHerbert Xu 					.count = ARC4_ENC_TEST_VECTORS
2940da7f033dSHerbert Xu 				},
2941da7f033dSHerbert Xu 				.dec = {
2942da7f033dSHerbert Xu 					.vecs = arc4_dec_tv_template,
2943da7f033dSHerbert Xu 					.count = ARC4_DEC_TEST_VECTORS
2944da7f033dSHerbert Xu 				}
2945da7f033dSHerbert Xu 			}
2946da7f033dSHerbert Xu 		}
2947da7f033dSHerbert Xu 	}, {
2948da7f033dSHerbert Xu 		.alg = "ecb(blowfish)",
29491aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2950da7f033dSHerbert Xu 		.suite = {
2951da7f033dSHerbert Xu 			.cipher = {
2952da7f033dSHerbert Xu 				.enc = {
2953da7f033dSHerbert Xu 					.vecs = bf_enc_tv_template,
2954da7f033dSHerbert Xu 					.count = BF_ENC_TEST_VECTORS
2955da7f033dSHerbert Xu 				},
2956da7f033dSHerbert Xu 				.dec = {
2957da7f033dSHerbert Xu 					.vecs = bf_dec_tv_template,
2958da7f033dSHerbert Xu 					.count = BF_DEC_TEST_VECTORS
2959da7f033dSHerbert Xu 				}
2960da7f033dSHerbert Xu 			}
2961da7f033dSHerbert Xu 		}
2962da7f033dSHerbert Xu 	}, {
2963da7f033dSHerbert Xu 		.alg = "ecb(camellia)",
29641aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2965da7f033dSHerbert Xu 		.suite = {
2966da7f033dSHerbert Xu 			.cipher = {
2967da7f033dSHerbert Xu 				.enc = {
2968da7f033dSHerbert Xu 					.vecs = camellia_enc_tv_template,
2969da7f033dSHerbert Xu 					.count = CAMELLIA_ENC_TEST_VECTORS
2970da7f033dSHerbert Xu 				},
2971da7f033dSHerbert Xu 				.dec = {
2972da7f033dSHerbert Xu 					.vecs = camellia_dec_tv_template,
2973da7f033dSHerbert Xu 					.count = CAMELLIA_DEC_TEST_VECTORS
2974da7f033dSHerbert Xu 				}
2975da7f033dSHerbert Xu 			}
2976da7f033dSHerbert Xu 		}
2977da7f033dSHerbert Xu 	}, {
2978da7f033dSHerbert Xu 		.alg = "ecb(cast5)",
29791aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2980da7f033dSHerbert Xu 		.suite = {
2981da7f033dSHerbert Xu 			.cipher = {
2982da7f033dSHerbert Xu 				.enc = {
2983da7f033dSHerbert Xu 					.vecs = cast5_enc_tv_template,
2984da7f033dSHerbert Xu 					.count = CAST5_ENC_TEST_VECTORS
2985da7f033dSHerbert Xu 				},
2986da7f033dSHerbert Xu 				.dec = {
2987da7f033dSHerbert Xu 					.vecs = cast5_dec_tv_template,
2988da7f033dSHerbert Xu 					.count = CAST5_DEC_TEST_VECTORS
2989da7f033dSHerbert Xu 				}
2990da7f033dSHerbert Xu 			}
2991da7f033dSHerbert Xu 		}
2992da7f033dSHerbert Xu 	}, {
2993da7f033dSHerbert Xu 		.alg = "ecb(cast6)",
29941aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2995da7f033dSHerbert Xu 		.suite = {
2996da7f033dSHerbert Xu 			.cipher = {
2997da7f033dSHerbert Xu 				.enc = {
2998da7f033dSHerbert Xu 					.vecs = cast6_enc_tv_template,
2999da7f033dSHerbert Xu 					.count = CAST6_ENC_TEST_VECTORS
3000da7f033dSHerbert Xu 				},
3001da7f033dSHerbert Xu 				.dec = {
3002da7f033dSHerbert Xu 					.vecs = cast6_dec_tv_template,
3003da7f033dSHerbert Xu 					.count = CAST6_DEC_TEST_VECTORS
3004da7f033dSHerbert Xu 				}
3005da7f033dSHerbert Xu 			}
3006da7f033dSHerbert Xu 		}
3007da7f033dSHerbert Xu 	}, {
3008e448370dSJussi Kivilinna 		.alg = "ecb(cipher_null)",
3009e448370dSJussi Kivilinna 		.test = alg_test_null,
3010e448370dSJussi Kivilinna 	}, {
3011da7f033dSHerbert Xu 		.alg = "ecb(des)",
30121aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3013a1915d51SJarod Wilson 		.fips_allowed = 1,
3014da7f033dSHerbert Xu 		.suite = {
3015da7f033dSHerbert Xu 			.cipher = {
3016da7f033dSHerbert Xu 				.enc = {
3017da7f033dSHerbert Xu 					.vecs = des_enc_tv_template,
3018da7f033dSHerbert Xu 					.count = DES_ENC_TEST_VECTORS
3019da7f033dSHerbert Xu 				},
3020da7f033dSHerbert Xu 				.dec = {
3021da7f033dSHerbert Xu 					.vecs = des_dec_tv_template,
3022da7f033dSHerbert Xu 					.count = DES_DEC_TEST_VECTORS
3023da7f033dSHerbert Xu 				}
3024da7f033dSHerbert Xu 			}
3025da7f033dSHerbert Xu 		}
3026da7f033dSHerbert Xu 	}, {
3027da7f033dSHerbert Xu 		.alg = "ecb(des3_ede)",
30281aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3029a1915d51SJarod Wilson 		.fips_allowed = 1,
3030da7f033dSHerbert Xu 		.suite = {
3031da7f033dSHerbert Xu 			.cipher = {
3032da7f033dSHerbert Xu 				.enc = {
3033da7f033dSHerbert Xu 					.vecs = des3_ede_enc_tv_template,
3034da7f033dSHerbert Xu 					.count = DES3_EDE_ENC_TEST_VECTORS
3035da7f033dSHerbert Xu 				},
3036da7f033dSHerbert Xu 				.dec = {
3037da7f033dSHerbert Xu 					.vecs = des3_ede_dec_tv_template,
3038da7f033dSHerbert Xu 					.count = DES3_EDE_DEC_TEST_VECTORS
3039da7f033dSHerbert Xu 				}
3040da7f033dSHerbert Xu 			}
3041da7f033dSHerbert Xu 		}
3042da7f033dSHerbert Xu 	}, {
304366e5bd00SJussi Kivilinna 		.alg = "ecb(fcrypt)",
304466e5bd00SJussi Kivilinna 		.test = alg_test_skcipher,
304566e5bd00SJussi Kivilinna 		.suite = {
304666e5bd00SJussi Kivilinna 			.cipher = {
304766e5bd00SJussi Kivilinna 				.enc = {
304866e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_enc_tv_template,
304966e5bd00SJussi Kivilinna 					.count = 1
305066e5bd00SJussi Kivilinna 				},
305166e5bd00SJussi Kivilinna 				.dec = {
305266e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_dec_tv_template,
305366e5bd00SJussi Kivilinna 					.count = 1
305466e5bd00SJussi Kivilinna 				}
305566e5bd00SJussi Kivilinna 			}
305666e5bd00SJussi Kivilinna 		}
305766e5bd00SJussi Kivilinna 	}, {
3058da7f033dSHerbert Xu 		.alg = "ecb(khazad)",
30591aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3060da7f033dSHerbert Xu 		.suite = {
3061da7f033dSHerbert Xu 			.cipher = {
3062da7f033dSHerbert Xu 				.enc = {
3063da7f033dSHerbert Xu 					.vecs = khazad_enc_tv_template,
3064da7f033dSHerbert Xu 					.count = KHAZAD_ENC_TEST_VECTORS
3065da7f033dSHerbert Xu 				},
3066da7f033dSHerbert Xu 				.dec = {
3067da7f033dSHerbert Xu 					.vecs = khazad_dec_tv_template,
3068da7f033dSHerbert Xu 					.count = KHAZAD_DEC_TEST_VECTORS
3069da7f033dSHerbert Xu 				}
3070da7f033dSHerbert Xu 			}
3071da7f033dSHerbert Xu 		}
3072da7f033dSHerbert Xu 	}, {
3073da7f033dSHerbert Xu 		.alg = "ecb(seed)",
30741aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3075da7f033dSHerbert Xu 		.suite = {
3076da7f033dSHerbert Xu 			.cipher = {
3077da7f033dSHerbert Xu 				.enc = {
3078da7f033dSHerbert Xu 					.vecs = seed_enc_tv_template,
3079da7f033dSHerbert Xu 					.count = SEED_ENC_TEST_VECTORS
3080da7f033dSHerbert Xu 				},
3081da7f033dSHerbert Xu 				.dec = {
3082da7f033dSHerbert Xu 					.vecs = seed_dec_tv_template,
3083da7f033dSHerbert Xu 					.count = SEED_DEC_TEST_VECTORS
3084da7f033dSHerbert Xu 				}
3085da7f033dSHerbert Xu 			}
3086da7f033dSHerbert Xu 		}
3087da7f033dSHerbert Xu 	}, {
3088da7f033dSHerbert Xu 		.alg = "ecb(serpent)",
30891aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3090da7f033dSHerbert Xu 		.suite = {
3091da7f033dSHerbert Xu 			.cipher = {
3092da7f033dSHerbert Xu 				.enc = {
3093da7f033dSHerbert Xu 					.vecs = serpent_enc_tv_template,
3094da7f033dSHerbert Xu 					.count = SERPENT_ENC_TEST_VECTORS
3095da7f033dSHerbert Xu 				},
3096da7f033dSHerbert Xu 				.dec = {
3097da7f033dSHerbert Xu 					.vecs = serpent_dec_tv_template,
3098da7f033dSHerbert Xu 					.count = SERPENT_DEC_TEST_VECTORS
3099da7f033dSHerbert Xu 				}
3100da7f033dSHerbert Xu 			}
3101da7f033dSHerbert Xu 		}
3102da7f033dSHerbert Xu 	}, {
3103da7f033dSHerbert Xu 		.alg = "ecb(tea)",
31041aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3105da7f033dSHerbert Xu 		.suite = {
3106da7f033dSHerbert Xu 			.cipher = {
3107da7f033dSHerbert Xu 				.enc = {
3108da7f033dSHerbert Xu 					.vecs = tea_enc_tv_template,
3109da7f033dSHerbert Xu 					.count = TEA_ENC_TEST_VECTORS
3110da7f033dSHerbert Xu 				},
3111da7f033dSHerbert Xu 				.dec = {
3112da7f033dSHerbert Xu 					.vecs = tea_dec_tv_template,
3113da7f033dSHerbert Xu 					.count = TEA_DEC_TEST_VECTORS
3114da7f033dSHerbert Xu 				}
3115da7f033dSHerbert Xu 			}
3116da7f033dSHerbert Xu 		}
3117da7f033dSHerbert Xu 	}, {
3118da7f033dSHerbert Xu 		.alg = "ecb(tnepres)",
31191aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3120da7f033dSHerbert Xu 		.suite = {
3121da7f033dSHerbert Xu 			.cipher = {
3122da7f033dSHerbert Xu 				.enc = {
3123da7f033dSHerbert Xu 					.vecs = tnepres_enc_tv_template,
3124da7f033dSHerbert Xu 					.count = TNEPRES_ENC_TEST_VECTORS
3125da7f033dSHerbert Xu 				},
3126da7f033dSHerbert Xu 				.dec = {
3127da7f033dSHerbert Xu 					.vecs = tnepres_dec_tv_template,
3128da7f033dSHerbert Xu 					.count = TNEPRES_DEC_TEST_VECTORS
3129da7f033dSHerbert Xu 				}
3130da7f033dSHerbert Xu 			}
3131da7f033dSHerbert Xu 		}
3132da7f033dSHerbert Xu 	}, {
3133da7f033dSHerbert Xu 		.alg = "ecb(twofish)",
31341aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3135da7f033dSHerbert Xu 		.suite = {
3136da7f033dSHerbert Xu 			.cipher = {
3137da7f033dSHerbert Xu 				.enc = {
3138da7f033dSHerbert Xu 					.vecs = tf_enc_tv_template,
3139da7f033dSHerbert Xu 					.count = TF_ENC_TEST_VECTORS
3140da7f033dSHerbert Xu 				},
3141da7f033dSHerbert Xu 				.dec = {
3142da7f033dSHerbert Xu 					.vecs = tf_dec_tv_template,
3143da7f033dSHerbert Xu 					.count = TF_DEC_TEST_VECTORS
3144da7f033dSHerbert Xu 				}
3145da7f033dSHerbert Xu 			}
3146da7f033dSHerbert Xu 		}
3147da7f033dSHerbert Xu 	}, {
3148da7f033dSHerbert Xu 		.alg = "ecb(xeta)",
31491aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3150da7f033dSHerbert Xu 		.suite = {
3151da7f033dSHerbert Xu 			.cipher = {
3152da7f033dSHerbert Xu 				.enc = {
3153da7f033dSHerbert Xu 					.vecs = xeta_enc_tv_template,
3154da7f033dSHerbert Xu 					.count = XETA_ENC_TEST_VECTORS
3155da7f033dSHerbert Xu 				},
3156da7f033dSHerbert Xu 				.dec = {
3157da7f033dSHerbert Xu 					.vecs = xeta_dec_tv_template,
3158da7f033dSHerbert Xu 					.count = XETA_DEC_TEST_VECTORS
3159da7f033dSHerbert Xu 				}
3160da7f033dSHerbert Xu 			}
3161da7f033dSHerbert Xu 		}
3162da7f033dSHerbert Xu 	}, {
3163da7f033dSHerbert Xu 		.alg = "ecb(xtea)",
31641aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3165da7f033dSHerbert Xu 		.suite = {
3166da7f033dSHerbert Xu 			.cipher = {
3167da7f033dSHerbert Xu 				.enc = {
3168da7f033dSHerbert Xu 					.vecs = xtea_enc_tv_template,
3169da7f033dSHerbert Xu 					.count = XTEA_ENC_TEST_VECTORS
3170da7f033dSHerbert Xu 				},
3171da7f033dSHerbert Xu 				.dec = {
3172da7f033dSHerbert Xu 					.vecs = xtea_dec_tv_template,
3173da7f033dSHerbert Xu 					.count = XTEA_DEC_TEST_VECTORS
3174da7f033dSHerbert Xu 				}
3175da7f033dSHerbert Xu 			}
3176da7f033dSHerbert Xu 		}
3177da7f033dSHerbert Xu 	}, {
3178da7f033dSHerbert Xu 		.alg = "gcm(aes)",
3179da7f033dSHerbert Xu 		.test = alg_test_aead,
3180a1915d51SJarod Wilson 		.fips_allowed = 1,
3181da7f033dSHerbert Xu 		.suite = {
3182da7f033dSHerbert Xu 			.aead = {
3183da7f033dSHerbert Xu 				.enc = {
3184da7f033dSHerbert Xu 					.vecs = aes_gcm_enc_tv_template,
3185da7f033dSHerbert Xu 					.count = AES_GCM_ENC_TEST_VECTORS
3186da7f033dSHerbert Xu 				},
3187da7f033dSHerbert Xu 				.dec = {
3188da7f033dSHerbert Xu 					.vecs = aes_gcm_dec_tv_template,
3189da7f033dSHerbert Xu 					.count = AES_GCM_DEC_TEST_VECTORS
3190da7f033dSHerbert Xu 				}
3191da7f033dSHerbert Xu 			}
3192da7f033dSHerbert Xu 		}
3193da7f033dSHerbert Xu 	}, {
3194507069c9SYouquan, Song 		.alg = "ghash",
3195507069c9SYouquan, Song 		.test = alg_test_hash,
319618c0ebd2SJarod Wilson 		.fips_allowed = 1,
3197507069c9SYouquan, Song 		.suite = {
3198507069c9SYouquan, Song 			.hash = {
3199507069c9SYouquan, Song 				.vecs = ghash_tv_template,
3200507069c9SYouquan, Song 				.count = GHASH_TEST_VECTORS
3201507069c9SYouquan, Song 			}
3202507069c9SYouquan, Song 		}
3203507069c9SYouquan, Song 	}, {
3204a482b081SSonic Zhang 		.alg = "hmac(crc32)",
3205a482b081SSonic Zhang 		.test = alg_test_hash,
3206a482b081SSonic Zhang 		.suite = {
3207a482b081SSonic Zhang 			.hash = {
3208a482b081SSonic Zhang 				.vecs = bfin_crc_tv_template,
3209a482b081SSonic Zhang 				.count = BFIN_CRC_TEST_VECTORS
3210a482b081SSonic Zhang 			}
3211a482b081SSonic Zhang 		}
3212a482b081SSonic Zhang 	}, {
3213da7f033dSHerbert Xu 		.alg = "hmac(md5)",
3214da7f033dSHerbert Xu 		.test = alg_test_hash,
3215da7f033dSHerbert Xu 		.suite = {
3216da7f033dSHerbert Xu 			.hash = {
3217da7f033dSHerbert Xu 				.vecs = hmac_md5_tv_template,
3218da7f033dSHerbert Xu 				.count = HMAC_MD5_TEST_VECTORS
3219da7f033dSHerbert Xu 			}
3220da7f033dSHerbert Xu 		}
3221da7f033dSHerbert Xu 	}, {
3222da7f033dSHerbert Xu 		.alg = "hmac(rmd128)",
3223da7f033dSHerbert Xu 		.test = alg_test_hash,
3224da7f033dSHerbert Xu 		.suite = {
3225da7f033dSHerbert Xu 			.hash = {
3226da7f033dSHerbert Xu 				.vecs = hmac_rmd128_tv_template,
3227da7f033dSHerbert Xu 				.count = HMAC_RMD128_TEST_VECTORS
3228da7f033dSHerbert Xu 			}
3229da7f033dSHerbert Xu 		}
3230da7f033dSHerbert Xu 	}, {
3231da7f033dSHerbert Xu 		.alg = "hmac(rmd160)",
3232da7f033dSHerbert Xu 		.test = alg_test_hash,
3233da7f033dSHerbert Xu 		.suite = {
3234da7f033dSHerbert Xu 			.hash = {
3235da7f033dSHerbert Xu 				.vecs = hmac_rmd160_tv_template,
3236da7f033dSHerbert Xu 				.count = HMAC_RMD160_TEST_VECTORS
3237da7f033dSHerbert Xu 			}
3238da7f033dSHerbert Xu 		}
3239da7f033dSHerbert Xu 	}, {
3240da7f033dSHerbert Xu 		.alg = "hmac(sha1)",
3241da7f033dSHerbert Xu 		.test = alg_test_hash,
3242a1915d51SJarod Wilson 		.fips_allowed = 1,
3243da7f033dSHerbert Xu 		.suite = {
3244da7f033dSHerbert Xu 			.hash = {
3245da7f033dSHerbert Xu 				.vecs = hmac_sha1_tv_template,
3246da7f033dSHerbert Xu 				.count = HMAC_SHA1_TEST_VECTORS
3247da7f033dSHerbert Xu 			}
3248da7f033dSHerbert Xu 		}
3249da7f033dSHerbert Xu 	}, {
3250da7f033dSHerbert Xu 		.alg = "hmac(sha224)",
3251da7f033dSHerbert Xu 		.test = alg_test_hash,
3252a1915d51SJarod Wilson 		.fips_allowed = 1,
3253da7f033dSHerbert Xu 		.suite = {
3254da7f033dSHerbert Xu 			.hash = {
3255da7f033dSHerbert Xu 				.vecs = hmac_sha224_tv_template,
3256da7f033dSHerbert Xu 				.count = HMAC_SHA224_TEST_VECTORS
3257da7f033dSHerbert Xu 			}
3258da7f033dSHerbert Xu 		}
3259da7f033dSHerbert Xu 	}, {
3260da7f033dSHerbert Xu 		.alg = "hmac(sha256)",
3261da7f033dSHerbert Xu 		.test = alg_test_hash,
3262a1915d51SJarod Wilson 		.fips_allowed = 1,
3263da7f033dSHerbert Xu 		.suite = {
3264da7f033dSHerbert Xu 			.hash = {
3265da7f033dSHerbert Xu 				.vecs = hmac_sha256_tv_template,
3266da7f033dSHerbert Xu 				.count = HMAC_SHA256_TEST_VECTORS
3267da7f033dSHerbert Xu 			}
3268da7f033dSHerbert Xu 		}
3269da7f033dSHerbert Xu 	}, {
3270da7f033dSHerbert Xu 		.alg = "hmac(sha384)",
3271da7f033dSHerbert Xu 		.test = alg_test_hash,
3272a1915d51SJarod Wilson 		.fips_allowed = 1,
3273da7f033dSHerbert Xu 		.suite = {
3274da7f033dSHerbert Xu 			.hash = {
3275da7f033dSHerbert Xu 				.vecs = hmac_sha384_tv_template,
3276da7f033dSHerbert Xu 				.count = HMAC_SHA384_TEST_VECTORS
3277da7f033dSHerbert Xu 			}
3278da7f033dSHerbert Xu 		}
3279da7f033dSHerbert Xu 	}, {
3280da7f033dSHerbert Xu 		.alg = "hmac(sha512)",
3281da7f033dSHerbert Xu 		.test = alg_test_hash,
3282a1915d51SJarod Wilson 		.fips_allowed = 1,
3283da7f033dSHerbert Xu 		.suite = {
3284da7f033dSHerbert Xu 			.hash = {
3285da7f033dSHerbert Xu 				.vecs = hmac_sha512_tv_template,
3286da7f033dSHerbert Xu 				.count = HMAC_SHA512_TEST_VECTORS
3287da7f033dSHerbert Xu 			}
3288da7f033dSHerbert Xu 		}
3289da7f033dSHerbert Xu 	}, {
3290bb5530e4SStephan Mueller 		.alg = "jitterentropy_rng",
3291bb5530e4SStephan Mueller 		.fips_allowed = 1,
3292bb5530e4SStephan Mueller 		.test = alg_test_null,
3293bb5530e4SStephan Mueller 	}, {
3294da7f033dSHerbert Xu 		.alg = "lrw(aes)",
32951aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3296da7f033dSHerbert Xu 		.suite = {
3297da7f033dSHerbert Xu 			.cipher = {
3298da7f033dSHerbert Xu 				.enc = {
3299da7f033dSHerbert Xu 					.vecs = aes_lrw_enc_tv_template,
3300da7f033dSHerbert Xu 					.count = AES_LRW_ENC_TEST_VECTORS
3301da7f033dSHerbert Xu 				},
3302da7f033dSHerbert Xu 				.dec = {
3303da7f033dSHerbert Xu 					.vecs = aes_lrw_dec_tv_template,
3304da7f033dSHerbert Xu 					.count = AES_LRW_DEC_TEST_VECTORS
3305da7f033dSHerbert Xu 				}
3306da7f033dSHerbert Xu 			}
3307da7f033dSHerbert Xu 		}
3308da7f033dSHerbert Xu 	}, {
33090840605eSJussi Kivilinna 		.alg = "lrw(camellia)",
33100840605eSJussi Kivilinna 		.test = alg_test_skcipher,
33110840605eSJussi Kivilinna 		.suite = {
33120840605eSJussi Kivilinna 			.cipher = {
33130840605eSJussi Kivilinna 				.enc = {
33140840605eSJussi Kivilinna 					.vecs = camellia_lrw_enc_tv_template,
33150840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_ENC_TEST_VECTORS
33160840605eSJussi Kivilinna 				},
33170840605eSJussi Kivilinna 				.dec = {
33180840605eSJussi Kivilinna 					.vecs = camellia_lrw_dec_tv_template,
33190840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_DEC_TEST_VECTORS
33200840605eSJussi Kivilinna 				}
33210840605eSJussi Kivilinna 			}
33220840605eSJussi Kivilinna 		}
33230840605eSJussi Kivilinna 	}, {
33249b8b0405SJohannes Goetzfried 		.alg = "lrw(cast6)",
33259b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
33269b8b0405SJohannes Goetzfried 		.suite = {
33279b8b0405SJohannes Goetzfried 			.cipher = {
33289b8b0405SJohannes Goetzfried 				.enc = {
33299b8b0405SJohannes Goetzfried 					.vecs = cast6_lrw_enc_tv_template,
33309b8b0405SJohannes Goetzfried 					.count = CAST6_LRW_ENC_TEST_VECTORS
33319b8b0405SJohannes Goetzfried 				},
33329b8b0405SJohannes Goetzfried 				.dec = {
33339b8b0405SJohannes Goetzfried 					.vecs = cast6_lrw_dec_tv_template,
33349b8b0405SJohannes Goetzfried 					.count = CAST6_LRW_DEC_TEST_VECTORS
33359b8b0405SJohannes Goetzfried 				}
33369b8b0405SJohannes Goetzfried 			}
33379b8b0405SJohannes Goetzfried 		}
33389b8b0405SJohannes Goetzfried 	}, {
3339d7bfc0faSJussi Kivilinna 		.alg = "lrw(serpent)",
3340d7bfc0faSJussi Kivilinna 		.test = alg_test_skcipher,
3341d7bfc0faSJussi Kivilinna 		.suite = {
3342d7bfc0faSJussi Kivilinna 			.cipher = {
3343d7bfc0faSJussi Kivilinna 				.enc = {
3344d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_enc_tv_template,
3345d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_ENC_TEST_VECTORS
3346d7bfc0faSJussi Kivilinna 				},
3347d7bfc0faSJussi Kivilinna 				.dec = {
3348d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_dec_tv_template,
3349d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_DEC_TEST_VECTORS
3350d7bfc0faSJussi Kivilinna 				}
3351d7bfc0faSJussi Kivilinna 			}
3352d7bfc0faSJussi Kivilinna 		}
3353d7bfc0faSJussi Kivilinna 	}, {
33540b2a1551SJussi Kivilinna 		.alg = "lrw(twofish)",
33550b2a1551SJussi Kivilinna 		.test = alg_test_skcipher,
33560b2a1551SJussi Kivilinna 		.suite = {
33570b2a1551SJussi Kivilinna 			.cipher = {
33580b2a1551SJussi Kivilinna 				.enc = {
33590b2a1551SJussi Kivilinna 					.vecs = tf_lrw_enc_tv_template,
33600b2a1551SJussi Kivilinna 					.count = TF_LRW_ENC_TEST_VECTORS
33610b2a1551SJussi Kivilinna 				},
33620b2a1551SJussi Kivilinna 				.dec = {
33630b2a1551SJussi Kivilinna 					.vecs = tf_lrw_dec_tv_template,
33640b2a1551SJussi Kivilinna 					.count = TF_LRW_DEC_TEST_VECTORS
33650b2a1551SJussi Kivilinna 				}
33660b2a1551SJussi Kivilinna 			}
33670b2a1551SJussi Kivilinna 		}
33680b2a1551SJussi Kivilinna 	}, {
33691443cc9bSKOVACS Krisztian 		.alg = "lz4",
33701443cc9bSKOVACS Krisztian 		.test = alg_test_comp,
33711443cc9bSKOVACS Krisztian 		.fips_allowed = 1,
33721443cc9bSKOVACS Krisztian 		.suite = {
33731443cc9bSKOVACS Krisztian 			.comp = {
33741443cc9bSKOVACS Krisztian 				.comp = {
33751443cc9bSKOVACS Krisztian 					.vecs = lz4_comp_tv_template,
33761443cc9bSKOVACS Krisztian 					.count = LZ4_COMP_TEST_VECTORS
33771443cc9bSKOVACS Krisztian 				},
33781443cc9bSKOVACS Krisztian 				.decomp = {
33791443cc9bSKOVACS Krisztian 					.vecs = lz4_decomp_tv_template,
33801443cc9bSKOVACS Krisztian 					.count = LZ4_DECOMP_TEST_VECTORS
33811443cc9bSKOVACS Krisztian 				}
33821443cc9bSKOVACS Krisztian 			}
33831443cc9bSKOVACS Krisztian 		}
33841443cc9bSKOVACS Krisztian 	}, {
33851443cc9bSKOVACS Krisztian 		.alg = "lz4hc",
33861443cc9bSKOVACS Krisztian 		.test = alg_test_comp,
33871443cc9bSKOVACS Krisztian 		.fips_allowed = 1,
33881443cc9bSKOVACS Krisztian 		.suite = {
33891443cc9bSKOVACS Krisztian 			.comp = {
33901443cc9bSKOVACS Krisztian 				.comp = {
33911443cc9bSKOVACS Krisztian 					.vecs = lz4hc_comp_tv_template,
33921443cc9bSKOVACS Krisztian 					.count = LZ4HC_COMP_TEST_VECTORS
33931443cc9bSKOVACS Krisztian 				},
33941443cc9bSKOVACS Krisztian 				.decomp = {
33951443cc9bSKOVACS Krisztian 					.vecs = lz4hc_decomp_tv_template,
33961443cc9bSKOVACS Krisztian 					.count = LZ4HC_DECOMP_TEST_VECTORS
33971443cc9bSKOVACS Krisztian 				}
33981443cc9bSKOVACS Krisztian 			}
33991443cc9bSKOVACS Krisztian 		}
34001443cc9bSKOVACS Krisztian 	}, {
3401da7f033dSHerbert Xu 		.alg = "lzo",
3402da7f033dSHerbert Xu 		.test = alg_test_comp,
34030818904dSMilan Broz 		.fips_allowed = 1,
3404da7f033dSHerbert Xu 		.suite = {
3405da7f033dSHerbert Xu 			.comp = {
3406da7f033dSHerbert Xu 				.comp = {
3407da7f033dSHerbert Xu 					.vecs = lzo_comp_tv_template,
3408da7f033dSHerbert Xu 					.count = LZO_COMP_TEST_VECTORS
3409da7f033dSHerbert Xu 				},
3410da7f033dSHerbert Xu 				.decomp = {
3411da7f033dSHerbert Xu 					.vecs = lzo_decomp_tv_template,
3412da7f033dSHerbert Xu 					.count = LZO_DECOMP_TEST_VECTORS
3413da7f033dSHerbert Xu 				}
3414da7f033dSHerbert Xu 			}
3415da7f033dSHerbert Xu 		}
3416da7f033dSHerbert Xu 	}, {
3417da7f033dSHerbert Xu 		.alg = "md4",
3418da7f033dSHerbert Xu 		.test = alg_test_hash,
3419da7f033dSHerbert Xu 		.suite = {
3420da7f033dSHerbert Xu 			.hash = {
3421da7f033dSHerbert Xu 				.vecs = md4_tv_template,
3422da7f033dSHerbert Xu 				.count = MD4_TEST_VECTORS
3423da7f033dSHerbert Xu 			}
3424da7f033dSHerbert Xu 		}
3425da7f033dSHerbert Xu 	}, {
3426da7f033dSHerbert Xu 		.alg = "md5",
3427da7f033dSHerbert Xu 		.test = alg_test_hash,
3428da7f033dSHerbert Xu 		.suite = {
3429da7f033dSHerbert Xu 			.hash = {
3430da7f033dSHerbert Xu 				.vecs = md5_tv_template,
3431da7f033dSHerbert Xu 				.count = MD5_TEST_VECTORS
3432da7f033dSHerbert Xu 			}
3433da7f033dSHerbert Xu 		}
3434da7f033dSHerbert Xu 	}, {
3435da7f033dSHerbert Xu 		.alg = "michael_mic",
3436da7f033dSHerbert Xu 		.test = alg_test_hash,
3437da7f033dSHerbert Xu 		.suite = {
3438da7f033dSHerbert Xu 			.hash = {
3439da7f033dSHerbert Xu 				.vecs = michael_mic_tv_template,
3440da7f033dSHerbert Xu 				.count = MICHAEL_MIC_TEST_VECTORS
3441da7f033dSHerbert Xu 			}
3442da7f033dSHerbert Xu 		}
3443da7f033dSHerbert Xu 	}, {
3444ba0e14acSPuneet Saxena 		.alg = "ofb(aes)",
3445ba0e14acSPuneet Saxena 		.test = alg_test_skcipher,
3446ba0e14acSPuneet Saxena 		.fips_allowed = 1,
3447ba0e14acSPuneet Saxena 		.suite = {
3448ba0e14acSPuneet Saxena 			.cipher = {
3449ba0e14acSPuneet Saxena 				.enc = {
3450ba0e14acSPuneet Saxena 					.vecs = aes_ofb_enc_tv_template,
3451ba0e14acSPuneet Saxena 					.count = AES_OFB_ENC_TEST_VECTORS
3452ba0e14acSPuneet Saxena 				},
3453ba0e14acSPuneet Saxena 				.dec = {
3454ba0e14acSPuneet Saxena 					.vecs = aes_ofb_dec_tv_template,
3455ba0e14acSPuneet Saxena 					.count = AES_OFB_DEC_TEST_VECTORS
3456ba0e14acSPuneet Saxena 				}
3457ba0e14acSPuneet Saxena 			}
3458ba0e14acSPuneet Saxena 		}
3459ba0e14acSPuneet Saxena 	}, {
3460da7f033dSHerbert Xu 		.alg = "pcbc(fcrypt)",
34611aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3462da7f033dSHerbert Xu 		.suite = {
3463da7f033dSHerbert Xu 			.cipher = {
3464da7f033dSHerbert Xu 				.enc = {
3465da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_enc_tv_template,
3466da7f033dSHerbert Xu 					.count = FCRYPT_ENC_TEST_VECTORS
3467da7f033dSHerbert Xu 				},
3468da7f033dSHerbert Xu 				.dec = {
3469da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_dec_tv_template,
3470da7f033dSHerbert Xu 					.count = FCRYPT_DEC_TEST_VECTORS
3471da7f033dSHerbert Xu 				}
3472da7f033dSHerbert Xu 			}
3473da7f033dSHerbert Xu 		}
3474da7f033dSHerbert Xu 	}, {
3475eee9dc61SMartin Willi 		.alg = "poly1305",
3476eee9dc61SMartin Willi 		.test = alg_test_hash,
3477eee9dc61SMartin Willi 		.suite = {
3478eee9dc61SMartin Willi 			.hash = {
3479eee9dc61SMartin Willi 				.vecs = poly1305_tv_template,
3480eee9dc61SMartin Willi 				.count = POLY1305_TEST_VECTORS
3481eee9dc61SMartin Willi 			}
3482eee9dc61SMartin Willi 		}
3483eee9dc61SMartin Willi 	}, {
3484da7f033dSHerbert Xu 		.alg = "rfc3686(ctr(aes))",
34851aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3486a1915d51SJarod Wilson 		.fips_allowed = 1,
3487da7f033dSHerbert Xu 		.suite = {
3488da7f033dSHerbert Xu 			.cipher = {
3489da7f033dSHerbert Xu 				.enc = {
3490f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_enc_tv_template,
3491f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_ENC_TEST_VECTORS
3492da7f033dSHerbert Xu 				},
3493da7f033dSHerbert Xu 				.dec = {
3494f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_dec_tv_template,
3495f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_DEC_TEST_VECTORS
3496da7f033dSHerbert Xu 				}
3497da7f033dSHerbert Xu 			}
3498da7f033dSHerbert Xu 		}
3499da7f033dSHerbert Xu 	}, {
35003f31a740SHerbert Xu 		.alg = "rfc4106(gcm(aes))",
350169435b94SAdrian Hoban 		.test = alg_test_aead,
3502db71f29aSJarod Wilson 		.fips_allowed = 1,
350369435b94SAdrian Hoban 		.suite = {
350469435b94SAdrian Hoban 			.aead = {
350569435b94SAdrian Hoban 				.enc = {
350669435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_enc_tv_template,
350769435b94SAdrian Hoban 					.count = AES_GCM_4106_ENC_TEST_VECTORS
350869435b94SAdrian Hoban 				},
350969435b94SAdrian Hoban 				.dec = {
351069435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_dec_tv_template,
351169435b94SAdrian Hoban 					.count = AES_GCM_4106_DEC_TEST_VECTORS
351269435b94SAdrian Hoban 				}
351369435b94SAdrian Hoban 			}
351469435b94SAdrian Hoban 		}
351569435b94SAdrian Hoban 	}, {
3516544c436aSHerbert Xu 		.alg = "rfc4309(ccm(aes))",
35175d667322SJarod Wilson 		.test = alg_test_aead,
3518a1915d51SJarod Wilson 		.fips_allowed = 1,
35195d667322SJarod Wilson 		.suite = {
35205d667322SJarod Wilson 			.aead = {
35215d667322SJarod Wilson 				.enc = {
35225d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_enc_tv_template,
35235d667322SJarod Wilson 					.count = AES_CCM_4309_ENC_TEST_VECTORS
35245d667322SJarod Wilson 				},
35255d667322SJarod Wilson 				.dec = {
35265d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_dec_tv_template,
35275d667322SJarod Wilson 					.count = AES_CCM_4309_DEC_TEST_VECTORS
35285d667322SJarod Wilson 				}
35295d667322SJarod Wilson 			}
35305d667322SJarod Wilson 		}
35315d667322SJarod Wilson 	}, {
3532bb68745eSHerbert Xu 		.alg = "rfc4543(gcm(aes))",
3533e9b7441aSJussi Kivilinna 		.test = alg_test_aead,
3534e9b7441aSJussi Kivilinna 		.suite = {
3535e9b7441aSJussi Kivilinna 			.aead = {
3536e9b7441aSJussi Kivilinna 				.enc = {
3537e9b7441aSJussi Kivilinna 					.vecs = aes_gcm_rfc4543_enc_tv_template,
3538e9b7441aSJussi Kivilinna 					.count = AES_GCM_4543_ENC_TEST_VECTORS
3539e9b7441aSJussi Kivilinna 				},
3540e9b7441aSJussi Kivilinna 				.dec = {
3541e9b7441aSJussi Kivilinna 					.vecs = aes_gcm_rfc4543_dec_tv_template,
3542e9b7441aSJussi Kivilinna 					.count = AES_GCM_4543_DEC_TEST_VECTORS
3543e9b7441aSJussi Kivilinna 				},
3544e9b7441aSJussi Kivilinna 			}
3545e9b7441aSJussi Kivilinna 		}
3546e9b7441aSJussi Kivilinna 	}, {
3547af2b76b5SMartin Willi 		.alg = "rfc7539(chacha20,poly1305)",
3548af2b76b5SMartin Willi 		.test = alg_test_aead,
3549af2b76b5SMartin Willi 		.suite = {
3550af2b76b5SMartin Willi 			.aead = {
3551af2b76b5SMartin Willi 				.enc = {
3552af2b76b5SMartin Willi 					.vecs = rfc7539_enc_tv_template,
3553af2b76b5SMartin Willi 					.count = RFC7539_ENC_TEST_VECTORS
3554af2b76b5SMartin Willi 				},
3555af2b76b5SMartin Willi 				.dec = {
3556af2b76b5SMartin Willi 					.vecs = rfc7539_dec_tv_template,
3557af2b76b5SMartin Willi 					.count = RFC7539_DEC_TEST_VECTORS
3558af2b76b5SMartin Willi 				},
3559af2b76b5SMartin Willi 			}
3560af2b76b5SMartin Willi 		}
3561af2b76b5SMartin Willi 	}, {
35625900758dSMartin Willi 		.alg = "rfc7539esp(chacha20,poly1305)",
35635900758dSMartin Willi 		.test = alg_test_aead,
35645900758dSMartin Willi 		.suite = {
35655900758dSMartin Willi 			.aead = {
35665900758dSMartin Willi 				.enc = {
35675900758dSMartin Willi 					.vecs = rfc7539esp_enc_tv_template,
35685900758dSMartin Willi 					.count = RFC7539ESP_ENC_TEST_VECTORS
35695900758dSMartin Willi 				},
35705900758dSMartin Willi 				.dec = {
35715900758dSMartin Willi 					.vecs = rfc7539esp_dec_tv_template,
35725900758dSMartin Willi 					.count = RFC7539ESP_DEC_TEST_VECTORS
35735900758dSMartin Willi 				},
35745900758dSMartin Willi 			}
35755900758dSMartin Willi 		}
35765900758dSMartin Willi 	}, {
3577da7f033dSHerbert Xu 		.alg = "rmd128",
3578da7f033dSHerbert Xu 		.test = alg_test_hash,
3579da7f033dSHerbert Xu 		.suite = {
3580da7f033dSHerbert Xu 			.hash = {
3581da7f033dSHerbert Xu 				.vecs = rmd128_tv_template,
3582da7f033dSHerbert Xu 				.count = RMD128_TEST_VECTORS
3583da7f033dSHerbert Xu 			}
3584da7f033dSHerbert Xu 		}
3585da7f033dSHerbert Xu 	}, {
3586da7f033dSHerbert Xu 		.alg = "rmd160",
3587da7f033dSHerbert Xu 		.test = alg_test_hash,
3588da7f033dSHerbert Xu 		.suite = {
3589da7f033dSHerbert Xu 			.hash = {
3590da7f033dSHerbert Xu 				.vecs = rmd160_tv_template,
3591da7f033dSHerbert Xu 				.count = RMD160_TEST_VECTORS
3592da7f033dSHerbert Xu 			}
3593da7f033dSHerbert Xu 		}
3594da7f033dSHerbert Xu 	}, {
3595da7f033dSHerbert Xu 		.alg = "rmd256",
3596da7f033dSHerbert Xu 		.test = alg_test_hash,
3597da7f033dSHerbert Xu 		.suite = {
3598da7f033dSHerbert Xu 			.hash = {
3599da7f033dSHerbert Xu 				.vecs = rmd256_tv_template,
3600da7f033dSHerbert Xu 				.count = RMD256_TEST_VECTORS
3601da7f033dSHerbert Xu 			}
3602da7f033dSHerbert Xu 		}
3603da7f033dSHerbert Xu 	}, {
3604da7f033dSHerbert Xu 		.alg = "rmd320",
3605da7f033dSHerbert Xu 		.test = alg_test_hash,
3606da7f033dSHerbert Xu 		.suite = {
3607da7f033dSHerbert Xu 			.hash = {
3608da7f033dSHerbert Xu 				.vecs = rmd320_tv_template,
3609da7f033dSHerbert Xu 				.count = RMD320_TEST_VECTORS
3610da7f033dSHerbert Xu 			}
3611da7f033dSHerbert Xu 		}
3612da7f033dSHerbert Xu 	}, {
3613946cc463STadeusz Struk 		.alg = "rsa",
3614946cc463STadeusz Struk 		.test = alg_test_akcipher,
3615946cc463STadeusz Struk 		.fips_allowed = 1,
3616946cc463STadeusz Struk 		.suite = {
3617946cc463STadeusz Struk 			.akcipher = {
3618946cc463STadeusz Struk 				.vecs = rsa_tv_template,
3619946cc463STadeusz Struk 				.count = RSA_TEST_VECTORS
3620946cc463STadeusz Struk 			}
3621946cc463STadeusz Struk 		}
3622946cc463STadeusz Struk 	}, {
3623da7f033dSHerbert Xu 		.alg = "salsa20",
36241aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3625da7f033dSHerbert Xu 		.suite = {
3626da7f033dSHerbert Xu 			.cipher = {
3627da7f033dSHerbert Xu 				.enc = {
3628da7f033dSHerbert Xu 					.vecs = salsa20_stream_enc_tv_template,
3629da7f033dSHerbert Xu 					.count = SALSA20_STREAM_ENC_TEST_VECTORS
3630da7f033dSHerbert Xu 				}
3631da7f033dSHerbert Xu 			}
3632da7f033dSHerbert Xu 		}
3633da7f033dSHerbert Xu 	}, {
3634da7f033dSHerbert Xu 		.alg = "sha1",
3635da7f033dSHerbert Xu 		.test = alg_test_hash,
3636a1915d51SJarod Wilson 		.fips_allowed = 1,
3637da7f033dSHerbert Xu 		.suite = {
3638da7f033dSHerbert Xu 			.hash = {
3639da7f033dSHerbert Xu 				.vecs = sha1_tv_template,
3640da7f033dSHerbert Xu 				.count = SHA1_TEST_VECTORS
3641da7f033dSHerbert Xu 			}
3642da7f033dSHerbert Xu 		}
3643da7f033dSHerbert Xu 	}, {
3644da7f033dSHerbert Xu 		.alg = "sha224",
3645da7f033dSHerbert Xu 		.test = alg_test_hash,
3646a1915d51SJarod Wilson 		.fips_allowed = 1,
3647da7f033dSHerbert Xu 		.suite = {
3648da7f033dSHerbert Xu 			.hash = {
3649da7f033dSHerbert Xu 				.vecs = sha224_tv_template,
3650da7f033dSHerbert Xu 				.count = SHA224_TEST_VECTORS
3651da7f033dSHerbert Xu 			}
3652da7f033dSHerbert Xu 		}
3653da7f033dSHerbert Xu 	}, {
3654da7f033dSHerbert Xu 		.alg = "sha256",
3655da7f033dSHerbert Xu 		.test = alg_test_hash,
3656a1915d51SJarod Wilson 		.fips_allowed = 1,
3657da7f033dSHerbert Xu 		.suite = {
3658da7f033dSHerbert Xu 			.hash = {
3659da7f033dSHerbert Xu 				.vecs = sha256_tv_template,
3660da7f033dSHerbert Xu 				.count = SHA256_TEST_VECTORS
3661da7f033dSHerbert Xu 			}
3662da7f033dSHerbert Xu 		}
3663da7f033dSHerbert Xu 	}, {
3664da7f033dSHerbert Xu 		.alg = "sha384",
3665da7f033dSHerbert Xu 		.test = alg_test_hash,
3666a1915d51SJarod Wilson 		.fips_allowed = 1,
3667da7f033dSHerbert Xu 		.suite = {
3668da7f033dSHerbert Xu 			.hash = {
3669da7f033dSHerbert Xu 				.vecs = sha384_tv_template,
3670da7f033dSHerbert Xu 				.count = SHA384_TEST_VECTORS
3671da7f033dSHerbert Xu 			}
3672da7f033dSHerbert Xu 		}
3673da7f033dSHerbert Xu 	}, {
3674da7f033dSHerbert Xu 		.alg = "sha512",
3675da7f033dSHerbert Xu 		.test = alg_test_hash,
3676a1915d51SJarod Wilson 		.fips_allowed = 1,
3677da7f033dSHerbert Xu 		.suite = {
3678da7f033dSHerbert Xu 			.hash = {
3679da7f033dSHerbert Xu 				.vecs = sha512_tv_template,
3680da7f033dSHerbert Xu 				.count = SHA512_TEST_VECTORS
3681da7f033dSHerbert Xu 			}
3682da7f033dSHerbert Xu 		}
3683da7f033dSHerbert Xu 	}, {
3684da7f033dSHerbert Xu 		.alg = "tgr128",
3685da7f033dSHerbert Xu 		.test = alg_test_hash,
3686da7f033dSHerbert Xu 		.suite = {
3687da7f033dSHerbert Xu 			.hash = {
3688da7f033dSHerbert Xu 				.vecs = tgr128_tv_template,
3689da7f033dSHerbert Xu 				.count = TGR128_TEST_VECTORS
3690da7f033dSHerbert Xu 			}
3691da7f033dSHerbert Xu 		}
3692da7f033dSHerbert Xu 	}, {
3693da7f033dSHerbert Xu 		.alg = "tgr160",
3694da7f033dSHerbert Xu 		.test = alg_test_hash,
3695da7f033dSHerbert Xu 		.suite = {
3696da7f033dSHerbert Xu 			.hash = {
3697da7f033dSHerbert Xu 				.vecs = tgr160_tv_template,
3698da7f033dSHerbert Xu 				.count = TGR160_TEST_VECTORS
3699da7f033dSHerbert Xu 			}
3700da7f033dSHerbert Xu 		}
3701da7f033dSHerbert Xu 	}, {
3702da7f033dSHerbert Xu 		.alg = "tgr192",
3703da7f033dSHerbert Xu 		.test = alg_test_hash,
3704da7f033dSHerbert Xu 		.suite = {
3705da7f033dSHerbert Xu 			.hash = {
3706da7f033dSHerbert Xu 				.vecs = tgr192_tv_template,
3707da7f033dSHerbert Xu 				.count = TGR192_TEST_VECTORS
3708da7f033dSHerbert Xu 			}
3709da7f033dSHerbert Xu 		}
3710da7f033dSHerbert Xu 	}, {
3711f1939f7cSShane Wang 		.alg = "vmac(aes)",
3712f1939f7cSShane Wang 		.test = alg_test_hash,
3713f1939f7cSShane Wang 		.suite = {
3714f1939f7cSShane Wang 			.hash = {
3715f1939f7cSShane Wang 				.vecs = aes_vmac128_tv_template,
3716f1939f7cSShane Wang 				.count = VMAC_AES_TEST_VECTORS
3717f1939f7cSShane Wang 			}
3718f1939f7cSShane Wang 		}
3719f1939f7cSShane Wang 	}, {
3720da7f033dSHerbert Xu 		.alg = "wp256",
3721da7f033dSHerbert Xu 		.test = alg_test_hash,
3722da7f033dSHerbert Xu 		.suite = {
3723da7f033dSHerbert Xu 			.hash = {
3724da7f033dSHerbert Xu 				.vecs = wp256_tv_template,
3725da7f033dSHerbert Xu 				.count = WP256_TEST_VECTORS
3726da7f033dSHerbert Xu 			}
3727da7f033dSHerbert Xu 		}
3728da7f033dSHerbert Xu 	}, {
3729da7f033dSHerbert Xu 		.alg = "wp384",
3730da7f033dSHerbert Xu 		.test = alg_test_hash,
3731da7f033dSHerbert Xu 		.suite = {
3732da7f033dSHerbert Xu 			.hash = {
3733da7f033dSHerbert Xu 				.vecs = wp384_tv_template,
3734da7f033dSHerbert Xu 				.count = WP384_TEST_VECTORS
3735da7f033dSHerbert Xu 			}
3736da7f033dSHerbert Xu 		}
3737da7f033dSHerbert Xu 	}, {
3738da7f033dSHerbert Xu 		.alg = "wp512",
3739da7f033dSHerbert Xu 		.test = alg_test_hash,
3740da7f033dSHerbert Xu 		.suite = {
3741da7f033dSHerbert Xu 			.hash = {
3742da7f033dSHerbert Xu 				.vecs = wp512_tv_template,
3743da7f033dSHerbert Xu 				.count = WP512_TEST_VECTORS
3744da7f033dSHerbert Xu 			}
3745da7f033dSHerbert Xu 		}
3746da7f033dSHerbert Xu 	}, {
3747da7f033dSHerbert Xu 		.alg = "xcbc(aes)",
3748da7f033dSHerbert Xu 		.test = alg_test_hash,
3749da7f033dSHerbert Xu 		.suite = {
3750da7f033dSHerbert Xu 			.hash = {
3751da7f033dSHerbert Xu 				.vecs = aes_xcbc128_tv_template,
3752da7f033dSHerbert Xu 				.count = XCBC_AES_TEST_VECTORS
3753da7f033dSHerbert Xu 			}
3754da7f033dSHerbert Xu 		}
3755da7f033dSHerbert Xu 	}, {
3756da7f033dSHerbert Xu 		.alg = "xts(aes)",
37571aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
37582918aa8dSJarod Wilson 		.fips_allowed = 1,
3759da7f033dSHerbert Xu 		.suite = {
3760da7f033dSHerbert Xu 			.cipher = {
3761da7f033dSHerbert Xu 				.enc = {
3762da7f033dSHerbert Xu 					.vecs = aes_xts_enc_tv_template,
3763da7f033dSHerbert Xu 					.count = AES_XTS_ENC_TEST_VECTORS
3764da7f033dSHerbert Xu 				},
3765da7f033dSHerbert Xu 				.dec = {
3766da7f033dSHerbert Xu 					.vecs = aes_xts_dec_tv_template,
3767da7f033dSHerbert Xu 					.count = AES_XTS_DEC_TEST_VECTORS
3768da7f033dSHerbert Xu 				}
3769da7f033dSHerbert Xu 			}
3770da7f033dSHerbert Xu 		}
37710c01aed5SGeert Uytterhoeven 	}, {
37720840605eSJussi Kivilinna 		.alg = "xts(camellia)",
37730840605eSJussi Kivilinna 		.test = alg_test_skcipher,
37740840605eSJussi Kivilinna 		.suite = {
37750840605eSJussi Kivilinna 			.cipher = {
37760840605eSJussi Kivilinna 				.enc = {
37770840605eSJussi Kivilinna 					.vecs = camellia_xts_enc_tv_template,
37780840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_ENC_TEST_VECTORS
37790840605eSJussi Kivilinna 				},
37800840605eSJussi Kivilinna 				.dec = {
37810840605eSJussi Kivilinna 					.vecs = camellia_xts_dec_tv_template,
37820840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_DEC_TEST_VECTORS
37830840605eSJussi Kivilinna 				}
37840840605eSJussi Kivilinna 			}
37850840605eSJussi Kivilinna 		}
37860840605eSJussi Kivilinna 	}, {
37879b8b0405SJohannes Goetzfried 		.alg = "xts(cast6)",
37889b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
37899b8b0405SJohannes Goetzfried 		.suite = {
37909b8b0405SJohannes Goetzfried 			.cipher = {
37919b8b0405SJohannes Goetzfried 				.enc = {
37929b8b0405SJohannes Goetzfried 					.vecs = cast6_xts_enc_tv_template,
37939b8b0405SJohannes Goetzfried 					.count = CAST6_XTS_ENC_TEST_VECTORS
37949b8b0405SJohannes Goetzfried 				},
37959b8b0405SJohannes Goetzfried 				.dec = {
37969b8b0405SJohannes Goetzfried 					.vecs = cast6_xts_dec_tv_template,
37979b8b0405SJohannes Goetzfried 					.count = CAST6_XTS_DEC_TEST_VECTORS
37989b8b0405SJohannes Goetzfried 				}
37999b8b0405SJohannes Goetzfried 			}
38009b8b0405SJohannes Goetzfried 		}
38019b8b0405SJohannes Goetzfried 	}, {
380218be20b9SJussi Kivilinna 		.alg = "xts(serpent)",
380318be20b9SJussi Kivilinna 		.test = alg_test_skcipher,
380418be20b9SJussi Kivilinna 		.suite = {
380518be20b9SJussi Kivilinna 			.cipher = {
380618be20b9SJussi Kivilinna 				.enc = {
380718be20b9SJussi Kivilinna 					.vecs = serpent_xts_enc_tv_template,
380818be20b9SJussi Kivilinna 					.count = SERPENT_XTS_ENC_TEST_VECTORS
380918be20b9SJussi Kivilinna 				},
381018be20b9SJussi Kivilinna 				.dec = {
381118be20b9SJussi Kivilinna 					.vecs = serpent_xts_dec_tv_template,
381218be20b9SJussi Kivilinna 					.count = SERPENT_XTS_DEC_TEST_VECTORS
381318be20b9SJussi Kivilinna 				}
381418be20b9SJussi Kivilinna 			}
381518be20b9SJussi Kivilinna 		}
381618be20b9SJussi Kivilinna 	}, {
3817aed265b9SJussi Kivilinna 		.alg = "xts(twofish)",
3818aed265b9SJussi Kivilinna 		.test = alg_test_skcipher,
3819aed265b9SJussi Kivilinna 		.suite = {
3820aed265b9SJussi Kivilinna 			.cipher = {
3821aed265b9SJussi Kivilinna 				.enc = {
3822aed265b9SJussi Kivilinna 					.vecs = tf_xts_enc_tv_template,
3823aed265b9SJussi Kivilinna 					.count = TF_XTS_ENC_TEST_VECTORS
3824aed265b9SJussi Kivilinna 				},
3825aed265b9SJussi Kivilinna 				.dec = {
3826aed265b9SJussi Kivilinna 					.vecs = tf_xts_dec_tv_template,
3827aed265b9SJussi Kivilinna 					.count = TF_XTS_DEC_TEST_VECTORS
3828aed265b9SJussi Kivilinna 				}
3829aed265b9SJussi Kivilinna 			}
3830aed265b9SJussi Kivilinna 		}
3831aed265b9SJussi Kivilinna 	}, {
38320c01aed5SGeert Uytterhoeven 		.alg = "zlib",
38330c01aed5SGeert Uytterhoeven 		.test = alg_test_pcomp,
38340818904dSMilan Broz 		.fips_allowed = 1,
38350c01aed5SGeert Uytterhoeven 		.suite = {
38360c01aed5SGeert Uytterhoeven 			.pcomp = {
38370c01aed5SGeert Uytterhoeven 				.comp = {
38380c01aed5SGeert Uytterhoeven 					.vecs = zlib_comp_tv_template,
38390c01aed5SGeert Uytterhoeven 					.count = ZLIB_COMP_TEST_VECTORS
38400c01aed5SGeert Uytterhoeven 				},
38410c01aed5SGeert Uytterhoeven 				.decomp = {
38420c01aed5SGeert Uytterhoeven 					.vecs = zlib_decomp_tv_template,
38430c01aed5SGeert Uytterhoeven 					.count = ZLIB_DECOMP_TEST_VECTORS
38440c01aed5SGeert Uytterhoeven 				}
38450c01aed5SGeert Uytterhoeven 			}
38460c01aed5SGeert Uytterhoeven 		}
3847da7f033dSHerbert Xu 	}
3848da7f033dSHerbert Xu };
3849da7f033dSHerbert Xu 
38505714758bSJussi Kivilinna static bool alg_test_descs_checked;
38515714758bSJussi Kivilinna 
38525714758bSJussi Kivilinna static void alg_test_descs_check_order(void)
38535714758bSJussi Kivilinna {
38545714758bSJussi Kivilinna 	int i;
38555714758bSJussi Kivilinna 
38565714758bSJussi Kivilinna 	/* only check once */
38575714758bSJussi Kivilinna 	if (alg_test_descs_checked)
38585714758bSJussi Kivilinna 		return;
38595714758bSJussi Kivilinna 
38605714758bSJussi Kivilinna 	alg_test_descs_checked = true;
38615714758bSJussi Kivilinna 
38625714758bSJussi Kivilinna 	for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) {
38635714758bSJussi Kivilinna 		int diff = strcmp(alg_test_descs[i - 1].alg,
38645714758bSJussi Kivilinna 				  alg_test_descs[i].alg);
38655714758bSJussi Kivilinna 
38665714758bSJussi Kivilinna 		if (WARN_ON(diff > 0)) {
38675714758bSJussi Kivilinna 			pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n",
38685714758bSJussi Kivilinna 				alg_test_descs[i - 1].alg,
38695714758bSJussi Kivilinna 				alg_test_descs[i].alg);
38705714758bSJussi Kivilinna 		}
38715714758bSJussi Kivilinna 
38725714758bSJussi Kivilinna 		if (WARN_ON(diff == 0)) {
38735714758bSJussi Kivilinna 			pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n",
38745714758bSJussi Kivilinna 				alg_test_descs[i].alg);
38755714758bSJussi Kivilinna 		}
38765714758bSJussi Kivilinna 	}
38775714758bSJussi Kivilinna }
38785714758bSJussi Kivilinna 
38791aa4ecd9SHerbert Xu static int alg_find_test(const char *alg)
3880da7f033dSHerbert Xu {
3881da7f033dSHerbert Xu 	int start = 0;
3882da7f033dSHerbert Xu 	int end = ARRAY_SIZE(alg_test_descs);
3883da7f033dSHerbert Xu 
3884da7f033dSHerbert Xu 	while (start < end) {
3885da7f033dSHerbert Xu 		int i = (start + end) / 2;
3886da7f033dSHerbert Xu 		int diff = strcmp(alg_test_descs[i].alg, alg);
3887da7f033dSHerbert Xu 
3888da7f033dSHerbert Xu 		if (diff > 0) {
3889da7f033dSHerbert Xu 			end = i;
3890da7f033dSHerbert Xu 			continue;
3891da7f033dSHerbert Xu 		}
3892da7f033dSHerbert Xu 
3893da7f033dSHerbert Xu 		if (diff < 0) {
3894da7f033dSHerbert Xu 			start = i + 1;
3895da7f033dSHerbert Xu 			continue;
3896da7f033dSHerbert Xu 		}
3897da7f033dSHerbert Xu 
38981aa4ecd9SHerbert Xu 		return i;
3899da7f033dSHerbert Xu 	}
3900da7f033dSHerbert Xu 
39011aa4ecd9SHerbert Xu 	return -1;
39021aa4ecd9SHerbert Xu }
39031aa4ecd9SHerbert Xu 
39041aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
39051aa4ecd9SHerbert Xu {
39061aa4ecd9SHerbert Xu 	int i;
3907a68f6610SHerbert Xu 	int j;
3908d12d6b6dSNeil Horman 	int rc;
39091aa4ecd9SHerbert Xu 
39105714758bSJussi Kivilinna 	alg_test_descs_check_order();
39115714758bSJussi Kivilinna 
39121aa4ecd9SHerbert Xu 	if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
39131aa4ecd9SHerbert Xu 		char nalg[CRYPTO_MAX_ALG_NAME];
39141aa4ecd9SHerbert Xu 
39151aa4ecd9SHerbert Xu 		if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
39161aa4ecd9SHerbert Xu 		    sizeof(nalg))
39171aa4ecd9SHerbert Xu 			return -ENAMETOOLONG;
39181aa4ecd9SHerbert Xu 
39191aa4ecd9SHerbert Xu 		i = alg_find_test(nalg);
39201aa4ecd9SHerbert Xu 		if (i < 0)
39211aa4ecd9SHerbert Xu 			goto notest;
39221aa4ecd9SHerbert Xu 
3923a3bef3a3SJarod Wilson 		if (fips_enabled && !alg_test_descs[i].fips_allowed)
3924a3bef3a3SJarod Wilson 			goto non_fips_alg;
3925a3bef3a3SJarod Wilson 
3926941fb328SJarod Wilson 		rc = alg_test_cipher(alg_test_descs + i, driver, type, mask);
3927941fb328SJarod Wilson 		goto test_done;
39281aa4ecd9SHerbert Xu 	}
39291aa4ecd9SHerbert Xu 
39301aa4ecd9SHerbert Xu 	i = alg_find_test(alg);
3931a68f6610SHerbert Xu 	j = alg_find_test(driver);
3932a68f6610SHerbert Xu 	if (i < 0 && j < 0)
39331aa4ecd9SHerbert Xu 		goto notest;
39341aa4ecd9SHerbert Xu 
3935a68f6610SHerbert Xu 	if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
3936a68f6610SHerbert Xu 			     (j >= 0 && !alg_test_descs[j].fips_allowed)))
3937a3bef3a3SJarod Wilson 		goto non_fips_alg;
3938a3bef3a3SJarod Wilson 
3939a68f6610SHerbert Xu 	rc = 0;
3940a68f6610SHerbert Xu 	if (i >= 0)
3941a68f6610SHerbert Xu 		rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
39421aa4ecd9SHerbert Xu 					     type, mask);
3943032c8cacSCristian Stoica 	if (j >= 0 && j != i)
3944a68f6610SHerbert Xu 		rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
3945a68f6610SHerbert Xu 					     type, mask);
3946a68f6610SHerbert Xu 
3947941fb328SJarod Wilson test_done:
3948d12d6b6dSNeil Horman 	if (fips_enabled && rc)
3949d12d6b6dSNeil Horman 		panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
3950d12d6b6dSNeil Horman 
395129ecd4abSJarod Wilson 	if (fips_enabled && !rc)
39523e8cffd4SMasanari Iida 		pr_info("alg: self-tests for %s (%s) passed\n", driver, alg);
395329ecd4abSJarod Wilson 
3954d12d6b6dSNeil Horman 	return rc;
39551aa4ecd9SHerbert Xu 
39561aa4ecd9SHerbert Xu notest:
3957da7f033dSHerbert Xu 	printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
3958da7f033dSHerbert Xu 	return 0;
3959a3bef3a3SJarod Wilson non_fips_alg:
3960a3bef3a3SJarod Wilson 	return -EINVAL;
3961da7f033dSHerbert Xu }
39620b767f96SAlexander Shishkin 
3963326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
39640b767f96SAlexander Shishkin 
3965da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test);
3966