]> git.karo-electronics.de Git - mv-sheeva.git/blob - crypto/tcrypt.c
[PATCH] introduce and use kzalloc
[mv-sheeva.git] / crypto / tcrypt.c
1 /*
2  * Quick & dirty crypto testing module.
3  *
4  * This will only exist until we have a better testing mechanism
5  * (e.g. a char device).
6  *
7  * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
8  * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
9  *
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)
13  * any later version.
14  *
15  * 2004-08-09 Added cipher speed tests (Reyk Floeter <reyk@vantronix.net>)
16  * 2003-09-14 Rewritten by Kartikey Mahendra Bhatt
17  *
18  */
19
20 #include <linux/init.h>
21 #include <linux/module.h>
22 #include <linux/mm.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>
32 #include "tcrypt.h"
33
34 /*
35  * Need to kmalloc() memory for testing kmap().
36  */
37 #define TVMEMSIZE       16384
38 #define XBUFSIZE        32768
39
40 /*
41  * Indexes into the xbuf to simulate cross-page access.
42  */
43 #define IDX1            37
44 #define IDX2            32400
45 #define IDX3            1
46 #define IDX4            8193
47 #define IDX5            22222
48 #define IDX6            17101
49 #define IDX7            27333
50 #define IDX8            3000
51
52 /*
53 * Used by test_cipher()
54 */
55 #define ENCRYPT 1
56 #define DECRYPT 0
57 #define MODE_ECB 1
58 #define MODE_CBC 0
59
60 static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
61
62 /*
63  * Used by test_cipher_speed()
64  */
65 static unsigned int sec;
66
67 static int mode;
68 static char *xbuf;
69 static char *tvmem;
70
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", "xeta", NULL
76 };
77
78 static void hexdump(unsigned char *buf, unsigned int len)
79 {
80         while (len--)
81                 printk("%02x", *buf++);
82
83         printk("\n");
84 }
85
86 static void test_hash(char *algo, struct hash_testvec *template,
87                       unsigned int tcount)
88 {
89         char *p;
90         unsigned int i, j, k, temp;
91         struct scatterlist sg[8];
92         char result[64];
93         struct crypto_tfm *tfm;
94         struct hash_testvec *hash_tv;
95         unsigned int tsize;
96
97         printk("\ntesting %s\n", algo);
98
99         tsize = sizeof(struct hash_testvec);
100         tsize *= tcount;
101
102         if (tsize > TVMEMSIZE) {
103                 printk("template (%u) too big for tvmem (%u)\n", tsize, TVMEMSIZE);
104                 return;
105         }
106
107         memcpy(tvmem, template, tsize);
108         hash_tv = (void *)tvmem;
109         tfm = crypto_alloc_tfm(algo, 0);
110         if (tfm == NULL) {
111                 printk("failed to load transform for %s\n", algo);
112                 return;
113         }
114
115         for (i = 0; i < tcount; i++) {
116                 printk("test %u:\n", i + 1);
117                 memset(result, 0, 64);
118
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;
123
124                 crypto_digest_init(tfm);
125                 if (tfm->crt_u.digest.dit_setkey) {
126                         crypto_digest_setkey(tfm, hash_tv[i].key,
127                                              hash_tv[i].ksize);
128                 }
129                 crypto_digest_update(tfm, sg, 1);
130                 crypto_digest_final(tfm, result);
131
132                 hexdump(result, crypto_tfm_alg_digestsize(tfm));
133                 printk("%s\n",
134                        memcmp(result, hash_tv[i].digest,
135                               crypto_tfm_alg_digestsize(tfm)) ?
136                        "fail" : "pass");
137         }
138
139         printk("testing %s across pages\n", algo);
140
141         /* setup the dummy buffer first */
142         memset(xbuf, 0, XBUFSIZE);
143
144         j = 0;
145         for (i = 0; i < tcount; i++) {
146                 if (hash_tv[i].np) {
147                         j++;
148                         printk("test %u:\n", j);
149                         memset(result, 0, 64);
150
151                         temp = 0;
152                         for (k = 0; k < hash_tv[i].np; k++) {
153                                 memcpy(&xbuf[IDX[k]],
154                                        hash_tv[i].plaintext + temp,
155                                        hash_tv[i].tap[k]);
156                                 temp += hash_tv[i].tap[k];
157                                 p = &xbuf[IDX[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];
161                         }
162
163                         crypto_digest_digest(tfm, sg, hash_tv[i].np, result);
164
165                         hexdump(result, crypto_tfm_alg_digestsize(tfm));
166                         printk("%s\n",
167                                memcmp(result, hash_tv[i].digest,
168                                       crypto_tfm_alg_digestsize(tfm)) ?
169                                "fail" : "pass");
170                 }
171         }
172
173         crypto_free_tfm(tfm);
174 }
175
176
177 #ifdef CONFIG_CRYPTO_HMAC
178
179 static void test_hmac(char *algo, struct hmac_testvec *template,
180                       unsigned int tcount)
181 {
182         char *p;
183         unsigned int i, j, k, temp;
184         struct scatterlist sg[8];
185         char result[64];
186         struct crypto_tfm *tfm;
187         struct hmac_testvec *hmac_tv;
188         unsigned int tsize, klen;
189
190         tfm = crypto_alloc_tfm(algo, 0);
191         if (tfm == NULL) {
192                 printk("failed to load transform for %s\n", algo);
193                 return;
194         }
195
196         printk("\ntesting hmac_%s\n", algo);
197
198         tsize = sizeof(struct hmac_testvec);
199         tsize *= tcount;
200         if (tsize > TVMEMSIZE) {
201                 printk("template (%u) too big for tvmem (%u)\n", tsize,
202                        TVMEMSIZE);
203                 goto out;
204         }
205
206         memcpy(tvmem, template, tsize);
207         hmac_tv = (void *)tvmem;
208
209         for (i = 0; i < tcount; i++) {
210                 printk("test %u:\n", i + 1);
211                 memset(result, 0, sizeof (result));
212
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;
218
219                 crypto_hmac(tfm, hmac_tv[i].key, &klen, sg, 1, result);
220
221                 hexdump(result, crypto_tfm_alg_digestsize(tfm));
222                 printk("%s\n",
223                        memcmp(result, hmac_tv[i].digest,
224                               crypto_tfm_alg_digestsize(tfm)) ? "fail" :
225                        "pass");
226         }
227
228         printk("\ntesting hmac_%s across pages\n", algo);
229
230         memset(xbuf, 0, XBUFSIZE);
231
232         j = 0;
233         for (i = 0; i < tcount; i++) {
234                 if (hmac_tv[i].np) {
235                         j++;
236                         printk("test %u:\n",j);
237                         memset(result, 0, 64);
238
239                         temp = 0;
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,
244                                        hmac_tv[i].tap[k]);
245                                 temp += hmac_tv[i].tap[k];
246                                 p = &xbuf[IDX[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];
250                         }
251
252                         crypto_hmac(tfm, hmac_tv[i].key, &klen, sg,
253                                     hmac_tv[i].np, result);
254                         hexdump(result, crypto_tfm_alg_digestsize(tfm));
255
256                         printk("%s\n",
257                                memcmp(result, hmac_tv[i].digest,
258                                       crypto_tfm_alg_digestsize(tfm)) ?
259                                "fail" : "pass");
260                 }
261         }
262 out:
263         crypto_free_tfm(tfm);
264 }
265
266 #endif  /* CONFIG_CRYPTO_HMAC */
267
268 static void test_cipher(char *algo, int mode, int enc,
269                         struct cipher_testvec *template, unsigned int tcount)
270 {
271         unsigned int ret, i, j, k, temp;
272         unsigned int tsize;
273         char *p, *q;
274         struct crypto_tfm *tfm;
275         char *key;
276         struct cipher_testvec *cipher_tv;
277         struct scatterlist sg[8];
278         const char *e, *m;
279
280         if (enc == ENCRYPT)
281                 e = "encryption";
282         else
283                 e = "decryption";
284         if (mode == MODE_ECB)
285                 m = "ECB";
286         else
287                 m = "CBC";
288
289         printk("\ntesting %s %s %s\n", algo, m, e);
290
291         tsize = sizeof (struct cipher_testvec);
292         tsize *= tcount;
293
294         if (tsize > TVMEMSIZE) {
295                 printk("template (%u) too big for tvmem (%u)\n", tsize,
296                        TVMEMSIZE);
297                 return;
298         }
299
300         memcpy(tvmem, template, tsize);
301         cipher_tv = (void *)tvmem;
302
303         if (mode)
304                 tfm = crypto_alloc_tfm(algo, 0);
305         else
306                 tfm = crypto_alloc_tfm(algo, CRYPTO_TFM_MODE_CBC);
307
308         if (tfm == NULL) {
309                 printk("failed to load transform for %s %s\n", algo, m);
310                 return;
311         }
312
313         j = 0;
314         for (i = 0; i < tcount; i++) {
315                 if (!(cipher_tv[i].np)) {
316                         j++;
317                         printk("test %u (%d bit key):\n",
318                         j, cipher_tv[i].klen * 8);
319
320                         tfm->crt_flags = 0;
321                         if (cipher_tv[i].wk)
322                                 tfm->crt_flags |= CRYPTO_TFM_REQ_WEAK_KEY;
323                         key = cipher_tv[i].key;
324
325                         ret = crypto_cipher_setkey(tfm, key, cipher_tv[i].klen);
326                         if (ret) {
327                                 printk("setkey() failed flags=%x\n", tfm->crt_flags);
328
329                                 if (!cipher_tv[i].fail)
330                                         goto out;
331                         }
332
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;
337
338                         if (!mode) {
339                                 crypto_cipher_set_iv(tfm, cipher_tv[i].iv,
340                                         crypto_tfm_alg_ivsize(tfm));
341                         }
342
343                         if (enc)
344                                 ret = crypto_cipher_encrypt(tfm, sg, sg, cipher_tv[i].ilen);
345                         else
346                                 ret = crypto_cipher_decrypt(tfm, sg, sg, cipher_tv[i].ilen);
347
348
349                         if (ret) {
350                                 printk("%s () failed flags=%x\n", e, tfm->crt_flags);
351                                 goto out;
352                         }
353
354                         q = kmap(sg[0].page) + sg[0].offset;
355                         hexdump(q, cipher_tv[i].rlen);
356
357                         printk("%s\n",
358                                memcmp(q, cipher_tv[i].result,
359                                       cipher_tv[i].rlen) ? "fail" : "pass");
360                 }
361         }
362
363         printk("\ntesting %s %s %s across pages (chunking)\n", algo, m, e);
364         memset(xbuf, 0, XBUFSIZE);
365
366         j = 0;
367         for (i = 0; i < tcount; i++) {
368                 if (cipher_tv[i].np) {
369                         j++;
370                         printk("test %u (%d bit key):\n",
371                         j, cipher_tv[i].klen * 8);
372
373                         tfm->crt_flags = 0;
374                         if (cipher_tv[i].wk)
375                                 tfm->crt_flags |= CRYPTO_TFM_REQ_WEAK_KEY;
376                         key = cipher_tv[i].key;
377
378                         ret = crypto_cipher_setkey(tfm, key, cipher_tv[i].klen);
379                         if (ret) {
380                                 printk("setkey() failed flags=%x\n", tfm->crt_flags);
381
382                                 if (!cipher_tv[i].fail)
383                                         goto out;
384                         }
385
386                         temp = 0;
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];
392                                 p = &xbuf[IDX[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];
396                         }
397
398                         if (!mode) {
399                                 crypto_cipher_set_iv(tfm, cipher_tv[i].iv,
400                                                 crypto_tfm_alg_ivsize(tfm));
401                         }
402
403                         if (enc)
404                                 ret = crypto_cipher_encrypt(tfm, sg, sg, cipher_tv[i].ilen);
405                         else
406                                 ret = crypto_cipher_decrypt(tfm, sg, sg, cipher_tv[i].ilen);
407
408                         if (ret) {
409                                 printk("%s () failed flags=%x\n", e, tfm->crt_flags);
410                                 goto out;
411                         }
412
413                         temp = 0;
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]);
418                                 printk("%s\n",
419                                         memcmp(q, cipher_tv[i].result + temp,
420                                                 cipher_tv[i].tap[k]) ? "fail" :
421                                         "pass");
422                                 temp += cipher_tv[i].tap[k];
423                         }
424                 }
425         }
426
427 out:
428         crypto_free_tfm(tfm);
429 }
430
431 static int test_cipher_jiffies(struct crypto_tfm *tfm, int enc, char *p,
432                                int blen, int sec)
433 {
434         struct scatterlist sg[8];
435         unsigned long start, end;
436         int bcount;
437         int ret;
438
439         sg[0].page = virt_to_page(p);
440         sg[0].offset = offset_in_page(p);
441         sg[0].length = blen;
442
443         for (start = jiffies, end = start + sec * HZ, bcount = 0;
444              time_before(jiffies, end); bcount++) {
445                 if (enc)
446                         ret = crypto_cipher_encrypt(tfm, sg, sg, blen);
447                 else
448                         ret = crypto_cipher_decrypt(tfm, sg, sg, blen);
449
450                 if (ret)
451                         return ret;
452         }
453
454         printk("%d operations in %d seconds (%ld bytes)\n",
455                bcount, sec, (long)bcount * blen);
456         return 0;
457 }
458
459 static int test_cipher_cycles(struct crypto_tfm *tfm, int enc, char *p,
460                               int blen)
461 {
462         struct scatterlist sg[8];
463         unsigned long cycles = 0;
464         int ret = 0;
465         int i;
466
467         sg[0].page = virt_to_page(p);
468         sg[0].offset = offset_in_page(p);
469         sg[0].length = blen;
470
471         local_bh_disable();
472         local_irq_disable();
473
474         /* Warm-up run. */
475         for (i = 0; i < 4; i++) {
476                 if (enc)
477                         ret = crypto_cipher_encrypt(tfm, sg, sg, blen);
478                 else
479                         ret = crypto_cipher_decrypt(tfm, sg, sg, blen);
480
481                 if (ret)
482                         goto out;
483         }
484
485         /* The real thing. */
486         for (i = 0; i < 8; i++) {
487                 cycles_t start, end;
488
489                 start = get_cycles();
490                 if (enc)
491                         ret = crypto_cipher_encrypt(tfm, sg, sg, blen);
492                 else
493                         ret = crypto_cipher_decrypt(tfm, sg, sg, blen);
494                 end = get_cycles();
495
496                 if (ret)
497                         goto out;
498
499                 cycles += end - start;
500         }
501
502 out:
503         local_irq_enable();
504         local_bh_enable();
505
506         if (ret == 0)
507                 printk("1 operation in %lu cycles (%d bytes)\n",
508                        (cycles + 4) / 8, blen);
509
510         return ret;
511 }
512
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)
516 {
517         unsigned int ret, i, j, iv_len;
518         unsigned char *key, *p, iv[128];
519         struct crypto_tfm *tfm;
520         const char *e, *m;
521
522         if (enc == ENCRYPT)
523                 e = "encryption";
524         else
525                 e = "decryption";
526         if (mode == MODE_ECB)
527                 m = "ECB";
528         else
529                 m = "CBC";
530
531         printk("\ntesting speed of %s %s %s\n", algo, m, e);
532
533         if (mode)
534                 tfm = crypto_alloc_tfm(algo, 0);
535         else
536                 tfm = crypto_alloc_tfm(algo, CRYPTO_TFM_MODE_CBC);
537
538         if (tfm == NULL) {
539                 printk("failed to load transform for %s %s\n", algo, m);
540                 return;
541         }
542
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);
547                         goto out;
548                 }
549
550                 printk("test %u (%d bit key, %d byte blocks): ", i,
551                        speed[i].klen * 8, speed[i].blen);
552
553                 memset(tvmem, 0xff, speed[i].klen + speed[i].blen);
554
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;
560                                 break;
561                         }
562                 }
563                 p = (unsigned char *)tvmem + speed[i].klen;
564
565                 ret = crypto_cipher_setkey(tfm, key, speed[i].klen);
566                 if (ret) {
567                         printk("setkey() failed flags=%x\n", tfm->crt_flags);
568                         goto out;
569                 }
570
571                 if (!mode) {
572                         iv_len = crypto_tfm_alg_ivsize(tfm);
573                         memset(&iv, 0xff, iv_len);
574                         crypto_cipher_set_iv(tfm, iv, iv_len);
575                 }
576
577                 if (sec)
578                         ret = test_cipher_jiffies(tfm, enc, p, speed[i].blen,
579                                                   sec);
580                 else
581                         ret = test_cipher_cycles(tfm, enc, p, speed[i].blen);
582
583                 if (ret) {
584                         printk("%s() failed flags=%x\n", e, tfm->crt_flags);
585                         break;
586                 }
587         }
588
589 out:
590         crypto_free_tfm(tfm);
591 }
592
593 static void test_deflate(void)
594 {
595         unsigned int i;
596         char result[COMP_BUF_SIZE];
597         struct crypto_tfm *tfm;
598         struct comp_testvec *tv;
599         unsigned int tsize;
600
601         printk("\ntesting deflate compression\n");
602
603         tsize = sizeof (deflate_comp_tv_template);
604         if (tsize > TVMEMSIZE) {
605                 printk("template (%u) too big for tvmem (%u)\n", tsize,
606                        TVMEMSIZE);
607                 return;
608         }
609
610         memcpy(tvmem, deflate_comp_tv_template, tsize);
611         tv = (void *)tvmem;
612
613         tfm = crypto_alloc_tfm("deflate", 0);
614         if (tfm == NULL) {
615                 printk("failed to load transform for deflate\n");
616                 return;
617         }
618
619         for (i = 0; i < DEFLATE_COMP_TEST_VECTORS; i++) {
620                 int ilen, ret, dlen = COMP_BUF_SIZE;
621
622                 printk("test %u:\n", i + 1);
623                 memset(result, 0, sizeof (result));
624
625                 ilen = tv[i].inlen;
626                 ret = crypto_comp_compress(tfm, tv[i].input,
627                                            ilen, result, &dlen);
628                 if (ret) {
629                         printk("fail: ret=%d\n", ret);
630                         continue;
631                 }
632                 hexdump(result, dlen);
633                 printk("%s (ratio %d:%d)\n",
634                        memcmp(result, tv[i].output, dlen) ? "fail" : "pass",
635                        ilen, dlen);
636         }
637
638         printk("\ntesting deflate decompression\n");
639
640         tsize = sizeof (deflate_decomp_tv_template);
641         if (tsize > TVMEMSIZE) {
642                 printk("template (%u) too big for tvmem (%u)\n", tsize,
643                        TVMEMSIZE);
644                 goto out;
645         }
646
647         memcpy(tvmem, deflate_decomp_tv_template, tsize);
648         tv = (void *)tvmem;
649
650         for (i = 0; i < DEFLATE_DECOMP_TEST_VECTORS; i++) {
651                 int ilen, ret, dlen = COMP_BUF_SIZE;
652
653                 printk("test %u:\n", i + 1);
654                 memset(result, 0, sizeof (result));
655
656                 ilen = tv[i].inlen;
657                 ret = crypto_comp_decompress(tfm, tv[i].input,
658                                              ilen, result, &dlen);
659                 if (ret) {
660                         printk("fail: ret=%d\n", ret);
661                         continue;
662                 }
663                 hexdump(result, dlen);
664                 printk("%s (ratio %d:%d)\n",
665                        memcmp(result, tv[i].output, dlen) ? "fail" : "pass",
666                        ilen, dlen);
667         }
668 out:
669         crypto_free_tfm(tfm);
670 }
671
672 static void test_crc32c(void)
673 {
674 #define NUMVEC 6
675 #define VECSIZE 40
676
677         int i, j, pass;
678         u32 crc;
679         u8 b, test_vec[NUMVEC][VECSIZE];
680         static u32 vec_results[NUMVEC] = {
681                 0x0e2c157f, 0xe980ebf6, 0xde74bded,
682                 0xd579c862, 0xba979ad0, 0x2b29d913
683         };
684         static u32 tot_vec_results = 0x24c5d375;
685
686         struct scatterlist sg[NUMVEC];
687         struct crypto_tfm *tfm;
688         char *fmtdata = "testing crc32c initialized to %08x: %s\n";
689 #define SEEDTESTVAL 0xedcba987
690         u32 seed;
691
692         printk("\ntesting crc32c\n");
693
694         tfm = crypto_alloc_tfm("crc32c", 0);
695         if (tfm == NULL) {
696                 printk("failed to load transform for crc32c\n");
697                 return;
698         }
699
700         crypto_digest_init(tfm);
701         crypto_digest_final(tfm, (u8*)&crc);
702         printk(fmtdata, crc, (crc == 0) ? "pass" : "ERROR");
703
704         /*
705          * stuff test_vec with known values, simple incrementing
706          * byte values.
707          */
708         b = 0;
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;
715         }
716
717         seed = SEEDTESTVAL;
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)) ?
721                "pass" : "ERROR");
722
723         printk("testing crc32c using update/final:\n");
724
725         pass = 1;                   /* assume all is well */
726
727         for (i = 0; i < NUMVEC; i++) {
728                 seed = ~(u32)0;
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);
734                 } else {
735                         printk(" %08x:BAD, wanted %08x\n", crc, vec_results[i]);
736                         pass = 0;
737                 }
738         }
739
740         printk("\ntesting crc32c using incremental accumulator:\n");
741         crc = 0;
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);
747         }
748         if (crc == tot_vec_results) {
749                 printk(" %08x:OK", crc);
750         } else {
751                 printk(" %08x:BAD, wanted %08x\n", crc, tot_vec_results);
752                 pass = 0;
753         }
754
755         printk("\ntesting crc32c using digest:\n");
756         seed = ~(u32)0;
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);
761         } else {
762                 printk(" %08x:BAD, wanted %08x\n", crc, tot_vec_results);
763                 pass = 0;
764         }
765
766         printk("\n%s\n", pass ? "pass" : "ERROR");
767
768         crypto_free_tfm(tfm);
769         printk("crc32c test complete\n");
770 }
771
772 static void test_available(void)
773 {
774         char **name = check;
775
776         while (*name) {
777                 printk("alg %s ", *name);
778                 printk((crypto_alg_available(*name, 0)) ?
779                         "found\n" : "not found\n");
780                 name++;
781         }
782 }
783
784 static void do_test(void)
785 {
786         switch (mode) {
787
788         case 0:
789                 test_hash("md5", md5_tv_template, MD5_TEST_VECTORS);
790
791                 test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
792
793                 //DES
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);
798
799                 //DES3_EDE
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);
802
803                 test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
804
805                 test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
806
807                 //BLOWFISH
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);
812
813                 //TWOFISH
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);
818
819                 //SERPENT
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);
822
823                 //TNEPRES
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);
826
827                 //AES
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);
830
831                 //CAST5
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);
834
835                 //CAST6
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);
838
839                 //ARC4
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);
842
843                 //TEA
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);
846
847
848                 //XTEA
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);
851
852                 //KHAZAD
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);
855
856                 //ANUBIS
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);
861
862                 //XETA
863                 test_cipher ("xeta", MODE_ECB, ENCRYPT, xeta_enc_tv_template, XETA_ENC_TEST_VECTORS);
864                 test_cipher ("xeta", MODE_ECB, DECRYPT, xeta_dec_tv_template, XETA_DEC_TEST_VECTORS);
865
866                 test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
867                 test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
868                 test_hash("wp512", wp512_tv_template, WP512_TEST_VECTORS);
869                 test_hash("wp384", wp384_tv_template, WP384_TEST_VECTORS);
870                 test_hash("wp256", wp256_tv_template, WP256_TEST_VECTORS);
871                 test_hash("tgr192", tgr192_tv_template, TGR192_TEST_VECTORS);
872                 test_hash("tgr160", tgr160_tv_template, TGR160_TEST_VECTORS);
873                 test_hash("tgr128", tgr128_tv_template, TGR128_TEST_VECTORS);
874                 test_deflate();
875                 test_crc32c();
876 #ifdef CONFIG_CRYPTO_HMAC
877                 test_hmac("md5", hmac_md5_tv_template, HMAC_MD5_TEST_VECTORS);
878                 test_hmac("sha1", hmac_sha1_tv_template, HMAC_SHA1_TEST_VECTORS);
879                 test_hmac("sha256", hmac_sha256_tv_template, HMAC_SHA256_TEST_VECTORS);
880 #endif
881
882                 test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS);
883                 break;
884
885         case 1:
886                 test_hash("md5", md5_tv_template, MD5_TEST_VECTORS);
887                 break;
888
889         case 2:
890                 test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
891                 break;
892
893         case 3:
894                 test_cipher ("des", MODE_ECB, ENCRYPT, des_enc_tv_template, DES_ENC_TEST_VECTORS);
895                 test_cipher ("des", MODE_ECB, DECRYPT, des_dec_tv_template, DES_DEC_TEST_VECTORS);
896                 test_cipher ("des", MODE_CBC, ENCRYPT, des_cbc_enc_tv_template, DES_CBC_ENC_TEST_VECTORS);
897                 test_cipher ("des", MODE_CBC, DECRYPT, des_cbc_dec_tv_template, DES_CBC_DEC_TEST_VECTORS);
898                 break;
899
900         case 4:
901                 test_cipher ("des3_ede", MODE_ECB, ENCRYPT, des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS);
902                 test_cipher ("des3_ede", MODE_ECB, DECRYPT, des3_ede_dec_tv_template, DES3_EDE_DEC_TEST_VECTORS);
903                 break;
904
905         case 5:
906                 test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
907                 break;
908
909         case 6:
910                 test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
911                 break;
912
913         case 7:
914                 test_cipher ("blowfish", MODE_ECB, ENCRYPT, bf_enc_tv_template, BF_ENC_TEST_VECTORS);
915                 test_cipher ("blowfish", MODE_ECB, DECRYPT, bf_dec_tv_template, BF_DEC_TEST_VECTORS);
916                 test_cipher ("blowfish", MODE_CBC, ENCRYPT, bf_cbc_enc_tv_template, BF_CBC_ENC_TEST_VECTORS);
917                 test_cipher ("blowfish", MODE_CBC, DECRYPT, bf_cbc_dec_tv_template, BF_CBC_DEC_TEST_VECTORS);
918                 break;
919
920         case 8:
921                 test_cipher ("twofish", MODE_ECB, ENCRYPT, tf_enc_tv_template, TF_ENC_TEST_VECTORS);
922                 test_cipher ("twofish", MODE_ECB, DECRYPT, tf_dec_tv_template, TF_DEC_TEST_VECTORS);
923                 test_cipher ("twofish", MODE_CBC, ENCRYPT, tf_cbc_enc_tv_template, TF_CBC_ENC_TEST_VECTORS);
924                 test_cipher ("twofish", MODE_CBC, DECRYPT, tf_cbc_dec_tv_template, TF_CBC_DEC_TEST_VECTORS);
925                 break;
926
927         case 9:
928                 test_cipher ("serpent", MODE_ECB, ENCRYPT, serpent_enc_tv_template, SERPENT_ENC_TEST_VECTORS);
929                 test_cipher ("serpent", MODE_ECB, DECRYPT, serpent_dec_tv_template, SERPENT_DEC_TEST_VECTORS);
930                 break;
931
932         case 10:
933                 test_cipher ("aes", MODE_ECB, ENCRYPT, aes_enc_tv_template, AES_ENC_TEST_VECTORS);
934                 test_cipher ("aes", MODE_ECB, DECRYPT, aes_dec_tv_template, AES_DEC_TEST_VECTORS);
935                 break;
936
937         case 11:
938                 test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
939                 break;
940
941         case 12:
942                 test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
943                 break;
944
945         case 13:
946                 test_deflate();
947                 break;
948
949         case 14:
950                 test_cipher ("cast5", MODE_ECB, ENCRYPT, cast5_enc_tv_template, CAST5_ENC_TEST_VECTORS);
951                 test_cipher ("cast5", MODE_ECB, DECRYPT, cast5_dec_tv_template, CAST5_DEC_TEST_VECTORS);
952                 break;
953
954         case 15:
955                 test_cipher ("cast6", MODE_ECB, ENCRYPT, cast6_enc_tv_template, CAST6_ENC_TEST_VECTORS);
956                 test_cipher ("cast6", MODE_ECB, DECRYPT, cast6_dec_tv_template, CAST6_DEC_TEST_VECTORS);
957                 break;
958
959         case 16:
960                 test_cipher ("arc4", MODE_ECB, ENCRYPT, arc4_enc_tv_template, ARC4_ENC_TEST_VECTORS);
961                 test_cipher ("arc4", MODE_ECB, DECRYPT, arc4_dec_tv_template, ARC4_DEC_TEST_VECTORS);
962                 break;
963
964         case 17:
965                 test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS);
966                 break;
967
968         case 18:
969                 test_crc32c();
970                 break;
971
972         case 19:
973                 test_cipher ("tea", MODE_ECB, ENCRYPT, tea_enc_tv_template, TEA_ENC_TEST_VECTORS);
974                 test_cipher ("tea", MODE_ECB, DECRYPT, tea_dec_tv_template, TEA_DEC_TEST_VECTORS);
975                 break;
976
977         case 20:
978                 test_cipher ("xtea", MODE_ECB, ENCRYPT, xtea_enc_tv_template, XTEA_ENC_TEST_VECTORS);
979                 test_cipher ("xtea", MODE_ECB, DECRYPT, xtea_dec_tv_template, XTEA_DEC_TEST_VECTORS);
980                 break;
981
982         case 21:
983                 test_cipher ("khazad", MODE_ECB, ENCRYPT, khazad_enc_tv_template, KHAZAD_ENC_TEST_VECTORS);
984                 test_cipher ("khazad", MODE_ECB, DECRYPT, khazad_dec_tv_template, KHAZAD_DEC_TEST_VECTORS);
985                 break;
986
987         case 22:
988                 test_hash("wp512", wp512_tv_template, WP512_TEST_VECTORS);
989                 break;
990
991         case 23:
992                 test_hash("wp384", wp384_tv_template, WP384_TEST_VECTORS);
993                 break;
994
995         case 24:
996                 test_hash("wp256", wp256_tv_template, WP256_TEST_VECTORS);
997                 break;
998
999         case 25:
1000                 test_cipher ("tnepres", MODE_ECB, ENCRYPT, tnepres_enc_tv_template, TNEPRES_ENC_TEST_VECTORS);
1001                 test_cipher ("tnepres", MODE_ECB, DECRYPT, tnepres_dec_tv_template, TNEPRES_DEC_TEST_VECTORS);
1002                 break;
1003
1004         case 26:
1005                 test_cipher ("anubis", MODE_ECB, ENCRYPT, anubis_enc_tv_template, ANUBIS_ENC_TEST_VECTORS);
1006                 test_cipher ("anubis", MODE_ECB, DECRYPT, anubis_dec_tv_template, ANUBIS_DEC_TEST_VECTORS);
1007                 test_cipher ("anubis", MODE_CBC, ENCRYPT, anubis_cbc_enc_tv_template, ANUBIS_CBC_ENC_TEST_VECTORS);
1008                 test_cipher ("anubis", MODE_CBC, DECRYPT, anubis_cbc_dec_tv_template, ANUBIS_CBC_ENC_TEST_VECTORS);
1009                 break;
1010
1011         case 27:
1012                 test_hash("tgr192", tgr192_tv_template, TGR192_TEST_VECTORS);
1013                 break;
1014
1015         case 28:
1016
1017                 test_hash("tgr160", tgr160_tv_template, TGR160_TEST_VECTORS);
1018                 break;
1019
1020         case 29:
1021                 test_hash("tgr128", tgr128_tv_template, TGR128_TEST_VECTORS);
1022                 break;
1023                 
1024         case 30:
1025                 test_cipher ("xeta", MODE_ECB, ENCRYPT, xeta_enc_tv_template, XETA_ENC_TEST_VECTORS);
1026                 test_cipher ("xeta", MODE_ECB, DECRYPT, xeta_dec_tv_template, XETA_DEC_TEST_VECTORS);
1027                 break;
1028
1029 #ifdef CONFIG_CRYPTO_HMAC
1030         case 100:
1031                 test_hmac("md5", hmac_md5_tv_template, HMAC_MD5_TEST_VECTORS);
1032                 break;
1033
1034         case 101:
1035                 test_hmac("sha1", hmac_sha1_tv_template, HMAC_SHA1_TEST_VECTORS);
1036                 break;
1037
1038         case 102:
1039                 test_hmac("sha256", hmac_sha256_tv_template, HMAC_SHA256_TEST_VECTORS);
1040                 break;
1041
1042 #endif
1043
1044         case 200:
1045                 test_cipher_speed("aes", MODE_ECB, ENCRYPT, sec, NULL, 0,
1046                                   aes_speed_template);
1047                 test_cipher_speed("aes", MODE_ECB, DECRYPT, sec, NULL, 0,
1048                                   aes_speed_template);
1049                 test_cipher_speed("aes", MODE_CBC, ENCRYPT, sec, NULL, 0,
1050                                   aes_speed_template);
1051                 test_cipher_speed("aes", MODE_CBC, DECRYPT, sec, NULL, 0,
1052                                   aes_speed_template);
1053                 break;
1054
1055         case 201:
1056                 test_cipher_speed("des3_ede", MODE_ECB, ENCRYPT, sec,
1057                                   des3_ede_enc_tv_template,
1058                                   DES3_EDE_ENC_TEST_VECTORS,
1059                                   des3_ede_speed_template);
1060                 test_cipher_speed("des3_ede", MODE_ECB, DECRYPT, sec,
1061                                   des3_ede_dec_tv_template,
1062                                   DES3_EDE_DEC_TEST_VECTORS,
1063                                   des3_ede_speed_template);
1064                 test_cipher_speed("des3_ede", MODE_CBC, ENCRYPT, sec,
1065                                   des3_ede_enc_tv_template,
1066                                   DES3_EDE_ENC_TEST_VECTORS,
1067                                   des3_ede_speed_template);
1068                 test_cipher_speed("des3_ede", MODE_CBC, DECRYPT, sec,
1069                                   des3_ede_dec_tv_template,
1070                                   DES3_EDE_DEC_TEST_VECTORS,
1071                                   des3_ede_speed_template);
1072                 break;
1073
1074         case 202:
1075                 test_cipher_speed("twofish", MODE_ECB, ENCRYPT, sec, NULL, 0,
1076                                   twofish_speed_template);
1077                 test_cipher_speed("twofish", MODE_ECB, DECRYPT, sec, NULL, 0,
1078                                   twofish_speed_template);
1079                 test_cipher_speed("twofish", MODE_CBC, ENCRYPT, sec, NULL, 0,
1080                                   twofish_speed_template);
1081                 test_cipher_speed("twofish", MODE_CBC, DECRYPT, sec, NULL, 0,
1082                                   twofish_speed_template);
1083                 break;
1084
1085         case 203:
1086                 test_cipher_speed("blowfish", MODE_ECB, ENCRYPT, sec, NULL, 0,
1087                                   blowfish_speed_template);
1088                 test_cipher_speed("blowfish", MODE_ECB, DECRYPT, sec, NULL, 0,
1089                                   blowfish_speed_template);
1090                 test_cipher_speed("blowfish", MODE_CBC, ENCRYPT, sec, NULL, 0,
1091                                   blowfish_speed_template);
1092                 test_cipher_speed("blowfish", MODE_CBC, DECRYPT, sec, NULL, 0,
1093                                   blowfish_speed_template);
1094                 break;
1095
1096         case 204:
1097                 test_cipher_speed("des", MODE_ECB, ENCRYPT, sec, NULL, 0,
1098                                   des_speed_template);
1099                 test_cipher_speed("des", MODE_ECB, DECRYPT, sec, NULL, 0,
1100                                   des_speed_template);
1101                 test_cipher_speed("des", MODE_CBC, ENCRYPT, sec, NULL, 0,
1102                                   des_speed_template);
1103                 test_cipher_speed("des", MODE_CBC, DECRYPT, sec, NULL, 0,
1104                                   des_speed_template);
1105                 break;
1106
1107         case 1000:
1108                 test_available();
1109                 break;
1110
1111         default:
1112                 /* useful for debugging */
1113                 printk("not testing anything\n");
1114                 break;
1115         }
1116 }
1117
1118 static int __init init(void)
1119 {
1120         tvmem = kmalloc(TVMEMSIZE, GFP_KERNEL);
1121         if (tvmem == NULL)
1122                 return -ENOMEM;
1123
1124         xbuf = kmalloc(XBUFSIZE, GFP_KERNEL);
1125         if (xbuf == NULL) {
1126                 kfree(tvmem);
1127                 return -ENOMEM;
1128         }
1129
1130         do_test();
1131
1132         kfree(xbuf);
1133         kfree(tvmem);
1134         return 0;
1135 }
1136
1137 /*
1138  * If an init function is provided, an exit function must also be provided
1139  * to allow module unload.
1140  */
1141 static void __exit fini(void) { }
1142
1143 module_init(init);
1144 module_exit(fini);
1145
1146 module_param(mode, int, 0);
1147 module_param(sec, uint, 0);
1148 MODULE_PARM_DESC(sec, "Length in seconds of speed tests "
1149                       "(defaults to zero which uses CPU cycles instead)");
1150
1151 MODULE_LICENSE("GPL");
1152 MODULE_DESCRIPTION("Quick & dirty crypto testing module");
1153 MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");