xref: /openbmc/linux/crypto/testmgr.c (revision df27b26f)
1da7f033dSHerbert Xu /*
2da7f033dSHerbert Xu  * Algorithm testing framework and tests.
3da7f033dSHerbert Xu  *
4da7f033dSHerbert Xu  * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
5da7f033dSHerbert Xu  * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
6da7f033dSHerbert Xu  * Copyright (c) 2007 Nokia Siemens Networks
7da7f033dSHerbert Xu  * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
8da7f033dSHerbert Xu  *
969435b94SAdrian Hoban  * Updated RFC4106 AES-GCM testing.
1069435b94SAdrian Hoban  *    Authors: Aidan O'Mahony (aidan.o.mahony@intel.com)
1169435b94SAdrian Hoban  *             Adrian Hoban <adrian.hoban@intel.com>
1269435b94SAdrian Hoban  *             Gabriele Paoloni <gabriele.paoloni@intel.com>
1369435b94SAdrian Hoban  *             Tadeusz Struk (tadeusz.struk@intel.com)
1469435b94SAdrian Hoban  *    Copyright (c) 2010, Intel Corporation.
1569435b94SAdrian Hoban  *
16da7f033dSHerbert Xu  * This program is free software; you can redistribute it and/or modify it
17da7f033dSHerbert Xu  * under the terms of the GNU General Public License as published by the Free
18da7f033dSHerbert Xu  * Software Foundation; either version 2 of the License, or (at your option)
19da7f033dSHerbert Xu  * any later version.
20da7f033dSHerbert Xu  *
21da7f033dSHerbert Xu  */
22da7f033dSHerbert Xu 
231ce33115SHerbert Xu #include <crypto/aead.h>
24da7f033dSHerbert Xu #include <crypto/hash.h>
2512773d93SHerbert Xu #include <crypto/skcipher.h>
26da7f033dSHerbert Xu #include <linux/err.h>
271c41b882SHerbert Xu #include <linux/fips.h>
28da7f033dSHerbert Xu #include <linux/module.h>
29da7f033dSHerbert Xu #include <linux/scatterlist.h>
30da7f033dSHerbert Xu #include <linux/slab.h>
31da7f033dSHerbert Xu #include <linux/string.h>
327647d6ceSJarod Wilson #include <crypto/rng.h>
3364d1cdfbSStephan Mueller #include <crypto/drbg.h>
34946cc463STadeusz Struk #include <crypto/akcipher.h>
35da7f033dSHerbert Xu 
36da7f033dSHerbert Xu #include "internal.h"
370b767f96SAlexander Shishkin 
38326a6346SHerbert Xu #ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS
390b767f96SAlexander Shishkin 
400b767f96SAlexander Shishkin /* a perfect nop */
410b767f96SAlexander Shishkin int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
420b767f96SAlexander Shishkin {
430b767f96SAlexander Shishkin 	return 0;
440b767f96SAlexander Shishkin }
450b767f96SAlexander Shishkin 
460b767f96SAlexander Shishkin #else
470b767f96SAlexander Shishkin 
48da7f033dSHerbert Xu #include "testmgr.h"
49da7f033dSHerbert Xu 
50da7f033dSHerbert Xu /*
51da7f033dSHerbert Xu  * Need slab memory for testing (size in number of pages).
52da7f033dSHerbert Xu  */
53da7f033dSHerbert Xu #define XBUFSIZE	8
54da7f033dSHerbert Xu 
55da7f033dSHerbert Xu /*
56da7f033dSHerbert Xu  * Indexes into the xbuf to simulate cross-page access.
57da7f033dSHerbert Xu  */
58da7f033dSHerbert Xu #define IDX1		32
59da7f033dSHerbert Xu #define IDX2		32400
60da7f033dSHerbert Xu #define IDX3		1
61da7f033dSHerbert Xu #define IDX4		8193
62da7f033dSHerbert Xu #define IDX5		22222
63da7f033dSHerbert Xu #define IDX6		17101
64da7f033dSHerbert Xu #define IDX7		27333
65da7f033dSHerbert Xu #define IDX8		3000
66da7f033dSHerbert Xu 
67da7f033dSHerbert Xu /*
68da7f033dSHerbert Xu * Used by test_cipher()
69da7f033dSHerbert Xu */
70da7f033dSHerbert Xu #define ENCRYPT 1
71da7f033dSHerbert Xu #define DECRYPT 0
72da7f033dSHerbert Xu 
73da7f033dSHerbert Xu struct tcrypt_result {
74da7f033dSHerbert Xu 	struct completion completion;
75da7f033dSHerbert Xu 	int err;
76da7f033dSHerbert Xu };
77da7f033dSHerbert Xu 
78da7f033dSHerbert Xu struct aead_test_suite {
79da7f033dSHerbert Xu 	struct {
80da7f033dSHerbert Xu 		struct aead_testvec *vecs;
81da7f033dSHerbert Xu 		unsigned int count;
82da7f033dSHerbert Xu 	} enc, dec;
83da7f033dSHerbert Xu };
84da7f033dSHerbert Xu 
85da7f033dSHerbert Xu struct cipher_test_suite {
86da7f033dSHerbert Xu 	struct {
87da7f033dSHerbert Xu 		struct cipher_testvec *vecs;
88da7f033dSHerbert Xu 		unsigned int count;
89da7f033dSHerbert Xu 	} enc, dec;
90da7f033dSHerbert Xu };
91da7f033dSHerbert Xu 
92da7f033dSHerbert Xu struct comp_test_suite {
93da7f033dSHerbert Xu 	struct {
94da7f033dSHerbert Xu 		struct comp_testvec *vecs;
95da7f033dSHerbert Xu 		unsigned int count;
96da7f033dSHerbert Xu 	} comp, decomp;
97da7f033dSHerbert Xu };
98da7f033dSHerbert Xu 
99da7f033dSHerbert Xu struct hash_test_suite {
100da7f033dSHerbert Xu 	struct hash_testvec *vecs;
101da7f033dSHerbert Xu 	unsigned int count;
102da7f033dSHerbert Xu };
103da7f033dSHerbert Xu 
1047647d6ceSJarod Wilson struct cprng_test_suite {
1057647d6ceSJarod Wilson 	struct cprng_testvec *vecs;
1067647d6ceSJarod Wilson 	unsigned int count;
1077647d6ceSJarod Wilson };
1087647d6ceSJarod Wilson 
10964d1cdfbSStephan Mueller struct drbg_test_suite {
11064d1cdfbSStephan Mueller 	struct drbg_testvec *vecs;
11164d1cdfbSStephan Mueller 	unsigned int count;
11264d1cdfbSStephan Mueller };
11364d1cdfbSStephan Mueller 
114946cc463STadeusz Struk struct akcipher_test_suite {
115946cc463STadeusz Struk 	struct akcipher_testvec *vecs;
116946cc463STadeusz Struk 	unsigned int count;
117946cc463STadeusz Struk };
118946cc463STadeusz Struk 
119da7f033dSHerbert Xu struct alg_test_desc {
120da7f033dSHerbert Xu 	const char *alg;
121da7f033dSHerbert Xu 	int (*test)(const struct alg_test_desc *desc, const char *driver,
122da7f033dSHerbert Xu 		    u32 type, u32 mask);
123a1915d51SJarod Wilson 	int fips_allowed;	/* set if alg is allowed in fips mode */
124da7f033dSHerbert Xu 
125da7f033dSHerbert Xu 	union {
126da7f033dSHerbert Xu 		struct aead_test_suite aead;
127da7f033dSHerbert Xu 		struct cipher_test_suite cipher;
128da7f033dSHerbert Xu 		struct comp_test_suite comp;
129da7f033dSHerbert Xu 		struct hash_test_suite hash;
1307647d6ceSJarod Wilson 		struct cprng_test_suite cprng;
13164d1cdfbSStephan Mueller 		struct drbg_test_suite drbg;
132946cc463STadeusz Struk 		struct akcipher_test_suite akcipher;
133da7f033dSHerbert Xu 	} suite;
134da7f033dSHerbert Xu };
135da7f033dSHerbert Xu 
136da7f033dSHerbert Xu static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
137da7f033dSHerbert Xu 
138da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len)
139da7f033dSHerbert Xu {
140da7f033dSHerbert Xu 	print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
141da7f033dSHerbert Xu 			16, 1,
142da7f033dSHerbert Xu 			buf, len, false);
143da7f033dSHerbert Xu }
144da7f033dSHerbert Xu 
145da7f033dSHerbert Xu static void tcrypt_complete(struct crypto_async_request *req, int err)
146da7f033dSHerbert Xu {
147da7f033dSHerbert Xu 	struct tcrypt_result *res = req->data;
148da7f033dSHerbert Xu 
149da7f033dSHerbert Xu 	if (err == -EINPROGRESS)
150da7f033dSHerbert Xu 		return;
151da7f033dSHerbert Xu 
152da7f033dSHerbert Xu 	res->err = err;
153da7f033dSHerbert Xu 	complete(&res->completion);
154da7f033dSHerbert Xu }
155da7f033dSHerbert Xu 
156f8b0d4d0SHerbert Xu static int testmgr_alloc_buf(char *buf[XBUFSIZE])
157f8b0d4d0SHerbert Xu {
158f8b0d4d0SHerbert Xu 	int i;
159f8b0d4d0SHerbert Xu 
160f8b0d4d0SHerbert Xu 	for (i = 0; i < XBUFSIZE; i++) {
161f8b0d4d0SHerbert Xu 		buf[i] = (void *)__get_free_page(GFP_KERNEL);
162f8b0d4d0SHerbert Xu 		if (!buf[i])
163f8b0d4d0SHerbert Xu 			goto err_free_buf;
164f8b0d4d0SHerbert Xu 	}
165f8b0d4d0SHerbert Xu 
166f8b0d4d0SHerbert Xu 	return 0;
167f8b0d4d0SHerbert Xu 
168f8b0d4d0SHerbert Xu err_free_buf:
169f8b0d4d0SHerbert Xu 	while (i-- > 0)
170f8b0d4d0SHerbert Xu 		free_page((unsigned long)buf[i]);
171f8b0d4d0SHerbert Xu 
172f8b0d4d0SHerbert Xu 	return -ENOMEM;
173f8b0d4d0SHerbert Xu }
174f8b0d4d0SHerbert Xu 
175f8b0d4d0SHerbert Xu static void testmgr_free_buf(char *buf[XBUFSIZE])
176f8b0d4d0SHerbert Xu {
177f8b0d4d0SHerbert Xu 	int i;
178f8b0d4d0SHerbert Xu 
179f8b0d4d0SHerbert Xu 	for (i = 0; i < XBUFSIZE; i++)
180f8b0d4d0SHerbert Xu 		free_page((unsigned long)buf[i]);
181f8b0d4d0SHerbert Xu }
182f8b0d4d0SHerbert Xu 
183d4c85f9bSCristian Stoica static int wait_async_op(struct tcrypt_result *tr, int ret)
184a8f1a052SDavid S. Miller {
185a8f1a052SDavid S. Miller 	if (ret == -EINPROGRESS || ret == -EBUSY) {
1868a45ac12SRabin Vincent 		wait_for_completion(&tr->completion);
18716735d02SWolfram Sang 		reinit_completion(&tr->completion);
1888a45ac12SRabin Vincent 		ret = tr->err;
189a8f1a052SDavid S. Miller 	}
190a8f1a052SDavid S. Miller 	return ret;
191a8f1a052SDavid S. Miller }
192a8f1a052SDavid S. Miller 
193018ba95cSWang, Rui Y static int ahash_partial_update(struct ahash_request **preq,
194018ba95cSWang, Rui Y 	struct crypto_ahash *tfm, struct hash_testvec *template,
195018ba95cSWang, Rui Y 	void *hash_buff, int k, int temp, struct scatterlist *sg,
196018ba95cSWang, Rui Y 	const char *algo, char *result, struct tcrypt_result *tresult)
197018ba95cSWang, Rui Y {
198018ba95cSWang, Rui Y 	char *state;
199018ba95cSWang, Rui Y 	struct ahash_request *req;
200018ba95cSWang, Rui Y 	int statesize, ret = -EINVAL;
201018ba95cSWang, Rui Y 
202018ba95cSWang, Rui Y 	req = *preq;
203018ba95cSWang, Rui Y 	statesize = crypto_ahash_statesize(
204018ba95cSWang, Rui Y 			crypto_ahash_reqtfm(req));
205018ba95cSWang, Rui Y 	state = kmalloc(statesize, GFP_KERNEL);
206018ba95cSWang, Rui Y 	if (!state) {
207018ba95cSWang, Rui Y 		pr_err("alt: hash: Failed to alloc state for %s\n", algo);
208018ba95cSWang, Rui Y 		goto out_nostate;
209018ba95cSWang, Rui Y 	}
210018ba95cSWang, Rui Y 	ret = crypto_ahash_export(req, state);
211018ba95cSWang, Rui Y 	if (ret) {
212018ba95cSWang, Rui Y 		pr_err("alt: hash: Failed to export() for %s\n", algo);
213018ba95cSWang, Rui Y 		goto out;
214018ba95cSWang, Rui Y 	}
215018ba95cSWang, Rui Y 	ahash_request_free(req);
216018ba95cSWang, Rui Y 	req = ahash_request_alloc(tfm, GFP_KERNEL);
217018ba95cSWang, Rui Y 	if (!req) {
218018ba95cSWang, Rui Y 		pr_err("alg: hash: Failed to alloc request for %s\n", algo);
219018ba95cSWang, Rui Y 		goto out_noreq;
220018ba95cSWang, Rui Y 	}
221018ba95cSWang, Rui Y 	ahash_request_set_callback(req,
222018ba95cSWang, Rui Y 		CRYPTO_TFM_REQ_MAY_BACKLOG,
223018ba95cSWang, Rui Y 		tcrypt_complete, tresult);
224018ba95cSWang, Rui Y 
225018ba95cSWang, Rui Y 	memcpy(hash_buff, template->plaintext + temp,
226018ba95cSWang, Rui Y 		template->tap[k]);
227018ba95cSWang, Rui Y 	sg_init_one(&sg[0], hash_buff, template->tap[k]);
228018ba95cSWang, Rui Y 	ahash_request_set_crypt(req, sg, result, template->tap[k]);
229018ba95cSWang, Rui Y 	ret = crypto_ahash_import(req, state);
230018ba95cSWang, Rui Y 	if (ret) {
231018ba95cSWang, Rui Y 		pr_err("alg: hash: Failed to import() for %s\n", algo);
232018ba95cSWang, Rui Y 		goto out;
233018ba95cSWang, Rui Y 	}
234018ba95cSWang, Rui Y 	ret = wait_async_op(tresult, crypto_ahash_update(req));
235018ba95cSWang, Rui Y 	if (ret)
236018ba95cSWang, Rui Y 		goto out;
237018ba95cSWang, Rui Y 	*preq = req;
238018ba95cSWang, Rui Y 	ret = 0;
239018ba95cSWang, Rui Y 	goto out_noreq;
240018ba95cSWang, Rui Y out:
241018ba95cSWang, Rui Y 	ahash_request_free(req);
242018ba95cSWang, Rui Y out_noreq:
243018ba95cSWang, Rui Y 	kfree(state);
244018ba95cSWang, Rui Y out_nostate:
245018ba95cSWang, Rui Y 	return ret;
246018ba95cSWang, Rui Y }
247018ba95cSWang, Rui Y 
248da5ffe11SJussi Kivilinna static int __test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
249da5ffe11SJussi Kivilinna 		       unsigned int tcount, bool use_digest,
250da5ffe11SJussi Kivilinna 		       const int align_offset)
251da7f033dSHerbert Xu {
252da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
253da7f033dSHerbert Xu 	unsigned int i, j, k, temp;
254da7f033dSHerbert Xu 	struct scatterlist sg[8];
25529b77e5dSHoria Geanta 	char *result;
25629b77e5dSHoria Geanta 	char *key;
257da7f033dSHerbert Xu 	struct ahash_request *req;
258da7f033dSHerbert Xu 	struct tcrypt_result tresult;
259da7f033dSHerbert Xu 	void *hash_buff;
260f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
261f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
262f8b0d4d0SHerbert Xu 
26329b77e5dSHoria Geanta 	result = kmalloc(MAX_DIGEST_SIZE, GFP_KERNEL);
26429b77e5dSHoria Geanta 	if (!result)
26529b77e5dSHoria Geanta 		return ret;
26629b77e5dSHoria Geanta 	key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
26729b77e5dSHoria Geanta 	if (!key)
26829b77e5dSHoria Geanta 		goto out_nobuf;
269f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
270f8b0d4d0SHerbert Xu 		goto out_nobuf;
271da7f033dSHerbert Xu 
272da7f033dSHerbert Xu 	init_completion(&tresult.completion);
273da7f033dSHerbert Xu 
274da7f033dSHerbert Xu 	req = ahash_request_alloc(tfm, GFP_KERNEL);
275da7f033dSHerbert Xu 	if (!req) {
276da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to allocate request for "
277da7f033dSHerbert Xu 		       "%s\n", algo);
278da7f033dSHerbert Xu 		goto out_noreq;
279da7f033dSHerbert Xu 	}
280da7f033dSHerbert Xu 	ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
281da7f033dSHerbert Xu 				   tcrypt_complete, &tresult);
282da7f033dSHerbert Xu 
283a0cfae59SHerbert Xu 	j = 0;
284da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
285a0cfae59SHerbert Xu 		if (template[i].np)
286a0cfae59SHerbert Xu 			continue;
287a0cfae59SHerbert Xu 
288da5ffe11SJussi Kivilinna 		ret = -EINVAL;
289da5ffe11SJussi Kivilinna 		if (WARN_ON(align_offset + template[i].psize > PAGE_SIZE))
290da5ffe11SJussi Kivilinna 			goto out;
291da5ffe11SJussi Kivilinna 
292a0cfae59SHerbert Xu 		j++;
29329b77e5dSHoria Geanta 		memset(result, 0, MAX_DIGEST_SIZE);
294da7f033dSHerbert Xu 
295da7f033dSHerbert Xu 		hash_buff = xbuf[0];
296da5ffe11SJussi Kivilinna 		hash_buff += align_offset;
297da7f033dSHerbert Xu 
298da7f033dSHerbert Xu 		memcpy(hash_buff, template[i].plaintext, template[i].psize);
299da7f033dSHerbert Xu 		sg_init_one(&sg[0], hash_buff, template[i].psize);
300da7f033dSHerbert Xu 
301da7f033dSHerbert Xu 		if (template[i].ksize) {
302da7f033dSHerbert Xu 			crypto_ahash_clear_flags(tfm, ~0);
30329b77e5dSHoria Geanta 			if (template[i].ksize > MAX_KEYLEN) {
30429b77e5dSHoria Geanta 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
30529b77e5dSHoria Geanta 				       j, algo, template[i].ksize, MAX_KEYLEN);
30629b77e5dSHoria Geanta 				ret = -EINVAL;
30729b77e5dSHoria Geanta 				goto out;
30829b77e5dSHoria Geanta 			}
30929b77e5dSHoria Geanta 			memcpy(key, template[i].key, template[i].ksize);
31029b77e5dSHoria Geanta 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
311da7f033dSHerbert Xu 			if (ret) {
312da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: setkey failed on "
313a0cfae59SHerbert Xu 				       "test %d for %s: ret=%d\n", j, algo,
314da7f033dSHerbert Xu 				       -ret);
315da7f033dSHerbert Xu 				goto out;
316da7f033dSHerbert Xu 			}
317da7f033dSHerbert Xu 		}
318da7f033dSHerbert Xu 
319da7f033dSHerbert Xu 		ahash_request_set_crypt(req, sg, result, template[i].psize);
320a8f1a052SDavid S. Miller 		if (use_digest) {
321d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_digest(req));
322a8f1a052SDavid S. Miller 			if (ret) {
323a8f1a052SDavid S. Miller 				pr_err("alg: hash: digest failed on test %d "
324a0cfae59SHerbert Xu 				       "for %s: ret=%d\n", j, algo, -ret);
325da7f033dSHerbert Xu 				goto out;
326da7f033dSHerbert Xu 			}
327a8f1a052SDavid S. Miller 		} else {
328d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_init(req));
329a8f1a052SDavid S. Miller 			if (ret) {
330a8f1a052SDavid S. Miller 				pr_err("alt: hash: init failed on test %d "
331a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
332a8f1a052SDavid S. Miller 				goto out;
333a8f1a052SDavid S. Miller 			}
334d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_update(req));
335a8f1a052SDavid S. Miller 			if (ret) {
336a8f1a052SDavid S. Miller 				pr_err("alt: hash: update failed on test %d "
337a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
338a8f1a052SDavid S. Miller 				goto out;
339a8f1a052SDavid S. Miller 			}
340d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_final(req));
341a8f1a052SDavid S. Miller 			if (ret) {
342a8f1a052SDavid S. Miller 				pr_err("alt: hash: final failed on test %d "
343a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
344a8f1a052SDavid S. Miller 				goto out;
345a8f1a052SDavid S. Miller 			}
346a8f1a052SDavid S. Miller 		}
347da7f033dSHerbert Xu 
348da7f033dSHerbert Xu 		if (memcmp(result, template[i].digest,
349da7f033dSHerbert Xu 			   crypto_ahash_digestsize(tfm))) {
350da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
351a0cfae59SHerbert Xu 			       j, algo);
352da7f033dSHerbert Xu 			hexdump(result, crypto_ahash_digestsize(tfm));
353da7f033dSHerbert Xu 			ret = -EINVAL;
354da7f033dSHerbert Xu 			goto out;
355da7f033dSHerbert Xu 		}
356da7f033dSHerbert Xu 	}
357da7f033dSHerbert Xu 
358da7f033dSHerbert Xu 	j = 0;
359da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
360da5ffe11SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
361da5ffe11SJussi Kivilinna 		if (align_offset != 0)
362da5ffe11SJussi Kivilinna 			break;
363da5ffe11SJussi Kivilinna 
3645f2b424eSCristian Stoica 		if (!template[i].np)
3655f2b424eSCristian Stoica 			continue;
3665f2b424eSCristian Stoica 
367da7f033dSHerbert Xu 		j++;
36829b77e5dSHoria Geanta 		memset(result, 0, MAX_DIGEST_SIZE);
369da7f033dSHerbert Xu 
370da7f033dSHerbert Xu 		temp = 0;
371da7f033dSHerbert Xu 		sg_init_table(sg, template[i].np);
372fd57f22aSHerbert Xu 		ret = -EINVAL;
373da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
374fd57f22aSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
375fd57f22aSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
376fd57f22aSHerbert Xu 				goto out;
377da7f033dSHerbert Xu 			sg_set_buf(&sg[k],
378da7f033dSHerbert Xu 				   memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
379da7f033dSHerbert Xu 					  offset_in_page(IDX[k]),
380da7f033dSHerbert Xu 					  template[i].plaintext + temp,
381da7f033dSHerbert Xu 					  template[i].tap[k]),
382da7f033dSHerbert Xu 				   template[i].tap[k]);
383da7f033dSHerbert Xu 			temp += template[i].tap[k];
384da7f033dSHerbert Xu 		}
385da7f033dSHerbert Xu 
386da7f033dSHerbert Xu 		if (template[i].ksize) {
38729b77e5dSHoria Geanta 			if (template[i].ksize > MAX_KEYLEN) {
38829b77e5dSHoria Geanta 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
3895f2b424eSCristian Stoica 				       j, algo, template[i].ksize, MAX_KEYLEN);
39029b77e5dSHoria Geanta 				ret = -EINVAL;
39129b77e5dSHoria Geanta 				goto out;
39229b77e5dSHoria Geanta 			}
393da7f033dSHerbert Xu 			crypto_ahash_clear_flags(tfm, ~0);
39429b77e5dSHoria Geanta 			memcpy(key, template[i].key, template[i].ksize);
3955f2b424eSCristian Stoica 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
396da7f033dSHerbert Xu 
397da7f033dSHerbert Xu 			if (ret) {
398da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: setkey "
399da7f033dSHerbert Xu 				       "failed on chunking test %d "
4005f2b424eSCristian Stoica 				       "for %s: ret=%d\n", j, algo, -ret);
401da7f033dSHerbert Xu 				goto out;
402da7f033dSHerbert Xu 			}
403da7f033dSHerbert Xu 		}
404da7f033dSHerbert Xu 
4055f2b424eSCristian Stoica 		ahash_request_set_crypt(req, sg, result, template[i].psize);
406da7f033dSHerbert Xu 		ret = crypto_ahash_digest(req);
407da7f033dSHerbert Xu 		switch (ret) {
408da7f033dSHerbert Xu 		case 0:
409da7f033dSHerbert Xu 			break;
410da7f033dSHerbert Xu 		case -EINPROGRESS:
411da7f033dSHerbert Xu 		case -EBUSY:
4128a45ac12SRabin Vincent 			wait_for_completion(&tresult.completion);
41316735d02SWolfram Sang 			reinit_completion(&tresult.completion);
4148a45ac12SRabin Vincent 			ret = tresult.err;
4158a45ac12SRabin Vincent 			if (!ret)
416da7f033dSHerbert Xu 				break;
417da7f033dSHerbert Xu 			/* fall through */
418da7f033dSHerbert Xu 		default:
419da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: digest failed "
420da7f033dSHerbert Xu 			       "on chunking test %d for %s: "
421da7f033dSHerbert Xu 			       "ret=%d\n", j, algo, -ret);
422da7f033dSHerbert Xu 			goto out;
423da7f033dSHerbert Xu 		}
424da7f033dSHerbert Xu 
425da7f033dSHerbert Xu 		if (memcmp(result, template[i].digest,
426da7f033dSHerbert Xu 			   crypto_ahash_digestsize(tfm))) {
427da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: Chunking test %d "
428da7f033dSHerbert Xu 			       "failed for %s\n", j, algo);
429da7f033dSHerbert Xu 			hexdump(result, crypto_ahash_digestsize(tfm));
430da7f033dSHerbert Xu 			ret = -EINVAL;
431da7f033dSHerbert Xu 			goto out;
432da7f033dSHerbert Xu 		}
433da7f033dSHerbert Xu 	}
434da7f033dSHerbert Xu 
435018ba95cSWang, Rui Y 	/* partial update exercise */
436018ba95cSWang, Rui Y 	j = 0;
437018ba95cSWang, Rui Y 	for (i = 0; i < tcount; i++) {
438018ba95cSWang, Rui Y 		/* alignment tests are only done with continuous buffers */
439018ba95cSWang, Rui Y 		if (align_offset != 0)
440018ba95cSWang, Rui Y 			break;
441018ba95cSWang, Rui Y 
442018ba95cSWang, Rui Y 		if (template[i].np < 2)
443018ba95cSWang, Rui Y 			continue;
444018ba95cSWang, Rui Y 
445018ba95cSWang, Rui Y 		j++;
446018ba95cSWang, Rui Y 		memset(result, 0, MAX_DIGEST_SIZE);
447018ba95cSWang, Rui Y 
448018ba95cSWang, Rui Y 		ret = -EINVAL;
449018ba95cSWang, Rui Y 		hash_buff = xbuf[0];
450018ba95cSWang, Rui Y 		memcpy(hash_buff, template[i].plaintext,
451018ba95cSWang, Rui Y 			template[i].tap[0]);
452018ba95cSWang, Rui Y 		sg_init_one(&sg[0], hash_buff, template[i].tap[0]);
453018ba95cSWang, Rui Y 
454018ba95cSWang, Rui Y 		if (template[i].ksize) {
455018ba95cSWang, Rui Y 			crypto_ahash_clear_flags(tfm, ~0);
456018ba95cSWang, Rui Y 			if (template[i].ksize > MAX_KEYLEN) {
457018ba95cSWang, Rui Y 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
458018ba95cSWang, Rui Y 					j, algo, template[i].ksize, MAX_KEYLEN);
459018ba95cSWang, Rui Y 				ret = -EINVAL;
460018ba95cSWang, Rui Y 				goto out;
461018ba95cSWang, Rui Y 			}
462018ba95cSWang, Rui Y 			memcpy(key, template[i].key, template[i].ksize);
463018ba95cSWang, Rui Y 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
464018ba95cSWang, Rui Y 			if (ret) {
465018ba95cSWang, Rui Y 				pr_err("alg: hash: setkey failed on test %d for %s: ret=%d\n",
466018ba95cSWang, Rui Y 					j, algo, -ret);
467018ba95cSWang, Rui Y 				goto out;
468018ba95cSWang, Rui Y 			}
469018ba95cSWang, Rui Y 		}
470018ba95cSWang, Rui Y 
471018ba95cSWang, Rui Y 		ahash_request_set_crypt(req, sg, result, template[i].tap[0]);
472018ba95cSWang, Rui Y 		ret = wait_async_op(&tresult, crypto_ahash_init(req));
473018ba95cSWang, Rui Y 		if (ret) {
474018ba95cSWang, Rui Y 			pr_err("alt: hash: init failed on test %d for %s: ret=%d\n",
475018ba95cSWang, Rui Y 				j, algo, -ret);
476018ba95cSWang, Rui Y 			goto out;
477018ba95cSWang, Rui Y 		}
478018ba95cSWang, Rui Y 		ret = wait_async_op(&tresult, crypto_ahash_update(req));
479018ba95cSWang, Rui Y 		if (ret) {
480018ba95cSWang, Rui Y 			pr_err("alt: hash: update failed on test %d for %s: ret=%d\n",
481018ba95cSWang, Rui Y 				j, algo, -ret);
482018ba95cSWang, Rui Y 			goto out;
483018ba95cSWang, Rui Y 		}
484018ba95cSWang, Rui Y 
485018ba95cSWang, Rui Y 		temp = template[i].tap[0];
486018ba95cSWang, Rui Y 		for (k = 1; k < template[i].np; k++) {
487018ba95cSWang, Rui Y 			ret = ahash_partial_update(&req, tfm, &template[i],
488018ba95cSWang, Rui Y 				hash_buff, k, temp, &sg[0], algo, result,
489018ba95cSWang, Rui Y 				&tresult);
490018ba95cSWang, Rui Y 			if (ret) {
491018ba95cSWang, Rui Y 				pr_err("hash: partial update failed on test %d for %s: ret=%d\n",
492018ba95cSWang, Rui Y 					j, algo, -ret);
493018ba95cSWang, Rui Y 				goto out_noreq;
494018ba95cSWang, Rui Y 			}
495018ba95cSWang, Rui Y 			temp += template[i].tap[k];
496018ba95cSWang, Rui Y 		}
497018ba95cSWang, Rui Y 		ret = wait_async_op(&tresult, crypto_ahash_final(req));
498018ba95cSWang, Rui Y 		if (ret) {
499018ba95cSWang, Rui Y 			pr_err("alt: hash: final failed on test %d for %s: ret=%d\n",
500018ba95cSWang, Rui Y 				j, algo, -ret);
501018ba95cSWang, Rui Y 			goto out;
502018ba95cSWang, Rui Y 		}
503018ba95cSWang, Rui Y 		if (memcmp(result, template[i].digest,
504018ba95cSWang, Rui Y 			   crypto_ahash_digestsize(tfm))) {
505018ba95cSWang, Rui Y 			pr_err("alg: hash: Partial Test %d failed for %s\n",
506018ba95cSWang, Rui Y 			       j, algo);
507018ba95cSWang, Rui Y 			hexdump(result, crypto_ahash_digestsize(tfm));
508018ba95cSWang, Rui Y 			ret = -EINVAL;
509018ba95cSWang, Rui Y 			goto out;
510018ba95cSWang, Rui Y 		}
511018ba95cSWang, Rui Y 	}
512018ba95cSWang, Rui Y 
513da7f033dSHerbert Xu 	ret = 0;
514da7f033dSHerbert Xu 
515da7f033dSHerbert Xu out:
516da7f033dSHerbert Xu 	ahash_request_free(req);
517da7f033dSHerbert Xu out_noreq:
518f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
519f8b0d4d0SHerbert Xu out_nobuf:
52029b77e5dSHoria Geanta 	kfree(key);
52129b77e5dSHoria Geanta 	kfree(result);
522da7f033dSHerbert Xu 	return ret;
523da7f033dSHerbert Xu }
524da7f033dSHerbert Xu 
525da5ffe11SJussi Kivilinna static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
526da5ffe11SJussi Kivilinna 		     unsigned int tcount, bool use_digest)
527da5ffe11SJussi Kivilinna {
528da5ffe11SJussi Kivilinna 	unsigned int alignmask;
529da5ffe11SJussi Kivilinna 	int ret;
530da5ffe11SJussi Kivilinna 
531da5ffe11SJussi Kivilinna 	ret = __test_hash(tfm, template, tcount, use_digest, 0);
532da5ffe11SJussi Kivilinna 	if (ret)
533da5ffe11SJussi Kivilinna 		return ret;
534da5ffe11SJussi Kivilinna 
535da5ffe11SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
536da5ffe11SJussi Kivilinna 	ret = __test_hash(tfm, template, tcount, use_digest, 1);
537da5ffe11SJussi Kivilinna 	if (ret)
538da5ffe11SJussi Kivilinna 		return ret;
539da5ffe11SJussi Kivilinna 
540da5ffe11SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
541da5ffe11SJussi Kivilinna 	if (alignmask) {
542da5ffe11SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
543da5ffe11SJussi Kivilinna 		ret = __test_hash(tfm, template, tcount, use_digest,
544da5ffe11SJussi Kivilinna 				  alignmask + 1);
545da5ffe11SJussi Kivilinna 		if (ret)
546da5ffe11SJussi Kivilinna 			return ret;
547da5ffe11SJussi Kivilinna 	}
548da5ffe11SJussi Kivilinna 
549da5ffe11SJussi Kivilinna 	return 0;
550da5ffe11SJussi Kivilinna }
551da5ffe11SJussi Kivilinna 
552d8a32ac2SJussi Kivilinna static int __test_aead(struct crypto_aead *tfm, int enc,
553d8a32ac2SJussi Kivilinna 		       struct aead_testvec *template, unsigned int tcount,
55458dcf548SJussi Kivilinna 		       const bool diff_dst, const int align_offset)
555da7f033dSHerbert Xu {
556da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
557da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
558f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
559da7f033dSHerbert Xu 	char *q;
560da7f033dSHerbert Xu 	char *key;
561da7f033dSHerbert Xu 	struct aead_request *req;
562d8a32ac2SJussi Kivilinna 	struct scatterlist *sg;
563d8a32ac2SJussi Kivilinna 	struct scatterlist *sgout;
564d8a32ac2SJussi Kivilinna 	const char *e, *d;
565da7f033dSHerbert Xu 	struct tcrypt_result result;
566424a5da6SCristian Stoica 	unsigned int authsize, iv_len;
567da7f033dSHerbert Xu 	void *input;
568d8a32ac2SJussi Kivilinna 	void *output;
569da7f033dSHerbert Xu 	void *assoc;
5709bac019dSTadeusz Struk 	char *iv;
571f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
572d8a32ac2SJussi Kivilinna 	char *xoutbuf[XBUFSIZE];
573f8b0d4d0SHerbert Xu 	char *axbuf[XBUFSIZE];
574f8b0d4d0SHerbert Xu 
5759bac019dSTadeusz Struk 	iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
5769bac019dSTadeusz Struk 	if (!iv)
5779bac019dSTadeusz Struk 		return ret;
57829b77e5dSHoria Geanta 	key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
57929b77e5dSHoria Geanta 	if (!key)
58029b77e5dSHoria Geanta 		goto out_noxbuf;
581f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
582f8b0d4d0SHerbert Xu 		goto out_noxbuf;
583f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(axbuf))
584f8b0d4d0SHerbert Xu 		goto out_noaxbuf;
585d8a32ac2SJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
586d8a32ac2SJussi Kivilinna 		goto out_nooutbuf;
587d8a32ac2SJussi Kivilinna 
588d8a32ac2SJussi Kivilinna 	/* avoid "the frame size is larger than 1024 bytes" compiler warning */
5898a525fcdSHerbert Xu 	sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 4 : 2), GFP_KERNEL);
590d8a32ac2SJussi Kivilinna 	if (!sg)
591d8a32ac2SJussi Kivilinna 		goto out_nosg;
5928a525fcdSHerbert Xu 	sgout = &sg[16];
593d8a32ac2SJussi Kivilinna 
594d8a32ac2SJussi Kivilinna 	if (diff_dst)
595d8a32ac2SJussi Kivilinna 		d = "-ddst";
596d8a32ac2SJussi Kivilinna 	else
597d8a32ac2SJussi Kivilinna 		d = "";
598d8a32ac2SJussi Kivilinna 
599da7f033dSHerbert Xu 	if (enc == ENCRYPT)
600da7f033dSHerbert Xu 		e = "encryption";
601da7f033dSHerbert Xu 	else
602da7f033dSHerbert Xu 		e = "decryption";
603da7f033dSHerbert Xu 
604da7f033dSHerbert Xu 	init_completion(&result.completion);
605da7f033dSHerbert Xu 
606da7f033dSHerbert Xu 	req = aead_request_alloc(tfm, GFP_KERNEL);
607da7f033dSHerbert Xu 	if (!req) {
608d8a32ac2SJussi Kivilinna 		pr_err("alg: aead%s: Failed to allocate request for %s\n",
609d8a32ac2SJussi Kivilinna 		       d, algo);
610da7f033dSHerbert Xu 		goto out;
611da7f033dSHerbert Xu 	}
612da7f033dSHerbert Xu 
613da7f033dSHerbert Xu 	aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
614da7f033dSHerbert Xu 				  tcrypt_complete, &result);
615da7f033dSHerbert Xu 
616abfa7f43SJerome Marchand 	iv_len = crypto_aead_ivsize(tfm);
617abfa7f43SJerome Marchand 
618da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
61905b1d338SCristian Stoica 		if (template[i].np)
62005b1d338SCristian Stoica 			continue;
62105b1d338SCristian Stoica 
622da7f033dSHerbert Xu 		j++;
623da7f033dSHerbert Xu 
62458dcf548SJussi Kivilinna 		/* some templates have no input data but they will
625da7f033dSHerbert Xu 		 * touch input
626da7f033dSHerbert Xu 		 */
627da7f033dSHerbert Xu 		input = xbuf[0];
62858dcf548SJussi Kivilinna 		input += align_offset;
629da7f033dSHerbert Xu 		assoc = axbuf[0];
630da7f033dSHerbert Xu 
631fd57f22aSHerbert Xu 		ret = -EINVAL;
63258dcf548SJussi Kivilinna 		if (WARN_ON(align_offset + template[i].ilen >
63358dcf548SJussi Kivilinna 			    PAGE_SIZE || template[i].alen > PAGE_SIZE))
634fd57f22aSHerbert Xu 			goto out;
635fd57f22aSHerbert Xu 
636da7f033dSHerbert Xu 		memcpy(input, template[i].input, template[i].ilen);
637da7f033dSHerbert Xu 		memcpy(assoc, template[i].assoc, template[i].alen);
638da7f033dSHerbert Xu 		if (template[i].iv)
639424a5da6SCristian Stoica 			memcpy(iv, template[i].iv, iv_len);
640da7f033dSHerbert Xu 		else
641424a5da6SCristian Stoica 			memset(iv, 0, iv_len);
642da7f033dSHerbert Xu 
643da7f033dSHerbert Xu 		crypto_aead_clear_flags(tfm, ~0);
644da7f033dSHerbert Xu 		if (template[i].wk)
64505b1d338SCristian Stoica 			crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
646da7f033dSHerbert Xu 
64729b77e5dSHoria Geanta 		if (template[i].klen > MAX_KEYLEN) {
64829b77e5dSHoria Geanta 			pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
64929b77e5dSHoria Geanta 			       d, j, algo, template[i].klen,
65029b77e5dSHoria Geanta 			       MAX_KEYLEN);
65129b77e5dSHoria Geanta 			ret = -EINVAL;
65229b77e5dSHoria Geanta 			goto out;
65329b77e5dSHoria Geanta 		}
65429b77e5dSHoria Geanta 		memcpy(key, template[i].key, template[i].klen);
655da7f033dSHerbert Xu 
65605b1d338SCristian Stoica 		ret = crypto_aead_setkey(tfm, key, template[i].klen);
657da7f033dSHerbert Xu 		if (!ret == template[i].fail) {
658d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n",
659d8a32ac2SJussi Kivilinna 			       d, j, algo, crypto_aead_get_flags(tfm));
660da7f033dSHerbert Xu 			goto out;
661da7f033dSHerbert Xu 		} else if (ret)
662da7f033dSHerbert Xu 			continue;
663da7f033dSHerbert Xu 
664da7f033dSHerbert Xu 		authsize = abs(template[i].rlen - template[i].ilen);
665da7f033dSHerbert Xu 		ret = crypto_aead_setauthsize(tfm, authsize);
666da7f033dSHerbert Xu 		if (ret) {
667d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n",
668d8a32ac2SJussi Kivilinna 			       d, authsize, j, algo);
669da7f033dSHerbert Xu 			goto out;
670da7f033dSHerbert Xu 		}
671da7f033dSHerbert Xu 
6728a525fcdSHerbert Xu 		k = !!template[i].alen;
6738a525fcdSHerbert Xu 		sg_init_table(sg, k + 1);
6748a525fcdSHerbert Xu 		sg_set_buf(&sg[0], assoc, template[i].alen);
6758a525fcdSHerbert Xu 		sg_set_buf(&sg[k], input,
67605b1d338SCristian Stoica 			   template[i].ilen + (enc ? authsize : 0));
677d8a32ac2SJussi Kivilinna 		output = input;
678d8a32ac2SJussi Kivilinna 
6798a525fcdSHerbert Xu 		if (diff_dst) {
6808a525fcdSHerbert Xu 			sg_init_table(sgout, k + 1);
6818a525fcdSHerbert Xu 			sg_set_buf(&sgout[0], assoc, template[i].alen);
6828a525fcdSHerbert Xu 
6838a525fcdSHerbert Xu 			output = xoutbuf[0];
6848a525fcdSHerbert Xu 			output += align_offset;
6858a525fcdSHerbert Xu 			sg_set_buf(&sgout[k], output,
6868a525fcdSHerbert Xu 				   template[i].rlen + (enc ? 0 : authsize));
6878a525fcdSHerbert Xu 		}
688da7f033dSHerbert Xu 
689d8a32ac2SJussi Kivilinna 		aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
690da7f033dSHerbert Xu 				       template[i].ilen, iv);
691da7f033dSHerbert Xu 
6928a525fcdSHerbert Xu 		aead_request_set_ad(req, template[i].alen);
693da7f033dSHerbert Xu 
69405b1d338SCristian Stoica 		ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req);
695da7f033dSHerbert Xu 
696da7f033dSHerbert Xu 		switch (ret) {
697da7f033dSHerbert Xu 		case 0:
698e44a1b44SJarod Wilson 			if (template[i].novrfy) {
699e44a1b44SJarod Wilson 				/* verification was supposed to fail */
700d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n",
701d8a32ac2SJussi Kivilinna 				       d, e, j, algo);
702e44a1b44SJarod Wilson 				/* so really, we got a bad message */
703e44a1b44SJarod Wilson 				ret = -EBADMSG;
704e44a1b44SJarod Wilson 				goto out;
705e44a1b44SJarod Wilson 			}
706da7f033dSHerbert Xu 			break;
707da7f033dSHerbert Xu 		case -EINPROGRESS:
708da7f033dSHerbert Xu 		case -EBUSY:
7098a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
71016735d02SWolfram Sang 			reinit_completion(&result.completion);
7118a45ac12SRabin Vincent 			ret = result.err;
7128a45ac12SRabin Vincent 			if (!ret)
713da7f033dSHerbert Xu 				break;
714e44a1b44SJarod Wilson 		case -EBADMSG:
715e44a1b44SJarod Wilson 			if (template[i].novrfy)
716e44a1b44SJarod Wilson 				/* verification failure was expected */
717e44a1b44SJarod Wilson 				continue;
718da7f033dSHerbert Xu 			/* fall through */
719da7f033dSHerbert Xu 		default:
720d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n",
721d8a32ac2SJussi Kivilinna 			       d, e, j, algo, -ret);
722da7f033dSHerbert Xu 			goto out;
723da7f033dSHerbert Xu 		}
724da7f033dSHerbert Xu 
725d8a32ac2SJussi Kivilinna 		q = output;
726da7f033dSHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
727d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Test %d failed on %s for %s\n",
728d8a32ac2SJussi Kivilinna 			       d, j, e, algo);
729da7f033dSHerbert Xu 			hexdump(q, template[i].rlen);
730da7f033dSHerbert Xu 			ret = -EINVAL;
731da7f033dSHerbert Xu 			goto out;
732da7f033dSHerbert Xu 		}
733da7f033dSHerbert Xu 	}
734da7f033dSHerbert Xu 
735da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
73658dcf548SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
73758dcf548SJussi Kivilinna 		if (align_offset != 0)
73858dcf548SJussi Kivilinna 			break;
73958dcf548SJussi Kivilinna 
74005b1d338SCristian Stoica 		if (!template[i].np)
74105b1d338SCristian Stoica 			continue;
74205b1d338SCristian Stoica 
743da7f033dSHerbert Xu 		j++;
744da7f033dSHerbert Xu 
745da7f033dSHerbert Xu 		if (template[i].iv)
746abfa7f43SJerome Marchand 			memcpy(iv, template[i].iv, iv_len);
747da7f033dSHerbert Xu 		else
748da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
749da7f033dSHerbert Xu 
750da7f033dSHerbert Xu 		crypto_aead_clear_flags(tfm, ~0);
751da7f033dSHerbert Xu 		if (template[i].wk)
75205b1d338SCristian Stoica 			crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
75329b77e5dSHoria Geanta 		if (template[i].klen > MAX_KEYLEN) {
75429b77e5dSHoria Geanta 			pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
75505b1d338SCristian Stoica 			       d, j, algo, template[i].klen, MAX_KEYLEN);
75629b77e5dSHoria Geanta 			ret = -EINVAL;
75729b77e5dSHoria Geanta 			goto out;
75829b77e5dSHoria Geanta 		}
75929b77e5dSHoria Geanta 		memcpy(key, template[i].key, template[i].klen);
760da7f033dSHerbert Xu 
761da7f033dSHerbert Xu 		ret = crypto_aead_setkey(tfm, key, template[i].klen);
762da7f033dSHerbert Xu 		if (!ret == template[i].fail) {
763d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n",
764d8a32ac2SJussi Kivilinna 			       d, j, algo, crypto_aead_get_flags(tfm));
765da7f033dSHerbert Xu 			goto out;
766da7f033dSHerbert Xu 		} else if (ret)
767da7f033dSHerbert Xu 			continue;
768da7f033dSHerbert Xu 
769da7f033dSHerbert Xu 		authsize = abs(template[i].rlen - template[i].ilen);
770da7f033dSHerbert Xu 
771da7f033dSHerbert Xu 		ret = -EINVAL;
7728a525fcdSHerbert Xu 		sg_init_table(sg, template[i].anp + template[i].np);
773d8a32ac2SJussi Kivilinna 		if (diff_dst)
7748a525fcdSHerbert Xu 			sg_init_table(sgout, template[i].anp + template[i].np);
7758a525fcdSHerbert Xu 
7768a525fcdSHerbert Xu 		ret = -EINVAL;
7778a525fcdSHerbert Xu 		for (k = 0, temp = 0; k < template[i].anp; k++) {
7788a525fcdSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
7798a525fcdSHerbert Xu 				    template[i].atap[k] > PAGE_SIZE))
7808a525fcdSHerbert Xu 				goto out;
7818a525fcdSHerbert Xu 			sg_set_buf(&sg[k],
7828a525fcdSHerbert Xu 				   memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
7838a525fcdSHerbert Xu 					  offset_in_page(IDX[k]),
7848a525fcdSHerbert Xu 					  template[i].assoc + temp,
7858a525fcdSHerbert Xu 					  template[i].atap[k]),
7868a525fcdSHerbert Xu 				   template[i].atap[k]);
7878a525fcdSHerbert Xu 			if (diff_dst)
7888a525fcdSHerbert Xu 				sg_set_buf(&sgout[k],
7898a525fcdSHerbert Xu 					   axbuf[IDX[k] >> PAGE_SHIFT] +
7908a525fcdSHerbert Xu 					   offset_in_page(IDX[k]),
7918a525fcdSHerbert Xu 					   template[i].atap[k]);
7928a525fcdSHerbert Xu 			temp += template[i].atap[k];
7938a525fcdSHerbert Xu 		}
7948a525fcdSHerbert Xu 
795da7f033dSHerbert Xu 		for (k = 0, temp = 0; k < template[i].np; k++) {
796da7f033dSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
797da7f033dSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
798da7f033dSHerbert Xu 				goto out;
799da7f033dSHerbert Xu 
80005b1d338SCristian Stoica 			q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
80105b1d338SCristian Stoica 			memcpy(q, template[i].input + temp, template[i].tap[k]);
8028a525fcdSHerbert Xu 			sg_set_buf(&sg[template[i].anp + k],
8038a525fcdSHerbert Xu 				   q, template[i].tap[k]);
804d8a32ac2SJussi Kivilinna 
805d8a32ac2SJussi Kivilinna 			if (diff_dst) {
806d8a32ac2SJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
807d8a32ac2SJussi Kivilinna 				    offset_in_page(IDX[k]);
808d8a32ac2SJussi Kivilinna 
809d8a32ac2SJussi Kivilinna 				memset(q, 0, template[i].tap[k]);
810d8a32ac2SJussi Kivilinna 
8118a525fcdSHerbert Xu 				sg_set_buf(&sgout[template[i].anp + k],
8128a525fcdSHerbert Xu 					   q, template[i].tap[k]);
813d8a32ac2SJussi Kivilinna 			}
814d8a32ac2SJussi Kivilinna 
8158ec25c51SHoria Geanta 			n = template[i].tap[k];
8168ec25c51SHoria Geanta 			if (k == template[i].np - 1 && enc)
8178ec25c51SHoria Geanta 				n += authsize;
8188ec25c51SHoria Geanta 			if (offset_in_page(q) + n < PAGE_SIZE)
8198ec25c51SHoria Geanta 				q[n] = 0;
8208ec25c51SHoria Geanta 
821da7f033dSHerbert Xu 			temp += template[i].tap[k];
822da7f033dSHerbert Xu 		}
823da7f033dSHerbert Xu 
824da7f033dSHerbert Xu 		ret = crypto_aead_setauthsize(tfm, authsize);
825da7f033dSHerbert Xu 		if (ret) {
826d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n",
827d8a32ac2SJussi Kivilinna 			       d, authsize, j, algo);
828da7f033dSHerbert Xu 			goto out;
829da7f033dSHerbert Xu 		}
830da7f033dSHerbert Xu 
831da7f033dSHerbert Xu 		if (enc) {
8328a525fcdSHerbert Xu 			if (WARN_ON(sg[template[i].anp + k - 1].offset +
8338a525fcdSHerbert Xu 				    sg[template[i].anp + k - 1].length +
8348a525fcdSHerbert Xu 				    authsize > PAGE_SIZE)) {
835da7f033dSHerbert Xu 				ret = -EINVAL;
836da7f033dSHerbert Xu 				goto out;
837da7f033dSHerbert Xu 			}
838da7f033dSHerbert Xu 
839d8a32ac2SJussi Kivilinna 			if (diff_dst)
8408a525fcdSHerbert Xu 				sgout[template[i].anp + k - 1].length +=
8418a525fcdSHerbert Xu 					authsize;
8428a525fcdSHerbert Xu 			sg[template[i].anp + k - 1].length += authsize;
843da7f033dSHerbert Xu 		}
844da7f033dSHerbert Xu 
845d8a32ac2SJussi Kivilinna 		aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
846da7f033dSHerbert Xu 				       template[i].ilen,
847da7f033dSHerbert Xu 				       iv);
848da7f033dSHerbert Xu 
8498a525fcdSHerbert Xu 		aead_request_set_ad(req, template[i].alen);
850da7f033dSHerbert Xu 
85105b1d338SCristian Stoica 		ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req);
852da7f033dSHerbert Xu 
853da7f033dSHerbert Xu 		switch (ret) {
854da7f033dSHerbert Xu 		case 0:
855e44a1b44SJarod Wilson 			if (template[i].novrfy) {
856e44a1b44SJarod Wilson 				/* verification was supposed to fail */
857d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n",
858d8a32ac2SJussi Kivilinna 				       d, e, j, algo);
859e44a1b44SJarod Wilson 				/* so really, we got a bad message */
860e44a1b44SJarod Wilson 				ret = -EBADMSG;
861e44a1b44SJarod Wilson 				goto out;
862e44a1b44SJarod Wilson 			}
863da7f033dSHerbert Xu 			break;
864da7f033dSHerbert Xu 		case -EINPROGRESS:
865da7f033dSHerbert Xu 		case -EBUSY:
8668a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
86716735d02SWolfram Sang 			reinit_completion(&result.completion);
8688a45ac12SRabin Vincent 			ret = result.err;
8698a45ac12SRabin Vincent 			if (!ret)
870da7f033dSHerbert Xu 				break;
871e44a1b44SJarod Wilson 		case -EBADMSG:
872e44a1b44SJarod Wilson 			if (template[i].novrfy)
873e44a1b44SJarod Wilson 				/* verification failure was expected */
874e44a1b44SJarod Wilson 				continue;
875da7f033dSHerbert Xu 			/* fall through */
876da7f033dSHerbert Xu 		default:
877d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n",
878d8a32ac2SJussi Kivilinna 			       d, e, j, algo, -ret);
879da7f033dSHerbert Xu 			goto out;
880da7f033dSHerbert Xu 		}
881da7f033dSHerbert Xu 
882da7f033dSHerbert Xu 		ret = -EINVAL;
883da7f033dSHerbert Xu 		for (k = 0, temp = 0; k < template[i].np; k++) {
884d8a32ac2SJussi Kivilinna 			if (diff_dst)
885d8a32ac2SJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
886d8a32ac2SJussi Kivilinna 				    offset_in_page(IDX[k]);
887d8a32ac2SJussi Kivilinna 			else
888da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
889da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
890da7f033dSHerbert Xu 
891da7f033dSHerbert Xu 			n = template[i].tap[k];
892da7f033dSHerbert Xu 			if (k == template[i].np - 1)
893da7f033dSHerbert Xu 				n += enc ? authsize : -authsize;
894da7f033dSHerbert Xu 
895da7f033dSHerbert Xu 			if (memcmp(q, template[i].result + temp, n)) {
896d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n",
897d8a32ac2SJussi Kivilinna 				       d, j, e, k, algo);
898da7f033dSHerbert Xu 				hexdump(q, n);
899da7f033dSHerbert Xu 				goto out;
900da7f033dSHerbert Xu 			}
901da7f033dSHerbert Xu 
902da7f033dSHerbert Xu 			q += n;
903da7f033dSHerbert Xu 			if (k == template[i].np - 1 && !enc) {
904d8a32ac2SJussi Kivilinna 				if (!diff_dst &&
905d8a32ac2SJussi Kivilinna 					memcmp(q, template[i].input +
906da7f033dSHerbert Xu 					      temp + n, authsize))
907da7f033dSHerbert Xu 					n = authsize;
908da7f033dSHerbert Xu 				else
909da7f033dSHerbert Xu 					n = 0;
910da7f033dSHerbert Xu 			} else {
91105b1d338SCristian Stoica 				for (n = 0; offset_in_page(q + n) && q[n]; n++)
912da7f033dSHerbert Xu 					;
913da7f033dSHerbert Xu 			}
914da7f033dSHerbert Xu 			if (n) {
915d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
916d8a32ac2SJussi Kivilinna 				       d, j, e, k, algo, n);
917da7f033dSHerbert Xu 				hexdump(q, n);
918da7f033dSHerbert Xu 				goto out;
919da7f033dSHerbert Xu 			}
920da7f033dSHerbert Xu 
921da7f033dSHerbert Xu 			temp += template[i].tap[k];
922da7f033dSHerbert Xu 		}
923da7f033dSHerbert Xu 	}
924da7f033dSHerbert Xu 
925da7f033dSHerbert Xu 	ret = 0;
926da7f033dSHerbert Xu 
927da7f033dSHerbert Xu out:
928da7f033dSHerbert Xu 	aead_request_free(req);
929d8a32ac2SJussi Kivilinna 	kfree(sg);
930d8a32ac2SJussi Kivilinna out_nosg:
931d8a32ac2SJussi Kivilinna 	if (diff_dst)
932d8a32ac2SJussi Kivilinna 		testmgr_free_buf(xoutbuf);
933d8a32ac2SJussi Kivilinna out_nooutbuf:
934f8b0d4d0SHerbert Xu 	testmgr_free_buf(axbuf);
935f8b0d4d0SHerbert Xu out_noaxbuf:
936f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
937f8b0d4d0SHerbert Xu out_noxbuf:
93829b77e5dSHoria Geanta 	kfree(key);
9399bac019dSTadeusz Struk 	kfree(iv);
940da7f033dSHerbert Xu 	return ret;
941da7f033dSHerbert Xu }
942da7f033dSHerbert Xu 
943d8a32ac2SJussi Kivilinna static int test_aead(struct crypto_aead *tfm, int enc,
944d8a32ac2SJussi Kivilinna 		     struct aead_testvec *template, unsigned int tcount)
945d8a32ac2SJussi Kivilinna {
94658dcf548SJussi Kivilinna 	unsigned int alignmask;
947d8a32ac2SJussi Kivilinna 	int ret;
948d8a32ac2SJussi Kivilinna 
949d8a32ac2SJussi Kivilinna 	/* test 'dst == src' case */
95058dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, false, 0);
951d8a32ac2SJussi Kivilinna 	if (ret)
952d8a32ac2SJussi Kivilinna 		return ret;
953d8a32ac2SJussi Kivilinna 
954d8a32ac2SJussi Kivilinna 	/* test 'dst != src' case */
95558dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, true, 0);
95658dcf548SJussi Kivilinna 	if (ret)
95758dcf548SJussi Kivilinna 		return ret;
95858dcf548SJussi Kivilinna 
95958dcf548SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
96058dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, true, 1);
96158dcf548SJussi Kivilinna 	if (ret)
96258dcf548SJussi Kivilinna 		return ret;
96358dcf548SJussi Kivilinna 
96458dcf548SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
96558dcf548SJussi Kivilinna 	if (alignmask) {
96658dcf548SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
96758dcf548SJussi Kivilinna 		ret = __test_aead(tfm, enc, template, tcount, true,
96858dcf548SJussi Kivilinna 				  alignmask + 1);
96958dcf548SJussi Kivilinna 		if (ret)
97058dcf548SJussi Kivilinna 			return ret;
97158dcf548SJussi Kivilinna 	}
97258dcf548SJussi Kivilinna 
97358dcf548SJussi Kivilinna 	return 0;
974d8a32ac2SJussi Kivilinna }
975d8a32ac2SJussi Kivilinna 
9761aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc,
9771aa4ecd9SHerbert Xu 		       struct cipher_testvec *template, unsigned int tcount)
9781aa4ecd9SHerbert Xu {
9791aa4ecd9SHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm));
9801aa4ecd9SHerbert Xu 	unsigned int i, j, k;
9811aa4ecd9SHerbert Xu 	char *q;
9821aa4ecd9SHerbert Xu 	const char *e;
9831aa4ecd9SHerbert Xu 	void *data;
984f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
985f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
986f8b0d4d0SHerbert Xu 
987f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
988f8b0d4d0SHerbert Xu 		goto out_nobuf;
9891aa4ecd9SHerbert Xu 
9901aa4ecd9SHerbert Xu 	if (enc == ENCRYPT)
9911aa4ecd9SHerbert Xu 	        e = "encryption";
9921aa4ecd9SHerbert Xu 	else
9931aa4ecd9SHerbert Xu 		e = "decryption";
9941aa4ecd9SHerbert Xu 
9951aa4ecd9SHerbert Xu 	j = 0;
9961aa4ecd9SHerbert Xu 	for (i = 0; i < tcount; i++) {
9971aa4ecd9SHerbert Xu 		if (template[i].np)
9981aa4ecd9SHerbert Xu 			continue;
9991aa4ecd9SHerbert Xu 
10001aa4ecd9SHerbert Xu 		j++;
10011aa4ecd9SHerbert Xu 
1002fd57f22aSHerbert Xu 		ret = -EINVAL;
1003fd57f22aSHerbert Xu 		if (WARN_ON(template[i].ilen > PAGE_SIZE))
1004fd57f22aSHerbert Xu 			goto out;
1005fd57f22aSHerbert Xu 
10061aa4ecd9SHerbert Xu 		data = xbuf[0];
10071aa4ecd9SHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
10081aa4ecd9SHerbert Xu 
10091aa4ecd9SHerbert Xu 		crypto_cipher_clear_flags(tfm, ~0);
10101aa4ecd9SHerbert Xu 		if (template[i].wk)
10111aa4ecd9SHerbert Xu 			crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
10121aa4ecd9SHerbert Xu 
10131aa4ecd9SHerbert Xu 		ret = crypto_cipher_setkey(tfm, template[i].key,
10141aa4ecd9SHerbert Xu 					   template[i].klen);
10151aa4ecd9SHerbert Xu 		if (!ret == template[i].fail) {
10161aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: setkey failed "
10171aa4ecd9SHerbert Xu 			       "on test %d for %s: flags=%x\n", j,
10181aa4ecd9SHerbert Xu 			       algo, crypto_cipher_get_flags(tfm));
10191aa4ecd9SHerbert Xu 			goto out;
10201aa4ecd9SHerbert Xu 		} else if (ret)
10211aa4ecd9SHerbert Xu 			continue;
10221aa4ecd9SHerbert Xu 
10231aa4ecd9SHerbert Xu 		for (k = 0; k < template[i].ilen;
10241aa4ecd9SHerbert Xu 		     k += crypto_cipher_blocksize(tfm)) {
10251aa4ecd9SHerbert Xu 			if (enc)
10261aa4ecd9SHerbert Xu 				crypto_cipher_encrypt_one(tfm, data + k,
10271aa4ecd9SHerbert Xu 							  data + k);
10281aa4ecd9SHerbert Xu 			else
10291aa4ecd9SHerbert Xu 				crypto_cipher_decrypt_one(tfm, data + k,
10301aa4ecd9SHerbert Xu 							  data + k);
10311aa4ecd9SHerbert Xu 		}
10321aa4ecd9SHerbert Xu 
10331aa4ecd9SHerbert Xu 		q = data;
10341aa4ecd9SHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
10351aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: Test %d failed "
10361aa4ecd9SHerbert Xu 			       "on %s for %s\n", j, e, algo);
10371aa4ecd9SHerbert Xu 			hexdump(q, template[i].rlen);
10381aa4ecd9SHerbert Xu 			ret = -EINVAL;
10391aa4ecd9SHerbert Xu 			goto out;
10401aa4ecd9SHerbert Xu 		}
10411aa4ecd9SHerbert Xu 	}
10421aa4ecd9SHerbert Xu 
10431aa4ecd9SHerbert Xu 	ret = 0;
10441aa4ecd9SHerbert Xu 
10451aa4ecd9SHerbert Xu out:
1046f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
1047f8b0d4d0SHerbert Xu out_nobuf:
10481aa4ecd9SHerbert Xu 	return ret;
10491aa4ecd9SHerbert Xu }
10501aa4ecd9SHerbert Xu 
105112773d93SHerbert Xu static int __test_skcipher(struct crypto_skcipher *tfm, int enc,
105208d6af8cSJussi Kivilinna 			   struct cipher_testvec *template, unsigned int tcount,
10533a338f20SJussi Kivilinna 			   const bool diff_dst, const int align_offset)
1054da7f033dSHerbert Xu {
1055da7f033dSHerbert Xu 	const char *algo =
105612773d93SHerbert Xu 		crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm));
1057da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
1058da7f033dSHerbert Xu 	char *q;
105912773d93SHerbert Xu 	struct skcipher_request *req;
1060da7f033dSHerbert Xu 	struct scatterlist sg[8];
106108d6af8cSJussi Kivilinna 	struct scatterlist sgout[8];
106208d6af8cSJussi Kivilinna 	const char *e, *d;
1063da7f033dSHerbert Xu 	struct tcrypt_result result;
1064da7f033dSHerbert Xu 	void *data;
1065da7f033dSHerbert Xu 	char iv[MAX_IVLEN];
1066f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
106708d6af8cSJussi Kivilinna 	char *xoutbuf[XBUFSIZE];
1068f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
106984cba178SAndrey Ryabinin 	unsigned int ivsize = crypto_skcipher_ivsize(tfm);
1070f8b0d4d0SHerbert Xu 
1071f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
1072f8b0d4d0SHerbert Xu 		goto out_nobuf;
1073da7f033dSHerbert Xu 
107408d6af8cSJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
107508d6af8cSJussi Kivilinna 		goto out_nooutbuf;
107608d6af8cSJussi Kivilinna 
107708d6af8cSJussi Kivilinna 	if (diff_dst)
107808d6af8cSJussi Kivilinna 		d = "-ddst";
107908d6af8cSJussi Kivilinna 	else
108008d6af8cSJussi Kivilinna 		d = "";
108108d6af8cSJussi Kivilinna 
1082da7f033dSHerbert Xu 	if (enc == ENCRYPT)
1083da7f033dSHerbert Xu 	        e = "encryption";
1084da7f033dSHerbert Xu 	else
1085da7f033dSHerbert Xu 		e = "decryption";
1086da7f033dSHerbert Xu 
1087da7f033dSHerbert Xu 	init_completion(&result.completion);
1088da7f033dSHerbert Xu 
108912773d93SHerbert Xu 	req = skcipher_request_alloc(tfm, GFP_KERNEL);
1090da7f033dSHerbert Xu 	if (!req) {
109108d6af8cSJussi Kivilinna 		pr_err("alg: skcipher%s: Failed to allocate request for %s\n",
109208d6af8cSJussi Kivilinna 		       d, algo);
1093da7f033dSHerbert Xu 		goto out;
1094da7f033dSHerbert Xu 	}
1095da7f033dSHerbert Xu 
109612773d93SHerbert Xu 	skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1097da7f033dSHerbert Xu 				      tcrypt_complete, &result);
1098da7f033dSHerbert Xu 
1099da7f033dSHerbert Xu 	j = 0;
1100da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
1101bbb9a7ddSCristian Stoica 		if (template[i].np && !template[i].also_non_np)
1102bbb9a7ddSCristian Stoica 			continue;
1103bbb9a7ddSCristian Stoica 
1104da7f033dSHerbert Xu 		if (template[i].iv)
110584cba178SAndrey Ryabinin 			memcpy(iv, template[i].iv, ivsize);
1106da7f033dSHerbert Xu 		else
1107da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
1108da7f033dSHerbert Xu 
1109da7f033dSHerbert Xu 		j++;
1110fd57f22aSHerbert Xu 		ret = -EINVAL;
1111a1aa44a2SCristian Stoica 		if (WARN_ON(align_offset + template[i].ilen > PAGE_SIZE))
1112fd57f22aSHerbert Xu 			goto out;
1113fd57f22aSHerbert Xu 
1114da7f033dSHerbert Xu 		data = xbuf[0];
11153a338f20SJussi Kivilinna 		data += align_offset;
1116da7f033dSHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
1117da7f033dSHerbert Xu 
111812773d93SHerbert Xu 		crypto_skcipher_clear_flags(tfm, ~0);
1119da7f033dSHerbert Xu 		if (template[i].wk)
112012773d93SHerbert Xu 			crypto_skcipher_set_flags(tfm,
112112773d93SHerbert Xu 						  CRYPTO_TFM_REQ_WEAK_KEY);
1122da7f033dSHerbert Xu 
112312773d93SHerbert Xu 		ret = crypto_skcipher_setkey(tfm, template[i].key,
1124da7f033dSHerbert Xu 					     template[i].klen);
1125da7f033dSHerbert Xu 		if (!ret == template[i].fail) {
112608d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n",
112712773d93SHerbert Xu 			       d, j, algo, crypto_skcipher_get_flags(tfm));
1128da7f033dSHerbert Xu 			goto out;
1129da7f033dSHerbert Xu 		} else if (ret)
1130da7f033dSHerbert Xu 			continue;
1131da7f033dSHerbert Xu 
1132da7f033dSHerbert Xu 		sg_init_one(&sg[0], data, template[i].ilen);
113308d6af8cSJussi Kivilinna 		if (diff_dst) {
113408d6af8cSJussi Kivilinna 			data = xoutbuf[0];
11353a338f20SJussi Kivilinna 			data += align_offset;
113608d6af8cSJussi Kivilinna 			sg_init_one(&sgout[0], data, template[i].ilen);
113708d6af8cSJussi Kivilinna 		}
1138da7f033dSHerbert Xu 
113912773d93SHerbert Xu 		skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1140da7f033dSHerbert Xu 					   template[i].ilen, iv);
114112773d93SHerbert Xu 		ret = enc ? crypto_skcipher_encrypt(req) :
114212773d93SHerbert Xu 			    crypto_skcipher_decrypt(req);
1143da7f033dSHerbert Xu 
1144da7f033dSHerbert Xu 		switch (ret) {
1145da7f033dSHerbert Xu 		case 0:
1146da7f033dSHerbert Xu 			break;
1147da7f033dSHerbert Xu 		case -EINPROGRESS:
1148da7f033dSHerbert Xu 		case -EBUSY:
11498a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
115016735d02SWolfram Sang 			reinit_completion(&result.completion);
11518a45ac12SRabin Vincent 			ret = result.err;
11528a45ac12SRabin Vincent 			if (!ret)
1153da7f033dSHerbert Xu 				break;
1154da7f033dSHerbert Xu 			/* fall through */
1155da7f033dSHerbert Xu 		default:
115608d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n",
115708d6af8cSJussi Kivilinna 			       d, e, j, algo, -ret);
1158da7f033dSHerbert Xu 			goto out;
1159da7f033dSHerbert Xu 		}
1160da7f033dSHerbert Xu 
1161da7f033dSHerbert Xu 		q = data;
1162da7f033dSHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
11638a826a34SBoris BREZILLON 			pr_err("alg: skcipher%s: Test %d failed (invalid result) on %s for %s\n",
116408d6af8cSJussi Kivilinna 			       d, j, e, algo);
1165da7f033dSHerbert Xu 			hexdump(q, template[i].rlen);
1166da7f033dSHerbert Xu 			ret = -EINVAL;
1167da7f033dSHerbert Xu 			goto out;
1168da7f033dSHerbert Xu 		}
11698a826a34SBoris BREZILLON 
11708a826a34SBoris BREZILLON 		if (template[i].iv_out &&
11718a826a34SBoris BREZILLON 		    memcmp(iv, template[i].iv_out,
11728a826a34SBoris BREZILLON 			   crypto_skcipher_ivsize(tfm))) {
11738a826a34SBoris BREZILLON 			pr_err("alg: skcipher%s: Test %d failed (invalid output IV) on %s for %s\n",
11748a826a34SBoris BREZILLON 			       d, j, e, algo);
11758a826a34SBoris BREZILLON 			hexdump(iv, crypto_skcipher_ivsize(tfm));
11768a826a34SBoris BREZILLON 			ret = -EINVAL;
11778a826a34SBoris BREZILLON 			goto out;
11788a826a34SBoris BREZILLON 		}
1179da7f033dSHerbert Xu 	}
1180da7f033dSHerbert Xu 
1181da7f033dSHerbert Xu 	j = 0;
1182da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
11833a338f20SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
11843a338f20SJussi Kivilinna 		if (align_offset != 0)
11853a338f20SJussi Kivilinna 			break;
1186da7f033dSHerbert Xu 
1187bbb9a7ddSCristian Stoica 		if (!template[i].np)
1188bbb9a7ddSCristian Stoica 			continue;
1189bbb9a7ddSCristian Stoica 
1190da7f033dSHerbert Xu 		if (template[i].iv)
119184cba178SAndrey Ryabinin 			memcpy(iv, template[i].iv, ivsize);
1192da7f033dSHerbert Xu 		else
1193da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
1194da7f033dSHerbert Xu 
1195da7f033dSHerbert Xu 		j++;
119612773d93SHerbert Xu 		crypto_skcipher_clear_flags(tfm, ~0);
1197da7f033dSHerbert Xu 		if (template[i].wk)
119812773d93SHerbert Xu 			crypto_skcipher_set_flags(tfm,
119912773d93SHerbert Xu 						  CRYPTO_TFM_REQ_WEAK_KEY);
1200da7f033dSHerbert Xu 
120112773d93SHerbert Xu 		ret = crypto_skcipher_setkey(tfm, template[i].key,
1202da7f033dSHerbert Xu 					     template[i].klen);
1203da7f033dSHerbert Xu 		if (!ret == template[i].fail) {
120408d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n",
120512773d93SHerbert Xu 			       d, j, algo, crypto_skcipher_get_flags(tfm));
1206da7f033dSHerbert Xu 			goto out;
1207da7f033dSHerbert Xu 		} else if (ret)
1208da7f033dSHerbert Xu 			continue;
1209da7f033dSHerbert Xu 
1210da7f033dSHerbert Xu 		temp = 0;
1211da7f033dSHerbert Xu 		ret = -EINVAL;
1212da7f033dSHerbert Xu 		sg_init_table(sg, template[i].np);
121308d6af8cSJussi Kivilinna 		if (diff_dst)
121408d6af8cSJussi Kivilinna 			sg_init_table(sgout, template[i].np);
1215da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
1216da7f033dSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
1217da7f033dSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
1218da7f033dSHerbert Xu 				goto out;
1219da7f033dSHerbert Xu 
1220a1aa44a2SCristian Stoica 			q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
1221da7f033dSHerbert Xu 
1222a1aa44a2SCristian Stoica 			memcpy(q, template[i].input + temp, template[i].tap[k]);
1223da7f033dSHerbert Xu 
1224a1aa44a2SCristian Stoica 			if (offset_in_page(q) + template[i].tap[k] < PAGE_SIZE)
1225da7f033dSHerbert Xu 				q[template[i].tap[k]] = 0;
1226da7f033dSHerbert Xu 
1227da7f033dSHerbert Xu 			sg_set_buf(&sg[k], q, template[i].tap[k]);
122808d6af8cSJussi Kivilinna 			if (diff_dst) {
122908d6af8cSJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
123008d6af8cSJussi Kivilinna 				    offset_in_page(IDX[k]);
123108d6af8cSJussi Kivilinna 
1232a1aa44a2SCristian Stoica 				sg_set_buf(&sgout[k], q, template[i].tap[k]);
123308d6af8cSJussi Kivilinna 
123408d6af8cSJussi Kivilinna 				memset(q, 0, template[i].tap[k]);
123508d6af8cSJussi Kivilinna 				if (offset_in_page(q) +
123608d6af8cSJussi Kivilinna 				    template[i].tap[k] < PAGE_SIZE)
123708d6af8cSJussi Kivilinna 					q[template[i].tap[k]] = 0;
123808d6af8cSJussi Kivilinna 			}
1239da7f033dSHerbert Xu 
1240da7f033dSHerbert Xu 			temp += template[i].tap[k];
1241da7f033dSHerbert Xu 		}
1242da7f033dSHerbert Xu 
124312773d93SHerbert Xu 		skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1244da7f033dSHerbert Xu 					   template[i].ilen, iv);
1245da7f033dSHerbert Xu 
124612773d93SHerbert Xu 		ret = enc ? crypto_skcipher_encrypt(req) :
124712773d93SHerbert Xu 			    crypto_skcipher_decrypt(req);
1248da7f033dSHerbert Xu 
1249da7f033dSHerbert Xu 		switch (ret) {
1250da7f033dSHerbert Xu 		case 0:
1251da7f033dSHerbert Xu 			break;
1252da7f033dSHerbert Xu 		case -EINPROGRESS:
1253da7f033dSHerbert Xu 		case -EBUSY:
12548a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
125516735d02SWolfram Sang 			reinit_completion(&result.completion);
12568a45ac12SRabin Vincent 			ret = result.err;
12578a45ac12SRabin Vincent 			if (!ret)
1258da7f033dSHerbert Xu 				break;
1259da7f033dSHerbert Xu 			/* fall through */
1260da7f033dSHerbert Xu 		default:
126108d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n",
126208d6af8cSJussi Kivilinna 			       d, e, j, algo, -ret);
1263da7f033dSHerbert Xu 			goto out;
1264da7f033dSHerbert Xu 		}
1265da7f033dSHerbert Xu 
1266da7f033dSHerbert Xu 		temp = 0;
1267da7f033dSHerbert Xu 		ret = -EINVAL;
1268da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
126908d6af8cSJussi Kivilinna 			if (diff_dst)
127008d6af8cSJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
127108d6af8cSJussi Kivilinna 				    offset_in_page(IDX[k]);
127208d6af8cSJussi Kivilinna 			else
1273da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
1274da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
1275da7f033dSHerbert Xu 
1276da7f033dSHerbert Xu 			if (memcmp(q, template[i].result + temp,
1277da7f033dSHerbert Xu 				   template[i].tap[k])) {
127808d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n",
127908d6af8cSJussi Kivilinna 				       d, j, e, k, algo);
1280da7f033dSHerbert Xu 				hexdump(q, template[i].tap[k]);
1281da7f033dSHerbert Xu 				goto out;
1282da7f033dSHerbert Xu 			}
1283da7f033dSHerbert Xu 
1284da7f033dSHerbert Xu 			q += template[i].tap[k];
1285da7f033dSHerbert Xu 			for (n = 0; offset_in_page(q + n) && q[n]; n++)
1286da7f033dSHerbert Xu 				;
1287da7f033dSHerbert Xu 			if (n) {
128808d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
128908d6af8cSJussi Kivilinna 				       d, j, e, k, algo, n);
1290da7f033dSHerbert Xu 				hexdump(q, n);
1291da7f033dSHerbert Xu 				goto out;
1292da7f033dSHerbert Xu 			}
1293da7f033dSHerbert Xu 			temp += template[i].tap[k];
1294da7f033dSHerbert Xu 		}
1295da7f033dSHerbert Xu 	}
1296da7f033dSHerbert Xu 
1297da7f033dSHerbert Xu 	ret = 0;
1298da7f033dSHerbert Xu 
1299da7f033dSHerbert Xu out:
130012773d93SHerbert Xu 	skcipher_request_free(req);
130108d6af8cSJussi Kivilinna 	if (diff_dst)
130208d6af8cSJussi Kivilinna 		testmgr_free_buf(xoutbuf);
130308d6af8cSJussi Kivilinna out_nooutbuf:
1304f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
1305f8b0d4d0SHerbert Xu out_nobuf:
1306da7f033dSHerbert Xu 	return ret;
1307da7f033dSHerbert Xu }
1308da7f033dSHerbert Xu 
130912773d93SHerbert Xu static int test_skcipher(struct crypto_skcipher *tfm, int enc,
131008d6af8cSJussi Kivilinna 			 struct cipher_testvec *template, unsigned int tcount)
131108d6af8cSJussi Kivilinna {
13123a338f20SJussi Kivilinna 	unsigned int alignmask;
131308d6af8cSJussi Kivilinna 	int ret;
131408d6af8cSJussi Kivilinna 
131508d6af8cSJussi Kivilinna 	/* test 'dst == src' case */
13163a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, false, 0);
131708d6af8cSJussi Kivilinna 	if (ret)
131808d6af8cSJussi Kivilinna 		return ret;
131908d6af8cSJussi Kivilinna 
132008d6af8cSJussi Kivilinna 	/* test 'dst != src' case */
13213a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 0);
13223a338f20SJussi Kivilinna 	if (ret)
13233a338f20SJussi Kivilinna 		return ret;
13243a338f20SJussi Kivilinna 
13253a338f20SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
13263a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 1);
13273a338f20SJussi Kivilinna 	if (ret)
13283a338f20SJussi Kivilinna 		return ret;
13293a338f20SJussi Kivilinna 
13303a338f20SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
13313a338f20SJussi Kivilinna 	if (alignmask) {
13323a338f20SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
13333a338f20SJussi Kivilinna 		ret = __test_skcipher(tfm, enc, template, tcount, true,
13343a338f20SJussi Kivilinna 				      alignmask + 1);
13353a338f20SJussi Kivilinna 		if (ret)
13363a338f20SJussi Kivilinna 			return ret;
13373a338f20SJussi Kivilinna 	}
13383a338f20SJussi Kivilinna 
13393a338f20SJussi Kivilinna 	return 0;
134008d6af8cSJussi Kivilinna }
134108d6af8cSJussi Kivilinna 
1342da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate,
1343da7f033dSHerbert Xu 		     struct comp_testvec *dtemplate, int ctcount, int dtcount)
1344da7f033dSHerbert Xu {
1345da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
1346da7f033dSHerbert Xu 	unsigned int i;
1347da7f033dSHerbert Xu 	char result[COMP_BUF_SIZE];
1348da7f033dSHerbert Xu 	int ret;
1349da7f033dSHerbert Xu 
1350da7f033dSHerbert Xu 	for (i = 0; i < ctcount; i++) {
1351c79cf910SGeert Uytterhoeven 		int ilen;
1352c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1353da7f033dSHerbert Xu 
1354da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1355da7f033dSHerbert Xu 
1356da7f033dSHerbert Xu 		ilen = ctemplate[i].inlen;
1357da7f033dSHerbert Xu 		ret = crypto_comp_compress(tfm, ctemplate[i].input,
1358da7f033dSHerbert Xu 		                           ilen, result, &dlen);
1359da7f033dSHerbert Xu 		if (ret) {
1360da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: compression failed "
1361da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1362da7f033dSHerbert Xu 			       -ret);
1363da7f033dSHerbert Xu 			goto out;
1364da7f033dSHerbert Xu 		}
1365da7f033dSHerbert Xu 
1366b812eb00SGeert Uytterhoeven 		if (dlen != ctemplate[i].outlen) {
1367b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Compression test %d "
1368b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1369b812eb00SGeert Uytterhoeven 			       dlen);
1370b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1371b812eb00SGeert Uytterhoeven 			goto out;
1372b812eb00SGeert Uytterhoeven 		}
1373b812eb00SGeert Uytterhoeven 
1374da7f033dSHerbert Xu 		if (memcmp(result, ctemplate[i].output, dlen)) {
1375da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Compression test %d "
1376da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1377da7f033dSHerbert Xu 			hexdump(result, dlen);
1378da7f033dSHerbert Xu 			ret = -EINVAL;
1379da7f033dSHerbert Xu 			goto out;
1380da7f033dSHerbert Xu 		}
1381da7f033dSHerbert Xu 	}
1382da7f033dSHerbert Xu 
1383da7f033dSHerbert Xu 	for (i = 0; i < dtcount; i++) {
1384c79cf910SGeert Uytterhoeven 		int ilen;
1385c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1386da7f033dSHerbert Xu 
1387da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1388da7f033dSHerbert Xu 
1389da7f033dSHerbert Xu 		ilen = dtemplate[i].inlen;
1390da7f033dSHerbert Xu 		ret = crypto_comp_decompress(tfm, dtemplate[i].input,
1391da7f033dSHerbert Xu 		                             ilen, result, &dlen);
1392da7f033dSHerbert Xu 		if (ret) {
1393da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: decompression failed "
1394da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1395da7f033dSHerbert Xu 			       -ret);
1396da7f033dSHerbert Xu 			goto out;
1397da7f033dSHerbert Xu 		}
1398da7f033dSHerbert Xu 
1399b812eb00SGeert Uytterhoeven 		if (dlen != dtemplate[i].outlen) {
1400b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Decompression test %d "
1401b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1402b812eb00SGeert Uytterhoeven 			       dlen);
1403b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1404b812eb00SGeert Uytterhoeven 			goto out;
1405b812eb00SGeert Uytterhoeven 		}
1406b812eb00SGeert Uytterhoeven 
1407da7f033dSHerbert Xu 		if (memcmp(result, dtemplate[i].output, dlen)) {
1408da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Decompression test %d "
1409da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1410da7f033dSHerbert Xu 			hexdump(result, dlen);
1411da7f033dSHerbert Xu 			ret = -EINVAL;
1412da7f033dSHerbert Xu 			goto out;
1413da7f033dSHerbert Xu 		}
1414da7f033dSHerbert Xu 	}
1415da7f033dSHerbert Xu 
1416da7f033dSHerbert Xu 	ret = 0;
1417da7f033dSHerbert Xu 
1418da7f033dSHerbert Xu out:
1419da7f033dSHerbert Xu 	return ret;
1420da7f033dSHerbert Xu }
1421da7f033dSHerbert Xu 
14227647d6ceSJarod Wilson static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template,
14237647d6ceSJarod Wilson 		      unsigned int tcount)
14247647d6ceSJarod Wilson {
14257647d6ceSJarod Wilson 	const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
1426fa4ef8a6SFelipe Contreras 	int err = 0, i, j, seedsize;
14277647d6ceSJarod Wilson 	u8 *seed;
14287647d6ceSJarod Wilson 	char result[32];
14297647d6ceSJarod Wilson 
14307647d6ceSJarod Wilson 	seedsize = crypto_rng_seedsize(tfm);
14317647d6ceSJarod Wilson 
14327647d6ceSJarod Wilson 	seed = kmalloc(seedsize, GFP_KERNEL);
14337647d6ceSJarod Wilson 	if (!seed) {
14347647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to allocate seed space "
14357647d6ceSJarod Wilson 		       "for %s\n", algo);
14367647d6ceSJarod Wilson 		return -ENOMEM;
14377647d6ceSJarod Wilson 	}
14387647d6ceSJarod Wilson 
14397647d6ceSJarod Wilson 	for (i = 0; i < tcount; i++) {
14407647d6ceSJarod Wilson 		memset(result, 0, 32);
14417647d6ceSJarod Wilson 
14427647d6ceSJarod Wilson 		memcpy(seed, template[i].v, template[i].vlen);
14437647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen, template[i].key,
14447647d6ceSJarod Wilson 		       template[i].klen);
14457647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen + template[i].klen,
14467647d6ceSJarod Wilson 		       template[i].dt, template[i].dtlen);
14477647d6ceSJarod Wilson 
14487647d6ceSJarod Wilson 		err = crypto_rng_reset(tfm, seed, seedsize);
14497647d6ceSJarod Wilson 		if (err) {
14507647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Failed to reset rng "
14517647d6ceSJarod Wilson 			       "for %s\n", algo);
14527647d6ceSJarod Wilson 			goto out;
14537647d6ceSJarod Wilson 		}
14547647d6ceSJarod Wilson 
14557647d6ceSJarod Wilson 		for (j = 0; j < template[i].loops; j++) {
14567647d6ceSJarod Wilson 			err = crypto_rng_get_bytes(tfm, result,
14577647d6ceSJarod Wilson 						   template[i].rlen);
145819e60e13SStephan Mueller 			if (err < 0) {
14597647d6ceSJarod Wilson 				printk(KERN_ERR "alg: cprng: Failed to obtain "
14607647d6ceSJarod Wilson 				       "the correct amount of random data for "
146119e60e13SStephan Mueller 				       "%s (requested %d)\n", algo,
146219e60e13SStephan Mueller 				       template[i].rlen);
14637647d6ceSJarod Wilson 				goto out;
14647647d6ceSJarod Wilson 			}
14657647d6ceSJarod Wilson 		}
14667647d6ceSJarod Wilson 
14677647d6ceSJarod Wilson 		err = memcmp(result, template[i].result,
14687647d6ceSJarod Wilson 			     template[i].rlen);
14697647d6ceSJarod Wilson 		if (err) {
14707647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Test %d failed for %s\n",
14717647d6ceSJarod Wilson 			       i, algo);
14727647d6ceSJarod Wilson 			hexdump(result, template[i].rlen);
14737647d6ceSJarod Wilson 			err = -EINVAL;
14747647d6ceSJarod Wilson 			goto out;
14757647d6ceSJarod Wilson 		}
14767647d6ceSJarod Wilson 	}
14777647d6ceSJarod Wilson 
14787647d6ceSJarod Wilson out:
14797647d6ceSJarod Wilson 	kfree(seed);
14807647d6ceSJarod Wilson 	return err;
14817647d6ceSJarod Wilson }
14827647d6ceSJarod Wilson 
1483da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
1484da7f033dSHerbert Xu 			 u32 type, u32 mask)
1485da7f033dSHerbert Xu {
1486da7f033dSHerbert Xu 	struct crypto_aead *tfm;
1487da7f033dSHerbert Xu 	int err = 0;
1488da7f033dSHerbert Xu 
1489425a8829SStephan Mueller 	tfm = crypto_alloc_aead(driver, type | CRYPTO_ALG_INTERNAL, mask);
1490da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1491da7f033dSHerbert Xu 		printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
1492da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1493da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1494da7f033dSHerbert Xu 	}
1495da7f033dSHerbert Xu 
1496da7f033dSHerbert Xu 	if (desc->suite.aead.enc.vecs) {
1497da7f033dSHerbert Xu 		err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
1498da7f033dSHerbert Xu 				desc->suite.aead.enc.count);
1499da7f033dSHerbert Xu 		if (err)
1500da7f033dSHerbert Xu 			goto out;
1501da7f033dSHerbert Xu 	}
1502da7f033dSHerbert Xu 
1503da7f033dSHerbert Xu 	if (!err && desc->suite.aead.dec.vecs)
1504da7f033dSHerbert Xu 		err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
1505da7f033dSHerbert Xu 				desc->suite.aead.dec.count);
1506da7f033dSHerbert Xu 
1507da7f033dSHerbert Xu out:
1508da7f033dSHerbert Xu 	crypto_free_aead(tfm);
1509da7f033dSHerbert Xu 	return err;
1510da7f033dSHerbert Xu }
1511da7f033dSHerbert Xu 
1512da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc,
1513da7f033dSHerbert Xu 			   const char *driver, u32 type, u32 mask)
1514da7f033dSHerbert Xu {
15151aa4ecd9SHerbert Xu 	struct crypto_cipher *tfm;
1516da7f033dSHerbert Xu 	int err = 0;
1517da7f033dSHerbert Xu 
1518425a8829SStephan Mueller 	tfm = crypto_alloc_cipher(driver, type | CRYPTO_ALG_INTERNAL, mask);
1519da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1520da7f033dSHerbert Xu 		printk(KERN_ERR "alg: cipher: Failed to load transform for "
1521da7f033dSHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
1522da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1523da7f033dSHerbert Xu 	}
1524da7f033dSHerbert Xu 
1525da7f033dSHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
1526da7f033dSHerbert Xu 		err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1527da7f033dSHerbert Xu 				  desc->suite.cipher.enc.count);
1528da7f033dSHerbert Xu 		if (err)
1529da7f033dSHerbert Xu 			goto out;
1530da7f033dSHerbert Xu 	}
1531da7f033dSHerbert Xu 
1532da7f033dSHerbert Xu 	if (desc->suite.cipher.dec.vecs)
1533da7f033dSHerbert Xu 		err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1534da7f033dSHerbert Xu 				  desc->suite.cipher.dec.count);
1535da7f033dSHerbert Xu 
1536da7f033dSHerbert Xu out:
15371aa4ecd9SHerbert Xu 	crypto_free_cipher(tfm);
15381aa4ecd9SHerbert Xu 	return err;
15391aa4ecd9SHerbert Xu }
15401aa4ecd9SHerbert Xu 
15411aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc,
15421aa4ecd9SHerbert Xu 			     const char *driver, u32 type, u32 mask)
15431aa4ecd9SHerbert Xu {
154412773d93SHerbert Xu 	struct crypto_skcipher *tfm;
15451aa4ecd9SHerbert Xu 	int err = 0;
15461aa4ecd9SHerbert Xu 
154712773d93SHerbert Xu 	tfm = crypto_alloc_skcipher(driver, type | CRYPTO_ALG_INTERNAL, mask);
15481aa4ecd9SHerbert Xu 	if (IS_ERR(tfm)) {
15491aa4ecd9SHerbert Xu 		printk(KERN_ERR "alg: skcipher: Failed to load transform for "
15501aa4ecd9SHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
15511aa4ecd9SHerbert Xu 		return PTR_ERR(tfm);
15521aa4ecd9SHerbert Xu 	}
15531aa4ecd9SHerbert Xu 
15541aa4ecd9SHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
15551aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
15561aa4ecd9SHerbert Xu 				    desc->suite.cipher.enc.count);
15571aa4ecd9SHerbert Xu 		if (err)
15581aa4ecd9SHerbert Xu 			goto out;
15591aa4ecd9SHerbert Xu 	}
15601aa4ecd9SHerbert Xu 
15611aa4ecd9SHerbert Xu 	if (desc->suite.cipher.dec.vecs)
15621aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
15631aa4ecd9SHerbert Xu 				    desc->suite.cipher.dec.count);
15641aa4ecd9SHerbert Xu 
15651aa4ecd9SHerbert Xu out:
156612773d93SHerbert Xu 	crypto_free_skcipher(tfm);
1567da7f033dSHerbert Xu 	return err;
1568da7f033dSHerbert Xu }
1569da7f033dSHerbert Xu 
1570da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
1571da7f033dSHerbert Xu 			 u32 type, u32 mask)
1572da7f033dSHerbert Xu {
1573da7f033dSHerbert Xu 	struct crypto_comp *tfm;
1574da7f033dSHerbert Xu 	int err;
1575da7f033dSHerbert Xu 
1576da7f033dSHerbert Xu 	tfm = crypto_alloc_comp(driver, type, mask);
1577da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1578da7f033dSHerbert Xu 		printk(KERN_ERR "alg: comp: Failed to load transform for %s: "
1579da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1580da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1581da7f033dSHerbert Xu 	}
1582da7f033dSHerbert Xu 
1583da7f033dSHerbert Xu 	err = test_comp(tfm, desc->suite.comp.comp.vecs,
1584da7f033dSHerbert Xu 			desc->suite.comp.decomp.vecs,
1585da7f033dSHerbert Xu 			desc->suite.comp.comp.count,
1586da7f033dSHerbert Xu 			desc->suite.comp.decomp.count);
1587da7f033dSHerbert Xu 
1588da7f033dSHerbert Xu 	crypto_free_comp(tfm);
1589da7f033dSHerbert Xu 	return err;
1590da7f033dSHerbert Xu }
1591da7f033dSHerbert Xu 
1592da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
1593da7f033dSHerbert Xu 			 u32 type, u32 mask)
1594da7f033dSHerbert Xu {
1595da7f033dSHerbert Xu 	struct crypto_ahash *tfm;
1596da7f033dSHerbert Xu 	int err;
1597da7f033dSHerbert Xu 
1598425a8829SStephan Mueller 	tfm = crypto_alloc_ahash(driver, type | CRYPTO_ALG_INTERNAL, mask);
1599da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1600da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
1601da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1602da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1603da7f033dSHerbert Xu 	}
1604da7f033dSHerbert Xu 
1605a8f1a052SDavid S. Miller 	err = test_hash(tfm, desc->suite.hash.vecs,
1606a8f1a052SDavid S. Miller 			desc->suite.hash.count, true);
1607a8f1a052SDavid S. Miller 	if (!err)
1608a8f1a052SDavid S. Miller 		err = test_hash(tfm, desc->suite.hash.vecs,
1609a8f1a052SDavid S. Miller 				desc->suite.hash.count, false);
1610da7f033dSHerbert Xu 
1611da7f033dSHerbert Xu 	crypto_free_ahash(tfm);
1612da7f033dSHerbert Xu 	return err;
1613da7f033dSHerbert Xu }
1614da7f033dSHerbert Xu 
16158e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc,
16168e3ee85eSHerbert Xu 			   const char *driver, u32 type, u32 mask)
16178e3ee85eSHerbert Xu {
16188e3ee85eSHerbert Xu 	struct crypto_shash *tfm;
16198e3ee85eSHerbert Xu 	u32 val;
16208e3ee85eSHerbert Xu 	int err;
16218e3ee85eSHerbert Xu 
16228e3ee85eSHerbert Xu 	err = alg_test_hash(desc, driver, type, mask);
16238e3ee85eSHerbert Xu 	if (err)
16248e3ee85eSHerbert Xu 		goto out;
16258e3ee85eSHerbert Xu 
1626425a8829SStephan Mueller 	tfm = crypto_alloc_shash(driver, type | CRYPTO_ALG_INTERNAL, mask);
16278e3ee85eSHerbert Xu 	if (IS_ERR(tfm)) {
16288e3ee85eSHerbert Xu 		printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
16298e3ee85eSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
16308e3ee85eSHerbert Xu 		err = PTR_ERR(tfm);
16318e3ee85eSHerbert Xu 		goto out;
16328e3ee85eSHerbert Xu 	}
16338e3ee85eSHerbert Xu 
16348e3ee85eSHerbert Xu 	do {
16354c5c3024SJan-Simon Möller 		SHASH_DESC_ON_STACK(shash, tfm);
16364c5c3024SJan-Simon Möller 		u32 *ctx = (u32 *)shash_desc_ctx(shash);
16378e3ee85eSHerbert Xu 
16384c5c3024SJan-Simon Möller 		shash->tfm = tfm;
16394c5c3024SJan-Simon Möller 		shash->flags = 0;
16408e3ee85eSHerbert Xu 
16414c5c3024SJan-Simon Möller 		*ctx = le32_to_cpu(420553207);
16424c5c3024SJan-Simon Möller 		err = crypto_shash_final(shash, (u8 *)&val);
16438e3ee85eSHerbert Xu 		if (err) {
16448e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Operation failed for "
16458e3ee85eSHerbert Xu 			       "%s: %d\n", driver, err);
16468e3ee85eSHerbert Xu 			break;
16478e3ee85eSHerbert Xu 		}
16488e3ee85eSHerbert Xu 
16498e3ee85eSHerbert Xu 		if (val != ~420553207) {
16508e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Test failed for %s: "
16518e3ee85eSHerbert Xu 			       "%d\n", driver, val);
16528e3ee85eSHerbert Xu 			err = -EINVAL;
16538e3ee85eSHerbert Xu 		}
16548e3ee85eSHerbert Xu 	} while (0);
16558e3ee85eSHerbert Xu 
16568e3ee85eSHerbert Xu 	crypto_free_shash(tfm);
16578e3ee85eSHerbert Xu 
16588e3ee85eSHerbert Xu out:
16598e3ee85eSHerbert Xu 	return err;
16608e3ee85eSHerbert Xu }
16618e3ee85eSHerbert Xu 
16627647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
16637647d6ceSJarod Wilson 			  u32 type, u32 mask)
16647647d6ceSJarod Wilson {
16657647d6ceSJarod Wilson 	struct crypto_rng *rng;
16667647d6ceSJarod Wilson 	int err;
16677647d6ceSJarod Wilson 
1668425a8829SStephan Mueller 	rng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask);
16697647d6ceSJarod Wilson 	if (IS_ERR(rng)) {
16707647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
16717647d6ceSJarod Wilson 		       "%ld\n", driver, PTR_ERR(rng));
16727647d6ceSJarod Wilson 		return PTR_ERR(rng);
16737647d6ceSJarod Wilson 	}
16747647d6ceSJarod Wilson 
16757647d6ceSJarod Wilson 	err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count);
16767647d6ceSJarod Wilson 
16777647d6ceSJarod Wilson 	crypto_free_rng(rng);
16787647d6ceSJarod Wilson 
16797647d6ceSJarod Wilson 	return err;
16807647d6ceSJarod Wilson }
16817647d6ceSJarod Wilson 
168264d1cdfbSStephan Mueller 
168364d1cdfbSStephan Mueller static int drbg_cavs_test(struct drbg_testvec *test, int pr,
168464d1cdfbSStephan Mueller 			  const char *driver, u32 type, u32 mask)
168564d1cdfbSStephan Mueller {
168664d1cdfbSStephan Mueller 	int ret = -EAGAIN;
168764d1cdfbSStephan Mueller 	struct crypto_rng *drng;
168864d1cdfbSStephan Mueller 	struct drbg_test_data test_data;
168964d1cdfbSStephan Mueller 	struct drbg_string addtl, pers, testentropy;
169064d1cdfbSStephan Mueller 	unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL);
169164d1cdfbSStephan Mueller 
169264d1cdfbSStephan Mueller 	if (!buf)
169364d1cdfbSStephan Mueller 		return -ENOMEM;
169464d1cdfbSStephan Mueller 
1695425a8829SStephan Mueller 	drng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask);
169664d1cdfbSStephan Mueller 	if (IS_ERR(drng)) {
169764d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for "
169864d1cdfbSStephan Mueller 		       "%s\n", driver);
169964d1cdfbSStephan Mueller 		kzfree(buf);
170064d1cdfbSStephan Mueller 		return -ENOMEM;
170164d1cdfbSStephan Mueller 	}
170264d1cdfbSStephan Mueller 
170364d1cdfbSStephan Mueller 	test_data.testentropy = &testentropy;
170464d1cdfbSStephan Mueller 	drbg_string_fill(&testentropy, test->entropy, test->entropylen);
170564d1cdfbSStephan Mueller 	drbg_string_fill(&pers, test->pers, test->perslen);
170664d1cdfbSStephan Mueller 	ret = crypto_drbg_reset_test(drng, &pers, &test_data);
170764d1cdfbSStephan Mueller 	if (ret) {
170864d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: Failed to reset rng\n");
170964d1cdfbSStephan Mueller 		goto outbuf;
171064d1cdfbSStephan Mueller 	}
171164d1cdfbSStephan Mueller 
171264d1cdfbSStephan Mueller 	drbg_string_fill(&addtl, test->addtla, test->addtllen);
171364d1cdfbSStephan Mueller 	if (pr) {
171464d1cdfbSStephan Mueller 		drbg_string_fill(&testentropy, test->entpra, test->entprlen);
171564d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl_test(drng,
171664d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl,	&test_data);
171764d1cdfbSStephan Mueller 	} else {
171864d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl(drng,
171964d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl);
172064d1cdfbSStephan Mueller 	}
172119e60e13SStephan Mueller 	if (ret < 0) {
172264d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not obtain random data for "
172364d1cdfbSStephan Mueller 		       "driver %s\n", driver);
172464d1cdfbSStephan Mueller 		goto outbuf;
172564d1cdfbSStephan Mueller 	}
172664d1cdfbSStephan Mueller 
172764d1cdfbSStephan Mueller 	drbg_string_fill(&addtl, test->addtlb, test->addtllen);
172864d1cdfbSStephan Mueller 	if (pr) {
172964d1cdfbSStephan Mueller 		drbg_string_fill(&testentropy, test->entprb, test->entprlen);
173064d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl_test(drng,
173164d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl, &test_data);
173264d1cdfbSStephan Mueller 	} else {
173364d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl(drng,
173464d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl);
173564d1cdfbSStephan Mueller 	}
173619e60e13SStephan Mueller 	if (ret < 0) {
173764d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not obtain random data for "
173864d1cdfbSStephan Mueller 		       "driver %s\n", driver);
173964d1cdfbSStephan Mueller 		goto outbuf;
174064d1cdfbSStephan Mueller 	}
174164d1cdfbSStephan Mueller 
174264d1cdfbSStephan Mueller 	ret = memcmp(test->expected, buf, test->expectedlen);
174364d1cdfbSStephan Mueller 
174464d1cdfbSStephan Mueller outbuf:
174564d1cdfbSStephan Mueller 	crypto_free_rng(drng);
174664d1cdfbSStephan Mueller 	kzfree(buf);
174764d1cdfbSStephan Mueller 	return ret;
174864d1cdfbSStephan Mueller }
174964d1cdfbSStephan Mueller 
175064d1cdfbSStephan Mueller 
175164d1cdfbSStephan Mueller static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver,
175264d1cdfbSStephan Mueller 			 u32 type, u32 mask)
175364d1cdfbSStephan Mueller {
175464d1cdfbSStephan Mueller 	int err = 0;
175564d1cdfbSStephan Mueller 	int pr = 0;
175664d1cdfbSStephan Mueller 	int i = 0;
175764d1cdfbSStephan Mueller 	struct drbg_testvec *template = desc->suite.drbg.vecs;
175864d1cdfbSStephan Mueller 	unsigned int tcount = desc->suite.drbg.count;
175964d1cdfbSStephan Mueller 
176064d1cdfbSStephan Mueller 	if (0 == memcmp(driver, "drbg_pr_", 8))
176164d1cdfbSStephan Mueller 		pr = 1;
176264d1cdfbSStephan Mueller 
176364d1cdfbSStephan Mueller 	for (i = 0; i < tcount; i++) {
176464d1cdfbSStephan Mueller 		err = drbg_cavs_test(&template[i], pr, driver, type, mask);
176564d1cdfbSStephan Mueller 		if (err) {
176664d1cdfbSStephan Mueller 			printk(KERN_ERR "alg: drbg: Test %d failed for %s\n",
176764d1cdfbSStephan Mueller 			       i, driver);
176864d1cdfbSStephan Mueller 			err = -EINVAL;
176964d1cdfbSStephan Mueller 			break;
177064d1cdfbSStephan Mueller 		}
177164d1cdfbSStephan Mueller 	}
177264d1cdfbSStephan Mueller 	return err;
177364d1cdfbSStephan Mueller 
177464d1cdfbSStephan Mueller }
177564d1cdfbSStephan Mueller 
1776946cc463STadeusz Struk static int do_test_rsa(struct crypto_akcipher *tfm,
1777946cc463STadeusz Struk 		       struct akcipher_testvec *vecs)
1778946cc463STadeusz Struk {
1779df27b26fSHerbert Xu 	char *xbuf[XBUFSIZE];
1780946cc463STadeusz Struk 	struct akcipher_request *req;
1781946cc463STadeusz Struk 	void *outbuf_enc = NULL;
1782946cc463STadeusz Struk 	void *outbuf_dec = NULL;
1783946cc463STadeusz Struk 	struct tcrypt_result result;
1784946cc463STadeusz Struk 	unsigned int out_len_max, out_len = 0;
1785946cc463STadeusz Struk 	int err = -ENOMEM;
178622287b0bSTadeusz Struk 	struct scatterlist src, dst, src_tab[2];
1787946cc463STadeusz Struk 
1788df27b26fSHerbert Xu 	if (testmgr_alloc_buf(xbuf))
1789df27b26fSHerbert Xu 		return err;
1790df27b26fSHerbert Xu 
1791946cc463STadeusz Struk 	req = akcipher_request_alloc(tfm, GFP_KERNEL);
1792946cc463STadeusz Struk 	if (!req)
1793df27b26fSHerbert Xu 		goto free_xbuf;
1794946cc463STadeusz Struk 
1795946cc463STadeusz Struk 	init_completion(&result.completion);
179622287b0bSTadeusz Struk 
179722287b0bSTadeusz Struk 	if (vecs->public_key_vec)
179822287b0bSTadeusz Struk 		err = crypto_akcipher_set_pub_key(tfm, vecs->key,
179922287b0bSTadeusz Struk 						  vecs->key_len);
180022287b0bSTadeusz Struk 	else
180122287b0bSTadeusz Struk 		err = crypto_akcipher_set_priv_key(tfm, vecs->key,
180222287b0bSTadeusz Struk 						   vecs->key_len);
1803946cc463STadeusz Struk 	if (err)
1804946cc463STadeusz Struk 		goto free_req;
1805946cc463STadeusz Struk 
180622287b0bSTadeusz Struk 	out_len_max = crypto_akcipher_maxsize(tfm);
1807946cc463STadeusz Struk 	outbuf_enc = kzalloc(out_len_max, GFP_KERNEL);
1808946cc463STadeusz Struk 	if (!outbuf_enc)
1809946cc463STadeusz Struk 		goto free_req;
1810946cc463STadeusz Struk 
1811df27b26fSHerbert Xu 	if (WARN_ON(vecs->m_size > PAGE_SIZE))
1812df27b26fSHerbert Xu 		goto free_all;
1813df27b26fSHerbert Xu 
1814df27b26fSHerbert Xu 	memcpy(xbuf[0], vecs->m, vecs->m_size);
1815df27b26fSHerbert Xu 
181622287b0bSTadeusz Struk 	sg_init_table(src_tab, 2);
1817df27b26fSHerbert Xu 	sg_set_buf(&src_tab[0], xbuf[0], 8);
1818df27b26fSHerbert Xu 	sg_set_buf(&src_tab[1], xbuf[0] + 8, vecs->m_size - 8);
181922287b0bSTadeusz Struk 	sg_init_one(&dst, outbuf_enc, out_len_max);
182022287b0bSTadeusz Struk 	akcipher_request_set_crypt(req, src_tab, &dst, vecs->m_size,
182122287b0bSTadeusz Struk 				   out_len_max);
1822946cc463STadeusz Struk 	akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1823946cc463STadeusz Struk 				      tcrypt_complete, &result);
1824946cc463STadeusz Struk 
1825946cc463STadeusz Struk 	/* Run RSA encrypt - c = m^e mod n;*/
1826946cc463STadeusz Struk 	err = wait_async_op(&result, crypto_akcipher_encrypt(req));
1827946cc463STadeusz Struk 	if (err) {
1828946cc463STadeusz Struk 		pr_err("alg: rsa: encrypt test failed. err %d\n", err);
1829946cc463STadeusz Struk 		goto free_all;
1830946cc463STadeusz Struk 	}
183122287b0bSTadeusz Struk 	if (req->dst_len != vecs->c_size) {
1832946cc463STadeusz Struk 		pr_err("alg: rsa: encrypt test failed. Invalid output len\n");
1833946cc463STadeusz Struk 		err = -EINVAL;
1834946cc463STadeusz Struk 		goto free_all;
1835946cc463STadeusz Struk 	}
1836946cc463STadeusz Struk 	/* verify that encrypted message is equal to expected */
1837df27b26fSHerbert Xu 	if (memcmp(vecs->c, outbuf_enc, vecs->c_size)) {
1838946cc463STadeusz Struk 		pr_err("alg: rsa: encrypt test failed. Invalid output\n");
1839946cc463STadeusz Struk 		err = -EINVAL;
1840946cc463STadeusz Struk 		goto free_all;
1841946cc463STadeusz Struk 	}
1842946cc463STadeusz Struk 	/* Don't invoke decrypt for vectors with public key */
1843946cc463STadeusz Struk 	if (vecs->public_key_vec) {
1844946cc463STadeusz Struk 		err = 0;
1845946cc463STadeusz Struk 		goto free_all;
1846946cc463STadeusz Struk 	}
1847946cc463STadeusz Struk 	outbuf_dec = kzalloc(out_len_max, GFP_KERNEL);
1848946cc463STadeusz Struk 	if (!outbuf_dec) {
1849946cc463STadeusz Struk 		err = -ENOMEM;
1850946cc463STadeusz Struk 		goto free_all;
1851946cc463STadeusz Struk 	}
1852df27b26fSHerbert Xu 
1853df27b26fSHerbert Xu 	if (WARN_ON(vecs->c_size > PAGE_SIZE))
1854df27b26fSHerbert Xu 		goto free_all;
1855df27b26fSHerbert Xu 
1856df27b26fSHerbert Xu 	memcpy(xbuf[0], vecs->c, vecs->c_size);
1857df27b26fSHerbert Xu 
1858df27b26fSHerbert Xu 	sg_init_one(&src, xbuf[0], vecs->c_size);
185922287b0bSTadeusz Struk 	sg_init_one(&dst, outbuf_dec, out_len_max);
1860946cc463STadeusz Struk 	init_completion(&result.completion);
186122287b0bSTadeusz Struk 	akcipher_request_set_crypt(req, &src, &dst, vecs->c_size, out_len_max);
1862946cc463STadeusz Struk 
1863946cc463STadeusz Struk 	/* Run RSA decrypt - m = c^d mod n;*/
1864946cc463STadeusz Struk 	err = wait_async_op(&result, crypto_akcipher_decrypt(req));
1865946cc463STadeusz Struk 	if (err) {
1866946cc463STadeusz Struk 		pr_err("alg: rsa: decrypt test failed. err %d\n", err);
1867946cc463STadeusz Struk 		goto free_all;
1868946cc463STadeusz Struk 	}
1869946cc463STadeusz Struk 	out_len = req->dst_len;
1870946cc463STadeusz Struk 	if (out_len != vecs->m_size) {
1871946cc463STadeusz Struk 		pr_err("alg: rsa: decrypt test failed. Invalid output len\n");
1872946cc463STadeusz Struk 		err = -EINVAL;
1873946cc463STadeusz Struk 		goto free_all;
1874946cc463STadeusz Struk 	}
1875946cc463STadeusz Struk 	/* verify that decrypted message is equal to the original msg */
1876946cc463STadeusz Struk 	if (memcmp(vecs->m, outbuf_dec, vecs->m_size)) {
1877946cc463STadeusz Struk 		pr_err("alg: rsa: decrypt test failed. Invalid output\n");
1878946cc463STadeusz Struk 		err = -EINVAL;
1879946cc463STadeusz Struk 	}
1880946cc463STadeusz Struk free_all:
1881946cc463STadeusz Struk 	kfree(outbuf_dec);
1882946cc463STadeusz Struk 	kfree(outbuf_enc);
1883946cc463STadeusz Struk free_req:
1884946cc463STadeusz Struk 	akcipher_request_free(req);
1885df27b26fSHerbert Xu free_xbuf:
1886df27b26fSHerbert Xu 	testmgr_free_buf(xbuf);
1887946cc463STadeusz Struk 	return err;
1888946cc463STadeusz Struk }
1889946cc463STadeusz Struk 
1890946cc463STadeusz Struk static int test_rsa(struct crypto_akcipher *tfm, struct akcipher_testvec *vecs,
1891946cc463STadeusz Struk 		    unsigned int tcount)
1892946cc463STadeusz Struk {
1893946cc463STadeusz Struk 	int ret, i;
1894946cc463STadeusz Struk 
1895946cc463STadeusz Struk 	for (i = 0; i < tcount; i++) {
1896946cc463STadeusz Struk 		ret = do_test_rsa(tfm, vecs++);
1897946cc463STadeusz Struk 		if (ret) {
1898946cc463STadeusz Struk 			pr_err("alg: rsa: test failed on vector %d, err=%d\n",
1899946cc463STadeusz Struk 			       i + 1, ret);
1900946cc463STadeusz Struk 			return ret;
1901946cc463STadeusz Struk 		}
1902946cc463STadeusz Struk 	}
1903946cc463STadeusz Struk 	return 0;
1904946cc463STadeusz Struk }
1905946cc463STadeusz Struk 
1906946cc463STadeusz Struk static int test_akcipher(struct crypto_akcipher *tfm, const char *alg,
1907946cc463STadeusz Struk 			 struct akcipher_testvec *vecs, unsigned int tcount)
1908946cc463STadeusz Struk {
1909946cc463STadeusz Struk 	if (strncmp(alg, "rsa", 3) == 0)
1910946cc463STadeusz Struk 		return test_rsa(tfm, vecs, tcount);
1911946cc463STadeusz Struk 
1912946cc463STadeusz Struk 	return 0;
1913946cc463STadeusz Struk }
1914946cc463STadeusz Struk 
1915946cc463STadeusz Struk static int alg_test_akcipher(const struct alg_test_desc *desc,
1916946cc463STadeusz Struk 			     const char *driver, u32 type, u32 mask)
1917946cc463STadeusz Struk {
1918946cc463STadeusz Struk 	struct crypto_akcipher *tfm;
1919946cc463STadeusz Struk 	int err = 0;
1920946cc463STadeusz Struk 
1921946cc463STadeusz Struk 	tfm = crypto_alloc_akcipher(driver, type | CRYPTO_ALG_INTERNAL, mask);
1922946cc463STadeusz Struk 	if (IS_ERR(tfm)) {
1923946cc463STadeusz Struk 		pr_err("alg: akcipher: Failed to load tfm for %s: %ld\n",
1924946cc463STadeusz Struk 		       driver, PTR_ERR(tfm));
1925946cc463STadeusz Struk 		return PTR_ERR(tfm);
1926946cc463STadeusz Struk 	}
1927946cc463STadeusz Struk 	if (desc->suite.akcipher.vecs)
1928946cc463STadeusz Struk 		err = test_akcipher(tfm, desc->alg, desc->suite.akcipher.vecs,
1929946cc463STadeusz Struk 				    desc->suite.akcipher.count);
1930946cc463STadeusz Struk 
1931946cc463STadeusz Struk 	crypto_free_akcipher(tfm);
1932946cc463STadeusz Struk 	return err;
1933946cc463STadeusz Struk }
1934946cc463STadeusz Struk 
1935863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc,
1936863b557aSYouquan, Song 			     const char *driver, u32 type, u32 mask)
1937863b557aSYouquan, Song {
1938863b557aSYouquan, Song 	return 0;
1939863b557aSYouquan, Song }
1940863b557aSYouquan, Song 
1941da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */
1942da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = {
1943da7f033dSHerbert Xu 	{
19444d6d6a2cSJohannes Goetzfried 		.alg = "__cbc-cast5-avx",
19454d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
19464d6d6a2cSJohannes Goetzfried 	}, {
19474ea1277dSJohannes Goetzfried 		.alg = "__cbc-cast6-avx",
19484ea1277dSJohannes Goetzfried 		.test = alg_test_null,
19494ea1277dSJohannes Goetzfried 	}, {
19507efe4076SJohannes Goetzfried 		.alg = "__cbc-serpent-avx",
19517efe4076SJohannes Goetzfried 		.test = alg_test_null,
19527efe4076SJohannes Goetzfried 	}, {
195356d76c96SJussi Kivilinna 		.alg = "__cbc-serpent-avx2",
195456d76c96SJussi Kivilinna 		.test = alg_test_null,
195556d76c96SJussi Kivilinna 	}, {
1956937c30d7SJussi Kivilinna 		.alg = "__cbc-serpent-sse2",
1957937c30d7SJussi Kivilinna 		.test = alg_test_null,
1958937c30d7SJussi Kivilinna 	}, {
1959107778b5SJohannes Goetzfried 		.alg = "__cbc-twofish-avx",
1960107778b5SJohannes Goetzfried 		.test = alg_test_null,
1961107778b5SJohannes Goetzfried 	}, {
1962863b557aSYouquan, Song 		.alg = "__driver-cbc-aes-aesni",
1963863b557aSYouquan, Song 		.test = alg_test_null,
19646c79294fSMilan Broz 		.fips_allowed = 1,
1965863b557aSYouquan, Song 	}, {
1966d9b1d2e7SJussi Kivilinna 		.alg = "__driver-cbc-camellia-aesni",
1967d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
1968d9b1d2e7SJussi Kivilinna 	}, {
1969f3f935a7SJussi Kivilinna 		.alg = "__driver-cbc-camellia-aesni-avx2",
1970f3f935a7SJussi Kivilinna 		.test = alg_test_null,
1971f3f935a7SJussi Kivilinna 	}, {
19724d6d6a2cSJohannes Goetzfried 		.alg = "__driver-cbc-cast5-avx",
19734d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
19744d6d6a2cSJohannes Goetzfried 	}, {
19754ea1277dSJohannes Goetzfried 		.alg = "__driver-cbc-cast6-avx",
19764ea1277dSJohannes Goetzfried 		.test = alg_test_null,
19774ea1277dSJohannes Goetzfried 	}, {
19787efe4076SJohannes Goetzfried 		.alg = "__driver-cbc-serpent-avx",
19797efe4076SJohannes Goetzfried 		.test = alg_test_null,
19807efe4076SJohannes Goetzfried 	}, {
198156d76c96SJussi Kivilinna 		.alg = "__driver-cbc-serpent-avx2",
198256d76c96SJussi Kivilinna 		.test = alg_test_null,
198356d76c96SJussi Kivilinna 	}, {
1984937c30d7SJussi Kivilinna 		.alg = "__driver-cbc-serpent-sse2",
1985937c30d7SJussi Kivilinna 		.test = alg_test_null,
1986937c30d7SJussi Kivilinna 	}, {
1987107778b5SJohannes Goetzfried 		.alg = "__driver-cbc-twofish-avx",
1988107778b5SJohannes Goetzfried 		.test = alg_test_null,
1989107778b5SJohannes Goetzfried 	}, {
1990863b557aSYouquan, Song 		.alg = "__driver-ecb-aes-aesni",
1991863b557aSYouquan, Song 		.test = alg_test_null,
19926c79294fSMilan Broz 		.fips_allowed = 1,
1993863b557aSYouquan, Song 	}, {
1994d9b1d2e7SJussi Kivilinna 		.alg = "__driver-ecb-camellia-aesni",
1995d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
1996d9b1d2e7SJussi Kivilinna 	}, {
1997f3f935a7SJussi Kivilinna 		.alg = "__driver-ecb-camellia-aesni-avx2",
1998f3f935a7SJussi Kivilinna 		.test = alg_test_null,
1999f3f935a7SJussi Kivilinna 	}, {
20004d6d6a2cSJohannes Goetzfried 		.alg = "__driver-ecb-cast5-avx",
20014d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
20024d6d6a2cSJohannes Goetzfried 	}, {
20034ea1277dSJohannes Goetzfried 		.alg = "__driver-ecb-cast6-avx",
20044ea1277dSJohannes Goetzfried 		.test = alg_test_null,
20054ea1277dSJohannes Goetzfried 	}, {
20067efe4076SJohannes Goetzfried 		.alg = "__driver-ecb-serpent-avx",
20077efe4076SJohannes Goetzfried 		.test = alg_test_null,
20087efe4076SJohannes Goetzfried 	}, {
200956d76c96SJussi Kivilinna 		.alg = "__driver-ecb-serpent-avx2",
201056d76c96SJussi Kivilinna 		.test = alg_test_null,
201156d76c96SJussi Kivilinna 	}, {
2012937c30d7SJussi Kivilinna 		.alg = "__driver-ecb-serpent-sse2",
2013937c30d7SJussi Kivilinna 		.test = alg_test_null,
2014937c30d7SJussi Kivilinna 	}, {
2015107778b5SJohannes Goetzfried 		.alg = "__driver-ecb-twofish-avx",
2016107778b5SJohannes Goetzfried 		.test = alg_test_null,
2017107778b5SJohannes Goetzfried 	}, {
20189d77b6c2STadeusz Struk 		.alg = "__driver-gcm-aes-aesni",
20199d77b6c2STadeusz Struk 		.test = alg_test_null,
20209d77b6c2STadeusz Struk 		.fips_allowed = 1,
20219d77b6c2STadeusz Struk 	}, {
2022863b557aSYouquan, Song 		.alg = "__ghash-pclmulqdqni",
2023863b557aSYouquan, Song 		.test = alg_test_null,
20246c79294fSMilan Broz 		.fips_allowed = 1,
2025863b557aSYouquan, Song 	}, {
2026e08ca2daSJarod Wilson 		.alg = "ansi_cprng",
2027e08ca2daSJarod Wilson 		.test = alg_test_cprng,
2028e08ca2daSJarod Wilson 		.suite = {
2029e08ca2daSJarod Wilson 			.cprng = {
2030e08ca2daSJarod Wilson 				.vecs = ansi_cprng_aes_tv_template,
2031e08ca2daSJarod Wilson 				.count = ANSI_CPRNG_AES_TEST_VECTORS
2032e08ca2daSJarod Wilson 			}
2033e08ca2daSJarod Wilson 		}
2034e08ca2daSJarod Wilson 	}, {
2035bca4feb0SHoria Geanta 		.alg = "authenc(hmac(md5),ecb(cipher_null))",
2036bca4feb0SHoria Geanta 		.test = alg_test_aead,
2037bca4feb0SHoria Geanta 		.suite = {
2038bca4feb0SHoria Geanta 			.aead = {
2039bca4feb0SHoria Geanta 				.enc = {
2040bca4feb0SHoria Geanta 					.vecs = hmac_md5_ecb_cipher_null_enc_tv_template,
2041bca4feb0SHoria Geanta 					.count = HMAC_MD5_ECB_CIPHER_NULL_ENC_TEST_VECTORS
2042bca4feb0SHoria Geanta 				},
2043bca4feb0SHoria Geanta 				.dec = {
2044bca4feb0SHoria Geanta 					.vecs = hmac_md5_ecb_cipher_null_dec_tv_template,
2045bca4feb0SHoria Geanta 					.count = HMAC_MD5_ECB_CIPHER_NULL_DEC_TEST_VECTORS
2046bca4feb0SHoria Geanta 				}
2047bca4feb0SHoria Geanta 			}
2048bca4feb0SHoria Geanta 		}
2049bca4feb0SHoria Geanta 	}, {
2050a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha1),cbc(aes))",
2051e46e9a46SHoria Geanta 		.test = alg_test_aead,
2052e46e9a46SHoria Geanta 		.suite = {
2053e46e9a46SHoria Geanta 			.aead = {
2054e46e9a46SHoria Geanta 				.enc = {
20555208ed2cSNitesh Lal 					.vecs =
20565208ed2cSNitesh Lal 					hmac_sha1_aes_cbc_enc_tv_temp,
20575208ed2cSNitesh Lal 					.count =
20585208ed2cSNitesh Lal 					HMAC_SHA1_AES_CBC_ENC_TEST_VEC
20595208ed2cSNitesh Lal 				}
20605208ed2cSNitesh Lal 			}
20615208ed2cSNitesh Lal 		}
20625208ed2cSNitesh Lal 	}, {
2063a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha1),cbc(des))",
20645208ed2cSNitesh Lal 		.test = alg_test_aead,
20655208ed2cSNitesh Lal 		.suite = {
20665208ed2cSNitesh Lal 			.aead = {
20675208ed2cSNitesh Lal 				.enc = {
20685208ed2cSNitesh Lal 					.vecs =
20695208ed2cSNitesh Lal 					hmac_sha1_des_cbc_enc_tv_temp,
20705208ed2cSNitesh Lal 					.count =
20715208ed2cSNitesh Lal 					HMAC_SHA1_DES_CBC_ENC_TEST_VEC
20725208ed2cSNitesh Lal 				}
20735208ed2cSNitesh Lal 			}
20745208ed2cSNitesh Lal 		}
20755208ed2cSNitesh Lal 	}, {
2076a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha1),cbc(des3_ede))",
20775208ed2cSNitesh Lal 		.test = alg_test_aead,
2078ed1afac9SMarcus Meissner 		.fips_allowed = 1,
20795208ed2cSNitesh Lal 		.suite = {
20805208ed2cSNitesh Lal 			.aead = {
20815208ed2cSNitesh Lal 				.enc = {
20825208ed2cSNitesh Lal 					.vecs =
20835208ed2cSNitesh Lal 					hmac_sha1_des3_ede_cbc_enc_tv_temp,
20845208ed2cSNitesh Lal 					.count =
20855208ed2cSNitesh Lal 					HMAC_SHA1_DES3_EDE_CBC_ENC_TEST_VEC
2086e46e9a46SHoria Geanta 				}
2087e46e9a46SHoria Geanta 			}
2088e46e9a46SHoria Geanta 		}
2089e46e9a46SHoria Geanta 	}, {
2090fb16abc2SMarcus Meissner 		.alg = "authenc(hmac(sha1),ctr(aes))",
2091fb16abc2SMarcus Meissner 		.test = alg_test_null,
2092fb16abc2SMarcus Meissner 		.fips_allowed = 1,
2093fb16abc2SMarcus Meissner 	}, {
2094bca4feb0SHoria Geanta 		.alg = "authenc(hmac(sha1),ecb(cipher_null))",
2095bca4feb0SHoria Geanta 		.test = alg_test_aead,
2096bca4feb0SHoria Geanta 		.suite = {
2097bca4feb0SHoria Geanta 			.aead = {
2098bca4feb0SHoria Geanta 				.enc = {
20995208ed2cSNitesh Lal 					.vecs =
21005208ed2cSNitesh Lal 					hmac_sha1_ecb_cipher_null_enc_tv_temp,
21015208ed2cSNitesh Lal 					.count =
21025208ed2cSNitesh Lal 					HMAC_SHA1_ECB_CIPHER_NULL_ENC_TEST_VEC
2103bca4feb0SHoria Geanta 				},
2104bca4feb0SHoria Geanta 				.dec = {
21055208ed2cSNitesh Lal 					.vecs =
21065208ed2cSNitesh Lal 					hmac_sha1_ecb_cipher_null_dec_tv_temp,
21075208ed2cSNitesh Lal 					.count =
21085208ed2cSNitesh Lal 					HMAC_SHA1_ECB_CIPHER_NULL_DEC_TEST_VEC
21095208ed2cSNitesh Lal 				}
21105208ed2cSNitesh Lal 			}
21115208ed2cSNitesh Lal 		}
21125208ed2cSNitesh Lal 	}, {
21138888690eSMarcus Meissner 		.alg = "authenc(hmac(sha1),rfc3686(ctr(aes)))",
21148888690eSMarcus Meissner 		.test = alg_test_null,
21158888690eSMarcus Meissner 		.fips_allowed = 1,
21168888690eSMarcus Meissner 	}, {
2117a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha224),cbc(des))",
21185208ed2cSNitesh Lal 		.test = alg_test_aead,
21195208ed2cSNitesh Lal 		.suite = {
21205208ed2cSNitesh Lal 			.aead = {
21215208ed2cSNitesh Lal 				.enc = {
21225208ed2cSNitesh Lal 					.vecs =
21235208ed2cSNitesh Lal 					hmac_sha224_des_cbc_enc_tv_temp,
21245208ed2cSNitesh Lal 					.count =
21255208ed2cSNitesh Lal 					HMAC_SHA224_DES_CBC_ENC_TEST_VEC
21265208ed2cSNitesh Lal 				}
21275208ed2cSNitesh Lal 			}
21285208ed2cSNitesh Lal 		}
21295208ed2cSNitesh Lal 	}, {
2130a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha224),cbc(des3_ede))",
21315208ed2cSNitesh Lal 		.test = alg_test_aead,
2132ed1afac9SMarcus Meissner 		.fips_allowed = 1,
21335208ed2cSNitesh Lal 		.suite = {
21345208ed2cSNitesh Lal 			.aead = {
21355208ed2cSNitesh Lal 				.enc = {
21365208ed2cSNitesh Lal 					.vecs =
21375208ed2cSNitesh Lal 					hmac_sha224_des3_ede_cbc_enc_tv_temp,
21385208ed2cSNitesh Lal 					.count =
21395208ed2cSNitesh Lal 					HMAC_SHA224_DES3_EDE_CBC_ENC_TEST_VEC
2140bca4feb0SHoria Geanta 				}
2141bca4feb0SHoria Geanta 			}
2142bca4feb0SHoria Geanta 		}
2143bca4feb0SHoria Geanta 	}, {
2144a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha256),cbc(aes))",
2145e46e9a46SHoria Geanta 		.test = alg_test_aead,
2146ed1afac9SMarcus Meissner 		.fips_allowed = 1,
2147e46e9a46SHoria Geanta 		.suite = {
2148e46e9a46SHoria Geanta 			.aead = {
2149e46e9a46SHoria Geanta 				.enc = {
21505208ed2cSNitesh Lal 					.vecs =
21515208ed2cSNitesh Lal 					hmac_sha256_aes_cbc_enc_tv_temp,
21525208ed2cSNitesh Lal 					.count =
21535208ed2cSNitesh Lal 					HMAC_SHA256_AES_CBC_ENC_TEST_VEC
21545208ed2cSNitesh Lal 				}
21555208ed2cSNitesh Lal 			}
21565208ed2cSNitesh Lal 		}
21575208ed2cSNitesh Lal 	}, {
2158a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha256),cbc(des))",
21595208ed2cSNitesh Lal 		.test = alg_test_aead,
21605208ed2cSNitesh Lal 		.suite = {
21615208ed2cSNitesh Lal 			.aead = {
21625208ed2cSNitesh Lal 				.enc = {
21635208ed2cSNitesh Lal 					.vecs =
21645208ed2cSNitesh Lal 					hmac_sha256_des_cbc_enc_tv_temp,
21655208ed2cSNitesh Lal 					.count =
21665208ed2cSNitesh Lal 					HMAC_SHA256_DES_CBC_ENC_TEST_VEC
21675208ed2cSNitesh Lal 				}
21685208ed2cSNitesh Lal 			}
21695208ed2cSNitesh Lal 		}
21705208ed2cSNitesh Lal 	}, {
2171a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha256),cbc(des3_ede))",
21725208ed2cSNitesh Lal 		.test = alg_test_aead,
2173ed1afac9SMarcus Meissner 		.fips_allowed = 1,
21745208ed2cSNitesh Lal 		.suite = {
21755208ed2cSNitesh Lal 			.aead = {
21765208ed2cSNitesh Lal 				.enc = {
21775208ed2cSNitesh Lal 					.vecs =
21785208ed2cSNitesh Lal 					hmac_sha256_des3_ede_cbc_enc_tv_temp,
21795208ed2cSNitesh Lal 					.count =
21805208ed2cSNitesh Lal 					HMAC_SHA256_DES3_EDE_CBC_ENC_TEST_VEC
21815208ed2cSNitesh Lal 				}
21825208ed2cSNitesh Lal 			}
21835208ed2cSNitesh Lal 		}
21845208ed2cSNitesh Lal 	}, {
2185fb16abc2SMarcus Meissner 		.alg = "authenc(hmac(sha256),ctr(aes))",
2186fb16abc2SMarcus Meissner 		.test = alg_test_null,
2187fb16abc2SMarcus Meissner 		.fips_allowed = 1,
2188fb16abc2SMarcus Meissner 	}, {
21898888690eSMarcus Meissner 		.alg = "authenc(hmac(sha256),rfc3686(ctr(aes)))",
21908888690eSMarcus Meissner 		.test = alg_test_null,
21918888690eSMarcus Meissner 		.fips_allowed = 1,
21928888690eSMarcus Meissner 	}, {
2193a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha384),cbc(des))",
21945208ed2cSNitesh Lal 		.test = alg_test_aead,
21955208ed2cSNitesh Lal 		.suite = {
21965208ed2cSNitesh Lal 			.aead = {
21975208ed2cSNitesh Lal 				.enc = {
21985208ed2cSNitesh Lal 					.vecs =
21995208ed2cSNitesh Lal 					hmac_sha384_des_cbc_enc_tv_temp,
22005208ed2cSNitesh Lal 					.count =
22015208ed2cSNitesh Lal 					HMAC_SHA384_DES_CBC_ENC_TEST_VEC
22025208ed2cSNitesh Lal 				}
22035208ed2cSNitesh Lal 			}
22045208ed2cSNitesh Lal 		}
22055208ed2cSNitesh Lal 	}, {
2206a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha384),cbc(des3_ede))",
22075208ed2cSNitesh Lal 		.test = alg_test_aead,
2208ed1afac9SMarcus Meissner 		.fips_allowed = 1,
22095208ed2cSNitesh Lal 		.suite = {
22105208ed2cSNitesh Lal 			.aead = {
22115208ed2cSNitesh Lal 				.enc = {
22125208ed2cSNitesh Lal 					.vecs =
22135208ed2cSNitesh Lal 					hmac_sha384_des3_ede_cbc_enc_tv_temp,
22145208ed2cSNitesh Lal 					.count =
22155208ed2cSNitesh Lal 					HMAC_SHA384_DES3_EDE_CBC_ENC_TEST_VEC
2216e46e9a46SHoria Geanta 				}
2217e46e9a46SHoria Geanta 			}
2218e46e9a46SHoria Geanta 		}
2219e46e9a46SHoria Geanta 	}, {
2220fb16abc2SMarcus Meissner 		.alg = "authenc(hmac(sha384),ctr(aes))",
2221fb16abc2SMarcus Meissner 		.test = alg_test_null,
2222fb16abc2SMarcus Meissner 		.fips_allowed = 1,
2223fb16abc2SMarcus Meissner 	}, {
22248888690eSMarcus Meissner 		.alg = "authenc(hmac(sha384),rfc3686(ctr(aes)))",
22258888690eSMarcus Meissner 		.test = alg_test_null,
22268888690eSMarcus Meissner 		.fips_allowed = 1,
22278888690eSMarcus Meissner 	}, {
2228a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha512),cbc(aes))",
2229ed1afac9SMarcus Meissner 		.fips_allowed = 1,
2230e46e9a46SHoria Geanta 		.test = alg_test_aead,
2231e46e9a46SHoria Geanta 		.suite = {
2232e46e9a46SHoria Geanta 			.aead = {
2233e46e9a46SHoria Geanta 				.enc = {
22345208ed2cSNitesh Lal 					.vecs =
22355208ed2cSNitesh Lal 					hmac_sha512_aes_cbc_enc_tv_temp,
22365208ed2cSNitesh Lal 					.count =
22375208ed2cSNitesh Lal 					HMAC_SHA512_AES_CBC_ENC_TEST_VEC
22385208ed2cSNitesh Lal 				}
22395208ed2cSNitesh Lal 			}
22405208ed2cSNitesh Lal 		}
22415208ed2cSNitesh Lal 	}, {
2242a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha512),cbc(des))",
22435208ed2cSNitesh Lal 		.test = alg_test_aead,
22445208ed2cSNitesh Lal 		.suite = {
22455208ed2cSNitesh Lal 			.aead = {
22465208ed2cSNitesh Lal 				.enc = {
22475208ed2cSNitesh Lal 					.vecs =
22485208ed2cSNitesh Lal 					hmac_sha512_des_cbc_enc_tv_temp,
22495208ed2cSNitesh Lal 					.count =
22505208ed2cSNitesh Lal 					HMAC_SHA512_DES_CBC_ENC_TEST_VEC
22515208ed2cSNitesh Lal 				}
22525208ed2cSNitesh Lal 			}
22535208ed2cSNitesh Lal 		}
22545208ed2cSNitesh Lal 	}, {
2255a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha512),cbc(des3_ede))",
22565208ed2cSNitesh Lal 		.test = alg_test_aead,
2257ed1afac9SMarcus Meissner 		.fips_allowed = 1,
22585208ed2cSNitesh Lal 		.suite = {
22595208ed2cSNitesh Lal 			.aead = {
22605208ed2cSNitesh Lal 				.enc = {
22615208ed2cSNitesh Lal 					.vecs =
22625208ed2cSNitesh Lal 					hmac_sha512_des3_ede_cbc_enc_tv_temp,
22635208ed2cSNitesh Lal 					.count =
22645208ed2cSNitesh Lal 					HMAC_SHA512_DES3_EDE_CBC_ENC_TEST_VEC
2265e46e9a46SHoria Geanta 				}
2266e46e9a46SHoria Geanta 			}
2267e46e9a46SHoria Geanta 		}
2268e46e9a46SHoria Geanta 	}, {
2269fb16abc2SMarcus Meissner 		.alg = "authenc(hmac(sha512),ctr(aes))",
2270fb16abc2SMarcus Meissner 		.test = alg_test_null,
2271fb16abc2SMarcus Meissner 		.fips_allowed = 1,
2272fb16abc2SMarcus Meissner 	}, {
22738888690eSMarcus Meissner 		.alg = "authenc(hmac(sha512),rfc3686(ctr(aes)))",
22748888690eSMarcus Meissner 		.test = alg_test_null,
22758888690eSMarcus Meissner 		.fips_allowed = 1,
22768888690eSMarcus Meissner 	}, {
2277da7f033dSHerbert Xu 		.alg = "cbc(aes)",
22781aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2279a1915d51SJarod Wilson 		.fips_allowed = 1,
2280da7f033dSHerbert Xu 		.suite = {
2281da7f033dSHerbert Xu 			.cipher = {
2282da7f033dSHerbert Xu 				.enc = {
2283da7f033dSHerbert Xu 					.vecs = aes_cbc_enc_tv_template,
2284da7f033dSHerbert Xu 					.count = AES_CBC_ENC_TEST_VECTORS
2285da7f033dSHerbert Xu 				},
2286da7f033dSHerbert Xu 				.dec = {
2287da7f033dSHerbert Xu 					.vecs = aes_cbc_dec_tv_template,
2288da7f033dSHerbert Xu 					.count = AES_CBC_DEC_TEST_VECTORS
2289da7f033dSHerbert Xu 				}
2290da7f033dSHerbert Xu 			}
2291da7f033dSHerbert Xu 		}
2292da7f033dSHerbert Xu 	}, {
2293da7f033dSHerbert Xu 		.alg = "cbc(anubis)",
22941aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2295da7f033dSHerbert Xu 		.suite = {
2296da7f033dSHerbert Xu 			.cipher = {
2297da7f033dSHerbert Xu 				.enc = {
2298da7f033dSHerbert Xu 					.vecs = anubis_cbc_enc_tv_template,
2299da7f033dSHerbert Xu 					.count = ANUBIS_CBC_ENC_TEST_VECTORS
2300da7f033dSHerbert Xu 				},
2301da7f033dSHerbert Xu 				.dec = {
2302da7f033dSHerbert Xu 					.vecs = anubis_cbc_dec_tv_template,
2303da7f033dSHerbert Xu 					.count = ANUBIS_CBC_DEC_TEST_VECTORS
2304da7f033dSHerbert Xu 				}
2305da7f033dSHerbert Xu 			}
2306da7f033dSHerbert Xu 		}
2307da7f033dSHerbert Xu 	}, {
2308da7f033dSHerbert Xu 		.alg = "cbc(blowfish)",
23091aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2310da7f033dSHerbert Xu 		.suite = {
2311da7f033dSHerbert Xu 			.cipher = {
2312da7f033dSHerbert Xu 				.enc = {
2313da7f033dSHerbert Xu 					.vecs = bf_cbc_enc_tv_template,
2314da7f033dSHerbert Xu 					.count = BF_CBC_ENC_TEST_VECTORS
2315da7f033dSHerbert Xu 				},
2316da7f033dSHerbert Xu 				.dec = {
2317da7f033dSHerbert Xu 					.vecs = bf_cbc_dec_tv_template,
2318da7f033dSHerbert Xu 					.count = BF_CBC_DEC_TEST_VECTORS
2319da7f033dSHerbert Xu 				}
2320da7f033dSHerbert Xu 			}
2321da7f033dSHerbert Xu 		}
2322da7f033dSHerbert Xu 	}, {
2323da7f033dSHerbert Xu 		.alg = "cbc(camellia)",
23241aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2325da7f033dSHerbert Xu 		.suite = {
2326da7f033dSHerbert Xu 			.cipher = {
2327da7f033dSHerbert Xu 				.enc = {
2328da7f033dSHerbert Xu 					.vecs = camellia_cbc_enc_tv_template,
2329da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_ENC_TEST_VECTORS
2330da7f033dSHerbert Xu 				},
2331da7f033dSHerbert Xu 				.dec = {
2332da7f033dSHerbert Xu 					.vecs = camellia_cbc_dec_tv_template,
2333da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_DEC_TEST_VECTORS
2334da7f033dSHerbert Xu 				}
2335da7f033dSHerbert Xu 			}
2336da7f033dSHerbert Xu 		}
2337da7f033dSHerbert Xu 	}, {
2338a2c58260SJohannes Goetzfried 		.alg = "cbc(cast5)",
2339a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2340a2c58260SJohannes Goetzfried 		.suite = {
2341a2c58260SJohannes Goetzfried 			.cipher = {
2342a2c58260SJohannes Goetzfried 				.enc = {
2343a2c58260SJohannes Goetzfried 					.vecs = cast5_cbc_enc_tv_template,
2344a2c58260SJohannes Goetzfried 					.count = CAST5_CBC_ENC_TEST_VECTORS
2345a2c58260SJohannes Goetzfried 				},
2346a2c58260SJohannes Goetzfried 				.dec = {
2347a2c58260SJohannes Goetzfried 					.vecs = cast5_cbc_dec_tv_template,
2348a2c58260SJohannes Goetzfried 					.count = CAST5_CBC_DEC_TEST_VECTORS
2349a2c58260SJohannes Goetzfried 				}
2350a2c58260SJohannes Goetzfried 			}
2351a2c58260SJohannes Goetzfried 		}
2352a2c58260SJohannes Goetzfried 	}, {
23539b8b0405SJohannes Goetzfried 		.alg = "cbc(cast6)",
23549b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
23559b8b0405SJohannes Goetzfried 		.suite = {
23569b8b0405SJohannes Goetzfried 			.cipher = {
23579b8b0405SJohannes Goetzfried 				.enc = {
23589b8b0405SJohannes Goetzfried 					.vecs = cast6_cbc_enc_tv_template,
23599b8b0405SJohannes Goetzfried 					.count = CAST6_CBC_ENC_TEST_VECTORS
23609b8b0405SJohannes Goetzfried 				},
23619b8b0405SJohannes Goetzfried 				.dec = {
23629b8b0405SJohannes Goetzfried 					.vecs = cast6_cbc_dec_tv_template,
23639b8b0405SJohannes Goetzfried 					.count = CAST6_CBC_DEC_TEST_VECTORS
23649b8b0405SJohannes Goetzfried 				}
23659b8b0405SJohannes Goetzfried 			}
23669b8b0405SJohannes Goetzfried 		}
23679b8b0405SJohannes Goetzfried 	}, {
2368da7f033dSHerbert Xu 		.alg = "cbc(des)",
23691aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2370da7f033dSHerbert Xu 		.suite = {
2371da7f033dSHerbert Xu 			.cipher = {
2372da7f033dSHerbert Xu 				.enc = {
2373da7f033dSHerbert Xu 					.vecs = des_cbc_enc_tv_template,
2374da7f033dSHerbert Xu 					.count = DES_CBC_ENC_TEST_VECTORS
2375da7f033dSHerbert Xu 				},
2376da7f033dSHerbert Xu 				.dec = {
2377da7f033dSHerbert Xu 					.vecs = des_cbc_dec_tv_template,
2378da7f033dSHerbert Xu 					.count = DES_CBC_DEC_TEST_VECTORS
2379da7f033dSHerbert Xu 				}
2380da7f033dSHerbert Xu 			}
2381da7f033dSHerbert Xu 		}
2382da7f033dSHerbert Xu 	}, {
2383da7f033dSHerbert Xu 		.alg = "cbc(des3_ede)",
23841aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2385a1915d51SJarod Wilson 		.fips_allowed = 1,
2386da7f033dSHerbert Xu 		.suite = {
2387da7f033dSHerbert Xu 			.cipher = {
2388da7f033dSHerbert Xu 				.enc = {
2389da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_enc_tv_template,
2390da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_ENC_TEST_VECTORS
2391da7f033dSHerbert Xu 				},
2392da7f033dSHerbert Xu 				.dec = {
2393da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_dec_tv_template,
2394da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_DEC_TEST_VECTORS
2395da7f033dSHerbert Xu 				}
2396da7f033dSHerbert Xu 			}
2397da7f033dSHerbert Xu 		}
2398da7f033dSHerbert Xu 	}, {
23999d25917dSJussi Kivilinna 		.alg = "cbc(serpent)",
24009d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
24019d25917dSJussi Kivilinna 		.suite = {
24029d25917dSJussi Kivilinna 			.cipher = {
24039d25917dSJussi Kivilinna 				.enc = {
24049d25917dSJussi Kivilinna 					.vecs = serpent_cbc_enc_tv_template,
24059d25917dSJussi Kivilinna 					.count = SERPENT_CBC_ENC_TEST_VECTORS
24069d25917dSJussi Kivilinna 				},
24079d25917dSJussi Kivilinna 				.dec = {
24089d25917dSJussi Kivilinna 					.vecs = serpent_cbc_dec_tv_template,
24099d25917dSJussi Kivilinna 					.count = SERPENT_CBC_DEC_TEST_VECTORS
24109d25917dSJussi Kivilinna 				}
24119d25917dSJussi Kivilinna 			}
24129d25917dSJussi Kivilinna 		}
24139d25917dSJussi Kivilinna 	}, {
2414da7f033dSHerbert Xu 		.alg = "cbc(twofish)",
24151aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2416da7f033dSHerbert Xu 		.suite = {
2417da7f033dSHerbert Xu 			.cipher = {
2418da7f033dSHerbert Xu 				.enc = {
2419da7f033dSHerbert Xu 					.vecs = tf_cbc_enc_tv_template,
2420da7f033dSHerbert Xu 					.count = TF_CBC_ENC_TEST_VECTORS
2421da7f033dSHerbert Xu 				},
2422da7f033dSHerbert Xu 				.dec = {
2423da7f033dSHerbert Xu 					.vecs = tf_cbc_dec_tv_template,
2424da7f033dSHerbert Xu 					.count = TF_CBC_DEC_TEST_VECTORS
2425da7f033dSHerbert Xu 				}
2426da7f033dSHerbert Xu 			}
2427da7f033dSHerbert Xu 		}
2428da7f033dSHerbert Xu 	}, {
2429da7f033dSHerbert Xu 		.alg = "ccm(aes)",
2430da7f033dSHerbert Xu 		.test = alg_test_aead,
2431a1915d51SJarod Wilson 		.fips_allowed = 1,
2432da7f033dSHerbert Xu 		.suite = {
2433da7f033dSHerbert Xu 			.aead = {
2434da7f033dSHerbert Xu 				.enc = {
2435da7f033dSHerbert Xu 					.vecs = aes_ccm_enc_tv_template,
2436da7f033dSHerbert Xu 					.count = AES_CCM_ENC_TEST_VECTORS
2437da7f033dSHerbert Xu 				},
2438da7f033dSHerbert Xu 				.dec = {
2439da7f033dSHerbert Xu 					.vecs = aes_ccm_dec_tv_template,
2440da7f033dSHerbert Xu 					.count = AES_CCM_DEC_TEST_VECTORS
2441da7f033dSHerbert Xu 				}
2442da7f033dSHerbert Xu 			}
2443da7f033dSHerbert Xu 		}
2444da7f033dSHerbert Xu 	}, {
24453590ebf2SMartin Willi 		.alg = "chacha20",
24463590ebf2SMartin Willi 		.test = alg_test_skcipher,
24473590ebf2SMartin Willi 		.suite = {
24483590ebf2SMartin Willi 			.cipher = {
24493590ebf2SMartin Willi 				.enc = {
24503590ebf2SMartin Willi 					.vecs = chacha20_enc_tv_template,
24513590ebf2SMartin Willi 					.count = CHACHA20_ENC_TEST_VECTORS
24523590ebf2SMartin Willi 				},
24533590ebf2SMartin Willi 				.dec = {
24543590ebf2SMartin Willi 					.vecs = chacha20_enc_tv_template,
24553590ebf2SMartin Willi 					.count = CHACHA20_ENC_TEST_VECTORS
24563590ebf2SMartin Willi 				},
24573590ebf2SMartin Willi 			}
24583590ebf2SMartin Willi 		}
24593590ebf2SMartin Willi 	}, {
246093b5e86aSJussi Kivilinna 		.alg = "cmac(aes)",
24618f183751SStephan Mueller 		.fips_allowed = 1,
246293b5e86aSJussi Kivilinna 		.test = alg_test_hash,
246393b5e86aSJussi Kivilinna 		.suite = {
246493b5e86aSJussi Kivilinna 			.hash = {
246593b5e86aSJussi Kivilinna 				.vecs = aes_cmac128_tv_template,
246693b5e86aSJussi Kivilinna 				.count = CMAC_AES_TEST_VECTORS
246793b5e86aSJussi Kivilinna 			}
246893b5e86aSJussi Kivilinna 		}
246993b5e86aSJussi Kivilinna 	}, {
247093b5e86aSJussi Kivilinna 		.alg = "cmac(des3_ede)",
24718f183751SStephan Mueller 		.fips_allowed = 1,
247293b5e86aSJussi Kivilinna 		.test = alg_test_hash,
247393b5e86aSJussi Kivilinna 		.suite = {
247493b5e86aSJussi Kivilinna 			.hash = {
247593b5e86aSJussi Kivilinna 				.vecs = des3_ede_cmac64_tv_template,
247693b5e86aSJussi Kivilinna 				.count = CMAC_DES3_EDE_TEST_VECTORS
247793b5e86aSJussi Kivilinna 			}
247893b5e86aSJussi Kivilinna 		}
247993b5e86aSJussi Kivilinna 	}, {
2480e448370dSJussi Kivilinna 		.alg = "compress_null",
2481e448370dSJussi Kivilinna 		.test = alg_test_null,
2482e448370dSJussi Kivilinna 	}, {
2483ebb3472fSArd Biesheuvel 		.alg = "crc32",
2484ebb3472fSArd Biesheuvel 		.test = alg_test_hash,
2485ebb3472fSArd Biesheuvel 		.suite = {
2486ebb3472fSArd Biesheuvel 			.hash = {
2487ebb3472fSArd Biesheuvel 				.vecs = crc32_tv_template,
2488ebb3472fSArd Biesheuvel 				.count = CRC32_TEST_VECTORS
2489ebb3472fSArd Biesheuvel 			}
2490ebb3472fSArd Biesheuvel 		}
2491ebb3472fSArd Biesheuvel 	}, {
2492da7f033dSHerbert Xu 		.alg = "crc32c",
24938e3ee85eSHerbert Xu 		.test = alg_test_crc32c,
2494a1915d51SJarod Wilson 		.fips_allowed = 1,
2495da7f033dSHerbert Xu 		.suite = {
2496da7f033dSHerbert Xu 			.hash = {
2497da7f033dSHerbert Xu 				.vecs = crc32c_tv_template,
2498da7f033dSHerbert Xu 				.count = CRC32C_TEST_VECTORS
2499da7f033dSHerbert Xu 			}
2500da7f033dSHerbert Xu 		}
2501da7f033dSHerbert Xu 	}, {
250268411521SHerbert Xu 		.alg = "crct10dif",
250368411521SHerbert Xu 		.test = alg_test_hash,
250468411521SHerbert Xu 		.fips_allowed = 1,
250568411521SHerbert Xu 		.suite = {
250668411521SHerbert Xu 			.hash = {
250768411521SHerbert Xu 				.vecs = crct10dif_tv_template,
250868411521SHerbert Xu 				.count = CRCT10DIF_TEST_VECTORS
250968411521SHerbert Xu 			}
251068411521SHerbert Xu 		}
251168411521SHerbert Xu 	}, {
25126c79294fSMilan Broz 		.alg = "cryptd(__driver-cbc-aes-aesni)",
25136c79294fSMilan Broz 		.test = alg_test_null,
25146c79294fSMilan Broz 		.fips_allowed = 1,
25156c79294fSMilan Broz 	}, {
2516d9b1d2e7SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-camellia-aesni)",
2517d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2518d9b1d2e7SJussi Kivilinna 	}, {
2519f3f935a7SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-camellia-aesni-avx2)",
2520f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2521f3f935a7SJussi Kivilinna 	}, {
252256d76c96SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-serpent-avx2)",
252356d76c96SJussi Kivilinna 		.test = alg_test_null,
252456d76c96SJussi Kivilinna 	}, {
2525863b557aSYouquan, Song 		.alg = "cryptd(__driver-ecb-aes-aesni)",
2526863b557aSYouquan, Song 		.test = alg_test_null,
25276c79294fSMilan Broz 		.fips_allowed = 1,
2528863b557aSYouquan, Song 	}, {
2529d9b1d2e7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-camellia-aesni)",
2530d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2531d9b1d2e7SJussi Kivilinna 	}, {
2532f3f935a7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-camellia-aesni-avx2)",
2533f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2534f3f935a7SJussi Kivilinna 	}, {
25354d6d6a2cSJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-cast5-avx)",
25364d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
25374d6d6a2cSJohannes Goetzfried 	}, {
25384ea1277dSJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-cast6-avx)",
25394ea1277dSJohannes Goetzfried 		.test = alg_test_null,
25404ea1277dSJohannes Goetzfried 	}, {
25417efe4076SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-serpent-avx)",
25427efe4076SJohannes Goetzfried 		.test = alg_test_null,
25437efe4076SJohannes Goetzfried 	}, {
254456d76c96SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-serpent-avx2)",
254556d76c96SJussi Kivilinna 		.test = alg_test_null,
254656d76c96SJussi Kivilinna 	}, {
2547937c30d7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-serpent-sse2)",
2548937c30d7SJussi Kivilinna 		.test = alg_test_null,
2549937c30d7SJussi Kivilinna 	}, {
2550107778b5SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-twofish-avx)",
2551107778b5SJohannes Goetzfried 		.test = alg_test_null,
2552107778b5SJohannes Goetzfried 	}, {
25536c79294fSMilan Broz 		.alg = "cryptd(__driver-gcm-aes-aesni)",
25546c79294fSMilan Broz 		.test = alg_test_null,
25556c79294fSMilan Broz 		.fips_allowed = 1,
25566c79294fSMilan Broz 	}, {
2557863b557aSYouquan, Song 		.alg = "cryptd(__ghash-pclmulqdqni)",
2558863b557aSYouquan, Song 		.test = alg_test_null,
25596c79294fSMilan Broz 		.fips_allowed = 1,
2560863b557aSYouquan, Song 	}, {
2561f7cb80f2SJarod Wilson 		.alg = "ctr(aes)",
2562f7cb80f2SJarod Wilson 		.test = alg_test_skcipher,
2563a1915d51SJarod Wilson 		.fips_allowed = 1,
2564f7cb80f2SJarod Wilson 		.suite = {
2565f7cb80f2SJarod Wilson 			.cipher = {
2566f7cb80f2SJarod Wilson 				.enc = {
2567f7cb80f2SJarod Wilson 					.vecs = aes_ctr_enc_tv_template,
2568f7cb80f2SJarod Wilson 					.count = AES_CTR_ENC_TEST_VECTORS
2569f7cb80f2SJarod Wilson 				},
2570f7cb80f2SJarod Wilson 				.dec = {
2571f7cb80f2SJarod Wilson 					.vecs = aes_ctr_dec_tv_template,
2572f7cb80f2SJarod Wilson 					.count = AES_CTR_DEC_TEST_VECTORS
2573f7cb80f2SJarod Wilson 				}
2574f7cb80f2SJarod Wilson 			}
2575f7cb80f2SJarod Wilson 		}
2576f7cb80f2SJarod Wilson 	}, {
257785b63e34SJussi Kivilinna 		.alg = "ctr(blowfish)",
257885b63e34SJussi Kivilinna 		.test = alg_test_skcipher,
257985b63e34SJussi Kivilinna 		.suite = {
258085b63e34SJussi Kivilinna 			.cipher = {
258185b63e34SJussi Kivilinna 				.enc = {
258285b63e34SJussi Kivilinna 					.vecs = bf_ctr_enc_tv_template,
258385b63e34SJussi Kivilinna 					.count = BF_CTR_ENC_TEST_VECTORS
258485b63e34SJussi Kivilinna 				},
258585b63e34SJussi Kivilinna 				.dec = {
258685b63e34SJussi Kivilinna 					.vecs = bf_ctr_dec_tv_template,
258785b63e34SJussi Kivilinna 					.count = BF_CTR_DEC_TEST_VECTORS
258885b63e34SJussi Kivilinna 				}
258985b63e34SJussi Kivilinna 			}
259085b63e34SJussi Kivilinna 		}
259185b63e34SJussi Kivilinna 	}, {
25920840605eSJussi Kivilinna 		.alg = "ctr(camellia)",
25930840605eSJussi Kivilinna 		.test = alg_test_skcipher,
25940840605eSJussi Kivilinna 		.suite = {
25950840605eSJussi Kivilinna 			.cipher = {
25960840605eSJussi Kivilinna 				.enc = {
25970840605eSJussi Kivilinna 					.vecs = camellia_ctr_enc_tv_template,
25980840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_ENC_TEST_VECTORS
25990840605eSJussi Kivilinna 				},
26000840605eSJussi Kivilinna 				.dec = {
26010840605eSJussi Kivilinna 					.vecs = camellia_ctr_dec_tv_template,
26020840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_DEC_TEST_VECTORS
26030840605eSJussi Kivilinna 				}
26040840605eSJussi Kivilinna 			}
26050840605eSJussi Kivilinna 		}
26060840605eSJussi Kivilinna 	}, {
2607a2c58260SJohannes Goetzfried 		.alg = "ctr(cast5)",
2608a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2609a2c58260SJohannes Goetzfried 		.suite = {
2610a2c58260SJohannes Goetzfried 			.cipher = {
2611a2c58260SJohannes Goetzfried 				.enc = {
2612a2c58260SJohannes Goetzfried 					.vecs = cast5_ctr_enc_tv_template,
2613a2c58260SJohannes Goetzfried 					.count = CAST5_CTR_ENC_TEST_VECTORS
2614a2c58260SJohannes Goetzfried 				},
2615a2c58260SJohannes Goetzfried 				.dec = {
2616a2c58260SJohannes Goetzfried 					.vecs = cast5_ctr_dec_tv_template,
2617a2c58260SJohannes Goetzfried 					.count = CAST5_CTR_DEC_TEST_VECTORS
2618a2c58260SJohannes Goetzfried 				}
2619a2c58260SJohannes Goetzfried 			}
2620a2c58260SJohannes Goetzfried 		}
2621a2c58260SJohannes Goetzfried 	}, {
26229b8b0405SJohannes Goetzfried 		.alg = "ctr(cast6)",
26239b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
26249b8b0405SJohannes Goetzfried 		.suite = {
26259b8b0405SJohannes Goetzfried 			.cipher = {
26269b8b0405SJohannes Goetzfried 				.enc = {
26279b8b0405SJohannes Goetzfried 					.vecs = cast6_ctr_enc_tv_template,
26289b8b0405SJohannes Goetzfried 					.count = CAST6_CTR_ENC_TEST_VECTORS
26299b8b0405SJohannes Goetzfried 				},
26309b8b0405SJohannes Goetzfried 				.dec = {
26319b8b0405SJohannes Goetzfried 					.vecs = cast6_ctr_dec_tv_template,
26329b8b0405SJohannes Goetzfried 					.count = CAST6_CTR_DEC_TEST_VECTORS
26339b8b0405SJohannes Goetzfried 				}
26349b8b0405SJohannes Goetzfried 			}
26359b8b0405SJohannes Goetzfried 		}
26369b8b0405SJohannes Goetzfried 	}, {
26378163fc30SJussi Kivilinna 		.alg = "ctr(des)",
26388163fc30SJussi Kivilinna 		.test = alg_test_skcipher,
26398163fc30SJussi Kivilinna 		.suite = {
26408163fc30SJussi Kivilinna 			.cipher = {
26418163fc30SJussi Kivilinna 				.enc = {
26428163fc30SJussi Kivilinna 					.vecs = des_ctr_enc_tv_template,
26438163fc30SJussi Kivilinna 					.count = DES_CTR_ENC_TEST_VECTORS
26448163fc30SJussi Kivilinna 				},
26458163fc30SJussi Kivilinna 				.dec = {
26468163fc30SJussi Kivilinna 					.vecs = des_ctr_dec_tv_template,
26478163fc30SJussi Kivilinna 					.count = DES_CTR_DEC_TEST_VECTORS
26488163fc30SJussi Kivilinna 				}
26498163fc30SJussi Kivilinna 			}
26508163fc30SJussi Kivilinna 		}
26518163fc30SJussi Kivilinna 	}, {
2652e080b17aSJussi Kivilinna 		.alg = "ctr(des3_ede)",
2653e080b17aSJussi Kivilinna 		.test = alg_test_skcipher,
2654e080b17aSJussi Kivilinna 		.suite = {
2655e080b17aSJussi Kivilinna 			.cipher = {
2656e080b17aSJussi Kivilinna 				.enc = {
2657e080b17aSJussi Kivilinna 					.vecs = des3_ede_ctr_enc_tv_template,
2658e080b17aSJussi Kivilinna 					.count = DES3_EDE_CTR_ENC_TEST_VECTORS
2659e080b17aSJussi Kivilinna 				},
2660e080b17aSJussi Kivilinna 				.dec = {
2661e080b17aSJussi Kivilinna 					.vecs = des3_ede_ctr_dec_tv_template,
2662e080b17aSJussi Kivilinna 					.count = DES3_EDE_CTR_DEC_TEST_VECTORS
2663e080b17aSJussi Kivilinna 				}
2664e080b17aSJussi Kivilinna 			}
2665e080b17aSJussi Kivilinna 		}
2666e080b17aSJussi Kivilinna 	}, {
26679d25917dSJussi Kivilinna 		.alg = "ctr(serpent)",
26689d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
26699d25917dSJussi Kivilinna 		.suite = {
26709d25917dSJussi Kivilinna 			.cipher = {
26719d25917dSJussi Kivilinna 				.enc = {
26729d25917dSJussi Kivilinna 					.vecs = serpent_ctr_enc_tv_template,
26739d25917dSJussi Kivilinna 					.count = SERPENT_CTR_ENC_TEST_VECTORS
26749d25917dSJussi Kivilinna 				},
26759d25917dSJussi Kivilinna 				.dec = {
26769d25917dSJussi Kivilinna 					.vecs = serpent_ctr_dec_tv_template,
26779d25917dSJussi Kivilinna 					.count = SERPENT_CTR_DEC_TEST_VECTORS
26789d25917dSJussi Kivilinna 				}
26799d25917dSJussi Kivilinna 			}
26809d25917dSJussi Kivilinna 		}
26819d25917dSJussi Kivilinna 	}, {
2682573da620SJussi Kivilinna 		.alg = "ctr(twofish)",
2683573da620SJussi Kivilinna 		.test = alg_test_skcipher,
2684573da620SJussi Kivilinna 		.suite = {
2685573da620SJussi Kivilinna 			.cipher = {
2686573da620SJussi Kivilinna 				.enc = {
2687573da620SJussi Kivilinna 					.vecs = tf_ctr_enc_tv_template,
2688573da620SJussi Kivilinna 					.count = TF_CTR_ENC_TEST_VECTORS
2689573da620SJussi Kivilinna 				},
2690573da620SJussi Kivilinna 				.dec = {
2691573da620SJussi Kivilinna 					.vecs = tf_ctr_dec_tv_template,
2692573da620SJussi Kivilinna 					.count = TF_CTR_DEC_TEST_VECTORS
2693573da620SJussi Kivilinna 				}
2694573da620SJussi Kivilinna 			}
2695573da620SJussi Kivilinna 		}
2696573da620SJussi Kivilinna 	}, {
2697da7f033dSHerbert Xu 		.alg = "cts(cbc(aes))",
26981aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2699da7f033dSHerbert Xu 		.suite = {
2700da7f033dSHerbert Xu 			.cipher = {
2701da7f033dSHerbert Xu 				.enc = {
2702da7f033dSHerbert Xu 					.vecs = cts_mode_enc_tv_template,
2703da7f033dSHerbert Xu 					.count = CTS_MODE_ENC_TEST_VECTORS
2704da7f033dSHerbert Xu 				},
2705da7f033dSHerbert Xu 				.dec = {
2706da7f033dSHerbert Xu 					.vecs = cts_mode_dec_tv_template,
2707da7f033dSHerbert Xu 					.count = CTS_MODE_DEC_TEST_VECTORS
2708da7f033dSHerbert Xu 				}
2709da7f033dSHerbert Xu 			}
2710da7f033dSHerbert Xu 		}
2711da7f033dSHerbert Xu 	}, {
2712da7f033dSHerbert Xu 		.alg = "deflate",
2713da7f033dSHerbert Xu 		.test = alg_test_comp,
27140818904dSMilan Broz 		.fips_allowed = 1,
2715da7f033dSHerbert Xu 		.suite = {
2716da7f033dSHerbert Xu 			.comp = {
2717da7f033dSHerbert Xu 				.comp = {
2718da7f033dSHerbert Xu 					.vecs = deflate_comp_tv_template,
2719da7f033dSHerbert Xu 					.count = DEFLATE_COMP_TEST_VECTORS
2720da7f033dSHerbert Xu 				},
2721da7f033dSHerbert Xu 				.decomp = {
2722da7f033dSHerbert Xu 					.vecs = deflate_decomp_tv_template,
2723da7f033dSHerbert Xu 					.count = DEFLATE_DECOMP_TEST_VECTORS
2724da7f033dSHerbert Xu 				}
2725da7f033dSHerbert Xu 			}
2726da7f033dSHerbert Xu 		}
2727da7f033dSHerbert Xu 	}, {
2728e448370dSJussi Kivilinna 		.alg = "digest_null",
2729e448370dSJussi Kivilinna 		.test = alg_test_null,
2730e448370dSJussi Kivilinna 	}, {
273164d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes128",
273264d1cdfbSStephan Mueller 		.test = alg_test_drbg,
273364d1cdfbSStephan Mueller 		.fips_allowed = 1,
273464d1cdfbSStephan Mueller 		.suite = {
273564d1cdfbSStephan Mueller 			.drbg = {
273664d1cdfbSStephan Mueller 				.vecs = drbg_nopr_ctr_aes128_tv_template,
273764d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes128_tv_template)
273864d1cdfbSStephan Mueller 			}
273964d1cdfbSStephan Mueller 		}
274064d1cdfbSStephan Mueller 	}, {
274164d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes192",
274264d1cdfbSStephan Mueller 		.test = alg_test_drbg,
274364d1cdfbSStephan Mueller 		.fips_allowed = 1,
274464d1cdfbSStephan Mueller 		.suite = {
274564d1cdfbSStephan Mueller 			.drbg = {
274664d1cdfbSStephan Mueller 				.vecs = drbg_nopr_ctr_aes192_tv_template,
274764d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes192_tv_template)
274864d1cdfbSStephan Mueller 			}
274964d1cdfbSStephan Mueller 		}
275064d1cdfbSStephan Mueller 	}, {
275164d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes256",
275264d1cdfbSStephan Mueller 		.test = alg_test_drbg,
275364d1cdfbSStephan Mueller 		.fips_allowed = 1,
275464d1cdfbSStephan Mueller 		.suite = {
275564d1cdfbSStephan Mueller 			.drbg = {
275664d1cdfbSStephan Mueller 				.vecs = drbg_nopr_ctr_aes256_tv_template,
275764d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes256_tv_template)
275864d1cdfbSStephan Mueller 			}
275964d1cdfbSStephan Mueller 		}
276064d1cdfbSStephan Mueller 	}, {
276164d1cdfbSStephan Mueller 		/*
276264d1cdfbSStephan Mueller 		 * There is no need to specifically test the DRBG with every
276364d1cdfbSStephan Mueller 		 * backend cipher -- covered by drbg_nopr_hmac_sha256 test
276464d1cdfbSStephan Mueller 		 */
276564d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha1",
276664d1cdfbSStephan Mueller 		.fips_allowed = 1,
276764d1cdfbSStephan Mueller 		.test = alg_test_null,
276864d1cdfbSStephan Mueller 	}, {
276964d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha256",
277064d1cdfbSStephan Mueller 		.test = alg_test_drbg,
277164d1cdfbSStephan Mueller 		.fips_allowed = 1,
277264d1cdfbSStephan Mueller 		.suite = {
277364d1cdfbSStephan Mueller 			.drbg = {
277464d1cdfbSStephan Mueller 				.vecs = drbg_nopr_hmac_sha256_tv_template,
277564d1cdfbSStephan Mueller 				.count =
277664d1cdfbSStephan Mueller 				ARRAY_SIZE(drbg_nopr_hmac_sha256_tv_template)
277764d1cdfbSStephan Mueller 			}
277864d1cdfbSStephan Mueller 		}
277964d1cdfbSStephan Mueller 	}, {
278064d1cdfbSStephan Mueller 		/* covered by drbg_nopr_hmac_sha256 test */
278164d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha384",
278264d1cdfbSStephan Mueller 		.fips_allowed = 1,
278364d1cdfbSStephan Mueller 		.test = alg_test_null,
278464d1cdfbSStephan Mueller 	}, {
278564d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha512",
278664d1cdfbSStephan Mueller 		.test = alg_test_null,
278764d1cdfbSStephan Mueller 		.fips_allowed = 1,
278864d1cdfbSStephan Mueller 	}, {
278964d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha1",
279064d1cdfbSStephan Mueller 		.fips_allowed = 1,
279164d1cdfbSStephan Mueller 		.test = alg_test_null,
279264d1cdfbSStephan Mueller 	}, {
279364d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha256",
279464d1cdfbSStephan Mueller 		.test = alg_test_drbg,
279564d1cdfbSStephan Mueller 		.fips_allowed = 1,
279664d1cdfbSStephan Mueller 		.suite = {
279764d1cdfbSStephan Mueller 			.drbg = {
279864d1cdfbSStephan Mueller 				.vecs = drbg_nopr_sha256_tv_template,
279964d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_sha256_tv_template)
280064d1cdfbSStephan Mueller 			}
280164d1cdfbSStephan Mueller 		}
280264d1cdfbSStephan Mueller 	}, {
280364d1cdfbSStephan Mueller 		/* covered by drbg_nopr_sha256 test */
280464d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha384",
280564d1cdfbSStephan Mueller 		.fips_allowed = 1,
280664d1cdfbSStephan Mueller 		.test = alg_test_null,
280764d1cdfbSStephan Mueller 	}, {
280864d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha512",
280964d1cdfbSStephan Mueller 		.fips_allowed = 1,
281064d1cdfbSStephan Mueller 		.test = alg_test_null,
281164d1cdfbSStephan Mueller 	}, {
281264d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes128",
281364d1cdfbSStephan Mueller 		.test = alg_test_drbg,
281464d1cdfbSStephan Mueller 		.fips_allowed = 1,
281564d1cdfbSStephan Mueller 		.suite = {
281664d1cdfbSStephan Mueller 			.drbg = {
281764d1cdfbSStephan Mueller 				.vecs = drbg_pr_ctr_aes128_tv_template,
281864d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_pr_ctr_aes128_tv_template)
281964d1cdfbSStephan Mueller 			}
282064d1cdfbSStephan Mueller 		}
282164d1cdfbSStephan Mueller 	}, {
282264d1cdfbSStephan Mueller 		/* covered by drbg_pr_ctr_aes128 test */
282364d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes192",
282464d1cdfbSStephan Mueller 		.fips_allowed = 1,
282564d1cdfbSStephan Mueller 		.test = alg_test_null,
282664d1cdfbSStephan Mueller 	}, {
282764d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes256",
282864d1cdfbSStephan Mueller 		.fips_allowed = 1,
282964d1cdfbSStephan Mueller 		.test = alg_test_null,
283064d1cdfbSStephan Mueller 	}, {
283164d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha1",
283264d1cdfbSStephan Mueller 		.fips_allowed = 1,
283364d1cdfbSStephan Mueller 		.test = alg_test_null,
283464d1cdfbSStephan Mueller 	}, {
283564d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha256",
283664d1cdfbSStephan Mueller 		.test = alg_test_drbg,
283764d1cdfbSStephan Mueller 		.fips_allowed = 1,
283864d1cdfbSStephan Mueller 		.suite = {
283964d1cdfbSStephan Mueller 			.drbg = {
284064d1cdfbSStephan Mueller 				.vecs = drbg_pr_hmac_sha256_tv_template,
284164d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_pr_hmac_sha256_tv_template)
284264d1cdfbSStephan Mueller 			}
284364d1cdfbSStephan Mueller 		}
284464d1cdfbSStephan Mueller 	}, {
284564d1cdfbSStephan Mueller 		/* covered by drbg_pr_hmac_sha256 test */
284664d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha384",
284764d1cdfbSStephan Mueller 		.fips_allowed = 1,
284864d1cdfbSStephan Mueller 		.test = alg_test_null,
284964d1cdfbSStephan Mueller 	}, {
285064d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha512",
285164d1cdfbSStephan Mueller 		.test = alg_test_null,
285264d1cdfbSStephan Mueller 		.fips_allowed = 1,
285364d1cdfbSStephan Mueller 	}, {
285464d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha1",
285564d1cdfbSStephan Mueller 		.fips_allowed = 1,
285664d1cdfbSStephan Mueller 		.test = alg_test_null,
285764d1cdfbSStephan Mueller 	}, {
285864d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha256",
285964d1cdfbSStephan Mueller 		.test = alg_test_drbg,
286064d1cdfbSStephan Mueller 		.fips_allowed = 1,
286164d1cdfbSStephan Mueller 		.suite = {
286264d1cdfbSStephan Mueller 			.drbg = {
286364d1cdfbSStephan Mueller 				.vecs = drbg_pr_sha256_tv_template,
286464d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_pr_sha256_tv_template)
286564d1cdfbSStephan Mueller 			}
286664d1cdfbSStephan Mueller 		}
286764d1cdfbSStephan Mueller 	}, {
286864d1cdfbSStephan Mueller 		/* covered by drbg_pr_sha256 test */
286964d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha384",
287064d1cdfbSStephan Mueller 		.fips_allowed = 1,
287164d1cdfbSStephan Mueller 		.test = alg_test_null,
287264d1cdfbSStephan Mueller 	}, {
287364d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha512",
287464d1cdfbSStephan Mueller 		.fips_allowed = 1,
287564d1cdfbSStephan Mueller 		.test = alg_test_null,
287664d1cdfbSStephan Mueller 	}, {
2877863b557aSYouquan, Song 		.alg = "ecb(__aes-aesni)",
2878863b557aSYouquan, Song 		.test = alg_test_null,
28796c79294fSMilan Broz 		.fips_allowed = 1,
2880863b557aSYouquan, Song 	}, {
2881da7f033dSHerbert Xu 		.alg = "ecb(aes)",
28821aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2883a1915d51SJarod Wilson 		.fips_allowed = 1,
2884da7f033dSHerbert Xu 		.suite = {
2885da7f033dSHerbert Xu 			.cipher = {
2886da7f033dSHerbert Xu 				.enc = {
2887da7f033dSHerbert Xu 					.vecs = aes_enc_tv_template,
2888da7f033dSHerbert Xu 					.count = AES_ENC_TEST_VECTORS
2889da7f033dSHerbert Xu 				},
2890da7f033dSHerbert Xu 				.dec = {
2891da7f033dSHerbert Xu 					.vecs = aes_dec_tv_template,
2892da7f033dSHerbert Xu 					.count = AES_DEC_TEST_VECTORS
2893da7f033dSHerbert Xu 				}
2894da7f033dSHerbert Xu 			}
2895da7f033dSHerbert Xu 		}
2896da7f033dSHerbert Xu 	}, {
2897da7f033dSHerbert Xu 		.alg = "ecb(anubis)",
28981aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2899da7f033dSHerbert Xu 		.suite = {
2900da7f033dSHerbert Xu 			.cipher = {
2901da7f033dSHerbert Xu 				.enc = {
2902da7f033dSHerbert Xu 					.vecs = anubis_enc_tv_template,
2903da7f033dSHerbert Xu 					.count = ANUBIS_ENC_TEST_VECTORS
2904da7f033dSHerbert Xu 				},
2905da7f033dSHerbert Xu 				.dec = {
2906da7f033dSHerbert Xu 					.vecs = anubis_dec_tv_template,
2907da7f033dSHerbert Xu 					.count = ANUBIS_DEC_TEST_VECTORS
2908da7f033dSHerbert Xu 				}
2909da7f033dSHerbert Xu 			}
2910da7f033dSHerbert Xu 		}
2911da7f033dSHerbert Xu 	}, {
2912da7f033dSHerbert Xu 		.alg = "ecb(arc4)",
29131aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2914da7f033dSHerbert Xu 		.suite = {
2915da7f033dSHerbert Xu 			.cipher = {
2916da7f033dSHerbert Xu 				.enc = {
2917da7f033dSHerbert Xu 					.vecs = arc4_enc_tv_template,
2918da7f033dSHerbert Xu 					.count = ARC4_ENC_TEST_VECTORS
2919da7f033dSHerbert Xu 				},
2920da7f033dSHerbert Xu 				.dec = {
2921da7f033dSHerbert Xu 					.vecs = arc4_dec_tv_template,
2922da7f033dSHerbert Xu 					.count = ARC4_DEC_TEST_VECTORS
2923da7f033dSHerbert Xu 				}
2924da7f033dSHerbert Xu 			}
2925da7f033dSHerbert Xu 		}
2926da7f033dSHerbert Xu 	}, {
2927da7f033dSHerbert Xu 		.alg = "ecb(blowfish)",
29281aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2929da7f033dSHerbert Xu 		.suite = {
2930da7f033dSHerbert Xu 			.cipher = {
2931da7f033dSHerbert Xu 				.enc = {
2932da7f033dSHerbert Xu 					.vecs = bf_enc_tv_template,
2933da7f033dSHerbert Xu 					.count = BF_ENC_TEST_VECTORS
2934da7f033dSHerbert Xu 				},
2935da7f033dSHerbert Xu 				.dec = {
2936da7f033dSHerbert Xu 					.vecs = bf_dec_tv_template,
2937da7f033dSHerbert Xu 					.count = BF_DEC_TEST_VECTORS
2938da7f033dSHerbert Xu 				}
2939da7f033dSHerbert Xu 			}
2940da7f033dSHerbert Xu 		}
2941da7f033dSHerbert Xu 	}, {
2942da7f033dSHerbert Xu 		.alg = "ecb(camellia)",
29431aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2944da7f033dSHerbert Xu 		.suite = {
2945da7f033dSHerbert Xu 			.cipher = {
2946da7f033dSHerbert Xu 				.enc = {
2947da7f033dSHerbert Xu 					.vecs = camellia_enc_tv_template,
2948da7f033dSHerbert Xu 					.count = CAMELLIA_ENC_TEST_VECTORS
2949da7f033dSHerbert Xu 				},
2950da7f033dSHerbert Xu 				.dec = {
2951da7f033dSHerbert Xu 					.vecs = camellia_dec_tv_template,
2952da7f033dSHerbert Xu 					.count = CAMELLIA_DEC_TEST_VECTORS
2953da7f033dSHerbert Xu 				}
2954da7f033dSHerbert Xu 			}
2955da7f033dSHerbert Xu 		}
2956da7f033dSHerbert Xu 	}, {
2957da7f033dSHerbert Xu 		.alg = "ecb(cast5)",
29581aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2959da7f033dSHerbert Xu 		.suite = {
2960da7f033dSHerbert Xu 			.cipher = {
2961da7f033dSHerbert Xu 				.enc = {
2962da7f033dSHerbert Xu 					.vecs = cast5_enc_tv_template,
2963da7f033dSHerbert Xu 					.count = CAST5_ENC_TEST_VECTORS
2964da7f033dSHerbert Xu 				},
2965da7f033dSHerbert Xu 				.dec = {
2966da7f033dSHerbert Xu 					.vecs = cast5_dec_tv_template,
2967da7f033dSHerbert Xu 					.count = CAST5_DEC_TEST_VECTORS
2968da7f033dSHerbert Xu 				}
2969da7f033dSHerbert Xu 			}
2970da7f033dSHerbert Xu 		}
2971da7f033dSHerbert Xu 	}, {
2972da7f033dSHerbert Xu 		.alg = "ecb(cast6)",
29731aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2974da7f033dSHerbert Xu 		.suite = {
2975da7f033dSHerbert Xu 			.cipher = {
2976da7f033dSHerbert Xu 				.enc = {
2977da7f033dSHerbert Xu 					.vecs = cast6_enc_tv_template,
2978da7f033dSHerbert Xu 					.count = CAST6_ENC_TEST_VECTORS
2979da7f033dSHerbert Xu 				},
2980da7f033dSHerbert Xu 				.dec = {
2981da7f033dSHerbert Xu 					.vecs = cast6_dec_tv_template,
2982da7f033dSHerbert Xu 					.count = CAST6_DEC_TEST_VECTORS
2983da7f033dSHerbert Xu 				}
2984da7f033dSHerbert Xu 			}
2985da7f033dSHerbert Xu 		}
2986da7f033dSHerbert Xu 	}, {
2987e448370dSJussi Kivilinna 		.alg = "ecb(cipher_null)",
2988e448370dSJussi Kivilinna 		.test = alg_test_null,
2989e448370dSJussi Kivilinna 	}, {
2990da7f033dSHerbert Xu 		.alg = "ecb(des)",
29911aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2992da7f033dSHerbert Xu 		.suite = {
2993da7f033dSHerbert Xu 			.cipher = {
2994da7f033dSHerbert Xu 				.enc = {
2995da7f033dSHerbert Xu 					.vecs = des_enc_tv_template,
2996da7f033dSHerbert Xu 					.count = DES_ENC_TEST_VECTORS
2997da7f033dSHerbert Xu 				},
2998da7f033dSHerbert Xu 				.dec = {
2999da7f033dSHerbert Xu 					.vecs = des_dec_tv_template,
3000da7f033dSHerbert Xu 					.count = DES_DEC_TEST_VECTORS
3001da7f033dSHerbert Xu 				}
3002da7f033dSHerbert Xu 			}
3003da7f033dSHerbert Xu 		}
3004da7f033dSHerbert Xu 	}, {
3005da7f033dSHerbert Xu 		.alg = "ecb(des3_ede)",
30061aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3007a1915d51SJarod Wilson 		.fips_allowed = 1,
3008da7f033dSHerbert Xu 		.suite = {
3009da7f033dSHerbert Xu 			.cipher = {
3010da7f033dSHerbert Xu 				.enc = {
3011da7f033dSHerbert Xu 					.vecs = des3_ede_enc_tv_template,
3012da7f033dSHerbert Xu 					.count = DES3_EDE_ENC_TEST_VECTORS
3013da7f033dSHerbert Xu 				},
3014da7f033dSHerbert Xu 				.dec = {
3015da7f033dSHerbert Xu 					.vecs = des3_ede_dec_tv_template,
3016da7f033dSHerbert Xu 					.count = DES3_EDE_DEC_TEST_VECTORS
3017da7f033dSHerbert Xu 				}
3018da7f033dSHerbert Xu 			}
3019da7f033dSHerbert Xu 		}
3020da7f033dSHerbert Xu 	}, {
302166e5bd00SJussi Kivilinna 		.alg = "ecb(fcrypt)",
302266e5bd00SJussi Kivilinna 		.test = alg_test_skcipher,
302366e5bd00SJussi Kivilinna 		.suite = {
302466e5bd00SJussi Kivilinna 			.cipher = {
302566e5bd00SJussi Kivilinna 				.enc = {
302666e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_enc_tv_template,
302766e5bd00SJussi Kivilinna 					.count = 1
302866e5bd00SJussi Kivilinna 				},
302966e5bd00SJussi Kivilinna 				.dec = {
303066e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_dec_tv_template,
303166e5bd00SJussi Kivilinna 					.count = 1
303266e5bd00SJussi Kivilinna 				}
303366e5bd00SJussi Kivilinna 			}
303466e5bd00SJussi Kivilinna 		}
303566e5bd00SJussi Kivilinna 	}, {
3036da7f033dSHerbert Xu 		.alg = "ecb(khazad)",
30371aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3038da7f033dSHerbert Xu 		.suite = {
3039da7f033dSHerbert Xu 			.cipher = {
3040da7f033dSHerbert Xu 				.enc = {
3041da7f033dSHerbert Xu 					.vecs = khazad_enc_tv_template,
3042da7f033dSHerbert Xu 					.count = KHAZAD_ENC_TEST_VECTORS
3043da7f033dSHerbert Xu 				},
3044da7f033dSHerbert Xu 				.dec = {
3045da7f033dSHerbert Xu 					.vecs = khazad_dec_tv_template,
3046da7f033dSHerbert Xu 					.count = KHAZAD_DEC_TEST_VECTORS
3047da7f033dSHerbert Xu 				}
3048da7f033dSHerbert Xu 			}
3049da7f033dSHerbert Xu 		}
3050da7f033dSHerbert Xu 	}, {
3051da7f033dSHerbert Xu 		.alg = "ecb(seed)",
30521aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3053da7f033dSHerbert Xu 		.suite = {
3054da7f033dSHerbert Xu 			.cipher = {
3055da7f033dSHerbert Xu 				.enc = {
3056da7f033dSHerbert Xu 					.vecs = seed_enc_tv_template,
3057da7f033dSHerbert Xu 					.count = SEED_ENC_TEST_VECTORS
3058da7f033dSHerbert Xu 				},
3059da7f033dSHerbert Xu 				.dec = {
3060da7f033dSHerbert Xu 					.vecs = seed_dec_tv_template,
3061da7f033dSHerbert Xu 					.count = SEED_DEC_TEST_VECTORS
3062da7f033dSHerbert Xu 				}
3063da7f033dSHerbert Xu 			}
3064da7f033dSHerbert Xu 		}
3065da7f033dSHerbert Xu 	}, {
3066da7f033dSHerbert Xu 		.alg = "ecb(serpent)",
30671aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3068da7f033dSHerbert Xu 		.suite = {
3069da7f033dSHerbert Xu 			.cipher = {
3070da7f033dSHerbert Xu 				.enc = {
3071da7f033dSHerbert Xu 					.vecs = serpent_enc_tv_template,
3072da7f033dSHerbert Xu 					.count = SERPENT_ENC_TEST_VECTORS
3073da7f033dSHerbert Xu 				},
3074da7f033dSHerbert Xu 				.dec = {
3075da7f033dSHerbert Xu 					.vecs = serpent_dec_tv_template,
3076da7f033dSHerbert Xu 					.count = SERPENT_DEC_TEST_VECTORS
3077da7f033dSHerbert Xu 				}
3078da7f033dSHerbert Xu 			}
3079da7f033dSHerbert Xu 		}
3080da7f033dSHerbert Xu 	}, {
3081da7f033dSHerbert Xu 		.alg = "ecb(tea)",
30821aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3083da7f033dSHerbert Xu 		.suite = {
3084da7f033dSHerbert Xu 			.cipher = {
3085da7f033dSHerbert Xu 				.enc = {
3086da7f033dSHerbert Xu 					.vecs = tea_enc_tv_template,
3087da7f033dSHerbert Xu 					.count = TEA_ENC_TEST_VECTORS
3088da7f033dSHerbert Xu 				},
3089da7f033dSHerbert Xu 				.dec = {
3090da7f033dSHerbert Xu 					.vecs = tea_dec_tv_template,
3091da7f033dSHerbert Xu 					.count = TEA_DEC_TEST_VECTORS
3092da7f033dSHerbert Xu 				}
3093da7f033dSHerbert Xu 			}
3094da7f033dSHerbert Xu 		}
3095da7f033dSHerbert Xu 	}, {
3096da7f033dSHerbert Xu 		.alg = "ecb(tnepres)",
30971aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3098da7f033dSHerbert Xu 		.suite = {
3099da7f033dSHerbert Xu 			.cipher = {
3100da7f033dSHerbert Xu 				.enc = {
3101da7f033dSHerbert Xu 					.vecs = tnepres_enc_tv_template,
3102da7f033dSHerbert Xu 					.count = TNEPRES_ENC_TEST_VECTORS
3103da7f033dSHerbert Xu 				},
3104da7f033dSHerbert Xu 				.dec = {
3105da7f033dSHerbert Xu 					.vecs = tnepres_dec_tv_template,
3106da7f033dSHerbert Xu 					.count = TNEPRES_DEC_TEST_VECTORS
3107da7f033dSHerbert Xu 				}
3108da7f033dSHerbert Xu 			}
3109da7f033dSHerbert Xu 		}
3110da7f033dSHerbert Xu 	}, {
3111da7f033dSHerbert Xu 		.alg = "ecb(twofish)",
31121aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3113da7f033dSHerbert Xu 		.suite = {
3114da7f033dSHerbert Xu 			.cipher = {
3115da7f033dSHerbert Xu 				.enc = {
3116da7f033dSHerbert Xu 					.vecs = tf_enc_tv_template,
3117da7f033dSHerbert Xu 					.count = TF_ENC_TEST_VECTORS
3118da7f033dSHerbert Xu 				},
3119da7f033dSHerbert Xu 				.dec = {
3120da7f033dSHerbert Xu 					.vecs = tf_dec_tv_template,
3121da7f033dSHerbert Xu 					.count = TF_DEC_TEST_VECTORS
3122da7f033dSHerbert Xu 				}
3123da7f033dSHerbert Xu 			}
3124da7f033dSHerbert Xu 		}
3125da7f033dSHerbert Xu 	}, {
3126da7f033dSHerbert Xu 		.alg = "ecb(xeta)",
31271aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3128da7f033dSHerbert Xu 		.suite = {
3129da7f033dSHerbert Xu 			.cipher = {
3130da7f033dSHerbert Xu 				.enc = {
3131da7f033dSHerbert Xu 					.vecs = xeta_enc_tv_template,
3132da7f033dSHerbert Xu 					.count = XETA_ENC_TEST_VECTORS
3133da7f033dSHerbert Xu 				},
3134da7f033dSHerbert Xu 				.dec = {
3135da7f033dSHerbert Xu 					.vecs = xeta_dec_tv_template,
3136da7f033dSHerbert Xu 					.count = XETA_DEC_TEST_VECTORS
3137da7f033dSHerbert Xu 				}
3138da7f033dSHerbert Xu 			}
3139da7f033dSHerbert Xu 		}
3140da7f033dSHerbert Xu 	}, {
3141da7f033dSHerbert Xu 		.alg = "ecb(xtea)",
31421aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3143da7f033dSHerbert Xu 		.suite = {
3144da7f033dSHerbert Xu 			.cipher = {
3145da7f033dSHerbert Xu 				.enc = {
3146da7f033dSHerbert Xu 					.vecs = xtea_enc_tv_template,
3147da7f033dSHerbert Xu 					.count = XTEA_ENC_TEST_VECTORS
3148da7f033dSHerbert Xu 				},
3149da7f033dSHerbert Xu 				.dec = {
3150da7f033dSHerbert Xu 					.vecs = xtea_dec_tv_template,
3151da7f033dSHerbert Xu 					.count = XTEA_DEC_TEST_VECTORS
3152da7f033dSHerbert Xu 				}
3153da7f033dSHerbert Xu 			}
3154da7f033dSHerbert Xu 		}
3155da7f033dSHerbert Xu 	}, {
3156da7f033dSHerbert Xu 		.alg = "gcm(aes)",
3157da7f033dSHerbert Xu 		.test = alg_test_aead,
3158a1915d51SJarod Wilson 		.fips_allowed = 1,
3159da7f033dSHerbert Xu 		.suite = {
3160da7f033dSHerbert Xu 			.aead = {
3161da7f033dSHerbert Xu 				.enc = {
3162da7f033dSHerbert Xu 					.vecs = aes_gcm_enc_tv_template,
3163da7f033dSHerbert Xu 					.count = AES_GCM_ENC_TEST_VECTORS
3164da7f033dSHerbert Xu 				},
3165da7f033dSHerbert Xu 				.dec = {
3166da7f033dSHerbert Xu 					.vecs = aes_gcm_dec_tv_template,
3167da7f033dSHerbert Xu 					.count = AES_GCM_DEC_TEST_VECTORS
3168da7f033dSHerbert Xu 				}
3169da7f033dSHerbert Xu 			}
3170da7f033dSHerbert Xu 		}
3171da7f033dSHerbert Xu 	}, {
3172507069c9SYouquan, Song 		.alg = "ghash",
3173507069c9SYouquan, Song 		.test = alg_test_hash,
317418c0ebd2SJarod Wilson 		.fips_allowed = 1,
3175507069c9SYouquan, Song 		.suite = {
3176507069c9SYouquan, Song 			.hash = {
3177507069c9SYouquan, Song 				.vecs = ghash_tv_template,
3178507069c9SYouquan, Song 				.count = GHASH_TEST_VECTORS
3179507069c9SYouquan, Song 			}
3180507069c9SYouquan, Song 		}
3181507069c9SYouquan, Song 	}, {
3182a482b081SSonic Zhang 		.alg = "hmac(crc32)",
3183a482b081SSonic Zhang 		.test = alg_test_hash,
3184a482b081SSonic Zhang 		.suite = {
3185a482b081SSonic Zhang 			.hash = {
3186a482b081SSonic Zhang 				.vecs = bfin_crc_tv_template,
3187a482b081SSonic Zhang 				.count = BFIN_CRC_TEST_VECTORS
3188a482b081SSonic Zhang 			}
3189a482b081SSonic Zhang 		}
3190a482b081SSonic Zhang 	}, {
3191da7f033dSHerbert Xu 		.alg = "hmac(md5)",
3192da7f033dSHerbert Xu 		.test = alg_test_hash,
3193da7f033dSHerbert Xu 		.suite = {
3194da7f033dSHerbert Xu 			.hash = {
3195da7f033dSHerbert Xu 				.vecs = hmac_md5_tv_template,
3196da7f033dSHerbert Xu 				.count = HMAC_MD5_TEST_VECTORS
3197da7f033dSHerbert Xu 			}
3198da7f033dSHerbert Xu 		}
3199da7f033dSHerbert Xu 	}, {
3200da7f033dSHerbert Xu 		.alg = "hmac(rmd128)",
3201da7f033dSHerbert Xu 		.test = alg_test_hash,
3202da7f033dSHerbert Xu 		.suite = {
3203da7f033dSHerbert Xu 			.hash = {
3204da7f033dSHerbert Xu 				.vecs = hmac_rmd128_tv_template,
3205da7f033dSHerbert Xu 				.count = HMAC_RMD128_TEST_VECTORS
3206da7f033dSHerbert Xu 			}
3207da7f033dSHerbert Xu 		}
3208da7f033dSHerbert Xu 	}, {
3209da7f033dSHerbert Xu 		.alg = "hmac(rmd160)",
3210da7f033dSHerbert Xu 		.test = alg_test_hash,
3211da7f033dSHerbert Xu 		.suite = {
3212da7f033dSHerbert Xu 			.hash = {
3213da7f033dSHerbert Xu 				.vecs = hmac_rmd160_tv_template,
3214da7f033dSHerbert Xu 				.count = HMAC_RMD160_TEST_VECTORS
3215da7f033dSHerbert Xu 			}
3216da7f033dSHerbert Xu 		}
3217da7f033dSHerbert Xu 	}, {
3218da7f033dSHerbert Xu 		.alg = "hmac(sha1)",
3219da7f033dSHerbert Xu 		.test = alg_test_hash,
3220a1915d51SJarod Wilson 		.fips_allowed = 1,
3221da7f033dSHerbert Xu 		.suite = {
3222da7f033dSHerbert Xu 			.hash = {
3223da7f033dSHerbert Xu 				.vecs = hmac_sha1_tv_template,
3224da7f033dSHerbert Xu 				.count = HMAC_SHA1_TEST_VECTORS
3225da7f033dSHerbert Xu 			}
3226da7f033dSHerbert Xu 		}
3227da7f033dSHerbert Xu 	}, {
3228da7f033dSHerbert Xu 		.alg = "hmac(sha224)",
3229da7f033dSHerbert Xu 		.test = alg_test_hash,
3230a1915d51SJarod Wilson 		.fips_allowed = 1,
3231da7f033dSHerbert Xu 		.suite = {
3232da7f033dSHerbert Xu 			.hash = {
3233da7f033dSHerbert Xu 				.vecs = hmac_sha224_tv_template,
3234da7f033dSHerbert Xu 				.count = HMAC_SHA224_TEST_VECTORS
3235da7f033dSHerbert Xu 			}
3236da7f033dSHerbert Xu 		}
3237da7f033dSHerbert Xu 	}, {
3238da7f033dSHerbert Xu 		.alg = "hmac(sha256)",
3239da7f033dSHerbert Xu 		.test = alg_test_hash,
3240a1915d51SJarod Wilson 		.fips_allowed = 1,
3241da7f033dSHerbert Xu 		.suite = {
3242da7f033dSHerbert Xu 			.hash = {
3243da7f033dSHerbert Xu 				.vecs = hmac_sha256_tv_template,
3244da7f033dSHerbert Xu 				.count = HMAC_SHA256_TEST_VECTORS
3245da7f033dSHerbert Xu 			}
3246da7f033dSHerbert Xu 		}
3247da7f033dSHerbert Xu 	}, {
3248da7f033dSHerbert Xu 		.alg = "hmac(sha384)",
3249da7f033dSHerbert Xu 		.test = alg_test_hash,
3250a1915d51SJarod Wilson 		.fips_allowed = 1,
3251da7f033dSHerbert Xu 		.suite = {
3252da7f033dSHerbert Xu 			.hash = {
3253da7f033dSHerbert Xu 				.vecs = hmac_sha384_tv_template,
3254da7f033dSHerbert Xu 				.count = HMAC_SHA384_TEST_VECTORS
3255da7f033dSHerbert Xu 			}
3256da7f033dSHerbert Xu 		}
3257da7f033dSHerbert Xu 	}, {
3258da7f033dSHerbert Xu 		.alg = "hmac(sha512)",
3259da7f033dSHerbert Xu 		.test = alg_test_hash,
3260a1915d51SJarod Wilson 		.fips_allowed = 1,
3261da7f033dSHerbert Xu 		.suite = {
3262da7f033dSHerbert Xu 			.hash = {
3263da7f033dSHerbert Xu 				.vecs = hmac_sha512_tv_template,
3264da7f033dSHerbert Xu 				.count = HMAC_SHA512_TEST_VECTORS
3265da7f033dSHerbert Xu 			}
3266da7f033dSHerbert Xu 		}
3267da7f033dSHerbert Xu 	}, {
3268bb5530e4SStephan Mueller 		.alg = "jitterentropy_rng",
3269bb5530e4SStephan Mueller 		.fips_allowed = 1,
3270bb5530e4SStephan Mueller 		.test = alg_test_null,
3271bb5530e4SStephan Mueller 	}, {
327235351988SStephan Mueller 		.alg = "kw(aes)",
327335351988SStephan Mueller 		.test = alg_test_skcipher,
327435351988SStephan Mueller 		.fips_allowed = 1,
327535351988SStephan Mueller 		.suite = {
327635351988SStephan Mueller 			.cipher = {
327735351988SStephan Mueller 				.enc = {
327835351988SStephan Mueller 					.vecs = aes_kw_enc_tv_template,
327935351988SStephan Mueller 					.count = ARRAY_SIZE(aes_kw_enc_tv_template)
328035351988SStephan Mueller 				},
328135351988SStephan Mueller 				.dec = {
328235351988SStephan Mueller 					.vecs = aes_kw_dec_tv_template,
328335351988SStephan Mueller 					.count = ARRAY_SIZE(aes_kw_dec_tv_template)
328435351988SStephan Mueller 				}
328535351988SStephan Mueller 			}
328635351988SStephan Mueller 		}
328735351988SStephan Mueller 	}, {
3288da7f033dSHerbert Xu 		.alg = "lrw(aes)",
32891aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3290da7f033dSHerbert Xu 		.suite = {
3291da7f033dSHerbert Xu 			.cipher = {
3292da7f033dSHerbert Xu 				.enc = {
3293da7f033dSHerbert Xu 					.vecs = aes_lrw_enc_tv_template,
3294da7f033dSHerbert Xu 					.count = AES_LRW_ENC_TEST_VECTORS
3295da7f033dSHerbert Xu 				},
3296da7f033dSHerbert Xu 				.dec = {
3297da7f033dSHerbert Xu 					.vecs = aes_lrw_dec_tv_template,
3298da7f033dSHerbert Xu 					.count = AES_LRW_DEC_TEST_VECTORS
3299da7f033dSHerbert Xu 				}
3300da7f033dSHerbert Xu 			}
3301da7f033dSHerbert Xu 		}
3302da7f033dSHerbert Xu 	}, {
33030840605eSJussi Kivilinna 		.alg = "lrw(camellia)",
33040840605eSJussi Kivilinna 		.test = alg_test_skcipher,
33050840605eSJussi Kivilinna 		.suite = {
33060840605eSJussi Kivilinna 			.cipher = {
33070840605eSJussi Kivilinna 				.enc = {
33080840605eSJussi Kivilinna 					.vecs = camellia_lrw_enc_tv_template,
33090840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_ENC_TEST_VECTORS
33100840605eSJussi Kivilinna 				},
33110840605eSJussi Kivilinna 				.dec = {
33120840605eSJussi Kivilinna 					.vecs = camellia_lrw_dec_tv_template,
33130840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_DEC_TEST_VECTORS
33140840605eSJussi Kivilinna 				}
33150840605eSJussi Kivilinna 			}
33160840605eSJussi Kivilinna 		}
33170840605eSJussi Kivilinna 	}, {
33189b8b0405SJohannes Goetzfried 		.alg = "lrw(cast6)",
33199b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
33209b8b0405SJohannes Goetzfried 		.suite = {
33219b8b0405SJohannes Goetzfried 			.cipher = {
33229b8b0405SJohannes Goetzfried 				.enc = {
33239b8b0405SJohannes Goetzfried 					.vecs = cast6_lrw_enc_tv_template,
33249b8b0405SJohannes Goetzfried 					.count = CAST6_LRW_ENC_TEST_VECTORS
33259b8b0405SJohannes Goetzfried 				},
33269b8b0405SJohannes Goetzfried 				.dec = {
33279b8b0405SJohannes Goetzfried 					.vecs = cast6_lrw_dec_tv_template,
33289b8b0405SJohannes Goetzfried 					.count = CAST6_LRW_DEC_TEST_VECTORS
33299b8b0405SJohannes Goetzfried 				}
33309b8b0405SJohannes Goetzfried 			}
33319b8b0405SJohannes Goetzfried 		}
33329b8b0405SJohannes Goetzfried 	}, {
3333d7bfc0faSJussi Kivilinna 		.alg = "lrw(serpent)",
3334d7bfc0faSJussi Kivilinna 		.test = alg_test_skcipher,
3335d7bfc0faSJussi Kivilinna 		.suite = {
3336d7bfc0faSJussi Kivilinna 			.cipher = {
3337d7bfc0faSJussi Kivilinna 				.enc = {
3338d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_enc_tv_template,
3339d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_ENC_TEST_VECTORS
3340d7bfc0faSJussi Kivilinna 				},
3341d7bfc0faSJussi Kivilinna 				.dec = {
3342d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_dec_tv_template,
3343d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_DEC_TEST_VECTORS
3344d7bfc0faSJussi Kivilinna 				}
3345d7bfc0faSJussi Kivilinna 			}
3346d7bfc0faSJussi Kivilinna 		}
3347d7bfc0faSJussi Kivilinna 	}, {
33480b2a1551SJussi Kivilinna 		.alg = "lrw(twofish)",
33490b2a1551SJussi Kivilinna 		.test = alg_test_skcipher,
33500b2a1551SJussi Kivilinna 		.suite = {
33510b2a1551SJussi Kivilinna 			.cipher = {
33520b2a1551SJussi Kivilinna 				.enc = {
33530b2a1551SJussi Kivilinna 					.vecs = tf_lrw_enc_tv_template,
33540b2a1551SJussi Kivilinna 					.count = TF_LRW_ENC_TEST_VECTORS
33550b2a1551SJussi Kivilinna 				},
33560b2a1551SJussi Kivilinna 				.dec = {
33570b2a1551SJussi Kivilinna 					.vecs = tf_lrw_dec_tv_template,
33580b2a1551SJussi Kivilinna 					.count = TF_LRW_DEC_TEST_VECTORS
33590b2a1551SJussi Kivilinna 				}
33600b2a1551SJussi Kivilinna 			}
33610b2a1551SJussi Kivilinna 		}
33620b2a1551SJussi Kivilinna 	}, {
33631443cc9bSKOVACS Krisztian 		.alg = "lz4",
33641443cc9bSKOVACS Krisztian 		.test = alg_test_comp,
33651443cc9bSKOVACS Krisztian 		.fips_allowed = 1,
33661443cc9bSKOVACS Krisztian 		.suite = {
33671443cc9bSKOVACS Krisztian 			.comp = {
33681443cc9bSKOVACS Krisztian 				.comp = {
33691443cc9bSKOVACS Krisztian 					.vecs = lz4_comp_tv_template,
33701443cc9bSKOVACS Krisztian 					.count = LZ4_COMP_TEST_VECTORS
33711443cc9bSKOVACS Krisztian 				},
33721443cc9bSKOVACS Krisztian 				.decomp = {
33731443cc9bSKOVACS Krisztian 					.vecs = lz4_decomp_tv_template,
33741443cc9bSKOVACS Krisztian 					.count = LZ4_DECOMP_TEST_VECTORS
33751443cc9bSKOVACS Krisztian 				}
33761443cc9bSKOVACS Krisztian 			}
33771443cc9bSKOVACS Krisztian 		}
33781443cc9bSKOVACS Krisztian 	}, {
33791443cc9bSKOVACS Krisztian 		.alg = "lz4hc",
33801443cc9bSKOVACS Krisztian 		.test = alg_test_comp,
33811443cc9bSKOVACS Krisztian 		.fips_allowed = 1,
33821443cc9bSKOVACS Krisztian 		.suite = {
33831443cc9bSKOVACS Krisztian 			.comp = {
33841443cc9bSKOVACS Krisztian 				.comp = {
33851443cc9bSKOVACS Krisztian 					.vecs = lz4hc_comp_tv_template,
33861443cc9bSKOVACS Krisztian 					.count = LZ4HC_COMP_TEST_VECTORS
33871443cc9bSKOVACS Krisztian 				},
33881443cc9bSKOVACS Krisztian 				.decomp = {
33891443cc9bSKOVACS Krisztian 					.vecs = lz4hc_decomp_tv_template,
33901443cc9bSKOVACS Krisztian 					.count = LZ4HC_DECOMP_TEST_VECTORS
33911443cc9bSKOVACS Krisztian 				}
33921443cc9bSKOVACS Krisztian 			}
33931443cc9bSKOVACS Krisztian 		}
33941443cc9bSKOVACS Krisztian 	}, {
3395da7f033dSHerbert Xu 		.alg = "lzo",
3396da7f033dSHerbert Xu 		.test = alg_test_comp,
33970818904dSMilan Broz 		.fips_allowed = 1,
3398da7f033dSHerbert Xu 		.suite = {
3399da7f033dSHerbert Xu 			.comp = {
3400da7f033dSHerbert Xu 				.comp = {
3401da7f033dSHerbert Xu 					.vecs = lzo_comp_tv_template,
3402da7f033dSHerbert Xu 					.count = LZO_COMP_TEST_VECTORS
3403da7f033dSHerbert Xu 				},
3404da7f033dSHerbert Xu 				.decomp = {
3405da7f033dSHerbert Xu 					.vecs = lzo_decomp_tv_template,
3406da7f033dSHerbert Xu 					.count = LZO_DECOMP_TEST_VECTORS
3407da7f033dSHerbert Xu 				}
3408da7f033dSHerbert Xu 			}
3409da7f033dSHerbert Xu 		}
3410da7f033dSHerbert Xu 	}, {
3411da7f033dSHerbert Xu 		.alg = "md4",
3412da7f033dSHerbert Xu 		.test = alg_test_hash,
3413da7f033dSHerbert Xu 		.suite = {
3414da7f033dSHerbert Xu 			.hash = {
3415da7f033dSHerbert Xu 				.vecs = md4_tv_template,
3416da7f033dSHerbert Xu 				.count = MD4_TEST_VECTORS
3417da7f033dSHerbert Xu 			}
3418da7f033dSHerbert Xu 		}
3419da7f033dSHerbert Xu 	}, {
3420da7f033dSHerbert Xu 		.alg = "md5",
3421da7f033dSHerbert Xu 		.test = alg_test_hash,
3422da7f033dSHerbert Xu 		.suite = {
3423da7f033dSHerbert Xu 			.hash = {
3424da7f033dSHerbert Xu 				.vecs = md5_tv_template,
3425da7f033dSHerbert Xu 				.count = MD5_TEST_VECTORS
3426da7f033dSHerbert Xu 			}
3427da7f033dSHerbert Xu 		}
3428da7f033dSHerbert Xu 	}, {
3429da7f033dSHerbert Xu 		.alg = "michael_mic",
3430da7f033dSHerbert Xu 		.test = alg_test_hash,
3431da7f033dSHerbert Xu 		.suite = {
3432da7f033dSHerbert Xu 			.hash = {
3433da7f033dSHerbert Xu 				.vecs = michael_mic_tv_template,
3434da7f033dSHerbert Xu 				.count = MICHAEL_MIC_TEST_VECTORS
3435da7f033dSHerbert Xu 			}
3436da7f033dSHerbert Xu 		}
3437da7f033dSHerbert Xu 	}, {
3438ba0e14acSPuneet Saxena 		.alg = "ofb(aes)",
3439ba0e14acSPuneet Saxena 		.test = alg_test_skcipher,
3440ba0e14acSPuneet Saxena 		.fips_allowed = 1,
3441ba0e14acSPuneet Saxena 		.suite = {
3442ba0e14acSPuneet Saxena 			.cipher = {
3443ba0e14acSPuneet Saxena 				.enc = {
3444ba0e14acSPuneet Saxena 					.vecs = aes_ofb_enc_tv_template,
3445ba0e14acSPuneet Saxena 					.count = AES_OFB_ENC_TEST_VECTORS
3446ba0e14acSPuneet Saxena 				},
3447ba0e14acSPuneet Saxena 				.dec = {
3448ba0e14acSPuneet Saxena 					.vecs = aes_ofb_dec_tv_template,
3449ba0e14acSPuneet Saxena 					.count = AES_OFB_DEC_TEST_VECTORS
3450ba0e14acSPuneet Saxena 				}
3451ba0e14acSPuneet Saxena 			}
3452ba0e14acSPuneet Saxena 		}
3453ba0e14acSPuneet Saxena 	}, {
3454da7f033dSHerbert Xu 		.alg = "pcbc(fcrypt)",
34551aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3456da7f033dSHerbert Xu 		.suite = {
3457da7f033dSHerbert Xu 			.cipher = {
3458da7f033dSHerbert Xu 				.enc = {
3459da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_enc_tv_template,
3460da7f033dSHerbert Xu 					.count = FCRYPT_ENC_TEST_VECTORS
3461da7f033dSHerbert Xu 				},
3462da7f033dSHerbert Xu 				.dec = {
3463da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_dec_tv_template,
3464da7f033dSHerbert Xu 					.count = FCRYPT_DEC_TEST_VECTORS
3465da7f033dSHerbert Xu 				}
3466da7f033dSHerbert Xu 			}
3467da7f033dSHerbert Xu 		}
3468da7f033dSHerbert Xu 	}, {
3469eee9dc61SMartin Willi 		.alg = "poly1305",
3470eee9dc61SMartin Willi 		.test = alg_test_hash,
3471eee9dc61SMartin Willi 		.suite = {
3472eee9dc61SMartin Willi 			.hash = {
3473eee9dc61SMartin Willi 				.vecs = poly1305_tv_template,
3474eee9dc61SMartin Willi 				.count = POLY1305_TEST_VECTORS
3475eee9dc61SMartin Willi 			}
3476eee9dc61SMartin Willi 		}
3477eee9dc61SMartin Willi 	}, {
3478da7f033dSHerbert Xu 		.alg = "rfc3686(ctr(aes))",
34791aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3480a1915d51SJarod Wilson 		.fips_allowed = 1,
3481da7f033dSHerbert Xu 		.suite = {
3482da7f033dSHerbert Xu 			.cipher = {
3483da7f033dSHerbert Xu 				.enc = {
3484f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_enc_tv_template,
3485f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_ENC_TEST_VECTORS
3486da7f033dSHerbert Xu 				},
3487da7f033dSHerbert Xu 				.dec = {
3488f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_dec_tv_template,
3489f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_DEC_TEST_VECTORS
3490da7f033dSHerbert Xu 				}
3491da7f033dSHerbert Xu 			}
3492da7f033dSHerbert Xu 		}
3493da7f033dSHerbert Xu 	}, {
34943f31a740SHerbert Xu 		.alg = "rfc4106(gcm(aes))",
349569435b94SAdrian Hoban 		.test = alg_test_aead,
3496db71f29aSJarod Wilson 		.fips_allowed = 1,
349769435b94SAdrian Hoban 		.suite = {
349869435b94SAdrian Hoban 			.aead = {
349969435b94SAdrian Hoban 				.enc = {
350069435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_enc_tv_template,
350169435b94SAdrian Hoban 					.count = AES_GCM_4106_ENC_TEST_VECTORS
350269435b94SAdrian Hoban 				},
350369435b94SAdrian Hoban 				.dec = {
350469435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_dec_tv_template,
350569435b94SAdrian Hoban 					.count = AES_GCM_4106_DEC_TEST_VECTORS
350669435b94SAdrian Hoban 				}
350769435b94SAdrian Hoban 			}
350869435b94SAdrian Hoban 		}
350969435b94SAdrian Hoban 	}, {
3510544c436aSHerbert Xu 		.alg = "rfc4309(ccm(aes))",
35115d667322SJarod Wilson 		.test = alg_test_aead,
3512a1915d51SJarod Wilson 		.fips_allowed = 1,
35135d667322SJarod Wilson 		.suite = {
35145d667322SJarod Wilson 			.aead = {
35155d667322SJarod Wilson 				.enc = {
35165d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_enc_tv_template,
35175d667322SJarod Wilson 					.count = AES_CCM_4309_ENC_TEST_VECTORS
35185d667322SJarod Wilson 				},
35195d667322SJarod Wilson 				.dec = {
35205d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_dec_tv_template,
35215d667322SJarod Wilson 					.count = AES_CCM_4309_DEC_TEST_VECTORS
35225d667322SJarod Wilson 				}
35235d667322SJarod Wilson 			}
35245d667322SJarod Wilson 		}
35255d667322SJarod Wilson 	}, {
3526bb68745eSHerbert Xu 		.alg = "rfc4543(gcm(aes))",
3527e9b7441aSJussi Kivilinna 		.test = alg_test_aead,
3528e9b7441aSJussi Kivilinna 		.suite = {
3529e9b7441aSJussi Kivilinna 			.aead = {
3530e9b7441aSJussi Kivilinna 				.enc = {
3531e9b7441aSJussi Kivilinna 					.vecs = aes_gcm_rfc4543_enc_tv_template,
3532e9b7441aSJussi Kivilinna 					.count = AES_GCM_4543_ENC_TEST_VECTORS
3533e9b7441aSJussi Kivilinna 				},
3534e9b7441aSJussi Kivilinna 				.dec = {
3535e9b7441aSJussi Kivilinna 					.vecs = aes_gcm_rfc4543_dec_tv_template,
3536e9b7441aSJussi Kivilinna 					.count = AES_GCM_4543_DEC_TEST_VECTORS
3537e9b7441aSJussi Kivilinna 				},
3538e9b7441aSJussi Kivilinna 			}
3539e9b7441aSJussi Kivilinna 		}
3540e9b7441aSJussi Kivilinna 	}, {
3541af2b76b5SMartin Willi 		.alg = "rfc7539(chacha20,poly1305)",
3542af2b76b5SMartin Willi 		.test = alg_test_aead,
3543af2b76b5SMartin Willi 		.suite = {
3544af2b76b5SMartin Willi 			.aead = {
3545af2b76b5SMartin Willi 				.enc = {
3546af2b76b5SMartin Willi 					.vecs = rfc7539_enc_tv_template,
3547af2b76b5SMartin Willi 					.count = RFC7539_ENC_TEST_VECTORS
3548af2b76b5SMartin Willi 				},
3549af2b76b5SMartin Willi 				.dec = {
3550af2b76b5SMartin Willi 					.vecs = rfc7539_dec_tv_template,
3551af2b76b5SMartin Willi 					.count = RFC7539_DEC_TEST_VECTORS
3552af2b76b5SMartin Willi 				},
3553af2b76b5SMartin Willi 			}
3554af2b76b5SMartin Willi 		}
3555af2b76b5SMartin Willi 	}, {
35565900758dSMartin Willi 		.alg = "rfc7539esp(chacha20,poly1305)",
35575900758dSMartin Willi 		.test = alg_test_aead,
35585900758dSMartin Willi 		.suite = {
35595900758dSMartin Willi 			.aead = {
35605900758dSMartin Willi 				.enc = {
35615900758dSMartin Willi 					.vecs = rfc7539esp_enc_tv_template,
35625900758dSMartin Willi 					.count = RFC7539ESP_ENC_TEST_VECTORS
35635900758dSMartin Willi 				},
35645900758dSMartin Willi 				.dec = {
35655900758dSMartin Willi 					.vecs = rfc7539esp_dec_tv_template,
35665900758dSMartin Willi 					.count = RFC7539ESP_DEC_TEST_VECTORS
35675900758dSMartin Willi 				},
35685900758dSMartin Willi 			}
35695900758dSMartin Willi 		}
35705900758dSMartin Willi 	}, {
3571da7f033dSHerbert Xu 		.alg = "rmd128",
3572da7f033dSHerbert Xu 		.test = alg_test_hash,
3573da7f033dSHerbert Xu 		.suite = {
3574da7f033dSHerbert Xu 			.hash = {
3575da7f033dSHerbert Xu 				.vecs = rmd128_tv_template,
3576da7f033dSHerbert Xu 				.count = RMD128_TEST_VECTORS
3577da7f033dSHerbert Xu 			}
3578da7f033dSHerbert Xu 		}
3579da7f033dSHerbert Xu 	}, {
3580da7f033dSHerbert Xu 		.alg = "rmd160",
3581da7f033dSHerbert Xu 		.test = alg_test_hash,
3582da7f033dSHerbert Xu 		.suite = {
3583da7f033dSHerbert Xu 			.hash = {
3584da7f033dSHerbert Xu 				.vecs = rmd160_tv_template,
3585da7f033dSHerbert Xu 				.count = RMD160_TEST_VECTORS
3586da7f033dSHerbert Xu 			}
3587da7f033dSHerbert Xu 		}
3588da7f033dSHerbert Xu 	}, {
3589da7f033dSHerbert Xu 		.alg = "rmd256",
3590da7f033dSHerbert Xu 		.test = alg_test_hash,
3591da7f033dSHerbert Xu 		.suite = {
3592da7f033dSHerbert Xu 			.hash = {
3593da7f033dSHerbert Xu 				.vecs = rmd256_tv_template,
3594da7f033dSHerbert Xu 				.count = RMD256_TEST_VECTORS
3595da7f033dSHerbert Xu 			}
3596da7f033dSHerbert Xu 		}
3597da7f033dSHerbert Xu 	}, {
3598da7f033dSHerbert Xu 		.alg = "rmd320",
3599da7f033dSHerbert Xu 		.test = alg_test_hash,
3600da7f033dSHerbert Xu 		.suite = {
3601da7f033dSHerbert Xu 			.hash = {
3602da7f033dSHerbert Xu 				.vecs = rmd320_tv_template,
3603da7f033dSHerbert Xu 				.count = RMD320_TEST_VECTORS
3604da7f033dSHerbert Xu 			}
3605da7f033dSHerbert Xu 		}
3606da7f033dSHerbert Xu 	}, {
3607946cc463STadeusz Struk 		.alg = "rsa",
3608946cc463STadeusz Struk 		.test = alg_test_akcipher,
3609946cc463STadeusz Struk 		.fips_allowed = 1,
3610946cc463STadeusz Struk 		.suite = {
3611946cc463STadeusz Struk 			.akcipher = {
3612946cc463STadeusz Struk 				.vecs = rsa_tv_template,
3613946cc463STadeusz Struk 				.count = RSA_TEST_VECTORS
3614946cc463STadeusz Struk 			}
3615946cc463STadeusz Struk 		}
3616946cc463STadeusz Struk 	}, {
3617da7f033dSHerbert Xu 		.alg = "salsa20",
36181aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3619da7f033dSHerbert Xu 		.suite = {
3620da7f033dSHerbert Xu 			.cipher = {
3621da7f033dSHerbert Xu 				.enc = {
3622da7f033dSHerbert Xu 					.vecs = salsa20_stream_enc_tv_template,
3623da7f033dSHerbert Xu 					.count = SALSA20_STREAM_ENC_TEST_VECTORS
3624da7f033dSHerbert Xu 				}
3625da7f033dSHerbert Xu 			}
3626da7f033dSHerbert Xu 		}
3627da7f033dSHerbert Xu 	}, {
3628da7f033dSHerbert Xu 		.alg = "sha1",
3629da7f033dSHerbert Xu 		.test = alg_test_hash,
3630a1915d51SJarod Wilson 		.fips_allowed = 1,
3631da7f033dSHerbert Xu 		.suite = {
3632da7f033dSHerbert Xu 			.hash = {
3633da7f033dSHerbert Xu 				.vecs = sha1_tv_template,
3634da7f033dSHerbert Xu 				.count = SHA1_TEST_VECTORS
3635da7f033dSHerbert Xu 			}
3636da7f033dSHerbert Xu 		}
3637da7f033dSHerbert Xu 	}, {
3638da7f033dSHerbert Xu 		.alg = "sha224",
3639da7f033dSHerbert Xu 		.test = alg_test_hash,
3640a1915d51SJarod Wilson 		.fips_allowed = 1,
3641da7f033dSHerbert Xu 		.suite = {
3642da7f033dSHerbert Xu 			.hash = {
3643da7f033dSHerbert Xu 				.vecs = sha224_tv_template,
3644da7f033dSHerbert Xu 				.count = SHA224_TEST_VECTORS
3645da7f033dSHerbert Xu 			}
3646da7f033dSHerbert Xu 		}
3647da7f033dSHerbert Xu 	}, {
3648da7f033dSHerbert Xu 		.alg = "sha256",
3649da7f033dSHerbert Xu 		.test = alg_test_hash,
3650a1915d51SJarod Wilson 		.fips_allowed = 1,
3651da7f033dSHerbert Xu 		.suite = {
3652da7f033dSHerbert Xu 			.hash = {
3653da7f033dSHerbert Xu 				.vecs = sha256_tv_template,
3654da7f033dSHerbert Xu 				.count = SHA256_TEST_VECTORS
3655da7f033dSHerbert Xu 			}
3656da7f033dSHerbert Xu 		}
3657da7f033dSHerbert Xu 	}, {
3658da7f033dSHerbert Xu 		.alg = "sha384",
3659da7f033dSHerbert Xu 		.test = alg_test_hash,
3660a1915d51SJarod Wilson 		.fips_allowed = 1,
3661da7f033dSHerbert Xu 		.suite = {
3662da7f033dSHerbert Xu 			.hash = {
3663da7f033dSHerbert Xu 				.vecs = sha384_tv_template,
3664da7f033dSHerbert Xu 				.count = SHA384_TEST_VECTORS
3665da7f033dSHerbert Xu 			}
3666da7f033dSHerbert Xu 		}
3667da7f033dSHerbert Xu 	}, {
3668da7f033dSHerbert Xu 		.alg = "sha512",
3669da7f033dSHerbert Xu 		.test = alg_test_hash,
3670a1915d51SJarod Wilson 		.fips_allowed = 1,
3671da7f033dSHerbert Xu 		.suite = {
3672da7f033dSHerbert Xu 			.hash = {
3673da7f033dSHerbert Xu 				.vecs = sha512_tv_template,
3674da7f033dSHerbert Xu 				.count = SHA512_TEST_VECTORS
3675da7f033dSHerbert Xu 			}
3676da7f033dSHerbert Xu 		}
3677da7f033dSHerbert Xu 	}, {
3678da7f033dSHerbert Xu 		.alg = "tgr128",
3679da7f033dSHerbert Xu 		.test = alg_test_hash,
3680da7f033dSHerbert Xu 		.suite = {
3681da7f033dSHerbert Xu 			.hash = {
3682da7f033dSHerbert Xu 				.vecs = tgr128_tv_template,
3683da7f033dSHerbert Xu 				.count = TGR128_TEST_VECTORS
3684da7f033dSHerbert Xu 			}
3685da7f033dSHerbert Xu 		}
3686da7f033dSHerbert Xu 	}, {
3687da7f033dSHerbert Xu 		.alg = "tgr160",
3688da7f033dSHerbert Xu 		.test = alg_test_hash,
3689da7f033dSHerbert Xu 		.suite = {
3690da7f033dSHerbert Xu 			.hash = {
3691da7f033dSHerbert Xu 				.vecs = tgr160_tv_template,
3692da7f033dSHerbert Xu 				.count = TGR160_TEST_VECTORS
3693da7f033dSHerbert Xu 			}
3694da7f033dSHerbert Xu 		}
3695da7f033dSHerbert Xu 	}, {
3696da7f033dSHerbert Xu 		.alg = "tgr192",
3697da7f033dSHerbert Xu 		.test = alg_test_hash,
3698da7f033dSHerbert Xu 		.suite = {
3699da7f033dSHerbert Xu 			.hash = {
3700da7f033dSHerbert Xu 				.vecs = tgr192_tv_template,
3701da7f033dSHerbert Xu 				.count = TGR192_TEST_VECTORS
3702da7f033dSHerbert Xu 			}
3703da7f033dSHerbert Xu 		}
3704da7f033dSHerbert Xu 	}, {
3705f1939f7cSShane Wang 		.alg = "vmac(aes)",
3706f1939f7cSShane Wang 		.test = alg_test_hash,
3707f1939f7cSShane Wang 		.suite = {
3708f1939f7cSShane Wang 			.hash = {
3709f1939f7cSShane Wang 				.vecs = aes_vmac128_tv_template,
3710f1939f7cSShane Wang 				.count = VMAC_AES_TEST_VECTORS
3711f1939f7cSShane Wang 			}
3712f1939f7cSShane Wang 		}
3713f1939f7cSShane Wang 	}, {
3714da7f033dSHerbert Xu 		.alg = "wp256",
3715da7f033dSHerbert Xu 		.test = alg_test_hash,
3716da7f033dSHerbert Xu 		.suite = {
3717da7f033dSHerbert Xu 			.hash = {
3718da7f033dSHerbert Xu 				.vecs = wp256_tv_template,
3719da7f033dSHerbert Xu 				.count = WP256_TEST_VECTORS
3720da7f033dSHerbert Xu 			}
3721da7f033dSHerbert Xu 		}
3722da7f033dSHerbert Xu 	}, {
3723da7f033dSHerbert Xu 		.alg = "wp384",
3724da7f033dSHerbert Xu 		.test = alg_test_hash,
3725da7f033dSHerbert Xu 		.suite = {
3726da7f033dSHerbert Xu 			.hash = {
3727da7f033dSHerbert Xu 				.vecs = wp384_tv_template,
3728da7f033dSHerbert Xu 				.count = WP384_TEST_VECTORS
3729da7f033dSHerbert Xu 			}
3730da7f033dSHerbert Xu 		}
3731da7f033dSHerbert Xu 	}, {
3732da7f033dSHerbert Xu 		.alg = "wp512",
3733da7f033dSHerbert Xu 		.test = alg_test_hash,
3734da7f033dSHerbert Xu 		.suite = {
3735da7f033dSHerbert Xu 			.hash = {
3736da7f033dSHerbert Xu 				.vecs = wp512_tv_template,
3737da7f033dSHerbert Xu 				.count = WP512_TEST_VECTORS
3738da7f033dSHerbert Xu 			}
3739da7f033dSHerbert Xu 		}
3740da7f033dSHerbert Xu 	}, {
3741da7f033dSHerbert Xu 		.alg = "xcbc(aes)",
3742da7f033dSHerbert Xu 		.test = alg_test_hash,
3743da7f033dSHerbert Xu 		.suite = {
3744da7f033dSHerbert Xu 			.hash = {
3745da7f033dSHerbert Xu 				.vecs = aes_xcbc128_tv_template,
3746da7f033dSHerbert Xu 				.count = XCBC_AES_TEST_VECTORS
3747da7f033dSHerbert Xu 			}
3748da7f033dSHerbert Xu 		}
3749da7f033dSHerbert Xu 	}, {
3750da7f033dSHerbert Xu 		.alg = "xts(aes)",
37511aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
37522918aa8dSJarod Wilson 		.fips_allowed = 1,
3753da7f033dSHerbert Xu 		.suite = {
3754da7f033dSHerbert Xu 			.cipher = {
3755da7f033dSHerbert Xu 				.enc = {
3756da7f033dSHerbert Xu 					.vecs = aes_xts_enc_tv_template,
3757da7f033dSHerbert Xu 					.count = AES_XTS_ENC_TEST_VECTORS
3758da7f033dSHerbert Xu 				},
3759da7f033dSHerbert Xu 				.dec = {
3760da7f033dSHerbert Xu 					.vecs = aes_xts_dec_tv_template,
3761da7f033dSHerbert Xu 					.count = AES_XTS_DEC_TEST_VECTORS
3762da7f033dSHerbert Xu 				}
3763da7f033dSHerbert Xu 			}
3764da7f033dSHerbert Xu 		}
37650c01aed5SGeert Uytterhoeven 	}, {
37660840605eSJussi Kivilinna 		.alg = "xts(camellia)",
37670840605eSJussi Kivilinna 		.test = alg_test_skcipher,
37680840605eSJussi Kivilinna 		.suite = {
37690840605eSJussi Kivilinna 			.cipher = {
37700840605eSJussi Kivilinna 				.enc = {
37710840605eSJussi Kivilinna 					.vecs = camellia_xts_enc_tv_template,
37720840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_ENC_TEST_VECTORS
37730840605eSJussi Kivilinna 				},
37740840605eSJussi Kivilinna 				.dec = {
37750840605eSJussi Kivilinna 					.vecs = camellia_xts_dec_tv_template,
37760840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_DEC_TEST_VECTORS
37770840605eSJussi Kivilinna 				}
37780840605eSJussi Kivilinna 			}
37790840605eSJussi Kivilinna 		}
37800840605eSJussi Kivilinna 	}, {
37819b8b0405SJohannes Goetzfried 		.alg = "xts(cast6)",
37829b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
37839b8b0405SJohannes Goetzfried 		.suite = {
37849b8b0405SJohannes Goetzfried 			.cipher = {
37859b8b0405SJohannes Goetzfried 				.enc = {
37869b8b0405SJohannes Goetzfried 					.vecs = cast6_xts_enc_tv_template,
37879b8b0405SJohannes Goetzfried 					.count = CAST6_XTS_ENC_TEST_VECTORS
37889b8b0405SJohannes Goetzfried 				},
37899b8b0405SJohannes Goetzfried 				.dec = {
37909b8b0405SJohannes Goetzfried 					.vecs = cast6_xts_dec_tv_template,
37919b8b0405SJohannes Goetzfried 					.count = CAST6_XTS_DEC_TEST_VECTORS
37929b8b0405SJohannes Goetzfried 				}
37939b8b0405SJohannes Goetzfried 			}
37949b8b0405SJohannes Goetzfried 		}
37959b8b0405SJohannes Goetzfried 	}, {
379618be20b9SJussi Kivilinna 		.alg = "xts(serpent)",
379718be20b9SJussi Kivilinna 		.test = alg_test_skcipher,
379818be20b9SJussi Kivilinna 		.suite = {
379918be20b9SJussi Kivilinna 			.cipher = {
380018be20b9SJussi Kivilinna 				.enc = {
380118be20b9SJussi Kivilinna 					.vecs = serpent_xts_enc_tv_template,
380218be20b9SJussi Kivilinna 					.count = SERPENT_XTS_ENC_TEST_VECTORS
380318be20b9SJussi Kivilinna 				},
380418be20b9SJussi Kivilinna 				.dec = {
380518be20b9SJussi Kivilinna 					.vecs = serpent_xts_dec_tv_template,
380618be20b9SJussi Kivilinna 					.count = SERPENT_XTS_DEC_TEST_VECTORS
380718be20b9SJussi Kivilinna 				}
380818be20b9SJussi Kivilinna 			}
380918be20b9SJussi Kivilinna 		}
381018be20b9SJussi Kivilinna 	}, {
3811aed265b9SJussi Kivilinna 		.alg = "xts(twofish)",
3812aed265b9SJussi Kivilinna 		.test = alg_test_skcipher,
3813aed265b9SJussi Kivilinna 		.suite = {
3814aed265b9SJussi Kivilinna 			.cipher = {
3815aed265b9SJussi Kivilinna 				.enc = {
3816aed265b9SJussi Kivilinna 					.vecs = tf_xts_enc_tv_template,
3817aed265b9SJussi Kivilinna 					.count = TF_XTS_ENC_TEST_VECTORS
3818aed265b9SJussi Kivilinna 				},
3819aed265b9SJussi Kivilinna 				.dec = {
3820aed265b9SJussi Kivilinna 					.vecs = tf_xts_dec_tv_template,
3821aed265b9SJussi Kivilinna 					.count = TF_XTS_DEC_TEST_VECTORS
3822aed265b9SJussi Kivilinna 				}
3823aed265b9SJussi Kivilinna 			}
3824aed265b9SJussi Kivilinna 		}
3825da7f033dSHerbert Xu 	}
3826da7f033dSHerbert Xu };
3827da7f033dSHerbert Xu 
38285714758bSJussi Kivilinna static bool alg_test_descs_checked;
38295714758bSJussi Kivilinna 
38305714758bSJussi Kivilinna static void alg_test_descs_check_order(void)
38315714758bSJussi Kivilinna {
38325714758bSJussi Kivilinna 	int i;
38335714758bSJussi Kivilinna 
38345714758bSJussi Kivilinna 	/* only check once */
38355714758bSJussi Kivilinna 	if (alg_test_descs_checked)
38365714758bSJussi Kivilinna 		return;
38375714758bSJussi Kivilinna 
38385714758bSJussi Kivilinna 	alg_test_descs_checked = true;
38395714758bSJussi Kivilinna 
38405714758bSJussi Kivilinna 	for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) {
38415714758bSJussi Kivilinna 		int diff = strcmp(alg_test_descs[i - 1].alg,
38425714758bSJussi Kivilinna 				  alg_test_descs[i].alg);
38435714758bSJussi Kivilinna 
38445714758bSJussi Kivilinna 		if (WARN_ON(diff > 0)) {
38455714758bSJussi Kivilinna 			pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n",
38465714758bSJussi Kivilinna 				alg_test_descs[i - 1].alg,
38475714758bSJussi Kivilinna 				alg_test_descs[i].alg);
38485714758bSJussi Kivilinna 		}
38495714758bSJussi Kivilinna 
38505714758bSJussi Kivilinna 		if (WARN_ON(diff == 0)) {
38515714758bSJussi Kivilinna 			pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n",
38525714758bSJussi Kivilinna 				alg_test_descs[i].alg);
38535714758bSJussi Kivilinna 		}
38545714758bSJussi Kivilinna 	}
38555714758bSJussi Kivilinna }
38565714758bSJussi Kivilinna 
38571aa4ecd9SHerbert Xu static int alg_find_test(const char *alg)
3858da7f033dSHerbert Xu {
3859da7f033dSHerbert Xu 	int start = 0;
3860da7f033dSHerbert Xu 	int end = ARRAY_SIZE(alg_test_descs);
3861da7f033dSHerbert Xu 
3862da7f033dSHerbert Xu 	while (start < end) {
3863da7f033dSHerbert Xu 		int i = (start + end) / 2;
3864da7f033dSHerbert Xu 		int diff = strcmp(alg_test_descs[i].alg, alg);
3865da7f033dSHerbert Xu 
3866da7f033dSHerbert Xu 		if (diff > 0) {
3867da7f033dSHerbert Xu 			end = i;
3868da7f033dSHerbert Xu 			continue;
3869da7f033dSHerbert Xu 		}
3870da7f033dSHerbert Xu 
3871da7f033dSHerbert Xu 		if (diff < 0) {
3872da7f033dSHerbert Xu 			start = i + 1;
3873da7f033dSHerbert Xu 			continue;
3874da7f033dSHerbert Xu 		}
3875da7f033dSHerbert Xu 
38761aa4ecd9SHerbert Xu 		return i;
3877da7f033dSHerbert Xu 	}
3878da7f033dSHerbert Xu 
38791aa4ecd9SHerbert Xu 	return -1;
38801aa4ecd9SHerbert Xu }
38811aa4ecd9SHerbert Xu 
38821aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
38831aa4ecd9SHerbert Xu {
38841aa4ecd9SHerbert Xu 	int i;
3885a68f6610SHerbert Xu 	int j;
3886d12d6b6dSNeil Horman 	int rc;
38871aa4ecd9SHerbert Xu 
38885714758bSJussi Kivilinna 	alg_test_descs_check_order();
38895714758bSJussi Kivilinna 
38901aa4ecd9SHerbert Xu 	if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
38911aa4ecd9SHerbert Xu 		char nalg[CRYPTO_MAX_ALG_NAME];
38921aa4ecd9SHerbert Xu 
38931aa4ecd9SHerbert Xu 		if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
38941aa4ecd9SHerbert Xu 		    sizeof(nalg))
38951aa4ecd9SHerbert Xu 			return -ENAMETOOLONG;
38961aa4ecd9SHerbert Xu 
38971aa4ecd9SHerbert Xu 		i = alg_find_test(nalg);
38981aa4ecd9SHerbert Xu 		if (i < 0)
38991aa4ecd9SHerbert Xu 			goto notest;
39001aa4ecd9SHerbert Xu 
3901a3bef3a3SJarod Wilson 		if (fips_enabled && !alg_test_descs[i].fips_allowed)
3902a3bef3a3SJarod Wilson 			goto non_fips_alg;
3903a3bef3a3SJarod Wilson 
3904941fb328SJarod Wilson 		rc = alg_test_cipher(alg_test_descs + i, driver, type, mask);
3905941fb328SJarod Wilson 		goto test_done;
39061aa4ecd9SHerbert Xu 	}
39071aa4ecd9SHerbert Xu 
39081aa4ecd9SHerbert Xu 	i = alg_find_test(alg);
3909a68f6610SHerbert Xu 	j = alg_find_test(driver);
3910a68f6610SHerbert Xu 	if (i < 0 && j < 0)
39111aa4ecd9SHerbert Xu 		goto notest;
39121aa4ecd9SHerbert Xu 
3913a68f6610SHerbert Xu 	if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
3914a68f6610SHerbert Xu 			     (j >= 0 && !alg_test_descs[j].fips_allowed)))
3915a3bef3a3SJarod Wilson 		goto non_fips_alg;
3916a3bef3a3SJarod Wilson 
3917a68f6610SHerbert Xu 	rc = 0;
3918a68f6610SHerbert Xu 	if (i >= 0)
3919a68f6610SHerbert Xu 		rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
39201aa4ecd9SHerbert Xu 					     type, mask);
3921032c8cacSCristian Stoica 	if (j >= 0 && j != i)
3922a68f6610SHerbert Xu 		rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
3923a68f6610SHerbert Xu 					     type, mask);
3924a68f6610SHerbert Xu 
3925941fb328SJarod Wilson test_done:
3926d12d6b6dSNeil Horman 	if (fips_enabled && rc)
3927d12d6b6dSNeil Horman 		panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
3928d12d6b6dSNeil Horman 
392929ecd4abSJarod Wilson 	if (fips_enabled && !rc)
39303e8cffd4SMasanari Iida 		pr_info("alg: self-tests for %s (%s) passed\n", driver, alg);
393129ecd4abSJarod Wilson 
3932d12d6b6dSNeil Horman 	return rc;
39331aa4ecd9SHerbert Xu 
39341aa4ecd9SHerbert Xu notest:
3935da7f033dSHerbert Xu 	printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
3936da7f033dSHerbert Xu 	return 0;
3937a3bef3a3SJarod Wilson non_fips_alg:
3938a3bef3a3SJarod Wilson 	return -EINVAL;
3939da7f033dSHerbert Xu }
39400b767f96SAlexander Shishkin 
3941326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
39420b767f96SAlexander Shishkin 
3943da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test);
3944