linux/crypto/tcrypt.c
<<
>>
Prefs
   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 * Copyright (c) 2007 Nokia Siemens Networks
  10 *
  11 * Updated RFC4106 AES-GCM testing.
  12 *    Authors: Aidan O'Mahony (aidan.o.mahony@intel.com)
  13 *             Adrian Hoban <adrian.hoban@intel.com>
  14 *             Gabriele Paoloni <gabriele.paoloni@intel.com>
  15 *             Tadeusz Struk (tadeusz.struk@intel.com)
  16 *             Copyright (c) 2010, Intel Corporation.
  17 *
  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)
  21 * any later version.
  22 *
  23 */
  24
  25#include <crypto/hash.h>
  26#include <linux/err.h>
  27#include <linux/init.h>
  28#include <linux/gfp.h>
  29#include <linux/module.h>
  30#include <linux/scatterlist.h>
  31#include <linux/string.h>
  32#include <linux/moduleparam.h>
  33#include <linux/jiffies.h>
  34#include <linux/timex.h>
  35#include <linux/interrupt.h>
  36#include "tcrypt.h"
  37#include "internal.h"
  38
  39/*
  40 * Need slab memory for testing (size in number of pages).
  41 */
  42#define TVMEMSIZE       4
  43
  44/*
  45* Used by test_cipher_speed()
  46*/
  47#define ENCRYPT 1
  48#define DECRYPT 0
  49
  50/*
  51 * Used by test_cipher_speed()
  52 */
  53static unsigned int sec;
  54
  55static char *alg = NULL;
  56static u32 type;
  57static u32 mask;
  58static int mode;
  59static char *tvmem[TVMEMSIZE];
  60
  61static char *check[] = {
  62        "des", "md5", "des3_ede", "rot13", "sha1", "sha224", "sha256",
  63        "blowfish", "twofish", "serpent", "sha384", "sha512", "md4", "aes",
  64        "cast6", "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
  65        "khazad", "wp512", "wp384", "wp256", "tnepres", "xeta",  "fcrypt",
  66        "camellia", "seed", "salsa20", "rmd128", "rmd160", "rmd256", "rmd320",
  67        "lzo", "cts", "zlib", NULL
  68};
  69
  70static int test_cipher_jiffies(struct blkcipher_desc *desc, int enc,
  71                               struct scatterlist *sg, int blen, int sec)
  72{
  73        unsigned long start, end;
  74        int bcount;
  75        int ret;
  76
  77        for (start = jiffies, end = start + sec * HZ, bcount = 0;
  78             time_before(jiffies, end); bcount++) {
  79                if (enc)
  80                        ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
  81                else
  82                        ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
  83
  84                if (ret)
  85                        return ret;
  86        }
  87
  88        printk("%d operations in %d seconds (%ld bytes)\n",
  89               bcount, sec, (long)bcount * blen);
  90        return 0;
  91}
  92
  93static int test_cipher_cycles(struct blkcipher_desc *desc, int enc,
  94                              struct scatterlist *sg, int blen)
  95{
  96        unsigned long cycles = 0;
  97        int ret = 0;
  98        int i;
  99
 100        local_bh_disable();
 101        local_irq_disable();
 102
 103        /* Warm-up run. */
 104        for (i = 0; i < 4; i++) {
 105                if (enc)
 106                        ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
 107                else
 108                        ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
 109
 110                if (ret)
 111                        goto out;
 112        }
 113
 114        /* The real thing. */
 115        for (i = 0; i < 8; i++) {
 116                cycles_t start, end;
 117
 118                start = get_cycles();
 119                if (enc)
 120                        ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
 121                else
 122                        ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
 123                end = get_cycles();
 124
 125                if (ret)
 126                        goto out;
 127
 128                cycles += end - start;
 129        }
 130
 131out:
 132        local_irq_enable();
 133        local_bh_enable();
 134
 135        if (ret == 0)
 136                printk("1 operation in %lu cycles (%d bytes)\n",
 137                       (cycles + 4) / 8, blen);
 138
 139        return ret;
 140}
 141
 142static u32 block_sizes[] = { 16, 64, 256, 1024, 8192, 0 };
 143
 144static void test_cipher_speed(const char *algo, int enc, unsigned int sec,
 145                              struct cipher_speed_template *template,
 146                              unsigned int tcount, u8 *keysize)
 147{
 148        unsigned int ret, i, j, iv_len;
 149        const char *key;
 150        char iv[128];
 151        struct crypto_blkcipher *tfm;
 152        struct blkcipher_desc desc;
 153        const char *e;
 154        u32 *b_size;
 155
 156        if (enc == ENCRYPT)
 157                e = "encryption";
 158        else
 159                e = "decryption";
 160
 161        printk("\ntesting speed of %s %s\n", algo, e);
 162
 163        tfm = crypto_alloc_blkcipher(algo, 0, CRYPTO_ALG_ASYNC);
 164
 165        if (IS_ERR(tfm)) {
 166                printk("failed to load transform for %s: %ld\n", algo,
 167                       PTR_ERR(tfm));
 168                return;
 169        }
 170        desc.tfm = tfm;
 171        desc.flags = 0;
 172
 173        i = 0;
 174        do {
 175
 176                b_size = block_sizes;
 177                do {
 178                        struct scatterlist sg[TVMEMSIZE];
 179
 180                        if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
 181                                printk("template (%u) too big for "
 182                                       "tvmem (%lu)\n", *keysize + *b_size,
 183                                       TVMEMSIZE * PAGE_SIZE);
 184                                goto out;
 185                        }
 186
 187                        printk("test %u (%d bit key, %d byte blocks): ", i,
 188                                        *keysize * 8, *b_size);
 189
 190                        memset(tvmem[0], 0xff, PAGE_SIZE);
 191
 192                        /* set key, plain text and IV */
 193                        key = tvmem[0];
 194                        for (j = 0; j < tcount; j++) {
 195                                if (template[j].klen == *keysize) {
 196                                        key = template[j].key;
 197                                        break;
 198                                }
 199                        }
 200
 201                        ret = crypto_blkcipher_setkey(tfm, key, *keysize);
 202                        if (ret) {
 203                                printk("setkey() failed flags=%x\n",
 204                                                crypto_blkcipher_get_flags(tfm));
 205                                goto out;
 206                        }
 207
 208                        sg_init_table(sg, TVMEMSIZE);
 209                        sg_set_buf(sg, tvmem[0] + *keysize,
 210                                   PAGE_SIZE - *keysize);
 211                        for (j = 1; j < TVMEMSIZE; j++) {
 212                                sg_set_buf(sg + j, tvmem[j], PAGE_SIZE);
 213                                memset (tvmem[j], 0xff, PAGE_SIZE);
 214                        }
 215
 216                        iv_len = crypto_blkcipher_ivsize(tfm);
 217                        if (iv_len) {
 218                                memset(&iv, 0xff, iv_len);
 219                                crypto_blkcipher_set_iv(tfm, iv, iv_len);
 220                        }
 221
 222                        if (sec)
 223                                ret = test_cipher_jiffies(&desc, enc, sg,
 224                                                          *b_size, sec);
 225                        else
 226                                ret = test_cipher_cycles(&desc, enc, sg,
 227                                                         *b_size);
 228
 229                        if (ret) {
 230                                printk("%s() failed flags=%x\n", e, desc.flags);
 231                                break;
 232                        }
 233                        b_size++;
 234                        i++;
 235                } while (*b_size);
 236                keysize++;
 237        } while (*keysize);
 238
 239out:
 240        crypto_free_blkcipher(tfm);
 241}
 242
 243static int test_hash_jiffies_digest(struct hash_desc *desc,
 244                                    struct scatterlist *sg, int blen,
 245                                    char *out, int sec)
 246{
 247        unsigned long start, end;
 248        int bcount;
 249        int ret;
 250
 251        for (start = jiffies, end = start + sec * HZ, bcount = 0;
 252             time_before(jiffies, end); bcount++) {
 253                ret = crypto_hash_digest(desc, sg, blen, out);
 254                if (ret)
 255                        return ret;
 256        }
 257
 258        printk("%6u opers/sec, %9lu bytes/sec\n",
 259               bcount / sec, ((long)bcount * blen) / sec);
 260
 261        return 0;
 262}
 263
 264static int test_hash_jiffies(struct hash_desc *desc, struct scatterlist *sg,
 265                             int blen, int plen, char *out, int sec)
 266{
 267        unsigned long start, end;
 268        int bcount, pcount;
 269        int ret;
 270
 271        if (plen == blen)
 272                return test_hash_jiffies_digest(desc, sg, blen, out, sec);
 273
 274        for (start = jiffies, end = start + sec * HZ, bcount = 0;
 275             time_before(jiffies, end); bcount++) {
 276                ret = crypto_hash_init(desc);
 277                if (ret)
 278                        return ret;
 279                for (pcount = 0; pcount < blen; pcount += plen) {
 280                        ret = crypto_hash_update(desc, sg, plen);
 281                        if (ret)
 282                                return ret;
 283                }
 284                /* we assume there is enough space in 'out' for the result */
 285                ret = crypto_hash_final(desc, out);
 286                if (ret)
 287                        return ret;
 288        }
 289
 290        printk("%6u opers/sec, %9lu bytes/sec\n",
 291               bcount / sec, ((long)bcount * blen) / sec);
 292
 293        return 0;
 294}
 295
 296static int test_hash_cycles_digest(struct hash_desc *desc,
 297                                   struct scatterlist *sg, int blen, char *out)
 298{
 299        unsigned long cycles = 0;
 300        int i;
 301        int ret;
 302
 303        local_bh_disable();
 304        local_irq_disable();
 305
 306        /* Warm-up run. */
 307        for (i = 0; i < 4; i++) {
 308                ret = crypto_hash_digest(desc, sg, blen, out);
 309                if (ret)
 310                        goto out;
 311        }
 312
 313        /* The real thing. */
 314        for (i = 0; i < 8; i++) {
 315                cycles_t start, end;
 316
 317                start = get_cycles();
 318
 319                ret = crypto_hash_digest(desc, sg, blen, out);
 320                if (ret)
 321                        goto out;
 322
 323                end = get_cycles();
 324
 325                cycles += end - start;
 326        }
 327
 328out:
 329        local_irq_enable();
 330        local_bh_enable();
 331
 332        if (ret)
 333                return ret;
 334
 335        printk("%6lu cycles/operation, %4lu cycles/byte\n",
 336               cycles / 8, cycles / (8 * blen));
 337
 338        return 0;
 339}
 340
 341static int test_hash_cycles(struct hash_desc *desc, struct scatterlist *sg,
 342                            int blen, int plen, char *out)
 343{
 344        unsigned long cycles = 0;
 345        int i, pcount;
 346        int ret;
 347
 348        if (plen == blen)
 349                return test_hash_cycles_digest(desc, sg, blen, out);
 350
 351        local_bh_disable();
 352        local_irq_disable();
 353
 354        /* Warm-up run. */
 355        for (i = 0; i < 4; i++) {
 356                ret = crypto_hash_init(desc);
 357                if (ret)
 358                        goto out;
 359                for (pcount = 0; pcount < blen; pcount += plen) {
 360                        ret = crypto_hash_update(desc, sg, plen);
 361                        if (ret)
 362                                goto out;
 363                }
 364                ret = crypto_hash_final(desc, out);
 365                if (ret)
 366                        goto out;
 367        }
 368
 369        /* The real thing. */
 370        for (i = 0; i < 8; i++) {
 371                cycles_t start, end;
 372
 373                start = get_cycles();
 374
 375                ret = crypto_hash_init(desc);
 376                if (ret)
 377                        goto out;
 378                for (pcount = 0; pcount < blen; pcount += plen) {
 379                        ret = crypto_hash_update(desc, sg, plen);
 380                        if (ret)
 381                                goto out;
 382                }
 383                ret = crypto_hash_final(desc, out);
 384                if (ret)
 385                        goto out;
 386
 387                end = get_cycles();
 388
 389                cycles += end - start;
 390        }
 391
 392out:
 393        local_irq_enable();
 394        local_bh_enable();
 395
 396        if (ret)
 397                return ret;
 398
 399        printk("%6lu cycles/operation, %4lu cycles/byte\n",
 400               cycles / 8, cycles / (8 * blen));
 401
 402        return 0;
 403}
 404
 405static void test_hash_sg_init(struct scatterlist *sg)
 406{
 407        int i;
 408
 409        sg_init_table(sg, TVMEMSIZE);
 410        for (i = 0; i < TVMEMSIZE; i++) {
 411                sg_set_buf(sg + i, tvmem[i], PAGE_SIZE);
 412                memset(tvmem[i], 0xff, PAGE_SIZE);
 413        }
 414}
 415
 416static void test_hash_speed(const char *algo, unsigned int sec,
 417                            struct hash_speed *speed)
 418{
 419        struct scatterlist sg[TVMEMSIZE];
 420        struct crypto_hash *tfm;
 421        struct hash_desc desc;
 422        static char output[1024];
 423        int i;
 424        int ret;
 425
 426        printk(KERN_INFO "\ntesting speed of %s\n", algo);
 427
 428        tfm = crypto_alloc_hash(algo, 0, CRYPTO_ALG_ASYNC);
 429
 430        if (IS_ERR(tfm)) {
 431                printk(KERN_ERR "failed to load transform for %s: %ld\n", algo,
 432                       PTR_ERR(tfm));
 433                return;
 434        }
 435
 436        desc.tfm = tfm;
 437        desc.flags = 0;
 438
 439        if (crypto_hash_digestsize(tfm) > sizeof(output)) {
 440                printk(KERN_ERR "digestsize(%u) > outputbuffer(%zu)\n",
 441                       crypto_hash_digestsize(tfm), sizeof(output));
 442                goto out;
 443        }
 444
 445        test_hash_sg_init(sg);
 446        for (i = 0; speed[i].blen != 0; i++) {
 447                if (speed[i].blen > TVMEMSIZE * PAGE_SIZE) {
 448                        printk(KERN_ERR
 449                               "template (%u) too big for tvmem (%lu)\n",
 450                               speed[i].blen, TVMEMSIZE * PAGE_SIZE);
 451                        goto out;
 452                }
 453
 454                if (speed[i].klen)
 455                        crypto_hash_setkey(tfm, tvmem[0], speed[i].klen);
 456
 457                printk(KERN_INFO "test%3u "
 458                       "(%5u byte blocks,%5u bytes per update,%4u updates): ",
 459                       i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen);
 460
 461                if (sec)
 462                        ret = test_hash_jiffies(&desc, sg, speed[i].blen,
 463                                                speed[i].plen, output, sec);
 464                else
 465                        ret = test_hash_cycles(&desc, sg, speed[i].blen,
 466                                               speed[i].plen, output);
 467
 468                if (ret) {
 469                        printk(KERN_ERR "hashing failed ret=%d\n", ret);
 470                        break;
 471                }
 472        }
 473
 474out:
 475        crypto_free_hash(tfm);
 476}
 477
 478struct tcrypt_result {
 479        struct completion completion;
 480        int err;
 481};
 482
 483static void tcrypt_complete(struct crypto_async_request *req, int err)
 484{
 485        struct tcrypt_result *res = req->data;
 486
 487        if (err == -EINPROGRESS)
 488                return;
 489
 490        res->err = err;
 491        complete(&res->completion);
 492}
 493
 494static inline int do_one_ahash_op(struct ahash_request *req, int ret)
 495{
 496        if (ret == -EINPROGRESS || ret == -EBUSY) {
 497                struct tcrypt_result *tr = req->base.data;
 498
 499                ret = wait_for_completion_interruptible(&tr->completion);
 500                if (!ret)
 501                        ret = tr->err;
 502                INIT_COMPLETION(tr->completion);
 503        }
 504        return ret;
 505}
 506
 507static int test_ahash_jiffies_digest(struct ahash_request *req, int blen,
 508                                     char *out, int sec)
 509{
 510        unsigned long start, end;
 511        int bcount;
 512        int ret;
 513
 514        for (start = jiffies, end = start + sec * HZ, bcount = 0;
 515             time_before(jiffies, end); bcount++) {
 516                ret = do_one_ahash_op(req, crypto_ahash_digest(req));
 517                if (ret)
 518                        return ret;
 519        }
 520
 521        printk("%6u opers/sec, %9lu bytes/sec\n",
 522               bcount / sec, ((long)bcount * blen) / sec);
 523
 524        return 0;
 525}
 526
 527static int test_ahash_jiffies(struct ahash_request *req, int blen,
 528                              int plen, char *out, int sec)
 529{
 530        unsigned long start, end;
 531        int bcount, pcount;
 532        int ret;
 533
 534        if (plen == blen)
 535                return test_ahash_jiffies_digest(req, blen, out, sec);
 536
 537        for (start = jiffies, end = start + sec * HZ, bcount = 0;
 538             time_before(jiffies, end); bcount++) {
 539                ret = crypto_ahash_init(req);
 540                if (ret)
 541                        return ret;
 542                for (pcount = 0; pcount < blen; pcount += plen) {
 543                        ret = do_one_ahash_op(req, crypto_ahash_update(req));
 544                        if (ret)
 545                                return ret;
 546                }
 547                /* we assume there is enough space in 'out' for the result */
 548                ret = do_one_ahash_op(req, crypto_ahash_final(req));
 549                if (ret)
 550                        return ret;
 551        }
 552
 553        pr_cont("%6u opers/sec, %9lu bytes/sec\n",
 554                bcount / sec, ((long)bcount * blen) / sec);
 555
 556        return 0;
 557}
 558
 559static int test_ahash_cycles_digest(struct ahash_request *req, int blen,
 560                                    char *out)
 561{
 562        unsigned long cycles = 0;
 563        int ret, i;
 564
 565        /* Warm-up run. */
 566        for (i = 0; i < 4; i++) {
 567                ret = do_one_ahash_op(req, crypto_ahash_digest(req));
 568                if (ret)
 569                        goto out;
 570        }
 571
 572        /* The real thing. */
 573        for (i = 0; i < 8; i++) {
 574                cycles_t start, end;
 575
 576                start = get_cycles();
 577
 578                ret = do_one_ahash_op(req, crypto_ahash_digest(req));
 579                if (ret)
 580                        goto out;
 581
 582                end = get_cycles();
 583
 584                cycles += end - start;
 585        }
 586
 587out:
 588        if (ret)
 589                return ret;
 590
 591        pr_cont("%6lu cycles/operation, %4lu cycles/byte\n",
 592                cycles / 8, cycles / (8 * blen));
 593
 594        return 0;
 595}
 596
 597static int test_ahash_cycles(struct ahash_request *req, int blen,
 598                             int plen, char *out)
 599{
 600        unsigned long cycles = 0;
 601        int i, pcount, ret;
 602
 603        if (plen == blen)
 604                return test_ahash_cycles_digest(req, blen, out);
 605
 606        /* Warm-up run. */
 607        for (i = 0; i < 4; i++) {
 608                ret = crypto_ahash_init(req);
 609                if (ret)
 610                        goto out;
 611                for (pcount = 0; pcount < blen; pcount += plen) {
 612                        ret = do_one_ahash_op(req, crypto_ahash_update(req));
 613                        if (ret)
 614                                goto out;
 615                }
 616                ret = do_one_ahash_op(req, crypto_ahash_final(req));
 617                if (ret)
 618                        goto out;
 619        }
 620
 621        /* The real thing. */
 622        for (i = 0; i < 8; i++) {
 623                cycles_t start, end;
 624
 625                start = get_cycles();
 626
 627                ret = crypto_ahash_init(req);
 628                if (ret)
 629                        goto out;
 630                for (pcount = 0; pcount < blen; pcount += plen) {
 631                        ret = do_one_ahash_op(req, crypto_ahash_update(req));
 632                        if (ret)
 633                                goto out;
 634                }
 635                ret = do_one_ahash_op(req, crypto_ahash_final(req));
 636                if (ret)
 637                        goto out;
 638
 639                end = get_cycles();
 640
 641                cycles += end - start;
 642        }
 643
 644out:
 645        if (ret)
 646                return ret;
 647
 648        pr_cont("%6lu cycles/operation, %4lu cycles/byte\n",
 649                cycles / 8, cycles / (8 * blen));
 650
 651        return 0;
 652}
 653
 654static void test_ahash_speed(const char *algo, unsigned int sec,
 655                             struct hash_speed *speed)
 656{
 657        struct scatterlist sg[TVMEMSIZE];
 658        struct tcrypt_result tresult;
 659        struct ahash_request *req;
 660        struct crypto_ahash *tfm;
 661        static char output[1024];
 662        int i, ret;
 663
 664        printk(KERN_INFO "\ntesting speed of async %s\n", algo);
 665
 666        tfm = crypto_alloc_ahash(algo, 0, 0);
 667        if (IS_ERR(tfm)) {
 668                pr_err("failed to load transform for %s: %ld\n",
 669                       algo, PTR_ERR(tfm));
 670                return;
 671        }
 672
 673        if (crypto_ahash_digestsize(tfm) > sizeof(output)) {
 674                pr_err("digestsize(%u) > outputbuffer(%zu)\n",
 675                       crypto_ahash_digestsize(tfm), sizeof(output));
 676                goto out;
 677        }
 678
 679        test_hash_sg_init(sg);
 680        req = ahash_request_alloc(tfm, GFP_KERNEL);
 681        if (!req) {
 682                pr_err("ahash request allocation failure\n");
 683                goto out;
 684        }
 685
 686        init_completion(&tresult.completion);
 687        ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
 688                                   tcrypt_complete, &tresult);
 689
 690        for (i = 0; speed[i].blen != 0; i++) {
 691                if (speed[i].blen > TVMEMSIZE * PAGE_SIZE) {
 692                        pr_err("template (%u) too big for tvmem (%lu)\n",
 693                               speed[i].blen, TVMEMSIZE * PAGE_SIZE);
 694                        break;
 695                }
 696
 697                pr_info("test%3u "
 698                        "(%5u byte blocks,%5u bytes per update,%4u updates): ",
 699                        i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen);
 700
 701                ahash_request_set_crypt(req, sg, output, speed[i].plen);
 702
 703                if (sec)
 704                        ret = test_ahash_jiffies(req, speed[i].blen,
 705                                                 speed[i].plen, output, sec);
 706                else
 707                        ret = test_ahash_cycles(req, speed[i].blen,
 708                                                speed[i].plen, output);
 709
 710                if (ret) {
 711                        pr_err("hashing failed ret=%d\n", ret);
 712                        break;
 713                }
 714        }
 715
 716        ahash_request_free(req);
 717
 718out:
 719        crypto_free_ahash(tfm);
 720}
 721
 722static void test_available(void)
 723{
 724        char **name = check;
 725
 726        while (*name) {
 727                printk("alg %s ", *name);
 728                printk(crypto_has_alg(*name, 0, 0) ?
 729                       "found\n" : "not found\n");
 730                name++;
 731        }
 732}
 733
 734static inline int tcrypt_test(const char *alg)
 735{
 736        int ret;
 737
 738        ret = alg_test(alg, alg, 0, 0);
 739        /* non-fips algs return -EINVAL in fips mode */
 740        if (fips_enabled && ret == -EINVAL)
 741                ret = 0;
 742        return ret;
 743}
 744
 745static int do_test(int m)
 746{
 747        int i;
 748        int ret = 0;
 749
 750        switch (m) {
 751        case 0:
 752                for (i = 1; i < 200; i++)
 753                        ret += do_test(i);
 754                break;
 755
 756        case 1:
 757                ret += tcrypt_test("md5");
 758                break;
 759
 760        case 2:
 761                ret += tcrypt_test("sha1");
 762                break;
 763
 764        case 3:
 765                ret += tcrypt_test("ecb(des)");
 766                ret += tcrypt_test("cbc(des)");
 767                break;
 768
 769        case 4:
 770                ret += tcrypt_test("ecb(des3_ede)");
 771                ret += tcrypt_test("cbc(des3_ede)");
 772                break;
 773
 774        case 5:
 775                ret += tcrypt_test("md4");
 776                break;
 777
 778        case 6:
 779                ret += tcrypt_test("sha256");
 780                break;
 781
 782        case 7:
 783                ret += tcrypt_test("ecb(blowfish)");
 784                ret += tcrypt_test("cbc(blowfish)");
 785                ret += tcrypt_test("ctr(blowfish)");
 786                break;
 787
 788        case 8:
 789                ret += tcrypt_test("ecb(twofish)");
 790                ret += tcrypt_test("cbc(twofish)");
 791                ret += tcrypt_test("ctr(twofish)");
 792                break;
 793
 794        case 9:
 795                ret += tcrypt_test("ecb(serpent)");
 796                break;
 797
 798        case 10:
 799                ret += tcrypt_test("ecb(aes)");
 800                ret += tcrypt_test("cbc(aes)");
 801                ret += tcrypt_test("lrw(aes)");
 802                ret += tcrypt_test("xts(aes)");
 803                ret += tcrypt_test("ctr(aes)");
 804                ret += tcrypt_test("rfc3686(ctr(aes))");
 805                break;
 806
 807        case 11:
 808                ret += tcrypt_test("sha384");
 809                break;
 810
 811        case 12:
 812                ret += tcrypt_test("sha512");
 813                break;
 814
 815        case 13:
 816                ret += tcrypt_test("deflate");
 817                break;
 818
 819        case 14:
 820                ret += tcrypt_test("ecb(cast5)");
 821                break;
 822
 823        case 15:
 824                ret += tcrypt_test("ecb(cast6)");
 825                break;
 826
 827        case 16:
 828                ret += tcrypt_test("ecb(arc4)");
 829                break;
 830
 831        case 17:
 832                ret += tcrypt_test("michael_mic");
 833                break;
 834
 835        case 18:
 836                ret += tcrypt_test("crc32c");
 837                break;
 838
 839        case 19:
 840                ret += tcrypt_test("ecb(tea)");
 841                break;
 842
 843        case 20:
 844                ret += tcrypt_test("ecb(xtea)");
 845                break;
 846
 847        case 21:
 848                ret += tcrypt_test("ecb(khazad)");
 849                break;
 850
 851        case 22:
 852                ret += tcrypt_test("wp512");
 853                break;
 854
 855        case 23:
 856                ret += tcrypt_test("wp384");
 857                break;
 858
 859        case 24:
 860                ret += tcrypt_test("wp256");
 861                break;
 862
 863        case 25:
 864                ret += tcrypt_test("ecb(tnepres)");
 865                break;
 866
 867        case 26:
 868                ret += tcrypt_test("ecb(anubis)");
 869                ret += tcrypt_test("cbc(anubis)");
 870                break;
 871
 872        case 27:
 873                ret += tcrypt_test("tgr192");
 874                break;
 875
 876        case 28:
 877
 878                ret += tcrypt_test("tgr160");
 879                break;
 880
 881        case 29:
 882                ret += tcrypt_test("tgr128");
 883                break;
 884
 885        case 30:
 886                ret += tcrypt_test("ecb(xeta)");
 887                break;
 888
 889        case 31:
 890                ret += tcrypt_test("pcbc(fcrypt)");
 891                break;
 892
 893        case 32:
 894                ret += tcrypt_test("ecb(camellia)");
 895                ret += tcrypt_test("cbc(camellia)");
 896                break;
 897        case 33:
 898                ret += tcrypt_test("sha224");
 899                break;
 900
 901        case 34:
 902                ret += tcrypt_test("salsa20");
 903                break;
 904
 905        case 35:
 906                ret += tcrypt_test("gcm(aes)");
 907                break;
 908
 909        case 36:
 910                ret += tcrypt_test("lzo");
 911                break;
 912
 913        case 37:
 914                ret += tcrypt_test("ccm(aes)");
 915                break;
 916
 917        case 38:
 918                ret += tcrypt_test("cts(cbc(aes))");
 919                break;
 920
 921        case 39:
 922                ret += tcrypt_test("rmd128");
 923                break;
 924
 925        case 40:
 926                ret += tcrypt_test("rmd160");
 927                break;
 928
 929        case 41:
 930                ret += tcrypt_test("rmd256");
 931                break;
 932
 933        case 42:
 934                ret += tcrypt_test("rmd320");
 935                break;
 936
 937        case 43:
 938                ret += tcrypt_test("ecb(seed)");
 939                break;
 940
 941        case 44:
 942                ret += tcrypt_test("zlib");
 943                break;
 944
 945        case 45:
 946                ret += tcrypt_test("rfc4309(ccm(aes))");
 947                break;
 948
 949        case 100:
 950                ret += tcrypt_test("hmac(md5)");
 951                break;
 952
 953        case 101:
 954                ret += tcrypt_test("hmac(sha1)");
 955                break;
 956
 957        case 102:
 958                ret += tcrypt_test("hmac(sha256)");
 959                break;
 960
 961        case 103:
 962                ret += tcrypt_test("hmac(sha384)");
 963                break;
 964
 965        case 104:
 966                ret += tcrypt_test("hmac(sha512)");
 967                break;
 968
 969        case 105:
 970                ret += tcrypt_test("hmac(sha224)");
 971                break;
 972
 973        case 106:
 974                ret += tcrypt_test("xcbc(aes)");
 975                break;
 976
 977        case 107:
 978                ret += tcrypt_test("hmac(rmd128)");
 979                break;
 980
 981        case 108:
 982                ret += tcrypt_test("hmac(rmd160)");
 983                break;
 984
 985        case 109:
 986                ret += tcrypt_test("vmac(aes)");
 987                break;
 988
 989        case 150:
 990                ret += tcrypt_test("ansi_cprng");
 991                break;
 992
 993        case 151:
 994                ret += tcrypt_test("rfc4106(gcm(aes))");
 995                break;
 996
 997        case 200:
 998                test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
 999                                speed_template_16_24_32);
1000                test_cipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
1001                                speed_template_16_24_32);
1002                test_cipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
1003                                speed_template_16_24_32);
1004                test_cipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
1005                                speed_template_16_24_32);
1006                test_cipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
1007                                speed_template_32_40_48);
1008                test_cipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
1009                                speed_template_32_40_48);
1010                test_cipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
1011                                speed_template_32_48_64);
1012                test_cipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
1013                                speed_template_32_48_64);
1014                test_cipher_speed("ctr(aes)", ENCRYPT, sec, NULL, 0,
1015                                speed_template_16_24_32);
1016                test_cipher_speed("ctr(aes)", DECRYPT, sec, NULL, 0,
1017                                speed_template_16_24_32);
1018                break;
1019
1020        case 201:
1021                test_cipher_speed("ecb(des3_ede)", ENCRYPT, sec,
1022                                des3_speed_template, DES3_SPEED_VECTORS,
1023                                speed_template_24);
1024                test_cipher_speed("ecb(des3_ede)", DECRYPT, sec,
1025                                des3_speed_template, DES3_SPEED_VECTORS,
1026                                speed_template_24);
1027                test_cipher_speed("cbc(des3_ede)", ENCRYPT, sec,
1028                                des3_speed_template, DES3_SPEED_VECTORS,
1029                                speed_template_24);
1030                test_cipher_speed("cbc(des3_ede)", DECRYPT, sec,
1031                                des3_speed_template, DES3_SPEED_VECTORS,
1032                                speed_template_24);
1033                break;
1034
1035        case 202:
1036                test_cipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
1037                                speed_template_16_24_32);
1038                test_cipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
1039                                speed_template_16_24_32);
1040                test_cipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
1041                                speed_template_16_24_32);
1042                test_cipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
1043                                speed_template_16_24_32);
1044                test_cipher_speed("ctr(twofish)", ENCRYPT, sec, NULL, 0,
1045                                speed_template_16_24_32);
1046                test_cipher_speed("ctr(twofish)", DECRYPT, sec, NULL, 0,
1047                                speed_template_16_24_32);
1048                break;
1049
1050        case 203:
1051                test_cipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
1052                                  speed_template_8_32);
1053                test_cipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
1054                                  speed_template_8_32);
1055                test_cipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
1056                                  speed_template_8_32);
1057                test_cipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
1058                                  speed_template_8_32);
1059                test_cipher_speed("ctr(blowfish)", ENCRYPT, sec, NULL, 0,
1060                                  speed_template_8_32);
1061                test_cipher_speed("ctr(blowfish)", DECRYPT, sec, NULL, 0,
1062                                  speed_template_8_32);
1063                break;
1064
1065        case 204:
1066                test_cipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
1067                                  speed_template_8);
1068                test_cipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
1069                                  speed_template_8);
1070                test_cipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
1071                                  speed_template_8);
1072                test_cipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
1073                                  speed_template_8);
1074                break;
1075
1076        case 205:
1077                test_cipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
1078                                speed_template_16_24_32);
1079                test_cipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
1080                                speed_template_16_24_32);
1081                test_cipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
1082                                speed_template_16_24_32);
1083                test_cipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
1084                                speed_template_16_24_32);
1085                break;
1086
1087        case 206:
1088                test_cipher_speed("salsa20", ENCRYPT, sec, NULL, 0,
1089                                  speed_template_16_32);
1090                break;
1091
1092        case 300:
1093                /* fall through */
1094
1095        case 301:
1096                test_hash_speed("md4", sec, generic_hash_speed_template);
1097                if (mode > 300 && mode < 400) break;
1098
1099        case 302:
1100                test_hash_speed("md5", sec, generic_hash_speed_template);
1101                if (mode > 300 && mode < 400) break;
1102
1103        case 303:
1104                test_hash_speed("sha1", sec, generic_hash_speed_template);
1105                if (mode > 300 && mode < 400) break;
1106
1107        case 304:
1108                test_hash_speed("sha256", sec, generic_hash_speed_template);
1109                if (mode > 300 && mode < 400) break;
1110
1111        case 305:
1112                test_hash_speed("sha384", sec, generic_hash_speed_template);
1113                if (mode > 300 && mode < 400) break;
1114
1115        case 306:
1116                test_hash_speed("sha512", sec, generic_hash_speed_template);
1117                if (mode > 300 && mode < 400) break;
1118
1119        case 307:
1120                test_hash_speed("wp256", sec, generic_hash_speed_template);
1121                if (mode > 300 && mode < 400) break;
1122
1123        case 308:
1124                test_hash_speed("wp384", sec, generic_hash_speed_template);
1125                if (mode > 300 && mode < 400) break;
1126
1127        case 309:
1128                test_hash_speed("wp512", sec, generic_hash_speed_template);
1129                if (mode > 300 && mode < 400) break;
1130
1131        case 310:
1132                test_hash_speed("tgr128", sec, generic_hash_speed_template);
1133                if (mode > 300 && mode < 400) break;
1134
1135        case 311:
1136                test_hash_speed("tgr160", sec, generic_hash_speed_template);
1137                if (mode > 300 && mode < 400) break;
1138
1139        case 312:
1140                test_hash_speed("tgr192", sec, generic_hash_speed_template);
1141                if (mode > 300 && mode < 400) break;
1142
1143        case 313:
1144                test_hash_speed("sha224", sec, generic_hash_speed_template);
1145                if (mode > 300 && mode < 400) break;
1146
1147        case 314:
1148                test_hash_speed("rmd128", sec, generic_hash_speed_template);
1149                if (mode > 300 && mode < 400) break;
1150
1151        case 315:
1152                test_hash_speed("rmd160", sec, generic_hash_speed_template);
1153                if (mode > 300 && mode < 400) break;
1154
1155        case 316:
1156                test_hash_speed("rmd256", sec, generic_hash_speed_template);
1157                if (mode > 300 && mode < 400) break;
1158
1159        case 317:
1160                test_hash_speed("rmd320", sec, generic_hash_speed_template);
1161                if (mode > 300 && mode < 400) break;
1162
1163        case 318:
1164                test_hash_speed("ghash-generic", sec, hash_speed_template_16);
1165                if (mode > 300 && mode < 400) break;
1166
1167        case 399:
1168                break;
1169
1170        case 400:
1171                /* fall through */
1172
1173        case 401:
1174                test_ahash_speed("md4", sec, generic_hash_speed_template);
1175                if (mode > 400 && mode < 500) break;
1176
1177        case 402:
1178                test_ahash_speed("md5", sec, generic_hash_speed_template);
1179                if (mode > 400 && mode < 500) break;
1180
1181        case 403:
1182                test_ahash_speed("sha1", sec, generic_hash_speed_template);
1183                if (mode > 400 && mode < 500) break;
1184
1185        case 404:
1186                test_ahash_speed("sha256", sec, generic_hash_speed_template);
1187                if (mode > 400 && mode < 500) break;
1188
1189        case 405:
1190                test_ahash_speed("sha384", sec, generic_hash_speed_template);
1191                if (mode > 400 && mode < 500) break;
1192
1193        case 406:
1194                test_ahash_speed("sha512", sec, generic_hash_speed_template);
1195                if (mode > 400 && mode < 500) break;
1196
1197        case 407:
1198                test_ahash_speed("wp256", sec, generic_hash_speed_template);
1199                if (mode > 400 && mode < 500) break;
1200
1201        case 408:
1202                test_ahash_speed("wp384", sec, generic_hash_speed_template);
1203                if (mode > 400 && mode < 500) break;
1204
1205        case 409:
1206                test_ahash_speed("wp512", sec, generic_hash_speed_template);
1207                if (mode > 400 && mode < 500) break;
1208
1209        case 410:
1210                test_ahash_speed("tgr128", sec, generic_hash_speed_template);
1211                if (mode > 400 && mode < 500) break;
1212
1213        case 411:
1214                test_ahash_speed("tgr160", sec, generic_hash_speed_template);
1215                if (mode > 400 && mode < 500) break;
1216
1217        case 412:
1218                test_ahash_speed("tgr192", sec, generic_hash_speed_template);
1219                if (mode > 400 && mode < 500) break;
1220
1221        case 413:
1222                test_ahash_speed("sha224", sec, generic_hash_speed_template);
1223                if (mode > 400 && mode < 500) break;
1224
1225        case 414:
1226                test_ahash_speed("rmd128", sec, generic_hash_speed_template);
1227                if (mode > 400 && mode < 500) break;
1228
1229        case 415:
1230                test_ahash_speed("rmd160", sec, generic_hash_speed_template);
1231                if (mode > 400 && mode < 500) break;
1232
1233        case 416:
1234                test_ahash_speed("rmd256", sec, generic_hash_speed_template);
1235                if (mode > 400 && mode < 500) break;
1236
1237        case 417:
1238                test_ahash_speed("rmd320", sec, generic_hash_speed_template);
1239                if (mode > 400 && mode < 500) break;
1240
1241        case 499:
1242                break;
1243
1244        case 1000:
1245                test_available();
1246                break;
1247        }
1248
1249        return ret;
1250}
1251
1252static int do_alg_test(const char *alg, u32 type, u32 mask)
1253{
1254        return crypto_has_alg(alg, type, mask ?: CRYPTO_ALG_TYPE_MASK) ?
1255               0 : -ENOENT;
1256}
1257
1258static int __init tcrypt_mod_init(void)
1259{
1260        int err = -ENOMEM;
1261        int i;
1262
1263        for (i = 0; i < TVMEMSIZE; i++) {
1264                tvmem[i] = (void *)__get_free_page(GFP_KERNEL);
1265                if (!tvmem[i])
1266                        goto err_free_tv;
1267        }
1268
1269        if (alg)
1270                err = do_alg_test(alg, type, mask);
1271        else
1272                err = do_test(mode);
1273
1274        if (err) {
1275                printk(KERN_ERR "tcrypt: one or more tests failed!\n");
1276                goto err_free_tv;
1277        }
1278
1279        /* We intentionaly return -EAGAIN to prevent keeping the module,
1280         * unless we're running in fips mode. It does all its work from
1281         * init() and doesn't offer any runtime functionality, but in
1282         * the fips case, checking for a successful load is helpful.
1283         * => we don't need it in the memory, do we?
1284         *                                        -- mludvig
1285         */
1286        if (!fips_enabled)
1287                err = -EAGAIN;
1288
1289err_free_tv:
1290        for (i = 0; i < TVMEMSIZE && tvmem[i]; i++)
1291                free_page((unsigned long)tvmem[i]);
1292
1293        return err;
1294}
1295
1296/*
1297 * If an init function is provided, an exit function must also be provided
1298 * to allow module unload.
1299 */
1300static void __exit tcrypt_mod_fini(void) { }
1301
1302module_init(tcrypt_mod_init);
1303module_exit(tcrypt_mod_fini);
1304
1305module_param(alg, charp, 0);
1306module_param(type, uint, 0);
1307module_param(mask, uint, 0);
1308module_param(mode, int, 0);
1309module_param(sec, uint, 0);
1310MODULE_PARM_DESC(sec, "Length in seconds of speed tests "
1311                      "(defaults to zero which uses CPU cycles instead)");
1312
1313MODULE_LICENSE("GPL");
1314MODULE_DESCRIPTION("Quick & dirty crypto testing module");
1315MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");
1316
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.