blob: 65d191b27ecc61d9e14129567c0fc8a26955b452 [file] [log] [blame]
Herbert Xuef2736f2005-06-22 13:26:03 -07001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 * Quick & dirty crypto testing module.
3 *
4 * This will only exist until we have a better testing mechanism
5 * (e.g. a char device).
6 *
7 * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
8 * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
Mikko Herranene3a4ea42007-11-26 22:12:07 +08009 * Copyright (c) 2007 Nokia Siemens Networks
Linus Torvalds1da177e2005-04-16 15:20:36 -070010 *
Adrian Hoban69435b92010-11-04 15:02:04 -040011 * Updated RFC4106 AES-GCM testing.
12 * Authors: Aidan O'Mahony (aidan.o.mahony@intel.com)
13 * Adrian Hoban <adrian.hoban@intel.com>
14 * Gabriele Paoloni <gabriele.paoloni@intel.com>
15 * Tadeusz Struk (tadeusz.struk@intel.com)
16 * Copyright (c) 2010, Intel Corporation.
17 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070018 * This program is free software; you can redistribute it and/or modify it
19 * under the terms of the GNU General Public License as published by the Free
Herbert Xuef2736f2005-06-22 13:26:03 -070020 * Software Foundation; either version 2 of the License, or (at your option)
Linus Torvalds1da177e2005-04-16 15:20:36 -070021 * any later version.
22 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070023 */
24
Rabin Vincent76512f22017-01-18 14:54:05 +010025#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
26
Herbert Xu1ce5a042015-04-22 15:06:30 +080027#include <crypto/aead.h>
Herbert Xu18e33e62008-07-10 16:01:22 +080028#include <crypto/hash.h>
Herbert Xu7166e582016-06-29 18:03:50 +080029#include <crypto/skcipher.h>
Herbert Xucba83562006-08-13 08:26:09 +100030#include <linux/err.h>
Herbert Xudaf09442015-04-22 13:25:57 +080031#include <linux/fips.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070032#include <linux/init.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090033#include <linux/gfp.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070034#include <linux/module.h>
David Hardeman378f0582005-09-17 17:55:31 +100035#include <linux/scatterlist.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070036#include <linux/string.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070037#include <linux/moduleparam.h>
Harald Welteebfd9bc2005-06-22 13:27:23 -070038#include <linux/jiffies.h>
Herbert Xu6a179442005-06-22 13:29:03 -070039#include <linux/timex.h>
40#include <linux/interrupt.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070041#include "tcrypt.h"
42
43/*
Herbert Xuf139cfa2008-07-31 12:23:53 +080044 * Need slab memory for testing (size in number of pages).
Linus Torvalds1da177e2005-04-16 15:20:36 -070045 */
Herbert Xuf139cfa2008-07-31 12:23:53 +080046#define TVMEMSIZE 4
Linus Torvalds1da177e2005-04-16 15:20:36 -070047
48/*
Herbert Xuda7f0332008-07-31 17:08:25 +080049* Used by test_cipher_speed()
Linus Torvalds1da177e2005-04-16 15:20:36 -070050*/
51#define ENCRYPT 1
52#define DECRYPT 0
Linus Torvalds1da177e2005-04-16 15:20:36 -070053
Horia Geant?f074f7b2015-08-27 18:38:36 +030054#define MAX_DIGEST_SIZE 64
55
Harald Welteebfd9bc2005-06-22 13:27:23 -070056/*
Luca Clementi263a8df2014-06-25 22:57:42 -070057 * return a string with the driver name
58 */
59#define get_driver_name(tfm_type, tfm) crypto_tfm_alg_driver_name(tfm_type ## _tfm(tfm))
60
61/*
Harald Welteebfd9bc2005-06-22 13:27:23 -070062 * Used by test_cipher_speed()
63 */
Herbert Xu6a179442005-06-22 13:29:03 -070064static unsigned int sec;
Harald Welteebfd9bc2005-06-22 13:27:23 -070065
Steffen Klasserta873a5f2009-06-19 19:46:53 +080066static char *alg = NULL;
67static u32 type;
Herbert Xu7be380f2009-07-14 16:06:54 +080068static u32 mask;
Linus Torvalds1da177e2005-04-16 15:20:36 -070069static int mode;
Herbert Xuf139cfa2008-07-31 12:23:53 +080070static char *tvmem[TVMEMSIZE];
Linus Torvalds1da177e2005-04-16 15:20:36 -070071
72static char *check[] = {
Gilad Ben-Yossefb7e27532017-08-21 13:51:29 +030073 "des", "md5", "des3_ede", "rot13", "sha1", "sha224", "sha256", "sm3",
Jonathan Lynchcd12fb902007-11-10 20:08:25 +080074 "blowfish", "twofish", "serpent", "sha384", "sha512", "md4", "aes",
75 "cast6", "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
David Howells90831632006-12-16 12:13:14 +110076 "khazad", "wp512", "wp384", "wp256", "tnepres", "xeta", "fcrypt",
Adrian-Ken Rueegsegger2998db32008-05-09 21:29:35 +080077 "camellia", "seed", "salsa20", "rmd128", "rmd160", "rmd256", "rmd320",
raveendra padasalagi79cc6ab2016-06-17 10:30:36 +053078 "lzo", "cts", "zlib", "sha3-224", "sha3-256", "sha3-384", "sha3-512",
79 NULL
Linus Torvalds1da177e2005-04-16 15:20:36 -070080};
81
Vutla, Lokesh1425d2d2015-07-07 21:01:49 +053082struct tcrypt_result {
83 struct completion completion;
84 int err;
85};
86
87static void tcrypt_complete(struct crypto_async_request *req, int err)
88{
89 struct tcrypt_result *res = req->data;
90
91 if (err == -EINPROGRESS)
92 return;
93
94 res->err = err;
95 complete(&res->completion);
96}
97
Vutla, Lokesh1425d2d2015-07-07 21:01:49 +053098static inline int do_one_aead_op(struct aead_request *req, int ret)
99{
100 if (ret == -EINPROGRESS || ret == -EBUSY) {
101 struct tcrypt_result *tr = req->base.data;
102
103 ret = wait_for_completion_interruptible(&tr->completion);
104 if (!ret)
105 ret = tr->err;
106 reinit_completion(&tr->completion);
107 }
108
109 return ret;
110}
111
Tim Chen53f52d72013-12-11 14:28:47 -0800112static int test_aead_jiffies(struct aead_request *req, int enc,
Mark Rustad3e3dc252014-07-25 02:53:38 -0700113 int blen, int secs)
Tim Chen53f52d72013-12-11 14:28:47 -0800114{
115 unsigned long start, end;
116 int bcount;
117 int ret;
118
Mark Rustad3e3dc252014-07-25 02:53:38 -0700119 for (start = jiffies, end = start + secs * HZ, bcount = 0;
Tim Chen53f52d72013-12-11 14:28:47 -0800120 time_before(jiffies, end); bcount++) {
121 if (enc)
Vutla, Lokesh1425d2d2015-07-07 21:01:49 +0530122 ret = do_one_aead_op(req, crypto_aead_encrypt(req));
Tim Chen53f52d72013-12-11 14:28:47 -0800123 else
Vutla, Lokesh1425d2d2015-07-07 21:01:49 +0530124 ret = do_one_aead_op(req, crypto_aead_decrypt(req));
Tim Chen53f52d72013-12-11 14:28:47 -0800125
126 if (ret)
127 return ret;
128 }
129
130 printk("%d operations in %d seconds (%ld bytes)\n",
Mark Rustad3e3dc252014-07-25 02:53:38 -0700131 bcount, secs, (long)bcount * blen);
Tim Chen53f52d72013-12-11 14:28:47 -0800132 return 0;
133}
134
135static int test_aead_cycles(struct aead_request *req, int enc, int blen)
136{
137 unsigned long cycles = 0;
138 int ret = 0;
139 int i;
140
Tim Chen53f52d72013-12-11 14:28:47 -0800141 /* Warm-up run. */
142 for (i = 0; i < 4; i++) {
143 if (enc)
Vutla, Lokesh1425d2d2015-07-07 21:01:49 +0530144 ret = do_one_aead_op(req, crypto_aead_encrypt(req));
Tim Chen53f52d72013-12-11 14:28:47 -0800145 else
Vutla, Lokesh1425d2d2015-07-07 21:01:49 +0530146 ret = do_one_aead_op(req, crypto_aead_decrypt(req));
Tim Chen53f52d72013-12-11 14:28:47 -0800147
148 if (ret)
149 goto out;
150 }
151
152 /* The real thing. */
153 for (i = 0; i < 8; i++) {
154 cycles_t start, end;
155
156 start = get_cycles();
157 if (enc)
Vutla, Lokesh1425d2d2015-07-07 21:01:49 +0530158 ret = do_one_aead_op(req, crypto_aead_encrypt(req));
Tim Chen53f52d72013-12-11 14:28:47 -0800159 else
Vutla, Lokesh1425d2d2015-07-07 21:01:49 +0530160 ret = do_one_aead_op(req, crypto_aead_decrypt(req));
Tim Chen53f52d72013-12-11 14:28:47 -0800161 end = get_cycles();
162
163 if (ret)
164 goto out;
165
166 cycles += end - start;
167 }
168
169out:
Tim Chen53f52d72013-12-11 14:28:47 -0800170 if (ret == 0)
171 printk("1 operation in %lu cycles (%d bytes)\n",
172 (cycles + 4) / 8, blen);
173
174 return ret;
175}
176
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800177static u32 block_sizes[] = { 16, 64, 256, 1024, 8192, 0 };
Tim Chen53f52d72013-12-11 14:28:47 -0800178static u32 aead_sizes[] = { 16, 64, 256, 512, 1024, 2048, 4096, 8192, 0 };
179
180#define XBUFSIZE 8
181#define MAX_IVLEN 32
182
183static int testmgr_alloc_buf(char *buf[XBUFSIZE])
184{
185 int i;
186
187 for (i = 0; i < XBUFSIZE; i++) {
188 buf[i] = (void *)__get_free_page(GFP_KERNEL);
189 if (!buf[i])
190 goto err_free_buf;
191 }
192
193 return 0;
194
195err_free_buf:
196 while (i-- > 0)
197 free_page((unsigned long)buf[i]);
198
199 return -ENOMEM;
200}
201
202static void testmgr_free_buf(char *buf[XBUFSIZE])
203{
204 int i;
205
206 for (i = 0; i < XBUFSIZE; i++)
207 free_page((unsigned long)buf[i]);
208}
209
210static void sg_init_aead(struct scatterlist *sg, char *xbuf[XBUFSIZE],
211 unsigned int buflen)
212{
213 int np = (buflen + PAGE_SIZE - 1)/PAGE_SIZE;
214 int k, rem;
215
Tim Chen53f52d72013-12-11 14:28:47 -0800216 if (np > XBUFSIZE) {
217 rem = PAGE_SIZE;
218 np = XBUFSIZE;
Cristian Stoicac4768992015-01-27 11:54:27 +0200219 } else {
220 rem = buflen % PAGE_SIZE;
Tim Chen53f52d72013-12-11 14:28:47 -0800221 }
Cristian Stoicac4768992015-01-27 11:54:27 +0200222
Herbert Xu31267272015-06-17 14:05:26 +0800223 sg_init_table(sg, np + 1);
Cristian Stoicac4768992015-01-27 11:54:27 +0200224 np--;
225 for (k = 0; k < np; k++)
Herbert Xu31267272015-06-17 14:05:26 +0800226 sg_set_buf(&sg[k + 1], xbuf[k], PAGE_SIZE);
Cristian Stoicac4768992015-01-27 11:54:27 +0200227
Herbert Xu31267272015-06-17 14:05:26 +0800228 sg_set_buf(&sg[k + 1], xbuf[k], rem);
Tim Chen53f52d72013-12-11 14:28:47 -0800229}
230
Mark Rustad3e3dc252014-07-25 02:53:38 -0700231static void test_aead_speed(const char *algo, int enc, unsigned int secs,
Tim Chen53f52d72013-12-11 14:28:47 -0800232 struct aead_speed_template *template,
233 unsigned int tcount, u8 authsize,
234 unsigned int aad_size, u8 *keysize)
235{
236 unsigned int i, j;
237 struct crypto_aead *tfm;
238 int ret = -ENOMEM;
239 const char *key;
240 struct aead_request *req;
241 struct scatterlist *sg;
Tim Chen53f52d72013-12-11 14:28:47 -0800242 struct scatterlist *sgout;
243 const char *e;
244 void *assoc;
Cristian Stoica96692a732015-01-28 13:07:32 +0200245 char *iv;
Tim Chen53f52d72013-12-11 14:28:47 -0800246 char *xbuf[XBUFSIZE];
247 char *xoutbuf[XBUFSIZE];
248 char *axbuf[XBUFSIZE];
249 unsigned int *b_size;
250 unsigned int iv_len;
Vutla, Lokesh1425d2d2015-07-07 21:01:49 +0530251 struct tcrypt_result result;
Tim Chen53f52d72013-12-11 14:28:47 -0800252
Cristian Stoica96692a732015-01-28 13:07:32 +0200253 iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
254 if (!iv)
255 return;
256
Christian Engelmayerac5f8632014-04-21 20:45:59 +0200257 if (aad_size >= PAGE_SIZE) {
258 pr_err("associate data length (%u) too big\n", aad_size);
Cristian Stoica96692a732015-01-28 13:07:32 +0200259 goto out_noxbuf;
Christian Engelmayerac5f8632014-04-21 20:45:59 +0200260 }
261
Tim Chen53f52d72013-12-11 14:28:47 -0800262 if (enc == ENCRYPT)
263 e = "encryption";
264 else
265 e = "decryption";
266
267 if (testmgr_alloc_buf(xbuf))
268 goto out_noxbuf;
269 if (testmgr_alloc_buf(axbuf))
270 goto out_noaxbuf;
271 if (testmgr_alloc_buf(xoutbuf))
272 goto out_nooutbuf;
273
Herbert Xua3f21852015-05-27 16:03:51 +0800274 sg = kmalloc(sizeof(*sg) * 9 * 2, GFP_KERNEL);
Tim Chen53f52d72013-12-11 14:28:47 -0800275 if (!sg)
276 goto out_nosg;
Herbert Xua3f21852015-05-27 16:03:51 +0800277 sgout = &sg[9];
Tim Chen53f52d72013-12-11 14:28:47 -0800278
Herbert Xu5e4b8c12015-08-13 17:29:06 +0800279 tfm = crypto_alloc_aead(algo, 0, 0);
Tim Chen53f52d72013-12-11 14:28:47 -0800280
281 if (IS_ERR(tfm)) {
282 pr_err("alg: aead: Failed to load transform for %s: %ld\n", algo,
283 PTR_ERR(tfm));
Christian Engelmayera2ea6ed2014-04-21 20:46:40 +0200284 goto out_notfm;
Tim Chen53f52d72013-12-11 14:28:47 -0800285 }
286
Vutla, Lokesh1425d2d2015-07-07 21:01:49 +0530287 init_completion(&result.completion);
Luca Clementi263a8df2014-06-25 22:57:42 -0700288 printk(KERN_INFO "\ntesting speed of %s (%s) %s\n", algo,
289 get_driver_name(crypto_aead, tfm), e);
290
Tim Chen53f52d72013-12-11 14:28:47 -0800291 req = aead_request_alloc(tfm, GFP_KERNEL);
292 if (!req) {
293 pr_err("alg: aead: Failed to allocate request for %s\n",
294 algo);
Christian Engelmayer6af1f932014-04-21 20:47:05 +0200295 goto out_noreq;
Tim Chen53f52d72013-12-11 14:28:47 -0800296 }
297
Vutla, Lokesh1425d2d2015-07-07 21:01:49 +0530298 aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
299 tcrypt_complete, &result);
300
Tim Chen53f52d72013-12-11 14:28:47 -0800301 i = 0;
302 do {
303 b_size = aead_sizes;
304 do {
305 assoc = axbuf[0];
Christian Engelmayerac5f8632014-04-21 20:45:59 +0200306 memset(assoc, 0xff, aad_size);
Tim Chen53f52d72013-12-11 14:28:47 -0800307
308 if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
309 pr_err("template (%u) too big for tvmem (%lu)\n",
310 *keysize + *b_size,
311 TVMEMSIZE * PAGE_SIZE);
312 goto out;
313 }
314
315 key = tvmem[0];
316 for (j = 0; j < tcount; j++) {
317 if (template[j].klen == *keysize) {
318 key = template[j].key;
319 break;
320 }
321 }
322 ret = crypto_aead_setkey(tfm, key, *keysize);
323 ret = crypto_aead_setauthsize(tfm, authsize);
324
325 iv_len = crypto_aead_ivsize(tfm);
326 if (iv_len)
Cristian Stoica96692a732015-01-28 13:07:32 +0200327 memset(iv, 0xff, iv_len);
Tim Chen53f52d72013-12-11 14:28:47 -0800328
329 crypto_aead_clear_flags(tfm, ~0);
330 printk(KERN_INFO "test %u (%d bit key, %d byte blocks): ",
331 i, *keysize * 8, *b_size);
332
333
334 memset(tvmem[0], 0xff, PAGE_SIZE);
335
336 if (ret) {
337 pr_err("setkey() failed flags=%x\n",
338 crypto_aead_get_flags(tfm));
339 goto out;
340 }
341
Herbert Xu31267272015-06-17 14:05:26 +0800342 sg_init_aead(sg, xbuf,
Robert Baronescu7aacbfc2017-10-10 13:22:00 +0300343 *b_size + (enc ? 0 : authsize));
Tim Chen53f52d72013-12-11 14:28:47 -0800344
Herbert Xu31267272015-06-17 14:05:26 +0800345 sg_init_aead(sgout, xoutbuf,
Tim Chen53f52d72013-12-11 14:28:47 -0800346 *b_size + (enc ? authsize : 0));
347
Herbert Xu31267272015-06-17 14:05:26 +0800348 sg_set_buf(&sg[0], assoc, aad_size);
349 sg_set_buf(&sgout[0], assoc, aad_size);
350
Robert Baronescu7aacbfc2017-10-10 13:22:00 +0300351 aead_request_set_crypt(req, sg, sgout,
352 *b_size + (enc ? 0 : authsize),
353 iv);
Herbert Xua3f21852015-05-27 16:03:51 +0800354 aead_request_set_ad(req, aad_size);
Tim Chen53f52d72013-12-11 14:28:47 -0800355
Mark Rustad3e3dc252014-07-25 02:53:38 -0700356 if (secs)
357 ret = test_aead_jiffies(req, enc, *b_size,
358 secs);
Tim Chen53f52d72013-12-11 14:28:47 -0800359 else
360 ret = test_aead_cycles(req, enc, *b_size);
361
362 if (ret) {
363 pr_err("%s() failed return code=%d\n", e, ret);
364 break;
365 }
366 b_size++;
367 i++;
368 } while (*b_size);
369 keysize++;
370 } while (*keysize);
371
372out:
Christian Engelmayer6af1f932014-04-21 20:47:05 +0200373 aead_request_free(req);
374out_noreq:
Tim Chen53f52d72013-12-11 14:28:47 -0800375 crypto_free_aead(tfm);
Christian Engelmayera2ea6ed2014-04-21 20:46:40 +0200376out_notfm:
Tim Chen53f52d72013-12-11 14:28:47 -0800377 kfree(sg);
378out_nosg:
379 testmgr_free_buf(xoutbuf);
380out_nooutbuf:
381 testmgr_free_buf(axbuf);
382out_noaxbuf:
383 testmgr_free_buf(xbuf);
384out_noxbuf:
Cristian Stoica96692a732015-01-28 13:07:32 +0200385 kfree(iv);
Tim Chen53f52d72013-12-11 14:28:47 -0800386}
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800387
David S. Millerbeb63da2010-05-19 14:11:21 +1000388static void test_hash_sg_init(struct scatterlist *sg)
389{
390 int i;
391
392 sg_init_table(sg, TVMEMSIZE);
393 for (i = 0; i < TVMEMSIZE; i++) {
394 sg_set_buf(sg + i, tvmem[i], PAGE_SIZE);
395 memset(tvmem[i], 0xff, PAGE_SIZE);
396 }
397}
398
David S. Millerbeb63da2010-05-19 14:11:21 +1000399static inline int do_one_ahash_op(struct ahash_request *req, int ret)
400{
401 if (ret == -EINPROGRESS || ret == -EBUSY) {
402 struct tcrypt_result *tr = req->base.data;
403
Rabin Vincent8a45ac12015-01-09 16:25:28 +0100404 wait_for_completion(&tr->completion);
Wolfram Sang16735d02013-11-14 14:32:02 -0800405 reinit_completion(&tr->completion);
Rabin Vincent8a45ac12015-01-09 16:25:28 +0100406 ret = tr->err;
David S. Millerbeb63da2010-05-19 14:11:21 +1000407 }
408 return ret;
409}
410
Herbert Xu72259de2016-06-28 20:33:52 +0800411struct test_mb_ahash_data {
412 struct scatterlist sg[TVMEMSIZE];
413 char result[64];
414 struct ahash_request *req;
415 struct tcrypt_result tresult;
416 char *xbuf[XBUFSIZE];
417};
Megha Dey087bcd22016-06-23 18:40:47 -0700418
419static void test_mb_ahash_speed(const char *algo, unsigned int sec,
Herbert Xu72259de2016-06-28 20:33:52 +0800420 struct hash_speed *speed)
Megha Dey087bcd22016-06-23 18:40:47 -0700421{
Herbert Xu72259de2016-06-28 20:33:52 +0800422 struct test_mb_ahash_data *data;
Megha Dey087bcd22016-06-23 18:40:47 -0700423 struct crypto_ahash *tfm;
Herbert Xu72259de2016-06-28 20:33:52 +0800424 unsigned long start, end;
Herbert Xuf8de55b2016-06-28 16:41:38 +0800425 unsigned long cycles;
Herbert Xu72259de2016-06-28 20:33:52 +0800426 unsigned int i, j, k;
427 int ret;
428
429 data = kzalloc(sizeof(*data) * 8, GFP_KERNEL);
430 if (!data)
431 return;
Megha Dey087bcd22016-06-23 18:40:47 -0700432
433 tfm = crypto_alloc_ahash(algo, 0, 0);
434 if (IS_ERR(tfm)) {
435 pr_err("failed to load transform for %s: %ld\n",
436 algo, PTR_ERR(tfm));
Herbert Xu72259de2016-06-28 20:33:52 +0800437 goto free_data;
Megha Dey087bcd22016-06-23 18:40:47 -0700438 }
Herbert Xu72259de2016-06-28 20:33:52 +0800439
Megha Dey087bcd22016-06-23 18:40:47 -0700440 for (i = 0; i < 8; ++i) {
Herbert Xu72259de2016-06-28 20:33:52 +0800441 if (testmgr_alloc_buf(data[i].xbuf))
442 goto out;
Megha Dey087bcd22016-06-23 18:40:47 -0700443
Herbert Xu72259de2016-06-28 20:33:52 +0800444 init_completion(&data[i].tresult.completion);
Megha Dey087bcd22016-06-23 18:40:47 -0700445
Herbert Xu72259de2016-06-28 20:33:52 +0800446 data[i].req = ahash_request_alloc(tfm, GFP_KERNEL);
447 if (!data[i].req) {
Krzysztof Kozlowskif83f5b12016-06-28 09:23:06 +0200448 pr_err("alg: hash: Failed to allocate request for %s\n",
449 algo);
Herbert Xu72259de2016-06-28 20:33:52 +0800450 goto out;
Megha Dey087bcd22016-06-23 18:40:47 -0700451 }
Megha Dey087bcd22016-06-23 18:40:47 -0700452
Herbert Xu72259de2016-06-28 20:33:52 +0800453 ahash_request_set_callback(data[i].req, 0,
454 tcrypt_complete, &data[i].tresult);
455 test_hash_sg_init(data[i].sg);
Megha Dey087bcd22016-06-23 18:40:47 -0700456 }
457
Herbert Xu72259de2016-06-28 20:33:52 +0800458 pr_info("\ntesting speed of multibuffer %s (%s)\n", algo,
459 get_driver_name(crypto_ahash, tfm));
Megha Dey087bcd22016-06-23 18:40:47 -0700460
461 for (i = 0; speed[i].blen != 0; i++) {
Herbert Xu72259de2016-06-28 20:33:52 +0800462 /* For some reason this only tests digests. */
463 if (speed[i].blen != speed[i].plen)
464 continue;
465
Megha Dey087bcd22016-06-23 18:40:47 -0700466 if (speed[i].blen > TVMEMSIZE * PAGE_SIZE) {
Krzysztof Kozlowskif83f5b12016-06-28 09:23:06 +0200467 pr_err("template (%u) too big for tvmem (%lu)\n",
468 speed[i].blen, TVMEMSIZE * PAGE_SIZE);
469 goto out;
Megha Dey087bcd22016-06-23 18:40:47 -0700470 }
471
472 if (speed[i].klen)
473 crypto_ahash_setkey(tfm, tvmem[0], speed[i].klen);
474
Herbert Xu72259de2016-06-28 20:33:52 +0800475 for (k = 0; k < 8; k++)
476 ahash_request_set_crypt(data[k].req, data[k].sg,
477 data[k].result, speed[i].blen);
Megha Dey087bcd22016-06-23 18:40:47 -0700478
Herbert Xu72259de2016-06-28 20:33:52 +0800479 pr_info("test%3u "
480 "(%5u byte blocks,%5u bytes per update,%4u updates): ",
Megha Dey087bcd22016-06-23 18:40:47 -0700481 i, speed[i].blen, speed[i].plen,
482 speed[i].blen / speed[i].plen);
483
Herbert Xu72259de2016-06-28 20:33:52 +0800484 start = get_cycles();
485
486 for (k = 0; k < 8; k++) {
487 ret = crypto_ahash_digest(data[k].req);
Herbert Xud13cd112016-06-30 11:00:13 +0800488 if (ret == -EINPROGRESS) {
489 ret = 0;
Megha Dey087bcd22016-06-23 18:40:47 -0700490 continue;
Herbert Xud13cd112016-06-30 11:00:13 +0800491 }
Megha Dey087bcd22016-06-23 18:40:47 -0700492
Megha Dey087bcd22016-06-23 18:40:47 -0700493 if (ret)
Herbert Xu72259de2016-06-28 20:33:52 +0800494 break;
495
496 complete(&data[k].tresult.completion);
497 data[k].tresult.err = 0;
Megha Dey087bcd22016-06-23 18:40:47 -0700498 }
499
Herbert Xu72259de2016-06-28 20:33:52 +0800500 for (j = 0; j < k; j++) {
501 struct tcrypt_result *tr = &data[j].tresult;
502
503 wait_for_completion(&tr->completion);
504 if (tr->err)
505 ret = tr->err;
506 }
507
508 end = get_cycles();
509 cycles = end - start;
510 pr_cont("%6lu cycles/operation, %4lu cycles/byte\n",
511 cycles, cycles / (8 * speed[i].blen));
512
513 if (ret) {
514 pr_err("At least one hashing failed ret=%d\n", ret);
515 break;
516 }
Megha Dey087bcd22016-06-23 18:40:47 -0700517 }
Megha Dey087bcd22016-06-23 18:40:47 -0700518
519out:
520 for (k = 0; k < 8; ++k)
Herbert Xu72259de2016-06-28 20:33:52 +0800521 ahash_request_free(data[k].req);
522
Megha Dey087bcd22016-06-23 18:40:47 -0700523 for (k = 0; k < 8; ++k)
Herbert Xu72259de2016-06-28 20:33:52 +0800524 testmgr_free_buf(data[k].xbuf);
525
526 crypto_free_ahash(tfm);
527
528free_data:
529 kfree(data);
Megha Dey087bcd22016-06-23 18:40:47 -0700530}
531
David S. Millerbeb63da2010-05-19 14:11:21 +1000532static int test_ahash_jiffies_digest(struct ahash_request *req, int blen,
Mark Rustad3e3dc252014-07-25 02:53:38 -0700533 char *out, int secs)
David S. Millerbeb63da2010-05-19 14:11:21 +1000534{
535 unsigned long start, end;
536 int bcount;
537 int ret;
538
Mark Rustad3e3dc252014-07-25 02:53:38 -0700539 for (start = jiffies, end = start + secs * HZ, bcount = 0;
David S. Millerbeb63da2010-05-19 14:11:21 +1000540 time_before(jiffies, end); bcount++) {
541 ret = do_one_ahash_op(req, crypto_ahash_digest(req));
542 if (ret)
543 return ret;
544 }
545
546 printk("%6u opers/sec, %9lu bytes/sec\n",
Mark Rustad3e3dc252014-07-25 02:53:38 -0700547 bcount / secs, ((long)bcount * blen) / secs);
David S. Millerbeb63da2010-05-19 14:11:21 +1000548
549 return 0;
550}
551
552static int test_ahash_jiffies(struct ahash_request *req, int blen,
Mark Rustad3e3dc252014-07-25 02:53:38 -0700553 int plen, char *out, int secs)
David S. Millerbeb63da2010-05-19 14:11:21 +1000554{
555 unsigned long start, end;
556 int bcount, pcount;
557 int ret;
558
559 if (plen == blen)
Mark Rustad3e3dc252014-07-25 02:53:38 -0700560 return test_ahash_jiffies_digest(req, blen, out, secs);
David S. Millerbeb63da2010-05-19 14:11:21 +1000561
Mark Rustad3e3dc252014-07-25 02:53:38 -0700562 for (start = jiffies, end = start + secs * HZ, bcount = 0;
David S. Millerbeb63da2010-05-19 14:11:21 +1000563 time_before(jiffies, end); bcount++) {
Herbert Xu43a96072015-04-22 11:02:27 +0800564 ret = do_one_ahash_op(req, crypto_ahash_init(req));
David S. Millerbeb63da2010-05-19 14:11:21 +1000565 if (ret)
566 return ret;
567 for (pcount = 0; pcount < blen; pcount += plen) {
568 ret = do_one_ahash_op(req, crypto_ahash_update(req));
569 if (ret)
570 return ret;
571 }
572 /* we assume there is enough space in 'out' for the result */
573 ret = do_one_ahash_op(req, crypto_ahash_final(req));
574 if (ret)
575 return ret;
576 }
577
578 pr_cont("%6u opers/sec, %9lu bytes/sec\n",
Mark Rustad3e3dc252014-07-25 02:53:38 -0700579 bcount / secs, ((long)bcount * blen) / secs);
David S. Millerbeb63da2010-05-19 14:11:21 +1000580
581 return 0;
582}
583
584static int test_ahash_cycles_digest(struct ahash_request *req, int blen,
585 char *out)
586{
587 unsigned long cycles = 0;
588 int ret, i;
589
590 /* Warm-up run. */
591 for (i = 0; i < 4; i++) {
592 ret = do_one_ahash_op(req, crypto_ahash_digest(req));
593 if (ret)
594 goto out;
595 }
596
597 /* The real thing. */
598 for (i = 0; i < 8; i++) {
599 cycles_t start, end;
600
601 start = get_cycles();
602
603 ret = do_one_ahash_op(req, crypto_ahash_digest(req));
604 if (ret)
605 goto out;
606
607 end = get_cycles();
608
609 cycles += end - start;
610 }
611
612out:
613 if (ret)
614 return ret;
615
616 pr_cont("%6lu cycles/operation, %4lu cycles/byte\n",
617 cycles / 8, cycles / (8 * blen));
618
619 return 0;
620}
621
622static int test_ahash_cycles(struct ahash_request *req, int blen,
623 int plen, char *out)
624{
625 unsigned long cycles = 0;
626 int i, pcount, ret;
627
628 if (plen == blen)
629 return test_ahash_cycles_digest(req, blen, out);
630
631 /* Warm-up run. */
632 for (i = 0; i < 4; i++) {
Herbert Xu43a96072015-04-22 11:02:27 +0800633 ret = do_one_ahash_op(req, crypto_ahash_init(req));
David S. Millerbeb63da2010-05-19 14:11:21 +1000634 if (ret)
635 goto out;
636 for (pcount = 0; pcount < blen; pcount += plen) {
637 ret = do_one_ahash_op(req, crypto_ahash_update(req));
638 if (ret)
639 goto out;
640 }
641 ret = do_one_ahash_op(req, crypto_ahash_final(req));
642 if (ret)
643 goto out;
644 }
645
646 /* The real thing. */
647 for (i = 0; i < 8; i++) {
648 cycles_t start, end;
649
650 start = get_cycles();
651
Herbert Xu43a96072015-04-22 11:02:27 +0800652 ret = do_one_ahash_op(req, crypto_ahash_init(req));
David S. Millerbeb63da2010-05-19 14:11:21 +1000653 if (ret)
654 goto out;
655 for (pcount = 0; pcount < blen; pcount += plen) {
656 ret = do_one_ahash_op(req, crypto_ahash_update(req));
657 if (ret)
658 goto out;
659 }
660 ret = do_one_ahash_op(req, crypto_ahash_final(req));
661 if (ret)
662 goto out;
663
664 end = get_cycles();
665
666 cycles += end - start;
667 }
668
669out:
670 if (ret)
671 return ret;
672
673 pr_cont("%6lu cycles/operation, %4lu cycles/byte\n",
674 cycles / 8, cycles / (8 * blen));
675
676 return 0;
677}
678
Herbert Xu06605112016-02-01 21:36:49 +0800679static void test_ahash_speed_common(const char *algo, unsigned int secs,
680 struct hash_speed *speed, unsigned mask)
David S. Millerbeb63da2010-05-19 14:11:21 +1000681{
682 struct scatterlist sg[TVMEMSIZE];
683 struct tcrypt_result tresult;
684 struct ahash_request *req;
685 struct crypto_ahash *tfm;
Horia Geant?f074f7b2015-08-27 18:38:36 +0300686 char *output;
David S. Millerbeb63da2010-05-19 14:11:21 +1000687 int i, ret;
688
Herbert Xu06605112016-02-01 21:36:49 +0800689 tfm = crypto_alloc_ahash(algo, 0, mask);
David S. Millerbeb63da2010-05-19 14:11:21 +1000690 if (IS_ERR(tfm)) {
691 pr_err("failed to load transform for %s: %ld\n",
692 algo, PTR_ERR(tfm));
693 return;
694 }
695
Luca Clementi263a8df2014-06-25 22:57:42 -0700696 printk(KERN_INFO "\ntesting speed of async %s (%s)\n", algo,
697 get_driver_name(crypto_ahash, tfm));
698
Horia Geant?f074f7b2015-08-27 18:38:36 +0300699 if (crypto_ahash_digestsize(tfm) > MAX_DIGEST_SIZE) {
700 pr_err("digestsize(%u) > %d\n", crypto_ahash_digestsize(tfm),
701 MAX_DIGEST_SIZE);
David S. Millerbeb63da2010-05-19 14:11:21 +1000702 goto out;
703 }
704
705 test_hash_sg_init(sg);
706 req = ahash_request_alloc(tfm, GFP_KERNEL);
707 if (!req) {
708 pr_err("ahash request allocation failure\n");
709 goto out;
710 }
711
712 init_completion(&tresult.completion);
713 ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
714 tcrypt_complete, &tresult);
715
Horia Geant?f074f7b2015-08-27 18:38:36 +0300716 output = kmalloc(MAX_DIGEST_SIZE, GFP_KERNEL);
717 if (!output)
718 goto out_nomem;
719
David S. Millerbeb63da2010-05-19 14:11:21 +1000720 for (i = 0; speed[i].blen != 0; i++) {
721 if (speed[i].blen > TVMEMSIZE * PAGE_SIZE) {
722 pr_err("template (%u) too big for tvmem (%lu)\n",
723 speed[i].blen, TVMEMSIZE * PAGE_SIZE);
724 break;
725 }
726
727 pr_info("test%3u "
728 "(%5u byte blocks,%5u bytes per update,%4u updates): ",
729 i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen);
730
731 ahash_request_set_crypt(req, sg, output, speed[i].plen);
732
Mark Rustad3e3dc252014-07-25 02:53:38 -0700733 if (secs)
David S. Millerbeb63da2010-05-19 14:11:21 +1000734 ret = test_ahash_jiffies(req, speed[i].blen,
Mark Rustad3e3dc252014-07-25 02:53:38 -0700735 speed[i].plen, output, secs);
David S. Millerbeb63da2010-05-19 14:11:21 +1000736 else
737 ret = test_ahash_cycles(req, speed[i].blen,
738 speed[i].plen, output);
739
740 if (ret) {
741 pr_err("hashing failed ret=%d\n", ret);
742 break;
743 }
744 }
745
Horia Geant?f074f7b2015-08-27 18:38:36 +0300746 kfree(output);
747
748out_nomem:
David S. Millerbeb63da2010-05-19 14:11:21 +1000749 ahash_request_free(req);
750
751out:
752 crypto_free_ahash(tfm);
753}
754
Herbert Xu06605112016-02-01 21:36:49 +0800755static void test_ahash_speed(const char *algo, unsigned int secs,
756 struct hash_speed *speed)
757{
758 return test_ahash_speed_common(algo, secs, speed, 0);
759}
760
761static void test_hash_speed(const char *algo, unsigned int secs,
762 struct hash_speed *speed)
763{
764 return test_ahash_speed_common(algo, secs, speed, CRYPTO_ALG_ASYNC);
765}
766
Herbert Xu7166e582016-06-29 18:03:50 +0800767static inline int do_one_acipher_op(struct skcipher_request *req, int ret)
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300768{
769 if (ret == -EINPROGRESS || ret == -EBUSY) {
770 struct tcrypt_result *tr = req->base.data;
771
Rabin Vincent8a45ac12015-01-09 16:25:28 +0100772 wait_for_completion(&tr->completion);
Wolfram Sang16735d02013-11-14 14:32:02 -0800773 reinit_completion(&tr->completion);
Rabin Vincent8a45ac12015-01-09 16:25:28 +0100774 ret = tr->err;
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300775 }
776
777 return ret;
778}
779
Herbert Xu7166e582016-06-29 18:03:50 +0800780static int test_acipher_jiffies(struct skcipher_request *req, int enc,
Mark Rustad3e3dc252014-07-25 02:53:38 -0700781 int blen, int secs)
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300782{
783 unsigned long start, end;
784 int bcount;
785 int ret;
786
Mark Rustad3e3dc252014-07-25 02:53:38 -0700787 for (start = jiffies, end = start + secs * HZ, bcount = 0;
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300788 time_before(jiffies, end); bcount++) {
789 if (enc)
790 ret = do_one_acipher_op(req,
Herbert Xu7166e582016-06-29 18:03:50 +0800791 crypto_skcipher_encrypt(req));
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300792 else
793 ret = do_one_acipher_op(req,
Herbert Xu7166e582016-06-29 18:03:50 +0800794 crypto_skcipher_decrypt(req));
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300795
796 if (ret)
797 return ret;
798 }
799
800 pr_cont("%d operations in %d seconds (%ld bytes)\n",
Mark Rustad3e3dc252014-07-25 02:53:38 -0700801 bcount, secs, (long)bcount * blen);
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300802 return 0;
803}
804
Herbert Xu7166e582016-06-29 18:03:50 +0800805static int test_acipher_cycles(struct skcipher_request *req, int enc,
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300806 int blen)
807{
808 unsigned long cycles = 0;
809 int ret = 0;
810 int i;
811
812 /* Warm-up run. */
813 for (i = 0; i < 4; i++) {
814 if (enc)
815 ret = do_one_acipher_op(req,
Herbert Xu7166e582016-06-29 18:03:50 +0800816 crypto_skcipher_encrypt(req));
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300817 else
818 ret = do_one_acipher_op(req,
Herbert Xu7166e582016-06-29 18:03:50 +0800819 crypto_skcipher_decrypt(req));
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300820
821 if (ret)
822 goto out;
823 }
824
825 /* The real thing. */
826 for (i = 0; i < 8; i++) {
827 cycles_t start, end;
828
829 start = get_cycles();
830 if (enc)
831 ret = do_one_acipher_op(req,
Herbert Xu7166e582016-06-29 18:03:50 +0800832 crypto_skcipher_encrypt(req));
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300833 else
834 ret = do_one_acipher_op(req,
Herbert Xu7166e582016-06-29 18:03:50 +0800835 crypto_skcipher_decrypt(req));
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300836 end = get_cycles();
837
838 if (ret)
839 goto out;
840
841 cycles += end - start;
842 }
843
844out:
845 if (ret == 0)
846 pr_cont("1 operation in %lu cycles (%d bytes)\n",
847 (cycles + 4) / 8, blen);
848
849 return ret;
850}
851
Herbert Xu7166e582016-06-29 18:03:50 +0800852static void test_skcipher_speed(const char *algo, int enc, unsigned int secs,
853 struct cipher_speed_template *template,
854 unsigned int tcount, u8 *keysize, bool async)
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300855{
Nicolas Royerde1975332012-07-01 19:19:47 +0200856 unsigned int ret, i, j, k, iv_len;
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300857 struct tcrypt_result tresult;
858 const char *key;
859 char iv[128];
Herbert Xu7166e582016-06-29 18:03:50 +0800860 struct skcipher_request *req;
861 struct crypto_skcipher *tfm;
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300862 const char *e;
863 u32 *b_size;
864
865 if (enc == ENCRYPT)
866 e = "encryption";
867 else
868 e = "decryption";
869
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300870 init_completion(&tresult.completion);
871
Herbert Xu7166e582016-06-29 18:03:50 +0800872 tfm = crypto_alloc_skcipher(algo, 0, async ? 0 : CRYPTO_ALG_ASYNC);
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300873
874 if (IS_ERR(tfm)) {
875 pr_err("failed to load transform for %s: %ld\n", algo,
876 PTR_ERR(tfm));
877 return;
878 }
879
Luca Clementi263a8df2014-06-25 22:57:42 -0700880 pr_info("\ntesting speed of async %s (%s) %s\n", algo,
Herbert Xu7166e582016-06-29 18:03:50 +0800881 get_driver_name(crypto_skcipher, tfm), e);
Luca Clementi263a8df2014-06-25 22:57:42 -0700882
Herbert Xu7166e582016-06-29 18:03:50 +0800883 req = skcipher_request_alloc(tfm, GFP_KERNEL);
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300884 if (!req) {
885 pr_err("tcrypt: skcipher: Failed to allocate request for %s\n",
886 algo);
887 goto out;
888 }
889
Herbert Xu7166e582016-06-29 18:03:50 +0800890 skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
891 tcrypt_complete, &tresult);
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300892
893 i = 0;
894 do {
895 b_size = block_sizes;
896
897 do {
898 struct scatterlist sg[TVMEMSIZE];
899
900 if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
901 pr_err("template (%u) too big for "
902 "tvmem (%lu)\n", *keysize + *b_size,
903 TVMEMSIZE * PAGE_SIZE);
904 goto out_free_req;
905 }
906
907 pr_info("test %u (%d bit key, %d byte blocks): ", i,
908 *keysize * 8, *b_size);
909
910 memset(tvmem[0], 0xff, PAGE_SIZE);
911
912 /* set key, plain text and IV */
913 key = tvmem[0];
914 for (j = 0; j < tcount; j++) {
915 if (template[j].klen == *keysize) {
916 key = template[j].key;
917 break;
918 }
919 }
920
Herbert Xu7166e582016-06-29 18:03:50 +0800921 crypto_skcipher_clear_flags(tfm, ~0);
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300922
Herbert Xu7166e582016-06-29 18:03:50 +0800923 ret = crypto_skcipher_setkey(tfm, key, *keysize);
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300924 if (ret) {
925 pr_err("setkey() failed flags=%x\n",
Herbert Xu7166e582016-06-29 18:03:50 +0800926 crypto_skcipher_get_flags(tfm));
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300927 goto out_free_req;
928 }
929
Nicolas Royerde1975332012-07-01 19:19:47 +0200930 k = *keysize + *b_size;
Horia Geant?007ee8d2015-03-09 16:14:58 +0200931 sg_init_table(sg, DIV_ROUND_UP(k, PAGE_SIZE));
932
Nicolas Royerde1975332012-07-01 19:19:47 +0200933 if (k > PAGE_SIZE) {
934 sg_set_buf(sg, tvmem[0] + *keysize,
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300935 PAGE_SIZE - *keysize);
Nicolas Royerde1975332012-07-01 19:19:47 +0200936 k -= PAGE_SIZE;
937 j = 1;
938 while (k > PAGE_SIZE) {
939 sg_set_buf(sg + j, tvmem[j], PAGE_SIZE);
940 memset(tvmem[j], 0xff, PAGE_SIZE);
941 j++;
942 k -= PAGE_SIZE;
943 }
944 sg_set_buf(sg + j, tvmem[j], k);
945 memset(tvmem[j], 0xff, k);
946 } else {
947 sg_set_buf(sg, tvmem[0] + *keysize, *b_size);
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300948 }
949
Herbert Xu7166e582016-06-29 18:03:50 +0800950 iv_len = crypto_skcipher_ivsize(tfm);
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300951 if (iv_len)
952 memset(&iv, 0xff, iv_len);
953
Herbert Xu7166e582016-06-29 18:03:50 +0800954 skcipher_request_set_crypt(req, sg, sg, *b_size, iv);
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300955
Mark Rustad3e3dc252014-07-25 02:53:38 -0700956 if (secs)
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300957 ret = test_acipher_jiffies(req, enc,
Mark Rustad3e3dc252014-07-25 02:53:38 -0700958 *b_size, secs);
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300959 else
960 ret = test_acipher_cycles(req, enc,
961 *b_size);
962
963 if (ret) {
964 pr_err("%s() failed flags=%x\n", e,
Herbert Xu7166e582016-06-29 18:03:50 +0800965 crypto_skcipher_get_flags(tfm));
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300966 break;
967 }
968 b_size++;
969 i++;
970 } while (*b_size);
971 keysize++;
972 } while (*keysize);
973
974out_free_req:
Herbert Xu7166e582016-06-29 18:03:50 +0800975 skcipher_request_free(req);
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300976out:
Herbert Xu7166e582016-06-29 18:03:50 +0800977 crypto_free_skcipher(tfm);
978}
979
980static void test_acipher_speed(const char *algo, int enc, unsigned int secs,
981 struct cipher_speed_template *template,
982 unsigned int tcount, u8 *keysize)
983{
984 return test_skcipher_speed(algo, enc, secs, template, tcount, keysize,
985 true);
986}
987
988static void test_cipher_speed(const char *algo, int enc, unsigned int secs,
989 struct cipher_speed_template *template,
990 unsigned int tcount, u8 *keysize)
991{
992 return test_skcipher_speed(algo, enc, secs, template, tcount, keysize,
993 false);
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +0300994}
995
Herbert Xuef2736f2005-06-22 13:26:03 -0700996static void test_available(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700997{
998 char **name = check;
Herbert Xuef2736f2005-06-22 13:26:03 -0700999
Linus Torvalds1da177e2005-04-16 15:20:36 -07001000 while (*name) {
1001 printk("alg %s ", *name);
Herbert Xu6158efc2007-04-04 17:41:07 +10001002 printk(crypto_has_alg(*name, 0, 0) ?
Herbert Xue4d5b792006-08-26 18:12:40 +10001003 "found\n" : "not found\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001004 name++;
Herbert Xuef2736f2005-06-22 13:26:03 -07001005 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001006}
1007
Herbert Xu01b32322008-07-31 15:41:55 +08001008static inline int tcrypt_test(const char *alg)
1009{
Jarod Wilson4e033a62009-05-27 15:10:21 +10001010 int ret;
1011
Rabin Vincent76512f22017-01-18 14:54:05 +01001012 pr_debug("testing %s\n", alg);
1013
Jarod Wilson4e033a62009-05-27 15:10:21 +10001014 ret = alg_test(alg, alg, 0, 0);
1015 /* non-fips algs return -EINVAL in fips mode */
1016 if (fips_enabled && ret == -EINVAL)
1017 ret = 0;
1018 return ret;
Herbert Xu01b32322008-07-31 15:41:55 +08001019}
1020
Herbert Xu86068132014-12-04 16:43:29 +08001021static int do_test(const char *alg, u32 type, u32 mask, int m)
Herbert Xu01b32322008-07-31 15:41:55 +08001022{
1023 int i;
Jarod Wilson4e033a62009-05-27 15:10:21 +10001024 int ret = 0;
Herbert Xu01b32322008-07-31 15:41:55 +08001025
1026 switch (m) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001027 case 0:
Herbert Xu86068132014-12-04 16:43:29 +08001028 if (alg) {
1029 if (!crypto_has_alg(alg, type,
1030 mask ?: CRYPTO_ALG_TYPE_MASK))
1031 ret = -ENOENT;
1032 break;
1033 }
1034
Herbert Xu01b32322008-07-31 15:41:55 +08001035 for (i = 1; i < 200; i++)
Herbert Xu86068132014-12-04 16:43:29 +08001036 ret += do_test(NULL, 0, 0, i);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001037 break;
1038
1039 case 1:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001040 ret += tcrypt_test("md5");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001041 break;
1042
1043 case 2:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001044 ret += tcrypt_test("sha1");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001045 break;
1046
1047 case 3:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001048 ret += tcrypt_test("ecb(des)");
1049 ret += tcrypt_test("cbc(des)");
Jussi Kivilinna8163fc32012-10-20 14:53:07 +03001050 ret += tcrypt_test("ctr(des)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001051 break;
1052
1053 case 4:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001054 ret += tcrypt_test("ecb(des3_ede)");
1055 ret += tcrypt_test("cbc(des3_ede)");
Jussi Kivilinnae080b172012-10-20 14:53:12 +03001056 ret += tcrypt_test("ctr(des3_ede)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001057 break;
1058
1059 case 5:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001060 ret += tcrypt_test("md4");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001061 break;
Herbert Xuef2736f2005-06-22 13:26:03 -07001062
Linus Torvalds1da177e2005-04-16 15:20:36 -07001063 case 6:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001064 ret += tcrypt_test("sha256");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001065 break;
Herbert Xuef2736f2005-06-22 13:26:03 -07001066
Linus Torvalds1da177e2005-04-16 15:20:36 -07001067 case 7:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001068 ret += tcrypt_test("ecb(blowfish)");
1069 ret += tcrypt_test("cbc(blowfish)");
Jussi Kivilinna85b63e32011-10-10 23:03:03 +03001070 ret += tcrypt_test("ctr(blowfish)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001071 break;
1072
1073 case 8:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001074 ret += tcrypt_test("ecb(twofish)");
1075 ret += tcrypt_test("cbc(twofish)");
Jussi Kivilinna573da622011-10-10 23:03:12 +03001076 ret += tcrypt_test("ctr(twofish)");
Jussi Kivilinnabee3a902011-10-18 13:32:56 +03001077 ret += tcrypt_test("lrw(twofish)");
Jussi Kivilinna131f7542011-10-18 13:33:38 +03001078 ret += tcrypt_test("xts(twofish)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001079 break;
Herbert Xuef2736f2005-06-22 13:26:03 -07001080
Linus Torvalds1da177e2005-04-16 15:20:36 -07001081 case 9:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001082 ret += tcrypt_test("ecb(serpent)");
Jussi Kivilinna9d259172011-10-18 00:02:53 +03001083 ret += tcrypt_test("cbc(serpent)");
1084 ret += tcrypt_test("ctr(serpent)");
Jussi Kivilinna87aae4b2011-10-18 13:32:39 +03001085 ret += tcrypt_test("lrw(serpent)");
Jussi Kivilinna5209c072011-10-18 13:33:22 +03001086 ret += tcrypt_test("xts(serpent)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001087 break;
1088
1089 case 10:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001090 ret += tcrypt_test("ecb(aes)");
1091 ret += tcrypt_test("cbc(aes)");
1092 ret += tcrypt_test("lrw(aes)");
1093 ret += tcrypt_test("xts(aes)");
1094 ret += tcrypt_test("ctr(aes)");
1095 ret += tcrypt_test("rfc3686(ctr(aes))");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001096 break;
1097
1098 case 11:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001099 ret += tcrypt_test("sha384");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001100 break;
Herbert Xuef2736f2005-06-22 13:26:03 -07001101
Linus Torvalds1da177e2005-04-16 15:20:36 -07001102 case 12:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001103 ret += tcrypt_test("sha512");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001104 break;
1105
1106 case 13:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001107 ret += tcrypt_test("deflate");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001108 break;
1109
1110 case 14:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001111 ret += tcrypt_test("ecb(cast5)");
Johannes Goetzfrieda2c58262012-07-11 19:37:21 +02001112 ret += tcrypt_test("cbc(cast5)");
1113 ret += tcrypt_test("ctr(cast5)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001114 break;
1115
1116 case 15:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001117 ret += tcrypt_test("ecb(cast6)");
Johannes Goetzfried9b8b0402012-07-11 19:38:29 +02001118 ret += tcrypt_test("cbc(cast6)");
1119 ret += tcrypt_test("ctr(cast6)");
1120 ret += tcrypt_test("lrw(cast6)");
1121 ret += tcrypt_test("xts(cast6)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001122 break;
1123
1124 case 16:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001125 ret += tcrypt_test("ecb(arc4)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001126 break;
1127
1128 case 17:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001129 ret += tcrypt_test("michael_mic");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001130 break;
1131
1132 case 18:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001133 ret += tcrypt_test("crc32c");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001134 break;
1135
1136 case 19:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001137 ret += tcrypt_test("ecb(tea)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001138 break;
1139
1140 case 20:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001141 ret += tcrypt_test("ecb(xtea)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001142 break;
1143
1144 case 21:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001145 ret += tcrypt_test("ecb(khazad)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001146 break;
1147
1148 case 22:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001149 ret += tcrypt_test("wp512");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001150 break;
1151
1152 case 23:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001153 ret += tcrypt_test("wp384");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001154 break;
1155
1156 case 24:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001157 ret += tcrypt_test("wp256");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001158 break;
1159
1160 case 25:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001161 ret += tcrypt_test("ecb(tnepres)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001162 break;
1163
1164 case 26:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001165 ret += tcrypt_test("ecb(anubis)");
1166 ret += tcrypt_test("cbc(anubis)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001167 break;
1168
1169 case 27:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001170 ret += tcrypt_test("tgr192");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001171 break;
1172
1173 case 28:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001174 ret += tcrypt_test("tgr160");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001175 break;
1176
1177 case 29:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001178 ret += tcrypt_test("tgr128");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001179 break;
Adrian-Ken Rueegsegger2998db32008-05-09 21:29:35 +08001180
Aaron Grothefb4f10e2005-09-01 17:42:46 -07001181 case 30:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001182 ret += tcrypt_test("ecb(xeta)");
Aaron Grothefb4f10e2005-09-01 17:42:46 -07001183 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001184
David Howells90831632006-12-16 12:13:14 +11001185 case 31:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001186 ret += tcrypt_test("pcbc(fcrypt)");
David Howells90831632006-12-16 12:13:14 +11001187 break;
1188
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11001189 case 32:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001190 ret += tcrypt_test("ecb(camellia)");
1191 ret += tcrypt_test("cbc(camellia)");
Jussi Kivilinna54216bb2012-09-21 10:27:10 +03001192 ret += tcrypt_test("ctr(camellia)");
1193 ret += tcrypt_test("lrw(camellia)");
1194 ret += tcrypt_test("xts(camellia)");
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11001195 break;
Jussi Kivilinna93b5e862013-04-08 10:48:44 +03001196
Jonathan Lynchcd12fb902007-11-10 20:08:25 +08001197 case 33:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001198 ret += tcrypt_test("sha224");
Jonathan Lynchcd12fb902007-11-10 20:08:25 +08001199 break;
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11001200
Tan Swee Heng2407d602007-11-23 19:45:00 +08001201 case 34:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001202 ret += tcrypt_test("salsa20");
Tan Swee Heng2407d602007-11-23 19:45:00 +08001203 break;
1204
Herbert Xu8df213d2007-12-02 14:55:47 +11001205 case 35:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001206 ret += tcrypt_test("gcm(aes)");
Herbert Xu8df213d2007-12-02 14:55:47 +11001207 break;
1208
Zoltan Sogor0b77abb2007-12-07 16:53:23 +08001209 case 36:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001210 ret += tcrypt_test("lzo");
Zoltan Sogor0b77abb2007-12-07 16:53:23 +08001211 break;
1212
Joy Latten93cc74e2007-12-12 20:24:22 +08001213 case 37:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001214 ret += tcrypt_test("ccm(aes)");
Joy Latten93cc74e2007-12-12 20:24:22 +08001215 break;
1216
Kevin Coffman76cb9522008-03-24 21:26:16 +08001217 case 38:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001218 ret += tcrypt_test("cts(cbc(aes))");
Kevin Coffman76cb9522008-03-24 21:26:16 +08001219 break;
1220
Adrian-Ken Rueegseggerfd4adf12008-05-07 22:16:36 +08001221 case 39:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001222 ret += tcrypt_test("rmd128");
Adrian-Ken Rueegseggerfd4adf12008-05-07 22:16:36 +08001223 break;
1224
1225 case 40:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001226 ret += tcrypt_test("rmd160");
Adrian-Ken Rueegseggerfd4adf12008-05-07 22:16:36 +08001227 break;
1228
Adrian-Ken Rueegsegger2998db32008-05-09 21:29:35 +08001229 case 41:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001230 ret += tcrypt_test("rmd256");
Adrian-Ken Rueegsegger2998db32008-05-09 21:29:35 +08001231 break;
1232
1233 case 42:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001234 ret += tcrypt_test("rmd320");
Herbert Xu01b32322008-07-31 15:41:55 +08001235 break;
1236
1237 case 43:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001238 ret += tcrypt_test("ecb(seed)");
Adrian-Ken Rueegsegger2998db32008-05-09 21:29:35 +08001239 break;
1240
Geert Uytterhoeven0c01aed2009-03-04 15:42:15 +08001241 case 44:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001242 ret += tcrypt_test("zlib");
Geert Uytterhoeven0c01aed2009-03-04 15:42:15 +08001243 break;
1244
Jarod Wilson5d667322009-05-04 19:23:40 +08001245 case 45:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001246 ret += tcrypt_test("rfc4309(ccm(aes))");
Jarod Wilson5d667322009-05-04 19:23:40 +08001247 break;
1248
Jussi Kivilinna54216bb2012-09-21 10:27:10 +03001249 case 46:
1250 ret += tcrypt_test("ghash");
1251 break;
1252
Herbert Xu684115212013-09-07 12:56:26 +10001253 case 47:
1254 ret += tcrypt_test("crct10dif");
1255 break;
1256
raveendra padasalagi79cc6ab2016-06-17 10:30:36 +05301257 case 48:
1258 ret += tcrypt_test("sha3-224");
1259 break;
1260
1261 case 49:
1262 ret += tcrypt_test("sha3-256");
1263 break;
1264
1265 case 50:
1266 ret += tcrypt_test("sha3-384");
1267 break;
1268
1269 case 51:
1270 ret += tcrypt_test("sha3-512");
1271 break;
1272
Gilad Ben-Yossefb7e27532017-08-21 13:51:29 +03001273 case 52:
1274 ret += tcrypt_test("sm3");
1275 break;
1276
Linus Torvalds1da177e2005-04-16 15:20:36 -07001277 case 100:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001278 ret += tcrypt_test("hmac(md5)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001279 break;
Herbert Xuef2736f2005-06-22 13:26:03 -07001280
Linus Torvalds1da177e2005-04-16 15:20:36 -07001281 case 101:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001282 ret += tcrypt_test("hmac(sha1)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001283 break;
Herbert Xuef2736f2005-06-22 13:26:03 -07001284
Linus Torvalds1da177e2005-04-16 15:20:36 -07001285 case 102:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001286 ret += tcrypt_test("hmac(sha256)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001287 break;
1288
Andrew Donofrioa28091a2006-12-10 12:10:20 +11001289 case 103:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001290 ret += tcrypt_test("hmac(sha384)");
Andrew Donofrioa28091a2006-12-10 12:10:20 +11001291 break;
1292
1293 case 104:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001294 ret += tcrypt_test("hmac(sha512)");
Andrew Donofrioa28091a2006-12-10 12:10:20 +11001295 break;
Herbert Xu38ed9ab2008-01-01 15:59:28 +11001296
Jonathan Lynchcd12fb902007-11-10 20:08:25 +08001297 case 105:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001298 ret += tcrypt_test("hmac(sha224)");
Jonathan Lynchcd12fb902007-11-10 20:08:25 +08001299 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001300
Herbert Xu38ed9ab2008-01-01 15:59:28 +11001301 case 106:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001302 ret += tcrypt_test("xcbc(aes)");
Herbert Xu38ed9ab2008-01-01 15:59:28 +11001303 break;
1304
Adrian-Ken Rueegseggerfd4adf12008-05-07 22:16:36 +08001305 case 107:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001306 ret += tcrypt_test("hmac(rmd128)");
Adrian-Ken Rueegseggerfd4adf12008-05-07 22:16:36 +08001307 break;
1308
1309 case 108:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001310 ret += tcrypt_test("hmac(rmd160)");
Adrian-Ken Rueegseggerfd4adf12008-05-07 22:16:36 +08001311 break;
1312
Shane Wangf1939f72009-09-02 20:05:22 +10001313 case 109:
1314 ret += tcrypt_test("vmac(aes)");
1315 break;
Jussi Kivilinna93b5e862013-04-08 10:48:44 +03001316
Sonic Zhanga482b082012-05-25 17:54:13 +08001317 case 110:
1318 ret += tcrypt_test("hmac(crc32)");
1319 break;
Shane Wangf1939f72009-09-02 20:05:22 +10001320
raveendra padasalagi98eca722016-07-01 11:16:54 +05301321 case 111:
1322 ret += tcrypt_test("hmac(sha3-224)");
1323 break;
1324
1325 case 112:
1326 ret += tcrypt_test("hmac(sha3-256)");
1327 break;
1328
1329 case 113:
1330 ret += tcrypt_test("hmac(sha3-384)");
1331 break;
1332
1333 case 114:
1334 ret += tcrypt_test("hmac(sha3-512)");
1335 break;
1336
Jarod Wilsone08ca2d2009-05-04 19:46:29 +08001337 case 150:
Jarod Wilson4e033a62009-05-27 15:10:21 +10001338 ret += tcrypt_test("ansi_cprng");
Jarod Wilsone08ca2d2009-05-04 19:46:29 +08001339 break;
1340
Adrian Hoban69435b92010-11-04 15:02:04 -04001341 case 151:
1342 ret += tcrypt_test("rfc4106(gcm(aes))");
1343 break;
1344
Jussi Kivilinnae9b74412013-04-07 16:43:51 +03001345 case 152:
1346 ret += tcrypt_test("rfc4543(gcm(aes))");
1347 break;
1348
Jussi Kivilinna93b5e862013-04-08 10:48:44 +03001349 case 153:
1350 ret += tcrypt_test("cmac(aes)");
1351 break;
1352
1353 case 154:
1354 ret += tcrypt_test("cmac(des3_ede)");
1355 break;
1356
Horia Geantabbf9c892013-11-28 15:11:16 +02001357 case 155:
1358 ret += tcrypt_test("authenc(hmac(sha1),cbc(aes))");
1359 break;
1360
Horia Geantabca4feb2014-03-14 17:46:51 +02001361 case 156:
1362 ret += tcrypt_test("authenc(hmac(md5),ecb(cipher_null))");
1363 break;
1364
1365 case 157:
1366 ret += tcrypt_test("authenc(hmac(sha1),ecb(cipher_null))");
1367 break;
Nitesh Lal5208ed22014-05-21 17:09:08 +05301368 case 181:
1369 ret += tcrypt_test("authenc(hmac(sha1),cbc(des))");
1370 break;
1371 case 182:
1372 ret += tcrypt_test("authenc(hmac(sha1),cbc(des3_ede))");
1373 break;
1374 case 183:
1375 ret += tcrypt_test("authenc(hmac(sha224),cbc(des))");
1376 break;
1377 case 184:
1378 ret += tcrypt_test("authenc(hmac(sha224),cbc(des3_ede))");
1379 break;
1380 case 185:
1381 ret += tcrypt_test("authenc(hmac(sha256),cbc(des))");
1382 break;
1383 case 186:
1384 ret += tcrypt_test("authenc(hmac(sha256),cbc(des3_ede))");
1385 break;
1386 case 187:
1387 ret += tcrypt_test("authenc(hmac(sha384),cbc(des))");
1388 break;
1389 case 188:
1390 ret += tcrypt_test("authenc(hmac(sha384),cbc(des3_ede))");
1391 break;
1392 case 189:
1393 ret += tcrypt_test("authenc(hmac(sha512),cbc(des))");
1394 break;
1395 case 190:
1396 ret += tcrypt_test("authenc(hmac(sha512),cbc(des3_ede))");
1397 break;
Harald Welteebfd9bc2005-06-22 13:27:23 -07001398 case 200:
Herbert Xucba83562006-08-13 08:26:09 +10001399 test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001400 speed_template_16_24_32);
Herbert Xucba83562006-08-13 08:26:09 +10001401 test_cipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001402 speed_template_16_24_32);
Herbert Xucba83562006-08-13 08:26:09 +10001403 test_cipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001404 speed_template_16_24_32);
Herbert Xucba83562006-08-13 08:26:09 +10001405 test_cipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001406 speed_template_16_24_32);
Rik Snelf3d10442006-11-29 19:01:41 +11001407 test_cipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001408 speed_template_32_40_48);
Rik Snelf3d10442006-11-29 19:01:41 +11001409 test_cipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001410 speed_template_32_40_48);
Rik Snelf19f5112007-09-19 20:23:13 +08001411 test_cipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
Horia Geantăb66ad0b2017-07-19 19:40:32 +03001412 speed_template_32_64);
Rik Snelf19f5112007-09-19 20:23:13 +08001413 test_cipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
Horia Geantăb66ad0b2017-07-19 19:40:32 +03001414 speed_template_32_64);
Herbert Xu1503a242016-06-29 18:04:14 +08001415 test_cipher_speed("cts(cbc(aes))", ENCRYPT, sec, NULL, 0,
1416 speed_template_16_24_32);
1417 test_cipher_speed("cts(cbc(aes))", DECRYPT, sec, NULL, 0,
1418 speed_template_16_24_32);
Jan Glauber9996e342011-04-26 16:34:01 +10001419 test_cipher_speed("ctr(aes)", ENCRYPT, sec, NULL, 0,
1420 speed_template_16_24_32);
1421 test_cipher_speed("ctr(aes)", DECRYPT, sec, NULL, 0,
1422 speed_template_16_24_32);
Harald Welteebfd9bc2005-06-22 13:27:23 -07001423 break;
1424
1425 case 201:
Herbert Xucba83562006-08-13 08:26:09 +10001426 test_cipher_speed("ecb(des3_ede)", ENCRYPT, sec,
Herbert Xuda7f0332008-07-31 17:08:25 +08001427 des3_speed_template, DES3_SPEED_VECTORS,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001428 speed_template_24);
Herbert Xucba83562006-08-13 08:26:09 +10001429 test_cipher_speed("ecb(des3_ede)", DECRYPT, sec,
Herbert Xuda7f0332008-07-31 17:08:25 +08001430 des3_speed_template, DES3_SPEED_VECTORS,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001431 speed_template_24);
Herbert Xucba83562006-08-13 08:26:09 +10001432 test_cipher_speed("cbc(des3_ede)", ENCRYPT, sec,
Herbert Xuda7f0332008-07-31 17:08:25 +08001433 des3_speed_template, DES3_SPEED_VECTORS,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001434 speed_template_24);
Herbert Xucba83562006-08-13 08:26:09 +10001435 test_cipher_speed("cbc(des3_ede)", DECRYPT, sec,
Herbert Xuda7f0332008-07-31 17:08:25 +08001436 des3_speed_template, DES3_SPEED_VECTORS,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001437 speed_template_24);
Jussi Kivilinna87131502014-06-09 20:59:49 +03001438 test_cipher_speed("ctr(des3_ede)", ENCRYPT, sec,
1439 des3_speed_template, DES3_SPEED_VECTORS,
1440 speed_template_24);
1441 test_cipher_speed("ctr(des3_ede)", DECRYPT, sec,
1442 des3_speed_template, DES3_SPEED_VECTORS,
1443 speed_template_24);
Harald Welteebfd9bc2005-06-22 13:27:23 -07001444 break;
1445
1446 case 202:
Herbert Xucba83562006-08-13 08:26:09 +10001447 test_cipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001448 speed_template_16_24_32);
Herbert Xucba83562006-08-13 08:26:09 +10001449 test_cipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001450 speed_template_16_24_32);
Herbert Xucba83562006-08-13 08:26:09 +10001451 test_cipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001452 speed_template_16_24_32);
Herbert Xucba83562006-08-13 08:26:09 +10001453 test_cipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001454 speed_template_16_24_32);
Jussi Kivilinnaee5002a2011-09-26 16:47:15 +03001455 test_cipher_speed("ctr(twofish)", ENCRYPT, sec, NULL, 0,
1456 speed_template_16_24_32);
1457 test_cipher_speed("ctr(twofish)", DECRYPT, sec, NULL, 0,
1458 speed_template_16_24_32);
Jussi Kivilinnabee3a902011-10-18 13:32:56 +03001459 test_cipher_speed("lrw(twofish)", ENCRYPT, sec, NULL, 0,
1460 speed_template_32_40_48);
1461 test_cipher_speed("lrw(twofish)", DECRYPT, sec, NULL, 0,
1462 speed_template_32_40_48);
Jussi Kivilinna131f7542011-10-18 13:33:38 +03001463 test_cipher_speed("xts(twofish)", ENCRYPT, sec, NULL, 0,
1464 speed_template_32_48_64);
1465 test_cipher_speed("xts(twofish)", DECRYPT, sec, NULL, 0,
1466 speed_template_32_48_64);
Harald Welteebfd9bc2005-06-22 13:27:23 -07001467 break;
1468
1469 case 203:
Herbert Xucba83562006-08-13 08:26:09 +10001470 test_cipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001471 speed_template_8_32);
Herbert Xucba83562006-08-13 08:26:09 +10001472 test_cipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001473 speed_template_8_32);
Herbert Xucba83562006-08-13 08:26:09 +10001474 test_cipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001475 speed_template_8_32);
Herbert Xucba83562006-08-13 08:26:09 +10001476 test_cipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001477 speed_template_8_32);
Jussi Kivilinna7d47b862011-09-02 01:45:17 +03001478 test_cipher_speed("ctr(blowfish)", ENCRYPT, sec, NULL, 0,
1479 speed_template_8_32);
1480 test_cipher_speed("ctr(blowfish)", DECRYPT, sec, NULL, 0,
1481 speed_template_8_32);
Harald Welteebfd9bc2005-06-22 13:27:23 -07001482 break;
1483
1484 case 204:
Herbert Xucba83562006-08-13 08:26:09 +10001485 test_cipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001486 speed_template_8);
Herbert Xucba83562006-08-13 08:26:09 +10001487 test_cipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001488 speed_template_8);
Herbert Xucba83562006-08-13 08:26:09 +10001489 test_cipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001490 speed_template_8);
Herbert Xucba83562006-08-13 08:26:09 +10001491 test_cipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001492 speed_template_8);
Harald Welteebfd9bc2005-06-22 13:27:23 -07001493 break;
1494
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11001495 case 205:
1496 test_cipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001497 speed_template_16_24_32);
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11001498 test_cipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001499 speed_template_16_24_32);
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11001500 test_cipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001501 speed_template_16_24_32);
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11001502 test_cipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001503 speed_template_16_24_32);
Jussi Kivilinna4de59332012-03-05 20:26:26 +02001504 test_cipher_speed("ctr(camellia)", ENCRYPT, sec, NULL, 0,
1505 speed_template_16_24_32);
1506 test_cipher_speed("ctr(camellia)", DECRYPT, sec, NULL, 0,
1507 speed_template_16_24_32);
1508 test_cipher_speed("lrw(camellia)", ENCRYPT, sec, NULL, 0,
1509 speed_template_32_40_48);
1510 test_cipher_speed("lrw(camellia)", DECRYPT, sec, NULL, 0,
1511 speed_template_32_40_48);
1512 test_cipher_speed("xts(camellia)", ENCRYPT, sec, NULL, 0,
1513 speed_template_32_48_64);
1514 test_cipher_speed("xts(camellia)", DECRYPT, sec, NULL, 0,
1515 speed_template_32_48_64);
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11001516 break;
1517
Tan Swee Heng5de8f1b2007-12-07 17:17:43 +08001518 case 206:
1519 test_cipher_speed("salsa20", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001520 speed_template_16_32);
Tan Swee Heng5de8f1b2007-12-07 17:17:43 +08001521 break;
1522
Jussi Kivilinna7fb7fe42011-10-18 00:03:03 +03001523 case 207:
1524 test_cipher_speed("ecb(serpent)", ENCRYPT, sec, NULL, 0,
1525 speed_template_16_32);
1526 test_cipher_speed("ecb(serpent)", DECRYPT, sec, NULL, 0,
1527 speed_template_16_32);
1528 test_cipher_speed("cbc(serpent)", ENCRYPT, sec, NULL, 0,
1529 speed_template_16_32);
1530 test_cipher_speed("cbc(serpent)", DECRYPT, sec, NULL, 0,
1531 speed_template_16_32);
1532 test_cipher_speed("ctr(serpent)", ENCRYPT, sec, NULL, 0,
1533 speed_template_16_32);
1534 test_cipher_speed("ctr(serpent)", DECRYPT, sec, NULL, 0,
1535 speed_template_16_32);
Jussi Kivilinna87aae4b2011-10-18 13:32:39 +03001536 test_cipher_speed("lrw(serpent)", ENCRYPT, sec, NULL, 0,
1537 speed_template_32_48);
1538 test_cipher_speed("lrw(serpent)", DECRYPT, sec, NULL, 0,
1539 speed_template_32_48);
Jussi Kivilinna5209c072011-10-18 13:33:22 +03001540 test_cipher_speed("xts(serpent)", ENCRYPT, sec, NULL, 0,
1541 speed_template_32_64);
1542 test_cipher_speed("xts(serpent)", DECRYPT, sec, NULL, 0,
1543 speed_template_32_64);
Jussi Kivilinna7fb7fe42011-10-18 00:03:03 +03001544 break;
1545
Jussi Kivilinna31b4cd292012-06-12 16:52:04 +08001546 case 208:
1547 test_cipher_speed("ecb(arc4)", ENCRYPT, sec, NULL, 0,
1548 speed_template_8);
1549 break;
1550
Johannes Goetzfrieda2c58262012-07-11 19:37:21 +02001551 case 209:
1552 test_cipher_speed("ecb(cast5)", ENCRYPT, sec, NULL, 0,
1553 speed_template_8_16);
1554 test_cipher_speed("ecb(cast5)", DECRYPT, sec, NULL, 0,
1555 speed_template_8_16);
1556 test_cipher_speed("cbc(cast5)", ENCRYPT, sec, NULL, 0,
1557 speed_template_8_16);
1558 test_cipher_speed("cbc(cast5)", DECRYPT, sec, NULL, 0,
1559 speed_template_8_16);
1560 test_cipher_speed("ctr(cast5)", ENCRYPT, sec, NULL, 0,
1561 speed_template_8_16);
1562 test_cipher_speed("ctr(cast5)", DECRYPT, sec, NULL, 0,
1563 speed_template_8_16);
1564 break;
1565
Johannes Goetzfried9b8b0402012-07-11 19:38:29 +02001566 case 210:
1567 test_cipher_speed("ecb(cast6)", ENCRYPT, sec, NULL, 0,
1568 speed_template_16_32);
1569 test_cipher_speed("ecb(cast6)", DECRYPT, sec, NULL, 0,
1570 speed_template_16_32);
1571 test_cipher_speed("cbc(cast6)", ENCRYPT, sec, NULL, 0,
1572 speed_template_16_32);
1573 test_cipher_speed("cbc(cast6)", DECRYPT, sec, NULL, 0,
1574 speed_template_16_32);
1575 test_cipher_speed("ctr(cast6)", ENCRYPT, sec, NULL, 0,
1576 speed_template_16_32);
1577 test_cipher_speed("ctr(cast6)", DECRYPT, sec, NULL, 0,
1578 speed_template_16_32);
1579 test_cipher_speed("lrw(cast6)", ENCRYPT, sec, NULL, 0,
1580 speed_template_32_48);
1581 test_cipher_speed("lrw(cast6)", DECRYPT, sec, NULL, 0,
1582 speed_template_32_48);
1583 test_cipher_speed("xts(cast6)", ENCRYPT, sec, NULL, 0,
1584 speed_template_32_64);
1585 test_cipher_speed("xts(cast6)", DECRYPT, sec, NULL, 0,
1586 speed_template_32_64);
1587 break;
1588
Tim Chen53f52d72013-12-11 14:28:47 -08001589 case 211:
1590 test_aead_speed("rfc4106(gcm(aes))", ENCRYPT, sec,
Herbert Xu34a1c742015-07-09 07:17:26 +08001591 NULL, 0, 16, 16, aead_speed_template_20);
Vutla, Lokesh1425d2d2015-07-07 21:01:49 +05301592 test_aead_speed("gcm(aes)", ENCRYPT, sec,
Cyrille Pitchenf18611d2015-11-17 13:37:10 +01001593 NULL, 0, 16, 8, speed_template_16_24_32);
Tim Chen53f52d72013-12-11 14:28:47 -08001594 break;
1595
Herbert Xu4e4aab62015-06-17 14:04:21 +08001596 case 212:
1597 test_aead_speed("rfc4309(ccm(aes))", ENCRYPT, sec,
Herbert Xu34a1c742015-07-09 07:17:26 +08001598 NULL, 0, 16, 16, aead_speed_template_19);
Herbert Xu4e4aab62015-06-17 14:04:21 +08001599 break;
1600
Martin Willi2dce0632015-07-16 19:13:59 +02001601 case 213:
1602 test_aead_speed("rfc7539esp(chacha20,poly1305)", ENCRYPT, sec,
1603 NULL, 0, 16, 8, aead_speed_template_36);
1604 break;
1605
1606 case 214:
1607 test_cipher_speed("chacha20", ENCRYPT, sec, NULL, 0,
1608 speed_template_32);
1609 break;
1610
Michal Ludvige8057922006-05-30 22:04:19 +10001611 case 300:
Herbert Xu86068132014-12-04 16:43:29 +08001612 if (alg) {
1613 test_hash_speed(alg, sec, generic_hash_speed_template);
1614 break;
1615 }
Michal Ludvige8057922006-05-30 22:04:19 +10001616 /* fall through */
Michal Ludvige8057922006-05-30 22:04:19 +10001617 case 301:
Herbert Xue9d41162006-08-19 21:38:49 +10001618 test_hash_speed("md4", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001619 if (mode > 300 && mode < 400) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001620 /* fall through */
Michal Ludvige8057922006-05-30 22:04:19 +10001621 case 302:
Herbert Xue9d41162006-08-19 21:38:49 +10001622 test_hash_speed("md5", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001623 if (mode > 300 && mode < 400) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001624 /* fall through */
Michal Ludvige8057922006-05-30 22:04:19 +10001625 case 303:
Herbert Xue9d41162006-08-19 21:38:49 +10001626 test_hash_speed("sha1", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001627 if (mode > 300 && mode < 400) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001628 /* fall through */
Michal Ludvige8057922006-05-30 22:04:19 +10001629 case 304:
Herbert Xue9d41162006-08-19 21:38:49 +10001630 test_hash_speed("sha256", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001631 if (mode > 300 && mode < 400) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001632 /* fall through */
Michal Ludvige8057922006-05-30 22:04:19 +10001633 case 305:
Herbert Xue9d41162006-08-19 21:38:49 +10001634 test_hash_speed("sha384", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001635 if (mode > 300 && mode < 400) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001636 /* fall through */
Michal Ludvige8057922006-05-30 22:04:19 +10001637 case 306:
Herbert Xue9d41162006-08-19 21:38:49 +10001638 test_hash_speed("sha512", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001639 if (mode > 300 && mode < 400) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001640 /* fall through */
Michal Ludvige8057922006-05-30 22:04:19 +10001641 case 307:
Herbert Xue9d41162006-08-19 21:38:49 +10001642 test_hash_speed("wp256", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001643 if (mode > 300 && mode < 400) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001644 /* fall through */
Michal Ludvige8057922006-05-30 22:04:19 +10001645 case 308:
Herbert Xue9d41162006-08-19 21:38:49 +10001646 test_hash_speed("wp384", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001647 if (mode > 300 && mode < 400) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001648 /* fall through */
Michal Ludvige8057922006-05-30 22:04:19 +10001649 case 309:
Herbert Xue9d41162006-08-19 21:38:49 +10001650 test_hash_speed("wp512", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001651 if (mode > 300 && mode < 400) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001652 /* fall through */
Michal Ludvige8057922006-05-30 22:04:19 +10001653 case 310:
Herbert Xue9d41162006-08-19 21:38:49 +10001654 test_hash_speed("tgr128", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001655 if (mode > 300 && mode < 400) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001656 /* fall through */
Michal Ludvige8057922006-05-30 22:04:19 +10001657 case 311:
Herbert Xue9d41162006-08-19 21:38:49 +10001658 test_hash_speed("tgr160", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001659 if (mode > 300 && mode < 400) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001660 /* fall through */
Michal Ludvige8057922006-05-30 22:04:19 +10001661 case 312:
Herbert Xue9d41162006-08-19 21:38:49 +10001662 test_hash_speed("tgr192", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001663 if (mode > 300 && mode < 400) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001664 /* fall through */
Jonathan Lynchcd12fb902007-11-10 20:08:25 +08001665 case 313:
1666 test_hash_speed("sha224", sec, generic_hash_speed_template);
1667 if (mode > 300 && mode < 400) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001668 /* fall through */
Adrian-Ken Rueegseggerfd4adf12008-05-07 22:16:36 +08001669 case 314:
1670 test_hash_speed("rmd128", sec, generic_hash_speed_template);
1671 if (mode > 300 && mode < 400) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001672 /* fall through */
Adrian-Ken Rueegseggerfd4adf12008-05-07 22:16:36 +08001673 case 315:
1674 test_hash_speed("rmd160", sec, generic_hash_speed_template);
1675 if (mode > 300 && mode < 400) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001676 /* fall through */
Adrian-Ken Rueegsegger2998db32008-05-09 21:29:35 +08001677 case 316:
1678 test_hash_speed("rmd256", sec, generic_hash_speed_template);
1679 if (mode > 300 && mode < 400) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001680 /* fall through */
Adrian-Ken Rueegsegger2998db32008-05-09 21:29:35 +08001681 case 317:
1682 test_hash_speed("rmd320", sec, generic_hash_speed_template);
1683 if (mode > 300 && mode < 400) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001684 /* fall through */
Huang Ying18bcc912010-03-10 18:30:32 +08001685 case 318:
1686 test_hash_speed("ghash-generic", sec, hash_speed_template_16);
1687 if (mode > 300 && mode < 400) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001688 /* fall through */
Tim Chene3899e42012-09-27 15:44:24 -07001689 case 319:
1690 test_hash_speed("crc32c", sec, generic_hash_speed_template);
1691 if (mode > 300 && mode < 400) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001692 /* fall through */
Herbert Xu684115212013-09-07 12:56:26 +10001693 case 320:
1694 test_hash_speed("crct10dif", sec, generic_hash_speed_template);
1695 if (mode > 300 && mode < 400) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001696 /* fall through */
Martin Willi2dce0632015-07-16 19:13:59 +02001697 case 321:
1698 test_hash_speed("poly1305", sec, poly1305_speed_template);
1699 if (mode > 300 && mode < 400) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001700 /* fall through */
raveendra padasalagi79cc6ab2016-06-17 10:30:36 +05301701 case 322:
1702 test_hash_speed("sha3-224", sec, generic_hash_speed_template);
1703 if (mode > 300 && mode < 400) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001704 /* fall through */
raveendra padasalagi79cc6ab2016-06-17 10:30:36 +05301705 case 323:
1706 test_hash_speed("sha3-256", sec, generic_hash_speed_template);
1707 if (mode > 300 && mode < 400) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001708 /* fall through */
raveendra padasalagi79cc6ab2016-06-17 10:30:36 +05301709 case 324:
1710 test_hash_speed("sha3-384", sec, generic_hash_speed_template);
1711 if (mode > 300 && mode < 400) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001712 /* fall through */
raveendra padasalagi79cc6ab2016-06-17 10:30:36 +05301713 case 325:
1714 test_hash_speed("sha3-512", sec, generic_hash_speed_template);
1715 if (mode > 300 && mode < 400) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001716 /* fall through */
Gilad Ben-Yossefb7e27532017-08-21 13:51:29 +03001717 case 326:
1718 test_hash_speed("sm3", sec, generic_hash_speed_template);
1719 if (mode > 300 && mode < 400) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001720 /* fall through */
Michal Ludvige8057922006-05-30 22:04:19 +10001721 case 399:
1722 break;
1723
David S. Millerbeb63da2010-05-19 14:11:21 +10001724 case 400:
Herbert Xu86068132014-12-04 16:43:29 +08001725 if (alg) {
1726 test_ahash_speed(alg, sec, generic_hash_speed_template);
1727 break;
1728 }
David S. Millerbeb63da2010-05-19 14:11:21 +10001729 /* fall through */
David S. Millerbeb63da2010-05-19 14:11:21 +10001730 case 401:
1731 test_ahash_speed("md4", sec, generic_hash_speed_template);
1732 if (mode > 400 && mode < 500) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001733 /* fall through */
David S. Millerbeb63da2010-05-19 14:11:21 +10001734 case 402:
1735 test_ahash_speed("md5", sec, generic_hash_speed_template);
1736 if (mode > 400 && mode < 500) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001737 /* fall through */
David S. Millerbeb63da2010-05-19 14:11:21 +10001738 case 403:
1739 test_ahash_speed("sha1", sec, generic_hash_speed_template);
1740 if (mode > 400 && mode < 500) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001741 /* fall through */
David S. Millerbeb63da2010-05-19 14:11:21 +10001742 case 404:
1743 test_ahash_speed("sha256", sec, generic_hash_speed_template);
1744 if (mode > 400 && mode < 500) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001745 /* fall through */
David S. Millerbeb63da2010-05-19 14:11:21 +10001746 case 405:
1747 test_ahash_speed("sha384", sec, generic_hash_speed_template);
1748 if (mode > 400 && mode < 500) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001749 /* fall through */
David S. Millerbeb63da2010-05-19 14:11:21 +10001750 case 406:
1751 test_ahash_speed("sha512", sec, generic_hash_speed_template);
1752 if (mode > 400 && mode < 500) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001753 /* fall through */
David S. Millerbeb63da2010-05-19 14:11:21 +10001754 case 407:
1755 test_ahash_speed("wp256", sec, generic_hash_speed_template);
1756 if (mode > 400 && mode < 500) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001757 /* fall through */
David S. Millerbeb63da2010-05-19 14:11:21 +10001758 case 408:
1759 test_ahash_speed("wp384", sec, generic_hash_speed_template);
1760 if (mode > 400 && mode < 500) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001761 /* fall through */
David S. Millerbeb63da2010-05-19 14:11:21 +10001762 case 409:
1763 test_ahash_speed("wp512", sec, generic_hash_speed_template);
1764 if (mode > 400 && mode < 500) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001765 /* fall through */
David S. Millerbeb63da2010-05-19 14:11:21 +10001766 case 410:
1767 test_ahash_speed("tgr128", sec, generic_hash_speed_template);
1768 if (mode > 400 && mode < 500) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001769 /* fall through */
David S. Millerbeb63da2010-05-19 14:11:21 +10001770 case 411:
1771 test_ahash_speed("tgr160", sec, generic_hash_speed_template);
1772 if (mode > 400 && mode < 500) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001773 /* fall through */
David S. Millerbeb63da2010-05-19 14:11:21 +10001774 case 412:
1775 test_ahash_speed("tgr192", sec, generic_hash_speed_template);
1776 if (mode > 400 && mode < 500) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001777 /* fall through */
David S. Millerbeb63da2010-05-19 14:11:21 +10001778 case 413:
1779 test_ahash_speed("sha224", sec, generic_hash_speed_template);
1780 if (mode > 400 && mode < 500) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001781 /* fall through */
David S. Millerbeb63da2010-05-19 14:11:21 +10001782 case 414:
1783 test_ahash_speed("rmd128", sec, generic_hash_speed_template);
1784 if (mode > 400 && mode < 500) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001785 /* fall through */
David S. Millerbeb63da2010-05-19 14:11:21 +10001786 case 415:
1787 test_ahash_speed("rmd160", sec, generic_hash_speed_template);
1788 if (mode > 400 && mode < 500) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001789 /* fall through */
David S. Millerbeb63da2010-05-19 14:11:21 +10001790 case 416:
1791 test_ahash_speed("rmd256", sec, generic_hash_speed_template);
1792 if (mode > 400 && mode < 500) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001793 /* fall through */
David S. Millerbeb63da2010-05-19 14:11:21 +10001794 case 417:
1795 test_ahash_speed("rmd320", sec, generic_hash_speed_template);
1796 if (mode > 400 && mode < 500) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001797 /* fall through */
raveendra padasalagi79cc6ab2016-06-17 10:30:36 +05301798 case 418:
1799 test_ahash_speed("sha3-224", sec, generic_hash_speed_template);
1800 if (mode > 400 && mode < 500) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001801 /* fall through */
raveendra padasalagi79cc6ab2016-06-17 10:30:36 +05301802 case 419:
1803 test_ahash_speed("sha3-256", sec, generic_hash_speed_template);
1804 if (mode > 400 && mode < 500) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001805 /* fall through */
raveendra padasalagi79cc6ab2016-06-17 10:30:36 +05301806 case 420:
1807 test_ahash_speed("sha3-384", sec, generic_hash_speed_template);
1808 if (mode > 400 && mode < 500) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001809 /* fall through */
raveendra padasalagi79cc6ab2016-06-17 10:30:36 +05301810 case 421:
1811 test_ahash_speed("sha3-512", sec, generic_hash_speed_template);
1812 if (mode > 400 && mode < 500) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001813 /* fall through */
Megha Dey087bcd22016-06-23 18:40:47 -07001814 case 422:
1815 test_mb_ahash_speed("sha1", sec, generic_hash_speed_template);
1816 if (mode > 400 && mode < 500) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001817 /* fall through */
Megha Dey087bcd22016-06-23 18:40:47 -07001818 case 423:
1819 test_mb_ahash_speed("sha256", sec, generic_hash_speed_template);
1820 if (mode > 400 && mode < 500) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001821 /* fall through */
Megha Dey14009c42016-06-27 10:20:09 -07001822 case 424:
1823 test_mb_ahash_speed("sha512", sec, generic_hash_speed_template);
1824 if (mode > 400 && mode < 500) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001825 /* fall through */
Gilad Ben-Yossefb7e27532017-08-21 13:51:29 +03001826 case 425:
1827 test_mb_ahash_speed("sm3", sec, generic_hash_speed_template);
1828 if (mode > 400 && mode < 500) break;
Gustavo A. R. Silva59517222017-10-09 14:43:21 -05001829 /* fall through */
David S. Millerbeb63da2010-05-19 14:11:21 +10001830 case 499:
1831 break;
1832
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +03001833 case 500:
1834 test_acipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
1835 speed_template_16_24_32);
1836 test_acipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
1837 speed_template_16_24_32);
1838 test_acipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
1839 speed_template_16_24_32);
1840 test_acipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
1841 speed_template_16_24_32);
1842 test_acipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
1843 speed_template_32_40_48);
1844 test_acipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
1845 speed_template_32_40_48);
1846 test_acipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
Horia Geantăb66ad0b2017-07-19 19:40:32 +03001847 speed_template_32_64);
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +03001848 test_acipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
Horia Geantăb66ad0b2017-07-19 19:40:32 +03001849 speed_template_32_64);
Herbert Xu1503a242016-06-29 18:04:14 +08001850 test_acipher_speed("cts(cbc(aes))", ENCRYPT, sec, NULL, 0,
1851 speed_template_16_24_32);
1852 test_acipher_speed("cts(cbc(aes))", DECRYPT, sec, NULL, 0,
1853 speed_template_16_24_32);
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +03001854 test_acipher_speed("ctr(aes)", ENCRYPT, sec, NULL, 0,
1855 speed_template_16_24_32);
1856 test_acipher_speed("ctr(aes)", DECRYPT, sec, NULL, 0,
1857 speed_template_16_24_32);
Nicolas Royerde1975332012-07-01 19:19:47 +02001858 test_acipher_speed("cfb(aes)", ENCRYPT, sec, NULL, 0,
1859 speed_template_16_24_32);
1860 test_acipher_speed("cfb(aes)", DECRYPT, sec, NULL, 0,
1861 speed_template_16_24_32);
1862 test_acipher_speed("ofb(aes)", ENCRYPT, sec, NULL, 0,
1863 speed_template_16_24_32);
1864 test_acipher_speed("ofb(aes)", DECRYPT, sec, NULL, 0,
1865 speed_template_16_24_32);
Jussi Kivilinna69d31502012-12-28 12:04:58 +02001866 test_acipher_speed("rfc3686(ctr(aes))", ENCRYPT, sec, NULL, 0,
1867 speed_template_20_28_36);
1868 test_acipher_speed("rfc3686(ctr(aes))", DECRYPT, sec, NULL, 0,
1869 speed_template_20_28_36);
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +03001870 break;
1871
1872 case 501:
1873 test_acipher_speed("ecb(des3_ede)", ENCRYPT, sec,
1874 des3_speed_template, DES3_SPEED_VECTORS,
1875 speed_template_24);
1876 test_acipher_speed("ecb(des3_ede)", DECRYPT, sec,
1877 des3_speed_template, DES3_SPEED_VECTORS,
1878 speed_template_24);
1879 test_acipher_speed("cbc(des3_ede)", ENCRYPT, sec,
1880 des3_speed_template, DES3_SPEED_VECTORS,
1881 speed_template_24);
1882 test_acipher_speed("cbc(des3_ede)", DECRYPT, sec,
1883 des3_speed_template, DES3_SPEED_VECTORS,
1884 speed_template_24);
Nicolas Royerde1975332012-07-01 19:19:47 +02001885 test_acipher_speed("cfb(des3_ede)", ENCRYPT, sec,
1886 des3_speed_template, DES3_SPEED_VECTORS,
1887 speed_template_24);
1888 test_acipher_speed("cfb(des3_ede)", DECRYPT, sec,
1889 des3_speed_template, DES3_SPEED_VECTORS,
1890 speed_template_24);
1891 test_acipher_speed("ofb(des3_ede)", ENCRYPT, sec,
1892 des3_speed_template, DES3_SPEED_VECTORS,
1893 speed_template_24);
1894 test_acipher_speed("ofb(des3_ede)", DECRYPT, sec,
1895 des3_speed_template, DES3_SPEED_VECTORS,
1896 speed_template_24);
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +03001897 break;
1898
1899 case 502:
1900 test_acipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
1901 speed_template_8);
1902 test_acipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
1903 speed_template_8);
1904 test_acipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
1905 speed_template_8);
1906 test_acipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
1907 speed_template_8);
Nicolas Royerde1975332012-07-01 19:19:47 +02001908 test_acipher_speed("cfb(des)", ENCRYPT, sec, NULL, 0,
1909 speed_template_8);
1910 test_acipher_speed("cfb(des)", DECRYPT, sec, NULL, 0,
1911 speed_template_8);
1912 test_acipher_speed("ofb(des)", ENCRYPT, sec, NULL, 0,
1913 speed_template_8);
1914 test_acipher_speed("ofb(des)", DECRYPT, sec, NULL, 0,
1915 speed_template_8);
Jussi Kivilinna3f3baf32011-10-18 00:02:58 +03001916 break;
1917
Jussi Kivilinna7fb7fe42011-10-18 00:03:03 +03001918 case 503:
1919 test_acipher_speed("ecb(serpent)", ENCRYPT, sec, NULL, 0,
1920 speed_template_16_32);
1921 test_acipher_speed("ecb(serpent)", DECRYPT, sec, NULL, 0,
1922 speed_template_16_32);
1923 test_acipher_speed("cbc(serpent)", ENCRYPT, sec, NULL, 0,
1924 speed_template_16_32);
1925 test_acipher_speed("cbc(serpent)", DECRYPT, sec, NULL, 0,
1926 speed_template_16_32);
1927 test_acipher_speed("ctr(serpent)", ENCRYPT, sec, NULL, 0,
1928 speed_template_16_32);
1929 test_acipher_speed("ctr(serpent)", DECRYPT, sec, NULL, 0,
1930 speed_template_16_32);
Jussi Kivilinna87aae4b2011-10-18 13:32:39 +03001931 test_acipher_speed("lrw(serpent)", ENCRYPT, sec, NULL, 0,
1932 speed_template_32_48);
1933 test_acipher_speed("lrw(serpent)", DECRYPT, sec, NULL, 0,
1934 speed_template_32_48);
Jussi Kivilinna5209c072011-10-18 13:33:22 +03001935 test_acipher_speed("xts(serpent)", ENCRYPT, sec, NULL, 0,
1936 speed_template_32_64);
1937 test_acipher_speed("xts(serpent)", DECRYPT, sec, NULL, 0,
1938 speed_template_32_64);
Jussi Kivilinna7fb7fe42011-10-18 00:03:03 +03001939 break;
1940
Johannes Goetzfried107778b2012-05-28 15:54:24 +02001941 case 504:
1942 test_acipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
1943 speed_template_16_24_32);
1944 test_acipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
1945 speed_template_16_24_32);
1946 test_acipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
1947 speed_template_16_24_32);
1948 test_acipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
1949 speed_template_16_24_32);
1950 test_acipher_speed("ctr(twofish)", ENCRYPT, sec, NULL, 0,
1951 speed_template_16_24_32);
1952 test_acipher_speed("ctr(twofish)", DECRYPT, sec, NULL, 0,
1953 speed_template_16_24_32);
1954 test_acipher_speed("lrw(twofish)", ENCRYPT, sec, NULL, 0,
1955 speed_template_32_40_48);
1956 test_acipher_speed("lrw(twofish)", DECRYPT, sec, NULL, 0,
1957 speed_template_32_40_48);
1958 test_acipher_speed("xts(twofish)", ENCRYPT, sec, NULL, 0,
1959 speed_template_32_48_64);
1960 test_acipher_speed("xts(twofish)", DECRYPT, sec, NULL, 0,
1961 speed_template_32_48_64);
1962 break;
1963
Jussi Kivilinna31b4cd292012-06-12 16:52:04 +08001964 case 505:
1965 test_acipher_speed("ecb(arc4)", ENCRYPT, sec, NULL, 0,
1966 speed_template_8);
1967 break;
1968
Johannes Goetzfrieda2c58262012-07-11 19:37:21 +02001969 case 506:
1970 test_acipher_speed("ecb(cast5)", ENCRYPT, sec, NULL, 0,
1971 speed_template_8_16);
1972 test_acipher_speed("ecb(cast5)", DECRYPT, sec, NULL, 0,
1973 speed_template_8_16);
1974 test_acipher_speed("cbc(cast5)", ENCRYPT, sec, NULL, 0,
1975 speed_template_8_16);
1976 test_acipher_speed("cbc(cast5)", DECRYPT, sec, NULL, 0,
1977 speed_template_8_16);
1978 test_acipher_speed("ctr(cast5)", ENCRYPT, sec, NULL, 0,
1979 speed_template_8_16);
1980 test_acipher_speed("ctr(cast5)", DECRYPT, sec, NULL, 0,
1981 speed_template_8_16);
1982 break;
1983
Johannes Goetzfried9b8b0402012-07-11 19:38:29 +02001984 case 507:
1985 test_acipher_speed("ecb(cast6)", ENCRYPT, sec, NULL, 0,
1986 speed_template_16_32);
1987 test_acipher_speed("ecb(cast6)", DECRYPT, sec, NULL, 0,
1988 speed_template_16_32);
1989 test_acipher_speed("cbc(cast6)", ENCRYPT, sec, NULL, 0,
1990 speed_template_16_32);
1991 test_acipher_speed("cbc(cast6)", DECRYPT, sec, NULL, 0,
1992 speed_template_16_32);
1993 test_acipher_speed("ctr(cast6)", ENCRYPT, sec, NULL, 0,
1994 speed_template_16_32);
1995 test_acipher_speed("ctr(cast6)", DECRYPT, sec, NULL, 0,
1996 speed_template_16_32);
1997 test_acipher_speed("lrw(cast6)", ENCRYPT, sec, NULL, 0,
1998 speed_template_32_48);
1999 test_acipher_speed("lrw(cast6)", DECRYPT, sec, NULL, 0,
2000 speed_template_32_48);
2001 test_acipher_speed("xts(cast6)", ENCRYPT, sec, NULL, 0,
2002 speed_template_32_64);
2003 test_acipher_speed("xts(cast6)", DECRYPT, sec, NULL, 0,
2004 speed_template_32_64);
2005 break;
2006
Jussi Kivilinnabf9c5182012-10-26 14:48:51 +03002007 case 508:
2008 test_acipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
2009 speed_template_16_32);
2010 test_acipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
2011 speed_template_16_32);
2012 test_acipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
2013 speed_template_16_32);
2014 test_acipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
2015 speed_template_16_32);
2016 test_acipher_speed("ctr(camellia)", ENCRYPT, sec, NULL, 0,
2017 speed_template_16_32);
2018 test_acipher_speed("ctr(camellia)", DECRYPT, sec, NULL, 0,
2019 speed_template_16_32);
2020 test_acipher_speed("lrw(camellia)", ENCRYPT, sec, NULL, 0,
2021 speed_template_32_48);
2022 test_acipher_speed("lrw(camellia)", DECRYPT, sec, NULL, 0,
2023 speed_template_32_48);
2024 test_acipher_speed("xts(camellia)", ENCRYPT, sec, NULL, 0,
2025 speed_template_32_64);
2026 test_acipher_speed("xts(camellia)", DECRYPT, sec, NULL, 0,
2027 speed_template_32_64);
2028 break;
2029
Jussi Kivilinnaad8b7c32013-04-13 13:46:40 +03002030 case 509:
2031 test_acipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
2032 speed_template_8_32);
2033 test_acipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
2034 speed_template_8_32);
2035 test_acipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
2036 speed_template_8_32);
2037 test_acipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
2038 speed_template_8_32);
2039 test_acipher_speed("ctr(blowfish)", ENCRYPT, sec, NULL, 0,
2040 speed_template_8_32);
2041 test_acipher_speed("ctr(blowfish)", DECRYPT, sec, NULL, 0,
2042 speed_template_8_32);
2043 break;
2044
Linus Torvalds1da177e2005-04-16 15:20:36 -07002045 case 1000:
2046 test_available();
2047 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002048 }
Jarod Wilson4e033a62009-05-27 15:10:21 +10002049
2050 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002051}
2052
Kamalesh Babulal3af5b902008-04-05 21:00:57 +08002053static int __init tcrypt_mod_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002054{
Mikko Herranene3a4ea42007-11-26 22:12:07 +08002055 int err = -ENOMEM;
Herbert Xuf139cfa2008-07-31 12:23:53 +08002056 int i;
Mikko Herranene3a4ea42007-11-26 22:12:07 +08002057
Herbert Xuf139cfa2008-07-31 12:23:53 +08002058 for (i = 0; i < TVMEMSIZE; i++) {
2059 tvmem[i] = (void *)__get_free_page(GFP_KERNEL);
2060 if (!tvmem[i])
2061 goto err_free_tv;
2062 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002063
Herbert Xu86068132014-12-04 16:43:29 +08002064 err = do_test(alg, type, mask, mode);
Steffen Klasserta873a5f2009-06-19 19:46:53 +08002065
Jarod Wilson4e033a62009-05-27 15:10:21 +10002066 if (err) {
2067 printk(KERN_ERR "tcrypt: one or more tests failed!\n");
2068 goto err_free_tv;
Rabin Vincent76512f22017-01-18 14:54:05 +01002069 } else {
2070 pr_debug("all tests passed\n");
Jarod Wilson4e033a62009-05-27 15:10:21 +10002071 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002072
Jarod Wilson4e033a62009-05-27 15:10:21 +10002073 /* We intentionaly return -EAGAIN to prevent keeping the module,
2074 * unless we're running in fips mode. It does all its work from
2075 * init() and doesn't offer any runtime functionality, but in
2076 * the fips case, checking for a successful load is helpful.
Michal Ludvig14fdf472006-05-30 14:49:38 +10002077 * => we don't need it in the memory, do we?
2078 * -- mludvig
2079 */
Jarod Wilson4e033a62009-05-27 15:10:21 +10002080 if (!fips_enabled)
2081 err = -EAGAIN;
Mikko Herranene3a4ea42007-11-26 22:12:07 +08002082
Herbert Xuf139cfa2008-07-31 12:23:53 +08002083err_free_tv:
2084 for (i = 0; i < TVMEMSIZE && tvmem[i]; i++)
2085 free_page((unsigned long)tvmem[i]);
Mikko Herranene3a4ea42007-11-26 22:12:07 +08002086
2087 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002088}
2089
2090/*
2091 * If an init function is provided, an exit function must also be provided
2092 * to allow module unload.
2093 */
Kamalesh Babulal3af5b902008-04-05 21:00:57 +08002094static void __exit tcrypt_mod_fini(void) { }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002095
Kamalesh Babulal3af5b902008-04-05 21:00:57 +08002096module_init(tcrypt_mod_init);
2097module_exit(tcrypt_mod_fini);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002098
Steffen Klasserta873a5f2009-06-19 19:46:53 +08002099module_param(alg, charp, 0);
2100module_param(type, uint, 0);
Herbert Xu7be380f2009-07-14 16:06:54 +08002101module_param(mask, uint, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002102module_param(mode, int, 0);
Harald Welteebfd9bc2005-06-22 13:27:23 -07002103module_param(sec, uint, 0);
Herbert Xu6a179442005-06-22 13:29:03 -07002104MODULE_PARM_DESC(sec, "Length in seconds of speed tests "
2105 "(defaults to zero which uses CPU cycles instead)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002106
2107MODULE_LICENSE("GPL");
2108MODULE_DESCRIPTION("Quick & dirty crypto testing module");
2109MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");