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_irq_disable();
 101
 102        /* Warm-up run. */
 103        for (i = 0; i < 4; i++) {
 104                if (enc)
 105                        ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
 106                else
 107                        ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
 108
 109                if (ret)
 110                        goto out;
 111        }
 112
 113        /* The real thing. */
 114        for (i = 0; i < 8; i++) {
 115                cycles_t start, end;
 116
 117                start = get_cycles();
 118                if (enc)
 119                        ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
 120                else
 121                        ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
 122                end = get_cycles();
 123
 124                if (ret)
 125                        goto out;
 126
 127                cycles += end - start;
 128        }
 129
 130out:
 131        local_irq_enable();
 132
 133        if (ret == 0)
 134                printk("1 operation in %lu cycles (%d bytes)\n",
 135                       (cycles + 4) / 8, blen);
 136
 137        return ret;
 138}
 139
 140static u32 block_sizes[] = { 16, 64, 256, 1024, 8192, 0 };
 141
 142static void test_cipher_speed(const char *algo, int enc, unsigned int sec,
 143                              struct cipher_speed_template *template,
 144                              unsigned int tcount, u8 *keysize)
 145{
 146        unsigned int ret, i, j, iv_len;
 147        const char *key;
 148        char iv[128];
 149        struct crypto_blkcipher *tfm;
 150        struct blkcipher_desc desc;
 151        const char *e;
 152        u32 *b_size;
 153
 154        if (enc == ENCRYPT)
 155                e = "encryption";
 156        else
 157                e = "decryption";
 158
 159        printk("\ntesting speed of %s %s\n", algo, e);
 160
 161        tfm = crypto_alloc_blkcipher(algo, 0, CRYPTO_ALG_ASYNC);
 162
 163        if (IS_ERR(tfm)) {
 164                printk("failed to load transform for %s: %ld\n", algo,
 165                       PTR_ERR(tfm));
 166                return;
 167        }
 168        desc.tfm = tfm;
 169        desc.flags = 0;
 170
 171        i = 0;
 172        do {
 173
 174                b_size = block_sizes;
 175                do {
 176                        struct scatterlist sg[TVMEMSIZE];
 177
 178                        if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
 179                                printk("template (%u) too big for "
 180                                       "tvmem (%lu)\n", *keysize + *b_size,
 181                                       TVMEMSIZE * PAGE_SIZE);
 182                                goto out;
 183                        }
 184
 185                        printk("test %u (%d bit key, %d byte blocks): ", i,
 186                                        *keysize * 8, *b_size);
 187
 188                        memset(tvmem[0], 0xff, PAGE_SIZE);
 189
 190                        /* set key, plain text and IV */
 191                        key = tvmem[0];
 192                        for (j = 0; j < tcount; j++) {
 193                                if (template[j].klen == *keysize) {
 194                                        key = template[j].key;
 195                                        break;
 196                                }
 197                        }
 198
 199                        ret = crypto_blkcipher_setkey(tfm, key, *keysize);
 200                        if (ret) {
 201                                printk("setkey() failed flags=%x\n",
 202                                                crypto_blkcipher_get_flags(tfm));
 203                                goto out;
 204                        }
 205
 206                        sg_init_table(sg, TVMEMSIZE);
 207                        sg_set_buf(sg, tvmem[0] + *keysize,
 208                                   PAGE_SIZE - *keysize);
 209                        for (j = 1; j < TVMEMSIZE; j++) {
 210                                sg_set_buf(sg + j, tvmem[j], PAGE_SIZE);
 211                                memset (tvmem[j], 0xff, PAGE_SIZE);
 212                        }
 213
 214                        iv_len = crypto_blkcipher_ivsize(tfm);
 215                        if (iv_len) {
 216                                memset(&iv, 0xff, iv_len);
 217                                crypto_blkcipher_set_iv(tfm, iv, iv_len);
 218                        }
 219
 220                        if (sec)
 221                                ret = test_cipher_jiffies(&desc, enc, sg,
 222                                                          *b_size, sec);
 223                        else
 224                                ret = test_cipher_cycles(&desc, enc, sg,
 225                                                         *b_size);
 226
 227                        if (ret) {
 228                                printk("%s() failed flags=%x\n", e, desc.flags);
 229                                break;
 230                        }
 231                        b_size++;
 232                        i++;
 233                } while (*b_size);
 234                keysize++;
 235        } while (*keysize);
 236
 237out:
 238        crypto_free_blkcipher(tfm);
 239}
 240
 241static int test_hash_jiffies_digest(struct hash_desc *desc,
 242                                    struct scatterlist *sg, int blen,
 243                                    char *out, int sec)
 244{
 245        unsigned long start, end;
 246        int bcount;
 247        int ret;
 248
 249        for (start = jiffies, end = start + sec * HZ, bcount = 0;
 250             time_before(jiffies, end); bcount++) {
 251                ret = crypto_hash_digest(desc, sg, blen, out);
 252                if (ret)
 253                        return ret;
 254        }
 255
 256        printk("%6u opers/sec, %9lu bytes/sec\n",
 257               bcount / sec, ((long)bcount * blen) / sec);
 258
 259        return 0;
 260}
 261
 262static int test_hash_jiffies(struct hash_desc *desc, struct scatterlist *sg,
 263                             int blen, int plen, char *out, int sec)
 264{
 265        unsigned long start, end;
 266        int bcount, pcount;
 267        int ret;
 268
 269        if (plen == blen)
 270                return test_hash_jiffies_digest(desc, sg, blen, out, sec);
 271
 272        for (start = jiffies, end = start + sec * HZ, bcount = 0;
 273             time_before(jiffies, end); bcount++) {
 274                ret = crypto_hash_init(desc);
 275                if (ret)
 276                        return ret;
 277                for (pcount = 0; pcount < blen; pcount += plen) {
 278                        ret = crypto_hash_update(desc, sg, plen);
 279                        if (ret)
 280                                return ret;
 281                }
 282                /* we assume there is enough space in 'out' for the result */
 283                ret = crypto_hash_final(desc, out);
 284                if (ret)
 285                        return ret;
 286        }
 287
 288        printk("%6u opers/sec, %9lu bytes/sec\n",
 289               bcount / sec, ((long)bcount * blen) / sec);
 290
 291        return 0;
 292}
 293
 294static int test_hash_cycles_digest(struct hash_desc *desc,
 295                                   struct scatterlist *sg, int blen, char *out)
 296{
 297        unsigned long cycles = 0;
 298        int i;
 299        int ret;
 300
 301        local_irq_disable();
 302
 303        /* Warm-up run. */
 304        for (i = 0; i < 4; i++) {
 305                ret = crypto_hash_digest(desc, sg, blen, out);
 306                if (ret)
 307                        goto out;
 308        }
 309
 310        /* The real thing. */
 311        for (i = 0; i < 8; i++) {
 312                cycles_t start, end;
 313
 314                start = get_cycles();
 315
 316                ret = crypto_hash_digest(desc, sg, blen, out);
 317                if (ret)
 318                        goto out;
 319
 320                end = get_cycles();
 321
 322                cycles += end - start;
 323        }
 324
 325out:
 326        local_irq_enable();
 327
 328        if (ret)
 329                return ret;
 330
 331        printk("%6lu cycles/operation, %4lu cycles/byte\n",
 332               cycles / 8, cycles / (8 * blen));
 333
 334        return 0;
 335}
 336
 337static int test_hash_cycles(struct hash_desc *desc, struct scatterlist *sg,
 338                            int blen, int plen, char *out)
 339{
 340        unsigned long cycles = 0;
 341        int i, pcount;
 342        int ret;
 343
 344        if (plen == blen)
 345                return test_hash_cycles_digest(desc, sg, blen, out);
 346
 347        local_irq_disable();
 348
 349        /* Warm-up run. */
 350        for (i = 0; i < 4; i++) {
 351                ret = crypto_hash_init(desc);
 352                if (ret)
 353                        goto out;
 354                for (pcount = 0; pcount < blen; pcount += plen) {
 355                        ret = crypto_hash_update(desc, sg, plen);
 356                        if (ret)
 357                                goto out;
 358                }
 359                ret = crypto_hash_final(desc, out);
 360                if (ret)
 361                        goto out;
 362        }
 363
 364        /* The real thing. */
 365        for (i = 0; i < 8; i++) {
 366                cycles_t start, end;
 367
 368                start = get_cycles();
 369
 370                ret = crypto_hash_init(desc);
 371                if (ret)
 372                        goto out;
 373                for (pcount = 0; pcount < blen; pcount += plen) {
 374                        ret = crypto_hash_update(desc, sg, plen);
 375                        if (ret)
 376                                goto out;
 377                }
 378                ret = crypto_hash_final(desc, out);
 379                if (ret)
 380                        goto out;
 381
 382                end = get_cycles();
 383
 384                cycles += end - start;
 385        }
 386
 387out:
 388        local_irq_enable();
 389
 390        if (ret)
 391                return ret;
 392
 393        printk("%6lu cycles/operation, %4lu cycles/byte\n",
 394               cycles / 8, cycles / (8 * blen));
 395
 396        return 0;
 397}
 398
 399static void test_hash_sg_init(struct scatterlist *sg)
 400{
 401        int i;
 402
 403        sg_init_table(sg, TVMEMSIZE);
 404        for (i = 0; i < TVMEMSIZE; i++) {
 405                sg_set_buf(sg + i, tvmem[i], PAGE_SIZE);
 406                memset(tvmem[i], 0xff, PAGE_SIZE);
 407        }
 408}
 409
 410static void test_hash_speed(const char *algo, unsigned int sec,
 411                            struct hash_speed *speed)
 412{
 413        struct scatterlist sg[TVMEMSIZE];
 414        struct crypto_hash *tfm;
 415        struct hash_desc desc;
 416        static char output[1024];
 417        int i;
 418        int ret;
 419
 420        printk(KERN_INFO "\ntesting speed of %s\n", algo);
 421
 422        tfm = crypto_alloc_hash(algo, 0, CRYPTO_ALG_ASYNC);
 423
 424        if (IS_ERR(tfm)) {
 425                printk(KERN_ERR "failed to load transform for %s: %ld\n", algo,
 426                       PTR_ERR(tfm));
 427                return;
 428        }
 429
 430        desc.tfm = tfm;
 431        desc.flags = 0;
 432
 433        if (crypto_hash_digestsize(tfm) > sizeof(output)) {
 434                printk(KERN_ERR "digestsize(%u) > outputbuffer(%zu)\n",
 435                       crypto_hash_digestsize(tfm), sizeof(output));
 436                goto out;
 437        }
 438
 439        test_hash_sg_init(sg);
 440        for (i = 0; speed[i].blen != 0; i++) {
 441                if (speed[i].blen > TVMEMSIZE * PAGE_SIZE) {
 442                        printk(KERN_ERR
 443                               "template (%u) too big for tvmem (%lu)\n",
 444                               speed[i].blen, TVMEMSIZE * PAGE_SIZE);
 445                        goto out;
 446                }
 447
 448                if (speed[i].klen)
 449                        crypto_hash_setkey(tfm, tvmem[0], speed[i].klen);
 450
 451                printk(KERN_INFO "test%3u "
 452                       "(%5u byte blocks,%5u bytes per update,%4u updates): ",
 453                       i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen);
 454
 455                if (sec)
 456                        ret = test_hash_jiffies(&desc, sg, speed[i].blen,
 457                                                speed[i].plen, output, sec);
 458                else
 459                        ret = test_hash_cycles(&desc, sg, speed[i].blen,
 460                                               speed[i].plen, output);
 461
 462                if (ret) {
 463                        printk(KERN_ERR "hashing failed ret=%d\n", ret);
 464                        break;
 465                }
 466        }
 467
 468out:
 469        crypto_free_hash(tfm);
 470}
 471
 472struct tcrypt_result {
 473        struct completion completion;
 474        int err;
 475};
 476
 477static void tcrypt_complete(struct crypto_async_request *req, int err)
 478{
 479        struct tcrypt_result *res = req->data;
 480
 481        if (err == -EINPROGRESS)
 482                return;
 483
 484        res->err = err;
 485        complete(&res->completion);
 486}
 487
 488static inline int do_one_ahash_op(struct ahash_request *req, int ret)
 489{
 490        if (ret == -EINPROGRESS || ret == -EBUSY) {
 491                struct tcrypt_result *tr = req->base.data;
 492
 493                ret = wait_for_completion_interruptible(&tr->completion);
 494                if (!ret)
 495                        ret = tr->err;
 496                INIT_COMPLETION(tr->completion);
 497        }
 498        return ret;
 499}
 500
 501static int test_ahash_jiffies_digest(struct ahash_request *req, int blen,
 502                                     char *out, int sec)
 503{
 504        unsigned long start, end;
 505        int bcount;
 506        int ret;
 507
 508        for (start = jiffies, end = start + sec * HZ, bcount = 0;
 509             time_before(jiffies, end); bcount++) {
 510                ret = do_one_ahash_op(req, crypto_ahash_digest(req));
 511                if (ret)
 512                        return ret;
 513        }
 514
 515        printk("%6u opers/sec, %9lu bytes/sec\n",
 516               bcount / sec, ((long)bcount * blen) / sec);
 517
 518        return 0;
 519}
 520
 521static int test_ahash_jiffies(struct ahash_request *req, int blen,
 522                              int plen, char *out, int sec)
 523{
 524        unsigned long start, end;
 525        int bcount, pcount;
 526        int ret;
 527
 528        if (plen == blen)
 529                return test_ahash_jiffies_digest(req, blen, out, sec);
 530
 531        for (start = jiffies, end = start + sec * HZ, bcount = 0;
 532             time_before(jiffies, end); bcount++) {
 533                ret = crypto_ahash_init(req);
 534                if (ret)
 535                        return ret;
 536                for (pcount = 0; pcount < blen; pcount += plen) {
 537                        ret = do_one_ahash_op(req, crypto_ahash_update(req));
 538                        if (ret)
 539                                return ret;
 540                }
 541                /* we assume there is enough space in 'out' for the result */
 542                ret = do_one_ahash_op(req, crypto_ahash_final(req));
 543                if (ret)
 544                        return ret;
 545        }
 546
 547        pr_cont("%6u opers/sec, %9lu bytes/sec\n",
 548                bcount / sec, ((long)bcount * blen) / sec);
 549
 550        return 0;
 551}
 552
 553static int test_ahash_cycles_digest(struct ahash_request *req, int blen,
 554                                    char *out)
 555{
 556        unsigned long cycles = 0;
 557        int ret, i;
 558
 559        /* Warm-up run. */
 560        for (i = 0; i < 4; i++) {
 561                ret = do_one_ahash_op(req, crypto_ahash_digest(req));
 562                if (ret)
 563                        goto out;
 564        }
 565
 566        /* The real thing. */
 567        for (i = 0; i < 8; i++) {
 568                cycles_t start, end;
 569
 570                start = get_cycles();
 571
 572                ret = do_one_ahash_op(req, crypto_ahash_digest(req));
 573                if (ret)
 574                        goto out;
 575
 576                end = get_cycles();
 577
 578                cycles += end - start;
 579        }
 580
 581out:
 582        if (ret)
 583                return ret;
 584
 585        pr_cont("%6lu cycles/operation, %4lu cycles/byte\n",
 586                cycles / 8, cycles / (8 * blen));
 587
 588        return 0;
 589}
 590
 591static int test_ahash_cycles(struct ahash_request *req, int blen,
 592                             int plen, char *out)
 593{
 594        unsigned long cycles = 0;
 595        int i, pcount, ret;
 596
 597        if (plen == blen)
 598                return test_ahash_cycles_digest(req, blen, out);
 599
 600        /* Warm-up run. */
 601        for (i = 0; i < 4; i++) {
 602                ret = crypto_ahash_init(req);
 603                if (ret)
 604                        goto out;
 605                for (pcount = 0; pcount < blen; pcount += plen) {
 606                        ret = do_one_ahash_op(req, crypto_ahash_update(req));
 607                        if (ret)
 608                                goto out;
 609                }
 610                ret = do_one_ahash_op(req, crypto_ahash_final(req));
 611                if (ret)
 612                        goto out;
 613        }
 614
 615        /* The real thing. */
 616        for (i = 0; i < 8; i++) {
 617                cycles_t start, end;
 618
 619                start = get_cycles();
 620
 621                ret = crypto_ahash_init(req);
 622                if (ret)
 623                        goto out;
 624                for (pcount = 0; pcount < blen; pcount += plen) {
 625                        ret = do_one_ahash_op(req, crypto_ahash_update(req));
 626                        if (ret)
 627                                goto out;
 628                }
 629                ret = do_one_ahash_op(req, crypto_ahash_final(req));
 630                if (ret)
 631                        goto out;
 632
 633                end = get_cycles();
 634
 635                cycles += end - start;
 636        }
 637
 638out:
 639        if (ret)
 640                return ret;
 641
 642        pr_cont("%6lu cycles/operation, %4lu cycles/byte\n",
 643                cycles / 8, cycles / (8 * blen));
 644
 645        return 0;
 646}
 647
 648static void test_ahash_speed(const char *algo, unsigned int sec,
 649                             struct hash_speed *speed)
 650{
 651        struct scatterlist sg[TVMEMSIZE];
 652        struct tcrypt_result tresult;
 653        struct ahash_request *req;
 654        struct crypto_ahash *tfm;
 655        static char output[1024];
 656        int i, ret;
 657
 658        printk(KERN_INFO "\ntesting speed of async %s\n", algo);
 659
 660        tfm = crypto_alloc_ahash(algo, 0, 0);
 661        if (IS_ERR(tfm)) {
 662                pr_err("failed to load transform for %s: %ld\n",
 663                       algo, PTR_ERR(tfm));
 664                return;
 665        }
 666
 667        if (crypto_ahash_digestsize(tfm) > sizeof(output)) {
 668                pr_err("digestsize(%u) > outputbuffer(%zu)\n",
 669                       crypto_ahash_digestsize(tfm), sizeof(output));
 670                goto out;
 671        }
 672
 673        test_hash_sg_init(sg);
 674        req = ahash_request_alloc(tfm, GFP_KERNEL);
 675        if (!req) {
 676                pr_err("ahash request allocation failure\n");
 677                goto out;
 678        }
 679
 680        init_completion(&tresult.completion);
 681        ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
 682                                   tcrypt_complete, &tresult);
 683
 684        for (i = 0; speed[i].blen != 0; i++) {
 685                if (speed[i].blen > TVMEMSIZE * PAGE_SIZE) {
 686                        pr_err("template (%u) too big for tvmem (%lu)\n",
 687                               speed[i].blen, TVMEMSIZE * PAGE_SIZE);
 688                        break;
 689                }
 690
 691                pr_info("test%3u "
 692                        "(%5u byte blocks,%5u bytes per update,%4u updates): ",
 693                        i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen);
 694
 695                ahash_request_set_crypt(req, sg, output, speed[i].plen);
 696
 697                if (sec)
 698                        ret = test_ahash_jiffies(req, speed[i].blen,
 699                                                 speed[i].plen, output, sec);
 700                else
 701                        ret = test_ahash_cycles(req, speed[i].blen,
 702                                                speed[i].plen, output);
 703
 704                if (ret) {
 705                        pr_err("hashing failed ret=%d\n", ret);
 706                        break;
 707                }
 708        }
 709
 710        ahash_request_free(req);
 711
 712out:
 713        crypto_free_ahash(tfm);
 714}
 715
 716static inline int do_one_acipher_op(struct ablkcipher_request *req, int ret)
 717{
 718        if (ret == -EINPROGRESS || ret == -EBUSY) {
 719                struct tcrypt_result *tr = req->base.data;
 720
 721                ret = wait_for_completion_interruptible(&tr->completion);
 722                if (!ret)
 723                        ret = tr->err;
 724                INIT_COMPLETION(tr->completion);
 725        }
 726
 727        return ret;
 728}
 729
 730static int test_acipher_jiffies(struct ablkcipher_request *req, int enc,
 731                                int blen, int sec)
 732{
 733        unsigned long start, end;
 734        int bcount;
 735        int ret;
 736
 737        for (start = jiffies, end = start + sec * HZ, bcount = 0;
 738             time_before(jiffies, end); bcount++) {
 739                if (enc)
 740                        ret = do_one_acipher_op(req,
 741                                                crypto_ablkcipher_encrypt(req));
 742                else
 743                        ret = do_one_acipher_op(req,
 744                                                crypto_ablkcipher_decrypt(req));
 745
 746                if (ret)
 747                        return ret;
 748        }
 749
 750        pr_cont("%d operations in %d seconds (%ld bytes)\n",
 751                bcount, sec, (long)bcount * blen);
 752        return 0;
 753}
 754
 755static int test_acipher_cycles(struct ablkcipher_request *req, int enc,
 756                               int blen)
 757{
 758        unsigned long cycles = 0;
 759        int ret = 0;
 760        int i;
 761
 762        /* Warm-up run. */
 763        for (i = 0; i < 4; i++) {
 764                if (enc)
 765                        ret = do_one_acipher_op(req,
 766                                                crypto_ablkcipher_encrypt(req));
 767                else
 768                        ret = do_one_acipher_op(req,
 769                                                crypto_ablkcipher_decrypt(req));
 770
 771                if (ret)
 772                        goto out;
 773        }
 774
 775        /* The real thing. */
 776        for (i = 0; i < 8; i++) {
 777                cycles_t start, end;
 778
 779                start = get_cycles();
 780                if (enc)
 781                        ret = do_one_acipher_op(req,
 782                                                crypto_ablkcipher_encrypt(req));
 783                else
 784                        ret = do_one_acipher_op(req,
 785                                                crypto_ablkcipher_decrypt(req));
 786                end = get_cycles();
 787
 788                if (ret)
 789                        goto out;
 790
 791                cycles += end - start;
 792        }
 793
 794out:
 795        if (ret == 0)
 796                pr_cont("1 operation in %lu cycles (%d bytes)\n",
 797                        (cycles + 4) / 8, blen);
 798
 799        return ret;
 800}
 801
 802static void test_acipher_speed(const char *algo, int enc, unsigned int sec,
 803                               struct cipher_speed_template *template,
 804                               unsigned int tcount, u8 *keysize)
 805{
 806        unsigned int ret, i, j, k, iv_len;
 807        struct tcrypt_result tresult;
 808        const char *key;
 809        char iv[128];
 810        struct ablkcipher_request *req;
 811        struct crypto_ablkcipher *tfm;
 812        const char *e;
 813        u32 *b_size;
 814
 815        if (enc == ENCRYPT)
 816                e = "encryption";
 817        else
 818                e = "decryption";
 819
 820        pr_info("\ntesting speed of async %s %s\n", algo, e);
 821
 822        init_completion(&tresult.completion);
 823
 824        tfm = crypto_alloc_ablkcipher(algo, 0, 0);
 825
 826        if (IS_ERR(tfm)) {
 827                pr_err("failed to load transform for %s: %ld\n", algo,
 828                       PTR_ERR(tfm));
 829                return;
 830        }
 831
 832        req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
 833        if (!req) {
 834                pr_err("tcrypt: skcipher: Failed to allocate request for %s\n",
 835                       algo);
 836                goto out;
 837        }
 838
 839        ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
 840                                        tcrypt_complete, &tresult);
 841
 842        i = 0;
 843        do {
 844                b_size = block_sizes;
 845
 846                do {
 847                        struct scatterlist sg[TVMEMSIZE];
 848
 849                        if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
 850                                pr_err("template (%u) too big for "
 851                                       "tvmem (%lu)\n", *keysize + *b_size,
 852                                       TVMEMSIZE * PAGE_SIZE);
 853                                goto out_free_req;
 854                        }
 855
 856                        pr_info("test %u (%d bit key, %d byte blocks): ", i,
 857                                *keysize * 8, *b_size);
 858
 859                        memset(tvmem[0], 0xff, PAGE_SIZE);
 860
 861                        /* set key, plain text and IV */
 862                        key = tvmem[0];
 863                        for (j = 0; j < tcount; j++) {
 864                                if (template[j].klen == *keysize) {
 865                                        key = template[j].key;
 866                                        break;
 867                                }
 868                        }
 869
 870                        crypto_ablkcipher_clear_flags(tfm, ~0);
 871
 872                        ret = crypto_ablkcipher_setkey(tfm, key, *keysize);
 873                        if (ret) {
 874                                pr_err("setkey() failed flags=%x\n",
 875                                        crypto_ablkcipher_get_flags(tfm));
 876                                goto out_free_req;
 877                        }
 878
 879                        sg_init_table(sg, TVMEMSIZE);
 880
 881                        k = *keysize + *b_size;
 882                        if (k > PAGE_SIZE) {
 883                                sg_set_buf(sg, tvmem[0] + *keysize,
 884                                   PAGE_SIZE - *keysize);
 885                                k -= PAGE_SIZE;
 886                                j = 1;
 887                                while (k > PAGE_SIZE) {
 888                                        sg_set_buf(sg + j, tvmem[j], PAGE_SIZE);
 889                                        memset(tvmem[j], 0xff, PAGE_SIZE);
 890                                        j++;
 891                                        k -= PAGE_SIZE;
 892                                }
 893                                sg_set_buf(sg + j, tvmem[j], k);
 894                                memset(tvmem[j], 0xff, k);
 895                        } else {
 896                                sg_set_buf(sg, tvmem[0] + *keysize, *b_size);
 897                        }
 898
 899                        iv_len = crypto_ablkcipher_ivsize(tfm);
 900                        if (iv_len)
 901                                memset(&iv, 0xff, iv_len);
 902
 903                        ablkcipher_request_set_crypt(req, sg, sg, *b_size, iv);
 904
 905                        if (sec)
 906                                ret = test_acipher_jiffies(req, enc,
 907                                                           *b_size, sec);
 908                        else
 909                                ret = test_acipher_cycles(req, enc,
 910                                                          *b_size);
 911
 912                        if (ret) {
 913                                pr_err("%s() failed flags=%x\n", e,
 914                                        crypto_ablkcipher_get_flags(tfm));
 915                                break;
 916                        }
 917                        b_size++;
 918                        i++;
 919                } while (*b_size);
 920                keysize++;
 921        } while (*keysize);
 922
 923out_free_req:
 924        ablkcipher_request_free(req);
 925out:
 926        crypto_free_ablkcipher(tfm);
 927}
 928
 929static void test_available(void)
 930{
 931        char **name = check;
 932
 933        while (*name) {
 934                printk("alg %s ", *name);
 935                printk(crypto_has_alg(*name, 0, 0) ?
 936                       "found\n" : "not found\n");
 937                name++;
 938        }
 939}
 940
 941static inline int tcrypt_test(const char *alg)
 942{
 943        int ret;
 944
 945        ret = alg_test(alg, alg, 0, 0);
 946        /* non-fips algs return -EINVAL in fips mode */
 947        if (fips_enabled && ret == -EINVAL)
 948                ret = 0;
 949        return ret;
 950}
 951
 952static int do_test(int m)
 953{
 954        int i;
 955        int ret = 0;
 956
 957        switch (m) {
 958        case 0:
 959                for (i = 1; i < 200; i++)
 960                        ret += do_test(i);
 961                break;
 962
 963        case 1:
 964                ret += tcrypt_test("md5");
 965                break;
 966
 967        case 2:
 968                ret += tcrypt_test("sha1");
 969                break;
 970
 971        case 3:
 972                ret += tcrypt_test("ecb(des)");
 973                ret += tcrypt_test("cbc(des)");
 974                break;
 975
 976        case 4:
 977                ret += tcrypt_test("ecb(des3_ede)");
 978                ret += tcrypt_test("cbc(des3_ede)");
 979                break;
 980
 981        case 5:
 982                ret += tcrypt_test("md4");
 983                break;
 984
 985        case 6:
 986                ret += tcrypt_test("sha256");
 987                break;
 988
 989        case 7:
 990                ret += tcrypt_test("ecb(blowfish)");
 991                ret += tcrypt_test("cbc(blowfish)");
 992                ret += tcrypt_test("ctr(blowfish)");
 993                break;
 994
 995        case 8:
 996                ret += tcrypt_test("ecb(twofish)");
 997                ret += tcrypt_test("cbc(twofish)");
 998                ret += tcrypt_test("ctr(twofish)");
 999                ret += tcrypt_test("lrw(twofish)");
1000                ret += tcrypt_test("xts(twofish)");
1001                break;
1002
1003        case 9:
1004                ret += tcrypt_test("ecb(serpent)");
1005                ret += tcrypt_test("cbc(serpent)");
1006                ret += tcrypt_test("ctr(serpent)");
1007                ret += tcrypt_test("lrw(serpent)");
1008                ret += tcrypt_test("xts(serpent)");
1009                break;
1010
1011        case 10:
1012                ret += tcrypt_test("ecb(aes)");
1013                ret += tcrypt_test("cbc(aes)");
1014                ret += tcrypt_test("lrw(aes)");
1015                ret += tcrypt_test("xts(aes)");
1016                ret += tcrypt_test("ctr(aes)");
1017                ret += tcrypt_test("rfc3686(ctr(aes))");
1018                break;
1019
1020        case 11:
1021                ret += tcrypt_test("sha384");
1022                break;
1023
1024        case 12:
1025                ret += tcrypt_test("sha512");
1026                break;
1027
1028        case 13:
1029                ret += tcrypt_test("deflate");
1030                break;
1031
1032        case 14:
1033                ret += tcrypt_test("ecb(cast5)");
1034                ret += tcrypt_test("cbc(cast5)");
1035                ret += tcrypt_test("ctr(cast5)");
1036                break;
1037
1038        case 15:
1039                ret += tcrypt_test("ecb(cast6)");
1040                ret += tcrypt_test("cbc(cast6)");
1041                ret += tcrypt_test("ctr(cast6)");
1042                ret += tcrypt_test("lrw(cast6)");
1043                ret += tcrypt_test("xts(cast6)");
1044                break;
1045
1046        case 16:
1047                ret += tcrypt_test("ecb(arc4)");
1048                break;
1049
1050        case 17:
1051                ret += tcrypt_test("michael_mic");
1052                break;
1053
1054        case 18:
1055                ret += tcrypt_test("crc32c");
1056                break;
1057
1058        case 19:
1059                ret += tcrypt_test("ecb(tea)");
1060                break;
1061
1062        case 20:
1063                ret += tcrypt_test("ecb(xtea)");
1064                break;
1065
1066        case 21:
1067                ret += tcrypt_test("ecb(khazad)");
1068                break;
1069
1070        case 22:
1071                ret += tcrypt_test("wp512");
1072                break;
1073
1074        case 23:
1075                ret += tcrypt_test("wp384");
1076                break;
1077
1078        case 24:
1079                ret += tcrypt_test("wp256");
1080                break;
1081
1082        case 25:
1083                ret += tcrypt_test("ecb(tnepres)");
1084                break;
1085
1086        case 26:
1087                ret += tcrypt_test("ecb(anubis)");
1088                ret += tcrypt_test("cbc(anubis)");
1089                break;
1090
1091        case 27:
1092                ret += tcrypt_test("tgr192");
1093                break;
1094
1095        case 28:
1096
1097                ret += tcrypt_test("tgr160");
1098                break;
1099
1100        case 29:
1101                ret += tcrypt_test("tgr128");
1102                break;
1103
1104        case 30:
1105                ret += tcrypt_test("ecb(xeta)");
1106                break;
1107
1108        case 31:
1109                ret += tcrypt_test("pcbc(fcrypt)");
1110                break;
1111
1112        case 32:
1113                ret += tcrypt_test("ecb(camellia)");
1114                ret += tcrypt_test("cbc(camellia)");
1115                ret += tcrypt_test("ctr(camellia)");
1116                ret += tcrypt_test("lrw(camellia)");
1117                ret += tcrypt_test("xts(camellia)");
1118                break;
1119        case 33:
1120                ret += tcrypt_test("sha224");
1121                break;
1122
1123        case 34:
1124                ret += tcrypt_test("salsa20");
1125                break;
1126
1127        case 35:
1128                ret += tcrypt_test("gcm(aes)");
1129                break;
1130
1131        case 36:
1132                ret += tcrypt_test("lzo");
1133                break;
1134
1135        case 37:
1136                ret += tcrypt_test("ccm(aes)");
1137                break;
1138
1139        case 38:
1140                ret += tcrypt_test("cts(cbc(aes))");
1141                break;
1142
1143        case 39:
1144                ret += tcrypt_test("rmd128");
1145                break;
1146
1147        case 40:
1148                ret += tcrypt_test("rmd160");
1149                break;
1150
1151        case 41:
1152                ret += tcrypt_test("rmd256");
1153                break;
1154
1155        case 42:
1156                ret += tcrypt_test("rmd320");
1157                break;
1158
1159        case 43:
1160                ret += tcrypt_test("ecb(seed)");
1161                break;
1162
1163        case 44:
1164                ret += tcrypt_test("zlib");
1165                break;
1166
1167        case 45:
1168                ret += tcrypt_test("rfc4309(ccm(aes))");
1169                break;
1170
1171        case 46:
1172                ret += tcrypt_test("ghash");
1173                break;
1174
1175        case 100:
1176                ret += tcrypt_test("hmac(md5)");
1177                break;
1178
1179        case 101:
1180                ret += tcrypt_test("hmac(sha1)");
1181                break;
1182
1183        case 102:
1184                ret += tcrypt_test("hmac(sha256)");
1185                break;
1186
1187        case 103:
1188                ret += tcrypt_test("hmac(sha384)");
1189                break;
1190
1191        case 104:
1192                ret += tcrypt_test("hmac(sha512)");
1193                break;
1194
1195        case 105:
1196                ret += tcrypt_test("hmac(sha224)");
1197                break;
1198
1199        case 106:
1200                ret += tcrypt_test("xcbc(aes)");
1201                break;
1202
1203        case 107:
1204                ret += tcrypt_test("hmac(rmd128)");
1205                break;
1206
1207        case 108:
1208                ret += tcrypt_test("hmac(rmd160)");
1209                break;
1210
1211        case 109:
1212                ret += tcrypt_test("vmac(aes)");
1213                break;
1214        case 110:
1215                ret += tcrypt_test("hmac(crc32)");
1216                break;
1217
1218        case 150:
1219                ret += tcrypt_test("ansi_cprng");
1220                break;
1221
1222        case 151:
1223                ret += tcrypt_test("rfc4106(gcm(aes))");
1224                break;
1225
1226        case 200:
1227                test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
1228                                speed_template_16_24_32);
1229                test_cipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
1230                                speed_template_16_24_32);
1231                test_cipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
1232                                speed_template_16_24_32);
1233                test_cipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
1234                                speed_template_16_24_32);
1235                test_cipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
1236                                speed_template_32_40_48);
1237                test_cipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
1238                                speed_template_32_40_48);
1239                test_cipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
1240                                speed_template_32_48_64);
1241                test_cipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
1242                                speed_template_32_48_64);
1243                test_cipher_speed("ctr(aes)", ENCRYPT, sec, NULL, 0,
1244                                speed_template_16_24_32);
1245                test_cipher_speed("ctr(aes)", DECRYPT, sec, NULL, 0,
1246                                speed_template_16_24_32);
1247                break;
1248
1249        case 201:
1250                test_cipher_speed("ecb(des3_ede)", ENCRYPT, sec,
1251                                des3_speed_template, DES3_SPEED_VECTORS,
1252                                speed_template_24);
1253                test_cipher_speed("ecb(des3_ede)", DECRYPT, sec,
1254                                des3_speed_template, DES3_SPEED_VECTORS,
1255                                speed_template_24);
1256                test_cipher_speed("cbc(des3_ede)", ENCRYPT, sec,
1257                                des3_speed_template, DES3_SPEED_VECTORS,
1258                                speed_template_24);
1259                test_cipher_speed("cbc(des3_ede)", DECRYPT, sec,
1260                                des3_speed_template, DES3_SPEED_VECTORS,
1261                                speed_template_24);
1262                break;
1263
1264        case 202:
1265                test_cipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
1266                                speed_template_16_24_32);
1267                test_cipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
1268                                speed_template_16_24_32);
1269                test_cipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
1270                                speed_template_16_24_32);
1271                test_cipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
1272                                speed_template_16_24_32);
1273                test_cipher_speed("ctr(twofish)", ENCRYPT, sec, NULL, 0,
1274                                speed_template_16_24_32);
1275                test_cipher_speed("ctr(twofish)", DECRYPT, sec, NULL, 0,
1276                                speed_template_16_24_32);
1277                test_cipher_speed("lrw(twofish)", ENCRYPT, sec, NULL, 0,
1278                                speed_template_32_40_48);
1279                test_cipher_speed("lrw(twofish)", DECRYPT, sec, NULL, 0,
1280                                speed_template_32_40_48);
1281                test_cipher_speed("xts(twofish)", ENCRYPT, sec, NULL, 0,
1282                                speed_template_32_48_64);
1283                test_cipher_speed("xts(twofish)", DECRYPT, sec, NULL, 0,
1284                                speed_template_32_48_64);
1285                break;
1286
1287        case 203:
1288                test_cipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
1289                                  speed_template_8_32);
1290                test_cipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
1291                                  speed_template_8_32);
1292                test_cipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
1293                                  speed_template_8_32);
1294                test_cipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
1295                                  speed_template_8_32);
1296                test_cipher_speed("ctr(blowfish)", ENCRYPT, sec, NULL, 0,
1297                                  speed_template_8_32);
1298                test_cipher_speed("ctr(blowfish)", DECRYPT, sec, NULL, 0,
1299                                  speed_template_8_32);
1300                break;
1301
1302        case 204:
1303                test_cipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
1304                                  speed_template_8);
1305                test_cipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
1306                                  speed_template_8);
1307                test_cipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
1308                                  speed_template_8);
1309                test_cipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
1310                                  speed_template_8);
1311                break;
1312
1313        case 205:
1314                test_cipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
1315                                speed_template_16_24_32);
1316                test_cipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
1317                                speed_template_16_24_32);
1318                test_cipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
1319                                speed_template_16_24_32);
1320                test_cipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
1321                                speed_template_16_24_32);
1322                test_cipher_speed("ctr(camellia)", ENCRYPT, sec, NULL, 0,
1323                                speed_template_16_24_32);
1324                test_cipher_speed("ctr(camellia)", DECRYPT, sec, NULL, 0,
1325                                speed_template_16_24_32);
1326                test_cipher_speed("lrw(camellia)", ENCRYPT, sec, NULL, 0,
1327                                speed_template_32_40_48);
1328                test_cipher_speed("lrw(camellia)", DECRYPT, sec, NULL, 0,
1329                                speed_template_32_40_48);
1330                test_cipher_speed("xts(camellia)", ENCRYPT, sec, NULL, 0,
1331                                speed_template_32_48_64);
1332                test_cipher_speed("xts(camellia)", DECRYPT, sec, NULL, 0,
1333                                speed_template_32_48_64);
1334                break;
1335
1336        case 206:
1337                test_cipher_speed("salsa20", ENCRYPT, sec, NULL, 0,
1338                                  speed_template_16_32);
1339                break;
1340
1341        case 207:
1342                test_cipher_speed("ecb(serpent)", ENCRYPT, sec, NULL, 0,
1343                                  speed_template_16_32);
1344                test_cipher_speed("ecb(serpent)", DECRYPT, sec, NULL, 0,
1345                                  speed_template_16_32);
1346                test_cipher_speed("cbc(serpent)", ENCRYPT, sec, NULL, 0,
1347                                  speed_template_16_32);
1348                test_cipher_speed("cbc(serpent)", DECRYPT, sec, NULL, 0,
1349                                  speed_template_16_32);
1350                test_cipher_speed("ctr(serpent)", ENCRYPT, sec, NULL, 0,
1351                                  speed_template_16_32);
1352                test_cipher_speed("ctr(serpent)", DECRYPT, sec, NULL, 0,
1353                                  speed_template_16_32);
1354                test_cipher_speed("lrw(serpent)", ENCRYPT, sec, NULL, 0,
1355                                  speed_template_32_48);
1356                test_cipher_speed("lrw(serpent)", DECRYPT, sec, NULL, 0,
1357                                  speed_template_32_48);
1358                test_cipher_speed("xts(serpent)", ENCRYPT, sec, NULL, 0,
1359                                  speed_template_32_64);
1360                test_cipher_speed("xts(serpent)", DECRYPT, sec, NULL, 0,
1361                                  speed_template_32_64);
1362                break;
1363
1364        case 208:
1365                test_cipher_speed("ecb(arc4)", ENCRYPT, sec, NULL, 0,
1366                                  speed_template_8);
1367                break;
1368
1369        case 209:
1370                test_cipher_speed("ecb(cast5)", ENCRYPT, sec, NULL, 0,
1371                                  speed_template_8_16);
1372                test_cipher_speed("ecb(cast5)", DECRYPT, sec, NULL, 0,
1373                                  speed_template_8_16);
1374                test_cipher_speed("cbc(cast5)", ENCRYPT, sec, NULL, 0,
1375                                  speed_template_8_16);
1376                test_cipher_speed("cbc(cast5)", DECRYPT, sec, NULL, 0,
1377                                  speed_template_8_16);
1378                test_cipher_speed("ctr(cast5)", ENCRYPT, sec, NULL, 0,
1379                                  speed_template_8_16);
1380                test_cipher_speed("ctr(cast5)", DECRYPT, sec, NULL, 0,
1381                                  speed_template_8_16);
1382                break;
1383
1384        case 210:
1385                test_cipher_speed("ecb(cast6)", ENCRYPT, sec, NULL, 0,
1386                                  speed_template_16_32);
1387                test_cipher_speed("ecb(cast6)", DECRYPT, sec, NULL, 0,
1388                                  speed_template_16_32);
1389                test_cipher_speed("cbc(cast6)", ENCRYPT, sec, NULL, 0,
1390                                  speed_template_16_32);
1391                test_cipher_speed("cbc(cast6)", DECRYPT, sec, NULL, 0,
1392                                  speed_template_16_32);
1393                test_cipher_speed("ctr(cast6)", ENCRYPT, sec, NULL, 0,
1394                                  speed_template_16_32);
1395                test_cipher_speed("ctr(cast6)", DECRYPT, sec, NULL, 0,
1396                                  speed_template_16_32);
1397                test_cipher_speed("lrw(cast6)", ENCRYPT, sec, NULL, 0,
1398                                  speed_template_32_48);
1399                test_cipher_speed("lrw(cast6)", DECRYPT, sec, NULL, 0,
1400                                  speed_template_32_48);
1401                test_cipher_speed("xts(cast6)", ENCRYPT, sec, NULL, 0,
1402                                  speed_template_32_64);
1403                test_cipher_speed("xts(cast6)", DECRYPT, sec, NULL, 0,
1404                                  speed_template_32_64);
1405                break;
1406
1407        case 300:
1408                /* fall through */
1409
1410        case 301:
1411                test_hash_speed("md4", sec, generic_hash_speed_template);
1412                if (mode > 300 && mode < 400) break;
1413
1414        case 302:
1415                test_hash_speed("md5", sec, generic_hash_speed_template);
1416                if (mode > 300 && mode < 400) break;
1417
1418        case 303:
1419                test_hash_speed("sha1", sec, generic_hash_speed_template);
1420                if (mode > 300 && mode < 400) break;
1421
1422        case 304:
1423                test_hash_speed("sha256", sec, generic_hash_speed_template);
1424                if (mode > 300 && mode < 400) break;
1425
1426        case 305:
1427                test_hash_speed("sha384", sec, generic_hash_speed_template);
1428                if (mode > 300 && mode < 400) break;
1429
1430        case 306:
1431                test_hash_speed("sha512", sec, generic_hash_speed_template);
1432                if (mode > 300 && mode < 400) break;
1433
1434        case 307:
1435                test_hash_speed("wp256", sec, generic_hash_speed_template);
1436                if (mode > 300 && mode < 400) break;
1437
1438        case 308:
1439                test_hash_speed("wp384", sec, generic_hash_speed_template);
1440                if (mode > 300 && mode < 400) break;
1441
1442        case 309:
1443                test_hash_speed("wp512", sec, generic_hash_speed_template);
1444                if (mode > 300 && mode < 400) break;
1445
1446        case 310:
1447                test_hash_speed("tgr128", sec, generic_hash_speed_template);
1448                if (mode > 300 && mode < 400) break;
1449
1450        case 311:
1451                test_hash_speed("tgr160", sec, generic_hash_speed_template);
1452                if (mode > 300 && mode < 400) break;
1453
1454        case 312:
1455                test_hash_speed("tgr192", sec, generic_hash_speed_template);
1456                if (mode > 300 && mode < 400) break;
1457
1458        case 313:
1459                test_hash_speed("sha224", sec, generic_hash_speed_template);
1460                if (mode > 300 && mode < 400) break;
1461
1462        case 314:
1463                test_hash_speed("rmd128", sec, generic_hash_speed_template);
1464                if (mode > 300 && mode < 400) break;
1465
1466        case 315:
1467                test_hash_speed("rmd160", sec, generic_hash_speed_template);
1468                if (mode > 300 && mode < 400) break;
1469
1470        case 316:
1471                test_hash_speed("rmd256", sec, generic_hash_speed_template);
1472                if (mode > 300 && mode < 400) break;
1473
1474        case 317:
1475                test_hash_speed("rmd320", sec, generic_hash_speed_template);
1476                if (mode > 300 && mode < 400) break;
1477
1478        case 318:
1479                test_hash_speed("ghash-generic", sec, hash_speed_template_16);
1480                if (mode > 300 && mode < 400) break;
1481
1482        case 399:
1483                break;
1484
1485        case 400:
1486                /* fall through */
1487
1488        case 401:
1489                test_ahash_speed("md4", sec, generic_hash_speed_template);
1490                if (mode > 400 && mode < 500) break;
1491
1492        case 402:
1493                test_ahash_speed("md5", sec, generic_hash_speed_template);
1494                if (mode > 400 && mode < 500) break;
1495
1496        case 403:
1497                test_ahash_speed("sha1", sec, generic_hash_speed_template);
1498                if (mode > 400 && mode < 500) break;
1499
1500        case 404:
1501                test_ahash_speed("sha256", sec, generic_hash_speed_template);
1502                if (mode > 400 && mode < 500) break;
1503
1504        case 405:
1505                test_ahash_speed("sha384", sec, generic_hash_speed_template);
1506                if (mode > 400 && mode < 500) break;
1507
1508        case 406:
1509                test_ahash_speed("sha512", sec, generic_hash_speed_template);
1510                if (mode > 400 && mode < 500) break;
1511
1512        case 407:
1513                test_ahash_speed("wp256", sec, generic_hash_speed_template);
1514                if (mode > 400 && mode < 500) break;
1515
1516        case 408:
1517                test_ahash_speed("wp384", sec, generic_hash_speed_template);
1518                if (mode > 400 && mode < 500) break;
1519
1520        case 409:
1521                test_ahash_speed("wp512", sec, generic_hash_speed_template);
1522                if (mode > 400 && mode < 500) break;
1523
1524        case 410:
1525                test_ahash_speed("tgr128", sec, generic_hash_speed_template);
1526                if (mode > 400 && mode < 500) break;
1527
1528        case 411:
1529                test_ahash_speed("tgr160", sec, generic_hash_speed_template);
1530                if (mode > 400 && mode < 500) break;
1531
1532        case 412:
1533                test_ahash_speed("tgr192", sec, generic_hash_speed_template);
1534                if (mode > 400 && mode < 500) break;
1535
1536        case 413:
1537                test_ahash_speed("sha224", sec, generic_hash_speed_template);
1538                if (mode > 400 && mode < 500) break;
1539
1540        case 414:
1541                test_ahash_speed("rmd128", sec, generic_hash_speed_template);
1542                if (mode > 400 && mode < 500) break;
1543
1544        case 415:
1545                test_ahash_speed("rmd160", sec, generic_hash_speed_template);
1546                if (mode > 400 && mode < 500) break;
1547
1548        case 416:
1549                test_ahash_speed("rmd256", sec, generic_hash_speed_template);
1550                if (mode > 400 && mode < 500) break;
1551
1552        case 417:
1553                test_ahash_speed("rmd320", sec, generic_hash_speed_template);
1554                if (mode > 400 && mode < 500) break;
1555
1556        case 499:
1557                break;
1558
1559        case 500:
1560                test_acipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
1561                                   speed_template_16_24_32);
1562                test_acipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
1563                                   speed_template_16_24_32);
1564                test_acipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
1565                                   speed_template_16_24_32);
1566                test_acipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
1567                                   speed_template_16_24_32);
1568                test_acipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
1569                                   speed_template_32_40_48);
1570                test_acipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
1571                                   speed_template_32_40_48);
1572                test_acipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
1573                                   speed_template_32_48_64);
1574                test_acipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
1575                                   speed_template_32_48_64);
1576                test_acipher_speed("ctr(aes)", ENCRYPT, sec, NULL, 0,
1577                                   speed_template_16_24_32);
1578                test_acipher_speed("ctr(aes)", DECRYPT, sec, NULL, 0,
1579                                   speed_template_16_24_32);
1580                test_acipher_speed("cfb(aes)", ENCRYPT, sec, NULL, 0,
1581                                   speed_template_16_24_32);
1582                test_acipher_speed("cfb(aes)", DECRYPT, sec, NULL, 0,
1583                                   speed_template_16_24_32);
1584                test_acipher_speed("ofb(aes)", ENCRYPT, sec, NULL, 0,
1585                                   speed_template_16_24_32);
1586                test_acipher_speed("ofb(aes)", DECRYPT, sec, NULL, 0,
1587                                   speed_template_16_24_32);
1588                break;
1589
1590        case 501:
1591                test_acipher_speed("ecb(des3_ede)", ENCRYPT, sec,
1592                                   des3_speed_template, DES3_SPEED_VECTORS,
1593                                   speed_template_24);
1594                test_acipher_speed("ecb(des3_ede)", DECRYPT, sec,
1595                                   des3_speed_template, DES3_SPEED_VECTORS,
1596                                   speed_template_24);
1597                test_acipher_speed("cbc(des3_ede)", ENCRYPT, sec,
1598                                   des3_speed_template, DES3_SPEED_VECTORS,
1599                                   speed_template_24);
1600                test_acipher_speed("cbc(des3_ede)", DECRYPT, sec,
1601                                   des3_speed_template, DES3_SPEED_VECTORS,
1602                                   speed_template_24);
1603                test_acipher_speed("cfb(des3_ede)", ENCRYPT, sec,
1604                                   des3_speed_template, DES3_SPEED_VECTORS,
1605                                   speed_template_24);
1606                test_acipher_speed("cfb(des3_ede)", DECRYPT, sec,
1607                                   des3_speed_template, DES3_SPEED_VECTORS,
1608                                   speed_template_24);
1609                test_acipher_speed("ofb(des3_ede)", ENCRYPT, sec,
1610                                   des3_speed_template, DES3_SPEED_VECTORS,
1611                                   speed_template_24);
1612                test_acipher_speed("ofb(des3_ede)", DECRYPT, sec,
1613                                   des3_speed_template, DES3_SPEED_VECTORS,
1614                                   speed_template_24);
1615                break;
1616
1617        case 502:
1618                test_acipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
1619                                   speed_template_8);
1620                test_acipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
1621                                   speed_template_8);
1622                test_acipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
1623                                   speed_template_8);
1624                test_acipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
1625                                   speed_template_8);
1626                test_acipher_speed("cfb(des)", ENCRYPT, sec, NULL, 0,
1627                                   speed_template_8);
1628                test_acipher_speed("cfb(des)", DECRYPT, sec, NULL, 0,
1629                                   speed_template_8);
1630                test_acipher_speed("ofb(des)", ENCRYPT, sec, NULL, 0,
1631                                   speed_template_8);
1632                test_acipher_speed("ofb(des)", DECRYPT, sec, NULL, 0,
1633                                   speed_template_8);
1634                break;
1635
1636        case 503:
1637                test_acipher_speed("ecb(serpent)", ENCRYPT, sec, NULL, 0,
1638                                   speed_template_16_32);
1639                test_acipher_speed("ecb(serpent)", DECRYPT, sec, NULL, 0,
1640                                   speed_template_16_32);
1641                test_acipher_speed("cbc(serpent)", ENCRYPT, sec, NULL, 0,
1642                                   speed_template_16_32);
1643                test_acipher_speed("cbc(serpent)", DECRYPT, sec, NULL, 0,
1644                                   speed_template_16_32);
1645                test_acipher_speed("ctr(serpent)", ENCRYPT, sec, NULL, 0,
1646                                   speed_template_16_32);
1647                test_acipher_speed("ctr(serpent)", DECRYPT, sec, NULL, 0,
1648                                   speed_template_16_32);
1649                test_acipher_speed("lrw(serpent)", ENCRYPT, sec, NULL, 0,
1650                                   speed_template_32_48);
1651                test_acipher_speed("lrw(serpent)", DECRYPT, sec, NULL, 0,
1652                                   speed_template_32_48);
1653                test_acipher_speed("xts(serpent)", ENCRYPT, sec, NULL, 0,
1654                                   speed_template_32_64);
1655                test_acipher_speed("xts(serpent)", DECRYPT, sec, NULL, 0,
1656                                   speed_template_32_64);
1657                break;
1658
1659        case 504:
1660                test_acipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
1661                                   speed_template_16_24_32);
1662                test_acipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
1663                                   speed_template_16_24_32);
1664                test_acipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
1665                                   speed_template_16_24_32);
1666                test_acipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
1667                                   speed_template_16_24_32);
1668                test_acipher_speed("ctr(twofish)", ENCRYPT, sec, NULL, 0,
1669                                   speed_template_16_24_32);
1670                test_acipher_speed("ctr(twofish)", DECRYPT, sec, NULL, 0,
1671                                   speed_template_16_24_32);
1672                test_acipher_speed("lrw(twofish)", ENCRYPT, sec, NULL, 0,
1673                                   speed_template_32_40_48);
1674                test_acipher_speed("lrw(twofish)", DECRYPT, sec, NULL, 0,
1675                                   speed_template_32_40_48);
1676                test_acipher_speed("xts(twofish)", ENCRYPT, sec, NULL, 0,
1677                                   speed_template_32_48_64);
1678                test_acipher_speed("xts(twofish)", DECRYPT, sec, NULL, 0,
1679                                   speed_template_32_48_64);
1680                break;
1681
1682        case 505:
1683                test_acipher_speed("ecb(arc4)", ENCRYPT, sec, NULL, 0,
1684                                   speed_template_8);
1685                break;
1686
1687        case 506:
1688                test_acipher_speed("ecb(cast5)", ENCRYPT, sec, NULL, 0,
1689                                   speed_template_8_16);
1690                test_acipher_speed("ecb(cast5)", DECRYPT, sec, NULL, 0,
1691                                   speed_template_8_16);
1692                test_acipher_speed("cbc(cast5)", ENCRYPT, sec, NULL, 0,
1693                                   speed_template_8_16);
1694                test_acipher_speed("cbc(cast5)", DECRYPT, sec, NULL, 0,
1695                                   speed_template_8_16);
1696                test_acipher_speed("ctr(cast5)", ENCRYPT, sec, NULL, 0,
1697                                   speed_template_8_16);
1698                test_acipher_speed("ctr(cast5)", DECRYPT, sec, NULL, 0,
1699                                   speed_template_8_16);
1700                break;
1701
1702        case 507:
1703                test_acipher_speed("ecb(cast6)", ENCRYPT, sec, NULL, 0,
1704                                   speed_template_16_32);
1705                test_acipher_speed("ecb(cast6)", DECRYPT, sec, NULL, 0,
1706                                   speed_template_16_32);
1707                test_acipher_speed("cbc(cast6)", ENCRYPT, sec, NULL, 0,
1708                                   speed_template_16_32);
1709                test_acipher_speed("cbc(cast6)", DECRYPT, sec, NULL, 0,
1710                                   speed_template_16_32);
1711                test_acipher_speed("ctr(cast6)", ENCRYPT, sec, NULL, 0,
1712                                   speed_template_16_32);
1713                test_acipher_speed("ctr(cast6)", DECRYPT, sec, NULL, 0,
1714                                   speed_template_16_32);
1715                test_acipher_speed("lrw(cast6)", ENCRYPT, sec, NULL, 0,
1716                                   speed_template_32_48);
1717                test_acipher_speed("lrw(cast6)", DECRYPT, sec, NULL, 0,
1718                                   speed_template_32_48);
1719                test_acipher_speed("xts(cast6)", ENCRYPT, sec, NULL, 0,
1720                                   speed_template_32_64);
1721                test_acipher_speed("xts(cast6)", DECRYPT, sec, NULL, 0,
1722                                   speed_template_32_64);
1723                break;
1724
1725        case 1000:
1726                test_available();
1727                break;
1728        }
1729
1730        return ret;
1731}
1732
1733static int do_alg_test(const char *alg, u32 type, u32 mask)
1734{
1735        return crypto_has_alg(alg, type, mask ?: CRYPTO_ALG_TYPE_MASK) ?
1736               0 : -ENOENT;
1737}
1738
1739static int __init tcrypt_mod_init(void)
1740{
1741        int err = -ENOMEM;
1742        int i;
1743
1744        for (i = 0; i < TVMEMSIZE; i++) {
1745                tvmem[i] = (void *)__get_free_page(GFP_KERNEL);
1746                if (!tvmem[i])
1747                        goto err_free_tv;
1748        }
1749
1750        if (alg)
1751                err = do_alg_test(alg, type, mask);
1752        else
1753                err = do_test(mode);
1754
1755        if (err) {
1756                printk(KERN_ERR "tcrypt: one or more tests failed!\n");
1757                goto err_free_tv;
1758        }
1759
1760        /* We intentionaly return -EAGAIN to prevent keeping the module,
1761         * unless we're running in fips mode. It does all its work from
1762         * init() and doesn't offer any runtime functionality, but in
1763         * the fips case, checking for a successful load is helpful.
1764         * => we don't need it in the memory, do we?
1765         *                                        -- mludvig
1766         */
1767        if (!fips_enabled)
1768                err = -EAGAIN;
1769
1770err_free_tv:
1771        for (i = 0; i < TVMEMSIZE && tvmem[i]; i++)
1772                free_page((unsigned long)tvmem[i]);
1773
1774        return err;
1775}
1776
1777/*
1778 * If an init function is provided, an exit function must also be provided
1779 * to allow module unload.
1780 */
1781static void __exit tcrypt_mod_fini(void) { }
1782
1783module_init(tcrypt_mod_init);
1784module_exit(tcrypt_mod_fini);
1785
1786module_param(alg, charp, 0);
1787module_param(type, uint, 0);
1788module_param(mask, uint, 0);
1789module_param(mode, int, 0);
1790module_param(sec, uint, 0);
1791MODULE_PARM_DESC(sec, "Length in seconds of speed tests "
1792                      "(defaults to zero which uses CPU cycles instead)");
1793
1794MODULE_LICENSE("GPL");
1795MODULE_DESCRIPTION("Quick & dirty crypto testing module");
1796MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");
1797
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.