diff options
author | Harald Welte <laforge@gnumonks.org> | 2005-06-22 16:27:23 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2005-06-22 16:27:23 -0400 |
commit | ebfd9bcf16e4aaddcfe2d1b76b50e3dd6d3242e2 (patch) | |
tree | a82a4d627d339197846031e16e2de622c766fe5e | |
parent | 3cc3816f93e3f94f88503da8e6090302fa986bd6 (diff) |
[CRYPTO]: Add cipher speed tests
From: Reyk Floeter <reyk@vantronix.net>
I recently had the requirement to do some benchmarking on cryptoapi, and
I found reyk's very useful performance test patch [1].
However, I could not find any discussion on why that extension (or
something providing a similar feature but different implementation) was
not merged into mainline. If there was such a discussion, can someone
please point me to the archive[s]?
I've now merged the old patch into 2.6.12-rc1, the result can be found
attached to this email.
[1] http://lists.logix.cz/pipermail/padlock/2004/000010.html
Signed-off-by: Harald Welte <laforge@gnumonks.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | crypto/tcrypt.c | 134 | ||||
-rw-r--r-- | crypto/tcrypt.h | 92 |
2 files changed, 222 insertions, 4 deletions
diff --git a/crypto/tcrypt.c b/crypto/tcrypt.c index 85a88a71ff53..414ef5e71171 100644 --- a/crypto/tcrypt.c +++ b/crypto/tcrypt.c | |||
@@ -12,8 +12,9 @@ | |||
12 | * Software Foundation; either version 2 of the License, or (at your option) | 12 | * Software Foundation; either version 2 of the License, or (at your option) |
13 | * any later version. | 13 | * any later version. |
14 | * | 14 | * |
15 | * 14 - 09 - 2003 | 15 | * 2004-08-09 Added cipher speed tests (Reyk Floeter <reyk@vantronix.net>) |
16 | * Rewritten by Kartikey Mahendra Bhatt | 16 | * 2003-09-14 Rewritten by Kartikey Mahendra Bhatt |
17 | * | ||
17 | */ | 18 | */ |
18 | 19 | ||
19 | #include <linux/init.h> | 20 | #include <linux/init.h> |
@@ -25,12 +26,13 @@ | |||
25 | #include <linux/crypto.h> | 26 | #include <linux/crypto.h> |
26 | #include <linux/highmem.h> | 27 | #include <linux/highmem.h> |
27 | #include <linux/moduleparam.h> | 28 | #include <linux/moduleparam.h> |
29 | #include <linux/jiffies.h> | ||
28 | #include "tcrypt.h" | 30 | #include "tcrypt.h" |
29 | 31 | ||
30 | /* | 32 | /* |
31 | * Need to kmalloc() memory for testing kmap(). | 33 | * Need to kmalloc() memory for testing kmap(). |
32 | */ | 34 | */ |
33 | #define TVMEMSIZE 4096 | 35 | #define TVMEMSIZE 16384 |
34 | #define XBUFSIZE 32768 | 36 | #define XBUFSIZE 32768 |
35 | 37 | ||
36 | /* | 38 | /* |
@@ -55,6 +57,11 @@ | |||
55 | 57 | ||
56 | static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 }; | 58 | static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 }; |
57 | 59 | ||
60 | /* | ||
61 | * Used by test_cipher_speed() | ||
62 | */ | ||
63 | static unsigned int sec = 10; | ||
64 | |||
58 | static int mode; | 65 | static int mode; |
59 | static char *xbuf; | 66 | static char *xbuf; |
60 | static char *tvmem; | 67 | static char *tvmem; |
@@ -419,6 +426,90 @@ out: | |||
419 | crypto_free_tfm(tfm); | 426 | crypto_free_tfm(tfm); |
420 | } | 427 | } |
421 | 428 | ||
429 | static void test_cipher_speed(char *algo, int mode, int enc, unsigned int sec, | ||
430 | struct cipher_speed *speed) | ||
431 | { | ||
432 | unsigned int ret, i, iv_len; | ||
433 | unsigned char *key, *p, iv[128]; | ||
434 | struct crypto_tfm *tfm; | ||
435 | struct scatterlist sg[8]; | ||
436 | unsigned long start, bcount; | ||
437 | const char *e, *m; | ||
438 | |||
439 | if (enc == ENCRYPT) | ||
440 | e = "encryption"; | ||
441 | else | ||
442 | e = "decryption"; | ||
443 | if (mode == MODE_ECB) | ||
444 | m = "ECB"; | ||
445 | else | ||
446 | m = "CBC"; | ||
447 | |||
448 | printk("\ntesting speed of %s %s %s\n", algo, m, e); | ||
449 | |||
450 | if (mode) | ||
451 | tfm = crypto_alloc_tfm(algo, 0); | ||
452 | else | ||
453 | tfm = crypto_alloc_tfm(algo, CRYPTO_TFM_MODE_CBC); | ||
454 | |||
455 | if (tfm == NULL) { | ||
456 | printk("failed to load transform for %s %s\n", algo, m); | ||
457 | return; | ||
458 | } | ||
459 | |||
460 | for (i = 0; speed[i].klen != 0; i++) { | ||
461 | if ((speed[i].blen + speed[i].klen) > TVMEMSIZE) { | ||
462 | printk("template (%u) too big for tvmem (%u)\n", | ||
463 | speed[i].blen + speed[i].klen, TVMEMSIZE); | ||
464 | goto out; | ||
465 | } | ||
466 | |||
467 | printk("test %u (%d bit key, %d byte blocks): ", i, | ||
468 | speed[i].klen * 8, speed[i].blen); | ||
469 | |||
470 | memset(tvmem, 0xff, speed[i].klen + speed[i].blen); | ||
471 | |||
472 | /* set key, plain text and IV */ | ||
473 | key = (unsigned char *)tvmem; | ||
474 | p = (unsigned char *)tvmem + speed[i].klen; | ||
475 | |||
476 | ret = crypto_cipher_setkey(tfm, key, speed[i].klen); | ||
477 | if (ret) { | ||
478 | printk("setkey() failed flags=%x\n", tfm->crt_flags); | ||
479 | goto out; | ||
480 | } | ||
481 | |||
482 | if (!mode) { | ||
483 | iv_len = crypto_tfm_alg_ivsize(tfm); | ||
484 | memset(&iv, 0xff, iv_len); | ||
485 | crypto_cipher_set_iv(tfm, iv, iv_len); | ||
486 | } | ||
487 | |||
488 | for (start = jiffies, bcount = 0; | ||
489 | ((jiffies - start) / HZ) < sec; bcount++) { | ||
490 | sg[0].page = virt_to_page(p); | ||
491 | sg[0].offset = offset_in_page(p); | ||
492 | sg[0].length = speed[i].blen; | ||
493 | |||
494 | if (enc) | ||
495 | ret = crypto_cipher_encrypt(tfm, sg, sg, speed[i].blen); | ||
496 | else | ||
497 | ret = crypto_cipher_decrypt(tfm, sg, sg, speed[i].blen); | ||
498 | |||
499 | if (ret) { | ||
500 | printk("%s () failed flags=%x\n", e, tfm->crt_flags); | ||
501 | goto out; | ||
502 | } | ||
503 | } | ||
504 | |||
505 | printk("%lu operations in %u seconds (%lu bytes)\n", | ||
506 | bcount, sec, bcount * speed[i].blen); | ||
507 | } | ||
508 | |||
509 | out: | ||
510 | crypto_free_tfm(tfm); | ||
511 | } | ||
512 | |||
422 | static void test_deflate(void) | 513 | static void test_deflate(void) |
423 | { | 514 | { |
424 | unsigned int i; | 515 | unsigned int i; |
@@ -861,6 +952,41 @@ static void do_test(void) | |||
861 | 952 | ||
862 | #endif | 953 | #endif |
863 | 954 | ||
955 | case 200: | ||
956 | test_cipher_speed("aes", MODE_ECB, ENCRYPT, sec, aes_speed_template); | ||
957 | test_cipher_speed("aes", MODE_ECB, DECRYPT, sec, aes_speed_template); | ||
958 | test_cipher_speed("aes", MODE_CBC, ENCRYPT, sec, aes_speed_template); | ||
959 | test_cipher_speed("aes", MODE_CBC, DECRYPT, sec, aes_speed_template); | ||
960 | break; | ||
961 | |||
962 | case 201: | ||
963 | test_cipher_speed("des3_ede", MODE_ECB, ENCRYPT, sec, des3_ede_speed_template); | ||
964 | test_cipher_speed("des3_ede", MODE_ECB, DECRYPT, sec, des3_ede_speed_template); | ||
965 | test_cipher_speed("des3_ede", MODE_CBC, ENCRYPT, sec, des3_ede_speed_template); | ||
966 | test_cipher_speed("des3_ede", MODE_CBC, DECRYPT, sec, des3_ede_speed_template); | ||
967 | break; | ||
968 | |||
969 | case 202: | ||
970 | test_cipher_speed("twofish", MODE_ECB, ENCRYPT, sec, twofish_speed_template); | ||
971 | test_cipher_speed("twofish", MODE_ECB, DECRYPT, sec, twofish_speed_template); | ||
972 | test_cipher_speed("twofish", MODE_CBC, ENCRYPT, sec, twofish_speed_template); | ||
973 | test_cipher_speed("twofish", MODE_CBC, DECRYPT, sec, twofish_speed_template); | ||
974 | break; | ||
975 | |||
976 | case 203: | ||
977 | test_cipher_speed("blowfish", MODE_ECB, ENCRYPT, sec, blowfish_speed_template); | ||
978 | test_cipher_speed("blowfish", MODE_ECB, DECRYPT, sec, blowfish_speed_template); | ||
979 | test_cipher_speed("blowfish", MODE_CBC, ENCRYPT, sec, blowfish_speed_template); | ||
980 | test_cipher_speed("blowfish", MODE_CBC, DECRYPT, sec, blowfish_speed_template); | ||
981 | break; | ||
982 | |||
983 | case 204: | ||
984 | test_cipher_speed("des", MODE_ECB, ENCRYPT, sec, des_speed_template); | ||
985 | test_cipher_speed("des", MODE_ECB, DECRYPT, sec, des_speed_template); | ||
986 | test_cipher_speed("des", MODE_CBC, ENCRYPT, sec, des_speed_template); | ||
987 | test_cipher_speed("des", MODE_CBC, DECRYPT, sec, des_speed_template); | ||
988 | break; | ||
989 | |||
864 | case 1000: | 990 | case 1000: |
865 | test_available(); | 991 | test_available(); |
866 | break; | 992 | break; |
@@ -901,6 +1027,8 @@ module_init(init); | |||
901 | module_exit(fini); | 1027 | module_exit(fini); |
902 | 1028 | ||
903 | module_param(mode, int, 0); | 1029 | module_param(mode, int, 0); |
1030 | module_param(sec, uint, 0); | ||
1031 | MODULE_PARM_DESC(sec, "Length in seconds of speed tests"); | ||
904 | 1032 | ||
905 | MODULE_LICENSE("GPL"); | 1033 | MODULE_LICENSE("GPL"); |
906 | MODULE_DESCRIPTION("Quick & dirty crypto testing module"); | 1034 | MODULE_DESCRIPTION("Quick & dirty crypto testing module"); |
diff --git a/crypto/tcrypt.h b/crypto/tcrypt.h index 72d40704042f..c01a0ce9b40a 100644 --- a/crypto/tcrypt.h +++ b/crypto/tcrypt.h | |||
@@ -12,7 +12,8 @@ | |||
12 | * Software Foundation; either version 2 of the License, or (at your option) | 12 | * Software Foundation; either version 2 of the License, or (at your option) |
13 | * any later version. | 13 | * any later version. |
14 | * | 14 | * |
15 | * 14 - 09 - 2003 Changes by Kartikey Mahendra Bhatt | 15 | * 2004-08-09 Cipher speed tests by Reyk Floeter <reyk@vantronix.net> |
16 | * 2003-09-14 Changes by Kartikey Mahendra Bhatt | ||
16 | * | 17 | * |
17 | */ | 18 | */ |
18 | #ifndef _CRYPTO_TCRYPT_H | 19 | #ifndef _CRYPTO_TCRYPT_H |
@@ -58,6 +59,11 @@ struct cipher_testvec { | |||
58 | unsigned char tap[MAX_TAP]; | 59 | unsigned char tap[MAX_TAP]; |
59 | }; | 60 | }; |
60 | 61 | ||
62 | struct cipher_speed { | ||
63 | unsigned char klen; | ||
64 | unsigned int blen; | ||
65 | }; | ||
66 | |||
61 | /* | 67 | /* |
62 | * MD4 test vectors from RFC1320 | 68 | * MD4 test vectors from RFC1320 |
63 | */ | 69 | */ |
@@ -2728,4 +2734,88 @@ static struct hash_testvec michael_mic_tv_template[] = { | |||
2728 | } | 2734 | } |
2729 | }; | 2735 | }; |
2730 | 2736 | ||
2737 | /* | ||
2738 | * Cipher speed tests | ||
2739 | */ | ||
2740 | static struct cipher_speed aes_speed_template[] = { | ||
2741 | { .klen = 16, .blen = 16, }, | ||
2742 | { .klen = 16, .blen = 64, }, | ||
2743 | { .klen = 16, .blen = 256, }, | ||
2744 | { .klen = 16, .blen = 1024, }, | ||
2745 | { .klen = 16, .blen = 8192, }, | ||
2746 | { .klen = 24, .blen = 16, }, | ||
2747 | { .klen = 24, .blen = 64, }, | ||
2748 | { .klen = 24, .blen = 256, }, | ||
2749 | { .klen = 24, .blen = 1024, }, | ||
2750 | { .klen = 24, .blen = 8192, }, | ||
2751 | { .klen = 32, .blen = 16, }, | ||
2752 | { .klen = 32, .blen = 64, }, | ||
2753 | { .klen = 32, .blen = 256, }, | ||
2754 | { .klen = 32, .blen = 1024, }, | ||
2755 | { .klen = 32, .blen = 8192, }, | ||
2756 | |||
2757 | /* End marker */ | ||
2758 | { .klen = 0, .blen = 0, } | ||
2759 | }; | ||
2760 | |||
2761 | static struct cipher_speed des3_ede_speed_template[] = { | ||
2762 | { .klen = 24, .blen = 16, }, | ||
2763 | { .klen = 24, .blen = 64, }, | ||
2764 | { .klen = 24, .blen = 256, }, | ||
2765 | { .klen = 24, .blen = 1024, }, | ||
2766 | { .klen = 24, .blen = 8192, }, | ||
2767 | |||
2768 | /* End marker */ | ||
2769 | { .klen = 0, .blen = 0, } | ||
2770 | }; | ||
2771 | |||
2772 | static struct cipher_speed twofish_speed_template[] = { | ||
2773 | { .klen = 16, .blen = 16, }, | ||
2774 | { .klen = 16, .blen = 64, }, | ||
2775 | { .klen = 16, .blen = 256, }, | ||
2776 | { .klen = 16, .blen = 1024, }, | ||
2777 | { .klen = 16, .blen = 8192, }, | ||
2778 | { .klen = 24, .blen = 16, }, | ||
2779 | { .klen = 24, .blen = 64, }, | ||
2780 | { .klen = 24, .blen = 256, }, | ||
2781 | { .klen = 24, .blen = 1024, }, | ||
2782 | { .klen = 24, .blen = 8192, }, | ||
2783 | { .klen = 32, .blen = 16, }, | ||
2784 | { .klen = 32, .blen = 64, }, | ||
2785 | { .klen = 32, .blen = 256, }, | ||
2786 | { .klen = 32, .blen = 1024, }, | ||
2787 | { .klen = 32, .blen = 8192, }, | ||
2788 | |||
2789 | /* End marker */ | ||
2790 | { .klen = 0, .blen = 0, } | ||
2791 | }; | ||
2792 | |||
2793 | static struct cipher_speed blowfish_speed_template[] = { | ||
2794 | /* Don't support blowfish keys > 256 bit in this test */ | ||
2795 | { .klen = 8, .blen = 16, }, | ||
2796 | { .klen = 8, .blen = 64, }, | ||
2797 | { .klen = 8, .blen = 256, }, | ||
2798 | { .klen = 8, .blen = 1024, }, | ||
2799 | { .klen = 8, .blen = 8192, }, | ||
2800 | { .klen = 32, .blen = 16, }, | ||
2801 | { .klen = 32, .blen = 64, }, | ||
2802 | { .klen = 32, .blen = 256, }, | ||
2803 | { .klen = 32, .blen = 1024, }, | ||
2804 | { .klen = 32, .blen = 8192, }, | ||
2805 | |||
2806 | /* End marker */ | ||
2807 | { .klen = 0, .blen = 0, } | ||
2808 | }; | ||
2809 | |||
2810 | static struct cipher_speed des_speed_template[] = { | ||
2811 | { .klen = 8, .blen = 16, }, | ||
2812 | { .klen = 8, .blen = 64, }, | ||
2813 | { .klen = 8, .blen = 256, }, | ||
2814 | { .klen = 8, .blen = 1024, }, | ||
2815 | { .klen = 8, .blen = 8192, }, | ||
2816 | |||
2817 | /* End marker */ | ||
2818 | { .klen = 0, .blen = 0, } | ||
2819 | }; | ||
2820 | |||
2731 | #endif /* _CRYPTO_TCRYPT_H */ | 2821 | #endif /* _CRYPTO_TCRYPT_H */ |