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
  31#include "internal.h"
  32
  33#ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS
  34
  35/* a perfect nop */
  36int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
  37{
  38        return 0;
  39}
  40
  41#else
  42
  43#include "testmgr.h"
  44
  45/*
  46 * Need slab memory for testing (size in number of pages).
  47 */
  48#define XBUFSIZE        8
  49
  50/*
  51 * Indexes into the xbuf to simulate cross-page access.
  52 */
  53#define IDX1            32
  54#define IDX2            32400
  55#define IDX3            1
  56#define IDX4            8193
  57#define IDX5            22222
  58#define IDX6            17101
  59#define IDX7            27333
  60#define IDX8            3000
  61
  62/*
  63* Used by test_cipher()
  64*/
  65#define ENCRYPT 1
  66#define DECRYPT 0
  67
  68struct tcrypt_result {
  69        struct completion completion;
  70        int err;
  71};
  72
  73struct aead_test_suite {
  74        struct {
  75                struct aead_testvec *vecs;
  76                unsigned int count;
  77        } enc, dec;
  78};
  79
  80struct cipher_test_suite {
  81        struct {
  82                struct cipher_testvec *vecs;
  83                unsigned int count;
  84        } enc, dec;
  85};
  86
  87struct comp_test_suite {
  88        struct {
  89                struct comp_testvec *vecs;
  90                unsigned int count;
  91        } comp, decomp;
  92};
  93
  94struct pcomp_test_suite {
  95        struct {
  96                struct pcomp_testvec *vecs;
  97                unsigned int count;
  98        } comp, decomp;
  99};
 100
 101struct hash_test_suite {
 102        struct hash_testvec *vecs;
 103        unsigned int count;
 104};
 105
 106struct cprng_test_suite {
 107        struct cprng_testvec *vecs;
 108        unsigned int count;
 109};
 110
 111struct alg_test_desc {
 112        const char *alg;
 113        int (*test)(const struct alg_test_desc *desc, const char *driver,
 114                    u32 type, u32 mask);
 115        int fips_allowed;       /* set if alg is allowed in fips mode */
 116
 117        union {
 118                struct aead_test_suite aead;
 119                struct cipher_test_suite cipher;
 120                struct comp_test_suite comp;
 121                struct pcomp_test_suite pcomp;
 122                struct hash_test_suite hash;
 123                struct cprng_test_suite cprng;
 124        } suite;
 125};
 126
 127static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
 128
 129static void hexdump(unsigned char *buf, unsigned int len)
 130{
 131        print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
 132                        16, 1,
 133                        buf, len, false);
 134}
 135
 136static void tcrypt_complete(struct crypto_async_request *req, int err)
 137{
 138        struct tcrypt_result *res = req->data;
 139
 140        if (err == -EINPROGRESS)
 141                return;
 142
 143        res->err = err;
 144        complete(&res->completion);
 145}
 146
 147static int testmgr_alloc_buf(char *buf[XBUFSIZE])
 148{
 149        int i;
 150
 151        for (i = 0; i < XBUFSIZE; i++) {
 152                buf[i] = (void *)__get_free_page(GFP_KERNEL);
 153                if (!buf[i])
 154                        goto err_free_buf;
 155        }
 156
 157        return 0;
 158
 159err_free_buf:
 160        while (i-- > 0)
 161                free_page((unsigned long)buf[i]);
 162
 163        return -ENOMEM;
 164}
 165
 166static void testmgr_free_buf(char *buf[XBUFSIZE])
 167{
 168        int i;
 169
 170        for (i = 0; i < XBUFSIZE; i++)
 171                free_page((unsigned long)buf[i]);
 172}
 173
 174static int do_one_async_hash_op(struct ahash_request *req,
 175                                struct tcrypt_result *tr,
 176                                int ret)
 177{
 178        if (ret == -EINPROGRESS || ret == -EBUSY) {
 179                ret = wait_for_completion_interruptible(&tr->completion);
 180                if (!ret)
 181                        ret = tr->err;
 182                INIT_COMPLETION(tr->completion);
 183        }
 184        return ret;
 185}
 186
 187static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
 188                     unsigned int tcount, bool use_digest)
 189{
 190        const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
 191        unsigned int i, j, k, temp;
 192        struct scatterlist sg[8];
 193        char result[64];
 194        struct ahash_request *req;
 195        struct tcrypt_result tresult;
 196        void *hash_buff;
 197        char *xbuf[XBUFSIZE];
 198        int ret = -ENOMEM;
 199
 200        if (testmgr_alloc_buf(xbuf))
 201                goto out_nobuf;
 202
 203        init_completion(&tresult.completion);
 204
 205        req = ahash_request_alloc(tfm, GFP_KERNEL);
 206        if (!req) {
 207                printk(KERN_ERR "alg: hash: Failed to allocate request for "
 208                       "%s\n", algo);
 209                goto out_noreq;
 210        }
 211        ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
 212                                   tcrypt_complete, &tresult);
 213
 214        j = 0;
 215        for (i = 0; i < tcount; i++) {
 216                if (template[i].np)
 217                        continue;
 218
 219                j++;
 220                memset(result, 0, 64);
 221
 222                hash_buff = xbuf[0];
 223
 224                memcpy(hash_buff, template[i].plaintext, template[i].psize);
 225                sg_init_one(&sg[0], hash_buff, template[i].psize);
 226
 227                if (template[i].ksize) {
 228                        crypto_ahash_clear_flags(tfm, ~0);
 229                        ret = crypto_ahash_setkey(tfm, template[i].key,
 230                                                  template[i].ksize);
 231                        if (ret) {
 232                                printk(KERN_ERR "alg: hash: setkey failed on "
 233                                       "test %d for %s: ret=%d\n", j, algo,
 234                                       -ret);
 235                                goto out;
 236                        }
 237                }
 238
 239                ahash_request_set_crypt(req, sg, result, template[i].psize);
 240                if (use_digest) {
 241                        ret = do_one_async_hash_op(req, &tresult,
 242                                                   crypto_ahash_digest(req));
 243                        if (ret) {
 244                                pr_err("alg: hash: digest failed on test %d "
 245                                       "for %s: ret=%d\n", j, algo, -ret);
 246                                goto out;
 247                        }
 248                } else {
 249                        ret = do_one_async_hash_op(req, &tresult,
 250                                                   crypto_ahash_init(req));
 251                        if (ret) {
 252                                pr_err("alt: hash: init failed on test %d "
 253                                       "for %s: ret=%d\n", j, algo, -ret);
 254                                goto out;
 255                        }
 256                        ret = do_one_async_hash_op(req, &tresult,
 257                                                   crypto_ahash_update(req));
 258                        if (ret) {
 259                                pr_err("alt: hash: update failed on test %d "
 260                                       "for %s: ret=%d\n", j, algo, -ret);
 261                                goto out;
 262                        }
 263                        ret = do_one_async_hash_op(req, &tresult,
 264                                                   crypto_ahash_final(req));
 265                        if (ret) {
 266                                pr_err("alt: hash: final failed on test %d "
 267                                       "for %s: ret=%d\n", j, algo, -ret);
 268                                goto out;
 269                        }
 270                }
 271
 272                if (memcmp(result, template[i].digest,
 273                           crypto_ahash_digestsize(tfm))) {
 274                        printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
 275                               j, algo);
 276                        hexdump(result, crypto_ahash_digestsize(tfm));
 277                        ret = -EINVAL;
 278                        goto out;
 279                }
 280        }
 281
 282        j = 0;
 283        for (i = 0; i < tcount; i++) {
 284                if (template[i].np) {
 285                        j++;
 286                        memset(result, 0, 64);
 287
 288                        temp = 0;
 289                        sg_init_table(sg, template[i].np);
 290                        ret = -EINVAL;
 291                        for (k = 0; k < template[i].np; k++) {
 292                                if (WARN_ON(offset_in_page(IDX[k]) +
 293                                            template[i].tap[k] > PAGE_SIZE))
 294                                        goto out;
 295                                sg_set_buf(&sg[k],
 296                                           memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
 297                                                  offset_in_page(IDX[k]),
 298                                                  template[i].plaintext + temp,
 299                                                  template[i].tap[k]),
 300                                           template[i].tap[k]);
 301                                temp += template[i].tap[k];
 302                        }
 303
 304                        if (template[i].ksize) {
 305                                crypto_ahash_clear_flags(tfm, ~0);
 306                                ret = crypto_ahash_setkey(tfm, template[i].key,
 307                                                          template[i].ksize);
 308
 309                                if (ret) {
 310                                        printk(KERN_ERR "alg: hash: setkey "
 311                                               "failed on chunking test %d "
 312                                               "for %s: ret=%d\n", j, algo,
 313                                               -ret);
 314                                        goto out;
 315                                }
 316                        }
 317
 318                        ahash_request_set_crypt(req, sg, result,
 319                                                template[i].psize);
 320                        ret = crypto_ahash_digest(req);
 321                        switch (ret) {
 322                        case 0:
 323                                break;
 324                        case -EINPROGRESS:
 325                        case -EBUSY:
 326                                ret = wait_for_completion_interruptible(
 327                                        &tresult.completion);
 328                                if (!ret && !(ret = tresult.err)) {
 329                                        INIT_COMPLETION(tresult.completion);
 330                                        break;
 331                                }
 332                                /* fall through */
 333                        default:
 334                                printk(KERN_ERR "alg: hash: digest failed "
 335                                       "on chunking test %d for %s: "
 336                                       "ret=%d\n", j, algo, -ret);
 337                                goto out;
 338                        }
 339
 340                        if (memcmp(result, template[i].digest,
 341                                   crypto_ahash_digestsize(tfm))) {
 342                                printk(KERN_ERR "alg: hash: Chunking test %d "
 343                                       "failed for %s\n", j, algo);
 344                                hexdump(result, crypto_ahash_digestsize(tfm));
 345                                ret = -EINVAL;
 346                                goto out;
 347                        }
 348                }
 349        }
 350
 351        ret = 0;
 352
 353out:
 354        ahash_request_free(req);
 355out_noreq:
 356        testmgr_free_buf(xbuf);
 357out_nobuf:
 358        return ret;
 359}
 360
 361static int test_aead(struct crypto_aead *tfm, int enc,
 362                     struct aead_testvec *template, unsigned int tcount)
 363{
 364        const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
 365        unsigned int i, j, k, n, temp;
 366        int ret = -ENOMEM;
 367        char *q;
 368        char *key;
 369        struct aead_request *req;
 370        struct scatterlist sg[8];
 371        struct scatterlist asg[8];
 372        const char *e;
 373        struct tcrypt_result result;
 374        unsigned int authsize;
 375        void *input;
 376        void *assoc;
 377        char iv[MAX_IVLEN];
 378        char *xbuf[XBUFSIZE];
 379        char *axbuf[XBUFSIZE];
 380
 381        if (testmgr_alloc_buf(xbuf))
 382                goto out_noxbuf;
 383        if (testmgr_alloc_buf(axbuf))
 384                goto out_noaxbuf;
 385
 386        if (enc == ENCRYPT)
 387                e = "encryption";
 388        else
 389                e = "decryption";
 390
 391        init_completion(&result.completion);
 392
 393        req = aead_request_alloc(tfm, GFP_KERNEL);
 394        if (!req) {
 395                printk(KERN_ERR "alg: aead: Failed to allocate request for "
 396                       "%s\n", algo);
 397                goto out;
 398        }
 399
 400        aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
 401                                  tcrypt_complete, &result);
 402
 403        for (i = 0, j = 0; i < tcount; i++) {
 404                if (!template[i].np) {
 405                        j++;
 406
 407                        /* some tepmplates have no input data but they will
 408                         * touch input
 409                         */
 410                        input = xbuf[0];
 411                        assoc = axbuf[0];
 412
 413                        ret = -EINVAL;
 414                        if (WARN_ON(template[i].ilen > PAGE_SIZE ||
 415                                    template[i].alen > PAGE_SIZE))
 416                                goto out;
 417
 418                        memcpy(input, template[i].input, template[i].ilen);
 419                        memcpy(assoc, template[i].assoc, template[i].alen);
 420                        if (template[i].iv)
 421                                memcpy(iv, template[i].iv, MAX_IVLEN);
 422                        else
 423                                memset(iv, 0, MAX_IVLEN);
 424
 425                        crypto_aead_clear_flags(tfm, ~0);
 426                        if (template[i].wk)
 427                                crypto_aead_set_flags(
 428                                        tfm, CRYPTO_TFM_REQ_WEAK_KEY);
 429
 430                        key = template[i].key;
 431
 432                        ret = crypto_aead_setkey(tfm, key,
 433                                                 template[i].klen);
 434                        if (!ret == template[i].fail) {
 435                                printk(KERN_ERR "alg: aead: setkey failed on "
 436                                       "test %d for %s: flags=%x\n", j, algo,
 437                                       crypto_aead_get_flags(tfm));
 438                                goto out;
 439                        } else if (ret)
 440                                continue;
 441
 442                        authsize = abs(template[i].rlen - template[i].ilen);
 443                        ret = crypto_aead_setauthsize(tfm, authsize);
 444                        if (ret) {
 445                                printk(KERN_ERR "alg: aead: Failed to set "
 446                                       "authsize to %u on test %d for %s\n",
 447                                       authsize, j, algo);
 448                                goto out;
 449                        }
 450
 451                        sg_init_one(&sg[0], input,
 452                                    template[i].ilen + (enc ? authsize : 0));
 453
 454                        sg_init_one(&asg[0], assoc, template[i].alen);
 455
 456                        aead_request_set_crypt(req, sg, sg,
 457                                               template[i].ilen, iv);
 458
 459                        aead_request_set_assoc(req, asg, template[i].alen);
 460
 461                        ret = enc ?
 462                                crypto_aead_encrypt(req) :
 463                                crypto_aead_decrypt(req);
 464
 465                        switch (ret) {
 466                        case 0:
 467                                if (template[i].novrfy) {
 468                                        /* verification was supposed to fail */
 469                                        printk(KERN_ERR "alg: aead: %s failed "
 470                                               "on test %d for %s: ret was 0, "
 471                                               "expected -EBADMSG\n",
 472                                               e, j, algo);
 473                                        /* so really, we got a bad message */
 474                                        ret = -EBADMSG;
 475                                        goto out;
 476                                }
 477                                break;
 478                        case -EINPROGRESS:
 479                        case -EBUSY:
 480                                ret = wait_for_completion_interruptible(
 481                                        &result.completion);
 482                                if (!ret && !(ret = result.err)) {
 483                                        INIT_COMPLETION(result.completion);
 484                                        break;
 485                                }
 486                        case -EBADMSG:
 487                                if (template[i].novrfy)
 488                                        /* verification failure was expected */
 489                                        continue;
 490                                /* fall through */
 491                        default:
 492                                printk(KERN_ERR "alg: aead: %s failed on test "
 493                                       "%d for %s: ret=%d\n", e, j, algo, -ret);
 494                                goto out;
 495                        }
 496
 497                        q = input;
 498                        if (memcmp(q, template[i].result, template[i].rlen)) {
 499                                printk(KERN_ERR "alg: aead: Test %d failed on "
 500                                       "%s for %s\n", j, e, algo);
 501                                hexdump(q, template[i].rlen);
 502                                ret = -EINVAL;
 503                                goto out;
 504                        }
 505                }
 506        }
 507
 508        for (i = 0, j = 0; i < tcount; i++) {
 509                if (template[i].np) {
 510                        j++;
 511
 512                        if (template[i].iv)
 513                                memcpy(iv, template[i].iv, MAX_IVLEN);
 514                        else
 515                                memset(iv, 0, MAX_IVLEN);
 516
 517                        crypto_aead_clear_flags(tfm, ~0);
 518                        if (template[i].wk)
 519                                crypto_aead_set_flags(
 520                                        tfm, CRYPTO_TFM_REQ_WEAK_KEY);
 521                        key = template[i].key;
 522
 523                        ret = crypto_aead_setkey(tfm, key, template[i].klen);
 524                        if (!ret == template[i].fail) {
 525                                printk(KERN_ERR "alg: aead: setkey failed on "
 526                                       "chunk test %d for %s: flags=%x\n", j,
 527                                       algo, crypto_aead_get_flags(tfm));
 528                                goto out;
 529                        } else if (ret)
 530                                continue;
 531
 532                        authsize = abs(template[i].rlen - template[i].ilen);
 533
 534                        ret = -EINVAL;
 535                        sg_init_table(sg, template[i].np);
 536                        for (k = 0, temp = 0; k < template[i].np; k++) {
 537                                if (WARN_ON(offset_in_page(IDX[k]) +
 538                                            template[i].tap[k] > PAGE_SIZE))
 539                                        goto out;
 540
 541                                q = xbuf[IDX[k] >> PAGE_SHIFT] +
 542                                    offset_in_page(IDX[k]);
 543
 544                                memcpy(q, template[i].input + temp,
 545                                       template[i].tap[k]);
 546
 547                                n = template[i].tap[k];
 548                                if (k == template[i].np - 1 && enc)
 549                                        n += authsize;
 550                                if (offset_in_page(q) + n < PAGE_SIZE)
 551                                        q[n] = 0;
 552
 553                                sg_set_buf(&sg[k], q, template[i].tap[k]);
 554                                temp += template[i].tap[k];
 555                        }
 556
 557                        ret = crypto_aead_setauthsize(tfm, authsize);
 558                        if (ret) {
 559                                printk(KERN_ERR "alg: aead: Failed to set "
 560                                       "authsize to %u on chunk test %d for "
 561                                       "%s\n", authsize, j, algo);
 562                                goto out;
 563                        }
 564
 565                        if (enc) {
 566                                if (WARN_ON(sg[k - 1].offset +
 567                                            sg[k - 1].length + authsize >
 568                                            PAGE_SIZE)) {
 569                                        ret = -EINVAL;
 570                                        goto out;
 571                                }
 572
 573                                sg[k - 1].length += authsize;
 574                        }
 575
 576                        sg_init_table(asg, template[i].anp);
 577                        ret = -EINVAL;
 578                        for (k = 0, temp = 0; k < template[i].anp; k++) {
 579                                if (WARN_ON(offset_in_page(IDX[k]) +
 580                                            template[i].atap[k] > PAGE_SIZE))
 581                                        goto out;
 582                                sg_set_buf(&asg[k],
 583                                           memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
 584                                                  offset_in_page(IDX[k]),
 585                                                  template[i].assoc + temp,
 586                                                  template[i].atap[k]),
 587                                           template[i].atap[k]);
 588                                temp += template[i].atap[k];
 589                        }
 590
 591                        aead_request_set_crypt(req, sg, sg,
 592                                               template[i].ilen,
 593                                               iv);
 594
 595                        aead_request_set_assoc(req, asg, template[i].alen);
 596
 597                        ret = enc ?
 598                                crypto_aead_encrypt(req) :
 599                                crypto_aead_decrypt(req);
 600
 601                        switch (ret) {
 602                        case 0:
 603                                if (template[i].novrfy) {
 604                                        /* verification was supposed to fail */
 605                                        printk(KERN_ERR "alg: aead: %s failed "
 606                                               "on chunk test %d for %s: ret "
 607                                               "was 0, expected -EBADMSG\n",
 608                                               e, j, algo);
 609                                        /* so really, we got a bad message */
 610                                        ret = -EBADMSG;
 611                                        goto out;
 612                                }
 613                                break;
 614                        case -EINPROGRESS:
 615                        case -EBUSY:
 616                                ret = wait_for_completion_interruptible(
 617                                        &result.completion);
 618                                if (!ret && !(ret = result.err)) {
 619                                        INIT_COMPLETION(result.completion);
 620                                        break;
 621                                }
 622                        case -EBADMSG:
 623                                if (template[i].novrfy)
 624                                        /* verification failure was expected */
 625                                        continue;
 626                                /* fall through */
 627                        default:
 628                                printk(KERN_ERR "alg: aead: %s failed on "
 629                                       "chunk test %d for %s: ret=%d\n", e, j,
 630                                       algo, -ret);
 631                                goto out;
 632                        }
 633
 634                        ret = -EINVAL;
 635                        for (k = 0, temp = 0; k < template[i].np; k++) {
 636                                q = xbuf[IDX[k] >> PAGE_SHIFT] +
 637                                    offset_in_page(IDX[k]);
 638
 639                                n = template[i].tap[k];
 640                                if (k == template[i].np - 1)
 641                                        n += enc ? authsize : -authsize;
 642
 643                                if (memcmp(q, template[i].result + temp, n)) {
 644                                        printk(KERN_ERR "alg: aead: Chunk "
 645                                               "test %d failed on %s at page "
 646                                               "%u for %s\n", j, e, k, algo);
 647                                        hexdump(q, n);
 648                                        goto out;
 649                                }
 650
 651                                q += n;
 652                                if (k == template[i].np - 1 && !enc) {
 653                                        if (memcmp(q, template[i].input +
 654                                                      temp + n, authsize))
 655                                                n = authsize;
 656                                        else
 657                                                n = 0;
 658                                } else {
 659                                        for (n = 0; offset_in_page(q + n) &&
 660                                                    q[n]; n++)
 661                                                ;
 662                                }
 663                                if (n) {
 664                                        printk(KERN_ERR "alg: aead: Result "
 665                                               "buffer corruption in chunk "
 666                                               "test %d on %s at page %u for "
 667                                               "%s: %u bytes:\n", j, e, k,
 668                                               algo, n);
 669                                        hexdump(q, n);
 670                                        goto out;
 671                                }
 672
 673                                temp += template[i].tap[k];
 674                        }
 675                }
 676        }
 677
 678        ret = 0;
 679
 680out:
 681        aead_request_free(req);
 682        testmgr_free_buf(axbuf);
 683out_noaxbuf:
 684        testmgr_free_buf(xbuf);
 685out_noxbuf:
 686        return ret;
 687}
 688
 689static int test_cipher(struct crypto_cipher *tfm, int enc,
 690                       struct cipher_testvec *template, unsigned int tcount)
 691{
 692        const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm));
 693        unsigned int i, j, k;
 694        char *q;
 695        const char *e;
 696        void *data;
 697        char *xbuf[XBUFSIZE];
 698        int ret = -ENOMEM;
 699
 700        if (testmgr_alloc_buf(xbuf))
 701                goto out_nobuf;
 702
 703        if (enc == ENCRYPT)
 704                e = "encryption";
 705        else
 706                e = "decryption";
 707
 708        j = 0;
 709        for (i = 0; i < tcount; i++) {
 710                if (template[i].np)
 711                        continue;
 712
 713                j++;
 714
 715                ret = -EINVAL;
 716                if (WARN_ON(template[i].ilen > PAGE_SIZE))
 717                        goto out;
 718
 719                data = xbuf[0];
 720                memcpy(data, template[i].input, template[i].ilen);
 721
 722                crypto_cipher_clear_flags(tfm, ~0);
 723                if (template[i].wk)
 724                        crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
 725
 726                ret = crypto_cipher_setkey(tfm, template[i].key,
 727                                           template[i].klen);
 728                if (!ret == template[i].fail) {
 729                        printk(KERN_ERR "alg: cipher: setkey failed "
 730                               "on test %d for %s: flags=%x\n", j,
 731                               algo, crypto_cipher_get_flags(tfm));
 732                        goto out;
 733                } else if (ret)
 734                        continue;
 735
 736                for (k = 0; k < template[i].ilen;
 737                     k += crypto_cipher_blocksize(tfm)) {
 738                        if (enc)
 739                                crypto_cipher_encrypt_one(tfm, data + k,
 740                                                          data + k);
 741                        else
 742                                crypto_cipher_decrypt_one(tfm, data + k,
 743                                                          data + k);
 744                }
 745
 746                q = data;
 747                if (memcmp(q, template[i].result, template[i].rlen)) {
 748                        printk(KERN_ERR "alg: cipher: Test %d failed "
 749                               "on %s for %s\n", j, e, algo);
 750                        hexdump(q, template[i].rlen);
 751                        ret = -EINVAL;
 752                        goto out;
 753                }
 754        }
 755
 756        ret = 0;
 757
 758out:
 759        testmgr_free_buf(xbuf);
 760out_nobuf:
 761        return ret;
 762}
 763
 764static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
 765                         struct cipher_testvec *template, unsigned int tcount)
 766{
 767        const char *algo =
 768                crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm));
 769        unsigned int i, j, k, n, temp;
 770        char *q;
 771        struct ablkcipher_request *req;
 772        struct scatterlist sg[8];
 773        const char *e;
 774        struct tcrypt_result result;
 775        void *data;
 776        char iv[MAX_IVLEN];
 777        char *xbuf[XBUFSIZE];
 778        int ret = -ENOMEM;
 779
 780        if (testmgr_alloc_buf(xbuf))
 781                goto out_nobuf;
 782
 783        if (enc == ENCRYPT)
 784                e = "encryption";
 785        else
 786                e = "decryption";
 787
 788        init_completion(&result.completion);
 789
 790        req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
 791        if (!req) {
 792                printk(KERN_ERR "alg: skcipher: Failed to allocate request "
 793                       "for %s\n", algo);
 794                goto out;
 795        }
 796
 797        ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
 798                                        tcrypt_complete, &result);
 799
 800        j = 0;
 801        for (i = 0; i < tcount; i++) {
 802                if (template[i].iv)
 803                        memcpy(iv, template[i].iv, MAX_IVLEN);
 804                else
 805                        memset(iv, 0, MAX_IVLEN);
 806
 807                if (!(template[i].np)) {
 808                        j++;
 809
 810                        ret = -EINVAL;
 811                        if (WARN_ON(template[i].ilen > PAGE_SIZE))
 812                                goto out;
 813
 814                        data = xbuf[0];
 815                        memcpy(data, template[i].input, template[i].ilen);
 816
 817                        crypto_ablkcipher_clear_flags(tfm, ~0);
 818                        if (template[i].wk)
 819                                crypto_ablkcipher_set_flags(
 820                                        tfm, CRYPTO_TFM_REQ_WEAK_KEY);
 821
 822                        ret = crypto_ablkcipher_setkey(tfm, template[i].key,
 823                                                       template[i].klen);
 824                        if (!ret == template[i].fail) {
 825                                printk(KERN_ERR "alg: skcipher: setkey failed "
 826                                       "on test %d for %s: flags=%x\n", j,
 827                                       algo, crypto_ablkcipher_get_flags(tfm));
 828                                goto out;
 829                        } else if (ret)
 830                                continue;
 831
 832                        sg_init_one(&sg[0], data, template[i].ilen);
 833
 834                        ablkcipher_request_set_crypt(req, sg, sg,
 835                                                     template[i].ilen, iv);
 836                        ret = enc ?
 837                                crypto_ablkcipher_encrypt(req) :
 838                                crypto_ablkcipher_decrypt(req);
 839
 840                        switch (ret) {
 841                        case 0:
 842                                break;
 843                        case -EINPROGRESS:
 844                        case -EBUSY:
 845                                ret = wait_for_completion_interruptible(
 846                                        &result.completion);
 847                                if (!ret && !((ret = result.err))) {
 848                                        INIT_COMPLETION(result.completion);
 849                                        break;
 850                                }
 851                                /* fall through */
 852                        default:
 853                                printk(KERN_ERR "alg: skcipher: %s failed on "
 854                                       "test %d for %s: ret=%d\n", e, j, algo,
 855                                       -ret);
 856                                goto out;
 857                        }
 858
 859                        q = data;
 860                        if (memcmp(q, template[i].result, template[i].rlen)) {
 861                                printk(KERN_ERR "alg: skcipher: Test %d "
 862                                       "failed on %s for %s\n", j, e, algo);
 863                                hexdump(q, template[i].rlen);
 864                                ret = -EINVAL;
 865                                goto out;
 866                        }
 867                }
 868        }
 869
 870        j = 0;
 871        for (i = 0; i < tcount; i++) {
 872
 873                if (template[i].iv)
 874                        memcpy(iv, template[i].iv, MAX_IVLEN);
 875                else
 876                        memset(iv, 0, MAX_IVLEN);
 877
 878                if (template[i].np) {
 879                        j++;
 880
 881                        crypto_ablkcipher_clear_flags(tfm, ~0);
 882                        if (template[i].wk)
 883                                crypto_ablkcipher_set_flags(
 884                                        tfm, CRYPTO_TFM_REQ_WEAK_KEY);
 885
 886                        ret = crypto_ablkcipher_setkey(tfm, template[i].key,
 887                                                       template[i].klen);
 888                        if (!ret == template[i].fail) {
 889                                printk(KERN_ERR "alg: skcipher: setkey failed "
 890                                       "on chunk test %d for %s: flags=%x\n",
 891                                       j, algo,
 892                                       crypto_ablkcipher_get_flags(tfm));
 893                                goto out;
 894                        } else if (ret)
 895                                continue;
 896
 897                        temp = 0;
 898                        ret = -EINVAL;
 899                        sg_init_table(sg, template[i].np);
 900                        for (k = 0; k < template[i].np; k++) {
 901                                if (WARN_ON(offset_in_page(IDX[k]) +
 902                                            template[i].tap[k] > PAGE_SIZE))
 903                                        goto out;
 904
 905                                q = xbuf[IDX[k] >> PAGE_SHIFT] +
 906                                    offset_in_page(IDX[k]);
 907
 908                                memcpy(q, template[i].input + temp,
 909                                       template[i].tap[k]);
 910
 911                                if (offset_in_page(q) + template[i].tap[k] <
 912                                    PAGE_SIZE)
 913                                        q[template[i].tap[k]] = 0;
 914
 915                                sg_set_buf(&sg[k], q, template[i].tap[k]);
 916
 917                                temp += template[i].tap[k];
 918                        }
 919
 920                        ablkcipher_request_set_crypt(req, sg, sg,
 921                                        template[i].ilen, iv);
 922
 923                        ret = enc ?
 924                                crypto_ablkcipher_encrypt(req) :
 925                                crypto_ablkcipher_decrypt(req);
 926
 927                        switch (ret) {
 928                        case 0:
 929                                break;
 930                        case -EINPROGRESS:
 931                        case -EBUSY:
 932                                ret = wait_for_completion_interruptible(
 933                                        &result.completion);
 934                                if (!ret && !((ret = result.err))) {
 935                                        INIT_COMPLETION(result.completion);
 936                                        break;
 937                                }
 938                                /* fall through */
 939                        default:
 940                                printk(KERN_ERR "alg: skcipher: %s failed on "
 941                                       "chunk test %d for %s: ret=%d\n", e, j,
 942                                       algo, -ret);
 943                                goto out;
 944                        }
 945
 946                        temp = 0;
 947                        ret = -EINVAL;
 948                        for (k = 0; k < template[i].np; k++) {
 949                                q = xbuf[IDX[k] >> PAGE_SHIFT] +
 950                                    offset_in_page(IDX[k]);
 951
 952                                if (memcmp(q, template[i].result + temp,
 953                                           template[i].tap[k])) {
 954                                        printk(KERN_ERR "alg: skcipher: Chunk "
 955                                               "test %d failed on %s at page "
 956                                               "%u for %s\n", j, e, k, algo);
 957                                        hexdump(q, template[i].tap[k]);
 958                                        goto out;
 959                                }
 960
 961                                q += template[i].tap[k];
 962                                for (n = 0; offset_in_page(q + n) && q[n]; n++)
 963                                        ;
 964                                if (n) {
 965                                        printk(KERN_ERR "alg: skcipher: "
 966                                               "Result buffer corruption in "
 967                                               "chunk test %d on %s at page "
 968                                               "%u for %s: %u bytes:\n", j, e,
 969                                               k, algo, n);
 970                                        hexdump(q, n);
 971                                        goto out;
 972                                }
 973                                temp += template[i].tap[k];
 974                        }
 975                }
 976        }
 977
 978        ret = 0;
 979
 980out:
 981        ablkcipher_request_free(req);
 982        testmgr_free_buf(xbuf);
 983out_nobuf:
 984        return ret;
 985}
 986
 987static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate,
 988                     struct comp_testvec *dtemplate, int ctcount, int dtcount)
 989{
 990        const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
 991        unsigned int i;
 992        char result[COMP_BUF_SIZE];
 993        int ret;
 994
 995        for (i = 0; i < ctcount; i++) {
 996                int ilen;
 997                unsigned int dlen = COMP_BUF_SIZE;
 998
 999                memset(result, 0, sizeof (result));
1000
1001                ilen = ctemplate[i].inlen;
1002                ret = crypto_comp_compress(tfm, ctemplate[i].input,
1003                                           ilen, result, &dlen);
1004                if (ret) {
1005                        printk(KERN_ERR "alg: comp: compression failed "
1006                               "on test %d for %s: ret=%d\n", i + 1, algo,
1007                               -ret);
1008                        goto out;
1009                }
1010
1011                if (dlen != ctemplate[i].outlen) {
1012                        printk(KERN_ERR "alg: comp: Compression test %d "
1013                               "failed for %s: output len = %d\n", i + 1, algo,
1014                               dlen);
1015                        ret = -EINVAL;
1016                        goto out;
1017                }
1018
1019                if (memcmp(result, ctemplate[i].output, dlen)) {
1020                        printk(KERN_ERR "alg: comp: Compression test %d "
1021                               "failed for %s\n", i + 1, algo);
1022                        hexdump(result, dlen);
1023                        ret = -EINVAL;
1024                        goto out;
1025                }
1026        }
1027
1028        for (i = 0; i < dtcount; i++) {
1029                int ilen;
1030                unsigned int dlen = COMP_BUF_SIZE;
1031
1032                memset(result, 0, sizeof (result));
1033
1034                ilen = dtemplate[i].inlen;
1035                ret = crypto_comp_decompress(tfm, dtemplate[i].input,
1036                                             ilen, result, &dlen);
1037                if (ret) {
1038                        printk(KERN_ERR "alg: comp: decompression failed "
1039                               "on test %d for %s: ret=%d\n", i + 1, algo,
1040                               -ret);
1041                        goto out;
1042                }
1043
1044                if (dlen != dtemplate[i].outlen) {
1045                        printk(KERN_ERR "alg: comp: Decompression test %d "
1046                               "failed for %s: output len = %d\n", i + 1, algo,
1047                               dlen);
1048                        ret = -EINVAL;
1049                        goto out;
1050                }
1051
1052                if (memcmp(result, dtemplate[i].output, dlen)) {
1053                        printk(KERN_ERR "alg: comp: Decompression test %d "
1054                               "failed for %s\n", i + 1, algo);
1055                        hexdump(result, dlen);
1056                        ret = -EINVAL;
1057                        goto out;
1058                }
1059        }
1060
1061        ret = 0;
1062
1063out:
1064        return ret;
1065}
1066
1067static int test_pcomp(struct crypto_pcomp *tfm,
1068                      struct pcomp_testvec *ctemplate,
1069                      struct pcomp_testvec *dtemplate, int ctcount,
1070                      int dtcount)
1071{
1072        const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm));
1073        unsigned int i;
1074        char result[COMP_BUF_SIZE];
1075        int res;
1076
1077        for (i = 0; i < ctcount; i++) {
1078                struct comp_request req;
1079                unsigned int produced = 0;
1080
1081                res = crypto_compress_setup(tfm, ctemplate[i].params,
1082                                            ctemplate[i].paramsize);
1083                if (res) {
1084                        pr_err("alg: pcomp: compression setup failed on test "
1085                               "%d for %s: error=%d\n", i + 1, algo, res);
1086                        return res;
1087                }
1088
1089                res = crypto_compress_init(tfm);
1090                if (res) {
1091                        pr_err("alg: pcomp: compression init failed on test "
1092                               "%d for %s: error=%d\n", i + 1, algo, res);
1093                        return res;
1094                }
1095
1096                memset(result, 0, sizeof(result));
1097
1098                req.next_in = ctemplate[i].input;
1099                req.avail_in = ctemplate[i].inlen / 2;
1100                req.next_out = result;
1101                req.avail_out = ctemplate[i].outlen / 2;
1102
1103                res = crypto_compress_update(tfm, &req);
1104                if (res < 0 && (res != -EAGAIN || req.avail_in)) {
1105                        pr_err("alg: pcomp: compression update failed on test "
1106                               "%d for %s: error=%d\n", i + 1, algo, res);
1107                        return res;
1108                }
1109                if (res > 0)
1110                        produced += res;
1111
1112                /* Add remaining input data */
1113                req.avail_in += (ctemplate[i].inlen + 1) / 2;
1114
1115                res = crypto_compress_update(tfm, &req);
1116                if (res < 0 && (res != -EAGAIN || req.avail_in)) {
1117                        pr_err("alg: pcomp: compression update failed on test "
1118                               "%d for %s: error=%d\n", i + 1, algo, res);
1119                        return res;
1120                }
1121                if (res > 0)
1122                        produced += res;
1123
1124                /* Provide remaining output space */
1125                req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2;
1126
1127                res = crypto_compress_final(tfm, &req);
1128                if (res < 0) {
1129                        pr_err("alg: pcomp: compression final failed on test "
1130                               "%d for %s: error=%d\n", i + 1, algo, res);
1131                        return res;
1132                }
1133                produced += res;
1134
1135                if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) {
1136                        pr_err("alg: comp: Compression test %d failed for %s: "
1137                               "output len = %d (expected %d)\n", i + 1, algo,
1138                               COMP_BUF_SIZE - req.avail_out,
1139                               ctemplate[i].outlen);
1140                        return -EINVAL;
1141                }
1142
1143                if (produced != ctemplate[i].outlen) {
1144                        pr_err("alg: comp: Compression test %d failed for %s: "
1145                               "returned len = %u (expected %d)\n", i + 1,
1146                               algo, produced, ctemplate[i].outlen);
1147                        return -EINVAL;
1148                }
1149
1150                if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) {
1151                        pr_err("alg: pcomp: Compression test %d failed for "
1152                               "%s\n", i + 1, algo);
1153                        hexdump(result, ctemplate[i].outlen);
1154                        return -EINVAL;
1155                }
1156        }
1157
1158        for (i = 0; i < dtcount; i++) {
1159                struct comp_request req;
1160                unsigned int produced = 0;
1161
1162                res = crypto_decompress_setup(tfm, dtemplate[i].params,
1163                                              dtemplate[i].paramsize);
1164                if (res) {
1165                        pr_err("alg: pcomp: decompression setup failed on "
1166                               "test %d for %s: error=%d\n", i + 1, algo, res);
1167                        return res;
1168                }
1169
1170                res = crypto_decompress_init(tfm);
1171                if (res) {
1172                        pr_err("alg: pcomp: decompression init failed on test "
1173                               "%d for %s: error=%d\n", i + 1, algo, res);
1174                        return res;
1175                }
1176
1177                memset(result, 0, sizeof(result));
1178
1179                req.next_in = dtemplate[i].input;
1180                req.avail_in = dtemplate[i].inlen / 2;
1181                req.next_out = result;
1182                req.avail_out = dtemplate[i].outlen / 2;
1183
1184                res = crypto_decompress_update(tfm, &req);
1185                if (res < 0 && (res != -EAGAIN || req.avail_in)) {
1186                        pr_err("alg: pcomp: decompression update failed on "
1187                               "test %d for %s: error=%d\n", i + 1, algo, res);
1188                        return res;
1189                }
1190                if (res > 0)
1191                        produced += res;
1192
1193                /* Add remaining input data */
1194                req.avail_in += (dtemplate[i].inlen + 1) / 2;
1195
1196                res = crypto_decompress_update(tfm, &req);
1197                if (res < 0 && (res != -EAGAIN || req.avail_in)) {
1198                        pr_err("alg: pcomp: decompression update failed on "
1199                               "test %d for %s: error=%d\n", i + 1, algo, res);
1200                        return res;
1201                }
1202                if (res > 0)
1203                        produced += res;
1204
1205                /* Provide remaining output space */
1206                req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2;
1207
1208                res = crypto_decompress_final(tfm, &req);
1209                if (res < 0 && (res != -EAGAIN || req.avail_in)) {
1210                        pr_err("alg: pcomp: decompression final failed on "
1211                               "test %d for %s: error=%d\n", i + 1, algo, res);
1212                        return res;
1213                }
1214                if (res > 0)
1215                        produced += res;
1216
1217                if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) {
1218                        pr_err("alg: comp: Decompression test %d failed for "
1219                               "%s: output len = %d (expected %d)\n", i + 1,
1220                               algo, COMP_BUF_SIZE - req.avail_out,
1221                               dtemplate[i].outlen);
1222                        return -EINVAL;
1223                }
1224
1225                if (produced != dtemplate[i].outlen) {
1226                        pr_err("alg: comp: Decompression test %d failed for "
1227                               "%s: returned len = %u (expected %d)\n", i + 1,
1228                               algo, produced, dtemplate[i].outlen);
1229                        return -EINVAL;
1230                }
1231
1232                if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) {
1233                        pr_err("alg: pcomp: Decompression test %d failed for "
1234                               "%s\n", i + 1, algo);
1235                        hexdump(result, dtemplate[i].outlen);
1236                        return -EINVAL;
1237                }
1238        }
1239
1240        return 0;
1241}
1242
1243
1244static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template,
1245                      unsigned int tcount)
1246{
1247        const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
1248        int err = 0, i, j, seedsize;
1249        u8 *seed;
1250        char result[32];
1251
1252        seedsize = crypto_rng_seedsize(tfm);
1253
1254        seed = kmalloc(seedsize, GFP_KERNEL);
1255        if (!seed) {
1256                printk(KERN_ERR "alg: cprng: Failed to allocate seed space "
1257                       "for %s\n", algo);
1258                return -ENOMEM;
1259        }
1260
1261        for (i = 0; i < tcount; i++) {
1262                memset(result, 0, 32);
1263
1264                memcpy(seed, template[i].v, template[i].vlen);
1265                memcpy(seed + template[i].vlen, template[i].key,
1266                       template[i].klen);
1267                memcpy(seed + template[i].vlen + template[i].klen,
1268                       template[i].dt, template[i].dtlen);
1269
1270                err = crypto_rng_reset(tfm, seed, seedsize);
1271                if (err) {
1272                        printk(KERN_ERR "alg: cprng: Failed to reset rng "
1273                               "for %s\n", algo);
1274                        goto out;
1275                }
1276
1277                for (j = 0; j < template[i].loops; j++) {
1278                        err = crypto_rng_get_bytes(tfm, result,
1279                                                   template[i].rlen);
1280                        if (err != template[i].rlen) {
1281                                printk(KERN_ERR "alg: cprng: Failed to obtain "
1282                                       "the correct amount of random data for "
1283                                       "%s (requested %d, got %d)\n", algo,
1284                                       template[i].rlen, err);
1285                                goto out;
1286                        }
1287                }
1288
1289                err = memcmp(result, template[i].result,
1290                             template[i].rlen);
1291                if (err) {
1292                        printk(KERN_ERR "alg: cprng: Test %d failed for %s\n",
1293                               i, algo);
1294                        hexdump(result, template[i].rlen);
1295                        err = -EINVAL;
1296                        goto out;
1297                }
1298        }
1299
1300out:
1301        kfree(seed);
1302        return err;
1303}
1304
1305static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
1306                         u32 type, u32 mask)
1307{
1308        struct crypto_aead *tfm;
1309        int err = 0;
1310
1311        tfm = crypto_alloc_aead(driver, type, mask);
1312        if (IS_ERR(tfm)) {
1313                printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
1314                       "%ld\n", driver, PTR_ERR(tfm));
1315                return PTR_ERR(tfm);
1316        }
1317
1318        if (desc->suite.aead.enc.vecs) {
1319                err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
1320                                desc->suite.aead.enc.count);
1321                if (err)
1322                        goto out;
1323        }
1324
1325        if (!err && desc->suite.aead.dec.vecs)
1326                err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
1327                                desc->suite.aead.dec.count);
1328
1329out:
1330        crypto_free_aead(tfm);
1331        return err;
1332}
1333
1334static int alg_test_cipher(const struct alg_test_desc *desc,
1335                           const char *driver, u32 type, u32 mask)
1336{
1337        struct crypto_cipher *tfm;
1338        int err = 0;
1339
1340        tfm = crypto_alloc_cipher(driver, type, mask);
1341        if (IS_ERR(tfm)) {
1342                printk(KERN_ERR "alg: cipher: Failed to load transform for "
1343                       "%s: %ld\n", driver, PTR_ERR(tfm));
1344                return PTR_ERR(tfm);
1345        }
1346
1347        if (desc->suite.cipher.enc.vecs) {
1348                err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1349                                  desc->suite.cipher.enc.count);
1350                if (err)
1351                        goto out;
1352        }
1353
1354        if (desc->suite.cipher.dec.vecs)
1355                err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1356                                  desc->suite.cipher.dec.count);
1357
1358out:
1359        crypto_free_cipher(tfm);
1360        return err;
1361}
1362
1363static int alg_test_skcipher(const struct alg_test_desc *desc,
1364                             const char *driver, u32 type, u32 mask)
1365{
1366        struct crypto_ablkcipher *tfm;
1367        int err = 0;
1368
1369        tfm = crypto_alloc_ablkcipher(driver, type, mask);
1370        if (IS_ERR(tfm)) {
1371                printk(KERN_ERR "alg: skcipher: Failed to load transform for "
1372                       "%s: %ld\n", driver, PTR_ERR(tfm));
1373                return PTR_ERR(tfm);
1374        }
1375
1376        if (desc->suite.cipher.enc.vecs) {
1377                err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1378                                    desc->suite.cipher.enc.count);
1379                if (err)
1380                        goto out;
1381        }
1382
1383        if (desc->suite.cipher.dec.vecs)
1384                err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1385                                    desc->suite.cipher.dec.count);
1386
1387out:
1388        crypto_free_ablkcipher(tfm);
1389        return err;
1390}
1391
1392static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
1393                         u32 type, u32 mask)
1394{
1395        struct crypto_comp *tfm;
1396        int err;
1397
1398        tfm = crypto_alloc_comp(driver, type, mask);
1399        if (IS_ERR(tfm)) {
1400                printk(KERN_ERR "alg: comp: Failed to load transform for %s: "
1401                       "%ld\n", driver, PTR_ERR(tfm));
1402                return PTR_ERR(tfm);
1403        }
1404
1405        err = test_comp(tfm, desc->suite.comp.comp.vecs,
1406                        desc->suite.comp.decomp.vecs,
1407                        desc->suite.comp.comp.count,
1408                        desc->suite.comp.decomp.count);
1409
1410        crypto_free_comp(tfm);
1411        return err;
1412}
1413
1414static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver,
1415                          u32 type, u32 mask)
1416{
1417        struct crypto_pcomp *tfm;
1418        int err;
1419
1420        tfm = crypto_alloc_pcomp(driver, type, mask);
1421        if (IS_ERR(tfm)) {
1422                pr_err("alg: pcomp: Failed to load transform for %s: %ld\n",
1423                       driver, PTR_ERR(tfm));
1424                return PTR_ERR(tfm);
1425        }
1426
1427        err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs,
1428                         desc->suite.pcomp.decomp.vecs,
1429                         desc->suite.pcomp.comp.count,
1430                         desc->suite.pcomp.decomp.count);
1431
1432        crypto_free_pcomp(tfm);
1433        return err;
1434}
1435
1436static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
1437                         u32 type, u32 mask)
1438{
1439        struct crypto_ahash *tfm;
1440        int err;
1441
1442        tfm = crypto_alloc_ahash(driver, type, mask);
1443        if (IS_ERR(tfm)) {
1444                printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
1445                       "%ld\n", driver, PTR_ERR(tfm));
1446                return PTR_ERR(tfm);
1447        }
1448
1449        err = test_hash(tfm, desc->suite.hash.vecs,
1450                        desc->suite.hash.count, true);
1451        if (!err)
1452                err = test_hash(tfm, desc->suite.hash.vecs,
1453                                desc->suite.hash.count, false);
1454
1455        crypto_free_ahash(tfm);
1456        return err;
1457}
1458
1459static int alg_test_crc32c(const struct alg_test_desc *desc,
1460                           const char *driver, u32 type, u32 mask)
1461{
1462        struct crypto_shash *tfm;
1463        u32 val;
1464        int err;
1465
1466        err = alg_test_hash(desc, driver, type, mask);
1467        if (err)
1468                goto out;
1469
1470        tfm = crypto_alloc_shash(driver, type, mask);
1471        if (IS_ERR(tfm)) {
1472                printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
1473                       "%ld\n", driver, PTR_ERR(tfm));
1474                err = PTR_ERR(tfm);
1475                goto out;
1476        }
1477
1478        do {
1479                struct {
1480                        struct shash_desc shash;
1481                        char ctx[crypto_shash_descsize(tfm)];
1482                } sdesc;
1483
1484                sdesc.shash.tfm = tfm;
1485                sdesc.shash.flags = 0;
1486
1487                *(u32 *)sdesc.ctx = le32_to_cpu(420553207);
1488                err = crypto_shash_final(&sdesc.shash, (u8 *)&val);
1489                if (err) {
1490                        printk(KERN_ERR "alg: crc32c: Operation failed for "
1491                               "%s: %d\n", driver, err);
1492                        break;
1493                }
1494
1495                if (val != ~420553207) {
1496                        printk(KERN_ERR "alg: crc32c: Test failed for %s: "
1497                               "%d\n", driver, val);
1498                        err = -EINVAL;
1499                }
1500        } while (0);
1501
1502        crypto_free_shash(tfm);
1503
1504out:
1505        return err;
1506}
1507
1508static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
1509                          u32 type, u32 mask)
1510{
1511        struct crypto_rng *rng;
1512        int err;
1513
1514        rng = crypto_alloc_rng(driver, type, mask);
1515        if (IS_ERR(rng)) {
1516                printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
1517                       "%ld\n", driver, PTR_ERR(rng));
1518                return PTR_ERR(rng);
1519        }
1520
1521        err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count);
1522
1523        crypto_free_rng(rng);
1524
1525        return err;
1526}
1527
1528static int alg_test_null(const struct alg_test_desc *desc,
1529                             const char *driver, u32 type, u32 mask)
1530{
1531        return 0;
1532}
1533
1534/* Please keep this list sorted by algorithm name. */
1535static const struct alg_test_desc alg_test_descs[] = {
1536        {
1537                .alg = "__driver-cbc-aes-aesni",
1538                .test = alg_test_null,
1539                .suite = {
1540                        .cipher = {
1541                                .enc = {
1542                                        .vecs = NULL,
1543                                        .count = 0
1544                                },
1545                                .dec = {
1546                                        .vecs = NULL,
1547                                        .count = 0
1548                                }
1549                        }
1550                }
1551        }, {
1552                .alg = "__driver-ecb-aes-aesni",
1553                .test = alg_test_null,
1554                .suite = {
1555                        .cipher = {
1556                                .enc = {
1557                                        .vecs = NULL,
1558                                        .count = 0
1559                                },
1560                                .dec = {
1561                                        .vecs = NULL,
1562                                        .count = 0
1563                                }
1564                        }
1565                }
1566        }, {
1567                .alg = "__ghash-pclmulqdqni",
1568                .test = alg_test_null,
1569                .suite = {
1570                        .hash = {
1571                                .vecs = NULL,
1572                                .count = 0
1573                        }
1574                }
1575        }, {
1576                .alg = "ansi_cprng",
1577                .test = alg_test_cprng,
1578                .fips_allowed = 1,
1579                .suite = {
1580                        .cprng = {
1581                                .vecs = ansi_cprng_aes_tv_template,
1582                                .count = ANSI_CPRNG_AES_TEST_VECTORS
1583                        }
1584                }
1585        }, {
1586                .alg = "cbc(aes)",
1587                .test = alg_test_skcipher,
1588                .fips_allowed = 1,
1589                .suite = {
1590                        .cipher = {
1591                                .enc = {
1592                                        .vecs = aes_cbc_enc_tv_template,
1593                                        .count = AES_CBC_ENC_TEST_VECTORS
1594                                },
1595                                .dec = {
1596                                        .vecs = aes_cbc_dec_tv_template,
1597                                        .count = AES_CBC_DEC_TEST_VECTORS
1598                                }
1599                        }
1600                }
1601        }, {
1602                .alg = "cbc(anubis)",
1603                .test = alg_test_skcipher,
1604                .suite = {
1605                        .cipher = {
1606                                .enc = {
1607                                        .vecs = anubis_cbc_enc_tv_template,
1608                                        .count = ANUBIS_CBC_ENC_TEST_VECTORS
1609                                },
1610                                .dec = {
1611                                        .vecs = anubis_cbc_dec_tv_template,
1612                                        .count = ANUBIS_CBC_DEC_TEST_VECTORS
1613                                }
1614                        }
1615                }
1616        }, {
1617                .alg = "cbc(blowfish)",
1618                .test = alg_test_skcipher,
1619                .suite = {
1620                        .cipher = {
1621                                .enc = {
1622                                        .vecs = bf_cbc_enc_tv_template,
1623                                        .count = BF_CBC_ENC_TEST_VECTORS
1624                                },
1625                                .dec = {
1626                                        .vecs = bf_cbc_dec_tv_template,
1627                                        .count = BF_CBC_DEC_TEST_VECTORS
1628                                }
1629                        }
1630                }
1631        }, {
1632                .alg = "cbc(camellia)",
1633                .test = alg_test_skcipher,
1634                .suite = {
1635                        .cipher = {
1636                                .enc = {
1637                                        .vecs = camellia_cbc_enc_tv_template,
1638                                        .count = CAMELLIA_CBC_ENC_TEST_VECTORS
1639                                },
1640                                .dec = {
1641                                        .vecs = camellia_cbc_dec_tv_template,
1642                                        .count = CAMELLIA_CBC_DEC_TEST_VECTORS
1643                                }
1644                        }
1645                }
1646        }, {
1647                .alg = "cbc(des)",
1648                .test = alg_test_skcipher,
1649                .suite = {
1650                        .cipher = {
1651                                .enc = {
1652                                        .vecs = des_cbc_enc_tv_template,
1653                                        .count = DES_CBC_ENC_TEST_VECTORS
1654                                },
1655                                .dec = {
1656                                        .vecs = des_cbc_dec_tv_template,
1657                                        .count = DES_CBC_DEC_TEST_VECTORS
1658                                }
1659                        }
1660                }
1661        }, {
1662                .alg = "cbc(des3_ede)",
1663                .test = alg_test_skcipher,
1664                .fips_allowed = 1,
1665                .suite = {
1666                        .cipher = {
1667                                .enc = {
1668                                        .vecs = des3_ede_cbc_enc_tv_template,
1669                                        .count = DES3_EDE_CBC_ENC_TEST_VECTORS
1670                                },
1671                                .dec = {
1672                                        .vecs = des3_ede_cbc_dec_tv_template,
1673                                        .count = DES3_EDE_CBC_DEC_TEST_VECTORS
1674                                }
1675                        }
1676                }
1677        }, {
1678                .alg = "cbc(twofish)",
1679                .test = alg_test_skcipher,
1680                .suite = {
1681                        .cipher = {
1682                                .enc = {
1683                                        .vecs = tf_cbc_enc_tv_template,
1684                                        .count = TF_CBC_ENC_TEST_VECTORS
1685                                },
1686                                .dec = {
1687                                        .vecs = tf_cbc_dec_tv_template,
1688                                        .count = TF_CBC_DEC_TEST_VECTORS
1689                                }
1690                        }
1691                }
1692        }, {
1693                .alg = "ccm(aes)",
1694                .test = alg_test_aead,
1695                .fips_allowed = 1,
1696                .suite = {
1697                        .aead = {
1698                                .enc = {
1699                                        .vecs = aes_ccm_enc_tv_template,
1700                                        .count = AES_CCM_ENC_TEST_VECTORS
1701                                },
1702                                .dec = {
1703                                        .vecs = aes_ccm_dec_tv_template,
1704                                        .count = AES_CCM_DEC_TEST_VECTORS
1705                                }
1706                        }
1707                }
1708        }, {
1709                .alg = "crc32c",
1710                .test = alg_test_crc32c,
1711                .fips_allowed = 1,
1712                .suite = {
1713                        .hash = {
1714                                .vecs = crc32c_tv_template,
1715                                .count = CRC32C_TEST_VECTORS
1716                        }
1717                }
1718        }, {
1719                .alg = "cryptd(__driver-ecb-aes-aesni)",
1720                .test = alg_test_null,
1721                .suite = {
1722                        .cipher = {
1723                                .enc = {
1724                                        .vecs = NULL,
1725                                        .count = 0
1726                                },
1727                                .dec = {
1728                                        .vecs = NULL,
1729                                        .count = 0
1730                                }
1731                        }
1732                }
1733        }, {
1734                .alg = "cryptd(__ghash-pclmulqdqni)",
1735                .test = alg_test_null,
1736                .suite = {
1737                        .hash = {
1738                                .vecs = NULL,
1739                                .count = 0
1740                        }
1741                }
1742        }, {
1743                .alg = "ctr(aes)",
1744                .test = alg_test_skcipher,
1745                .fips_allowed = 1,
1746                .suite = {
1747                        .cipher = {
1748                                .enc = {
1749                                        .vecs = aes_ctr_enc_tv_template,
1750                                        .count = AES_CTR_ENC_TEST_VECTORS
1751                                },
1752                                .dec = {
1753                                        .vecs = aes_ctr_dec_tv_template,
1754                                        .count = AES_CTR_DEC_TEST_VECTORS
1755                                }
1756                        }
1757                }
1758        }, {
1759                .alg = "cts(cbc(aes))",
1760                .test = alg_test_skcipher,
1761                .suite = {
1762                        .cipher = {
1763                                .enc = {
1764                                        .vecs = cts_mode_enc_tv_template,
1765                                        .count = CTS_MODE_ENC_TEST_VECTORS
1766                                },
1767                                .dec = {
1768                                        .vecs = cts_mode_dec_tv_template,
1769                                        .count = CTS_MODE_DEC_TEST_VECTORS
1770                                }
1771                        }
1772                }
1773        }, {
1774                .alg = "deflate",
1775                .test = alg_test_comp,
1776                .suite = {
1777                        .comp = {
1778                                .comp = {
1779                                        .vecs = deflate_comp_tv_template,
1780                                        .count = DEFLATE_COMP_TEST_VECTORS
1781                                },
1782                                .decomp = {
1783                                        .vecs = deflate_decomp_tv_template,
1784                                        .count = DEFLATE_DECOMP_TEST_VECTORS
1785                                }
1786                        }
1787                }
1788        }, {
1789                .alg = "ecb(__aes-aesni)",
1790                .test = alg_test_null,
1791                .suite = {
1792                        .cipher = {
1793                                .enc = {
1794                                        .vecs = NULL,
1795                                        .count = 0
1796                                },
1797                                .dec = {
1798                                        .vecs = NULL,
1799                                        .count = 0
1800                                }
1801                        }
1802                }
1803        }, {
1804                .alg = "ecb(aes)",
1805                .test = alg_test_skcipher,
1806                .fips_allowed = 1,
1807                .suite = {
1808                        .cipher = {
1809                                .enc = {
1810                                        .vecs = aes_enc_tv_template,
1811                                        .count = AES_ENC_TEST_VECTORS
1812                                },
1813                                .dec = {
1814                                        .vecs = aes_dec_tv_template,
1815                                        .count = AES_DEC_TEST_VECTORS
1816                                }
1817                        }
1818                }
1819        }, {
1820                .alg = "ecb(anubis)",
1821                .test = alg_test_skcipher,
1822                .suite = {
1823                        .cipher = {
1824                                .enc = {
1825                                        .vecs = anubis_enc_tv_template,
1826                                        .count = ANUBIS_ENC_TEST_VECTORS
1827                                },
1828                                .dec = {
1829                                        .vecs = anubis_dec_tv_template,
1830                                        .count = ANUBIS_DEC_TEST_VECTORS
1831                                }
1832                        }
1833                }
1834        }, {
1835                .alg = "ecb(arc4)",
1836                .test = alg_test_skcipher,
1837                .suite = {
1838                        .cipher = {
1839                                .enc = {
1840                                        .vecs = arc4_enc_tv_template,
1841                                        .count = ARC4_ENC_TEST_VECTORS
1842                                },
1843                                .dec = {
1844                                        .vecs = arc4_dec_tv_template,
1845                                        .count = ARC4_DEC_TEST_VECTORS
1846                                }
1847                        }
1848                }
1849        }, {
1850                .alg = "ecb(blowfish)",
1851                .test = alg_test_skcipher,
1852                .suite = {
1853                        .cipher = {
1854                                .enc = {
1855                                        .vecs = bf_enc_tv_template,
1856                                        .count = BF_ENC_TEST_VECTORS
1857                                },
1858                                .dec = {
1859                                        .vecs = bf_dec_tv_template,
1860                                        .count = BF_DEC_TEST_VECTORS
1861                                }
1862                        }
1863                }
1864        }, {
1865                .alg = "ecb(camellia)",
1866                .test = alg_test_skcipher,
1867                .suite = {
1868                        .cipher = {
1869                                .enc = {
1870                                        .vecs = camellia_enc_tv_template,
1871                                        .count = CAMELLIA_ENC_TEST_VECTORS
1872                                },
1873                                .dec = {
1874                                        .vecs = camellia_dec_tv_template,
1875                                        .count = CAMELLIA_DEC_TEST_VECTORS
1876                                }
1877                        }
1878                }
1879        }, {
1880                .alg = "ecb(cast5)",
1881                .test = alg_test_skcipher,
1882                .suite = {
1883                        .cipher = {
1884                                .enc = {
1885                                        .vecs = cast5_enc_tv_template,
1886                                        .count = CAST5_ENC_TEST_VECTORS
1887                                },
1888                                .dec = {
1889                                        .vecs = cast5_dec_tv_template,
1890                                        .count = CAST5_DEC_TEST_VECTORS
1891                                }
1892                        }
1893                }
1894        }, {
1895                .alg = "ecb(cast6)",
1896                .test = alg_test_skcipher,
1897                .suite = {
1898                        .cipher = {
1899                                .enc = {
1900                                        .vecs = cast6_enc_tv_template,
1901                                        .count = CAST6_ENC_TEST_VECTORS
1902                                },
1903                                .dec = {
1904                                        .vecs = cast6_dec_tv_template,
1905                                        .count = CAST6_DEC_TEST_VECTORS
1906                                }
1907                        }
1908                }
1909        }, {
1910                .alg = "ecb(des)",
1911                .test = alg_test_skcipher,
1912                .fips_allowed = 1,
1913                .suite = {
1914                        .cipher = {
1915                                .enc = {
1916                                        .vecs = des_enc_tv_template,
1917                                        .count = DES_ENC_TEST_VECTORS
1918                                },
1919                                .dec = {
1920                                        .vecs = des_dec_tv_template,
1921                                        .count = DES_DEC_TEST_VECTORS
1922                                }
1923                        }
1924                }
1925        }, {
1926                .alg = "ecb(des3_ede)",
1927                .test = alg_test_skcipher,
1928                .fips_allowed = 1,
1929                .suite = {
1930                        .cipher = {
1931                                .enc = {
1932                                        .vecs = des3_ede_enc_tv_template,
1933                                        .count = DES3_EDE_ENC_TEST_VECTORS
1934                                },
1935                                .dec = {
1936                                        .vecs = des3_ede_dec_tv_template,
1937                                        .count = DES3_EDE_DEC_TEST_VECTORS
1938                                }
1939                        }
1940                }
1941        }, {
1942                .alg = "ecb(khazad)",
1943                .test = alg_test_skcipher,
1944                .suite = {
1945                        .cipher = {
1946                                .enc = {
1947                                        .vecs = khazad_enc_tv_template,
1948                                        .count = KHAZAD_ENC_TEST_VECTORS
1949                                },
1950                                .dec = {
1951                                        .vecs = khazad_dec_tv_template,
1952                                        .count = KHAZAD_DEC_TEST_VECTORS
1953                                }
1954                        }
1955                }
1956        }, {
1957                .alg = "ecb(seed)",
1958                .test = alg_test_skcipher,
1959                .suite = {
1960                        .cipher = {
1961                                .enc = {
1962                                        .vecs = seed_enc_tv_template,
1963                                        .count = SEED_ENC_TEST_VECTORS
1964                                },
1965                                .dec = {
1966                                        .vecs = seed_dec_tv_template,
1967                                        .count = SEED_DEC_TEST_VECTORS
1968                                }
1969                        }
1970                }
1971        }, {
1972                .alg = "ecb(serpent)",
1973                .test = alg_test_skcipher,
1974                .suite = {
1975                        .cipher = {
1976                                .enc = {
1977                                        .vecs = serpent_enc_tv_template,
1978                                        .count = SERPENT_ENC_TEST_VECTORS
1979                                },
1980                                .dec = {
1981                                        .vecs = serpent_dec_tv_template,
1982                                        .count = SERPENT_DEC_TEST_VECTORS
1983                                }
1984                        }
1985                }
1986        }, {
1987                .alg = "ecb(tea)",
1988                .test = alg_test_skcipher,
1989                .suite = {
1990                        .cipher = {
1991                                .enc = {
1992                                        .vecs = tea_enc_tv_template,
1993                                        .count = TEA_ENC_TEST_VECTORS
1994                                },
1995                                .dec = {
1996                                        .vecs = tea_dec_tv_template,
1997                                        .count = TEA_DEC_TEST_VECTORS
1998                                }
1999                        }
2000                }
2001        }, {
2002                .alg = "ecb(tnepres)",
2003                .test = alg_test_skcipher,
2004                .suite = {
2005                        .cipher = {
2006                                .enc = {
2007                                        .vecs = tnepres_enc_tv_template,
2008                                        .count = TNEPRES_ENC_TEST_VECTORS
2009                                },
2010                                .dec = {
2011                                        .vecs = tnepres_dec_tv_template,
2012                                        .count = TNEPRES_DEC_TEST_VECTORS
2013                                }
2014                        }
2015                }
2016        }, {
2017                .alg = "ecb(twofish)",
2018                .test = alg_test_skcipher,
2019                .suite = {
2020                        .cipher = {
2021                                .enc = {
2022                                        .vecs = tf_enc_tv_template,
2023                                        .count = TF_ENC_TEST_VECTORS
2024                                },
2025                                .dec = {
2026                                        .vecs = tf_dec_tv_template,
2027                                        .count = TF_DEC_TEST_VECTORS
2028                                }
2029                        }
2030                }
2031        }, {
2032                .alg = "ecb(xeta)",
2033                .test = alg_test_skcipher,
2034                .suite = {
2035                        .cipher = {
2036                                .enc = {
2037                                        .vecs = xeta_enc_tv_template,
2038                                        .count = XETA_ENC_TEST_VECTORS
2039                                },
2040                                .dec = {
2041                                        .vecs = xeta_dec_tv_template,
2042                                        .count = XETA_DEC_TEST_VECTORS
2043                                }
2044                        }
2045                }
2046        }, {
2047                .alg = "ecb(xtea)",
2048                .test = alg_test_skcipher,
2049                .suite = {
2050                        .cipher = {
2051                                .enc = {
2052                                        .vecs = xtea_enc_tv_template,
2053                                        .count = XTEA_ENC_TEST_VECTORS
2054                                },
2055                                .dec = {
2056                                        .vecs = xtea_dec_tv_template,
2057                                        .count = XTEA_DEC_TEST_VECTORS
2058                                }
2059                        }
2060                }
2061        }, {
2062                .alg = "gcm(aes)",
2063                .test = alg_test_aead,
2064                .fips_allowed = 1,
2065                .suite = {
2066                        .aead = {
2067                                .enc = {
2068                                        .vecs = aes_gcm_enc_tv_template,
2069                                        .count = AES_GCM_ENC_TEST_VECTORS
2070                                },
2071                                .dec = {
2072                                        .vecs = aes_gcm_dec_tv_template,
2073                                        .count = AES_GCM_DEC_TEST_VECTORS
2074                                }
2075                        }
2076                }
2077        }, {
2078                .alg = "ghash",
2079                .test = alg_test_hash,
2080                .suite = {
2081                        .hash = {
2082                                .vecs = ghash_tv_template,
2083                                .count = GHASH_TEST_VECTORS
2084                        }
2085                }
2086        }, {
2087                .alg = "hmac(md5)",
2088                .test = alg_test_hash,
2089                .suite = {
2090                        .hash = {
2091                                .vecs = hmac_md5_tv_template,
2092                                .count = HMAC_MD5_TEST_VECTORS
2093                        }
2094                }
2095        }, {
2096                .alg = "hmac(rmd128)",
2097                .test = alg_test_hash,
2098                .suite = {
2099                        .hash = {
2100                                .vecs = hmac_rmd128_tv_template,
2101                                .count = HMAC_RMD128_TEST_VECTORS
2102                        }
2103                }
2104        }, {
2105                .alg = "hmac(rmd160)",
2106                .test = alg_test_hash,
2107                .suite = {
2108                        .hash = {
2109                                .vecs = hmac_rmd160_tv_template,
2110                                .count = HMAC_RMD160_TEST_VECTORS
2111                        }
2112                }
2113        }, {
2114                .alg = "hmac(sha1)",
2115                .test = alg_test_hash,
2116                .fips_allowed = 1,
2117                .suite = {
2118                        .hash = {
2119                                .vecs = hmac_sha1_tv_template,
2120                                .count = HMAC_SHA1_TEST_VECTORS
2121                        }
2122                }
2123        }, {
2124                .alg = "hmac(sha224)",
2125                .test = alg_test_hash,
2126                .fips_allowed = 1,
2127                .suite = {
2128                        .hash = {
2129                                .vecs = hmac_sha224_tv_template,
2130                                .count = HMAC_SHA224_TEST_VECTORS
2131                        }
2132                }
2133        }, {
2134                .alg = "hmac(sha256)",
2135                .test = alg_test_hash,
2136                .fips_allowed = 1,
2137                .suite = {
2138                        .hash = {
2139                                .vecs = hmac_sha256_tv_template,
2140                                .count = HMAC_SHA256_TEST_VECTORS
2141                        }
2142                }
2143        }, {
2144                .alg = "hmac(sha384)",
2145                .test = alg_test_hash,
2146                .fips_allowed = 1,
2147                .suite = {
2148                        .hash = {
2149                                .vecs = hmac_sha384_tv_template,
2150                                .count = HMAC_SHA384_TEST_VECTORS
2151                        }
2152                }
2153        }, {
2154                .alg = "hmac(sha512)",
2155                .test = alg_test_hash,
2156                .fips_allowed = 1,
2157                .suite = {
2158                        .hash = {
2159                                .vecs = hmac_sha512_tv_template,
2160                                .count = HMAC_SHA512_TEST_VECTORS
2161                        }
2162                }
2163        }, {
2164                .alg = "lrw(aes)",
2165                .test = alg_test_skcipher,
2166                .suite = {
2167                        .cipher = {
2168                                .enc = {
2169                                        .vecs = aes_lrw_enc_tv_template,
2170                                        .count = AES_LRW_ENC_TEST_VECTORS
2171                                },
2172                                .dec = {
2173                                        .vecs = aes_lrw_dec_tv_template,
2174                                        .count = AES_LRW_DEC_TEST_VECTORS
2175                                }
2176                        }
2177                }
2178        }, {
2179                .alg = "lzo",
2180                .test = alg_test_comp,
2181                .suite = {
2182                        .comp = {
2183                                .comp = {
2184                                        .vecs = lzo_comp_tv_template,
2185                                        .count = LZO_COMP_TEST_VECTORS
2186                                },
2187                                .decomp = {
2188                                        .vecs = lzo_decomp_tv_template,
2189                                        .count = LZO_DECOMP_TEST_VECTORS
2190                                }
2191                        }
2192                }
2193        }, {
2194                .alg = "md4",
2195                .test = alg_test_hash,
2196                .suite = {
2197                        .hash = {
2198                                .vecs = md4_tv_template,
2199                                .count = MD4_TEST_VECTORS
2200                        }
2201                }
2202        }, {
2203                .alg = "md5",
2204                .test = alg_test_hash,
2205                .suite = {
2206                        .hash = {
2207                                .vecs = md5_tv_template,
2208                                .count = MD5_TEST_VECTORS
2209                        }
2210                }
2211        }, {
2212                .alg = "michael_mic",
2213                .test = alg_test_hash,
2214                .suite = {
2215                        .hash = {
2216                                .vecs = michael_mic_tv_template,
2217                                .count = MICHAEL_MIC_TEST_VECTORS
2218                        }
2219                }
2220        }, {
2221                .alg = "pcbc(fcrypt)",
2222                .test = alg_test_skcipher,
2223                .suite = {
2224                        .cipher = {
2225                                .enc = {
2226                                        .vecs = fcrypt_pcbc_enc_tv_template,
2227                                        .count = FCRYPT_ENC_TEST_VECTORS
2228                                },
2229                                .dec = {
2230                                        .vecs = fcrypt_pcbc_dec_tv_template,
2231                                        .count = FCRYPT_DEC_TEST_VECTORS
2232                                }
2233                        }
2234                }
2235        }, {
2236                .alg = "rfc3686(ctr(aes))",
2237                .test = alg_test_skcipher,
2238                .fips_allowed = 1,
2239                .suite = {
2240                        .cipher = {
2241                                .enc = {
2242                                        .vecs = aes_ctr_rfc3686_enc_tv_template,
2243                                        .count = AES_CTR_3686_ENC_TEST_VECTORS
2244                                },
2245                                .dec = {
2246                                        .vecs = aes_ctr_rfc3686_dec_tv_template,
2247                                        .count = AES_CTR_3686_DEC_TEST_VECTORS
2248                                }
2249                        }
2250                }
2251        }, {
2252                .alg = "rfc4106(gcm(aes))",
2253                .test = alg_test_aead,
2254                .suite = {
2255                        .aead = {
2256                                .enc = {
2257                                        .vecs = aes_gcm_rfc4106_enc_tv_template,
2258                                        .count = AES_GCM_4106_ENC_TEST_VECTORS
2259                                },
2260                                .dec = {
2261                                        .vecs = aes_gcm_rfc4106_dec_tv_template,
2262                                        .count = AES_GCM_4106_DEC_TEST_VECTORS
2263                                }
2264                        }
2265                }
2266        }, {
2267
2268
2269                .alg = "rfc4309(ccm(aes))",
2270                .test = alg_test_aead,
2271                .fips_allowed = 1,
2272                .suite = {
2273                        .aead = {
2274                                .enc = {
2275                                        .vecs = aes_ccm_rfc4309_enc_tv_template,
2276                                        .count = AES_CCM_4309_ENC_TEST_VECTORS
2277                                },
2278                                .dec = {
2279                                        .vecs = aes_ccm_rfc4309_dec_tv_template,
2280                                        .count = AES_CCM_4309_DEC_TEST_VECTORS
2281                                }
2282                        }
2283                }
2284        }, {
2285                .alg = "rmd128",
2286                .test = alg_test_hash,
2287                .suite = {
2288                        .hash = {
2289                                .vecs = rmd128_tv_template,
2290                                .count = RMD128_TEST_VECTORS
2291                        }
2292                }
2293        }, {
2294                .alg = "rmd160",
2295                .test = alg_test_hash,
2296                .suite = {
2297                        .hash = {
2298                                .vecs = rmd160_tv_template,
2299                                .count = RMD160_TEST_VECTORS
2300                        }
2301                }
2302        }, {
2303                .alg = "rmd256",
2304                .test = alg_test_hash,
2305                .suite = {
2306                        .hash = {
2307                                .vecs = rmd256_tv_template,
2308                                .count = RMD256_TEST_VECTORS
2309                        }
2310                }
2311        }, {
2312                .alg = "rmd320",
2313                .test = alg_test_hash,
2314                .suite = {
2315                        .hash = {
2316                                .vecs = rmd320_tv_template,
2317                                .count = RMD320_TEST_VECTORS
2318                        }
2319                }
2320        }, {
2321                .alg = "salsa20",
2322                .test = alg_test_skcipher,
2323                .suite = {
2324                        .cipher = {
2325                                .enc = {
2326                                        .vecs = salsa20_stream_enc_tv_template,
2327                                        .count = SALSA20_STREAM_ENC_TEST_VECTORS
2328                                }
2329                        }
2330                }
2331        }, {
2332                .alg = "sha1",
2333                .test = alg_test_hash,
2334                .fips_allowed = 1,
2335                .suite = {
2336                        .hash = {
2337                                .vecs = sha1_tv_template,
2338                                .count = SHA1_TEST_VECTORS
2339                        }
2340                }
2341        }, {
2342                .alg = "sha224",
2343                .test = alg_test_hash,
2344                .fips_allowed = 1,
2345                .suite = {
2346                        .hash = {
2347                                .vecs = sha224_tv_template,
2348                                .count = SHA224_TEST_VECTORS
2349                        }
2350                }
2351        }, {
2352                .alg = "sha256",
2353                .test = alg_test_hash,
2354                .fips_allowed = 1,
2355                .suite = {
2356                        .hash = {
2357                                .vecs = sha256_tv_template,
2358                                .count = SHA256_TEST_VECTORS
2359                        }
2360                }
2361        }, {
2362                .alg = "sha384",
2363                .test = alg_test_hash,
2364                .fips_allowed = 1,
2365                .suite = {
2366                        .hash = {
2367                                .vecs = sha384_tv_template,
2368                                .count = SHA384_TEST_VECTORS
2369                        }
2370                }
2371        }, {
2372                .alg = "sha512",
2373                .test = alg_test_hash,
2374                .fips_allowed = 1,
2375                .suite = {
2376                        .hash = {
2377                                .vecs = sha512_tv_template,
2378                                .count = SHA512_TEST_VECTORS
2379                        }
2380                }
2381        }, {
2382                .alg = "tgr128",
2383                .test = alg_test_hash,
2384                .suite = {
2385                        .hash = {
2386                                .vecs = tgr128_tv_template,
2387                                .count = TGR128_TEST_VECTORS
2388                        }
2389                }
2390        }, {
2391                .alg = "tgr160",
2392                .test = alg_test_hash,
2393                .suite = {
2394                        .hash = {
2395                                .vecs = tgr160_tv_template,
2396                                .count = TGR160_TEST_VECTORS
2397                        }
2398                }
2399        }, {
2400                .alg = "tgr192",
2401                .test = alg_test_hash,
2402                .suite = {
2403                        .hash = {
2404                                .vecs = tgr192_tv_template,
2405                                .count = TGR192_TEST_VECTORS
2406                        }
2407                }
2408        }, {
2409                .alg = "vmac(aes)",
2410                .test = alg_test_hash,
2411                .suite = {
2412                        .hash = {
2413                                .vecs = aes_vmac128_tv_template,
2414                                .count = VMAC_AES_TEST_VECTORS
2415                        }
2416                }
2417        }, {
2418                .alg = "wp256",
2419                .test = alg_test_hash,
2420                .suite = {
2421                        .hash = {
2422                                .vecs = wp256_tv_template,
2423                                .count = WP256_TEST_VECTORS
2424                        }
2425                }
2426        }, {
2427                .alg = "wp384",
2428                .test = alg_test_hash,
2429                .suite = {
2430                        .hash = {
2431                                .vecs = wp384_tv_template,
2432                                .count = WP384_TEST_VECTORS
2433                        }
2434                }
2435        }, {
2436                .alg = "wp512",
2437                .test = alg_test_hash,
2438                .suite = {
2439                        .hash = {
2440                                .vecs = wp512_tv_template,
2441                                .count = WP512_TEST_VECTORS
2442                        }
2443                }
2444        }, {
2445                .alg = "xcbc(aes)",
2446                .test = alg_test_hash,
2447                .suite = {
2448                        .hash = {
2449                                .vecs = aes_xcbc128_tv_template,
2450                                .count = XCBC_AES_TEST_VECTORS
2451                        }
2452                }
2453        }, {
2454                .alg = "xts(aes)",
2455                .test = alg_test_skcipher,
2456                .suite = {
2457                        .cipher = {
2458                                .enc = {
2459                                        .vecs = aes_xts_enc_tv_template,
2460                                        .count = AES_XTS_ENC_TEST_VECTORS
2461                                },
2462                                .dec = {
2463                                        .vecs = aes_xts_dec_tv_template,
2464                                        .count = AES_XTS_DEC_TEST_VECTORS
2465                                }
2466                        }
2467                }
2468        }, {
2469                .alg = "zlib",
2470                .test = alg_test_pcomp,
2471                .suite = {
2472                        .pcomp = {
2473                                .comp = {
2474                                        .vecs = zlib_comp_tv_template,
2475                                        .count = ZLIB_COMP_TEST_VECTORS
2476                                },
2477                                .decomp = {
2478                                        .vecs = zlib_decomp_tv_template,
2479                                        .count = ZLIB_DECOMP_TEST_VECTORS
2480                                }
2481                        }
2482                }
2483        }
2484};
2485
2486static int alg_find_test(const char *alg)
2487{
2488        int start = 0;
2489        int end = ARRAY_SIZE(alg_test_descs);
2490
2491        while (start < end) {
2492                int i = (start + end) / 2;
2493                int diff = strcmp(alg_test_descs[i].alg, alg);
2494
2495                if (diff > 0) {
2496                        end = i;
2497                        continue;
2498                }
2499
2500                if (diff < 0) {
2501                        start = i + 1;
2502                        continue;
2503                }
2504
2505                return i;
2506        }
2507
2508        return -1;
2509}
2510
2511int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
2512{
2513        int i;
2514        int j;
2515        int rc;
2516
2517        if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
2518                char nalg[CRYPTO_MAX_ALG_NAME];
2519
2520                if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
2521                    sizeof(nalg))
2522                        return -ENAMETOOLONG;
2523
2524                i = alg_find_test(nalg);
2525                if (i < 0)
2526                        goto notest;
2527
2528                if (fips_enabled && !alg_test_descs[i].fips_allowed)
2529                        goto non_fips_alg;
2530
2531                rc = alg_test_cipher(alg_test_descs + i, driver, type, mask);
2532                goto test_done;
2533        }
2534
2535        i = alg_find_test(alg);
2536        j = alg_find_test(driver);
2537        if (i < 0 && j < 0)
2538                goto notest;
2539
2540        if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
2541                             (j >= 0 && !alg_test_descs[j].fips_allowed)))
2542                goto non_fips_alg;
2543
2544        rc = 0;
2545        if (i >= 0)
2546                rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
2547                                             type, mask);
2548        if (j >= 0)
2549                rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
2550                                             type, mask);
2551
2552test_done:
2553        if (fips_enabled && rc)
2554                panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
2555
2556        if (fips_enabled && !rc)
2557                printk(KERN_INFO "alg: self-tests for %s (%s) passed\n",
2558                       driver, alg);
2559
2560        return rc;
2561
2562notest:
2563        printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
2564        return 0;
2565non_fips_alg:
2566        return -EINVAL;
2567}
2568
2569#endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
2570
2571EXPORT_SYMBOL_GPL(alg_test);
2572