xref: /openbmc/linux/crypto/testmgr.c (revision 10faa8c0)
1da7f033dSHerbert Xu /*
2da7f033dSHerbert Xu  * Algorithm testing framework and tests.
3da7f033dSHerbert Xu  *
4da7f033dSHerbert Xu  * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
5da7f033dSHerbert Xu  * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
6da7f033dSHerbert Xu  * Copyright (c) 2007 Nokia Siemens Networks
7da7f033dSHerbert Xu  * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
8da7f033dSHerbert Xu  *
969435b94SAdrian Hoban  * Updated RFC4106 AES-GCM testing.
1069435b94SAdrian Hoban  *    Authors: Aidan O'Mahony (aidan.o.mahony@intel.com)
1169435b94SAdrian Hoban  *             Adrian Hoban <adrian.hoban@intel.com>
1269435b94SAdrian Hoban  *             Gabriele Paoloni <gabriele.paoloni@intel.com>
1369435b94SAdrian Hoban  *             Tadeusz Struk (tadeusz.struk@intel.com)
1469435b94SAdrian Hoban  *    Copyright (c) 2010, Intel Corporation.
1569435b94SAdrian Hoban  *
16da7f033dSHerbert Xu  * This program is free software; you can redistribute it and/or modify it
17da7f033dSHerbert Xu  * under the terms of the GNU General Public License as published by the Free
18da7f033dSHerbert Xu  * Software Foundation; either version 2 of the License, or (at your option)
19da7f033dSHerbert Xu  * any later version.
20da7f033dSHerbert Xu  *
21da7f033dSHerbert Xu  */
22da7f033dSHerbert Xu 
231ce33115SHerbert Xu #include <crypto/aead.h>
24da7f033dSHerbert Xu #include <crypto/hash.h>
2512773d93SHerbert Xu #include <crypto/skcipher.h>
26da7f033dSHerbert Xu #include <linux/err.h>
271c41b882SHerbert Xu #include <linux/fips.h>
28da7f033dSHerbert Xu #include <linux/module.h>
29da7f033dSHerbert Xu #include <linux/scatterlist.h>
30da7f033dSHerbert Xu #include <linux/slab.h>
31da7f033dSHerbert Xu #include <linux/string.h>
327647d6ceSJarod Wilson #include <crypto/rng.h>
3364d1cdfbSStephan Mueller #include <crypto/drbg.h>
34946cc463STadeusz Struk #include <crypto/akcipher.h>
35802c7f1cSSalvatore Benedetto #include <crypto/kpp.h>
36da7f033dSHerbert Xu 
37da7f033dSHerbert Xu #include "internal.h"
380b767f96SAlexander Shishkin 
399e5c9fe4SRichard W.M. Jones static bool notests;
409e5c9fe4SRichard W.M. Jones module_param(notests, bool, 0644);
419e5c9fe4SRichard W.M. Jones MODULE_PARM_DESC(notests, "disable crypto self-tests");
429e5c9fe4SRichard W.M. Jones 
43326a6346SHerbert Xu #ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS
440b767f96SAlexander Shishkin 
450b767f96SAlexander Shishkin /* a perfect nop */
460b767f96SAlexander Shishkin int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
470b767f96SAlexander Shishkin {
480b767f96SAlexander Shishkin 	return 0;
490b767f96SAlexander Shishkin }
500b767f96SAlexander Shishkin 
510b767f96SAlexander Shishkin #else
520b767f96SAlexander Shishkin 
53da7f033dSHerbert Xu #include "testmgr.h"
54da7f033dSHerbert Xu 
55da7f033dSHerbert Xu /*
56da7f033dSHerbert Xu  * Need slab memory for testing (size in number of pages).
57da7f033dSHerbert Xu  */
58da7f033dSHerbert Xu #define XBUFSIZE	8
59da7f033dSHerbert Xu 
60da7f033dSHerbert Xu /*
61da7f033dSHerbert Xu  * Indexes into the xbuf to simulate cross-page access.
62da7f033dSHerbert Xu  */
63da7f033dSHerbert Xu #define IDX1		32
64da7f033dSHerbert Xu #define IDX2		32400
65da7f033dSHerbert Xu #define IDX3		1
66da7f033dSHerbert Xu #define IDX4		8193
67da7f033dSHerbert Xu #define IDX5		22222
68da7f033dSHerbert Xu #define IDX6		17101
69da7f033dSHerbert Xu #define IDX7		27333
70da7f033dSHerbert Xu #define IDX8		3000
71da7f033dSHerbert Xu 
72da7f033dSHerbert Xu /*
73da7f033dSHerbert Xu * Used by test_cipher()
74da7f033dSHerbert Xu */
75da7f033dSHerbert Xu #define ENCRYPT 1
76da7f033dSHerbert Xu #define DECRYPT 0
77da7f033dSHerbert Xu 
78da7f033dSHerbert Xu struct tcrypt_result {
79da7f033dSHerbert Xu 	struct completion completion;
80da7f033dSHerbert Xu 	int err;
81da7f033dSHerbert Xu };
82da7f033dSHerbert Xu 
83da7f033dSHerbert Xu struct aead_test_suite {
84da7f033dSHerbert Xu 	struct {
85da7f033dSHerbert Xu 		struct aead_testvec *vecs;
86da7f033dSHerbert Xu 		unsigned int count;
87da7f033dSHerbert Xu 	} enc, dec;
88da7f033dSHerbert Xu };
89da7f033dSHerbert Xu 
90da7f033dSHerbert Xu struct cipher_test_suite {
91da7f033dSHerbert Xu 	struct {
92da7f033dSHerbert Xu 		struct cipher_testvec *vecs;
93da7f033dSHerbert Xu 		unsigned int count;
94da7f033dSHerbert Xu 	} enc, dec;
95da7f033dSHerbert Xu };
96da7f033dSHerbert Xu 
97da7f033dSHerbert Xu struct comp_test_suite {
98da7f033dSHerbert Xu 	struct {
99da7f033dSHerbert Xu 		struct comp_testvec *vecs;
100da7f033dSHerbert Xu 		unsigned int count;
101da7f033dSHerbert Xu 	} comp, decomp;
102da7f033dSHerbert Xu };
103da7f033dSHerbert Xu 
104da7f033dSHerbert Xu struct hash_test_suite {
105da7f033dSHerbert Xu 	struct hash_testvec *vecs;
106da7f033dSHerbert Xu 	unsigned int count;
107da7f033dSHerbert Xu };
108da7f033dSHerbert Xu 
1097647d6ceSJarod Wilson struct cprng_test_suite {
1107647d6ceSJarod Wilson 	struct cprng_testvec *vecs;
1117647d6ceSJarod Wilson 	unsigned int count;
1127647d6ceSJarod Wilson };
1137647d6ceSJarod Wilson 
11464d1cdfbSStephan Mueller struct drbg_test_suite {
11564d1cdfbSStephan Mueller 	struct drbg_testvec *vecs;
11664d1cdfbSStephan Mueller 	unsigned int count;
11764d1cdfbSStephan Mueller };
11864d1cdfbSStephan Mueller 
119946cc463STadeusz Struk struct akcipher_test_suite {
120946cc463STadeusz Struk 	struct akcipher_testvec *vecs;
121946cc463STadeusz Struk 	unsigned int count;
122946cc463STadeusz Struk };
123946cc463STadeusz Struk 
124802c7f1cSSalvatore Benedetto struct kpp_test_suite {
125802c7f1cSSalvatore Benedetto 	struct kpp_testvec *vecs;
126802c7f1cSSalvatore Benedetto 	unsigned int count;
127802c7f1cSSalvatore Benedetto };
128802c7f1cSSalvatore Benedetto 
129da7f033dSHerbert Xu struct alg_test_desc {
130da7f033dSHerbert Xu 	const char *alg;
131da7f033dSHerbert Xu 	int (*test)(const struct alg_test_desc *desc, const char *driver,
132da7f033dSHerbert Xu 		    u32 type, u32 mask);
133a1915d51SJarod Wilson 	int fips_allowed;	/* set if alg is allowed in fips mode */
134da7f033dSHerbert Xu 
135da7f033dSHerbert Xu 	union {
136da7f033dSHerbert Xu 		struct aead_test_suite aead;
137da7f033dSHerbert Xu 		struct cipher_test_suite cipher;
138da7f033dSHerbert Xu 		struct comp_test_suite comp;
139da7f033dSHerbert Xu 		struct hash_test_suite hash;
1407647d6ceSJarod Wilson 		struct cprng_test_suite cprng;
14164d1cdfbSStephan Mueller 		struct drbg_test_suite drbg;
142946cc463STadeusz Struk 		struct akcipher_test_suite akcipher;
143802c7f1cSSalvatore Benedetto 		struct kpp_test_suite kpp;
144da7f033dSHerbert Xu 	} suite;
145da7f033dSHerbert Xu };
146da7f033dSHerbert Xu 
147da7f033dSHerbert Xu static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
148da7f033dSHerbert Xu 
149da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len)
150da7f033dSHerbert Xu {
151da7f033dSHerbert Xu 	print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
152da7f033dSHerbert Xu 			16, 1,
153da7f033dSHerbert Xu 			buf, len, false);
154da7f033dSHerbert Xu }
155da7f033dSHerbert Xu 
156da7f033dSHerbert Xu static void tcrypt_complete(struct crypto_async_request *req, int err)
157da7f033dSHerbert Xu {
158da7f033dSHerbert Xu 	struct tcrypt_result *res = req->data;
159da7f033dSHerbert Xu 
160da7f033dSHerbert Xu 	if (err == -EINPROGRESS)
161da7f033dSHerbert Xu 		return;
162da7f033dSHerbert Xu 
163da7f033dSHerbert Xu 	res->err = err;
164da7f033dSHerbert Xu 	complete(&res->completion);
165da7f033dSHerbert Xu }
166da7f033dSHerbert Xu 
167f8b0d4d0SHerbert Xu static int testmgr_alloc_buf(char *buf[XBUFSIZE])
168f8b0d4d0SHerbert Xu {
169f8b0d4d0SHerbert Xu 	int i;
170f8b0d4d0SHerbert Xu 
171f8b0d4d0SHerbert Xu 	for (i = 0; i < XBUFSIZE; i++) {
172f8b0d4d0SHerbert Xu 		buf[i] = (void *)__get_free_page(GFP_KERNEL);
173f8b0d4d0SHerbert Xu 		if (!buf[i])
174f8b0d4d0SHerbert Xu 			goto err_free_buf;
175f8b0d4d0SHerbert Xu 	}
176f8b0d4d0SHerbert Xu 
177f8b0d4d0SHerbert Xu 	return 0;
178f8b0d4d0SHerbert Xu 
179f8b0d4d0SHerbert Xu err_free_buf:
180f8b0d4d0SHerbert Xu 	while (i-- > 0)
181f8b0d4d0SHerbert Xu 		free_page((unsigned long)buf[i]);
182f8b0d4d0SHerbert Xu 
183f8b0d4d0SHerbert Xu 	return -ENOMEM;
184f8b0d4d0SHerbert Xu }
185f8b0d4d0SHerbert Xu 
186f8b0d4d0SHerbert Xu static void testmgr_free_buf(char *buf[XBUFSIZE])
187f8b0d4d0SHerbert Xu {
188f8b0d4d0SHerbert Xu 	int i;
189f8b0d4d0SHerbert Xu 
190f8b0d4d0SHerbert Xu 	for (i = 0; i < XBUFSIZE; i++)
191f8b0d4d0SHerbert Xu 		free_page((unsigned long)buf[i]);
192f8b0d4d0SHerbert Xu }
193f8b0d4d0SHerbert Xu 
194d4c85f9bSCristian Stoica static int wait_async_op(struct tcrypt_result *tr, int ret)
195a8f1a052SDavid S. Miller {
196a8f1a052SDavid S. Miller 	if (ret == -EINPROGRESS || ret == -EBUSY) {
1978a45ac12SRabin Vincent 		wait_for_completion(&tr->completion);
19816735d02SWolfram Sang 		reinit_completion(&tr->completion);
1998a45ac12SRabin Vincent 		ret = tr->err;
200a8f1a052SDavid S. Miller 	}
201a8f1a052SDavid S. Miller 	return ret;
202a8f1a052SDavid S. Miller }
203a8f1a052SDavid S. Miller 
204018ba95cSWang, Rui Y static int ahash_partial_update(struct ahash_request **preq,
205018ba95cSWang, Rui Y 	struct crypto_ahash *tfm, struct hash_testvec *template,
206018ba95cSWang, Rui Y 	void *hash_buff, int k, int temp, struct scatterlist *sg,
207018ba95cSWang, Rui Y 	const char *algo, char *result, struct tcrypt_result *tresult)
208018ba95cSWang, Rui Y {
209018ba95cSWang, Rui Y 	char *state;
210018ba95cSWang, Rui Y 	struct ahash_request *req;
211018ba95cSWang, Rui Y 	int statesize, ret = -EINVAL;
212018ba95cSWang, Rui Y 
213018ba95cSWang, Rui Y 	req = *preq;
214018ba95cSWang, Rui Y 	statesize = crypto_ahash_statesize(
215018ba95cSWang, Rui Y 			crypto_ahash_reqtfm(req));
216018ba95cSWang, Rui Y 	state = kmalloc(statesize, GFP_KERNEL);
217018ba95cSWang, Rui Y 	if (!state) {
218018ba95cSWang, Rui Y 		pr_err("alt: hash: Failed to alloc state for %s\n", algo);
219018ba95cSWang, Rui Y 		goto out_nostate;
220018ba95cSWang, Rui Y 	}
221018ba95cSWang, Rui Y 	ret = crypto_ahash_export(req, state);
222018ba95cSWang, Rui Y 	if (ret) {
223018ba95cSWang, Rui Y 		pr_err("alt: hash: Failed to export() for %s\n", algo);
224018ba95cSWang, Rui Y 		goto out;
225018ba95cSWang, Rui Y 	}
226018ba95cSWang, Rui Y 	ahash_request_free(req);
227018ba95cSWang, Rui Y 	req = ahash_request_alloc(tfm, GFP_KERNEL);
228018ba95cSWang, Rui Y 	if (!req) {
229018ba95cSWang, Rui Y 		pr_err("alg: hash: Failed to alloc request for %s\n", algo);
230018ba95cSWang, Rui Y 		goto out_noreq;
231018ba95cSWang, Rui Y 	}
232018ba95cSWang, Rui Y 	ahash_request_set_callback(req,
233018ba95cSWang, Rui Y 		CRYPTO_TFM_REQ_MAY_BACKLOG,
234018ba95cSWang, Rui Y 		tcrypt_complete, tresult);
235018ba95cSWang, Rui Y 
236018ba95cSWang, Rui Y 	memcpy(hash_buff, template->plaintext + temp,
237018ba95cSWang, Rui Y 		template->tap[k]);
238018ba95cSWang, Rui Y 	sg_init_one(&sg[0], hash_buff, template->tap[k]);
239018ba95cSWang, Rui Y 	ahash_request_set_crypt(req, sg, result, template->tap[k]);
240018ba95cSWang, Rui Y 	ret = crypto_ahash_import(req, state);
241018ba95cSWang, Rui Y 	if (ret) {
242018ba95cSWang, Rui Y 		pr_err("alg: hash: Failed to import() for %s\n", algo);
243018ba95cSWang, Rui Y 		goto out;
244018ba95cSWang, Rui Y 	}
245018ba95cSWang, Rui Y 	ret = wait_async_op(tresult, crypto_ahash_update(req));
246018ba95cSWang, Rui Y 	if (ret)
247018ba95cSWang, Rui Y 		goto out;
248018ba95cSWang, Rui Y 	*preq = req;
249018ba95cSWang, Rui Y 	ret = 0;
250018ba95cSWang, Rui Y 	goto out_noreq;
251018ba95cSWang, Rui Y out:
252018ba95cSWang, Rui Y 	ahash_request_free(req);
253018ba95cSWang, Rui Y out_noreq:
254018ba95cSWang, Rui Y 	kfree(state);
255018ba95cSWang, Rui Y out_nostate:
256018ba95cSWang, Rui Y 	return ret;
257018ba95cSWang, Rui Y }
258018ba95cSWang, Rui Y 
259da5ffe11SJussi Kivilinna static int __test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
260da5ffe11SJussi Kivilinna 		       unsigned int tcount, bool use_digest,
261da5ffe11SJussi Kivilinna 		       const int align_offset)
262da7f033dSHerbert Xu {
263da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
264da7f033dSHerbert Xu 	unsigned int i, j, k, temp;
265da7f033dSHerbert Xu 	struct scatterlist sg[8];
26629b77e5dSHoria Geanta 	char *result;
26729b77e5dSHoria Geanta 	char *key;
268da7f033dSHerbert Xu 	struct ahash_request *req;
269da7f033dSHerbert Xu 	struct tcrypt_result tresult;
270da7f033dSHerbert Xu 	void *hash_buff;
271f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
272f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
273f8b0d4d0SHerbert Xu 
27429b77e5dSHoria Geanta 	result = kmalloc(MAX_DIGEST_SIZE, GFP_KERNEL);
27529b77e5dSHoria Geanta 	if (!result)
27629b77e5dSHoria Geanta 		return ret;
27729b77e5dSHoria Geanta 	key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
27829b77e5dSHoria Geanta 	if (!key)
27929b77e5dSHoria Geanta 		goto out_nobuf;
280f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
281f8b0d4d0SHerbert Xu 		goto out_nobuf;
282da7f033dSHerbert Xu 
283da7f033dSHerbert Xu 	init_completion(&tresult.completion);
284da7f033dSHerbert Xu 
285da7f033dSHerbert Xu 	req = ahash_request_alloc(tfm, GFP_KERNEL);
286da7f033dSHerbert Xu 	if (!req) {
287da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to allocate request for "
288da7f033dSHerbert Xu 		       "%s\n", algo);
289da7f033dSHerbert Xu 		goto out_noreq;
290da7f033dSHerbert Xu 	}
291da7f033dSHerbert Xu 	ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
292da7f033dSHerbert Xu 				   tcrypt_complete, &tresult);
293da7f033dSHerbert Xu 
294a0cfae59SHerbert Xu 	j = 0;
295da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
296a0cfae59SHerbert Xu 		if (template[i].np)
297a0cfae59SHerbert Xu 			continue;
298a0cfae59SHerbert Xu 
299da5ffe11SJussi Kivilinna 		ret = -EINVAL;
300da5ffe11SJussi Kivilinna 		if (WARN_ON(align_offset + template[i].psize > PAGE_SIZE))
301da5ffe11SJussi Kivilinna 			goto out;
302da5ffe11SJussi Kivilinna 
303a0cfae59SHerbert Xu 		j++;
30429b77e5dSHoria Geanta 		memset(result, 0, MAX_DIGEST_SIZE);
305da7f033dSHerbert Xu 
306da7f033dSHerbert Xu 		hash_buff = xbuf[0];
307da5ffe11SJussi Kivilinna 		hash_buff += align_offset;
308da7f033dSHerbert Xu 
309da7f033dSHerbert Xu 		memcpy(hash_buff, template[i].plaintext, template[i].psize);
310da7f033dSHerbert Xu 		sg_init_one(&sg[0], hash_buff, template[i].psize);
311da7f033dSHerbert Xu 
312da7f033dSHerbert Xu 		if (template[i].ksize) {
313da7f033dSHerbert Xu 			crypto_ahash_clear_flags(tfm, ~0);
31429b77e5dSHoria Geanta 			if (template[i].ksize > MAX_KEYLEN) {
31529b77e5dSHoria Geanta 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
31629b77e5dSHoria Geanta 				       j, algo, template[i].ksize, MAX_KEYLEN);
31729b77e5dSHoria Geanta 				ret = -EINVAL;
31829b77e5dSHoria Geanta 				goto out;
31929b77e5dSHoria Geanta 			}
32029b77e5dSHoria Geanta 			memcpy(key, template[i].key, template[i].ksize);
32129b77e5dSHoria Geanta 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
322da7f033dSHerbert Xu 			if (ret) {
323da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: setkey failed on "
324a0cfae59SHerbert Xu 				       "test %d for %s: ret=%d\n", j, algo,
325da7f033dSHerbert Xu 				       -ret);
326da7f033dSHerbert Xu 				goto out;
327da7f033dSHerbert Xu 			}
328da7f033dSHerbert Xu 		}
329da7f033dSHerbert Xu 
330da7f033dSHerbert Xu 		ahash_request_set_crypt(req, sg, result, template[i].psize);
331a8f1a052SDavid S. Miller 		if (use_digest) {
332d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_digest(req));
333a8f1a052SDavid S. Miller 			if (ret) {
334a8f1a052SDavid S. Miller 				pr_err("alg: hash: digest failed on test %d "
335a0cfae59SHerbert Xu 				       "for %s: ret=%d\n", j, algo, -ret);
336da7f033dSHerbert Xu 				goto out;
337da7f033dSHerbert Xu 			}
338a8f1a052SDavid S. Miller 		} else {
339d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_init(req));
340a8f1a052SDavid S. Miller 			if (ret) {
341a8f1a052SDavid S. Miller 				pr_err("alt: hash: init failed on test %d "
342a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
343a8f1a052SDavid S. Miller 				goto out;
344a8f1a052SDavid S. Miller 			}
345d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_update(req));
346a8f1a052SDavid S. Miller 			if (ret) {
347a8f1a052SDavid S. Miller 				pr_err("alt: hash: update failed on test %d "
348a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
349a8f1a052SDavid S. Miller 				goto out;
350a8f1a052SDavid S. Miller 			}
351d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_final(req));
352a8f1a052SDavid S. Miller 			if (ret) {
353a8f1a052SDavid S. Miller 				pr_err("alt: hash: final failed on test %d "
354a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
355a8f1a052SDavid S. Miller 				goto out;
356a8f1a052SDavid S. Miller 			}
357a8f1a052SDavid S. Miller 		}
358da7f033dSHerbert Xu 
359da7f033dSHerbert Xu 		if (memcmp(result, template[i].digest,
360da7f033dSHerbert Xu 			   crypto_ahash_digestsize(tfm))) {
361da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
362a0cfae59SHerbert Xu 			       j, algo);
363da7f033dSHerbert Xu 			hexdump(result, crypto_ahash_digestsize(tfm));
364da7f033dSHerbert Xu 			ret = -EINVAL;
365da7f033dSHerbert Xu 			goto out;
366da7f033dSHerbert Xu 		}
367da7f033dSHerbert Xu 	}
368da7f033dSHerbert Xu 
369da7f033dSHerbert Xu 	j = 0;
370da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
371da5ffe11SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
372da5ffe11SJussi Kivilinna 		if (align_offset != 0)
373da5ffe11SJussi Kivilinna 			break;
374da5ffe11SJussi Kivilinna 
3755f2b424eSCristian Stoica 		if (!template[i].np)
3765f2b424eSCristian Stoica 			continue;
3775f2b424eSCristian Stoica 
378da7f033dSHerbert Xu 		j++;
37929b77e5dSHoria Geanta 		memset(result, 0, MAX_DIGEST_SIZE);
380da7f033dSHerbert Xu 
381da7f033dSHerbert Xu 		temp = 0;
382da7f033dSHerbert Xu 		sg_init_table(sg, template[i].np);
383fd57f22aSHerbert Xu 		ret = -EINVAL;
384da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
385fd57f22aSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
386fd57f22aSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
387fd57f22aSHerbert Xu 				goto out;
388da7f033dSHerbert Xu 			sg_set_buf(&sg[k],
389da7f033dSHerbert Xu 				   memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
390da7f033dSHerbert Xu 					  offset_in_page(IDX[k]),
391da7f033dSHerbert Xu 					  template[i].plaintext + temp,
392da7f033dSHerbert Xu 					  template[i].tap[k]),
393da7f033dSHerbert Xu 				   template[i].tap[k]);
394da7f033dSHerbert Xu 			temp += template[i].tap[k];
395da7f033dSHerbert Xu 		}
396da7f033dSHerbert Xu 
397da7f033dSHerbert Xu 		if (template[i].ksize) {
39829b77e5dSHoria Geanta 			if (template[i].ksize > MAX_KEYLEN) {
39929b77e5dSHoria Geanta 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
4005f2b424eSCristian Stoica 				       j, algo, template[i].ksize, MAX_KEYLEN);
40129b77e5dSHoria Geanta 				ret = -EINVAL;
40229b77e5dSHoria Geanta 				goto out;
40329b77e5dSHoria Geanta 			}
404da7f033dSHerbert Xu 			crypto_ahash_clear_flags(tfm, ~0);
40529b77e5dSHoria Geanta 			memcpy(key, template[i].key, template[i].ksize);
4065f2b424eSCristian Stoica 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
407da7f033dSHerbert Xu 
408da7f033dSHerbert Xu 			if (ret) {
409da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: setkey "
410da7f033dSHerbert Xu 				       "failed on chunking test %d "
4115f2b424eSCristian Stoica 				       "for %s: ret=%d\n", j, algo, -ret);
412da7f033dSHerbert Xu 				goto out;
413da7f033dSHerbert Xu 			}
414da7f033dSHerbert Xu 		}
415da7f033dSHerbert Xu 
4165f2b424eSCristian Stoica 		ahash_request_set_crypt(req, sg, result, template[i].psize);
417da7f033dSHerbert Xu 		ret = crypto_ahash_digest(req);
418da7f033dSHerbert Xu 		switch (ret) {
419da7f033dSHerbert Xu 		case 0:
420da7f033dSHerbert Xu 			break;
421da7f033dSHerbert Xu 		case -EINPROGRESS:
422da7f033dSHerbert Xu 		case -EBUSY:
4238a45ac12SRabin Vincent 			wait_for_completion(&tresult.completion);
42416735d02SWolfram Sang 			reinit_completion(&tresult.completion);
4258a45ac12SRabin Vincent 			ret = tresult.err;
4268a45ac12SRabin Vincent 			if (!ret)
427da7f033dSHerbert Xu 				break;
428da7f033dSHerbert Xu 			/* fall through */
429da7f033dSHerbert Xu 		default:
430da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: digest failed "
431da7f033dSHerbert Xu 			       "on chunking test %d for %s: "
432da7f033dSHerbert Xu 			       "ret=%d\n", j, algo, -ret);
433da7f033dSHerbert Xu 			goto out;
434da7f033dSHerbert Xu 		}
435da7f033dSHerbert Xu 
436da7f033dSHerbert Xu 		if (memcmp(result, template[i].digest,
437da7f033dSHerbert Xu 			   crypto_ahash_digestsize(tfm))) {
438da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: Chunking test %d "
439da7f033dSHerbert Xu 			       "failed for %s\n", j, algo);
440da7f033dSHerbert Xu 			hexdump(result, crypto_ahash_digestsize(tfm));
441da7f033dSHerbert Xu 			ret = -EINVAL;
442da7f033dSHerbert Xu 			goto out;
443da7f033dSHerbert Xu 		}
444da7f033dSHerbert Xu 	}
445da7f033dSHerbert Xu 
446018ba95cSWang, Rui Y 	/* partial update exercise */
447018ba95cSWang, Rui Y 	j = 0;
448018ba95cSWang, Rui Y 	for (i = 0; i < tcount; i++) {
449018ba95cSWang, Rui Y 		/* alignment tests are only done with continuous buffers */
450018ba95cSWang, Rui Y 		if (align_offset != 0)
451018ba95cSWang, Rui Y 			break;
452018ba95cSWang, Rui Y 
453018ba95cSWang, Rui Y 		if (template[i].np < 2)
454018ba95cSWang, Rui Y 			continue;
455018ba95cSWang, Rui Y 
456018ba95cSWang, Rui Y 		j++;
457018ba95cSWang, Rui Y 		memset(result, 0, MAX_DIGEST_SIZE);
458018ba95cSWang, Rui Y 
459018ba95cSWang, Rui Y 		ret = -EINVAL;
460018ba95cSWang, Rui Y 		hash_buff = xbuf[0];
461018ba95cSWang, Rui Y 		memcpy(hash_buff, template[i].plaintext,
462018ba95cSWang, Rui Y 			template[i].tap[0]);
463018ba95cSWang, Rui Y 		sg_init_one(&sg[0], hash_buff, template[i].tap[0]);
464018ba95cSWang, Rui Y 
465018ba95cSWang, Rui Y 		if (template[i].ksize) {
466018ba95cSWang, Rui Y 			crypto_ahash_clear_flags(tfm, ~0);
467018ba95cSWang, Rui Y 			if (template[i].ksize > MAX_KEYLEN) {
468018ba95cSWang, Rui Y 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
469018ba95cSWang, Rui Y 					j, algo, template[i].ksize, MAX_KEYLEN);
470018ba95cSWang, Rui Y 				ret = -EINVAL;
471018ba95cSWang, Rui Y 				goto out;
472018ba95cSWang, Rui Y 			}
473018ba95cSWang, Rui Y 			memcpy(key, template[i].key, template[i].ksize);
474018ba95cSWang, Rui Y 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
475018ba95cSWang, Rui Y 			if (ret) {
476018ba95cSWang, Rui Y 				pr_err("alg: hash: setkey failed on test %d for %s: ret=%d\n",
477018ba95cSWang, Rui Y 					j, algo, -ret);
478018ba95cSWang, Rui Y 				goto out;
479018ba95cSWang, Rui Y 			}
480018ba95cSWang, Rui Y 		}
481018ba95cSWang, Rui Y 
482018ba95cSWang, Rui Y 		ahash_request_set_crypt(req, sg, result, template[i].tap[0]);
483018ba95cSWang, Rui Y 		ret = wait_async_op(&tresult, crypto_ahash_init(req));
484018ba95cSWang, Rui Y 		if (ret) {
485018ba95cSWang, Rui Y 			pr_err("alt: hash: init failed on test %d for %s: ret=%d\n",
486018ba95cSWang, Rui Y 				j, algo, -ret);
487018ba95cSWang, Rui Y 			goto out;
488018ba95cSWang, Rui Y 		}
489018ba95cSWang, Rui Y 		ret = wait_async_op(&tresult, crypto_ahash_update(req));
490018ba95cSWang, Rui Y 		if (ret) {
491018ba95cSWang, Rui Y 			pr_err("alt: hash: update failed on test %d for %s: ret=%d\n",
492018ba95cSWang, Rui Y 				j, algo, -ret);
493018ba95cSWang, Rui Y 			goto out;
494018ba95cSWang, Rui Y 		}
495018ba95cSWang, Rui Y 
496018ba95cSWang, Rui Y 		temp = template[i].tap[0];
497018ba95cSWang, Rui Y 		for (k = 1; k < template[i].np; k++) {
498018ba95cSWang, Rui Y 			ret = ahash_partial_update(&req, tfm, &template[i],
499018ba95cSWang, Rui Y 				hash_buff, k, temp, &sg[0], algo, result,
500018ba95cSWang, Rui Y 				&tresult);
501018ba95cSWang, Rui Y 			if (ret) {
502018ba95cSWang, Rui Y 				pr_err("hash: partial update failed on test %d for %s: ret=%d\n",
503018ba95cSWang, Rui Y 					j, algo, -ret);
504018ba95cSWang, Rui Y 				goto out_noreq;
505018ba95cSWang, Rui Y 			}
506018ba95cSWang, Rui Y 			temp += template[i].tap[k];
507018ba95cSWang, Rui Y 		}
508018ba95cSWang, Rui Y 		ret = wait_async_op(&tresult, crypto_ahash_final(req));
509018ba95cSWang, Rui Y 		if (ret) {
510018ba95cSWang, Rui Y 			pr_err("alt: hash: final failed on test %d for %s: ret=%d\n",
511018ba95cSWang, Rui Y 				j, algo, -ret);
512018ba95cSWang, Rui Y 			goto out;
513018ba95cSWang, Rui Y 		}
514018ba95cSWang, Rui Y 		if (memcmp(result, template[i].digest,
515018ba95cSWang, Rui Y 			   crypto_ahash_digestsize(tfm))) {
516018ba95cSWang, Rui Y 			pr_err("alg: hash: Partial Test %d failed for %s\n",
517018ba95cSWang, Rui Y 			       j, algo);
518018ba95cSWang, Rui Y 			hexdump(result, crypto_ahash_digestsize(tfm));
519018ba95cSWang, Rui Y 			ret = -EINVAL;
520018ba95cSWang, Rui Y 			goto out;
521018ba95cSWang, Rui Y 		}
522018ba95cSWang, Rui Y 	}
523018ba95cSWang, Rui Y 
524da7f033dSHerbert Xu 	ret = 0;
525da7f033dSHerbert Xu 
526da7f033dSHerbert Xu out:
527da7f033dSHerbert Xu 	ahash_request_free(req);
528da7f033dSHerbert Xu out_noreq:
529f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
530f8b0d4d0SHerbert Xu out_nobuf:
53129b77e5dSHoria Geanta 	kfree(key);
53229b77e5dSHoria Geanta 	kfree(result);
533da7f033dSHerbert Xu 	return ret;
534da7f033dSHerbert Xu }
535da7f033dSHerbert Xu 
536da5ffe11SJussi Kivilinna static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
537da5ffe11SJussi Kivilinna 		     unsigned int tcount, bool use_digest)
538da5ffe11SJussi Kivilinna {
539da5ffe11SJussi Kivilinna 	unsigned int alignmask;
540da5ffe11SJussi Kivilinna 	int ret;
541da5ffe11SJussi Kivilinna 
542da5ffe11SJussi Kivilinna 	ret = __test_hash(tfm, template, tcount, use_digest, 0);
543da5ffe11SJussi Kivilinna 	if (ret)
544da5ffe11SJussi Kivilinna 		return ret;
545da5ffe11SJussi Kivilinna 
546da5ffe11SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
547da5ffe11SJussi Kivilinna 	ret = __test_hash(tfm, template, tcount, use_digest, 1);
548da5ffe11SJussi Kivilinna 	if (ret)
549da5ffe11SJussi Kivilinna 		return ret;
550da5ffe11SJussi Kivilinna 
551da5ffe11SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
552da5ffe11SJussi Kivilinna 	if (alignmask) {
553da5ffe11SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
554da5ffe11SJussi Kivilinna 		ret = __test_hash(tfm, template, tcount, use_digest,
555da5ffe11SJussi Kivilinna 				  alignmask + 1);
556da5ffe11SJussi Kivilinna 		if (ret)
557da5ffe11SJussi Kivilinna 			return ret;
558da5ffe11SJussi Kivilinna 	}
559da5ffe11SJussi Kivilinna 
560da5ffe11SJussi Kivilinna 	return 0;
561da5ffe11SJussi Kivilinna }
562da5ffe11SJussi Kivilinna 
563d8a32ac2SJussi Kivilinna static int __test_aead(struct crypto_aead *tfm, int enc,
564d8a32ac2SJussi Kivilinna 		       struct aead_testvec *template, unsigned int tcount,
56558dcf548SJussi Kivilinna 		       const bool diff_dst, const int align_offset)
566da7f033dSHerbert Xu {
567da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
568da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
569f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
570da7f033dSHerbert Xu 	char *q;
571da7f033dSHerbert Xu 	char *key;
572da7f033dSHerbert Xu 	struct aead_request *req;
573d8a32ac2SJussi Kivilinna 	struct scatterlist *sg;
574d8a32ac2SJussi Kivilinna 	struct scatterlist *sgout;
575d8a32ac2SJussi Kivilinna 	const char *e, *d;
576da7f033dSHerbert Xu 	struct tcrypt_result result;
577424a5da6SCristian Stoica 	unsigned int authsize, iv_len;
578da7f033dSHerbert Xu 	void *input;
579d8a32ac2SJussi Kivilinna 	void *output;
580da7f033dSHerbert Xu 	void *assoc;
5819bac019dSTadeusz Struk 	char *iv;
582f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
583d8a32ac2SJussi Kivilinna 	char *xoutbuf[XBUFSIZE];
584f8b0d4d0SHerbert Xu 	char *axbuf[XBUFSIZE];
585f8b0d4d0SHerbert Xu 
5869bac019dSTadeusz Struk 	iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
5879bac019dSTadeusz Struk 	if (!iv)
5889bac019dSTadeusz Struk 		return ret;
58929b77e5dSHoria Geanta 	key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
59029b77e5dSHoria Geanta 	if (!key)
59129b77e5dSHoria Geanta 		goto out_noxbuf;
592f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
593f8b0d4d0SHerbert Xu 		goto out_noxbuf;
594f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(axbuf))
595f8b0d4d0SHerbert Xu 		goto out_noaxbuf;
596d8a32ac2SJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
597d8a32ac2SJussi Kivilinna 		goto out_nooutbuf;
598d8a32ac2SJussi Kivilinna 
599d8a32ac2SJussi Kivilinna 	/* avoid "the frame size is larger than 1024 bytes" compiler warning */
6008a525fcdSHerbert Xu 	sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 4 : 2), GFP_KERNEL);
601d8a32ac2SJussi Kivilinna 	if (!sg)
602d8a32ac2SJussi Kivilinna 		goto out_nosg;
6038a525fcdSHerbert Xu 	sgout = &sg[16];
604d8a32ac2SJussi Kivilinna 
605d8a32ac2SJussi Kivilinna 	if (diff_dst)
606d8a32ac2SJussi Kivilinna 		d = "-ddst";
607d8a32ac2SJussi Kivilinna 	else
608d8a32ac2SJussi Kivilinna 		d = "";
609d8a32ac2SJussi Kivilinna 
610da7f033dSHerbert Xu 	if (enc == ENCRYPT)
611da7f033dSHerbert Xu 		e = "encryption";
612da7f033dSHerbert Xu 	else
613da7f033dSHerbert Xu 		e = "decryption";
614da7f033dSHerbert Xu 
615da7f033dSHerbert Xu 	init_completion(&result.completion);
616da7f033dSHerbert Xu 
617da7f033dSHerbert Xu 	req = aead_request_alloc(tfm, GFP_KERNEL);
618da7f033dSHerbert Xu 	if (!req) {
619d8a32ac2SJussi Kivilinna 		pr_err("alg: aead%s: Failed to allocate request for %s\n",
620d8a32ac2SJussi Kivilinna 		       d, algo);
621da7f033dSHerbert Xu 		goto out;
622da7f033dSHerbert Xu 	}
623da7f033dSHerbert Xu 
624da7f033dSHerbert Xu 	aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
625da7f033dSHerbert Xu 				  tcrypt_complete, &result);
626da7f033dSHerbert Xu 
627abfa7f43SJerome Marchand 	iv_len = crypto_aead_ivsize(tfm);
628abfa7f43SJerome Marchand 
629da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
63005b1d338SCristian Stoica 		if (template[i].np)
63105b1d338SCristian Stoica 			continue;
63205b1d338SCristian Stoica 
633da7f033dSHerbert Xu 		j++;
634da7f033dSHerbert Xu 
63558dcf548SJussi Kivilinna 		/* some templates have no input data but they will
636da7f033dSHerbert Xu 		 * touch input
637da7f033dSHerbert Xu 		 */
638da7f033dSHerbert Xu 		input = xbuf[0];
63958dcf548SJussi Kivilinna 		input += align_offset;
640da7f033dSHerbert Xu 		assoc = axbuf[0];
641da7f033dSHerbert Xu 
642fd57f22aSHerbert Xu 		ret = -EINVAL;
64358dcf548SJussi Kivilinna 		if (WARN_ON(align_offset + template[i].ilen >
64458dcf548SJussi Kivilinna 			    PAGE_SIZE || template[i].alen > PAGE_SIZE))
645fd57f22aSHerbert Xu 			goto out;
646fd57f22aSHerbert Xu 
647da7f033dSHerbert Xu 		memcpy(input, template[i].input, template[i].ilen);
648da7f033dSHerbert Xu 		memcpy(assoc, template[i].assoc, template[i].alen);
649da7f033dSHerbert Xu 		if (template[i].iv)
650424a5da6SCristian Stoica 			memcpy(iv, template[i].iv, iv_len);
651da7f033dSHerbert Xu 		else
652424a5da6SCristian Stoica 			memset(iv, 0, iv_len);
653da7f033dSHerbert Xu 
654da7f033dSHerbert Xu 		crypto_aead_clear_flags(tfm, ~0);
655da7f033dSHerbert Xu 		if (template[i].wk)
65605b1d338SCristian Stoica 			crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
657da7f033dSHerbert Xu 
65829b77e5dSHoria Geanta 		if (template[i].klen > MAX_KEYLEN) {
65929b77e5dSHoria Geanta 			pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
66029b77e5dSHoria Geanta 			       d, j, algo, template[i].klen,
66129b77e5dSHoria Geanta 			       MAX_KEYLEN);
66229b77e5dSHoria Geanta 			ret = -EINVAL;
66329b77e5dSHoria Geanta 			goto out;
66429b77e5dSHoria Geanta 		}
66529b77e5dSHoria Geanta 		memcpy(key, template[i].key, template[i].klen);
666da7f033dSHerbert Xu 
66705b1d338SCristian Stoica 		ret = crypto_aead_setkey(tfm, key, template[i].klen);
6680fae0c1eSYanjiang Jin 		if (template[i].fail == !ret) {
669d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n",
670d8a32ac2SJussi Kivilinna 			       d, j, algo, crypto_aead_get_flags(tfm));
671da7f033dSHerbert Xu 			goto out;
672da7f033dSHerbert Xu 		} else if (ret)
673da7f033dSHerbert Xu 			continue;
674da7f033dSHerbert Xu 
675da7f033dSHerbert Xu 		authsize = abs(template[i].rlen - template[i].ilen);
676da7f033dSHerbert Xu 		ret = crypto_aead_setauthsize(tfm, authsize);
677da7f033dSHerbert Xu 		if (ret) {
678d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n",
679d8a32ac2SJussi Kivilinna 			       d, authsize, j, algo);
680da7f033dSHerbert Xu 			goto out;
681da7f033dSHerbert Xu 		}
682da7f033dSHerbert Xu 
6838a525fcdSHerbert Xu 		k = !!template[i].alen;
6848a525fcdSHerbert Xu 		sg_init_table(sg, k + 1);
6858a525fcdSHerbert Xu 		sg_set_buf(&sg[0], assoc, template[i].alen);
6868a525fcdSHerbert Xu 		sg_set_buf(&sg[k], input,
68705b1d338SCristian Stoica 			   template[i].ilen + (enc ? authsize : 0));
688d8a32ac2SJussi Kivilinna 		output = input;
689d8a32ac2SJussi Kivilinna 
6908a525fcdSHerbert Xu 		if (diff_dst) {
6918a525fcdSHerbert Xu 			sg_init_table(sgout, k + 1);
6928a525fcdSHerbert Xu 			sg_set_buf(&sgout[0], assoc, template[i].alen);
6938a525fcdSHerbert Xu 
6948a525fcdSHerbert Xu 			output = xoutbuf[0];
6958a525fcdSHerbert Xu 			output += align_offset;
6968a525fcdSHerbert Xu 			sg_set_buf(&sgout[k], output,
6978a525fcdSHerbert Xu 				   template[i].rlen + (enc ? 0 : authsize));
6988a525fcdSHerbert Xu 		}
699da7f033dSHerbert Xu 
700d8a32ac2SJussi Kivilinna 		aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
701da7f033dSHerbert Xu 				       template[i].ilen, iv);
702da7f033dSHerbert Xu 
7038a525fcdSHerbert Xu 		aead_request_set_ad(req, template[i].alen);
704da7f033dSHerbert Xu 
70505b1d338SCristian Stoica 		ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req);
706da7f033dSHerbert Xu 
707da7f033dSHerbert Xu 		switch (ret) {
708da7f033dSHerbert Xu 		case 0:
709e44a1b44SJarod Wilson 			if (template[i].novrfy) {
710e44a1b44SJarod Wilson 				/* verification was supposed to fail */
711d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n",
712d8a32ac2SJussi Kivilinna 				       d, e, j, algo);
713e44a1b44SJarod Wilson 				/* so really, we got a bad message */
714e44a1b44SJarod Wilson 				ret = -EBADMSG;
715e44a1b44SJarod Wilson 				goto out;
716e44a1b44SJarod Wilson 			}
717da7f033dSHerbert Xu 			break;
718da7f033dSHerbert Xu 		case -EINPROGRESS:
719da7f033dSHerbert Xu 		case -EBUSY:
7208a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
72116735d02SWolfram Sang 			reinit_completion(&result.completion);
7228a45ac12SRabin Vincent 			ret = result.err;
7238a45ac12SRabin Vincent 			if (!ret)
724da7f033dSHerbert Xu 				break;
725e44a1b44SJarod Wilson 		case -EBADMSG:
726e44a1b44SJarod Wilson 			if (template[i].novrfy)
727e44a1b44SJarod Wilson 				/* verification failure was expected */
728e44a1b44SJarod Wilson 				continue;
729da7f033dSHerbert Xu 			/* fall through */
730da7f033dSHerbert Xu 		default:
731d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n",
732d8a32ac2SJussi Kivilinna 			       d, e, j, algo, -ret);
733da7f033dSHerbert Xu 			goto out;
734da7f033dSHerbert Xu 		}
735da7f033dSHerbert Xu 
736d8a32ac2SJussi Kivilinna 		q = output;
737da7f033dSHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
738d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Test %d failed on %s for %s\n",
739d8a32ac2SJussi Kivilinna 			       d, j, e, algo);
740da7f033dSHerbert Xu 			hexdump(q, template[i].rlen);
741da7f033dSHerbert Xu 			ret = -EINVAL;
742da7f033dSHerbert Xu 			goto out;
743da7f033dSHerbert Xu 		}
744da7f033dSHerbert Xu 	}
745da7f033dSHerbert Xu 
746da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
74758dcf548SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
74858dcf548SJussi Kivilinna 		if (align_offset != 0)
74958dcf548SJussi Kivilinna 			break;
75058dcf548SJussi Kivilinna 
75105b1d338SCristian Stoica 		if (!template[i].np)
75205b1d338SCristian Stoica 			continue;
75305b1d338SCristian Stoica 
754da7f033dSHerbert Xu 		j++;
755da7f033dSHerbert Xu 
756da7f033dSHerbert Xu 		if (template[i].iv)
757abfa7f43SJerome Marchand 			memcpy(iv, template[i].iv, iv_len);
758da7f033dSHerbert Xu 		else
759da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
760da7f033dSHerbert Xu 
761da7f033dSHerbert Xu 		crypto_aead_clear_flags(tfm, ~0);
762da7f033dSHerbert Xu 		if (template[i].wk)
76305b1d338SCristian Stoica 			crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
76429b77e5dSHoria Geanta 		if (template[i].klen > MAX_KEYLEN) {
76529b77e5dSHoria Geanta 			pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
76605b1d338SCristian Stoica 			       d, j, algo, template[i].klen, MAX_KEYLEN);
76729b77e5dSHoria Geanta 			ret = -EINVAL;
76829b77e5dSHoria Geanta 			goto out;
76929b77e5dSHoria Geanta 		}
77029b77e5dSHoria Geanta 		memcpy(key, template[i].key, template[i].klen);
771da7f033dSHerbert Xu 
772da7f033dSHerbert Xu 		ret = crypto_aead_setkey(tfm, key, template[i].klen);
7730fae0c1eSYanjiang Jin 		if (template[i].fail == !ret) {
774d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n",
775d8a32ac2SJussi Kivilinna 			       d, j, algo, crypto_aead_get_flags(tfm));
776da7f033dSHerbert Xu 			goto out;
777da7f033dSHerbert Xu 		} else if (ret)
778da7f033dSHerbert Xu 			continue;
779da7f033dSHerbert Xu 
780da7f033dSHerbert Xu 		authsize = abs(template[i].rlen - template[i].ilen);
781da7f033dSHerbert Xu 
782da7f033dSHerbert Xu 		ret = -EINVAL;
7838a525fcdSHerbert Xu 		sg_init_table(sg, template[i].anp + template[i].np);
784d8a32ac2SJussi Kivilinna 		if (diff_dst)
7858a525fcdSHerbert Xu 			sg_init_table(sgout, template[i].anp + template[i].np);
7868a525fcdSHerbert Xu 
7878a525fcdSHerbert Xu 		ret = -EINVAL;
7888a525fcdSHerbert Xu 		for (k = 0, temp = 0; k < template[i].anp; k++) {
7898a525fcdSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
7908a525fcdSHerbert Xu 				    template[i].atap[k] > PAGE_SIZE))
7918a525fcdSHerbert Xu 				goto out;
7928a525fcdSHerbert Xu 			sg_set_buf(&sg[k],
7938a525fcdSHerbert Xu 				   memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
7948a525fcdSHerbert Xu 					  offset_in_page(IDX[k]),
7958a525fcdSHerbert Xu 					  template[i].assoc + temp,
7968a525fcdSHerbert Xu 					  template[i].atap[k]),
7978a525fcdSHerbert Xu 				   template[i].atap[k]);
7988a525fcdSHerbert Xu 			if (diff_dst)
7998a525fcdSHerbert Xu 				sg_set_buf(&sgout[k],
8008a525fcdSHerbert Xu 					   axbuf[IDX[k] >> PAGE_SHIFT] +
8018a525fcdSHerbert Xu 					   offset_in_page(IDX[k]),
8028a525fcdSHerbert Xu 					   template[i].atap[k]);
8038a525fcdSHerbert Xu 			temp += template[i].atap[k];
8048a525fcdSHerbert Xu 		}
8058a525fcdSHerbert Xu 
806da7f033dSHerbert Xu 		for (k = 0, temp = 0; k < template[i].np; k++) {
807da7f033dSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
808da7f033dSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
809da7f033dSHerbert Xu 				goto out;
810da7f033dSHerbert Xu 
81105b1d338SCristian Stoica 			q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
81205b1d338SCristian Stoica 			memcpy(q, template[i].input + temp, template[i].tap[k]);
8138a525fcdSHerbert Xu 			sg_set_buf(&sg[template[i].anp + k],
8148a525fcdSHerbert Xu 				   q, template[i].tap[k]);
815d8a32ac2SJussi Kivilinna 
816d8a32ac2SJussi Kivilinna 			if (diff_dst) {
817d8a32ac2SJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
818d8a32ac2SJussi Kivilinna 				    offset_in_page(IDX[k]);
819d8a32ac2SJussi Kivilinna 
820d8a32ac2SJussi Kivilinna 				memset(q, 0, template[i].tap[k]);
821d8a32ac2SJussi Kivilinna 
8228a525fcdSHerbert Xu 				sg_set_buf(&sgout[template[i].anp + k],
8238a525fcdSHerbert Xu 					   q, template[i].tap[k]);
824d8a32ac2SJussi Kivilinna 			}
825d8a32ac2SJussi Kivilinna 
8268ec25c51SHoria Geanta 			n = template[i].tap[k];
8278ec25c51SHoria Geanta 			if (k == template[i].np - 1 && enc)
8288ec25c51SHoria Geanta 				n += authsize;
8298ec25c51SHoria Geanta 			if (offset_in_page(q) + n < PAGE_SIZE)
8308ec25c51SHoria Geanta 				q[n] = 0;
8318ec25c51SHoria Geanta 
832da7f033dSHerbert Xu 			temp += template[i].tap[k];
833da7f033dSHerbert Xu 		}
834da7f033dSHerbert Xu 
835da7f033dSHerbert Xu 		ret = crypto_aead_setauthsize(tfm, authsize);
836da7f033dSHerbert Xu 		if (ret) {
837d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n",
838d8a32ac2SJussi Kivilinna 			       d, authsize, j, algo);
839da7f033dSHerbert Xu 			goto out;
840da7f033dSHerbert Xu 		}
841da7f033dSHerbert Xu 
842da7f033dSHerbert Xu 		if (enc) {
8438a525fcdSHerbert Xu 			if (WARN_ON(sg[template[i].anp + k - 1].offset +
8448a525fcdSHerbert Xu 				    sg[template[i].anp + k - 1].length +
8458a525fcdSHerbert Xu 				    authsize > PAGE_SIZE)) {
846da7f033dSHerbert Xu 				ret = -EINVAL;
847da7f033dSHerbert Xu 				goto out;
848da7f033dSHerbert Xu 			}
849da7f033dSHerbert Xu 
850d8a32ac2SJussi Kivilinna 			if (diff_dst)
8518a525fcdSHerbert Xu 				sgout[template[i].anp + k - 1].length +=
8528a525fcdSHerbert Xu 					authsize;
8538a525fcdSHerbert Xu 			sg[template[i].anp + k - 1].length += authsize;
854da7f033dSHerbert Xu 		}
855da7f033dSHerbert Xu 
856d8a32ac2SJussi Kivilinna 		aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
857da7f033dSHerbert Xu 				       template[i].ilen,
858da7f033dSHerbert Xu 				       iv);
859da7f033dSHerbert Xu 
8608a525fcdSHerbert Xu 		aead_request_set_ad(req, template[i].alen);
861da7f033dSHerbert Xu 
86205b1d338SCristian Stoica 		ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req);
863da7f033dSHerbert Xu 
864da7f033dSHerbert Xu 		switch (ret) {
865da7f033dSHerbert Xu 		case 0:
866e44a1b44SJarod Wilson 			if (template[i].novrfy) {
867e44a1b44SJarod Wilson 				/* verification was supposed to fail */
868d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n",
869d8a32ac2SJussi Kivilinna 				       d, e, j, algo);
870e44a1b44SJarod Wilson 				/* so really, we got a bad message */
871e44a1b44SJarod Wilson 				ret = -EBADMSG;
872e44a1b44SJarod Wilson 				goto out;
873e44a1b44SJarod Wilson 			}
874da7f033dSHerbert Xu 			break;
875da7f033dSHerbert Xu 		case -EINPROGRESS:
876da7f033dSHerbert Xu 		case -EBUSY:
8778a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
87816735d02SWolfram Sang 			reinit_completion(&result.completion);
8798a45ac12SRabin Vincent 			ret = result.err;
8808a45ac12SRabin Vincent 			if (!ret)
881da7f033dSHerbert Xu 				break;
882e44a1b44SJarod Wilson 		case -EBADMSG:
883e44a1b44SJarod Wilson 			if (template[i].novrfy)
884e44a1b44SJarod Wilson 				/* verification failure was expected */
885e44a1b44SJarod Wilson 				continue;
886da7f033dSHerbert Xu 			/* fall through */
887da7f033dSHerbert Xu 		default:
888d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n",
889d8a32ac2SJussi Kivilinna 			       d, e, j, algo, -ret);
890da7f033dSHerbert Xu 			goto out;
891da7f033dSHerbert Xu 		}
892da7f033dSHerbert Xu 
893da7f033dSHerbert Xu 		ret = -EINVAL;
894da7f033dSHerbert Xu 		for (k = 0, temp = 0; k < template[i].np; k++) {
895d8a32ac2SJussi Kivilinna 			if (diff_dst)
896d8a32ac2SJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
897d8a32ac2SJussi Kivilinna 				    offset_in_page(IDX[k]);
898d8a32ac2SJussi Kivilinna 			else
899da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
900da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
901da7f033dSHerbert Xu 
902da7f033dSHerbert Xu 			n = template[i].tap[k];
903da7f033dSHerbert Xu 			if (k == template[i].np - 1)
904da7f033dSHerbert Xu 				n += enc ? authsize : -authsize;
905da7f033dSHerbert Xu 
906da7f033dSHerbert Xu 			if (memcmp(q, template[i].result + temp, n)) {
907d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n",
908d8a32ac2SJussi Kivilinna 				       d, j, e, k, algo);
909da7f033dSHerbert Xu 				hexdump(q, n);
910da7f033dSHerbert Xu 				goto out;
911da7f033dSHerbert Xu 			}
912da7f033dSHerbert Xu 
913da7f033dSHerbert Xu 			q += n;
914da7f033dSHerbert Xu 			if (k == template[i].np - 1 && !enc) {
915d8a32ac2SJussi Kivilinna 				if (!diff_dst &&
916d8a32ac2SJussi Kivilinna 					memcmp(q, template[i].input +
917da7f033dSHerbert Xu 					      temp + n, authsize))
918da7f033dSHerbert Xu 					n = authsize;
919da7f033dSHerbert Xu 				else
920da7f033dSHerbert Xu 					n = 0;
921da7f033dSHerbert Xu 			} else {
92205b1d338SCristian Stoica 				for (n = 0; offset_in_page(q + n) && q[n]; n++)
923da7f033dSHerbert Xu 					;
924da7f033dSHerbert Xu 			}
925da7f033dSHerbert Xu 			if (n) {
926d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
927d8a32ac2SJussi Kivilinna 				       d, j, e, k, algo, n);
928da7f033dSHerbert Xu 				hexdump(q, n);
929da7f033dSHerbert Xu 				goto out;
930da7f033dSHerbert Xu 			}
931da7f033dSHerbert Xu 
932da7f033dSHerbert Xu 			temp += template[i].tap[k];
933da7f033dSHerbert Xu 		}
934da7f033dSHerbert Xu 	}
935da7f033dSHerbert Xu 
936da7f033dSHerbert Xu 	ret = 0;
937da7f033dSHerbert Xu 
938da7f033dSHerbert Xu out:
939da7f033dSHerbert Xu 	aead_request_free(req);
940d8a32ac2SJussi Kivilinna 	kfree(sg);
941d8a32ac2SJussi Kivilinna out_nosg:
942d8a32ac2SJussi Kivilinna 	if (diff_dst)
943d8a32ac2SJussi Kivilinna 		testmgr_free_buf(xoutbuf);
944d8a32ac2SJussi Kivilinna out_nooutbuf:
945f8b0d4d0SHerbert Xu 	testmgr_free_buf(axbuf);
946f8b0d4d0SHerbert Xu out_noaxbuf:
947f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
948f8b0d4d0SHerbert Xu out_noxbuf:
94929b77e5dSHoria Geanta 	kfree(key);
9509bac019dSTadeusz Struk 	kfree(iv);
951da7f033dSHerbert Xu 	return ret;
952da7f033dSHerbert Xu }
953da7f033dSHerbert Xu 
954d8a32ac2SJussi Kivilinna static int test_aead(struct crypto_aead *tfm, int enc,
955d8a32ac2SJussi Kivilinna 		     struct aead_testvec *template, unsigned int tcount)
956d8a32ac2SJussi Kivilinna {
95758dcf548SJussi Kivilinna 	unsigned int alignmask;
958d8a32ac2SJussi Kivilinna 	int ret;
959d8a32ac2SJussi Kivilinna 
960d8a32ac2SJussi Kivilinna 	/* test 'dst == src' case */
96158dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, false, 0);
962d8a32ac2SJussi Kivilinna 	if (ret)
963d8a32ac2SJussi Kivilinna 		return ret;
964d8a32ac2SJussi Kivilinna 
965d8a32ac2SJussi Kivilinna 	/* test 'dst != src' case */
96658dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, true, 0);
96758dcf548SJussi Kivilinna 	if (ret)
96858dcf548SJussi Kivilinna 		return ret;
96958dcf548SJussi Kivilinna 
97058dcf548SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
97158dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, true, 1);
97258dcf548SJussi Kivilinna 	if (ret)
97358dcf548SJussi Kivilinna 		return ret;
97458dcf548SJussi Kivilinna 
97558dcf548SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
97658dcf548SJussi Kivilinna 	if (alignmask) {
97758dcf548SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
97858dcf548SJussi Kivilinna 		ret = __test_aead(tfm, enc, template, tcount, true,
97958dcf548SJussi Kivilinna 				  alignmask + 1);
98058dcf548SJussi Kivilinna 		if (ret)
98158dcf548SJussi Kivilinna 			return ret;
98258dcf548SJussi Kivilinna 	}
98358dcf548SJussi Kivilinna 
98458dcf548SJussi Kivilinna 	return 0;
985d8a32ac2SJussi Kivilinna }
986d8a32ac2SJussi Kivilinna 
9871aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc,
9881aa4ecd9SHerbert Xu 		       struct cipher_testvec *template, unsigned int tcount)
9891aa4ecd9SHerbert Xu {
9901aa4ecd9SHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm));
9911aa4ecd9SHerbert Xu 	unsigned int i, j, k;
9921aa4ecd9SHerbert Xu 	char *q;
9931aa4ecd9SHerbert Xu 	const char *e;
9941aa4ecd9SHerbert Xu 	void *data;
995f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
996f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
997f8b0d4d0SHerbert Xu 
998f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
999f8b0d4d0SHerbert Xu 		goto out_nobuf;
10001aa4ecd9SHerbert Xu 
10011aa4ecd9SHerbert Xu 	if (enc == ENCRYPT)
10021aa4ecd9SHerbert Xu 	        e = "encryption";
10031aa4ecd9SHerbert Xu 	else
10041aa4ecd9SHerbert Xu 		e = "decryption";
10051aa4ecd9SHerbert Xu 
10061aa4ecd9SHerbert Xu 	j = 0;
10071aa4ecd9SHerbert Xu 	for (i = 0; i < tcount; i++) {
10081aa4ecd9SHerbert Xu 		if (template[i].np)
10091aa4ecd9SHerbert Xu 			continue;
10101aa4ecd9SHerbert Xu 
101110faa8c0SStephan Mueller 		if (fips_enabled && template[i].fips_skip)
101210faa8c0SStephan Mueller 			continue;
101310faa8c0SStephan Mueller 
10141aa4ecd9SHerbert Xu 		j++;
10151aa4ecd9SHerbert Xu 
1016fd57f22aSHerbert Xu 		ret = -EINVAL;
1017fd57f22aSHerbert Xu 		if (WARN_ON(template[i].ilen > PAGE_SIZE))
1018fd57f22aSHerbert Xu 			goto out;
1019fd57f22aSHerbert Xu 
10201aa4ecd9SHerbert Xu 		data = xbuf[0];
10211aa4ecd9SHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
10221aa4ecd9SHerbert Xu 
10231aa4ecd9SHerbert Xu 		crypto_cipher_clear_flags(tfm, ~0);
10241aa4ecd9SHerbert Xu 		if (template[i].wk)
10251aa4ecd9SHerbert Xu 			crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
10261aa4ecd9SHerbert Xu 
10271aa4ecd9SHerbert Xu 		ret = crypto_cipher_setkey(tfm, template[i].key,
10281aa4ecd9SHerbert Xu 					   template[i].klen);
10290fae0c1eSYanjiang Jin 		if (template[i].fail == !ret) {
10301aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: setkey failed "
10311aa4ecd9SHerbert Xu 			       "on test %d for %s: flags=%x\n", j,
10321aa4ecd9SHerbert Xu 			       algo, crypto_cipher_get_flags(tfm));
10331aa4ecd9SHerbert Xu 			goto out;
10341aa4ecd9SHerbert Xu 		} else if (ret)
10351aa4ecd9SHerbert Xu 			continue;
10361aa4ecd9SHerbert Xu 
10371aa4ecd9SHerbert Xu 		for (k = 0; k < template[i].ilen;
10381aa4ecd9SHerbert Xu 		     k += crypto_cipher_blocksize(tfm)) {
10391aa4ecd9SHerbert Xu 			if (enc)
10401aa4ecd9SHerbert Xu 				crypto_cipher_encrypt_one(tfm, data + k,
10411aa4ecd9SHerbert Xu 							  data + k);
10421aa4ecd9SHerbert Xu 			else
10431aa4ecd9SHerbert Xu 				crypto_cipher_decrypt_one(tfm, data + k,
10441aa4ecd9SHerbert Xu 							  data + k);
10451aa4ecd9SHerbert Xu 		}
10461aa4ecd9SHerbert Xu 
10471aa4ecd9SHerbert Xu 		q = data;
10481aa4ecd9SHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
10491aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: Test %d failed "
10501aa4ecd9SHerbert Xu 			       "on %s for %s\n", j, e, algo);
10511aa4ecd9SHerbert Xu 			hexdump(q, template[i].rlen);
10521aa4ecd9SHerbert Xu 			ret = -EINVAL;
10531aa4ecd9SHerbert Xu 			goto out;
10541aa4ecd9SHerbert Xu 		}
10551aa4ecd9SHerbert Xu 	}
10561aa4ecd9SHerbert Xu 
10571aa4ecd9SHerbert Xu 	ret = 0;
10581aa4ecd9SHerbert Xu 
10591aa4ecd9SHerbert Xu out:
1060f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
1061f8b0d4d0SHerbert Xu out_nobuf:
10621aa4ecd9SHerbert Xu 	return ret;
10631aa4ecd9SHerbert Xu }
10641aa4ecd9SHerbert Xu 
106512773d93SHerbert Xu static int __test_skcipher(struct crypto_skcipher *tfm, int enc,
106608d6af8cSJussi Kivilinna 			   struct cipher_testvec *template, unsigned int tcount,
10673a338f20SJussi Kivilinna 			   const bool diff_dst, const int align_offset)
1068da7f033dSHerbert Xu {
1069da7f033dSHerbert Xu 	const char *algo =
107012773d93SHerbert Xu 		crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm));
1071da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
1072da7f033dSHerbert Xu 	char *q;
107312773d93SHerbert Xu 	struct skcipher_request *req;
1074da7f033dSHerbert Xu 	struct scatterlist sg[8];
107508d6af8cSJussi Kivilinna 	struct scatterlist sgout[8];
107608d6af8cSJussi Kivilinna 	const char *e, *d;
1077da7f033dSHerbert Xu 	struct tcrypt_result result;
1078da7f033dSHerbert Xu 	void *data;
1079da7f033dSHerbert Xu 	char iv[MAX_IVLEN];
1080f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
108108d6af8cSJussi Kivilinna 	char *xoutbuf[XBUFSIZE];
1082f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
108384cba178SAndrey Ryabinin 	unsigned int ivsize = crypto_skcipher_ivsize(tfm);
1084f8b0d4d0SHerbert Xu 
1085f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
1086f8b0d4d0SHerbert Xu 		goto out_nobuf;
1087da7f033dSHerbert Xu 
108808d6af8cSJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
108908d6af8cSJussi Kivilinna 		goto out_nooutbuf;
109008d6af8cSJussi Kivilinna 
109108d6af8cSJussi Kivilinna 	if (diff_dst)
109208d6af8cSJussi Kivilinna 		d = "-ddst";
109308d6af8cSJussi Kivilinna 	else
109408d6af8cSJussi Kivilinna 		d = "";
109508d6af8cSJussi Kivilinna 
1096da7f033dSHerbert Xu 	if (enc == ENCRYPT)
1097da7f033dSHerbert Xu 	        e = "encryption";
1098da7f033dSHerbert Xu 	else
1099da7f033dSHerbert Xu 		e = "decryption";
1100da7f033dSHerbert Xu 
1101da7f033dSHerbert Xu 	init_completion(&result.completion);
1102da7f033dSHerbert Xu 
110312773d93SHerbert Xu 	req = skcipher_request_alloc(tfm, GFP_KERNEL);
1104da7f033dSHerbert Xu 	if (!req) {
110508d6af8cSJussi Kivilinna 		pr_err("alg: skcipher%s: Failed to allocate request for %s\n",
110608d6af8cSJussi Kivilinna 		       d, algo);
1107da7f033dSHerbert Xu 		goto out;
1108da7f033dSHerbert Xu 	}
1109da7f033dSHerbert Xu 
111012773d93SHerbert Xu 	skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1111da7f033dSHerbert Xu 				      tcrypt_complete, &result);
1112da7f033dSHerbert Xu 
1113da7f033dSHerbert Xu 	j = 0;
1114da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
1115bbb9a7ddSCristian Stoica 		if (template[i].np && !template[i].also_non_np)
1116bbb9a7ddSCristian Stoica 			continue;
1117bbb9a7ddSCristian Stoica 
111810faa8c0SStephan Mueller 		if (fips_enabled && template[i].fips_skip)
111910faa8c0SStephan Mueller 			continue;
112010faa8c0SStephan Mueller 
1121da7f033dSHerbert Xu 		if (template[i].iv)
112284cba178SAndrey Ryabinin 			memcpy(iv, template[i].iv, ivsize);
1123da7f033dSHerbert Xu 		else
1124da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
1125da7f033dSHerbert Xu 
1126da7f033dSHerbert Xu 		j++;
1127fd57f22aSHerbert Xu 		ret = -EINVAL;
1128a1aa44a2SCristian Stoica 		if (WARN_ON(align_offset + template[i].ilen > PAGE_SIZE))
1129fd57f22aSHerbert Xu 			goto out;
1130fd57f22aSHerbert Xu 
1131da7f033dSHerbert Xu 		data = xbuf[0];
11323a338f20SJussi Kivilinna 		data += align_offset;
1133da7f033dSHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
1134da7f033dSHerbert Xu 
113512773d93SHerbert Xu 		crypto_skcipher_clear_flags(tfm, ~0);
1136da7f033dSHerbert Xu 		if (template[i].wk)
113712773d93SHerbert Xu 			crypto_skcipher_set_flags(tfm,
113812773d93SHerbert Xu 						  CRYPTO_TFM_REQ_WEAK_KEY);
1139da7f033dSHerbert Xu 
114012773d93SHerbert Xu 		ret = crypto_skcipher_setkey(tfm, template[i].key,
1141da7f033dSHerbert Xu 					     template[i].klen);
11420fae0c1eSYanjiang Jin 		if (template[i].fail == !ret) {
114308d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n",
114412773d93SHerbert Xu 			       d, j, algo, crypto_skcipher_get_flags(tfm));
1145da7f033dSHerbert Xu 			goto out;
1146da7f033dSHerbert Xu 		} else if (ret)
1147da7f033dSHerbert Xu 			continue;
1148da7f033dSHerbert Xu 
1149da7f033dSHerbert Xu 		sg_init_one(&sg[0], data, template[i].ilen);
115008d6af8cSJussi Kivilinna 		if (diff_dst) {
115108d6af8cSJussi Kivilinna 			data = xoutbuf[0];
11523a338f20SJussi Kivilinna 			data += align_offset;
115308d6af8cSJussi Kivilinna 			sg_init_one(&sgout[0], data, template[i].ilen);
115408d6af8cSJussi Kivilinna 		}
1155da7f033dSHerbert Xu 
115612773d93SHerbert Xu 		skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1157da7f033dSHerbert Xu 					   template[i].ilen, iv);
115812773d93SHerbert Xu 		ret = enc ? crypto_skcipher_encrypt(req) :
115912773d93SHerbert Xu 			    crypto_skcipher_decrypt(req);
1160da7f033dSHerbert Xu 
1161da7f033dSHerbert Xu 		switch (ret) {
1162da7f033dSHerbert Xu 		case 0:
1163da7f033dSHerbert Xu 			break;
1164da7f033dSHerbert Xu 		case -EINPROGRESS:
1165da7f033dSHerbert Xu 		case -EBUSY:
11668a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
116716735d02SWolfram Sang 			reinit_completion(&result.completion);
11688a45ac12SRabin Vincent 			ret = result.err;
11698a45ac12SRabin Vincent 			if (!ret)
1170da7f033dSHerbert Xu 				break;
1171da7f033dSHerbert Xu 			/* fall through */
1172da7f033dSHerbert Xu 		default:
117308d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n",
117408d6af8cSJussi Kivilinna 			       d, e, j, algo, -ret);
1175da7f033dSHerbert Xu 			goto out;
1176da7f033dSHerbert Xu 		}
1177da7f033dSHerbert Xu 
1178da7f033dSHerbert Xu 		q = data;
1179da7f033dSHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
11808a826a34SBoris BREZILLON 			pr_err("alg: skcipher%s: Test %d failed (invalid result) on %s for %s\n",
118108d6af8cSJussi Kivilinna 			       d, j, e, algo);
1182da7f033dSHerbert Xu 			hexdump(q, template[i].rlen);
1183da7f033dSHerbert Xu 			ret = -EINVAL;
1184da7f033dSHerbert Xu 			goto out;
1185da7f033dSHerbert Xu 		}
11868a826a34SBoris BREZILLON 
11878a826a34SBoris BREZILLON 		if (template[i].iv_out &&
11888a826a34SBoris BREZILLON 		    memcmp(iv, template[i].iv_out,
11898a826a34SBoris BREZILLON 			   crypto_skcipher_ivsize(tfm))) {
11908a826a34SBoris BREZILLON 			pr_err("alg: skcipher%s: Test %d failed (invalid output IV) on %s for %s\n",
11918a826a34SBoris BREZILLON 			       d, j, e, algo);
11928a826a34SBoris BREZILLON 			hexdump(iv, crypto_skcipher_ivsize(tfm));
11938a826a34SBoris BREZILLON 			ret = -EINVAL;
11948a826a34SBoris BREZILLON 			goto out;
11958a826a34SBoris BREZILLON 		}
1196da7f033dSHerbert Xu 	}
1197da7f033dSHerbert Xu 
1198da7f033dSHerbert Xu 	j = 0;
1199da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
12003a338f20SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
12013a338f20SJussi Kivilinna 		if (align_offset != 0)
12023a338f20SJussi Kivilinna 			break;
1203da7f033dSHerbert Xu 
1204bbb9a7ddSCristian Stoica 		if (!template[i].np)
1205bbb9a7ddSCristian Stoica 			continue;
1206bbb9a7ddSCristian Stoica 
120710faa8c0SStephan Mueller 		if (fips_enabled && template[i].fips_skip)
120810faa8c0SStephan Mueller 			continue;
120910faa8c0SStephan Mueller 
1210da7f033dSHerbert Xu 		if (template[i].iv)
121184cba178SAndrey Ryabinin 			memcpy(iv, template[i].iv, ivsize);
1212da7f033dSHerbert Xu 		else
1213da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
1214da7f033dSHerbert Xu 
1215da7f033dSHerbert Xu 		j++;
121612773d93SHerbert Xu 		crypto_skcipher_clear_flags(tfm, ~0);
1217da7f033dSHerbert Xu 		if (template[i].wk)
121812773d93SHerbert Xu 			crypto_skcipher_set_flags(tfm,
121912773d93SHerbert Xu 						  CRYPTO_TFM_REQ_WEAK_KEY);
1220da7f033dSHerbert Xu 
122112773d93SHerbert Xu 		ret = crypto_skcipher_setkey(tfm, template[i].key,
1222da7f033dSHerbert Xu 					     template[i].klen);
12230fae0c1eSYanjiang Jin 		if (template[i].fail == !ret) {
122408d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n",
122512773d93SHerbert Xu 			       d, j, algo, crypto_skcipher_get_flags(tfm));
1226da7f033dSHerbert Xu 			goto out;
1227da7f033dSHerbert Xu 		} else if (ret)
1228da7f033dSHerbert Xu 			continue;
1229da7f033dSHerbert Xu 
1230da7f033dSHerbert Xu 		temp = 0;
1231da7f033dSHerbert Xu 		ret = -EINVAL;
1232da7f033dSHerbert Xu 		sg_init_table(sg, template[i].np);
123308d6af8cSJussi Kivilinna 		if (diff_dst)
123408d6af8cSJussi Kivilinna 			sg_init_table(sgout, template[i].np);
1235da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
1236da7f033dSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
1237da7f033dSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
1238da7f033dSHerbert Xu 				goto out;
1239da7f033dSHerbert Xu 
1240a1aa44a2SCristian Stoica 			q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
1241da7f033dSHerbert Xu 
1242a1aa44a2SCristian Stoica 			memcpy(q, template[i].input + temp, template[i].tap[k]);
1243da7f033dSHerbert Xu 
1244a1aa44a2SCristian Stoica 			if (offset_in_page(q) + template[i].tap[k] < PAGE_SIZE)
1245da7f033dSHerbert Xu 				q[template[i].tap[k]] = 0;
1246da7f033dSHerbert Xu 
1247da7f033dSHerbert Xu 			sg_set_buf(&sg[k], q, template[i].tap[k]);
124808d6af8cSJussi Kivilinna 			if (diff_dst) {
124908d6af8cSJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
125008d6af8cSJussi Kivilinna 				    offset_in_page(IDX[k]);
125108d6af8cSJussi Kivilinna 
1252a1aa44a2SCristian Stoica 				sg_set_buf(&sgout[k], q, template[i].tap[k]);
125308d6af8cSJussi Kivilinna 
125408d6af8cSJussi Kivilinna 				memset(q, 0, template[i].tap[k]);
125508d6af8cSJussi Kivilinna 				if (offset_in_page(q) +
125608d6af8cSJussi Kivilinna 				    template[i].tap[k] < PAGE_SIZE)
125708d6af8cSJussi Kivilinna 					q[template[i].tap[k]] = 0;
125808d6af8cSJussi Kivilinna 			}
1259da7f033dSHerbert Xu 
1260da7f033dSHerbert Xu 			temp += template[i].tap[k];
1261da7f033dSHerbert Xu 		}
1262da7f033dSHerbert Xu 
126312773d93SHerbert Xu 		skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1264da7f033dSHerbert Xu 					   template[i].ilen, iv);
1265da7f033dSHerbert Xu 
126612773d93SHerbert Xu 		ret = enc ? crypto_skcipher_encrypt(req) :
126712773d93SHerbert Xu 			    crypto_skcipher_decrypt(req);
1268da7f033dSHerbert Xu 
1269da7f033dSHerbert Xu 		switch (ret) {
1270da7f033dSHerbert Xu 		case 0:
1271da7f033dSHerbert Xu 			break;
1272da7f033dSHerbert Xu 		case -EINPROGRESS:
1273da7f033dSHerbert Xu 		case -EBUSY:
12748a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
127516735d02SWolfram Sang 			reinit_completion(&result.completion);
12768a45ac12SRabin Vincent 			ret = result.err;
12778a45ac12SRabin Vincent 			if (!ret)
1278da7f033dSHerbert Xu 				break;
1279da7f033dSHerbert Xu 			/* fall through */
1280da7f033dSHerbert Xu 		default:
128108d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n",
128208d6af8cSJussi Kivilinna 			       d, e, j, algo, -ret);
1283da7f033dSHerbert Xu 			goto out;
1284da7f033dSHerbert Xu 		}
1285da7f033dSHerbert Xu 
1286da7f033dSHerbert Xu 		temp = 0;
1287da7f033dSHerbert Xu 		ret = -EINVAL;
1288da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
128908d6af8cSJussi Kivilinna 			if (diff_dst)
129008d6af8cSJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
129108d6af8cSJussi Kivilinna 				    offset_in_page(IDX[k]);
129208d6af8cSJussi Kivilinna 			else
1293da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
1294da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
1295da7f033dSHerbert Xu 
1296da7f033dSHerbert Xu 			if (memcmp(q, template[i].result + temp,
1297da7f033dSHerbert Xu 				   template[i].tap[k])) {
129808d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n",
129908d6af8cSJussi Kivilinna 				       d, j, e, k, algo);
1300da7f033dSHerbert Xu 				hexdump(q, template[i].tap[k]);
1301da7f033dSHerbert Xu 				goto out;
1302da7f033dSHerbert Xu 			}
1303da7f033dSHerbert Xu 
1304da7f033dSHerbert Xu 			q += template[i].tap[k];
1305da7f033dSHerbert Xu 			for (n = 0; offset_in_page(q + n) && q[n]; n++)
1306da7f033dSHerbert Xu 				;
1307da7f033dSHerbert Xu 			if (n) {
130808d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
130908d6af8cSJussi Kivilinna 				       d, j, e, k, algo, n);
1310da7f033dSHerbert Xu 				hexdump(q, n);
1311da7f033dSHerbert Xu 				goto out;
1312da7f033dSHerbert Xu 			}
1313da7f033dSHerbert Xu 			temp += template[i].tap[k];
1314da7f033dSHerbert Xu 		}
1315da7f033dSHerbert Xu 	}
1316da7f033dSHerbert Xu 
1317da7f033dSHerbert Xu 	ret = 0;
1318da7f033dSHerbert Xu 
1319da7f033dSHerbert Xu out:
132012773d93SHerbert Xu 	skcipher_request_free(req);
132108d6af8cSJussi Kivilinna 	if (diff_dst)
132208d6af8cSJussi Kivilinna 		testmgr_free_buf(xoutbuf);
132308d6af8cSJussi Kivilinna out_nooutbuf:
1324f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
1325f8b0d4d0SHerbert Xu out_nobuf:
1326da7f033dSHerbert Xu 	return ret;
1327da7f033dSHerbert Xu }
1328da7f033dSHerbert Xu 
132912773d93SHerbert Xu static int test_skcipher(struct crypto_skcipher *tfm, int enc,
133008d6af8cSJussi Kivilinna 			 struct cipher_testvec *template, unsigned int tcount)
133108d6af8cSJussi Kivilinna {
13323a338f20SJussi Kivilinna 	unsigned int alignmask;
133308d6af8cSJussi Kivilinna 	int ret;
133408d6af8cSJussi Kivilinna 
133508d6af8cSJussi Kivilinna 	/* test 'dst == src' case */
13363a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, false, 0);
133708d6af8cSJussi Kivilinna 	if (ret)
133808d6af8cSJussi Kivilinna 		return ret;
133908d6af8cSJussi Kivilinna 
134008d6af8cSJussi Kivilinna 	/* test 'dst != src' case */
13413a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 0);
13423a338f20SJussi Kivilinna 	if (ret)
13433a338f20SJussi Kivilinna 		return ret;
13443a338f20SJussi Kivilinna 
13453a338f20SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
13463a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 1);
13473a338f20SJussi Kivilinna 	if (ret)
13483a338f20SJussi Kivilinna 		return ret;
13493a338f20SJussi Kivilinna 
13503a338f20SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
13513a338f20SJussi Kivilinna 	if (alignmask) {
13523a338f20SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
13533a338f20SJussi Kivilinna 		ret = __test_skcipher(tfm, enc, template, tcount, true,
13543a338f20SJussi Kivilinna 				      alignmask + 1);
13553a338f20SJussi Kivilinna 		if (ret)
13563a338f20SJussi Kivilinna 			return ret;
13573a338f20SJussi Kivilinna 	}
13583a338f20SJussi Kivilinna 
13593a338f20SJussi Kivilinna 	return 0;
136008d6af8cSJussi Kivilinna }
136108d6af8cSJussi Kivilinna 
1362da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate,
1363da7f033dSHerbert Xu 		     struct comp_testvec *dtemplate, int ctcount, int dtcount)
1364da7f033dSHerbert Xu {
1365da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
1366da7f033dSHerbert Xu 	unsigned int i;
1367da7f033dSHerbert Xu 	char result[COMP_BUF_SIZE];
1368da7f033dSHerbert Xu 	int ret;
1369da7f033dSHerbert Xu 
1370da7f033dSHerbert Xu 	for (i = 0; i < ctcount; i++) {
1371c79cf910SGeert Uytterhoeven 		int ilen;
1372c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1373da7f033dSHerbert Xu 
1374da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1375da7f033dSHerbert Xu 
1376da7f033dSHerbert Xu 		ilen = ctemplate[i].inlen;
1377da7f033dSHerbert Xu 		ret = crypto_comp_compress(tfm, ctemplate[i].input,
1378da7f033dSHerbert Xu 		                           ilen, result, &dlen);
1379da7f033dSHerbert Xu 		if (ret) {
1380da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: compression failed "
1381da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1382da7f033dSHerbert Xu 			       -ret);
1383da7f033dSHerbert Xu 			goto out;
1384da7f033dSHerbert Xu 		}
1385da7f033dSHerbert Xu 
1386b812eb00SGeert Uytterhoeven 		if (dlen != ctemplate[i].outlen) {
1387b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Compression test %d "
1388b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1389b812eb00SGeert Uytterhoeven 			       dlen);
1390b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1391b812eb00SGeert Uytterhoeven 			goto out;
1392b812eb00SGeert Uytterhoeven 		}
1393b812eb00SGeert Uytterhoeven 
1394da7f033dSHerbert Xu 		if (memcmp(result, ctemplate[i].output, dlen)) {
1395da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Compression test %d "
1396da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1397da7f033dSHerbert Xu 			hexdump(result, dlen);
1398da7f033dSHerbert Xu 			ret = -EINVAL;
1399da7f033dSHerbert Xu 			goto out;
1400da7f033dSHerbert Xu 		}
1401da7f033dSHerbert Xu 	}
1402da7f033dSHerbert Xu 
1403da7f033dSHerbert Xu 	for (i = 0; i < dtcount; i++) {
1404c79cf910SGeert Uytterhoeven 		int ilen;
1405c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1406da7f033dSHerbert Xu 
1407da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1408da7f033dSHerbert Xu 
1409da7f033dSHerbert Xu 		ilen = dtemplate[i].inlen;
1410da7f033dSHerbert Xu 		ret = crypto_comp_decompress(tfm, dtemplate[i].input,
1411da7f033dSHerbert Xu 		                             ilen, result, &dlen);
1412da7f033dSHerbert Xu 		if (ret) {
1413da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: decompression failed "
1414da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1415da7f033dSHerbert Xu 			       -ret);
1416da7f033dSHerbert Xu 			goto out;
1417da7f033dSHerbert Xu 		}
1418da7f033dSHerbert Xu 
1419b812eb00SGeert Uytterhoeven 		if (dlen != dtemplate[i].outlen) {
1420b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Decompression test %d "
1421b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1422b812eb00SGeert Uytterhoeven 			       dlen);
1423b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1424b812eb00SGeert Uytterhoeven 			goto out;
1425b812eb00SGeert Uytterhoeven 		}
1426b812eb00SGeert Uytterhoeven 
1427da7f033dSHerbert Xu 		if (memcmp(result, dtemplate[i].output, dlen)) {
1428da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Decompression test %d "
1429da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1430da7f033dSHerbert Xu 			hexdump(result, dlen);
1431da7f033dSHerbert Xu 			ret = -EINVAL;
1432da7f033dSHerbert Xu 			goto out;
1433da7f033dSHerbert Xu 		}
1434da7f033dSHerbert Xu 	}
1435da7f033dSHerbert Xu 
1436da7f033dSHerbert Xu 	ret = 0;
1437da7f033dSHerbert Xu 
1438da7f033dSHerbert Xu out:
1439da7f033dSHerbert Xu 	return ret;
1440da7f033dSHerbert Xu }
1441da7f033dSHerbert Xu 
14427647d6ceSJarod Wilson static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template,
14437647d6ceSJarod Wilson 		      unsigned int tcount)
14447647d6ceSJarod Wilson {
14457647d6ceSJarod Wilson 	const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
1446fa4ef8a6SFelipe Contreras 	int err = 0, i, j, seedsize;
14477647d6ceSJarod Wilson 	u8 *seed;
14487647d6ceSJarod Wilson 	char result[32];
14497647d6ceSJarod Wilson 
14507647d6ceSJarod Wilson 	seedsize = crypto_rng_seedsize(tfm);
14517647d6ceSJarod Wilson 
14527647d6ceSJarod Wilson 	seed = kmalloc(seedsize, GFP_KERNEL);
14537647d6ceSJarod Wilson 	if (!seed) {
14547647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to allocate seed space "
14557647d6ceSJarod Wilson 		       "for %s\n", algo);
14567647d6ceSJarod Wilson 		return -ENOMEM;
14577647d6ceSJarod Wilson 	}
14587647d6ceSJarod Wilson 
14597647d6ceSJarod Wilson 	for (i = 0; i < tcount; i++) {
14607647d6ceSJarod Wilson 		memset(result, 0, 32);
14617647d6ceSJarod Wilson 
14627647d6ceSJarod Wilson 		memcpy(seed, template[i].v, template[i].vlen);
14637647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen, template[i].key,
14647647d6ceSJarod Wilson 		       template[i].klen);
14657647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen + template[i].klen,
14667647d6ceSJarod Wilson 		       template[i].dt, template[i].dtlen);
14677647d6ceSJarod Wilson 
14687647d6ceSJarod Wilson 		err = crypto_rng_reset(tfm, seed, seedsize);
14697647d6ceSJarod Wilson 		if (err) {
14707647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Failed to reset rng "
14717647d6ceSJarod Wilson 			       "for %s\n", algo);
14727647d6ceSJarod Wilson 			goto out;
14737647d6ceSJarod Wilson 		}
14747647d6ceSJarod Wilson 
14757647d6ceSJarod Wilson 		for (j = 0; j < template[i].loops; j++) {
14767647d6ceSJarod Wilson 			err = crypto_rng_get_bytes(tfm, result,
14777647d6ceSJarod Wilson 						   template[i].rlen);
147819e60e13SStephan Mueller 			if (err < 0) {
14797647d6ceSJarod Wilson 				printk(KERN_ERR "alg: cprng: Failed to obtain "
14807647d6ceSJarod Wilson 				       "the correct amount of random data for "
148119e60e13SStephan Mueller 				       "%s (requested %d)\n", algo,
148219e60e13SStephan Mueller 				       template[i].rlen);
14837647d6ceSJarod Wilson 				goto out;
14847647d6ceSJarod Wilson 			}
14857647d6ceSJarod Wilson 		}
14867647d6ceSJarod Wilson 
14877647d6ceSJarod Wilson 		err = memcmp(result, template[i].result,
14887647d6ceSJarod Wilson 			     template[i].rlen);
14897647d6ceSJarod Wilson 		if (err) {
14907647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Test %d failed for %s\n",
14917647d6ceSJarod Wilson 			       i, algo);
14927647d6ceSJarod Wilson 			hexdump(result, template[i].rlen);
14937647d6ceSJarod Wilson 			err = -EINVAL;
14947647d6ceSJarod Wilson 			goto out;
14957647d6ceSJarod Wilson 		}
14967647d6ceSJarod Wilson 	}
14977647d6ceSJarod Wilson 
14987647d6ceSJarod Wilson out:
14997647d6ceSJarod Wilson 	kfree(seed);
15007647d6ceSJarod Wilson 	return err;
15017647d6ceSJarod Wilson }
15027647d6ceSJarod Wilson 
1503da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
1504da7f033dSHerbert Xu 			 u32 type, u32 mask)
1505da7f033dSHerbert Xu {
1506da7f033dSHerbert Xu 	struct crypto_aead *tfm;
1507da7f033dSHerbert Xu 	int err = 0;
1508da7f033dSHerbert Xu 
1509425a8829SStephan Mueller 	tfm = crypto_alloc_aead(driver, type | CRYPTO_ALG_INTERNAL, mask);
1510da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1511da7f033dSHerbert Xu 		printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
1512da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1513da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1514da7f033dSHerbert Xu 	}
1515da7f033dSHerbert Xu 
1516da7f033dSHerbert Xu 	if (desc->suite.aead.enc.vecs) {
1517da7f033dSHerbert Xu 		err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
1518da7f033dSHerbert Xu 				desc->suite.aead.enc.count);
1519da7f033dSHerbert Xu 		if (err)
1520da7f033dSHerbert Xu 			goto out;
1521da7f033dSHerbert Xu 	}
1522da7f033dSHerbert Xu 
1523da7f033dSHerbert Xu 	if (!err && desc->suite.aead.dec.vecs)
1524da7f033dSHerbert Xu 		err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
1525da7f033dSHerbert Xu 				desc->suite.aead.dec.count);
1526da7f033dSHerbert Xu 
1527da7f033dSHerbert Xu out:
1528da7f033dSHerbert Xu 	crypto_free_aead(tfm);
1529da7f033dSHerbert Xu 	return err;
1530da7f033dSHerbert Xu }
1531da7f033dSHerbert Xu 
1532da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc,
1533da7f033dSHerbert Xu 			   const char *driver, u32 type, u32 mask)
1534da7f033dSHerbert Xu {
15351aa4ecd9SHerbert Xu 	struct crypto_cipher *tfm;
1536da7f033dSHerbert Xu 	int err = 0;
1537da7f033dSHerbert Xu 
1538425a8829SStephan Mueller 	tfm = crypto_alloc_cipher(driver, type | CRYPTO_ALG_INTERNAL, mask);
1539da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1540da7f033dSHerbert Xu 		printk(KERN_ERR "alg: cipher: Failed to load transform for "
1541da7f033dSHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
1542da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1543da7f033dSHerbert Xu 	}
1544da7f033dSHerbert Xu 
1545da7f033dSHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
1546da7f033dSHerbert Xu 		err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1547da7f033dSHerbert Xu 				  desc->suite.cipher.enc.count);
1548da7f033dSHerbert Xu 		if (err)
1549da7f033dSHerbert Xu 			goto out;
1550da7f033dSHerbert Xu 	}
1551da7f033dSHerbert Xu 
1552da7f033dSHerbert Xu 	if (desc->suite.cipher.dec.vecs)
1553da7f033dSHerbert Xu 		err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1554da7f033dSHerbert Xu 				  desc->suite.cipher.dec.count);
1555da7f033dSHerbert Xu 
1556da7f033dSHerbert Xu out:
15571aa4ecd9SHerbert Xu 	crypto_free_cipher(tfm);
15581aa4ecd9SHerbert Xu 	return err;
15591aa4ecd9SHerbert Xu }
15601aa4ecd9SHerbert Xu 
15611aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc,
15621aa4ecd9SHerbert Xu 			     const char *driver, u32 type, u32 mask)
15631aa4ecd9SHerbert Xu {
156412773d93SHerbert Xu 	struct crypto_skcipher *tfm;
15651aa4ecd9SHerbert Xu 	int err = 0;
15661aa4ecd9SHerbert Xu 
156712773d93SHerbert Xu 	tfm = crypto_alloc_skcipher(driver, type | CRYPTO_ALG_INTERNAL, mask);
15681aa4ecd9SHerbert Xu 	if (IS_ERR(tfm)) {
15691aa4ecd9SHerbert Xu 		printk(KERN_ERR "alg: skcipher: Failed to load transform for "
15701aa4ecd9SHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
15711aa4ecd9SHerbert Xu 		return PTR_ERR(tfm);
15721aa4ecd9SHerbert Xu 	}
15731aa4ecd9SHerbert Xu 
15741aa4ecd9SHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
15751aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
15761aa4ecd9SHerbert Xu 				    desc->suite.cipher.enc.count);
15771aa4ecd9SHerbert Xu 		if (err)
15781aa4ecd9SHerbert Xu 			goto out;
15791aa4ecd9SHerbert Xu 	}
15801aa4ecd9SHerbert Xu 
15811aa4ecd9SHerbert Xu 	if (desc->suite.cipher.dec.vecs)
15821aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
15831aa4ecd9SHerbert Xu 				    desc->suite.cipher.dec.count);
15841aa4ecd9SHerbert Xu 
15851aa4ecd9SHerbert Xu out:
158612773d93SHerbert Xu 	crypto_free_skcipher(tfm);
1587da7f033dSHerbert Xu 	return err;
1588da7f033dSHerbert Xu }
1589da7f033dSHerbert Xu 
1590da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
1591da7f033dSHerbert Xu 			 u32 type, u32 mask)
1592da7f033dSHerbert Xu {
1593da7f033dSHerbert Xu 	struct crypto_comp *tfm;
1594da7f033dSHerbert Xu 	int err;
1595da7f033dSHerbert Xu 
1596da7f033dSHerbert Xu 	tfm = crypto_alloc_comp(driver, type, mask);
1597da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1598da7f033dSHerbert Xu 		printk(KERN_ERR "alg: comp: Failed to load transform for %s: "
1599da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1600da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1601da7f033dSHerbert Xu 	}
1602da7f033dSHerbert Xu 
1603da7f033dSHerbert Xu 	err = test_comp(tfm, desc->suite.comp.comp.vecs,
1604da7f033dSHerbert Xu 			desc->suite.comp.decomp.vecs,
1605da7f033dSHerbert Xu 			desc->suite.comp.comp.count,
1606da7f033dSHerbert Xu 			desc->suite.comp.decomp.count);
1607da7f033dSHerbert Xu 
1608da7f033dSHerbert Xu 	crypto_free_comp(tfm);
1609da7f033dSHerbert Xu 	return err;
1610da7f033dSHerbert Xu }
1611da7f033dSHerbert Xu 
1612da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
1613da7f033dSHerbert Xu 			 u32 type, u32 mask)
1614da7f033dSHerbert Xu {
1615da7f033dSHerbert Xu 	struct crypto_ahash *tfm;
1616da7f033dSHerbert Xu 	int err;
1617da7f033dSHerbert Xu 
1618425a8829SStephan Mueller 	tfm = crypto_alloc_ahash(driver, type | CRYPTO_ALG_INTERNAL, mask);
1619da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1620da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
1621da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1622da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1623da7f033dSHerbert Xu 	}
1624da7f033dSHerbert Xu 
1625a8f1a052SDavid S. Miller 	err = test_hash(tfm, desc->suite.hash.vecs,
1626a8f1a052SDavid S. Miller 			desc->suite.hash.count, true);
1627a8f1a052SDavid S. Miller 	if (!err)
1628a8f1a052SDavid S. Miller 		err = test_hash(tfm, desc->suite.hash.vecs,
1629a8f1a052SDavid S. Miller 				desc->suite.hash.count, false);
1630da7f033dSHerbert Xu 
1631da7f033dSHerbert Xu 	crypto_free_ahash(tfm);
1632da7f033dSHerbert Xu 	return err;
1633da7f033dSHerbert Xu }
1634da7f033dSHerbert Xu 
16358e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc,
16368e3ee85eSHerbert Xu 			   const char *driver, u32 type, u32 mask)
16378e3ee85eSHerbert Xu {
16388e3ee85eSHerbert Xu 	struct crypto_shash *tfm;
16398e3ee85eSHerbert Xu 	u32 val;
16408e3ee85eSHerbert Xu 	int err;
16418e3ee85eSHerbert Xu 
16428e3ee85eSHerbert Xu 	err = alg_test_hash(desc, driver, type, mask);
16438e3ee85eSHerbert Xu 	if (err)
16448e3ee85eSHerbert Xu 		goto out;
16458e3ee85eSHerbert Xu 
1646425a8829SStephan Mueller 	tfm = crypto_alloc_shash(driver, type | CRYPTO_ALG_INTERNAL, mask);
16478e3ee85eSHerbert Xu 	if (IS_ERR(tfm)) {
16488e3ee85eSHerbert Xu 		printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
16498e3ee85eSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
16508e3ee85eSHerbert Xu 		err = PTR_ERR(tfm);
16518e3ee85eSHerbert Xu 		goto out;
16528e3ee85eSHerbert Xu 	}
16538e3ee85eSHerbert Xu 
16548e3ee85eSHerbert Xu 	do {
16554c5c3024SJan-Simon Möller 		SHASH_DESC_ON_STACK(shash, tfm);
16564c5c3024SJan-Simon Möller 		u32 *ctx = (u32 *)shash_desc_ctx(shash);
16578e3ee85eSHerbert Xu 
16584c5c3024SJan-Simon Möller 		shash->tfm = tfm;
16594c5c3024SJan-Simon Möller 		shash->flags = 0;
16608e3ee85eSHerbert Xu 
16614c5c3024SJan-Simon Möller 		*ctx = le32_to_cpu(420553207);
16624c5c3024SJan-Simon Möller 		err = crypto_shash_final(shash, (u8 *)&val);
16638e3ee85eSHerbert Xu 		if (err) {
16648e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Operation failed for "
16658e3ee85eSHerbert Xu 			       "%s: %d\n", driver, err);
16668e3ee85eSHerbert Xu 			break;
16678e3ee85eSHerbert Xu 		}
16688e3ee85eSHerbert Xu 
16698e3ee85eSHerbert Xu 		if (val != ~420553207) {
16708e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Test failed for %s: "
16718e3ee85eSHerbert Xu 			       "%d\n", driver, val);
16728e3ee85eSHerbert Xu 			err = -EINVAL;
16738e3ee85eSHerbert Xu 		}
16748e3ee85eSHerbert Xu 	} while (0);
16758e3ee85eSHerbert Xu 
16768e3ee85eSHerbert Xu 	crypto_free_shash(tfm);
16778e3ee85eSHerbert Xu 
16788e3ee85eSHerbert Xu out:
16798e3ee85eSHerbert Xu 	return err;
16808e3ee85eSHerbert Xu }
16818e3ee85eSHerbert Xu 
16827647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
16837647d6ceSJarod Wilson 			  u32 type, u32 mask)
16847647d6ceSJarod Wilson {
16857647d6ceSJarod Wilson 	struct crypto_rng *rng;
16867647d6ceSJarod Wilson 	int err;
16877647d6ceSJarod Wilson 
1688425a8829SStephan Mueller 	rng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask);
16897647d6ceSJarod Wilson 	if (IS_ERR(rng)) {
16907647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
16917647d6ceSJarod Wilson 		       "%ld\n", driver, PTR_ERR(rng));
16927647d6ceSJarod Wilson 		return PTR_ERR(rng);
16937647d6ceSJarod Wilson 	}
16947647d6ceSJarod Wilson 
16957647d6ceSJarod Wilson 	err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count);
16967647d6ceSJarod Wilson 
16977647d6ceSJarod Wilson 	crypto_free_rng(rng);
16987647d6ceSJarod Wilson 
16997647d6ceSJarod Wilson 	return err;
17007647d6ceSJarod Wilson }
17017647d6ceSJarod Wilson 
170264d1cdfbSStephan Mueller 
170364d1cdfbSStephan Mueller static int drbg_cavs_test(struct drbg_testvec *test, int pr,
170464d1cdfbSStephan Mueller 			  const char *driver, u32 type, u32 mask)
170564d1cdfbSStephan Mueller {
170664d1cdfbSStephan Mueller 	int ret = -EAGAIN;
170764d1cdfbSStephan Mueller 	struct crypto_rng *drng;
170864d1cdfbSStephan Mueller 	struct drbg_test_data test_data;
170964d1cdfbSStephan Mueller 	struct drbg_string addtl, pers, testentropy;
171064d1cdfbSStephan Mueller 	unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL);
171164d1cdfbSStephan Mueller 
171264d1cdfbSStephan Mueller 	if (!buf)
171364d1cdfbSStephan Mueller 		return -ENOMEM;
171464d1cdfbSStephan Mueller 
1715425a8829SStephan Mueller 	drng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask);
171664d1cdfbSStephan Mueller 	if (IS_ERR(drng)) {
171764d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for "
171864d1cdfbSStephan Mueller 		       "%s\n", driver);
171964d1cdfbSStephan Mueller 		kzfree(buf);
172064d1cdfbSStephan Mueller 		return -ENOMEM;
172164d1cdfbSStephan Mueller 	}
172264d1cdfbSStephan Mueller 
172364d1cdfbSStephan Mueller 	test_data.testentropy = &testentropy;
172464d1cdfbSStephan Mueller 	drbg_string_fill(&testentropy, test->entropy, test->entropylen);
172564d1cdfbSStephan Mueller 	drbg_string_fill(&pers, test->pers, test->perslen);
172664d1cdfbSStephan Mueller 	ret = crypto_drbg_reset_test(drng, &pers, &test_data);
172764d1cdfbSStephan Mueller 	if (ret) {
172864d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: Failed to reset rng\n");
172964d1cdfbSStephan Mueller 		goto outbuf;
173064d1cdfbSStephan Mueller 	}
173164d1cdfbSStephan Mueller 
173264d1cdfbSStephan Mueller 	drbg_string_fill(&addtl, test->addtla, test->addtllen);
173364d1cdfbSStephan Mueller 	if (pr) {
173464d1cdfbSStephan Mueller 		drbg_string_fill(&testentropy, test->entpra, test->entprlen);
173564d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl_test(drng,
173664d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl,	&test_data);
173764d1cdfbSStephan Mueller 	} else {
173864d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl(drng,
173964d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl);
174064d1cdfbSStephan Mueller 	}
174119e60e13SStephan Mueller 	if (ret < 0) {
174264d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not obtain random data for "
174364d1cdfbSStephan Mueller 		       "driver %s\n", driver);
174464d1cdfbSStephan Mueller 		goto outbuf;
174564d1cdfbSStephan Mueller 	}
174664d1cdfbSStephan Mueller 
174764d1cdfbSStephan Mueller 	drbg_string_fill(&addtl, test->addtlb, test->addtllen);
174864d1cdfbSStephan Mueller 	if (pr) {
174964d1cdfbSStephan Mueller 		drbg_string_fill(&testentropy, test->entprb, test->entprlen);
175064d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl_test(drng,
175164d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl, &test_data);
175264d1cdfbSStephan Mueller 	} else {
175364d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl(drng,
175464d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl);
175564d1cdfbSStephan Mueller 	}
175619e60e13SStephan Mueller 	if (ret < 0) {
175764d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not obtain random data for "
175864d1cdfbSStephan Mueller 		       "driver %s\n", driver);
175964d1cdfbSStephan Mueller 		goto outbuf;
176064d1cdfbSStephan Mueller 	}
176164d1cdfbSStephan Mueller 
176264d1cdfbSStephan Mueller 	ret = memcmp(test->expected, buf, test->expectedlen);
176364d1cdfbSStephan Mueller 
176464d1cdfbSStephan Mueller outbuf:
176564d1cdfbSStephan Mueller 	crypto_free_rng(drng);
176664d1cdfbSStephan Mueller 	kzfree(buf);
176764d1cdfbSStephan Mueller 	return ret;
176864d1cdfbSStephan Mueller }
176964d1cdfbSStephan Mueller 
177064d1cdfbSStephan Mueller 
177164d1cdfbSStephan Mueller static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver,
177264d1cdfbSStephan Mueller 			 u32 type, u32 mask)
177364d1cdfbSStephan Mueller {
177464d1cdfbSStephan Mueller 	int err = 0;
177564d1cdfbSStephan Mueller 	int pr = 0;
177664d1cdfbSStephan Mueller 	int i = 0;
177764d1cdfbSStephan Mueller 	struct drbg_testvec *template = desc->suite.drbg.vecs;
177864d1cdfbSStephan Mueller 	unsigned int tcount = desc->suite.drbg.count;
177964d1cdfbSStephan Mueller 
178064d1cdfbSStephan Mueller 	if (0 == memcmp(driver, "drbg_pr_", 8))
178164d1cdfbSStephan Mueller 		pr = 1;
178264d1cdfbSStephan Mueller 
178364d1cdfbSStephan Mueller 	for (i = 0; i < tcount; i++) {
178464d1cdfbSStephan Mueller 		err = drbg_cavs_test(&template[i], pr, driver, type, mask);
178564d1cdfbSStephan Mueller 		if (err) {
178664d1cdfbSStephan Mueller 			printk(KERN_ERR "alg: drbg: Test %d failed for %s\n",
178764d1cdfbSStephan Mueller 			       i, driver);
178864d1cdfbSStephan Mueller 			err = -EINVAL;
178964d1cdfbSStephan Mueller 			break;
179064d1cdfbSStephan Mueller 		}
179164d1cdfbSStephan Mueller 	}
179264d1cdfbSStephan Mueller 	return err;
179364d1cdfbSStephan Mueller 
179464d1cdfbSStephan Mueller }
179564d1cdfbSStephan Mueller 
1796802c7f1cSSalvatore Benedetto static int do_test_kpp(struct crypto_kpp *tfm, struct kpp_testvec *vec,
1797802c7f1cSSalvatore Benedetto 		       const char *alg)
1798802c7f1cSSalvatore Benedetto {
1799802c7f1cSSalvatore Benedetto 	struct kpp_request *req;
1800802c7f1cSSalvatore Benedetto 	void *input_buf = NULL;
1801802c7f1cSSalvatore Benedetto 	void *output_buf = NULL;
1802802c7f1cSSalvatore Benedetto 	struct tcrypt_result result;
1803802c7f1cSSalvatore Benedetto 	unsigned int out_len_max;
1804802c7f1cSSalvatore Benedetto 	int err = -ENOMEM;
1805802c7f1cSSalvatore Benedetto 	struct scatterlist src, dst;
1806802c7f1cSSalvatore Benedetto 
1807802c7f1cSSalvatore Benedetto 	req = kpp_request_alloc(tfm, GFP_KERNEL);
1808802c7f1cSSalvatore Benedetto 	if (!req)
1809802c7f1cSSalvatore Benedetto 		return err;
1810802c7f1cSSalvatore Benedetto 
1811802c7f1cSSalvatore Benedetto 	init_completion(&result.completion);
1812802c7f1cSSalvatore Benedetto 
1813802c7f1cSSalvatore Benedetto 	err = crypto_kpp_set_secret(tfm, vec->secret, vec->secret_size);
1814802c7f1cSSalvatore Benedetto 	if (err < 0)
1815802c7f1cSSalvatore Benedetto 		goto free_req;
1816802c7f1cSSalvatore Benedetto 
1817802c7f1cSSalvatore Benedetto 	out_len_max = crypto_kpp_maxsize(tfm);
1818802c7f1cSSalvatore Benedetto 	output_buf = kzalloc(out_len_max, GFP_KERNEL);
1819802c7f1cSSalvatore Benedetto 	if (!output_buf) {
1820802c7f1cSSalvatore Benedetto 		err = -ENOMEM;
1821802c7f1cSSalvatore Benedetto 		goto free_req;
1822802c7f1cSSalvatore Benedetto 	}
1823802c7f1cSSalvatore Benedetto 
1824802c7f1cSSalvatore Benedetto 	/* Use appropriate parameter as base */
1825802c7f1cSSalvatore Benedetto 	kpp_request_set_input(req, NULL, 0);
1826802c7f1cSSalvatore Benedetto 	sg_init_one(&dst, output_buf, out_len_max);
1827802c7f1cSSalvatore Benedetto 	kpp_request_set_output(req, &dst, out_len_max);
1828802c7f1cSSalvatore Benedetto 	kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1829802c7f1cSSalvatore Benedetto 				 tcrypt_complete, &result);
1830802c7f1cSSalvatore Benedetto 
1831802c7f1cSSalvatore Benedetto 	/* Compute public key */
1832802c7f1cSSalvatore Benedetto 	err = wait_async_op(&result, crypto_kpp_generate_public_key(req));
1833802c7f1cSSalvatore Benedetto 	if (err) {
1834802c7f1cSSalvatore Benedetto 		pr_err("alg: %s: generate public key test failed. err %d\n",
1835802c7f1cSSalvatore Benedetto 		       alg, err);
1836802c7f1cSSalvatore Benedetto 		goto free_output;
1837802c7f1cSSalvatore Benedetto 	}
1838802c7f1cSSalvatore Benedetto 	/* Verify calculated public key */
1839802c7f1cSSalvatore Benedetto 	if (memcmp(vec->expected_a_public, sg_virt(req->dst),
1840802c7f1cSSalvatore Benedetto 		   vec->expected_a_public_size)) {
1841802c7f1cSSalvatore Benedetto 		pr_err("alg: %s: generate public key test failed. Invalid output\n",
1842802c7f1cSSalvatore Benedetto 		       alg);
1843802c7f1cSSalvatore Benedetto 		err = -EINVAL;
1844802c7f1cSSalvatore Benedetto 		goto free_output;
1845802c7f1cSSalvatore Benedetto 	}
1846802c7f1cSSalvatore Benedetto 
1847802c7f1cSSalvatore Benedetto 	/* Calculate shared secret key by using counter part (b) public key. */
1848802c7f1cSSalvatore Benedetto 	input_buf = kzalloc(vec->b_public_size, GFP_KERNEL);
1849802c7f1cSSalvatore Benedetto 	if (!input_buf) {
1850802c7f1cSSalvatore Benedetto 		err = -ENOMEM;
1851802c7f1cSSalvatore Benedetto 		goto free_output;
1852802c7f1cSSalvatore Benedetto 	}
1853802c7f1cSSalvatore Benedetto 
1854802c7f1cSSalvatore Benedetto 	memcpy(input_buf, vec->b_public, vec->b_public_size);
1855802c7f1cSSalvatore Benedetto 	sg_init_one(&src, input_buf, vec->b_public_size);
1856802c7f1cSSalvatore Benedetto 	sg_init_one(&dst, output_buf, out_len_max);
1857802c7f1cSSalvatore Benedetto 	kpp_request_set_input(req, &src, vec->b_public_size);
1858802c7f1cSSalvatore Benedetto 	kpp_request_set_output(req, &dst, out_len_max);
1859802c7f1cSSalvatore Benedetto 	kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1860802c7f1cSSalvatore Benedetto 				 tcrypt_complete, &result);
1861802c7f1cSSalvatore Benedetto 	err = wait_async_op(&result, crypto_kpp_compute_shared_secret(req));
1862802c7f1cSSalvatore Benedetto 	if (err) {
1863802c7f1cSSalvatore Benedetto 		pr_err("alg: %s: compute shard secret test failed. err %d\n",
1864802c7f1cSSalvatore Benedetto 		       alg, err);
1865802c7f1cSSalvatore Benedetto 		goto free_all;
1866802c7f1cSSalvatore Benedetto 	}
1867802c7f1cSSalvatore Benedetto 	/*
1868802c7f1cSSalvatore Benedetto 	 * verify shared secret from which the user will derive
1869802c7f1cSSalvatore Benedetto 	 * secret key by executing whatever hash it has chosen
1870802c7f1cSSalvatore Benedetto 	 */
1871802c7f1cSSalvatore Benedetto 	if (memcmp(vec->expected_ss, sg_virt(req->dst),
1872802c7f1cSSalvatore Benedetto 		   vec->expected_ss_size)) {
1873802c7f1cSSalvatore Benedetto 		pr_err("alg: %s: compute shared secret test failed. Invalid output\n",
1874802c7f1cSSalvatore Benedetto 		       alg);
1875802c7f1cSSalvatore Benedetto 		err = -EINVAL;
1876802c7f1cSSalvatore Benedetto 	}
1877802c7f1cSSalvatore Benedetto 
1878802c7f1cSSalvatore Benedetto free_all:
1879802c7f1cSSalvatore Benedetto 	kfree(input_buf);
1880802c7f1cSSalvatore Benedetto free_output:
1881802c7f1cSSalvatore Benedetto 	kfree(output_buf);
1882802c7f1cSSalvatore Benedetto free_req:
1883802c7f1cSSalvatore Benedetto 	kpp_request_free(req);
1884802c7f1cSSalvatore Benedetto 	return err;
1885802c7f1cSSalvatore Benedetto }
1886802c7f1cSSalvatore Benedetto 
1887802c7f1cSSalvatore Benedetto static int test_kpp(struct crypto_kpp *tfm, const char *alg,
1888802c7f1cSSalvatore Benedetto 		    struct kpp_testvec *vecs, unsigned int tcount)
1889802c7f1cSSalvatore Benedetto {
1890802c7f1cSSalvatore Benedetto 	int ret, i;
1891802c7f1cSSalvatore Benedetto 
1892802c7f1cSSalvatore Benedetto 	for (i = 0; i < tcount; i++) {
1893802c7f1cSSalvatore Benedetto 		ret = do_test_kpp(tfm, vecs++, alg);
1894802c7f1cSSalvatore Benedetto 		if (ret) {
1895802c7f1cSSalvatore Benedetto 			pr_err("alg: %s: test failed on vector %d, err=%d\n",
1896802c7f1cSSalvatore Benedetto 			       alg, i + 1, ret);
1897802c7f1cSSalvatore Benedetto 			return ret;
1898802c7f1cSSalvatore Benedetto 		}
1899802c7f1cSSalvatore Benedetto 	}
1900802c7f1cSSalvatore Benedetto 	return 0;
1901802c7f1cSSalvatore Benedetto }
1902802c7f1cSSalvatore Benedetto 
1903802c7f1cSSalvatore Benedetto static int alg_test_kpp(const struct alg_test_desc *desc, const char *driver,
1904802c7f1cSSalvatore Benedetto 			u32 type, u32 mask)
1905802c7f1cSSalvatore Benedetto {
1906802c7f1cSSalvatore Benedetto 	struct crypto_kpp *tfm;
1907802c7f1cSSalvatore Benedetto 	int err = 0;
1908802c7f1cSSalvatore Benedetto 
1909802c7f1cSSalvatore Benedetto 	tfm = crypto_alloc_kpp(driver, type | CRYPTO_ALG_INTERNAL, mask);
1910802c7f1cSSalvatore Benedetto 	if (IS_ERR(tfm)) {
1911802c7f1cSSalvatore Benedetto 		pr_err("alg: kpp: Failed to load tfm for %s: %ld\n",
1912802c7f1cSSalvatore Benedetto 		       driver, PTR_ERR(tfm));
1913802c7f1cSSalvatore Benedetto 		return PTR_ERR(tfm);
1914802c7f1cSSalvatore Benedetto 	}
1915802c7f1cSSalvatore Benedetto 	if (desc->suite.kpp.vecs)
1916802c7f1cSSalvatore Benedetto 		err = test_kpp(tfm, desc->alg, desc->suite.kpp.vecs,
1917802c7f1cSSalvatore Benedetto 			       desc->suite.kpp.count);
1918802c7f1cSSalvatore Benedetto 
1919802c7f1cSSalvatore Benedetto 	crypto_free_kpp(tfm);
1920802c7f1cSSalvatore Benedetto 	return err;
1921802c7f1cSSalvatore Benedetto }
1922802c7f1cSSalvatore Benedetto 
192350d2b643SHerbert Xu static int test_akcipher_one(struct crypto_akcipher *tfm,
1924946cc463STadeusz Struk 			     struct akcipher_testvec *vecs)
1925946cc463STadeusz Struk {
1926df27b26fSHerbert Xu 	char *xbuf[XBUFSIZE];
1927946cc463STadeusz Struk 	struct akcipher_request *req;
1928946cc463STadeusz Struk 	void *outbuf_enc = NULL;
1929946cc463STadeusz Struk 	void *outbuf_dec = NULL;
1930946cc463STadeusz Struk 	struct tcrypt_result result;
1931946cc463STadeusz Struk 	unsigned int out_len_max, out_len = 0;
1932946cc463STadeusz Struk 	int err = -ENOMEM;
193322287b0bSTadeusz Struk 	struct scatterlist src, dst, src_tab[2];
1934946cc463STadeusz Struk 
1935df27b26fSHerbert Xu 	if (testmgr_alloc_buf(xbuf))
1936df27b26fSHerbert Xu 		return err;
1937df27b26fSHerbert Xu 
1938946cc463STadeusz Struk 	req = akcipher_request_alloc(tfm, GFP_KERNEL);
1939946cc463STadeusz Struk 	if (!req)
1940df27b26fSHerbert Xu 		goto free_xbuf;
1941946cc463STadeusz Struk 
1942946cc463STadeusz Struk 	init_completion(&result.completion);
194322287b0bSTadeusz Struk 
194422287b0bSTadeusz Struk 	if (vecs->public_key_vec)
194522287b0bSTadeusz Struk 		err = crypto_akcipher_set_pub_key(tfm, vecs->key,
194622287b0bSTadeusz Struk 						  vecs->key_len);
194722287b0bSTadeusz Struk 	else
194822287b0bSTadeusz Struk 		err = crypto_akcipher_set_priv_key(tfm, vecs->key,
194922287b0bSTadeusz Struk 						   vecs->key_len);
1950946cc463STadeusz Struk 	if (err)
1951946cc463STadeusz Struk 		goto free_req;
1952946cc463STadeusz Struk 
195357763f5eSSalvatore Benedetto 	err = -ENOMEM;
195422287b0bSTadeusz Struk 	out_len_max = crypto_akcipher_maxsize(tfm);
1955946cc463STadeusz Struk 	outbuf_enc = kzalloc(out_len_max, GFP_KERNEL);
1956946cc463STadeusz Struk 	if (!outbuf_enc)
1957946cc463STadeusz Struk 		goto free_req;
1958946cc463STadeusz Struk 
1959df27b26fSHerbert Xu 	if (WARN_ON(vecs->m_size > PAGE_SIZE))
1960df27b26fSHerbert Xu 		goto free_all;
1961df27b26fSHerbert Xu 
1962df27b26fSHerbert Xu 	memcpy(xbuf[0], vecs->m, vecs->m_size);
1963df27b26fSHerbert Xu 
196422287b0bSTadeusz Struk 	sg_init_table(src_tab, 2);
1965df27b26fSHerbert Xu 	sg_set_buf(&src_tab[0], xbuf[0], 8);
1966df27b26fSHerbert Xu 	sg_set_buf(&src_tab[1], xbuf[0] + 8, vecs->m_size - 8);
196722287b0bSTadeusz Struk 	sg_init_one(&dst, outbuf_enc, out_len_max);
196822287b0bSTadeusz Struk 	akcipher_request_set_crypt(req, src_tab, &dst, vecs->m_size,
196922287b0bSTadeusz Struk 				   out_len_max);
1970946cc463STadeusz Struk 	akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1971946cc463STadeusz Struk 				      tcrypt_complete, &result);
1972946cc463STadeusz Struk 
1973946cc463STadeusz Struk 	/* Run RSA encrypt - c = m^e mod n;*/
1974946cc463STadeusz Struk 	err = wait_async_op(&result, crypto_akcipher_encrypt(req));
1975946cc463STadeusz Struk 	if (err) {
197650d2b643SHerbert Xu 		pr_err("alg: akcipher: encrypt test failed. err %d\n", err);
1977946cc463STadeusz Struk 		goto free_all;
1978946cc463STadeusz Struk 	}
197922287b0bSTadeusz Struk 	if (req->dst_len != vecs->c_size) {
198050d2b643SHerbert Xu 		pr_err("alg: akcipher: encrypt test failed. Invalid output len\n");
1981946cc463STadeusz Struk 		err = -EINVAL;
1982946cc463STadeusz Struk 		goto free_all;
1983946cc463STadeusz Struk 	}
1984946cc463STadeusz Struk 	/* verify that encrypted message is equal to expected */
1985df27b26fSHerbert Xu 	if (memcmp(vecs->c, outbuf_enc, vecs->c_size)) {
198650d2b643SHerbert Xu 		pr_err("alg: akcipher: encrypt test failed. Invalid output\n");
198750d2b643SHerbert Xu 		hexdump(outbuf_enc, vecs->c_size);
1988946cc463STadeusz Struk 		err = -EINVAL;
1989946cc463STadeusz Struk 		goto free_all;
1990946cc463STadeusz Struk 	}
1991946cc463STadeusz Struk 	/* Don't invoke decrypt for vectors with public key */
1992946cc463STadeusz Struk 	if (vecs->public_key_vec) {
1993946cc463STadeusz Struk 		err = 0;
1994946cc463STadeusz Struk 		goto free_all;
1995946cc463STadeusz Struk 	}
1996946cc463STadeusz Struk 	outbuf_dec = kzalloc(out_len_max, GFP_KERNEL);
1997946cc463STadeusz Struk 	if (!outbuf_dec) {
1998946cc463STadeusz Struk 		err = -ENOMEM;
1999946cc463STadeusz Struk 		goto free_all;
2000946cc463STadeusz Struk 	}
2001df27b26fSHerbert Xu 
2002df27b26fSHerbert Xu 	if (WARN_ON(vecs->c_size > PAGE_SIZE))
2003df27b26fSHerbert Xu 		goto free_all;
2004df27b26fSHerbert Xu 
2005df27b26fSHerbert Xu 	memcpy(xbuf[0], vecs->c, vecs->c_size);
2006df27b26fSHerbert Xu 
2007df27b26fSHerbert Xu 	sg_init_one(&src, xbuf[0], vecs->c_size);
200822287b0bSTadeusz Struk 	sg_init_one(&dst, outbuf_dec, out_len_max);
2009946cc463STadeusz Struk 	init_completion(&result.completion);
201022287b0bSTadeusz Struk 	akcipher_request_set_crypt(req, &src, &dst, vecs->c_size, out_len_max);
2011946cc463STadeusz Struk 
2012946cc463STadeusz Struk 	/* Run RSA decrypt - m = c^d mod n;*/
2013946cc463STadeusz Struk 	err = wait_async_op(&result, crypto_akcipher_decrypt(req));
2014946cc463STadeusz Struk 	if (err) {
201550d2b643SHerbert Xu 		pr_err("alg: akcipher: decrypt test failed. err %d\n", err);
2016946cc463STadeusz Struk 		goto free_all;
2017946cc463STadeusz Struk 	}
2018946cc463STadeusz Struk 	out_len = req->dst_len;
201950d2b643SHerbert Xu 	if (out_len < vecs->m_size) {
202050d2b643SHerbert Xu 		pr_err("alg: akcipher: decrypt test failed. "
202150d2b643SHerbert Xu 		       "Invalid output len %u\n", out_len);
2022946cc463STadeusz Struk 		err = -EINVAL;
2023946cc463STadeusz Struk 		goto free_all;
2024946cc463STadeusz Struk 	}
2025946cc463STadeusz Struk 	/* verify that decrypted message is equal to the original msg */
202650d2b643SHerbert Xu 	if (memchr_inv(outbuf_dec, 0, out_len - vecs->m_size) ||
202750d2b643SHerbert Xu 	    memcmp(vecs->m, outbuf_dec + out_len - vecs->m_size,
202850d2b643SHerbert Xu 		   vecs->m_size)) {
202950d2b643SHerbert Xu 		pr_err("alg: akcipher: decrypt test failed. Invalid output\n");
203050d2b643SHerbert Xu 		hexdump(outbuf_dec, out_len);
2031946cc463STadeusz Struk 		err = -EINVAL;
2032946cc463STadeusz Struk 	}
2033946cc463STadeusz Struk free_all:
2034946cc463STadeusz Struk 	kfree(outbuf_dec);
2035946cc463STadeusz Struk 	kfree(outbuf_enc);
2036946cc463STadeusz Struk free_req:
2037946cc463STadeusz Struk 	akcipher_request_free(req);
2038df27b26fSHerbert Xu free_xbuf:
2039df27b26fSHerbert Xu 	testmgr_free_buf(xbuf);
2040946cc463STadeusz Struk 	return err;
2041946cc463STadeusz Struk }
2042946cc463STadeusz Struk 
204350d2b643SHerbert Xu static int test_akcipher(struct crypto_akcipher *tfm, const char *alg,
204450d2b643SHerbert Xu 			 struct akcipher_testvec *vecs, unsigned int tcount)
2045946cc463STadeusz Struk {
204615226e48SHerbert Xu 	const char *algo =
204715226e48SHerbert Xu 		crypto_tfm_alg_driver_name(crypto_akcipher_tfm(tfm));
2048946cc463STadeusz Struk 	int ret, i;
2049946cc463STadeusz Struk 
2050946cc463STadeusz Struk 	for (i = 0; i < tcount; i++) {
205150d2b643SHerbert Xu 		ret = test_akcipher_one(tfm, vecs++);
205250d2b643SHerbert Xu 		if (!ret)
205350d2b643SHerbert Xu 			continue;
205450d2b643SHerbert Xu 
205515226e48SHerbert Xu 		pr_err("alg: akcipher: test %d failed for %s, err=%d\n",
205615226e48SHerbert Xu 		       i + 1, algo, ret);
2057946cc463STadeusz Struk 		return ret;
2058946cc463STadeusz Struk 	}
2059946cc463STadeusz Struk 	return 0;
2060946cc463STadeusz Struk }
2061946cc463STadeusz Struk 
2062946cc463STadeusz Struk static int alg_test_akcipher(const struct alg_test_desc *desc,
2063946cc463STadeusz Struk 			     const char *driver, u32 type, u32 mask)
2064946cc463STadeusz Struk {
2065946cc463STadeusz Struk 	struct crypto_akcipher *tfm;
2066946cc463STadeusz Struk 	int err = 0;
2067946cc463STadeusz Struk 
2068946cc463STadeusz Struk 	tfm = crypto_alloc_akcipher(driver, type | CRYPTO_ALG_INTERNAL, mask);
2069946cc463STadeusz Struk 	if (IS_ERR(tfm)) {
2070946cc463STadeusz Struk 		pr_err("alg: akcipher: Failed to load tfm for %s: %ld\n",
2071946cc463STadeusz Struk 		       driver, PTR_ERR(tfm));
2072946cc463STadeusz Struk 		return PTR_ERR(tfm);
2073946cc463STadeusz Struk 	}
2074946cc463STadeusz Struk 	if (desc->suite.akcipher.vecs)
2075946cc463STadeusz Struk 		err = test_akcipher(tfm, desc->alg, desc->suite.akcipher.vecs,
2076946cc463STadeusz Struk 				    desc->suite.akcipher.count);
2077946cc463STadeusz Struk 
2078946cc463STadeusz Struk 	crypto_free_akcipher(tfm);
2079946cc463STadeusz Struk 	return err;
2080946cc463STadeusz Struk }
2081946cc463STadeusz Struk 
2082863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc,
2083863b557aSYouquan, Song 			     const char *driver, u32 type, u32 mask)
2084863b557aSYouquan, Song {
2085863b557aSYouquan, Song 	return 0;
2086863b557aSYouquan, Song }
2087863b557aSYouquan, Song 
2088da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */
2089da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = {
2090da7f033dSHerbert Xu 	{
20914d6d6a2cSJohannes Goetzfried 		.alg = "__cbc-cast5-avx",
20924d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
20934d6d6a2cSJohannes Goetzfried 	}, {
20944ea1277dSJohannes Goetzfried 		.alg = "__cbc-cast6-avx",
20954ea1277dSJohannes Goetzfried 		.test = alg_test_null,
20964ea1277dSJohannes Goetzfried 	}, {
20977efe4076SJohannes Goetzfried 		.alg = "__cbc-serpent-avx",
20987efe4076SJohannes Goetzfried 		.test = alg_test_null,
20997efe4076SJohannes Goetzfried 	}, {
210056d76c96SJussi Kivilinna 		.alg = "__cbc-serpent-avx2",
210156d76c96SJussi Kivilinna 		.test = alg_test_null,
210256d76c96SJussi Kivilinna 	}, {
2103937c30d7SJussi Kivilinna 		.alg = "__cbc-serpent-sse2",
2104937c30d7SJussi Kivilinna 		.test = alg_test_null,
2105937c30d7SJussi Kivilinna 	}, {
2106107778b5SJohannes Goetzfried 		.alg = "__cbc-twofish-avx",
2107107778b5SJohannes Goetzfried 		.test = alg_test_null,
2108107778b5SJohannes Goetzfried 	}, {
2109863b557aSYouquan, Song 		.alg = "__driver-cbc-aes-aesni",
2110863b557aSYouquan, Song 		.test = alg_test_null,
21116c79294fSMilan Broz 		.fips_allowed = 1,
2112863b557aSYouquan, Song 	}, {
2113d9b1d2e7SJussi Kivilinna 		.alg = "__driver-cbc-camellia-aesni",
2114d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2115d9b1d2e7SJussi Kivilinna 	}, {
2116f3f935a7SJussi Kivilinna 		.alg = "__driver-cbc-camellia-aesni-avx2",
2117f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2118f3f935a7SJussi Kivilinna 	}, {
21194d6d6a2cSJohannes Goetzfried 		.alg = "__driver-cbc-cast5-avx",
21204d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
21214d6d6a2cSJohannes Goetzfried 	}, {
21224ea1277dSJohannes Goetzfried 		.alg = "__driver-cbc-cast6-avx",
21234ea1277dSJohannes Goetzfried 		.test = alg_test_null,
21244ea1277dSJohannes Goetzfried 	}, {
21257efe4076SJohannes Goetzfried 		.alg = "__driver-cbc-serpent-avx",
21267efe4076SJohannes Goetzfried 		.test = alg_test_null,
21277efe4076SJohannes Goetzfried 	}, {
212856d76c96SJussi Kivilinna 		.alg = "__driver-cbc-serpent-avx2",
212956d76c96SJussi Kivilinna 		.test = alg_test_null,
213056d76c96SJussi Kivilinna 	}, {
2131937c30d7SJussi Kivilinna 		.alg = "__driver-cbc-serpent-sse2",
2132937c30d7SJussi Kivilinna 		.test = alg_test_null,
2133937c30d7SJussi Kivilinna 	}, {
2134107778b5SJohannes Goetzfried 		.alg = "__driver-cbc-twofish-avx",
2135107778b5SJohannes Goetzfried 		.test = alg_test_null,
2136107778b5SJohannes Goetzfried 	}, {
2137863b557aSYouquan, Song 		.alg = "__driver-ecb-aes-aesni",
2138863b557aSYouquan, Song 		.test = alg_test_null,
21396c79294fSMilan Broz 		.fips_allowed = 1,
2140863b557aSYouquan, Song 	}, {
2141d9b1d2e7SJussi Kivilinna 		.alg = "__driver-ecb-camellia-aesni",
2142d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2143d9b1d2e7SJussi Kivilinna 	}, {
2144f3f935a7SJussi Kivilinna 		.alg = "__driver-ecb-camellia-aesni-avx2",
2145f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2146f3f935a7SJussi Kivilinna 	}, {
21474d6d6a2cSJohannes Goetzfried 		.alg = "__driver-ecb-cast5-avx",
21484d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
21494d6d6a2cSJohannes Goetzfried 	}, {
21504ea1277dSJohannes Goetzfried 		.alg = "__driver-ecb-cast6-avx",
21514ea1277dSJohannes Goetzfried 		.test = alg_test_null,
21524ea1277dSJohannes Goetzfried 	}, {
21537efe4076SJohannes Goetzfried 		.alg = "__driver-ecb-serpent-avx",
21547efe4076SJohannes Goetzfried 		.test = alg_test_null,
21557efe4076SJohannes Goetzfried 	}, {
215656d76c96SJussi Kivilinna 		.alg = "__driver-ecb-serpent-avx2",
215756d76c96SJussi Kivilinna 		.test = alg_test_null,
215856d76c96SJussi Kivilinna 	}, {
2159937c30d7SJussi Kivilinna 		.alg = "__driver-ecb-serpent-sse2",
2160937c30d7SJussi Kivilinna 		.test = alg_test_null,
2161937c30d7SJussi Kivilinna 	}, {
2162107778b5SJohannes Goetzfried 		.alg = "__driver-ecb-twofish-avx",
2163107778b5SJohannes Goetzfried 		.test = alg_test_null,
2164107778b5SJohannes Goetzfried 	}, {
21659d77b6c2STadeusz Struk 		.alg = "__driver-gcm-aes-aesni",
21669d77b6c2STadeusz Struk 		.test = alg_test_null,
21679d77b6c2STadeusz Struk 		.fips_allowed = 1,
21689d77b6c2STadeusz Struk 	}, {
2169863b557aSYouquan, Song 		.alg = "__ghash-pclmulqdqni",
2170863b557aSYouquan, Song 		.test = alg_test_null,
21716c79294fSMilan Broz 		.fips_allowed = 1,
2172863b557aSYouquan, Song 	}, {
2173e08ca2daSJarod Wilson 		.alg = "ansi_cprng",
2174e08ca2daSJarod Wilson 		.test = alg_test_cprng,
2175e08ca2daSJarod Wilson 		.suite = {
2176e08ca2daSJarod Wilson 			.cprng = {
2177e08ca2daSJarod Wilson 				.vecs = ansi_cprng_aes_tv_template,
2178e08ca2daSJarod Wilson 				.count = ANSI_CPRNG_AES_TEST_VECTORS
2179e08ca2daSJarod Wilson 			}
2180e08ca2daSJarod Wilson 		}
2181e08ca2daSJarod Wilson 	}, {
2182bca4feb0SHoria Geanta 		.alg = "authenc(hmac(md5),ecb(cipher_null))",
2183bca4feb0SHoria Geanta 		.test = alg_test_aead,
2184bca4feb0SHoria Geanta 		.suite = {
2185bca4feb0SHoria Geanta 			.aead = {
2186bca4feb0SHoria Geanta 				.enc = {
2187bca4feb0SHoria Geanta 					.vecs = hmac_md5_ecb_cipher_null_enc_tv_template,
2188bca4feb0SHoria Geanta 					.count = HMAC_MD5_ECB_CIPHER_NULL_ENC_TEST_VECTORS
2189bca4feb0SHoria Geanta 				},
2190bca4feb0SHoria Geanta 				.dec = {
2191bca4feb0SHoria Geanta 					.vecs = hmac_md5_ecb_cipher_null_dec_tv_template,
2192bca4feb0SHoria Geanta 					.count = HMAC_MD5_ECB_CIPHER_NULL_DEC_TEST_VECTORS
2193bca4feb0SHoria Geanta 				}
2194bca4feb0SHoria Geanta 			}
2195bca4feb0SHoria Geanta 		}
2196bca4feb0SHoria Geanta 	}, {
2197a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha1),cbc(aes))",
2198e46e9a46SHoria Geanta 		.test = alg_test_aead,
2199e46e9a46SHoria Geanta 		.suite = {
2200e46e9a46SHoria Geanta 			.aead = {
2201e46e9a46SHoria Geanta 				.enc = {
22025208ed2cSNitesh Lal 					.vecs =
22035208ed2cSNitesh Lal 					hmac_sha1_aes_cbc_enc_tv_temp,
22045208ed2cSNitesh Lal 					.count =
22055208ed2cSNitesh Lal 					HMAC_SHA1_AES_CBC_ENC_TEST_VEC
22065208ed2cSNitesh Lal 				}
22075208ed2cSNitesh Lal 			}
22085208ed2cSNitesh Lal 		}
22095208ed2cSNitesh Lal 	}, {
2210a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha1),cbc(des))",
22115208ed2cSNitesh Lal 		.test = alg_test_aead,
22125208ed2cSNitesh Lal 		.suite = {
22135208ed2cSNitesh Lal 			.aead = {
22145208ed2cSNitesh Lal 				.enc = {
22155208ed2cSNitesh Lal 					.vecs =
22165208ed2cSNitesh Lal 					hmac_sha1_des_cbc_enc_tv_temp,
22175208ed2cSNitesh Lal 					.count =
22185208ed2cSNitesh Lal 					HMAC_SHA1_DES_CBC_ENC_TEST_VEC
22195208ed2cSNitesh Lal 				}
22205208ed2cSNitesh Lal 			}
22215208ed2cSNitesh Lal 		}
22225208ed2cSNitesh Lal 	}, {
2223a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha1),cbc(des3_ede))",
22245208ed2cSNitesh Lal 		.test = alg_test_aead,
2225ed1afac9SMarcus Meissner 		.fips_allowed = 1,
22265208ed2cSNitesh Lal 		.suite = {
22275208ed2cSNitesh Lal 			.aead = {
22285208ed2cSNitesh Lal 				.enc = {
22295208ed2cSNitesh Lal 					.vecs =
22305208ed2cSNitesh Lal 					hmac_sha1_des3_ede_cbc_enc_tv_temp,
22315208ed2cSNitesh Lal 					.count =
22325208ed2cSNitesh Lal 					HMAC_SHA1_DES3_EDE_CBC_ENC_TEST_VEC
2233e46e9a46SHoria Geanta 				}
2234e46e9a46SHoria Geanta 			}
2235e46e9a46SHoria Geanta 		}
2236e46e9a46SHoria Geanta 	}, {
2237fb16abc2SMarcus Meissner 		.alg = "authenc(hmac(sha1),ctr(aes))",
2238fb16abc2SMarcus Meissner 		.test = alg_test_null,
2239fb16abc2SMarcus Meissner 		.fips_allowed = 1,
2240fb16abc2SMarcus Meissner 	}, {
2241bca4feb0SHoria Geanta 		.alg = "authenc(hmac(sha1),ecb(cipher_null))",
2242bca4feb0SHoria Geanta 		.test = alg_test_aead,
2243bca4feb0SHoria Geanta 		.suite = {
2244bca4feb0SHoria Geanta 			.aead = {
2245bca4feb0SHoria Geanta 				.enc = {
22465208ed2cSNitesh Lal 					.vecs =
22475208ed2cSNitesh Lal 					hmac_sha1_ecb_cipher_null_enc_tv_temp,
22485208ed2cSNitesh Lal 					.count =
22495208ed2cSNitesh Lal 					HMAC_SHA1_ECB_CIPHER_NULL_ENC_TEST_VEC
2250bca4feb0SHoria Geanta 				},
2251bca4feb0SHoria Geanta 				.dec = {
22525208ed2cSNitesh Lal 					.vecs =
22535208ed2cSNitesh Lal 					hmac_sha1_ecb_cipher_null_dec_tv_temp,
22545208ed2cSNitesh Lal 					.count =
22555208ed2cSNitesh Lal 					HMAC_SHA1_ECB_CIPHER_NULL_DEC_TEST_VEC
22565208ed2cSNitesh Lal 				}
22575208ed2cSNitesh Lal 			}
22585208ed2cSNitesh Lal 		}
22595208ed2cSNitesh Lal 	}, {
22608888690eSMarcus Meissner 		.alg = "authenc(hmac(sha1),rfc3686(ctr(aes)))",
22618888690eSMarcus Meissner 		.test = alg_test_null,
22628888690eSMarcus Meissner 		.fips_allowed = 1,
22638888690eSMarcus Meissner 	}, {
2264a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha224),cbc(des))",
22655208ed2cSNitesh Lal 		.test = alg_test_aead,
22665208ed2cSNitesh Lal 		.suite = {
22675208ed2cSNitesh Lal 			.aead = {
22685208ed2cSNitesh Lal 				.enc = {
22695208ed2cSNitesh Lal 					.vecs =
22705208ed2cSNitesh Lal 					hmac_sha224_des_cbc_enc_tv_temp,
22715208ed2cSNitesh Lal 					.count =
22725208ed2cSNitesh Lal 					HMAC_SHA224_DES_CBC_ENC_TEST_VEC
22735208ed2cSNitesh Lal 				}
22745208ed2cSNitesh Lal 			}
22755208ed2cSNitesh Lal 		}
22765208ed2cSNitesh Lal 	}, {
2277a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha224),cbc(des3_ede))",
22785208ed2cSNitesh Lal 		.test = alg_test_aead,
2279ed1afac9SMarcus Meissner 		.fips_allowed = 1,
22805208ed2cSNitesh Lal 		.suite = {
22815208ed2cSNitesh Lal 			.aead = {
22825208ed2cSNitesh Lal 				.enc = {
22835208ed2cSNitesh Lal 					.vecs =
22845208ed2cSNitesh Lal 					hmac_sha224_des3_ede_cbc_enc_tv_temp,
22855208ed2cSNitesh Lal 					.count =
22865208ed2cSNitesh Lal 					HMAC_SHA224_DES3_EDE_CBC_ENC_TEST_VEC
2287bca4feb0SHoria Geanta 				}
2288bca4feb0SHoria Geanta 			}
2289bca4feb0SHoria Geanta 		}
2290bca4feb0SHoria Geanta 	}, {
2291a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha256),cbc(aes))",
2292e46e9a46SHoria Geanta 		.test = alg_test_aead,
2293ed1afac9SMarcus Meissner 		.fips_allowed = 1,
2294e46e9a46SHoria Geanta 		.suite = {
2295e46e9a46SHoria Geanta 			.aead = {
2296e46e9a46SHoria Geanta 				.enc = {
22975208ed2cSNitesh Lal 					.vecs =
22985208ed2cSNitesh Lal 					hmac_sha256_aes_cbc_enc_tv_temp,
22995208ed2cSNitesh Lal 					.count =
23005208ed2cSNitesh Lal 					HMAC_SHA256_AES_CBC_ENC_TEST_VEC
23015208ed2cSNitesh Lal 				}
23025208ed2cSNitesh Lal 			}
23035208ed2cSNitesh Lal 		}
23045208ed2cSNitesh Lal 	}, {
2305a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha256),cbc(des))",
23065208ed2cSNitesh Lal 		.test = alg_test_aead,
23075208ed2cSNitesh Lal 		.suite = {
23085208ed2cSNitesh Lal 			.aead = {
23095208ed2cSNitesh Lal 				.enc = {
23105208ed2cSNitesh Lal 					.vecs =
23115208ed2cSNitesh Lal 					hmac_sha256_des_cbc_enc_tv_temp,
23125208ed2cSNitesh Lal 					.count =
23135208ed2cSNitesh Lal 					HMAC_SHA256_DES_CBC_ENC_TEST_VEC
23145208ed2cSNitesh Lal 				}
23155208ed2cSNitesh Lal 			}
23165208ed2cSNitesh Lal 		}
23175208ed2cSNitesh Lal 	}, {
2318a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha256),cbc(des3_ede))",
23195208ed2cSNitesh Lal 		.test = alg_test_aead,
2320ed1afac9SMarcus Meissner 		.fips_allowed = 1,
23215208ed2cSNitesh Lal 		.suite = {
23225208ed2cSNitesh Lal 			.aead = {
23235208ed2cSNitesh Lal 				.enc = {
23245208ed2cSNitesh Lal 					.vecs =
23255208ed2cSNitesh Lal 					hmac_sha256_des3_ede_cbc_enc_tv_temp,
23265208ed2cSNitesh Lal 					.count =
23275208ed2cSNitesh Lal 					HMAC_SHA256_DES3_EDE_CBC_ENC_TEST_VEC
23285208ed2cSNitesh Lal 				}
23295208ed2cSNitesh Lal 			}
23305208ed2cSNitesh Lal 		}
23315208ed2cSNitesh Lal 	}, {
2332fb16abc2SMarcus Meissner 		.alg = "authenc(hmac(sha256),ctr(aes))",
2333fb16abc2SMarcus Meissner 		.test = alg_test_null,
2334fb16abc2SMarcus Meissner 		.fips_allowed = 1,
2335fb16abc2SMarcus Meissner 	}, {
23368888690eSMarcus Meissner 		.alg = "authenc(hmac(sha256),rfc3686(ctr(aes)))",
23378888690eSMarcus Meissner 		.test = alg_test_null,
23388888690eSMarcus Meissner 		.fips_allowed = 1,
23398888690eSMarcus Meissner 	}, {
2340a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha384),cbc(des))",
23415208ed2cSNitesh Lal 		.test = alg_test_aead,
23425208ed2cSNitesh Lal 		.suite = {
23435208ed2cSNitesh Lal 			.aead = {
23445208ed2cSNitesh Lal 				.enc = {
23455208ed2cSNitesh Lal 					.vecs =
23465208ed2cSNitesh Lal 					hmac_sha384_des_cbc_enc_tv_temp,
23475208ed2cSNitesh Lal 					.count =
23485208ed2cSNitesh Lal 					HMAC_SHA384_DES_CBC_ENC_TEST_VEC
23495208ed2cSNitesh Lal 				}
23505208ed2cSNitesh Lal 			}
23515208ed2cSNitesh Lal 		}
23525208ed2cSNitesh Lal 	}, {
2353a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha384),cbc(des3_ede))",
23545208ed2cSNitesh Lal 		.test = alg_test_aead,
2355ed1afac9SMarcus Meissner 		.fips_allowed = 1,
23565208ed2cSNitesh Lal 		.suite = {
23575208ed2cSNitesh Lal 			.aead = {
23585208ed2cSNitesh Lal 				.enc = {
23595208ed2cSNitesh Lal 					.vecs =
23605208ed2cSNitesh Lal 					hmac_sha384_des3_ede_cbc_enc_tv_temp,
23615208ed2cSNitesh Lal 					.count =
23625208ed2cSNitesh Lal 					HMAC_SHA384_DES3_EDE_CBC_ENC_TEST_VEC
2363e46e9a46SHoria Geanta 				}
2364e46e9a46SHoria Geanta 			}
2365e46e9a46SHoria Geanta 		}
2366e46e9a46SHoria Geanta 	}, {
2367fb16abc2SMarcus Meissner 		.alg = "authenc(hmac(sha384),ctr(aes))",
2368fb16abc2SMarcus Meissner 		.test = alg_test_null,
2369fb16abc2SMarcus Meissner 		.fips_allowed = 1,
2370fb16abc2SMarcus Meissner 	}, {
23718888690eSMarcus Meissner 		.alg = "authenc(hmac(sha384),rfc3686(ctr(aes)))",
23728888690eSMarcus Meissner 		.test = alg_test_null,
23738888690eSMarcus Meissner 		.fips_allowed = 1,
23748888690eSMarcus Meissner 	}, {
2375a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha512),cbc(aes))",
2376ed1afac9SMarcus Meissner 		.fips_allowed = 1,
2377e46e9a46SHoria Geanta 		.test = alg_test_aead,
2378e46e9a46SHoria Geanta 		.suite = {
2379e46e9a46SHoria Geanta 			.aead = {
2380e46e9a46SHoria Geanta 				.enc = {
23815208ed2cSNitesh Lal 					.vecs =
23825208ed2cSNitesh Lal 					hmac_sha512_aes_cbc_enc_tv_temp,
23835208ed2cSNitesh Lal 					.count =
23845208ed2cSNitesh Lal 					HMAC_SHA512_AES_CBC_ENC_TEST_VEC
23855208ed2cSNitesh Lal 				}
23865208ed2cSNitesh Lal 			}
23875208ed2cSNitesh Lal 		}
23885208ed2cSNitesh Lal 	}, {
2389a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha512),cbc(des))",
23905208ed2cSNitesh Lal 		.test = alg_test_aead,
23915208ed2cSNitesh Lal 		.suite = {
23925208ed2cSNitesh Lal 			.aead = {
23935208ed2cSNitesh Lal 				.enc = {
23945208ed2cSNitesh Lal 					.vecs =
23955208ed2cSNitesh Lal 					hmac_sha512_des_cbc_enc_tv_temp,
23965208ed2cSNitesh Lal 					.count =
23975208ed2cSNitesh Lal 					HMAC_SHA512_DES_CBC_ENC_TEST_VEC
23985208ed2cSNitesh Lal 				}
23995208ed2cSNitesh Lal 			}
24005208ed2cSNitesh Lal 		}
24015208ed2cSNitesh Lal 	}, {
2402a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha512),cbc(des3_ede))",
24035208ed2cSNitesh Lal 		.test = alg_test_aead,
2404ed1afac9SMarcus Meissner 		.fips_allowed = 1,
24055208ed2cSNitesh Lal 		.suite = {
24065208ed2cSNitesh Lal 			.aead = {
24075208ed2cSNitesh Lal 				.enc = {
24085208ed2cSNitesh Lal 					.vecs =
24095208ed2cSNitesh Lal 					hmac_sha512_des3_ede_cbc_enc_tv_temp,
24105208ed2cSNitesh Lal 					.count =
24115208ed2cSNitesh Lal 					HMAC_SHA512_DES3_EDE_CBC_ENC_TEST_VEC
2412e46e9a46SHoria Geanta 				}
2413e46e9a46SHoria Geanta 			}
2414e46e9a46SHoria Geanta 		}
2415e46e9a46SHoria Geanta 	}, {
2416fb16abc2SMarcus Meissner 		.alg = "authenc(hmac(sha512),ctr(aes))",
2417fb16abc2SMarcus Meissner 		.test = alg_test_null,
2418fb16abc2SMarcus Meissner 		.fips_allowed = 1,
2419fb16abc2SMarcus Meissner 	}, {
24208888690eSMarcus Meissner 		.alg = "authenc(hmac(sha512),rfc3686(ctr(aes)))",
24218888690eSMarcus Meissner 		.test = alg_test_null,
24228888690eSMarcus Meissner 		.fips_allowed = 1,
24238888690eSMarcus Meissner 	}, {
2424da7f033dSHerbert Xu 		.alg = "cbc(aes)",
24251aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2426a1915d51SJarod Wilson 		.fips_allowed = 1,
2427da7f033dSHerbert Xu 		.suite = {
2428da7f033dSHerbert Xu 			.cipher = {
2429da7f033dSHerbert Xu 				.enc = {
2430da7f033dSHerbert Xu 					.vecs = aes_cbc_enc_tv_template,
2431da7f033dSHerbert Xu 					.count = AES_CBC_ENC_TEST_VECTORS
2432da7f033dSHerbert Xu 				},
2433da7f033dSHerbert Xu 				.dec = {
2434da7f033dSHerbert Xu 					.vecs = aes_cbc_dec_tv_template,
2435da7f033dSHerbert Xu 					.count = AES_CBC_DEC_TEST_VECTORS
2436da7f033dSHerbert Xu 				}
2437da7f033dSHerbert Xu 			}
2438da7f033dSHerbert Xu 		}
2439da7f033dSHerbert Xu 	}, {
2440da7f033dSHerbert Xu 		.alg = "cbc(anubis)",
24411aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2442da7f033dSHerbert Xu 		.suite = {
2443da7f033dSHerbert Xu 			.cipher = {
2444da7f033dSHerbert Xu 				.enc = {
2445da7f033dSHerbert Xu 					.vecs = anubis_cbc_enc_tv_template,
2446da7f033dSHerbert Xu 					.count = ANUBIS_CBC_ENC_TEST_VECTORS
2447da7f033dSHerbert Xu 				},
2448da7f033dSHerbert Xu 				.dec = {
2449da7f033dSHerbert Xu 					.vecs = anubis_cbc_dec_tv_template,
2450da7f033dSHerbert Xu 					.count = ANUBIS_CBC_DEC_TEST_VECTORS
2451da7f033dSHerbert Xu 				}
2452da7f033dSHerbert Xu 			}
2453da7f033dSHerbert Xu 		}
2454da7f033dSHerbert Xu 	}, {
2455da7f033dSHerbert Xu 		.alg = "cbc(blowfish)",
24561aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2457da7f033dSHerbert Xu 		.suite = {
2458da7f033dSHerbert Xu 			.cipher = {
2459da7f033dSHerbert Xu 				.enc = {
2460da7f033dSHerbert Xu 					.vecs = bf_cbc_enc_tv_template,
2461da7f033dSHerbert Xu 					.count = BF_CBC_ENC_TEST_VECTORS
2462da7f033dSHerbert Xu 				},
2463da7f033dSHerbert Xu 				.dec = {
2464da7f033dSHerbert Xu 					.vecs = bf_cbc_dec_tv_template,
2465da7f033dSHerbert Xu 					.count = BF_CBC_DEC_TEST_VECTORS
2466da7f033dSHerbert Xu 				}
2467da7f033dSHerbert Xu 			}
2468da7f033dSHerbert Xu 		}
2469da7f033dSHerbert Xu 	}, {
2470da7f033dSHerbert Xu 		.alg = "cbc(camellia)",
24711aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2472da7f033dSHerbert Xu 		.suite = {
2473da7f033dSHerbert Xu 			.cipher = {
2474da7f033dSHerbert Xu 				.enc = {
2475da7f033dSHerbert Xu 					.vecs = camellia_cbc_enc_tv_template,
2476da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_ENC_TEST_VECTORS
2477da7f033dSHerbert Xu 				},
2478da7f033dSHerbert Xu 				.dec = {
2479da7f033dSHerbert Xu 					.vecs = camellia_cbc_dec_tv_template,
2480da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_DEC_TEST_VECTORS
2481da7f033dSHerbert Xu 				}
2482da7f033dSHerbert Xu 			}
2483da7f033dSHerbert Xu 		}
2484da7f033dSHerbert Xu 	}, {
2485a2c58260SJohannes Goetzfried 		.alg = "cbc(cast5)",
2486a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2487a2c58260SJohannes Goetzfried 		.suite = {
2488a2c58260SJohannes Goetzfried 			.cipher = {
2489a2c58260SJohannes Goetzfried 				.enc = {
2490a2c58260SJohannes Goetzfried 					.vecs = cast5_cbc_enc_tv_template,
2491a2c58260SJohannes Goetzfried 					.count = CAST5_CBC_ENC_TEST_VECTORS
2492a2c58260SJohannes Goetzfried 				},
2493a2c58260SJohannes Goetzfried 				.dec = {
2494a2c58260SJohannes Goetzfried 					.vecs = cast5_cbc_dec_tv_template,
2495a2c58260SJohannes Goetzfried 					.count = CAST5_CBC_DEC_TEST_VECTORS
2496a2c58260SJohannes Goetzfried 				}
2497a2c58260SJohannes Goetzfried 			}
2498a2c58260SJohannes Goetzfried 		}
2499a2c58260SJohannes Goetzfried 	}, {
25009b8b0405SJohannes Goetzfried 		.alg = "cbc(cast6)",
25019b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
25029b8b0405SJohannes Goetzfried 		.suite = {
25039b8b0405SJohannes Goetzfried 			.cipher = {
25049b8b0405SJohannes Goetzfried 				.enc = {
25059b8b0405SJohannes Goetzfried 					.vecs = cast6_cbc_enc_tv_template,
25069b8b0405SJohannes Goetzfried 					.count = CAST6_CBC_ENC_TEST_VECTORS
25079b8b0405SJohannes Goetzfried 				},
25089b8b0405SJohannes Goetzfried 				.dec = {
25099b8b0405SJohannes Goetzfried 					.vecs = cast6_cbc_dec_tv_template,
25109b8b0405SJohannes Goetzfried 					.count = CAST6_CBC_DEC_TEST_VECTORS
25119b8b0405SJohannes Goetzfried 				}
25129b8b0405SJohannes Goetzfried 			}
25139b8b0405SJohannes Goetzfried 		}
25149b8b0405SJohannes Goetzfried 	}, {
2515da7f033dSHerbert Xu 		.alg = "cbc(des)",
25161aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2517da7f033dSHerbert Xu 		.suite = {
2518da7f033dSHerbert Xu 			.cipher = {
2519da7f033dSHerbert Xu 				.enc = {
2520da7f033dSHerbert Xu 					.vecs = des_cbc_enc_tv_template,
2521da7f033dSHerbert Xu 					.count = DES_CBC_ENC_TEST_VECTORS
2522da7f033dSHerbert Xu 				},
2523da7f033dSHerbert Xu 				.dec = {
2524da7f033dSHerbert Xu 					.vecs = des_cbc_dec_tv_template,
2525da7f033dSHerbert Xu 					.count = DES_CBC_DEC_TEST_VECTORS
2526da7f033dSHerbert Xu 				}
2527da7f033dSHerbert Xu 			}
2528da7f033dSHerbert Xu 		}
2529da7f033dSHerbert Xu 	}, {
2530da7f033dSHerbert Xu 		.alg = "cbc(des3_ede)",
25311aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2532a1915d51SJarod Wilson 		.fips_allowed = 1,
2533da7f033dSHerbert Xu 		.suite = {
2534da7f033dSHerbert Xu 			.cipher = {
2535da7f033dSHerbert Xu 				.enc = {
2536da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_enc_tv_template,
2537da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_ENC_TEST_VECTORS
2538da7f033dSHerbert Xu 				},
2539da7f033dSHerbert Xu 				.dec = {
2540da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_dec_tv_template,
2541da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_DEC_TEST_VECTORS
2542da7f033dSHerbert Xu 				}
2543da7f033dSHerbert Xu 			}
2544da7f033dSHerbert Xu 		}
2545da7f033dSHerbert Xu 	}, {
25469d25917dSJussi Kivilinna 		.alg = "cbc(serpent)",
25479d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
25489d25917dSJussi Kivilinna 		.suite = {
25499d25917dSJussi Kivilinna 			.cipher = {
25509d25917dSJussi Kivilinna 				.enc = {
25519d25917dSJussi Kivilinna 					.vecs = serpent_cbc_enc_tv_template,
25529d25917dSJussi Kivilinna 					.count = SERPENT_CBC_ENC_TEST_VECTORS
25539d25917dSJussi Kivilinna 				},
25549d25917dSJussi Kivilinna 				.dec = {
25559d25917dSJussi Kivilinna 					.vecs = serpent_cbc_dec_tv_template,
25569d25917dSJussi Kivilinna 					.count = SERPENT_CBC_DEC_TEST_VECTORS
25579d25917dSJussi Kivilinna 				}
25589d25917dSJussi Kivilinna 			}
25599d25917dSJussi Kivilinna 		}
25609d25917dSJussi Kivilinna 	}, {
2561da7f033dSHerbert Xu 		.alg = "cbc(twofish)",
25621aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2563da7f033dSHerbert Xu 		.suite = {
2564da7f033dSHerbert Xu 			.cipher = {
2565da7f033dSHerbert Xu 				.enc = {
2566da7f033dSHerbert Xu 					.vecs = tf_cbc_enc_tv_template,
2567da7f033dSHerbert Xu 					.count = TF_CBC_ENC_TEST_VECTORS
2568da7f033dSHerbert Xu 				},
2569da7f033dSHerbert Xu 				.dec = {
2570da7f033dSHerbert Xu 					.vecs = tf_cbc_dec_tv_template,
2571da7f033dSHerbert Xu 					.count = TF_CBC_DEC_TEST_VECTORS
2572da7f033dSHerbert Xu 				}
2573da7f033dSHerbert Xu 			}
2574da7f033dSHerbert Xu 		}
2575da7f033dSHerbert Xu 	}, {
2576da7f033dSHerbert Xu 		.alg = "ccm(aes)",
2577da7f033dSHerbert Xu 		.test = alg_test_aead,
2578a1915d51SJarod Wilson 		.fips_allowed = 1,
2579da7f033dSHerbert Xu 		.suite = {
2580da7f033dSHerbert Xu 			.aead = {
2581da7f033dSHerbert Xu 				.enc = {
2582da7f033dSHerbert Xu 					.vecs = aes_ccm_enc_tv_template,
2583da7f033dSHerbert Xu 					.count = AES_CCM_ENC_TEST_VECTORS
2584da7f033dSHerbert Xu 				},
2585da7f033dSHerbert Xu 				.dec = {
2586da7f033dSHerbert Xu 					.vecs = aes_ccm_dec_tv_template,
2587da7f033dSHerbert Xu 					.count = AES_CCM_DEC_TEST_VECTORS
2588da7f033dSHerbert Xu 				}
2589da7f033dSHerbert Xu 			}
2590da7f033dSHerbert Xu 		}
2591da7f033dSHerbert Xu 	}, {
25923590ebf2SMartin Willi 		.alg = "chacha20",
25933590ebf2SMartin Willi 		.test = alg_test_skcipher,
25943590ebf2SMartin Willi 		.suite = {
25953590ebf2SMartin Willi 			.cipher = {
25963590ebf2SMartin Willi 				.enc = {
25973590ebf2SMartin Willi 					.vecs = chacha20_enc_tv_template,
25983590ebf2SMartin Willi 					.count = CHACHA20_ENC_TEST_VECTORS
25993590ebf2SMartin Willi 				},
26003590ebf2SMartin Willi 				.dec = {
26013590ebf2SMartin Willi 					.vecs = chacha20_enc_tv_template,
26023590ebf2SMartin Willi 					.count = CHACHA20_ENC_TEST_VECTORS
26033590ebf2SMartin Willi 				},
26043590ebf2SMartin Willi 			}
26053590ebf2SMartin Willi 		}
26063590ebf2SMartin Willi 	}, {
260793b5e86aSJussi Kivilinna 		.alg = "cmac(aes)",
26088f183751SStephan Mueller 		.fips_allowed = 1,
260993b5e86aSJussi Kivilinna 		.test = alg_test_hash,
261093b5e86aSJussi Kivilinna 		.suite = {
261193b5e86aSJussi Kivilinna 			.hash = {
261293b5e86aSJussi Kivilinna 				.vecs = aes_cmac128_tv_template,
261393b5e86aSJussi Kivilinna 				.count = CMAC_AES_TEST_VECTORS
261493b5e86aSJussi Kivilinna 			}
261593b5e86aSJussi Kivilinna 		}
261693b5e86aSJussi Kivilinna 	}, {
261793b5e86aSJussi Kivilinna 		.alg = "cmac(des3_ede)",
26188f183751SStephan Mueller 		.fips_allowed = 1,
261993b5e86aSJussi Kivilinna 		.test = alg_test_hash,
262093b5e86aSJussi Kivilinna 		.suite = {
262193b5e86aSJussi Kivilinna 			.hash = {
262293b5e86aSJussi Kivilinna 				.vecs = des3_ede_cmac64_tv_template,
262393b5e86aSJussi Kivilinna 				.count = CMAC_DES3_EDE_TEST_VECTORS
262493b5e86aSJussi Kivilinna 			}
262593b5e86aSJussi Kivilinna 		}
262693b5e86aSJussi Kivilinna 	}, {
2627e448370dSJussi Kivilinna 		.alg = "compress_null",
2628e448370dSJussi Kivilinna 		.test = alg_test_null,
2629e448370dSJussi Kivilinna 	}, {
2630ebb3472fSArd Biesheuvel 		.alg = "crc32",
2631ebb3472fSArd Biesheuvel 		.test = alg_test_hash,
2632ebb3472fSArd Biesheuvel 		.suite = {
2633ebb3472fSArd Biesheuvel 			.hash = {
2634ebb3472fSArd Biesheuvel 				.vecs = crc32_tv_template,
2635ebb3472fSArd Biesheuvel 				.count = CRC32_TEST_VECTORS
2636ebb3472fSArd Biesheuvel 			}
2637ebb3472fSArd Biesheuvel 		}
2638ebb3472fSArd Biesheuvel 	}, {
2639da7f033dSHerbert Xu 		.alg = "crc32c",
26408e3ee85eSHerbert Xu 		.test = alg_test_crc32c,
2641a1915d51SJarod Wilson 		.fips_allowed = 1,
2642da7f033dSHerbert Xu 		.suite = {
2643da7f033dSHerbert Xu 			.hash = {
2644da7f033dSHerbert Xu 				.vecs = crc32c_tv_template,
2645da7f033dSHerbert Xu 				.count = CRC32C_TEST_VECTORS
2646da7f033dSHerbert Xu 			}
2647da7f033dSHerbert Xu 		}
2648da7f033dSHerbert Xu 	}, {
264968411521SHerbert Xu 		.alg = "crct10dif",
265068411521SHerbert Xu 		.test = alg_test_hash,
265168411521SHerbert Xu 		.fips_allowed = 1,
265268411521SHerbert Xu 		.suite = {
265368411521SHerbert Xu 			.hash = {
265468411521SHerbert Xu 				.vecs = crct10dif_tv_template,
265568411521SHerbert Xu 				.count = CRCT10DIF_TEST_VECTORS
265668411521SHerbert Xu 			}
265768411521SHerbert Xu 		}
265868411521SHerbert Xu 	}, {
26596c79294fSMilan Broz 		.alg = "cryptd(__driver-cbc-aes-aesni)",
26606c79294fSMilan Broz 		.test = alg_test_null,
26616c79294fSMilan Broz 		.fips_allowed = 1,
26626c79294fSMilan Broz 	}, {
2663d9b1d2e7SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-camellia-aesni)",
2664d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2665d9b1d2e7SJussi Kivilinna 	}, {
2666f3f935a7SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-camellia-aesni-avx2)",
2667f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2668f3f935a7SJussi Kivilinna 	}, {
266956d76c96SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-serpent-avx2)",
267056d76c96SJussi Kivilinna 		.test = alg_test_null,
267156d76c96SJussi Kivilinna 	}, {
2672863b557aSYouquan, Song 		.alg = "cryptd(__driver-ecb-aes-aesni)",
2673863b557aSYouquan, Song 		.test = alg_test_null,
26746c79294fSMilan Broz 		.fips_allowed = 1,
2675863b557aSYouquan, Song 	}, {
2676d9b1d2e7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-camellia-aesni)",
2677d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2678d9b1d2e7SJussi Kivilinna 	}, {
2679f3f935a7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-camellia-aesni-avx2)",
2680f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2681f3f935a7SJussi Kivilinna 	}, {
26824d6d6a2cSJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-cast5-avx)",
26834d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
26844d6d6a2cSJohannes Goetzfried 	}, {
26854ea1277dSJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-cast6-avx)",
26864ea1277dSJohannes Goetzfried 		.test = alg_test_null,
26874ea1277dSJohannes Goetzfried 	}, {
26887efe4076SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-serpent-avx)",
26897efe4076SJohannes Goetzfried 		.test = alg_test_null,
26907efe4076SJohannes Goetzfried 	}, {
269156d76c96SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-serpent-avx2)",
269256d76c96SJussi Kivilinna 		.test = alg_test_null,
269356d76c96SJussi Kivilinna 	}, {
2694937c30d7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-serpent-sse2)",
2695937c30d7SJussi Kivilinna 		.test = alg_test_null,
2696937c30d7SJussi Kivilinna 	}, {
2697107778b5SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-twofish-avx)",
2698107778b5SJohannes Goetzfried 		.test = alg_test_null,
2699107778b5SJohannes Goetzfried 	}, {
27006c79294fSMilan Broz 		.alg = "cryptd(__driver-gcm-aes-aesni)",
27016c79294fSMilan Broz 		.test = alg_test_null,
27026c79294fSMilan Broz 		.fips_allowed = 1,
27036c79294fSMilan Broz 	}, {
2704863b557aSYouquan, Song 		.alg = "cryptd(__ghash-pclmulqdqni)",
2705863b557aSYouquan, Song 		.test = alg_test_null,
27066c79294fSMilan Broz 		.fips_allowed = 1,
2707863b557aSYouquan, Song 	}, {
2708f7cb80f2SJarod Wilson 		.alg = "ctr(aes)",
2709f7cb80f2SJarod Wilson 		.test = alg_test_skcipher,
2710a1915d51SJarod Wilson 		.fips_allowed = 1,
2711f7cb80f2SJarod Wilson 		.suite = {
2712f7cb80f2SJarod Wilson 			.cipher = {
2713f7cb80f2SJarod Wilson 				.enc = {
2714f7cb80f2SJarod Wilson 					.vecs = aes_ctr_enc_tv_template,
2715f7cb80f2SJarod Wilson 					.count = AES_CTR_ENC_TEST_VECTORS
2716f7cb80f2SJarod Wilson 				},
2717f7cb80f2SJarod Wilson 				.dec = {
2718f7cb80f2SJarod Wilson 					.vecs = aes_ctr_dec_tv_template,
2719f7cb80f2SJarod Wilson 					.count = AES_CTR_DEC_TEST_VECTORS
2720f7cb80f2SJarod Wilson 				}
2721f7cb80f2SJarod Wilson 			}
2722f7cb80f2SJarod Wilson 		}
2723f7cb80f2SJarod Wilson 	}, {
272485b63e34SJussi Kivilinna 		.alg = "ctr(blowfish)",
272585b63e34SJussi Kivilinna 		.test = alg_test_skcipher,
272685b63e34SJussi Kivilinna 		.suite = {
272785b63e34SJussi Kivilinna 			.cipher = {
272885b63e34SJussi Kivilinna 				.enc = {
272985b63e34SJussi Kivilinna 					.vecs = bf_ctr_enc_tv_template,
273085b63e34SJussi Kivilinna 					.count = BF_CTR_ENC_TEST_VECTORS
273185b63e34SJussi Kivilinna 				},
273285b63e34SJussi Kivilinna 				.dec = {
273385b63e34SJussi Kivilinna 					.vecs = bf_ctr_dec_tv_template,
273485b63e34SJussi Kivilinna 					.count = BF_CTR_DEC_TEST_VECTORS
273585b63e34SJussi Kivilinna 				}
273685b63e34SJussi Kivilinna 			}
273785b63e34SJussi Kivilinna 		}
273885b63e34SJussi Kivilinna 	}, {
27390840605eSJussi Kivilinna 		.alg = "ctr(camellia)",
27400840605eSJussi Kivilinna 		.test = alg_test_skcipher,
27410840605eSJussi Kivilinna 		.suite = {
27420840605eSJussi Kivilinna 			.cipher = {
27430840605eSJussi Kivilinna 				.enc = {
27440840605eSJussi Kivilinna 					.vecs = camellia_ctr_enc_tv_template,
27450840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_ENC_TEST_VECTORS
27460840605eSJussi Kivilinna 				},
27470840605eSJussi Kivilinna 				.dec = {
27480840605eSJussi Kivilinna 					.vecs = camellia_ctr_dec_tv_template,
27490840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_DEC_TEST_VECTORS
27500840605eSJussi Kivilinna 				}
27510840605eSJussi Kivilinna 			}
27520840605eSJussi Kivilinna 		}
27530840605eSJussi Kivilinna 	}, {
2754a2c58260SJohannes Goetzfried 		.alg = "ctr(cast5)",
2755a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2756a2c58260SJohannes Goetzfried 		.suite = {
2757a2c58260SJohannes Goetzfried 			.cipher = {
2758a2c58260SJohannes Goetzfried 				.enc = {
2759a2c58260SJohannes Goetzfried 					.vecs = cast5_ctr_enc_tv_template,
2760a2c58260SJohannes Goetzfried 					.count = CAST5_CTR_ENC_TEST_VECTORS
2761a2c58260SJohannes Goetzfried 				},
2762a2c58260SJohannes Goetzfried 				.dec = {
2763a2c58260SJohannes Goetzfried 					.vecs = cast5_ctr_dec_tv_template,
2764a2c58260SJohannes Goetzfried 					.count = CAST5_CTR_DEC_TEST_VECTORS
2765a2c58260SJohannes Goetzfried 				}
2766a2c58260SJohannes Goetzfried 			}
2767a2c58260SJohannes Goetzfried 		}
2768a2c58260SJohannes Goetzfried 	}, {
27699b8b0405SJohannes Goetzfried 		.alg = "ctr(cast6)",
27709b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
27719b8b0405SJohannes Goetzfried 		.suite = {
27729b8b0405SJohannes Goetzfried 			.cipher = {
27739b8b0405SJohannes Goetzfried 				.enc = {
27749b8b0405SJohannes Goetzfried 					.vecs = cast6_ctr_enc_tv_template,
27759b8b0405SJohannes Goetzfried 					.count = CAST6_CTR_ENC_TEST_VECTORS
27769b8b0405SJohannes Goetzfried 				},
27779b8b0405SJohannes Goetzfried 				.dec = {
27789b8b0405SJohannes Goetzfried 					.vecs = cast6_ctr_dec_tv_template,
27799b8b0405SJohannes Goetzfried 					.count = CAST6_CTR_DEC_TEST_VECTORS
27809b8b0405SJohannes Goetzfried 				}
27819b8b0405SJohannes Goetzfried 			}
27829b8b0405SJohannes Goetzfried 		}
27839b8b0405SJohannes Goetzfried 	}, {
27848163fc30SJussi Kivilinna 		.alg = "ctr(des)",
27858163fc30SJussi Kivilinna 		.test = alg_test_skcipher,
27868163fc30SJussi Kivilinna 		.suite = {
27878163fc30SJussi Kivilinna 			.cipher = {
27888163fc30SJussi Kivilinna 				.enc = {
27898163fc30SJussi Kivilinna 					.vecs = des_ctr_enc_tv_template,
27908163fc30SJussi Kivilinna 					.count = DES_CTR_ENC_TEST_VECTORS
27918163fc30SJussi Kivilinna 				},
27928163fc30SJussi Kivilinna 				.dec = {
27938163fc30SJussi Kivilinna 					.vecs = des_ctr_dec_tv_template,
27948163fc30SJussi Kivilinna 					.count = DES_CTR_DEC_TEST_VECTORS
27958163fc30SJussi Kivilinna 				}
27968163fc30SJussi Kivilinna 			}
27978163fc30SJussi Kivilinna 		}
27988163fc30SJussi Kivilinna 	}, {
2799e080b17aSJussi Kivilinna 		.alg = "ctr(des3_ede)",
2800e080b17aSJussi Kivilinna 		.test = alg_test_skcipher,
2801e080b17aSJussi Kivilinna 		.suite = {
2802e080b17aSJussi Kivilinna 			.cipher = {
2803e080b17aSJussi Kivilinna 				.enc = {
2804e080b17aSJussi Kivilinna 					.vecs = des3_ede_ctr_enc_tv_template,
2805e080b17aSJussi Kivilinna 					.count = DES3_EDE_CTR_ENC_TEST_VECTORS
2806e080b17aSJussi Kivilinna 				},
2807e080b17aSJussi Kivilinna 				.dec = {
2808e080b17aSJussi Kivilinna 					.vecs = des3_ede_ctr_dec_tv_template,
2809e080b17aSJussi Kivilinna 					.count = DES3_EDE_CTR_DEC_TEST_VECTORS
2810e080b17aSJussi Kivilinna 				}
2811e080b17aSJussi Kivilinna 			}
2812e080b17aSJussi Kivilinna 		}
2813e080b17aSJussi Kivilinna 	}, {
28149d25917dSJussi Kivilinna 		.alg = "ctr(serpent)",
28159d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
28169d25917dSJussi Kivilinna 		.suite = {
28179d25917dSJussi Kivilinna 			.cipher = {
28189d25917dSJussi Kivilinna 				.enc = {
28199d25917dSJussi Kivilinna 					.vecs = serpent_ctr_enc_tv_template,
28209d25917dSJussi Kivilinna 					.count = SERPENT_CTR_ENC_TEST_VECTORS
28219d25917dSJussi Kivilinna 				},
28229d25917dSJussi Kivilinna 				.dec = {
28239d25917dSJussi Kivilinna 					.vecs = serpent_ctr_dec_tv_template,
28249d25917dSJussi Kivilinna 					.count = SERPENT_CTR_DEC_TEST_VECTORS
28259d25917dSJussi Kivilinna 				}
28269d25917dSJussi Kivilinna 			}
28279d25917dSJussi Kivilinna 		}
28289d25917dSJussi Kivilinna 	}, {
2829573da620SJussi Kivilinna 		.alg = "ctr(twofish)",
2830573da620SJussi Kivilinna 		.test = alg_test_skcipher,
2831573da620SJussi Kivilinna 		.suite = {
2832573da620SJussi Kivilinna 			.cipher = {
2833573da620SJussi Kivilinna 				.enc = {
2834573da620SJussi Kivilinna 					.vecs = tf_ctr_enc_tv_template,
2835573da620SJussi Kivilinna 					.count = TF_CTR_ENC_TEST_VECTORS
2836573da620SJussi Kivilinna 				},
2837573da620SJussi Kivilinna 				.dec = {
2838573da620SJussi Kivilinna 					.vecs = tf_ctr_dec_tv_template,
2839573da620SJussi Kivilinna 					.count = TF_CTR_DEC_TEST_VECTORS
2840573da620SJussi Kivilinna 				}
2841573da620SJussi Kivilinna 			}
2842573da620SJussi Kivilinna 		}
2843573da620SJussi Kivilinna 	}, {
2844da7f033dSHerbert Xu 		.alg = "cts(cbc(aes))",
28451aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2846da7f033dSHerbert Xu 		.suite = {
2847da7f033dSHerbert Xu 			.cipher = {
2848da7f033dSHerbert Xu 				.enc = {
2849da7f033dSHerbert Xu 					.vecs = cts_mode_enc_tv_template,
2850da7f033dSHerbert Xu 					.count = CTS_MODE_ENC_TEST_VECTORS
2851da7f033dSHerbert Xu 				},
2852da7f033dSHerbert Xu 				.dec = {
2853da7f033dSHerbert Xu 					.vecs = cts_mode_dec_tv_template,
2854da7f033dSHerbert Xu 					.count = CTS_MODE_DEC_TEST_VECTORS
2855da7f033dSHerbert Xu 				}
2856da7f033dSHerbert Xu 			}
2857da7f033dSHerbert Xu 		}
2858da7f033dSHerbert Xu 	}, {
2859da7f033dSHerbert Xu 		.alg = "deflate",
2860da7f033dSHerbert Xu 		.test = alg_test_comp,
28610818904dSMilan Broz 		.fips_allowed = 1,
2862da7f033dSHerbert Xu 		.suite = {
2863da7f033dSHerbert Xu 			.comp = {
2864da7f033dSHerbert Xu 				.comp = {
2865da7f033dSHerbert Xu 					.vecs = deflate_comp_tv_template,
2866da7f033dSHerbert Xu 					.count = DEFLATE_COMP_TEST_VECTORS
2867da7f033dSHerbert Xu 				},
2868da7f033dSHerbert Xu 				.decomp = {
2869da7f033dSHerbert Xu 					.vecs = deflate_decomp_tv_template,
2870da7f033dSHerbert Xu 					.count = DEFLATE_DECOMP_TEST_VECTORS
2871da7f033dSHerbert Xu 				}
2872da7f033dSHerbert Xu 			}
2873da7f033dSHerbert Xu 		}
2874da7f033dSHerbert Xu 	}, {
2875802c7f1cSSalvatore Benedetto 		.alg = "dh",
2876802c7f1cSSalvatore Benedetto 		.test = alg_test_kpp,
2877802c7f1cSSalvatore Benedetto 		.fips_allowed = 1,
2878802c7f1cSSalvatore Benedetto 		.suite = {
2879802c7f1cSSalvatore Benedetto 			.kpp = {
2880802c7f1cSSalvatore Benedetto 				.vecs = dh_tv_template,
2881802c7f1cSSalvatore Benedetto 				.count = DH_TEST_VECTORS
2882802c7f1cSSalvatore Benedetto 			}
2883802c7f1cSSalvatore Benedetto 		}
2884802c7f1cSSalvatore Benedetto 	}, {
2885e448370dSJussi Kivilinna 		.alg = "digest_null",
2886e448370dSJussi Kivilinna 		.test = alg_test_null,
2887e448370dSJussi Kivilinna 	}, {
288864d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes128",
288964d1cdfbSStephan Mueller 		.test = alg_test_drbg,
289064d1cdfbSStephan Mueller 		.fips_allowed = 1,
289164d1cdfbSStephan Mueller 		.suite = {
289264d1cdfbSStephan Mueller 			.drbg = {
289364d1cdfbSStephan Mueller 				.vecs = drbg_nopr_ctr_aes128_tv_template,
289464d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes128_tv_template)
289564d1cdfbSStephan Mueller 			}
289664d1cdfbSStephan Mueller 		}
289764d1cdfbSStephan Mueller 	}, {
289864d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes192",
289964d1cdfbSStephan Mueller 		.test = alg_test_drbg,
290064d1cdfbSStephan Mueller 		.fips_allowed = 1,
290164d1cdfbSStephan Mueller 		.suite = {
290264d1cdfbSStephan Mueller 			.drbg = {
290364d1cdfbSStephan Mueller 				.vecs = drbg_nopr_ctr_aes192_tv_template,
290464d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes192_tv_template)
290564d1cdfbSStephan Mueller 			}
290664d1cdfbSStephan Mueller 		}
290764d1cdfbSStephan Mueller 	}, {
290864d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes256",
290964d1cdfbSStephan Mueller 		.test = alg_test_drbg,
291064d1cdfbSStephan Mueller 		.fips_allowed = 1,
291164d1cdfbSStephan Mueller 		.suite = {
291264d1cdfbSStephan Mueller 			.drbg = {
291364d1cdfbSStephan Mueller 				.vecs = drbg_nopr_ctr_aes256_tv_template,
291464d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes256_tv_template)
291564d1cdfbSStephan Mueller 			}
291664d1cdfbSStephan Mueller 		}
291764d1cdfbSStephan Mueller 	}, {
291864d1cdfbSStephan Mueller 		/*
291964d1cdfbSStephan Mueller 		 * There is no need to specifically test the DRBG with every
292064d1cdfbSStephan Mueller 		 * backend cipher -- covered by drbg_nopr_hmac_sha256 test
292164d1cdfbSStephan Mueller 		 */
292264d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha1",
292364d1cdfbSStephan Mueller 		.fips_allowed = 1,
292464d1cdfbSStephan Mueller 		.test = alg_test_null,
292564d1cdfbSStephan Mueller 	}, {
292664d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha256",
292764d1cdfbSStephan Mueller 		.test = alg_test_drbg,
292864d1cdfbSStephan Mueller 		.fips_allowed = 1,
292964d1cdfbSStephan Mueller 		.suite = {
293064d1cdfbSStephan Mueller 			.drbg = {
293164d1cdfbSStephan Mueller 				.vecs = drbg_nopr_hmac_sha256_tv_template,
293264d1cdfbSStephan Mueller 				.count =
293364d1cdfbSStephan Mueller 				ARRAY_SIZE(drbg_nopr_hmac_sha256_tv_template)
293464d1cdfbSStephan Mueller 			}
293564d1cdfbSStephan Mueller 		}
293664d1cdfbSStephan Mueller 	}, {
293764d1cdfbSStephan Mueller 		/* covered by drbg_nopr_hmac_sha256 test */
293864d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha384",
293964d1cdfbSStephan Mueller 		.fips_allowed = 1,
294064d1cdfbSStephan Mueller 		.test = alg_test_null,
294164d1cdfbSStephan Mueller 	}, {
294264d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha512",
294364d1cdfbSStephan Mueller 		.test = alg_test_null,
294464d1cdfbSStephan Mueller 		.fips_allowed = 1,
294564d1cdfbSStephan Mueller 	}, {
294664d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha1",
294764d1cdfbSStephan Mueller 		.fips_allowed = 1,
294864d1cdfbSStephan Mueller 		.test = alg_test_null,
294964d1cdfbSStephan Mueller 	}, {
295064d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha256",
295164d1cdfbSStephan Mueller 		.test = alg_test_drbg,
295264d1cdfbSStephan Mueller 		.fips_allowed = 1,
295364d1cdfbSStephan Mueller 		.suite = {
295464d1cdfbSStephan Mueller 			.drbg = {
295564d1cdfbSStephan Mueller 				.vecs = drbg_nopr_sha256_tv_template,
295664d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_sha256_tv_template)
295764d1cdfbSStephan Mueller 			}
295864d1cdfbSStephan Mueller 		}
295964d1cdfbSStephan Mueller 	}, {
296064d1cdfbSStephan Mueller 		/* covered by drbg_nopr_sha256 test */
296164d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha384",
296264d1cdfbSStephan Mueller 		.fips_allowed = 1,
296364d1cdfbSStephan Mueller 		.test = alg_test_null,
296464d1cdfbSStephan Mueller 	}, {
296564d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha512",
296664d1cdfbSStephan Mueller 		.fips_allowed = 1,
296764d1cdfbSStephan Mueller 		.test = alg_test_null,
296864d1cdfbSStephan Mueller 	}, {
296964d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes128",
297064d1cdfbSStephan Mueller 		.test = alg_test_drbg,
297164d1cdfbSStephan Mueller 		.fips_allowed = 1,
297264d1cdfbSStephan Mueller 		.suite = {
297364d1cdfbSStephan Mueller 			.drbg = {
297464d1cdfbSStephan Mueller 				.vecs = drbg_pr_ctr_aes128_tv_template,
297564d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_pr_ctr_aes128_tv_template)
297664d1cdfbSStephan Mueller 			}
297764d1cdfbSStephan Mueller 		}
297864d1cdfbSStephan Mueller 	}, {
297964d1cdfbSStephan Mueller 		/* covered by drbg_pr_ctr_aes128 test */
298064d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes192",
298164d1cdfbSStephan Mueller 		.fips_allowed = 1,
298264d1cdfbSStephan Mueller 		.test = alg_test_null,
298364d1cdfbSStephan Mueller 	}, {
298464d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes256",
298564d1cdfbSStephan Mueller 		.fips_allowed = 1,
298664d1cdfbSStephan Mueller 		.test = alg_test_null,
298764d1cdfbSStephan Mueller 	}, {
298864d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha1",
298964d1cdfbSStephan Mueller 		.fips_allowed = 1,
299064d1cdfbSStephan Mueller 		.test = alg_test_null,
299164d1cdfbSStephan Mueller 	}, {
299264d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha256",
299364d1cdfbSStephan Mueller 		.test = alg_test_drbg,
299464d1cdfbSStephan Mueller 		.fips_allowed = 1,
299564d1cdfbSStephan Mueller 		.suite = {
299664d1cdfbSStephan Mueller 			.drbg = {
299764d1cdfbSStephan Mueller 				.vecs = drbg_pr_hmac_sha256_tv_template,
299864d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_pr_hmac_sha256_tv_template)
299964d1cdfbSStephan Mueller 			}
300064d1cdfbSStephan Mueller 		}
300164d1cdfbSStephan Mueller 	}, {
300264d1cdfbSStephan Mueller 		/* covered by drbg_pr_hmac_sha256 test */
300364d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha384",
300464d1cdfbSStephan Mueller 		.fips_allowed = 1,
300564d1cdfbSStephan Mueller 		.test = alg_test_null,
300664d1cdfbSStephan Mueller 	}, {
300764d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha512",
300864d1cdfbSStephan Mueller 		.test = alg_test_null,
300964d1cdfbSStephan Mueller 		.fips_allowed = 1,
301064d1cdfbSStephan Mueller 	}, {
301164d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha1",
301264d1cdfbSStephan Mueller 		.fips_allowed = 1,
301364d1cdfbSStephan Mueller 		.test = alg_test_null,
301464d1cdfbSStephan Mueller 	}, {
301564d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha256",
301664d1cdfbSStephan Mueller 		.test = alg_test_drbg,
301764d1cdfbSStephan Mueller 		.fips_allowed = 1,
301864d1cdfbSStephan Mueller 		.suite = {
301964d1cdfbSStephan Mueller 			.drbg = {
302064d1cdfbSStephan Mueller 				.vecs = drbg_pr_sha256_tv_template,
302164d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_pr_sha256_tv_template)
302264d1cdfbSStephan Mueller 			}
302364d1cdfbSStephan Mueller 		}
302464d1cdfbSStephan Mueller 	}, {
302564d1cdfbSStephan Mueller 		/* covered by drbg_pr_sha256 test */
302664d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha384",
302764d1cdfbSStephan Mueller 		.fips_allowed = 1,
302864d1cdfbSStephan Mueller 		.test = alg_test_null,
302964d1cdfbSStephan Mueller 	}, {
303064d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha512",
303164d1cdfbSStephan Mueller 		.fips_allowed = 1,
303264d1cdfbSStephan Mueller 		.test = alg_test_null,
303364d1cdfbSStephan Mueller 	}, {
3034863b557aSYouquan, Song 		.alg = "ecb(__aes-aesni)",
3035863b557aSYouquan, Song 		.test = alg_test_null,
30366c79294fSMilan Broz 		.fips_allowed = 1,
3037863b557aSYouquan, Song 	}, {
3038da7f033dSHerbert Xu 		.alg = "ecb(aes)",
30391aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3040a1915d51SJarod Wilson 		.fips_allowed = 1,
3041da7f033dSHerbert Xu 		.suite = {
3042da7f033dSHerbert Xu 			.cipher = {
3043da7f033dSHerbert Xu 				.enc = {
3044da7f033dSHerbert Xu 					.vecs = aes_enc_tv_template,
3045da7f033dSHerbert Xu 					.count = AES_ENC_TEST_VECTORS
3046da7f033dSHerbert Xu 				},
3047da7f033dSHerbert Xu 				.dec = {
3048da7f033dSHerbert Xu 					.vecs = aes_dec_tv_template,
3049da7f033dSHerbert Xu 					.count = AES_DEC_TEST_VECTORS
3050da7f033dSHerbert Xu 				}
3051da7f033dSHerbert Xu 			}
3052da7f033dSHerbert Xu 		}
3053da7f033dSHerbert Xu 	}, {
3054da7f033dSHerbert Xu 		.alg = "ecb(anubis)",
30551aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3056da7f033dSHerbert Xu 		.suite = {
3057da7f033dSHerbert Xu 			.cipher = {
3058da7f033dSHerbert Xu 				.enc = {
3059da7f033dSHerbert Xu 					.vecs = anubis_enc_tv_template,
3060da7f033dSHerbert Xu 					.count = ANUBIS_ENC_TEST_VECTORS
3061da7f033dSHerbert Xu 				},
3062da7f033dSHerbert Xu 				.dec = {
3063da7f033dSHerbert Xu 					.vecs = anubis_dec_tv_template,
3064da7f033dSHerbert Xu 					.count = ANUBIS_DEC_TEST_VECTORS
3065da7f033dSHerbert Xu 				}
3066da7f033dSHerbert Xu 			}
3067da7f033dSHerbert Xu 		}
3068da7f033dSHerbert Xu 	}, {
3069da7f033dSHerbert Xu 		.alg = "ecb(arc4)",
30701aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3071da7f033dSHerbert Xu 		.suite = {
3072da7f033dSHerbert Xu 			.cipher = {
3073da7f033dSHerbert Xu 				.enc = {
3074da7f033dSHerbert Xu 					.vecs = arc4_enc_tv_template,
3075da7f033dSHerbert Xu 					.count = ARC4_ENC_TEST_VECTORS
3076da7f033dSHerbert Xu 				},
3077da7f033dSHerbert Xu 				.dec = {
3078da7f033dSHerbert Xu 					.vecs = arc4_dec_tv_template,
3079da7f033dSHerbert Xu 					.count = ARC4_DEC_TEST_VECTORS
3080da7f033dSHerbert Xu 				}
3081da7f033dSHerbert Xu 			}
3082da7f033dSHerbert Xu 		}
3083da7f033dSHerbert Xu 	}, {
3084da7f033dSHerbert Xu 		.alg = "ecb(blowfish)",
30851aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3086da7f033dSHerbert Xu 		.suite = {
3087da7f033dSHerbert Xu 			.cipher = {
3088da7f033dSHerbert Xu 				.enc = {
3089da7f033dSHerbert Xu 					.vecs = bf_enc_tv_template,
3090da7f033dSHerbert Xu 					.count = BF_ENC_TEST_VECTORS
3091da7f033dSHerbert Xu 				},
3092da7f033dSHerbert Xu 				.dec = {
3093da7f033dSHerbert Xu 					.vecs = bf_dec_tv_template,
3094da7f033dSHerbert Xu 					.count = BF_DEC_TEST_VECTORS
3095da7f033dSHerbert Xu 				}
3096da7f033dSHerbert Xu 			}
3097da7f033dSHerbert Xu 		}
3098da7f033dSHerbert Xu 	}, {
3099da7f033dSHerbert Xu 		.alg = "ecb(camellia)",
31001aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3101da7f033dSHerbert Xu 		.suite = {
3102da7f033dSHerbert Xu 			.cipher = {
3103da7f033dSHerbert Xu 				.enc = {
3104da7f033dSHerbert Xu 					.vecs = camellia_enc_tv_template,
3105da7f033dSHerbert Xu 					.count = CAMELLIA_ENC_TEST_VECTORS
3106da7f033dSHerbert Xu 				},
3107da7f033dSHerbert Xu 				.dec = {
3108da7f033dSHerbert Xu 					.vecs = camellia_dec_tv_template,
3109da7f033dSHerbert Xu 					.count = CAMELLIA_DEC_TEST_VECTORS
3110da7f033dSHerbert Xu 				}
3111da7f033dSHerbert Xu 			}
3112da7f033dSHerbert Xu 		}
3113da7f033dSHerbert Xu 	}, {
3114da7f033dSHerbert Xu 		.alg = "ecb(cast5)",
31151aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3116da7f033dSHerbert Xu 		.suite = {
3117da7f033dSHerbert Xu 			.cipher = {
3118da7f033dSHerbert Xu 				.enc = {
3119da7f033dSHerbert Xu 					.vecs = cast5_enc_tv_template,
3120da7f033dSHerbert Xu 					.count = CAST5_ENC_TEST_VECTORS
3121da7f033dSHerbert Xu 				},
3122da7f033dSHerbert Xu 				.dec = {
3123da7f033dSHerbert Xu 					.vecs = cast5_dec_tv_template,
3124da7f033dSHerbert Xu 					.count = CAST5_DEC_TEST_VECTORS
3125da7f033dSHerbert Xu 				}
3126da7f033dSHerbert Xu 			}
3127da7f033dSHerbert Xu 		}
3128da7f033dSHerbert Xu 	}, {
3129da7f033dSHerbert Xu 		.alg = "ecb(cast6)",
31301aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3131da7f033dSHerbert Xu 		.suite = {
3132da7f033dSHerbert Xu 			.cipher = {
3133da7f033dSHerbert Xu 				.enc = {
3134da7f033dSHerbert Xu 					.vecs = cast6_enc_tv_template,
3135da7f033dSHerbert Xu 					.count = CAST6_ENC_TEST_VECTORS
3136da7f033dSHerbert Xu 				},
3137da7f033dSHerbert Xu 				.dec = {
3138da7f033dSHerbert Xu 					.vecs = cast6_dec_tv_template,
3139da7f033dSHerbert Xu 					.count = CAST6_DEC_TEST_VECTORS
3140da7f033dSHerbert Xu 				}
3141da7f033dSHerbert Xu 			}
3142da7f033dSHerbert Xu 		}
3143da7f033dSHerbert Xu 	}, {
3144e448370dSJussi Kivilinna 		.alg = "ecb(cipher_null)",
3145e448370dSJussi Kivilinna 		.test = alg_test_null,
3146e448370dSJussi Kivilinna 	}, {
3147da7f033dSHerbert Xu 		.alg = "ecb(des)",
31481aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3149da7f033dSHerbert Xu 		.suite = {
3150da7f033dSHerbert Xu 			.cipher = {
3151da7f033dSHerbert Xu 				.enc = {
3152da7f033dSHerbert Xu 					.vecs = des_enc_tv_template,
3153da7f033dSHerbert Xu 					.count = DES_ENC_TEST_VECTORS
3154da7f033dSHerbert Xu 				},
3155da7f033dSHerbert Xu 				.dec = {
3156da7f033dSHerbert Xu 					.vecs = des_dec_tv_template,
3157da7f033dSHerbert Xu 					.count = DES_DEC_TEST_VECTORS
3158da7f033dSHerbert Xu 				}
3159da7f033dSHerbert Xu 			}
3160da7f033dSHerbert Xu 		}
3161da7f033dSHerbert Xu 	}, {
3162da7f033dSHerbert Xu 		.alg = "ecb(des3_ede)",
31631aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3164a1915d51SJarod Wilson 		.fips_allowed = 1,
3165da7f033dSHerbert Xu 		.suite = {
3166da7f033dSHerbert Xu 			.cipher = {
3167da7f033dSHerbert Xu 				.enc = {
3168da7f033dSHerbert Xu 					.vecs = des3_ede_enc_tv_template,
3169da7f033dSHerbert Xu 					.count = DES3_EDE_ENC_TEST_VECTORS
3170da7f033dSHerbert Xu 				},
3171da7f033dSHerbert Xu 				.dec = {
3172da7f033dSHerbert Xu 					.vecs = des3_ede_dec_tv_template,
3173da7f033dSHerbert Xu 					.count = DES3_EDE_DEC_TEST_VECTORS
3174da7f033dSHerbert Xu 				}
3175da7f033dSHerbert Xu 			}
3176da7f033dSHerbert Xu 		}
3177da7f033dSHerbert Xu 	}, {
317866e5bd00SJussi Kivilinna 		.alg = "ecb(fcrypt)",
317966e5bd00SJussi Kivilinna 		.test = alg_test_skcipher,
318066e5bd00SJussi Kivilinna 		.suite = {
318166e5bd00SJussi Kivilinna 			.cipher = {
318266e5bd00SJussi Kivilinna 				.enc = {
318366e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_enc_tv_template,
318466e5bd00SJussi Kivilinna 					.count = 1
318566e5bd00SJussi Kivilinna 				},
318666e5bd00SJussi Kivilinna 				.dec = {
318766e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_dec_tv_template,
318866e5bd00SJussi Kivilinna 					.count = 1
318966e5bd00SJussi Kivilinna 				}
319066e5bd00SJussi Kivilinna 			}
319166e5bd00SJussi Kivilinna 		}
319266e5bd00SJussi Kivilinna 	}, {
3193da7f033dSHerbert Xu 		.alg = "ecb(khazad)",
31941aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3195da7f033dSHerbert Xu 		.suite = {
3196da7f033dSHerbert Xu 			.cipher = {
3197da7f033dSHerbert Xu 				.enc = {
3198da7f033dSHerbert Xu 					.vecs = khazad_enc_tv_template,
3199da7f033dSHerbert Xu 					.count = KHAZAD_ENC_TEST_VECTORS
3200da7f033dSHerbert Xu 				},
3201da7f033dSHerbert Xu 				.dec = {
3202da7f033dSHerbert Xu 					.vecs = khazad_dec_tv_template,
3203da7f033dSHerbert Xu 					.count = KHAZAD_DEC_TEST_VECTORS
3204da7f033dSHerbert Xu 				}
3205da7f033dSHerbert Xu 			}
3206da7f033dSHerbert Xu 		}
3207da7f033dSHerbert Xu 	}, {
3208da7f033dSHerbert Xu 		.alg = "ecb(seed)",
32091aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3210da7f033dSHerbert Xu 		.suite = {
3211da7f033dSHerbert Xu 			.cipher = {
3212da7f033dSHerbert Xu 				.enc = {
3213da7f033dSHerbert Xu 					.vecs = seed_enc_tv_template,
3214da7f033dSHerbert Xu 					.count = SEED_ENC_TEST_VECTORS
3215da7f033dSHerbert Xu 				},
3216da7f033dSHerbert Xu 				.dec = {
3217da7f033dSHerbert Xu 					.vecs = seed_dec_tv_template,
3218da7f033dSHerbert Xu 					.count = SEED_DEC_TEST_VECTORS
3219da7f033dSHerbert Xu 				}
3220da7f033dSHerbert Xu 			}
3221da7f033dSHerbert Xu 		}
3222da7f033dSHerbert Xu 	}, {
3223da7f033dSHerbert Xu 		.alg = "ecb(serpent)",
32241aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3225da7f033dSHerbert Xu 		.suite = {
3226da7f033dSHerbert Xu 			.cipher = {
3227da7f033dSHerbert Xu 				.enc = {
3228da7f033dSHerbert Xu 					.vecs = serpent_enc_tv_template,
3229da7f033dSHerbert Xu 					.count = SERPENT_ENC_TEST_VECTORS
3230da7f033dSHerbert Xu 				},
3231da7f033dSHerbert Xu 				.dec = {
3232da7f033dSHerbert Xu 					.vecs = serpent_dec_tv_template,
3233da7f033dSHerbert Xu 					.count = SERPENT_DEC_TEST_VECTORS
3234da7f033dSHerbert Xu 				}
3235da7f033dSHerbert Xu 			}
3236da7f033dSHerbert Xu 		}
3237da7f033dSHerbert Xu 	}, {
3238da7f033dSHerbert Xu 		.alg = "ecb(tea)",
32391aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3240da7f033dSHerbert Xu 		.suite = {
3241da7f033dSHerbert Xu 			.cipher = {
3242da7f033dSHerbert Xu 				.enc = {
3243da7f033dSHerbert Xu 					.vecs = tea_enc_tv_template,
3244da7f033dSHerbert Xu 					.count = TEA_ENC_TEST_VECTORS
3245da7f033dSHerbert Xu 				},
3246da7f033dSHerbert Xu 				.dec = {
3247da7f033dSHerbert Xu 					.vecs = tea_dec_tv_template,
3248da7f033dSHerbert Xu 					.count = TEA_DEC_TEST_VECTORS
3249da7f033dSHerbert Xu 				}
3250da7f033dSHerbert Xu 			}
3251da7f033dSHerbert Xu 		}
3252da7f033dSHerbert Xu 	}, {
3253da7f033dSHerbert Xu 		.alg = "ecb(tnepres)",
32541aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3255da7f033dSHerbert Xu 		.suite = {
3256da7f033dSHerbert Xu 			.cipher = {
3257da7f033dSHerbert Xu 				.enc = {
3258da7f033dSHerbert Xu 					.vecs = tnepres_enc_tv_template,
3259da7f033dSHerbert Xu 					.count = TNEPRES_ENC_TEST_VECTORS
3260da7f033dSHerbert Xu 				},
3261da7f033dSHerbert Xu 				.dec = {
3262da7f033dSHerbert Xu 					.vecs = tnepres_dec_tv_template,
3263da7f033dSHerbert Xu 					.count = TNEPRES_DEC_TEST_VECTORS
3264da7f033dSHerbert Xu 				}
3265da7f033dSHerbert Xu 			}
3266da7f033dSHerbert Xu 		}
3267da7f033dSHerbert Xu 	}, {
3268da7f033dSHerbert Xu 		.alg = "ecb(twofish)",
32691aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3270da7f033dSHerbert Xu 		.suite = {
3271da7f033dSHerbert Xu 			.cipher = {
3272da7f033dSHerbert Xu 				.enc = {
3273da7f033dSHerbert Xu 					.vecs = tf_enc_tv_template,
3274da7f033dSHerbert Xu 					.count = TF_ENC_TEST_VECTORS
3275da7f033dSHerbert Xu 				},
3276da7f033dSHerbert Xu 				.dec = {
3277da7f033dSHerbert Xu 					.vecs = tf_dec_tv_template,
3278da7f033dSHerbert Xu 					.count = TF_DEC_TEST_VECTORS
3279da7f033dSHerbert Xu 				}
3280da7f033dSHerbert Xu 			}
3281da7f033dSHerbert Xu 		}
3282da7f033dSHerbert Xu 	}, {
3283da7f033dSHerbert Xu 		.alg = "ecb(xeta)",
32841aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3285da7f033dSHerbert Xu 		.suite = {
3286da7f033dSHerbert Xu 			.cipher = {
3287da7f033dSHerbert Xu 				.enc = {
3288da7f033dSHerbert Xu 					.vecs = xeta_enc_tv_template,
3289da7f033dSHerbert Xu 					.count = XETA_ENC_TEST_VECTORS
3290da7f033dSHerbert Xu 				},
3291da7f033dSHerbert Xu 				.dec = {
3292da7f033dSHerbert Xu 					.vecs = xeta_dec_tv_template,
3293da7f033dSHerbert Xu 					.count = XETA_DEC_TEST_VECTORS
3294da7f033dSHerbert Xu 				}
3295da7f033dSHerbert Xu 			}
3296da7f033dSHerbert Xu 		}
3297da7f033dSHerbert Xu 	}, {
3298da7f033dSHerbert Xu 		.alg = "ecb(xtea)",
32991aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3300da7f033dSHerbert Xu 		.suite = {
3301da7f033dSHerbert Xu 			.cipher = {
3302da7f033dSHerbert Xu 				.enc = {
3303da7f033dSHerbert Xu 					.vecs = xtea_enc_tv_template,
3304da7f033dSHerbert Xu 					.count = XTEA_ENC_TEST_VECTORS
3305da7f033dSHerbert Xu 				},
3306da7f033dSHerbert Xu 				.dec = {
3307da7f033dSHerbert Xu 					.vecs = xtea_dec_tv_template,
3308da7f033dSHerbert Xu 					.count = XTEA_DEC_TEST_VECTORS
3309da7f033dSHerbert Xu 				}
3310da7f033dSHerbert Xu 			}
3311da7f033dSHerbert Xu 		}
3312da7f033dSHerbert Xu 	}, {
33133c4b2390SSalvatore Benedetto 		.alg = "ecdh",
33143c4b2390SSalvatore Benedetto 		.test = alg_test_kpp,
33153c4b2390SSalvatore Benedetto 		.fips_allowed = 1,
33163c4b2390SSalvatore Benedetto 		.suite = {
33173c4b2390SSalvatore Benedetto 			.kpp = {
33183c4b2390SSalvatore Benedetto 				.vecs = ecdh_tv_template,
33193c4b2390SSalvatore Benedetto 				.count = ECDH_TEST_VECTORS
33203c4b2390SSalvatore Benedetto 			}
33213c4b2390SSalvatore Benedetto 		}
33223c4b2390SSalvatore Benedetto 	}, {
3323da7f033dSHerbert Xu 		.alg = "gcm(aes)",
3324da7f033dSHerbert Xu 		.test = alg_test_aead,
3325a1915d51SJarod Wilson 		.fips_allowed = 1,
3326da7f033dSHerbert Xu 		.suite = {
3327da7f033dSHerbert Xu 			.aead = {
3328da7f033dSHerbert Xu 				.enc = {
3329da7f033dSHerbert Xu 					.vecs = aes_gcm_enc_tv_template,
3330da7f033dSHerbert Xu 					.count = AES_GCM_ENC_TEST_VECTORS
3331da7f033dSHerbert Xu 				},
3332da7f033dSHerbert Xu 				.dec = {
3333da7f033dSHerbert Xu 					.vecs = aes_gcm_dec_tv_template,
3334da7f033dSHerbert Xu 					.count = AES_GCM_DEC_TEST_VECTORS
3335da7f033dSHerbert Xu 				}
3336da7f033dSHerbert Xu 			}
3337da7f033dSHerbert Xu 		}
3338da7f033dSHerbert Xu 	}, {
3339507069c9SYouquan, Song 		.alg = "ghash",
3340507069c9SYouquan, Song 		.test = alg_test_hash,
334118c0ebd2SJarod Wilson 		.fips_allowed = 1,
3342507069c9SYouquan, Song 		.suite = {
3343507069c9SYouquan, Song 			.hash = {
3344507069c9SYouquan, Song 				.vecs = ghash_tv_template,
3345507069c9SYouquan, Song 				.count = GHASH_TEST_VECTORS
3346507069c9SYouquan, Song 			}
3347507069c9SYouquan, Song 		}
3348507069c9SYouquan, Song 	}, {
3349a482b081SSonic Zhang 		.alg = "hmac(crc32)",
3350a482b081SSonic Zhang 		.test = alg_test_hash,
3351a482b081SSonic Zhang 		.suite = {
3352a482b081SSonic Zhang 			.hash = {
3353a482b081SSonic Zhang 				.vecs = bfin_crc_tv_template,
3354a482b081SSonic Zhang 				.count = BFIN_CRC_TEST_VECTORS
3355a482b081SSonic Zhang 			}
3356a482b081SSonic Zhang 		}
3357a482b081SSonic Zhang 	}, {
3358da7f033dSHerbert Xu 		.alg = "hmac(md5)",
3359da7f033dSHerbert Xu 		.test = alg_test_hash,
3360da7f033dSHerbert Xu 		.suite = {
3361da7f033dSHerbert Xu 			.hash = {
3362da7f033dSHerbert Xu 				.vecs = hmac_md5_tv_template,
3363da7f033dSHerbert Xu 				.count = HMAC_MD5_TEST_VECTORS
3364da7f033dSHerbert Xu 			}
3365da7f033dSHerbert Xu 		}
3366da7f033dSHerbert Xu 	}, {
3367da7f033dSHerbert Xu 		.alg = "hmac(rmd128)",
3368da7f033dSHerbert Xu 		.test = alg_test_hash,
3369da7f033dSHerbert Xu 		.suite = {
3370da7f033dSHerbert Xu 			.hash = {
3371da7f033dSHerbert Xu 				.vecs = hmac_rmd128_tv_template,
3372da7f033dSHerbert Xu 				.count = HMAC_RMD128_TEST_VECTORS
3373da7f033dSHerbert Xu 			}
3374da7f033dSHerbert Xu 		}
3375da7f033dSHerbert Xu 	}, {
3376da7f033dSHerbert Xu 		.alg = "hmac(rmd160)",
3377da7f033dSHerbert Xu 		.test = alg_test_hash,
3378da7f033dSHerbert Xu 		.suite = {
3379da7f033dSHerbert Xu 			.hash = {
3380da7f033dSHerbert Xu 				.vecs = hmac_rmd160_tv_template,
3381da7f033dSHerbert Xu 				.count = HMAC_RMD160_TEST_VECTORS
3382da7f033dSHerbert Xu 			}
3383da7f033dSHerbert Xu 		}
3384da7f033dSHerbert Xu 	}, {
3385da7f033dSHerbert Xu 		.alg = "hmac(sha1)",
3386da7f033dSHerbert Xu 		.test = alg_test_hash,
3387a1915d51SJarod Wilson 		.fips_allowed = 1,
3388da7f033dSHerbert Xu 		.suite = {
3389da7f033dSHerbert Xu 			.hash = {
3390da7f033dSHerbert Xu 				.vecs = hmac_sha1_tv_template,
3391da7f033dSHerbert Xu 				.count = HMAC_SHA1_TEST_VECTORS
3392da7f033dSHerbert Xu 			}
3393da7f033dSHerbert Xu 		}
3394da7f033dSHerbert Xu 	}, {
3395da7f033dSHerbert Xu 		.alg = "hmac(sha224)",
3396da7f033dSHerbert Xu 		.test = alg_test_hash,
3397a1915d51SJarod Wilson 		.fips_allowed = 1,
3398da7f033dSHerbert Xu 		.suite = {
3399da7f033dSHerbert Xu 			.hash = {
3400da7f033dSHerbert Xu 				.vecs = hmac_sha224_tv_template,
3401da7f033dSHerbert Xu 				.count = HMAC_SHA224_TEST_VECTORS
3402da7f033dSHerbert Xu 			}
3403da7f033dSHerbert Xu 		}
3404da7f033dSHerbert Xu 	}, {
3405da7f033dSHerbert Xu 		.alg = "hmac(sha256)",
3406da7f033dSHerbert Xu 		.test = alg_test_hash,
3407a1915d51SJarod Wilson 		.fips_allowed = 1,
3408da7f033dSHerbert Xu 		.suite = {
3409da7f033dSHerbert Xu 			.hash = {
3410da7f033dSHerbert Xu 				.vecs = hmac_sha256_tv_template,
3411da7f033dSHerbert Xu 				.count = HMAC_SHA256_TEST_VECTORS
3412da7f033dSHerbert Xu 			}
3413da7f033dSHerbert Xu 		}
3414da7f033dSHerbert Xu 	}, {
341598eca72fSraveendra padasalagi 		.alg = "hmac(sha3-224)",
341698eca72fSraveendra padasalagi 		.test = alg_test_hash,
341798eca72fSraveendra padasalagi 		.fips_allowed = 1,
341898eca72fSraveendra padasalagi 		.suite = {
341998eca72fSraveendra padasalagi 			.hash = {
342098eca72fSraveendra padasalagi 				.vecs = hmac_sha3_224_tv_template,
342198eca72fSraveendra padasalagi 				.count = HMAC_SHA3_224_TEST_VECTORS
342298eca72fSraveendra padasalagi 			}
342398eca72fSraveendra padasalagi 		}
342498eca72fSraveendra padasalagi 	}, {
342598eca72fSraveendra padasalagi 		.alg = "hmac(sha3-256)",
342698eca72fSraveendra padasalagi 		.test = alg_test_hash,
342798eca72fSraveendra padasalagi 		.fips_allowed = 1,
342898eca72fSraveendra padasalagi 		.suite = {
342998eca72fSraveendra padasalagi 			.hash = {
343098eca72fSraveendra padasalagi 				.vecs = hmac_sha3_256_tv_template,
343198eca72fSraveendra padasalagi 				.count = HMAC_SHA3_256_TEST_VECTORS
343298eca72fSraveendra padasalagi 			}
343398eca72fSraveendra padasalagi 		}
343498eca72fSraveendra padasalagi 	}, {
343598eca72fSraveendra padasalagi 		.alg = "hmac(sha3-384)",
343698eca72fSraveendra padasalagi 		.test = alg_test_hash,
343798eca72fSraveendra padasalagi 		.fips_allowed = 1,
343898eca72fSraveendra padasalagi 		.suite = {
343998eca72fSraveendra padasalagi 			.hash = {
344098eca72fSraveendra padasalagi 				.vecs = hmac_sha3_384_tv_template,
344198eca72fSraveendra padasalagi 				.count = HMAC_SHA3_384_TEST_VECTORS
344298eca72fSraveendra padasalagi 			}
344398eca72fSraveendra padasalagi 		}
344498eca72fSraveendra padasalagi 	}, {
344598eca72fSraveendra padasalagi 		.alg = "hmac(sha3-512)",
344698eca72fSraveendra padasalagi 		.test = alg_test_hash,
344798eca72fSraveendra padasalagi 		.fips_allowed = 1,
344898eca72fSraveendra padasalagi 		.suite = {
344998eca72fSraveendra padasalagi 			.hash = {
345098eca72fSraveendra padasalagi 				.vecs = hmac_sha3_512_tv_template,
345198eca72fSraveendra padasalagi 				.count = HMAC_SHA3_512_TEST_VECTORS
345298eca72fSraveendra padasalagi 			}
345398eca72fSraveendra padasalagi 		}
345498eca72fSraveendra padasalagi 	}, {
3455da7f033dSHerbert Xu 		.alg = "hmac(sha384)",
3456da7f033dSHerbert Xu 		.test = alg_test_hash,
3457a1915d51SJarod Wilson 		.fips_allowed = 1,
3458da7f033dSHerbert Xu 		.suite = {
3459da7f033dSHerbert Xu 			.hash = {
3460da7f033dSHerbert Xu 				.vecs = hmac_sha384_tv_template,
3461da7f033dSHerbert Xu 				.count = HMAC_SHA384_TEST_VECTORS
3462da7f033dSHerbert Xu 			}
3463da7f033dSHerbert Xu 		}
3464da7f033dSHerbert Xu 	}, {
3465da7f033dSHerbert Xu 		.alg = "hmac(sha512)",
3466da7f033dSHerbert Xu 		.test = alg_test_hash,
3467a1915d51SJarod Wilson 		.fips_allowed = 1,
3468da7f033dSHerbert Xu 		.suite = {
3469da7f033dSHerbert Xu 			.hash = {
3470da7f033dSHerbert Xu 				.vecs = hmac_sha512_tv_template,
3471da7f033dSHerbert Xu 				.count = HMAC_SHA512_TEST_VECTORS
3472da7f033dSHerbert Xu 			}
3473da7f033dSHerbert Xu 		}
3474da7f033dSHerbert Xu 	}, {
3475bb5530e4SStephan Mueller 		.alg = "jitterentropy_rng",
3476bb5530e4SStephan Mueller 		.fips_allowed = 1,
3477bb5530e4SStephan Mueller 		.test = alg_test_null,
3478bb5530e4SStephan Mueller 	}, {
347935351988SStephan Mueller 		.alg = "kw(aes)",
348035351988SStephan Mueller 		.test = alg_test_skcipher,
348135351988SStephan Mueller 		.fips_allowed = 1,
348235351988SStephan Mueller 		.suite = {
348335351988SStephan Mueller 			.cipher = {
348435351988SStephan Mueller 				.enc = {
348535351988SStephan Mueller 					.vecs = aes_kw_enc_tv_template,
348635351988SStephan Mueller 					.count = ARRAY_SIZE(aes_kw_enc_tv_template)
348735351988SStephan Mueller 				},
348835351988SStephan Mueller 				.dec = {
348935351988SStephan Mueller 					.vecs = aes_kw_dec_tv_template,
349035351988SStephan Mueller 					.count = ARRAY_SIZE(aes_kw_dec_tv_template)
349135351988SStephan Mueller 				}
349235351988SStephan Mueller 			}
349335351988SStephan Mueller 		}
349435351988SStephan Mueller 	}, {
3495da7f033dSHerbert Xu 		.alg = "lrw(aes)",
34961aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3497da7f033dSHerbert Xu 		.suite = {
3498da7f033dSHerbert Xu 			.cipher = {
3499da7f033dSHerbert Xu 				.enc = {
3500da7f033dSHerbert Xu 					.vecs = aes_lrw_enc_tv_template,
3501da7f033dSHerbert Xu 					.count = AES_LRW_ENC_TEST_VECTORS
3502da7f033dSHerbert Xu 				},
3503da7f033dSHerbert Xu 				.dec = {
3504da7f033dSHerbert Xu 					.vecs = aes_lrw_dec_tv_template,
3505da7f033dSHerbert Xu 					.count = AES_LRW_DEC_TEST_VECTORS
3506da7f033dSHerbert Xu 				}
3507da7f033dSHerbert Xu 			}
3508da7f033dSHerbert Xu 		}
3509da7f033dSHerbert Xu 	}, {
35100840605eSJussi Kivilinna 		.alg = "lrw(camellia)",
35110840605eSJussi Kivilinna 		.test = alg_test_skcipher,
35120840605eSJussi Kivilinna 		.suite = {
35130840605eSJussi Kivilinna 			.cipher = {
35140840605eSJussi Kivilinna 				.enc = {
35150840605eSJussi Kivilinna 					.vecs = camellia_lrw_enc_tv_template,
35160840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_ENC_TEST_VECTORS
35170840605eSJussi Kivilinna 				},
35180840605eSJussi Kivilinna 				.dec = {
35190840605eSJussi Kivilinna 					.vecs = camellia_lrw_dec_tv_template,
35200840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_DEC_TEST_VECTORS
35210840605eSJussi Kivilinna 				}
35220840605eSJussi Kivilinna 			}
35230840605eSJussi Kivilinna 		}
35240840605eSJussi Kivilinna 	}, {
35259b8b0405SJohannes Goetzfried 		.alg = "lrw(cast6)",
35269b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
35279b8b0405SJohannes Goetzfried 		.suite = {
35289b8b0405SJohannes Goetzfried 			.cipher = {
35299b8b0405SJohannes Goetzfried 				.enc = {
35309b8b0405SJohannes Goetzfried 					.vecs = cast6_lrw_enc_tv_template,
35319b8b0405SJohannes Goetzfried 					.count = CAST6_LRW_ENC_TEST_VECTORS
35329b8b0405SJohannes Goetzfried 				},
35339b8b0405SJohannes Goetzfried 				.dec = {
35349b8b0405SJohannes Goetzfried 					.vecs = cast6_lrw_dec_tv_template,
35359b8b0405SJohannes Goetzfried 					.count = CAST6_LRW_DEC_TEST_VECTORS
35369b8b0405SJohannes Goetzfried 				}
35379b8b0405SJohannes Goetzfried 			}
35389b8b0405SJohannes Goetzfried 		}
35399b8b0405SJohannes Goetzfried 	}, {
3540d7bfc0faSJussi Kivilinna 		.alg = "lrw(serpent)",
3541d7bfc0faSJussi Kivilinna 		.test = alg_test_skcipher,
3542d7bfc0faSJussi Kivilinna 		.suite = {
3543d7bfc0faSJussi Kivilinna 			.cipher = {
3544d7bfc0faSJussi Kivilinna 				.enc = {
3545d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_enc_tv_template,
3546d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_ENC_TEST_VECTORS
3547d7bfc0faSJussi Kivilinna 				},
3548d7bfc0faSJussi Kivilinna 				.dec = {
3549d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_dec_tv_template,
3550d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_DEC_TEST_VECTORS
3551d7bfc0faSJussi Kivilinna 				}
3552d7bfc0faSJussi Kivilinna 			}
3553d7bfc0faSJussi Kivilinna 		}
3554d7bfc0faSJussi Kivilinna 	}, {
35550b2a1551SJussi Kivilinna 		.alg = "lrw(twofish)",
35560b2a1551SJussi Kivilinna 		.test = alg_test_skcipher,
35570b2a1551SJussi Kivilinna 		.suite = {
35580b2a1551SJussi Kivilinna 			.cipher = {
35590b2a1551SJussi Kivilinna 				.enc = {
35600b2a1551SJussi Kivilinna 					.vecs = tf_lrw_enc_tv_template,
35610b2a1551SJussi Kivilinna 					.count = TF_LRW_ENC_TEST_VECTORS
35620b2a1551SJussi Kivilinna 				},
35630b2a1551SJussi Kivilinna 				.dec = {
35640b2a1551SJussi Kivilinna 					.vecs = tf_lrw_dec_tv_template,
35650b2a1551SJussi Kivilinna 					.count = TF_LRW_DEC_TEST_VECTORS
35660b2a1551SJussi Kivilinna 				}
35670b2a1551SJussi Kivilinna 			}
35680b2a1551SJussi Kivilinna 		}
35690b2a1551SJussi Kivilinna 	}, {
35701443cc9bSKOVACS Krisztian 		.alg = "lz4",
35711443cc9bSKOVACS Krisztian 		.test = alg_test_comp,
35721443cc9bSKOVACS Krisztian 		.fips_allowed = 1,
35731443cc9bSKOVACS Krisztian 		.suite = {
35741443cc9bSKOVACS Krisztian 			.comp = {
35751443cc9bSKOVACS Krisztian 				.comp = {
35761443cc9bSKOVACS Krisztian 					.vecs = lz4_comp_tv_template,
35771443cc9bSKOVACS Krisztian 					.count = LZ4_COMP_TEST_VECTORS
35781443cc9bSKOVACS Krisztian 				},
35791443cc9bSKOVACS Krisztian 				.decomp = {
35801443cc9bSKOVACS Krisztian 					.vecs = lz4_decomp_tv_template,
35811443cc9bSKOVACS Krisztian 					.count = LZ4_DECOMP_TEST_VECTORS
35821443cc9bSKOVACS Krisztian 				}
35831443cc9bSKOVACS Krisztian 			}
35841443cc9bSKOVACS Krisztian 		}
35851443cc9bSKOVACS Krisztian 	}, {
35861443cc9bSKOVACS Krisztian 		.alg = "lz4hc",
35871443cc9bSKOVACS Krisztian 		.test = alg_test_comp,
35881443cc9bSKOVACS Krisztian 		.fips_allowed = 1,
35891443cc9bSKOVACS Krisztian 		.suite = {
35901443cc9bSKOVACS Krisztian 			.comp = {
35911443cc9bSKOVACS Krisztian 				.comp = {
35921443cc9bSKOVACS Krisztian 					.vecs = lz4hc_comp_tv_template,
35931443cc9bSKOVACS Krisztian 					.count = LZ4HC_COMP_TEST_VECTORS
35941443cc9bSKOVACS Krisztian 				},
35951443cc9bSKOVACS Krisztian 				.decomp = {
35961443cc9bSKOVACS Krisztian 					.vecs = lz4hc_decomp_tv_template,
35971443cc9bSKOVACS Krisztian 					.count = LZ4HC_DECOMP_TEST_VECTORS
35981443cc9bSKOVACS Krisztian 				}
35991443cc9bSKOVACS Krisztian 			}
36001443cc9bSKOVACS Krisztian 		}
36011443cc9bSKOVACS Krisztian 	}, {
3602da7f033dSHerbert Xu 		.alg = "lzo",
3603da7f033dSHerbert Xu 		.test = alg_test_comp,
36040818904dSMilan Broz 		.fips_allowed = 1,
3605da7f033dSHerbert Xu 		.suite = {
3606da7f033dSHerbert Xu 			.comp = {
3607da7f033dSHerbert Xu 				.comp = {
3608da7f033dSHerbert Xu 					.vecs = lzo_comp_tv_template,
3609da7f033dSHerbert Xu 					.count = LZO_COMP_TEST_VECTORS
3610da7f033dSHerbert Xu 				},
3611da7f033dSHerbert Xu 				.decomp = {
3612da7f033dSHerbert Xu 					.vecs = lzo_decomp_tv_template,
3613da7f033dSHerbert Xu 					.count = LZO_DECOMP_TEST_VECTORS
3614da7f033dSHerbert Xu 				}
3615da7f033dSHerbert Xu 			}
3616da7f033dSHerbert Xu 		}
3617da7f033dSHerbert Xu 	}, {
3618da7f033dSHerbert Xu 		.alg = "md4",
3619da7f033dSHerbert Xu 		.test = alg_test_hash,
3620da7f033dSHerbert Xu 		.suite = {
3621da7f033dSHerbert Xu 			.hash = {
3622da7f033dSHerbert Xu 				.vecs = md4_tv_template,
3623da7f033dSHerbert Xu 				.count = MD4_TEST_VECTORS
3624da7f033dSHerbert Xu 			}
3625da7f033dSHerbert Xu 		}
3626da7f033dSHerbert Xu 	}, {
3627da7f033dSHerbert Xu 		.alg = "md5",
3628da7f033dSHerbert Xu 		.test = alg_test_hash,
3629da7f033dSHerbert Xu 		.suite = {
3630da7f033dSHerbert Xu 			.hash = {
3631da7f033dSHerbert Xu 				.vecs = md5_tv_template,
3632da7f033dSHerbert Xu 				.count = MD5_TEST_VECTORS
3633da7f033dSHerbert Xu 			}
3634da7f033dSHerbert Xu 		}
3635da7f033dSHerbert Xu 	}, {
3636da7f033dSHerbert Xu 		.alg = "michael_mic",
3637da7f033dSHerbert Xu 		.test = alg_test_hash,
3638da7f033dSHerbert Xu 		.suite = {
3639da7f033dSHerbert Xu 			.hash = {
3640da7f033dSHerbert Xu 				.vecs = michael_mic_tv_template,
3641da7f033dSHerbert Xu 				.count = MICHAEL_MIC_TEST_VECTORS
3642da7f033dSHerbert Xu 			}
3643da7f033dSHerbert Xu 		}
3644da7f033dSHerbert Xu 	}, {
3645ba0e14acSPuneet Saxena 		.alg = "ofb(aes)",
3646ba0e14acSPuneet Saxena 		.test = alg_test_skcipher,
3647ba0e14acSPuneet Saxena 		.fips_allowed = 1,
3648ba0e14acSPuneet Saxena 		.suite = {
3649ba0e14acSPuneet Saxena 			.cipher = {
3650ba0e14acSPuneet Saxena 				.enc = {
3651ba0e14acSPuneet Saxena 					.vecs = aes_ofb_enc_tv_template,
3652ba0e14acSPuneet Saxena 					.count = AES_OFB_ENC_TEST_VECTORS
3653ba0e14acSPuneet Saxena 				},
3654ba0e14acSPuneet Saxena 				.dec = {
3655ba0e14acSPuneet Saxena 					.vecs = aes_ofb_dec_tv_template,
3656ba0e14acSPuneet Saxena 					.count = AES_OFB_DEC_TEST_VECTORS
3657ba0e14acSPuneet Saxena 				}
3658ba0e14acSPuneet Saxena 			}
3659ba0e14acSPuneet Saxena 		}
3660ba0e14acSPuneet Saxena 	}, {
3661da7f033dSHerbert Xu 		.alg = "pcbc(fcrypt)",
36621aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3663da7f033dSHerbert Xu 		.suite = {
3664da7f033dSHerbert Xu 			.cipher = {
3665da7f033dSHerbert Xu 				.enc = {
3666da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_enc_tv_template,
3667da7f033dSHerbert Xu 					.count = FCRYPT_ENC_TEST_VECTORS
3668da7f033dSHerbert Xu 				},
3669da7f033dSHerbert Xu 				.dec = {
3670da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_dec_tv_template,
3671da7f033dSHerbert Xu 					.count = FCRYPT_DEC_TEST_VECTORS
3672da7f033dSHerbert Xu 				}
3673da7f033dSHerbert Xu 			}
3674da7f033dSHerbert Xu 		}
3675da7f033dSHerbert Xu 	}, {
3676eee9dc61SMartin Willi 		.alg = "poly1305",
3677eee9dc61SMartin Willi 		.test = alg_test_hash,
3678eee9dc61SMartin Willi 		.suite = {
3679eee9dc61SMartin Willi 			.hash = {
3680eee9dc61SMartin Willi 				.vecs = poly1305_tv_template,
3681eee9dc61SMartin Willi 				.count = POLY1305_TEST_VECTORS
3682eee9dc61SMartin Willi 			}
3683eee9dc61SMartin Willi 		}
3684eee9dc61SMartin Willi 	}, {
3685da7f033dSHerbert Xu 		.alg = "rfc3686(ctr(aes))",
36861aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3687a1915d51SJarod Wilson 		.fips_allowed = 1,
3688da7f033dSHerbert Xu 		.suite = {
3689da7f033dSHerbert Xu 			.cipher = {
3690da7f033dSHerbert Xu 				.enc = {
3691f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_enc_tv_template,
3692f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_ENC_TEST_VECTORS
3693da7f033dSHerbert Xu 				},
3694da7f033dSHerbert Xu 				.dec = {
3695f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_dec_tv_template,
3696f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_DEC_TEST_VECTORS
3697da7f033dSHerbert Xu 				}
3698da7f033dSHerbert Xu 			}
3699da7f033dSHerbert Xu 		}
3700da7f033dSHerbert Xu 	}, {
37013f31a740SHerbert Xu 		.alg = "rfc4106(gcm(aes))",
370269435b94SAdrian Hoban 		.test = alg_test_aead,
3703db71f29aSJarod Wilson 		.fips_allowed = 1,
370469435b94SAdrian Hoban 		.suite = {
370569435b94SAdrian Hoban 			.aead = {
370669435b94SAdrian Hoban 				.enc = {
370769435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_enc_tv_template,
370869435b94SAdrian Hoban 					.count = AES_GCM_4106_ENC_TEST_VECTORS
370969435b94SAdrian Hoban 				},
371069435b94SAdrian Hoban 				.dec = {
371169435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_dec_tv_template,
371269435b94SAdrian Hoban 					.count = AES_GCM_4106_DEC_TEST_VECTORS
371369435b94SAdrian Hoban 				}
371469435b94SAdrian Hoban 			}
371569435b94SAdrian Hoban 		}
371669435b94SAdrian Hoban 	}, {
3717544c436aSHerbert Xu 		.alg = "rfc4309(ccm(aes))",
37185d667322SJarod Wilson 		.test = alg_test_aead,
3719a1915d51SJarod Wilson 		.fips_allowed = 1,
37205d667322SJarod Wilson 		.suite = {
37215d667322SJarod Wilson 			.aead = {
37225d667322SJarod Wilson 				.enc = {
37235d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_enc_tv_template,
37245d667322SJarod Wilson 					.count = AES_CCM_4309_ENC_TEST_VECTORS
37255d667322SJarod Wilson 				},
37265d667322SJarod Wilson 				.dec = {
37275d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_dec_tv_template,
37285d667322SJarod Wilson 					.count = AES_CCM_4309_DEC_TEST_VECTORS
37295d667322SJarod Wilson 				}
37305d667322SJarod Wilson 			}
37315d667322SJarod Wilson 		}
37325d667322SJarod Wilson 	}, {
3733bb68745eSHerbert Xu 		.alg = "rfc4543(gcm(aes))",
3734e9b7441aSJussi Kivilinna 		.test = alg_test_aead,
3735e9b7441aSJussi Kivilinna 		.suite = {
3736e9b7441aSJussi Kivilinna 			.aead = {
3737e9b7441aSJussi Kivilinna 				.enc = {
3738e9b7441aSJussi Kivilinna 					.vecs = aes_gcm_rfc4543_enc_tv_template,
3739e9b7441aSJussi Kivilinna 					.count = AES_GCM_4543_ENC_TEST_VECTORS
3740e9b7441aSJussi Kivilinna 				},
3741e9b7441aSJussi Kivilinna 				.dec = {
3742e9b7441aSJussi Kivilinna 					.vecs = aes_gcm_rfc4543_dec_tv_template,
3743e9b7441aSJussi Kivilinna 					.count = AES_GCM_4543_DEC_TEST_VECTORS
3744e9b7441aSJussi Kivilinna 				},
3745e9b7441aSJussi Kivilinna 			}
3746e9b7441aSJussi Kivilinna 		}
3747e9b7441aSJussi Kivilinna 	}, {
3748af2b76b5SMartin Willi 		.alg = "rfc7539(chacha20,poly1305)",
3749af2b76b5SMartin Willi 		.test = alg_test_aead,
3750af2b76b5SMartin Willi 		.suite = {
3751af2b76b5SMartin Willi 			.aead = {
3752af2b76b5SMartin Willi 				.enc = {
3753af2b76b5SMartin Willi 					.vecs = rfc7539_enc_tv_template,
3754af2b76b5SMartin Willi 					.count = RFC7539_ENC_TEST_VECTORS
3755af2b76b5SMartin Willi 				},
3756af2b76b5SMartin Willi 				.dec = {
3757af2b76b5SMartin Willi 					.vecs = rfc7539_dec_tv_template,
3758af2b76b5SMartin Willi 					.count = RFC7539_DEC_TEST_VECTORS
3759af2b76b5SMartin Willi 				},
3760af2b76b5SMartin Willi 			}
3761af2b76b5SMartin Willi 		}
3762af2b76b5SMartin Willi 	}, {
37635900758dSMartin Willi 		.alg = "rfc7539esp(chacha20,poly1305)",
37645900758dSMartin Willi 		.test = alg_test_aead,
37655900758dSMartin Willi 		.suite = {
37665900758dSMartin Willi 			.aead = {
37675900758dSMartin Willi 				.enc = {
37685900758dSMartin Willi 					.vecs = rfc7539esp_enc_tv_template,
37695900758dSMartin Willi 					.count = RFC7539ESP_ENC_TEST_VECTORS
37705900758dSMartin Willi 				},
37715900758dSMartin Willi 				.dec = {
37725900758dSMartin Willi 					.vecs = rfc7539esp_dec_tv_template,
37735900758dSMartin Willi 					.count = RFC7539ESP_DEC_TEST_VECTORS
37745900758dSMartin Willi 				},
37755900758dSMartin Willi 			}
37765900758dSMartin Willi 		}
37775900758dSMartin Willi 	}, {
3778da7f033dSHerbert Xu 		.alg = "rmd128",
3779da7f033dSHerbert Xu 		.test = alg_test_hash,
3780da7f033dSHerbert Xu 		.suite = {
3781da7f033dSHerbert Xu 			.hash = {
3782da7f033dSHerbert Xu 				.vecs = rmd128_tv_template,
3783da7f033dSHerbert Xu 				.count = RMD128_TEST_VECTORS
3784da7f033dSHerbert Xu 			}
3785da7f033dSHerbert Xu 		}
3786da7f033dSHerbert Xu 	}, {
3787da7f033dSHerbert Xu 		.alg = "rmd160",
3788da7f033dSHerbert Xu 		.test = alg_test_hash,
3789da7f033dSHerbert Xu 		.suite = {
3790da7f033dSHerbert Xu 			.hash = {
3791da7f033dSHerbert Xu 				.vecs = rmd160_tv_template,
3792da7f033dSHerbert Xu 				.count = RMD160_TEST_VECTORS
3793da7f033dSHerbert Xu 			}
3794da7f033dSHerbert Xu 		}
3795da7f033dSHerbert Xu 	}, {
3796da7f033dSHerbert Xu 		.alg = "rmd256",
3797da7f033dSHerbert Xu 		.test = alg_test_hash,
3798da7f033dSHerbert Xu 		.suite = {
3799da7f033dSHerbert Xu 			.hash = {
3800da7f033dSHerbert Xu 				.vecs = rmd256_tv_template,
3801da7f033dSHerbert Xu 				.count = RMD256_TEST_VECTORS
3802da7f033dSHerbert Xu 			}
3803da7f033dSHerbert Xu 		}
3804da7f033dSHerbert Xu 	}, {
3805da7f033dSHerbert Xu 		.alg = "rmd320",
3806da7f033dSHerbert Xu 		.test = alg_test_hash,
3807da7f033dSHerbert Xu 		.suite = {
3808da7f033dSHerbert Xu 			.hash = {
3809da7f033dSHerbert Xu 				.vecs = rmd320_tv_template,
3810da7f033dSHerbert Xu 				.count = RMD320_TEST_VECTORS
3811da7f033dSHerbert Xu 			}
3812da7f033dSHerbert Xu 		}
3813da7f033dSHerbert Xu 	}, {
3814946cc463STadeusz Struk 		.alg = "rsa",
3815946cc463STadeusz Struk 		.test = alg_test_akcipher,
3816946cc463STadeusz Struk 		.fips_allowed = 1,
3817946cc463STadeusz Struk 		.suite = {
3818946cc463STadeusz Struk 			.akcipher = {
3819946cc463STadeusz Struk 				.vecs = rsa_tv_template,
3820946cc463STadeusz Struk 				.count = RSA_TEST_VECTORS
3821946cc463STadeusz Struk 			}
3822946cc463STadeusz Struk 		}
3823946cc463STadeusz Struk 	}, {
3824da7f033dSHerbert Xu 		.alg = "salsa20",
38251aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3826da7f033dSHerbert Xu 		.suite = {
3827da7f033dSHerbert Xu 			.cipher = {
3828da7f033dSHerbert Xu 				.enc = {
3829da7f033dSHerbert Xu 					.vecs = salsa20_stream_enc_tv_template,
3830da7f033dSHerbert Xu 					.count = SALSA20_STREAM_ENC_TEST_VECTORS
3831da7f033dSHerbert Xu 				}
3832da7f033dSHerbert Xu 			}
3833da7f033dSHerbert Xu 		}
3834da7f033dSHerbert Xu 	}, {
3835da7f033dSHerbert Xu 		.alg = "sha1",
3836da7f033dSHerbert Xu 		.test = alg_test_hash,
3837a1915d51SJarod Wilson 		.fips_allowed = 1,
3838da7f033dSHerbert Xu 		.suite = {
3839da7f033dSHerbert Xu 			.hash = {
3840da7f033dSHerbert Xu 				.vecs = sha1_tv_template,
3841da7f033dSHerbert Xu 				.count = SHA1_TEST_VECTORS
3842da7f033dSHerbert Xu 			}
3843da7f033dSHerbert Xu 		}
3844da7f033dSHerbert Xu 	}, {
3845da7f033dSHerbert Xu 		.alg = "sha224",
3846da7f033dSHerbert Xu 		.test = alg_test_hash,
3847a1915d51SJarod Wilson 		.fips_allowed = 1,
3848da7f033dSHerbert Xu 		.suite = {
3849da7f033dSHerbert Xu 			.hash = {
3850da7f033dSHerbert Xu 				.vecs = sha224_tv_template,
3851da7f033dSHerbert Xu 				.count = SHA224_TEST_VECTORS
3852da7f033dSHerbert Xu 			}
3853da7f033dSHerbert Xu 		}
3854da7f033dSHerbert Xu 	}, {
3855da7f033dSHerbert Xu 		.alg = "sha256",
3856da7f033dSHerbert Xu 		.test = alg_test_hash,
3857a1915d51SJarod Wilson 		.fips_allowed = 1,
3858da7f033dSHerbert Xu 		.suite = {
3859da7f033dSHerbert Xu 			.hash = {
3860da7f033dSHerbert Xu 				.vecs = sha256_tv_template,
3861da7f033dSHerbert Xu 				.count = SHA256_TEST_VECTORS
3862da7f033dSHerbert Xu 			}
3863da7f033dSHerbert Xu 		}
3864da7f033dSHerbert Xu 	}, {
386579cc6ab8Sraveendra padasalagi 		.alg = "sha3-224",
386679cc6ab8Sraveendra padasalagi 		.test = alg_test_hash,
386779cc6ab8Sraveendra padasalagi 		.fips_allowed = 1,
386879cc6ab8Sraveendra padasalagi 		.suite = {
386979cc6ab8Sraveendra padasalagi 			.hash = {
387079cc6ab8Sraveendra padasalagi 				.vecs = sha3_224_tv_template,
387179cc6ab8Sraveendra padasalagi 				.count = SHA3_224_TEST_VECTORS
387279cc6ab8Sraveendra padasalagi 			}
387379cc6ab8Sraveendra padasalagi 		}
387479cc6ab8Sraveendra padasalagi 	}, {
387579cc6ab8Sraveendra padasalagi 		.alg = "sha3-256",
387679cc6ab8Sraveendra padasalagi 		.test = alg_test_hash,
387779cc6ab8Sraveendra padasalagi 		.fips_allowed = 1,
387879cc6ab8Sraveendra padasalagi 		.suite = {
387979cc6ab8Sraveendra padasalagi 			.hash = {
388079cc6ab8Sraveendra padasalagi 				.vecs = sha3_256_tv_template,
388179cc6ab8Sraveendra padasalagi 				.count = SHA3_256_TEST_VECTORS
388279cc6ab8Sraveendra padasalagi 			}
388379cc6ab8Sraveendra padasalagi 		}
388479cc6ab8Sraveendra padasalagi 	}, {
388579cc6ab8Sraveendra padasalagi 		.alg = "sha3-384",
388679cc6ab8Sraveendra padasalagi 		.test = alg_test_hash,
388779cc6ab8Sraveendra padasalagi 		.fips_allowed = 1,
388879cc6ab8Sraveendra padasalagi 		.suite = {
388979cc6ab8Sraveendra padasalagi 			.hash = {
389079cc6ab8Sraveendra padasalagi 				.vecs = sha3_384_tv_template,
389179cc6ab8Sraveendra padasalagi 				.count = SHA3_384_TEST_VECTORS
389279cc6ab8Sraveendra padasalagi 			}
389379cc6ab8Sraveendra padasalagi 		}
389479cc6ab8Sraveendra padasalagi 	}, {
389579cc6ab8Sraveendra padasalagi 		.alg = "sha3-512",
389679cc6ab8Sraveendra padasalagi 		.test = alg_test_hash,
389779cc6ab8Sraveendra padasalagi 		.fips_allowed = 1,
389879cc6ab8Sraveendra padasalagi 		.suite = {
389979cc6ab8Sraveendra padasalagi 			.hash = {
390079cc6ab8Sraveendra padasalagi 				.vecs = sha3_512_tv_template,
390179cc6ab8Sraveendra padasalagi 				.count = SHA3_512_TEST_VECTORS
390279cc6ab8Sraveendra padasalagi 			}
390379cc6ab8Sraveendra padasalagi 		}
390479cc6ab8Sraveendra padasalagi 	}, {
3905da7f033dSHerbert Xu 		.alg = "sha384",
3906da7f033dSHerbert Xu 		.test = alg_test_hash,
3907a1915d51SJarod Wilson 		.fips_allowed = 1,
3908da7f033dSHerbert Xu 		.suite = {
3909da7f033dSHerbert Xu 			.hash = {
3910da7f033dSHerbert Xu 				.vecs = sha384_tv_template,
3911da7f033dSHerbert Xu 				.count = SHA384_TEST_VECTORS
3912da7f033dSHerbert Xu 			}
3913da7f033dSHerbert Xu 		}
3914da7f033dSHerbert Xu 	}, {
3915da7f033dSHerbert Xu 		.alg = "sha512",
3916da7f033dSHerbert Xu 		.test = alg_test_hash,
3917a1915d51SJarod Wilson 		.fips_allowed = 1,
3918da7f033dSHerbert Xu 		.suite = {
3919da7f033dSHerbert Xu 			.hash = {
3920da7f033dSHerbert Xu 				.vecs = sha512_tv_template,
3921da7f033dSHerbert Xu 				.count = SHA512_TEST_VECTORS
3922da7f033dSHerbert Xu 			}
3923da7f033dSHerbert Xu 		}
3924da7f033dSHerbert Xu 	}, {
3925da7f033dSHerbert Xu 		.alg = "tgr128",
3926da7f033dSHerbert Xu 		.test = alg_test_hash,
3927da7f033dSHerbert Xu 		.suite = {
3928da7f033dSHerbert Xu 			.hash = {
3929da7f033dSHerbert Xu 				.vecs = tgr128_tv_template,
3930da7f033dSHerbert Xu 				.count = TGR128_TEST_VECTORS
3931da7f033dSHerbert Xu 			}
3932da7f033dSHerbert Xu 		}
3933da7f033dSHerbert Xu 	}, {
3934da7f033dSHerbert Xu 		.alg = "tgr160",
3935da7f033dSHerbert Xu 		.test = alg_test_hash,
3936da7f033dSHerbert Xu 		.suite = {
3937da7f033dSHerbert Xu 			.hash = {
3938da7f033dSHerbert Xu 				.vecs = tgr160_tv_template,
3939da7f033dSHerbert Xu 				.count = TGR160_TEST_VECTORS
3940da7f033dSHerbert Xu 			}
3941da7f033dSHerbert Xu 		}
3942da7f033dSHerbert Xu 	}, {
3943da7f033dSHerbert Xu 		.alg = "tgr192",
3944da7f033dSHerbert Xu 		.test = alg_test_hash,
3945da7f033dSHerbert Xu 		.suite = {
3946da7f033dSHerbert Xu 			.hash = {
3947da7f033dSHerbert Xu 				.vecs = tgr192_tv_template,
3948da7f033dSHerbert Xu 				.count = TGR192_TEST_VECTORS
3949da7f033dSHerbert Xu 			}
3950da7f033dSHerbert Xu 		}
3951da7f033dSHerbert Xu 	}, {
3952f1939f7cSShane Wang 		.alg = "vmac(aes)",
3953f1939f7cSShane Wang 		.test = alg_test_hash,
3954f1939f7cSShane Wang 		.suite = {
3955f1939f7cSShane Wang 			.hash = {
3956f1939f7cSShane Wang 				.vecs = aes_vmac128_tv_template,
3957f1939f7cSShane Wang 				.count = VMAC_AES_TEST_VECTORS
3958f1939f7cSShane Wang 			}
3959f1939f7cSShane Wang 		}
3960f1939f7cSShane Wang 	}, {
3961da7f033dSHerbert Xu 		.alg = "wp256",
3962da7f033dSHerbert Xu 		.test = alg_test_hash,
3963da7f033dSHerbert Xu 		.suite = {
3964da7f033dSHerbert Xu 			.hash = {
3965da7f033dSHerbert Xu 				.vecs = wp256_tv_template,
3966da7f033dSHerbert Xu 				.count = WP256_TEST_VECTORS
3967da7f033dSHerbert Xu 			}
3968da7f033dSHerbert Xu 		}
3969da7f033dSHerbert Xu 	}, {
3970da7f033dSHerbert Xu 		.alg = "wp384",
3971da7f033dSHerbert Xu 		.test = alg_test_hash,
3972da7f033dSHerbert Xu 		.suite = {
3973da7f033dSHerbert Xu 			.hash = {
3974da7f033dSHerbert Xu 				.vecs = wp384_tv_template,
3975da7f033dSHerbert Xu 				.count = WP384_TEST_VECTORS
3976da7f033dSHerbert Xu 			}
3977da7f033dSHerbert Xu 		}
3978da7f033dSHerbert Xu 	}, {
3979da7f033dSHerbert Xu 		.alg = "wp512",
3980da7f033dSHerbert Xu 		.test = alg_test_hash,
3981da7f033dSHerbert Xu 		.suite = {
3982da7f033dSHerbert Xu 			.hash = {
3983da7f033dSHerbert Xu 				.vecs = wp512_tv_template,
3984da7f033dSHerbert Xu 				.count = WP512_TEST_VECTORS
3985da7f033dSHerbert Xu 			}
3986da7f033dSHerbert Xu 		}
3987da7f033dSHerbert Xu 	}, {
3988da7f033dSHerbert Xu 		.alg = "xcbc(aes)",
3989da7f033dSHerbert Xu 		.test = alg_test_hash,
3990da7f033dSHerbert Xu 		.suite = {
3991da7f033dSHerbert Xu 			.hash = {
3992da7f033dSHerbert Xu 				.vecs = aes_xcbc128_tv_template,
3993da7f033dSHerbert Xu 				.count = XCBC_AES_TEST_VECTORS
3994da7f033dSHerbert Xu 			}
3995da7f033dSHerbert Xu 		}
3996da7f033dSHerbert Xu 	}, {
3997da7f033dSHerbert Xu 		.alg = "xts(aes)",
39981aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
39992918aa8dSJarod Wilson 		.fips_allowed = 1,
4000da7f033dSHerbert Xu 		.suite = {
4001da7f033dSHerbert Xu 			.cipher = {
4002da7f033dSHerbert Xu 				.enc = {
4003da7f033dSHerbert Xu 					.vecs = aes_xts_enc_tv_template,
4004da7f033dSHerbert Xu 					.count = AES_XTS_ENC_TEST_VECTORS
4005da7f033dSHerbert Xu 				},
4006da7f033dSHerbert Xu 				.dec = {
4007da7f033dSHerbert Xu 					.vecs = aes_xts_dec_tv_template,
4008da7f033dSHerbert Xu 					.count = AES_XTS_DEC_TEST_VECTORS
4009da7f033dSHerbert Xu 				}
4010da7f033dSHerbert Xu 			}
4011da7f033dSHerbert Xu 		}
40120c01aed5SGeert Uytterhoeven 	}, {
40130840605eSJussi Kivilinna 		.alg = "xts(camellia)",
40140840605eSJussi Kivilinna 		.test = alg_test_skcipher,
40150840605eSJussi Kivilinna 		.suite = {
40160840605eSJussi Kivilinna 			.cipher = {
40170840605eSJussi Kivilinna 				.enc = {
40180840605eSJussi Kivilinna 					.vecs = camellia_xts_enc_tv_template,
40190840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_ENC_TEST_VECTORS
40200840605eSJussi Kivilinna 				},
40210840605eSJussi Kivilinna 				.dec = {
40220840605eSJussi Kivilinna 					.vecs = camellia_xts_dec_tv_template,
40230840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_DEC_TEST_VECTORS
40240840605eSJussi Kivilinna 				}
40250840605eSJussi Kivilinna 			}
40260840605eSJussi Kivilinna 		}
40270840605eSJussi Kivilinna 	}, {
40289b8b0405SJohannes Goetzfried 		.alg = "xts(cast6)",
40299b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
40309b8b0405SJohannes Goetzfried 		.suite = {
40319b8b0405SJohannes Goetzfried 			.cipher = {
40329b8b0405SJohannes Goetzfried 				.enc = {
40339b8b0405SJohannes Goetzfried 					.vecs = cast6_xts_enc_tv_template,
40349b8b0405SJohannes Goetzfried 					.count = CAST6_XTS_ENC_TEST_VECTORS
40359b8b0405SJohannes Goetzfried 				},
40369b8b0405SJohannes Goetzfried 				.dec = {
40379b8b0405SJohannes Goetzfried 					.vecs = cast6_xts_dec_tv_template,
40389b8b0405SJohannes Goetzfried 					.count = CAST6_XTS_DEC_TEST_VECTORS
40399b8b0405SJohannes Goetzfried 				}
40409b8b0405SJohannes Goetzfried 			}
40419b8b0405SJohannes Goetzfried 		}
40429b8b0405SJohannes Goetzfried 	}, {
404318be20b9SJussi Kivilinna 		.alg = "xts(serpent)",
404418be20b9SJussi Kivilinna 		.test = alg_test_skcipher,
404518be20b9SJussi Kivilinna 		.suite = {
404618be20b9SJussi Kivilinna 			.cipher = {
404718be20b9SJussi Kivilinna 				.enc = {
404818be20b9SJussi Kivilinna 					.vecs = serpent_xts_enc_tv_template,
404918be20b9SJussi Kivilinna 					.count = SERPENT_XTS_ENC_TEST_VECTORS
405018be20b9SJussi Kivilinna 				},
405118be20b9SJussi Kivilinna 				.dec = {
405218be20b9SJussi Kivilinna 					.vecs = serpent_xts_dec_tv_template,
405318be20b9SJussi Kivilinna 					.count = SERPENT_XTS_DEC_TEST_VECTORS
405418be20b9SJussi Kivilinna 				}
405518be20b9SJussi Kivilinna 			}
405618be20b9SJussi Kivilinna 		}
405718be20b9SJussi Kivilinna 	}, {
4058aed265b9SJussi Kivilinna 		.alg = "xts(twofish)",
4059aed265b9SJussi Kivilinna 		.test = alg_test_skcipher,
4060aed265b9SJussi Kivilinna 		.suite = {
4061aed265b9SJussi Kivilinna 			.cipher = {
4062aed265b9SJussi Kivilinna 				.enc = {
4063aed265b9SJussi Kivilinna 					.vecs = tf_xts_enc_tv_template,
4064aed265b9SJussi Kivilinna 					.count = TF_XTS_ENC_TEST_VECTORS
4065aed265b9SJussi Kivilinna 				},
4066aed265b9SJussi Kivilinna 				.dec = {
4067aed265b9SJussi Kivilinna 					.vecs = tf_xts_dec_tv_template,
4068aed265b9SJussi Kivilinna 					.count = TF_XTS_DEC_TEST_VECTORS
4069aed265b9SJussi Kivilinna 				}
4070aed265b9SJussi Kivilinna 			}
4071aed265b9SJussi Kivilinna 		}
4072da7f033dSHerbert Xu 	}
4073da7f033dSHerbert Xu };
4074da7f033dSHerbert Xu 
40755714758bSJussi Kivilinna static bool alg_test_descs_checked;
40765714758bSJussi Kivilinna 
40775714758bSJussi Kivilinna static void alg_test_descs_check_order(void)
40785714758bSJussi Kivilinna {
40795714758bSJussi Kivilinna 	int i;
40805714758bSJussi Kivilinna 
40815714758bSJussi Kivilinna 	/* only check once */
40825714758bSJussi Kivilinna 	if (alg_test_descs_checked)
40835714758bSJussi Kivilinna 		return;
40845714758bSJussi Kivilinna 
40855714758bSJussi Kivilinna 	alg_test_descs_checked = true;
40865714758bSJussi Kivilinna 
40875714758bSJussi Kivilinna 	for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) {
40885714758bSJussi Kivilinna 		int diff = strcmp(alg_test_descs[i - 1].alg,
40895714758bSJussi Kivilinna 				  alg_test_descs[i].alg);
40905714758bSJussi Kivilinna 
40915714758bSJussi Kivilinna 		if (WARN_ON(diff > 0)) {
40925714758bSJussi Kivilinna 			pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n",
40935714758bSJussi Kivilinna 				alg_test_descs[i - 1].alg,
40945714758bSJussi Kivilinna 				alg_test_descs[i].alg);
40955714758bSJussi Kivilinna 		}
40965714758bSJussi Kivilinna 
40975714758bSJussi Kivilinna 		if (WARN_ON(diff == 0)) {
40985714758bSJussi Kivilinna 			pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n",
40995714758bSJussi Kivilinna 				alg_test_descs[i].alg);
41005714758bSJussi Kivilinna 		}
41015714758bSJussi Kivilinna 	}
41025714758bSJussi Kivilinna }
41035714758bSJussi Kivilinna 
41041aa4ecd9SHerbert Xu static int alg_find_test(const char *alg)
4105da7f033dSHerbert Xu {
4106da7f033dSHerbert Xu 	int start = 0;
4107da7f033dSHerbert Xu 	int end = ARRAY_SIZE(alg_test_descs);
4108da7f033dSHerbert Xu 
4109da7f033dSHerbert Xu 	while (start < end) {
4110da7f033dSHerbert Xu 		int i = (start + end) / 2;
4111da7f033dSHerbert Xu 		int diff = strcmp(alg_test_descs[i].alg, alg);
4112da7f033dSHerbert Xu 
4113da7f033dSHerbert Xu 		if (diff > 0) {
4114da7f033dSHerbert Xu 			end = i;
4115da7f033dSHerbert Xu 			continue;
4116da7f033dSHerbert Xu 		}
4117da7f033dSHerbert Xu 
4118da7f033dSHerbert Xu 		if (diff < 0) {
4119da7f033dSHerbert Xu 			start = i + 1;
4120da7f033dSHerbert Xu 			continue;
4121da7f033dSHerbert Xu 		}
4122da7f033dSHerbert Xu 
41231aa4ecd9SHerbert Xu 		return i;
4124da7f033dSHerbert Xu 	}
4125da7f033dSHerbert Xu 
41261aa4ecd9SHerbert Xu 	return -1;
41271aa4ecd9SHerbert Xu }
41281aa4ecd9SHerbert Xu 
41291aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
41301aa4ecd9SHerbert Xu {
41311aa4ecd9SHerbert Xu 	int i;
4132a68f6610SHerbert Xu 	int j;
4133d12d6b6dSNeil Horman 	int rc;
41341aa4ecd9SHerbert Xu 
41359e5c9fe4SRichard W.M. Jones 	if (!fips_enabled && notests) {
41369e5c9fe4SRichard W.M. Jones 		printk_once(KERN_INFO "alg: self-tests disabled\n");
41379e5c9fe4SRichard W.M. Jones 		return 0;
41389e5c9fe4SRichard W.M. Jones 	}
41399e5c9fe4SRichard W.M. Jones 
41405714758bSJussi Kivilinna 	alg_test_descs_check_order();
41415714758bSJussi Kivilinna 
41421aa4ecd9SHerbert Xu 	if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
41431aa4ecd9SHerbert Xu 		char nalg[CRYPTO_MAX_ALG_NAME];
41441aa4ecd9SHerbert Xu 
41451aa4ecd9SHerbert Xu 		if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
41461aa4ecd9SHerbert Xu 		    sizeof(nalg))
41471aa4ecd9SHerbert Xu 			return -ENAMETOOLONG;
41481aa4ecd9SHerbert Xu 
41491aa4ecd9SHerbert Xu 		i = alg_find_test(nalg);
41501aa4ecd9SHerbert Xu 		if (i < 0)
41511aa4ecd9SHerbert Xu 			goto notest;
41521aa4ecd9SHerbert Xu 
4153a3bef3a3SJarod Wilson 		if (fips_enabled && !alg_test_descs[i].fips_allowed)
4154a3bef3a3SJarod Wilson 			goto non_fips_alg;
4155a3bef3a3SJarod Wilson 
4156941fb328SJarod Wilson 		rc = alg_test_cipher(alg_test_descs + i, driver, type, mask);
4157941fb328SJarod Wilson 		goto test_done;
41581aa4ecd9SHerbert Xu 	}
41591aa4ecd9SHerbert Xu 
41601aa4ecd9SHerbert Xu 	i = alg_find_test(alg);
4161a68f6610SHerbert Xu 	j = alg_find_test(driver);
4162a68f6610SHerbert Xu 	if (i < 0 && j < 0)
41631aa4ecd9SHerbert Xu 		goto notest;
41641aa4ecd9SHerbert Xu 
4165a68f6610SHerbert Xu 	if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
4166a68f6610SHerbert Xu 			     (j >= 0 && !alg_test_descs[j].fips_allowed)))
4167a3bef3a3SJarod Wilson 		goto non_fips_alg;
4168a3bef3a3SJarod Wilson 
4169a68f6610SHerbert Xu 	rc = 0;
4170a68f6610SHerbert Xu 	if (i >= 0)
4171a68f6610SHerbert Xu 		rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
41721aa4ecd9SHerbert Xu 					     type, mask);
4173032c8cacSCristian Stoica 	if (j >= 0 && j != i)
4174a68f6610SHerbert Xu 		rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
4175a68f6610SHerbert Xu 					     type, mask);
4176a68f6610SHerbert Xu 
4177941fb328SJarod Wilson test_done:
4178d12d6b6dSNeil Horman 	if (fips_enabled && rc)
4179d12d6b6dSNeil Horman 		panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
4180d12d6b6dSNeil Horman 
418129ecd4abSJarod Wilson 	if (fips_enabled && !rc)
41823e8cffd4SMasanari Iida 		pr_info("alg: self-tests for %s (%s) passed\n", driver, alg);
418329ecd4abSJarod Wilson 
4184d12d6b6dSNeil Horman 	return rc;
41851aa4ecd9SHerbert Xu 
41861aa4ecd9SHerbert Xu notest:
4187da7f033dSHerbert Xu 	printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
4188da7f033dSHerbert Xu 	return 0;
4189a3bef3a3SJarod Wilson non_fips_alg:
4190a3bef3a3SJarod Wilson 	return -EINVAL;
4191da7f033dSHerbert Xu }
41920b767f96SAlexander Shishkin 
4193326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
41940b767f96SAlexander Shishkin 
4195da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test);
4196