xref: /openbmc/linux/crypto/testmgr.c (revision a368f43d)
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>
35802c7f1cSSalvatore Benedetto #include <crypto/kpp.h>
36d7db7a88SGiovanni Cabiddu #include <crypto/acompress.h>
37da7f033dSHerbert Xu 
38da7f033dSHerbert Xu #include "internal.h"
390b767f96SAlexander Shishkin 
409e5c9fe4SRichard W.M. Jones static bool notests;
419e5c9fe4SRichard W.M. Jones module_param(notests, bool, 0644);
429e5c9fe4SRichard W.M. Jones MODULE_PARM_DESC(notests, "disable crypto self-tests");
439e5c9fe4SRichard W.M. Jones 
44326a6346SHerbert Xu #ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS
450b767f96SAlexander Shishkin 
460b767f96SAlexander Shishkin /* a perfect nop */
470b767f96SAlexander Shishkin int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
480b767f96SAlexander Shishkin {
490b767f96SAlexander Shishkin 	return 0;
500b767f96SAlexander Shishkin }
510b767f96SAlexander Shishkin 
520b767f96SAlexander Shishkin #else
530b767f96SAlexander Shishkin 
54da7f033dSHerbert Xu #include "testmgr.h"
55da7f033dSHerbert Xu 
56da7f033dSHerbert Xu /*
57da7f033dSHerbert Xu  * Need slab memory for testing (size in number of pages).
58da7f033dSHerbert Xu  */
59da7f033dSHerbert Xu #define XBUFSIZE	8
60da7f033dSHerbert Xu 
61da7f033dSHerbert Xu /*
62da7f033dSHerbert Xu  * Indexes into the xbuf to simulate cross-page access.
63da7f033dSHerbert Xu  */
64da7f033dSHerbert Xu #define IDX1		32
65da7f033dSHerbert Xu #define IDX2		32400
6604b46fbdSArd Biesheuvel #define IDX3		1511
67da7f033dSHerbert Xu #define IDX4		8193
68da7f033dSHerbert Xu #define IDX5		22222
69da7f033dSHerbert Xu #define IDX6		17101
70da7f033dSHerbert Xu #define IDX7		27333
71da7f033dSHerbert Xu #define IDX8		3000
72da7f033dSHerbert Xu 
73da7f033dSHerbert Xu /*
74da7f033dSHerbert Xu * Used by test_cipher()
75da7f033dSHerbert Xu */
76da7f033dSHerbert Xu #define ENCRYPT 1
77da7f033dSHerbert Xu #define DECRYPT 0
78da7f033dSHerbert Xu 
79da7f033dSHerbert Xu struct tcrypt_result {
80da7f033dSHerbert Xu 	struct completion completion;
81da7f033dSHerbert Xu 	int err;
82da7f033dSHerbert Xu };
83da7f033dSHerbert Xu 
84da7f033dSHerbert Xu struct aead_test_suite {
85da7f033dSHerbert Xu 	struct {
86b13b1e0cSEric Biggers 		const struct aead_testvec *vecs;
87da7f033dSHerbert Xu 		unsigned int count;
88da7f033dSHerbert Xu 	} enc, dec;
89da7f033dSHerbert Xu };
90da7f033dSHerbert Xu 
91da7f033dSHerbert Xu struct cipher_test_suite {
92da7f033dSHerbert Xu 	struct {
93b13b1e0cSEric Biggers 		const struct cipher_testvec *vecs;
94da7f033dSHerbert Xu 		unsigned int count;
95da7f033dSHerbert Xu 	} enc, dec;
96da7f033dSHerbert Xu };
97da7f033dSHerbert Xu 
98da7f033dSHerbert Xu struct comp_test_suite {
99da7f033dSHerbert Xu 	struct {
100b13b1e0cSEric Biggers 		const struct comp_testvec *vecs;
101da7f033dSHerbert Xu 		unsigned int count;
102da7f033dSHerbert Xu 	} comp, decomp;
103da7f033dSHerbert Xu };
104da7f033dSHerbert Xu 
105da7f033dSHerbert Xu struct hash_test_suite {
106b13b1e0cSEric Biggers 	const struct hash_testvec *vecs;
107da7f033dSHerbert Xu 	unsigned int count;
108da7f033dSHerbert Xu };
109da7f033dSHerbert Xu 
1107647d6ceSJarod Wilson struct cprng_test_suite {
111b13b1e0cSEric Biggers 	const struct cprng_testvec *vecs;
1127647d6ceSJarod Wilson 	unsigned int count;
1137647d6ceSJarod Wilson };
1147647d6ceSJarod Wilson 
11564d1cdfbSStephan Mueller struct drbg_test_suite {
116b13b1e0cSEric Biggers 	const struct drbg_testvec *vecs;
11764d1cdfbSStephan Mueller 	unsigned int count;
11864d1cdfbSStephan Mueller };
11964d1cdfbSStephan Mueller 
120946cc463STadeusz Struk struct akcipher_test_suite {
121b13b1e0cSEric Biggers 	const struct akcipher_testvec *vecs;
122946cc463STadeusz Struk 	unsigned int count;
123946cc463STadeusz Struk };
124946cc463STadeusz Struk 
125802c7f1cSSalvatore Benedetto struct kpp_test_suite {
126b13b1e0cSEric Biggers 	const struct kpp_testvec *vecs;
127802c7f1cSSalvatore Benedetto 	unsigned int count;
128802c7f1cSSalvatore Benedetto };
129802c7f1cSSalvatore Benedetto 
130da7f033dSHerbert Xu struct alg_test_desc {
131da7f033dSHerbert Xu 	const char *alg;
132da7f033dSHerbert Xu 	int (*test)(const struct alg_test_desc *desc, const char *driver,
133da7f033dSHerbert Xu 		    u32 type, u32 mask);
134a1915d51SJarod Wilson 	int fips_allowed;	/* set if alg is allowed in fips mode */
135da7f033dSHerbert Xu 
136da7f033dSHerbert Xu 	union {
137da7f033dSHerbert Xu 		struct aead_test_suite aead;
138da7f033dSHerbert Xu 		struct cipher_test_suite cipher;
139da7f033dSHerbert Xu 		struct comp_test_suite comp;
140da7f033dSHerbert Xu 		struct hash_test_suite hash;
1417647d6ceSJarod Wilson 		struct cprng_test_suite cprng;
14264d1cdfbSStephan Mueller 		struct drbg_test_suite drbg;
143946cc463STadeusz Struk 		struct akcipher_test_suite akcipher;
144802c7f1cSSalvatore Benedetto 		struct kpp_test_suite kpp;
145da7f033dSHerbert Xu 	} suite;
146da7f033dSHerbert Xu };
147da7f033dSHerbert Xu 
148b13b1e0cSEric Biggers static const unsigned int IDX[8] = {
149b13b1e0cSEric Biggers 	IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
150da7f033dSHerbert Xu 
151da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len)
152da7f033dSHerbert Xu {
153da7f033dSHerbert Xu 	print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
154da7f033dSHerbert Xu 			16, 1,
155da7f033dSHerbert Xu 			buf, len, false);
156da7f033dSHerbert Xu }
157da7f033dSHerbert Xu 
158da7f033dSHerbert Xu static void tcrypt_complete(struct crypto_async_request *req, int err)
159da7f033dSHerbert Xu {
160da7f033dSHerbert Xu 	struct tcrypt_result *res = req->data;
161da7f033dSHerbert Xu 
162da7f033dSHerbert Xu 	if (err == -EINPROGRESS)
163da7f033dSHerbert Xu 		return;
164da7f033dSHerbert Xu 
165da7f033dSHerbert Xu 	res->err = err;
166da7f033dSHerbert Xu 	complete(&res->completion);
167da7f033dSHerbert Xu }
168da7f033dSHerbert Xu 
169f8b0d4d0SHerbert Xu static int testmgr_alloc_buf(char *buf[XBUFSIZE])
170f8b0d4d0SHerbert Xu {
171f8b0d4d0SHerbert Xu 	int i;
172f8b0d4d0SHerbert Xu 
173f8b0d4d0SHerbert Xu 	for (i = 0; i < XBUFSIZE; i++) {
174f8b0d4d0SHerbert Xu 		buf[i] = (void *)__get_free_page(GFP_KERNEL);
175f8b0d4d0SHerbert Xu 		if (!buf[i])
176f8b0d4d0SHerbert Xu 			goto err_free_buf;
177f8b0d4d0SHerbert Xu 	}
178f8b0d4d0SHerbert Xu 
179f8b0d4d0SHerbert Xu 	return 0;
180f8b0d4d0SHerbert Xu 
181f8b0d4d0SHerbert Xu err_free_buf:
182f8b0d4d0SHerbert Xu 	while (i-- > 0)
183f8b0d4d0SHerbert Xu 		free_page((unsigned long)buf[i]);
184f8b0d4d0SHerbert Xu 
185f8b0d4d0SHerbert Xu 	return -ENOMEM;
186f8b0d4d0SHerbert Xu }
187f8b0d4d0SHerbert Xu 
188f8b0d4d0SHerbert Xu static void testmgr_free_buf(char *buf[XBUFSIZE])
189f8b0d4d0SHerbert Xu {
190f8b0d4d0SHerbert Xu 	int i;
191f8b0d4d0SHerbert Xu 
192f8b0d4d0SHerbert Xu 	for (i = 0; i < XBUFSIZE; i++)
193f8b0d4d0SHerbert Xu 		free_page((unsigned long)buf[i]);
194f8b0d4d0SHerbert Xu }
195f8b0d4d0SHerbert Xu 
196d4c85f9bSCristian Stoica static int wait_async_op(struct tcrypt_result *tr, int ret)
197a8f1a052SDavid S. Miller {
198a8f1a052SDavid S. Miller 	if (ret == -EINPROGRESS || ret == -EBUSY) {
1998a45ac12SRabin Vincent 		wait_for_completion(&tr->completion);
20016735d02SWolfram Sang 		reinit_completion(&tr->completion);
2018a45ac12SRabin Vincent 		ret = tr->err;
202a8f1a052SDavid S. Miller 	}
203a8f1a052SDavid S. Miller 	return ret;
204a8f1a052SDavid S. Miller }
205a8f1a052SDavid S. Miller 
206018ba95cSWang, Rui Y static int ahash_partial_update(struct ahash_request **preq,
207b13b1e0cSEric Biggers 	struct crypto_ahash *tfm, const struct hash_testvec *template,
208018ba95cSWang, Rui Y 	void *hash_buff, int k, int temp, struct scatterlist *sg,
209018ba95cSWang, Rui Y 	const char *algo, char *result, struct tcrypt_result *tresult)
210018ba95cSWang, Rui Y {
211018ba95cSWang, Rui Y 	char *state;
212018ba95cSWang, Rui Y 	struct ahash_request *req;
213018ba95cSWang, Rui Y 	int statesize, ret = -EINVAL;
2147bcb87bcSJan Stancek 	const char guard[] = { 0x00, 0xba, 0xad, 0x00 };
215018ba95cSWang, Rui Y 
216018ba95cSWang, Rui Y 	req = *preq;
217018ba95cSWang, Rui Y 	statesize = crypto_ahash_statesize(
218018ba95cSWang, Rui Y 			crypto_ahash_reqtfm(req));
2197bcb87bcSJan Stancek 	state = kmalloc(statesize + sizeof(guard), GFP_KERNEL);
220018ba95cSWang, Rui Y 	if (!state) {
221018ba95cSWang, Rui Y 		pr_err("alt: hash: Failed to alloc state for %s\n", algo);
222018ba95cSWang, Rui Y 		goto out_nostate;
223018ba95cSWang, Rui Y 	}
2247bcb87bcSJan Stancek 	memcpy(state + statesize, guard, sizeof(guard));
225018ba95cSWang, Rui Y 	ret = crypto_ahash_export(req, state);
2267bcb87bcSJan Stancek 	WARN_ON(memcmp(state + statesize, guard, sizeof(guard)));
227018ba95cSWang, Rui Y 	if (ret) {
228018ba95cSWang, Rui Y 		pr_err("alt: hash: Failed to export() for %s\n", algo);
229018ba95cSWang, Rui Y 		goto out;
230018ba95cSWang, Rui Y 	}
231018ba95cSWang, Rui Y 	ahash_request_free(req);
232018ba95cSWang, Rui Y 	req = ahash_request_alloc(tfm, GFP_KERNEL);
233018ba95cSWang, Rui Y 	if (!req) {
234018ba95cSWang, Rui Y 		pr_err("alg: hash: Failed to alloc request for %s\n", algo);
235018ba95cSWang, Rui Y 		goto out_noreq;
236018ba95cSWang, Rui Y 	}
237018ba95cSWang, Rui Y 	ahash_request_set_callback(req,
238018ba95cSWang, Rui Y 		CRYPTO_TFM_REQ_MAY_BACKLOG,
239018ba95cSWang, Rui Y 		tcrypt_complete, tresult);
240018ba95cSWang, Rui Y 
241018ba95cSWang, Rui Y 	memcpy(hash_buff, template->plaintext + temp,
242018ba95cSWang, Rui Y 		template->tap[k]);
243018ba95cSWang, Rui Y 	sg_init_one(&sg[0], hash_buff, template->tap[k]);
244018ba95cSWang, Rui Y 	ahash_request_set_crypt(req, sg, result, template->tap[k]);
245018ba95cSWang, Rui Y 	ret = crypto_ahash_import(req, state);
246018ba95cSWang, Rui Y 	if (ret) {
247018ba95cSWang, Rui Y 		pr_err("alg: hash: Failed to import() for %s\n", algo);
248018ba95cSWang, Rui Y 		goto out;
249018ba95cSWang, Rui Y 	}
250018ba95cSWang, Rui Y 	ret = wait_async_op(tresult, crypto_ahash_update(req));
251018ba95cSWang, Rui Y 	if (ret)
252018ba95cSWang, Rui Y 		goto out;
253018ba95cSWang, Rui Y 	*preq = req;
254018ba95cSWang, Rui Y 	ret = 0;
255018ba95cSWang, Rui Y 	goto out_noreq;
256018ba95cSWang, Rui Y out:
257018ba95cSWang, Rui Y 	ahash_request_free(req);
258018ba95cSWang, Rui Y out_noreq:
259018ba95cSWang, Rui Y 	kfree(state);
260018ba95cSWang, Rui Y out_nostate:
261018ba95cSWang, Rui Y 	return ret;
262018ba95cSWang, Rui Y }
263018ba95cSWang, Rui Y 
264b13b1e0cSEric Biggers static int __test_hash(struct crypto_ahash *tfm,
265b13b1e0cSEric Biggers 		       const struct hash_testvec *template, unsigned int tcount,
266b13b1e0cSEric Biggers 		       bool use_digest, const int align_offset)
267da7f033dSHerbert Xu {
268da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
269e93acd6fSAndrew Lutomirski 	size_t digest_size = crypto_ahash_digestsize(tfm);
270da7f033dSHerbert Xu 	unsigned int i, j, k, temp;
271da7f033dSHerbert Xu 	struct scatterlist sg[8];
27229b77e5dSHoria Geanta 	char *result;
27329b77e5dSHoria Geanta 	char *key;
274da7f033dSHerbert Xu 	struct ahash_request *req;
275da7f033dSHerbert Xu 	struct tcrypt_result tresult;
276da7f033dSHerbert Xu 	void *hash_buff;
277f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
278f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
279f8b0d4d0SHerbert Xu 
280e93acd6fSAndrew Lutomirski 	result = kmalloc(digest_size, GFP_KERNEL);
28129b77e5dSHoria Geanta 	if (!result)
28229b77e5dSHoria Geanta 		return ret;
28329b77e5dSHoria Geanta 	key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
28429b77e5dSHoria Geanta 	if (!key)
28529b77e5dSHoria Geanta 		goto out_nobuf;
286f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
287f8b0d4d0SHerbert Xu 		goto out_nobuf;
288da7f033dSHerbert Xu 
289da7f033dSHerbert Xu 	init_completion(&tresult.completion);
290da7f033dSHerbert Xu 
291da7f033dSHerbert Xu 	req = ahash_request_alloc(tfm, GFP_KERNEL);
292da7f033dSHerbert Xu 	if (!req) {
293da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to allocate request for "
294da7f033dSHerbert Xu 		       "%s\n", algo);
295da7f033dSHerbert Xu 		goto out_noreq;
296da7f033dSHerbert Xu 	}
297da7f033dSHerbert Xu 	ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
298da7f033dSHerbert Xu 				   tcrypt_complete, &tresult);
299da7f033dSHerbert Xu 
300a0cfae59SHerbert Xu 	j = 0;
301da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
302a0cfae59SHerbert Xu 		if (template[i].np)
303a0cfae59SHerbert Xu 			continue;
304a0cfae59SHerbert Xu 
305da5ffe11SJussi Kivilinna 		ret = -EINVAL;
306da5ffe11SJussi Kivilinna 		if (WARN_ON(align_offset + template[i].psize > PAGE_SIZE))
307da5ffe11SJussi Kivilinna 			goto out;
308da5ffe11SJussi Kivilinna 
309a0cfae59SHerbert Xu 		j++;
310e93acd6fSAndrew Lutomirski 		memset(result, 0, digest_size);
311da7f033dSHerbert Xu 
312da7f033dSHerbert Xu 		hash_buff = xbuf[0];
313da5ffe11SJussi Kivilinna 		hash_buff += align_offset;
314da7f033dSHerbert Xu 
315da7f033dSHerbert Xu 		memcpy(hash_buff, template[i].plaintext, template[i].psize);
316da7f033dSHerbert Xu 		sg_init_one(&sg[0], hash_buff, template[i].psize);
317da7f033dSHerbert Xu 
318da7f033dSHerbert Xu 		if (template[i].ksize) {
319da7f033dSHerbert Xu 			crypto_ahash_clear_flags(tfm, ~0);
32029b77e5dSHoria Geanta 			if (template[i].ksize > MAX_KEYLEN) {
32129b77e5dSHoria Geanta 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
32229b77e5dSHoria Geanta 				       j, algo, template[i].ksize, MAX_KEYLEN);
32329b77e5dSHoria Geanta 				ret = -EINVAL;
32429b77e5dSHoria Geanta 				goto out;
32529b77e5dSHoria Geanta 			}
32629b77e5dSHoria Geanta 			memcpy(key, template[i].key, template[i].ksize);
32729b77e5dSHoria Geanta 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
328da7f033dSHerbert Xu 			if (ret) {
329da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: setkey failed on "
330a0cfae59SHerbert Xu 				       "test %d for %s: ret=%d\n", j, algo,
331da7f033dSHerbert Xu 				       -ret);
332da7f033dSHerbert Xu 				goto out;
333da7f033dSHerbert Xu 			}
334da7f033dSHerbert Xu 		}
335da7f033dSHerbert Xu 
336da7f033dSHerbert Xu 		ahash_request_set_crypt(req, sg, result, template[i].psize);
337a8f1a052SDavid S. Miller 		if (use_digest) {
338d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_digest(req));
339a8f1a052SDavid S. Miller 			if (ret) {
340a8f1a052SDavid S. Miller 				pr_err("alg: hash: digest failed on test %d "
341a0cfae59SHerbert Xu 				       "for %s: ret=%d\n", j, algo, -ret);
342da7f033dSHerbert Xu 				goto out;
343da7f033dSHerbert Xu 			}
344a8f1a052SDavid S. Miller 		} else {
345d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_init(req));
346a8f1a052SDavid S. Miller 			if (ret) {
347a8f1a052SDavid S. Miller 				pr_err("alt: hash: init failed on test %d "
348a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
349a8f1a052SDavid S. Miller 				goto out;
350a8f1a052SDavid S. Miller 			}
351d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_update(req));
352a8f1a052SDavid S. Miller 			if (ret) {
353a8f1a052SDavid S. Miller 				pr_err("alt: hash: update failed on test %d "
354a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
355a8f1a052SDavid S. Miller 				goto out;
356a8f1a052SDavid S. Miller 			}
357d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_final(req));
358a8f1a052SDavid S. Miller 			if (ret) {
359a8f1a052SDavid S. Miller 				pr_err("alt: hash: final failed on test %d "
360a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
361a8f1a052SDavid S. Miller 				goto out;
362a8f1a052SDavid S. Miller 			}
363a8f1a052SDavid S. Miller 		}
364da7f033dSHerbert Xu 
365da7f033dSHerbert Xu 		if (memcmp(result, template[i].digest,
366da7f033dSHerbert Xu 			   crypto_ahash_digestsize(tfm))) {
367da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
368a0cfae59SHerbert Xu 			       j, algo);
369da7f033dSHerbert Xu 			hexdump(result, crypto_ahash_digestsize(tfm));
370da7f033dSHerbert Xu 			ret = -EINVAL;
371da7f033dSHerbert Xu 			goto out;
372da7f033dSHerbert Xu 		}
373da7f033dSHerbert Xu 	}
374da7f033dSHerbert Xu 
375da7f033dSHerbert Xu 	j = 0;
376da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
377da5ffe11SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
378da5ffe11SJussi Kivilinna 		if (align_offset != 0)
379da5ffe11SJussi Kivilinna 			break;
380da5ffe11SJussi Kivilinna 
3815f2b424eSCristian Stoica 		if (!template[i].np)
3825f2b424eSCristian Stoica 			continue;
3835f2b424eSCristian Stoica 
384da7f033dSHerbert Xu 		j++;
385e93acd6fSAndrew Lutomirski 		memset(result, 0, digest_size);
386da7f033dSHerbert Xu 
387da7f033dSHerbert Xu 		temp = 0;
388da7f033dSHerbert Xu 		sg_init_table(sg, template[i].np);
389fd57f22aSHerbert Xu 		ret = -EINVAL;
390da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
391fd57f22aSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
392fd57f22aSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
393fd57f22aSHerbert Xu 				goto out;
394da7f033dSHerbert Xu 			sg_set_buf(&sg[k],
395da7f033dSHerbert Xu 				   memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
396da7f033dSHerbert Xu 					  offset_in_page(IDX[k]),
397da7f033dSHerbert Xu 					  template[i].plaintext + temp,
398da7f033dSHerbert Xu 					  template[i].tap[k]),
399da7f033dSHerbert Xu 				   template[i].tap[k]);
400da7f033dSHerbert Xu 			temp += template[i].tap[k];
401da7f033dSHerbert Xu 		}
402da7f033dSHerbert Xu 
403da7f033dSHerbert Xu 		if (template[i].ksize) {
40429b77e5dSHoria Geanta 			if (template[i].ksize > MAX_KEYLEN) {
40529b77e5dSHoria Geanta 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
4065f2b424eSCristian Stoica 				       j, algo, template[i].ksize, MAX_KEYLEN);
40729b77e5dSHoria Geanta 				ret = -EINVAL;
40829b77e5dSHoria Geanta 				goto out;
40929b77e5dSHoria Geanta 			}
410da7f033dSHerbert Xu 			crypto_ahash_clear_flags(tfm, ~0);
41129b77e5dSHoria Geanta 			memcpy(key, template[i].key, template[i].ksize);
4125f2b424eSCristian Stoica 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
413da7f033dSHerbert Xu 
414da7f033dSHerbert Xu 			if (ret) {
415da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: setkey "
416da7f033dSHerbert Xu 				       "failed on chunking test %d "
4175f2b424eSCristian Stoica 				       "for %s: ret=%d\n", j, algo, -ret);
418da7f033dSHerbert Xu 				goto out;
419da7f033dSHerbert Xu 			}
420da7f033dSHerbert Xu 		}
421da7f033dSHerbert Xu 
4225f2b424eSCristian Stoica 		ahash_request_set_crypt(req, sg, result, template[i].psize);
423da7f033dSHerbert Xu 		ret = crypto_ahash_digest(req);
424da7f033dSHerbert Xu 		switch (ret) {
425da7f033dSHerbert Xu 		case 0:
426da7f033dSHerbert Xu 			break;
427da7f033dSHerbert Xu 		case -EINPROGRESS:
428da7f033dSHerbert Xu 		case -EBUSY:
4298a45ac12SRabin Vincent 			wait_for_completion(&tresult.completion);
43016735d02SWolfram Sang 			reinit_completion(&tresult.completion);
4318a45ac12SRabin Vincent 			ret = tresult.err;
4328a45ac12SRabin Vincent 			if (!ret)
433da7f033dSHerbert Xu 				break;
434da7f033dSHerbert Xu 			/* fall through */
435da7f033dSHerbert Xu 		default:
436da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: digest failed "
437da7f033dSHerbert Xu 			       "on chunking test %d for %s: "
438da7f033dSHerbert Xu 			       "ret=%d\n", j, algo, -ret);
439da7f033dSHerbert Xu 			goto out;
440da7f033dSHerbert Xu 		}
441da7f033dSHerbert Xu 
442da7f033dSHerbert Xu 		if (memcmp(result, template[i].digest,
443da7f033dSHerbert Xu 			   crypto_ahash_digestsize(tfm))) {
444da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: Chunking test %d "
445da7f033dSHerbert Xu 			       "failed for %s\n", j, algo);
446da7f033dSHerbert Xu 			hexdump(result, crypto_ahash_digestsize(tfm));
447da7f033dSHerbert Xu 			ret = -EINVAL;
448da7f033dSHerbert Xu 			goto out;
449da7f033dSHerbert Xu 		}
450da7f033dSHerbert Xu 	}
451da7f033dSHerbert Xu 
452018ba95cSWang, Rui Y 	/* partial update exercise */
453018ba95cSWang, Rui Y 	j = 0;
454018ba95cSWang, Rui Y 	for (i = 0; i < tcount; i++) {
455018ba95cSWang, Rui Y 		/* alignment tests are only done with continuous buffers */
456018ba95cSWang, Rui Y 		if (align_offset != 0)
457018ba95cSWang, Rui Y 			break;
458018ba95cSWang, Rui Y 
459018ba95cSWang, Rui Y 		if (template[i].np < 2)
460018ba95cSWang, Rui Y 			continue;
461018ba95cSWang, Rui Y 
462018ba95cSWang, Rui Y 		j++;
463e93acd6fSAndrew Lutomirski 		memset(result, 0, digest_size);
464018ba95cSWang, Rui Y 
465018ba95cSWang, Rui Y 		ret = -EINVAL;
466018ba95cSWang, Rui Y 		hash_buff = xbuf[0];
467018ba95cSWang, Rui Y 		memcpy(hash_buff, template[i].plaintext,
468018ba95cSWang, Rui Y 			template[i].tap[0]);
469018ba95cSWang, Rui Y 		sg_init_one(&sg[0], hash_buff, template[i].tap[0]);
470018ba95cSWang, Rui Y 
471018ba95cSWang, Rui Y 		if (template[i].ksize) {
472018ba95cSWang, Rui Y 			crypto_ahash_clear_flags(tfm, ~0);
473018ba95cSWang, Rui Y 			if (template[i].ksize > MAX_KEYLEN) {
474018ba95cSWang, Rui Y 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
475018ba95cSWang, Rui Y 					j, algo, template[i].ksize, MAX_KEYLEN);
476018ba95cSWang, Rui Y 				ret = -EINVAL;
477018ba95cSWang, Rui Y 				goto out;
478018ba95cSWang, Rui Y 			}
479018ba95cSWang, Rui Y 			memcpy(key, template[i].key, template[i].ksize);
480018ba95cSWang, Rui Y 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
481018ba95cSWang, Rui Y 			if (ret) {
482018ba95cSWang, Rui Y 				pr_err("alg: hash: setkey failed on test %d for %s: ret=%d\n",
483018ba95cSWang, Rui Y 					j, algo, -ret);
484018ba95cSWang, Rui Y 				goto out;
485018ba95cSWang, Rui Y 			}
486018ba95cSWang, Rui Y 		}
487018ba95cSWang, Rui Y 
488018ba95cSWang, Rui Y 		ahash_request_set_crypt(req, sg, result, template[i].tap[0]);
489018ba95cSWang, Rui Y 		ret = wait_async_op(&tresult, crypto_ahash_init(req));
490018ba95cSWang, Rui Y 		if (ret) {
491018ba95cSWang, Rui Y 			pr_err("alt: hash: init failed on test %d for %s: ret=%d\n",
492018ba95cSWang, Rui Y 				j, algo, -ret);
493018ba95cSWang, Rui Y 			goto out;
494018ba95cSWang, Rui Y 		}
495018ba95cSWang, Rui Y 		ret = wait_async_op(&tresult, crypto_ahash_update(req));
496018ba95cSWang, Rui Y 		if (ret) {
497018ba95cSWang, Rui Y 			pr_err("alt: hash: update failed on test %d for %s: ret=%d\n",
498018ba95cSWang, Rui Y 				j, algo, -ret);
499018ba95cSWang, Rui Y 			goto out;
500018ba95cSWang, Rui Y 		}
501018ba95cSWang, Rui Y 
502018ba95cSWang, Rui Y 		temp = template[i].tap[0];
503018ba95cSWang, Rui Y 		for (k = 1; k < template[i].np; k++) {
504018ba95cSWang, Rui Y 			ret = ahash_partial_update(&req, tfm, &template[i],
505018ba95cSWang, Rui Y 				hash_buff, k, temp, &sg[0], algo, result,
506018ba95cSWang, Rui Y 				&tresult);
507018ba95cSWang, Rui Y 			if (ret) {
508018ba95cSWang, Rui Y 				pr_err("hash: partial update failed on test %d for %s: ret=%d\n",
509018ba95cSWang, Rui Y 					j, algo, -ret);
510018ba95cSWang, Rui Y 				goto out_noreq;
511018ba95cSWang, Rui Y 			}
512018ba95cSWang, Rui Y 			temp += template[i].tap[k];
513018ba95cSWang, Rui Y 		}
514018ba95cSWang, Rui Y 		ret = wait_async_op(&tresult, crypto_ahash_final(req));
515018ba95cSWang, Rui Y 		if (ret) {
516018ba95cSWang, Rui Y 			pr_err("alt: hash: final failed on test %d for %s: ret=%d\n",
517018ba95cSWang, Rui Y 				j, algo, -ret);
518018ba95cSWang, Rui Y 			goto out;
519018ba95cSWang, Rui Y 		}
520018ba95cSWang, Rui Y 		if (memcmp(result, template[i].digest,
521018ba95cSWang, Rui Y 			   crypto_ahash_digestsize(tfm))) {
522018ba95cSWang, Rui Y 			pr_err("alg: hash: Partial Test %d failed for %s\n",
523018ba95cSWang, Rui Y 			       j, algo);
524018ba95cSWang, Rui Y 			hexdump(result, crypto_ahash_digestsize(tfm));
525018ba95cSWang, Rui Y 			ret = -EINVAL;
526018ba95cSWang, Rui Y 			goto out;
527018ba95cSWang, Rui Y 		}
528018ba95cSWang, Rui Y 	}
529018ba95cSWang, Rui Y 
530da7f033dSHerbert Xu 	ret = 0;
531da7f033dSHerbert Xu 
532da7f033dSHerbert Xu out:
533da7f033dSHerbert Xu 	ahash_request_free(req);
534da7f033dSHerbert Xu out_noreq:
535f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
536f8b0d4d0SHerbert Xu out_nobuf:
53729b77e5dSHoria Geanta 	kfree(key);
53829b77e5dSHoria Geanta 	kfree(result);
539da7f033dSHerbert Xu 	return ret;
540da7f033dSHerbert Xu }
541da7f033dSHerbert Xu 
542b13b1e0cSEric Biggers static int test_hash(struct crypto_ahash *tfm,
543b13b1e0cSEric Biggers 		     const struct hash_testvec *template,
544da5ffe11SJussi Kivilinna 		     unsigned int tcount, bool use_digest)
545da5ffe11SJussi Kivilinna {
546da5ffe11SJussi Kivilinna 	unsigned int alignmask;
547da5ffe11SJussi Kivilinna 	int ret;
548da5ffe11SJussi Kivilinna 
549da5ffe11SJussi Kivilinna 	ret = __test_hash(tfm, template, tcount, use_digest, 0);
550da5ffe11SJussi Kivilinna 	if (ret)
551da5ffe11SJussi Kivilinna 		return ret;
552da5ffe11SJussi Kivilinna 
553da5ffe11SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
554da5ffe11SJussi Kivilinna 	ret = __test_hash(tfm, template, tcount, use_digest, 1);
555da5ffe11SJussi Kivilinna 	if (ret)
556da5ffe11SJussi Kivilinna 		return ret;
557da5ffe11SJussi Kivilinna 
558da5ffe11SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
559da5ffe11SJussi Kivilinna 	if (alignmask) {
560da5ffe11SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
561da5ffe11SJussi Kivilinna 		ret = __test_hash(tfm, template, tcount, use_digest,
562da5ffe11SJussi Kivilinna 				  alignmask + 1);
563da5ffe11SJussi Kivilinna 		if (ret)
564da5ffe11SJussi Kivilinna 			return ret;
565da5ffe11SJussi Kivilinna 	}
566da5ffe11SJussi Kivilinna 
567da5ffe11SJussi Kivilinna 	return 0;
568da5ffe11SJussi Kivilinna }
569da5ffe11SJussi Kivilinna 
570d8a32ac2SJussi Kivilinna static int __test_aead(struct crypto_aead *tfm, int enc,
571b13b1e0cSEric Biggers 		       const struct aead_testvec *template, unsigned int tcount,
57258dcf548SJussi Kivilinna 		       const bool diff_dst, const int align_offset)
573da7f033dSHerbert Xu {
574da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
575da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
576f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
577da7f033dSHerbert Xu 	char *q;
578da7f033dSHerbert Xu 	char *key;
579da7f033dSHerbert Xu 	struct aead_request *req;
580d8a32ac2SJussi Kivilinna 	struct scatterlist *sg;
581d8a32ac2SJussi Kivilinna 	struct scatterlist *sgout;
582d8a32ac2SJussi Kivilinna 	const char *e, *d;
583da7f033dSHerbert Xu 	struct tcrypt_result result;
584424a5da6SCristian Stoica 	unsigned int authsize, iv_len;
585da7f033dSHerbert Xu 	void *input;
586d8a32ac2SJussi Kivilinna 	void *output;
587da7f033dSHerbert Xu 	void *assoc;
5889bac019dSTadeusz Struk 	char *iv;
589f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
590d8a32ac2SJussi Kivilinna 	char *xoutbuf[XBUFSIZE];
591f8b0d4d0SHerbert Xu 	char *axbuf[XBUFSIZE];
592f8b0d4d0SHerbert Xu 
5939bac019dSTadeusz Struk 	iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
5949bac019dSTadeusz Struk 	if (!iv)
5959bac019dSTadeusz Struk 		return ret;
59629b77e5dSHoria Geanta 	key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
59729b77e5dSHoria Geanta 	if (!key)
59829b77e5dSHoria Geanta 		goto out_noxbuf;
599f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
600f8b0d4d0SHerbert Xu 		goto out_noxbuf;
601f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(axbuf))
602f8b0d4d0SHerbert Xu 		goto out_noaxbuf;
603d8a32ac2SJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
604d8a32ac2SJussi Kivilinna 		goto out_nooutbuf;
605d8a32ac2SJussi Kivilinna 
606d8a32ac2SJussi Kivilinna 	/* avoid "the frame size is larger than 1024 bytes" compiler warning */
6078a525fcdSHerbert Xu 	sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 4 : 2), GFP_KERNEL);
608d8a32ac2SJussi Kivilinna 	if (!sg)
609d8a32ac2SJussi Kivilinna 		goto out_nosg;
6108a525fcdSHerbert Xu 	sgout = &sg[16];
611d8a32ac2SJussi Kivilinna 
612d8a32ac2SJussi Kivilinna 	if (diff_dst)
613d8a32ac2SJussi Kivilinna 		d = "-ddst";
614d8a32ac2SJussi Kivilinna 	else
615d8a32ac2SJussi Kivilinna 		d = "";
616d8a32ac2SJussi Kivilinna 
617da7f033dSHerbert Xu 	if (enc == ENCRYPT)
618da7f033dSHerbert Xu 		e = "encryption";
619da7f033dSHerbert Xu 	else
620da7f033dSHerbert Xu 		e = "decryption";
621da7f033dSHerbert Xu 
622da7f033dSHerbert Xu 	init_completion(&result.completion);
623da7f033dSHerbert Xu 
624da7f033dSHerbert Xu 	req = aead_request_alloc(tfm, GFP_KERNEL);
625da7f033dSHerbert Xu 	if (!req) {
626d8a32ac2SJussi Kivilinna 		pr_err("alg: aead%s: Failed to allocate request for %s\n",
627d8a32ac2SJussi Kivilinna 		       d, algo);
628da7f033dSHerbert Xu 		goto out;
629da7f033dSHerbert Xu 	}
630da7f033dSHerbert Xu 
631da7f033dSHerbert Xu 	aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
632da7f033dSHerbert Xu 				  tcrypt_complete, &result);
633da7f033dSHerbert Xu 
634abfa7f43SJerome Marchand 	iv_len = crypto_aead_ivsize(tfm);
635abfa7f43SJerome Marchand 
636da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
63705b1d338SCristian Stoica 		if (template[i].np)
63805b1d338SCristian Stoica 			continue;
63905b1d338SCristian Stoica 
640da7f033dSHerbert Xu 		j++;
641da7f033dSHerbert Xu 
64258dcf548SJussi Kivilinna 		/* some templates have no input data but they will
643da7f033dSHerbert Xu 		 * touch input
644da7f033dSHerbert Xu 		 */
645da7f033dSHerbert Xu 		input = xbuf[0];
64658dcf548SJussi Kivilinna 		input += align_offset;
647da7f033dSHerbert Xu 		assoc = axbuf[0];
648da7f033dSHerbert Xu 
649fd57f22aSHerbert Xu 		ret = -EINVAL;
65058dcf548SJussi Kivilinna 		if (WARN_ON(align_offset + template[i].ilen >
65158dcf548SJussi Kivilinna 			    PAGE_SIZE || template[i].alen > PAGE_SIZE))
652fd57f22aSHerbert Xu 			goto out;
653fd57f22aSHerbert Xu 
654da7f033dSHerbert Xu 		memcpy(input, template[i].input, template[i].ilen);
655da7f033dSHerbert Xu 		memcpy(assoc, template[i].assoc, template[i].alen);
656da7f033dSHerbert Xu 		if (template[i].iv)
657424a5da6SCristian Stoica 			memcpy(iv, template[i].iv, iv_len);
658da7f033dSHerbert Xu 		else
659424a5da6SCristian Stoica 			memset(iv, 0, iv_len);
660da7f033dSHerbert Xu 
661da7f033dSHerbert Xu 		crypto_aead_clear_flags(tfm, ~0);
662da7f033dSHerbert Xu 		if (template[i].wk)
66305b1d338SCristian Stoica 			crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
664da7f033dSHerbert Xu 
66529b77e5dSHoria Geanta 		if (template[i].klen > MAX_KEYLEN) {
66629b77e5dSHoria Geanta 			pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
66729b77e5dSHoria Geanta 			       d, j, algo, template[i].klen,
66829b77e5dSHoria Geanta 			       MAX_KEYLEN);
66929b77e5dSHoria Geanta 			ret = -EINVAL;
67029b77e5dSHoria Geanta 			goto out;
67129b77e5dSHoria Geanta 		}
67229b77e5dSHoria Geanta 		memcpy(key, template[i].key, template[i].klen);
673da7f033dSHerbert Xu 
67405b1d338SCristian Stoica 		ret = crypto_aead_setkey(tfm, key, template[i].klen);
6750fae0c1eSYanjiang Jin 		if (template[i].fail == !ret) {
676d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n",
677d8a32ac2SJussi Kivilinna 			       d, j, algo, crypto_aead_get_flags(tfm));
678da7f033dSHerbert Xu 			goto out;
679da7f033dSHerbert Xu 		} else if (ret)
680da7f033dSHerbert Xu 			continue;
681da7f033dSHerbert Xu 
682da7f033dSHerbert Xu 		authsize = abs(template[i].rlen - template[i].ilen);
683da7f033dSHerbert Xu 		ret = crypto_aead_setauthsize(tfm, authsize);
684da7f033dSHerbert Xu 		if (ret) {
685d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n",
686d8a32ac2SJussi Kivilinna 			       d, authsize, j, algo);
687da7f033dSHerbert Xu 			goto out;
688da7f033dSHerbert Xu 		}
689da7f033dSHerbert Xu 
6908a525fcdSHerbert Xu 		k = !!template[i].alen;
6918a525fcdSHerbert Xu 		sg_init_table(sg, k + 1);
6928a525fcdSHerbert Xu 		sg_set_buf(&sg[0], assoc, template[i].alen);
6938a525fcdSHerbert Xu 		sg_set_buf(&sg[k], input,
69405b1d338SCristian Stoica 			   template[i].ilen + (enc ? authsize : 0));
695d8a32ac2SJussi Kivilinna 		output = input;
696d8a32ac2SJussi Kivilinna 
6978a525fcdSHerbert Xu 		if (diff_dst) {
6988a525fcdSHerbert Xu 			sg_init_table(sgout, k + 1);
6998a525fcdSHerbert Xu 			sg_set_buf(&sgout[0], assoc, template[i].alen);
7008a525fcdSHerbert Xu 
7018a525fcdSHerbert Xu 			output = xoutbuf[0];
7028a525fcdSHerbert Xu 			output += align_offset;
7038a525fcdSHerbert Xu 			sg_set_buf(&sgout[k], output,
7048a525fcdSHerbert Xu 				   template[i].rlen + (enc ? 0 : authsize));
7058a525fcdSHerbert Xu 		}
706da7f033dSHerbert Xu 
707d8a32ac2SJussi Kivilinna 		aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
708da7f033dSHerbert Xu 				       template[i].ilen, iv);
709da7f033dSHerbert Xu 
7108a525fcdSHerbert Xu 		aead_request_set_ad(req, template[i].alen);
711da7f033dSHerbert Xu 
71205b1d338SCristian Stoica 		ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req);
713da7f033dSHerbert Xu 
714da7f033dSHerbert Xu 		switch (ret) {
715da7f033dSHerbert Xu 		case 0:
716e44a1b44SJarod Wilson 			if (template[i].novrfy) {
717e44a1b44SJarod Wilson 				/* verification was supposed to fail */
718d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n",
719d8a32ac2SJussi Kivilinna 				       d, e, j, algo);
720e44a1b44SJarod Wilson 				/* so really, we got a bad message */
721e44a1b44SJarod Wilson 				ret = -EBADMSG;
722e44a1b44SJarod Wilson 				goto out;
723e44a1b44SJarod Wilson 			}
724da7f033dSHerbert Xu 			break;
725da7f033dSHerbert Xu 		case -EINPROGRESS:
726da7f033dSHerbert Xu 		case -EBUSY:
7278a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
72816735d02SWolfram Sang 			reinit_completion(&result.completion);
7298a45ac12SRabin Vincent 			ret = result.err;
7308a45ac12SRabin Vincent 			if (!ret)
731da7f033dSHerbert Xu 				break;
732e44a1b44SJarod Wilson 		case -EBADMSG:
733e44a1b44SJarod Wilson 			if (template[i].novrfy)
734e44a1b44SJarod Wilson 				/* verification failure was expected */
735e44a1b44SJarod Wilson 				continue;
736da7f033dSHerbert Xu 			/* fall through */
737da7f033dSHerbert Xu 		default:
738d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n",
739d8a32ac2SJussi Kivilinna 			       d, e, j, algo, -ret);
740da7f033dSHerbert Xu 			goto out;
741da7f033dSHerbert Xu 		}
742da7f033dSHerbert Xu 
743d8a32ac2SJussi Kivilinna 		q = output;
744da7f033dSHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
745d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Test %d failed on %s for %s\n",
746d8a32ac2SJussi Kivilinna 			       d, j, e, algo);
747da7f033dSHerbert Xu 			hexdump(q, template[i].rlen);
748da7f033dSHerbert Xu 			ret = -EINVAL;
749da7f033dSHerbert Xu 			goto out;
750da7f033dSHerbert Xu 		}
751da7f033dSHerbert Xu 	}
752da7f033dSHerbert Xu 
753da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
75458dcf548SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
75558dcf548SJussi Kivilinna 		if (align_offset != 0)
75658dcf548SJussi Kivilinna 			break;
75758dcf548SJussi Kivilinna 
75805b1d338SCristian Stoica 		if (!template[i].np)
75905b1d338SCristian Stoica 			continue;
76005b1d338SCristian Stoica 
761da7f033dSHerbert Xu 		j++;
762da7f033dSHerbert Xu 
763da7f033dSHerbert Xu 		if (template[i].iv)
764abfa7f43SJerome Marchand 			memcpy(iv, template[i].iv, iv_len);
765da7f033dSHerbert Xu 		else
766da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
767da7f033dSHerbert Xu 
768da7f033dSHerbert Xu 		crypto_aead_clear_flags(tfm, ~0);
769da7f033dSHerbert Xu 		if (template[i].wk)
77005b1d338SCristian Stoica 			crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
77129b77e5dSHoria Geanta 		if (template[i].klen > MAX_KEYLEN) {
77229b77e5dSHoria Geanta 			pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
77305b1d338SCristian Stoica 			       d, j, algo, template[i].klen, MAX_KEYLEN);
77429b77e5dSHoria Geanta 			ret = -EINVAL;
77529b77e5dSHoria Geanta 			goto out;
77629b77e5dSHoria Geanta 		}
77729b77e5dSHoria Geanta 		memcpy(key, template[i].key, template[i].klen);
778da7f033dSHerbert Xu 
779da7f033dSHerbert Xu 		ret = crypto_aead_setkey(tfm, key, template[i].klen);
7800fae0c1eSYanjiang Jin 		if (template[i].fail == !ret) {
781d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n",
782d8a32ac2SJussi Kivilinna 			       d, j, algo, crypto_aead_get_flags(tfm));
783da7f033dSHerbert Xu 			goto out;
784da7f033dSHerbert Xu 		} else if (ret)
785da7f033dSHerbert Xu 			continue;
786da7f033dSHerbert Xu 
787da7f033dSHerbert Xu 		authsize = abs(template[i].rlen - template[i].ilen);
788da7f033dSHerbert Xu 
789da7f033dSHerbert Xu 		ret = -EINVAL;
7908a525fcdSHerbert Xu 		sg_init_table(sg, template[i].anp + template[i].np);
791d8a32ac2SJussi Kivilinna 		if (diff_dst)
7928a525fcdSHerbert Xu 			sg_init_table(sgout, template[i].anp + template[i].np);
7938a525fcdSHerbert Xu 
7948a525fcdSHerbert Xu 		ret = -EINVAL;
7958a525fcdSHerbert Xu 		for (k = 0, temp = 0; k < template[i].anp; k++) {
7968a525fcdSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
7978a525fcdSHerbert Xu 				    template[i].atap[k] > PAGE_SIZE))
7988a525fcdSHerbert Xu 				goto out;
7998a525fcdSHerbert Xu 			sg_set_buf(&sg[k],
8008a525fcdSHerbert Xu 				   memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
8018a525fcdSHerbert Xu 					  offset_in_page(IDX[k]),
8028a525fcdSHerbert Xu 					  template[i].assoc + temp,
8038a525fcdSHerbert Xu 					  template[i].atap[k]),
8048a525fcdSHerbert Xu 				   template[i].atap[k]);
8058a525fcdSHerbert Xu 			if (diff_dst)
8068a525fcdSHerbert Xu 				sg_set_buf(&sgout[k],
8078a525fcdSHerbert Xu 					   axbuf[IDX[k] >> PAGE_SHIFT] +
8088a525fcdSHerbert Xu 					   offset_in_page(IDX[k]),
8098a525fcdSHerbert Xu 					   template[i].atap[k]);
8108a525fcdSHerbert Xu 			temp += template[i].atap[k];
8118a525fcdSHerbert Xu 		}
8128a525fcdSHerbert Xu 
813da7f033dSHerbert Xu 		for (k = 0, temp = 0; k < template[i].np; k++) {
814da7f033dSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
815da7f033dSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
816da7f033dSHerbert Xu 				goto out;
817da7f033dSHerbert Xu 
81805b1d338SCristian Stoica 			q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
81905b1d338SCristian Stoica 			memcpy(q, template[i].input + temp, template[i].tap[k]);
8208a525fcdSHerbert Xu 			sg_set_buf(&sg[template[i].anp + k],
8218a525fcdSHerbert Xu 				   q, template[i].tap[k]);
822d8a32ac2SJussi Kivilinna 
823d8a32ac2SJussi Kivilinna 			if (diff_dst) {
824d8a32ac2SJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
825d8a32ac2SJussi Kivilinna 				    offset_in_page(IDX[k]);
826d8a32ac2SJussi Kivilinna 
827d8a32ac2SJussi Kivilinna 				memset(q, 0, template[i].tap[k]);
828d8a32ac2SJussi Kivilinna 
8298a525fcdSHerbert Xu 				sg_set_buf(&sgout[template[i].anp + k],
8308a525fcdSHerbert Xu 					   q, template[i].tap[k]);
831d8a32ac2SJussi Kivilinna 			}
832d8a32ac2SJussi Kivilinna 
8338ec25c51SHoria Geanta 			n = template[i].tap[k];
8348ec25c51SHoria Geanta 			if (k == template[i].np - 1 && enc)
8358ec25c51SHoria Geanta 				n += authsize;
8368ec25c51SHoria Geanta 			if (offset_in_page(q) + n < PAGE_SIZE)
8378ec25c51SHoria Geanta 				q[n] = 0;
8388ec25c51SHoria Geanta 
839da7f033dSHerbert Xu 			temp += template[i].tap[k];
840da7f033dSHerbert Xu 		}
841da7f033dSHerbert Xu 
842da7f033dSHerbert Xu 		ret = crypto_aead_setauthsize(tfm, authsize);
843da7f033dSHerbert Xu 		if (ret) {
844d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n",
845d8a32ac2SJussi Kivilinna 			       d, authsize, j, algo);
846da7f033dSHerbert Xu 			goto out;
847da7f033dSHerbert Xu 		}
848da7f033dSHerbert Xu 
849da7f033dSHerbert Xu 		if (enc) {
8508a525fcdSHerbert Xu 			if (WARN_ON(sg[template[i].anp + k - 1].offset +
8518a525fcdSHerbert Xu 				    sg[template[i].anp + k - 1].length +
8528a525fcdSHerbert Xu 				    authsize > PAGE_SIZE)) {
853da7f033dSHerbert Xu 				ret = -EINVAL;
854da7f033dSHerbert Xu 				goto out;
855da7f033dSHerbert Xu 			}
856da7f033dSHerbert Xu 
857d8a32ac2SJussi Kivilinna 			if (diff_dst)
8588a525fcdSHerbert Xu 				sgout[template[i].anp + k - 1].length +=
8598a525fcdSHerbert Xu 					authsize;
8608a525fcdSHerbert Xu 			sg[template[i].anp + k - 1].length += authsize;
861da7f033dSHerbert Xu 		}
862da7f033dSHerbert Xu 
863d8a32ac2SJussi Kivilinna 		aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
864da7f033dSHerbert Xu 				       template[i].ilen,
865da7f033dSHerbert Xu 				       iv);
866da7f033dSHerbert Xu 
8678a525fcdSHerbert Xu 		aead_request_set_ad(req, template[i].alen);
868da7f033dSHerbert Xu 
86905b1d338SCristian Stoica 		ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req);
870da7f033dSHerbert Xu 
871da7f033dSHerbert Xu 		switch (ret) {
872da7f033dSHerbert Xu 		case 0:
873e44a1b44SJarod Wilson 			if (template[i].novrfy) {
874e44a1b44SJarod Wilson 				/* verification was supposed to fail */
875d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n",
876d8a32ac2SJussi Kivilinna 				       d, e, j, algo);
877e44a1b44SJarod Wilson 				/* so really, we got a bad message */
878e44a1b44SJarod Wilson 				ret = -EBADMSG;
879e44a1b44SJarod Wilson 				goto out;
880e44a1b44SJarod Wilson 			}
881da7f033dSHerbert Xu 			break;
882da7f033dSHerbert Xu 		case -EINPROGRESS:
883da7f033dSHerbert Xu 		case -EBUSY:
8848a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
88516735d02SWolfram Sang 			reinit_completion(&result.completion);
8868a45ac12SRabin Vincent 			ret = result.err;
8878a45ac12SRabin Vincent 			if (!ret)
888da7f033dSHerbert Xu 				break;
889e44a1b44SJarod Wilson 		case -EBADMSG:
890e44a1b44SJarod Wilson 			if (template[i].novrfy)
891e44a1b44SJarod Wilson 				/* verification failure was expected */
892e44a1b44SJarod Wilson 				continue;
893da7f033dSHerbert Xu 			/* fall through */
894da7f033dSHerbert Xu 		default:
895d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n",
896d8a32ac2SJussi Kivilinna 			       d, e, j, algo, -ret);
897da7f033dSHerbert Xu 			goto out;
898da7f033dSHerbert Xu 		}
899da7f033dSHerbert Xu 
900da7f033dSHerbert Xu 		ret = -EINVAL;
901da7f033dSHerbert Xu 		for (k = 0, temp = 0; k < template[i].np; k++) {
902d8a32ac2SJussi Kivilinna 			if (diff_dst)
903d8a32ac2SJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
904d8a32ac2SJussi Kivilinna 				    offset_in_page(IDX[k]);
905d8a32ac2SJussi Kivilinna 			else
906da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
907da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
908da7f033dSHerbert Xu 
909da7f033dSHerbert Xu 			n = template[i].tap[k];
910da7f033dSHerbert Xu 			if (k == template[i].np - 1)
911da7f033dSHerbert Xu 				n += enc ? authsize : -authsize;
912da7f033dSHerbert Xu 
913da7f033dSHerbert Xu 			if (memcmp(q, template[i].result + temp, n)) {
914d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n",
915d8a32ac2SJussi Kivilinna 				       d, j, e, k, algo);
916da7f033dSHerbert Xu 				hexdump(q, n);
917da7f033dSHerbert Xu 				goto out;
918da7f033dSHerbert Xu 			}
919da7f033dSHerbert Xu 
920da7f033dSHerbert Xu 			q += n;
921da7f033dSHerbert Xu 			if (k == template[i].np - 1 && !enc) {
922d8a32ac2SJussi Kivilinna 				if (!diff_dst &&
923d8a32ac2SJussi Kivilinna 					memcmp(q, template[i].input +
924da7f033dSHerbert Xu 					      temp + n, authsize))
925da7f033dSHerbert Xu 					n = authsize;
926da7f033dSHerbert Xu 				else
927da7f033dSHerbert Xu 					n = 0;
928da7f033dSHerbert Xu 			} else {
92905b1d338SCristian Stoica 				for (n = 0; offset_in_page(q + n) && q[n]; n++)
930da7f033dSHerbert Xu 					;
931da7f033dSHerbert Xu 			}
932da7f033dSHerbert Xu 			if (n) {
933d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
934d8a32ac2SJussi Kivilinna 				       d, j, e, k, algo, n);
935da7f033dSHerbert Xu 				hexdump(q, n);
936da7f033dSHerbert Xu 				goto out;
937da7f033dSHerbert Xu 			}
938da7f033dSHerbert Xu 
939da7f033dSHerbert Xu 			temp += template[i].tap[k];
940da7f033dSHerbert Xu 		}
941da7f033dSHerbert Xu 	}
942da7f033dSHerbert Xu 
943da7f033dSHerbert Xu 	ret = 0;
944da7f033dSHerbert Xu 
945da7f033dSHerbert Xu out:
946da7f033dSHerbert Xu 	aead_request_free(req);
947d8a32ac2SJussi Kivilinna 	kfree(sg);
948d8a32ac2SJussi Kivilinna out_nosg:
949d8a32ac2SJussi Kivilinna 	if (diff_dst)
950d8a32ac2SJussi Kivilinna 		testmgr_free_buf(xoutbuf);
951d8a32ac2SJussi Kivilinna out_nooutbuf:
952f8b0d4d0SHerbert Xu 	testmgr_free_buf(axbuf);
953f8b0d4d0SHerbert Xu out_noaxbuf:
954f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
955f8b0d4d0SHerbert Xu out_noxbuf:
95629b77e5dSHoria Geanta 	kfree(key);
9579bac019dSTadeusz Struk 	kfree(iv);
958da7f033dSHerbert Xu 	return ret;
959da7f033dSHerbert Xu }
960da7f033dSHerbert Xu 
961d8a32ac2SJussi Kivilinna static int test_aead(struct crypto_aead *tfm, int enc,
962b13b1e0cSEric Biggers 		     const struct aead_testvec *template, unsigned int tcount)
963d8a32ac2SJussi Kivilinna {
96458dcf548SJussi Kivilinna 	unsigned int alignmask;
965d8a32ac2SJussi Kivilinna 	int ret;
966d8a32ac2SJussi Kivilinna 
967d8a32ac2SJussi Kivilinna 	/* test 'dst == src' case */
96858dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, false, 0);
969d8a32ac2SJussi Kivilinna 	if (ret)
970d8a32ac2SJussi Kivilinna 		return ret;
971d8a32ac2SJussi Kivilinna 
972d8a32ac2SJussi Kivilinna 	/* test 'dst != src' case */
97358dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, true, 0);
97458dcf548SJussi Kivilinna 	if (ret)
97558dcf548SJussi Kivilinna 		return ret;
97658dcf548SJussi Kivilinna 
97758dcf548SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
97858dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, true, 1);
97958dcf548SJussi Kivilinna 	if (ret)
98058dcf548SJussi Kivilinna 		return ret;
98158dcf548SJussi Kivilinna 
98258dcf548SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
98358dcf548SJussi Kivilinna 	if (alignmask) {
98458dcf548SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
98558dcf548SJussi Kivilinna 		ret = __test_aead(tfm, enc, template, tcount, true,
98658dcf548SJussi Kivilinna 				  alignmask + 1);
98758dcf548SJussi Kivilinna 		if (ret)
98858dcf548SJussi Kivilinna 			return ret;
98958dcf548SJussi Kivilinna 	}
99058dcf548SJussi Kivilinna 
99158dcf548SJussi Kivilinna 	return 0;
992d8a32ac2SJussi Kivilinna }
993d8a32ac2SJussi Kivilinna 
9941aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc,
995b13b1e0cSEric Biggers 		       const struct cipher_testvec *template,
996b13b1e0cSEric Biggers 		       unsigned int tcount)
9971aa4ecd9SHerbert Xu {
9981aa4ecd9SHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm));
9991aa4ecd9SHerbert Xu 	unsigned int i, j, k;
10001aa4ecd9SHerbert Xu 	char *q;
10011aa4ecd9SHerbert Xu 	const char *e;
10021aa4ecd9SHerbert Xu 	void *data;
1003f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
1004f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
1005f8b0d4d0SHerbert Xu 
1006f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
1007f8b0d4d0SHerbert Xu 		goto out_nobuf;
10081aa4ecd9SHerbert Xu 
10091aa4ecd9SHerbert Xu 	if (enc == ENCRYPT)
10101aa4ecd9SHerbert Xu 	        e = "encryption";
10111aa4ecd9SHerbert Xu 	else
10121aa4ecd9SHerbert Xu 		e = "decryption";
10131aa4ecd9SHerbert Xu 
10141aa4ecd9SHerbert Xu 	j = 0;
10151aa4ecd9SHerbert Xu 	for (i = 0; i < tcount; i++) {
10161aa4ecd9SHerbert Xu 		if (template[i].np)
10171aa4ecd9SHerbert Xu 			continue;
10181aa4ecd9SHerbert Xu 
101910faa8c0SStephan Mueller 		if (fips_enabled && template[i].fips_skip)
102010faa8c0SStephan Mueller 			continue;
102110faa8c0SStephan Mueller 
10221aa4ecd9SHerbert Xu 		j++;
10231aa4ecd9SHerbert Xu 
1024fd57f22aSHerbert Xu 		ret = -EINVAL;
1025fd57f22aSHerbert Xu 		if (WARN_ON(template[i].ilen > PAGE_SIZE))
1026fd57f22aSHerbert Xu 			goto out;
1027fd57f22aSHerbert Xu 
10281aa4ecd9SHerbert Xu 		data = xbuf[0];
10291aa4ecd9SHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
10301aa4ecd9SHerbert Xu 
10311aa4ecd9SHerbert Xu 		crypto_cipher_clear_flags(tfm, ~0);
10321aa4ecd9SHerbert Xu 		if (template[i].wk)
10331aa4ecd9SHerbert Xu 			crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
10341aa4ecd9SHerbert Xu 
10351aa4ecd9SHerbert Xu 		ret = crypto_cipher_setkey(tfm, template[i].key,
10361aa4ecd9SHerbert Xu 					   template[i].klen);
10370fae0c1eSYanjiang Jin 		if (template[i].fail == !ret) {
10381aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: setkey failed "
10391aa4ecd9SHerbert Xu 			       "on test %d for %s: flags=%x\n", j,
10401aa4ecd9SHerbert Xu 			       algo, crypto_cipher_get_flags(tfm));
10411aa4ecd9SHerbert Xu 			goto out;
10421aa4ecd9SHerbert Xu 		} else if (ret)
10431aa4ecd9SHerbert Xu 			continue;
10441aa4ecd9SHerbert Xu 
10451aa4ecd9SHerbert Xu 		for (k = 0; k < template[i].ilen;
10461aa4ecd9SHerbert Xu 		     k += crypto_cipher_blocksize(tfm)) {
10471aa4ecd9SHerbert Xu 			if (enc)
10481aa4ecd9SHerbert Xu 				crypto_cipher_encrypt_one(tfm, data + k,
10491aa4ecd9SHerbert Xu 							  data + k);
10501aa4ecd9SHerbert Xu 			else
10511aa4ecd9SHerbert Xu 				crypto_cipher_decrypt_one(tfm, data + k,
10521aa4ecd9SHerbert Xu 							  data + k);
10531aa4ecd9SHerbert Xu 		}
10541aa4ecd9SHerbert Xu 
10551aa4ecd9SHerbert Xu 		q = data;
10561aa4ecd9SHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
10571aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: Test %d failed "
10581aa4ecd9SHerbert Xu 			       "on %s for %s\n", j, e, algo);
10591aa4ecd9SHerbert Xu 			hexdump(q, template[i].rlen);
10601aa4ecd9SHerbert Xu 			ret = -EINVAL;
10611aa4ecd9SHerbert Xu 			goto out;
10621aa4ecd9SHerbert Xu 		}
10631aa4ecd9SHerbert Xu 	}
10641aa4ecd9SHerbert Xu 
10651aa4ecd9SHerbert Xu 	ret = 0;
10661aa4ecd9SHerbert Xu 
10671aa4ecd9SHerbert Xu out:
1068f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
1069f8b0d4d0SHerbert Xu out_nobuf:
10701aa4ecd9SHerbert Xu 	return ret;
10711aa4ecd9SHerbert Xu }
10721aa4ecd9SHerbert Xu 
107312773d93SHerbert Xu static int __test_skcipher(struct crypto_skcipher *tfm, int enc,
1074b13b1e0cSEric Biggers 			   const struct cipher_testvec *template,
1075b13b1e0cSEric Biggers 			   unsigned int tcount,
10763a338f20SJussi Kivilinna 			   const bool diff_dst, const int align_offset)
1077da7f033dSHerbert Xu {
1078da7f033dSHerbert Xu 	const char *algo =
107912773d93SHerbert Xu 		crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm));
1080da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
1081da7f033dSHerbert Xu 	char *q;
108212773d93SHerbert Xu 	struct skcipher_request *req;
1083da7f033dSHerbert Xu 	struct scatterlist sg[8];
108408d6af8cSJussi Kivilinna 	struct scatterlist sgout[8];
108508d6af8cSJussi Kivilinna 	const char *e, *d;
1086da7f033dSHerbert Xu 	struct tcrypt_result result;
1087da7f033dSHerbert Xu 	void *data;
1088da7f033dSHerbert Xu 	char iv[MAX_IVLEN];
1089f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
109008d6af8cSJussi Kivilinna 	char *xoutbuf[XBUFSIZE];
1091f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
109284cba178SAndrey Ryabinin 	unsigned int ivsize = crypto_skcipher_ivsize(tfm);
1093f8b0d4d0SHerbert Xu 
1094f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
1095f8b0d4d0SHerbert Xu 		goto out_nobuf;
1096da7f033dSHerbert Xu 
109708d6af8cSJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
109808d6af8cSJussi Kivilinna 		goto out_nooutbuf;
109908d6af8cSJussi Kivilinna 
110008d6af8cSJussi Kivilinna 	if (diff_dst)
110108d6af8cSJussi Kivilinna 		d = "-ddst";
110208d6af8cSJussi Kivilinna 	else
110308d6af8cSJussi Kivilinna 		d = "";
110408d6af8cSJussi Kivilinna 
1105da7f033dSHerbert Xu 	if (enc == ENCRYPT)
1106da7f033dSHerbert Xu 	        e = "encryption";
1107da7f033dSHerbert Xu 	else
1108da7f033dSHerbert Xu 		e = "decryption";
1109da7f033dSHerbert Xu 
1110da7f033dSHerbert Xu 	init_completion(&result.completion);
1111da7f033dSHerbert Xu 
111212773d93SHerbert Xu 	req = skcipher_request_alloc(tfm, GFP_KERNEL);
1113da7f033dSHerbert Xu 	if (!req) {
111408d6af8cSJussi Kivilinna 		pr_err("alg: skcipher%s: Failed to allocate request for %s\n",
111508d6af8cSJussi Kivilinna 		       d, algo);
1116da7f033dSHerbert Xu 		goto out;
1117da7f033dSHerbert Xu 	}
1118da7f033dSHerbert Xu 
111912773d93SHerbert Xu 	skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1120da7f033dSHerbert Xu 				      tcrypt_complete, &result);
1121da7f033dSHerbert Xu 
1122da7f033dSHerbert Xu 	j = 0;
1123da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
1124bbb9a7ddSCristian Stoica 		if (template[i].np && !template[i].also_non_np)
1125bbb9a7ddSCristian Stoica 			continue;
1126bbb9a7ddSCristian Stoica 
112710faa8c0SStephan Mueller 		if (fips_enabled && template[i].fips_skip)
112810faa8c0SStephan Mueller 			continue;
112910faa8c0SStephan Mueller 
1130da7f033dSHerbert Xu 		if (template[i].iv)
113184cba178SAndrey Ryabinin 			memcpy(iv, template[i].iv, ivsize);
1132da7f033dSHerbert Xu 		else
1133da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
1134da7f033dSHerbert Xu 
1135da7f033dSHerbert Xu 		j++;
1136fd57f22aSHerbert Xu 		ret = -EINVAL;
1137a1aa44a2SCristian Stoica 		if (WARN_ON(align_offset + template[i].ilen > PAGE_SIZE))
1138fd57f22aSHerbert Xu 			goto out;
1139fd57f22aSHerbert Xu 
1140da7f033dSHerbert Xu 		data = xbuf[0];
11413a338f20SJussi Kivilinna 		data += align_offset;
1142da7f033dSHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
1143da7f033dSHerbert Xu 
114412773d93SHerbert Xu 		crypto_skcipher_clear_flags(tfm, ~0);
1145da7f033dSHerbert Xu 		if (template[i].wk)
114612773d93SHerbert Xu 			crypto_skcipher_set_flags(tfm,
114712773d93SHerbert Xu 						  CRYPTO_TFM_REQ_WEAK_KEY);
1148da7f033dSHerbert Xu 
114912773d93SHerbert Xu 		ret = crypto_skcipher_setkey(tfm, template[i].key,
1150da7f033dSHerbert Xu 					     template[i].klen);
11510fae0c1eSYanjiang Jin 		if (template[i].fail == !ret) {
115208d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n",
115312773d93SHerbert Xu 			       d, j, algo, crypto_skcipher_get_flags(tfm));
1154da7f033dSHerbert Xu 			goto out;
1155da7f033dSHerbert Xu 		} else if (ret)
1156da7f033dSHerbert Xu 			continue;
1157da7f033dSHerbert Xu 
1158da7f033dSHerbert Xu 		sg_init_one(&sg[0], data, template[i].ilen);
115908d6af8cSJussi Kivilinna 		if (diff_dst) {
116008d6af8cSJussi Kivilinna 			data = xoutbuf[0];
11613a338f20SJussi Kivilinna 			data += align_offset;
116208d6af8cSJussi Kivilinna 			sg_init_one(&sgout[0], data, template[i].ilen);
116308d6af8cSJussi Kivilinna 		}
1164da7f033dSHerbert Xu 
116512773d93SHerbert Xu 		skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1166da7f033dSHerbert Xu 					   template[i].ilen, iv);
116712773d93SHerbert Xu 		ret = enc ? crypto_skcipher_encrypt(req) :
116812773d93SHerbert Xu 			    crypto_skcipher_decrypt(req);
1169da7f033dSHerbert Xu 
1170da7f033dSHerbert Xu 		switch (ret) {
1171da7f033dSHerbert Xu 		case 0:
1172da7f033dSHerbert Xu 			break;
1173da7f033dSHerbert Xu 		case -EINPROGRESS:
1174da7f033dSHerbert Xu 		case -EBUSY:
11758a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
117616735d02SWolfram Sang 			reinit_completion(&result.completion);
11778a45ac12SRabin Vincent 			ret = result.err;
11788a45ac12SRabin Vincent 			if (!ret)
1179da7f033dSHerbert Xu 				break;
1180da7f033dSHerbert Xu 			/* fall through */
1181da7f033dSHerbert Xu 		default:
118208d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n",
118308d6af8cSJussi Kivilinna 			       d, e, j, algo, -ret);
1184da7f033dSHerbert Xu 			goto out;
1185da7f033dSHerbert Xu 		}
1186da7f033dSHerbert Xu 
1187da7f033dSHerbert Xu 		q = data;
1188da7f033dSHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
11898a826a34SBoris BREZILLON 			pr_err("alg: skcipher%s: Test %d failed (invalid result) on %s for %s\n",
119008d6af8cSJussi Kivilinna 			       d, j, e, algo);
1191da7f033dSHerbert Xu 			hexdump(q, template[i].rlen);
1192da7f033dSHerbert Xu 			ret = -EINVAL;
1193da7f033dSHerbert Xu 			goto out;
1194da7f033dSHerbert Xu 		}
11958a826a34SBoris BREZILLON 
11968a826a34SBoris BREZILLON 		if (template[i].iv_out &&
11978a826a34SBoris BREZILLON 		    memcmp(iv, template[i].iv_out,
11988a826a34SBoris BREZILLON 			   crypto_skcipher_ivsize(tfm))) {
11998a826a34SBoris BREZILLON 			pr_err("alg: skcipher%s: Test %d failed (invalid output IV) on %s for %s\n",
12008a826a34SBoris BREZILLON 			       d, j, e, algo);
12018a826a34SBoris BREZILLON 			hexdump(iv, crypto_skcipher_ivsize(tfm));
12028a826a34SBoris BREZILLON 			ret = -EINVAL;
12038a826a34SBoris BREZILLON 			goto out;
12048a826a34SBoris BREZILLON 		}
1205da7f033dSHerbert Xu 	}
1206da7f033dSHerbert Xu 
1207da7f033dSHerbert Xu 	j = 0;
1208da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
12093a338f20SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
12103a338f20SJussi Kivilinna 		if (align_offset != 0)
12113a338f20SJussi Kivilinna 			break;
1212da7f033dSHerbert Xu 
1213bbb9a7ddSCristian Stoica 		if (!template[i].np)
1214bbb9a7ddSCristian Stoica 			continue;
1215bbb9a7ddSCristian Stoica 
121610faa8c0SStephan Mueller 		if (fips_enabled && template[i].fips_skip)
121710faa8c0SStephan Mueller 			continue;
121810faa8c0SStephan Mueller 
1219da7f033dSHerbert Xu 		if (template[i].iv)
122084cba178SAndrey Ryabinin 			memcpy(iv, template[i].iv, ivsize);
1221da7f033dSHerbert Xu 		else
1222da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
1223da7f033dSHerbert Xu 
1224da7f033dSHerbert Xu 		j++;
122512773d93SHerbert Xu 		crypto_skcipher_clear_flags(tfm, ~0);
1226da7f033dSHerbert Xu 		if (template[i].wk)
122712773d93SHerbert Xu 			crypto_skcipher_set_flags(tfm,
122812773d93SHerbert Xu 						  CRYPTO_TFM_REQ_WEAK_KEY);
1229da7f033dSHerbert Xu 
123012773d93SHerbert Xu 		ret = crypto_skcipher_setkey(tfm, template[i].key,
1231da7f033dSHerbert Xu 					     template[i].klen);
12320fae0c1eSYanjiang Jin 		if (template[i].fail == !ret) {
123308d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n",
123412773d93SHerbert Xu 			       d, j, algo, crypto_skcipher_get_flags(tfm));
1235da7f033dSHerbert Xu 			goto out;
1236da7f033dSHerbert Xu 		} else if (ret)
1237da7f033dSHerbert Xu 			continue;
1238da7f033dSHerbert Xu 
1239da7f033dSHerbert Xu 		temp = 0;
1240da7f033dSHerbert Xu 		ret = -EINVAL;
1241da7f033dSHerbert Xu 		sg_init_table(sg, template[i].np);
124208d6af8cSJussi Kivilinna 		if (diff_dst)
124308d6af8cSJussi Kivilinna 			sg_init_table(sgout, template[i].np);
1244da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
1245da7f033dSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
1246da7f033dSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
1247da7f033dSHerbert Xu 				goto out;
1248da7f033dSHerbert Xu 
1249a1aa44a2SCristian Stoica 			q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
1250da7f033dSHerbert Xu 
1251a1aa44a2SCristian Stoica 			memcpy(q, template[i].input + temp, template[i].tap[k]);
1252da7f033dSHerbert Xu 
1253a1aa44a2SCristian Stoica 			if (offset_in_page(q) + template[i].tap[k] < PAGE_SIZE)
1254da7f033dSHerbert Xu 				q[template[i].tap[k]] = 0;
1255da7f033dSHerbert Xu 
1256da7f033dSHerbert Xu 			sg_set_buf(&sg[k], q, template[i].tap[k]);
125708d6af8cSJussi Kivilinna 			if (diff_dst) {
125808d6af8cSJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
125908d6af8cSJussi Kivilinna 				    offset_in_page(IDX[k]);
126008d6af8cSJussi Kivilinna 
1261a1aa44a2SCristian Stoica 				sg_set_buf(&sgout[k], q, template[i].tap[k]);
126208d6af8cSJussi Kivilinna 
126308d6af8cSJussi Kivilinna 				memset(q, 0, template[i].tap[k]);
126408d6af8cSJussi Kivilinna 				if (offset_in_page(q) +
126508d6af8cSJussi Kivilinna 				    template[i].tap[k] < PAGE_SIZE)
126608d6af8cSJussi Kivilinna 					q[template[i].tap[k]] = 0;
126708d6af8cSJussi Kivilinna 			}
1268da7f033dSHerbert Xu 
1269da7f033dSHerbert Xu 			temp += template[i].tap[k];
1270da7f033dSHerbert Xu 		}
1271da7f033dSHerbert Xu 
127212773d93SHerbert Xu 		skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1273da7f033dSHerbert Xu 					   template[i].ilen, iv);
1274da7f033dSHerbert Xu 
127512773d93SHerbert Xu 		ret = enc ? crypto_skcipher_encrypt(req) :
127612773d93SHerbert Xu 			    crypto_skcipher_decrypt(req);
1277da7f033dSHerbert Xu 
1278da7f033dSHerbert Xu 		switch (ret) {
1279da7f033dSHerbert Xu 		case 0:
1280da7f033dSHerbert Xu 			break;
1281da7f033dSHerbert Xu 		case -EINPROGRESS:
1282da7f033dSHerbert Xu 		case -EBUSY:
12838a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
128416735d02SWolfram Sang 			reinit_completion(&result.completion);
12858a45ac12SRabin Vincent 			ret = result.err;
12868a45ac12SRabin Vincent 			if (!ret)
1287da7f033dSHerbert Xu 				break;
1288da7f033dSHerbert Xu 			/* fall through */
1289da7f033dSHerbert Xu 		default:
129008d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n",
129108d6af8cSJussi Kivilinna 			       d, e, j, algo, -ret);
1292da7f033dSHerbert Xu 			goto out;
1293da7f033dSHerbert Xu 		}
1294da7f033dSHerbert Xu 
1295da7f033dSHerbert Xu 		temp = 0;
1296da7f033dSHerbert Xu 		ret = -EINVAL;
1297da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
129808d6af8cSJussi Kivilinna 			if (diff_dst)
129908d6af8cSJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
130008d6af8cSJussi Kivilinna 				    offset_in_page(IDX[k]);
130108d6af8cSJussi Kivilinna 			else
1302da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
1303da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
1304da7f033dSHerbert Xu 
1305da7f033dSHerbert Xu 			if (memcmp(q, template[i].result + temp,
1306da7f033dSHerbert Xu 				   template[i].tap[k])) {
130708d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n",
130808d6af8cSJussi Kivilinna 				       d, j, e, k, algo);
1309da7f033dSHerbert Xu 				hexdump(q, template[i].tap[k]);
1310da7f033dSHerbert Xu 				goto out;
1311da7f033dSHerbert Xu 			}
1312da7f033dSHerbert Xu 
1313da7f033dSHerbert Xu 			q += template[i].tap[k];
1314da7f033dSHerbert Xu 			for (n = 0; offset_in_page(q + n) && q[n]; n++)
1315da7f033dSHerbert Xu 				;
1316da7f033dSHerbert Xu 			if (n) {
131708d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
131808d6af8cSJussi Kivilinna 				       d, j, e, k, algo, n);
1319da7f033dSHerbert Xu 				hexdump(q, n);
1320da7f033dSHerbert Xu 				goto out;
1321da7f033dSHerbert Xu 			}
1322da7f033dSHerbert Xu 			temp += template[i].tap[k];
1323da7f033dSHerbert Xu 		}
1324da7f033dSHerbert Xu 	}
1325da7f033dSHerbert Xu 
1326da7f033dSHerbert Xu 	ret = 0;
1327da7f033dSHerbert Xu 
1328da7f033dSHerbert Xu out:
132912773d93SHerbert Xu 	skcipher_request_free(req);
133008d6af8cSJussi Kivilinna 	if (diff_dst)
133108d6af8cSJussi Kivilinna 		testmgr_free_buf(xoutbuf);
133208d6af8cSJussi Kivilinna out_nooutbuf:
1333f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
1334f8b0d4d0SHerbert Xu out_nobuf:
1335da7f033dSHerbert Xu 	return ret;
1336da7f033dSHerbert Xu }
1337da7f033dSHerbert Xu 
133812773d93SHerbert Xu static int test_skcipher(struct crypto_skcipher *tfm, int enc,
1339b13b1e0cSEric Biggers 			 const struct cipher_testvec *template,
1340b13b1e0cSEric Biggers 			 unsigned int tcount)
134108d6af8cSJussi Kivilinna {
13423a338f20SJussi Kivilinna 	unsigned int alignmask;
134308d6af8cSJussi Kivilinna 	int ret;
134408d6af8cSJussi Kivilinna 
134508d6af8cSJussi Kivilinna 	/* test 'dst == src' case */
13463a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, false, 0);
134708d6af8cSJussi Kivilinna 	if (ret)
134808d6af8cSJussi Kivilinna 		return ret;
134908d6af8cSJussi Kivilinna 
135008d6af8cSJussi Kivilinna 	/* test 'dst != src' case */
13513a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 0);
13523a338f20SJussi Kivilinna 	if (ret)
13533a338f20SJussi Kivilinna 		return ret;
13543a338f20SJussi Kivilinna 
13553a338f20SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
13563a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 1);
13573a338f20SJussi Kivilinna 	if (ret)
13583a338f20SJussi Kivilinna 		return ret;
13593a338f20SJussi Kivilinna 
13603a338f20SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
13613a338f20SJussi Kivilinna 	if (alignmask) {
13623a338f20SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
13633a338f20SJussi Kivilinna 		ret = __test_skcipher(tfm, enc, template, tcount, true,
13643a338f20SJussi Kivilinna 				      alignmask + 1);
13653a338f20SJussi Kivilinna 		if (ret)
13663a338f20SJussi Kivilinna 			return ret;
13673a338f20SJussi Kivilinna 	}
13683a338f20SJussi Kivilinna 
13693a338f20SJussi Kivilinna 	return 0;
137008d6af8cSJussi Kivilinna }
137108d6af8cSJussi Kivilinna 
1372b13b1e0cSEric Biggers static int test_comp(struct crypto_comp *tfm,
1373b13b1e0cSEric Biggers 		     const struct comp_testvec *ctemplate,
1374b13b1e0cSEric Biggers 		     const struct comp_testvec *dtemplate,
1375b13b1e0cSEric Biggers 		     int ctcount, int dtcount)
1376da7f033dSHerbert Xu {
1377da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
1378da7f033dSHerbert Xu 	unsigned int i;
1379da7f033dSHerbert Xu 	char result[COMP_BUF_SIZE];
1380da7f033dSHerbert Xu 	int ret;
1381da7f033dSHerbert Xu 
1382da7f033dSHerbert Xu 	for (i = 0; i < ctcount; i++) {
1383c79cf910SGeert Uytterhoeven 		int ilen;
1384c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1385da7f033dSHerbert Xu 
1386da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1387da7f033dSHerbert Xu 
1388da7f033dSHerbert Xu 		ilen = ctemplate[i].inlen;
1389da7f033dSHerbert Xu 		ret = crypto_comp_compress(tfm, ctemplate[i].input,
1390da7f033dSHerbert Xu 		                           ilen, result, &dlen);
1391da7f033dSHerbert Xu 		if (ret) {
1392da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: compression failed "
1393da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1394da7f033dSHerbert Xu 			       -ret);
1395da7f033dSHerbert Xu 			goto out;
1396da7f033dSHerbert Xu 		}
1397da7f033dSHerbert Xu 
1398b812eb00SGeert Uytterhoeven 		if (dlen != ctemplate[i].outlen) {
1399b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Compression test %d "
1400b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1401b812eb00SGeert Uytterhoeven 			       dlen);
1402b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1403b812eb00SGeert Uytterhoeven 			goto out;
1404b812eb00SGeert Uytterhoeven 		}
1405b812eb00SGeert Uytterhoeven 
1406da7f033dSHerbert Xu 		if (memcmp(result, ctemplate[i].output, dlen)) {
1407da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Compression test %d "
1408da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1409da7f033dSHerbert Xu 			hexdump(result, dlen);
1410da7f033dSHerbert Xu 			ret = -EINVAL;
1411da7f033dSHerbert Xu 			goto out;
1412da7f033dSHerbert Xu 		}
1413da7f033dSHerbert Xu 	}
1414da7f033dSHerbert Xu 
1415da7f033dSHerbert Xu 	for (i = 0; i < dtcount; i++) {
1416c79cf910SGeert Uytterhoeven 		int ilen;
1417c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1418da7f033dSHerbert Xu 
1419da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1420da7f033dSHerbert Xu 
1421da7f033dSHerbert Xu 		ilen = dtemplate[i].inlen;
1422da7f033dSHerbert Xu 		ret = crypto_comp_decompress(tfm, dtemplate[i].input,
1423da7f033dSHerbert Xu 		                             ilen, result, &dlen);
1424da7f033dSHerbert Xu 		if (ret) {
1425da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: decompression failed "
1426da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1427da7f033dSHerbert Xu 			       -ret);
1428da7f033dSHerbert Xu 			goto out;
1429da7f033dSHerbert Xu 		}
1430da7f033dSHerbert Xu 
1431b812eb00SGeert Uytterhoeven 		if (dlen != dtemplate[i].outlen) {
1432b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Decompression test %d "
1433b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1434b812eb00SGeert Uytterhoeven 			       dlen);
1435b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1436b812eb00SGeert Uytterhoeven 			goto out;
1437b812eb00SGeert Uytterhoeven 		}
1438b812eb00SGeert Uytterhoeven 
1439da7f033dSHerbert Xu 		if (memcmp(result, dtemplate[i].output, dlen)) {
1440da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Decompression test %d "
1441da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1442da7f033dSHerbert Xu 			hexdump(result, dlen);
1443da7f033dSHerbert Xu 			ret = -EINVAL;
1444da7f033dSHerbert Xu 			goto out;
1445da7f033dSHerbert Xu 		}
1446da7f033dSHerbert Xu 	}
1447da7f033dSHerbert Xu 
1448da7f033dSHerbert Xu 	ret = 0;
1449da7f033dSHerbert Xu 
1450da7f033dSHerbert Xu out:
1451da7f033dSHerbert Xu 	return ret;
1452da7f033dSHerbert Xu }
1453da7f033dSHerbert Xu 
1454b13b1e0cSEric Biggers static int test_acomp(struct crypto_acomp *tfm,
1455b13b1e0cSEric Biggers 		      const struct comp_testvec *ctemplate,
1456b13b1e0cSEric Biggers 		      const struct comp_testvec *dtemplate,
1457b13b1e0cSEric Biggers 		      int ctcount, int dtcount)
1458d7db7a88SGiovanni Cabiddu {
1459d7db7a88SGiovanni Cabiddu 	const char *algo = crypto_tfm_alg_driver_name(crypto_acomp_tfm(tfm));
1460d7db7a88SGiovanni Cabiddu 	unsigned int i;
1461a9943a0aSGiovanni Cabiddu 	char *output, *decomp_out;
1462d7db7a88SGiovanni Cabiddu 	int ret;
1463d7db7a88SGiovanni Cabiddu 	struct scatterlist src, dst;
1464d7db7a88SGiovanni Cabiddu 	struct acomp_req *req;
1465d7db7a88SGiovanni Cabiddu 	struct tcrypt_result result;
1466d7db7a88SGiovanni Cabiddu 
1467eb095593SEric Biggers 	output = kmalloc(COMP_BUF_SIZE, GFP_KERNEL);
1468eb095593SEric Biggers 	if (!output)
1469eb095593SEric Biggers 		return -ENOMEM;
1470eb095593SEric Biggers 
1471a9943a0aSGiovanni Cabiddu 	decomp_out = kmalloc(COMP_BUF_SIZE, GFP_KERNEL);
1472a9943a0aSGiovanni Cabiddu 	if (!decomp_out) {
1473a9943a0aSGiovanni Cabiddu 		kfree(output);
1474a9943a0aSGiovanni Cabiddu 		return -ENOMEM;
1475a9943a0aSGiovanni Cabiddu 	}
1476a9943a0aSGiovanni Cabiddu 
1477d7db7a88SGiovanni Cabiddu 	for (i = 0; i < ctcount; i++) {
1478d7db7a88SGiovanni Cabiddu 		unsigned int dlen = COMP_BUF_SIZE;
1479d7db7a88SGiovanni Cabiddu 		int ilen = ctemplate[i].inlen;
148002608e02SLaura Abbott 		void *input_vec;
1481d7db7a88SGiovanni Cabiddu 
1482d2110224SEric Biggers 		input_vec = kmemdup(ctemplate[i].input, ilen, GFP_KERNEL);
148302608e02SLaura Abbott 		if (!input_vec) {
148402608e02SLaura Abbott 			ret = -ENOMEM;
148502608e02SLaura Abbott 			goto out;
148602608e02SLaura Abbott 		}
148702608e02SLaura Abbott 
1488eb095593SEric Biggers 		memset(output, 0, dlen);
1489d7db7a88SGiovanni Cabiddu 		init_completion(&result.completion);
149002608e02SLaura Abbott 		sg_init_one(&src, input_vec, ilen);
1491d7db7a88SGiovanni Cabiddu 		sg_init_one(&dst, output, dlen);
1492d7db7a88SGiovanni Cabiddu 
1493d7db7a88SGiovanni Cabiddu 		req = acomp_request_alloc(tfm);
1494d7db7a88SGiovanni Cabiddu 		if (!req) {
1495d7db7a88SGiovanni Cabiddu 			pr_err("alg: acomp: request alloc failed for %s\n",
1496d7db7a88SGiovanni Cabiddu 			       algo);
149702608e02SLaura Abbott 			kfree(input_vec);
1498d7db7a88SGiovanni Cabiddu 			ret = -ENOMEM;
1499d7db7a88SGiovanni Cabiddu 			goto out;
1500d7db7a88SGiovanni Cabiddu 		}
1501d7db7a88SGiovanni Cabiddu 
1502d7db7a88SGiovanni Cabiddu 		acomp_request_set_params(req, &src, &dst, ilen, dlen);
1503d7db7a88SGiovanni Cabiddu 		acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1504d7db7a88SGiovanni Cabiddu 					   tcrypt_complete, &result);
1505d7db7a88SGiovanni Cabiddu 
1506d7db7a88SGiovanni Cabiddu 		ret = wait_async_op(&result, crypto_acomp_compress(req));
1507d7db7a88SGiovanni Cabiddu 		if (ret) {
1508d7db7a88SGiovanni Cabiddu 			pr_err("alg: acomp: compression failed on test %d for %s: ret=%d\n",
1509d7db7a88SGiovanni Cabiddu 			       i + 1, algo, -ret);
151002608e02SLaura Abbott 			kfree(input_vec);
1511d7db7a88SGiovanni Cabiddu 			acomp_request_free(req);
1512d7db7a88SGiovanni Cabiddu 			goto out;
1513d7db7a88SGiovanni Cabiddu 		}
1514d7db7a88SGiovanni Cabiddu 
1515a9943a0aSGiovanni Cabiddu 		ilen = req->dlen;
1516a9943a0aSGiovanni Cabiddu 		dlen = COMP_BUF_SIZE;
1517a9943a0aSGiovanni Cabiddu 		sg_init_one(&src, output, ilen);
1518a9943a0aSGiovanni Cabiddu 		sg_init_one(&dst, decomp_out, dlen);
1519a9943a0aSGiovanni Cabiddu 		init_completion(&result.completion);
1520a9943a0aSGiovanni Cabiddu 		acomp_request_set_params(req, &src, &dst, ilen, dlen);
1521a9943a0aSGiovanni Cabiddu 
1522a9943a0aSGiovanni Cabiddu 		ret = wait_async_op(&result, crypto_acomp_decompress(req));
1523a9943a0aSGiovanni Cabiddu 		if (ret) {
1524a9943a0aSGiovanni Cabiddu 			pr_err("alg: acomp: compression failed on test %d for %s: ret=%d\n",
1525a9943a0aSGiovanni Cabiddu 			       i + 1, algo, -ret);
1526a9943a0aSGiovanni Cabiddu 			kfree(input_vec);
1527a9943a0aSGiovanni Cabiddu 			acomp_request_free(req);
1528a9943a0aSGiovanni Cabiddu 			goto out;
1529a9943a0aSGiovanni Cabiddu 		}
1530a9943a0aSGiovanni Cabiddu 
1531a9943a0aSGiovanni Cabiddu 		if (req->dlen != ctemplate[i].inlen) {
1532d7db7a88SGiovanni Cabiddu 			pr_err("alg: acomp: Compression test %d failed for %s: output len = %d\n",
1533d7db7a88SGiovanni Cabiddu 			       i + 1, algo, req->dlen);
1534d7db7a88SGiovanni Cabiddu 			ret = -EINVAL;
153502608e02SLaura Abbott 			kfree(input_vec);
1536d7db7a88SGiovanni Cabiddu 			acomp_request_free(req);
1537d7db7a88SGiovanni Cabiddu 			goto out;
1538d7db7a88SGiovanni Cabiddu 		}
1539d7db7a88SGiovanni Cabiddu 
1540a9943a0aSGiovanni Cabiddu 		if (memcmp(input_vec, decomp_out, req->dlen)) {
1541d7db7a88SGiovanni Cabiddu 			pr_err("alg: acomp: Compression test %d failed for %s\n",
1542d7db7a88SGiovanni Cabiddu 			       i + 1, algo);
1543d7db7a88SGiovanni Cabiddu 			hexdump(output, req->dlen);
1544d7db7a88SGiovanni Cabiddu 			ret = -EINVAL;
154502608e02SLaura Abbott 			kfree(input_vec);
1546d7db7a88SGiovanni Cabiddu 			acomp_request_free(req);
1547d7db7a88SGiovanni Cabiddu 			goto out;
1548d7db7a88SGiovanni Cabiddu 		}
1549d7db7a88SGiovanni Cabiddu 
155002608e02SLaura Abbott 		kfree(input_vec);
1551d7db7a88SGiovanni Cabiddu 		acomp_request_free(req);
1552d7db7a88SGiovanni Cabiddu 	}
1553d7db7a88SGiovanni Cabiddu 
1554d7db7a88SGiovanni Cabiddu 	for (i = 0; i < dtcount; i++) {
1555d7db7a88SGiovanni Cabiddu 		unsigned int dlen = COMP_BUF_SIZE;
1556d7db7a88SGiovanni Cabiddu 		int ilen = dtemplate[i].inlen;
155702608e02SLaura Abbott 		void *input_vec;
1558d7db7a88SGiovanni Cabiddu 
1559d2110224SEric Biggers 		input_vec = kmemdup(dtemplate[i].input, ilen, GFP_KERNEL);
156002608e02SLaura Abbott 		if (!input_vec) {
156102608e02SLaura Abbott 			ret = -ENOMEM;
156202608e02SLaura Abbott 			goto out;
156302608e02SLaura Abbott 		}
156402608e02SLaura Abbott 
1565eb095593SEric Biggers 		memset(output, 0, dlen);
1566d7db7a88SGiovanni Cabiddu 		init_completion(&result.completion);
156702608e02SLaura Abbott 		sg_init_one(&src, input_vec, ilen);
1568d7db7a88SGiovanni Cabiddu 		sg_init_one(&dst, output, dlen);
1569d7db7a88SGiovanni Cabiddu 
1570d7db7a88SGiovanni Cabiddu 		req = acomp_request_alloc(tfm);
1571d7db7a88SGiovanni Cabiddu 		if (!req) {
1572d7db7a88SGiovanni Cabiddu 			pr_err("alg: acomp: request alloc failed for %s\n",
1573d7db7a88SGiovanni Cabiddu 			       algo);
157402608e02SLaura Abbott 			kfree(input_vec);
1575d7db7a88SGiovanni Cabiddu 			ret = -ENOMEM;
1576d7db7a88SGiovanni Cabiddu 			goto out;
1577d7db7a88SGiovanni Cabiddu 		}
1578d7db7a88SGiovanni Cabiddu 
1579d7db7a88SGiovanni Cabiddu 		acomp_request_set_params(req, &src, &dst, ilen, dlen);
1580d7db7a88SGiovanni Cabiddu 		acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1581d7db7a88SGiovanni Cabiddu 					   tcrypt_complete, &result);
1582d7db7a88SGiovanni Cabiddu 
1583d7db7a88SGiovanni Cabiddu 		ret = wait_async_op(&result, crypto_acomp_decompress(req));
1584d7db7a88SGiovanni Cabiddu 		if (ret) {
1585d7db7a88SGiovanni Cabiddu 			pr_err("alg: acomp: decompression failed on test %d for %s: ret=%d\n",
1586d7db7a88SGiovanni Cabiddu 			       i + 1, algo, -ret);
158702608e02SLaura Abbott 			kfree(input_vec);
1588d7db7a88SGiovanni Cabiddu 			acomp_request_free(req);
1589d7db7a88SGiovanni Cabiddu 			goto out;
1590d7db7a88SGiovanni Cabiddu 		}
1591d7db7a88SGiovanni Cabiddu 
1592d7db7a88SGiovanni Cabiddu 		if (req->dlen != dtemplate[i].outlen) {
1593d7db7a88SGiovanni Cabiddu 			pr_err("alg: acomp: Decompression test %d failed for %s: output len = %d\n",
1594d7db7a88SGiovanni Cabiddu 			       i + 1, algo, req->dlen);
1595d7db7a88SGiovanni Cabiddu 			ret = -EINVAL;
159602608e02SLaura Abbott 			kfree(input_vec);
1597d7db7a88SGiovanni Cabiddu 			acomp_request_free(req);
1598d7db7a88SGiovanni Cabiddu 			goto out;
1599d7db7a88SGiovanni Cabiddu 		}
1600d7db7a88SGiovanni Cabiddu 
1601d7db7a88SGiovanni Cabiddu 		if (memcmp(output, dtemplate[i].output, req->dlen)) {
1602d7db7a88SGiovanni Cabiddu 			pr_err("alg: acomp: Decompression test %d failed for %s\n",
1603d7db7a88SGiovanni Cabiddu 			       i + 1, algo);
1604d7db7a88SGiovanni Cabiddu 			hexdump(output, req->dlen);
1605d7db7a88SGiovanni Cabiddu 			ret = -EINVAL;
160602608e02SLaura Abbott 			kfree(input_vec);
1607d7db7a88SGiovanni Cabiddu 			acomp_request_free(req);
1608d7db7a88SGiovanni Cabiddu 			goto out;
1609d7db7a88SGiovanni Cabiddu 		}
1610d7db7a88SGiovanni Cabiddu 
161102608e02SLaura Abbott 		kfree(input_vec);
1612d7db7a88SGiovanni Cabiddu 		acomp_request_free(req);
1613d7db7a88SGiovanni Cabiddu 	}
1614d7db7a88SGiovanni Cabiddu 
1615d7db7a88SGiovanni Cabiddu 	ret = 0;
1616d7db7a88SGiovanni Cabiddu 
1617d7db7a88SGiovanni Cabiddu out:
1618a9943a0aSGiovanni Cabiddu 	kfree(decomp_out);
1619eb095593SEric Biggers 	kfree(output);
1620d7db7a88SGiovanni Cabiddu 	return ret;
1621d7db7a88SGiovanni Cabiddu }
1622d7db7a88SGiovanni Cabiddu 
1623b13b1e0cSEric Biggers static int test_cprng(struct crypto_rng *tfm,
1624b13b1e0cSEric Biggers 		      const struct cprng_testvec *template,
16257647d6ceSJarod Wilson 		      unsigned int tcount)
16267647d6ceSJarod Wilson {
16277647d6ceSJarod Wilson 	const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
1628fa4ef8a6SFelipe Contreras 	int err = 0, i, j, seedsize;
16297647d6ceSJarod Wilson 	u8 *seed;
16307647d6ceSJarod Wilson 	char result[32];
16317647d6ceSJarod Wilson 
16327647d6ceSJarod Wilson 	seedsize = crypto_rng_seedsize(tfm);
16337647d6ceSJarod Wilson 
16347647d6ceSJarod Wilson 	seed = kmalloc(seedsize, GFP_KERNEL);
16357647d6ceSJarod Wilson 	if (!seed) {
16367647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to allocate seed space "
16377647d6ceSJarod Wilson 		       "for %s\n", algo);
16387647d6ceSJarod Wilson 		return -ENOMEM;
16397647d6ceSJarod Wilson 	}
16407647d6ceSJarod Wilson 
16417647d6ceSJarod Wilson 	for (i = 0; i < tcount; i++) {
16427647d6ceSJarod Wilson 		memset(result, 0, 32);
16437647d6ceSJarod Wilson 
16447647d6ceSJarod Wilson 		memcpy(seed, template[i].v, template[i].vlen);
16457647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen, template[i].key,
16467647d6ceSJarod Wilson 		       template[i].klen);
16477647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen + template[i].klen,
16487647d6ceSJarod Wilson 		       template[i].dt, template[i].dtlen);
16497647d6ceSJarod Wilson 
16507647d6ceSJarod Wilson 		err = crypto_rng_reset(tfm, seed, seedsize);
16517647d6ceSJarod Wilson 		if (err) {
16527647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Failed to reset rng "
16537647d6ceSJarod Wilson 			       "for %s\n", algo);
16547647d6ceSJarod Wilson 			goto out;
16557647d6ceSJarod Wilson 		}
16567647d6ceSJarod Wilson 
16577647d6ceSJarod Wilson 		for (j = 0; j < template[i].loops; j++) {
16587647d6ceSJarod Wilson 			err = crypto_rng_get_bytes(tfm, result,
16597647d6ceSJarod Wilson 						   template[i].rlen);
166019e60e13SStephan Mueller 			if (err < 0) {
16617647d6ceSJarod Wilson 				printk(KERN_ERR "alg: cprng: Failed to obtain "
16627647d6ceSJarod Wilson 				       "the correct amount of random data for "
166319e60e13SStephan Mueller 				       "%s (requested %d)\n", algo,
166419e60e13SStephan Mueller 				       template[i].rlen);
16657647d6ceSJarod Wilson 				goto out;
16667647d6ceSJarod Wilson 			}
16677647d6ceSJarod Wilson 		}
16687647d6ceSJarod Wilson 
16697647d6ceSJarod Wilson 		err = memcmp(result, template[i].result,
16707647d6ceSJarod Wilson 			     template[i].rlen);
16717647d6ceSJarod Wilson 		if (err) {
16727647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Test %d failed for %s\n",
16737647d6ceSJarod Wilson 			       i, algo);
16747647d6ceSJarod Wilson 			hexdump(result, template[i].rlen);
16757647d6ceSJarod Wilson 			err = -EINVAL;
16767647d6ceSJarod Wilson 			goto out;
16777647d6ceSJarod Wilson 		}
16787647d6ceSJarod Wilson 	}
16797647d6ceSJarod Wilson 
16807647d6ceSJarod Wilson out:
16817647d6ceSJarod Wilson 	kfree(seed);
16827647d6ceSJarod Wilson 	return err;
16837647d6ceSJarod Wilson }
16847647d6ceSJarod Wilson 
1685da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
1686da7f033dSHerbert Xu 			 u32 type, u32 mask)
1687da7f033dSHerbert Xu {
1688da7f033dSHerbert Xu 	struct crypto_aead *tfm;
1689da7f033dSHerbert Xu 	int err = 0;
1690da7f033dSHerbert Xu 
1691eed93e0cSHerbert Xu 	tfm = crypto_alloc_aead(driver, type, mask);
1692da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1693da7f033dSHerbert Xu 		printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
1694da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1695da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1696da7f033dSHerbert Xu 	}
1697da7f033dSHerbert Xu 
1698da7f033dSHerbert Xu 	if (desc->suite.aead.enc.vecs) {
1699da7f033dSHerbert Xu 		err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
1700da7f033dSHerbert Xu 				desc->suite.aead.enc.count);
1701da7f033dSHerbert Xu 		if (err)
1702da7f033dSHerbert Xu 			goto out;
1703da7f033dSHerbert Xu 	}
1704da7f033dSHerbert Xu 
1705da7f033dSHerbert Xu 	if (!err && desc->suite.aead.dec.vecs)
1706da7f033dSHerbert Xu 		err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
1707da7f033dSHerbert Xu 				desc->suite.aead.dec.count);
1708da7f033dSHerbert Xu 
1709da7f033dSHerbert Xu out:
1710da7f033dSHerbert Xu 	crypto_free_aead(tfm);
1711da7f033dSHerbert Xu 	return err;
1712da7f033dSHerbert Xu }
1713da7f033dSHerbert Xu 
1714da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc,
1715da7f033dSHerbert Xu 			   const char *driver, u32 type, u32 mask)
1716da7f033dSHerbert Xu {
17171aa4ecd9SHerbert Xu 	struct crypto_cipher *tfm;
1718da7f033dSHerbert Xu 	int err = 0;
1719da7f033dSHerbert Xu 
1720eed93e0cSHerbert Xu 	tfm = crypto_alloc_cipher(driver, type, mask);
1721da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1722da7f033dSHerbert Xu 		printk(KERN_ERR "alg: cipher: Failed to load transform for "
1723da7f033dSHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
1724da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1725da7f033dSHerbert Xu 	}
1726da7f033dSHerbert Xu 
1727da7f033dSHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
1728da7f033dSHerbert Xu 		err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1729da7f033dSHerbert Xu 				  desc->suite.cipher.enc.count);
1730da7f033dSHerbert Xu 		if (err)
1731da7f033dSHerbert Xu 			goto out;
1732da7f033dSHerbert Xu 	}
1733da7f033dSHerbert Xu 
1734da7f033dSHerbert Xu 	if (desc->suite.cipher.dec.vecs)
1735da7f033dSHerbert Xu 		err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1736da7f033dSHerbert Xu 				  desc->suite.cipher.dec.count);
1737da7f033dSHerbert Xu 
1738da7f033dSHerbert Xu out:
17391aa4ecd9SHerbert Xu 	crypto_free_cipher(tfm);
17401aa4ecd9SHerbert Xu 	return err;
17411aa4ecd9SHerbert Xu }
17421aa4ecd9SHerbert Xu 
17431aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc,
17441aa4ecd9SHerbert Xu 			     const char *driver, u32 type, u32 mask)
17451aa4ecd9SHerbert Xu {
174612773d93SHerbert Xu 	struct crypto_skcipher *tfm;
17471aa4ecd9SHerbert Xu 	int err = 0;
17481aa4ecd9SHerbert Xu 
1749eed93e0cSHerbert Xu 	tfm = crypto_alloc_skcipher(driver, type, mask);
17501aa4ecd9SHerbert Xu 	if (IS_ERR(tfm)) {
17511aa4ecd9SHerbert Xu 		printk(KERN_ERR "alg: skcipher: Failed to load transform for "
17521aa4ecd9SHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
17531aa4ecd9SHerbert Xu 		return PTR_ERR(tfm);
17541aa4ecd9SHerbert Xu 	}
17551aa4ecd9SHerbert Xu 
17561aa4ecd9SHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
17571aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
17581aa4ecd9SHerbert Xu 				    desc->suite.cipher.enc.count);
17591aa4ecd9SHerbert Xu 		if (err)
17601aa4ecd9SHerbert Xu 			goto out;
17611aa4ecd9SHerbert Xu 	}
17621aa4ecd9SHerbert Xu 
17631aa4ecd9SHerbert Xu 	if (desc->suite.cipher.dec.vecs)
17641aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
17651aa4ecd9SHerbert Xu 				    desc->suite.cipher.dec.count);
17661aa4ecd9SHerbert Xu 
17671aa4ecd9SHerbert Xu out:
176812773d93SHerbert Xu 	crypto_free_skcipher(tfm);
1769da7f033dSHerbert Xu 	return err;
1770da7f033dSHerbert Xu }
1771da7f033dSHerbert Xu 
1772da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
1773da7f033dSHerbert Xu 			 u32 type, u32 mask)
1774da7f033dSHerbert Xu {
1775d7db7a88SGiovanni Cabiddu 	struct crypto_comp *comp;
1776d7db7a88SGiovanni Cabiddu 	struct crypto_acomp *acomp;
1777da7f033dSHerbert Xu 	int err;
1778d7db7a88SGiovanni Cabiddu 	u32 algo_type = type & CRYPTO_ALG_TYPE_ACOMPRESS_MASK;
1779da7f033dSHerbert Xu 
1780d7db7a88SGiovanni Cabiddu 	if (algo_type == CRYPTO_ALG_TYPE_ACOMPRESS) {
1781d7db7a88SGiovanni Cabiddu 		acomp = crypto_alloc_acomp(driver, type, mask);
1782d7db7a88SGiovanni Cabiddu 		if (IS_ERR(acomp)) {
1783d7db7a88SGiovanni Cabiddu 			pr_err("alg: acomp: Failed to load transform for %s: %ld\n",
1784d7db7a88SGiovanni Cabiddu 			       driver, PTR_ERR(acomp));
1785d7db7a88SGiovanni Cabiddu 			return PTR_ERR(acomp);
1786d7db7a88SGiovanni Cabiddu 		}
1787d7db7a88SGiovanni Cabiddu 		err = test_acomp(acomp, desc->suite.comp.comp.vecs,
1788d7db7a88SGiovanni Cabiddu 				 desc->suite.comp.decomp.vecs,
1789d7db7a88SGiovanni Cabiddu 				 desc->suite.comp.comp.count,
1790d7db7a88SGiovanni Cabiddu 				 desc->suite.comp.decomp.count);
1791d7db7a88SGiovanni Cabiddu 		crypto_free_acomp(acomp);
1792d7db7a88SGiovanni Cabiddu 	} else {
1793d7db7a88SGiovanni Cabiddu 		comp = crypto_alloc_comp(driver, type, mask);
1794d7db7a88SGiovanni Cabiddu 		if (IS_ERR(comp)) {
1795d7db7a88SGiovanni Cabiddu 			pr_err("alg: comp: Failed to load transform for %s: %ld\n",
1796d7db7a88SGiovanni Cabiddu 			       driver, PTR_ERR(comp));
1797d7db7a88SGiovanni Cabiddu 			return PTR_ERR(comp);
1798da7f033dSHerbert Xu 		}
1799da7f033dSHerbert Xu 
1800d7db7a88SGiovanni Cabiddu 		err = test_comp(comp, desc->suite.comp.comp.vecs,
1801da7f033dSHerbert Xu 				desc->suite.comp.decomp.vecs,
1802da7f033dSHerbert Xu 				desc->suite.comp.comp.count,
1803da7f033dSHerbert Xu 				desc->suite.comp.decomp.count);
1804da7f033dSHerbert Xu 
1805d7db7a88SGiovanni Cabiddu 		crypto_free_comp(comp);
1806d7db7a88SGiovanni Cabiddu 	}
1807da7f033dSHerbert Xu 	return err;
1808da7f033dSHerbert Xu }
1809da7f033dSHerbert Xu 
1810da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
1811da7f033dSHerbert Xu 			 u32 type, u32 mask)
1812da7f033dSHerbert Xu {
1813da7f033dSHerbert Xu 	struct crypto_ahash *tfm;
1814da7f033dSHerbert Xu 	int err;
1815da7f033dSHerbert Xu 
1816eed93e0cSHerbert Xu 	tfm = crypto_alloc_ahash(driver, type, mask);
1817da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1818da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
1819da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1820da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1821da7f033dSHerbert Xu 	}
1822da7f033dSHerbert Xu 
1823a8f1a052SDavid S. Miller 	err = test_hash(tfm, desc->suite.hash.vecs,
1824a8f1a052SDavid S. Miller 			desc->suite.hash.count, true);
1825a8f1a052SDavid S. Miller 	if (!err)
1826a8f1a052SDavid S. Miller 		err = test_hash(tfm, desc->suite.hash.vecs,
1827a8f1a052SDavid S. Miller 				desc->suite.hash.count, false);
1828da7f033dSHerbert Xu 
1829da7f033dSHerbert Xu 	crypto_free_ahash(tfm);
1830da7f033dSHerbert Xu 	return err;
1831da7f033dSHerbert Xu }
1832da7f033dSHerbert Xu 
18338e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc,
18348e3ee85eSHerbert Xu 			   const char *driver, u32 type, u32 mask)
18358e3ee85eSHerbert Xu {
18368e3ee85eSHerbert Xu 	struct crypto_shash *tfm;
18378e3ee85eSHerbert Xu 	u32 val;
18388e3ee85eSHerbert Xu 	int err;
18398e3ee85eSHerbert Xu 
18408e3ee85eSHerbert Xu 	err = alg_test_hash(desc, driver, type, mask);
18418e3ee85eSHerbert Xu 	if (err)
18428e3ee85eSHerbert Xu 		goto out;
18438e3ee85eSHerbert Xu 
1844eed93e0cSHerbert Xu 	tfm = crypto_alloc_shash(driver, type, mask);
18458e3ee85eSHerbert Xu 	if (IS_ERR(tfm)) {
18468e3ee85eSHerbert Xu 		printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
18478e3ee85eSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
18488e3ee85eSHerbert Xu 		err = PTR_ERR(tfm);
18498e3ee85eSHerbert Xu 		goto out;
18508e3ee85eSHerbert Xu 	}
18518e3ee85eSHerbert Xu 
18528e3ee85eSHerbert Xu 	do {
18534c5c3024SJan-Simon Möller 		SHASH_DESC_ON_STACK(shash, tfm);
18544c5c3024SJan-Simon Möller 		u32 *ctx = (u32 *)shash_desc_ctx(shash);
18558e3ee85eSHerbert Xu 
18564c5c3024SJan-Simon Möller 		shash->tfm = tfm;
18574c5c3024SJan-Simon Möller 		shash->flags = 0;
18588e3ee85eSHerbert Xu 
18594c5c3024SJan-Simon Möller 		*ctx = le32_to_cpu(420553207);
18604c5c3024SJan-Simon Möller 		err = crypto_shash_final(shash, (u8 *)&val);
18618e3ee85eSHerbert Xu 		if (err) {
18628e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Operation failed for "
18638e3ee85eSHerbert Xu 			       "%s: %d\n", driver, err);
18648e3ee85eSHerbert Xu 			break;
18658e3ee85eSHerbert Xu 		}
18668e3ee85eSHerbert Xu 
18678e3ee85eSHerbert Xu 		if (val != ~420553207) {
18688e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Test failed for %s: "
18698e3ee85eSHerbert Xu 			       "%d\n", driver, val);
18708e3ee85eSHerbert Xu 			err = -EINVAL;
18718e3ee85eSHerbert Xu 		}
18728e3ee85eSHerbert Xu 	} while (0);
18738e3ee85eSHerbert Xu 
18748e3ee85eSHerbert Xu 	crypto_free_shash(tfm);
18758e3ee85eSHerbert Xu 
18768e3ee85eSHerbert Xu out:
18778e3ee85eSHerbert Xu 	return err;
18788e3ee85eSHerbert Xu }
18798e3ee85eSHerbert Xu 
18807647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
18817647d6ceSJarod Wilson 			  u32 type, u32 mask)
18827647d6ceSJarod Wilson {
18837647d6ceSJarod Wilson 	struct crypto_rng *rng;
18847647d6ceSJarod Wilson 	int err;
18857647d6ceSJarod Wilson 
1886eed93e0cSHerbert Xu 	rng = crypto_alloc_rng(driver, type, mask);
18877647d6ceSJarod Wilson 	if (IS_ERR(rng)) {
18887647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
18897647d6ceSJarod Wilson 		       "%ld\n", driver, PTR_ERR(rng));
18907647d6ceSJarod Wilson 		return PTR_ERR(rng);
18917647d6ceSJarod Wilson 	}
18927647d6ceSJarod Wilson 
18937647d6ceSJarod Wilson 	err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count);
18947647d6ceSJarod Wilson 
18957647d6ceSJarod Wilson 	crypto_free_rng(rng);
18967647d6ceSJarod Wilson 
18977647d6ceSJarod Wilson 	return err;
18987647d6ceSJarod Wilson }
18997647d6ceSJarod Wilson 
190064d1cdfbSStephan Mueller 
1901b13b1e0cSEric Biggers static int drbg_cavs_test(const struct drbg_testvec *test, int pr,
190264d1cdfbSStephan Mueller 			  const char *driver, u32 type, u32 mask)
190364d1cdfbSStephan Mueller {
190464d1cdfbSStephan Mueller 	int ret = -EAGAIN;
190564d1cdfbSStephan Mueller 	struct crypto_rng *drng;
190664d1cdfbSStephan Mueller 	struct drbg_test_data test_data;
190764d1cdfbSStephan Mueller 	struct drbg_string addtl, pers, testentropy;
190864d1cdfbSStephan Mueller 	unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL);
190964d1cdfbSStephan Mueller 
191064d1cdfbSStephan Mueller 	if (!buf)
191164d1cdfbSStephan Mueller 		return -ENOMEM;
191264d1cdfbSStephan Mueller 
1913eed93e0cSHerbert Xu 	drng = crypto_alloc_rng(driver, type, mask);
191464d1cdfbSStephan Mueller 	if (IS_ERR(drng)) {
191564d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for "
191664d1cdfbSStephan Mueller 		       "%s\n", driver);
191764d1cdfbSStephan Mueller 		kzfree(buf);
191864d1cdfbSStephan Mueller 		return -ENOMEM;
191964d1cdfbSStephan Mueller 	}
192064d1cdfbSStephan Mueller 
192164d1cdfbSStephan Mueller 	test_data.testentropy = &testentropy;
192264d1cdfbSStephan Mueller 	drbg_string_fill(&testentropy, test->entropy, test->entropylen);
192364d1cdfbSStephan Mueller 	drbg_string_fill(&pers, test->pers, test->perslen);
192464d1cdfbSStephan Mueller 	ret = crypto_drbg_reset_test(drng, &pers, &test_data);
192564d1cdfbSStephan Mueller 	if (ret) {
192664d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: Failed to reset rng\n");
192764d1cdfbSStephan Mueller 		goto outbuf;
192864d1cdfbSStephan Mueller 	}
192964d1cdfbSStephan Mueller 
193064d1cdfbSStephan Mueller 	drbg_string_fill(&addtl, test->addtla, test->addtllen);
193164d1cdfbSStephan Mueller 	if (pr) {
193264d1cdfbSStephan Mueller 		drbg_string_fill(&testentropy, test->entpra, test->entprlen);
193364d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl_test(drng,
193464d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl,	&test_data);
193564d1cdfbSStephan Mueller 	} else {
193664d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl(drng,
193764d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl);
193864d1cdfbSStephan Mueller 	}
193919e60e13SStephan Mueller 	if (ret < 0) {
194064d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not obtain random data for "
194164d1cdfbSStephan Mueller 		       "driver %s\n", driver);
194264d1cdfbSStephan Mueller 		goto outbuf;
194364d1cdfbSStephan Mueller 	}
194464d1cdfbSStephan Mueller 
194564d1cdfbSStephan Mueller 	drbg_string_fill(&addtl, test->addtlb, test->addtllen);
194664d1cdfbSStephan Mueller 	if (pr) {
194764d1cdfbSStephan Mueller 		drbg_string_fill(&testentropy, test->entprb, test->entprlen);
194864d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl_test(drng,
194964d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl, &test_data);
195064d1cdfbSStephan Mueller 	} else {
195164d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl(drng,
195264d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl);
195364d1cdfbSStephan Mueller 	}
195419e60e13SStephan Mueller 	if (ret < 0) {
195564d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not obtain random data for "
195664d1cdfbSStephan Mueller 		       "driver %s\n", driver);
195764d1cdfbSStephan Mueller 		goto outbuf;
195864d1cdfbSStephan Mueller 	}
195964d1cdfbSStephan Mueller 
196064d1cdfbSStephan Mueller 	ret = memcmp(test->expected, buf, test->expectedlen);
196164d1cdfbSStephan Mueller 
196264d1cdfbSStephan Mueller outbuf:
196364d1cdfbSStephan Mueller 	crypto_free_rng(drng);
196464d1cdfbSStephan Mueller 	kzfree(buf);
196564d1cdfbSStephan Mueller 	return ret;
196664d1cdfbSStephan Mueller }
196764d1cdfbSStephan Mueller 
196864d1cdfbSStephan Mueller 
196964d1cdfbSStephan Mueller static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver,
197064d1cdfbSStephan Mueller 			 u32 type, u32 mask)
197164d1cdfbSStephan Mueller {
197264d1cdfbSStephan Mueller 	int err = 0;
197364d1cdfbSStephan Mueller 	int pr = 0;
197464d1cdfbSStephan Mueller 	int i = 0;
1975b13b1e0cSEric Biggers 	const struct drbg_testvec *template = desc->suite.drbg.vecs;
197664d1cdfbSStephan Mueller 	unsigned int tcount = desc->suite.drbg.count;
197764d1cdfbSStephan Mueller 
197864d1cdfbSStephan Mueller 	if (0 == memcmp(driver, "drbg_pr_", 8))
197964d1cdfbSStephan Mueller 		pr = 1;
198064d1cdfbSStephan Mueller 
198164d1cdfbSStephan Mueller 	for (i = 0; i < tcount; i++) {
198264d1cdfbSStephan Mueller 		err = drbg_cavs_test(&template[i], pr, driver, type, mask);
198364d1cdfbSStephan Mueller 		if (err) {
198464d1cdfbSStephan Mueller 			printk(KERN_ERR "alg: drbg: Test %d failed for %s\n",
198564d1cdfbSStephan Mueller 			       i, driver);
198664d1cdfbSStephan Mueller 			err = -EINVAL;
198764d1cdfbSStephan Mueller 			break;
198864d1cdfbSStephan Mueller 		}
198964d1cdfbSStephan Mueller 	}
199064d1cdfbSStephan Mueller 	return err;
199164d1cdfbSStephan Mueller 
199264d1cdfbSStephan Mueller }
199364d1cdfbSStephan Mueller 
1994b13b1e0cSEric Biggers static int do_test_kpp(struct crypto_kpp *tfm, const struct kpp_testvec *vec,
1995802c7f1cSSalvatore Benedetto 		       const char *alg)
1996802c7f1cSSalvatore Benedetto {
1997802c7f1cSSalvatore Benedetto 	struct kpp_request *req;
1998802c7f1cSSalvatore Benedetto 	void *input_buf = NULL;
1999802c7f1cSSalvatore Benedetto 	void *output_buf = NULL;
2000802c7f1cSSalvatore Benedetto 	struct tcrypt_result result;
2001802c7f1cSSalvatore Benedetto 	unsigned int out_len_max;
2002802c7f1cSSalvatore Benedetto 	int err = -ENOMEM;
2003802c7f1cSSalvatore Benedetto 	struct scatterlist src, dst;
2004802c7f1cSSalvatore Benedetto 
2005802c7f1cSSalvatore Benedetto 	req = kpp_request_alloc(tfm, GFP_KERNEL);
2006802c7f1cSSalvatore Benedetto 	if (!req)
2007802c7f1cSSalvatore Benedetto 		return err;
2008802c7f1cSSalvatore Benedetto 
2009802c7f1cSSalvatore Benedetto 	init_completion(&result.completion);
2010802c7f1cSSalvatore Benedetto 
2011802c7f1cSSalvatore Benedetto 	err = crypto_kpp_set_secret(tfm, vec->secret, vec->secret_size);
2012802c7f1cSSalvatore Benedetto 	if (err < 0)
2013802c7f1cSSalvatore Benedetto 		goto free_req;
2014802c7f1cSSalvatore Benedetto 
2015802c7f1cSSalvatore Benedetto 	out_len_max = crypto_kpp_maxsize(tfm);
2016802c7f1cSSalvatore Benedetto 	output_buf = kzalloc(out_len_max, GFP_KERNEL);
2017802c7f1cSSalvatore Benedetto 	if (!output_buf) {
2018802c7f1cSSalvatore Benedetto 		err = -ENOMEM;
2019802c7f1cSSalvatore Benedetto 		goto free_req;
2020802c7f1cSSalvatore Benedetto 	}
2021802c7f1cSSalvatore Benedetto 
2022802c7f1cSSalvatore Benedetto 	/* Use appropriate parameter as base */
2023802c7f1cSSalvatore Benedetto 	kpp_request_set_input(req, NULL, 0);
2024802c7f1cSSalvatore Benedetto 	sg_init_one(&dst, output_buf, out_len_max);
2025802c7f1cSSalvatore Benedetto 	kpp_request_set_output(req, &dst, out_len_max);
2026802c7f1cSSalvatore Benedetto 	kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
2027802c7f1cSSalvatore Benedetto 				 tcrypt_complete, &result);
2028802c7f1cSSalvatore Benedetto 
2029802c7f1cSSalvatore Benedetto 	/* Compute public key */
2030802c7f1cSSalvatore Benedetto 	err = wait_async_op(&result, crypto_kpp_generate_public_key(req));
2031802c7f1cSSalvatore Benedetto 	if (err) {
2032802c7f1cSSalvatore Benedetto 		pr_err("alg: %s: generate public key test failed. err %d\n",
2033802c7f1cSSalvatore Benedetto 		       alg, err);
2034802c7f1cSSalvatore Benedetto 		goto free_output;
2035802c7f1cSSalvatore Benedetto 	}
2036802c7f1cSSalvatore Benedetto 	/* Verify calculated public key */
2037802c7f1cSSalvatore Benedetto 	if (memcmp(vec->expected_a_public, sg_virt(req->dst),
2038802c7f1cSSalvatore Benedetto 		   vec->expected_a_public_size)) {
2039802c7f1cSSalvatore Benedetto 		pr_err("alg: %s: generate public key test failed. Invalid output\n",
2040802c7f1cSSalvatore Benedetto 		       alg);
2041802c7f1cSSalvatore Benedetto 		err = -EINVAL;
2042802c7f1cSSalvatore Benedetto 		goto free_output;
2043802c7f1cSSalvatore Benedetto 	}
2044802c7f1cSSalvatore Benedetto 
2045802c7f1cSSalvatore Benedetto 	/* Calculate shared secret key by using counter part (b) public key. */
2046802c7f1cSSalvatore Benedetto 	input_buf = kzalloc(vec->b_public_size, GFP_KERNEL);
2047802c7f1cSSalvatore Benedetto 	if (!input_buf) {
2048802c7f1cSSalvatore Benedetto 		err = -ENOMEM;
2049802c7f1cSSalvatore Benedetto 		goto free_output;
2050802c7f1cSSalvatore Benedetto 	}
2051802c7f1cSSalvatore Benedetto 
2052802c7f1cSSalvatore Benedetto 	memcpy(input_buf, vec->b_public, vec->b_public_size);
2053802c7f1cSSalvatore Benedetto 	sg_init_one(&src, input_buf, vec->b_public_size);
2054802c7f1cSSalvatore Benedetto 	sg_init_one(&dst, output_buf, out_len_max);
2055802c7f1cSSalvatore Benedetto 	kpp_request_set_input(req, &src, vec->b_public_size);
2056802c7f1cSSalvatore Benedetto 	kpp_request_set_output(req, &dst, out_len_max);
2057802c7f1cSSalvatore Benedetto 	kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
2058802c7f1cSSalvatore Benedetto 				 tcrypt_complete, &result);
2059802c7f1cSSalvatore Benedetto 	err = wait_async_op(&result, crypto_kpp_compute_shared_secret(req));
2060802c7f1cSSalvatore Benedetto 	if (err) {
2061802c7f1cSSalvatore Benedetto 		pr_err("alg: %s: compute shard secret test failed. err %d\n",
2062802c7f1cSSalvatore Benedetto 		       alg, err);
2063802c7f1cSSalvatore Benedetto 		goto free_all;
2064802c7f1cSSalvatore Benedetto 	}
2065802c7f1cSSalvatore Benedetto 	/*
2066802c7f1cSSalvatore Benedetto 	 * verify shared secret from which the user will derive
2067802c7f1cSSalvatore Benedetto 	 * secret key by executing whatever hash it has chosen
2068802c7f1cSSalvatore Benedetto 	 */
2069802c7f1cSSalvatore Benedetto 	if (memcmp(vec->expected_ss, sg_virt(req->dst),
2070802c7f1cSSalvatore Benedetto 		   vec->expected_ss_size)) {
2071802c7f1cSSalvatore Benedetto 		pr_err("alg: %s: compute shared secret test failed. Invalid output\n",
2072802c7f1cSSalvatore Benedetto 		       alg);
2073802c7f1cSSalvatore Benedetto 		err = -EINVAL;
2074802c7f1cSSalvatore Benedetto 	}
2075802c7f1cSSalvatore Benedetto 
2076802c7f1cSSalvatore Benedetto free_all:
2077802c7f1cSSalvatore Benedetto 	kfree(input_buf);
2078802c7f1cSSalvatore Benedetto free_output:
2079802c7f1cSSalvatore Benedetto 	kfree(output_buf);
2080802c7f1cSSalvatore Benedetto free_req:
2081802c7f1cSSalvatore Benedetto 	kpp_request_free(req);
2082802c7f1cSSalvatore Benedetto 	return err;
2083802c7f1cSSalvatore Benedetto }
2084802c7f1cSSalvatore Benedetto 
2085802c7f1cSSalvatore Benedetto static int test_kpp(struct crypto_kpp *tfm, const char *alg,
2086b13b1e0cSEric Biggers 		    const struct kpp_testvec *vecs, unsigned int tcount)
2087802c7f1cSSalvatore Benedetto {
2088802c7f1cSSalvatore Benedetto 	int ret, i;
2089802c7f1cSSalvatore Benedetto 
2090802c7f1cSSalvatore Benedetto 	for (i = 0; i < tcount; i++) {
2091802c7f1cSSalvatore Benedetto 		ret = do_test_kpp(tfm, vecs++, alg);
2092802c7f1cSSalvatore Benedetto 		if (ret) {
2093802c7f1cSSalvatore Benedetto 			pr_err("alg: %s: test failed on vector %d, err=%d\n",
2094802c7f1cSSalvatore Benedetto 			       alg, i + 1, ret);
2095802c7f1cSSalvatore Benedetto 			return ret;
2096802c7f1cSSalvatore Benedetto 		}
2097802c7f1cSSalvatore Benedetto 	}
2098802c7f1cSSalvatore Benedetto 	return 0;
2099802c7f1cSSalvatore Benedetto }
2100802c7f1cSSalvatore Benedetto 
2101802c7f1cSSalvatore Benedetto static int alg_test_kpp(const struct alg_test_desc *desc, const char *driver,
2102802c7f1cSSalvatore Benedetto 			u32 type, u32 mask)
2103802c7f1cSSalvatore Benedetto {
2104802c7f1cSSalvatore Benedetto 	struct crypto_kpp *tfm;
2105802c7f1cSSalvatore Benedetto 	int err = 0;
2106802c7f1cSSalvatore Benedetto 
2107eed93e0cSHerbert Xu 	tfm = crypto_alloc_kpp(driver, type, mask);
2108802c7f1cSSalvatore Benedetto 	if (IS_ERR(tfm)) {
2109802c7f1cSSalvatore Benedetto 		pr_err("alg: kpp: Failed to load tfm for %s: %ld\n",
2110802c7f1cSSalvatore Benedetto 		       driver, PTR_ERR(tfm));
2111802c7f1cSSalvatore Benedetto 		return PTR_ERR(tfm);
2112802c7f1cSSalvatore Benedetto 	}
2113802c7f1cSSalvatore Benedetto 	if (desc->suite.kpp.vecs)
2114802c7f1cSSalvatore Benedetto 		err = test_kpp(tfm, desc->alg, desc->suite.kpp.vecs,
2115802c7f1cSSalvatore Benedetto 			       desc->suite.kpp.count);
2116802c7f1cSSalvatore Benedetto 
2117802c7f1cSSalvatore Benedetto 	crypto_free_kpp(tfm);
2118802c7f1cSSalvatore Benedetto 	return err;
2119802c7f1cSSalvatore Benedetto }
2120802c7f1cSSalvatore Benedetto 
212150d2b643SHerbert Xu static int test_akcipher_one(struct crypto_akcipher *tfm,
2122b13b1e0cSEric Biggers 			     const struct akcipher_testvec *vecs)
2123946cc463STadeusz Struk {
2124df27b26fSHerbert Xu 	char *xbuf[XBUFSIZE];
2125946cc463STadeusz Struk 	struct akcipher_request *req;
2126946cc463STadeusz Struk 	void *outbuf_enc = NULL;
2127946cc463STadeusz Struk 	void *outbuf_dec = NULL;
2128946cc463STadeusz Struk 	struct tcrypt_result result;
2129946cc463STadeusz Struk 	unsigned int out_len_max, out_len = 0;
2130946cc463STadeusz Struk 	int err = -ENOMEM;
213122287b0bSTadeusz Struk 	struct scatterlist src, dst, src_tab[2];
2132946cc463STadeusz Struk 
2133df27b26fSHerbert Xu 	if (testmgr_alloc_buf(xbuf))
2134df27b26fSHerbert Xu 		return err;
2135df27b26fSHerbert Xu 
2136946cc463STadeusz Struk 	req = akcipher_request_alloc(tfm, GFP_KERNEL);
2137946cc463STadeusz Struk 	if (!req)
2138df27b26fSHerbert Xu 		goto free_xbuf;
2139946cc463STadeusz Struk 
2140946cc463STadeusz Struk 	init_completion(&result.completion);
214122287b0bSTadeusz Struk 
214222287b0bSTadeusz Struk 	if (vecs->public_key_vec)
214322287b0bSTadeusz Struk 		err = crypto_akcipher_set_pub_key(tfm, vecs->key,
214422287b0bSTadeusz Struk 						  vecs->key_len);
214522287b0bSTadeusz Struk 	else
214622287b0bSTadeusz Struk 		err = crypto_akcipher_set_priv_key(tfm, vecs->key,
214722287b0bSTadeusz Struk 						   vecs->key_len);
2148946cc463STadeusz Struk 	if (err)
2149946cc463STadeusz Struk 		goto free_req;
2150946cc463STadeusz Struk 
215157763f5eSSalvatore Benedetto 	err = -ENOMEM;
215222287b0bSTadeusz Struk 	out_len_max = crypto_akcipher_maxsize(tfm);
2153946cc463STadeusz Struk 	outbuf_enc = kzalloc(out_len_max, GFP_KERNEL);
2154946cc463STadeusz Struk 	if (!outbuf_enc)
2155946cc463STadeusz Struk 		goto free_req;
2156946cc463STadeusz Struk 
2157df27b26fSHerbert Xu 	if (WARN_ON(vecs->m_size > PAGE_SIZE))
2158df27b26fSHerbert Xu 		goto free_all;
2159df27b26fSHerbert Xu 
2160df27b26fSHerbert Xu 	memcpy(xbuf[0], vecs->m, vecs->m_size);
2161df27b26fSHerbert Xu 
216222287b0bSTadeusz Struk 	sg_init_table(src_tab, 2);
2163df27b26fSHerbert Xu 	sg_set_buf(&src_tab[0], xbuf[0], 8);
2164df27b26fSHerbert Xu 	sg_set_buf(&src_tab[1], xbuf[0] + 8, vecs->m_size - 8);
216522287b0bSTadeusz Struk 	sg_init_one(&dst, outbuf_enc, out_len_max);
216622287b0bSTadeusz Struk 	akcipher_request_set_crypt(req, src_tab, &dst, vecs->m_size,
216722287b0bSTadeusz Struk 				   out_len_max);
2168946cc463STadeusz Struk 	akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
2169946cc463STadeusz Struk 				      tcrypt_complete, &result);
2170946cc463STadeusz Struk 
2171946cc463STadeusz Struk 	/* Run RSA encrypt - c = m^e mod n;*/
2172946cc463STadeusz Struk 	err = wait_async_op(&result, crypto_akcipher_encrypt(req));
2173946cc463STadeusz Struk 	if (err) {
217450d2b643SHerbert Xu 		pr_err("alg: akcipher: encrypt test failed. err %d\n", err);
2175946cc463STadeusz Struk 		goto free_all;
2176946cc463STadeusz Struk 	}
217722287b0bSTadeusz Struk 	if (req->dst_len != vecs->c_size) {
217850d2b643SHerbert Xu 		pr_err("alg: akcipher: encrypt test failed. Invalid output len\n");
2179946cc463STadeusz Struk 		err = -EINVAL;
2180946cc463STadeusz Struk 		goto free_all;
2181946cc463STadeusz Struk 	}
2182946cc463STadeusz Struk 	/* verify that encrypted message is equal to expected */
2183df27b26fSHerbert Xu 	if (memcmp(vecs->c, outbuf_enc, vecs->c_size)) {
218450d2b643SHerbert Xu 		pr_err("alg: akcipher: encrypt test failed. Invalid output\n");
218550d2b643SHerbert Xu 		hexdump(outbuf_enc, vecs->c_size);
2186946cc463STadeusz Struk 		err = -EINVAL;
2187946cc463STadeusz Struk 		goto free_all;
2188946cc463STadeusz Struk 	}
2189946cc463STadeusz Struk 	/* Don't invoke decrypt for vectors with public key */
2190946cc463STadeusz Struk 	if (vecs->public_key_vec) {
2191946cc463STadeusz Struk 		err = 0;
2192946cc463STadeusz Struk 		goto free_all;
2193946cc463STadeusz Struk 	}
2194946cc463STadeusz Struk 	outbuf_dec = kzalloc(out_len_max, GFP_KERNEL);
2195946cc463STadeusz Struk 	if (!outbuf_dec) {
2196946cc463STadeusz Struk 		err = -ENOMEM;
2197946cc463STadeusz Struk 		goto free_all;
2198946cc463STadeusz Struk 	}
2199df27b26fSHerbert Xu 
2200df27b26fSHerbert Xu 	if (WARN_ON(vecs->c_size > PAGE_SIZE))
2201df27b26fSHerbert Xu 		goto free_all;
2202df27b26fSHerbert Xu 
2203df27b26fSHerbert Xu 	memcpy(xbuf[0], vecs->c, vecs->c_size);
2204df27b26fSHerbert Xu 
2205df27b26fSHerbert Xu 	sg_init_one(&src, xbuf[0], vecs->c_size);
220622287b0bSTadeusz Struk 	sg_init_one(&dst, outbuf_dec, out_len_max);
2207946cc463STadeusz Struk 	init_completion(&result.completion);
220822287b0bSTadeusz Struk 	akcipher_request_set_crypt(req, &src, &dst, vecs->c_size, out_len_max);
2209946cc463STadeusz Struk 
2210946cc463STadeusz Struk 	/* Run RSA decrypt - m = c^d mod n;*/
2211946cc463STadeusz Struk 	err = wait_async_op(&result, crypto_akcipher_decrypt(req));
2212946cc463STadeusz Struk 	if (err) {
221350d2b643SHerbert Xu 		pr_err("alg: akcipher: decrypt test failed. err %d\n", err);
2214946cc463STadeusz Struk 		goto free_all;
2215946cc463STadeusz Struk 	}
2216946cc463STadeusz Struk 	out_len = req->dst_len;
221750d2b643SHerbert Xu 	if (out_len < vecs->m_size) {
221850d2b643SHerbert Xu 		pr_err("alg: akcipher: decrypt test failed. "
221950d2b643SHerbert Xu 		       "Invalid output len %u\n", out_len);
2220946cc463STadeusz Struk 		err = -EINVAL;
2221946cc463STadeusz Struk 		goto free_all;
2222946cc463STadeusz Struk 	}
2223946cc463STadeusz Struk 	/* verify that decrypted message is equal to the original msg */
222450d2b643SHerbert Xu 	if (memchr_inv(outbuf_dec, 0, out_len - vecs->m_size) ||
222550d2b643SHerbert Xu 	    memcmp(vecs->m, outbuf_dec + out_len - vecs->m_size,
222650d2b643SHerbert Xu 		   vecs->m_size)) {
222750d2b643SHerbert Xu 		pr_err("alg: akcipher: decrypt test failed. Invalid output\n");
222850d2b643SHerbert Xu 		hexdump(outbuf_dec, out_len);
2229946cc463STadeusz Struk 		err = -EINVAL;
2230946cc463STadeusz Struk 	}
2231946cc463STadeusz Struk free_all:
2232946cc463STadeusz Struk 	kfree(outbuf_dec);
2233946cc463STadeusz Struk 	kfree(outbuf_enc);
2234946cc463STadeusz Struk free_req:
2235946cc463STadeusz Struk 	akcipher_request_free(req);
2236df27b26fSHerbert Xu free_xbuf:
2237df27b26fSHerbert Xu 	testmgr_free_buf(xbuf);
2238946cc463STadeusz Struk 	return err;
2239946cc463STadeusz Struk }
2240946cc463STadeusz Struk 
224150d2b643SHerbert Xu static int test_akcipher(struct crypto_akcipher *tfm, const char *alg,
2242b13b1e0cSEric Biggers 			 const struct akcipher_testvec *vecs,
2243b13b1e0cSEric Biggers 			 unsigned int tcount)
2244946cc463STadeusz Struk {
224515226e48SHerbert Xu 	const char *algo =
224615226e48SHerbert Xu 		crypto_tfm_alg_driver_name(crypto_akcipher_tfm(tfm));
2247946cc463STadeusz Struk 	int ret, i;
2248946cc463STadeusz Struk 
2249946cc463STadeusz Struk 	for (i = 0; i < tcount; i++) {
225050d2b643SHerbert Xu 		ret = test_akcipher_one(tfm, vecs++);
225150d2b643SHerbert Xu 		if (!ret)
225250d2b643SHerbert Xu 			continue;
225350d2b643SHerbert Xu 
225415226e48SHerbert Xu 		pr_err("alg: akcipher: test %d failed for %s, err=%d\n",
225515226e48SHerbert Xu 		       i + 1, algo, ret);
2256946cc463STadeusz Struk 		return ret;
2257946cc463STadeusz Struk 	}
2258946cc463STadeusz Struk 	return 0;
2259946cc463STadeusz Struk }
2260946cc463STadeusz Struk 
2261946cc463STadeusz Struk static int alg_test_akcipher(const struct alg_test_desc *desc,
2262946cc463STadeusz Struk 			     const char *driver, u32 type, u32 mask)
2263946cc463STadeusz Struk {
2264946cc463STadeusz Struk 	struct crypto_akcipher *tfm;
2265946cc463STadeusz Struk 	int err = 0;
2266946cc463STadeusz Struk 
2267eed93e0cSHerbert Xu 	tfm = crypto_alloc_akcipher(driver, type, mask);
2268946cc463STadeusz Struk 	if (IS_ERR(tfm)) {
2269946cc463STadeusz Struk 		pr_err("alg: akcipher: Failed to load tfm for %s: %ld\n",
2270946cc463STadeusz Struk 		       driver, PTR_ERR(tfm));
2271946cc463STadeusz Struk 		return PTR_ERR(tfm);
2272946cc463STadeusz Struk 	}
2273946cc463STadeusz Struk 	if (desc->suite.akcipher.vecs)
2274946cc463STadeusz Struk 		err = test_akcipher(tfm, desc->alg, desc->suite.akcipher.vecs,
2275946cc463STadeusz Struk 				    desc->suite.akcipher.count);
2276946cc463STadeusz Struk 
2277946cc463STadeusz Struk 	crypto_free_akcipher(tfm);
2278946cc463STadeusz Struk 	return err;
2279946cc463STadeusz Struk }
2280946cc463STadeusz Struk 
2281863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc,
2282863b557aSYouquan, Song 			     const char *driver, u32 type, u32 mask)
2283863b557aSYouquan, Song {
2284863b557aSYouquan, Song 	return 0;
2285863b557aSYouquan, Song }
2286863b557aSYouquan, Song 
228721c8e720SArd Biesheuvel #define __VECS(tv)	{ .vecs = tv, .count = ARRAY_SIZE(tv) }
228821c8e720SArd Biesheuvel 
2289da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */
2290da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = {
2291da7f033dSHerbert Xu 	{
2292e08ca2daSJarod Wilson 		.alg = "ansi_cprng",
2293e08ca2daSJarod Wilson 		.test = alg_test_cprng,
2294e08ca2daSJarod Wilson 		.suite = {
229521c8e720SArd Biesheuvel 			.cprng = __VECS(ansi_cprng_aes_tv_template)
2296e08ca2daSJarod Wilson 		}
2297e08ca2daSJarod Wilson 	}, {
2298bca4feb0SHoria Geanta 		.alg = "authenc(hmac(md5),ecb(cipher_null))",
2299bca4feb0SHoria Geanta 		.test = alg_test_aead,
2300bca4feb0SHoria Geanta 		.suite = {
2301bca4feb0SHoria Geanta 			.aead = {
230221c8e720SArd Biesheuvel 				.enc = __VECS(hmac_md5_ecb_cipher_null_enc_tv_template),
230321c8e720SArd Biesheuvel 				.dec = __VECS(hmac_md5_ecb_cipher_null_dec_tv_template)
2304bca4feb0SHoria Geanta 			}
2305bca4feb0SHoria Geanta 		}
2306bca4feb0SHoria Geanta 	}, {
2307a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha1),cbc(aes))",
2308e46e9a46SHoria Geanta 		.test = alg_test_aead,
2309e46e9a46SHoria Geanta 		.suite = {
2310e46e9a46SHoria Geanta 			.aead = {
231121c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha1_aes_cbc_enc_tv_temp)
23125208ed2cSNitesh Lal 			}
23135208ed2cSNitesh Lal 		}
23145208ed2cSNitesh Lal 	}, {
2315a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha1),cbc(des))",
23165208ed2cSNitesh Lal 		.test = alg_test_aead,
23175208ed2cSNitesh Lal 		.suite = {
23185208ed2cSNitesh Lal 			.aead = {
231921c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha1_des_cbc_enc_tv_temp)
23205208ed2cSNitesh Lal 			}
23215208ed2cSNitesh Lal 		}
23225208ed2cSNitesh Lal 	}, {
2323a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha1),cbc(des3_ede))",
23245208ed2cSNitesh Lal 		.test = alg_test_aead,
2325ed1afac9SMarcus Meissner 		.fips_allowed = 1,
23265208ed2cSNitesh Lal 		.suite = {
23275208ed2cSNitesh Lal 			.aead = {
232821c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha1_des3_ede_cbc_enc_tv_temp)
2329e46e9a46SHoria Geanta 			}
2330e46e9a46SHoria Geanta 		}
2331e46e9a46SHoria Geanta 	}, {
2332fb16abc2SMarcus Meissner 		.alg = "authenc(hmac(sha1),ctr(aes))",
2333fb16abc2SMarcus Meissner 		.test = alg_test_null,
2334fb16abc2SMarcus Meissner 		.fips_allowed = 1,
2335fb16abc2SMarcus Meissner 	}, {
2336bca4feb0SHoria Geanta 		.alg = "authenc(hmac(sha1),ecb(cipher_null))",
2337bca4feb0SHoria Geanta 		.test = alg_test_aead,
2338bca4feb0SHoria Geanta 		.suite = {
2339bca4feb0SHoria Geanta 			.aead = {
234021c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha1_ecb_cipher_null_enc_tv_temp),
234121c8e720SArd Biesheuvel 				.dec = __VECS(hmac_sha1_ecb_cipher_null_dec_tv_temp)
23425208ed2cSNitesh Lal 			}
23435208ed2cSNitesh Lal 		}
23445208ed2cSNitesh Lal 	}, {
23458888690eSMarcus Meissner 		.alg = "authenc(hmac(sha1),rfc3686(ctr(aes)))",
23468888690eSMarcus Meissner 		.test = alg_test_null,
23478888690eSMarcus Meissner 		.fips_allowed = 1,
23488888690eSMarcus Meissner 	}, {
2349a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha224),cbc(des))",
23505208ed2cSNitesh Lal 		.test = alg_test_aead,
23515208ed2cSNitesh Lal 		.suite = {
23525208ed2cSNitesh Lal 			.aead = {
235321c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha224_des_cbc_enc_tv_temp)
23545208ed2cSNitesh Lal 			}
23555208ed2cSNitesh Lal 		}
23565208ed2cSNitesh Lal 	}, {
2357a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha224),cbc(des3_ede))",
23585208ed2cSNitesh Lal 		.test = alg_test_aead,
2359ed1afac9SMarcus Meissner 		.fips_allowed = 1,
23605208ed2cSNitesh Lal 		.suite = {
23615208ed2cSNitesh Lal 			.aead = {
236221c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha224_des3_ede_cbc_enc_tv_temp)
2363bca4feb0SHoria Geanta 			}
2364bca4feb0SHoria Geanta 		}
2365bca4feb0SHoria Geanta 	}, {
2366a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha256),cbc(aes))",
2367e46e9a46SHoria Geanta 		.test = alg_test_aead,
2368ed1afac9SMarcus Meissner 		.fips_allowed = 1,
2369e46e9a46SHoria Geanta 		.suite = {
2370e46e9a46SHoria Geanta 			.aead = {
237121c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha256_aes_cbc_enc_tv_temp)
23725208ed2cSNitesh Lal 			}
23735208ed2cSNitesh Lal 		}
23745208ed2cSNitesh Lal 	}, {
2375a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha256),cbc(des))",
23765208ed2cSNitesh Lal 		.test = alg_test_aead,
23775208ed2cSNitesh Lal 		.suite = {
23785208ed2cSNitesh Lal 			.aead = {
237921c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha256_des_cbc_enc_tv_temp)
23805208ed2cSNitesh Lal 			}
23815208ed2cSNitesh Lal 		}
23825208ed2cSNitesh Lal 	}, {
2383a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha256),cbc(des3_ede))",
23845208ed2cSNitesh Lal 		.test = alg_test_aead,
2385ed1afac9SMarcus Meissner 		.fips_allowed = 1,
23865208ed2cSNitesh Lal 		.suite = {
23875208ed2cSNitesh Lal 			.aead = {
238821c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha256_des3_ede_cbc_enc_tv_temp)
23895208ed2cSNitesh Lal 			}
23905208ed2cSNitesh Lal 		}
23915208ed2cSNitesh Lal 	}, {
2392fb16abc2SMarcus Meissner 		.alg = "authenc(hmac(sha256),ctr(aes))",
2393fb16abc2SMarcus Meissner 		.test = alg_test_null,
2394fb16abc2SMarcus Meissner 		.fips_allowed = 1,
2395fb16abc2SMarcus Meissner 	}, {
23968888690eSMarcus Meissner 		.alg = "authenc(hmac(sha256),rfc3686(ctr(aes)))",
23978888690eSMarcus Meissner 		.test = alg_test_null,
23988888690eSMarcus Meissner 		.fips_allowed = 1,
23998888690eSMarcus Meissner 	}, {
2400a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha384),cbc(des))",
24015208ed2cSNitesh Lal 		.test = alg_test_aead,
24025208ed2cSNitesh Lal 		.suite = {
24035208ed2cSNitesh Lal 			.aead = {
240421c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha384_des_cbc_enc_tv_temp)
24055208ed2cSNitesh Lal 			}
24065208ed2cSNitesh Lal 		}
24075208ed2cSNitesh Lal 	}, {
2408a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha384),cbc(des3_ede))",
24095208ed2cSNitesh Lal 		.test = alg_test_aead,
2410ed1afac9SMarcus Meissner 		.fips_allowed = 1,
24115208ed2cSNitesh Lal 		.suite = {
24125208ed2cSNitesh Lal 			.aead = {
241321c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha384_des3_ede_cbc_enc_tv_temp)
2414e46e9a46SHoria Geanta 			}
2415e46e9a46SHoria Geanta 		}
2416e46e9a46SHoria Geanta 	}, {
2417fb16abc2SMarcus Meissner 		.alg = "authenc(hmac(sha384),ctr(aes))",
2418fb16abc2SMarcus Meissner 		.test = alg_test_null,
2419fb16abc2SMarcus Meissner 		.fips_allowed = 1,
2420fb16abc2SMarcus Meissner 	}, {
24218888690eSMarcus Meissner 		.alg = "authenc(hmac(sha384),rfc3686(ctr(aes)))",
24228888690eSMarcus Meissner 		.test = alg_test_null,
24238888690eSMarcus Meissner 		.fips_allowed = 1,
24248888690eSMarcus Meissner 	}, {
2425a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha512),cbc(aes))",
2426ed1afac9SMarcus Meissner 		.fips_allowed = 1,
2427e46e9a46SHoria Geanta 		.test = alg_test_aead,
2428e46e9a46SHoria Geanta 		.suite = {
2429e46e9a46SHoria Geanta 			.aead = {
243021c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha512_aes_cbc_enc_tv_temp)
24315208ed2cSNitesh Lal 			}
24325208ed2cSNitesh Lal 		}
24335208ed2cSNitesh Lal 	}, {
2434a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha512),cbc(des))",
24355208ed2cSNitesh Lal 		.test = alg_test_aead,
24365208ed2cSNitesh Lal 		.suite = {
24375208ed2cSNitesh Lal 			.aead = {
243821c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha512_des_cbc_enc_tv_temp)
24395208ed2cSNitesh Lal 			}
24405208ed2cSNitesh Lal 		}
24415208ed2cSNitesh Lal 	}, {
2442a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha512),cbc(des3_ede))",
24435208ed2cSNitesh Lal 		.test = alg_test_aead,
2444ed1afac9SMarcus Meissner 		.fips_allowed = 1,
24455208ed2cSNitesh Lal 		.suite = {
24465208ed2cSNitesh Lal 			.aead = {
244721c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha512_des3_ede_cbc_enc_tv_temp)
2448e46e9a46SHoria Geanta 			}
2449e46e9a46SHoria Geanta 		}
2450e46e9a46SHoria Geanta 	}, {
2451fb16abc2SMarcus Meissner 		.alg = "authenc(hmac(sha512),ctr(aes))",
2452fb16abc2SMarcus Meissner 		.test = alg_test_null,
2453fb16abc2SMarcus Meissner 		.fips_allowed = 1,
2454fb16abc2SMarcus Meissner 	}, {
24558888690eSMarcus Meissner 		.alg = "authenc(hmac(sha512),rfc3686(ctr(aes)))",
24568888690eSMarcus Meissner 		.test = alg_test_null,
24578888690eSMarcus Meissner 		.fips_allowed = 1,
24588888690eSMarcus Meissner 	}, {
2459da7f033dSHerbert Xu 		.alg = "cbc(aes)",
24601aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2461a1915d51SJarod Wilson 		.fips_allowed = 1,
2462da7f033dSHerbert Xu 		.suite = {
2463da7f033dSHerbert Xu 			.cipher = {
246421c8e720SArd Biesheuvel 				.enc = __VECS(aes_cbc_enc_tv_template),
246521c8e720SArd Biesheuvel 				.dec = __VECS(aes_cbc_dec_tv_template)
2466da7f033dSHerbert Xu 			}
2467da7f033dSHerbert Xu 		}
2468da7f033dSHerbert Xu 	}, {
2469da7f033dSHerbert Xu 		.alg = "cbc(anubis)",
24701aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2471da7f033dSHerbert Xu 		.suite = {
2472da7f033dSHerbert Xu 			.cipher = {
247321c8e720SArd Biesheuvel 				.enc = __VECS(anubis_cbc_enc_tv_template),
247421c8e720SArd Biesheuvel 				.dec = __VECS(anubis_cbc_dec_tv_template)
2475da7f033dSHerbert Xu 			}
2476da7f033dSHerbert Xu 		}
2477da7f033dSHerbert Xu 	}, {
2478da7f033dSHerbert Xu 		.alg = "cbc(blowfish)",
24791aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2480da7f033dSHerbert Xu 		.suite = {
2481da7f033dSHerbert Xu 			.cipher = {
248221c8e720SArd Biesheuvel 				.enc = __VECS(bf_cbc_enc_tv_template),
248321c8e720SArd Biesheuvel 				.dec = __VECS(bf_cbc_dec_tv_template)
2484da7f033dSHerbert Xu 			}
2485da7f033dSHerbert Xu 		}
2486da7f033dSHerbert Xu 	}, {
2487da7f033dSHerbert Xu 		.alg = "cbc(camellia)",
24881aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2489da7f033dSHerbert Xu 		.suite = {
2490da7f033dSHerbert Xu 			.cipher = {
249121c8e720SArd Biesheuvel 				.enc = __VECS(camellia_cbc_enc_tv_template),
249221c8e720SArd Biesheuvel 				.dec = __VECS(camellia_cbc_dec_tv_template)
2493da7f033dSHerbert Xu 			}
2494da7f033dSHerbert Xu 		}
2495da7f033dSHerbert Xu 	}, {
2496a2c58260SJohannes Goetzfried 		.alg = "cbc(cast5)",
2497a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2498a2c58260SJohannes Goetzfried 		.suite = {
2499a2c58260SJohannes Goetzfried 			.cipher = {
250021c8e720SArd Biesheuvel 				.enc = __VECS(cast5_cbc_enc_tv_template),
250121c8e720SArd Biesheuvel 				.dec = __VECS(cast5_cbc_dec_tv_template)
2502a2c58260SJohannes Goetzfried 			}
2503a2c58260SJohannes Goetzfried 		}
2504a2c58260SJohannes Goetzfried 	}, {
25059b8b0405SJohannes Goetzfried 		.alg = "cbc(cast6)",
25069b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
25079b8b0405SJohannes Goetzfried 		.suite = {
25089b8b0405SJohannes Goetzfried 			.cipher = {
250921c8e720SArd Biesheuvel 				.enc = __VECS(cast6_cbc_enc_tv_template),
251021c8e720SArd Biesheuvel 				.dec = __VECS(cast6_cbc_dec_tv_template)
25119b8b0405SJohannes Goetzfried 			}
25129b8b0405SJohannes Goetzfried 		}
25139b8b0405SJohannes Goetzfried 	}, {
2514da7f033dSHerbert Xu 		.alg = "cbc(des)",
25151aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2516da7f033dSHerbert Xu 		.suite = {
2517da7f033dSHerbert Xu 			.cipher = {
251821c8e720SArd Biesheuvel 				.enc = __VECS(des_cbc_enc_tv_template),
251921c8e720SArd Biesheuvel 				.dec = __VECS(des_cbc_dec_tv_template)
2520da7f033dSHerbert Xu 			}
2521da7f033dSHerbert Xu 		}
2522da7f033dSHerbert Xu 	}, {
2523da7f033dSHerbert Xu 		.alg = "cbc(des3_ede)",
25241aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2525a1915d51SJarod Wilson 		.fips_allowed = 1,
2526da7f033dSHerbert Xu 		.suite = {
2527da7f033dSHerbert Xu 			.cipher = {
252821c8e720SArd Biesheuvel 				.enc = __VECS(des3_ede_cbc_enc_tv_template),
252921c8e720SArd Biesheuvel 				.dec = __VECS(des3_ede_cbc_dec_tv_template)
2530da7f033dSHerbert Xu 			}
2531da7f033dSHerbert Xu 		}
2532da7f033dSHerbert Xu 	}, {
25339d25917dSJussi Kivilinna 		.alg = "cbc(serpent)",
25349d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
25359d25917dSJussi Kivilinna 		.suite = {
25369d25917dSJussi Kivilinna 			.cipher = {
253721c8e720SArd Biesheuvel 				.enc = __VECS(serpent_cbc_enc_tv_template),
253821c8e720SArd Biesheuvel 				.dec = __VECS(serpent_cbc_dec_tv_template)
25399d25917dSJussi Kivilinna 			}
25409d25917dSJussi Kivilinna 		}
25419d25917dSJussi Kivilinna 	}, {
2542da7f033dSHerbert Xu 		.alg = "cbc(twofish)",
25431aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2544da7f033dSHerbert Xu 		.suite = {
2545da7f033dSHerbert Xu 			.cipher = {
254621c8e720SArd Biesheuvel 				.enc = __VECS(tf_cbc_enc_tv_template),
254721c8e720SArd Biesheuvel 				.dec = __VECS(tf_cbc_dec_tv_template)
2548da7f033dSHerbert Xu 			}
2549da7f033dSHerbert Xu 		}
2550da7f033dSHerbert Xu 	}, {
2551092acf06SArd Biesheuvel 		.alg = "cbcmac(aes)",
2552092acf06SArd Biesheuvel 		.fips_allowed = 1,
2553092acf06SArd Biesheuvel 		.test = alg_test_hash,
2554092acf06SArd Biesheuvel 		.suite = {
2555092acf06SArd Biesheuvel 			.hash = __VECS(aes_cbcmac_tv_template)
2556092acf06SArd Biesheuvel 		}
2557092acf06SArd Biesheuvel 	}, {
2558da7f033dSHerbert Xu 		.alg = "ccm(aes)",
2559da7f033dSHerbert Xu 		.test = alg_test_aead,
2560a1915d51SJarod Wilson 		.fips_allowed = 1,
2561da7f033dSHerbert Xu 		.suite = {
2562da7f033dSHerbert Xu 			.aead = {
256321c8e720SArd Biesheuvel 				.enc = __VECS(aes_ccm_enc_tv_template),
256421c8e720SArd Biesheuvel 				.dec = __VECS(aes_ccm_dec_tv_template)
2565da7f033dSHerbert Xu 			}
2566da7f033dSHerbert Xu 		}
2567da7f033dSHerbert Xu 	}, {
25683590ebf2SMartin Willi 		.alg = "chacha20",
25693590ebf2SMartin Willi 		.test = alg_test_skcipher,
25703590ebf2SMartin Willi 		.suite = {
25713590ebf2SMartin Willi 			.cipher = {
257221c8e720SArd Biesheuvel 				.enc = __VECS(chacha20_enc_tv_template),
257321c8e720SArd Biesheuvel 				.dec = __VECS(chacha20_enc_tv_template),
25743590ebf2SMartin Willi 			}
25753590ebf2SMartin Willi 		}
25763590ebf2SMartin Willi 	}, {
257793b5e86aSJussi Kivilinna 		.alg = "cmac(aes)",
25788f183751SStephan Mueller 		.fips_allowed = 1,
257993b5e86aSJussi Kivilinna 		.test = alg_test_hash,
258093b5e86aSJussi Kivilinna 		.suite = {
258121c8e720SArd Biesheuvel 			.hash = __VECS(aes_cmac128_tv_template)
258293b5e86aSJussi Kivilinna 		}
258393b5e86aSJussi Kivilinna 	}, {
258493b5e86aSJussi Kivilinna 		.alg = "cmac(des3_ede)",
25858f183751SStephan Mueller 		.fips_allowed = 1,
258693b5e86aSJussi Kivilinna 		.test = alg_test_hash,
258793b5e86aSJussi Kivilinna 		.suite = {
258821c8e720SArd Biesheuvel 			.hash = __VECS(des3_ede_cmac64_tv_template)
258993b5e86aSJussi Kivilinna 		}
259093b5e86aSJussi Kivilinna 	}, {
2591e448370dSJussi Kivilinna 		.alg = "compress_null",
2592e448370dSJussi Kivilinna 		.test = alg_test_null,
2593e448370dSJussi Kivilinna 	}, {
2594ebb3472fSArd Biesheuvel 		.alg = "crc32",
2595ebb3472fSArd Biesheuvel 		.test = alg_test_hash,
2596ebb3472fSArd Biesheuvel 		.suite = {
259721c8e720SArd Biesheuvel 			.hash = __VECS(crc32_tv_template)
2598ebb3472fSArd Biesheuvel 		}
2599ebb3472fSArd Biesheuvel 	}, {
2600da7f033dSHerbert Xu 		.alg = "crc32c",
26018e3ee85eSHerbert Xu 		.test = alg_test_crc32c,
2602a1915d51SJarod Wilson 		.fips_allowed = 1,
2603da7f033dSHerbert Xu 		.suite = {
260421c8e720SArd Biesheuvel 			.hash = __VECS(crc32c_tv_template)
2605da7f033dSHerbert Xu 		}
2606da7f033dSHerbert Xu 	}, {
260768411521SHerbert Xu 		.alg = "crct10dif",
260868411521SHerbert Xu 		.test = alg_test_hash,
260968411521SHerbert Xu 		.fips_allowed = 1,
261068411521SHerbert Xu 		.suite = {
261121c8e720SArd Biesheuvel 			.hash = __VECS(crct10dif_tv_template)
261268411521SHerbert Xu 		}
261368411521SHerbert Xu 	}, {
2614f7cb80f2SJarod Wilson 		.alg = "ctr(aes)",
2615f7cb80f2SJarod Wilson 		.test = alg_test_skcipher,
2616a1915d51SJarod Wilson 		.fips_allowed = 1,
2617f7cb80f2SJarod Wilson 		.suite = {
2618f7cb80f2SJarod Wilson 			.cipher = {
261921c8e720SArd Biesheuvel 				.enc = __VECS(aes_ctr_enc_tv_template),
262021c8e720SArd Biesheuvel 				.dec = __VECS(aes_ctr_dec_tv_template)
2621f7cb80f2SJarod Wilson 			}
2622f7cb80f2SJarod Wilson 		}
2623f7cb80f2SJarod Wilson 	}, {
262485b63e34SJussi Kivilinna 		.alg = "ctr(blowfish)",
262585b63e34SJussi Kivilinna 		.test = alg_test_skcipher,
262685b63e34SJussi Kivilinna 		.suite = {
262785b63e34SJussi Kivilinna 			.cipher = {
262821c8e720SArd Biesheuvel 				.enc = __VECS(bf_ctr_enc_tv_template),
262921c8e720SArd Biesheuvel 				.dec = __VECS(bf_ctr_dec_tv_template)
263085b63e34SJussi Kivilinna 			}
263185b63e34SJussi Kivilinna 		}
263285b63e34SJussi Kivilinna 	}, {
26330840605eSJussi Kivilinna 		.alg = "ctr(camellia)",
26340840605eSJussi Kivilinna 		.test = alg_test_skcipher,
26350840605eSJussi Kivilinna 		.suite = {
26360840605eSJussi Kivilinna 			.cipher = {
263721c8e720SArd Biesheuvel 				.enc = __VECS(camellia_ctr_enc_tv_template),
263821c8e720SArd Biesheuvel 				.dec = __VECS(camellia_ctr_dec_tv_template)
26390840605eSJussi Kivilinna 			}
26400840605eSJussi Kivilinna 		}
26410840605eSJussi Kivilinna 	}, {
2642a2c58260SJohannes Goetzfried 		.alg = "ctr(cast5)",
2643a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2644a2c58260SJohannes Goetzfried 		.suite = {
2645a2c58260SJohannes Goetzfried 			.cipher = {
264621c8e720SArd Biesheuvel 				.enc = __VECS(cast5_ctr_enc_tv_template),
264721c8e720SArd Biesheuvel 				.dec = __VECS(cast5_ctr_dec_tv_template)
2648a2c58260SJohannes Goetzfried 			}
2649a2c58260SJohannes Goetzfried 		}
2650a2c58260SJohannes Goetzfried 	}, {
26519b8b0405SJohannes Goetzfried 		.alg = "ctr(cast6)",
26529b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
26539b8b0405SJohannes Goetzfried 		.suite = {
26549b8b0405SJohannes Goetzfried 			.cipher = {
265521c8e720SArd Biesheuvel 				.enc = __VECS(cast6_ctr_enc_tv_template),
265621c8e720SArd Biesheuvel 				.dec = __VECS(cast6_ctr_dec_tv_template)
26579b8b0405SJohannes Goetzfried 			}
26589b8b0405SJohannes Goetzfried 		}
26599b8b0405SJohannes Goetzfried 	}, {
26608163fc30SJussi Kivilinna 		.alg = "ctr(des)",
26618163fc30SJussi Kivilinna 		.test = alg_test_skcipher,
26628163fc30SJussi Kivilinna 		.suite = {
26638163fc30SJussi Kivilinna 			.cipher = {
266421c8e720SArd Biesheuvel 				.enc = __VECS(des_ctr_enc_tv_template),
266521c8e720SArd Biesheuvel 				.dec = __VECS(des_ctr_dec_tv_template)
26668163fc30SJussi Kivilinna 			}
26678163fc30SJussi Kivilinna 		}
26688163fc30SJussi Kivilinna 	}, {
2669e080b17aSJussi Kivilinna 		.alg = "ctr(des3_ede)",
2670e080b17aSJussi Kivilinna 		.test = alg_test_skcipher,
26710d8da104SMarcelo Cerri 		.fips_allowed = 1,
2672e080b17aSJussi Kivilinna 		.suite = {
2673e080b17aSJussi Kivilinna 			.cipher = {
267421c8e720SArd Biesheuvel 				.enc = __VECS(des3_ede_ctr_enc_tv_template),
267521c8e720SArd Biesheuvel 				.dec = __VECS(des3_ede_ctr_dec_tv_template)
2676e080b17aSJussi Kivilinna 			}
2677e080b17aSJussi Kivilinna 		}
2678e080b17aSJussi Kivilinna 	}, {
26799d25917dSJussi Kivilinna 		.alg = "ctr(serpent)",
26809d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
26819d25917dSJussi Kivilinna 		.suite = {
26829d25917dSJussi Kivilinna 			.cipher = {
268321c8e720SArd Biesheuvel 				.enc = __VECS(serpent_ctr_enc_tv_template),
268421c8e720SArd Biesheuvel 				.dec = __VECS(serpent_ctr_dec_tv_template)
26859d25917dSJussi Kivilinna 			}
26869d25917dSJussi Kivilinna 		}
26879d25917dSJussi Kivilinna 	}, {
2688573da620SJussi Kivilinna 		.alg = "ctr(twofish)",
2689573da620SJussi Kivilinna 		.test = alg_test_skcipher,
2690573da620SJussi Kivilinna 		.suite = {
2691573da620SJussi Kivilinna 			.cipher = {
269221c8e720SArd Biesheuvel 				.enc = __VECS(tf_ctr_enc_tv_template),
269321c8e720SArd Biesheuvel 				.dec = __VECS(tf_ctr_dec_tv_template)
2694573da620SJussi Kivilinna 			}
2695573da620SJussi Kivilinna 		}
2696573da620SJussi Kivilinna 	}, {
2697da7f033dSHerbert Xu 		.alg = "cts(cbc(aes))",
26981aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2699da7f033dSHerbert Xu 		.suite = {
2700da7f033dSHerbert Xu 			.cipher = {
270121c8e720SArd Biesheuvel 				.enc = __VECS(cts_mode_enc_tv_template),
270221c8e720SArd Biesheuvel 				.dec = __VECS(cts_mode_dec_tv_template)
2703da7f033dSHerbert Xu 			}
2704da7f033dSHerbert Xu 		}
2705da7f033dSHerbert Xu 	}, {
2706da7f033dSHerbert Xu 		.alg = "deflate",
2707da7f033dSHerbert Xu 		.test = alg_test_comp,
27080818904dSMilan Broz 		.fips_allowed = 1,
2709da7f033dSHerbert Xu 		.suite = {
2710da7f033dSHerbert Xu 			.comp = {
271121c8e720SArd Biesheuvel 				.comp = __VECS(deflate_comp_tv_template),
271221c8e720SArd Biesheuvel 				.decomp = __VECS(deflate_decomp_tv_template)
2713da7f033dSHerbert Xu 			}
2714da7f033dSHerbert Xu 		}
2715da7f033dSHerbert Xu 	}, {
2716802c7f1cSSalvatore Benedetto 		.alg = "dh",
2717802c7f1cSSalvatore Benedetto 		.test = alg_test_kpp,
2718802c7f1cSSalvatore Benedetto 		.fips_allowed = 1,
2719802c7f1cSSalvatore Benedetto 		.suite = {
272021c8e720SArd Biesheuvel 			.kpp = __VECS(dh_tv_template)
2721802c7f1cSSalvatore Benedetto 		}
2722802c7f1cSSalvatore Benedetto 	}, {
2723e448370dSJussi Kivilinna 		.alg = "digest_null",
2724e448370dSJussi Kivilinna 		.test = alg_test_null,
2725e448370dSJussi Kivilinna 	}, {
272664d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes128",
272764d1cdfbSStephan Mueller 		.test = alg_test_drbg,
272864d1cdfbSStephan Mueller 		.fips_allowed = 1,
272964d1cdfbSStephan Mueller 		.suite = {
273021c8e720SArd Biesheuvel 			.drbg = __VECS(drbg_nopr_ctr_aes128_tv_template)
273164d1cdfbSStephan Mueller 		}
273264d1cdfbSStephan Mueller 	}, {
273364d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes192",
273464d1cdfbSStephan Mueller 		.test = alg_test_drbg,
273564d1cdfbSStephan Mueller 		.fips_allowed = 1,
273664d1cdfbSStephan Mueller 		.suite = {
273721c8e720SArd Biesheuvel 			.drbg = __VECS(drbg_nopr_ctr_aes192_tv_template)
273864d1cdfbSStephan Mueller 		}
273964d1cdfbSStephan Mueller 	}, {
274064d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes256",
274164d1cdfbSStephan Mueller 		.test = alg_test_drbg,
274264d1cdfbSStephan Mueller 		.fips_allowed = 1,
274364d1cdfbSStephan Mueller 		.suite = {
274421c8e720SArd Biesheuvel 			.drbg = __VECS(drbg_nopr_ctr_aes256_tv_template)
274564d1cdfbSStephan Mueller 		}
274664d1cdfbSStephan Mueller 	}, {
274764d1cdfbSStephan Mueller 		/*
274864d1cdfbSStephan Mueller 		 * There is no need to specifically test the DRBG with every
274964d1cdfbSStephan Mueller 		 * backend cipher -- covered by drbg_nopr_hmac_sha256 test
275064d1cdfbSStephan Mueller 		 */
275164d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha1",
275264d1cdfbSStephan Mueller 		.fips_allowed = 1,
275364d1cdfbSStephan Mueller 		.test = alg_test_null,
275464d1cdfbSStephan Mueller 	}, {
275564d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha256",
275664d1cdfbSStephan Mueller 		.test = alg_test_drbg,
275764d1cdfbSStephan Mueller 		.fips_allowed = 1,
275864d1cdfbSStephan Mueller 		.suite = {
275921c8e720SArd Biesheuvel 			.drbg = __VECS(drbg_nopr_hmac_sha256_tv_template)
276064d1cdfbSStephan Mueller 		}
276164d1cdfbSStephan Mueller 	}, {
276264d1cdfbSStephan Mueller 		/* covered by drbg_nopr_hmac_sha256 test */
276364d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha384",
276464d1cdfbSStephan Mueller 		.fips_allowed = 1,
276564d1cdfbSStephan Mueller 		.test = alg_test_null,
276664d1cdfbSStephan Mueller 	}, {
276764d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha512",
276864d1cdfbSStephan Mueller 		.test = alg_test_null,
276964d1cdfbSStephan Mueller 		.fips_allowed = 1,
277064d1cdfbSStephan Mueller 	}, {
277164d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha1",
277264d1cdfbSStephan Mueller 		.fips_allowed = 1,
277364d1cdfbSStephan Mueller 		.test = alg_test_null,
277464d1cdfbSStephan Mueller 	}, {
277564d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha256",
277664d1cdfbSStephan Mueller 		.test = alg_test_drbg,
277764d1cdfbSStephan Mueller 		.fips_allowed = 1,
277864d1cdfbSStephan Mueller 		.suite = {
277921c8e720SArd Biesheuvel 			.drbg = __VECS(drbg_nopr_sha256_tv_template)
278064d1cdfbSStephan Mueller 		}
278164d1cdfbSStephan Mueller 	}, {
278264d1cdfbSStephan Mueller 		/* covered by drbg_nopr_sha256 test */
278364d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha384",
278464d1cdfbSStephan Mueller 		.fips_allowed = 1,
278564d1cdfbSStephan Mueller 		.test = alg_test_null,
278664d1cdfbSStephan Mueller 	}, {
278764d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha512",
278864d1cdfbSStephan Mueller 		.fips_allowed = 1,
278964d1cdfbSStephan Mueller 		.test = alg_test_null,
279064d1cdfbSStephan Mueller 	}, {
279164d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes128",
279264d1cdfbSStephan Mueller 		.test = alg_test_drbg,
279364d1cdfbSStephan Mueller 		.fips_allowed = 1,
279464d1cdfbSStephan Mueller 		.suite = {
279521c8e720SArd Biesheuvel 			.drbg = __VECS(drbg_pr_ctr_aes128_tv_template)
279664d1cdfbSStephan Mueller 		}
279764d1cdfbSStephan Mueller 	}, {
279864d1cdfbSStephan Mueller 		/* covered by drbg_pr_ctr_aes128 test */
279964d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes192",
280064d1cdfbSStephan Mueller 		.fips_allowed = 1,
280164d1cdfbSStephan Mueller 		.test = alg_test_null,
280264d1cdfbSStephan Mueller 	}, {
280364d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes256",
280464d1cdfbSStephan Mueller 		.fips_allowed = 1,
280564d1cdfbSStephan Mueller 		.test = alg_test_null,
280664d1cdfbSStephan Mueller 	}, {
280764d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha1",
280864d1cdfbSStephan Mueller 		.fips_allowed = 1,
280964d1cdfbSStephan Mueller 		.test = alg_test_null,
281064d1cdfbSStephan Mueller 	}, {
281164d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha256",
281264d1cdfbSStephan Mueller 		.test = alg_test_drbg,
281364d1cdfbSStephan Mueller 		.fips_allowed = 1,
281464d1cdfbSStephan Mueller 		.suite = {
281521c8e720SArd Biesheuvel 			.drbg = __VECS(drbg_pr_hmac_sha256_tv_template)
281664d1cdfbSStephan Mueller 		}
281764d1cdfbSStephan Mueller 	}, {
281864d1cdfbSStephan Mueller 		/* covered by drbg_pr_hmac_sha256 test */
281964d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha384",
282064d1cdfbSStephan Mueller 		.fips_allowed = 1,
282164d1cdfbSStephan Mueller 		.test = alg_test_null,
282264d1cdfbSStephan Mueller 	}, {
282364d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha512",
282464d1cdfbSStephan Mueller 		.test = alg_test_null,
282564d1cdfbSStephan Mueller 		.fips_allowed = 1,
282664d1cdfbSStephan Mueller 	}, {
282764d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha1",
282864d1cdfbSStephan Mueller 		.fips_allowed = 1,
282964d1cdfbSStephan Mueller 		.test = alg_test_null,
283064d1cdfbSStephan Mueller 	}, {
283164d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha256",
283264d1cdfbSStephan Mueller 		.test = alg_test_drbg,
283364d1cdfbSStephan Mueller 		.fips_allowed = 1,
283464d1cdfbSStephan Mueller 		.suite = {
283521c8e720SArd Biesheuvel 			.drbg = __VECS(drbg_pr_sha256_tv_template)
283664d1cdfbSStephan Mueller 		}
283764d1cdfbSStephan Mueller 	}, {
283864d1cdfbSStephan Mueller 		/* covered by drbg_pr_sha256 test */
283964d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha384",
284064d1cdfbSStephan Mueller 		.fips_allowed = 1,
284164d1cdfbSStephan Mueller 		.test = alg_test_null,
284264d1cdfbSStephan Mueller 	}, {
284364d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha512",
284464d1cdfbSStephan Mueller 		.fips_allowed = 1,
284564d1cdfbSStephan Mueller 		.test = alg_test_null,
284664d1cdfbSStephan Mueller 	}, {
2847da7f033dSHerbert Xu 		.alg = "ecb(aes)",
28481aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2849a1915d51SJarod Wilson 		.fips_allowed = 1,
2850da7f033dSHerbert Xu 		.suite = {
2851da7f033dSHerbert Xu 			.cipher = {
285221c8e720SArd Biesheuvel 				.enc = __VECS(aes_enc_tv_template),
285321c8e720SArd Biesheuvel 				.dec = __VECS(aes_dec_tv_template)
2854da7f033dSHerbert Xu 			}
2855da7f033dSHerbert Xu 		}
2856da7f033dSHerbert Xu 	}, {
2857da7f033dSHerbert Xu 		.alg = "ecb(anubis)",
28581aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2859da7f033dSHerbert Xu 		.suite = {
2860da7f033dSHerbert Xu 			.cipher = {
286121c8e720SArd Biesheuvel 				.enc = __VECS(anubis_enc_tv_template),
286221c8e720SArd Biesheuvel 				.dec = __VECS(anubis_dec_tv_template)
2863da7f033dSHerbert Xu 			}
2864da7f033dSHerbert Xu 		}
2865da7f033dSHerbert Xu 	}, {
2866da7f033dSHerbert Xu 		.alg = "ecb(arc4)",
28671aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2868da7f033dSHerbert Xu 		.suite = {
2869da7f033dSHerbert Xu 			.cipher = {
287021c8e720SArd Biesheuvel 				.enc = __VECS(arc4_enc_tv_template),
287121c8e720SArd Biesheuvel 				.dec = __VECS(arc4_dec_tv_template)
2872da7f033dSHerbert Xu 			}
2873da7f033dSHerbert Xu 		}
2874da7f033dSHerbert Xu 	}, {
2875da7f033dSHerbert Xu 		.alg = "ecb(blowfish)",
28761aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2877da7f033dSHerbert Xu 		.suite = {
2878da7f033dSHerbert Xu 			.cipher = {
287921c8e720SArd Biesheuvel 				.enc = __VECS(bf_enc_tv_template),
288021c8e720SArd Biesheuvel 				.dec = __VECS(bf_dec_tv_template)
2881da7f033dSHerbert Xu 			}
2882da7f033dSHerbert Xu 		}
2883da7f033dSHerbert Xu 	}, {
2884da7f033dSHerbert Xu 		.alg = "ecb(camellia)",
28851aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2886da7f033dSHerbert Xu 		.suite = {
2887da7f033dSHerbert Xu 			.cipher = {
288821c8e720SArd Biesheuvel 				.enc = __VECS(camellia_enc_tv_template),
288921c8e720SArd Biesheuvel 				.dec = __VECS(camellia_dec_tv_template)
2890da7f033dSHerbert Xu 			}
2891da7f033dSHerbert Xu 		}
2892da7f033dSHerbert Xu 	}, {
2893da7f033dSHerbert Xu 		.alg = "ecb(cast5)",
28941aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2895da7f033dSHerbert Xu 		.suite = {
2896da7f033dSHerbert Xu 			.cipher = {
289721c8e720SArd Biesheuvel 				.enc = __VECS(cast5_enc_tv_template),
289821c8e720SArd Biesheuvel 				.dec = __VECS(cast5_dec_tv_template)
2899da7f033dSHerbert Xu 			}
2900da7f033dSHerbert Xu 		}
2901da7f033dSHerbert Xu 	}, {
2902da7f033dSHerbert Xu 		.alg = "ecb(cast6)",
29031aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2904da7f033dSHerbert Xu 		.suite = {
2905da7f033dSHerbert Xu 			.cipher = {
290621c8e720SArd Biesheuvel 				.enc = __VECS(cast6_enc_tv_template),
290721c8e720SArd Biesheuvel 				.dec = __VECS(cast6_dec_tv_template)
2908da7f033dSHerbert Xu 			}
2909da7f033dSHerbert Xu 		}
2910da7f033dSHerbert Xu 	}, {
2911e448370dSJussi Kivilinna 		.alg = "ecb(cipher_null)",
2912e448370dSJussi Kivilinna 		.test = alg_test_null,
29136175ca2bSMilan Broz 		.fips_allowed = 1,
2914e448370dSJussi Kivilinna 	}, {
2915da7f033dSHerbert Xu 		.alg = "ecb(des)",
29161aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2917da7f033dSHerbert Xu 		.suite = {
2918da7f033dSHerbert Xu 			.cipher = {
291921c8e720SArd Biesheuvel 				.enc = __VECS(des_enc_tv_template),
292021c8e720SArd Biesheuvel 				.dec = __VECS(des_dec_tv_template)
2921da7f033dSHerbert Xu 			}
2922da7f033dSHerbert Xu 		}
2923da7f033dSHerbert Xu 	}, {
2924da7f033dSHerbert Xu 		.alg = "ecb(des3_ede)",
29251aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2926a1915d51SJarod Wilson 		.fips_allowed = 1,
2927da7f033dSHerbert Xu 		.suite = {
2928da7f033dSHerbert Xu 			.cipher = {
292921c8e720SArd Biesheuvel 				.enc = __VECS(des3_ede_enc_tv_template),
293021c8e720SArd Biesheuvel 				.dec = __VECS(des3_ede_dec_tv_template)
2931da7f033dSHerbert Xu 			}
2932da7f033dSHerbert Xu 		}
2933da7f033dSHerbert Xu 	}, {
293466e5bd00SJussi Kivilinna 		.alg = "ecb(fcrypt)",
293566e5bd00SJussi Kivilinna 		.test = alg_test_skcipher,
293666e5bd00SJussi Kivilinna 		.suite = {
293766e5bd00SJussi Kivilinna 			.cipher = {
293866e5bd00SJussi Kivilinna 				.enc = {
293966e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_enc_tv_template,
294066e5bd00SJussi Kivilinna 					.count = 1
294166e5bd00SJussi Kivilinna 				},
294266e5bd00SJussi Kivilinna 				.dec = {
294366e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_dec_tv_template,
294466e5bd00SJussi Kivilinna 					.count = 1
294566e5bd00SJussi Kivilinna 				}
294666e5bd00SJussi Kivilinna 			}
294766e5bd00SJussi Kivilinna 		}
294866e5bd00SJussi Kivilinna 	}, {
2949da7f033dSHerbert Xu 		.alg = "ecb(khazad)",
29501aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2951da7f033dSHerbert Xu 		.suite = {
2952da7f033dSHerbert Xu 			.cipher = {
295321c8e720SArd Biesheuvel 				.enc = __VECS(khazad_enc_tv_template),
295421c8e720SArd Biesheuvel 				.dec = __VECS(khazad_dec_tv_template)
2955da7f033dSHerbert Xu 			}
2956da7f033dSHerbert Xu 		}
2957da7f033dSHerbert Xu 	}, {
2958da7f033dSHerbert Xu 		.alg = "ecb(seed)",
29591aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2960da7f033dSHerbert Xu 		.suite = {
2961da7f033dSHerbert Xu 			.cipher = {
296221c8e720SArd Biesheuvel 				.enc = __VECS(seed_enc_tv_template),
296321c8e720SArd Biesheuvel 				.dec = __VECS(seed_dec_tv_template)
2964da7f033dSHerbert Xu 			}
2965da7f033dSHerbert Xu 		}
2966da7f033dSHerbert Xu 	}, {
2967da7f033dSHerbert Xu 		.alg = "ecb(serpent)",
29681aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2969da7f033dSHerbert Xu 		.suite = {
2970da7f033dSHerbert Xu 			.cipher = {
297121c8e720SArd Biesheuvel 				.enc = __VECS(serpent_enc_tv_template),
297221c8e720SArd Biesheuvel 				.dec = __VECS(serpent_dec_tv_template)
2973da7f033dSHerbert Xu 			}
2974da7f033dSHerbert Xu 		}
2975da7f033dSHerbert Xu 	}, {
2976da7f033dSHerbert Xu 		.alg = "ecb(tea)",
29771aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2978da7f033dSHerbert Xu 		.suite = {
2979da7f033dSHerbert Xu 			.cipher = {
298021c8e720SArd Biesheuvel 				.enc = __VECS(tea_enc_tv_template),
298121c8e720SArd Biesheuvel 				.dec = __VECS(tea_dec_tv_template)
2982da7f033dSHerbert Xu 			}
2983da7f033dSHerbert Xu 		}
2984da7f033dSHerbert Xu 	}, {
2985da7f033dSHerbert Xu 		.alg = "ecb(tnepres)",
29861aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2987da7f033dSHerbert Xu 		.suite = {
2988da7f033dSHerbert Xu 			.cipher = {
298921c8e720SArd Biesheuvel 				.enc = __VECS(tnepres_enc_tv_template),
299021c8e720SArd Biesheuvel 				.dec = __VECS(tnepres_dec_tv_template)
2991da7f033dSHerbert Xu 			}
2992da7f033dSHerbert Xu 		}
2993da7f033dSHerbert Xu 	}, {
2994da7f033dSHerbert Xu 		.alg = "ecb(twofish)",
29951aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2996da7f033dSHerbert Xu 		.suite = {
2997da7f033dSHerbert Xu 			.cipher = {
299821c8e720SArd Biesheuvel 				.enc = __VECS(tf_enc_tv_template),
299921c8e720SArd Biesheuvel 				.dec = __VECS(tf_dec_tv_template)
3000da7f033dSHerbert Xu 			}
3001da7f033dSHerbert Xu 		}
3002da7f033dSHerbert Xu 	}, {
3003da7f033dSHerbert Xu 		.alg = "ecb(xeta)",
30041aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3005da7f033dSHerbert Xu 		.suite = {
3006da7f033dSHerbert Xu 			.cipher = {
300721c8e720SArd Biesheuvel 				.enc = __VECS(xeta_enc_tv_template),
300821c8e720SArd Biesheuvel 				.dec = __VECS(xeta_dec_tv_template)
3009da7f033dSHerbert Xu 			}
3010da7f033dSHerbert Xu 		}
3011da7f033dSHerbert Xu 	}, {
3012da7f033dSHerbert Xu 		.alg = "ecb(xtea)",
30131aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3014da7f033dSHerbert Xu 		.suite = {
3015da7f033dSHerbert Xu 			.cipher = {
301621c8e720SArd Biesheuvel 				.enc = __VECS(xtea_enc_tv_template),
301721c8e720SArd Biesheuvel 				.dec = __VECS(xtea_dec_tv_template)
3018da7f033dSHerbert Xu 			}
3019da7f033dSHerbert Xu 		}
3020da7f033dSHerbert Xu 	}, {
30213c4b2390SSalvatore Benedetto 		.alg = "ecdh",
30223c4b2390SSalvatore Benedetto 		.test = alg_test_kpp,
30233c4b2390SSalvatore Benedetto 		.fips_allowed = 1,
30243c4b2390SSalvatore Benedetto 		.suite = {
302521c8e720SArd Biesheuvel 			.kpp = __VECS(ecdh_tv_template)
30263c4b2390SSalvatore Benedetto 		}
30273c4b2390SSalvatore Benedetto 	}, {
3028da7f033dSHerbert Xu 		.alg = "gcm(aes)",
3029da7f033dSHerbert Xu 		.test = alg_test_aead,
3030a1915d51SJarod Wilson 		.fips_allowed = 1,
3031da7f033dSHerbert Xu 		.suite = {
3032da7f033dSHerbert Xu 			.aead = {
303321c8e720SArd Biesheuvel 				.enc = __VECS(aes_gcm_enc_tv_template),
303421c8e720SArd Biesheuvel 				.dec = __VECS(aes_gcm_dec_tv_template)
3035da7f033dSHerbert Xu 			}
3036da7f033dSHerbert Xu 		}
3037da7f033dSHerbert Xu 	}, {
3038507069c9SYouquan, Song 		.alg = "ghash",
3039507069c9SYouquan, Song 		.test = alg_test_hash,
304018c0ebd2SJarod Wilson 		.fips_allowed = 1,
3041507069c9SYouquan, Song 		.suite = {
304221c8e720SArd Biesheuvel 			.hash = __VECS(ghash_tv_template)
3043507069c9SYouquan, Song 		}
3044507069c9SYouquan, Song 	}, {
3045a482b081SSonic Zhang 		.alg = "hmac(crc32)",
3046a482b081SSonic Zhang 		.test = alg_test_hash,
3047a482b081SSonic Zhang 		.suite = {
304821c8e720SArd Biesheuvel 			.hash = __VECS(bfin_crc_tv_template)
3049a482b081SSonic Zhang 		}
3050a482b081SSonic Zhang 	}, {
3051da7f033dSHerbert Xu 		.alg = "hmac(md5)",
3052da7f033dSHerbert Xu 		.test = alg_test_hash,
3053da7f033dSHerbert Xu 		.suite = {
305421c8e720SArd Biesheuvel 			.hash = __VECS(hmac_md5_tv_template)
3055da7f033dSHerbert Xu 		}
3056da7f033dSHerbert Xu 	}, {
3057da7f033dSHerbert Xu 		.alg = "hmac(rmd128)",
3058da7f033dSHerbert Xu 		.test = alg_test_hash,
3059da7f033dSHerbert Xu 		.suite = {
306021c8e720SArd Biesheuvel 			.hash = __VECS(hmac_rmd128_tv_template)
3061da7f033dSHerbert Xu 		}
3062da7f033dSHerbert Xu 	}, {
3063da7f033dSHerbert Xu 		.alg = "hmac(rmd160)",
3064da7f033dSHerbert Xu 		.test = alg_test_hash,
3065da7f033dSHerbert Xu 		.suite = {
306621c8e720SArd Biesheuvel 			.hash = __VECS(hmac_rmd160_tv_template)
3067da7f033dSHerbert Xu 		}
3068da7f033dSHerbert Xu 	}, {
3069da7f033dSHerbert Xu 		.alg = "hmac(sha1)",
3070da7f033dSHerbert Xu 		.test = alg_test_hash,
3071a1915d51SJarod Wilson 		.fips_allowed = 1,
3072da7f033dSHerbert Xu 		.suite = {
307321c8e720SArd Biesheuvel 			.hash = __VECS(hmac_sha1_tv_template)
3074da7f033dSHerbert Xu 		}
3075da7f033dSHerbert Xu 	}, {
3076da7f033dSHerbert Xu 		.alg = "hmac(sha224)",
3077da7f033dSHerbert Xu 		.test = alg_test_hash,
3078a1915d51SJarod Wilson 		.fips_allowed = 1,
3079da7f033dSHerbert Xu 		.suite = {
308021c8e720SArd Biesheuvel 			.hash = __VECS(hmac_sha224_tv_template)
3081da7f033dSHerbert Xu 		}
3082da7f033dSHerbert Xu 	}, {
3083da7f033dSHerbert Xu 		.alg = "hmac(sha256)",
3084da7f033dSHerbert Xu 		.test = alg_test_hash,
3085a1915d51SJarod Wilson 		.fips_allowed = 1,
3086da7f033dSHerbert Xu 		.suite = {
308721c8e720SArd Biesheuvel 			.hash = __VECS(hmac_sha256_tv_template)
3088da7f033dSHerbert Xu 		}
3089da7f033dSHerbert Xu 	}, {
309098eca72fSraveendra padasalagi 		.alg = "hmac(sha3-224)",
309198eca72fSraveendra padasalagi 		.test = alg_test_hash,
309298eca72fSraveendra padasalagi 		.fips_allowed = 1,
309398eca72fSraveendra padasalagi 		.suite = {
309421c8e720SArd Biesheuvel 			.hash = __VECS(hmac_sha3_224_tv_template)
309598eca72fSraveendra padasalagi 		}
309698eca72fSraveendra padasalagi 	}, {
309798eca72fSraveendra padasalagi 		.alg = "hmac(sha3-256)",
309898eca72fSraveendra padasalagi 		.test = alg_test_hash,
309998eca72fSraveendra padasalagi 		.fips_allowed = 1,
310098eca72fSraveendra padasalagi 		.suite = {
310121c8e720SArd Biesheuvel 			.hash = __VECS(hmac_sha3_256_tv_template)
310298eca72fSraveendra padasalagi 		}
310398eca72fSraveendra padasalagi 	}, {
310498eca72fSraveendra padasalagi 		.alg = "hmac(sha3-384)",
310598eca72fSraveendra padasalagi 		.test = alg_test_hash,
310698eca72fSraveendra padasalagi 		.fips_allowed = 1,
310798eca72fSraveendra padasalagi 		.suite = {
310821c8e720SArd Biesheuvel 			.hash = __VECS(hmac_sha3_384_tv_template)
310998eca72fSraveendra padasalagi 		}
311098eca72fSraveendra padasalagi 	}, {
311198eca72fSraveendra padasalagi 		.alg = "hmac(sha3-512)",
311298eca72fSraveendra padasalagi 		.test = alg_test_hash,
311398eca72fSraveendra padasalagi 		.fips_allowed = 1,
311498eca72fSraveendra padasalagi 		.suite = {
311521c8e720SArd Biesheuvel 			.hash = __VECS(hmac_sha3_512_tv_template)
311698eca72fSraveendra padasalagi 		}
311798eca72fSraveendra padasalagi 	}, {
3118da7f033dSHerbert Xu 		.alg = "hmac(sha384)",
3119da7f033dSHerbert Xu 		.test = alg_test_hash,
3120a1915d51SJarod Wilson 		.fips_allowed = 1,
3121da7f033dSHerbert Xu 		.suite = {
312221c8e720SArd Biesheuvel 			.hash = __VECS(hmac_sha384_tv_template)
3123da7f033dSHerbert Xu 		}
3124da7f033dSHerbert Xu 	}, {
3125da7f033dSHerbert Xu 		.alg = "hmac(sha512)",
3126da7f033dSHerbert Xu 		.test = alg_test_hash,
3127a1915d51SJarod Wilson 		.fips_allowed = 1,
3128da7f033dSHerbert Xu 		.suite = {
312921c8e720SArd Biesheuvel 			.hash = __VECS(hmac_sha512_tv_template)
3130da7f033dSHerbert Xu 		}
3131da7f033dSHerbert Xu 	}, {
3132bb5530e4SStephan Mueller 		.alg = "jitterentropy_rng",
3133bb5530e4SStephan Mueller 		.fips_allowed = 1,
3134bb5530e4SStephan Mueller 		.test = alg_test_null,
3135bb5530e4SStephan Mueller 	}, {
313635351988SStephan Mueller 		.alg = "kw(aes)",
313735351988SStephan Mueller 		.test = alg_test_skcipher,
313835351988SStephan Mueller 		.fips_allowed = 1,
313935351988SStephan Mueller 		.suite = {
314035351988SStephan Mueller 			.cipher = {
314121c8e720SArd Biesheuvel 				.enc = __VECS(aes_kw_enc_tv_template),
314221c8e720SArd Biesheuvel 				.dec = __VECS(aes_kw_dec_tv_template)
314335351988SStephan Mueller 			}
314435351988SStephan Mueller 		}
314535351988SStephan Mueller 	}, {
3146da7f033dSHerbert Xu 		.alg = "lrw(aes)",
31471aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3148da7f033dSHerbert Xu 		.suite = {
3149da7f033dSHerbert Xu 			.cipher = {
315021c8e720SArd Biesheuvel 				.enc = __VECS(aes_lrw_enc_tv_template),
315121c8e720SArd Biesheuvel 				.dec = __VECS(aes_lrw_dec_tv_template)
3152da7f033dSHerbert Xu 			}
3153da7f033dSHerbert Xu 		}
3154da7f033dSHerbert Xu 	}, {
31550840605eSJussi Kivilinna 		.alg = "lrw(camellia)",
31560840605eSJussi Kivilinna 		.test = alg_test_skcipher,
31570840605eSJussi Kivilinna 		.suite = {
31580840605eSJussi Kivilinna 			.cipher = {
315921c8e720SArd Biesheuvel 				.enc = __VECS(camellia_lrw_enc_tv_template),
316021c8e720SArd Biesheuvel 				.dec = __VECS(camellia_lrw_dec_tv_template)
31610840605eSJussi Kivilinna 			}
31620840605eSJussi Kivilinna 		}
31630840605eSJussi Kivilinna 	}, {
31649b8b0405SJohannes Goetzfried 		.alg = "lrw(cast6)",
31659b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
31669b8b0405SJohannes Goetzfried 		.suite = {
31679b8b0405SJohannes Goetzfried 			.cipher = {
316821c8e720SArd Biesheuvel 				.enc = __VECS(cast6_lrw_enc_tv_template),
316921c8e720SArd Biesheuvel 				.dec = __VECS(cast6_lrw_dec_tv_template)
31709b8b0405SJohannes Goetzfried 			}
31719b8b0405SJohannes Goetzfried 		}
31729b8b0405SJohannes Goetzfried 	}, {
3173d7bfc0faSJussi Kivilinna 		.alg = "lrw(serpent)",
3174d7bfc0faSJussi Kivilinna 		.test = alg_test_skcipher,
3175d7bfc0faSJussi Kivilinna 		.suite = {
3176d7bfc0faSJussi Kivilinna 			.cipher = {
317721c8e720SArd Biesheuvel 				.enc = __VECS(serpent_lrw_enc_tv_template),
317821c8e720SArd Biesheuvel 				.dec = __VECS(serpent_lrw_dec_tv_template)
3179d7bfc0faSJussi Kivilinna 			}
3180d7bfc0faSJussi Kivilinna 		}
3181d7bfc0faSJussi Kivilinna 	}, {
31820b2a1551SJussi Kivilinna 		.alg = "lrw(twofish)",
31830b2a1551SJussi Kivilinna 		.test = alg_test_skcipher,
31840b2a1551SJussi Kivilinna 		.suite = {
31850b2a1551SJussi Kivilinna 			.cipher = {
318621c8e720SArd Biesheuvel 				.enc = __VECS(tf_lrw_enc_tv_template),
318721c8e720SArd Biesheuvel 				.dec = __VECS(tf_lrw_dec_tv_template)
31880b2a1551SJussi Kivilinna 			}
31890b2a1551SJussi Kivilinna 		}
31900b2a1551SJussi Kivilinna 	}, {
31911443cc9bSKOVACS Krisztian 		.alg = "lz4",
31921443cc9bSKOVACS Krisztian 		.test = alg_test_comp,
31931443cc9bSKOVACS Krisztian 		.fips_allowed = 1,
31941443cc9bSKOVACS Krisztian 		.suite = {
31951443cc9bSKOVACS Krisztian 			.comp = {
319621c8e720SArd Biesheuvel 				.comp = __VECS(lz4_comp_tv_template),
319721c8e720SArd Biesheuvel 				.decomp = __VECS(lz4_decomp_tv_template)
31981443cc9bSKOVACS Krisztian 			}
31991443cc9bSKOVACS Krisztian 		}
32001443cc9bSKOVACS Krisztian 	}, {
32011443cc9bSKOVACS Krisztian 		.alg = "lz4hc",
32021443cc9bSKOVACS Krisztian 		.test = alg_test_comp,
32031443cc9bSKOVACS Krisztian 		.fips_allowed = 1,
32041443cc9bSKOVACS Krisztian 		.suite = {
32051443cc9bSKOVACS Krisztian 			.comp = {
320621c8e720SArd Biesheuvel 				.comp = __VECS(lz4hc_comp_tv_template),
320721c8e720SArd Biesheuvel 				.decomp = __VECS(lz4hc_decomp_tv_template)
32081443cc9bSKOVACS Krisztian 			}
32091443cc9bSKOVACS Krisztian 		}
32101443cc9bSKOVACS Krisztian 	}, {
3211da7f033dSHerbert Xu 		.alg = "lzo",
3212da7f033dSHerbert Xu 		.test = alg_test_comp,
32130818904dSMilan Broz 		.fips_allowed = 1,
3214da7f033dSHerbert Xu 		.suite = {
3215da7f033dSHerbert Xu 			.comp = {
321621c8e720SArd Biesheuvel 				.comp = __VECS(lzo_comp_tv_template),
321721c8e720SArd Biesheuvel 				.decomp = __VECS(lzo_decomp_tv_template)
3218da7f033dSHerbert Xu 			}
3219da7f033dSHerbert Xu 		}
3220da7f033dSHerbert Xu 	}, {
3221da7f033dSHerbert Xu 		.alg = "md4",
3222da7f033dSHerbert Xu 		.test = alg_test_hash,
3223da7f033dSHerbert Xu 		.suite = {
322421c8e720SArd Biesheuvel 			.hash = __VECS(md4_tv_template)
3225da7f033dSHerbert Xu 		}
3226da7f033dSHerbert Xu 	}, {
3227da7f033dSHerbert Xu 		.alg = "md5",
3228da7f033dSHerbert Xu 		.test = alg_test_hash,
3229da7f033dSHerbert Xu 		.suite = {
323021c8e720SArd Biesheuvel 			.hash = __VECS(md5_tv_template)
3231da7f033dSHerbert Xu 		}
3232da7f033dSHerbert Xu 	}, {
3233da7f033dSHerbert Xu 		.alg = "michael_mic",
3234da7f033dSHerbert Xu 		.test = alg_test_hash,
3235da7f033dSHerbert Xu 		.suite = {
323621c8e720SArd Biesheuvel 			.hash = __VECS(michael_mic_tv_template)
3237da7f033dSHerbert Xu 		}
3238da7f033dSHerbert Xu 	}, {
3239ba0e14acSPuneet Saxena 		.alg = "ofb(aes)",
3240ba0e14acSPuneet Saxena 		.test = alg_test_skcipher,
3241ba0e14acSPuneet Saxena 		.fips_allowed = 1,
3242ba0e14acSPuneet Saxena 		.suite = {
3243ba0e14acSPuneet Saxena 			.cipher = {
324421c8e720SArd Biesheuvel 				.enc = __VECS(aes_ofb_enc_tv_template),
324521c8e720SArd Biesheuvel 				.dec = __VECS(aes_ofb_dec_tv_template)
3246ba0e14acSPuneet Saxena 			}
3247ba0e14acSPuneet Saxena 		}
3248ba0e14acSPuneet Saxena 	}, {
3249da7f033dSHerbert Xu 		.alg = "pcbc(fcrypt)",
32501aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3251da7f033dSHerbert Xu 		.suite = {
3252da7f033dSHerbert Xu 			.cipher = {
325321c8e720SArd Biesheuvel 				.enc = __VECS(fcrypt_pcbc_enc_tv_template),
325421c8e720SArd Biesheuvel 				.dec = __VECS(fcrypt_pcbc_dec_tv_template)
3255da7f033dSHerbert Xu 			}
3256da7f033dSHerbert Xu 		}
3257da7f033dSHerbert Xu 	}, {
3258eee9dc61SMartin Willi 		.alg = "poly1305",
3259eee9dc61SMartin Willi 		.test = alg_test_hash,
3260eee9dc61SMartin Willi 		.suite = {
326121c8e720SArd Biesheuvel 			.hash = __VECS(poly1305_tv_template)
3262eee9dc61SMartin Willi 		}
3263eee9dc61SMartin Willi 	}, {
3264da7f033dSHerbert Xu 		.alg = "rfc3686(ctr(aes))",
32651aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3266a1915d51SJarod Wilson 		.fips_allowed = 1,
3267da7f033dSHerbert Xu 		.suite = {
3268da7f033dSHerbert Xu 			.cipher = {
326921c8e720SArd Biesheuvel 				.enc = __VECS(aes_ctr_rfc3686_enc_tv_template),
327021c8e720SArd Biesheuvel 				.dec = __VECS(aes_ctr_rfc3686_dec_tv_template)
3271da7f033dSHerbert Xu 			}
3272da7f033dSHerbert Xu 		}
3273da7f033dSHerbert Xu 	}, {
32743f31a740SHerbert Xu 		.alg = "rfc4106(gcm(aes))",
327569435b94SAdrian Hoban 		.test = alg_test_aead,
3276db71f29aSJarod Wilson 		.fips_allowed = 1,
327769435b94SAdrian Hoban 		.suite = {
327869435b94SAdrian Hoban 			.aead = {
327921c8e720SArd Biesheuvel 				.enc = __VECS(aes_gcm_rfc4106_enc_tv_template),
328021c8e720SArd Biesheuvel 				.dec = __VECS(aes_gcm_rfc4106_dec_tv_template)
328169435b94SAdrian Hoban 			}
328269435b94SAdrian Hoban 		}
328369435b94SAdrian Hoban 	}, {
3284544c436aSHerbert Xu 		.alg = "rfc4309(ccm(aes))",
32855d667322SJarod Wilson 		.test = alg_test_aead,
3286a1915d51SJarod Wilson 		.fips_allowed = 1,
32875d667322SJarod Wilson 		.suite = {
32885d667322SJarod Wilson 			.aead = {
328921c8e720SArd Biesheuvel 				.enc = __VECS(aes_ccm_rfc4309_enc_tv_template),
329021c8e720SArd Biesheuvel 				.dec = __VECS(aes_ccm_rfc4309_dec_tv_template)
32915d667322SJarod Wilson 			}
32925d667322SJarod Wilson 		}
32935d667322SJarod Wilson 	}, {
3294bb68745eSHerbert Xu 		.alg = "rfc4543(gcm(aes))",
3295e9b7441aSJussi Kivilinna 		.test = alg_test_aead,
3296e9b7441aSJussi Kivilinna 		.suite = {
3297e9b7441aSJussi Kivilinna 			.aead = {
329821c8e720SArd Biesheuvel 				.enc = __VECS(aes_gcm_rfc4543_enc_tv_template),
329921c8e720SArd Biesheuvel 				.dec = __VECS(aes_gcm_rfc4543_dec_tv_template),
3300e9b7441aSJussi Kivilinna 			}
3301e9b7441aSJussi Kivilinna 		}
3302e9b7441aSJussi Kivilinna 	}, {
3303af2b76b5SMartin Willi 		.alg = "rfc7539(chacha20,poly1305)",
3304af2b76b5SMartin Willi 		.test = alg_test_aead,
3305af2b76b5SMartin Willi 		.suite = {
3306af2b76b5SMartin Willi 			.aead = {
330721c8e720SArd Biesheuvel 				.enc = __VECS(rfc7539_enc_tv_template),
330821c8e720SArd Biesheuvel 				.dec = __VECS(rfc7539_dec_tv_template),
3309af2b76b5SMartin Willi 			}
3310af2b76b5SMartin Willi 		}
3311af2b76b5SMartin Willi 	}, {
33125900758dSMartin Willi 		.alg = "rfc7539esp(chacha20,poly1305)",
33135900758dSMartin Willi 		.test = alg_test_aead,
33145900758dSMartin Willi 		.suite = {
33155900758dSMartin Willi 			.aead = {
331621c8e720SArd Biesheuvel 				.enc = __VECS(rfc7539esp_enc_tv_template),
331721c8e720SArd Biesheuvel 				.dec = __VECS(rfc7539esp_dec_tv_template),
33185900758dSMartin Willi 			}
33195900758dSMartin Willi 		}
33205900758dSMartin Willi 	}, {
3321da7f033dSHerbert Xu 		.alg = "rmd128",
3322da7f033dSHerbert Xu 		.test = alg_test_hash,
3323da7f033dSHerbert Xu 		.suite = {
332421c8e720SArd Biesheuvel 			.hash = __VECS(rmd128_tv_template)
3325da7f033dSHerbert Xu 		}
3326da7f033dSHerbert Xu 	}, {
3327da7f033dSHerbert Xu 		.alg = "rmd160",
3328da7f033dSHerbert Xu 		.test = alg_test_hash,
3329da7f033dSHerbert Xu 		.suite = {
333021c8e720SArd Biesheuvel 			.hash = __VECS(rmd160_tv_template)
3331da7f033dSHerbert Xu 		}
3332da7f033dSHerbert Xu 	}, {
3333da7f033dSHerbert Xu 		.alg = "rmd256",
3334da7f033dSHerbert Xu 		.test = alg_test_hash,
3335da7f033dSHerbert Xu 		.suite = {
333621c8e720SArd Biesheuvel 			.hash = __VECS(rmd256_tv_template)
3337da7f033dSHerbert Xu 		}
3338da7f033dSHerbert Xu 	}, {
3339da7f033dSHerbert Xu 		.alg = "rmd320",
3340da7f033dSHerbert Xu 		.test = alg_test_hash,
3341da7f033dSHerbert Xu 		.suite = {
334221c8e720SArd Biesheuvel 			.hash = __VECS(rmd320_tv_template)
3343da7f033dSHerbert Xu 		}
3344da7f033dSHerbert Xu 	}, {
3345946cc463STadeusz Struk 		.alg = "rsa",
3346946cc463STadeusz Struk 		.test = alg_test_akcipher,
3347946cc463STadeusz Struk 		.fips_allowed = 1,
3348946cc463STadeusz Struk 		.suite = {
334921c8e720SArd Biesheuvel 			.akcipher = __VECS(rsa_tv_template)
3350946cc463STadeusz Struk 		}
3351946cc463STadeusz Struk 	}, {
3352da7f033dSHerbert Xu 		.alg = "salsa20",
33531aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3354da7f033dSHerbert Xu 		.suite = {
3355da7f033dSHerbert Xu 			.cipher = {
335621c8e720SArd Biesheuvel 				.enc = __VECS(salsa20_stream_enc_tv_template)
3357da7f033dSHerbert Xu 			}
3358da7f033dSHerbert Xu 		}
3359da7f033dSHerbert Xu 	}, {
3360da7f033dSHerbert Xu 		.alg = "sha1",
3361da7f033dSHerbert Xu 		.test = alg_test_hash,
3362a1915d51SJarod Wilson 		.fips_allowed = 1,
3363da7f033dSHerbert Xu 		.suite = {
336421c8e720SArd Biesheuvel 			.hash = __VECS(sha1_tv_template)
3365da7f033dSHerbert Xu 		}
3366da7f033dSHerbert Xu 	}, {
3367da7f033dSHerbert Xu 		.alg = "sha224",
3368da7f033dSHerbert Xu 		.test = alg_test_hash,
3369a1915d51SJarod Wilson 		.fips_allowed = 1,
3370da7f033dSHerbert Xu 		.suite = {
337121c8e720SArd Biesheuvel 			.hash = __VECS(sha224_tv_template)
3372da7f033dSHerbert Xu 		}
3373da7f033dSHerbert Xu 	}, {
3374da7f033dSHerbert Xu 		.alg = "sha256",
3375da7f033dSHerbert Xu 		.test = alg_test_hash,
3376a1915d51SJarod Wilson 		.fips_allowed = 1,
3377da7f033dSHerbert Xu 		.suite = {
337821c8e720SArd Biesheuvel 			.hash = __VECS(sha256_tv_template)
3379da7f033dSHerbert Xu 		}
3380da7f033dSHerbert Xu 	}, {
338179cc6ab8Sraveendra padasalagi 		.alg = "sha3-224",
338279cc6ab8Sraveendra padasalagi 		.test = alg_test_hash,
338379cc6ab8Sraveendra padasalagi 		.fips_allowed = 1,
338479cc6ab8Sraveendra padasalagi 		.suite = {
338521c8e720SArd Biesheuvel 			.hash = __VECS(sha3_224_tv_template)
338679cc6ab8Sraveendra padasalagi 		}
338779cc6ab8Sraveendra padasalagi 	}, {
338879cc6ab8Sraveendra padasalagi 		.alg = "sha3-256",
338979cc6ab8Sraveendra padasalagi 		.test = alg_test_hash,
339079cc6ab8Sraveendra padasalagi 		.fips_allowed = 1,
339179cc6ab8Sraveendra padasalagi 		.suite = {
339221c8e720SArd Biesheuvel 			.hash = __VECS(sha3_256_tv_template)
339379cc6ab8Sraveendra padasalagi 		}
339479cc6ab8Sraveendra padasalagi 	}, {
339579cc6ab8Sraveendra padasalagi 		.alg = "sha3-384",
339679cc6ab8Sraveendra padasalagi 		.test = alg_test_hash,
339779cc6ab8Sraveendra padasalagi 		.fips_allowed = 1,
339879cc6ab8Sraveendra padasalagi 		.suite = {
339921c8e720SArd Biesheuvel 			.hash = __VECS(sha3_384_tv_template)
340079cc6ab8Sraveendra padasalagi 		}
340179cc6ab8Sraveendra padasalagi 	}, {
340279cc6ab8Sraveendra padasalagi 		.alg = "sha3-512",
340379cc6ab8Sraveendra padasalagi 		.test = alg_test_hash,
340479cc6ab8Sraveendra padasalagi 		.fips_allowed = 1,
340579cc6ab8Sraveendra padasalagi 		.suite = {
340621c8e720SArd Biesheuvel 			.hash = __VECS(sha3_512_tv_template)
340779cc6ab8Sraveendra padasalagi 		}
340879cc6ab8Sraveendra padasalagi 	}, {
3409da7f033dSHerbert Xu 		.alg = "sha384",
3410da7f033dSHerbert Xu 		.test = alg_test_hash,
3411a1915d51SJarod Wilson 		.fips_allowed = 1,
3412da7f033dSHerbert Xu 		.suite = {
341321c8e720SArd Biesheuvel 			.hash = __VECS(sha384_tv_template)
3414da7f033dSHerbert Xu 		}
3415da7f033dSHerbert Xu 	}, {
3416da7f033dSHerbert Xu 		.alg = "sha512",
3417da7f033dSHerbert Xu 		.test = alg_test_hash,
3418a1915d51SJarod Wilson 		.fips_allowed = 1,
3419da7f033dSHerbert Xu 		.suite = {
342021c8e720SArd Biesheuvel 			.hash = __VECS(sha512_tv_template)
3421da7f033dSHerbert Xu 		}
3422da7f033dSHerbert Xu 	}, {
3423da7f033dSHerbert Xu 		.alg = "tgr128",
3424da7f033dSHerbert Xu 		.test = alg_test_hash,
3425da7f033dSHerbert Xu 		.suite = {
342621c8e720SArd Biesheuvel 			.hash = __VECS(tgr128_tv_template)
3427da7f033dSHerbert Xu 		}
3428da7f033dSHerbert Xu 	}, {
3429da7f033dSHerbert Xu 		.alg = "tgr160",
3430da7f033dSHerbert Xu 		.test = alg_test_hash,
3431da7f033dSHerbert Xu 		.suite = {
343221c8e720SArd Biesheuvel 			.hash = __VECS(tgr160_tv_template)
3433da7f033dSHerbert Xu 		}
3434da7f033dSHerbert Xu 	}, {
3435da7f033dSHerbert Xu 		.alg = "tgr192",
3436da7f033dSHerbert Xu 		.test = alg_test_hash,
3437da7f033dSHerbert Xu 		.suite = {
343821c8e720SArd Biesheuvel 			.hash = __VECS(tgr192_tv_template)
3439da7f033dSHerbert Xu 		}
3440da7f033dSHerbert Xu 	}, {
3441f1939f7cSShane Wang 		.alg = "vmac(aes)",
3442f1939f7cSShane Wang 		.test = alg_test_hash,
3443f1939f7cSShane Wang 		.suite = {
344421c8e720SArd Biesheuvel 			.hash = __VECS(aes_vmac128_tv_template)
3445f1939f7cSShane Wang 		}
3446f1939f7cSShane Wang 	}, {
3447da7f033dSHerbert Xu 		.alg = "wp256",
3448da7f033dSHerbert Xu 		.test = alg_test_hash,
3449da7f033dSHerbert Xu 		.suite = {
345021c8e720SArd Biesheuvel 			.hash = __VECS(wp256_tv_template)
3451da7f033dSHerbert Xu 		}
3452da7f033dSHerbert Xu 	}, {
3453da7f033dSHerbert Xu 		.alg = "wp384",
3454da7f033dSHerbert Xu 		.test = alg_test_hash,
3455da7f033dSHerbert Xu 		.suite = {
345621c8e720SArd Biesheuvel 			.hash = __VECS(wp384_tv_template)
3457da7f033dSHerbert Xu 		}
3458da7f033dSHerbert Xu 	}, {
3459da7f033dSHerbert Xu 		.alg = "wp512",
3460da7f033dSHerbert Xu 		.test = alg_test_hash,
3461da7f033dSHerbert Xu 		.suite = {
346221c8e720SArd Biesheuvel 			.hash = __VECS(wp512_tv_template)
3463da7f033dSHerbert Xu 		}
3464da7f033dSHerbert Xu 	}, {
3465da7f033dSHerbert Xu 		.alg = "xcbc(aes)",
3466da7f033dSHerbert Xu 		.test = alg_test_hash,
3467da7f033dSHerbert Xu 		.suite = {
346821c8e720SArd Biesheuvel 			.hash = __VECS(aes_xcbc128_tv_template)
3469da7f033dSHerbert Xu 		}
3470da7f033dSHerbert Xu 	}, {
3471da7f033dSHerbert Xu 		.alg = "xts(aes)",
34721aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
34732918aa8dSJarod Wilson 		.fips_allowed = 1,
3474da7f033dSHerbert Xu 		.suite = {
3475da7f033dSHerbert Xu 			.cipher = {
347621c8e720SArd Biesheuvel 				.enc = __VECS(aes_xts_enc_tv_template),
347721c8e720SArd Biesheuvel 				.dec = __VECS(aes_xts_dec_tv_template)
3478da7f033dSHerbert Xu 			}
3479da7f033dSHerbert Xu 		}
34800c01aed5SGeert Uytterhoeven 	}, {
34810840605eSJussi Kivilinna 		.alg = "xts(camellia)",
34820840605eSJussi Kivilinna 		.test = alg_test_skcipher,
34830840605eSJussi Kivilinna 		.suite = {
34840840605eSJussi Kivilinna 			.cipher = {
348521c8e720SArd Biesheuvel 				.enc = __VECS(camellia_xts_enc_tv_template),
348621c8e720SArd Biesheuvel 				.dec = __VECS(camellia_xts_dec_tv_template)
34870840605eSJussi Kivilinna 			}
34880840605eSJussi Kivilinna 		}
34890840605eSJussi Kivilinna 	}, {
34909b8b0405SJohannes Goetzfried 		.alg = "xts(cast6)",
34919b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
34929b8b0405SJohannes Goetzfried 		.suite = {
34939b8b0405SJohannes Goetzfried 			.cipher = {
349421c8e720SArd Biesheuvel 				.enc = __VECS(cast6_xts_enc_tv_template),
349521c8e720SArd Biesheuvel 				.dec = __VECS(cast6_xts_dec_tv_template)
34969b8b0405SJohannes Goetzfried 			}
34979b8b0405SJohannes Goetzfried 		}
34989b8b0405SJohannes Goetzfried 	}, {
349918be20b9SJussi Kivilinna 		.alg = "xts(serpent)",
350018be20b9SJussi Kivilinna 		.test = alg_test_skcipher,
350118be20b9SJussi Kivilinna 		.suite = {
350218be20b9SJussi Kivilinna 			.cipher = {
350321c8e720SArd Biesheuvel 				.enc = __VECS(serpent_xts_enc_tv_template),
350421c8e720SArd Biesheuvel 				.dec = __VECS(serpent_xts_dec_tv_template)
350518be20b9SJussi Kivilinna 			}
350618be20b9SJussi Kivilinna 		}
350718be20b9SJussi Kivilinna 	}, {
3508aed265b9SJussi Kivilinna 		.alg = "xts(twofish)",
3509aed265b9SJussi Kivilinna 		.test = alg_test_skcipher,
3510aed265b9SJussi Kivilinna 		.suite = {
3511aed265b9SJussi Kivilinna 			.cipher = {
351221c8e720SArd Biesheuvel 				.enc = __VECS(tf_xts_enc_tv_template),
351321c8e720SArd Biesheuvel 				.dec = __VECS(tf_xts_dec_tv_template)
3514aed265b9SJussi Kivilinna 			}
3515aed265b9SJussi Kivilinna 		}
3516a368f43dSGiovanni Cabiddu 	}, {
3517a368f43dSGiovanni Cabiddu 		.alg = "zlib-deflate",
3518a368f43dSGiovanni Cabiddu 		.test = alg_test_comp,
3519a368f43dSGiovanni Cabiddu 		.fips_allowed = 1,
3520a368f43dSGiovanni Cabiddu 		.suite = {
3521a368f43dSGiovanni Cabiddu 			.comp = {
3522a368f43dSGiovanni Cabiddu 				.comp = __VECS(zlib_deflate_comp_tv_template),
3523a368f43dSGiovanni Cabiddu 				.decomp = __VECS(zlib_deflate_decomp_tv_template)
3524a368f43dSGiovanni Cabiddu 			}
3525a368f43dSGiovanni Cabiddu 		}
3526da7f033dSHerbert Xu 	}
3527da7f033dSHerbert Xu };
3528da7f033dSHerbert Xu 
35295714758bSJussi Kivilinna static bool alg_test_descs_checked;
35305714758bSJussi Kivilinna 
35315714758bSJussi Kivilinna static void alg_test_descs_check_order(void)
35325714758bSJussi Kivilinna {
35335714758bSJussi Kivilinna 	int i;
35345714758bSJussi Kivilinna 
35355714758bSJussi Kivilinna 	/* only check once */
35365714758bSJussi Kivilinna 	if (alg_test_descs_checked)
35375714758bSJussi Kivilinna 		return;
35385714758bSJussi Kivilinna 
35395714758bSJussi Kivilinna 	alg_test_descs_checked = true;
35405714758bSJussi Kivilinna 
35415714758bSJussi Kivilinna 	for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) {
35425714758bSJussi Kivilinna 		int diff = strcmp(alg_test_descs[i - 1].alg,
35435714758bSJussi Kivilinna 				  alg_test_descs[i].alg);
35445714758bSJussi Kivilinna 
35455714758bSJussi Kivilinna 		if (WARN_ON(diff > 0)) {
35465714758bSJussi Kivilinna 			pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n",
35475714758bSJussi Kivilinna 				alg_test_descs[i - 1].alg,
35485714758bSJussi Kivilinna 				alg_test_descs[i].alg);
35495714758bSJussi Kivilinna 		}
35505714758bSJussi Kivilinna 
35515714758bSJussi Kivilinna 		if (WARN_ON(diff == 0)) {
35525714758bSJussi Kivilinna 			pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n",
35535714758bSJussi Kivilinna 				alg_test_descs[i].alg);
35545714758bSJussi Kivilinna 		}
35555714758bSJussi Kivilinna 	}
35565714758bSJussi Kivilinna }
35575714758bSJussi Kivilinna 
35581aa4ecd9SHerbert Xu static int alg_find_test(const char *alg)
3559da7f033dSHerbert Xu {
3560da7f033dSHerbert Xu 	int start = 0;
3561da7f033dSHerbert Xu 	int end = ARRAY_SIZE(alg_test_descs);
3562da7f033dSHerbert Xu 
3563da7f033dSHerbert Xu 	while (start < end) {
3564da7f033dSHerbert Xu 		int i = (start + end) / 2;
3565da7f033dSHerbert Xu 		int diff = strcmp(alg_test_descs[i].alg, alg);
3566da7f033dSHerbert Xu 
3567da7f033dSHerbert Xu 		if (diff > 0) {
3568da7f033dSHerbert Xu 			end = i;
3569da7f033dSHerbert Xu 			continue;
3570da7f033dSHerbert Xu 		}
3571da7f033dSHerbert Xu 
3572da7f033dSHerbert Xu 		if (diff < 0) {
3573da7f033dSHerbert Xu 			start = i + 1;
3574da7f033dSHerbert Xu 			continue;
3575da7f033dSHerbert Xu 		}
3576da7f033dSHerbert Xu 
35771aa4ecd9SHerbert Xu 		return i;
3578da7f033dSHerbert Xu 	}
3579da7f033dSHerbert Xu 
35801aa4ecd9SHerbert Xu 	return -1;
35811aa4ecd9SHerbert Xu }
35821aa4ecd9SHerbert Xu 
35831aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
35841aa4ecd9SHerbert Xu {
35851aa4ecd9SHerbert Xu 	int i;
3586a68f6610SHerbert Xu 	int j;
3587d12d6b6dSNeil Horman 	int rc;
35881aa4ecd9SHerbert Xu 
35899e5c9fe4SRichard W.M. Jones 	if (!fips_enabled && notests) {
35909e5c9fe4SRichard W.M. Jones 		printk_once(KERN_INFO "alg: self-tests disabled\n");
35919e5c9fe4SRichard W.M. Jones 		return 0;
35929e5c9fe4SRichard W.M. Jones 	}
35939e5c9fe4SRichard W.M. Jones 
35945714758bSJussi Kivilinna 	alg_test_descs_check_order();
35955714758bSJussi Kivilinna 
35961aa4ecd9SHerbert Xu 	if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
35971aa4ecd9SHerbert Xu 		char nalg[CRYPTO_MAX_ALG_NAME];
35981aa4ecd9SHerbert Xu 
35991aa4ecd9SHerbert Xu 		if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
36001aa4ecd9SHerbert Xu 		    sizeof(nalg))
36011aa4ecd9SHerbert Xu 			return -ENAMETOOLONG;
36021aa4ecd9SHerbert Xu 
36031aa4ecd9SHerbert Xu 		i = alg_find_test(nalg);
36041aa4ecd9SHerbert Xu 		if (i < 0)
36051aa4ecd9SHerbert Xu 			goto notest;
36061aa4ecd9SHerbert Xu 
3607a3bef3a3SJarod Wilson 		if (fips_enabled && !alg_test_descs[i].fips_allowed)
3608a3bef3a3SJarod Wilson 			goto non_fips_alg;
3609a3bef3a3SJarod Wilson 
3610941fb328SJarod Wilson 		rc = alg_test_cipher(alg_test_descs + i, driver, type, mask);
3611941fb328SJarod Wilson 		goto test_done;
36121aa4ecd9SHerbert Xu 	}
36131aa4ecd9SHerbert Xu 
36141aa4ecd9SHerbert Xu 	i = alg_find_test(alg);
3615a68f6610SHerbert Xu 	j = alg_find_test(driver);
3616a68f6610SHerbert Xu 	if (i < 0 && j < 0)
36171aa4ecd9SHerbert Xu 		goto notest;
36181aa4ecd9SHerbert Xu 
3619a68f6610SHerbert Xu 	if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
3620a68f6610SHerbert Xu 			     (j >= 0 && !alg_test_descs[j].fips_allowed)))
3621a3bef3a3SJarod Wilson 		goto non_fips_alg;
3622a3bef3a3SJarod Wilson 
3623a68f6610SHerbert Xu 	rc = 0;
3624a68f6610SHerbert Xu 	if (i >= 0)
3625a68f6610SHerbert Xu 		rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
36261aa4ecd9SHerbert Xu 					     type, mask);
3627032c8cacSCristian Stoica 	if (j >= 0 && j != i)
3628a68f6610SHerbert Xu 		rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
3629a68f6610SHerbert Xu 					     type, mask);
3630a68f6610SHerbert Xu 
3631941fb328SJarod Wilson test_done:
3632d12d6b6dSNeil Horman 	if (fips_enabled && rc)
3633d12d6b6dSNeil Horman 		panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
3634d12d6b6dSNeil Horman 
363529ecd4abSJarod Wilson 	if (fips_enabled && !rc)
36363e8cffd4SMasanari Iida 		pr_info("alg: self-tests for %s (%s) passed\n", driver, alg);
363729ecd4abSJarod Wilson 
3638d12d6b6dSNeil Horman 	return rc;
36391aa4ecd9SHerbert Xu 
36401aa4ecd9SHerbert Xu notest:
3641da7f033dSHerbert Xu 	printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
3642da7f033dSHerbert Xu 	return 0;
3643a3bef3a3SJarod Wilson non_fips_alg:
3644a3bef3a3SJarod Wilson 	return -EINVAL;
3645da7f033dSHerbert Xu }
36460b767f96SAlexander Shishkin 
3647326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
36480b767f96SAlexander Shishkin 
3649da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test);
3650