xref: /openbmc/linux/crypto/testmgr.c (revision 7f397136)
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 
180018ba95cSWang, Rui Y static int ahash_partial_update(struct ahash_request **preq,
181b13b1e0cSEric Biggers 	struct crypto_ahash *tfm, const struct hash_testvec *template,
182018ba95cSWang, Rui Y 	void *hash_buff, int k, int temp, struct scatterlist *sg,
1837f397136SGilad Ben-Yossef 	const char *algo, char *result, struct crypto_wait *wait)
184018ba95cSWang, Rui Y {
185018ba95cSWang, Rui Y 	char *state;
186018ba95cSWang, Rui Y 	struct ahash_request *req;
187018ba95cSWang, Rui Y 	int statesize, ret = -EINVAL;
1887bcb87bcSJan Stancek 	const char guard[] = { 0x00, 0xba, 0xad, 0x00 };
189018ba95cSWang, Rui Y 
190018ba95cSWang, Rui Y 	req = *preq;
191018ba95cSWang, Rui Y 	statesize = crypto_ahash_statesize(
192018ba95cSWang, Rui Y 			crypto_ahash_reqtfm(req));
1937bcb87bcSJan Stancek 	state = kmalloc(statesize + sizeof(guard), GFP_KERNEL);
194018ba95cSWang, Rui Y 	if (!state) {
195cf3f9609SGilad Ben-Yossef 		pr_err("alg: hash: Failed to alloc state for %s\n", algo);
196018ba95cSWang, Rui Y 		goto out_nostate;
197018ba95cSWang, Rui Y 	}
1987bcb87bcSJan Stancek 	memcpy(state + statesize, guard, sizeof(guard));
199018ba95cSWang, Rui Y 	ret = crypto_ahash_export(req, state);
2007bcb87bcSJan Stancek 	WARN_ON(memcmp(state + statesize, guard, sizeof(guard)));
201018ba95cSWang, Rui Y 	if (ret) {
202cf3f9609SGilad Ben-Yossef 		pr_err("alg: hash: Failed to export() for %s\n", algo);
203018ba95cSWang, Rui Y 		goto out;
204018ba95cSWang, Rui Y 	}
205018ba95cSWang, Rui Y 	ahash_request_free(req);
206018ba95cSWang, Rui Y 	req = ahash_request_alloc(tfm, GFP_KERNEL);
207018ba95cSWang, Rui Y 	if (!req) {
208018ba95cSWang, Rui Y 		pr_err("alg: hash: Failed to alloc request for %s\n", algo);
209018ba95cSWang, Rui Y 		goto out_noreq;
210018ba95cSWang, Rui Y 	}
211018ba95cSWang, Rui Y 	ahash_request_set_callback(req,
212018ba95cSWang, Rui Y 		CRYPTO_TFM_REQ_MAY_BACKLOG,
2137f397136SGilad Ben-Yossef 		crypto_req_done, wait);
214018ba95cSWang, Rui Y 
215018ba95cSWang, Rui Y 	memcpy(hash_buff, template->plaintext + temp,
216018ba95cSWang, Rui Y 		template->tap[k]);
217018ba95cSWang, Rui Y 	sg_init_one(&sg[0], hash_buff, template->tap[k]);
218018ba95cSWang, Rui Y 	ahash_request_set_crypt(req, sg, result, template->tap[k]);
219018ba95cSWang, Rui Y 	ret = crypto_ahash_import(req, state);
220018ba95cSWang, Rui Y 	if (ret) {
221018ba95cSWang, Rui Y 		pr_err("alg: hash: Failed to import() for %s\n", algo);
222018ba95cSWang, Rui Y 		goto out;
223018ba95cSWang, Rui Y 	}
2247f397136SGilad Ben-Yossef 	ret = crypto_wait_req(crypto_ahash_update(req), wait);
225018ba95cSWang, Rui Y 	if (ret)
226018ba95cSWang, Rui Y 		goto out;
227018ba95cSWang, Rui Y 	*preq = req;
228018ba95cSWang, Rui Y 	ret = 0;
229018ba95cSWang, Rui Y 	goto out_noreq;
230018ba95cSWang, Rui Y out:
231018ba95cSWang, Rui Y 	ahash_request_free(req);
232018ba95cSWang, Rui Y out_noreq:
233018ba95cSWang, Rui Y 	kfree(state);
234018ba95cSWang, Rui Y out_nostate:
235018ba95cSWang, Rui Y 	return ret;
236018ba95cSWang, Rui Y }
237018ba95cSWang, Rui Y 
238b13b1e0cSEric Biggers static int __test_hash(struct crypto_ahash *tfm,
239b13b1e0cSEric Biggers 		       const struct hash_testvec *template, unsigned int tcount,
240b13b1e0cSEric Biggers 		       bool use_digest, const int align_offset)
241da7f033dSHerbert Xu {
242da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
243e93acd6fSAndrew Lutomirski 	size_t digest_size = crypto_ahash_digestsize(tfm);
244da7f033dSHerbert Xu 	unsigned int i, j, k, temp;
245da7f033dSHerbert Xu 	struct scatterlist sg[8];
24629b77e5dSHoria Geanta 	char *result;
24729b77e5dSHoria Geanta 	char *key;
248da7f033dSHerbert Xu 	struct ahash_request *req;
2497f397136SGilad Ben-Yossef 	struct crypto_wait wait;
250da7f033dSHerbert Xu 	void *hash_buff;
251f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
252f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
253f8b0d4d0SHerbert Xu 
254e93acd6fSAndrew Lutomirski 	result = kmalloc(digest_size, GFP_KERNEL);
25529b77e5dSHoria Geanta 	if (!result)
25629b77e5dSHoria Geanta 		return ret;
25729b77e5dSHoria Geanta 	key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
25829b77e5dSHoria Geanta 	if (!key)
25929b77e5dSHoria Geanta 		goto out_nobuf;
260f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
261f8b0d4d0SHerbert Xu 		goto out_nobuf;
262da7f033dSHerbert Xu 
2637f397136SGilad Ben-Yossef 	crypto_init_wait(&wait);
264da7f033dSHerbert Xu 
265da7f033dSHerbert Xu 	req = ahash_request_alloc(tfm, GFP_KERNEL);
266da7f033dSHerbert Xu 	if (!req) {
267da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to allocate request for "
268da7f033dSHerbert Xu 		       "%s\n", algo);
269da7f033dSHerbert Xu 		goto out_noreq;
270da7f033dSHerbert Xu 	}
271da7f033dSHerbert Xu 	ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
2727f397136SGilad Ben-Yossef 				   crypto_req_done, &wait);
273da7f033dSHerbert Xu 
274a0cfae59SHerbert Xu 	j = 0;
275da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
276a0cfae59SHerbert Xu 		if (template[i].np)
277a0cfae59SHerbert Xu 			continue;
278a0cfae59SHerbert Xu 
279da5ffe11SJussi Kivilinna 		ret = -EINVAL;
280da5ffe11SJussi Kivilinna 		if (WARN_ON(align_offset + template[i].psize > PAGE_SIZE))
281da5ffe11SJussi Kivilinna 			goto out;
282da5ffe11SJussi Kivilinna 
283a0cfae59SHerbert Xu 		j++;
284e93acd6fSAndrew Lutomirski 		memset(result, 0, digest_size);
285da7f033dSHerbert Xu 
286da7f033dSHerbert Xu 		hash_buff = xbuf[0];
287da5ffe11SJussi Kivilinna 		hash_buff += align_offset;
288da7f033dSHerbert Xu 
289da7f033dSHerbert Xu 		memcpy(hash_buff, template[i].plaintext, template[i].psize);
290da7f033dSHerbert Xu 		sg_init_one(&sg[0], hash_buff, template[i].psize);
291da7f033dSHerbert Xu 
292da7f033dSHerbert Xu 		if (template[i].ksize) {
293da7f033dSHerbert Xu 			crypto_ahash_clear_flags(tfm, ~0);
29429b77e5dSHoria Geanta 			if (template[i].ksize > MAX_KEYLEN) {
29529b77e5dSHoria Geanta 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
29629b77e5dSHoria Geanta 				       j, algo, template[i].ksize, MAX_KEYLEN);
29729b77e5dSHoria Geanta 				ret = -EINVAL;
29829b77e5dSHoria Geanta 				goto out;
29929b77e5dSHoria Geanta 			}
30029b77e5dSHoria Geanta 			memcpy(key, template[i].key, template[i].ksize);
30129b77e5dSHoria Geanta 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
302da7f033dSHerbert Xu 			if (ret) {
303da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: setkey failed on "
304a0cfae59SHerbert Xu 				       "test %d for %s: ret=%d\n", j, algo,
305da7f033dSHerbert Xu 				       -ret);
306da7f033dSHerbert Xu 				goto out;
307da7f033dSHerbert Xu 			}
308da7f033dSHerbert Xu 		}
309da7f033dSHerbert Xu 
310da7f033dSHerbert Xu 		ahash_request_set_crypt(req, sg, result, template[i].psize);
311a8f1a052SDavid S. Miller 		if (use_digest) {
3127f397136SGilad Ben-Yossef 			ret = crypto_wait_req(crypto_ahash_digest(req), &wait);
313a8f1a052SDavid S. Miller 			if (ret) {
314a8f1a052SDavid S. Miller 				pr_err("alg: hash: digest failed on test %d "
315a0cfae59SHerbert Xu 				       "for %s: ret=%d\n", j, algo, -ret);
316da7f033dSHerbert Xu 				goto out;
317da7f033dSHerbert Xu 			}
318a8f1a052SDavid S. Miller 		} else {
3197f397136SGilad Ben-Yossef 			ret = crypto_wait_req(crypto_ahash_init(req), &wait);
320a8f1a052SDavid S. Miller 			if (ret) {
321cf3f9609SGilad Ben-Yossef 				pr_err("alg: hash: init failed on test %d "
322a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
323a8f1a052SDavid S. Miller 				goto out;
324a8f1a052SDavid S. Miller 			}
3257f397136SGilad Ben-Yossef 			ret = crypto_wait_req(crypto_ahash_update(req), &wait);
326a8f1a052SDavid S. Miller 			if (ret) {
327cf3f9609SGilad Ben-Yossef 				pr_err("alg: hash: update failed on test %d "
328a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
329a8f1a052SDavid S. Miller 				goto out;
330a8f1a052SDavid S. Miller 			}
3317f397136SGilad Ben-Yossef 			ret = crypto_wait_req(crypto_ahash_final(req), &wait);
332a8f1a052SDavid S. Miller 			if (ret) {
333cf3f9609SGilad Ben-Yossef 				pr_err("alg: hash: final failed on test %d "
334a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
335a8f1a052SDavid S. Miller 				goto out;
336a8f1a052SDavid S. Miller 			}
337a8f1a052SDavid S. Miller 		}
338da7f033dSHerbert Xu 
339da7f033dSHerbert Xu 		if (memcmp(result, template[i].digest,
340da7f033dSHerbert Xu 			   crypto_ahash_digestsize(tfm))) {
341da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
342a0cfae59SHerbert Xu 			       j, algo);
343da7f033dSHerbert Xu 			hexdump(result, crypto_ahash_digestsize(tfm));
344da7f033dSHerbert Xu 			ret = -EINVAL;
345da7f033dSHerbert Xu 			goto out;
346da7f033dSHerbert Xu 		}
347da7f033dSHerbert Xu 	}
348da7f033dSHerbert Xu 
349da7f033dSHerbert Xu 	j = 0;
350da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
351da5ffe11SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
352da5ffe11SJussi Kivilinna 		if (align_offset != 0)
353da5ffe11SJussi Kivilinna 			break;
354da5ffe11SJussi Kivilinna 
3555f2b424eSCristian Stoica 		if (!template[i].np)
3565f2b424eSCristian Stoica 			continue;
3575f2b424eSCristian Stoica 
358da7f033dSHerbert Xu 		j++;
359e93acd6fSAndrew Lutomirski 		memset(result, 0, digest_size);
360da7f033dSHerbert Xu 
361da7f033dSHerbert Xu 		temp = 0;
362da7f033dSHerbert Xu 		sg_init_table(sg, template[i].np);
363fd57f22aSHerbert Xu 		ret = -EINVAL;
364da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
365fd57f22aSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
366fd57f22aSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
367fd57f22aSHerbert Xu 				goto out;
368da7f033dSHerbert Xu 			sg_set_buf(&sg[k],
369da7f033dSHerbert Xu 				   memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
370da7f033dSHerbert Xu 					  offset_in_page(IDX[k]),
371da7f033dSHerbert Xu 					  template[i].plaintext + temp,
372da7f033dSHerbert Xu 					  template[i].tap[k]),
373da7f033dSHerbert Xu 				   template[i].tap[k]);
374da7f033dSHerbert Xu 			temp += template[i].tap[k];
375da7f033dSHerbert Xu 		}
376da7f033dSHerbert Xu 
377da7f033dSHerbert Xu 		if (template[i].ksize) {
37829b77e5dSHoria Geanta 			if (template[i].ksize > MAX_KEYLEN) {
37929b77e5dSHoria Geanta 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
3805f2b424eSCristian Stoica 				       j, algo, template[i].ksize, MAX_KEYLEN);
38129b77e5dSHoria Geanta 				ret = -EINVAL;
38229b77e5dSHoria Geanta 				goto out;
38329b77e5dSHoria Geanta 			}
384da7f033dSHerbert Xu 			crypto_ahash_clear_flags(tfm, ~0);
38529b77e5dSHoria Geanta 			memcpy(key, template[i].key, template[i].ksize);
3865f2b424eSCristian Stoica 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
387da7f033dSHerbert Xu 
388da7f033dSHerbert Xu 			if (ret) {
389da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: setkey "
390da7f033dSHerbert Xu 				       "failed on chunking test %d "
3915f2b424eSCristian Stoica 				       "for %s: ret=%d\n", j, algo, -ret);
392da7f033dSHerbert Xu 				goto out;
393da7f033dSHerbert Xu 			}
394da7f033dSHerbert Xu 		}
395da7f033dSHerbert Xu 
3965f2b424eSCristian Stoica 		ahash_request_set_crypt(req, sg, result, template[i].psize);
3977f397136SGilad Ben-Yossef 		ret = crypto_wait_req(crypto_ahash_digest(req), &wait);
3987f397136SGilad Ben-Yossef 		if (ret) {
3997f397136SGilad Ben-Yossef 			pr_err("alg: hash: digest failed on chunking test %d for %s: ret=%d\n",
4007f397136SGilad Ben-Yossef 			       j, algo, -ret);
401da7f033dSHerbert Xu 			goto out;
402da7f033dSHerbert Xu 		}
403da7f033dSHerbert Xu 
404da7f033dSHerbert Xu 		if (memcmp(result, template[i].digest,
405da7f033dSHerbert Xu 			   crypto_ahash_digestsize(tfm))) {
406da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: Chunking test %d "
407da7f033dSHerbert Xu 			       "failed for %s\n", j, algo);
408da7f033dSHerbert Xu 			hexdump(result, crypto_ahash_digestsize(tfm));
409da7f033dSHerbert Xu 			ret = -EINVAL;
410da7f033dSHerbert Xu 			goto out;
411da7f033dSHerbert Xu 		}
412da7f033dSHerbert Xu 	}
413da7f033dSHerbert Xu 
414018ba95cSWang, Rui Y 	/* partial update exercise */
415018ba95cSWang, Rui Y 	j = 0;
416018ba95cSWang, Rui Y 	for (i = 0; i < tcount; i++) {
417018ba95cSWang, Rui Y 		/* alignment tests are only done with continuous buffers */
418018ba95cSWang, Rui Y 		if (align_offset != 0)
419018ba95cSWang, Rui Y 			break;
420018ba95cSWang, Rui Y 
421018ba95cSWang, Rui Y 		if (template[i].np < 2)
422018ba95cSWang, Rui Y 			continue;
423018ba95cSWang, Rui Y 
424018ba95cSWang, Rui Y 		j++;
425e93acd6fSAndrew Lutomirski 		memset(result, 0, digest_size);
426018ba95cSWang, Rui Y 
427018ba95cSWang, Rui Y 		ret = -EINVAL;
428018ba95cSWang, Rui Y 		hash_buff = xbuf[0];
429018ba95cSWang, Rui Y 		memcpy(hash_buff, template[i].plaintext,
430018ba95cSWang, Rui Y 			template[i].tap[0]);
431018ba95cSWang, Rui Y 		sg_init_one(&sg[0], hash_buff, template[i].tap[0]);
432018ba95cSWang, Rui Y 
433018ba95cSWang, Rui Y 		if (template[i].ksize) {
434018ba95cSWang, Rui Y 			crypto_ahash_clear_flags(tfm, ~0);
435018ba95cSWang, Rui Y 			if (template[i].ksize > MAX_KEYLEN) {
436018ba95cSWang, Rui Y 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
437018ba95cSWang, Rui Y 					j, algo, template[i].ksize, MAX_KEYLEN);
438018ba95cSWang, Rui Y 				ret = -EINVAL;
439018ba95cSWang, Rui Y 				goto out;
440018ba95cSWang, Rui Y 			}
441018ba95cSWang, Rui Y 			memcpy(key, template[i].key, template[i].ksize);
442018ba95cSWang, Rui Y 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
443018ba95cSWang, Rui Y 			if (ret) {
444018ba95cSWang, Rui Y 				pr_err("alg: hash: setkey failed on test %d for %s: ret=%d\n",
445018ba95cSWang, Rui Y 					j, algo, -ret);
446018ba95cSWang, Rui Y 				goto out;
447018ba95cSWang, Rui Y 			}
448018ba95cSWang, Rui Y 		}
449018ba95cSWang, Rui Y 
450018ba95cSWang, Rui Y 		ahash_request_set_crypt(req, sg, result, template[i].tap[0]);
4517f397136SGilad Ben-Yossef 		ret = crypto_wait_req(crypto_ahash_init(req), &wait);
452018ba95cSWang, Rui Y 		if (ret) {
453cf3f9609SGilad Ben-Yossef 			pr_err("alg: hash: init failed on test %d for %s: ret=%d\n",
454018ba95cSWang, Rui Y 				j, algo, -ret);
455018ba95cSWang, Rui Y 			goto out;
456018ba95cSWang, Rui Y 		}
4577f397136SGilad Ben-Yossef 		ret = crypto_wait_req(crypto_ahash_update(req), &wait);
458018ba95cSWang, Rui Y 		if (ret) {
459cf3f9609SGilad Ben-Yossef 			pr_err("alg: hash: update failed on test %d for %s: ret=%d\n",
460018ba95cSWang, Rui Y 				j, algo, -ret);
461018ba95cSWang, Rui Y 			goto out;
462018ba95cSWang, Rui Y 		}
463018ba95cSWang, Rui Y 
464018ba95cSWang, Rui Y 		temp = template[i].tap[0];
465018ba95cSWang, Rui Y 		for (k = 1; k < template[i].np; k++) {
466018ba95cSWang, Rui Y 			ret = ahash_partial_update(&req, tfm, &template[i],
467018ba95cSWang, Rui Y 				hash_buff, k, temp, &sg[0], algo, result,
4687f397136SGilad Ben-Yossef 				&wait);
469018ba95cSWang, Rui Y 			if (ret) {
470cf3f9609SGilad Ben-Yossef 				pr_err("alg: hash: partial update failed on test %d for %s: ret=%d\n",
471018ba95cSWang, Rui Y 					j, algo, -ret);
472018ba95cSWang, Rui Y 				goto out_noreq;
473018ba95cSWang, Rui Y 			}
474018ba95cSWang, Rui Y 			temp += template[i].tap[k];
475018ba95cSWang, Rui Y 		}
4767f397136SGilad Ben-Yossef 		ret = crypto_wait_req(crypto_ahash_final(req), &wait);
477018ba95cSWang, Rui Y 		if (ret) {
478cf3f9609SGilad Ben-Yossef 			pr_err("alg: hash: final failed on test %d for %s: ret=%d\n",
479018ba95cSWang, Rui Y 				j, algo, -ret);
480018ba95cSWang, Rui Y 			goto out;
481018ba95cSWang, Rui Y 		}
482018ba95cSWang, Rui Y 		if (memcmp(result, template[i].digest,
483018ba95cSWang, Rui Y 			   crypto_ahash_digestsize(tfm))) {
484018ba95cSWang, Rui Y 			pr_err("alg: hash: Partial Test %d failed for %s\n",
485018ba95cSWang, Rui Y 			       j, algo);
486018ba95cSWang, Rui Y 			hexdump(result, crypto_ahash_digestsize(tfm));
487018ba95cSWang, Rui Y 			ret = -EINVAL;
488018ba95cSWang, Rui Y 			goto out;
489018ba95cSWang, Rui Y 		}
490018ba95cSWang, Rui Y 	}
491018ba95cSWang, Rui Y 
492da7f033dSHerbert Xu 	ret = 0;
493da7f033dSHerbert Xu 
494da7f033dSHerbert Xu out:
495da7f033dSHerbert Xu 	ahash_request_free(req);
496da7f033dSHerbert Xu out_noreq:
497f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
498f8b0d4d0SHerbert Xu out_nobuf:
49929b77e5dSHoria Geanta 	kfree(key);
50029b77e5dSHoria Geanta 	kfree(result);
501da7f033dSHerbert Xu 	return ret;
502da7f033dSHerbert Xu }
503da7f033dSHerbert Xu 
504b13b1e0cSEric Biggers static int test_hash(struct crypto_ahash *tfm,
505b13b1e0cSEric Biggers 		     const struct hash_testvec *template,
506da5ffe11SJussi Kivilinna 		     unsigned int tcount, bool use_digest)
507da5ffe11SJussi Kivilinna {
508da5ffe11SJussi Kivilinna 	unsigned int alignmask;
509da5ffe11SJussi Kivilinna 	int ret;
510da5ffe11SJussi Kivilinna 
511da5ffe11SJussi Kivilinna 	ret = __test_hash(tfm, template, tcount, use_digest, 0);
512da5ffe11SJussi Kivilinna 	if (ret)
513da5ffe11SJussi Kivilinna 		return ret;
514da5ffe11SJussi Kivilinna 
515da5ffe11SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
516da5ffe11SJussi Kivilinna 	ret = __test_hash(tfm, template, tcount, use_digest, 1);
517da5ffe11SJussi Kivilinna 	if (ret)
518da5ffe11SJussi Kivilinna 		return ret;
519da5ffe11SJussi Kivilinna 
520da5ffe11SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
521da5ffe11SJussi Kivilinna 	if (alignmask) {
522da5ffe11SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
523da5ffe11SJussi Kivilinna 		ret = __test_hash(tfm, template, tcount, use_digest,
524da5ffe11SJussi Kivilinna 				  alignmask + 1);
525da5ffe11SJussi Kivilinna 		if (ret)
526da5ffe11SJussi Kivilinna 			return ret;
527da5ffe11SJussi Kivilinna 	}
528da5ffe11SJussi Kivilinna 
529da5ffe11SJussi Kivilinna 	return 0;
530da5ffe11SJussi Kivilinna }
531da5ffe11SJussi Kivilinna 
532d8a32ac2SJussi Kivilinna static int __test_aead(struct crypto_aead *tfm, int enc,
533b13b1e0cSEric Biggers 		       const struct aead_testvec *template, unsigned int tcount,
53458dcf548SJussi Kivilinna 		       const bool diff_dst, const int align_offset)
535da7f033dSHerbert Xu {
536da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
537da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
538f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
539da7f033dSHerbert Xu 	char *q;
540da7f033dSHerbert Xu 	char *key;
541da7f033dSHerbert Xu 	struct aead_request *req;
542d8a32ac2SJussi Kivilinna 	struct scatterlist *sg;
543d8a32ac2SJussi Kivilinna 	struct scatterlist *sgout;
544d8a32ac2SJussi Kivilinna 	const char *e, *d;
5457f397136SGilad Ben-Yossef 	struct crypto_wait wait;
546424a5da6SCristian Stoica 	unsigned int authsize, iv_len;
547da7f033dSHerbert Xu 	void *input;
548d8a32ac2SJussi Kivilinna 	void *output;
549da7f033dSHerbert Xu 	void *assoc;
5509bac019dSTadeusz Struk 	char *iv;
551f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
552d8a32ac2SJussi Kivilinna 	char *xoutbuf[XBUFSIZE];
553f8b0d4d0SHerbert Xu 	char *axbuf[XBUFSIZE];
554f8b0d4d0SHerbert Xu 
5559bac019dSTadeusz Struk 	iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
5569bac019dSTadeusz Struk 	if (!iv)
5579bac019dSTadeusz Struk 		return ret;
55829b77e5dSHoria Geanta 	key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
55929b77e5dSHoria Geanta 	if (!key)
56029b77e5dSHoria Geanta 		goto out_noxbuf;
561f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
562f8b0d4d0SHerbert Xu 		goto out_noxbuf;
563f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(axbuf))
564f8b0d4d0SHerbert Xu 		goto out_noaxbuf;
565d8a32ac2SJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
566d8a32ac2SJussi Kivilinna 		goto out_nooutbuf;
567d8a32ac2SJussi Kivilinna 
568d8a32ac2SJussi Kivilinna 	/* avoid "the frame size is larger than 1024 bytes" compiler warning */
5698a525fcdSHerbert Xu 	sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 4 : 2), GFP_KERNEL);
570d8a32ac2SJussi Kivilinna 	if (!sg)
571d8a32ac2SJussi Kivilinna 		goto out_nosg;
5728a525fcdSHerbert Xu 	sgout = &sg[16];
573d8a32ac2SJussi Kivilinna 
574d8a32ac2SJussi Kivilinna 	if (diff_dst)
575d8a32ac2SJussi Kivilinna 		d = "-ddst";
576d8a32ac2SJussi Kivilinna 	else
577d8a32ac2SJussi Kivilinna 		d = "";
578d8a32ac2SJussi Kivilinna 
579da7f033dSHerbert Xu 	if (enc == ENCRYPT)
580da7f033dSHerbert Xu 		e = "encryption";
581da7f033dSHerbert Xu 	else
582da7f033dSHerbert Xu 		e = "decryption";
583da7f033dSHerbert Xu 
5847f397136SGilad Ben-Yossef 	crypto_init_wait(&wait);
585da7f033dSHerbert Xu 
586da7f033dSHerbert Xu 	req = aead_request_alloc(tfm, GFP_KERNEL);
587da7f033dSHerbert Xu 	if (!req) {
588d8a32ac2SJussi Kivilinna 		pr_err("alg: aead%s: Failed to allocate request for %s\n",
589d8a32ac2SJussi Kivilinna 		       d, algo);
590da7f033dSHerbert Xu 		goto out;
591da7f033dSHerbert Xu 	}
592da7f033dSHerbert Xu 
593da7f033dSHerbert Xu 	aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
5947f397136SGilad Ben-Yossef 				  crypto_req_done, &wait);
595da7f033dSHerbert Xu 
596abfa7f43SJerome Marchand 	iv_len = crypto_aead_ivsize(tfm);
597abfa7f43SJerome Marchand 
598da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
59905b1d338SCristian Stoica 		if (template[i].np)
60005b1d338SCristian Stoica 			continue;
60105b1d338SCristian Stoica 
602da7f033dSHerbert Xu 		j++;
603da7f033dSHerbert Xu 
60458dcf548SJussi Kivilinna 		/* some templates have no input data but they will
605da7f033dSHerbert Xu 		 * touch input
606da7f033dSHerbert Xu 		 */
607da7f033dSHerbert Xu 		input = xbuf[0];
60858dcf548SJussi Kivilinna 		input += align_offset;
609da7f033dSHerbert Xu 		assoc = axbuf[0];
610da7f033dSHerbert Xu 
611fd57f22aSHerbert Xu 		ret = -EINVAL;
61258dcf548SJussi Kivilinna 		if (WARN_ON(align_offset + template[i].ilen >
61358dcf548SJussi Kivilinna 			    PAGE_SIZE || template[i].alen > PAGE_SIZE))
614fd57f22aSHerbert Xu 			goto out;
615fd57f22aSHerbert Xu 
616da7f033dSHerbert Xu 		memcpy(input, template[i].input, template[i].ilen);
617da7f033dSHerbert Xu 		memcpy(assoc, template[i].assoc, template[i].alen);
618da7f033dSHerbert Xu 		if (template[i].iv)
619424a5da6SCristian Stoica 			memcpy(iv, template[i].iv, iv_len);
620da7f033dSHerbert Xu 		else
621424a5da6SCristian Stoica 			memset(iv, 0, iv_len);
622da7f033dSHerbert Xu 
623da7f033dSHerbert Xu 		crypto_aead_clear_flags(tfm, ~0);
624da7f033dSHerbert Xu 		if (template[i].wk)
62505b1d338SCristian Stoica 			crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
626da7f033dSHerbert Xu 
62729b77e5dSHoria Geanta 		if (template[i].klen > MAX_KEYLEN) {
62829b77e5dSHoria Geanta 			pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
62929b77e5dSHoria Geanta 			       d, j, algo, template[i].klen,
63029b77e5dSHoria Geanta 			       MAX_KEYLEN);
63129b77e5dSHoria Geanta 			ret = -EINVAL;
63229b77e5dSHoria Geanta 			goto out;
63329b77e5dSHoria Geanta 		}
63429b77e5dSHoria Geanta 		memcpy(key, template[i].key, template[i].klen);
635da7f033dSHerbert Xu 
63605b1d338SCristian Stoica 		ret = crypto_aead_setkey(tfm, key, template[i].klen);
6370fae0c1eSYanjiang Jin 		if (template[i].fail == !ret) {
638d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n",
639d8a32ac2SJussi Kivilinna 			       d, j, algo, crypto_aead_get_flags(tfm));
640da7f033dSHerbert Xu 			goto out;
641da7f033dSHerbert Xu 		} else if (ret)
642da7f033dSHerbert Xu 			continue;
643da7f033dSHerbert Xu 
644da7f033dSHerbert Xu 		authsize = abs(template[i].rlen - template[i].ilen);
645da7f033dSHerbert Xu 		ret = crypto_aead_setauthsize(tfm, authsize);
646da7f033dSHerbert Xu 		if (ret) {
647d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n",
648d8a32ac2SJussi Kivilinna 			       d, authsize, j, algo);
649da7f033dSHerbert Xu 			goto out;
650da7f033dSHerbert Xu 		}
651da7f033dSHerbert Xu 
6528a525fcdSHerbert Xu 		k = !!template[i].alen;
6538a525fcdSHerbert Xu 		sg_init_table(sg, k + 1);
6548a525fcdSHerbert Xu 		sg_set_buf(&sg[0], assoc, template[i].alen);
6558a525fcdSHerbert Xu 		sg_set_buf(&sg[k], input,
65605b1d338SCristian Stoica 			   template[i].ilen + (enc ? authsize : 0));
657d8a32ac2SJussi Kivilinna 		output = input;
658d8a32ac2SJussi Kivilinna 
6598a525fcdSHerbert Xu 		if (diff_dst) {
6608a525fcdSHerbert Xu 			sg_init_table(sgout, k + 1);
6618a525fcdSHerbert Xu 			sg_set_buf(&sgout[0], assoc, template[i].alen);
6628a525fcdSHerbert Xu 
6638a525fcdSHerbert Xu 			output = xoutbuf[0];
6648a525fcdSHerbert Xu 			output += align_offset;
6658a525fcdSHerbert Xu 			sg_set_buf(&sgout[k], output,
6668a525fcdSHerbert Xu 				   template[i].rlen + (enc ? 0 : authsize));
6678a525fcdSHerbert Xu 		}
668da7f033dSHerbert Xu 
669d8a32ac2SJussi Kivilinna 		aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
670da7f033dSHerbert Xu 				       template[i].ilen, iv);
671da7f033dSHerbert Xu 
6728a525fcdSHerbert Xu 		aead_request_set_ad(req, template[i].alen);
673da7f033dSHerbert Xu 
6747f397136SGilad Ben-Yossef 		ret = crypto_wait_req(enc ? crypto_aead_encrypt(req)
6757f397136SGilad Ben-Yossef 				      : crypto_aead_decrypt(req), &wait);
676da7f033dSHerbert Xu 
677da7f033dSHerbert Xu 		switch (ret) {
678da7f033dSHerbert Xu 		case 0:
679e44a1b44SJarod Wilson 			if (template[i].novrfy) {
680e44a1b44SJarod Wilson 				/* verification was supposed to fail */
681d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n",
682d8a32ac2SJussi Kivilinna 				       d, e, j, algo);
683e44a1b44SJarod Wilson 				/* so really, we got a bad message */
684e44a1b44SJarod Wilson 				ret = -EBADMSG;
685e44a1b44SJarod Wilson 				goto out;
686e44a1b44SJarod Wilson 			}
687da7f033dSHerbert Xu 			break;
688e44a1b44SJarod Wilson 		case -EBADMSG:
689e44a1b44SJarod Wilson 			if (template[i].novrfy)
690e44a1b44SJarod Wilson 				/* verification failure was expected */
691e44a1b44SJarod Wilson 				continue;
692da7f033dSHerbert Xu 			/* fall through */
693da7f033dSHerbert Xu 		default:
694d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n",
695d8a32ac2SJussi Kivilinna 			       d, e, j, algo, -ret);
696da7f033dSHerbert Xu 			goto out;
697da7f033dSHerbert Xu 		}
698da7f033dSHerbert Xu 
699d8a32ac2SJussi Kivilinna 		q = output;
700da7f033dSHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
701d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Test %d failed on %s for %s\n",
702d8a32ac2SJussi Kivilinna 			       d, j, e, algo);
703da7f033dSHerbert Xu 			hexdump(q, template[i].rlen);
704da7f033dSHerbert Xu 			ret = -EINVAL;
705da7f033dSHerbert Xu 			goto out;
706da7f033dSHerbert Xu 		}
707da7f033dSHerbert Xu 	}
708da7f033dSHerbert Xu 
709da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
71058dcf548SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
71158dcf548SJussi Kivilinna 		if (align_offset != 0)
71258dcf548SJussi Kivilinna 			break;
71358dcf548SJussi Kivilinna 
71405b1d338SCristian Stoica 		if (!template[i].np)
71505b1d338SCristian Stoica 			continue;
71605b1d338SCristian Stoica 
717da7f033dSHerbert Xu 		j++;
718da7f033dSHerbert Xu 
719da7f033dSHerbert Xu 		if (template[i].iv)
720abfa7f43SJerome Marchand 			memcpy(iv, template[i].iv, iv_len);
721da7f033dSHerbert Xu 		else
722da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
723da7f033dSHerbert Xu 
724da7f033dSHerbert Xu 		crypto_aead_clear_flags(tfm, ~0);
725da7f033dSHerbert Xu 		if (template[i].wk)
72605b1d338SCristian Stoica 			crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
72729b77e5dSHoria Geanta 		if (template[i].klen > MAX_KEYLEN) {
72829b77e5dSHoria Geanta 			pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
72905b1d338SCristian Stoica 			       d, j, algo, template[i].klen, MAX_KEYLEN);
73029b77e5dSHoria Geanta 			ret = -EINVAL;
73129b77e5dSHoria Geanta 			goto out;
73229b77e5dSHoria Geanta 		}
73329b77e5dSHoria Geanta 		memcpy(key, template[i].key, template[i].klen);
734da7f033dSHerbert Xu 
735da7f033dSHerbert Xu 		ret = crypto_aead_setkey(tfm, key, template[i].klen);
7360fae0c1eSYanjiang Jin 		if (template[i].fail == !ret) {
737d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n",
738d8a32ac2SJussi Kivilinna 			       d, j, algo, crypto_aead_get_flags(tfm));
739da7f033dSHerbert Xu 			goto out;
740da7f033dSHerbert Xu 		} else if (ret)
741da7f033dSHerbert Xu 			continue;
742da7f033dSHerbert Xu 
743da7f033dSHerbert Xu 		authsize = abs(template[i].rlen - template[i].ilen);
744da7f033dSHerbert Xu 
745da7f033dSHerbert Xu 		ret = -EINVAL;
7468a525fcdSHerbert Xu 		sg_init_table(sg, template[i].anp + template[i].np);
747d8a32ac2SJussi Kivilinna 		if (diff_dst)
7488a525fcdSHerbert Xu 			sg_init_table(sgout, template[i].anp + template[i].np);
7498a525fcdSHerbert Xu 
7508a525fcdSHerbert Xu 		ret = -EINVAL;
7518a525fcdSHerbert Xu 		for (k = 0, temp = 0; k < template[i].anp; k++) {
7528a525fcdSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
7538a525fcdSHerbert Xu 				    template[i].atap[k] > PAGE_SIZE))
7548a525fcdSHerbert Xu 				goto out;
7558a525fcdSHerbert Xu 			sg_set_buf(&sg[k],
7568a525fcdSHerbert Xu 				   memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
7578a525fcdSHerbert Xu 					  offset_in_page(IDX[k]),
7588a525fcdSHerbert Xu 					  template[i].assoc + temp,
7598a525fcdSHerbert Xu 					  template[i].atap[k]),
7608a525fcdSHerbert Xu 				   template[i].atap[k]);
7618a525fcdSHerbert Xu 			if (diff_dst)
7628a525fcdSHerbert Xu 				sg_set_buf(&sgout[k],
7638a525fcdSHerbert Xu 					   axbuf[IDX[k] >> PAGE_SHIFT] +
7648a525fcdSHerbert Xu 					   offset_in_page(IDX[k]),
7658a525fcdSHerbert Xu 					   template[i].atap[k]);
7668a525fcdSHerbert Xu 			temp += template[i].atap[k];
7678a525fcdSHerbert Xu 		}
7688a525fcdSHerbert Xu 
769da7f033dSHerbert Xu 		for (k = 0, temp = 0; k < template[i].np; k++) {
770da7f033dSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
771da7f033dSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
772da7f033dSHerbert Xu 				goto out;
773da7f033dSHerbert Xu 
77405b1d338SCristian Stoica 			q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
77505b1d338SCristian Stoica 			memcpy(q, template[i].input + temp, template[i].tap[k]);
7768a525fcdSHerbert Xu 			sg_set_buf(&sg[template[i].anp + k],
7778a525fcdSHerbert Xu 				   q, template[i].tap[k]);
778d8a32ac2SJussi Kivilinna 
779d8a32ac2SJussi Kivilinna 			if (diff_dst) {
780d8a32ac2SJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
781d8a32ac2SJussi Kivilinna 				    offset_in_page(IDX[k]);
782d8a32ac2SJussi Kivilinna 
783d8a32ac2SJussi Kivilinna 				memset(q, 0, template[i].tap[k]);
784d8a32ac2SJussi Kivilinna 
7858a525fcdSHerbert Xu 				sg_set_buf(&sgout[template[i].anp + k],
7868a525fcdSHerbert Xu 					   q, template[i].tap[k]);
787d8a32ac2SJussi Kivilinna 			}
788d8a32ac2SJussi Kivilinna 
7898ec25c51SHoria Geanta 			n = template[i].tap[k];
7908ec25c51SHoria Geanta 			if (k == template[i].np - 1 && enc)
7918ec25c51SHoria Geanta 				n += authsize;
7928ec25c51SHoria Geanta 			if (offset_in_page(q) + n < PAGE_SIZE)
7938ec25c51SHoria Geanta 				q[n] = 0;
7948ec25c51SHoria Geanta 
795da7f033dSHerbert Xu 			temp += template[i].tap[k];
796da7f033dSHerbert Xu 		}
797da7f033dSHerbert Xu 
798da7f033dSHerbert Xu 		ret = crypto_aead_setauthsize(tfm, authsize);
799da7f033dSHerbert Xu 		if (ret) {
800d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n",
801d8a32ac2SJussi Kivilinna 			       d, authsize, j, algo);
802da7f033dSHerbert Xu 			goto out;
803da7f033dSHerbert Xu 		}
804da7f033dSHerbert Xu 
805da7f033dSHerbert Xu 		if (enc) {
8068a525fcdSHerbert Xu 			if (WARN_ON(sg[template[i].anp + k - 1].offset +
8078a525fcdSHerbert Xu 				    sg[template[i].anp + k - 1].length +
8088a525fcdSHerbert Xu 				    authsize > PAGE_SIZE)) {
809da7f033dSHerbert Xu 				ret = -EINVAL;
810da7f033dSHerbert Xu 				goto out;
811da7f033dSHerbert Xu 			}
812da7f033dSHerbert Xu 
813d8a32ac2SJussi Kivilinna 			if (diff_dst)
8148a525fcdSHerbert Xu 				sgout[template[i].anp + k - 1].length +=
8158a525fcdSHerbert Xu 					authsize;
8168a525fcdSHerbert Xu 			sg[template[i].anp + k - 1].length += authsize;
817da7f033dSHerbert Xu 		}
818da7f033dSHerbert Xu 
819d8a32ac2SJussi Kivilinna 		aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
820da7f033dSHerbert Xu 				       template[i].ilen,
821da7f033dSHerbert Xu 				       iv);
822da7f033dSHerbert Xu 
8238a525fcdSHerbert Xu 		aead_request_set_ad(req, template[i].alen);
824da7f033dSHerbert Xu 
8257f397136SGilad Ben-Yossef 		ret = crypto_wait_req(enc ? crypto_aead_encrypt(req)
8267f397136SGilad Ben-Yossef 				      : crypto_aead_decrypt(req), &wait);
827da7f033dSHerbert Xu 
828da7f033dSHerbert Xu 		switch (ret) {
829da7f033dSHerbert Xu 		case 0:
830e44a1b44SJarod Wilson 			if (template[i].novrfy) {
831e44a1b44SJarod Wilson 				/* verification was supposed to fail */
832d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n",
833d8a32ac2SJussi Kivilinna 				       d, e, j, algo);
834e44a1b44SJarod Wilson 				/* so really, we got a bad message */
835e44a1b44SJarod Wilson 				ret = -EBADMSG;
836e44a1b44SJarod Wilson 				goto out;
837e44a1b44SJarod Wilson 			}
838da7f033dSHerbert Xu 			break;
839e44a1b44SJarod Wilson 		case -EBADMSG:
840e44a1b44SJarod Wilson 			if (template[i].novrfy)
841e44a1b44SJarod Wilson 				/* verification failure was expected */
842e44a1b44SJarod Wilson 				continue;
843da7f033dSHerbert Xu 			/* fall through */
844da7f033dSHerbert Xu 		default:
845d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n",
846d8a32ac2SJussi Kivilinna 			       d, e, j, algo, -ret);
847da7f033dSHerbert Xu 			goto out;
848da7f033dSHerbert Xu 		}
849da7f033dSHerbert Xu 
850da7f033dSHerbert Xu 		ret = -EINVAL;
851da7f033dSHerbert Xu 		for (k = 0, temp = 0; k < template[i].np; k++) {
852d8a32ac2SJussi Kivilinna 			if (diff_dst)
853d8a32ac2SJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
854d8a32ac2SJussi Kivilinna 				    offset_in_page(IDX[k]);
855d8a32ac2SJussi Kivilinna 			else
856da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
857da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
858da7f033dSHerbert Xu 
859da7f033dSHerbert Xu 			n = template[i].tap[k];
860da7f033dSHerbert Xu 			if (k == template[i].np - 1)
861da7f033dSHerbert Xu 				n += enc ? authsize : -authsize;
862da7f033dSHerbert Xu 
863da7f033dSHerbert Xu 			if (memcmp(q, template[i].result + temp, n)) {
864d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n",
865d8a32ac2SJussi Kivilinna 				       d, j, e, k, algo);
866da7f033dSHerbert Xu 				hexdump(q, n);
867da7f033dSHerbert Xu 				goto out;
868da7f033dSHerbert Xu 			}
869da7f033dSHerbert Xu 
870da7f033dSHerbert Xu 			q += n;
871da7f033dSHerbert Xu 			if (k == template[i].np - 1 && !enc) {
872d8a32ac2SJussi Kivilinna 				if (!diff_dst &&
873d8a32ac2SJussi Kivilinna 					memcmp(q, template[i].input +
874da7f033dSHerbert Xu 					      temp + n, authsize))
875da7f033dSHerbert Xu 					n = authsize;
876da7f033dSHerbert Xu 				else
877da7f033dSHerbert Xu 					n = 0;
878da7f033dSHerbert Xu 			} else {
87905b1d338SCristian Stoica 				for (n = 0; offset_in_page(q + n) && q[n]; n++)
880da7f033dSHerbert Xu 					;
881da7f033dSHerbert Xu 			}
882da7f033dSHerbert Xu 			if (n) {
883d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
884d8a32ac2SJussi Kivilinna 				       d, j, e, k, algo, n);
885da7f033dSHerbert Xu 				hexdump(q, n);
886da7f033dSHerbert Xu 				goto out;
887da7f033dSHerbert Xu 			}
888da7f033dSHerbert Xu 
889da7f033dSHerbert Xu 			temp += template[i].tap[k];
890da7f033dSHerbert Xu 		}
891da7f033dSHerbert Xu 	}
892da7f033dSHerbert Xu 
893da7f033dSHerbert Xu 	ret = 0;
894da7f033dSHerbert Xu 
895da7f033dSHerbert Xu out:
896da7f033dSHerbert Xu 	aead_request_free(req);
897d8a32ac2SJussi Kivilinna 	kfree(sg);
898d8a32ac2SJussi Kivilinna out_nosg:
899d8a32ac2SJussi Kivilinna 	if (diff_dst)
900d8a32ac2SJussi Kivilinna 		testmgr_free_buf(xoutbuf);
901d8a32ac2SJussi Kivilinna out_nooutbuf:
902f8b0d4d0SHerbert Xu 	testmgr_free_buf(axbuf);
903f8b0d4d0SHerbert Xu out_noaxbuf:
904f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
905f8b0d4d0SHerbert Xu out_noxbuf:
90629b77e5dSHoria Geanta 	kfree(key);
9079bac019dSTadeusz Struk 	kfree(iv);
908da7f033dSHerbert Xu 	return ret;
909da7f033dSHerbert Xu }
910da7f033dSHerbert Xu 
911d8a32ac2SJussi Kivilinna static int test_aead(struct crypto_aead *tfm, int enc,
912b13b1e0cSEric Biggers 		     const struct aead_testvec *template, unsigned int tcount)
913d8a32ac2SJussi Kivilinna {
91458dcf548SJussi Kivilinna 	unsigned int alignmask;
915d8a32ac2SJussi Kivilinna 	int ret;
916d8a32ac2SJussi Kivilinna 
917d8a32ac2SJussi Kivilinna 	/* test 'dst == src' case */
91858dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, false, 0);
919d8a32ac2SJussi Kivilinna 	if (ret)
920d8a32ac2SJussi Kivilinna 		return ret;
921d8a32ac2SJussi Kivilinna 
922d8a32ac2SJussi Kivilinna 	/* test 'dst != src' case */
92358dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, true, 0);
92458dcf548SJussi Kivilinna 	if (ret)
92558dcf548SJussi Kivilinna 		return ret;
92658dcf548SJussi Kivilinna 
92758dcf548SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
92858dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, true, 1);
92958dcf548SJussi Kivilinna 	if (ret)
93058dcf548SJussi Kivilinna 		return ret;
93158dcf548SJussi Kivilinna 
93258dcf548SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
93358dcf548SJussi Kivilinna 	if (alignmask) {
93458dcf548SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
93558dcf548SJussi Kivilinna 		ret = __test_aead(tfm, enc, template, tcount, true,
93658dcf548SJussi Kivilinna 				  alignmask + 1);
93758dcf548SJussi Kivilinna 		if (ret)
93858dcf548SJussi Kivilinna 			return ret;
93958dcf548SJussi Kivilinna 	}
94058dcf548SJussi Kivilinna 
94158dcf548SJussi Kivilinna 	return 0;
942d8a32ac2SJussi Kivilinna }
943d8a32ac2SJussi Kivilinna 
9441aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc,
945b13b1e0cSEric Biggers 		       const struct cipher_testvec *template,
946b13b1e0cSEric Biggers 		       unsigned int tcount)
9471aa4ecd9SHerbert Xu {
9481aa4ecd9SHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm));
9491aa4ecd9SHerbert Xu 	unsigned int i, j, k;
9501aa4ecd9SHerbert Xu 	char *q;
9511aa4ecd9SHerbert Xu 	const char *e;
9521aa4ecd9SHerbert Xu 	void *data;
953f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
954f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
955f8b0d4d0SHerbert Xu 
956f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
957f8b0d4d0SHerbert Xu 		goto out_nobuf;
9581aa4ecd9SHerbert Xu 
9591aa4ecd9SHerbert Xu 	if (enc == ENCRYPT)
9601aa4ecd9SHerbert Xu 	        e = "encryption";
9611aa4ecd9SHerbert Xu 	else
9621aa4ecd9SHerbert Xu 		e = "decryption";
9631aa4ecd9SHerbert Xu 
9641aa4ecd9SHerbert Xu 	j = 0;
9651aa4ecd9SHerbert Xu 	for (i = 0; i < tcount; i++) {
9661aa4ecd9SHerbert Xu 		if (template[i].np)
9671aa4ecd9SHerbert Xu 			continue;
9681aa4ecd9SHerbert Xu 
96910faa8c0SStephan Mueller 		if (fips_enabled && template[i].fips_skip)
97010faa8c0SStephan Mueller 			continue;
97110faa8c0SStephan Mueller 
9721aa4ecd9SHerbert Xu 		j++;
9731aa4ecd9SHerbert Xu 
974fd57f22aSHerbert Xu 		ret = -EINVAL;
975fd57f22aSHerbert Xu 		if (WARN_ON(template[i].ilen > PAGE_SIZE))
976fd57f22aSHerbert Xu 			goto out;
977fd57f22aSHerbert Xu 
9781aa4ecd9SHerbert Xu 		data = xbuf[0];
9791aa4ecd9SHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
9801aa4ecd9SHerbert Xu 
9811aa4ecd9SHerbert Xu 		crypto_cipher_clear_flags(tfm, ~0);
9821aa4ecd9SHerbert Xu 		if (template[i].wk)
9831aa4ecd9SHerbert Xu 			crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
9841aa4ecd9SHerbert Xu 
9851aa4ecd9SHerbert Xu 		ret = crypto_cipher_setkey(tfm, template[i].key,
9861aa4ecd9SHerbert Xu 					   template[i].klen);
9870fae0c1eSYanjiang Jin 		if (template[i].fail == !ret) {
9881aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: setkey failed "
9891aa4ecd9SHerbert Xu 			       "on test %d for %s: flags=%x\n", j,
9901aa4ecd9SHerbert Xu 			       algo, crypto_cipher_get_flags(tfm));
9911aa4ecd9SHerbert Xu 			goto out;
9921aa4ecd9SHerbert Xu 		} else if (ret)
9931aa4ecd9SHerbert Xu 			continue;
9941aa4ecd9SHerbert Xu 
9951aa4ecd9SHerbert Xu 		for (k = 0; k < template[i].ilen;
9961aa4ecd9SHerbert Xu 		     k += crypto_cipher_blocksize(tfm)) {
9971aa4ecd9SHerbert Xu 			if (enc)
9981aa4ecd9SHerbert Xu 				crypto_cipher_encrypt_one(tfm, data + k,
9991aa4ecd9SHerbert Xu 							  data + k);
10001aa4ecd9SHerbert Xu 			else
10011aa4ecd9SHerbert Xu 				crypto_cipher_decrypt_one(tfm, data + k,
10021aa4ecd9SHerbert Xu 							  data + k);
10031aa4ecd9SHerbert Xu 		}
10041aa4ecd9SHerbert Xu 
10051aa4ecd9SHerbert Xu 		q = data;
10061aa4ecd9SHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
10071aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: Test %d failed "
10081aa4ecd9SHerbert Xu 			       "on %s for %s\n", j, e, algo);
10091aa4ecd9SHerbert Xu 			hexdump(q, template[i].rlen);
10101aa4ecd9SHerbert Xu 			ret = -EINVAL;
10111aa4ecd9SHerbert Xu 			goto out;
10121aa4ecd9SHerbert Xu 		}
10131aa4ecd9SHerbert Xu 	}
10141aa4ecd9SHerbert Xu 
10151aa4ecd9SHerbert Xu 	ret = 0;
10161aa4ecd9SHerbert Xu 
10171aa4ecd9SHerbert Xu out:
1018f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
1019f8b0d4d0SHerbert Xu out_nobuf:
10201aa4ecd9SHerbert Xu 	return ret;
10211aa4ecd9SHerbert Xu }
10221aa4ecd9SHerbert Xu 
102312773d93SHerbert Xu static int __test_skcipher(struct crypto_skcipher *tfm, int enc,
1024b13b1e0cSEric Biggers 			   const struct cipher_testvec *template,
1025b13b1e0cSEric Biggers 			   unsigned int tcount,
10263a338f20SJussi Kivilinna 			   const bool diff_dst, const int align_offset)
1027da7f033dSHerbert Xu {
1028da7f033dSHerbert Xu 	const char *algo =
102912773d93SHerbert Xu 		crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm));
1030da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
1031da7f033dSHerbert Xu 	char *q;
103212773d93SHerbert Xu 	struct skcipher_request *req;
1033da7f033dSHerbert Xu 	struct scatterlist sg[8];
103408d6af8cSJussi Kivilinna 	struct scatterlist sgout[8];
103508d6af8cSJussi Kivilinna 	const char *e, *d;
10367f397136SGilad Ben-Yossef 	struct crypto_wait wait;
1037da7f033dSHerbert Xu 	void *data;
1038da7f033dSHerbert Xu 	char iv[MAX_IVLEN];
1039f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
104008d6af8cSJussi Kivilinna 	char *xoutbuf[XBUFSIZE];
1041f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
104284cba178SAndrey Ryabinin 	unsigned int ivsize = crypto_skcipher_ivsize(tfm);
1043f8b0d4d0SHerbert Xu 
1044f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
1045f8b0d4d0SHerbert Xu 		goto out_nobuf;
1046da7f033dSHerbert Xu 
104708d6af8cSJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
104808d6af8cSJussi Kivilinna 		goto out_nooutbuf;
104908d6af8cSJussi Kivilinna 
105008d6af8cSJussi Kivilinna 	if (diff_dst)
105108d6af8cSJussi Kivilinna 		d = "-ddst";
105208d6af8cSJussi Kivilinna 	else
105308d6af8cSJussi Kivilinna 		d = "";
105408d6af8cSJussi Kivilinna 
1055da7f033dSHerbert Xu 	if (enc == ENCRYPT)
1056da7f033dSHerbert Xu 	        e = "encryption";
1057da7f033dSHerbert Xu 	else
1058da7f033dSHerbert Xu 		e = "decryption";
1059da7f033dSHerbert Xu 
10607f397136SGilad Ben-Yossef 	crypto_init_wait(&wait);
1061da7f033dSHerbert Xu 
106212773d93SHerbert Xu 	req = skcipher_request_alloc(tfm, GFP_KERNEL);
1063da7f033dSHerbert Xu 	if (!req) {
106408d6af8cSJussi Kivilinna 		pr_err("alg: skcipher%s: Failed to allocate request for %s\n",
106508d6af8cSJussi Kivilinna 		       d, algo);
1066da7f033dSHerbert Xu 		goto out;
1067da7f033dSHerbert Xu 	}
1068da7f033dSHerbert Xu 
106912773d93SHerbert Xu 	skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
10707f397136SGilad Ben-Yossef 				      crypto_req_done, &wait);
1071da7f033dSHerbert Xu 
1072da7f033dSHerbert Xu 	j = 0;
1073da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
1074bbb9a7ddSCristian Stoica 		if (template[i].np && !template[i].also_non_np)
1075bbb9a7ddSCristian Stoica 			continue;
1076bbb9a7ddSCristian Stoica 
107710faa8c0SStephan Mueller 		if (fips_enabled && template[i].fips_skip)
107810faa8c0SStephan Mueller 			continue;
107910faa8c0SStephan Mueller 
1080da7f033dSHerbert Xu 		if (template[i].iv)
108184cba178SAndrey Ryabinin 			memcpy(iv, template[i].iv, ivsize);
1082da7f033dSHerbert Xu 		else
1083da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
1084da7f033dSHerbert Xu 
1085da7f033dSHerbert Xu 		j++;
1086fd57f22aSHerbert Xu 		ret = -EINVAL;
1087a1aa44a2SCristian Stoica 		if (WARN_ON(align_offset + template[i].ilen > PAGE_SIZE))
1088fd57f22aSHerbert Xu 			goto out;
1089fd57f22aSHerbert Xu 
1090da7f033dSHerbert Xu 		data = xbuf[0];
10913a338f20SJussi Kivilinna 		data += align_offset;
1092da7f033dSHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
1093da7f033dSHerbert Xu 
109412773d93SHerbert Xu 		crypto_skcipher_clear_flags(tfm, ~0);
1095da7f033dSHerbert Xu 		if (template[i].wk)
109612773d93SHerbert Xu 			crypto_skcipher_set_flags(tfm,
109712773d93SHerbert Xu 						  CRYPTO_TFM_REQ_WEAK_KEY);
1098da7f033dSHerbert Xu 
109912773d93SHerbert Xu 		ret = crypto_skcipher_setkey(tfm, template[i].key,
1100da7f033dSHerbert Xu 					     template[i].klen);
11010fae0c1eSYanjiang Jin 		if (template[i].fail == !ret) {
110208d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n",
110312773d93SHerbert Xu 			       d, j, algo, crypto_skcipher_get_flags(tfm));
1104da7f033dSHerbert Xu 			goto out;
1105da7f033dSHerbert Xu 		} else if (ret)
1106da7f033dSHerbert Xu 			continue;
1107da7f033dSHerbert Xu 
1108da7f033dSHerbert Xu 		sg_init_one(&sg[0], data, template[i].ilen);
110908d6af8cSJussi Kivilinna 		if (diff_dst) {
111008d6af8cSJussi Kivilinna 			data = xoutbuf[0];
11113a338f20SJussi Kivilinna 			data += align_offset;
111208d6af8cSJussi Kivilinna 			sg_init_one(&sgout[0], data, template[i].ilen);
111308d6af8cSJussi Kivilinna 		}
1114da7f033dSHerbert Xu 
111512773d93SHerbert Xu 		skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1116da7f033dSHerbert Xu 					   template[i].ilen, iv);
11177f397136SGilad Ben-Yossef 		ret = crypto_wait_req(enc ? crypto_skcipher_encrypt(req) :
11187f397136SGilad Ben-Yossef 				      crypto_skcipher_decrypt(req), &wait);
1119da7f033dSHerbert Xu 
11207f397136SGilad Ben-Yossef 		if (ret) {
112108d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n",
112208d6af8cSJussi Kivilinna 			       d, e, j, algo, -ret);
1123da7f033dSHerbert Xu 			goto out;
1124da7f033dSHerbert Xu 		}
1125da7f033dSHerbert Xu 
1126da7f033dSHerbert Xu 		q = data;
1127da7f033dSHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
11288a826a34SBoris BREZILLON 			pr_err("alg: skcipher%s: Test %d failed (invalid result) on %s for %s\n",
112908d6af8cSJussi Kivilinna 			       d, j, e, algo);
1130da7f033dSHerbert Xu 			hexdump(q, template[i].rlen);
1131da7f033dSHerbert Xu 			ret = -EINVAL;
1132da7f033dSHerbert Xu 			goto out;
1133da7f033dSHerbert Xu 		}
11348a826a34SBoris BREZILLON 
11358a826a34SBoris BREZILLON 		if (template[i].iv_out &&
11368a826a34SBoris BREZILLON 		    memcmp(iv, template[i].iv_out,
11378a826a34SBoris BREZILLON 			   crypto_skcipher_ivsize(tfm))) {
11388a826a34SBoris BREZILLON 			pr_err("alg: skcipher%s: Test %d failed (invalid output IV) on %s for %s\n",
11398a826a34SBoris BREZILLON 			       d, j, e, algo);
11408a826a34SBoris BREZILLON 			hexdump(iv, crypto_skcipher_ivsize(tfm));
11418a826a34SBoris BREZILLON 			ret = -EINVAL;
11428a826a34SBoris BREZILLON 			goto out;
11438a826a34SBoris BREZILLON 		}
1144da7f033dSHerbert Xu 	}
1145da7f033dSHerbert Xu 
1146da7f033dSHerbert Xu 	j = 0;
1147da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
11483a338f20SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
11493a338f20SJussi Kivilinna 		if (align_offset != 0)
11503a338f20SJussi Kivilinna 			break;
1151da7f033dSHerbert Xu 
1152bbb9a7ddSCristian Stoica 		if (!template[i].np)
1153bbb9a7ddSCristian Stoica 			continue;
1154bbb9a7ddSCristian Stoica 
115510faa8c0SStephan Mueller 		if (fips_enabled && template[i].fips_skip)
115610faa8c0SStephan Mueller 			continue;
115710faa8c0SStephan Mueller 
1158da7f033dSHerbert Xu 		if (template[i].iv)
115984cba178SAndrey Ryabinin 			memcpy(iv, template[i].iv, ivsize);
1160da7f033dSHerbert Xu 		else
1161da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
1162da7f033dSHerbert Xu 
1163da7f033dSHerbert Xu 		j++;
116412773d93SHerbert Xu 		crypto_skcipher_clear_flags(tfm, ~0);
1165da7f033dSHerbert Xu 		if (template[i].wk)
116612773d93SHerbert Xu 			crypto_skcipher_set_flags(tfm,
116712773d93SHerbert Xu 						  CRYPTO_TFM_REQ_WEAK_KEY);
1168da7f033dSHerbert Xu 
116912773d93SHerbert Xu 		ret = crypto_skcipher_setkey(tfm, template[i].key,
1170da7f033dSHerbert Xu 					     template[i].klen);
11710fae0c1eSYanjiang Jin 		if (template[i].fail == !ret) {
117208d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n",
117312773d93SHerbert Xu 			       d, j, algo, crypto_skcipher_get_flags(tfm));
1174da7f033dSHerbert Xu 			goto out;
1175da7f033dSHerbert Xu 		} else if (ret)
1176da7f033dSHerbert Xu 			continue;
1177da7f033dSHerbert Xu 
1178da7f033dSHerbert Xu 		temp = 0;
1179da7f033dSHerbert Xu 		ret = -EINVAL;
1180da7f033dSHerbert Xu 		sg_init_table(sg, template[i].np);
118108d6af8cSJussi Kivilinna 		if (diff_dst)
118208d6af8cSJussi Kivilinna 			sg_init_table(sgout, template[i].np);
1183da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
1184da7f033dSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
1185da7f033dSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
1186da7f033dSHerbert Xu 				goto out;
1187da7f033dSHerbert Xu 
1188a1aa44a2SCristian Stoica 			q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
1189da7f033dSHerbert Xu 
1190a1aa44a2SCristian Stoica 			memcpy(q, template[i].input + temp, template[i].tap[k]);
1191da7f033dSHerbert Xu 
1192a1aa44a2SCristian Stoica 			if (offset_in_page(q) + template[i].tap[k] < PAGE_SIZE)
1193da7f033dSHerbert Xu 				q[template[i].tap[k]] = 0;
1194da7f033dSHerbert Xu 
1195da7f033dSHerbert Xu 			sg_set_buf(&sg[k], q, template[i].tap[k]);
119608d6af8cSJussi Kivilinna 			if (diff_dst) {
119708d6af8cSJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
119808d6af8cSJussi Kivilinna 				    offset_in_page(IDX[k]);
119908d6af8cSJussi Kivilinna 
1200a1aa44a2SCristian Stoica 				sg_set_buf(&sgout[k], q, template[i].tap[k]);
120108d6af8cSJussi Kivilinna 
120208d6af8cSJussi Kivilinna 				memset(q, 0, template[i].tap[k]);
120308d6af8cSJussi Kivilinna 				if (offset_in_page(q) +
120408d6af8cSJussi Kivilinna 				    template[i].tap[k] < PAGE_SIZE)
120508d6af8cSJussi Kivilinna 					q[template[i].tap[k]] = 0;
120608d6af8cSJussi Kivilinna 			}
1207da7f033dSHerbert Xu 
1208da7f033dSHerbert Xu 			temp += template[i].tap[k];
1209da7f033dSHerbert Xu 		}
1210da7f033dSHerbert Xu 
121112773d93SHerbert Xu 		skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1212da7f033dSHerbert Xu 					   template[i].ilen, iv);
1213da7f033dSHerbert Xu 
12147f397136SGilad Ben-Yossef 		ret = crypto_wait_req(enc ? crypto_skcipher_encrypt(req) :
12157f397136SGilad Ben-Yossef 				      crypto_skcipher_decrypt(req), &wait);
1216da7f033dSHerbert Xu 
12177f397136SGilad Ben-Yossef 		if (ret) {
121808d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n",
121908d6af8cSJussi Kivilinna 			       d, e, j, algo, -ret);
1220da7f033dSHerbert Xu 			goto out;
1221da7f033dSHerbert Xu 		}
1222da7f033dSHerbert Xu 
1223da7f033dSHerbert Xu 		temp = 0;
1224da7f033dSHerbert Xu 		ret = -EINVAL;
1225da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
122608d6af8cSJussi Kivilinna 			if (diff_dst)
122708d6af8cSJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
122808d6af8cSJussi Kivilinna 				    offset_in_page(IDX[k]);
122908d6af8cSJussi Kivilinna 			else
1230da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
1231da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
1232da7f033dSHerbert Xu 
1233da7f033dSHerbert Xu 			if (memcmp(q, template[i].result + temp,
1234da7f033dSHerbert Xu 				   template[i].tap[k])) {
123508d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n",
123608d6af8cSJussi Kivilinna 				       d, j, e, k, algo);
1237da7f033dSHerbert Xu 				hexdump(q, template[i].tap[k]);
1238da7f033dSHerbert Xu 				goto out;
1239da7f033dSHerbert Xu 			}
1240da7f033dSHerbert Xu 
1241da7f033dSHerbert Xu 			q += template[i].tap[k];
1242da7f033dSHerbert Xu 			for (n = 0; offset_in_page(q + n) && q[n]; n++)
1243da7f033dSHerbert Xu 				;
1244da7f033dSHerbert Xu 			if (n) {
124508d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
124608d6af8cSJussi Kivilinna 				       d, j, e, k, algo, n);
1247da7f033dSHerbert Xu 				hexdump(q, n);
1248da7f033dSHerbert Xu 				goto out;
1249da7f033dSHerbert Xu 			}
1250da7f033dSHerbert Xu 			temp += template[i].tap[k];
1251da7f033dSHerbert Xu 		}
1252da7f033dSHerbert Xu 	}
1253da7f033dSHerbert Xu 
1254da7f033dSHerbert Xu 	ret = 0;
1255da7f033dSHerbert Xu 
1256da7f033dSHerbert Xu out:
125712773d93SHerbert Xu 	skcipher_request_free(req);
125808d6af8cSJussi Kivilinna 	if (diff_dst)
125908d6af8cSJussi Kivilinna 		testmgr_free_buf(xoutbuf);
126008d6af8cSJussi Kivilinna out_nooutbuf:
1261f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
1262f8b0d4d0SHerbert Xu out_nobuf:
1263da7f033dSHerbert Xu 	return ret;
1264da7f033dSHerbert Xu }
1265da7f033dSHerbert Xu 
126612773d93SHerbert Xu static int test_skcipher(struct crypto_skcipher *tfm, int enc,
1267b13b1e0cSEric Biggers 			 const struct cipher_testvec *template,
1268b13b1e0cSEric Biggers 			 unsigned int tcount)
126908d6af8cSJussi Kivilinna {
12703a338f20SJussi Kivilinna 	unsigned int alignmask;
127108d6af8cSJussi Kivilinna 	int ret;
127208d6af8cSJussi Kivilinna 
127308d6af8cSJussi Kivilinna 	/* test 'dst == src' case */
12743a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, false, 0);
127508d6af8cSJussi Kivilinna 	if (ret)
127608d6af8cSJussi Kivilinna 		return ret;
127708d6af8cSJussi Kivilinna 
127808d6af8cSJussi Kivilinna 	/* test 'dst != src' case */
12793a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 0);
12803a338f20SJussi Kivilinna 	if (ret)
12813a338f20SJussi Kivilinna 		return ret;
12823a338f20SJussi Kivilinna 
12833a338f20SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
12843a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 1);
12853a338f20SJussi Kivilinna 	if (ret)
12863a338f20SJussi Kivilinna 		return ret;
12873a338f20SJussi Kivilinna 
12883a338f20SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
12893a338f20SJussi Kivilinna 	if (alignmask) {
12903a338f20SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
12913a338f20SJussi Kivilinna 		ret = __test_skcipher(tfm, enc, template, tcount, true,
12923a338f20SJussi Kivilinna 				      alignmask + 1);
12933a338f20SJussi Kivilinna 		if (ret)
12943a338f20SJussi Kivilinna 			return ret;
12953a338f20SJussi Kivilinna 	}
12963a338f20SJussi Kivilinna 
12973a338f20SJussi Kivilinna 	return 0;
129808d6af8cSJussi Kivilinna }
129908d6af8cSJussi Kivilinna 
1300b13b1e0cSEric Biggers static int test_comp(struct crypto_comp *tfm,
1301b13b1e0cSEric Biggers 		     const struct comp_testvec *ctemplate,
1302b13b1e0cSEric Biggers 		     const struct comp_testvec *dtemplate,
1303b13b1e0cSEric Biggers 		     int ctcount, int dtcount)
1304da7f033dSHerbert Xu {
1305da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
1306da7f033dSHerbert Xu 	unsigned int i;
1307da7f033dSHerbert Xu 	char result[COMP_BUF_SIZE];
1308da7f033dSHerbert Xu 	int ret;
1309da7f033dSHerbert Xu 
1310da7f033dSHerbert Xu 	for (i = 0; i < ctcount; i++) {
1311c79cf910SGeert Uytterhoeven 		int ilen;
1312c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1313da7f033dSHerbert Xu 
1314da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1315da7f033dSHerbert Xu 
1316da7f033dSHerbert Xu 		ilen = ctemplate[i].inlen;
1317da7f033dSHerbert Xu 		ret = crypto_comp_compress(tfm, ctemplate[i].input,
1318da7f033dSHerbert Xu 		                           ilen, result, &dlen);
1319da7f033dSHerbert Xu 		if (ret) {
1320da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: compression failed "
1321da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1322da7f033dSHerbert Xu 			       -ret);
1323da7f033dSHerbert Xu 			goto out;
1324da7f033dSHerbert Xu 		}
1325da7f033dSHerbert Xu 
1326b812eb00SGeert Uytterhoeven 		if (dlen != ctemplate[i].outlen) {
1327b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Compression test %d "
1328b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1329b812eb00SGeert Uytterhoeven 			       dlen);
1330b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1331b812eb00SGeert Uytterhoeven 			goto out;
1332b812eb00SGeert Uytterhoeven 		}
1333b812eb00SGeert Uytterhoeven 
1334da7f033dSHerbert Xu 		if (memcmp(result, ctemplate[i].output, dlen)) {
1335da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Compression test %d "
1336da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1337da7f033dSHerbert Xu 			hexdump(result, dlen);
1338da7f033dSHerbert Xu 			ret = -EINVAL;
1339da7f033dSHerbert Xu 			goto out;
1340da7f033dSHerbert Xu 		}
1341da7f033dSHerbert Xu 	}
1342da7f033dSHerbert Xu 
1343da7f033dSHerbert Xu 	for (i = 0; i < dtcount; i++) {
1344c79cf910SGeert Uytterhoeven 		int ilen;
1345c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1346da7f033dSHerbert Xu 
1347da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1348da7f033dSHerbert Xu 
1349da7f033dSHerbert Xu 		ilen = dtemplate[i].inlen;
1350da7f033dSHerbert Xu 		ret = crypto_comp_decompress(tfm, dtemplate[i].input,
1351da7f033dSHerbert Xu 		                             ilen, result, &dlen);
1352da7f033dSHerbert Xu 		if (ret) {
1353da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: decompression failed "
1354da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1355da7f033dSHerbert Xu 			       -ret);
1356da7f033dSHerbert Xu 			goto out;
1357da7f033dSHerbert Xu 		}
1358da7f033dSHerbert Xu 
1359b812eb00SGeert Uytterhoeven 		if (dlen != dtemplate[i].outlen) {
1360b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Decompression test %d "
1361b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1362b812eb00SGeert Uytterhoeven 			       dlen);
1363b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1364b812eb00SGeert Uytterhoeven 			goto out;
1365b812eb00SGeert Uytterhoeven 		}
1366b812eb00SGeert Uytterhoeven 
1367da7f033dSHerbert Xu 		if (memcmp(result, dtemplate[i].output, dlen)) {
1368da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Decompression test %d "
1369da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1370da7f033dSHerbert Xu 			hexdump(result, dlen);
1371da7f033dSHerbert Xu 			ret = -EINVAL;
1372da7f033dSHerbert Xu 			goto out;
1373da7f033dSHerbert Xu 		}
1374da7f033dSHerbert Xu 	}
1375da7f033dSHerbert Xu 
1376da7f033dSHerbert Xu 	ret = 0;
1377da7f033dSHerbert Xu 
1378da7f033dSHerbert Xu out:
1379da7f033dSHerbert Xu 	return ret;
1380da7f033dSHerbert Xu }
1381da7f033dSHerbert Xu 
1382b13b1e0cSEric Biggers static int test_acomp(struct crypto_acomp *tfm,
1383b13b1e0cSEric Biggers 		      const struct comp_testvec *ctemplate,
1384b13b1e0cSEric Biggers 		      const struct comp_testvec *dtemplate,
1385b13b1e0cSEric Biggers 		      int ctcount, int dtcount)
1386d7db7a88SGiovanni Cabiddu {
1387d7db7a88SGiovanni Cabiddu 	const char *algo = crypto_tfm_alg_driver_name(crypto_acomp_tfm(tfm));
1388d7db7a88SGiovanni Cabiddu 	unsigned int i;
1389a9943a0aSGiovanni Cabiddu 	char *output, *decomp_out;
1390d7db7a88SGiovanni Cabiddu 	int ret;
1391d7db7a88SGiovanni Cabiddu 	struct scatterlist src, dst;
1392d7db7a88SGiovanni Cabiddu 	struct acomp_req *req;
13937f397136SGilad Ben-Yossef 	struct crypto_wait wait;
1394d7db7a88SGiovanni Cabiddu 
1395eb095593SEric Biggers 	output = kmalloc(COMP_BUF_SIZE, GFP_KERNEL);
1396eb095593SEric Biggers 	if (!output)
1397eb095593SEric Biggers 		return -ENOMEM;
1398eb095593SEric Biggers 
1399a9943a0aSGiovanni Cabiddu 	decomp_out = kmalloc(COMP_BUF_SIZE, GFP_KERNEL);
1400a9943a0aSGiovanni Cabiddu 	if (!decomp_out) {
1401a9943a0aSGiovanni Cabiddu 		kfree(output);
1402a9943a0aSGiovanni Cabiddu 		return -ENOMEM;
1403a9943a0aSGiovanni Cabiddu 	}
1404a9943a0aSGiovanni Cabiddu 
1405d7db7a88SGiovanni Cabiddu 	for (i = 0; i < ctcount; i++) {
1406d7db7a88SGiovanni Cabiddu 		unsigned int dlen = COMP_BUF_SIZE;
1407d7db7a88SGiovanni Cabiddu 		int ilen = ctemplate[i].inlen;
140802608e02SLaura Abbott 		void *input_vec;
1409d7db7a88SGiovanni Cabiddu 
1410d2110224SEric Biggers 		input_vec = kmemdup(ctemplate[i].input, ilen, GFP_KERNEL);
141102608e02SLaura Abbott 		if (!input_vec) {
141202608e02SLaura Abbott 			ret = -ENOMEM;
141302608e02SLaura Abbott 			goto out;
141402608e02SLaura Abbott 		}
141502608e02SLaura Abbott 
1416eb095593SEric Biggers 		memset(output, 0, dlen);
14177f397136SGilad Ben-Yossef 		crypto_init_wait(&wait);
141802608e02SLaura Abbott 		sg_init_one(&src, input_vec, ilen);
1419d7db7a88SGiovanni Cabiddu 		sg_init_one(&dst, output, dlen);
1420d7db7a88SGiovanni Cabiddu 
1421d7db7a88SGiovanni Cabiddu 		req = acomp_request_alloc(tfm);
1422d7db7a88SGiovanni Cabiddu 		if (!req) {
1423d7db7a88SGiovanni Cabiddu 			pr_err("alg: acomp: request alloc failed for %s\n",
1424d7db7a88SGiovanni Cabiddu 			       algo);
142502608e02SLaura Abbott 			kfree(input_vec);
1426d7db7a88SGiovanni Cabiddu 			ret = -ENOMEM;
1427d7db7a88SGiovanni Cabiddu 			goto out;
1428d7db7a88SGiovanni Cabiddu 		}
1429d7db7a88SGiovanni Cabiddu 
1430d7db7a88SGiovanni Cabiddu 		acomp_request_set_params(req, &src, &dst, ilen, dlen);
1431d7db7a88SGiovanni Cabiddu 		acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
14327f397136SGilad Ben-Yossef 					   crypto_req_done, &wait);
1433d7db7a88SGiovanni Cabiddu 
14347f397136SGilad Ben-Yossef 		ret = crypto_wait_req(crypto_acomp_compress(req), &wait);
1435d7db7a88SGiovanni Cabiddu 		if (ret) {
1436d7db7a88SGiovanni Cabiddu 			pr_err("alg: acomp: compression failed on test %d for %s: ret=%d\n",
1437d7db7a88SGiovanni Cabiddu 			       i + 1, algo, -ret);
143802608e02SLaura Abbott 			kfree(input_vec);
1439d7db7a88SGiovanni Cabiddu 			acomp_request_free(req);
1440d7db7a88SGiovanni Cabiddu 			goto out;
1441d7db7a88SGiovanni Cabiddu 		}
1442d7db7a88SGiovanni Cabiddu 
1443a9943a0aSGiovanni Cabiddu 		ilen = req->dlen;
1444a9943a0aSGiovanni Cabiddu 		dlen = COMP_BUF_SIZE;
1445a9943a0aSGiovanni Cabiddu 		sg_init_one(&src, output, ilen);
1446a9943a0aSGiovanni Cabiddu 		sg_init_one(&dst, decomp_out, dlen);
14477f397136SGilad Ben-Yossef 		crypto_init_wait(&wait);
1448a9943a0aSGiovanni Cabiddu 		acomp_request_set_params(req, &src, &dst, ilen, dlen);
1449a9943a0aSGiovanni Cabiddu 
14507f397136SGilad Ben-Yossef 		ret = crypto_wait_req(crypto_acomp_decompress(req), &wait);
1451a9943a0aSGiovanni Cabiddu 		if (ret) {
1452a9943a0aSGiovanni Cabiddu 			pr_err("alg: acomp: compression failed on test %d for %s: ret=%d\n",
1453a9943a0aSGiovanni Cabiddu 			       i + 1, algo, -ret);
1454a9943a0aSGiovanni Cabiddu 			kfree(input_vec);
1455a9943a0aSGiovanni Cabiddu 			acomp_request_free(req);
1456a9943a0aSGiovanni Cabiddu 			goto out;
1457a9943a0aSGiovanni Cabiddu 		}
1458a9943a0aSGiovanni Cabiddu 
1459a9943a0aSGiovanni Cabiddu 		if (req->dlen != ctemplate[i].inlen) {
1460d7db7a88SGiovanni Cabiddu 			pr_err("alg: acomp: Compression test %d failed for %s: output len = %d\n",
1461d7db7a88SGiovanni Cabiddu 			       i + 1, algo, req->dlen);
1462d7db7a88SGiovanni Cabiddu 			ret = -EINVAL;
146302608e02SLaura Abbott 			kfree(input_vec);
1464d7db7a88SGiovanni Cabiddu 			acomp_request_free(req);
1465d7db7a88SGiovanni Cabiddu 			goto out;
1466d7db7a88SGiovanni Cabiddu 		}
1467d7db7a88SGiovanni Cabiddu 
1468a9943a0aSGiovanni Cabiddu 		if (memcmp(input_vec, decomp_out, req->dlen)) {
1469d7db7a88SGiovanni Cabiddu 			pr_err("alg: acomp: Compression test %d failed for %s\n",
1470d7db7a88SGiovanni Cabiddu 			       i + 1, algo);
1471d7db7a88SGiovanni Cabiddu 			hexdump(output, req->dlen);
1472d7db7a88SGiovanni Cabiddu 			ret = -EINVAL;
147302608e02SLaura Abbott 			kfree(input_vec);
1474d7db7a88SGiovanni Cabiddu 			acomp_request_free(req);
1475d7db7a88SGiovanni Cabiddu 			goto out;
1476d7db7a88SGiovanni Cabiddu 		}
1477d7db7a88SGiovanni Cabiddu 
147802608e02SLaura Abbott 		kfree(input_vec);
1479d7db7a88SGiovanni Cabiddu 		acomp_request_free(req);
1480d7db7a88SGiovanni Cabiddu 	}
1481d7db7a88SGiovanni Cabiddu 
1482d7db7a88SGiovanni Cabiddu 	for (i = 0; i < dtcount; i++) {
1483d7db7a88SGiovanni Cabiddu 		unsigned int dlen = COMP_BUF_SIZE;
1484d7db7a88SGiovanni Cabiddu 		int ilen = dtemplate[i].inlen;
148502608e02SLaura Abbott 		void *input_vec;
1486d7db7a88SGiovanni Cabiddu 
1487d2110224SEric Biggers 		input_vec = kmemdup(dtemplate[i].input, ilen, GFP_KERNEL);
148802608e02SLaura Abbott 		if (!input_vec) {
148902608e02SLaura Abbott 			ret = -ENOMEM;
149002608e02SLaura Abbott 			goto out;
149102608e02SLaura Abbott 		}
149202608e02SLaura Abbott 
1493eb095593SEric Biggers 		memset(output, 0, dlen);
14947f397136SGilad Ben-Yossef 		crypto_init_wait(&wait);
149502608e02SLaura Abbott 		sg_init_one(&src, input_vec, ilen);
1496d7db7a88SGiovanni Cabiddu 		sg_init_one(&dst, output, dlen);
1497d7db7a88SGiovanni Cabiddu 
1498d7db7a88SGiovanni Cabiddu 		req = acomp_request_alloc(tfm);
1499d7db7a88SGiovanni Cabiddu 		if (!req) {
1500d7db7a88SGiovanni Cabiddu 			pr_err("alg: acomp: request alloc failed for %s\n",
1501d7db7a88SGiovanni Cabiddu 			       algo);
150202608e02SLaura Abbott 			kfree(input_vec);
1503d7db7a88SGiovanni Cabiddu 			ret = -ENOMEM;
1504d7db7a88SGiovanni Cabiddu 			goto out;
1505d7db7a88SGiovanni Cabiddu 		}
1506d7db7a88SGiovanni Cabiddu 
1507d7db7a88SGiovanni Cabiddu 		acomp_request_set_params(req, &src, &dst, ilen, dlen);
1508d7db7a88SGiovanni Cabiddu 		acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
15097f397136SGilad Ben-Yossef 					   crypto_req_done, &wait);
1510d7db7a88SGiovanni Cabiddu 
15117f397136SGilad Ben-Yossef 		ret = crypto_wait_req(crypto_acomp_decompress(req), &wait);
1512d7db7a88SGiovanni Cabiddu 		if (ret) {
1513d7db7a88SGiovanni Cabiddu 			pr_err("alg: acomp: decompression failed on test %d for %s: ret=%d\n",
1514d7db7a88SGiovanni Cabiddu 			       i + 1, algo, -ret);
151502608e02SLaura Abbott 			kfree(input_vec);
1516d7db7a88SGiovanni Cabiddu 			acomp_request_free(req);
1517d7db7a88SGiovanni Cabiddu 			goto out;
1518d7db7a88SGiovanni Cabiddu 		}
1519d7db7a88SGiovanni Cabiddu 
1520d7db7a88SGiovanni Cabiddu 		if (req->dlen != dtemplate[i].outlen) {
1521d7db7a88SGiovanni Cabiddu 			pr_err("alg: acomp: Decompression test %d failed for %s: output len = %d\n",
1522d7db7a88SGiovanni Cabiddu 			       i + 1, algo, req->dlen);
1523d7db7a88SGiovanni Cabiddu 			ret = -EINVAL;
152402608e02SLaura Abbott 			kfree(input_vec);
1525d7db7a88SGiovanni Cabiddu 			acomp_request_free(req);
1526d7db7a88SGiovanni Cabiddu 			goto out;
1527d7db7a88SGiovanni Cabiddu 		}
1528d7db7a88SGiovanni Cabiddu 
1529d7db7a88SGiovanni Cabiddu 		if (memcmp(output, dtemplate[i].output, req->dlen)) {
1530d7db7a88SGiovanni Cabiddu 			pr_err("alg: acomp: Decompression test %d failed for %s\n",
1531d7db7a88SGiovanni Cabiddu 			       i + 1, algo);
1532d7db7a88SGiovanni Cabiddu 			hexdump(output, req->dlen);
1533d7db7a88SGiovanni Cabiddu 			ret = -EINVAL;
153402608e02SLaura Abbott 			kfree(input_vec);
1535d7db7a88SGiovanni Cabiddu 			acomp_request_free(req);
1536d7db7a88SGiovanni Cabiddu 			goto out;
1537d7db7a88SGiovanni Cabiddu 		}
1538d7db7a88SGiovanni Cabiddu 
153902608e02SLaura Abbott 		kfree(input_vec);
1540d7db7a88SGiovanni Cabiddu 		acomp_request_free(req);
1541d7db7a88SGiovanni Cabiddu 	}
1542d7db7a88SGiovanni Cabiddu 
1543d7db7a88SGiovanni Cabiddu 	ret = 0;
1544d7db7a88SGiovanni Cabiddu 
1545d7db7a88SGiovanni Cabiddu out:
1546a9943a0aSGiovanni Cabiddu 	kfree(decomp_out);
1547eb095593SEric Biggers 	kfree(output);
1548d7db7a88SGiovanni Cabiddu 	return ret;
1549d7db7a88SGiovanni Cabiddu }
1550d7db7a88SGiovanni Cabiddu 
1551b13b1e0cSEric Biggers static int test_cprng(struct crypto_rng *tfm,
1552b13b1e0cSEric Biggers 		      const struct cprng_testvec *template,
15537647d6ceSJarod Wilson 		      unsigned int tcount)
15547647d6ceSJarod Wilson {
15557647d6ceSJarod Wilson 	const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
1556fa4ef8a6SFelipe Contreras 	int err = 0, i, j, seedsize;
15577647d6ceSJarod Wilson 	u8 *seed;
15587647d6ceSJarod Wilson 	char result[32];
15597647d6ceSJarod Wilson 
15607647d6ceSJarod Wilson 	seedsize = crypto_rng_seedsize(tfm);
15617647d6ceSJarod Wilson 
15627647d6ceSJarod Wilson 	seed = kmalloc(seedsize, GFP_KERNEL);
15637647d6ceSJarod Wilson 	if (!seed) {
15647647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to allocate seed space "
15657647d6ceSJarod Wilson 		       "for %s\n", algo);
15667647d6ceSJarod Wilson 		return -ENOMEM;
15677647d6ceSJarod Wilson 	}
15687647d6ceSJarod Wilson 
15697647d6ceSJarod Wilson 	for (i = 0; i < tcount; i++) {
15707647d6ceSJarod Wilson 		memset(result, 0, 32);
15717647d6ceSJarod Wilson 
15727647d6ceSJarod Wilson 		memcpy(seed, template[i].v, template[i].vlen);
15737647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen, template[i].key,
15747647d6ceSJarod Wilson 		       template[i].klen);
15757647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen + template[i].klen,
15767647d6ceSJarod Wilson 		       template[i].dt, template[i].dtlen);
15777647d6ceSJarod Wilson 
15787647d6ceSJarod Wilson 		err = crypto_rng_reset(tfm, seed, seedsize);
15797647d6ceSJarod Wilson 		if (err) {
15807647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Failed to reset rng "
15817647d6ceSJarod Wilson 			       "for %s\n", algo);
15827647d6ceSJarod Wilson 			goto out;
15837647d6ceSJarod Wilson 		}
15847647d6ceSJarod Wilson 
15857647d6ceSJarod Wilson 		for (j = 0; j < template[i].loops; j++) {
15867647d6ceSJarod Wilson 			err = crypto_rng_get_bytes(tfm, result,
15877647d6ceSJarod Wilson 						   template[i].rlen);
158819e60e13SStephan Mueller 			if (err < 0) {
15897647d6ceSJarod Wilson 				printk(KERN_ERR "alg: cprng: Failed to obtain "
15907647d6ceSJarod Wilson 				       "the correct amount of random data for "
159119e60e13SStephan Mueller 				       "%s (requested %d)\n", algo,
159219e60e13SStephan Mueller 				       template[i].rlen);
15937647d6ceSJarod Wilson 				goto out;
15947647d6ceSJarod Wilson 			}
15957647d6ceSJarod Wilson 		}
15967647d6ceSJarod Wilson 
15977647d6ceSJarod Wilson 		err = memcmp(result, template[i].result,
15987647d6ceSJarod Wilson 			     template[i].rlen);
15997647d6ceSJarod Wilson 		if (err) {
16007647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Test %d failed for %s\n",
16017647d6ceSJarod Wilson 			       i, algo);
16027647d6ceSJarod Wilson 			hexdump(result, template[i].rlen);
16037647d6ceSJarod Wilson 			err = -EINVAL;
16047647d6ceSJarod Wilson 			goto out;
16057647d6ceSJarod Wilson 		}
16067647d6ceSJarod Wilson 	}
16077647d6ceSJarod Wilson 
16087647d6ceSJarod Wilson out:
16097647d6ceSJarod Wilson 	kfree(seed);
16107647d6ceSJarod Wilson 	return err;
16117647d6ceSJarod Wilson }
16127647d6ceSJarod Wilson 
1613da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
1614da7f033dSHerbert Xu 			 u32 type, u32 mask)
1615da7f033dSHerbert Xu {
1616da7f033dSHerbert Xu 	struct crypto_aead *tfm;
1617da7f033dSHerbert Xu 	int err = 0;
1618da7f033dSHerbert Xu 
1619eed93e0cSHerbert Xu 	tfm = crypto_alloc_aead(driver, type, mask);
1620da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1621da7f033dSHerbert Xu 		printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
1622da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1623da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1624da7f033dSHerbert Xu 	}
1625da7f033dSHerbert Xu 
1626da7f033dSHerbert Xu 	if (desc->suite.aead.enc.vecs) {
1627da7f033dSHerbert Xu 		err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
1628da7f033dSHerbert Xu 				desc->suite.aead.enc.count);
1629da7f033dSHerbert Xu 		if (err)
1630da7f033dSHerbert Xu 			goto out;
1631da7f033dSHerbert Xu 	}
1632da7f033dSHerbert Xu 
1633da7f033dSHerbert Xu 	if (!err && desc->suite.aead.dec.vecs)
1634da7f033dSHerbert Xu 		err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
1635da7f033dSHerbert Xu 				desc->suite.aead.dec.count);
1636da7f033dSHerbert Xu 
1637da7f033dSHerbert Xu out:
1638da7f033dSHerbert Xu 	crypto_free_aead(tfm);
1639da7f033dSHerbert Xu 	return err;
1640da7f033dSHerbert Xu }
1641da7f033dSHerbert Xu 
1642da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc,
1643da7f033dSHerbert Xu 			   const char *driver, u32 type, u32 mask)
1644da7f033dSHerbert Xu {
16451aa4ecd9SHerbert Xu 	struct crypto_cipher *tfm;
1646da7f033dSHerbert Xu 	int err = 0;
1647da7f033dSHerbert Xu 
1648eed93e0cSHerbert Xu 	tfm = crypto_alloc_cipher(driver, type, mask);
1649da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1650da7f033dSHerbert Xu 		printk(KERN_ERR "alg: cipher: Failed to load transform for "
1651da7f033dSHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
1652da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1653da7f033dSHerbert Xu 	}
1654da7f033dSHerbert Xu 
1655da7f033dSHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
1656da7f033dSHerbert Xu 		err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1657da7f033dSHerbert Xu 				  desc->suite.cipher.enc.count);
1658da7f033dSHerbert Xu 		if (err)
1659da7f033dSHerbert Xu 			goto out;
1660da7f033dSHerbert Xu 	}
1661da7f033dSHerbert Xu 
1662da7f033dSHerbert Xu 	if (desc->suite.cipher.dec.vecs)
1663da7f033dSHerbert Xu 		err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1664da7f033dSHerbert Xu 				  desc->suite.cipher.dec.count);
1665da7f033dSHerbert Xu 
1666da7f033dSHerbert Xu out:
16671aa4ecd9SHerbert Xu 	crypto_free_cipher(tfm);
16681aa4ecd9SHerbert Xu 	return err;
16691aa4ecd9SHerbert Xu }
16701aa4ecd9SHerbert Xu 
16711aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc,
16721aa4ecd9SHerbert Xu 			     const char *driver, u32 type, u32 mask)
16731aa4ecd9SHerbert Xu {
167412773d93SHerbert Xu 	struct crypto_skcipher *tfm;
16751aa4ecd9SHerbert Xu 	int err = 0;
16761aa4ecd9SHerbert Xu 
1677eed93e0cSHerbert Xu 	tfm = crypto_alloc_skcipher(driver, type, mask);
16781aa4ecd9SHerbert Xu 	if (IS_ERR(tfm)) {
16791aa4ecd9SHerbert Xu 		printk(KERN_ERR "alg: skcipher: Failed to load transform for "
16801aa4ecd9SHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
16811aa4ecd9SHerbert Xu 		return PTR_ERR(tfm);
16821aa4ecd9SHerbert Xu 	}
16831aa4ecd9SHerbert Xu 
16841aa4ecd9SHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
16851aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
16861aa4ecd9SHerbert Xu 				    desc->suite.cipher.enc.count);
16871aa4ecd9SHerbert Xu 		if (err)
16881aa4ecd9SHerbert Xu 			goto out;
16891aa4ecd9SHerbert Xu 	}
16901aa4ecd9SHerbert Xu 
16911aa4ecd9SHerbert Xu 	if (desc->suite.cipher.dec.vecs)
16921aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
16931aa4ecd9SHerbert Xu 				    desc->suite.cipher.dec.count);
16941aa4ecd9SHerbert Xu 
16951aa4ecd9SHerbert Xu out:
169612773d93SHerbert Xu 	crypto_free_skcipher(tfm);
1697da7f033dSHerbert Xu 	return err;
1698da7f033dSHerbert Xu }
1699da7f033dSHerbert Xu 
1700da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
1701da7f033dSHerbert Xu 			 u32 type, u32 mask)
1702da7f033dSHerbert Xu {
1703d7db7a88SGiovanni Cabiddu 	struct crypto_comp *comp;
1704d7db7a88SGiovanni Cabiddu 	struct crypto_acomp *acomp;
1705da7f033dSHerbert Xu 	int err;
1706d7db7a88SGiovanni Cabiddu 	u32 algo_type = type & CRYPTO_ALG_TYPE_ACOMPRESS_MASK;
1707da7f033dSHerbert Xu 
1708d7db7a88SGiovanni Cabiddu 	if (algo_type == CRYPTO_ALG_TYPE_ACOMPRESS) {
1709d7db7a88SGiovanni Cabiddu 		acomp = crypto_alloc_acomp(driver, type, mask);
1710d7db7a88SGiovanni Cabiddu 		if (IS_ERR(acomp)) {
1711d7db7a88SGiovanni Cabiddu 			pr_err("alg: acomp: Failed to load transform for %s: %ld\n",
1712d7db7a88SGiovanni Cabiddu 			       driver, PTR_ERR(acomp));
1713d7db7a88SGiovanni Cabiddu 			return PTR_ERR(acomp);
1714d7db7a88SGiovanni Cabiddu 		}
1715d7db7a88SGiovanni Cabiddu 		err = test_acomp(acomp, desc->suite.comp.comp.vecs,
1716d7db7a88SGiovanni Cabiddu 				 desc->suite.comp.decomp.vecs,
1717d7db7a88SGiovanni Cabiddu 				 desc->suite.comp.comp.count,
1718d7db7a88SGiovanni Cabiddu 				 desc->suite.comp.decomp.count);
1719d7db7a88SGiovanni Cabiddu 		crypto_free_acomp(acomp);
1720d7db7a88SGiovanni Cabiddu 	} else {
1721d7db7a88SGiovanni Cabiddu 		comp = crypto_alloc_comp(driver, type, mask);
1722d7db7a88SGiovanni Cabiddu 		if (IS_ERR(comp)) {
1723d7db7a88SGiovanni Cabiddu 			pr_err("alg: comp: Failed to load transform for %s: %ld\n",
1724d7db7a88SGiovanni Cabiddu 			       driver, PTR_ERR(comp));
1725d7db7a88SGiovanni Cabiddu 			return PTR_ERR(comp);
1726da7f033dSHerbert Xu 		}
1727da7f033dSHerbert Xu 
1728d7db7a88SGiovanni Cabiddu 		err = test_comp(comp, desc->suite.comp.comp.vecs,
1729da7f033dSHerbert Xu 				desc->suite.comp.decomp.vecs,
1730da7f033dSHerbert Xu 				desc->suite.comp.comp.count,
1731da7f033dSHerbert Xu 				desc->suite.comp.decomp.count);
1732da7f033dSHerbert Xu 
1733d7db7a88SGiovanni Cabiddu 		crypto_free_comp(comp);
1734d7db7a88SGiovanni Cabiddu 	}
1735da7f033dSHerbert Xu 	return err;
1736da7f033dSHerbert Xu }
1737da7f033dSHerbert Xu 
1738da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
1739da7f033dSHerbert Xu 			 u32 type, u32 mask)
1740da7f033dSHerbert Xu {
1741da7f033dSHerbert Xu 	struct crypto_ahash *tfm;
1742da7f033dSHerbert Xu 	int err;
1743da7f033dSHerbert Xu 
1744eed93e0cSHerbert Xu 	tfm = crypto_alloc_ahash(driver, type, mask);
1745da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1746da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
1747da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1748da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1749da7f033dSHerbert Xu 	}
1750da7f033dSHerbert Xu 
1751a8f1a052SDavid S. Miller 	err = test_hash(tfm, desc->suite.hash.vecs,
1752a8f1a052SDavid S. Miller 			desc->suite.hash.count, true);
1753a8f1a052SDavid S. Miller 	if (!err)
1754a8f1a052SDavid S. Miller 		err = test_hash(tfm, desc->suite.hash.vecs,
1755a8f1a052SDavid S. Miller 				desc->suite.hash.count, false);
1756da7f033dSHerbert Xu 
1757da7f033dSHerbert Xu 	crypto_free_ahash(tfm);
1758da7f033dSHerbert Xu 	return err;
1759da7f033dSHerbert Xu }
1760da7f033dSHerbert Xu 
17618e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc,
17628e3ee85eSHerbert Xu 			   const char *driver, u32 type, u32 mask)
17638e3ee85eSHerbert Xu {
17648e3ee85eSHerbert Xu 	struct crypto_shash *tfm;
17658e3ee85eSHerbert Xu 	u32 val;
17668e3ee85eSHerbert Xu 	int err;
17678e3ee85eSHerbert Xu 
17688e3ee85eSHerbert Xu 	err = alg_test_hash(desc, driver, type, mask);
17698e3ee85eSHerbert Xu 	if (err)
17708e3ee85eSHerbert Xu 		goto out;
17718e3ee85eSHerbert Xu 
1772eed93e0cSHerbert Xu 	tfm = crypto_alloc_shash(driver, type, mask);
17738e3ee85eSHerbert Xu 	if (IS_ERR(tfm)) {
17748e3ee85eSHerbert Xu 		printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
17758e3ee85eSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
17768e3ee85eSHerbert Xu 		err = PTR_ERR(tfm);
17778e3ee85eSHerbert Xu 		goto out;
17788e3ee85eSHerbert Xu 	}
17798e3ee85eSHerbert Xu 
17808e3ee85eSHerbert Xu 	do {
17814c5c3024SJan-Simon Möller 		SHASH_DESC_ON_STACK(shash, tfm);
17824c5c3024SJan-Simon Möller 		u32 *ctx = (u32 *)shash_desc_ctx(shash);
17838e3ee85eSHerbert Xu 
17844c5c3024SJan-Simon Möller 		shash->tfm = tfm;
17854c5c3024SJan-Simon Möller 		shash->flags = 0;
17868e3ee85eSHerbert Xu 
17874c5c3024SJan-Simon Möller 		*ctx = le32_to_cpu(420553207);
17884c5c3024SJan-Simon Möller 		err = crypto_shash_final(shash, (u8 *)&val);
17898e3ee85eSHerbert Xu 		if (err) {
17908e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Operation failed for "
17918e3ee85eSHerbert Xu 			       "%s: %d\n", driver, err);
17928e3ee85eSHerbert Xu 			break;
17938e3ee85eSHerbert Xu 		}
17948e3ee85eSHerbert Xu 
17958e3ee85eSHerbert Xu 		if (val != ~420553207) {
17968e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Test failed for %s: "
17978e3ee85eSHerbert Xu 			       "%d\n", driver, val);
17988e3ee85eSHerbert Xu 			err = -EINVAL;
17998e3ee85eSHerbert Xu 		}
18008e3ee85eSHerbert Xu 	} while (0);
18018e3ee85eSHerbert Xu 
18028e3ee85eSHerbert Xu 	crypto_free_shash(tfm);
18038e3ee85eSHerbert Xu 
18048e3ee85eSHerbert Xu out:
18058e3ee85eSHerbert Xu 	return err;
18068e3ee85eSHerbert Xu }
18078e3ee85eSHerbert Xu 
18087647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
18097647d6ceSJarod Wilson 			  u32 type, u32 mask)
18107647d6ceSJarod Wilson {
18117647d6ceSJarod Wilson 	struct crypto_rng *rng;
18127647d6ceSJarod Wilson 	int err;
18137647d6ceSJarod Wilson 
1814eed93e0cSHerbert Xu 	rng = crypto_alloc_rng(driver, type, mask);
18157647d6ceSJarod Wilson 	if (IS_ERR(rng)) {
18167647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
18177647d6ceSJarod Wilson 		       "%ld\n", driver, PTR_ERR(rng));
18187647d6ceSJarod Wilson 		return PTR_ERR(rng);
18197647d6ceSJarod Wilson 	}
18207647d6ceSJarod Wilson 
18217647d6ceSJarod Wilson 	err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count);
18227647d6ceSJarod Wilson 
18237647d6ceSJarod Wilson 	crypto_free_rng(rng);
18247647d6ceSJarod Wilson 
18257647d6ceSJarod Wilson 	return err;
18267647d6ceSJarod Wilson }
18277647d6ceSJarod Wilson 
182864d1cdfbSStephan Mueller 
1829b13b1e0cSEric Biggers static int drbg_cavs_test(const struct drbg_testvec *test, int pr,
183064d1cdfbSStephan Mueller 			  const char *driver, u32 type, u32 mask)
183164d1cdfbSStephan Mueller {
183264d1cdfbSStephan Mueller 	int ret = -EAGAIN;
183364d1cdfbSStephan Mueller 	struct crypto_rng *drng;
183464d1cdfbSStephan Mueller 	struct drbg_test_data test_data;
183564d1cdfbSStephan Mueller 	struct drbg_string addtl, pers, testentropy;
183664d1cdfbSStephan Mueller 	unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL);
183764d1cdfbSStephan Mueller 
183864d1cdfbSStephan Mueller 	if (!buf)
183964d1cdfbSStephan Mueller 		return -ENOMEM;
184064d1cdfbSStephan Mueller 
1841eed93e0cSHerbert Xu 	drng = crypto_alloc_rng(driver, type, mask);
184264d1cdfbSStephan Mueller 	if (IS_ERR(drng)) {
184364d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for "
184464d1cdfbSStephan Mueller 		       "%s\n", driver);
184564d1cdfbSStephan Mueller 		kzfree(buf);
184664d1cdfbSStephan Mueller 		return -ENOMEM;
184764d1cdfbSStephan Mueller 	}
184864d1cdfbSStephan Mueller 
184964d1cdfbSStephan Mueller 	test_data.testentropy = &testentropy;
185064d1cdfbSStephan Mueller 	drbg_string_fill(&testentropy, test->entropy, test->entropylen);
185164d1cdfbSStephan Mueller 	drbg_string_fill(&pers, test->pers, test->perslen);
185264d1cdfbSStephan Mueller 	ret = crypto_drbg_reset_test(drng, &pers, &test_data);
185364d1cdfbSStephan Mueller 	if (ret) {
185464d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: Failed to reset rng\n");
185564d1cdfbSStephan Mueller 		goto outbuf;
185664d1cdfbSStephan Mueller 	}
185764d1cdfbSStephan Mueller 
185864d1cdfbSStephan Mueller 	drbg_string_fill(&addtl, test->addtla, test->addtllen);
185964d1cdfbSStephan Mueller 	if (pr) {
186064d1cdfbSStephan Mueller 		drbg_string_fill(&testentropy, test->entpra, test->entprlen);
186164d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl_test(drng,
186264d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl,	&test_data);
186364d1cdfbSStephan Mueller 	} else {
186464d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl(drng,
186564d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl);
186664d1cdfbSStephan Mueller 	}
186719e60e13SStephan Mueller 	if (ret < 0) {
186864d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not obtain random data for "
186964d1cdfbSStephan Mueller 		       "driver %s\n", driver);
187064d1cdfbSStephan Mueller 		goto outbuf;
187164d1cdfbSStephan Mueller 	}
187264d1cdfbSStephan Mueller 
187364d1cdfbSStephan Mueller 	drbg_string_fill(&addtl, test->addtlb, test->addtllen);
187464d1cdfbSStephan Mueller 	if (pr) {
187564d1cdfbSStephan Mueller 		drbg_string_fill(&testentropy, test->entprb, test->entprlen);
187664d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl_test(drng,
187764d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl, &test_data);
187864d1cdfbSStephan Mueller 	} else {
187964d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl(drng,
188064d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl);
188164d1cdfbSStephan Mueller 	}
188219e60e13SStephan Mueller 	if (ret < 0) {
188364d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not obtain random data for "
188464d1cdfbSStephan Mueller 		       "driver %s\n", driver);
188564d1cdfbSStephan Mueller 		goto outbuf;
188664d1cdfbSStephan Mueller 	}
188764d1cdfbSStephan Mueller 
188864d1cdfbSStephan Mueller 	ret = memcmp(test->expected, buf, test->expectedlen);
188964d1cdfbSStephan Mueller 
189064d1cdfbSStephan Mueller outbuf:
189164d1cdfbSStephan Mueller 	crypto_free_rng(drng);
189264d1cdfbSStephan Mueller 	kzfree(buf);
189364d1cdfbSStephan Mueller 	return ret;
189464d1cdfbSStephan Mueller }
189564d1cdfbSStephan Mueller 
189664d1cdfbSStephan Mueller 
189764d1cdfbSStephan Mueller static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver,
189864d1cdfbSStephan Mueller 			 u32 type, u32 mask)
189964d1cdfbSStephan Mueller {
190064d1cdfbSStephan Mueller 	int err = 0;
190164d1cdfbSStephan Mueller 	int pr = 0;
190264d1cdfbSStephan Mueller 	int i = 0;
1903b13b1e0cSEric Biggers 	const struct drbg_testvec *template = desc->suite.drbg.vecs;
190464d1cdfbSStephan Mueller 	unsigned int tcount = desc->suite.drbg.count;
190564d1cdfbSStephan Mueller 
190664d1cdfbSStephan Mueller 	if (0 == memcmp(driver, "drbg_pr_", 8))
190764d1cdfbSStephan Mueller 		pr = 1;
190864d1cdfbSStephan Mueller 
190964d1cdfbSStephan Mueller 	for (i = 0; i < tcount; i++) {
191064d1cdfbSStephan Mueller 		err = drbg_cavs_test(&template[i], pr, driver, type, mask);
191164d1cdfbSStephan Mueller 		if (err) {
191264d1cdfbSStephan Mueller 			printk(KERN_ERR "alg: drbg: Test %d failed for %s\n",
191364d1cdfbSStephan Mueller 			       i, driver);
191464d1cdfbSStephan Mueller 			err = -EINVAL;
191564d1cdfbSStephan Mueller 			break;
191664d1cdfbSStephan Mueller 		}
191764d1cdfbSStephan Mueller 	}
191864d1cdfbSStephan Mueller 	return err;
191964d1cdfbSStephan Mueller 
192064d1cdfbSStephan Mueller }
192164d1cdfbSStephan Mueller 
1922b13b1e0cSEric Biggers static int do_test_kpp(struct crypto_kpp *tfm, const struct kpp_testvec *vec,
1923802c7f1cSSalvatore Benedetto 		       const char *alg)
1924802c7f1cSSalvatore Benedetto {
1925802c7f1cSSalvatore Benedetto 	struct kpp_request *req;
1926802c7f1cSSalvatore Benedetto 	void *input_buf = NULL;
1927802c7f1cSSalvatore Benedetto 	void *output_buf = NULL;
192847d3fd39STudor-Dan Ambarus 	void *a_public = NULL;
192947d3fd39STudor-Dan Ambarus 	void *a_ss = NULL;
193047d3fd39STudor-Dan Ambarus 	void *shared_secret = NULL;
19317f397136SGilad Ben-Yossef 	struct crypto_wait wait;
1932802c7f1cSSalvatore Benedetto 	unsigned int out_len_max;
1933802c7f1cSSalvatore Benedetto 	int err = -ENOMEM;
1934802c7f1cSSalvatore Benedetto 	struct scatterlist src, dst;
1935802c7f1cSSalvatore Benedetto 
1936802c7f1cSSalvatore Benedetto 	req = kpp_request_alloc(tfm, GFP_KERNEL);
1937802c7f1cSSalvatore Benedetto 	if (!req)
1938802c7f1cSSalvatore Benedetto 		return err;
1939802c7f1cSSalvatore Benedetto 
19407f397136SGilad Ben-Yossef 	crypto_init_wait(&wait);
1941802c7f1cSSalvatore Benedetto 
1942802c7f1cSSalvatore Benedetto 	err = crypto_kpp_set_secret(tfm, vec->secret, vec->secret_size);
1943802c7f1cSSalvatore Benedetto 	if (err < 0)
1944802c7f1cSSalvatore Benedetto 		goto free_req;
1945802c7f1cSSalvatore Benedetto 
1946802c7f1cSSalvatore Benedetto 	out_len_max = crypto_kpp_maxsize(tfm);
1947802c7f1cSSalvatore Benedetto 	output_buf = kzalloc(out_len_max, GFP_KERNEL);
1948802c7f1cSSalvatore Benedetto 	if (!output_buf) {
1949802c7f1cSSalvatore Benedetto 		err = -ENOMEM;
1950802c7f1cSSalvatore Benedetto 		goto free_req;
1951802c7f1cSSalvatore Benedetto 	}
1952802c7f1cSSalvatore Benedetto 
1953802c7f1cSSalvatore Benedetto 	/* Use appropriate parameter as base */
1954802c7f1cSSalvatore Benedetto 	kpp_request_set_input(req, NULL, 0);
1955802c7f1cSSalvatore Benedetto 	sg_init_one(&dst, output_buf, out_len_max);
1956802c7f1cSSalvatore Benedetto 	kpp_request_set_output(req, &dst, out_len_max);
1957802c7f1cSSalvatore Benedetto 	kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
19587f397136SGilad Ben-Yossef 				 crypto_req_done, &wait);
1959802c7f1cSSalvatore Benedetto 
196047d3fd39STudor-Dan Ambarus 	/* Compute party A's public key */
19617f397136SGilad Ben-Yossef 	err = crypto_wait_req(crypto_kpp_generate_public_key(req), &wait);
1962802c7f1cSSalvatore Benedetto 	if (err) {
196347d3fd39STudor-Dan Ambarus 		pr_err("alg: %s: Party A: generate public key test failed. err %d\n",
1964802c7f1cSSalvatore Benedetto 		       alg, err);
1965802c7f1cSSalvatore Benedetto 		goto free_output;
1966802c7f1cSSalvatore Benedetto 	}
196747d3fd39STudor-Dan Ambarus 
196847d3fd39STudor-Dan Ambarus 	if (vec->genkey) {
196947d3fd39STudor-Dan Ambarus 		/* Save party A's public key */
197047d3fd39STudor-Dan Ambarus 		a_public = kzalloc(out_len_max, GFP_KERNEL);
197147d3fd39STudor-Dan Ambarus 		if (!a_public) {
197247d3fd39STudor-Dan Ambarus 			err = -ENOMEM;
197347d3fd39STudor-Dan Ambarus 			goto free_output;
197447d3fd39STudor-Dan Ambarus 		}
197547d3fd39STudor-Dan Ambarus 		memcpy(a_public, sg_virt(req->dst), out_len_max);
197647d3fd39STudor-Dan Ambarus 	} else {
1977802c7f1cSSalvatore Benedetto 		/* Verify calculated public key */
1978802c7f1cSSalvatore Benedetto 		if (memcmp(vec->expected_a_public, sg_virt(req->dst),
1979802c7f1cSSalvatore Benedetto 			   vec->expected_a_public_size)) {
198047d3fd39STudor-Dan Ambarus 			pr_err("alg: %s: Party A: generate public key test failed. Invalid output\n",
1981802c7f1cSSalvatore Benedetto 			       alg);
1982802c7f1cSSalvatore Benedetto 			err = -EINVAL;
1983802c7f1cSSalvatore Benedetto 			goto free_output;
1984802c7f1cSSalvatore Benedetto 		}
198547d3fd39STudor-Dan Ambarus 	}
1986802c7f1cSSalvatore Benedetto 
1987802c7f1cSSalvatore Benedetto 	/* Calculate shared secret key by using counter part (b) public key. */
1988802c7f1cSSalvatore Benedetto 	input_buf = kzalloc(vec->b_public_size, GFP_KERNEL);
1989802c7f1cSSalvatore Benedetto 	if (!input_buf) {
1990802c7f1cSSalvatore Benedetto 		err = -ENOMEM;
1991802c7f1cSSalvatore Benedetto 		goto free_output;
1992802c7f1cSSalvatore Benedetto 	}
1993802c7f1cSSalvatore Benedetto 
1994802c7f1cSSalvatore Benedetto 	memcpy(input_buf, vec->b_public, vec->b_public_size);
1995802c7f1cSSalvatore Benedetto 	sg_init_one(&src, input_buf, vec->b_public_size);
1996802c7f1cSSalvatore Benedetto 	sg_init_one(&dst, output_buf, out_len_max);
1997802c7f1cSSalvatore Benedetto 	kpp_request_set_input(req, &src, vec->b_public_size);
1998802c7f1cSSalvatore Benedetto 	kpp_request_set_output(req, &dst, out_len_max);
1999802c7f1cSSalvatore Benedetto 	kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
20007f397136SGilad Ben-Yossef 				 crypto_req_done, &wait);
20017f397136SGilad Ben-Yossef 	err = crypto_wait_req(crypto_kpp_compute_shared_secret(req), &wait);
2002802c7f1cSSalvatore Benedetto 	if (err) {
200347d3fd39STudor-Dan Ambarus 		pr_err("alg: %s: Party A: compute shared secret test failed. err %d\n",
2004802c7f1cSSalvatore Benedetto 		       alg, err);
2005802c7f1cSSalvatore Benedetto 		goto free_all;
2006802c7f1cSSalvatore Benedetto 	}
200747d3fd39STudor-Dan Ambarus 
200847d3fd39STudor-Dan Ambarus 	if (vec->genkey) {
200947d3fd39STudor-Dan Ambarus 		/* Save the shared secret obtained by party A */
201047d3fd39STudor-Dan Ambarus 		a_ss = kzalloc(vec->expected_ss_size, GFP_KERNEL);
201147d3fd39STudor-Dan Ambarus 		if (!a_ss) {
201247d3fd39STudor-Dan Ambarus 			err = -ENOMEM;
201347d3fd39STudor-Dan Ambarus 			goto free_all;
201447d3fd39STudor-Dan Ambarus 		}
201547d3fd39STudor-Dan Ambarus 		memcpy(a_ss, sg_virt(req->dst), vec->expected_ss_size);
201647d3fd39STudor-Dan Ambarus 
201747d3fd39STudor-Dan Ambarus 		/*
201847d3fd39STudor-Dan Ambarus 		 * Calculate party B's shared secret by using party A's
201947d3fd39STudor-Dan Ambarus 		 * public key.
202047d3fd39STudor-Dan Ambarus 		 */
202147d3fd39STudor-Dan Ambarus 		err = crypto_kpp_set_secret(tfm, vec->b_secret,
202247d3fd39STudor-Dan Ambarus 					    vec->b_secret_size);
202347d3fd39STudor-Dan Ambarus 		if (err < 0)
202447d3fd39STudor-Dan Ambarus 			goto free_all;
202547d3fd39STudor-Dan Ambarus 
202647d3fd39STudor-Dan Ambarus 		sg_init_one(&src, a_public, vec->expected_a_public_size);
202747d3fd39STudor-Dan Ambarus 		sg_init_one(&dst, output_buf, out_len_max);
202847d3fd39STudor-Dan Ambarus 		kpp_request_set_input(req, &src, vec->expected_a_public_size);
202947d3fd39STudor-Dan Ambarus 		kpp_request_set_output(req, &dst, out_len_max);
203047d3fd39STudor-Dan Ambarus 		kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
20317f397136SGilad Ben-Yossef 					 crypto_req_done, &wait);
20327f397136SGilad Ben-Yossef 		err = crypto_wait_req(crypto_kpp_compute_shared_secret(req),
20337f397136SGilad Ben-Yossef 				      &wait);
203447d3fd39STudor-Dan Ambarus 		if (err) {
203547d3fd39STudor-Dan Ambarus 			pr_err("alg: %s: Party B: compute shared secret failed. err %d\n",
203647d3fd39STudor-Dan Ambarus 			       alg, err);
203747d3fd39STudor-Dan Ambarus 			goto free_all;
203847d3fd39STudor-Dan Ambarus 		}
203947d3fd39STudor-Dan Ambarus 
204047d3fd39STudor-Dan Ambarus 		shared_secret = a_ss;
204147d3fd39STudor-Dan Ambarus 	} else {
204247d3fd39STudor-Dan Ambarus 		shared_secret = (void *)vec->expected_ss;
204347d3fd39STudor-Dan Ambarus 	}
204447d3fd39STudor-Dan Ambarus 
2045802c7f1cSSalvatore Benedetto 	/*
2046802c7f1cSSalvatore Benedetto 	 * verify shared secret from which the user will derive
2047802c7f1cSSalvatore Benedetto 	 * secret key by executing whatever hash it has chosen
2048802c7f1cSSalvatore Benedetto 	 */
204947d3fd39STudor-Dan Ambarus 	if (memcmp(shared_secret, sg_virt(req->dst),
2050802c7f1cSSalvatore Benedetto 		   vec->expected_ss_size)) {
2051802c7f1cSSalvatore Benedetto 		pr_err("alg: %s: compute shared secret test failed. Invalid output\n",
2052802c7f1cSSalvatore Benedetto 		       alg);
2053802c7f1cSSalvatore Benedetto 		err = -EINVAL;
2054802c7f1cSSalvatore Benedetto 	}
2055802c7f1cSSalvatore Benedetto 
2056802c7f1cSSalvatore Benedetto free_all:
205747d3fd39STudor-Dan Ambarus 	kfree(a_ss);
2058802c7f1cSSalvatore Benedetto 	kfree(input_buf);
2059802c7f1cSSalvatore Benedetto free_output:
206047d3fd39STudor-Dan Ambarus 	kfree(a_public);
2061802c7f1cSSalvatore Benedetto 	kfree(output_buf);
2062802c7f1cSSalvatore Benedetto free_req:
2063802c7f1cSSalvatore Benedetto 	kpp_request_free(req);
2064802c7f1cSSalvatore Benedetto 	return err;
2065802c7f1cSSalvatore Benedetto }
2066802c7f1cSSalvatore Benedetto 
2067802c7f1cSSalvatore Benedetto static int test_kpp(struct crypto_kpp *tfm, const char *alg,
2068b13b1e0cSEric Biggers 		    const struct kpp_testvec *vecs, unsigned int tcount)
2069802c7f1cSSalvatore Benedetto {
2070802c7f1cSSalvatore Benedetto 	int ret, i;
2071802c7f1cSSalvatore Benedetto 
2072802c7f1cSSalvatore Benedetto 	for (i = 0; i < tcount; i++) {
2073802c7f1cSSalvatore Benedetto 		ret = do_test_kpp(tfm, vecs++, alg);
2074802c7f1cSSalvatore Benedetto 		if (ret) {
2075802c7f1cSSalvatore Benedetto 			pr_err("alg: %s: test failed on vector %d, err=%d\n",
2076802c7f1cSSalvatore Benedetto 			       alg, i + 1, ret);
2077802c7f1cSSalvatore Benedetto 			return ret;
2078802c7f1cSSalvatore Benedetto 		}
2079802c7f1cSSalvatore Benedetto 	}
2080802c7f1cSSalvatore Benedetto 	return 0;
2081802c7f1cSSalvatore Benedetto }
2082802c7f1cSSalvatore Benedetto 
2083802c7f1cSSalvatore Benedetto static int alg_test_kpp(const struct alg_test_desc *desc, const char *driver,
2084802c7f1cSSalvatore Benedetto 			u32 type, u32 mask)
2085802c7f1cSSalvatore Benedetto {
2086802c7f1cSSalvatore Benedetto 	struct crypto_kpp *tfm;
2087802c7f1cSSalvatore Benedetto 	int err = 0;
2088802c7f1cSSalvatore Benedetto 
2089eed93e0cSHerbert Xu 	tfm = crypto_alloc_kpp(driver, type, mask);
2090802c7f1cSSalvatore Benedetto 	if (IS_ERR(tfm)) {
2091802c7f1cSSalvatore Benedetto 		pr_err("alg: kpp: Failed to load tfm for %s: %ld\n",
2092802c7f1cSSalvatore Benedetto 		       driver, PTR_ERR(tfm));
2093802c7f1cSSalvatore Benedetto 		return PTR_ERR(tfm);
2094802c7f1cSSalvatore Benedetto 	}
2095802c7f1cSSalvatore Benedetto 	if (desc->suite.kpp.vecs)
2096802c7f1cSSalvatore Benedetto 		err = test_kpp(tfm, desc->alg, desc->suite.kpp.vecs,
2097802c7f1cSSalvatore Benedetto 			       desc->suite.kpp.count);
2098802c7f1cSSalvatore Benedetto 
2099802c7f1cSSalvatore Benedetto 	crypto_free_kpp(tfm);
2100802c7f1cSSalvatore Benedetto 	return err;
2101802c7f1cSSalvatore Benedetto }
2102802c7f1cSSalvatore Benedetto 
210350d2b643SHerbert Xu static int test_akcipher_one(struct crypto_akcipher *tfm,
2104b13b1e0cSEric Biggers 			     const struct akcipher_testvec *vecs)
2105946cc463STadeusz Struk {
2106df27b26fSHerbert Xu 	char *xbuf[XBUFSIZE];
2107946cc463STadeusz Struk 	struct akcipher_request *req;
2108946cc463STadeusz Struk 	void *outbuf_enc = NULL;
2109946cc463STadeusz Struk 	void *outbuf_dec = NULL;
21107f397136SGilad Ben-Yossef 	struct crypto_wait wait;
2111946cc463STadeusz Struk 	unsigned int out_len_max, out_len = 0;
2112946cc463STadeusz Struk 	int err = -ENOMEM;
211322287b0bSTadeusz Struk 	struct scatterlist src, dst, src_tab[2];
2114946cc463STadeusz Struk 
2115df27b26fSHerbert Xu 	if (testmgr_alloc_buf(xbuf))
2116df27b26fSHerbert Xu 		return err;
2117df27b26fSHerbert Xu 
2118946cc463STadeusz Struk 	req = akcipher_request_alloc(tfm, GFP_KERNEL);
2119946cc463STadeusz Struk 	if (!req)
2120df27b26fSHerbert Xu 		goto free_xbuf;
2121946cc463STadeusz Struk 
21227f397136SGilad Ben-Yossef 	crypto_init_wait(&wait);
212322287b0bSTadeusz Struk 
212422287b0bSTadeusz Struk 	if (vecs->public_key_vec)
212522287b0bSTadeusz Struk 		err = crypto_akcipher_set_pub_key(tfm, vecs->key,
212622287b0bSTadeusz Struk 						  vecs->key_len);
212722287b0bSTadeusz Struk 	else
212822287b0bSTadeusz Struk 		err = crypto_akcipher_set_priv_key(tfm, vecs->key,
212922287b0bSTadeusz Struk 						   vecs->key_len);
2130946cc463STadeusz Struk 	if (err)
2131946cc463STadeusz Struk 		goto free_req;
2132946cc463STadeusz Struk 
213357763f5eSSalvatore Benedetto 	err = -ENOMEM;
213422287b0bSTadeusz Struk 	out_len_max = crypto_akcipher_maxsize(tfm);
2135946cc463STadeusz Struk 	outbuf_enc = kzalloc(out_len_max, GFP_KERNEL);
2136946cc463STadeusz Struk 	if (!outbuf_enc)
2137946cc463STadeusz Struk 		goto free_req;
2138946cc463STadeusz Struk 
2139df27b26fSHerbert Xu 	if (WARN_ON(vecs->m_size > PAGE_SIZE))
2140df27b26fSHerbert Xu 		goto free_all;
2141df27b26fSHerbert Xu 
2142df27b26fSHerbert Xu 	memcpy(xbuf[0], vecs->m, vecs->m_size);
2143df27b26fSHerbert Xu 
214422287b0bSTadeusz Struk 	sg_init_table(src_tab, 2);
2145df27b26fSHerbert Xu 	sg_set_buf(&src_tab[0], xbuf[0], 8);
2146df27b26fSHerbert Xu 	sg_set_buf(&src_tab[1], xbuf[0] + 8, vecs->m_size - 8);
214722287b0bSTadeusz Struk 	sg_init_one(&dst, outbuf_enc, out_len_max);
214822287b0bSTadeusz Struk 	akcipher_request_set_crypt(req, src_tab, &dst, vecs->m_size,
214922287b0bSTadeusz Struk 				   out_len_max);
2150946cc463STadeusz Struk 	akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
21517f397136SGilad Ben-Yossef 				      crypto_req_done, &wait);
2152946cc463STadeusz Struk 
21537f397136SGilad Ben-Yossef 	err = crypto_wait_req(vecs->siggen_sigver_test ?
21541207107cSStephan Mueller 			      /* Run asymmetric signature generation */
21551207107cSStephan Mueller 			      crypto_akcipher_sign(req) :
21561207107cSStephan Mueller 			      /* Run asymmetric encrypt */
21577f397136SGilad Ben-Yossef 			      crypto_akcipher_encrypt(req), &wait);
2158946cc463STadeusz Struk 	if (err) {
215950d2b643SHerbert Xu 		pr_err("alg: akcipher: encrypt test failed. err %d\n", err);
2160946cc463STadeusz Struk 		goto free_all;
2161946cc463STadeusz Struk 	}
216222287b0bSTadeusz Struk 	if (req->dst_len != vecs->c_size) {
216350d2b643SHerbert Xu 		pr_err("alg: akcipher: encrypt test failed. Invalid output len\n");
2164946cc463STadeusz Struk 		err = -EINVAL;
2165946cc463STadeusz Struk 		goto free_all;
2166946cc463STadeusz Struk 	}
2167946cc463STadeusz Struk 	/* verify that encrypted message is equal to expected */
2168df27b26fSHerbert Xu 	if (memcmp(vecs->c, outbuf_enc, vecs->c_size)) {
216950d2b643SHerbert Xu 		pr_err("alg: akcipher: encrypt test failed. Invalid output\n");
217050d2b643SHerbert Xu 		hexdump(outbuf_enc, vecs->c_size);
2171946cc463STadeusz Struk 		err = -EINVAL;
2172946cc463STadeusz Struk 		goto free_all;
2173946cc463STadeusz Struk 	}
2174946cc463STadeusz Struk 	/* Don't invoke decrypt for vectors with public key */
2175946cc463STadeusz Struk 	if (vecs->public_key_vec) {
2176946cc463STadeusz Struk 		err = 0;
2177946cc463STadeusz Struk 		goto free_all;
2178946cc463STadeusz Struk 	}
2179946cc463STadeusz Struk 	outbuf_dec = kzalloc(out_len_max, GFP_KERNEL);
2180946cc463STadeusz Struk 	if (!outbuf_dec) {
2181946cc463STadeusz Struk 		err = -ENOMEM;
2182946cc463STadeusz Struk 		goto free_all;
2183946cc463STadeusz Struk 	}
2184df27b26fSHerbert Xu 
2185df27b26fSHerbert Xu 	if (WARN_ON(vecs->c_size > PAGE_SIZE))
2186df27b26fSHerbert Xu 		goto free_all;
2187df27b26fSHerbert Xu 
2188df27b26fSHerbert Xu 	memcpy(xbuf[0], vecs->c, vecs->c_size);
2189df27b26fSHerbert Xu 
2190df27b26fSHerbert Xu 	sg_init_one(&src, xbuf[0], vecs->c_size);
219122287b0bSTadeusz Struk 	sg_init_one(&dst, outbuf_dec, out_len_max);
21927f397136SGilad Ben-Yossef 	crypto_init_wait(&wait);
219322287b0bSTadeusz Struk 	akcipher_request_set_crypt(req, &src, &dst, vecs->c_size, out_len_max);
2194946cc463STadeusz Struk 
21957f397136SGilad Ben-Yossef 	err = crypto_wait_req(vecs->siggen_sigver_test ?
21961207107cSStephan Mueller 			      /* Run asymmetric signature verification */
21971207107cSStephan Mueller 			      crypto_akcipher_verify(req) :
21981207107cSStephan Mueller 			      /* Run asymmetric decrypt */
21997f397136SGilad Ben-Yossef 			      crypto_akcipher_decrypt(req), &wait);
2200946cc463STadeusz Struk 	if (err) {
220150d2b643SHerbert Xu 		pr_err("alg: akcipher: decrypt test failed. err %d\n", err);
2202946cc463STadeusz Struk 		goto free_all;
2203946cc463STadeusz Struk 	}
2204946cc463STadeusz Struk 	out_len = req->dst_len;
220550d2b643SHerbert Xu 	if (out_len < vecs->m_size) {
220650d2b643SHerbert Xu 		pr_err("alg: akcipher: decrypt test failed. "
220750d2b643SHerbert Xu 		       "Invalid output len %u\n", out_len);
2208946cc463STadeusz Struk 		err = -EINVAL;
2209946cc463STadeusz Struk 		goto free_all;
2210946cc463STadeusz Struk 	}
2211946cc463STadeusz Struk 	/* verify that decrypted message is equal to the original msg */
221250d2b643SHerbert Xu 	if (memchr_inv(outbuf_dec, 0, out_len - vecs->m_size) ||
221350d2b643SHerbert Xu 	    memcmp(vecs->m, outbuf_dec + out_len - vecs->m_size,
221450d2b643SHerbert Xu 		   vecs->m_size)) {
221550d2b643SHerbert Xu 		pr_err("alg: akcipher: decrypt test failed. Invalid output\n");
221650d2b643SHerbert Xu 		hexdump(outbuf_dec, out_len);
2217946cc463STadeusz Struk 		err = -EINVAL;
2218946cc463STadeusz Struk 	}
2219946cc463STadeusz Struk free_all:
2220946cc463STadeusz Struk 	kfree(outbuf_dec);
2221946cc463STadeusz Struk 	kfree(outbuf_enc);
2222946cc463STadeusz Struk free_req:
2223946cc463STadeusz Struk 	akcipher_request_free(req);
2224df27b26fSHerbert Xu free_xbuf:
2225df27b26fSHerbert Xu 	testmgr_free_buf(xbuf);
2226946cc463STadeusz Struk 	return err;
2227946cc463STadeusz Struk }
2228946cc463STadeusz Struk 
222950d2b643SHerbert Xu static int test_akcipher(struct crypto_akcipher *tfm, const char *alg,
2230b13b1e0cSEric Biggers 			 const struct akcipher_testvec *vecs,
2231b13b1e0cSEric Biggers 			 unsigned int tcount)
2232946cc463STadeusz Struk {
223315226e48SHerbert Xu 	const char *algo =
223415226e48SHerbert Xu 		crypto_tfm_alg_driver_name(crypto_akcipher_tfm(tfm));
2235946cc463STadeusz Struk 	int ret, i;
2236946cc463STadeusz Struk 
2237946cc463STadeusz Struk 	for (i = 0; i < tcount; i++) {
223850d2b643SHerbert Xu 		ret = test_akcipher_one(tfm, vecs++);
223950d2b643SHerbert Xu 		if (!ret)
224050d2b643SHerbert Xu 			continue;
224150d2b643SHerbert Xu 
224215226e48SHerbert Xu 		pr_err("alg: akcipher: test %d failed for %s, err=%d\n",
224315226e48SHerbert Xu 		       i + 1, algo, ret);
2244946cc463STadeusz Struk 		return ret;
2245946cc463STadeusz Struk 	}
2246946cc463STadeusz Struk 	return 0;
2247946cc463STadeusz Struk }
2248946cc463STadeusz Struk 
2249946cc463STadeusz Struk static int alg_test_akcipher(const struct alg_test_desc *desc,
2250946cc463STadeusz Struk 			     const char *driver, u32 type, u32 mask)
2251946cc463STadeusz Struk {
2252946cc463STadeusz Struk 	struct crypto_akcipher *tfm;
2253946cc463STadeusz Struk 	int err = 0;
2254946cc463STadeusz Struk 
2255eed93e0cSHerbert Xu 	tfm = crypto_alloc_akcipher(driver, type, mask);
2256946cc463STadeusz Struk 	if (IS_ERR(tfm)) {
2257946cc463STadeusz Struk 		pr_err("alg: akcipher: Failed to load tfm for %s: %ld\n",
2258946cc463STadeusz Struk 		       driver, PTR_ERR(tfm));
2259946cc463STadeusz Struk 		return PTR_ERR(tfm);
2260946cc463STadeusz Struk 	}
2261946cc463STadeusz Struk 	if (desc->suite.akcipher.vecs)
2262946cc463STadeusz Struk 		err = test_akcipher(tfm, desc->alg, desc->suite.akcipher.vecs,
2263946cc463STadeusz Struk 				    desc->suite.akcipher.count);
2264946cc463STadeusz Struk 
2265946cc463STadeusz Struk 	crypto_free_akcipher(tfm);
2266946cc463STadeusz Struk 	return err;
2267946cc463STadeusz Struk }
2268946cc463STadeusz Struk 
2269863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc,
2270863b557aSYouquan, Song 			     const char *driver, u32 type, u32 mask)
2271863b557aSYouquan, Song {
2272863b557aSYouquan, Song 	return 0;
2273863b557aSYouquan, Song }
2274863b557aSYouquan, Song 
227521c8e720SArd Biesheuvel #define __VECS(tv)	{ .vecs = tv, .count = ARRAY_SIZE(tv) }
227621c8e720SArd Biesheuvel 
2277da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */
2278da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = {
2279da7f033dSHerbert Xu 	{
2280e08ca2daSJarod Wilson 		.alg = "ansi_cprng",
2281e08ca2daSJarod Wilson 		.test = alg_test_cprng,
2282e08ca2daSJarod Wilson 		.suite = {
228321c8e720SArd Biesheuvel 			.cprng = __VECS(ansi_cprng_aes_tv_template)
2284e08ca2daSJarod Wilson 		}
2285e08ca2daSJarod Wilson 	}, {
2286bca4feb0SHoria Geanta 		.alg = "authenc(hmac(md5),ecb(cipher_null))",
2287bca4feb0SHoria Geanta 		.test = alg_test_aead,
2288bca4feb0SHoria Geanta 		.suite = {
2289bca4feb0SHoria Geanta 			.aead = {
229021c8e720SArd Biesheuvel 				.enc = __VECS(hmac_md5_ecb_cipher_null_enc_tv_template),
229121c8e720SArd Biesheuvel 				.dec = __VECS(hmac_md5_ecb_cipher_null_dec_tv_template)
2292bca4feb0SHoria Geanta 			}
2293bca4feb0SHoria Geanta 		}
2294bca4feb0SHoria Geanta 	}, {
2295a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha1),cbc(aes))",
2296e46e9a46SHoria Geanta 		.test = alg_test_aead,
2297bcf741cbSHerbert Xu 		.fips_allowed = 1,
2298e46e9a46SHoria Geanta 		.suite = {
2299e46e9a46SHoria Geanta 			.aead = {
230021c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha1_aes_cbc_enc_tv_temp)
23015208ed2cSNitesh Lal 			}
23025208ed2cSNitesh Lal 		}
23035208ed2cSNitesh Lal 	}, {
2304a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha1),cbc(des))",
23055208ed2cSNitesh Lal 		.test = alg_test_aead,
23065208ed2cSNitesh Lal 		.suite = {
23075208ed2cSNitesh Lal 			.aead = {
230821c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha1_des_cbc_enc_tv_temp)
23095208ed2cSNitesh Lal 			}
23105208ed2cSNitesh Lal 		}
23115208ed2cSNitesh Lal 	}, {
2312a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha1),cbc(des3_ede))",
23135208ed2cSNitesh Lal 		.test = alg_test_aead,
2314ed1afac9SMarcus Meissner 		.fips_allowed = 1,
23155208ed2cSNitesh Lal 		.suite = {
23165208ed2cSNitesh Lal 			.aead = {
231721c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha1_des3_ede_cbc_enc_tv_temp)
2318e46e9a46SHoria Geanta 			}
2319e46e9a46SHoria Geanta 		}
2320e46e9a46SHoria Geanta 	}, {
2321fb16abc2SMarcus Meissner 		.alg = "authenc(hmac(sha1),ctr(aes))",
2322fb16abc2SMarcus Meissner 		.test = alg_test_null,
2323fb16abc2SMarcus Meissner 		.fips_allowed = 1,
2324fb16abc2SMarcus Meissner 	}, {
2325bca4feb0SHoria Geanta 		.alg = "authenc(hmac(sha1),ecb(cipher_null))",
2326bca4feb0SHoria Geanta 		.test = alg_test_aead,
2327bca4feb0SHoria Geanta 		.suite = {
2328bca4feb0SHoria Geanta 			.aead = {
232921c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha1_ecb_cipher_null_enc_tv_temp),
233021c8e720SArd Biesheuvel 				.dec = __VECS(hmac_sha1_ecb_cipher_null_dec_tv_temp)
23315208ed2cSNitesh Lal 			}
23325208ed2cSNitesh Lal 		}
23335208ed2cSNitesh Lal 	}, {
23348888690eSMarcus Meissner 		.alg = "authenc(hmac(sha1),rfc3686(ctr(aes)))",
23358888690eSMarcus Meissner 		.test = alg_test_null,
23368888690eSMarcus Meissner 		.fips_allowed = 1,
23378888690eSMarcus Meissner 	}, {
2338a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha224),cbc(des))",
23395208ed2cSNitesh Lal 		.test = alg_test_aead,
23405208ed2cSNitesh Lal 		.suite = {
23415208ed2cSNitesh Lal 			.aead = {
234221c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha224_des_cbc_enc_tv_temp)
23435208ed2cSNitesh Lal 			}
23445208ed2cSNitesh Lal 		}
23455208ed2cSNitesh Lal 	}, {
2346a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha224),cbc(des3_ede))",
23475208ed2cSNitesh Lal 		.test = alg_test_aead,
2348ed1afac9SMarcus Meissner 		.fips_allowed = 1,
23495208ed2cSNitesh Lal 		.suite = {
23505208ed2cSNitesh Lal 			.aead = {
235121c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha224_des3_ede_cbc_enc_tv_temp)
2352bca4feb0SHoria Geanta 			}
2353bca4feb0SHoria Geanta 		}
2354bca4feb0SHoria Geanta 	}, {
2355a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha256),cbc(aes))",
2356e46e9a46SHoria Geanta 		.test = alg_test_aead,
2357ed1afac9SMarcus Meissner 		.fips_allowed = 1,
2358e46e9a46SHoria Geanta 		.suite = {
2359e46e9a46SHoria Geanta 			.aead = {
236021c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha256_aes_cbc_enc_tv_temp)
23615208ed2cSNitesh Lal 			}
23625208ed2cSNitesh Lal 		}
23635208ed2cSNitesh Lal 	}, {
2364a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha256),cbc(des))",
23655208ed2cSNitesh Lal 		.test = alg_test_aead,
23665208ed2cSNitesh Lal 		.suite = {
23675208ed2cSNitesh Lal 			.aead = {
236821c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha256_des_cbc_enc_tv_temp)
23695208ed2cSNitesh Lal 			}
23705208ed2cSNitesh Lal 		}
23715208ed2cSNitesh Lal 	}, {
2372a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha256),cbc(des3_ede))",
23735208ed2cSNitesh Lal 		.test = alg_test_aead,
2374ed1afac9SMarcus Meissner 		.fips_allowed = 1,
23755208ed2cSNitesh Lal 		.suite = {
23765208ed2cSNitesh Lal 			.aead = {
237721c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha256_des3_ede_cbc_enc_tv_temp)
23785208ed2cSNitesh Lal 			}
23795208ed2cSNitesh Lal 		}
23805208ed2cSNitesh Lal 	}, {
2381fb16abc2SMarcus Meissner 		.alg = "authenc(hmac(sha256),ctr(aes))",
2382fb16abc2SMarcus Meissner 		.test = alg_test_null,
2383fb16abc2SMarcus Meissner 		.fips_allowed = 1,
2384fb16abc2SMarcus Meissner 	}, {
23858888690eSMarcus Meissner 		.alg = "authenc(hmac(sha256),rfc3686(ctr(aes)))",
23868888690eSMarcus Meissner 		.test = alg_test_null,
23878888690eSMarcus Meissner 		.fips_allowed = 1,
23888888690eSMarcus Meissner 	}, {
2389a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha384),cbc(des))",
23905208ed2cSNitesh Lal 		.test = alg_test_aead,
23915208ed2cSNitesh Lal 		.suite = {
23925208ed2cSNitesh Lal 			.aead = {
239321c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha384_des_cbc_enc_tv_temp)
23945208ed2cSNitesh Lal 			}
23955208ed2cSNitesh Lal 		}
23965208ed2cSNitesh Lal 	}, {
2397a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha384),cbc(des3_ede))",
23985208ed2cSNitesh Lal 		.test = alg_test_aead,
2399ed1afac9SMarcus Meissner 		.fips_allowed = 1,
24005208ed2cSNitesh Lal 		.suite = {
24015208ed2cSNitesh Lal 			.aead = {
240221c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha384_des3_ede_cbc_enc_tv_temp)
2403e46e9a46SHoria Geanta 			}
2404e46e9a46SHoria Geanta 		}
2405e46e9a46SHoria Geanta 	}, {
2406fb16abc2SMarcus Meissner 		.alg = "authenc(hmac(sha384),ctr(aes))",
2407fb16abc2SMarcus Meissner 		.test = alg_test_null,
2408fb16abc2SMarcus Meissner 		.fips_allowed = 1,
2409fb16abc2SMarcus Meissner 	}, {
24108888690eSMarcus Meissner 		.alg = "authenc(hmac(sha384),rfc3686(ctr(aes)))",
24118888690eSMarcus Meissner 		.test = alg_test_null,
24128888690eSMarcus Meissner 		.fips_allowed = 1,
24138888690eSMarcus Meissner 	}, {
2414a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha512),cbc(aes))",
2415ed1afac9SMarcus Meissner 		.fips_allowed = 1,
2416e46e9a46SHoria Geanta 		.test = alg_test_aead,
2417e46e9a46SHoria Geanta 		.suite = {
2418e46e9a46SHoria Geanta 			.aead = {
241921c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha512_aes_cbc_enc_tv_temp)
24205208ed2cSNitesh Lal 			}
24215208ed2cSNitesh Lal 		}
24225208ed2cSNitesh Lal 	}, {
2423a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha512),cbc(des))",
24245208ed2cSNitesh Lal 		.test = alg_test_aead,
24255208ed2cSNitesh Lal 		.suite = {
24265208ed2cSNitesh Lal 			.aead = {
242721c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha512_des_cbc_enc_tv_temp)
24285208ed2cSNitesh Lal 			}
24295208ed2cSNitesh Lal 		}
24305208ed2cSNitesh Lal 	}, {
2431a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha512),cbc(des3_ede))",
24325208ed2cSNitesh Lal 		.test = alg_test_aead,
2433ed1afac9SMarcus Meissner 		.fips_allowed = 1,
24345208ed2cSNitesh Lal 		.suite = {
24355208ed2cSNitesh Lal 			.aead = {
243621c8e720SArd Biesheuvel 				.enc = __VECS(hmac_sha512_des3_ede_cbc_enc_tv_temp)
2437e46e9a46SHoria Geanta 			}
2438e46e9a46SHoria Geanta 		}
2439e46e9a46SHoria Geanta 	}, {
2440fb16abc2SMarcus Meissner 		.alg = "authenc(hmac(sha512),ctr(aes))",
2441fb16abc2SMarcus Meissner 		.test = alg_test_null,
2442fb16abc2SMarcus Meissner 		.fips_allowed = 1,
2443fb16abc2SMarcus Meissner 	}, {
24448888690eSMarcus Meissner 		.alg = "authenc(hmac(sha512),rfc3686(ctr(aes)))",
24458888690eSMarcus Meissner 		.test = alg_test_null,
24468888690eSMarcus Meissner 		.fips_allowed = 1,
24478888690eSMarcus Meissner 	}, {
2448da7f033dSHerbert Xu 		.alg = "cbc(aes)",
24491aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2450a1915d51SJarod Wilson 		.fips_allowed = 1,
2451da7f033dSHerbert Xu 		.suite = {
2452da7f033dSHerbert Xu 			.cipher = {
245321c8e720SArd Biesheuvel 				.enc = __VECS(aes_cbc_enc_tv_template),
245421c8e720SArd Biesheuvel 				.dec = __VECS(aes_cbc_dec_tv_template)
2455da7f033dSHerbert Xu 			}
2456da7f033dSHerbert Xu 		}
2457da7f033dSHerbert Xu 	}, {
2458da7f033dSHerbert Xu 		.alg = "cbc(anubis)",
24591aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2460da7f033dSHerbert Xu 		.suite = {
2461da7f033dSHerbert Xu 			.cipher = {
246221c8e720SArd Biesheuvel 				.enc = __VECS(anubis_cbc_enc_tv_template),
246321c8e720SArd Biesheuvel 				.dec = __VECS(anubis_cbc_dec_tv_template)
2464da7f033dSHerbert Xu 			}
2465da7f033dSHerbert Xu 		}
2466da7f033dSHerbert Xu 	}, {
2467da7f033dSHerbert Xu 		.alg = "cbc(blowfish)",
24681aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2469da7f033dSHerbert Xu 		.suite = {
2470da7f033dSHerbert Xu 			.cipher = {
247121c8e720SArd Biesheuvel 				.enc = __VECS(bf_cbc_enc_tv_template),
247221c8e720SArd Biesheuvel 				.dec = __VECS(bf_cbc_dec_tv_template)
2473da7f033dSHerbert Xu 			}
2474da7f033dSHerbert Xu 		}
2475da7f033dSHerbert Xu 	}, {
2476da7f033dSHerbert Xu 		.alg = "cbc(camellia)",
24771aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2478da7f033dSHerbert Xu 		.suite = {
2479da7f033dSHerbert Xu 			.cipher = {
248021c8e720SArd Biesheuvel 				.enc = __VECS(camellia_cbc_enc_tv_template),
248121c8e720SArd Biesheuvel 				.dec = __VECS(camellia_cbc_dec_tv_template)
2482da7f033dSHerbert Xu 			}
2483da7f033dSHerbert Xu 		}
2484da7f033dSHerbert Xu 	}, {
2485a2c58260SJohannes Goetzfried 		.alg = "cbc(cast5)",
2486a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2487a2c58260SJohannes Goetzfried 		.suite = {
2488a2c58260SJohannes Goetzfried 			.cipher = {
248921c8e720SArd Biesheuvel 				.enc = __VECS(cast5_cbc_enc_tv_template),
249021c8e720SArd Biesheuvel 				.dec = __VECS(cast5_cbc_dec_tv_template)
2491a2c58260SJohannes Goetzfried 			}
2492a2c58260SJohannes Goetzfried 		}
2493a2c58260SJohannes Goetzfried 	}, {
24949b8b0405SJohannes Goetzfried 		.alg = "cbc(cast6)",
24959b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
24969b8b0405SJohannes Goetzfried 		.suite = {
24979b8b0405SJohannes Goetzfried 			.cipher = {
249821c8e720SArd Biesheuvel 				.enc = __VECS(cast6_cbc_enc_tv_template),
249921c8e720SArd Biesheuvel 				.dec = __VECS(cast6_cbc_dec_tv_template)
25009b8b0405SJohannes Goetzfried 			}
25019b8b0405SJohannes Goetzfried 		}
25029b8b0405SJohannes Goetzfried 	}, {
2503da7f033dSHerbert Xu 		.alg = "cbc(des)",
25041aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2505da7f033dSHerbert Xu 		.suite = {
2506da7f033dSHerbert Xu 			.cipher = {
250721c8e720SArd Biesheuvel 				.enc = __VECS(des_cbc_enc_tv_template),
250821c8e720SArd Biesheuvel 				.dec = __VECS(des_cbc_dec_tv_template)
2509da7f033dSHerbert Xu 			}
2510da7f033dSHerbert Xu 		}
2511da7f033dSHerbert Xu 	}, {
2512da7f033dSHerbert Xu 		.alg = "cbc(des3_ede)",
25131aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2514a1915d51SJarod Wilson 		.fips_allowed = 1,
2515da7f033dSHerbert Xu 		.suite = {
2516da7f033dSHerbert Xu 			.cipher = {
251721c8e720SArd Biesheuvel 				.enc = __VECS(des3_ede_cbc_enc_tv_template),
251821c8e720SArd Biesheuvel 				.dec = __VECS(des3_ede_cbc_dec_tv_template)
2519da7f033dSHerbert Xu 			}
2520da7f033dSHerbert Xu 		}
2521da7f033dSHerbert Xu 	}, {
25229d25917dSJussi Kivilinna 		.alg = "cbc(serpent)",
25239d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
25249d25917dSJussi Kivilinna 		.suite = {
25259d25917dSJussi Kivilinna 			.cipher = {
252621c8e720SArd Biesheuvel 				.enc = __VECS(serpent_cbc_enc_tv_template),
252721c8e720SArd Biesheuvel 				.dec = __VECS(serpent_cbc_dec_tv_template)
25289d25917dSJussi Kivilinna 			}
25299d25917dSJussi Kivilinna 		}
25309d25917dSJussi Kivilinna 	}, {
2531da7f033dSHerbert Xu 		.alg = "cbc(twofish)",
25321aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2533da7f033dSHerbert Xu 		.suite = {
2534da7f033dSHerbert Xu 			.cipher = {
253521c8e720SArd Biesheuvel 				.enc = __VECS(tf_cbc_enc_tv_template),
253621c8e720SArd Biesheuvel 				.dec = __VECS(tf_cbc_dec_tv_template)
2537da7f033dSHerbert Xu 			}
2538da7f033dSHerbert Xu 		}
2539da7f033dSHerbert Xu 	}, {
2540092acf06SArd Biesheuvel 		.alg = "cbcmac(aes)",
2541092acf06SArd Biesheuvel 		.fips_allowed = 1,
2542092acf06SArd Biesheuvel 		.test = alg_test_hash,
2543092acf06SArd Biesheuvel 		.suite = {
2544092acf06SArd Biesheuvel 			.hash = __VECS(aes_cbcmac_tv_template)
2545092acf06SArd Biesheuvel 		}
2546092acf06SArd Biesheuvel 	}, {
2547da7f033dSHerbert Xu 		.alg = "ccm(aes)",
2548da7f033dSHerbert Xu 		.test = alg_test_aead,
2549a1915d51SJarod Wilson 		.fips_allowed = 1,
2550da7f033dSHerbert Xu 		.suite = {
2551da7f033dSHerbert Xu 			.aead = {
255221c8e720SArd Biesheuvel 				.enc = __VECS(aes_ccm_enc_tv_template),
255321c8e720SArd Biesheuvel 				.dec = __VECS(aes_ccm_dec_tv_template)
2554da7f033dSHerbert Xu 			}
2555da7f033dSHerbert Xu 		}
2556da7f033dSHerbert Xu 	}, {
25573590ebf2SMartin Willi 		.alg = "chacha20",
25583590ebf2SMartin Willi 		.test = alg_test_skcipher,
25593590ebf2SMartin Willi 		.suite = {
25603590ebf2SMartin Willi 			.cipher = {
256121c8e720SArd Biesheuvel 				.enc = __VECS(chacha20_enc_tv_template),
256221c8e720SArd Biesheuvel 				.dec = __VECS(chacha20_enc_tv_template),
25633590ebf2SMartin Willi 			}
25643590ebf2SMartin Willi 		}
25653590ebf2SMartin Willi 	}, {
256693b5e86aSJussi Kivilinna 		.alg = "cmac(aes)",
25678f183751SStephan Mueller 		.fips_allowed = 1,
256893b5e86aSJussi Kivilinna 		.test = alg_test_hash,
256993b5e86aSJussi Kivilinna 		.suite = {
257021c8e720SArd Biesheuvel 			.hash = __VECS(aes_cmac128_tv_template)
257193b5e86aSJussi Kivilinna 		}
257293b5e86aSJussi Kivilinna 	}, {
257393b5e86aSJussi Kivilinna 		.alg = "cmac(des3_ede)",
25748f183751SStephan Mueller 		.fips_allowed = 1,
257593b5e86aSJussi Kivilinna 		.test = alg_test_hash,
257693b5e86aSJussi Kivilinna 		.suite = {
257721c8e720SArd Biesheuvel 			.hash = __VECS(des3_ede_cmac64_tv_template)
257893b5e86aSJussi Kivilinna 		}
257993b5e86aSJussi Kivilinna 	}, {
2580e448370dSJussi Kivilinna 		.alg = "compress_null",
2581e448370dSJussi Kivilinna 		.test = alg_test_null,
2582e448370dSJussi Kivilinna 	}, {
2583ebb3472fSArd Biesheuvel 		.alg = "crc32",
2584ebb3472fSArd Biesheuvel 		.test = alg_test_hash,
2585ebb3472fSArd Biesheuvel 		.suite = {
258621c8e720SArd Biesheuvel 			.hash = __VECS(crc32_tv_template)
2587ebb3472fSArd Biesheuvel 		}
2588ebb3472fSArd Biesheuvel 	}, {
2589da7f033dSHerbert Xu 		.alg = "crc32c",
25908e3ee85eSHerbert Xu 		.test = alg_test_crc32c,
2591a1915d51SJarod Wilson 		.fips_allowed = 1,
2592da7f033dSHerbert Xu 		.suite = {
259321c8e720SArd Biesheuvel 			.hash = __VECS(crc32c_tv_template)
2594da7f033dSHerbert Xu 		}
2595da7f033dSHerbert Xu 	}, {
259668411521SHerbert Xu 		.alg = "crct10dif",
259768411521SHerbert Xu 		.test = alg_test_hash,
259868411521SHerbert Xu 		.fips_allowed = 1,
259968411521SHerbert Xu 		.suite = {
260021c8e720SArd Biesheuvel 			.hash = __VECS(crct10dif_tv_template)
260168411521SHerbert Xu 		}
260268411521SHerbert Xu 	}, {
2603f7cb80f2SJarod Wilson 		.alg = "ctr(aes)",
2604f7cb80f2SJarod Wilson 		.test = alg_test_skcipher,
2605a1915d51SJarod Wilson 		.fips_allowed = 1,
2606f7cb80f2SJarod Wilson 		.suite = {
2607f7cb80f2SJarod Wilson 			.cipher = {
260821c8e720SArd Biesheuvel 				.enc = __VECS(aes_ctr_enc_tv_template),
260921c8e720SArd Biesheuvel 				.dec = __VECS(aes_ctr_dec_tv_template)
2610f7cb80f2SJarod Wilson 			}
2611f7cb80f2SJarod Wilson 		}
2612f7cb80f2SJarod Wilson 	}, {
261385b63e34SJussi Kivilinna 		.alg = "ctr(blowfish)",
261485b63e34SJussi Kivilinna 		.test = alg_test_skcipher,
261585b63e34SJussi Kivilinna 		.suite = {
261685b63e34SJussi Kivilinna 			.cipher = {
261721c8e720SArd Biesheuvel 				.enc = __VECS(bf_ctr_enc_tv_template),
261821c8e720SArd Biesheuvel 				.dec = __VECS(bf_ctr_dec_tv_template)
261985b63e34SJussi Kivilinna 			}
262085b63e34SJussi Kivilinna 		}
262185b63e34SJussi Kivilinna 	}, {
26220840605eSJussi Kivilinna 		.alg = "ctr(camellia)",
26230840605eSJussi Kivilinna 		.test = alg_test_skcipher,
26240840605eSJussi Kivilinna 		.suite = {
26250840605eSJussi Kivilinna 			.cipher = {
262621c8e720SArd Biesheuvel 				.enc = __VECS(camellia_ctr_enc_tv_template),
262721c8e720SArd Biesheuvel 				.dec = __VECS(camellia_ctr_dec_tv_template)
26280840605eSJussi Kivilinna 			}
26290840605eSJussi Kivilinna 		}
26300840605eSJussi Kivilinna 	}, {
2631a2c58260SJohannes Goetzfried 		.alg = "ctr(cast5)",
2632a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2633a2c58260SJohannes Goetzfried 		.suite = {
2634a2c58260SJohannes Goetzfried 			.cipher = {
263521c8e720SArd Biesheuvel 				.enc = __VECS(cast5_ctr_enc_tv_template),
263621c8e720SArd Biesheuvel 				.dec = __VECS(cast5_ctr_dec_tv_template)
2637a2c58260SJohannes Goetzfried 			}
2638a2c58260SJohannes Goetzfried 		}
2639a2c58260SJohannes Goetzfried 	}, {
26409b8b0405SJohannes Goetzfried 		.alg = "ctr(cast6)",
26419b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
26429b8b0405SJohannes Goetzfried 		.suite = {
26439b8b0405SJohannes Goetzfried 			.cipher = {
264421c8e720SArd Biesheuvel 				.enc = __VECS(cast6_ctr_enc_tv_template),
264521c8e720SArd Biesheuvel 				.dec = __VECS(cast6_ctr_dec_tv_template)
26469b8b0405SJohannes Goetzfried 			}
26479b8b0405SJohannes Goetzfried 		}
26489b8b0405SJohannes Goetzfried 	}, {
26498163fc30SJussi Kivilinna 		.alg = "ctr(des)",
26508163fc30SJussi Kivilinna 		.test = alg_test_skcipher,
26518163fc30SJussi Kivilinna 		.suite = {
26528163fc30SJussi Kivilinna 			.cipher = {
265321c8e720SArd Biesheuvel 				.enc = __VECS(des_ctr_enc_tv_template),
265421c8e720SArd Biesheuvel 				.dec = __VECS(des_ctr_dec_tv_template)
26558163fc30SJussi Kivilinna 			}
26568163fc30SJussi Kivilinna 		}
26578163fc30SJussi Kivilinna 	}, {
2658e080b17aSJussi Kivilinna 		.alg = "ctr(des3_ede)",
2659e080b17aSJussi Kivilinna 		.test = alg_test_skcipher,
26600d8da104SMarcelo Cerri 		.fips_allowed = 1,
2661e080b17aSJussi Kivilinna 		.suite = {
2662e080b17aSJussi Kivilinna 			.cipher = {
266321c8e720SArd Biesheuvel 				.enc = __VECS(des3_ede_ctr_enc_tv_template),
266421c8e720SArd Biesheuvel 				.dec = __VECS(des3_ede_ctr_dec_tv_template)
2665e080b17aSJussi Kivilinna 			}
2666e080b17aSJussi Kivilinna 		}
2667e080b17aSJussi Kivilinna 	}, {
26689d25917dSJussi Kivilinna 		.alg = "ctr(serpent)",
26699d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
26709d25917dSJussi Kivilinna 		.suite = {
26719d25917dSJussi Kivilinna 			.cipher = {
267221c8e720SArd Biesheuvel 				.enc = __VECS(serpent_ctr_enc_tv_template),
267321c8e720SArd Biesheuvel 				.dec = __VECS(serpent_ctr_dec_tv_template)
26749d25917dSJussi Kivilinna 			}
26759d25917dSJussi Kivilinna 		}
26769d25917dSJussi Kivilinna 	}, {
2677573da620SJussi Kivilinna 		.alg = "ctr(twofish)",
2678573da620SJussi Kivilinna 		.test = alg_test_skcipher,
2679573da620SJussi Kivilinna 		.suite = {
2680573da620SJussi Kivilinna 			.cipher = {
268121c8e720SArd Biesheuvel 				.enc = __VECS(tf_ctr_enc_tv_template),
268221c8e720SArd Biesheuvel 				.dec = __VECS(tf_ctr_dec_tv_template)
2683573da620SJussi Kivilinna 			}
2684573da620SJussi Kivilinna 		}
2685573da620SJussi Kivilinna 	}, {
2686da7f033dSHerbert Xu 		.alg = "cts(cbc(aes))",
26871aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2688da7f033dSHerbert Xu 		.suite = {
2689da7f033dSHerbert Xu 			.cipher = {
269021c8e720SArd Biesheuvel 				.enc = __VECS(cts_mode_enc_tv_template),
269121c8e720SArd Biesheuvel 				.dec = __VECS(cts_mode_dec_tv_template)
2692da7f033dSHerbert Xu 			}
2693da7f033dSHerbert Xu 		}
2694da7f033dSHerbert Xu 	}, {
2695da7f033dSHerbert Xu 		.alg = "deflate",
2696da7f033dSHerbert Xu 		.test = alg_test_comp,
26970818904dSMilan Broz 		.fips_allowed = 1,
2698da7f033dSHerbert Xu 		.suite = {
2699da7f033dSHerbert Xu 			.comp = {
270021c8e720SArd Biesheuvel 				.comp = __VECS(deflate_comp_tv_template),
270121c8e720SArd Biesheuvel 				.decomp = __VECS(deflate_decomp_tv_template)
2702da7f033dSHerbert Xu 			}
2703da7f033dSHerbert Xu 		}
2704da7f033dSHerbert Xu 	}, {
2705802c7f1cSSalvatore Benedetto 		.alg = "dh",
2706802c7f1cSSalvatore Benedetto 		.test = alg_test_kpp,
2707802c7f1cSSalvatore Benedetto 		.fips_allowed = 1,
2708802c7f1cSSalvatore Benedetto 		.suite = {
270921c8e720SArd Biesheuvel 			.kpp = __VECS(dh_tv_template)
2710802c7f1cSSalvatore Benedetto 		}
2711802c7f1cSSalvatore Benedetto 	}, {
2712e448370dSJussi Kivilinna 		.alg = "digest_null",
2713e448370dSJussi Kivilinna 		.test = alg_test_null,
2714e448370dSJussi Kivilinna 	}, {
271564d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes128",
271664d1cdfbSStephan Mueller 		.test = alg_test_drbg,
271764d1cdfbSStephan Mueller 		.fips_allowed = 1,
271864d1cdfbSStephan Mueller 		.suite = {
271921c8e720SArd Biesheuvel 			.drbg = __VECS(drbg_nopr_ctr_aes128_tv_template)
272064d1cdfbSStephan Mueller 		}
272164d1cdfbSStephan Mueller 	}, {
272264d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes192",
272364d1cdfbSStephan Mueller 		.test = alg_test_drbg,
272464d1cdfbSStephan Mueller 		.fips_allowed = 1,
272564d1cdfbSStephan Mueller 		.suite = {
272621c8e720SArd Biesheuvel 			.drbg = __VECS(drbg_nopr_ctr_aes192_tv_template)
272764d1cdfbSStephan Mueller 		}
272864d1cdfbSStephan Mueller 	}, {
272964d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes256",
273064d1cdfbSStephan Mueller 		.test = alg_test_drbg,
273164d1cdfbSStephan Mueller 		.fips_allowed = 1,
273264d1cdfbSStephan Mueller 		.suite = {
273321c8e720SArd Biesheuvel 			.drbg = __VECS(drbg_nopr_ctr_aes256_tv_template)
273464d1cdfbSStephan Mueller 		}
273564d1cdfbSStephan Mueller 	}, {
273664d1cdfbSStephan Mueller 		/*
273764d1cdfbSStephan Mueller 		 * There is no need to specifically test the DRBG with every
273864d1cdfbSStephan Mueller 		 * backend cipher -- covered by drbg_nopr_hmac_sha256 test
273964d1cdfbSStephan Mueller 		 */
274064d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha1",
274164d1cdfbSStephan Mueller 		.fips_allowed = 1,
274264d1cdfbSStephan Mueller 		.test = alg_test_null,
274364d1cdfbSStephan Mueller 	}, {
274464d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha256",
274564d1cdfbSStephan Mueller 		.test = alg_test_drbg,
274664d1cdfbSStephan Mueller 		.fips_allowed = 1,
274764d1cdfbSStephan Mueller 		.suite = {
274821c8e720SArd Biesheuvel 			.drbg = __VECS(drbg_nopr_hmac_sha256_tv_template)
274964d1cdfbSStephan Mueller 		}
275064d1cdfbSStephan Mueller 	}, {
275164d1cdfbSStephan Mueller 		/* covered by drbg_nopr_hmac_sha256 test */
275264d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha384",
275364d1cdfbSStephan Mueller 		.fips_allowed = 1,
275464d1cdfbSStephan Mueller 		.test = alg_test_null,
275564d1cdfbSStephan Mueller 	}, {
275664d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha512",
275764d1cdfbSStephan Mueller 		.test = alg_test_null,
275864d1cdfbSStephan Mueller 		.fips_allowed = 1,
275964d1cdfbSStephan Mueller 	}, {
276064d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha1",
276164d1cdfbSStephan Mueller 		.fips_allowed = 1,
276264d1cdfbSStephan Mueller 		.test = alg_test_null,
276364d1cdfbSStephan Mueller 	}, {
276464d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha256",
276564d1cdfbSStephan Mueller 		.test = alg_test_drbg,
276664d1cdfbSStephan Mueller 		.fips_allowed = 1,
276764d1cdfbSStephan Mueller 		.suite = {
276821c8e720SArd Biesheuvel 			.drbg = __VECS(drbg_nopr_sha256_tv_template)
276964d1cdfbSStephan Mueller 		}
277064d1cdfbSStephan Mueller 	}, {
277164d1cdfbSStephan Mueller 		/* covered by drbg_nopr_sha256 test */
277264d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha384",
277364d1cdfbSStephan Mueller 		.fips_allowed = 1,
277464d1cdfbSStephan Mueller 		.test = alg_test_null,
277564d1cdfbSStephan Mueller 	}, {
277664d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha512",
277764d1cdfbSStephan Mueller 		.fips_allowed = 1,
277864d1cdfbSStephan Mueller 		.test = alg_test_null,
277964d1cdfbSStephan Mueller 	}, {
278064d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes128",
278164d1cdfbSStephan Mueller 		.test = alg_test_drbg,
278264d1cdfbSStephan Mueller 		.fips_allowed = 1,
278364d1cdfbSStephan Mueller 		.suite = {
278421c8e720SArd Biesheuvel 			.drbg = __VECS(drbg_pr_ctr_aes128_tv_template)
278564d1cdfbSStephan Mueller 		}
278664d1cdfbSStephan Mueller 	}, {
278764d1cdfbSStephan Mueller 		/* covered by drbg_pr_ctr_aes128 test */
278864d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes192",
278964d1cdfbSStephan Mueller 		.fips_allowed = 1,
279064d1cdfbSStephan Mueller 		.test = alg_test_null,
279164d1cdfbSStephan Mueller 	}, {
279264d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes256",
279364d1cdfbSStephan Mueller 		.fips_allowed = 1,
279464d1cdfbSStephan Mueller 		.test = alg_test_null,
279564d1cdfbSStephan Mueller 	}, {
279664d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha1",
279764d1cdfbSStephan Mueller 		.fips_allowed = 1,
279864d1cdfbSStephan Mueller 		.test = alg_test_null,
279964d1cdfbSStephan Mueller 	}, {
280064d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha256",
280164d1cdfbSStephan Mueller 		.test = alg_test_drbg,
280264d1cdfbSStephan Mueller 		.fips_allowed = 1,
280364d1cdfbSStephan Mueller 		.suite = {
280421c8e720SArd Biesheuvel 			.drbg = __VECS(drbg_pr_hmac_sha256_tv_template)
280564d1cdfbSStephan Mueller 		}
280664d1cdfbSStephan Mueller 	}, {
280764d1cdfbSStephan Mueller 		/* covered by drbg_pr_hmac_sha256 test */
280864d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha384",
280964d1cdfbSStephan Mueller 		.fips_allowed = 1,
281064d1cdfbSStephan Mueller 		.test = alg_test_null,
281164d1cdfbSStephan Mueller 	}, {
281264d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha512",
281364d1cdfbSStephan Mueller 		.test = alg_test_null,
281464d1cdfbSStephan Mueller 		.fips_allowed = 1,
281564d1cdfbSStephan Mueller 	}, {
281664d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha1",
281764d1cdfbSStephan Mueller 		.fips_allowed = 1,
281864d1cdfbSStephan Mueller 		.test = alg_test_null,
281964d1cdfbSStephan Mueller 	}, {
282064d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha256",
282164d1cdfbSStephan Mueller 		.test = alg_test_drbg,
282264d1cdfbSStephan Mueller 		.fips_allowed = 1,
282364d1cdfbSStephan Mueller 		.suite = {
282421c8e720SArd Biesheuvel 			.drbg = __VECS(drbg_pr_sha256_tv_template)
282564d1cdfbSStephan Mueller 		}
282664d1cdfbSStephan Mueller 	}, {
282764d1cdfbSStephan Mueller 		/* covered by drbg_pr_sha256 test */
282864d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha384",
282964d1cdfbSStephan Mueller 		.fips_allowed = 1,
283064d1cdfbSStephan Mueller 		.test = alg_test_null,
283164d1cdfbSStephan Mueller 	}, {
283264d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha512",
283364d1cdfbSStephan Mueller 		.fips_allowed = 1,
283464d1cdfbSStephan Mueller 		.test = alg_test_null,
283564d1cdfbSStephan Mueller 	}, {
2836da7f033dSHerbert Xu 		.alg = "ecb(aes)",
28371aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2838a1915d51SJarod Wilson 		.fips_allowed = 1,
2839da7f033dSHerbert Xu 		.suite = {
2840da7f033dSHerbert Xu 			.cipher = {
284121c8e720SArd Biesheuvel 				.enc = __VECS(aes_enc_tv_template),
284221c8e720SArd Biesheuvel 				.dec = __VECS(aes_dec_tv_template)
2843da7f033dSHerbert Xu 			}
2844da7f033dSHerbert Xu 		}
2845da7f033dSHerbert Xu 	}, {
2846da7f033dSHerbert Xu 		.alg = "ecb(anubis)",
28471aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2848da7f033dSHerbert Xu 		.suite = {
2849da7f033dSHerbert Xu 			.cipher = {
285021c8e720SArd Biesheuvel 				.enc = __VECS(anubis_enc_tv_template),
285121c8e720SArd Biesheuvel 				.dec = __VECS(anubis_dec_tv_template)
2852da7f033dSHerbert Xu 			}
2853da7f033dSHerbert Xu 		}
2854da7f033dSHerbert Xu 	}, {
2855da7f033dSHerbert Xu 		.alg = "ecb(arc4)",
28561aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2857da7f033dSHerbert Xu 		.suite = {
2858da7f033dSHerbert Xu 			.cipher = {
285921c8e720SArd Biesheuvel 				.enc = __VECS(arc4_enc_tv_template),
286021c8e720SArd Biesheuvel 				.dec = __VECS(arc4_dec_tv_template)
2861da7f033dSHerbert Xu 			}
2862da7f033dSHerbert Xu 		}
2863da7f033dSHerbert Xu 	}, {
2864da7f033dSHerbert Xu 		.alg = "ecb(blowfish)",
28651aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2866da7f033dSHerbert Xu 		.suite = {
2867da7f033dSHerbert Xu 			.cipher = {
286821c8e720SArd Biesheuvel 				.enc = __VECS(bf_enc_tv_template),
286921c8e720SArd Biesheuvel 				.dec = __VECS(bf_dec_tv_template)
2870da7f033dSHerbert Xu 			}
2871da7f033dSHerbert Xu 		}
2872da7f033dSHerbert Xu 	}, {
2873da7f033dSHerbert Xu 		.alg = "ecb(camellia)",
28741aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2875da7f033dSHerbert Xu 		.suite = {
2876da7f033dSHerbert Xu 			.cipher = {
287721c8e720SArd Biesheuvel 				.enc = __VECS(camellia_enc_tv_template),
287821c8e720SArd Biesheuvel 				.dec = __VECS(camellia_dec_tv_template)
2879da7f033dSHerbert Xu 			}
2880da7f033dSHerbert Xu 		}
2881da7f033dSHerbert Xu 	}, {
2882da7f033dSHerbert Xu 		.alg = "ecb(cast5)",
28831aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2884da7f033dSHerbert Xu 		.suite = {
2885da7f033dSHerbert Xu 			.cipher = {
288621c8e720SArd Biesheuvel 				.enc = __VECS(cast5_enc_tv_template),
288721c8e720SArd Biesheuvel 				.dec = __VECS(cast5_dec_tv_template)
2888da7f033dSHerbert Xu 			}
2889da7f033dSHerbert Xu 		}
2890da7f033dSHerbert Xu 	}, {
2891da7f033dSHerbert Xu 		.alg = "ecb(cast6)",
28921aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2893da7f033dSHerbert Xu 		.suite = {
2894da7f033dSHerbert Xu 			.cipher = {
289521c8e720SArd Biesheuvel 				.enc = __VECS(cast6_enc_tv_template),
289621c8e720SArd Biesheuvel 				.dec = __VECS(cast6_dec_tv_template)
2897da7f033dSHerbert Xu 			}
2898da7f033dSHerbert Xu 		}
2899da7f033dSHerbert Xu 	}, {
2900e448370dSJussi Kivilinna 		.alg = "ecb(cipher_null)",
2901e448370dSJussi Kivilinna 		.test = alg_test_null,
29026175ca2bSMilan Broz 		.fips_allowed = 1,
2903e448370dSJussi Kivilinna 	}, {
2904da7f033dSHerbert Xu 		.alg = "ecb(des)",
29051aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2906da7f033dSHerbert Xu 		.suite = {
2907da7f033dSHerbert Xu 			.cipher = {
290821c8e720SArd Biesheuvel 				.enc = __VECS(des_enc_tv_template),
290921c8e720SArd Biesheuvel 				.dec = __VECS(des_dec_tv_template)
2910da7f033dSHerbert Xu 			}
2911da7f033dSHerbert Xu 		}
2912da7f033dSHerbert Xu 	}, {
2913da7f033dSHerbert Xu 		.alg = "ecb(des3_ede)",
29141aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2915a1915d51SJarod Wilson 		.fips_allowed = 1,
2916da7f033dSHerbert Xu 		.suite = {
2917da7f033dSHerbert Xu 			.cipher = {
291821c8e720SArd Biesheuvel 				.enc = __VECS(des3_ede_enc_tv_template),
291921c8e720SArd Biesheuvel 				.dec = __VECS(des3_ede_dec_tv_template)
2920da7f033dSHerbert Xu 			}
2921da7f033dSHerbert Xu 		}
2922da7f033dSHerbert Xu 	}, {
292366e5bd00SJussi Kivilinna 		.alg = "ecb(fcrypt)",
292466e5bd00SJussi Kivilinna 		.test = alg_test_skcipher,
292566e5bd00SJussi Kivilinna 		.suite = {
292666e5bd00SJussi Kivilinna 			.cipher = {
292766e5bd00SJussi Kivilinna 				.enc = {
292866e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_enc_tv_template,
292966e5bd00SJussi Kivilinna 					.count = 1
293066e5bd00SJussi Kivilinna 				},
293166e5bd00SJussi Kivilinna 				.dec = {
293266e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_dec_tv_template,
293366e5bd00SJussi Kivilinna 					.count = 1
293466e5bd00SJussi Kivilinna 				}
293566e5bd00SJussi Kivilinna 			}
293666e5bd00SJussi Kivilinna 		}
293766e5bd00SJussi Kivilinna 	}, {
2938da7f033dSHerbert Xu 		.alg = "ecb(khazad)",
29391aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2940da7f033dSHerbert Xu 		.suite = {
2941da7f033dSHerbert Xu 			.cipher = {
294221c8e720SArd Biesheuvel 				.enc = __VECS(khazad_enc_tv_template),
294321c8e720SArd Biesheuvel 				.dec = __VECS(khazad_dec_tv_template)
2944da7f033dSHerbert Xu 			}
2945da7f033dSHerbert Xu 		}
2946da7f033dSHerbert Xu 	}, {
2947da7f033dSHerbert Xu 		.alg = "ecb(seed)",
29481aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2949da7f033dSHerbert Xu 		.suite = {
2950da7f033dSHerbert Xu 			.cipher = {
295121c8e720SArd Biesheuvel 				.enc = __VECS(seed_enc_tv_template),
295221c8e720SArd Biesheuvel 				.dec = __VECS(seed_dec_tv_template)
2953da7f033dSHerbert Xu 			}
2954da7f033dSHerbert Xu 		}
2955da7f033dSHerbert Xu 	}, {
2956da7f033dSHerbert Xu 		.alg = "ecb(serpent)",
29571aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2958da7f033dSHerbert Xu 		.suite = {
2959da7f033dSHerbert Xu 			.cipher = {
296021c8e720SArd Biesheuvel 				.enc = __VECS(serpent_enc_tv_template),
296121c8e720SArd Biesheuvel 				.dec = __VECS(serpent_dec_tv_template)
2962da7f033dSHerbert Xu 			}
2963da7f033dSHerbert Xu 		}
2964da7f033dSHerbert Xu 	}, {
2965da7f033dSHerbert Xu 		.alg = "ecb(tea)",
29661aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2967da7f033dSHerbert Xu 		.suite = {
2968da7f033dSHerbert Xu 			.cipher = {
296921c8e720SArd Biesheuvel 				.enc = __VECS(tea_enc_tv_template),
297021c8e720SArd Biesheuvel 				.dec = __VECS(tea_dec_tv_template)
2971da7f033dSHerbert Xu 			}
2972da7f033dSHerbert Xu 		}
2973da7f033dSHerbert Xu 	}, {
2974da7f033dSHerbert Xu 		.alg = "ecb(tnepres)",
29751aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2976da7f033dSHerbert Xu 		.suite = {
2977da7f033dSHerbert Xu 			.cipher = {
297821c8e720SArd Biesheuvel 				.enc = __VECS(tnepres_enc_tv_template),
297921c8e720SArd Biesheuvel 				.dec = __VECS(tnepres_dec_tv_template)
2980da7f033dSHerbert Xu 			}
2981da7f033dSHerbert Xu 		}
2982da7f033dSHerbert Xu 	}, {
2983da7f033dSHerbert Xu 		.alg = "ecb(twofish)",
29841aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2985da7f033dSHerbert Xu 		.suite = {
2986da7f033dSHerbert Xu 			.cipher = {
298721c8e720SArd Biesheuvel 				.enc = __VECS(tf_enc_tv_template),
298821c8e720SArd Biesheuvel 				.dec = __VECS(tf_dec_tv_template)
2989da7f033dSHerbert Xu 			}
2990da7f033dSHerbert Xu 		}
2991da7f033dSHerbert Xu 	}, {
2992da7f033dSHerbert Xu 		.alg = "ecb(xeta)",
29931aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2994da7f033dSHerbert Xu 		.suite = {
2995da7f033dSHerbert Xu 			.cipher = {
299621c8e720SArd Biesheuvel 				.enc = __VECS(xeta_enc_tv_template),
299721c8e720SArd Biesheuvel 				.dec = __VECS(xeta_dec_tv_template)
2998da7f033dSHerbert Xu 			}
2999da7f033dSHerbert Xu 		}
3000da7f033dSHerbert Xu 	}, {
3001da7f033dSHerbert Xu 		.alg = "ecb(xtea)",
30021aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3003da7f033dSHerbert Xu 		.suite = {
3004da7f033dSHerbert Xu 			.cipher = {
300521c8e720SArd Biesheuvel 				.enc = __VECS(xtea_enc_tv_template),
300621c8e720SArd Biesheuvel 				.dec = __VECS(xtea_dec_tv_template)
3007da7f033dSHerbert Xu 			}
3008da7f033dSHerbert Xu 		}
3009da7f033dSHerbert Xu 	}, {
30103c4b2390SSalvatore Benedetto 		.alg = "ecdh",
30113c4b2390SSalvatore Benedetto 		.test = alg_test_kpp,
30123c4b2390SSalvatore Benedetto 		.fips_allowed = 1,
30133c4b2390SSalvatore Benedetto 		.suite = {
301421c8e720SArd Biesheuvel 			.kpp = __VECS(ecdh_tv_template)
30153c4b2390SSalvatore Benedetto 		}
30163c4b2390SSalvatore Benedetto 	}, {
3017da7f033dSHerbert Xu 		.alg = "gcm(aes)",
3018da7f033dSHerbert Xu 		.test = alg_test_aead,
3019a1915d51SJarod Wilson 		.fips_allowed = 1,
3020da7f033dSHerbert Xu 		.suite = {
3021da7f033dSHerbert Xu 			.aead = {
302221c8e720SArd Biesheuvel 				.enc = __VECS(aes_gcm_enc_tv_template),
302321c8e720SArd Biesheuvel 				.dec = __VECS(aes_gcm_dec_tv_template)
3024da7f033dSHerbert Xu 			}
3025da7f033dSHerbert Xu 		}
3026da7f033dSHerbert Xu 	}, {
3027507069c9SYouquan, Song 		.alg = "ghash",
3028507069c9SYouquan, Song 		.test = alg_test_hash,
302918c0ebd2SJarod Wilson 		.fips_allowed = 1,
3030507069c9SYouquan, Song 		.suite = {
303121c8e720SArd Biesheuvel 			.hash = __VECS(ghash_tv_template)
3032507069c9SYouquan, Song 		}
3033507069c9SYouquan, Song 	}, {
3034a482b081SSonic Zhang 		.alg = "hmac(crc32)",
3035a482b081SSonic Zhang 		.test = alg_test_hash,
3036a482b081SSonic Zhang 		.suite = {
303721c8e720SArd Biesheuvel 			.hash = __VECS(bfin_crc_tv_template)
3038a482b081SSonic Zhang 		}
3039a482b081SSonic Zhang 	}, {
3040da7f033dSHerbert Xu 		.alg = "hmac(md5)",
3041da7f033dSHerbert Xu 		.test = alg_test_hash,
3042da7f033dSHerbert Xu 		.suite = {
304321c8e720SArd Biesheuvel 			.hash = __VECS(hmac_md5_tv_template)
3044da7f033dSHerbert Xu 		}
3045da7f033dSHerbert Xu 	}, {
3046da7f033dSHerbert Xu 		.alg = "hmac(rmd128)",
3047da7f033dSHerbert Xu 		.test = alg_test_hash,
3048da7f033dSHerbert Xu 		.suite = {
304921c8e720SArd Biesheuvel 			.hash = __VECS(hmac_rmd128_tv_template)
3050da7f033dSHerbert Xu 		}
3051da7f033dSHerbert Xu 	}, {
3052da7f033dSHerbert Xu 		.alg = "hmac(rmd160)",
3053da7f033dSHerbert Xu 		.test = alg_test_hash,
3054da7f033dSHerbert Xu 		.suite = {
305521c8e720SArd Biesheuvel 			.hash = __VECS(hmac_rmd160_tv_template)
3056da7f033dSHerbert Xu 		}
3057da7f033dSHerbert Xu 	}, {
3058da7f033dSHerbert Xu 		.alg = "hmac(sha1)",
3059da7f033dSHerbert Xu 		.test = alg_test_hash,
3060a1915d51SJarod Wilson 		.fips_allowed = 1,
3061da7f033dSHerbert Xu 		.suite = {
306221c8e720SArd Biesheuvel 			.hash = __VECS(hmac_sha1_tv_template)
3063da7f033dSHerbert Xu 		}
3064da7f033dSHerbert Xu 	}, {
3065da7f033dSHerbert Xu 		.alg = "hmac(sha224)",
3066da7f033dSHerbert Xu 		.test = alg_test_hash,
3067a1915d51SJarod Wilson 		.fips_allowed = 1,
3068da7f033dSHerbert Xu 		.suite = {
306921c8e720SArd Biesheuvel 			.hash = __VECS(hmac_sha224_tv_template)
3070da7f033dSHerbert Xu 		}
3071da7f033dSHerbert Xu 	}, {
3072da7f033dSHerbert Xu 		.alg = "hmac(sha256)",
3073da7f033dSHerbert Xu 		.test = alg_test_hash,
3074a1915d51SJarod Wilson 		.fips_allowed = 1,
3075da7f033dSHerbert Xu 		.suite = {
307621c8e720SArd Biesheuvel 			.hash = __VECS(hmac_sha256_tv_template)
3077da7f033dSHerbert Xu 		}
3078da7f033dSHerbert Xu 	}, {
307998eca72fSraveendra padasalagi 		.alg = "hmac(sha3-224)",
308098eca72fSraveendra padasalagi 		.test = alg_test_hash,
308198eca72fSraveendra padasalagi 		.fips_allowed = 1,
308298eca72fSraveendra padasalagi 		.suite = {
308321c8e720SArd Biesheuvel 			.hash = __VECS(hmac_sha3_224_tv_template)
308498eca72fSraveendra padasalagi 		}
308598eca72fSraveendra padasalagi 	}, {
308698eca72fSraveendra padasalagi 		.alg = "hmac(sha3-256)",
308798eca72fSraveendra padasalagi 		.test = alg_test_hash,
308898eca72fSraveendra padasalagi 		.fips_allowed = 1,
308998eca72fSraveendra padasalagi 		.suite = {
309021c8e720SArd Biesheuvel 			.hash = __VECS(hmac_sha3_256_tv_template)
309198eca72fSraveendra padasalagi 		}
309298eca72fSraveendra padasalagi 	}, {
309398eca72fSraveendra padasalagi 		.alg = "hmac(sha3-384)",
309498eca72fSraveendra padasalagi 		.test = alg_test_hash,
309598eca72fSraveendra padasalagi 		.fips_allowed = 1,
309698eca72fSraveendra padasalagi 		.suite = {
309721c8e720SArd Biesheuvel 			.hash = __VECS(hmac_sha3_384_tv_template)
309898eca72fSraveendra padasalagi 		}
309998eca72fSraveendra padasalagi 	}, {
310098eca72fSraveendra padasalagi 		.alg = "hmac(sha3-512)",
310198eca72fSraveendra padasalagi 		.test = alg_test_hash,
310298eca72fSraveendra padasalagi 		.fips_allowed = 1,
310398eca72fSraveendra padasalagi 		.suite = {
310421c8e720SArd Biesheuvel 			.hash = __VECS(hmac_sha3_512_tv_template)
310598eca72fSraveendra padasalagi 		}
310698eca72fSraveendra padasalagi 	}, {
3107da7f033dSHerbert Xu 		.alg = "hmac(sha384)",
3108da7f033dSHerbert Xu 		.test = alg_test_hash,
3109a1915d51SJarod Wilson 		.fips_allowed = 1,
3110da7f033dSHerbert Xu 		.suite = {
311121c8e720SArd Biesheuvel 			.hash = __VECS(hmac_sha384_tv_template)
3112da7f033dSHerbert Xu 		}
3113da7f033dSHerbert Xu 	}, {
3114da7f033dSHerbert Xu 		.alg = "hmac(sha512)",
3115da7f033dSHerbert Xu 		.test = alg_test_hash,
3116a1915d51SJarod Wilson 		.fips_allowed = 1,
3117da7f033dSHerbert Xu 		.suite = {
311821c8e720SArd Biesheuvel 			.hash = __VECS(hmac_sha512_tv_template)
3119da7f033dSHerbert Xu 		}
3120da7f033dSHerbert Xu 	}, {
3121bb5530e4SStephan Mueller 		.alg = "jitterentropy_rng",
3122bb5530e4SStephan Mueller 		.fips_allowed = 1,
3123bb5530e4SStephan Mueller 		.test = alg_test_null,
3124bb5530e4SStephan Mueller 	}, {
312535351988SStephan Mueller 		.alg = "kw(aes)",
312635351988SStephan Mueller 		.test = alg_test_skcipher,
312735351988SStephan Mueller 		.fips_allowed = 1,
312835351988SStephan Mueller 		.suite = {
312935351988SStephan Mueller 			.cipher = {
313021c8e720SArd Biesheuvel 				.enc = __VECS(aes_kw_enc_tv_template),
313121c8e720SArd Biesheuvel 				.dec = __VECS(aes_kw_dec_tv_template)
313235351988SStephan Mueller 			}
313335351988SStephan Mueller 		}
313435351988SStephan Mueller 	}, {
3135da7f033dSHerbert Xu 		.alg = "lrw(aes)",
31361aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3137da7f033dSHerbert Xu 		.suite = {
3138da7f033dSHerbert Xu 			.cipher = {
313921c8e720SArd Biesheuvel 				.enc = __VECS(aes_lrw_enc_tv_template),
314021c8e720SArd Biesheuvel 				.dec = __VECS(aes_lrw_dec_tv_template)
3141da7f033dSHerbert Xu 			}
3142da7f033dSHerbert Xu 		}
3143da7f033dSHerbert Xu 	}, {
31440840605eSJussi Kivilinna 		.alg = "lrw(camellia)",
31450840605eSJussi Kivilinna 		.test = alg_test_skcipher,
31460840605eSJussi Kivilinna 		.suite = {
31470840605eSJussi Kivilinna 			.cipher = {
314821c8e720SArd Biesheuvel 				.enc = __VECS(camellia_lrw_enc_tv_template),
314921c8e720SArd Biesheuvel 				.dec = __VECS(camellia_lrw_dec_tv_template)
31500840605eSJussi Kivilinna 			}
31510840605eSJussi Kivilinna 		}
31520840605eSJussi Kivilinna 	}, {
31539b8b0405SJohannes Goetzfried 		.alg = "lrw(cast6)",
31549b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
31559b8b0405SJohannes Goetzfried 		.suite = {
31569b8b0405SJohannes Goetzfried 			.cipher = {
315721c8e720SArd Biesheuvel 				.enc = __VECS(cast6_lrw_enc_tv_template),
315821c8e720SArd Biesheuvel 				.dec = __VECS(cast6_lrw_dec_tv_template)
31599b8b0405SJohannes Goetzfried 			}
31609b8b0405SJohannes Goetzfried 		}
31619b8b0405SJohannes Goetzfried 	}, {
3162d7bfc0faSJussi Kivilinna 		.alg = "lrw(serpent)",
3163d7bfc0faSJussi Kivilinna 		.test = alg_test_skcipher,
3164d7bfc0faSJussi Kivilinna 		.suite = {
3165d7bfc0faSJussi Kivilinna 			.cipher = {
316621c8e720SArd Biesheuvel 				.enc = __VECS(serpent_lrw_enc_tv_template),
316721c8e720SArd Biesheuvel 				.dec = __VECS(serpent_lrw_dec_tv_template)
3168d7bfc0faSJussi Kivilinna 			}
3169d7bfc0faSJussi Kivilinna 		}
3170d7bfc0faSJussi Kivilinna 	}, {
31710b2a1551SJussi Kivilinna 		.alg = "lrw(twofish)",
31720b2a1551SJussi Kivilinna 		.test = alg_test_skcipher,
31730b2a1551SJussi Kivilinna 		.suite = {
31740b2a1551SJussi Kivilinna 			.cipher = {
317521c8e720SArd Biesheuvel 				.enc = __VECS(tf_lrw_enc_tv_template),
317621c8e720SArd Biesheuvel 				.dec = __VECS(tf_lrw_dec_tv_template)
31770b2a1551SJussi Kivilinna 			}
31780b2a1551SJussi Kivilinna 		}
31790b2a1551SJussi Kivilinna 	}, {
31801443cc9bSKOVACS Krisztian 		.alg = "lz4",
31811443cc9bSKOVACS Krisztian 		.test = alg_test_comp,
31821443cc9bSKOVACS Krisztian 		.fips_allowed = 1,
31831443cc9bSKOVACS Krisztian 		.suite = {
31841443cc9bSKOVACS Krisztian 			.comp = {
318521c8e720SArd Biesheuvel 				.comp = __VECS(lz4_comp_tv_template),
318621c8e720SArd Biesheuvel 				.decomp = __VECS(lz4_decomp_tv_template)
31871443cc9bSKOVACS Krisztian 			}
31881443cc9bSKOVACS Krisztian 		}
31891443cc9bSKOVACS Krisztian 	}, {
31901443cc9bSKOVACS Krisztian 		.alg = "lz4hc",
31911443cc9bSKOVACS Krisztian 		.test = alg_test_comp,
31921443cc9bSKOVACS Krisztian 		.fips_allowed = 1,
31931443cc9bSKOVACS Krisztian 		.suite = {
31941443cc9bSKOVACS Krisztian 			.comp = {
319521c8e720SArd Biesheuvel 				.comp = __VECS(lz4hc_comp_tv_template),
319621c8e720SArd Biesheuvel 				.decomp = __VECS(lz4hc_decomp_tv_template)
31971443cc9bSKOVACS Krisztian 			}
31981443cc9bSKOVACS Krisztian 		}
31991443cc9bSKOVACS Krisztian 	}, {
3200da7f033dSHerbert Xu 		.alg = "lzo",
3201da7f033dSHerbert Xu 		.test = alg_test_comp,
32020818904dSMilan Broz 		.fips_allowed = 1,
3203da7f033dSHerbert Xu 		.suite = {
3204da7f033dSHerbert Xu 			.comp = {
320521c8e720SArd Biesheuvel 				.comp = __VECS(lzo_comp_tv_template),
320621c8e720SArd Biesheuvel 				.decomp = __VECS(lzo_decomp_tv_template)
3207da7f033dSHerbert Xu 			}
3208da7f033dSHerbert Xu 		}
3209da7f033dSHerbert Xu 	}, {
3210da7f033dSHerbert Xu 		.alg = "md4",
3211da7f033dSHerbert Xu 		.test = alg_test_hash,
3212da7f033dSHerbert Xu 		.suite = {
321321c8e720SArd Biesheuvel 			.hash = __VECS(md4_tv_template)
3214da7f033dSHerbert Xu 		}
3215da7f033dSHerbert Xu 	}, {
3216da7f033dSHerbert Xu 		.alg = "md5",
3217da7f033dSHerbert Xu 		.test = alg_test_hash,
3218da7f033dSHerbert Xu 		.suite = {
321921c8e720SArd Biesheuvel 			.hash = __VECS(md5_tv_template)
3220da7f033dSHerbert Xu 		}
3221da7f033dSHerbert Xu 	}, {
3222da7f033dSHerbert Xu 		.alg = "michael_mic",
3223da7f033dSHerbert Xu 		.test = alg_test_hash,
3224da7f033dSHerbert Xu 		.suite = {
322521c8e720SArd Biesheuvel 			.hash = __VECS(michael_mic_tv_template)
3226da7f033dSHerbert Xu 		}
3227da7f033dSHerbert Xu 	}, {
3228ba0e14acSPuneet Saxena 		.alg = "ofb(aes)",
3229ba0e14acSPuneet Saxena 		.test = alg_test_skcipher,
3230ba0e14acSPuneet Saxena 		.fips_allowed = 1,
3231ba0e14acSPuneet Saxena 		.suite = {
3232ba0e14acSPuneet Saxena 			.cipher = {
323321c8e720SArd Biesheuvel 				.enc = __VECS(aes_ofb_enc_tv_template),
323421c8e720SArd Biesheuvel 				.dec = __VECS(aes_ofb_dec_tv_template)
3235ba0e14acSPuneet Saxena 			}
3236ba0e14acSPuneet Saxena 		}
3237ba0e14acSPuneet Saxena 	}, {
3238da7f033dSHerbert Xu 		.alg = "pcbc(fcrypt)",
32391aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3240da7f033dSHerbert Xu 		.suite = {
3241da7f033dSHerbert Xu 			.cipher = {
324221c8e720SArd Biesheuvel 				.enc = __VECS(fcrypt_pcbc_enc_tv_template),
324321c8e720SArd Biesheuvel 				.dec = __VECS(fcrypt_pcbc_dec_tv_template)
3244da7f033dSHerbert Xu 			}
3245da7f033dSHerbert Xu 		}
3246da7f033dSHerbert Xu 	}, {
32471207107cSStephan Mueller 		.alg = "pkcs1pad(rsa,sha224)",
32481207107cSStephan Mueller 		.test = alg_test_null,
32491207107cSStephan Mueller 		.fips_allowed = 1,
32501207107cSStephan Mueller 	}, {
32511207107cSStephan Mueller 		.alg = "pkcs1pad(rsa,sha256)",
32521207107cSStephan Mueller 		.test = alg_test_akcipher,
32531207107cSStephan Mueller 		.fips_allowed = 1,
32541207107cSStephan Mueller 		.suite = {
32551207107cSStephan Mueller 			.akcipher = __VECS(pkcs1pad_rsa_tv_template)
32561207107cSStephan Mueller 		}
32571207107cSStephan Mueller 	}, {
32581207107cSStephan Mueller 		.alg = "pkcs1pad(rsa,sha384)",
32591207107cSStephan Mueller 		.test = alg_test_null,
32601207107cSStephan Mueller 		.fips_allowed = 1,
32611207107cSStephan Mueller 	}, {
32621207107cSStephan Mueller 		.alg = "pkcs1pad(rsa,sha512)",
32631207107cSStephan Mueller 		.test = alg_test_null,
32641207107cSStephan Mueller 		.fips_allowed = 1,
32651207107cSStephan Mueller 	}, {
3266eee9dc61SMartin Willi 		.alg = "poly1305",
3267eee9dc61SMartin Willi 		.test = alg_test_hash,
3268eee9dc61SMartin Willi 		.suite = {
326921c8e720SArd Biesheuvel 			.hash = __VECS(poly1305_tv_template)
3270eee9dc61SMartin Willi 		}
3271eee9dc61SMartin Willi 	}, {
3272da7f033dSHerbert Xu 		.alg = "rfc3686(ctr(aes))",
32731aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3274a1915d51SJarod Wilson 		.fips_allowed = 1,
3275da7f033dSHerbert Xu 		.suite = {
3276da7f033dSHerbert Xu 			.cipher = {
327721c8e720SArd Biesheuvel 				.enc = __VECS(aes_ctr_rfc3686_enc_tv_template),
327821c8e720SArd Biesheuvel 				.dec = __VECS(aes_ctr_rfc3686_dec_tv_template)
3279da7f033dSHerbert Xu 			}
3280da7f033dSHerbert Xu 		}
3281da7f033dSHerbert Xu 	}, {
32823f31a740SHerbert Xu 		.alg = "rfc4106(gcm(aes))",
328369435b94SAdrian Hoban 		.test = alg_test_aead,
3284db71f29aSJarod Wilson 		.fips_allowed = 1,
328569435b94SAdrian Hoban 		.suite = {
328669435b94SAdrian Hoban 			.aead = {
328721c8e720SArd Biesheuvel 				.enc = __VECS(aes_gcm_rfc4106_enc_tv_template),
328821c8e720SArd Biesheuvel 				.dec = __VECS(aes_gcm_rfc4106_dec_tv_template)
328969435b94SAdrian Hoban 			}
329069435b94SAdrian Hoban 		}
329169435b94SAdrian Hoban 	}, {
3292544c436aSHerbert Xu 		.alg = "rfc4309(ccm(aes))",
32935d667322SJarod Wilson 		.test = alg_test_aead,
3294a1915d51SJarod Wilson 		.fips_allowed = 1,
32955d667322SJarod Wilson 		.suite = {
32965d667322SJarod Wilson 			.aead = {
329721c8e720SArd Biesheuvel 				.enc = __VECS(aes_ccm_rfc4309_enc_tv_template),
329821c8e720SArd Biesheuvel 				.dec = __VECS(aes_ccm_rfc4309_dec_tv_template)
32995d667322SJarod Wilson 			}
33005d667322SJarod Wilson 		}
33015d667322SJarod Wilson 	}, {
3302bb68745eSHerbert Xu 		.alg = "rfc4543(gcm(aes))",
3303e9b7441aSJussi Kivilinna 		.test = alg_test_aead,
3304e9b7441aSJussi Kivilinna 		.suite = {
3305e9b7441aSJussi Kivilinna 			.aead = {
330621c8e720SArd Biesheuvel 				.enc = __VECS(aes_gcm_rfc4543_enc_tv_template),
330721c8e720SArd Biesheuvel 				.dec = __VECS(aes_gcm_rfc4543_dec_tv_template),
3308e9b7441aSJussi Kivilinna 			}
3309e9b7441aSJussi Kivilinna 		}
3310e9b7441aSJussi Kivilinna 	}, {
3311af2b76b5SMartin Willi 		.alg = "rfc7539(chacha20,poly1305)",
3312af2b76b5SMartin Willi 		.test = alg_test_aead,
3313af2b76b5SMartin Willi 		.suite = {
3314af2b76b5SMartin Willi 			.aead = {
331521c8e720SArd Biesheuvel 				.enc = __VECS(rfc7539_enc_tv_template),
331621c8e720SArd Biesheuvel 				.dec = __VECS(rfc7539_dec_tv_template),
3317af2b76b5SMartin Willi 			}
3318af2b76b5SMartin Willi 		}
3319af2b76b5SMartin Willi 	}, {
33205900758dSMartin Willi 		.alg = "rfc7539esp(chacha20,poly1305)",
33215900758dSMartin Willi 		.test = alg_test_aead,
33225900758dSMartin Willi 		.suite = {
33235900758dSMartin Willi 			.aead = {
332421c8e720SArd Biesheuvel 				.enc = __VECS(rfc7539esp_enc_tv_template),
332521c8e720SArd Biesheuvel 				.dec = __VECS(rfc7539esp_dec_tv_template),
33265900758dSMartin Willi 			}
33275900758dSMartin Willi 		}
33285900758dSMartin Willi 	}, {
3329da7f033dSHerbert Xu 		.alg = "rmd128",
3330da7f033dSHerbert Xu 		.test = alg_test_hash,
3331da7f033dSHerbert Xu 		.suite = {
333221c8e720SArd Biesheuvel 			.hash = __VECS(rmd128_tv_template)
3333da7f033dSHerbert Xu 		}
3334da7f033dSHerbert Xu 	}, {
3335da7f033dSHerbert Xu 		.alg = "rmd160",
3336da7f033dSHerbert Xu 		.test = alg_test_hash,
3337da7f033dSHerbert Xu 		.suite = {
333821c8e720SArd Biesheuvel 			.hash = __VECS(rmd160_tv_template)
3339da7f033dSHerbert Xu 		}
3340da7f033dSHerbert Xu 	}, {
3341da7f033dSHerbert Xu 		.alg = "rmd256",
3342da7f033dSHerbert Xu 		.test = alg_test_hash,
3343da7f033dSHerbert Xu 		.suite = {
334421c8e720SArd Biesheuvel 			.hash = __VECS(rmd256_tv_template)
3345da7f033dSHerbert Xu 		}
3346da7f033dSHerbert Xu 	}, {
3347da7f033dSHerbert Xu 		.alg = "rmd320",
3348da7f033dSHerbert Xu 		.test = alg_test_hash,
3349da7f033dSHerbert Xu 		.suite = {
335021c8e720SArd Biesheuvel 			.hash = __VECS(rmd320_tv_template)
3351da7f033dSHerbert Xu 		}
3352da7f033dSHerbert Xu 	}, {
3353946cc463STadeusz Struk 		.alg = "rsa",
3354946cc463STadeusz Struk 		.test = alg_test_akcipher,
3355946cc463STadeusz Struk 		.fips_allowed = 1,
3356946cc463STadeusz Struk 		.suite = {
335721c8e720SArd Biesheuvel 			.akcipher = __VECS(rsa_tv_template)
3358946cc463STadeusz Struk 		}
3359946cc463STadeusz Struk 	}, {
3360da7f033dSHerbert Xu 		.alg = "salsa20",
33611aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3362da7f033dSHerbert Xu 		.suite = {
3363da7f033dSHerbert Xu 			.cipher = {
336421c8e720SArd Biesheuvel 				.enc = __VECS(salsa20_stream_enc_tv_template)
3365da7f033dSHerbert Xu 			}
3366da7f033dSHerbert Xu 		}
3367da7f033dSHerbert Xu 	}, {
3368da7f033dSHerbert Xu 		.alg = "sha1",
3369da7f033dSHerbert Xu 		.test = alg_test_hash,
3370a1915d51SJarod Wilson 		.fips_allowed = 1,
3371da7f033dSHerbert Xu 		.suite = {
337221c8e720SArd Biesheuvel 			.hash = __VECS(sha1_tv_template)
3373da7f033dSHerbert Xu 		}
3374da7f033dSHerbert Xu 	}, {
3375da7f033dSHerbert Xu 		.alg = "sha224",
3376da7f033dSHerbert Xu 		.test = alg_test_hash,
3377a1915d51SJarod Wilson 		.fips_allowed = 1,
3378da7f033dSHerbert Xu 		.suite = {
337921c8e720SArd Biesheuvel 			.hash = __VECS(sha224_tv_template)
3380da7f033dSHerbert Xu 		}
3381da7f033dSHerbert Xu 	}, {
3382da7f033dSHerbert Xu 		.alg = "sha256",
3383da7f033dSHerbert Xu 		.test = alg_test_hash,
3384a1915d51SJarod Wilson 		.fips_allowed = 1,
3385da7f033dSHerbert Xu 		.suite = {
338621c8e720SArd Biesheuvel 			.hash = __VECS(sha256_tv_template)
3387da7f033dSHerbert Xu 		}
3388da7f033dSHerbert Xu 	}, {
338979cc6ab8Sraveendra padasalagi 		.alg = "sha3-224",
339079cc6ab8Sraveendra padasalagi 		.test = alg_test_hash,
339179cc6ab8Sraveendra padasalagi 		.fips_allowed = 1,
339279cc6ab8Sraveendra padasalagi 		.suite = {
339321c8e720SArd Biesheuvel 			.hash = __VECS(sha3_224_tv_template)
339479cc6ab8Sraveendra padasalagi 		}
339579cc6ab8Sraveendra padasalagi 	}, {
339679cc6ab8Sraveendra padasalagi 		.alg = "sha3-256",
339779cc6ab8Sraveendra padasalagi 		.test = alg_test_hash,
339879cc6ab8Sraveendra padasalagi 		.fips_allowed = 1,
339979cc6ab8Sraveendra padasalagi 		.suite = {
340021c8e720SArd Biesheuvel 			.hash = __VECS(sha3_256_tv_template)
340179cc6ab8Sraveendra padasalagi 		}
340279cc6ab8Sraveendra padasalagi 	}, {
340379cc6ab8Sraveendra padasalagi 		.alg = "sha3-384",
340479cc6ab8Sraveendra padasalagi 		.test = alg_test_hash,
340579cc6ab8Sraveendra padasalagi 		.fips_allowed = 1,
340679cc6ab8Sraveendra padasalagi 		.suite = {
340721c8e720SArd Biesheuvel 			.hash = __VECS(sha3_384_tv_template)
340879cc6ab8Sraveendra padasalagi 		}
340979cc6ab8Sraveendra padasalagi 	}, {
341079cc6ab8Sraveendra padasalagi 		.alg = "sha3-512",
341179cc6ab8Sraveendra padasalagi 		.test = alg_test_hash,
341279cc6ab8Sraveendra padasalagi 		.fips_allowed = 1,
341379cc6ab8Sraveendra padasalagi 		.suite = {
341421c8e720SArd Biesheuvel 			.hash = __VECS(sha3_512_tv_template)
341579cc6ab8Sraveendra padasalagi 		}
341679cc6ab8Sraveendra padasalagi 	}, {
3417da7f033dSHerbert Xu 		.alg = "sha384",
3418da7f033dSHerbert Xu 		.test = alg_test_hash,
3419a1915d51SJarod Wilson 		.fips_allowed = 1,
3420da7f033dSHerbert Xu 		.suite = {
342121c8e720SArd Biesheuvel 			.hash = __VECS(sha384_tv_template)
3422da7f033dSHerbert Xu 		}
3423da7f033dSHerbert Xu 	}, {
3424da7f033dSHerbert Xu 		.alg = "sha512",
3425da7f033dSHerbert Xu 		.test = alg_test_hash,
3426a1915d51SJarod Wilson 		.fips_allowed = 1,
3427da7f033dSHerbert Xu 		.suite = {
342821c8e720SArd Biesheuvel 			.hash = __VECS(sha512_tv_template)
3429da7f033dSHerbert Xu 		}
3430da7f033dSHerbert Xu 	}, {
3431b7e27530SGilad Ben-Yossef 		.alg = "sm3",
3432b7e27530SGilad Ben-Yossef 		.test = alg_test_hash,
3433b7e27530SGilad Ben-Yossef 		.suite = {
3434b7e27530SGilad Ben-Yossef 			.hash = __VECS(sm3_tv_template)
3435b7e27530SGilad Ben-Yossef 		}
3436b7e27530SGilad Ben-Yossef 	}, {
3437da7f033dSHerbert Xu 		.alg = "tgr128",
3438da7f033dSHerbert Xu 		.test = alg_test_hash,
3439da7f033dSHerbert Xu 		.suite = {
344021c8e720SArd Biesheuvel 			.hash = __VECS(tgr128_tv_template)
3441da7f033dSHerbert Xu 		}
3442da7f033dSHerbert Xu 	}, {
3443da7f033dSHerbert Xu 		.alg = "tgr160",
3444da7f033dSHerbert Xu 		.test = alg_test_hash,
3445da7f033dSHerbert Xu 		.suite = {
344621c8e720SArd Biesheuvel 			.hash = __VECS(tgr160_tv_template)
3447da7f033dSHerbert Xu 		}
3448da7f033dSHerbert Xu 	}, {
3449da7f033dSHerbert Xu 		.alg = "tgr192",
3450da7f033dSHerbert Xu 		.test = alg_test_hash,
3451da7f033dSHerbert Xu 		.suite = {
345221c8e720SArd Biesheuvel 			.hash = __VECS(tgr192_tv_template)
3453da7f033dSHerbert Xu 		}
3454da7f033dSHerbert Xu 	}, {
3455f1939f7cSShane Wang 		.alg = "vmac(aes)",
3456f1939f7cSShane Wang 		.test = alg_test_hash,
3457f1939f7cSShane Wang 		.suite = {
345821c8e720SArd Biesheuvel 			.hash = __VECS(aes_vmac128_tv_template)
3459f1939f7cSShane Wang 		}
3460f1939f7cSShane Wang 	}, {
3461da7f033dSHerbert Xu 		.alg = "wp256",
3462da7f033dSHerbert Xu 		.test = alg_test_hash,
3463da7f033dSHerbert Xu 		.suite = {
346421c8e720SArd Biesheuvel 			.hash = __VECS(wp256_tv_template)
3465da7f033dSHerbert Xu 		}
3466da7f033dSHerbert Xu 	}, {
3467da7f033dSHerbert Xu 		.alg = "wp384",
3468da7f033dSHerbert Xu 		.test = alg_test_hash,
3469da7f033dSHerbert Xu 		.suite = {
347021c8e720SArd Biesheuvel 			.hash = __VECS(wp384_tv_template)
3471da7f033dSHerbert Xu 		}
3472da7f033dSHerbert Xu 	}, {
3473da7f033dSHerbert Xu 		.alg = "wp512",
3474da7f033dSHerbert Xu 		.test = alg_test_hash,
3475da7f033dSHerbert Xu 		.suite = {
347621c8e720SArd Biesheuvel 			.hash = __VECS(wp512_tv_template)
3477da7f033dSHerbert Xu 		}
3478da7f033dSHerbert Xu 	}, {
3479da7f033dSHerbert Xu 		.alg = "xcbc(aes)",
3480da7f033dSHerbert Xu 		.test = alg_test_hash,
3481da7f033dSHerbert Xu 		.suite = {
348221c8e720SArd Biesheuvel 			.hash = __VECS(aes_xcbc128_tv_template)
3483da7f033dSHerbert Xu 		}
3484da7f033dSHerbert Xu 	}, {
3485da7f033dSHerbert Xu 		.alg = "xts(aes)",
34861aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
34872918aa8dSJarod Wilson 		.fips_allowed = 1,
3488da7f033dSHerbert Xu 		.suite = {
3489da7f033dSHerbert Xu 			.cipher = {
349021c8e720SArd Biesheuvel 				.enc = __VECS(aes_xts_enc_tv_template),
349121c8e720SArd Biesheuvel 				.dec = __VECS(aes_xts_dec_tv_template)
3492da7f033dSHerbert Xu 			}
3493da7f033dSHerbert Xu 		}
34940c01aed5SGeert Uytterhoeven 	}, {
34950840605eSJussi Kivilinna 		.alg = "xts(camellia)",
34960840605eSJussi Kivilinna 		.test = alg_test_skcipher,
34970840605eSJussi Kivilinna 		.suite = {
34980840605eSJussi Kivilinna 			.cipher = {
349921c8e720SArd Biesheuvel 				.enc = __VECS(camellia_xts_enc_tv_template),
350021c8e720SArd Biesheuvel 				.dec = __VECS(camellia_xts_dec_tv_template)
35010840605eSJussi Kivilinna 			}
35020840605eSJussi Kivilinna 		}
35030840605eSJussi Kivilinna 	}, {
35049b8b0405SJohannes Goetzfried 		.alg = "xts(cast6)",
35059b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
35069b8b0405SJohannes Goetzfried 		.suite = {
35079b8b0405SJohannes Goetzfried 			.cipher = {
350821c8e720SArd Biesheuvel 				.enc = __VECS(cast6_xts_enc_tv_template),
350921c8e720SArd Biesheuvel 				.dec = __VECS(cast6_xts_dec_tv_template)
35109b8b0405SJohannes Goetzfried 			}
35119b8b0405SJohannes Goetzfried 		}
35129b8b0405SJohannes Goetzfried 	}, {
351318be20b9SJussi Kivilinna 		.alg = "xts(serpent)",
351418be20b9SJussi Kivilinna 		.test = alg_test_skcipher,
351518be20b9SJussi Kivilinna 		.suite = {
351618be20b9SJussi Kivilinna 			.cipher = {
351721c8e720SArd Biesheuvel 				.enc = __VECS(serpent_xts_enc_tv_template),
351821c8e720SArd Biesheuvel 				.dec = __VECS(serpent_xts_dec_tv_template)
351918be20b9SJussi Kivilinna 			}
352018be20b9SJussi Kivilinna 		}
352118be20b9SJussi Kivilinna 	}, {
3522aed265b9SJussi Kivilinna 		.alg = "xts(twofish)",
3523aed265b9SJussi Kivilinna 		.test = alg_test_skcipher,
3524aed265b9SJussi Kivilinna 		.suite = {
3525aed265b9SJussi Kivilinna 			.cipher = {
352621c8e720SArd Biesheuvel 				.enc = __VECS(tf_xts_enc_tv_template),
352721c8e720SArd Biesheuvel 				.dec = __VECS(tf_xts_dec_tv_template)
3528aed265b9SJussi Kivilinna 			}
3529aed265b9SJussi Kivilinna 		}
3530a368f43dSGiovanni Cabiddu 	}, {
3531a368f43dSGiovanni Cabiddu 		.alg = "zlib-deflate",
3532a368f43dSGiovanni Cabiddu 		.test = alg_test_comp,
3533a368f43dSGiovanni Cabiddu 		.fips_allowed = 1,
3534a368f43dSGiovanni Cabiddu 		.suite = {
3535a368f43dSGiovanni Cabiddu 			.comp = {
3536a368f43dSGiovanni Cabiddu 				.comp = __VECS(zlib_deflate_comp_tv_template),
3537a368f43dSGiovanni Cabiddu 				.decomp = __VECS(zlib_deflate_decomp_tv_template)
3538a368f43dSGiovanni Cabiddu 			}
3539a368f43dSGiovanni Cabiddu 		}
3540da7f033dSHerbert Xu 	}
3541da7f033dSHerbert Xu };
3542da7f033dSHerbert Xu 
35435714758bSJussi Kivilinna static bool alg_test_descs_checked;
35445714758bSJussi Kivilinna 
35455714758bSJussi Kivilinna static void alg_test_descs_check_order(void)
35465714758bSJussi Kivilinna {
35475714758bSJussi Kivilinna 	int i;
35485714758bSJussi Kivilinna 
35495714758bSJussi Kivilinna 	/* only check once */
35505714758bSJussi Kivilinna 	if (alg_test_descs_checked)
35515714758bSJussi Kivilinna 		return;
35525714758bSJussi Kivilinna 
35535714758bSJussi Kivilinna 	alg_test_descs_checked = true;
35545714758bSJussi Kivilinna 
35555714758bSJussi Kivilinna 	for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) {
35565714758bSJussi Kivilinna 		int diff = strcmp(alg_test_descs[i - 1].alg,
35575714758bSJussi Kivilinna 				  alg_test_descs[i].alg);
35585714758bSJussi Kivilinna 
35595714758bSJussi Kivilinna 		if (WARN_ON(diff > 0)) {
35605714758bSJussi Kivilinna 			pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n",
35615714758bSJussi Kivilinna 				alg_test_descs[i - 1].alg,
35625714758bSJussi Kivilinna 				alg_test_descs[i].alg);
35635714758bSJussi Kivilinna 		}
35645714758bSJussi Kivilinna 
35655714758bSJussi Kivilinna 		if (WARN_ON(diff == 0)) {
35665714758bSJussi Kivilinna 			pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n",
35675714758bSJussi Kivilinna 				alg_test_descs[i].alg);
35685714758bSJussi Kivilinna 		}
35695714758bSJussi Kivilinna 	}
35705714758bSJussi Kivilinna }
35715714758bSJussi Kivilinna 
35721aa4ecd9SHerbert Xu static int alg_find_test(const char *alg)
3573da7f033dSHerbert Xu {
3574da7f033dSHerbert Xu 	int start = 0;
3575da7f033dSHerbert Xu 	int end = ARRAY_SIZE(alg_test_descs);
3576da7f033dSHerbert Xu 
3577da7f033dSHerbert Xu 	while (start < end) {
3578da7f033dSHerbert Xu 		int i = (start + end) / 2;
3579da7f033dSHerbert Xu 		int diff = strcmp(alg_test_descs[i].alg, alg);
3580da7f033dSHerbert Xu 
3581da7f033dSHerbert Xu 		if (diff > 0) {
3582da7f033dSHerbert Xu 			end = i;
3583da7f033dSHerbert Xu 			continue;
3584da7f033dSHerbert Xu 		}
3585da7f033dSHerbert Xu 
3586da7f033dSHerbert Xu 		if (diff < 0) {
3587da7f033dSHerbert Xu 			start = i + 1;
3588da7f033dSHerbert Xu 			continue;
3589da7f033dSHerbert Xu 		}
3590da7f033dSHerbert Xu 
35911aa4ecd9SHerbert Xu 		return i;
3592da7f033dSHerbert Xu 	}
3593da7f033dSHerbert Xu 
35941aa4ecd9SHerbert Xu 	return -1;
35951aa4ecd9SHerbert Xu }
35961aa4ecd9SHerbert Xu 
35971aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
35981aa4ecd9SHerbert Xu {
35991aa4ecd9SHerbert Xu 	int i;
3600a68f6610SHerbert Xu 	int j;
3601d12d6b6dSNeil Horman 	int rc;
36021aa4ecd9SHerbert Xu 
36039e5c9fe4SRichard W.M. Jones 	if (!fips_enabled && notests) {
36049e5c9fe4SRichard W.M. Jones 		printk_once(KERN_INFO "alg: self-tests disabled\n");
36059e5c9fe4SRichard W.M. Jones 		return 0;
36069e5c9fe4SRichard W.M. Jones 	}
36079e5c9fe4SRichard W.M. Jones 
36085714758bSJussi Kivilinna 	alg_test_descs_check_order();
36095714758bSJussi Kivilinna 
36101aa4ecd9SHerbert Xu 	if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
36111aa4ecd9SHerbert Xu 		char nalg[CRYPTO_MAX_ALG_NAME];
36121aa4ecd9SHerbert Xu 
36131aa4ecd9SHerbert Xu 		if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
36141aa4ecd9SHerbert Xu 		    sizeof(nalg))
36151aa4ecd9SHerbert Xu 			return -ENAMETOOLONG;
36161aa4ecd9SHerbert Xu 
36171aa4ecd9SHerbert Xu 		i = alg_find_test(nalg);
36181aa4ecd9SHerbert Xu 		if (i < 0)
36191aa4ecd9SHerbert Xu 			goto notest;
36201aa4ecd9SHerbert Xu 
3621a3bef3a3SJarod Wilson 		if (fips_enabled && !alg_test_descs[i].fips_allowed)
3622a3bef3a3SJarod Wilson 			goto non_fips_alg;
3623a3bef3a3SJarod Wilson 
3624941fb328SJarod Wilson 		rc = alg_test_cipher(alg_test_descs + i, driver, type, mask);
3625941fb328SJarod Wilson 		goto test_done;
36261aa4ecd9SHerbert Xu 	}
36271aa4ecd9SHerbert Xu 
36281aa4ecd9SHerbert Xu 	i = alg_find_test(alg);
3629a68f6610SHerbert Xu 	j = alg_find_test(driver);
3630a68f6610SHerbert Xu 	if (i < 0 && j < 0)
36311aa4ecd9SHerbert Xu 		goto notest;
36321aa4ecd9SHerbert Xu 
3633a68f6610SHerbert Xu 	if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
3634a68f6610SHerbert Xu 			     (j >= 0 && !alg_test_descs[j].fips_allowed)))
3635a3bef3a3SJarod Wilson 		goto non_fips_alg;
3636a3bef3a3SJarod Wilson 
3637a68f6610SHerbert Xu 	rc = 0;
3638a68f6610SHerbert Xu 	if (i >= 0)
3639a68f6610SHerbert Xu 		rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
36401aa4ecd9SHerbert Xu 					     type, mask);
3641032c8cacSCristian Stoica 	if (j >= 0 && j != i)
3642a68f6610SHerbert Xu 		rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
3643a68f6610SHerbert Xu 					     type, mask);
3644a68f6610SHerbert Xu 
3645941fb328SJarod Wilson test_done:
3646d12d6b6dSNeil Horman 	if (fips_enabled && rc)
3647d12d6b6dSNeil Horman 		panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
3648d12d6b6dSNeil Horman 
364929ecd4abSJarod Wilson 	if (fips_enabled && !rc)
36503e8cffd4SMasanari Iida 		pr_info("alg: self-tests for %s (%s) passed\n", driver, alg);
365129ecd4abSJarod Wilson 
3652d12d6b6dSNeil Horman 	return rc;
36531aa4ecd9SHerbert Xu 
36541aa4ecd9SHerbert Xu notest:
3655da7f033dSHerbert Xu 	printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
3656da7f033dSHerbert Xu 	return 0;
3657a3bef3a3SJarod Wilson non_fips_alg:
3658a3bef3a3SJarod Wilson 	return -EINVAL;
3659da7f033dSHerbert Xu }
36600b767f96SAlexander Shishkin 
3661326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
36620b767f96SAlexander Shishkin 
3663da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test);
3664