xref: /openbmc/linux/crypto/testmgr.c (revision 33607384)
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 aead_test_suite {
80da7f033dSHerbert Xu 	struct {
81b13b1e0cSEric Biggers 		const struct aead_testvec *vecs;
82da7f033dSHerbert Xu 		unsigned int count;
83da7f033dSHerbert Xu 	} enc, dec;
84da7f033dSHerbert Xu };
85da7f033dSHerbert Xu 
86da7f033dSHerbert Xu struct cipher_test_suite {
87da7f033dSHerbert Xu 	struct {
88b13b1e0cSEric Biggers 		const struct cipher_testvec *vecs;
89da7f033dSHerbert Xu 		unsigned int count;
90da7f033dSHerbert Xu 	} enc, dec;
91da7f033dSHerbert Xu };
92da7f033dSHerbert Xu 
93da7f033dSHerbert Xu struct comp_test_suite {
94da7f033dSHerbert Xu 	struct {
95b13b1e0cSEric Biggers 		const struct comp_testvec *vecs;
96da7f033dSHerbert Xu 		unsigned int count;
97da7f033dSHerbert Xu 	} comp, decomp;
98da7f033dSHerbert Xu };
99da7f033dSHerbert Xu 
100da7f033dSHerbert Xu struct hash_test_suite {
101b13b1e0cSEric Biggers 	const struct hash_testvec *vecs;
102da7f033dSHerbert Xu 	unsigned int count;
103da7f033dSHerbert Xu };
104da7f033dSHerbert Xu 
1057647d6ceSJarod Wilson struct cprng_test_suite {
106b13b1e0cSEric Biggers 	const struct cprng_testvec *vecs;
1077647d6ceSJarod Wilson 	unsigned int count;
1087647d6ceSJarod Wilson };
1097647d6ceSJarod Wilson 
11064d1cdfbSStephan Mueller struct drbg_test_suite {
111b13b1e0cSEric Biggers 	const struct drbg_testvec *vecs;
11264d1cdfbSStephan Mueller 	unsigned int count;
11364d1cdfbSStephan Mueller };
11464d1cdfbSStephan Mueller 
115946cc463STadeusz Struk struct akcipher_test_suite {
116b13b1e0cSEric Biggers 	const struct akcipher_testvec *vecs;
117946cc463STadeusz Struk 	unsigned int count;
118946cc463STadeusz Struk };
119946cc463STadeusz Struk 
120802c7f1cSSalvatore Benedetto struct kpp_test_suite {
121b13b1e0cSEric Biggers 	const struct kpp_testvec *vecs;
122802c7f1cSSalvatore Benedetto 	unsigned int count;
123802c7f1cSSalvatore Benedetto };
124802c7f1cSSalvatore Benedetto 
125da7f033dSHerbert Xu struct alg_test_desc {
126da7f033dSHerbert Xu 	const char *alg;
127da7f033dSHerbert Xu 	int (*test)(const struct alg_test_desc *desc, const char *driver,
128da7f033dSHerbert Xu 		    u32 type, u32 mask);
129a1915d51SJarod Wilson 	int fips_allowed;	/* set if alg is allowed in fips mode */
130da7f033dSHerbert Xu 
131da7f033dSHerbert Xu 	union {
132da7f033dSHerbert Xu 		struct aead_test_suite aead;
133da7f033dSHerbert Xu 		struct cipher_test_suite cipher;
134da7f033dSHerbert Xu 		struct comp_test_suite comp;
135da7f033dSHerbert Xu 		struct hash_test_suite hash;
1367647d6ceSJarod Wilson 		struct cprng_test_suite cprng;
13764d1cdfbSStephan Mueller 		struct drbg_test_suite drbg;
138946cc463STadeusz Struk 		struct akcipher_test_suite akcipher;
139802c7f1cSSalvatore Benedetto 		struct kpp_test_suite kpp;
140da7f033dSHerbert Xu 	} suite;
141da7f033dSHerbert Xu };
142da7f033dSHerbert Xu 
143b13b1e0cSEric Biggers static const unsigned int IDX[8] = {
144b13b1e0cSEric Biggers 	IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
145da7f033dSHerbert Xu 
146da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len)
147da7f033dSHerbert Xu {
148da7f033dSHerbert Xu 	print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
149da7f033dSHerbert Xu 			16, 1,
150da7f033dSHerbert Xu 			buf, len, false);
151da7f033dSHerbert Xu }
152da7f033dSHerbert Xu 
153f8b0d4d0SHerbert Xu static int testmgr_alloc_buf(char *buf[XBUFSIZE])
154f8b0d4d0SHerbert Xu {
155f8b0d4d0SHerbert Xu 	int i;
156f8b0d4d0SHerbert Xu 
157f8b0d4d0SHerbert Xu 	for (i = 0; i < XBUFSIZE; i++) {
158f8b0d4d0SHerbert Xu 		buf[i] = (void *)__get_free_page(GFP_KERNEL);
159f8b0d4d0SHerbert Xu 		if (!buf[i])
160f8b0d4d0SHerbert Xu 			goto err_free_buf;
161f8b0d4d0SHerbert Xu 	}
162f8b0d4d0SHerbert Xu 
163f8b0d4d0SHerbert Xu 	return 0;
164f8b0d4d0SHerbert Xu 
165f8b0d4d0SHerbert Xu err_free_buf:
166f8b0d4d0SHerbert Xu 	while (i-- > 0)
167f8b0d4d0SHerbert Xu 		free_page((unsigned long)buf[i]);
168f8b0d4d0SHerbert Xu 
169f8b0d4d0SHerbert Xu 	return -ENOMEM;
170f8b0d4d0SHerbert Xu }
171f8b0d4d0SHerbert Xu 
172f8b0d4d0SHerbert Xu static void testmgr_free_buf(char *buf[XBUFSIZE])
173f8b0d4d0SHerbert Xu {
174f8b0d4d0SHerbert Xu 	int i;
175f8b0d4d0SHerbert Xu 
176f8b0d4d0SHerbert Xu 	for (i = 0; i < XBUFSIZE; i++)
177f8b0d4d0SHerbert Xu 		free_page((unsigned long)buf[i]);
178f8b0d4d0SHerbert Xu }
179f8b0d4d0SHerbert Xu 
180466d7b9fSKamil Konieczny static int ahash_guard_result(char *result, char c, int size)
181466d7b9fSKamil Konieczny {
182466d7b9fSKamil Konieczny 	int i;
183466d7b9fSKamil Konieczny 
184466d7b9fSKamil Konieczny 	for (i = 0; i < size; i++) {
185466d7b9fSKamil Konieczny 		if (result[i] != c)
186466d7b9fSKamil Konieczny 			return -EINVAL;
187466d7b9fSKamil Konieczny 	}
188466d7b9fSKamil Konieczny 
189466d7b9fSKamil Konieczny 	return 0;
190466d7b9fSKamil Konieczny }
191466d7b9fSKamil Konieczny 
192018ba95cSWang, Rui Y static int ahash_partial_update(struct ahash_request **preq,
193b13b1e0cSEric Biggers 	struct crypto_ahash *tfm, const struct hash_testvec *template,
194018ba95cSWang, Rui Y 	void *hash_buff, int k, int temp, struct scatterlist *sg,
1957f397136SGilad Ben-Yossef 	const char *algo, char *result, struct crypto_wait *wait)
196018ba95cSWang, Rui Y {
197018ba95cSWang, Rui Y 	char *state;
198018ba95cSWang, Rui Y 	struct ahash_request *req;
199018ba95cSWang, Rui Y 	int statesize, ret = -EINVAL;
200da1729ceSJoey Pabalinas 	static const unsigned char guard[] = { 0x00, 0xba, 0xad, 0x00 };
201466d7b9fSKamil Konieczny 	int digestsize = crypto_ahash_digestsize(tfm);
202018ba95cSWang, Rui Y 
203018ba95cSWang, Rui Y 	req = *preq;
204018ba95cSWang, Rui Y 	statesize = crypto_ahash_statesize(
205018ba95cSWang, Rui Y 			crypto_ahash_reqtfm(req));
2067bcb87bcSJan Stancek 	state = kmalloc(statesize + sizeof(guard), GFP_KERNEL);
207018ba95cSWang, Rui Y 	if (!state) {
208cf3f9609SGilad Ben-Yossef 		pr_err("alg: hash: Failed to alloc state for %s\n", algo);
209018ba95cSWang, Rui Y 		goto out_nostate;
210018ba95cSWang, Rui Y 	}
2117bcb87bcSJan Stancek 	memcpy(state + statesize, guard, sizeof(guard));
212466d7b9fSKamil Konieczny 	memset(result, 1, digestsize);
213018ba95cSWang, Rui Y 	ret = crypto_ahash_export(req, state);
2147bcb87bcSJan Stancek 	WARN_ON(memcmp(state + statesize, guard, sizeof(guard)));
215018ba95cSWang, Rui Y 	if (ret) {
216cf3f9609SGilad Ben-Yossef 		pr_err("alg: hash: Failed to export() for %s\n", algo);
217018ba95cSWang, Rui Y 		goto out;
218018ba95cSWang, Rui Y 	}
219466d7b9fSKamil Konieczny 	ret = ahash_guard_result(result, 1, digestsize);
220466d7b9fSKamil Konieczny 	if (ret) {
221466d7b9fSKamil Konieczny 		pr_err("alg: hash: Failed, export used req->result for %s\n",
222466d7b9fSKamil Konieczny 		       algo);
223466d7b9fSKamil Konieczny 		goto out;
224466d7b9fSKamil Konieczny 	}
225018ba95cSWang, Rui Y 	ahash_request_free(req);
226018ba95cSWang, Rui Y 	req = ahash_request_alloc(tfm, GFP_KERNEL);
227018ba95cSWang, Rui Y 	if (!req) {
228018ba95cSWang, Rui Y 		pr_err("alg: hash: Failed to alloc request for %s\n", algo);
229018ba95cSWang, Rui Y 		goto out_noreq;
230018ba95cSWang, Rui Y 	}
231018ba95cSWang, Rui Y 	ahash_request_set_callback(req,
232018ba95cSWang, Rui Y 		CRYPTO_TFM_REQ_MAY_BACKLOG,
2337f397136SGilad Ben-Yossef 		crypto_req_done, wait);
234018ba95cSWang, Rui Y 
235018ba95cSWang, Rui Y 	memcpy(hash_buff, template->plaintext + temp,
236018ba95cSWang, Rui Y 		template->tap[k]);
237018ba95cSWang, Rui Y 	sg_init_one(&sg[0], hash_buff, template->tap[k]);
238018ba95cSWang, Rui Y 	ahash_request_set_crypt(req, sg, result, template->tap[k]);
239018ba95cSWang, Rui Y 	ret = crypto_ahash_import(req, state);
240018ba95cSWang, Rui Y 	if (ret) {
241018ba95cSWang, Rui Y 		pr_err("alg: hash: Failed to import() for %s\n", algo);
242018ba95cSWang, Rui Y 		goto out;
243018ba95cSWang, Rui Y 	}
244466d7b9fSKamil Konieczny 	ret = ahash_guard_result(result, 1, digestsize);
245466d7b9fSKamil Konieczny 	if (ret) {
246466d7b9fSKamil Konieczny 		pr_err("alg: hash: Failed, import used req->result for %s\n",
247466d7b9fSKamil Konieczny 		       algo);
248466d7b9fSKamil Konieczny 		goto out;
249466d7b9fSKamil Konieczny 	}
2507f397136SGilad Ben-Yossef 	ret = crypto_wait_req(crypto_ahash_update(req), wait);
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;
2757f397136SGilad Ben-Yossef 	struct crypto_wait wait;
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 
2897f397136SGilad Ben-Yossef 	crypto_init_wait(&wait);
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,
2987f397136SGilad Ben-Yossef 				   crypto_req_done, &wait);
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) {
3387f397136SGilad Ben-Yossef 			ret = crypto_wait_req(crypto_ahash_digest(req), &wait);
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 {
345466d7b9fSKamil Konieczny 			memset(result, 1, digest_size);
3467f397136SGilad Ben-Yossef 			ret = crypto_wait_req(crypto_ahash_init(req), &wait);
347a8f1a052SDavid S. Miller 			if (ret) {
348cf3f9609SGilad Ben-Yossef 				pr_err("alg: hash: init failed on test %d "
349a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
350a8f1a052SDavid S. Miller 				goto out;
351a8f1a052SDavid S. Miller 			}
352466d7b9fSKamil Konieczny 			ret = ahash_guard_result(result, 1, digest_size);
353466d7b9fSKamil Konieczny 			if (ret) {
354466d7b9fSKamil Konieczny 				pr_err("alg: hash: init failed on test %d "
355466d7b9fSKamil Konieczny 				       "for %s: used req->result\n", j, algo);
356466d7b9fSKamil Konieczny 				goto out;
357466d7b9fSKamil Konieczny 			}
3587f397136SGilad Ben-Yossef 			ret = crypto_wait_req(crypto_ahash_update(req), &wait);
359a8f1a052SDavid S. Miller 			if (ret) {
360cf3f9609SGilad Ben-Yossef 				pr_err("alg: hash: update failed on test %d "
361a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
362a8f1a052SDavid S. Miller 				goto out;
363a8f1a052SDavid S. Miller 			}
364466d7b9fSKamil Konieczny 			ret = ahash_guard_result(result, 1, digest_size);
365466d7b9fSKamil Konieczny 			if (ret) {
366466d7b9fSKamil Konieczny 				pr_err("alg: hash: update failed on test %d "
367466d7b9fSKamil Konieczny 				       "for %s: used req->result\n", j, algo);
368466d7b9fSKamil Konieczny 				goto out;
369466d7b9fSKamil Konieczny 			}
3707f397136SGilad Ben-Yossef 			ret = crypto_wait_req(crypto_ahash_final(req), &wait);
371a8f1a052SDavid S. Miller 			if (ret) {
372cf3f9609SGilad Ben-Yossef 				pr_err("alg: hash: final failed on test %d "
373a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
374a8f1a052SDavid S. Miller 				goto out;
375a8f1a052SDavid S. Miller 			}
376a8f1a052SDavid S. Miller 		}
377da7f033dSHerbert Xu 
378da7f033dSHerbert Xu 		if (memcmp(result, template[i].digest,
379da7f033dSHerbert Xu 			   crypto_ahash_digestsize(tfm))) {
380da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
381a0cfae59SHerbert Xu 			       j, algo);
382da7f033dSHerbert Xu 			hexdump(result, crypto_ahash_digestsize(tfm));
383da7f033dSHerbert Xu 			ret = -EINVAL;
384da7f033dSHerbert Xu 			goto out;
385da7f033dSHerbert Xu 		}
386da7f033dSHerbert Xu 	}
387da7f033dSHerbert Xu 
388da7f033dSHerbert Xu 	j = 0;
389da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
390da5ffe11SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
391da5ffe11SJussi Kivilinna 		if (align_offset != 0)
392da5ffe11SJussi Kivilinna 			break;
393da5ffe11SJussi Kivilinna 
3945f2b424eSCristian Stoica 		if (!template[i].np)
3955f2b424eSCristian Stoica 			continue;
3965f2b424eSCristian Stoica 
397da7f033dSHerbert Xu 		j++;
398e93acd6fSAndrew Lutomirski 		memset(result, 0, digest_size);
399da7f033dSHerbert Xu 
400da7f033dSHerbert Xu 		temp = 0;
401da7f033dSHerbert Xu 		sg_init_table(sg, template[i].np);
402fd57f22aSHerbert Xu 		ret = -EINVAL;
403da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
404fd57f22aSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
405fd57f22aSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
406fd57f22aSHerbert Xu 				goto out;
407da7f033dSHerbert Xu 			sg_set_buf(&sg[k],
408da7f033dSHerbert Xu 				   memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
409da7f033dSHerbert Xu 					  offset_in_page(IDX[k]),
410da7f033dSHerbert Xu 					  template[i].plaintext + temp,
411da7f033dSHerbert Xu 					  template[i].tap[k]),
412da7f033dSHerbert Xu 				   template[i].tap[k]);
413da7f033dSHerbert Xu 			temp += template[i].tap[k];
414da7f033dSHerbert Xu 		}
415da7f033dSHerbert Xu 
416da7f033dSHerbert Xu 		if (template[i].ksize) {
41729b77e5dSHoria Geanta 			if (template[i].ksize > MAX_KEYLEN) {
41829b77e5dSHoria Geanta 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
4195f2b424eSCristian Stoica 				       j, algo, template[i].ksize, MAX_KEYLEN);
42029b77e5dSHoria Geanta 				ret = -EINVAL;
42129b77e5dSHoria Geanta 				goto out;
42229b77e5dSHoria Geanta 			}
423da7f033dSHerbert Xu 			crypto_ahash_clear_flags(tfm, ~0);
42429b77e5dSHoria Geanta 			memcpy(key, template[i].key, template[i].ksize);
4255f2b424eSCristian Stoica 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
426da7f033dSHerbert Xu 
427da7f033dSHerbert Xu 			if (ret) {
428da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: setkey "
429da7f033dSHerbert Xu 				       "failed on chunking test %d "
4305f2b424eSCristian Stoica 				       "for %s: ret=%d\n", j, algo, -ret);
431da7f033dSHerbert Xu 				goto out;
432da7f033dSHerbert Xu 			}
433da7f033dSHerbert Xu 		}
434da7f033dSHerbert Xu 
4355f2b424eSCristian Stoica 		ahash_request_set_crypt(req, sg, result, template[i].psize);
4367f397136SGilad Ben-Yossef 		ret = crypto_wait_req(crypto_ahash_digest(req), &wait);
4377f397136SGilad Ben-Yossef 		if (ret) {
4387f397136SGilad Ben-Yossef 			pr_err("alg: hash: digest failed on chunking test %d for %s: ret=%d\n",
4397f397136SGilad Ben-Yossef 			       j, algo, -ret);
440da7f033dSHerbert Xu 			goto out;
441da7f033dSHerbert Xu 		}
442da7f033dSHerbert Xu 
443da7f033dSHerbert Xu 		if (memcmp(result, template[i].digest,
444da7f033dSHerbert Xu 			   crypto_ahash_digestsize(tfm))) {
445da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: Chunking test %d "
446da7f033dSHerbert Xu 			       "failed for %s\n", j, algo);
447da7f033dSHerbert Xu 			hexdump(result, crypto_ahash_digestsize(tfm));
448da7f033dSHerbert Xu 			ret = -EINVAL;
449da7f033dSHerbert Xu 			goto out;
450da7f033dSHerbert Xu 		}
451da7f033dSHerbert Xu 	}
452da7f033dSHerbert Xu 
453018ba95cSWang, Rui Y 	/* partial update exercise */
454018ba95cSWang, Rui Y 	j = 0;
455018ba95cSWang, Rui Y 	for (i = 0; i < tcount; i++) {
456018ba95cSWang, Rui Y 		/* alignment tests are only done with continuous buffers */
457018ba95cSWang, Rui Y 		if (align_offset != 0)
458018ba95cSWang, Rui Y 			break;
459018ba95cSWang, Rui Y 
460018ba95cSWang, Rui Y 		if (template[i].np < 2)
461018ba95cSWang, Rui Y 			continue;
462018ba95cSWang, Rui Y 
463018ba95cSWang, Rui Y 		j++;
464e93acd6fSAndrew Lutomirski 		memset(result, 0, digest_size);
465018ba95cSWang, Rui Y 
466018ba95cSWang, Rui Y 		ret = -EINVAL;
467018ba95cSWang, Rui Y 		hash_buff = xbuf[0];
468018ba95cSWang, Rui Y 		memcpy(hash_buff, template[i].plaintext,
469018ba95cSWang, Rui Y 			template[i].tap[0]);
470018ba95cSWang, Rui Y 		sg_init_one(&sg[0], hash_buff, template[i].tap[0]);
471018ba95cSWang, Rui Y 
472018ba95cSWang, Rui Y 		if (template[i].ksize) {
473018ba95cSWang, Rui Y 			crypto_ahash_clear_flags(tfm, ~0);
474018ba95cSWang, Rui Y 			if (template[i].ksize > MAX_KEYLEN) {
475018ba95cSWang, Rui Y 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
476018ba95cSWang, Rui Y 					j, algo, template[i].ksize, MAX_KEYLEN);
477018ba95cSWang, Rui Y 				ret = -EINVAL;
478018ba95cSWang, Rui Y 				goto out;
479018ba95cSWang, Rui Y 			}
480018ba95cSWang, Rui Y 			memcpy(key, template[i].key, template[i].ksize);
481018ba95cSWang, Rui Y 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
482018ba95cSWang, Rui Y 			if (ret) {
483018ba95cSWang, Rui Y 				pr_err("alg: hash: setkey failed on test %d for %s: ret=%d\n",
484018ba95cSWang, Rui Y 					j, algo, -ret);
485018ba95cSWang, Rui Y 				goto out;
486018ba95cSWang, Rui Y 			}
487018ba95cSWang, Rui Y 		}
488018ba95cSWang, Rui Y 
489018ba95cSWang, Rui Y 		ahash_request_set_crypt(req, sg, result, template[i].tap[0]);
4907f397136SGilad Ben-Yossef 		ret = crypto_wait_req(crypto_ahash_init(req), &wait);
491018ba95cSWang, Rui Y 		if (ret) {
492cf3f9609SGilad Ben-Yossef 			pr_err("alg: hash: init failed on test %d for %s: ret=%d\n",
493018ba95cSWang, Rui Y 				j, algo, -ret);
494018ba95cSWang, Rui Y 			goto out;
495018ba95cSWang, Rui Y 		}
4967f397136SGilad Ben-Yossef 		ret = crypto_wait_req(crypto_ahash_update(req), &wait);
497018ba95cSWang, Rui Y 		if (ret) {
498cf3f9609SGilad Ben-Yossef 			pr_err("alg: hash: update failed on test %d for %s: ret=%d\n",
499018ba95cSWang, Rui Y 				j, algo, -ret);
500018ba95cSWang, Rui Y 			goto out;
501018ba95cSWang, Rui Y 		}
502018ba95cSWang, Rui Y 
503018ba95cSWang, Rui Y 		temp = template[i].tap[0];
504018ba95cSWang, Rui Y 		for (k = 1; k < template[i].np; k++) {
505018ba95cSWang, Rui Y 			ret = ahash_partial_update(&req, tfm, &template[i],
506018ba95cSWang, Rui Y 				hash_buff, k, temp, &sg[0], algo, result,
5077f397136SGilad Ben-Yossef 				&wait);
508018ba95cSWang, Rui Y 			if (ret) {
509cf3f9609SGilad Ben-Yossef 				pr_err("alg: hash: partial update failed on test %d for %s: ret=%d\n",
510018ba95cSWang, Rui Y 					j, algo, -ret);
511018ba95cSWang, Rui Y 				goto out_noreq;
512018ba95cSWang, Rui Y 			}
513018ba95cSWang, Rui Y 			temp += template[i].tap[k];
514018ba95cSWang, Rui Y 		}
5157f397136SGilad Ben-Yossef 		ret = crypto_wait_req(crypto_ahash_final(req), &wait);
516018ba95cSWang, Rui Y 		if (ret) {
517cf3f9609SGilad Ben-Yossef 			pr_err("alg: hash: final failed on test %d for %s: ret=%d\n",
518018ba95cSWang, Rui Y 				j, algo, -ret);
519018ba95cSWang, Rui Y 			goto out;
520018ba95cSWang, Rui Y 		}
521018ba95cSWang, Rui Y 		if (memcmp(result, template[i].digest,
522018ba95cSWang, Rui Y 			   crypto_ahash_digestsize(tfm))) {
523018ba95cSWang, Rui Y 			pr_err("alg: hash: Partial Test %d failed for %s\n",
524018ba95cSWang, Rui Y 			       j, algo);
525018ba95cSWang, Rui Y 			hexdump(result, crypto_ahash_digestsize(tfm));
526018ba95cSWang, Rui Y 			ret = -EINVAL;
527018ba95cSWang, Rui Y 			goto out;
528018ba95cSWang, Rui Y 		}
529018ba95cSWang, Rui Y 	}
530018ba95cSWang, Rui Y 
531da7f033dSHerbert Xu 	ret = 0;
532da7f033dSHerbert Xu 
533da7f033dSHerbert Xu out:
534da7f033dSHerbert Xu 	ahash_request_free(req);
535da7f033dSHerbert Xu out_noreq:
536f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
537f8b0d4d0SHerbert Xu out_nobuf:
53829b77e5dSHoria Geanta 	kfree(key);
53929b77e5dSHoria Geanta 	kfree(result);
540da7f033dSHerbert Xu 	return ret;
541da7f033dSHerbert Xu }
542da7f033dSHerbert Xu 
543b13b1e0cSEric Biggers static int test_hash(struct crypto_ahash *tfm,
544b13b1e0cSEric Biggers 		     const struct hash_testvec *template,
545da5ffe11SJussi Kivilinna 		     unsigned int tcount, bool use_digest)
546da5ffe11SJussi Kivilinna {
547da5ffe11SJussi Kivilinna 	unsigned int alignmask;
548da5ffe11SJussi Kivilinna 	int ret;
549da5ffe11SJussi Kivilinna 
550da5ffe11SJussi Kivilinna 	ret = __test_hash(tfm, template, tcount, use_digest, 0);
551da5ffe11SJussi Kivilinna 	if (ret)
552da5ffe11SJussi Kivilinna 		return ret;
553da5ffe11SJussi Kivilinna 
554da5ffe11SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
555da5ffe11SJussi Kivilinna 	ret = __test_hash(tfm, template, tcount, use_digest, 1);
556da5ffe11SJussi Kivilinna 	if (ret)
557da5ffe11SJussi Kivilinna 		return ret;
558da5ffe11SJussi Kivilinna 
559da5ffe11SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
560da5ffe11SJussi Kivilinna 	if (alignmask) {
561da5ffe11SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
562da5ffe11SJussi Kivilinna 		ret = __test_hash(tfm, template, tcount, use_digest,
563da5ffe11SJussi Kivilinna 				  alignmask + 1);
564da5ffe11SJussi Kivilinna 		if (ret)
565da5ffe11SJussi Kivilinna 			return ret;
566da5ffe11SJussi Kivilinna 	}
567da5ffe11SJussi Kivilinna 
568da5ffe11SJussi Kivilinna 	return 0;
569da5ffe11SJussi Kivilinna }
570da5ffe11SJussi Kivilinna 
571d8a32ac2SJussi Kivilinna static int __test_aead(struct crypto_aead *tfm, int enc,
572b13b1e0cSEric Biggers 		       const struct aead_testvec *template, unsigned int tcount,
57358dcf548SJussi Kivilinna 		       const bool diff_dst, const int align_offset)
574da7f033dSHerbert Xu {
575da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
576da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
577f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
578da7f033dSHerbert Xu 	char *q;
579da7f033dSHerbert Xu 	char *key;
580da7f033dSHerbert Xu 	struct aead_request *req;
581d8a32ac2SJussi Kivilinna 	struct scatterlist *sg;
582d8a32ac2SJussi Kivilinna 	struct scatterlist *sgout;
583d8a32ac2SJussi Kivilinna 	const char *e, *d;
5847f397136SGilad Ben-Yossef 	struct crypto_wait wait;
585424a5da6SCristian Stoica 	unsigned int authsize, iv_len;
586da7f033dSHerbert Xu 	void *input;
587d8a32ac2SJussi Kivilinna 	void *output;
588da7f033dSHerbert Xu 	void *assoc;
5899bac019dSTadeusz Struk 	char *iv;
590f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
591d8a32ac2SJussi Kivilinna 	char *xoutbuf[XBUFSIZE];
592f8b0d4d0SHerbert Xu 	char *axbuf[XBUFSIZE];
593f8b0d4d0SHerbert Xu 
5949bac019dSTadeusz Struk 	iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
5959bac019dSTadeusz Struk 	if (!iv)
5969bac019dSTadeusz Struk 		return ret;
59729b77e5dSHoria Geanta 	key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
59829b77e5dSHoria Geanta 	if (!key)
59929b77e5dSHoria Geanta 		goto out_noxbuf;
600f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
601f8b0d4d0SHerbert Xu 		goto out_noxbuf;
602f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(axbuf))
603f8b0d4d0SHerbert Xu 		goto out_noaxbuf;
604d8a32ac2SJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
605d8a32ac2SJussi Kivilinna 		goto out_nooutbuf;
606d8a32ac2SJussi Kivilinna 
607d8a32ac2SJussi Kivilinna 	/* avoid "the frame size is larger than 1024 bytes" compiler warning */
6088a525fcdSHerbert Xu 	sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 4 : 2), GFP_KERNEL);
609d8a32ac2SJussi Kivilinna 	if (!sg)
610d8a32ac2SJussi Kivilinna 		goto out_nosg;
6118a525fcdSHerbert Xu 	sgout = &sg[16];
612d8a32ac2SJussi Kivilinna 
613d8a32ac2SJussi Kivilinna 	if (diff_dst)
614d8a32ac2SJussi Kivilinna 		d = "-ddst";
615d8a32ac2SJussi Kivilinna 	else
616d8a32ac2SJussi Kivilinna 		d = "";
617d8a32ac2SJussi Kivilinna 
618da7f033dSHerbert Xu 	if (enc == ENCRYPT)
619da7f033dSHerbert Xu 		e = "encryption";
620da7f033dSHerbert Xu 	else
621da7f033dSHerbert Xu 		e = "decryption";
622da7f033dSHerbert Xu 
6237f397136SGilad Ben-Yossef 	crypto_init_wait(&wait);
624da7f033dSHerbert Xu 
625da7f033dSHerbert Xu 	req = aead_request_alloc(tfm, GFP_KERNEL);
626da7f033dSHerbert Xu 	if (!req) {
627d8a32ac2SJussi Kivilinna 		pr_err("alg: aead%s: Failed to allocate request for %s\n",
628d8a32ac2SJussi Kivilinna 		       d, algo);
629da7f033dSHerbert Xu 		goto out;
630da7f033dSHerbert Xu 	}
631da7f033dSHerbert Xu 
632da7f033dSHerbert Xu 	aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
6337f397136SGilad Ben-Yossef 				  crypto_req_done, &wait);
634da7f033dSHerbert Xu 
635abfa7f43SJerome Marchand 	iv_len = crypto_aead_ivsize(tfm);
636abfa7f43SJerome Marchand 
637da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
63805b1d338SCristian Stoica 		if (template[i].np)
63905b1d338SCristian Stoica 			continue;
64005b1d338SCristian Stoica 
641da7f033dSHerbert Xu 		j++;
642da7f033dSHerbert Xu 
64358dcf548SJussi Kivilinna 		/* some templates have no input data but they will
644da7f033dSHerbert Xu 		 * touch input
645da7f033dSHerbert Xu 		 */
646da7f033dSHerbert Xu 		input = xbuf[0];
64758dcf548SJussi Kivilinna 		input += align_offset;
648da7f033dSHerbert Xu 		assoc = axbuf[0];
649da7f033dSHerbert Xu 
650fd57f22aSHerbert Xu 		ret = -EINVAL;
65158dcf548SJussi Kivilinna 		if (WARN_ON(align_offset + template[i].ilen >
65258dcf548SJussi Kivilinna 			    PAGE_SIZE || template[i].alen > PAGE_SIZE))
653fd57f22aSHerbert Xu 			goto out;
654fd57f22aSHerbert Xu 
655da7f033dSHerbert Xu 		memcpy(input, template[i].input, template[i].ilen);
656da7f033dSHerbert Xu 		memcpy(assoc, template[i].assoc, template[i].alen);
657da7f033dSHerbert Xu 		if (template[i].iv)
658424a5da6SCristian Stoica 			memcpy(iv, template[i].iv, iv_len);
659da7f033dSHerbert Xu 		else
660424a5da6SCristian Stoica 			memset(iv, 0, iv_len);
661da7f033dSHerbert Xu 
662da7f033dSHerbert Xu 		crypto_aead_clear_flags(tfm, ~0);
663da7f033dSHerbert Xu 		if (template[i].wk)
66405b1d338SCristian Stoica 			crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
665da7f033dSHerbert Xu 
66629b77e5dSHoria Geanta 		if (template[i].klen > MAX_KEYLEN) {
66729b77e5dSHoria Geanta 			pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
66829b77e5dSHoria Geanta 			       d, j, algo, template[i].klen,
66929b77e5dSHoria Geanta 			       MAX_KEYLEN);
67029b77e5dSHoria Geanta 			ret = -EINVAL;
67129b77e5dSHoria Geanta 			goto out;
67229b77e5dSHoria Geanta 		}
67329b77e5dSHoria Geanta 		memcpy(key, template[i].key, template[i].klen);
674da7f033dSHerbert Xu 
67505b1d338SCristian Stoica 		ret = crypto_aead_setkey(tfm, key, template[i].klen);
6760fae0c1eSYanjiang Jin 		if (template[i].fail == !ret) {
677d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n",
678d8a32ac2SJussi Kivilinna 			       d, j, algo, crypto_aead_get_flags(tfm));
679da7f033dSHerbert Xu 			goto out;
680da7f033dSHerbert Xu 		} else if (ret)
681da7f033dSHerbert Xu 			continue;
682da7f033dSHerbert Xu 
683da7f033dSHerbert Xu 		authsize = abs(template[i].rlen - template[i].ilen);
684da7f033dSHerbert Xu 		ret = crypto_aead_setauthsize(tfm, authsize);
685da7f033dSHerbert Xu 		if (ret) {
686d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n",
687d8a32ac2SJussi Kivilinna 			       d, authsize, j, algo);
688da7f033dSHerbert Xu 			goto out;
689da7f033dSHerbert Xu 		}
690da7f033dSHerbert Xu 
6918a525fcdSHerbert Xu 		k = !!template[i].alen;
6928a525fcdSHerbert Xu 		sg_init_table(sg, k + 1);
6938a525fcdSHerbert Xu 		sg_set_buf(&sg[0], assoc, template[i].alen);
6948a525fcdSHerbert Xu 		sg_set_buf(&sg[k], input,
69505b1d338SCristian Stoica 			   template[i].ilen + (enc ? authsize : 0));
696d8a32ac2SJussi Kivilinna 		output = input;
697d8a32ac2SJussi Kivilinna 
6988a525fcdSHerbert Xu 		if (diff_dst) {
6998a525fcdSHerbert Xu 			sg_init_table(sgout, k + 1);
7008a525fcdSHerbert Xu 			sg_set_buf(&sgout[0], assoc, template[i].alen);
7018a525fcdSHerbert Xu 
7028a525fcdSHerbert Xu 			output = xoutbuf[0];
7038a525fcdSHerbert Xu 			output += align_offset;
7048a525fcdSHerbert Xu 			sg_set_buf(&sgout[k], output,
7058a525fcdSHerbert Xu 				   template[i].rlen + (enc ? 0 : authsize));
7068a525fcdSHerbert Xu 		}
707da7f033dSHerbert Xu 
708d8a32ac2SJussi Kivilinna 		aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
709da7f033dSHerbert Xu 				       template[i].ilen, iv);
710da7f033dSHerbert Xu 
7118a525fcdSHerbert Xu 		aead_request_set_ad(req, template[i].alen);
712da7f033dSHerbert Xu 
7137f397136SGilad Ben-Yossef 		ret = crypto_wait_req(enc ? crypto_aead_encrypt(req)
7147f397136SGilad Ben-Yossef 				      : crypto_aead_decrypt(req), &wait);
715da7f033dSHerbert Xu 
716da7f033dSHerbert Xu 		switch (ret) {
717da7f033dSHerbert Xu 		case 0:
718e44a1b44SJarod Wilson 			if (template[i].novrfy) {
719e44a1b44SJarod Wilson 				/* verification was supposed to fail */
720d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n",
721d8a32ac2SJussi Kivilinna 				       d, e, j, algo);
722e44a1b44SJarod Wilson 				/* so really, we got a bad message */
723e44a1b44SJarod Wilson 				ret = -EBADMSG;
724e44a1b44SJarod Wilson 				goto out;
725e44a1b44SJarod Wilson 			}
726da7f033dSHerbert Xu 			break;
727e44a1b44SJarod Wilson 		case -EBADMSG:
728e44a1b44SJarod Wilson 			if (template[i].novrfy)
729e44a1b44SJarod Wilson 				/* verification failure was expected */
730e44a1b44SJarod Wilson 				continue;
731da7f033dSHerbert Xu 			/* fall through */
732da7f033dSHerbert Xu 		default:
733d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n",
734d8a32ac2SJussi Kivilinna 			       d, e, j, algo, -ret);
735da7f033dSHerbert Xu 			goto out;
736da7f033dSHerbert Xu 		}
737da7f033dSHerbert Xu 
738d8a32ac2SJussi Kivilinna 		q = output;
739da7f033dSHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
740d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Test %d failed on %s for %s\n",
741d8a32ac2SJussi Kivilinna 			       d, j, e, algo);
742da7f033dSHerbert Xu 			hexdump(q, template[i].rlen);
743da7f033dSHerbert Xu 			ret = -EINVAL;
744da7f033dSHerbert Xu 			goto out;
745da7f033dSHerbert Xu 		}
746da7f033dSHerbert Xu 	}
747da7f033dSHerbert Xu 
748da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
74958dcf548SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
75058dcf548SJussi Kivilinna 		if (align_offset != 0)
75158dcf548SJussi Kivilinna 			break;
75258dcf548SJussi Kivilinna 
75305b1d338SCristian Stoica 		if (!template[i].np)
75405b1d338SCristian Stoica 			continue;
75505b1d338SCristian Stoica 
756da7f033dSHerbert Xu 		j++;
757da7f033dSHerbert Xu 
758da7f033dSHerbert Xu 		if (template[i].iv)
759abfa7f43SJerome Marchand 			memcpy(iv, template[i].iv, iv_len);
760da7f033dSHerbert Xu 		else
761da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
762da7f033dSHerbert Xu 
763da7f033dSHerbert Xu 		crypto_aead_clear_flags(tfm, ~0);
764da7f033dSHerbert Xu 		if (template[i].wk)
76505b1d338SCristian Stoica 			crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
76629b77e5dSHoria Geanta 		if (template[i].klen > MAX_KEYLEN) {
76729b77e5dSHoria Geanta 			pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
76805b1d338SCristian Stoica 			       d, j, algo, template[i].klen, MAX_KEYLEN);
76929b77e5dSHoria Geanta 			ret = -EINVAL;
77029b77e5dSHoria Geanta 			goto out;
77129b77e5dSHoria Geanta 		}
77229b77e5dSHoria Geanta 		memcpy(key, template[i].key, template[i].klen);
773da7f033dSHerbert Xu 
774da7f033dSHerbert Xu 		ret = crypto_aead_setkey(tfm, key, template[i].klen);
7750fae0c1eSYanjiang Jin 		if (template[i].fail == !ret) {
776d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n",
777d8a32ac2SJussi Kivilinna 			       d, j, algo, crypto_aead_get_flags(tfm));
778da7f033dSHerbert Xu 			goto out;
779da7f033dSHerbert Xu 		} else if (ret)
780da7f033dSHerbert Xu 			continue;
781da7f033dSHerbert Xu 
782da7f033dSHerbert Xu 		authsize = abs(template[i].rlen - template[i].ilen);
783da7f033dSHerbert Xu 
784da7f033dSHerbert Xu 		ret = -EINVAL;
7858a525fcdSHerbert Xu 		sg_init_table(sg, template[i].anp + template[i].np);
786d8a32ac2SJussi Kivilinna 		if (diff_dst)
7878a525fcdSHerbert Xu 			sg_init_table(sgout, template[i].anp + template[i].np);
7888a525fcdSHerbert Xu 
7898a525fcdSHerbert Xu 		ret = -EINVAL;
7908a525fcdSHerbert Xu 		for (k = 0, temp = 0; k < template[i].anp; k++) {
7918a525fcdSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
7928a525fcdSHerbert Xu 				    template[i].atap[k] > PAGE_SIZE))
7938a525fcdSHerbert Xu 				goto out;
7948a525fcdSHerbert Xu 			sg_set_buf(&sg[k],
7958a525fcdSHerbert Xu 				   memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
7968a525fcdSHerbert Xu 					  offset_in_page(IDX[k]),
7978a525fcdSHerbert Xu 					  template[i].assoc + temp,
7988a525fcdSHerbert Xu 					  template[i].atap[k]),
7998a525fcdSHerbert Xu 				   template[i].atap[k]);
8008a525fcdSHerbert Xu 			if (diff_dst)
8018a525fcdSHerbert Xu 				sg_set_buf(&sgout[k],
8028a525fcdSHerbert Xu 					   axbuf[IDX[k] >> PAGE_SHIFT] +
8038a525fcdSHerbert Xu 					   offset_in_page(IDX[k]),
8048a525fcdSHerbert Xu 					   template[i].atap[k]);
8058a525fcdSHerbert Xu 			temp += template[i].atap[k];
8068a525fcdSHerbert Xu 		}
8078a525fcdSHerbert Xu 
808da7f033dSHerbert Xu 		for (k = 0, temp = 0; k < template[i].np; k++) {
809da7f033dSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
810da7f033dSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
811da7f033dSHerbert Xu 				goto out;
812da7f033dSHerbert Xu 
81305b1d338SCristian Stoica 			q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
81405b1d338SCristian Stoica 			memcpy(q, template[i].input + temp, template[i].tap[k]);
8158a525fcdSHerbert Xu 			sg_set_buf(&sg[template[i].anp + k],
8168a525fcdSHerbert Xu 				   q, template[i].tap[k]);
817d8a32ac2SJussi Kivilinna 
818d8a32ac2SJussi Kivilinna 			if (diff_dst) {
819d8a32ac2SJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
820d8a32ac2SJussi Kivilinna 				    offset_in_page(IDX[k]);
821d8a32ac2SJussi Kivilinna 
822d8a32ac2SJussi Kivilinna 				memset(q, 0, template[i].tap[k]);
823d8a32ac2SJussi Kivilinna 
8248a525fcdSHerbert Xu 				sg_set_buf(&sgout[template[i].anp + k],
8258a525fcdSHerbert Xu 					   q, template[i].tap[k]);
826d8a32ac2SJussi Kivilinna 			}
827d8a32ac2SJussi Kivilinna 
8288ec25c51SHoria Geanta 			n = template[i].tap[k];
8298ec25c51SHoria Geanta 			if (k == template[i].np - 1 && enc)
8308ec25c51SHoria Geanta 				n += authsize;
8318ec25c51SHoria Geanta 			if (offset_in_page(q) + n < PAGE_SIZE)
8328ec25c51SHoria Geanta 				q[n] = 0;
8338ec25c51SHoria Geanta 
834da7f033dSHerbert Xu 			temp += template[i].tap[k];
835da7f033dSHerbert Xu 		}
836da7f033dSHerbert Xu 
837da7f033dSHerbert Xu 		ret = crypto_aead_setauthsize(tfm, authsize);
838da7f033dSHerbert Xu 		if (ret) {
839d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n",
840d8a32ac2SJussi Kivilinna 			       d, authsize, j, algo);
841da7f033dSHerbert Xu 			goto out;
842da7f033dSHerbert Xu 		}
843da7f033dSHerbert Xu 
844da7f033dSHerbert Xu 		if (enc) {
8458a525fcdSHerbert Xu 			if (WARN_ON(sg[template[i].anp + k - 1].offset +
8468a525fcdSHerbert Xu 				    sg[template[i].anp + k - 1].length +
8478a525fcdSHerbert Xu 				    authsize > PAGE_SIZE)) {
848da7f033dSHerbert Xu 				ret = -EINVAL;
849da7f033dSHerbert Xu 				goto out;
850da7f033dSHerbert Xu 			}
851da7f033dSHerbert Xu 
852d8a32ac2SJussi Kivilinna 			if (diff_dst)
8538a525fcdSHerbert Xu 				sgout[template[i].anp + k - 1].length +=
8548a525fcdSHerbert Xu 					authsize;
8558a525fcdSHerbert Xu 			sg[template[i].anp + k - 1].length += authsize;
856da7f033dSHerbert Xu 		}
857da7f033dSHerbert Xu 
858d8a32ac2SJussi Kivilinna 		aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
859da7f033dSHerbert Xu 				       template[i].ilen,
860da7f033dSHerbert Xu 				       iv);
861da7f033dSHerbert Xu 
8628a525fcdSHerbert Xu 		aead_request_set_ad(req, template[i].alen);
863da7f033dSHerbert Xu 
8647f397136SGilad Ben-Yossef 		ret = crypto_wait_req(enc ? crypto_aead_encrypt(req)
8657f397136SGilad Ben-Yossef 				      : crypto_aead_decrypt(req), &wait);
866da7f033dSHerbert Xu 
867da7f033dSHerbert Xu 		switch (ret) {
868da7f033dSHerbert Xu 		case 0:
869e44a1b44SJarod Wilson 			if (template[i].novrfy) {
870e44a1b44SJarod Wilson 				/* verification was supposed to fail */
871d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n",
872d8a32ac2SJussi Kivilinna 				       d, e, j, algo);
873e44a1b44SJarod Wilson 				/* so really, we got a bad message */
874e44a1b44SJarod Wilson 				ret = -EBADMSG;
875e44a1b44SJarod Wilson 				goto out;
876e44a1b44SJarod Wilson 			}
877da7f033dSHerbert Xu 			break;
878e44a1b44SJarod Wilson 		case -EBADMSG:
879e44a1b44SJarod Wilson 			if (template[i].novrfy)
880e44a1b44SJarod Wilson 				/* verification failure was expected */
881e44a1b44SJarod Wilson 				continue;
882da7f033dSHerbert Xu 			/* fall through */
883da7f033dSHerbert Xu 		default:
884d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n",
885d8a32ac2SJussi Kivilinna 			       d, e, j, algo, -ret);
886da7f033dSHerbert Xu 			goto out;
887da7f033dSHerbert Xu 		}
888da7f033dSHerbert Xu 
889da7f033dSHerbert Xu 		ret = -EINVAL;
890da7f033dSHerbert Xu 		for (k = 0, temp = 0; k < template[i].np; k++) {
891d8a32ac2SJussi Kivilinna 			if (diff_dst)
892d8a32ac2SJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
893d8a32ac2SJussi Kivilinna 				    offset_in_page(IDX[k]);
894d8a32ac2SJussi Kivilinna 			else
895da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
896da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
897da7f033dSHerbert Xu 
898da7f033dSHerbert Xu 			n = template[i].tap[k];
899da7f033dSHerbert Xu 			if (k == template[i].np - 1)
900da7f033dSHerbert Xu 				n += enc ? authsize : -authsize;
901da7f033dSHerbert Xu 
902da7f033dSHerbert Xu 			if (memcmp(q, template[i].result + temp, n)) {
903d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n",
904d8a32ac2SJussi Kivilinna 				       d, j, e, k, algo);
905da7f033dSHerbert Xu 				hexdump(q, n);
906da7f033dSHerbert Xu 				goto out;
907da7f033dSHerbert Xu 			}
908da7f033dSHerbert Xu 
909da7f033dSHerbert Xu 			q += n;
910da7f033dSHerbert Xu 			if (k == template[i].np - 1 && !enc) {
911d8a32ac2SJussi Kivilinna 				if (!diff_dst &&
912d8a32ac2SJussi Kivilinna 					memcmp(q, template[i].input +
913da7f033dSHerbert Xu 					      temp + n, authsize))
914da7f033dSHerbert Xu 					n = authsize;
915da7f033dSHerbert Xu 				else
916da7f033dSHerbert Xu 					n = 0;
917da7f033dSHerbert Xu 			} else {
91805b1d338SCristian Stoica 				for (n = 0; offset_in_page(q + n) && q[n]; n++)
919da7f033dSHerbert Xu 					;
920da7f033dSHerbert Xu 			}
921da7f033dSHerbert Xu 			if (n) {
922d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
923d8a32ac2SJussi Kivilinna 				       d, j, e, k, algo, n);
924da7f033dSHerbert Xu 				hexdump(q, n);
925da7f033dSHerbert Xu 				goto out;
926da7f033dSHerbert Xu 			}
927da7f033dSHerbert Xu 
928da7f033dSHerbert Xu 			temp += template[i].tap[k];
929da7f033dSHerbert Xu 		}
930da7f033dSHerbert Xu 	}
931da7f033dSHerbert Xu 
932da7f033dSHerbert Xu 	ret = 0;
933da7f033dSHerbert Xu 
934da7f033dSHerbert Xu out:
935da7f033dSHerbert Xu 	aead_request_free(req);
936d8a32ac2SJussi Kivilinna 	kfree(sg);
937d8a32ac2SJussi Kivilinna out_nosg:
938d8a32ac2SJussi Kivilinna 	if (diff_dst)
939d8a32ac2SJussi Kivilinna 		testmgr_free_buf(xoutbuf);
940d8a32ac2SJussi Kivilinna out_nooutbuf:
941f8b0d4d0SHerbert Xu 	testmgr_free_buf(axbuf);
942f8b0d4d0SHerbert Xu out_noaxbuf:
943f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
944f8b0d4d0SHerbert Xu out_noxbuf:
94529b77e5dSHoria Geanta 	kfree(key);
9469bac019dSTadeusz Struk 	kfree(iv);
947da7f033dSHerbert Xu 	return ret;
948da7f033dSHerbert Xu }
949da7f033dSHerbert Xu 
950d8a32ac2SJussi Kivilinna static int test_aead(struct crypto_aead *tfm, int enc,
951b13b1e0cSEric Biggers 		     const struct aead_testvec *template, unsigned int tcount)
952d8a32ac2SJussi Kivilinna {
95358dcf548SJussi Kivilinna 	unsigned int alignmask;
954d8a32ac2SJussi Kivilinna 	int ret;
955d8a32ac2SJussi Kivilinna 
956d8a32ac2SJussi Kivilinna 	/* test 'dst == src' case */
95758dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, false, 0);
958d8a32ac2SJussi Kivilinna 	if (ret)
959d8a32ac2SJussi Kivilinna 		return ret;
960d8a32ac2SJussi Kivilinna 
961d8a32ac2SJussi Kivilinna 	/* test 'dst != src' case */
96258dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, true, 0);
96358dcf548SJussi Kivilinna 	if (ret)
96458dcf548SJussi Kivilinna 		return ret;
96558dcf548SJussi Kivilinna 
96658dcf548SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
96758dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, true, 1);
96858dcf548SJussi Kivilinna 	if (ret)
96958dcf548SJussi Kivilinna 		return ret;
97058dcf548SJussi Kivilinna 
97158dcf548SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
97258dcf548SJussi Kivilinna 	if (alignmask) {
97358dcf548SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
97458dcf548SJussi Kivilinna 		ret = __test_aead(tfm, enc, template, tcount, true,
97558dcf548SJussi Kivilinna 				  alignmask + 1);
97658dcf548SJussi Kivilinna 		if (ret)
97758dcf548SJussi Kivilinna 			return ret;
97858dcf548SJussi Kivilinna 	}
97958dcf548SJussi Kivilinna 
98058dcf548SJussi Kivilinna 	return 0;
981d8a32ac2SJussi Kivilinna }
982d8a32ac2SJussi Kivilinna 
9831aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc,
984b13b1e0cSEric Biggers 		       const struct cipher_testvec *template,
985b13b1e0cSEric Biggers 		       unsigned int tcount)
9861aa4ecd9SHerbert Xu {
9871aa4ecd9SHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm));
9881aa4ecd9SHerbert Xu 	unsigned int i, j, k;
9891aa4ecd9SHerbert Xu 	char *q;
9901aa4ecd9SHerbert Xu 	const char *e;
9911aa4ecd9SHerbert Xu 	void *data;
992f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
993f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
994f8b0d4d0SHerbert Xu 
995f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
996f8b0d4d0SHerbert Xu 		goto out_nobuf;
9971aa4ecd9SHerbert Xu 
9981aa4ecd9SHerbert Xu 	if (enc == ENCRYPT)
9991aa4ecd9SHerbert Xu 	        e = "encryption";
10001aa4ecd9SHerbert Xu 	else
10011aa4ecd9SHerbert Xu 		e = "decryption";
10021aa4ecd9SHerbert Xu 
10031aa4ecd9SHerbert Xu 	j = 0;
10041aa4ecd9SHerbert Xu 	for (i = 0; i < tcount; i++) {
10051aa4ecd9SHerbert Xu 		if (template[i].np)
10061aa4ecd9SHerbert Xu 			continue;
10071aa4ecd9SHerbert Xu 
100810faa8c0SStephan Mueller 		if (fips_enabled && template[i].fips_skip)
100910faa8c0SStephan Mueller 			continue;
101010faa8c0SStephan Mueller 
10111aa4ecd9SHerbert Xu 		j++;
10121aa4ecd9SHerbert Xu 
1013fd57f22aSHerbert Xu 		ret = -EINVAL;
1014fd57f22aSHerbert Xu 		if (WARN_ON(template[i].ilen > PAGE_SIZE))
1015fd57f22aSHerbert Xu 			goto out;
1016fd57f22aSHerbert Xu 
10171aa4ecd9SHerbert Xu 		data = xbuf[0];
10181aa4ecd9SHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
10191aa4ecd9SHerbert Xu 
10201aa4ecd9SHerbert Xu 		crypto_cipher_clear_flags(tfm, ~0);
10211aa4ecd9SHerbert Xu 		if (template[i].wk)
10221aa4ecd9SHerbert Xu 			crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
10231aa4ecd9SHerbert Xu 
10241aa4ecd9SHerbert Xu 		ret = crypto_cipher_setkey(tfm, template[i].key,
10251aa4ecd9SHerbert Xu 					   template[i].klen);
10260fae0c1eSYanjiang Jin 		if (template[i].fail == !ret) {
10271aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: setkey failed "
10281aa4ecd9SHerbert Xu 			       "on test %d for %s: flags=%x\n", j,
10291aa4ecd9SHerbert Xu 			       algo, crypto_cipher_get_flags(tfm));
10301aa4ecd9SHerbert Xu 			goto out;
10311aa4ecd9SHerbert Xu 		} else if (ret)
10321aa4ecd9SHerbert Xu 			continue;
10331aa4ecd9SHerbert Xu 
10341aa4ecd9SHerbert Xu 		for (k = 0; k < template[i].ilen;
10351aa4ecd9SHerbert Xu 		     k += crypto_cipher_blocksize(tfm)) {
10361aa4ecd9SHerbert Xu 			if (enc)
10371aa4ecd9SHerbert Xu 				crypto_cipher_encrypt_one(tfm, data + k,
10381aa4ecd9SHerbert Xu 							  data + k);
10391aa4ecd9SHerbert Xu 			else
10401aa4ecd9SHerbert Xu 				crypto_cipher_decrypt_one(tfm, data + k,
10411aa4ecd9SHerbert Xu 							  data + k);
10421aa4ecd9SHerbert Xu 		}
10431aa4ecd9SHerbert Xu 
10441aa4ecd9SHerbert Xu 		q = data;
10451aa4ecd9SHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
10461aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: Test %d failed "
10471aa4ecd9SHerbert Xu 			       "on %s for %s\n", j, e, algo);
10481aa4ecd9SHerbert Xu 			hexdump(q, template[i].rlen);
10491aa4ecd9SHerbert Xu 			ret = -EINVAL;
10501aa4ecd9SHerbert Xu 			goto out;
10511aa4ecd9SHerbert Xu 		}
10521aa4ecd9SHerbert Xu 	}
10531aa4ecd9SHerbert Xu 
10541aa4ecd9SHerbert Xu 	ret = 0;
10551aa4ecd9SHerbert Xu 
10561aa4ecd9SHerbert Xu out:
1057f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
1058f8b0d4d0SHerbert Xu out_nobuf:
10591aa4ecd9SHerbert Xu 	return ret;
10601aa4ecd9SHerbert Xu }
10611aa4ecd9SHerbert Xu 
106212773d93SHerbert Xu static int __test_skcipher(struct crypto_skcipher *tfm, int enc,
1063b13b1e0cSEric Biggers 			   const struct cipher_testvec *template,
1064b13b1e0cSEric Biggers 			   unsigned int tcount,
10653a338f20SJussi Kivilinna 			   const bool diff_dst, const int align_offset)
1066da7f033dSHerbert Xu {
1067da7f033dSHerbert Xu 	const char *algo =
106812773d93SHerbert Xu 		crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm));
1069da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
1070da7f033dSHerbert Xu 	char *q;
107112773d93SHerbert Xu 	struct skcipher_request *req;
1072da7f033dSHerbert Xu 	struct scatterlist sg[8];
107308d6af8cSJussi Kivilinna 	struct scatterlist sgout[8];
107408d6af8cSJussi Kivilinna 	const char *e, *d;
10757f397136SGilad Ben-Yossef 	struct crypto_wait wait;
1076da7f033dSHerbert Xu 	void *data;
1077da7f033dSHerbert Xu 	char iv[MAX_IVLEN];
1078f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
107908d6af8cSJussi Kivilinna 	char *xoutbuf[XBUFSIZE];
1080f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
108184cba178SAndrey Ryabinin 	unsigned int ivsize = crypto_skcipher_ivsize(tfm);
1082f8b0d4d0SHerbert Xu 
1083f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
1084f8b0d4d0SHerbert Xu 		goto out_nobuf;
1085da7f033dSHerbert Xu 
108608d6af8cSJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
108708d6af8cSJussi Kivilinna 		goto out_nooutbuf;
108808d6af8cSJussi Kivilinna 
108908d6af8cSJussi Kivilinna 	if (diff_dst)
109008d6af8cSJussi Kivilinna 		d = "-ddst";
109108d6af8cSJussi Kivilinna 	else
109208d6af8cSJussi Kivilinna 		d = "";
109308d6af8cSJussi Kivilinna 
1094da7f033dSHerbert Xu 	if (enc == ENCRYPT)
1095da7f033dSHerbert Xu 	        e = "encryption";
1096da7f033dSHerbert Xu 	else
1097da7f033dSHerbert Xu 		e = "decryption";
1098da7f033dSHerbert Xu 
10997f397136SGilad Ben-Yossef 	crypto_init_wait(&wait);
1100da7f033dSHerbert Xu 
110112773d93SHerbert Xu 	req = skcipher_request_alloc(tfm, GFP_KERNEL);
1102da7f033dSHerbert Xu 	if (!req) {
110308d6af8cSJussi Kivilinna 		pr_err("alg: skcipher%s: Failed to allocate request for %s\n",
110408d6af8cSJussi Kivilinna 		       d, algo);
1105da7f033dSHerbert Xu 		goto out;
1106da7f033dSHerbert Xu 	}
1107da7f033dSHerbert Xu 
110812773d93SHerbert Xu 	skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
11097f397136SGilad Ben-Yossef 				      crypto_req_done, &wait);
1110da7f033dSHerbert Xu 
1111da7f033dSHerbert Xu 	j = 0;
1112da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
1113bbb9a7ddSCristian Stoica 		if (template[i].np && !template[i].also_non_np)
1114bbb9a7ddSCristian Stoica 			continue;
1115bbb9a7ddSCristian Stoica 
111610faa8c0SStephan Mueller 		if (fips_enabled && template[i].fips_skip)
111710faa8c0SStephan Mueller 			continue;
111810faa8c0SStephan Mueller 
1119da7f033dSHerbert Xu 		if (template[i].iv)
112084cba178SAndrey Ryabinin 			memcpy(iv, template[i].iv, ivsize);
1121da7f033dSHerbert Xu 		else
1122da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
1123da7f033dSHerbert Xu 
1124da7f033dSHerbert Xu 		j++;
1125fd57f22aSHerbert Xu 		ret = -EINVAL;
1126a1aa44a2SCristian Stoica 		if (WARN_ON(align_offset + template[i].ilen > PAGE_SIZE))
1127fd57f22aSHerbert Xu 			goto out;
1128fd57f22aSHerbert Xu 
1129da7f033dSHerbert Xu 		data = xbuf[0];
11303a338f20SJussi Kivilinna 		data += align_offset;
1131da7f033dSHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
1132da7f033dSHerbert Xu 
113312773d93SHerbert Xu 		crypto_skcipher_clear_flags(tfm, ~0);
1134da7f033dSHerbert Xu 		if (template[i].wk)
113512773d93SHerbert Xu 			crypto_skcipher_set_flags(tfm,
113612773d93SHerbert Xu 						  CRYPTO_TFM_REQ_WEAK_KEY);
1137da7f033dSHerbert Xu 
113812773d93SHerbert Xu 		ret = crypto_skcipher_setkey(tfm, template[i].key,
1139da7f033dSHerbert Xu 					     template[i].klen);
11400fae0c1eSYanjiang Jin 		if (template[i].fail == !ret) {
114108d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n",
114212773d93SHerbert Xu 			       d, j, algo, crypto_skcipher_get_flags(tfm));
1143da7f033dSHerbert Xu 			goto out;
1144da7f033dSHerbert Xu 		} else if (ret)
1145da7f033dSHerbert Xu 			continue;
1146da7f033dSHerbert Xu 
1147da7f033dSHerbert Xu 		sg_init_one(&sg[0], data, template[i].ilen);
114808d6af8cSJussi Kivilinna 		if (diff_dst) {
114908d6af8cSJussi Kivilinna 			data = xoutbuf[0];
11503a338f20SJussi Kivilinna 			data += align_offset;
115108d6af8cSJussi Kivilinna 			sg_init_one(&sgout[0], data, template[i].ilen);
115208d6af8cSJussi Kivilinna 		}
1153da7f033dSHerbert Xu 
115412773d93SHerbert Xu 		skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1155da7f033dSHerbert Xu 					   template[i].ilen, iv);
11567f397136SGilad Ben-Yossef 		ret = crypto_wait_req(enc ? crypto_skcipher_encrypt(req) :
11577f397136SGilad Ben-Yossef 				      crypto_skcipher_decrypt(req), &wait);
1158da7f033dSHerbert Xu 
11597f397136SGilad Ben-Yossef 		if (ret) {
116008d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n",
116108d6af8cSJussi Kivilinna 			       d, e, j, algo, -ret);
1162da7f033dSHerbert Xu 			goto out;
1163da7f033dSHerbert Xu 		}
1164da7f033dSHerbert Xu 
1165da7f033dSHerbert Xu 		q = data;
1166da7f033dSHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
11678a826a34SBoris BREZILLON 			pr_err("alg: skcipher%s: Test %d failed (invalid result) on %s for %s\n",
116808d6af8cSJussi Kivilinna 			       d, j, e, algo);
1169da7f033dSHerbert Xu 			hexdump(q, template[i].rlen);
1170da7f033dSHerbert Xu 			ret = -EINVAL;
1171da7f033dSHerbert Xu 			goto out;
1172da7f033dSHerbert Xu 		}
11738a826a34SBoris BREZILLON 
11748a826a34SBoris BREZILLON 		if (template[i].iv_out &&
11758a826a34SBoris BREZILLON 		    memcmp(iv, template[i].iv_out,
11768a826a34SBoris BREZILLON 			   crypto_skcipher_ivsize(tfm))) {
11778a826a34SBoris BREZILLON 			pr_err("alg: skcipher%s: Test %d failed (invalid output IV) on %s for %s\n",
11788a826a34SBoris BREZILLON 			       d, j, e, algo);
11798a826a34SBoris BREZILLON 			hexdump(iv, crypto_skcipher_ivsize(tfm));
11808a826a34SBoris BREZILLON 			ret = -EINVAL;
11818a826a34SBoris BREZILLON 			goto out;
11828a826a34SBoris BREZILLON 		}
1183da7f033dSHerbert Xu 	}
1184da7f033dSHerbert Xu 
1185da7f033dSHerbert Xu 	j = 0;
1186da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
11873a338f20SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
11883a338f20SJussi Kivilinna 		if (align_offset != 0)
11893a338f20SJussi Kivilinna 			break;
1190da7f033dSHerbert Xu 
1191bbb9a7ddSCristian Stoica 		if (!template[i].np)
1192bbb9a7ddSCristian Stoica 			continue;
1193bbb9a7ddSCristian Stoica 
119410faa8c0SStephan Mueller 		if (fips_enabled && template[i].fips_skip)
119510faa8c0SStephan Mueller 			continue;
119610faa8c0SStephan Mueller 
1197da7f033dSHerbert Xu 		if (template[i].iv)
119884cba178SAndrey Ryabinin 			memcpy(iv, template[i].iv, ivsize);
1199da7f033dSHerbert Xu 		else
1200da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
1201da7f033dSHerbert Xu 
1202da7f033dSHerbert Xu 		j++;
120312773d93SHerbert Xu 		crypto_skcipher_clear_flags(tfm, ~0);
1204da7f033dSHerbert Xu 		if (template[i].wk)
120512773d93SHerbert Xu 			crypto_skcipher_set_flags(tfm,
120612773d93SHerbert Xu 						  CRYPTO_TFM_REQ_WEAK_KEY);
1207da7f033dSHerbert Xu 
120812773d93SHerbert Xu 		ret = crypto_skcipher_setkey(tfm, template[i].key,
1209da7f033dSHerbert Xu 					     template[i].klen);
12100fae0c1eSYanjiang Jin 		if (template[i].fail == !ret) {
121108d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n",
121212773d93SHerbert Xu 			       d, j, algo, crypto_skcipher_get_flags(tfm));
1213da7f033dSHerbert Xu 			goto out;
1214da7f033dSHerbert Xu 		} else if (ret)
1215da7f033dSHerbert Xu 			continue;
1216da7f033dSHerbert Xu 
1217da7f033dSHerbert Xu 		temp = 0;
1218da7f033dSHerbert Xu 		ret = -EINVAL;
1219da7f033dSHerbert Xu 		sg_init_table(sg, template[i].np);
122008d6af8cSJussi Kivilinna 		if (diff_dst)
122108d6af8cSJussi Kivilinna 			sg_init_table(sgout, template[i].np);
1222da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
1223da7f033dSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
1224da7f033dSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
1225da7f033dSHerbert Xu 				goto out;
1226da7f033dSHerbert Xu 
1227a1aa44a2SCristian Stoica 			q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
1228da7f033dSHerbert Xu 
1229a1aa44a2SCristian Stoica 			memcpy(q, template[i].input + temp, template[i].tap[k]);
1230da7f033dSHerbert Xu 
1231a1aa44a2SCristian Stoica 			if (offset_in_page(q) + template[i].tap[k] < PAGE_SIZE)
1232da7f033dSHerbert Xu 				q[template[i].tap[k]] = 0;
1233da7f033dSHerbert Xu 
1234da7f033dSHerbert Xu 			sg_set_buf(&sg[k], q, template[i].tap[k]);
123508d6af8cSJussi Kivilinna 			if (diff_dst) {
123608d6af8cSJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
123708d6af8cSJussi Kivilinna 				    offset_in_page(IDX[k]);
123808d6af8cSJussi Kivilinna 
1239a1aa44a2SCristian Stoica 				sg_set_buf(&sgout[k], q, template[i].tap[k]);
124008d6af8cSJussi Kivilinna 
124108d6af8cSJussi Kivilinna 				memset(q, 0, template[i].tap[k]);
124208d6af8cSJussi Kivilinna 				if (offset_in_page(q) +
124308d6af8cSJussi Kivilinna 				    template[i].tap[k] < PAGE_SIZE)
124408d6af8cSJussi Kivilinna 					q[template[i].tap[k]] = 0;
124508d6af8cSJussi Kivilinna 			}
1246da7f033dSHerbert Xu 
1247da7f033dSHerbert Xu 			temp += template[i].tap[k];
1248da7f033dSHerbert Xu 		}
1249da7f033dSHerbert Xu 
125012773d93SHerbert Xu 		skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1251da7f033dSHerbert Xu 					   template[i].ilen, iv);
1252da7f033dSHerbert Xu 
12537f397136SGilad Ben-Yossef 		ret = crypto_wait_req(enc ? crypto_skcipher_encrypt(req) :
12547f397136SGilad Ben-Yossef 				      crypto_skcipher_decrypt(req), &wait);
1255da7f033dSHerbert Xu 
12567f397136SGilad Ben-Yossef 		if (ret) {
125708d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n",
125808d6af8cSJussi Kivilinna 			       d, e, j, algo, -ret);
1259da7f033dSHerbert Xu 			goto out;
1260da7f033dSHerbert Xu 		}
1261da7f033dSHerbert Xu 
1262da7f033dSHerbert Xu 		temp = 0;
1263da7f033dSHerbert Xu 		ret = -EINVAL;
1264da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
126508d6af8cSJussi Kivilinna 			if (diff_dst)
126608d6af8cSJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
126708d6af8cSJussi Kivilinna 				    offset_in_page(IDX[k]);
126808d6af8cSJussi Kivilinna 			else
1269da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
1270da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
1271da7f033dSHerbert Xu 
1272da7f033dSHerbert Xu 			if (memcmp(q, template[i].result + temp,
1273da7f033dSHerbert Xu 				   template[i].tap[k])) {
127408d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n",
127508d6af8cSJussi Kivilinna 				       d, j, e, k, algo);
1276da7f033dSHerbert Xu 				hexdump(q, template[i].tap[k]);
1277da7f033dSHerbert Xu 				goto out;
1278da7f033dSHerbert Xu 			}
1279da7f033dSHerbert Xu 
1280da7f033dSHerbert Xu 			q += template[i].tap[k];
1281da7f033dSHerbert Xu 			for (n = 0; offset_in_page(q + n) && q[n]; n++)
1282da7f033dSHerbert Xu 				;
1283da7f033dSHerbert Xu 			if (n) {
128408d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
128508d6af8cSJussi Kivilinna 				       d, j, e, k, algo, n);
1286da7f033dSHerbert Xu 				hexdump(q, n);
1287da7f033dSHerbert Xu 				goto out;
1288da7f033dSHerbert Xu 			}
1289da7f033dSHerbert Xu 			temp += template[i].tap[k];
1290da7f033dSHerbert Xu 		}
1291da7f033dSHerbert Xu 	}
1292da7f033dSHerbert Xu 
1293da7f033dSHerbert Xu 	ret = 0;
1294da7f033dSHerbert Xu 
1295da7f033dSHerbert Xu out:
129612773d93SHerbert Xu 	skcipher_request_free(req);
129708d6af8cSJussi Kivilinna 	if (diff_dst)
129808d6af8cSJussi Kivilinna 		testmgr_free_buf(xoutbuf);
129908d6af8cSJussi Kivilinna out_nooutbuf:
1300f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
1301f8b0d4d0SHerbert Xu out_nobuf:
1302da7f033dSHerbert Xu 	return ret;
1303da7f033dSHerbert Xu }
1304da7f033dSHerbert Xu 
130512773d93SHerbert Xu static int test_skcipher(struct crypto_skcipher *tfm, int enc,
1306b13b1e0cSEric Biggers 			 const struct cipher_testvec *template,
1307b13b1e0cSEric Biggers 			 unsigned int tcount)
130808d6af8cSJussi Kivilinna {
13093a338f20SJussi Kivilinna 	unsigned int alignmask;
131008d6af8cSJussi Kivilinna 	int ret;
131108d6af8cSJussi Kivilinna 
131208d6af8cSJussi Kivilinna 	/* test 'dst == src' case */
13133a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, false, 0);
131408d6af8cSJussi Kivilinna 	if (ret)
131508d6af8cSJussi Kivilinna 		return ret;
131608d6af8cSJussi Kivilinna 
131708d6af8cSJussi Kivilinna 	/* test 'dst != src' case */
13183a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 0);
13193a338f20SJussi Kivilinna 	if (ret)
13203a338f20SJussi Kivilinna 		return ret;
13213a338f20SJussi Kivilinna 
13223a338f20SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
13233a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 1);
13243a338f20SJussi Kivilinna 	if (ret)
13253a338f20SJussi Kivilinna 		return ret;
13263a338f20SJussi Kivilinna 
13273a338f20SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
13283a338f20SJussi Kivilinna 	if (alignmask) {
13293a338f20SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
13303a338f20SJussi Kivilinna 		ret = __test_skcipher(tfm, enc, template, tcount, true,
13313a338f20SJussi Kivilinna 				      alignmask + 1);
13323a338f20SJussi Kivilinna 		if (ret)
13333a338f20SJussi Kivilinna 			return ret;
13343a338f20SJussi Kivilinna 	}
13353a338f20SJussi Kivilinna 
13363a338f20SJussi Kivilinna 	return 0;
133708d6af8cSJussi Kivilinna }
133808d6af8cSJussi Kivilinna 
1339b13b1e0cSEric Biggers static int test_comp(struct crypto_comp *tfm,
1340b13b1e0cSEric Biggers 		     const struct comp_testvec *ctemplate,
1341b13b1e0cSEric Biggers 		     const struct comp_testvec *dtemplate,
1342b13b1e0cSEric Biggers 		     int ctcount, int dtcount)
1343da7f033dSHerbert Xu {
1344da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
134533607384SMahipal Challa 	char *output, *decomp_output;
1346da7f033dSHerbert Xu 	unsigned int i;
1347da7f033dSHerbert Xu 	int ret;
1348da7f033dSHerbert Xu 
134933607384SMahipal Challa 	output = kmalloc(COMP_BUF_SIZE, GFP_KERNEL);
135033607384SMahipal Challa 	if (!output)
135133607384SMahipal Challa 		return -ENOMEM;
135233607384SMahipal Challa 
135333607384SMahipal Challa 	decomp_output = kmalloc(COMP_BUF_SIZE, GFP_KERNEL);
135433607384SMahipal Challa 	if (!decomp_output) {
135533607384SMahipal Challa 		kfree(output);
135633607384SMahipal Challa 		return -ENOMEM;
135733607384SMahipal Challa 	}
135833607384SMahipal Challa 
1359da7f033dSHerbert Xu 	for (i = 0; i < ctcount; i++) {
1360c79cf910SGeert Uytterhoeven 		int ilen;
1361c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1362da7f033dSHerbert Xu 
136333607384SMahipal Challa 		memset(output, 0, sizeof(COMP_BUF_SIZE));
136433607384SMahipal Challa 		memset(decomp_output, 0, sizeof(COMP_BUF_SIZE));
1365da7f033dSHerbert Xu 
1366da7f033dSHerbert Xu 		ilen = ctemplate[i].inlen;
1367da7f033dSHerbert Xu 		ret = crypto_comp_compress(tfm, ctemplate[i].input,
136833607384SMahipal Challa 					   ilen, output, &dlen);
1369da7f033dSHerbert Xu 		if (ret) {
1370da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: compression failed "
1371da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1372da7f033dSHerbert Xu 			       -ret);
1373da7f033dSHerbert Xu 			goto out;
1374da7f033dSHerbert Xu 		}
1375da7f033dSHerbert Xu 
137633607384SMahipal Challa 		ilen = dlen;
137733607384SMahipal Challa 		dlen = COMP_BUF_SIZE;
137833607384SMahipal Challa 		ret = crypto_comp_decompress(tfm, output,
137933607384SMahipal Challa 					     ilen, decomp_output, &dlen);
138033607384SMahipal Challa 		if (ret) {
138133607384SMahipal Challa 			pr_err("alg: comp: compression failed: decompress: on test %d for %s failed: ret=%d\n",
138233607384SMahipal Challa 			       i + 1, algo, -ret);
138333607384SMahipal Challa 			goto out;
138433607384SMahipal Challa 		}
138533607384SMahipal Challa 
138633607384SMahipal Challa 		if (dlen != ctemplate[i].inlen) {
1387b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Compression test %d "
1388b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1389b812eb00SGeert Uytterhoeven 			       dlen);
1390b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1391b812eb00SGeert Uytterhoeven 			goto out;
1392b812eb00SGeert Uytterhoeven 		}
1393b812eb00SGeert Uytterhoeven 
139433607384SMahipal Challa 		if (memcmp(decomp_output, ctemplate[i].input,
139533607384SMahipal Challa 			   ctemplate[i].inlen)) {
139633607384SMahipal Challa 			pr_err("alg: comp: compression failed: output differs: on test %d for %s\n",
139733607384SMahipal Challa 			       i + 1, algo);
139833607384SMahipal Challa 			hexdump(decomp_output, dlen);
1399da7f033dSHerbert Xu 			ret = -EINVAL;
1400da7f033dSHerbert Xu 			goto out;
1401da7f033dSHerbert Xu 		}
1402da7f033dSHerbert Xu 	}
1403da7f033dSHerbert Xu 
1404da7f033dSHerbert Xu 	for (i = 0; i < dtcount; i++) {
1405c79cf910SGeert Uytterhoeven 		int ilen;
1406c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1407da7f033dSHerbert Xu 
140833607384SMahipal Challa 		memset(decomp_output, 0, sizeof(COMP_BUF_SIZE));
1409da7f033dSHerbert Xu 
1410da7f033dSHerbert Xu 		ilen = dtemplate[i].inlen;
1411da7f033dSHerbert Xu 		ret = crypto_comp_decompress(tfm, dtemplate[i].input,
141233607384SMahipal Challa 					     ilen, decomp_output, &dlen);
1413da7f033dSHerbert Xu 		if (ret) {
1414da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: decompression failed "
1415da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1416da7f033dSHerbert Xu 			       -ret);
1417da7f033dSHerbert Xu 			goto out;
1418da7f033dSHerbert Xu 		}
1419da7f033dSHerbert Xu 
1420b812eb00SGeert Uytterhoeven 		if (dlen != dtemplate[i].outlen) {
1421b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Decompression test %d "
1422b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1423b812eb00SGeert Uytterhoeven 			       dlen);
1424b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1425b812eb00SGeert Uytterhoeven 			goto out;
1426b812eb00SGeert Uytterhoeven 		}
1427b812eb00SGeert Uytterhoeven 
142833607384SMahipal Challa 		if (memcmp(decomp_output, dtemplate[i].output, dlen)) {
1429da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Decompression test %d "
1430da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
143133607384SMahipal Challa 			hexdump(decomp_output, dlen);
1432da7f033dSHerbert Xu 			ret = -EINVAL;
1433da7f033dSHerbert Xu 			goto out;
1434da7f033dSHerbert Xu 		}
1435da7f033dSHerbert Xu 	}
1436da7f033dSHerbert Xu 
1437da7f033dSHerbert Xu 	ret = 0;
1438da7f033dSHerbert Xu 
1439da7f033dSHerbert Xu out:
144033607384SMahipal Challa 	kfree(decomp_output);
144133607384SMahipal Challa 	kfree(output);
1442da7f033dSHerbert Xu 	return ret;
1443da7f033dSHerbert Xu }
1444da7f033dSHerbert Xu 
1445b13b1e0cSEric Biggers static int test_acomp(struct crypto_acomp *tfm,
1446b13b1e0cSEric Biggers 			      const struct comp_testvec *ctemplate,
1447b13b1e0cSEric Biggers 		      const struct comp_testvec *dtemplate,
1448b13b1e0cSEric Biggers 		      int ctcount, int dtcount)
1449d7db7a88SGiovanni Cabiddu {
1450d7db7a88SGiovanni Cabiddu 	const char *algo = crypto_tfm_alg_driver_name(crypto_acomp_tfm(tfm));
1451d7db7a88SGiovanni Cabiddu 	unsigned int i;
1452a9943a0aSGiovanni Cabiddu 	char *output, *decomp_out;
1453d7db7a88SGiovanni Cabiddu 	int ret;
1454d7db7a88SGiovanni Cabiddu 	struct scatterlist src, dst;
1455d7db7a88SGiovanni Cabiddu 	struct acomp_req *req;
14567f397136SGilad Ben-Yossef 	struct crypto_wait wait;
1457d7db7a88SGiovanni Cabiddu 
1458eb095593SEric Biggers 	output = kmalloc(COMP_BUF_SIZE, GFP_KERNEL);
1459eb095593SEric Biggers 	if (!output)
1460eb095593SEric Biggers 		return -ENOMEM;
1461eb095593SEric Biggers 
1462a9943a0aSGiovanni Cabiddu 	decomp_out = kmalloc(COMP_BUF_SIZE, GFP_KERNEL);
1463a9943a0aSGiovanni Cabiddu 	if (!decomp_out) {
1464a9943a0aSGiovanni Cabiddu 		kfree(output);
1465a9943a0aSGiovanni Cabiddu 		return -ENOMEM;
1466a9943a0aSGiovanni Cabiddu 	}
1467a9943a0aSGiovanni Cabiddu 
1468d7db7a88SGiovanni Cabiddu 	for (i = 0; i < ctcount; i++) {
1469d7db7a88SGiovanni Cabiddu 		unsigned int dlen = COMP_BUF_SIZE;
1470d7db7a88SGiovanni Cabiddu 		int ilen = ctemplate[i].inlen;
147102608e02SLaura Abbott 		void *input_vec;
1472d7db7a88SGiovanni Cabiddu 
1473d2110224SEric Biggers 		input_vec = kmemdup(ctemplate[i].input, ilen, GFP_KERNEL);
147402608e02SLaura Abbott 		if (!input_vec) {
147502608e02SLaura Abbott 			ret = -ENOMEM;
147602608e02SLaura Abbott 			goto out;
147702608e02SLaura Abbott 		}
147802608e02SLaura Abbott 
1479eb095593SEric Biggers 		memset(output, 0, dlen);
14807f397136SGilad Ben-Yossef 		crypto_init_wait(&wait);
148102608e02SLaura Abbott 		sg_init_one(&src, input_vec, ilen);
1482d7db7a88SGiovanni Cabiddu 		sg_init_one(&dst, output, dlen);
1483d7db7a88SGiovanni Cabiddu 
1484d7db7a88SGiovanni Cabiddu 		req = acomp_request_alloc(tfm);
1485d7db7a88SGiovanni Cabiddu 		if (!req) {
1486d7db7a88SGiovanni Cabiddu 			pr_err("alg: acomp: request alloc failed for %s\n",
1487d7db7a88SGiovanni Cabiddu 			       algo);
148802608e02SLaura Abbott 			kfree(input_vec);
1489d7db7a88SGiovanni Cabiddu 			ret = -ENOMEM;
1490d7db7a88SGiovanni Cabiddu 			goto out;
1491d7db7a88SGiovanni Cabiddu 		}
1492d7db7a88SGiovanni Cabiddu 
1493d7db7a88SGiovanni Cabiddu 		acomp_request_set_params(req, &src, &dst, ilen, dlen);
1494d7db7a88SGiovanni Cabiddu 		acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
14957f397136SGilad Ben-Yossef 					   crypto_req_done, &wait);
1496d7db7a88SGiovanni Cabiddu 
14977f397136SGilad Ben-Yossef 		ret = crypto_wait_req(crypto_acomp_compress(req), &wait);
1498d7db7a88SGiovanni Cabiddu 		if (ret) {
1499d7db7a88SGiovanni Cabiddu 			pr_err("alg: acomp: compression failed on test %d for %s: ret=%d\n",
1500d7db7a88SGiovanni Cabiddu 			       i + 1, algo, -ret);
150102608e02SLaura Abbott 			kfree(input_vec);
1502d7db7a88SGiovanni Cabiddu 			acomp_request_free(req);
1503d7db7a88SGiovanni Cabiddu 			goto out;
1504d7db7a88SGiovanni Cabiddu 		}
1505d7db7a88SGiovanni Cabiddu 
1506a9943a0aSGiovanni Cabiddu 		ilen = req->dlen;
1507a9943a0aSGiovanni Cabiddu 		dlen = COMP_BUF_SIZE;
1508a9943a0aSGiovanni Cabiddu 		sg_init_one(&src, output, ilen);
1509a9943a0aSGiovanni Cabiddu 		sg_init_one(&dst, decomp_out, dlen);
15107f397136SGilad Ben-Yossef 		crypto_init_wait(&wait);
1511a9943a0aSGiovanni Cabiddu 		acomp_request_set_params(req, &src, &dst, ilen, dlen);
1512a9943a0aSGiovanni Cabiddu 
15137f397136SGilad Ben-Yossef 		ret = crypto_wait_req(crypto_acomp_decompress(req), &wait);
1514a9943a0aSGiovanni Cabiddu 		if (ret) {
1515a9943a0aSGiovanni Cabiddu 			pr_err("alg: acomp: compression failed on test %d for %s: ret=%d\n",
1516a9943a0aSGiovanni Cabiddu 			       i + 1, algo, -ret);
1517a9943a0aSGiovanni Cabiddu 			kfree(input_vec);
1518a9943a0aSGiovanni Cabiddu 			acomp_request_free(req);
1519a9943a0aSGiovanni Cabiddu 			goto out;
1520a9943a0aSGiovanni Cabiddu 		}
1521a9943a0aSGiovanni Cabiddu 
1522a9943a0aSGiovanni Cabiddu 		if (req->dlen != ctemplate[i].inlen) {
1523d7db7a88SGiovanni Cabiddu 			pr_err("alg: acomp: Compression test %d failed for %s: output len = %d\n",
1524d7db7a88SGiovanni Cabiddu 			       i + 1, algo, req->dlen);
1525d7db7a88SGiovanni Cabiddu 			ret = -EINVAL;
152602608e02SLaura Abbott 			kfree(input_vec);
1527d7db7a88SGiovanni Cabiddu 			acomp_request_free(req);
1528d7db7a88SGiovanni Cabiddu 			goto out;
1529d7db7a88SGiovanni Cabiddu 		}
1530d7db7a88SGiovanni Cabiddu 
1531a9943a0aSGiovanni Cabiddu 		if (memcmp(input_vec, decomp_out, req->dlen)) {
1532d7db7a88SGiovanni Cabiddu 			pr_err("alg: acomp: Compression test %d failed for %s\n",
1533d7db7a88SGiovanni Cabiddu 			       i + 1, algo);
1534d7db7a88SGiovanni Cabiddu 			hexdump(output, req->dlen);
1535d7db7a88SGiovanni Cabiddu 			ret = -EINVAL;
153602608e02SLaura Abbott 			kfree(input_vec);
1537d7db7a88SGiovanni Cabiddu 			acomp_request_free(req);
1538d7db7a88SGiovanni Cabiddu 			goto out;
1539d7db7a88SGiovanni Cabiddu 		}
1540d7db7a88SGiovanni Cabiddu 
154102608e02SLaura Abbott 		kfree(input_vec);
1542d7db7a88SGiovanni Cabiddu 		acomp_request_free(req);
1543d7db7a88SGiovanni Cabiddu 	}
1544d7db7a88SGiovanni Cabiddu 
1545d7db7a88SGiovanni Cabiddu 	for (i = 0; i < dtcount; i++) {
1546d7db7a88SGiovanni Cabiddu 		unsigned int dlen = COMP_BUF_SIZE;
1547d7db7a88SGiovanni Cabiddu 		int ilen = dtemplate[i].inlen;
154802608e02SLaura Abbott 		void *input_vec;
1549d7db7a88SGiovanni Cabiddu 
1550d2110224SEric Biggers 		input_vec = kmemdup(dtemplate[i].input, ilen, GFP_KERNEL);
155102608e02SLaura Abbott 		if (!input_vec) {
155202608e02SLaura Abbott 			ret = -ENOMEM;
155302608e02SLaura Abbott 			goto out;
155402608e02SLaura Abbott 		}
155502608e02SLaura Abbott 
1556eb095593SEric Biggers 		memset(output, 0, dlen);
15577f397136SGilad Ben-Yossef 		crypto_init_wait(&wait);
155802608e02SLaura Abbott 		sg_init_one(&src, input_vec, ilen);
1559d7db7a88SGiovanni Cabiddu 		sg_init_one(&dst, output, dlen);
1560d7db7a88SGiovanni Cabiddu 
1561d7db7a88SGiovanni Cabiddu 		req = acomp_request_alloc(tfm);
1562d7db7a88SGiovanni Cabiddu 		if (!req) {
1563d7db7a88SGiovanni Cabiddu 			pr_err("alg: acomp: request alloc failed for %s\n",
1564d7db7a88SGiovanni Cabiddu 			       algo);
156502608e02SLaura Abbott 			kfree(input_vec);
1566d7db7a88SGiovanni Cabiddu 			ret = -ENOMEM;
1567d7db7a88SGiovanni Cabiddu 			goto out;
1568d7db7a88SGiovanni Cabiddu 		}
1569d7db7a88SGiovanni Cabiddu 
1570d7db7a88SGiovanni Cabiddu 		acomp_request_set_params(req, &src, &dst, ilen, dlen);
1571d7db7a88SGiovanni Cabiddu 		acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
15727f397136SGilad Ben-Yossef 					   crypto_req_done, &wait);
1573d7db7a88SGiovanni Cabiddu 
15747f397136SGilad Ben-Yossef 		ret = crypto_wait_req(crypto_acomp_decompress(req), &wait);
1575d7db7a88SGiovanni Cabiddu 		if (ret) {
1576d7db7a88SGiovanni Cabiddu 			pr_err("alg: acomp: decompression failed on test %d for %s: ret=%d\n",
1577d7db7a88SGiovanni Cabiddu 			       i + 1, algo, -ret);
157802608e02SLaura Abbott 			kfree(input_vec);
1579d7db7a88SGiovanni Cabiddu 			acomp_request_free(req);
1580d7db7a88SGiovanni Cabiddu 			goto out;
1581d7db7a88SGiovanni Cabiddu 		}
1582d7db7a88SGiovanni Cabiddu 
1583d7db7a88SGiovanni Cabiddu 		if (req->dlen != dtemplate[i].outlen) {
1584d7db7a88SGiovanni Cabiddu 			pr_err("alg: acomp: Decompression test %d failed for %s: output len = %d\n",
1585d7db7a88SGiovanni Cabiddu 			       i + 1, algo, req->dlen);
1586d7db7a88SGiovanni Cabiddu 			ret = -EINVAL;
158702608e02SLaura Abbott 			kfree(input_vec);
1588d7db7a88SGiovanni Cabiddu 			acomp_request_free(req);
1589d7db7a88SGiovanni Cabiddu 			goto out;
1590d7db7a88SGiovanni Cabiddu 		}
1591d7db7a88SGiovanni Cabiddu 
1592d7db7a88SGiovanni Cabiddu 		if (memcmp(output, dtemplate[i].output, req->dlen)) {
1593d7db7a88SGiovanni Cabiddu 			pr_err("alg: acomp: Decompression test %d failed for %s\n",
1594d7db7a88SGiovanni Cabiddu 			       i + 1, algo);
1595d7db7a88SGiovanni Cabiddu 			hexdump(output, req->dlen);
1596d7db7a88SGiovanni Cabiddu 			ret = -EINVAL;
159702608e02SLaura Abbott 			kfree(input_vec);
1598d7db7a88SGiovanni Cabiddu 			acomp_request_free(req);
1599d7db7a88SGiovanni Cabiddu 			goto out;
1600d7db7a88SGiovanni Cabiddu 		}
1601d7db7a88SGiovanni Cabiddu 
160202608e02SLaura Abbott 		kfree(input_vec);
1603d7db7a88SGiovanni Cabiddu 		acomp_request_free(req);
1604d7db7a88SGiovanni Cabiddu 	}
1605d7db7a88SGiovanni Cabiddu 
1606d7db7a88SGiovanni Cabiddu 	ret = 0;
1607d7db7a88SGiovanni Cabiddu 
1608d7db7a88SGiovanni Cabiddu out:
1609a9943a0aSGiovanni Cabiddu 	kfree(decomp_out);
1610eb095593SEric Biggers 	kfree(output);
1611d7db7a88SGiovanni Cabiddu 	return ret;
1612d7db7a88SGiovanni Cabiddu }
1613d7db7a88SGiovanni Cabiddu 
1614b13b1e0cSEric Biggers static int test_cprng(struct crypto_rng *tfm,
1615b13b1e0cSEric Biggers 		      const struct cprng_testvec *template,
16167647d6ceSJarod Wilson 		      unsigned int tcount)
16177647d6ceSJarod Wilson {
16187647d6ceSJarod Wilson 	const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
1619fa4ef8a6SFelipe Contreras 	int err = 0, i, j, seedsize;
16207647d6ceSJarod Wilson 	u8 *seed;
16217647d6ceSJarod Wilson 	char result[32];
16227647d6ceSJarod Wilson 
16237647d6ceSJarod Wilson 	seedsize = crypto_rng_seedsize(tfm);
16247647d6ceSJarod Wilson 
16257647d6ceSJarod Wilson 	seed = kmalloc(seedsize, GFP_KERNEL);
16267647d6ceSJarod Wilson 	if (!seed) {
16277647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to allocate seed space "
16287647d6ceSJarod Wilson 		       "for %s\n", algo);
16297647d6ceSJarod Wilson 		return -ENOMEM;
16307647d6ceSJarod Wilson 	}
16317647d6ceSJarod Wilson 
16327647d6ceSJarod Wilson 	for (i = 0; i < tcount; i++) {
16337647d6ceSJarod Wilson 		memset(result, 0, 32);
16347647d6ceSJarod Wilson 
16357647d6ceSJarod Wilson 		memcpy(seed, template[i].v, template[i].vlen);
16367647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen, template[i].key,
16377647d6ceSJarod Wilson 		       template[i].klen);
16387647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen + template[i].klen,
16397647d6ceSJarod Wilson 		       template[i].dt, template[i].dtlen);
16407647d6ceSJarod Wilson 
16417647d6ceSJarod Wilson 		err = crypto_rng_reset(tfm, seed, seedsize);
16427647d6ceSJarod Wilson 		if (err) {
16437647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Failed to reset rng "
16447647d6ceSJarod Wilson 			       "for %s\n", algo);
16457647d6ceSJarod Wilson 			goto out;
16467647d6ceSJarod Wilson 		}
16477647d6ceSJarod Wilson 
16487647d6ceSJarod Wilson 		for (j = 0; j < template[i].loops; j++) {
16497647d6ceSJarod Wilson 			err = crypto_rng_get_bytes(tfm, result,
16507647d6ceSJarod Wilson 						   template[i].rlen);
165119e60e13SStephan Mueller 			if (err < 0) {
16527647d6ceSJarod Wilson 				printk(KERN_ERR "alg: cprng: Failed to obtain "
16537647d6ceSJarod Wilson 				       "the correct amount of random data for "
165419e60e13SStephan Mueller 				       "%s (requested %d)\n", algo,
165519e60e13SStephan Mueller 				       template[i].rlen);
16567647d6ceSJarod Wilson 				goto out;
16577647d6ceSJarod Wilson 			}
16587647d6ceSJarod Wilson 		}
16597647d6ceSJarod Wilson 
16607647d6ceSJarod Wilson 		err = memcmp(result, template[i].result,
16617647d6ceSJarod Wilson 			     template[i].rlen);
16627647d6ceSJarod Wilson 		if (err) {
16637647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Test %d failed for %s\n",
16647647d6ceSJarod Wilson 			       i, algo);
16657647d6ceSJarod Wilson 			hexdump(result, template[i].rlen);
16667647d6ceSJarod Wilson 			err = -EINVAL;
16677647d6ceSJarod Wilson 			goto out;
16687647d6ceSJarod Wilson 		}
16697647d6ceSJarod Wilson 	}
16707647d6ceSJarod Wilson 
16717647d6ceSJarod Wilson out:
16727647d6ceSJarod Wilson 	kfree(seed);
16737647d6ceSJarod Wilson 	return err;
16747647d6ceSJarod Wilson }
16757647d6ceSJarod Wilson 
1676da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
1677da7f033dSHerbert Xu 			 u32 type, u32 mask)
1678da7f033dSHerbert Xu {
1679da7f033dSHerbert Xu 	struct crypto_aead *tfm;
1680da7f033dSHerbert Xu 	int err = 0;
1681da7f033dSHerbert Xu 
1682eed93e0cSHerbert Xu 	tfm = crypto_alloc_aead(driver, type, mask);
1683da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1684da7f033dSHerbert Xu 		printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
1685da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1686da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1687da7f033dSHerbert Xu 	}
1688da7f033dSHerbert Xu 
1689da7f033dSHerbert Xu 	if (desc->suite.aead.enc.vecs) {
1690da7f033dSHerbert Xu 		err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
1691da7f033dSHerbert Xu 				desc->suite.aead.enc.count);
1692da7f033dSHerbert Xu 		if (err)
1693da7f033dSHerbert Xu 			goto out;
1694da7f033dSHerbert Xu 	}
1695da7f033dSHerbert Xu 
1696da7f033dSHerbert Xu 	if (!err && desc->suite.aead.dec.vecs)
1697da7f033dSHerbert Xu 		err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
1698da7f033dSHerbert Xu 				desc->suite.aead.dec.count);
1699da7f033dSHerbert Xu 
1700da7f033dSHerbert Xu out:
1701da7f033dSHerbert Xu 	crypto_free_aead(tfm);
1702da7f033dSHerbert Xu 	return err;
1703da7f033dSHerbert Xu }
1704da7f033dSHerbert Xu 
1705da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc,
1706da7f033dSHerbert Xu 			   const char *driver, u32 type, u32 mask)
1707da7f033dSHerbert Xu {
17081aa4ecd9SHerbert Xu 	struct crypto_cipher *tfm;
1709da7f033dSHerbert Xu 	int err = 0;
1710da7f033dSHerbert Xu 
1711eed93e0cSHerbert Xu 	tfm = crypto_alloc_cipher(driver, type, mask);
1712da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1713da7f033dSHerbert Xu 		printk(KERN_ERR "alg: cipher: Failed to load transform for "
1714da7f033dSHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
1715da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1716da7f033dSHerbert Xu 	}
1717da7f033dSHerbert Xu 
1718da7f033dSHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
1719da7f033dSHerbert Xu 		err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1720da7f033dSHerbert Xu 				  desc->suite.cipher.enc.count);
1721da7f033dSHerbert Xu 		if (err)
1722da7f033dSHerbert Xu 			goto out;
1723da7f033dSHerbert Xu 	}
1724da7f033dSHerbert Xu 
1725da7f033dSHerbert Xu 	if (desc->suite.cipher.dec.vecs)
1726da7f033dSHerbert Xu 		err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1727da7f033dSHerbert Xu 				  desc->suite.cipher.dec.count);
1728da7f033dSHerbert Xu 
1729da7f033dSHerbert Xu out:
17301aa4ecd9SHerbert Xu 	crypto_free_cipher(tfm);
17311aa4ecd9SHerbert Xu 	return err;
17321aa4ecd9SHerbert Xu }
17331aa4ecd9SHerbert Xu 
17341aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc,
17351aa4ecd9SHerbert Xu 			     const char *driver, u32 type, u32 mask)
17361aa4ecd9SHerbert Xu {
173712773d93SHerbert Xu 	struct crypto_skcipher *tfm;
17381aa4ecd9SHerbert Xu 	int err = 0;
17391aa4ecd9SHerbert Xu 
1740eed93e0cSHerbert Xu 	tfm = crypto_alloc_skcipher(driver, type, mask);
17411aa4ecd9SHerbert Xu 	if (IS_ERR(tfm)) {
17421aa4ecd9SHerbert Xu 		printk(KERN_ERR "alg: skcipher: Failed to load transform for "
17431aa4ecd9SHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
17441aa4ecd9SHerbert Xu 		return PTR_ERR(tfm);
17451aa4ecd9SHerbert Xu 	}
17461aa4ecd9SHerbert Xu 
17471aa4ecd9SHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
17481aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
17491aa4ecd9SHerbert Xu 				    desc->suite.cipher.enc.count);
17501aa4ecd9SHerbert Xu 		if (err)
17511aa4ecd9SHerbert Xu 			goto out;
17521aa4ecd9SHerbert Xu 	}
17531aa4ecd9SHerbert Xu 
17541aa4ecd9SHerbert Xu 	if (desc->suite.cipher.dec.vecs)
17551aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
17561aa4ecd9SHerbert Xu 				    desc->suite.cipher.dec.count);
17571aa4ecd9SHerbert Xu 
17581aa4ecd9SHerbert Xu out:
175912773d93SHerbert Xu 	crypto_free_skcipher(tfm);
1760da7f033dSHerbert Xu 	return err;
1761da7f033dSHerbert Xu }
1762da7f033dSHerbert Xu 
1763da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
1764da7f033dSHerbert Xu 			 u32 type, u32 mask)
1765da7f033dSHerbert Xu {
1766d7db7a88SGiovanni Cabiddu 	struct crypto_comp *comp;
1767d7db7a88SGiovanni Cabiddu 	struct crypto_acomp *acomp;
1768da7f033dSHerbert Xu 	int err;
1769d7db7a88SGiovanni Cabiddu 	u32 algo_type = type & CRYPTO_ALG_TYPE_ACOMPRESS_MASK;
1770da7f033dSHerbert Xu 
1771d7db7a88SGiovanni Cabiddu 	if (algo_type == CRYPTO_ALG_TYPE_ACOMPRESS) {
1772d7db7a88SGiovanni Cabiddu 		acomp = crypto_alloc_acomp(driver, type, mask);
1773d7db7a88SGiovanni Cabiddu 		if (IS_ERR(acomp)) {
1774d7db7a88SGiovanni Cabiddu 			pr_err("alg: acomp: Failed to load transform for %s: %ld\n",
1775d7db7a88SGiovanni Cabiddu 			       driver, PTR_ERR(acomp));
1776d7db7a88SGiovanni Cabiddu 			return PTR_ERR(acomp);
1777d7db7a88SGiovanni Cabiddu 		}
1778d7db7a88SGiovanni Cabiddu 		err = test_acomp(acomp, desc->suite.comp.comp.vecs,
1779d7db7a88SGiovanni Cabiddu 				 desc->suite.comp.decomp.vecs,
1780d7db7a88SGiovanni Cabiddu 				 desc->suite.comp.comp.count,
1781d7db7a88SGiovanni Cabiddu 				 desc->suite.comp.decomp.count);
1782d7db7a88SGiovanni Cabiddu 		crypto_free_acomp(acomp);
1783d7db7a88SGiovanni Cabiddu 	} else {
1784d7db7a88SGiovanni Cabiddu 		comp = crypto_alloc_comp(driver, type, mask);
1785d7db7a88SGiovanni Cabiddu 		if (IS_ERR(comp)) {
1786d7db7a88SGiovanni Cabiddu 			pr_err("alg: comp: Failed to load transform for %s: %ld\n",
1787d7db7a88SGiovanni Cabiddu 			       driver, PTR_ERR(comp));
1788d7db7a88SGiovanni Cabiddu 			return PTR_ERR(comp);
1789da7f033dSHerbert Xu 		}
1790da7f033dSHerbert Xu 
1791d7db7a88SGiovanni Cabiddu 		err = test_comp(comp, desc->suite.comp.comp.vecs,
1792da7f033dSHerbert Xu 				desc->suite.comp.decomp.vecs,
1793da7f033dSHerbert Xu 				desc->suite.comp.comp.count,
1794da7f033dSHerbert Xu 				desc->suite.comp.decomp.count);
1795da7f033dSHerbert Xu 
1796d7db7a88SGiovanni Cabiddu 		crypto_free_comp(comp);
1797d7db7a88SGiovanni Cabiddu 	}
1798da7f033dSHerbert Xu 	return err;
1799da7f033dSHerbert Xu }
1800da7f033dSHerbert Xu 
1801da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
1802da7f033dSHerbert Xu 			 u32 type, u32 mask)
1803da7f033dSHerbert Xu {
1804da7f033dSHerbert Xu 	struct crypto_ahash *tfm;
1805da7f033dSHerbert Xu 	int err;
1806da7f033dSHerbert Xu 
1807eed93e0cSHerbert Xu 	tfm = crypto_alloc_ahash(driver, type, mask);
1808da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1809da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
1810da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1811da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1812da7f033dSHerbert Xu 	}
1813da7f033dSHerbert Xu 
1814a8f1a052SDavid S. Miller 	err = test_hash(tfm, desc->suite.hash.vecs,
1815a8f1a052SDavid S. Miller 			desc->suite.hash.count, true);
1816a8f1a052SDavid S. Miller 	if (!err)
1817a8f1a052SDavid S. Miller 		err = test_hash(tfm, desc->suite.hash.vecs,
1818a8f1a052SDavid S. Miller 				desc->suite.hash.count, false);
1819da7f033dSHerbert Xu 
1820da7f033dSHerbert Xu 	crypto_free_ahash(tfm);
1821da7f033dSHerbert Xu 	return err;
1822da7f033dSHerbert Xu }
1823da7f033dSHerbert Xu 
18248e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc,
18258e3ee85eSHerbert Xu 			   const char *driver, u32 type, u32 mask)
18268e3ee85eSHerbert Xu {
18278e3ee85eSHerbert Xu 	struct crypto_shash *tfm;
18288e3ee85eSHerbert Xu 	u32 val;
18298e3ee85eSHerbert Xu 	int err;
18308e3ee85eSHerbert Xu 
18318e3ee85eSHerbert Xu 	err = alg_test_hash(desc, driver, type, mask);
18328e3ee85eSHerbert Xu 	if (err)
18338e3ee85eSHerbert Xu 		goto out;
18348e3ee85eSHerbert Xu 
1835eed93e0cSHerbert Xu 	tfm = crypto_alloc_shash(driver, type, mask);
18368e3ee85eSHerbert Xu 	if (IS_ERR(tfm)) {
18378e3ee85eSHerbert Xu 		printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
18388e3ee85eSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
18398e3ee85eSHerbert Xu 		err = PTR_ERR(tfm);
18408e3ee85eSHerbert Xu 		goto out;
18418e3ee85eSHerbert Xu 	}
18428e3ee85eSHerbert Xu 
18438e3ee85eSHerbert Xu 	do {
18444c5c3024SJan-Simon Möller 		SHASH_DESC_ON_STACK(shash, tfm);
18454c5c3024SJan-Simon Möller 		u32 *ctx = (u32 *)shash_desc_ctx(shash);
18468e3ee85eSHerbert Xu 
18474c5c3024SJan-Simon Möller 		shash->tfm = tfm;
18484c5c3024SJan-Simon Möller 		shash->flags = 0;
18498e3ee85eSHerbert Xu 
18504c5c3024SJan-Simon Möller 		*ctx = le32_to_cpu(420553207);
18514c5c3024SJan-Simon Möller 		err = crypto_shash_final(shash, (u8 *)&val);
18528e3ee85eSHerbert Xu 		if (err) {
18538e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Operation failed for "
18548e3ee85eSHerbert Xu 			       "%s: %d\n", driver, err);
18558e3ee85eSHerbert Xu 			break;
18568e3ee85eSHerbert Xu 		}
18578e3ee85eSHerbert Xu 
18588e3ee85eSHerbert Xu 		if (val != ~420553207) {
18598e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Test failed for %s: "
18608e3ee85eSHerbert Xu 			       "%d\n", driver, val);
18618e3ee85eSHerbert Xu 			err = -EINVAL;
18628e3ee85eSHerbert Xu 		}
18638e3ee85eSHerbert Xu 	} while (0);
18648e3ee85eSHerbert Xu 
18658e3ee85eSHerbert Xu 	crypto_free_shash(tfm);
18668e3ee85eSHerbert Xu 
18678e3ee85eSHerbert Xu out:
18688e3ee85eSHerbert Xu 	return err;
18698e3ee85eSHerbert Xu }
18708e3ee85eSHerbert Xu 
18717647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
18727647d6ceSJarod Wilson 			  u32 type, u32 mask)
18737647d6ceSJarod Wilson {
18747647d6ceSJarod Wilson 	struct crypto_rng *rng;
18757647d6ceSJarod Wilson 	int err;
18767647d6ceSJarod Wilson 
1877eed93e0cSHerbert Xu 	rng = crypto_alloc_rng(driver, type, mask);
18787647d6ceSJarod Wilson 	if (IS_ERR(rng)) {
18797647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
18807647d6ceSJarod Wilson 		       "%ld\n", driver, PTR_ERR(rng));
18817647d6ceSJarod Wilson 		return PTR_ERR(rng);
18827647d6ceSJarod Wilson 	}
18837647d6ceSJarod Wilson 
18847647d6ceSJarod Wilson 	err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count);
18857647d6ceSJarod Wilson 
18867647d6ceSJarod Wilson 	crypto_free_rng(rng);
18877647d6ceSJarod Wilson 
18887647d6ceSJarod Wilson 	return err;
18897647d6ceSJarod Wilson }
18907647d6ceSJarod Wilson 
189164d1cdfbSStephan Mueller 
1892b13b1e0cSEric Biggers static int drbg_cavs_test(const struct drbg_testvec *test, int pr,
189364d1cdfbSStephan Mueller 			  const char *driver, u32 type, u32 mask)
189464d1cdfbSStephan Mueller {
189564d1cdfbSStephan Mueller 	int ret = -EAGAIN;
189664d1cdfbSStephan Mueller 	struct crypto_rng *drng;
189764d1cdfbSStephan Mueller 	struct drbg_test_data test_data;
189864d1cdfbSStephan Mueller 	struct drbg_string addtl, pers, testentropy;
189964d1cdfbSStephan Mueller 	unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL);
190064d1cdfbSStephan Mueller 
190164d1cdfbSStephan Mueller 	if (!buf)
190264d1cdfbSStephan Mueller 		return -ENOMEM;
190364d1cdfbSStephan Mueller 
1904eed93e0cSHerbert Xu 	drng = crypto_alloc_rng(driver, type, mask);
190564d1cdfbSStephan Mueller 	if (IS_ERR(drng)) {
190664d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for "
190764d1cdfbSStephan Mueller 		       "%s\n", driver);
190864d1cdfbSStephan Mueller 		kzfree(buf);
190964d1cdfbSStephan Mueller 		return -ENOMEM;
191064d1cdfbSStephan Mueller 	}
191164d1cdfbSStephan Mueller 
191264d1cdfbSStephan Mueller 	test_data.testentropy = &testentropy;
191364d1cdfbSStephan Mueller 	drbg_string_fill(&testentropy, test->entropy, test->entropylen);
191464d1cdfbSStephan Mueller 	drbg_string_fill(&pers, test->pers, test->perslen);
191564d1cdfbSStephan Mueller 	ret = crypto_drbg_reset_test(drng, &pers, &test_data);
191664d1cdfbSStephan Mueller 	if (ret) {
191764d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: Failed to reset rng\n");
191864d1cdfbSStephan Mueller 		goto outbuf;
191964d1cdfbSStephan Mueller 	}
192064d1cdfbSStephan Mueller 
192164d1cdfbSStephan Mueller 	drbg_string_fill(&addtl, test->addtla, test->addtllen);
192264d1cdfbSStephan Mueller 	if (pr) {
192364d1cdfbSStephan Mueller 		drbg_string_fill(&testentropy, test->entpra, test->entprlen);
192464d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl_test(drng,
192564d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl,	&test_data);
192664d1cdfbSStephan Mueller 	} else {
192764d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl(drng,
192864d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl);
192964d1cdfbSStephan Mueller 	}
193019e60e13SStephan Mueller 	if (ret < 0) {
193164d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not obtain random data for "
193264d1cdfbSStephan Mueller 		       "driver %s\n", driver);
193364d1cdfbSStephan Mueller 		goto outbuf;
193464d1cdfbSStephan Mueller 	}
193564d1cdfbSStephan Mueller 
193664d1cdfbSStephan Mueller 	drbg_string_fill(&addtl, test->addtlb, test->addtllen);
193764d1cdfbSStephan Mueller 	if (pr) {
193864d1cdfbSStephan Mueller 		drbg_string_fill(&testentropy, test->entprb, test->entprlen);
193964d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl_test(drng,
194064d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl, &test_data);
194164d1cdfbSStephan Mueller 	} else {
194264d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl(drng,
194364d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl);
194464d1cdfbSStephan Mueller 	}
194519e60e13SStephan Mueller 	if (ret < 0) {
194664d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not obtain random data for "
194764d1cdfbSStephan Mueller 		       "driver %s\n", driver);
194864d1cdfbSStephan Mueller 		goto outbuf;
194964d1cdfbSStephan Mueller 	}
195064d1cdfbSStephan Mueller 
195164d1cdfbSStephan Mueller 	ret = memcmp(test->expected, buf, test->expectedlen);
195264d1cdfbSStephan Mueller 
195364d1cdfbSStephan Mueller outbuf:
195464d1cdfbSStephan Mueller 	crypto_free_rng(drng);
195564d1cdfbSStephan Mueller 	kzfree(buf);
195664d1cdfbSStephan Mueller 	return ret;
195764d1cdfbSStephan Mueller }
195864d1cdfbSStephan Mueller 
195964d1cdfbSStephan Mueller 
196064d1cdfbSStephan Mueller static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver,
196164d1cdfbSStephan Mueller 			 u32 type, u32 mask)
196264d1cdfbSStephan Mueller {
196364d1cdfbSStephan Mueller 	int err = 0;
196464d1cdfbSStephan Mueller 	int pr = 0;
196564d1cdfbSStephan Mueller 	int i = 0;
1966b13b1e0cSEric Biggers 	const struct drbg_testvec *template = desc->suite.drbg.vecs;
196764d1cdfbSStephan Mueller 	unsigned int tcount = desc->suite.drbg.count;
196864d1cdfbSStephan Mueller 
196964d1cdfbSStephan Mueller 	if (0 == memcmp(driver, "drbg_pr_", 8))
197064d1cdfbSStephan Mueller 		pr = 1;
197164d1cdfbSStephan Mueller 
197264d1cdfbSStephan Mueller 	for (i = 0; i < tcount; i++) {
197364d1cdfbSStephan Mueller 		err = drbg_cavs_test(&template[i], pr, driver, type, mask);
197464d1cdfbSStephan Mueller 		if (err) {
197564d1cdfbSStephan Mueller 			printk(KERN_ERR "alg: drbg: Test %d failed for %s\n",
197664d1cdfbSStephan Mueller 			       i, driver);
197764d1cdfbSStephan Mueller 			err = -EINVAL;
197864d1cdfbSStephan Mueller 			break;
197964d1cdfbSStephan Mueller 		}
198064d1cdfbSStephan Mueller 	}
198164d1cdfbSStephan Mueller 	return err;
198264d1cdfbSStephan Mueller 
198364d1cdfbSStephan Mueller }
198464d1cdfbSStephan Mueller 
1985b13b1e0cSEric Biggers static int do_test_kpp(struct crypto_kpp *tfm, const struct kpp_testvec *vec,
1986802c7f1cSSalvatore Benedetto 		       const char *alg)
1987802c7f1cSSalvatore Benedetto {
1988802c7f1cSSalvatore Benedetto 	struct kpp_request *req;
1989802c7f1cSSalvatore Benedetto 	void *input_buf = NULL;
1990802c7f1cSSalvatore Benedetto 	void *output_buf = NULL;
199147d3fd39STudor-Dan Ambarus 	void *a_public = NULL;
199247d3fd39STudor-Dan Ambarus 	void *a_ss = NULL;
199347d3fd39STudor-Dan Ambarus 	void *shared_secret = NULL;
19947f397136SGilad Ben-Yossef 	struct crypto_wait wait;
1995802c7f1cSSalvatore Benedetto 	unsigned int out_len_max;
1996802c7f1cSSalvatore Benedetto 	int err = -ENOMEM;
1997802c7f1cSSalvatore Benedetto 	struct scatterlist src, dst;
1998802c7f1cSSalvatore Benedetto 
1999802c7f1cSSalvatore Benedetto 	req = kpp_request_alloc(tfm, GFP_KERNEL);
2000802c7f1cSSalvatore Benedetto 	if (!req)
2001802c7f1cSSalvatore Benedetto 		return err;
2002802c7f1cSSalvatore Benedetto 
20037f397136SGilad Ben-Yossef 	crypto_init_wait(&wait);
2004802c7f1cSSalvatore Benedetto 
2005802c7f1cSSalvatore Benedetto 	err = crypto_kpp_set_secret(tfm, vec->secret, vec->secret_size);
2006802c7f1cSSalvatore Benedetto 	if (err < 0)
2007802c7f1cSSalvatore Benedetto 		goto free_req;
2008802c7f1cSSalvatore Benedetto 
2009802c7f1cSSalvatore Benedetto 	out_len_max = crypto_kpp_maxsize(tfm);
2010802c7f1cSSalvatore Benedetto 	output_buf = kzalloc(out_len_max, GFP_KERNEL);
2011802c7f1cSSalvatore Benedetto 	if (!output_buf) {
2012802c7f1cSSalvatore Benedetto 		err = -ENOMEM;
2013802c7f1cSSalvatore Benedetto 		goto free_req;
2014802c7f1cSSalvatore Benedetto 	}
2015802c7f1cSSalvatore Benedetto 
2016802c7f1cSSalvatore Benedetto 	/* Use appropriate parameter as base */
2017802c7f1cSSalvatore Benedetto 	kpp_request_set_input(req, NULL, 0);
2018802c7f1cSSalvatore Benedetto 	sg_init_one(&dst, output_buf, out_len_max);
2019802c7f1cSSalvatore Benedetto 	kpp_request_set_output(req, &dst, out_len_max);
2020802c7f1cSSalvatore Benedetto 	kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
20217f397136SGilad Ben-Yossef 				 crypto_req_done, &wait);
2022802c7f1cSSalvatore Benedetto 
202347d3fd39STudor-Dan Ambarus 	/* Compute party A's public key */
20247f397136SGilad Ben-Yossef 	err = crypto_wait_req(crypto_kpp_generate_public_key(req), &wait);
2025802c7f1cSSalvatore Benedetto 	if (err) {
202647d3fd39STudor-Dan Ambarus 		pr_err("alg: %s: Party A: generate public key test failed. err %d\n",
2027802c7f1cSSalvatore Benedetto 		       alg, err);
2028802c7f1cSSalvatore Benedetto 		goto free_output;
2029802c7f1cSSalvatore Benedetto 	}
203047d3fd39STudor-Dan Ambarus 
203147d3fd39STudor-Dan Ambarus 	if (vec->genkey) {
203247d3fd39STudor-Dan Ambarus 		/* Save party A's public key */
203347d3fd39STudor-Dan Ambarus 		a_public = kzalloc(out_len_max, GFP_KERNEL);
203447d3fd39STudor-Dan Ambarus 		if (!a_public) {
203547d3fd39STudor-Dan Ambarus 			err = -ENOMEM;
203647d3fd39STudor-Dan Ambarus 			goto free_output;
203747d3fd39STudor-Dan Ambarus 		}
203847d3fd39STudor-Dan Ambarus 		memcpy(a_public, sg_virt(req->dst), out_len_max);
203947d3fd39STudor-Dan Ambarus 	} else {
2040802c7f1cSSalvatore Benedetto 		/* Verify calculated public key */
2041802c7f1cSSalvatore Benedetto 		if (memcmp(vec->expected_a_public, sg_virt(req->dst),
2042802c7f1cSSalvatore Benedetto 			   vec->expected_a_public_size)) {
204347d3fd39STudor-Dan Ambarus 			pr_err("alg: %s: Party A: generate public key test failed. Invalid output\n",
2044802c7f1cSSalvatore Benedetto 			       alg);
2045802c7f1cSSalvatore Benedetto 			err = -EINVAL;
2046802c7f1cSSalvatore Benedetto 			goto free_output;
2047802c7f1cSSalvatore Benedetto 		}
204847d3fd39STudor-Dan Ambarus 	}
2049802c7f1cSSalvatore Benedetto 
2050802c7f1cSSalvatore Benedetto 	/* Calculate shared secret key by using counter part (b) public key. */
2051802c7f1cSSalvatore Benedetto 	input_buf = kzalloc(vec->b_public_size, GFP_KERNEL);
2052802c7f1cSSalvatore Benedetto 	if (!input_buf) {
2053802c7f1cSSalvatore Benedetto 		err = -ENOMEM;
2054802c7f1cSSalvatore Benedetto 		goto free_output;
2055802c7f1cSSalvatore Benedetto 	}
2056802c7f1cSSalvatore Benedetto 
2057802c7f1cSSalvatore Benedetto 	memcpy(input_buf, vec->b_public, vec->b_public_size);
2058802c7f1cSSalvatore Benedetto 	sg_init_one(&src, input_buf, vec->b_public_size);
2059802c7f1cSSalvatore Benedetto 	sg_init_one(&dst, output_buf, out_len_max);
2060802c7f1cSSalvatore Benedetto 	kpp_request_set_input(req, &src, vec->b_public_size);
2061802c7f1cSSalvatore Benedetto 	kpp_request_set_output(req, &dst, out_len_max);
2062802c7f1cSSalvatore Benedetto 	kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
20637f397136SGilad Ben-Yossef 				 crypto_req_done, &wait);
20647f397136SGilad Ben-Yossef 	err = crypto_wait_req(crypto_kpp_compute_shared_secret(req), &wait);
2065802c7f1cSSalvatore Benedetto 	if (err) {
206647d3fd39STudor-Dan Ambarus 		pr_err("alg: %s: Party A: compute shared secret test failed. err %d\n",
2067802c7f1cSSalvatore Benedetto 		       alg, err);
2068802c7f1cSSalvatore Benedetto 		goto free_all;
2069802c7f1cSSalvatore Benedetto 	}
207047d3fd39STudor-Dan Ambarus 
207147d3fd39STudor-Dan Ambarus 	if (vec->genkey) {
207247d3fd39STudor-Dan Ambarus 		/* Save the shared secret obtained by party A */
207347d3fd39STudor-Dan Ambarus 		a_ss = kzalloc(vec->expected_ss_size, GFP_KERNEL);
207447d3fd39STudor-Dan Ambarus 		if (!a_ss) {
207547d3fd39STudor-Dan Ambarus 			err = -ENOMEM;
207647d3fd39STudor-Dan Ambarus 			goto free_all;
207747d3fd39STudor-Dan Ambarus 		}
207847d3fd39STudor-Dan Ambarus 		memcpy(a_ss, sg_virt(req->dst), vec->expected_ss_size);
207947d3fd39STudor-Dan Ambarus 
208047d3fd39STudor-Dan Ambarus 		/*
208147d3fd39STudor-Dan Ambarus 		 * Calculate party B's shared secret by using party A's
208247d3fd39STudor-Dan Ambarus 		 * public key.
208347d3fd39STudor-Dan Ambarus 		 */
208447d3fd39STudor-Dan Ambarus 		err = crypto_kpp_set_secret(tfm, vec->b_secret,
208547d3fd39STudor-Dan Ambarus 					    vec->b_secret_size);
208647d3fd39STudor-Dan Ambarus 		if (err < 0)
208747d3fd39STudor-Dan Ambarus 			goto free_all;
208847d3fd39STudor-Dan Ambarus 
208947d3fd39STudor-Dan Ambarus 		sg_init_one(&src, a_public, vec->expected_a_public_size);
209047d3fd39STudor-Dan Ambarus 		sg_init_one(&dst, output_buf, out_len_max);
209147d3fd39STudor-Dan Ambarus 		kpp_request_set_input(req, &src, vec->expected_a_public_size);
209247d3fd39STudor-Dan Ambarus 		kpp_request_set_output(req, &dst, out_len_max);
209347d3fd39STudor-Dan Ambarus 		kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
20947f397136SGilad Ben-Yossef 					 crypto_req_done, &wait);
20957f397136SGilad Ben-Yossef 		err = crypto_wait_req(crypto_kpp_compute_shared_secret(req),
20967f397136SGilad Ben-Yossef 				      &wait);
209747d3fd39STudor-Dan Ambarus 		if (err) {
209847d3fd39STudor-Dan Ambarus 			pr_err("alg: %s: Party B: compute shared secret failed. err %d\n",
209947d3fd39STudor-Dan Ambarus 			       alg, err);
210047d3fd39STudor-Dan Ambarus 			goto free_all;
210147d3fd39STudor-Dan Ambarus 		}
210247d3fd39STudor-Dan Ambarus 
210347d3fd39STudor-Dan Ambarus 		shared_secret = a_ss;
210447d3fd39STudor-Dan Ambarus 	} else {
210547d3fd39STudor-Dan Ambarus 		shared_secret = (void *)vec->expected_ss;
210647d3fd39STudor-Dan Ambarus 	}
210747d3fd39STudor-Dan Ambarus 
2108802c7f1cSSalvatore Benedetto 	/*
2109802c7f1cSSalvatore Benedetto 	 * verify shared secret from which the user will derive
2110802c7f1cSSalvatore Benedetto 	 * secret key by executing whatever hash it has chosen
2111802c7f1cSSalvatore Benedetto 	 */
211247d3fd39STudor-Dan Ambarus 	if (memcmp(shared_secret, sg_virt(req->dst),
2113802c7f1cSSalvatore Benedetto 		   vec->expected_ss_size)) {
2114802c7f1cSSalvatore Benedetto 		pr_err("alg: %s: compute shared secret test failed. Invalid output\n",
2115802c7f1cSSalvatore Benedetto 		       alg);
2116802c7f1cSSalvatore Benedetto 		err = -EINVAL;
2117802c7f1cSSalvatore Benedetto 	}
2118802c7f1cSSalvatore Benedetto 
2119802c7f1cSSalvatore Benedetto free_all:
212047d3fd39STudor-Dan Ambarus 	kfree(a_ss);
2121802c7f1cSSalvatore Benedetto 	kfree(input_buf);
2122802c7f1cSSalvatore Benedetto free_output:
212347d3fd39STudor-Dan Ambarus 	kfree(a_public);
2124802c7f1cSSalvatore Benedetto 	kfree(output_buf);
2125802c7f1cSSalvatore Benedetto free_req:
2126802c7f1cSSalvatore Benedetto 	kpp_request_free(req);
2127802c7f1cSSalvatore Benedetto 	return err;
2128802c7f1cSSalvatore Benedetto }
2129802c7f1cSSalvatore Benedetto 
2130802c7f1cSSalvatore Benedetto static int test_kpp(struct crypto_kpp *tfm, const char *alg,
2131b13b1e0cSEric Biggers 		    const struct kpp_testvec *vecs, unsigned int tcount)
2132802c7f1cSSalvatore Benedetto {
2133802c7f1cSSalvatore Benedetto 	int ret, i;
2134802c7f1cSSalvatore Benedetto 
2135802c7f1cSSalvatore Benedetto 	for (i = 0; i < tcount; i++) {
2136802c7f1cSSalvatore Benedetto 		ret = do_test_kpp(tfm, vecs++, alg);
2137802c7f1cSSalvatore Benedetto 		if (ret) {
2138802c7f1cSSalvatore Benedetto 			pr_err("alg: %s: test failed on vector %d, err=%d\n",
2139802c7f1cSSalvatore Benedetto 			       alg, i + 1, ret);
2140802c7f1cSSalvatore Benedetto 			return ret;
2141802c7f1cSSalvatore Benedetto 		}
2142802c7f1cSSalvatore Benedetto 	}
2143802c7f1cSSalvatore Benedetto 	return 0;
2144802c7f1cSSalvatore Benedetto }
2145802c7f1cSSalvatore Benedetto 
2146802c7f1cSSalvatore Benedetto static int alg_test_kpp(const struct alg_test_desc *desc, const char *driver,
2147802c7f1cSSalvatore Benedetto 			u32 type, u32 mask)
2148802c7f1cSSalvatore Benedetto {
2149802c7f1cSSalvatore Benedetto 	struct crypto_kpp *tfm;
2150802c7f1cSSalvatore Benedetto 	int err = 0;
2151802c7f1cSSalvatore Benedetto 
2152eed93e0cSHerbert Xu 	tfm = crypto_alloc_kpp(driver, type, mask);
2153802c7f1cSSalvatore Benedetto 	if (IS_ERR(tfm)) {
2154802c7f1cSSalvatore Benedetto 		pr_err("alg: kpp: Failed to load tfm for %s: %ld\n",
2155802c7f1cSSalvatore Benedetto 		       driver, PTR_ERR(tfm));
2156802c7f1cSSalvatore Benedetto 		return PTR_ERR(tfm);
2157802c7f1cSSalvatore Benedetto 	}
2158802c7f1cSSalvatore Benedetto 	if (desc->suite.kpp.vecs)
2159802c7f1cSSalvatore Benedetto 		err = test_kpp(tfm, desc->alg, desc->suite.kpp.vecs,
2160802c7f1cSSalvatore Benedetto 			       desc->suite.kpp.count);
2161802c7f1cSSalvatore Benedetto 
2162802c7f1cSSalvatore Benedetto 	crypto_free_kpp(tfm);
2163802c7f1cSSalvatore Benedetto 	return err;
2164802c7f1cSSalvatore Benedetto }
2165802c7f1cSSalvatore Benedetto 
216650d2b643SHerbert Xu static int test_akcipher_one(struct crypto_akcipher *tfm,
2167b13b1e0cSEric Biggers 			     const struct akcipher_testvec *vecs)
2168946cc463STadeusz Struk {
2169df27b26fSHerbert Xu 	char *xbuf[XBUFSIZE];
2170946cc463STadeusz Struk 	struct akcipher_request *req;
2171946cc463STadeusz Struk 	void *outbuf_enc = NULL;
2172946cc463STadeusz Struk 	void *outbuf_dec = NULL;
21737f397136SGilad Ben-Yossef 	struct crypto_wait wait;
2174946cc463STadeusz Struk 	unsigned int out_len_max, out_len = 0;
2175946cc463STadeusz Struk 	int err = -ENOMEM;
217622287b0bSTadeusz Struk 	struct scatterlist src, dst, src_tab[2];
2177946cc463STadeusz Struk 
2178df27b26fSHerbert Xu 	if (testmgr_alloc_buf(xbuf))
2179df27b26fSHerbert Xu 		return err;
2180df27b26fSHerbert Xu 
2181946cc463STadeusz Struk 	req = akcipher_request_alloc(tfm, GFP_KERNEL);
2182946cc463STadeusz Struk 	if (!req)
2183df27b26fSHerbert Xu 		goto free_xbuf;
2184946cc463STadeusz Struk 
21857f397136SGilad Ben-Yossef 	crypto_init_wait(&wait);
218622287b0bSTadeusz Struk 
218722287b0bSTadeusz Struk 	if (vecs->public_key_vec)
218822287b0bSTadeusz Struk 		err = crypto_akcipher_set_pub_key(tfm, vecs->key,
218922287b0bSTadeusz Struk 						  vecs->key_len);
219022287b0bSTadeusz Struk 	else
219122287b0bSTadeusz Struk 		err = crypto_akcipher_set_priv_key(tfm, vecs->key,
219222287b0bSTadeusz Struk 						   vecs->key_len);
2193946cc463STadeusz Struk 	if (err)
2194946cc463STadeusz Struk 		goto free_req;
2195946cc463STadeusz Struk 
219657763f5eSSalvatore Benedetto 	err = -ENOMEM;
219722287b0bSTadeusz Struk 	out_len_max = crypto_akcipher_maxsize(tfm);
2198946cc463STadeusz Struk 	outbuf_enc = kzalloc(out_len_max, GFP_KERNEL);
2199946cc463STadeusz Struk 	if (!outbuf_enc)
2200946cc463STadeusz Struk 		goto free_req;
2201946cc463STadeusz Struk 
2202df27b26fSHerbert Xu 	if (WARN_ON(vecs->m_size > PAGE_SIZE))
2203df27b26fSHerbert Xu 		goto free_all;
2204df27b26fSHerbert Xu 
2205df27b26fSHerbert Xu 	memcpy(xbuf[0], vecs->m, vecs->m_size);
2206df27b26fSHerbert Xu 
220722287b0bSTadeusz Struk 	sg_init_table(src_tab, 2);
2208df27b26fSHerbert Xu 	sg_set_buf(&src_tab[0], xbuf[0], 8);
2209df27b26fSHerbert Xu 	sg_set_buf(&src_tab[1], xbuf[0] + 8, vecs->m_size - 8);
221022287b0bSTadeusz Struk 	sg_init_one(&dst, outbuf_enc, out_len_max);
221122287b0bSTadeusz Struk 	akcipher_request_set_crypt(req, src_tab, &dst, vecs->m_size,
221222287b0bSTadeusz Struk 				   out_len_max);
2213946cc463STadeusz Struk 	akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
22147f397136SGilad Ben-Yossef 				      crypto_req_done, &wait);
2215946cc463STadeusz Struk 
22167f397136SGilad Ben-Yossef 	err = crypto_wait_req(vecs->siggen_sigver_test ?
22171207107cSStephan Mueller 			      /* Run asymmetric signature generation */
22181207107cSStephan Mueller 			      crypto_akcipher_sign(req) :
22191207107cSStephan Mueller 			      /* Run asymmetric encrypt */
22207f397136SGilad Ben-Yossef 			      crypto_akcipher_encrypt(req), &wait);
2221946cc463STadeusz Struk 	if (err) {
222250d2b643SHerbert Xu 		pr_err("alg: akcipher: encrypt test failed. err %d\n", err);
2223946cc463STadeusz Struk 		goto free_all;
2224946cc463STadeusz Struk 	}
222522287b0bSTadeusz Struk 	if (req->dst_len != vecs->c_size) {
222650d2b643SHerbert Xu 		pr_err("alg: akcipher: encrypt test failed. Invalid output len\n");
2227946cc463STadeusz Struk 		err = -EINVAL;
2228946cc463STadeusz Struk 		goto free_all;
2229946cc463STadeusz Struk 	}
2230946cc463STadeusz Struk 	/* verify that encrypted message is equal to expected */
2231df27b26fSHerbert Xu 	if (memcmp(vecs->c, outbuf_enc, vecs->c_size)) {
223250d2b643SHerbert Xu 		pr_err("alg: akcipher: encrypt test failed. Invalid output\n");
223350d2b643SHerbert Xu 		hexdump(outbuf_enc, vecs->c_size);
2234946cc463STadeusz Struk 		err = -EINVAL;
2235946cc463STadeusz Struk 		goto free_all;
2236946cc463STadeusz Struk 	}
2237946cc463STadeusz Struk 	/* Don't invoke decrypt for vectors with public key */
2238946cc463STadeusz Struk 	if (vecs->public_key_vec) {
2239946cc463STadeusz Struk 		err = 0;
2240946cc463STadeusz Struk 		goto free_all;
2241946cc463STadeusz Struk 	}
2242946cc463STadeusz Struk 	outbuf_dec = kzalloc(out_len_max, GFP_KERNEL);
2243946cc463STadeusz Struk 	if (!outbuf_dec) {
2244946cc463STadeusz Struk 		err = -ENOMEM;
2245946cc463STadeusz Struk 		goto free_all;
2246946cc463STadeusz Struk 	}
2247df27b26fSHerbert Xu 
2248df27b26fSHerbert Xu 	if (WARN_ON(vecs->c_size > PAGE_SIZE))
2249df27b26fSHerbert Xu 		goto free_all;
2250df27b26fSHerbert Xu 
2251df27b26fSHerbert Xu 	memcpy(xbuf[0], vecs->c, vecs->c_size);
2252df27b26fSHerbert Xu 
2253df27b26fSHerbert Xu 	sg_init_one(&src, xbuf[0], vecs->c_size);
225422287b0bSTadeusz Struk 	sg_init_one(&dst, outbuf_dec, out_len_max);
22557f397136SGilad Ben-Yossef 	crypto_init_wait(&wait);
225622287b0bSTadeusz Struk 	akcipher_request_set_crypt(req, &src, &dst, vecs->c_size, out_len_max);
2257946cc463STadeusz Struk 
22587f397136SGilad Ben-Yossef 	err = crypto_wait_req(vecs->siggen_sigver_test ?
22591207107cSStephan Mueller 			      /* Run asymmetric signature verification */
22601207107cSStephan Mueller 			      crypto_akcipher_verify(req) :
22611207107cSStephan Mueller 			      /* Run asymmetric decrypt */
22627f397136SGilad Ben-Yossef 			      crypto_akcipher_decrypt(req), &wait);
2263946cc463STadeusz Struk 	if (err) {
226450d2b643SHerbert Xu 		pr_err("alg: akcipher: decrypt test failed. err %d\n", err);
2265946cc463STadeusz Struk 		goto free_all;
2266946cc463STadeusz Struk 	}
2267946cc463STadeusz Struk 	out_len = req->dst_len;
226850d2b643SHerbert Xu 	if (out_len < vecs->m_size) {
226950d2b643SHerbert Xu 		pr_err("alg: akcipher: decrypt test failed. "
227050d2b643SHerbert Xu 		       "Invalid output len %u\n", out_len);
2271946cc463STadeusz Struk 		err = -EINVAL;
2272946cc463STadeusz Struk 		goto free_all;
2273946cc463STadeusz Struk 	}
2274946cc463STadeusz Struk 	/* verify that decrypted message is equal to the original msg */
227550d2b643SHerbert Xu 	if (memchr_inv(outbuf_dec, 0, out_len - vecs->m_size) ||
227650d2b643SHerbert Xu 	    memcmp(vecs->m, outbuf_dec + out_len - vecs->m_size,
227750d2b643SHerbert Xu 		   vecs->m_size)) {
227850d2b643SHerbert Xu 		pr_err("alg: akcipher: decrypt test failed. Invalid output\n");
227950d2b643SHerbert Xu 		hexdump(outbuf_dec, out_len);
2280946cc463STadeusz Struk 		err = -EINVAL;
2281946cc463STadeusz Struk 	}
2282946cc463STadeusz Struk free_all:
2283946cc463STadeusz Struk 	kfree(outbuf_dec);
2284946cc463STadeusz Struk 	kfree(outbuf_enc);
2285946cc463STadeusz Struk free_req:
2286946cc463STadeusz Struk 	akcipher_request_free(req);
2287df27b26fSHerbert Xu free_xbuf:
2288df27b26fSHerbert Xu 	testmgr_free_buf(xbuf);
2289946cc463STadeusz Struk 	return err;
2290946cc463STadeusz Struk }
2291946cc463STadeusz Struk 
229250d2b643SHerbert Xu static int test_akcipher(struct crypto_akcipher *tfm, const char *alg,
2293b13b1e0cSEric Biggers 			 const struct akcipher_testvec *vecs,
2294b13b1e0cSEric Biggers 			 unsigned int tcount)
2295946cc463STadeusz Struk {
229615226e48SHerbert Xu 	const char *algo =
229715226e48SHerbert Xu 		crypto_tfm_alg_driver_name(crypto_akcipher_tfm(tfm));
2298946cc463STadeusz Struk 	int ret, i;
2299946cc463STadeusz Struk 
2300946cc463STadeusz Struk 	for (i = 0; i < tcount; i++) {
230150d2b643SHerbert Xu 		ret = test_akcipher_one(tfm, vecs++);
230250d2b643SHerbert Xu 		if (!ret)
230350d2b643SHerbert Xu 			continue;
230450d2b643SHerbert Xu 
230515226e48SHerbert Xu 		pr_err("alg: akcipher: test %d failed for %s, err=%d\n",
230615226e48SHerbert Xu 		       i + 1, algo, ret);
2307946cc463STadeusz Struk 		return ret;
2308946cc463STadeusz Struk 	}
2309946cc463STadeusz Struk 	return 0;
2310946cc463STadeusz Struk }
2311946cc463STadeusz Struk 
2312946cc463STadeusz Struk static int alg_test_akcipher(const struct alg_test_desc *desc,
2313946cc463STadeusz Struk 			     const char *driver, u32 type, u32 mask)
2314946cc463STadeusz Struk {
2315946cc463STadeusz Struk 	struct crypto_akcipher *tfm;
2316946cc463STadeusz Struk 	int err = 0;
2317946cc463STadeusz Struk 
2318eed93e0cSHerbert Xu 	tfm = crypto_alloc_akcipher(driver, type, mask);
2319946cc463STadeusz Struk 	if (IS_ERR(tfm)) {
2320946cc463STadeusz Struk 		pr_err("alg: akcipher: Failed to load tfm for %s: %ld\n",
2321946cc463STadeusz Struk 		       driver, PTR_ERR(tfm));
2322946cc463STadeusz Struk 		return PTR_ERR(tfm);
2323946cc463STadeusz Struk 	}
2324946cc463STadeusz Struk 	if (desc->suite.akcipher.vecs)
2325946cc463STadeusz Struk 		err = test_akcipher(tfm, desc->alg, desc->suite.akcipher.vecs,
2326946cc463STadeusz Struk 				    desc->suite.akcipher.count);
2327946cc463STadeusz Struk 
2328946cc463STadeusz Struk 	crypto_free_akcipher(tfm);
2329946cc463STadeusz Struk 	return err;
2330946cc463STadeusz Struk }
2331946cc463STadeusz Struk 
2332863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc,
2333863b557aSYouquan, Song 			     const char *driver, u32 type, u32 mask)
2334863b557aSYouquan, Song {
2335863b557aSYouquan, Song 	return 0;
2336863b557aSYouquan, Song }
2337863b557aSYouquan, Song 
233821c8e720SArd Biesheuvel #define __VECS(tv)	{ .vecs = tv, .count = ARRAY_SIZE(tv) }
233921c8e720SArd Biesheuvel 
2340da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */
2341da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = {
2342da7f033dSHerbert Xu 	{
2343e08ca2daSJarod Wilson 		.alg = "ansi_cprng",
2344e08ca2daSJarod Wilson 		.test = alg_test_cprng,
2345e08ca2daSJarod Wilson 		.suite = {
234621c8e720SArd Biesheuvel 			.cprng = __VECS(ansi_cprng_aes_tv_template)
2347e08ca2daSJarod Wilson 		}
2348e08ca2daSJarod Wilson 	}, {
2349bca4feb0SHoria Geanta 		.alg = "authenc(hmac(md5),ecb(cipher_null))",
2350bca4feb0SHoria Geanta 		.test = alg_test_aead,
2351bca4feb0SHoria Geanta 		.suite = {
2352bca4feb0SHoria Geanta 			.aead = {
235321c8e720SArd Biesheuvel 				.enc = __VECS(hmac_md5_ecb_cipher_null_enc_tv_template),
235421c8e720SArd Biesheuvel 				.dec = __VECS(hmac_md5_ecb_cipher_null_dec_tv_template)
2355bca4feb0SHoria Geanta 			}
2356bca4feb0SHoria Geanta 		}
2357bca4feb0SHoria Geanta 	}, {
2358a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha1),cbc(aes))",
2359e46e9a46SHoria Geanta 		.test = alg_test_aead,
2360bcf741cbSHerbert Xu 		.fips_allowed = 1,
2361e46e9a46SHoria Geanta 		.suite = {
2362e46e9a46SHoria Geanta 			.aead = {
236321c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha1_aes_cbc_enc_tv_temp)
23645208ed2cSNitesh Lal 			}
23655208ed2cSNitesh Lal 		}
23665208ed2cSNitesh Lal 	}, {
2367a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha1),cbc(des))",
23685208ed2cSNitesh Lal 		.test = alg_test_aead,
23695208ed2cSNitesh Lal 		.suite = {
23705208ed2cSNitesh Lal 			.aead = {
237121c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha1_des_cbc_enc_tv_temp)
23725208ed2cSNitesh Lal 			}
23735208ed2cSNitesh Lal 		}
23745208ed2cSNitesh Lal 	}, {
2375a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha1),cbc(des3_ede))",
23765208ed2cSNitesh Lal 		.test = alg_test_aead,
2377ed1afac9SMarcus Meissner 		.fips_allowed = 1,
23785208ed2cSNitesh Lal 		.suite = {
23795208ed2cSNitesh Lal 			.aead = {
238021c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha1_des3_ede_cbc_enc_tv_temp)
2381e46e9a46SHoria Geanta 			}
2382e46e9a46SHoria Geanta 		}
2383e46e9a46SHoria Geanta 	}, {
2384fb16abc2SMarcus Meissner 		.alg = "authenc(hmac(sha1),ctr(aes))",
2385fb16abc2SMarcus Meissner 		.test = alg_test_null,
2386fb16abc2SMarcus Meissner 		.fips_allowed = 1,
2387fb16abc2SMarcus Meissner 	}, {
2388bca4feb0SHoria Geanta 		.alg = "authenc(hmac(sha1),ecb(cipher_null))",
2389bca4feb0SHoria Geanta 		.test = alg_test_aead,
2390bca4feb0SHoria Geanta 		.suite = {
2391bca4feb0SHoria Geanta 			.aead = {
239221c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha1_ecb_cipher_null_enc_tv_temp),
239321c8e720SArd Biesheuvel 				.dec = __VECS(hmac_sha1_ecb_cipher_null_dec_tv_temp)
23945208ed2cSNitesh Lal 			}
23955208ed2cSNitesh Lal 		}
23965208ed2cSNitesh Lal 	}, {
23978888690eSMarcus Meissner 		.alg = "authenc(hmac(sha1),rfc3686(ctr(aes)))",
23988888690eSMarcus Meissner 		.test = alg_test_null,
23998888690eSMarcus Meissner 		.fips_allowed = 1,
24008888690eSMarcus Meissner 	}, {
2401a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha224),cbc(des))",
24025208ed2cSNitesh Lal 		.test = alg_test_aead,
24035208ed2cSNitesh Lal 		.suite = {
24045208ed2cSNitesh Lal 			.aead = {
240521c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha224_des_cbc_enc_tv_temp)
24065208ed2cSNitesh Lal 			}
24075208ed2cSNitesh Lal 		}
24085208ed2cSNitesh Lal 	}, {
2409a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha224),cbc(des3_ede))",
24105208ed2cSNitesh Lal 		.test = alg_test_aead,
2411ed1afac9SMarcus Meissner 		.fips_allowed = 1,
24125208ed2cSNitesh Lal 		.suite = {
24135208ed2cSNitesh Lal 			.aead = {
241421c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha224_des3_ede_cbc_enc_tv_temp)
2415bca4feb0SHoria Geanta 			}
2416bca4feb0SHoria Geanta 		}
2417bca4feb0SHoria Geanta 	}, {
2418a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha256),cbc(aes))",
2419e46e9a46SHoria Geanta 		.test = alg_test_aead,
2420ed1afac9SMarcus Meissner 		.fips_allowed = 1,
2421e46e9a46SHoria Geanta 		.suite = {
2422e46e9a46SHoria Geanta 			.aead = {
242321c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha256_aes_cbc_enc_tv_temp)
24245208ed2cSNitesh Lal 			}
24255208ed2cSNitesh Lal 		}
24265208ed2cSNitesh Lal 	}, {
2427a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha256),cbc(des))",
24285208ed2cSNitesh Lal 		.test = alg_test_aead,
24295208ed2cSNitesh Lal 		.suite = {
24305208ed2cSNitesh Lal 			.aead = {
243121c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha256_des_cbc_enc_tv_temp)
24325208ed2cSNitesh Lal 			}
24335208ed2cSNitesh Lal 		}
24345208ed2cSNitesh Lal 	}, {
2435a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha256),cbc(des3_ede))",
24365208ed2cSNitesh Lal 		.test = alg_test_aead,
2437ed1afac9SMarcus Meissner 		.fips_allowed = 1,
24385208ed2cSNitesh Lal 		.suite = {
24395208ed2cSNitesh Lal 			.aead = {
244021c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha256_des3_ede_cbc_enc_tv_temp)
24415208ed2cSNitesh Lal 			}
24425208ed2cSNitesh Lal 		}
24435208ed2cSNitesh Lal 	}, {
2444fb16abc2SMarcus Meissner 		.alg = "authenc(hmac(sha256),ctr(aes))",
2445fb16abc2SMarcus Meissner 		.test = alg_test_null,
2446fb16abc2SMarcus Meissner 		.fips_allowed = 1,
2447fb16abc2SMarcus Meissner 	}, {
24488888690eSMarcus Meissner 		.alg = "authenc(hmac(sha256),rfc3686(ctr(aes)))",
24498888690eSMarcus Meissner 		.test = alg_test_null,
24508888690eSMarcus Meissner 		.fips_allowed = 1,
24518888690eSMarcus Meissner 	}, {
2452a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha384),cbc(des))",
24535208ed2cSNitesh Lal 		.test = alg_test_aead,
24545208ed2cSNitesh Lal 		.suite = {
24555208ed2cSNitesh Lal 			.aead = {
245621c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha384_des_cbc_enc_tv_temp)
24575208ed2cSNitesh Lal 			}
24585208ed2cSNitesh Lal 		}
24595208ed2cSNitesh Lal 	}, {
2460a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha384),cbc(des3_ede))",
24615208ed2cSNitesh Lal 		.test = alg_test_aead,
2462ed1afac9SMarcus Meissner 		.fips_allowed = 1,
24635208ed2cSNitesh Lal 		.suite = {
24645208ed2cSNitesh Lal 			.aead = {
246521c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha384_des3_ede_cbc_enc_tv_temp)
2466e46e9a46SHoria Geanta 			}
2467e46e9a46SHoria Geanta 		}
2468e46e9a46SHoria Geanta 	}, {
2469fb16abc2SMarcus Meissner 		.alg = "authenc(hmac(sha384),ctr(aes))",
2470fb16abc2SMarcus Meissner 		.test = alg_test_null,
2471fb16abc2SMarcus Meissner 		.fips_allowed = 1,
2472fb16abc2SMarcus Meissner 	}, {
24738888690eSMarcus Meissner 		.alg = "authenc(hmac(sha384),rfc3686(ctr(aes)))",
24748888690eSMarcus Meissner 		.test = alg_test_null,
24758888690eSMarcus Meissner 		.fips_allowed = 1,
24768888690eSMarcus Meissner 	}, {
2477a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha512),cbc(aes))",
2478ed1afac9SMarcus Meissner 		.fips_allowed = 1,
2479e46e9a46SHoria Geanta 		.test = alg_test_aead,
2480e46e9a46SHoria Geanta 		.suite = {
2481e46e9a46SHoria Geanta 			.aead = {
248221c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha512_aes_cbc_enc_tv_temp)
24835208ed2cSNitesh Lal 			}
24845208ed2cSNitesh Lal 		}
24855208ed2cSNitesh Lal 	}, {
2486a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha512),cbc(des))",
24875208ed2cSNitesh Lal 		.test = alg_test_aead,
24885208ed2cSNitesh Lal 		.suite = {
24895208ed2cSNitesh Lal 			.aead = {
249021c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha512_des_cbc_enc_tv_temp)
24915208ed2cSNitesh Lal 			}
24925208ed2cSNitesh Lal 		}
24935208ed2cSNitesh Lal 	}, {
2494a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha512),cbc(des3_ede))",
24955208ed2cSNitesh Lal 		.test = alg_test_aead,
2496ed1afac9SMarcus Meissner 		.fips_allowed = 1,
24975208ed2cSNitesh Lal 		.suite = {
24985208ed2cSNitesh Lal 			.aead = {
249921c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha512_des3_ede_cbc_enc_tv_temp)
2500e46e9a46SHoria Geanta 			}
2501e46e9a46SHoria Geanta 		}
2502e46e9a46SHoria Geanta 	}, {
2503fb16abc2SMarcus Meissner 		.alg = "authenc(hmac(sha512),ctr(aes))",
2504fb16abc2SMarcus Meissner 		.test = alg_test_null,
2505fb16abc2SMarcus Meissner 		.fips_allowed = 1,
2506fb16abc2SMarcus Meissner 	}, {
25078888690eSMarcus Meissner 		.alg = "authenc(hmac(sha512),rfc3686(ctr(aes)))",
25088888690eSMarcus Meissner 		.test = alg_test_null,
25098888690eSMarcus Meissner 		.fips_allowed = 1,
25108888690eSMarcus Meissner 	}, {
2511da7f033dSHerbert Xu 		.alg = "cbc(aes)",
25121aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2513a1915d51SJarod Wilson 		.fips_allowed = 1,
2514da7f033dSHerbert Xu 		.suite = {
2515da7f033dSHerbert Xu 			.cipher = {
251621c8e720SArd Biesheuvel 				.enc = __VECS(aes_cbc_enc_tv_template),
251721c8e720SArd Biesheuvel 				.dec = __VECS(aes_cbc_dec_tv_template)
2518da7f033dSHerbert Xu 			}
2519da7f033dSHerbert Xu 		}
2520da7f033dSHerbert Xu 	}, {
2521da7f033dSHerbert Xu 		.alg = "cbc(anubis)",
25221aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2523da7f033dSHerbert Xu 		.suite = {
2524da7f033dSHerbert Xu 			.cipher = {
252521c8e720SArd Biesheuvel 				.enc = __VECS(anubis_cbc_enc_tv_template),
252621c8e720SArd Biesheuvel 				.dec = __VECS(anubis_cbc_dec_tv_template)
2527da7f033dSHerbert Xu 			}
2528da7f033dSHerbert Xu 		}
2529da7f033dSHerbert Xu 	}, {
2530da7f033dSHerbert Xu 		.alg = "cbc(blowfish)",
25311aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2532da7f033dSHerbert Xu 		.suite = {
2533da7f033dSHerbert Xu 			.cipher = {
253421c8e720SArd Biesheuvel 				.enc = __VECS(bf_cbc_enc_tv_template),
253521c8e720SArd Biesheuvel 				.dec = __VECS(bf_cbc_dec_tv_template)
2536da7f033dSHerbert Xu 			}
2537da7f033dSHerbert Xu 		}
2538da7f033dSHerbert Xu 	}, {
2539da7f033dSHerbert Xu 		.alg = "cbc(camellia)",
25401aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2541da7f033dSHerbert Xu 		.suite = {
2542da7f033dSHerbert Xu 			.cipher = {
254321c8e720SArd Biesheuvel 				.enc = __VECS(camellia_cbc_enc_tv_template),
254421c8e720SArd Biesheuvel 				.dec = __VECS(camellia_cbc_dec_tv_template)
2545da7f033dSHerbert Xu 			}
2546da7f033dSHerbert Xu 		}
2547da7f033dSHerbert Xu 	}, {
2548a2c58260SJohannes Goetzfried 		.alg = "cbc(cast5)",
2549a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2550a2c58260SJohannes Goetzfried 		.suite = {
2551a2c58260SJohannes Goetzfried 			.cipher = {
255221c8e720SArd Biesheuvel 				.enc = __VECS(cast5_cbc_enc_tv_template),
255321c8e720SArd Biesheuvel 				.dec = __VECS(cast5_cbc_dec_tv_template)
2554a2c58260SJohannes Goetzfried 			}
2555a2c58260SJohannes Goetzfried 		}
2556a2c58260SJohannes Goetzfried 	}, {
25579b8b0405SJohannes Goetzfried 		.alg = "cbc(cast6)",
25589b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
25599b8b0405SJohannes Goetzfried 		.suite = {
25609b8b0405SJohannes Goetzfried 			.cipher = {
256121c8e720SArd Biesheuvel 				.enc = __VECS(cast6_cbc_enc_tv_template),
256221c8e720SArd Biesheuvel 				.dec = __VECS(cast6_cbc_dec_tv_template)
25639b8b0405SJohannes Goetzfried 			}
25649b8b0405SJohannes Goetzfried 		}
25659b8b0405SJohannes Goetzfried 	}, {
2566da7f033dSHerbert Xu 		.alg = "cbc(des)",
25671aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2568da7f033dSHerbert Xu 		.suite = {
2569da7f033dSHerbert Xu 			.cipher = {
257021c8e720SArd Biesheuvel 				.enc = __VECS(des_cbc_enc_tv_template),
257121c8e720SArd Biesheuvel 				.dec = __VECS(des_cbc_dec_tv_template)
2572da7f033dSHerbert Xu 			}
2573da7f033dSHerbert Xu 		}
2574da7f033dSHerbert Xu 	}, {
2575da7f033dSHerbert Xu 		.alg = "cbc(des3_ede)",
25761aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2577a1915d51SJarod Wilson 		.fips_allowed = 1,
2578da7f033dSHerbert Xu 		.suite = {
2579da7f033dSHerbert Xu 			.cipher = {
258021c8e720SArd Biesheuvel 				.enc = __VECS(des3_ede_cbc_enc_tv_template),
258121c8e720SArd Biesheuvel 				.dec = __VECS(des3_ede_cbc_dec_tv_template)
2582da7f033dSHerbert Xu 			}
2583da7f033dSHerbert Xu 		}
2584da7f033dSHerbert Xu 	}, {
25859d25917dSJussi Kivilinna 		.alg = "cbc(serpent)",
25869d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
25879d25917dSJussi Kivilinna 		.suite = {
25889d25917dSJussi Kivilinna 			.cipher = {
258921c8e720SArd Biesheuvel 				.enc = __VECS(serpent_cbc_enc_tv_template),
259021c8e720SArd Biesheuvel 				.dec = __VECS(serpent_cbc_dec_tv_template)
25919d25917dSJussi Kivilinna 			}
25929d25917dSJussi Kivilinna 		}
25939d25917dSJussi Kivilinna 	}, {
2594da7f033dSHerbert Xu 		.alg = "cbc(twofish)",
25951aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2596da7f033dSHerbert Xu 		.suite = {
2597da7f033dSHerbert Xu 			.cipher = {
259821c8e720SArd Biesheuvel 				.enc = __VECS(tf_cbc_enc_tv_template),
259921c8e720SArd Biesheuvel 				.dec = __VECS(tf_cbc_dec_tv_template)
2600da7f033dSHerbert Xu 			}
2601da7f033dSHerbert Xu 		}
2602da7f033dSHerbert Xu 	}, {
2603092acf06SArd Biesheuvel 		.alg = "cbcmac(aes)",
2604092acf06SArd Biesheuvel 		.fips_allowed = 1,
2605092acf06SArd Biesheuvel 		.test = alg_test_hash,
2606092acf06SArd Biesheuvel 		.suite = {
2607092acf06SArd Biesheuvel 			.hash = __VECS(aes_cbcmac_tv_template)
2608092acf06SArd Biesheuvel 		}
2609092acf06SArd Biesheuvel 	}, {
2610da7f033dSHerbert Xu 		.alg = "ccm(aes)",
2611da7f033dSHerbert Xu 		.test = alg_test_aead,
2612a1915d51SJarod Wilson 		.fips_allowed = 1,
2613da7f033dSHerbert Xu 		.suite = {
2614da7f033dSHerbert Xu 			.aead = {
261521c8e720SArd Biesheuvel 				.enc = __VECS(aes_ccm_enc_tv_template),
261621c8e720SArd Biesheuvel 				.dec = __VECS(aes_ccm_dec_tv_template)
2617da7f033dSHerbert Xu 			}
2618da7f033dSHerbert Xu 		}
2619da7f033dSHerbert Xu 	}, {
26203590ebf2SMartin Willi 		.alg = "chacha20",
26213590ebf2SMartin Willi 		.test = alg_test_skcipher,
26223590ebf2SMartin Willi 		.suite = {
26233590ebf2SMartin Willi 			.cipher = {
262421c8e720SArd Biesheuvel 				.enc = __VECS(chacha20_enc_tv_template),
262521c8e720SArd Biesheuvel 				.dec = __VECS(chacha20_enc_tv_template),
26263590ebf2SMartin Willi 			}
26273590ebf2SMartin Willi 		}
26283590ebf2SMartin Willi 	}, {
262993b5e86aSJussi Kivilinna 		.alg = "cmac(aes)",
26308f183751SStephan Mueller 		.fips_allowed = 1,
263193b5e86aSJussi Kivilinna 		.test = alg_test_hash,
263293b5e86aSJussi Kivilinna 		.suite = {
263321c8e720SArd Biesheuvel 			.hash = __VECS(aes_cmac128_tv_template)
263493b5e86aSJussi Kivilinna 		}
263593b5e86aSJussi Kivilinna 	}, {
263693b5e86aSJussi Kivilinna 		.alg = "cmac(des3_ede)",
26378f183751SStephan Mueller 		.fips_allowed = 1,
263893b5e86aSJussi Kivilinna 		.test = alg_test_hash,
263993b5e86aSJussi Kivilinna 		.suite = {
264021c8e720SArd Biesheuvel 			.hash = __VECS(des3_ede_cmac64_tv_template)
264193b5e86aSJussi Kivilinna 		}
264293b5e86aSJussi Kivilinna 	}, {
2643e448370dSJussi Kivilinna 		.alg = "compress_null",
2644e448370dSJussi Kivilinna 		.test = alg_test_null,
2645e448370dSJussi Kivilinna 	}, {
2646ebb3472fSArd Biesheuvel 		.alg = "crc32",
2647ebb3472fSArd Biesheuvel 		.test = alg_test_hash,
2648ebb3472fSArd Biesheuvel 		.suite = {
264921c8e720SArd Biesheuvel 			.hash = __VECS(crc32_tv_template)
2650ebb3472fSArd Biesheuvel 		}
2651ebb3472fSArd Biesheuvel 	}, {
2652da7f033dSHerbert Xu 		.alg = "crc32c",
26538e3ee85eSHerbert Xu 		.test = alg_test_crc32c,
2654a1915d51SJarod Wilson 		.fips_allowed = 1,
2655da7f033dSHerbert Xu 		.suite = {
265621c8e720SArd Biesheuvel 			.hash = __VECS(crc32c_tv_template)
2657da7f033dSHerbert Xu 		}
2658da7f033dSHerbert Xu 	}, {
265968411521SHerbert Xu 		.alg = "crct10dif",
266068411521SHerbert Xu 		.test = alg_test_hash,
266168411521SHerbert Xu 		.fips_allowed = 1,
266268411521SHerbert Xu 		.suite = {
266321c8e720SArd Biesheuvel 			.hash = __VECS(crct10dif_tv_template)
266468411521SHerbert Xu 		}
266568411521SHerbert Xu 	}, {
2666f7cb80f2SJarod Wilson 		.alg = "ctr(aes)",
2667f7cb80f2SJarod Wilson 		.test = alg_test_skcipher,
2668a1915d51SJarod Wilson 		.fips_allowed = 1,
2669f7cb80f2SJarod Wilson 		.suite = {
2670f7cb80f2SJarod Wilson 			.cipher = {
267121c8e720SArd Biesheuvel 				.enc = __VECS(aes_ctr_enc_tv_template),
267221c8e720SArd Biesheuvel 				.dec = __VECS(aes_ctr_dec_tv_template)
2673f7cb80f2SJarod Wilson 			}
2674f7cb80f2SJarod Wilson 		}
2675f7cb80f2SJarod Wilson 	}, {
267685b63e34SJussi Kivilinna 		.alg = "ctr(blowfish)",
267785b63e34SJussi Kivilinna 		.test = alg_test_skcipher,
267885b63e34SJussi Kivilinna 		.suite = {
267985b63e34SJussi Kivilinna 			.cipher = {
268021c8e720SArd Biesheuvel 				.enc = __VECS(bf_ctr_enc_tv_template),
268121c8e720SArd Biesheuvel 				.dec = __VECS(bf_ctr_dec_tv_template)
268285b63e34SJussi Kivilinna 			}
268385b63e34SJussi Kivilinna 		}
268485b63e34SJussi Kivilinna 	}, {
26850840605eSJussi Kivilinna 		.alg = "ctr(camellia)",
26860840605eSJussi Kivilinna 		.test = alg_test_skcipher,
26870840605eSJussi Kivilinna 		.suite = {
26880840605eSJussi Kivilinna 			.cipher = {
268921c8e720SArd Biesheuvel 				.enc = __VECS(camellia_ctr_enc_tv_template),
269021c8e720SArd Biesheuvel 				.dec = __VECS(camellia_ctr_dec_tv_template)
26910840605eSJussi Kivilinna 			}
26920840605eSJussi Kivilinna 		}
26930840605eSJussi Kivilinna 	}, {
2694a2c58260SJohannes Goetzfried 		.alg = "ctr(cast5)",
2695a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2696a2c58260SJohannes Goetzfried 		.suite = {
2697a2c58260SJohannes Goetzfried 			.cipher = {
269821c8e720SArd Biesheuvel 				.enc = __VECS(cast5_ctr_enc_tv_template),
269921c8e720SArd Biesheuvel 				.dec = __VECS(cast5_ctr_dec_tv_template)
2700a2c58260SJohannes Goetzfried 			}
2701a2c58260SJohannes Goetzfried 		}
2702a2c58260SJohannes Goetzfried 	}, {
27039b8b0405SJohannes Goetzfried 		.alg = "ctr(cast6)",
27049b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
27059b8b0405SJohannes Goetzfried 		.suite = {
27069b8b0405SJohannes Goetzfried 			.cipher = {
270721c8e720SArd Biesheuvel 				.enc = __VECS(cast6_ctr_enc_tv_template),
270821c8e720SArd Biesheuvel 				.dec = __VECS(cast6_ctr_dec_tv_template)
27099b8b0405SJohannes Goetzfried 			}
27109b8b0405SJohannes Goetzfried 		}
27119b8b0405SJohannes Goetzfried 	}, {
27128163fc30SJussi Kivilinna 		.alg = "ctr(des)",
27138163fc30SJussi Kivilinna 		.test = alg_test_skcipher,
27148163fc30SJussi Kivilinna 		.suite = {
27158163fc30SJussi Kivilinna 			.cipher = {
271621c8e720SArd Biesheuvel 				.enc = __VECS(des_ctr_enc_tv_template),
271721c8e720SArd Biesheuvel 				.dec = __VECS(des_ctr_dec_tv_template)
27188163fc30SJussi Kivilinna 			}
27198163fc30SJussi Kivilinna 		}
27208163fc30SJussi Kivilinna 	}, {
2721e080b17aSJussi Kivilinna 		.alg = "ctr(des3_ede)",
2722e080b17aSJussi Kivilinna 		.test = alg_test_skcipher,
27230d8da104SMarcelo Cerri 		.fips_allowed = 1,
2724e080b17aSJussi Kivilinna 		.suite = {
2725e080b17aSJussi Kivilinna 			.cipher = {
272621c8e720SArd Biesheuvel 				.enc = __VECS(des3_ede_ctr_enc_tv_template),
272721c8e720SArd Biesheuvel 				.dec = __VECS(des3_ede_ctr_dec_tv_template)
2728e080b17aSJussi Kivilinna 			}
2729e080b17aSJussi Kivilinna 		}
2730e080b17aSJussi Kivilinna 	}, {
27319d25917dSJussi Kivilinna 		.alg = "ctr(serpent)",
27329d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
27339d25917dSJussi Kivilinna 		.suite = {
27349d25917dSJussi Kivilinna 			.cipher = {
273521c8e720SArd Biesheuvel 				.enc = __VECS(serpent_ctr_enc_tv_template),
273621c8e720SArd Biesheuvel 				.dec = __VECS(serpent_ctr_dec_tv_template)
27379d25917dSJussi Kivilinna 			}
27389d25917dSJussi Kivilinna 		}
27399d25917dSJussi Kivilinna 	}, {
2740573da620SJussi Kivilinna 		.alg = "ctr(twofish)",
2741573da620SJussi Kivilinna 		.test = alg_test_skcipher,
2742573da620SJussi Kivilinna 		.suite = {
2743573da620SJussi Kivilinna 			.cipher = {
274421c8e720SArd Biesheuvel 				.enc = __VECS(tf_ctr_enc_tv_template),
274521c8e720SArd Biesheuvel 				.dec = __VECS(tf_ctr_dec_tv_template)
2746573da620SJussi Kivilinna 			}
2747573da620SJussi Kivilinna 		}
2748573da620SJussi Kivilinna 	}, {
2749da7f033dSHerbert Xu 		.alg = "cts(cbc(aes))",
27501aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2751da7f033dSHerbert Xu 		.suite = {
2752da7f033dSHerbert Xu 			.cipher = {
275321c8e720SArd Biesheuvel 				.enc = __VECS(cts_mode_enc_tv_template),
275421c8e720SArd Biesheuvel 				.dec = __VECS(cts_mode_dec_tv_template)
2755da7f033dSHerbert Xu 			}
2756da7f033dSHerbert Xu 		}
2757da7f033dSHerbert Xu 	}, {
2758da7f033dSHerbert Xu 		.alg = "deflate",
2759da7f033dSHerbert Xu 		.test = alg_test_comp,
27600818904dSMilan Broz 		.fips_allowed = 1,
2761da7f033dSHerbert Xu 		.suite = {
2762da7f033dSHerbert Xu 			.comp = {
276321c8e720SArd Biesheuvel 				.comp = __VECS(deflate_comp_tv_template),
276421c8e720SArd Biesheuvel 				.decomp = __VECS(deflate_decomp_tv_template)
2765da7f033dSHerbert Xu 			}
2766da7f033dSHerbert Xu 		}
2767da7f033dSHerbert Xu 	}, {
2768802c7f1cSSalvatore Benedetto 		.alg = "dh",
2769802c7f1cSSalvatore Benedetto 		.test = alg_test_kpp,
2770802c7f1cSSalvatore Benedetto 		.fips_allowed = 1,
2771802c7f1cSSalvatore Benedetto 		.suite = {
277221c8e720SArd Biesheuvel 			.kpp = __VECS(dh_tv_template)
2773802c7f1cSSalvatore Benedetto 		}
2774802c7f1cSSalvatore Benedetto 	}, {
2775e448370dSJussi Kivilinna 		.alg = "digest_null",
2776e448370dSJussi Kivilinna 		.test = alg_test_null,
2777e448370dSJussi Kivilinna 	}, {
277864d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes128",
277964d1cdfbSStephan Mueller 		.test = alg_test_drbg,
278064d1cdfbSStephan Mueller 		.fips_allowed = 1,
278164d1cdfbSStephan Mueller 		.suite = {
278221c8e720SArd Biesheuvel 			.drbg = __VECS(drbg_nopr_ctr_aes128_tv_template)
278364d1cdfbSStephan Mueller 		}
278464d1cdfbSStephan Mueller 	}, {
278564d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes192",
278664d1cdfbSStephan Mueller 		.test = alg_test_drbg,
278764d1cdfbSStephan Mueller 		.fips_allowed = 1,
278864d1cdfbSStephan Mueller 		.suite = {
278921c8e720SArd Biesheuvel 			.drbg = __VECS(drbg_nopr_ctr_aes192_tv_template)
279064d1cdfbSStephan Mueller 		}
279164d1cdfbSStephan Mueller 	}, {
279264d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes256",
279364d1cdfbSStephan Mueller 		.test = alg_test_drbg,
279464d1cdfbSStephan Mueller 		.fips_allowed = 1,
279564d1cdfbSStephan Mueller 		.suite = {
279621c8e720SArd Biesheuvel 			.drbg = __VECS(drbg_nopr_ctr_aes256_tv_template)
279764d1cdfbSStephan Mueller 		}
279864d1cdfbSStephan Mueller 	}, {
279964d1cdfbSStephan Mueller 		/*
280064d1cdfbSStephan Mueller 		 * There is no need to specifically test the DRBG with every
280164d1cdfbSStephan Mueller 		 * backend cipher -- covered by drbg_nopr_hmac_sha256 test
280264d1cdfbSStephan Mueller 		 */
280364d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha1",
280464d1cdfbSStephan Mueller 		.fips_allowed = 1,
280564d1cdfbSStephan Mueller 		.test = alg_test_null,
280664d1cdfbSStephan Mueller 	}, {
280764d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha256",
280864d1cdfbSStephan Mueller 		.test = alg_test_drbg,
280964d1cdfbSStephan Mueller 		.fips_allowed = 1,
281064d1cdfbSStephan Mueller 		.suite = {
281121c8e720SArd Biesheuvel 			.drbg = __VECS(drbg_nopr_hmac_sha256_tv_template)
281264d1cdfbSStephan Mueller 		}
281364d1cdfbSStephan Mueller 	}, {
281464d1cdfbSStephan Mueller 		/* covered by drbg_nopr_hmac_sha256 test */
281564d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha384",
281664d1cdfbSStephan Mueller 		.fips_allowed = 1,
281764d1cdfbSStephan Mueller 		.test = alg_test_null,
281864d1cdfbSStephan Mueller 	}, {
281964d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha512",
282064d1cdfbSStephan Mueller 		.test = alg_test_null,
282164d1cdfbSStephan Mueller 		.fips_allowed = 1,
282264d1cdfbSStephan Mueller 	}, {
282364d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha1",
282464d1cdfbSStephan Mueller 		.fips_allowed = 1,
282564d1cdfbSStephan Mueller 		.test = alg_test_null,
282664d1cdfbSStephan Mueller 	}, {
282764d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha256",
282864d1cdfbSStephan Mueller 		.test = alg_test_drbg,
282964d1cdfbSStephan Mueller 		.fips_allowed = 1,
283064d1cdfbSStephan Mueller 		.suite = {
283121c8e720SArd Biesheuvel 			.drbg = __VECS(drbg_nopr_sha256_tv_template)
283264d1cdfbSStephan Mueller 		}
283364d1cdfbSStephan Mueller 	}, {
283464d1cdfbSStephan Mueller 		/* covered by drbg_nopr_sha256 test */
283564d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha384",
283664d1cdfbSStephan Mueller 		.fips_allowed = 1,
283764d1cdfbSStephan Mueller 		.test = alg_test_null,
283864d1cdfbSStephan Mueller 	}, {
283964d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha512",
284064d1cdfbSStephan Mueller 		.fips_allowed = 1,
284164d1cdfbSStephan Mueller 		.test = alg_test_null,
284264d1cdfbSStephan Mueller 	}, {
284364d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes128",
284464d1cdfbSStephan Mueller 		.test = alg_test_drbg,
284564d1cdfbSStephan Mueller 		.fips_allowed = 1,
284664d1cdfbSStephan Mueller 		.suite = {
284721c8e720SArd Biesheuvel 			.drbg = __VECS(drbg_pr_ctr_aes128_tv_template)
284864d1cdfbSStephan Mueller 		}
284964d1cdfbSStephan Mueller 	}, {
285064d1cdfbSStephan Mueller 		/* covered by drbg_pr_ctr_aes128 test */
285164d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes192",
285264d1cdfbSStephan Mueller 		.fips_allowed = 1,
285364d1cdfbSStephan Mueller 		.test = alg_test_null,
285464d1cdfbSStephan Mueller 	}, {
285564d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes256",
285664d1cdfbSStephan Mueller 		.fips_allowed = 1,
285764d1cdfbSStephan Mueller 		.test = alg_test_null,
285864d1cdfbSStephan Mueller 	}, {
285964d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha1",
286064d1cdfbSStephan Mueller 		.fips_allowed = 1,
286164d1cdfbSStephan Mueller 		.test = alg_test_null,
286264d1cdfbSStephan Mueller 	}, {
286364d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha256",
286464d1cdfbSStephan Mueller 		.test = alg_test_drbg,
286564d1cdfbSStephan Mueller 		.fips_allowed = 1,
286664d1cdfbSStephan Mueller 		.suite = {
286721c8e720SArd Biesheuvel 			.drbg = __VECS(drbg_pr_hmac_sha256_tv_template)
286864d1cdfbSStephan Mueller 		}
286964d1cdfbSStephan Mueller 	}, {
287064d1cdfbSStephan Mueller 		/* covered by drbg_pr_hmac_sha256 test */
287164d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha384",
287264d1cdfbSStephan Mueller 		.fips_allowed = 1,
287364d1cdfbSStephan Mueller 		.test = alg_test_null,
287464d1cdfbSStephan Mueller 	}, {
287564d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha512",
287664d1cdfbSStephan Mueller 		.test = alg_test_null,
287764d1cdfbSStephan Mueller 		.fips_allowed = 1,
287864d1cdfbSStephan Mueller 	}, {
287964d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha1",
288064d1cdfbSStephan Mueller 		.fips_allowed = 1,
288164d1cdfbSStephan Mueller 		.test = alg_test_null,
288264d1cdfbSStephan Mueller 	}, {
288364d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha256",
288464d1cdfbSStephan Mueller 		.test = alg_test_drbg,
288564d1cdfbSStephan Mueller 		.fips_allowed = 1,
288664d1cdfbSStephan Mueller 		.suite = {
288721c8e720SArd Biesheuvel 			.drbg = __VECS(drbg_pr_sha256_tv_template)
288864d1cdfbSStephan Mueller 		}
288964d1cdfbSStephan Mueller 	}, {
289064d1cdfbSStephan Mueller 		/* covered by drbg_pr_sha256 test */
289164d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha384",
289264d1cdfbSStephan Mueller 		.fips_allowed = 1,
289364d1cdfbSStephan Mueller 		.test = alg_test_null,
289464d1cdfbSStephan Mueller 	}, {
289564d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha512",
289664d1cdfbSStephan Mueller 		.fips_allowed = 1,
289764d1cdfbSStephan Mueller 		.test = alg_test_null,
289864d1cdfbSStephan Mueller 	}, {
2899da7f033dSHerbert Xu 		.alg = "ecb(aes)",
29001aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2901a1915d51SJarod Wilson 		.fips_allowed = 1,
2902da7f033dSHerbert Xu 		.suite = {
2903da7f033dSHerbert Xu 			.cipher = {
290421c8e720SArd Biesheuvel 				.enc = __VECS(aes_enc_tv_template),
290521c8e720SArd Biesheuvel 				.dec = __VECS(aes_dec_tv_template)
2906da7f033dSHerbert Xu 			}
2907da7f033dSHerbert Xu 		}
2908da7f033dSHerbert Xu 	}, {
2909da7f033dSHerbert Xu 		.alg = "ecb(anubis)",
29101aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2911da7f033dSHerbert Xu 		.suite = {
2912da7f033dSHerbert Xu 			.cipher = {
291321c8e720SArd Biesheuvel 				.enc = __VECS(anubis_enc_tv_template),
291421c8e720SArd Biesheuvel 				.dec = __VECS(anubis_dec_tv_template)
2915da7f033dSHerbert Xu 			}
2916da7f033dSHerbert Xu 		}
2917da7f033dSHerbert Xu 	}, {
2918da7f033dSHerbert Xu 		.alg = "ecb(arc4)",
29191aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2920da7f033dSHerbert Xu 		.suite = {
2921da7f033dSHerbert Xu 			.cipher = {
292221c8e720SArd Biesheuvel 				.enc = __VECS(arc4_enc_tv_template),
292321c8e720SArd Biesheuvel 				.dec = __VECS(arc4_dec_tv_template)
2924da7f033dSHerbert Xu 			}
2925da7f033dSHerbert Xu 		}
2926da7f033dSHerbert Xu 	}, {
2927da7f033dSHerbert Xu 		.alg = "ecb(blowfish)",
29281aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2929da7f033dSHerbert Xu 		.suite = {
2930da7f033dSHerbert Xu 			.cipher = {
293121c8e720SArd Biesheuvel 				.enc = __VECS(bf_enc_tv_template),
293221c8e720SArd Biesheuvel 				.dec = __VECS(bf_dec_tv_template)
2933da7f033dSHerbert Xu 			}
2934da7f033dSHerbert Xu 		}
2935da7f033dSHerbert Xu 	}, {
2936da7f033dSHerbert Xu 		.alg = "ecb(camellia)",
29371aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2938da7f033dSHerbert Xu 		.suite = {
2939da7f033dSHerbert Xu 			.cipher = {
294021c8e720SArd Biesheuvel 				.enc = __VECS(camellia_enc_tv_template),
294121c8e720SArd Biesheuvel 				.dec = __VECS(camellia_dec_tv_template)
2942da7f033dSHerbert Xu 			}
2943da7f033dSHerbert Xu 		}
2944da7f033dSHerbert Xu 	}, {
2945da7f033dSHerbert Xu 		.alg = "ecb(cast5)",
29461aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2947da7f033dSHerbert Xu 		.suite = {
2948da7f033dSHerbert Xu 			.cipher = {
294921c8e720SArd Biesheuvel 				.enc = __VECS(cast5_enc_tv_template),
295021c8e720SArd Biesheuvel 				.dec = __VECS(cast5_dec_tv_template)
2951da7f033dSHerbert Xu 			}
2952da7f033dSHerbert Xu 		}
2953da7f033dSHerbert Xu 	}, {
2954da7f033dSHerbert Xu 		.alg = "ecb(cast6)",
29551aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2956da7f033dSHerbert Xu 		.suite = {
2957da7f033dSHerbert Xu 			.cipher = {
295821c8e720SArd Biesheuvel 				.enc = __VECS(cast6_enc_tv_template),
295921c8e720SArd Biesheuvel 				.dec = __VECS(cast6_dec_tv_template)
2960da7f033dSHerbert Xu 			}
2961da7f033dSHerbert Xu 		}
2962da7f033dSHerbert Xu 	}, {
2963e448370dSJussi Kivilinna 		.alg = "ecb(cipher_null)",
2964e448370dSJussi Kivilinna 		.test = alg_test_null,
29656175ca2bSMilan Broz 		.fips_allowed = 1,
2966e448370dSJussi Kivilinna 	}, {
2967da7f033dSHerbert Xu 		.alg = "ecb(des)",
29681aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2969da7f033dSHerbert Xu 		.suite = {
2970da7f033dSHerbert Xu 			.cipher = {
297121c8e720SArd Biesheuvel 				.enc = __VECS(des_enc_tv_template),
297221c8e720SArd Biesheuvel 				.dec = __VECS(des_dec_tv_template)
2973da7f033dSHerbert Xu 			}
2974da7f033dSHerbert Xu 		}
2975da7f033dSHerbert Xu 	}, {
2976da7f033dSHerbert Xu 		.alg = "ecb(des3_ede)",
29771aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2978a1915d51SJarod Wilson 		.fips_allowed = 1,
2979da7f033dSHerbert Xu 		.suite = {
2980da7f033dSHerbert Xu 			.cipher = {
298121c8e720SArd Biesheuvel 				.enc = __VECS(des3_ede_enc_tv_template),
298221c8e720SArd Biesheuvel 				.dec = __VECS(des3_ede_dec_tv_template)
2983da7f033dSHerbert Xu 			}
2984da7f033dSHerbert Xu 		}
2985da7f033dSHerbert Xu 	}, {
298666e5bd00SJussi Kivilinna 		.alg = "ecb(fcrypt)",
298766e5bd00SJussi Kivilinna 		.test = alg_test_skcipher,
298866e5bd00SJussi Kivilinna 		.suite = {
298966e5bd00SJussi Kivilinna 			.cipher = {
299066e5bd00SJussi Kivilinna 				.enc = {
299166e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_enc_tv_template,
299266e5bd00SJussi Kivilinna 					.count = 1
299366e5bd00SJussi Kivilinna 				},
299466e5bd00SJussi Kivilinna 				.dec = {
299566e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_dec_tv_template,
299666e5bd00SJussi Kivilinna 					.count = 1
299766e5bd00SJussi Kivilinna 				}
299866e5bd00SJussi Kivilinna 			}
299966e5bd00SJussi Kivilinna 		}
300066e5bd00SJussi Kivilinna 	}, {
3001da7f033dSHerbert Xu 		.alg = "ecb(khazad)",
30021aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3003da7f033dSHerbert Xu 		.suite = {
3004da7f033dSHerbert Xu 			.cipher = {
300521c8e720SArd Biesheuvel 				.enc = __VECS(khazad_enc_tv_template),
300621c8e720SArd Biesheuvel 				.dec = __VECS(khazad_dec_tv_template)
3007da7f033dSHerbert Xu 			}
3008da7f033dSHerbert Xu 		}
3009da7f033dSHerbert Xu 	}, {
3010da7f033dSHerbert Xu 		.alg = "ecb(seed)",
30111aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3012da7f033dSHerbert Xu 		.suite = {
3013da7f033dSHerbert Xu 			.cipher = {
301421c8e720SArd Biesheuvel 				.enc = __VECS(seed_enc_tv_template),
301521c8e720SArd Biesheuvel 				.dec = __VECS(seed_dec_tv_template)
3016da7f033dSHerbert Xu 			}
3017da7f033dSHerbert Xu 		}
3018da7f033dSHerbert Xu 	}, {
3019da7f033dSHerbert Xu 		.alg = "ecb(serpent)",
30201aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3021da7f033dSHerbert Xu 		.suite = {
3022da7f033dSHerbert Xu 			.cipher = {
302321c8e720SArd Biesheuvel 				.enc = __VECS(serpent_enc_tv_template),
302421c8e720SArd Biesheuvel 				.dec = __VECS(serpent_dec_tv_template)
3025da7f033dSHerbert Xu 			}
3026da7f033dSHerbert Xu 		}
3027da7f033dSHerbert Xu 	}, {
3028cd83a8a7SGilad Ben-Yossef 		.alg = "ecb(sm4)",
3029cd83a8a7SGilad Ben-Yossef 		.test = alg_test_skcipher,
3030cd83a8a7SGilad Ben-Yossef 		.suite = {
3031cd83a8a7SGilad Ben-Yossef 			.cipher = {
3032cd83a8a7SGilad Ben-Yossef 				.enc = __VECS(sm4_enc_tv_template),
3033cd83a8a7SGilad Ben-Yossef 				.dec = __VECS(sm4_dec_tv_template)
3034cd83a8a7SGilad Ben-Yossef 			}
3035cd83a8a7SGilad Ben-Yossef 		}
3036cd83a8a7SGilad Ben-Yossef 	}, {
3037da7a0ab5SEric Biggers 		.alg = "ecb(speck128)",
3038da7a0ab5SEric Biggers 		.test = alg_test_skcipher,
3039da7a0ab5SEric Biggers 		.suite = {
3040da7a0ab5SEric Biggers 			.cipher = {
3041da7a0ab5SEric Biggers 				.enc = __VECS(speck128_enc_tv_template),
3042da7a0ab5SEric Biggers 				.dec = __VECS(speck128_dec_tv_template)
3043da7a0ab5SEric Biggers 			}
3044da7a0ab5SEric Biggers 		}
3045da7a0ab5SEric Biggers 	}, {
3046da7a0ab5SEric Biggers 		.alg = "ecb(speck64)",
3047da7a0ab5SEric Biggers 		.test = alg_test_skcipher,
3048da7a0ab5SEric Biggers 		.suite = {
3049da7a0ab5SEric Biggers 			.cipher = {
3050da7a0ab5SEric Biggers 				.enc = __VECS(speck64_enc_tv_template),
3051da7a0ab5SEric Biggers 				.dec = __VECS(speck64_dec_tv_template)
3052da7a0ab5SEric Biggers 			}
3053da7a0ab5SEric Biggers 		}
3054da7a0ab5SEric Biggers 	}, {
3055da7f033dSHerbert Xu 		.alg = "ecb(tea)",
30561aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3057da7f033dSHerbert Xu 		.suite = {
3058da7f033dSHerbert Xu 			.cipher = {
305921c8e720SArd Biesheuvel 				.enc = __VECS(tea_enc_tv_template),
306021c8e720SArd Biesheuvel 				.dec = __VECS(tea_dec_tv_template)
3061da7f033dSHerbert Xu 			}
3062da7f033dSHerbert Xu 		}
3063da7f033dSHerbert Xu 	}, {
3064da7f033dSHerbert Xu 		.alg = "ecb(tnepres)",
30651aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3066da7f033dSHerbert Xu 		.suite = {
3067da7f033dSHerbert Xu 			.cipher = {
306821c8e720SArd Biesheuvel 				.enc = __VECS(tnepres_enc_tv_template),
306921c8e720SArd Biesheuvel 				.dec = __VECS(tnepres_dec_tv_template)
3070da7f033dSHerbert Xu 			}
3071da7f033dSHerbert Xu 		}
3072da7f033dSHerbert Xu 	}, {
3073da7f033dSHerbert Xu 		.alg = "ecb(twofish)",
30741aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3075da7f033dSHerbert Xu 		.suite = {
3076da7f033dSHerbert Xu 			.cipher = {
307721c8e720SArd Biesheuvel 				.enc = __VECS(tf_enc_tv_template),
307821c8e720SArd Biesheuvel 				.dec = __VECS(tf_dec_tv_template)
3079da7f033dSHerbert Xu 			}
3080da7f033dSHerbert Xu 		}
3081da7f033dSHerbert Xu 	}, {
3082da7f033dSHerbert Xu 		.alg = "ecb(xeta)",
30831aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3084da7f033dSHerbert Xu 		.suite = {
3085da7f033dSHerbert Xu 			.cipher = {
308621c8e720SArd Biesheuvel 				.enc = __VECS(xeta_enc_tv_template),
308721c8e720SArd Biesheuvel 				.dec = __VECS(xeta_dec_tv_template)
3088da7f033dSHerbert Xu 			}
3089da7f033dSHerbert Xu 		}
3090da7f033dSHerbert Xu 	}, {
3091da7f033dSHerbert Xu 		.alg = "ecb(xtea)",
30921aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3093da7f033dSHerbert Xu 		.suite = {
3094da7f033dSHerbert Xu 			.cipher = {
309521c8e720SArd Biesheuvel 				.enc = __VECS(xtea_enc_tv_template),
309621c8e720SArd Biesheuvel 				.dec = __VECS(xtea_dec_tv_template)
3097da7f033dSHerbert Xu 			}
3098da7f033dSHerbert Xu 		}
3099da7f033dSHerbert Xu 	}, {
31003c4b2390SSalvatore Benedetto 		.alg = "ecdh",
31013c4b2390SSalvatore Benedetto 		.test = alg_test_kpp,
31023c4b2390SSalvatore Benedetto 		.fips_allowed = 1,
31033c4b2390SSalvatore Benedetto 		.suite = {
310421c8e720SArd Biesheuvel 			.kpp = __VECS(ecdh_tv_template)
31053c4b2390SSalvatore Benedetto 		}
31063c4b2390SSalvatore Benedetto 	}, {
3107da7f033dSHerbert Xu 		.alg = "gcm(aes)",
3108da7f033dSHerbert Xu 		.test = alg_test_aead,
3109a1915d51SJarod Wilson 		.fips_allowed = 1,
3110da7f033dSHerbert Xu 		.suite = {
3111da7f033dSHerbert Xu 			.aead = {
311221c8e720SArd Biesheuvel 				.enc = __VECS(aes_gcm_enc_tv_template),
311321c8e720SArd Biesheuvel 				.dec = __VECS(aes_gcm_dec_tv_template)
3114da7f033dSHerbert Xu 			}
3115da7f033dSHerbert Xu 		}
3116da7f033dSHerbert Xu 	}, {
3117507069c9SYouquan, Song 		.alg = "ghash",
3118507069c9SYouquan, Song 		.test = alg_test_hash,
311918c0ebd2SJarod Wilson 		.fips_allowed = 1,
3120507069c9SYouquan, Song 		.suite = {
312121c8e720SArd Biesheuvel 			.hash = __VECS(ghash_tv_template)
3122507069c9SYouquan, Song 		}
3123507069c9SYouquan, Song 	}, {
3124a482b081SSonic Zhang 		.alg = "hmac(crc32)",
3125a482b081SSonic Zhang 		.test = alg_test_hash,
3126a482b081SSonic Zhang 		.suite = {
312721c8e720SArd Biesheuvel 			.hash = __VECS(bfin_crc_tv_template)
3128a482b081SSonic Zhang 		}
3129a482b081SSonic Zhang 	}, {
3130da7f033dSHerbert Xu 		.alg = "hmac(md5)",
3131da7f033dSHerbert Xu 		.test = alg_test_hash,
3132da7f033dSHerbert Xu 		.suite = {
313321c8e720SArd Biesheuvel 			.hash = __VECS(hmac_md5_tv_template)
3134da7f033dSHerbert Xu 		}
3135da7f033dSHerbert Xu 	}, {
3136da7f033dSHerbert Xu 		.alg = "hmac(rmd128)",
3137da7f033dSHerbert Xu 		.test = alg_test_hash,
3138da7f033dSHerbert Xu 		.suite = {
313921c8e720SArd Biesheuvel 			.hash = __VECS(hmac_rmd128_tv_template)
3140da7f033dSHerbert Xu 		}
3141da7f033dSHerbert Xu 	}, {
3142da7f033dSHerbert Xu 		.alg = "hmac(rmd160)",
3143da7f033dSHerbert Xu 		.test = alg_test_hash,
3144da7f033dSHerbert Xu 		.suite = {
314521c8e720SArd Biesheuvel 			.hash = __VECS(hmac_rmd160_tv_template)
3146da7f033dSHerbert Xu 		}
3147da7f033dSHerbert Xu 	}, {
3148da7f033dSHerbert Xu 		.alg = "hmac(sha1)",
3149da7f033dSHerbert Xu 		.test = alg_test_hash,
3150a1915d51SJarod Wilson 		.fips_allowed = 1,
3151da7f033dSHerbert Xu 		.suite = {
315221c8e720SArd Biesheuvel 			.hash = __VECS(hmac_sha1_tv_template)
3153da7f033dSHerbert Xu 		}
3154da7f033dSHerbert Xu 	}, {
3155da7f033dSHerbert Xu 		.alg = "hmac(sha224)",
3156da7f033dSHerbert Xu 		.test = alg_test_hash,
3157a1915d51SJarod Wilson 		.fips_allowed = 1,
3158da7f033dSHerbert Xu 		.suite = {
315921c8e720SArd Biesheuvel 			.hash = __VECS(hmac_sha224_tv_template)
3160da7f033dSHerbert Xu 		}
3161da7f033dSHerbert Xu 	}, {
3162da7f033dSHerbert Xu 		.alg = "hmac(sha256)",
3163da7f033dSHerbert Xu 		.test = alg_test_hash,
3164a1915d51SJarod Wilson 		.fips_allowed = 1,
3165da7f033dSHerbert Xu 		.suite = {
316621c8e720SArd Biesheuvel 			.hash = __VECS(hmac_sha256_tv_template)
3167da7f033dSHerbert Xu 		}
3168da7f033dSHerbert Xu 	}, {
316998eca72fSraveendra padasalagi 		.alg = "hmac(sha3-224)",
317098eca72fSraveendra padasalagi 		.test = alg_test_hash,
317198eca72fSraveendra padasalagi 		.fips_allowed = 1,
317298eca72fSraveendra padasalagi 		.suite = {
317321c8e720SArd Biesheuvel 			.hash = __VECS(hmac_sha3_224_tv_template)
317498eca72fSraveendra padasalagi 		}
317598eca72fSraveendra padasalagi 	}, {
317698eca72fSraveendra padasalagi 		.alg = "hmac(sha3-256)",
317798eca72fSraveendra padasalagi 		.test = alg_test_hash,
317898eca72fSraveendra padasalagi 		.fips_allowed = 1,
317998eca72fSraveendra padasalagi 		.suite = {
318021c8e720SArd Biesheuvel 			.hash = __VECS(hmac_sha3_256_tv_template)
318198eca72fSraveendra padasalagi 		}
318298eca72fSraveendra padasalagi 	}, {
318398eca72fSraveendra padasalagi 		.alg = "hmac(sha3-384)",
318498eca72fSraveendra padasalagi 		.test = alg_test_hash,
318598eca72fSraveendra padasalagi 		.fips_allowed = 1,
318698eca72fSraveendra padasalagi 		.suite = {
318721c8e720SArd Biesheuvel 			.hash = __VECS(hmac_sha3_384_tv_template)
318898eca72fSraveendra padasalagi 		}
318998eca72fSraveendra padasalagi 	}, {
319098eca72fSraveendra padasalagi 		.alg = "hmac(sha3-512)",
319198eca72fSraveendra padasalagi 		.test = alg_test_hash,
319298eca72fSraveendra padasalagi 		.fips_allowed = 1,
319398eca72fSraveendra padasalagi 		.suite = {
319421c8e720SArd Biesheuvel 			.hash = __VECS(hmac_sha3_512_tv_template)
319598eca72fSraveendra padasalagi 		}
319698eca72fSraveendra padasalagi 	}, {
3197da7f033dSHerbert Xu 		.alg = "hmac(sha384)",
3198da7f033dSHerbert Xu 		.test = alg_test_hash,
3199a1915d51SJarod Wilson 		.fips_allowed = 1,
3200da7f033dSHerbert Xu 		.suite = {
320121c8e720SArd Biesheuvel 			.hash = __VECS(hmac_sha384_tv_template)
3202da7f033dSHerbert Xu 		}
3203da7f033dSHerbert Xu 	}, {
3204da7f033dSHerbert Xu 		.alg = "hmac(sha512)",
3205da7f033dSHerbert Xu 		.test = alg_test_hash,
3206a1915d51SJarod Wilson 		.fips_allowed = 1,
3207da7f033dSHerbert Xu 		.suite = {
320821c8e720SArd Biesheuvel 			.hash = __VECS(hmac_sha512_tv_template)
3209da7f033dSHerbert Xu 		}
3210da7f033dSHerbert Xu 	}, {
3211bb5530e4SStephan Mueller 		.alg = "jitterentropy_rng",
3212bb5530e4SStephan Mueller 		.fips_allowed = 1,
3213bb5530e4SStephan Mueller 		.test = alg_test_null,
3214bb5530e4SStephan Mueller 	}, {
321535351988SStephan Mueller 		.alg = "kw(aes)",
321635351988SStephan Mueller 		.test = alg_test_skcipher,
321735351988SStephan Mueller 		.fips_allowed = 1,
321835351988SStephan Mueller 		.suite = {
321935351988SStephan Mueller 			.cipher = {
322021c8e720SArd Biesheuvel 				.enc = __VECS(aes_kw_enc_tv_template),
322121c8e720SArd Biesheuvel 				.dec = __VECS(aes_kw_dec_tv_template)
322235351988SStephan Mueller 			}
322335351988SStephan Mueller 		}
322435351988SStephan Mueller 	}, {
3225da7f033dSHerbert Xu 		.alg = "lrw(aes)",
32261aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3227da7f033dSHerbert Xu 		.suite = {
3228da7f033dSHerbert Xu 			.cipher = {
322921c8e720SArd Biesheuvel 				.enc = __VECS(aes_lrw_enc_tv_template),
323021c8e720SArd Biesheuvel 				.dec = __VECS(aes_lrw_dec_tv_template)
3231da7f033dSHerbert Xu 			}
3232da7f033dSHerbert Xu 		}
3233da7f033dSHerbert Xu 	}, {
32340840605eSJussi Kivilinna 		.alg = "lrw(camellia)",
32350840605eSJussi Kivilinna 		.test = alg_test_skcipher,
32360840605eSJussi Kivilinna 		.suite = {
32370840605eSJussi Kivilinna 			.cipher = {
323821c8e720SArd Biesheuvel 				.enc = __VECS(camellia_lrw_enc_tv_template),
323921c8e720SArd Biesheuvel 				.dec = __VECS(camellia_lrw_dec_tv_template)
32400840605eSJussi Kivilinna 			}
32410840605eSJussi Kivilinna 		}
32420840605eSJussi Kivilinna 	}, {
32439b8b0405SJohannes Goetzfried 		.alg = "lrw(cast6)",
32449b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
32459b8b0405SJohannes Goetzfried 		.suite = {
32469b8b0405SJohannes Goetzfried 			.cipher = {
324721c8e720SArd Biesheuvel 				.enc = __VECS(cast6_lrw_enc_tv_template),
324821c8e720SArd Biesheuvel 				.dec = __VECS(cast6_lrw_dec_tv_template)
32499b8b0405SJohannes Goetzfried 			}
32509b8b0405SJohannes Goetzfried 		}
32519b8b0405SJohannes Goetzfried 	}, {
3252d7bfc0faSJussi Kivilinna 		.alg = "lrw(serpent)",
3253d7bfc0faSJussi Kivilinna 		.test = alg_test_skcipher,
3254d7bfc0faSJussi Kivilinna 		.suite = {
3255d7bfc0faSJussi Kivilinna 			.cipher = {
325621c8e720SArd Biesheuvel 				.enc = __VECS(serpent_lrw_enc_tv_template),
325721c8e720SArd Biesheuvel 				.dec = __VECS(serpent_lrw_dec_tv_template)
3258d7bfc0faSJussi Kivilinna 			}
3259d7bfc0faSJussi Kivilinna 		}
3260d7bfc0faSJussi Kivilinna 	}, {
32610b2a1551SJussi Kivilinna 		.alg = "lrw(twofish)",
32620b2a1551SJussi Kivilinna 		.test = alg_test_skcipher,
32630b2a1551SJussi Kivilinna 		.suite = {
32640b2a1551SJussi Kivilinna 			.cipher = {
326521c8e720SArd Biesheuvel 				.enc = __VECS(tf_lrw_enc_tv_template),
326621c8e720SArd Biesheuvel 				.dec = __VECS(tf_lrw_dec_tv_template)
32670b2a1551SJussi Kivilinna 			}
32680b2a1551SJussi Kivilinna 		}
32690b2a1551SJussi Kivilinna 	}, {
32701443cc9bSKOVACS Krisztian 		.alg = "lz4",
32711443cc9bSKOVACS Krisztian 		.test = alg_test_comp,
32721443cc9bSKOVACS Krisztian 		.fips_allowed = 1,
32731443cc9bSKOVACS Krisztian 		.suite = {
32741443cc9bSKOVACS Krisztian 			.comp = {
327521c8e720SArd Biesheuvel 				.comp = __VECS(lz4_comp_tv_template),
327621c8e720SArd Biesheuvel 				.decomp = __VECS(lz4_decomp_tv_template)
32771443cc9bSKOVACS Krisztian 			}
32781443cc9bSKOVACS Krisztian 		}
32791443cc9bSKOVACS Krisztian 	}, {
32801443cc9bSKOVACS Krisztian 		.alg = "lz4hc",
32811443cc9bSKOVACS Krisztian 		.test = alg_test_comp,
32821443cc9bSKOVACS Krisztian 		.fips_allowed = 1,
32831443cc9bSKOVACS Krisztian 		.suite = {
32841443cc9bSKOVACS Krisztian 			.comp = {
328521c8e720SArd Biesheuvel 				.comp = __VECS(lz4hc_comp_tv_template),
328621c8e720SArd Biesheuvel 				.decomp = __VECS(lz4hc_decomp_tv_template)
32871443cc9bSKOVACS Krisztian 			}
32881443cc9bSKOVACS Krisztian 		}
32891443cc9bSKOVACS Krisztian 	}, {
3290da7f033dSHerbert Xu 		.alg = "lzo",
3291da7f033dSHerbert Xu 		.test = alg_test_comp,
32920818904dSMilan Broz 		.fips_allowed = 1,
3293da7f033dSHerbert Xu 		.suite = {
3294da7f033dSHerbert Xu 			.comp = {
329521c8e720SArd Biesheuvel 				.comp = __VECS(lzo_comp_tv_template),
329621c8e720SArd Biesheuvel 				.decomp = __VECS(lzo_decomp_tv_template)
3297da7f033dSHerbert Xu 			}
3298da7f033dSHerbert Xu 		}
3299da7f033dSHerbert Xu 	}, {
3300da7f033dSHerbert Xu 		.alg = "md4",
3301da7f033dSHerbert Xu 		.test = alg_test_hash,
3302da7f033dSHerbert Xu 		.suite = {
330321c8e720SArd Biesheuvel 			.hash = __VECS(md4_tv_template)
3304da7f033dSHerbert Xu 		}
3305da7f033dSHerbert Xu 	}, {
3306da7f033dSHerbert Xu 		.alg = "md5",
3307da7f033dSHerbert Xu 		.test = alg_test_hash,
3308da7f033dSHerbert Xu 		.suite = {
330921c8e720SArd Biesheuvel 			.hash = __VECS(md5_tv_template)
3310da7f033dSHerbert Xu 		}
3311da7f033dSHerbert Xu 	}, {
3312da7f033dSHerbert Xu 		.alg = "michael_mic",
3313da7f033dSHerbert Xu 		.test = alg_test_hash,
3314da7f033dSHerbert Xu 		.suite = {
331521c8e720SArd Biesheuvel 			.hash = __VECS(michael_mic_tv_template)
3316da7f033dSHerbert Xu 		}
3317da7f033dSHerbert Xu 	}, {
3318ba0e14acSPuneet Saxena 		.alg = "ofb(aes)",
3319ba0e14acSPuneet Saxena 		.test = alg_test_skcipher,
3320ba0e14acSPuneet Saxena 		.fips_allowed = 1,
3321ba0e14acSPuneet Saxena 		.suite = {
3322ba0e14acSPuneet Saxena 			.cipher = {
332321c8e720SArd Biesheuvel 				.enc = __VECS(aes_ofb_enc_tv_template),
332421c8e720SArd Biesheuvel 				.dec = __VECS(aes_ofb_dec_tv_template)
3325ba0e14acSPuneet Saxena 			}
3326ba0e14acSPuneet Saxena 		}
3327ba0e14acSPuneet Saxena 	}, {
3328da7f033dSHerbert Xu 		.alg = "pcbc(fcrypt)",
33291aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3330da7f033dSHerbert Xu 		.suite = {
3331da7f033dSHerbert Xu 			.cipher = {
333221c8e720SArd Biesheuvel 				.enc = __VECS(fcrypt_pcbc_enc_tv_template),
333321c8e720SArd Biesheuvel 				.dec = __VECS(fcrypt_pcbc_dec_tv_template)
3334da7f033dSHerbert Xu 			}
3335da7f033dSHerbert Xu 		}
3336da7f033dSHerbert Xu 	}, {
33371207107cSStephan Mueller 		.alg = "pkcs1pad(rsa,sha224)",
33381207107cSStephan Mueller 		.test = alg_test_null,
33391207107cSStephan Mueller 		.fips_allowed = 1,
33401207107cSStephan Mueller 	}, {
33411207107cSStephan Mueller 		.alg = "pkcs1pad(rsa,sha256)",
33421207107cSStephan Mueller 		.test = alg_test_akcipher,
33431207107cSStephan Mueller 		.fips_allowed = 1,
33441207107cSStephan Mueller 		.suite = {
33451207107cSStephan Mueller 			.akcipher = __VECS(pkcs1pad_rsa_tv_template)
33461207107cSStephan Mueller 		}
33471207107cSStephan Mueller 	}, {
33481207107cSStephan Mueller 		.alg = "pkcs1pad(rsa,sha384)",
33491207107cSStephan Mueller 		.test = alg_test_null,
33501207107cSStephan Mueller 		.fips_allowed = 1,
33511207107cSStephan Mueller 	}, {
33521207107cSStephan Mueller 		.alg = "pkcs1pad(rsa,sha512)",
33531207107cSStephan Mueller 		.test = alg_test_null,
33541207107cSStephan Mueller 		.fips_allowed = 1,
33551207107cSStephan Mueller 	}, {
3356eee9dc61SMartin Willi 		.alg = "poly1305",
3357eee9dc61SMartin Willi 		.test = alg_test_hash,
3358eee9dc61SMartin Willi 		.suite = {
335921c8e720SArd Biesheuvel 			.hash = __VECS(poly1305_tv_template)
3360eee9dc61SMartin Willi 		}
3361eee9dc61SMartin Willi 	}, {
3362da7f033dSHerbert Xu 		.alg = "rfc3686(ctr(aes))",
33631aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3364a1915d51SJarod Wilson 		.fips_allowed = 1,
3365da7f033dSHerbert Xu 		.suite = {
3366da7f033dSHerbert Xu 			.cipher = {
336721c8e720SArd Biesheuvel 				.enc = __VECS(aes_ctr_rfc3686_enc_tv_template),
336821c8e720SArd Biesheuvel 				.dec = __VECS(aes_ctr_rfc3686_dec_tv_template)
3369da7f033dSHerbert Xu 			}
3370da7f033dSHerbert Xu 		}
3371da7f033dSHerbert Xu 	}, {
33723f31a740SHerbert Xu 		.alg = "rfc4106(gcm(aes))",
337369435b94SAdrian Hoban 		.test = alg_test_aead,
3374db71f29aSJarod Wilson 		.fips_allowed = 1,
337569435b94SAdrian Hoban 		.suite = {
337669435b94SAdrian Hoban 			.aead = {
337721c8e720SArd Biesheuvel 				.enc = __VECS(aes_gcm_rfc4106_enc_tv_template),
337821c8e720SArd Biesheuvel 				.dec = __VECS(aes_gcm_rfc4106_dec_tv_template)
337969435b94SAdrian Hoban 			}
338069435b94SAdrian Hoban 		}
338169435b94SAdrian Hoban 	}, {
3382544c436aSHerbert Xu 		.alg = "rfc4309(ccm(aes))",
33835d667322SJarod Wilson 		.test = alg_test_aead,
3384a1915d51SJarod Wilson 		.fips_allowed = 1,
33855d667322SJarod Wilson 		.suite = {
33865d667322SJarod Wilson 			.aead = {
338721c8e720SArd Biesheuvel 				.enc = __VECS(aes_ccm_rfc4309_enc_tv_template),
338821c8e720SArd Biesheuvel 				.dec = __VECS(aes_ccm_rfc4309_dec_tv_template)
33895d667322SJarod Wilson 			}
33905d667322SJarod Wilson 		}
33915d667322SJarod Wilson 	}, {
3392bb68745eSHerbert Xu 		.alg = "rfc4543(gcm(aes))",
3393e9b7441aSJussi Kivilinna 		.test = alg_test_aead,
3394e9b7441aSJussi Kivilinna 		.suite = {
3395e9b7441aSJussi Kivilinna 			.aead = {
339621c8e720SArd Biesheuvel 				.enc = __VECS(aes_gcm_rfc4543_enc_tv_template),
339721c8e720SArd Biesheuvel 				.dec = __VECS(aes_gcm_rfc4543_dec_tv_template),
3398e9b7441aSJussi Kivilinna 			}
3399e9b7441aSJussi Kivilinna 		}
3400e9b7441aSJussi Kivilinna 	}, {
3401af2b76b5SMartin Willi 		.alg = "rfc7539(chacha20,poly1305)",
3402af2b76b5SMartin Willi 		.test = alg_test_aead,
3403af2b76b5SMartin Willi 		.suite = {
3404af2b76b5SMartin Willi 			.aead = {
340521c8e720SArd Biesheuvel 				.enc = __VECS(rfc7539_enc_tv_template),
340621c8e720SArd Biesheuvel 				.dec = __VECS(rfc7539_dec_tv_template),
3407af2b76b5SMartin Willi 			}
3408af2b76b5SMartin Willi 		}
3409af2b76b5SMartin Willi 	}, {
34105900758dSMartin Willi 		.alg = "rfc7539esp(chacha20,poly1305)",
34115900758dSMartin Willi 		.test = alg_test_aead,
34125900758dSMartin Willi 		.suite = {
34135900758dSMartin Willi 			.aead = {
341421c8e720SArd Biesheuvel 				.enc = __VECS(rfc7539esp_enc_tv_template),
341521c8e720SArd Biesheuvel 				.dec = __VECS(rfc7539esp_dec_tv_template),
34165900758dSMartin Willi 			}
34175900758dSMartin Willi 		}
34185900758dSMartin Willi 	}, {
3419da7f033dSHerbert Xu 		.alg = "rmd128",
3420da7f033dSHerbert Xu 		.test = alg_test_hash,
3421da7f033dSHerbert Xu 		.suite = {
342221c8e720SArd Biesheuvel 			.hash = __VECS(rmd128_tv_template)
3423da7f033dSHerbert Xu 		}
3424da7f033dSHerbert Xu 	}, {
3425da7f033dSHerbert Xu 		.alg = "rmd160",
3426da7f033dSHerbert Xu 		.test = alg_test_hash,
3427da7f033dSHerbert Xu 		.suite = {
342821c8e720SArd Biesheuvel 			.hash = __VECS(rmd160_tv_template)
3429da7f033dSHerbert Xu 		}
3430da7f033dSHerbert Xu 	}, {
3431da7f033dSHerbert Xu 		.alg = "rmd256",
3432da7f033dSHerbert Xu 		.test = alg_test_hash,
3433da7f033dSHerbert Xu 		.suite = {
343421c8e720SArd Biesheuvel 			.hash = __VECS(rmd256_tv_template)
3435da7f033dSHerbert Xu 		}
3436da7f033dSHerbert Xu 	}, {
3437da7f033dSHerbert Xu 		.alg = "rmd320",
3438da7f033dSHerbert Xu 		.test = alg_test_hash,
3439da7f033dSHerbert Xu 		.suite = {
344021c8e720SArd Biesheuvel 			.hash = __VECS(rmd320_tv_template)
3441da7f033dSHerbert Xu 		}
3442da7f033dSHerbert Xu 	}, {
3443946cc463STadeusz Struk 		.alg = "rsa",
3444946cc463STadeusz Struk 		.test = alg_test_akcipher,
3445946cc463STadeusz Struk 		.fips_allowed = 1,
3446946cc463STadeusz Struk 		.suite = {
344721c8e720SArd Biesheuvel 			.akcipher = __VECS(rsa_tv_template)
3448946cc463STadeusz Struk 		}
3449946cc463STadeusz Struk 	}, {
3450da7f033dSHerbert Xu 		.alg = "salsa20",
34511aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3452da7f033dSHerbert Xu 		.suite = {
3453da7f033dSHerbert Xu 			.cipher = {
345421c8e720SArd Biesheuvel 				.enc = __VECS(salsa20_stream_enc_tv_template)
3455da7f033dSHerbert Xu 			}
3456da7f033dSHerbert Xu 		}
3457da7f033dSHerbert Xu 	}, {
3458da7f033dSHerbert Xu 		.alg = "sha1",
3459da7f033dSHerbert Xu 		.test = alg_test_hash,
3460a1915d51SJarod Wilson 		.fips_allowed = 1,
3461da7f033dSHerbert Xu 		.suite = {
346221c8e720SArd Biesheuvel 			.hash = __VECS(sha1_tv_template)
3463da7f033dSHerbert Xu 		}
3464da7f033dSHerbert Xu 	}, {
3465da7f033dSHerbert Xu 		.alg = "sha224",
3466da7f033dSHerbert Xu 		.test = alg_test_hash,
3467a1915d51SJarod Wilson 		.fips_allowed = 1,
3468da7f033dSHerbert Xu 		.suite = {
346921c8e720SArd Biesheuvel 			.hash = __VECS(sha224_tv_template)
3470da7f033dSHerbert Xu 		}
3471da7f033dSHerbert Xu 	}, {
3472da7f033dSHerbert Xu 		.alg = "sha256",
3473da7f033dSHerbert Xu 		.test = alg_test_hash,
3474a1915d51SJarod Wilson 		.fips_allowed = 1,
3475da7f033dSHerbert Xu 		.suite = {
347621c8e720SArd Biesheuvel 			.hash = __VECS(sha256_tv_template)
3477da7f033dSHerbert Xu 		}
3478da7f033dSHerbert Xu 	}, {
347979cc6ab8Sraveendra padasalagi 		.alg = "sha3-224",
348079cc6ab8Sraveendra padasalagi 		.test = alg_test_hash,
348179cc6ab8Sraveendra padasalagi 		.fips_allowed = 1,
348279cc6ab8Sraveendra padasalagi 		.suite = {
348321c8e720SArd Biesheuvel 			.hash = __VECS(sha3_224_tv_template)
348479cc6ab8Sraveendra padasalagi 		}
348579cc6ab8Sraveendra padasalagi 	}, {
348679cc6ab8Sraveendra padasalagi 		.alg = "sha3-256",
348779cc6ab8Sraveendra padasalagi 		.test = alg_test_hash,
348879cc6ab8Sraveendra padasalagi 		.fips_allowed = 1,
348979cc6ab8Sraveendra padasalagi 		.suite = {
349021c8e720SArd Biesheuvel 			.hash = __VECS(sha3_256_tv_template)
349179cc6ab8Sraveendra padasalagi 		}
349279cc6ab8Sraveendra padasalagi 	}, {
349379cc6ab8Sraveendra padasalagi 		.alg = "sha3-384",
349479cc6ab8Sraveendra padasalagi 		.test = alg_test_hash,
349579cc6ab8Sraveendra padasalagi 		.fips_allowed = 1,
349679cc6ab8Sraveendra padasalagi 		.suite = {
349721c8e720SArd Biesheuvel 			.hash = __VECS(sha3_384_tv_template)
349879cc6ab8Sraveendra padasalagi 		}
349979cc6ab8Sraveendra padasalagi 	}, {
350079cc6ab8Sraveendra padasalagi 		.alg = "sha3-512",
350179cc6ab8Sraveendra padasalagi 		.test = alg_test_hash,
350279cc6ab8Sraveendra padasalagi 		.fips_allowed = 1,
350379cc6ab8Sraveendra padasalagi 		.suite = {
350421c8e720SArd Biesheuvel 			.hash = __VECS(sha3_512_tv_template)
350579cc6ab8Sraveendra padasalagi 		}
350679cc6ab8Sraveendra padasalagi 	}, {
3507da7f033dSHerbert Xu 		.alg = "sha384",
3508da7f033dSHerbert Xu 		.test = alg_test_hash,
3509a1915d51SJarod Wilson 		.fips_allowed = 1,
3510da7f033dSHerbert Xu 		.suite = {
351121c8e720SArd Biesheuvel 			.hash = __VECS(sha384_tv_template)
3512da7f033dSHerbert Xu 		}
3513da7f033dSHerbert Xu 	}, {
3514da7f033dSHerbert Xu 		.alg = "sha512",
3515da7f033dSHerbert Xu 		.test = alg_test_hash,
3516a1915d51SJarod Wilson 		.fips_allowed = 1,
3517da7f033dSHerbert Xu 		.suite = {
351821c8e720SArd Biesheuvel 			.hash = __VECS(sha512_tv_template)
3519da7f033dSHerbert Xu 		}
3520da7f033dSHerbert Xu 	}, {
3521b7e27530SGilad Ben-Yossef 		.alg = "sm3",
3522b7e27530SGilad Ben-Yossef 		.test = alg_test_hash,
3523b7e27530SGilad Ben-Yossef 		.suite = {
3524b7e27530SGilad Ben-Yossef 			.hash = __VECS(sm3_tv_template)
3525b7e27530SGilad Ben-Yossef 		}
3526b7e27530SGilad Ben-Yossef 	}, {
3527da7f033dSHerbert Xu 		.alg = "tgr128",
3528da7f033dSHerbert Xu 		.test = alg_test_hash,
3529da7f033dSHerbert Xu 		.suite = {
353021c8e720SArd Biesheuvel 			.hash = __VECS(tgr128_tv_template)
3531da7f033dSHerbert Xu 		}
3532da7f033dSHerbert Xu 	}, {
3533da7f033dSHerbert Xu 		.alg = "tgr160",
3534da7f033dSHerbert Xu 		.test = alg_test_hash,
3535da7f033dSHerbert Xu 		.suite = {
353621c8e720SArd Biesheuvel 			.hash = __VECS(tgr160_tv_template)
3537da7f033dSHerbert Xu 		}
3538da7f033dSHerbert Xu 	}, {
3539da7f033dSHerbert Xu 		.alg = "tgr192",
3540da7f033dSHerbert Xu 		.test = alg_test_hash,
3541da7f033dSHerbert Xu 		.suite = {
354221c8e720SArd Biesheuvel 			.hash = __VECS(tgr192_tv_template)
3543da7f033dSHerbert Xu 		}
3544da7f033dSHerbert Xu 	}, {
3545f1939f7cSShane Wang 		.alg = "vmac(aes)",
3546f1939f7cSShane Wang 		.test = alg_test_hash,
3547f1939f7cSShane Wang 		.suite = {
354821c8e720SArd Biesheuvel 			.hash = __VECS(aes_vmac128_tv_template)
3549f1939f7cSShane Wang 		}
3550f1939f7cSShane Wang 	}, {
3551da7f033dSHerbert Xu 		.alg = "wp256",
3552da7f033dSHerbert Xu 		.test = alg_test_hash,
3553da7f033dSHerbert Xu 		.suite = {
355421c8e720SArd Biesheuvel 			.hash = __VECS(wp256_tv_template)
3555da7f033dSHerbert Xu 		}
3556da7f033dSHerbert Xu 	}, {
3557da7f033dSHerbert Xu 		.alg = "wp384",
3558da7f033dSHerbert Xu 		.test = alg_test_hash,
3559da7f033dSHerbert Xu 		.suite = {
356021c8e720SArd Biesheuvel 			.hash = __VECS(wp384_tv_template)
3561da7f033dSHerbert Xu 		}
3562da7f033dSHerbert Xu 	}, {
3563da7f033dSHerbert Xu 		.alg = "wp512",
3564da7f033dSHerbert Xu 		.test = alg_test_hash,
3565da7f033dSHerbert Xu 		.suite = {
356621c8e720SArd Biesheuvel 			.hash = __VECS(wp512_tv_template)
3567da7f033dSHerbert Xu 		}
3568da7f033dSHerbert Xu 	}, {
3569da7f033dSHerbert Xu 		.alg = "xcbc(aes)",
3570da7f033dSHerbert Xu 		.test = alg_test_hash,
3571da7f033dSHerbert Xu 		.suite = {
357221c8e720SArd Biesheuvel 			.hash = __VECS(aes_xcbc128_tv_template)
3573da7f033dSHerbert Xu 		}
3574da7f033dSHerbert Xu 	}, {
3575da7f033dSHerbert Xu 		.alg = "xts(aes)",
35761aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
35772918aa8dSJarod Wilson 		.fips_allowed = 1,
3578da7f033dSHerbert Xu 		.suite = {
3579da7f033dSHerbert Xu 			.cipher = {
358021c8e720SArd Biesheuvel 				.enc = __VECS(aes_xts_enc_tv_template),
358121c8e720SArd Biesheuvel 				.dec = __VECS(aes_xts_dec_tv_template)
3582da7f033dSHerbert Xu 			}
3583da7f033dSHerbert Xu 		}
35840c01aed5SGeert Uytterhoeven 	}, {
35850840605eSJussi Kivilinna 		.alg = "xts(camellia)",
35860840605eSJussi Kivilinna 		.test = alg_test_skcipher,
35870840605eSJussi Kivilinna 		.suite = {
35880840605eSJussi Kivilinna 			.cipher = {
358921c8e720SArd Biesheuvel 				.enc = __VECS(camellia_xts_enc_tv_template),
359021c8e720SArd Biesheuvel 				.dec = __VECS(camellia_xts_dec_tv_template)
35910840605eSJussi Kivilinna 			}
35920840605eSJussi Kivilinna 		}
35930840605eSJussi Kivilinna 	}, {
35949b8b0405SJohannes Goetzfried 		.alg = "xts(cast6)",
35959b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
35969b8b0405SJohannes Goetzfried 		.suite = {
35979b8b0405SJohannes Goetzfried 			.cipher = {
359821c8e720SArd Biesheuvel 				.enc = __VECS(cast6_xts_enc_tv_template),
359921c8e720SArd Biesheuvel 				.dec = __VECS(cast6_xts_dec_tv_template)
36009b8b0405SJohannes Goetzfried 			}
36019b8b0405SJohannes Goetzfried 		}
36029b8b0405SJohannes Goetzfried 	}, {
360318be20b9SJussi Kivilinna 		.alg = "xts(serpent)",
360418be20b9SJussi Kivilinna 		.test = alg_test_skcipher,
360518be20b9SJussi Kivilinna 		.suite = {
360618be20b9SJussi Kivilinna 			.cipher = {
360721c8e720SArd Biesheuvel 				.enc = __VECS(serpent_xts_enc_tv_template),
360821c8e720SArd Biesheuvel 				.dec = __VECS(serpent_xts_dec_tv_template)
360918be20b9SJussi Kivilinna 			}
361018be20b9SJussi Kivilinna 		}
361118be20b9SJussi Kivilinna 	}, {
3612c3bb521bSEric Biggers 		.alg = "xts(speck128)",
3613c3bb521bSEric Biggers 		.test = alg_test_skcipher,
3614c3bb521bSEric Biggers 		.suite = {
3615c3bb521bSEric Biggers 			.cipher = {
3616c3bb521bSEric Biggers 				.enc = __VECS(speck128_xts_enc_tv_template),
3617c3bb521bSEric Biggers 				.dec = __VECS(speck128_xts_dec_tv_template)
3618c3bb521bSEric Biggers 			}
3619c3bb521bSEric Biggers 		}
3620c3bb521bSEric Biggers 	}, {
362141b3316eSEric Biggers 		.alg = "xts(speck64)",
362241b3316eSEric Biggers 		.test = alg_test_skcipher,
362341b3316eSEric Biggers 		.suite = {
362441b3316eSEric Biggers 			.cipher = {
362541b3316eSEric Biggers 				.enc = __VECS(speck64_xts_enc_tv_template),
362641b3316eSEric Biggers 				.dec = __VECS(speck64_xts_dec_tv_template)
362741b3316eSEric Biggers 			}
362841b3316eSEric Biggers 		}
362941b3316eSEric Biggers 	}, {
3630aed265b9SJussi Kivilinna 		.alg = "xts(twofish)",
3631aed265b9SJussi Kivilinna 		.test = alg_test_skcipher,
3632aed265b9SJussi Kivilinna 		.suite = {
3633aed265b9SJussi Kivilinna 			.cipher = {
363421c8e720SArd Biesheuvel 				.enc = __VECS(tf_xts_enc_tv_template),
363521c8e720SArd Biesheuvel 				.dec = __VECS(tf_xts_dec_tv_template)
3636aed265b9SJussi Kivilinna 			}
3637aed265b9SJussi Kivilinna 		}
3638a368f43dSGiovanni Cabiddu 	}, {
3639a368f43dSGiovanni Cabiddu 		.alg = "zlib-deflate",
3640a368f43dSGiovanni Cabiddu 		.test = alg_test_comp,
3641a368f43dSGiovanni Cabiddu 		.fips_allowed = 1,
3642a368f43dSGiovanni Cabiddu 		.suite = {
3643a368f43dSGiovanni Cabiddu 			.comp = {
3644a368f43dSGiovanni Cabiddu 				.comp = __VECS(zlib_deflate_comp_tv_template),
3645a368f43dSGiovanni Cabiddu 				.decomp = __VECS(zlib_deflate_decomp_tv_template)
3646a368f43dSGiovanni Cabiddu 			}
3647a368f43dSGiovanni Cabiddu 		}
3648d28fc3dbSNick Terrell 	}, {
3649d28fc3dbSNick Terrell 		.alg = "zstd",
3650d28fc3dbSNick Terrell 		.test = alg_test_comp,
3651d28fc3dbSNick Terrell 		.fips_allowed = 1,
3652d28fc3dbSNick Terrell 		.suite = {
3653d28fc3dbSNick Terrell 			.comp = {
3654d28fc3dbSNick Terrell 				.comp = __VECS(zstd_comp_tv_template),
3655d28fc3dbSNick Terrell 				.decomp = __VECS(zstd_decomp_tv_template)
3656d28fc3dbSNick Terrell 			}
3657d28fc3dbSNick Terrell 		}
3658da7f033dSHerbert Xu 	}
3659da7f033dSHerbert Xu };
3660da7f033dSHerbert Xu 
36615714758bSJussi Kivilinna static bool alg_test_descs_checked;
36625714758bSJussi Kivilinna 
36635714758bSJussi Kivilinna static void alg_test_descs_check_order(void)
36645714758bSJussi Kivilinna {
36655714758bSJussi Kivilinna 	int i;
36665714758bSJussi Kivilinna 
36675714758bSJussi Kivilinna 	/* only check once */
36685714758bSJussi Kivilinna 	if (alg_test_descs_checked)
36695714758bSJussi Kivilinna 		return;
36705714758bSJussi Kivilinna 
36715714758bSJussi Kivilinna 	alg_test_descs_checked = true;
36725714758bSJussi Kivilinna 
36735714758bSJussi Kivilinna 	for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) {
36745714758bSJussi Kivilinna 		int diff = strcmp(alg_test_descs[i - 1].alg,
36755714758bSJussi Kivilinna 				  alg_test_descs[i].alg);
36765714758bSJussi Kivilinna 
36775714758bSJussi Kivilinna 		if (WARN_ON(diff > 0)) {
36785714758bSJussi Kivilinna 			pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n",
36795714758bSJussi Kivilinna 				alg_test_descs[i - 1].alg,
36805714758bSJussi Kivilinna 				alg_test_descs[i].alg);
36815714758bSJussi Kivilinna 		}
36825714758bSJussi Kivilinna 
36835714758bSJussi Kivilinna 		if (WARN_ON(diff == 0)) {
36845714758bSJussi Kivilinna 			pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n",
36855714758bSJussi Kivilinna 				alg_test_descs[i].alg);
36865714758bSJussi Kivilinna 		}
36875714758bSJussi Kivilinna 	}
36885714758bSJussi Kivilinna }
36895714758bSJussi Kivilinna 
36901aa4ecd9SHerbert Xu static int alg_find_test(const char *alg)
3691da7f033dSHerbert Xu {
3692da7f033dSHerbert Xu 	int start = 0;
3693da7f033dSHerbert Xu 	int end = ARRAY_SIZE(alg_test_descs);
3694da7f033dSHerbert Xu 
3695da7f033dSHerbert Xu 	while (start < end) {
3696da7f033dSHerbert Xu 		int i = (start + end) / 2;
3697da7f033dSHerbert Xu 		int diff = strcmp(alg_test_descs[i].alg, alg);
3698da7f033dSHerbert Xu 
3699da7f033dSHerbert Xu 		if (diff > 0) {
3700da7f033dSHerbert Xu 			end = i;
3701da7f033dSHerbert Xu 			continue;
3702da7f033dSHerbert Xu 		}
3703da7f033dSHerbert Xu 
3704da7f033dSHerbert Xu 		if (diff < 0) {
3705da7f033dSHerbert Xu 			start = i + 1;
3706da7f033dSHerbert Xu 			continue;
3707da7f033dSHerbert Xu 		}
3708da7f033dSHerbert Xu 
37091aa4ecd9SHerbert Xu 		return i;
3710da7f033dSHerbert Xu 	}
3711da7f033dSHerbert Xu 
37121aa4ecd9SHerbert Xu 	return -1;
37131aa4ecd9SHerbert Xu }
37141aa4ecd9SHerbert Xu 
37151aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
37161aa4ecd9SHerbert Xu {
37171aa4ecd9SHerbert Xu 	int i;
3718a68f6610SHerbert Xu 	int j;
3719d12d6b6dSNeil Horman 	int rc;
37201aa4ecd9SHerbert Xu 
37219e5c9fe4SRichard W.M. Jones 	if (!fips_enabled && notests) {
37229e5c9fe4SRichard W.M. Jones 		printk_once(KERN_INFO "alg: self-tests disabled\n");
37239e5c9fe4SRichard W.M. Jones 		return 0;
37249e5c9fe4SRichard W.M. Jones 	}
37259e5c9fe4SRichard W.M. Jones 
37265714758bSJussi Kivilinna 	alg_test_descs_check_order();
37275714758bSJussi Kivilinna 
37281aa4ecd9SHerbert Xu 	if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
37291aa4ecd9SHerbert Xu 		char nalg[CRYPTO_MAX_ALG_NAME];
37301aa4ecd9SHerbert Xu 
37311aa4ecd9SHerbert Xu 		if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
37321aa4ecd9SHerbert Xu 		    sizeof(nalg))
37331aa4ecd9SHerbert Xu 			return -ENAMETOOLONG;
37341aa4ecd9SHerbert Xu 
37351aa4ecd9SHerbert Xu 		i = alg_find_test(nalg);
37361aa4ecd9SHerbert Xu 		if (i < 0)
37371aa4ecd9SHerbert Xu 			goto notest;
37381aa4ecd9SHerbert Xu 
3739a3bef3a3SJarod Wilson 		if (fips_enabled && !alg_test_descs[i].fips_allowed)
3740a3bef3a3SJarod Wilson 			goto non_fips_alg;
3741a3bef3a3SJarod Wilson 
3742941fb328SJarod Wilson 		rc = alg_test_cipher(alg_test_descs + i, driver, type, mask);
3743941fb328SJarod Wilson 		goto test_done;
37441aa4ecd9SHerbert Xu 	}
37451aa4ecd9SHerbert Xu 
37461aa4ecd9SHerbert Xu 	i = alg_find_test(alg);
3747a68f6610SHerbert Xu 	j = alg_find_test(driver);
3748a68f6610SHerbert Xu 	if (i < 0 && j < 0)
37491aa4ecd9SHerbert Xu 		goto notest;
37501aa4ecd9SHerbert Xu 
3751a68f6610SHerbert Xu 	if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
3752a68f6610SHerbert Xu 			     (j >= 0 && !alg_test_descs[j].fips_allowed)))
3753a3bef3a3SJarod Wilson 		goto non_fips_alg;
3754a3bef3a3SJarod Wilson 
3755a68f6610SHerbert Xu 	rc = 0;
3756a68f6610SHerbert Xu 	if (i >= 0)
3757a68f6610SHerbert Xu 		rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
37581aa4ecd9SHerbert Xu 					     type, mask);
3759032c8cacSCristian Stoica 	if (j >= 0 && j != i)
3760a68f6610SHerbert Xu 		rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
3761a68f6610SHerbert Xu 					     type, mask);
3762a68f6610SHerbert Xu 
3763941fb328SJarod Wilson test_done:
3764d12d6b6dSNeil Horman 	if (fips_enabled && rc)
3765d12d6b6dSNeil Horman 		panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
3766d12d6b6dSNeil Horman 
376729ecd4abSJarod Wilson 	if (fips_enabled && !rc)
37683e8cffd4SMasanari Iida 		pr_info("alg: self-tests for %s (%s) passed\n", driver, alg);
376929ecd4abSJarod Wilson 
3770d12d6b6dSNeil Horman 	return rc;
37711aa4ecd9SHerbert Xu 
37721aa4ecd9SHerbert Xu notest:
3773da7f033dSHerbert Xu 	printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
3774da7f033dSHerbert Xu 	return 0;
3775a3bef3a3SJarod Wilson non_fips_alg:
3776a3bef3a3SJarod Wilson 	return -EINVAL;
3777da7f033dSHerbert Xu }
37780b767f96SAlexander Shishkin 
3779326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
37800b767f96SAlexander Shishkin 
3781da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test);
3782