linux/crypto/testmgr.c
<<
>>
Prefs
   1/*
   2 * Algorithm testing framework and tests.
   3 *
   4 * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
   5 * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
   6 * Copyright (c) 2007 Nokia Siemens Networks
   7 * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
   8 *
   9 * Updated RFC4106 AES-GCM testing.
  10 *    Authors: Aidan O'Mahony (aidan.o.mahony@intel.com)
  11 *             Adrian Hoban <adrian.hoban@intel.com>
  12 *             Gabriele Paoloni <gabriele.paoloni@intel.com>
  13 *             Tadeusz Struk (tadeusz.struk@intel.com)
  14 *    Copyright (c) 2010, Intel Corporation.
  15 *
  16 * This program is free software; you can redistribute it and/or modify it
  17 * under the terms of the GNU General Public License as published by the Free
  18 * Software Foundation; either version 2 of the License, or (at your option)
  19 * any later version.
  20 *
  21 */
  22
  23#include <crypto/aead.h>
  24#include <crypto/hash.h>
  25#include <crypto/skcipher.h>
  26#include <linux/err.h>
  27#include <linux/fips.h>
  28#include <linux/module.h>
  29#include <linux/scatterlist.h>
  30#include <linux/slab.h>
  31#include <linux/string.h>
  32#include <crypto/rng.h>
  33#include <crypto/drbg.h>
  34#include <crypto/akcipher.h>
  35
  36#include "internal.h"
  37
  38static bool notests;
  39module_param(notests, bool, 0644);
  40MODULE_PARM_DESC(notests, "disable crypto self-tests");
  41
  42#ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS
  43
  44/* a perfect nop */
  45int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
  46{
  47        return 0;
  48}
  49
  50#else
  51
  52#include "testmgr.h"
  53
  54/*
  55 * Need slab memory for testing (size in number of pages).
  56 */
  57#define XBUFSIZE        8
  58
  59/*
  60 * Indexes into the xbuf to simulate cross-page access.
  61 */
  62#define IDX1            32
  63#define IDX2            32400
  64#define IDX3            1
  65#define IDX4            8193
  66#define IDX5            22222
  67#define IDX6            17101
  68#define IDX7            27333
  69#define IDX8            3000
  70
  71/*
  72* Used by test_cipher()
  73*/
  74#define ENCRYPT 1
  75#define DECRYPT 0
  76
  77struct tcrypt_result {
  78        struct completion completion;
  79        int err;
  80};
  81
  82struct aead_test_suite {
  83        struct {
  84                struct aead_testvec *vecs;
  85                unsigned int count;
  86        } enc, dec;
  87};
  88
  89struct cipher_test_suite {
  90        struct {
  91                struct cipher_testvec *vecs;
  92                unsigned int count;
  93        } enc, dec;
  94};
  95
  96struct comp_test_suite {
  97        struct {
  98                struct comp_testvec *vecs;
  99                unsigned int count;
 100        } comp, decomp;
 101};
 102
 103struct hash_test_suite {
 104        struct hash_testvec *vecs;
 105        unsigned int count;
 106};
 107
 108struct cprng_test_suite {
 109        struct cprng_testvec *vecs;
 110        unsigned int count;
 111};
 112
 113struct drbg_test_suite {
 114        struct drbg_testvec *vecs;
 115        unsigned int count;
 116};
 117
 118struct akcipher_test_suite {
 119        struct akcipher_testvec *vecs;
 120        unsigned int count;
 121};
 122
 123struct alg_test_desc {
 124        const char *alg;
 125        int (*test)(const struct alg_test_desc *desc, const char *driver,
 126                    u32 type, u32 mask);
 127        int fips_allowed;       /* set if alg is allowed in fips mode */
 128
 129        union {
 130                struct aead_test_suite aead;
 131                struct cipher_test_suite cipher;
 132                struct comp_test_suite comp;
 133                struct hash_test_suite hash;
 134                struct cprng_test_suite cprng;
 135                struct drbg_test_suite drbg;
 136                struct akcipher_test_suite akcipher;
 137        } suite;
 138};
 139
 140static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
 141
 142static void hexdump(unsigned char *buf, unsigned int len)
 143{
 144        print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
 145                        16, 1,
 146                        buf, len, false);
 147}
 148
 149static void tcrypt_complete(struct crypto_async_request *req, int err)
 150{
 151        struct tcrypt_result *res = req->data;
 152
 153        if (err == -EINPROGRESS)
 154                return;
 155
 156        res->err = err;
 157        complete(&res->completion);
 158}
 159
 160static int testmgr_alloc_buf(char *buf[XBUFSIZE])
 161{
 162        int i;
 163
 164        for (i = 0; i < XBUFSIZE; i++) {
 165                buf[i] = (void *)__get_free_page(GFP_KERNEL);
 166                if (!buf[i])
 167                        goto err_free_buf;
 168        }
 169
 170        return 0;
 171
 172err_free_buf:
 173        while (i-- > 0)
 174                free_page((unsigned long)buf[i]);
 175
 176        return -ENOMEM;
 177}
 178
 179static void testmgr_free_buf(char *buf[XBUFSIZE])
 180{
 181        int i;
 182
 183        for (i = 0; i < XBUFSIZE; i++)
 184                free_page((unsigned long)buf[i]);
 185}
 186
 187static int wait_async_op(struct tcrypt_result *tr, int ret)
 188{
 189        if (ret == -EINPROGRESS || ret == -EBUSY) {
 190                wait_for_completion(&tr->completion);
 191                reinit_completion(&tr->completion);
 192                ret = tr->err;
 193        }
 194        return ret;
 195}
 196
 197static int ahash_partial_update(struct ahash_request **preq,
 198        struct crypto_ahash *tfm, struct hash_testvec *template,
 199        void *hash_buff, int k, int temp, struct scatterlist *sg,
 200        const char *algo, char *result, struct tcrypt_result *tresult)
 201{
 202        char *state;
 203        struct ahash_request *req;
 204        int statesize, ret = -EINVAL;
 205
 206        req = *preq;
 207        statesize = crypto_ahash_statesize(
 208                        crypto_ahash_reqtfm(req));
 209        state = kmalloc(statesize, GFP_KERNEL);
 210        if (!state) {
 211                pr_err("alt: hash: Failed to alloc state for %s\n", algo);
 212                goto out_nostate;
 213        }
 214        ret = crypto_ahash_export(req, state);
 215        if (ret) {
 216                pr_err("alt: hash: Failed to export() for %s\n", algo);
 217                goto out;
 218        }
 219        ahash_request_free(req);
 220        req = ahash_request_alloc(tfm, GFP_KERNEL);
 221        if (!req) {
 222                pr_err("alg: hash: Failed to alloc request for %s\n", algo);
 223                goto out_noreq;
 224        }
 225        ahash_request_set_callback(req,
 226                CRYPTO_TFM_REQ_MAY_BACKLOG,
 227                tcrypt_complete, tresult);
 228
 229        memcpy(hash_buff, template->plaintext + temp,
 230                template->tap[k]);
 231        sg_init_one(&sg[0], hash_buff, template->tap[k]);
 232        ahash_request_set_crypt(req, sg, result, template->tap[k]);
 233        ret = crypto_ahash_import(req, state);
 234        if (ret) {
 235                pr_err("alg: hash: Failed to import() for %s\n", algo);
 236                goto out;
 237        }
 238        ret = wait_async_op(tresult, crypto_ahash_update(req));
 239        if (ret)
 240                goto out;
 241        *preq = req;
 242        ret = 0;
 243        goto out_noreq;
 244out:
 245        ahash_request_free(req);
 246out_noreq:
 247        kfree(state);
 248out_nostate:
 249        return ret;
 250}
 251
 252static int __test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
 253                       unsigned int tcount, bool use_digest,
 254                       const int align_offset)
 255{
 256        const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
 257        unsigned int i, j, k, temp;
 258        struct scatterlist sg[8];
 259        char *result;
 260        char *key;
 261        struct ahash_request *req;
 262        struct tcrypt_result tresult;
 263        void *hash_buff;
 264        char *xbuf[XBUFSIZE];
 265        int ret = -ENOMEM;
 266
 267        result = kmalloc(MAX_DIGEST_SIZE, GFP_KERNEL);
 268        if (!result)
 269                return ret;
 270        key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
 271        if (!key)
 272                goto out_nobuf;
 273        if (testmgr_alloc_buf(xbuf))
 274                goto out_nobuf;
 275
 276        init_completion(&tresult.completion);
 277
 278        req = ahash_request_alloc(tfm, GFP_KERNEL);
 279        if (!req) {
 280                printk(KERN_ERR "alg: hash: Failed to allocate request for "
 281                       "%s\n", algo);
 282                goto out_noreq;
 283        }
 284        ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
 285                                   tcrypt_complete, &tresult);
 286
 287        j = 0;
 288        for (i = 0; i < tcount; i++) {
 289                if (template[i].np)
 290                        continue;
 291
 292                ret = -EINVAL;
 293                if (WARN_ON(align_offset + template[i].psize > PAGE_SIZE))
 294                        goto out;
 295
 296                j++;
 297                memset(result, 0, MAX_DIGEST_SIZE);
 298
 299                hash_buff = xbuf[0];
 300                hash_buff += align_offset;
 301
 302                memcpy(hash_buff, template[i].plaintext, template[i].psize);
 303                sg_init_one(&sg[0], hash_buff, template[i].psize);
 304
 305                if (template[i].ksize) {
 306                        crypto_ahash_clear_flags(tfm, ~0);
 307                        if (template[i].ksize > MAX_KEYLEN) {
 308                                pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
 309                                       j, algo, template[i].ksize, MAX_KEYLEN);
 310                                ret = -EINVAL;
 311                                goto out;
 312                        }
 313                        memcpy(key, template[i].key, template[i].ksize);
 314                        ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
 315                        if (ret) {
 316                                printk(KERN_ERR "alg: hash: setkey failed on "
 317                                       "test %d for %s: ret=%d\n", j, algo,
 318                                       -ret);
 319                                goto out;
 320                        }
 321                }
 322
 323                ahash_request_set_crypt(req, sg, result, template[i].psize);
 324                if (use_digest) {
 325                        ret = wait_async_op(&tresult, crypto_ahash_digest(req));
 326                        if (ret) {
 327                                pr_err("alg: hash: digest failed on test %d "
 328                                       "for %s: ret=%d\n", j, algo, -ret);
 329                                goto out;
 330                        }
 331                } else {
 332                        ret = wait_async_op(&tresult, crypto_ahash_init(req));
 333                        if (ret) {
 334                                pr_err("alt: hash: init failed on test %d "
 335                                       "for %s: ret=%d\n", j, algo, -ret);
 336                                goto out;
 337                        }
 338                        ret = wait_async_op(&tresult, crypto_ahash_update(req));
 339                        if (ret) {
 340                                pr_err("alt: hash: update failed on test %d "
 341                                       "for %s: ret=%d\n", j, algo, -ret);
 342                                goto out;
 343                        }
 344                        ret = wait_async_op(&tresult, crypto_ahash_final(req));
 345                        if (ret) {
 346                                pr_err("alt: hash: final failed on test %d "
 347                                       "for %s: ret=%d\n", j, algo, -ret);
 348                                goto out;
 349                        }
 350                }
 351
 352                if (memcmp(result, template[i].digest,
 353                           crypto_ahash_digestsize(tfm))) {
 354                        printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
 355                               j, algo);
 356                        hexdump(result, crypto_ahash_digestsize(tfm));
 357                        ret = -EINVAL;
 358                        goto out;
 359                }
 360        }
 361
 362        j = 0;
 363        for (i = 0; i < tcount; i++) {
 364                /* alignment tests are only done with continuous buffers */
 365                if (align_offset != 0)
 366                        break;
 367
 368                if (!template[i].np)
 369                        continue;
 370
 371                j++;
 372                memset(result, 0, MAX_DIGEST_SIZE);
 373
 374                temp = 0;
 375                sg_init_table(sg, template[i].np);
 376                ret = -EINVAL;
 377                for (k = 0; k < template[i].np; k++) {
 378                        if (WARN_ON(offset_in_page(IDX[k]) +
 379                                    template[i].tap[k] > PAGE_SIZE))
 380                                goto out;
 381                        sg_set_buf(&sg[k],
 382                                   memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
 383                                          offset_in_page(IDX[k]),
 384                                          template[i].plaintext + temp,
 385                                          template[i].tap[k]),
 386                                   template[i].tap[k]);
 387                        temp += template[i].tap[k];
 388                }
 389
 390                if (template[i].ksize) {
 391                        if (template[i].ksize > MAX_KEYLEN) {
 392                                pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
 393                                       j, algo, template[i].ksize, MAX_KEYLEN);
 394                                ret = -EINVAL;
 395                                goto out;
 396                        }
 397                        crypto_ahash_clear_flags(tfm, ~0);
 398                        memcpy(key, template[i].key, template[i].ksize);
 399                        ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
 400
 401                        if (ret) {
 402                                printk(KERN_ERR "alg: hash: setkey "
 403                                       "failed on chunking test %d "
 404                                       "for %s: ret=%d\n", j, algo, -ret);
 405                                goto out;
 406                        }
 407                }
 408
 409                ahash_request_set_crypt(req, sg, result, template[i].psize);
 410                ret = crypto_ahash_digest(req);
 411                switch (ret) {
 412                case 0:
 413                        break;
 414                case -EINPROGRESS:
 415                case -EBUSY:
 416                        wait_for_completion(&tresult.completion);
 417                        reinit_completion(&tresult.completion);
 418                        ret = tresult.err;
 419                        if (!ret)
 420                                break;
 421                        /* fall through */
 422                default:
 423                        printk(KERN_ERR "alg: hash: digest failed "
 424                               "on chunking test %d for %s: "
 425                               "ret=%d\n", j, algo, -ret);
 426                        goto out;
 427                }
 428
 429                if (memcmp(result, template[i].digest,
 430                           crypto_ahash_digestsize(tfm))) {
 431                        printk(KERN_ERR "alg: hash: Chunking test %d "
 432                               "failed for %s\n", j, algo);
 433                        hexdump(result, crypto_ahash_digestsize(tfm));
 434                        ret = -EINVAL;
 435                        goto out;
 436                }
 437        }
 438
 439        /* partial update exercise */
 440        j = 0;
 441        for (i = 0; i < tcount; i++) {
 442                /* alignment tests are only done with continuous buffers */
 443                if (align_offset != 0)
 444                        break;
 445
 446                if (template[i].np < 2)
 447                        continue;
 448
 449                j++;
 450                memset(result, 0, MAX_DIGEST_SIZE);
 451
 452                ret = -EINVAL;
 453                hash_buff = xbuf[0];
 454                memcpy(hash_buff, template[i].plaintext,
 455                        template[i].tap[0]);
 456                sg_init_one(&sg[0], hash_buff, template[i].tap[0]);
 457
 458                if (template[i].ksize) {
 459                        crypto_ahash_clear_flags(tfm, ~0);
 460                        if (template[i].ksize > MAX_KEYLEN) {
 461                                pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
 462                                        j, algo, template[i].ksize, MAX_KEYLEN);
 463                                ret = -EINVAL;
 464                                goto out;
 465                        }
 466                        memcpy(key, template[i].key, template[i].ksize);
 467                        ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
 468                        if (ret) {
 469                                pr_err("alg: hash: setkey failed on test %d for %s: ret=%d\n",
 470                                        j, algo, -ret);
 471                                goto out;
 472                        }
 473                }
 474
 475                ahash_request_set_crypt(req, sg, result, template[i].tap[0]);
 476                ret = wait_async_op(&tresult, crypto_ahash_init(req));
 477                if (ret) {
 478                        pr_err("alt: hash: init failed on test %d for %s: ret=%d\n",
 479                                j, algo, -ret);
 480                        goto out;
 481                }
 482                ret = wait_async_op(&tresult, crypto_ahash_update(req));
 483                if (ret) {
 484                        pr_err("alt: hash: update failed on test %d for %s: ret=%d\n",
 485                                j, algo, -ret);
 486                        goto out;
 487                }
 488
 489                temp = template[i].tap[0];
 490                for (k = 1; k < template[i].np; k++) {
 491                        ret = ahash_partial_update(&req, tfm, &template[i],
 492                                hash_buff, k, temp, &sg[0], algo, result,
 493                                &tresult);
 494                        if (ret) {
 495                                pr_err("hash: partial update failed on test %d for %s: ret=%d\n",
 496                                        j, algo, -ret);
 497                                goto out_noreq;
 498                        }
 499                        temp += template[i].tap[k];
 500                }
 501                ret = wait_async_op(&tresult, crypto_ahash_final(req));
 502                if (ret) {
 503                        pr_err("alt: hash: final failed on test %d for %s: ret=%d\n",
 504                                j, algo, -ret);
 505                        goto out;
 506                }
 507                if (memcmp(result, template[i].digest,
 508                           crypto_ahash_digestsize(tfm))) {
 509                        pr_err("alg: hash: Partial Test %d failed for %s\n",
 510                               j, algo);
 511                        hexdump(result, crypto_ahash_digestsize(tfm));
 512                        ret = -EINVAL;
 513                        goto out;
 514                }
 515        }
 516
 517        ret = 0;
 518
 519out:
 520        ahash_request_free(req);
 521out_noreq:
 522        testmgr_free_buf(xbuf);
 523out_nobuf:
 524        kfree(key);
 525        kfree(result);
 526        return ret;
 527}
 528
 529static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
 530                     unsigned int tcount, bool use_digest)
 531{
 532        unsigned int alignmask;
 533        int ret;
 534
 535        ret = __test_hash(tfm, template, tcount, use_digest, 0);
 536        if (ret)
 537                return ret;
 538
 539        /* test unaligned buffers, check with one byte offset */
 540        ret = __test_hash(tfm, template, tcount, use_digest, 1);
 541        if (ret)
 542                return ret;
 543
 544        alignmask = crypto_tfm_alg_alignmask(&tfm->base);
 545        if (alignmask) {
 546                /* Check if alignment mask for tfm is correctly set. */
 547                ret = __test_hash(tfm, template, tcount, use_digest,
 548                                  alignmask + 1);
 549                if (ret)
 550                        return ret;
 551        }
 552
 553        return 0;
 554}
 555
 556static int __test_aead(struct crypto_aead *tfm, int enc,
 557                       struct aead_testvec *template, unsigned int tcount,
 558                       const bool diff_dst, const int align_offset)
 559{
 560        const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
 561        unsigned int i, j, k, n, temp;
 562        int ret = -ENOMEM;
 563        char *q;
 564        char *key;
 565        struct aead_request *req;
 566        struct scatterlist *sg;
 567        struct scatterlist *sgout;
 568        const char *e, *d;
 569        struct tcrypt_result result;
 570        unsigned int authsize, iv_len;
 571        void *input;
 572        void *output;
 573        void *assoc;
 574        char *iv;
 575        char *xbuf[XBUFSIZE];
 576        char *xoutbuf[XBUFSIZE];
 577        char *axbuf[XBUFSIZE];
 578
 579        iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
 580        if (!iv)
 581                return ret;
 582        key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
 583        if (!key)
 584                goto out_noxbuf;
 585        if (testmgr_alloc_buf(xbuf))
 586                goto out_noxbuf;
 587        if (testmgr_alloc_buf(axbuf))
 588                goto out_noaxbuf;
 589        if (diff_dst && testmgr_alloc_buf(xoutbuf))
 590                goto out_nooutbuf;
 591
 592        /* avoid "the frame size is larger than 1024 bytes" compiler warning */
 593        sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 4 : 2), GFP_KERNEL);
 594        if (!sg)
 595                goto out_nosg;
 596        sgout = &sg[16];
 597
 598        if (diff_dst)
 599                d = "-ddst";
 600        else
 601                d = "";
 602
 603        if (enc == ENCRYPT)
 604                e = "encryption";
 605        else
 606                e = "decryption";
 607
 608        init_completion(&result.completion);
 609
 610        req = aead_request_alloc(tfm, GFP_KERNEL);
 611        if (!req) {
 612                pr_err("alg: aead%s: Failed to allocate request for %s\n",
 613                       d, algo);
 614                goto out;
 615        }
 616
 617        aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
 618                                  tcrypt_complete, &result);
 619
 620        iv_len = crypto_aead_ivsize(tfm);
 621
 622        for (i = 0, j = 0; i < tcount; i++) {
 623                if (template[i].np)
 624                        continue;
 625
 626                j++;
 627
 628                /* some templates have no input data but they will
 629                 * touch input
 630                 */
 631                input = xbuf[0];
 632                input += align_offset;
 633                assoc = axbuf[0];
 634
 635                ret = -EINVAL;
 636                if (WARN_ON(align_offset + template[i].ilen >
 637                            PAGE_SIZE || template[i].alen > PAGE_SIZE))
 638                        goto out;
 639
 640                memcpy(input, template[i].input, template[i].ilen);
 641                memcpy(assoc, template[i].assoc, template[i].alen);
 642                if (template[i].iv)
 643                        memcpy(iv, template[i].iv, iv_len);
 644                else
 645                        memset(iv, 0, iv_len);
 646
 647                crypto_aead_clear_flags(tfm, ~0);
 648                if (template[i].wk)
 649                        crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
 650
 651                if (template[i].klen > MAX_KEYLEN) {
 652                        pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
 653                               d, j, algo, template[i].klen,
 654                               MAX_KEYLEN);
 655                        ret = -EINVAL;
 656                        goto out;
 657                }
 658                memcpy(key, template[i].key, template[i].klen);
 659
 660                ret = crypto_aead_setkey(tfm, key, template[i].klen);
 661                if (!ret == template[i].fail) {
 662                        pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n",
 663                               d, j, algo, crypto_aead_get_flags(tfm));
 664                        goto out;
 665                } else if (ret)
 666                        continue;
 667
 668                authsize = abs(template[i].rlen - template[i].ilen);
 669                ret = crypto_aead_setauthsize(tfm, authsize);
 670                if (ret) {
 671                        pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n",
 672                               d, authsize, j, algo);
 673                        goto out;
 674                }
 675
 676                k = !!template[i].alen;
 677                sg_init_table(sg, k + 1);
 678                sg_set_buf(&sg[0], assoc, template[i].alen);
 679                sg_set_buf(&sg[k], input,
 680                           template[i].ilen + (enc ? authsize : 0));
 681                output = input;
 682
 683                if (diff_dst) {
 684                        sg_init_table(sgout, k + 1);
 685                        sg_set_buf(&sgout[0], assoc, template[i].alen);
 686
 687                        output = xoutbuf[0];
 688                        output += align_offset;
 689                        sg_set_buf(&sgout[k], output,
 690                                   template[i].rlen + (enc ? 0 : authsize));
 691                }
 692
 693                aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
 694                                       template[i].ilen, iv);
 695
 696                aead_request_set_ad(req, template[i].alen);
 697
 698                ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req);
 699
 700                switch (ret) {
 701                case 0:
 702                        if (template[i].novrfy) {
 703                                /* verification was supposed to fail */
 704                                pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n",
 705                                       d, e, j, algo);
 706                                /* so really, we got a bad message */
 707                                ret = -EBADMSG;
 708                                goto out;
 709                        }
 710                        break;
 711                case -EINPROGRESS:
 712                case -EBUSY:
 713                        wait_for_completion(&result.completion);
 714                        reinit_completion(&result.completion);
 715                        ret = result.err;
 716                        if (!ret)
 717                                break;
 718                case -EBADMSG:
 719                        if (template[i].novrfy)
 720                                /* verification failure was expected */
 721                                continue;
 722                        /* fall through */
 723                default:
 724                        pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n",
 725                               d, e, j, algo, -ret);
 726                        goto out;
 727                }
 728
 729                q = output;
 730                if (memcmp(q, template[i].result, template[i].rlen)) {
 731                        pr_err("alg: aead%s: Test %d failed on %s for %s\n",
 732                               d, j, e, algo);
 733                        hexdump(q, template[i].rlen);
 734                        ret = -EINVAL;
 735                        goto out;
 736                }
 737        }
 738
 739        for (i = 0, j = 0; i < tcount; i++) {
 740                /* alignment tests are only done with continuous buffers */
 741                if (align_offset != 0)
 742                        break;
 743
 744                if (!template[i].np)
 745                        continue;
 746
 747                j++;
 748
 749                if (template[i].iv)
 750                        memcpy(iv, template[i].iv, iv_len);
 751                else
 752                        memset(iv, 0, MAX_IVLEN);
 753
 754                crypto_aead_clear_flags(tfm, ~0);
 755                if (template[i].wk)
 756                        crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
 757                if (template[i].klen > MAX_KEYLEN) {
 758                        pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
 759                               d, j, algo, template[i].klen, MAX_KEYLEN);
 760                        ret = -EINVAL;
 761                        goto out;
 762                }
 763                memcpy(key, template[i].key, template[i].klen);
 764
 765                ret = crypto_aead_setkey(tfm, key, template[i].klen);
 766                if (!ret == template[i].fail) {
 767                        pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n",
 768                               d, j, algo, crypto_aead_get_flags(tfm));
 769                        goto out;
 770                } else if (ret)
 771                        continue;
 772
 773                authsize = abs(template[i].rlen - template[i].ilen);
 774
 775                ret = -EINVAL;
 776                sg_init_table(sg, template[i].anp + template[i].np);
 777                if (diff_dst)
 778                        sg_init_table(sgout, template[i].anp + template[i].np);
 779
 780                ret = -EINVAL;
 781                for (k = 0, temp = 0; k < template[i].anp; k++) {
 782                        if (WARN_ON(offset_in_page(IDX[k]) +
 783                                    template[i].atap[k] > PAGE_SIZE))
 784                                goto out;
 785                        sg_set_buf(&sg[k],
 786                                   memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
 787                                          offset_in_page(IDX[k]),
 788                                          template[i].assoc + temp,
 789                                          template[i].atap[k]),
 790                                   template[i].atap[k]);
 791                        if (diff_dst)
 792                                sg_set_buf(&sgout[k],
 793                                           axbuf[IDX[k] >> PAGE_SHIFT] +
 794                                           offset_in_page(IDX[k]),
 795                                           template[i].atap[k]);
 796                        temp += template[i].atap[k];
 797                }
 798
 799                for (k = 0, temp = 0; k < template[i].np; k++) {
 800                        if (WARN_ON(offset_in_page(IDX[k]) +
 801                                    template[i].tap[k] > PAGE_SIZE))
 802                                goto out;
 803
 804                        q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
 805                        memcpy(q, template[i].input + temp, template[i].tap[k]);
 806                        sg_set_buf(&sg[template[i].anp + k],
 807                                   q, template[i].tap[k]);
 808
 809                        if (diff_dst) {
 810                                q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
 811                                    offset_in_page(IDX[k]);
 812
 813                                memset(q, 0, template[i].tap[k]);
 814
 815                                sg_set_buf(&sgout[template[i].anp + k],
 816                                           q, template[i].tap[k]);
 817                        }
 818
 819                        n = template[i].tap[k];
 820                        if (k == template[i].np - 1 && enc)
 821                                n += authsize;
 822                        if (offset_in_page(q) + n < PAGE_SIZE)
 823                                q[n] = 0;
 824
 825                        temp += template[i].tap[k];
 826                }
 827
 828                ret = crypto_aead_setauthsize(tfm, authsize);
 829                if (ret) {
 830                        pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n",
 831                               d, authsize, j, algo);
 832                        goto out;
 833                }
 834
 835                if (enc) {
 836                        if (WARN_ON(sg[template[i].anp + k - 1].offset +
 837                                    sg[template[i].anp + k - 1].length +
 838                                    authsize > PAGE_SIZE)) {
 839                                ret = -EINVAL;
 840                                goto out;
 841                        }
 842
 843                        if (diff_dst)
 844                                sgout[template[i].anp + k - 1].length +=
 845                                        authsize;
 846                        sg[template[i].anp + k - 1].length += authsize;
 847                }
 848
 849                aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
 850                                       template[i].ilen,
 851                                       iv);
 852
 853                aead_request_set_ad(req, template[i].alen);
 854
 855                ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req);
 856
 857                switch (ret) {
 858                case 0:
 859                        if (template[i].novrfy) {
 860                                /* verification was supposed to fail */
 861                                pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n",
 862                                       d, e, j, algo);
 863                                /* so really, we got a bad message */
 864                                ret = -EBADMSG;
 865                                goto out;
 866                        }
 867                        break;
 868                case -EINPROGRESS:
 869                case -EBUSY:
 870                        wait_for_completion(&result.completion);
 871                        reinit_completion(&result.completion);
 872                        ret = result.err;
 873                        if (!ret)
 874                                break;
 875                case -EBADMSG:
 876                        if (template[i].novrfy)
 877                                /* verification failure was expected */
 878                                continue;
 879                        /* fall through */
 880                default:
 881                        pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n",
 882                               d, e, j, algo, -ret);
 883                        goto out;
 884                }
 885
 886                ret = -EINVAL;
 887                for (k = 0, temp = 0; k < template[i].np; k++) {
 888                        if (diff_dst)
 889                                q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
 890                                    offset_in_page(IDX[k]);
 891                        else
 892                                q = xbuf[IDX[k] >> PAGE_SHIFT] +
 893                                    offset_in_page(IDX[k]);
 894
 895                        n = template[i].tap[k];
 896                        if (k == template[i].np - 1)
 897                                n += enc ? authsize : -authsize;
 898
 899                        if (memcmp(q, template[i].result + temp, n)) {
 900                                pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n",
 901                                       d, j, e, k, algo);
 902                                hexdump(q, n);
 903                                goto out;
 904                        }
 905
 906                        q += n;
 907                        if (k == template[i].np - 1 && !enc) {
 908                                if (!diff_dst &&
 909                                        memcmp(q, template[i].input +
 910                                              temp + n, authsize))
 911                                        n = authsize;
 912                                else
 913                                        n = 0;
 914                        } else {
 915                                for (n = 0; offset_in_page(q + n) && q[n]; n++)
 916                                        ;
 917                        }
 918                        if (n) {
 919                                pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
 920                                       d, j, e, k, algo, n);
 921                                hexdump(q, n);
 922                                goto out;
 923                        }
 924
 925                        temp += template[i].tap[k];
 926                }
 927        }
 928
 929        ret = 0;
 930
 931out:
 932        aead_request_free(req);
 933        kfree(sg);
 934out_nosg:
 935        if (diff_dst)
 936                testmgr_free_buf(xoutbuf);
 937out_nooutbuf:
 938        testmgr_free_buf(axbuf);
 939out_noaxbuf:
 940        testmgr_free_buf(xbuf);
 941out_noxbuf:
 942        kfree(key);
 943        kfree(iv);
 944        return ret;
 945}
 946
 947static int test_aead(struct crypto_aead *tfm, int enc,
 948                     struct aead_testvec *template, unsigned int tcount)
 949{
 950        unsigned int alignmask;
 951        int ret;
 952
 953        /* test 'dst == src' case */
 954        ret = __test_aead(tfm, enc, template, tcount, false, 0);
 955        if (ret)
 956                return ret;
 957
 958        /* test 'dst != src' case */
 959        ret = __test_aead(tfm, enc, template, tcount, true, 0);
 960        if (ret)
 961                return ret;
 962
 963        /* test unaligned buffers, check with one byte offset */
 964        ret = __test_aead(tfm, enc, template, tcount, true, 1);
 965        if (ret)
 966                return ret;
 967
 968        alignmask = crypto_tfm_alg_alignmask(&tfm->base);
 969        if (alignmask) {
 970                /* Check if alignment mask for tfm is correctly set. */
 971                ret = __test_aead(tfm, enc, template, tcount, true,
 972                                  alignmask + 1);
 973                if (ret)
 974                        return ret;
 975        }
 976
 977        return 0;
 978}
 979
 980static int test_cipher(struct crypto_cipher *tfm, int enc,
 981                       struct cipher_testvec *template, unsigned int tcount)
 982{
 983        const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm));
 984        unsigned int i, j, k;
 985        char *q;
 986        const char *e;
 987        void *data;
 988        char *xbuf[XBUFSIZE];
 989        int ret = -ENOMEM;
 990
 991        if (testmgr_alloc_buf(xbuf))
 992                goto out_nobuf;
 993
 994        if (enc == ENCRYPT)
 995                e = "encryption";
 996        else
 997                e = "decryption";
 998
 999        j = 0;
