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>
10 * This program is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU General Public License as published by the Free
12 * Software Foundation; either version 2 of the License, or (at your option)
15 * 2004-08-09 Added cipher speed tests (Reyk Floeter <reyk@vantronix.net>)
16 * 2003-09-14 Rewritten by Kartikey Mahendra Bhatt
20 #include <linux/init.h>
21 #include <linux/module.h>
23 #include <linux/slab.h>
24 #include <asm/scatterlist.h>
25 #include <linux/string.h>
26 #include <linux/crypto.h>
27 #include <linux/highmem.h>
28 #include <linux/moduleparam.h>
29 #include <linux/jiffies.h>
30 #include <linux/timex.h>
31 #include <linux/interrupt.h>
35 * Need to kmalloc() memory for testing kmap().
37 #define TVMEMSIZE 16384
38 #define XBUFSIZE 32768
41 * Indexes into the xbuf to simulate cross-page access.
53 * Used by test_cipher()
60 static unsigned int IDX
[8] = { IDX1
, IDX2
, IDX3
, IDX4
, IDX5
, IDX6
, IDX7
, IDX8
};
63 * Used by test_cipher_speed()
65 static unsigned int sec
;
71 static char *check
[] = {
72 "des", "md5", "des3_ede", "rot13", "sha1", "sha256", "blowfish",
73 "twofish", "serpent", "sha384", "sha512", "md4", "aes", "cast6",
74 "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
75 "khazad", "wp512", "wp384", "wp256", "tnepres", NULL
78 static void hexdump(unsigned char *buf
, unsigned int len
)
81 printk("%02x", *buf
++);
86 static void test_hash(char *algo
, struct hash_testvec
*template,
90 unsigned int i
, j
, k
, temp
;
91 struct scatterlist sg
[8];
93 struct crypto_tfm
*tfm
;
94 struct hash_testvec
*hash_tv
;
97 printk("\ntesting %s\n", algo
);
99 tsize
= sizeof(struct hash_testvec
);
102 if (tsize
> TVMEMSIZE
) {
103 printk("template (%u) too big for tvmem (%u)\n", tsize
, TVMEMSIZE
);
107 memcpy(tvmem
, template, tsize
);
108 hash_tv
= (void *)tvmem
;
109 tfm
= crypto_alloc_tfm(algo
, 0);
111 printk("failed to load transform for %s\n", algo
);
115 for (i
= 0; i
< tcount
; i
++) {
116 printk("test %u:\n", i
+ 1);
117 memset(result
, 0, 64);
119 p
= hash_tv
[i
].plaintext
;
120 sg
[0].page
= virt_to_page(p
);
121 sg
[0].offset
= offset_in_page(p
);
122 sg
[0].length
= hash_tv
[i
].psize
;
124 crypto_digest_init(tfm
);
125 if (tfm
->crt_u
.digest
.dit_setkey
) {
126 crypto_digest_setkey(tfm
, hash_tv
[i
].key
,
129 crypto_digest_update(tfm
, sg
, 1);
130 crypto_digest_final(tfm
, result
);
132 hexdump(result
, crypto_tfm_alg_digestsize(tfm
));
134 memcmp(result
, hash_tv
[i
].digest
,
135 crypto_tfm_alg_digestsize(tfm
)) ?
139 printk("testing %s across pages\n", algo
);
141 /* setup the dummy buffer first */
142 memset(xbuf
, 0, XBUFSIZE
);
145 for (i
= 0; i
< tcount
; i
++) {
148 printk("test %u:\n", j
);
149 memset(result
, 0, 64);
152 for (k
= 0; k
< hash_tv
[i
].np
; k
++) {
153 memcpy(&xbuf
[IDX
[k
]],
154 hash_tv
[i
].plaintext
+ temp
,
156 temp
+= hash_tv
[i
].tap
[k
];
158 sg
[k
].page
= virt_to_page(p
);
159 sg
[k
].offset
= offset_in_page(p
);
160 sg
[k
].length
= hash_tv
[i
].tap
[k
];
163 crypto_digest_digest(tfm
, sg
, hash_tv
[i
].np
, result
);
165 hexdump(result
, crypto_tfm_alg_digestsize(tfm
));
167 memcmp(result
, hash_tv
[i
].digest
,
168 crypto_tfm_alg_digestsize(tfm
)) ?
173 crypto_free_tfm(tfm
);
177 #ifdef CONFIG_CRYPTO_HMAC
179 static void test_hmac(char *algo
, struct hmac_testvec
*template,
183 unsigned int i
, j
, k
, temp
;
184 struct scatterlist sg
[8];
186 struct crypto_tfm
*tfm
;
187 struct hmac_testvec
*hmac_tv
;
188 unsigned int tsize
, klen
;
190 tfm
= crypto_alloc_tfm(algo
, 0);
192 printk("failed to load transform for %s\n", algo
);
196 printk("\ntesting hmac_%s\n", algo
);
198 tsize
= sizeof(struct hmac_testvec
);
200 if (tsize
> TVMEMSIZE
) {
201 printk("template (%u) too big for tvmem (%u)\n", tsize
,
206 memcpy(tvmem
, template, tsize
);
207 hmac_tv
= (void *)tvmem
;
209 for (i
= 0; i
< tcount
; i
++) {
210 printk("test %u:\n", i
+ 1);
211 memset(result
, 0, sizeof (result
));
213 p
= hmac_tv
[i
].plaintext
;
214 klen
= hmac_tv
[i
].ksize
;
215 sg
[0].page
= virt_to_page(p
);
216 sg
[0].offset
= offset_in_page(p
);
217 sg
[0].length
= hmac_tv
[i
].psize
;
219 crypto_hmac(tfm
, hmac_tv
[i
].key
, &klen
, sg
, 1, result
);
221 hexdump(result
, crypto_tfm_alg_digestsize(tfm
));
223 memcmp(result
, hmac_tv
[i
].digest
,
224 crypto_tfm_alg_digestsize(tfm
)) ? "fail" :
228 printk("\ntesting hmac_%s across pages\n", algo
);
230 memset(xbuf
, 0, XBUFSIZE
);
233 for (i
= 0; i
< tcount
; i
++) {
236 printk("test %u:\n",j
);
237 memset(result
, 0, 64);
240 klen
= hmac_tv
[i
].ksize
;
241 for (k
= 0; k
< hmac_tv
[i
].np
; k
++) {
242 memcpy(&xbuf
[IDX
[k
]],
243 hmac_tv
[i
].plaintext
+ temp
,
245 temp
+= hmac_tv
[i
].tap
[k
];
247 sg
[k
].page
= virt_to_page(p
);
248 sg
[k
].offset
= offset_in_page(p
);
249 sg
[k
].length
= hmac_tv
[i
].tap
[k
];
252 crypto_hmac(tfm
, hmac_tv
[i
].key
, &klen
, sg
,
253 hmac_tv
[i
].np
, result
);
254 hexdump(result
, crypto_tfm_alg_digestsize(tfm
));
257 memcmp(result
, hmac_tv
[i
].digest
,
258 crypto_tfm_alg_digestsize(tfm
)) ?
263 crypto_free_tfm(tfm
);
266 #endif /* CONFIG_CRYPTO_HMAC */
268 static void test_cipher(char *algo
, int mode
, int enc
,
269 struct cipher_testvec
*template, unsigned int tcount
)
271 unsigned int ret
, i
, j
, k
, temp
;
274 struct crypto_tfm
*tfm
;
276 struct cipher_testvec
*cipher_tv
;
277 struct scatterlist sg
[8];
284 if (mode
== MODE_ECB
)
289 printk("\ntesting %s %s %s\n", algo
, m
, e
);
291 tsize
= sizeof (struct cipher_testvec
);
294 if (tsize
> TVMEMSIZE
) {
295 printk("template (%u) too big for tvmem (%u)\n", tsize
,
300 memcpy(tvmem
, template, tsize
);
301 cipher_tv
= (void *)tvmem
;
304 tfm
= crypto_alloc_tfm(algo
, 0);
306 tfm
= crypto_alloc_tfm(algo
, CRYPTO_TFM_MODE_CBC
);
309 printk("failed to load transform for %s %s\n", algo
, m
);
314 for (i
= 0; i
< tcount
; i
++) {
315 if (!(cipher_tv
[i
].np
)) {
317 printk("test %u (%d bit key):\n",
318 j
, cipher_tv
[i
].klen
* 8);
322 tfm
->crt_flags
|= CRYPTO_TFM_REQ_WEAK_KEY
;
323 key
= cipher_tv
[i
].key
;
325 ret
= crypto_cipher_setkey(tfm
, key
, cipher_tv
[i
].klen
);
327 printk("setkey() failed flags=%x\n", tfm
->crt_flags
);
329 if (!cipher_tv
[i
].fail
)
333 p
= cipher_tv
[i
].input
;
334 sg
[0].page
= virt_to_page(p
);
335 sg
[0].offset
= offset_in_page(p
);
336 sg
[0].length
= cipher_tv
[i
].ilen
;
339 crypto_cipher_set_iv(tfm
, cipher_tv
[i
].iv
,
340 crypto_tfm_alg_ivsize(tfm
));
344 ret
= crypto_cipher_encrypt(tfm
, sg
, sg
, cipher_tv
[i
].ilen
);
346 ret
= crypto_cipher_decrypt(tfm
, sg
, sg
, cipher_tv
[i
].ilen
);
350 printk("%s () failed flags=%x\n", e
, tfm
->crt_flags
);
354 q
= kmap(sg
[0].page
) + sg
[0].offset
;
355 hexdump(q
, cipher_tv
[i
].rlen
);
358 memcmp(q
, cipher_tv
[i
].result
,
359 cipher_tv
[i
].rlen
) ? "fail" : "pass");
363 printk("\ntesting %s %s %s across pages (chunking)\n", algo
, m
, e
);
364 memset(xbuf
, 0, XBUFSIZE
);
367 for (i
= 0; i
< tcount
; i
++) {
368 if (cipher_tv
[i
].np
) {
370 printk("test %u (%d bit key):\n",
371 j
, cipher_tv
[i
].klen
* 8);
375 tfm
->crt_flags
|= CRYPTO_TFM_REQ_WEAK_KEY
;
376 key
= cipher_tv
[i
].key
;
378 ret
= crypto_cipher_setkey(tfm
, key
, cipher_tv
[i
].klen
);
380 printk("setkey() failed flags=%x\n", tfm
->crt_flags
);
382 if (!cipher_tv
[i
].fail
)
387 for (k
= 0; k
< cipher_tv
[i
].np
; k
++) {
388 memcpy(&xbuf
[IDX
[k
]],
389 cipher_tv
[i
].input
+ temp
,
390 cipher_tv
[i
].tap
[k
]);
391 temp
+= cipher_tv
[i
].tap
[k
];
393 sg
[k
].page
= virt_to_page(p
);
394 sg
[k
].offset
= offset_in_page(p
);
395 sg
[k
].length
= cipher_tv
[i
].tap
[k
];
399 crypto_cipher_set_iv(tfm
, cipher_tv
[i
].iv
,
400 crypto_tfm_alg_ivsize(tfm
));
404 ret
= crypto_cipher_encrypt(tfm
, sg
, sg
, cipher_tv
[i
].ilen
);
406 ret
= crypto_cipher_decrypt(tfm
, sg
, sg
, cipher_tv
[i
].ilen
);
409 printk("%s () failed flags=%x\n", e
, tfm
->crt_flags
);
414 for (k
= 0; k
< cipher_tv
[i
].np
; k
++) {
415 printk("page %u\n", k
);
416 q
= kmap(sg
[k
].page
) + sg
[k
].offset
;
417 hexdump(q
, cipher_tv
[i
].tap
[k
]);
419 memcmp(q
, cipher_tv
[i
].result
+ temp
,
420 cipher_tv
[i
].tap
[k
]) ? "fail" :
422 temp
+= cipher_tv
[i
].tap
[k
];
428 crypto_free_tfm(tfm
);
431 static int test_cipher_jiffies(struct crypto_tfm
*tfm
, int enc
, char *p
,
434 struct scatterlist sg
[8];
435 unsigned long start
, end
;
439 sg
[0].page
= virt_to_page(p
);
440 sg
[0].offset
= offset_in_page(p
);
443 for (start
= jiffies
, end
= start
+ sec
* HZ
, bcount
= 0;
444 time_before(jiffies
, end
); bcount
++) {
446 ret
= crypto_cipher_encrypt(tfm
, sg
, sg
, blen
);
448 ret
= crypto_cipher_decrypt(tfm
, sg
, sg
, blen
);
454 printk("%d operations in %d seconds (%ld bytes)\n",
455 bcount
, sec
, (long)bcount
* blen
);
459 static int test_cipher_cycles(struct crypto_tfm
*tfm
, int enc
, char *p
,
462 struct scatterlist sg
[8];
463 unsigned long cycles
= 0;
467 sg
[0].page
= virt_to_page(p
);
468 sg
[0].offset
= offset_in_page(p
);
475 for (i
= 0; i
< 4; i
++) {
477 ret
= crypto_cipher_encrypt(tfm
, sg
, sg
, blen
);
479 ret
= crypto_cipher_decrypt(tfm
, sg
, sg
, blen
);
485 /* The real thing. */
486 for (i
= 0; i
< 8; i
++) {
489 start
= get_cycles();
491 ret
= crypto_cipher_encrypt(tfm
, sg
, sg
, blen
);
493 ret
= crypto_cipher_decrypt(tfm
, sg
, sg
, blen
);
499 cycles
+= end
- start
;
507 printk("1 operation in %lu cycles (%d bytes)\n",
508 (cycles
+ 4) / 8, blen
);
513 static void test_cipher_speed(char *algo
, int mode
, int enc
, unsigned int sec
,
514 struct cipher_testvec
*template,
515 unsigned int tcount
, struct cipher_speed
*speed
)
517 unsigned int ret
, i
, j
, iv_len
;
518 unsigned char *key
, *p
, iv
[128];
519 struct crypto_tfm
*tfm
;
526 if (mode
== MODE_ECB
)
531 printk("\ntesting speed of %s %s %s\n", algo
, m
, e
);
534 tfm
= crypto_alloc_tfm(algo
, 0);
536 tfm
= crypto_alloc_tfm(algo
, CRYPTO_TFM_MODE_CBC
);
539 printk("failed to load transform for %s %s\n", algo
, m
);
543 for (i
= 0; speed
[i
].klen
!= 0; i
++) {
544 if ((speed
[i
].blen
+ speed
[i
].klen
) > TVMEMSIZE
) {
545 printk("template (%u) too big for tvmem (%u)\n",
546 speed
[i
].blen
+ speed
[i
].klen
, TVMEMSIZE
);
550 printk("test %u (%d bit key, %d byte blocks): ", i
,
551 speed
[i
].klen
* 8, speed
[i
].blen
);
553 memset(tvmem
, 0xff, speed
[i
].klen
+ speed
[i
].blen
);
555 /* set key, plain text and IV */
556 key
= (unsigned char *)tvmem
;
557 for (j
= 0; j
< tcount
; j
++) {
558 if (template[j
].klen
== speed
[i
].klen
) {
559 key
= template[j
].key
;
563 p
= (unsigned char *)tvmem
+ speed
[i
].klen
;
565 ret
= crypto_cipher_setkey(tfm
, key
, speed
[i
].klen
);
567 printk("setkey() failed flags=%x\n", tfm
->crt_flags
);
572 iv_len
= crypto_tfm_alg_ivsize(tfm
);
573 memset(&iv
, 0xff, iv_len
);
574 crypto_cipher_set_iv(tfm
, iv
, iv_len
);
578 ret
= test_cipher_jiffies(tfm
, enc
, p
, speed
[i
].blen
,
581 ret
= test_cipher_cycles(tfm
, enc
, p
, speed
[i
].blen
);
584 printk("%s() failed flags=%x\n", e
, tfm
->crt_flags
);
590 crypto_free_tfm(tfm
);
593 static void test_deflate(void)
596 char result
[COMP_BUF_SIZE
];
597 struct crypto_tfm
*tfm
;
598 struct comp_testvec
*tv
;
601 printk("\ntesting deflate compression\n");
603 tsize
= sizeof (deflate_comp_tv_template
);
604 if (tsize
> TVMEMSIZE
) {
605 printk("template (%u) too big for tvmem (%u)\n", tsize
,
610 memcpy(tvmem
, deflate_comp_tv_template
, tsize
);
613 tfm
= crypto_alloc_tfm("deflate", 0);
615 printk("failed to load transform for deflate\n");
619 for (i
= 0; i
< DEFLATE_COMP_TEST_VECTORS
; i
++) {
620 int ilen
, ret
, dlen
= COMP_BUF_SIZE
;
622 printk("test %u:\n", i
+ 1);
623 memset(result
, 0, sizeof (result
));
626 ret
= crypto_comp_compress(tfm
, tv
[i
].input
,
627 ilen
, result
, &dlen
);
629 printk("fail: ret=%d\n", ret
);
632 hexdump(result
, dlen
);
633 printk("%s (ratio %d:%d)\n",
634 memcmp(result
, tv
[i
].output
, dlen
) ? "fail" : "pass",
638 printk("\ntesting deflate decompression\n");
640 tsize
= sizeof (deflate_decomp_tv_template
);
641 if (tsize
> TVMEMSIZE
) {
642 printk("template (%u) too big for tvmem (%u)\n", tsize
,
647 memcpy(tvmem
, deflate_decomp_tv_template
, tsize
);
650 for (i
= 0; i
< DEFLATE_DECOMP_TEST_VECTORS
; i
++) {
651 int ilen
, ret
, dlen
= COMP_BUF_SIZE
;
653 printk("test %u:\n", i
+ 1);
654 memset(result
, 0, sizeof (result
));
657 ret
= crypto_comp_decompress(tfm
, tv
[i
].input
,
658 ilen
, result
, &dlen
);
660 printk("fail: ret=%d\n", ret
);
663 hexdump(result
, dlen
);
664 printk("%s (ratio %d:%d)\n",
665 memcmp(result
, tv
[i
].output
, dlen
) ? "fail" : "pass",
669 crypto_free_tfm(tfm
);
672 static void test_crc32c(void)
679 u8 b
, test_vec
[NUMVEC
][VECSIZE
];
680 static u32 vec_results
[NUMVEC
] = {
681 0x0e2c157f, 0xe980ebf6, 0xde74bded,
682 0xd579c862, 0xba979ad0, 0x2b29d913
684 static u32 tot_vec_results
= 0x24c5d375;
686 struct scatterlist sg
[NUMVEC
];
687 struct crypto_tfm
*tfm
;
688 char *fmtdata
= "testing crc32c initialized to %08x: %s\n";
689 #define SEEDTESTVAL 0xedcba987
692 printk("\ntesting crc32c\n");
694 tfm
= crypto_alloc_tfm("crc32c", 0);
696 printk("failed to load transform for crc32c\n");
700 crypto_digest_init(tfm
);
701 crypto_digest_final(tfm
, (u8
*)&crc
);
702 printk(fmtdata
, crc
, (crc
== 0) ? "pass" : "ERROR");
705 * stuff test_vec with known values, simple incrementing
709 for (i
= 0; i
< NUMVEC
; i
++) {
710 for (j
= 0; j
< VECSIZE
; j
++)
711 test_vec
[i
][j
] = ++b
;
712 sg
[i
].page
= virt_to_page(test_vec
[i
]);
713 sg
[i
].offset
= offset_in_page(test_vec
[i
]);
714 sg
[i
].length
= VECSIZE
;
718 (void)crypto_digest_setkey(tfm
, (const u8
*)&seed
, sizeof(u32
));
719 crypto_digest_final(tfm
, (u8
*)&crc
);
720 printk("testing crc32c setkey returns %08x : %s\n", crc
, (crc
== (SEEDTESTVAL
^ ~(u32
)0)) ?
723 printk("testing crc32c using update/final:\n");
725 pass
= 1; /* assume all is well */
727 for (i
= 0; i
< NUMVEC
; i
++) {
729 (void)crypto_digest_setkey(tfm
, (const u8
*)&seed
, sizeof(u32
));
730 crypto_digest_update(tfm
, &sg
[i
], 1);
731 crypto_digest_final(tfm
, (u8
*)&crc
);
732 if (crc
== vec_results
[i
]) {
733 printk(" %08x:OK", crc
);
735 printk(" %08x:BAD, wanted %08x\n", crc
, vec_results
[i
]);
740 printk("\ntesting crc32c using incremental accumulator:\n");
742 for (i
= 0; i
< NUMVEC
; i
++) {
743 seed
= (crc
^ ~(u32
)0);
744 (void)crypto_digest_setkey(tfm
, (const u8
*)&seed
, sizeof(u32
));
745 crypto_digest_update(tfm
, &sg
[i
], 1);
746 crypto_digest_final(tfm
, (u8
*)&crc
);
748 if (crc
== tot_vec_results
) {
749 printk(" %08x:OK", crc
);
751 printk(" %08x:BAD, wanted %08x\n", crc
, tot_vec_results
);
755 printk("\ntesting crc32c using digest:\n");
757 (void)crypto_digest_setkey(tfm
, (const u8
*)&seed
, sizeof(u32
));
758 crypto_digest_digest(tfm
, sg
, NUMVEC
, (u8
*)&crc
);
759 if (crc
== tot_vec_results
) {
760 printk(" %08x:OK", crc
);
762 printk(" %08x:BAD, wanted %08x\n", crc
, tot_vec_results
);
766 printk("\n%s\n", pass
? "pass" : "ERROR");
768 crypto_free_tfm(tfm
);
769 printk("crc32c test complete\n");
772 static void test_available(void)
777 printk("alg %s ", *name
);
778 printk((crypto_alg_available(*name
, 0)) ?
779 "found\n" : "not found\n");
784 static void do_test(void)
789 test_hash("md5", md5_tv_template
, MD5_TEST_VECTORS
);
791 test_hash("sha1", sha1_tv_template
, SHA1_TEST_VECTORS
);
794 test_cipher ("des", MODE_ECB
, ENCRYPT
, des_enc_tv_template
, DES_ENC_TEST_VECTORS
);
795 test_cipher ("des", MODE_ECB
, DECRYPT
, des_dec_tv_template
, DES_DEC_TEST_VECTORS
);
796 test_cipher ("des", MODE_CBC
, ENCRYPT
, des_cbc_enc_tv_template
, DES_CBC_ENC_TEST_VECTORS
);
797 test_cipher ("des", MODE_CBC
, DECRYPT
, des_cbc_dec_tv_template
, DES_CBC_DEC_TEST_VECTORS
);
800 test_cipher ("des3_ede", MODE_ECB
, ENCRYPT
, des3_ede_enc_tv_template
, DES3_EDE_ENC_TEST_VECTORS
);
801 test_cipher ("des3_ede", MODE_ECB
, DECRYPT
, des3_ede_dec_tv_template
, DES3_EDE_DEC_TEST_VECTORS
);
803 test_hash("md4", md4_tv_template
, MD4_TEST_VECTORS
);
805 test_hash("sha256", sha256_tv_template
, SHA256_TEST_VECTORS
);
808 test_cipher ("blowfish", MODE_ECB
, ENCRYPT
, bf_enc_tv_template
, BF_ENC_TEST_VECTORS
);
809 test_cipher ("blowfish", MODE_ECB
, DECRYPT
, bf_dec_tv_template
, BF_DEC_TEST_VECTORS
);
810 test_cipher ("blowfish", MODE_CBC
, ENCRYPT
, bf_cbc_enc_tv_template
, BF_CBC_ENC_TEST_VECTORS
);
811 test_cipher ("blowfish", MODE_CBC
, DECRYPT
, bf_cbc_dec_tv_template
, BF_CBC_DEC_TEST_VECTORS
);
814 test_cipher ("twofish", MODE_ECB
, ENCRYPT
, tf_enc_tv_template
, TF_ENC_TEST_VECTORS
);
815 test_cipher ("twofish", MODE_ECB
, DECRYPT
, tf_dec_tv_template
, TF_DEC_TEST_VECTORS
);
816 test_cipher ("twofish", MODE_CBC
, ENCRYPT
, tf_cbc_enc_tv_template
, TF_CBC_ENC_TEST_VECTORS
);
817 test_cipher ("twofish", MODE_CBC
, DECRYPT
, tf_cbc_dec_tv_template
, TF_CBC_DEC_TEST_VECTORS
);
820 test_cipher ("serpent", MODE_ECB
, ENCRYPT
, serpent_enc_tv_template
, SERPENT_ENC_TEST_VECTORS
);
821 test_cipher ("serpent", MODE_ECB
, DECRYPT
, serpent_dec_tv_template
, SERPENT_DEC_TEST_VECTORS
);
824 test_cipher ("tnepres", MODE_ECB
, ENCRYPT
, tnepres_enc_tv_template
, TNEPRES_ENC_TEST_VECTORS
);
825 test_cipher ("tnepres", MODE_ECB
, DECRYPT
, tnepres_dec_tv_template
, TNEPRES_DEC_TEST_VECTORS
);
828 test_cipher ("aes", MODE_ECB
, ENCRYPT
, aes_enc_tv_template
, AES_ENC_TEST_VECTORS
);
829 test_cipher ("aes", MODE_ECB
, DECRYPT
, aes_dec_tv_template
, AES_DEC_TEST_VECTORS
);
832 test_cipher ("cast5", MODE_ECB
, ENCRYPT
, cast5_enc_tv_template
, CAST5_ENC_TEST_VECTORS
);
833 test_cipher ("cast5", MODE_ECB
, DECRYPT
, cast5_dec_tv_template
, CAST5_DEC_TEST_VECTORS
);
836 test_cipher ("cast6", MODE_ECB
, ENCRYPT
, cast6_enc_tv_template
, CAST6_ENC_TEST_VECTORS
);
837 test_cipher ("cast6", MODE_ECB
, DECRYPT
, cast6_dec_tv_template
, CAST6_DEC_TEST_VECTORS
);
840 test_cipher ("arc4", MODE_ECB
, ENCRYPT
, arc4_enc_tv_template
, ARC4_ENC_TEST_VECTORS
);
841 test_cipher ("arc4", MODE_ECB
, DECRYPT
, arc4_dec_tv_template
, ARC4_DEC_TEST_VECTORS
);
844 test_cipher ("tea", MODE_ECB
, ENCRYPT
, tea_enc_tv_template
, TEA_ENC_TEST_VECTORS
);
845 test_cipher ("tea", MODE_ECB
, DECRYPT
, tea_dec_tv_template
, TEA_DEC_TEST_VECTORS
);
849 test_cipher ("xtea", MODE_ECB
, ENCRYPT
, xtea_enc_tv_template
, XTEA_ENC_TEST_VECTORS
);
850 test_cipher ("xtea", MODE_ECB
, DECRYPT
, xtea_dec_tv_template
, XTEA_DEC_TEST_VECTORS
);
853 test_cipher ("khazad", MODE_ECB
, ENCRYPT
, khazad_enc_tv_template
, KHAZAD_ENC_TEST_VECTORS
);
854 test_cipher ("khazad", MODE_ECB
, DECRYPT
, khazad_dec_tv_template
, KHAZAD_DEC_TEST_VECTORS
);
857 test_cipher ("anubis", MODE_ECB
, ENCRYPT
, anubis_enc_tv_template
, ANUBIS_ENC_TEST_VECTORS
);
858 test_cipher ("anubis", MODE_ECB
, DECRYPT
, anubis_dec_tv_template
, ANUBIS_DEC_TEST_VECTORS
);
859 test_cipher ("anubis", MODE_CBC
, ENCRYPT
, anubis_cbc_enc_tv_template
, ANUBIS_CBC_ENC_TEST_VECTORS
);
860 test_cipher ("anubis", MODE_CBC
, DECRYPT
, anubis_cbc_dec_tv_template
, ANUBIS_CBC_ENC_TEST_VECTORS
);
862 test_hash("sha384", sha384_tv_template
, SHA384_TEST_VECTORS
);
863 test_hash("sha512", sha512_tv_template
, SHA512_TEST_VECTORS
);
864 test_hash("wp512", wp512_tv_template
, WP512_TEST_VECTORS
);
865 test_hash("wp384", wp384_tv_template
, WP384_TEST_VECTORS
);
866 test_hash("wp256", wp256_tv_template
, WP256_TEST_VECTORS
);
867 test_hash("tgr192", tgr192_tv_template
, TGR192_TEST_VECTORS
);
868 test_hash("tgr160", tgr160_tv_template
, TGR160_TEST_VECTORS
);
869 test_hash("tgr128", tgr128_tv_template
, TGR128_TEST_VECTORS
);
872 #ifdef CONFIG_CRYPTO_HMAC
873 test_hmac("md5", hmac_md5_tv_template
, HMAC_MD5_TEST_VECTORS
);
874 test_hmac("sha1", hmac_sha1_tv_template
, HMAC_SHA1_TEST_VECTORS
);
875 test_hmac("sha256", hmac_sha256_tv_template
, HMAC_SHA256_TEST_VECTORS
);
878 test_hash("michael_mic", michael_mic_tv_template
, MICHAEL_MIC_TEST_VECTORS
);
882 test_hash("md5", md5_tv_template
, MD5_TEST_VECTORS
);
886 test_hash("sha1", sha1_tv_template
, SHA1_TEST_VECTORS
);
890 test_cipher ("des", MODE_ECB
, ENCRYPT
, des_enc_tv_template
, DES_ENC_TEST_VECTORS
);
891 test_cipher ("des", MODE_ECB
, DECRYPT
, des_dec_tv_template
, DES_DEC_TEST_VECTORS
);
892 test_cipher ("des", MODE_CBC
, ENCRYPT
, des_cbc_enc_tv_template
, DES_CBC_ENC_TEST_VECTORS
);
893 test_cipher ("des", MODE_CBC
, DECRYPT
, des_cbc_dec_tv_template
, DES_CBC_DEC_TEST_VECTORS
);
897 test_cipher ("des3_ede", MODE_ECB
, ENCRYPT
, des3_ede_enc_tv_template
, DES3_EDE_ENC_TEST_VECTORS
);
898 test_cipher ("des3_ede", MODE_ECB
, DECRYPT
, des3_ede_dec_tv_template
, DES3_EDE_DEC_TEST_VECTORS
);
902 test_hash("md4", md4_tv_template
, MD4_TEST_VECTORS
);
906 test_hash("sha256", sha256_tv_template
, SHA256_TEST_VECTORS
);
910 test_cipher ("blowfish", MODE_ECB
, ENCRYPT
, bf_enc_tv_template
, BF_ENC_TEST_VECTORS
);
911 test_cipher ("blowfish", MODE_ECB
, DECRYPT
, bf_dec_tv_template
, BF_DEC_TEST_VECTORS
);
912 test_cipher ("blowfish", MODE_CBC
, ENCRYPT
, bf_cbc_enc_tv_template
, BF_CBC_ENC_TEST_VECTORS
);
913 test_cipher ("blowfish", MODE_CBC
, DECRYPT
, bf_cbc_dec_tv_template
, BF_CBC_DEC_TEST_VECTORS
);
917 test_cipher ("twofish", MODE_ECB
, ENCRYPT
, tf_enc_tv_template
, TF_ENC_TEST_VECTORS
);
918 test_cipher ("twofish", MODE_ECB
, DECRYPT
, tf_dec_tv_template
, TF_DEC_TEST_VECTORS
);
919 test_cipher ("twofish", MODE_CBC
, ENCRYPT
, tf_cbc_enc_tv_template
, TF_CBC_ENC_TEST_VECTORS
);
920 test_cipher ("twofish", MODE_CBC
, DECRYPT
, tf_cbc_dec_tv_template
, TF_CBC_DEC_TEST_VECTORS
);
924 test_cipher ("serpent", MODE_ECB
, ENCRYPT
, serpent_enc_tv_template
, SERPENT_ENC_TEST_VECTORS
);
925 test_cipher ("serpent", MODE_ECB
, DECRYPT
, serpent_dec_tv_template
, SERPENT_DEC_TEST_VECTORS
);
929 test_cipher ("aes", MODE_ECB
, ENCRYPT
, aes_enc_tv_template
, AES_ENC_TEST_VECTORS
);
930 test_cipher ("aes", MODE_ECB
, DECRYPT
, aes_dec_tv_template
, AES_DEC_TEST_VECTORS
);
934 test_hash("sha384", sha384_tv_template
, SHA384_TEST_VECTORS
);
938 test_hash("sha512", sha512_tv_template
, SHA512_TEST_VECTORS
);
946 test_cipher ("cast5", MODE_ECB
, ENCRYPT
, cast5_enc_tv_template
, CAST5_ENC_TEST_VECTORS
);
947 test_cipher ("cast5", MODE_ECB
, DECRYPT
, cast5_dec_tv_template
, CAST5_DEC_TEST_VECTORS
);
951 test_cipher ("cast6", MODE_ECB
, ENCRYPT
, cast6_enc_tv_template
, CAST6_ENC_TEST_VECTORS
);
952 test_cipher ("cast6", MODE_ECB
, DECRYPT
, cast6_dec_tv_template
, CAST6_DEC_TEST_VECTORS
);
956 test_cipher ("arc4", MODE_ECB
, ENCRYPT
, arc4_enc_tv_template
, ARC4_ENC_TEST_VECTORS
);
957 test_cipher ("arc4", MODE_ECB
, DECRYPT
, arc4_dec_tv_template
, ARC4_DEC_TEST_VECTORS
);
961 test_hash("michael_mic", michael_mic_tv_template
, MICHAEL_MIC_TEST_VECTORS
);
969 test_cipher ("tea", MODE_ECB
, ENCRYPT
, tea_enc_tv_template
, TEA_ENC_TEST_VECTORS
);
970 test_cipher ("tea", MODE_ECB
, DECRYPT
, tea_dec_tv_template
, TEA_DEC_TEST_VECTORS
);
974 test_cipher ("xtea", MODE_ECB
, ENCRYPT
, xtea_enc_tv_template
, XTEA_ENC_TEST_VECTORS
);
975 test_cipher ("xtea", MODE_ECB
, DECRYPT
, xtea_dec_tv_template
, XTEA_DEC_TEST_VECTORS
);
979 test_cipher ("khazad", MODE_ECB
, ENCRYPT
, khazad_enc_tv_template
, KHAZAD_ENC_TEST_VECTORS
);
980 test_cipher ("khazad", MODE_ECB
, DECRYPT
, khazad_dec_tv_template
, KHAZAD_DEC_TEST_VECTORS
);
984 test_hash("wp512", wp512_tv_template
, WP512_TEST_VECTORS
);
988 test_hash("wp384", wp384_tv_template
, WP384_TEST_VECTORS
);
992 test_hash("wp256", wp256_tv_template
, WP256_TEST_VECTORS
);
996 test_cipher ("tnepres", MODE_ECB
, ENCRYPT
, tnepres_enc_tv_template
, TNEPRES_ENC_TEST_VECTORS
);
997 test_cipher ("tnepres", MODE_ECB
, DECRYPT
, tnepres_dec_tv_template
, TNEPRES_DEC_TEST_VECTORS
);
1001 test_cipher ("anubis", MODE_ECB
, ENCRYPT
, anubis_enc_tv_template
, ANUBIS_ENC_TEST_VECTORS
);
1002 test_cipher ("anubis", MODE_ECB
, DECRYPT
, anubis_dec_tv_template
, ANUBIS_DEC_TEST_VECTORS
);
1003 test_cipher ("anubis", MODE_CBC
, ENCRYPT
, anubis_cbc_enc_tv_template
, ANUBIS_CBC_ENC_TEST_VECTORS
);
1004 test_cipher ("anubis", MODE_CBC
, DECRYPT
, anubis_cbc_dec_tv_template
, ANUBIS_CBC_ENC_TEST_VECTORS
);
1008 test_hash("tgr192", tgr192_tv_template
, TGR192_TEST_VECTORS
);
1013 test_hash("tgr160", tgr160_tv_template
, TGR160_TEST_VECTORS
);
1017 test_hash("tgr128", tgr128_tv_template
, TGR128_TEST_VECTORS
);
1020 #ifdef CONFIG_CRYPTO_HMAC
1022 test_hmac("md5", hmac_md5_tv_template
, HMAC_MD5_TEST_VECTORS
);
1026 test_hmac("sha1", hmac_sha1_tv_template
, HMAC_SHA1_TEST_VECTORS
);
1030 test_hmac("sha256", hmac_sha256_tv_template
, HMAC_SHA256_TEST_VECTORS
);
1036 test_cipher_speed("aes", MODE_ECB
, ENCRYPT
, sec
, NULL
, 0,
1037 aes_speed_template
);
1038 test_cipher_speed("aes", MODE_ECB
, DECRYPT
, sec
, NULL
, 0,
1039 aes_speed_template
);
1040 test_cipher_speed("aes", MODE_CBC
, ENCRYPT
, sec
, NULL
, 0,
1041 aes_speed_template
);
1042 test_cipher_speed("aes", MODE_CBC
, DECRYPT
, sec
, NULL
, 0,
1043 aes_speed_template
);
1047 test_cipher_speed("des3_ede", MODE_ECB
, ENCRYPT
, sec
,
1048 des3_ede_enc_tv_template
,
1049 DES3_EDE_ENC_TEST_VECTORS
,
1050 des3_ede_speed_template
);
1051 test_cipher_speed("des3_ede", MODE_ECB
, DECRYPT
, sec
,
1052 des3_ede_dec_tv_template
,
1053 DES3_EDE_DEC_TEST_VECTORS
,
1054 des3_ede_speed_template
);
1055 test_cipher_speed("des3_ede", MODE_CBC
, ENCRYPT
, sec
,
1056 des3_ede_enc_tv_template
,
1057 DES3_EDE_ENC_TEST_VECTORS
,
1058 des3_ede_speed_template
);
1059 test_cipher_speed("des3_ede", MODE_CBC
, DECRYPT
, sec
,
1060 des3_ede_dec_tv_template
,
1061 DES3_EDE_DEC_TEST_VECTORS
,
1062 des3_ede_speed_template
);
1066 test_cipher_speed("twofish", MODE_ECB
, ENCRYPT
, sec
, NULL
, 0,
1067 twofish_speed_template
);
1068 test_cipher_speed("twofish", MODE_ECB
, DECRYPT
, sec
, NULL
, 0,
1069 twofish_speed_template
);
1070 test_cipher_speed("twofish", MODE_CBC
, ENCRYPT
, sec
, NULL
, 0,
1071 twofish_speed_template
);
1072 test_cipher_speed("twofish", MODE_CBC
, DECRYPT
, sec
, NULL
, 0,
1073 twofish_speed_template
);
1077 test_cipher_speed("blowfish", MODE_ECB
, ENCRYPT
, sec
, NULL
, 0,
1078 blowfish_speed_template
);
1079 test_cipher_speed("blowfish", MODE_ECB
, DECRYPT
, sec
, NULL
, 0,
1080 blowfish_speed_template
);
1081 test_cipher_speed("blowfish", MODE_CBC
, ENCRYPT
, sec
, NULL
, 0,
1082 blowfish_speed_template
);
1083 test_cipher_speed("blowfish", MODE_CBC
, DECRYPT
, sec
, NULL
, 0,
1084 blowfish_speed_template
);
1088 test_cipher_speed("des", MODE_ECB
, ENCRYPT
, sec
, NULL
, 0,
1089 des_speed_template
);
1090 test_cipher_speed("des", MODE_ECB
, DECRYPT
, sec
, NULL
, 0,
1091 des_speed_template
);
1092 test_cipher_speed("des", MODE_CBC
, ENCRYPT
, sec
, NULL
, 0,
1093 des_speed_template
);
1094 test_cipher_speed("des", MODE_CBC
, DECRYPT
, sec
, NULL
, 0,
1095 des_speed_template
);
1103 /* useful for debugging */
1104 printk("not testing anything\n");
1109 static int __init
init(void)
1111 tvmem
= kmalloc(TVMEMSIZE
, GFP_KERNEL
);
1115 xbuf
= kmalloc(XBUFSIZE
, GFP_KERNEL
);
1129 * If an init function is provided, an exit function must also be provided
1130 * to allow module unload.
1132 static void __exit
fini(void) { }
1137 module_param(mode
, int, 0);
1138 module_param(sec
, uint
, 0);
1139 MODULE_PARM_DESC(sec
, "Length in seconds of speed tests "
1140 "(defaults to zero which uses CPU cycles instead)");
1142 MODULE_LICENSE("GPL");
1143 MODULE_DESCRIPTION("Quick & dirty crypto testing module");
1144 MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");