xref: /openbmc/linux/crypto/testmgr.c (revision 9e5c9fe4)
1da7f033dSHerbert Xu /*
2da7f033dSHerbert Xu  * Algorithm testing framework and tests.
3da7f033dSHerbert Xu  *
4da7f033dSHerbert Xu  * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
5da7f033dSHerbert Xu  * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
6da7f033dSHerbert Xu  * Copyright (c) 2007 Nokia Siemens Networks
7da7f033dSHerbert Xu  * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
8da7f033dSHerbert Xu  *
969435b94SAdrian Hoban  * Updated RFC4106 AES-GCM testing.
1069435b94SAdrian Hoban  *    Authors: Aidan O'Mahony (aidan.o.mahony@intel.com)
1169435b94SAdrian Hoban  *             Adrian Hoban <adrian.hoban@intel.com>
1269435b94SAdrian Hoban  *             Gabriele Paoloni <gabriele.paoloni@intel.com>
1369435b94SAdrian Hoban  *             Tadeusz Struk (tadeusz.struk@intel.com)
1469435b94SAdrian Hoban  *    Copyright (c) 2010, Intel Corporation.
1569435b94SAdrian Hoban  *
16da7f033dSHerbert Xu  * This program is free software; you can redistribute it and/or modify it
17da7f033dSHerbert Xu  * under the terms of the GNU General Public License as published by the Free
18da7f033dSHerbert Xu  * Software Foundation; either version 2 of the License, or (at your option)
19da7f033dSHerbert Xu  * any later version.
20da7f033dSHerbert Xu  *
21da7f033dSHerbert Xu  */
22da7f033dSHerbert Xu 
231ce33115SHerbert Xu #include <crypto/aead.h>
24da7f033dSHerbert Xu #include <crypto/hash.h>
2512773d93SHerbert Xu #include <crypto/skcipher.h>
26da7f033dSHerbert Xu #include <linux/err.h>
271c41b882SHerbert Xu #include <linux/fips.h>
28da7f033dSHerbert Xu #include <linux/module.h>
29da7f033dSHerbert Xu #include <linux/scatterlist.h>
30da7f033dSHerbert Xu #include <linux/slab.h>
31da7f033dSHerbert Xu #include <linux/string.h>
327647d6ceSJarod Wilson #include <crypto/rng.h>
3364d1cdfbSStephan Mueller #include <crypto/drbg.h>
34946cc463STadeusz Struk #include <crypto/akcipher.h>
35da7f033dSHerbert Xu 
36da7f033dSHerbert Xu #include "internal.h"
370b767f96SAlexander Shishkin 
389e5c9fe4SRichard W.M. Jones static bool notests;
399e5c9fe4SRichard W.M. Jones module_param(notests, bool, 0644);
409e5c9fe4SRichard W.M. Jones MODULE_PARM_DESC(notests, "disable crypto self-tests");
419e5c9fe4SRichard W.M. Jones 
42326a6346SHerbert Xu #ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS
430b767f96SAlexander Shishkin 
440b767f96SAlexander Shishkin /* a perfect nop */
450b767f96SAlexander Shishkin int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
460b767f96SAlexander Shishkin {
470b767f96SAlexander Shishkin 	return 0;
480b767f96SAlexander Shishkin }
490b767f96SAlexander Shishkin 
500b767f96SAlexander Shishkin #else
510b767f96SAlexander Shishkin 
52da7f033dSHerbert Xu #include "testmgr.h"
53da7f033dSHerbert Xu 
54da7f033dSHerbert Xu /*
55da7f033dSHerbert Xu  * Need slab memory for testing (size in number of pages).
56da7f033dSHerbert Xu  */
57da7f033dSHerbert Xu #define XBUFSIZE	8
58da7f033dSHerbert Xu 
59da7f033dSHerbert Xu /*
60da7f033dSHerbert Xu  * Indexes into the xbuf to simulate cross-page access.
61da7f033dSHerbert Xu  */
62da7f033dSHerbert Xu #define IDX1		32
63da7f033dSHerbert Xu #define IDX2		32400
64da7f033dSHerbert Xu #define IDX3		1
65da7f033dSHerbert Xu #define IDX4		8193
66da7f033dSHerbert Xu #define IDX5		22222
67da7f033dSHerbert Xu #define IDX6		17101
68da7f033dSHerbert Xu #define IDX7		27333
69da7f033dSHerbert Xu #define IDX8		3000
70da7f033dSHerbert Xu 
71da7f033dSHerbert Xu /*
72da7f033dSHerbert Xu * Used by test_cipher()
73da7f033dSHerbert Xu */
74da7f033dSHerbert Xu #define ENCRYPT 1
75da7f033dSHerbert Xu #define DECRYPT 0
76da7f033dSHerbert Xu 
77da7f033dSHerbert Xu struct tcrypt_result {
78da7f033dSHerbert Xu 	struct completion completion;
79da7f033dSHerbert Xu 	int err;
80da7f033dSHerbert Xu };
81da7f033dSHerbert Xu 
82da7f033dSHerbert Xu struct aead_test_suite {
83da7f033dSHerbert Xu 	struct {
84da7f033dSHerbert Xu 		struct aead_testvec *vecs;
85da7f033dSHerbert Xu 		unsigned int count;
86da7f033dSHerbert Xu 	} enc, dec;
87da7f033dSHerbert Xu };
88da7f033dSHerbert Xu 
89da7f033dSHerbert Xu struct cipher_test_suite {
90da7f033dSHerbert Xu 	struct {
91da7f033dSHerbert Xu 		struct cipher_testvec *vecs;
92da7f033dSHerbert Xu 		unsigned int count;
93da7f033dSHerbert Xu 	} enc, dec;
94da7f033dSHerbert Xu };
95da7f033dSHerbert Xu 
96da7f033dSHerbert Xu struct comp_test_suite {
97da7f033dSHerbert Xu 	struct {
98da7f033dSHerbert Xu 		struct comp_testvec *vecs;
99da7f033dSHerbert Xu 		unsigned int count;
100da7f033dSHerbert Xu 	} comp, decomp;
101da7f033dSHerbert Xu };
102da7f033dSHerbert Xu 
103da7f033dSHerbert Xu struct hash_test_suite {
104da7f033dSHerbert Xu 	struct hash_testvec *vecs;
105da7f033dSHerbert Xu 	unsigned int count;
106da7f033dSHerbert Xu };
107da7f033dSHerbert Xu 
1087647d6ceSJarod Wilson struct cprng_test_suite {
1097647d6ceSJarod Wilson 	struct cprng_testvec *vecs;
1107647d6ceSJarod Wilson 	unsigned int count;
1117647d6ceSJarod Wilson };
1127647d6ceSJarod Wilson 
11364d1cdfbSStephan Mueller struct drbg_test_suite {
11464d1cdfbSStephan Mueller 	struct drbg_testvec *vecs;
11564d1cdfbSStephan Mueller 	unsigned int count;
11664d1cdfbSStephan Mueller };
11764d1cdfbSStephan Mueller 
118946cc463STadeusz Struk struct akcipher_test_suite {
119946cc463STadeusz Struk 	struct akcipher_testvec *vecs;
120946cc463STadeusz Struk 	unsigned int count;
121946cc463STadeusz Struk };
122946cc463STadeusz Struk 
123da7f033dSHerbert Xu struct alg_test_desc {
124da7f033dSHerbert Xu 	const char *alg;
125da7f033dSHerbert Xu 	int (*test)(const struct alg_test_desc *desc, const char *driver,
126da7f033dSHerbert Xu 		    u32 type, u32 mask);
127a1915d51SJarod Wilson 	int fips_allowed;	/* set if alg is allowed in fips mode */
128da7f033dSHerbert Xu 
129da7f033dSHerbert Xu 	union {
130da7f033dSHerbert Xu 		struct aead_test_suite aead;
131da7f033dSHerbert Xu 		struct cipher_test_suite cipher;
132da7f033dSHerbert Xu 		struct comp_test_suite comp;
133da7f033dSHerbert Xu 		struct hash_test_suite hash;
1347647d6ceSJarod Wilson 		struct cprng_test_suite cprng;
13564d1cdfbSStephan Mueller 		struct drbg_test_suite drbg;
136946cc463STadeusz Struk 		struct akcipher_test_suite akcipher;
137da7f033dSHerbert Xu 	} suite;
138da7f033dSHerbert Xu };
139da7f033dSHerbert Xu 
140da7f033dSHerbert Xu static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
141da7f033dSHerbert Xu 
142da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len)
143da7f033dSHerbert Xu {
144da7f033dSHerbert Xu 	print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
145da7f033dSHerbert Xu 			16, 1,
146da7f033dSHerbert Xu 			buf, len, false);
147da7f033dSHerbert Xu }
148da7f033dSHerbert Xu 
149da7f033dSHerbert Xu static void tcrypt_complete(struct crypto_async_request *req, int err)
150da7f033dSHerbert Xu {
151da7f033dSHerbert Xu 	struct tcrypt_result *res = req->data;
152da7f033dSHerbert Xu 
153da7f033dSHerbert Xu 	if (err == -EINPROGRESS)
154da7f033dSHerbert Xu 		return;
155da7f033dSHerbert Xu 
156da7f033dSHerbert Xu 	res->err = err;
157da7f033dSHerbert Xu 	complete(&res->completion);
158da7f033dSHerbert Xu }
159da7f033dSHerbert Xu 
160f8b0d4d0SHerbert Xu static int testmgr_alloc_buf(char *buf[XBUFSIZE])
161f8b0d4d0SHerbert Xu {
162f8b0d4d0SHerbert Xu 	int i;
163f8b0d4d0SHerbert Xu 
164f8b0d4d0SHerbert Xu 	for (i = 0; i < XBUFSIZE; i++) {
165f8b0d4d0SHerbert Xu 		buf[i] = (void *)__get_free_page(GFP_KERNEL);
166f8b0d4d0SHerbert Xu 		if (!buf[i])
167f8b0d4d0SHerbert Xu 			goto err_free_buf;
168f8b0d4d0SHerbert Xu 	}
169f8b0d4d0SHerbert Xu 
170f8b0d4d0SHerbert Xu 	return 0;
171f8b0d4d0SHerbert Xu 
172f8b0d4d0SHerbert Xu err_free_buf:
173f8b0d4d0SHerbert Xu 	while (i-- > 0)
174f8b0d4d0SHerbert Xu 		free_page((unsigned long)buf[i]);
175f8b0d4d0SHerbert Xu 
176f8b0d4d0SHerbert Xu 	return -ENOMEM;
177f8b0d4d0SHerbert Xu }
178f8b0d4d0SHerbert Xu 
179f8b0d4d0SHerbert Xu static void testmgr_free_buf(char *buf[XBUFSIZE])
180f8b0d4d0SHerbert Xu {
181f8b0d4d0SHerbert Xu 	int i;
182f8b0d4d0SHerbert Xu 
183f8b0d4d0SHerbert Xu 	for (i = 0; i < XBUFSIZE; i++)
184f8b0d4d0SHerbert Xu 		free_page((unsigned long)buf[i]);
185f8b0d4d0SHerbert Xu }
186f8b0d4d0SHerbert Xu 
187d4c85f9bSCristian Stoica static int wait_async_op(struct tcrypt_result *tr, int ret)
188a8f1a052SDavid S. Miller {
189a8f1a052SDavid S. Miller 	if (ret == -EINPROGRESS || ret == -EBUSY) {
1908a45ac12SRabin Vincent 		wait_for_completion(&tr->completion);
19116735d02SWolfram Sang 		reinit_completion(&tr->completion);
1928a45ac12SRabin Vincent 		ret = tr->err;
193a8f1a052SDavid S. Miller 	}
194a8f1a052SDavid S. Miller 	return ret;
195a8f1a052SDavid S. Miller }
196a8f1a052SDavid S. Miller 
197018ba95cSWang, Rui Y static int ahash_partial_update(struct ahash_request **preq,
198018ba95cSWang, Rui Y 	struct crypto_ahash *tfm, struct hash_testvec *template,
199018ba95cSWang, Rui Y 	void *hash_buff, int k, int temp, struct scatterlist *sg,
200018ba95cSWang, Rui Y 	const char *algo, char *result, struct tcrypt_result *tresult)
201018ba95cSWang, Rui Y {
202018ba95cSWang, Rui Y 	char *state;
203018ba95cSWang, Rui Y 	struct ahash_request *req;
204018ba95cSWang, Rui Y 	int statesize, ret = -EINVAL;
205018ba95cSWang, Rui Y 
206018ba95cSWang, Rui Y 	req = *preq;
207018ba95cSWang, Rui Y 	statesize = crypto_ahash_statesize(
208018ba95cSWang, Rui Y 			crypto_ahash_reqtfm(req));
209018ba95cSWang, Rui Y 	state = kmalloc(statesize, GFP_KERNEL);
210018ba95cSWang, Rui Y 	if (!state) {
211018ba95cSWang, Rui Y 		pr_err("alt: hash: Failed to alloc state for %s\n", algo);
212018ba95cSWang, Rui Y 		goto out_nostate;
213018ba95cSWang, Rui Y 	}
214018ba95cSWang, Rui Y 	ret = crypto_ahash_export(req, state);
215018ba95cSWang, Rui Y 	if (ret) {
216018ba95cSWang, Rui Y 		pr_err("alt: hash: Failed to export() for %s\n", algo);
217018ba95cSWang, Rui Y 		goto out;
218018ba95cSWang, Rui Y 	}
219018ba95cSWang, Rui Y 	ahash_request_free(req);
220018ba95cSWang, Rui Y 	req = ahash_request_alloc(tfm, GFP_KERNEL);
221018ba95cSWang, Rui Y 	if (!req) {
222018ba95cSWang, Rui Y 		pr_err("alg: hash: Failed to alloc request for %s\n", algo);
223018ba95cSWang, Rui Y 		goto out_noreq;
224018ba95cSWang, Rui Y 	}
225018ba95cSWang, Rui Y 	ahash_request_set_callback(req,
226018ba95cSWang, Rui Y 		CRYPTO_TFM_REQ_MAY_BACKLOG,
227018ba95cSWang, Rui Y 		tcrypt_complete, tresult);
228018ba95cSWang, Rui Y 
229018ba95cSWang, Rui Y 	memcpy(hash_buff, template->plaintext + temp,
230018ba95cSWang, Rui Y 		template->tap[k]);
231018ba95cSWang, Rui Y 	sg_init_one(&sg[0], hash_buff, template->tap[k]);
232018ba95cSWang, Rui Y 	ahash_request_set_crypt(req, sg, result, template->tap[k]);
233018ba95cSWang, Rui Y 	ret = crypto_ahash_import(req, state);
234018ba95cSWang, Rui Y 	if (ret) {
235018ba95cSWang, Rui Y 		pr_err("alg: hash: Failed to import() for %s\n", algo);
236018ba95cSWang, Rui Y 		goto out;
237018ba95cSWang, Rui Y 	}
238018ba95cSWang, Rui Y 	ret = wait_async_op(tresult, crypto_ahash_update(req));
239018ba95cSWang, Rui Y 	if (ret)
240018ba95cSWang, Rui Y 		goto out;
241018ba95cSWang, Rui Y 	*preq = req;
242018ba95cSWang, Rui Y 	ret = 0;
243018ba95cSWang, Rui Y 	goto out_noreq;
244018ba95cSWang, Rui Y out:
245018ba95cSWang, Rui Y 	ahash_request_free(req);
246018ba95cSWang, Rui Y out_noreq:
247018ba95cSWang, Rui Y 	kfree(state);
248018ba95cSWang, Rui Y out_nostate:
249018ba95cSWang, Rui Y 	return ret;
250018ba95cSWang, Rui Y }
251018ba95cSWang, Rui Y 
252da5ffe11SJussi Kivilinna static int __test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
253da5ffe11SJussi Kivilinna 		       unsigned int tcount, bool use_digest,
254da5ffe11SJussi Kivilinna 		       const int align_offset)
255da7f033dSHerbert Xu {
256da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
257da7f033dSHerbert Xu 	unsigned int i, j, k, temp;
258da7f033dSHerbert Xu 	struct scatterlist sg[8];
25929b77e5dSHoria Geanta 	char *result;
26029b77e5dSHoria Geanta 	char *key;
261da7f033dSHerbert Xu 	struct ahash_request *req;
262da7f033dSHerbert Xu 	struct tcrypt_result tresult;
263da7f033dSHerbert Xu 	void *hash_buff;
264f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
265f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
266f8b0d4d0SHerbert Xu 
26729b77e5dSHoria Geanta 	result = kmalloc(MAX_DIGEST_SIZE, GFP_KERNEL);
26829b77e5dSHoria Geanta 	if (!result)
26929b77e5dSHoria Geanta 		return ret;
27029b77e5dSHoria Geanta 	key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
27129b77e5dSHoria Geanta 	if (!key)
27229b77e5dSHoria Geanta 		goto out_nobuf;
273f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
274f8b0d4d0SHerbert Xu 		goto out_nobuf;
275da7f033dSHerbert Xu 
276da7f033dSHerbert Xu 	init_completion(&tresult.completion);
277da7f033dSHerbert Xu 
278da7f033dSHerbert Xu 	req = ahash_request_alloc(tfm, GFP_KERNEL);
279da7f033dSHerbert Xu 	if (!req) {
280da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to allocate request for "
281da7f033dSHerbert Xu 		       "%s\n", algo);
282da7f033dSHerbert Xu 		goto out_noreq;
283da7f033dSHerbert Xu 	}
284da7f033dSHerbert Xu 	ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
285da7f033dSHerbert Xu 				   tcrypt_complete, &tresult);
286da7f033dSHerbert Xu 
287a0cfae59SHerbert Xu 	j = 0;
288da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
289a0cfae59SHerbert Xu 		if (template[i].np)
290a0cfae59SHerbert Xu 			continue;
291a0cfae59SHerbert Xu 
292da5ffe11SJussi Kivilinna 		ret = -EINVAL;
293da5ffe11SJussi Kivilinna 		if (WARN_ON(align_offset + template[i].psize > PAGE_SIZE))
294da5ffe11SJussi Kivilinna 			goto out;
295da5ffe11SJussi Kivilinna 
296a0cfae59SHerbert Xu 		j++;
29729b77e5dSHoria Geanta 		memset(result, 0, MAX_DIGEST_SIZE);
298da7f033dSHerbert Xu 
299da7f033dSHerbert Xu 		hash_buff = xbuf[0];
300da5ffe11SJussi Kivilinna 		hash_buff += align_offset;
301da7f033dSHerbert Xu 
302da7f033dSHerbert Xu 		memcpy(hash_buff, template[i].plaintext, template[i].psize);
303da7f033dSHerbert Xu 		sg_init_one(&sg[0], hash_buff, template[i].psize);
304da7f033dSHerbert Xu 
305da7f033dSHerbert Xu 		if (template[i].ksize) {
306da7f033dSHerbert Xu 			crypto_ahash_clear_flags(tfm, ~0);
30729b77e5dSHoria Geanta 			if (template[i].ksize > MAX_KEYLEN) {
30829b77e5dSHoria Geanta 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
30929b77e5dSHoria Geanta 				       j, algo, template[i].ksize, MAX_KEYLEN);
31029b77e5dSHoria Geanta 				ret = -EINVAL;
31129b77e5dSHoria Geanta 				goto out;
31229b77e5dSHoria Geanta 			}
31329b77e5dSHoria Geanta 			memcpy(key, template[i].key, template[i].ksize);
31429b77e5dSHoria Geanta 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
315da7f033dSHerbert Xu 			if (ret) {
316da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: setkey failed on "
317a0cfae59SHerbert Xu 				       "test %d for %s: ret=%d\n", j, algo,
318da7f033dSHerbert Xu 				       -ret);
319da7f033dSHerbert Xu 				goto out;
320da7f033dSHerbert Xu 			}
321da7f033dSHerbert Xu 		}
322da7f033dSHerbert Xu 
323da7f033dSHerbert Xu 		ahash_request_set_crypt(req, sg, result, template[i].psize);
324a8f1a052SDavid S. Miller 		if (use_digest) {
325d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_digest(req));
326a8f1a052SDavid S. Miller 			if (ret) {
327a8f1a052SDavid S. Miller 				pr_err("alg: hash: digest failed on test %d "
328a0cfae59SHerbert Xu 				       "for %s: ret=%d\n", j, algo, -ret);
329da7f033dSHerbert Xu 				goto out;
330da7f033dSHerbert Xu 			}
331a8f1a052SDavid S. Miller 		} else {
332d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_init(req));
333a8f1a052SDavid S. Miller 			if (ret) {
334a8f1a052SDavid S. Miller 				pr_err("alt: hash: init failed on test %d "
335a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
336a8f1a052SDavid S. Miller 				goto out;
337a8f1a052SDavid S. Miller 			}
338d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_update(req));
339a8f1a052SDavid S. Miller 			if (ret) {
340a8f1a052SDavid S. Miller 				pr_err("alt: hash: update failed on test %d "
341a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
342a8f1a052SDavid S. Miller 				goto out;
343a8f1a052SDavid S. Miller 			}
344d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_final(req));
345a8f1a052SDavid S. Miller 			if (ret) {
346a8f1a052SDavid S. Miller 				pr_err("alt: hash: final failed on test %d "
347a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
348a8f1a052SDavid S. Miller 				goto out;
349a8f1a052SDavid S. Miller 			}
350a8f1a052SDavid S. Miller 		}
351da7f033dSHerbert Xu 
352da7f033dSHerbert Xu 		if (memcmp(result, template[i].digest,
353da7f033dSHerbert Xu 			   crypto_ahash_digestsize(tfm))) {
354da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
355a0cfae59SHerbert Xu 			       j, algo);
356da7f033dSHerbert Xu 			hexdump(result, crypto_ahash_digestsize(tfm));
357da7f033dSHerbert Xu 			ret = -EINVAL;
358da7f033dSHerbert Xu 			goto out;
359da7f033dSHerbert Xu 		}
360da7f033dSHerbert Xu 	}
361da7f033dSHerbert Xu 
362da7f033dSHerbert Xu 	j = 0;
363da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
364da5ffe11SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
365da5ffe11SJussi Kivilinna 		if (align_offset != 0)
366da5ffe11SJussi Kivilinna 			break;
367da5ffe11SJussi Kivilinna 
3685f2b424eSCristian Stoica 		if (!template[i].np)
3695f2b424eSCristian Stoica 			continue;
3705f2b424eSCristian Stoica 
371da7f033dSHerbert Xu 		j++;
37229b77e5dSHoria Geanta 		memset(result, 0, MAX_DIGEST_SIZE);
373da7f033dSHerbert Xu 
374da7f033dSHerbert Xu 		temp = 0;
375da7f033dSHerbert Xu 		sg_init_table(sg, template[i].np);
376fd57f22aSHerbert Xu 		ret = -EINVAL;
377da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
378fd57f22aSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
379fd57f22aSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
380fd57f22aSHerbert Xu 				goto out;
381da7f033dSHerbert Xu 			sg_set_buf(&sg[k],
382da7f033dSHerbert Xu 				   memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
383da7f033dSHerbert Xu 					  offset_in_page(IDX[k]),
384da7f033dSHerbert Xu 					  template[i].plaintext + temp,
385da7f033dSHerbert Xu 					  template[i].tap[k]),
386da7f033dSHerbert Xu 				   template[i].tap[k]);
387da7f033dSHerbert Xu 			temp += template[i].tap[k];
388da7f033dSHerbert Xu 		}
389da7f033dSHerbert Xu 
390da7f033dSHerbert Xu 		if (template[i].ksize) {
39129b77e5dSHoria Geanta 			if (template[i].ksize > MAX_KEYLEN) {
39229b77e5dSHoria Geanta 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
3935f2b424eSCristian Stoica 				       j, algo, template[i].ksize, MAX_KEYLEN);
39429b77e5dSHoria Geanta 				ret = -EINVAL;
39529b77e5dSHoria Geanta 				goto out;
39629b77e5dSHoria Geanta 			}
397da7f033dSHerbert Xu 			crypto_ahash_clear_flags(tfm, ~0);
39829b77e5dSHoria Geanta 			memcpy(key, template[i].key, template[i].ksize);
3995f2b424eSCristian Stoica 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
400da7f033dSHerbert Xu 
401da7f033dSHerbert Xu 			if (ret) {
402da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: setkey "
403da7f033dSHerbert Xu 				       "failed on chunking test %d "
4045f2b424eSCristian Stoica 				       "for %s: ret=%d\n", j, algo, -ret);
405da7f033dSHerbert Xu 				goto out;
406da7f033dSHerbert Xu 			}
407da7f033dSHerbert Xu 		}
408da7f033dSHerbert Xu 
4095f2b424eSCristian Stoica 		ahash_request_set_crypt(req, sg, result, template[i].psize);
410da7f033dSHerbert Xu 		ret = crypto_ahash_digest(req);
411da7f033dSHerbert Xu 		switch (ret) {
412da7f033dSHerbert Xu 		case 0:
413da7f033dSHerbert Xu 			break;
414da7f033dSHerbert Xu 		case -EINPROGRESS:
415da7f033dSHerbert Xu 		case -EBUSY:
4168a45ac12SRabin Vincent 			wait_for_completion(&tresult.completion);
41716735d02SWolfram Sang 			reinit_completion(&tresult.completion);
4188a45ac12SRabin Vincent 			ret = tresult.err;
4198a45ac12SRabin Vincent 			if (!ret)
420da7f033dSHerbert Xu 				break;
421da7f033dSHerbert Xu 			/* fall through */
422da7f033dSHerbert Xu 		default:
423da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: digest failed "
424da7f033dSHerbert Xu 			       "on chunking test %d for %s: "
425da7f033dSHerbert Xu 			       "ret=%d\n", j, algo, -ret);
426da7f033dSHerbert Xu 			goto out;
427da7f033dSHerbert Xu 		}
428da7f033dSHerbert Xu 
429da7f033dSHerbert Xu 		if (memcmp(result, template[i].digest,
430da7f033dSHerbert Xu 			   crypto_ahash_digestsize(tfm))) {
431da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: Chunking test %d "
432da7f033dSHerbert Xu 			       "failed for %s\n", j, algo);
433da7f033dSHerbert Xu 			hexdump(result, crypto_ahash_digestsize(tfm));
434da7f033dSHerbert Xu 			ret = -EINVAL;
435da7f033dSHerbert Xu 			goto out;
436da7f033dSHerbert Xu 		}
437da7f033dSHerbert Xu 	}
438da7f033dSHerbert Xu 
439018ba95cSWang, Rui Y 	/* partial update exercise */
440018ba95cSWang, Rui Y 	j = 0;
441018ba95cSWang, Rui Y 	for (i = 0; i < tcount; i++) {
442018ba95cSWang, Rui Y 		/* alignment tests are only done with continuous buffers */
443018ba95cSWang, Rui Y 		if (align_offset != 0)
444018ba95cSWang, Rui Y 			break;
445018ba95cSWang, Rui Y 
446018ba95cSWang, Rui Y 		if (template[i].np < 2)
447018ba95cSWang, Rui Y 			continue;
448018ba95cSWang, Rui Y 
449018ba95cSWang, Rui Y 		j++;
450018ba95cSWang, Rui Y 		memset(result, 0, MAX_DIGEST_SIZE);
451018ba95cSWang, Rui Y 
452018ba95cSWang, Rui Y 		ret = -EINVAL;
453018ba95cSWang, Rui Y 		hash_buff = xbuf[0];
454018ba95cSWang, Rui Y 		memcpy(hash_buff, template[i].plaintext,
455018ba95cSWang, Rui Y 			template[i].tap[0]);
456018ba95cSWang, Rui Y 		sg_init_one(&sg[0], hash_buff, template[i].tap[0]);
457018ba95cSWang, Rui Y 
458018ba95cSWang, Rui Y 		if (template[i].ksize) {
459018ba95cSWang, Rui Y 			crypto_ahash_clear_flags(tfm, ~0);
460018ba95cSWang, Rui Y 			if (template[i].ksize > MAX_KEYLEN) {
461018ba95cSWang, Rui Y 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
462018ba95cSWang, Rui Y 					j, algo, template[i].ksize, MAX_KEYLEN);
463018ba95cSWang, Rui Y 				ret = -EINVAL;
464018ba95cSWang, Rui Y 				goto out;
465018ba95cSWang, Rui Y 			}
466018ba95cSWang, Rui Y 			memcpy(key, template[i].key, template[i].ksize);
467018ba95cSWang, Rui Y 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
468018ba95cSWang, Rui Y 			if (ret) {
469018ba95cSWang, Rui Y 				pr_err("alg: hash: setkey failed on test %d for %s: ret=%d\n",
470018ba95cSWang, Rui Y 					j, algo, -ret);
471018ba95cSWang, Rui Y 				goto out;
472018ba95cSWang, Rui Y 			}
473018ba95cSWang, Rui Y 		}
474018ba95cSWang, Rui Y 
475018ba95cSWang, Rui Y 		ahash_request_set_crypt(req, sg, result, template[i].tap[0]);
476018ba95cSWang, Rui Y 		ret = wait_async_op(&tresult, crypto_ahash_init(req));
477018ba95cSWang, Rui Y 		if (ret) {
478018ba95cSWang, Rui Y 			pr_err("alt: hash: init 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 		ret = wait_async_op(&tresult, crypto_ahash_update(req));
483018ba95cSWang, Rui Y 		if (ret) {
484018ba95cSWang, Rui Y 			pr_err("alt: hash: update failed on test %d for %s: ret=%d\n",
485018ba95cSWang, Rui Y 				j, algo, -ret);
486018ba95cSWang, Rui Y 			goto out;
487018ba95cSWang, Rui Y 		}
488018ba95cSWang, Rui Y 
489018ba95cSWang, Rui Y 		temp = template[i].tap[0];
490018ba95cSWang, Rui Y 		for (k = 1; k < template[i].np; k++) {
491018ba95cSWang, Rui Y 			ret = ahash_partial_update(&req, tfm, &template[i],
492018ba95cSWang, Rui Y 				hash_buff, k, temp, &sg[0], algo, result,
493018ba95cSWang, Rui Y 				&tresult);
494018ba95cSWang, Rui Y 			if (ret) {
495018ba95cSWang, Rui Y 				pr_err("hash: partial update failed on test %d for %s: ret=%d\n",
496018ba95cSWang, Rui Y 					j, algo, -ret);
497018ba95cSWang, Rui Y 				goto out_noreq;
498018ba95cSWang, Rui Y 			}
499018ba95cSWang, Rui Y 			temp += template[i].tap[k];
500018ba95cSWang, Rui Y 		}
501018ba95cSWang, Rui Y 		ret = wait_async_op(&tresult, crypto_ahash_final(req));
502018ba95cSWang, Rui Y 		if (ret) {
503018ba95cSWang, Rui Y 			pr_err("alt: hash: final failed on test %d for %s: ret=%d\n",
504018ba95cSWang, Rui Y 				j, algo, -ret);
505018ba95cSWang, Rui Y 			goto out;
506018ba95cSWang, Rui Y 		}
507018ba95cSWang, Rui Y 		if (memcmp(result, template[i].digest,
508018ba95cSWang, Rui Y 			   crypto_ahash_digestsize(tfm))) {
509018ba95cSWang, Rui Y 			pr_err("alg: hash: Partial Test %d failed for %s\n",
510018ba95cSWang, Rui Y 			       j, algo);
511018ba95cSWang, Rui Y 			hexdump(result, crypto_ahash_digestsize(tfm));
512018ba95cSWang, Rui Y 			ret = -EINVAL;
513018ba95cSWang, Rui Y 			goto out;
514018ba95cSWang, Rui Y 		}
515018ba95cSWang, Rui Y 	}
516018ba95cSWang, Rui Y 
517da7f033dSHerbert Xu 	ret = 0;
518da7f033dSHerbert Xu 
519da7f033dSHerbert Xu out:
520da7f033dSHerbert Xu 	ahash_request_free(req);
521da7f033dSHerbert Xu out_noreq:
522f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
523f8b0d4d0SHerbert Xu out_nobuf:
52429b77e5dSHoria Geanta 	kfree(key);
52529b77e5dSHoria Geanta 	kfree(result);
526da7f033dSHerbert Xu 	return ret;
527da7f033dSHerbert Xu }
528da7f033dSHerbert Xu 
529da5ffe11SJussi Kivilinna static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
530da5ffe11SJussi Kivilinna 		     unsigned int tcount, bool use_digest)
531da5ffe11SJussi Kivilinna {
532da5ffe11SJussi Kivilinna 	unsigned int alignmask;
533da5ffe11SJussi Kivilinna 	int ret;
534da5ffe11SJussi Kivilinna 
535da5ffe11SJussi Kivilinna 	ret = __test_hash(tfm, template, tcount, use_digest, 0);
536da5ffe11SJussi Kivilinna 	if (ret)
537da5ffe11SJussi Kivilinna 		return ret;
538da5ffe11SJussi Kivilinna 
539da5ffe11SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
540da5ffe11SJussi Kivilinna 	ret = __test_hash(tfm, template, tcount, use_digest, 1);
541da5ffe11SJussi Kivilinna 	if (ret)
542da5ffe11SJussi Kivilinna 		return ret;
543da5ffe11SJussi Kivilinna 
544da5ffe11SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
545da5ffe11SJussi Kivilinna 	if (alignmask) {
546da5ffe11SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
547da5ffe11SJussi Kivilinna 		ret = __test_hash(tfm, template, tcount, use_digest,
548da5ffe11SJussi Kivilinna 				  alignmask + 1);
549da5ffe11SJussi Kivilinna 		if (ret)
550da5ffe11SJussi Kivilinna 			return ret;
551da5ffe11SJussi Kivilinna 	}
552da5ffe11SJussi Kivilinna 
553da5ffe11SJussi Kivilinna 	return 0;
554da5ffe11SJussi Kivilinna }
555da5ffe11SJussi Kivilinna 
556d8a32ac2SJussi Kivilinna static int __test_aead(struct crypto_aead *tfm, int enc,
557d8a32ac2SJussi Kivilinna 		       struct aead_testvec *template, unsigned int tcount,
55858dcf548SJussi Kivilinna 		       const bool diff_dst, const int align_offset)
559da7f033dSHerbert Xu {
560da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
561da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
562f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
563da7f033dSHerbert Xu 	char *q;
564da7f033dSHerbert Xu 	char *key;
565da7f033dSHerbert Xu 	struct aead_request *req;
566d8a32ac2SJussi Kivilinna 	struct scatterlist *sg;
567d8a32ac2SJussi Kivilinna 	struct scatterlist *sgout;
568d8a32ac2SJussi Kivilinna 	const char *e, *d;
569da7f033dSHerbert Xu 	struct tcrypt_result result;
570424a5da6SCristian Stoica 	unsigned int authsize, iv_len;
571da7f033dSHerbert Xu 	void *input;
572d8a32ac2SJussi Kivilinna 	void *output;
573da7f033dSHerbert Xu 	void *assoc;
5749bac019dSTadeusz Struk 	char *iv;
575f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
576d8a32ac2SJussi Kivilinna 	char *xoutbuf[XBUFSIZE];
577f8b0d4d0SHerbert Xu 	char *axbuf[XBUFSIZE];
578f8b0d4d0SHerbert Xu 
5799bac019dSTadeusz Struk 	iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
5809bac019dSTadeusz Struk 	if (!iv)
5819bac019dSTadeusz Struk 		return ret;
58229b77e5dSHoria Geanta 	key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
58329b77e5dSHoria Geanta 	if (!key)
58429b77e5dSHoria Geanta 		goto out_noxbuf;
585f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
586f8b0d4d0SHerbert Xu 		goto out_noxbuf;
587f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(axbuf))
588f8b0d4d0SHerbert Xu 		goto out_noaxbuf;
589d8a32ac2SJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
590d8a32ac2SJussi Kivilinna 		goto out_nooutbuf;
591d8a32ac2SJussi Kivilinna 
592d8a32ac2SJussi Kivilinna 	/* avoid "the frame size is larger than 1024 bytes" compiler warning */
5938a525fcdSHerbert Xu 	sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 4 : 2), GFP_KERNEL);
594d8a32ac2SJussi Kivilinna 	if (!sg)
595d8a32ac2SJussi Kivilinna 		goto out_nosg;
5968a525fcdSHerbert Xu 	sgout = &sg[16];
597d8a32ac2SJussi Kivilinna 
598d8a32ac2SJussi Kivilinna 	if (diff_dst)
599d8a32ac2SJussi Kivilinna 		d = "-ddst";
600d8a32ac2SJussi Kivilinna 	else
601d8a32ac2SJussi Kivilinna 		d = "";
602d8a32ac2SJussi Kivilinna 
603da7f033dSHerbert Xu 	if (enc == ENCRYPT)
604da7f033dSHerbert Xu 		e = "encryption";
605da7f033dSHerbert Xu 	else
606da7f033dSHerbert Xu 		e = "decryption";
607da7f033dSHerbert Xu 
608da7f033dSHerbert Xu 	init_completion(&result.completion);
609da7f033dSHerbert Xu 
610da7f033dSHerbert Xu 	req = aead_request_alloc(tfm, GFP_KERNEL);
611da7f033dSHerbert Xu 	if (!req) {
612d8a32ac2SJussi Kivilinna 		pr_err("alg: aead%s: Failed to allocate request for %s\n",
613d8a32ac2SJussi Kivilinna 		       d, algo);
614da7f033dSHerbert Xu 		goto out;
615da7f033dSHerbert Xu 	}
616da7f033dSHerbert Xu 
617da7f033dSHerbert Xu 	aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
618da7f033dSHerbert Xu 				  tcrypt_complete, &result);
619da7f033dSHerbert Xu 
620abfa7f43SJerome Marchand 	iv_len = crypto_aead_ivsize(tfm);
621abfa7f43SJerome Marchand 
622da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
62305b1d338SCristian Stoica 		if (template[i].np)
62405b1d338SCristian Stoica 			continue;
62505b1d338SCristian Stoica 
626da7f033dSHerbert Xu 		j++;
627da7f033dSHerbert Xu 
62858dcf548SJussi Kivilinna 		/* some templates have no input data but they will
629da7f033dSHerbert Xu 		 * touch input
630da7f033dSHerbert Xu 		 */
631da7f033dSHerbert Xu 		input = xbuf[0];
63258dcf548SJussi Kivilinna 		input += align_offset;
633da7f033dSHerbert Xu 		assoc = axbuf[0];
634da7f033dSHerbert Xu 
635fd57f22aSHerbert Xu 		ret = -EINVAL;
63658dcf548SJussi Kivilinna 		if (WARN_ON(align_offset + template[i].ilen >
63758dcf548SJussi Kivilinna 			    PAGE_SIZE || template[i].alen > PAGE_SIZE))
638fd57f22aSHerbert Xu 			goto out;
639fd57f22aSHerbert Xu 
640da7f033dSHerbert Xu 		memcpy(input, template[i].input, template[i].ilen);
641da7f033dSHerbert Xu 		memcpy(assoc, template[i].assoc, template[i].alen);
642da7f033dSHerbert Xu 		if (template[i].iv)
643424a5da6SCristian Stoica 			memcpy(iv, template[i].iv, iv_len);
644da7f033dSHerbert Xu 		else
645424a5da6SCristian Stoica 			memset(iv, 0, iv_len);
646da7f033dSHerbert Xu 
647da7f033dSHerbert Xu 		crypto_aead_clear_flags(tfm, ~0);
648da7f033dSHerbert Xu 		if (template[i].wk)
64905b1d338SCristian Stoica 			crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
650da7f033dSHerbert Xu 
65129b77e5dSHoria Geanta 		if (template[i].klen > MAX_KEYLEN) {
65229b77e5dSHoria Geanta 			pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
65329b77e5dSHoria Geanta 			       d, j, algo, template[i].klen,
65429b77e5dSHoria Geanta 			       MAX_KEYLEN);
65529b77e5dSHoria Geanta 			ret = -EINVAL;
65629b77e5dSHoria Geanta 			goto out;
65729b77e5dSHoria Geanta 		}
65829b77e5dSHoria Geanta 		memcpy(key, template[i].key, template[i].klen);
659da7f033dSHerbert Xu 
66005b1d338SCristian Stoica 		ret = crypto_aead_setkey(tfm, key, template[i].klen);
661da7f033dSHerbert Xu 		if (!ret == template[i].fail) {
662d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n",
663d8a32ac2SJussi Kivilinna 			       d, j, algo, crypto_aead_get_flags(tfm));
664da7f033dSHerbert Xu 			goto out;
665da7f033dSHerbert Xu 		} else if (ret)
666da7f033dSHerbert Xu 			continue;
667da7f033dSHerbert Xu 
668da7f033dSHerbert Xu 		authsize = abs(template[i].rlen - template[i].ilen);
669da7f033dSHerbert Xu 		ret = crypto_aead_setauthsize(tfm, authsize);
670da7f033dSHerbert Xu 		if (ret) {
671d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n",
672d8a32ac2SJussi Kivilinna 			       d, authsize, j, algo);
673da7f033dSHerbert Xu 			goto out;
674da7f033dSHerbert Xu 		}
675da7f033dSHerbert Xu 
6768a525fcdSHerbert Xu 		k = !!template[i].alen;
6778a525fcdSHerbert Xu 		sg_init_table(sg, k + 1);
6788a525fcdSHerbert Xu 		sg_set_buf(&sg[0], assoc, template[i].alen);
6798a525fcdSHerbert Xu 		sg_set_buf(&sg[k], input,
68005b1d338SCristian Stoica 			   template[i].ilen + (enc ? authsize : 0));
681d8a32ac2SJussi Kivilinna 		output = input;
682d8a32ac2SJussi Kivilinna 
6838a525fcdSHerbert Xu 		if (diff_dst) {
6848a525fcdSHerbert Xu 			sg_init_table(sgout, k + 1);
6858a525fcdSHerbert Xu 			sg_set_buf(&sgout[0], assoc, template[i].alen);
6868a525fcdSHerbert Xu 
6878a525fcdSHerbert Xu 			output = xoutbuf[0];
6888a525fcdSHerbert Xu 			output += align_offset;
6898a525fcdSHerbert Xu 			sg_set_buf(&sgout[k], output,
6908a525fcdSHerbert Xu 				   template[i].rlen + (enc ? 0 : authsize));
6918a525fcdSHerbert Xu 		}
692da7f033dSHerbert Xu 
693d8a32ac2SJussi Kivilinna 		aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
694da7f033dSHerbert Xu 				       template[i].ilen, iv);
695da7f033dSHerbert Xu 
6968a525fcdSHerbert Xu 		aead_request_set_ad(req, template[i].alen);
697da7f033dSHerbert Xu 
69805b1d338SCristian Stoica 		ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req);
699da7f033dSHerbert Xu 
700da7f033dSHerbert Xu 		switch (ret) {
701da7f033dSHerbert Xu 		case 0:
702e44a1b44SJarod Wilson 			if (template[i].novrfy) {
703e44a1b44SJarod Wilson 				/* verification was supposed to fail */
704d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n",
705d8a32ac2SJussi Kivilinna 				       d, e, j, algo);
706e44a1b44SJarod Wilson 				/* so really, we got a bad message */
707e44a1b44SJarod Wilson 				ret = -EBADMSG;
708e44a1b44SJarod Wilson 				goto out;
709e44a1b44SJarod Wilson 			}
710da7f033dSHerbert Xu 			break;
711da7f033dSHerbert Xu 		case -EINPROGRESS:
712da7f033dSHerbert Xu 		case -EBUSY:
7138a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
71416735d02SWolfram Sang 			reinit_completion(&result.completion);
7158a45ac12SRabin Vincent 			ret = result.err;
7168a45ac12SRabin Vincent 			if (!ret)
717da7f033dSHerbert Xu 				break;
718e44a1b44SJarod Wilson 		case -EBADMSG:
719e44a1b44SJarod Wilson 			if (template[i].novrfy)
720e44a1b44SJarod Wilson 				/* verification failure was expected */
721e44a1b44SJarod Wilson 				continue;
722da7f033dSHerbert Xu 			/* fall through */
723da7f033dSHerbert Xu 		default:
724d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n",
725d8a32ac2SJussi Kivilinna 			       d, e, j, algo, -ret);
726da7f033dSHerbert Xu 			goto out;
727da7f033dSHerbert Xu 		}
728da7f033dSHerbert Xu 
729d8a32ac2SJussi Kivilinna 		q = output;
730da7f033dSHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
731d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Test %d failed on %s for %s\n",
732d8a32ac2SJussi Kivilinna 			       d, j, e, algo);
733da7f033dSHerbert Xu 			hexdump(q, template[i].rlen);
734da7f033dSHerbert Xu 			ret = -EINVAL;
735da7f033dSHerbert Xu 			goto out;
736da7f033dSHerbert Xu 		}
737da7f033dSHerbert Xu 	}
738da7f033dSHerbert Xu 
739da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
74058dcf548SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
74158dcf548SJussi Kivilinna 		if (align_offset != 0)
74258dcf548SJussi Kivilinna 			break;
74358dcf548SJussi Kivilinna 
74405b1d338SCristian Stoica 		if (!template[i].np)
74505b1d338SCristian Stoica 			continue;
74605b1d338SCristian Stoica 
747da7f033dSHerbert Xu 		j++;
748da7f033dSHerbert Xu 
749da7f033dSHerbert Xu 		if (template[i].iv)
750abfa7f43SJerome Marchand 			memcpy(iv, template[i].iv, iv_len);
751da7f033dSHerbert Xu 		else
752da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
753da7f033dSHerbert Xu 
754da7f033dSHerbert Xu 		crypto_aead_clear_flags(tfm, ~0);
755da7f033dSHerbert Xu 		if (template[i].wk)
75605b1d338SCristian Stoica 			crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
75729b77e5dSHoria Geanta 		if (template[i].klen > MAX_KEYLEN) {
75829b77e5dSHoria Geanta 			pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
75905b1d338SCristian Stoica 			       d, j, algo, template[i].klen, MAX_KEYLEN);
76029b77e5dSHoria Geanta 			ret = -EINVAL;
76129b77e5dSHoria Geanta 			goto out;
76229b77e5dSHoria Geanta 		}
76329b77e5dSHoria Geanta 		memcpy(key, template[i].key, template[i].klen);
764da7f033dSHerbert Xu 
765da7f033dSHerbert Xu 		ret = crypto_aead_setkey(tfm, key, template[i].klen);
766da7f033dSHerbert Xu 		if (!ret == template[i].fail) {
767d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n",
768d8a32ac2SJussi Kivilinna 			       d, j, algo, crypto_aead_get_flags(tfm));
769da7f033dSHerbert Xu 			goto out;
770da7f033dSHerbert Xu 		} else if (ret)
771da7f033dSHerbert Xu 			continue;
772da7f033dSHerbert Xu 
773da7f033dSHerbert Xu 		authsize = abs(template[i].rlen - template[i].ilen);
774da7f033dSHerbert Xu 
775da7f033dSHerbert Xu 		ret = -EINVAL;
7768a525fcdSHerbert Xu 		sg_init_table(sg, template[i].anp + template[i].np);
777d8a32ac2SJussi Kivilinna 		if (diff_dst)
7788a525fcdSHerbert Xu 			sg_init_table(sgout, template[i].anp + template[i].np);
7798a525fcdSHerbert Xu 
7808a525fcdSHerbert Xu 		ret = -EINVAL;
7818a525fcdSHerbert Xu 		for (k = 0, temp = 0; k < template[i].anp; k++) {
7828a525fcdSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
7838a525fcdSHerbert Xu 				    template[i].atap[k] > PAGE_SIZE))
7848a525fcdSHerbert Xu 				goto out;
7858a525fcdSHerbert Xu 			sg_set_buf(&sg[k],
7868a525fcdSHerbert Xu 				   memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
7878a525fcdSHerbert Xu 					  offset_in_page(IDX[k]),
7888a525fcdSHerbert Xu 					  template[i].assoc + temp,
7898a525fcdSHerbert Xu 					  template[i].atap[k]),
7908a525fcdSHerbert Xu 				   template[i].atap[k]);
7918a525fcdSHerbert Xu 			if (diff_dst)
7928a525fcdSHerbert Xu 				sg_set_buf(&sgout[k],
7938a525fcdSHerbert Xu 					   axbuf[IDX[k] >> PAGE_SHIFT] +
7948a525fcdSHerbert Xu 					   offset_in_page(IDX[k]),
7958a525fcdSHerbert Xu 					   template[i].atap[k]);
7968a525fcdSHerbert Xu 			temp += template[i].atap[k];
7978a525fcdSHerbert Xu 		}
7988a525fcdSHerbert Xu 
799da7f033dSHerbert Xu 		for (k = 0, temp = 0; k < template[i].np; k++) {
800da7f033dSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
801da7f033dSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
802da7f033dSHerbert Xu 				goto out;
803da7f033dSHerbert Xu 
80405b1d338SCristian Stoica 			q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
80505b1d338SCristian Stoica 			memcpy(q, template[i].input + temp, template[i].tap[k]);
8068a525fcdSHerbert Xu 			sg_set_buf(&sg[template[i].anp + k],
8078a525fcdSHerbert Xu 				   q, template[i].tap[k]);
808d8a32ac2SJussi Kivilinna 
809d8a32ac2SJussi Kivilinna 			if (diff_dst) {
810d8a32ac2SJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
811d8a32ac2SJussi Kivilinna 				    offset_in_page(IDX[k]);
812d8a32ac2SJussi Kivilinna 
813d8a32ac2SJussi Kivilinna 				memset(q, 0, template[i].tap[k]);
814d8a32ac2SJussi Kivilinna 
8158a525fcdSHerbert Xu 				sg_set_buf(&sgout[template[i].anp + k],
8168a525fcdSHerbert Xu 					   q, template[i].tap[k]);
817d8a32ac2SJussi Kivilinna 			}
818d8a32ac2SJussi Kivilinna 
8198ec25c51SHoria Geanta 			n = template[i].tap[k];
8208ec25c51SHoria Geanta 			if (k == template[i].np - 1 && enc)
8218ec25c51SHoria Geanta 				n += authsize;
8228ec25c51SHoria Geanta 			if (offset_in_page(q) + n < PAGE_SIZE)
8238ec25c51SHoria Geanta 				q[n] = 0;
8248ec25c51SHoria Geanta 
825da7f033dSHerbert Xu 			temp += template[i].tap[k];
826da7f033dSHerbert Xu 		}
827da7f033dSHerbert Xu 
828da7f033dSHerbert Xu 		ret = crypto_aead_setauthsize(tfm, authsize);
829da7f033dSHerbert Xu 		if (ret) {
830d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n",
831d8a32ac2SJussi Kivilinna 			       d, authsize, j, algo);
832da7f033dSHerbert Xu 			goto out;
833da7f033dSHerbert Xu 		}
834da7f033dSHerbert Xu 
835da7f033dSHerbert Xu 		if (enc) {
8368a525fcdSHerbert Xu 			if (WARN_ON(sg[template[i].anp + k - 1].offset +
8378a525fcdSHerbert Xu 				    sg[template[i].anp + k - 1].length +
8388a525fcdSHerbert Xu 				    authsize > PAGE_SIZE)) {
839da7f033dSHerbert Xu 				ret = -EINVAL;
840da7f033dSHerbert Xu 				goto out;
841da7f033dSHerbert Xu 			}
842da7f033dSHerbert Xu 
843d8a32ac2SJussi Kivilinna 			if (diff_dst)
8448a525fcdSHerbert Xu 				sgout[template[i].anp + k - 1].length +=
8458a525fcdSHerbert Xu 					authsize;
8468a525fcdSHerbert Xu 			sg[template[i].anp + k - 1].length += authsize;
847da7f033dSHerbert Xu 		}
848da7f033dSHerbert Xu 
849d8a32ac2SJussi Kivilinna 		aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
850da7f033dSHerbert Xu 				       template[i].ilen,
851da7f033dSHerbert Xu 				       iv);
852da7f033dSHerbert Xu 
8538a525fcdSHerbert Xu 		aead_request_set_ad(req, template[i].alen);
854da7f033dSHerbert Xu 
85505b1d338SCristian Stoica 		ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req);
856da7f033dSHerbert Xu 
857da7f033dSHerbert Xu 		switch (ret) {
858da7f033dSHerbert Xu 		case 0:
859e44a1b44SJarod Wilson 			if (template[i].novrfy) {
860e44a1b44SJarod Wilson 				/* verification was supposed to fail */
861d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n",
862d8a32ac2SJussi Kivilinna 				       d, e, j, algo);
863e44a1b44SJarod Wilson 				/* so really, we got a bad message */
864e44a1b44SJarod Wilson 				ret = -EBADMSG;
865e44a1b44SJarod Wilson 				goto out;
866e44a1b44SJarod Wilson 			}
867da7f033dSHerbert Xu 			break;
868da7f033dSHerbert Xu 		case -EINPROGRESS:
869da7f033dSHerbert Xu 		case -EBUSY:
8708a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
87116735d02SWolfram Sang 			reinit_completion(&result.completion);
8728a45ac12SRabin Vincent 			ret = result.err;
8738a45ac12SRabin Vincent 			if (!ret)
874da7f033dSHerbert Xu 				break;
875e44a1b44SJarod Wilson 		case -EBADMSG:
876e44a1b44SJarod Wilson 			if (template[i].novrfy)
877e44a1b44SJarod Wilson 				/* verification failure was expected */
878e44a1b44SJarod Wilson 				continue;
879da7f033dSHerbert Xu 			/* fall through */
880da7f033dSHerbert Xu 		default:
881d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n",
882d8a32ac2SJussi Kivilinna 			       d, e, j, algo, -ret);
883da7f033dSHerbert Xu 			goto out;
884da7f033dSHerbert Xu 		}
885da7f033dSHerbert Xu 
886da7f033dSHerbert Xu 		ret = -EINVAL;
887da7f033dSHerbert Xu 		for (k = 0, temp = 0; k < template[i].np; k++) {
888d8a32ac2SJussi Kivilinna 			if (diff_dst)
889d8a32ac2SJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
890d8a32ac2SJussi Kivilinna 				    offset_in_page(IDX[k]);
891d8a32ac2SJussi Kivilinna 			else
892da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
893da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
894da7f033dSHerbert Xu 
895da7f033dSHerbert Xu 			n = template[i].tap[k];
896da7f033dSHerbert Xu 			if (k == template[i].np - 1)
897da7f033dSHerbert Xu 				n += enc ? authsize : -authsize;
898da7f033dSHerbert Xu 
899da7f033dSHerbert Xu 			if (memcmp(q, template[i].result + temp, n)) {
900d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n",
901d8a32ac2SJussi Kivilinna 				       d, j, e, k, algo);
902da7f033dSHerbert Xu 				hexdump(q, n);
903da7f033dSHerbert Xu 				goto out;
904da7f033dSHerbert Xu 			}
905da7f033dSHerbert Xu 
906da7f033dSHerbert Xu 			q += n;
907da7f033dSHerbert Xu 			if (k == template[i].np - 1 && !enc) {
908d8a32ac2SJussi Kivilinna 				if (!diff_dst &&
909d8a32ac2SJussi Kivilinna 					memcmp(q, template[i].input +
910da7f033dSHerbert Xu 					      temp + n, authsize))
911da7f033dSHerbert Xu 					n = authsize;
912da7f033dSHerbert Xu 				else
913da7f033dSHerbert Xu 					n = 0;
914da7f033dSHerbert Xu 			} else {
91505b1d338SCristian Stoica 				for (n = 0; offset_in_page(q + n) && q[n]; n++)
916da7f033dSHerbert Xu 					;
917da7f033dSHerbert Xu 			}
918da7f033dSHerbert Xu 			if (n) {
919d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
920d8a32ac2SJussi Kivilinna 				       d, j, e, k, algo, n);
921da7f033dSHerbert Xu 				hexdump(q, n);
922da7f033dSHerbert Xu 				goto out;
923da7f033dSHerbert Xu 			}
924da7f033dSHerbert Xu 
925da7f033dSHerbert Xu 			temp += template[i].tap[k];
926da7f033dSHerbert Xu 		}
927da7f033dSHerbert Xu 	}
928da7f033dSHerbert Xu 
929da7f033dSHerbert Xu 	ret = 0;
930da7f033dSHerbert Xu 
931da7f033dSHerbert Xu out:
932da7f033dSHerbert Xu 	aead_request_free(req);
933d8a32ac2SJussi Kivilinna 	kfree(sg);
934d8a32ac2SJussi Kivilinna out_nosg:
935d8a32ac2SJussi Kivilinna 	if (diff_dst)
936d8a32ac2SJussi Kivilinna 		testmgr_free_buf(xoutbuf);
937d8a32ac2SJussi Kivilinna out_nooutbuf:
938f8b0d4d0SHerbert Xu 	testmgr_free_buf(axbuf);
939f8b0d4d0SHerbert Xu out_noaxbuf:
940f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
941f8b0d4d0SHerbert Xu out_noxbuf:
94229b77e5dSHoria Geanta 	kfree(key);
9439bac019dSTadeusz Struk 	kfree(iv);
944da7f033dSHerbert Xu 	return ret;
945da7f033dSHerbert Xu }
946da7f033dSHerbert Xu 
947d8a32ac2SJussi Kivilinna static int test_aead(struct crypto_aead *tfm, int enc,
948d8a32ac2SJussi Kivilinna 		     struct aead_testvec *template, unsigned int tcount)
949d8a32ac2SJussi Kivilinna {
95058dcf548SJussi Kivilinna 	unsigned int alignmask;
951d8a32ac2SJussi Kivilinna 	int ret;
952d8a32ac2SJussi Kivilinna 
953d8a32ac2SJussi Kivilinna 	/* test 'dst == src' case */
95458dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, false, 0);
955d8a32ac2SJussi Kivilinna 	if (ret)
956d8a32ac2SJussi Kivilinna 		return ret;
957d8a32ac2SJussi Kivilinna 
958d8a32ac2SJussi Kivilinna 	/* test 'dst != src' case */
95958dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, true, 0);
96058dcf548SJussi Kivilinna 	if (ret)
96158dcf548SJussi Kivilinna 		return ret;
96258dcf548SJussi Kivilinna 
96358dcf548SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
96458dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, true, 1);
96558dcf548SJussi Kivilinna 	if (ret)
96658dcf548SJussi Kivilinna 		return ret;
96758dcf548SJussi Kivilinna 
96858dcf548SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
96958dcf548SJussi Kivilinna 	if (alignmask) {
97058dcf548SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
97158dcf548SJussi Kivilinna 		ret = __test_aead(tfm, enc, template, tcount, true,
97258dcf548SJussi Kivilinna 				  alignmask + 1);
97358dcf548SJussi Kivilinna 		if (ret)
97458dcf548SJussi Kivilinna 			return ret;
97558dcf548SJussi Kivilinna 	}
97658dcf548SJussi Kivilinna 
97758dcf548SJussi Kivilinna 	return 0;
978d8a32ac2SJussi Kivilinna }
979d8a32ac2SJussi Kivilinna 
9801aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc,
9811aa4ecd9SHerbert Xu 		       struct cipher_testvec *template, unsigned int tcount)
9821aa4ecd9SHerbert Xu {
9831aa4ecd9SHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm));
9841aa4ecd9SHerbert Xu 	unsigned int i, j, k;
9851aa4ecd9SHerbert Xu 	char *q;
9861aa4ecd9SHerbert Xu 	const char *e;
9871aa4ecd9SHerbert Xu 	void *data;
988f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
989f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
990f8b0d4d0SHerbert Xu 
991f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
992f8b0d4d0SHerbert Xu 		goto out_nobuf;
9931aa4ecd9SHerbert Xu 
9941aa4ecd9SHerbert Xu 	if (enc == ENCRYPT)
9951aa4ecd9SHerbert Xu 	        e = "encryption";
9961aa4ecd9SHerbert Xu 	else
9971aa4ecd9SHerbert Xu 		e = "decryption";
9981aa4ecd9SHerbert Xu 
9991aa4ecd9SHerbert Xu 	j = 0;
10001aa4ecd9SHerbert Xu 	for (i = 0; i < tcount; i++) {
10011aa4ecd9SHerbert Xu 		if (template[i].np)
10021aa4ecd9SHerbert Xu 			continue;
10031aa4ecd9SHerbert Xu 
10041aa4ecd9SHerbert Xu 		j++;
10051aa4ecd9SHerbert Xu 
1006fd57f22aSHerbert Xu 		ret = -EINVAL;
1007fd57f22aSHerbert Xu 		if (WARN_ON(template[i].ilen > PAGE_SIZE))
1008fd57f22aSHerbert Xu 			goto out;
1009fd57f22aSHerbert Xu 
10101aa4ecd9SHerbert Xu 		data = xbuf[0];
10111aa4ecd9SHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
10121aa4ecd9SHerbert Xu 
10131aa4ecd9SHerbert Xu 		crypto_cipher_clear_flags(tfm, ~0);
10141aa4ecd9SHerbert Xu 		if (template[i].wk)
10151aa4ecd9SHerbert Xu 			crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
10161aa4ecd9SHerbert Xu 
10171aa4ecd9SHerbert Xu 		ret = crypto_cipher_setkey(tfm, template[i].key,
10181aa4ecd9SHerbert Xu 					   template[i].klen);
10191aa4ecd9SHerbert Xu 		if (!ret == template[i].fail) {
10201aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: setkey failed "
10211aa4ecd9SHerbert Xu 			       "on test %d for %s: flags=%x\n", j,
10221aa4ecd9SHerbert Xu 			       algo, crypto_cipher_get_flags(tfm));
10231aa4ecd9SHerbert Xu 			goto out;
10241aa4ecd9SHerbert Xu 		} else if (ret)
10251aa4ecd9SHerbert Xu 			continue;
10261aa4ecd9SHerbert Xu 
10271aa4ecd9SHerbert Xu 		for (k = 0; k < template[i].ilen;
10281aa4ecd9SHerbert Xu 		     k += crypto_cipher_blocksize(tfm)) {
10291aa4ecd9SHerbert Xu 			if (enc)
10301aa4ecd9SHerbert Xu 				crypto_cipher_encrypt_one(tfm, data + k,
10311aa4ecd9SHerbert Xu 							  data + k);
10321aa4ecd9SHerbert Xu 			else
10331aa4ecd9SHerbert Xu 				crypto_cipher_decrypt_one(tfm, data + k,
10341aa4ecd9SHerbert Xu 							  data + k);
10351aa4ecd9SHerbert Xu 		}
10361aa4ecd9SHerbert Xu 
10371aa4ecd9SHerbert Xu 		q = data;
10381aa4ecd9SHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
10391aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: Test %d failed "
10401aa4ecd9SHerbert Xu 			       "on %s for %s\n", j, e, algo);
10411aa4ecd9SHerbert Xu 			hexdump(q, template[i].rlen);
10421aa4ecd9SHerbert Xu 			ret = -EINVAL;
10431aa4ecd9SHerbert Xu 			goto out;
10441aa4ecd9SHerbert Xu 		}
10451aa4ecd9SHerbert Xu 	}
10461aa4ecd9SHerbert Xu 
10471aa4ecd9SHerbert Xu 	ret = 0;
10481aa4ecd9SHerbert Xu 
10491aa4ecd9SHerbert Xu out:
1050f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
1051f8b0d4d0SHerbert Xu out_nobuf:
10521aa4ecd9SHerbert Xu 	return ret;
10531aa4ecd9SHerbert Xu }
10541aa4ecd9SHerbert Xu 
105512773d93SHerbert Xu static int __test_skcipher(struct crypto_skcipher *tfm, int enc,
105608d6af8cSJussi Kivilinna 			   struct cipher_testvec *template, unsigned int tcount,
10573a338f20SJussi Kivilinna 			   const bool diff_dst, const int align_offset)
1058da7f033dSHerbert Xu {
1059da7f033dSHerbert Xu 	const char *algo =
106012773d93SHerbert Xu 		crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm));
1061da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
1062da7f033dSHerbert Xu 	char *q;
106312773d93SHerbert Xu 	struct skcipher_request *req;
1064da7f033dSHerbert Xu 	struct scatterlist sg[8];
106508d6af8cSJussi Kivilinna 	struct scatterlist sgout[8];
106608d6af8cSJussi Kivilinna 	const char *e, *d;
1067da7f033dSHerbert Xu 	struct tcrypt_result result;
1068da7f033dSHerbert Xu 	void *data;
1069da7f033dSHerbert Xu 	char iv[MAX_IVLEN];
1070f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
107108d6af8cSJussi Kivilinna 	char *xoutbuf[XBUFSIZE];
1072f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
107384cba178SAndrey Ryabinin 	unsigned int ivsize = crypto_skcipher_ivsize(tfm);
1074f8b0d4d0SHerbert Xu 
1075f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
1076f8b0d4d0SHerbert Xu 		goto out_nobuf;
1077da7f033dSHerbert Xu 
107808d6af8cSJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
107908d6af8cSJussi Kivilinna 		goto out_nooutbuf;
108008d6af8cSJussi Kivilinna 
108108d6af8cSJussi Kivilinna 	if (diff_dst)
108208d6af8cSJussi Kivilinna 		d = "-ddst";
108308d6af8cSJussi Kivilinna 	else
108408d6af8cSJussi Kivilinna 		d = "";
108508d6af8cSJussi Kivilinna 
1086da7f033dSHerbert Xu 	if (enc == ENCRYPT)
1087da7f033dSHerbert Xu 	        e = "encryption";
1088da7f033dSHerbert Xu 	else
1089da7f033dSHerbert Xu 		e = "decryption";
1090da7f033dSHerbert Xu 
1091da7f033dSHerbert Xu 	init_completion(&result.completion);
1092da7f033dSHerbert Xu 
109312773d93SHerbert Xu 	req = skcipher_request_alloc(tfm, GFP_KERNEL);
1094da7f033dSHerbert Xu 	if (!req) {
109508d6af8cSJussi Kivilinna 		pr_err("alg: skcipher%s: Failed to allocate request for %s\n",
109608d6af8cSJussi Kivilinna 		       d, algo);
1097da7f033dSHerbert Xu 		goto out;
1098da7f033dSHerbert Xu 	}
1099da7f033dSHerbert Xu 
110012773d93SHerbert Xu 	skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1101da7f033dSHerbert Xu 				      tcrypt_complete, &result);
1102da7f033dSHerbert Xu 
1103da7f033dSHerbert Xu 	j = 0;
1104da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
1105bbb9a7ddSCristian Stoica 		if (template[i].np && !template[i].also_non_np)
1106bbb9a7ddSCristian Stoica 			continue;
1107bbb9a7ddSCristian Stoica 
1108da7f033dSHerbert Xu 		if (template[i].iv)
110984cba178SAndrey Ryabinin 			memcpy(iv, template[i].iv, ivsize);
1110da7f033dSHerbert Xu 		else
1111da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
1112da7f033dSHerbert Xu 
1113da7f033dSHerbert Xu 		j++;
1114fd57f22aSHerbert Xu 		ret = -EINVAL;
1115a1aa44a2SCristian Stoica 		if (WARN_ON(align_offset + template[i].ilen > PAGE_SIZE))
1116fd57f22aSHerbert Xu 			goto out;
1117fd57f22aSHerbert Xu 
1118da7f033dSHerbert Xu 		data = xbuf[0];
11193a338f20SJussi Kivilinna 		data += align_offset;
1120da7f033dSHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
1121da7f033dSHerbert Xu 
112212773d93SHerbert Xu 		crypto_skcipher_clear_flags(tfm, ~0);
1123da7f033dSHerbert Xu 		if (template[i].wk)
112412773d93SHerbert Xu 			crypto_skcipher_set_flags(tfm,
112512773d93SHerbert Xu 						  CRYPTO_TFM_REQ_WEAK_KEY);
1126da7f033dSHerbert Xu 
112712773d93SHerbert Xu 		ret = crypto_skcipher_setkey(tfm, template[i].key,
1128da7f033dSHerbert Xu 					     template[i].klen);
1129da7f033dSHerbert Xu 		if (!ret == template[i].fail) {
113008d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n",
113112773d93SHerbert Xu 			       d, j, algo, crypto_skcipher_get_flags(tfm));
1132da7f033dSHerbert Xu 			goto out;
1133da7f033dSHerbert Xu 		} else if (ret)
1134da7f033dSHerbert Xu 			continue;
1135da7f033dSHerbert Xu 
1136da7f033dSHerbert Xu 		sg_init_one(&sg[0], data, template[i].ilen);
113708d6af8cSJussi Kivilinna 		if (diff_dst) {
113808d6af8cSJussi Kivilinna 			data = xoutbuf[0];
11393a338f20SJussi Kivilinna 			data += align_offset;
114008d6af8cSJussi Kivilinna 			sg_init_one(&sgout[0], data, template[i].ilen);
114108d6af8cSJussi Kivilinna 		}
1142da7f033dSHerbert Xu 
114312773d93SHerbert Xu 		skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1144da7f033dSHerbert Xu 					   template[i].ilen, iv);
114512773d93SHerbert Xu 		ret = enc ? crypto_skcipher_encrypt(req) :
114612773d93SHerbert Xu 			    crypto_skcipher_decrypt(req);
1147da7f033dSHerbert Xu 
1148da7f033dSHerbert Xu 		switch (ret) {
1149da7f033dSHerbert Xu 		case 0:
1150da7f033dSHerbert Xu 			break;
1151da7f033dSHerbert Xu 		case -EINPROGRESS:
1152da7f033dSHerbert Xu 		case -EBUSY:
11538a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
115416735d02SWolfram Sang 			reinit_completion(&result.completion);
11558a45ac12SRabin Vincent 			ret = result.err;
11568a45ac12SRabin Vincent 			if (!ret)
1157da7f033dSHerbert Xu 				break;
1158da7f033dSHerbert Xu 			/* fall through */
1159da7f033dSHerbert Xu 		default:
116008d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n",
116108d6af8cSJussi Kivilinna 			       d, e, j, algo, -ret);
1162da7f033dSHerbert Xu 			goto out;
1163da7f033dSHerbert Xu 		}
1164da7f033dSHerbert Xu 
1165da7f033dSHerbert Xu 		q = data;
1166da7f033dSHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
11678a826a34SBoris BREZILLON 			pr_err("alg: skcipher%s: Test %d failed (invalid result) on %s for %s\n",
116808d6af8cSJussi Kivilinna 			       d, j, e, algo);
1169da7f033dSHerbert Xu 			hexdump(q, template[i].rlen);
1170da7f033dSHerbert Xu 			ret = -EINVAL;
1171da7f033dSHerbert Xu 			goto out;
1172da7f033dSHerbert Xu 		}
11738a826a34SBoris BREZILLON 
11748a826a34SBoris BREZILLON 		if (template[i].iv_out &&
11758a826a34SBoris BREZILLON 		    memcmp(iv, template[i].iv_out,
11768a826a34SBoris BREZILLON 			   crypto_skcipher_ivsize(tfm))) {
11778a826a34SBoris BREZILLON 			pr_err("alg: skcipher%s: Test %d failed (invalid output IV) on %s for %s\n",
11788a826a34SBoris BREZILLON 			       d, j, e, algo);
11798a826a34SBoris BREZILLON 			hexdump(iv, crypto_skcipher_ivsize(tfm));
11808a826a34SBoris BREZILLON 			ret = -EINVAL;
11818a826a34SBoris BREZILLON 			goto out;
11828a826a34SBoris BREZILLON 		}
1183da7f033dSHerbert Xu 	}
1184da7f033dSHerbert Xu 
1185da7f033dSHerbert Xu 	j = 0;
1186da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
11873a338f20SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
11883a338f20SJussi Kivilinna 		if (align_offset != 0)
11893a338f20SJussi Kivilinna 			break;
1190da7f033dSHerbert Xu 
1191bbb9a7ddSCristian Stoica 		if (!template[i].np)
1192bbb9a7ddSCristian Stoica 			continue;
1193bbb9a7ddSCristian Stoica 
1194da7f033dSHerbert Xu 		if (template[i].iv)
119584cba178SAndrey Ryabinin 			memcpy(iv, template[i].iv, ivsize);
1196da7f033dSHerbert Xu 		else
1197da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
1198da7f033dSHerbert Xu 
1199da7f033dSHerbert Xu 		j++;
120012773d93SHerbert Xu 		crypto_skcipher_clear_flags(tfm, ~0);
1201da7f033dSHerbert Xu 		if (template[i].wk)
120212773d93SHerbert Xu 			crypto_skcipher_set_flags(tfm,
120312773d93SHerbert Xu 						  CRYPTO_TFM_REQ_WEAK_KEY);
1204da7f033dSHerbert Xu 
120512773d93SHerbert Xu 		ret = crypto_skcipher_setkey(tfm, template[i].key,
1206da7f033dSHerbert Xu 					     template[i].klen);
1207da7f033dSHerbert Xu 		if (!ret == template[i].fail) {
120808d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n",
120912773d93SHerbert Xu 			       d, j, algo, crypto_skcipher_get_flags(tfm));
1210da7f033dSHerbert Xu 			goto out;
1211da7f033dSHerbert Xu 		} else if (ret)
1212da7f033dSHerbert Xu 			continue;
1213da7f033dSHerbert Xu 
1214da7f033dSHerbert Xu 		temp = 0;
1215da7f033dSHerbert Xu 		ret = -EINVAL;
1216da7f033dSHerbert Xu 		sg_init_table(sg, template[i].np);
121708d6af8cSJussi Kivilinna 		if (diff_dst)
121808d6af8cSJussi Kivilinna 			sg_init_table(sgout, template[i].np);
1219da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
1220da7f033dSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
1221da7f033dSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
1222da7f033dSHerbert Xu 				goto out;
1223da7f033dSHerbert Xu 
1224a1aa44a2SCristian Stoica 			q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
1225da7f033dSHerbert Xu 
1226a1aa44a2SCristian Stoica 			memcpy(q, template[i].input + temp, template[i].tap[k]);
1227da7f033dSHerbert Xu 
1228a1aa44a2SCristian Stoica 			if (offset_in_page(q) + template[i].tap[k] < PAGE_SIZE)
1229da7f033dSHerbert Xu 				q[template[i].tap[k]] = 0;
1230da7f033dSHerbert Xu 
1231da7f033dSHerbert Xu 			sg_set_buf(&sg[k], q, template[i].tap[k]);
123208d6af8cSJussi Kivilinna 			if (diff_dst) {
123308d6af8cSJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
123408d6af8cSJussi Kivilinna 				    offset_in_page(IDX[k]);
123508d6af8cSJussi Kivilinna 
1236a1aa44a2SCristian Stoica 				sg_set_buf(&sgout[k], q, template[i].tap[k]);
123708d6af8cSJussi Kivilinna 
123808d6af8cSJussi Kivilinna 				memset(q, 0, template[i].tap[k]);
123908d6af8cSJussi Kivilinna 				if (offset_in_page(q) +
124008d6af8cSJussi Kivilinna 				    template[i].tap[k] < PAGE_SIZE)
124108d6af8cSJussi Kivilinna 					q[template[i].tap[k]] = 0;
124208d6af8cSJussi Kivilinna 			}
1243da7f033dSHerbert Xu 
1244da7f033dSHerbert Xu 			temp += template[i].tap[k];
1245da7f033dSHerbert Xu 		}
1246da7f033dSHerbert Xu 
124712773d93SHerbert Xu 		skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1248da7f033dSHerbert Xu 					   template[i].ilen, iv);
1249da7f033dSHerbert Xu 
125012773d93SHerbert Xu 		ret = enc ? crypto_skcipher_encrypt(req) :
125112773d93SHerbert Xu 			    crypto_skcipher_decrypt(req);
1252da7f033dSHerbert Xu 
1253da7f033dSHerbert Xu 		switch (ret) {
1254da7f033dSHerbert Xu 		case 0:
1255da7f033dSHerbert Xu 			break;
1256da7f033dSHerbert Xu 		case -EINPROGRESS:
1257da7f033dSHerbert Xu 		case -EBUSY:
12588a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
125916735d02SWolfram Sang 			reinit_completion(&result.completion);
12608a45ac12SRabin Vincent 			ret = result.err;
12618a45ac12SRabin Vincent 			if (!ret)
1262da7f033dSHerbert Xu 				break;
1263da7f033dSHerbert Xu 			/* fall through */
1264da7f033dSHerbert Xu 		default:
126508d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n",
126608d6af8cSJussi Kivilinna 			       d, e, j, algo, -ret);
1267da7f033dSHerbert Xu 			goto out;
1268da7f033dSHerbert Xu 		}
1269da7f033dSHerbert Xu 
1270da7f033dSHerbert Xu 		temp = 0;
1271da7f033dSHerbert Xu 		ret = -EINVAL;
1272da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
127308d6af8cSJussi Kivilinna 			if (diff_dst)
127408d6af8cSJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
127508d6af8cSJussi Kivilinna 				    offset_in_page(IDX[k]);
127608d6af8cSJussi Kivilinna 			else
1277da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
1278da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
1279da7f033dSHerbert Xu 
1280da7f033dSHerbert Xu 			if (memcmp(q, template[i].result + temp,
1281da7f033dSHerbert Xu 				   template[i].tap[k])) {
128208d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n",
128308d6af8cSJussi Kivilinna 				       d, j, e, k, algo);
1284da7f033dSHerbert Xu 				hexdump(q, template[i].tap[k]);
1285da7f033dSHerbert Xu 				goto out;
1286da7f033dSHerbert Xu 			}
1287da7f033dSHerbert Xu 
1288da7f033dSHerbert Xu 			q += template[i].tap[k];
1289da7f033dSHerbert Xu 			for (n = 0; offset_in_page(q + n) && q[n]; n++)
1290da7f033dSHerbert Xu 				;
1291da7f033dSHerbert Xu 			if (n) {
129208d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
129308d6af8cSJussi Kivilinna 				       d, j, e, k, algo, n);
1294da7f033dSHerbert Xu 				hexdump(q, n);
1295da7f033dSHerbert Xu 				goto out;
1296da7f033dSHerbert Xu 			}
1297da7f033dSHerbert Xu 			temp += template[i].tap[k];
1298da7f033dSHerbert Xu 		}
1299da7f033dSHerbert Xu 	}
1300da7f033dSHerbert Xu 
1301da7f033dSHerbert Xu 	ret = 0;
1302da7f033dSHerbert Xu 
1303da7f033dSHerbert Xu out:
130412773d93SHerbert Xu 	skcipher_request_free(req);
130508d6af8cSJussi Kivilinna 	if (diff_dst)
130608d6af8cSJussi Kivilinna 		testmgr_free_buf(xoutbuf);
130708d6af8cSJussi Kivilinna out_nooutbuf:
1308f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
1309f8b0d4d0SHerbert Xu out_nobuf:
1310da7f033dSHerbert Xu 	return ret;
1311da7f033dSHerbert Xu }
1312da7f033dSHerbert Xu 
131312773d93SHerbert Xu static int test_skcipher(struct crypto_skcipher *tfm, int enc,
131408d6af8cSJussi Kivilinna 			 struct cipher_testvec *template, unsigned int tcount)
131508d6af8cSJussi Kivilinna {
13163a338f20SJussi Kivilinna 	unsigned int alignmask;
131708d6af8cSJussi Kivilinna 	int ret;
131808d6af8cSJussi Kivilinna 
131908d6af8cSJussi Kivilinna 	/* test 'dst == src' case */
13203a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, false, 0);
132108d6af8cSJussi Kivilinna 	if (ret)
132208d6af8cSJussi Kivilinna 		return ret;
132308d6af8cSJussi Kivilinna 
132408d6af8cSJussi Kivilinna 	/* test 'dst != src' case */
13253a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 0);
13263a338f20SJussi Kivilinna 	if (ret)
13273a338f20SJussi Kivilinna 		return ret;
13283a338f20SJussi Kivilinna 
13293a338f20SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
13303a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 1);
13313a338f20SJussi Kivilinna 	if (ret)
13323a338f20SJussi Kivilinna 		return ret;
13333a338f20SJussi Kivilinna 
13343a338f20SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
13353a338f20SJussi Kivilinna 	if (alignmask) {
13363a338f20SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
13373a338f20SJussi Kivilinna 		ret = __test_skcipher(tfm, enc, template, tcount, true,
13383a338f20SJussi Kivilinna 				      alignmask + 1);
13393a338f20SJussi Kivilinna 		if (ret)
13403a338f20SJussi Kivilinna 			return ret;
13413a338f20SJussi Kivilinna 	}
13423a338f20SJussi Kivilinna 
13433a338f20SJussi Kivilinna 	return 0;
134408d6af8cSJussi Kivilinna }
134508d6af8cSJussi Kivilinna 
1346da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate,
1347da7f033dSHerbert Xu 		     struct comp_testvec *dtemplate, int ctcount, int dtcount)
1348da7f033dSHerbert Xu {
1349da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
1350da7f033dSHerbert Xu 	unsigned int i;
1351da7f033dSHerbert Xu 	char result[COMP_BUF_SIZE];
1352da7f033dSHerbert Xu 	int ret;
1353da7f033dSHerbert Xu 
1354da7f033dSHerbert Xu 	for (i = 0; i < ctcount; i++) {
1355c79cf910SGeert Uytterhoeven 		int ilen;
1356c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1357da7f033dSHerbert Xu 
1358da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1359da7f033dSHerbert Xu 
1360da7f033dSHerbert Xu 		ilen = ctemplate[i].inlen;
1361da7f033dSHerbert Xu 		ret = crypto_comp_compress(tfm, ctemplate[i].input,
1362da7f033dSHerbert Xu 		                           ilen, result, &dlen);
1363da7f033dSHerbert Xu 		if (ret) {
1364da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: compression failed "
1365da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1366da7f033dSHerbert Xu 			       -ret);
1367da7f033dSHerbert Xu 			goto out;
1368da7f033dSHerbert Xu 		}
1369da7f033dSHerbert Xu 
1370b812eb00SGeert Uytterhoeven 		if (dlen != ctemplate[i].outlen) {
1371b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Compression test %d "
1372b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1373b812eb00SGeert Uytterhoeven 			       dlen);
1374b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1375b812eb00SGeert Uytterhoeven 			goto out;
1376b812eb00SGeert Uytterhoeven 		}
1377b812eb00SGeert Uytterhoeven 
1378da7f033dSHerbert Xu 		if (memcmp(result, ctemplate[i].output, dlen)) {
1379da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Compression test %d "
1380da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1381da7f033dSHerbert Xu 			hexdump(result, dlen);
1382da7f033dSHerbert Xu 			ret = -EINVAL;
1383da7f033dSHerbert Xu 			goto out;
1384da7f033dSHerbert Xu 		}
1385da7f033dSHerbert Xu 	}
1386da7f033dSHerbert Xu 
1387da7f033dSHerbert Xu 	for (i = 0; i < dtcount; i++) {
1388c79cf910SGeert Uytterhoeven 		int ilen;
1389c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1390da7f033dSHerbert Xu 
1391da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1392da7f033dSHerbert Xu 
1393da7f033dSHerbert Xu 		ilen = dtemplate[i].inlen;
1394da7f033dSHerbert Xu 		ret = crypto_comp_decompress(tfm, dtemplate[i].input,
1395da7f033dSHerbert Xu 		                             ilen, result, &dlen);
1396da7f033dSHerbert Xu 		if (ret) {
1397da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: decompression failed "
1398da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1399da7f033dSHerbert Xu 			       -ret);
1400da7f033dSHerbert Xu 			goto out;
1401da7f033dSHerbert Xu 		}
1402da7f033dSHerbert Xu 
1403b812eb00SGeert Uytterhoeven 		if (dlen != dtemplate[i].outlen) {
1404b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Decompression test %d "
1405b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1406b812eb00SGeert Uytterhoeven 			       dlen);
1407b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1408b812eb00SGeert Uytterhoeven 			goto out;
1409b812eb00SGeert Uytterhoeven 		}
1410b812eb00SGeert Uytterhoeven 
1411da7f033dSHerbert Xu 		if (memcmp(result, dtemplate[i].output, dlen)) {
1412da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Decompression test %d "
1413da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1414da7f033dSHerbert Xu 			hexdump(result, dlen);
1415da7f033dSHerbert Xu 			ret = -EINVAL;
1416da7f033dSHerbert Xu 			goto out;
1417da7f033dSHerbert Xu 		}
1418da7f033dSHerbert Xu 	}
1419da7f033dSHerbert Xu 
1420da7f033dSHerbert Xu 	ret = 0;
1421da7f033dSHerbert Xu 
1422da7f033dSHerbert Xu out:
1423da7f033dSHerbert Xu 	return ret;
1424da7f033dSHerbert Xu }
1425da7f033dSHerbert Xu 
14267647d6ceSJarod Wilson static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template,
14277647d6ceSJarod Wilson 		      unsigned int tcount)
14287647d6ceSJarod Wilson {
14297647d6ceSJarod Wilson 	const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
1430fa4ef8a6SFelipe Contreras 	int err = 0, i, j, seedsize;
14317647d6ceSJarod Wilson 	u8 *seed;
14327647d6ceSJarod Wilson 	char result[32];
14337647d6ceSJarod Wilson 
14347647d6ceSJarod Wilson 	seedsize = crypto_rng_seedsize(tfm);
14357647d6ceSJarod Wilson 
14367647d6ceSJarod Wilson 	seed = kmalloc(seedsize, GFP_KERNEL);
14377647d6ceSJarod Wilson 	if (!seed) {
14387647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to allocate seed space "
14397647d6ceSJarod Wilson 		       "for %s\n", algo);
14407647d6ceSJarod Wilson 		return -ENOMEM;
14417647d6ceSJarod Wilson 	}
14427647d6ceSJarod Wilson 
14437647d6ceSJarod Wilson 	for (i = 0; i < tcount; i++) {
14447647d6ceSJarod Wilson 		memset(result, 0, 32);
14457647d6ceSJarod Wilson 
14467647d6ceSJarod Wilson 		memcpy(seed, template[i].v, template[i].vlen);
14477647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen, template[i].key,
14487647d6ceSJarod Wilson 		       template[i].klen);
14497647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen + template[i].klen,
14507647d6ceSJarod Wilson 		       template[i].dt, template[i].dtlen);
14517647d6ceSJarod Wilson 
14527647d6ceSJarod Wilson 		err = crypto_rng_reset(tfm, seed, seedsize);
14537647d6ceSJarod Wilson 		if (err) {
14547647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Failed to reset rng "
14557647d6ceSJarod Wilson 			       "for %s\n", algo);
14567647d6ceSJarod Wilson 			goto out;
14577647d6ceSJarod Wilson 		}
14587647d6ceSJarod Wilson 
14597647d6ceSJarod Wilson 		for (j = 0; j < template[i].loops; j++) {
14607647d6ceSJarod Wilson 			err = crypto_rng_get_bytes(tfm, result,
14617647d6ceSJarod Wilson 						   template[i].rlen);
146219e60e13SStephan Mueller 			if (err < 0) {
14637647d6ceSJarod Wilson 				printk(KERN_ERR "alg: cprng: Failed to obtain "
14647647d6ceSJarod Wilson 				       "the correct amount of random data for "
146519e60e13SStephan Mueller 				       "%s (requested %d)\n", algo,
146619e60e13SStephan Mueller 				       template[i].rlen);
14677647d6ceSJarod Wilson 				goto out;
14687647d6ceSJarod Wilson 			}
14697647d6ceSJarod Wilson 		}
14707647d6ceSJarod Wilson 
14717647d6ceSJarod Wilson 		err = memcmp(result, template[i].result,
14727647d6ceSJarod Wilson 			     template[i].rlen);
14737647d6ceSJarod Wilson 		if (err) {
14747647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Test %d failed for %s\n",
14757647d6ceSJarod Wilson 			       i, algo);
14767647d6ceSJarod Wilson 			hexdump(result, template[i].rlen);
14777647d6ceSJarod Wilson 			err = -EINVAL;
14787647d6ceSJarod Wilson 			goto out;
14797647d6ceSJarod Wilson 		}
14807647d6ceSJarod Wilson 	}
14817647d6ceSJarod Wilson 
14827647d6ceSJarod Wilson out:
14837647d6ceSJarod Wilson 	kfree(seed);
14847647d6ceSJarod Wilson 	return err;
14857647d6ceSJarod Wilson }
14867647d6ceSJarod Wilson 
1487da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
1488da7f033dSHerbert Xu 			 u32 type, u32 mask)
1489da7f033dSHerbert Xu {
1490da7f033dSHerbert Xu 	struct crypto_aead *tfm;
1491da7f033dSHerbert Xu 	int err = 0;
1492da7f033dSHerbert Xu 
1493425a8829SStephan Mueller 	tfm = crypto_alloc_aead(driver, type | CRYPTO_ALG_INTERNAL, mask);
1494da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1495da7f033dSHerbert Xu 		printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
1496da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1497da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1498da7f033dSHerbert Xu 	}
1499da7f033dSHerbert Xu 
1500da7f033dSHerbert Xu 	if (desc->suite.aead.enc.vecs) {
1501da7f033dSHerbert Xu 		err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
1502da7f033dSHerbert Xu 				desc->suite.aead.enc.count);
1503da7f033dSHerbert Xu 		if (err)
1504da7f033dSHerbert Xu 			goto out;
1505da7f033dSHerbert Xu 	}
1506da7f033dSHerbert Xu 
1507da7f033dSHerbert Xu 	if (!err && desc->suite.aead.dec.vecs)
1508da7f033dSHerbert Xu 		err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
1509da7f033dSHerbert Xu 				desc->suite.aead.dec.count);
1510da7f033dSHerbert Xu 
1511da7f033dSHerbert Xu out:
1512da7f033dSHerbert Xu 	crypto_free_aead(tfm);
1513da7f033dSHerbert Xu 	return err;
1514da7f033dSHerbert Xu }
1515da7f033dSHerbert Xu 
1516da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc,
1517da7f033dSHerbert Xu 			   const char *driver, u32 type, u32 mask)
1518da7f033dSHerbert Xu {
15191aa4ecd9SHerbert Xu 	struct crypto_cipher *tfm;
1520da7f033dSHerbert Xu 	int err = 0;
1521da7f033dSHerbert Xu 
1522425a8829SStephan Mueller 	tfm = crypto_alloc_cipher(driver, type | CRYPTO_ALG_INTERNAL, mask);
1523da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1524da7f033dSHerbert Xu 		printk(KERN_ERR "alg: cipher: Failed to load transform for "
1525da7f033dSHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
1526da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1527da7f033dSHerbert Xu 	}
1528da7f033dSHerbert Xu 
1529da7f033dSHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
1530da7f033dSHerbert Xu 		err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1531da7f033dSHerbert Xu 				  desc->suite.cipher.enc.count);
1532da7f033dSHerbert Xu 		if (err)
1533da7f033dSHerbert Xu 			goto out;
1534da7f033dSHerbert Xu 	}
1535da7f033dSHerbert Xu 
1536da7f033dSHerbert Xu 	if (desc->suite.cipher.dec.vecs)
1537da7f033dSHerbert Xu 		err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1538da7f033dSHerbert Xu 				  desc->suite.cipher.dec.count);
1539da7f033dSHerbert Xu 
1540da7f033dSHerbert Xu out:
15411aa4ecd9SHerbert Xu 	crypto_free_cipher(tfm);
15421aa4ecd9SHerbert Xu 	return err;
15431aa4ecd9SHerbert Xu }
15441aa4ecd9SHerbert Xu 
15451aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc,
15461aa4ecd9SHerbert Xu 			     const char *driver, u32 type, u32 mask)
15471aa4ecd9SHerbert Xu {
154812773d93SHerbert Xu 	struct crypto_skcipher *tfm;
15491aa4ecd9SHerbert Xu 	int err = 0;
15501aa4ecd9SHerbert Xu 
155112773d93SHerbert Xu 	tfm = crypto_alloc_skcipher(driver, type | CRYPTO_ALG_INTERNAL, mask);
15521aa4ecd9SHerbert Xu 	if (IS_ERR(tfm)) {
15531aa4ecd9SHerbert Xu 		printk(KERN_ERR "alg: skcipher: Failed to load transform for "
15541aa4ecd9SHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
15551aa4ecd9SHerbert Xu 		return PTR_ERR(tfm);
15561aa4ecd9SHerbert Xu 	}
15571aa4ecd9SHerbert Xu 
15581aa4ecd9SHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
15591aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
15601aa4ecd9SHerbert Xu 				    desc->suite.cipher.enc.count);
15611aa4ecd9SHerbert Xu 		if (err)
15621aa4ecd9SHerbert Xu 			goto out;
15631aa4ecd9SHerbert Xu 	}
15641aa4ecd9SHerbert Xu 
15651aa4ecd9SHerbert Xu 	if (desc->suite.cipher.dec.vecs)
15661aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
15671aa4ecd9SHerbert Xu 				    desc->suite.cipher.dec.count);
15681aa4ecd9SHerbert Xu 
15691aa4ecd9SHerbert Xu out:
157012773d93SHerbert Xu 	crypto_free_skcipher(tfm);
1571da7f033dSHerbert Xu 	return err;
1572da7f033dSHerbert Xu }
1573da7f033dSHerbert Xu 
1574da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
1575da7f033dSHerbert Xu 			 u32 type, u32 mask)
1576da7f033dSHerbert Xu {
1577da7f033dSHerbert Xu 	struct crypto_comp *tfm;
1578da7f033dSHerbert Xu 	int err;
1579da7f033dSHerbert Xu 
1580da7f033dSHerbert Xu 	tfm = crypto_alloc_comp(driver, type, mask);
1581da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1582da7f033dSHerbert Xu 		printk(KERN_ERR "alg: comp: Failed to load transform for %s: "
1583da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1584da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1585da7f033dSHerbert Xu 	}
1586da7f033dSHerbert Xu 
1587da7f033dSHerbert Xu 	err = test_comp(tfm, desc->suite.comp.comp.vecs,
1588da7f033dSHerbert Xu 			desc->suite.comp.decomp.vecs,
1589da7f033dSHerbert Xu 			desc->suite.comp.comp.count,
1590da7f033dSHerbert Xu 			desc->suite.comp.decomp.count);
1591da7f033dSHerbert Xu 
1592da7f033dSHerbert Xu 	crypto_free_comp(tfm);
1593da7f033dSHerbert Xu 	return err;
1594da7f033dSHerbert Xu }
1595da7f033dSHerbert Xu 
1596da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
1597da7f033dSHerbert Xu 			 u32 type, u32 mask)
1598da7f033dSHerbert Xu {
1599da7f033dSHerbert Xu 	struct crypto_ahash *tfm;
1600da7f033dSHerbert Xu 	int err;
1601da7f033dSHerbert Xu 
1602425a8829SStephan Mueller 	tfm = crypto_alloc_ahash(driver, type | CRYPTO_ALG_INTERNAL, mask);
1603da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1604da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
1605da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1606da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1607da7f033dSHerbert Xu 	}
1608da7f033dSHerbert Xu 
1609a8f1a052SDavid S. Miller 	err = test_hash(tfm, desc->suite.hash.vecs,
1610a8f1a052SDavid S. Miller 			desc->suite.hash.count, true);
1611a8f1a052SDavid S. Miller 	if (!err)
1612a8f1a052SDavid S. Miller 		err = test_hash(tfm, desc->suite.hash.vecs,
1613a8f1a052SDavid S. Miller 				desc->suite.hash.count, false);
1614da7f033dSHerbert Xu 
1615da7f033dSHerbert Xu 	crypto_free_ahash(tfm);
1616da7f033dSHerbert Xu 	return err;
1617da7f033dSHerbert Xu }
1618da7f033dSHerbert Xu 
16198e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc,
16208e3ee85eSHerbert Xu 			   const char *driver, u32 type, u32 mask)
16218e3ee85eSHerbert Xu {
16228e3ee85eSHerbert Xu 	struct crypto_shash *tfm;
16238e3ee85eSHerbert Xu 	u32 val;
16248e3ee85eSHerbert Xu 	int err;
16258e3ee85eSHerbert Xu 
16268e3ee85eSHerbert Xu 	err = alg_test_hash(desc, driver, type, mask);
16278e3ee85eSHerbert Xu 	if (err)
16288e3ee85eSHerbert Xu 		goto out;
16298e3ee85eSHerbert Xu 
1630425a8829SStephan Mueller 	tfm = crypto_alloc_shash(driver, type | CRYPTO_ALG_INTERNAL, mask);
16318e3ee85eSHerbert Xu 	if (IS_ERR(tfm)) {
16328e3ee85eSHerbert Xu 		printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
16338e3ee85eSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
16348e3ee85eSHerbert Xu 		err = PTR_ERR(tfm);
16358e3ee85eSHerbert Xu 		goto out;
16368e3ee85eSHerbert Xu 	}
16378e3ee85eSHerbert Xu 
16388e3ee85eSHerbert Xu 	do {
16394c5c3024SJan-Simon Möller 		SHASH_DESC_ON_STACK(shash, tfm);
16404c5c3024SJan-Simon Möller 		u32 *ctx = (u32 *)shash_desc_ctx(shash);
16418e3ee85eSHerbert Xu 
16424c5c3024SJan-Simon Möller 		shash->tfm = tfm;
16434c5c3024SJan-Simon Möller 		shash->flags = 0;
16448e3ee85eSHerbert Xu 
16454c5c3024SJan-Simon Möller 		*ctx = le32_to_cpu(420553207);
16464c5c3024SJan-Simon Möller 		err = crypto_shash_final(shash, (u8 *)&val);
16478e3ee85eSHerbert Xu 		if (err) {
16488e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Operation failed for "
16498e3ee85eSHerbert Xu 			       "%s: %d\n", driver, err);
16508e3ee85eSHerbert Xu 			break;
16518e3ee85eSHerbert Xu 		}
16528e3ee85eSHerbert Xu 
16538e3ee85eSHerbert Xu 		if (val != ~420553207) {
16548e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Test failed for %s: "
16558e3ee85eSHerbert Xu 			       "%d\n", driver, val);
16568e3ee85eSHerbert Xu 			err = -EINVAL;
16578e3ee85eSHerbert Xu 		}
16588e3ee85eSHerbert Xu 	} while (0);
16598e3ee85eSHerbert Xu 
16608e3ee85eSHerbert Xu 	crypto_free_shash(tfm);
16618e3ee85eSHerbert Xu 
16628e3ee85eSHerbert Xu out:
16638e3ee85eSHerbert Xu 	return err;
16648e3ee85eSHerbert Xu }
16658e3ee85eSHerbert Xu 
16667647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
16677647d6ceSJarod Wilson 			  u32 type, u32 mask)
16687647d6ceSJarod Wilson {
16697647d6ceSJarod Wilson 	struct crypto_rng *rng;
16707647d6ceSJarod Wilson 	int err;
16717647d6ceSJarod Wilson 
1672425a8829SStephan Mueller 	rng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask);
16737647d6ceSJarod Wilson 	if (IS_ERR(rng)) {
16747647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
16757647d6ceSJarod Wilson 		       "%ld\n", driver, PTR_ERR(rng));
16767647d6ceSJarod Wilson 		return PTR_ERR(rng);
16777647d6ceSJarod Wilson 	}
16787647d6ceSJarod Wilson 
16797647d6ceSJarod Wilson 	err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count);
16807647d6ceSJarod Wilson 
16817647d6ceSJarod Wilson 	crypto_free_rng(rng);
16827647d6ceSJarod Wilson 
16837647d6ceSJarod Wilson 	return err;
16847647d6ceSJarod Wilson }
16857647d6ceSJarod Wilson 
168664d1cdfbSStephan Mueller 
168764d1cdfbSStephan Mueller static int drbg_cavs_test(struct drbg_testvec *test, int pr,
168864d1cdfbSStephan Mueller 			  const char *driver, u32 type, u32 mask)
168964d1cdfbSStephan Mueller {
169064d1cdfbSStephan Mueller 	int ret = -EAGAIN;
169164d1cdfbSStephan Mueller 	struct crypto_rng *drng;
169264d1cdfbSStephan Mueller 	struct drbg_test_data test_data;
169364d1cdfbSStephan Mueller 	struct drbg_string addtl, pers, testentropy;
169464d1cdfbSStephan Mueller 	unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL);
169564d1cdfbSStephan Mueller 
169664d1cdfbSStephan Mueller 	if (!buf)
169764d1cdfbSStephan Mueller 		return -ENOMEM;
169864d1cdfbSStephan Mueller 
1699425a8829SStephan Mueller 	drng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask);
170064d1cdfbSStephan Mueller 	if (IS_ERR(drng)) {
170164d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for "
170264d1cdfbSStephan Mueller 		       "%s\n", driver);
170364d1cdfbSStephan Mueller 		kzfree(buf);
170464d1cdfbSStephan Mueller 		return -ENOMEM;
170564d1cdfbSStephan Mueller 	}
170664d1cdfbSStephan Mueller 
170764d1cdfbSStephan Mueller 	test_data.testentropy = &testentropy;
170864d1cdfbSStephan Mueller 	drbg_string_fill(&testentropy, test->entropy, test->entropylen);
170964d1cdfbSStephan Mueller 	drbg_string_fill(&pers, test->pers, test->perslen);
171064d1cdfbSStephan Mueller 	ret = crypto_drbg_reset_test(drng, &pers, &test_data);
171164d1cdfbSStephan Mueller 	if (ret) {
171264d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: Failed to reset rng\n");
171364d1cdfbSStephan Mueller 		goto outbuf;
171464d1cdfbSStephan Mueller 	}
171564d1cdfbSStephan Mueller 
171664d1cdfbSStephan Mueller 	drbg_string_fill(&addtl, test->addtla, test->addtllen);
171764d1cdfbSStephan Mueller 	if (pr) {
171864d1cdfbSStephan Mueller 		drbg_string_fill(&testentropy, test->entpra, test->entprlen);
171964d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl_test(drng,
172064d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl,	&test_data);
172164d1cdfbSStephan Mueller 	} else {
172264d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl(drng,
172364d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl);
172464d1cdfbSStephan Mueller 	}
172519e60e13SStephan Mueller 	if (ret < 0) {
172664d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not obtain random data for "
172764d1cdfbSStephan Mueller 		       "driver %s\n", driver);
172864d1cdfbSStephan Mueller 		goto outbuf;
172964d1cdfbSStephan Mueller 	}
173064d1cdfbSStephan Mueller 
173164d1cdfbSStephan Mueller 	drbg_string_fill(&addtl, test->addtlb, test->addtllen);
173264d1cdfbSStephan Mueller 	if (pr) {
173364d1cdfbSStephan Mueller 		drbg_string_fill(&testentropy, test->entprb, test->entprlen);
173464d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl_test(drng,
173564d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl, &test_data);
173664d1cdfbSStephan Mueller 	} else {
173764d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl(drng,
173864d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl);
173964d1cdfbSStephan Mueller 	}
174019e60e13SStephan Mueller 	if (ret < 0) {
174164d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not obtain random data for "
174264d1cdfbSStephan Mueller 		       "driver %s\n", driver);
174364d1cdfbSStephan Mueller 		goto outbuf;
174464d1cdfbSStephan Mueller 	}
174564d1cdfbSStephan Mueller 
174664d1cdfbSStephan Mueller 	ret = memcmp(test->expected, buf, test->expectedlen);
174764d1cdfbSStephan Mueller 
174864d1cdfbSStephan Mueller outbuf:
174964d1cdfbSStephan Mueller 	crypto_free_rng(drng);
175064d1cdfbSStephan Mueller 	kzfree(buf);
175164d1cdfbSStephan Mueller 	return ret;
175264d1cdfbSStephan Mueller }
175364d1cdfbSStephan Mueller 
175464d1cdfbSStephan Mueller 
175564d1cdfbSStephan Mueller static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver,
175664d1cdfbSStephan Mueller 			 u32 type, u32 mask)
175764d1cdfbSStephan Mueller {
175864d1cdfbSStephan Mueller 	int err = 0;
175964d1cdfbSStephan Mueller 	int pr = 0;
176064d1cdfbSStephan Mueller 	int i = 0;
176164d1cdfbSStephan Mueller 	struct drbg_testvec *template = desc->suite.drbg.vecs;
176264d1cdfbSStephan Mueller 	unsigned int tcount = desc->suite.drbg.count;
176364d1cdfbSStephan Mueller 
176464d1cdfbSStephan Mueller 	if (0 == memcmp(driver, "drbg_pr_", 8))
176564d1cdfbSStephan Mueller 		pr = 1;
176664d1cdfbSStephan Mueller 
176764d1cdfbSStephan Mueller 	for (i = 0; i < tcount; i++) {
176864d1cdfbSStephan Mueller 		err = drbg_cavs_test(&template[i], pr, driver, type, mask);
176964d1cdfbSStephan Mueller 		if (err) {
177064d1cdfbSStephan Mueller 			printk(KERN_ERR "alg: drbg: Test %d failed for %s\n",
177164d1cdfbSStephan Mueller 			       i, driver);
177264d1cdfbSStephan Mueller 			err = -EINVAL;
177364d1cdfbSStephan Mueller 			break;
177464d1cdfbSStephan Mueller 		}
177564d1cdfbSStephan Mueller 	}
177664d1cdfbSStephan Mueller 	return err;
177764d1cdfbSStephan Mueller 
177864d1cdfbSStephan Mueller }
177964d1cdfbSStephan Mueller 
1780946cc463STadeusz Struk static int do_test_rsa(struct crypto_akcipher *tfm,
1781946cc463STadeusz Struk 		       struct akcipher_testvec *vecs)
1782946cc463STadeusz Struk {
1783946cc463STadeusz Struk 	struct akcipher_request *req;
1784946cc463STadeusz Struk 	void *outbuf_enc = NULL;
1785946cc463STadeusz Struk 	void *outbuf_dec = NULL;
1786946cc463STadeusz Struk 	struct tcrypt_result result;
1787946cc463STadeusz Struk 	unsigned int out_len_max, out_len = 0;
1788946cc463STadeusz Struk 	int err = -ENOMEM;
178922287b0bSTadeusz Struk 	struct scatterlist src, dst, src_tab[2];
1790946cc463STadeusz Struk 
1791946cc463STadeusz Struk 	req = akcipher_request_alloc(tfm, GFP_KERNEL);
1792946cc463STadeusz Struk 	if (!req)
1793946cc463STadeusz Struk 		return err;
1794946cc463STadeusz Struk 
1795946cc463STadeusz Struk 	init_completion(&result.completion);
179622287b0bSTadeusz Struk 
179722287b0bSTadeusz Struk 	if (vecs->public_key_vec)
179822287b0bSTadeusz Struk 		err = crypto_akcipher_set_pub_key(tfm, vecs->key,
179922287b0bSTadeusz Struk 						  vecs->key_len);
180022287b0bSTadeusz Struk 	else
180122287b0bSTadeusz Struk 		err = crypto_akcipher_set_priv_key(tfm, vecs->key,
180222287b0bSTadeusz Struk 						   vecs->key_len);
1803946cc463STadeusz Struk 	if (err)
1804946cc463STadeusz Struk 		goto free_req;
1805946cc463STadeusz Struk 
180622287b0bSTadeusz Struk 	out_len_max = crypto_akcipher_maxsize(tfm);
1807946cc463STadeusz Struk 	outbuf_enc = kzalloc(out_len_max, GFP_KERNEL);
1808946cc463STadeusz Struk 	if (!outbuf_enc)
1809946cc463STadeusz Struk 		goto free_req;
1810946cc463STadeusz Struk 
181122287b0bSTadeusz Struk 	sg_init_table(src_tab, 2);
181222287b0bSTadeusz Struk 	sg_set_buf(&src_tab[0], vecs->m, 8);
181322287b0bSTadeusz Struk 	sg_set_buf(&src_tab[1], vecs->m + 8, vecs->m_size - 8);
181422287b0bSTadeusz Struk 	sg_init_one(&dst, outbuf_enc, out_len_max);
181522287b0bSTadeusz Struk 	akcipher_request_set_crypt(req, src_tab, &dst, vecs->m_size,
181622287b0bSTadeusz Struk 				   out_len_max);
1817946cc463STadeusz Struk 	akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1818946cc463STadeusz Struk 				      tcrypt_complete, &result);
1819946cc463STadeusz Struk 
1820946cc463STadeusz Struk 	/* Run RSA encrypt - c = m^e mod n;*/
1821946cc463STadeusz Struk 	err = wait_async_op(&result, crypto_akcipher_encrypt(req));
1822946cc463STadeusz Struk 	if (err) {
1823946cc463STadeusz Struk 		pr_err("alg: rsa: encrypt test failed. err %d\n", err);
1824946cc463STadeusz Struk 		goto free_all;
1825946cc463STadeusz Struk 	}
182622287b0bSTadeusz Struk 	if (req->dst_len != vecs->c_size) {
1827946cc463STadeusz Struk 		pr_err("alg: rsa: encrypt test failed. Invalid output len\n");
1828946cc463STadeusz Struk 		err = -EINVAL;
1829946cc463STadeusz Struk 		goto free_all;
1830946cc463STadeusz Struk 	}
1831946cc463STadeusz Struk 	/* verify that encrypted message is equal to expected */
183222287b0bSTadeusz Struk 	if (memcmp(vecs->c, sg_virt(req->dst), vecs->c_size)) {
1833946cc463STadeusz Struk 		pr_err("alg: rsa: encrypt test failed. Invalid output\n");
1834946cc463STadeusz Struk 		err = -EINVAL;
1835946cc463STadeusz Struk 		goto free_all;
1836946cc463STadeusz Struk 	}
1837946cc463STadeusz Struk 	/* Don't invoke decrypt for vectors with public key */
1838946cc463STadeusz Struk 	if (vecs->public_key_vec) {
1839946cc463STadeusz Struk 		err = 0;
1840946cc463STadeusz Struk 		goto free_all;
1841946cc463STadeusz Struk 	}
1842946cc463STadeusz Struk 	outbuf_dec = kzalloc(out_len_max, GFP_KERNEL);
1843946cc463STadeusz Struk 	if (!outbuf_dec) {
1844946cc463STadeusz Struk 		err = -ENOMEM;
1845946cc463STadeusz Struk 		goto free_all;
1846946cc463STadeusz Struk 	}
184722287b0bSTadeusz Struk 	sg_init_one(&src, vecs->c, vecs->c_size);
184822287b0bSTadeusz Struk 	sg_init_one(&dst, outbuf_dec, out_len_max);
1849946cc463STadeusz Struk 	init_completion(&result.completion);
185022287b0bSTadeusz Struk 	akcipher_request_set_crypt(req, &src, &dst, vecs->c_size, out_len_max);
1851946cc463STadeusz Struk 
1852946cc463STadeusz Struk 	/* Run RSA decrypt - m = c^d mod n;*/
1853946cc463STadeusz Struk 	err = wait_async_op(&result, crypto_akcipher_decrypt(req));
1854946cc463STadeusz Struk 	if (err) {
1855946cc463STadeusz Struk 		pr_err("alg: rsa: decrypt test failed. err %d\n", err);
1856946cc463STadeusz Struk 		goto free_all;
1857946cc463STadeusz Struk 	}
1858946cc463STadeusz Struk 	out_len = req->dst_len;
1859946cc463STadeusz Struk 	if (out_len != vecs->m_size) {
1860946cc463STadeusz Struk 		pr_err("alg: rsa: decrypt test failed. Invalid output len\n");
1861946cc463STadeusz Struk 		err = -EINVAL;
1862946cc463STadeusz Struk 		goto free_all;
1863946cc463STadeusz Struk 	}
1864946cc463STadeusz Struk 	/* verify that decrypted message is equal to the original msg */
1865946cc463STadeusz Struk 	if (memcmp(vecs->m, outbuf_dec, vecs->m_size)) {
1866946cc463STadeusz Struk 		pr_err("alg: rsa: decrypt test failed. Invalid output\n");
1867946cc463STadeusz Struk 		err = -EINVAL;
1868946cc463STadeusz Struk 	}
1869946cc463STadeusz Struk free_all:
1870946cc463STadeusz Struk 	kfree(outbuf_dec);
1871946cc463STadeusz Struk 	kfree(outbuf_enc);
1872946cc463STadeusz Struk free_req:
1873946cc463STadeusz Struk 	akcipher_request_free(req);
1874946cc463STadeusz Struk 	return err;
1875946cc463STadeusz Struk }
1876946cc463STadeusz Struk 
1877946cc463STadeusz Struk static int test_rsa(struct crypto_akcipher *tfm, struct akcipher_testvec *vecs,
1878946cc463STadeusz Struk 		    unsigned int tcount)
1879946cc463STadeusz Struk {
1880946cc463STadeusz Struk 	int ret, i;
1881946cc463STadeusz Struk 
1882946cc463STadeusz Struk 	for (i = 0; i < tcount; i++) {
1883946cc463STadeusz Struk 		ret = do_test_rsa(tfm, vecs++);
1884946cc463STadeusz Struk 		if (ret) {
1885946cc463STadeusz Struk 			pr_err("alg: rsa: test failed on vector %d, err=%d\n",
1886946cc463STadeusz Struk 			       i + 1, ret);
1887946cc463STadeusz Struk 			return ret;
1888946cc463STadeusz Struk 		}
1889946cc463STadeusz Struk 	}
1890946cc463STadeusz Struk 	return 0;
1891946cc463STadeusz Struk }
1892946cc463STadeusz Struk 
1893946cc463STadeusz Struk static int test_akcipher(struct crypto_akcipher *tfm, const char *alg,
1894946cc463STadeusz Struk 			 struct akcipher_testvec *vecs, unsigned int tcount)
1895946cc463STadeusz Struk {
1896946cc463STadeusz Struk 	if (strncmp(alg, "rsa", 3) == 0)
1897946cc463STadeusz Struk 		return test_rsa(tfm, vecs, tcount);
1898946cc463STadeusz Struk 
1899946cc463STadeusz Struk 	return 0;
1900946cc463STadeusz Struk }
1901946cc463STadeusz Struk 
1902946cc463STadeusz Struk static int alg_test_akcipher(const struct alg_test_desc *desc,
1903946cc463STadeusz Struk 			     const char *driver, u32 type, u32 mask)
1904946cc463STadeusz Struk {
1905946cc463STadeusz Struk 	struct crypto_akcipher *tfm;
1906946cc463STadeusz Struk 	int err = 0;
1907946cc463STadeusz Struk 
1908946cc463STadeusz Struk 	tfm = crypto_alloc_akcipher(driver, type | CRYPTO_ALG_INTERNAL, mask);
1909946cc463STadeusz Struk 	if (IS_ERR(tfm)) {
1910946cc463STadeusz Struk 		pr_err("alg: akcipher: Failed to load tfm for %s: %ld\n",
1911946cc463STadeusz Struk 		       driver, PTR_ERR(tfm));
1912946cc463STadeusz Struk 		return PTR_ERR(tfm);
1913946cc463STadeusz Struk 	}
1914946cc463STadeusz Struk 	if (desc->suite.akcipher.vecs)
1915946cc463STadeusz Struk 		err = test_akcipher(tfm, desc->alg, desc->suite.akcipher.vecs,
1916946cc463STadeusz Struk 				    desc->suite.akcipher.count);
1917946cc463STadeusz Struk 
1918946cc463STadeusz Struk 	crypto_free_akcipher(tfm);
1919946cc463STadeusz Struk 	return err;
1920946cc463STadeusz Struk }
1921946cc463STadeusz Struk 
1922863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc,
1923863b557aSYouquan, Song 			     const char *driver, u32 type, u32 mask)
1924863b557aSYouquan, Song {
1925863b557aSYouquan, Song 	return 0;
1926863b557aSYouquan, Song }
1927863b557aSYouquan, Song 
1928da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */
1929da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = {
1930da7f033dSHerbert Xu 	{
19314d6d6a2cSJohannes Goetzfried 		.alg = "__cbc-cast5-avx",
19324d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
19334d6d6a2cSJohannes Goetzfried 	}, {
19344ea1277dSJohannes Goetzfried 		.alg = "__cbc-cast6-avx",
19354ea1277dSJohannes Goetzfried 		.test = alg_test_null,
19364ea1277dSJohannes Goetzfried 	}, {
19377efe4076SJohannes Goetzfried 		.alg = "__cbc-serpent-avx",
19387efe4076SJohannes Goetzfried 		.test = alg_test_null,
19397efe4076SJohannes Goetzfried 	}, {
194056d76c96SJussi Kivilinna 		.alg = "__cbc-serpent-avx2",
194156d76c96SJussi Kivilinna 		.test = alg_test_null,
194256d76c96SJussi Kivilinna 	}, {
1943937c30d7SJussi Kivilinna 		.alg = "__cbc-serpent-sse2",
1944937c30d7SJussi Kivilinna 		.test = alg_test_null,
1945937c30d7SJussi Kivilinna 	}, {
1946107778b5SJohannes Goetzfried 		.alg = "__cbc-twofish-avx",
1947107778b5SJohannes Goetzfried 		.test = alg_test_null,
1948107778b5SJohannes Goetzfried 	}, {
1949863b557aSYouquan, Song 		.alg = "__driver-cbc-aes-aesni",
1950863b557aSYouquan, Song 		.test = alg_test_null,
19516c79294fSMilan Broz 		.fips_allowed = 1,
1952863b557aSYouquan, Song 	}, {
1953d9b1d2e7SJussi Kivilinna 		.alg = "__driver-cbc-camellia-aesni",
1954d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
1955d9b1d2e7SJussi Kivilinna 	}, {
1956f3f935a7SJussi Kivilinna 		.alg = "__driver-cbc-camellia-aesni-avx2",
1957f3f935a7SJussi Kivilinna 		.test = alg_test_null,
1958f3f935a7SJussi Kivilinna 	}, {
19594d6d6a2cSJohannes Goetzfried 		.alg = "__driver-cbc-cast5-avx",
19604d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
19614d6d6a2cSJohannes Goetzfried 	}, {
19624ea1277dSJohannes Goetzfried 		.alg = "__driver-cbc-cast6-avx",
19634ea1277dSJohannes Goetzfried 		.test = alg_test_null,
19644ea1277dSJohannes Goetzfried 	}, {
19657efe4076SJohannes Goetzfried 		.alg = "__driver-cbc-serpent-avx",
19667efe4076SJohannes Goetzfried 		.test = alg_test_null,
19677efe4076SJohannes Goetzfried 	}, {
196856d76c96SJussi Kivilinna 		.alg = "__driver-cbc-serpent-avx2",
196956d76c96SJussi Kivilinna 		.test = alg_test_null,
197056d76c96SJussi Kivilinna 	}, {
1971937c30d7SJussi Kivilinna 		.alg = "__driver-cbc-serpent-sse2",
1972937c30d7SJussi Kivilinna 		.test = alg_test_null,
1973937c30d7SJussi Kivilinna 	}, {
1974107778b5SJohannes Goetzfried 		.alg = "__driver-cbc-twofish-avx",
1975107778b5SJohannes Goetzfried 		.test = alg_test_null,
1976107778b5SJohannes Goetzfried 	}, {
1977863b557aSYouquan, Song 		.alg = "__driver-ecb-aes-aesni",
1978863b557aSYouquan, Song 		.test = alg_test_null,
19796c79294fSMilan Broz 		.fips_allowed = 1,
1980863b557aSYouquan, Song 	}, {
1981d9b1d2e7SJussi Kivilinna 		.alg = "__driver-ecb-camellia-aesni",
1982d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
1983d9b1d2e7SJussi Kivilinna 	}, {
1984f3f935a7SJussi Kivilinna 		.alg = "__driver-ecb-camellia-aesni-avx2",
1985f3f935a7SJussi Kivilinna 		.test = alg_test_null,
1986f3f935a7SJussi Kivilinna 	}, {
19874d6d6a2cSJohannes Goetzfried 		.alg = "__driver-ecb-cast5-avx",
19884d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
19894d6d6a2cSJohannes Goetzfried 	}, {
19904ea1277dSJohannes Goetzfried 		.alg = "__driver-ecb-cast6-avx",
19914ea1277dSJohannes Goetzfried 		.test = alg_test_null,
19924ea1277dSJohannes Goetzfried 	}, {
19937efe4076SJohannes Goetzfried 		.alg = "__driver-ecb-serpent-avx",
19947efe4076SJohannes Goetzfried 		.test = alg_test_null,
19957efe4076SJohannes Goetzfried 	}, {
199656d76c96SJussi Kivilinna 		.alg = "__driver-ecb-serpent-avx2",
199756d76c96SJussi Kivilinna 		.test = alg_test_null,
199856d76c96SJussi Kivilinna 	}, {
1999937c30d7SJussi Kivilinna 		.alg = "__driver-ecb-serpent-sse2",
2000937c30d7SJussi Kivilinna 		.test = alg_test_null,
2001937c30d7SJussi Kivilinna 	}, {
2002107778b5SJohannes Goetzfried 		.alg = "__driver-ecb-twofish-avx",
2003107778b5SJohannes Goetzfried 		.test = alg_test_null,
2004107778b5SJohannes Goetzfried 	}, {
20059d77b6c2STadeusz Struk 		.alg = "__driver-gcm-aes-aesni",
20069d77b6c2STadeusz Struk 		.test = alg_test_null,
20079d77b6c2STadeusz Struk 		.fips_allowed = 1,
20089d77b6c2STadeusz Struk 	}, {
2009863b557aSYouquan, Song 		.alg = "__ghash-pclmulqdqni",
2010863b557aSYouquan, Song 		.test = alg_test_null,
20116c79294fSMilan Broz 		.fips_allowed = 1,
2012863b557aSYouquan, Song 	}, {
2013e08ca2daSJarod Wilson 		.alg = "ansi_cprng",
2014e08ca2daSJarod Wilson 		.test = alg_test_cprng,
2015e08ca2daSJarod Wilson 		.suite = {
2016e08ca2daSJarod Wilson 			.cprng = {
2017e08ca2daSJarod Wilson 				.vecs = ansi_cprng_aes_tv_template,
2018e08ca2daSJarod Wilson 				.count = ANSI_CPRNG_AES_TEST_VECTORS
2019e08ca2daSJarod Wilson 			}
2020e08ca2daSJarod Wilson 		}
2021e08ca2daSJarod Wilson 	}, {
2022bca4feb0SHoria Geanta 		.alg = "authenc(hmac(md5),ecb(cipher_null))",
2023bca4feb0SHoria Geanta 		.test = alg_test_aead,
2024bca4feb0SHoria Geanta 		.suite = {
2025bca4feb0SHoria Geanta 			.aead = {
2026bca4feb0SHoria Geanta 				.enc = {
2027bca4feb0SHoria Geanta 					.vecs = hmac_md5_ecb_cipher_null_enc_tv_template,
2028bca4feb0SHoria Geanta 					.count = HMAC_MD5_ECB_CIPHER_NULL_ENC_TEST_VECTORS
2029bca4feb0SHoria Geanta 				},
2030bca4feb0SHoria Geanta 				.dec = {
2031bca4feb0SHoria Geanta 					.vecs = hmac_md5_ecb_cipher_null_dec_tv_template,
2032bca4feb0SHoria Geanta 					.count = HMAC_MD5_ECB_CIPHER_NULL_DEC_TEST_VECTORS
2033bca4feb0SHoria Geanta 				}
2034bca4feb0SHoria Geanta 			}
2035bca4feb0SHoria Geanta 		}
2036bca4feb0SHoria Geanta 	}, {
2037a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha1),cbc(aes))",
2038e46e9a46SHoria Geanta 		.test = alg_test_aead,
2039e46e9a46SHoria Geanta 		.suite = {
2040e46e9a46SHoria Geanta 			.aead = {
2041e46e9a46SHoria Geanta 				.enc = {
20425208ed2cSNitesh Lal 					.vecs =
20435208ed2cSNitesh Lal 					hmac_sha1_aes_cbc_enc_tv_temp,
20445208ed2cSNitesh Lal 					.count =
20455208ed2cSNitesh Lal 					HMAC_SHA1_AES_CBC_ENC_TEST_VEC
20465208ed2cSNitesh Lal 				}
20475208ed2cSNitesh Lal 			}
20485208ed2cSNitesh Lal 		}
20495208ed2cSNitesh Lal 	}, {
2050a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha1),cbc(des))",
20515208ed2cSNitesh Lal 		.test = alg_test_aead,
20525208ed2cSNitesh Lal 		.suite = {
20535208ed2cSNitesh Lal 			.aead = {
20545208ed2cSNitesh Lal 				.enc = {
20555208ed2cSNitesh Lal 					.vecs =
20565208ed2cSNitesh Lal 					hmac_sha1_des_cbc_enc_tv_temp,
20575208ed2cSNitesh Lal 					.count =
20585208ed2cSNitesh Lal 					HMAC_SHA1_DES_CBC_ENC_TEST_VEC
20595208ed2cSNitesh Lal 				}
20605208ed2cSNitesh Lal 			}
20615208ed2cSNitesh Lal 		}
20625208ed2cSNitesh Lal 	}, {
2063a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha1),cbc(des3_ede))",
20645208ed2cSNitesh Lal 		.test = alg_test_aead,
2065ed1afac9SMarcus Meissner 		.fips_allowed = 1,
20665208ed2cSNitesh Lal 		.suite = {
20675208ed2cSNitesh Lal 			.aead = {
20685208ed2cSNitesh Lal 				.enc = {
20695208ed2cSNitesh Lal 					.vecs =
20705208ed2cSNitesh Lal 					hmac_sha1_des3_ede_cbc_enc_tv_temp,
20715208ed2cSNitesh Lal 					.count =
20725208ed2cSNitesh Lal 					HMAC_SHA1_DES3_EDE_CBC_ENC_TEST_VEC
2073e46e9a46SHoria Geanta 				}
2074e46e9a46SHoria Geanta 			}
2075e46e9a46SHoria Geanta 		}
2076e46e9a46SHoria Geanta 	}, {
2077fb16abc2SMarcus Meissner 		.alg = "authenc(hmac(sha1),ctr(aes))",
2078fb16abc2SMarcus Meissner 		.test = alg_test_null,
2079fb16abc2SMarcus Meissner 		.fips_allowed = 1,
2080fb16abc2SMarcus Meissner 	}, {
2081bca4feb0SHoria Geanta 		.alg = "authenc(hmac(sha1),ecb(cipher_null))",
2082bca4feb0SHoria Geanta 		.test = alg_test_aead,
2083bca4feb0SHoria Geanta 		.suite = {
2084bca4feb0SHoria Geanta 			.aead = {
2085bca4feb0SHoria Geanta 				.enc = {
20865208ed2cSNitesh Lal 					.vecs =
20875208ed2cSNitesh Lal 					hmac_sha1_ecb_cipher_null_enc_tv_temp,
20885208ed2cSNitesh Lal 					.count =
20895208ed2cSNitesh Lal 					HMAC_SHA1_ECB_CIPHER_NULL_ENC_TEST_VEC
2090bca4feb0SHoria Geanta 				},
2091bca4feb0SHoria Geanta 				.dec = {
20925208ed2cSNitesh Lal 					.vecs =
20935208ed2cSNitesh Lal 					hmac_sha1_ecb_cipher_null_dec_tv_temp,
20945208ed2cSNitesh Lal 					.count =
20955208ed2cSNitesh Lal 					HMAC_SHA1_ECB_CIPHER_NULL_DEC_TEST_VEC
20965208ed2cSNitesh Lal 				}
20975208ed2cSNitesh Lal 			}
20985208ed2cSNitesh Lal 		}
20995208ed2cSNitesh Lal 	}, {
21008888690eSMarcus Meissner 		.alg = "authenc(hmac(sha1),rfc3686(ctr(aes)))",
21018888690eSMarcus Meissner 		.test = alg_test_null,
21028888690eSMarcus Meissner 		.fips_allowed = 1,
21038888690eSMarcus Meissner 	}, {
2104a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha224),cbc(des))",
21055208ed2cSNitesh Lal 		.test = alg_test_aead,
21065208ed2cSNitesh Lal 		.suite = {
21075208ed2cSNitesh Lal 			.aead = {
21085208ed2cSNitesh Lal 				.enc = {
21095208ed2cSNitesh Lal 					.vecs =
21105208ed2cSNitesh Lal 					hmac_sha224_des_cbc_enc_tv_temp,
21115208ed2cSNitesh Lal 					.count =
21125208ed2cSNitesh Lal 					HMAC_SHA224_DES_CBC_ENC_TEST_VEC
21135208ed2cSNitesh Lal 				}
21145208ed2cSNitesh Lal 			}
21155208ed2cSNitesh Lal 		}
21165208ed2cSNitesh Lal 	}, {
2117a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha224),cbc(des3_ede))",
21185208ed2cSNitesh Lal 		.test = alg_test_aead,
2119ed1afac9SMarcus Meissner 		.fips_allowed = 1,
21205208ed2cSNitesh Lal 		.suite = {
21215208ed2cSNitesh Lal 			.aead = {
21225208ed2cSNitesh Lal 				.enc = {
21235208ed2cSNitesh Lal 					.vecs =
21245208ed2cSNitesh Lal 					hmac_sha224_des3_ede_cbc_enc_tv_temp,
21255208ed2cSNitesh Lal 					.count =
21265208ed2cSNitesh Lal 					HMAC_SHA224_DES3_EDE_CBC_ENC_TEST_VEC
2127bca4feb0SHoria Geanta 				}
2128bca4feb0SHoria Geanta 			}
2129bca4feb0SHoria Geanta 		}
2130bca4feb0SHoria Geanta 	}, {
2131a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha256),cbc(aes))",
2132e46e9a46SHoria Geanta 		.test = alg_test_aead,
2133ed1afac9SMarcus Meissner 		.fips_allowed = 1,
2134e46e9a46SHoria Geanta 		.suite = {
2135e46e9a46SHoria Geanta 			.aead = {
2136e46e9a46SHoria Geanta 				.enc = {
21375208ed2cSNitesh Lal 					.vecs =
21385208ed2cSNitesh Lal 					hmac_sha256_aes_cbc_enc_tv_temp,
21395208ed2cSNitesh Lal 					.count =
21405208ed2cSNitesh Lal 					HMAC_SHA256_AES_CBC_ENC_TEST_VEC
21415208ed2cSNitesh Lal 				}
21425208ed2cSNitesh Lal 			}
21435208ed2cSNitesh Lal 		}
21445208ed2cSNitesh Lal 	}, {
2145a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha256),cbc(des))",
21465208ed2cSNitesh Lal 		.test = alg_test_aead,
21475208ed2cSNitesh Lal 		.suite = {
21485208ed2cSNitesh Lal 			.aead = {
21495208ed2cSNitesh Lal 				.enc = {
21505208ed2cSNitesh Lal 					.vecs =
21515208ed2cSNitesh Lal 					hmac_sha256_des_cbc_enc_tv_temp,
21525208ed2cSNitesh Lal 					.count =
21535208ed2cSNitesh Lal 					HMAC_SHA256_DES_CBC_ENC_TEST_VEC
21545208ed2cSNitesh Lal 				}
21555208ed2cSNitesh Lal 			}
21565208ed2cSNitesh Lal 		}
21575208ed2cSNitesh Lal 	}, {
2158a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha256),cbc(des3_ede))",
21595208ed2cSNitesh Lal 		.test = alg_test_aead,
2160ed1afac9SMarcus Meissner 		.fips_allowed = 1,
21615208ed2cSNitesh Lal 		.suite = {
21625208ed2cSNitesh Lal 			.aead = {
21635208ed2cSNitesh Lal 				.enc = {
21645208ed2cSNitesh Lal 					.vecs =
21655208ed2cSNitesh Lal 					hmac_sha256_des3_ede_cbc_enc_tv_temp,
21665208ed2cSNitesh Lal 					.count =
21675208ed2cSNitesh Lal 					HMAC_SHA256_DES3_EDE_CBC_ENC_TEST_VEC
21685208ed2cSNitesh Lal 				}
21695208ed2cSNitesh Lal 			}
21705208ed2cSNitesh Lal 		}
21715208ed2cSNitesh Lal 	}, {
2172fb16abc2SMarcus Meissner 		.alg = "authenc(hmac(sha256),ctr(aes))",
2173fb16abc2SMarcus Meissner 		.test = alg_test_null,
2174fb16abc2SMarcus Meissner 		.fips_allowed = 1,
2175fb16abc2SMarcus Meissner 	}, {
21768888690eSMarcus Meissner 		.alg = "authenc(hmac(sha256),rfc3686(ctr(aes)))",
21778888690eSMarcus Meissner 		.test = alg_test_null,
21788888690eSMarcus Meissner 		.fips_allowed = 1,
21798888690eSMarcus Meissner 	}, {
2180a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha384),cbc(des))",
21815208ed2cSNitesh Lal 		.test = alg_test_aead,
21825208ed2cSNitesh Lal 		.suite = {
21835208ed2cSNitesh Lal 			.aead = {
21845208ed2cSNitesh Lal 				.enc = {
21855208ed2cSNitesh Lal 					.vecs =
21865208ed2cSNitesh Lal 					hmac_sha384_des_cbc_enc_tv_temp,
21875208ed2cSNitesh Lal 					.count =
21885208ed2cSNitesh Lal 					HMAC_SHA384_DES_CBC_ENC_TEST_VEC
21895208ed2cSNitesh Lal 				}
21905208ed2cSNitesh Lal 			}
21915208ed2cSNitesh Lal 		}
21925208ed2cSNitesh Lal 	}, {
2193a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha384),cbc(des3_ede))",
21945208ed2cSNitesh Lal 		.test = alg_test_aead,
2195ed1afac9SMarcus Meissner 		.fips_allowed = 1,
21965208ed2cSNitesh Lal 		.suite = {
21975208ed2cSNitesh Lal 			.aead = {
21985208ed2cSNitesh Lal 				.enc = {
21995208ed2cSNitesh Lal 					.vecs =
22005208ed2cSNitesh Lal 					hmac_sha384_des3_ede_cbc_enc_tv_temp,
22015208ed2cSNitesh Lal 					.count =
22025208ed2cSNitesh Lal 					HMAC_SHA384_DES3_EDE_CBC_ENC_TEST_VEC
2203e46e9a46SHoria Geanta 				}
2204e46e9a46SHoria Geanta 			}
2205e46e9a46SHoria Geanta 		}
2206e46e9a46SHoria Geanta 	}, {
2207fb16abc2SMarcus Meissner 		.alg = "authenc(hmac(sha384),ctr(aes))",
2208fb16abc2SMarcus Meissner 		.test = alg_test_null,
2209fb16abc2SMarcus Meissner 		.fips_allowed = 1,
2210fb16abc2SMarcus Meissner 	}, {
22118888690eSMarcus Meissner 		.alg = "authenc(hmac(sha384),rfc3686(ctr(aes)))",
22128888690eSMarcus Meissner 		.test = alg_test_null,
22138888690eSMarcus Meissner 		.fips_allowed = 1,
22148888690eSMarcus Meissner 	}, {
2215a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha512),cbc(aes))",
2216ed1afac9SMarcus Meissner 		.fips_allowed = 1,
2217e46e9a46SHoria Geanta 		.test = alg_test_aead,
2218e46e9a46SHoria Geanta 		.suite = {
2219e46e9a46SHoria Geanta 			.aead = {
2220e46e9a46SHoria Geanta 				.enc = {
22215208ed2cSNitesh Lal 					.vecs =
22225208ed2cSNitesh Lal 					hmac_sha512_aes_cbc_enc_tv_temp,
22235208ed2cSNitesh Lal 					.count =
22245208ed2cSNitesh Lal 					HMAC_SHA512_AES_CBC_ENC_TEST_VEC
22255208ed2cSNitesh Lal 				}
22265208ed2cSNitesh Lal 			}
22275208ed2cSNitesh Lal 		}
22285208ed2cSNitesh Lal 	}, {
2229a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha512),cbc(des))",
22305208ed2cSNitesh Lal 		.test = alg_test_aead,
22315208ed2cSNitesh Lal 		.suite = {
22325208ed2cSNitesh Lal 			.aead = {
22335208ed2cSNitesh Lal 				.enc = {
22345208ed2cSNitesh Lal 					.vecs =
22355208ed2cSNitesh Lal 					hmac_sha512_des_cbc_enc_tv_temp,
22365208ed2cSNitesh Lal 					.count =
22375208ed2cSNitesh Lal 					HMAC_SHA512_DES_CBC_ENC_TEST_VEC
22385208ed2cSNitesh Lal 				}
22395208ed2cSNitesh Lal 			}
22405208ed2cSNitesh Lal 		}
22415208ed2cSNitesh Lal 	}, {
2242a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha512),cbc(des3_ede))",
22435208ed2cSNitesh Lal 		.test = alg_test_aead,
2244ed1afac9SMarcus Meissner 		.fips_allowed = 1,
22455208ed2cSNitesh Lal 		.suite = {
22465208ed2cSNitesh Lal 			.aead = {
22475208ed2cSNitesh Lal 				.enc = {
22485208ed2cSNitesh Lal 					.vecs =
22495208ed2cSNitesh Lal 					hmac_sha512_des3_ede_cbc_enc_tv_temp,
22505208ed2cSNitesh Lal 					.count =
22515208ed2cSNitesh Lal 					HMAC_SHA512_DES3_EDE_CBC_ENC_TEST_VEC
2252e46e9a46SHoria Geanta 				}
2253e46e9a46SHoria Geanta 			}
2254e46e9a46SHoria Geanta 		}
2255e46e9a46SHoria Geanta 	}, {
2256fb16abc2SMarcus Meissner 		.alg = "authenc(hmac(sha512),ctr(aes))",
2257fb16abc2SMarcus Meissner 		.test = alg_test_null,
2258fb16abc2SMarcus Meissner 		.fips_allowed = 1,
2259fb16abc2SMarcus Meissner 	}, {
22608888690eSMarcus Meissner 		.alg = "authenc(hmac(sha512),rfc3686(ctr(aes)))",
22618888690eSMarcus Meissner 		.test = alg_test_null,
22628888690eSMarcus Meissner 		.fips_allowed = 1,
22638888690eSMarcus Meissner 	}, {
2264da7f033dSHerbert Xu 		.alg = "cbc(aes)",
22651aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2266a1915d51SJarod Wilson 		.fips_allowed = 1,
2267da7f033dSHerbert Xu 		.suite = {
2268da7f033dSHerbert Xu 			.cipher = {
2269da7f033dSHerbert Xu 				.enc = {
2270da7f033dSHerbert Xu 					.vecs = aes_cbc_enc_tv_template,
2271da7f033dSHerbert Xu 					.count = AES_CBC_ENC_TEST_VECTORS
2272da7f033dSHerbert Xu 				},
2273da7f033dSHerbert Xu 				.dec = {
2274da7f033dSHerbert Xu 					.vecs = aes_cbc_dec_tv_template,
2275da7f033dSHerbert Xu 					.count = AES_CBC_DEC_TEST_VECTORS
2276da7f033dSHerbert Xu 				}
2277da7f033dSHerbert Xu 			}
2278da7f033dSHerbert Xu 		}
2279da7f033dSHerbert Xu 	}, {
2280da7f033dSHerbert Xu 		.alg = "cbc(anubis)",
22811aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2282da7f033dSHerbert Xu 		.suite = {
2283da7f033dSHerbert Xu 			.cipher = {
2284da7f033dSHerbert Xu 				.enc = {
2285da7f033dSHerbert Xu 					.vecs = anubis_cbc_enc_tv_template,
2286da7f033dSHerbert Xu 					.count = ANUBIS_CBC_ENC_TEST_VECTORS
2287da7f033dSHerbert Xu 				},
2288da7f033dSHerbert Xu 				.dec = {
2289da7f033dSHerbert Xu 					.vecs = anubis_cbc_dec_tv_template,
2290da7f033dSHerbert Xu 					.count = ANUBIS_CBC_DEC_TEST_VECTORS
2291da7f033dSHerbert Xu 				}
2292da7f033dSHerbert Xu 			}
2293da7f033dSHerbert Xu 		}
2294da7f033dSHerbert Xu 	}, {
2295da7f033dSHerbert Xu 		.alg = "cbc(blowfish)",
22961aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2297da7f033dSHerbert Xu 		.suite = {
2298da7f033dSHerbert Xu 			.cipher = {
2299da7f033dSHerbert Xu 				.enc = {
2300da7f033dSHerbert Xu 					.vecs = bf_cbc_enc_tv_template,
2301da7f033dSHerbert Xu 					.count = BF_CBC_ENC_TEST_VECTORS
2302da7f033dSHerbert Xu 				},
2303da7f033dSHerbert Xu 				.dec = {
2304da7f033dSHerbert Xu 					.vecs = bf_cbc_dec_tv_template,
2305da7f033dSHerbert Xu 					.count = BF_CBC_DEC_TEST_VECTORS
2306da7f033dSHerbert Xu 				}
2307da7f033dSHerbert Xu 			}
2308da7f033dSHerbert Xu 		}
2309da7f033dSHerbert Xu 	}, {
2310da7f033dSHerbert Xu 		.alg = "cbc(camellia)",
23111aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2312da7f033dSHerbert Xu 		.suite = {
2313da7f033dSHerbert Xu 			.cipher = {
2314da7f033dSHerbert Xu 				.enc = {
2315da7f033dSHerbert Xu 					.vecs = camellia_cbc_enc_tv_template,
2316da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_ENC_TEST_VECTORS
2317da7f033dSHerbert Xu 				},
2318da7f033dSHerbert Xu 				.dec = {
2319da7f033dSHerbert Xu 					.vecs = camellia_cbc_dec_tv_template,
2320da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_DEC_TEST_VECTORS
2321da7f033dSHerbert Xu 				}
2322da7f033dSHerbert Xu 			}
2323da7f033dSHerbert Xu 		}
2324da7f033dSHerbert Xu 	}, {
2325a2c58260SJohannes Goetzfried 		.alg = "cbc(cast5)",
2326a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2327a2c58260SJohannes Goetzfried 		.suite = {
2328a2c58260SJohannes Goetzfried 			.cipher = {
2329a2c58260SJohannes Goetzfried 				.enc = {
2330a2c58260SJohannes Goetzfried 					.vecs = cast5_cbc_enc_tv_template,
2331a2c58260SJohannes Goetzfried 					.count = CAST5_CBC_ENC_TEST_VECTORS
2332a2c58260SJohannes Goetzfried 				},
2333a2c58260SJohannes Goetzfried 				.dec = {
2334a2c58260SJohannes Goetzfried 					.vecs = cast5_cbc_dec_tv_template,
2335a2c58260SJohannes Goetzfried 					.count = CAST5_CBC_DEC_TEST_VECTORS
2336a2c58260SJohannes Goetzfried 				}
2337a2c58260SJohannes Goetzfried 			}
2338a2c58260SJohannes Goetzfried 		}
2339a2c58260SJohannes Goetzfried 	}, {
23409b8b0405SJohannes Goetzfried 		.alg = "cbc(cast6)",
23419b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
23429b8b0405SJohannes Goetzfried 		.suite = {
23439b8b0405SJohannes Goetzfried 			.cipher = {
23449b8b0405SJohannes Goetzfried 				.enc = {
23459b8b0405SJohannes Goetzfried 					.vecs = cast6_cbc_enc_tv_template,
23469b8b0405SJohannes Goetzfried 					.count = CAST6_CBC_ENC_TEST_VECTORS
23479b8b0405SJohannes Goetzfried 				},
23489b8b0405SJohannes Goetzfried 				.dec = {
23499b8b0405SJohannes Goetzfried 					.vecs = cast6_cbc_dec_tv_template,
23509b8b0405SJohannes Goetzfried 					.count = CAST6_CBC_DEC_TEST_VECTORS
23519b8b0405SJohannes Goetzfried 				}
23529b8b0405SJohannes Goetzfried 			}
23539b8b0405SJohannes Goetzfried 		}
23549b8b0405SJohannes Goetzfried 	}, {
2355da7f033dSHerbert Xu 		.alg = "cbc(des)",
23561aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2357da7f033dSHerbert Xu 		.suite = {
2358da7f033dSHerbert Xu 			.cipher = {
2359da7f033dSHerbert Xu 				.enc = {
2360da7f033dSHerbert Xu 					.vecs = des_cbc_enc_tv_template,
2361da7f033dSHerbert Xu 					.count = DES_CBC_ENC_TEST_VECTORS
2362da7f033dSHerbert Xu 				},
2363da7f033dSHerbert Xu 				.dec = {
2364da7f033dSHerbert Xu 					.vecs = des_cbc_dec_tv_template,
2365da7f033dSHerbert Xu 					.count = DES_CBC_DEC_TEST_VECTORS
2366da7f033dSHerbert Xu 				}
2367da7f033dSHerbert Xu 			}
2368da7f033dSHerbert Xu 		}
2369da7f033dSHerbert Xu 	}, {
2370da7f033dSHerbert Xu 		.alg = "cbc(des3_ede)",
23711aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2372a1915d51SJarod Wilson 		.fips_allowed = 1,
2373da7f033dSHerbert Xu 		.suite = {
2374da7f033dSHerbert Xu 			.cipher = {
2375da7f033dSHerbert Xu 				.enc = {
2376da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_enc_tv_template,
2377da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_ENC_TEST_VECTORS
2378da7f033dSHerbert Xu 				},
2379da7f033dSHerbert Xu 				.dec = {
2380da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_dec_tv_template,
2381da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_DEC_TEST_VECTORS
2382da7f033dSHerbert Xu 				}
2383da7f033dSHerbert Xu 			}
2384da7f033dSHerbert Xu 		}
2385da7f033dSHerbert Xu 	}, {
23869d25917dSJussi Kivilinna 		.alg = "cbc(serpent)",
23879d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
23889d25917dSJussi Kivilinna 		.suite = {
23899d25917dSJussi Kivilinna 			.cipher = {
23909d25917dSJussi Kivilinna 				.enc = {
23919d25917dSJussi Kivilinna 					.vecs = serpent_cbc_enc_tv_template,
23929d25917dSJussi Kivilinna 					.count = SERPENT_CBC_ENC_TEST_VECTORS
23939d25917dSJussi Kivilinna 				},
23949d25917dSJussi Kivilinna 				.dec = {
23959d25917dSJussi Kivilinna 					.vecs = serpent_cbc_dec_tv_template,
23969d25917dSJussi Kivilinna 					.count = SERPENT_CBC_DEC_TEST_VECTORS
23979d25917dSJussi Kivilinna 				}
23989d25917dSJussi Kivilinna 			}
23999d25917dSJussi Kivilinna 		}
24009d25917dSJussi Kivilinna 	}, {
2401da7f033dSHerbert Xu 		.alg = "cbc(twofish)",
24021aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2403da7f033dSHerbert Xu 		.suite = {
2404da7f033dSHerbert Xu 			.cipher = {
2405da7f033dSHerbert Xu 				.enc = {
2406da7f033dSHerbert Xu 					.vecs = tf_cbc_enc_tv_template,
2407da7f033dSHerbert Xu 					.count = TF_CBC_ENC_TEST_VECTORS
2408da7f033dSHerbert Xu 				},
2409da7f033dSHerbert Xu 				.dec = {
2410da7f033dSHerbert Xu 					.vecs = tf_cbc_dec_tv_template,
2411da7f033dSHerbert Xu 					.count = TF_CBC_DEC_TEST_VECTORS
2412da7f033dSHerbert Xu 				}
2413da7f033dSHerbert Xu 			}
2414da7f033dSHerbert Xu 		}
2415da7f033dSHerbert Xu 	}, {
2416da7f033dSHerbert Xu 		.alg = "ccm(aes)",
2417da7f033dSHerbert Xu 		.test = alg_test_aead,
2418a1915d51SJarod Wilson 		.fips_allowed = 1,
2419da7f033dSHerbert Xu 		.suite = {
2420da7f033dSHerbert Xu 			.aead = {
2421da7f033dSHerbert Xu 				.enc = {
2422da7f033dSHerbert Xu 					.vecs = aes_ccm_enc_tv_template,
2423da7f033dSHerbert Xu 					.count = AES_CCM_ENC_TEST_VECTORS
2424da7f033dSHerbert Xu 				},
2425da7f033dSHerbert Xu 				.dec = {
2426da7f033dSHerbert Xu 					.vecs = aes_ccm_dec_tv_template,
2427da7f033dSHerbert Xu 					.count = AES_CCM_DEC_TEST_VECTORS
2428da7f033dSHerbert Xu 				}
2429da7f033dSHerbert Xu 			}
2430da7f033dSHerbert Xu 		}
2431da7f033dSHerbert Xu 	}, {
24323590ebf2SMartin Willi 		.alg = "chacha20",
24333590ebf2SMartin Willi 		.test = alg_test_skcipher,
24343590ebf2SMartin Willi 		.suite = {
24353590ebf2SMartin Willi 			.cipher = {
24363590ebf2SMartin Willi 				.enc = {
24373590ebf2SMartin Willi 					.vecs = chacha20_enc_tv_template,
24383590ebf2SMartin Willi 					.count = CHACHA20_ENC_TEST_VECTORS
24393590ebf2SMartin Willi 				},
24403590ebf2SMartin Willi 				.dec = {
24413590ebf2SMartin Willi 					.vecs = chacha20_enc_tv_template,
24423590ebf2SMartin Willi 					.count = CHACHA20_ENC_TEST_VECTORS
24433590ebf2SMartin Willi 				},
24443590ebf2SMartin Willi 			}
24453590ebf2SMartin Willi 		}
24463590ebf2SMartin Willi 	}, {
244793b5e86aSJussi Kivilinna 		.alg = "cmac(aes)",
24488f183751SStephan Mueller 		.fips_allowed = 1,
244993b5e86aSJussi Kivilinna 		.test = alg_test_hash,
245093b5e86aSJussi Kivilinna 		.suite = {
245193b5e86aSJussi Kivilinna 			.hash = {
245293b5e86aSJussi Kivilinna 				.vecs = aes_cmac128_tv_template,
245393b5e86aSJussi Kivilinna 				.count = CMAC_AES_TEST_VECTORS
245493b5e86aSJussi Kivilinna 			}
245593b5e86aSJussi Kivilinna 		}
245693b5e86aSJussi Kivilinna 	}, {
245793b5e86aSJussi Kivilinna 		.alg = "cmac(des3_ede)",
24588f183751SStephan Mueller 		.fips_allowed = 1,
245993b5e86aSJussi Kivilinna 		.test = alg_test_hash,
246093b5e86aSJussi Kivilinna 		.suite = {
246193b5e86aSJussi Kivilinna 			.hash = {
246293b5e86aSJussi Kivilinna 				.vecs = des3_ede_cmac64_tv_template,
246393b5e86aSJussi Kivilinna 				.count = CMAC_DES3_EDE_TEST_VECTORS
246493b5e86aSJussi Kivilinna 			}
246593b5e86aSJussi Kivilinna 		}
246693b5e86aSJussi Kivilinna 	}, {
2467e448370dSJussi Kivilinna 		.alg = "compress_null",
2468e448370dSJussi Kivilinna 		.test = alg_test_null,
2469e448370dSJussi Kivilinna 	}, {
2470ebb3472fSArd Biesheuvel 		.alg = "crc32",
2471ebb3472fSArd Biesheuvel 		.test = alg_test_hash,
2472ebb3472fSArd Biesheuvel 		.suite = {
2473ebb3472fSArd Biesheuvel 			.hash = {
2474ebb3472fSArd Biesheuvel 				.vecs = crc32_tv_template,
2475ebb3472fSArd Biesheuvel 				.count = CRC32_TEST_VECTORS
2476ebb3472fSArd Biesheuvel 			}
2477ebb3472fSArd Biesheuvel 		}
2478ebb3472fSArd Biesheuvel 	}, {
2479da7f033dSHerbert Xu 		.alg = "crc32c",
24808e3ee85eSHerbert Xu 		.test = alg_test_crc32c,
2481a1915d51SJarod Wilson 		.fips_allowed = 1,
2482da7f033dSHerbert Xu 		.suite = {
2483da7f033dSHerbert Xu 			.hash = {
2484da7f033dSHerbert Xu 				.vecs = crc32c_tv_template,
2485da7f033dSHerbert Xu 				.count = CRC32C_TEST_VECTORS
2486da7f033dSHerbert Xu 			}
2487da7f033dSHerbert Xu 		}
2488da7f033dSHerbert Xu 	}, {
248968411521SHerbert Xu 		.alg = "crct10dif",
249068411521SHerbert Xu 		.test = alg_test_hash,
249168411521SHerbert Xu 		.fips_allowed = 1,
249268411521SHerbert Xu 		.suite = {
249368411521SHerbert Xu 			.hash = {
249468411521SHerbert Xu 				.vecs = crct10dif_tv_template,
249568411521SHerbert Xu 				.count = CRCT10DIF_TEST_VECTORS
249668411521SHerbert Xu 			}
249768411521SHerbert Xu 		}
249868411521SHerbert Xu 	}, {
24996c79294fSMilan Broz 		.alg = "cryptd(__driver-cbc-aes-aesni)",
25006c79294fSMilan Broz 		.test = alg_test_null,
25016c79294fSMilan Broz 		.fips_allowed = 1,
25026c79294fSMilan Broz 	}, {
2503d9b1d2e7SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-camellia-aesni)",
2504d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2505d9b1d2e7SJussi Kivilinna 	}, {
2506f3f935a7SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-camellia-aesni-avx2)",
2507f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2508f3f935a7SJussi Kivilinna 	}, {
250956d76c96SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-serpent-avx2)",
251056d76c96SJussi Kivilinna 		.test = alg_test_null,
251156d76c96SJussi Kivilinna 	}, {
2512863b557aSYouquan, Song 		.alg = "cryptd(__driver-ecb-aes-aesni)",
2513863b557aSYouquan, Song 		.test = alg_test_null,
25146c79294fSMilan Broz 		.fips_allowed = 1,
2515863b557aSYouquan, Song 	}, {
2516d9b1d2e7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-camellia-aesni)",
2517d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2518d9b1d2e7SJussi Kivilinna 	}, {
2519f3f935a7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-camellia-aesni-avx2)",
2520f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2521f3f935a7SJussi Kivilinna 	}, {
25224d6d6a2cSJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-cast5-avx)",
25234d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
25244d6d6a2cSJohannes Goetzfried 	}, {
25254ea1277dSJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-cast6-avx)",
25264ea1277dSJohannes Goetzfried 		.test = alg_test_null,
25274ea1277dSJohannes Goetzfried 	}, {
25287efe4076SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-serpent-avx)",
25297efe4076SJohannes Goetzfried 		.test = alg_test_null,
25307efe4076SJohannes Goetzfried 	}, {
253156d76c96SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-serpent-avx2)",
253256d76c96SJussi Kivilinna 		.test = alg_test_null,
253356d76c96SJussi Kivilinna 	}, {
2534937c30d7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-serpent-sse2)",
2535937c30d7SJussi Kivilinna 		.test = alg_test_null,
2536937c30d7SJussi Kivilinna 	}, {
2537107778b5SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-twofish-avx)",
2538107778b5SJohannes Goetzfried 		.test = alg_test_null,
2539107778b5SJohannes Goetzfried 	}, {
25406c79294fSMilan Broz 		.alg = "cryptd(__driver-gcm-aes-aesni)",
25416c79294fSMilan Broz 		.test = alg_test_null,
25426c79294fSMilan Broz 		.fips_allowed = 1,
25436c79294fSMilan Broz 	}, {
2544863b557aSYouquan, Song 		.alg = "cryptd(__ghash-pclmulqdqni)",
2545863b557aSYouquan, Song 		.test = alg_test_null,
25466c79294fSMilan Broz 		.fips_allowed = 1,
2547863b557aSYouquan, Song 	}, {
2548f7cb80f2SJarod Wilson 		.alg = "ctr(aes)",
2549f7cb80f2SJarod Wilson 		.test = alg_test_skcipher,
2550a1915d51SJarod Wilson 		.fips_allowed = 1,
2551f7cb80f2SJarod Wilson 		.suite = {
2552f7cb80f2SJarod Wilson 			.cipher = {
2553f7cb80f2SJarod Wilson 				.enc = {
2554f7cb80f2SJarod Wilson 					.vecs = aes_ctr_enc_tv_template,
2555f7cb80f2SJarod Wilson 					.count = AES_CTR_ENC_TEST_VECTORS
2556f7cb80f2SJarod Wilson 				},
2557f7cb80f2SJarod Wilson 				.dec = {
2558f7cb80f2SJarod Wilson 					.vecs = aes_ctr_dec_tv_template,
2559f7cb80f2SJarod Wilson 					.count = AES_CTR_DEC_TEST_VECTORS
2560f7cb80f2SJarod Wilson 				}
2561f7cb80f2SJarod Wilson 			}
2562f7cb80f2SJarod Wilson 		}
2563f7cb80f2SJarod Wilson 	}, {
256485b63e34SJussi Kivilinna 		.alg = "ctr(blowfish)",
256585b63e34SJussi Kivilinna 		.test = alg_test_skcipher,
256685b63e34SJussi Kivilinna 		.suite = {
256785b63e34SJussi Kivilinna 			.cipher = {
256885b63e34SJussi Kivilinna 				.enc = {
256985b63e34SJussi Kivilinna 					.vecs = bf_ctr_enc_tv_template,
257085b63e34SJussi Kivilinna 					.count = BF_CTR_ENC_TEST_VECTORS
257185b63e34SJussi Kivilinna 				},
257285b63e34SJussi Kivilinna 				.dec = {
257385b63e34SJussi Kivilinna 					.vecs = bf_ctr_dec_tv_template,
257485b63e34SJussi Kivilinna 					.count = BF_CTR_DEC_TEST_VECTORS
257585b63e34SJussi Kivilinna 				}
257685b63e34SJussi Kivilinna 			}
257785b63e34SJussi Kivilinna 		}
257885b63e34SJussi Kivilinna 	}, {
25790840605eSJussi Kivilinna 		.alg = "ctr(camellia)",
25800840605eSJussi Kivilinna 		.test = alg_test_skcipher,
25810840605eSJussi Kivilinna 		.suite = {
25820840605eSJussi Kivilinna 			.cipher = {
25830840605eSJussi Kivilinna 				.enc = {
25840840605eSJussi Kivilinna 					.vecs = camellia_ctr_enc_tv_template,
25850840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_ENC_TEST_VECTORS
25860840605eSJussi Kivilinna 				},
25870840605eSJussi Kivilinna 				.dec = {
25880840605eSJussi Kivilinna 					.vecs = camellia_ctr_dec_tv_template,
25890840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_DEC_TEST_VECTORS
25900840605eSJussi Kivilinna 				}
25910840605eSJussi Kivilinna 			}
25920840605eSJussi Kivilinna 		}
25930840605eSJussi Kivilinna 	}, {
2594a2c58260SJohannes Goetzfried 		.alg = "ctr(cast5)",
2595a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2596a2c58260SJohannes Goetzfried 		.suite = {
2597a2c58260SJohannes Goetzfried 			.cipher = {
2598a2c58260SJohannes Goetzfried 				.enc = {
2599a2c58260SJohannes Goetzfried 					.vecs = cast5_ctr_enc_tv_template,
2600a2c58260SJohannes Goetzfried 					.count = CAST5_CTR_ENC_TEST_VECTORS
2601a2c58260SJohannes Goetzfried 				},
2602a2c58260SJohannes Goetzfried 				.dec = {
2603a2c58260SJohannes Goetzfried 					.vecs = cast5_ctr_dec_tv_template,
2604a2c58260SJohannes Goetzfried 					.count = CAST5_CTR_DEC_TEST_VECTORS
2605a2c58260SJohannes Goetzfried 				}
2606a2c58260SJohannes Goetzfried 			}
2607a2c58260SJohannes Goetzfried 		}
2608a2c58260SJohannes Goetzfried 	}, {
26099b8b0405SJohannes Goetzfried 		.alg = "ctr(cast6)",
26109b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
26119b8b0405SJohannes Goetzfried 		.suite = {
26129b8b0405SJohannes Goetzfried 			.cipher = {
26139b8b0405SJohannes Goetzfried 				.enc = {
26149b8b0405SJohannes Goetzfried 					.vecs = cast6_ctr_enc_tv_template,
26159b8b0405SJohannes Goetzfried 					.count = CAST6_CTR_ENC_TEST_VECTORS
26169b8b0405SJohannes Goetzfried 				},
26179b8b0405SJohannes Goetzfried 				.dec = {
26189b8b0405SJohannes Goetzfried 					.vecs = cast6_ctr_dec_tv_template,
26199b8b0405SJohannes Goetzfried 					.count = CAST6_CTR_DEC_TEST_VECTORS
26209b8b0405SJohannes Goetzfried 				}
26219b8b0405SJohannes Goetzfried 			}
26229b8b0405SJohannes Goetzfried 		}
26239b8b0405SJohannes Goetzfried 	}, {
26248163fc30SJussi Kivilinna 		.alg = "ctr(des)",
26258163fc30SJussi Kivilinna 		.test = alg_test_skcipher,
26268163fc30SJussi Kivilinna 		.suite = {
26278163fc30SJussi Kivilinna 			.cipher = {
26288163fc30SJussi Kivilinna 				.enc = {
26298163fc30SJussi Kivilinna 					.vecs = des_ctr_enc_tv_template,
26308163fc30SJussi Kivilinna 					.count = DES_CTR_ENC_TEST_VECTORS
26318163fc30SJussi Kivilinna 				},
26328163fc30SJussi Kivilinna 				.dec = {
26338163fc30SJussi Kivilinna 					.vecs = des_ctr_dec_tv_template,
26348163fc30SJussi Kivilinna 					.count = DES_CTR_DEC_TEST_VECTORS
26358163fc30SJussi Kivilinna 				}
26368163fc30SJussi Kivilinna 			}
26378163fc30SJussi Kivilinna 		}
26388163fc30SJussi Kivilinna 	}, {
2639e080b17aSJussi Kivilinna 		.alg = "ctr(des3_ede)",
2640e080b17aSJussi Kivilinna 		.test = alg_test_skcipher,
2641e080b17aSJussi Kivilinna 		.suite = {
2642e080b17aSJussi Kivilinna 			.cipher = {
2643e080b17aSJussi Kivilinna 				.enc = {
2644e080b17aSJussi Kivilinna 					.vecs = des3_ede_ctr_enc_tv_template,
2645e080b17aSJussi Kivilinna 					.count = DES3_EDE_CTR_ENC_TEST_VECTORS
2646e080b17aSJussi Kivilinna 				},
2647e080b17aSJussi Kivilinna 				.dec = {
2648e080b17aSJussi Kivilinna 					.vecs = des3_ede_ctr_dec_tv_template,
2649e080b17aSJussi Kivilinna 					.count = DES3_EDE_CTR_DEC_TEST_VECTORS
2650e080b17aSJussi Kivilinna 				}
2651e080b17aSJussi Kivilinna 			}
2652e080b17aSJussi Kivilinna 		}
2653e080b17aSJussi Kivilinna 	}, {
26549d25917dSJussi Kivilinna 		.alg = "ctr(serpent)",
26559d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
26569d25917dSJussi Kivilinna 		.suite = {
26579d25917dSJussi Kivilinna 			.cipher = {
26589d25917dSJussi Kivilinna 				.enc = {
26599d25917dSJussi Kivilinna 					.vecs = serpent_ctr_enc_tv_template,
26609d25917dSJussi Kivilinna 					.count = SERPENT_CTR_ENC_TEST_VECTORS
26619d25917dSJussi Kivilinna 				},
26629d25917dSJussi Kivilinna 				.dec = {
26639d25917dSJussi Kivilinna 					.vecs = serpent_ctr_dec_tv_template,
26649d25917dSJussi Kivilinna 					.count = SERPENT_CTR_DEC_TEST_VECTORS
26659d25917dSJussi Kivilinna 				}
26669d25917dSJussi Kivilinna 			}
26679d25917dSJussi Kivilinna 		}
26689d25917dSJussi Kivilinna 	}, {
2669573da620SJussi Kivilinna 		.alg = "ctr(twofish)",
2670573da620SJussi Kivilinna 		.test = alg_test_skcipher,
2671573da620SJussi Kivilinna 		.suite = {
2672573da620SJussi Kivilinna 			.cipher = {
2673573da620SJussi Kivilinna 				.enc = {
2674573da620SJussi Kivilinna 					.vecs = tf_ctr_enc_tv_template,
2675573da620SJussi Kivilinna 					.count = TF_CTR_ENC_TEST_VECTORS
2676573da620SJussi Kivilinna 				},
2677573da620SJussi Kivilinna 				.dec = {
2678573da620SJussi Kivilinna 					.vecs = tf_ctr_dec_tv_template,
2679573da620SJussi Kivilinna 					.count = TF_CTR_DEC_TEST_VECTORS
2680573da620SJussi Kivilinna 				}
2681573da620SJussi Kivilinna 			}
2682573da620SJussi Kivilinna 		}
2683573da620SJussi Kivilinna 	}, {
2684da7f033dSHerbert Xu 		.alg = "cts(cbc(aes))",
26851aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2686da7f033dSHerbert Xu 		.suite = {
2687da7f033dSHerbert Xu 			.cipher = {
2688da7f033dSHerbert Xu 				.enc = {
2689da7f033dSHerbert Xu 					.vecs = cts_mode_enc_tv_template,
2690da7f033dSHerbert Xu 					.count = CTS_MODE_ENC_TEST_VECTORS
2691da7f033dSHerbert Xu 				},
2692da7f033dSHerbert Xu 				.dec = {
2693da7f033dSHerbert Xu 					.vecs = cts_mode_dec_tv_template,
2694da7f033dSHerbert Xu 					.count = CTS_MODE_DEC_TEST_VECTORS
2695da7f033dSHerbert Xu 				}
2696da7f033dSHerbert Xu 			}
2697da7f033dSHerbert Xu 		}
2698da7f033dSHerbert Xu 	}, {
2699da7f033dSHerbert Xu 		.alg = "deflate",
2700da7f033dSHerbert Xu 		.test = alg_test_comp,
27010818904dSMilan Broz 		.fips_allowed = 1,
2702da7f033dSHerbert Xu 		.suite = {
2703da7f033dSHerbert Xu 			.comp = {
2704da7f033dSHerbert Xu 				.comp = {
2705da7f033dSHerbert Xu 					.vecs = deflate_comp_tv_template,
2706da7f033dSHerbert Xu 					.count = DEFLATE_COMP_TEST_VECTORS
2707da7f033dSHerbert Xu 				},
2708da7f033dSHerbert Xu 				.decomp = {
2709da7f033dSHerbert Xu 					.vecs = deflate_decomp_tv_template,
2710da7f033dSHerbert Xu 					.count = DEFLATE_DECOMP_TEST_VECTORS
2711da7f033dSHerbert Xu 				}
2712da7f033dSHerbert Xu 			}
2713da7f033dSHerbert Xu 		}
2714da7f033dSHerbert Xu 	}, {
2715e448370dSJussi Kivilinna 		.alg = "digest_null",
2716e448370dSJussi Kivilinna 		.test = alg_test_null,
2717e448370dSJussi Kivilinna 	}, {
271864d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes128",
271964d1cdfbSStephan Mueller 		.test = alg_test_drbg,
272064d1cdfbSStephan Mueller 		.fips_allowed = 1,
272164d1cdfbSStephan Mueller 		.suite = {
272264d1cdfbSStephan Mueller 			.drbg = {
272364d1cdfbSStephan Mueller 				.vecs = drbg_nopr_ctr_aes128_tv_template,
272464d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes128_tv_template)
272564d1cdfbSStephan Mueller 			}
272664d1cdfbSStephan Mueller 		}
272764d1cdfbSStephan Mueller 	}, {
272864d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes192",
272964d1cdfbSStephan Mueller 		.test = alg_test_drbg,
273064d1cdfbSStephan Mueller 		.fips_allowed = 1,
273164d1cdfbSStephan Mueller 		.suite = {
273264d1cdfbSStephan Mueller 			.drbg = {
273364d1cdfbSStephan Mueller 				.vecs = drbg_nopr_ctr_aes192_tv_template,
273464d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes192_tv_template)
273564d1cdfbSStephan Mueller 			}
273664d1cdfbSStephan Mueller 		}
273764d1cdfbSStephan Mueller 	}, {
273864d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes256",
273964d1cdfbSStephan Mueller 		.test = alg_test_drbg,
274064d1cdfbSStephan Mueller 		.fips_allowed = 1,
274164d1cdfbSStephan Mueller 		.suite = {
274264d1cdfbSStephan Mueller 			.drbg = {
274364d1cdfbSStephan Mueller 				.vecs = drbg_nopr_ctr_aes256_tv_template,
274464d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes256_tv_template)
274564d1cdfbSStephan Mueller 			}
274664d1cdfbSStephan Mueller 		}
274764d1cdfbSStephan Mueller 	}, {
274864d1cdfbSStephan Mueller 		/*
274964d1cdfbSStephan Mueller 		 * There is no need to specifically test the DRBG with every
275064d1cdfbSStephan Mueller 		 * backend cipher -- covered by drbg_nopr_hmac_sha256 test
275164d1cdfbSStephan Mueller 		 */
275264d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha1",
275364d1cdfbSStephan Mueller 		.fips_allowed = 1,
275464d1cdfbSStephan Mueller 		.test = alg_test_null,
275564d1cdfbSStephan Mueller 	}, {
275664d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha256",
275764d1cdfbSStephan Mueller 		.test = alg_test_drbg,
275864d1cdfbSStephan Mueller 		.fips_allowed = 1,
275964d1cdfbSStephan Mueller 		.suite = {
276064d1cdfbSStephan Mueller 			.drbg = {
276164d1cdfbSStephan Mueller 				.vecs = drbg_nopr_hmac_sha256_tv_template,
276264d1cdfbSStephan Mueller 				.count =
276364d1cdfbSStephan Mueller 				ARRAY_SIZE(drbg_nopr_hmac_sha256_tv_template)
276464d1cdfbSStephan Mueller 			}
276564d1cdfbSStephan Mueller 		}
276664d1cdfbSStephan Mueller 	}, {
276764d1cdfbSStephan Mueller 		/* covered by drbg_nopr_hmac_sha256 test */
276864d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha384",
276964d1cdfbSStephan Mueller 		.fips_allowed = 1,
277064d1cdfbSStephan Mueller 		.test = alg_test_null,
277164d1cdfbSStephan Mueller 	}, {
277264d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha512",
277364d1cdfbSStephan Mueller 		.test = alg_test_null,
277464d1cdfbSStephan Mueller 		.fips_allowed = 1,
277564d1cdfbSStephan Mueller 	}, {
277664d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha1",
277764d1cdfbSStephan Mueller 		.fips_allowed = 1,
277864d1cdfbSStephan Mueller 		.test = alg_test_null,
277964d1cdfbSStephan Mueller 	}, {
278064d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha256",
278164d1cdfbSStephan Mueller 		.test = alg_test_drbg,
278264d1cdfbSStephan Mueller 		.fips_allowed = 1,
278364d1cdfbSStephan Mueller 		.suite = {
278464d1cdfbSStephan Mueller 			.drbg = {
278564d1cdfbSStephan Mueller 				.vecs = drbg_nopr_sha256_tv_template,
278664d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_sha256_tv_template)
278764d1cdfbSStephan Mueller 			}
278864d1cdfbSStephan Mueller 		}
278964d1cdfbSStephan Mueller 	}, {
279064d1cdfbSStephan Mueller 		/* covered by drbg_nopr_sha256 test */
279164d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha384",
279264d1cdfbSStephan Mueller 		.fips_allowed = 1,
279364d1cdfbSStephan Mueller 		.test = alg_test_null,
279464d1cdfbSStephan Mueller 	}, {
279564d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha512",
279664d1cdfbSStephan Mueller 		.fips_allowed = 1,
279764d1cdfbSStephan Mueller 		.test = alg_test_null,
279864d1cdfbSStephan Mueller 	}, {
279964d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes128",
280064d1cdfbSStephan Mueller 		.test = alg_test_drbg,
280164d1cdfbSStephan Mueller 		.fips_allowed = 1,
280264d1cdfbSStephan Mueller 		.suite = {
280364d1cdfbSStephan Mueller 			.drbg = {
280464d1cdfbSStephan Mueller 				.vecs = drbg_pr_ctr_aes128_tv_template,
280564d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_pr_ctr_aes128_tv_template)
280664d1cdfbSStephan Mueller 			}
280764d1cdfbSStephan Mueller 		}
280864d1cdfbSStephan Mueller 	}, {
280964d1cdfbSStephan Mueller 		/* covered by drbg_pr_ctr_aes128 test */
281064d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes192",
281164d1cdfbSStephan Mueller 		.fips_allowed = 1,
281264d1cdfbSStephan Mueller 		.test = alg_test_null,
281364d1cdfbSStephan Mueller 	}, {
281464d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes256",
281564d1cdfbSStephan Mueller 		.fips_allowed = 1,
281664d1cdfbSStephan Mueller 		.test = alg_test_null,
281764d1cdfbSStephan Mueller 	}, {
281864d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha1",
281964d1cdfbSStephan Mueller 		.fips_allowed = 1,
282064d1cdfbSStephan Mueller 		.test = alg_test_null,
282164d1cdfbSStephan Mueller 	}, {
282264d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha256",
282364d1cdfbSStephan Mueller 		.test = alg_test_drbg,
282464d1cdfbSStephan Mueller 		.fips_allowed = 1,
282564d1cdfbSStephan Mueller 		.suite = {
282664d1cdfbSStephan Mueller 			.drbg = {
282764d1cdfbSStephan Mueller 				.vecs = drbg_pr_hmac_sha256_tv_template,
282864d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_pr_hmac_sha256_tv_template)
282964d1cdfbSStephan Mueller 			}
283064d1cdfbSStephan Mueller 		}
283164d1cdfbSStephan Mueller 	}, {
283264d1cdfbSStephan Mueller 		/* covered by drbg_pr_hmac_sha256 test */
283364d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha384",
283464d1cdfbSStephan Mueller 		.fips_allowed = 1,
283564d1cdfbSStephan Mueller 		.test = alg_test_null,
283664d1cdfbSStephan Mueller 	}, {
283764d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha512",
283864d1cdfbSStephan Mueller 		.test = alg_test_null,
283964d1cdfbSStephan Mueller 		.fips_allowed = 1,
284064d1cdfbSStephan Mueller 	}, {
284164d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha1",
284264d1cdfbSStephan Mueller 		.fips_allowed = 1,
284364d1cdfbSStephan Mueller 		.test = alg_test_null,
284464d1cdfbSStephan Mueller 	}, {
284564d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha256",
284664d1cdfbSStephan Mueller 		.test = alg_test_drbg,
284764d1cdfbSStephan Mueller 		.fips_allowed = 1,
284864d1cdfbSStephan Mueller 		.suite = {
284964d1cdfbSStephan Mueller 			.drbg = {
285064d1cdfbSStephan Mueller 				.vecs = drbg_pr_sha256_tv_template,
285164d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_pr_sha256_tv_template)
285264d1cdfbSStephan Mueller 			}
285364d1cdfbSStephan Mueller 		}
285464d1cdfbSStephan Mueller 	}, {
285564d1cdfbSStephan Mueller 		/* covered by drbg_pr_sha256 test */
285664d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha384",
285764d1cdfbSStephan Mueller 		.fips_allowed = 1,
285864d1cdfbSStephan Mueller 		.test = alg_test_null,
285964d1cdfbSStephan Mueller 	}, {
286064d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha512",
286164d1cdfbSStephan Mueller 		.fips_allowed = 1,
286264d1cdfbSStephan Mueller 		.test = alg_test_null,
286364d1cdfbSStephan Mueller 	}, {
2864863b557aSYouquan, Song 		.alg = "ecb(__aes-aesni)",
2865863b557aSYouquan, Song 		.test = alg_test_null,
28666c79294fSMilan Broz 		.fips_allowed = 1,
2867863b557aSYouquan, Song 	}, {
2868da7f033dSHerbert Xu 		.alg = "ecb(aes)",
28691aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2870a1915d51SJarod Wilson 		.fips_allowed = 1,
2871da7f033dSHerbert Xu 		.suite = {
2872da7f033dSHerbert Xu 			.cipher = {
2873da7f033dSHerbert Xu 				.enc = {
2874da7f033dSHerbert Xu 					.vecs = aes_enc_tv_template,
2875da7f033dSHerbert Xu 					.count = AES_ENC_TEST_VECTORS
2876da7f033dSHerbert Xu 				},
2877da7f033dSHerbert Xu 				.dec = {
2878da7f033dSHerbert Xu 					.vecs = aes_dec_tv_template,
2879da7f033dSHerbert Xu 					.count = AES_DEC_TEST_VECTORS
2880da7f033dSHerbert Xu 				}
2881da7f033dSHerbert Xu 			}
2882da7f033dSHerbert Xu 		}
2883da7f033dSHerbert Xu 	}, {
2884da7f033dSHerbert Xu 		.alg = "ecb(anubis)",
28851aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2886da7f033dSHerbert Xu 		.suite = {
2887da7f033dSHerbert Xu 			.cipher = {
2888da7f033dSHerbert Xu 				.enc = {
2889da7f033dSHerbert Xu 					.vecs = anubis_enc_tv_template,
2890da7f033dSHerbert Xu 					.count = ANUBIS_ENC_TEST_VECTORS
2891da7f033dSHerbert Xu 				},
2892da7f033dSHerbert Xu 				.dec = {
2893da7f033dSHerbert Xu 					.vecs = anubis_dec_tv_template,
2894da7f033dSHerbert Xu 					.count = ANUBIS_DEC_TEST_VECTORS
2895da7f033dSHerbert Xu 				}
2896da7f033dSHerbert Xu 			}
2897da7f033dSHerbert Xu 		}
2898da7f033dSHerbert Xu 	}, {
2899da7f033dSHerbert Xu 		.alg = "ecb(arc4)",
29001aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2901da7f033dSHerbert Xu 		.suite = {
2902da7f033dSHerbert Xu 			.cipher = {
2903da7f033dSHerbert Xu 				.enc = {
2904da7f033dSHerbert Xu 					.vecs = arc4_enc_tv_template,
2905da7f033dSHerbert Xu 					.count = ARC4_ENC_TEST_VECTORS
2906da7f033dSHerbert Xu 				},
2907da7f033dSHerbert Xu 				.dec = {
2908da7f033dSHerbert Xu 					.vecs = arc4_dec_tv_template,
2909da7f033dSHerbert Xu 					.count = ARC4_DEC_TEST_VECTORS
2910da7f033dSHerbert Xu 				}
2911da7f033dSHerbert Xu 			}
2912da7f033dSHerbert Xu 		}
2913da7f033dSHerbert Xu 	}, {
2914da7f033dSHerbert Xu 		.alg = "ecb(blowfish)",
29151aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2916da7f033dSHerbert Xu 		.suite = {
2917da7f033dSHerbert Xu 			.cipher = {
2918da7f033dSHerbert Xu 				.enc = {
2919da7f033dSHerbert Xu 					.vecs = bf_enc_tv_template,
2920da7f033dSHerbert Xu 					.count = BF_ENC_TEST_VECTORS
2921da7f033dSHerbert Xu 				},
2922da7f033dSHerbert Xu 				.dec = {
2923da7f033dSHerbert Xu 					.vecs = bf_dec_tv_template,
2924da7f033dSHerbert Xu 					.count = BF_DEC_TEST_VECTORS
2925da7f033dSHerbert Xu 				}
2926da7f033dSHerbert Xu 			}
2927da7f033dSHerbert Xu 		}
2928da7f033dSHerbert Xu 	}, {
2929da7f033dSHerbert Xu 		.alg = "ecb(camellia)",
29301aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2931da7f033dSHerbert Xu 		.suite = {
2932da7f033dSHerbert Xu 			.cipher = {
2933da7f033dSHerbert Xu 				.enc = {
2934da7f033dSHerbert Xu 					.vecs = camellia_enc_tv_template,
2935da7f033dSHerbert Xu 					.count = CAMELLIA_ENC_TEST_VECTORS
2936da7f033dSHerbert Xu 				},
2937da7f033dSHerbert Xu 				.dec = {
2938da7f033dSHerbert Xu 					.vecs = camellia_dec_tv_template,
2939da7f033dSHerbert Xu 					.count = CAMELLIA_DEC_TEST_VECTORS
2940da7f033dSHerbert Xu 				}
2941da7f033dSHerbert Xu 			}
2942da7f033dSHerbert Xu 		}
2943da7f033dSHerbert Xu 	}, {
2944da7f033dSHerbert Xu 		.alg = "ecb(cast5)",
29451aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2946da7f033dSHerbert Xu 		.suite = {
2947da7f033dSHerbert Xu 			.cipher = {
2948da7f033dSHerbert Xu 				.enc = {
2949da7f033dSHerbert Xu 					.vecs = cast5_enc_tv_template,
2950da7f033dSHerbert Xu 					.count = CAST5_ENC_TEST_VECTORS
2951da7f033dSHerbert Xu 				},
2952da7f033dSHerbert Xu 				.dec = {
2953da7f033dSHerbert Xu 					.vecs = cast5_dec_tv_template,
2954da7f033dSHerbert Xu 					.count = CAST5_DEC_TEST_VECTORS
2955da7f033dSHerbert Xu 				}
2956da7f033dSHerbert Xu 			}
2957da7f033dSHerbert Xu 		}
2958da7f033dSHerbert Xu 	}, {
2959da7f033dSHerbert Xu 		.alg = "ecb(cast6)",
29601aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2961da7f033dSHerbert Xu 		.suite = {
2962da7f033dSHerbert Xu 			.cipher = {
2963da7f033dSHerbert Xu 				.enc = {
2964da7f033dSHerbert Xu 					.vecs = cast6_enc_tv_template,
2965da7f033dSHerbert Xu 					.count = CAST6_ENC_TEST_VECTORS
2966da7f033dSHerbert Xu 				},
2967da7f033dSHerbert Xu 				.dec = {
2968da7f033dSHerbert Xu 					.vecs = cast6_dec_tv_template,
2969da7f033dSHerbert Xu 					.count = CAST6_DEC_TEST_VECTORS
2970da7f033dSHerbert Xu 				}
2971da7f033dSHerbert Xu 			}
2972da7f033dSHerbert Xu 		}
2973da7f033dSHerbert Xu 	}, {
2974e448370dSJussi Kivilinna 		.alg = "ecb(cipher_null)",
2975e448370dSJussi Kivilinna 		.test = alg_test_null,
2976e448370dSJussi Kivilinna 	}, {
2977da7f033dSHerbert Xu 		.alg = "ecb(des)",
29781aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2979da7f033dSHerbert Xu 		.suite = {
2980da7f033dSHerbert Xu 			.cipher = {
2981da7f033dSHerbert Xu 				.enc = {
2982da7f033dSHerbert Xu 					.vecs = des_enc_tv_template,
2983da7f033dSHerbert Xu 					.count = DES_ENC_TEST_VECTORS
2984da7f033dSHerbert Xu 				},
2985da7f033dSHerbert Xu 				.dec = {
2986da7f033dSHerbert Xu 					.vecs = des_dec_tv_template,
2987da7f033dSHerbert Xu 					.count = DES_DEC_TEST_VECTORS
2988da7f033dSHerbert Xu 				}
2989da7f033dSHerbert Xu 			}
2990da7f033dSHerbert Xu 		}
2991da7f033dSHerbert Xu 	}, {
2992da7f033dSHerbert Xu 		.alg = "ecb(des3_ede)",
29931aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2994a1915d51SJarod Wilson 		.fips_allowed = 1,
2995da7f033dSHerbert Xu 		.suite = {
2996da7f033dSHerbert Xu 			.cipher = {
2997da7f033dSHerbert Xu 				.enc = {
2998da7f033dSHerbert Xu 					.vecs = des3_ede_enc_tv_template,
2999da7f033dSHerbert Xu 					.count = DES3_EDE_ENC_TEST_VECTORS
3000da7f033dSHerbert Xu 				},
3001da7f033dSHerbert Xu 				.dec = {
3002da7f033dSHerbert Xu 					.vecs = des3_ede_dec_tv_template,
3003da7f033dSHerbert Xu 					.count = DES3_EDE_DEC_TEST_VECTORS
3004da7f033dSHerbert Xu 				}
3005da7f033dSHerbert Xu 			}
3006da7f033dSHerbert Xu 		}
3007da7f033dSHerbert Xu 	}, {
300866e5bd00SJussi Kivilinna 		.alg = "ecb(fcrypt)",
300966e5bd00SJussi Kivilinna 		.test = alg_test_skcipher,
301066e5bd00SJussi Kivilinna 		.suite = {
301166e5bd00SJussi Kivilinna 			.cipher = {
301266e5bd00SJussi Kivilinna 				.enc = {
301366e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_enc_tv_template,
301466e5bd00SJussi Kivilinna 					.count = 1
301566e5bd00SJussi Kivilinna 				},
301666e5bd00SJussi Kivilinna 				.dec = {
301766e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_dec_tv_template,
301866e5bd00SJussi Kivilinna 					.count = 1
301966e5bd00SJussi Kivilinna 				}
302066e5bd00SJussi Kivilinna 			}
302166e5bd00SJussi Kivilinna 		}
302266e5bd00SJussi Kivilinna 	}, {
3023da7f033dSHerbert Xu 		.alg = "ecb(khazad)",
30241aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3025da7f033dSHerbert Xu 		.suite = {
3026da7f033dSHerbert Xu 			.cipher = {
3027da7f033dSHerbert Xu 				.enc = {
3028da7f033dSHerbert Xu 					.vecs = khazad_enc_tv_template,
3029da7f033dSHerbert Xu 					.count = KHAZAD_ENC_TEST_VECTORS
3030da7f033dSHerbert Xu 				},
3031da7f033dSHerbert Xu 				.dec = {
3032da7f033dSHerbert Xu 					.vecs = khazad_dec_tv_template,
3033da7f033dSHerbert Xu 					.count = KHAZAD_DEC_TEST_VECTORS
3034da7f033dSHerbert Xu 				}
3035da7f033dSHerbert Xu 			}
3036da7f033dSHerbert Xu 		}
3037da7f033dSHerbert Xu 	}, {
3038da7f033dSHerbert Xu 		.alg = "ecb(seed)",
30391aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3040da7f033dSHerbert Xu 		.suite = {
3041da7f033dSHerbert Xu 			.cipher = {
3042da7f033dSHerbert Xu 				.enc = {
3043da7f033dSHerbert Xu 					.vecs = seed_enc_tv_template,
3044da7f033dSHerbert Xu 					.count = SEED_ENC_TEST_VECTORS
3045da7f033dSHerbert Xu 				},
3046da7f033dSHerbert Xu 				.dec = {
3047da7f033dSHerbert Xu 					.vecs = seed_dec_tv_template,
3048da7f033dSHerbert Xu 					.count = SEED_DEC_TEST_VECTORS
3049da7f033dSHerbert Xu 				}
3050da7f033dSHerbert Xu 			}
3051da7f033dSHerbert Xu 		}
3052da7f033dSHerbert Xu 	}, {
3053da7f033dSHerbert Xu 		.alg = "ecb(serpent)",
30541aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3055da7f033dSHerbert Xu 		.suite = {
3056da7f033dSHerbert Xu 			.cipher = {
3057da7f033dSHerbert Xu 				.enc = {
3058da7f033dSHerbert Xu 					.vecs = serpent_enc_tv_template,
3059da7f033dSHerbert Xu 					.count = SERPENT_ENC_TEST_VECTORS
3060da7f033dSHerbert Xu 				},
3061da7f033dSHerbert Xu 				.dec = {
3062da7f033dSHerbert Xu 					.vecs = serpent_dec_tv_template,
3063da7f033dSHerbert Xu 					.count = SERPENT_DEC_TEST_VECTORS
3064da7f033dSHerbert Xu 				}
3065da7f033dSHerbert Xu 			}
3066da7f033dSHerbert Xu 		}
3067da7f033dSHerbert Xu 	}, {
3068da7f033dSHerbert Xu 		.alg = "ecb(tea)",
30691aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3070da7f033dSHerbert Xu 		.suite = {
3071da7f033dSHerbert Xu 			.cipher = {
3072da7f033dSHerbert Xu 				.enc = {
3073da7f033dSHerbert Xu 					.vecs = tea_enc_tv_template,
3074da7f033dSHerbert Xu 					.count = TEA_ENC_TEST_VECTORS
3075da7f033dSHerbert Xu 				},
3076da7f033dSHerbert Xu 				.dec = {
3077da7f033dSHerbert Xu 					.vecs = tea_dec_tv_template,
3078da7f033dSHerbert Xu 					.count = TEA_DEC_TEST_VECTORS
3079da7f033dSHerbert Xu 				}
3080da7f033dSHerbert Xu 			}
3081da7f033dSHerbert Xu 		}
3082da7f033dSHerbert Xu 	}, {
3083da7f033dSHerbert Xu 		.alg = "ecb(tnepres)",
30841aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3085da7f033dSHerbert Xu 		.suite = {
3086da7f033dSHerbert Xu 			.cipher = {
3087da7f033dSHerbert Xu 				.enc = {
3088da7f033dSHerbert Xu 					.vecs = tnepres_enc_tv_template,
3089da7f033dSHerbert Xu 					.count = TNEPRES_ENC_TEST_VECTORS
3090da7f033dSHerbert Xu 				},
3091da7f033dSHerbert Xu 				.dec = {
3092da7f033dSHerbert Xu 					.vecs = tnepres_dec_tv_template,
3093da7f033dSHerbert Xu 					.count = TNEPRES_DEC_TEST_VECTORS
3094da7f033dSHerbert Xu 				}
3095da7f033dSHerbert Xu 			}
3096da7f033dSHerbert Xu 		}
3097da7f033dSHerbert Xu 	}, {
3098da7f033dSHerbert Xu 		.alg = "ecb(twofish)",
30991aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3100da7f033dSHerbert Xu 		.suite = {
3101da7f033dSHerbert Xu 			.cipher = {
3102da7f033dSHerbert Xu 				.enc = {
3103da7f033dSHerbert Xu 					.vecs = tf_enc_tv_template,
3104da7f033dSHerbert Xu 					.count = TF_ENC_TEST_VECTORS
3105da7f033dSHerbert Xu 				},
3106da7f033dSHerbert Xu 				.dec = {
3107da7f033dSHerbert Xu 					.vecs = tf_dec_tv_template,
3108da7f033dSHerbert Xu 					.count = TF_DEC_TEST_VECTORS
3109da7f033dSHerbert Xu 				}
3110da7f033dSHerbert Xu 			}
3111da7f033dSHerbert Xu 		}
3112da7f033dSHerbert Xu 	}, {
3113da7f033dSHerbert Xu 		.alg = "ecb(xeta)",
31141aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3115da7f033dSHerbert Xu 		.suite = {
3116da7f033dSHerbert Xu 			.cipher = {
3117da7f033dSHerbert Xu 				.enc = {
3118da7f033dSHerbert Xu 					.vecs = xeta_enc_tv_template,
3119da7f033dSHerbert Xu 					.count = XETA_ENC_TEST_VECTORS
3120da7f033dSHerbert Xu 				},
3121da7f033dSHerbert Xu 				.dec = {
3122da7f033dSHerbert Xu 					.vecs = xeta_dec_tv_template,
3123da7f033dSHerbert Xu 					.count = XETA_DEC_TEST_VECTORS
3124da7f033dSHerbert Xu 				}
3125da7f033dSHerbert Xu 			}
3126da7f033dSHerbert Xu 		}
3127da7f033dSHerbert Xu 	}, {
3128da7f033dSHerbert Xu 		.alg = "ecb(xtea)",
31291aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3130da7f033dSHerbert Xu 		.suite = {
3131da7f033dSHerbert Xu 			.cipher = {
3132da7f033dSHerbert Xu 				.enc = {
3133da7f033dSHerbert Xu 					.vecs = xtea_enc_tv_template,
3134da7f033dSHerbert Xu 					.count = XTEA_ENC_TEST_VECTORS
3135da7f033dSHerbert Xu 				},
3136da7f033dSHerbert Xu 				.dec = {
3137da7f033dSHerbert Xu 					.vecs = xtea_dec_tv_template,
3138da7f033dSHerbert Xu 					.count = XTEA_DEC_TEST_VECTORS
3139da7f033dSHerbert Xu 				}
3140da7f033dSHerbert Xu 			}
3141da7f033dSHerbert Xu 		}
3142da7f033dSHerbert Xu 	}, {
3143da7f033dSHerbert Xu 		.alg = "gcm(aes)",
3144da7f033dSHerbert Xu 		.test = alg_test_aead,
3145a1915d51SJarod Wilson 		.fips_allowed = 1,
3146da7f033dSHerbert Xu 		.suite = {
3147da7f033dSHerbert Xu 			.aead = {
3148da7f033dSHerbert Xu 				.enc = {
3149da7f033dSHerbert Xu 					.vecs = aes_gcm_enc_tv_template,
3150da7f033dSHerbert Xu 					.count = AES_GCM_ENC_TEST_VECTORS
3151da7f033dSHerbert Xu 				},
3152da7f033dSHerbert Xu 				.dec = {
3153da7f033dSHerbert Xu 					.vecs = aes_gcm_dec_tv_template,
3154da7f033dSHerbert Xu 					.count = AES_GCM_DEC_TEST_VECTORS
3155da7f033dSHerbert Xu 				}
3156da7f033dSHerbert Xu 			}
3157da7f033dSHerbert Xu 		}
3158da7f033dSHerbert Xu 	}, {
3159507069c9SYouquan, Song 		.alg = "ghash",
3160507069c9SYouquan, Song 		.test = alg_test_hash,
316118c0ebd2SJarod Wilson 		.fips_allowed = 1,
3162507069c9SYouquan, Song 		.suite = {
3163507069c9SYouquan, Song 			.hash = {
3164507069c9SYouquan, Song 				.vecs = ghash_tv_template,
3165507069c9SYouquan, Song 				.count = GHASH_TEST_VECTORS
3166507069c9SYouquan, Song 			}
3167507069c9SYouquan, Song 		}
3168507069c9SYouquan, Song 	}, {
3169a482b081SSonic Zhang 		.alg = "hmac(crc32)",
3170a482b081SSonic Zhang 		.test = alg_test_hash,
3171a482b081SSonic Zhang 		.suite = {
3172a482b081SSonic Zhang 			.hash = {
3173a482b081SSonic Zhang 				.vecs = bfin_crc_tv_template,
3174a482b081SSonic Zhang 				.count = BFIN_CRC_TEST_VECTORS
3175a482b081SSonic Zhang 			}
3176a482b081SSonic Zhang 		}
3177a482b081SSonic Zhang 	}, {
3178da7f033dSHerbert Xu 		.alg = "hmac(md5)",
3179da7f033dSHerbert Xu 		.test = alg_test_hash,
3180da7f033dSHerbert Xu 		.suite = {
3181da7f033dSHerbert Xu 			.hash = {
3182da7f033dSHerbert Xu 				.vecs = hmac_md5_tv_template,
3183da7f033dSHerbert Xu 				.count = HMAC_MD5_TEST_VECTORS
3184da7f033dSHerbert Xu 			}
3185da7f033dSHerbert Xu 		}
3186da7f033dSHerbert Xu 	}, {
3187da7f033dSHerbert Xu 		.alg = "hmac(rmd128)",
3188da7f033dSHerbert Xu 		.test = alg_test_hash,
3189da7f033dSHerbert Xu 		.suite = {
3190da7f033dSHerbert Xu 			.hash = {
3191da7f033dSHerbert Xu 				.vecs = hmac_rmd128_tv_template,
3192da7f033dSHerbert Xu 				.count = HMAC_RMD128_TEST_VECTORS
3193da7f033dSHerbert Xu 			}
3194da7f033dSHerbert Xu 		}
3195da7f033dSHerbert Xu 	}, {
3196da7f033dSHerbert Xu 		.alg = "hmac(rmd160)",
3197da7f033dSHerbert Xu 		.test = alg_test_hash,
3198da7f033dSHerbert Xu 		.suite = {
3199da7f033dSHerbert Xu 			.hash = {
3200da7f033dSHerbert Xu 				.vecs = hmac_rmd160_tv_template,
3201da7f033dSHerbert Xu 				.count = HMAC_RMD160_TEST_VECTORS
3202da7f033dSHerbert Xu 			}
3203da7f033dSHerbert Xu 		}
3204da7f033dSHerbert Xu 	}, {
3205da7f033dSHerbert Xu 		.alg = "hmac(sha1)",
3206da7f033dSHerbert Xu 		.test = alg_test_hash,
3207a1915d51SJarod Wilson 		.fips_allowed = 1,
3208da7f033dSHerbert Xu 		.suite = {
3209da7f033dSHerbert Xu 			.hash = {
3210da7f033dSHerbert Xu 				.vecs = hmac_sha1_tv_template,
3211da7f033dSHerbert Xu 				.count = HMAC_SHA1_TEST_VECTORS
3212da7f033dSHerbert Xu 			}
3213da7f033dSHerbert Xu 		}
3214da7f033dSHerbert Xu 	}, {
3215da7f033dSHerbert Xu 		.alg = "hmac(sha224)",
3216da7f033dSHerbert Xu 		.test = alg_test_hash,
3217a1915d51SJarod Wilson 		.fips_allowed = 1,
3218da7f033dSHerbert Xu 		.suite = {
3219da7f033dSHerbert Xu 			.hash = {
3220da7f033dSHerbert Xu 				.vecs = hmac_sha224_tv_template,
3221da7f033dSHerbert Xu 				.count = HMAC_SHA224_TEST_VECTORS
3222da7f033dSHerbert Xu 			}
3223da7f033dSHerbert Xu 		}
3224da7f033dSHerbert Xu 	}, {
3225da7f033dSHerbert Xu 		.alg = "hmac(sha256)",
3226da7f033dSHerbert Xu 		.test = alg_test_hash,
3227a1915d51SJarod Wilson 		.fips_allowed = 1,
3228da7f033dSHerbert Xu 		.suite = {
3229da7f033dSHerbert Xu 			.hash = {
3230da7f033dSHerbert Xu 				.vecs = hmac_sha256_tv_template,
3231da7f033dSHerbert Xu 				.count = HMAC_SHA256_TEST_VECTORS
3232da7f033dSHerbert Xu 			}
3233da7f033dSHerbert Xu 		}
3234da7f033dSHerbert Xu 	}, {
3235da7f033dSHerbert Xu 		.alg = "hmac(sha384)",
3236da7f033dSHerbert Xu 		.test = alg_test_hash,
3237a1915d51SJarod Wilson 		.fips_allowed = 1,
3238da7f033dSHerbert Xu 		.suite = {
3239da7f033dSHerbert Xu 			.hash = {
3240da7f033dSHerbert Xu 				.vecs = hmac_sha384_tv_template,
3241da7f033dSHerbert Xu 				.count = HMAC_SHA384_TEST_VECTORS
3242da7f033dSHerbert Xu 			}
3243da7f033dSHerbert Xu 		}
3244da7f033dSHerbert Xu 	}, {
3245da7f033dSHerbert Xu 		.alg = "hmac(sha512)",
3246da7f033dSHerbert Xu 		.test = alg_test_hash,
3247a1915d51SJarod Wilson 		.fips_allowed = 1,
3248da7f033dSHerbert Xu 		.suite = {
3249da7f033dSHerbert Xu 			.hash = {
3250da7f033dSHerbert Xu 				.vecs = hmac_sha512_tv_template,
3251da7f033dSHerbert Xu 				.count = HMAC_SHA512_TEST_VECTORS
3252da7f033dSHerbert Xu 			}
3253da7f033dSHerbert Xu 		}
3254da7f033dSHerbert Xu 	}, {
3255bb5530e4SStephan Mueller 		.alg = "jitterentropy_rng",
3256bb5530e4SStephan Mueller 		.fips_allowed = 1,
3257bb5530e4SStephan Mueller 		.test = alg_test_null,
3258bb5530e4SStephan Mueller 	}, {
325935351988SStephan Mueller 		.alg = "kw(aes)",
326035351988SStephan Mueller 		.test = alg_test_skcipher,
326135351988SStephan Mueller 		.fips_allowed = 1,
326235351988SStephan Mueller 		.suite = {
326335351988SStephan Mueller 			.cipher = {
326435351988SStephan Mueller 				.enc = {
326535351988SStephan Mueller 					.vecs = aes_kw_enc_tv_template,
326635351988SStephan Mueller 					.count = ARRAY_SIZE(aes_kw_enc_tv_template)
326735351988SStephan Mueller 				},
326835351988SStephan Mueller 				.dec = {
326935351988SStephan Mueller 					.vecs = aes_kw_dec_tv_template,
327035351988SStephan Mueller 					.count = ARRAY_SIZE(aes_kw_dec_tv_template)
327135351988SStephan Mueller 				}
327235351988SStephan Mueller 			}
327335351988SStephan Mueller 		}
327435351988SStephan Mueller 	}, {
3275da7f033dSHerbert Xu 		.alg = "lrw(aes)",
32761aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3277da7f033dSHerbert Xu 		.suite = {
3278da7f033dSHerbert Xu 			.cipher = {
3279da7f033dSHerbert Xu 				.enc = {
3280da7f033dSHerbert Xu 					.vecs = aes_lrw_enc_tv_template,
3281da7f033dSHerbert Xu 					.count = AES_LRW_ENC_TEST_VECTORS
3282da7f033dSHerbert Xu 				},
3283da7f033dSHerbert Xu 				.dec = {
3284da7f033dSHerbert Xu 					.vecs = aes_lrw_dec_tv_template,
3285da7f033dSHerbert Xu 					.count = AES_LRW_DEC_TEST_VECTORS
3286da7f033dSHerbert Xu 				}
3287da7f033dSHerbert Xu 			}
3288da7f033dSHerbert Xu 		}
3289da7f033dSHerbert Xu 	}, {
32900840605eSJussi Kivilinna 		.alg = "lrw(camellia)",
32910840605eSJussi Kivilinna 		.test = alg_test_skcipher,
32920840605eSJussi Kivilinna 		.suite = {
32930840605eSJussi Kivilinna 			.cipher = {
32940840605eSJussi Kivilinna 				.enc = {
32950840605eSJussi Kivilinna 					.vecs = camellia_lrw_enc_tv_template,
32960840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_ENC_TEST_VECTORS
32970840605eSJussi Kivilinna 				},
32980840605eSJussi Kivilinna 				.dec = {
32990840605eSJussi Kivilinna 					.vecs = camellia_lrw_dec_tv_template,
33000840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_DEC_TEST_VECTORS
33010840605eSJussi Kivilinna 				}
33020840605eSJussi Kivilinna 			}
33030840605eSJussi Kivilinna 		}
33040840605eSJussi Kivilinna 	}, {
33059b8b0405SJohannes Goetzfried 		.alg = "lrw(cast6)",
33069b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
33079b8b0405SJohannes Goetzfried 		.suite = {
33089b8b0405SJohannes Goetzfried 			.cipher = {
33099b8b0405SJohannes Goetzfried 				.enc = {
33109b8b0405SJohannes Goetzfried 					.vecs = cast6_lrw_enc_tv_template,
33119b8b0405SJohannes Goetzfried 					.count = CAST6_LRW_ENC_TEST_VECTORS
33129b8b0405SJohannes Goetzfried 				},
33139b8b0405SJohannes Goetzfried 				.dec = {
33149b8b0405SJohannes Goetzfried 					.vecs = cast6_lrw_dec_tv_template,
33159b8b0405SJohannes Goetzfried 					.count = CAST6_LRW_DEC_TEST_VECTORS
33169b8b0405SJohannes Goetzfried 				}
33179b8b0405SJohannes Goetzfried 			}
33189b8b0405SJohannes Goetzfried 		}
33199b8b0405SJohannes Goetzfried 	}, {
3320d7bfc0faSJussi Kivilinna 		.alg = "lrw(serpent)",
3321d7bfc0faSJussi Kivilinna 		.test = alg_test_skcipher,
3322d7bfc0faSJussi Kivilinna 		.suite = {
3323d7bfc0faSJussi Kivilinna 			.cipher = {
3324d7bfc0faSJussi Kivilinna 				.enc = {
3325d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_enc_tv_template,
3326d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_ENC_TEST_VECTORS
3327d7bfc0faSJussi Kivilinna 				},
3328d7bfc0faSJussi Kivilinna 				.dec = {
3329d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_dec_tv_template,
3330d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_DEC_TEST_VECTORS
3331d7bfc0faSJussi Kivilinna 				}
3332d7bfc0faSJussi Kivilinna 			}
3333d7bfc0faSJussi Kivilinna 		}
3334d7bfc0faSJussi Kivilinna 	}, {
33350b2a1551SJussi Kivilinna 		.alg = "lrw(twofish)",
33360b2a1551SJussi Kivilinna 		.test = alg_test_skcipher,
33370b2a1551SJussi Kivilinna 		.suite = {
33380b2a1551SJussi Kivilinna 			.cipher = {
33390b2a1551SJussi Kivilinna 				.enc = {
33400b2a1551SJussi Kivilinna 					.vecs = tf_lrw_enc_tv_template,
33410b2a1551SJussi Kivilinna 					.count = TF_LRW_ENC_TEST_VECTORS
33420b2a1551SJussi Kivilinna 				},
33430b2a1551SJussi Kivilinna 				.dec = {
33440b2a1551SJussi Kivilinna 					.vecs = tf_lrw_dec_tv_template,
33450b2a1551SJussi Kivilinna 					.count = TF_LRW_DEC_TEST_VECTORS
33460b2a1551SJussi Kivilinna 				}
33470b2a1551SJussi Kivilinna 			}
33480b2a1551SJussi Kivilinna 		}
33490b2a1551SJussi Kivilinna 	}, {
33501443cc9bSKOVACS Krisztian 		.alg = "lz4",
33511443cc9bSKOVACS Krisztian 		.test = alg_test_comp,
33521443cc9bSKOVACS Krisztian 		.fips_allowed = 1,
33531443cc9bSKOVACS Krisztian 		.suite = {
33541443cc9bSKOVACS Krisztian 			.comp = {
33551443cc9bSKOVACS Krisztian 				.comp = {
33561443cc9bSKOVACS Krisztian 					.vecs = lz4_comp_tv_template,
33571443cc9bSKOVACS Krisztian 					.count = LZ4_COMP_TEST_VECTORS
33581443cc9bSKOVACS Krisztian 				},
33591443cc9bSKOVACS Krisztian 				.decomp = {
33601443cc9bSKOVACS Krisztian 					.vecs = lz4_decomp_tv_template,
33611443cc9bSKOVACS Krisztian 					.count = LZ4_DECOMP_TEST_VECTORS
33621443cc9bSKOVACS Krisztian 				}
33631443cc9bSKOVACS Krisztian 			}
33641443cc9bSKOVACS Krisztian 		}
33651443cc9bSKOVACS Krisztian 	}, {
33661443cc9bSKOVACS Krisztian 		.alg = "lz4hc",
33671443cc9bSKOVACS Krisztian 		.test = alg_test_comp,
33681443cc9bSKOVACS Krisztian 		.fips_allowed = 1,
33691443cc9bSKOVACS Krisztian 		.suite = {
33701443cc9bSKOVACS Krisztian 			.comp = {
33711443cc9bSKOVACS Krisztian 				.comp = {
33721443cc9bSKOVACS Krisztian 					.vecs = lz4hc_comp_tv_template,
33731443cc9bSKOVACS Krisztian 					.count = LZ4HC_COMP_TEST_VECTORS
33741443cc9bSKOVACS Krisztian 				},
33751443cc9bSKOVACS Krisztian 				.decomp = {
33761443cc9bSKOVACS Krisztian 					.vecs = lz4hc_decomp_tv_template,
33771443cc9bSKOVACS Krisztian 					.count = LZ4HC_DECOMP_TEST_VECTORS
33781443cc9bSKOVACS Krisztian 				}
33791443cc9bSKOVACS Krisztian 			}
33801443cc9bSKOVACS Krisztian 		}
33811443cc9bSKOVACS Krisztian 	}, {
3382da7f033dSHerbert Xu 		.alg = "lzo",
3383da7f033dSHerbert Xu 		.test = alg_test_comp,
33840818904dSMilan Broz 		.fips_allowed = 1,
3385da7f033dSHerbert Xu 		.suite = {
3386da7f033dSHerbert Xu 			.comp = {
3387da7f033dSHerbert Xu 				.comp = {
3388da7f033dSHerbert Xu 					.vecs = lzo_comp_tv_template,
3389da7f033dSHerbert Xu 					.count = LZO_COMP_TEST_VECTORS
3390da7f033dSHerbert Xu 				},
3391da7f033dSHerbert Xu 				.decomp = {
3392da7f033dSHerbert Xu 					.vecs = lzo_decomp_tv_template,
3393da7f033dSHerbert Xu 					.count = LZO_DECOMP_TEST_VECTORS
3394da7f033dSHerbert Xu 				}
3395da7f033dSHerbert Xu 			}
3396da7f033dSHerbert Xu 		}
3397da7f033dSHerbert Xu 	}, {
3398da7f033dSHerbert Xu 		.alg = "md4",
3399da7f033dSHerbert Xu 		.test = alg_test_hash,
3400da7f033dSHerbert Xu 		.suite = {
3401da7f033dSHerbert Xu 			.hash = {
3402da7f033dSHerbert Xu 				.vecs = md4_tv_template,
3403da7f033dSHerbert Xu 				.count = MD4_TEST_VECTORS
3404da7f033dSHerbert Xu 			}
3405da7f033dSHerbert Xu 		}
3406da7f033dSHerbert Xu 	}, {
3407da7f033dSHerbert Xu 		.alg = "md5",
3408da7f033dSHerbert Xu 		.test = alg_test_hash,
3409da7f033dSHerbert Xu 		.suite = {
3410da7f033dSHerbert Xu 			.hash = {
3411da7f033dSHerbert Xu 				.vecs = md5_tv_template,
3412da7f033dSHerbert Xu 				.count = MD5_TEST_VECTORS
3413da7f033dSHerbert Xu 			}
3414da7f033dSHerbert Xu 		}
3415da7f033dSHerbert Xu 	}, {
3416da7f033dSHerbert Xu 		.alg = "michael_mic",
3417da7f033dSHerbert Xu 		.test = alg_test_hash,
3418da7f033dSHerbert Xu 		.suite = {
3419da7f033dSHerbert Xu 			.hash = {
3420da7f033dSHerbert Xu 				.vecs = michael_mic_tv_template,
3421da7f033dSHerbert Xu 				.count = MICHAEL_MIC_TEST_VECTORS
3422da7f033dSHerbert Xu 			}
3423da7f033dSHerbert Xu 		}
3424da7f033dSHerbert Xu 	}, {
3425ba0e14acSPuneet Saxena 		.alg = "ofb(aes)",
3426ba0e14acSPuneet Saxena 		.test = alg_test_skcipher,
3427ba0e14acSPuneet Saxena 		.fips_allowed = 1,
3428ba0e14acSPuneet Saxena 		.suite = {
3429ba0e14acSPuneet Saxena 			.cipher = {
3430ba0e14acSPuneet Saxena 				.enc = {
3431ba0e14acSPuneet Saxena 					.vecs = aes_ofb_enc_tv_template,
3432ba0e14acSPuneet Saxena 					.count = AES_OFB_ENC_TEST_VECTORS
3433ba0e14acSPuneet Saxena 				},
3434ba0e14acSPuneet Saxena 				.dec = {
3435ba0e14acSPuneet Saxena 					.vecs = aes_ofb_dec_tv_template,
3436ba0e14acSPuneet Saxena 					.count = AES_OFB_DEC_TEST_VECTORS
3437ba0e14acSPuneet Saxena 				}
3438ba0e14acSPuneet Saxena 			}
3439ba0e14acSPuneet Saxena 		}
3440ba0e14acSPuneet Saxena 	}, {
3441da7f033dSHerbert Xu 		.alg = "pcbc(fcrypt)",
34421aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3443da7f033dSHerbert Xu 		.suite = {
3444da7f033dSHerbert Xu 			.cipher = {
3445da7f033dSHerbert Xu 				.enc = {
3446da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_enc_tv_template,
3447da7f033dSHerbert Xu 					.count = FCRYPT_ENC_TEST_VECTORS
3448da7f033dSHerbert Xu 				},
3449da7f033dSHerbert Xu 				.dec = {
3450da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_dec_tv_template,
3451da7f033dSHerbert Xu 					.count = FCRYPT_DEC_TEST_VECTORS
3452da7f033dSHerbert Xu 				}
3453da7f033dSHerbert Xu 			}
3454da7f033dSHerbert Xu 		}
3455da7f033dSHerbert Xu 	}, {
3456eee9dc61SMartin Willi 		.alg = "poly1305",
3457eee9dc61SMartin Willi 		.test = alg_test_hash,
3458eee9dc61SMartin Willi 		.suite = {
3459eee9dc61SMartin Willi 			.hash = {
3460eee9dc61SMartin Willi 				.vecs = poly1305_tv_template,
3461eee9dc61SMartin Willi 				.count = POLY1305_TEST_VECTORS
3462eee9dc61SMartin Willi 			}
3463eee9dc61SMartin Willi 		}
3464eee9dc61SMartin Willi 	}, {
3465da7f033dSHerbert Xu 		.alg = "rfc3686(ctr(aes))",
34661aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3467a1915d51SJarod Wilson 		.fips_allowed = 1,
3468da7f033dSHerbert Xu 		.suite = {
3469da7f033dSHerbert Xu 			.cipher = {
3470da7f033dSHerbert Xu 				.enc = {
3471f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_enc_tv_template,
3472f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_ENC_TEST_VECTORS
3473da7f033dSHerbert Xu 				},
3474da7f033dSHerbert Xu 				.dec = {
3475f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_dec_tv_template,
3476f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_DEC_TEST_VECTORS
3477da7f033dSHerbert Xu 				}
3478da7f033dSHerbert Xu 			}
3479da7f033dSHerbert Xu 		}
3480da7f033dSHerbert Xu 	}, {
34813f31a740SHerbert Xu 		.alg = "rfc4106(gcm(aes))",
348269435b94SAdrian Hoban 		.test = alg_test_aead,
3483db71f29aSJarod Wilson 		.fips_allowed = 1,
348469435b94SAdrian Hoban 		.suite = {
348569435b94SAdrian Hoban 			.aead = {
348669435b94SAdrian Hoban 				.enc = {
348769435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_enc_tv_template,
348869435b94SAdrian Hoban 					.count = AES_GCM_4106_ENC_TEST_VECTORS
348969435b94SAdrian Hoban 				},
349069435b94SAdrian Hoban 				.dec = {
349169435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_dec_tv_template,
349269435b94SAdrian Hoban 					.count = AES_GCM_4106_DEC_TEST_VECTORS
349369435b94SAdrian Hoban 				}
349469435b94SAdrian Hoban 			}
349569435b94SAdrian Hoban 		}
349669435b94SAdrian Hoban 	}, {
3497544c436aSHerbert Xu 		.alg = "rfc4309(ccm(aes))",
34985d667322SJarod Wilson 		.test = alg_test_aead,
3499a1915d51SJarod Wilson 		.fips_allowed = 1,
35005d667322SJarod Wilson 		.suite = {
35015d667322SJarod Wilson 			.aead = {
35025d667322SJarod Wilson 				.enc = {
35035d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_enc_tv_template,
35045d667322SJarod Wilson 					.count = AES_CCM_4309_ENC_TEST_VECTORS
35055d667322SJarod Wilson 				},
35065d667322SJarod Wilson 				.dec = {
35075d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_dec_tv_template,
35085d667322SJarod Wilson 					.count = AES_CCM_4309_DEC_TEST_VECTORS
35095d667322SJarod Wilson 				}
35105d667322SJarod Wilson 			}
35115d667322SJarod Wilson 		}
35125d667322SJarod Wilson 	}, {
3513bb68745eSHerbert Xu 		.alg = "rfc4543(gcm(aes))",
3514e9b7441aSJussi Kivilinna 		.test = alg_test_aead,
3515e9b7441aSJussi Kivilinna 		.suite = {
3516e9b7441aSJussi Kivilinna 			.aead = {
3517e9b7441aSJussi Kivilinna 				.enc = {
3518e9b7441aSJussi Kivilinna 					.vecs = aes_gcm_rfc4543_enc_tv_template,
3519e9b7441aSJussi Kivilinna 					.count = AES_GCM_4543_ENC_TEST_VECTORS
3520e9b7441aSJussi Kivilinna 				},
3521e9b7441aSJussi Kivilinna 				.dec = {
3522e9b7441aSJussi Kivilinna 					.vecs = aes_gcm_rfc4543_dec_tv_template,
3523e9b7441aSJussi Kivilinna 					.count = AES_GCM_4543_DEC_TEST_VECTORS
3524e9b7441aSJussi Kivilinna 				},
3525e9b7441aSJussi Kivilinna 			}
3526e9b7441aSJussi Kivilinna 		}
3527e9b7441aSJussi Kivilinna 	}, {
3528af2b76b5SMartin Willi 		.alg = "rfc7539(chacha20,poly1305)",
3529af2b76b5SMartin Willi 		.test = alg_test_aead,
3530af2b76b5SMartin Willi 		.suite = {
3531af2b76b5SMartin Willi 			.aead = {
3532af2b76b5SMartin Willi 				.enc = {
3533af2b76b5SMartin Willi 					.vecs = rfc7539_enc_tv_template,
3534af2b76b5SMartin Willi 					.count = RFC7539_ENC_TEST_VECTORS
3535af2b76b5SMartin Willi 				},
3536af2b76b5SMartin Willi 				.dec = {
3537af2b76b5SMartin Willi 					.vecs = rfc7539_dec_tv_template,
3538af2b76b5SMartin Willi 					.count = RFC7539_DEC_TEST_VECTORS
3539af2b76b5SMartin Willi 				},
3540af2b76b5SMartin Willi 			}
3541af2b76b5SMartin Willi 		}
3542af2b76b5SMartin Willi 	}, {
35435900758dSMartin Willi 		.alg = "rfc7539esp(chacha20,poly1305)",
35445900758dSMartin Willi 		.test = alg_test_aead,
35455900758dSMartin Willi 		.suite = {
35465900758dSMartin Willi 			.aead = {
35475900758dSMartin Willi 				.enc = {
35485900758dSMartin Willi 					.vecs = rfc7539esp_enc_tv_template,
35495900758dSMartin Willi 					.count = RFC7539ESP_ENC_TEST_VECTORS
35505900758dSMartin Willi 				},
35515900758dSMartin Willi 				.dec = {
35525900758dSMartin Willi 					.vecs = rfc7539esp_dec_tv_template,
35535900758dSMartin Willi 					.count = RFC7539ESP_DEC_TEST_VECTORS
35545900758dSMartin Willi 				},
35555900758dSMartin Willi 			}
35565900758dSMartin Willi 		}
35575900758dSMartin Willi 	}, {
3558da7f033dSHerbert Xu 		.alg = "rmd128",
3559da7f033dSHerbert Xu 		.test = alg_test_hash,
3560da7f033dSHerbert Xu 		.suite = {
3561da7f033dSHerbert Xu 			.hash = {
3562da7f033dSHerbert Xu 				.vecs = rmd128_tv_template,
3563da7f033dSHerbert Xu 				.count = RMD128_TEST_VECTORS
3564da7f033dSHerbert Xu 			}
3565da7f033dSHerbert Xu 		}
3566da7f033dSHerbert Xu 	}, {
3567da7f033dSHerbert Xu 		.alg = "rmd160",
3568da7f033dSHerbert Xu 		.test = alg_test_hash,
3569da7f033dSHerbert Xu 		.suite = {
3570da7f033dSHerbert Xu 			.hash = {
3571da7f033dSHerbert Xu 				.vecs = rmd160_tv_template,
3572da7f033dSHerbert Xu 				.count = RMD160_TEST_VECTORS
3573da7f033dSHerbert Xu 			}
3574da7f033dSHerbert Xu 		}
3575da7f033dSHerbert Xu 	}, {
3576da7f033dSHerbert Xu 		.alg = "rmd256",
3577da7f033dSHerbert Xu 		.test = alg_test_hash,
3578da7f033dSHerbert Xu 		.suite = {
3579da7f033dSHerbert Xu 			.hash = {
3580da7f033dSHerbert Xu 				.vecs = rmd256_tv_template,
3581da7f033dSHerbert Xu 				.count = RMD256_TEST_VECTORS
3582da7f033dSHerbert Xu 			}
3583da7f033dSHerbert Xu 		}
3584da7f033dSHerbert Xu 	}, {
3585da7f033dSHerbert Xu 		.alg = "rmd320",
3586da7f033dSHerbert Xu 		.test = alg_test_hash,
3587da7f033dSHerbert Xu 		.suite = {
3588da7f033dSHerbert Xu 			.hash = {
3589da7f033dSHerbert Xu 				.vecs = rmd320_tv_template,
3590da7f033dSHerbert Xu 				.count = RMD320_TEST_VECTORS
3591da7f033dSHerbert Xu 			}
3592da7f033dSHerbert Xu 		}
3593da7f033dSHerbert Xu 	}, {
3594946cc463STadeusz Struk 		.alg = "rsa",
3595946cc463STadeusz Struk 		.test = alg_test_akcipher,
3596946cc463STadeusz Struk 		.fips_allowed = 1,
3597946cc463STadeusz Struk 		.suite = {
3598946cc463STadeusz Struk 			.akcipher = {
3599946cc463STadeusz Struk 				.vecs = rsa_tv_template,
3600946cc463STadeusz Struk 				.count = RSA_TEST_VECTORS
3601946cc463STadeusz Struk 			}
3602946cc463STadeusz Struk 		}
3603946cc463STadeusz Struk 	}, {
3604da7f033dSHerbert Xu 		.alg = "salsa20",
36051aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3606da7f033dSHerbert Xu 		.suite = {
3607da7f033dSHerbert Xu 			.cipher = {
3608da7f033dSHerbert Xu 				.enc = {
3609da7f033dSHerbert Xu 					.vecs = salsa20_stream_enc_tv_template,
3610da7f033dSHerbert Xu 					.count = SALSA20_STREAM_ENC_TEST_VECTORS
3611da7f033dSHerbert Xu 				}
3612da7f033dSHerbert Xu 			}
3613da7f033dSHerbert Xu 		}
3614da7f033dSHerbert Xu 	}, {
3615da7f033dSHerbert Xu 		.alg = "sha1",
3616da7f033dSHerbert Xu 		.test = alg_test_hash,
3617a1915d51SJarod Wilson 		.fips_allowed = 1,
3618da7f033dSHerbert Xu 		.suite = {
3619da7f033dSHerbert Xu 			.hash = {
3620da7f033dSHerbert Xu 				.vecs = sha1_tv_template,
3621da7f033dSHerbert Xu 				.count = SHA1_TEST_VECTORS
3622da7f033dSHerbert Xu 			}
3623da7f033dSHerbert Xu 		}
3624da7f033dSHerbert Xu 	}, {
3625da7f033dSHerbert Xu 		.alg = "sha224",
3626da7f033dSHerbert Xu 		.test = alg_test_hash,
3627a1915d51SJarod Wilson 		.fips_allowed = 1,
3628da7f033dSHerbert Xu 		.suite = {
3629da7f033dSHerbert Xu 			.hash = {
3630da7f033dSHerbert Xu 				.vecs = sha224_tv_template,
3631da7f033dSHerbert Xu 				.count = SHA224_TEST_VECTORS
3632da7f033dSHerbert Xu 			}
3633da7f033dSHerbert Xu 		}
3634da7f033dSHerbert Xu 	}, {
3635da7f033dSHerbert Xu 		.alg = "sha256",
3636da7f033dSHerbert Xu 		.test = alg_test_hash,
3637a1915d51SJarod Wilson 		.fips_allowed = 1,
3638da7f033dSHerbert Xu 		.suite = {
3639da7f033dSHerbert Xu 			.hash = {
3640da7f033dSHerbert Xu 				.vecs = sha256_tv_template,
3641da7f033dSHerbert Xu 				.count = SHA256_TEST_VECTORS
3642da7f033dSHerbert Xu 			}
3643da7f033dSHerbert Xu 		}
3644da7f033dSHerbert Xu 	}, {
3645da7f033dSHerbert Xu 		.alg = "sha384",
3646da7f033dSHerbert Xu 		.test = alg_test_hash,
3647a1915d51SJarod Wilson 		.fips_allowed = 1,
3648da7f033dSHerbert Xu 		.suite = {
3649da7f033dSHerbert Xu 			.hash = {
3650da7f033dSHerbert Xu 				.vecs = sha384_tv_template,
3651da7f033dSHerbert Xu 				.count = SHA384_TEST_VECTORS
3652da7f033dSHerbert Xu 			}
3653da7f033dSHerbert Xu 		}
3654da7f033dSHerbert Xu 	}, {
3655da7f033dSHerbert Xu 		.alg = "sha512",
3656da7f033dSHerbert Xu 		.test = alg_test_hash,
3657a1915d51SJarod Wilson 		.fips_allowed = 1,
3658da7f033dSHerbert Xu 		.suite = {
3659da7f033dSHerbert Xu 			.hash = {
3660da7f033dSHerbert Xu 				.vecs = sha512_tv_template,
3661da7f033dSHerbert Xu 				.count = SHA512_TEST_VECTORS
3662da7f033dSHerbert Xu 			}
3663da7f033dSHerbert Xu 		}
3664da7f033dSHerbert Xu 	}, {
3665da7f033dSHerbert Xu 		.alg = "tgr128",
3666da7f033dSHerbert Xu 		.test = alg_test_hash,
3667da7f033dSHerbert Xu 		.suite = {
3668da7f033dSHerbert Xu 			.hash = {
3669da7f033dSHerbert Xu 				.vecs = tgr128_tv_template,
3670da7f033dSHerbert Xu 				.count = TGR128_TEST_VECTORS
3671da7f033dSHerbert Xu 			}
3672da7f033dSHerbert Xu 		}
3673da7f033dSHerbert Xu 	}, {
3674da7f033dSHerbert Xu 		.alg = "tgr160",
3675da7f033dSHerbert Xu 		.test = alg_test_hash,
3676da7f033dSHerbert Xu 		.suite = {
3677da7f033dSHerbert Xu 			.hash = {
3678da7f033dSHerbert Xu 				.vecs = tgr160_tv_template,
3679da7f033dSHerbert Xu 				.count = TGR160_TEST_VECTORS
3680da7f033dSHerbert Xu 			}
3681da7f033dSHerbert Xu 		}
3682da7f033dSHerbert Xu 	}, {
3683da7f033dSHerbert Xu 		.alg = "tgr192",
3684da7f033dSHerbert Xu 		.test = alg_test_hash,
3685da7f033dSHerbert Xu 		.suite = {
3686da7f033dSHerbert Xu 			.hash = {
3687da7f033dSHerbert Xu 				.vecs = tgr192_tv_template,
3688da7f033dSHerbert Xu 				.count = TGR192_TEST_VECTORS
3689da7f033dSHerbert Xu 			}
3690da7f033dSHerbert Xu 		}
3691da7f033dSHerbert Xu 	}, {
3692f1939f7cSShane Wang 		.alg = "vmac(aes)",
3693f1939f7cSShane Wang 		.test = alg_test_hash,
3694f1939f7cSShane Wang 		.suite = {
3695f1939f7cSShane Wang 			.hash = {
3696f1939f7cSShane Wang 				.vecs = aes_vmac128_tv_template,
3697f1939f7cSShane Wang 				.count = VMAC_AES_TEST_VECTORS
3698f1939f7cSShane Wang 			}
3699f1939f7cSShane Wang 		}
3700f1939f7cSShane Wang 	}, {
3701da7f033dSHerbert Xu 		.alg = "wp256",
3702da7f033dSHerbert Xu 		.test = alg_test_hash,
3703da7f033dSHerbert Xu 		.suite = {
3704da7f033dSHerbert Xu 			.hash = {
3705da7f033dSHerbert Xu 				.vecs = wp256_tv_template,
3706da7f033dSHerbert Xu 				.count = WP256_TEST_VECTORS
3707da7f033dSHerbert Xu 			}
3708da7f033dSHerbert Xu 		}
3709da7f033dSHerbert Xu 	}, {
3710da7f033dSHerbert Xu 		.alg = "wp384",
3711da7f033dSHerbert Xu 		.test = alg_test_hash,
3712da7f033dSHerbert Xu 		.suite = {
3713da7f033dSHerbert Xu 			.hash = {
3714da7f033dSHerbert Xu 				.vecs = wp384_tv_template,
3715da7f033dSHerbert Xu 				.count = WP384_TEST_VECTORS
3716da7f033dSHerbert Xu 			}
3717da7f033dSHerbert Xu 		}
3718da7f033dSHerbert Xu 	}, {
3719da7f033dSHerbert Xu 		.alg = "wp512",
3720da7f033dSHerbert Xu 		.test = alg_test_hash,
3721da7f033dSHerbert Xu 		.suite = {
3722da7f033dSHerbert Xu 			.hash = {
3723da7f033dSHerbert Xu 				.vecs = wp512_tv_template,
3724da7f033dSHerbert Xu 				.count = WP512_TEST_VECTORS
3725da7f033dSHerbert Xu 			}
3726da7f033dSHerbert Xu 		}
3727da7f033dSHerbert Xu 	}, {
3728da7f033dSHerbert Xu 		.alg = "xcbc(aes)",
3729da7f033dSHerbert Xu 		.test = alg_test_hash,
3730da7f033dSHerbert Xu 		.suite = {
3731da7f033dSHerbert Xu 			.hash = {
3732da7f033dSHerbert Xu 				.vecs = aes_xcbc128_tv_template,
3733da7f033dSHerbert Xu 				.count = XCBC_AES_TEST_VECTORS
3734da7f033dSHerbert Xu 			}
3735da7f033dSHerbert Xu 		}
3736da7f033dSHerbert Xu 	}, {
3737da7f033dSHerbert Xu 		.alg = "xts(aes)",
37381aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
37392918aa8dSJarod Wilson 		.fips_allowed = 1,
3740da7f033dSHerbert Xu 		.suite = {
3741da7f033dSHerbert Xu 			.cipher = {
3742da7f033dSHerbert Xu 				.enc = {
3743da7f033dSHerbert Xu 					.vecs = aes_xts_enc_tv_template,
3744da7f033dSHerbert Xu 					.count = AES_XTS_ENC_TEST_VECTORS
3745da7f033dSHerbert Xu 				},
3746da7f033dSHerbert Xu 				.dec = {
3747da7f033dSHerbert Xu 					.vecs = aes_xts_dec_tv_template,
3748da7f033dSHerbert Xu 					.count = AES_XTS_DEC_TEST_VECTORS
3749da7f033dSHerbert Xu 				}
3750da7f033dSHerbert Xu 			}
3751da7f033dSHerbert Xu 		}
37520c01aed5SGeert Uytterhoeven 	}, {
37530840605eSJussi Kivilinna 		.alg = "xts(camellia)",
37540840605eSJussi Kivilinna 		.test = alg_test_skcipher,
37550840605eSJussi Kivilinna 		.suite = {
37560840605eSJussi Kivilinna 			.cipher = {
37570840605eSJussi Kivilinna 				.enc = {
37580840605eSJussi Kivilinna 					.vecs = camellia_xts_enc_tv_template,
37590840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_ENC_TEST_VECTORS
37600840605eSJussi Kivilinna 				},
37610840605eSJussi Kivilinna 				.dec = {
37620840605eSJussi Kivilinna 					.vecs = camellia_xts_dec_tv_template,
37630840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_DEC_TEST_VECTORS
37640840605eSJussi Kivilinna 				}
37650840605eSJussi Kivilinna 			}
37660840605eSJussi Kivilinna 		}
37670840605eSJussi Kivilinna 	}, {
37689b8b0405SJohannes Goetzfried 		.alg = "xts(cast6)",
37699b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
37709b8b0405SJohannes Goetzfried 		.suite = {
37719b8b0405SJohannes Goetzfried 			.cipher = {
37729b8b0405SJohannes Goetzfried 				.enc = {
37739b8b0405SJohannes Goetzfried 					.vecs = cast6_xts_enc_tv_template,
37749b8b0405SJohannes Goetzfried 					.count = CAST6_XTS_ENC_TEST_VECTORS
37759b8b0405SJohannes Goetzfried 				},
37769b8b0405SJohannes Goetzfried 				.dec = {
37779b8b0405SJohannes Goetzfried 					.vecs = cast6_xts_dec_tv_template,
37789b8b0405SJohannes Goetzfried 					.count = CAST6_XTS_DEC_TEST_VECTORS
37799b8b0405SJohannes Goetzfried 				}
37809b8b0405SJohannes Goetzfried 			}
37819b8b0405SJohannes Goetzfried 		}
37829b8b0405SJohannes Goetzfried 	}, {
378318be20b9SJussi Kivilinna 		.alg = "xts(serpent)",
378418be20b9SJussi Kivilinna 		.test = alg_test_skcipher,
378518be20b9SJussi Kivilinna 		.suite = {
378618be20b9SJussi Kivilinna 			.cipher = {
378718be20b9SJussi Kivilinna 				.enc = {
378818be20b9SJussi Kivilinna 					.vecs = serpent_xts_enc_tv_template,
378918be20b9SJussi Kivilinna 					.count = SERPENT_XTS_ENC_TEST_VECTORS
379018be20b9SJussi Kivilinna 				},
379118be20b9SJussi Kivilinna 				.dec = {
379218be20b9SJussi Kivilinna 					.vecs = serpent_xts_dec_tv_template,
379318be20b9SJussi Kivilinna 					.count = SERPENT_XTS_DEC_TEST_VECTORS
379418be20b9SJussi Kivilinna 				}
379518be20b9SJussi Kivilinna 			}
379618be20b9SJussi Kivilinna 		}
379718be20b9SJussi Kivilinna 	}, {
3798aed265b9SJussi Kivilinna 		.alg = "xts(twofish)",
3799aed265b9SJussi Kivilinna 		.test = alg_test_skcipher,
3800aed265b9SJussi Kivilinna 		.suite = {
3801aed265b9SJussi Kivilinna 			.cipher = {
3802aed265b9SJussi Kivilinna 				.enc = {
3803aed265b9SJussi Kivilinna 					.vecs = tf_xts_enc_tv_template,
3804aed265b9SJussi Kivilinna 					.count = TF_XTS_ENC_TEST_VECTORS
3805aed265b9SJussi Kivilinna 				},
3806aed265b9SJussi Kivilinna 				.dec = {
3807aed265b9SJussi Kivilinna 					.vecs = tf_xts_dec_tv_template,
3808aed265b9SJussi Kivilinna 					.count = TF_XTS_DEC_TEST_VECTORS
3809aed265b9SJussi Kivilinna 				}
3810aed265b9SJussi Kivilinna 			}
3811aed265b9SJussi Kivilinna 		}
3812da7f033dSHerbert Xu 	}
3813da7f033dSHerbert Xu };
3814da7f033dSHerbert Xu 
38155714758bSJussi Kivilinna static bool alg_test_descs_checked;
38165714758bSJussi Kivilinna 
38175714758bSJussi Kivilinna static void alg_test_descs_check_order(void)
38185714758bSJussi Kivilinna {
38195714758bSJussi Kivilinna 	int i;
38205714758bSJussi Kivilinna 
38215714758bSJussi Kivilinna 	/* only check once */
38225714758bSJussi Kivilinna 	if (alg_test_descs_checked)
38235714758bSJussi Kivilinna 		return;
38245714758bSJussi Kivilinna 
38255714758bSJussi Kivilinna 	alg_test_descs_checked = true;
38265714758bSJussi Kivilinna 
38275714758bSJussi Kivilinna 	for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) {
38285714758bSJussi Kivilinna 		int diff = strcmp(alg_test_descs[i - 1].alg,
38295714758bSJussi Kivilinna 				  alg_test_descs[i].alg);
38305714758bSJussi Kivilinna 
38315714758bSJussi Kivilinna 		if (WARN_ON(diff > 0)) {
38325714758bSJussi Kivilinna 			pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n",
38335714758bSJussi Kivilinna 				alg_test_descs[i - 1].alg,
38345714758bSJussi Kivilinna 				alg_test_descs[i].alg);
38355714758bSJussi Kivilinna 		}
38365714758bSJussi Kivilinna 
38375714758bSJussi Kivilinna 		if (WARN_ON(diff == 0)) {
38385714758bSJussi Kivilinna 			pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n",
38395714758bSJussi Kivilinna 				alg_test_descs[i].alg);
38405714758bSJussi Kivilinna 		}
38415714758bSJussi Kivilinna 	}
38425714758bSJussi Kivilinna }
38435714758bSJussi Kivilinna 
38441aa4ecd9SHerbert Xu static int alg_find_test(const char *alg)
3845da7f033dSHerbert Xu {
3846da7f033dSHerbert Xu 	int start = 0;
3847da7f033dSHerbert Xu 	int end = ARRAY_SIZE(alg_test_descs);
3848da7f033dSHerbert Xu 
3849da7f033dSHerbert Xu 	while (start < end) {
3850da7f033dSHerbert Xu 		int i = (start + end) / 2;
3851da7f033dSHerbert Xu 		int diff = strcmp(alg_test_descs[i].alg, alg);
3852da7f033dSHerbert Xu 
3853da7f033dSHerbert Xu 		if (diff > 0) {
3854da7f033dSHerbert Xu 			end = i;
3855da7f033dSHerbert Xu 			continue;
3856da7f033dSHerbert Xu 		}
3857da7f033dSHerbert Xu 
3858da7f033dSHerbert Xu 		if (diff < 0) {
3859da7f033dSHerbert Xu 			start = i + 1;
3860da7f033dSHerbert Xu 			continue;
3861da7f033dSHerbert Xu 		}
3862da7f033dSHerbert Xu 
38631aa4ecd9SHerbert Xu 		return i;
3864da7f033dSHerbert Xu 	}
3865da7f033dSHerbert Xu 
38661aa4ecd9SHerbert Xu 	return -1;
38671aa4ecd9SHerbert Xu }
38681aa4ecd9SHerbert Xu 
38691aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
38701aa4ecd9SHerbert Xu {
38711aa4ecd9SHerbert Xu 	int i;
3872a68f6610SHerbert Xu 	int j;
3873d12d6b6dSNeil Horman 	int rc;
38741aa4ecd9SHerbert Xu 
38759e5c9fe4SRichard W.M. Jones 	if (!fips_enabled && notests) {
38769e5c9fe4SRichard W.M. Jones 		printk_once(KERN_INFO "alg: self-tests disabled\n");
38779e5c9fe4SRichard W.M. Jones 		return 0;
38789e5c9fe4SRichard W.M. Jones 	}
38799e5c9fe4SRichard W.M. Jones 
38805714758bSJussi Kivilinna 	alg_test_descs_check_order();
38815714758bSJussi Kivilinna 
38821aa4ecd9SHerbert Xu 	if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
38831aa4ecd9SHerbert Xu 		char nalg[CRYPTO_MAX_ALG_NAME];
38841aa4ecd9SHerbert Xu 
38851aa4ecd9SHerbert Xu 		if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
38861aa4ecd9SHerbert Xu 		    sizeof(nalg))
38871aa4ecd9SHerbert Xu 			return -ENAMETOOLONG;
38881aa4ecd9SHerbert Xu 
38891aa4ecd9SHerbert Xu 		i = alg_find_test(nalg);
38901aa4ecd9SHerbert Xu 		if (i < 0)
38911aa4ecd9SHerbert Xu 			goto notest;
38921aa4ecd9SHerbert Xu 
3893a3bef3a3SJarod Wilson 		if (fips_enabled && !alg_test_descs[i].fips_allowed)
3894a3bef3a3SJarod Wilson 			goto non_fips_alg;
3895a3bef3a3SJarod Wilson 
3896941fb328SJarod Wilson 		rc = alg_test_cipher(alg_test_descs + i, driver, type, mask);
3897941fb328SJarod Wilson 		goto test_done;
38981aa4ecd9SHerbert Xu 	}
38991aa4ecd9SHerbert Xu 
39001aa4ecd9SHerbert Xu 	i = alg_find_test(alg);
3901a68f6610SHerbert Xu 	j = alg_find_test(driver);
3902a68f6610SHerbert Xu 	if (i < 0 && j < 0)
39031aa4ecd9SHerbert Xu 		goto notest;
39041aa4ecd9SHerbert Xu 
3905a68f6610SHerbert Xu 	if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
3906a68f6610SHerbert Xu 			     (j >= 0 && !alg_test_descs[j].fips_allowed)))
3907a3bef3a3SJarod Wilson 		goto non_fips_alg;
3908a3bef3a3SJarod Wilson 
3909a68f6610SHerbert Xu 	rc = 0;
3910a68f6610SHerbert Xu 	if (i >= 0)
3911a68f6610SHerbert Xu 		rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
39121aa4ecd9SHerbert Xu 					     type, mask);
3913032c8cacSCristian Stoica 	if (j >= 0 && j != i)
3914a68f6610SHerbert Xu 		rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
3915a68f6610SHerbert Xu 					     type, mask);
3916a68f6610SHerbert Xu 
3917941fb328SJarod Wilson test_done:
3918d12d6b6dSNeil Horman 	if (fips_enabled && rc)
3919d12d6b6dSNeil Horman 		panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
3920d12d6b6dSNeil Horman 
392129ecd4abSJarod Wilson 	if (fips_enabled && !rc)
39223e8cffd4SMasanari Iida 		pr_info("alg: self-tests for %s (%s) passed\n", driver, alg);
392329ecd4abSJarod Wilson 
3924d12d6b6dSNeil Horman 	return rc;
39251aa4ecd9SHerbert Xu 
39261aa4ecd9SHerbert Xu notest:
3927da7f033dSHerbert Xu 	printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
3928da7f033dSHerbert Xu 	return 0;
3929a3bef3a3SJarod Wilson non_fips_alg:
3930a3bef3a3SJarod Wilson 	return -EINVAL;
3931da7f033dSHerbert Xu }
39320b767f96SAlexander Shishkin 
3933326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
39340b767f96SAlexander Shishkin 
3935da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test);
3936