1000        for (i = 0; i < tcount; i++) {
1001                if (template[i].np)
1002                        continue;
1003
1004                j++;
1005
1006                ret = -EINVAL;
1007                if (WARN_ON(template[i].ilen > PAGE_SIZE))
1008                        goto out;
1009
1010                data = xbuf[0];
1011                memcpy(data, template[i].input, template[i].ilen);
1012
1013                crypto_cipher_clear_flags(tfm, ~0);
1014                if (template[i].wk)
1015                        crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
1016
1017                ret = crypto_cipher_setkey(tfm, template[i].key,
1018                                           template[i].klen);
1019                if (!ret == template[i].fail) {
1020                        printk(KERN_ERR "alg: cipher: setkey failed "
1021                               "on test %d for %s: flags=%x\n", j,
1022                               algo, crypto_cipher_get_flags(tfm));
1023                        goto out;
1024                } else if (ret)
1025                        continue;
1026
1027                for (k = 0; k < template[i].ilen;
1028                     k += crypto_cipher_blocksize(tfm)) {
1029                        if (enc)
1030                                crypto_cipher_encrypt_one(tfm, data + k,
1031                                                          data + k);
1032                        else
1033                                crypto_cipher_decrypt_one(tfm, data + k,
1034                                                          data + k);
1035                }
1036
1037                q = data;
1038                if (memcmp(q, template[i].result, template[i].rlen)) {
1039                        printk(KERN_ERR "alg: cipher: Test %d failed "
1040                               "on %s for %s\n", j, e, algo);
1041                        hexdump(q, template[i].rlen);
1042                        ret = -EINVAL;
1043                        goto out;
1044                }
1045        }
1046
1047        ret = 0;
1048
1049out:
1050        testmgr_free_buf(xbuf);
1051out_nobuf:
1052        return ret;
1053}
1054
1055static int __test_skcipher(struct crypto_skcipher *tfm, int enc,
1056                           struct cipher_testvec *template, unsigned int tcount,
1057                           const bool diff_dst, const int align_offset)
1058{
1059        const char *algo =
1060                crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm));
1061        unsigned int i, j, k, n, temp;
1062        char *q;
1063        struct skcipher_request *req;
1064        struct scatterlist sg[8];
1065        struct scatterlist sgout[8];
1066        const char *e, *d;
1067        struct tcrypt_result result;
1068        void *data;
1069        char iv[MAX_IVLEN];
1070        char *xbuf[XBUFSIZE];
1071        char *xoutbuf[XBUFSIZE];
1072        int ret = -ENOMEM;
1073        unsigned int ivsize = crypto_skcipher_ivsize(tfm);
1074
1075        if (testmgr_alloc_buf(xbuf))
1076                goto out_nobuf;
1077
1078        if (diff_dst && testmgr_alloc_buf(xoutbuf))
1079                goto out_nooutbuf;
1080
1081        if (diff_dst)
1082                d = "-ddst";
1083        else
1084                d = "";
1085
1086        if (enc == ENCRYPT)
1087                e = "encryption";
1088        else
1089                e = "decryption";
1090
1091        init_completion(&result.completion);
1092
1093        req = skcipher_request_alloc(tfm, GFP_KERNEL);
1094        if (!req) {
1095                pr_err("alg: skcipher%s: Failed to allocate request for %s\n",
1096                       d, algo);
1097                goto out;
1098        }
1099
1100        skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1101                                      tcrypt_complete, &result);
1102
1103        j = 0;
1104        for (i = 0; i < tcount; i++) {
1105                if (template[i].np && !template[i].also_non_np)
1106                        continue;
1107
1108                if (template[i].iv)
1109                        memcpy(iv, template[i].iv, ivsize);
1110                else
1111                        memset(iv, 0, MAX_IVLEN);
1112
1113                j++;
1114                ret = -EINVAL;
1115                if (WARN_ON(align_offset + template[i].ilen > PAGE_SIZE))
1116                        goto out;
1117
1118                data = xbuf[0];
1119                data += align_offset;
1120                memcpy(data, template[i].input, template[i].ilen);
1121
1122                crypto_skcipher_clear_flags(tfm, ~0);
1123                if (template[i].wk)
1124                        crypto_skcipher_set_flags(tfm,
1125                                                  CRYPTO_TFM_REQ_WEAK_KEY);
1126
1127                ret = crypto_skcipher_setkey(tfm, template[i].key,
1128                                             template[i].klen);
1129                if (!ret == template[i].fail) {
1130                        pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n",
1131                               d, j, algo, crypto_skcipher_get_flags(tfm));
1132                        goto out;
1133                } else if (ret)
1134                        continue;
1135
1136                sg_init_one(&sg[0], data, template[i].ilen);
1137                if (diff_dst) {
1138                        data = xoutbuf[0];
1139                        data += align_offset;
1140                        sg_init_one(&sgout[0], data, template[i].ilen);
1141                }
1142
1143                skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1144                                           template[i].ilen, iv);
1145                ret = enc ? crypto_skcipher_encrypt(req) :
1146                            crypto_skcipher_decrypt(req);
1147
1148                switch (ret) {
1149                case 0:
1150                        break;
1151                case -EINPROGRESS:
1152                case -EBUSY:
1153                        wait_for_completion(&result.completion);
1154                        reinit_completion(&result.completion);
1155                        ret = result.err;
1156                        if (!ret)
1157                                break;
1158                        /* fall through */
1159                default:
1160                        pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n",
1161                               d, e, j, algo, -ret);
1162                        goto out;
1163                }
1164
1165                q = data;
1166                if (memcmp(q, template[i].result, template[i].rlen)) {
1167                        pr_err("alg: skcipher%s: Test %d failed (invalid result) on %s for %s\n",
1168                               d, j, e, algo);
1169                        hexdump(q, template[i].rlen);
1170                        ret = -EINVAL;
1171                        goto out;
1172                }
1173
1174                if (template[i].iv_out &&
1175                    memcmp(iv, template[i].iv_out,
1176                           crypto_skcipher_ivsize(tfm))) {
1177                        pr_err("alg: skcipher%s: Test %d failed (invalid output IV) on %s for %s\n",
1178                               d, j, e, algo);
1179                        hexdump(iv, crypto_skcipher_ivsize(tfm));
1180                        ret = -EINVAL;
1181                        goto out;
1182                }
1183        }
1184
1185        j = 0;
1186        for (i = 0; i < tcount; i++) {
1187                /* alignment tests are only done with continuous buffers */
1188                if (align_offset != 0)
1189                        break;
1190
1191                if (!template[i].np)
1192                        continue;
1193
1194                if (template[i].iv)
1195                        memcpy(iv, template[i].iv, ivsize);
1196                else
1197                        memset(iv, 0, MAX_IVLEN);
1198
1199                j++;
1200                crypto_skcipher_clear_flags(tfm, ~0);
1201                if (template[i].wk)
1202                        crypto_skcipher_set_flags(tfm,
1203                                                  CRYPTO_TFM_REQ_WEAK_KEY);
1204
1205                ret = crypto_skcipher_setkey(tfm, template[i].key,
1206                                             template[i].klen);
1207                if (!ret == template[i].fail) {
1208                        pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n",
1209                               d, j, algo, crypto_skcipher_get_flags(tfm));
1210                        goto out;
1211                } else if (ret)
1212                        continue;
1213
1214                temp = 0;
1215                ret = -EINVAL;
1216                sg_init_table(sg, template[i].np);
1217                if (diff_dst)
1218                        sg_init_table(sgout, template[i].np);
1219                for (k = 0; k < template[i].np; k++) {
1220                        if (WARN_ON(offset_in_page(IDX[k]) +
1221                                    template[i].tap[k] > PAGE_SIZE))
1222                                goto out;
1223
1224                        q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
1225
1226                        memcpy(q, template[i].input + temp, template[i].tap[k]);
1227
1228                        if (offset_in_page(q) + template[i].tap[k] < PAGE_SIZE)
1229                                q[template[i].tap[k]] = 0;
1230
1231                        sg_set_buf(&sg[k], q, template[i].tap[k]);
1232                        if (diff_dst) {
1233                                q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
1234                                    offset_in_page(IDX[k]);
1235
1236                                sg_set_buf(&sgout[k], q, template[i].tap[k]);
1237
1238                                memset(q, 0, template[i].tap[k]);
1239                                if (offset_in_page(q) +
1240                                    template[i].tap[k] < PAGE_SIZE)
1241                                        q[template[i].tap[k]] = 0;
1242                        }
1243
1244                        temp += template[i].tap[k];
1245                }
1246
1247                skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1248                                           template[i].ilen, iv);
1249
1250                ret = enc ? crypto_skcipher_encrypt(req) :
1251                            crypto_skcipher_decrypt(req);
1252
1253                switch (ret) {
1254                case 0:
1255                        break;
1256                case -EINPROGRESS:
1257                case -EBUSY:
1258                        wait_for_completion(&result.completion);
1259                        reinit_completion(&result.completion);
1260                        ret = result.err;
1261                        if (!ret)
1262                                break;
1263                        /* fall through */
1264                default:
1265                        pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n",
1266                               d, e, j, algo, -ret);
1267                        goto out;
1268                }
1269
1270                temp = 0;
1271                ret = -EINVAL;
1272                for (k = 0; k < template[i].np; k++) {
1273                        if (diff_dst)
1274                                q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
1275                                    offset_in_page(IDX[k]);
1276                        else
1277                                q = xbuf[IDX[k] >> PAGE_SHIFT] +
1278                                    offset_in_page(IDX[k]);
1279
1280                        if (memcmp(q, template[i].result + temp,
1281                                   template[i].tap[k])) {
1282                                pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n",
1283                                       d, j, e, k, algo);
1284                                hexdump(q, template[i].tap[k]);
1285                                goto out;
1286                        }
1287
1288                        q += template[i].tap[k];
1289                        for (n = 0; offset_in_page(q + n) && q[n]; n++)
1290                                ;
1291                        if (n) {
1292                                pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
1293                                       d, j, e, k, algo, n);
1294                                hexdump(q, n);
1295                                goto out;
1296                        }
1297                        temp += template[i].tap[k];
1298                }
1299        }
1300
1301        ret = 0;
1302
1303out:
1304        skcipher_request_free(req);
1305        if (diff_dst)
1306                testmgr_free_buf(xoutbuf);
1307out_nooutbuf:
1308        testmgr_free_buf(xbuf);
1309out_nobuf:
1310        return ret;
1311}
1312
1313static int test_skcipher(struct crypto_skcipher *tfm, int enc,
1314                         struct cipher_testvec *template, unsigned int tcount)
1315{
1316        unsigned int alignmask;
1317        int ret;
1318
1319        /* test 'dst == src' case */
1320        ret = __test_skcipher(tfm, enc, template, tcount, false, 0);
1321        if (ret)
1322                return ret;
1323
1324        /* test 'dst != src' case */
1325        ret = __test_skcipher(tfm, enc, template, tcount, true, 0);
1326        if (ret)
1327                return ret;
1328
1329        /* test unaligned buffers, check with one byte offset */
1330        ret = __test_skcipher(tfm, enc, template, tcount, true, 1);
1331        if (ret)
1332                return ret;
1333
1334        alignmask = crypto_tfm_alg_alignmask(&tfm->base);
1335        if (alignmask) {
1336                /* Check if alignment mask for tfm is correctly set. */
1337                ret = __test_skcipher(tfm, enc, template, tcount, true,
1338                                      alignmask + 1);
1339                if (ret)
1340                        return ret;
1341        }
1342
1343        return 0;
1344}
1345
1346static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate,
1347                     struct comp_testvec *dtemplate, int ctcount, int dtcount)
1348{
1349        const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
1350        unsigned int i;
1351        char result[COMP_BUF_SIZE];
1352        int ret;
1353
1354        for (i = 0; i < ctcount; i++) {
1355                int ilen;
1356                unsigned int dlen = COMP_BUF_SIZE;
1357
1358                memset(result, 0, sizeof (result));
1359
1360                ilen = ctemplate[i].inlen;
1361                ret = crypto_comp_compress(tfm, ctemplate[i].input,
1362                                           ilen, result, &dlen);
1363                if (ret) {
1364                        printk(KERN_ERR "alg: comp: compression failed "
1365                               "on test %d for %s: ret=%d\n", i + 1, algo,
1366                               -ret);
1367                        goto out;
1368                }
1369
1370                if (dlen != ctemplate[i].outlen) {
1371                        printk(KERN_ERR "alg: comp: Compression test %d "
1372                               "failed for %s: output len = %d\n", i + 1, algo,
1373                               dlen);
1374                        ret = -EINVAL;
1375                        goto out;
1376                }
1377
1378                if (memcmp(result, ctemplate[i].output, dlen)) {
1379                        printk(KERN_ERR "alg: comp: Compression test %d "
1380                               "failed for %s\n", i + 1, algo);
1381                        hexdump(result, dlen);
1382                        ret = -EINVAL;
1383                        goto out;
1384                }
1385        }
1386
1387        for (i = 0; i < dtcount; i++) {
1388                int ilen;
1389                unsigned int dlen = COMP_BUF_SIZE;
1390
1391                memset(result, 0, sizeof (result));
1392
1393                ilen = dtemplate[i].inlen;
1394                ret = crypto_comp_decompress(tfm, dtemplate[i].input,
1395                                             ilen, result, &dlen);
1396                if (ret) {
1397                        printk(KERN_ERR "alg: comp: decompression failed "
1398                               "on test %d for %s: ret=%d\n", i + 1, algo,
1399                               -ret);
1400                        goto out;
1401                }
1402
1403                if (dlen != dtemplate[i].outlen) {
1404                        printk(KERN_ERR "alg: comp: Decompression test %d "
1405                               "failed for %s: output len = %d\n", i + 1, algo,
1406                               dlen);
1407                        ret = -EINVAL;
1408                        goto out;
1409                }
1410
1411                if (memcmp(result, dtemplate[i].output, dlen)) {
1412                        printk(KERN_ERR "alg: comp: Decompression test %d "
1413                               "failed for %s\n", i + 1, algo);
1414                        hexdump(result, dlen);
1415                        ret = -EINVAL;
1416                        goto out;
1417                }
1418        }
1419
1420        ret = 0;
1421
1422out:
1423        return ret;
1424}
1425
1426static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template,
1427                      unsigned int tcount)
1428{
1429        const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
1430        int err = 0, i, j, seedsize;
1431        u8 *seed;
1432        char result[32];
1433
1434        seedsize = crypto_rng_seedsize(tfm);
1435
1436        seed = kmalloc(seedsize, GFP_KERNEL);
1437        if (!seed) {
1438                printk(KERN_ERR "alg: cprng: Failed to allocate seed space "
1439                       "for %s\n", algo);
1440                return -ENOMEM;
1441        }
1442
1443        for (i = 0; i < tcount; i++) {
1444                memset(result, 0, 32);
1445
1446                memcpy(seed, template[i].v, template[i].vlen);
1447                memcpy(seed + template[i].vlen, template[i].key,
1448                       template[i].klen);
1449                memcpy(seed + template[i].vlen + template[i].klen,
1450                       template[i].dt, template[i].dtlen);
1451
1452                err = crypto_rng_reset(tfm, seed, seedsize);
1453                if (err) {
1454                        printk(KERN_ERR "alg: cprng: Failed to reset rng "
1455                               "for %s\n", algo);
1456                        goto out;
1457                }
1458
1459                for (j = 0; j < template[i].loops; j++) {
1460                        err = crypto_rng_get_bytes(tfm, result,
1461                                                   template[i].rlen);
1462                        if (err < 0) {
1463                                printk(KERN_ERR "alg: cprng: Failed to obtain "
1464                                       "the correct amount of random data for "
1465                                       "%s (requested %d)\n", algo,
1466                                       template[i].rlen);
1467                                goto out;
1468                        }
1469                }
1470
1471                err = memcmp(result, template[i].result,
1472                             template[i].rlen);
1473                if (err) {
1474                        printk(KERN_ERR "alg: cprng: Test %d failed for %s\n",
1475                               i, algo);
1476                        hexdump(result, template[i].rlen);
1477                        err = -EINVAL;
1478                        goto out;
1479                }
1480        }
1481
1482out:
1483        kfree(seed);
1484        return err;
1485}
1486
1487static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
1488                         u32 type, u32 mask)
1489{
1490        struct crypto_aead *tfm;
1491        int err = 0;
1492
1493        tfm = crypto_alloc_aead(driver, type | CRYPTO_ALG_INTERNAL, mask);
1494        if (IS_ERR(tfm)) {
1495                printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
1496                       "%ld\n", driver, PTR_ERR(tfm));
1497                return PTR_ERR(tfm);
1498        }
1499
1500        if (desc->suite.aead.enc.vecs) {
1501                err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
1502                                desc->suite.aead.enc.count);
1503                if (err)
1504                        goto out;
1505        }
1506
1507        if (!err && desc->suite.aead.dec.vecs)
1508                err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
1509                                desc->suite.aead.dec.count);
1510
1511out:
1512        crypto_free_aead(tfm);
1513        return err;
1514}
1515
1516static int alg_test_cipher(const struct alg_test_desc *desc,
1517                           const char *driver, u32 type, u32 mask)
1518{
1519        struct crypto_cipher *tfm;
1520        int err = 0;
1521
1522        tfm = crypto_alloc_cipher(driver, type | CRYPTO_ALG_INTERNAL, mask);
1523        if (IS_ERR(tfm)) {
1524                printk(KERN_ERR "alg: cipher: Failed to load transform for "
1525                       "%s: %ld\n", driver, PTR_ERR(tfm));
1526                return PTR_ERR(tfm);
1527        }
1528
1529        if (desc->suite.cipher.enc.vecs) {
1530                err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1531                                  desc->suite.cipher.enc.count);
1532                if (err)
1533                        goto out;
1534        }
1535
1536        if (desc->suite.cipher.dec.vecs)
1537                err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1538                                  desc->suite.cipher.dec.count);
1539
1540out:
1541        crypto_free_cipher(tfm);
1542        return err;
1543}
1544
1545static int alg_test_skcipher(const struct alg_test_desc *desc,
1546                             const char *driver, u32 type, u32 mask)
1547{
1548        struct crypto_skcipher *tfm;
1549        int err = 0;
1550
1551        tfm = crypto_alloc_skcipher(driver, type | CRYPTO_ALG_INTERNAL, mask);
1552        if (IS_ERR(tfm)) {
1553                printk(KERN_ERR "alg: skcipher: Failed to load transform for "
1554                       "%s: %ld\n", driver, PTR_ERR(tfm));
1555                return PTR_ERR(tfm);
1556        }
1557
1558        if (desc->suite.cipher.enc.vecs) {
1559                err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1560                                    desc->suite.cipher.enc.count);
1561                if (err)
1562                        goto out;
1563        }
1564
1565        if (desc->suite.cipher.dec.vecs)
1566                err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1567                                    desc->suite.cipher.dec.count);
1568
1569out:
1570        crypto_free_skcipher(tfm);
1571        return err;
1572}
1573
1574static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
1575                         u32 type, u32 mask)
1576{
1577        struct crypto_comp *tfm;
1578        int err;
1579
1580        tfm = crypto_alloc_comp(driver, type, mask);
1581        if (IS_ERR(tfm)) {
1582                printk(KERN_ERR "alg: comp: Failed to load transform for %s: "
1583                       "%ld\n", driver, PTR_ERR(tfm));
1584                return PTR_ERR(tfm);
1585        }
1586
1587        err = test_comp(tfm, desc->suite.comp.comp.vecs,
1588                        desc->suite.comp.decomp.vecs,
1589                        desc->suite.comp.comp.count,
1590                        desc->suite.comp.decomp.count);
1591
1592        crypto_free_comp(tfm);
1593        return err;
1594}
1595
1596static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
1597                         u32 type, u32 mask)
1598{
1599        struct crypto_ahash *tfm;
1600        int err;
1601
1602        tfm = crypto_alloc_ahash(driver, type | CRYPTO_ALG_INTERNAL, mask);
1603        if (IS_ERR(tfm)) {
1604                printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
1605                       "%ld\n", driver, PTR_ERR(tfm));
1606                return PTR_ERR(tfm);
1607        }
1608
1609        err = test_hash(tfm, desc->suite.hash.vecs,
1610                        desc->suite.hash.count, true);
1611        if (!err)
1612                err = test_hash(tfm, desc->suite.hash.vecs,
1613                                desc->suite.hash.count, false);
1614
1615        crypto_free_ahash(tfm);
1616        return err;
1617}
1618
1619static int alg_test_crc32c(const struct alg_test_desc *desc,
1620                           const char *driver, u32 type, u32 mask)
1621{
1622        struct crypto_shash *tfm;
1623        u32 val;
1624        int err;
1625
1626        err = alg_test_hash(desc, driver, type, mask);
1627        if (err)
1628                goto out;
1629
1630        tfm = crypto_alloc_shash(driver, type | CRYPTO_ALG_INTERNAL, mask);
1631        if (IS_ERR(tfm)) {
1632                printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
1633                       "%ld\n", driver, PTR_ERR(tfm));
1634                err = PTR_ERR(tfm);
1635                goto out;
1636        }
1637
1638        do {
1639                SHASH_DESC_ON_STACK(shash, tfm);
1640                u32 *ctx = (u32 *)shash_desc_ctx(shash);
1641
1642                shash->tfm = tfm;
1643                shash->flags = 0;
1644
1645                *ctx = le32_to_cpu(420553207);
1646                err = crypto_shash_final(shash, (u8 *)&val);
1647                if (err) {
1648                        printk(KERN_ERR "alg: crc32c: Operation failed for "
1649                               "%s: %d\n", driver, err);
1650                        break;
1651                }
1652
1653                if (val != ~420553207) {
1654                        printk(KERN_ERR "alg: crc32c: Test failed for %s: "
1655                               "%d\n", driver, val);
1656                        err = -EINVAL;
1657                }
1658        } while (0);
1659
1660        crypto_free_shash(tfm);
1661
1662out:
1663        return err;
1664}
1665
1666static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
1667                          u32 type, u32 mask)
1668{
1669        struct crypto_rng *rng;
1670        int err;
1671
1672        rng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask);
1673        if (IS_ERR(rng)) {
1674                printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
1675                       "%ld\n", driver, PTR_ERR(rng));
1676                return PTR_ERR(rng);
1677        }
1678
1679        err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count);
1680
1681        crypto_free_rng(rng);
1682
1683        return err;
1684}
1685
1686
1687static int drbg_cavs_test(struct drbg_testvec *test, int pr,
1688                          const char *driver, u32 type, u32 mask)
1689{
1690        int ret = -EAGAIN;
1691        struct crypto_rng *drng;
1692        struct drbg_test_data test_data;
1693        struct drbg_string addtl, pers, testentropy;
1694        unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL);
1695
1696        if (!buf)
1697                return -ENOMEM;
1698
1699        drng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask);
1700        if (IS_ERR(drng)) {
1701                printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for "
1702                       "%s\n", driver);
1703                kzfree(buf);
1704                return -ENOMEM;
1705        }
1706
1707        test_data.testentropy = &testentropy;
1708        drbg_string_fill(&testentropy, test->entropy, test->entropylen);
1709        drbg_string_fill(&pers, test->pers, test->perslen);
1710        ret = crypto_drbg_reset_test(drng, &pers, &test_data);
1711        if (ret) {
1712                printk(KERN_ERR "alg: drbg: Failed to reset rng\n");
1713                goto outbuf;
1714        }
1715
1716        drbg_string_fill(&addtl, test->addtla, test->addtllen);
1717        if (pr) {
1718                drbg_string_fill(&testentropy, test->entpra, test->entprlen);
1719                ret = crypto_drbg_get_bytes_addtl_test(drng,
1720                        buf, test->expectedlen, &addtl, &test_data);
1721        } else {
1722                ret = crypto_drbg_get_bytes_addtl(drng,
1723                        buf, test->expectedlen, &addtl);
1724        }
1725        if (ret < 0) {
1726                printk(KERN_ERR "alg: drbg: could not obtain random data for "
1727                       "driver %s\n", driver);
1728                goto outbuf;
1729        }
1730
1731        drbg_string_fill(&addtl, test->addtlb, test->addtllen);
1732        if (pr) {
1733                drbg_string_fill(&testentropy, test->entprb, test->entprlen);
1734                ret = crypto_drbg_get_bytes_addtl_test(drng,
1735                        buf, test->expectedlen, &addtl, &test_data);
1736        } else {
1737                ret = crypto_drbg_get_bytes_addtl(drng,
1738                        buf, test->expectedlen, &addtl);
1739        }
1740        if (ret < 0) {
1741                printk(KERN_ERR "alg: drbg: could not obtain random data for "
1742                       "driver %s\n", driver);
1743                goto outbuf;
1744        }
1745
1746        ret = memcmp(test->expected, buf, test->expectedlen);
1747
1748outbuf:
1749        crypto_free_rng(drng);
1750        kzfree(buf);
1751        return ret;
1752}
1753
1754
1755static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver,
1756                         u32 type, u32 mask)
1757{
1758        int err = 0;
1759        int pr = 0;
1760        int i = 0;
1761        struct drbg_testvec *template = desc->suite.drbg.vecs;
1762        unsigned int tcount = desc->suite.drbg.count;
1763
1764        if (0 == memcmp(driver, "drbg_pr_", 8))
1765                pr = 1;
1766
1767        for (i = 0; i < tcount; i++) {
1768                err = drbg_cavs_test(&template[i], pr, driver, type, mask);
1769                if (err) {
1770                        printk(KERN_ERR "alg: drbg: Test %d failed for %s\n",
1771                               i, driver);
1772                        err = -EINVAL;
1773                        break;
1774                }
1775        }
1776        return err;
1777
1778}
1779
1780static int do_test_rsa(struct crypto_akcipher *tfm,
1781                       struct akcipher_testvec *vecs)
1782{
1783        char *xbuf[XBUFSIZE];
1784        struct akcipher_request *req;
1785        void *outbuf_enc = NULL;
1786        void *outbuf_dec = NULL;
1787        struct tcrypt_result result;
1788        unsigned int out_len_max, out_len = 0;
1789        int err = -ENOMEM;
1790        struct scatterlist src, dst, src_tab[2];
1791
1792        if (testmgr_alloc_buf(xbuf))
1793                return err;
1794
1795        req = akcipher_request_alloc(tfm, GFP_KERNEL);
1796        if (!req)
1797                goto free_xbuf;
1798
1799        init_completion(&result.completion);
1800
1801        if (vecs->public_key_vec)
1802                err = crypto_akcipher_set_pub_key(tfm, vecs->key,
1803                                                  vecs->key_len);
1804        else
1805                err = crypto_akcipher_set_priv_key(tfm, vecs->key,
1806                                                   vecs->key_len);
1807        if (err)
1808                goto free_req;
1809
1810        out_len_max = crypto_akcipher_maxsize(tfm);
1811        outbuf_enc = kzalloc(out_len_max, GFP_KERNEL);
1812        if (!outbuf_enc)
1813                goto free_req;
1814
1815        if (WARN_ON(vecs->m_size > PAGE_SIZE))
1816                goto free_all;
1817
1818        memcpy(xbuf[0], vecs->m, vecs->m_size);
1819
1820        sg_init_table(src_tab, 2);
1821        sg_set_buf(&src_tab[0], xbuf[0], 8);
1822        sg_set_buf(&src_tab[1], xbuf[0] + 8, vecs->m_size - 8);
1823        sg_init_one(&dst, outbuf_enc, out_len_max);
1824        akcipher_request_set_crypt(req, src_tab, &dst, vecs->m_size,
1825                                   out_len_max);
1826        akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1827                                      tcrypt_complete, &result);
1828
1829        /* Run RSA encrypt - c = m^e mod n;*/
1830        err = wait_async_op(&result, crypto_akcipher_encrypt(req));
1831        if (err) {
1832                pr_err("alg: rsa: encrypt test failed. err %d\n", err);
1833                goto free_all;
1834        }
1835        if (req->dst_len != vecs->c_size) {
1836                pr_err("alg: rsa: encrypt test failed. Invalid output len\n");
1837                err = -EINVAL;
1838                goto free_all;
1839        }
1840        /* verify that encrypted message is equal to expected */
1841        if (memcmp(vecs->c, outbuf_enc, vecs->c_size)) {
1842                pr_err("alg: rsa: encrypt test failed. Invalid output\n");
1843                err = -EINVAL;
1844                goto free_all;
1845        }
1846        /* Don't invoke decrypt for vectors with public key */
1847        if (vecs->public_key_vec) {
1848                err = 0;
1849                goto free_all;
1850        }
1851        outbuf_dec = kzalloc(out_len_max, GFP_KERNEL);
1852        if (!outbuf_dec) {
1853                err = -ENOMEM;
1854                goto free_all;
1855        }
1856
1857        if (WARN_ON(vecs->c_size > PAGE_SIZE))
1858                goto free_all;
1859
1860        memcpy(xbuf[0], vecs->c, vecs->c_size);
1861
1862        sg_init_one(&src, xbuf[0], vecs->c_size);
1863        sg_init_one(&dst, outbuf_dec, out_len_max);
1864        init_completion(&result.completion);
1865        akcipher_request_set_crypt(req, &src, &dst, vecs->c_size, out_len_max);
1866
1867        /* Run RSA decrypt - m = c^d mod n;*/
1868        err = wait_async_op(&result, crypto_akcipher_decrypt(req));
1869        if (err) {
1870                pr_err("alg: rsa: decrypt test failed. err %d\n", err);
1871                goto free_all;
1872        }
1873        out_len = req->dst_len;
1874        if (out_len != vecs->m_size) {
1875                pr_err("alg: rsa: decrypt test failed. Invalid output len\n");
1876                err = -EINVAL;
1877                goto free_all;
1878        }
1879        /* verify that decrypted message is equal to the original msg */
1880        if (memcmp(vecs->m, outbuf_dec, vecs->m_size)) {
1881                pr_err("alg: rsa: decrypt test failed. Invalid output\n");
1882                err = -EINVAL;
1883        }
1884free_all:
1885        kfree(outbuf_dec);
1886        kfree(outbuf_enc);
1887free_req:
1888        akcipher_request_free(req);
1889free_xbuf:
1890        testmgr_free_buf(xbuf);
1891        return err;
1892}
1893
1894static int test_rsa(struct crypto_akcipher *tfm, struct akcipher_testvec *vecs,
1895                    unsigned int tcount)
1896{
1897        int ret, i;
1898
1899        for (i = 0; i < tcount; i++) {
1900                ret = do_test_rsa(tfm, vecs++);
1901                if (ret) {
1902                        pr_err("alg: rsa: test failed on vector %d, err=%d\n",
1903                               i + 1, ret);
1904                        return ret;
1905                }
1906        }
1907        return 0;
1908}
1909
1910static int test_akcipher(struct crypto_akcipher *tfm, const char *alg,
1911                         struct akcipher_testvec *vecs, unsigned int tcount)
1912{
1913        if (strncmp(alg, "rsa", 3) == 0)
1914                return test_rsa(tfm, vecs, tcount);
1915
1916        return 0;
1917}
1918
1919static int alg_test_akcipher(const struct alg_test_desc *desc,
1920                             const char *driver, u32 type, u32 mask)
1921{
1922        struct crypto_akcipher *tfm;
1923        int err = 0;
1924
1925        tfm = crypto_alloc_akcipher(driver, type | CRYPTO_ALG_INTERNAL, mask);
1926        if (IS_ERR(tfm)) {
1927                pr_err("alg: akcipher: Failed to load tfm for %s: %ld\n",
1928                       driver, PTR_ERR(tfm));
1929                return PTR_ERR(tfm);
1930        }
1931        if (desc->suite.akcipher.vecs)
1932                err = test_akcipher(tfm, desc->alg, desc->suite.akcipher.vecs,
1933                                    desc->suite.akcipher.count);
1934
1935        crypto_free_akcipher(tfm);
1936        return err;
1937}
1938
1939static int alg_test_null(const struct alg_test_desc *desc,
1940                             const char *driver, u32 type, u32 mask)
1941{
1942        return 0;
1943}
1944
1945/* Please keep this list sorted by algorithm name. */
1946static const struct alg_test_desc alg_test_descs[] = {
1947        {
1948                .alg = "__cbc-cast5-avx",
1949                .test = alg_test_null,
1950        }, {
1951                .alg = "__cbc-cast6-avx",
1952                .test = alg_test_null,
1953        }, {
1954                .alg = "__cbc-serpent-avx",
1955                .test = alg_test_null,
1956        }, {
1957                .alg = "__cbc-serpent-avx2",
1958                .test = alg_test_null,
1959        }, {
1960                .alg = "__cbc-serpent-sse2",
1961                .test = alg_test_null,
1962        }, {
1963                .alg = "__cbc-twofish-avx",
1964                .test = alg_test_null,
1965        }, {
1966                .alg = "__driver-cbc-aes-aesni",
1967                .test = alg_test_null,
1968                .fips_allowed = 1,
1969        }, {
1970                .alg = "__driver-cbc-camellia-aesni",
1971                .test = alg_test_null,
1972        }, {
1973                .alg = "__driver-cbc-camellia-aesni-avx2",
1974                .test = alg_test_null,
1975        }, {
1976                .alg = "__driver-cbc-cast5-avx",
1977                .test = alg_test_null,
1978        }, {
1979                .alg = "__driver-cbc-cast6-avx",
1980                .test = alg_test_null,
1981        }, {
1982                .alg = "__driver-cbc-serpent-avx",
1983                .test = alg_test_null,
1984        }, {
1985                .alg = "__driver-cbc-serpent-avx2",
1986                .test = alg_test_null,
1987        }, {
1988                .alg = "__driver-cbc-serpent-sse2",
1989                .test = alg_test_null,
1990        }, {
1991                .alg = "__driver-cbc-twofish-avx",
1992                .test = alg_test_null,
1993        }, {
1994                .alg = "__driver-ecb-aes-aesni",
1995                .test = alg_test_null,
1996                .fips_allowed = 1,
1997        }, {
1998                .alg = "__driver-ecb-camellia-aesni",
1999                .test = alg_test_null,
2000        }, {
2001                .alg = "__driver-ecb-camellia-aesni-avx2",
2002                .test = alg_test_null,
2003        }, {
2004                .alg = "__driver-ecb-cast5-avx",
2005                .test = alg_test_null,
2006        }, {
2007                .alg = "__driver-ecb-cast6-avx",
2008                .test = alg_test_null,
2009        }, {
2010                .alg = "__driver-ecb-serpent-avx",
2011                .test = alg_test_null,
2012        }, {
2013                .alg = "__driver-ecb-serpent-avx2",
2014                .test = alg_test_null,
2015        }, {
2016                .alg = "__driver-ecb-serpent-sse2",
2017                .test = alg_test_null,
2018        }, {
2019                .alg = "__driver-ecb-twofish-avx",
2020                .test = alg_test_null,
2021        }, {
2022                .alg = "__driver-gcm-aes-aesni",
2023                .test = alg_test_null,
2024                .fips_allowed = 1,
2025        }, {
2026                .alg = "__ghash-pclmulqdqni",
2027                .test = alg_test_null,
2028                .fips_allowed = 1,
2029        }, {
2030                .alg = "ansi_cprng",
2031                .test = alg_test_cprng,
2032                .suite = {
2033                        .cprng = {
2034                                .vecs = ansi_cprng_aes_tv_template,
2035                                .count = ANSI_CPRNG_AES_TEST_VECTORS
2036                        }
2037                }
2038        }, {
2039                .alg = "authenc(hmac(md5),ecb(cipher_null))",
2040                .test = alg_test_aead,
2041                .suite = {
2042                        .aead = {
2043                                .enc = {
2044                                        .vecs = hmac_md5_ecb_cipher_null_enc_tv_template,
2045                                        .count = HMAC_MD5_ECB_CIPHER_NULL_ENC_TEST_VECTORS
2046                                },
2047                                .dec = {
2048                                        .vecs = hmac_md5_ecb_cipher_null_dec_tv_template,
2049                                        .count = HMAC_MD5_ECB_CIPHER_NULL_DEC_TEST_VECTORS
2050                                }
2051                        }
2052                }
2053        }, {
2054                .alg = "authenc(hmac(sha1),cbc(aes))",
2055                .test = alg_test_aead,
2056                .suite = {
2057                        .aead = {
2058                                .enc = {
2059                                        .vecs =
2060                                        hmac_sha1_aes_cbc_enc_tv_temp,
2061                                        .count =
2062                                        HMAC_SHA1_AES_CBC_ENC_TEST_VEC
2063                                }
2064                        }
2065                }
2066        }, {
2067                .alg = "authenc(hmac(sha1),cbc(des))",
2068                .test = alg_test_aead,
2069                .suite = {
2070                        .aead = {
2071                                .enc = {
2072                                        .vecs =
2073                                        hmac_sha1_des_cbc_enc_tv_temp,
2074                                        .count =
2075                                        HMAC_SHA1_DES_CBC_ENC_TEST_VEC
2076                                }
2077                        }
2078                }
2079        }, {
2080                .alg = "authenc(hmac(sha1),cbc(des3_ede))",
2081                .test = alg_test_aead,
2082                .fips_allowed = 1,
2083                .suite = {
2084                        .aead = {
2085                                .enc = {
2086                                        .vecs =
2087                                        hmac_sha1_des3_ede_cbc_enc_tv_temp,
2088                                        .count =
2089                                        HMAC_SHA1_DES3_EDE_CBC_ENC_TEST_VEC
2090                                }
2091                        }
2092                }
2093        }, {
2094                .alg = "authenc(hmac(sha1),ctr(aes))",
2095                .test = alg_test_null,
2096                .fips_allowed = 1,
2097        }, {
2098                .alg = "authenc(hmac(sha1),ecb(cipher_null))",
2099                .test = alg_test_aead,
2100                .suite = {
2101                        .aead = {
2102                                .enc = {
2103                                        .vecs =
2104                                        hmac_sha1_ecb_cipher_null_enc_tv_temp,
2105                                        .count =
2106                                        HMAC_SHA1_ECB_CIPHER_NULL_ENC_TEST_VEC
2107                                },
2108                                .dec = {
2109                                        .vecs =
2110                                        hmac_sha1_ecb_cipher_null_dec_tv_temp,
2111                                        .count =
2112                                        HMAC_SHA1_ECB_CIPHER_NULL_DEC_TEST_VEC
2113                                }
2114                        }
2115                }
2116        }, {
2117                .alg = "authenc(hmac(sha1),rfc3686(ctr(aes)))",
2118                .test = alg_test_null,
2119                .fips_allowed = 1,
2120        }, {
2121                .alg = "authenc(hmac(sha224),cbc(des))",
2122                .test = alg_test_aead,
2123                .suite = {
2124                        .aead = {
2125                                .enc = {
2126                                        .vecs =
2127                                        hmac_sha224_des_cbc_enc_tv_temp,
2128                                        .count =
2129                                        HMAC_SHA224_DES_CBC_ENC_TEST_VEC
2130                                }
2131                        }
2132                }
2133        }, {
2134                .alg = "authenc(hmac(sha224),cbc(des3_ede))",
2135                .test = alg_test_aead,
2136                .fips_allowed = 1,
2137                .suite = {
2138                        .aead = {
2139                                .enc = {
2140                                        .vecs =
2141                                        hmac_sha224_des3_ede_cbc_enc_tv_temp,
2142                                        .count =
2143                                        HMAC_SHA224_DES3_EDE_CBC_ENC_TEST_VEC
2144                                }
2145                        }
2146                }
2147        }, {
2148                .alg = "authenc(hmac(sha256),cbc(aes))",
2149                .test = alg_test_aead,
2150                .fips_allowed = 1,
2151                .suite = {
2152                        .aead = {
2153                                .enc = {
2154                                        .vecs =
2155                                        hmac_sha256_aes_cbc_enc_tv_temp,
2156                                        .count =
2157                                        HMAC_SHA256_AES_CBC_ENC_TEST_VEC
2158                                }
2159                        }
2160                }
2161        }, {
2162                .alg = "authenc(hmac(sha256),cbc(des))",
2163                .test = alg_test_aead,
2164                .suite = {
2165                        .aead = {
2166                                .enc = {
2167                                        .vecs =
2168                                        hmac_sha256_des_cbc_enc_tv_temp,
2169                                        .count =
2170                                        HMAC_SHA256_DES_CBC_ENC_TEST_VEC
2171                                }
2172                        }
2173                }
2174        }, {
2175                .alg = "authenc(hmac(sha256),cbc(des3_ede))",
2176                .test = alg_test_aead,
2177                .fips_allowed = 1,
2178                .suite = {
2179                        .aead = {
2180                                .enc = {
2181                                        .vecs =
2182                                        hmac_sha256_des3_ede_cbc_enc_tv_temp,
2183                                        .count =
2184                                        HMAC_SHA256_DES3_EDE_CBC_ENC_TEST_VEC
2185                                }
2186                        }
2187                }
2188        }, {
2189                .alg = "authenc(hmac(sha256),ctr(aes))",
2190                .test = alg_test_null,
2191                .fips_allowed = 1,
2192        }, {
2193                .alg = "authenc(hmac(sha256),rfc3686(ctr(aes)))",
2194                .test = alg_test_null,
2195                .fips_allowed = 1,
2196        }, {
2197                .alg = "authenc(hmac(sha384),cbc(des))",
2198                .test = alg_test_aead,
2199                .suite = {
2200                        .aead = {
2201                                .enc = {
2202                                        .vecs =
2203                                        hmac_sha384_des_cbc_enc_tv_temp,
2204                                        .count =
2205                                        HMAC_SHA384_DES_CBC_ENC_TEST_VEC
2206                                }
2207                        }
2208                }
2209        }, {
2210                .alg = "authenc(hmac(sha384),cbc(des3_ede))",
2211                .test = alg_test_aead,
2212                .fips_allowed = 1,
2213                .suite = {
2214                        .aead = {
2215                                .enc = {
2216                                        .vecs =
2217                                        hmac_sha384_des3_ede_cbc_enc_tv_temp,
2218                                        .count =
2219                                        HMAC_SHA384_DES3_EDE_CBC_ENC_TEST_VEC
2220                                }
2221                        }
2222                }
2223        }, {
2224                .alg = "authenc(hmac(sha384),ctr(aes))",
2225                .test = alg_test_null,
2226                .fips_allowed = 1,
2227        }, {
2228                .alg = "authenc(hmac(sha384),rfc3686(ctr(aes)))",
2229                .test = alg_test_null,
2230                .fips_allowed = 1,
2231        }, {
2232                .alg = "authenc(hmac(sha512),cbc(aes))",
2233                .fips_allowed = 1,
2234                .test = alg_test_aead,
2235                .suite = {
2236                        .aead = {
2237                                .enc = {
2238                                        .vecs =
2239                                        hmac_sha512_aes_cbc_enc_tv_temp,
2240                                        .count =
2241                                        HMAC_SHA512_AES_CBC_ENC_TEST_VEC
2242                                }
2243                        }
2244                }
2245        }, {
2246                .alg = "authenc(hmac(sha512),cbc(des))",
2247                .test = alg_test_aead,
2248                .suite = {
2249                        .aead = {
2250                                .enc = {
2251                                        .vecs =
2252                                        hmac_sha512_des_cbc_enc_tv_temp,
2253                                        .count =
2254                                        HMAC_SHA512_DES_CBC_ENC_TEST_VEC
2255                                }
2256                        }
2257                }
2258        }, {
2259                .alg = "authenc(hmac(sha512),cbc(des3_ede))",
2260                .test = alg_test_aead,
2261                .fips_allowed = 1,
2262                .suite = {
2263                        .aead = {
2264                                .enc = {
2265                                        .vecs =
2266                                        hmac_sha512_des3_ede_cbc_enc_tv_temp,
2267                                        .count =
2268                                        HMAC_SHA512_DES3_EDE_CBC_ENC_TEST_VEC
2269                                }
2270                        }
2271                }
2272        }, {
2273                .alg = "authenc(hmac(sha512),ctr(aes))",
2274                .test = alg_test_null,
2275                .fips_allowed = 1,
2276        }, {
2277                .alg = "authenc(hmac(sha512),rfc3686(ctr(aes)))",
2278                .test = alg_test_null,
2279                .fips_allowed = 1,
2280        }, {
2281                .alg = "cbc(aes)",
2282                .test = alg_test_skcipher,
2283                .fips_allowed = 1,
2284                .suite = {
2285                        .cipher = {
2286                                .enc = {
2287                                        .vecs = aes_cbc_enc_tv_template,
2288                                        .count = AES_CBC_ENC_TEST_VECTORS
2289                                },
2290                                .dec = {
2291                                        .vecs = aes_cbc_dec_tv_template,
2292                                        .count = AES_CBC_DEC_TEST_VECTORS
2293                                }
2294                        }
2295                }
2296        }, {
2297                .alg = "cbc(anubis)",
2298                .test = alg_test_skcipher,
2299                .suite = {
2300                        .cipher = {
2301                                .enc = {
2302                                        .vecs = anubis_cbc_enc_tv_template,
2303                                        .count = ANUBIS_CBC_ENC_TEST_VECTORS
2304                                },
2305                                .dec = {
2306                                        .vecs = anubis_cbc_dec_tv_template,
2307                                        .count = ANUBIS_CBC_DEC_TEST_VECTORS
2308                                }
2309                        }
2310                }
2311        }, {
2312                .alg = "cbc(blowfish)",
2313                .test = alg_test_skcipher,
2314                .suite = {
2315                        .cipher = {
2316                                .enc = {
2317                                        .vecs = bf_cbc_enc_tv_template,
2318                                        .count = BF_CBC_ENC_TEST_VECTORS
2319                                },
2320                                .dec = {
2321                                        .vecs = bf_cbc_dec_tv_template,
2322                                        .count = BF_CBC_DEC_TEST_VECTORS
2323                                }
2324                        }
2325                }
2326        }, {
2327                .alg = "cbc(camellia)",
2328                .test = alg_test_skcipher,
2329                .suite = {
2330                        .cipher = {
2331                                .enc = {
2332                                        .vecs = camellia_cbc_enc_tv_template,
2333                                        .count = CAMELLIA_CBC_ENC_TEST_VECTORS
2334                                },
2335                                .dec = {
2336                                        .vecs = camellia_cbc_dec_tv_template,
2337                                        .count = CAMELLIA_CBC_DEC_TEST_VECTORS
2338                                }
2339                        }
2340                }
2341        }, {
2342                .alg = "cbc(cast5)",
2343                .test = alg_test_skcipher,
2344                .suite = {
2345                        .cipher = {
2346                                .enc = {
2347                                        .vecs = cast5_cbc_enc_tv_template,
2348                                        .count = CAST5_CBC_ENC_TEST_VECTORS
2349                                },
2350                                .dec = {
2351                                        .vecs = cast5_cbc_dec_tv_template,
2352                                        .count = CAST5_CBC_DEC_TEST_VECTORS
2353                                }
2354                        }
2355                }
2356        }, {
2357                .alg = "cbc(cast6)",
2358                .test = alg_test_skcipher,
2359                .suite = {
2360                        .cipher = {
2361                                .enc = {
2362                                        .vecs = cast6_cbc_enc_tv_template,
2363                                        .count = CAST6_CBC_ENC_TEST_VECTORS
2364                                },
2365                                .dec = {
2366                                        .vecs = cast6_cbc_dec_tv_template,
2367                                        .count = CAST6_CBC_DEC_TEST_VECTORS
2368                                }
2369                        }
2370                }
2371        }, {
2372                .alg = "cbc(des)",
2373                .test = alg_test_skcipher,
2374                .suite = {
2375                        .cipher = {
2376                                .enc = {
2377                                        .vecs = des_cbc_enc_tv_template,
2378                                        .count = DES_CBC_ENC_TEST_VECTORS
2379                                },
2380                                .dec = {
2381                                        .vecs = des_cbc_dec_tv_template,
2382                                        .count = DES_CBC_DEC_TEST_VECTORS
2383                                }
2384                        }
2385                }
2386        }, {
2387                .alg = "cbc(des3_ede)",
2388                .test = alg_test_skcipher,
2389                .fips_allowed = 1,
2390                .suite = {
2391                        .cipher = {
2392                                .enc = {
2393                                        .vecs = des3_ede_cbc_enc_tv_template,
2394                                        .count = DES3_EDE_CBC_ENC_TEST_VECTORS
2395                                },
2396                                .dec = {
2397                                        .vecs = des3_ede_cbc_dec_tv_template,
2398                                        .count = DES3_EDE_CBC_DEC_TEST_VECTORS
2399                                }
2400                        }
2401                }
2402        }, {
2403                .alg = "cbc(serpent)",
2404                .test = alg_test_skcipher,
2405                .suite = {
2406                        .cipher = {
2407                                .enc = {
2408                                        .vecs = serpent_cbc_enc_tv_template,
2409                                        .count = SERPENT_CBC_ENC_TEST_VECTORS
2410                                },
2411                                .dec = {
2412                                        .vecs = serpent_cbc_dec_tv_template,
2413                                        .count = SERPENT_CBC_DEC_TEST_VECTORS
2414                                }
2415                        }
2416                }
2417        }, {
2418                .alg = "cbc(twofish)",
2419                .test = alg_test_skcipher,
2420                .suite = {
2421                        .cipher = {
2422                                .enc = {
2423                                        .vecs = tf_cbc_enc_tv_template,
2424                                        .count = TF_CBC_ENC_TEST_VECTORS
2425                                },
2426                                .dec = {
2427                                        .vecs = tf_cbc_dec_tv_template,
2428                                        .count = TF_CBC_DEC_TEST_VECTORS
2429                                }
2430                        }
2431                }
2432        }, {
2433                .alg = "ccm(aes)",
2434                .test = alg_test_aead,
2435                .fips_allowed = 1,
2436                .suite = {
2437                        .aead = {
2438                                .enc = {
2439                                        .vecs = aes_ccm_enc_tv_template,
2440                                        .count = AES_CCM_ENC_TEST_VECTORS
2441                                },
2442                                .dec = {
2443                                        .vecs = aes_ccm_dec_tv_template,
2444                                        .count = AES_CCM_DEC_TEST_VECTORS
2445                                }
2446                        }
2447                }
2448        }, {
2449                .alg = "chacha20",
2450                .test = alg_test_skcipher,
2451                .suite = {
2452                        .cipher = {
2453                                .enc = {
2454                                        .vecs = chacha20_enc_tv_template,
2455                                        .count = CHACHA20_ENC_TEST_VECTORS
2456                                },
2457                                .dec = {
2458                                        .vecs = chacha20_enc_tv_template,
2459                                        .count = CHACHA20_ENC_TEST_VECTORS
2460                                },
2461                        }
2462                }
2463        }, {
2464                .alg = "cmac(aes)",
2465                .fips_allowed = 1,
2466                .test = alg_test_hash,
2467                .suite = {
2468                        .hash = {
2469                                .vecs = aes_cmac128_tv_template,
2470                                .count = CMAC_AES_TEST_VECTORS
2471                        }
2472                }
2473        }, {
2474                .alg = "cmac(des3_ede)",
2475                .fips_allowed = 1,
2476                .test = alg_test_hash,
2477                .suite = {
2478                        .hash = {
2479                                .vecs = des3_ede_cmac64_tv_template,
2480                                .count = CMAC_DES3_EDE_TEST_VECTORS
2481                        }
2482                }
2483        }, {
2484                .alg = "compress_null",
2485                .test = alg_test_null,
2486        }, {
2487                .alg = "crc32",
2488                .test = alg_test_hash,
2489                .suite = {
2490                        .hash = {
2491                                .vecs = crc32_tv_template,
2492                                .count = CRC32_TEST_VECTORS
2493                        }
2494                }
2495        }, {
2496                .alg = "crc32c",
2497                .test = alg_test_crc32c,
2498                .fips_allowed = 1,
2499                .suite = {
2500                        .hash = {
2501                                .vecs = crc32c_tv_template,
2502                                .count = CRC32C_TEST_VECTORS
2503                        }
2504                }
2505        }, {
2506                .alg = "crct10dif",
2507                .test = alg_test_hash,
2508                .fips_allowed = 1,
2509                .suite = {
2510                        .hash = {
2511                                .vecs = crct10dif_tv_template,
2512                                .count = CRCT10DIF_TEST_VECTORS
2513                        }
2514                }
2515        }, {
2516                .alg = "cryptd(__driver-cbc-aes-aesni)",
2517                .test = alg_test_null,
2518                .fips_allowed = 1,
2519        }, {
2520                .alg = "cryptd(__driver-cbc-camellia-aesni)",
2521                .test = alg_test_null,
2522        }, {
2523                .alg = "cryptd(__driver-cbc-camellia-aesni-avx2)",
2524                .test = alg_test_null,
2525        }, {
2526                .alg = "cryptd(__driver-cbc-serpent-avx2)",
2527                .test = alg_test_null,
2528        }, {
2529                .alg = "cryptd(__driver-ecb-aes-aesni)",
2530                .test = alg_test_null,
2531                .fips_allowed = 1,
2532        }, {
2533                .alg = "cryptd(__driver-ecb-camellia-aesni)",
2534                .test = alg_test_null,
2535        }, {
2536                .alg = "cryptd(__driver-ecb-camellia-aesni-avx2)",
2537                .test = alg_test_null,
2538        }, {
2539                .alg = "cryptd(__driver-ecb-cast5-avx)",
2540                .test = alg_test_null,
2541        }, {
2542                .alg = "cryptd(__driver-ecb-cast6-avx)",
2543                .test = alg_test_null,
2544        }, {
2545                .alg = "cryptd(__driver-ecb-serpent-avx)",
2546                .test = alg_test_null,
2547        }, {
2548                .alg = "cryptd(__driver-ecb-serpent-avx2)",
2549                .test = alg_test_null,
2550        }, {
2551                .alg = "cryptd(__driver-ecb-serpent-sse2)",
2552                .test = alg_test_null,
2553        }, {
2554                .alg = "cryptd(__driver-ecb-twofish-avx)",
2555                .test = alg_test_null,
2556        }, {
2557                .alg = "cryptd(__driver-gcm-aes-aesni)",
2558                .test = alg_test_null,
2559                .fips_allowed = 1,
2560        }, {
2561                .alg = "cryptd(__ghash-pclmulqdqni)",
2562                .test = alg_test_null,
2563                .fips_allowed = 1,
2564        }, {
2565                .alg = "ctr(aes)",
2566                .test = alg_test_skcipher,
2567                .fips_allowed = 1,
2568                .suite = {
2569                        .cipher = {
2570                                .enc = {
2571                                        .vecs = aes_ctr_enc_tv_template,
2572                                        .count = AES_CTR_ENC_TEST_VECTORS
2573                                },
2574                                .dec = {
2575                                        .vecs = aes_ctr_dec_tv_template,
2576                                        .count = AES_CTR_DEC_TEST_VECTORS
2577                                }
2578                        }
2579                }
2580        }, {
2581                .alg = "ctr(blowfish)",
2582                .test = alg_test_skcipher,
2583                .suite = {
2584                        .cipher = {
2585                                .enc = {
2586                                        .vecs = bf_ctr_enc_tv_template,
2587                                        .count = BF_CTR_ENC_TEST_VECTORS
2588                                },
2589                                .dec = {
2590                                        .vecs = bf_ctr_dec_tv_template,
2591                                        .count = BF_CTR_DEC_TEST_VECTORS
2592                                }
2593                        }
2594                }
2595        }, {
2596                .alg = "ctr(camellia)",
2597                .test = alg_test_skcipher,
2598                .suite = {
2599                        .cipher = {
2600                                .enc = {
2601                                        .vecs = camellia_ctr_enc_tv_template,
2602                                        .count = CAMELLIA_CTR_ENC_TEST_VECTORS
2603                                },
2604                                .dec = {
2605                                        .vecs = camellia_ctr_dec_tv_template,
2606                                        .count = CAMELLIA_CTR_DEC_TEST_VECTORS
2607                                }
2608                        }
2609                }
2610        }, {
2611                .alg = "ctr(cast5)",
2612                .test = alg_test_skcipher,
2613                .suite = {
2614                        .cipher = {
2615                                .enc = {
2616                                        .vecs = cast5_ctr_enc_tv_template,
2617                                        .count = CAST5_CTR_ENC_TEST_VECTORS
2618                                },
2619                                .dec = {
2620                                        .vecs = cast5_ctr_dec_tv_template,
2621                                        .count = CAST5_CTR_DEC_TEST_VECTORS
2622                                }
2623                        }
2624                }
2625        }, {
2626                .alg = "ctr(cast6)",
2627                .test = alg_test_skcipher,
2628                .suite = {
2629                        .cipher = {
2630                                .enc = {
2631                                        .vecs = cast6_ctr_enc_tv_template,
2632                                        .count = CAST6_CTR_ENC_TEST_VECTORS
2633                                },
2634                                .dec = {
2635                                        .vecs = cast6_ctr_dec_tv_template,
2636                                        .count = CAST6_CTR_DEC_TEST_VECTORS
2637                                }
2638                        }
2639                }
2640        }, {
2641                .alg = "ctr(des)",
2642                .test = alg_test_skcipher,
2643                .suite = {
2644                        .cipher = {
2645                                .enc = {
2646                                        .vecs = des_ctr_enc_tv_template,
2647                                        .count = DES_CTR_ENC_TEST_VECTORS
2648                                },
2649                                .dec = {
2650                                        .vecs = des_ctr_dec_tv_template,
2651                                        .count = DES_CTR_DEC_TEST_VECTORS
2652                                }
2653                        }
2654                }
2655        }, {
2656                .alg = "ctr(des3_ede)",
2657                .test = alg_test_skcipher,
2658                .suite = {
2659                        .cipher = {
2660                                .enc = {
2661                                        .vecs = des3_ede_ctr_enc_tv_template,
2662                                        .count = DES3_EDE_CTR_ENC_TEST_VECTORS
2663                                },
2664                                .dec = {
2665                                        .vecs = des3_ede_ctr_dec_tv_template,
2666                                        .count = DES3_EDE_CTR_DEC_TEST_VECTORS
2667                                }
2668                        }
2669                }
2670        }, {
2671                .alg = "ctr(serpent)",
2672                .test = alg_test_skcipher,
2673                .suite = {
2674                        .cipher = {
2675                                .enc = {
2676                                        .vecs = serpent_ctr_enc_tv_template,
2677                                        .count = SERPENT_CTR_ENC_TEST_VECTORS
2678                                },
2679                                .dec = {
2680                                        .vecs = serpent_ctr_dec_tv_template,
2681                                        .count = SERPENT_CTR_DEC_TEST_VECTORS
2682                                }
2683                        }
2684                }
2685        }, {
2686                .alg = "ctr(twofish)",
2687                .test = alg_test_skcipher,
2688                .suite = {
2689                        .cipher = {
2690                                .enc = {
2691                                        .vecs = tf_ctr_enc_tv_template,
2692                                        .count = TF_CTR_ENC_TEST_VECTORS
2693                                },
2694                                .dec = {
2695                                        .vecs = tf_ctr_dec_tv_template,
2696                                        .count = TF_CTR_DEC_TEST_VECTORS
2697                                }
2698                        }
2699                }
2700        }, {
2701                .alg = "cts(cbc(aes))",
2702                .test = alg_test_skcipher,
2703                .suite = {
2704                        .cipher = {
2705                                .enc = {
2706                                        .vecs = cts_mode_enc_tv_template,
2707                                        .count = CTS_MODE_ENC_TEST_VECTORS
2708                                },
2709                                .dec = {
2710                                        .vecs = cts_mode_dec_tv_template,
2711                                        .count = CTS_MODE_DEC_TEST_VECTORS
2712                                }
2713                        }
2714                }
2715        }, {
2716                .alg = "deflate",
2717                .test = alg_test_comp,
2718                .fips_allowed = 1,
2719                .suite = {
2720                        .comp = {
2721                                .comp = {
2722                                        .vecs = deflate_comp_tv_template,
2723                                        .count = DEFLATE_COMP_TEST_VECTORS
2724                                },
2725                                .decomp = {
2726                                        .vecs = deflate_decomp_tv_template,
2727                                        .count = DEFLATE_DECOMP_TEST_VECTORS
2728                                }
2729                        }
2730                }
2731        }, {
2732                .alg = "digest_null",
2733                .test = alg_test_null,
2734        }, {
2735                .alg = "drbg_nopr_ctr_aes128",
2736                .test = alg_test_drbg,
2737                .fips_allowed = 1,
2738                .suite = {
2739                        .drbg = {
2740                                .vecs = drbg_nopr_ctr_aes128_tv_template,
2741                                .count = ARRAY_SIZE(drbg_nopr_ctr_aes128_tv_template)
2742                        }
2743                }
2744        }, {
2745                .alg = "drbg_nopr_ctr_aes192",
2746                .test = alg_test_drbg,
2747                .fips_allowed = 1,
2748                .suite = {
2749                        .drbg = {
2750                                .vecs = drbg_nopr_ctr_aes192_tv_template,
2751                                .count = ARRAY_SIZE(drbg_nopr_ctr_aes192_tv_template)
2752                        }
2753                }
2754        }, {
2755                .alg = "drbg_nopr_ctr_aes256",
2756                .test = alg_test_drbg,
2757                .fips_allowed = 1,
2758                .suite = {
2759                        .drbg = {
2760                                .vecs = drbg_nopr_ctr_aes256_tv_template,
2761                                .count = ARRAY_SIZE(drbg_nopr_ctr_aes256_tv_template)
2762                        }
2763                }
2764        }, {
2765                /*
2766                 * There is no need to specifically test the DRBG with every
2767                 * backend cipher -- covered by drbg_nopr_hmac_sha256 test
2768                 */
2769                .alg = "drbg_nopr_hmac_sha1",
2770                .fips_allowed = 1,
2771                .test = alg_test_null,
2772        }, {
2773                .alg = "drbg_nopr_hmac_sha256",
2774                .test = alg_test_drbg,
2775                .fips_allowed = 1,
2776                .suite = {
2777                        .drbg = {
2778                                .vecs = drbg_nopr_hmac_sha256_tv_template,
2779                                .count =
2780                                ARRAY_SIZE(drbg_nopr_hmac_sha256_tv_template)
2781                        }
2782                }
2783        }, {
2784                /* covered by drbg_nopr_hmac_sha256 test */
2785                .alg = "drbg_nopr_hmac_sha384",
2786                .fips_allowed = 1,
2787                .test = alg_test_null,
2788        }, {
2789                .alg = "drbg_nopr_hmac_sha512",
2790                .test = alg_test_null,
2791                .fips_allowed = 1,
2792        }, {
2793                .alg = "drbg_nopr_sha1",
2794                .fips_allowed = 1,
2795                .test = alg_test_null,
2796        }, {
2797                .alg = "drbg_nopr_sha256",
2798                .test = alg_test_drbg,
2799                .fips_allowed = 1,
2800                .suite = {
2801                        .drbg = {
2802                                .vecs = drbg_nopr_sha256_tv_template,
2803                                .count = ARRAY_SIZE(drbg_nopr_sha256_tv_template)
2804                        }
2805                }
2806        }, {
2807                /* covered by drbg_nopr_sha256 test */
2808                .alg = "drbg_nopr_sha384",
2809                .fips_allowed = 1,
2810                .test = alg_test_null,
2811        }, {
2812                .alg = "drbg_nopr_sha512",
2813                .fips_allowed = 1,
2814                .test = alg_test_null,
2815        }, {
2816                .alg = "drbg_pr_ctr_aes128",
2817                .test = alg_test_drbg,
2818                .fips_allowed = 1,
2819                .suite = {
2820                        .drbg = {
2821                                .vecs = drbg_pr_ctr_aes128_tv_template,
2822                                .count = ARRAY_SIZE(drbg_pr_ctr_aes128_tv_template)
2823                        }
2824                }
2825        }, {
2826                /* covered by drbg_pr_ctr_aes128 test */
2827                .alg = "drbg_pr_ctr_aes192",
2828                .fips_allowed = 1,
2829                .test = alg_test_null,
2830        }, {
2831                .alg = "drbg_pr_ctr_aes256",
2832                .fips_allowed = 1,
2833                .test = alg_test_null,
2834        }, {
2835                .alg = "drbg_pr_hmac_sha1",
2836                .fips_allowed = 1,
2837                .test = alg_test_null,
2838        }, {
2839                .alg = "drbg_pr_hmac_sha256",
2840                .test = alg_test_drbg,
2841                .fips_allowed = 1,
2842                .suite = {
2843                        .drbg = {
2844                                .vecs = drbg_pr_hmac_sha256_tv_template,
2845                                .count = ARRAY_SIZE(drbg_pr_hmac_sha256_tv_template)
2846                        }
2847                }
2848        }, {
2849                /* covered by drbg_pr_hmac_sha256 test */
2850                .alg = "drbg_pr_hmac_sha384",
2851                .fips_allowed = 1,
2852                .test = alg_test_null,
2853        }, {
2854                .alg = "drbg_pr_hmac_sha512",
2855                .test = alg_test_null,
2856                .fips_allowed = 1,
2857        }, {
2858                .alg = "drbg_pr_sha1",
2859                .fips_allowed = 1,
2860                .test = alg_test_null,
2861        }, {
2862                .alg = "drbg_pr_sha256",
2863                .test = alg_test_drbg,
2864                .fips_allowed = 1,
2865                .suite = {
2866                        .drbg = {
2867                                .vecs = drbg_pr_sha256_tv_template,
2868                                .count = ARRAY_SIZE(drbg_pr_sha256_tv_template)
2869                        }
2870                }
2871        }, {
2872                /* covered by drbg_pr_sha256 test */
2873                .alg = "drbg_pr_sha384",
2874                .fips_allowed = 1,
2875                .test = alg_test_null,
2876        }, {
2877                .alg = "drbg_pr_sha512",
2878                .fips_allowed = 1,
2879                .test = alg_test_null,
2880        }, {
2881                .alg = "ecb(__aes-aesni)",
2882                .test = alg_test_null,
2883                .fips_allowed = 1,
2884        }, {
2885                .alg = "ecb(aes)",
2886                .test = alg_test_skcipher,
2887                .fips_allowed = 1,
2888                .suite = {
2889                        .cipher = {
2890                                .enc = {
2891                                        .vecs = aes_enc_tv_template,
2892                                        .count = AES_ENC_TEST_VECTORS
2893                                },
2894                                .dec = {
2895                                        .vecs = aes_dec_tv_template,
2896                                        .count = AES_DEC_TEST_VECTORS
2897                                }
2898                        }
2899                }
2900        }, {
2901                .alg = "ecb(anubis)",
2902                .test = alg_test_skcipher,
2903                .suite = {
2904                        .cipher = {
2905                                .enc = {
2906                                        .vecs = anubis_enc_tv_template,
2907                                        .count = ANUBIS_ENC_TEST_VECTORS
2908                                },
2909                                .dec = {
2910                                        .vecs = anubis_dec_tv_template,
2911                                        .count = ANUBIS_DEC_TEST_VECTORS
2912                                }
2913                        }
2914                }
2915        }, {
2916                .alg = "ecb(arc4)",
2917                .test = alg_test_skcipher,
2918                .suite = {
2919                        .cipher = {
2920                                .enc = {
2921                                        .vecs = arc4_enc_tv_template,
2922                                        .count = ARC4_ENC_TEST_VECTORS
2923                                },
2924                                .dec = {
2925                                        .vecs = arc4_dec_tv_template,
2926                                        .count = ARC4_DEC_TEST_VECTORS
2927                                }
2928                        }
2929                }
2930        }, {
2931                .alg = "ecb(blowfish)",
2932                .test = alg_test_skcipher,
2933                .suite = {
2934                        .cipher = {
2935                                .enc = {
2936                                        .vecs = bf_enc_tv_template,
2937                                        .count = BF_ENC_TEST_VECTORS
2938                                },
2939                                .dec = {
2940                                        .vecs = bf_dec_tv_template,
2941                                        .count = BF_DEC_TEST_VECTORS
2942                                }
2943                        }
2944                }
2945        }, {
2946                .alg = "ecb(camellia)",
2947                .test = alg_test_skcipher,
2948                .suite = {
2949                        .cipher = {
2950                                .enc = {
2951                                        .vecs = camellia_enc_tv_template,
2952                                        .count = CAMELLIA_ENC_TEST_VECTORS
2953                                },
2954                                .dec = {
2955                                        .vecs = camellia_dec_tv_template,
2956                                        .count = CAMELLIA_DEC_TEST_VECTORS
2957                                }
2958                        }
2959                }
2960        }, {
2961                .alg = "ecb(cast5)",
2962                .test = alg_test_skcipher,
2963                .suite = {
2964                        .cipher = {
2965                                .enc = {
2966                                        .vecs = cast5_enc_tv_template,
2967                                        .count = CAST5_ENC_TEST_VECTORS
2968                                },
2969                                .dec = {
2970                                        .vecs = cast5_dec_tv_template,
2971                                        .count = CAST5_DEC_TEST_VECTORS
2972                                }
2973                        }
2974                }
2975        }, {
2976                .alg = "ecb(cast6)",
2977                .test = alg_test_skcipher,
2978                .suite = {
2979                        .cipher = {
2980                                .enc = {
2981                                        .vecs = cast6_enc_tv_template,
2982                                        .count = CAST6_ENC_TEST_VECTORS
2983                                },
2984                                .dec = {
2985                                        .vecs = cast6_dec_tv_template,
2986                                        .count = CAST6_DEC_TEST_VECTORS
2987                                }
2988                        }
2989                }
2990        }, {
2991                .alg = "ecb(cipher_null)",
2992                .test = alg_test_null,
2993        }, {
2994                .alg = "ecb(des)",
2995                .test = alg_test_skcipher,
2996                .suite = {
2997                        .cipher = {
2998                                .enc = {
2999                                        .vecs = des_enc_tv_template,
3000                                        .count = DES_ENC_TEST_VECTORS
3001                                },
3002                                .dec = {
3003                                        .vecs = des_dec_tv_template,
3004                                        .count = DES_DEC_TEST_VECTORS
3005                                }
3006                        }
3007                }
3008        }, {
3009                .alg = "ecb(des3_ede)",
3010                .test = alg_test_skcipher,
3011                .fips_allowed = 1,
3012                .suite = {
3013                        .cipher = {
3014                                .enc = {
3015                                        .vecs = des3_ede_enc_tv_template,
3016                                        .count = DES3_EDE_ENC_TEST_VECTORS
3017                                },
3018                                .dec = {
3019                                        .vecs = des3_ede_dec_tv_template,
3020                                        .count = DES3_EDE_DEC_TEST_VECTORS
3021                                }
3022                        }
3023                }
3024        }, {
3025                .alg = "ecb(fcrypt)",
3026                .test = alg_test_skcipher,
3027                .suite = {
3028                        .cipher = {
3029                                .enc = {
3030                                        .vecs = fcrypt_pcbc_enc_tv_template,
3031                                        .count = 1
3032                                },
3033                                .dec = {
3034                                        .vecs = fcrypt_pcbc_dec_tv_template,
3035                                        .count = 1
3036                                }
3037                        }
3038                }
3039        }, {
3040                .alg = "ecb(khazad)",
3041                .test = alg_test_skcipher,
3042                .suite = {
3043                        .cipher = {
3044                                .enc = {
3045                                        .vecs = khazad_enc_tv_template,
3046                                        .count = KHAZAD_ENC_TEST_VECTORS
3047                                },
3048                                .dec = {
3049                                        .vecs = khazad_dec_tv_template,
3050                                        .count = KHAZAD_DEC_TEST_VECTORS
3051                                }
3052                        }
3053                }
3054        }, {
3055                .alg = "ecb(seed)",
3056                .test = alg_test_skcipher,
3057                .suite = {
3058                        .cipher = {
3059                                .enc = {
3060                                        .vecs = seed_enc_tv_template,
3061                                        .count = SEED_ENC_TEST_VECTORS
3062                                },
3063                                .dec = {
3064                                        .vecs = seed_dec_tv_template,
3065                                        .count = SEED_DEC_TEST_VECTORS
3066                                }
3067                        }
3068                }
3069        }, {
3070                .alg = "ecb(serpent)",
3071                .test = alg_test_skcipher,
3072                .suite = {
3073                        .cipher = {
3074                                .enc = {
3075                                        .vecs = serpent_enc_tv_template,
3076                                        .count = SERPENT_ENC_TEST_VECTORS
3077                                },
3078                                .dec = {
3079                                        .vecs = serpent_dec_tv_template,
3080                                        .count = SERPENT_DEC_TEST_VECTORS
3081                                }
3082                        }
3083                }
3084        }, {
3085                .alg = "ecb(tea)",
3086                .test = alg_test_skcipher,
3087                .suite = {
3088                        .cipher = {
3089                                .enc = {
3090                                        .vecs = tea_enc_tv_template,
3091                                        .count = TEA_ENC_TEST_VECTORS
3092                                },
3093                                .dec = {
3094                                        .vecs = tea_dec_tv_template,
3095                                        .count = TEA_DEC_TEST_VECTORS
3096                                }
3097                        }
3098                }
3099        }, {
3100                .alg = "ecb(tnepres)",
3101                .test = alg_test_skcipher,
3102                .suite = {
3103                        .cipher = {
3104                                .enc = {
3105                                        .vecs = tnepres_enc_tv_template,
3106                                        .count = TNEPRES_ENC_TEST_VECTORS
3107                                },
3108                                .dec = {
3109                                        .vecs = tnepres_dec_tv_template,
3110                                        .count = TNEPRES_DEC_TEST_VECTORS
3111                                }
3112                        }
3113                }
3114        }, {
3115                .alg = "ecb(twofish)",
3116                .test = alg_test_skcipher,
3117                .suite = {
3118                        .cipher = {
3119                                .enc = {
3120                                        .vecs = tf_enc_tv_template,
3121                                        .count = TF_ENC_TEST_VECTORS
3122                                },
3123                                .dec = {
3124                                        .vecs = tf_dec_tv_template,
3125                                        .count = TF_DEC_TEST_VECTORS
3126                                }
3127                        }
3128                }
3129        }, {
3130                .alg = "ecb(xeta)",
3131                .test = alg_test_skcipher,
3132                .suite = {
3133                        .cipher = {
3134                                .enc = {
3135                                        .vecs = xeta_enc_tv_template,
3136                                        .count = XETA_ENC_TEST_VECTORS
3137                                },
3138                                .dec = {
3139                                        .vecs = xeta_dec_tv_template,
3140                                        .count = XETA_DEC_TEST_VECTORS
3141                                }
3142                        }
3143                }
3144        }, {
3145                .alg = "ecb(xtea)",
3146                .test = alg_test_skcipher,
3147                .suite = {
3148                        .cipher = {
3149                                .enc = {
3150                                        .vecs = xtea_enc_tv_template,
3151                                        .count = XTEA_ENC_TEST_VECTORS
3152                                },
3153                                .dec = {
3154                                        .vecs = xtea_dec_tv_template,
3155                                        .count = XTEA_DEC_TEST_VECTORS
3156                                }
3157                        }
3158                }
3159        }, {
3160                .alg = "gcm(aes)",
3161                .test = alg_test_aead,
3162                .fips_allowed = 1,
3163                .suite = {
3164                        .aead = {
3165                                .enc = {
3166                                        .vecs = aes_gcm_enc_tv_template,
3167                                        .count = AES_GCM_ENC_TEST_VECTORS
3168                                },
3169                                .dec = {
3170                                        .vecs = aes_gcm_dec_tv_template,
3171                                        .count = AES_GCM_DEC_TEST_VECTORS
3172                                }
3173                        }
3174                }
3175        }, {
3176                .alg = "ghash",
3177                .test = alg_test_hash,
3178                .fips_allowed = 1,
3179                .suite = {
3180                        .hash = {
3181                                .vecs = ghash_tv_template,
3182                                .count = GHASH_TEST_VECTORS
3183                        }
3184                }
3185        }, {
3186                .alg = "hmac(crc32)",
3187                .test = alg_test_hash,
3188                .suite = {
3189                        .hash = {
3190                                .vecs = bfin_crc_tv_template,
3191                                .count = BFIN_CRC_TEST_VECTORS
3192                        }
3193                }
3194        }, {
3195                .alg = "hmac(md5)",
3196                .test = alg_test_hash,
3197                .suite = {
3198                        .hash = {
3199                                .vecs = hmac_md5_tv_template,
3200                                .count = HMAC_MD5_TEST_VECTORS
3201                        }
3202                }
3203        }, {
3204                .alg = "hmac(rmd128)",
3205                .test = alg_test_hash,
3206                .suite = {
3207                        .hash = {
3208                                .vecs = hmac_rmd128_tv_template,
3209                                .count = HMAC_RMD128_TEST_VECTORS
3210                        }
3211                }
3212        }, {
3213                .alg = "hmac(rmd160)",
3214                .test = alg_test_hash,
3215                .suite = {
3216                        .hash = {
3217                                .vecs = hmac_rmd160_tv_template,
3218                                .count = HMAC_RMD160_TEST_VECTORS
3219                        }
3220                }
3221        }, {
3222                .alg = "hmac(sha1)",
3223                .test = alg_test_hash,
3224                .fips_allowed = 1,
3225                .suite = {
3226                        .hash = {
3227                                .vecs = hmac_sha1_tv_template,
3228                                .count = HMAC_SHA1_TEST_VECTORS
3229                        }
3230                }
3231        }, {
3232                .alg = "hmac(sha224)",
3233                .test = alg_test_hash,
3234                .fips_allowed = 1,
3235                .suite = {
3236                        .hash = {
3237                                .vecs = hmac_sha224_tv_template,
3238                                .count = HMAC_SHA224_TEST_VECTORS
3239                        }
3240                }
3241        }, {
3242                .alg = "hmac(sha256)",
3243                .test = alg_test_hash,
3244                .fips_allowed = 1,
3245                .suite = {
3246                        .hash = {
3247                                .vecs = hmac_sha256_tv_template,
3248                                .count = HMAC_SHA256_TEST_VECTORS
3249                        }
3250                }
3251        }, {
3252                .alg = "hmac(sha384)",
3253                .test = alg_test_hash,
3254                .fips_allowed = 1,
3255                .suite = {
3256                        .hash = {
3257                                .vecs = hmac_sha384_tv_template,
3258                                .count = HMAC_SHA384_TEST_VECTORS
3259                        }
3260                }
3261        }, {
3262                .alg = "hmac(sha512)",
3263                .test = alg_test_hash,
3264                .fips_allowed = 1,
3265                .suite = {
3266                        .hash = {
3267                                .vecs = hmac_sha512_tv_template,
3268                                .count = HMAC_SHA512_TEST_VECTORS
3269                        }
3270                }
3271        }, {
3272                .alg = "jitterentropy_rng",
3273                .fips_allowed = 1,
3274                .test = alg_test_null,
3275        }, {
3276                .alg = "kw(aes)",
3277                .test = alg_test_skcipher,
3278                .fips_allowed = 1,
3279                .suite = {
3280                        .cipher = {
3281                                .enc = {
3282                                        .vecs = aes_kw_enc_tv_template,
3283                                        .count = ARRAY_SIZE(aes_kw_enc_tv_template)
3284                                },
3285                                .dec = {
3286                                        .vecs = aes_kw_dec_tv_template,
3287                                        .count = ARRAY_SIZE(aes_kw_dec_tv_template)
3288                                }
3289                        }
3290                }
3291        }, {
3292                .alg = "lrw(aes)",
3293                .test = alg_test_skcipher,
3294                .suite = {
3295                        .cipher = {
3296                                .enc = {
3297                                        .vecs = aes_lrw_enc_tv_template,
3298                                        .count = AES_LRW_ENC_TEST_VECTORS
3299                                },
3300                                .dec = {
3301                                        .vecs = aes_lrw_dec_tv_template,
3302                                        .count = AES_LRW_DEC_TEST_VECTORS
3303                                }
3304                        }
3305                }
3306        }, {
3307                .alg = "lrw(camellia)",
3308                .test = alg_test_skcipher,
3309                .suite = {
3310                        .cipher = {
3311                                .enc = {
3312                                        .vecs = camellia_lrw_enc_tv_template,
3313                                        .count = CAMELLIA_LRW_ENC_TEST_VECTORS
3314                                },
3315                                .dec = {
3316                                        .vecs = camellia_lrw_dec_tv_template,
3317                                        .count = CAMELLIA_LRW_DEC_TEST_VECTORS
3318                                }
3319                        }
3320                }
3321        }, {
3322                .alg = "lrw(cast6)",
3323                .test = alg_test_skcipher,
3324                .suite = {
3325                        .cipher = {
3326                                .enc = {
3327                                        .vecs = cast6_lrw_enc_tv_template,
3328                                        .count = CAST6_LRW_ENC_TEST_VECTORS
3329                                },
3330                                .dec = {
3331                                        .vecs = cast6_lrw_dec_tv_template,
3332                                        .count = CAST6_LRW_DEC_TEST_VECTORS
3333                                }
3334                        }
3335                }
3336        }, {
3337                .alg = "lrw(serpent)",
3338                .test = alg_test_skcipher,
3339                .suite = {
3340                        .cipher = {
3341                                .enc = {
3342                                        .vecs = serpent_lrw_enc_tv_template,
3343                                        .count = SERPENT_LRW_ENC_TEST_VECTORS
3344                                },
3345                                .dec = {
3346                                        .vecs = serpent_lrw_dec_tv_template,
3347                                        .count = SERPENT_LRW_DEC_TEST_VECTORS
3348                                }
3349                        }
3350                }
3351        }, {
3352                .alg = "lrw(twofish)",
3353                .test = alg_test_skcipher,
3354                .suite = {
3355                        .cipher = {
3356                                .enc = {
3357                                        .vecs = tf_lrw_enc_tv_template,
3358                                        .count = TF_LRW_ENC_TEST_VECTORS
3359                                },
3360                                .dec = {
3361                                        .vecs = tf_lrw_dec_tv_template,
3362                                        .count = TF_LRW_DEC_TEST_VECTORS
3363                                }
3364                        }
3365                }
3366        }, {
3367                .alg = "lz4",
3368                .test = alg_test_comp,
3369                .fips_allowed = 1,
3370                .suite = {
3371                        .comp = {
3372                                .comp = {
3373                                        .vecs = lz4_comp_tv_template,
3374                                        .count = LZ4_COMP_TEST_VECTORS
3375                                },
3376                                .decomp = {
3377                                        .vecs = lz4_decomp_tv_template,
3378                                        .count = LZ4_DECOMP_TEST_VECTORS
3379                                }
3380                        }
3381                }
3382        }, {
3383                .alg = "lz4hc",
3384                .test = alg_test_comp,
3385                .fips_allowed = 1,
3386                .suite = {
3387                        .comp = {
3388                                .comp = {
3389                                        .vecs = lz4hc_comp_tv_template,
3390                                        .count = LZ4HC_COMP_TEST_VECTORS
3391                                },
3392                                .decomp = {
3393                                        .vecs = lz4hc_decomp_tv_template,
3394                                        .count = LZ4HC_DECOMP_TEST_VECTORS
3395                                }
3396                        }
3397                }
3398        }, {
3399                .alg = "lzo",
3400                .test = alg_test_comp,
3401                .fips_allowed = 1,
3402                .suite = {
3403                        .comp = {
3404                                .comp = {
3405                                        .vecs = lzo_comp_tv_template,
3406                                        .count = LZO_COMP_TEST_VECTORS
3407                                },
3408                                .decomp = {
3409                                        .vecs = lzo_decomp_tv_template,
3410                                        .count = LZO_DECOMP_TEST_VECTORS
3411                                }
3412                        }
3413                }
3414        }, {
3415                .alg = "md4",
3416                .test = alg_test_hash,
3417                .suite = {
3418                        .hash = {
3419                                .vecs = md4_tv_template,
3420                                .count = MD4_TEST_VECTORS
3421                        }
3422                }
3423        }, {
3424                .alg = "md5",
3425                .test = alg_test_hash,
3426                .suite = {
3427                        .hash = {
3428                                .vecs = md5_tv_template,
3429                                .count = MD5_TEST_VECTORS
3430                        }
3431                }
3432        }, {
3433                .alg = "michael_mic",
3434                .test = alg_test_hash,
3435                .suite = {
3436                        .hash = {
3437                                .vecs = michael_mic_tv_template,
3438                                .count = MICHAEL_MIC_TEST_VECTORS
3439                        }
3440                }
3441        }, {
3442                .alg = "ofb(aes)",
3443                .test = alg_test_skcipher,
3444                .fips_allowed = 1,
3445                .suite = {
3446                        .cipher = {
3447                                .enc = {
3448                                        .vecs = aes_ofb_enc_tv_template,
3449                                        .count = AES_OFB_ENC_TEST_VECTORS
3450                                },
3451                                .dec = {
3452                                        .vecs = aes_ofb_dec_tv_template,
3453                                        .count = AES_OFB_DEC_TEST_VECTORS
3454                                }
3455                        }
3456                }
3457        }, {
3458                .alg = "pcbc(fcrypt)",
3459                .test = alg_test_skcipher,
3460                .suite = {
3461                        .cipher = {
3462                                .enc = {
3463                                        .vecs = fcrypt_pcbc_enc_tv_template,
3464                                        .count = FCRYPT_ENC_TEST_VECTORS
3465                                },
3466                                .dec = {
3467                                        .vecs = fcrypt_pcbc_dec_tv_template,
3468                                        .count = FCRYPT_DEC_TEST_VECTORS
3469                                }
3470                        }
3471                }
3472        }, {
3473                .alg = "poly1305",
3474                .test = alg_test_hash,
3475                .suite = {
3476                        .hash = {
3477                                .vecs = poly1305_tv_template,
3478                                .count = POLY1305_TEST_VECTORS
3479                        }
3480                }
3481        }, {
3482                .alg = "rfc3686(ctr(aes))",
3483                .test = alg_test_skcipher,
3484                .fips_allowed = 1,
3485                .suite = {
3486                        .cipher = {
3487                                .enc = {
3488                                        .vecs = aes_ctr_rfc3686_enc_tv_template,
3489                                        .count = AES_CTR_3686_ENC_TEST_VECTORS
3490                                },
3491                                .dec = {
3492                                        .vecs = aes_ctr_rfc3686_dec_tv_template,
3493                                        .count = AES_CTR_3686_DEC_TEST_VECTORS
3494                                }
3495                        }
3496                }
3497        }, {
3498                .alg = "rfc4106(gcm(aes))",
3499                .test = alg_test_aead,
3500                .fips_allowed = 1,
3501                .suite = {
3502                        .aead = {
3503                                .enc = {
3504                                        .vecs = aes_gcm_rfc4106_enc_tv_template,
3505                                        .count = AES_GCM_4106_ENC_TEST_VECTORS
3506                                },
3507                                .dec = {
3508                                        .vecs = aes_gcm_rfc4106_dec_tv_template,
3509                                        .count = AES_GCM_4106_DEC_TEST_VECTORS
3510                                }
3511                        }
3512                }
3513        }, {
3514                .alg = "rfc4309(ccm(aes))",
3515                .test = alg_test_aead,
3516                .fips_allowed = 1,
3517                .suite = {
3518                        .aead = {
3519                                .enc = {
3520                                        .vecs = aes_ccm_rfc4309_enc_tv_template,
3521                                        .count = AES_CCM_4309_ENC_TEST_VECTORS
3522                                },
3523                                .dec = {
3524                                        .vecs = aes_ccm_rfc4309_dec_tv_template,
3525                                        .count = AES_CCM_4309_DEC_TEST_VECTORS
3526                                }
3527                        }
3528                }
3529        }, {
3530                .alg = "rfc4543(gcm(aes))",
3531                .test = alg_test_aead,
3532                .suite = {
3533                        .aead = {
3534                                .enc = {
3535                                        .vecs = aes_gcm_rfc4543_enc_tv_template,
3536                                        .count = AES_GCM_4543_ENC_TEST_VECTORS
3537                                },
3538                                .dec = {
3539                                        .vecs = aes_gcm_rfc4543_dec_tv_template,
3540                                        .count = AES_GCM_4543_DEC_TEST_VECTORS
3541                                },
3542                        }
3543                }
3544        }, {
3545                .alg = "rfc7539(chacha20,poly1305)",
3546                .test = alg_test_aead,
3547                .suite = {
3548                        .aead = {
3549                                .enc = {
3550                                        .vecs = rfc7539_enc_tv_template,
3551                                        .count = RFC7539_ENC_TEST_VECTORS
3552                                },
3553                                .dec = {
3554                                        .vecs = rfc7539_dec_tv_template,
3555                                        .count = RFC7539_DEC_TEST_VECTORS
3556                                },
3557                        }
3558                }
3559        }, {
3560                .alg = "rfc7539esp(chacha20,poly1305)",
3561                .test = alg_test_aead,
3562                .suite = {
3563                        .aead = {
3564                                .enc = {
3565                                        .vecs = rfc7539esp_enc_tv_template,
3566                                        .count = RFC7539ESP_ENC_TEST_VECTORS
3567                                },
3568                                .dec = {
3569                                        .vecs = rfc7539esp_dec_tv_template,
3570                                        .count = RFC7539ESP_DEC_TEST_VECTORS
3571                                },
3572                        }
3573                }
3574        }, {
3575                .alg = "rmd128",
3576                .test = alg_test_hash,
3577                .suite = {
3578                        .hash = {
3579                                .vecs = rmd128_tv_template,
3580                                .count = RMD128_TEST_VECTORS
3581                        }
3582                }
3583        }, {
3584                .alg = "rmd160",
3585                .test = alg_test_hash,
3586                .suite = {
3587                        .hash = {
3588                                .vecs = rmd160_tv_template,
3589                                .count = RMD160_TEST_VECTORS
3590                        }
3591                }
3592        }, {
3593                .alg = "rmd256",
3594                .test = alg_test_hash,
3595                .suite = {
3596                        .hash = {
3597                                .vecs = rmd256_tv_template,
3598                                .count = RMD256_TEST_VECTORS
3599                        }
3600                }
3601        }, {
3602                .alg = "rmd320",
3603                .test = alg_test_hash,
3604                .suite = {
3605                        .hash = {
3606                                .vecs = rmd320_tv_template,
3607                                .count = RMD320_TEST_VECTORS
3608                        }
3609                }
3610        }, {
3611                .alg = "rsa",
3612                .test = alg_test_akcipher,
3613                .fips_allowed = 1,
3614                .suite = {
3615                        .akcipher = {
3616                                .vecs = rsa_tv_template,
3617                                .count = RSA_TEST_VECTORS
3618                        }
3619                }
3620        }, {
3621                .alg = "salsa20",
3622                .test = alg_test_skcipher,
3623                .suite = {
3624                        .cipher = {
3625                                .enc = {
3626                                        .vecs = salsa20_stream_enc_tv_template,
3627                                        .count = SALSA20_STREAM_ENC_TEST_VECTORS
3628                                }
3629                        }
3630                }
3631        }, {
3632                .alg = "sha1",
3633                .test = alg_test_hash,
3634                .fips_allowed = 1,
3635                .suite = {
3636                        .hash = {
3637                                .vecs = sha1_tv_template,
3638                                .count = SHA1_TEST_VECTORS
3639                        }
3640                }
3641        }, {
3642                .alg = "sha224",
3643                .test = alg_test_hash,
3644                .fips_allowed = 1,
3645                .suite = {
3646                        .hash = {
3647                                .vecs = sha224_tv_template,
3648                                .count = SHA224_TEST_VECTORS
3649                        }
3650                }
3651        }, {
3652                .alg = "sha256",
3653                .test = alg_test_hash,
3654                .fips_allowed = 1,
3655                .suite = {
3656                        .hash = {
3657                                .vecs = sha256_tv_template,
3658                                .count = SHA256_TEST_VECTORS
3659                        }
3660                }
3661        }, {
3662                .alg = "sha384",
3663                .test = alg_test_hash,
3664                .fips_allowed = 1,
3665                .suite = {
3666                        .hash = {
3667                                .vecs = sha384_tv_template,
3668                                .count = SHA384_TEST_VECTORS
3669                        }
3670                }
3671        }, {
3672                .alg = "sha512",
3673                .test = alg_test_hash,
3674                .fips_allowed = 1,
3675                .suite = {
3676                        .hash = {
3677                                .vecs = sha512_tv_template,
3678                                .count = SHA512_TEST_VECTORS
3679                        }
3680                }
3681        }, {
3682                .alg = "tgr128",
3683                .test = alg_test_hash,
3684                .suite = {
3685                        .hash = {
3686                                .vecs = tgr128_tv_template,
3687                                .count = TGR128_TEST_VECTORS
3688                        }
3689                }
3690        }, {
3691                .alg = "tgr160",
3692                .test = alg_test_hash,
3693                .suite = {
3694                        .hash = {
3695                                .vecs = tgr160_tv_template,
3696                                .count = TGR160_TEST_VECTORS
3697                        }
3698                }
3699        }, {
3700                .alg = "tgr192",
3701                .test = alg_test_hash,
3702                .suite = {
3703                        .hash = {
3704                                .vecs = tgr192_tv_template,
3705                                .count = TGR192_TEST_VECTORS
3706                        }
3707                }
3708        }, {
3709                .alg = "vmac(aes)",
3710                .test = alg_test_hash,
3711                .suite = {
3712                        .hash = {
3713                                .vecs = aes_vmac128_tv_template,
3714                                .count = VMAC_AES_TEST_VECTORS
3715                        }
3716                }
3717        }, {
3718                .alg = "wp256",
3719                .test = alg_test_hash,
3720                .suite = {
3721                        .hash = {
3722                                .vecs = wp256_tv_template,
3723                                .count = WP256_TEST_VECTORS
3724                        }
3725                }
3726        }, {
3727                .alg = "wp384",
3728                .test = alg_test_hash,
3729                .suite = {
3730                        .hash = {
3731                                .vecs = wp384_tv_template,
3732                                .count = WP384_TEST_VECTORS
3733                        }
3734                }
3735        }, {
3736                .alg = "wp512",
3737                .test = alg_test_hash,
3738                .suite = {
3739                        .hash = {
3740                                .vecs = wp512_tv_template,
3741                                .count = WP512_TEST_VECTORS
3742                        }
3743                }
3744        }, {
3745                .alg = "xcbc(aes)",
3746                .test = alg_test_hash,
3747                .suite = {
3748                        .hash = {
3749                                .vecs = aes_xcbc128_tv_template,
3750                                .count = XCBC_AES_TEST_VECTORS
3751                        }
3752                }
3753        }, {
3754                .alg = "xts(aes)",
3755                .test = alg_test_skcipher,
3756                .fips_allowed = 1,
3757                .suite = {
3758                        .cipher = {
3759                                .enc = {
3760                                        .vecs = aes_xts_enc_tv_template,
3761                                        .count = AES_XTS_ENC_TEST_VECTORS
3762                                },
3763                                .dec = {
3764                                        .vecs = aes_xts_dec_tv_template,
3765                                        .count = AES_XTS_DEC_TEST_VECTORS
3766                                }
3767                        }
3768                }
3769        }, {
3770                .alg = "xts(camellia)",
3771                .test = alg_test_skcipher,
3772                .suite = {
3773                        .cipher = {
3774                                .enc = {
3775                                        .vecs = camellia_xts_enc_tv_template,
3776                                        .count = CAMELLIA_XTS_ENC_TEST_VECTORS
3777                                },
3778                                .dec = {
3779                                        .vecs = camellia_xts_dec_tv_template,
3780                                        .count = CAMELLIA_XTS_DEC_TEST_VECTORS
3781                                }
3782                        }
3783                }
3784        }, {
3785                .alg = "xts(cast6)",
3786                .test = alg_test_skcipher,
3787                .suite = {
3788                        .cipher = {
3789                                .enc = {
3790                                        .vecs = cast6_xts_enc_tv_template,
3791                                        .count = CAST6_XTS_ENC_TEST_VECTORS
3792                                },
3793                                .dec = {
3794                                        .vecs = cast6_xts_dec_tv_template,
3795                                        .count = CAST6_XTS_DEC_TEST_VECTORS
3796                                }
3797                        }
3798                }
3799        }, {
3800                .alg = "xts(serpent)",
3801                .test = alg_test_skcipher,
3802                .suite = {
3803                        .cipher = {
3804                                .enc = {
3805                                        .vecs = serpent_xts_enc_tv_template,
3806                                        .count = SERPENT_XTS_ENC_TEST_VECTORS
3807                                },
3808                                .dec = {
3809                                        .vecs = serpent_xts_dec_tv_template,
3810                                        .count = SERPENT_XTS_DEC_TEST_VECTORS
3811                                }
3812                        }
3813                }
3814        }, {
3815                .alg = "xts(twofish)",
3816                .test = alg_test_skcipher,
3817                .suite = {
3818                        .cipher = {
3819                                .enc = {
3820                                        .vecs = tf_xts_enc_tv_template,
3821                                        .count = TF_XTS_ENC_TEST_VECTORS
3822                                },
3823                                .dec = {
3824                                        .vecs = tf_xts_dec_tv_template,
3825                                        .count = TF_XTS_DEC_TEST_VECTORS
3826                                }
3827                        }
3828                }
3829        }
3830};
3831
3832static bool alg_test_descs_checked;
3833
3834static void alg_test_descs_check_order(void)
3835{
3836        int i;
3837
3838        /* only check once */
3839        if (alg_test_descs_checked)
3840                return;
3841
3842        alg_test_descs_checked = true;
3843
3844        for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) {
3845                int diff = strcmp(alg_test_descs[i - 1].alg,
3846                                  alg_test_descs[i].alg);
3847
3848                if (WARN_ON(diff > 0)) {
3849                        pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n",
3850                                alg_test_descs[i - 1].alg,
3851                                alg_test_descs[i].alg);
3852                }
3853
3854                if (WARN_ON(diff == 0)) {
3855                        pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n",
3856                                alg_test_descs[i].alg);
3857                }
3858        }
3859}
3860
3861static int alg_find_test(const char *alg)
3862{
3863        int start = 0;
3864        int end = ARRAY_SIZE(alg_test_descs);
3865
3866        while (start < end) {
3867                int i = (start + end) / 2;
3868                int diff = strcmp(alg_test_descs[i].alg, alg);
3869
3870                if (diff > 0) {
3871                        end = i;
3872                        continue;
3873                }
3874
3875                if (diff < 0) {
3876                        start = i + 1;
3877                        continue;
3878                }
3879
3880                return i;
3881        }
3882
3883        return -1;
3884}
3885
3886int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
3887{
3888        int i;
3889        int j;
3890        int rc;
3891
3892        if (!fips_enabled && notests) {
3893                printk_once(KERN_INFO "alg: self-tests disabled\n");
3894                return 0;
3895        }
3896
3897        alg_test_descs_check_order();
3898
3899        if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
3900                char nalg[CRYPTO_MAX_ALG_NAME];
3901
3902                if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
3903                    sizeof(nalg))
3904                        return -ENAMETOOLONG;
3905
3906                i = alg_find_test(nalg);
3907                if (i < 0)
3908                        goto notest;
3909
3910                if (fips_enabled && !alg_test_descs[i].fips_allowed)
3911                        goto non_fips_alg;
3912
3913                rc = alg_test_cipher(alg_test_descs + i, driver, type, mask);
3914                goto test_done;
3915        }
3916
3917        i = alg_find_test(alg);
3918        j = alg_find_test(driver);
3919        if (i < 0 && j < 0)
3920                goto notest;
3921
3922        if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
3923                             (j >= 0 && !alg_test_descs[j].fips_allowed)))
3924                goto non_fips_alg;
3925
3926        rc = 0;
3927        if (i >= 0)
3928                rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
3929                                             type, mask);
3930        if (j >= 0 && j != i)
3931                rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
3932                                             type, mask);
3933
3934test_done:
3935        if (fips_enabled && rc)
3936                panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
3937
3938        if (fips_enabled && !rc)
3939                pr_info("alg: self-tests for %s (%s) passed\n", driver, alg);
3940
3941        return rc;
3942
3943notest:
3944        printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
3945        return 0;
3946non_fips_alg:
3947        return -EINVAL;
3948}
3949
3950#endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
3951
3952EXPORT_SYMBOL_GPL(alg_test);
3953