xref: /openbmc/linux/crypto/testmgr.c (revision 35351988)
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;
94384cba178SAndrey Ryabinin 	unsigned int ivsize = crypto_skcipher_ivsize(tfm);
944f8b0d4d0SHerbert Xu 
945f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
946f8b0d4d0SHerbert Xu 		goto out_nobuf;
947da7f033dSHerbert Xu 
94808d6af8cSJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
94908d6af8cSJussi Kivilinna 		goto out_nooutbuf;
95008d6af8cSJussi Kivilinna 
95108d6af8cSJussi Kivilinna 	if (diff_dst)
95208d6af8cSJussi Kivilinna 		d = "-ddst";
95308d6af8cSJussi Kivilinna 	else
95408d6af8cSJussi Kivilinna 		d = "";
95508d6af8cSJussi Kivilinna 
956da7f033dSHerbert Xu 	if (enc == ENCRYPT)
957da7f033dSHerbert Xu 	        e = "encryption";
958da7f033dSHerbert Xu 	else
959da7f033dSHerbert Xu 		e = "decryption";
960da7f033dSHerbert Xu 
961da7f033dSHerbert Xu 	init_completion(&result.completion);
962da7f033dSHerbert Xu 
96312773d93SHerbert Xu 	req = skcipher_request_alloc(tfm, GFP_KERNEL);
964da7f033dSHerbert Xu 	if (!req) {
96508d6af8cSJussi Kivilinna 		pr_err("alg: skcipher%s: Failed to allocate request for %s\n",
96608d6af8cSJussi Kivilinna 		       d, algo);
967da7f033dSHerbert Xu 		goto out;
968da7f033dSHerbert Xu 	}
969da7f033dSHerbert Xu 
97012773d93SHerbert Xu 	skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
971da7f033dSHerbert Xu 				      tcrypt_complete, &result);
972da7f033dSHerbert Xu 
973da7f033dSHerbert Xu 	j = 0;
974da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
975bbb9a7ddSCristian Stoica 		if (template[i].np && !template[i].also_non_np)
976bbb9a7ddSCristian Stoica 			continue;
977bbb9a7ddSCristian Stoica 
978da7f033dSHerbert Xu 		if (template[i].iv)
97984cba178SAndrey Ryabinin 			memcpy(iv, template[i].iv, ivsize);
980da7f033dSHerbert Xu 		else
981da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
982da7f033dSHerbert Xu 
983da7f033dSHerbert Xu 		j++;
984fd57f22aSHerbert Xu 		ret = -EINVAL;
985a1aa44a2SCristian Stoica 		if (WARN_ON(align_offset + template[i].ilen > PAGE_SIZE))
986fd57f22aSHerbert Xu 			goto out;
987fd57f22aSHerbert Xu 
988da7f033dSHerbert Xu 		data = xbuf[0];
9893a338f20SJussi Kivilinna 		data += align_offset;
990da7f033dSHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
991da7f033dSHerbert Xu 
99212773d93SHerbert Xu 		crypto_skcipher_clear_flags(tfm, ~0);
993da7f033dSHerbert Xu 		if (template[i].wk)
99412773d93SHerbert Xu 			crypto_skcipher_set_flags(tfm,
99512773d93SHerbert Xu 						  CRYPTO_TFM_REQ_WEAK_KEY);
996da7f033dSHerbert Xu 
99712773d93SHerbert Xu 		ret = crypto_skcipher_setkey(tfm, template[i].key,
998da7f033dSHerbert Xu 					     template[i].klen);
999da7f033dSHerbert Xu 		if (!ret == template[i].fail) {
100008d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n",
100112773d93SHerbert Xu 			       d, j, algo, crypto_skcipher_get_flags(tfm));
1002da7f033dSHerbert Xu 			goto out;
1003da7f033dSHerbert Xu 		} else if (ret)
1004da7f033dSHerbert Xu 			continue;
1005da7f033dSHerbert Xu 
1006da7f033dSHerbert Xu 		sg_init_one(&sg[0], data, template[i].ilen);
100708d6af8cSJussi Kivilinna 		if (diff_dst) {
100808d6af8cSJussi Kivilinna 			data = xoutbuf[0];
10093a338f20SJussi Kivilinna 			data += align_offset;
101008d6af8cSJussi Kivilinna 			sg_init_one(&sgout[0], data, template[i].ilen);
101108d6af8cSJussi Kivilinna 		}
1012da7f033dSHerbert Xu 
101312773d93SHerbert Xu 		skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1014da7f033dSHerbert Xu 					   template[i].ilen, iv);
101512773d93SHerbert Xu 		ret = enc ? crypto_skcipher_encrypt(req) :
101612773d93SHerbert Xu 			    crypto_skcipher_decrypt(req);
1017da7f033dSHerbert Xu 
1018da7f033dSHerbert Xu 		switch (ret) {
1019da7f033dSHerbert Xu 		case 0:
1020da7f033dSHerbert Xu 			break;
1021da7f033dSHerbert Xu 		case -EINPROGRESS:
1022da7f033dSHerbert Xu 		case -EBUSY:
10238a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
102416735d02SWolfram Sang 			reinit_completion(&result.completion);
10258a45ac12SRabin Vincent 			ret = result.err;
10268a45ac12SRabin Vincent 			if (!ret)
1027da7f033dSHerbert Xu 				break;
1028da7f033dSHerbert Xu 			/* fall through */
1029da7f033dSHerbert Xu 		default:
103008d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n",
103108d6af8cSJussi Kivilinna 			       d, e, j, algo, -ret);
1032da7f033dSHerbert Xu 			goto out;
1033da7f033dSHerbert Xu 		}
1034da7f033dSHerbert Xu 
1035da7f033dSHerbert Xu 		q = data;
1036da7f033dSHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
10378a826a34SBoris BREZILLON 			pr_err("alg: skcipher%s: Test %d failed (invalid result) on %s for %s\n",
103808d6af8cSJussi Kivilinna 			       d, j, e, algo);
1039da7f033dSHerbert Xu 			hexdump(q, template[i].rlen);
1040da7f033dSHerbert Xu 			ret = -EINVAL;
1041da7f033dSHerbert Xu 			goto out;
1042da7f033dSHerbert Xu 		}
10438a826a34SBoris BREZILLON 
10448a826a34SBoris BREZILLON 		if (template[i].iv_out &&
10458a826a34SBoris BREZILLON 		    memcmp(iv, template[i].iv_out,
10468a826a34SBoris BREZILLON 			   crypto_skcipher_ivsize(tfm))) {
10478a826a34SBoris BREZILLON 			pr_err("alg: skcipher%s: Test %d failed (invalid output IV) on %s for %s\n",
10488a826a34SBoris BREZILLON 			       d, j, e, algo);
10498a826a34SBoris BREZILLON 			hexdump(iv, crypto_skcipher_ivsize(tfm));
10508a826a34SBoris BREZILLON 			ret = -EINVAL;
10518a826a34SBoris BREZILLON 			goto out;
10528a826a34SBoris BREZILLON 		}
1053da7f033dSHerbert Xu 	}
1054da7f033dSHerbert Xu 
1055da7f033dSHerbert Xu 	j = 0;
1056da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
10573a338f20SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
10583a338f20SJussi Kivilinna 		if (align_offset != 0)
10593a338f20SJussi Kivilinna 			break;
1060da7f033dSHerbert Xu 
1061bbb9a7ddSCristian Stoica 		if (!template[i].np)
1062bbb9a7ddSCristian Stoica 			continue;
1063bbb9a7ddSCristian Stoica 
1064da7f033dSHerbert Xu 		if (template[i].iv)
106584cba178SAndrey Ryabinin 			memcpy(iv, template[i].iv, ivsize);
1066da7f033dSHerbert Xu 		else
1067da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
1068da7f033dSHerbert Xu 
1069da7f033dSHerbert Xu 		j++;
107012773d93SHerbert Xu 		crypto_skcipher_clear_flags(tfm, ~0);
1071da7f033dSHerbert Xu 		if (template[i].wk)
107212773d93SHerbert Xu 			crypto_skcipher_set_flags(tfm,
107312773d93SHerbert Xu 						  CRYPTO_TFM_REQ_WEAK_KEY);
1074da7f033dSHerbert Xu 
107512773d93SHerbert Xu 		ret = crypto_skcipher_setkey(tfm, template[i].key,
1076da7f033dSHerbert Xu 					     template[i].klen);
1077da7f033dSHerbert Xu 		if (!ret == template[i].fail) {
107808d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n",
107912773d93SHerbert Xu 			       d, j, algo, crypto_skcipher_get_flags(tfm));
1080da7f033dSHerbert Xu 			goto out;
1081da7f033dSHerbert Xu 		} else if (ret)
1082da7f033dSHerbert Xu 			continue;
1083da7f033dSHerbert Xu 
1084da7f033dSHerbert Xu 		temp = 0;
1085da7f033dSHerbert Xu 		ret = -EINVAL;
1086da7f033dSHerbert Xu 		sg_init_table(sg, template[i].np);
108708d6af8cSJussi Kivilinna 		if (diff_dst)
108808d6af8cSJussi Kivilinna 			sg_init_table(sgout, template[i].np);
1089da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
1090da7f033dSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
1091da7f033dSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
1092da7f033dSHerbert Xu 				goto out;
1093da7f033dSHerbert Xu 
1094a1aa44a2SCristian Stoica 			q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
1095da7f033dSHerbert Xu 
1096a1aa44a2SCristian Stoica 			memcpy(q, template[i].input + temp, template[i].tap[k]);
1097da7f033dSHerbert Xu 
1098a1aa44a2SCristian Stoica 			if (offset_in_page(q) + template[i].tap[k] < PAGE_SIZE)
1099da7f033dSHerbert Xu 				q[template[i].tap[k]] = 0;
1100da7f033dSHerbert Xu 
1101da7f033dSHerbert Xu 			sg_set_buf(&sg[k], q, template[i].tap[k]);
110208d6af8cSJussi Kivilinna 			if (diff_dst) {
110308d6af8cSJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
110408d6af8cSJussi Kivilinna 				    offset_in_page(IDX[k]);
110508d6af8cSJussi Kivilinna 
1106a1aa44a2SCristian Stoica 				sg_set_buf(&sgout[k], q, template[i].tap[k]);
110708d6af8cSJussi Kivilinna 
110808d6af8cSJussi Kivilinna 				memset(q, 0, template[i].tap[k]);
110908d6af8cSJussi Kivilinna 				if (offset_in_page(q) +
111008d6af8cSJussi Kivilinna 				    template[i].tap[k] < PAGE_SIZE)
111108d6af8cSJussi Kivilinna 					q[template[i].tap[k]] = 0;
111208d6af8cSJussi Kivilinna 			}
1113da7f033dSHerbert Xu 
1114da7f033dSHerbert Xu 			temp += template[i].tap[k];
1115da7f033dSHerbert Xu 		}
1116da7f033dSHerbert Xu 
111712773d93SHerbert Xu 		skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1118da7f033dSHerbert Xu 					   template[i].ilen, iv);
1119da7f033dSHerbert Xu 
112012773d93SHerbert Xu 		ret = enc ? crypto_skcipher_encrypt(req) :
112112773d93SHerbert Xu 			    crypto_skcipher_decrypt(req);
1122da7f033dSHerbert Xu 
1123da7f033dSHerbert Xu 		switch (ret) {
1124da7f033dSHerbert Xu 		case 0:
1125da7f033dSHerbert Xu 			break;
1126da7f033dSHerbert Xu 		case -EINPROGRESS:
1127da7f033dSHerbert Xu 		case -EBUSY:
11288a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
112916735d02SWolfram Sang 			reinit_completion(&result.completion);
11308a45ac12SRabin Vincent 			ret = result.err;
11318a45ac12SRabin Vincent 			if (!ret)
1132da7f033dSHerbert Xu 				break;
1133da7f033dSHerbert Xu 			/* fall through */
1134da7f033dSHerbert Xu 		default:
113508d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n",
113608d6af8cSJussi Kivilinna 			       d, e, j, algo, -ret);
1137da7f033dSHerbert Xu 			goto out;
1138da7f033dSHerbert Xu 		}
1139da7f033dSHerbert Xu 
1140da7f033dSHerbert Xu 		temp = 0;
1141da7f033dSHerbert Xu 		ret = -EINVAL;
1142da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
114308d6af8cSJussi Kivilinna 			if (diff_dst)
114408d6af8cSJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
114508d6af8cSJussi Kivilinna 				    offset_in_page(IDX[k]);
114608d6af8cSJussi Kivilinna 			else
1147da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
1148da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
1149da7f033dSHerbert Xu 
1150da7f033dSHerbert Xu 			if (memcmp(q, template[i].result + temp,
1151da7f033dSHerbert Xu 				   template[i].tap[k])) {
115208d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n",
115308d6af8cSJussi Kivilinna 				       d, j, e, k, algo);
1154da7f033dSHerbert Xu 				hexdump(q, template[i].tap[k]);
1155da7f033dSHerbert Xu 				goto out;
1156da7f033dSHerbert Xu 			}
1157da7f033dSHerbert Xu 
1158da7f033dSHerbert Xu 			q += template[i].tap[k];
1159da7f033dSHerbert Xu 			for (n = 0; offset_in_page(q + n) && q[n]; n++)
1160da7f033dSHerbert Xu 				;
1161da7f033dSHerbert Xu 			if (n) {
116208d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
116308d6af8cSJussi Kivilinna 				       d, j, e, k, algo, n);
1164da7f033dSHerbert Xu 				hexdump(q, n);
1165da7f033dSHerbert Xu 				goto out;
1166da7f033dSHerbert Xu 			}
1167da7f033dSHerbert Xu 			temp += template[i].tap[k];
1168da7f033dSHerbert Xu 		}
1169da7f033dSHerbert Xu 	}
1170da7f033dSHerbert Xu 
1171da7f033dSHerbert Xu 	ret = 0;
1172da7f033dSHerbert Xu 
1173da7f033dSHerbert Xu out:
117412773d93SHerbert Xu 	skcipher_request_free(req);
117508d6af8cSJussi Kivilinna 	if (diff_dst)
117608d6af8cSJussi Kivilinna 		testmgr_free_buf(xoutbuf);
117708d6af8cSJussi Kivilinna out_nooutbuf:
1178f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
1179f8b0d4d0SHerbert Xu out_nobuf:
1180da7f033dSHerbert Xu 	return ret;
1181da7f033dSHerbert Xu }
1182da7f033dSHerbert Xu 
118312773d93SHerbert Xu static int test_skcipher(struct crypto_skcipher *tfm, int enc,
118408d6af8cSJussi Kivilinna 			 struct cipher_testvec *template, unsigned int tcount)
118508d6af8cSJussi Kivilinna {
11863a338f20SJussi Kivilinna 	unsigned int alignmask;
118708d6af8cSJussi Kivilinna 	int ret;
118808d6af8cSJussi Kivilinna 
118908d6af8cSJussi Kivilinna 	/* test 'dst == src' case */
11903a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, false, 0);
119108d6af8cSJussi Kivilinna 	if (ret)
119208d6af8cSJussi Kivilinna 		return ret;
119308d6af8cSJussi Kivilinna 
119408d6af8cSJussi Kivilinna 	/* test 'dst != src' case */
11953a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 0);
11963a338f20SJussi Kivilinna 	if (ret)
11973a338f20SJussi Kivilinna 		return ret;
11983a338f20SJussi Kivilinna 
11993a338f20SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
12003a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 1);
12013a338f20SJussi Kivilinna 	if (ret)
12023a338f20SJussi Kivilinna 		return ret;
12033a338f20SJussi Kivilinna 
12043a338f20SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
12053a338f20SJussi Kivilinna 	if (alignmask) {
12063a338f20SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
12073a338f20SJussi Kivilinna 		ret = __test_skcipher(tfm, enc, template, tcount, true,
12083a338f20SJussi Kivilinna 				      alignmask + 1);
12093a338f20SJussi Kivilinna 		if (ret)
12103a338f20SJussi Kivilinna 			return ret;
12113a338f20SJussi Kivilinna 	}
12123a338f20SJussi Kivilinna 
12133a338f20SJussi Kivilinna 	return 0;
121408d6af8cSJussi Kivilinna }
121508d6af8cSJussi Kivilinna 
1216da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate,
1217da7f033dSHerbert Xu 		     struct comp_testvec *dtemplate, int ctcount, int dtcount)
1218da7f033dSHerbert Xu {
1219da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
1220da7f033dSHerbert Xu 	unsigned int i;
1221da7f033dSHerbert Xu 	char result[COMP_BUF_SIZE];
1222da7f033dSHerbert Xu 	int ret;
1223da7f033dSHerbert Xu 
1224da7f033dSHerbert Xu 	for (i = 0; i < ctcount; i++) {
1225c79cf910SGeert Uytterhoeven 		int ilen;
1226c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1227da7f033dSHerbert Xu 
1228da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1229da7f033dSHerbert Xu 
1230da7f033dSHerbert Xu 		ilen = ctemplate[i].inlen;
1231da7f033dSHerbert Xu 		ret = crypto_comp_compress(tfm, ctemplate[i].input,
1232da7f033dSHerbert Xu 		                           ilen, result, &dlen);
1233da7f033dSHerbert Xu 		if (ret) {
1234da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: compression failed "
1235da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1236da7f033dSHerbert Xu 			       -ret);
1237da7f033dSHerbert Xu 			goto out;
1238da7f033dSHerbert Xu 		}
1239da7f033dSHerbert Xu 
1240b812eb00SGeert Uytterhoeven 		if (dlen != ctemplate[i].outlen) {
1241b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Compression test %d "
1242b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1243b812eb00SGeert Uytterhoeven 			       dlen);
1244b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1245b812eb00SGeert Uytterhoeven 			goto out;
1246b812eb00SGeert Uytterhoeven 		}
1247b812eb00SGeert Uytterhoeven 
1248da7f033dSHerbert Xu 		if (memcmp(result, ctemplate[i].output, dlen)) {
1249da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Compression test %d "
1250da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1251da7f033dSHerbert Xu 			hexdump(result, dlen);
1252da7f033dSHerbert Xu 			ret = -EINVAL;
1253da7f033dSHerbert Xu 			goto out;
1254da7f033dSHerbert Xu 		}
1255da7f033dSHerbert Xu 	}
1256da7f033dSHerbert Xu 
1257da7f033dSHerbert Xu 	for (i = 0; i < dtcount; i++) {
1258c79cf910SGeert Uytterhoeven 		int ilen;
1259c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1260da7f033dSHerbert Xu 
1261da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1262da7f033dSHerbert Xu 
1263da7f033dSHerbert Xu 		ilen = dtemplate[i].inlen;
1264da7f033dSHerbert Xu 		ret = crypto_comp_decompress(tfm, dtemplate[i].input,
1265da7f033dSHerbert Xu 		                             ilen, result, &dlen);
1266da7f033dSHerbert Xu 		if (ret) {
1267da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: decompression failed "
1268da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1269da7f033dSHerbert Xu 			       -ret);
1270da7f033dSHerbert Xu 			goto out;
1271da7f033dSHerbert Xu 		}
1272da7f033dSHerbert Xu 
1273b812eb00SGeert Uytterhoeven 		if (dlen != dtemplate[i].outlen) {
1274b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Decompression test %d "
1275b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1276b812eb00SGeert Uytterhoeven 			       dlen);
1277b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1278b812eb00SGeert Uytterhoeven 			goto out;
1279b812eb00SGeert Uytterhoeven 		}
1280b812eb00SGeert Uytterhoeven 
1281da7f033dSHerbert Xu 		if (memcmp(result, dtemplate[i].output, dlen)) {
1282da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Decompression test %d "
1283da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1284da7f033dSHerbert Xu 			hexdump(result, dlen);
1285da7f033dSHerbert Xu 			ret = -EINVAL;
1286da7f033dSHerbert Xu 			goto out;
1287da7f033dSHerbert Xu 		}
1288da7f033dSHerbert Xu 	}
1289da7f033dSHerbert Xu 
1290da7f033dSHerbert Xu 	ret = 0;
1291da7f033dSHerbert Xu 
1292da7f033dSHerbert Xu out:
1293da7f033dSHerbert Xu 	return ret;
1294da7f033dSHerbert Xu }
1295da7f033dSHerbert Xu 
12968064efb8SGeert Uytterhoeven static int test_pcomp(struct crypto_pcomp *tfm,
12978064efb8SGeert Uytterhoeven 		      struct pcomp_testvec *ctemplate,
12988064efb8SGeert Uytterhoeven 		      struct pcomp_testvec *dtemplate, int ctcount,
12998064efb8SGeert Uytterhoeven 		      int dtcount)
13008064efb8SGeert Uytterhoeven {
13018064efb8SGeert Uytterhoeven 	const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm));
13028064efb8SGeert Uytterhoeven 	unsigned int i;
13038064efb8SGeert Uytterhoeven 	char result[COMP_BUF_SIZE];
13043ce858cbSGeert Uytterhoeven 	int res;
13058064efb8SGeert Uytterhoeven 
13068064efb8SGeert Uytterhoeven 	for (i = 0; i < ctcount; i++) {
13078064efb8SGeert Uytterhoeven 		struct comp_request req;
13083ce858cbSGeert Uytterhoeven 		unsigned int produced = 0;
13098064efb8SGeert Uytterhoeven 
13103ce858cbSGeert Uytterhoeven 		res = crypto_compress_setup(tfm, ctemplate[i].params,
13118064efb8SGeert Uytterhoeven 					    ctemplate[i].paramsize);
13123ce858cbSGeert Uytterhoeven 		if (res) {
13138064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression setup failed on test "
13143ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13153ce858cbSGeert Uytterhoeven 			return res;
13168064efb8SGeert Uytterhoeven 		}
13178064efb8SGeert Uytterhoeven 
13183ce858cbSGeert Uytterhoeven 		res = crypto_compress_init(tfm);
13193ce858cbSGeert Uytterhoeven 		if (res) {
13208064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression init failed on test "
13213ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13223ce858cbSGeert Uytterhoeven 			return res;
13238064efb8SGeert Uytterhoeven 		}
13248064efb8SGeert Uytterhoeven 
13258064efb8SGeert Uytterhoeven 		memset(result, 0, sizeof(result));
13268064efb8SGeert Uytterhoeven 
13278064efb8SGeert Uytterhoeven 		req.next_in = ctemplate[i].input;
13288064efb8SGeert Uytterhoeven 		req.avail_in = ctemplate[i].inlen / 2;
13298064efb8SGeert Uytterhoeven 		req.next_out = result;
13308064efb8SGeert Uytterhoeven 		req.avail_out = ctemplate[i].outlen / 2;
13318064efb8SGeert Uytterhoeven 
13323ce858cbSGeert Uytterhoeven 		res = crypto_compress_update(tfm, &req);
13333ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
13348064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression update failed on test "
13353ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13363ce858cbSGeert Uytterhoeven 			return res;
13378064efb8SGeert Uytterhoeven 		}
13383ce858cbSGeert Uytterhoeven 		if (res > 0)
13393ce858cbSGeert Uytterhoeven 			produced += res;
13408064efb8SGeert Uytterhoeven 
13418064efb8SGeert Uytterhoeven 		/* Add remaining input data */
13428064efb8SGeert Uytterhoeven 		req.avail_in += (ctemplate[i].inlen + 1) / 2;
13438064efb8SGeert Uytterhoeven 
13443ce858cbSGeert Uytterhoeven 		res = crypto_compress_update(tfm, &req);
13453ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
13468064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression update failed on test "
13473ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13483ce858cbSGeert Uytterhoeven 			return res;
13498064efb8SGeert Uytterhoeven 		}
13503ce858cbSGeert Uytterhoeven 		if (res > 0)
13513ce858cbSGeert Uytterhoeven 			produced += res;
13528064efb8SGeert Uytterhoeven 
13538064efb8SGeert Uytterhoeven 		/* Provide remaining output space */
13548064efb8SGeert Uytterhoeven 		req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2;
13558064efb8SGeert Uytterhoeven 
13563ce858cbSGeert Uytterhoeven 		res = crypto_compress_final(tfm, &req);
13573ce858cbSGeert Uytterhoeven 		if (res < 0) {
13588064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression final failed on test "
13593ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13603ce858cbSGeert Uytterhoeven 			return res;
13618064efb8SGeert Uytterhoeven 		}
13623ce858cbSGeert Uytterhoeven 		produced += res;
13638064efb8SGeert Uytterhoeven 
13648064efb8SGeert Uytterhoeven 		if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) {
13658064efb8SGeert Uytterhoeven 			pr_err("alg: comp: Compression test %d failed for %s: "
13668064efb8SGeert Uytterhoeven 			       "output len = %d (expected %d)\n", i + 1, algo,
13678064efb8SGeert Uytterhoeven 			       COMP_BUF_SIZE - req.avail_out,
13688064efb8SGeert Uytterhoeven 			       ctemplate[i].outlen);
13698064efb8SGeert Uytterhoeven 			return -EINVAL;
13708064efb8SGeert Uytterhoeven 		}
13718064efb8SGeert Uytterhoeven 
13723ce858cbSGeert Uytterhoeven 		if (produced != ctemplate[i].outlen) {
13733ce858cbSGeert Uytterhoeven 			pr_err("alg: comp: Compression test %d failed for %s: "
13743ce858cbSGeert Uytterhoeven 			       "returned len = %u (expected %d)\n", i + 1,
13753ce858cbSGeert Uytterhoeven 			       algo, produced, ctemplate[i].outlen);
13763ce858cbSGeert Uytterhoeven 			return -EINVAL;
13773ce858cbSGeert Uytterhoeven 		}
13783ce858cbSGeert Uytterhoeven 
13798064efb8SGeert Uytterhoeven 		if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) {
13808064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: Compression test %d failed for "
13818064efb8SGeert Uytterhoeven 			       "%s\n", i + 1, algo);
13828064efb8SGeert Uytterhoeven 			hexdump(result, ctemplate[i].outlen);
13838064efb8SGeert Uytterhoeven 			return -EINVAL;
13848064efb8SGeert Uytterhoeven 		}
13858064efb8SGeert Uytterhoeven 	}
13868064efb8SGeert Uytterhoeven 
13878064efb8SGeert Uytterhoeven 	for (i = 0; i < dtcount; i++) {
13888064efb8SGeert Uytterhoeven 		struct comp_request req;
13893ce858cbSGeert Uytterhoeven 		unsigned int produced = 0;
13908064efb8SGeert Uytterhoeven 
13913ce858cbSGeert Uytterhoeven 		res = crypto_decompress_setup(tfm, dtemplate[i].params,
13928064efb8SGeert Uytterhoeven 					      dtemplate[i].paramsize);
13933ce858cbSGeert Uytterhoeven 		if (res) {
13948064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression setup failed on "
13953ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
13963ce858cbSGeert Uytterhoeven 			return res;
13978064efb8SGeert Uytterhoeven 		}
13988064efb8SGeert Uytterhoeven 
13993ce858cbSGeert Uytterhoeven 		res = crypto_decompress_init(tfm);
14003ce858cbSGeert Uytterhoeven 		if (res) {
14018064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression init failed on test "
14023ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
14033ce858cbSGeert Uytterhoeven 			return res;
14048064efb8SGeert Uytterhoeven 		}
14058064efb8SGeert Uytterhoeven 
14068064efb8SGeert Uytterhoeven 		memset(result, 0, sizeof(result));
14078064efb8SGeert Uytterhoeven 
14088064efb8SGeert Uytterhoeven 		req.next_in = dtemplate[i].input;
14098064efb8SGeert Uytterhoeven 		req.avail_in = dtemplate[i].inlen / 2;
14108064efb8SGeert Uytterhoeven 		req.next_out = result;
14118064efb8SGeert Uytterhoeven 		req.avail_out = dtemplate[i].outlen / 2;
14128064efb8SGeert Uytterhoeven 
14133ce858cbSGeert Uytterhoeven 		res = crypto_decompress_update(tfm, &req);
14143ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
14158064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression update failed on "
14163ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
14173ce858cbSGeert Uytterhoeven 			return res;
14188064efb8SGeert Uytterhoeven 		}
14193ce858cbSGeert Uytterhoeven 		if (res > 0)
14203ce858cbSGeert Uytterhoeven 			produced += res;
14218064efb8SGeert Uytterhoeven 
14228064efb8SGeert Uytterhoeven 		/* Add remaining input data */
14238064efb8SGeert Uytterhoeven 		req.avail_in += (dtemplate[i].inlen + 1) / 2;
14248064efb8SGeert Uytterhoeven 
14253ce858cbSGeert Uytterhoeven 		res = crypto_decompress_update(tfm, &req);
14263ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
14278064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression update failed on "
14283ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
14293ce858cbSGeert Uytterhoeven 			return res;
14308064efb8SGeert Uytterhoeven 		}
14313ce858cbSGeert Uytterhoeven 		if (res > 0)
14323ce858cbSGeert Uytterhoeven 			produced += res;
14338064efb8SGeert Uytterhoeven 
14348064efb8SGeert Uytterhoeven 		/* Provide remaining output space */
14358064efb8SGeert Uytterhoeven 		req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2;
14368064efb8SGeert Uytterhoeven 
14373ce858cbSGeert Uytterhoeven 		res = crypto_decompress_final(tfm, &req);
14383ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
14398064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression final failed on "
14403ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
14413ce858cbSGeert Uytterhoeven 			return res;
14428064efb8SGeert Uytterhoeven 		}
14433ce858cbSGeert Uytterhoeven 		if (res > 0)
14443ce858cbSGeert Uytterhoeven 			produced += res;
14458064efb8SGeert Uytterhoeven 
14468064efb8SGeert Uytterhoeven 		if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) {
14478064efb8SGeert Uytterhoeven 			pr_err("alg: comp: Decompression test %d failed for "
14488064efb8SGeert Uytterhoeven 			       "%s: output len = %d (expected %d)\n", i + 1,
14498064efb8SGeert Uytterhoeven 			       algo, COMP_BUF_SIZE - req.avail_out,
14508064efb8SGeert Uytterhoeven 			       dtemplate[i].outlen);
14518064efb8SGeert Uytterhoeven 			return -EINVAL;
14528064efb8SGeert Uytterhoeven 		}
14538064efb8SGeert Uytterhoeven 
14543ce858cbSGeert Uytterhoeven 		if (produced != dtemplate[i].outlen) {
14553ce858cbSGeert Uytterhoeven 			pr_err("alg: comp: Decompression test %d failed for "
14563ce858cbSGeert Uytterhoeven 			       "%s: returned len = %u (expected %d)\n", i + 1,
14573ce858cbSGeert Uytterhoeven 			       algo, produced, dtemplate[i].outlen);
14583ce858cbSGeert Uytterhoeven 			return -EINVAL;
14593ce858cbSGeert Uytterhoeven 		}
14603ce858cbSGeert Uytterhoeven 
14618064efb8SGeert Uytterhoeven 		if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) {
14628064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: Decompression test %d failed for "
14638064efb8SGeert Uytterhoeven 			       "%s\n", i + 1, algo);
14648064efb8SGeert Uytterhoeven 			hexdump(result, dtemplate[i].outlen);
14658064efb8SGeert Uytterhoeven 			return -EINVAL;
14668064efb8SGeert Uytterhoeven 		}
14678064efb8SGeert Uytterhoeven 	}
14688064efb8SGeert Uytterhoeven 
14698064efb8SGeert Uytterhoeven 	return 0;
14708064efb8SGeert Uytterhoeven }
14718064efb8SGeert Uytterhoeven 
14727647d6ceSJarod Wilson 
14737647d6ceSJarod Wilson static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template,
14747647d6ceSJarod Wilson 		      unsigned int tcount)
14757647d6ceSJarod Wilson {
14767647d6ceSJarod Wilson 	const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
1477fa4ef8a6SFelipe Contreras 	int err = 0, i, j, seedsize;
14787647d6ceSJarod Wilson 	u8 *seed;
14797647d6ceSJarod Wilson 	char result[32];
14807647d6ceSJarod Wilson 
14817647d6ceSJarod Wilson 	seedsize = crypto_rng_seedsize(tfm);
14827647d6ceSJarod Wilson 
14837647d6ceSJarod Wilson 	seed = kmalloc(seedsize, GFP_KERNEL);
14847647d6ceSJarod Wilson 	if (!seed) {
14857647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to allocate seed space "
14867647d6ceSJarod Wilson 		       "for %s\n", algo);
14877647d6ceSJarod Wilson 		return -ENOMEM;
14887647d6ceSJarod Wilson 	}
14897647d6ceSJarod Wilson 
14907647d6ceSJarod Wilson 	for (i = 0; i < tcount; i++) {
14917647d6ceSJarod Wilson 		memset(result, 0, 32);
14927647d6ceSJarod Wilson 
14937647d6ceSJarod Wilson 		memcpy(seed, template[i].v, template[i].vlen);
14947647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen, template[i].key,
14957647d6ceSJarod Wilson 		       template[i].klen);
14967647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen + template[i].klen,
14977647d6ceSJarod Wilson 		       template[i].dt, template[i].dtlen);
14987647d6ceSJarod Wilson 
14997647d6ceSJarod Wilson 		err = crypto_rng_reset(tfm, seed, seedsize);
15007647d6ceSJarod Wilson 		if (err) {
15017647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Failed to reset rng "
15027647d6ceSJarod Wilson 			       "for %s\n", algo);
15037647d6ceSJarod Wilson 			goto out;
15047647d6ceSJarod Wilson 		}
15057647d6ceSJarod Wilson 
15067647d6ceSJarod Wilson 		for (j = 0; j < template[i].loops; j++) {
15077647d6ceSJarod Wilson 			err = crypto_rng_get_bytes(tfm, result,
15087647d6ceSJarod Wilson 						   template[i].rlen);
150919e60e13SStephan Mueller 			if (err < 0) {
15107647d6ceSJarod Wilson 				printk(KERN_ERR "alg: cprng: Failed to obtain "
15117647d6ceSJarod Wilson 				       "the correct amount of random data for "
151219e60e13SStephan Mueller 				       "%s (requested %d)\n", algo,
151319e60e13SStephan Mueller 				       template[i].rlen);
15147647d6ceSJarod Wilson 				goto out;
15157647d6ceSJarod Wilson 			}
15167647d6ceSJarod Wilson 		}
15177647d6ceSJarod Wilson 
15187647d6ceSJarod Wilson 		err = memcmp(result, template[i].result,
15197647d6ceSJarod Wilson 			     template[i].rlen);
15207647d6ceSJarod Wilson 		if (err) {
15217647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Test %d failed for %s\n",
15227647d6ceSJarod Wilson 			       i, algo);
15237647d6ceSJarod Wilson 			hexdump(result, template[i].rlen);
15247647d6ceSJarod Wilson 			err = -EINVAL;
15257647d6ceSJarod Wilson 			goto out;
15267647d6ceSJarod Wilson 		}
15277647d6ceSJarod Wilson 	}
15287647d6ceSJarod Wilson 
15297647d6ceSJarod Wilson out:
15307647d6ceSJarod Wilson 	kfree(seed);
15317647d6ceSJarod Wilson 	return err;
15327647d6ceSJarod Wilson }
15337647d6ceSJarod Wilson 
1534da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
1535da7f033dSHerbert Xu 			 u32 type, u32 mask)
1536da7f033dSHerbert Xu {
1537da7f033dSHerbert Xu 	struct crypto_aead *tfm;
1538da7f033dSHerbert Xu 	int err = 0;
1539da7f033dSHerbert Xu 
1540425a8829SStephan Mueller 	tfm = crypto_alloc_aead(driver, type | CRYPTO_ALG_INTERNAL, mask);
1541da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1542da7f033dSHerbert Xu 		printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
1543da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1544da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1545da7f033dSHerbert Xu 	}
1546da7f033dSHerbert Xu 
1547da7f033dSHerbert Xu 	if (desc->suite.aead.enc.vecs) {
1548da7f033dSHerbert Xu 		err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
1549da7f033dSHerbert Xu 				desc->suite.aead.enc.count);
1550da7f033dSHerbert Xu 		if (err)
1551da7f033dSHerbert Xu 			goto out;
1552da7f033dSHerbert Xu 	}
1553da7f033dSHerbert Xu 
1554da7f033dSHerbert Xu 	if (!err && desc->suite.aead.dec.vecs)
1555da7f033dSHerbert Xu 		err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
1556da7f033dSHerbert Xu 				desc->suite.aead.dec.count);
1557da7f033dSHerbert Xu 
1558da7f033dSHerbert Xu out:
1559da7f033dSHerbert Xu 	crypto_free_aead(tfm);
1560da7f033dSHerbert Xu 	return err;
1561da7f033dSHerbert Xu }
1562da7f033dSHerbert Xu 
1563da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc,
1564da7f033dSHerbert Xu 			   const char *driver, u32 type, u32 mask)
1565da7f033dSHerbert Xu {
15661aa4ecd9SHerbert Xu 	struct crypto_cipher *tfm;
1567da7f033dSHerbert Xu 	int err = 0;
1568da7f033dSHerbert Xu 
1569425a8829SStephan Mueller 	tfm = crypto_alloc_cipher(driver, type | CRYPTO_ALG_INTERNAL, mask);
1570da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1571da7f033dSHerbert Xu 		printk(KERN_ERR "alg: cipher: Failed to load transform for "
1572da7f033dSHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
1573da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1574da7f033dSHerbert Xu 	}
1575da7f033dSHerbert Xu 
1576da7f033dSHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
1577da7f033dSHerbert Xu 		err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1578da7f033dSHerbert Xu 				  desc->suite.cipher.enc.count);
1579da7f033dSHerbert Xu 		if (err)
1580da7f033dSHerbert Xu 			goto out;
1581da7f033dSHerbert Xu 	}
1582da7f033dSHerbert Xu 
1583da7f033dSHerbert Xu 	if (desc->suite.cipher.dec.vecs)
1584da7f033dSHerbert Xu 		err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1585da7f033dSHerbert Xu 				  desc->suite.cipher.dec.count);
1586da7f033dSHerbert Xu 
1587da7f033dSHerbert Xu out:
15881aa4ecd9SHerbert Xu 	crypto_free_cipher(tfm);
15891aa4ecd9SHerbert Xu 	return err;
15901aa4ecd9SHerbert Xu }
15911aa4ecd9SHerbert Xu 
15921aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc,
15931aa4ecd9SHerbert Xu 			     const char *driver, u32 type, u32 mask)
15941aa4ecd9SHerbert Xu {
159512773d93SHerbert Xu 	struct crypto_skcipher *tfm;
15961aa4ecd9SHerbert Xu 	int err = 0;
15971aa4ecd9SHerbert Xu 
159812773d93SHerbert Xu 	tfm = crypto_alloc_skcipher(driver, type | CRYPTO_ALG_INTERNAL, mask);
15991aa4ecd9SHerbert Xu 	if (IS_ERR(tfm)) {
16001aa4ecd9SHerbert Xu 		printk(KERN_ERR "alg: skcipher: Failed to load transform for "
16011aa4ecd9SHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
16021aa4ecd9SHerbert Xu 		return PTR_ERR(tfm);
16031aa4ecd9SHerbert Xu 	}
16041aa4ecd9SHerbert Xu 
16051aa4ecd9SHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
16061aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
16071aa4ecd9SHerbert Xu 				    desc->suite.cipher.enc.count);
16081aa4ecd9SHerbert Xu 		if (err)
16091aa4ecd9SHerbert Xu 			goto out;
16101aa4ecd9SHerbert Xu 	}
16111aa4ecd9SHerbert Xu 
16121aa4ecd9SHerbert Xu 	if (desc->suite.cipher.dec.vecs)
16131aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
16141aa4ecd9SHerbert Xu 				    desc->suite.cipher.dec.count);
16151aa4ecd9SHerbert Xu 
16161aa4ecd9SHerbert Xu out:
161712773d93SHerbert Xu 	crypto_free_skcipher(tfm);
1618da7f033dSHerbert Xu 	return err;
1619da7f033dSHerbert Xu }
1620da7f033dSHerbert Xu 
1621da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
1622da7f033dSHerbert Xu 			 u32 type, u32 mask)
1623da7f033dSHerbert Xu {
1624da7f033dSHerbert Xu 	struct crypto_comp *tfm;
1625da7f033dSHerbert Xu 	int err;
1626da7f033dSHerbert Xu 
1627da7f033dSHerbert Xu 	tfm = crypto_alloc_comp(driver, type, mask);
1628da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1629da7f033dSHerbert Xu 		printk(KERN_ERR "alg: comp: Failed to load transform for %s: "
1630da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1631da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1632da7f033dSHerbert Xu 	}
1633da7f033dSHerbert Xu 
1634da7f033dSHerbert Xu 	err = test_comp(tfm, desc->suite.comp.comp.vecs,
1635da7f033dSHerbert Xu 			desc->suite.comp.decomp.vecs,
1636da7f033dSHerbert Xu 			desc->suite.comp.comp.count,
1637da7f033dSHerbert Xu 			desc->suite.comp.decomp.count);
1638da7f033dSHerbert Xu 
1639da7f033dSHerbert Xu 	crypto_free_comp(tfm);
1640da7f033dSHerbert Xu 	return err;
1641da7f033dSHerbert Xu }
1642da7f033dSHerbert Xu 
16438064efb8SGeert Uytterhoeven static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver,
16448064efb8SGeert Uytterhoeven 			  u32 type, u32 mask)
16458064efb8SGeert Uytterhoeven {
16468064efb8SGeert Uytterhoeven 	struct crypto_pcomp *tfm;
16478064efb8SGeert Uytterhoeven 	int err;
16488064efb8SGeert Uytterhoeven 
16498064efb8SGeert Uytterhoeven 	tfm = crypto_alloc_pcomp(driver, type, mask);
16508064efb8SGeert Uytterhoeven 	if (IS_ERR(tfm)) {
16518064efb8SGeert Uytterhoeven 		pr_err("alg: pcomp: Failed to load transform for %s: %ld\n",
16528064efb8SGeert Uytterhoeven 		       driver, PTR_ERR(tfm));
16538064efb8SGeert Uytterhoeven 		return PTR_ERR(tfm);
16548064efb8SGeert Uytterhoeven 	}
16558064efb8SGeert Uytterhoeven 
16568064efb8SGeert Uytterhoeven 	err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs,
16578064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.decomp.vecs,
16588064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.comp.count,
16598064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.decomp.count);
16608064efb8SGeert Uytterhoeven 
16618064efb8SGeert Uytterhoeven 	crypto_free_pcomp(tfm);
16628064efb8SGeert Uytterhoeven 	return err;
16638064efb8SGeert Uytterhoeven }
16648064efb8SGeert Uytterhoeven 
1665da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
1666da7f033dSHerbert Xu 			 u32 type, u32 mask)
1667da7f033dSHerbert Xu {
1668da7f033dSHerbert Xu 	struct crypto_ahash *tfm;
1669da7f033dSHerbert Xu 	int err;
1670da7f033dSHerbert Xu 
1671425a8829SStephan Mueller 	tfm = crypto_alloc_ahash(driver, type | CRYPTO_ALG_INTERNAL, mask);
1672da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1673da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
1674da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1675da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1676da7f033dSHerbert Xu 	}
1677da7f033dSHerbert Xu 
1678a8f1a052SDavid S. Miller 	err = test_hash(tfm, desc->suite.hash.vecs,
1679a8f1a052SDavid S. Miller 			desc->suite.hash.count, true);
1680a8f1a052SDavid S. Miller 	if (!err)
1681a8f1a052SDavid S. Miller 		err = test_hash(tfm, desc->suite.hash.vecs,
1682a8f1a052SDavid S. Miller 				desc->suite.hash.count, false);
1683da7f033dSHerbert Xu 
1684da7f033dSHerbert Xu 	crypto_free_ahash(tfm);
1685da7f033dSHerbert Xu 	return err;
1686da7f033dSHerbert Xu }
1687da7f033dSHerbert Xu 
16888e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc,
16898e3ee85eSHerbert Xu 			   const char *driver, u32 type, u32 mask)
16908e3ee85eSHerbert Xu {
16918e3ee85eSHerbert Xu 	struct crypto_shash *tfm;
16928e3ee85eSHerbert Xu 	u32 val;
16938e3ee85eSHerbert Xu 	int err;
16948e3ee85eSHerbert Xu 
16958e3ee85eSHerbert Xu 	err = alg_test_hash(desc, driver, type, mask);
16968e3ee85eSHerbert Xu 	if (err)
16978e3ee85eSHerbert Xu 		goto out;
16988e3ee85eSHerbert Xu 
1699425a8829SStephan Mueller 	tfm = crypto_alloc_shash(driver, type | CRYPTO_ALG_INTERNAL, mask);
17008e3ee85eSHerbert Xu 	if (IS_ERR(tfm)) {
17018e3ee85eSHerbert Xu 		printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
17028e3ee85eSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
17038e3ee85eSHerbert Xu 		err = PTR_ERR(tfm);
17048e3ee85eSHerbert Xu 		goto out;
17058e3ee85eSHerbert Xu 	}
17068e3ee85eSHerbert Xu 
17078e3ee85eSHerbert Xu 	do {
17084c5c3024SJan-Simon Möller 		SHASH_DESC_ON_STACK(shash, tfm);
17094c5c3024SJan-Simon Möller 		u32 *ctx = (u32 *)shash_desc_ctx(shash);
17108e3ee85eSHerbert Xu 
17114c5c3024SJan-Simon Möller 		shash->tfm = tfm;
17124c5c3024SJan-Simon Möller 		shash->flags = 0;
17138e3ee85eSHerbert Xu 
17144c5c3024SJan-Simon Möller 		*ctx = le32_to_cpu(420553207);
17154c5c3024SJan-Simon Möller 		err = crypto_shash_final(shash, (u8 *)&val);
17168e3ee85eSHerbert Xu 		if (err) {
17178e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Operation failed for "
17188e3ee85eSHerbert Xu 			       "%s: %d\n", driver, err);
17198e3ee85eSHerbert Xu 			break;
17208e3ee85eSHerbert Xu 		}
17218e3ee85eSHerbert Xu 
17228e3ee85eSHerbert Xu 		if (val != ~420553207) {
17238e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Test failed for %s: "
17248e3ee85eSHerbert Xu 			       "%d\n", driver, val);
17258e3ee85eSHerbert Xu 			err = -EINVAL;
17268e3ee85eSHerbert Xu 		}
17278e3ee85eSHerbert Xu 	} while (0);
17288e3ee85eSHerbert Xu 
17298e3ee85eSHerbert Xu 	crypto_free_shash(tfm);
17308e3ee85eSHerbert Xu 
17318e3ee85eSHerbert Xu out:
17328e3ee85eSHerbert Xu 	return err;
17338e3ee85eSHerbert Xu }
17348e3ee85eSHerbert Xu 
17357647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
17367647d6ceSJarod Wilson 			  u32 type, u32 mask)
17377647d6ceSJarod Wilson {
17387647d6ceSJarod Wilson 	struct crypto_rng *rng;
17397647d6ceSJarod Wilson 	int err;
17407647d6ceSJarod Wilson 
1741425a8829SStephan Mueller 	rng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask);
17427647d6ceSJarod Wilson 	if (IS_ERR(rng)) {
17437647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
17447647d6ceSJarod Wilson 		       "%ld\n", driver, PTR_ERR(rng));
17457647d6ceSJarod Wilson 		return PTR_ERR(rng);
17467647d6ceSJarod Wilson 	}
17477647d6ceSJarod Wilson 
17487647d6ceSJarod Wilson 	err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count);
17497647d6ceSJarod Wilson 
17507647d6ceSJarod Wilson 	crypto_free_rng(rng);
17517647d6ceSJarod Wilson 
17527647d6ceSJarod Wilson 	return err;
17537647d6ceSJarod Wilson }
17547647d6ceSJarod Wilson 
175564d1cdfbSStephan Mueller 
175664d1cdfbSStephan Mueller static int drbg_cavs_test(struct drbg_testvec *test, int pr,
175764d1cdfbSStephan Mueller 			  const char *driver, u32 type, u32 mask)
175864d1cdfbSStephan Mueller {
175964d1cdfbSStephan Mueller 	int ret = -EAGAIN;
176064d1cdfbSStephan Mueller 	struct crypto_rng *drng;
176164d1cdfbSStephan Mueller 	struct drbg_test_data test_data;
176264d1cdfbSStephan Mueller 	struct drbg_string addtl, pers, testentropy;
176364d1cdfbSStephan Mueller 	unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL);
176464d1cdfbSStephan Mueller 
176564d1cdfbSStephan Mueller 	if (!buf)
176664d1cdfbSStephan Mueller 		return -ENOMEM;
176764d1cdfbSStephan Mueller 
1768425a8829SStephan Mueller 	drng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask);
176964d1cdfbSStephan Mueller 	if (IS_ERR(drng)) {
177064d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for "
177164d1cdfbSStephan Mueller 		       "%s\n", driver);
177264d1cdfbSStephan Mueller 		kzfree(buf);
177364d1cdfbSStephan Mueller 		return -ENOMEM;
177464d1cdfbSStephan Mueller 	}
177564d1cdfbSStephan Mueller 
177664d1cdfbSStephan Mueller 	test_data.testentropy = &testentropy;
177764d1cdfbSStephan Mueller 	drbg_string_fill(&testentropy, test->entropy, test->entropylen);
177864d1cdfbSStephan Mueller 	drbg_string_fill(&pers, test->pers, test->perslen);
177964d1cdfbSStephan Mueller 	ret = crypto_drbg_reset_test(drng, &pers, &test_data);
178064d1cdfbSStephan Mueller 	if (ret) {
178164d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: Failed to reset rng\n");
178264d1cdfbSStephan Mueller 		goto outbuf;
178364d1cdfbSStephan Mueller 	}
178464d1cdfbSStephan Mueller 
178564d1cdfbSStephan Mueller 	drbg_string_fill(&addtl, test->addtla, test->addtllen);
178664d1cdfbSStephan Mueller 	if (pr) {
178764d1cdfbSStephan Mueller 		drbg_string_fill(&testentropy, test->entpra, test->entprlen);
178864d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl_test(drng,
178964d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl,	&test_data);
179064d1cdfbSStephan Mueller 	} else {
179164d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl(drng,
179264d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl);
179364d1cdfbSStephan Mueller 	}
179419e60e13SStephan Mueller 	if (ret < 0) {
179564d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not obtain random data for "
179664d1cdfbSStephan Mueller 		       "driver %s\n", driver);
179764d1cdfbSStephan Mueller 		goto outbuf;
179864d1cdfbSStephan Mueller 	}
179964d1cdfbSStephan Mueller 
180064d1cdfbSStephan Mueller 	drbg_string_fill(&addtl, test->addtlb, test->addtllen);
180164d1cdfbSStephan Mueller 	if (pr) {
180264d1cdfbSStephan Mueller 		drbg_string_fill(&testentropy, test->entprb, test->entprlen);
180364d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl_test(drng,
180464d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl, &test_data);
180564d1cdfbSStephan Mueller 	} else {
180664d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl(drng,
180764d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl);
180864d1cdfbSStephan Mueller 	}
180919e60e13SStephan Mueller 	if (ret < 0) {
181064d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not obtain random data for "
181164d1cdfbSStephan Mueller 		       "driver %s\n", driver);
181264d1cdfbSStephan Mueller 		goto outbuf;
181364d1cdfbSStephan Mueller 	}
181464d1cdfbSStephan Mueller 
181564d1cdfbSStephan Mueller 	ret = memcmp(test->expected, buf, test->expectedlen);
181664d1cdfbSStephan Mueller 
181764d1cdfbSStephan Mueller outbuf:
181864d1cdfbSStephan Mueller 	crypto_free_rng(drng);
181964d1cdfbSStephan Mueller 	kzfree(buf);
182064d1cdfbSStephan Mueller 	return ret;
182164d1cdfbSStephan Mueller }
182264d1cdfbSStephan Mueller 
182364d1cdfbSStephan Mueller 
182464d1cdfbSStephan Mueller static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver,
182564d1cdfbSStephan Mueller 			 u32 type, u32 mask)
182664d1cdfbSStephan Mueller {
182764d1cdfbSStephan Mueller 	int err = 0;
182864d1cdfbSStephan Mueller 	int pr = 0;
182964d1cdfbSStephan Mueller 	int i = 0;
183064d1cdfbSStephan Mueller 	struct drbg_testvec *template = desc->suite.drbg.vecs;
183164d1cdfbSStephan Mueller 	unsigned int tcount = desc->suite.drbg.count;
183264d1cdfbSStephan Mueller 
183364d1cdfbSStephan Mueller 	if (0 == memcmp(driver, "drbg_pr_", 8))
183464d1cdfbSStephan Mueller 		pr = 1;
183564d1cdfbSStephan Mueller 
183664d1cdfbSStephan Mueller 	for (i = 0; i < tcount; i++) {
183764d1cdfbSStephan Mueller 		err = drbg_cavs_test(&template[i], pr, driver, type, mask);
183864d1cdfbSStephan Mueller 		if (err) {
183964d1cdfbSStephan Mueller 			printk(KERN_ERR "alg: drbg: Test %d failed for %s\n",
184064d1cdfbSStephan Mueller 			       i, driver);
184164d1cdfbSStephan Mueller 			err = -EINVAL;
184264d1cdfbSStephan Mueller 			break;
184364d1cdfbSStephan Mueller 		}
184464d1cdfbSStephan Mueller 	}
184564d1cdfbSStephan Mueller 	return err;
184664d1cdfbSStephan Mueller 
184764d1cdfbSStephan Mueller }
184864d1cdfbSStephan Mueller 
1849946cc463STadeusz Struk static int do_test_rsa(struct crypto_akcipher *tfm,
1850946cc463STadeusz Struk 		       struct akcipher_testvec *vecs)
1851946cc463STadeusz Struk {
1852946cc463STadeusz Struk 	struct akcipher_request *req;
1853946cc463STadeusz Struk 	void *outbuf_enc = NULL;
1854946cc463STadeusz Struk 	void *outbuf_dec = NULL;
1855946cc463STadeusz Struk 	struct tcrypt_result result;
1856946cc463STadeusz Struk 	unsigned int out_len_max, out_len = 0;
1857946cc463STadeusz Struk 	int err = -ENOMEM;
185822287b0bSTadeusz Struk 	struct scatterlist src, dst, src_tab[2];
1859946cc463STadeusz Struk 
1860946cc463STadeusz Struk 	req = akcipher_request_alloc(tfm, GFP_KERNEL);
1861946cc463STadeusz Struk 	if (!req)
1862946cc463STadeusz Struk 		return err;
1863946cc463STadeusz Struk 
1864946cc463STadeusz Struk 	init_completion(&result.completion);
186522287b0bSTadeusz Struk 
186622287b0bSTadeusz Struk 	if (vecs->public_key_vec)
186722287b0bSTadeusz Struk 		err = crypto_akcipher_set_pub_key(tfm, vecs->key,
186822287b0bSTadeusz Struk 						  vecs->key_len);
186922287b0bSTadeusz Struk 	else
187022287b0bSTadeusz Struk 		err = crypto_akcipher_set_priv_key(tfm, vecs->key,
187122287b0bSTadeusz Struk 						   vecs->key_len);
1872946cc463STadeusz Struk 	if (err)
1873946cc463STadeusz Struk 		goto free_req;
1874946cc463STadeusz Struk 
187522287b0bSTadeusz Struk 	out_len_max = crypto_akcipher_maxsize(tfm);
1876946cc463STadeusz Struk 	outbuf_enc = kzalloc(out_len_max, GFP_KERNEL);
1877946cc463STadeusz Struk 	if (!outbuf_enc)
1878946cc463STadeusz Struk 		goto free_req;
1879946cc463STadeusz Struk 
188022287b0bSTadeusz Struk 	sg_init_table(src_tab, 2);
188122287b0bSTadeusz Struk 	sg_set_buf(&src_tab[0], vecs->m, 8);
188222287b0bSTadeusz Struk 	sg_set_buf(&src_tab[1], vecs->m + 8, vecs->m_size - 8);
188322287b0bSTadeusz Struk 	sg_init_one(&dst, outbuf_enc, out_len_max);
188422287b0bSTadeusz Struk 	akcipher_request_set_crypt(req, src_tab, &dst, vecs->m_size,
188522287b0bSTadeusz Struk 				   out_len_max);
1886946cc463STadeusz Struk 	akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1887946cc463STadeusz Struk 				      tcrypt_complete, &result);
1888946cc463STadeusz Struk 
1889946cc463STadeusz Struk 	/* Run RSA encrypt - c = m^e mod n;*/
1890946cc463STadeusz Struk 	err = wait_async_op(&result, crypto_akcipher_encrypt(req));
1891946cc463STadeusz Struk 	if (err) {
1892946cc463STadeusz Struk 		pr_err("alg: rsa: encrypt test failed. err %d\n", err);
1893946cc463STadeusz Struk 		goto free_all;
1894946cc463STadeusz Struk 	}
189522287b0bSTadeusz Struk 	if (req->dst_len != vecs->c_size) {
1896946cc463STadeusz Struk 		pr_err("alg: rsa: encrypt test failed. Invalid output len\n");
1897946cc463STadeusz Struk 		err = -EINVAL;
1898946cc463STadeusz Struk 		goto free_all;
1899946cc463STadeusz Struk 	}
1900946cc463STadeusz Struk 	/* verify that encrypted message is equal to expected */
190122287b0bSTadeusz Struk 	if (memcmp(vecs->c, sg_virt(req->dst), vecs->c_size)) {
1902946cc463STadeusz Struk 		pr_err("alg: rsa: encrypt test failed. Invalid output\n");
1903946cc463STadeusz Struk 		err = -EINVAL;
1904946cc463STadeusz Struk 		goto free_all;
1905946cc463STadeusz Struk 	}
1906946cc463STadeusz Struk 	/* Don't invoke decrypt for vectors with public key */
1907946cc463STadeusz Struk 	if (vecs->public_key_vec) {
1908946cc463STadeusz Struk 		err = 0;
1909946cc463STadeusz Struk 		goto free_all;
1910946cc463STadeusz Struk 	}
1911946cc463STadeusz Struk 	outbuf_dec = kzalloc(out_len_max, GFP_KERNEL);
1912946cc463STadeusz Struk 	if (!outbuf_dec) {
1913946cc463STadeusz Struk 		err = -ENOMEM;
1914946cc463STadeusz Struk 		goto free_all;
1915946cc463STadeusz Struk 	}
191622287b0bSTadeusz Struk 	sg_init_one(&src, vecs->c, vecs->c_size);
191722287b0bSTadeusz Struk 	sg_init_one(&dst, outbuf_dec, out_len_max);
1918946cc463STadeusz Struk 	init_completion(&result.completion);
191922287b0bSTadeusz Struk 	akcipher_request_set_crypt(req, &src, &dst, vecs->c_size, out_len_max);
1920946cc463STadeusz Struk 
1921946cc463STadeusz Struk 	/* Run RSA decrypt - m = c^d mod n;*/
1922946cc463STadeusz Struk 	err = wait_async_op(&result, crypto_akcipher_decrypt(req));
1923946cc463STadeusz Struk 	if (err) {
1924946cc463STadeusz Struk 		pr_err("alg: rsa: decrypt test failed. err %d\n", err);
1925946cc463STadeusz Struk 		goto free_all;
1926946cc463STadeusz Struk 	}
1927946cc463STadeusz Struk 	out_len = req->dst_len;
1928946cc463STadeusz Struk 	if (out_len != vecs->m_size) {
1929946cc463STadeusz Struk 		pr_err("alg: rsa: decrypt test failed. Invalid output len\n");
1930946cc463STadeusz Struk 		err = -EINVAL;
1931946cc463STadeusz Struk 		goto free_all;
1932946cc463STadeusz Struk 	}
1933946cc463STadeusz Struk 	/* verify that decrypted message is equal to the original msg */
1934946cc463STadeusz Struk 	if (memcmp(vecs->m, outbuf_dec, vecs->m_size)) {
1935946cc463STadeusz Struk 		pr_err("alg: rsa: decrypt test failed. Invalid output\n");
1936946cc463STadeusz Struk 		err = -EINVAL;
1937946cc463STadeusz Struk 	}
1938946cc463STadeusz Struk free_all:
1939946cc463STadeusz Struk 	kfree(outbuf_dec);
1940946cc463STadeusz Struk 	kfree(outbuf_enc);
1941946cc463STadeusz Struk free_req:
1942946cc463STadeusz Struk 	akcipher_request_free(req);
1943946cc463STadeusz Struk 	return err;
1944946cc463STadeusz Struk }
1945946cc463STadeusz Struk 
1946946cc463STadeusz Struk static int test_rsa(struct crypto_akcipher *tfm, struct akcipher_testvec *vecs,
1947946cc463STadeusz Struk 		    unsigned int tcount)
1948946cc463STadeusz Struk {
1949946cc463STadeusz Struk 	int ret, i;
1950946cc463STadeusz Struk 
1951946cc463STadeusz Struk 	for (i = 0; i < tcount; i++) {
1952946cc463STadeusz Struk 		ret = do_test_rsa(tfm, vecs++);
1953946cc463STadeusz Struk 		if (ret) {
1954946cc463STadeusz Struk 			pr_err("alg: rsa: test failed on vector %d, err=%d\n",
1955946cc463STadeusz Struk 			       i + 1, ret);
1956946cc463STadeusz Struk 			return ret;
1957946cc463STadeusz Struk 		}
1958946cc463STadeusz Struk 	}
1959946cc463STadeusz Struk 	return 0;
1960946cc463STadeusz Struk }
1961946cc463STadeusz Struk 
1962946cc463STadeusz Struk static int test_akcipher(struct crypto_akcipher *tfm, const char *alg,
1963946cc463STadeusz Struk 			 struct akcipher_testvec *vecs, unsigned int tcount)
1964946cc463STadeusz Struk {
1965946cc463STadeusz Struk 	if (strncmp(alg, "rsa", 3) == 0)
1966946cc463STadeusz Struk 		return test_rsa(tfm, vecs, tcount);
1967946cc463STadeusz Struk 
1968946cc463STadeusz Struk 	return 0;
1969946cc463STadeusz Struk }
1970946cc463STadeusz Struk 
1971946cc463STadeusz Struk static int alg_test_akcipher(const struct alg_test_desc *desc,
1972946cc463STadeusz Struk 			     const char *driver, u32 type, u32 mask)
1973946cc463STadeusz Struk {
1974946cc463STadeusz Struk 	struct crypto_akcipher *tfm;
1975946cc463STadeusz Struk 	int err = 0;
1976946cc463STadeusz Struk 
1977946cc463STadeusz Struk 	tfm = crypto_alloc_akcipher(driver, type | CRYPTO_ALG_INTERNAL, mask);
1978946cc463STadeusz Struk 	if (IS_ERR(tfm)) {
1979946cc463STadeusz Struk 		pr_err("alg: akcipher: Failed to load tfm for %s: %ld\n",
1980946cc463STadeusz Struk 		       driver, PTR_ERR(tfm));
1981946cc463STadeusz Struk 		return PTR_ERR(tfm);
1982946cc463STadeusz Struk 	}
1983946cc463STadeusz Struk 	if (desc->suite.akcipher.vecs)
1984946cc463STadeusz Struk 		err = test_akcipher(tfm, desc->alg, desc->suite.akcipher.vecs,
1985946cc463STadeusz Struk 				    desc->suite.akcipher.count);
1986946cc463STadeusz Struk 
1987946cc463STadeusz Struk 	crypto_free_akcipher(tfm);
1988946cc463STadeusz Struk 	return err;
1989946cc463STadeusz Struk }
1990946cc463STadeusz Struk 
1991863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc,
1992863b557aSYouquan, Song 			     const char *driver, u32 type, u32 mask)
1993863b557aSYouquan, Song {
1994863b557aSYouquan, Song 	return 0;
1995863b557aSYouquan, Song }
1996863b557aSYouquan, Song 
1997da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */
1998da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = {
1999da7f033dSHerbert Xu 	{
20004d6d6a2cSJohannes Goetzfried 		.alg = "__cbc-cast5-avx",
20014d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
20024d6d6a2cSJohannes Goetzfried 	}, {
20034ea1277dSJohannes Goetzfried 		.alg = "__cbc-cast6-avx",
20044ea1277dSJohannes Goetzfried 		.test = alg_test_null,
20054ea1277dSJohannes Goetzfried 	}, {
20067efe4076SJohannes Goetzfried 		.alg = "__cbc-serpent-avx",
20077efe4076SJohannes Goetzfried 		.test = alg_test_null,
20087efe4076SJohannes Goetzfried 	}, {
200956d76c96SJussi Kivilinna 		.alg = "__cbc-serpent-avx2",
201056d76c96SJussi Kivilinna 		.test = alg_test_null,
201156d76c96SJussi Kivilinna 	}, {
2012937c30d7SJussi Kivilinna 		.alg = "__cbc-serpent-sse2",
2013937c30d7SJussi Kivilinna 		.test = alg_test_null,
2014937c30d7SJussi Kivilinna 	}, {
2015107778b5SJohannes Goetzfried 		.alg = "__cbc-twofish-avx",
2016107778b5SJohannes Goetzfried 		.test = alg_test_null,
2017107778b5SJohannes Goetzfried 	}, {
2018863b557aSYouquan, Song 		.alg = "__driver-cbc-aes-aesni",
2019863b557aSYouquan, Song 		.test = alg_test_null,
20206c79294fSMilan Broz 		.fips_allowed = 1,
2021863b557aSYouquan, Song 	}, {
2022d9b1d2e7SJussi Kivilinna 		.alg = "__driver-cbc-camellia-aesni",
2023d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2024d9b1d2e7SJussi Kivilinna 	}, {
2025f3f935a7SJussi Kivilinna 		.alg = "__driver-cbc-camellia-aesni-avx2",
2026f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2027f3f935a7SJussi Kivilinna 	}, {
20284d6d6a2cSJohannes Goetzfried 		.alg = "__driver-cbc-cast5-avx",
20294d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
20304d6d6a2cSJohannes Goetzfried 	}, {
20314ea1277dSJohannes Goetzfried 		.alg = "__driver-cbc-cast6-avx",
20324ea1277dSJohannes Goetzfried 		.test = alg_test_null,
20334ea1277dSJohannes Goetzfried 	}, {
20347efe4076SJohannes Goetzfried 		.alg = "__driver-cbc-serpent-avx",
20357efe4076SJohannes Goetzfried 		.test = alg_test_null,
20367efe4076SJohannes Goetzfried 	}, {
203756d76c96SJussi Kivilinna 		.alg = "__driver-cbc-serpent-avx2",
203856d76c96SJussi Kivilinna 		.test = alg_test_null,
203956d76c96SJussi Kivilinna 	}, {
2040937c30d7SJussi Kivilinna 		.alg = "__driver-cbc-serpent-sse2",
2041937c30d7SJussi Kivilinna 		.test = alg_test_null,
2042937c30d7SJussi Kivilinna 	}, {
2043107778b5SJohannes Goetzfried 		.alg = "__driver-cbc-twofish-avx",
2044107778b5SJohannes Goetzfried 		.test = alg_test_null,
2045107778b5SJohannes Goetzfried 	}, {
2046863b557aSYouquan, Song 		.alg = "__driver-ecb-aes-aesni",
2047863b557aSYouquan, Song 		.test = alg_test_null,
20486c79294fSMilan Broz 		.fips_allowed = 1,
2049863b557aSYouquan, Song 	}, {
2050d9b1d2e7SJussi Kivilinna 		.alg = "__driver-ecb-camellia-aesni",
2051d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2052d9b1d2e7SJussi Kivilinna 	}, {
2053f3f935a7SJussi Kivilinna 		.alg = "__driver-ecb-camellia-aesni-avx2",
2054f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2055f3f935a7SJussi Kivilinna 	}, {
20564d6d6a2cSJohannes Goetzfried 		.alg = "__driver-ecb-cast5-avx",
20574d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
20584d6d6a2cSJohannes Goetzfried 	}, {
20594ea1277dSJohannes Goetzfried 		.alg = "__driver-ecb-cast6-avx",
20604ea1277dSJohannes Goetzfried 		.test = alg_test_null,
20614ea1277dSJohannes Goetzfried 	}, {
20627efe4076SJohannes Goetzfried 		.alg = "__driver-ecb-serpent-avx",
20637efe4076SJohannes Goetzfried 		.test = alg_test_null,
20647efe4076SJohannes Goetzfried 	}, {
206556d76c96SJussi Kivilinna 		.alg = "__driver-ecb-serpent-avx2",
206656d76c96SJussi Kivilinna 		.test = alg_test_null,
206756d76c96SJussi Kivilinna 	}, {
2068937c30d7SJussi Kivilinna 		.alg = "__driver-ecb-serpent-sse2",
2069937c30d7SJussi Kivilinna 		.test = alg_test_null,
2070937c30d7SJussi Kivilinna 	}, {
2071107778b5SJohannes Goetzfried 		.alg = "__driver-ecb-twofish-avx",
2072107778b5SJohannes Goetzfried 		.test = alg_test_null,
2073107778b5SJohannes Goetzfried 	}, {
20749d77b6c2STadeusz Struk 		.alg = "__driver-gcm-aes-aesni",
20759d77b6c2STadeusz Struk 		.test = alg_test_null,
20769d77b6c2STadeusz Struk 		.fips_allowed = 1,
20779d77b6c2STadeusz Struk 	}, {
2078863b557aSYouquan, Song 		.alg = "__ghash-pclmulqdqni",
2079863b557aSYouquan, Song 		.test = alg_test_null,
20806c79294fSMilan Broz 		.fips_allowed = 1,
2081863b557aSYouquan, Song 	}, {
2082e08ca2daSJarod Wilson 		.alg = "ansi_cprng",
2083e08ca2daSJarod Wilson 		.test = alg_test_cprng,
2084a1915d51SJarod Wilson 		.fips_allowed = 1,
2085e08ca2daSJarod Wilson 		.suite = {
2086e08ca2daSJarod Wilson 			.cprng = {
2087e08ca2daSJarod Wilson 				.vecs = ansi_cprng_aes_tv_template,
2088e08ca2daSJarod Wilson 				.count = ANSI_CPRNG_AES_TEST_VECTORS
2089e08ca2daSJarod Wilson 			}
2090e08ca2daSJarod Wilson 		}
2091e08ca2daSJarod Wilson 	}, {
2092bca4feb0SHoria Geanta 		.alg = "authenc(hmac(md5),ecb(cipher_null))",
2093bca4feb0SHoria Geanta 		.test = alg_test_aead,
2094bca4feb0SHoria Geanta 		.suite = {
2095bca4feb0SHoria Geanta 			.aead = {
2096bca4feb0SHoria Geanta 				.enc = {
2097bca4feb0SHoria Geanta 					.vecs = hmac_md5_ecb_cipher_null_enc_tv_template,
2098bca4feb0SHoria Geanta 					.count = HMAC_MD5_ECB_CIPHER_NULL_ENC_TEST_VECTORS
2099bca4feb0SHoria Geanta 				},
2100bca4feb0SHoria Geanta 				.dec = {
2101bca4feb0SHoria Geanta 					.vecs = hmac_md5_ecb_cipher_null_dec_tv_template,
2102bca4feb0SHoria Geanta 					.count = HMAC_MD5_ECB_CIPHER_NULL_DEC_TEST_VECTORS
2103bca4feb0SHoria Geanta 				}
2104bca4feb0SHoria Geanta 			}
2105bca4feb0SHoria Geanta 		}
2106bca4feb0SHoria Geanta 	}, {
2107a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha1),cbc(aes))",
2108e46e9a46SHoria Geanta 		.test = alg_test_aead,
2109e46e9a46SHoria Geanta 		.suite = {
2110e46e9a46SHoria Geanta 			.aead = {
2111e46e9a46SHoria Geanta 				.enc = {
21125208ed2cSNitesh Lal 					.vecs =
21135208ed2cSNitesh Lal 					hmac_sha1_aes_cbc_enc_tv_temp,
21145208ed2cSNitesh Lal 					.count =
21155208ed2cSNitesh Lal 					HMAC_SHA1_AES_CBC_ENC_TEST_VEC
21165208ed2cSNitesh Lal 				}
21175208ed2cSNitesh Lal 			}
21185208ed2cSNitesh Lal 		}
21195208ed2cSNitesh Lal 	}, {
2120a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha1),cbc(des))",
21215208ed2cSNitesh Lal 		.test = alg_test_aead,
21225208ed2cSNitesh Lal 		.suite = {
21235208ed2cSNitesh Lal 			.aead = {
21245208ed2cSNitesh Lal 				.enc = {
21255208ed2cSNitesh Lal 					.vecs =
21265208ed2cSNitesh Lal 					hmac_sha1_des_cbc_enc_tv_temp,
21275208ed2cSNitesh Lal 					.count =
21285208ed2cSNitesh Lal 					HMAC_SHA1_DES_CBC_ENC_TEST_VEC
21295208ed2cSNitesh Lal 				}
21305208ed2cSNitesh Lal 			}
21315208ed2cSNitesh Lal 		}
21325208ed2cSNitesh Lal 	}, {
2133a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha1),cbc(des3_ede))",
21345208ed2cSNitesh Lal 		.test = alg_test_aead,
21355208ed2cSNitesh Lal 		.suite = {
21365208ed2cSNitesh Lal 			.aead = {
21375208ed2cSNitesh Lal 				.enc = {
21385208ed2cSNitesh Lal 					.vecs =
21395208ed2cSNitesh Lal 					hmac_sha1_des3_ede_cbc_enc_tv_temp,
21405208ed2cSNitesh Lal 					.count =
21415208ed2cSNitesh Lal 					HMAC_SHA1_DES3_EDE_CBC_ENC_TEST_VEC
2142e46e9a46SHoria Geanta 				}
2143e46e9a46SHoria Geanta 			}
2144e46e9a46SHoria Geanta 		}
2145e46e9a46SHoria Geanta 	}, {
2146bca4feb0SHoria Geanta 		.alg = "authenc(hmac(sha1),ecb(cipher_null))",
2147bca4feb0SHoria Geanta 		.test = alg_test_aead,
2148bca4feb0SHoria Geanta 		.suite = {
2149bca4feb0SHoria Geanta 			.aead = {
2150bca4feb0SHoria Geanta 				.enc = {
21515208ed2cSNitesh Lal 					.vecs =
21525208ed2cSNitesh Lal 					hmac_sha1_ecb_cipher_null_enc_tv_temp,
21535208ed2cSNitesh Lal 					.count =
21545208ed2cSNitesh Lal 					HMAC_SHA1_ECB_CIPHER_NULL_ENC_TEST_VEC
2155bca4feb0SHoria Geanta 				},
2156bca4feb0SHoria Geanta 				.dec = {
21575208ed2cSNitesh Lal 					.vecs =
21585208ed2cSNitesh Lal 					hmac_sha1_ecb_cipher_null_dec_tv_temp,
21595208ed2cSNitesh Lal 					.count =
21605208ed2cSNitesh Lal 					HMAC_SHA1_ECB_CIPHER_NULL_DEC_TEST_VEC
21615208ed2cSNitesh Lal 				}
21625208ed2cSNitesh Lal 			}
21635208ed2cSNitesh Lal 		}
21645208ed2cSNitesh Lal 	}, {
2165a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha224),cbc(des))",
21665208ed2cSNitesh Lal 		.test = alg_test_aead,
21675208ed2cSNitesh Lal 		.suite = {
21685208ed2cSNitesh Lal 			.aead = {
21695208ed2cSNitesh Lal 				.enc = {
21705208ed2cSNitesh Lal 					.vecs =
21715208ed2cSNitesh Lal 					hmac_sha224_des_cbc_enc_tv_temp,
21725208ed2cSNitesh Lal 					.count =
21735208ed2cSNitesh Lal 					HMAC_SHA224_DES_CBC_ENC_TEST_VEC
21745208ed2cSNitesh Lal 				}
21755208ed2cSNitesh Lal 			}
21765208ed2cSNitesh Lal 		}
21775208ed2cSNitesh Lal 	}, {
2178a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha224),cbc(des3_ede))",
21795208ed2cSNitesh Lal 		.test = alg_test_aead,
21805208ed2cSNitesh Lal 		.suite = {
21815208ed2cSNitesh Lal 			.aead = {
21825208ed2cSNitesh Lal 				.enc = {
21835208ed2cSNitesh Lal 					.vecs =
21845208ed2cSNitesh Lal 					hmac_sha224_des3_ede_cbc_enc_tv_temp,
21855208ed2cSNitesh Lal 					.count =
21865208ed2cSNitesh Lal 					HMAC_SHA224_DES3_EDE_CBC_ENC_TEST_VEC
2187bca4feb0SHoria Geanta 				}
2188bca4feb0SHoria Geanta 			}
2189bca4feb0SHoria Geanta 		}
2190bca4feb0SHoria Geanta 	}, {
2191a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha256),cbc(aes))",
2192e46e9a46SHoria Geanta 		.test = alg_test_aead,
2193e46e9a46SHoria Geanta 		.suite = {
2194e46e9a46SHoria Geanta 			.aead = {
2195e46e9a46SHoria Geanta 				.enc = {
21965208ed2cSNitesh Lal 					.vecs =
21975208ed2cSNitesh Lal 					hmac_sha256_aes_cbc_enc_tv_temp,
21985208ed2cSNitesh Lal 					.count =
21995208ed2cSNitesh Lal 					HMAC_SHA256_AES_CBC_ENC_TEST_VEC
22005208ed2cSNitesh Lal 				}
22015208ed2cSNitesh Lal 			}
22025208ed2cSNitesh Lal 		}
22035208ed2cSNitesh Lal 	}, {
2204a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha256),cbc(des))",
22055208ed2cSNitesh Lal 		.test = alg_test_aead,
22065208ed2cSNitesh Lal 		.suite = {
22075208ed2cSNitesh Lal 			.aead = {
22085208ed2cSNitesh Lal 				.enc = {
22095208ed2cSNitesh Lal 					.vecs =
22105208ed2cSNitesh Lal 					hmac_sha256_des_cbc_enc_tv_temp,
22115208ed2cSNitesh Lal 					.count =
22125208ed2cSNitesh Lal 					HMAC_SHA256_DES_CBC_ENC_TEST_VEC
22135208ed2cSNitesh Lal 				}
22145208ed2cSNitesh Lal 			}
22155208ed2cSNitesh Lal 		}
22165208ed2cSNitesh Lal 	}, {
2217a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha256),cbc(des3_ede))",
22185208ed2cSNitesh Lal 		.test = alg_test_aead,
22195208ed2cSNitesh Lal 		.suite = {
22205208ed2cSNitesh Lal 			.aead = {
22215208ed2cSNitesh Lal 				.enc = {
22225208ed2cSNitesh Lal 					.vecs =
22235208ed2cSNitesh Lal 					hmac_sha256_des3_ede_cbc_enc_tv_temp,
22245208ed2cSNitesh Lal 					.count =
22255208ed2cSNitesh Lal 					HMAC_SHA256_DES3_EDE_CBC_ENC_TEST_VEC
22265208ed2cSNitesh Lal 				}
22275208ed2cSNitesh Lal 			}
22285208ed2cSNitesh Lal 		}
22295208ed2cSNitesh Lal 	}, {
2230a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha384),cbc(des))",
22315208ed2cSNitesh Lal 		.test = alg_test_aead,
22325208ed2cSNitesh Lal 		.suite = {
22335208ed2cSNitesh Lal 			.aead = {
22345208ed2cSNitesh Lal 				.enc = {
22355208ed2cSNitesh Lal 					.vecs =
22365208ed2cSNitesh Lal 					hmac_sha384_des_cbc_enc_tv_temp,
22375208ed2cSNitesh Lal 					.count =
22385208ed2cSNitesh Lal 					HMAC_SHA384_DES_CBC_ENC_TEST_VEC
22395208ed2cSNitesh Lal 				}
22405208ed2cSNitesh Lal 			}
22415208ed2cSNitesh Lal 		}
22425208ed2cSNitesh Lal 	}, {
2243a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha384),cbc(des3_ede))",
22445208ed2cSNitesh Lal 		.test = alg_test_aead,
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 		.suite = {
2259e46e9a46SHoria Geanta 			.aead = {
2260e46e9a46SHoria Geanta 				.enc = {
22615208ed2cSNitesh Lal 					.vecs =
22625208ed2cSNitesh Lal 					hmac_sha512_aes_cbc_enc_tv_temp,
22635208ed2cSNitesh Lal 					.count =
22645208ed2cSNitesh Lal 					HMAC_SHA512_AES_CBC_ENC_TEST_VEC
22655208ed2cSNitesh Lal 				}
22665208ed2cSNitesh Lal 			}
22675208ed2cSNitesh Lal 		}
22685208ed2cSNitesh Lal 	}, {
2269a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha512),cbc(des))",
22705208ed2cSNitesh Lal 		.test = alg_test_aead,
22715208ed2cSNitesh Lal 		.suite = {
22725208ed2cSNitesh Lal 			.aead = {
22735208ed2cSNitesh Lal 				.enc = {
22745208ed2cSNitesh Lal 					.vecs =
22755208ed2cSNitesh Lal 					hmac_sha512_des_cbc_enc_tv_temp,
22765208ed2cSNitesh Lal 					.count =
22775208ed2cSNitesh Lal 					HMAC_SHA512_DES_CBC_ENC_TEST_VEC
22785208ed2cSNitesh Lal 				}
22795208ed2cSNitesh Lal 			}
22805208ed2cSNitesh Lal 		}
22815208ed2cSNitesh Lal 	}, {
2282a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha512),cbc(des3_ede))",
22835208ed2cSNitesh Lal 		.test = alg_test_aead,
22845208ed2cSNitesh Lal 		.suite = {
22855208ed2cSNitesh Lal 			.aead = {
22865208ed2cSNitesh Lal 				.enc = {
22875208ed2cSNitesh Lal 					.vecs =
22885208ed2cSNitesh Lal 					hmac_sha512_des3_ede_cbc_enc_tv_temp,
22895208ed2cSNitesh Lal 					.count =
22905208ed2cSNitesh Lal 					HMAC_SHA512_DES3_EDE_CBC_ENC_TEST_VEC
2291e46e9a46SHoria Geanta 				}
2292e46e9a46SHoria Geanta 			}
2293e46e9a46SHoria Geanta 		}
2294e46e9a46SHoria Geanta 	}, {
2295da7f033dSHerbert Xu 		.alg = "cbc(aes)",
22961aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2297a1915d51SJarod Wilson 		.fips_allowed = 1,
2298da7f033dSHerbert Xu 		.suite = {
2299da7f033dSHerbert Xu 			.cipher = {
2300da7f033dSHerbert Xu 				.enc = {
2301da7f033dSHerbert Xu 					.vecs = aes_cbc_enc_tv_template,
2302da7f033dSHerbert Xu 					.count = AES_CBC_ENC_TEST_VECTORS
2303da7f033dSHerbert Xu 				},
2304da7f033dSHerbert Xu 				.dec = {
2305da7f033dSHerbert Xu 					.vecs = aes_cbc_dec_tv_template,
2306da7f033dSHerbert Xu 					.count = AES_CBC_DEC_TEST_VECTORS
2307da7f033dSHerbert Xu 				}
2308da7f033dSHerbert Xu 			}
2309da7f033dSHerbert Xu 		}
2310da7f033dSHerbert Xu 	}, {
2311da7f033dSHerbert Xu 		.alg = "cbc(anubis)",
23121aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2313da7f033dSHerbert Xu 		.suite = {
2314da7f033dSHerbert Xu 			.cipher = {
2315da7f033dSHerbert Xu 				.enc = {
2316da7f033dSHerbert Xu 					.vecs = anubis_cbc_enc_tv_template,
2317da7f033dSHerbert Xu 					.count = ANUBIS_CBC_ENC_TEST_VECTORS
2318da7f033dSHerbert Xu 				},
2319da7f033dSHerbert Xu 				.dec = {
2320da7f033dSHerbert Xu 					.vecs = anubis_cbc_dec_tv_template,
2321da7f033dSHerbert Xu 					.count = ANUBIS_CBC_DEC_TEST_VECTORS
2322da7f033dSHerbert Xu 				}
2323da7f033dSHerbert Xu 			}
2324da7f033dSHerbert Xu 		}
2325da7f033dSHerbert Xu 	}, {
2326da7f033dSHerbert Xu 		.alg = "cbc(blowfish)",
23271aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2328da7f033dSHerbert Xu 		.suite = {
2329da7f033dSHerbert Xu 			.cipher = {
2330da7f033dSHerbert Xu 				.enc = {
2331da7f033dSHerbert Xu 					.vecs = bf_cbc_enc_tv_template,
2332da7f033dSHerbert Xu 					.count = BF_CBC_ENC_TEST_VECTORS
2333da7f033dSHerbert Xu 				},
2334da7f033dSHerbert Xu 				.dec = {
2335da7f033dSHerbert Xu 					.vecs = bf_cbc_dec_tv_template,
2336da7f033dSHerbert Xu 					.count = BF_CBC_DEC_TEST_VECTORS
2337da7f033dSHerbert Xu 				}
2338da7f033dSHerbert Xu 			}
2339da7f033dSHerbert Xu 		}
2340da7f033dSHerbert Xu 	}, {
2341da7f033dSHerbert Xu 		.alg = "cbc(camellia)",
23421aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2343da7f033dSHerbert Xu 		.suite = {
2344da7f033dSHerbert Xu 			.cipher = {
2345da7f033dSHerbert Xu 				.enc = {
2346da7f033dSHerbert Xu 					.vecs = camellia_cbc_enc_tv_template,
2347da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_ENC_TEST_VECTORS
2348da7f033dSHerbert Xu 				},
2349da7f033dSHerbert Xu 				.dec = {
2350da7f033dSHerbert Xu 					.vecs = camellia_cbc_dec_tv_template,
2351da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_DEC_TEST_VECTORS
2352da7f033dSHerbert Xu 				}
2353da7f033dSHerbert Xu 			}
2354da7f033dSHerbert Xu 		}
2355da7f033dSHerbert Xu 	}, {
2356a2c58260SJohannes Goetzfried 		.alg = "cbc(cast5)",
2357a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2358a2c58260SJohannes Goetzfried 		.suite = {
2359a2c58260SJohannes Goetzfried 			.cipher = {
2360a2c58260SJohannes Goetzfried 				.enc = {
2361a2c58260SJohannes Goetzfried 					.vecs = cast5_cbc_enc_tv_template,
2362a2c58260SJohannes Goetzfried 					.count = CAST5_CBC_ENC_TEST_VECTORS
2363a2c58260SJohannes Goetzfried 				},
2364a2c58260SJohannes Goetzfried 				.dec = {
2365a2c58260SJohannes Goetzfried 					.vecs = cast5_cbc_dec_tv_template,
2366a2c58260SJohannes Goetzfried 					.count = CAST5_CBC_DEC_TEST_VECTORS
2367a2c58260SJohannes Goetzfried 				}
2368a2c58260SJohannes Goetzfried 			}
2369a2c58260SJohannes Goetzfried 		}
2370a2c58260SJohannes Goetzfried 	}, {
23719b8b0405SJohannes Goetzfried 		.alg = "cbc(cast6)",
23729b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
23739b8b0405SJohannes Goetzfried 		.suite = {
23749b8b0405SJohannes Goetzfried 			.cipher = {
23759b8b0405SJohannes Goetzfried 				.enc = {
23769b8b0405SJohannes Goetzfried 					.vecs = cast6_cbc_enc_tv_template,
23779b8b0405SJohannes Goetzfried 					.count = CAST6_CBC_ENC_TEST_VECTORS
23789b8b0405SJohannes Goetzfried 				},
23799b8b0405SJohannes Goetzfried 				.dec = {
23809b8b0405SJohannes Goetzfried 					.vecs = cast6_cbc_dec_tv_template,
23819b8b0405SJohannes Goetzfried 					.count = CAST6_CBC_DEC_TEST_VECTORS
23829b8b0405SJohannes Goetzfried 				}
23839b8b0405SJohannes Goetzfried 			}
23849b8b0405SJohannes Goetzfried 		}
23859b8b0405SJohannes Goetzfried 	}, {
2386da7f033dSHerbert Xu 		.alg = "cbc(des)",
23871aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2388da7f033dSHerbert Xu 		.suite = {
2389da7f033dSHerbert Xu 			.cipher = {
2390da7f033dSHerbert Xu 				.enc = {
2391da7f033dSHerbert Xu 					.vecs = des_cbc_enc_tv_template,
2392da7f033dSHerbert Xu 					.count = DES_CBC_ENC_TEST_VECTORS
2393da7f033dSHerbert Xu 				},
2394da7f033dSHerbert Xu 				.dec = {
2395da7f033dSHerbert Xu 					.vecs = des_cbc_dec_tv_template,
2396da7f033dSHerbert Xu 					.count = DES_CBC_DEC_TEST_VECTORS
2397da7f033dSHerbert Xu 				}
2398da7f033dSHerbert Xu 			}
2399da7f033dSHerbert Xu 		}
2400da7f033dSHerbert Xu 	}, {
2401da7f033dSHerbert Xu 		.alg = "cbc(des3_ede)",
24021aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2403a1915d51SJarod Wilson 		.fips_allowed = 1,
2404da7f033dSHerbert Xu 		.suite = {
2405da7f033dSHerbert Xu 			.cipher = {
2406da7f033dSHerbert Xu 				.enc = {
2407da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_enc_tv_template,
2408da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_ENC_TEST_VECTORS
2409da7f033dSHerbert Xu 				},
2410da7f033dSHerbert Xu 				.dec = {
2411da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_dec_tv_template,
2412da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_DEC_TEST_VECTORS
2413da7f033dSHerbert Xu 				}
2414da7f033dSHerbert Xu 			}
2415da7f033dSHerbert Xu 		}
2416da7f033dSHerbert Xu 	}, {
24179d25917dSJussi Kivilinna 		.alg = "cbc(serpent)",
24189d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
24199d25917dSJussi Kivilinna 		.suite = {
24209d25917dSJussi Kivilinna 			.cipher = {
24219d25917dSJussi Kivilinna 				.enc = {
24229d25917dSJussi Kivilinna 					.vecs = serpent_cbc_enc_tv_template,
24239d25917dSJussi Kivilinna 					.count = SERPENT_CBC_ENC_TEST_VECTORS
24249d25917dSJussi Kivilinna 				},
24259d25917dSJussi Kivilinna 				.dec = {
24269d25917dSJussi Kivilinna 					.vecs = serpent_cbc_dec_tv_template,
24279d25917dSJussi Kivilinna 					.count = SERPENT_CBC_DEC_TEST_VECTORS
24289d25917dSJussi Kivilinna 				}
24299d25917dSJussi Kivilinna 			}
24309d25917dSJussi Kivilinna 		}
24319d25917dSJussi Kivilinna 	}, {
2432da7f033dSHerbert Xu 		.alg = "cbc(twofish)",
24331aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2434da7f033dSHerbert Xu 		.suite = {
2435da7f033dSHerbert Xu 			.cipher = {
2436da7f033dSHerbert Xu 				.enc = {
2437da7f033dSHerbert Xu 					.vecs = tf_cbc_enc_tv_template,
2438da7f033dSHerbert Xu 					.count = TF_CBC_ENC_TEST_VECTORS
2439da7f033dSHerbert Xu 				},
2440da7f033dSHerbert Xu 				.dec = {
2441da7f033dSHerbert Xu 					.vecs = tf_cbc_dec_tv_template,
2442da7f033dSHerbert Xu 					.count = TF_CBC_DEC_TEST_VECTORS
2443da7f033dSHerbert Xu 				}
2444da7f033dSHerbert Xu 			}
2445da7f033dSHerbert Xu 		}
2446da7f033dSHerbert Xu 	}, {
2447da7f033dSHerbert Xu 		.alg = "ccm(aes)",
2448da7f033dSHerbert Xu 		.test = alg_test_aead,
2449a1915d51SJarod Wilson 		.fips_allowed = 1,
2450da7f033dSHerbert Xu 		.suite = {
2451da7f033dSHerbert Xu 			.aead = {
2452da7f033dSHerbert Xu 				.enc = {
2453da7f033dSHerbert Xu 					.vecs = aes_ccm_enc_tv_template,
2454da7f033dSHerbert Xu 					.count = AES_CCM_ENC_TEST_VECTORS
2455da7f033dSHerbert Xu 				},
2456da7f033dSHerbert Xu 				.dec = {
2457da7f033dSHerbert Xu 					.vecs = aes_ccm_dec_tv_template,
2458da7f033dSHerbert Xu 					.count = AES_CCM_DEC_TEST_VECTORS
2459da7f033dSHerbert Xu 				}
2460da7f033dSHerbert Xu 			}
2461da7f033dSHerbert Xu 		}
2462da7f033dSHerbert Xu 	}, {
24633590ebf2SMartin Willi 		.alg = "chacha20",
24643590ebf2SMartin Willi 		.test = alg_test_skcipher,
24653590ebf2SMartin Willi 		.suite = {
24663590ebf2SMartin Willi 			.cipher = {
24673590ebf2SMartin Willi 				.enc = {
24683590ebf2SMartin Willi 					.vecs = chacha20_enc_tv_template,
24693590ebf2SMartin Willi 					.count = CHACHA20_ENC_TEST_VECTORS
24703590ebf2SMartin Willi 				},
24713590ebf2SMartin Willi 				.dec = {
24723590ebf2SMartin Willi 					.vecs = chacha20_enc_tv_template,
24733590ebf2SMartin Willi 					.count = CHACHA20_ENC_TEST_VECTORS
24743590ebf2SMartin Willi 				},
24753590ebf2SMartin Willi 			}
24763590ebf2SMartin Willi 		}
24773590ebf2SMartin Willi 	}, {
247893b5e86aSJussi Kivilinna 		.alg = "cmac(aes)",
24798f183751SStephan Mueller 		.fips_allowed = 1,
248093b5e86aSJussi Kivilinna 		.test = alg_test_hash,
248193b5e86aSJussi Kivilinna 		.suite = {
248293b5e86aSJussi Kivilinna 			.hash = {
248393b5e86aSJussi Kivilinna 				.vecs = aes_cmac128_tv_template,
248493b5e86aSJussi Kivilinna 				.count = CMAC_AES_TEST_VECTORS
248593b5e86aSJussi Kivilinna 			}
248693b5e86aSJussi Kivilinna 		}
248793b5e86aSJussi Kivilinna 	}, {
248893b5e86aSJussi Kivilinna 		.alg = "cmac(des3_ede)",
24898f183751SStephan Mueller 		.fips_allowed = 1,
249093b5e86aSJussi Kivilinna 		.test = alg_test_hash,
249193b5e86aSJussi Kivilinna 		.suite = {
249293b5e86aSJussi Kivilinna 			.hash = {
249393b5e86aSJussi Kivilinna 				.vecs = des3_ede_cmac64_tv_template,
249493b5e86aSJussi Kivilinna 				.count = CMAC_DES3_EDE_TEST_VECTORS
249593b5e86aSJussi Kivilinna 			}
249693b5e86aSJussi Kivilinna 		}
249793b5e86aSJussi Kivilinna 	}, {
2498e448370dSJussi Kivilinna 		.alg = "compress_null",
2499e448370dSJussi Kivilinna 		.test = alg_test_null,
2500e448370dSJussi Kivilinna 	}, {
2501ebb3472fSArd Biesheuvel 		.alg = "crc32",
2502ebb3472fSArd Biesheuvel 		.test = alg_test_hash,
2503ebb3472fSArd Biesheuvel 		.suite = {
2504ebb3472fSArd Biesheuvel 			.hash = {
2505ebb3472fSArd Biesheuvel 				.vecs = crc32_tv_template,
2506ebb3472fSArd Biesheuvel 				.count = CRC32_TEST_VECTORS
2507ebb3472fSArd Biesheuvel 			}
2508ebb3472fSArd Biesheuvel 		}
2509ebb3472fSArd Biesheuvel 	}, {
2510da7f033dSHerbert Xu 		.alg = "crc32c",
25118e3ee85eSHerbert Xu 		.test = alg_test_crc32c,
2512a1915d51SJarod Wilson 		.fips_allowed = 1,
2513da7f033dSHerbert Xu 		.suite = {
2514da7f033dSHerbert Xu 			.hash = {
2515da7f033dSHerbert Xu 				.vecs = crc32c_tv_template,
2516da7f033dSHerbert Xu 				.count = CRC32C_TEST_VECTORS
2517da7f033dSHerbert Xu 			}
2518da7f033dSHerbert Xu 		}
2519da7f033dSHerbert Xu 	}, {
252068411521SHerbert Xu 		.alg = "crct10dif",
252168411521SHerbert Xu 		.test = alg_test_hash,
252268411521SHerbert Xu 		.fips_allowed = 1,
252368411521SHerbert Xu 		.suite = {
252468411521SHerbert Xu 			.hash = {
252568411521SHerbert Xu 				.vecs = crct10dif_tv_template,
252668411521SHerbert Xu 				.count = CRCT10DIF_TEST_VECTORS
252768411521SHerbert Xu 			}
252868411521SHerbert Xu 		}
252968411521SHerbert Xu 	}, {
25306c79294fSMilan Broz 		.alg = "cryptd(__driver-cbc-aes-aesni)",
25316c79294fSMilan Broz 		.test = alg_test_null,
25326c79294fSMilan Broz 		.fips_allowed = 1,
25336c79294fSMilan Broz 	}, {
2534d9b1d2e7SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-camellia-aesni)",
2535d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2536d9b1d2e7SJussi Kivilinna 	}, {
2537f3f935a7SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-camellia-aesni-avx2)",
2538f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2539f3f935a7SJussi Kivilinna 	}, {
254056d76c96SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-serpent-avx2)",
254156d76c96SJussi Kivilinna 		.test = alg_test_null,
254256d76c96SJussi Kivilinna 	}, {
2543863b557aSYouquan, Song 		.alg = "cryptd(__driver-ecb-aes-aesni)",
2544863b557aSYouquan, Song 		.test = alg_test_null,
25456c79294fSMilan Broz 		.fips_allowed = 1,
2546863b557aSYouquan, Song 	}, {
2547d9b1d2e7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-camellia-aesni)",
2548d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2549d9b1d2e7SJussi Kivilinna 	}, {
2550f3f935a7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-camellia-aesni-avx2)",
2551f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2552f3f935a7SJussi Kivilinna 	}, {
25534d6d6a2cSJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-cast5-avx)",
25544d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
25554d6d6a2cSJohannes Goetzfried 	}, {
25564ea1277dSJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-cast6-avx)",
25574ea1277dSJohannes Goetzfried 		.test = alg_test_null,
25584ea1277dSJohannes Goetzfried 	}, {
25597efe4076SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-serpent-avx)",
25607efe4076SJohannes Goetzfried 		.test = alg_test_null,
25617efe4076SJohannes Goetzfried 	}, {
256256d76c96SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-serpent-avx2)",
256356d76c96SJussi Kivilinna 		.test = alg_test_null,
256456d76c96SJussi Kivilinna 	}, {
2565937c30d7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-serpent-sse2)",
2566937c30d7SJussi Kivilinna 		.test = alg_test_null,
2567937c30d7SJussi Kivilinna 	}, {
2568107778b5SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-twofish-avx)",
2569107778b5SJohannes Goetzfried 		.test = alg_test_null,
2570107778b5SJohannes Goetzfried 	}, {
25716c79294fSMilan Broz 		.alg = "cryptd(__driver-gcm-aes-aesni)",
25726c79294fSMilan Broz 		.test = alg_test_null,
25736c79294fSMilan Broz 		.fips_allowed = 1,
25746c79294fSMilan Broz 	}, {
2575863b557aSYouquan, Song 		.alg = "cryptd(__ghash-pclmulqdqni)",
2576863b557aSYouquan, Song 		.test = alg_test_null,
25776c79294fSMilan Broz 		.fips_allowed = 1,
2578863b557aSYouquan, Song 	}, {
2579f7cb80f2SJarod Wilson 		.alg = "ctr(aes)",
2580f7cb80f2SJarod Wilson 		.test = alg_test_skcipher,
2581a1915d51SJarod Wilson 		.fips_allowed = 1,
2582f7cb80f2SJarod Wilson 		.suite = {
2583f7cb80f2SJarod Wilson 			.cipher = {
2584f7cb80f2SJarod Wilson 				.enc = {
2585f7cb80f2SJarod Wilson 					.vecs = aes_ctr_enc_tv_template,
2586f7cb80f2SJarod Wilson 					.count = AES_CTR_ENC_TEST_VECTORS
2587f7cb80f2SJarod Wilson 				},
2588f7cb80f2SJarod Wilson 				.dec = {
2589f7cb80f2SJarod Wilson 					.vecs = aes_ctr_dec_tv_template,
2590f7cb80f2SJarod Wilson 					.count = AES_CTR_DEC_TEST_VECTORS
2591f7cb80f2SJarod Wilson 				}
2592f7cb80f2SJarod Wilson 			}
2593f7cb80f2SJarod Wilson 		}
2594f7cb80f2SJarod Wilson 	}, {
259585b63e34SJussi Kivilinna 		.alg = "ctr(blowfish)",
259685b63e34SJussi Kivilinna 		.test = alg_test_skcipher,
259785b63e34SJussi Kivilinna 		.suite = {
259885b63e34SJussi Kivilinna 			.cipher = {
259985b63e34SJussi Kivilinna 				.enc = {
260085b63e34SJussi Kivilinna 					.vecs = bf_ctr_enc_tv_template,
260185b63e34SJussi Kivilinna 					.count = BF_CTR_ENC_TEST_VECTORS
260285b63e34SJussi Kivilinna 				},
260385b63e34SJussi Kivilinna 				.dec = {
260485b63e34SJussi Kivilinna 					.vecs = bf_ctr_dec_tv_template,
260585b63e34SJussi Kivilinna 					.count = BF_CTR_DEC_TEST_VECTORS
260685b63e34SJussi Kivilinna 				}
260785b63e34SJussi Kivilinna 			}
260885b63e34SJussi Kivilinna 		}
260985b63e34SJussi Kivilinna 	}, {
26100840605eSJussi Kivilinna 		.alg = "ctr(camellia)",
26110840605eSJussi Kivilinna 		.test = alg_test_skcipher,
26120840605eSJussi Kivilinna 		.suite = {
26130840605eSJussi Kivilinna 			.cipher = {
26140840605eSJussi Kivilinna 				.enc = {
26150840605eSJussi Kivilinna 					.vecs = camellia_ctr_enc_tv_template,
26160840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_ENC_TEST_VECTORS
26170840605eSJussi Kivilinna 				},
26180840605eSJussi Kivilinna 				.dec = {
26190840605eSJussi Kivilinna 					.vecs = camellia_ctr_dec_tv_template,
26200840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_DEC_TEST_VECTORS
26210840605eSJussi Kivilinna 				}
26220840605eSJussi Kivilinna 			}
26230840605eSJussi Kivilinna 		}
26240840605eSJussi Kivilinna 	}, {
2625a2c58260SJohannes Goetzfried 		.alg = "ctr(cast5)",
2626a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2627a2c58260SJohannes Goetzfried 		.suite = {
2628a2c58260SJohannes Goetzfried 			.cipher = {
2629a2c58260SJohannes Goetzfried 				.enc = {
2630a2c58260SJohannes Goetzfried 					.vecs = cast5_ctr_enc_tv_template,
2631a2c58260SJohannes Goetzfried 					.count = CAST5_CTR_ENC_TEST_VECTORS
2632a2c58260SJohannes Goetzfried 				},
2633a2c58260SJohannes Goetzfried 				.dec = {
2634a2c58260SJohannes Goetzfried 					.vecs = cast5_ctr_dec_tv_template,
2635a2c58260SJohannes Goetzfried 					.count = CAST5_CTR_DEC_TEST_VECTORS
2636a2c58260SJohannes Goetzfried 				}
2637a2c58260SJohannes Goetzfried 			}
2638a2c58260SJohannes Goetzfried 		}
2639a2c58260SJohannes Goetzfried 	}, {
26409b8b0405SJohannes Goetzfried 		.alg = "ctr(cast6)",
26419b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
26429b8b0405SJohannes Goetzfried 		.suite = {
26439b8b0405SJohannes Goetzfried 			.cipher = {
26449b8b0405SJohannes Goetzfried 				.enc = {
26459b8b0405SJohannes Goetzfried 					.vecs = cast6_ctr_enc_tv_template,
26469b8b0405SJohannes Goetzfried 					.count = CAST6_CTR_ENC_TEST_VECTORS
26479b8b0405SJohannes Goetzfried 				},
26489b8b0405SJohannes Goetzfried 				.dec = {
26499b8b0405SJohannes Goetzfried 					.vecs = cast6_ctr_dec_tv_template,
26509b8b0405SJohannes Goetzfried 					.count = CAST6_CTR_DEC_TEST_VECTORS
26519b8b0405SJohannes Goetzfried 				}
26529b8b0405SJohannes Goetzfried 			}
26539b8b0405SJohannes Goetzfried 		}
26549b8b0405SJohannes Goetzfried 	}, {
26558163fc30SJussi Kivilinna 		.alg = "ctr(des)",
26568163fc30SJussi Kivilinna 		.test = alg_test_skcipher,
26578163fc30SJussi Kivilinna 		.suite = {
26588163fc30SJussi Kivilinna 			.cipher = {
26598163fc30SJussi Kivilinna 				.enc = {
26608163fc30SJussi Kivilinna 					.vecs = des_ctr_enc_tv_template,
26618163fc30SJussi Kivilinna 					.count = DES_CTR_ENC_TEST_VECTORS
26628163fc30SJussi Kivilinna 				},
26638163fc30SJussi Kivilinna 				.dec = {
26648163fc30SJussi Kivilinna 					.vecs = des_ctr_dec_tv_template,
26658163fc30SJussi Kivilinna 					.count = DES_CTR_DEC_TEST_VECTORS
26668163fc30SJussi Kivilinna 				}
26678163fc30SJussi Kivilinna 			}
26688163fc30SJussi Kivilinna 		}
26698163fc30SJussi Kivilinna 	}, {
2670e080b17aSJussi Kivilinna 		.alg = "ctr(des3_ede)",
2671e080b17aSJussi Kivilinna 		.test = alg_test_skcipher,
2672e080b17aSJussi Kivilinna 		.suite = {
2673e080b17aSJussi Kivilinna 			.cipher = {
2674e080b17aSJussi Kivilinna 				.enc = {
2675e080b17aSJussi Kivilinna 					.vecs = des3_ede_ctr_enc_tv_template,
2676e080b17aSJussi Kivilinna 					.count = DES3_EDE_CTR_ENC_TEST_VECTORS
2677e080b17aSJussi Kivilinna 				},
2678e080b17aSJussi Kivilinna 				.dec = {
2679e080b17aSJussi Kivilinna 					.vecs = des3_ede_ctr_dec_tv_template,
2680e080b17aSJussi Kivilinna 					.count = DES3_EDE_CTR_DEC_TEST_VECTORS
2681e080b17aSJussi Kivilinna 				}
2682e080b17aSJussi Kivilinna 			}
2683e080b17aSJussi Kivilinna 		}
2684e080b17aSJussi Kivilinna 	}, {
26859d25917dSJussi Kivilinna 		.alg = "ctr(serpent)",
26869d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
26879d25917dSJussi Kivilinna 		.suite = {
26889d25917dSJussi Kivilinna 			.cipher = {
26899d25917dSJussi Kivilinna 				.enc = {
26909d25917dSJussi Kivilinna 					.vecs = serpent_ctr_enc_tv_template,
26919d25917dSJussi Kivilinna 					.count = SERPENT_CTR_ENC_TEST_VECTORS
26929d25917dSJussi Kivilinna 				},
26939d25917dSJussi Kivilinna 				.dec = {
26949d25917dSJussi Kivilinna 					.vecs = serpent_ctr_dec_tv_template,
26959d25917dSJussi Kivilinna 					.count = SERPENT_CTR_DEC_TEST_VECTORS
26969d25917dSJussi Kivilinna 				}
26979d25917dSJussi Kivilinna 			}
26989d25917dSJussi Kivilinna 		}
26999d25917dSJussi Kivilinna 	}, {
2700573da620SJussi Kivilinna 		.alg = "ctr(twofish)",
2701573da620SJussi Kivilinna 		.test = alg_test_skcipher,
2702573da620SJussi Kivilinna 		.suite = {
2703573da620SJussi Kivilinna 			.cipher = {
2704573da620SJussi Kivilinna 				.enc = {
2705573da620SJussi Kivilinna 					.vecs = tf_ctr_enc_tv_template,
2706573da620SJussi Kivilinna 					.count = TF_CTR_ENC_TEST_VECTORS
2707573da620SJussi Kivilinna 				},
2708573da620SJussi Kivilinna 				.dec = {
2709573da620SJussi Kivilinna 					.vecs = tf_ctr_dec_tv_template,
2710573da620SJussi Kivilinna 					.count = TF_CTR_DEC_TEST_VECTORS
2711573da620SJussi Kivilinna 				}
2712573da620SJussi Kivilinna 			}
2713573da620SJussi Kivilinna 		}
2714573da620SJussi Kivilinna 	}, {
2715da7f033dSHerbert Xu 		.alg = "cts(cbc(aes))",
27161aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2717da7f033dSHerbert Xu 		.suite = {
2718da7f033dSHerbert Xu 			.cipher = {
2719da7f033dSHerbert Xu 				.enc = {
2720da7f033dSHerbert Xu 					.vecs = cts_mode_enc_tv_template,
2721da7f033dSHerbert Xu 					.count = CTS_MODE_ENC_TEST_VECTORS
2722da7f033dSHerbert Xu 				},
2723da7f033dSHerbert Xu 				.dec = {
2724da7f033dSHerbert Xu 					.vecs = cts_mode_dec_tv_template,
2725da7f033dSHerbert Xu 					.count = CTS_MODE_DEC_TEST_VECTORS
2726da7f033dSHerbert Xu 				}
2727da7f033dSHerbert Xu 			}
2728da7f033dSHerbert Xu 		}
2729da7f033dSHerbert Xu 	}, {
2730da7f033dSHerbert Xu 		.alg = "deflate",
2731da7f033dSHerbert Xu 		.test = alg_test_comp,
27320818904dSMilan Broz 		.fips_allowed = 1,
2733da7f033dSHerbert Xu 		.suite = {
2734da7f033dSHerbert Xu 			.comp = {
2735da7f033dSHerbert Xu 				.comp = {
2736da7f033dSHerbert Xu 					.vecs = deflate_comp_tv_template,
2737da7f033dSHerbert Xu 					.count = DEFLATE_COMP_TEST_VECTORS
2738da7f033dSHerbert Xu 				},
2739da7f033dSHerbert Xu 				.decomp = {
2740da7f033dSHerbert Xu 					.vecs = deflate_decomp_tv_template,
2741da7f033dSHerbert Xu 					.count = DEFLATE_DECOMP_TEST_VECTORS
2742da7f033dSHerbert Xu 				}
2743da7f033dSHerbert Xu 			}
2744da7f033dSHerbert Xu 		}
2745da7f033dSHerbert Xu 	}, {
2746e448370dSJussi Kivilinna 		.alg = "digest_null",
2747e448370dSJussi Kivilinna 		.test = alg_test_null,
2748e448370dSJussi Kivilinna 	}, {
274964d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes128",
275064d1cdfbSStephan Mueller 		.test = alg_test_drbg,
275164d1cdfbSStephan Mueller 		.fips_allowed = 1,
275264d1cdfbSStephan Mueller 		.suite = {
275364d1cdfbSStephan Mueller 			.drbg = {
275464d1cdfbSStephan Mueller 				.vecs = drbg_nopr_ctr_aes128_tv_template,
275564d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes128_tv_template)
275664d1cdfbSStephan Mueller 			}
275764d1cdfbSStephan Mueller 		}
275864d1cdfbSStephan Mueller 	}, {
275964d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes192",
276064d1cdfbSStephan Mueller 		.test = alg_test_drbg,
276164d1cdfbSStephan Mueller 		.fips_allowed = 1,
276264d1cdfbSStephan Mueller 		.suite = {
276364d1cdfbSStephan Mueller 			.drbg = {
276464d1cdfbSStephan Mueller 				.vecs = drbg_nopr_ctr_aes192_tv_template,
276564d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes192_tv_template)
276664d1cdfbSStephan Mueller 			}
276764d1cdfbSStephan Mueller 		}
276864d1cdfbSStephan Mueller 	}, {
276964d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes256",
277064d1cdfbSStephan Mueller 		.test = alg_test_drbg,
277164d1cdfbSStephan Mueller 		.fips_allowed = 1,
277264d1cdfbSStephan Mueller 		.suite = {
277364d1cdfbSStephan Mueller 			.drbg = {
277464d1cdfbSStephan Mueller 				.vecs = drbg_nopr_ctr_aes256_tv_template,
277564d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes256_tv_template)
277664d1cdfbSStephan Mueller 			}
277764d1cdfbSStephan Mueller 		}
277864d1cdfbSStephan Mueller 	}, {
277964d1cdfbSStephan Mueller 		/*
278064d1cdfbSStephan Mueller 		 * There is no need to specifically test the DRBG with every
278164d1cdfbSStephan Mueller 		 * backend cipher -- covered by drbg_nopr_hmac_sha256 test
278264d1cdfbSStephan Mueller 		 */
278364d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha1",
278464d1cdfbSStephan Mueller 		.fips_allowed = 1,
278564d1cdfbSStephan Mueller 		.test = alg_test_null,
278664d1cdfbSStephan Mueller 	}, {
278764d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha256",
278864d1cdfbSStephan Mueller 		.test = alg_test_drbg,
278964d1cdfbSStephan Mueller 		.fips_allowed = 1,
279064d1cdfbSStephan Mueller 		.suite = {
279164d1cdfbSStephan Mueller 			.drbg = {
279264d1cdfbSStephan Mueller 				.vecs = drbg_nopr_hmac_sha256_tv_template,
279364d1cdfbSStephan Mueller 				.count =
279464d1cdfbSStephan Mueller 				ARRAY_SIZE(drbg_nopr_hmac_sha256_tv_template)
279564d1cdfbSStephan Mueller 			}
279664d1cdfbSStephan Mueller 		}
279764d1cdfbSStephan Mueller 	}, {
279864d1cdfbSStephan Mueller 		/* covered by drbg_nopr_hmac_sha256 test */
279964d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha384",
280064d1cdfbSStephan Mueller 		.fips_allowed = 1,
280164d1cdfbSStephan Mueller 		.test = alg_test_null,
280264d1cdfbSStephan Mueller 	}, {
280364d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha512",
280464d1cdfbSStephan Mueller 		.test = alg_test_null,
280564d1cdfbSStephan Mueller 		.fips_allowed = 1,
280664d1cdfbSStephan Mueller 	}, {
280764d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha1",
280864d1cdfbSStephan Mueller 		.fips_allowed = 1,
280964d1cdfbSStephan Mueller 		.test = alg_test_null,
281064d1cdfbSStephan Mueller 	}, {
281164d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha256",
281264d1cdfbSStephan Mueller 		.test = alg_test_drbg,
281364d1cdfbSStephan Mueller 		.fips_allowed = 1,
281464d1cdfbSStephan Mueller 		.suite = {
281564d1cdfbSStephan Mueller 			.drbg = {
281664d1cdfbSStephan Mueller 				.vecs = drbg_nopr_sha256_tv_template,
281764d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_sha256_tv_template)
281864d1cdfbSStephan Mueller 			}
281964d1cdfbSStephan Mueller 		}
282064d1cdfbSStephan Mueller 	}, {
282164d1cdfbSStephan Mueller 		/* covered by drbg_nopr_sha256 test */
282264d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha384",
282364d1cdfbSStephan Mueller 		.fips_allowed = 1,
282464d1cdfbSStephan Mueller 		.test = alg_test_null,
282564d1cdfbSStephan Mueller 	}, {
282664d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha512",
282764d1cdfbSStephan Mueller 		.fips_allowed = 1,
282864d1cdfbSStephan Mueller 		.test = alg_test_null,
282964d1cdfbSStephan Mueller 	}, {
283064d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes128",
283164d1cdfbSStephan Mueller 		.test = alg_test_drbg,
283264d1cdfbSStephan Mueller 		.fips_allowed = 1,
283364d1cdfbSStephan Mueller 		.suite = {
283464d1cdfbSStephan Mueller 			.drbg = {
283564d1cdfbSStephan Mueller 				.vecs = drbg_pr_ctr_aes128_tv_template,
283664d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_pr_ctr_aes128_tv_template)
283764d1cdfbSStephan Mueller 			}
283864d1cdfbSStephan Mueller 		}
283964d1cdfbSStephan Mueller 	}, {
284064d1cdfbSStephan Mueller 		/* covered by drbg_pr_ctr_aes128 test */
284164d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes192",
284264d1cdfbSStephan Mueller 		.fips_allowed = 1,
284364d1cdfbSStephan Mueller 		.test = alg_test_null,
284464d1cdfbSStephan Mueller 	}, {
284564d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes256",
284664d1cdfbSStephan Mueller 		.fips_allowed = 1,
284764d1cdfbSStephan Mueller 		.test = alg_test_null,
284864d1cdfbSStephan Mueller 	}, {
284964d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha1",
285064d1cdfbSStephan Mueller 		.fips_allowed = 1,
285164d1cdfbSStephan Mueller 		.test = alg_test_null,
285264d1cdfbSStephan Mueller 	}, {
285364d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha256",
285464d1cdfbSStephan Mueller 		.test = alg_test_drbg,
285564d1cdfbSStephan Mueller 		.fips_allowed = 1,
285664d1cdfbSStephan Mueller 		.suite = {
285764d1cdfbSStephan Mueller 			.drbg = {
285864d1cdfbSStephan Mueller 				.vecs = drbg_pr_hmac_sha256_tv_template,
285964d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_pr_hmac_sha256_tv_template)
286064d1cdfbSStephan Mueller 			}
286164d1cdfbSStephan Mueller 		}
286264d1cdfbSStephan Mueller 	}, {
286364d1cdfbSStephan Mueller 		/* covered by drbg_pr_hmac_sha256 test */
286464d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha384",
286564d1cdfbSStephan Mueller 		.fips_allowed = 1,
286664d1cdfbSStephan Mueller 		.test = alg_test_null,
286764d1cdfbSStephan Mueller 	}, {
286864d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha512",
286964d1cdfbSStephan Mueller 		.test = alg_test_null,
287064d1cdfbSStephan Mueller 		.fips_allowed = 1,
287164d1cdfbSStephan Mueller 	}, {
287264d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha1",
287364d1cdfbSStephan Mueller 		.fips_allowed = 1,
287464d1cdfbSStephan Mueller 		.test = alg_test_null,
287564d1cdfbSStephan Mueller 	}, {
287664d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha256",
287764d1cdfbSStephan Mueller 		.test = alg_test_drbg,
287864d1cdfbSStephan Mueller 		.fips_allowed = 1,
287964d1cdfbSStephan Mueller 		.suite = {
288064d1cdfbSStephan Mueller 			.drbg = {
288164d1cdfbSStephan Mueller 				.vecs = drbg_pr_sha256_tv_template,
288264d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_pr_sha256_tv_template)
288364d1cdfbSStephan Mueller 			}
288464d1cdfbSStephan Mueller 		}
288564d1cdfbSStephan Mueller 	}, {
288664d1cdfbSStephan Mueller 		/* covered by drbg_pr_sha256 test */
288764d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha384",
288864d1cdfbSStephan Mueller 		.fips_allowed = 1,
288964d1cdfbSStephan Mueller 		.test = alg_test_null,
289064d1cdfbSStephan Mueller 	}, {
289164d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha512",
289264d1cdfbSStephan Mueller 		.fips_allowed = 1,
289364d1cdfbSStephan Mueller 		.test = alg_test_null,
289464d1cdfbSStephan Mueller 	}, {
2895863b557aSYouquan, Song 		.alg = "ecb(__aes-aesni)",
2896863b557aSYouquan, Song 		.test = alg_test_null,
28976c79294fSMilan Broz 		.fips_allowed = 1,
2898863b557aSYouquan, Song 	}, {
2899da7f033dSHerbert Xu 		.alg = "ecb(aes)",
29001aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2901a1915d51SJarod Wilson 		.fips_allowed = 1,
2902da7f033dSHerbert Xu 		.suite = {
2903da7f033dSHerbert Xu 			.cipher = {
2904da7f033dSHerbert Xu 				.enc = {
2905da7f033dSHerbert Xu 					.vecs = aes_enc_tv_template,
2906da7f033dSHerbert Xu 					.count = AES_ENC_TEST_VECTORS
2907da7f033dSHerbert Xu 				},
2908da7f033dSHerbert Xu 				.dec = {
2909da7f033dSHerbert Xu 					.vecs = aes_dec_tv_template,
2910da7f033dSHerbert Xu 					.count = AES_DEC_TEST_VECTORS
2911da7f033dSHerbert Xu 				}
2912da7f033dSHerbert Xu 			}
2913da7f033dSHerbert Xu 		}
2914da7f033dSHerbert Xu 	}, {
2915da7f033dSHerbert Xu 		.alg = "ecb(anubis)",
29161aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2917da7f033dSHerbert Xu 		.suite = {
2918da7f033dSHerbert Xu 			.cipher = {
2919da7f033dSHerbert Xu 				.enc = {
2920da7f033dSHerbert Xu 					.vecs = anubis_enc_tv_template,
2921da7f033dSHerbert Xu 					.count = ANUBIS_ENC_TEST_VECTORS
2922da7f033dSHerbert Xu 				},
2923da7f033dSHerbert Xu 				.dec = {
2924da7f033dSHerbert Xu 					.vecs = anubis_dec_tv_template,
2925da7f033dSHerbert Xu 					.count = ANUBIS_DEC_TEST_VECTORS
2926da7f033dSHerbert Xu 				}
2927da7f033dSHerbert Xu 			}
2928da7f033dSHerbert Xu 		}
2929da7f033dSHerbert Xu 	}, {
2930da7f033dSHerbert Xu 		.alg = "ecb(arc4)",
29311aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2932da7f033dSHerbert Xu 		.suite = {
2933da7f033dSHerbert Xu 			.cipher = {
2934da7f033dSHerbert Xu 				.enc = {
2935da7f033dSHerbert Xu 					.vecs = arc4_enc_tv_template,
2936da7f033dSHerbert Xu 					.count = ARC4_ENC_TEST_VECTORS
2937da7f033dSHerbert Xu 				},
2938da7f033dSHerbert Xu 				.dec = {
2939da7f033dSHerbert Xu 					.vecs = arc4_dec_tv_template,
2940da7f033dSHerbert Xu 					.count = ARC4_DEC_TEST_VECTORS
2941da7f033dSHerbert Xu 				}
2942da7f033dSHerbert Xu 			}
2943da7f033dSHerbert Xu 		}
2944da7f033dSHerbert Xu 	}, {
2945da7f033dSHerbert Xu 		.alg = "ecb(blowfish)",
29461aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2947da7f033dSHerbert Xu 		.suite = {
2948da7f033dSHerbert Xu 			.cipher = {
2949da7f033dSHerbert Xu 				.enc = {
2950da7f033dSHerbert Xu 					.vecs = bf_enc_tv_template,
2951da7f033dSHerbert Xu 					.count = BF_ENC_TEST_VECTORS
2952da7f033dSHerbert Xu 				},
2953da7f033dSHerbert Xu 				.dec = {
2954da7f033dSHerbert Xu 					.vecs = bf_dec_tv_template,
2955da7f033dSHerbert Xu 					.count = BF_DEC_TEST_VECTORS
2956da7f033dSHerbert Xu 				}
2957da7f033dSHerbert Xu 			}
2958da7f033dSHerbert Xu 		}
2959da7f033dSHerbert Xu 	}, {
2960da7f033dSHerbert Xu 		.alg = "ecb(camellia)",
29611aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2962da7f033dSHerbert Xu 		.suite = {
2963da7f033dSHerbert Xu 			.cipher = {
2964da7f033dSHerbert Xu 				.enc = {
2965da7f033dSHerbert Xu 					.vecs = camellia_enc_tv_template,
2966da7f033dSHerbert Xu 					.count = CAMELLIA_ENC_TEST_VECTORS
2967da7f033dSHerbert Xu 				},
2968da7f033dSHerbert Xu 				.dec = {
2969da7f033dSHerbert Xu 					.vecs = camellia_dec_tv_template,
2970da7f033dSHerbert Xu 					.count = CAMELLIA_DEC_TEST_VECTORS
2971da7f033dSHerbert Xu 				}
2972da7f033dSHerbert Xu 			}
2973da7f033dSHerbert Xu 		}
2974da7f033dSHerbert Xu 	}, {
2975da7f033dSHerbert Xu 		.alg = "ecb(cast5)",
29761aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2977da7f033dSHerbert Xu 		.suite = {
2978da7f033dSHerbert Xu 			.cipher = {
2979da7f033dSHerbert Xu 				.enc = {
2980da7f033dSHerbert Xu 					.vecs = cast5_enc_tv_template,
2981da7f033dSHerbert Xu 					.count = CAST5_ENC_TEST_VECTORS
2982da7f033dSHerbert Xu 				},
2983da7f033dSHerbert Xu 				.dec = {
2984da7f033dSHerbert Xu 					.vecs = cast5_dec_tv_template,
2985da7f033dSHerbert Xu 					.count = CAST5_DEC_TEST_VECTORS
2986da7f033dSHerbert Xu 				}
2987da7f033dSHerbert Xu 			}
2988da7f033dSHerbert Xu 		}
2989da7f033dSHerbert Xu 	}, {
2990da7f033dSHerbert Xu 		.alg = "ecb(cast6)",
29911aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2992da7f033dSHerbert Xu 		.suite = {
2993da7f033dSHerbert Xu 			.cipher = {
2994da7f033dSHerbert Xu 				.enc = {
2995da7f033dSHerbert Xu 					.vecs = cast6_enc_tv_template,
2996da7f033dSHerbert Xu 					.count = CAST6_ENC_TEST_VECTORS
2997da7f033dSHerbert Xu 				},
2998da7f033dSHerbert Xu 				.dec = {
2999da7f033dSHerbert Xu 					.vecs = cast6_dec_tv_template,
3000da7f033dSHerbert Xu 					.count = CAST6_DEC_TEST_VECTORS
3001da7f033dSHerbert Xu 				}
3002da7f033dSHerbert Xu 			}
3003da7f033dSHerbert Xu 		}
3004da7f033dSHerbert Xu 	}, {
3005e448370dSJussi Kivilinna 		.alg = "ecb(cipher_null)",
3006e448370dSJussi Kivilinna 		.test = alg_test_null,
3007e448370dSJussi Kivilinna 	}, {
3008da7f033dSHerbert Xu 		.alg = "ecb(des)",
30091aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3010da7f033dSHerbert Xu 		.suite = {
3011da7f033dSHerbert Xu 			.cipher = {
3012da7f033dSHerbert Xu 				.enc = {
3013da7f033dSHerbert Xu 					.vecs = des_enc_tv_template,
3014da7f033dSHerbert Xu 					.count = DES_ENC_TEST_VECTORS
3015da7f033dSHerbert Xu 				},
3016da7f033dSHerbert Xu 				.dec = {
3017da7f033dSHerbert Xu 					.vecs = des_dec_tv_template,
3018da7f033dSHerbert Xu 					.count = DES_DEC_TEST_VECTORS
3019da7f033dSHerbert Xu 				}
3020da7f033dSHerbert Xu 			}
3021da7f033dSHerbert Xu 		}
3022da7f033dSHerbert Xu 	}, {
3023da7f033dSHerbert Xu 		.alg = "ecb(des3_ede)",
30241aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3025a1915d51SJarod Wilson 		.fips_allowed = 1,
3026da7f033dSHerbert Xu 		.suite = {
3027da7f033dSHerbert Xu 			.cipher = {
3028da7f033dSHerbert Xu 				.enc = {
3029da7f033dSHerbert Xu 					.vecs = des3_ede_enc_tv_template,
3030da7f033dSHerbert Xu 					.count = DES3_EDE_ENC_TEST_VECTORS
3031da7f033dSHerbert Xu 				},
3032da7f033dSHerbert Xu 				.dec = {
3033da7f033dSHerbert Xu 					.vecs = des3_ede_dec_tv_template,
3034da7f033dSHerbert Xu 					.count = DES3_EDE_DEC_TEST_VECTORS
3035da7f033dSHerbert Xu 				}
3036da7f033dSHerbert Xu 			}
3037da7f033dSHerbert Xu 		}
3038da7f033dSHerbert Xu 	}, {
303966e5bd00SJussi Kivilinna 		.alg = "ecb(fcrypt)",
304066e5bd00SJussi Kivilinna 		.test = alg_test_skcipher,
304166e5bd00SJussi Kivilinna 		.suite = {
304266e5bd00SJussi Kivilinna 			.cipher = {
304366e5bd00SJussi Kivilinna 				.enc = {
304466e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_enc_tv_template,
304566e5bd00SJussi Kivilinna 					.count = 1
304666e5bd00SJussi Kivilinna 				},
304766e5bd00SJussi Kivilinna 				.dec = {
304866e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_dec_tv_template,
304966e5bd00SJussi Kivilinna 					.count = 1
305066e5bd00SJussi Kivilinna 				}
305166e5bd00SJussi Kivilinna 			}
305266e5bd00SJussi Kivilinna 		}
305366e5bd00SJussi Kivilinna 	}, {
3054da7f033dSHerbert Xu 		.alg = "ecb(khazad)",
30551aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3056da7f033dSHerbert Xu 		.suite = {
3057da7f033dSHerbert Xu 			.cipher = {
3058da7f033dSHerbert Xu 				.enc = {
3059da7f033dSHerbert Xu 					.vecs = khazad_enc_tv_template,
3060da7f033dSHerbert Xu 					.count = KHAZAD_ENC_TEST_VECTORS
3061da7f033dSHerbert Xu 				},
3062da7f033dSHerbert Xu 				.dec = {
3063da7f033dSHerbert Xu 					.vecs = khazad_dec_tv_template,
3064da7f033dSHerbert Xu 					.count = KHAZAD_DEC_TEST_VECTORS
3065da7f033dSHerbert Xu 				}
3066da7f033dSHerbert Xu 			}
3067da7f033dSHerbert Xu 		}
3068da7f033dSHerbert Xu 	}, {
3069da7f033dSHerbert Xu 		.alg = "ecb(seed)",
30701aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3071da7f033dSHerbert Xu 		.suite = {
3072da7f033dSHerbert Xu 			.cipher = {
3073da7f033dSHerbert Xu 				.enc = {
3074da7f033dSHerbert Xu 					.vecs = seed_enc_tv_template,
3075da7f033dSHerbert Xu 					.count = SEED_ENC_TEST_VECTORS
3076da7f033dSHerbert Xu 				},
3077da7f033dSHerbert Xu 				.dec = {
3078da7f033dSHerbert Xu 					.vecs = seed_dec_tv_template,
3079da7f033dSHerbert Xu 					.count = SEED_DEC_TEST_VECTORS
3080da7f033dSHerbert Xu 				}
3081da7f033dSHerbert Xu 			}
3082da7f033dSHerbert Xu 		}
3083da7f033dSHerbert Xu 	}, {
3084da7f033dSHerbert Xu 		.alg = "ecb(serpent)",
30851aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3086da7f033dSHerbert Xu 		.suite = {
3087da7f033dSHerbert Xu 			.cipher = {
3088da7f033dSHerbert Xu 				.enc = {
3089da7f033dSHerbert Xu 					.vecs = serpent_enc_tv_template,
3090da7f033dSHerbert Xu 					.count = SERPENT_ENC_TEST_VECTORS
3091da7f033dSHerbert Xu 				},
3092da7f033dSHerbert Xu 				.dec = {
3093da7f033dSHerbert Xu 					.vecs = serpent_dec_tv_template,
3094da7f033dSHerbert Xu 					.count = SERPENT_DEC_TEST_VECTORS
3095da7f033dSHerbert Xu 				}
3096da7f033dSHerbert Xu 			}
3097da7f033dSHerbert Xu 		}
3098da7f033dSHerbert Xu 	}, {
3099da7f033dSHerbert Xu 		.alg = "ecb(tea)",
31001aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3101da7f033dSHerbert Xu 		.suite = {
3102da7f033dSHerbert Xu 			.cipher = {
3103da7f033dSHerbert Xu 				.enc = {
3104da7f033dSHerbert Xu 					.vecs = tea_enc_tv_template,
3105da7f033dSHerbert Xu 					.count = TEA_ENC_TEST_VECTORS
3106da7f033dSHerbert Xu 				},
3107da7f033dSHerbert Xu 				.dec = {
3108da7f033dSHerbert Xu 					.vecs = tea_dec_tv_template,
3109da7f033dSHerbert Xu 					.count = TEA_DEC_TEST_VECTORS
3110da7f033dSHerbert Xu 				}
3111da7f033dSHerbert Xu 			}
3112da7f033dSHerbert Xu 		}
3113da7f033dSHerbert Xu 	}, {
3114da7f033dSHerbert Xu 		.alg = "ecb(tnepres)",
31151aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3116da7f033dSHerbert Xu 		.suite = {
3117da7f033dSHerbert Xu 			.cipher = {
3118da7f033dSHerbert Xu 				.enc = {
3119da7f033dSHerbert Xu 					.vecs = tnepres_enc_tv_template,
3120da7f033dSHerbert Xu 					.count = TNEPRES_ENC_TEST_VECTORS
3121da7f033dSHerbert Xu 				},
3122da7f033dSHerbert Xu 				.dec = {
3123da7f033dSHerbert Xu 					.vecs = tnepres_dec_tv_template,
3124da7f033dSHerbert Xu 					.count = TNEPRES_DEC_TEST_VECTORS
3125da7f033dSHerbert Xu 				}
3126da7f033dSHerbert Xu 			}
3127da7f033dSHerbert Xu 		}
3128da7f033dSHerbert Xu 	}, {
3129da7f033dSHerbert Xu 		.alg = "ecb(twofish)",
31301aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3131da7f033dSHerbert Xu 		.suite = {
3132da7f033dSHerbert Xu 			.cipher = {
3133da7f033dSHerbert Xu 				.enc = {
3134da7f033dSHerbert Xu 					.vecs = tf_enc_tv_template,
3135da7f033dSHerbert Xu 					.count = TF_ENC_TEST_VECTORS
3136da7f033dSHerbert Xu 				},
3137da7f033dSHerbert Xu 				.dec = {
3138da7f033dSHerbert Xu 					.vecs = tf_dec_tv_template,
3139da7f033dSHerbert Xu 					.count = TF_DEC_TEST_VECTORS
3140da7f033dSHerbert Xu 				}
3141da7f033dSHerbert Xu 			}
3142da7f033dSHerbert Xu 		}
3143da7f033dSHerbert Xu 	}, {
3144da7f033dSHerbert Xu 		.alg = "ecb(xeta)",
31451aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3146da7f033dSHerbert Xu 		.suite = {
3147da7f033dSHerbert Xu 			.cipher = {
3148da7f033dSHerbert Xu 				.enc = {
3149da7f033dSHerbert Xu 					.vecs = xeta_enc_tv_template,
3150da7f033dSHerbert Xu 					.count = XETA_ENC_TEST_VECTORS
3151da7f033dSHerbert Xu 				},
3152da7f033dSHerbert Xu 				.dec = {
3153da7f033dSHerbert Xu 					.vecs = xeta_dec_tv_template,
3154da7f033dSHerbert Xu 					.count = XETA_DEC_TEST_VECTORS
3155da7f033dSHerbert Xu 				}
3156da7f033dSHerbert Xu 			}
3157da7f033dSHerbert Xu 		}
3158da7f033dSHerbert Xu 	}, {
3159da7f033dSHerbert Xu 		.alg = "ecb(xtea)",
31601aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3161da7f033dSHerbert Xu 		.suite = {
3162da7f033dSHerbert Xu 			.cipher = {
3163da7f033dSHerbert Xu 				.enc = {
3164da7f033dSHerbert Xu 					.vecs = xtea_enc_tv_template,
3165da7f033dSHerbert Xu 					.count = XTEA_ENC_TEST_VECTORS
3166da7f033dSHerbert Xu 				},
3167da7f033dSHerbert Xu 				.dec = {
3168da7f033dSHerbert Xu 					.vecs = xtea_dec_tv_template,
3169da7f033dSHerbert Xu 					.count = XTEA_DEC_TEST_VECTORS
3170da7f033dSHerbert Xu 				}
3171da7f033dSHerbert Xu 			}
3172da7f033dSHerbert Xu 		}
3173da7f033dSHerbert Xu 	}, {
3174da7f033dSHerbert Xu 		.alg = "gcm(aes)",
3175da7f033dSHerbert Xu 		.test = alg_test_aead,
3176a1915d51SJarod Wilson 		.fips_allowed = 1,
3177da7f033dSHerbert Xu 		.suite = {
3178da7f033dSHerbert Xu 			.aead = {
3179da7f033dSHerbert Xu 				.enc = {
3180da7f033dSHerbert Xu 					.vecs = aes_gcm_enc_tv_template,
3181da7f033dSHerbert Xu 					.count = AES_GCM_ENC_TEST_VECTORS
3182da7f033dSHerbert Xu 				},
3183da7f033dSHerbert Xu 				.dec = {
3184da7f033dSHerbert Xu 					.vecs = aes_gcm_dec_tv_template,
3185da7f033dSHerbert Xu 					.count = AES_GCM_DEC_TEST_VECTORS
3186da7f033dSHerbert Xu 				}
3187da7f033dSHerbert Xu 			}
3188da7f033dSHerbert Xu 		}
3189da7f033dSHerbert Xu 	}, {
3190507069c9SYouquan, Song 		.alg = "ghash",
3191507069c9SYouquan, Song 		.test = alg_test_hash,
319218c0ebd2SJarod Wilson 		.fips_allowed = 1,
3193507069c9SYouquan, Song 		.suite = {
3194507069c9SYouquan, Song 			.hash = {
3195507069c9SYouquan, Song 				.vecs = ghash_tv_template,
3196507069c9SYouquan, Song 				.count = GHASH_TEST_VECTORS
3197507069c9SYouquan, Song 			}
3198507069c9SYouquan, Song 		}
3199507069c9SYouquan, Song 	}, {
3200a482b081SSonic Zhang 		.alg = "hmac(crc32)",
3201a482b081SSonic Zhang 		.test = alg_test_hash,
3202a482b081SSonic Zhang 		.suite = {
3203a482b081SSonic Zhang 			.hash = {
3204a482b081SSonic Zhang 				.vecs = bfin_crc_tv_template,
3205a482b081SSonic Zhang 				.count = BFIN_CRC_TEST_VECTORS
3206a482b081SSonic Zhang 			}
3207a482b081SSonic Zhang 		}
3208a482b081SSonic Zhang 	}, {
3209da7f033dSHerbert Xu 		.alg = "hmac(md5)",
3210da7f033dSHerbert Xu 		.test = alg_test_hash,
3211da7f033dSHerbert Xu 		.suite = {
3212da7f033dSHerbert Xu 			.hash = {
3213da7f033dSHerbert Xu 				.vecs = hmac_md5_tv_template,
3214da7f033dSHerbert Xu 				.count = HMAC_MD5_TEST_VECTORS
3215da7f033dSHerbert Xu 			}
3216da7f033dSHerbert Xu 		}
3217da7f033dSHerbert Xu 	}, {
3218da7f033dSHerbert Xu 		.alg = "hmac(rmd128)",
3219da7f033dSHerbert Xu 		.test = alg_test_hash,
3220da7f033dSHerbert Xu 		.suite = {
3221da7f033dSHerbert Xu 			.hash = {
3222da7f033dSHerbert Xu 				.vecs = hmac_rmd128_tv_template,
3223da7f033dSHerbert Xu 				.count = HMAC_RMD128_TEST_VECTORS
3224da7f033dSHerbert Xu 			}
3225da7f033dSHerbert Xu 		}
3226da7f033dSHerbert Xu 	}, {
3227da7f033dSHerbert Xu 		.alg = "hmac(rmd160)",
3228da7f033dSHerbert Xu 		.test = alg_test_hash,
3229da7f033dSHerbert Xu 		.suite = {
3230da7f033dSHerbert Xu 			.hash = {
3231da7f033dSHerbert Xu 				.vecs = hmac_rmd160_tv_template,
3232da7f033dSHerbert Xu 				.count = HMAC_RMD160_TEST_VECTORS
3233da7f033dSHerbert Xu 			}
3234da7f033dSHerbert Xu 		}
3235da7f033dSHerbert Xu 	}, {
3236da7f033dSHerbert Xu 		.alg = "hmac(sha1)",
3237da7f033dSHerbert Xu 		.test = alg_test_hash,
3238a1915d51SJarod Wilson 		.fips_allowed = 1,
3239da7f033dSHerbert Xu 		.suite = {
3240da7f033dSHerbert Xu 			.hash = {
3241da7f033dSHerbert Xu 				.vecs = hmac_sha1_tv_template,
3242da7f033dSHerbert Xu 				.count = HMAC_SHA1_TEST_VECTORS
3243da7f033dSHerbert Xu 			}
3244da7f033dSHerbert Xu 		}
3245da7f033dSHerbert Xu 	}, {
3246da7f033dSHerbert Xu 		.alg = "hmac(sha224)",
3247da7f033dSHerbert Xu 		.test = alg_test_hash,
3248a1915d51SJarod Wilson 		.fips_allowed = 1,
3249da7f033dSHerbert Xu 		.suite = {
3250da7f033dSHerbert Xu 			.hash = {
3251da7f033dSHerbert Xu 				.vecs = hmac_sha224_tv_template,
3252da7f033dSHerbert Xu 				.count = HMAC_SHA224_TEST_VECTORS
3253da7f033dSHerbert Xu 			}
3254da7f033dSHerbert Xu 		}
3255da7f033dSHerbert Xu 	}, {
3256da7f033dSHerbert Xu 		.alg = "hmac(sha256)",
3257da7f033dSHerbert Xu 		.test = alg_test_hash,
3258a1915d51SJarod Wilson 		.fips_allowed = 1,
3259da7f033dSHerbert Xu 		.suite = {
3260da7f033dSHerbert Xu 			.hash = {
3261da7f033dSHerbert Xu 				.vecs = hmac_sha256_tv_template,
3262da7f033dSHerbert Xu 				.count = HMAC_SHA256_TEST_VECTORS
3263da7f033dSHerbert Xu 			}
3264da7f033dSHerbert Xu 		}
3265da7f033dSHerbert Xu 	}, {
3266da7f033dSHerbert Xu 		.alg = "hmac(sha384)",
3267da7f033dSHerbert Xu 		.test = alg_test_hash,
3268a1915d51SJarod Wilson 		.fips_allowed = 1,
3269da7f033dSHerbert Xu 		.suite = {
3270da7f033dSHerbert Xu 			.hash = {
3271da7f033dSHerbert Xu 				.vecs = hmac_sha384_tv_template,
3272da7f033dSHerbert Xu 				.count = HMAC_SHA384_TEST_VECTORS
3273da7f033dSHerbert Xu 			}
3274da7f033dSHerbert Xu 		}
3275da7f033dSHerbert Xu 	}, {
3276da7f033dSHerbert Xu 		.alg = "hmac(sha512)",
3277da7f033dSHerbert Xu 		.test = alg_test_hash,
3278a1915d51SJarod Wilson 		.fips_allowed = 1,
3279da7f033dSHerbert Xu 		.suite = {
3280da7f033dSHerbert Xu 			.hash = {
3281da7f033dSHerbert Xu 				.vecs = hmac_sha512_tv_template,
3282da7f033dSHerbert Xu 				.count = HMAC_SHA512_TEST_VECTORS
3283da7f033dSHerbert Xu 			}
3284da7f033dSHerbert Xu 		}
3285da7f033dSHerbert Xu 	}, {
3286bb5530e4SStephan Mueller 		.alg = "jitterentropy_rng",
3287bb5530e4SStephan Mueller 		.fips_allowed = 1,
3288bb5530e4SStephan Mueller 		.test = alg_test_null,
3289bb5530e4SStephan Mueller 	}, {
329035351988SStephan Mueller 		.alg = "kw(aes)",
329135351988SStephan Mueller 		.test = alg_test_skcipher,
329235351988SStephan Mueller 		.fips_allowed = 1,
329335351988SStephan Mueller 		.suite = {
329435351988SStephan Mueller 			.cipher = {
329535351988SStephan Mueller 				.enc = {
329635351988SStephan Mueller 					.vecs = aes_kw_enc_tv_template,
329735351988SStephan Mueller 					.count = ARRAY_SIZE(aes_kw_enc_tv_template)
329835351988SStephan Mueller 				},
329935351988SStephan Mueller 				.dec = {
330035351988SStephan Mueller 					.vecs = aes_kw_dec_tv_template,
330135351988SStephan Mueller 					.count = ARRAY_SIZE(aes_kw_dec_tv_template)
330235351988SStephan Mueller 				}
330335351988SStephan Mueller 			}
330435351988SStephan Mueller 		}
330535351988SStephan Mueller 	}, {
3306da7f033dSHerbert Xu 		.alg = "lrw(aes)",
33071aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3308da7f033dSHerbert Xu 		.suite = {
3309da7f033dSHerbert Xu 			.cipher = {
3310da7f033dSHerbert Xu 				.enc = {
3311da7f033dSHerbert Xu 					.vecs = aes_lrw_enc_tv_template,
3312da7f033dSHerbert Xu 					.count = AES_LRW_ENC_TEST_VECTORS
3313da7f033dSHerbert Xu 				},
3314da7f033dSHerbert Xu 				.dec = {
3315da7f033dSHerbert Xu 					.vecs = aes_lrw_dec_tv_template,
3316da7f033dSHerbert Xu 					.count = AES_LRW_DEC_TEST_VECTORS
3317da7f033dSHerbert Xu 				}
3318da7f033dSHerbert Xu 			}
3319da7f033dSHerbert Xu 		}
3320da7f033dSHerbert Xu 	}, {
33210840605eSJussi Kivilinna 		.alg = "lrw(camellia)",
33220840605eSJussi Kivilinna 		.test = alg_test_skcipher,
33230840605eSJussi Kivilinna 		.suite = {
33240840605eSJussi Kivilinna 			.cipher = {
33250840605eSJussi Kivilinna 				.enc = {
33260840605eSJussi Kivilinna 					.vecs = camellia_lrw_enc_tv_template,
33270840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_ENC_TEST_VECTORS
33280840605eSJussi Kivilinna 				},
33290840605eSJussi Kivilinna 				.dec = {
33300840605eSJussi Kivilinna 					.vecs = camellia_lrw_dec_tv_template,
33310840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_DEC_TEST_VECTORS
33320840605eSJussi Kivilinna 				}
33330840605eSJussi Kivilinna 			}
33340840605eSJussi Kivilinna 		}
33350840605eSJussi Kivilinna 	}, {
33369b8b0405SJohannes Goetzfried 		.alg = "lrw(cast6)",
33379b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
33389b8b0405SJohannes Goetzfried 		.suite = {
33399b8b0405SJohannes Goetzfried 			.cipher = {
33409b8b0405SJohannes Goetzfried 				.enc = {
33419b8b0405SJohannes Goetzfried 					.vecs = cast6_lrw_enc_tv_template,
33429b8b0405SJohannes Goetzfried 					.count = CAST6_LRW_ENC_TEST_VECTORS
33439b8b0405SJohannes Goetzfried 				},
33449b8b0405SJohannes Goetzfried 				.dec = {
33459b8b0405SJohannes Goetzfried 					.vecs = cast6_lrw_dec_tv_template,
33469b8b0405SJohannes Goetzfried 					.count = CAST6_LRW_DEC_TEST_VECTORS
33479b8b0405SJohannes Goetzfried 				}
33489b8b0405SJohannes Goetzfried 			}
33499b8b0405SJohannes Goetzfried 		}
33509b8b0405SJohannes Goetzfried 	}, {
3351d7bfc0faSJussi Kivilinna 		.alg = "lrw(serpent)",
3352d7bfc0faSJussi Kivilinna 		.test = alg_test_skcipher,
3353d7bfc0faSJussi Kivilinna 		.suite = {
3354d7bfc0faSJussi Kivilinna 			.cipher = {
3355d7bfc0faSJussi Kivilinna 				.enc = {
3356d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_enc_tv_template,
3357d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_ENC_TEST_VECTORS
3358d7bfc0faSJussi Kivilinna 				},
3359d7bfc0faSJussi Kivilinna 				.dec = {
3360d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_dec_tv_template,
3361d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_DEC_TEST_VECTORS
3362d7bfc0faSJussi Kivilinna 				}
3363d7bfc0faSJussi Kivilinna 			}
3364d7bfc0faSJussi Kivilinna 		}
3365d7bfc0faSJussi Kivilinna 	}, {
33660b2a1551SJussi Kivilinna 		.alg = "lrw(twofish)",
33670b2a1551SJussi Kivilinna 		.test = alg_test_skcipher,
33680b2a1551SJussi Kivilinna 		.suite = {
33690b2a1551SJussi Kivilinna 			.cipher = {
33700b2a1551SJussi Kivilinna 				.enc = {
33710b2a1551SJussi Kivilinna 					.vecs = tf_lrw_enc_tv_template,
33720b2a1551SJussi Kivilinna 					.count = TF_LRW_ENC_TEST_VECTORS
33730b2a1551SJussi Kivilinna 				},
33740b2a1551SJussi Kivilinna 				.dec = {
33750b2a1551SJussi Kivilinna 					.vecs = tf_lrw_dec_tv_template,
33760b2a1551SJussi Kivilinna 					.count = TF_LRW_DEC_TEST_VECTORS
33770b2a1551SJussi Kivilinna 				}
33780b2a1551SJussi Kivilinna 			}
33790b2a1551SJussi Kivilinna 		}
33800b2a1551SJussi Kivilinna 	}, {
33811443cc9bSKOVACS Krisztian 		.alg = "lz4",
33821443cc9bSKOVACS Krisztian 		.test = alg_test_comp,
33831443cc9bSKOVACS Krisztian 		.fips_allowed = 1,
33841443cc9bSKOVACS Krisztian 		.suite = {
33851443cc9bSKOVACS Krisztian 			.comp = {
33861443cc9bSKOVACS Krisztian 				.comp = {
33871443cc9bSKOVACS Krisztian 					.vecs = lz4_comp_tv_template,
33881443cc9bSKOVACS Krisztian 					.count = LZ4_COMP_TEST_VECTORS
33891443cc9bSKOVACS Krisztian 				},
33901443cc9bSKOVACS Krisztian 				.decomp = {
33911443cc9bSKOVACS Krisztian 					.vecs = lz4_decomp_tv_template,
33921443cc9bSKOVACS Krisztian 					.count = LZ4_DECOMP_TEST_VECTORS
33931443cc9bSKOVACS Krisztian 				}
33941443cc9bSKOVACS Krisztian 			}
33951443cc9bSKOVACS Krisztian 		}
33961443cc9bSKOVACS Krisztian 	}, {
33971443cc9bSKOVACS Krisztian 		.alg = "lz4hc",
33981443cc9bSKOVACS Krisztian 		.test = alg_test_comp,
33991443cc9bSKOVACS Krisztian 		.fips_allowed = 1,
34001443cc9bSKOVACS Krisztian 		.suite = {
34011443cc9bSKOVACS Krisztian 			.comp = {
34021443cc9bSKOVACS Krisztian 				.comp = {
34031443cc9bSKOVACS Krisztian 					.vecs = lz4hc_comp_tv_template,
34041443cc9bSKOVACS Krisztian 					.count = LZ4HC_COMP_TEST_VECTORS
34051443cc9bSKOVACS Krisztian 				},
34061443cc9bSKOVACS Krisztian 				.decomp = {
34071443cc9bSKOVACS Krisztian 					.vecs = lz4hc_decomp_tv_template,
34081443cc9bSKOVACS Krisztian 					.count = LZ4HC_DECOMP_TEST_VECTORS
34091443cc9bSKOVACS Krisztian 				}
34101443cc9bSKOVACS Krisztian 			}
34111443cc9bSKOVACS Krisztian 		}
34121443cc9bSKOVACS Krisztian 	}, {
3413da7f033dSHerbert Xu 		.alg = "lzo",
3414da7f033dSHerbert Xu 		.test = alg_test_comp,
34150818904dSMilan Broz 		.fips_allowed = 1,
3416da7f033dSHerbert Xu 		.suite = {
3417da7f033dSHerbert Xu 			.comp = {
3418da7f033dSHerbert Xu 				.comp = {
3419da7f033dSHerbert Xu 					.vecs = lzo_comp_tv_template,
3420da7f033dSHerbert Xu 					.count = LZO_COMP_TEST_VECTORS
3421da7f033dSHerbert Xu 				},
3422da7f033dSHerbert Xu 				.decomp = {
3423da7f033dSHerbert Xu 					.vecs = lzo_decomp_tv_template,
3424da7f033dSHerbert Xu 					.count = LZO_DECOMP_TEST_VECTORS
3425da7f033dSHerbert Xu 				}
3426da7f033dSHerbert Xu 			}
3427da7f033dSHerbert Xu 		}
3428da7f033dSHerbert Xu 	}, {
3429da7f033dSHerbert Xu 		.alg = "md4",
3430da7f033dSHerbert Xu 		.test = alg_test_hash,
3431da7f033dSHerbert Xu 		.suite = {
3432da7f033dSHerbert Xu 			.hash = {
3433da7f033dSHerbert Xu 				.vecs = md4_tv_template,
3434da7f033dSHerbert Xu 				.count = MD4_TEST_VECTORS
3435da7f033dSHerbert Xu 			}
3436da7f033dSHerbert Xu 		}
3437da7f033dSHerbert Xu 	}, {
3438da7f033dSHerbert Xu 		.alg = "md5",
3439da7f033dSHerbert Xu 		.test = alg_test_hash,
3440da7f033dSHerbert Xu 		.suite = {
3441da7f033dSHerbert Xu 			.hash = {
3442da7f033dSHerbert Xu 				.vecs = md5_tv_template,
3443da7f033dSHerbert Xu 				.count = MD5_TEST_VECTORS
3444da7f033dSHerbert Xu 			}
3445da7f033dSHerbert Xu 		}
3446da7f033dSHerbert Xu 	}, {
3447da7f033dSHerbert Xu 		.alg = "michael_mic",
3448da7f033dSHerbert Xu 		.test = alg_test_hash,
3449da7f033dSHerbert Xu 		.suite = {
3450da7f033dSHerbert Xu 			.hash = {
3451da7f033dSHerbert Xu 				.vecs = michael_mic_tv_template,
3452da7f033dSHerbert Xu 				.count = MICHAEL_MIC_TEST_VECTORS
3453da7f033dSHerbert Xu 			}
3454da7f033dSHerbert Xu 		}
3455da7f033dSHerbert Xu 	}, {
3456ba0e14acSPuneet Saxena 		.alg = "ofb(aes)",
3457ba0e14acSPuneet Saxena 		.test = alg_test_skcipher,
3458ba0e14acSPuneet Saxena 		.fips_allowed = 1,
3459ba0e14acSPuneet Saxena 		.suite = {
3460ba0e14acSPuneet Saxena 			.cipher = {
3461ba0e14acSPuneet Saxena 				.enc = {
3462ba0e14acSPuneet Saxena 					.vecs = aes_ofb_enc_tv_template,
3463ba0e14acSPuneet Saxena 					.count = AES_OFB_ENC_TEST_VECTORS
3464ba0e14acSPuneet Saxena 				},
3465ba0e14acSPuneet Saxena 				.dec = {
3466ba0e14acSPuneet Saxena 					.vecs = aes_ofb_dec_tv_template,
3467ba0e14acSPuneet Saxena 					.count = AES_OFB_DEC_TEST_VECTORS
3468ba0e14acSPuneet Saxena 				}
3469ba0e14acSPuneet Saxena 			}
3470ba0e14acSPuneet Saxena 		}
3471ba0e14acSPuneet Saxena 	}, {
3472da7f033dSHerbert Xu 		.alg = "pcbc(fcrypt)",
34731aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3474da7f033dSHerbert Xu 		.suite = {
3475da7f033dSHerbert Xu 			.cipher = {
3476da7f033dSHerbert Xu 				.enc = {
3477da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_enc_tv_template,
3478da7f033dSHerbert Xu 					.count = FCRYPT_ENC_TEST_VECTORS
3479da7f033dSHerbert Xu 				},
3480da7f033dSHerbert Xu 				.dec = {
3481da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_dec_tv_template,
3482da7f033dSHerbert Xu 					.count = FCRYPT_DEC_TEST_VECTORS
3483da7f033dSHerbert Xu 				}
3484da7f033dSHerbert Xu 			}
3485da7f033dSHerbert Xu 		}
3486da7f033dSHerbert Xu 	}, {
3487eee9dc61SMartin Willi 		.alg = "poly1305",
3488eee9dc61SMartin Willi 		.test = alg_test_hash,
3489eee9dc61SMartin Willi 		.suite = {
3490eee9dc61SMartin Willi 			.hash = {
3491eee9dc61SMartin Willi 				.vecs = poly1305_tv_template,
3492eee9dc61SMartin Willi 				.count = POLY1305_TEST_VECTORS
3493eee9dc61SMartin Willi 			}
3494eee9dc61SMartin Willi 		}
3495eee9dc61SMartin Willi 	}, {
3496da7f033dSHerbert Xu 		.alg = "rfc3686(ctr(aes))",
34971aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3498a1915d51SJarod Wilson 		.fips_allowed = 1,
3499da7f033dSHerbert Xu 		.suite = {
3500da7f033dSHerbert Xu 			.cipher = {
3501da7f033dSHerbert Xu 				.enc = {
3502f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_enc_tv_template,
3503f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_ENC_TEST_VECTORS
3504da7f033dSHerbert Xu 				},
3505da7f033dSHerbert Xu 				.dec = {
3506f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_dec_tv_template,
3507f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_DEC_TEST_VECTORS
3508da7f033dSHerbert Xu 				}
3509da7f033dSHerbert Xu 			}
3510da7f033dSHerbert Xu 		}
3511da7f033dSHerbert Xu 	}, {
35123f31a740SHerbert Xu 		.alg = "rfc4106(gcm(aes))",
351369435b94SAdrian Hoban 		.test = alg_test_aead,
3514db71f29aSJarod Wilson 		.fips_allowed = 1,
351569435b94SAdrian Hoban 		.suite = {
351669435b94SAdrian Hoban 			.aead = {
351769435b94SAdrian Hoban 				.enc = {
351869435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_enc_tv_template,
351969435b94SAdrian Hoban 					.count = AES_GCM_4106_ENC_TEST_VECTORS
352069435b94SAdrian Hoban 				},
352169435b94SAdrian Hoban 				.dec = {
352269435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_dec_tv_template,
352369435b94SAdrian Hoban 					.count = AES_GCM_4106_DEC_TEST_VECTORS
352469435b94SAdrian Hoban 				}
352569435b94SAdrian Hoban 			}
352669435b94SAdrian Hoban 		}
352769435b94SAdrian Hoban 	}, {
3528544c436aSHerbert Xu 		.alg = "rfc4309(ccm(aes))",
35295d667322SJarod Wilson 		.test = alg_test_aead,
3530a1915d51SJarod Wilson 		.fips_allowed = 1,
35315d667322SJarod Wilson 		.suite = {
35325d667322SJarod Wilson 			.aead = {
35335d667322SJarod Wilson 				.enc = {
35345d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_enc_tv_template,
35355d667322SJarod Wilson 					.count = AES_CCM_4309_ENC_TEST_VECTORS
35365d667322SJarod Wilson 				},
35375d667322SJarod Wilson 				.dec = {
35385d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_dec_tv_template,
35395d667322SJarod Wilson 					.count = AES_CCM_4309_DEC_TEST_VECTORS
35405d667322SJarod Wilson 				}
35415d667322SJarod Wilson 			}
35425d667322SJarod Wilson 		}
35435d667322SJarod Wilson 	}, {
3544bb68745eSHerbert Xu 		.alg = "rfc4543(gcm(aes))",
3545e9b7441aSJussi Kivilinna 		.test = alg_test_aead,
3546e9b7441aSJussi Kivilinna 		.suite = {
3547e9b7441aSJussi Kivilinna 			.aead = {
3548e9b7441aSJussi Kivilinna 				.enc = {
3549e9b7441aSJussi Kivilinna 					.vecs = aes_gcm_rfc4543_enc_tv_template,
3550e9b7441aSJussi Kivilinna 					.count = AES_GCM_4543_ENC_TEST_VECTORS
3551e9b7441aSJussi Kivilinna 				},
3552e9b7441aSJussi Kivilinna 				.dec = {
3553e9b7441aSJussi Kivilinna 					.vecs = aes_gcm_rfc4543_dec_tv_template,
3554e9b7441aSJussi Kivilinna 					.count = AES_GCM_4543_DEC_TEST_VECTORS
3555e9b7441aSJussi Kivilinna 				},
3556e9b7441aSJussi Kivilinna 			}
3557e9b7441aSJussi Kivilinna 		}
3558e9b7441aSJussi Kivilinna 	}, {
3559af2b76b5SMartin Willi 		.alg = "rfc7539(chacha20,poly1305)",
3560af2b76b5SMartin Willi 		.test = alg_test_aead,
3561af2b76b5SMartin Willi 		.suite = {
3562af2b76b5SMartin Willi 			.aead = {
3563af2b76b5SMartin Willi 				.enc = {
3564af2b76b5SMartin Willi 					.vecs = rfc7539_enc_tv_template,
3565af2b76b5SMartin Willi 					.count = RFC7539_ENC_TEST_VECTORS
3566af2b76b5SMartin Willi 				},
3567af2b76b5SMartin Willi 				.dec = {
3568af2b76b5SMartin Willi 					.vecs = rfc7539_dec_tv_template,
3569af2b76b5SMartin Willi 					.count = RFC7539_DEC_TEST_VECTORS
3570af2b76b5SMartin Willi 				},
3571af2b76b5SMartin Willi 			}
3572af2b76b5SMartin Willi 		}
3573af2b76b5SMartin Willi 	}, {
35745900758dSMartin Willi 		.alg = "rfc7539esp(chacha20,poly1305)",
35755900758dSMartin Willi 		.test = alg_test_aead,
35765900758dSMartin Willi 		.suite = {
35775900758dSMartin Willi 			.aead = {
35785900758dSMartin Willi 				.enc = {
35795900758dSMartin Willi 					.vecs = rfc7539esp_enc_tv_template,
35805900758dSMartin Willi 					.count = RFC7539ESP_ENC_TEST_VECTORS
35815900758dSMartin Willi 				},
35825900758dSMartin Willi 				.dec = {
35835900758dSMartin Willi 					.vecs = rfc7539esp_dec_tv_template,
35845900758dSMartin Willi 					.count = RFC7539ESP_DEC_TEST_VECTORS
35855900758dSMartin Willi 				},
35865900758dSMartin Willi 			}
35875900758dSMartin Willi 		}
35885900758dSMartin Willi 	}, {
3589da7f033dSHerbert Xu 		.alg = "rmd128",
3590da7f033dSHerbert Xu 		.test = alg_test_hash,
3591da7f033dSHerbert Xu 		.suite = {
3592da7f033dSHerbert Xu 			.hash = {
3593da7f033dSHerbert Xu 				.vecs = rmd128_tv_template,
3594da7f033dSHerbert Xu 				.count = RMD128_TEST_VECTORS
3595da7f033dSHerbert Xu 			}
3596da7f033dSHerbert Xu 		}
3597da7f033dSHerbert Xu 	}, {
3598da7f033dSHerbert Xu 		.alg = "rmd160",
3599da7f033dSHerbert Xu 		.test = alg_test_hash,
3600da7f033dSHerbert Xu 		.suite = {
3601da7f033dSHerbert Xu 			.hash = {
3602da7f033dSHerbert Xu 				.vecs = rmd160_tv_template,
3603da7f033dSHerbert Xu 				.count = RMD160_TEST_VECTORS
3604da7f033dSHerbert Xu 			}
3605da7f033dSHerbert Xu 		}
3606da7f033dSHerbert Xu 	}, {
3607da7f033dSHerbert Xu 		.alg = "rmd256",
3608da7f033dSHerbert Xu 		.test = alg_test_hash,
3609da7f033dSHerbert Xu 		.suite = {
3610da7f033dSHerbert Xu 			.hash = {
3611da7f033dSHerbert Xu 				.vecs = rmd256_tv_template,
3612da7f033dSHerbert Xu 				.count = RMD256_TEST_VECTORS
3613da7f033dSHerbert Xu 			}
3614da7f033dSHerbert Xu 		}
3615da7f033dSHerbert Xu 	}, {
3616da7f033dSHerbert Xu 		.alg = "rmd320",
3617da7f033dSHerbert Xu 		.test = alg_test_hash,
3618da7f033dSHerbert Xu 		.suite = {
3619da7f033dSHerbert Xu 			.hash = {
3620da7f033dSHerbert Xu 				.vecs = rmd320_tv_template,
3621da7f033dSHerbert Xu 				.count = RMD320_TEST_VECTORS
3622da7f033dSHerbert Xu 			}
3623da7f033dSHerbert Xu 		}
3624da7f033dSHerbert Xu 	}, {
3625946cc463STadeusz Struk 		.alg = "rsa",
3626946cc463STadeusz Struk 		.test = alg_test_akcipher,
3627946cc463STadeusz Struk 		.fips_allowed = 1,
3628946cc463STadeusz Struk 		.suite = {
3629946cc463STadeusz Struk 			.akcipher = {
3630946cc463STadeusz Struk 				.vecs = rsa_tv_template,
3631946cc463STadeusz Struk 				.count = RSA_TEST_VECTORS
3632946cc463STadeusz Struk 			}
3633946cc463STadeusz Struk 		}
3634946cc463STadeusz Struk 	}, {
3635da7f033dSHerbert Xu 		.alg = "salsa20",
36361aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3637da7f033dSHerbert Xu 		.suite = {
3638da7f033dSHerbert Xu 			.cipher = {
3639da7f033dSHerbert Xu 				.enc = {
3640da7f033dSHerbert Xu 					.vecs = salsa20_stream_enc_tv_template,
3641da7f033dSHerbert Xu 					.count = SALSA20_STREAM_ENC_TEST_VECTORS
3642da7f033dSHerbert Xu 				}
3643da7f033dSHerbert Xu 			}
3644da7f033dSHerbert Xu 		}
3645da7f033dSHerbert Xu 	}, {
3646da7f033dSHerbert Xu 		.alg = "sha1",
3647da7f033dSHerbert Xu 		.test = alg_test_hash,
3648a1915d51SJarod Wilson 		.fips_allowed = 1,
3649da7f033dSHerbert Xu 		.suite = {
3650da7f033dSHerbert Xu 			.hash = {
3651da7f033dSHerbert Xu 				.vecs = sha1_tv_template,
3652da7f033dSHerbert Xu 				.count = SHA1_TEST_VECTORS
3653da7f033dSHerbert Xu 			}
3654da7f033dSHerbert Xu 		}
3655da7f033dSHerbert Xu 	}, {
3656da7f033dSHerbert Xu 		.alg = "sha224",
3657da7f033dSHerbert Xu 		.test = alg_test_hash,
3658a1915d51SJarod Wilson 		.fips_allowed = 1,
3659da7f033dSHerbert Xu 		.suite = {
3660da7f033dSHerbert Xu 			.hash = {
3661da7f033dSHerbert Xu 				.vecs = sha224_tv_template,
3662da7f033dSHerbert Xu 				.count = SHA224_TEST_VECTORS
3663da7f033dSHerbert Xu 			}
3664da7f033dSHerbert Xu 		}
3665da7f033dSHerbert Xu 	}, {
3666da7f033dSHerbert Xu 		.alg = "sha256",
3667da7f033dSHerbert Xu 		.test = alg_test_hash,
3668a1915d51SJarod Wilson 		.fips_allowed = 1,
3669da7f033dSHerbert Xu 		.suite = {
3670da7f033dSHerbert Xu 			.hash = {
3671da7f033dSHerbert Xu 				.vecs = sha256_tv_template,
3672da7f033dSHerbert Xu 				.count = SHA256_TEST_VECTORS
3673da7f033dSHerbert Xu 			}
3674da7f033dSHerbert Xu 		}
3675da7f033dSHerbert Xu 	}, {
3676da7f033dSHerbert Xu 		.alg = "sha384",
3677da7f033dSHerbert Xu 		.test = alg_test_hash,
3678a1915d51SJarod Wilson 		.fips_allowed = 1,
3679da7f033dSHerbert Xu 		.suite = {
3680da7f033dSHerbert Xu 			.hash = {
3681da7f033dSHerbert Xu 				.vecs = sha384_tv_template,
3682da7f033dSHerbert Xu 				.count = SHA384_TEST_VECTORS
3683da7f033dSHerbert Xu 			}
3684da7f033dSHerbert Xu 		}
3685da7f033dSHerbert Xu 	}, {
3686da7f033dSHerbert Xu 		.alg = "sha512",
3687da7f033dSHerbert Xu 		.test = alg_test_hash,
3688a1915d51SJarod Wilson 		.fips_allowed = 1,
3689da7f033dSHerbert Xu 		.suite = {
3690da7f033dSHerbert Xu 			.hash = {
3691da7f033dSHerbert Xu 				.vecs = sha512_tv_template,
3692da7f033dSHerbert Xu 				.count = SHA512_TEST_VECTORS
3693da7f033dSHerbert Xu 			}
3694da7f033dSHerbert Xu 		}
3695da7f033dSHerbert Xu 	}, {
3696da7f033dSHerbert Xu 		.alg = "tgr128",
3697da7f033dSHerbert Xu 		.test = alg_test_hash,
3698da7f033dSHerbert Xu 		.suite = {
3699da7f033dSHerbert Xu 			.hash = {
3700da7f033dSHerbert Xu 				.vecs = tgr128_tv_template,
3701da7f033dSHerbert Xu 				.count = TGR128_TEST_VECTORS
3702da7f033dSHerbert Xu 			}
3703da7f033dSHerbert Xu 		}
3704da7f033dSHerbert Xu 	}, {
3705da7f033dSHerbert Xu 		.alg = "tgr160",
3706da7f033dSHerbert Xu 		.test = alg_test_hash,
3707da7f033dSHerbert Xu 		.suite = {
3708da7f033dSHerbert Xu 			.hash = {
3709da7f033dSHerbert Xu 				.vecs = tgr160_tv_template,
3710da7f033dSHerbert Xu 				.count = TGR160_TEST_VECTORS
3711da7f033dSHerbert Xu 			}
3712da7f033dSHerbert Xu 		}
3713da7f033dSHerbert Xu 	}, {
3714da7f033dSHerbert Xu 		.alg = "tgr192",
3715da7f033dSHerbert Xu 		.test = alg_test_hash,
3716da7f033dSHerbert Xu 		.suite = {
3717da7f033dSHerbert Xu 			.hash = {
3718da7f033dSHerbert Xu 				.vecs = tgr192_tv_template,
3719da7f033dSHerbert Xu 				.count = TGR192_TEST_VECTORS
3720da7f033dSHerbert Xu 			}
3721da7f033dSHerbert Xu 		}
3722da7f033dSHerbert Xu 	}, {
3723f1939f7cSShane Wang 		.alg = "vmac(aes)",
3724f1939f7cSShane Wang 		.test = alg_test_hash,
3725f1939f7cSShane Wang 		.suite = {
3726f1939f7cSShane Wang 			.hash = {
3727f1939f7cSShane Wang 				.vecs = aes_vmac128_tv_template,
3728f1939f7cSShane Wang 				.count = VMAC_AES_TEST_VECTORS
3729f1939f7cSShane Wang 			}
3730f1939f7cSShane Wang 		}
3731f1939f7cSShane Wang 	}, {
3732da7f033dSHerbert Xu 		.alg = "wp256",
3733da7f033dSHerbert Xu 		.test = alg_test_hash,
3734da7f033dSHerbert Xu 		.suite = {
3735da7f033dSHerbert Xu 			.hash = {
3736da7f033dSHerbert Xu 				.vecs = wp256_tv_template,
3737da7f033dSHerbert Xu 				.count = WP256_TEST_VECTORS
3738da7f033dSHerbert Xu 			}
3739da7f033dSHerbert Xu 		}
3740da7f033dSHerbert Xu 	}, {
3741da7f033dSHerbert Xu 		.alg = "wp384",
3742da7f033dSHerbert Xu 		.test = alg_test_hash,
3743da7f033dSHerbert Xu 		.suite = {
3744da7f033dSHerbert Xu 			.hash = {
3745da7f033dSHerbert Xu 				.vecs = wp384_tv_template,
3746da7f033dSHerbert Xu 				.count = WP384_TEST_VECTORS
3747da7f033dSHerbert Xu 			}
3748da7f033dSHerbert Xu 		}
3749da7f033dSHerbert Xu 	}, {
3750da7f033dSHerbert Xu 		.alg = "wp512",
3751da7f033dSHerbert Xu 		.test = alg_test_hash,
3752da7f033dSHerbert Xu 		.suite = {
3753da7f033dSHerbert Xu 			.hash = {
3754da7f033dSHerbert Xu 				.vecs = wp512_tv_template,
3755da7f033dSHerbert Xu 				.count = WP512_TEST_VECTORS
3756da7f033dSHerbert Xu 			}
3757da7f033dSHerbert Xu 		}
3758da7f033dSHerbert Xu 	}, {
3759da7f033dSHerbert Xu 		.alg = "xcbc(aes)",
3760da7f033dSHerbert Xu 		.test = alg_test_hash,
3761da7f033dSHerbert Xu 		.suite = {
3762da7f033dSHerbert Xu 			.hash = {
3763da7f033dSHerbert Xu 				.vecs = aes_xcbc128_tv_template,
3764da7f033dSHerbert Xu 				.count = XCBC_AES_TEST_VECTORS
3765da7f033dSHerbert Xu 			}
3766da7f033dSHerbert Xu 		}
3767da7f033dSHerbert Xu 	}, {
3768da7f033dSHerbert Xu 		.alg = "xts(aes)",
37691aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
37702918aa8dSJarod Wilson 		.fips_allowed = 1,
3771da7f033dSHerbert Xu 		.suite = {
3772da7f033dSHerbert Xu 			.cipher = {
3773da7f033dSHerbert Xu 				.enc = {
3774da7f033dSHerbert Xu 					.vecs = aes_xts_enc_tv_template,
3775da7f033dSHerbert Xu 					.count = AES_XTS_ENC_TEST_VECTORS
3776da7f033dSHerbert Xu 				},
3777da7f033dSHerbert Xu 				.dec = {
3778da7f033dSHerbert Xu 					.vecs = aes_xts_dec_tv_template,
3779da7f033dSHerbert Xu 					.count = AES_XTS_DEC_TEST_VECTORS
3780da7f033dSHerbert Xu 				}
3781da7f033dSHerbert Xu 			}
3782da7f033dSHerbert Xu 		}
37830c01aed5SGeert Uytterhoeven 	}, {
37840840605eSJussi Kivilinna 		.alg = "xts(camellia)",
37850840605eSJussi Kivilinna 		.test = alg_test_skcipher,
37860840605eSJussi Kivilinna 		.suite = {
37870840605eSJussi Kivilinna 			.cipher = {
37880840605eSJussi Kivilinna 				.enc = {
37890840605eSJussi Kivilinna 					.vecs = camellia_xts_enc_tv_template,
37900840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_ENC_TEST_VECTORS
37910840605eSJussi Kivilinna 				},
37920840605eSJussi Kivilinna 				.dec = {
37930840605eSJussi Kivilinna 					.vecs = camellia_xts_dec_tv_template,
37940840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_DEC_TEST_VECTORS
37950840605eSJussi Kivilinna 				}
37960840605eSJussi Kivilinna 			}
37970840605eSJussi Kivilinna 		}
37980840605eSJussi Kivilinna 	}, {
37999b8b0405SJohannes Goetzfried 		.alg = "xts(cast6)",
38009b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
38019b8b0405SJohannes Goetzfried 		.suite = {
38029b8b0405SJohannes Goetzfried 			.cipher = {
38039b8b0405SJohannes Goetzfried 				.enc = {
38049b8b0405SJohannes Goetzfried 					.vecs = cast6_xts_enc_tv_template,
38059b8b0405SJohannes Goetzfried 					.count = CAST6_XTS_ENC_TEST_VECTORS
38069b8b0405SJohannes Goetzfried 				},
38079b8b0405SJohannes Goetzfried 				.dec = {
38089b8b0405SJohannes Goetzfried 					.vecs = cast6_xts_dec_tv_template,
38099b8b0405SJohannes Goetzfried 					.count = CAST6_XTS_DEC_TEST_VECTORS
38109b8b0405SJohannes Goetzfried 				}
38119b8b0405SJohannes Goetzfried 			}
38129b8b0405SJohannes Goetzfried 		}
38139b8b0405SJohannes Goetzfried 	}, {
381418be20b9SJussi Kivilinna 		.alg = "xts(serpent)",
381518be20b9SJussi Kivilinna 		.test = alg_test_skcipher,
381618be20b9SJussi Kivilinna 		.suite = {
381718be20b9SJussi Kivilinna 			.cipher = {
381818be20b9SJussi Kivilinna 				.enc = {
381918be20b9SJussi Kivilinna 					.vecs = serpent_xts_enc_tv_template,
382018be20b9SJussi Kivilinna 					.count = SERPENT_XTS_ENC_TEST_VECTORS
382118be20b9SJussi Kivilinna 				},
382218be20b9SJussi Kivilinna 				.dec = {
382318be20b9SJussi Kivilinna 					.vecs = serpent_xts_dec_tv_template,
382418be20b9SJussi Kivilinna 					.count = SERPENT_XTS_DEC_TEST_VECTORS
382518be20b9SJussi Kivilinna 				}
382618be20b9SJussi Kivilinna 			}
382718be20b9SJussi Kivilinna 		}
382818be20b9SJussi Kivilinna 	}, {
3829aed265b9SJussi Kivilinna 		.alg = "xts(twofish)",
3830aed265b9SJussi Kivilinna 		.test = alg_test_skcipher,
3831aed265b9SJussi Kivilinna 		.suite = {
3832aed265b9SJussi Kivilinna 			.cipher = {
3833aed265b9SJussi Kivilinna 				.enc = {
3834aed265b9SJussi Kivilinna 					.vecs = tf_xts_enc_tv_template,
3835aed265b9SJussi Kivilinna 					.count = TF_XTS_ENC_TEST_VECTORS
3836aed265b9SJussi Kivilinna 				},
3837aed265b9SJussi Kivilinna 				.dec = {
3838aed265b9SJussi Kivilinna 					.vecs = tf_xts_dec_tv_template,
3839aed265b9SJussi Kivilinna 					.count = TF_XTS_DEC_TEST_VECTORS
3840aed265b9SJussi Kivilinna 				}
3841aed265b9SJussi Kivilinna 			}
3842aed265b9SJussi Kivilinna 		}
3843aed265b9SJussi Kivilinna 	}, {
38440c01aed5SGeert Uytterhoeven 		.alg = "zlib",
38450c01aed5SGeert Uytterhoeven 		.test = alg_test_pcomp,
38460818904dSMilan Broz 		.fips_allowed = 1,
38470c01aed5SGeert Uytterhoeven 		.suite = {
38480c01aed5SGeert Uytterhoeven 			.pcomp = {
38490c01aed5SGeert Uytterhoeven 				.comp = {
38500c01aed5SGeert Uytterhoeven 					.vecs = zlib_comp_tv_template,
38510c01aed5SGeert Uytterhoeven 					.count = ZLIB_COMP_TEST_VECTORS
38520c01aed5SGeert Uytterhoeven 				},
38530c01aed5SGeert Uytterhoeven 				.decomp = {
38540c01aed5SGeert Uytterhoeven 					.vecs = zlib_decomp_tv_template,
38550c01aed5SGeert Uytterhoeven 					.count = ZLIB_DECOMP_TEST_VECTORS
38560c01aed5SGeert Uytterhoeven 				}
38570c01aed5SGeert Uytterhoeven 			}
38580c01aed5SGeert Uytterhoeven 		}
3859da7f033dSHerbert Xu 	}
3860da7f033dSHerbert Xu };
3861da7f033dSHerbert Xu 
38625714758bSJussi Kivilinna static bool alg_test_descs_checked;
38635714758bSJussi Kivilinna 
38645714758bSJussi Kivilinna static void alg_test_descs_check_order(void)
38655714758bSJussi Kivilinna {
38665714758bSJussi Kivilinna 	int i;
38675714758bSJussi Kivilinna 
38685714758bSJussi Kivilinna 	/* only check once */
38695714758bSJussi Kivilinna 	if (alg_test_descs_checked)
38705714758bSJussi Kivilinna 		return;
38715714758bSJussi Kivilinna 
38725714758bSJussi Kivilinna 	alg_test_descs_checked = true;
38735714758bSJussi Kivilinna 
38745714758bSJussi Kivilinna 	for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) {
38755714758bSJussi Kivilinna 		int diff = strcmp(alg_test_descs[i - 1].alg,
38765714758bSJussi Kivilinna 				  alg_test_descs[i].alg);
38775714758bSJussi Kivilinna 
38785714758bSJussi Kivilinna 		if (WARN_ON(diff > 0)) {
38795714758bSJussi Kivilinna 			pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n",
38805714758bSJussi Kivilinna 				alg_test_descs[i - 1].alg,
38815714758bSJussi Kivilinna 				alg_test_descs[i].alg);
38825714758bSJussi Kivilinna 		}
38835714758bSJussi Kivilinna 
38845714758bSJussi Kivilinna 		if (WARN_ON(diff == 0)) {
38855714758bSJussi Kivilinna 			pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n",
38865714758bSJussi Kivilinna 				alg_test_descs[i].alg);
38875714758bSJussi Kivilinna 		}
38885714758bSJussi Kivilinna 	}
38895714758bSJussi Kivilinna }
38905714758bSJussi Kivilinna 
38911aa4ecd9SHerbert Xu static int alg_find_test(const char *alg)
3892da7f033dSHerbert Xu {
3893da7f033dSHerbert Xu 	int start = 0;
3894da7f033dSHerbert Xu 	int end = ARRAY_SIZE(alg_test_descs);
3895da7f033dSHerbert Xu 
3896da7f033dSHerbert Xu 	while (start < end) {
3897da7f033dSHerbert Xu 		int i = (start + end) / 2;
3898da7f033dSHerbert Xu 		int diff = strcmp(alg_test_descs[i].alg, alg);
3899da7f033dSHerbert Xu 
3900da7f033dSHerbert Xu 		if (diff > 0) {
3901da7f033dSHerbert Xu 			end = i;
3902da7f033dSHerbert Xu 			continue;
3903da7f033dSHerbert Xu 		}
3904da7f033dSHerbert Xu 
3905da7f033dSHerbert Xu 		if (diff < 0) {
3906da7f033dSHerbert Xu 			start = i + 1;
3907da7f033dSHerbert Xu 			continue;
3908da7f033dSHerbert Xu 		}
3909da7f033dSHerbert Xu 
39101aa4ecd9SHerbert Xu 		return i;
3911da7f033dSHerbert Xu 	}
3912da7f033dSHerbert Xu 
39131aa4ecd9SHerbert Xu 	return -1;
39141aa4ecd9SHerbert Xu }
39151aa4ecd9SHerbert Xu 
39161aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
39171aa4ecd9SHerbert Xu {
39181aa4ecd9SHerbert Xu 	int i;
3919a68f6610SHerbert Xu 	int j;
3920d12d6b6dSNeil Horman 	int rc;
39211aa4ecd9SHerbert Xu 
39225714758bSJussi Kivilinna 	alg_test_descs_check_order();
39235714758bSJussi Kivilinna 
39241aa4ecd9SHerbert Xu 	if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
39251aa4ecd9SHerbert Xu 		char nalg[CRYPTO_MAX_ALG_NAME];
39261aa4ecd9SHerbert Xu 
39271aa4ecd9SHerbert Xu 		if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
39281aa4ecd9SHerbert Xu 		    sizeof(nalg))
39291aa4ecd9SHerbert Xu 			return -ENAMETOOLONG;
39301aa4ecd9SHerbert Xu 
39311aa4ecd9SHerbert Xu 		i = alg_find_test(nalg);
39321aa4ecd9SHerbert Xu 		if (i < 0)
39331aa4ecd9SHerbert Xu 			goto notest;
39341aa4ecd9SHerbert Xu 
3935a3bef3a3SJarod Wilson 		if (fips_enabled && !alg_test_descs[i].fips_allowed)
3936a3bef3a3SJarod Wilson 			goto non_fips_alg;
3937a3bef3a3SJarod Wilson 
3938941fb328SJarod Wilson 		rc = alg_test_cipher(alg_test_descs + i, driver, type, mask);
3939941fb328SJarod Wilson 		goto test_done;
39401aa4ecd9SHerbert Xu 	}
39411aa4ecd9SHerbert Xu 
39421aa4ecd9SHerbert Xu 	i = alg_find_test(alg);
3943a68f6610SHerbert Xu 	j = alg_find_test(driver);
3944a68f6610SHerbert Xu 	if (i < 0 && j < 0)
39451aa4ecd9SHerbert Xu 		goto notest;
39461aa4ecd9SHerbert Xu 
3947a68f6610SHerbert Xu 	if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
3948a68f6610SHerbert Xu 			     (j >= 0 && !alg_test_descs[j].fips_allowed)))
3949a3bef3a3SJarod Wilson 		goto non_fips_alg;
3950a3bef3a3SJarod Wilson 
3951a68f6610SHerbert Xu 	rc = 0;
3952a68f6610SHerbert Xu 	if (i >= 0)
3953a68f6610SHerbert Xu 		rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
39541aa4ecd9SHerbert Xu 					     type, mask);
3955032c8cacSCristian Stoica 	if (j >= 0 && j != i)
3956a68f6610SHerbert Xu 		rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
3957a68f6610SHerbert Xu 					     type, mask);
3958a68f6610SHerbert Xu 
3959941fb328SJarod Wilson test_done:
3960d12d6b6dSNeil Horman 	if (fips_enabled && rc)
3961d12d6b6dSNeil Horman 		panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
3962d12d6b6dSNeil Horman 
396329ecd4abSJarod Wilson 	if (fips_enabled && !rc)
39643e8cffd4SMasanari Iida 		pr_info("alg: self-tests for %s (%s) passed\n", driver, alg);
396529ecd4abSJarod Wilson 
3966d12d6b6dSNeil Horman 	return rc;
39671aa4ecd9SHerbert Xu 
39681aa4ecd9SHerbert Xu notest:
3969da7f033dSHerbert Xu 	printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
3970da7f033dSHerbert Xu 	return 0;
3971a3bef3a3SJarod Wilson non_fips_alg:
3972a3bef3a3SJarod Wilson 	return -EINVAL;
3973da7f033dSHerbert Xu }
39740b767f96SAlexander Shishkin 
3975326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
39760b767f96SAlexander Shishkin 
3977da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test);
3978