linux/crypto/tcrypt.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * Quick & dirty crypto testing module.
   4 *
   5 * This will only exist until we have a better testing mechanism
   6 * (e.g. a char device).
   7 *
   8 * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
   9 * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
  10 * Copyright (c) 2007 Nokia Siemens Networks
  11 *
  12 * Updated RFC4106 AES-GCM testing.
  13 *    Authors: Aidan O'Mahony (aidan.o.mahony@intel.com)
  14 *             Adrian Hoban <adrian.hoban@intel.com>
  15 *             Gabriele Paoloni <gabriele.paoloni@intel.com>
  16 *             Tadeusz Struk (tadeusz.struk@intel.com)
  17 *             Copyright (c) 2010, Intel Corporation.
  18 */
  19
  20#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  21
  22#include <crypto/aead.h>
  23#include <crypto/hash.h>
  24#include <crypto/skcipher.h>
  25#include <linux/err.h>
  26#include <linux/fips.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
  38/*
  39 * Need slab memory for testing (size in number of pages).
  40 */
  41#define TVMEMSIZE       4
  42
  43/*
  44* Used by test_cipher_speed()
  45*/
  46#define ENCRYPT 1
  47#define DECRYPT 0
  48
  49#define MAX_DIGEST_SIZE         64
  50
  51/*
  52 * return a string with the driver name
  53 */
  54#define get_driver_name(tfm_type, tfm) crypto_tfm_alg_driver_name(tfm_type ## _tfm(tfm))
  55
  56/*
  57 * Used by test_cipher_speed()
  58 */
  59static unsigned int sec;
  60
  61static char *alg = NULL;
  62static u32 type;
  63static u32 mask;
  64static int mode;
  65static u32 num_mb = 8;
  66static unsigned int klen;
  67static char *tvmem[TVMEMSIZE];
  68
  69static const char *check[] = {
  70        "des", "md5", "des3_ede", "rot13", "sha1", "sha224", "sha256", "sm3",
  71        "blowfish", "twofish", "serpent", "sha384", "sha512", "md4", "aes",
  72        "cast6", "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
  73        "khazad", "wp512", "wp384", "wp256", "xeta",  "fcrypt",
  74        "camellia", "seed", "rmd160",
  75        "lzo", "lzo-rle", "cts", "sha3-224", "sha3-256", "sha3-384",
  76        "sha3-512", "streebog256", "streebog512",
  77        NULL
  78};
  79
  80static const int block_sizes[] = { 16, 64, 256, 1024, 1420, 4096, 0 };
  81static const int aead_sizes[] = { 16, 64, 256, 512, 1024, 1420, 4096, 8192, 0 };
  82
  83#define XBUFSIZE 8
  84#define MAX_IVLEN 32
  85
  86static int testmgr_alloc_buf(char *buf[XBUFSIZE])
  87{
  88        int i;
  89
  90        for (i = 0; i < XBUFSIZE; i++) {
  91                buf[i] = (void *)__get_free_page(GFP_KERNEL);
  92                if (!buf[i])
  93                        goto err_free_buf;
  94        }
  95
  96        return 0;
  97
  98err_free_buf:
  99        while (i-- > 0)
 100                free_page((unsigned long)buf[i]);
 101
 102        return -ENOMEM;
 103}
 104
 105static void testmgr_free_buf(char *buf[XBUFSIZE])
 106{
 107        int i;
 108
 109        for (i = 0; i < XBUFSIZE; i++)
 110                free_page((unsigned long)buf[i]);
 111}
 112
 113static void sg_init_aead(struct scatterlist *sg, char *xbuf[XBUFSIZE],
 114                         unsigned int buflen, const void *assoc,
 115                         unsigned int aad_size)
 116{
 117        int np = (buflen + PAGE_SIZE - 1)/PAGE_SIZE;
 118        int k, rem;
 119
 120        if (np > XBUFSIZE) {
 121                rem = PAGE_SIZE;
 122                np = XBUFSIZE;
 123        } else {
 124                rem = buflen % PAGE_SIZE;
 125        }
 126
 127        sg_init_table(sg, np + 1);
 128
 129        sg_set_buf(&sg[0], assoc, aad_size);
 130
 131        if (rem)
 132                np--;
 133        for (k = 0; k < np; k++)
 134                sg_set_buf(&sg[k + 1], xbuf[k], PAGE_SIZE);
 135
 136        if (rem)
 137                sg_set_buf(&sg[k + 1], xbuf[k], rem);
 138}
 139
 140static inline int do_one_aead_op(struct aead_request *req, int ret)
 141{
 142        struct crypto_wait *wait = req->base.data;
 143
 144        return crypto_wait_req(ret, wait);
 145}
 146
 147struct test_mb_aead_data {
 148        struct scatterlist sg[XBUFSIZE];
 149        struct scatterlist sgout[XBUFSIZE];
 150        struct aead_request *req;
 151        struct crypto_wait wait;
 152        char *xbuf[XBUFSIZE];
 153        char *xoutbuf[XBUFSIZE];
 154        char *axbuf[XBUFSIZE];
 155};
 156
 157static int do_mult_aead_op(struct test_mb_aead_data *data, int enc,
 158                                u32 num_mb, int *rc)
 159{
 160        int i, err = 0;
 161
 162        /* Fire up a bunch of concurrent requests */
 163        for (i = 0; i < num_mb; i++) {
 164                if (enc == ENCRYPT)
 165                        rc[i] = crypto_aead_encrypt(data[i].req);
 166                else
 167                        rc[i] = crypto_aead_decrypt(data[i].req);
 168        }
 169
 170        /* Wait for all requests to finish */
 171        for (i = 0; i < num_mb; i++) {
 172                rc[i] = crypto_wait_req(rc[i], &data[i].wait);
 173
 174                if (rc[i]) {
 175                        pr_info("concurrent request %d error %d\n", i, rc[i]);
 176                        err = rc[i];
 177                }
 178        }
 179
 180        return err;
 181}
 182
 183static int test_mb_aead_jiffies(struct test_mb_aead_data *data, int enc,
 184                                int blen, int secs, u32 num_mb)
 185{
 186        unsigned long start, end;
 187        int bcount;
 188        int ret = 0;
 189        int *rc;
 190
 191        rc = kcalloc(num_mb, sizeof(*rc), GFP_KERNEL);
 192        if (!rc)
 193                return -ENOMEM;
 194
 195        for (start = jiffies, end = start + secs * HZ, bcount = 0;
 196             time_before(jiffies, end); bcount++) {
 197                ret = do_mult_aead_op(data, enc, num_mb, rc);
 198                if (ret)
 199                        goto out;
 200        }
 201
 202        pr_cont("%d operations in %d seconds (%llu bytes)\n",
 203                bcount * num_mb, secs, (u64)bcount * blen * num_mb);
 204
 205out:
 206        kfree(rc);
 207        return ret;
 208}
 209
 210static int test_mb_aead_cycles(struct test_mb_aead_data *data, int enc,
 211                               int blen, u32 num_mb)
 212{
 213        unsigned long cycles = 0;
 214        int ret = 0;
 215        int i;
 216        int *rc;
 217
 218        rc = kcalloc(num_mb, sizeof(*rc), GFP_KERNEL);
 219        if (!rc)
 220                return -ENOMEM;
 221
 222        /* Warm-up run. */
 223        for (i = 0; i < 4; i++) {
 224                ret = do_mult_aead_op(data, enc, num_mb, rc);
 225                if (ret)
 226                        goto out;
 227        }
 228
 229        /* The real thing. */
 230        for (i = 0; i < 8; i++) {
 231                cycles_t start, end;
 232
 233                start = get_cycles();
 234                ret = do_mult_aead_op(data, enc, num_mb, rc);
 235                end = get_cycles();
 236
 237                if (ret)
 238                        goto out;
 239
 240                cycles += end - start;
 241        }
 242
 243        pr_cont("1 operation in %lu cycles (%d bytes)\n",
 244                (cycles + 4) / (8 * num_mb), blen);
 245
 246out:
 247        kfree(rc);
 248        return ret;
 249}
 250
 251static void test_mb_aead_speed(const char *algo, int enc, int secs,
 252                               struct aead_speed_template *template,
 253                               unsigned int tcount, u8 authsize,
 254                               unsigned int aad_size, u8 *keysize, u32 num_mb)
 255{
 256        struct test_mb_aead_data *data;
 257        struct crypto_aead *tfm;
 258        unsigned int i, j, iv_len;
 259        const int *b_size;
 260        const char *key;
 261        const char *e;
 262        void *assoc;
 263        char *iv;
 264        int ret;
 265
 266
 267        if (aad_size >= PAGE_SIZE) {
 268                pr_err("associate data length (%u) too big\n", aad_size);
 269                return;
 270        }
 271
 272        iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
 273        if (!iv)
 274                return;
 275
 276        if (enc == ENCRYPT)
 277                e = "encryption";
 278        else
 279                e = "decryption";
 280
 281        data = kcalloc(num_mb, sizeof(*data), GFP_KERNEL);
 282        if (!data)
 283                goto out_free_iv;
 284
 285        tfm = crypto_alloc_aead(algo, 0, 0);
 286        if (IS_ERR(tfm)) {
 287                pr_err("failed to load transform for %s: %ld\n",
 288                        algo, PTR_ERR(tfm));
 289                goto out_free_data;
 290        }
 291
 292        ret = crypto_aead_setauthsize(tfm, authsize);
 293
 294        for (i = 0; i < num_mb; ++i)
 295                if (testmgr_alloc_buf(data[i].xbuf)) {
 296                        while (i--)
 297                                testmgr_free_buf(data[i].xbuf);
 298                        goto out_free_tfm;
 299                }
 300
 301        for (i = 0; i < num_mb; ++i)
 302                if (testmgr_alloc_buf(data[i].axbuf)) {
 303                        while (i--)
 304                                testmgr_free_buf(data[i].axbuf);
 305                        goto out_free_xbuf;
 306                }
 307
 308        for (i = 0; i < num_mb; ++i)
 309                if (testmgr_alloc_buf(data[i].xoutbuf)) {
 310                        while (i--)
 311                                testmgr_free_buf(data[i].xoutbuf);
 312                        goto out_free_axbuf;
 313                }
 314
 315        for (i = 0; i < num_mb; ++i) {
 316                data[i].req = aead_request_alloc(tfm, GFP_KERNEL);
 317                if (!data[i].req) {
 318                        pr_err("alg: skcipher: Failed to allocate request for %s\n",
 319                               algo);
 320                        while (i--)
 321                                aead_request_free(data[i].req);
 322                        goto out_free_xoutbuf;
 323                }
 324        }
 325
 326        for (i = 0; i < num_mb; ++i) {
 327                crypto_init_wait(&data[i].wait);
 328                aead_request_set_callback(data[i].req,
 329                                          CRYPTO_TFM_REQ_MAY_BACKLOG,
 330                                          crypto_req_done, &data[i].wait);
 331        }
 332
 333        pr_info("\ntesting speed of multibuffer %s (%s) %s\n", algo,
 334                get_driver_name(crypto_aead, tfm), e);
 335
 336        i = 0;
 337        do {
 338                b_size = aead_sizes;
 339                do {
 340                        int bs = round_up(*b_size, crypto_aead_blocksize(tfm));
 341
 342                        if (bs + authsize > XBUFSIZE * PAGE_SIZE) {
 343                                pr_err("template (%u) too big for buffer (%lu)\n",
 344                                       authsize + bs,
 345                                       XBUFSIZE * PAGE_SIZE);
 346                                goto out;
 347                        }
 348
 349                        pr_info("test %u (%d bit key, %d byte blocks): ", i,
 350                                *keysize * 8, bs);
 351
 352                        /* Set up tfm global state, i.e. the key */
 353
 354                        memset(tvmem[0], 0xff, PAGE_SIZE);
 355                        key = tvmem[0];
 356                        for (j = 0; j < tcount; j++) {
 357                                if (template[j].klen == *keysize) {
 358                                        key = template[j].key;
 359                                        break;
 360                                }
 361                        }
 362
 363                        crypto_aead_clear_flags(tfm, ~0);
 364
 365                        ret = crypto_aead_setkey(tfm, key, *keysize);
 366                        if (ret) {
 367                                pr_err("setkey() failed flags=%x\n",
 368                                       crypto_aead_get_flags(tfm));
 369                                goto out;
 370                        }
 371
 372                        iv_len = crypto_aead_ivsize(tfm);
 373                        if (iv_len)
 374                                memset(iv, 0xff, iv_len);
 375
 376                        /* Now setup per request stuff, i.e. buffers */
 377
 378                        for (j = 0; j < num_mb; ++j) {
 379                                struct test_mb_aead_data *cur = &data[j];
 380
 381                                assoc = cur->axbuf[0];
 382                                memset(assoc, 0xff, aad_size);
 383
 384                                sg_init_aead(cur->sg, cur->xbuf,
 385                                             bs + (enc ? 0 : authsize),
 386                                             assoc, aad_size);
 387
 388                                sg_init_aead(cur->sgout, cur->xoutbuf,
 389                                             bs + (enc ? authsize : 0),
 390                                             assoc, aad_size);
 391
 392                                aead_request_set_ad(cur->req, aad_size);
 393
 394                                if (!enc) {
 395
 396                                        aead_request_set_crypt(cur->req,
 397                                                               cur->sgout,
 398                                                               cur->sg,
 399                                                               bs, iv);
 400                                        ret = crypto_aead_encrypt(cur->req);
 401                                        ret = do_one_aead_op(cur->req, ret);
 402
 403                                        if (ret) {
 404                                                pr_err("calculating auth failed (%d)\n",
 405                                                       ret);
 406                                                break;
 407                                        }
 408                                }
 409
 410                                aead_request_set_crypt(cur->req, cur->sg,
 411                                                       cur->sgout, bs +
 412                                                       (enc ? 0 : authsize),
 413                                                       iv);
 414
 415                        }
 416
 417                        if (secs) {
 418                                ret = test_mb_aead_jiffies(data, enc, bs,
 419                                                           secs, num_mb);
 420                                cond_resched();
 421                        } else {
 422                                ret = test_mb_aead_cycles(data, enc, bs,
 423                                                          num_mb);
 424                        }
 425
 426                        if (ret) {
 427                                pr_err("%s() failed return code=%d\n", e, ret);
 428                                break;
 429                        }
 430                        b_size++;
 431                        i++;
 432                } while (*b_size);
 433                keysize++;
 434        } while (*keysize);
 435
 436out:
 437        for (i = 0; i < num_mb; ++i)
 438                aead_request_free(data[i].req);
 439out_free_xoutbuf:
 440        for (i = 0; i < num_mb; ++i)
 441                testmgr_free_buf(data[i].xoutbuf);
 442out_free_axbuf:
 443        for (i = 0; i < num_mb; ++i)
 444                testmgr_free_buf(data[i].axbuf);
 445out_free_xbuf:
 446        for (i = 0; i < num_mb; ++i)
 447                testmgr_free_buf(data[i].xbuf);
 448out_free_tfm:
 449        crypto_free_aead(tfm);
 450out_free_data:
 451        kfree(data);
 452out_free_iv:
 453        kfree(iv);
 454}
 455
 456static int test_aead_jiffies(struct aead_request *req, int enc,
 457                                int blen, int secs)
 458{
 459        unsigned long start, end;
 460        int bcount;
 461        int ret;
 462
 463        for (start = jiffies, end = start + secs * HZ, bcount = 0;
 464             time_before(jiffies, end); bcount++) {
 465                if (enc)
 466                        ret = do_one_aead_op(req, crypto_aead_encrypt(req));
 467                else
 468                        ret = do_one_aead_op(req, crypto_aead_decrypt(req));
 469
 470                if (ret)
 471                        return ret;
 472        }
 473
 474        pr_cont("%d operations in %d seconds (%llu bytes)\n",
 475                bcount, secs, (u64)bcount * blen);
 476        return 0;
 477}
 478
 479static int test_aead_cycles(struct aead_request *req, int enc, int blen)
 480{
 481        unsigned long cycles = 0;
 482        int ret = 0;
 483        int i;
 484
 485        /* Warm-up run. */
 486        for (i = 0; i < 4; i++) {
 487                if (enc)
 488                        ret = do_one_aead_op(req, crypto_aead_encrypt(req));
 489                else
 490                        ret = do_one_aead_op(req, crypto_aead_decrypt(req));
 491
 492                if (ret)
 493                        goto out;
 494        }
 495
 496        /* The real thing. */
 497        for (i = 0; i < 8; i++) {
 498                cycles_t start, end;
 499
 500                start = get_cycles();
 501                if (enc)
 502                        ret = do_one_aead_op(req, crypto_aead_encrypt(req));
 503                else
 504                        ret = do_one_aead_op(req, crypto_aead_decrypt(req));
 505                end = get_cycles();
 506
 507                if (ret)
 508                        goto out;
 509
 510                cycles += end - start;
 511        }
 512
 513out:
 514        if (ret == 0)
 515                printk("1 operation in %lu cycles (%d bytes)\n",
 516                       (cycles + 4) / 8, blen);
 517
 518        return ret;
 519}
 520
 521static void test_aead_speed(const char *algo, int enc, unsigned int secs,
 522                            struct aead_speed_template *template,
 523                            unsigned int tcount, u8 authsize,
 524                            unsigned int aad_size, u8 *keysize)
 525{
 526        unsigned int i, j;
 527        struct crypto_aead *tfm;
 528        int ret = -ENOMEM;
 529        const char *key;
 530        struct aead_request *req;
 531        struct scatterlist *sg;
 532        struct scatterlist *sgout;
 533        const char *e;
 534        void *assoc;
 535        char *iv;
 536        char *xbuf[XBUFSIZE];
 537        char *xoutbuf[XBUFSIZE];
 538        char *axbuf[XBUFSIZE];
 539        const int *b_size;
 540        unsigned int iv_len;
 541        struct crypto_wait wait;
 542
 543        iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
 544        if (!iv)
 545                return;
 546
 547        if (aad_size >= PAGE_SIZE) {
 548                pr_err("associate data length (%u) too big\n", aad_size);
 549                goto out_noxbuf;
 550        }
 551
 552        if (enc == ENCRYPT)
 553                e = "encryption";
 554        else
 555                e = "decryption";
 556
 557        if (testmgr_alloc_buf(xbuf))
 558                goto out_noxbuf;
 559        if (testmgr_alloc_buf(axbuf))
 560                goto out_noaxbuf;
 561        if (testmgr_alloc_buf(xoutbuf))
 562                goto out_nooutbuf;
 563
 564        sg = kmalloc(sizeof(*sg) * 9 * 2, GFP_KERNEL);
 565        if (!sg)
 566                goto out_nosg;
 567        sgout = &sg[9];
 568
 569        tfm = crypto_alloc_aead(algo, 0, 0);
 570
 571        if (IS_ERR(tfm)) {
 572                pr_err("alg: aead: Failed to load transform for %s: %ld\n", algo,
 573                       PTR_ERR(tfm));
 574                goto out_notfm;
 575        }
 576
 577        crypto_init_wait(&wait);
 578        printk(KERN_INFO "\ntesting speed of %s (%s) %s\n", algo,
 579                        get_driver_name(crypto_aead, tfm), e);
 580
 581        req = aead_request_alloc(tfm, GFP_KERNEL);
 582        if (!req) {
 583                pr_err("alg: aead: Failed to allocate request for %s\n",
 584                       algo);
 585                goto out_noreq;
 586        }
 587
 588        aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
 589                                  crypto_req_done, &wait);
 590
 591        i = 0;
 592        do {
 593                b_size = aead_sizes;
 594                do {
 595                        u32 bs = round_up(*b_size, crypto_aead_blocksize(tfm));
 596
 597                        assoc = axbuf[0];
 598                        memset(assoc, 0xff, aad_size);
 599
 600                        if ((*keysize + bs) > TVMEMSIZE * PAGE_SIZE) {
 601                                pr_err("template (%u) too big for tvmem (%lu)\n",
 602                                       *keysize + bs,
 603                                        TVMEMSIZE * PAGE_SIZE);
 604                                goto out;
 605                        }
 606
 607                        key = tvmem[0];
 608                        for (j = 0; j < tcount; j++) {
 609                                if (template[j].klen == *keysize) {
 610                                        key = template[j].key;
 611                                        break;
 612                                }
 613                        }
 614                        ret = crypto_aead_setkey(tfm, key, *keysize);
 615                        ret = crypto_aead_setauthsize(tfm, authsize);
 616
 617                        iv_len = crypto_aead_ivsize(tfm);
 618                        if (iv_len)
 619                                memset(iv, 0xff, iv_len);
 620
 621                        crypto_aead_clear_flags(tfm, ~0);
 622                        printk(KERN_INFO "test %u (%d bit key, %d byte blocks): ",
 623                                        i, *keysize * 8, bs);
 624
 625
 626                        memset(tvmem[0], 0xff, PAGE_SIZE);
 627
 628                        if (ret) {
 629                                pr_err("setkey() failed flags=%x\n",
 630                                                crypto_aead_get_flags(tfm));
 631                                goto out;
 632                        }
 633
 634                        sg_init_aead(sg, xbuf, bs + (enc ? 0 : authsize),
 635                                     assoc, aad_size);
 636
 637                        sg_init_aead(sgout, xoutbuf,
 638                                     bs + (enc ? authsize : 0), assoc,
 639                                     aad_size);
 640
 641                        aead_request_set_ad(req, aad_size);
 642
 643                        if (!enc) {
 644
 645                                /*
 646                                 * For decryption we need a proper auth so
 647                                 * we do the encryption path once with buffers
 648                                 * reversed (input <-> output) to calculate it
 649                                 */
 650                                aead_request_set_crypt(req, sgout, sg,
 651                                                       bs, iv);
 652                                ret = do_one_aead_op(req,
 653                                                     crypto_aead_encrypt(req));
 654
 655                                if (ret) {
 656                                        pr_err("calculating auth failed (%d)\n",
 657                                               ret);
 658                                        break;
 659                                }
 660                        }
 661
 662                        aead_request_set_crypt(req, sg, sgout,
 663                                               bs + (enc ? 0 : authsize),
 664                                               iv);
 665
 666                        if (secs) {
 667                                ret = test_aead_jiffies(req, enc, bs,
 668                                                        secs);
 669                                cond_resched();
 670                        } else {
 671                                ret = test_aead_cycles(req, enc, bs);
 672                        }
 673
 674                        if (ret) {
 675                                pr_err("%s() failed return code=%d\n", e, ret);
 676                                break;
 677                        }
 678                        b_size++;
 679                        i++;
 680                } while (*b_size);
 681                keysize++;
 682        } while (*keysize);
 683
 684out:
 685        aead_request_free(req);
 686out_noreq:
 687        crypto_free_aead(tfm);
 688out_notfm:
 689        kfree(sg);
 690out_nosg:
 691        testmgr_free_buf(xoutbuf);
 692out_nooutbuf:
 693        testmgr_free_buf(axbuf);
 694out_noaxbuf:
 695        testmgr_free_buf(xbuf);
 696out_noxbuf:
 697        kfree(iv);
 698}
 699
 700static void test_hash_sg_init(struct scatterlist *sg)
 701{
 702        int i;
 703
 704        sg_init_table(sg, TVMEMSIZE);
 705        for (i = 0; i < TVMEMSIZE; i++) {
 706                sg_set_buf(sg + i, tvmem[i], PAGE_SIZE);
 707                memset(tvmem[i], 0xff, PAGE_SIZE);
 708        }
 709}
 710
 711static inline int do_one_ahash_op(struct ahash_request *req, int ret)
 712{
 713        struct crypto_wait *wait = req->base.data;
 714
 715        return crypto_wait_req(ret, wait);
 716}
 717
 718struct test_mb_ahash_data {
 719        struct scatterlist sg[XBUFSIZE];
 720        char result[64];
 721        struct ahash_request *req;
 722        struct crypto_wait wait;
 723        char *xbuf[XBUFSIZE];
 724};
 725
 726static inline int do_mult_ahash_op(struct test_mb_ahash_data *data, u32 num_mb,
 727                                   int *rc)
 728{
 729        int i, err = 0;
 730
 731        /* Fire up a bunch of concurrent requests */
 732        for (i = 0; i < num_mb; i++)
 733                rc[i] = crypto_ahash_digest(data[i].req);
 734
 735        /* Wait for all requests to finish */
 736        for (i = 0; i < num_mb; i++) {
 737                rc[i] = crypto_wait_req(rc[i], &data[i].wait);
 738
 739                if (rc[i]) {
 740                        pr_info("concurrent request %d error %d\n", i, rc[i]);
 741                        err = rc[i];
 742                }
 743        }
 744
 745        return err;
 746}
 747
 748static int test_mb_ahash_jiffies(struct test_mb_ahash_data *data, int blen,
 749                                 int secs, u32 num_mb)
 750{
 751        unsigned long start, end;
 752        int bcount;
 753        int ret = 0;
 754        int *rc;
 755
 756        rc = kcalloc(num_mb, sizeof(*rc), GFP_KERNEL);
 757        if (!rc)
 758                return -ENOMEM;
 759
 760        for (start = jiffies, end = start + secs * HZ, bcount = 0;
 761             time_before(jiffies, end); bcount++) {
 762                ret = do_mult_ahash_op(data, num_mb, rc);
 763                if (ret)
 764                        goto out;
 765        }
 766
 767        pr_cont("%d operations in %d seconds (%llu bytes)\n",
 768                bcount * num_mb, secs, (u64)bcount * blen * num_mb);
 769
 770out:
 771        kfree(rc);
 772        return ret;
 773}
 774
 775static int test_mb_ahash_cycles(struct test_mb_ahash_data *data, int blen,
 776                                u32 num_mb)
 777{
 778        unsigned long cycles = 0;
 779        int ret = 0;
 780        int i;
 781        int *rc;
 782
 783        rc = kcalloc(num_mb, sizeof(*rc), GFP_KERNEL);
 784        if (!rc)
 785                return -ENOMEM;
 786
 787        /* Warm-up run. */
 788        for (i = 0; i < 4; i++) {
 789                ret = do_mult_ahash_op(data, num_mb, rc);
 790                if (ret)
 791                        goto out;
 792        }
 793
 794        /* The real thing. */
 795        for (i = 0; i < 8; i++) {
 796                cycles_t start, end;
 797
 798                start = get_cycles();
 799                ret = do_mult_ahash_op(data, num_mb, rc);
 800                end = get_cycles();
 801
 802                if (ret)
 803                        goto out;
 804
 805                cycles += end - start;
 806        }
 807
 808        pr_cont("1 operation in %lu cycles (%d bytes)\n",
 809                (cycles + 4) / (8 * num_mb), blen);
 810
 811out:
 812        kfree(rc);
 813        return ret;
 814}
 815
 816static void test_mb_ahash_speed(const char *algo, unsigned int secs,
 817                                struct hash_speed *speed, u32 num_mb)
 818{
 819        struct test_mb_ahash_data *data;
 820        struct crypto_ahash *tfm;
 821        unsigned int i, j, k;
 822        int ret;
 823
 824        data = kcalloc(num_mb, sizeof(*data), GFP_KERNEL);
 825        if (!data)
 826                return;
 827
 828        tfm = crypto_alloc_ahash(algo, 0, 0);
 829        if (IS_ERR(tfm)) {
 830                pr_err("failed to load transform for %s: %ld\n",
 831                        algo, PTR_ERR(tfm));
 832                goto free_data;
 833        }
 834
 835        for (i = 0; i < num_mb; ++i) {
 836                if (testmgr_alloc_buf(data[i].xbuf))
 837                        goto out;
 838
 839                crypto_init_wait(&data[i].wait);
 840
 841                data[i].req = ahash_request_alloc(tfm, GFP_KERNEL);
 842                if (!data[i].req) {
 843                        pr_err("alg: hash: Failed to allocate request for %s\n",
 844                               algo);
 845                        goto out;
 846                }
 847
 848                ahash_request_set_callback(data[i].req, 0, crypto_req_done,
 849                                           &data[i].wait);
 850
 851                sg_init_table(data[i].sg, XBUFSIZE);
 852                for (j = 0; j < XBUFSIZE; j++) {
 853                        sg_set_buf(data[i].sg + j, data[i].xbuf[j], PAGE_SIZE);
 854                        memset(data[i].xbuf[j], 0xff, PAGE_SIZE);
 855                }
 856        }
 857
 858        pr_info("\ntesting speed of multibuffer %s (%s)\n", algo,
 859                get_driver_name(crypto_ahash, tfm));
 860
 861        for (i = 0; speed[i].blen != 0; i++) {
 862                /* For some reason this only tests digests. */
 863                if (speed[i].blen != speed[i].plen)
 864                        continue;
 865
 866                if (speed[i].blen > XBUFSIZE * PAGE_SIZE) {
 867                        pr_err("template (%u) too big for tvmem (%lu)\n",
 868                               speed[i].blen, XBUFSIZE * PAGE_SIZE);
 869                        goto out;
 870                }
 871
 872                if (klen)
 873                        crypto_ahash_setkey(tfm, tvmem[0], klen);
 874
 875                for (k = 0; k < num_mb; k++)
 876                        ahash_request_set_crypt(data[k].req, data[k].sg,
 877                                                data[k].result, speed[i].blen);
 878
 879                pr_info("test%3u "
 880                        "(%5u byte blocks,%5u bytes per update,%4u updates): ",
 881                        i, speed[i].blen, speed[i].plen,
 882                        speed[i].blen / speed[i].plen);
 883
 884                if (secs) {
 885                        ret = test_mb_ahash_jiffies(data, speed[i].blen, secs,
 886                                                    num_mb);
 887                        cond_resched();
 888                } else {
 889                        ret = test_mb_ahash_cycles(data, speed[i].blen, num_mb);
 890                }
 891
 892
 893                if (ret) {
 894                        pr_err("At least one hashing failed ret=%d\n", ret);
 895                        break;
 896                }
 897        }
 898
 899out:
 900        for (k = 0; k < num_mb; ++k)
 901                ahash_request_free(data[k].req);
 902
 903        for (k = 0; k < num_mb; ++k)
 904                testmgr_free_buf(data[k].xbuf);
 905
 906        crypto_free_ahash(tfm);
 907
 908free_data:
 909        kfree(data);
 910}
 911
 912static int test_ahash_jiffies_digest(struct ahash_request *req, int blen,
 913                                     char *out, int secs)
 914{
 915        unsigned long start, end;
 916        int bcount;
 917        int ret;
 918
 919        for (start = jiffies, end = start + secs * HZ, bcount = 0;
 920             time_before(jiffies, end); bcount++) {
 921                ret = do_one_ahash_op(req, crypto_ahash_digest(req));
 922                if (ret)
 923                        return ret;
 924        }
 925
 926        printk("%6u opers/sec, %9lu bytes/sec\n",
 927               bcount / secs, ((long)bcount * blen) / secs);
 928
 929        return 0;
 930}
 931
 932static int test_ahash_jiffies(struct ahash_request *req, int blen,
 933                              int plen, char *out, int secs)
 934{
 935        unsigned long start, end;
 936        int bcount, pcount;
 937        int ret;
 938
 939        if (plen == blen)
 940                return test_ahash_jiffies_digest(req, blen, out, secs);
 941
 942        for (start = jiffies, end = start + secs * HZ, bcount = 0;
 943             time_before(jiffies, end); bcount++) {
 944                ret = do_one_ahash_op(req, crypto_ahash_init(req));
 945                if (ret)
 946                        return ret;
 947                for (pcount = 0; pcount < blen; pcount += plen) {
 948                        ret = do_one_ahash_op(req, crypto_ahash_update(req));
 949                        if (ret)
 950                                return ret;
 951                }
 952                /* we assume there is enough space in 'out' for the result */
 953                ret = do_one_ahash_op(req, crypto_ahash_final(req));
 954                if (ret)
 955                        return ret;
 956        }
 957
 958        pr_cont("%6u opers/sec, %9lu bytes/sec\n",
 959                bcount / secs, ((long)bcount * blen) / secs);
 960
 961        return 0;
 962}
 963
 964static int test_ahash_cycles_digest(struct ahash_request *req, int blen,
 965                                    char *out)
 966{
 967        unsigned long cycles = 0;
 968        int ret, i;
 969
 970        /* Warm-up run. */
 971        for (i = 0; i < 4; i++) {
 972                ret = do_one_ahash_op(req, crypto_ahash_digest(req));
 973                if (ret)
 974                        goto out;
 975        }
 976
 977        /* The real thing. */
 978        for (i = 0; i < 8; i++) {
 979                cycles_t start, end;
 980
 981                start = get_cycles();
 982
 983                ret = do_one_ahash_op(req, crypto_ahash_digest(req));
 984                if (ret)
 985                        goto out;
 986
 987                end = get_cycles();
 988
 989                cycles += end - start;
 990        }
 991
 992out:
 993        if (ret)
 994                return ret;
 995
 996        pr_cont("%6lu cycles/operation, %4lu cycles/byte\n",
 997                cycles / 8, cycles / (8 * blen));
 998
 999        return 0;
1000}
1001
1002static int test_ahash_cycles(struct ahash_request *req, int blen,
1003                             int plen, char *out)
1004{
1005        unsigned long cycles = 0;
1006        int i, pcount, ret;
1007
1008        if (plen == blen)
1009                return test_ahash_cycles_digest(req, blen, out);
1010
1011        /* Warm-up run. */
1012        for (i = 0; i < 4; i++) {
1013                ret = do_one_ahash_op(req, crypto_ahash_init(req));
1014                if (ret)
1015                        goto out;
1016                for (pcount = 0; pcount < blen; pcount += plen) {
1017                        ret = do_one_ahash_op(req, crypto_ahash_update(req));
1018                        if (ret)
1019                                goto out;
1020                }
1021                ret = do_one_ahash_op(req, crypto_ahash_final(req));
1022                if (ret)
1023                        goto out;
1024        }
1025
1026        /* The real thing. */
1027        for (i = 0; i < 8; i++) {
1028                cycles_t start, end;
1029
1030                start = get_cycles();
1031
1032                ret = do_one_ahash_op(req, crypto_ahash_init(req));
1033                if (ret)
1034                        goto out;
1035                for (pcount = 0; pcount < blen; pcount += plen) {
1036                        ret = do_one_ahash_op(req, crypto_ahash_update(req));
1037                        if (ret)
1038                                goto out;
1039                }
1040                ret = do_one_ahash_op(req, crypto_ahash_final(req));
1041                if (ret)
1042                        goto out;
1043
1044                end = get_cycles();
1045
1046                cycles += end - start;
1047        }
1048
1049out:
1050        if (ret)
1051                return ret;
1052
1053        pr_cont("%6lu cycles/operation, %4lu cycles/byte\n",
1054                cycles / 8, cycles / (8 * blen));
1055
1056        return 0;
1057}
1058
1059static void test_ahash_speed_common(const char *algo, unsigned int secs,
1060                                    struct hash_speed *speed, unsigned mask)
1061{
1062        struct scatterlist sg[TVMEMSIZE];
1063        struct crypto_wait wait;
1064        struct ahash_request *req;
1065        struct crypto_ahash *tfm;
1066        char *output;
1067        int i, ret;
1068
1069        tfm = crypto_alloc_ahash(algo, 0, mask);
1070        if (IS_ERR(tfm)) {
1071                pr_err("failed to load transform for %s: %ld\n",
1072                       algo, PTR_ERR(tfm));
1073                return;
1074        }
1075
1076        printk(KERN_INFO "\ntesting speed of async %s (%s)\n", algo,
1077                        get_driver_name(crypto_ahash, tfm));
1078
1079        if (crypto_ahash_digestsize(tfm) > MAX_DIGEST_SIZE) {
1080                pr_err("digestsize(%u) > %d\n", crypto_ahash_digestsize(tfm),
1081                       MAX_DIGEST_SIZE);
1082                goto out;
1083        }
1084
1085        test_hash_sg_init(sg);
1086        req = ahash_request_alloc(tfm, GFP_KERNEL);
1087        if (!req) {
1088                pr_err("ahash request allocation failure\n");
1089                goto out;
1090        }
1091
1092        crypto_init_wait(&wait);
1093        ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1094                                   crypto_req_done, &wait);
1095
1096        output = kmalloc(MAX_DIGEST_SIZE, GFP_KERNEL);
1097        if (!output)
1098                goto out_nomem;
1099
1100        for (i = 0; speed[i].blen != 0; i++) {
1101                if (speed[i].blen > TVMEMSIZE * PAGE_SIZE) {
1102                        pr_err("template (%u) too big for tvmem (%lu)\n",
1103                               speed[i].blen, TVMEMSIZE * PAGE_SIZE);
1104                        break;
1105                }
1106
1107                if (klen)
1108                        crypto_ahash_setkey(tfm, tvmem[0], klen);
1109
1110                pr_info("test%3u "
1111                        "(%5u byte blocks,%5u bytes per update,%4u updates): ",
1112                        i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen);
1113
1114                ahash_request_set_crypt(req, sg, output, speed[i].plen);
1115
1116                if (secs) {
1117                        ret = test_ahash_jiffies(req, speed[i].blen,
1118                                                 speed[i].plen, output, secs);
1119                        cond_resched();
1120                } else {
1121                        ret = test_ahash_cycles(req, speed[i].blen,
1122                                                speed[i].plen, output);
1123                }
1124
1125                if (ret) {
1126                        pr_err("hashing failed ret=%d\n", ret);
1127                        break;
1128                }
1129        }
1130
1131        kfree(output);
1132
1133out_nomem:
1134        ahash_request_free(req);
1135
1136out:
1137        crypto_free_ahash(tfm);
1138}
1139
1140static void test_ahash_speed(const char *algo, unsigned int secs,
1141                             struct hash_speed *speed)
1142{
1143        return test_ahash_speed_common(algo, secs, speed, 0);
1144}
1145
1146static void test_hash_speed(const char *algo, unsigned int secs,
1147                            struct hash_speed *speed)
1148{
1149        return test_ahash_speed_common(algo, secs, speed, CRYPTO_ALG_ASYNC);
1150}
1151
1152struct test_mb_skcipher_data {
1153        struct scatterlist sg[XBUFSIZE];
1154        struct skcipher_request *req;
1155        struct crypto_wait wait;
1156        char *xbuf[XBUFSIZE];
1157};
1158
1159static int do_mult_acipher_op(struct test_mb_skcipher_data *data, int enc,
1160                                u32 num_mb, int *rc)
1161{
1162        int i, err = 0;
1163
1164        /* Fire up a bunch of concurrent requests */
1165        for (i = 0; i < num_mb; i++) {
1166                if (enc == ENCRYPT)
1167                        rc[i] = crypto_skcipher_encrypt(data[i].req);
1168                else
1169                        rc[i] = crypto_skcipher_decrypt(data[i].req);
1170        }
1171
1172        /* Wait for all requests to finish */
1173        for (i = 0; i < num_mb; i++) {
1174                rc[i] = crypto_wait_req(rc[i], &data[i].wait);
1175
1176                if (rc[i]) {
1177                        pr_info("concurrent request %d error %d\n", i, rc[i]);
1178                        err = rc[i];
1179                }
1180        }
1181
1182        return err;
1183}
1184
1185static int test_mb_acipher_jiffies(struct test_mb_skcipher_data *data, int enc,
1186                                int blen, int secs, u32 num_mb)
1187{
1188        unsigned long start, end;
1189        int bcount;
1190        int ret = 0;
1191        int *rc;
1192
1193        rc = kcalloc(num_mb, sizeof(*rc), GFP_KERNEL);
1194        if (!rc)
1195                return -ENOMEM;
1196
1197        for (start = jiffies, end = start + secs * HZ, bcount = 0;
1198             time_before(jiffies, end); bcount++) {
1199                ret = do_mult_acipher_op(data, enc, num_mb, rc);
1200                if (ret)
1201                        goto out;
1202        }
1203
1204        pr_cont("%d operations in %d seconds (%llu bytes)\n",
1205                bcount * num_mb, secs, (u64)bcount * blen * num_mb);
1206
1207out:
1208        kfree(rc);
1209        return ret;
1210}
1211
1212static int test_mb_acipher_cycles(struct test_mb_skcipher_data *data, int enc,
1213                               int blen, u32 num_mb)
1214{
1215        unsigned long cycles = 0;
1216        int ret = 0;
1217        int i;
1218        int *rc;
1219
1220        rc = kcalloc(num_mb, sizeof(*rc), GFP_KERNEL);
1221        if (!rc)
1222                return -ENOMEM;
1223
1224        /* Warm-up run. */
1225        for (i = 0; i < 4; i++) {
1226                ret = do_mult_acipher_op(data, enc, num_mb, rc);
1227                if (ret)
1228                        goto out;
1229        }
1230
1231        /* The real thing. */
1232        for (i = 0; i < 8; i++) {
1233                cycles_t start, end;
1234
1235                start = get_cycles();
1236                ret = do_mult_acipher_op(data, enc, num_mb, rc);
1237                end = get_cycles();
1238
1239                if (ret)
1240                        goto out;
1241
1242                cycles += end - start;
1243        }
1244
1245        pr_cont("1 operation in %lu cycles (%d bytes)\n",
1246                (cycles + 4) / (8 * num_mb), blen);
1247
1248out:
1249        kfree(rc);
1250        return ret;
1251}
1252
1253static void test_mb_skcipher_speed(const char *algo, int enc, int secs,
1254                                   struct cipher_speed_template *template,
1255                                   unsigned int tcount, u8 *keysize, u32 num_mb)
1256{
1257        struct test_mb_skcipher_data *data;
1258        struct crypto_skcipher *tfm;
1259        unsigned int i, j, iv_len;
1260        const int *b_size;
1261        const char *key;
1262        const char *e;
1263        char iv[128];
1264        int ret;
1265
1266        if (enc == ENCRYPT)
1267                e = "encryption";
1268        else
1269                e = "decryption";
1270
1271        data = kcalloc(num_mb, sizeof(*data), GFP_KERNEL);
1272        if (!data)
1273                return;
1274
1275        tfm = crypto_alloc_skcipher(algo, 0, 0);
1276        if (IS_ERR(tfm)) {
1277                pr_err("failed to load transform for %s: %ld\n",
1278                        algo, PTR_ERR(tfm));
1279                goto out_free_data;
1280        }
1281
1282        for (i = 0; i < num_mb; ++i)
1283                if (testmgr_alloc_buf(data[i].xbuf)) {
1284                        while (i--)
1285                                testmgr_free_buf(data[i].xbuf);
1286                        goto out_free_tfm;
1287                }
1288
1289
1290        for (i = 0; i < num_mb; ++i)
1291                if (testmgr_alloc_buf(data[i].xbuf)) {
1292                        while (i--)
1293                                testmgr_free_buf(data[i].xbuf);
1294                        goto out_free_tfm;
1295                }
1296
1297
1298        for (i = 0; i < num_mb; ++i) {
1299                data[i].req = skcipher_request_alloc(tfm, GFP_KERNEL);
1300                if (!data[i].req) {
1301                        pr_err("alg: skcipher: Failed to allocate request for %s\n",
1302                               algo);
1303                        while (i--)
1304                                skcipher_request_free(data[i].req);
1305                        goto out_free_xbuf;
1306                }
1307        }
1308
1309        for (i = 0; i < num_mb; ++i) {
1310                skcipher_request_set_callback(data[i].req,
1311                                              CRYPTO_TFM_REQ_MAY_BACKLOG,
1312                                              crypto_req_done, &data[i].wait);
1313                crypto_init_wait(&data[i].wait);
1314        }
1315
1316        pr_info("\ntesting speed of multibuffer %s (%s) %s\n", algo,
1317                get_driver_name(crypto_skcipher, tfm), e);
1318
1319        i = 0;
1320        do {
1321                b_size = block_sizes;
1322                do {
1323                        u32 bs = round_up(*b_size, crypto_skcipher_blocksize(tfm));
1324
1325                        if (bs > XBUFSIZE * PAGE_SIZE) {
1326                                pr_err("template (%u) too big for buffer (%lu)\n",
1327                                       *b_size, XBUFSIZE * PAGE_SIZE);
1328                                goto out;
1329                        }
1330
1331                        pr_info("test %u (%d bit key, %d byte blocks): ", i,
1332                                *keysize * 8, bs);
1333
1334                        /* Set up tfm global state, i.e. the key */
1335
1336                        memset(tvmem[0], 0xff, PAGE_SIZE);
1337                        key = tvmem[0];
1338                        for (j = 0; j < tcount; j++) {
1339                                if (template[j].klen == *keysize) {
1340                                        key = template[j].key;
1341                                        break;
1342                                }
1343                        }
1344
1345                        crypto_skcipher_clear_flags(tfm, ~0);
1346
1347                        ret = crypto_skcipher_setkey(tfm, key, *keysize);
1348                        if (ret) {
1349                                pr_err("setkey() failed flags=%x\n",
1350                                       crypto_skcipher_get_flags(tfm));
1351                                goto out;
1352                        }
1353
1354                        iv_len = crypto_skcipher_ivsize(tfm);
1355                        if (iv_len)
1356                                memset(&iv, 0xff, iv_len);
1357
1358                        /* Now setup per request stuff, i.e. buffers */
1359
1360                        for (j = 0; j < num_mb; ++j) {
1361                                struct test_mb_skcipher_data *cur = &data[j];
1362                                unsigned int k = bs;
1363                                unsigned int pages = DIV_ROUND_UP(k, PAGE_SIZE);
1364                                unsigned int p = 0;
1365
1366                                sg_init_table(cur->sg, pages);
1367
1368                                while (k > PAGE_SIZE) {
1369                                        sg_set_buf(cur->sg + p, cur->xbuf[p],
1370                                                   PAGE_SIZE);
1371                                        memset(cur->xbuf[p], 0xff, PAGE_SIZE);
1372                                        p++;
1373                                        k -= PAGE_SIZE;
1374                                }
1375
1376                                sg_set_buf(cur->sg + p, cur->xbuf[p], k);
1377                                memset(cur->xbuf[p], 0xff, k);
1378
1379                                skcipher_request_set_crypt(cur->req, cur->sg,
1380                                                           cur->sg, *b_size,
1381                                                           iv);
1382                        }
1383
1384                        if (secs) {
1385                                ret = test_mb_acipher_jiffies(data, enc,
1386                                                              bs, secs,
1387                                                              num_mb);
1388                                cond_resched();
1389                        } else {
1390                                ret = test_mb_acipher_cycles(data, enc,
1391                                                             bs, num_mb);
1392                        }
1393
1394                        if (ret) {
1395                                pr_err("%s() failed flags=%x\n", e,
1396                                       crypto_skcipher_get_flags(tfm));
1397                                break;
1398                        }
1399                        b_size++;
1400                        i++;
1401                } while (*b_size);
1402                keysize++;
1403        } while (*keysize);
1404
1405out:
1406        for (i = 0; i < num_mb; ++i)
1407                skcipher_request_free(data[i].req);
1408out_free_xbuf:
1409        for (i = 0; i < num_mb; ++i)
1410                testmgr_free_buf(data[i].xbuf);
1411out_free_tfm:
1412        crypto_free_skcipher(tfm);
1413out_free_data:
1414        kfree(data);
1415}
1416
1417static inline int do_one_acipher_op(struct skcipher_request *req, int ret)
1418{
1419        struct crypto_wait *wait = req->base.data;
1420
1421        return crypto_wait_req(ret, wait);
1422}
1423
1424static int test_acipher_jiffies(struct skcipher_request *req, int enc,
1425                                int blen, int secs)
1426{
1427        unsigned long start, end;
1428        int bcount;
1429        int ret;
1430
1431        for (start = jiffies, end = start + secs * HZ, bcount = 0;
1432             time_before(jiffies, end); bcount++) {
1433                if (enc)
1434                        ret = do_one_acipher_op(req,
1435                                                crypto_skcipher_encrypt(req));
1436                else
1437                        ret = do_one_acipher_op(req,
1438                                                crypto_skcipher_decrypt(req));
1439
1440                if (ret)
1441                        return ret;
1442        }
1443
1444        pr_cont("%d operations in %d seconds (%llu bytes)\n",
1445                bcount, secs, (u64)bcount * blen);
1446        return 0;
1447}
1448
1449static int test_acipher_cycles(struct skcipher_request *req, int enc,
1450                               int blen)
1451{
1452        unsigned long cycles = 0;
1453        int ret = 0;
1454        int i;
1455
1456        /* Warm-up run. */
1457        for (i = 0; i < 4; i++) {
1458                if (enc)
1459                        ret = do_one_acipher_op(req,
1460                                                crypto_skcipher_encrypt(req));
1461                else
1462                        ret = do_one_acipher_op(req,
1463                                                crypto_skcipher_decrypt(req));
1464
1465                if (ret)
1466                        goto out;
1467        }
1468
1469        /* The real thing. */
1470        for (i = 0; i < 8; i++) {
1471                cycles_t start, end;
1472
1473                start = get_cycles();
1474                if (enc)
1475                        ret = do_one_acipher_op(req,
1476                                                crypto_skcipher_encrypt(req));
1477                else
1478                        ret = do_one_acipher_op(req,
1479                                                crypto_skcipher_decrypt(req));
1480                end = get_cycles();
1481
1482                if (ret)
1483                        goto out;
1484
1485                cycles += end - start;
1486        }
1487
1488out:
1489        if (ret == 0)
1490                pr_cont("1 operation in %lu cycles (%d bytes)\n",
1491                        (cycles + 4) / 8, blen);
1492
1493        return ret;
1494}
1495
1496static void test_skcipher_speed(const char *algo, int enc, unsigned int secs,
1497                                struct cipher_speed_template *template,
1498                                unsigned int tcount, u8 *keysize, bool async)
1499{
1500        unsigned int ret, i, j, k, iv_len;
1501        struct crypto_wait wait;
1502        const char *key;
1503        char iv[128];
1504        struct skcipher_request *req;
1505        struct crypto_skcipher *tfm;
1506        const int *b_size;
1507        const char *e;
1508
1509        if (enc == ENCRYPT)
1510                e = "encryption";
1511        else
1512                e = "decryption";
1513
1514        crypto_init_wait(&wait);
1515
1516        tfm = crypto_alloc_skcipher(algo, 0, async ? 0 : CRYPTO_ALG_ASYNC);
1517
1518        if (IS_ERR(tfm)) {
1519                pr_err("failed to load transform for %s: %ld\n", algo,
1520                       PTR_ERR(tfm));
1521                return;
1522        }
1523
1524        pr_info("\ntesting speed of %s %s (%s) %s\n", async ? "async" : "sync",
1525                algo, get_driver_name(crypto_skcipher, tfm), e);
1526
1527        req = skcipher_request_alloc(tfm, GFP_KERNEL);
1528        if (!req) {
1529                pr_err("tcrypt: skcipher: Failed to allocate request for %s\n",
1530                       algo);
1531                goto out;
1532        }
1533
1534        skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1535                                      crypto_req_done, &wait);
1536
1537        i = 0;
1538        do {
1539                b_size = block_sizes;
1540
1541                do {
1542                        u32 bs = round_up(*b_size, crypto_skcipher_blocksize(tfm));
1543                        struct scatterlist sg[TVMEMSIZE];
1544
1545                        if ((*keysize + bs) > TVMEMSIZE * PAGE_SIZE) {
1546                                pr_err("template (%u) too big for "
1547                                       "tvmem (%lu)\n", *keysize + bs,
1548                                       TVMEMSIZE * PAGE_SIZE);
1549                                goto out_free_req;
1550                        }
1551
1552                        pr_info("test %u (%d bit key, %d byte blocks): ", i,
1553                                *keysize * 8, bs);
1554
1555                        memset(tvmem[0], 0xff, PAGE_SIZE);
1556
1557                        /* set key, plain text and IV */
1558                        key = tvmem[0];
1559                        for (j = 0; j < tcount; j++) {
1560                                if (template[j].klen == *keysize) {
1561                                        key = template[j].key;
1562                                        break;
1563                                }
1564                        }
1565
1566                        crypto_skcipher_clear_flags(tfm, ~0);
1567
1568                        ret = crypto_skcipher_setkey(tfm, key, *keysize);
1569                        if (ret) {
1570                                pr_err("setkey() failed flags=%x\n",
1571                                        crypto_skcipher_get_flags(tfm));
1572                                goto out_free_req;
1573                        }
1574
1575                        k = *keysize + bs;
1576                        sg_init_table(sg, DIV_ROUND_UP(k, PAGE_SIZE));
1577
1578                        if (k > PAGE_SIZE) {
1579                                sg_set_buf(sg, tvmem[0] + *keysize,
1580                                   PAGE_SIZE - *keysize);
1581                                k -= PAGE_SIZE;
1582                                j = 1;
1583                                while (k > PAGE_SIZE) {
1584                                        sg_set_buf(sg + j, tvmem[j], PAGE_SIZE);
1585                                        memset(tvmem[j], 0xff, PAGE_SIZE);
1586                                        j++;
1587                                        k -= PAGE_SIZE;
1588                                }
1589                                sg_set_buf(sg + j, tvmem[j], k);
1590                                memset(tvmem[j], 0xff, k);
1591                        } else {
1592                                sg_set_buf(sg, tvmem[0] + *keysize, bs);
1593                        }
1594
1595                        iv_len = crypto_skcipher_ivsize(tfm);
1596                        if (iv_len)
1597                                memset(&iv, 0xff, iv_len);
1598
1599                        skcipher_request_set_crypt(req, sg, sg, bs, iv);
1600
1601                        if (secs) {
1602                                ret = test_acipher_jiffies(req, enc,
1603                                                           bs, secs);
1604                                cond_resched();
1605                        } else {
1606                                ret = test_acipher_cycles(req, enc,
1607                                                          bs);
1608                        }
1609
1610                        if (ret) {
1611                                pr_err("%s() failed flags=%x\n", e,
1612                                       crypto_skcipher_get_flags(tfm));
1613                                break;
1614                        }
1615                        b_size++;
1616                        i++;
1617                } while (*b_size);
1618                keysize++;
1619        } while (*keysize);
1620
1621out_free_req:
1622        skcipher_request_free(req);
1623out:
1624        crypto_free_skcipher(tfm);
1625}
1626
1627static void test_acipher_speed(const char *algo, int enc, unsigned int secs,
1628                               struct cipher_speed_template *template,
1629                               unsigned int tcount, u8 *keysize)
1630{
1631        return test_skcipher_speed(algo, enc, secs, template, tcount, keysize,
1632                                   true);
1633}
1634
1635static void test_cipher_speed(const char *algo, int enc, unsigned int secs,
1636                              struct cipher_speed_template *template,
1637                              unsigned int tcount, u8 *keysize)
1638{
1639        return test_skcipher_speed(algo, enc, secs, template, tcount, keysize,
1640                                   false);
1641}
1642
1643static void test_available(void)
1644{
1645        const char **name = check;
1646
1647        while (*name) {
1648                printk("alg %s ", *name);
1649                printk(crypto_has_alg(*name, 0, 0) ?
1650                       "found\n" : "not found\n");
1651                name++;
1652        }
1653}
1654
1655static inline int tcrypt_test(const char *alg)
1656{
1657        int ret;
1658
1659        pr_debug("testing %s\n", alg);
1660
1661        ret = alg_test(alg, alg, 0, 0);
1662        /* non-fips algs return -EINVAL in fips mode */
1663        if (fips_enabled && ret == -EINVAL)
1664                ret = 0;
1665        return ret;
1666}
1667
1668static int do_test(const char *alg, u32 type, u32 mask, int m, u32 num_mb)
1669{
1670        int i;
1671        int ret = 0;
1672
1673        switch (m) {
1674        case 0:
1675                if (alg) {
1676                        if (!crypto_has_alg(alg, type,
1677                                            mask ?: CRYPTO_ALG_TYPE_MASK))
1678                                ret = -ENOENT;
1679                        break;
1680                }
1681
1682                for (i = 1; i < 200; i++)
1683                        ret += do_test(NULL, 0, 0, i, num_mb);
1684                break;
1685
1686        case 1:
1687                ret += tcrypt_test("md5");
1688                break;
1689
1690        case 2:
1691                ret += tcrypt_test("sha1");
1692                break;
1693
1694        case 3:
1695                ret += tcrypt_test("ecb(des)");
1696                ret += tcrypt_test("cbc(des)");
1697                ret += tcrypt_test("ctr(des)");
1698                break;
1699
1700        case 4:
1701                ret += tcrypt_test("ecb(des3_ede)");
1702                ret += tcrypt_test("cbc(des3_ede)");
1703                ret += tcrypt_test("ctr(des3_ede)");
1704                break;
1705
1706        case 5:
1707                ret += tcrypt_test("md4");
1708                break;
1709
1710        case 6:
1711                ret += tcrypt_test("sha256");
1712                break;
1713
1714        case 7:
1715                ret += tcrypt_test("ecb(blowfish)");
1716                ret += tcrypt_test("cbc(blowfish)");
1717                ret += tcrypt_test("ctr(blowfish)");
1718                break;
1719
1720        case 8:
1721                ret += tcrypt_test("ecb(twofish)");
1722                ret += tcrypt_test("cbc(twofish)");
1723                ret += tcrypt_test("ctr(twofish)");
1724                ret += tcrypt_test("lrw(twofish)");
1725                ret += tcrypt_test("xts(twofish)");
1726                break;
1727
1728        case 9:
1729                ret += tcrypt_test("ecb(serpent)");
1730                ret += tcrypt_test("cbc(serpent)");
1731                ret += tcrypt_test("ctr(serpent)");
1732                ret += tcrypt_test("lrw(serpent)");
1733                ret += tcrypt_test("xts(serpent)");
1734                break;
1735
1736        case 10:
1737                ret += tcrypt_test("ecb(aes)");
1738                ret += tcrypt_test("cbc(aes)");
1739                ret += tcrypt_test("lrw(aes)");
1740                ret += tcrypt_test("xts(aes)");
1741                ret += tcrypt_test("ctr(aes)");
1742                ret += tcrypt_test("rfc3686(ctr(aes))");
1743                ret += tcrypt_test("ofb(aes)");
1744                ret += tcrypt_test("cfb(aes)");
1745                break;
1746
1747        case 11:
1748                ret += tcrypt_test("sha384");
1749                break;
1750
1751        case 12:
1752                ret += tcrypt_test("sha512");
1753                break;
1754
1755        case 13:
1756                ret += tcrypt_test("deflate");
1757                break;
1758
1759        case 14:
1760                ret += tcrypt_test("ecb(cast5)");
1761                ret += tcrypt_test("cbc(cast5)");
1762                ret += tcrypt_test("ctr(cast5)");
1763                break;
1764
1765        case 15:
1766                ret += tcrypt_test("ecb(cast6)");
1767                ret += tcrypt_test("cbc(cast6)");
1768                ret += tcrypt_test("ctr(cast6)");
1769                ret += tcrypt_test("lrw(cast6)");
1770                ret += tcrypt_test("xts(cast6)");
1771                break;
1772
1773        case 16:
1774                ret += tcrypt_test("ecb(arc4)");
1775                break;
1776
1777        case 17:
1778                ret += tcrypt_test("michael_mic");
1779                break;
1780
1781        case 18:
1782                ret += tcrypt_test("crc32c");
1783                break;
1784
1785        case 19:
1786                ret += tcrypt_test("ecb(tea)");
1787                break;
1788
1789        case 20:
1790                ret += tcrypt_test("ecb(xtea)");
1791                break;
1792
1793        case 21:
1794                ret += tcrypt_test("ecb(khazad)");
1795                break;
1796
1797        case 22:
1798                ret += tcrypt_test("wp512");
1799                break;
1800
1801        case 23:
1802                ret += tcrypt_test("wp384");
1803                break;
1804
1805        case 24:
1806                ret += tcrypt_test("wp256");
1807                break;
1808
1809        case 26:
1810                ret += tcrypt_test("ecb(anubis)");
1811                ret += tcrypt_test("cbc(anubis)");
1812                break;
1813
1814        case 30:
1815                ret += tcrypt_test("ecb(xeta)");
1816                break;
1817
1818        case 31:
1819                ret += tcrypt_test("pcbc(fcrypt)");
1820                break;
1821
1822        case 32:
1823                ret += tcrypt_test("ecb(camellia)");
1824                ret += tcrypt_test("cbc(camellia)");
1825                ret += tcrypt_test("ctr(camellia)");
1826                ret += tcrypt_test("lrw(camellia)");
1827                ret += tcrypt_test("xts(camellia)");
1828                break;
1829
1830        case 33:
1831                ret += tcrypt_test("sha224");
1832                break;
1833
1834        case 35:
1835                ret += tcrypt_test("gcm(aes)");
1836                break;
1837
1838        case 36:
1839                ret += tcrypt_test("lzo");
1840                break;
1841
1842        case 37:
1843                ret += tcrypt_test("ccm(aes)");
1844                break;
1845
1846        case 38:
1847                ret += tcrypt_test("cts(cbc(aes))");
1848                break;
1849
1850        case 40:
1851                ret += tcrypt_test("rmd160");
1852                break;
1853
1854        case 43:
1855                ret += tcrypt_test("ecb(seed)");
1856                break;
1857
1858        case 45:
1859                ret += tcrypt_test("rfc4309(ccm(aes))");
1860                break;
1861
1862        case 46:
1863                ret += tcrypt_test("ghash");
1864                break;
1865
1866        case 47:
1867                ret += tcrypt_test("crct10dif");
1868                break;
1869
1870        case 48:
1871                ret += tcrypt_test("sha3-224");
1872                break;
1873
1874        case 49:
1875                ret += tcrypt_test("sha3-256");
1876                break;
1877
1878        case 50:
1879                ret += tcrypt_test("sha3-384");
1880                break;
1881
1882        case 51:
1883                ret += tcrypt_test("sha3-512");
1884                break;
1885
1886        case 52:
1887                ret += tcrypt_test("sm3");
1888                break;
1889
1890        case 53:
1891                ret += tcrypt_test("streebog256");
1892                break;
1893
1894        case 54:
1895                ret += tcrypt_test("streebog512");
1896                break;
1897
1898        case 100:
1899                ret += tcrypt_test("hmac(md5)");
1900                break;
1901
1902        case 101:
1903                ret += tcrypt_test("hmac(sha1)");
1904                break;
1905
1906        case 102:
1907                ret += tcrypt_test("hmac(sha256)");
1908                break;
1909
1910        case 103:
1911                ret += tcrypt_test("hmac(sha384)");
1912                break;
1913
1914        case 104:
1915                ret += tcrypt_test("hmac(sha512)");
1916                break;
1917
1918        case 105:
1919                ret += tcrypt_test("hmac(sha224)");
1920                break;
1921
1922        case 106:
1923                ret += tcrypt_test("xcbc(aes)");
1924                break;
1925
1926        case 108:
1927                ret += tcrypt_test("hmac(rmd160)");
1928                break;
1929
1930        case 109:
1931                ret += tcrypt_test("vmac64(aes)");
1932                break;
1933
1934        case 111:
1935                ret += tcrypt_test("hmac(sha3-224)");
1936                break;
1937
1938        case 112:
1939                ret += tcrypt_test("hmac(sha3-256)");
1940                break;
1941
1942        case 113:
1943                ret += tcrypt_test("hmac(sha3-384)");
1944                break;
1945
1946        case 114:
1947                ret += tcrypt_test("hmac(sha3-512)");
1948                break;
1949
1950        case 115:
1951                ret += tcrypt_test("hmac(streebog256)");
1952                break;
1953
1954        case 116:
1955                ret += tcrypt_test("hmac(streebog512)");
1956                break;
1957
1958        case 150:
1959                ret += tcrypt_test("ansi_cprng");
1960                break;
1961
1962        case 151:
1963                ret += tcrypt_test("rfc4106(gcm(aes))");
1964                break;
1965
1966        case 152:
1967                ret += tcrypt_test("rfc4543(gcm(aes))");
1968                break;
1969
1970        case 153:
1971                ret += tcrypt_test("cmac(aes)");
1972                break;
1973
1974        case 154:
1975                ret += tcrypt_test("cmac(des3_ede)");
1976                break;
1977
1978        case 155:
1979                ret += tcrypt_test("authenc(hmac(sha1),cbc(aes))");
1980                break;
1981
1982        case 156:
1983                ret += tcrypt_test("authenc(hmac(md5),ecb(cipher_null))");
1984                break;
1985
1986        case 157:
1987                ret += tcrypt_test("authenc(hmac(sha1),ecb(cipher_null))");
1988                break;
1989        case 181:
1990                ret += tcrypt_test("authenc(hmac(sha1),cbc(des))");
1991                break;
1992        case 182:
1993                ret += tcrypt_test("authenc(hmac(sha1),cbc(des3_ede))");
1994                break;
1995        case 183:
1996                ret += tcrypt_test("authenc(hmac(sha224),cbc(des))");
1997                break;
1998        case 184:
1999                ret += tcrypt_test("authenc(hmac(sha224),cbc(des3_ede))");
2000                break;
2001        case 185:
2002                ret += tcrypt_test("authenc(hmac(sha256),cbc(des))");
2003                break;
2004        case 186:
2005                ret += tcrypt_test("authenc(hmac(sha256),cbc(des3_ede))");
2006                break;
2007        case 187:
2008                ret += tcrypt_test("authenc(hmac(sha384),cbc(des))");
2009                break;
2010        case 188:
2011                ret += tcrypt_test("authenc(hmac(sha384),cbc(des3_ede))");
2012                break;
2013        case 189:
2014                ret += tcrypt_test("authenc(hmac(sha512),cbc(des))");
2015                break;
2016        case 190:
2017                ret += tcrypt_test("authenc(hmac(sha512),cbc(des3_ede))");
2018                break;
2019        case 191:
2020                ret += tcrypt_test("ecb(sm4)");
2021                ret += tcrypt_test("cbc(sm4)");
2022                ret += tcrypt_test("ctr(sm4)");
2023                break;
2024        case 200:
2025                test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
2026                                speed_template_16_24_32);
2027                test_cipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
2028                                speed_template_16_24_32);
2029                test_cipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
2030                                speed_template_16_24_32);
2031                test_cipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
2032                                speed_template_16_24_32);
2033                test_cipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
2034                                speed_template_32_40_48);
2035                test_cipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
2036                                speed_template_32_40_48);
2037                test_cipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
2038                                speed_template_32_64);
2039                test_cipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
2040                                speed_template_32_64);
2041                test_cipher_speed("cts(cbc(aes))", ENCRYPT, sec, NULL, 0,
2042                                speed_template_16_24_32);
2043                test_cipher_speed("cts(cbc(aes))", DECRYPT, sec, NULL, 0,
2044                                speed_template_16_24_32);
2045                test_cipher_speed("ctr(aes)", ENCRYPT, sec, NULL, 0,
2046                                speed_template_16_24_32);
2047                test_cipher_speed("ctr(aes)", DECRYPT, sec, NULL, 0,
2048                                speed_template_16_24_32);
2049                test_cipher_speed("cfb(aes)", ENCRYPT, sec, NULL, 0,
2050                                speed_template_16_24_32);
2051                test_cipher_speed("cfb(aes)", DECRYPT, sec, NULL, 0,
2052                                speed_template_16_24_32);
2053                break;
2054
2055        case 201:
2056                test_cipher_speed("ecb(des3_ede)", ENCRYPT, sec,
2057                                des3_speed_template, DES3_SPEED_VECTORS,
2058                                speed_template_24);
2059                test_cipher_speed("ecb(des3_ede)", DECRYPT, sec,
2060                                des3_speed_template, DES3_SPEED_VECTORS,
2061                                speed_template_24);
2062                test_cipher_speed("cbc(des3_ede)", ENCRYPT, sec,
2063                                des3_speed_template, DES3_SPEED_VECTORS,
2064                                speed_template_24);
2065                test_cipher_speed("cbc(des3_ede)", DECRYPT, sec,
2066                                des3_speed_template, DES3_SPEED_VECTORS,
2067                                speed_template_24);
2068                test_cipher_speed("ctr(des3_ede)", ENCRYPT, sec,
2069                                des3_speed_template, DES3_SPEED_VECTORS,
2070                                speed_template_24);
2071                test_cipher_speed("ctr(des3_ede)", DECRYPT, sec,
2072                                des3_speed_template, DES3_SPEED_VECTORS,
2073                                speed_template_24);
2074                break;
2075
2076        case 202:
2077                test_cipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
2078                                speed_template_16_24_32);
2079                test_cipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
2080                                speed_template_16_24_32);
2081                test_cipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
2082                                speed_template_16_24_32);
2083                test_cipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
2084                                speed_template_16_24_32);
2085                test_cipher_speed("ctr(twofish)", ENCRYPT, sec, NULL, 0,
2086                                speed_template_16_24_32);
2087                test_cipher_speed("ctr(twofish)", DECRYPT, sec, NULL, 0,
2088                                speed_template_16_24_32);
2089                test_cipher_speed("lrw(twofish)", ENCRYPT, sec, NULL, 0,
2090                                speed_template_32_40_48);
2091                test_cipher_speed("lrw(twofish)", DECRYPT, sec, NULL, 0,
2092                                speed_template_32_40_48);
2093                test_cipher_speed("xts(twofish)", ENCRYPT, sec, NULL, 0,
2094                                speed_template_32_48_64);
2095                test_cipher_speed("xts(twofish)", DECRYPT, sec, NULL, 0,
2096                                speed_template_32_48_64);
2097                break;
2098
2099        case 203:
2100                test_cipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
2101                                  speed_template_8_32);
2102                test_cipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
2103                                  speed_template_8_32);
2104                test_cipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
2105                                  speed_template_8_32);
2106                test_cipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
2107                                  speed_template_8_32);
2108                test_cipher_speed("ctr(blowfish)", ENCRYPT, sec, NULL, 0,
2109                                  speed_template_8_32);
2110                test_cipher_speed("ctr(blowfish)", DECRYPT, sec, NULL, 0,
2111                                  speed_template_8_32);
2112                break;
2113
2114        case 204:
2115                test_cipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
2116                                  speed_template_8);
2117                test_cipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
2118                                  speed_template_8);
2119                test_cipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
2120                                  speed_template_8);
2121                test_cipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
2122                                  speed_template_8);
2123                break;
2124
2125        case 205:
2126                test_cipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
2127                                speed_template_16_24_32);
2128                test_cipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
2129                                speed_template_16_24_32);
2130                test_cipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
2131                                speed_template_16_24_32);
2132                test_cipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
2133                                speed_template_16_24_32);
2134                test_cipher_speed("ctr(camellia)", ENCRYPT, sec, NULL, 0,
2135                                speed_template_16_24_32);
2136                test_cipher_speed("ctr(camellia)", DECRYPT, sec, NULL, 0,
2137                                speed_template_16_24_32);
2138                test_cipher_speed("lrw(camellia)", ENCRYPT, sec, NULL, 0,
2139                                speed_template_32_40_48);
2140                test_cipher_speed("lrw(camellia)", DECRYPT, sec, NULL, 0,
2141                                speed_template_32_40_48);
2142                test_cipher_speed("xts(camellia)", ENCRYPT, sec, NULL, 0,
2143                                speed_template_32_48_64);
2144                test_cipher_speed("xts(camellia)", DECRYPT, sec, NULL, 0,
2145                                speed_template_32_48_64);
2146                break;
2147
2148        case 207:
2149                test_cipher_speed("ecb(serpent)", ENCRYPT, sec, NULL, 0,
2150                                  speed_template_16_32);
2151                test_cipher_speed("ecb(serpent)", DECRYPT, sec, NULL, 0,
2152                                  speed_template_16_32);
2153                test_cipher_speed("cbc(serpent)", ENCRYPT, sec, NULL, 0,
2154                                  speed_template_16_32);
2155                test_cipher_speed("cbc(serpent)", DECRYPT, sec, NULL, 0,
2156                                  speed_template_16_32);
2157                test_cipher_speed("ctr(serpent)", ENCRYPT, sec, NULL, 0,
2158                                  speed_template_16_32);
2159                test_cipher_speed("ctr(serpent)", DECRYPT, sec, NULL, 0,
2160                                  speed_template_16_32);
2161                test_cipher_speed("lrw(serpent)", ENCRYPT, sec, NULL, 0,
2162                                  speed_template_32_48);
2163                test_cipher_speed("lrw(serpent)", DECRYPT, sec, NULL, 0,
2164                                  speed_template_32_48);
2165                test_cipher_speed("xts(serpent)", ENCRYPT, sec, NULL, 0,
2166                                  speed_template_32_64);
2167                test_cipher_speed("xts(serpent)", DECRYPT, sec, NULL, 0,
2168                                  speed_template_32_64);
2169                break;
2170
2171        case 208:
2172                test_cipher_speed("ecb(arc4)", ENCRYPT, sec, NULL, 0,
2173                                  speed_template_8);
2174                break;
2175
2176        case 209:
2177                test_cipher_speed("ecb(cast5)", ENCRYPT, sec, NULL, 0,
2178                                  speed_template_8_16);
2179                test_cipher_speed("ecb(cast5)", DECRYPT, sec, NULL, 0,
2180                                  speed_template_8_16);
2181                test_cipher_speed("cbc(cast5)", ENCRYPT, sec, NULL, 0,
2182                                  speed_template_8_16);
2183                test_cipher_speed("cbc(cast5)", DECRYPT, sec, NULL, 0,
2184                                  speed_template_8_16);
2185                test_cipher_speed("ctr(cast5)", ENCRYPT, sec, NULL, 0,
2186                                  speed_template_8_16);
2187                test_cipher_speed("ctr(cast5)", DECRYPT, sec, NULL, 0,
2188                                  speed_template_8_16);
2189                break;
2190
2191        case 210:
2192                test_cipher_speed("ecb(cast6)", ENCRYPT, sec, NULL, 0,
2193                                  speed_template_16_32);
2194                test_cipher_speed("ecb(cast6)", DECRYPT, sec, NULL, 0,
2195                                  speed_template_16_32);
2196                test_cipher_speed("cbc(cast6)", ENCRYPT, sec, NULL, 0,
2197                                  speed_template_16_32);
2198                test_cipher_speed("cbc(cast6)", DECRYPT, sec, NULL, 0,
2199                                  speed_template_16_32);
2200                test_cipher_speed("ctr(cast6)", ENCRYPT, sec, NULL, 0,
2201                                  speed_template_16_32);
2202                test_cipher_speed("ctr(cast6)", DECRYPT, sec, NULL, 0,
2203                                  speed_template_16_32);
2204                test_cipher_speed("lrw(cast6)", ENCRYPT, sec, NULL, 0,
2205                                  speed_template_32_48);
2206                test_cipher_speed("lrw(cast6)", DECRYPT, sec, NULL, 0,
2207                                  speed_template_32_48);
2208                test_cipher_speed("xts(cast6)", ENCRYPT, sec, NULL, 0,
2209                                  speed_template_32_64);
2210                test_cipher_speed("xts(cast6)", DECRYPT, sec, NULL, 0,
2211                                  speed_template_32_64);
2212                break;
2213
2214        case 211:
2215                test_aead_speed("rfc4106(gcm(aes))", ENCRYPT, sec,
2216                                NULL, 0, 16, 16, aead_speed_template_20);
2217                test_aead_speed("gcm(aes)", ENCRYPT, sec,
2218                                NULL, 0, 16, 8, speed_template_16_24_32);
2219                test_aead_speed("rfc4106(gcm(aes))", DECRYPT, sec,
2220                                NULL, 0, 16, 16, aead_speed_template_20);
2221                test_aead_speed("gcm(aes)", DECRYPT, sec,
2222                                NULL, 0, 16, 8, speed_template_16_24_32);
2223                break;
2224
2225        case 212:
2226                test_aead_speed("rfc4309(ccm(aes))", ENCRYPT, sec,
2227                                NULL, 0, 16, 16, aead_speed_template_19);
2228                test_aead_speed("rfc4309(ccm(aes))", DECRYPT, sec,
2229                                NULL, 0, 16, 16, aead_speed_template_19);
2230                break;
2231
2232        case 213:
2233                test_aead_speed("rfc7539esp(chacha20,poly1305)", ENCRYPT, sec,
2234                                NULL, 0, 16, 8, aead_speed_template_36);
2235                test_aead_speed("rfc7539esp(chacha20,poly1305)", DECRYPT, sec,
2236                                NULL, 0, 16, 8, aead_speed_template_36);
2237                break;
2238
2239        case 214:
2240                test_cipher_speed("chacha20", ENCRYPT, sec, NULL, 0,
2241                                  speed_template_32);
2242                break;
2243
2244        case 215:
2245                test_mb_aead_speed("rfc4106(gcm(aes))", ENCRYPT, sec, NULL,
2246                                   0, 16, 16, aead_speed_template_20, num_mb);
2247                test_mb_aead_speed("gcm(aes)", ENCRYPT, sec, NULL, 0, 16, 8,
2248                                   speed_template_16_24_32, num_mb);
2249                test_mb_aead_speed("rfc4106(gcm(aes))", DECRYPT, sec, NULL,
2250                                   0, 16, 16, aead_speed_template_20, num_mb);
2251                test_mb_aead_speed("gcm(aes)", DECRYPT, sec, NULL, 0, 16, 8,
2252                                   speed_template_16_24_32, num_mb);
2253                break;
2254
2255        case 216:
2256                test_mb_aead_speed("rfc4309(ccm(aes))", ENCRYPT, sec, NULL, 0,
2257                                   16, 16, aead_speed_template_19, num_mb);
2258                test_mb_aead_speed("rfc4309(ccm(aes))", DECRYPT, sec, NULL, 0,
2259                                   16, 16, aead_speed_template_19, num_mb);
2260                break;
2261
2262        case 217:
2263                test_mb_aead_speed("rfc7539esp(chacha20,poly1305)", ENCRYPT,
2264                                   sec, NULL, 0, 16, 8, aead_speed_template_36,
2265                                   num_mb);
2266                test_mb_aead_speed("rfc7539esp(chacha20,poly1305)", DECRYPT,
2267                                   sec, NULL, 0, 16, 8, aead_speed_template_36,
2268                                   num_mb);
2269                break;
2270
2271        case 218:
2272                test_cipher_speed("ecb(sm4)", ENCRYPT, sec, NULL, 0,
2273                                speed_template_16);
2274                test_cipher_speed("ecb(sm4)", DECRYPT, sec, NULL, 0,
2275                                speed_template_16);
2276                test_cipher_speed("cbc(sm4)", ENCRYPT, sec, NULL, 0,
2277                                speed_template_16);
2278                test_cipher_speed("cbc(sm4)", DECRYPT, sec, NULL, 0,
2279                                speed_template_16);
2280                test_cipher_speed("ctr(sm4)", ENCRYPT, sec, NULL, 0,
2281                                speed_template_16);
2282                test_cipher_speed("ctr(sm4)", DECRYPT, sec, NULL, 0,
2283                                speed_template_16);
2284                break;
2285
2286        case 219:
2287                test_cipher_speed("adiantum(xchacha12,aes)", ENCRYPT, sec, NULL,
2288                                  0, speed_template_32);
2289                test_cipher_speed("adiantum(xchacha12,aes)", DECRYPT, sec, NULL,
2290                                  0, speed_template_32);
2291                test_cipher_speed("adiantum(xchacha20,aes)", ENCRYPT, sec, NULL,
2292                                  0, speed_template_32);
2293                test_cipher_speed("adiantum(xchacha20,aes)", DECRYPT, sec, NULL,
2294                                  0, speed_template_32);
2295                break;
2296
2297        case 220:
2298                test_acipher_speed("essiv(cbc(aes),sha256)",
2299                                  ENCRYPT, sec, NULL, 0,
2300                                  speed_template_16_24_32);
2301                test_acipher_speed("essiv(cbc(aes),sha256)",
2302                                  DECRYPT, sec, NULL, 0,
2303                                  speed_template_16_24_32);
2304                break;
2305
2306        case 221:
2307                test_aead_speed("aegis128", ENCRYPT, sec,
2308                                NULL, 0, 16, 8, speed_template_16);
2309                test_aead_speed("aegis128", DECRYPT, sec,
2310                                NULL, 0, 16, 8, speed_template_16);
2311                break;
2312
2313        case 300:
2314                if (alg) {
2315                        test_hash_speed(alg, sec, generic_hash_speed_template);
2316                        break;
2317                }
2318                fallthrough;
2319        case 301:
2320                test_hash_speed("md4", sec, generic_hash_speed_template);
2321                if (mode > 300 && mode < 400) break;
2322                fallthrough;
2323        case 302:
2324                test_hash_speed("md5", sec, generic_hash_speed_template);
2325                if (mode > 300 && mode < 400) break;
2326                fallthrough;
2327        case 303:
2328                test_hash_speed("sha1", sec, generic_hash_speed_template);
2329                if (mode > 300 && mode < 400) break;
2330                fallthrough;
2331        case 304:
2332                test_hash_speed("sha256", sec, generic_hash_speed_template);
2333                if (mode > 300 && mode < 400) break;
2334                fallthrough;
2335        case 305:
2336                test_hash_speed("sha384", sec, generic_hash_speed_template);
2337                if (mode > 300 && mode < 400) break;
2338                fallthrough;
2339        case 306:
2340                test_hash_speed("sha512", sec, generic_hash_speed_template);
2341                if (mode > 300 && mode < 400) break;
2342                fallthrough;
2343        case 307:
2344                test_hash_speed("wp256", sec, generic_hash_speed_template);
2345                if (mode > 300 && mode < 400) break;
2346                fallthrough;
2347        case 308:
2348                test_hash_speed("wp384", sec, generic_hash_speed_template);
2349                if (mode > 300 && mode < 400) break;
2350                fallthrough;
2351        case 309:
2352                test_hash_speed("wp512", sec, generic_hash_speed_template);
2353                if (mode > 300 && mode < 400) break;
2354                fallthrough;
2355        case 313:
2356                test_hash_speed("sha224", sec, generic_hash_speed_template);
2357                if (mode > 300 && mode < 400) break;
2358                fallthrough;
2359        case 315:
2360                test_hash_speed("rmd160", sec, generic_hash_speed_template);
2361                if (mode > 300 && mode < 400) break;
2362                fallthrough;
2363        case 318:
2364                klen = 16;
2365                test_hash_speed("ghash", sec, generic_hash_speed_template);
2366                if (mode > 300 && mode < 400) break;
2367                fallthrough;
2368        case 319:
2369                test_hash_speed("crc32c", sec, generic_hash_speed_template);
2370                if (mode > 300 && mode < 400) break;
2371                fallthrough;
2372        case 320:
2373                test_hash_speed("crct10dif", sec, generic_hash_speed_template);
2374                if (mode > 300 && mode < 400) break;
2375                fallthrough;
2376        case 321:
2377                test_hash_speed("poly1305", sec, poly1305_speed_template);
2378                if (mode > 300 && mode < 400) break;
2379                fallthrough;
2380        case 322:
2381                test_hash_speed("sha3-224", sec, generic_hash_speed_template);
2382                if (mode > 300 && mode < 400) break;
2383                fallthrough;
2384        case 323:
2385                test_hash_speed("sha3-256", sec, generic_hash_speed_template);
2386                if (mode > 300 && mode < 400) break;
2387                fallthrough;
2388        case 324:
2389                test_hash_speed("sha3-384", sec, generic_hash_speed_template);
2390                if (mode > 300 && mode < 400) break;
2391                fallthrough;
2392        case 325:
2393                test_hash_speed("sha3-512", sec, generic_hash_speed_template);
2394                if (mode > 300 && mode < 400) break;
2395                fallthrough;
2396        case 326:
2397                test_hash_speed("sm3", sec, generic_hash_speed_template);
2398                if (mode > 300 && mode < 400) break;
2399                fallthrough;
2400        case 327:
2401                test_hash_speed("streebog256", sec,
2402                                generic_hash_speed_template);
2403                if (mode > 300 && mode < 400) break;
2404                fallthrough;
2405        case 328:
2406                test_hash_speed("streebog512", sec,
2407                                generic_hash_speed_template);
2408                if (mode > 300 && mode < 400) break;
2409                fallthrough;
2410        case 399:
2411                break;
2412
2413        case 400:
2414                if (alg) {
2415                        test_ahash_speed(alg, sec, generic_hash_speed_template);
2416                        break;
2417                }
2418                fallthrough;
2419        case 401:
2420                test_ahash_speed("md4", sec, generic_hash_speed_template);
2421                if (mode > 400 && mode < 500) break;
2422                fallthrough;
2423        case 402:
2424                test_ahash_speed("md5", sec, generic_hash_speed_template);
2425                if (mode > 400 && mode < 500) break;
2426                fallthrough;
2427        case 403:
2428                test_ahash_speed("sha1", sec, generic_hash_speed_template);
2429                if (mode > 400 && mode < 500) break;
2430                fallthrough;
2431        case 404:
2432                test_ahash_speed("sha256", sec, generic_hash_speed_template);
2433                if (mode > 400 && mode < 500) break;
2434                fallthrough;
2435        case 405:
2436                test_ahash_speed("sha384", sec, generic_hash_speed_template);
2437                if (mode > 400 && mode < 500) break;
2438                fallthrough;
2439        case 406:
2440                test_ahash_speed("sha512", sec, generic_hash_speed_template);
2441                if (mode > 400 && mode < 500) break;
2442                fallthrough;
2443        case 407:
2444                test_ahash_speed("wp256", sec, generic_hash_speed_template);
2445                if (mode > 400 && mode < 500) break;
2446                fallthrough;
2447        case 408:
2448                test_ahash_speed("wp384", sec, generic_hash_speed_template);
2449                if (mode > 400 && mode < 500) break;
2450                fallthrough;
2451        case 409:
2452                test_ahash_speed("wp512", sec, generic_hash_speed_template);
2453                if (mode > 400 && mode < 500) break;
2454                fallthrough;
2455        case 413:
2456                test_ahash_speed("sha224", sec, generic_hash_speed_template);
2457                if (mode > 400 && mode < 500) break;
2458                fallthrough;
2459        case 415:
2460                test_ahash_speed("rmd160", sec, generic_hash_speed_template);
2461                if (mode > 400 && mode < 500) break;
2462                fallthrough;
2463        case 418:
2464                test_ahash_speed("sha3-224", sec, generic_hash_speed_template);
2465                if (mode > 400 && mode < 500) break;
2466                fallthrough;
2467        case 419:
2468                test_ahash_speed("sha3-256", sec, generic_hash_speed_template);
2469                if (mode > 400 && mode < 500) break;
2470                fallthrough;
2471        case 420:
2472                test_ahash_speed("sha3-384", sec, generic_hash_speed_template);
2473                if (mode > 400 && mode < 500) break;
2474                fallthrough;
2475        case 421:
2476                test_ahash_speed("sha3-512", sec, generic_hash_speed_template);
2477                if (mode > 400 && mode < 500) break;
2478                fallthrough;
2479        case 422:
2480                test_mb_ahash_speed("sha1", sec, generic_hash_speed_template,
2481                                    num_mb);
2482                if (mode > 400 && mode < 500) break;
2483                fallthrough;
2484        case 423:
2485                test_mb_ahash_speed("sha256", sec, generic_hash_speed_template,
2486                                    num_mb);
2487                if (mode > 400 && mode < 500) break;
2488                fallthrough;
2489        case 424:
2490                test_mb_ahash_speed("sha512", sec, generic_hash_speed_template,
2491                                    num_mb);
2492                if (mode > 400 && mode < 500) break;
2493                fallthrough;
2494        case 425:
2495                test_mb_ahash_speed("sm3", sec, generic_hash_speed_template,
2496                                    num_mb);
2497                if (mode > 400 && mode < 500) break;
2498                fallthrough;
2499        case 426:
2500                test_mb_ahash_speed("streebog256", sec,
2501                                    generic_hash_speed_template, num_mb);
2502                if (mode > 400 && mode < 500) break;
2503                fallthrough;
2504        case 427:
2505                test_mb_ahash_speed("streebog512", sec,
2506                                    generic_hash_speed_template, num_mb);
2507                if (mode > 400 && mode < 500) break;
2508                fallthrough;
2509        case 499:
2510                break;
2511
2512        case 500:
2513                test_acipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
2514                                   speed_template_16_24_32);
2515                test_acipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
2516                                   speed_template_16_24_32);
2517                test_acipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
2518                                   speed_template_16_24_32);
2519                test_acipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
2520                                   speed_template_16_24_32);
2521                test_acipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
2522                                   speed_template_32_40_48);
2523                test_acipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
2524                                   speed_template_32_40_48);
2525                test_acipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
2526                                   speed_template_32_64);
2527                test_acipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
2528                                   speed_template_32_64);
2529                test_acipher_speed("cts(cbc(aes))", ENCRYPT, sec, NULL, 0,
2530                                   speed_template_16_24_32);
2531                test_acipher_speed("cts(cbc(aes))", DECRYPT, sec, NULL, 0,
2532                                   speed_template_16_24_32);
2533                test_acipher_speed("ctr(aes)", ENCRYPT, sec, NULL, 0,
2534                                   speed_template_16_24_32);
2535                test_acipher_speed("ctr(aes)", DECRYPT, sec, NULL, 0,
2536                                   speed_template_16_24_32);
2537                test_acipher_speed("cfb(aes)", ENCRYPT, sec, NULL, 0,
2538                                   speed_template_16_24_32);
2539                test_acipher_speed("cfb(aes)", DECRYPT, sec, NULL, 0,
2540                                   speed_template_16_24_32);
2541                test_acipher_speed("ofb(aes)", ENCRYPT, sec, NULL, 0,
2542                                   speed_template_16_24_32);
2543                test_acipher_speed("ofb(aes)", DECRYPT, sec, NULL, 0,
2544                                   speed_template_16_24_32);
2545                test_acipher_speed("rfc3686(ctr(aes))", ENCRYPT, sec, NULL, 0,
2546                                   speed_template_20_28_36);
2547                test_acipher_speed("rfc3686(ctr(aes))", DECRYPT, sec, NULL, 0,
2548                                   speed_template_20_28_36);
2549                break;
2550
2551        case 501:
2552                test_acipher_speed("ecb(des3_ede)", ENCRYPT, sec,
2553                                   des3_speed_template, DES3_SPEED_VECTORS,
2554                                   speed_template_24);
2555                test_acipher_speed("ecb(des3_ede)", DECRYPT, sec,
2556                                   des3_speed_template, DES3_SPEED_VECTORS,
2557                                   speed_template_24);
2558                test_acipher_speed("cbc(des3_ede)", ENCRYPT, sec,
2559                                   des3_speed_template, DES3_SPEED_VECTORS,
2560                                   speed_template_24);
2561                test_acipher_speed("cbc(des3_ede)", DECRYPT, sec,
2562                                   des3_speed_template, DES3_SPEED_VECTORS,
2563                                   speed_template_24);
2564                test_acipher_speed("cfb(des3_ede)", ENCRYPT, sec,
2565                                   des3_speed_template, DES3_SPEED_VECTORS,
2566                                   speed_template_24);
2567                test_acipher_speed("cfb(des3_ede)", DECRYPT, sec,
2568                                   des3_speed_template, DES3_SPEED_VECTORS,
2569                                   speed_template_24);
2570                test_acipher_speed("ofb(des3_ede)", ENCRYPT, sec,
2571                                   des3_speed_template, DES3_SPEED_VECTORS,
2572                                   speed_template_24);
2573                test_acipher_speed("ofb(des3_ede)", DECRYPT, sec,
2574                                   des3_speed_template, DES3_SPEED_VECTORS,
2575                                   speed_template_24);
2576                break;
2577
2578        case 502:
2579                test_acipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
2580                                   speed_template_8);
2581                test_acipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
2582                                   speed_template_8);
2583                test_acipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
2584                                   speed_template_8);
2585                test_acipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
2586                                   speed_template_8);
2587                test_acipher_speed("cfb(des)", ENCRYPT, sec, NULL, 0,
2588                                   speed_template_8);
2589                test_acipher_speed("cfb(des)", DECRYPT, sec, NULL, 0,
2590                                   speed_template_8);
2591                test_acipher_speed("ofb(des)", ENCRYPT, sec, NULL, 0,
2592                                   speed_template_8);
2593                test_acipher_speed("ofb(des)", DECRYPT, sec, NULL, 0,
2594                                   speed_template_8);
2595                break;
2596
2597        case 503:
2598                test_acipher_speed("ecb(serpent)", ENCRYPT, sec, NULL, 0,
2599                                   speed_template_16_32);
2600                test_acipher_speed("ecb(serpent)", DECRYPT, sec, NULL, 0,
2601                                   speed_template_16_32);
2602                test_acipher_speed("cbc(serpent)", ENCRYPT, sec, NULL, 0,
2603                                   speed_template_16_32);
2604                test_acipher_speed("cbc(serpent)", DECRYPT, sec, NULL, 0,
2605                                   speed_template_16_32);
2606                test_acipher_speed("ctr(serpent)", ENCRYPT, sec, NULL, 0,
2607                                   speed_template_16_32);
2608                test_acipher_speed("ctr(serpent)", DECRYPT, sec, NULL, 0,
2609                                   speed_template_16_32);
2610                test_acipher_speed("lrw(serpent)", ENCRYPT, sec, NULL, 0,
2611                                   speed_template_32_48);
2612                test_acipher_speed("lrw(serpent)", DECRYPT, sec, NULL, 0,
2613                                   speed_template_32_48);
2614                test_acipher_speed("xts(serpent)", ENCRYPT, sec, NULL, 0,
2615                                   speed_template_32_64);
2616                test_acipher_speed("xts(serpent)", DECRYPT, sec, NULL, 0,
2617                                   speed_template_32_64);
2618                break;
2619
2620        case 504:
2621                test_acipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
2622                                   speed_template_16_24_32);
2623                test_acipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
2624                                   speed_template_16_24_32);
2625                test_acipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
2626                                   speed_template_16_24_32);
2627                test_acipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
2628                                   speed_template_16_24_32);
2629                test_acipher_speed("ctr(twofish)", ENCRYPT, sec, NULL, 0,
2630                                   speed_template_16_24_32);
2631                test_acipher_speed("ctr(twofish)", DECRYPT, sec, NULL, 0,
2632                                   speed_template_16_24_32);
2633                test_acipher_speed("lrw(twofish)", ENCRYPT, sec, NULL, 0,
2634                                   speed_template_32_40_48);
2635                test_acipher_speed("lrw(twofish)", DECRYPT, sec, NULL, 0,
2636                                   speed_template_32_40_48);
2637                test_acipher_speed("xts(twofish)", ENCRYPT, sec, NULL, 0,
2638                                   speed_template_32_48_64);
2639                test_acipher_speed("xts(twofish)", DECRYPT, sec, NULL, 0,
2640                                   speed_template_32_48_64);
2641                break;
2642
2643        case 505:
2644                test_acipher_speed("ecb(arc4)", ENCRYPT, sec, NULL, 0,
2645                                   speed_template_8);
2646                break;
2647
2648        case 506:
2649                test_acipher_speed("ecb(cast5)", ENCRYPT, sec, NULL, 0,
2650                                   speed_template_8_16);
2651                test_acipher_speed("ecb(cast5)", DECRYPT, sec, NULL, 0,
2652                                   speed_template_8_16);
2653                test_acipher_speed("cbc(cast5)", ENCRYPT, sec, NULL, 0,
2654                                   speed_template_8_16);
2655                test_acipher_speed("cbc(cast5)", DECRYPT, sec, NULL, 0,
2656                                   speed_template_8_16);
2657                test_acipher_speed("ctr(cast5)", ENCRYPT, sec, NULL, 0,
2658                                   speed_template_8_16);
2659                test_acipher_speed("ctr(cast5)", DECRYPT, sec, NULL, 0,
2660                                   speed_template_8_16);
2661                break;
2662
2663        case 507:
2664                test_acipher_speed("ecb(cast6)", ENCRYPT, sec, NULL, 0,
2665                                   speed_template_16_32);
2666                test_acipher_speed("ecb(cast6)", DECRYPT, sec, NULL, 0,
2667                                   speed_template_16_32);
2668                test_acipher_speed("cbc(cast6)", ENCRYPT, sec, NULL, 0,
2669                                   speed_template_16_32);
2670                test_acipher_speed("cbc(cast6)", DECRYPT, sec, NULL, 0,
2671                                   speed_template_16_32);
2672                test_acipher_speed("ctr(cast6)", ENCRYPT, sec, NULL, 0,
2673                                   speed_template_16_32);
2674                test_acipher_speed("ctr(cast6)", DECRYPT, sec, NULL, 0,
2675                                   speed_template_16_32);
2676                test_acipher_speed("lrw(cast6)", ENCRYPT, sec, NULL, 0,
2677                                   speed_template_32_48);
2678                test_acipher_speed("lrw(cast6)", DECRYPT, sec, NULL, 0,
2679                                   speed_template_32_48);
2680                test_acipher_speed("xts(cast6)", ENCRYPT, sec, NULL, 0,
2681                                   speed_template_32_64);
2682                test_acipher_speed("xts(cast6)", DECRYPT, sec, NULL, 0,
2683                                   speed_template_32_64);
2684                break;
2685
2686        case 508:
2687                test_acipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
2688                                   speed_template_16_32);
2689                test_acipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
2690                                   speed_template_16_32);
2691                test_acipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
2692                                   speed_template_16_32);
2693                test_acipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
2694                                   speed_template_16_32);
2695                test_acipher_speed("ctr(camellia)", ENCRYPT, sec, NULL, 0,
2696                                   speed_template_16_32);
2697                test_acipher_speed("ctr(camellia)", DECRYPT, sec, NULL, 0,
2698                                   speed_template_16_32);
2699                test_acipher_speed("lrw(camellia)", ENCRYPT, sec, NULL, 0,
2700                                   speed_template_32_48);
2701                test_acipher_speed("lrw(camellia)", DECRYPT, sec, NULL, 0,
2702                                   speed_template_32_48);
2703                test_acipher_speed("xts(camellia)", ENCRYPT, sec, NULL, 0,
2704                                   speed_template_32_64);
2705                test_acipher_speed("xts(camellia)", DECRYPT, sec, NULL, 0,
2706                                   speed_template_32_64);
2707                break;
2708
2709        case 509:
2710                test_acipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
2711                                   speed_template_8_32);
2712                test_acipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
2713                                   speed_template_8_32);
2714                test_acipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
2715                                   speed_template_8_32);
2716                test_acipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
2717                                   speed_template_8_32);
2718                test_acipher_speed("ctr(blowfish)", ENCRYPT, sec, NULL, 0,
2719                                   speed_template_8_32);
2720                test_acipher_speed("ctr(blowfish)", DECRYPT, sec, NULL, 0,
2721                                   speed_template_8_32);
2722                break;
2723
2724        case 600:
2725                test_mb_skcipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
2726                                       speed_template_16_24_32, num_mb);
2727                test_mb_skcipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
2728                                       speed_template_16_24_32, num_mb);
2729                test_mb_skcipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
2730                                       speed_template_16_24_32, num_mb);
2731                test_mb_skcipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
2732                                       speed_template_16_24_32, num_mb);
2733                test_mb_skcipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
2734                                       speed_template_32_40_48, num_mb);
2735                test_mb_skcipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
2736                                       speed_template_32_40_48, num_mb);
2737                test_mb_skcipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
2738                                       speed_template_32_64, num_mb);
2739                test_mb_skcipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
2740                                       speed_template_32_64, num_mb);
2741                test_mb_skcipher_speed("cts(cbc(aes))", ENCRYPT, sec, NULL, 0,
2742                                       speed_template_16_24_32, num_mb);
2743                test_mb_skcipher_speed("cts(cbc(aes))", DECRYPT, sec, NULL, 0,
2744                                       speed_template_16_24_32, num_mb);
2745                test_mb_skcipher_speed("ctr(aes)", ENCRYPT, sec, NULL, 0,
2746                                       speed_template_16_24_32, num_mb);
2747                test_mb_skcipher_speed("ctr(aes)", DECRYPT, sec, NULL, 0,
2748                                       speed_template_16_24_32, num_mb);
2749                test_mb_skcipher_speed("cfb(aes)", ENCRYPT, sec, NULL, 0,
2750                                       speed_template_16_24_32, num_mb);
2751                test_mb_skcipher_speed("cfb(aes)", DECRYPT, sec, NULL, 0,
2752                                       speed_template_16_24_32, num_mb);
2753                test_mb_skcipher_speed("ofb(aes)", ENCRYPT, sec, NULL, 0,
2754                                       speed_template_16_24_32, num_mb);
2755                test_mb_skcipher_speed("ofb(aes)", DECRYPT, sec, NULL, 0,
2756                                       speed_template_16_24_32, num_mb);
2757                test_mb_skcipher_speed("rfc3686(ctr(aes))", ENCRYPT, sec, NULL,
2758                                       0, speed_template_20_28_36, num_mb);
2759                test_mb_skcipher_speed("rfc3686(ctr(aes))", DECRYPT, sec, NULL,
2760                                       0, speed_template_20_28_36, num_mb);
2761                break;
2762
2763        case 601:
2764                test_mb_skcipher_speed("ecb(des3_ede)", ENCRYPT, sec,
2765                                       des3_speed_template, DES3_SPEED_VECTORS,
2766                                       speed_template_24, num_mb);
2767                test_mb_skcipher_speed("ecb(des3_ede)", DECRYPT, sec,
2768                                       des3_speed_template, DES3_SPEED_VECTORS,
2769                                       speed_template_24, num_mb);
2770                test_mb_skcipher_speed("cbc(des3_ede)", ENCRYPT, sec,
2771                                       des3_speed_template, DES3_SPEED_VECTORS,
2772                                       speed_template_24, num_mb);
2773                test_mb_skcipher_speed("cbc(des3_ede)", DECRYPT, sec,
2774                                       des3_speed_template, DES3_SPEED_VECTORS,
2775                                       speed_template_24, num_mb);
2776                test_mb_skcipher_speed("cfb(des3_ede)", ENCRYPT, sec,
2777                                       des3_speed_template, DES3_SPEED_VECTORS,
2778                                       speed_template_24, num_mb);
2779                test_mb_skcipher_speed("cfb(des3_ede)", DECRYPT, sec,
2780                                       des3_speed_template, DES3_SPEED_VECTORS,
2781                                       speed_template_24, num_mb);
2782                test_mb_skcipher_speed("ofb(des3_ede)", ENCRYPT, sec,
2783                                       des3_speed_template, DES3_SPEED_VECTORS,
2784                                       speed_template_24, num_mb);
2785                test_mb_skcipher_speed("ofb(des3_ede)", DECRYPT, sec,
2786                                       des3_speed_template, DES3_SPEED_VECTORS,
2787                                       speed_template_24, num_mb);
2788                break;
2789
2790        case 602:
2791                test_mb_skcipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
2792                                       speed_template_8, num_mb);
2793                test_mb_skcipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
2794                                       speed_template_8, num_mb);
2795                test_mb_skcipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
2796                                       speed_template_8, num_mb);
2797                test_mb_skcipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
2798                                       speed_template_8, num_mb);
2799                test_mb_skcipher_speed("cfb(des)", ENCRYPT, sec, NULL, 0,
2800                                       speed_template_8, num_mb);
2801                test_mb_skcipher_speed("cfb(des)", DECRYPT, sec, NULL, 0,
2802                                       speed_template_8, num_mb);
2803                test_mb_skcipher_speed("ofb(des)", ENCRYPT, sec, NULL, 0,
2804                                       speed_template_8, num_mb);
2805                test_mb_skcipher_speed("ofb(des)", DECRYPT, sec, NULL, 0,
2806                                       speed_template_8, num_mb);
2807                break;
2808
2809        case 603:
2810                test_mb_skcipher_speed("ecb(serpent)", ENCRYPT, sec, NULL, 0,
2811                                       speed_template_16_32, num_mb);
2812                test_mb_skcipher_speed("ecb(serpent)", DECRYPT, sec, NULL, 0,
2813                                       speed_template_16_32, num_mb);
2814                test_mb_skcipher_speed("cbc(serpent)", ENCRYPT, sec, NULL, 0,
2815                                       speed_template_16_32, num_mb);
2816                test_mb_skcipher_speed("cbc(serpent)", DECRYPT, sec, NULL, 0,
2817                                       speed_template_16_32, num_mb);
2818                test_mb_skcipher_speed("ctr(serpent)", ENCRYPT, sec, NULL, 0,
2819                                       speed_template_16_32, num_mb);
2820                test_mb_skcipher_speed("ctr(serpent)", DECRYPT, sec, NULL, 0,
2821                                       speed_template_16_32, num_mb);
2822                test_mb_skcipher_speed("lrw(serpent)", ENCRYPT, sec, NULL, 0,
2823                                       speed_template_32_48, num_mb);
2824                test_mb_skcipher_speed("lrw(serpent)", DECRYPT, sec, NULL, 0,
2825                                       speed_template_32_48, num_mb);
2826                test_mb_skcipher_speed("xts(serpent)", ENCRYPT, sec, NULL, 0,
2827                                       speed_template_32_64, num_mb);
2828                test_mb_skcipher_speed("xts(serpent)", DECRYPT, sec, NULL, 0,
2829                                       speed_template_32_64, num_mb);
2830                break;
2831
2832        case 604:
2833                test_mb_skcipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
2834                                       speed_template_16_24_32, num_mb);
2835                test_mb_skcipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
2836                                       speed_template_16_24_32, num_mb);
2837                test_mb_skcipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
2838                                       speed_template_16_24_32, num_mb);
2839                test_mb_skcipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
2840                                       speed_template_16_24_32, num_mb);
2841                test_mb_skcipher_speed("ctr(twofish)", ENCRYPT, sec, NULL, 0,
2842                                       speed_template_16_24_32, num_mb);
2843                test_mb_skcipher_speed("ctr(twofish)", DECRYPT, sec, NULL, 0,
2844                                       speed_template_16_24_32, num_mb);
2845                test_mb_skcipher_speed("lrw(twofish)", ENCRYPT, sec, NULL, 0,
2846                                       speed_template_32_40_48, num_mb);
2847                test_mb_skcipher_speed("lrw(twofish)", DECRYPT, sec, NULL, 0,
2848                                       speed_template_32_40_48, num_mb);
2849                test_mb_skcipher_speed("xts(twofish)", ENCRYPT, sec, NULL, 0,
2850                                       speed_template_32_48_64, num_mb);
2851                test_mb_skcipher_speed("xts(twofish)", DECRYPT, sec, NULL, 0,
2852                                       speed_template_32_48_64, num_mb);
2853                break;
2854
2855        case 605:
2856                test_mb_skcipher_speed("ecb(arc4)", ENCRYPT, sec, NULL, 0,
2857                                       speed_template_8, num_mb);
2858                break;
2859
2860        case 606:
2861                test_mb_skcipher_speed("ecb(cast5)", ENCRYPT, sec, NULL, 0,
2862                                       speed_template_8_16, num_mb);
2863                test_mb_skcipher_speed("ecb(cast5)", DECRYPT, sec, NULL, 0,
2864                                       speed_template_8_16, num_mb);
2865                test_mb_skcipher_speed("cbc(cast5)", ENCRYPT, sec, NULL, 0,
2866                                       speed_template_8_16, num_mb);
2867                test_mb_skcipher_speed("cbc(cast5)", DECRYPT, sec, NULL, 0,
2868                                       speed_template_8_16, num_mb);
2869                test_mb_skcipher_speed("ctr(cast5)", ENCRYPT, sec, NULL, 0,
2870                                       speed_template_8_16, num_mb);
2871                test_mb_skcipher_speed("ctr(cast5)", DECRYPT, sec, NULL, 0,
2872                                       speed_template_8_16, num_mb);
2873                break;
2874
2875        case 607:
2876                test_mb_skcipher_speed("ecb(cast6)", ENCRYPT, sec, NULL, 0,
2877                                       speed_template_16_32, num_mb);
2878                test_mb_skcipher_speed("ecb(cast6)", DECRYPT, sec, NULL, 0,
2879                                       speed_template_16_32, num_mb);
2880                test_mb_skcipher_speed("cbc(cast6)", ENCRYPT, sec, NULL, 0,
2881                                       speed_template_16_32, num_mb);
2882                test_mb_skcipher_speed("cbc(cast6)", DECRYPT, sec, NULL, 0,
2883                                       speed_template_16_32, num_mb);
2884                test_mb_skcipher_speed("ctr(cast6)", ENCRYPT, sec, NULL, 0,
2885                                       speed_template_16_32, num_mb);
2886                test_mb_skcipher_speed("ctr(cast6)", DECRYPT, sec, NULL, 0,
2887                                       speed_template_16_32, num_mb);
2888                test_mb_skcipher_speed("lrw(cast6)", ENCRYPT, sec, NULL, 0,
2889                                       speed_template_32_48, num_mb);
2890                test_mb_skcipher_speed("lrw(cast6)", DECRYPT, sec, NULL, 0,
2891                                       speed_template_32_48, num_mb);
2892                test_mb_skcipher_speed("xts(cast6)", ENCRYPT, sec, NULL, 0,
2893                                       speed_template_32_64, num_mb);
2894                test_mb_skcipher_speed("xts(cast6)", DECRYPT, sec, NULL, 0,
2895                                       speed_template_32_64, num_mb);
2896                break;
2897
2898        case 608:
2899                test_mb_skcipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
2900                                       speed_template_16_32, num_mb);
2901                test_mb_skcipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
2902                                       speed_template_16_32, num_mb);
2903                test_mb_skcipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
2904                                       speed_template_16_32, num_mb);
2905                test_mb_skcipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
2906                                       speed_template_16_32, num_mb);
2907                test_mb_skcipher_speed("ctr(camellia)", ENCRYPT, sec, NULL, 0,
2908                                       speed_template_16_32, num_mb);
2909                test_mb_skcipher_speed("ctr(camellia)", DECRYPT, sec, NULL, 0,
2910                                       speed_template_16_32, num_mb);
2911                test_mb_skcipher_speed("lrw(camellia)", ENCRYPT, sec, NULL, 0,
2912                                       speed_template_32_48, num_mb);
2913                test_mb_skcipher_speed("lrw(camellia)", DECRYPT, sec, NULL, 0,
2914                                       speed_template_32_48, num_mb);
2915                test_mb_skcipher_speed("xts(camellia)", ENCRYPT, sec, NULL, 0,
2916                                       speed_template_32_64, num_mb);
2917                test_mb_skcipher_speed("xts(camellia)", DECRYPT, sec, NULL, 0,
2918                                       speed_template_32_64, num_mb);
2919                break;
2920
2921        case 609:
2922                test_mb_skcipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
2923                                       speed_template_8_32, num_mb);
2924                test_mb_skcipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
2925                                       speed_template_8_32, num_mb);
2926                test_mb_skcipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
2927                                       speed_template_8_32, num_mb);
2928                test_mb_skcipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
2929                                       speed_template_8_32, num_mb);
2930                test_mb_skcipher_speed("ctr(blowfish)", ENCRYPT, sec, NULL, 0,
2931                                       speed_template_8_32, num_mb);
2932                test_mb_skcipher_speed("ctr(blowfish)", DECRYPT, sec, NULL, 0,
2933                                       speed_template_8_32, num_mb);
2934                break;
2935
2936        case 1000:
2937                test_available();
2938                break;
2939        }
2940
2941        return ret;
2942}
2943
2944static int __init tcrypt_mod_init(void)
2945{
2946        int err = -ENOMEM;
2947        int i;
2948
2949        for (i = 0; i < TVMEMSIZE; i++) {
2950                tvmem[i] = (void *)__get_free_page(GFP_KERNEL);
2951                if (!tvmem[i])
2952                        goto err_free_tv;
2953        }
2954
2955        err = do_test(alg, type, mask, mode, num_mb);
2956
2957        if (err) {
2958                printk(KERN_ERR "tcrypt: one or more tests failed!\n");
2959                goto err_free_tv;
2960        } else {
2961                pr_debug("all tests passed\n");
2962        }
2963
2964        /* We intentionaly return -EAGAIN to prevent keeping the module,
2965         * unless we're running in fips mode. It does all its work from
2966         * init() and doesn't offer any runtime functionality, but in
2967         * the fips case, checking for a successful load is helpful.
2968         * => we don't need it in the memory, do we?
2969         *                                        -- mludvig
2970         */
2971        if (!fips_enabled)
2972                err = -EAGAIN;
2973
2974err_free_tv:
2975        for (i = 0; i < TVMEMSIZE && tvmem[i]; i++)
2976                free_page((unsigned long)tvmem[i]);
2977
2978        return err;
2979}
2980
2981/*
2982 * If an init function is provided, an exit function must also be provided
2983 * to allow module unload.
2984 */
2985static void __exit tcrypt_mod_fini(void) { }
2986
2987late_initcall(tcrypt_mod_init);
2988module_exit(tcrypt_mod_fini);
2989
2990module_param(alg, charp, 0);
2991module_param(type, uint, 0);
2992module_param(mask, uint, 0);
2993module_param(mode, int, 0);
2994module_param(sec, uint, 0);
2995MODULE_PARM_DESC(sec, "Length in seconds of speed tests "
2996                      "(defaults to zero which uses CPU cycles instead)");
2997module_param(num_mb, uint, 0000);
2998MODULE_PARM_DESC(num_mb, "Number of concurrent requests to be used in mb speed tests (defaults to 8)");
2999module_param(klen, uint, 0);
3000MODULE_PARM_DESC(klen, "Key length (defaults to 0)");
3001
3002MODULE_LICENSE("GPL");
3003MODULE_DESCRIPTION("Quick & dirty crypto testing module");
3004MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");
3005