162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Quick & dirty crypto testing module.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * This will only exist until we have a better testing mechanism
662306a36Sopenharmony_ci * (e.g. a char device).
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
962306a36Sopenharmony_ci * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
1062306a36Sopenharmony_ci * Copyright (c) 2007 Nokia Siemens Networks
1162306a36Sopenharmony_ci *
1262306a36Sopenharmony_ci * Updated RFC4106 AES-GCM testing.
1362306a36Sopenharmony_ci *    Authors: Aidan O'Mahony (aidan.o.mahony@intel.com)
1462306a36Sopenharmony_ci *             Adrian Hoban <adrian.hoban@intel.com>
1562306a36Sopenharmony_ci *             Gabriele Paoloni <gabriele.paoloni@intel.com>
1662306a36Sopenharmony_ci *             Tadeusz Struk (tadeusz.struk@intel.com)
1762306a36Sopenharmony_ci *             Copyright (c) 2010, Intel Corporation.
1862306a36Sopenharmony_ci */
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#include <crypto/aead.h>
2362306a36Sopenharmony_ci#include <crypto/hash.h>
2462306a36Sopenharmony_ci#include <crypto/skcipher.h>
2562306a36Sopenharmony_ci#include <linux/err.h>
2662306a36Sopenharmony_ci#include <linux/fips.h>
2762306a36Sopenharmony_ci#include <linux/init.h>
2862306a36Sopenharmony_ci#include <linux/interrupt.h>
2962306a36Sopenharmony_ci#include <linux/jiffies.h>
3062306a36Sopenharmony_ci#include <linux/kernel.h>
3162306a36Sopenharmony_ci#include <linux/module.h>
3262306a36Sopenharmony_ci#include <linux/moduleparam.h>
3362306a36Sopenharmony_ci#include <linux/scatterlist.h>
3462306a36Sopenharmony_ci#include <linux/slab.h>
3562306a36Sopenharmony_ci#include <linux/string.h>
3662306a36Sopenharmony_ci#include <linux/timex.h>
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci#include "internal.h"
3962306a36Sopenharmony_ci#include "tcrypt.h"
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci/*
4262306a36Sopenharmony_ci * Need slab memory for testing (size in number of pages).
4362306a36Sopenharmony_ci */
4462306a36Sopenharmony_ci#define TVMEMSIZE	4
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci/*
4762306a36Sopenharmony_ci* Used by test_cipher_speed()
4862306a36Sopenharmony_ci*/
4962306a36Sopenharmony_ci#define ENCRYPT 1
5062306a36Sopenharmony_ci#define DECRYPT 0
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci#define MAX_DIGEST_SIZE		64
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci/*
5562306a36Sopenharmony_ci * return a string with the driver name
5662306a36Sopenharmony_ci */
5762306a36Sopenharmony_ci#define get_driver_name(tfm_type, tfm) crypto_tfm_alg_driver_name(tfm_type ## _tfm(tfm))
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci/*
6062306a36Sopenharmony_ci * Used by test_cipher_speed()
6162306a36Sopenharmony_ci */
6262306a36Sopenharmony_cistatic unsigned int sec;
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_cistatic char *alg;
6562306a36Sopenharmony_cistatic u32 type;
6662306a36Sopenharmony_cistatic u32 mask;
6762306a36Sopenharmony_cistatic int mode;
6862306a36Sopenharmony_cistatic u32 num_mb = 8;
6962306a36Sopenharmony_cistatic unsigned int klen;
7062306a36Sopenharmony_cistatic char *tvmem[TVMEMSIZE];
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_cistatic const int block_sizes[] = { 16, 64, 128, 256, 1024, 1420, 4096, 0 };
7362306a36Sopenharmony_cistatic const int aead_sizes[] = { 16, 64, 256, 512, 1024, 1420, 4096, 8192, 0 };
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci#define XBUFSIZE 8
7662306a36Sopenharmony_ci#define MAX_IVLEN 32
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_cistatic int testmgr_alloc_buf(char *buf[XBUFSIZE])
7962306a36Sopenharmony_ci{
8062306a36Sopenharmony_ci	int i;
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci	for (i = 0; i < XBUFSIZE; i++) {
8362306a36Sopenharmony_ci		buf[i] = (void *)__get_free_page(GFP_KERNEL);
8462306a36Sopenharmony_ci		if (!buf[i])
8562306a36Sopenharmony_ci			goto err_free_buf;
8662306a36Sopenharmony_ci	}
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci	return 0;
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_cierr_free_buf:
9162306a36Sopenharmony_ci	while (i-- > 0)
9262306a36Sopenharmony_ci		free_page((unsigned long)buf[i]);
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci	return -ENOMEM;
9562306a36Sopenharmony_ci}
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_cistatic void testmgr_free_buf(char *buf[XBUFSIZE])
9862306a36Sopenharmony_ci{
9962306a36Sopenharmony_ci	int i;
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci	for (i = 0; i < XBUFSIZE; i++)
10262306a36Sopenharmony_ci		free_page((unsigned long)buf[i]);
10362306a36Sopenharmony_ci}
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_cistatic void sg_init_aead(struct scatterlist *sg, char *xbuf[XBUFSIZE],
10662306a36Sopenharmony_ci			 unsigned int buflen, const void *assoc,
10762306a36Sopenharmony_ci			 unsigned int aad_size)
10862306a36Sopenharmony_ci{
10962306a36Sopenharmony_ci	int np = (buflen + PAGE_SIZE - 1)/PAGE_SIZE;
11062306a36Sopenharmony_ci	int k, rem;
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci	if (np > XBUFSIZE) {
11362306a36Sopenharmony_ci		rem = PAGE_SIZE;
11462306a36Sopenharmony_ci		np = XBUFSIZE;
11562306a36Sopenharmony_ci	} else {
11662306a36Sopenharmony_ci		rem = buflen % PAGE_SIZE;
11762306a36Sopenharmony_ci	}
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci	sg_init_table(sg, np + 1);
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci	sg_set_buf(&sg[0], assoc, aad_size);
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci	if (rem)
12462306a36Sopenharmony_ci		np--;
12562306a36Sopenharmony_ci	for (k = 0; k < np; k++)
12662306a36Sopenharmony_ci		sg_set_buf(&sg[k + 1], xbuf[k], PAGE_SIZE);
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci	if (rem)
12962306a36Sopenharmony_ci		sg_set_buf(&sg[k + 1], xbuf[k], rem);
13062306a36Sopenharmony_ci}
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_cistatic inline int do_one_aead_op(struct aead_request *req, int ret)
13362306a36Sopenharmony_ci{
13462306a36Sopenharmony_ci	struct crypto_wait *wait = req->base.data;
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ci	return crypto_wait_req(ret, wait);
13762306a36Sopenharmony_ci}
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_cistruct test_mb_aead_data {
14062306a36Sopenharmony_ci	struct scatterlist sg[XBUFSIZE];
14162306a36Sopenharmony_ci	struct scatterlist sgout[XBUFSIZE];
14262306a36Sopenharmony_ci	struct aead_request *req;
14362306a36Sopenharmony_ci	struct crypto_wait wait;
14462306a36Sopenharmony_ci	char *xbuf[XBUFSIZE];
14562306a36Sopenharmony_ci	char *xoutbuf[XBUFSIZE];
14662306a36Sopenharmony_ci	char *axbuf[XBUFSIZE];
14762306a36Sopenharmony_ci};
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_cistatic int do_mult_aead_op(struct test_mb_aead_data *data, int enc,
15062306a36Sopenharmony_ci				u32 num_mb, int *rc)
15162306a36Sopenharmony_ci{
15262306a36Sopenharmony_ci	int i, err = 0;
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci	/* Fire up a bunch of concurrent requests */
15562306a36Sopenharmony_ci	for (i = 0; i < num_mb; i++) {
15662306a36Sopenharmony_ci		if (enc == ENCRYPT)
15762306a36Sopenharmony_ci			rc[i] = crypto_aead_encrypt(data[i].req);
15862306a36Sopenharmony_ci		else
15962306a36Sopenharmony_ci			rc[i] = crypto_aead_decrypt(data[i].req);
16062306a36Sopenharmony_ci	}
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci	/* Wait for all requests to finish */
16362306a36Sopenharmony_ci	for (i = 0; i < num_mb; i++) {
16462306a36Sopenharmony_ci		rc[i] = crypto_wait_req(rc[i], &data[i].wait);
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ci		if (rc[i]) {
16762306a36Sopenharmony_ci			pr_info("concurrent request %d error %d\n", i, rc[i]);
16862306a36Sopenharmony_ci			err = rc[i];
16962306a36Sopenharmony_ci		}
17062306a36Sopenharmony_ci	}
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ci	return err;
17362306a36Sopenharmony_ci}
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_cistatic int test_mb_aead_jiffies(struct test_mb_aead_data *data, int enc,
17662306a36Sopenharmony_ci				int blen, int secs, u32 num_mb)
17762306a36Sopenharmony_ci{
17862306a36Sopenharmony_ci	unsigned long start, end;
17962306a36Sopenharmony_ci	int bcount;
18062306a36Sopenharmony_ci	int ret = 0;
18162306a36Sopenharmony_ci	int *rc;
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_ci	rc = kcalloc(num_mb, sizeof(*rc), GFP_KERNEL);
18462306a36Sopenharmony_ci	if (!rc)
18562306a36Sopenharmony_ci		return -ENOMEM;
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci	for (start = jiffies, end = start + secs * HZ, bcount = 0;
18862306a36Sopenharmony_ci	     time_before(jiffies, end); bcount++) {
18962306a36Sopenharmony_ci		ret = do_mult_aead_op(data, enc, num_mb, rc);
19062306a36Sopenharmony_ci		if (ret)
19162306a36Sopenharmony_ci			goto out;
19262306a36Sopenharmony_ci	}
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci	pr_cont("%d operations in %d seconds (%llu bytes)\n",
19562306a36Sopenharmony_ci		bcount * num_mb, secs, (u64)bcount * blen * num_mb);
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ciout:
19862306a36Sopenharmony_ci	kfree(rc);
19962306a36Sopenharmony_ci	return ret;
20062306a36Sopenharmony_ci}
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_cistatic int test_mb_aead_cycles(struct test_mb_aead_data *data, int enc,
20362306a36Sopenharmony_ci			       int blen, u32 num_mb)
20462306a36Sopenharmony_ci{
20562306a36Sopenharmony_ci	unsigned long cycles = 0;
20662306a36Sopenharmony_ci	int ret = 0;
20762306a36Sopenharmony_ci	int i;
20862306a36Sopenharmony_ci	int *rc;
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ci	rc = kcalloc(num_mb, sizeof(*rc), GFP_KERNEL);
21162306a36Sopenharmony_ci	if (!rc)
21262306a36Sopenharmony_ci		return -ENOMEM;
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_ci	/* Warm-up run. */
21562306a36Sopenharmony_ci	for (i = 0; i < 4; i++) {
21662306a36Sopenharmony_ci		ret = do_mult_aead_op(data, enc, num_mb, rc);
21762306a36Sopenharmony_ci		if (ret)
21862306a36Sopenharmony_ci			goto out;
21962306a36Sopenharmony_ci	}
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci	/* The real thing. */
22262306a36Sopenharmony_ci	for (i = 0; i < 8; i++) {
22362306a36Sopenharmony_ci		cycles_t start, end;
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_ci		start = get_cycles();
22662306a36Sopenharmony_ci		ret = do_mult_aead_op(data, enc, num_mb, rc);
22762306a36Sopenharmony_ci		end = get_cycles();
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_ci		if (ret)
23062306a36Sopenharmony_ci			goto out;
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_ci		cycles += end - start;
23362306a36Sopenharmony_ci	}
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ci	pr_cont("1 operation in %lu cycles (%d bytes)\n",
23662306a36Sopenharmony_ci		(cycles + 4) / (8 * num_mb), blen);
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_ciout:
23962306a36Sopenharmony_ci	kfree(rc);
24062306a36Sopenharmony_ci	return ret;
24162306a36Sopenharmony_ci}
24262306a36Sopenharmony_ci
24362306a36Sopenharmony_cistatic void test_mb_aead_speed(const char *algo, int enc, int secs,
24462306a36Sopenharmony_ci			       struct aead_speed_template *template,
24562306a36Sopenharmony_ci			       unsigned int tcount, u8 authsize,
24662306a36Sopenharmony_ci			       unsigned int aad_size, u8 *keysize, u32 num_mb)
24762306a36Sopenharmony_ci{
24862306a36Sopenharmony_ci	struct test_mb_aead_data *data;
24962306a36Sopenharmony_ci	struct crypto_aead *tfm;
25062306a36Sopenharmony_ci	unsigned int i, j, iv_len;
25162306a36Sopenharmony_ci	const int *b_size;
25262306a36Sopenharmony_ci	const char *key;
25362306a36Sopenharmony_ci	const char *e;
25462306a36Sopenharmony_ci	void *assoc;
25562306a36Sopenharmony_ci	char *iv;
25662306a36Sopenharmony_ci	int ret;
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_ci	if (aad_size >= PAGE_SIZE) {
26062306a36Sopenharmony_ci		pr_err("associate data length (%u) too big\n", aad_size);
26162306a36Sopenharmony_ci		return;
26262306a36Sopenharmony_ci	}
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_ci	iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
26562306a36Sopenharmony_ci	if (!iv)
26662306a36Sopenharmony_ci		return;
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci	if (enc == ENCRYPT)
26962306a36Sopenharmony_ci		e = "encryption";
27062306a36Sopenharmony_ci	else
27162306a36Sopenharmony_ci		e = "decryption";
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_ci	data = kcalloc(num_mb, sizeof(*data), GFP_KERNEL);
27462306a36Sopenharmony_ci	if (!data)
27562306a36Sopenharmony_ci		goto out_free_iv;
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_ci	tfm = crypto_alloc_aead(algo, 0, 0);
27862306a36Sopenharmony_ci	if (IS_ERR(tfm)) {
27962306a36Sopenharmony_ci		pr_err("failed to load transform for %s: %ld\n",
28062306a36Sopenharmony_ci			algo, PTR_ERR(tfm));
28162306a36Sopenharmony_ci		goto out_free_data;
28262306a36Sopenharmony_ci	}
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_ci	ret = crypto_aead_setauthsize(tfm, authsize);
28562306a36Sopenharmony_ci	if (ret) {
28662306a36Sopenharmony_ci		pr_err("alg: aead: Failed to setauthsize for %s: %d\n", algo,
28762306a36Sopenharmony_ci		       ret);
28862306a36Sopenharmony_ci		goto out_free_tfm;
28962306a36Sopenharmony_ci	}
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_ci	for (i = 0; i < num_mb; ++i)
29262306a36Sopenharmony_ci		if (testmgr_alloc_buf(data[i].xbuf)) {
29362306a36Sopenharmony_ci			while (i--)
29462306a36Sopenharmony_ci				testmgr_free_buf(data[i].xbuf);
29562306a36Sopenharmony_ci			goto out_free_tfm;
29662306a36Sopenharmony_ci		}
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_ci	for (i = 0; i < num_mb; ++i)
29962306a36Sopenharmony_ci		if (testmgr_alloc_buf(data[i].axbuf)) {
30062306a36Sopenharmony_ci			while (i--)
30162306a36Sopenharmony_ci				testmgr_free_buf(data[i].axbuf);
30262306a36Sopenharmony_ci			goto out_free_xbuf;
30362306a36Sopenharmony_ci		}
30462306a36Sopenharmony_ci
30562306a36Sopenharmony_ci	for (i = 0; i < num_mb; ++i)
30662306a36Sopenharmony_ci		if (testmgr_alloc_buf(data[i].xoutbuf)) {
30762306a36Sopenharmony_ci			while (i--)
30862306a36Sopenharmony_ci				testmgr_free_buf(data[i].xoutbuf);
30962306a36Sopenharmony_ci			goto out_free_axbuf;
31062306a36Sopenharmony_ci		}
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_ci	for (i = 0; i < num_mb; ++i) {
31362306a36Sopenharmony_ci		data[i].req = aead_request_alloc(tfm, GFP_KERNEL);
31462306a36Sopenharmony_ci		if (!data[i].req) {
31562306a36Sopenharmony_ci			pr_err("alg: aead: Failed to allocate request for %s\n",
31662306a36Sopenharmony_ci			       algo);
31762306a36Sopenharmony_ci			while (i--)
31862306a36Sopenharmony_ci				aead_request_free(data[i].req);
31962306a36Sopenharmony_ci			goto out_free_xoutbuf;
32062306a36Sopenharmony_ci		}
32162306a36Sopenharmony_ci	}
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_ci	for (i = 0; i < num_mb; ++i) {
32462306a36Sopenharmony_ci		crypto_init_wait(&data[i].wait);
32562306a36Sopenharmony_ci		aead_request_set_callback(data[i].req,
32662306a36Sopenharmony_ci					  CRYPTO_TFM_REQ_MAY_BACKLOG,
32762306a36Sopenharmony_ci					  crypto_req_done, &data[i].wait);
32862306a36Sopenharmony_ci	}
32962306a36Sopenharmony_ci
33062306a36Sopenharmony_ci	pr_info("testing speed of multibuffer %s (%s) %s\n", algo,
33162306a36Sopenharmony_ci		get_driver_name(crypto_aead, tfm), e);
33262306a36Sopenharmony_ci
33362306a36Sopenharmony_ci	i = 0;
33462306a36Sopenharmony_ci	do {
33562306a36Sopenharmony_ci		b_size = aead_sizes;
33662306a36Sopenharmony_ci		do {
33762306a36Sopenharmony_ci			int bs = round_up(*b_size, crypto_aead_blocksize(tfm));
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_ci			if (bs + authsize > XBUFSIZE * PAGE_SIZE) {
34062306a36Sopenharmony_ci				pr_err("template (%u) too big for buffer (%lu)\n",
34162306a36Sopenharmony_ci				       authsize + bs,
34262306a36Sopenharmony_ci				       XBUFSIZE * PAGE_SIZE);
34362306a36Sopenharmony_ci				goto out;
34462306a36Sopenharmony_ci			}
34562306a36Sopenharmony_ci
34662306a36Sopenharmony_ci			pr_info("test %u (%d bit key, %d byte blocks): ", i,
34762306a36Sopenharmony_ci				*keysize * 8, bs);
34862306a36Sopenharmony_ci
34962306a36Sopenharmony_ci			/* Set up tfm global state, i.e. the key */
35062306a36Sopenharmony_ci
35162306a36Sopenharmony_ci			memset(tvmem[0], 0xff, PAGE_SIZE);
35262306a36Sopenharmony_ci			key = tvmem[0];
35362306a36Sopenharmony_ci			for (j = 0; j < tcount; j++) {
35462306a36Sopenharmony_ci				if (template[j].klen == *keysize) {
35562306a36Sopenharmony_ci					key = template[j].key;
35662306a36Sopenharmony_ci					break;
35762306a36Sopenharmony_ci				}
35862306a36Sopenharmony_ci			}
35962306a36Sopenharmony_ci
36062306a36Sopenharmony_ci			crypto_aead_clear_flags(tfm, ~0);
36162306a36Sopenharmony_ci
36262306a36Sopenharmony_ci			ret = crypto_aead_setkey(tfm, key, *keysize);
36362306a36Sopenharmony_ci			if (ret) {
36462306a36Sopenharmony_ci				pr_err("setkey() failed flags=%x\n",
36562306a36Sopenharmony_ci				       crypto_aead_get_flags(tfm));
36662306a36Sopenharmony_ci				goto out;
36762306a36Sopenharmony_ci			}
36862306a36Sopenharmony_ci
36962306a36Sopenharmony_ci			iv_len = crypto_aead_ivsize(tfm);
37062306a36Sopenharmony_ci			if (iv_len)
37162306a36Sopenharmony_ci				memset(iv, 0xff, iv_len);
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_ci			/* Now setup per request stuff, i.e. buffers */
37462306a36Sopenharmony_ci
37562306a36Sopenharmony_ci			for (j = 0; j < num_mb; ++j) {
37662306a36Sopenharmony_ci				struct test_mb_aead_data *cur = &data[j];
37762306a36Sopenharmony_ci
37862306a36Sopenharmony_ci				assoc = cur->axbuf[0];
37962306a36Sopenharmony_ci				memset(assoc, 0xff, aad_size);
38062306a36Sopenharmony_ci
38162306a36Sopenharmony_ci				sg_init_aead(cur->sg, cur->xbuf,
38262306a36Sopenharmony_ci					     bs + (enc ? 0 : authsize),
38362306a36Sopenharmony_ci					     assoc, aad_size);
38462306a36Sopenharmony_ci
38562306a36Sopenharmony_ci				sg_init_aead(cur->sgout, cur->xoutbuf,
38662306a36Sopenharmony_ci					     bs + (enc ? authsize : 0),
38762306a36Sopenharmony_ci					     assoc, aad_size);
38862306a36Sopenharmony_ci
38962306a36Sopenharmony_ci				aead_request_set_ad(cur->req, aad_size);
39062306a36Sopenharmony_ci
39162306a36Sopenharmony_ci				if (!enc) {
39262306a36Sopenharmony_ci
39362306a36Sopenharmony_ci					aead_request_set_crypt(cur->req,
39462306a36Sopenharmony_ci							       cur->sgout,
39562306a36Sopenharmony_ci							       cur->sg,
39662306a36Sopenharmony_ci							       bs, iv);
39762306a36Sopenharmony_ci					ret = crypto_aead_encrypt(cur->req);
39862306a36Sopenharmony_ci					ret = do_one_aead_op(cur->req, ret);
39962306a36Sopenharmony_ci
40062306a36Sopenharmony_ci					if (ret) {
40162306a36Sopenharmony_ci						pr_err("calculating auth failed (%d)\n",
40262306a36Sopenharmony_ci						       ret);
40362306a36Sopenharmony_ci						break;
40462306a36Sopenharmony_ci					}
40562306a36Sopenharmony_ci				}
40662306a36Sopenharmony_ci
40762306a36Sopenharmony_ci				aead_request_set_crypt(cur->req, cur->sg,
40862306a36Sopenharmony_ci						       cur->sgout, bs +
40962306a36Sopenharmony_ci						       (enc ? 0 : authsize),
41062306a36Sopenharmony_ci						       iv);
41162306a36Sopenharmony_ci
41262306a36Sopenharmony_ci			}
41362306a36Sopenharmony_ci
41462306a36Sopenharmony_ci			if (secs) {
41562306a36Sopenharmony_ci				ret = test_mb_aead_jiffies(data, enc, bs,
41662306a36Sopenharmony_ci							   secs, num_mb);
41762306a36Sopenharmony_ci				cond_resched();
41862306a36Sopenharmony_ci			} else {
41962306a36Sopenharmony_ci				ret = test_mb_aead_cycles(data, enc, bs,
42062306a36Sopenharmony_ci							  num_mb);
42162306a36Sopenharmony_ci			}
42262306a36Sopenharmony_ci
42362306a36Sopenharmony_ci			if (ret) {
42462306a36Sopenharmony_ci				pr_err("%s() failed return code=%d\n", e, ret);
42562306a36Sopenharmony_ci				break;
42662306a36Sopenharmony_ci			}
42762306a36Sopenharmony_ci			b_size++;
42862306a36Sopenharmony_ci			i++;
42962306a36Sopenharmony_ci		} while (*b_size);
43062306a36Sopenharmony_ci		keysize++;
43162306a36Sopenharmony_ci	} while (*keysize);
43262306a36Sopenharmony_ci
43362306a36Sopenharmony_ciout:
43462306a36Sopenharmony_ci	for (i = 0; i < num_mb; ++i)
43562306a36Sopenharmony_ci		aead_request_free(data[i].req);
43662306a36Sopenharmony_ciout_free_xoutbuf:
43762306a36Sopenharmony_ci	for (i = 0; i < num_mb; ++i)
43862306a36Sopenharmony_ci		testmgr_free_buf(data[i].xoutbuf);
43962306a36Sopenharmony_ciout_free_axbuf:
44062306a36Sopenharmony_ci	for (i = 0; i < num_mb; ++i)
44162306a36Sopenharmony_ci		testmgr_free_buf(data[i].axbuf);
44262306a36Sopenharmony_ciout_free_xbuf:
44362306a36Sopenharmony_ci	for (i = 0; i < num_mb; ++i)
44462306a36Sopenharmony_ci		testmgr_free_buf(data[i].xbuf);
44562306a36Sopenharmony_ciout_free_tfm:
44662306a36Sopenharmony_ci	crypto_free_aead(tfm);
44762306a36Sopenharmony_ciout_free_data:
44862306a36Sopenharmony_ci	kfree(data);
44962306a36Sopenharmony_ciout_free_iv:
45062306a36Sopenharmony_ci	kfree(iv);
45162306a36Sopenharmony_ci}
45262306a36Sopenharmony_ci
45362306a36Sopenharmony_cistatic int test_aead_jiffies(struct aead_request *req, int enc,
45462306a36Sopenharmony_ci				int blen, int secs)
45562306a36Sopenharmony_ci{
45662306a36Sopenharmony_ci	unsigned long start, end;
45762306a36Sopenharmony_ci	int bcount;
45862306a36Sopenharmony_ci	int ret;
45962306a36Sopenharmony_ci
46062306a36Sopenharmony_ci	for (start = jiffies, end = start + secs * HZ, bcount = 0;
46162306a36Sopenharmony_ci	     time_before(jiffies, end); bcount++) {
46262306a36Sopenharmony_ci		if (enc)
46362306a36Sopenharmony_ci			ret = do_one_aead_op(req, crypto_aead_encrypt(req));
46462306a36Sopenharmony_ci		else
46562306a36Sopenharmony_ci			ret = do_one_aead_op(req, crypto_aead_decrypt(req));
46662306a36Sopenharmony_ci
46762306a36Sopenharmony_ci		if (ret)
46862306a36Sopenharmony_ci			return ret;
46962306a36Sopenharmony_ci	}
47062306a36Sopenharmony_ci
47162306a36Sopenharmony_ci	pr_cont("%d operations in %d seconds (%llu bytes)\n",
47262306a36Sopenharmony_ci	        bcount, secs, (u64)bcount * blen);
47362306a36Sopenharmony_ci	return 0;
47462306a36Sopenharmony_ci}
47562306a36Sopenharmony_ci
47662306a36Sopenharmony_cistatic int test_aead_cycles(struct aead_request *req, int enc, int blen)
47762306a36Sopenharmony_ci{
47862306a36Sopenharmony_ci	unsigned long cycles = 0;
47962306a36Sopenharmony_ci	int ret = 0;
48062306a36Sopenharmony_ci	int i;
48162306a36Sopenharmony_ci
48262306a36Sopenharmony_ci	/* Warm-up run. */
48362306a36Sopenharmony_ci	for (i = 0; i < 4; i++) {
48462306a36Sopenharmony_ci		if (enc)
48562306a36Sopenharmony_ci			ret = do_one_aead_op(req, crypto_aead_encrypt(req));
48662306a36Sopenharmony_ci		else
48762306a36Sopenharmony_ci			ret = do_one_aead_op(req, crypto_aead_decrypt(req));
48862306a36Sopenharmony_ci
48962306a36Sopenharmony_ci		if (ret)
49062306a36Sopenharmony_ci			goto out;
49162306a36Sopenharmony_ci	}
49262306a36Sopenharmony_ci
49362306a36Sopenharmony_ci	/* The real thing. */
49462306a36Sopenharmony_ci	for (i = 0; i < 8; i++) {
49562306a36Sopenharmony_ci		cycles_t start, end;
49662306a36Sopenharmony_ci
49762306a36Sopenharmony_ci		start = get_cycles();
49862306a36Sopenharmony_ci		if (enc)
49962306a36Sopenharmony_ci			ret = do_one_aead_op(req, crypto_aead_encrypt(req));
50062306a36Sopenharmony_ci		else
50162306a36Sopenharmony_ci			ret = do_one_aead_op(req, crypto_aead_decrypt(req));
50262306a36Sopenharmony_ci		end = get_cycles();
50362306a36Sopenharmony_ci
50462306a36Sopenharmony_ci		if (ret)
50562306a36Sopenharmony_ci			goto out;
50662306a36Sopenharmony_ci
50762306a36Sopenharmony_ci		cycles += end - start;
50862306a36Sopenharmony_ci	}
50962306a36Sopenharmony_ci
51062306a36Sopenharmony_ciout:
51162306a36Sopenharmony_ci	if (ret == 0)
51262306a36Sopenharmony_ci		pr_cont("1 operation in %lu cycles (%d bytes)\n",
51362306a36Sopenharmony_ci			(cycles + 4) / 8, blen);
51462306a36Sopenharmony_ci
51562306a36Sopenharmony_ci	return ret;
51662306a36Sopenharmony_ci}
51762306a36Sopenharmony_ci
51862306a36Sopenharmony_cistatic void test_aead_speed(const char *algo, int enc, unsigned int secs,
51962306a36Sopenharmony_ci			    struct aead_speed_template *template,
52062306a36Sopenharmony_ci			    unsigned int tcount, u8 authsize,
52162306a36Sopenharmony_ci			    unsigned int aad_size, u8 *keysize)
52262306a36Sopenharmony_ci{
52362306a36Sopenharmony_ci	unsigned int i, j;
52462306a36Sopenharmony_ci	struct crypto_aead *tfm;
52562306a36Sopenharmony_ci	int ret = -ENOMEM;
52662306a36Sopenharmony_ci	const char *key;
52762306a36Sopenharmony_ci	struct aead_request *req;
52862306a36Sopenharmony_ci	struct scatterlist *sg;
52962306a36Sopenharmony_ci	struct scatterlist *sgout;
53062306a36Sopenharmony_ci	const char *e;
53162306a36Sopenharmony_ci	void *assoc;
53262306a36Sopenharmony_ci	char *iv;
53362306a36Sopenharmony_ci	char *xbuf[XBUFSIZE];
53462306a36Sopenharmony_ci	char *xoutbuf[XBUFSIZE];
53562306a36Sopenharmony_ci	char *axbuf[XBUFSIZE];
53662306a36Sopenharmony_ci	const int *b_size;
53762306a36Sopenharmony_ci	unsigned int iv_len;
53862306a36Sopenharmony_ci	struct crypto_wait wait;
53962306a36Sopenharmony_ci
54062306a36Sopenharmony_ci	iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
54162306a36Sopenharmony_ci	if (!iv)
54262306a36Sopenharmony_ci		return;
54362306a36Sopenharmony_ci
54462306a36Sopenharmony_ci	if (aad_size >= PAGE_SIZE) {
54562306a36Sopenharmony_ci		pr_err("associate data length (%u) too big\n", aad_size);
54662306a36Sopenharmony_ci		goto out_noxbuf;
54762306a36Sopenharmony_ci	}
54862306a36Sopenharmony_ci
54962306a36Sopenharmony_ci	if (enc == ENCRYPT)
55062306a36Sopenharmony_ci		e = "encryption";
55162306a36Sopenharmony_ci	else
55262306a36Sopenharmony_ci		e = "decryption";
55362306a36Sopenharmony_ci
55462306a36Sopenharmony_ci	if (testmgr_alloc_buf(xbuf))
55562306a36Sopenharmony_ci		goto out_noxbuf;
55662306a36Sopenharmony_ci	if (testmgr_alloc_buf(axbuf))
55762306a36Sopenharmony_ci		goto out_noaxbuf;
55862306a36Sopenharmony_ci	if (testmgr_alloc_buf(xoutbuf))
55962306a36Sopenharmony_ci		goto out_nooutbuf;
56062306a36Sopenharmony_ci
56162306a36Sopenharmony_ci	sg = kmalloc(sizeof(*sg) * 9 * 2, GFP_KERNEL);
56262306a36Sopenharmony_ci	if (!sg)
56362306a36Sopenharmony_ci		goto out_nosg;
56462306a36Sopenharmony_ci	sgout = &sg[9];
56562306a36Sopenharmony_ci
56662306a36Sopenharmony_ci	tfm = crypto_alloc_aead(algo, 0, 0);
56762306a36Sopenharmony_ci	if (IS_ERR(tfm)) {
56862306a36Sopenharmony_ci		pr_err("alg: aead: Failed to load transform for %s: %ld\n", algo,
56962306a36Sopenharmony_ci		       PTR_ERR(tfm));
57062306a36Sopenharmony_ci		goto out_notfm;
57162306a36Sopenharmony_ci	}
57262306a36Sopenharmony_ci
57362306a36Sopenharmony_ci	ret = crypto_aead_setauthsize(tfm, authsize);
57462306a36Sopenharmony_ci	if (ret) {
57562306a36Sopenharmony_ci		pr_err("alg: aead: Failed to setauthsize for %s: %d\n", algo,
57662306a36Sopenharmony_ci		       ret);
57762306a36Sopenharmony_ci		goto out_noreq;
57862306a36Sopenharmony_ci	}
57962306a36Sopenharmony_ci
58062306a36Sopenharmony_ci	crypto_init_wait(&wait);
58162306a36Sopenharmony_ci	pr_info("testing speed of %s (%s) %s\n", algo,
58262306a36Sopenharmony_ci		get_driver_name(crypto_aead, tfm), e);
58362306a36Sopenharmony_ci
58462306a36Sopenharmony_ci	req = aead_request_alloc(tfm, GFP_KERNEL);
58562306a36Sopenharmony_ci	if (!req) {
58662306a36Sopenharmony_ci		pr_err("alg: aead: Failed to allocate request for %s\n",
58762306a36Sopenharmony_ci		       algo);
58862306a36Sopenharmony_ci		goto out_noreq;
58962306a36Sopenharmony_ci	}
59062306a36Sopenharmony_ci
59162306a36Sopenharmony_ci	aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
59262306a36Sopenharmony_ci				  crypto_req_done, &wait);
59362306a36Sopenharmony_ci
59462306a36Sopenharmony_ci	i = 0;
59562306a36Sopenharmony_ci	do {
59662306a36Sopenharmony_ci		b_size = aead_sizes;
59762306a36Sopenharmony_ci		do {
59862306a36Sopenharmony_ci			u32 bs = round_up(*b_size, crypto_aead_blocksize(tfm));
59962306a36Sopenharmony_ci
60062306a36Sopenharmony_ci			assoc = axbuf[0];
60162306a36Sopenharmony_ci			memset(assoc, 0xff, aad_size);
60262306a36Sopenharmony_ci
60362306a36Sopenharmony_ci			if ((*keysize + bs) > TVMEMSIZE * PAGE_SIZE) {
60462306a36Sopenharmony_ci				pr_err("template (%u) too big for tvmem (%lu)\n",
60562306a36Sopenharmony_ci				       *keysize + bs,
60662306a36Sopenharmony_ci					TVMEMSIZE * PAGE_SIZE);
60762306a36Sopenharmony_ci				goto out;
60862306a36Sopenharmony_ci			}
60962306a36Sopenharmony_ci
61062306a36Sopenharmony_ci			key = tvmem[0];
61162306a36Sopenharmony_ci			for (j = 0; j < tcount; j++) {
61262306a36Sopenharmony_ci				if (template[j].klen == *keysize) {
61362306a36Sopenharmony_ci					key = template[j].key;
61462306a36Sopenharmony_ci					break;
61562306a36Sopenharmony_ci				}
61662306a36Sopenharmony_ci			}
61762306a36Sopenharmony_ci
61862306a36Sopenharmony_ci			ret = crypto_aead_setkey(tfm, key, *keysize);
61962306a36Sopenharmony_ci			if (ret) {
62062306a36Sopenharmony_ci				pr_err("setkey() failed flags=%x: %d\n",
62162306a36Sopenharmony_ci					crypto_aead_get_flags(tfm), ret);
62262306a36Sopenharmony_ci				goto out;
62362306a36Sopenharmony_ci			}
62462306a36Sopenharmony_ci
62562306a36Sopenharmony_ci			iv_len = crypto_aead_ivsize(tfm);
62662306a36Sopenharmony_ci			if (iv_len)
62762306a36Sopenharmony_ci				memset(iv, 0xff, iv_len);
62862306a36Sopenharmony_ci
62962306a36Sopenharmony_ci			crypto_aead_clear_flags(tfm, ~0);
63062306a36Sopenharmony_ci			pr_info("test %u (%d bit key, %d byte blocks): ",
63162306a36Sopenharmony_ci				i, *keysize * 8, bs);
63262306a36Sopenharmony_ci
63362306a36Sopenharmony_ci			memset(tvmem[0], 0xff, PAGE_SIZE);
63462306a36Sopenharmony_ci
63562306a36Sopenharmony_ci			sg_init_aead(sg, xbuf, bs + (enc ? 0 : authsize),
63662306a36Sopenharmony_ci				     assoc, aad_size);
63762306a36Sopenharmony_ci
63862306a36Sopenharmony_ci			sg_init_aead(sgout, xoutbuf,
63962306a36Sopenharmony_ci				     bs + (enc ? authsize : 0), assoc,
64062306a36Sopenharmony_ci				     aad_size);
64162306a36Sopenharmony_ci
64262306a36Sopenharmony_ci			aead_request_set_ad(req, aad_size);
64362306a36Sopenharmony_ci
64462306a36Sopenharmony_ci			if (!enc) {
64562306a36Sopenharmony_ci
64662306a36Sopenharmony_ci				/*
64762306a36Sopenharmony_ci				 * For decryption we need a proper auth so
64862306a36Sopenharmony_ci				 * we do the encryption path once with buffers
64962306a36Sopenharmony_ci				 * reversed (input <-> output) to calculate it
65062306a36Sopenharmony_ci				 */
65162306a36Sopenharmony_ci				aead_request_set_crypt(req, sgout, sg,
65262306a36Sopenharmony_ci						       bs, iv);
65362306a36Sopenharmony_ci				ret = do_one_aead_op(req,
65462306a36Sopenharmony_ci						     crypto_aead_encrypt(req));
65562306a36Sopenharmony_ci
65662306a36Sopenharmony_ci				if (ret) {
65762306a36Sopenharmony_ci					pr_err("calculating auth failed (%d)\n",
65862306a36Sopenharmony_ci					       ret);
65962306a36Sopenharmony_ci					break;
66062306a36Sopenharmony_ci				}
66162306a36Sopenharmony_ci			}
66262306a36Sopenharmony_ci
66362306a36Sopenharmony_ci			aead_request_set_crypt(req, sg, sgout,
66462306a36Sopenharmony_ci					       bs + (enc ? 0 : authsize),
66562306a36Sopenharmony_ci					       iv);
66662306a36Sopenharmony_ci
66762306a36Sopenharmony_ci			if (secs) {
66862306a36Sopenharmony_ci				ret = test_aead_jiffies(req, enc, bs,
66962306a36Sopenharmony_ci							secs);
67062306a36Sopenharmony_ci				cond_resched();
67162306a36Sopenharmony_ci			} else {
67262306a36Sopenharmony_ci				ret = test_aead_cycles(req, enc, bs);
67362306a36Sopenharmony_ci			}
67462306a36Sopenharmony_ci
67562306a36Sopenharmony_ci			if (ret) {
67662306a36Sopenharmony_ci				pr_err("%s() failed return code=%d\n", e, ret);
67762306a36Sopenharmony_ci				break;
67862306a36Sopenharmony_ci			}
67962306a36Sopenharmony_ci			b_size++;
68062306a36Sopenharmony_ci			i++;
68162306a36Sopenharmony_ci		} while (*b_size);
68262306a36Sopenharmony_ci		keysize++;
68362306a36Sopenharmony_ci	} while (*keysize);
68462306a36Sopenharmony_ci
68562306a36Sopenharmony_ciout:
68662306a36Sopenharmony_ci	aead_request_free(req);
68762306a36Sopenharmony_ciout_noreq:
68862306a36Sopenharmony_ci	crypto_free_aead(tfm);
68962306a36Sopenharmony_ciout_notfm:
69062306a36Sopenharmony_ci	kfree(sg);
69162306a36Sopenharmony_ciout_nosg:
69262306a36Sopenharmony_ci	testmgr_free_buf(xoutbuf);
69362306a36Sopenharmony_ciout_nooutbuf:
69462306a36Sopenharmony_ci	testmgr_free_buf(axbuf);
69562306a36Sopenharmony_ciout_noaxbuf:
69662306a36Sopenharmony_ci	testmgr_free_buf(xbuf);
69762306a36Sopenharmony_ciout_noxbuf:
69862306a36Sopenharmony_ci	kfree(iv);
69962306a36Sopenharmony_ci}
70062306a36Sopenharmony_ci
70162306a36Sopenharmony_cistatic void test_hash_sg_init(struct scatterlist *sg)
70262306a36Sopenharmony_ci{
70362306a36Sopenharmony_ci	int i;
70462306a36Sopenharmony_ci
70562306a36Sopenharmony_ci	sg_init_table(sg, TVMEMSIZE);
70662306a36Sopenharmony_ci	for (i = 0; i < TVMEMSIZE; i++) {
70762306a36Sopenharmony_ci		sg_set_buf(sg + i, tvmem[i], PAGE_SIZE);
70862306a36Sopenharmony_ci		memset(tvmem[i], 0xff, PAGE_SIZE);
70962306a36Sopenharmony_ci	}
71062306a36Sopenharmony_ci}
71162306a36Sopenharmony_ci
71262306a36Sopenharmony_cistatic inline int do_one_ahash_op(struct ahash_request *req, int ret)
71362306a36Sopenharmony_ci{
71462306a36Sopenharmony_ci	struct crypto_wait *wait = req->base.data;
71562306a36Sopenharmony_ci
71662306a36Sopenharmony_ci	return crypto_wait_req(ret, wait);
71762306a36Sopenharmony_ci}
71862306a36Sopenharmony_ci
71962306a36Sopenharmony_cistatic int test_ahash_jiffies_digest(struct ahash_request *req, int blen,
72062306a36Sopenharmony_ci				     char *out, int secs)
72162306a36Sopenharmony_ci{
72262306a36Sopenharmony_ci	unsigned long start, end;
72362306a36Sopenharmony_ci	int bcount;
72462306a36Sopenharmony_ci	int ret;
72562306a36Sopenharmony_ci
72662306a36Sopenharmony_ci	for (start = jiffies, end = start + secs * HZ, bcount = 0;
72762306a36Sopenharmony_ci	     time_before(jiffies, end); bcount++) {
72862306a36Sopenharmony_ci		ret = do_one_ahash_op(req, crypto_ahash_digest(req));
72962306a36Sopenharmony_ci		if (ret)
73062306a36Sopenharmony_ci			return ret;
73162306a36Sopenharmony_ci	}
73262306a36Sopenharmony_ci
73362306a36Sopenharmony_ci	pr_cont("%6u opers/sec, %9lu bytes/sec\n",
73462306a36Sopenharmony_ci		bcount / secs, ((long)bcount * blen) / secs);
73562306a36Sopenharmony_ci
73662306a36Sopenharmony_ci	return 0;
73762306a36Sopenharmony_ci}
73862306a36Sopenharmony_ci
73962306a36Sopenharmony_cistatic int test_ahash_jiffies(struct ahash_request *req, int blen,
74062306a36Sopenharmony_ci			      int plen, char *out, int secs)
74162306a36Sopenharmony_ci{
74262306a36Sopenharmony_ci	unsigned long start, end;
74362306a36Sopenharmony_ci	int bcount, pcount;
74462306a36Sopenharmony_ci	int ret;
74562306a36Sopenharmony_ci
74662306a36Sopenharmony_ci	if (plen == blen)
74762306a36Sopenharmony_ci		return test_ahash_jiffies_digest(req, blen, out, secs);
74862306a36Sopenharmony_ci
74962306a36Sopenharmony_ci	for (start = jiffies, end = start + secs * HZ, bcount = 0;
75062306a36Sopenharmony_ci	     time_before(jiffies, end); bcount++) {
75162306a36Sopenharmony_ci		ret = do_one_ahash_op(req, crypto_ahash_init(req));
75262306a36Sopenharmony_ci		if (ret)
75362306a36Sopenharmony_ci			return ret;
75462306a36Sopenharmony_ci		for (pcount = 0; pcount < blen; pcount += plen) {
75562306a36Sopenharmony_ci			ret = do_one_ahash_op(req, crypto_ahash_update(req));
75662306a36Sopenharmony_ci			if (ret)
75762306a36Sopenharmony_ci				return ret;
75862306a36Sopenharmony_ci		}
75962306a36Sopenharmony_ci		/* we assume there is enough space in 'out' for the result */
76062306a36Sopenharmony_ci		ret = do_one_ahash_op(req, crypto_ahash_final(req));
76162306a36Sopenharmony_ci		if (ret)
76262306a36Sopenharmony_ci			return ret;
76362306a36Sopenharmony_ci	}
76462306a36Sopenharmony_ci
76562306a36Sopenharmony_ci	pr_cont("%6u opers/sec, %9lu bytes/sec\n",
76662306a36Sopenharmony_ci		bcount / secs, ((long)bcount * blen) / secs);
76762306a36Sopenharmony_ci
76862306a36Sopenharmony_ci	return 0;
76962306a36Sopenharmony_ci}
77062306a36Sopenharmony_ci
77162306a36Sopenharmony_cistatic int test_ahash_cycles_digest(struct ahash_request *req, int blen,
77262306a36Sopenharmony_ci				    char *out)
77362306a36Sopenharmony_ci{
77462306a36Sopenharmony_ci	unsigned long cycles = 0;
77562306a36Sopenharmony_ci	int ret, i;
77662306a36Sopenharmony_ci
77762306a36Sopenharmony_ci	/* Warm-up run. */
77862306a36Sopenharmony_ci	for (i = 0; i < 4; i++) {
77962306a36Sopenharmony_ci		ret = do_one_ahash_op(req, crypto_ahash_digest(req));
78062306a36Sopenharmony_ci		if (ret)
78162306a36Sopenharmony_ci			goto out;
78262306a36Sopenharmony_ci	}
78362306a36Sopenharmony_ci
78462306a36Sopenharmony_ci	/* The real thing. */
78562306a36Sopenharmony_ci	for (i = 0; i < 8; i++) {
78662306a36Sopenharmony_ci		cycles_t start, end;
78762306a36Sopenharmony_ci
78862306a36Sopenharmony_ci		start = get_cycles();
78962306a36Sopenharmony_ci
79062306a36Sopenharmony_ci		ret = do_one_ahash_op(req, crypto_ahash_digest(req));
79162306a36Sopenharmony_ci		if (ret)
79262306a36Sopenharmony_ci			goto out;
79362306a36Sopenharmony_ci
79462306a36Sopenharmony_ci		end = get_cycles();
79562306a36Sopenharmony_ci
79662306a36Sopenharmony_ci		cycles += end - start;
79762306a36Sopenharmony_ci	}
79862306a36Sopenharmony_ci
79962306a36Sopenharmony_ciout:
80062306a36Sopenharmony_ci	if (ret)
80162306a36Sopenharmony_ci		return ret;
80262306a36Sopenharmony_ci
80362306a36Sopenharmony_ci	pr_cont("%6lu cycles/operation, %4lu cycles/byte\n",
80462306a36Sopenharmony_ci		cycles / 8, cycles / (8 * blen));
80562306a36Sopenharmony_ci
80662306a36Sopenharmony_ci	return 0;
80762306a36Sopenharmony_ci}
80862306a36Sopenharmony_ci
80962306a36Sopenharmony_cistatic int test_ahash_cycles(struct ahash_request *req, int blen,
81062306a36Sopenharmony_ci			     int plen, char *out)
81162306a36Sopenharmony_ci{
81262306a36Sopenharmony_ci	unsigned long cycles = 0;
81362306a36Sopenharmony_ci	int i, pcount, ret;
81462306a36Sopenharmony_ci
81562306a36Sopenharmony_ci	if (plen == blen)
81662306a36Sopenharmony_ci		return test_ahash_cycles_digest(req, blen, out);
81762306a36Sopenharmony_ci
81862306a36Sopenharmony_ci	/* Warm-up run. */
81962306a36Sopenharmony_ci	for (i = 0; i < 4; i++) {
82062306a36Sopenharmony_ci		ret = do_one_ahash_op(req, crypto_ahash_init(req));
82162306a36Sopenharmony_ci		if (ret)
82262306a36Sopenharmony_ci			goto out;
82362306a36Sopenharmony_ci		for (pcount = 0; pcount < blen; pcount += plen) {
82462306a36Sopenharmony_ci			ret = do_one_ahash_op(req, crypto_ahash_update(req));
82562306a36Sopenharmony_ci			if (ret)
82662306a36Sopenharmony_ci				goto out;
82762306a36Sopenharmony_ci		}
82862306a36Sopenharmony_ci		ret = do_one_ahash_op(req, crypto_ahash_final(req));
82962306a36Sopenharmony_ci		if (ret)
83062306a36Sopenharmony_ci			goto out;
83162306a36Sopenharmony_ci	}
83262306a36Sopenharmony_ci
83362306a36Sopenharmony_ci	/* The real thing. */
83462306a36Sopenharmony_ci	for (i = 0; i < 8; i++) {
83562306a36Sopenharmony_ci		cycles_t start, end;
83662306a36Sopenharmony_ci
83762306a36Sopenharmony_ci		start = get_cycles();
83862306a36Sopenharmony_ci
83962306a36Sopenharmony_ci		ret = do_one_ahash_op(req, crypto_ahash_init(req));
84062306a36Sopenharmony_ci		if (ret)
84162306a36Sopenharmony_ci			goto out;
84262306a36Sopenharmony_ci		for (pcount = 0; pcount < blen; pcount += plen) {
84362306a36Sopenharmony_ci			ret = do_one_ahash_op(req, crypto_ahash_update(req));
84462306a36Sopenharmony_ci			if (ret)
84562306a36Sopenharmony_ci				goto out;
84662306a36Sopenharmony_ci		}
84762306a36Sopenharmony_ci		ret = do_one_ahash_op(req, crypto_ahash_final(req));
84862306a36Sopenharmony_ci		if (ret)
84962306a36Sopenharmony_ci			goto out;
85062306a36Sopenharmony_ci
85162306a36Sopenharmony_ci		end = get_cycles();
85262306a36Sopenharmony_ci
85362306a36Sopenharmony_ci		cycles += end - start;
85462306a36Sopenharmony_ci	}
85562306a36Sopenharmony_ci
85662306a36Sopenharmony_ciout:
85762306a36Sopenharmony_ci	if (ret)
85862306a36Sopenharmony_ci		return ret;
85962306a36Sopenharmony_ci
86062306a36Sopenharmony_ci	pr_cont("%6lu cycles/operation, %4lu cycles/byte\n",
86162306a36Sopenharmony_ci		cycles / 8, cycles / (8 * blen));
86262306a36Sopenharmony_ci
86362306a36Sopenharmony_ci	return 0;
86462306a36Sopenharmony_ci}
86562306a36Sopenharmony_ci
86662306a36Sopenharmony_cistatic void test_ahash_speed_common(const char *algo, unsigned int secs,
86762306a36Sopenharmony_ci				    struct hash_speed *speed, unsigned mask)
86862306a36Sopenharmony_ci{
86962306a36Sopenharmony_ci	struct scatterlist sg[TVMEMSIZE];
87062306a36Sopenharmony_ci	struct crypto_wait wait;
87162306a36Sopenharmony_ci	struct ahash_request *req;
87262306a36Sopenharmony_ci	struct crypto_ahash *tfm;
87362306a36Sopenharmony_ci	char *output;
87462306a36Sopenharmony_ci	int i, ret;
87562306a36Sopenharmony_ci
87662306a36Sopenharmony_ci	tfm = crypto_alloc_ahash(algo, 0, mask);
87762306a36Sopenharmony_ci	if (IS_ERR(tfm)) {
87862306a36Sopenharmony_ci		pr_err("failed to load transform for %s: %ld\n",
87962306a36Sopenharmony_ci		       algo, PTR_ERR(tfm));
88062306a36Sopenharmony_ci		return;
88162306a36Sopenharmony_ci	}
88262306a36Sopenharmony_ci
88362306a36Sopenharmony_ci	pr_info("testing speed of async %s (%s)\n", algo,
88462306a36Sopenharmony_ci		get_driver_name(crypto_ahash, tfm));
88562306a36Sopenharmony_ci
88662306a36Sopenharmony_ci	if (crypto_ahash_digestsize(tfm) > MAX_DIGEST_SIZE) {
88762306a36Sopenharmony_ci		pr_err("digestsize(%u) > %d\n", crypto_ahash_digestsize(tfm),
88862306a36Sopenharmony_ci		       MAX_DIGEST_SIZE);
88962306a36Sopenharmony_ci		goto out;
89062306a36Sopenharmony_ci	}
89162306a36Sopenharmony_ci
89262306a36Sopenharmony_ci	test_hash_sg_init(sg);
89362306a36Sopenharmony_ci	req = ahash_request_alloc(tfm, GFP_KERNEL);
89462306a36Sopenharmony_ci	if (!req) {
89562306a36Sopenharmony_ci		pr_err("ahash request allocation failure\n");
89662306a36Sopenharmony_ci		goto out;
89762306a36Sopenharmony_ci	}
89862306a36Sopenharmony_ci
89962306a36Sopenharmony_ci	crypto_init_wait(&wait);
90062306a36Sopenharmony_ci	ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
90162306a36Sopenharmony_ci				   crypto_req_done, &wait);
90262306a36Sopenharmony_ci
90362306a36Sopenharmony_ci	output = kmalloc(MAX_DIGEST_SIZE, GFP_KERNEL);
90462306a36Sopenharmony_ci	if (!output)
90562306a36Sopenharmony_ci		goto out_nomem;
90662306a36Sopenharmony_ci
90762306a36Sopenharmony_ci	for (i = 0; speed[i].blen != 0; i++) {
90862306a36Sopenharmony_ci		if (speed[i].blen > TVMEMSIZE * PAGE_SIZE) {
90962306a36Sopenharmony_ci			pr_err("template (%u) too big for tvmem (%lu)\n",
91062306a36Sopenharmony_ci			       speed[i].blen, TVMEMSIZE * PAGE_SIZE);
91162306a36Sopenharmony_ci			break;
91262306a36Sopenharmony_ci		}
91362306a36Sopenharmony_ci
91462306a36Sopenharmony_ci		if (klen)
91562306a36Sopenharmony_ci			crypto_ahash_setkey(tfm, tvmem[0], klen);
91662306a36Sopenharmony_ci
91762306a36Sopenharmony_ci		pr_info("test%3u "
91862306a36Sopenharmony_ci			"(%5u byte blocks,%5u bytes per update,%4u updates): ",
91962306a36Sopenharmony_ci			i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen);
92062306a36Sopenharmony_ci
92162306a36Sopenharmony_ci		ahash_request_set_crypt(req, sg, output, speed[i].plen);
92262306a36Sopenharmony_ci
92362306a36Sopenharmony_ci		if (secs) {
92462306a36Sopenharmony_ci			ret = test_ahash_jiffies(req, speed[i].blen,
92562306a36Sopenharmony_ci						 speed[i].plen, output, secs);
92662306a36Sopenharmony_ci			cond_resched();
92762306a36Sopenharmony_ci		} else {
92862306a36Sopenharmony_ci			ret = test_ahash_cycles(req, speed[i].blen,
92962306a36Sopenharmony_ci						speed[i].plen, output);
93062306a36Sopenharmony_ci		}
93162306a36Sopenharmony_ci
93262306a36Sopenharmony_ci		if (ret) {
93362306a36Sopenharmony_ci			pr_err("hashing failed ret=%d\n", ret);
93462306a36Sopenharmony_ci			break;
93562306a36Sopenharmony_ci		}
93662306a36Sopenharmony_ci	}
93762306a36Sopenharmony_ci
93862306a36Sopenharmony_ci	kfree(output);
93962306a36Sopenharmony_ci
94062306a36Sopenharmony_ciout_nomem:
94162306a36Sopenharmony_ci	ahash_request_free(req);
94262306a36Sopenharmony_ci
94362306a36Sopenharmony_ciout:
94462306a36Sopenharmony_ci	crypto_free_ahash(tfm);
94562306a36Sopenharmony_ci}
94662306a36Sopenharmony_ci
94762306a36Sopenharmony_cistatic void test_ahash_speed(const char *algo, unsigned int secs,
94862306a36Sopenharmony_ci			     struct hash_speed *speed)
94962306a36Sopenharmony_ci{
95062306a36Sopenharmony_ci	return test_ahash_speed_common(algo, secs, speed, 0);
95162306a36Sopenharmony_ci}
95262306a36Sopenharmony_ci
95362306a36Sopenharmony_cistatic void test_hash_speed(const char *algo, unsigned int secs,
95462306a36Sopenharmony_ci			    struct hash_speed *speed)
95562306a36Sopenharmony_ci{
95662306a36Sopenharmony_ci	return test_ahash_speed_common(algo, secs, speed, CRYPTO_ALG_ASYNC);
95762306a36Sopenharmony_ci}
95862306a36Sopenharmony_ci
95962306a36Sopenharmony_cistruct test_mb_skcipher_data {
96062306a36Sopenharmony_ci	struct scatterlist sg[XBUFSIZE];
96162306a36Sopenharmony_ci	struct skcipher_request *req;
96262306a36Sopenharmony_ci	struct crypto_wait wait;
96362306a36Sopenharmony_ci	char *xbuf[XBUFSIZE];
96462306a36Sopenharmony_ci};
96562306a36Sopenharmony_ci
96662306a36Sopenharmony_cistatic int do_mult_acipher_op(struct test_mb_skcipher_data *data, int enc,
96762306a36Sopenharmony_ci				u32 num_mb, int *rc)
96862306a36Sopenharmony_ci{
96962306a36Sopenharmony_ci	int i, err = 0;
97062306a36Sopenharmony_ci
97162306a36Sopenharmony_ci	/* Fire up a bunch of concurrent requests */
97262306a36Sopenharmony_ci	for (i = 0; i < num_mb; i++) {
97362306a36Sopenharmony_ci		if (enc == ENCRYPT)
97462306a36Sopenharmony_ci			rc[i] = crypto_skcipher_encrypt(data[i].req);
97562306a36Sopenharmony_ci		else
97662306a36Sopenharmony_ci			rc[i] = crypto_skcipher_decrypt(data[i].req);
97762306a36Sopenharmony_ci	}
97862306a36Sopenharmony_ci
97962306a36Sopenharmony_ci	/* Wait for all requests to finish */
98062306a36Sopenharmony_ci	for (i = 0; i < num_mb; i++) {
98162306a36Sopenharmony_ci		rc[i] = crypto_wait_req(rc[i], &data[i].wait);
98262306a36Sopenharmony_ci
98362306a36Sopenharmony_ci		if (rc[i]) {
98462306a36Sopenharmony_ci			pr_info("concurrent request %d error %d\n", i, rc[i]);
98562306a36Sopenharmony_ci			err = rc[i];
98662306a36Sopenharmony_ci		}
98762306a36Sopenharmony_ci	}
98862306a36Sopenharmony_ci
98962306a36Sopenharmony_ci	return err;
99062306a36Sopenharmony_ci}
99162306a36Sopenharmony_ci
99262306a36Sopenharmony_cistatic int test_mb_acipher_jiffies(struct test_mb_skcipher_data *data, int enc,
99362306a36Sopenharmony_ci				int blen, int secs, u32 num_mb)
99462306a36Sopenharmony_ci{
99562306a36Sopenharmony_ci	unsigned long start, end;
99662306a36Sopenharmony_ci	int bcount;
99762306a36Sopenharmony_ci	int ret = 0;
99862306a36Sopenharmony_ci	int *rc;
99962306a36Sopenharmony_ci
100062306a36Sopenharmony_ci	rc = kcalloc(num_mb, sizeof(*rc), GFP_KERNEL);
100162306a36Sopenharmony_ci	if (!rc)
100262306a36Sopenharmony_ci		return -ENOMEM;
100362306a36Sopenharmony_ci
100462306a36Sopenharmony_ci	for (start = jiffies, end = start + secs * HZ, bcount = 0;
100562306a36Sopenharmony_ci	     time_before(jiffies, end); bcount++) {
100662306a36Sopenharmony_ci		ret = do_mult_acipher_op(data, enc, num_mb, rc);
100762306a36Sopenharmony_ci		if (ret)
100862306a36Sopenharmony_ci			goto out;
100962306a36Sopenharmony_ci	}
101062306a36Sopenharmony_ci
101162306a36Sopenharmony_ci	pr_cont("%d operations in %d seconds (%llu bytes)\n",
101262306a36Sopenharmony_ci		bcount * num_mb, secs, (u64)bcount * blen * num_mb);
101362306a36Sopenharmony_ci
101462306a36Sopenharmony_ciout:
101562306a36Sopenharmony_ci	kfree(rc);
101662306a36Sopenharmony_ci	return ret;
101762306a36Sopenharmony_ci}
101862306a36Sopenharmony_ci
101962306a36Sopenharmony_cistatic int test_mb_acipher_cycles(struct test_mb_skcipher_data *data, int enc,
102062306a36Sopenharmony_ci			       int blen, u32 num_mb)
102162306a36Sopenharmony_ci{
102262306a36Sopenharmony_ci	unsigned long cycles = 0;
102362306a36Sopenharmony_ci	int ret = 0;
102462306a36Sopenharmony_ci	int i;
102562306a36Sopenharmony_ci	int *rc;
102662306a36Sopenharmony_ci
102762306a36Sopenharmony_ci	rc = kcalloc(num_mb, sizeof(*rc), GFP_KERNEL);
102862306a36Sopenharmony_ci	if (!rc)
102962306a36Sopenharmony_ci		return -ENOMEM;
103062306a36Sopenharmony_ci
103162306a36Sopenharmony_ci	/* Warm-up run. */
103262306a36Sopenharmony_ci	for (i = 0; i < 4; i++) {
103362306a36Sopenharmony_ci		ret = do_mult_acipher_op(data, enc, num_mb, rc);
103462306a36Sopenharmony_ci		if (ret)
103562306a36Sopenharmony_ci			goto out;
103662306a36Sopenharmony_ci	}
103762306a36Sopenharmony_ci
103862306a36Sopenharmony_ci	/* The real thing. */
103962306a36Sopenharmony_ci	for (i = 0; i < 8; i++) {
104062306a36Sopenharmony_ci		cycles_t start, end;
104162306a36Sopenharmony_ci
104262306a36Sopenharmony_ci		start = get_cycles();
104362306a36Sopenharmony_ci		ret = do_mult_acipher_op(data, enc, num_mb, rc);
104462306a36Sopenharmony_ci		end = get_cycles();
104562306a36Sopenharmony_ci
104662306a36Sopenharmony_ci		if (ret)
104762306a36Sopenharmony_ci			goto out;
104862306a36Sopenharmony_ci
104962306a36Sopenharmony_ci		cycles += end - start;
105062306a36Sopenharmony_ci	}
105162306a36Sopenharmony_ci
105262306a36Sopenharmony_ci	pr_cont("1 operation in %lu cycles (%d bytes)\n",
105362306a36Sopenharmony_ci		(cycles + 4) / (8 * num_mb), blen);
105462306a36Sopenharmony_ci
105562306a36Sopenharmony_ciout:
105662306a36Sopenharmony_ci	kfree(rc);
105762306a36Sopenharmony_ci	return ret;
105862306a36Sopenharmony_ci}
105962306a36Sopenharmony_ci
106062306a36Sopenharmony_cistatic void test_mb_skcipher_speed(const char *algo, int enc, int secs,
106162306a36Sopenharmony_ci				   struct cipher_speed_template *template,
106262306a36Sopenharmony_ci				   unsigned int tcount, u8 *keysize, u32 num_mb)
106362306a36Sopenharmony_ci{
106462306a36Sopenharmony_ci	struct test_mb_skcipher_data *data;
106562306a36Sopenharmony_ci	struct crypto_skcipher *tfm;
106662306a36Sopenharmony_ci	unsigned int i, j, iv_len;
106762306a36Sopenharmony_ci	const int *b_size;
106862306a36Sopenharmony_ci	const char *key;
106962306a36Sopenharmony_ci	const char *e;
107062306a36Sopenharmony_ci	char iv[128];
107162306a36Sopenharmony_ci	int ret;
107262306a36Sopenharmony_ci
107362306a36Sopenharmony_ci	if (enc == ENCRYPT)
107462306a36Sopenharmony_ci		e = "encryption";
107562306a36Sopenharmony_ci	else
107662306a36Sopenharmony_ci		e = "decryption";
107762306a36Sopenharmony_ci
107862306a36Sopenharmony_ci	data = kcalloc(num_mb, sizeof(*data), GFP_KERNEL);
107962306a36Sopenharmony_ci	if (!data)
108062306a36Sopenharmony_ci		return;
108162306a36Sopenharmony_ci
108262306a36Sopenharmony_ci	tfm = crypto_alloc_skcipher(algo, 0, 0);
108362306a36Sopenharmony_ci	if (IS_ERR(tfm)) {
108462306a36Sopenharmony_ci		pr_err("failed to load transform for %s: %ld\n",
108562306a36Sopenharmony_ci			algo, PTR_ERR(tfm));
108662306a36Sopenharmony_ci		goto out_free_data;
108762306a36Sopenharmony_ci	}
108862306a36Sopenharmony_ci
108962306a36Sopenharmony_ci	for (i = 0; i < num_mb; ++i)
109062306a36Sopenharmony_ci		if (testmgr_alloc_buf(data[i].xbuf)) {
109162306a36Sopenharmony_ci			while (i--)
109262306a36Sopenharmony_ci				testmgr_free_buf(data[i].xbuf);
109362306a36Sopenharmony_ci			goto out_free_tfm;
109462306a36Sopenharmony_ci		}
109562306a36Sopenharmony_ci
109662306a36Sopenharmony_ci	for (i = 0; i < num_mb; ++i) {
109762306a36Sopenharmony_ci		data[i].req = skcipher_request_alloc(tfm, GFP_KERNEL);
109862306a36Sopenharmony_ci		if (!data[i].req) {
109962306a36Sopenharmony_ci			pr_err("alg: skcipher: Failed to allocate request for %s\n",
110062306a36Sopenharmony_ci			       algo);
110162306a36Sopenharmony_ci			while (i--)
110262306a36Sopenharmony_ci				skcipher_request_free(data[i].req);
110362306a36Sopenharmony_ci			goto out_free_xbuf;
110462306a36Sopenharmony_ci		}
110562306a36Sopenharmony_ci	}
110662306a36Sopenharmony_ci
110762306a36Sopenharmony_ci	for (i = 0; i < num_mb; ++i) {
110862306a36Sopenharmony_ci		skcipher_request_set_callback(data[i].req,
110962306a36Sopenharmony_ci					      CRYPTO_TFM_REQ_MAY_BACKLOG,
111062306a36Sopenharmony_ci					      crypto_req_done, &data[i].wait);
111162306a36Sopenharmony_ci		crypto_init_wait(&data[i].wait);
111262306a36Sopenharmony_ci	}
111362306a36Sopenharmony_ci
111462306a36Sopenharmony_ci	pr_info("testing speed of multibuffer %s (%s) %s\n", algo,
111562306a36Sopenharmony_ci		get_driver_name(crypto_skcipher, tfm), e);
111662306a36Sopenharmony_ci
111762306a36Sopenharmony_ci	i = 0;
111862306a36Sopenharmony_ci	do {
111962306a36Sopenharmony_ci		b_size = block_sizes;
112062306a36Sopenharmony_ci		do {
112162306a36Sopenharmony_ci			u32 bs = round_up(*b_size, crypto_skcipher_blocksize(tfm));
112262306a36Sopenharmony_ci
112362306a36Sopenharmony_ci			if (bs > XBUFSIZE * PAGE_SIZE) {
112462306a36Sopenharmony_ci				pr_err("template (%u) too big for buffer (%lu)\n",
112562306a36Sopenharmony_ci				       bs, XBUFSIZE * PAGE_SIZE);
112662306a36Sopenharmony_ci				goto out;
112762306a36Sopenharmony_ci			}
112862306a36Sopenharmony_ci
112962306a36Sopenharmony_ci			pr_info("test %u (%d bit key, %d byte blocks): ", i,
113062306a36Sopenharmony_ci				*keysize * 8, bs);
113162306a36Sopenharmony_ci
113262306a36Sopenharmony_ci			/* Set up tfm global state, i.e. the key */
113362306a36Sopenharmony_ci
113462306a36Sopenharmony_ci			memset(tvmem[0], 0xff, PAGE_SIZE);
113562306a36Sopenharmony_ci			key = tvmem[0];
113662306a36Sopenharmony_ci			for (j = 0; j < tcount; j++) {
113762306a36Sopenharmony_ci				if (template[j].klen == *keysize) {
113862306a36Sopenharmony_ci					key = template[j].key;
113962306a36Sopenharmony_ci					break;
114062306a36Sopenharmony_ci				}
114162306a36Sopenharmony_ci			}
114262306a36Sopenharmony_ci
114362306a36Sopenharmony_ci			crypto_skcipher_clear_flags(tfm, ~0);
114462306a36Sopenharmony_ci
114562306a36Sopenharmony_ci			ret = crypto_skcipher_setkey(tfm, key, *keysize);
114662306a36Sopenharmony_ci			if (ret) {
114762306a36Sopenharmony_ci				pr_err("setkey() failed flags=%x\n",
114862306a36Sopenharmony_ci				       crypto_skcipher_get_flags(tfm));
114962306a36Sopenharmony_ci				goto out;
115062306a36Sopenharmony_ci			}
115162306a36Sopenharmony_ci
115262306a36Sopenharmony_ci			iv_len = crypto_skcipher_ivsize(tfm);
115362306a36Sopenharmony_ci			if (iv_len)
115462306a36Sopenharmony_ci				memset(&iv, 0xff, iv_len);
115562306a36Sopenharmony_ci
115662306a36Sopenharmony_ci			/* Now setup per request stuff, i.e. buffers */
115762306a36Sopenharmony_ci
115862306a36Sopenharmony_ci			for (j = 0; j < num_mb; ++j) {
115962306a36Sopenharmony_ci				struct test_mb_skcipher_data *cur = &data[j];
116062306a36Sopenharmony_ci				unsigned int k = bs;
116162306a36Sopenharmony_ci				unsigned int pages = DIV_ROUND_UP(k, PAGE_SIZE);
116262306a36Sopenharmony_ci				unsigned int p = 0;
116362306a36Sopenharmony_ci
116462306a36Sopenharmony_ci				sg_init_table(cur->sg, pages);
116562306a36Sopenharmony_ci
116662306a36Sopenharmony_ci				while (k > PAGE_SIZE) {
116762306a36Sopenharmony_ci					sg_set_buf(cur->sg + p, cur->xbuf[p],
116862306a36Sopenharmony_ci						   PAGE_SIZE);
116962306a36Sopenharmony_ci					memset(cur->xbuf[p], 0xff, PAGE_SIZE);
117062306a36Sopenharmony_ci					p++;
117162306a36Sopenharmony_ci					k -= PAGE_SIZE;
117262306a36Sopenharmony_ci				}
117362306a36Sopenharmony_ci
117462306a36Sopenharmony_ci				sg_set_buf(cur->sg + p, cur->xbuf[p], k);
117562306a36Sopenharmony_ci				memset(cur->xbuf[p], 0xff, k);
117662306a36Sopenharmony_ci
117762306a36Sopenharmony_ci				skcipher_request_set_crypt(cur->req, cur->sg,
117862306a36Sopenharmony_ci							   cur->sg, bs, iv);
117962306a36Sopenharmony_ci			}
118062306a36Sopenharmony_ci
118162306a36Sopenharmony_ci			if (secs) {
118262306a36Sopenharmony_ci				ret = test_mb_acipher_jiffies(data, enc,
118362306a36Sopenharmony_ci							      bs, secs,
118462306a36Sopenharmony_ci							      num_mb);
118562306a36Sopenharmony_ci				cond_resched();
118662306a36Sopenharmony_ci			} else {
118762306a36Sopenharmony_ci				ret = test_mb_acipher_cycles(data, enc,
118862306a36Sopenharmony_ci							     bs, num_mb);
118962306a36Sopenharmony_ci			}
119062306a36Sopenharmony_ci
119162306a36Sopenharmony_ci			if (ret) {
119262306a36Sopenharmony_ci				pr_err("%s() failed flags=%x\n", e,
119362306a36Sopenharmony_ci				       crypto_skcipher_get_flags(tfm));
119462306a36Sopenharmony_ci				break;
119562306a36Sopenharmony_ci			}
119662306a36Sopenharmony_ci			b_size++;
119762306a36Sopenharmony_ci			i++;
119862306a36Sopenharmony_ci		} while (*b_size);
119962306a36Sopenharmony_ci		keysize++;
120062306a36Sopenharmony_ci	} while (*keysize);
120162306a36Sopenharmony_ci
120262306a36Sopenharmony_ciout:
120362306a36Sopenharmony_ci	for (i = 0; i < num_mb; ++i)
120462306a36Sopenharmony_ci		skcipher_request_free(data[i].req);
120562306a36Sopenharmony_ciout_free_xbuf:
120662306a36Sopenharmony_ci	for (i = 0; i < num_mb; ++i)
120762306a36Sopenharmony_ci		testmgr_free_buf(data[i].xbuf);
120862306a36Sopenharmony_ciout_free_tfm:
120962306a36Sopenharmony_ci	crypto_free_skcipher(tfm);
121062306a36Sopenharmony_ciout_free_data:
121162306a36Sopenharmony_ci	kfree(data);
121262306a36Sopenharmony_ci}
121362306a36Sopenharmony_ci
121462306a36Sopenharmony_cistatic inline int do_one_acipher_op(struct skcipher_request *req, int ret)
121562306a36Sopenharmony_ci{
121662306a36Sopenharmony_ci	struct crypto_wait *wait = req->base.data;
121762306a36Sopenharmony_ci
121862306a36Sopenharmony_ci	return crypto_wait_req(ret, wait);
121962306a36Sopenharmony_ci}
122062306a36Sopenharmony_ci
122162306a36Sopenharmony_cistatic int test_acipher_jiffies(struct skcipher_request *req, int enc,
122262306a36Sopenharmony_ci				int blen, int secs)
122362306a36Sopenharmony_ci{
122462306a36Sopenharmony_ci	unsigned long start, end;
122562306a36Sopenharmony_ci	int bcount;
122662306a36Sopenharmony_ci	int ret;
122762306a36Sopenharmony_ci
122862306a36Sopenharmony_ci	for (start = jiffies, end = start + secs * HZ, bcount = 0;
122962306a36Sopenharmony_ci	     time_before(jiffies, end); bcount++) {
123062306a36Sopenharmony_ci		if (enc)
123162306a36Sopenharmony_ci			ret = do_one_acipher_op(req,
123262306a36Sopenharmony_ci						crypto_skcipher_encrypt(req));
123362306a36Sopenharmony_ci		else
123462306a36Sopenharmony_ci			ret = do_one_acipher_op(req,
123562306a36Sopenharmony_ci						crypto_skcipher_decrypt(req));
123662306a36Sopenharmony_ci
123762306a36Sopenharmony_ci		if (ret)
123862306a36Sopenharmony_ci			return ret;
123962306a36Sopenharmony_ci	}
124062306a36Sopenharmony_ci
124162306a36Sopenharmony_ci	pr_cont("%d operations in %d seconds (%llu bytes)\n",
124262306a36Sopenharmony_ci		bcount, secs, (u64)bcount * blen);
124362306a36Sopenharmony_ci	return 0;
124462306a36Sopenharmony_ci}
124562306a36Sopenharmony_ci
124662306a36Sopenharmony_cistatic int test_acipher_cycles(struct skcipher_request *req, int enc,
124762306a36Sopenharmony_ci			       int blen)
124862306a36Sopenharmony_ci{
124962306a36Sopenharmony_ci	unsigned long cycles = 0;
125062306a36Sopenharmony_ci	int ret = 0;
125162306a36Sopenharmony_ci	int i;
125262306a36Sopenharmony_ci
125362306a36Sopenharmony_ci	/* Warm-up run. */
125462306a36Sopenharmony_ci	for (i = 0; i < 4; i++) {
125562306a36Sopenharmony_ci		if (enc)
125662306a36Sopenharmony_ci			ret = do_one_acipher_op(req,
125762306a36Sopenharmony_ci						crypto_skcipher_encrypt(req));
125862306a36Sopenharmony_ci		else
125962306a36Sopenharmony_ci			ret = do_one_acipher_op(req,
126062306a36Sopenharmony_ci						crypto_skcipher_decrypt(req));
126162306a36Sopenharmony_ci
126262306a36Sopenharmony_ci		if (ret)
126362306a36Sopenharmony_ci			goto out;
126462306a36Sopenharmony_ci	}
126562306a36Sopenharmony_ci
126662306a36Sopenharmony_ci	/* The real thing. */
126762306a36Sopenharmony_ci	for (i = 0; i < 8; i++) {
126862306a36Sopenharmony_ci		cycles_t start, end;
126962306a36Sopenharmony_ci
127062306a36Sopenharmony_ci		start = get_cycles();
127162306a36Sopenharmony_ci		if (enc)
127262306a36Sopenharmony_ci			ret = do_one_acipher_op(req,
127362306a36Sopenharmony_ci						crypto_skcipher_encrypt(req));
127462306a36Sopenharmony_ci		else
127562306a36Sopenharmony_ci			ret = do_one_acipher_op(req,
127662306a36Sopenharmony_ci						crypto_skcipher_decrypt(req));
127762306a36Sopenharmony_ci		end = get_cycles();
127862306a36Sopenharmony_ci
127962306a36Sopenharmony_ci		if (ret)
128062306a36Sopenharmony_ci			goto out;
128162306a36Sopenharmony_ci
128262306a36Sopenharmony_ci		cycles += end - start;
128362306a36Sopenharmony_ci	}
128462306a36Sopenharmony_ci
128562306a36Sopenharmony_ciout:
128662306a36Sopenharmony_ci	if (ret == 0)
128762306a36Sopenharmony_ci		pr_cont("1 operation in %lu cycles (%d bytes)\n",
128862306a36Sopenharmony_ci			(cycles + 4) / 8, blen);
128962306a36Sopenharmony_ci
129062306a36Sopenharmony_ci	return ret;
129162306a36Sopenharmony_ci}
129262306a36Sopenharmony_ci
129362306a36Sopenharmony_cistatic void test_skcipher_speed(const char *algo, int enc, unsigned int secs,
129462306a36Sopenharmony_ci				struct cipher_speed_template *template,
129562306a36Sopenharmony_ci				unsigned int tcount, u8 *keysize, bool async)
129662306a36Sopenharmony_ci{
129762306a36Sopenharmony_ci	unsigned int ret, i, j, k, iv_len;
129862306a36Sopenharmony_ci	struct crypto_wait wait;
129962306a36Sopenharmony_ci	const char *key;
130062306a36Sopenharmony_ci	char iv[128];
130162306a36Sopenharmony_ci	struct skcipher_request *req;
130262306a36Sopenharmony_ci	struct crypto_skcipher *tfm;
130362306a36Sopenharmony_ci	const int *b_size;
130462306a36Sopenharmony_ci	const char *e;
130562306a36Sopenharmony_ci
130662306a36Sopenharmony_ci	if (enc == ENCRYPT)
130762306a36Sopenharmony_ci		e = "encryption";
130862306a36Sopenharmony_ci	else
130962306a36Sopenharmony_ci		e = "decryption";
131062306a36Sopenharmony_ci
131162306a36Sopenharmony_ci	crypto_init_wait(&wait);
131262306a36Sopenharmony_ci
131362306a36Sopenharmony_ci	tfm = crypto_alloc_skcipher(algo, 0, async ? 0 : CRYPTO_ALG_ASYNC);
131462306a36Sopenharmony_ci
131562306a36Sopenharmony_ci	if (IS_ERR(tfm)) {
131662306a36Sopenharmony_ci		pr_err("failed to load transform for %s: %ld\n", algo,
131762306a36Sopenharmony_ci		       PTR_ERR(tfm));
131862306a36Sopenharmony_ci		return;
131962306a36Sopenharmony_ci	}
132062306a36Sopenharmony_ci
132162306a36Sopenharmony_ci	pr_info("testing speed of %s %s (%s) %s\n", async ? "async" : "sync",
132262306a36Sopenharmony_ci		algo, get_driver_name(crypto_skcipher, tfm), e);
132362306a36Sopenharmony_ci
132462306a36Sopenharmony_ci	req = skcipher_request_alloc(tfm, GFP_KERNEL);
132562306a36Sopenharmony_ci	if (!req) {
132662306a36Sopenharmony_ci		pr_err("skcipher: Failed to allocate request for %s\n", algo);
132762306a36Sopenharmony_ci		goto out;
132862306a36Sopenharmony_ci	}
132962306a36Sopenharmony_ci
133062306a36Sopenharmony_ci	skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
133162306a36Sopenharmony_ci				      crypto_req_done, &wait);
133262306a36Sopenharmony_ci
133362306a36Sopenharmony_ci	i = 0;
133462306a36Sopenharmony_ci	do {
133562306a36Sopenharmony_ci		b_size = block_sizes;
133662306a36Sopenharmony_ci
133762306a36Sopenharmony_ci		do {
133862306a36Sopenharmony_ci			u32 bs = round_up(*b_size, crypto_skcipher_blocksize(tfm));
133962306a36Sopenharmony_ci			struct scatterlist sg[TVMEMSIZE];
134062306a36Sopenharmony_ci
134162306a36Sopenharmony_ci			if ((*keysize + bs) > TVMEMSIZE * PAGE_SIZE) {
134262306a36Sopenharmony_ci				pr_err("template (%u) too big for "
134362306a36Sopenharmony_ci				       "tvmem (%lu)\n", *keysize + bs,
134462306a36Sopenharmony_ci				       TVMEMSIZE * PAGE_SIZE);
134562306a36Sopenharmony_ci				goto out_free_req;
134662306a36Sopenharmony_ci			}
134762306a36Sopenharmony_ci
134862306a36Sopenharmony_ci			pr_info("test %u (%d bit key, %d byte blocks): ", i,
134962306a36Sopenharmony_ci				*keysize * 8, bs);
135062306a36Sopenharmony_ci
135162306a36Sopenharmony_ci			memset(tvmem[0], 0xff, PAGE_SIZE);
135262306a36Sopenharmony_ci
135362306a36Sopenharmony_ci			/* set key, plain text and IV */
135462306a36Sopenharmony_ci			key = tvmem[0];
135562306a36Sopenharmony_ci			for (j = 0; j < tcount; j++) {
135662306a36Sopenharmony_ci				if (template[j].klen == *keysize) {
135762306a36Sopenharmony_ci					key = template[j].key;
135862306a36Sopenharmony_ci					break;
135962306a36Sopenharmony_ci				}
136062306a36Sopenharmony_ci			}
136162306a36Sopenharmony_ci
136262306a36Sopenharmony_ci			crypto_skcipher_clear_flags(tfm, ~0);
136362306a36Sopenharmony_ci
136462306a36Sopenharmony_ci			ret = crypto_skcipher_setkey(tfm, key, *keysize);
136562306a36Sopenharmony_ci			if (ret) {
136662306a36Sopenharmony_ci				pr_err("setkey() failed flags=%x\n",
136762306a36Sopenharmony_ci					crypto_skcipher_get_flags(tfm));
136862306a36Sopenharmony_ci				goto out_free_req;
136962306a36Sopenharmony_ci			}
137062306a36Sopenharmony_ci
137162306a36Sopenharmony_ci			k = *keysize + bs;
137262306a36Sopenharmony_ci			sg_init_table(sg, DIV_ROUND_UP(k, PAGE_SIZE));
137362306a36Sopenharmony_ci
137462306a36Sopenharmony_ci			if (k > PAGE_SIZE) {
137562306a36Sopenharmony_ci				sg_set_buf(sg, tvmem[0] + *keysize,
137662306a36Sopenharmony_ci				   PAGE_SIZE - *keysize);
137762306a36Sopenharmony_ci				k -= PAGE_SIZE;
137862306a36Sopenharmony_ci				j = 1;
137962306a36Sopenharmony_ci				while (k > PAGE_SIZE) {
138062306a36Sopenharmony_ci					sg_set_buf(sg + j, tvmem[j], PAGE_SIZE);
138162306a36Sopenharmony_ci					memset(tvmem[j], 0xff, PAGE_SIZE);
138262306a36Sopenharmony_ci					j++;
138362306a36Sopenharmony_ci					k -= PAGE_SIZE;
138462306a36Sopenharmony_ci				}
138562306a36Sopenharmony_ci				sg_set_buf(sg + j, tvmem[j], k);
138662306a36Sopenharmony_ci				memset(tvmem[j], 0xff, k);
138762306a36Sopenharmony_ci			} else {
138862306a36Sopenharmony_ci				sg_set_buf(sg, tvmem[0] + *keysize, bs);
138962306a36Sopenharmony_ci			}
139062306a36Sopenharmony_ci
139162306a36Sopenharmony_ci			iv_len = crypto_skcipher_ivsize(tfm);
139262306a36Sopenharmony_ci			if (iv_len)
139362306a36Sopenharmony_ci				memset(&iv, 0xff, iv_len);
139462306a36Sopenharmony_ci
139562306a36Sopenharmony_ci			skcipher_request_set_crypt(req, sg, sg, bs, iv);
139662306a36Sopenharmony_ci
139762306a36Sopenharmony_ci			if (secs) {
139862306a36Sopenharmony_ci				ret = test_acipher_jiffies(req, enc,
139962306a36Sopenharmony_ci							   bs, secs);
140062306a36Sopenharmony_ci				cond_resched();
140162306a36Sopenharmony_ci			} else {
140262306a36Sopenharmony_ci				ret = test_acipher_cycles(req, enc,
140362306a36Sopenharmony_ci							  bs);
140462306a36Sopenharmony_ci			}
140562306a36Sopenharmony_ci
140662306a36Sopenharmony_ci			if (ret) {
140762306a36Sopenharmony_ci				pr_err("%s() failed flags=%x\n", e,
140862306a36Sopenharmony_ci				       crypto_skcipher_get_flags(tfm));
140962306a36Sopenharmony_ci				break;
141062306a36Sopenharmony_ci			}
141162306a36Sopenharmony_ci			b_size++;
141262306a36Sopenharmony_ci			i++;
141362306a36Sopenharmony_ci		} while (*b_size);
141462306a36Sopenharmony_ci		keysize++;
141562306a36Sopenharmony_ci	} while (*keysize);
141662306a36Sopenharmony_ci
141762306a36Sopenharmony_ciout_free_req:
141862306a36Sopenharmony_ci	skcipher_request_free(req);
141962306a36Sopenharmony_ciout:
142062306a36Sopenharmony_ci	crypto_free_skcipher(tfm);
142162306a36Sopenharmony_ci}
142262306a36Sopenharmony_ci
142362306a36Sopenharmony_cistatic void test_acipher_speed(const char *algo, int enc, unsigned int secs,
142462306a36Sopenharmony_ci			       struct cipher_speed_template *template,
142562306a36Sopenharmony_ci			       unsigned int tcount, u8 *keysize)
142662306a36Sopenharmony_ci{
142762306a36Sopenharmony_ci	return test_skcipher_speed(algo, enc, secs, template, tcount, keysize,
142862306a36Sopenharmony_ci				   true);
142962306a36Sopenharmony_ci}
143062306a36Sopenharmony_ci
143162306a36Sopenharmony_cistatic void test_cipher_speed(const char *algo, int enc, unsigned int secs,
143262306a36Sopenharmony_ci			      struct cipher_speed_template *template,
143362306a36Sopenharmony_ci			      unsigned int tcount, u8 *keysize)
143462306a36Sopenharmony_ci{
143562306a36Sopenharmony_ci	return test_skcipher_speed(algo, enc, secs, template, tcount, keysize,
143662306a36Sopenharmony_ci				   false);
143762306a36Sopenharmony_ci}
143862306a36Sopenharmony_ci
143962306a36Sopenharmony_cistatic inline int tcrypt_test(const char *alg)
144062306a36Sopenharmony_ci{
144162306a36Sopenharmony_ci	int ret;
144262306a36Sopenharmony_ci
144362306a36Sopenharmony_ci	pr_debug("testing %s\n", alg);
144462306a36Sopenharmony_ci
144562306a36Sopenharmony_ci	ret = alg_test(alg, alg, 0, 0);
144662306a36Sopenharmony_ci	/* non-fips algs return -EINVAL or -ECANCELED in fips mode */
144762306a36Sopenharmony_ci	if (fips_enabled && (ret == -EINVAL || ret == -ECANCELED))
144862306a36Sopenharmony_ci		ret = 0;
144962306a36Sopenharmony_ci	return ret;
145062306a36Sopenharmony_ci}
145162306a36Sopenharmony_ci
145262306a36Sopenharmony_cistatic int do_test(const char *alg, u32 type, u32 mask, int m, u32 num_mb)
145362306a36Sopenharmony_ci{
145462306a36Sopenharmony_ci	int i;
145562306a36Sopenharmony_ci	int ret = 0;
145662306a36Sopenharmony_ci
145762306a36Sopenharmony_ci	switch (m) {
145862306a36Sopenharmony_ci	case 0:
145962306a36Sopenharmony_ci		if (alg) {
146062306a36Sopenharmony_ci			if (!crypto_has_alg(alg, type,
146162306a36Sopenharmony_ci					    mask ?: CRYPTO_ALG_TYPE_MASK))
146262306a36Sopenharmony_ci				ret = -ENOENT;
146362306a36Sopenharmony_ci			break;
146462306a36Sopenharmony_ci		}
146562306a36Sopenharmony_ci
146662306a36Sopenharmony_ci		for (i = 1; i < 200; i++)
146762306a36Sopenharmony_ci			ret = min(ret, do_test(NULL, 0, 0, i, num_mb));
146862306a36Sopenharmony_ci		break;
146962306a36Sopenharmony_ci
147062306a36Sopenharmony_ci	case 1:
147162306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("md5"));
147262306a36Sopenharmony_ci		break;
147362306a36Sopenharmony_ci
147462306a36Sopenharmony_ci	case 2:
147562306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("sha1"));
147662306a36Sopenharmony_ci		break;
147762306a36Sopenharmony_ci
147862306a36Sopenharmony_ci	case 3:
147962306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ecb(des)"));
148062306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("cbc(des)"));
148162306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ctr(des)"));
148262306a36Sopenharmony_ci		break;
148362306a36Sopenharmony_ci
148462306a36Sopenharmony_ci	case 4:
148562306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ecb(des3_ede)"));
148662306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("cbc(des3_ede)"));
148762306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ctr(des3_ede)"));
148862306a36Sopenharmony_ci		break;
148962306a36Sopenharmony_ci
149062306a36Sopenharmony_ci	case 5:
149162306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("md4"));
149262306a36Sopenharmony_ci		break;
149362306a36Sopenharmony_ci
149462306a36Sopenharmony_ci	case 6:
149562306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("sha256"));
149662306a36Sopenharmony_ci		break;
149762306a36Sopenharmony_ci
149862306a36Sopenharmony_ci	case 7:
149962306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ecb(blowfish)"));
150062306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("cbc(blowfish)"));
150162306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ctr(blowfish)"));
150262306a36Sopenharmony_ci		break;
150362306a36Sopenharmony_ci
150462306a36Sopenharmony_ci	case 8:
150562306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ecb(twofish)"));
150662306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("cbc(twofish)"));
150762306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ctr(twofish)"));
150862306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("lrw(twofish)"));
150962306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("xts(twofish)"));
151062306a36Sopenharmony_ci		break;
151162306a36Sopenharmony_ci
151262306a36Sopenharmony_ci	case 9:
151362306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ecb(serpent)"));
151462306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("cbc(serpent)"));
151562306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ctr(serpent)"));
151662306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("lrw(serpent)"));
151762306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("xts(serpent)"));
151862306a36Sopenharmony_ci		break;
151962306a36Sopenharmony_ci
152062306a36Sopenharmony_ci	case 10:
152162306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ecb(aes)"));
152262306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("cbc(aes)"));
152362306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("lrw(aes)"));
152462306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("xts(aes)"));
152562306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ctr(aes)"));
152662306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("rfc3686(ctr(aes))"));
152762306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ofb(aes)"));
152862306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("cfb(aes)"));
152962306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("xctr(aes)"));
153062306a36Sopenharmony_ci		break;
153162306a36Sopenharmony_ci
153262306a36Sopenharmony_ci	case 11:
153362306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("sha384"));
153462306a36Sopenharmony_ci		break;
153562306a36Sopenharmony_ci
153662306a36Sopenharmony_ci	case 12:
153762306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("sha512"));
153862306a36Sopenharmony_ci		break;
153962306a36Sopenharmony_ci
154062306a36Sopenharmony_ci	case 13:
154162306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("deflate"));
154262306a36Sopenharmony_ci		break;
154362306a36Sopenharmony_ci
154462306a36Sopenharmony_ci	case 14:
154562306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ecb(cast5)"));
154662306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("cbc(cast5)"));
154762306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ctr(cast5)"));
154862306a36Sopenharmony_ci		break;
154962306a36Sopenharmony_ci
155062306a36Sopenharmony_ci	case 15:
155162306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ecb(cast6)"));
155262306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("cbc(cast6)"));
155362306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ctr(cast6)"));
155462306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("lrw(cast6)"));
155562306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("xts(cast6)"));
155662306a36Sopenharmony_ci		break;
155762306a36Sopenharmony_ci
155862306a36Sopenharmony_ci	case 16:
155962306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ecb(arc4)"));
156062306a36Sopenharmony_ci		break;
156162306a36Sopenharmony_ci
156262306a36Sopenharmony_ci	case 17:
156362306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("michael_mic"));
156462306a36Sopenharmony_ci		break;
156562306a36Sopenharmony_ci
156662306a36Sopenharmony_ci	case 18:
156762306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("crc32c"));
156862306a36Sopenharmony_ci		break;
156962306a36Sopenharmony_ci
157062306a36Sopenharmony_ci	case 19:
157162306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ecb(tea)"));
157262306a36Sopenharmony_ci		break;
157362306a36Sopenharmony_ci
157462306a36Sopenharmony_ci	case 20:
157562306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ecb(xtea)"));
157662306a36Sopenharmony_ci		break;
157762306a36Sopenharmony_ci
157862306a36Sopenharmony_ci	case 21:
157962306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ecb(khazad)"));
158062306a36Sopenharmony_ci		break;
158162306a36Sopenharmony_ci
158262306a36Sopenharmony_ci	case 22:
158362306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("wp512"));
158462306a36Sopenharmony_ci		break;
158562306a36Sopenharmony_ci
158662306a36Sopenharmony_ci	case 23:
158762306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("wp384"));
158862306a36Sopenharmony_ci		break;
158962306a36Sopenharmony_ci
159062306a36Sopenharmony_ci	case 24:
159162306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("wp256"));
159262306a36Sopenharmony_ci		break;
159362306a36Sopenharmony_ci
159462306a36Sopenharmony_ci	case 26:
159562306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ecb(anubis)"));
159662306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("cbc(anubis)"));
159762306a36Sopenharmony_ci		break;
159862306a36Sopenharmony_ci
159962306a36Sopenharmony_ci	case 30:
160062306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ecb(xeta)"));
160162306a36Sopenharmony_ci		break;
160262306a36Sopenharmony_ci
160362306a36Sopenharmony_ci	case 31:
160462306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("pcbc(fcrypt)"));
160562306a36Sopenharmony_ci		break;
160662306a36Sopenharmony_ci
160762306a36Sopenharmony_ci	case 32:
160862306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ecb(camellia)"));
160962306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("cbc(camellia)"));
161062306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ctr(camellia)"));
161162306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("lrw(camellia)"));
161262306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("xts(camellia)"));
161362306a36Sopenharmony_ci		break;
161462306a36Sopenharmony_ci
161562306a36Sopenharmony_ci	case 33:
161662306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("sha224"));
161762306a36Sopenharmony_ci		break;
161862306a36Sopenharmony_ci
161962306a36Sopenharmony_ci	case 35:
162062306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("gcm(aes)"));
162162306a36Sopenharmony_ci		break;
162262306a36Sopenharmony_ci
162362306a36Sopenharmony_ci	case 36:
162462306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("lzo"));
162562306a36Sopenharmony_ci		break;
162662306a36Sopenharmony_ci
162762306a36Sopenharmony_ci	case 37:
162862306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ccm(aes)"));
162962306a36Sopenharmony_ci		break;
163062306a36Sopenharmony_ci
163162306a36Sopenharmony_ci	case 38:
163262306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("cts(cbc(aes))"));
163362306a36Sopenharmony_ci		break;
163462306a36Sopenharmony_ci
163562306a36Sopenharmony_ci        case 39:
163662306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("xxhash64"));
163762306a36Sopenharmony_ci		break;
163862306a36Sopenharmony_ci
163962306a36Sopenharmony_ci        case 40:
164062306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("rmd160"));
164162306a36Sopenharmony_ci		break;
164262306a36Sopenharmony_ci
164362306a36Sopenharmony_ci	case 42:
164462306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("blake2b-512"));
164562306a36Sopenharmony_ci		break;
164662306a36Sopenharmony_ci
164762306a36Sopenharmony_ci	case 43:
164862306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ecb(seed)"));
164962306a36Sopenharmony_ci		break;
165062306a36Sopenharmony_ci
165162306a36Sopenharmony_ci	case 45:
165262306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("rfc4309(ccm(aes))"));
165362306a36Sopenharmony_ci		break;
165462306a36Sopenharmony_ci
165562306a36Sopenharmony_ci	case 46:
165662306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ghash"));
165762306a36Sopenharmony_ci		break;
165862306a36Sopenharmony_ci
165962306a36Sopenharmony_ci	case 47:
166062306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("crct10dif"));
166162306a36Sopenharmony_ci		break;
166262306a36Sopenharmony_ci
166362306a36Sopenharmony_ci	case 48:
166462306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("sha3-224"));
166562306a36Sopenharmony_ci		break;
166662306a36Sopenharmony_ci
166762306a36Sopenharmony_ci	case 49:
166862306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("sha3-256"));
166962306a36Sopenharmony_ci		break;
167062306a36Sopenharmony_ci
167162306a36Sopenharmony_ci	case 50:
167262306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("sha3-384"));
167362306a36Sopenharmony_ci		break;
167462306a36Sopenharmony_ci
167562306a36Sopenharmony_ci	case 51:
167662306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("sha3-512"));
167762306a36Sopenharmony_ci		break;
167862306a36Sopenharmony_ci
167962306a36Sopenharmony_ci	case 52:
168062306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("sm3"));
168162306a36Sopenharmony_ci		break;
168262306a36Sopenharmony_ci
168362306a36Sopenharmony_ci	case 53:
168462306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("streebog256"));
168562306a36Sopenharmony_ci		break;
168662306a36Sopenharmony_ci
168762306a36Sopenharmony_ci	case 54:
168862306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("streebog512"));
168962306a36Sopenharmony_ci		break;
169062306a36Sopenharmony_ci
169162306a36Sopenharmony_ci	case 55:
169262306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("gcm(sm4)"));
169362306a36Sopenharmony_ci		break;
169462306a36Sopenharmony_ci
169562306a36Sopenharmony_ci	case 56:
169662306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ccm(sm4)"));
169762306a36Sopenharmony_ci		break;
169862306a36Sopenharmony_ci
169962306a36Sopenharmony_ci	case 57:
170062306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("polyval"));
170162306a36Sopenharmony_ci		break;
170262306a36Sopenharmony_ci
170362306a36Sopenharmony_ci	case 58:
170462306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("gcm(aria)"));
170562306a36Sopenharmony_ci		break;
170662306a36Sopenharmony_ci
170762306a36Sopenharmony_ci	case 59:
170862306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("cts(cbc(sm4))"));
170962306a36Sopenharmony_ci		break;
171062306a36Sopenharmony_ci
171162306a36Sopenharmony_ci	case 100:
171262306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("hmac(md5)"));
171362306a36Sopenharmony_ci		break;
171462306a36Sopenharmony_ci
171562306a36Sopenharmony_ci	case 101:
171662306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("hmac(sha1)"));
171762306a36Sopenharmony_ci		break;
171862306a36Sopenharmony_ci
171962306a36Sopenharmony_ci	case 102:
172062306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("hmac(sha256)"));
172162306a36Sopenharmony_ci		break;
172262306a36Sopenharmony_ci
172362306a36Sopenharmony_ci	case 103:
172462306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("hmac(sha384)"));
172562306a36Sopenharmony_ci		break;
172662306a36Sopenharmony_ci
172762306a36Sopenharmony_ci	case 104:
172862306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("hmac(sha512)"));
172962306a36Sopenharmony_ci		break;
173062306a36Sopenharmony_ci
173162306a36Sopenharmony_ci	case 105:
173262306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("hmac(sha224)"));
173362306a36Sopenharmony_ci		break;
173462306a36Sopenharmony_ci
173562306a36Sopenharmony_ci	case 106:
173662306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("xcbc(aes)"));
173762306a36Sopenharmony_ci		break;
173862306a36Sopenharmony_ci
173962306a36Sopenharmony_ci	case 108:
174062306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("hmac(rmd160)"));
174162306a36Sopenharmony_ci		break;
174262306a36Sopenharmony_ci
174362306a36Sopenharmony_ci	case 109:
174462306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("vmac64(aes)"));
174562306a36Sopenharmony_ci		break;
174662306a36Sopenharmony_ci
174762306a36Sopenharmony_ci	case 111:
174862306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("hmac(sha3-224)"));
174962306a36Sopenharmony_ci		break;
175062306a36Sopenharmony_ci
175162306a36Sopenharmony_ci	case 112:
175262306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("hmac(sha3-256)"));
175362306a36Sopenharmony_ci		break;
175462306a36Sopenharmony_ci
175562306a36Sopenharmony_ci	case 113:
175662306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("hmac(sha3-384)"));
175762306a36Sopenharmony_ci		break;
175862306a36Sopenharmony_ci
175962306a36Sopenharmony_ci	case 114:
176062306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("hmac(sha3-512)"));
176162306a36Sopenharmony_ci		break;
176262306a36Sopenharmony_ci
176362306a36Sopenharmony_ci	case 115:
176462306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("hmac(streebog256)"));
176562306a36Sopenharmony_ci		break;
176662306a36Sopenharmony_ci
176762306a36Sopenharmony_ci	case 116:
176862306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("hmac(streebog512)"));
176962306a36Sopenharmony_ci		break;
177062306a36Sopenharmony_ci
177162306a36Sopenharmony_ci	case 150:
177262306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ansi_cprng"));
177362306a36Sopenharmony_ci		break;
177462306a36Sopenharmony_ci
177562306a36Sopenharmony_ci	case 151:
177662306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("rfc4106(gcm(aes))"));
177762306a36Sopenharmony_ci		break;
177862306a36Sopenharmony_ci
177962306a36Sopenharmony_ci	case 152:
178062306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("rfc4543(gcm(aes))"));
178162306a36Sopenharmony_ci		break;
178262306a36Sopenharmony_ci
178362306a36Sopenharmony_ci	case 153:
178462306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("cmac(aes)"));
178562306a36Sopenharmony_ci		break;
178662306a36Sopenharmony_ci
178762306a36Sopenharmony_ci	case 154:
178862306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("cmac(des3_ede)"));
178962306a36Sopenharmony_ci		break;
179062306a36Sopenharmony_ci
179162306a36Sopenharmony_ci	case 155:
179262306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("authenc(hmac(sha1),cbc(aes))"));
179362306a36Sopenharmony_ci		break;
179462306a36Sopenharmony_ci
179562306a36Sopenharmony_ci	case 156:
179662306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("authenc(hmac(md5),ecb(cipher_null))"));
179762306a36Sopenharmony_ci		break;
179862306a36Sopenharmony_ci
179962306a36Sopenharmony_ci	case 157:
180062306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("authenc(hmac(sha1),ecb(cipher_null))"));
180162306a36Sopenharmony_ci		break;
180262306a36Sopenharmony_ci
180362306a36Sopenharmony_ci	case 158:
180462306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("cbcmac(sm4)"));
180562306a36Sopenharmony_ci		break;
180662306a36Sopenharmony_ci
180762306a36Sopenharmony_ci	case 159:
180862306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("cmac(sm4)"));
180962306a36Sopenharmony_ci		break;
181062306a36Sopenharmony_ci
181162306a36Sopenharmony_ci	case 160:
181262306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("xcbc(sm4)"));
181362306a36Sopenharmony_ci		break;
181462306a36Sopenharmony_ci
181562306a36Sopenharmony_ci	case 181:
181662306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("authenc(hmac(sha1),cbc(des))"));
181762306a36Sopenharmony_ci		break;
181862306a36Sopenharmony_ci	case 182:
181962306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("authenc(hmac(sha1),cbc(des3_ede))"));
182062306a36Sopenharmony_ci		break;
182162306a36Sopenharmony_ci	case 183:
182262306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("authenc(hmac(sha224),cbc(des))"));
182362306a36Sopenharmony_ci		break;
182462306a36Sopenharmony_ci	case 184:
182562306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("authenc(hmac(sha224),cbc(des3_ede))"));
182662306a36Sopenharmony_ci		break;
182762306a36Sopenharmony_ci	case 185:
182862306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("authenc(hmac(sha256),cbc(des))"));
182962306a36Sopenharmony_ci		break;
183062306a36Sopenharmony_ci	case 186:
183162306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("authenc(hmac(sha256),cbc(des3_ede))"));
183262306a36Sopenharmony_ci		break;
183362306a36Sopenharmony_ci	case 187:
183462306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("authenc(hmac(sha384),cbc(des))"));
183562306a36Sopenharmony_ci		break;
183662306a36Sopenharmony_ci	case 188:
183762306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("authenc(hmac(sha384),cbc(des3_ede))"));
183862306a36Sopenharmony_ci		break;
183962306a36Sopenharmony_ci	case 189:
184062306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("authenc(hmac(sha512),cbc(des))"));
184162306a36Sopenharmony_ci		break;
184262306a36Sopenharmony_ci	case 190:
184362306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("authenc(hmac(sha512),cbc(des3_ede))"));
184462306a36Sopenharmony_ci		break;
184562306a36Sopenharmony_ci	case 191:
184662306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ecb(sm4)"));
184762306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("cbc(sm4)"));
184862306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("cfb(sm4)"));
184962306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ctr(sm4)"));
185062306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("xts(sm4)"));
185162306a36Sopenharmony_ci		break;
185262306a36Sopenharmony_ci	case 192:
185362306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ecb(aria)"));
185462306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("cbc(aria)"));
185562306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("cfb(aria)"));
185662306a36Sopenharmony_ci		ret = min(ret, tcrypt_test("ctr(aria)"));
185762306a36Sopenharmony_ci		break;
185862306a36Sopenharmony_ci	case 200:
185962306a36Sopenharmony_ci		test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
186062306a36Sopenharmony_ci				speed_template_16_24_32);
186162306a36Sopenharmony_ci		test_cipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
186262306a36Sopenharmony_ci				speed_template_16_24_32);
186362306a36Sopenharmony_ci		test_cipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
186462306a36Sopenharmony_ci				speed_template_16_24_32);
186562306a36Sopenharmony_ci		test_cipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
186662306a36Sopenharmony_ci				speed_template_16_24_32);
186762306a36Sopenharmony_ci		test_cipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
186862306a36Sopenharmony_ci				speed_template_32_40_48);
186962306a36Sopenharmony_ci		test_cipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
187062306a36Sopenharmony_ci				speed_template_32_40_48);
187162306a36Sopenharmony_ci		test_cipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
187262306a36Sopenharmony_ci				speed_template_32_64);
187362306a36Sopenharmony_ci		test_cipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
187462306a36Sopenharmony_ci				speed_template_32_64);
187562306a36Sopenharmony_ci		test_cipher_speed("cts(cbc(aes))", ENCRYPT, sec, NULL, 0,
187662306a36Sopenharmony_ci				speed_template_16_24_32);
187762306a36Sopenharmony_ci		test_cipher_speed("cts(cbc(aes))", DECRYPT, sec, NULL, 0,
187862306a36Sopenharmony_ci				speed_template_16_24_32);
187962306a36Sopenharmony_ci		test_cipher_speed("ctr(aes)", ENCRYPT, sec, NULL, 0,
188062306a36Sopenharmony_ci				speed_template_16_24_32);
188162306a36Sopenharmony_ci		test_cipher_speed("ctr(aes)", DECRYPT, sec, NULL, 0,
188262306a36Sopenharmony_ci				speed_template_16_24_32);
188362306a36Sopenharmony_ci		test_cipher_speed("cfb(aes)", ENCRYPT, sec, NULL, 0,
188462306a36Sopenharmony_ci				speed_template_16_24_32);
188562306a36Sopenharmony_ci		test_cipher_speed("cfb(aes)", DECRYPT, sec, NULL, 0,
188662306a36Sopenharmony_ci				speed_template_16_24_32);
188762306a36Sopenharmony_ci		break;
188862306a36Sopenharmony_ci
188962306a36Sopenharmony_ci	case 201:
189062306a36Sopenharmony_ci		test_cipher_speed("ecb(des3_ede)", ENCRYPT, sec,
189162306a36Sopenharmony_ci				des3_speed_template, DES3_SPEED_VECTORS,
189262306a36Sopenharmony_ci				speed_template_24);
189362306a36Sopenharmony_ci		test_cipher_speed("ecb(des3_ede)", DECRYPT, sec,
189462306a36Sopenharmony_ci				des3_speed_template, DES3_SPEED_VECTORS,
189562306a36Sopenharmony_ci				speed_template_24);
189662306a36Sopenharmony_ci		test_cipher_speed("cbc(des3_ede)", ENCRYPT, sec,
189762306a36Sopenharmony_ci				des3_speed_template, DES3_SPEED_VECTORS,
189862306a36Sopenharmony_ci				speed_template_24);
189962306a36Sopenharmony_ci		test_cipher_speed("cbc(des3_ede)", DECRYPT, sec,
190062306a36Sopenharmony_ci				des3_speed_template, DES3_SPEED_VECTORS,
190162306a36Sopenharmony_ci				speed_template_24);
190262306a36Sopenharmony_ci		test_cipher_speed("ctr(des3_ede)", ENCRYPT, sec,
190362306a36Sopenharmony_ci				des3_speed_template, DES3_SPEED_VECTORS,
190462306a36Sopenharmony_ci				speed_template_24);
190562306a36Sopenharmony_ci		test_cipher_speed("ctr(des3_ede)", DECRYPT, sec,
190662306a36Sopenharmony_ci				des3_speed_template, DES3_SPEED_VECTORS,
190762306a36Sopenharmony_ci				speed_template_24);
190862306a36Sopenharmony_ci		break;
190962306a36Sopenharmony_ci
191062306a36Sopenharmony_ci	case 202:
191162306a36Sopenharmony_ci		test_cipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
191262306a36Sopenharmony_ci				speed_template_16_24_32);
191362306a36Sopenharmony_ci		test_cipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
191462306a36Sopenharmony_ci				speed_template_16_24_32);
191562306a36Sopenharmony_ci		test_cipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
191662306a36Sopenharmony_ci				speed_template_16_24_32);
191762306a36Sopenharmony_ci		test_cipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
191862306a36Sopenharmony_ci				speed_template_16_24_32);
191962306a36Sopenharmony_ci		test_cipher_speed("ctr(twofish)", ENCRYPT, sec, NULL, 0,
192062306a36Sopenharmony_ci				speed_template_16_24_32);
192162306a36Sopenharmony_ci		test_cipher_speed("ctr(twofish)", DECRYPT, sec, NULL, 0,
192262306a36Sopenharmony_ci				speed_template_16_24_32);
192362306a36Sopenharmony_ci		test_cipher_speed("lrw(twofish)", ENCRYPT, sec, NULL, 0,
192462306a36Sopenharmony_ci				speed_template_32_40_48);
192562306a36Sopenharmony_ci		test_cipher_speed("lrw(twofish)", DECRYPT, sec, NULL, 0,
192662306a36Sopenharmony_ci				speed_template_32_40_48);
192762306a36Sopenharmony_ci		test_cipher_speed("xts(twofish)", ENCRYPT, sec, NULL, 0,
192862306a36Sopenharmony_ci				speed_template_32_48_64);
192962306a36Sopenharmony_ci		test_cipher_speed("xts(twofish)", DECRYPT, sec, NULL, 0,
193062306a36Sopenharmony_ci				speed_template_32_48_64);
193162306a36Sopenharmony_ci		break;
193262306a36Sopenharmony_ci
193362306a36Sopenharmony_ci	case 203:
193462306a36Sopenharmony_ci		test_cipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
193562306a36Sopenharmony_ci				  speed_template_8_32);
193662306a36Sopenharmony_ci		test_cipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
193762306a36Sopenharmony_ci				  speed_template_8_32);
193862306a36Sopenharmony_ci		test_cipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
193962306a36Sopenharmony_ci				  speed_template_8_32);
194062306a36Sopenharmony_ci		test_cipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
194162306a36Sopenharmony_ci				  speed_template_8_32);
194262306a36Sopenharmony_ci		test_cipher_speed("ctr(blowfish)", ENCRYPT, sec, NULL, 0,
194362306a36Sopenharmony_ci				  speed_template_8_32);
194462306a36Sopenharmony_ci		test_cipher_speed("ctr(blowfish)", DECRYPT, sec, NULL, 0,
194562306a36Sopenharmony_ci				  speed_template_8_32);
194662306a36Sopenharmony_ci		break;
194762306a36Sopenharmony_ci
194862306a36Sopenharmony_ci	case 204:
194962306a36Sopenharmony_ci		test_cipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
195062306a36Sopenharmony_ci				  speed_template_8);
195162306a36Sopenharmony_ci		test_cipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
195262306a36Sopenharmony_ci				  speed_template_8);
195362306a36Sopenharmony_ci		test_cipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
195462306a36Sopenharmony_ci				  speed_template_8);
195562306a36Sopenharmony_ci		test_cipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
195662306a36Sopenharmony_ci				  speed_template_8);
195762306a36Sopenharmony_ci		break;
195862306a36Sopenharmony_ci
195962306a36Sopenharmony_ci	case 205:
196062306a36Sopenharmony_ci		test_cipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
196162306a36Sopenharmony_ci				speed_template_16_24_32);
196262306a36Sopenharmony_ci		test_cipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
196362306a36Sopenharmony_ci				speed_template_16_24_32);
196462306a36Sopenharmony_ci		test_cipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
196562306a36Sopenharmony_ci				speed_template_16_24_32);
196662306a36Sopenharmony_ci		test_cipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
196762306a36Sopenharmony_ci				speed_template_16_24_32);
196862306a36Sopenharmony_ci		test_cipher_speed("ctr(camellia)", ENCRYPT, sec, NULL, 0,
196962306a36Sopenharmony_ci				speed_template_16_24_32);
197062306a36Sopenharmony_ci		test_cipher_speed("ctr(camellia)", DECRYPT, sec, NULL, 0,
197162306a36Sopenharmony_ci				speed_template_16_24_32);
197262306a36Sopenharmony_ci		test_cipher_speed("lrw(camellia)", ENCRYPT, sec, NULL, 0,
197362306a36Sopenharmony_ci				speed_template_32_40_48);
197462306a36Sopenharmony_ci		test_cipher_speed("lrw(camellia)", DECRYPT, sec, NULL, 0,
197562306a36Sopenharmony_ci				speed_template_32_40_48);
197662306a36Sopenharmony_ci		test_cipher_speed("xts(camellia)", ENCRYPT, sec, NULL, 0,
197762306a36Sopenharmony_ci				speed_template_32_48_64);
197862306a36Sopenharmony_ci		test_cipher_speed("xts(camellia)", DECRYPT, sec, NULL, 0,
197962306a36Sopenharmony_ci				speed_template_32_48_64);
198062306a36Sopenharmony_ci		break;
198162306a36Sopenharmony_ci
198262306a36Sopenharmony_ci	case 207:
198362306a36Sopenharmony_ci		test_cipher_speed("ecb(serpent)", ENCRYPT, sec, NULL, 0,
198462306a36Sopenharmony_ci				  speed_template_16_32);
198562306a36Sopenharmony_ci		test_cipher_speed("ecb(serpent)", DECRYPT, sec, NULL, 0,
198662306a36Sopenharmony_ci				  speed_template_16_32);
198762306a36Sopenharmony_ci		test_cipher_speed("cbc(serpent)", ENCRYPT, sec, NULL, 0,
198862306a36Sopenharmony_ci				  speed_template_16_32);
198962306a36Sopenharmony_ci		test_cipher_speed("cbc(serpent)", DECRYPT, sec, NULL, 0,
199062306a36Sopenharmony_ci				  speed_template_16_32);
199162306a36Sopenharmony_ci		test_cipher_speed("ctr(serpent)", ENCRYPT, sec, NULL, 0,
199262306a36Sopenharmony_ci				  speed_template_16_32);
199362306a36Sopenharmony_ci		test_cipher_speed("ctr(serpent)", DECRYPT, sec, NULL, 0,
199462306a36Sopenharmony_ci				  speed_template_16_32);
199562306a36Sopenharmony_ci		test_cipher_speed("lrw(serpent)", ENCRYPT, sec, NULL, 0,
199662306a36Sopenharmony_ci				  speed_template_32_48);
199762306a36Sopenharmony_ci		test_cipher_speed("lrw(serpent)", DECRYPT, sec, NULL, 0,
199862306a36Sopenharmony_ci				  speed_template_32_48);
199962306a36Sopenharmony_ci		test_cipher_speed("xts(serpent)", ENCRYPT, sec, NULL, 0,
200062306a36Sopenharmony_ci				  speed_template_32_64);
200162306a36Sopenharmony_ci		test_cipher_speed("xts(serpent)", DECRYPT, sec, NULL, 0,
200262306a36Sopenharmony_ci				  speed_template_32_64);
200362306a36Sopenharmony_ci		break;
200462306a36Sopenharmony_ci
200562306a36Sopenharmony_ci	case 208:
200662306a36Sopenharmony_ci		test_cipher_speed("ecb(arc4)", ENCRYPT, sec, NULL, 0,
200762306a36Sopenharmony_ci				  speed_template_8);
200862306a36Sopenharmony_ci		break;
200962306a36Sopenharmony_ci
201062306a36Sopenharmony_ci	case 209:
201162306a36Sopenharmony_ci		test_cipher_speed("ecb(cast5)", ENCRYPT, sec, NULL, 0,
201262306a36Sopenharmony_ci				  speed_template_8_16);
201362306a36Sopenharmony_ci		test_cipher_speed("ecb(cast5)", DECRYPT, sec, NULL, 0,
201462306a36Sopenharmony_ci				  speed_template_8_16);
201562306a36Sopenharmony_ci		test_cipher_speed("cbc(cast5)", ENCRYPT, sec, NULL, 0,
201662306a36Sopenharmony_ci				  speed_template_8_16);
201762306a36Sopenharmony_ci		test_cipher_speed("cbc(cast5)", DECRYPT, sec, NULL, 0,
201862306a36Sopenharmony_ci				  speed_template_8_16);
201962306a36Sopenharmony_ci		test_cipher_speed("ctr(cast5)", ENCRYPT, sec, NULL, 0,
202062306a36Sopenharmony_ci				  speed_template_8_16);
202162306a36Sopenharmony_ci		test_cipher_speed("ctr(cast5)", DECRYPT, sec, NULL, 0,
202262306a36Sopenharmony_ci				  speed_template_8_16);
202362306a36Sopenharmony_ci		break;
202462306a36Sopenharmony_ci
202562306a36Sopenharmony_ci	case 210:
202662306a36Sopenharmony_ci		test_cipher_speed("ecb(cast6)", ENCRYPT, sec, NULL, 0,
202762306a36Sopenharmony_ci				  speed_template_16_32);
202862306a36Sopenharmony_ci		test_cipher_speed("ecb(cast6)", DECRYPT, sec, NULL, 0,
202962306a36Sopenharmony_ci				  speed_template_16_32);
203062306a36Sopenharmony_ci		test_cipher_speed("cbc(cast6)", ENCRYPT, sec, NULL, 0,
203162306a36Sopenharmony_ci				  speed_template_16_32);
203262306a36Sopenharmony_ci		test_cipher_speed("cbc(cast6)", DECRYPT, sec, NULL, 0,
203362306a36Sopenharmony_ci				  speed_template_16_32);
203462306a36Sopenharmony_ci		test_cipher_speed("ctr(cast6)", ENCRYPT, sec, NULL, 0,
203562306a36Sopenharmony_ci				  speed_template_16_32);
203662306a36Sopenharmony_ci		test_cipher_speed("ctr(cast6)", DECRYPT, sec, NULL, 0,
203762306a36Sopenharmony_ci				  speed_template_16_32);
203862306a36Sopenharmony_ci		test_cipher_speed("lrw(cast6)", ENCRYPT, sec, NULL, 0,
203962306a36Sopenharmony_ci				  speed_template_32_48);
204062306a36Sopenharmony_ci		test_cipher_speed("lrw(cast6)", DECRYPT, sec, NULL, 0,
204162306a36Sopenharmony_ci				  speed_template_32_48);
204262306a36Sopenharmony_ci		test_cipher_speed("xts(cast6)", ENCRYPT, sec, NULL, 0,
204362306a36Sopenharmony_ci				  speed_template_32_64);
204462306a36Sopenharmony_ci		test_cipher_speed("xts(cast6)", DECRYPT, sec, NULL, 0,
204562306a36Sopenharmony_ci				  speed_template_32_64);
204662306a36Sopenharmony_ci		break;
204762306a36Sopenharmony_ci
204862306a36Sopenharmony_ci	case 211:
204962306a36Sopenharmony_ci		test_aead_speed("rfc4106(gcm(aes))", ENCRYPT, sec,
205062306a36Sopenharmony_ci				NULL, 0, 16, 16, aead_speed_template_20_28_36);
205162306a36Sopenharmony_ci		test_aead_speed("gcm(aes)", ENCRYPT, sec,
205262306a36Sopenharmony_ci				NULL, 0, 16, 8, speed_template_16_24_32);
205362306a36Sopenharmony_ci		test_aead_speed("rfc4106(gcm(aes))", DECRYPT, sec,
205462306a36Sopenharmony_ci				NULL, 0, 16, 16, aead_speed_template_20_28_36);
205562306a36Sopenharmony_ci		test_aead_speed("gcm(aes)", DECRYPT, sec,
205662306a36Sopenharmony_ci				NULL, 0, 16, 8, speed_template_16_24_32);
205762306a36Sopenharmony_ci		break;
205862306a36Sopenharmony_ci
205962306a36Sopenharmony_ci	case 212:
206062306a36Sopenharmony_ci		test_aead_speed("rfc4309(ccm(aes))", ENCRYPT, sec,
206162306a36Sopenharmony_ci				NULL, 0, 16, 16, aead_speed_template_19);
206262306a36Sopenharmony_ci		test_aead_speed("rfc4309(ccm(aes))", DECRYPT, sec,
206362306a36Sopenharmony_ci				NULL, 0, 16, 16, aead_speed_template_19);
206462306a36Sopenharmony_ci		break;
206562306a36Sopenharmony_ci
206662306a36Sopenharmony_ci	case 213:
206762306a36Sopenharmony_ci		test_aead_speed("rfc7539esp(chacha20,poly1305)", ENCRYPT, sec,
206862306a36Sopenharmony_ci				NULL, 0, 16, 8, aead_speed_template_36);
206962306a36Sopenharmony_ci		test_aead_speed("rfc7539esp(chacha20,poly1305)", DECRYPT, sec,
207062306a36Sopenharmony_ci				NULL, 0, 16, 8, aead_speed_template_36);
207162306a36Sopenharmony_ci		break;
207262306a36Sopenharmony_ci
207362306a36Sopenharmony_ci	case 214:
207462306a36Sopenharmony_ci		test_cipher_speed("chacha20", ENCRYPT, sec, NULL, 0,
207562306a36Sopenharmony_ci				  speed_template_32);
207662306a36Sopenharmony_ci		break;
207762306a36Sopenharmony_ci
207862306a36Sopenharmony_ci	case 215:
207962306a36Sopenharmony_ci		test_mb_aead_speed("rfc4106(gcm(aes))", ENCRYPT, sec, NULL,
208062306a36Sopenharmony_ci				   0, 16, 16, aead_speed_template_20_28_36, num_mb);
208162306a36Sopenharmony_ci		test_mb_aead_speed("gcm(aes)", ENCRYPT, sec, NULL, 0, 16, 8,
208262306a36Sopenharmony_ci				   speed_template_16_24_32, num_mb);
208362306a36Sopenharmony_ci		test_mb_aead_speed("rfc4106(gcm(aes))", DECRYPT, sec, NULL,
208462306a36Sopenharmony_ci				   0, 16, 16, aead_speed_template_20_28_36, num_mb);
208562306a36Sopenharmony_ci		test_mb_aead_speed("gcm(aes)", DECRYPT, sec, NULL, 0, 16, 8,
208662306a36Sopenharmony_ci				   speed_template_16_24_32, num_mb);
208762306a36Sopenharmony_ci		break;
208862306a36Sopenharmony_ci
208962306a36Sopenharmony_ci	case 216:
209062306a36Sopenharmony_ci		test_mb_aead_speed("rfc4309(ccm(aes))", ENCRYPT, sec, NULL, 0,
209162306a36Sopenharmony_ci				   16, 16, aead_speed_template_19, num_mb);
209262306a36Sopenharmony_ci		test_mb_aead_speed("rfc4309(ccm(aes))", DECRYPT, sec, NULL, 0,
209362306a36Sopenharmony_ci				   16, 16, aead_speed_template_19, num_mb);
209462306a36Sopenharmony_ci		break;
209562306a36Sopenharmony_ci
209662306a36Sopenharmony_ci	case 217:
209762306a36Sopenharmony_ci		test_mb_aead_speed("rfc7539esp(chacha20,poly1305)", ENCRYPT,
209862306a36Sopenharmony_ci				   sec, NULL, 0, 16, 8, aead_speed_template_36,
209962306a36Sopenharmony_ci				   num_mb);
210062306a36Sopenharmony_ci		test_mb_aead_speed("rfc7539esp(chacha20,poly1305)", DECRYPT,
210162306a36Sopenharmony_ci				   sec, NULL, 0, 16, 8, aead_speed_template_36,
210262306a36Sopenharmony_ci				   num_mb);
210362306a36Sopenharmony_ci		break;
210462306a36Sopenharmony_ci
210562306a36Sopenharmony_ci	case 218:
210662306a36Sopenharmony_ci		test_cipher_speed("ecb(sm4)", ENCRYPT, sec, NULL, 0,
210762306a36Sopenharmony_ci				speed_template_16);
210862306a36Sopenharmony_ci		test_cipher_speed("ecb(sm4)", DECRYPT, sec, NULL, 0,
210962306a36Sopenharmony_ci				speed_template_16);
211062306a36Sopenharmony_ci		test_cipher_speed("cbc(sm4)", ENCRYPT, sec, NULL, 0,
211162306a36Sopenharmony_ci				speed_template_16);
211262306a36Sopenharmony_ci		test_cipher_speed("cbc(sm4)", DECRYPT, sec, NULL, 0,
211362306a36Sopenharmony_ci				speed_template_16);
211462306a36Sopenharmony_ci		test_cipher_speed("cts(cbc(sm4))", ENCRYPT, sec, NULL, 0,
211562306a36Sopenharmony_ci				speed_template_16);
211662306a36Sopenharmony_ci		test_cipher_speed("cts(cbc(sm4))", DECRYPT, sec, NULL, 0,
211762306a36Sopenharmony_ci				speed_template_16);
211862306a36Sopenharmony_ci		test_cipher_speed("cfb(sm4)", ENCRYPT, sec, NULL, 0,
211962306a36Sopenharmony_ci				speed_template_16);
212062306a36Sopenharmony_ci		test_cipher_speed("cfb(sm4)", DECRYPT, sec, NULL, 0,
212162306a36Sopenharmony_ci				speed_template_16);
212262306a36Sopenharmony_ci		test_cipher_speed("ctr(sm4)", ENCRYPT, sec, NULL, 0,
212362306a36Sopenharmony_ci				speed_template_16);
212462306a36Sopenharmony_ci		test_cipher_speed("ctr(sm4)", DECRYPT, sec, NULL, 0,
212562306a36Sopenharmony_ci				speed_template_16);
212662306a36Sopenharmony_ci		test_cipher_speed("xts(sm4)", ENCRYPT, sec, NULL, 0,
212762306a36Sopenharmony_ci				speed_template_32);
212862306a36Sopenharmony_ci		test_cipher_speed("xts(sm4)", DECRYPT, sec, NULL, 0,
212962306a36Sopenharmony_ci				speed_template_32);
213062306a36Sopenharmony_ci		break;
213162306a36Sopenharmony_ci
213262306a36Sopenharmony_ci	case 219:
213362306a36Sopenharmony_ci		test_cipher_speed("adiantum(xchacha12,aes)", ENCRYPT, sec, NULL,
213462306a36Sopenharmony_ci				  0, speed_template_32);
213562306a36Sopenharmony_ci		test_cipher_speed("adiantum(xchacha12,aes)", DECRYPT, sec, NULL,
213662306a36Sopenharmony_ci				  0, speed_template_32);
213762306a36Sopenharmony_ci		test_cipher_speed("adiantum(xchacha20,aes)", ENCRYPT, sec, NULL,
213862306a36Sopenharmony_ci				  0, speed_template_32);
213962306a36Sopenharmony_ci		test_cipher_speed("adiantum(xchacha20,aes)", DECRYPT, sec, NULL,
214062306a36Sopenharmony_ci				  0, speed_template_32);
214162306a36Sopenharmony_ci		break;
214262306a36Sopenharmony_ci
214362306a36Sopenharmony_ci	case 220:
214462306a36Sopenharmony_ci		test_acipher_speed("essiv(cbc(aes),sha256)",
214562306a36Sopenharmony_ci				  ENCRYPT, sec, NULL, 0,
214662306a36Sopenharmony_ci				  speed_template_16_24_32);
214762306a36Sopenharmony_ci		test_acipher_speed("essiv(cbc(aes),sha256)",
214862306a36Sopenharmony_ci				  DECRYPT, sec, NULL, 0,
214962306a36Sopenharmony_ci				  speed_template_16_24_32);
215062306a36Sopenharmony_ci		break;
215162306a36Sopenharmony_ci
215262306a36Sopenharmony_ci	case 221:
215362306a36Sopenharmony_ci		test_aead_speed("aegis128", ENCRYPT, sec,
215462306a36Sopenharmony_ci				NULL, 0, 16, 8, speed_template_16);
215562306a36Sopenharmony_ci		test_aead_speed("aegis128", DECRYPT, sec,
215662306a36Sopenharmony_ci				NULL, 0, 16, 8, speed_template_16);
215762306a36Sopenharmony_ci		break;
215862306a36Sopenharmony_ci
215962306a36Sopenharmony_ci	case 222:
216062306a36Sopenharmony_ci		test_aead_speed("gcm(sm4)", ENCRYPT, sec,
216162306a36Sopenharmony_ci				NULL, 0, 16, 8, speed_template_16);
216262306a36Sopenharmony_ci		test_aead_speed("gcm(sm4)", DECRYPT, sec,
216362306a36Sopenharmony_ci				NULL, 0, 16, 8, speed_template_16);
216462306a36Sopenharmony_ci		break;
216562306a36Sopenharmony_ci
216662306a36Sopenharmony_ci	case 223:
216762306a36Sopenharmony_ci		test_aead_speed("rfc4309(ccm(sm4))", ENCRYPT, sec,
216862306a36Sopenharmony_ci				NULL, 0, 16, 16, aead_speed_template_19);
216962306a36Sopenharmony_ci		test_aead_speed("rfc4309(ccm(sm4))", DECRYPT, sec,
217062306a36Sopenharmony_ci				NULL, 0, 16, 16, aead_speed_template_19);
217162306a36Sopenharmony_ci		break;
217262306a36Sopenharmony_ci
217362306a36Sopenharmony_ci	case 224:
217462306a36Sopenharmony_ci		test_mb_aead_speed("gcm(sm4)", ENCRYPT, sec, NULL, 0, 16, 8,
217562306a36Sopenharmony_ci				   speed_template_16, num_mb);
217662306a36Sopenharmony_ci		test_mb_aead_speed("gcm(sm4)", DECRYPT, sec, NULL, 0, 16, 8,
217762306a36Sopenharmony_ci				   speed_template_16, num_mb);
217862306a36Sopenharmony_ci		break;
217962306a36Sopenharmony_ci
218062306a36Sopenharmony_ci	case 225:
218162306a36Sopenharmony_ci		test_mb_aead_speed("rfc4309(ccm(sm4))", ENCRYPT, sec, NULL, 0,
218262306a36Sopenharmony_ci				   16, 16, aead_speed_template_19, num_mb);
218362306a36Sopenharmony_ci		test_mb_aead_speed("rfc4309(ccm(sm4))", DECRYPT, sec, NULL, 0,
218462306a36Sopenharmony_ci				   16, 16, aead_speed_template_19, num_mb);
218562306a36Sopenharmony_ci		break;
218662306a36Sopenharmony_ci
218762306a36Sopenharmony_ci	case 226:
218862306a36Sopenharmony_ci		test_cipher_speed("hctr2(aes)", ENCRYPT, sec, NULL,
218962306a36Sopenharmony_ci				  0, speed_template_32);
219062306a36Sopenharmony_ci		break;
219162306a36Sopenharmony_ci
219262306a36Sopenharmony_ci	case 227:
219362306a36Sopenharmony_ci		test_cipher_speed("ecb(aria)", ENCRYPT, sec, NULL, 0,
219462306a36Sopenharmony_ci				  speed_template_16_24_32);
219562306a36Sopenharmony_ci		test_cipher_speed("ecb(aria)", DECRYPT, sec, NULL, 0,
219662306a36Sopenharmony_ci				  speed_template_16_24_32);
219762306a36Sopenharmony_ci		test_cipher_speed("cbc(aria)", ENCRYPT, sec, NULL, 0,
219862306a36Sopenharmony_ci				  speed_template_16_24_32);
219962306a36Sopenharmony_ci		test_cipher_speed("cbc(aria)", DECRYPT, sec, NULL, 0,
220062306a36Sopenharmony_ci				  speed_template_16_24_32);
220162306a36Sopenharmony_ci		test_cipher_speed("cfb(aria)", ENCRYPT, sec, NULL, 0,
220262306a36Sopenharmony_ci				  speed_template_16_24_32);
220362306a36Sopenharmony_ci		test_cipher_speed("cfb(aria)", DECRYPT, sec, NULL, 0,
220462306a36Sopenharmony_ci				  speed_template_16_24_32);
220562306a36Sopenharmony_ci		test_cipher_speed("ctr(aria)", ENCRYPT, sec, NULL, 0,
220662306a36Sopenharmony_ci				  speed_template_16_24_32);
220762306a36Sopenharmony_ci		test_cipher_speed("ctr(aria)", DECRYPT, sec, NULL, 0,
220862306a36Sopenharmony_ci				  speed_template_16_24_32);
220962306a36Sopenharmony_ci		break;
221062306a36Sopenharmony_ci
221162306a36Sopenharmony_ci	case 228:
221262306a36Sopenharmony_ci		test_aead_speed("gcm(aria)", ENCRYPT, sec,
221362306a36Sopenharmony_ci				NULL, 0, 16, 8, speed_template_16_24_32);
221462306a36Sopenharmony_ci		test_aead_speed("gcm(aria)", DECRYPT, sec,
221562306a36Sopenharmony_ci				NULL, 0, 16, 8, speed_template_16_24_32);
221662306a36Sopenharmony_ci		break;
221762306a36Sopenharmony_ci
221862306a36Sopenharmony_ci	case 229:
221962306a36Sopenharmony_ci		test_mb_aead_speed("gcm(aria)", ENCRYPT, sec, NULL, 0, 16, 8,
222062306a36Sopenharmony_ci				   speed_template_16, num_mb);
222162306a36Sopenharmony_ci		test_mb_aead_speed("gcm(aria)", DECRYPT, sec, NULL, 0, 16, 8,
222262306a36Sopenharmony_ci				   speed_template_16, num_mb);
222362306a36Sopenharmony_ci		break;
222462306a36Sopenharmony_ci
222562306a36Sopenharmony_ci	case 300:
222662306a36Sopenharmony_ci		if (alg) {
222762306a36Sopenharmony_ci			test_hash_speed(alg, sec, generic_hash_speed_template);
222862306a36Sopenharmony_ci			break;
222962306a36Sopenharmony_ci		}
223062306a36Sopenharmony_ci		fallthrough;
223162306a36Sopenharmony_ci	case 301:
223262306a36Sopenharmony_ci		test_hash_speed("md4", sec, generic_hash_speed_template);
223362306a36Sopenharmony_ci		if (mode > 300 && mode < 400) break;
223462306a36Sopenharmony_ci		fallthrough;
223562306a36Sopenharmony_ci	case 302:
223662306a36Sopenharmony_ci		test_hash_speed("md5", sec, generic_hash_speed_template);
223762306a36Sopenharmony_ci		if (mode > 300 && mode < 400) break;
223862306a36Sopenharmony_ci		fallthrough;
223962306a36Sopenharmony_ci	case 303:
224062306a36Sopenharmony_ci		test_hash_speed("sha1", sec, generic_hash_speed_template);
224162306a36Sopenharmony_ci		if (mode > 300 && mode < 400) break;
224262306a36Sopenharmony_ci		fallthrough;
224362306a36Sopenharmony_ci	case 304:
224462306a36Sopenharmony_ci		test_hash_speed("sha256", sec, generic_hash_speed_template);
224562306a36Sopenharmony_ci		if (mode > 300 && mode < 400) break;
224662306a36Sopenharmony_ci		fallthrough;
224762306a36Sopenharmony_ci	case 305:
224862306a36Sopenharmony_ci		test_hash_speed("sha384", sec, generic_hash_speed_template);
224962306a36Sopenharmony_ci		if (mode > 300 && mode < 400) break;
225062306a36Sopenharmony_ci		fallthrough;
225162306a36Sopenharmony_ci	case 306:
225262306a36Sopenharmony_ci		test_hash_speed("sha512", sec, generic_hash_speed_template);
225362306a36Sopenharmony_ci		if (mode > 300 && mode < 400) break;
225462306a36Sopenharmony_ci		fallthrough;
225562306a36Sopenharmony_ci	case 307:
225662306a36Sopenharmony_ci		test_hash_speed("wp256", sec, generic_hash_speed_template);
225762306a36Sopenharmony_ci		if (mode > 300 && mode < 400) break;
225862306a36Sopenharmony_ci		fallthrough;
225962306a36Sopenharmony_ci	case 308:
226062306a36Sopenharmony_ci		test_hash_speed("wp384", sec, generic_hash_speed_template);
226162306a36Sopenharmony_ci		if (mode > 300 && mode < 400) break;
226262306a36Sopenharmony_ci		fallthrough;
226362306a36Sopenharmony_ci	case 309:
226462306a36Sopenharmony_ci		test_hash_speed("wp512", sec, generic_hash_speed_template);
226562306a36Sopenharmony_ci		if (mode > 300 && mode < 400) break;
226662306a36Sopenharmony_ci		fallthrough;
226762306a36Sopenharmony_ci	case 313:
226862306a36Sopenharmony_ci		test_hash_speed("sha224", sec, generic_hash_speed_template);
226962306a36Sopenharmony_ci		if (mode > 300 && mode < 400) break;
227062306a36Sopenharmony_ci		fallthrough;
227162306a36Sopenharmony_ci	case 314:
227262306a36Sopenharmony_ci		test_hash_speed("xxhash64", sec, generic_hash_speed_template);
227362306a36Sopenharmony_ci		if (mode > 300 && mode < 400) break;
227462306a36Sopenharmony_ci		fallthrough;
227562306a36Sopenharmony_ci	case 315:
227662306a36Sopenharmony_ci		test_hash_speed("rmd160", sec, generic_hash_speed_template);
227762306a36Sopenharmony_ci		if (mode > 300 && mode < 400) break;
227862306a36Sopenharmony_ci		fallthrough;
227962306a36Sopenharmony_ci	case 317:
228062306a36Sopenharmony_ci		test_hash_speed("blake2b-512", sec, generic_hash_speed_template);
228162306a36Sopenharmony_ci		if (mode > 300 && mode < 400) break;
228262306a36Sopenharmony_ci		fallthrough;
228362306a36Sopenharmony_ci	case 318:
228462306a36Sopenharmony_ci		klen = 16;
228562306a36Sopenharmony_ci		test_hash_speed("ghash", sec, generic_hash_speed_template);
228662306a36Sopenharmony_ci		if (mode > 300 && mode < 400) break;
228762306a36Sopenharmony_ci		fallthrough;
228862306a36Sopenharmony_ci	case 319:
228962306a36Sopenharmony_ci		test_hash_speed("crc32c", sec, generic_hash_speed_template);
229062306a36Sopenharmony_ci		if (mode > 300 && mode < 400) break;
229162306a36Sopenharmony_ci		fallthrough;
229262306a36Sopenharmony_ci	case 320:
229362306a36Sopenharmony_ci		test_hash_speed("crct10dif", sec, generic_hash_speed_template);
229462306a36Sopenharmony_ci		if (mode > 300 && mode < 400) break;
229562306a36Sopenharmony_ci		fallthrough;
229662306a36Sopenharmony_ci	case 321:
229762306a36Sopenharmony_ci		test_hash_speed("poly1305", sec, poly1305_speed_template);
229862306a36Sopenharmony_ci		if (mode > 300 && mode < 400) break;
229962306a36Sopenharmony_ci		fallthrough;
230062306a36Sopenharmony_ci	case 322:
230162306a36Sopenharmony_ci		test_hash_speed("sha3-224", sec, generic_hash_speed_template);
230262306a36Sopenharmony_ci		if (mode > 300 && mode < 400) break;
230362306a36Sopenharmony_ci		fallthrough;
230462306a36Sopenharmony_ci	case 323:
230562306a36Sopenharmony_ci		test_hash_speed("sha3-256", sec, generic_hash_speed_template);
230662306a36Sopenharmony_ci		if (mode > 300 && mode < 400) break;
230762306a36Sopenharmony_ci		fallthrough;
230862306a36Sopenharmony_ci	case 324:
230962306a36Sopenharmony_ci		test_hash_speed("sha3-384", sec, generic_hash_speed_template);
231062306a36Sopenharmony_ci		if (mode > 300 && mode < 400) break;
231162306a36Sopenharmony_ci		fallthrough;
231262306a36Sopenharmony_ci	case 325:
231362306a36Sopenharmony_ci		test_hash_speed("sha3-512", sec, generic_hash_speed_template);
231462306a36Sopenharmony_ci		if (mode > 300 && mode < 400) break;
231562306a36Sopenharmony_ci		fallthrough;
231662306a36Sopenharmony_ci	case 326:
231762306a36Sopenharmony_ci		test_hash_speed("sm3", sec, generic_hash_speed_template);
231862306a36Sopenharmony_ci		if (mode > 300 && mode < 400) break;
231962306a36Sopenharmony_ci		fallthrough;
232062306a36Sopenharmony_ci	case 327:
232162306a36Sopenharmony_ci		test_hash_speed("streebog256", sec,
232262306a36Sopenharmony_ci				generic_hash_speed_template);
232362306a36Sopenharmony_ci		if (mode > 300 && mode < 400) break;
232462306a36Sopenharmony_ci		fallthrough;
232562306a36Sopenharmony_ci	case 328:
232662306a36Sopenharmony_ci		test_hash_speed("streebog512", sec,
232762306a36Sopenharmony_ci				generic_hash_speed_template);
232862306a36Sopenharmony_ci		if (mode > 300 && mode < 400) break;
232962306a36Sopenharmony_ci		fallthrough;
233062306a36Sopenharmony_ci	case 399:
233162306a36Sopenharmony_ci		break;
233262306a36Sopenharmony_ci
233362306a36Sopenharmony_ci	case 400:
233462306a36Sopenharmony_ci		if (alg) {
233562306a36Sopenharmony_ci			test_ahash_speed(alg, sec, generic_hash_speed_template);
233662306a36Sopenharmony_ci			break;
233762306a36Sopenharmony_ci		}
233862306a36Sopenharmony_ci		fallthrough;
233962306a36Sopenharmony_ci	case 401:
234062306a36Sopenharmony_ci		test_ahash_speed("md4", sec, generic_hash_speed_template);
234162306a36Sopenharmony_ci		if (mode > 400 && mode < 500) break;
234262306a36Sopenharmony_ci		fallthrough;
234362306a36Sopenharmony_ci	case 402:
234462306a36Sopenharmony_ci		test_ahash_speed("md5", sec, generic_hash_speed_template);
234562306a36Sopenharmony_ci		if (mode > 400 && mode < 500) break;
234662306a36Sopenharmony_ci		fallthrough;
234762306a36Sopenharmony_ci	case 403:
234862306a36Sopenharmony_ci		test_ahash_speed("sha1", sec, generic_hash_speed_template);
234962306a36Sopenharmony_ci		if (mode > 400 && mode < 500) break;
235062306a36Sopenharmony_ci		fallthrough;
235162306a36Sopenharmony_ci	case 404:
235262306a36Sopenharmony_ci		test_ahash_speed("sha256", sec, generic_hash_speed_template);
235362306a36Sopenharmony_ci		if (mode > 400 && mode < 500) break;
235462306a36Sopenharmony_ci		fallthrough;
235562306a36Sopenharmony_ci	case 405:
235662306a36Sopenharmony_ci		test_ahash_speed("sha384", sec, generic_hash_speed_template);
235762306a36Sopenharmony_ci		if (mode > 400 && mode < 500) break;
235862306a36Sopenharmony_ci		fallthrough;
235962306a36Sopenharmony_ci	case 406:
236062306a36Sopenharmony_ci		test_ahash_speed("sha512", sec, generic_hash_speed_template);
236162306a36Sopenharmony_ci		if (mode > 400 && mode < 500) break;
236262306a36Sopenharmony_ci		fallthrough;
236362306a36Sopenharmony_ci	case 407:
236462306a36Sopenharmony_ci		test_ahash_speed("wp256", sec, generic_hash_speed_template);
236562306a36Sopenharmony_ci		if (mode > 400 && mode < 500) break;
236662306a36Sopenharmony_ci		fallthrough;
236762306a36Sopenharmony_ci	case 408:
236862306a36Sopenharmony_ci		test_ahash_speed("wp384", sec, generic_hash_speed_template);
236962306a36Sopenharmony_ci		if (mode > 400 && mode < 500) break;
237062306a36Sopenharmony_ci		fallthrough;
237162306a36Sopenharmony_ci	case 409:
237262306a36Sopenharmony_ci		test_ahash_speed("wp512", sec, generic_hash_speed_template);
237362306a36Sopenharmony_ci		if (mode > 400 && mode < 500) break;
237462306a36Sopenharmony_ci		fallthrough;
237562306a36Sopenharmony_ci	case 413:
237662306a36Sopenharmony_ci		test_ahash_speed("sha224", sec, generic_hash_speed_template);
237762306a36Sopenharmony_ci		if (mode > 400 && mode < 500) break;
237862306a36Sopenharmony_ci		fallthrough;
237962306a36Sopenharmony_ci	case 414:
238062306a36Sopenharmony_ci		test_ahash_speed("xxhash64", sec, generic_hash_speed_template);
238162306a36Sopenharmony_ci		if (mode > 400 && mode < 500) break;
238262306a36Sopenharmony_ci		fallthrough;
238362306a36Sopenharmony_ci	case 415:
238462306a36Sopenharmony_ci		test_ahash_speed("rmd160", sec, generic_hash_speed_template);
238562306a36Sopenharmony_ci		if (mode > 400 && mode < 500) break;
238662306a36Sopenharmony_ci		fallthrough;
238762306a36Sopenharmony_ci	case 417:
238862306a36Sopenharmony_ci		test_ahash_speed("blake2b-512", sec, generic_hash_speed_template);
238962306a36Sopenharmony_ci		if (mode > 400 && mode < 500) break;
239062306a36Sopenharmony_ci		fallthrough;
239162306a36Sopenharmony_ci	case 418:
239262306a36Sopenharmony_ci		test_ahash_speed("sha3-224", sec, generic_hash_speed_template);
239362306a36Sopenharmony_ci		if (mode > 400 && mode < 500) break;
239462306a36Sopenharmony_ci		fallthrough;
239562306a36Sopenharmony_ci	case 419:
239662306a36Sopenharmony_ci		test_ahash_speed("sha3-256", sec, generic_hash_speed_template);
239762306a36Sopenharmony_ci		if (mode > 400 && mode < 500) break;
239862306a36Sopenharmony_ci		fallthrough;
239962306a36Sopenharmony_ci	case 420:
240062306a36Sopenharmony_ci		test_ahash_speed("sha3-384", sec, generic_hash_speed_template);
240162306a36Sopenharmony_ci		if (mode > 400 && mode < 500) break;
240262306a36Sopenharmony_ci		fallthrough;
240362306a36Sopenharmony_ci	case 421:
240462306a36Sopenharmony_ci		test_ahash_speed("sha3-512", sec, generic_hash_speed_template);
240562306a36Sopenharmony_ci		if (mode > 400 && mode < 500) break;
240662306a36Sopenharmony_ci		fallthrough;
240762306a36Sopenharmony_ci	case 422:
240862306a36Sopenharmony_ci		test_ahash_speed("sm3", sec, generic_hash_speed_template);
240962306a36Sopenharmony_ci		if (mode > 400 && mode < 500) break;
241062306a36Sopenharmony_ci		fallthrough;
241162306a36Sopenharmony_ci	case 499:
241262306a36Sopenharmony_ci		break;
241362306a36Sopenharmony_ci
241462306a36Sopenharmony_ci	case 500:
241562306a36Sopenharmony_ci		test_acipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
241662306a36Sopenharmony_ci				   speed_template_16_24_32);
241762306a36Sopenharmony_ci		test_acipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
241862306a36Sopenharmony_ci				   speed_template_16_24_32);
241962306a36Sopenharmony_ci		test_acipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
242062306a36Sopenharmony_ci				   speed_template_16_24_32);
242162306a36Sopenharmony_ci		test_acipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
242262306a36Sopenharmony_ci				   speed_template_16_24_32);
242362306a36Sopenharmony_ci		test_acipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
242462306a36Sopenharmony_ci				   speed_template_32_40_48);
242562306a36Sopenharmony_ci		test_acipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
242662306a36Sopenharmony_ci				   speed_template_32_40_48);
242762306a36Sopenharmony_ci		test_acipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
242862306a36Sopenharmony_ci				   speed_template_32_64);
242962306a36Sopenharmony_ci		test_acipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
243062306a36Sopenharmony_ci				   speed_template_32_64);
243162306a36Sopenharmony_ci		test_acipher_speed("cts(cbc(aes))", ENCRYPT, sec, NULL, 0,
243262306a36Sopenharmony_ci				   speed_template_16_24_32);
243362306a36Sopenharmony_ci		test_acipher_speed("cts(cbc(aes))", DECRYPT, sec, NULL, 0,
243462306a36Sopenharmony_ci				   speed_template_16_24_32);
243562306a36Sopenharmony_ci		test_acipher_speed("ctr(aes)", ENCRYPT, sec, NULL, 0,
243662306a36Sopenharmony_ci				   speed_template_16_24_32);
243762306a36Sopenharmony_ci		test_acipher_speed("ctr(aes)", DECRYPT, sec, NULL, 0,
243862306a36Sopenharmony_ci				   speed_template_16_24_32);
243962306a36Sopenharmony_ci		test_acipher_speed("cfb(aes)", ENCRYPT, sec, NULL, 0,
244062306a36Sopenharmony_ci				   speed_template_16_24_32);
244162306a36Sopenharmony_ci		test_acipher_speed("cfb(aes)", DECRYPT, sec, NULL, 0,
244262306a36Sopenharmony_ci				   speed_template_16_24_32);
244362306a36Sopenharmony_ci		test_acipher_speed("ofb(aes)", ENCRYPT, sec, NULL, 0,
244462306a36Sopenharmony_ci				   speed_template_16_24_32);
244562306a36Sopenharmony_ci		test_acipher_speed("ofb(aes)", DECRYPT, sec, NULL, 0,
244662306a36Sopenharmony_ci				   speed_template_16_24_32);
244762306a36Sopenharmony_ci		test_acipher_speed("rfc3686(ctr(aes))", ENCRYPT, sec, NULL, 0,
244862306a36Sopenharmony_ci				   speed_template_20_28_36);
244962306a36Sopenharmony_ci		test_acipher_speed("rfc3686(ctr(aes))", DECRYPT, sec, NULL, 0,
245062306a36Sopenharmony_ci				   speed_template_20_28_36);
245162306a36Sopenharmony_ci		break;
245262306a36Sopenharmony_ci
245362306a36Sopenharmony_ci	case 501:
245462306a36Sopenharmony_ci		test_acipher_speed("ecb(des3_ede)", ENCRYPT, sec,
245562306a36Sopenharmony_ci				   des3_speed_template, DES3_SPEED_VECTORS,
245662306a36Sopenharmony_ci				   speed_template_24);
245762306a36Sopenharmony_ci		test_acipher_speed("ecb(des3_ede)", DECRYPT, sec,
245862306a36Sopenharmony_ci				   des3_speed_template, DES3_SPEED_VECTORS,
245962306a36Sopenharmony_ci				   speed_template_24);
246062306a36Sopenharmony_ci		test_acipher_speed("cbc(des3_ede)", ENCRYPT, sec,
246162306a36Sopenharmony_ci				   des3_speed_template, DES3_SPEED_VECTORS,
246262306a36Sopenharmony_ci				   speed_template_24);
246362306a36Sopenharmony_ci		test_acipher_speed("cbc(des3_ede)", DECRYPT, sec,
246462306a36Sopenharmony_ci				   des3_speed_template, DES3_SPEED_VECTORS,
246562306a36Sopenharmony_ci				   speed_template_24);
246662306a36Sopenharmony_ci		test_acipher_speed("cfb(des3_ede)", ENCRYPT, sec,
246762306a36Sopenharmony_ci				   des3_speed_template, DES3_SPEED_VECTORS,
246862306a36Sopenharmony_ci				   speed_template_24);
246962306a36Sopenharmony_ci		test_acipher_speed("cfb(des3_ede)", DECRYPT, sec,
247062306a36Sopenharmony_ci				   des3_speed_template, DES3_SPEED_VECTORS,
247162306a36Sopenharmony_ci				   speed_template_24);
247262306a36Sopenharmony_ci		test_acipher_speed("ofb(des3_ede)", ENCRYPT, sec,
247362306a36Sopenharmony_ci				   des3_speed_template, DES3_SPEED_VECTORS,
247462306a36Sopenharmony_ci				   speed_template_24);
247562306a36Sopenharmony_ci		test_acipher_speed("ofb(des3_ede)", DECRYPT, sec,
247662306a36Sopenharmony_ci				   des3_speed_template, DES3_SPEED_VECTORS,
247762306a36Sopenharmony_ci				   speed_template_24);
247862306a36Sopenharmony_ci		break;
247962306a36Sopenharmony_ci
248062306a36Sopenharmony_ci	case 502:
248162306a36Sopenharmony_ci		test_acipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
248262306a36Sopenharmony_ci				   speed_template_8);
248362306a36Sopenharmony_ci		test_acipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
248462306a36Sopenharmony_ci				   speed_template_8);
248562306a36Sopenharmony_ci		test_acipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
248662306a36Sopenharmony_ci				   speed_template_8);
248762306a36Sopenharmony_ci		test_acipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
248862306a36Sopenharmony_ci				   speed_template_8);
248962306a36Sopenharmony_ci		test_acipher_speed("cfb(des)", ENCRYPT, sec, NULL, 0,
249062306a36Sopenharmony_ci				   speed_template_8);
249162306a36Sopenharmony_ci		test_acipher_speed("cfb(des)", DECRYPT, sec, NULL, 0,
249262306a36Sopenharmony_ci				   speed_template_8);
249362306a36Sopenharmony_ci		test_acipher_speed("ofb(des)", ENCRYPT, sec, NULL, 0,
249462306a36Sopenharmony_ci				   speed_template_8);
249562306a36Sopenharmony_ci		test_acipher_speed("ofb(des)", DECRYPT, sec, NULL, 0,
249662306a36Sopenharmony_ci				   speed_template_8);
249762306a36Sopenharmony_ci		break;
249862306a36Sopenharmony_ci
249962306a36Sopenharmony_ci	case 503:
250062306a36Sopenharmony_ci		test_acipher_speed("ecb(serpent)", ENCRYPT, sec, NULL, 0,
250162306a36Sopenharmony_ci				   speed_template_16_32);
250262306a36Sopenharmony_ci		test_acipher_speed("ecb(serpent)", DECRYPT, sec, NULL, 0,
250362306a36Sopenharmony_ci				   speed_template_16_32);
250462306a36Sopenharmony_ci		test_acipher_speed("cbc(serpent)", ENCRYPT, sec, NULL, 0,
250562306a36Sopenharmony_ci				   speed_template_16_32);
250662306a36Sopenharmony_ci		test_acipher_speed("cbc(serpent)", DECRYPT, sec, NULL, 0,
250762306a36Sopenharmony_ci				   speed_template_16_32);
250862306a36Sopenharmony_ci		test_acipher_speed("ctr(serpent)", ENCRYPT, sec, NULL, 0,
250962306a36Sopenharmony_ci				   speed_template_16_32);
251062306a36Sopenharmony_ci		test_acipher_speed("ctr(serpent)", DECRYPT, sec, NULL, 0,
251162306a36Sopenharmony_ci				   speed_template_16_32);
251262306a36Sopenharmony_ci		test_acipher_speed("lrw(serpent)", ENCRYPT, sec, NULL, 0,
251362306a36Sopenharmony_ci				   speed_template_32_48);
251462306a36Sopenharmony_ci		test_acipher_speed("lrw(serpent)", DECRYPT, sec, NULL, 0,
251562306a36Sopenharmony_ci				   speed_template_32_48);
251662306a36Sopenharmony_ci		test_acipher_speed("xts(serpent)", ENCRYPT, sec, NULL, 0,
251762306a36Sopenharmony_ci				   speed_template_32_64);
251862306a36Sopenharmony_ci		test_acipher_speed("xts(serpent)", DECRYPT, sec, NULL, 0,
251962306a36Sopenharmony_ci				   speed_template_32_64);
252062306a36Sopenharmony_ci		break;
252162306a36Sopenharmony_ci
252262306a36Sopenharmony_ci	case 504:
252362306a36Sopenharmony_ci		test_acipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
252462306a36Sopenharmony_ci				   speed_template_16_24_32);
252562306a36Sopenharmony_ci		test_acipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
252662306a36Sopenharmony_ci				   speed_template_16_24_32);
252762306a36Sopenharmony_ci		test_acipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
252862306a36Sopenharmony_ci				   speed_template_16_24_32);
252962306a36Sopenharmony_ci		test_acipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
253062306a36Sopenharmony_ci				   speed_template_16_24_32);
253162306a36Sopenharmony_ci		test_acipher_speed("ctr(twofish)", ENCRYPT, sec, NULL, 0,
253262306a36Sopenharmony_ci				   speed_template_16_24_32);
253362306a36Sopenharmony_ci		test_acipher_speed("ctr(twofish)", DECRYPT, sec, NULL, 0,
253462306a36Sopenharmony_ci				   speed_template_16_24_32);
253562306a36Sopenharmony_ci		test_acipher_speed("lrw(twofish)", ENCRYPT, sec, NULL, 0,
253662306a36Sopenharmony_ci				   speed_template_32_40_48);
253762306a36Sopenharmony_ci		test_acipher_speed("lrw(twofish)", DECRYPT, sec, NULL, 0,
253862306a36Sopenharmony_ci				   speed_template_32_40_48);
253962306a36Sopenharmony_ci		test_acipher_speed("xts(twofish)", ENCRYPT, sec, NULL, 0,
254062306a36Sopenharmony_ci				   speed_template_32_48_64);
254162306a36Sopenharmony_ci		test_acipher_speed("xts(twofish)", DECRYPT, sec, NULL, 0,
254262306a36Sopenharmony_ci				   speed_template_32_48_64);
254362306a36Sopenharmony_ci		break;
254462306a36Sopenharmony_ci
254562306a36Sopenharmony_ci	case 505:
254662306a36Sopenharmony_ci		test_acipher_speed("ecb(arc4)", ENCRYPT, sec, NULL, 0,
254762306a36Sopenharmony_ci				   speed_template_8);
254862306a36Sopenharmony_ci		break;
254962306a36Sopenharmony_ci
255062306a36Sopenharmony_ci	case 506:
255162306a36Sopenharmony_ci		test_acipher_speed("ecb(cast5)", ENCRYPT, sec, NULL, 0,
255262306a36Sopenharmony_ci				   speed_template_8_16);
255362306a36Sopenharmony_ci		test_acipher_speed("ecb(cast5)", DECRYPT, sec, NULL, 0,
255462306a36Sopenharmony_ci				   speed_template_8_16);
255562306a36Sopenharmony_ci		test_acipher_speed("cbc(cast5)", ENCRYPT, sec, NULL, 0,
255662306a36Sopenharmony_ci				   speed_template_8_16);
255762306a36Sopenharmony_ci		test_acipher_speed("cbc(cast5)", DECRYPT, sec, NULL, 0,
255862306a36Sopenharmony_ci				   speed_template_8_16);
255962306a36Sopenharmony_ci		test_acipher_speed("ctr(cast5)", ENCRYPT, sec, NULL, 0,
256062306a36Sopenharmony_ci				   speed_template_8_16);
256162306a36Sopenharmony_ci		test_acipher_speed("ctr(cast5)", DECRYPT, sec, NULL, 0,
256262306a36Sopenharmony_ci				   speed_template_8_16);
256362306a36Sopenharmony_ci		break;
256462306a36Sopenharmony_ci
256562306a36Sopenharmony_ci	case 507:
256662306a36Sopenharmony_ci		test_acipher_speed("ecb(cast6)", ENCRYPT, sec, NULL, 0,
256762306a36Sopenharmony_ci				   speed_template_16_32);
256862306a36Sopenharmony_ci		test_acipher_speed("ecb(cast6)", DECRYPT, sec, NULL, 0,
256962306a36Sopenharmony_ci				   speed_template_16_32);
257062306a36Sopenharmony_ci		test_acipher_speed("cbc(cast6)", ENCRYPT, sec, NULL, 0,
257162306a36Sopenharmony_ci				   speed_template_16_32);
257262306a36Sopenharmony_ci		test_acipher_speed("cbc(cast6)", DECRYPT, sec, NULL, 0,
257362306a36Sopenharmony_ci				   speed_template_16_32);
257462306a36Sopenharmony_ci		test_acipher_speed("ctr(cast6)", ENCRYPT, sec, NULL, 0,
257562306a36Sopenharmony_ci				   speed_template_16_32);
257662306a36Sopenharmony_ci		test_acipher_speed("ctr(cast6)", DECRYPT, sec, NULL, 0,
257762306a36Sopenharmony_ci				   speed_template_16_32);
257862306a36Sopenharmony_ci		test_acipher_speed("lrw(cast6)", ENCRYPT, sec, NULL, 0,
257962306a36Sopenharmony_ci				   speed_template_32_48);
258062306a36Sopenharmony_ci		test_acipher_speed("lrw(cast6)", DECRYPT, sec, NULL, 0,
258162306a36Sopenharmony_ci				   speed_template_32_48);
258262306a36Sopenharmony_ci		test_acipher_speed("xts(cast6)", ENCRYPT, sec, NULL, 0,
258362306a36Sopenharmony_ci				   speed_template_32_64);
258462306a36Sopenharmony_ci		test_acipher_speed("xts(cast6)", DECRYPT, sec, NULL, 0,
258562306a36Sopenharmony_ci				   speed_template_32_64);
258662306a36Sopenharmony_ci		break;
258762306a36Sopenharmony_ci
258862306a36Sopenharmony_ci	case 508:
258962306a36Sopenharmony_ci		test_acipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
259062306a36Sopenharmony_ci				   speed_template_16_32);
259162306a36Sopenharmony_ci		test_acipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
259262306a36Sopenharmony_ci				   speed_template_16_32);
259362306a36Sopenharmony_ci		test_acipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
259462306a36Sopenharmony_ci				   speed_template_16_32);
259562306a36Sopenharmony_ci		test_acipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
259662306a36Sopenharmony_ci				   speed_template_16_32);
259762306a36Sopenharmony_ci		test_acipher_speed("ctr(camellia)", ENCRYPT, sec, NULL, 0,
259862306a36Sopenharmony_ci				   speed_template_16_32);
259962306a36Sopenharmony_ci		test_acipher_speed("ctr(camellia)", DECRYPT, sec, NULL, 0,
260062306a36Sopenharmony_ci				   speed_template_16_32);
260162306a36Sopenharmony_ci		test_acipher_speed("lrw(camellia)", ENCRYPT, sec, NULL, 0,
260262306a36Sopenharmony_ci				   speed_template_32_48);
260362306a36Sopenharmony_ci		test_acipher_speed("lrw(camellia)", DECRYPT, sec, NULL, 0,
260462306a36Sopenharmony_ci				   speed_template_32_48);
260562306a36Sopenharmony_ci		test_acipher_speed("xts(camellia)", ENCRYPT, sec, NULL, 0,
260662306a36Sopenharmony_ci				   speed_template_32_64);
260762306a36Sopenharmony_ci		test_acipher_speed("xts(camellia)", DECRYPT, sec, NULL, 0,
260862306a36Sopenharmony_ci				   speed_template_32_64);
260962306a36Sopenharmony_ci		break;
261062306a36Sopenharmony_ci
261162306a36Sopenharmony_ci	case 509:
261262306a36Sopenharmony_ci		test_acipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
261362306a36Sopenharmony_ci				   speed_template_8_32);
261462306a36Sopenharmony_ci		test_acipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
261562306a36Sopenharmony_ci				   speed_template_8_32);
261662306a36Sopenharmony_ci		test_acipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
261762306a36Sopenharmony_ci				   speed_template_8_32);
261862306a36Sopenharmony_ci		test_acipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
261962306a36Sopenharmony_ci				   speed_template_8_32);
262062306a36Sopenharmony_ci		test_acipher_speed("ctr(blowfish)", ENCRYPT, sec, NULL, 0,
262162306a36Sopenharmony_ci				   speed_template_8_32);
262262306a36Sopenharmony_ci		test_acipher_speed("ctr(blowfish)", DECRYPT, sec, NULL, 0,
262362306a36Sopenharmony_ci				   speed_template_8_32);
262462306a36Sopenharmony_ci		break;
262562306a36Sopenharmony_ci
262662306a36Sopenharmony_ci	case 518:
262762306a36Sopenharmony_ci		test_acipher_speed("ecb(sm4)", ENCRYPT, sec, NULL, 0,
262862306a36Sopenharmony_ci				speed_template_16);
262962306a36Sopenharmony_ci		test_acipher_speed("ecb(sm4)", DECRYPT, sec, NULL, 0,
263062306a36Sopenharmony_ci				speed_template_16);
263162306a36Sopenharmony_ci		test_acipher_speed("cbc(sm4)", ENCRYPT, sec, NULL, 0,
263262306a36Sopenharmony_ci				speed_template_16);
263362306a36Sopenharmony_ci		test_acipher_speed("cbc(sm4)", DECRYPT, sec, NULL, 0,
263462306a36Sopenharmony_ci				speed_template_16);
263562306a36Sopenharmony_ci		test_acipher_speed("cfb(sm4)", ENCRYPT, sec, NULL, 0,
263662306a36Sopenharmony_ci				speed_template_16);
263762306a36Sopenharmony_ci		test_acipher_speed("cfb(sm4)", DECRYPT, sec, NULL, 0,
263862306a36Sopenharmony_ci				speed_template_16);
263962306a36Sopenharmony_ci		test_acipher_speed("ctr(sm4)", ENCRYPT, sec, NULL, 0,
264062306a36Sopenharmony_ci				speed_template_16);
264162306a36Sopenharmony_ci		test_acipher_speed("ctr(sm4)", DECRYPT, sec, NULL, 0,
264262306a36Sopenharmony_ci				speed_template_16);
264362306a36Sopenharmony_ci		test_acipher_speed("xts(sm4)", ENCRYPT, sec, NULL, 0,
264462306a36Sopenharmony_ci				speed_template_32);
264562306a36Sopenharmony_ci		test_acipher_speed("xts(sm4)", DECRYPT, sec, NULL, 0,
264662306a36Sopenharmony_ci				speed_template_32);
264762306a36Sopenharmony_ci		break;
264862306a36Sopenharmony_ci
264962306a36Sopenharmony_ci	case 519:
265062306a36Sopenharmony_ci		test_acipher_speed("ecb(aria)", ENCRYPT, sec, NULL, 0,
265162306a36Sopenharmony_ci				   speed_template_16_24_32);
265262306a36Sopenharmony_ci		test_acipher_speed("ecb(aria)", DECRYPT, sec, NULL, 0,
265362306a36Sopenharmony_ci				   speed_template_16_24_32);
265462306a36Sopenharmony_ci		test_acipher_speed("ctr(aria)", ENCRYPT, sec, NULL, 0,
265562306a36Sopenharmony_ci				   speed_template_16_24_32);
265662306a36Sopenharmony_ci		test_acipher_speed("ctr(aria)", DECRYPT, sec, NULL, 0,
265762306a36Sopenharmony_ci				   speed_template_16_24_32);
265862306a36Sopenharmony_ci		break;
265962306a36Sopenharmony_ci
266062306a36Sopenharmony_ci	case 600:
266162306a36Sopenharmony_ci		test_mb_skcipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
266262306a36Sopenharmony_ci				       speed_template_16_24_32, num_mb);
266362306a36Sopenharmony_ci		test_mb_skcipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
266462306a36Sopenharmony_ci				       speed_template_16_24_32, num_mb);
266562306a36Sopenharmony_ci		test_mb_skcipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
266662306a36Sopenharmony_ci				       speed_template_16_24_32, num_mb);
266762306a36Sopenharmony_ci		test_mb_skcipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
266862306a36Sopenharmony_ci				       speed_template_16_24_32, num_mb);
266962306a36Sopenharmony_ci		test_mb_skcipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
267062306a36Sopenharmony_ci				       speed_template_32_40_48, num_mb);
267162306a36Sopenharmony_ci		test_mb_skcipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
267262306a36Sopenharmony_ci				       speed_template_32_40_48, num_mb);
267362306a36Sopenharmony_ci		test_mb_skcipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
267462306a36Sopenharmony_ci				       speed_template_32_64, num_mb);
267562306a36Sopenharmony_ci		test_mb_skcipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
267662306a36Sopenharmony_ci				       speed_template_32_64, num_mb);
267762306a36Sopenharmony_ci		test_mb_skcipher_speed("cts(cbc(aes))", ENCRYPT, sec, NULL, 0,
267862306a36Sopenharmony_ci				       speed_template_16_24_32, num_mb);
267962306a36Sopenharmony_ci		test_mb_skcipher_speed("cts(cbc(aes))", DECRYPT, sec, NULL, 0,
268062306a36Sopenharmony_ci				       speed_template_16_24_32, num_mb);
268162306a36Sopenharmony_ci		test_mb_skcipher_speed("ctr(aes)", ENCRYPT, sec, NULL, 0,
268262306a36Sopenharmony_ci				       speed_template_16_24_32, num_mb);
268362306a36Sopenharmony_ci		test_mb_skcipher_speed("ctr(aes)", DECRYPT, sec, NULL, 0,
268462306a36Sopenharmony_ci				       speed_template_16_24_32, num_mb);
268562306a36Sopenharmony_ci		test_mb_skcipher_speed("cfb(aes)", ENCRYPT, sec, NULL, 0,
268662306a36Sopenharmony_ci				       speed_template_16_24_32, num_mb);
268762306a36Sopenharmony_ci		test_mb_skcipher_speed("cfb(aes)", DECRYPT, sec, NULL, 0,
268862306a36Sopenharmony_ci				       speed_template_16_24_32, num_mb);
268962306a36Sopenharmony_ci		test_mb_skcipher_speed("ofb(aes)", ENCRYPT, sec, NULL, 0,
269062306a36Sopenharmony_ci				       speed_template_16_24_32, num_mb);
269162306a36Sopenharmony_ci		test_mb_skcipher_speed("ofb(aes)", DECRYPT, sec, NULL, 0,
269262306a36Sopenharmony_ci				       speed_template_16_24_32, num_mb);
269362306a36Sopenharmony_ci		test_mb_skcipher_speed("rfc3686(ctr(aes))", ENCRYPT, sec, NULL,
269462306a36Sopenharmony_ci				       0, speed_template_20_28_36, num_mb);
269562306a36Sopenharmony_ci		test_mb_skcipher_speed("rfc3686(ctr(aes))", DECRYPT, sec, NULL,
269662306a36Sopenharmony_ci				       0, speed_template_20_28_36, num_mb);
269762306a36Sopenharmony_ci		break;
269862306a36Sopenharmony_ci
269962306a36Sopenharmony_ci	case 601:
270062306a36Sopenharmony_ci		test_mb_skcipher_speed("ecb(des3_ede)", ENCRYPT, sec,
270162306a36Sopenharmony_ci				       des3_speed_template, DES3_SPEED_VECTORS,
270262306a36Sopenharmony_ci				       speed_template_24, num_mb);
270362306a36Sopenharmony_ci		test_mb_skcipher_speed("ecb(des3_ede)", DECRYPT, sec,
270462306a36Sopenharmony_ci				       des3_speed_template, DES3_SPEED_VECTORS,
270562306a36Sopenharmony_ci				       speed_template_24, num_mb);
270662306a36Sopenharmony_ci		test_mb_skcipher_speed("cbc(des3_ede)", ENCRYPT, sec,
270762306a36Sopenharmony_ci				       des3_speed_template, DES3_SPEED_VECTORS,
270862306a36Sopenharmony_ci				       speed_template_24, num_mb);
270962306a36Sopenharmony_ci		test_mb_skcipher_speed("cbc(des3_ede)", DECRYPT, sec,
271062306a36Sopenharmony_ci				       des3_speed_template, DES3_SPEED_VECTORS,
271162306a36Sopenharmony_ci				       speed_template_24, num_mb);
271262306a36Sopenharmony_ci		test_mb_skcipher_speed("cfb(des3_ede)", ENCRYPT, sec,
271362306a36Sopenharmony_ci				       des3_speed_template, DES3_SPEED_VECTORS,
271462306a36Sopenharmony_ci				       speed_template_24, num_mb);
271562306a36Sopenharmony_ci		test_mb_skcipher_speed("cfb(des3_ede)", DECRYPT, sec,
271662306a36Sopenharmony_ci				       des3_speed_template, DES3_SPEED_VECTORS,
271762306a36Sopenharmony_ci				       speed_template_24, num_mb);
271862306a36Sopenharmony_ci		test_mb_skcipher_speed("ofb(des3_ede)", ENCRYPT, sec,
271962306a36Sopenharmony_ci				       des3_speed_template, DES3_SPEED_VECTORS,
272062306a36Sopenharmony_ci				       speed_template_24, num_mb);
272162306a36Sopenharmony_ci		test_mb_skcipher_speed("ofb(des3_ede)", DECRYPT, sec,
272262306a36Sopenharmony_ci				       des3_speed_template, DES3_SPEED_VECTORS,
272362306a36Sopenharmony_ci				       speed_template_24, num_mb);
272462306a36Sopenharmony_ci		break;
272562306a36Sopenharmony_ci
272662306a36Sopenharmony_ci	case 602:
272762306a36Sopenharmony_ci		test_mb_skcipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
272862306a36Sopenharmony_ci				       speed_template_8, num_mb);
272962306a36Sopenharmony_ci		test_mb_skcipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
273062306a36Sopenharmony_ci				       speed_template_8, num_mb);
273162306a36Sopenharmony_ci		test_mb_skcipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
273262306a36Sopenharmony_ci				       speed_template_8, num_mb);
273362306a36Sopenharmony_ci		test_mb_skcipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
273462306a36Sopenharmony_ci				       speed_template_8, num_mb);
273562306a36Sopenharmony_ci		test_mb_skcipher_speed("cfb(des)", ENCRYPT, sec, NULL, 0,
273662306a36Sopenharmony_ci				       speed_template_8, num_mb);
273762306a36Sopenharmony_ci		test_mb_skcipher_speed("cfb(des)", DECRYPT, sec, NULL, 0,
273862306a36Sopenharmony_ci				       speed_template_8, num_mb);
273962306a36Sopenharmony_ci		test_mb_skcipher_speed("ofb(des)", ENCRYPT, sec, NULL, 0,
274062306a36Sopenharmony_ci				       speed_template_8, num_mb);
274162306a36Sopenharmony_ci		test_mb_skcipher_speed("ofb(des)", DECRYPT, sec, NULL, 0,
274262306a36Sopenharmony_ci				       speed_template_8, num_mb);
274362306a36Sopenharmony_ci		break;
274462306a36Sopenharmony_ci
274562306a36Sopenharmony_ci	case 603:
274662306a36Sopenharmony_ci		test_mb_skcipher_speed("ecb(serpent)", ENCRYPT, sec, NULL, 0,
274762306a36Sopenharmony_ci				       speed_template_16_32, num_mb);
274862306a36Sopenharmony_ci		test_mb_skcipher_speed("ecb(serpent)", DECRYPT, sec, NULL, 0,
274962306a36Sopenharmony_ci				       speed_template_16_32, num_mb);
275062306a36Sopenharmony_ci		test_mb_skcipher_speed("cbc(serpent)", ENCRYPT, sec, NULL, 0,
275162306a36Sopenharmony_ci				       speed_template_16_32, num_mb);
275262306a36Sopenharmony_ci		test_mb_skcipher_speed("cbc(serpent)", DECRYPT, sec, NULL, 0,
275362306a36Sopenharmony_ci				       speed_template_16_32, num_mb);
275462306a36Sopenharmony_ci		test_mb_skcipher_speed("ctr(serpent)", ENCRYPT, sec, NULL, 0,
275562306a36Sopenharmony_ci				       speed_template_16_32, num_mb);
275662306a36Sopenharmony_ci		test_mb_skcipher_speed("ctr(serpent)", DECRYPT, sec, NULL, 0,
275762306a36Sopenharmony_ci				       speed_template_16_32, num_mb);
275862306a36Sopenharmony_ci		test_mb_skcipher_speed("lrw(serpent)", ENCRYPT, sec, NULL, 0,
275962306a36Sopenharmony_ci				       speed_template_32_48, num_mb);
276062306a36Sopenharmony_ci		test_mb_skcipher_speed("lrw(serpent)", DECRYPT, sec, NULL, 0,
276162306a36Sopenharmony_ci				       speed_template_32_48, num_mb);
276262306a36Sopenharmony_ci		test_mb_skcipher_speed("xts(serpent)", ENCRYPT, sec, NULL, 0,
276362306a36Sopenharmony_ci				       speed_template_32_64, num_mb);
276462306a36Sopenharmony_ci		test_mb_skcipher_speed("xts(serpent)", DECRYPT, sec, NULL, 0,
276562306a36Sopenharmony_ci				       speed_template_32_64, num_mb);
276662306a36Sopenharmony_ci		break;
276762306a36Sopenharmony_ci
276862306a36Sopenharmony_ci	case 604:
276962306a36Sopenharmony_ci		test_mb_skcipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
277062306a36Sopenharmony_ci				       speed_template_16_24_32, num_mb);
277162306a36Sopenharmony_ci		test_mb_skcipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
277262306a36Sopenharmony_ci				       speed_template_16_24_32, num_mb);
277362306a36Sopenharmony_ci		test_mb_skcipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
277462306a36Sopenharmony_ci				       speed_template_16_24_32, num_mb);
277562306a36Sopenharmony_ci		test_mb_skcipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
277662306a36Sopenharmony_ci				       speed_template_16_24_32, num_mb);
277762306a36Sopenharmony_ci		test_mb_skcipher_speed("ctr(twofish)", ENCRYPT, sec, NULL, 0,
277862306a36Sopenharmony_ci				       speed_template_16_24_32, num_mb);
277962306a36Sopenharmony_ci		test_mb_skcipher_speed("ctr(twofish)", DECRYPT, sec, NULL, 0,
278062306a36Sopenharmony_ci				       speed_template_16_24_32, num_mb);
278162306a36Sopenharmony_ci		test_mb_skcipher_speed("lrw(twofish)", ENCRYPT, sec, NULL, 0,
278262306a36Sopenharmony_ci				       speed_template_32_40_48, num_mb);
278362306a36Sopenharmony_ci		test_mb_skcipher_speed("lrw(twofish)", DECRYPT, sec, NULL, 0,
278462306a36Sopenharmony_ci				       speed_template_32_40_48, num_mb);
278562306a36Sopenharmony_ci		test_mb_skcipher_speed("xts(twofish)", ENCRYPT, sec, NULL, 0,
278662306a36Sopenharmony_ci				       speed_template_32_48_64, num_mb);
278762306a36Sopenharmony_ci		test_mb_skcipher_speed("xts(twofish)", DECRYPT, sec, NULL, 0,
278862306a36Sopenharmony_ci				       speed_template_32_48_64, num_mb);
278962306a36Sopenharmony_ci		break;
279062306a36Sopenharmony_ci
279162306a36Sopenharmony_ci	case 605:
279262306a36Sopenharmony_ci		test_mb_skcipher_speed("ecb(arc4)", ENCRYPT, sec, NULL, 0,
279362306a36Sopenharmony_ci				       speed_template_8, num_mb);
279462306a36Sopenharmony_ci		break;
279562306a36Sopenharmony_ci
279662306a36Sopenharmony_ci	case 606:
279762306a36Sopenharmony_ci		test_mb_skcipher_speed("ecb(cast5)", ENCRYPT, sec, NULL, 0,
279862306a36Sopenharmony_ci				       speed_template_8_16, num_mb);
279962306a36Sopenharmony_ci		test_mb_skcipher_speed("ecb(cast5)", DECRYPT, sec, NULL, 0,
280062306a36Sopenharmony_ci				       speed_template_8_16, num_mb);
280162306a36Sopenharmony_ci		test_mb_skcipher_speed("cbc(cast5)", ENCRYPT, sec, NULL, 0,
280262306a36Sopenharmony_ci				       speed_template_8_16, num_mb);
280362306a36Sopenharmony_ci		test_mb_skcipher_speed("cbc(cast5)", DECRYPT, sec, NULL, 0,
280462306a36Sopenharmony_ci				       speed_template_8_16, num_mb);
280562306a36Sopenharmony_ci		test_mb_skcipher_speed("ctr(cast5)", ENCRYPT, sec, NULL, 0,
280662306a36Sopenharmony_ci				       speed_template_8_16, num_mb);
280762306a36Sopenharmony_ci		test_mb_skcipher_speed("ctr(cast5)", DECRYPT, sec, NULL, 0,
280862306a36Sopenharmony_ci				       speed_template_8_16, num_mb);
280962306a36Sopenharmony_ci		break;
281062306a36Sopenharmony_ci
281162306a36Sopenharmony_ci	case 607:
281262306a36Sopenharmony_ci		test_mb_skcipher_speed("ecb(cast6)", ENCRYPT, sec, NULL, 0,
281362306a36Sopenharmony_ci				       speed_template_16_32, num_mb);
281462306a36Sopenharmony_ci		test_mb_skcipher_speed("ecb(cast6)", DECRYPT, sec, NULL, 0,
281562306a36Sopenharmony_ci				       speed_template_16_32, num_mb);
281662306a36Sopenharmony_ci		test_mb_skcipher_speed("cbc(cast6)", ENCRYPT, sec, NULL, 0,
281762306a36Sopenharmony_ci				       speed_template_16_32, num_mb);
281862306a36Sopenharmony_ci		test_mb_skcipher_speed("cbc(cast6)", DECRYPT, sec, NULL, 0,
281962306a36Sopenharmony_ci				       speed_template_16_32, num_mb);
282062306a36Sopenharmony_ci		test_mb_skcipher_speed("ctr(cast6)", ENCRYPT, sec, NULL, 0,
282162306a36Sopenharmony_ci				       speed_template_16_32, num_mb);
282262306a36Sopenharmony_ci		test_mb_skcipher_speed("ctr(cast6)", DECRYPT, sec, NULL, 0,
282362306a36Sopenharmony_ci				       speed_template_16_32, num_mb);
282462306a36Sopenharmony_ci		test_mb_skcipher_speed("lrw(cast6)", ENCRYPT, sec, NULL, 0,
282562306a36Sopenharmony_ci				       speed_template_32_48, num_mb);
282662306a36Sopenharmony_ci		test_mb_skcipher_speed("lrw(cast6)", DECRYPT, sec, NULL, 0,
282762306a36Sopenharmony_ci				       speed_template_32_48, num_mb);
282862306a36Sopenharmony_ci		test_mb_skcipher_speed("xts(cast6)", ENCRYPT, sec, NULL, 0,
282962306a36Sopenharmony_ci				       speed_template_32_64, num_mb);
283062306a36Sopenharmony_ci		test_mb_skcipher_speed("xts(cast6)", DECRYPT, sec, NULL, 0,
283162306a36Sopenharmony_ci				       speed_template_32_64, num_mb);
283262306a36Sopenharmony_ci		break;
283362306a36Sopenharmony_ci
283462306a36Sopenharmony_ci	case 608:
283562306a36Sopenharmony_ci		test_mb_skcipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
283662306a36Sopenharmony_ci				       speed_template_16_32, num_mb);
283762306a36Sopenharmony_ci		test_mb_skcipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
283862306a36Sopenharmony_ci				       speed_template_16_32, num_mb);
283962306a36Sopenharmony_ci		test_mb_skcipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
284062306a36Sopenharmony_ci				       speed_template_16_32, num_mb);
284162306a36Sopenharmony_ci		test_mb_skcipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
284262306a36Sopenharmony_ci				       speed_template_16_32, num_mb);
284362306a36Sopenharmony_ci		test_mb_skcipher_speed("ctr(camellia)", ENCRYPT, sec, NULL, 0,
284462306a36Sopenharmony_ci				       speed_template_16_32, num_mb);
284562306a36Sopenharmony_ci		test_mb_skcipher_speed("ctr(camellia)", DECRYPT, sec, NULL, 0,
284662306a36Sopenharmony_ci				       speed_template_16_32, num_mb);
284762306a36Sopenharmony_ci		test_mb_skcipher_speed("lrw(camellia)", ENCRYPT, sec, NULL, 0,
284862306a36Sopenharmony_ci				       speed_template_32_48, num_mb);
284962306a36Sopenharmony_ci		test_mb_skcipher_speed("lrw(camellia)", DECRYPT, sec, NULL, 0,
285062306a36Sopenharmony_ci				       speed_template_32_48, num_mb);
285162306a36Sopenharmony_ci		test_mb_skcipher_speed("xts(camellia)", ENCRYPT, sec, NULL, 0,
285262306a36Sopenharmony_ci				       speed_template_32_64, num_mb);
285362306a36Sopenharmony_ci		test_mb_skcipher_speed("xts(camellia)", DECRYPT, sec, NULL, 0,
285462306a36Sopenharmony_ci				       speed_template_32_64, num_mb);
285562306a36Sopenharmony_ci		break;
285662306a36Sopenharmony_ci
285762306a36Sopenharmony_ci	case 609:
285862306a36Sopenharmony_ci		test_mb_skcipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
285962306a36Sopenharmony_ci				       speed_template_8_32, num_mb);
286062306a36Sopenharmony_ci		test_mb_skcipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
286162306a36Sopenharmony_ci				       speed_template_8_32, num_mb);
286262306a36Sopenharmony_ci		test_mb_skcipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
286362306a36Sopenharmony_ci				       speed_template_8_32, num_mb);
286462306a36Sopenharmony_ci		test_mb_skcipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
286562306a36Sopenharmony_ci				       speed_template_8_32, num_mb);
286662306a36Sopenharmony_ci		test_mb_skcipher_speed("ctr(blowfish)", ENCRYPT, sec, NULL, 0,
286762306a36Sopenharmony_ci				       speed_template_8_32, num_mb);
286862306a36Sopenharmony_ci		test_mb_skcipher_speed("ctr(blowfish)", DECRYPT, sec, NULL, 0,
286962306a36Sopenharmony_ci				       speed_template_8_32, num_mb);
287062306a36Sopenharmony_ci		break;
287162306a36Sopenharmony_ci
287262306a36Sopenharmony_ci	case 610:
287362306a36Sopenharmony_ci		test_mb_skcipher_speed("ecb(aria)", ENCRYPT, sec, NULL, 0,
287462306a36Sopenharmony_ci				       speed_template_16_32, num_mb);
287562306a36Sopenharmony_ci		test_mb_skcipher_speed("ecb(aria)", DECRYPT, sec, NULL, 0,
287662306a36Sopenharmony_ci				       speed_template_16_32, num_mb);
287762306a36Sopenharmony_ci		test_mb_skcipher_speed("ctr(aria)", ENCRYPT, sec, NULL, 0,
287862306a36Sopenharmony_ci				       speed_template_16_32, num_mb);
287962306a36Sopenharmony_ci		test_mb_skcipher_speed("ctr(aria)", DECRYPT, sec, NULL, 0,
288062306a36Sopenharmony_ci				       speed_template_16_32, num_mb);
288162306a36Sopenharmony_ci		break;
288262306a36Sopenharmony_ci
288362306a36Sopenharmony_ci	}
288462306a36Sopenharmony_ci
288562306a36Sopenharmony_ci	return ret;
288662306a36Sopenharmony_ci}
288762306a36Sopenharmony_ci
288862306a36Sopenharmony_cistatic int __init tcrypt_mod_init(void)
288962306a36Sopenharmony_ci{
289062306a36Sopenharmony_ci	int err = -ENOMEM;
289162306a36Sopenharmony_ci	int i;
289262306a36Sopenharmony_ci
289362306a36Sopenharmony_ci	for (i = 0; i < TVMEMSIZE; i++) {
289462306a36Sopenharmony_ci		tvmem[i] = (void *)__get_free_page(GFP_KERNEL);
289562306a36Sopenharmony_ci		if (!tvmem[i])
289662306a36Sopenharmony_ci			goto err_free_tv;
289762306a36Sopenharmony_ci	}
289862306a36Sopenharmony_ci
289962306a36Sopenharmony_ci	err = do_test(alg, type, mask, mode, num_mb);
290062306a36Sopenharmony_ci
290162306a36Sopenharmony_ci	if (err) {
290262306a36Sopenharmony_ci		pr_err("one or more tests failed!\n");
290362306a36Sopenharmony_ci		goto err_free_tv;
290462306a36Sopenharmony_ci	} else {
290562306a36Sopenharmony_ci		pr_debug("all tests passed\n");
290662306a36Sopenharmony_ci	}
290762306a36Sopenharmony_ci
290862306a36Sopenharmony_ci	/* We intentionaly return -EAGAIN to prevent keeping the module,
290962306a36Sopenharmony_ci	 * unless we're running in fips mode. It does all its work from
291062306a36Sopenharmony_ci	 * init() and doesn't offer any runtime functionality, but in
291162306a36Sopenharmony_ci	 * the fips case, checking for a successful load is helpful.
291262306a36Sopenharmony_ci	 * => we don't need it in the memory, do we?
291362306a36Sopenharmony_ci	 *                                        -- mludvig
291462306a36Sopenharmony_ci	 */
291562306a36Sopenharmony_ci	if (!fips_enabled)
291662306a36Sopenharmony_ci		err = -EAGAIN;
291762306a36Sopenharmony_ci
291862306a36Sopenharmony_cierr_free_tv:
291962306a36Sopenharmony_ci	for (i = 0; i < TVMEMSIZE && tvmem[i]; i++)
292062306a36Sopenharmony_ci		free_page((unsigned long)tvmem[i]);
292162306a36Sopenharmony_ci
292262306a36Sopenharmony_ci	return err;
292362306a36Sopenharmony_ci}
292462306a36Sopenharmony_ci
292562306a36Sopenharmony_ci/*
292662306a36Sopenharmony_ci * If an init function is provided, an exit function must also be provided
292762306a36Sopenharmony_ci * to allow module unload.
292862306a36Sopenharmony_ci */
292962306a36Sopenharmony_cistatic void __exit tcrypt_mod_fini(void) { }
293062306a36Sopenharmony_ci
293162306a36Sopenharmony_cilate_initcall(tcrypt_mod_init);
293262306a36Sopenharmony_cimodule_exit(tcrypt_mod_fini);
293362306a36Sopenharmony_ci
293462306a36Sopenharmony_cimodule_param(alg, charp, 0);
293562306a36Sopenharmony_cimodule_param(type, uint, 0);
293662306a36Sopenharmony_cimodule_param(mask, uint, 0);
293762306a36Sopenharmony_cimodule_param(mode, int, 0);
293862306a36Sopenharmony_cimodule_param(sec, uint, 0);
293962306a36Sopenharmony_ciMODULE_PARM_DESC(sec, "Length in seconds of speed tests "
294062306a36Sopenharmony_ci		      "(defaults to zero which uses CPU cycles instead)");
294162306a36Sopenharmony_cimodule_param(num_mb, uint, 0000);
294262306a36Sopenharmony_ciMODULE_PARM_DESC(num_mb, "Number of concurrent requests to be used in mb speed tests (defaults to 8)");
294362306a36Sopenharmony_cimodule_param(klen, uint, 0);
294462306a36Sopenharmony_ciMODULE_PARM_DESC(klen, "Key length (defaults to 0)");
294562306a36Sopenharmony_ci
294662306a36Sopenharmony_ciMODULE_LICENSE("GPL");
294762306a36Sopenharmony_ciMODULE_DESCRIPTION("Quick & dirty crypto testing module");
294862306a36Sopenharmony_ciMODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");
2949