2 * Quick & dirty crypto testing module.
4 * This will only exist until we have a better testing mechanism
5 * (e.g. a char device).
7 * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
8 * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
9 * Copyright (c) 2007 Nokia Siemens Networks
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.
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
20 * Software Foundation; either version 2 of the License, or (at your option)
25 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
27 #include <crypto/aead.h>
28 #include <crypto/hash.h>
29 #include <crypto/skcipher.h>
30 #include <linux/err.h>
31 #include <linux/fips.h>
32 #include <linux/init.h>
33 #include <linux/gfp.h>
34 #include <linux/module.h>
35 #include <linux/scatterlist.h>
36 #include <linux/string.h>
37 #include <linux/moduleparam.h>
38 #include <linux/jiffies.h>
39 #include <linux/timex.h>
40 #include <linux/interrupt.h>
44 * Need slab memory for testing (size in number of pages).
49 * Used by test_cipher_speed()
54 #define MAX_DIGEST_SIZE 64
57 * return a string with the driver name
59 #define get_driver_name(tfm_type, tfm) crypto_tfm_alg_driver_name(tfm_type ## _tfm(tfm))
62 * Used by test_cipher_speed()
64 static unsigned int sec
;
66 static char *alg
= NULL
;
70 static u32 num_mb
= 8;
71 static char *tvmem
[TVMEMSIZE
];
73 static char *check
[] = {
74 "des", "md5", "des3_ede", "rot13", "sha1", "sha224", "sha256", "sm3",
75 "blowfish", "twofish", "serpent", "sha384", "sha512", "md4", "aes",
76 "cast6", "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
77 "khazad", "wp512", "wp384", "wp256", "tnepres", "xeta", "fcrypt",
78 "camellia", "seed", "salsa20", "rmd128", "rmd160", "rmd256", "rmd320",
79 "lzo", "cts", "sha3-224", "sha3-256", "sha3-384", "sha3-512", NULL
82 static u32 block_sizes
[] = { 16, 64, 256, 1024, 8192, 0 };
83 static u32 aead_sizes
[] = { 16, 64, 256, 512, 1024, 2048, 4096, 8192, 0 };
88 static int testmgr_alloc_buf(char *buf
[XBUFSIZE
])
92 for (i
= 0; i
< XBUFSIZE
; i
++) {
93 buf
[i
] = (void *)__get_free_page(GFP_KERNEL
);
102 free_page((unsigned long)buf
[i
]);
107 static void testmgr_free_buf(char *buf
[XBUFSIZE
])
111 for (i
= 0; i
< XBUFSIZE
; i
++)
112 free_page((unsigned long)buf
[i
]);
115 static void sg_init_aead(struct scatterlist
*sg
, char *xbuf
[XBUFSIZE
],
116 unsigned int buflen
, const void *assoc
,
117 unsigned int aad_size
)
119 int np
= (buflen
+ PAGE_SIZE
- 1)/PAGE_SIZE
;
126 rem
= buflen
% PAGE_SIZE
;
129 sg_init_table(sg
, np
+ 1);
131 sg_set_buf(&sg
[0], assoc
, aad_size
);
135 for (k
= 0; k
< np
; k
++)
136 sg_set_buf(&sg
[k
+ 1], xbuf
[k
], PAGE_SIZE
);
139 sg_set_buf(&sg
[k
+ 1], xbuf
[k
], rem
);
142 static inline int do_one_aead_op(struct aead_request
*req
, int ret
)
144 struct crypto_wait
*wait
= req
->base
.data
;
146 return crypto_wait_req(ret
, wait
);
149 struct test_mb_aead_data
{
150 struct scatterlist sg
[XBUFSIZE
];
151 struct scatterlist sgout
[XBUFSIZE
];
152 struct aead_request
*req
;
153 struct crypto_wait wait
;
154 char *xbuf
[XBUFSIZE
];
155 char *xoutbuf
[XBUFSIZE
];
156 char *axbuf
[XBUFSIZE
];
159 static int do_mult_aead_op(struct test_mb_aead_data
*data
, int enc
,
164 /* Fire up a bunch of concurrent requests */
165 for (i
= 0; i
< num_mb
; i
++) {
167 rc
[i
] = crypto_aead_encrypt(data
[i
].req
);
169 rc
[i
] = crypto_aead_decrypt(data
[i
].req
);
172 /* Wait for all requests to finish */
173 for (i
= 0; i
< num_mb
; i
++) {
174 rc
[i
] = crypto_wait_req(rc
[i
], &data
[i
].wait
);
177 pr_info("concurrent request %d error %d\n", i
, rc
[i
]);
185 static int test_mb_aead_jiffies(struct test_mb_aead_data
*data
, int enc
,
186 int blen
, int secs
, u32 num_mb
)
188 unsigned long start
, end
;
193 rc
= kcalloc(num_mb
, sizeof(*rc
), GFP_KERNEL
);
197 for (start
= jiffies
, end
= start
+ secs
* HZ
, bcount
= 0;
198 time_before(jiffies
, end
); bcount
++) {
199 ret
= do_mult_aead_op(data
, enc
, num_mb
, rc
);
204 pr_cont("%d operations in %d seconds (%ld bytes)\n",
205 bcount
* num_mb
, secs
, (long)bcount
* blen
* num_mb
);
212 static int test_mb_aead_cycles(struct test_mb_aead_data
*data
, int enc
,
213 int blen
, u32 num_mb
)
215 unsigned long cycles
= 0;
220 rc
= kcalloc(num_mb
, sizeof(*rc
), GFP_KERNEL
);
225 for (i
= 0; i
< 4; i
++) {
226 ret
= do_mult_aead_op(data
, enc
, num_mb
, rc
);
231 /* The real thing. */
232 for (i
= 0; i
< 8; i
++) {
235 start
= get_cycles();
236 ret
= do_mult_aead_op(data
, enc
, num_mb
, rc
);
242 cycles
+= end
- start
;
245 pr_cont("1 operation in %lu cycles (%d bytes)\n",
246 (cycles
+ 4) / (8 * num_mb
), blen
);
253 static void test_mb_aead_speed(const char *algo
, int enc
, int secs
,
254 struct aead_speed_template
*template,
255 unsigned int tcount
, u8 authsize
,
256 unsigned int aad_size
, u8
*keysize
, u32 num_mb
)
258 struct test_mb_aead_data
*data
;
259 struct crypto_aead
*tfm
;
260 unsigned int i
, j
, iv_len
;
269 if (aad_size
>= PAGE_SIZE
) {
270 pr_err("associate data length (%u) too big\n", aad_size
);
274 iv
= kzalloc(MAX_IVLEN
, GFP_KERNEL
);
283 data
= kcalloc(num_mb
, sizeof(*data
), GFP_KERNEL
);
287 tfm
= crypto_alloc_aead(algo
, 0, 0);
289 pr_err("failed to load transform for %s: %ld\n",
294 ret
= crypto_aead_setauthsize(tfm
, authsize
);
296 for (i
= 0; i
< num_mb
; ++i
)
297 if (testmgr_alloc_buf(data
[i
].xbuf
)) {
299 testmgr_free_buf(data
[i
].xbuf
);
303 for (i
= 0; i
< num_mb
; ++i
)
304 if (testmgr_alloc_buf(data
[i
].axbuf
)) {
306 testmgr_free_buf(data
[i
].axbuf
);
310 for (i
= 0; i
< num_mb
; ++i
)
311 if (testmgr_alloc_buf(data
[i
].xoutbuf
)) {
313 testmgr_free_buf(data
[i
].xoutbuf
);
317 for (i
= 0; i
< num_mb
; ++i
) {
318 data
[i
].req
= aead_request_alloc(tfm
, GFP_KERNEL
);
320 pr_err("alg: skcipher: Failed to allocate request for %s\n",
323 aead_request_free(data
[i
].req
);
324 goto out_free_xoutbuf
;
328 for (i
= 0; i
< num_mb
; ++i
) {
329 crypto_init_wait(&data
[i
].wait
);
330 aead_request_set_callback(data
[i
].req
,
331 CRYPTO_TFM_REQ_MAY_BACKLOG
,
332 crypto_req_done
, &data
[i
].wait
);
335 pr_info("\ntesting speed of multibuffer %s (%s) %s\n", algo
,
336 get_driver_name(crypto_aead
, tfm
), e
);
342 if (*b_size
+ authsize
> XBUFSIZE
* PAGE_SIZE
) {
343 pr_err("template (%u) too big for buffer (%lu)\n",
345 XBUFSIZE
* PAGE_SIZE
);
349 pr_info("test %u (%d bit key, %d byte blocks): ", i
,
350 *keysize
* 8, *b_size
);
352 /* Set up tfm global state, i.e. the key */
354 memset(tvmem
[0], 0xff, PAGE_SIZE
);
356 for (j
= 0; j
< tcount
; j
++) {
357 if (template[j
].klen
== *keysize
) {
358 key
= template[j
].key
;
363 crypto_aead_clear_flags(tfm
, ~0);
365 ret
= crypto_aead_setkey(tfm
, key
, *keysize
);
367 pr_err("setkey() failed flags=%x\n",
368 crypto_aead_get_flags(tfm
));
372 iv_len
= crypto_aead_ivsize(tfm
);
374 memset(iv
, 0xff, iv_len
);
376 /* Now setup per request stuff, i.e. buffers */
378 for (j
= 0; j
< num_mb
; ++j
) {
379 struct test_mb_aead_data
*cur
= &data
[j
];
381 assoc
= cur
->axbuf
[0];
382 memset(assoc
, 0xff, aad_size
);
384 sg_init_aead(cur
->sg
, cur
->xbuf
,
385 *b_size
+ (enc
? 0 : authsize
),
388 sg_init_aead(cur
->sgout
, cur
->xoutbuf
,
389 *b_size
+ (enc
? authsize
: 0),
392 aead_request_set_ad(cur
->req
, aad_size
);
396 aead_request_set_crypt(cur
->req
,
400 ret
= crypto_aead_encrypt(cur
->req
);
401 ret
= do_one_aead_op(cur
->req
, ret
);
404 pr_err("calculating auth failed failed (%d)\n",
410 aead_request_set_crypt(cur
->req
, cur
->sg
,
411 cur
->sgout
, *b_size
+
412 (enc
? 0 : authsize
),
418 ret
= test_mb_aead_jiffies(data
, enc
, *b_size
,
422 ret
= test_mb_aead_cycles(data
, enc
, *b_size
,
427 pr_err("%s() failed return code=%d\n", e
, ret
);
437 for (i
= 0; i
< num_mb
; ++i
)
438 aead_request_free(data
[i
].req
);
440 for (i
= 0; i
< num_mb
; ++i
)
441 testmgr_free_buf(data
[i
].xoutbuf
);
443 for (i
= 0; i
< num_mb
; ++i
)
444 testmgr_free_buf(data
[i
].axbuf
);
446 for (i
= 0; i
< num_mb
; ++i
)
447 testmgr_free_buf(data
[i
].xbuf
);
449 crypto_free_aead(tfm
);
456 static int test_aead_jiffies(struct aead_request
*req
, int enc
,
459 unsigned long start
, end
;
463 for (start
= jiffies
, end
= start
+ secs
* HZ
, bcount
= 0;
464 time_before(jiffies
, end
); bcount
++) {
466 ret
= do_one_aead_op(req
, crypto_aead_encrypt(req
));
468 ret
= do_one_aead_op(req
, crypto_aead_decrypt(req
));
474 printk("%d operations in %d seconds (%ld bytes)\n",
475 bcount
, secs
, (long)bcount
* blen
);
479 static int test_aead_cycles(struct aead_request
*req
, int enc
, int blen
)
481 unsigned long cycles
= 0;
486 for (i
= 0; i
< 4; i
++) {
488 ret
= do_one_aead_op(req
, crypto_aead_encrypt(req
));
490 ret
= do_one_aead_op(req
, crypto_aead_decrypt(req
));
496 /* The real thing. */
497 for (i
= 0; i
< 8; i
++) {
500 start
= get_cycles();
502 ret
= do_one_aead_op(req
, crypto_aead_encrypt(req
));
504 ret
= do_one_aead_op(req
, crypto_aead_decrypt(req
));
510 cycles
+= end
- start
;
515 printk("1 operation in %lu cycles (%d bytes)\n",
516 (cycles
+ 4) / 8, blen
);
521 static void test_aead_speed(const char *algo
, int enc
, unsigned int secs
,
522 struct aead_speed_template
*template,
523 unsigned int tcount
, u8 authsize
,
524 unsigned int aad_size
, u8
*keysize
)
527 struct crypto_aead
*tfm
;
530 struct aead_request
*req
;
531 struct scatterlist
*sg
;
532 struct scatterlist
*sgout
;
536 char *xbuf
[XBUFSIZE
];
537 char *xoutbuf
[XBUFSIZE
];
538 char *axbuf
[XBUFSIZE
];
539 unsigned int *b_size
;
541 struct crypto_wait wait
;
543 iv
= kzalloc(MAX_IVLEN
, GFP_KERNEL
);
547 if (aad_size
>= PAGE_SIZE
) {
548 pr_err("associate data length (%u) too big\n", aad_size
);
557 if (testmgr_alloc_buf(xbuf
))
559 if (testmgr_alloc_buf(axbuf
))
561 if (testmgr_alloc_buf(xoutbuf
))
564 sg
= kmalloc(sizeof(*sg
) * 9 * 2, GFP_KERNEL
);
569 tfm
= crypto_alloc_aead(algo
, 0, 0);
572 pr_err("alg: aead: Failed to load transform for %s: %ld\n", algo
,
577 crypto_init_wait(&wait
);
578 printk(KERN_INFO
"\ntesting speed of %s (%s) %s\n", algo
,
579 get_driver_name(crypto_aead
, tfm
), e
);
581 req
= aead_request_alloc(tfm
, GFP_KERNEL
);
583 pr_err("alg: aead: Failed to allocate request for %s\n",
588 aead_request_set_callback(req
, CRYPTO_TFM_REQ_MAY_BACKLOG
,
589 crypto_req_done
, &wait
);
596 memset(assoc
, 0xff, aad_size
);
598 if ((*keysize
+ *b_size
) > TVMEMSIZE
* PAGE_SIZE
) {
599 pr_err("template (%u) too big for tvmem (%lu)\n",
601 TVMEMSIZE
* PAGE_SIZE
);
606 for (j
= 0; j
< tcount
; j
++) {
607 if (template[j
].klen
== *keysize
) {
608 key
= template[j
].key
;
612 ret
= crypto_aead_setkey(tfm
, key
, *keysize
);
613 ret
= crypto_aead_setauthsize(tfm
, authsize
);
615 iv_len
= crypto_aead_ivsize(tfm
);
617 memset(iv
, 0xff, iv_len
);
619 crypto_aead_clear_flags(tfm
, ~0);
620 printk(KERN_INFO
"test %u (%d bit key, %d byte blocks): ",
621 i
, *keysize
* 8, *b_size
);
624 memset(tvmem
[0], 0xff, PAGE_SIZE
);
627 pr_err("setkey() failed flags=%x\n",
628 crypto_aead_get_flags(tfm
));
632 sg_init_aead(sg
, xbuf
, *b_size
+ (enc
? 0 : authsize
),
635 sg_init_aead(sgout
, xoutbuf
,
636 *b_size
+ (enc
? authsize
: 0), assoc
,
639 aead_request_set_ad(req
, aad_size
);
644 * For decryption we need a proper auth so
645 * we do the encryption path once with buffers
646 * reversed (input <-> output) to calculate it
648 aead_request_set_crypt(req
, sgout
, sg
,
650 ret
= do_one_aead_op(req
,
651 crypto_aead_encrypt(req
));
654 pr_err("calculating auth failed failed (%d)\n",
660 aead_request_set_crypt(req
, sg
, sgout
,
661 *b_size
+ (enc
? 0 : authsize
),
665 ret
= test_aead_jiffies(req
, enc
, *b_size
,
669 ret
= test_aead_cycles(req
, enc
, *b_size
);
673 pr_err("%s() failed return code=%d\n", e
, ret
);
683 aead_request_free(req
);
685 crypto_free_aead(tfm
);
689 testmgr_free_buf(xoutbuf
);
691 testmgr_free_buf(axbuf
);
693 testmgr_free_buf(xbuf
);
698 static void test_hash_sg_init(struct scatterlist
*sg
)
702 sg_init_table(sg
, TVMEMSIZE
);
703 for (i
= 0; i
< TVMEMSIZE
; i
++) {
704 sg_set_buf(sg
+ i
, tvmem
[i
], PAGE_SIZE
);
705 memset(tvmem
[i
], 0xff, PAGE_SIZE
);
709 static inline int do_one_ahash_op(struct ahash_request
*req
, int ret
)
711 struct crypto_wait
*wait
= req
->base
.data
;
713 return crypto_wait_req(ret
, wait
);
716 struct test_mb_ahash_data
{
717 struct scatterlist sg
[XBUFSIZE
];
719 struct ahash_request
*req
;
720 struct crypto_wait wait
;
721 char *xbuf
[XBUFSIZE
];
724 static inline int do_mult_ahash_op(struct test_mb_ahash_data
*data
, u32 num_mb
,
729 /* Fire up a bunch of concurrent requests */
730 for (i
= 0; i
< num_mb
; i
++)
731 rc
[i
] = crypto_ahash_digest(data
[i
].req
);
733 /* Wait for all requests to finish */
734 for (i
= 0; i
< num_mb
; i
++) {
735 rc
[i
] = crypto_wait_req(rc
[i
], &data
[i
].wait
);
738 pr_info("concurrent request %d error %d\n", i
, rc
[i
]);
746 static int test_mb_ahash_jiffies(struct test_mb_ahash_data
*data
, int blen
,
747 int secs
, u32 num_mb
)
749 unsigned long start
, end
;
754 rc
= kcalloc(num_mb
, sizeof(*rc
), GFP_KERNEL
);
758 for (start
= jiffies
, end
= start
+ secs
* HZ
, bcount
= 0;
759 time_before(jiffies
, end
); bcount
++) {
760 ret
= do_mult_ahash_op(data
, num_mb
, rc
);
765 pr_cont("%d operations in %d seconds (%ld bytes)\n",
766 bcount
* num_mb
, secs
, (long)bcount
* blen
* num_mb
);
773 static int test_mb_ahash_cycles(struct test_mb_ahash_data
*data
, int blen
,
776 unsigned long cycles
= 0;
781 rc
= kcalloc(num_mb
, sizeof(*rc
), GFP_KERNEL
);
786 for (i
= 0; i
< 4; i
++) {
787 ret
= do_mult_ahash_op(data
, num_mb
, rc
);
792 /* The real thing. */
793 for (i
= 0; i
< 8; i
++) {
796 start
= get_cycles();
797 ret
= do_mult_ahash_op(data
, num_mb
, rc
);
803 cycles
+= end
- start
;
806 pr_cont("1 operation in %lu cycles (%d bytes)\n",
807 (cycles
+ 4) / (8 * num_mb
), blen
);
814 static void test_mb_ahash_speed(const char *algo
, unsigned int secs
,
815 struct hash_speed
*speed
, u32 num_mb
)
817 struct test_mb_ahash_data
*data
;
818 struct crypto_ahash
*tfm
;
819 unsigned int i
, j
, k
;
822 data
= kcalloc(num_mb
, sizeof(*data
), GFP_KERNEL
);
826 tfm
= crypto_alloc_ahash(algo
, 0, 0);
828 pr_err("failed to load transform for %s: %ld\n",
833 for (i
= 0; i
< num_mb
; ++i
) {
834 if (testmgr_alloc_buf(data
[i
].xbuf
))
837 crypto_init_wait(&data
[i
].wait
);
839 data
[i
].req
= ahash_request_alloc(tfm
, GFP_KERNEL
);
841 pr_err("alg: hash: Failed to allocate request for %s\n",
846 ahash_request_set_callback(data
[i
].req
, 0, crypto_req_done
,
849 sg_init_table(data
[i
].sg
, XBUFSIZE
);
850 for (j
= 0; j
< XBUFSIZE
; j
++) {
851 sg_set_buf(data
[i
].sg
+ j
, data
[i
].xbuf
[j
], PAGE_SIZE
);
852 memset(data
[i
].xbuf
[j
], 0xff, PAGE_SIZE
);
856 pr_info("\ntesting speed of multibuffer %s (%s)\n", algo
,
857 get_driver_name(crypto_ahash
, tfm
));
859 for (i
= 0; speed
[i
].blen
!= 0; i
++) {
860 /* For some reason this only tests digests. */
861 if (speed
[i
].blen
!= speed
[i
].plen
)
864 if (speed
[i
].blen
> XBUFSIZE
* PAGE_SIZE
) {
865 pr_err("template (%u) too big for tvmem (%lu)\n",
866 speed
[i
].blen
, XBUFSIZE
* PAGE_SIZE
);
871 crypto_ahash_setkey(tfm
, tvmem
[0], speed
[i
].klen
);
873 for (k
= 0; k
< num_mb
; k
++)
874 ahash_request_set_crypt(data
[k
].req
, data
[k
].sg
,
875 data
[k
].result
, speed
[i
].blen
);
878 "(%5u byte blocks,%5u bytes per update,%4u updates): ",
879 i
, speed
[i
].blen
, speed
[i
].plen
,
880 speed
[i
].blen
/ speed
[i
].plen
);
883 ret
= test_mb_ahash_jiffies(data
, speed
[i
].blen
, secs
,
887 ret
= test_mb_ahash_cycles(data
, speed
[i
].blen
, num_mb
);
892 pr_err("At least one hashing failed ret=%d\n", ret
);
898 for (k
= 0; k
< num_mb
; ++k
)
899 ahash_request_free(data
[k
].req
);
901 for (k
= 0; k
< num_mb
; ++k
)
902 testmgr_free_buf(data
[k
].xbuf
);
904 crypto_free_ahash(tfm
);
910 static int test_ahash_jiffies_digest(struct ahash_request
*req
, int blen
,
913 unsigned long start
, end
;
917 for (start
= jiffies
, end
= start
+ secs
* HZ
, bcount
= 0;
918 time_before(jiffies
, end
); bcount
++) {
919 ret
= do_one_ahash_op(req
, crypto_ahash_digest(req
));
924 printk("%6u opers/sec, %9lu bytes/sec\n",
925 bcount
/ secs
, ((long)bcount
* blen
) / secs
);
930 static int test_ahash_jiffies(struct ahash_request
*req
, int blen
,
931 int plen
, char *out
, int secs
)
933 unsigned long start
, end
;
938 return test_ahash_jiffies_digest(req
, blen
, out
, secs
);
940 for (start
= jiffies
, end
= start
+ secs
* HZ
, bcount
= 0;
941 time_before(jiffies
, end
); bcount
++) {
942 ret
= do_one_ahash_op(req
, crypto_ahash_init(req
));
945 for (pcount
= 0; pcount
< blen
; pcount
+= plen
) {
946 ret
= do_one_ahash_op(req
, crypto_ahash_update(req
));
950 /* we assume there is enough space in 'out' for the result */
951 ret
= do_one_ahash_op(req
, crypto_ahash_final(req
));
956 pr_cont("%6u opers/sec, %9lu bytes/sec\n",
957 bcount
/ secs
, ((long)bcount
* blen
) / secs
);
962 static int test_ahash_cycles_digest(struct ahash_request
*req
, int blen
,
965 unsigned long cycles
= 0;
969 for (i
= 0; i
< 4; i
++) {
970 ret
= do_one_ahash_op(req
, crypto_ahash_digest(req
));
975 /* The real thing. */
976 for (i
= 0; i
< 8; i
++) {
979 start
= get_cycles();
981 ret
= do_one_ahash_op(req
, crypto_ahash_digest(req
));
987 cycles
+= end
- start
;
994 pr_cont("%6lu cycles/operation, %4lu cycles/byte\n",
995 cycles
/ 8, cycles
/ (8 * blen
));
1000 static int test_ahash_cycles(struct ahash_request
*req
, int blen
,
1001 int plen
, char *out
)
1003 unsigned long cycles
= 0;
1007 return test_ahash_cycles_digest(req
, blen
, out
);
1010 for (i
= 0; i
< 4; i
++) {
1011 ret
= do_one_ahash_op(req
, crypto_ahash_init(req
));
1014 for (pcount
= 0; pcount
< blen
; pcount
+= plen
) {
1015 ret
= do_one_ahash_op(req
, crypto_ahash_update(req
));
1019 ret
= do_one_ahash_op(req
, crypto_ahash_final(req
));
1024 /* The real thing. */
1025 for (i
= 0; i
< 8; i
++) {
1026 cycles_t start
, end
;
1028 start
= get_cycles();
1030 ret
= do_one_ahash_op(req
, crypto_ahash_init(req
));
1033 for (pcount
= 0; pcount
< blen
; pcount
+= plen
) {
1034 ret
= do_one_ahash_op(req
, crypto_ahash_update(req
));
1038 ret
= do_one_ahash_op(req
, crypto_ahash_final(req
));
1044 cycles
+= end
- start
;
1051 pr_cont("%6lu cycles/operation, %4lu cycles/byte\n",
1052 cycles
/ 8, cycles
/ (8 * blen
));
1057 static void test_ahash_speed_common(const char *algo
, unsigned int secs
,
1058 struct hash_speed
*speed
, unsigned mask
)
1060 struct scatterlist sg
[TVMEMSIZE
];
1061 struct crypto_wait wait
;
1062 struct ahash_request
*req
;
1063 struct crypto_ahash
*tfm
;
1067 tfm
= crypto_alloc_ahash(algo
, 0, mask
);
1069 pr_err("failed to load transform for %s: %ld\n",
1070 algo
, PTR_ERR(tfm
));
1074 printk(KERN_INFO
"\ntesting speed of async %s (%s)\n", algo
,
1075 get_driver_name(crypto_ahash
, tfm
));
1077 if (crypto_ahash_digestsize(tfm
) > MAX_DIGEST_SIZE
) {
1078 pr_err("digestsize(%u) > %d\n", crypto_ahash_digestsize(tfm
),
1083 test_hash_sg_init(sg
);
1084 req
= ahash_request_alloc(tfm
, GFP_KERNEL
);
1086 pr_err("ahash request allocation failure\n");
1090 crypto_init_wait(&wait
);
1091 ahash_request_set_callback(req
, CRYPTO_TFM_REQ_MAY_BACKLOG
,
1092 crypto_req_done
, &wait
);
1094 output
= kmalloc(MAX_DIGEST_SIZE
, GFP_KERNEL
);
1098 for (i
= 0; speed
[i
].blen
!= 0; i
++) {
1099 if (speed
[i
].blen
> TVMEMSIZE
* PAGE_SIZE
) {
1100 pr_err("template (%u) too big for tvmem (%lu)\n",
1101 speed
[i
].blen
, TVMEMSIZE
* PAGE_SIZE
);
1106 crypto_ahash_setkey(tfm
, tvmem
[0], speed
[i
].klen
);
1109 "(%5u byte blocks,%5u bytes per update,%4u updates): ",
1110 i
, speed
[i
].blen
, speed
[i
].plen
, speed
[i
].blen
/ speed
[i
].plen
);
1112 ahash_request_set_crypt(req
, sg
, output
, speed
[i
].plen
);
1115 ret
= test_ahash_jiffies(req
, speed
[i
].blen
,
1116 speed
[i
].plen
, output
, secs
);
1119 ret
= test_ahash_cycles(req
, speed
[i
].blen
,
1120 speed
[i
].plen
, output
);
1124 pr_err("hashing failed ret=%d\n", ret
);
1132 ahash_request_free(req
);
1135 crypto_free_ahash(tfm
);
1138 static void test_ahash_speed(const char *algo
, unsigned int secs
,
1139 struct hash_speed
*speed
)
1141 return test_ahash_speed_common(algo
, secs
, speed
, 0);
1144 static void test_hash_speed(const char *algo
, unsigned int secs
,
1145 struct hash_speed
*speed
)
1147 return test_ahash_speed_common(algo
, secs
, speed
, CRYPTO_ALG_ASYNC
);
1150 struct test_mb_skcipher_data
{
1151 struct scatterlist sg
[XBUFSIZE
];
1152 struct skcipher_request
*req
;
1153 struct crypto_wait wait
;
1154 char *xbuf
[XBUFSIZE
];
1157 static int do_mult_acipher_op(struct test_mb_skcipher_data
*data
, int enc
,
1158 u32 num_mb
, int *rc
)
1162 /* Fire up a bunch of concurrent requests */
1163 for (i
= 0; i
< num_mb
; i
++) {
1165 rc
[i
] = crypto_skcipher_encrypt(data
[i
].req
);
1167 rc
[i
] = crypto_skcipher_decrypt(data
[i
].req
);
1170 /* Wait for all requests to finish */
1171 for (i
= 0; i
< num_mb
; i
++) {
1172 rc
[i
] = crypto_wait_req(rc
[i
], &data
[i
].wait
);
1175 pr_info("concurrent request %d error %d\n", i
, rc
[i
]);
1183 static int test_mb_acipher_jiffies(struct test_mb_skcipher_data
*data
, int enc
,
1184 int blen
, int secs
, u32 num_mb
)
1186 unsigned long start
, end
;
1191 rc
= kcalloc(num_mb
, sizeof(*rc
), GFP_KERNEL
);
1195 for (start
= jiffies
, end
= start
+ secs
* HZ
, bcount
= 0;
1196 time_before(jiffies
, end
); bcount
++) {
1197 ret
= do_mult_acipher_op(data
, enc
, num_mb
, rc
);
1202 pr_cont("%d operations in %d seconds (%ld bytes)\n",
1203 bcount
* num_mb
, secs
, (long)bcount
* blen
* num_mb
);
1210 static int test_mb_acipher_cycles(struct test_mb_skcipher_data
*data
, int enc
,
1211 int blen
, u32 num_mb
)
1213 unsigned long cycles
= 0;
1218 rc
= kcalloc(num_mb
, sizeof(*rc
), GFP_KERNEL
);
1223 for (i
= 0; i
< 4; i
++) {
1224 ret
= do_mult_acipher_op(data
, enc
, num_mb
, rc
);
1229 /* The real thing. */
1230 for (i
= 0; i
< 8; i
++) {
1231 cycles_t start
, end
;
1233 start
= get_cycles();
1234 ret
= do_mult_acipher_op(data
, enc
, num_mb
, rc
);
1240 cycles
+= end
- start
;
1243 pr_cont("1 operation in %lu cycles (%d bytes)\n",
1244 (cycles
+ 4) / (8 * num_mb
), blen
);
1251 static void test_mb_skcipher_speed(const char *algo
, int enc
, int secs
,
1252 struct cipher_speed_template
*template,
1253 unsigned int tcount
, u8
*keysize
, u32 num_mb
)
1255 struct test_mb_skcipher_data
*data
;
1256 struct crypto_skcipher
*tfm
;
1257 unsigned int i
, j
, iv_len
;
1269 data
= kcalloc(num_mb
, sizeof(*data
), GFP_KERNEL
);
1273 tfm
= crypto_alloc_skcipher(algo
, 0, 0);
1275 pr_err("failed to load transform for %s: %ld\n",
1276 algo
, PTR_ERR(tfm
));
1280 for (i
= 0; i
< num_mb
; ++i
)
1281 if (testmgr_alloc_buf(data
[i
].xbuf
)) {
1283 testmgr_free_buf(data
[i
].xbuf
);
1288 for (i
= 0; i
< num_mb
; ++i
)
1289 if (testmgr_alloc_buf(data
[i
].xbuf
)) {
1291 testmgr_free_buf(data
[i
].xbuf
);
1296 for (i
= 0; i
< num_mb
; ++i
) {
1297 data
[i
].req
= skcipher_request_alloc(tfm
, GFP_KERNEL
);
1299 pr_err("alg: skcipher: Failed to allocate request for %s\n",
1302 skcipher_request_free(data
[i
].req
);
1307 for (i
= 0; i
< num_mb
; ++i
) {
1308 skcipher_request_set_callback(data
[i
].req
,
1309 CRYPTO_TFM_REQ_MAY_BACKLOG
,
1310 crypto_req_done
, &data
[i
].wait
);
1311 crypto_init_wait(&data
[i
].wait
);
1314 pr_info("\ntesting speed of multibuffer %s (%s) %s\n", algo
,
1315 get_driver_name(crypto_skcipher
, tfm
), e
);
1319 b_size
= block_sizes
;
1321 if (*b_size
> XBUFSIZE
* PAGE_SIZE
) {
1322 pr_err("template (%u) too big for buffer (%lu)\n",
1323 *b_size
, XBUFSIZE
* PAGE_SIZE
);
1327 pr_info("test %u (%d bit key, %d byte blocks): ", i
,
1328 *keysize
* 8, *b_size
);
1330 /* Set up tfm global state, i.e. the key */
1332 memset(tvmem
[0], 0xff, PAGE_SIZE
);
1334 for (j
= 0; j
< tcount
; j
++) {
1335 if (template[j
].klen
== *keysize
) {
1336 key
= template[j
].key
;
1341 crypto_skcipher_clear_flags(tfm
, ~0);
1343 ret
= crypto_skcipher_setkey(tfm
, key
, *keysize
);
1345 pr_err("setkey() failed flags=%x\n",
1346 crypto_skcipher_get_flags(tfm
));
1350 iv_len
= crypto_skcipher_ivsize(tfm
);
1352 memset(&iv
, 0xff, iv_len
);
1354 /* Now setup per request stuff, i.e. buffers */
1356 for (j
= 0; j
< num_mb
; ++j
) {
1357 struct test_mb_skcipher_data
*cur
= &data
[j
];
1358 unsigned int k
= *b_size
;
1359 unsigned int pages
= DIV_ROUND_UP(k
, PAGE_SIZE
);
1362 sg_init_table(cur
->sg
, pages
);
1364 while (k
> PAGE_SIZE
) {
1365 sg_set_buf(cur
->sg
+ p
, cur
->xbuf
[p
],
1367 memset(cur
->xbuf
[p
], 0xff, PAGE_SIZE
);
1372 sg_set_buf(cur
->sg
+ p
, cur
->xbuf
[p
], k
);
1373 memset(cur
->xbuf
[p
], 0xff, k
);
1375 skcipher_request_set_crypt(cur
->req
, cur
->sg
,
1381 ret
= test_mb_acipher_jiffies(data
, enc
,
1386 ret
= test_mb_acipher_cycles(data
, enc
,
1391 pr_err("%s() failed flags=%x\n", e
,
1392 crypto_skcipher_get_flags(tfm
));
1402 for (i
= 0; i
< num_mb
; ++i
)
1403 skcipher_request_free(data
[i
].req
);
1405 for (i
= 0; i
< num_mb
; ++i
)
1406 testmgr_free_buf(data
[i
].xbuf
);
1408 crypto_free_skcipher(tfm
);
1413 static inline int do_one_acipher_op(struct skcipher_request
*req
, int ret
)
1415 struct crypto_wait
*wait
= req
->base
.data
;
1417 return crypto_wait_req(ret
, wait
);
1420 static int test_acipher_jiffies(struct skcipher_request
*req
, int enc
,
1423 unsigned long start
, end
;
1427 for (start
= jiffies
, end
= start
+ secs
* HZ
, bcount
= 0;
1428 time_before(jiffies
, end
); bcount
++) {
1430 ret
= do_one_acipher_op(req
,
1431 crypto_skcipher_encrypt(req
));
1433 ret
= do_one_acipher_op(req
,
1434 crypto_skcipher_decrypt(req
));
1440 pr_cont("%d operations in %d seconds (%ld bytes)\n",
1441 bcount
, secs
, (long)bcount
* blen
);
1445 static int test_acipher_cycles(struct skcipher_request
*req
, int enc
,
1448 unsigned long cycles
= 0;
1453 for (i
= 0; i
< 4; i
++) {
1455 ret
= do_one_acipher_op(req
,
1456 crypto_skcipher_encrypt(req
));
1458 ret
= do_one_acipher_op(req
,
1459 crypto_skcipher_decrypt(req
));
1465 /* The real thing. */
1466 for (i
= 0; i
< 8; i
++) {
1467 cycles_t start
, end
;
1469 start
= get_cycles();
1471 ret
= do_one_acipher_op(req
,
1472 crypto_skcipher_encrypt(req
));
1474 ret
= do_one_acipher_op(req
,
1475 crypto_skcipher_decrypt(req
));
1481 cycles
+= end
- start
;
1486 pr_cont("1 operation in %lu cycles (%d bytes)\n",
1487 (cycles
+ 4) / 8, blen
);
1492 static void test_skcipher_speed(const char *algo
, int enc
, unsigned int secs
,
1493 struct cipher_speed_template
*template,
1494 unsigned int tcount
, u8
*keysize
, bool async
)
1496 unsigned int ret
, i
, j
, k
, iv_len
;
1497 struct crypto_wait wait
;
1500 struct skcipher_request
*req
;
1501 struct crypto_skcipher
*tfm
;
1510 crypto_init_wait(&wait
);
1512 tfm
= crypto_alloc_skcipher(algo
, 0, async
? 0 : CRYPTO_ALG_ASYNC
);
1515 pr_err("failed to load transform for %s: %ld\n", algo
,
1520 pr_info("\ntesting speed of async %s (%s) %s\n", algo
,
1521 get_driver_name(crypto_skcipher
, tfm
), e
);
1523 req
= skcipher_request_alloc(tfm
, GFP_KERNEL
);
1525 pr_err("tcrypt: skcipher: Failed to allocate request for %s\n",
1530 skcipher_request_set_callback(req
, CRYPTO_TFM_REQ_MAY_BACKLOG
,
1531 crypto_req_done
, &wait
);
1535 b_size
= block_sizes
;
1538 struct scatterlist sg
[TVMEMSIZE
];
1540 if ((*keysize
+ *b_size
) > TVMEMSIZE
* PAGE_SIZE
) {
1541 pr_err("template (%u) too big for "
1542 "tvmem (%lu)\n", *keysize
+ *b_size
,
1543 TVMEMSIZE
* PAGE_SIZE
);
1547 pr_info("test %u (%d bit key, %d byte blocks): ", i
,
1548 *keysize
* 8, *b_size
);
1550 memset(tvmem
[0], 0xff, PAGE_SIZE
);
1552 /* set key, plain text and IV */
1554 for (j
= 0; j
< tcount
; j
++) {
1555 if (template[j
].klen
== *keysize
) {
1556 key
= template[j
].key
;
1561 crypto_skcipher_clear_flags(tfm
, ~0);
1563 ret
= crypto_skcipher_setkey(tfm
, key
, *keysize
);
1565 pr_err("setkey() failed flags=%x\n",
1566 crypto_skcipher_get_flags(tfm
));
1570 k
= *keysize
+ *b_size
;
1571 sg_init_table(sg
, DIV_ROUND_UP(k
, PAGE_SIZE
));
1573 if (k
> PAGE_SIZE
) {
1574 sg_set_buf(sg
, tvmem
[0] + *keysize
,
1575 PAGE_SIZE
- *keysize
);
1578 while (k
> PAGE_SIZE
) {
1579 sg_set_buf(sg
+ j
, tvmem
[j
], PAGE_SIZE
);
1580 memset(tvmem
[j
], 0xff, PAGE_SIZE
);
1584 sg_set_buf(sg
+ j
, tvmem
[j
], k
);
1585 memset(tvmem
[j
], 0xff, k
);
1587 sg_set_buf(sg
, tvmem
[0] + *keysize
, *b_size
);
1590 iv_len
= crypto_skcipher_ivsize(tfm
);
1592 memset(&iv
, 0xff, iv_len
);
1594 skcipher_request_set_crypt(req
, sg
, sg
, *b_size
, iv
);
1597 ret
= test_acipher_jiffies(req
, enc
,
1601 ret
= test_acipher_cycles(req
, enc
,
1606 pr_err("%s() failed flags=%x\n", e
,
1607 crypto_skcipher_get_flags(tfm
));
1617 skcipher_request_free(req
);
1619 crypto_free_skcipher(tfm
);
1622 static void test_acipher_speed(const char *algo
, int enc
, unsigned int secs
,
1623 struct cipher_speed_template
*template,
1624 unsigned int tcount
, u8
*keysize
)
1626 return test_skcipher_speed(algo
, enc
, secs
, template, tcount
, keysize
,
1630 static void test_cipher_speed(const char *algo
, int enc
, unsigned int secs
,
1631 struct cipher_speed_template
*template,
1632 unsigned int tcount
, u8
*keysize
)
1634 return test_skcipher_speed(algo
, enc
, secs
, template, tcount
, keysize
,
1638 static void test_available(void)
1640 char **name
= check
;
1643 printk("alg %s ", *name
);
1644 printk(crypto_has_alg(*name
, 0, 0) ?
1645 "found\n" : "not found\n");
1650 static inline int tcrypt_test(const char *alg
)
1654 pr_debug("testing %s\n", alg
);
1656 ret
= alg_test(alg
, alg
, 0, 0);
1657 /* non-fips algs return -EINVAL in fips mode */
1658 if (fips_enabled
&& ret
== -EINVAL
)
1663 static int do_test(const char *alg
, u32 type
, u32 mask
, int m
, u32 num_mb
)
1671 if (!crypto_has_alg(alg
, type
,
1672 mask
?: CRYPTO_ALG_TYPE_MASK
))
1677 for (i
= 1; i
< 200; i
++)
1678 ret
+= do_test(NULL
, 0, 0, i
, num_mb
);
1682 ret
+= tcrypt_test("md5");
1686 ret
+= tcrypt_test("sha1");
1690 ret
+= tcrypt_test("ecb(des)");
1691 ret
+= tcrypt_test("cbc(des)");
1692 ret
+= tcrypt_test("ctr(des)");
1696 ret
+= tcrypt_test("ecb(des3_ede)");
1697 ret
+= tcrypt_test("cbc(des3_ede)");
1698 ret
+= tcrypt_test("ctr(des3_ede)");
1702 ret
+= tcrypt_test("md4");
1706 ret
+= tcrypt_test("sha256");
1710 ret
+= tcrypt_test("ecb(blowfish)");
1711 ret
+= tcrypt_test("cbc(blowfish)");
1712 ret
+= tcrypt_test("ctr(blowfish)");
1716 ret
+= tcrypt_test("ecb(twofish)");
1717 ret
+= tcrypt_test("cbc(twofish)");
1718 ret
+= tcrypt_test("ctr(twofish)");
1719 ret
+= tcrypt_test("lrw(twofish)");
1720 ret
+= tcrypt_test("xts(twofish)");
1724 ret
+= tcrypt_test("ecb(serpent)");
1725 ret
+= tcrypt_test("cbc(serpent)");
1726 ret
+= tcrypt_test("ctr(serpent)");
1727 ret
+= tcrypt_test("lrw(serpent)");
1728 ret
+= tcrypt_test("xts(serpent)");
1732 ret
+= tcrypt_test("ecb(aes)");
1733 ret
+= tcrypt_test("cbc(aes)");
1734 ret
+= tcrypt_test("lrw(aes)");
1735 ret
+= tcrypt_test("xts(aes)");
1736 ret
+= tcrypt_test("ctr(aes)");
1737 ret
+= tcrypt_test("rfc3686(ctr(aes))");
1738 ret
+= tcrypt_test("ofb(aes)");
1742 ret
+= tcrypt_test("sha384");
1746 ret
+= tcrypt_test("sha512");
1750 ret
+= tcrypt_test("deflate");
1754 ret
+= tcrypt_test("ecb(cast5)");
1755 ret
+= tcrypt_test("cbc(cast5)");
1756 ret
+= tcrypt_test("ctr(cast5)");
1760 ret
+= tcrypt_test("ecb(cast6)");
1761 ret
+= tcrypt_test("cbc(cast6)");
1762 ret
+= tcrypt_test("ctr(cast6)");
1763 ret
+= tcrypt_test("lrw(cast6)");
1764 ret
+= tcrypt_test("xts(cast6)");
1768 ret
+= tcrypt_test("ecb(arc4)");
1772 ret
+= tcrypt_test("michael_mic");
1776 ret
+= tcrypt_test("crc32c");
1780 ret
+= tcrypt_test("ecb(tea)");
1784 ret
+= tcrypt_test("ecb(xtea)");
1788 ret
+= tcrypt_test("ecb(khazad)");
1792 ret
+= tcrypt_test("wp512");
1796 ret
+= tcrypt_test("wp384");
1800 ret
+= tcrypt_test("wp256");
1804 ret
+= tcrypt_test("ecb(tnepres)");
1808 ret
+= tcrypt_test("ecb(anubis)");
1809 ret
+= tcrypt_test("cbc(anubis)");
1813 ret
+= tcrypt_test("tgr192");
1817 ret
+= tcrypt_test("tgr160");
1821 ret
+= tcrypt_test("tgr128");
1825 ret
+= tcrypt_test("ecb(xeta)");
1829 ret
+= tcrypt_test("pcbc(fcrypt)");
1833 ret
+= tcrypt_test("ecb(camellia)");
1834 ret
+= tcrypt_test("cbc(camellia)");
1835 ret
+= tcrypt_test("ctr(camellia)");
1836 ret
+= tcrypt_test("lrw(camellia)");
1837 ret
+= tcrypt_test("xts(camellia)");
1841 ret
+= tcrypt_test("sha224");
1845 ret
+= tcrypt_test("salsa20");
1849 ret
+= tcrypt_test("gcm(aes)");
1853 ret
+= tcrypt_test("lzo");
1857 ret
+= tcrypt_test("ccm(aes)");
1861 ret
+= tcrypt_test("cts(cbc(aes))");
1865 ret
+= tcrypt_test("rmd128");
1869 ret
+= tcrypt_test("rmd160");
1873 ret
+= tcrypt_test("rmd256");
1877 ret
+= tcrypt_test("rmd320");
1881 ret
+= tcrypt_test("ecb(seed)");
1885 ret
+= tcrypt_test("rfc4309(ccm(aes))");
1889 ret
+= tcrypt_test("ghash");
1893 ret
+= tcrypt_test("crct10dif");
1897 ret
+= tcrypt_test("sha3-224");
1901 ret
+= tcrypt_test("sha3-256");
1905 ret
+= tcrypt_test("sha3-384");
1909 ret
+= tcrypt_test("sha3-512");
1913 ret
+= tcrypt_test("sm3");
1917 ret
+= tcrypt_test("hmac(md5)");
1921 ret
+= tcrypt_test("hmac(sha1)");
1925 ret
+= tcrypt_test("hmac(sha256)");
1929 ret
+= tcrypt_test("hmac(sha384)");
1933 ret
+= tcrypt_test("hmac(sha512)");
1937 ret
+= tcrypt_test("hmac(sha224)");
1941 ret
+= tcrypt_test("xcbc(aes)");
1945 ret
+= tcrypt_test("hmac(rmd128)");
1949 ret
+= tcrypt_test("hmac(rmd160)");
1953 ret
+= tcrypt_test("vmac64(aes)");
1957 ret
+= tcrypt_test("hmac(sha3-224)");
1961 ret
+= tcrypt_test("hmac(sha3-256)");
1965 ret
+= tcrypt_test("hmac(sha3-384)");
1969 ret
+= tcrypt_test("hmac(sha3-512)");
1973 ret
+= tcrypt_test("ansi_cprng");
1977 ret
+= tcrypt_test("rfc4106(gcm(aes))");
1981 ret
+= tcrypt_test("rfc4543(gcm(aes))");
1985 ret
+= tcrypt_test("cmac(aes)");
1989 ret
+= tcrypt_test("cmac(des3_ede)");
1993 ret
+= tcrypt_test("authenc(hmac(sha1),cbc(aes))");
1997 ret
+= tcrypt_test("authenc(hmac(md5),ecb(cipher_null))");
2001 ret
+= tcrypt_test("authenc(hmac(sha1),ecb(cipher_null))");
2004 ret
+= tcrypt_test("authenc(hmac(sha1),cbc(des))");
2007 ret
+= tcrypt_test("authenc(hmac(sha1),cbc(des3_ede))");
2010 ret
+= tcrypt_test("authenc(hmac(sha224),cbc(des))");
2013 ret
+= tcrypt_test("authenc(hmac(sha224),cbc(des3_ede))");
2016 ret
+= tcrypt_test("authenc(hmac(sha256),cbc(des))");
2019 ret
+= tcrypt_test("authenc(hmac(sha256),cbc(des3_ede))");
2022 ret
+= tcrypt_test("authenc(hmac(sha384),cbc(des))");
2025 ret
+= tcrypt_test("authenc(hmac(sha384),cbc(des3_ede))");
2028 ret
+= tcrypt_test("authenc(hmac(sha512),cbc(des))");
2031 ret
+= tcrypt_test("authenc(hmac(sha512),cbc(des3_ede))");
2034 ret
+= tcrypt_test("ecb(sm4)");
2035 ret
+= tcrypt_test("cbc(sm4)");
2036 ret
+= tcrypt_test("ctr(sm4)");
2039 test_cipher_speed("ecb(aes)", ENCRYPT
, sec
, NULL
, 0,
2040 speed_template_16_24_32
);
2041 test_cipher_speed("ecb(aes)", DECRYPT
, sec
, NULL
, 0,
2042 speed_template_16_24_32
);
2043 test_cipher_speed("cbc(aes)", ENCRYPT
, sec
, NULL
, 0,
2044 speed_template_16_24_32
);
2045 test_cipher_speed("cbc(aes)", DECRYPT
, sec
, NULL
, 0,
2046 speed_template_16_24_32
);
2047 test_cipher_speed("lrw(aes)", ENCRYPT
, sec
, NULL
, 0,
2048 speed_template_32_40_48
);
2049 test_cipher_speed("lrw(aes)", DECRYPT
, sec
, NULL
, 0,
2050 speed_template_32_40_48
);
2051 test_cipher_speed("xts(aes)", ENCRYPT
, sec
, NULL
, 0,
2052 speed_template_32_64
);
2053 test_cipher_speed("xts(aes)", DECRYPT
, sec
, NULL
, 0,
2054 speed_template_32_64
);
2055 test_cipher_speed("cts(cbc(aes))", ENCRYPT
, sec
, NULL
, 0,
2056 speed_template_16_24_32
);
2057 test_cipher_speed("cts(cbc(aes))", DECRYPT
, sec
, NULL
, 0,
2058 speed_template_16_24_32
);
2059 test_cipher_speed("ctr(aes)", ENCRYPT
, sec
, NULL
, 0,
2060 speed_template_16_24_32
);
2061 test_cipher_speed("ctr(aes)", DECRYPT
, sec
, NULL
, 0,
2062 speed_template_16_24_32
);
2066 test_cipher_speed("ecb(des3_ede)", ENCRYPT
, sec
,
2067 des3_speed_template
, DES3_SPEED_VECTORS
,
2069 test_cipher_speed("ecb(des3_ede)", DECRYPT
, sec
,
2070 des3_speed_template
, DES3_SPEED_VECTORS
,
2072 test_cipher_speed("cbc(des3_ede)", ENCRYPT
, sec
,
2073 des3_speed_template
, DES3_SPEED_VECTORS
,
2075 test_cipher_speed("cbc(des3_ede)", DECRYPT
, sec
,
2076 des3_speed_template
, DES3_SPEED_VECTORS
,
2078 test_cipher_speed("ctr(des3_ede)", ENCRYPT
, sec
,
2079 des3_speed_template
, DES3_SPEED_VECTORS
,
2081 test_cipher_speed("ctr(des3_ede)", DECRYPT
, sec
,
2082 des3_speed_template
, DES3_SPEED_VECTORS
,
2087 test_cipher_speed("ecb(twofish)", ENCRYPT
, sec
, NULL
, 0,
2088 speed_template_16_24_32
);
2089 test_cipher_speed("ecb(twofish)", DECRYPT
, sec
, NULL
, 0,
2090 speed_template_16_24_32
);
2091 test_cipher_speed("cbc(twofish)", ENCRYPT
, sec
, NULL
, 0,
2092 speed_template_16_24_32
);
2093 test_cipher_speed("cbc(twofish)", DECRYPT
, sec
, NULL
, 0,
2094 speed_template_16_24_32
);
2095 test_cipher_speed("ctr(twofish)", ENCRYPT
, sec
, NULL
, 0,
2096 speed_template_16_24_32
);
2097 test_cipher_speed("ctr(twofish)", DECRYPT
, sec
, NULL
, 0,
2098 speed_template_16_24_32
);
2099 test_cipher_speed("lrw(twofish)", ENCRYPT
, sec
, NULL
, 0,
2100 speed_template_32_40_48
);
2101 test_cipher_speed("lrw(twofish)", DECRYPT
, sec
, NULL
, 0,
2102 speed_template_32_40_48
);
2103 test_cipher_speed("xts(twofish)", ENCRYPT
, sec
, NULL
, 0,
2104 speed_template_32_48_64
);
2105 test_cipher_speed("xts(twofish)", DECRYPT
, sec
, NULL
, 0,
2106 speed_template_32_48_64
);
2110 test_cipher_speed("ecb(blowfish)", ENCRYPT
, sec
, NULL
, 0,
2111 speed_template_8_32
);
2112 test_cipher_speed("ecb(blowfish)", DECRYPT
, sec
, NULL
, 0,
2113 speed_template_8_32
);
2114 test_cipher_speed("cbc(blowfish)", ENCRYPT
, sec
, NULL
, 0,
2115 speed_template_8_32
);
2116 test_cipher_speed("cbc(blowfish)", DECRYPT
, sec
, NULL
, 0,
2117 speed_template_8_32
);
2118 test_cipher_speed("ctr(blowfish)", ENCRYPT
, sec
, NULL
, 0,
2119 speed_template_8_32
);
2120 test_cipher_speed("ctr(blowfish)", DECRYPT
, sec
, NULL
, 0,
2121 speed_template_8_32
);
2125 test_cipher_speed("ecb(des)", ENCRYPT
, sec
, NULL
, 0,
2127 test_cipher_speed("ecb(des)", DECRYPT
, sec
, NULL
, 0,
2129 test_cipher_speed("cbc(des)", ENCRYPT
, sec
, NULL
, 0,
2131 test_cipher_speed("cbc(des)", DECRYPT
, sec
, NULL
, 0,
2136 test_cipher_speed("ecb(camellia)", ENCRYPT
, sec
, NULL
, 0,
2137 speed_template_16_24_32
);
2138 test_cipher_speed("ecb(camellia)", DECRYPT
, sec
, NULL
, 0,
2139 speed_template_16_24_32
);
2140 test_cipher_speed("cbc(camellia)", ENCRYPT
, sec
, NULL
, 0,
2141 speed_template_16_24_32
);
2142 test_cipher_speed("cbc(camellia)", DECRYPT
, sec
, NULL
, 0,
2143 speed_template_16_24_32
);
2144 test_cipher_speed("ctr(camellia)", ENCRYPT
, sec
, NULL
, 0,
2145 speed_template_16_24_32
);
2146 test_cipher_speed("ctr(camellia)", DECRYPT
, sec
, NULL
, 0,
2147 speed_template_16_24_32
);
2148 test_cipher_speed("lrw(camellia)", ENCRYPT
, sec
, NULL
, 0,
2149 speed_template_32_40_48
);
2150 test_cipher_speed("lrw(camellia)", DECRYPT
, sec
, NULL
, 0,
2151 speed_template_32_40_48
);
2152 test_cipher_speed("xts(camellia)", ENCRYPT
, sec
, NULL
, 0,
2153 speed_template_32_48_64
);
2154 test_cipher_speed("xts(camellia)", DECRYPT
, sec
, NULL
, 0,
2155 speed_template_32_48_64
);
2159 test_cipher_speed("salsa20", ENCRYPT
, sec
, NULL
, 0,
2160 speed_template_16_32
);
2164 test_cipher_speed("ecb(serpent)", ENCRYPT
, sec
, NULL
, 0,
2165 speed_template_16_32
);
2166 test_cipher_speed("ecb(serpent)", DECRYPT
, sec
, NULL
, 0,
2167 speed_template_16_32
);
2168 test_cipher_speed("cbc(serpent)", ENCRYPT
, sec
, NULL
, 0,
2169 speed_template_16_32
);
2170 test_cipher_speed("cbc(serpent)", DECRYPT
, sec
, NULL
, 0,
2171 speed_template_16_32
);
2172 test_cipher_speed("ctr(serpent)", ENCRYPT
, sec
, NULL
, 0,
2173 speed_template_16_32
);
2174 test_cipher_speed("ctr(serpent)", DECRYPT
, sec
, NULL
, 0,
2175 speed_template_16_32
);
2176 test_cipher_speed("lrw(serpent)", ENCRYPT
, sec
, NULL
, 0,
2177 speed_template_32_48
);
2178 test_cipher_speed("lrw(serpent)", DECRYPT
, sec
, NULL
, 0,
2179 speed_template_32_48
);
2180 test_cipher_speed("xts(serpent)", ENCRYPT
, sec
, NULL
, 0,
2181 speed_template_32_64
);
2182 test_cipher_speed("xts(serpent)", DECRYPT
, sec
, NULL
, 0,
2183 speed_template_32_64
);
2187 test_cipher_speed("ecb(arc4)", ENCRYPT
, sec
, NULL
, 0,
2192 test_cipher_speed("ecb(cast5)", ENCRYPT
, sec
, NULL
, 0,
2193 speed_template_8_16
);
2194 test_cipher_speed("ecb(cast5)", DECRYPT
, sec
, NULL
, 0,
2195 speed_template_8_16
);
2196 test_cipher_speed("cbc(cast5)", ENCRYPT
, sec
, NULL
, 0,
2197 speed_template_8_16
);
2198 test_cipher_speed("cbc(cast5)", DECRYPT
, sec
, NULL
, 0,
2199 speed_template_8_16
);
2200 test_cipher_speed("ctr(cast5)", ENCRYPT
, sec
, NULL
, 0,
2201 speed_template_8_16
);
2202 test_cipher_speed("ctr(cast5)", DECRYPT
, sec
, NULL
, 0,
2203 speed_template_8_16
);
2207 test_cipher_speed("ecb(cast6)", ENCRYPT
, sec
, NULL
, 0,
2208 speed_template_16_32
);
2209 test_cipher_speed("ecb(cast6)", DECRYPT
, sec
, NULL
, 0,
2210 speed_template_16_32
);
2211 test_cipher_speed("cbc(cast6)", ENCRYPT
, sec
, NULL
, 0,
2212 speed_template_16_32
);
2213 test_cipher_speed("cbc(cast6)", DECRYPT
, sec
, NULL
, 0,
2214 speed_template_16_32
);
2215 test_cipher_speed("ctr(cast6)", ENCRYPT
, sec
, NULL
, 0,
2216 speed_template_16_32
);
2217 test_cipher_speed("ctr(cast6)", DECRYPT
, sec
, NULL
, 0,
2218 speed_template_16_32
);
2219 test_cipher_speed("lrw(cast6)", ENCRYPT
, sec
, NULL
, 0,
2220 speed_template_32_48
);
2221 test_cipher_speed("lrw(cast6)", DECRYPT
, sec
, NULL
, 0,
2222 speed_template_32_48
);
2223 test_cipher_speed("xts(cast6)", ENCRYPT
, sec
, NULL
, 0,
2224 speed_template_32_64
);
2225 test_cipher_speed("xts(cast6)", DECRYPT
, sec
, NULL
, 0,
2226 speed_template_32_64
);
2230 test_aead_speed("rfc4106(gcm(aes))", ENCRYPT
, sec
,
2231 NULL
, 0, 16, 16, aead_speed_template_20
);
2232 test_aead_speed("gcm(aes)", ENCRYPT
, sec
,
2233 NULL
, 0, 16, 8, speed_template_16_24_32
);
2234 test_aead_speed("rfc4106(gcm(aes))", DECRYPT
, sec
,
2235 NULL
, 0, 16, 16, aead_speed_template_20
);
2236 test_aead_speed("gcm(aes)", DECRYPT
, sec
,
2237 NULL
, 0, 16, 8, speed_template_16_24_32
);
2241 test_aead_speed("rfc4309(ccm(aes))", ENCRYPT
, sec
,
2242 NULL
, 0, 16, 16, aead_speed_template_19
);
2243 test_aead_speed("rfc4309(ccm(aes))", DECRYPT
, sec
,
2244 NULL
, 0, 16, 16, aead_speed_template_19
);
2248 test_aead_speed("rfc7539esp(chacha20,poly1305)", ENCRYPT
, sec
,
2249 NULL
, 0, 16, 8, aead_speed_template_36
);
2250 test_aead_speed("rfc7539esp(chacha20,poly1305)", DECRYPT
, sec
,
2251 NULL
, 0, 16, 8, aead_speed_template_36
);
2255 test_cipher_speed("chacha20", ENCRYPT
, sec
, NULL
, 0,
2260 test_mb_aead_speed("rfc4106(gcm(aes))", ENCRYPT
, sec
, NULL
,
2261 0, 16, 16, aead_speed_template_20
, num_mb
);
2262 test_mb_aead_speed("gcm(aes)", ENCRYPT
, sec
, NULL
, 0, 16, 8,
2263 speed_template_16_24_32
, num_mb
);
2264 test_mb_aead_speed("rfc4106(gcm(aes))", DECRYPT
, sec
, NULL
,
2265 0, 16, 16, aead_speed_template_20
, num_mb
);
2266 test_mb_aead_speed("gcm(aes)", DECRYPT
, sec
, NULL
, 0, 16, 8,
2267 speed_template_16_24_32
, num_mb
);
2271 test_mb_aead_speed("rfc4309(ccm(aes))", ENCRYPT
, sec
, NULL
, 0,
2272 16, 16, aead_speed_template_19
, num_mb
);
2273 test_mb_aead_speed("rfc4309(ccm(aes))", DECRYPT
, sec
, NULL
, 0,
2274 16, 16, aead_speed_template_19
, num_mb
);
2278 test_mb_aead_speed("rfc7539esp(chacha20,poly1305)", ENCRYPT
,
2279 sec
, NULL
, 0, 16, 8, aead_speed_template_36
,
2281 test_mb_aead_speed("rfc7539esp(chacha20,poly1305)", DECRYPT
,
2282 sec
, NULL
, 0, 16, 8, aead_speed_template_36
,
2287 test_cipher_speed("ecb(sm4)", ENCRYPT
, sec
, NULL
, 0,
2289 test_cipher_speed("ecb(sm4)", DECRYPT
, sec
, NULL
, 0,
2291 test_cipher_speed("cbc(sm4)", ENCRYPT
, sec
, NULL
, 0,
2293 test_cipher_speed("cbc(sm4)", DECRYPT
, sec
, NULL
, 0,
2295 test_cipher_speed("ctr(sm4)", ENCRYPT
, sec
, NULL
, 0,
2297 test_cipher_speed("ctr(sm4)", DECRYPT
, sec
, NULL
, 0,
2302 test_hash_speed(alg
, sec
, generic_hash_speed_template
);
2307 test_hash_speed("md4", sec
, generic_hash_speed_template
);
2308 if (mode
> 300 && mode
< 400) break;
2311 test_hash_speed("md5", sec
, generic_hash_speed_template
);
2312 if (mode
> 300 && mode
< 400) break;
2315 test_hash_speed("sha1", sec
, generic_hash_speed_template
);
2316 if (mode
> 300 && mode
< 400) break;
2319 test_hash_speed("sha256", sec
, generic_hash_speed_template
);
2320 if (mode
> 300 && mode
< 400) break;
2323 test_hash_speed("sha384", sec
, generic_hash_speed_template
);
2324 if (mode
> 300 && mode
< 400) break;
2327 test_hash_speed("sha512", sec
, generic_hash_speed_template
);
2328 if (mode
> 300 && mode
< 400) break;
2331 test_hash_speed("wp256", sec
, generic_hash_speed_template
);
2332 if (mode
> 300 && mode
< 400) break;
2335 test_hash_speed("wp384", sec
, generic_hash_speed_template
);
2336 if (mode
> 300 && mode
< 400) break;
2339 test_hash_speed("wp512", sec
, generic_hash_speed_template
);
2340 if (mode
> 300 && mode
< 400) break;
2343 test_hash_speed("tgr128", sec
, generic_hash_speed_template
);
2344 if (mode
> 300 && mode
< 400) break;
2347 test_hash_speed("tgr160", sec
, generic_hash_speed_template
);
2348 if (mode
> 300 && mode
< 400) break;
2351 test_hash_speed("tgr192", sec
, generic_hash_speed_template
);
2352 if (mode
> 300 && mode
< 400) break;
2355 test_hash_speed("sha224", sec
, generic_hash_speed_template
);
2356 if (mode
> 300 && mode
< 400) break;
2359 test_hash_speed("rmd128", sec
, generic_hash_speed_template
);
2360 if (mode
> 300 && mode
< 400) break;
2363 test_hash_speed("rmd160", sec
, generic_hash_speed_template
);
2364 if (mode
> 300 && mode
< 400) break;
2367 test_hash_speed("rmd256", sec
, generic_hash_speed_template
);
2368 if (mode
> 300 && mode
< 400) break;
2371 test_hash_speed("rmd320", sec
, generic_hash_speed_template
);
2372 if (mode
> 300 && mode
< 400) break;
2375 test_hash_speed("ghash-generic", sec
, hash_speed_template_16
);
2376 if (mode
> 300 && mode
< 400) break;
2379 test_hash_speed("crc32c", sec
, generic_hash_speed_template
);
2380 if (mode
> 300 && mode
< 400) break;
2383 test_hash_speed("crct10dif", sec
, generic_hash_speed_template
);
2384 if (mode
> 300 && mode
< 400) break;
2387 test_hash_speed("poly1305", sec
, poly1305_speed_template
);
2388 if (mode
> 300 && mode
< 400) break;
2391 test_hash_speed("sha3-224", sec
, generic_hash_speed_template
);
2392 if (mode
> 300 && mode
< 400) break;
2395 test_hash_speed("sha3-256", sec
, generic_hash_speed_template
);
2396 if (mode
> 300 && mode
< 400) break;
2399 test_hash_speed("sha3-384", sec
, generic_hash_speed_template
);
2400 if (mode
> 300 && mode
< 400) break;
2403 test_hash_speed("sha3-512", sec
, generic_hash_speed_template
);
2404 if (mode
> 300 && mode
< 400) break;
2407 test_hash_speed("sm3", sec
, generic_hash_speed_template
);
2408 if (mode
> 300 && mode
< 400) break;
2415 test_ahash_speed(alg
, sec
, generic_hash_speed_template
);
2420 test_ahash_speed("md4", sec
, generic_hash_speed_template
);
2421 if (mode
> 400 && mode
< 500) break;
2424 test_ahash_speed("md5", sec
, generic_hash_speed_template
);
2425 if (mode
> 400 && mode
< 500) break;
2428 test_ahash_speed("sha1", sec
, generic_hash_speed_template
);
2429 if (mode
> 400 && mode
< 500) break;
2432 test_ahash_speed("sha256", sec
, generic_hash_speed_template
);
2433 if (mode
> 400 && mode
< 500) break;
2436 test_ahash_speed("sha384", sec
, generic_hash_speed_template
);
2437 if (mode
> 400 && mode
< 500) break;
2440 test_ahash_speed("sha512", sec
, generic_hash_speed_template
);
2441 if (mode
> 400 && mode
< 500) break;
2444 test_ahash_speed("wp256", sec
, generic_hash_speed_template
);
2445 if (mode
> 400 && mode
< 500) break;
2448 test_ahash_speed("wp384", sec
, generic_hash_speed_template
);
2449 if (mode
> 400 && mode
< 500) break;
2452 test_ahash_speed("wp512", sec
, generic_hash_speed_template
);
2453 if (mode
> 400 && mode
< 500) break;
2456 test_ahash_speed("tgr128", sec
, generic_hash_speed_template
);
2457 if (mode
> 400 && mode
< 500) break;
2460 test_ahash_speed("tgr160", sec
, generic_hash_speed_template
);
2461 if (mode
> 400 && mode
< 500) break;
2464 test_ahash_speed("tgr192", sec
, generic_hash_speed_template
);
2465 if (mode
> 400 && mode
< 500) break;
2468 test_ahash_speed("sha224", sec
, generic_hash_speed_template
);
2469 if (mode
> 400 && mode
< 500) break;
2472 test_ahash_speed("rmd128", sec
, generic_hash_speed_template
);
2473 if (mode
> 400 && mode
< 500) break;
2476 test_ahash_speed("rmd160", sec
, generic_hash_speed_template
);
2477 if (mode
> 400 && mode
< 500) break;
2480 test_ahash_speed("rmd256", sec
, generic_hash_speed_template
);
2481 if (mode
> 400 && mode
< 500) break;
2484 test_ahash_speed("rmd320", sec
, generic_hash_speed_template
);
2485 if (mode
> 400 && mode
< 500) break;
2488 test_ahash_speed("sha3-224", sec
, generic_hash_speed_template
);
2489 if (mode
> 400 && mode
< 500) break;
2492 test_ahash_speed("sha3-256", sec
, generic_hash_speed_template
);
2493 if (mode
> 400 && mode
< 500) break;
2496 test_ahash_speed("sha3-384", sec
, generic_hash_speed_template
);
2497 if (mode
> 400 && mode
< 500) break;
2500 test_ahash_speed("sha3-512", sec
, generic_hash_speed_template
);
2501 if (mode
> 400 && mode
< 500) break;
2504 test_mb_ahash_speed("sha1", sec
, generic_hash_speed_template
,
2506 if (mode
> 400 && mode
< 500) break;
2509 test_mb_ahash_speed("sha256", sec
, generic_hash_speed_template
,
2511 if (mode
> 400 && mode
< 500) break;
2514 test_mb_ahash_speed("sha512", sec
, generic_hash_speed_template
,
2516 if (mode
> 400 && mode
< 500) break;
2519 test_mb_ahash_speed("sm3", sec
, generic_hash_speed_template
,
2521 if (mode
> 400 && mode
< 500) break;
2527 test_acipher_speed("ecb(aes)", ENCRYPT
, sec
, NULL
, 0,
2528 speed_template_16_24_32
);
2529 test_acipher_speed("ecb(aes)", DECRYPT
, sec
, NULL
, 0,
2530 speed_template_16_24_32
);
2531 test_acipher_speed("cbc(aes)", ENCRYPT
, sec
, NULL
, 0,
2532 speed_template_16_24_32
);
2533 test_acipher_speed("cbc(aes)", DECRYPT
, sec
, NULL
, 0,
2534 speed_template_16_24_32
);
2535 test_acipher_speed("lrw(aes)", ENCRYPT
, sec
, NULL
, 0,
2536 speed_template_32_40_48
);
2537 test_acipher_speed("lrw(aes)", DECRYPT
, sec
, NULL
, 0,
2538 speed_template_32_40_48
);
2539 test_acipher_speed("xts(aes)", ENCRYPT
, sec
, NULL
, 0,
2540 speed_template_32_64
);
2541 test_acipher_speed("xts(aes)", DECRYPT
, sec
, NULL
, 0,
2542 speed_template_32_64
);
2543 test_acipher_speed("cts(cbc(aes))", ENCRYPT
, sec
, NULL
, 0,
2544 speed_template_16_24_32
);
2545 test_acipher_speed("cts(cbc(aes))", DECRYPT
, sec
, NULL
, 0,
2546 speed_template_16_24_32
);
2547 test_acipher_speed("ctr(aes)", ENCRYPT
, sec
, NULL
, 0,
2548 speed_template_16_24_32
);
2549 test_acipher_speed("ctr(aes)", DECRYPT
, sec
, NULL
, 0,
2550 speed_template_16_24_32
);
2551 test_acipher_speed("cfb(aes)", ENCRYPT
, sec
, NULL
, 0,
2552 speed_template_16_24_32
);
2553 test_acipher_speed("cfb(aes)", DECRYPT
, sec
, NULL
, 0,
2554 speed_template_16_24_32
);
2555 test_acipher_speed("ofb(aes)", ENCRYPT
, sec
, NULL
, 0,
2556 speed_template_16_24_32
);
2557 test_acipher_speed("ofb(aes)", DECRYPT
, sec
, NULL
, 0,
2558 speed_template_16_24_32
);
2559 test_acipher_speed("rfc3686(ctr(aes))", ENCRYPT
, sec
, NULL
, 0,
2560 speed_template_20_28_36
);
2561 test_acipher_speed("rfc3686(ctr(aes))", DECRYPT
, sec
, NULL
, 0,
2562 speed_template_20_28_36
);
2566 test_acipher_speed("ecb(des3_ede)", ENCRYPT
, sec
,
2567 des3_speed_template
, DES3_SPEED_VECTORS
,
2569 test_acipher_speed("ecb(des3_ede)", DECRYPT
, sec
,
2570 des3_speed_template
, DES3_SPEED_VECTORS
,
2572 test_acipher_speed("cbc(des3_ede)", ENCRYPT
, sec
,
2573 des3_speed_template
, DES3_SPEED_VECTORS
,
2575 test_acipher_speed("cbc(des3_ede)", DECRYPT
, sec
,
2576 des3_speed_template
, DES3_SPEED_VECTORS
,
2578 test_acipher_speed("cfb(des3_ede)", ENCRYPT
, sec
,
2579 des3_speed_template
, DES3_SPEED_VECTORS
,
2581 test_acipher_speed("cfb(des3_ede)", DECRYPT
, sec
,
2582 des3_speed_template
, DES3_SPEED_VECTORS
,
2584 test_acipher_speed("ofb(des3_ede)", ENCRYPT
, sec
,
2585 des3_speed_template
, DES3_SPEED_VECTORS
,
2587 test_acipher_speed("ofb(des3_ede)", DECRYPT
, sec
,
2588 des3_speed_template
, DES3_SPEED_VECTORS
,
2593 test_acipher_speed("ecb(des)", ENCRYPT
, sec
, NULL
, 0,
2595 test_acipher_speed("ecb(des)", DECRYPT
, sec
, NULL
, 0,
2597 test_acipher_speed("cbc(des)", ENCRYPT
, sec
, NULL
, 0,
2599 test_acipher_speed("cbc(des)", DECRYPT
, sec
, NULL
, 0,
2601 test_acipher_speed("cfb(des)", ENCRYPT
, sec
, NULL
, 0,
2603 test_acipher_speed("cfb(des)", DECRYPT
, sec
, NULL
, 0,
2605 test_acipher_speed("ofb(des)", ENCRYPT
, sec
, NULL
, 0,
2607 test_acipher_speed("ofb(des)", DECRYPT
, sec
, NULL
, 0,
2612 test_acipher_speed("ecb(serpent)", ENCRYPT
, sec
, NULL
, 0,
2613 speed_template_16_32
);
2614 test_acipher_speed("ecb(serpent)", DECRYPT
, sec
, NULL
, 0,
2615 speed_template_16_32
);
2616 test_acipher_speed("cbc(serpent)", ENCRYPT
, sec
, NULL
, 0,
2617 speed_template_16_32
);
2618 test_acipher_speed("cbc(serpent)", DECRYPT
, sec
, NULL
, 0,
2619 speed_template_16_32
);
2620 test_acipher_speed("ctr(serpent)", ENCRYPT
, sec
, NULL
, 0,
2621 speed_template_16_32
);
2622 test_acipher_speed("ctr(serpent)", DECRYPT
, sec
, NULL
, 0,
2623 speed_template_16_32
);
2624 test_acipher_speed("lrw(serpent)", ENCRYPT
, sec
, NULL
, 0,
2625 speed_template_32_48
);
2626 test_acipher_speed("lrw(serpent)", DECRYPT
, sec
, NULL
, 0,
2627 speed_template_32_48
);
2628 test_acipher_speed("xts(serpent)", ENCRYPT
, sec
, NULL
, 0,
2629 speed_template_32_64
);
2630 test_acipher_speed("xts(serpent)", DECRYPT
, sec
, NULL
, 0,
2631 speed_template_32_64
);
2635 test_acipher_speed("ecb(twofish)", ENCRYPT
, sec
, NULL
, 0,
2636 speed_template_16_24_32
);
2637 test_acipher_speed("ecb(twofish)", DECRYPT
, sec
, NULL
, 0,
2638 speed_template_16_24_32
);
2639 test_acipher_speed("cbc(twofish)", ENCRYPT
, sec
, NULL
, 0,
2640 speed_template_16_24_32
);
2641 test_acipher_speed("cbc(twofish)", DECRYPT
, sec
, NULL
, 0,
2642 speed_template_16_24_32
);
2643 test_acipher_speed("ctr(twofish)", ENCRYPT
, sec
, NULL
, 0,
2644 speed_template_16_24_32
);
2645 test_acipher_speed("ctr(twofish)", DECRYPT
, sec
, NULL
, 0,
2646 speed_template_16_24_32
);
2647 test_acipher_speed("lrw(twofish)", ENCRYPT
, sec
, NULL
, 0,
2648 speed_template_32_40_48
);
2649 test_acipher_speed("lrw(twofish)", DECRYPT
, sec
, NULL
, 0,
2650 speed_template_32_40_48
);
2651 test_acipher_speed("xts(twofish)", ENCRYPT
, sec
, NULL
, 0,
2652 speed_template_32_48_64
);
2653 test_acipher_speed("xts(twofish)", DECRYPT
, sec
, NULL
, 0,
2654 speed_template_32_48_64
);
2658 test_acipher_speed("ecb(arc4)", ENCRYPT
, sec
, NULL
, 0,
2663 test_acipher_speed("ecb(cast5)", ENCRYPT
, sec
, NULL
, 0,
2664 speed_template_8_16
);
2665 test_acipher_speed("ecb(cast5)", DECRYPT
, sec
, NULL
, 0,
2666 speed_template_8_16
);
2667 test_acipher_speed("cbc(cast5)", ENCRYPT
, sec
, NULL
, 0,
2668 speed_template_8_16
);
2669 test_acipher_speed("cbc(cast5)", DECRYPT
, sec
, NULL
, 0,
2670 speed_template_8_16
);
2671 test_acipher_speed("ctr(cast5)", ENCRYPT
, sec
, NULL
, 0,
2672 speed_template_8_16
);
2673 test_acipher_speed("ctr(cast5)", DECRYPT
, sec
, NULL
, 0,
2674 speed_template_8_16
);
2678 test_acipher_speed("ecb(cast6)", ENCRYPT
, sec
, NULL
, 0,
2679 speed_template_16_32
);
2680 test_acipher_speed("ecb(cast6)", DECRYPT
, sec
, NULL
, 0,
2681 speed_template_16_32
);
2682 test_acipher_speed("cbc(cast6)", ENCRYPT
, sec
, NULL
, 0,
2683 speed_template_16_32
);
2684 test_acipher_speed("cbc(cast6)", DECRYPT
, sec
, NULL
, 0,
2685 speed_template_16_32
);
2686 test_acipher_speed("ctr(cast6)", ENCRYPT
, sec
, NULL
, 0,
2687 speed_template_16_32
);
2688 test_acipher_speed("ctr(cast6)", DECRYPT
, sec
, NULL
, 0,
2689 speed_template_16_32
);
2690 test_acipher_speed("lrw(cast6)", ENCRYPT
, sec
, NULL
, 0,
2691 speed_template_32_48
);
2692 test_acipher_speed("lrw(cast6)", DECRYPT
, sec
, NULL
, 0,
2693 speed_template_32_48
);
2694 test_acipher_speed("xts(cast6)", ENCRYPT
, sec
, NULL
, 0,
2695 speed_template_32_64
);
2696 test_acipher_speed("xts(cast6)", DECRYPT
, sec
, NULL
, 0,
2697 speed_template_32_64
);
2701 test_acipher_speed("ecb(camellia)", ENCRYPT
, sec
, NULL
, 0,
2702 speed_template_16_32
);
2703 test_acipher_speed("ecb(camellia)", DECRYPT
, sec
, NULL
, 0,
2704 speed_template_16_32
);
2705 test_acipher_speed("cbc(camellia)", ENCRYPT
, sec
, NULL
, 0,
2706 speed_template_16_32
);
2707 test_acipher_speed("cbc(camellia)", DECRYPT
, sec
, NULL
, 0,
2708 speed_template_16_32
);
2709 test_acipher_speed("ctr(camellia)", ENCRYPT
, sec
, NULL
, 0,
2710 speed_template_16_32
);
2711 test_acipher_speed("ctr(camellia)", DECRYPT
, sec
, NULL
, 0,
2712 speed_template_16_32
);
2713 test_acipher_speed("lrw(camellia)", ENCRYPT
, sec
, NULL
, 0,
2714 speed_template_32_48
);
2715 test_acipher_speed("lrw(camellia)", DECRYPT
, sec
, NULL
, 0,
2716 speed_template_32_48
);
2717 test_acipher_speed("xts(camellia)", ENCRYPT
, sec
, NULL
, 0,
2718 speed_template_32_64
);
2719 test_acipher_speed("xts(camellia)", DECRYPT
, sec
, NULL
, 0,
2720 speed_template_32_64
);
2724 test_acipher_speed("ecb(blowfish)", ENCRYPT
, sec
, NULL
, 0,
2725 speed_template_8_32
);
2726 test_acipher_speed("ecb(blowfish)", DECRYPT
, sec
, NULL
, 0,
2727 speed_template_8_32
);
2728 test_acipher_speed("cbc(blowfish)", ENCRYPT
, sec
, NULL
, 0,
2729 speed_template_8_32
);
2730 test_acipher_speed("cbc(blowfish)", DECRYPT
, sec
, NULL
, 0,
2731 speed_template_8_32
);
2732 test_acipher_speed("ctr(blowfish)", ENCRYPT
, sec
, NULL
, 0,
2733 speed_template_8_32
);
2734 test_acipher_speed("ctr(blowfish)", DECRYPT
, sec
, NULL
, 0,
2735 speed_template_8_32
);
2739 test_mb_skcipher_speed("ecb(aes)", ENCRYPT
, sec
, NULL
, 0,
2740 speed_template_16_24_32
, num_mb
);
2741 test_mb_skcipher_speed("ecb(aes)", DECRYPT
, sec
, NULL
, 0,
2742 speed_template_16_24_32
, num_mb
);
2743 test_mb_skcipher_speed("cbc(aes)", ENCRYPT
, sec
, NULL
, 0,
2744 speed_template_16_24_32
, num_mb
);
2745 test_mb_skcipher_speed("cbc(aes)", DECRYPT
, sec
, NULL
, 0,
2746 speed_template_16_24_32
, num_mb
);
2747 test_mb_skcipher_speed("lrw(aes)", ENCRYPT
, sec
, NULL
, 0,
2748 speed_template_32_40_48
, num_mb
);
2749 test_mb_skcipher_speed("lrw(aes)", DECRYPT
, sec
, NULL
, 0,
2750 speed_template_32_40_48
, num_mb
);
2751 test_mb_skcipher_speed("xts(aes)", ENCRYPT
, sec
, NULL
, 0,
2752 speed_template_32_64
, num_mb
);
2753 test_mb_skcipher_speed("xts(aes)", DECRYPT
, sec
, NULL
, 0,
2754 speed_template_32_64
, num_mb
);
2755 test_mb_skcipher_speed("cts(cbc(aes))", ENCRYPT
, sec
, NULL
, 0,
2756 speed_template_16_24_32
, num_mb
);
2757 test_mb_skcipher_speed("cts(cbc(aes))", DECRYPT
, sec
, NULL
, 0,
2758 speed_template_16_24_32
, num_mb
);
2759 test_mb_skcipher_speed("ctr(aes)", ENCRYPT
, sec
, NULL
, 0,
2760 speed_template_16_24_32
, num_mb
);
2761 test_mb_skcipher_speed("ctr(aes)", DECRYPT
, sec
, NULL
, 0,
2762 speed_template_16_24_32
, num_mb
);
2763 test_mb_skcipher_speed("cfb(aes)", ENCRYPT
, sec
, NULL
, 0,
2764 speed_template_16_24_32
, num_mb
);
2765 test_mb_skcipher_speed("cfb(aes)", DECRYPT
, sec
, NULL
, 0,
2766 speed_template_16_24_32
, num_mb
);
2767 test_mb_skcipher_speed("ofb(aes)", ENCRYPT
, sec
, NULL
, 0,
2768 speed_template_16_24_32
, num_mb
);
2769 test_mb_skcipher_speed("ofb(aes)", DECRYPT
, sec
, NULL
, 0,
2770 speed_template_16_24_32
, num_mb
);
2771 test_mb_skcipher_speed("rfc3686(ctr(aes))", ENCRYPT
, sec
, NULL
,
2772 0, speed_template_20_28_36
, num_mb
);
2773 test_mb_skcipher_speed("rfc3686(ctr(aes))", DECRYPT
, sec
, NULL
,
2774 0, speed_template_20_28_36
, num_mb
);
2778 test_mb_skcipher_speed("ecb(des3_ede)", ENCRYPT
, sec
,
2779 des3_speed_template
, DES3_SPEED_VECTORS
,
2780 speed_template_24
, num_mb
);
2781 test_mb_skcipher_speed("ecb(des3_ede)", DECRYPT
, sec
,
2782 des3_speed_template
, DES3_SPEED_VECTORS
,
2783 speed_template_24
, num_mb
);
2784 test_mb_skcipher_speed("cbc(des3_ede)", ENCRYPT
, sec
,
2785 des3_speed_template
, DES3_SPEED_VECTORS
,
2786 speed_template_24
, num_mb
);
2787 test_mb_skcipher_speed("cbc(des3_ede)", DECRYPT
, sec
,
2788 des3_speed_template
, DES3_SPEED_VECTORS
,
2789 speed_template_24
, num_mb
);
2790 test_mb_skcipher_speed("cfb(des3_ede)", ENCRYPT
, sec
,
2791 des3_speed_template
, DES3_SPEED_VECTORS
,
2792 speed_template_24
, num_mb
);
2793 test_mb_skcipher_speed("cfb(des3_ede)", DECRYPT
, sec
,
2794 des3_speed_template
, DES3_SPEED_VECTORS
,
2795 speed_template_24
, num_mb
);
2796 test_mb_skcipher_speed("ofb(des3_ede)", ENCRYPT
, sec
,
2797 des3_speed_template
, DES3_SPEED_VECTORS
,
2798 speed_template_24
, num_mb
);
2799 test_mb_skcipher_speed("ofb(des3_ede)", DECRYPT
, sec
,
2800 des3_speed_template
, DES3_SPEED_VECTORS
,
2801 speed_template_24
, num_mb
);
2805 test_mb_skcipher_speed("ecb(des)", ENCRYPT
, sec
, NULL
, 0,
2806 speed_template_8
, num_mb
);
2807 test_mb_skcipher_speed("ecb(des)", DECRYPT
, sec
, NULL
, 0,
2808 speed_template_8
, num_mb
);
2809 test_mb_skcipher_speed("cbc(des)", ENCRYPT
, sec
, NULL
, 0,
2810 speed_template_8
, num_mb
);
2811 test_mb_skcipher_speed("cbc(des)", DECRYPT
, sec
, NULL
, 0,
2812 speed_template_8
, num_mb
);
2813 test_mb_skcipher_speed("cfb(des)", ENCRYPT
, sec
, NULL
, 0,
2814 speed_template_8
, num_mb
);
2815 test_mb_skcipher_speed("cfb(des)", DECRYPT
, sec
, NULL
, 0,
2816 speed_template_8
, num_mb
);
2817 test_mb_skcipher_speed("ofb(des)", ENCRYPT
, sec
, NULL
, 0,
2818 speed_template_8
, num_mb
);
2819 test_mb_skcipher_speed("ofb(des)", DECRYPT
, sec
, NULL
, 0,
2820 speed_template_8
, num_mb
);
2824 test_mb_skcipher_speed("ecb(serpent)", ENCRYPT
, sec
, NULL
, 0,
2825 speed_template_16_32
, num_mb
);
2826 test_mb_skcipher_speed("ecb(serpent)", DECRYPT
, sec
, NULL
, 0,
2827 speed_template_16_32
, num_mb
);
2828 test_mb_skcipher_speed("cbc(serpent)", ENCRYPT
, sec
, NULL
, 0,
2829 speed_template_16_32
, num_mb
);
2830 test_mb_skcipher_speed("cbc(serpent)", DECRYPT
, sec
, NULL
, 0,
2831 speed_template_16_32
, num_mb
);
2832 test_mb_skcipher_speed("ctr(serpent)", ENCRYPT
, sec
, NULL
, 0,
2833 speed_template_16_32
, num_mb
);
2834 test_mb_skcipher_speed("ctr(serpent)", DECRYPT
, sec
, NULL
, 0,
2835 speed_template_16_32
, num_mb
);
2836 test_mb_skcipher_speed("lrw(serpent)", ENCRYPT
, sec
, NULL
, 0,
2837 speed_template_32_48
, num_mb
);
2838 test_mb_skcipher_speed("lrw(serpent)", DECRYPT
, sec
, NULL
, 0,
2839 speed_template_32_48
, num_mb
);
2840 test_mb_skcipher_speed("xts(serpent)", ENCRYPT
, sec
, NULL
, 0,
2841 speed_template_32_64
, num_mb
);
2842 test_mb_skcipher_speed("xts(serpent)", DECRYPT
, sec
, NULL
, 0,
2843 speed_template_32_64
, num_mb
);
2847 test_mb_skcipher_speed("ecb(twofish)", ENCRYPT
, sec
, NULL
, 0,
2848 speed_template_16_24_32
, num_mb
);
2849 test_mb_skcipher_speed("ecb(twofish)", DECRYPT
, sec
, NULL
, 0,
2850 speed_template_16_24_32
, num_mb
);
2851 test_mb_skcipher_speed("cbc(twofish)", ENCRYPT
, sec
, NULL
, 0,
2852 speed_template_16_24_32
, num_mb
);
2853 test_mb_skcipher_speed("cbc(twofish)", DECRYPT
, sec
, NULL
, 0,
2854 speed_template_16_24_32
, num_mb
);
2855 test_mb_skcipher_speed("ctr(twofish)", ENCRYPT
, sec
, NULL
, 0,
2856 speed_template_16_24_32
, num_mb
);
2857 test_mb_skcipher_speed("ctr(twofish)", DECRYPT
, sec
, NULL
, 0,
2858 speed_template_16_24_32
, num_mb
);
2859 test_mb_skcipher_speed("lrw(twofish)", ENCRYPT
, sec
, NULL
, 0,
2860 speed_template_32_40_48
, num_mb
);
2861 test_mb_skcipher_speed("lrw(twofish)", DECRYPT
, sec
, NULL
, 0,
2862 speed_template_32_40_48
, num_mb
);
2863 test_mb_skcipher_speed("xts(twofish)", ENCRYPT
, sec
, NULL
, 0,
2864 speed_template_32_48_64
, num_mb
);
2865 test_mb_skcipher_speed("xts(twofish)", DECRYPT
, sec
, NULL
, 0,
2866 speed_template_32_48_64
, num_mb
);
2870 test_mb_skcipher_speed("ecb(arc4)", ENCRYPT
, sec
, NULL
, 0,
2871 speed_template_8
, num_mb
);
2875 test_mb_skcipher_speed("ecb(cast5)", ENCRYPT
, sec
, NULL
, 0,
2876 speed_template_8_16
, num_mb
);
2877 test_mb_skcipher_speed("ecb(cast5)", DECRYPT
, sec
, NULL
, 0,
2878 speed_template_8_16
, num_mb
);
2879 test_mb_skcipher_speed("cbc(cast5)", ENCRYPT
, sec
, NULL
, 0,
2880 speed_template_8_16
, num_mb
);
2881 test_mb_skcipher_speed("cbc(cast5)", DECRYPT
, sec
, NULL
, 0,
2882 speed_template_8_16
, num_mb
);
2883 test_mb_skcipher_speed("ctr(cast5)", ENCRYPT
, sec
, NULL
, 0,
2884 speed_template_8_16
, num_mb
);
2885 test_mb_skcipher_speed("ctr(cast5)", DECRYPT
, sec
, NULL
, 0,
2886 speed_template_8_16
, num_mb
);
2890 test_mb_skcipher_speed("ecb(cast6)", ENCRYPT
, sec
, NULL
, 0,
2891 speed_template_16_32
, num_mb
);
2892 test_mb_skcipher_speed("ecb(cast6)", DECRYPT
, sec
, NULL
, 0,
2893 speed_template_16_32
, num_mb
);
2894 test_mb_skcipher_speed("cbc(cast6)", ENCRYPT
, sec
, NULL
, 0,
2895 speed_template_16_32
, num_mb
);
2896 test_mb_skcipher_speed("cbc(cast6)", DECRYPT
, sec
, NULL
, 0,
2897 speed_template_16_32
, num_mb
);
2898 test_mb_skcipher_speed("ctr(cast6)", ENCRYPT
, sec
, NULL
, 0,
2899 speed_template_16_32
, num_mb
);
2900 test_mb_skcipher_speed("ctr(cast6)", DECRYPT
, sec
, NULL
, 0,
2901 speed_template_16_32
, num_mb
);
2902 test_mb_skcipher_speed("lrw(cast6)", ENCRYPT
, sec
, NULL
, 0,
2903 speed_template_32_48
, num_mb
);
2904 test_mb_skcipher_speed("lrw(cast6)", DECRYPT
, sec
, NULL
, 0,
2905 speed_template_32_48
, num_mb
);
2906 test_mb_skcipher_speed("xts(cast6)", ENCRYPT
, sec
, NULL
, 0,
2907 speed_template_32_64
, num_mb
);
2908 test_mb_skcipher_speed("xts(cast6)", DECRYPT
, sec
, NULL
, 0,
2909 speed_template_32_64
, num_mb
);
2913 test_mb_skcipher_speed("ecb(camellia)", ENCRYPT
, sec
, NULL
, 0,
2914 speed_template_16_32
, num_mb
);
2915 test_mb_skcipher_speed("ecb(camellia)", DECRYPT
, sec
, NULL
, 0,
2916 speed_template_16_32
, num_mb
);
2917 test_mb_skcipher_speed("cbc(camellia)", ENCRYPT
, sec
, NULL
, 0,
2918 speed_template_16_32
, num_mb
);
2919 test_mb_skcipher_speed("cbc(camellia)", DECRYPT
, sec
, NULL
, 0,
2920 speed_template_16_32
, num_mb
);
2921 test_mb_skcipher_speed("ctr(camellia)", ENCRYPT
, sec
, NULL
, 0,
2922 speed_template_16_32
, num_mb
);
2923 test_mb_skcipher_speed("ctr(camellia)", DECRYPT
, sec
, NULL
, 0,
2924 speed_template_16_32
, num_mb
);
2925 test_mb_skcipher_speed("lrw(camellia)", ENCRYPT
, sec
, NULL
, 0,
2926 speed_template_32_48
, num_mb
);
2927 test_mb_skcipher_speed("lrw(camellia)", DECRYPT
, sec
, NULL
, 0,
2928 speed_template_32_48
, num_mb
);
2929 test_mb_skcipher_speed("xts(camellia)", ENCRYPT
, sec
, NULL
, 0,
2930 speed_template_32_64
, num_mb
);
2931 test_mb_skcipher_speed("xts(camellia)", DECRYPT
, sec
, NULL
, 0,
2932 speed_template_32_64
, num_mb
);
2936 test_mb_skcipher_speed("ecb(blowfish)", ENCRYPT
, sec
, NULL
, 0,
2937 speed_template_8_32
, num_mb
);
2938 test_mb_skcipher_speed("ecb(blowfish)", DECRYPT
, sec
, NULL
, 0,
2939 speed_template_8_32
, num_mb
);
2940 test_mb_skcipher_speed("cbc(blowfish)", ENCRYPT
, sec
, NULL
, 0,
2941 speed_template_8_32
, num_mb
);
2942 test_mb_skcipher_speed("cbc(blowfish)", DECRYPT
, sec
, NULL
, 0,
2943 speed_template_8_32
, num_mb
);
2944 test_mb_skcipher_speed("ctr(blowfish)", ENCRYPT
, sec
, NULL
, 0,
2945 speed_template_8_32
, num_mb
);
2946 test_mb_skcipher_speed("ctr(blowfish)", DECRYPT
, sec
, NULL
, 0,
2947 speed_template_8_32
, num_mb
);
2958 static int __init
tcrypt_mod_init(void)
2963 for (i
= 0; i
< TVMEMSIZE
; i
++) {
2964 tvmem
[i
] = (void *)__get_free_page(GFP_KERNEL
);
2969 err
= do_test(alg
, type
, mask
, mode
, num_mb
);
2972 printk(KERN_ERR
"tcrypt: one or more tests failed!\n");
2975 pr_debug("all tests passed\n");
2978 /* We intentionaly return -EAGAIN to prevent keeping the module,
2979 * unless we're running in fips mode. It does all its work from
2980 * init() and doesn't offer any runtime functionality, but in
2981 * the fips case, checking for a successful load is helpful.
2982 * => we don't need it in the memory, do we?
2989 for (i
= 0; i
< TVMEMSIZE
&& tvmem
[i
]; i
++)
2990 free_page((unsigned long)tvmem
[i
]);
2996 * If an init function is provided, an exit function must also be provided
2997 * to allow module unload.
2999 static void __exit
tcrypt_mod_fini(void) { }
3001 module_init(tcrypt_mod_init
);
3002 module_exit(tcrypt_mod_fini
);
3004 module_param(alg
, charp
, 0);
3005 module_param(type
, uint
, 0);
3006 module_param(mask
, uint
, 0);
3007 module_param(mode
, int, 0);
3008 module_param(sec
, uint
, 0);
3009 MODULE_PARM_DESC(sec
, "Length in seconds of speed tests "
3010 "(defaults to zero which uses CPU cycles instead)");
3011 module_param(num_mb
, uint
, 0000);
3012 MODULE_PARM_DESC(num_mb
, "Number of concurrent requests to be used in mb speed tests (defaults to 8)");
3014 MODULE_LICENSE("GPL");
3015 MODULE_DESCRIPTION("Quick & dirty crypto testing module");
3016 MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");