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