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