]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - crypto/tcrypt.c
Linux 4.3-rc2
[mirror_ubuntu-bionic-kernel.git] / crypto / tcrypt.c
CommitLineData
ef2736fc 1/*
1da177e4
LT
2 * 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>
e3a4ea4f 9 * Copyright (c) 2007 Nokia Siemens Networks
1da177e4 10 *
69435b94
AH
11 * 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 *
1da177e4
LT
18 * 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
ef2736fc 20 * Software Foundation; either version 2 of the License, or (at your option)
1da177e4
LT
21 * any later version.
22 *
1da177e4
LT
23 */
24
1ce5a04d 25#include <crypto/aead.h>
18e33e6d 26#include <crypto/hash.h>
cba83564 27#include <linux/err.h>
daf0944c 28#include <linux/fips.h>
1da177e4 29#include <linux/init.h>
5a0e3ad6 30#include <linux/gfp.h>
1da177e4 31#include <linux/module.h>
378f058c 32#include <linux/scatterlist.h>
1da177e4 33#include <linux/string.h>
1da177e4 34#include <linux/moduleparam.h>
ebfd9bcf 35#include <linux/jiffies.h>
6a17944c
HX
36#include <linux/timex.h>
37#include <linux/interrupt.h>
1da177e4
LT
38#include "tcrypt.h"
39
40/*
f139cfa7 41 * Need slab memory for testing (size in number of pages).
1da177e4 42 */
f139cfa7 43#define TVMEMSIZE 4
1da177e4
LT
44
45/*
da7f033d 46* Used by test_cipher_speed()
1da177e4
LT
47*/
48#define ENCRYPT 1
49#define DECRYPT 0
1da177e4 50
263a8df0
LC
51/*
52 * return a string with the driver name
53 */
54#define get_driver_name(tfm_type, tfm) crypto_tfm_alg_driver_name(tfm_type ## _tfm(tfm))
55
ebfd9bcf
HW
56/*
57 * Used by test_cipher_speed()
58 */
6a17944c 59static unsigned int sec;
ebfd9bcf 60
a873a5f1
SK
61static char *alg = NULL;
62static u32 type;
7be380f7 63static u32 mask;
1da177e4 64static int mode;
f139cfa7 65static char *tvmem[TVMEMSIZE];
1da177e4
LT
66
67static char *check[] = {
cd12fb90
JL
68 "des", "md5", "des3_ede", "rot13", "sha1", "sha224", "sha256",
69 "blowfish", "twofish", "serpent", "sha384", "sha512", "md4", "aes",
70 "cast6", "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
90831639 71 "khazad", "wp512", "wp384", "wp256", "tnepres", "xeta", "fcrypt",
2998db37 72 "camellia", "seed", "salsa20", "rmd128", "rmd160", "rmd256", "rmd320",
0c01aed5 73 "lzo", "cts", "zlib", NULL
1da177e4
LT
74};
75
1425d2d1
VL
76struct tcrypt_result {
77 struct completion completion;
78 int err;
79};
80
81static void tcrypt_complete(struct crypto_async_request *req, int err)
82{
83 struct tcrypt_result *res = req->data;
84
85 if (err == -EINPROGRESS)
86 return;
87
88 res->err = err;
89 complete(&res->completion);
90}
91
f139cfa7 92static int test_cipher_jiffies(struct blkcipher_desc *desc, int enc,
3e3dc25f 93 struct scatterlist *sg, int blen, int secs)
6a17944c 94{
6a17944c
HX
95 unsigned long start, end;
96 int bcount;
97 int ret;
98
3e3dc25f 99 for (start = jiffies, end = start + secs * HZ, bcount = 0;
6a17944c
HX
100 time_before(jiffies, end); bcount++) {
101 if (enc)
cba83564 102 ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
6a17944c 103 else
cba83564 104 ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
6a17944c
HX
105
106 if (ret)
107 return ret;
108 }
109
110 printk("%d operations in %d seconds (%ld bytes)\n",
3e3dc25f 111 bcount, secs, (long)bcount * blen);
6a17944c
HX
112 return 0;
113}
114
f139cfa7
HX
115static int test_cipher_cycles(struct blkcipher_desc *desc, int enc,
116 struct scatterlist *sg, int blen)
6a17944c 117{
6a17944c
HX
118 unsigned long cycles = 0;
119 int ret = 0;
120 int i;
121
6a17944c
HX
122 local_irq_disable();
123
124 /* Warm-up run. */
125 for (i = 0; i < 4; i++) {
126 if (enc)
cba83564 127 ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
6a17944c 128 else
cba83564 129 ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
6a17944c
HX
130
131 if (ret)
132 goto out;
133 }
134
135 /* The real thing. */
136 for (i = 0; i < 8; i++) {
137 cycles_t start, end;
138
139 start = get_cycles();
140 if (enc)
cba83564 141 ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
6a17944c 142 else
cba83564 143 ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
6a17944c
HX
144 end = get_cycles();
145
146 if (ret)
147 goto out;
148
149 cycles += end - start;
150 }
151
152out:
153 local_irq_enable();
6a17944c
HX
154
155 if (ret == 0)
156 printk("1 operation in %lu cycles (%d bytes)\n",
157 (cycles + 4) / 8, blen);
158
159 return ret;
160}
161
1425d2d1
VL
162static inline int do_one_aead_op(struct aead_request *req, int ret)
163{
164 if (ret == -EINPROGRESS || ret == -EBUSY) {
165 struct tcrypt_result *tr = req->base.data;
166
167 ret = wait_for_completion_interruptible(&tr->completion);
168 if (!ret)
169 ret = tr->err;
170 reinit_completion(&tr->completion);
171 }
172
173 return ret;
174}
175
53f52d7a 176static int test_aead_jiffies(struct aead_request *req, int enc,
3e3dc25f 177 int blen, int secs)
53f52d7a
TC
178{
179 unsigned long start, end;
180 int bcount;
181 int ret;
182
3e3dc25f 183 for (start = jiffies, end = start + secs * HZ, bcount = 0;
53f52d7a
TC
184 time_before(jiffies, end); bcount++) {
185 if (enc)
1425d2d1 186 ret = do_one_aead_op(req, crypto_aead_encrypt(req));
53f52d7a 187 else
1425d2d1 188 ret = do_one_aead_op(req, crypto_aead_decrypt(req));
53f52d7a
TC
189
190 if (ret)
191 return ret;
192 }
193
194 printk("%d operations in %d seconds (%ld bytes)\n",
3e3dc25f 195 bcount, secs, (long)bcount * blen);
53f52d7a
TC
196 return 0;
197}
198
199static int test_aead_cycles(struct aead_request *req, int enc, int blen)
200{
201 unsigned long cycles = 0;
202 int ret = 0;
203 int i;
204
205 local_irq_disable();
206
207 /* Warm-up run. */
208 for (i = 0; i < 4; i++) {
209 if (enc)
1425d2d1 210 ret = do_one_aead_op(req, crypto_aead_encrypt(req));
53f52d7a 211 else
1425d2d1 212 ret = do_one_aead_op(req, crypto_aead_decrypt(req));
53f52d7a
TC
213
214 if (ret)
215 goto out;
216 }
217
218 /* The real thing. */
219 for (i = 0; i < 8; i++) {
220 cycles_t start, end;
221
222 start = get_cycles();
223 if (enc)
1425d2d1 224 ret = do_one_aead_op(req, crypto_aead_encrypt(req));
53f52d7a 225 else
1425d2d1 226 ret = do_one_aead_op(req, crypto_aead_decrypt(req));
53f52d7a
TC
227 end = get_cycles();
228
229 if (ret)
230 goto out;
231
232 cycles += end - start;
233 }
234
235out:
236 local_irq_enable();
237
238 if (ret == 0)
239 printk("1 operation in %lu cycles (%d bytes)\n",
240 (cycles + 4) / 8, blen);
241
242 return ret;
243}
244
d5dc3927 245static u32 block_sizes[] = { 16, 64, 256, 1024, 8192, 0 };
53f52d7a
TC
246static u32 aead_sizes[] = { 16, 64, 256, 512, 1024, 2048, 4096, 8192, 0 };
247
248#define XBUFSIZE 8
249#define MAX_IVLEN 32
250
251static int testmgr_alloc_buf(char *buf[XBUFSIZE])
252{
253 int i;
254
255 for (i = 0; i < XBUFSIZE; i++) {
256 buf[i] = (void *)__get_free_page(GFP_KERNEL);
257 if (!buf[i])
258 goto err_free_buf;
259 }
260
261 return 0;
262
263err_free_buf:
264 while (i-- > 0)
265 free_page((unsigned long)buf[i]);
266
267 return -ENOMEM;
268}
269
270static void testmgr_free_buf(char *buf[XBUFSIZE])
271{
272 int i;
273
274 for (i = 0; i < XBUFSIZE; i++)
275 free_page((unsigned long)buf[i]);
276}
277
278static void sg_init_aead(struct scatterlist *sg, char *xbuf[XBUFSIZE],
279 unsigned int buflen)
280{
281 int np = (buflen + PAGE_SIZE - 1)/PAGE_SIZE;
282 int k, rem;
283
53f52d7a
TC
284 if (np > XBUFSIZE) {
285 rem = PAGE_SIZE;
286 np = XBUFSIZE;
c4768993
CS
287 } else {
288 rem = buflen % PAGE_SIZE;
53f52d7a 289 }
c4768993 290
31267270 291 sg_init_table(sg, np + 1);
c4768993
CS
292 np--;
293 for (k = 0; k < np; k++)
31267270 294 sg_set_buf(&sg[k + 1], xbuf[k], PAGE_SIZE);
c4768993 295
31267270 296 sg_set_buf(&sg[k + 1], xbuf[k], rem);
53f52d7a
TC
297}
298
3e3dc25f 299static void test_aead_speed(const char *algo, int enc, unsigned int secs,
53f52d7a
TC
300 struct aead_speed_template *template,
301 unsigned int tcount, u8 authsize,
302 unsigned int aad_size, u8 *keysize)
303{
304 unsigned int i, j;
305 struct crypto_aead *tfm;
306 int ret = -ENOMEM;
307 const char *key;
308 struct aead_request *req;
309 struct scatterlist *sg;
53f52d7a
TC
310 struct scatterlist *sgout;
311 const char *e;
312 void *assoc;
96692a73 313 char *iv;
53f52d7a
TC
314 char *xbuf[XBUFSIZE];
315 char *xoutbuf[XBUFSIZE];
316 char *axbuf[XBUFSIZE];
317 unsigned int *b_size;
318 unsigned int iv_len;
1425d2d1 319 struct tcrypt_result result;
53f52d7a 320
96692a73
CS
321 iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
322 if (!iv)
323 return;
324
ac5f863f
CE
325 if (aad_size >= PAGE_SIZE) {
326 pr_err("associate data length (%u) too big\n", aad_size);
96692a73 327 goto out_noxbuf;
ac5f863f
CE
328 }
329
53f52d7a
TC
330 if (enc == ENCRYPT)
331 e = "encryption";
332 else
333 e = "decryption";
334
335 if (testmgr_alloc_buf(xbuf))
336 goto out_noxbuf;
337 if (testmgr_alloc_buf(axbuf))
338 goto out_noaxbuf;
339 if (testmgr_alloc_buf(xoutbuf))
340 goto out_nooutbuf;
341
a3f2185a 342 sg = kmalloc(sizeof(*sg) * 9 * 2, GFP_KERNEL);
53f52d7a
TC
343 if (!sg)
344 goto out_nosg;
a3f2185a 345 sgout = &sg[9];
53f52d7a 346
5e4b8c1f 347 tfm = crypto_alloc_aead(algo, 0, 0);
53f52d7a
TC
348
349 if (IS_ERR(tfm)) {
350 pr_err("alg: aead: Failed to load transform for %s: %ld\n", algo,
351 PTR_ERR(tfm));
a2ea6ed6 352 goto out_notfm;
53f52d7a
TC
353 }
354
1425d2d1 355 init_completion(&result.completion);
263a8df0
LC
356 printk(KERN_INFO "\ntesting speed of %s (%s) %s\n", algo,
357 get_driver_name(crypto_aead, tfm), e);
358
53f52d7a
TC
359 req = aead_request_alloc(tfm, GFP_KERNEL);
360 if (!req) {
361 pr_err("alg: aead: Failed to allocate request for %s\n",
362 algo);
6af1f93e 363 goto out_noreq;
53f52d7a
TC
364 }
365
1425d2d1
VL
366 aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
367 tcrypt_complete, &result);
368
53f52d7a
TC
369 i = 0;
370 do {
371 b_size = aead_sizes;
372 do {
373 assoc = axbuf[0];
ac5f863f 374 memset(assoc, 0xff, aad_size);
53f52d7a
TC
375
376 if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
377 pr_err("template (%u) too big for tvmem (%lu)\n",
378 *keysize + *b_size,
379 TVMEMSIZE * PAGE_SIZE);
380 goto out;
381 }
382
383 key = tvmem[0];
384 for (j = 0; j < tcount; j++) {
385 if (template[j].klen == *keysize) {
386 key = template[j].key;
387 break;
388 }
389 }
390 ret = crypto_aead_setkey(tfm, key, *keysize);
391 ret = crypto_aead_setauthsize(tfm, authsize);
392
393 iv_len = crypto_aead_ivsize(tfm);
394 if (iv_len)
96692a73 395 memset(iv, 0xff, iv_len);
53f52d7a
TC
396
397 crypto_aead_clear_flags(tfm, ~0);
398 printk(KERN_INFO "test %u (%d bit key, %d byte blocks): ",
399 i, *keysize * 8, *b_size);
400
401
402 memset(tvmem[0], 0xff, PAGE_SIZE);
403
404 if (ret) {
405 pr_err("setkey() failed flags=%x\n",
406 crypto_aead_get_flags(tfm));
407 goto out;
408 }
409
31267270 410 sg_init_aead(sg, xbuf,
53f52d7a
TC
411 *b_size + (enc ? authsize : 0));
412
31267270 413 sg_init_aead(sgout, xoutbuf,
53f52d7a
TC
414 *b_size + (enc ? authsize : 0));
415
31267270
HX
416 sg_set_buf(&sg[0], assoc, aad_size);
417 sg_set_buf(&sgout[0], assoc, aad_size);
418
53f52d7a 419 aead_request_set_crypt(req, sg, sgout, *b_size, iv);
a3f2185a 420 aead_request_set_ad(req, aad_size);
53f52d7a 421
3e3dc25f
MR
422 if (secs)
423 ret = test_aead_jiffies(req, enc, *b_size,
424 secs);
53f52d7a
TC
425 else
426 ret = test_aead_cycles(req, enc, *b_size);
427
428 if (ret) {
429 pr_err("%s() failed return code=%d\n", e, ret);
430 break;
431 }
432 b_size++;
433 i++;
434 } while (*b_size);
435 keysize++;
436 } while (*keysize);
437
438out:
6af1f93e
CE
439 aead_request_free(req);
440out_noreq:
53f52d7a 441 crypto_free_aead(tfm);
a2ea6ed6 442out_notfm:
53f52d7a
TC
443 kfree(sg);
444out_nosg:
445 testmgr_free_buf(xoutbuf);
446out_nooutbuf:
447 testmgr_free_buf(axbuf);
448out_noaxbuf:
449 testmgr_free_buf(xbuf);
450out_noxbuf:
96692a73 451 kfree(iv);
53f52d7a
TC
452 return;
453}
d5dc3927 454
3e3dc25f 455static void test_cipher_speed(const char *algo, int enc, unsigned int secs,
da7f033d 456 struct cipher_speed_template *template,
d5dc3927 457 unsigned int tcount, u8 *keysize)
ebfd9bcf 458{
dce907c0 459 unsigned int ret, i, j, iv_len;
f07ef1de
DS
460 const char *key;
461 char iv[128];
cba83564
HX
462 struct crypto_blkcipher *tfm;
463 struct blkcipher_desc desc;
464 const char *e;
d5dc3927 465 u32 *b_size;
ebfd9bcf
HW
466
467 if (enc == ENCRYPT)
468 e = "encryption";
469 else
470 e = "decryption";
ebfd9bcf 471
cba83564 472 tfm = crypto_alloc_blkcipher(algo, 0, CRYPTO_ALG_ASYNC);
ebfd9bcf 473
cba83564
HX
474 if (IS_ERR(tfm)) {
475 printk("failed to load transform for %s: %ld\n", algo,
476 PTR_ERR(tfm));
ebfd9bcf
HW
477 return;
478 }
cba83564
HX
479 desc.tfm = tfm;
480 desc.flags = 0;
ebfd9bcf 481
263a8df0
LC
482 printk(KERN_INFO "\ntesting speed of %s (%s) %s\n", algo,
483 get_driver_name(crypto_blkcipher, tfm), e);
484
d5dc3927
SS
485 i = 0;
486 do {
ebfd9bcf 487
d5dc3927
SS
488 b_size = block_sizes;
489 do {
f139cfa7 490 struct scatterlist sg[TVMEMSIZE];
ebfd9bcf 491
f139cfa7
HX
492 if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
493 printk("template (%u) too big for "
494 "tvmem (%lu)\n", *keysize + *b_size,
495 TVMEMSIZE * PAGE_SIZE);
d5dc3927
SS
496 goto out;
497 }
ebfd9bcf 498
d5dc3927
SS
499 printk("test %u (%d bit key, %d byte blocks): ", i,
500 *keysize * 8, *b_size);
501
f139cfa7 502 memset(tvmem[0], 0xff, PAGE_SIZE);
d5dc3927
SS
503
504 /* set key, plain text and IV */
da7f033d 505 key = tvmem[0];
d5dc3927
SS
506 for (j = 0; j < tcount; j++) {
507 if (template[j].klen == *keysize) {
508 key = template[j].key;
509 break;
510 }
dce907c0 511 }
ebfd9bcf 512
d5dc3927
SS
513 ret = crypto_blkcipher_setkey(tfm, key, *keysize);
514 if (ret) {
515 printk("setkey() failed flags=%x\n",
516 crypto_blkcipher_get_flags(tfm));
517 goto out;
518 }
ebfd9bcf 519
f139cfa7
HX
520 sg_init_table(sg, TVMEMSIZE);
521 sg_set_buf(sg, tvmem[0] + *keysize,
522 PAGE_SIZE - *keysize);
523 for (j = 1; j < TVMEMSIZE; j++) {
524 sg_set_buf(sg + j, tvmem[j], PAGE_SIZE);
525 memset (tvmem[j], 0xff, PAGE_SIZE);
526 }
527
d5dc3927
SS
528 iv_len = crypto_blkcipher_ivsize(tfm);
529 if (iv_len) {
530 memset(&iv, 0xff, iv_len);
531 crypto_blkcipher_set_iv(tfm, iv, iv_len);
532 }
ebfd9bcf 533
3e3dc25f 534 if (secs)
f139cfa7 535 ret = test_cipher_jiffies(&desc, enc, sg,
3e3dc25f 536 *b_size, secs);
d5dc3927 537 else
f139cfa7
HX
538 ret = test_cipher_cycles(&desc, enc, sg,
539 *b_size);
ebfd9bcf 540
d5dc3927
SS
541 if (ret) {
542 printk("%s() failed flags=%x\n", e, desc.flags);
543 break;
544 }
545 b_size++;
546 i++;
547 } while (*b_size);
548 keysize++;
549 } while (*keysize);
ebfd9bcf
HW
550
551out:
cba83564 552 crypto_free_blkcipher(tfm);
ebfd9bcf
HW
553}
554
f139cfa7
HX
555static int test_hash_jiffies_digest(struct hash_desc *desc,
556 struct scatterlist *sg, int blen,
3e3dc25f 557 char *out, int secs)
e9d41164 558{
e9d41164
HX
559 unsigned long start, end;
560 int bcount;
561 int ret;
562
3e3dc25f 563 for (start = jiffies, end = start + secs * HZ, bcount = 0;
e9d41164 564 time_before(jiffies, end); bcount++) {
e9d41164
HX
565 ret = crypto_hash_digest(desc, sg, blen, out);
566 if (ret)
567 return ret;
568 }
569
570 printk("%6u opers/sec, %9lu bytes/sec\n",
3e3dc25f 571 bcount / secs, ((long)bcount * blen) / secs);
e9d41164
HX
572
573 return 0;
574}
575
f139cfa7 576static int test_hash_jiffies(struct hash_desc *desc, struct scatterlist *sg,
3e3dc25f 577 int blen, int plen, char *out, int secs)
e8057928 578{
e8057928
ML
579 unsigned long start, end;
580 int bcount, pcount;
e9d41164
HX
581 int ret;
582
583 if (plen == blen)
3e3dc25f 584 return test_hash_jiffies_digest(desc, sg, blen, out, secs);
a5a613a4 585
3e3dc25f 586 for (start = jiffies, end = start + secs * HZ, bcount = 0;
e8057928 587 time_before(jiffies, end); bcount++) {
e9d41164
HX
588 ret = crypto_hash_init(desc);
589 if (ret)
590 return ret;
e8057928 591 for (pcount = 0; pcount < blen; pcount += plen) {
e9d41164
HX
592 ret = crypto_hash_update(desc, sg, plen);
593 if (ret)
594 return ret;
e8057928
ML
595 }
596 /* we assume there is enough space in 'out' for the result */
e9d41164
HX
597 ret = crypto_hash_final(desc, out);
598 if (ret)
599 return ret;
e8057928
ML
600 }
601
602 printk("%6u opers/sec, %9lu bytes/sec\n",
3e3dc25f 603 bcount / secs, ((long)bcount * blen) / secs);
e8057928 604
e9d41164
HX
605 return 0;
606}
607
f139cfa7
HX
608static int test_hash_cycles_digest(struct hash_desc *desc,
609 struct scatterlist *sg, int blen, char *out)
e9d41164 610{
e9d41164
HX
611 unsigned long cycles = 0;
612 int i;
613 int ret;
614
e9d41164
HX
615 local_irq_disable();
616
617 /* Warm-up run. */
618 for (i = 0; i < 4; i++) {
e9d41164
HX
619 ret = crypto_hash_digest(desc, sg, blen, out);
620 if (ret)
621 goto out;
622 }
623
624 /* The real thing. */
625 for (i = 0; i < 8; i++) {
626 cycles_t start, end;
627
628 start = get_cycles();
629
e9d41164
HX
630 ret = crypto_hash_digest(desc, sg, blen, out);
631 if (ret)
632 goto out;
633
634 end = get_cycles();
635
636 cycles += end - start;
637 }
638
639out:
640 local_irq_enable();
e9d41164
HX
641
642 if (ret)
643 return ret;
644
645 printk("%6lu cycles/operation, %4lu cycles/byte\n",
646 cycles / 8, cycles / (8 * blen));
647
648 return 0;
e8057928
ML
649}
650
f139cfa7
HX
651static int test_hash_cycles(struct hash_desc *desc, struct scatterlist *sg,
652 int blen, int plen, char *out)
e8057928 653{
e8057928
ML
654 unsigned long cycles = 0;
655 int i, pcount;
e9d41164
HX
656 int ret;
657
658 if (plen == blen)
f139cfa7 659 return test_hash_cycles_digest(desc, sg, blen, out);
a5a613a4 660
e8057928
ML
661 local_irq_disable();
662
663 /* Warm-up run. */
664 for (i = 0; i < 4; i++) {
e9d41164
HX
665 ret = crypto_hash_init(desc);
666 if (ret)
667 goto out;
e8057928 668 for (pcount = 0; pcount < blen; pcount += plen) {
e9d41164
HX
669 ret = crypto_hash_update(desc, sg, plen);
670 if (ret)
671 goto out;
e8057928 672 }
29059d12 673 ret = crypto_hash_final(desc, out);
e9d41164
HX
674 if (ret)
675 goto out;
e8057928
ML
676 }
677
678 /* The real thing. */
679 for (i = 0; i < 8; i++) {
680 cycles_t start, end;
681
e8057928
ML
682 start = get_cycles();
683
e9d41164
HX
684 ret = crypto_hash_init(desc);
685 if (ret)
686 goto out;
e8057928 687 for (pcount = 0; pcount < blen; pcount += plen) {
e9d41164
HX
688 ret = crypto_hash_update(desc, sg, plen);
689 if (ret)
690 goto out;
e8057928 691 }
e9d41164
HX
692 ret = crypto_hash_final(desc, out);
693 if (ret)
694 goto out;
e8057928
ML
695
696 end = get_cycles();
697
698 cycles += end - start;
699 }
700
e9d41164 701out:
e8057928 702 local_irq_enable();
e8057928 703
e9d41164
HX
704 if (ret)
705 return ret;
706
e8057928
ML
707 printk("%6lu cycles/operation, %4lu cycles/byte\n",
708 cycles / 8, cycles / (8 * blen));
709
e9d41164 710 return 0;
e8057928
ML
711}
712
beb63da7
DM
713static void test_hash_sg_init(struct scatterlist *sg)
714{
715 int i;
716
717 sg_init_table(sg, TVMEMSIZE);
718 for (i = 0; i < TVMEMSIZE; i++) {
719 sg_set_buf(sg + i, tvmem[i], PAGE_SIZE);
720 memset(tvmem[i], 0xff, PAGE_SIZE);
721 }
722}
723
3e3dc25f 724static void test_hash_speed(const char *algo, unsigned int secs,
01b32324 725 struct hash_speed *speed)
e8057928 726{
f139cfa7 727 struct scatterlist sg[TVMEMSIZE];
e9d41164
HX
728 struct crypto_hash *tfm;
729 struct hash_desc desc;
376bacb0 730 static char output[1024];
e8057928 731 int i;
e9d41164 732 int ret;
e8057928 733
e9d41164 734 tfm = crypto_alloc_hash(algo, 0, CRYPTO_ALG_ASYNC);
e8057928 735
e9d41164 736 if (IS_ERR(tfm)) {
376bacb0 737 printk(KERN_ERR "failed to load transform for %s: %ld\n", algo,
e9d41164 738 PTR_ERR(tfm));
e8057928
ML
739 return;
740 }
741
263a8df0
LC
742 printk(KERN_INFO "\ntesting speed of %s (%s)\n", algo,
743 get_driver_name(crypto_hash, tfm));
744
e9d41164
HX
745 desc.tfm = tfm;
746 desc.flags = 0;
747
748 if (crypto_hash_digestsize(tfm) > sizeof(output)) {
376bacb0 749 printk(KERN_ERR "digestsize(%u) > outputbuffer(%zu)\n",
e9d41164 750 crypto_hash_digestsize(tfm), sizeof(output));
e8057928
ML
751 goto out;
752 }
753
beb63da7 754 test_hash_sg_init(sg);
e8057928 755 for (i = 0; speed[i].blen != 0; i++) {
f139cfa7 756 if (speed[i].blen > TVMEMSIZE * PAGE_SIZE) {
376bacb0
FS
757 printk(KERN_ERR
758 "template (%u) too big for tvmem (%lu)\n",
f139cfa7 759 speed[i].blen, TVMEMSIZE * PAGE_SIZE);
e8057928
ML
760 goto out;
761 }
762
18bcc919
HY
763 if (speed[i].klen)
764 crypto_hash_setkey(tfm, tvmem[0], speed[i].klen);
765
376bacb0
FS
766 printk(KERN_INFO "test%3u "
767 "(%5u byte blocks,%5u bytes per update,%4u updates): ",
e8057928
ML
768 i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen);
769
3e3dc25f 770 if (secs)
f139cfa7 771 ret = test_hash_jiffies(&desc, sg, speed[i].blen,
3e3dc25f 772 speed[i].plen, output, secs);
e8057928 773 else
f139cfa7 774 ret = test_hash_cycles(&desc, sg, speed[i].blen,
e9d41164
HX
775 speed[i].plen, output);
776
777 if (ret) {
376bacb0 778 printk(KERN_ERR "hashing failed ret=%d\n", ret);
e9d41164
HX
779 break;
780 }
e8057928
ML
781 }
782
783out:
e9d41164 784 crypto_free_hash(tfm);
e8057928
ML
785}
786
beb63da7
DM
787static inline int do_one_ahash_op(struct ahash_request *req, int ret)
788{
789 if (ret == -EINPROGRESS || ret == -EBUSY) {
790 struct tcrypt_result *tr = req->base.data;
791
8a45ac12 792 wait_for_completion(&tr->completion);
16735d02 793 reinit_completion(&tr->completion);
8a45ac12 794 ret = tr->err;
beb63da7
DM
795 }
796 return ret;
797}
798
799static int test_ahash_jiffies_digest(struct ahash_request *req, int blen,
3e3dc25f 800 char *out, int secs)
beb63da7
DM
801{
802 unsigned long start, end;
803 int bcount;
804 int ret;
805
3e3dc25f 806 for (start = jiffies, end = start + secs * HZ, bcount = 0;
beb63da7
DM
807 time_before(jiffies, end); bcount++) {
808 ret = do_one_ahash_op(req, crypto_ahash_digest(req));
809 if (ret)
810 return ret;
811 }
812
813 printk("%6u opers/sec, %9lu bytes/sec\n",
3e3dc25f 814 bcount / secs, ((long)bcount * blen) / secs);
beb63da7
DM
815
816 return 0;
817}
818
819static int test_ahash_jiffies(struct ahash_request *req, int blen,
3e3dc25f 820 int plen, char *out, int secs)
beb63da7
DM
821{
822 unsigned long start, end;
823 int bcount, pcount;
824 int ret;
825
826 if (plen == blen)
3e3dc25f 827 return test_ahash_jiffies_digest(req, blen, out, secs);
beb63da7 828
3e3dc25f 829 for (start = jiffies, end = start + secs * HZ, bcount = 0;
beb63da7 830 time_before(jiffies, end); bcount++) {
43a9607d 831 ret = do_one_ahash_op(req, crypto_ahash_init(req));
beb63da7
DM
832 if (ret)
833 return ret;
834 for (pcount = 0; pcount < blen; pcount += plen) {
835 ret = do_one_ahash_op(req, crypto_ahash_update(req));
836 if (ret)
837 return ret;
838 }
839 /* we assume there is enough space in 'out' for the result */
840 ret = do_one_ahash_op(req, crypto_ahash_final(req));
841 if (ret)
842 return ret;
843 }
844
845 pr_cont("%6u opers/sec, %9lu bytes/sec\n",
3e3dc25f 846 bcount / secs, ((long)bcount * blen) / secs);
beb63da7
DM
847
848 return 0;
849}
850
851static int test_ahash_cycles_digest(struct ahash_request *req, int blen,
852 char *out)
853{
854 unsigned long cycles = 0;
855 int ret, i;
856
857 /* Warm-up run. */
858 for (i = 0; i < 4; i++) {
859 ret = do_one_ahash_op(req, crypto_ahash_digest(req));
860 if (ret)
861 goto out;
862 }
863
864 /* The real thing. */
865 for (i = 0; i < 8; i++) {
866 cycles_t start, end;
867
868 start = get_cycles();
869
870 ret = do_one_ahash_op(req, crypto_ahash_digest(req));
871 if (ret)
872 goto out;
873
874 end = get_cycles();
875
876 cycles += end - start;
877 }
878
879out:
880 if (ret)
881 return ret;
882
883 pr_cont("%6lu cycles/operation, %4lu cycles/byte\n",
884 cycles / 8, cycles / (8 * blen));
885
886 return 0;
887}
888
889static int test_ahash_cycles(struct ahash_request *req, int blen,
890 int plen, char *out)
891{
892 unsigned long cycles = 0;
893 int i, pcount, ret;
894
895 if (plen == blen)
896 return test_ahash_cycles_digest(req, blen, out);
897
898 /* Warm-up run. */
899 for (i = 0; i < 4; i++) {
43a9607d 900 ret = do_one_ahash_op(req, crypto_ahash_init(req));
beb63da7
DM
901 if (ret)
902 goto out;
903 for (pcount = 0; pcount < blen; pcount += plen) {
904 ret = do_one_ahash_op(req, crypto_ahash_update(req));
905 if (ret)
906 goto out;
907 }
908 ret = do_one_ahash_op(req, crypto_ahash_final(req));
909 if (ret)
910 goto out;
911 }
912
913 /* The real thing. */
914 for (i = 0; i < 8; i++) {
915 cycles_t start, end;
916
917 start = get_cycles();
918
43a9607d 919 ret = do_one_ahash_op(req, crypto_ahash_init(req));
beb63da7
DM
920 if (ret)
921 goto out;
922 for (pcount = 0; pcount < blen; pcount += plen) {
923 ret = do_one_ahash_op(req, crypto_ahash_update(req));
924 if (ret)
925 goto out;
926 }
927 ret = do_one_ahash_op(req, crypto_ahash_final(req));
928 if (ret)
929 goto out;
930
931 end = get_cycles();
932
933 cycles += end - start;
934 }
935
936out:
937 if (ret)
938 return ret;
939
940 pr_cont("%6lu cycles/operation, %4lu cycles/byte\n",
941 cycles / 8, cycles / (8 * blen));
942
943 return 0;
944}
945
3e3dc25f 946static void test_ahash_speed(const char *algo, unsigned int secs,
beb63da7
DM
947 struct hash_speed *speed)
948{
949 struct scatterlist sg[TVMEMSIZE];
950 struct tcrypt_result tresult;
951 struct ahash_request *req;
952 struct crypto_ahash *tfm;
953 static char output[1024];
954 int i, ret;
955
beb63da7
DM
956 tfm = crypto_alloc_ahash(algo, 0, 0);
957 if (IS_ERR(tfm)) {
958 pr_err("failed to load transform for %s: %ld\n",
959 algo, PTR_ERR(tfm));
960 return;
961 }
962
263a8df0
LC
963 printk(KERN_INFO "\ntesting speed of async %s (%s)\n", algo,
964 get_driver_name(crypto_ahash, tfm));
965
beb63da7
DM
966 if (crypto_ahash_digestsize(tfm) > sizeof(output)) {
967 pr_err("digestsize(%u) > outputbuffer(%zu)\n",
968 crypto_ahash_digestsize(tfm), sizeof(output));
969 goto out;
970 }
971
972 test_hash_sg_init(sg);
973 req = ahash_request_alloc(tfm, GFP_KERNEL);
974 if (!req) {
975 pr_err("ahash request allocation failure\n");
976 goto out;
977 }
978
979 init_completion(&tresult.completion);
980 ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
981 tcrypt_complete, &tresult);
982
983 for (i = 0; speed[i].blen != 0; i++) {
984 if (speed[i].blen > TVMEMSIZE * PAGE_SIZE) {
985 pr_err("template (%u) too big for tvmem (%lu)\n",
986 speed[i].blen, TVMEMSIZE * PAGE_SIZE);
987 break;
988 }
989
990 pr_info("test%3u "
991 "(%5u byte blocks,%5u bytes per update,%4u updates): ",
992 i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen);
993
994 ahash_request_set_crypt(req, sg, output, speed[i].plen);
995
3e3dc25f 996 if (secs)
beb63da7 997 ret = test_ahash_jiffies(req, speed[i].blen,
3e3dc25f 998 speed[i].plen, output, secs);
beb63da7
DM
999 else
1000 ret = test_ahash_cycles(req, speed[i].blen,
1001 speed[i].plen, output);
1002
1003 if (ret) {
1004 pr_err("hashing failed ret=%d\n", ret);
1005 break;
1006 }
1007 }
1008
1009 ahash_request_free(req);
1010
1011out:
1012 crypto_free_ahash(tfm);
1013}
1014
3f3baf35
JK
1015static inline int do_one_acipher_op(struct ablkcipher_request *req, int ret)
1016{
1017 if (ret == -EINPROGRESS || ret == -EBUSY) {
1018 struct tcrypt_result *tr = req->base.data;
1019
8a45ac12 1020 wait_for_completion(&tr->completion);
16735d02 1021 reinit_completion(&tr->completion);
8a45ac12 1022 ret = tr->err;
3f3baf35
JK
1023 }
1024
1025 return ret;
1026}
1027
1028static int test_acipher_jiffies(struct ablkcipher_request *req, int enc,
3e3dc25f 1029 int blen, int secs)
3f3baf35
JK
1030{
1031 unsigned long start, end;
1032 int bcount;
1033 int ret;
1034
3e3dc25f 1035 for (start = jiffies, end = start + secs * HZ, bcount = 0;
3f3baf35
JK
1036 time_before(jiffies, end); bcount++) {
1037 if (enc)
1038 ret = do_one_acipher_op(req,
1039 crypto_ablkcipher_encrypt(req));
1040 else
1041 ret = do_one_acipher_op(req,
1042 crypto_ablkcipher_decrypt(req));
1043
1044 if (ret)
1045 return ret;
1046 }
1047
1048 pr_cont("%d operations in %d seconds (%ld bytes)\n",
3e3dc25f 1049 bcount, secs, (long)bcount * blen);
3f3baf35
JK
1050 return 0;
1051}
1052
1053static int test_acipher_cycles(struct ablkcipher_request *req, int enc,
1054 int blen)
1055{
1056 unsigned long cycles = 0;
1057 int ret = 0;
1058 int i;
1059
1060 /* Warm-up run. */
1061 for (i = 0; i < 4; i++) {
1062 if (enc)
1063 ret = do_one_acipher_op(req,
1064 crypto_ablkcipher_encrypt(req));
1065 else
1066 ret = do_one_acipher_op(req,
1067 crypto_ablkcipher_decrypt(req));
1068
1069 if (ret)
1070 goto out;
1071 }
1072
1073 /* The real thing. */
1074 for (i = 0; i < 8; i++) {
1075 cycles_t start, end;
1076
1077 start = get_cycles();
1078 if (enc)
1079 ret = do_one_acipher_op(req,
1080 crypto_ablkcipher_encrypt(req));
1081 else
1082 ret = do_one_acipher_op(req,
1083 crypto_ablkcipher_decrypt(req));
1084 end = get_cycles();
1085
1086 if (ret)
1087 goto out;
1088
1089 cycles += end - start;
1090 }
1091
1092out:
1093 if (ret == 0)
1094 pr_cont("1 operation in %lu cycles (%d bytes)\n",
1095 (cycles + 4) / 8, blen);
1096
1097 return ret;
1098}
1099
3e3dc25f 1100static void test_acipher_speed(const char *algo, int enc, unsigned int secs,
3f3baf35
JK
1101 struct cipher_speed_template *template,
1102 unsigned int tcount, u8 *keysize)
1103{
de197533 1104 unsigned int ret, i, j, k, iv_len;
3f3baf35
JK
1105 struct tcrypt_result tresult;
1106 const char *key;
1107 char iv[128];
1108 struct ablkcipher_request *req;
1109 struct crypto_ablkcipher *tfm;
1110 const char *e;
1111 u32 *b_size;
1112
1113 if (enc == ENCRYPT)
1114 e = "encryption";
1115 else
1116 e = "decryption";
1117
3f3baf35
JK
1118 init_completion(&tresult.completion);
1119
1120 tfm = crypto_alloc_ablkcipher(algo, 0, 0);
1121
1122 if (IS_ERR(tfm)) {
1123 pr_err("failed to load transform for %s: %ld\n", algo,
1124 PTR_ERR(tfm));
1125 return;
1126 }
1127
263a8df0
LC
1128 pr_info("\ntesting speed of async %s (%s) %s\n", algo,
1129 get_driver_name(crypto_ablkcipher, tfm), e);
1130
3f3baf35
JK
1131 req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
1132 if (!req) {
1133 pr_err("tcrypt: skcipher: Failed to allocate request for %s\n",
1134 algo);
1135 goto out;
1136 }
1137
1138 ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1139 tcrypt_complete, &tresult);
1140
1141 i = 0;
1142 do {
1143 b_size = block_sizes;
1144
1145 do {
1146 struct scatterlist sg[TVMEMSIZE];
1147
1148 if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
1149 pr_err("template (%u) too big for "
1150 "tvmem (%lu)\n", *keysize + *b_size,
1151 TVMEMSIZE * PAGE_SIZE);
1152 goto out_free_req;
1153 }
1154
1155 pr_info("test %u (%d bit key, %d byte blocks): ", i,
1156 *keysize * 8, *b_size);
1157
1158 memset(tvmem[0], 0xff, PAGE_SIZE);
1159
1160 /* set key, plain text and IV */
1161 key = tvmem[0];
1162 for (j = 0; j < tcount; j++) {
1163 if (template[j].klen == *keysize) {
1164 key = template[j].key;
1165 break;
1166 }
1167 }
1168
1169 crypto_ablkcipher_clear_flags(tfm, ~0);
1170
1171 ret = crypto_ablkcipher_setkey(tfm, key, *keysize);
1172 if (ret) {
1173 pr_err("setkey() failed flags=%x\n",
1174 crypto_ablkcipher_get_flags(tfm));
1175 goto out_free_req;
1176 }
1177
de197533 1178 k = *keysize + *b_size;
007ee8de
HG
1179 sg_init_table(sg, DIV_ROUND_UP(k, PAGE_SIZE));
1180
de197533
NR
1181 if (k > PAGE_SIZE) {
1182 sg_set_buf(sg, tvmem[0] + *keysize,
3f3baf35 1183 PAGE_SIZE - *keysize);
de197533
NR
1184 k -= PAGE_SIZE;
1185 j = 1;
1186 while (k > PAGE_SIZE) {
1187 sg_set_buf(sg + j, tvmem[j], PAGE_SIZE);
1188 memset(tvmem[j], 0xff, PAGE_SIZE);
1189 j++;
1190 k -= PAGE_SIZE;
1191 }
1192 sg_set_buf(sg + j, tvmem[j], k);
1193 memset(tvmem[j], 0xff, k);
1194 } else {
1195 sg_set_buf(sg, tvmem[0] + *keysize, *b_size);
3f3baf35
JK
1196 }
1197
1198 iv_len = crypto_ablkcipher_ivsize(tfm);
1199 if (iv_len)
1200 memset(&iv, 0xff, iv_len);
1201
1202 ablkcipher_request_set_crypt(req, sg, sg, *b_size, iv);
1203
3e3dc25f 1204 if (secs)
3f3baf35 1205 ret = test_acipher_jiffies(req, enc,
3e3dc25f 1206 *b_size, secs);
3f3baf35
JK
1207 else
1208 ret = test_acipher_cycles(req, enc,
1209 *b_size);
1210
1211 if (ret) {
1212 pr_err("%s() failed flags=%x\n", e,
1213 crypto_ablkcipher_get_flags(tfm));
1214 break;
1215 }
1216 b_size++;
1217 i++;
1218 } while (*b_size);
1219 keysize++;
1220 } while (*keysize);
1221
1222out_free_req:
1223 ablkcipher_request_free(req);
1224out:
1225 crypto_free_ablkcipher(tfm);
1226}
1227
ef2736fc 1228static void test_available(void)
1da177e4
LT
1229{
1230 char **name = check;
ef2736fc 1231
1da177e4
LT
1232 while (*name) {
1233 printk("alg %s ", *name);
6158efc0 1234 printk(crypto_has_alg(*name, 0, 0) ?
e4d5b79c 1235 "found\n" : "not found\n");
1da177e4 1236 name++;
ef2736fc 1237 }
1da177e4
LT
1238}
1239
01b32324
HX
1240static inline int tcrypt_test(const char *alg)
1241{
4e033a6b
JW
1242 int ret;
1243
1244 ret = alg_test(alg, alg, 0, 0);
1245 /* non-fips algs return -EINVAL in fips mode */
1246 if (fips_enabled && ret == -EINVAL)
1247 ret = 0;
1248 return ret;
01b32324
HX
1249}
1250
8606813a 1251static int do_test(const char *alg, u32 type, u32 mask, int m)
01b32324
HX
1252{
1253 int i;
4e033a6b 1254 int ret = 0;
01b32324
HX
1255
1256 switch (m) {
1da177e4 1257 case 0:
8606813a
HX
1258 if (alg) {
1259 if (!crypto_has_alg(alg, type,
1260 mask ?: CRYPTO_ALG_TYPE_MASK))
1261 ret = -ENOENT;
1262 break;
1263 }
1264
01b32324 1265 for (i = 1; i < 200; i++)
8606813a 1266 ret += do_test(NULL, 0, 0, i);
1da177e4
LT
1267 break;
1268
1269 case 1:
4e033a6b 1270 ret += tcrypt_test("md5");
1da177e4
LT
1271 break;
1272
1273 case 2:
4e033a6b 1274 ret += tcrypt_test("sha1");
1da177e4
LT
1275 break;
1276
1277 case 3:
4e033a6b
JW
1278 ret += tcrypt_test("ecb(des)");
1279 ret += tcrypt_test("cbc(des)");
8163fc30 1280 ret += tcrypt_test("ctr(des)");
1da177e4
LT
1281 break;
1282
1283 case 4:
4e033a6b
JW
1284 ret += tcrypt_test("ecb(des3_ede)");
1285 ret += tcrypt_test("cbc(des3_ede)");
e080b17a 1286 ret += tcrypt_test("ctr(des3_ede)");
1da177e4
LT
1287 break;
1288
1289 case 5:
4e033a6b 1290 ret += tcrypt_test("md4");
1da177e4 1291 break;
ef2736fc 1292
1da177e4 1293 case 6:
4e033a6b 1294 ret += tcrypt_test("sha256");
1da177e4 1295 break;
ef2736fc 1296
1da177e4 1297 case 7:
4e033a6b
JW
1298 ret += tcrypt_test("ecb(blowfish)");
1299 ret += tcrypt_test("cbc(blowfish)");
85b63e34 1300 ret += tcrypt_test("ctr(blowfish)");
1da177e4
LT
1301 break;
1302
1303 case 8:
4e033a6b
JW
1304 ret += tcrypt_test("ecb(twofish)");
1305 ret += tcrypt_test("cbc(twofish)");
573da620 1306 ret += tcrypt_test("ctr(twofish)");
bee3a90e 1307 ret += tcrypt_test("lrw(twofish)");
131f7541 1308 ret += tcrypt_test("xts(twofish)");
1da177e4 1309 break;
ef2736fc 1310
1da177e4 1311 case 9:
4e033a6b 1312 ret += tcrypt_test("ecb(serpent)");
9d25917d
JK
1313 ret += tcrypt_test("cbc(serpent)");
1314 ret += tcrypt_test("ctr(serpent)");
87aae4bf 1315 ret += tcrypt_test("lrw(serpent)");
5209c07a 1316 ret += tcrypt_test("xts(serpent)");
1da177e4
LT
1317 break;
1318
1319 case 10:
4e033a6b
JW
1320 ret += tcrypt_test("ecb(aes)");
1321 ret += tcrypt_test("cbc(aes)");
1322 ret += tcrypt_test("lrw(aes)");
1323 ret += tcrypt_test("xts(aes)");
1324 ret += tcrypt_test("ctr(aes)");
1325 ret += tcrypt_test("rfc3686(ctr(aes))");
1da177e4
LT
1326 break;
1327
1328 case 11:
4e033a6b 1329 ret += tcrypt_test("sha384");
1da177e4 1330 break;
ef2736fc 1331
1da177e4 1332 case 12:
4e033a6b 1333 ret += tcrypt_test("sha512");
1da177e4
LT
1334 break;
1335
1336 case 13:
4e033a6b 1337 ret += tcrypt_test("deflate");
1da177e4
LT
1338 break;
1339
1340 case 14:
4e033a6b 1341 ret += tcrypt_test("ecb(cast5)");
a2c58260
JG
1342 ret += tcrypt_test("cbc(cast5)");
1343 ret += tcrypt_test("ctr(cast5)");
1da177e4
LT
1344 break;
1345
1346 case 15:
4e033a6b 1347 ret += tcrypt_test("ecb(cast6)");
9b8b0405
JG
1348 ret += tcrypt_test("cbc(cast6)");
1349 ret += tcrypt_test("ctr(cast6)");
1350 ret += tcrypt_test("lrw(cast6)");
1351 ret += tcrypt_test("xts(cast6)");
1da177e4
LT
1352 break;
1353
1354 case 16:
4e033a6b 1355 ret += tcrypt_test("ecb(arc4)");
1da177e4
LT
1356 break;
1357
1358 case 17:
4e033a6b 1359 ret += tcrypt_test("michael_mic");
1da177e4
LT
1360 break;
1361
1362 case 18:
4e033a6b 1363 ret += tcrypt_test("crc32c");
1da177e4
LT
1364 break;
1365
1366 case 19:
4e033a6b 1367 ret += tcrypt_test("ecb(tea)");
1da177e4
LT
1368 break;
1369
1370 case 20:
4e033a6b 1371 ret += tcrypt_test("ecb(xtea)");
1da177e4
LT
1372 break;
1373
1374 case 21:
4e033a6b 1375 ret += tcrypt_test("ecb(khazad)");
1da177e4
LT
1376 break;
1377
1378 case 22:
4e033a6b 1379 ret += tcrypt_test("wp512");
1da177e4
LT
1380 break;
1381
1382 case 23:
4e033a6b 1383 ret += tcrypt_test("wp384");
1da177e4
LT
1384 break;
1385
1386 case 24:
4e033a6b 1387 ret += tcrypt_test("wp256");
1da177e4
LT
1388 break;
1389
1390 case 25:
4e033a6b 1391 ret += tcrypt_test("ecb(tnepres)");
1da177e4
LT
1392 break;
1393
1394 case 26:
4e033a6b
JW
1395 ret += tcrypt_test("ecb(anubis)");
1396 ret += tcrypt_test("cbc(anubis)");
1da177e4
LT
1397 break;
1398
1399 case 27:
4e033a6b 1400 ret += tcrypt_test("tgr192");
1da177e4
LT
1401 break;
1402
1403 case 28:
4e033a6b 1404 ret += tcrypt_test("tgr160");
1da177e4
LT
1405 break;
1406
1407 case 29:
4e033a6b 1408 ret += tcrypt_test("tgr128");
1da177e4 1409 break;
2998db37 1410
fb4f10ed 1411 case 30:
4e033a6b 1412 ret += tcrypt_test("ecb(xeta)");
fb4f10ed 1413 break;
1da177e4 1414
90831639 1415 case 31:
4e033a6b 1416 ret += tcrypt_test("pcbc(fcrypt)");
90831639
DH
1417 break;
1418
02ab5a70 1419 case 32:
4e033a6b
JW
1420 ret += tcrypt_test("ecb(camellia)");
1421 ret += tcrypt_test("cbc(camellia)");
54216bbd
JK
1422 ret += tcrypt_test("ctr(camellia)");
1423 ret += tcrypt_test("lrw(camellia)");
1424 ret += tcrypt_test("xts(camellia)");
02ab5a70 1425 break;
93b5e86a 1426
cd12fb90 1427 case 33:
4e033a6b 1428 ret += tcrypt_test("sha224");
cd12fb90 1429 break;
02ab5a70 1430
2407d608 1431 case 34:
4e033a6b 1432 ret += tcrypt_test("salsa20");
2407d608
TSH
1433 break;
1434
8df213d9 1435 case 35:
4e033a6b 1436 ret += tcrypt_test("gcm(aes)");
8df213d9
HX
1437 break;
1438
0b77abb3 1439 case 36:
4e033a6b 1440 ret += tcrypt_test("lzo");
0b77abb3
ZS
1441 break;
1442
93cc74e0 1443 case 37:
4e033a6b 1444 ret += tcrypt_test("ccm(aes)");
93cc74e0
JL
1445 break;
1446
76cb9521 1447 case 38:
4e033a6b 1448 ret += tcrypt_test("cts(cbc(aes))");
76cb9521
KC
1449 break;
1450
fd4adf1a 1451 case 39:
4e033a6b 1452 ret += tcrypt_test("rmd128");
fd4adf1a
AKR
1453 break;
1454
1455 case 40:
4e033a6b 1456 ret += tcrypt_test("rmd160");
fd4adf1a
AKR
1457 break;
1458
2998db37 1459 case 41:
4e033a6b 1460 ret += tcrypt_test("rmd256");
2998db37
AKR
1461 break;
1462
1463 case 42:
4e033a6b 1464 ret += tcrypt_test("rmd320");
01b32324
HX
1465 break;
1466
1467 case 43:
4e033a6b 1468 ret += tcrypt_test("ecb(seed)");
2998db37
AKR
1469 break;
1470
0c01aed5 1471 case 44:
4e033a6b 1472 ret += tcrypt_test("zlib");
0c01aed5
GU
1473 break;
1474
5d667322 1475 case 45:
4e033a6b 1476 ret += tcrypt_test("rfc4309(ccm(aes))");
5d667322
JW
1477 break;
1478
54216bbd
JK
1479 case 46:
1480 ret += tcrypt_test("ghash");
1481 break;
1482
68411521
HX
1483 case 47:
1484 ret += tcrypt_test("crct10dif");
1485 break;
1486
1da177e4 1487 case 100:
4e033a6b 1488 ret += tcrypt_test("hmac(md5)");
1da177e4 1489 break;
ef2736fc 1490
1da177e4 1491 case 101:
4e033a6b 1492 ret += tcrypt_test("hmac(sha1)");
1da177e4 1493 break;
ef2736fc 1494
1da177e4 1495 case 102:
4e033a6b 1496 ret += tcrypt_test("hmac(sha256)");
1da177e4
LT
1497 break;
1498
a28091ae 1499 case 103:
4e033a6b 1500 ret += tcrypt_test("hmac(sha384)");
a28091ae
AD
1501 break;
1502
1503 case 104:
4e033a6b 1504 ret += tcrypt_test("hmac(sha512)");
a28091ae 1505 break;
38ed9ab2 1506
cd12fb90 1507 case 105:
4e033a6b 1508 ret += tcrypt_test("hmac(sha224)");
cd12fb90 1509 break;
1da177e4 1510
38ed9ab2 1511 case 106:
4e033a6b 1512 ret += tcrypt_test("xcbc(aes)");
38ed9ab2
HX
1513 break;
1514
fd4adf1a 1515 case 107:
4e033a6b 1516 ret += tcrypt_test("hmac(rmd128)");
fd4adf1a
AKR
1517 break;
1518
1519 case 108:
4e033a6b 1520 ret += tcrypt_test("hmac(rmd160)");
fd4adf1a
AKR
1521 break;
1522
f1939f7c
SW
1523 case 109:
1524 ret += tcrypt_test("vmac(aes)");
1525 break;
93b5e86a 1526
a482b081
SZ
1527 case 110:
1528 ret += tcrypt_test("hmac(crc32)");
1529 break;
f1939f7c 1530
e08ca2da 1531 case 150:
4e033a6b 1532 ret += tcrypt_test("ansi_cprng");
e08ca2da
JW
1533 break;
1534
69435b94
AH
1535 case 151:
1536 ret += tcrypt_test("rfc4106(gcm(aes))");
1537 break;
1538
e9b7441a
JK
1539 case 152:
1540 ret += tcrypt_test("rfc4543(gcm(aes))");
1541 break;
1542
93b5e86a
JK
1543 case 153:
1544 ret += tcrypt_test("cmac(aes)");
1545 break;
1546
1547 case 154:
1548 ret += tcrypt_test("cmac(des3_ede)");
1549 break;
1550
bbf9c893
HG
1551 case 155:
1552 ret += tcrypt_test("authenc(hmac(sha1),cbc(aes))");
1553 break;
1554
bca4feb0
HG
1555 case 156:
1556 ret += tcrypt_test("authenc(hmac(md5),ecb(cipher_null))");
1557 break;
1558
1559 case 157:
1560 ret += tcrypt_test("authenc(hmac(sha1),ecb(cipher_null))");
1561 break;
5208ed2c
NL
1562 case 181:
1563 ret += tcrypt_test("authenc(hmac(sha1),cbc(des))");
1564 break;
1565 case 182:
1566 ret += tcrypt_test("authenc(hmac(sha1),cbc(des3_ede))");
1567 break;
1568 case 183:
1569 ret += tcrypt_test("authenc(hmac(sha224),cbc(des))");
1570 break;
1571 case 184:
1572 ret += tcrypt_test("authenc(hmac(sha224),cbc(des3_ede))");
1573 break;
1574 case 185:
1575 ret += tcrypt_test("authenc(hmac(sha256),cbc(des))");
1576 break;
1577 case 186:
1578 ret += tcrypt_test("authenc(hmac(sha256),cbc(des3_ede))");
1579 break;
1580 case 187:
1581 ret += tcrypt_test("authenc(hmac(sha384),cbc(des))");
1582 break;
1583 case 188:
1584 ret += tcrypt_test("authenc(hmac(sha384),cbc(des3_ede))");
1585 break;
1586 case 189:
1587 ret += tcrypt_test("authenc(hmac(sha512),cbc(des))");
1588 break;
1589 case 190:
1590 ret += tcrypt_test("authenc(hmac(sha512),cbc(des3_ede))");
1591 break;
ebfd9bcf 1592 case 200:
cba83564 1593 test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
477035c2 1594 speed_template_16_24_32);
cba83564 1595 test_cipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
477035c2 1596 speed_template_16_24_32);
cba83564 1597 test_cipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
477035c2 1598 speed_template_16_24_32);
cba83564 1599 test_cipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
477035c2 1600 speed_template_16_24_32);
f3d1044c 1601 test_cipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
477035c2 1602 speed_template_32_40_48);
f3d1044c 1603 test_cipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
477035c2 1604 speed_template_32_40_48);
f19f5111 1605 test_cipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
477035c2 1606 speed_template_32_48_64);
f19f5111 1607 test_cipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
477035c2 1608 speed_template_32_48_64);
9996e342
JG
1609 test_cipher_speed("ctr(aes)", ENCRYPT, sec, NULL, 0,
1610 speed_template_16_24_32);
1611 test_cipher_speed("ctr(aes)", DECRYPT, sec, NULL, 0,
1612 speed_template_16_24_32);
ebfd9bcf
HW
1613 break;
1614
1615 case 201:
cba83564 1616 test_cipher_speed("ecb(des3_ede)", ENCRYPT, sec,
da7f033d 1617 des3_speed_template, DES3_SPEED_VECTORS,
477035c2 1618 speed_template_24);
cba83564 1619 test_cipher_speed("ecb(des3_ede)", DECRYPT, sec,
da7f033d 1620 des3_speed_template, DES3_SPEED_VECTORS,
477035c2 1621 speed_template_24);
cba83564 1622 test_cipher_speed("cbc(des3_ede)", ENCRYPT, sec,
da7f033d 1623 des3_speed_template, DES3_SPEED_VECTORS,
477035c2 1624 speed_template_24);
cba83564 1625 test_cipher_speed("cbc(des3_ede)", DECRYPT, sec,
da7f033d 1626 des3_speed_template, DES3_SPEED_VECTORS,
477035c2 1627 speed_template_24);
87131507
JK
1628 test_cipher_speed("ctr(des3_ede)", ENCRYPT, sec,
1629 des3_speed_template, DES3_SPEED_VECTORS,
1630 speed_template_24);
1631 test_cipher_speed("ctr(des3_ede)", DECRYPT, sec,
1632 des3_speed_template, DES3_SPEED_VECTORS,
1633 speed_template_24);
ebfd9bcf
HW
1634 break;
1635
1636 case 202:
cba83564 1637 test_cipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
477035c2 1638 speed_template_16_24_32);
cba83564 1639 test_cipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
477035c2 1640 speed_template_16_24_32);
cba83564 1641 test_cipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
477035c2 1642 speed_template_16_24_32);
cba83564 1643 test_cipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
477035c2 1644 speed_template_16_24_32);
ee5002a5
JK
1645 test_cipher_speed("ctr(twofish)", ENCRYPT, sec, NULL, 0,
1646 speed_template_16_24_32);
1647 test_cipher_speed("ctr(twofish)", DECRYPT, sec, NULL, 0,
1648 speed_template_16_24_32);
bee3a90e
JK
1649 test_cipher_speed("lrw(twofish)", ENCRYPT, sec, NULL, 0,
1650 speed_template_32_40_48);
1651 test_cipher_speed("lrw(twofish)", DECRYPT, sec, NULL, 0,
1652 speed_template_32_40_48);
131f7541
JK
1653 test_cipher_speed("xts(twofish)", ENCRYPT, sec, NULL, 0,
1654 speed_template_32_48_64);
1655 test_cipher_speed("xts(twofish)", DECRYPT, sec, NULL, 0,
1656 speed_template_32_48_64);
ebfd9bcf
HW
1657 break;
1658
1659 case 203:
cba83564 1660 test_cipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
477035c2 1661 speed_template_8_32);
cba83564 1662 test_cipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
477035c2 1663 speed_template_8_32);
cba83564 1664 test_cipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
477035c2 1665 speed_template_8_32);
cba83564 1666 test_cipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
477035c2 1667 speed_template_8_32);
7d47b86c
JK
1668 test_cipher_speed("ctr(blowfish)", ENCRYPT, sec, NULL, 0,
1669 speed_template_8_32);
1670 test_cipher_speed("ctr(blowfish)", DECRYPT, sec, NULL, 0,
1671 speed_template_8_32);
ebfd9bcf
HW
1672 break;
1673
1674 case 204:
cba83564 1675 test_cipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
477035c2 1676 speed_template_8);
cba83564 1677 test_cipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
477035c2 1678 speed_template_8);
cba83564 1679 test_cipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
477035c2 1680 speed_template_8);
cba83564 1681 test_cipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
477035c2 1682 speed_template_8);
ebfd9bcf
HW
1683 break;
1684
02ab5a70
NT
1685 case 205:
1686 test_cipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
477035c2 1687 speed_template_16_24_32);
02ab5a70 1688 test_cipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
477035c2 1689 speed_template_16_24_32);
02ab5a70 1690 test_cipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
477035c2 1691 speed_template_16_24_32);
02ab5a70 1692 test_cipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
477035c2 1693 speed_template_16_24_32);
4de59337
JK
1694 test_cipher_speed("ctr(camellia)", ENCRYPT, sec, NULL, 0,
1695 speed_template_16_24_32);
1696 test_cipher_speed("ctr(camellia)", DECRYPT, sec, NULL, 0,
1697 speed_template_16_24_32);
1698 test_cipher_speed("lrw(camellia)", ENCRYPT, sec, NULL, 0,
1699 speed_template_32_40_48);
1700 test_cipher_speed("lrw(camellia)", DECRYPT, sec, NULL, 0,
1701 speed_template_32_40_48);
1702 test_cipher_speed("xts(camellia)", ENCRYPT, sec, NULL, 0,
1703 speed_template_32_48_64);
1704 test_cipher_speed("xts(camellia)", DECRYPT, sec, NULL, 0,
1705 speed_template_32_48_64);
02ab5a70
NT
1706 break;
1707
5de8f1b5
TSH
1708 case 206:
1709 test_cipher_speed("salsa20", ENCRYPT, sec, NULL, 0,
477035c2 1710 speed_template_16_32);
5de8f1b5
TSH
1711 break;
1712
7fb7fe44
JK
1713 case 207:
1714 test_cipher_speed("ecb(serpent)", ENCRYPT, sec, NULL, 0,
1715 speed_template_16_32);
1716 test_cipher_speed("ecb(serpent)", DECRYPT, sec, NULL, 0,
1717 speed_template_16_32);
1718 test_cipher_speed("cbc(serpent)", ENCRYPT, sec, NULL, 0,
1719 speed_template_16_32);
1720 test_cipher_speed("cbc(serpent)", DECRYPT, sec, NULL, 0,
1721 speed_template_16_32);
1722 test_cipher_speed("ctr(serpent)", ENCRYPT, sec, NULL, 0,
1723 speed_template_16_32);
1724 test_cipher_speed("ctr(serpent)", DECRYPT, sec, NULL, 0,
1725 speed_template_16_32);
87aae4bf
JK
1726 test_cipher_speed("lrw(serpent)", ENCRYPT, sec, NULL, 0,
1727 speed_template_32_48);
1728 test_cipher_speed("lrw(serpent)", DECRYPT, sec, NULL, 0,
1729 speed_template_32_48);
5209c07a
JK
1730 test_cipher_speed("xts(serpent)", ENCRYPT, sec, NULL, 0,
1731 speed_template_32_64);
1732 test_cipher_speed("xts(serpent)", DECRYPT, sec, NULL, 0,
1733 speed_template_32_64);
7fb7fe44
JK
1734 break;
1735
31b4cd29
JK
1736 case 208:
1737 test_cipher_speed("ecb(arc4)", ENCRYPT, sec, NULL, 0,
1738 speed_template_8);
1739 break;
1740
a2c58260
JG
1741 case 209:
1742 test_cipher_speed("ecb(cast5)", ENCRYPT, sec, NULL, 0,
1743 speed_template_8_16);
1744 test_cipher_speed("ecb(cast5)", DECRYPT, sec, NULL, 0,
1745 speed_template_8_16);
1746 test_cipher_speed("cbc(cast5)", ENCRYPT, sec, NULL, 0,
1747 speed_template_8_16);
1748 test_cipher_speed("cbc(cast5)", DECRYPT, sec, NULL, 0,
1749 speed_template_8_16);
1750 test_cipher_speed("ctr(cast5)", ENCRYPT, sec, NULL, 0,
1751 speed_template_8_16);
1752 test_cipher_speed("ctr(cast5)", DECRYPT, sec, NULL, 0,
1753 speed_template_8_16);
1754 break;
1755
9b8b0405
JG
1756 case 210:
1757 test_cipher_speed("ecb(cast6)", ENCRYPT, sec, NULL, 0,
1758 speed_template_16_32);
1759 test_cipher_speed("ecb(cast6)", DECRYPT, sec, NULL, 0,
1760 speed_template_16_32);
1761 test_cipher_speed("cbc(cast6)", ENCRYPT, sec, NULL, 0,
1762 speed_template_16_32);
1763 test_cipher_speed("cbc(cast6)", DECRYPT, sec, NULL, 0,
1764 speed_template_16_32);
1765 test_cipher_speed("ctr(cast6)", ENCRYPT, sec, NULL, 0,
1766 speed_template_16_32);
1767 test_cipher_speed("ctr(cast6)", DECRYPT, sec, NULL, 0,
1768 speed_template_16_32);
1769 test_cipher_speed("lrw(cast6)", ENCRYPT, sec, NULL, 0,
1770 speed_template_32_48);
1771 test_cipher_speed("lrw(cast6)", DECRYPT, sec, NULL, 0,
1772 speed_template_32_48);
1773 test_cipher_speed("xts(cast6)", ENCRYPT, sec, NULL, 0,
1774 speed_template_32_64);
1775 test_cipher_speed("xts(cast6)", DECRYPT, sec, NULL, 0,
1776 speed_template_32_64);
1777 break;
1778
53f52d7a
TC
1779 case 211:
1780 test_aead_speed("rfc4106(gcm(aes))", ENCRYPT, sec,
34a1c740 1781 NULL, 0, 16, 16, aead_speed_template_20);
1425d2d1
VL
1782 test_aead_speed("gcm(aes)", ENCRYPT, sec,
1783 NULL, 0, 16, 8, aead_speed_template_20);
53f52d7a
TC
1784 break;
1785
4e4aab63
HX
1786 case 212:
1787 test_aead_speed("rfc4309(ccm(aes))", ENCRYPT, sec,
34a1c740 1788 NULL, 0, 16, 16, aead_speed_template_19);
4e4aab63
HX
1789 break;
1790
2dce063a
MW
1791 case 213:
1792 test_aead_speed("rfc7539esp(chacha20,poly1305)", ENCRYPT, sec,
1793 NULL, 0, 16, 8, aead_speed_template_36);
1794 break;
1795
1796 case 214:
1797 test_cipher_speed("chacha20", ENCRYPT, sec, NULL, 0,
1798 speed_template_32);
1799 break;
1800
1801
e8057928 1802 case 300:
8606813a
HX
1803 if (alg) {
1804 test_hash_speed(alg, sec, generic_hash_speed_template);
1805 break;
1806 }
1807
e8057928
ML
1808 /* fall through */
1809
1810 case 301:
e9d41164 1811 test_hash_speed("md4", sec, generic_hash_speed_template);
e8057928
ML
1812 if (mode > 300 && mode < 400) break;
1813
1814 case 302:
e9d41164 1815 test_hash_speed("md5", sec, generic_hash_speed_template);
e8057928
ML
1816 if (mode > 300 && mode < 400) break;
1817
1818 case 303:
e9d41164 1819 test_hash_speed("sha1", sec, generic_hash_speed_template);
e8057928
ML
1820 if (mode > 300 && mode < 400) break;
1821
1822 case 304:
e9d41164 1823 test_hash_speed("sha256", sec, generic_hash_speed_template);
e8057928
ML
1824 if (mode > 300 && mode < 400) break;
1825
1826 case 305:
e9d41164 1827 test_hash_speed("sha384", sec, generic_hash_speed_template);
e8057928
ML
1828 if (mode > 300 && mode < 400) break;
1829
1830 case 306:
e9d41164 1831 test_hash_speed("sha512", sec, generic_hash_speed_template);
e8057928
ML
1832 if (mode > 300 && mode < 400) break;
1833
1834 case 307:
e9d41164 1835 test_hash_speed("wp256", sec, generic_hash_speed_template);
e8057928
ML
1836 if (mode > 300 && mode < 400) break;
1837
1838 case 308:
e9d41164 1839 test_hash_speed("wp384", sec, generic_hash_speed_template);
e8057928
ML
1840 if (mode > 300 && mode < 400) break;
1841
1842 case 309:
e9d41164 1843 test_hash_speed("wp512", sec, generic_hash_speed_template);
e8057928
ML
1844 if (mode > 300 && mode < 400) break;
1845
1846 case 310:
e9d41164 1847 test_hash_speed("tgr128", sec, generic_hash_speed_template);
e8057928
ML
1848 if (mode > 300 && mode < 400) break;
1849
1850 case 311:
e9d41164 1851 test_hash_speed("tgr160", sec, generic_hash_speed_template);
e8057928
ML
1852 if (mode > 300 && mode < 400) break;
1853
1854 case 312:
e9d41164 1855 test_hash_speed("tgr192", sec, generic_hash_speed_template);
e8057928
ML
1856 if (mode > 300 && mode < 400) break;
1857
cd12fb90
JL
1858 case 313:
1859 test_hash_speed("sha224", sec, generic_hash_speed_template);
1860 if (mode > 300 && mode < 400) break;
1861
fd4adf1a
AKR
1862 case 314:
1863 test_hash_speed("rmd128", sec, generic_hash_speed_template);
1864 if (mode > 300 && mode < 400) break;
1865
1866 case 315:
1867 test_hash_speed("rmd160", sec, generic_hash_speed_template);
1868 if (mode > 300 && mode < 400) break;
1869
2998db37
AKR
1870 case 316:
1871 test_hash_speed("rmd256", sec, generic_hash_speed_template);
1872 if (mode > 300 && mode < 400) break;
1873
1874 case 317:
1875 test_hash_speed("rmd320", sec, generic_hash_speed_template);
1876 if (mode > 300 && mode < 400) break;
1877
18bcc919
HY
1878 case 318:
1879 test_hash_speed("ghash-generic", sec, hash_speed_template_16);
1880 if (mode > 300 && mode < 400) break;
1881
e3899e4d
TC
1882 case 319:
1883 test_hash_speed("crc32c", sec, generic_hash_speed_template);
1884 if (mode > 300 && mode < 400) break;
1885
68411521
HX
1886 case 320:
1887 test_hash_speed("crct10dif", sec, generic_hash_speed_template);
1888 if (mode > 300 && mode < 400) break;
1889
2dce063a
MW
1890 case 321:
1891 test_hash_speed("poly1305", sec, poly1305_speed_template);
1892 if (mode > 300 && mode < 400) break;
1893
e8057928
ML
1894 case 399:
1895 break;
1896
beb63da7 1897 case 400:
8606813a
HX
1898 if (alg) {
1899 test_ahash_speed(alg, sec, generic_hash_speed_template);
1900 break;
1901 }
1902
beb63da7
DM
1903 /* fall through */
1904
1905 case 401:
1906 test_ahash_speed("md4", sec, generic_hash_speed_template);
1907 if (mode > 400 && mode < 500) break;
1908
1909 case 402:
1910 test_ahash_speed("md5", sec, generic_hash_speed_template);
1911 if (mode > 400 && mode < 500) break;
1912
1913 case 403:
1914 test_ahash_speed("sha1", sec, generic_hash_speed_template);
1915 if (mode > 400 && mode < 500) break;
1916
1917 case 404:
1918 test_ahash_speed("sha256", sec, generic_hash_speed_template);
1919 if (mode > 400 && mode < 500) break;
1920
1921 case 405:
1922 test_ahash_speed("sha384", sec, generic_hash_speed_template);
1923 if (mode > 400 && mode < 500) break;
1924
1925 case 406:
1926 test_ahash_speed("sha512", sec, generic_hash_speed_template);
1927 if (mode > 400 && mode < 500) break;
1928
1929 case 407:
1930 test_ahash_speed("wp256", sec, generic_hash_speed_template);
1931 if (mode > 400 && mode < 500) break;
1932
1933 case 408:
1934 test_ahash_speed("wp384", sec, generic_hash_speed_template);
1935 if (mode > 400 && mode < 500) break;
1936
1937 case 409:
1938 test_ahash_speed("wp512", sec, generic_hash_speed_template);
1939 if (mode > 400 && mode < 500) break;
1940
1941 case 410:
1942 test_ahash_speed("tgr128", sec, generic_hash_speed_template);
1943 if (mode > 400 && mode < 500) break;
1944
1945 case 411:
1946 test_ahash_speed("tgr160", sec, generic_hash_speed_template);
1947 if (mode > 400 && mode < 500) break;
1948
1949 case 412:
1950 test_ahash_speed("tgr192", sec, generic_hash_speed_template);
1951 if (mode > 400 && mode < 500) break;
1952
1953 case 413:
1954 test_ahash_speed("sha224", sec, generic_hash_speed_template);
1955 if (mode > 400 && mode < 500) break;
1956
1957 case 414:
1958 test_ahash_speed("rmd128", sec, generic_hash_speed_template);
1959 if (mode > 400 && mode < 500) break;
1960
1961 case 415:
1962 test_ahash_speed("rmd160", sec, generic_hash_speed_template);
1963 if (mode > 400 && mode < 500) break;
1964
1965 case 416:
1966 test_ahash_speed("rmd256", sec, generic_hash_speed_template);
1967 if (mode > 400 && mode < 500) break;
1968
1969 case 417:
1970 test_ahash_speed("rmd320", sec, generic_hash_speed_template);
1971 if (mode > 400 && mode < 500) break;
1972
1973 case 499:
1974 break;
1975
3f3baf35
JK
1976 case 500:
1977 test_acipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
1978 speed_template_16_24_32);
1979 test_acipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
1980 speed_template_16_24_32);
1981 test_acipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
1982 speed_template_16_24_32);
1983 test_acipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
1984 speed_template_16_24_32);
1985 test_acipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
1986 speed_template_32_40_48);
1987 test_acipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
1988 speed_template_32_40_48);
1989 test_acipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
1990 speed_template_32_48_64);
1991 test_acipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
1992 speed_template_32_48_64);
1993 test_acipher_speed("ctr(aes)", ENCRYPT, sec, NULL, 0,
1994 speed_template_16_24_32);
1995 test_acipher_speed("ctr(aes)", DECRYPT, sec, NULL, 0,
1996 speed_template_16_24_32);
de197533
NR
1997 test_acipher_speed("cfb(aes)", ENCRYPT, sec, NULL, 0,
1998 speed_template_16_24_32);
1999 test_acipher_speed("cfb(aes)", DECRYPT, sec, NULL, 0,
2000 speed_template_16_24_32);
2001 test_acipher_speed("ofb(aes)", ENCRYPT, sec, NULL, 0,
2002 speed_template_16_24_32);
2003 test_acipher_speed("ofb(aes)", DECRYPT, sec, NULL, 0,
2004 speed_template_16_24_32);
69d3150c
JK
2005 test_acipher_speed("rfc3686(ctr(aes))", ENCRYPT, sec, NULL, 0,
2006 speed_template_20_28_36);
2007 test_acipher_speed("rfc3686(ctr(aes))", DECRYPT, sec, NULL, 0,
2008 speed_template_20_28_36);
3f3baf35
JK
2009 break;
2010
2011 case 501:
2012 test_acipher_speed("ecb(des3_ede)", ENCRYPT, sec,
2013 des3_speed_template, DES3_SPEED_VECTORS,
2014 speed_template_24);
2015 test_acipher_speed("ecb(des3_ede)", DECRYPT, sec,
2016 des3_speed_template, DES3_SPEED_VECTORS,
2017 speed_template_24);
2018 test_acipher_speed("cbc(des3_ede)", ENCRYPT, sec,
2019 des3_speed_template, DES3_SPEED_VECTORS,
2020 speed_template_24);
2021 test_acipher_speed("cbc(des3_ede)", DECRYPT, sec,
2022 des3_speed_template, DES3_SPEED_VECTORS,
2023 speed_template_24);
de197533
NR
2024 test_acipher_speed("cfb(des3_ede)", ENCRYPT, sec,
2025 des3_speed_template, DES3_SPEED_VECTORS,
2026 speed_template_24);
2027 test_acipher_speed("cfb(des3_ede)", DECRYPT, sec,
2028 des3_speed_template, DES3_SPEED_VECTORS,
2029 speed_template_24);
2030 test_acipher_speed("ofb(des3_ede)", ENCRYPT, sec,
2031 des3_speed_template, DES3_SPEED_VECTORS,
2032 speed_template_24);
2033 test_acipher_speed("ofb(des3_ede)", DECRYPT, sec,
2034 des3_speed_template, DES3_SPEED_VECTORS,
2035 speed_template_24);
3f3baf35
JK
2036 break;
2037
2038 case 502:
2039 test_acipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
2040 speed_template_8);
2041 test_acipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
2042 speed_template_8);
2043 test_acipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
2044 speed_template_8);
2045 test_acipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
2046 speed_template_8);
de197533
NR
2047 test_acipher_speed("cfb(des)", ENCRYPT, sec, NULL, 0,
2048 speed_template_8);
2049 test_acipher_speed("cfb(des)", DECRYPT, sec, NULL, 0,
2050 speed_template_8);
2051 test_acipher_speed("ofb(des)", ENCRYPT, sec, NULL, 0,
2052 speed_template_8);
2053 test_acipher_speed("ofb(des)", DECRYPT, sec, NULL, 0,
2054 speed_template_8);
3f3baf35
JK
2055 break;
2056
7fb7fe44
JK
2057 case 503:
2058 test_acipher_speed("ecb(serpent)", ENCRYPT, sec, NULL, 0,
2059 speed_template_16_32);
2060 test_acipher_speed("ecb(serpent)", DECRYPT, sec, NULL, 0,
2061 speed_template_16_32);
2062 test_acipher_speed("cbc(serpent)", ENCRYPT, sec, NULL, 0,
2063 speed_template_16_32);
2064 test_acipher_speed("cbc(serpent)", DECRYPT, sec, NULL, 0,
2065 speed_template_16_32);
2066 test_acipher_speed("ctr(serpent)", ENCRYPT, sec, NULL, 0,
2067 speed_template_16_32);
2068 test_acipher_speed("ctr(serpent)", DECRYPT, sec, NULL, 0,
2069 speed_template_16_32);
87aae4bf
JK
2070 test_acipher_speed("lrw(serpent)", ENCRYPT, sec, NULL, 0,
2071 speed_template_32_48);
2072 test_acipher_speed("lrw(serpent)", DECRYPT, sec, NULL, 0,
2073 speed_template_32_48);
5209c07a
JK
2074 test_acipher_speed("xts(serpent)", ENCRYPT, sec, NULL, 0,
2075 speed_template_32_64);
2076 test_acipher_speed("xts(serpent)", DECRYPT, sec, NULL, 0,
2077 speed_template_32_64);
7fb7fe44
JK
2078 break;
2079
107778b5
JG
2080 case 504:
2081 test_acipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
2082 speed_template_16_24_32);
2083 test_acipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
2084 speed_template_16_24_32);
2085 test_acipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
2086 speed_template_16_24_32);
2087 test_acipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
2088 speed_template_16_24_32);
2089 test_acipher_speed("ctr(twofish)", ENCRYPT, sec, NULL, 0,
2090 speed_template_16_24_32);
2091 test_acipher_speed("ctr(twofish)", DECRYPT, sec, NULL, 0,
2092 speed_template_16_24_32);
2093 test_acipher_speed("lrw(twofish)", ENCRYPT, sec, NULL, 0,
2094 speed_template_32_40_48);
2095 test_acipher_speed("lrw(twofish)", DECRYPT, sec, NULL, 0,
2096 speed_template_32_40_48);
2097 test_acipher_speed("xts(twofish)", ENCRYPT, sec, NULL, 0,
2098 speed_template_32_48_64);
2099 test_acipher_speed("xts(twofish)", DECRYPT, sec, NULL, 0,
2100 speed_template_32_48_64);
2101 break;
2102
31b4cd29
JK
2103 case 505:
2104 test_acipher_speed("ecb(arc4)", ENCRYPT, sec, NULL, 0,
2105 speed_template_8);
2106 break;
2107
a2c58260
JG
2108 case 506:
2109 test_acipher_speed("ecb(cast5)", ENCRYPT, sec, NULL, 0,
2110 speed_template_8_16);
2111 test_acipher_speed("ecb(cast5)", DECRYPT, sec, NULL, 0,
2112 speed_template_8_16);
2113 test_acipher_speed("cbc(cast5)", ENCRYPT, sec, NULL, 0,
2114 speed_template_8_16);
2115 test_acipher_speed("cbc(cast5)", DECRYPT, sec, NULL, 0,
2116 speed_template_8_16);
2117 test_acipher_speed("ctr(cast5)", ENCRYPT, sec, NULL, 0,
2118 speed_template_8_16);
2119 test_acipher_speed("ctr(cast5)", DECRYPT, sec, NULL, 0,
2120 speed_template_8_16);
2121 break;
2122
9b8b0405
JG
2123 case 507:
2124 test_acipher_speed("ecb(cast6)", ENCRYPT, sec, NULL, 0,
2125 speed_template_16_32);
2126 test_acipher_speed("ecb(cast6)", DECRYPT, sec, NULL, 0,
2127 speed_template_16_32);
2128 test_acipher_speed("cbc(cast6)", ENCRYPT, sec, NULL, 0,
2129 speed_template_16_32);
2130 test_acipher_speed("cbc(cast6)", DECRYPT, sec, NULL, 0,
2131 speed_template_16_32);
2132 test_acipher_speed("ctr(cast6)", ENCRYPT, sec, NULL, 0,
2133 speed_template_16_32);
2134 test_acipher_speed("ctr(cast6)", DECRYPT, sec, NULL, 0,
2135 speed_template_16_32);
2136 test_acipher_speed("lrw(cast6)", ENCRYPT, sec, NULL, 0,
2137 speed_template_32_48);
2138 test_acipher_speed("lrw(cast6)", DECRYPT, sec, NULL, 0,
2139 speed_template_32_48);
2140 test_acipher_speed("xts(cast6)", ENCRYPT, sec, NULL, 0,
2141 speed_template_32_64);
2142 test_acipher_speed("xts(cast6)", DECRYPT, sec, NULL, 0,
2143 speed_template_32_64);
2144 break;
2145
bf9c5181
JK
2146 case 508:
2147 test_acipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
2148 speed_template_16_32);
2149 test_acipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
2150 speed_template_16_32);
2151 test_acipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
2152 speed_template_16_32);
2153 test_acipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
2154 speed_template_16_32);
2155 test_acipher_speed("ctr(camellia)", ENCRYPT, sec, NULL, 0,
2156 speed_template_16_32);
2157 test_acipher_speed("ctr(camellia)", DECRYPT, sec, NULL, 0,
2158 speed_template_16_32);
2159 test_acipher_speed("lrw(camellia)", ENCRYPT, sec, NULL, 0,
2160 speed_template_32_48);
2161 test_acipher_speed("lrw(camellia)", DECRYPT, sec, NULL, 0,
2162 speed_template_32_48);
2163 test_acipher_speed("xts(camellia)", ENCRYPT, sec, NULL, 0,
2164 speed_template_32_64);
2165 test_acipher_speed("xts(camellia)", DECRYPT, sec, NULL, 0,
2166 speed_template_32_64);
2167 break;
2168
ad8b7c3e
JK
2169 case 509:
2170 test_acipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
2171 speed_template_8_32);
2172 test_acipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
2173 speed_template_8_32);
2174 test_acipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
2175 speed_template_8_32);
2176 test_acipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
2177 speed_template_8_32);
2178 test_acipher_speed("ctr(blowfish)", ENCRYPT, sec, NULL, 0,
2179 speed_template_8_32);
2180 test_acipher_speed("ctr(blowfish)", DECRYPT, sec, NULL, 0,
2181 speed_template_8_32);
2182 break;
2183
1da177e4
LT
2184 case 1000:
2185 test_available();
2186 break;
1da177e4 2187 }
4e033a6b
JW
2188
2189 return ret;
1da177e4
LT
2190}
2191
3af5b90b 2192static int __init tcrypt_mod_init(void)
1da177e4 2193{
e3a4ea4f 2194 int err = -ENOMEM;
f139cfa7 2195 int i;
e3a4ea4f 2196
f139cfa7
HX
2197 for (i = 0; i < TVMEMSIZE; i++) {
2198 tvmem[i] = (void *)__get_free_page(GFP_KERNEL);
2199 if (!tvmem[i])
2200 goto err_free_tv;
2201 }
1da177e4 2202
8606813a 2203 err = do_test(alg, type, mask, mode);
a873a5f1 2204
4e033a6b
JW
2205 if (err) {
2206 printk(KERN_ERR "tcrypt: one or more tests failed!\n");
2207 goto err_free_tv;
2208 }
14fdf477 2209
4e033a6b
JW
2210 /* We intentionaly return -EAGAIN to prevent keeping the module,
2211 * unless we're running in fips mode. It does all its work from
2212 * init() and doesn't offer any runtime functionality, but in
2213 * the fips case, checking for a successful load is helpful.
14fdf477
ML
2214 * => we don't need it in the memory, do we?
2215 * -- mludvig
2216 */
4e033a6b
JW
2217 if (!fips_enabled)
2218 err = -EAGAIN;
e3a4ea4f 2219
f139cfa7
HX
2220err_free_tv:
2221 for (i = 0; i < TVMEMSIZE && tvmem[i]; i++)
2222 free_page((unsigned long)tvmem[i]);
e3a4ea4f
MH
2223
2224 return err;
1da177e4
LT
2225}
2226
2227/*
2228 * If an init function is provided, an exit function must also be provided
2229 * to allow module unload.
2230 */
3af5b90b 2231static void __exit tcrypt_mod_fini(void) { }
1da177e4 2232
3af5b90b
KB
2233module_init(tcrypt_mod_init);
2234module_exit(tcrypt_mod_fini);
1da177e4 2235
a873a5f1
SK
2236module_param(alg, charp, 0);
2237module_param(type, uint, 0);
7be380f7 2238module_param(mask, uint, 0);
1da177e4 2239module_param(mode, int, 0);
ebfd9bcf 2240module_param(sec, uint, 0);
6a17944c
HX
2241MODULE_PARM_DESC(sec, "Length in seconds of speed tests "
2242 "(defaults to zero which uses CPU cycles instead)");
1da177e4
LT
2243
2244MODULE_LICENSE("GPL");
2245MODULE_DESCRIPTION("Quick & dirty crypto testing module");
2246MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");