1da7f033dSHerbert Xu /* 2da7f033dSHerbert Xu * Algorithm testing framework and tests. 3da7f033dSHerbert Xu * 4da7f033dSHerbert Xu * Copyright (c) 2002 James Morris <jmorris@intercode.com.au> 5da7f033dSHerbert Xu * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org> 6da7f033dSHerbert Xu * Copyright (c) 2007 Nokia Siemens Networks 7da7f033dSHerbert Xu * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au> 8da7f033dSHerbert Xu * 969435b94SAdrian Hoban * Updated RFC4106 AES-GCM testing. 1069435b94SAdrian Hoban * Authors: Aidan O'Mahony (aidan.o.mahony@intel.com) 1169435b94SAdrian Hoban * Adrian Hoban <adrian.hoban@intel.com> 1269435b94SAdrian Hoban * Gabriele Paoloni <gabriele.paoloni@intel.com> 1369435b94SAdrian Hoban * Tadeusz Struk (tadeusz.struk@intel.com) 1469435b94SAdrian Hoban * Copyright (c) 2010, Intel Corporation. 1569435b94SAdrian Hoban * 16da7f033dSHerbert Xu * This program is free software; you can redistribute it and/or modify it 17da7f033dSHerbert Xu * under the terms of the GNU General Public License as published by the Free 18da7f033dSHerbert Xu * Software Foundation; either version 2 of the License, or (at your option) 19da7f033dSHerbert Xu * any later version. 20da7f033dSHerbert Xu * 21da7f033dSHerbert Xu */ 22da7f033dSHerbert Xu 231ce33115SHerbert Xu #include <crypto/aead.h> 24da7f033dSHerbert Xu #include <crypto/hash.h> 2512773d93SHerbert Xu #include <crypto/skcipher.h> 26da7f033dSHerbert Xu #include <linux/err.h> 271c41b882SHerbert Xu #include <linux/fips.h> 28da7f033dSHerbert Xu #include <linux/module.h> 29da7f033dSHerbert Xu #include <linux/scatterlist.h> 30da7f033dSHerbert Xu #include <linux/slab.h> 31da7f033dSHerbert Xu #include <linux/string.h> 327647d6ceSJarod Wilson #include <crypto/rng.h> 3364d1cdfbSStephan Mueller #include <crypto/drbg.h> 34946cc463STadeusz Struk #include <crypto/akcipher.h> 35da7f033dSHerbert Xu 36da7f033dSHerbert Xu #include "internal.h" 370b767f96SAlexander Shishkin 38326a6346SHerbert Xu #ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS 390b767f96SAlexander Shishkin 400b767f96SAlexander Shishkin /* a perfect nop */ 410b767f96SAlexander Shishkin int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 420b767f96SAlexander Shishkin { 430b767f96SAlexander Shishkin return 0; 440b767f96SAlexander Shishkin } 450b767f96SAlexander Shishkin 460b767f96SAlexander Shishkin #else 470b767f96SAlexander Shishkin 48da7f033dSHerbert Xu #include "testmgr.h" 49da7f033dSHerbert Xu 50da7f033dSHerbert Xu /* 51da7f033dSHerbert Xu * Need slab memory for testing (size in number of pages). 52da7f033dSHerbert Xu */ 53da7f033dSHerbert Xu #define XBUFSIZE 8 54da7f033dSHerbert Xu 55da7f033dSHerbert Xu /* 56da7f033dSHerbert Xu * Indexes into the xbuf to simulate cross-page access. 57da7f033dSHerbert Xu */ 58da7f033dSHerbert Xu #define IDX1 32 59da7f033dSHerbert Xu #define IDX2 32400 60da7f033dSHerbert Xu #define IDX3 1 61da7f033dSHerbert Xu #define IDX4 8193 62da7f033dSHerbert Xu #define IDX5 22222 63da7f033dSHerbert Xu #define IDX6 17101 64da7f033dSHerbert Xu #define IDX7 27333 65da7f033dSHerbert Xu #define IDX8 3000 66da7f033dSHerbert Xu 67da7f033dSHerbert Xu /* 68da7f033dSHerbert Xu * Used by test_cipher() 69da7f033dSHerbert Xu */ 70da7f033dSHerbert Xu #define ENCRYPT 1 71da7f033dSHerbert Xu #define DECRYPT 0 72da7f033dSHerbert Xu 73da7f033dSHerbert Xu struct tcrypt_result { 74da7f033dSHerbert Xu struct completion completion; 75da7f033dSHerbert Xu int err; 76da7f033dSHerbert Xu }; 77da7f033dSHerbert Xu 78da7f033dSHerbert Xu struct aead_test_suite { 79da7f033dSHerbert Xu struct { 80da7f033dSHerbert Xu struct aead_testvec *vecs; 81da7f033dSHerbert Xu unsigned int count; 82da7f033dSHerbert Xu } enc, dec; 83da7f033dSHerbert Xu }; 84da7f033dSHerbert Xu 85da7f033dSHerbert Xu struct cipher_test_suite { 86da7f033dSHerbert Xu struct { 87da7f033dSHerbert Xu struct cipher_testvec *vecs; 88da7f033dSHerbert Xu unsigned int count; 89da7f033dSHerbert Xu } enc, dec; 90da7f033dSHerbert Xu }; 91da7f033dSHerbert Xu 92da7f033dSHerbert Xu struct comp_test_suite { 93da7f033dSHerbert Xu struct { 94da7f033dSHerbert Xu struct comp_testvec *vecs; 95da7f033dSHerbert Xu unsigned int count; 96da7f033dSHerbert Xu } comp, decomp; 97da7f033dSHerbert Xu }; 98da7f033dSHerbert Xu 99da7f033dSHerbert Xu struct hash_test_suite { 100da7f033dSHerbert Xu struct hash_testvec *vecs; 101da7f033dSHerbert Xu unsigned int count; 102da7f033dSHerbert Xu }; 103da7f033dSHerbert Xu 1047647d6ceSJarod Wilson struct cprng_test_suite { 1057647d6ceSJarod Wilson struct cprng_testvec *vecs; 1067647d6ceSJarod Wilson unsigned int count; 1077647d6ceSJarod Wilson }; 1087647d6ceSJarod Wilson 10964d1cdfbSStephan Mueller struct drbg_test_suite { 11064d1cdfbSStephan Mueller struct drbg_testvec *vecs; 11164d1cdfbSStephan Mueller unsigned int count; 11264d1cdfbSStephan Mueller }; 11364d1cdfbSStephan Mueller 114946cc463STadeusz Struk struct akcipher_test_suite { 115946cc463STadeusz Struk struct akcipher_testvec *vecs; 116946cc463STadeusz Struk unsigned int count; 117946cc463STadeusz Struk }; 118946cc463STadeusz Struk 119da7f033dSHerbert Xu struct alg_test_desc { 120da7f033dSHerbert Xu const char *alg; 121da7f033dSHerbert Xu int (*test)(const struct alg_test_desc *desc, const char *driver, 122da7f033dSHerbert Xu u32 type, u32 mask); 123a1915d51SJarod Wilson int fips_allowed; /* set if alg is allowed in fips mode */ 124da7f033dSHerbert Xu 125da7f033dSHerbert Xu union { 126da7f033dSHerbert Xu struct aead_test_suite aead; 127da7f033dSHerbert Xu struct cipher_test_suite cipher; 128da7f033dSHerbert Xu struct comp_test_suite comp; 129da7f033dSHerbert Xu struct hash_test_suite hash; 1307647d6ceSJarod Wilson struct cprng_test_suite cprng; 13164d1cdfbSStephan Mueller struct drbg_test_suite drbg; 132946cc463STadeusz Struk struct akcipher_test_suite akcipher; 133da7f033dSHerbert Xu } suite; 134da7f033dSHerbert Xu }; 135da7f033dSHerbert Xu 136da7f033dSHerbert Xu static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 }; 137da7f033dSHerbert Xu 138da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len) 139da7f033dSHerbert Xu { 140da7f033dSHerbert Xu print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET, 141da7f033dSHerbert Xu 16, 1, 142da7f033dSHerbert Xu buf, len, false); 143da7f033dSHerbert Xu } 144da7f033dSHerbert Xu 145da7f033dSHerbert Xu static void tcrypt_complete(struct crypto_async_request *req, int err) 146da7f033dSHerbert Xu { 147da7f033dSHerbert Xu struct tcrypt_result *res = req->data; 148da7f033dSHerbert Xu 149da7f033dSHerbert Xu if (err == -EINPROGRESS) 150da7f033dSHerbert Xu return; 151da7f033dSHerbert Xu 152da7f033dSHerbert Xu res->err = err; 153da7f033dSHerbert Xu complete(&res->completion); 154da7f033dSHerbert Xu } 155da7f033dSHerbert Xu 156f8b0d4d0SHerbert Xu static int testmgr_alloc_buf(char *buf[XBUFSIZE]) 157f8b0d4d0SHerbert Xu { 158f8b0d4d0SHerbert Xu int i; 159f8b0d4d0SHerbert Xu 160f8b0d4d0SHerbert Xu for (i = 0; i < XBUFSIZE; i++) { 161f8b0d4d0SHerbert Xu buf[i] = (void *)__get_free_page(GFP_KERNEL); 162f8b0d4d0SHerbert Xu if (!buf[i]) 163f8b0d4d0SHerbert Xu goto err_free_buf; 164f8b0d4d0SHerbert Xu } 165f8b0d4d0SHerbert Xu 166f8b0d4d0SHerbert Xu return 0; 167f8b0d4d0SHerbert Xu 168f8b0d4d0SHerbert Xu err_free_buf: 169f8b0d4d0SHerbert Xu while (i-- > 0) 170f8b0d4d0SHerbert Xu free_page((unsigned long)buf[i]); 171f8b0d4d0SHerbert Xu 172f8b0d4d0SHerbert Xu return -ENOMEM; 173f8b0d4d0SHerbert Xu } 174f8b0d4d0SHerbert Xu 175f8b0d4d0SHerbert Xu static void testmgr_free_buf(char *buf[XBUFSIZE]) 176f8b0d4d0SHerbert Xu { 177f8b0d4d0SHerbert Xu int i; 178f8b0d4d0SHerbert Xu 179f8b0d4d0SHerbert Xu for (i = 0; i < XBUFSIZE; i++) 180f8b0d4d0SHerbert Xu free_page((unsigned long)buf[i]); 181f8b0d4d0SHerbert Xu } 182f8b0d4d0SHerbert Xu 183d4c85f9bSCristian Stoica static int wait_async_op(struct tcrypt_result *tr, int ret) 184a8f1a052SDavid S. Miller { 185a8f1a052SDavid S. Miller if (ret == -EINPROGRESS || ret == -EBUSY) { 1868a45ac12SRabin Vincent wait_for_completion(&tr->completion); 18716735d02SWolfram Sang reinit_completion(&tr->completion); 1888a45ac12SRabin Vincent ret = tr->err; 189a8f1a052SDavid S. Miller } 190a8f1a052SDavid S. Miller return ret; 191a8f1a052SDavid S. Miller } 192a8f1a052SDavid S. Miller 193018ba95cSWang, Rui Y static int ahash_partial_update(struct ahash_request **preq, 194018ba95cSWang, Rui Y struct crypto_ahash *tfm, struct hash_testvec *template, 195018ba95cSWang, Rui Y void *hash_buff, int k, int temp, struct scatterlist *sg, 196018ba95cSWang, Rui Y const char *algo, char *result, struct tcrypt_result *tresult) 197018ba95cSWang, Rui Y { 198018ba95cSWang, Rui Y char *state; 199018ba95cSWang, Rui Y struct ahash_request *req; 200018ba95cSWang, Rui Y int statesize, ret = -EINVAL; 201018ba95cSWang, Rui Y 202018ba95cSWang, Rui Y req = *preq; 203018ba95cSWang, Rui Y statesize = crypto_ahash_statesize( 204018ba95cSWang, Rui Y crypto_ahash_reqtfm(req)); 205018ba95cSWang, Rui Y state = kmalloc(statesize, GFP_KERNEL); 206018ba95cSWang, Rui Y if (!state) { 207018ba95cSWang, Rui Y pr_err("alt: hash: Failed to alloc state for %s\n", algo); 208018ba95cSWang, Rui Y goto out_nostate; 209018ba95cSWang, Rui Y } 210018ba95cSWang, Rui Y ret = crypto_ahash_export(req, state); 211018ba95cSWang, Rui Y if (ret) { 212018ba95cSWang, Rui Y pr_err("alt: hash: Failed to export() for %s\n", algo); 213018ba95cSWang, Rui Y goto out; 214018ba95cSWang, Rui Y } 215018ba95cSWang, Rui Y ahash_request_free(req); 216018ba95cSWang, Rui Y req = ahash_request_alloc(tfm, GFP_KERNEL); 217018ba95cSWang, Rui Y if (!req) { 218018ba95cSWang, Rui Y pr_err("alg: hash: Failed to alloc request for %s\n", algo); 219018ba95cSWang, Rui Y goto out_noreq; 220018ba95cSWang, Rui Y } 221018ba95cSWang, Rui Y ahash_request_set_callback(req, 222018ba95cSWang, Rui Y CRYPTO_TFM_REQ_MAY_BACKLOG, 223018ba95cSWang, Rui Y tcrypt_complete, tresult); 224018ba95cSWang, Rui Y 225018ba95cSWang, Rui Y memcpy(hash_buff, template->plaintext + temp, 226018ba95cSWang, Rui Y template->tap[k]); 227018ba95cSWang, Rui Y sg_init_one(&sg[0], hash_buff, template->tap[k]); 228018ba95cSWang, Rui Y ahash_request_set_crypt(req, sg, result, template->tap[k]); 229018ba95cSWang, Rui Y ret = crypto_ahash_import(req, state); 230018ba95cSWang, Rui Y if (ret) { 231018ba95cSWang, Rui Y pr_err("alg: hash: Failed to import() for %s\n", algo); 232018ba95cSWang, Rui Y goto out; 233018ba95cSWang, Rui Y } 234018ba95cSWang, Rui Y ret = wait_async_op(tresult, crypto_ahash_update(req)); 235018ba95cSWang, Rui Y if (ret) 236018ba95cSWang, Rui Y goto out; 237018ba95cSWang, Rui Y *preq = req; 238018ba95cSWang, Rui Y ret = 0; 239018ba95cSWang, Rui Y goto out_noreq; 240018ba95cSWang, Rui Y out: 241018ba95cSWang, Rui Y ahash_request_free(req); 242018ba95cSWang, Rui Y out_noreq: 243018ba95cSWang, Rui Y kfree(state); 244018ba95cSWang, Rui Y out_nostate: 245018ba95cSWang, Rui Y return ret; 246018ba95cSWang, Rui Y } 247018ba95cSWang, Rui Y 248da5ffe11SJussi Kivilinna static int __test_hash(struct crypto_ahash *tfm, struct hash_testvec *template, 249da5ffe11SJussi Kivilinna unsigned int tcount, bool use_digest, 250da5ffe11SJussi Kivilinna const int align_offset) 251da7f033dSHerbert Xu { 252da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm)); 253da7f033dSHerbert Xu unsigned int i, j, k, temp; 254da7f033dSHerbert Xu struct scatterlist sg[8]; 25529b77e5dSHoria Geanta char *result; 25629b77e5dSHoria Geanta char *key; 257da7f033dSHerbert Xu struct ahash_request *req; 258da7f033dSHerbert Xu struct tcrypt_result tresult; 259da7f033dSHerbert Xu void *hash_buff; 260f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 261f8b0d4d0SHerbert Xu int ret = -ENOMEM; 262f8b0d4d0SHerbert Xu 26329b77e5dSHoria Geanta result = kmalloc(MAX_DIGEST_SIZE, GFP_KERNEL); 26429b77e5dSHoria Geanta if (!result) 26529b77e5dSHoria Geanta return ret; 26629b77e5dSHoria Geanta key = kmalloc(MAX_KEYLEN, GFP_KERNEL); 26729b77e5dSHoria Geanta if (!key) 26829b77e5dSHoria Geanta goto out_nobuf; 269f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 270f8b0d4d0SHerbert Xu goto out_nobuf; 271da7f033dSHerbert Xu 272da7f033dSHerbert Xu init_completion(&tresult.completion); 273da7f033dSHerbert Xu 274da7f033dSHerbert Xu req = ahash_request_alloc(tfm, GFP_KERNEL); 275da7f033dSHerbert Xu if (!req) { 276da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to allocate request for " 277da7f033dSHerbert Xu "%s\n", algo); 278da7f033dSHerbert Xu goto out_noreq; 279da7f033dSHerbert Xu } 280da7f033dSHerbert Xu ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 281da7f033dSHerbert Xu tcrypt_complete, &tresult); 282da7f033dSHerbert Xu 283a0cfae59SHerbert Xu j = 0; 284da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 285a0cfae59SHerbert Xu if (template[i].np) 286a0cfae59SHerbert Xu continue; 287a0cfae59SHerbert Xu 288da5ffe11SJussi Kivilinna ret = -EINVAL; 289da5ffe11SJussi Kivilinna if (WARN_ON(align_offset + template[i].psize > PAGE_SIZE)) 290da5ffe11SJussi Kivilinna goto out; 291da5ffe11SJussi Kivilinna 292a0cfae59SHerbert Xu j++; 29329b77e5dSHoria Geanta memset(result, 0, MAX_DIGEST_SIZE); 294da7f033dSHerbert Xu 295da7f033dSHerbert Xu hash_buff = xbuf[0]; 296da5ffe11SJussi Kivilinna hash_buff += align_offset; 297da7f033dSHerbert Xu 298da7f033dSHerbert Xu memcpy(hash_buff, template[i].plaintext, template[i].psize); 299da7f033dSHerbert Xu sg_init_one(&sg[0], hash_buff, template[i].psize); 300da7f033dSHerbert Xu 301da7f033dSHerbert Xu if (template[i].ksize) { 302da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 30329b77e5dSHoria Geanta if (template[i].ksize > MAX_KEYLEN) { 30429b77e5dSHoria Geanta pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n", 30529b77e5dSHoria Geanta j, algo, template[i].ksize, MAX_KEYLEN); 30629b77e5dSHoria Geanta ret = -EINVAL; 30729b77e5dSHoria Geanta goto out; 30829b77e5dSHoria Geanta } 30929b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].ksize); 31029b77e5dSHoria Geanta ret = crypto_ahash_setkey(tfm, key, template[i].ksize); 311da7f033dSHerbert Xu if (ret) { 312da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey failed on " 313a0cfae59SHerbert Xu "test %d for %s: ret=%d\n", j, algo, 314da7f033dSHerbert Xu -ret); 315da7f033dSHerbert Xu goto out; 316da7f033dSHerbert Xu } 317da7f033dSHerbert Xu } 318da7f033dSHerbert Xu 319da7f033dSHerbert Xu ahash_request_set_crypt(req, sg, result, template[i].psize); 320a8f1a052SDavid S. Miller if (use_digest) { 321d4c85f9bSCristian Stoica ret = wait_async_op(&tresult, crypto_ahash_digest(req)); 322a8f1a052SDavid S. Miller if (ret) { 323a8f1a052SDavid S. Miller pr_err("alg: hash: digest failed on test %d " 324a0cfae59SHerbert Xu "for %s: ret=%d\n", j, algo, -ret); 325da7f033dSHerbert Xu goto out; 326da7f033dSHerbert Xu } 327a8f1a052SDavid S. Miller } else { 328d4c85f9bSCristian Stoica ret = wait_async_op(&tresult, crypto_ahash_init(req)); 329a8f1a052SDavid S. Miller if (ret) { 330a8f1a052SDavid S. Miller pr_err("alt: hash: init failed on test %d " 331a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 332a8f1a052SDavid S. Miller goto out; 333a8f1a052SDavid S. Miller } 334d4c85f9bSCristian Stoica ret = wait_async_op(&tresult, crypto_ahash_update(req)); 335a8f1a052SDavid S. Miller if (ret) { 336a8f1a052SDavid S. Miller pr_err("alt: hash: update failed on test %d " 337a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 338a8f1a052SDavid S. Miller goto out; 339a8f1a052SDavid S. Miller } 340d4c85f9bSCristian Stoica ret = wait_async_op(&tresult, crypto_ahash_final(req)); 341a8f1a052SDavid S. Miller if (ret) { 342a8f1a052SDavid S. Miller pr_err("alt: hash: final failed on test %d " 343a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 344a8f1a052SDavid S. Miller goto out; 345a8f1a052SDavid S. Miller } 346a8f1a052SDavid S. Miller } 347da7f033dSHerbert Xu 348da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 349da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 350da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Test %d failed for %s\n", 351a0cfae59SHerbert Xu j, algo); 352da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 353da7f033dSHerbert Xu ret = -EINVAL; 354da7f033dSHerbert Xu goto out; 355da7f033dSHerbert Xu } 356da7f033dSHerbert Xu } 357da7f033dSHerbert Xu 358da7f033dSHerbert Xu j = 0; 359da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 360da5ffe11SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 361da5ffe11SJussi Kivilinna if (align_offset != 0) 362da5ffe11SJussi Kivilinna break; 363da5ffe11SJussi Kivilinna 3645f2b424eSCristian Stoica if (!template[i].np) 3655f2b424eSCristian Stoica continue; 3665f2b424eSCristian Stoica 367da7f033dSHerbert Xu j++; 36829b77e5dSHoria Geanta memset(result, 0, MAX_DIGEST_SIZE); 369da7f033dSHerbert Xu 370da7f033dSHerbert Xu temp = 0; 371da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 372fd57f22aSHerbert Xu ret = -EINVAL; 373da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 374fd57f22aSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 375fd57f22aSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 376fd57f22aSHerbert Xu goto out; 377da7f033dSHerbert Xu sg_set_buf(&sg[k], 378da7f033dSHerbert Xu memcpy(xbuf[IDX[k] >> PAGE_SHIFT] + 379da7f033dSHerbert Xu offset_in_page(IDX[k]), 380da7f033dSHerbert Xu template[i].plaintext + temp, 381da7f033dSHerbert Xu template[i].tap[k]), 382da7f033dSHerbert Xu template[i].tap[k]); 383da7f033dSHerbert Xu temp += template[i].tap[k]; 384da7f033dSHerbert Xu } 385da7f033dSHerbert Xu 386da7f033dSHerbert Xu if (template[i].ksize) { 38729b77e5dSHoria Geanta if (template[i].ksize > MAX_KEYLEN) { 38829b77e5dSHoria Geanta pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n", 3895f2b424eSCristian Stoica j, algo, template[i].ksize, MAX_KEYLEN); 39029b77e5dSHoria Geanta ret = -EINVAL; 39129b77e5dSHoria Geanta goto out; 39229b77e5dSHoria Geanta } 393da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 39429b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].ksize); 3955f2b424eSCristian Stoica ret = crypto_ahash_setkey(tfm, key, template[i].ksize); 396da7f033dSHerbert Xu 397da7f033dSHerbert Xu if (ret) { 398da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey " 399da7f033dSHerbert Xu "failed on chunking test %d " 4005f2b424eSCristian Stoica "for %s: ret=%d\n", j, algo, -ret); 401da7f033dSHerbert Xu goto out; 402da7f033dSHerbert Xu } 403da7f033dSHerbert Xu } 404da7f033dSHerbert Xu 4055f2b424eSCristian Stoica ahash_request_set_crypt(req, sg, result, template[i].psize); 406da7f033dSHerbert Xu ret = crypto_ahash_digest(req); 407da7f033dSHerbert Xu switch (ret) { 408da7f033dSHerbert Xu case 0: 409da7f033dSHerbert Xu break; 410da7f033dSHerbert Xu case -EINPROGRESS: 411da7f033dSHerbert Xu case -EBUSY: 4128a45ac12SRabin Vincent wait_for_completion(&tresult.completion); 41316735d02SWolfram Sang reinit_completion(&tresult.completion); 4148a45ac12SRabin Vincent ret = tresult.err; 4158a45ac12SRabin Vincent if (!ret) 416da7f033dSHerbert Xu break; 417da7f033dSHerbert Xu /* fall through */ 418da7f033dSHerbert Xu default: 419da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: digest failed " 420da7f033dSHerbert Xu "on chunking test %d for %s: " 421da7f033dSHerbert Xu "ret=%d\n", j, algo, -ret); 422da7f033dSHerbert Xu goto out; 423da7f033dSHerbert Xu } 424da7f033dSHerbert Xu 425da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 426da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 427da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Chunking test %d " 428da7f033dSHerbert Xu "failed for %s\n", j, algo); 429da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 430da7f033dSHerbert Xu ret = -EINVAL; 431da7f033dSHerbert Xu goto out; 432da7f033dSHerbert Xu } 433da7f033dSHerbert Xu } 434da7f033dSHerbert Xu 435018ba95cSWang, Rui Y /* partial update exercise */ 436018ba95cSWang, Rui Y j = 0; 437018ba95cSWang, Rui Y for (i = 0; i < tcount; i++) { 438018ba95cSWang, Rui Y /* alignment tests are only done with continuous buffers */ 439018ba95cSWang, Rui Y if (align_offset != 0) 440018ba95cSWang, Rui Y break; 441018ba95cSWang, Rui Y 442018ba95cSWang, Rui Y if (template[i].np < 2) 443018ba95cSWang, Rui Y continue; 444018ba95cSWang, Rui Y 445018ba95cSWang, Rui Y j++; 446018ba95cSWang, Rui Y memset(result, 0, MAX_DIGEST_SIZE); 447018ba95cSWang, Rui Y 448018ba95cSWang, Rui Y ret = -EINVAL; 449018ba95cSWang, Rui Y hash_buff = xbuf[0]; 450018ba95cSWang, Rui Y memcpy(hash_buff, template[i].plaintext, 451018ba95cSWang, Rui Y template[i].tap[0]); 452018ba95cSWang, Rui Y sg_init_one(&sg[0], hash_buff, template[i].tap[0]); 453018ba95cSWang, Rui Y 454018ba95cSWang, Rui Y if (template[i].ksize) { 455018ba95cSWang, Rui Y crypto_ahash_clear_flags(tfm, ~0); 456018ba95cSWang, Rui Y if (template[i].ksize > MAX_KEYLEN) { 457018ba95cSWang, Rui Y pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n", 458018ba95cSWang, Rui Y j, algo, template[i].ksize, MAX_KEYLEN); 459018ba95cSWang, Rui Y ret = -EINVAL; 460018ba95cSWang, Rui Y goto out; 461018ba95cSWang, Rui Y } 462018ba95cSWang, Rui Y memcpy(key, template[i].key, template[i].ksize); 463018ba95cSWang, Rui Y ret = crypto_ahash_setkey(tfm, key, template[i].ksize); 464018ba95cSWang, Rui Y if (ret) { 465018ba95cSWang, Rui Y pr_err("alg: hash: setkey failed on test %d for %s: ret=%d\n", 466018ba95cSWang, Rui Y j, algo, -ret); 467018ba95cSWang, Rui Y goto out; 468018ba95cSWang, Rui Y } 469018ba95cSWang, Rui Y } 470018ba95cSWang, Rui Y 471018ba95cSWang, Rui Y ahash_request_set_crypt(req, sg, result, template[i].tap[0]); 472018ba95cSWang, Rui Y ret = wait_async_op(&tresult, crypto_ahash_init(req)); 473018ba95cSWang, Rui Y if (ret) { 474018ba95cSWang, Rui Y pr_err("alt: hash: init failed on test %d for %s: ret=%d\n", 475018ba95cSWang, Rui Y j, algo, -ret); 476018ba95cSWang, Rui Y goto out; 477018ba95cSWang, Rui Y } 478018ba95cSWang, Rui Y ret = wait_async_op(&tresult, crypto_ahash_update(req)); 479018ba95cSWang, Rui Y if (ret) { 480018ba95cSWang, Rui Y pr_err("alt: hash: update failed on test %d for %s: ret=%d\n", 481018ba95cSWang, Rui Y j, algo, -ret); 482018ba95cSWang, Rui Y goto out; 483018ba95cSWang, Rui Y } 484018ba95cSWang, Rui Y 485018ba95cSWang, Rui Y temp = template[i].tap[0]; 486018ba95cSWang, Rui Y for (k = 1; k < template[i].np; k++) { 487018ba95cSWang, Rui Y ret = ahash_partial_update(&req, tfm, &template[i], 488018ba95cSWang, Rui Y hash_buff, k, temp, &sg[0], algo, result, 489018ba95cSWang, Rui Y &tresult); 490018ba95cSWang, Rui Y if (ret) { 491018ba95cSWang, Rui Y pr_err("hash: partial update failed on test %d for %s: ret=%d\n", 492018ba95cSWang, Rui Y j, algo, -ret); 493018ba95cSWang, Rui Y goto out_noreq; 494018ba95cSWang, Rui Y } 495018ba95cSWang, Rui Y temp += template[i].tap[k]; 496018ba95cSWang, Rui Y } 497018ba95cSWang, Rui Y ret = wait_async_op(&tresult, crypto_ahash_final(req)); 498018ba95cSWang, Rui Y if (ret) { 499018ba95cSWang, Rui Y pr_err("alt: hash: final failed on test %d for %s: ret=%d\n", 500018ba95cSWang, Rui Y j, algo, -ret); 501018ba95cSWang, Rui Y goto out; 502018ba95cSWang, Rui Y } 503018ba95cSWang, Rui Y if (memcmp(result, template[i].digest, 504018ba95cSWang, Rui Y crypto_ahash_digestsize(tfm))) { 505018ba95cSWang, Rui Y pr_err("alg: hash: Partial Test %d failed for %s\n", 506018ba95cSWang, Rui Y j, algo); 507018ba95cSWang, Rui Y hexdump(result, crypto_ahash_digestsize(tfm)); 508018ba95cSWang, Rui Y ret = -EINVAL; 509018ba95cSWang, Rui Y goto out; 510018ba95cSWang, Rui Y } 511018ba95cSWang, Rui Y } 512018ba95cSWang, Rui Y 513da7f033dSHerbert Xu ret = 0; 514da7f033dSHerbert Xu 515da7f033dSHerbert Xu out: 516da7f033dSHerbert Xu ahash_request_free(req); 517da7f033dSHerbert Xu out_noreq: 518f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 519f8b0d4d0SHerbert Xu out_nobuf: 52029b77e5dSHoria Geanta kfree(key); 52129b77e5dSHoria Geanta kfree(result); 522da7f033dSHerbert Xu return ret; 523da7f033dSHerbert Xu } 524da7f033dSHerbert Xu 525da5ffe11SJussi Kivilinna static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template, 526da5ffe11SJussi Kivilinna unsigned int tcount, bool use_digest) 527da5ffe11SJussi Kivilinna { 528da5ffe11SJussi Kivilinna unsigned int alignmask; 529da5ffe11SJussi Kivilinna int ret; 530da5ffe11SJussi Kivilinna 531da5ffe11SJussi Kivilinna ret = __test_hash(tfm, template, tcount, use_digest, 0); 532da5ffe11SJussi Kivilinna if (ret) 533da5ffe11SJussi Kivilinna return ret; 534da5ffe11SJussi Kivilinna 535da5ffe11SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 536da5ffe11SJussi Kivilinna ret = __test_hash(tfm, template, tcount, use_digest, 1); 537da5ffe11SJussi Kivilinna if (ret) 538da5ffe11SJussi Kivilinna return ret; 539da5ffe11SJussi Kivilinna 540da5ffe11SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 541da5ffe11SJussi Kivilinna if (alignmask) { 542da5ffe11SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 543da5ffe11SJussi Kivilinna ret = __test_hash(tfm, template, tcount, use_digest, 544da5ffe11SJussi Kivilinna alignmask + 1); 545da5ffe11SJussi Kivilinna if (ret) 546da5ffe11SJussi Kivilinna return ret; 547da5ffe11SJussi Kivilinna } 548da5ffe11SJussi Kivilinna 549da5ffe11SJussi Kivilinna return 0; 550da5ffe11SJussi Kivilinna } 551da5ffe11SJussi Kivilinna 552d8a32ac2SJussi Kivilinna static int __test_aead(struct crypto_aead *tfm, int enc, 553d8a32ac2SJussi Kivilinna struct aead_testvec *template, unsigned int tcount, 55458dcf548SJussi Kivilinna const bool diff_dst, const int align_offset) 555da7f033dSHerbert Xu { 556da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)); 557da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 558f8b0d4d0SHerbert Xu int ret = -ENOMEM; 559da7f033dSHerbert Xu char *q; 560da7f033dSHerbert Xu char *key; 561da7f033dSHerbert Xu struct aead_request *req; 562d8a32ac2SJussi Kivilinna struct scatterlist *sg; 563d8a32ac2SJussi Kivilinna struct scatterlist *sgout; 564d8a32ac2SJussi Kivilinna const char *e, *d; 565da7f033dSHerbert Xu struct tcrypt_result result; 566424a5da6SCristian Stoica unsigned int authsize, iv_len; 567da7f033dSHerbert Xu void *input; 568d8a32ac2SJussi Kivilinna void *output; 569da7f033dSHerbert Xu void *assoc; 5709bac019dSTadeusz Struk char *iv; 571f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 572d8a32ac2SJussi Kivilinna char *xoutbuf[XBUFSIZE]; 573f8b0d4d0SHerbert Xu char *axbuf[XBUFSIZE]; 574f8b0d4d0SHerbert Xu 5759bac019dSTadeusz Struk iv = kzalloc(MAX_IVLEN, GFP_KERNEL); 5769bac019dSTadeusz Struk if (!iv) 5779bac019dSTadeusz Struk return ret; 57829b77e5dSHoria Geanta key = kmalloc(MAX_KEYLEN, GFP_KERNEL); 57929b77e5dSHoria Geanta if (!key) 58029b77e5dSHoria Geanta goto out_noxbuf; 581f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 582f8b0d4d0SHerbert Xu goto out_noxbuf; 583f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(axbuf)) 584f8b0d4d0SHerbert Xu goto out_noaxbuf; 585d8a32ac2SJussi Kivilinna if (diff_dst && testmgr_alloc_buf(xoutbuf)) 586d8a32ac2SJussi Kivilinna goto out_nooutbuf; 587d8a32ac2SJussi Kivilinna 588d8a32ac2SJussi Kivilinna /* avoid "the frame size is larger than 1024 bytes" compiler warning */ 5898a525fcdSHerbert Xu sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 4 : 2), GFP_KERNEL); 590d8a32ac2SJussi Kivilinna if (!sg) 591d8a32ac2SJussi Kivilinna goto out_nosg; 5928a525fcdSHerbert Xu sgout = &sg[16]; 593d8a32ac2SJussi Kivilinna 594d8a32ac2SJussi Kivilinna if (diff_dst) 595d8a32ac2SJussi Kivilinna d = "-ddst"; 596d8a32ac2SJussi Kivilinna else 597d8a32ac2SJussi Kivilinna d = ""; 598d8a32ac2SJussi Kivilinna 599da7f033dSHerbert Xu if (enc == ENCRYPT) 600da7f033dSHerbert Xu e = "encryption"; 601da7f033dSHerbert Xu else 602da7f033dSHerbert Xu e = "decryption"; 603da7f033dSHerbert Xu 604da7f033dSHerbert Xu init_completion(&result.completion); 605da7f033dSHerbert Xu 606da7f033dSHerbert Xu req = aead_request_alloc(tfm, GFP_KERNEL); 607da7f033dSHerbert Xu if (!req) { 608d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to allocate request for %s\n", 609d8a32ac2SJussi Kivilinna d, algo); 610da7f033dSHerbert Xu goto out; 611da7f033dSHerbert Xu } 612da7f033dSHerbert Xu 613da7f033dSHerbert Xu aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 614da7f033dSHerbert Xu tcrypt_complete, &result); 615da7f033dSHerbert Xu 616abfa7f43SJerome Marchand iv_len = crypto_aead_ivsize(tfm); 617abfa7f43SJerome Marchand 618da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 61905b1d338SCristian Stoica if (template[i].np) 62005b1d338SCristian Stoica continue; 62105b1d338SCristian Stoica 622da7f033dSHerbert Xu j++; 623da7f033dSHerbert Xu 62458dcf548SJussi Kivilinna /* some templates have no input data but they will 625da7f033dSHerbert Xu * touch input 626da7f033dSHerbert Xu */ 627da7f033dSHerbert Xu input = xbuf[0]; 62858dcf548SJussi Kivilinna input += align_offset; 629da7f033dSHerbert Xu assoc = axbuf[0]; 630da7f033dSHerbert Xu 631fd57f22aSHerbert Xu ret = -EINVAL; 63258dcf548SJussi Kivilinna if (WARN_ON(align_offset + template[i].ilen > 63358dcf548SJussi Kivilinna PAGE_SIZE || template[i].alen > PAGE_SIZE)) 634fd57f22aSHerbert Xu goto out; 635fd57f22aSHerbert Xu 636da7f033dSHerbert Xu memcpy(input, template[i].input, template[i].ilen); 637da7f033dSHerbert Xu memcpy(assoc, template[i].assoc, template[i].alen); 638da7f033dSHerbert Xu if (template[i].iv) 639424a5da6SCristian Stoica memcpy(iv, template[i].iv, iv_len); 640da7f033dSHerbert Xu else 641424a5da6SCristian Stoica memset(iv, 0, iv_len); 642da7f033dSHerbert Xu 643da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 644da7f033dSHerbert Xu if (template[i].wk) 64505b1d338SCristian Stoica crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 646da7f033dSHerbert Xu 64729b77e5dSHoria Geanta if (template[i].klen > MAX_KEYLEN) { 64829b77e5dSHoria Geanta pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n", 64929b77e5dSHoria Geanta d, j, algo, template[i].klen, 65029b77e5dSHoria Geanta MAX_KEYLEN); 65129b77e5dSHoria Geanta ret = -EINVAL; 65229b77e5dSHoria Geanta goto out; 65329b77e5dSHoria Geanta } 65429b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].klen); 655da7f033dSHerbert Xu 65605b1d338SCristian Stoica ret = crypto_aead_setkey(tfm, key, template[i].klen); 657da7f033dSHerbert Xu if (!ret == template[i].fail) { 658d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n", 659d8a32ac2SJussi Kivilinna d, j, algo, crypto_aead_get_flags(tfm)); 660da7f033dSHerbert Xu goto out; 661da7f033dSHerbert Xu } else if (ret) 662da7f033dSHerbert Xu continue; 663da7f033dSHerbert Xu 664da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 665da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 666da7f033dSHerbert Xu if (ret) { 667d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n", 668d8a32ac2SJussi Kivilinna d, authsize, j, algo); 669da7f033dSHerbert Xu goto out; 670da7f033dSHerbert Xu } 671da7f033dSHerbert Xu 6728a525fcdSHerbert Xu k = !!template[i].alen; 6738a525fcdSHerbert Xu sg_init_table(sg, k + 1); 6748a525fcdSHerbert Xu sg_set_buf(&sg[0], assoc, template[i].alen); 6758a525fcdSHerbert Xu sg_set_buf(&sg[k], input, 67605b1d338SCristian Stoica template[i].ilen + (enc ? authsize : 0)); 677d8a32ac2SJussi Kivilinna output = input; 678d8a32ac2SJussi Kivilinna 6798a525fcdSHerbert Xu if (diff_dst) { 6808a525fcdSHerbert Xu sg_init_table(sgout, k + 1); 6818a525fcdSHerbert Xu sg_set_buf(&sgout[0], assoc, template[i].alen); 6828a525fcdSHerbert Xu 6838a525fcdSHerbert Xu output = xoutbuf[0]; 6848a525fcdSHerbert Xu output += align_offset; 6858a525fcdSHerbert Xu sg_set_buf(&sgout[k], output, 6868a525fcdSHerbert Xu template[i].rlen + (enc ? 0 : authsize)); 6878a525fcdSHerbert Xu } 688da7f033dSHerbert Xu 689d8a32ac2SJussi Kivilinna aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 690da7f033dSHerbert Xu template[i].ilen, iv); 691da7f033dSHerbert Xu 6928a525fcdSHerbert Xu aead_request_set_ad(req, template[i].alen); 693da7f033dSHerbert Xu 69405b1d338SCristian Stoica ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req); 695da7f033dSHerbert Xu 696da7f033dSHerbert Xu switch (ret) { 697da7f033dSHerbert Xu case 0: 698e44a1b44SJarod Wilson if (template[i].novrfy) { 699e44a1b44SJarod Wilson /* verification was supposed to fail */ 700d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n", 701d8a32ac2SJussi Kivilinna d, e, j, algo); 702e44a1b44SJarod Wilson /* so really, we got a bad message */ 703e44a1b44SJarod Wilson ret = -EBADMSG; 704e44a1b44SJarod Wilson goto out; 705e44a1b44SJarod Wilson } 706da7f033dSHerbert Xu break; 707da7f033dSHerbert Xu case -EINPROGRESS: 708da7f033dSHerbert Xu case -EBUSY: 7098a45ac12SRabin Vincent wait_for_completion(&result.completion); 71016735d02SWolfram Sang reinit_completion(&result.completion); 7118a45ac12SRabin Vincent ret = result.err; 7128a45ac12SRabin Vincent if (!ret) 713da7f033dSHerbert Xu break; 714e44a1b44SJarod Wilson case -EBADMSG: 715e44a1b44SJarod Wilson if (template[i].novrfy) 716e44a1b44SJarod Wilson /* verification failure was expected */ 717e44a1b44SJarod Wilson continue; 718da7f033dSHerbert Xu /* fall through */ 719da7f033dSHerbert Xu default: 720d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n", 721d8a32ac2SJussi Kivilinna d, e, j, algo, -ret); 722da7f033dSHerbert Xu goto out; 723da7f033dSHerbert Xu } 724da7f033dSHerbert Xu 725d8a32ac2SJussi Kivilinna q = output; 726da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 727d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Test %d failed on %s for %s\n", 728d8a32ac2SJussi Kivilinna d, j, e, algo); 729da7f033dSHerbert Xu hexdump(q, template[i].rlen); 730da7f033dSHerbert Xu ret = -EINVAL; 731da7f033dSHerbert Xu goto out; 732da7f033dSHerbert Xu } 733da7f033dSHerbert Xu } 734da7f033dSHerbert Xu 735da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 73658dcf548SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 73758dcf548SJussi Kivilinna if (align_offset != 0) 73858dcf548SJussi Kivilinna break; 73958dcf548SJussi Kivilinna 74005b1d338SCristian Stoica if (!template[i].np) 74105b1d338SCristian Stoica continue; 74205b1d338SCristian Stoica 743da7f033dSHerbert Xu j++; 744da7f033dSHerbert Xu 745da7f033dSHerbert Xu if (template[i].iv) 746abfa7f43SJerome Marchand memcpy(iv, template[i].iv, iv_len); 747da7f033dSHerbert Xu else 748da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 749da7f033dSHerbert Xu 750da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 751da7f033dSHerbert Xu if (template[i].wk) 75205b1d338SCristian Stoica crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 75329b77e5dSHoria Geanta if (template[i].klen > MAX_KEYLEN) { 75429b77e5dSHoria Geanta pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n", 75505b1d338SCristian Stoica d, j, algo, template[i].klen, MAX_KEYLEN); 75629b77e5dSHoria Geanta ret = -EINVAL; 75729b77e5dSHoria Geanta goto out; 75829b77e5dSHoria Geanta } 75929b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].klen); 760da7f033dSHerbert Xu 761da7f033dSHerbert Xu ret = crypto_aead_setkey(tfm, key, template[i].klen); 762da7f033dSHerbert Xu if (!ret == template[i].fail) { 763d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n", 764d8a32ac2SJussi Kivilinna d, j, algo, crypto_aead_get_flags(tfm)); 765da7f033dSHerbert Xu goto out; 766da7f033dSHerbert Xu } else if (ret) 767da7f033dSHerbert Xu continue; 768da7f033dSHerbert Xu 769da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 770da7f033dSHerbert Xu 771da7f033dSHerbert Xu ret = -EINVAL; 7728a525fcdSHerbert Xu sg_init_table(sg, template[i].anp + template[i].np); 773d8a32ac2SJussi Kivilinna if (diff_dst) 7748a525fcdSHerbert Xu sg_init_table(sgout, template[i].anp + template[i].np); 7758a525fcdSHerbert Xu 7768a525fcdSHerbert Xu ret = -EINVAL; 7778a525fcdSHerbert Xu for (k = 0, temp = 0; k < template[i].anp; k++) { 7788a525fcdSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 7798a525fcdSHerbert Xu template[i].atap[k] > PAGE_SIZE)) 7808a525fcdSHerbert Xu goto out; 7818a525fcdSHerbert Xu sg_set_buf(&sg[k], 7828a525fcdSHerbert Xu memcpy(axbuf[IDX[k] >> PAGE_SHIFT] + 7838a525fcdSHerbert Xu offset_in_page(IDX[k]), 7848a525fcdSHerbert Xu template[i].assoc + temp, 7858a525fcdSHerbert Xu template[i].atap[k]), 7868a525fcdSHerbert Xu template[i].atap[k]); 7878a525fcdSHerbert Xu if (diff_dst) 7888a525fcdSHerbert Xu sg_set_buf(&sgout[k], 7898a525fcdSHerbert Xu axbuf[IDX[k] >> PAGE_SHIFT] + 7908a525fcdSHerbert Xu offset_in_page(IDX[k]), 7918a525fcdSHerbert Xu template[i].atap[k]); 7928a525fcdSHerbert Xu temp += template[i].atap[k]; 7938a525fcdSHerbert Xu } 7948a525fcdSHerbert Xu 795da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 796da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 797da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 798da7f033dSHerbert Xu goto out; 799da7f033dSHerbert Xu 80005b1d338SCristian Stoica q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]); 80105b1d338SCristian Stoica memcpy(q, template[i].input + temp, template[i].tap[k]); 8028a525fcdSHerbert Xu sg_set_buf(&sg[template[i].anp + k], 8038a525fcdSHerbert Xu q, template[i].tap[k]); 804d8a32ac2SJussi Kivilinna 805d8a32ac2SJussi Kivilinna if (diff_dst) { 806d8a32ac2SJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 807d8a32ac2SJussi Kivilinna offset_in_page(IDX[k]); 808d8a32ac2SJussi Kivilinna 809d8a32ac2SJussi Kivilinna memset(q, 0, template[i].tap[k]); 810d8a32ac2SJussi Kivilinna 8118a525fcdSHerbert Xu sg_set_buf(&sgout[template[i].anp + k], 8128a525fcdSHerbert Xu q, template[i].tap[k]); 813d8a32ac2SJussi Kivilinna } 814d8a32ac2SJussi Kivilinna 8158ec25c51SHoria Geanta n = template[i].tap[k]; 8168ec25c51SHoria Geanta if (k == template[i].np - 1 && enc) 8178ec25c51SHoria Geanta n += authsize; 8188ec25c51SHoria Geanta if (offset_in_page(q) + n < PAGE_SIZE) 8198ec25c51SHoria Geanta q[n] = 0; 8208ec25c51SHoria Geanta 821da7f033dSHerbert Xu temp += template[i].tap[k]; 822da7f033dSHerbert Xu } 823da7f033dSHerbert Xu 824da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 825da7f033dSHerbert Xu if (ret) { 826d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n", 827d8a32ac2SJussi Kivilinna d, authsize, j, algo); 828da7f033dSHerbert Xu goto out; 829da7f033dSHerbert Xu } 830da7f033dSHerbert Xu 831da7f033dSHerbert Xu if (enc) { 8328a525fcdSHerbert Xu if (WARN_ON(sg[template[i].anp + k - 1].offset + 8338a525fcdSHerbert Xu sg[template[i].anp + k - 1].length + 8348a525fcdSHerbert Xu authsize > PAGE_SIZE)) { 835da7f033dSHerbert Xu ret = -EINVAL; 836da7f033dSHerbert Xu goto out; 837da7f033dSHerbert Xu } 838da7f033dSHerbert Xu 839d8a32ac2SJussi Kivilinna if (diff_dst) 8408a525fcdSHerbert Xu sgout[template[i].anp + k - 1].length += 8418a525fcdSHerbert Xu authsize; 8428a525fcdSHerbert Xu sg[template[i].anp + k - 1].length += authsize; 843da7f033dSHerbert Xu } 844da7f033dSHerbert Xu 845d8a32ac2SJussi Kivilinna aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 846da7f033dSHerbert Xu template[i].ilen, 847da7f033dSHerbert Xu iv); 848da7f033dSHerbert Xu 8498a525fcdSHerbert Xu aead_request_set_ad(req, template[i].alen); 850da7f033dSHerbert Xu 85105b1d338SCristian Stoica ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req); 852da7f033dSHerbert Xu 853da7f033dSHerbert Xu switch (ret) { 854da7f033dSHerbert Xu case 0: 855e44a1b44SJarod Wilson if (template[i].novrfy) { 856e44a1b44SJarod Wilson /* verification was supposed to fail */ 857d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n", 858d8a32ac2SJussi Kivilinna d, e, j, algo); 859e44a1b44SJarod Wilson /* so really, we got a bad message */ 860e44a1b44SJarod Wilson ret = -EBADMSG; 861e44a1b44SJarod Wilson goto out; 862e44a1b44SJarod Wilson } 863da7f033dSHerbert Xu break; 864da7f033dSHerbert Xu case -EINPROGRESS: 865da7f033dSHerbert Xu case -EBUSY: 8668a45ac12SRabin Vincent wait_for_completion(&result.completion); 86716735d02SWolfram Sang reinit_completion(&result.completion); 8688a45ac12SRabin Vincent ret = result.err; 8698a45ac12SRabin Vincent if (!ret) 870da7f033dSHerbert Xu break; 871e44a1b44SJarod Wilson case -EBADMSG: 872e44a1b44SJarod Wilson if (template[i].novrfy) 873e44a1b44SJarod Wilson /* verification failure was expected */ 874e44a1b44SJarod Wilson continue; 875da7f033dSHerbert Xu /* fall through */ 876da7f033dSHerbert Xu default: 877d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n", 878d8a32ac2SJussi Kivilinna d, e, j, algo, -ret); 879da7f033dSHerbert Xu goto out; 880da7f033dSHerbert Xu } 881da7f033dSHerbert Xu 882da7f033dSHerbert Xu ret = -EINVAL; 883da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 884d8a32ac2SJussi Kivilinna if (diff_dst) 885d8a32ac2SJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 886d8a32ac2SJussi Kivilinna offset_in_page(IDX[k]); 887d8a32ac2SJussi Kivilinna else 888da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 889da7f033dSHerbert Xu offset_in_page(IDX[k]); 890da7f033dSHerbert Xu 891da7f033dSHerbert Xu n = template[i].tap[k]; 892da7f033dSHerbert Xu if (k == template[i].np - 1) 893da7f033dSHerbert Xu n += enc ? authsize : -authsize; 894da7f033dSHerbert Xu 895da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, n)) { 896d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n", 897d8a32ac2SJussi Kivilinna d, j, e, k, algo); 898da7f033dSHerbert Xu hexdump(q, n); 899da7f033dSHerbert Xu goto out; 900da7f033dSHerbert Xu } 901da7f033dSHerbert Xu 902da7f033dSHerbert Xu q += n; 903da7f033dSHerbert Xu if (k == template[i].np - 1 && !enc) { 904d8a32ac2SJussi Kivilinna if (!diff_dst && 905d8a32ac2SJussi Kivilinna memcmp(q, template[i].input + 906da7f033dSHerbert Xu temp + n, authsize)) 907da7f033dSHerbert Xu n = authsize; 908da7f033dSHerbert Xu else 909da7f033dSHerbert Xu n = 0; 910da7f033dSHerbert Xu } else { 91105b1d338SCristian Stoica for (n = 0; offset_in_page(q + n) && q[n]; n++) 912da7f033dSHerbert Xu ; 913da7f033dSHerbert Xu } 914da7f033dSHerbert Xu if (n) { 915d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n", 916d8a32ac2SJussi Kivilinna d, j, e, k, algo, n); 917da7f033dSHerbert Xu hexdump(q, n); 918da7f033dSHerbert Xu goto out; 919da7f033dSHerbert Xu } 920da7f033dSHerbert Xu 921da7f033dSHerbert Xu temp += template[i].tap[k]; 922da7f033dSHerbert Xu } 923da7f033dSHerbert Xu } 924da7f033dSHerbert Xu 925da7f033dSHerbert Xu ret = 0; 926da7f033dSHerbert Xu 927da7f033dSHerbert Xu out: 928da7f033dSHerbert Xu aead_request_free(req); 929d8a32ac2SJussi Kivilinna kfree(sg); 930d8a32ac2SJussi Kivilinna out_nosg: 931d8a32ac2SJussi Kivilinna if (diff_dst) 932d8a32ac2SJussi Kivilinna testmgr_free_buf(xoutbuf); 933d8a32ac2SJussi Kivilinna out_nooutbuf: 934f8b0d4d0SHerbert Xu testmgr_free_buf(axbuf); 935f8b0d4d0SHerbert Xu out_noaxbuf: 936f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 937f8b0d4d0SHerbert Xu out_noxbuf: 93829b77e5dSHoria Geanta kfree(key); 9399bac019dSTadeusz Struk kfree(iv); 940da7f033dSHerbert Xu return ret; 941da7f033dSHerbert Xu } 942da7f033dSHerbert Xu 943d8a32ac2SJussi Kivilinna static int test_aead(struct crypto_aead *tfm, int enc, 944d8a32ac2SJussi Kivilinna struct aead_testvec *template, unsigned int tcount) 945d8a32ac2SJussi Kivilinna { 94658dcf548SJussi Kivilinna unsigned int alignmask; 947d8a32ac2SJussi Kivilinna int ret; 948d8a32ac2SJussi Kivilinna 949d8a32ac2SJussi Kivilinna /* test 'dst == src' case */ 95058dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, false, 0); 951d8a32ac2SJussi Kivilinna if (ret) 952d8a32ac2SJussi Kivilinna return ret; 953d8a32ac2SJussi Kivilinna 954d8a32ac2SJussi Kivilinna /* test 'dst != src' case */ 95558dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 0); 95658dcf548SJussi Kivilinna if (ret) 95758dcf548SJussi Kivilinna return ret; 95858dcf548SJussi Kivilinna 95958dcf548SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 96058dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 1); 96158dcf548SJussi Kivilinna if (ret) 96258dcf548SJussi Kivilinna return ret; 96358dcf548SJussi Kivilinna 96458dcf548SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 96558dcf548SJussi Kivilinna if (alignmask) { 96658dcf548SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 96758dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 96858dcf548SJussi Kivilinna alignmask + 1); 96958dcf548SJussi Kivilinna if (ret) 97058dcf548SJussi Kivilinna return ret; 97158dcf548SJussi Kivilinna } 97258dcf548SJussi Kivilinna 97358dcf548SJussi Kivilinna return 0; 974d8a32ac2SJussi Kivilinna } 975d8a32ac2SJussi Kivilinna 9761aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc, 9771aa4ecd9SHerbert Xu struct cipher_testvec *template, unsigned int tcount) 9781aa4ecd9SHerbert Xu { 9791aa4ecd9SHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm)); 9801aa4ecd9SHerbert Xu unsigned int i, j, k; 9811aa4ecd9SHerbert Xu char *q; 9821aa4ecd9SHerbert Xu const char *e; 9831aa4ecd9SHerbert Xu void *data; 984f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 985f8b0d4d0SHerbert Xu int ret = -ENOMEM; 986f8b0d4d0SHerbert Xu 987f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 988f8b0d4d0SHerbert Xu goto out_nobuf; 9891aa4ecd9SHerbert Xu 9901aa4ecd9SHerbert Xu if (enc == ENCRYPT) 9911aa4ecd9SHerbert Xu e = "encryption"; 9921aa4ecd9SHerbert Xu else 9931aa4ecd9SHerbert Xu e = "decryption"; 9941aa4ecd9SHerbert Xu 9951aa4ecd9SHerbert Xu j = 0; 9961aa4ecd9SHerbert Xu for (i = 0; i < tcount; i++) { 9971aa4ecd9SHerbert Xu if (template[i].np) 9981aa4ecd9SHerbert Xu continue; 9991aa4ecd9SHerbert Xu 10001aa4ecd9SHerbert Xu j++; 10011aa4ecd9SHerbert Xu 1002fd57f22aSHerbert Xu ret = -EINVAL; 1003fd57f22aSHerbert Xu if (WARN_ON(template[i].ilen > PAGE_SIZE)) 1004fd57f22aSHerbert Xu goto out; 1005fd57f22aSHerbert Xu 10061aa4ecd9SHerbert Xu data = xbuf[0]; 10071aa4ecd9SHerbert Xu memcpy(data, template[i].input, template[i].ilen); 10081aa4ecd9SHerbert Xu 10091aa4ecd9SHerbert Xu crypto_cipher_clear_flags(tfm, ~0); 10101aa4ecd9SHerbert Xu if (template[i].wk) 10111aa4ecd9SHerbert Xu crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 10121aa4ecd9SHerbert Xu 10131aa4ecd9SHerbert Xu ret = crypto_cipher_setkey(tfm, template[i].key, 10141aa4ecd9SHerbert Xu template[i].klen); 10151aa4ecd9SHerbert Xu if (!ret == template[i].fail) { 10161aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: setkey failed " 10171aa4ecd9SHerbert Xu "on test %d for %s: flags=%x\n", j, 10181aa4ecd9SHerbert Xu algo, crypto_cipher_get_flags(tfm)); 10191aa4ecd9SHerbert Xu goto out; 10201aa4ecd9SHerbert Xu } else if (ret) 10211aa4ecd9SHerbert Xu continue; 10221aa4ecd9SHerbert Xu 10231aa4ecd9SHerbert Xu for (k = 0; k < template[i].ilen; 10241aa4ecd9SHerbert Xu k += crypto_cipher_blocksize(tfm)) { 10251aa4ecd9SHerbert Xu if (enc) 10261aa4ecd9SHerbert Xu crypto_cipher_encrypt_one(tfm, data + k, 10271aa4ecd9SHerbert Xu data + k); 10281aa4ecd9SHerbert Xu else 10291aa4ecd9SHerbert Xu crypto_cipher_decrypt_one(tfm, data + k, 10301aa4ecd9SHerbert Xu data + k); 10311aa4ecd9SHerbert Xu } 10321aa4ecd9SHerbert Xu 10331aa4ecd9SHerbert Xu q = data; 10341aa4ecd9SHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 10351aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: Test %d failed " 10361aa4ecd9SHerbert Xu "on %s for %s\n", j, e, algo); 10371aa4ecd9SHerbert Xu hexdump(q, template[i].rlen); 10381aa4ecd9SHerbert Xu ret = -EINVAL; 10391aa4ecd9SHerbert Xu goto out; 10401aa4ecd9SHerbert Xu } 10411aa4ecd9SHerbert Xu } 10421aa4ecd9SHerbert Xu 10431aa4ecd9SHerbert Xu ret = 0; 10441aa4ecd9SHerbert Xu 10451aa4ecd9SHerbert Xu out: 1046f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 1047f8b0d4d0SHerbert Xu out_nobuf: 10481aa4ecd9SHerbert Xu return ret; 10491aa4ecd9SHerbert Xu } 10501aa4ecd9SHerbert Xu 105112773d93SHerbert Xu static int __test_skcipher(struct crypto_skcipher *tfm, int enc, 105208d6af8cSJussi Kivilinna struct cipher_testvec *template, unsigned int tcount, 10533a338f20SJussi Kivilinna const bool diff_dst, const int align_offset) 1054da7f033dSHerbert Xu { 1055da7f033dSHerbert Xu const char *algo = 105612773d93SHerbert Xu crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)); 1057da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 1058da7f033dSHerbert Xu char *q; 105912773d93SHerbert Xu struct skcipher_request *req; 1060da7f033dSHerbert Xu struct scatterlist sg[8]; 106108d6af8cSJussi Kivilinna struct scatterlist sgout[8]; 106208d6af8cSJussi Kivilinna const char *e, *d; 1063da7f033dSHerbert Xu struct tcrypt_result result; 1064da7f033dSHerbert Xu void *data; 1065da7f033dSHerbert Xu char iv[MAX_IVLEN]; 1066f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 106708d6af8cSJussi Kivilinna char *xoutbuf[XBUFSIZE]; 1068f8b0d4d0SHerbert Xu int ret = -ENOMEM; 106984cba178SAndrey Ryabinin unsigned int ivsize = crypto_skcipher_ivsize(tfm); 1070f8b0d4d0SHerbert Xu 1071f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 1072f8b0d4d0SHerbert Xu goto out_nobuf; 1073da7f033dSHerbert Xu 107408d6af8cSJussi Kivilinna if (diff_dst && testmgr_alloc_buf(xoutbuf)) 107508d6af8cSJussi Kivilinna goto out_nooutbuf; 107608d6af8cSJussi Kivilinna 107708d6af8cSJussi Kivilinna if (diff_dst) 107808d6af8cSJussi Kivilinna d = "-ddst"; 107908d6af8cSJussi Kivilinna else 108008d6af8cSJussi Kivilinna d = ""; 108108d6af8cSJussi Kivilinna 1082da7f033dSHerbert Xu if (enc == ENCRYPT) 1083da7f033dSHerbert Xu e = "encryption"; 1084da7f033dSHerbert Xu else 1085da7f033dSHerbert Xu e = "decryption"; 1086da7f033dSHerbert Xu 1087da7f033dSHerbert Xu init_completion(&result.completion); 1088da7f033dSHerbert Xu 108912773d93SHerbert Xu req = skcipher_request_alloc(tfm, GFP_KERNEL); 1090da7f033dSHerbert Xu if (!req) { 109108d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Failed to allocate request for %s\n", 109208d6af8cSJussi Kivilinna d, algo); 1093da7f033dSHerbert Xu goto out; 1094da7f033dSHerbert Xu } 1095da7f033dSHerbert Xu 109612773d93SHerbert Xu skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 1097da7f033dSHerbert Xu tcrypt_complete, &result); 1098da7f033dSHerbert Xu 1099da7f033dSHerbert Xu j = 0; 1100da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 1101bbb9a7ddSCristian Stoica if (template[i].np && !template[i].also_non_np) 1102bbb9a7ddSCristian Stoica continue; 1103bbb9a7ddSCristian Stoica 1104da7f033dSHerbert Xu if (template[i].iv) 110584cba178SAndrey Ryabinin memcpy(iv, template[i].iv, ivsize); 1106da7f033dSHerbert Xu else 1107da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 1108da7f033dSHerbert Xu 1109da7f033dSHerbert Xu j++; 1110fd57f22aSHerbert Xu ret = -EINVAL; 1111a1aa44a2SCristian Stoica if (WARN_ON(align_offset + template[i].ilen > PAGE_SIZE)) 1112fd57f22aSHerbert Xu goto out; 1113fd57f22aSHerbert Xu 1114da7f033dSHerbert Xu data = xbuf[0]; 11153a338f20SJussi Kivilinna data += align_offset; 1116da7f033dSHerbert Xu memcpy(data, template[i].input, template[i].ilen); 1117da7f033dSHerbert Xu 111812773d93SHerbert Xu crypto_skcipher_clear_flags(tfm, ~0); 1119da7f033dSHerbert Xu if (template[i].wk) 112012773d93SHerbert Xu crypto_skcipher_set_flags(tfm, 112112773d93SHerbert Xu CRYPTO_TFM_REQ_WEAK_KEY); 1122da7f033dSHerbert Xu 112312773d93SHerbert Xu ret = crypto_skcipher_setkey(tfm, template[i].key, 1124da7f033dSHerbert Xu template[i].klen); 1125da7f033dSHerbert Xu if (!ret == template[i].fail) { 112608d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n", 112712773d93SHerbert Xu d, j, algo, crypto_skcipher_get_flags(tfm)); 1128da7f033dSHerbert Xu goto out; 1129da7f033dSHerbert Xu } else if (ret) 1130da7f033dSHerbert Xu continue; 1131da7f033dSHerbert Xu 1132da7f033dSHerbert Xu sg_init_one(&sg[0], data, template[i].ilen); 113308d6af8cSJussi Kivilinna if (diff_dst) { 113408d6af8cSJussi Kivilinna data = xoutbuf[0]; 11353a338f20SJussi Kivilinna data += align_offset; 113608d6af8cSJussi Kivilinna sg_init_one(&sgout[0], data, template[i].ilen); 113708d6af8cSJussi Kivilinna } 1138da7f033dSHerbert Xu 113912773d93SHerbert Xu skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 1140da7f033dSHerbert Xu template[i].ilen, iv); 114112773d93SHerbert Xu ret = enc ? crypto_skcipher_encrypt(req) : 114212773d93SHerbert Xu crypto_skcipher_decrypt(req); 1143da7f033dSHerbert Xu 1144da7f033dSHerbert Xu switch (ret) { 1145da7f033dSHerbert Xu case 0: 1146da7f033dSHerbert Xu break; 1147da7f033dSHerbert Xu case -EINPROGRESS: 1148da7f033dSHerbert Xu case -EBUSY: 11498a45ac12SRabin Vincent wait_for_completion(&result.completion); 115016735d02SWolfram Sang reinit_completion(&result.completion); 11518a45ac12SRabin Vincent ret = result.err; 11528a45ac12SRabin Vincent if (!ret) 1153da7f033dSHerbert Xu break; 1154da7f033dSHerbert Xu /* fall through */ 1155da7f033dSHerbert Xu default: 115608d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n", 115708d6af8cSJussi Kivilinna d, e, j, algo, -ret); 1158da7f033dSHerbert Xu goto out; 1159da7f033dSHerbert Xu } 1160da7f033dSHerbert Xu 1161da7f033dSHerbert Xu q = data; 1162da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 11638a826a34SBoris BREZILLON pr_err("alg: skcipher%s: Test %d failed (invalid result) on %s for %s\n", 116408d6af8cSJussi Kivilinna d, j, e, algo); 1165da7f033dSHerbert Xu hexdump(q, template[i].rlen); 1166da7f033dSHerbert Xu ret = -EINVAL; 1167da7f033dSHerbert Xu goto out; 1168da7f033dSHerbert Xu } 11698a826a34SBoris BREZILLON 11708a826a34SBoris BREZILLON if (template[i].iv_out && 11718a826a34SBoris BREZILLON memcmp(iv, template[i].iv_out, 11728a826a34SBoris BREZILLON crypto_skcipher_ivsize(tfm))) { 11738a826a34SBoris BREZILLON pr_err("alg: skcipher%s: Test %d failed (invalid output IV) on %s for %s\n", 11748a826a34SBoris BREZILLON d, j, e, algo); 11758a826a34SBoris BREZILLON hexdump(iv, crypto_skcipher_ivsize(tfm)); 11768a826a34SBoris BREZILLON ret = -EINVAL; 11778a826a34SBoris BREZILLON goto out; 11788a826a34SBoris BREZILLON } 1179da7f033dSHerbert Xu } 1180da7f033dSHerbert Xu 1181da7f033dSHerbert Xu j = 0; 1182da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 11833a338f20SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 11843a338f20SJussi Kivilinna if (align_offset != 0) 11853a338f20SJussi Kivilinna break; 1186da7f033dSHerbert Xu 1187bbb9a7ddSCristian Stoica if (!template[i].np) 1188bbb9a7ddSCristian Stoica continue; 1189bbb9a7ddSCristian Stoica 1190da7f033dSHerbert Xu if (template[i].iv) 119184cba178SAndrey Ryabinin memcpy(iv, template[i].iv, ivsize); 1192da7f033dSHerbert Xu else 1193da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 1194da7f033dSHerbert Xu 1195da7f033dSHerbert Xu j++; 119612773d93SHerbert Xu crypto_skcipher_clear_flags(tfm, ~0); 1197da7f033dSHerbert Xu if (template[i].wk) 119812773d93SHerbert Xu crypto_skcipher_set_flags(tfm, 119912773d93SHerbert Xu CRYPTO_TFM_REQ_WEAK_KEY); 1200da7f033dSHerbert Xu 120112773d93SHerbert Xu ret = crypto_skcipher_setkey(tfm, template[i].key, 1202da7f033dSHerbert Xu template[i].klen); 1203da7f033dSHerbert Xu if (!ret == template[i].fail) { 120408d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n", 120512773d93SHerbert Xu d, j, algo, crypto_skcipher_get_flags(tfm)); 1206da7f033dSHerbert Xu goto out; 1207da7f033dSHerbert Xu } else if (ret) 1208da7f033dSHerbert Xu continue; 1209da7f033dSHerbert Xu 1210da7f033dSHerbert Xu temp = 0; 1211da7f033dSHerbert Xu ret = -EINVAL; 1212da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 121308d6af8cSJussi Kivilinna if (diff_dst) 121408d6af8cSJussi Kivilinna sg_init_table(sgout, template[i].np); 1215da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 1216da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 1217da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 1218da7f033dSHerbert Xu goto out; 1219da7f033dSHerbert Xu 1220a1aa44a2SCristian Stoica q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]); 1221da7f033dSHerbert Xu 1222a1aa44a2SCristian Stoica memcpy(q, template[i].input + temp, template[i].tap[k]); 1223da7f033dSHerbert Xu 1224a1aa44a2SCristian Stoica if (offset_in_page(q) + template[i].tap[k] < PAGE_SIZE) 1225da7f033dSHerbert Xu q[template[i].tap[k]] = 0; 1226da7f033dSHerbert Xu 1227da7f033dSHerbert Xu sg_set_buf(&sg[k], q, template[i].tap[k]); 122808d6af8cSJussi Kivilinna if (diff_dst) { 122908d6af8cSJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 123008d6af8cSJussi Kivilinna offset_in_page(IDX[k]); 123108d6af8cSJussi Kivilinna 1232a1aa44a2SCristian Stoica sg_set_buf(&sgout[k], q, template[i].tap[k]); 123308d6af8cSJussi Kivilinna 123408d6af8cSJussi Kivilinna memset(q, 0, template[i].tap[k]); 123508d6af8cSJussi Kivilinna if (offset_in_page(q) + 123608d6af8cSJussi Kivilinna template[i].tap[k] < PAGE_SIZE) 123708d6af8cSJussi Kivilinna q[template[i].tap[k]] = 0; 123808d6af8cSJussi Kivilinna } 1239da7f033dSHerbert Xu 1240da7f033dSHerbert Xu temp += template[i].tap[k]; 1241da7f033dSHerbert Xu } 1242da7f033dSHerbert Xu 124312773d93SHerbert Xu skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 1244da7f033dSHerbert Xu template[i].ilen, iv); 1245da7f033dSHerbert Xu 124612773d93SHerbert Xu ret = enc ? crypto_skcipher_encrypt(req) : 124712773d93SHerbert Xu crypto_skcipher_decrypt(req); 1248da7f033dSHerbert Xu 1249da7f033dSHerbert Xu switch (ret) { 1250da7f033dSHerbert Xu case 0: 1251da7f033dSHerbert Xu break; 1252da7f033dSHerbert Xu case -EINPROGRESS: 1253da7f033dSHerbert Xu case -EBUSY: 12548a45ac12SRabin Vincent wait_for_completion(&result.completion); 125516735d02SWolfram Sang reinit_completion(&result.completion); 12568a45ac12SRabin Vincent ret = result.err; 12578a45ac12SRabin Vincent if (!ret) 1258da7f033dSHerbert Xu break; 1259da7f033dSHerbert Xu /* fall through */ 1260da7f033dSHerbert Xu default: 126108d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n", 126208d6af8cSJussi Kivilinna d, e, j, algo, -ret); 1263da7f033dSHerbert Xu goto out; 1264da7f033dSHerbert Xu } 1265da7f033dSHerbert Xu 1266da7f033dSHerbert Xu temp = 0; 1267da7f033dSHerbert Xu ret = -EINVAL; 1268da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 126908d6af8cSJussi Kivilinna if (diff_dst) 127008d6af8cSJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 127108d6af8cSJussi Kivilinna offset_in_page(IDX[k]); 127208d6af8cSJussi Kivilinna else 1273da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 1274da7f033dSHerbert Xu offset_in_page(IDX[k]); 1275da7f033dSHerbert Xu 1276da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, 1277da7f033dSHerbert Xu template[i].tap[k])) { 127808d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n", 127908d6af8cSJussi Kivilinna d, j, e, k, algo); 1280da7f033dSHerbert Xu hexdump(q, template[i].tap[k]); 1281da7f033dSHerbert Xu goto out; 1282da7f033dSHerbert Xu } 1283da7f033dSHerbert Xu 1284da7f033dSHerbert Xu q += template[i].tap[k]; 1285da7f033dSHerbert Xu for (n = 0; offset_in_page(q + n) && q[n]; n++) 1286da7f033dSHerbert Xu ; 1287da7f033dSHerbert Xu if (n) { 128808d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n", 128908d6af8cSJussi Kivilinna d, j, e, k, algo, n); 1290da7f033dSHerbert Xu hexdump(q, n); 1291da7f033dSHerbert Xu goto out; 1292da7f033dSHerbert Xu } 1293da7f033dSHerbert Xu temp += template[i].tap[k]; 1294da7f033dSHerbert Xu } 1295da7f033dSHerbert Xu } 1296da7f033dSHerbert Xu 1297da7f033dSHerbert Xu ret = 0; 1298da7f033dSHerbert Xu 1299da7f033dSHerbert Xu out: 130012773d93SHerbert Xu skcipher_request_free(req); 130108d6af8cSJussi Kivilinna if (diff_dst) 130208d6af8cSJussi Kivilinna testmgr_free_buf(xoutbuf); 130308d6af8cSJussi Kivilinna out_nooutbuf: 1304f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 1305f8b0d4d0SHerbert Xu out_nobuf: 1306da7f033dSHerbert Xu return ret; 1307da7f033dSHerbert Xu } 1308da7f033dSHerbert Xu 130912773d93SHerbert Xu static int test_skcipher(struct crypto_skcipher *tfm, int enc, 131008d6af8cSJussi Kivilinna struct cipher_testvec *template, unsigned int tcount) 131108d6af8cSJussi Kivilinna { 13123a338f20SJussi Kivilinna unsigned int alignmask; 131308d6af8cSJussi Kivilinna int ret; 131408d6af8cSJussi Kivilinna 131508d6af8cSJussi Kivilinna /* test 'dst == src' case */ 13163a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, false, 0); 131708d6af8cSJussi Kivilinna if (ret) 131808d6af8cSJussi Kivilinna return ret; 131908d6af8cSJussi Kivilinna 132008d6af8cSJussi Kivilinna /* test 'dst != src' case */ 13213a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 0); 13223a338f20SJussi Kivilinna if (ret) 13233a338f20SJussi Kivilinna return ret; 13243a338f20SJussi Kivilinna 13253a338f20SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 13263a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 1); 13273a338f20SJussi Kivilinna if (ret) 13283a338f20SJussi Kivilinna return ret; 13293a338f20SJussi Kivilinna 13303a338f20SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 13313a338f20SJussi Kivilinna if (alignmask) { 13323a338f20SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 13333a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 13343a338f20SJussi Kivilinna alignmask + 1); 13353a338f20SJussi Kivilinna if (ret) 13363a338f20SJussi Kivilinna return ret; 13373a338f20SJussi Kivilinna } 13383a338f20SJussi Kivilinna 13393a338f20SJussi Kivilinna return 0; 134008d6af8cSJussi Kivilinna } 134108d6af8cSJussi Kivilinna 1342da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate, 1343da7f033dSHerbert Xu struct comp_testvec *dtemplate, int ctcount, int dtcount) 1344da7f033dSHerbert Xu { 1345da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm)); 1346da7f033dSHerbert Xu unsigned int i; 1347da7f033dSHerbert Xu char result[COMP_BUF_SIZE]; 1348da7f033dSHerbert Xu int ret; 1349da7f033dSHerbert Xu 1350da7f033dSHerbert Xu for (i = 0; i < ctcount; i++) { 1351c79cf910SGeert Uytterhoeven int ilen; 1352c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 1353da7f033dSHerbert Xu 1354da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 1355da7f033dSHerbert Xu 1356da7f033dSHerbert Xu ilen = ctemplate[i].inlen; 1357da7f033dSHerbert Xu ret = crypto_comp_compress(tfm, ctemplate[i].input, 1358da7f033dSHerbert Xu ilen, result, &dlen); 1359da7f033dSHerbert Xu if (ret) { 1360da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: compression failed " 1361da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1362da7f033dSHerbert Xu -ret); 1363da7f033dSHerbert Xu goto out; 1364da7f033dSHerbert Xu } 1365da7f033dSHerbert Xu 1366b812eb00SGeert Uytterhoeven if (dlen != ctemplate[i].outlen) { 1367b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Compression test %d " 1368b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1369b812eb00SGeert Uytterhoeven dlen); 1370b812eb00SGeert Uytterhoeven ret = -EINVAL; 1371b812eb00SGeert Uytterhoeven goto out; 1372b812eb00SGeert Uytterhoeven } 1373b812eb00SGeert Uytterhoeven 1374da7f033dSHerbert Xu if (memcmp(result, ctemplate[i].output, dlen)) { 1375da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Compression test %d " 1376da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 1377da7f033dSHerbert Xu hexdump(result, dlen); 1378da7f033dSHerbert Xu ret = -EINVAL; 1379da7f033dSHerbert Xu goto out; 1380da7f033dSHerbert Xu } 1381da7f033dSHerbert Xu } 1382da7f033dSHerbert Xu 1383da7f033dSHerbert Xu for (i = 0; i < dtcount; i++) { 1384c79cf910SGeert Uytterhoeven int ilen; 1385c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 1386da7f033dSHerbert Xu 1387da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 1388da7f033dSHerbert Xu 1389da7f033dSHerbert Xu ilen = dtemplate[i].inlen; 1390da7f033dSHerbert Xu ret = crypto_comp_decompress(tfm, dtemplate[i].input, 1391da7f033dSHerbert Xu ilen, result, &dlen); 1392da7f033dSHerbert Xu if (ret) { 1393da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: decompression failed " 1394da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1395da7f033dSHerbert Xu -ret); 1396da7f033dSHerbert Xu goto out; 1397da7f033dSHerbert Xu } 1398da7f033dSHerbert Xu 1399b812eb00SGeert Uytterhoeven if (dlen != dtemplate[i].outlen) { 1400b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Decompression test %d " 1401b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1402b812eb00SGeert Uytterhoeven dlen); 1403b812eb00SGeert Uytterhoeven ret = -EINVAL; 1404b812eb00SGeert Uytterhoeven goto out; 1405b812eb00SGeert Uytterhoeven } 1406b812eb00SGeert Uytterhoeven 1407da7f033dSHerbert Xu if (memcmp(result, dtemplate[i].output, dlen)) { 1408da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Decompression test %d " 1409da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 1410da7f033dSHerbert Xu hexdump(result, dlen); 1411da7f033dSHerbert Xu ret = -EINVAL; 1412da7f033dSHerbert Xu goto out; 1413da7f033dSHerbert Xu } 1414da7f033dSHerbert Xu } 1415da7f033dSHerbert Xu 1416da7f033dSHerbert Xu ret = 0; 1417da7f033dSHerbert Xu 1418da7f033dSHerbert Xu out: 1419da7f033dSHerbert Xu return ret; 1420da7f033dSHerbert Xu } 1421da7f033dSHerbert Xu 14227647d6ceSJarod Wilson static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template, 14237647d6ceSJarod Wilson unsigned int tcount) 14247647d6ceSJarod Wilson { 14257647d6ceSJarod Wilson const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm)); 1426fa4ef8a6SFelipe Contreras int err = 0, i, j, seedsize; 14277647d6ceSJarod Wilson u8 *seed; 14287647d6ceSJarod Wilson char result[32]; 14297647d6ceSJarod Wilson 14307647d6ceSJarod Wilson seedsize = crypto_rng_seedsize(tfm); 14317647d6ceSJarod Wilson 14327647d6ceSJarod Wilson seed = kmalloc(seedsize, GFP_KERNEL); 14337647d6ceSJarod Wilson if (!seed) { 14347647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to allocate seed space " 14357647d6ceSJarod Wilson "for %s\n", algo); 14367647d6ceSJarod Wilson return -ENOMEM; 14377647d6ceSJarod Wilson } 14387647d6ceSJarod Wilson 14397647d6ceSJarod Wilson for (i = 0; i < tcount; i++) { 14407647d6ceSJarod Wilson memset(result, 0, 32); 14417647d6ceSJarod Wilson 14427647d6ceSJarod Wilson memcpy(seed, template[i].v, template[i].vlen); 14437647d6ceSJarod Wilson memcpy(seed + template[i].vlen, template[i].key, 14447647d6ceSJarod Wilson template[i].klen); 14457647d6ceSJarod Wilson memcpy(seed + template[i].vlen + template[i].klen, 14467647d6ceSJarod Wilson template[i].dt, template[i].dtlen); 14477647d6ceSJarod Wilson 14487647d6ceSJarod Wilson err = crypto_rng_reset(tfm, seed, seedsize); 14497647d6ceSJarod Wilson if (err) { 14507647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to reset rng " 14517647d6ceSJarod Wilson "for %s\n", algo); 14527647d6ceSJarod Wilson goto out; 14537647d6ceSJarod Wilson } 14547647d6ceSJarod Wilson 14557647d6ceSJarod Wilson for (j = 0; j < template[i].loops; j++) { 14567647d6ceSJarod Wilson err = crypto_rng_get_bytes(tfm, result, 14577647d6ceSJarod Wilson template[i].rlen); 145819e60e13SStephan Mueller if (err < 0) { 14597647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to obtain " 14607647d6ceSJarod Wilson "the correct amount of random data for " 146119e60e13SStephan Mueller "%s (requested %d)\n", algo, 146219e60e13SStephan Mueller template[i].rlen); 14637647d6ceSJarod Wilson goto out; 14647647d6ceSJarod Wilson } 14657647d6ceSJarod Wilson } 14667647d6ceSJarod Wilson 14677647d6ceSJarod Wilson err = memcmp(result, template[i].result, 14687647d6ceSJarod Wilson template[i].rlen); 14697647d6ceSJarod Wilson if (err) { 14707647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Test %d failed for %s\n", 14717647d6ceSJarod Wilson i, algo); 14727647d6ceSJarod Wilson hexdump(result, template[i].rlen); 14737647d6ceSJarod Wilson err = -EINVAL; 14747647d6ceSJarod Wilson goto out; 14757647d6ceSJarod Wilson } 14767647d6ceSJarod Wilson } 14777647d6ceSJarod Wilson 14787647d6ceSJarod Wilson out: 14797647d6ceSJarod Wilson kfree(seed); 14807647d6ceSJarod Wilson return err; 14817647d6ceSJarod Wilson } 14827647d6ceSJarod Wilson 1483da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver, 1484da7f033dSHerbert Xu u32 type, u32 mask) 1485da7f033dSHerbert Xu { 1486da7f033dSHerbert Xu struct crypto_aead *tfm; 1487da7f033dSHerbert Xu int err = 0; 1488da7f033dSHerbert Xu 1489425a8829SStephan Mueller tfm = crypto_alloc_aead(driver, type | CRYPTO_ALG_INTERNAL, mask); 1490da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1491da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to load transform for %s: " 1492da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1493da7f033dSHerbert Xu return PTR_ERR(tfm); 1494da7f033dSHerbert Xu } 1495da7f033dSHerbert Xu 1496da7f033dSHerbert Xu if (desc->suite.aead.enc.vecs) { 1497da7f033dSHerbert Xu err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs, 1498da7f033dSHerbert Xu desc->suite.aead.enc.count); 1499da7f033dSHerbert Xu if (err) 1500da7f033dSHerbert Xu goto out; 1501da7f033dSHerbert Xu } 1502da7f033dSHerbert Xu 1503da7f033dSHerbert Xu if (!err && desc->suite.aead.dec.vecs) 1504da7f033dSHerbert Xu err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs, 1505da7f033dSHerbert Xu desc->suite.aead.dec.count); 1506da7f033dSHerbert Xu 1507da7f033dSHerbert Xu out: 1508da7f033dSHerbert Xu crypto_free_aead(tfm); 1509da7f033dSHerbert Xu return err; 1510da7f033dSHerbert Xu } 1511da7f033dSHerbert Xu 1512da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc, 1513da7f033dSHerbert Xu const char *driver, u32 type, u32 mask) 1514da7f033dSHerbert Xu { 15151aa4ecd9SHerbert Xu struct crypto_cipher *tfm; 1516da7f033dSHerbert Xu int err = 0; 1517da7f033dSHerbert Xu 1518425a8829SStephan Mueller tfm = crypto_alloc_cipher(driver, type | CRYPTO_ALG_INTERNAL, mask); 1519da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1520da7f033dSHerbert Xu printk(KERN_ERR "alg: cipher: Failed to load transform for " 1521da7f033dSHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 1522da7f033dSHerbert Xu return PTR_ERR(tfm); 1523da7f033dSHerbert Xu } 1524da7f033dSHerbert Xu 1525da7f033dSHerbert Xu if (desc->suite.cipher.enc.vecs) { 1526da7f033dSHerbert Xu err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 1527da7f033dSHerbert Xu desc->suite.cipher.enc.count); 1528da7f033dSHerbert Xu if (err) 1529da7f033dSHerbert Xu goto out; 1530da7f033dSHerbert Xu } 1531da7f033dSHerbert Xu 1532da7f033dSHerbert Xu if (desc->suite.cipher.dec.vecs) 1533da7f033dSHerbert Xu err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 1534da7f033dSHerbert Xu desc->suite.cipher.dec.count); 1535da7f033dSHerbert Xu 1536da7f033dSHerbert Xu out: 15371aa4ecd9SHerbert Xu crypto_free_cipher(tfm); 15381aa4ecd9SHerbert Xu return err; 15391aa4ecd9SHerbert Xu } 15401aa4ecd9SHerbert Xu 15411aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc, 15421aa4ecd9SHerbert Xu const char *driver, u32 type, u32 mask) 15431aa4ecd9SHerbert Xu { 154412773d93SHerbert Xu struct crypto_skcipher *tfm; 15451aa4ecd9SHerbert Xu int err = 0; 15461aa4ecd9SHerbert Xu 154712773d93SHerbert Xu tfm = crypto_alloc_skcipher(driver, type | CRYPTO_ALG_INTERNAL, mask); 15481aa4ecd9SHerbert Xu if (IS_ERR(tfm)) { 15491aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Failed to load transform for " 15501aa4ecd9SHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 15511aa4ecd9SHerbert Xu return PTR_ERR(tfm); 15521aa4ecd9SHerbert Xu } 15531aa4ecd9SHerbert Xu 15541aa4ecd9SHerbert Xu if (desc->suite.cipher.enc.vecs) { 15551aa4ecd9SHerbert Xu err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 15561aa4ecd9SHerbert Xu desc->suite.cipher.enc.count); 15571aa4ecd9SHerbert Xu if (err) 15581aa4ecd9SHerbert Xu goto out; 15591aa4ecd9SHerbert Xu } 15601aa4ecd9SHerbert Xu 15611aa4ecd9SHerbert Xu if (desc->suite.cipher.dec.vecs) 15621aa4ecd9SHerbert Xu err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 15631aa4ecd9SHerbert Xu desc->suite.cipher.dec.count); 15641aa4ecd9SHerbert Xu 15651aa4ecd9SHerbert Xu out: 156612773d93SHerbert Xu crypto_free_skcipher(tfm); 1567da7f033dSHerbert Xu return err; 1568da7f033dSHerbert Xu } 1569da7f033dSHerbert Xu 1570da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver, 1571da7f033dSHerbert Xu u32 type, u32 mask) 1572da7f033dSHerbert Xu { 1573da7f033dSHerbert Xu struct crypto_comp *tfm; 1574da7f033dSHerbert Xu int err; 1575da7f033dSHerbert Xu 1576da7f033dSHerbert Xu tfm = crypto_alloc_comp(driver, type, mask); 1577da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1578da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Failed to load transform for %s: " 1579da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1580da7f033dSHerbert Xu return PTR_ERR(tfm); 1581da7f033dSHerbert Xu } 1582da7f033dSHerbert Xu 1583da7f033dSHerbert Xu err = test_comp(tfm, desc->suite.comp.comp.vecs, 1584da7f033dSHerbert Xu desc->suite.comp.decomp.vecs, 1585da7f033dSHerbert Xu desc->suite.comp.comp.count, 1586da7f033dSHerbert Xu desc->suite.comp.decomp.count); 1587da7f033dSHerbert Xu 1588da7f033dSHerbert Xu crypto_free_comp(tfm); 1589da7f033dSHerbert Xu return err; 1590da7f033dSHerbert Xu } 1591da7f033dSHerbert Xu 1592da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver, 1593da7f033dSHerbert Xu u32 type, u32 mask) 1594da7f033dSHerbert Xu { 1595da7f033dSHerbert Xu struct crypto_ahash *tfm; 1596da7f033dSHerbert Xu int err; 1597da7f033dSHerbert Xu 1598425a8829SStephan Mueller tfm = crypto_alloc_ahash(driver, type | CRYPTO_ALG_INTERNAL, mask); 1599da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1600da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to load transform for %s: " 1601da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1602da7f033dSHerbert Xu return PTR_ERR(tfm); 1603da7f033dSHerbert Xu } 1604da7f033dSHerbert Xu 1605a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1606a8f1a052SDavid S. Miller desc->suite.hash.count, true); 1607a8f1a052SDavid S. Miller if (!err) 1608a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1609a8f1a052SDavid S. Miller desc->suite.hash.count, false); 1610da7f033dSHerbert Xu 1611da7f033dSHerbert Xu crypto_free_ahash(tfm); 1612da7f033dSHerbert Xu return err; 1613da7f033dSHerbert Xu } 1614da7f033dSHerbert Xu 16158e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc, 16168e3ee85eSHerbert Xu const char *driver, u32 type, u32 mask) 16178e3ee85eSHerbert Xu { 16188e3ee85eSHerbert Xu struct crypto_shash *tfm; 16198e3ee85eSHerbert Xu u32 val; 16208e3ee85eSHerbert Xu int err; 16218e3ee85eSHerbert Xu 16228e3ee85eSHerbert Xu err = alg_test_hash(desc, driver, type, mask); 16238e3ee85eSHerbert Xu if (err) 16248e3ee85eSHerbert Xu goto out; 16258e3ee85eSHerbert Xu 1626425a8829SStephan Mueller tfm = crypto_alloc_shash(driver, type | CRYPTO_ALG_INTERNAL, mask); 16278e3ee85eSHerbert Xu if (IS_ERR(tfm)) { 16288e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: " 16298e3ee85eSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 16308e3ee85eSHerbert Xu err = PTR_ERR(tfm); 16318e3ee85eSHerbert Xu goto out; 16328e3ee85eSHerbert Xu } 16338e3ee85eSHerbert Xu 16348e3ee85eSHerbert Xu do { 16354c5c3024SJan-Simon Möller SHASH_DESC_ON_STACK(shash, tfm); 16364c5c3024SJan-Simon Möller u32 *ctx = (u32 *)shash_desc_ctx(shash); 16378e3ee85eSHerbert Xu 16384c5c3024SJan-Simon Möller shash->tfm = tfm; 16394c5c3024SJan-Simon Möller shash->flags = 0; 16408e3ee85eSHerbert Xu 16414c5c3024SJan-Simon Möller *ctx = le32_to_cpu(420553207); 16424c5c3024SJan-Simon Möller err = crypto_shash_final(shash, (u8 *)&val); 16438e3ee85eSHerbert Xu if (err) { 16448e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Operation failed for " 16458e3ee85eSHerbert Xu "%s: %d\n", driver, err); 16468e3ee85eSHerbert Xu break; 16478e3ee85eSHerbert Xu } 16488e3ee85eSHerbert Xu 16498e3ee85eSHerbert Xu if (val != ~420553207) { 16508e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Test failed for %s: " 16518e3ee85eSHerbert Xu "%d\n", driver, val); 16528e3ee85eSHerbert Xu err = -EINVAL; 16538e3ee85eSHerbert Xu } 16548e3ee85eSHerbert Xu } while (0); 16558e3ee85eSHerbert Xu 16568e3ee85eSHerbert Xu crypto_free_shash(tfm); 16578e3ee85eSHerbert Xu 16588e3ee85eSHerbert Xu out: 16598e3ee85eSHerbert Xu return err; 16608e3ee85eSHerbert Xu } 16618e3ee85eSHerbert Xu 16627647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver, 16637647d6ceSJarod Wilson u32 type, u32 mask) 16647647d6ceSJarod Wilson { 16657647d6ceSJarod Wilson struct crypto_rng *rng; 16667647d6ceSJarod Wilson int err; 16677647d6ceSJarod Wilson 1668425a8829SStephan Mueller rng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask); 16697647d6ceSJarod Wilson if (IS_ERR(rng)) { 16707647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to load transform for %s: " 16717647d6ceSJarod Wilson "%ld\n", driver, PTR_ERR(rng)); 16727647d6ceSJarod Wilson return PTR_ERR(rng); 16737647d6ceSJarod Wilson } 16747647d6ceSJarod Wilson 16757647d6ceSJarod Wilson err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count); 16767647d6ceSJarod Wilson 16777647d6ceSJarod Wilson crypto_free_rng(rng); 16787647d6ceSJarod Wilson 16797647d6ceSJarod Wilson return err; 16807647d6ceSJarod Wilson } 16817647d6ceSJarod Wilson 168264d1cdfbSStephan Mueller 168364d1cdfbSStephan Mueller static int drbg_cavs_test(struct drbg_testvec *test, int pr, 168464d1cdfbSStephan Mueller const char *driver, u32 type, u32 mask) 168564d1cdfbSStephan Mueller { 168664d1cdfbSStephan Mueller int ret = -EAGAIN; 168764d1cdfbSStephan Mueller struct crypto_rng *drng; 168864d1cdfbSStephan Mueller struct drbg_test_data test_data; 168964d1cdfbSStephan Mueller struct drbg_string addtl, pers, testentropy; 169064d1cdfbSStephan Mueller unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL); 169164d1cdfbSStephan Mueller 169264d1cdfbSStephan Mueller if (!buf) 169364d1cdfbSStephan Mueller return -ENOMEM; 169464d1cdfbSStephan Mueller 1695425a8829SStephan Mueller drng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask); 169664d1cdfbSStephan Mueller if (IS_ERR(drng)) { 169764d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for " 169864d1cdfbSStephan Mueller "%s\n", driver); 169964d1cdfbSStephan Mueller kzfree(buf); 170064d1cdfbSStephan Mueller return -ENOMEM; 170164d1cdfbSStephan Mueller } 170264d1cdfbSStephan Mueller 170364d1cdfbSStephan Mueller test_data.testentropy = &testentropy; 170464d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entropy, test->entropylen); 170564d1cdfbSStephan Mueller drbg_string_fill(&pers, test->pers, test->perslen); 170664d1cdfbSStephan Mueller ret = crypto_drbg_reset_test(drng, &pers, &test_data); 170764d1cdfbSStephan Mueller if (ret) { 170864d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: Failed to reset rng\n"); 170964d1cdfbSStephan Mueller goto outbuf; 171064d1cdfbSStephan Mueller } 171164d1cdfbSStephan Mueller 171264d1cdfbSStephan Mueller drbg_string_fill(&addtl, test->addtla, test->addtllen); 171364d1cdfbSStephan Mueller if (pr) { 171464d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entpra, test->entprlen); 171564d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl_test(drng, 171664d1cdfbSStephan Mueller buf, test->expectedlen, &addtl, &test_data); 171764d1cdfbSStephan Mueller } else { 171864d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl(drng, 171964d1cdfbSStephan Mueller buf, test->expectedlen, &addtl); 172064d1cdfbSStephan Mueller } 172119e60e13SStephan Mueller if (ret < 0) { 172264d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not obtain random data for " 172364d1cdfbSStephan Mueller "driver %s\n", driver); 172464d1cdfbSStephan Mueller goto outbuf; 172564d1cdfbSStephan Mueller } 172664d1cdfbSStephan Mueller 172764d1cdfbSStephan Mueller drbg_string_fill(&addtl, test->addtlb, test->addtllen); 172864d1cdfbSStephan Mueller if (pr) { 172964d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entprb, test->entprlen); 173064d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl_test(drng, 173164d1cdfbSStephan Mueller buf, test->expectedlen, &addtl, &test_data); 173264d1cdfbSStephan Mueller } else { 173364d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl(drng, 173464d1cdfbSStephan Mueller buf, test->expectedlen, &addtl); 173564d1cdfbSStephan Mueller } 173619e60e13SStephan Mueller if (ret < 0) { 173764d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not obtain random data for " 173864d1cdfbSStephan Mueller "driver %s\n", driver); 173964d1cdfbSStephan Mueller goto outbuf; 174064d1cdfbSStephan Mueller } 174164d1cdfbSStephan Mueller 174264d1cdfbSStephan Mueller ret = memcmp(test->expected, buf, test->expectedlen); 174364d1cdfbSStephan Mueller 174464d1cdfbSStephan Mueller outbuf: 174564d1cdfbSStephan Mueller crypto_free_rng(drng); 174664d1cdfbSStephan Mueller kzfree(buf); 174764d1cdfbSStephan Mueller return ret; 174864d1cdfbSStephan Mueller } 174964d1cdfbSStephan Mueller 175064d1cdfbSStephan Mueller 175164d1cdfbSStephan Mueller static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver, 175264d1cdfbSStephan Mueller u32 type, u32 mask) 175364d1cdfbSStephan Mueller { 175464d1cdfbSStephan Mueller int err = 0; 175564d1cdfbSStephan Mueller int pr = 0; 175664d1cdfbSStephan Mueller int i = 0; 175764d1cdfbSStephan Mueller struct drbg_testvec *template = desc->suite.drbg.vecs; 175864d1cdfbSStephan Mueller unsigned int tcount = desc->suite.drbg.count; 175964d1cdfbSStephan Mueller 176064d1cdfbSStephan Mueller if (0 == memcmp(driver, "drbg_pr_", 8)) 176164d1cdfbSStephan Mueller pr = 1; 176264d1cdfbSStephan Mueller 176364d1cdfbSStephan Mueller for (i = 0; i < tcount; i++) { 176464d1cdfbSStephan Mueller err = drbg_cavs_test(&template[i], pr, driver, type, mask); 176564d1cdfbSStephan Mueller if (err) { 176664d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: Test %d failed for %s\n", 176764d1cdfbSStephan Mueller i, driver); 176864d1cdfbSStephan Mueller err = -EINVAL; 176964d1cdfbSStephan Mueller break; 177064d1cdfbSStephan Mueller } 177164d1cdfbSStephan Mueller } 177264d1cdfbSStephan Mueller return err; 177364d1cdfbSStephan Mueller 177464d1cdfbSStephan Mueller } 177564d1cdfbSStephan Mueller 1776946cc463STadeusz Struk static int do_test_rsa(struct crypto_akcipher *tfm, 1777946cc463STadeusz Struk struct akcipher_testvec *vecs) 1778946cc463STadeusz Struk { 1779df27b26fSHerbert Xu char *xbuf[XBUFSIZE]; 1780946cc463STadeusz Struk struct akcipher_request *req; 1781946cc463STadeusz Struk void *outbuf_enc = NULL; 1782946cc463STadeusz Struk void *outbuf_dec = NULL; 1783946cc463STadeusz Struk struct tcrypt_result result; 1784946cc463STadeusz Struk unsigned int out_len_max, out_len = 0; 1785946cc463STadeusz Struk int err = -ENOMEM; 178622287b0bSTadeusz Struk struct scatterlist src, dst, src_tab[2]; 1787946cc463STadeusz Struk 1788df27b26fSHerbert Xu if (testmgr_alloc_buf(xbuf)) 1789df27b26fSHerbert Xu return err; 1790df27b26fSHerbert Xu 1791946cc463STadeusz Struk req = akcipher_request_alloc(tfm, GFP_KERNEL); 1792946cc463STadeusz Struk if (!req) 1793df27b26fSHerbert Xu goto free_xbuf; 1794946cc463STadeusz Struk 1795946cc463STadeusz Struk init_completion(&result.completion); 179622287b0bSTadeusz Struk 179722287b0bSTadeusz Struk if (vecs->public_key_vec) 179822287b0bSTadeusz Struk err = crypto_akcipher_set_pub_key(tfm, vecs->key, 179922287b0bSTadeusz Struk vecs->key_len); 180022287b0bSTadeusz Struk else 180122287b0bSTadeusz Struk err = crypto_akcipher_set_priv_key(tfm, vecs->key, 180222287b0bSTadeusz Struk vecs->key_len); 1803946cc463STadeusz Struk if (err) 1804946cc463STadeusz Struk goto free_req; 1805946cc463STadeusz Struk 180622287b0bSTadeusz Struk out_len_max = crypto_akcipher_maxsize(tfm); 1807946cc463STadeusz Struk outbuf_enc = kzalloc(out_len_max, GFP_KERNEL); 1808946cc463STadeusz Struk if (!outbuf_enc) 1809946cc463STadeusz Struk goto free_req; 1810946cc463STadeusz Struk 1811df27b26fSHerbert Xu if (WARN_ON(vecs->m_size > PAGE_SIZE)) 1812df27b26fSHerbert Xu goto free_all; 1813df27b26fSHerbert Xu 1814df27b26fSHerbert Xu memcpy(xbuf[0], vecs->m, vecs->m_size); 1815df27b26fSHerbert Xu 181622287b0bSTadeusz Struk sg_init_table(src_tab, 2); 1817df27b26fSHerbert Xu sg_set_buf(&src_tab[0], xbuf[0], 8); 1818df27b26fSHerbert Xu sg_set_buf(&src_tab[1], xbuf[0] + 8, vecs->m_size - 8); 181922287b0bSTadeusz Struk sg_init_one(&dst, outbuf_enc, out_len_max); 182022287b0bSTadeusz Struk akcipher_request_set_crypt(req, src_tab, &dst, vecs->m_size, 182122287b0bSTadeusz Struk out_len_max); 1822946cc463STadeusz Struk akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 1823946cc463STadeusz Struk tcrypt_complete, &result); 1824946cc463STadeusz Struk 1825946cc463STadeusz Struk /* Run RSA encrypt - c = m^e mod n;*/ 1826946cc463STadeusz Struk err = wait_async_op(&result, crypto_akcipher_encrypt(req)); 1827946cc463STadeusz Struk if (err) { 1828946cc463STadeusz Struk pr_err("alg: rsa: encrypt test failed. err %d\n", err); 1829946cc463STadeusz Struk goto free_all; 1830946cc463STadeusz Struk } 183122287b0bSTadeusz Struk if (req->dst_len != vecs->c_size) { 1832946cc463STadeusz Struk pr_err("alg: rsa: encrypt test failed. Invalid output len\n"); 1833946cc463STadeusz Struk err = -EINVAL; 1834946cc463STadeusz Struk goto free_all; 1835946cc463STadeusz Struk } 1836946cc463STadeusz Struk /* verify that encrypted message is equal to expected */ 1837df27b26fSHerbert Xu if (memcmp(vecs->c, outbuf_enc, vecs->c_size)) { 1838946cc463STadeusz Struk pr_err("alg: rsa: encrypt test failed. Invalid output\n"); 1839946cc463STadeusz Struk err = -EINVAL; 1840946cc463STadeusz Struk goto free_all; 1841946cc463STadeusz Struk } 1842946cc463STadeusz Struk /* Don't invoke decrypt for vectors with public key */ 1843946cc463STadeusz Struk if (vecs->public_key_vec) { 1844946cc463STadeusz Struk err = 0; 1845946cc463STadeusz Struk goto free_all; 1846946cc463STadeusz Struk } 1847946cc463STadeusz Struk outbuf_dec = kzalloc(out_len_max, GFP_KERNEL); 1848946cc463STadeusz Struk if (!outbuf_dec) { 1849946cc463STadeusz Struk err = -ENOMEM; 1850946cc463STadeusz Struk goto free_all; 1851946cc463STadeusz Struk } 1852df27b26fSHerbert Xu 1853df27b26fSHerbert Xu if (WARN_ON(vecs->c_size > PAGE_SIZE)) 1854df27b26fSHerbert Xu goto free_all; 1855df27b26fSHerbert Xu 1856df27b26fSHerbert Xu memcpy(xbuf[0], vecs->c, vecs->c_size); 1857df27b26fSHerbert Xu 1858df27b26fSHerbert Xu sg_init_one(&src, xbuf[0], vecs->c_size); 185922287b0bSTadeusz Struk sg_init_one(&dst, outbuf_dec, out_len_max); 1860946cc463STadeusz Struk init_completion(&result.completion); 186122287b0bSTadeusz Struk akcipher_request_set_crypt(req, &src, &dst, vecs->c_size, out_len_max); 1862946cc463STadeusz Struk 1863946cc463STadeusz Struk /* Run RSA decrypt - m = c^d mod n;*/ 1864946cc463STadeusz Struk err = wait_async_op(&result, crypto_akcipher_decrypt(req)); 1865946cc463STadeusz Struk if (err) { 1866946cc463STadeusz Struk pr_err("alg: rsa: decrypt test failed. err %d\n", err); 1867946cc463STadeusz Struk goto free_all; 1868946cc463STadeusz Struk } 1869946cc463STadeusz Struk out_len = req->dst_len; 1870946cc463STadeusz Struk if (out_len != vecs->m_size) { 1871946cc463STadeusz Struk pr_err("alg: rsa: decrypt test failed. Invalid output len\n"); 1872946cc463STadeusz Struk err = -EINVAL; 1873946cc463STadeusz Struk goto free_all; 1874946cc463STadeusz Struk } 1875946cc463STadeusz Struk /* verify that decrypted message is equal to the original msg */ 1876946cc463STadeusz Struk if (memcmp(vecs->m, outbuf_dec, vecs->m_size)) { 1877946cc463STadeusz Struk pr_err("alg: rsa: decrypt test failed. Invalid output\n"); 1878946cc463STadeusz Struk err = -EINVAL; 1879946cc463STadeusz Struk } 1880946cc463STadeusz Struk free_all: 1881946cc463STadeusz Struk kfree(outbuf_dec); 1882946cc463STadeusz Struk kfree(outbuf_enc); 1883946cc463STadeusz Struk free_req: 1884946cc463STadeusz Struk akcipher_request_free(req); 1885df27b26fSHerbert Xu free_xbuf: 1886df27b26fSHerbert Xu testmgr_free_buf(xbuf); 1887946cc463STadeusz Struk return err; 1888946cc463STadeusz Struk } 1889946cc463STadeusz Struk 1890946cc463STadeusz Struk static int test_rsa(struct crypto_akcipher *tfm, struct akcipher_testvec *vecs, 1891946cc463STadeusz Struk unsigned int tcount) 1892946cc463STadeusz Struk { 1893946cc463STadeusz Struk int ret, i; 1894946cc463STadeusz Struk 1895946cc463STadeusz Struk for (i = 0; i < tcount; i++) { 1896946cc463STadeusz Struk ret = do_test_rsa(tfm, vecs++); 1897946cc463STadeusz Struk if (ret) { 1898946cc463STadeusz Struk pr_err("alg: rsa: test failed on vector %d, err=%d\n", 1899946cc463STadeusz Struk i + 1, ret); 1900946cc463STadeusz Struk return ret; 1901946cc463STadeusz Struk } 1902946cc463STadeusz Struk } 1903946cc463STadeusz Struk return 0; 1904946cc463STadeusz Struk } 1905946cc463STadeusz Struk 1906946cc463STadeusz Struk static int test_akcipher(struct crypto_akcipher *tfm, const char *alg, 1907946cc463STadeusz Struk struct akcipher_testvec *vecs, unsigned int tcount) 1908946cc463STadeusz Struk { 1909946cc463STadeusz Struk if (strncmp(alg, "rsa", 3) == 0) 1910946cc463STadeusz Struk return test_rsa(tfm, vecs, tcount); 1911946cc463STadeusz Struk 1912946cc463STadeusz Struk return 0; 1913946cc463STadeusz Struk } 1914946cc463STadeusz Struk 1915946cc463STadeusz Struk static int alg_test_akcipher(const struct alg_test_desc *desc, 1916946cc463STadeusz Struk const char *driver, u32 type, u32 mask) 1917946cc463STadeusz Struk { 1918946cc463STadeusz Struk struct crypto_akcipher *tfm; 1919946cc463STadeusz Struk int err = 0; 1920946cc463STadeusz Struk 1921946cc463STadeusz Struk tfm = crypto_alloc_akcipher(driver, type | CRYPTO_ALG_INTERNAL, mask); 1922946cc463STadeusz Struk if (IS_ERR(tfm)) { 1923946cc463STadeusz Struk pr_err("alg: akcipher: Failed to load tfm for %s: %ld\n", 1924946cc463STadeusz Struk driver, PTR_ERR(tfm)); 1925946cc463STadeusz Struk return PTR_ERR(tfm); 1926946cc463STadeusz Struk } 1927946cc463STadeusz Struk if (desc->suite.akcipher.vecs) 1928946cc463STadeusz Struk err = test_akcipher(tfm, desc->alg, desc->suite.akcipher.vecs, 1929946cc463STadeusz Struk desc->suite.akcipher.count); 1930946cc463STadeusz Struk 1931946cc463STadeusz Struk crypto_free_akcipher(tfm); 1932946cc463STadeusz Struk return err; 1933946cc463STadeusz Struk } 1934946cc463STadeusz Struk 1935863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc, 1936863b557aSYouquan, Song const char *driver, u32 type, u32 mask) 1937863b557aSYouquan, Song { 1938863b557aSYouquan, Song return 0; 1939863b557aSYouquan, Song } 1940863b557aSYouquan, Song 1941da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */ 1942da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = { 1943da7f033dSHerbert Xu { 19444d6d6a2cSJohannes Goetzfried .alg = "__cbc-cast5-avx", 19454d6d6a2cSJohannes Goetzfried .test = alg_test_null, 19464d6d6a2cSJohannes Goetzfried }, { 19474ea1277dSJohannes Goetzfried .alg = "__cbc-cast6-avx", 19484ea1277dSJohannes Goetzfried .test = alg_test_null, 19494ea1277dSJohannes Goetzfried }, { 19507efe4076SJohannes Goetzfried .alg = "__cbc-serpent-avx", 19517efe4076SJohannes Goetzfried .test = alg_test_null, 19527efe4076SJohannes Goetzfried }, { 195356d76c96SJussi Kivilinna .alg = "__cbc-serpent-avx2", 195456d76c96SJussi Kivilinna .test = alg_test_null, 195556d76c96SJussi Kivilinna }, { 1956937c30d7SJussi Kivilinna .alg = "__cbc-serpent-sse2", 1957937c30d7SJussi Kivilinna .test = alg_test_null, 1958937c30d7SJussi Kivilinna }, { 1959107778b5SJohannes Goetzfried .alg = "__cbc-twofish-avx", 1960107778b5SJohannes Goetzfried .test = alg_test_null, 1961107778b5SJohannes Goetzfried }, { 1962863b557aSYouquan, Song .alg = "__driver-cbc-aes-aesni", 1963863b557aSYouquan, Song .test = alg_test_null, 19646c79294fSMilan Broz .fips_allowed = 1, 1965863b557aSYouquan, Song }, { 1966d9b1d2e7SJussi Kivilinna .alg = "__driver-cbc-camellia-aesni", 1967d9b1d2e7SJussi Kivilinna .test = alg_test_null, 1968d9b1d2e7SJussi Kivilinna }, { 1969f3f935a7SJussi Kivilinna .alg = "__driver-cbc-camellia-aesni-avx2", 1970f3f935a7SJussi Kivilinna .test = alg_test_null, 1971f3f935a7SJussi Kivilinna }, { 19724d6d6a2cSJohannes Goetzfried .alg = "__driver-cbc-cast5-avx", 19734d6d6a2cSJohannes Goetzfried .test = alg_test_null, 19744d6d6a2cSJohannes Goetzfried }, { 19754ea1277dSJohannes Goetzfried .alg = "__driver-cbc-cast6-avx", 19764ea1277dSJohannes Goetzfried .test = alg_test_null, 19774ea1277dSJohannes Goetzfried }, { 19787efe4076SJohannes Goetzfried .alg = "__driver-cbc-serpent-avx", 19797efe4076SJohannes Goetzfried .test = alg_test_null, 19807efe4076SJohannes Goetzfried }, { 198156d76c96SJussi Kivilinna .alg = "__driver-cbc-serpent-avx2", 198256d76c96SJussi Kivilinna .test = alg_test_null, 198356d76c96SJussi Kivilinna }, { 1984937c30d7SJussi Kivilinna .alg = "__driver-cbc-serpent-sse2", 1985937c30d7SJussi Kivilinna .test = alg_test_null, 1986937c30d7SJussi Kivilinna }, { 1987107778b5SJohannes Goetzfried .alg = "__driver-cbc-twofish-avx", 1988107778b5SJohannes Goetzfried .test = alg_test_null, 1989107778b5SJohannes Goetzfried }, { 1990863b557aSYouquan, Song .alg = "__driver-ecb-aes-aesni", 1991863b557aSYouquan, Song .test = alg_test_null, 19926c79294fSMilan Broz .fips_allowed = 1, 1993863b557aSYouquan, Song }, { 1994d9b1d2e7SJussi Kivilinna .alg = "__driver-ecb-camellia-aesni", 1995d9b1d2e7SJussi Kivilinna .test = alg_test_null, 1996d9b1d2e7SJussi Kivilinna }, { 1997f3f935a7SJussi Kivilinna .alg = "__driver-ecb-camellia-aesni-avx2", 1998f3f935a7SJussi Kivilinna .test = alg_test_null, 1999f3f935a7SJussi Kivilinna }, { 20004d6d6a2cSJohannes Goetzfried .alg = "__driver-ecb-cast5-avx", 20014d6d6a2cSJohannes Goetzfried .test = alg_test_null, 20024d6d6a2cSJohannes Goetzfried }, { 20034ea1277dSJohannes Goetzfried .alg = "__driver-ecb-cast6-avx", 20044ea1277dSJohannes Goetzfried .test = alg_test_null, 20054ea1277dSJohannes Goetzfried }, { 20067efe4076SJohannes Goetzfried .alg = "__driver-ecb-serpent-avx", 20077efe4076SJohannes Goetzfried .test = alg_test_null, 20087efe4076SJohannes Goetzfried }, { 200956d76c96SJussi Kivilinna .alg = "__driver-ecb-serpent-avx2", 201056d76c96SJussi Kivilinna .test = alg_test_null, 201156d76c96SJussi Kivilinna }, { 2012937c30d7SJussi Kivilinna .alg = "__driver-ecb-serpent-sse2", 2013937c30d7SJussi Kivilinna .test = alg_test_null, 2014937c30d7SJussi Kivilinna }, { 2015107778b5SJohannes Goetzfried .alg = "__driver-ecb-twofish-avx", 2016107778b5SJohannes Goetzfried .test = alg_test_null, 2017107778b5SJohannes Goetzfried }, { 20189d77b6c2STadeusz Struk .alg = "__driver-gcm-aes-aesni", 20199d77b6c2STadeusz Struk .test = alg_test_null, 20209d77b6c2STadeusz Struk .fips_allowed = 1, 20219d77b6c2STadeusz Struk }, { 2022863b557aSYouquan, Song .alg = "__ghash-pclmulqdqni", 2023863b557aSYouquan, Song .test = alg_test_null, 20246c79294fSMilan Broz .fips_allowed = 1, 2025863b557aSYouquan, Song }, { 2026e08ca2daSJarod Wilson .alg = "ansi_cprng", 2027e08ca2daSJarod Wilson .test = alg_test_cprng, 2028e08ca2daSJarod Wilson .suite = { 2029e08ca2daSJarod Wilson .cprng = { 2030e08ca2daSJarod Wilson .vecs = ansi_cprng_aes_tv_template, 2031e08ca2daSJarod Wilson .count = ANSI_CPRNG_AES_TEST_VECTORS 2032e08ca2daSJarod Wilson } 2033e08ca2daSJarod Wilson } 2034e08ca2daSJarod Wilson }, { 2035bca4feb0SHoria Geanta .alg = "authenc(hmac(md5),ecb(cipher_null))", 2036bca4feb0SHoria Geanta .test = alg_test_aead, 2037bca4feb0SHoria Geanta .suite = { 2038bca4feb0SHoria Geanta .aead = { 2039bca4feb0SHoria Geanta .enc = { 2040bca4feb0SHoria Geanta .vecs = hmac_md5_ecb_cipher_null_enc_tv_template, 2041bca4feb0SHoria Geanta .count = HMAC_MD5_ECB_CIPHER_NULL_ENC_TEST_VECTORS 2042bca4feb0SHoria Geanta }, 2043bca4feb0SHoria Geanta .dec = { 2044bca4feb0SHoria Geanta .vecs = hmac_md5_ecb_cipher_null_dec_tv_template, 2045bca4feb0SHoria Geanta .count = HMAC_MD5_ECB_CIPHER_NULL_DEC_TEST_VECTORS 2046bca4feb0SHoria Geanta } 2047bca4feb0SHoria Geanta } 2048bca4feb0SHoria Geanta } 2049bca4feb0SHoria Geanta }, { 2050a4198fd4SHerbert Xu .alg = "authenc(hmac(sha1),cbc(aes))", 2051e46e9a46SHoria Geanta .test = alg_test_aead, 2052e46e9a46SHoria Geanta .suite = { 2053e46e9a46SHoria Geanta .aead = { 2054e46e9a46SHoria Geanta .enc = { 20555208ed2cSNitesh Lal .vecs = 20565208ed2cSNitesh Lal hmac_sha1_aes_cbc_enc_tv_temp, 20575208ed2cSNitesh Lal .count = 20585208ed2cSNitesh Lal HMAC_SHA1_AES_CBC_ENC_TEST_VEC 20595208ed2cSNitesh Lal } 20605208ed2cSNitesh Lal } 20615208ed2cSNitesh Lal } 20625208ed2cSNitesh Lal }, { 2063a4198fd4SHerbert Xu .alg = "authenc(hmac(sha1),cbc(des))", 20645208ed2cSNitesh Lal .test = alg_test_aead, 20655208ed2cSNitesh Lal .suite = { 20665208ed2cSNitesh Lal .aead = { 20675208ed2cSNitesh Lal .enc = { 20685208ed2cSNitesh Lal .vecs = 20695208ed2cSNitesh Lal hmac_sha1_des_cbc_enc_tv_temp, 20705208ed2cSNitesh Lal .count = 20715208ed2cSNitesh Lal HMAC_SHA1_DES_CBC_ENC_TEST_VEC 20725208ed2cSNitesh Lal } 20735208ed2cSNitesh Lal } 20745208ed2cSNitesh Lal } 20755208ed2cSNitesh Lal }, { 2076a4198fd4SHerbert Xu .alg = "authenc(hmac(sha1),cbc(des3_ede))", 20775208ed2cSNitesh Lal .test = alg_test_aead, 2078ed1afac9SMarcus Meissner .fips_allowed = 1, 20795208ed2cSNitesh Lal .suite = { 20805208ed2cSNitesh Lal .aead = { 20815208ed2cSNitesh Lal .enc = { 20825208ed2cSNitesh Lal .vecs = 20835208ed2cSNitesh Lal hmac_sha1_des3_ede_cbc_enc_tv_temp, 20845208ed2cSNitesh Lal .count = 20855208ed2cSNitesh Lal HMAC_SHA1_DES3_EDE_CBC_ENC_TEST_VEC 2086e46e9a46SHoria Geanta } 2087e46e9a46SHoria Geanta } 2088e46e9a46SHoria Geanta } 2089e46e9a46SHoria Geanta }, { 2090fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha1),ctr(aes))", 2091fb16abc2SMarcus Meissner .test = alg_test_null, 2092fb16abc2SMarcus Meissner .fips_allowed = 1, 2093fb16abc2SMarcus Meissner }, { 2094bca4feb0SHoria Geanta .alg = "authenc(hmac(sha1),ecb(cipher_null))", 2095bca4feb0SHoria Geanta .test = alg_test_aead, 2096bca4feb0SHoria Geanta .suite = { 2097bca4feb0SHoria Geanta .aead = { 2098bca4feb0SHoria Geanta .enc = { 20995208ed2cSNitesh Lal .vecs = 21005208ed2cSNitesh Lal hmac_sha1_ecb_cipher_null_enc_tv_temp, 21015208ed2cSNitesh Lal .count = 21025208ed2cSNitesh Lal HMAC_SHA1_ECB_CIPHER_NULL_ENC_TEST_VEC 2103bca4feb0SHoria Geanta }, 2104bca4feb0SHoria Geanta .dec = { 21055208ed2cSNitesh Lal .vecs = 21065208ed2cSNitesh Lal hmac_sha1_ecb_cipher_null_dec_tv_temp, 21075208ed2cSNitesh Lal .count = 21085208ed2cSNitesh Lal HMAC_SHA1_ECB_CIPHER_NULL_DEC_TEST_VEC 21095208ed2cSNitesh Lal } 21105208ed2cSNitesh Lal } 21115208ed2cSNitesh Lal } 21125208ed2cSNitesh Lal }, { 21138888690eSMarcus Meissner .alg = "authenc(hmac(sha1),rfc3686(ctr(aes)))", 21148888690eSMarcus Meissner .test = alg_test_null, 21158888690eSMarcus Meissner .fips_allowed = 1, 21168888690eSMarcus Meissner }, { 2117a4198fd4SHerbert Xu .alg = "authenc(hmac(sha224),cbc(des))", 21185208ed2cSNitesh Lal .test = alg_test_aead, 21195208ed2cSNitesh Lal .suite = { 21205208ed2cSNitesh Lal .aead = { 21215208ed2cSNitesh Lal .enc = { 21225208ed2cSNitesh Lal .vecs = 21235208ed2cSNitesh Lal hmac_sha224_des_cbc_enc_tv_temp, 21245208ed2cSNitesh Lal .count = 21255208ed2cSNitesh Lal HMAC_SHA224_DES_CBC_ENC_TEST_VEC 21265208ed2cSNitesh Lal } 21275208ed2cSNitesh Lal } 21285208ed2cSNitesh Lal } 21295208ed2cSNitesh Lal }, { 2130a4198fd4SHerbert Xu .alg = "authenc(hmac(sha224),cbc(des3_ede))", 21315208ed2cSNitesh Lal .test = alg_test_aead, 2132ed1afac9SMarcus Meissner .fips_allowed = 1, 21335208ed2cSNitesh Lal .suite = { 21345208ed2cSNitesh Lal .aead = { 21355208ed2cSNitesh Lal .enc = { 21365208ed2cSNitesh Lal .vecs = 21375208ed2cSNitesh Lal hmac_sha224_des3_ede_cbc_enc_tv_temp, 21385208ed2cSNitesh Lal .count = 21395208ed2cSNitesh Lal HMAC_SHA224_DES3_EDE_CBC_ENC_TEST_VEC 2140bca4feb0SHoria Geanta } 2141bca4feb0SHoria Geanta } 2142bca4feb0SHoria Geanta } 2143bca4feb0SHoria Geanta }, { 2144a4198fd4SHerbert Xu .alg = "authenc(hmac(sha256),cbc(aes))", 2145e46e9a46SHoria Geanta .test = alg_test_aead, 2146ed1afac9SMarcus Meissner .fips_allowed = 1, 2147e46e9a46SHoria Geanta .suite = { 2148e46e9a46SHoria Geanta .aead = { 2149e46e9a46SHoria Geanta .enc = { 21505208ed2cSNitesh Lal .vecs = 21515208ed2cSNitesh Lal hmac_sha256_aes_cbc_enc_tv_temp, 21525208ed2cSNitesh Lal .count = 21535208ed2cSNitesh Lal HMAC_SHA256_AES_CBC_ENC_TEST_VEC 21545208ed2cSNitesh Lal } 21555208ed2cSNitesh Lal } 21565208ed2cSNitesh Lal } 21575208ed2cSNitesh Lal }, { 2158a4198fd4SHerbert Xu .alg = "authenc(hmac(sha256),cbc(des))", 21595208ed2cSNitesh Lal .test = alg_test_aead, 21605208ed2cSNitesh Lal .suite = { 21615208ed2cSNitesh Lal .aead = { 21625208ed2cSNitesh Lal .enc = { 21635208ed2cSNitesh Lal .vecs = 21645208ed2cSNitesh Lal hmac_sha256_des_cbc_enc_tv_temp, 21655208ed2cSNitesh Lal .count = 21665208ed2cSNitesh Lal HMAC_SHA256_DES_CBC_ENC_TEST_VEC 21675208ed2cSNitesh Lal } 21685208ed2cSNitesh Lal } 21695208ed2cSNitesh Lal } 21705208ed2cSNitesh Lal }, { 2171a4198fd4SHerbert Xu .alg = "authenc(hmac(sha256),cbc(des3_ede))", 21725208ed2cSNitesh Lal .test = alg_test_aead, 2173ed1afac9SMarcus Meissner .fips_allowed = 1, 21745208ed2cSNitesh Lal .suite = { 21755208ed2cSNitesh Lal .aead = { 21765208ed2cSNitesh Lal .enc = { 21775208ed2cSNitesh Lal .vecs = 21785208ed2cSNitesh Lal hmac_sha256_des3_ede_cbc_enc_tv_temp, 21795208ed2cSNitesh Lal .count = 21805208ed2cSNitesh Lal HMAC_SHA256_DES3_EDE_CBC_ENC_TEST_VEC 21815208ed2cSNitesh Lal } 21825208ed2cSNitesh Lal } 21835208ed2cSNitesh Lal } 21845208ed2cSNitesh Lal }, { 2185fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha256),ctr(aes))", 2186fb16abc2SMarcus Meissner .test = alg_test_null, 2187fb16abc2SMarcus Meissner .fips_allowed = 1, 2188fb16abc2SMarcus Meissner }, { 21898888690eSMarcus Meissner .alg = "authenc(hmac(sha256),rfc3686(ctr(aes)))", 21908888690eSMarcus Meissner .test = alg_test_null, 21918888690eSMarcus Meissner .fips_allowed = 1, 21928888690eSMarcus Meissner }, { 2193a4198fd4SHerbert Xu .alg = "authenc(hmac(sha384),cbc(des))", 21945208ed2cSNitesh Lal .test = alg_test_aead, 21955208ed2cSNitesh Lal .suite = { 21965208ed2cSNitesh Lal .aead = { 21975208ed2cSNitesh Lal .enc = { 21985208ed2cSNitesh Lal .vecs = 21995208ed2cSNitesh Lal hmac_sha384_des_cbc_enc_tv_temp, 22005208ed2cSNitesh Lal .count = 22015208ed2cSNitesh Lal HMAC_SHA384_DES_CBC_ENC_TEST_VEC 22025208ed2cSNitesh Lal } 22035208ed2cSNitesh Lal } 22045208ed2cSNitesh Lal } 22055208ed2cSNitesh Lal }, { 2206a4198fd4SHerbert Xu .alg = "authenc(hmac(sha384),cbc(des3_ede))", 22075208ed2cSNitesh Lal .test = alg_test_aead, 2208ed1afac9SMarcus Meissner .fips_allowed = 1, 22095208ed2cSNitesh Lal .suite = { 22105208ed2cSNitesh Lal .aead = { 22115208ed2cSNitesh Lal .enc = { 22125208ed2cSNitesh Lal .vecs = 22135208ed2cSNitesh Lal hmac_sha384_des3_ede_cbc_enc_tv_temp, 22145208ed2cSNitesh Lal .count = 22155208ed2cSNitesh Lal HMAC_SHA384_DES3_EDE_CBC_ENC_TEST_VEC 2216e46e9a46SHoria Geanta } 2217e46e9a46SHoria Geanta } 2218e46e9a46SHoria Geanta } 2219e46e9a46SHoria Geanta }, { 2220fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha384),ctr(aes))", 2221fb16abc2SMarcus Meissner .test = alg_test_null, 2222fb16abc2SMarcus Meissner .fips_allowed = 1, 2223fb16abc2SMarcus Meissner }, { 22248888690eSMarcus Meissner .alg = "authenc(hmac(sha384),rfc3686(ctr(aes)))", 22258888690eSMarcus Meissner .test = alg_test_null, 22268888690eSMarcus Meissner .fips_allowed = 1, 22278888690eSMarcus Meissner }, { 2228a4198fd4SHerbert Xu .alg = "authenc(hmac(sha512),cbc(aes))", 2229ed1afac9SMarcus Meissner .fips_allowed = 1, 2230e46e9a46SHoria Geanta .test = alg_test_aead, 2231e46e9a46SHoria Geanta .suite = { 2232e46e9a46SHoria Geanta .aead = { 2233e46e9a46SHoria Geanta .enc = { 22345208ed2cSNitesh Lal .vecs = 22355208ed2cSNitesh Lal hmac_sha512_aes_cbc_enc_tv_temp, 22365208ed2cSNitesh Lal .count = 22375208ed2cSNitesh Lal HMAC_SHA512_AES_CBC_ENC_TEST_VEC 22385208ed2cSNitesh Lal } 22395208ed2cSNitesh Lal } 22405208ed2cSNitesh Lal } 22415208ed2cSNitesh Lal }, { 2242a4198fd4SHerbert Xu .alg = "authenc(hmac(sha512),cbc(des))", 22435208ed2cSNitesh Lal .test = alg_test_aead, 22445208ed2cSNitesh Lal .suite = { 22455208ed2cSNitesh Lal .aead = { 22465208ed2cSNitesh Lal .enc = { 22475208ed2cSNitesh Lal .vecs = 22485208ed2cSNitesh Lal hmac_sha512_des_cbc_enc_tv_temp, 22495208ed2cSNitesh Lal .count = 22505208ed2cSNitesh Lal HMAC_SHA512_DES_CBC_ENC_TEST_VEC 22515208ed2cSNitesh Lal } 22525208ed2cSNitesh Lal } 22535208ed2cSNitesh Lal } 22545208ed2cSNitesh Lal }, { 2255a4198fd4SHerbert Xu .alg = "authenc(hmac(sha512),cbc(des3_ede))", 22565208ed2cSNitesh Lal .test = alg_test_aead, 2257ed1afac9SMarcus Meissner .fips_allowed = 1, 22585208ed2cSNitesh Lal .suite = { 22595208ed2cSNitesh Lal .aead = { 22605208ed2cSNitesh Lal .enc = { 22615208ed2cSNitesh Lal .vecs = 22625208ed2cSNitesh Lal hmac_sha512_des3_ede_cbc_enc_tv_temp, 22635208ed2cSNitesh Lal .count = 22645208ed2cSNitesh Lal HMAC_SHA512_DES3_EDE_CBC_ENC_TEST_VEC 2265e46e9a46SHoria Geanta } 2266e46e9a46SHoria Geanta } 2267e46e9a46SHoria Geanta } 2268e46e9a46SHoria Geanta }, { 2269fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha512),ctr(aes))", 2270fb16abc2SMarcus Meissner .test = alg_test_null, 2271fb16abc2SMarcus Meissner .fips_allowed = 1, 2272fb16abc2SMarcus Meissner }, { 22738888690eSMarcus Meissner .alg = "authenc(hmac(sha512),rfc3686(ctr(aes)))", 22748888690eSMarcus Meissner .test = alg_test_null, 22758888690eSMarcus Meissner .fips_allowed = 1, 22768888690eSMarcus Meissner }, { 2277da7f033dSHerbert Xu .alg = "cbc(aes)", 22781aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2279a1915d51SJarod Wilson .fips_allowed = 1, 2280da7f033dSHerbert Xu .suite = { 2281da7f033dSHerbert Xu .cipher = { 2282da7f033dSHerbert Xu .enc = { 2283da7f033dSHerbert Xu .vecs = aes_cbc_enc_tv_template, 2284da7f033dSHerbert Xu .count = AES_CBC_ENC_TEST_VECTORS 2285da7f033dSHerbert Xu }, 2286da7f033dSHerbert Xu .dec = { 2287da7f033dSHerbert Xu .vecs = aes_cbc_dec_tv_template, 2288da7f033dSHerbert Xu .count = AES_CBC_DEC_TEST_VECTORS 2289da7f033dSHerbert Xu } 2290da7f033dSHerbert Xu } 2291da7f033dSHerbert Xu } 2292da7f033dSHerbert Xu }, { 2293da7f033dSHerbert Xu .alg = "cbc(anubis)", 22941aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2295da7f033dSHerbert Xu .suite = { 2296da7f033dSHerbert Xu .cipher = { 2297da7f033dSHerbert Xu .enc = { 2298da7f033dSHerbert Xu .vecs = anubis_cbc_enc_tv_template, 2299da7f033dSHerbert Xu .count = ANUBIS_CBC_ENC_TEST_VECTORS 2300da7f033dSHerbert Xu }, 2301da7f033dSHerbert Xu .dec = { 2302da7f033dSHerbert Xu .vecs = anubis_cbc_dec_tv_template, 2303da7f033dSHerbert Xu .count = ANUBIS_CBC_DEC_TEST_VECTORS 2304da7f033dSHerbert Xu } 2305da7f033dSHerbert Xu } 2306da7f033dSHerbert Xu } 2307da7f033dSHerbert Xu }, { 2308da7f033dSHerbert Xu .alg = "cbc(blowfish)", 23091aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2310da7f033dSHerbert Xu .suite = { 2311da7f033dSHerbert Xu .cipher = { 2312da7f033dSHerbert Xu .enc = { 2313da7f033dSHerbert Xu .vecs = bf_cbc_enc_tv_template, 2314da7f033dSHerbert Xu .count = BF_CBC_ENC_TEST_VECTORS 2315da7f033dSHerbert Xu }, 2316da7f033dSHerbert Xu .dec = { 2317da7f033dSHerbert Xu .vecs = bf_cbc_dec_tv_template, 2318da7f033dSHerbert Xu .count = BF_CBC_DEC_TEST_VECTORS 2319da7f033dSHerbert Xu } 2320da7f033dSHerbert Xu } 2321da7f033dSHerbert Xu } 2322da7f033dSHerbert Xu }, { 2323da7f033dSHerbert Xu .alg = "cbc(camellia)", 23241aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2325da7f033dSHerbert Xu .suite = { 2326da7f033dSHerbert Xu .cipher = { 2327da7f033dSHerbert Xu .enc = { 2328da7f033dSHerbert Xu .vecs = camellia_cbc_enc_tv_template, 2329da7f033dSHerbert Xu .count = CAMELLIA_CBC_ENC_TEST_VECTORS 2330da7f033dSHerbert Xu }, 2331da7f033dSHerbert Xu .dec = { 2332da7f033dSHerbert Xu .vecs = camellia_cbc_dec_tv_template, 2333da7f033dSHerbert Xu .count = CAMELLIA_CBC_DEC_TEST_VECTORS 2334da7f033dSHerbert Xu } 2335da7f033dSHerbert Xu } 2336da7f033dSHerbert Xu } 2337da7f033dSHerbert Xu }, { 2338a2c58260SJohannes Goetzfried .alg = "cbc(cast5)", 2339a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 2340a2c58260SJohannes Goetzfried .suite = { 2341a2c58260SJohannes Goetzfried .cipher = { 2342a2c58260SJohannes Goetzfried .enc = { 2343a2c58260SJohannes Goetzfried .vecs = cast5_cbc_enc_tv_template, 2344a2c58260SJohannes Goetzfried .count = CAST5_CBC_ENC_TEST_VECTORS 2345a2c58260SJohannes Goetzfried }, 2346a2c58260SJohannes Goetzfried .dec = { 2347a2c58260SJohannes Goetzfried .vecs = cast5_cbc_dec_tv_template, 2348a2c58260SJohannes Goetzfried .count = CAST5_CBC_DEC_TEST_VECTORS 2349a2c58260SJohannes Goetzfried } 2350a2c58260SJohannes Goetzfried } 2351a2c58260SJohannes Goetzfried } 2352a2c58260SJohannes Goetzfried }, { 23539b8b0405SJohannes Goetzfried .alg = "cbc(cast6)", 23549b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 23559b8b0405SJohannes Goetzfried .suite = { 23569b8b0405SJohannes Goetzfried .cipher = { 23579b8b0405SJohannes Goetzfried .enc = { 23589b8b0405SJohannes Goetzfried .vecs = cast6_cbc_enc_tv_template, 23599b8b0405SJohannes Goetzfried .count = CAST6_CBC_ENC_TEST_VECTORS 23609b8b0405SJohannes Goetzfried }, 23619b8b0405SJohannes Goetzfried .dec = { 23629b8b0405SJohannes Goetzfried .vecs = cast6_cbc_dec_tv_template, 23639b8b0405SJohannes Goetzfried .count = CAST6_CBC_DEC_TEST_VECTORS 23649b8b0405SJohannes Goetzfried } 23659b8b0405SJohannes Goetzfried } 23669b8b0405SJohannes Goetzfried } 23679b8b0405SJohannes Goetzfried }, { 2368da7f033dSHerbert Xu .alg = "cbc(des)", 23691aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2370da7f033dSHerbert Xu .suite = { 2371da7f033dSHerbert Xu .cipher = { 2372da7f033dSHerbert Xu .enc = { 2373da7f033dSHerbert Xu .vecs = des_cbc_enc_tv_template, 2374da7f033dSHerbert Xu .count = DES_CBC_ENC_TEST_VECTORS 2375da7f033dSHerbert Xu }, 2376da7f033dSHerbert Xu .dec = { 2377da7f033dSHerbert Xu .vecs = des_cbc_dec_tv_template, 2378da7f033dSHerbert Xu .count = DES_CBC_DEC_TEST_VECTORS 2379da7f033dSHerbert Xu } 2380da7f033dSHerbert Xu } 2381da7f033dSHerbert Xu } 2382da7f033dSHerbert Xu }, { 2383da7f033dSHerbert Xu .alg = "cbc(des3_ede)", 23841aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2385a1915d51SJarod Wilson .fips_allowed = 1, 2386da7f033dSHerbert Xu .suite = { 2387da7f033dSHerbert Xu .cipher = { 2388da7f033dSHerbert Xu .enc = { 2389da7f033dSHerbert Xu .vecs = des3_ede_cbc_enc_tv_template, 2390da7f033dSHerbert Xu .count = DES3_EDE_CBC_ENC_TEST_VECTORS 2391da7f033dSHerbert Xu }, 2392da7f033dSHerbert Xu .dec = { 2393da7f033dSHerbert Xu .vecs = des3_ede_cbc_dec_tv_template, 2394da7f033dSHerbert Xu .count = DES3_EDE_CBC_DEC_TEST_VECTORS 2395da7f033dSHerbert Xu } 2396da7f033dSHerbert Xu } 2397da7f033dSHerbert Xu } 2398da7f033dSHerbert Xu }, { 23999d25917dSJussi Kivilinna .alg = "cbc(serpent)", 24009d25917dSJussi Kivilinna .test = alg_test_skcipher, 24019d25917dSJussi Kivilinna .suite = { 24029d25917dSJussi Kivilinna .cipher = { 24039d25917dSJussi Kivilinna .enc = { 24049d25917dSJussi Kivilinna .vecs = serpent_cbc_enc_tv_template, 24059d25917dSJussi Kivilinna .count = SERPENT_CBC_ENC_TEST_VECTORS 24069d25917dSJussi Kivilinna }, 24079d25917dSJussi Kivilinna .dec = { 24089d25917dSJussi Kivilinna .vecs = serpent_cbc_dec_tv_template, 24099d25917dSJussi Kivilinna .count = SERPENT_CBC_DEC_TEST_VECTORS 24109d25917dSJussi Kivilinna } 24119d25917dSJussi Kivilinna } 24129d25917dSJussi Kivilinna } 24139d25917dSJussi Kivilinna }, { 2414da7f033dSHerbert Xu .alg = "cbc(twofish)", 24151aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2416da7f033dSHerbert Xu .suite = { 2417da7f033dSHerbert Xu .cipher = { 2418da7f033dSHerbert Xu .enc = { 2419da7f033dSHerbert Xu .vecs = tf_cbc_enc_tv_template, 2420da7f033dSHerbert Xu .count = TF_CBC_ENC_TEST_VECTORS 2421da7f033dSHerbert Xu }, 2422da7f033dSHerbert Xu .dec = { 2423da7f033dSHerbert Xu .vecs = tf_cbc_dec_tv_template, 2424da7f033dSHerbert Xu .count = TF_CBC_DEC_TEST_VECTORS 2425da7f033dSHerbert Xu } 2426da7f033dSHerbert Xu } 2427da7f033dSHerbert Xu } 2428da7f033dSHerbert Xu }, { 2429da7f033dSHerbert Xu .alg = "ccm(aes)", 2430da7f033dSHerbert Xu .test = alg_test_aead, 2431a1915d51SJarod Wilson .fips_allowed = 1, 2432da7f033dSHerbert Xu .suite = { 2433da7f033dSHerbert Xu .aead = { 2434da7f033dSHerbert Xu .enc = { 2435da7f033dSHerbert Xu .vecs = aes_ccm_enc_tv_template, 2436da7f033dSHerbert Xu .count = AES_CCM_ENC_TEST_VECTORS 2437da7f033dSHerbert Xu }, 2438da7f033dSHerbert Xu .dec = { 2439da7f033dSHerbert Xu .vecs = aes_ccm_dec_tv_template, 2440da7f033dSHerbert Xu .count = AES_CCM_DEC_TEST_VECTORS 2441da7f033dSHerbert Xu } 2442da7f033dSHerbert Xu } 2443da7f033dSHerbert Xu } 2444da7f033dSHerbert Xu }, { 24453590ebf2SMartin Willi .alg = "chacha20", 24463590ebf2SMartin Willi .test = alg_test_skcipher, 24473590ebf2SMartin Willi .suite = { 24483590ebf2SMartin Willi .cipher = { 24493590ebf2SMartin Willi .enc = { 24503590ebf2SMartin Willi .vecs = chacha20_enc_tv_template, 24513590ebf2SMartin Willi .count = CHACHA20_ENC_TEST_VECTORS 24523590ebf2SMartin Willi }, 24533590ebf2SMartin Willi .dec = { 24543590ebf2SMartin Willi .vecs = chacha20_enc_tv_template, 24553590ebf2SMartin Willi .count = CHACHA20_ENC_TEST_VECTORS 24563590ebf2SMartin Willi }, 24573590ebf2SMartin Willi } 24583590ebf2SMartin Willi } 24593590ebf2SMartin Willi }, { 246093b5e86aSJussi Kivilinna .alg = "cmac(aes)", 24618f183751SStephan Mueller .fips_allowed = 1, 246293b5e86aSJussi Kivilinna .test = alg_test_hash, 246393b5e86aSJussi Kivilinna .suite = { 246493b5e86aSJussi Kivilinna .hash = { 246593b5e86aSJussi Kivilinna .vecs = aes_cmac128_tv_template, 246693b5e86aSJussi Kivilinna .count = CMAC_AES_TEST_VECTORS 246793b5e86aSJussi Kivilinna } 246893b5e86aSJussi Kivilinna } 246993b5e86aSJussi Kivilinna }, { 247093b5e86aSJussi Kivilinna .alg = "cmac(des3_ede)", 24718f183751SStephan Mueller .fips_allowed = 1, 247293b5e86aSJussi Kivilinna .test = alg_test_hash, 247393b5e86aSJussi Kivilinna .suite = { 247493b5e86aSJussi Kivilinna .hash = { 247593b5e86aSJussi Kivilinna .vecs = des3_ede_cmac64_tv_template, 247693b5e86aSJussi Kivilinna .count = CMAC_DES3_EDE_TEST_VECTORS 247793b5e86aSJussi Kivilinna } 247893b5e86aSJussi Kivilinna } 247993b5e86aSJussi Kivilinna }, { 2480e448370dSJussi Kivilinna .alg = "compress_null", 2481e448370dSJussi Kivilinna .test = alg_test_null, 2482e448370dSJussi Kivilinna }, { 2483ebb3472fSArd Biesheuvel .alg = "crc32", 2484ebb3472fSArd Biesheuvel .test = alg_test_hash, 2485ebb3472fSArd Biesheuvel .suite = { 2486ebb3472fSArd Biesheuvel .hash = { 2487ebb3472fSArd Biesheuvel .vecs = crc32_tv_template, 2488ebb3472fSArd Biesheuvel .count = CRC32_TEST_VECTORS 2489ebb3472fSArd Biesheuvel } 2490ebb3472fSArd Biesheuvel } 2491ebb3472fSArd Biesheuvel }, { 2492da7f033dSHerbert Xu .alg = "crc32c", 24938e3ee85eSHerbert Xu .test = alg_test_crc32c, 2494a1915d51SJarod Wilson .fips_allowed = 1, 2495da7f033dSHerbert Xu .suite = { 2496da7f033dSHerbert Xu .hash = { 2497da7f033dSHerbert Xu .vecs = crc32c_tv_template, 2498da7f033dSHerbert Xu .count = CRC32C_TEST_VECTORS 2499da7f033dSHerbert Xu } 2500da7f033dSHerbert Xu } 2501da7f033dSHerbert Xu }, { 250268411521SHerbert Xu .alg = "crct10dif", 250368411521SHerbert Xu .test = alg_test_hash, 250468411521SHerbert Xu .fips_allowed = 1, 250568411521SHerbert Xu .suite = { 250668411521SHerbert Xu .hash = { 250768411521SHerbert Xu .vecs = crct10dif_tv_template, 250868411521SHerbert Xu .count = CRCT10DIF_TEST_VECTORS 250968411521SHerbert Xu } 251068411521SHerbert Xu } 251168411521SHerbert Xu }, { 25126c79294fSMilan Broz .alg = "cryptd(__driver-cbc-aes-aesni)", 25136c79294fSMilan Broz .test = alg_test_null, 25146c79294fSMilan Broz .fips_allowed = 1, 25156c79294fSMilan Broz }, { 2516d9b1d2e7SJussi Kivilinna .alg = "cryptd(__driver-cbc-camellia-aesni)", 2517d9b1d2e7SJussi Kivilinna .test = alg_test_null, 2518d9b1d2e7SJussi Kivilinna }, { 2519f3f935a7SJussi Kivilinna .alg = "cryptd(__driver-cbc-camellia-aesni-avx2)", 2520f3f935a7SJussi Kivilinna .test = alg_test_null, 2521f3f935a7SJussi Kivilinna }, { 252256d76c96SJussi Kivilinna .alg = "cryptd(__driver-cbc-serpent-avx2)", 252356d76c96SJussi Kivilinna .test = alg_test_null, 252456d76c96SJussi Kivilinna }, { 2525863b557aSYouquan, Song .alg = "cryptd(__driver-ecb-aes-aesni)", 2526863b557aSYouquan, Song .test = alg_test_null, 25276c79294fSMilan Broz .fips_allowed = 1, 2528863b557aSYouquan, Song }, { 2529d9b1d2e7SJussi Kivilinna .alg = "cryptd(__driver-ecb-camellia-aesni)", 2530d9b1d2e7SJussi Kivilinna .test = alg_test_null, 2531d9b1d2e7SJussi Kivilinna }, { 2532f3f935a7SJussi Kivilinna .alg = "cryptd(__driver-ecb-camellia-aesni-avx2)", 2533f3f935a7SJussi Kivilinna .test = alg_test_null, 2534f3f935a7SJussi Kivilinna }, { 25354d6d6a2cSJohannes Goetzfried .alg = "cryptd(__driver-ecb-cast5-avx)", 25364d6d6a2cSJohannes Goetzfried .test = alg_test_null, 25374d6d6a2cSJohannes Goetzfried }, { 25384ea1277dSJohannes Goetzfried .alg = "cryptd(__driver-ecb-cast6-avx)", 25394ea1277dSJohannes Goetzfried .test = alg_test_null, 25404ea1277dSJohannes Goetzfried }, { 25417efe4076SJohannes Goetzfried .alg = "cryptd(__driver-ecb-serpent-avx)", 25427efe4076SJohannes Goetzfried .test = alg_test_null, 25437efe4076SJohannes Goetzfried }, { 254456d76c96SJussi Kivilinna .alg = "cryptd(__driver-ecb-serpent-avx2)", 254556d76c96SJussi Kivilinna .test = alg_test_null, 254656d76c96SJussi Kivilinna }, { 2547937c30d7SJussi Kivilinna .alg = "cryptd(__driver-ecb-serpent-sse2)", 2548937c30d7SJussi Kivilinna .test = alg_test_null, 2549937c30d7SJussi Kivilinna }, { 2550107778b5SJohannes Goetzfried .alg = "cryptd(__driver-ecb-twofish-avx)", 2551107778b5SJohannes Goetzfried .test = alg_test_null, 2552107778b5SJohannes Goetzfried }, { 25536c79294fSMilan Broz .alg = "cryptd(__driver-gcm-aes-aesni)", 25546c79294fSMilan Broz .test = alg_test_null, 25556c79294fSMilan Broz .fips_allowed = 1, 25566c79294fSMilan Broz }, { 2557863b557aSYouquan, Song .alg = "cryptd(__ghash-pclmulqdqni)", 2558863b557aSYouquan, Song .test = alg_test_null, 25596c79294fSMilan Broz .fips_allowed = 1, 2560863b557aSYouquan, Song }, { 2561f7cb80f2SJarod Wilson .alg = "ctr(aes)", 2562f7cb80f2SJarod Wilson .test = alg_test_skcipher, 2563a1915d51SJarod Wilson .fips_allowed = 1, 2564f7cb80f2SJarod Wilson .suite = { 2565f7cb80f2SJarod Wilson .cipher = { 2566f7cb80f2SJarod Wilson .enc = { 2567f7cb80f2SJarod Wilson .vecs = aes_ctr_enc_tv_template, 2568f7cb80f2SJarod Wilson .count = AES_CTR_ENC_TEST_VECTORS 2569f7cb80f2SJarod Wilson }, 2570f7cb80f2SJarod Wilson .dec = { 2571f7cb80f2SJarod Wilson .vecs = aes_ctr_dec_tv_template, 2572f7cb80f2SJarod Wilson .count = AES_CTR_DEC_TEST_VECTORS 2573f7cb80f2SJarod Wilson } 2574f7cb80f2SJarod Wilson } 2575f7cb80f2SJarod Wilson } 2576f7cb80f2SJarod Wilson }, { 257785b63e34SJussi Kivilinna .alg = "ctr(blowfish)", 257885b63e34SJussi Kivilinna .test = alg_test_skcipher, 257985b63e34SJussi Kivilinna .suite = { 258085b63e34SJussi Kivilinna .cipher = { 258185b63e34SJussi Kivilinna .enc = { 258285b63e34SJussi Kivilinna .vecs = bf_ctr_enc_tv_template, 258385b63e34SJussi Kivilinna .count = BF_CTR_ENC_TEST_VECTORS 258485b63e34SJussi Kivilinna }, 258585b63e34SJussi Kivilinna .dec = { 258685b63e34SJussi Kivilinna .vecs = bf_ctr_dec_tv_template, 258785b63e34SJussi Kivilinna .count = BF_CTR_DEC_TEST_VECTORS 258885b63e34SJussi Kivilinna } 258985b63e34SJussi Kivilinna } 259085b63e34SJussi Kivilinna } 259185b63e34SJussi Kivilinna }, { 25920840605eSJussi Kivilinna .alg = "ctr(camellia)", 25930840605eSJussi Kivilinna .test = alg_test_skcipher, 25940840605eSJussi Kivilinna .suite = { 25950840605eSJussi Kivilinna .cipher = { 25960840605eSJussi Kivilinna .enc = { 25970840605eSJussi Kivilinna .vecs = camellia_ctr_enc_tv_template, 25980840605eSJussi Kivilinna .count = CAMELLIA_CTR_ENC_TEST_VECTORS 25990840605eSJussi Kivilinna }, 26000840605eSJussi Kivilinna .dec = { 26010840605eSJussi Kivilinna .vecs = camellia_ctr_dec_tv_template, 26020840605eSJussi Kivilinna .count = CAMELLIA_CTR_DEC_TEST_VECTORS 26030840605eSJussi Kivilinna } 26040840605eSJussi Kivilinna } 26050840605eSJussi Kivilinna } 26060840605eSJussi Kivilinna }, { 2607a2c58260SJohannes Goetzfried .alg = "ctr(cast5)", 2608a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 2609a2c58260SJohannes Goetzfried .suite = { 2610a2c58260SJohannes Goetzfried .cipher = { 2611a2c58260SJohannes Goetzfried .enc = { 2612a2c58260SJohannes Goetzfried .vecs = cast5_ctr_enc_tv_template, 2613a2c58260SJohannes Goetzfried .count = CAST5_CTR_ENC_TEST_VECTORS 2614a2c58260SJohannes Goetzfried }, 2615a2c58260SJohannes Goetzfried .dec = { 2616a2c58260SJohannes Goetzfried .vecs = cast5_ctr_dec_tv_template, 2617a2c58260SJohannes Goetzfried .count = CAST5_CTR_DEC_TEST_VECTORS 2618a2c58260SJohannes Goetzfried } 2619a2c58260SJohannes Goetzfried } 2620a2c58260SJohannes Goetzfried } 2621a2c58260SJohannes Goetzfried }, { 26229b8b0405SJohannes Goetzfried .alg = "ctr(cast6)", 26239b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 26249b8b0405SJohannes Goetzfried .suite = { 26259b8b0405SJohannes Goetzfried .cipher = { 26269b8b0405SJohannes Goetzfried .enc = { 26279b8b0405SJohannes Goetzfried .vecs = cast6_ctr_enc_tv_template, 26289b8b0405SJohannes Goetzfried .count = CAST6_CTR_ENC_TEST_VECTORS 26299b8b0405SJohannes Goetzfried }, 26309b8b0405SJohannes Goetzfried .dec = { 26319b8b0405SJohannes Goetzfried .vecs = cast6_ctr_dec_tv_template, 26329b8b0405SJohannes Goetzfried .count = CAST6_CTR_DEC_TEST_VECTORS 26339b8b0405SJohannes Goetzfried } 26349b8b0405SJohannes Goetzfried } 26359b8b0405SJohannes Goetzfried } 26369b8b0405SJohannes Goetzfried }, { 26378163fc30SJussi Kivilinna .alg = "ctr(des)", 26388163fc30SJussi Kivilinna .test = alg_test_skcipher, 26398163fc30SJussi Kivilinna .suite = { 26408163fc30SJussi Kivilinna .cipher = { 26418163fc30SJussi Kivilinna .enc = { 26428163fc30SJussi Kivilinna .vecs = des_ctr_enc_tv_template, 26438163fc30SJussi Kivilinna .count = DES_CTR_ENC_TEST_VECTORS 26448163fc30SJussi Kivilinna }, 26458163fc30SJussi Kivilinna .dec = { 26468163fc30SJussi Kivilinna .vecs = des_ctr_dec_tv_template, 26478163fc30SJussi Kivilinna .count = DES_CTR_DEC_TEST_VECTORS 26488163fc30SJussi Kivilinna } 26498163fc30SJussi Kivilinna } 26508163fc30SJussi Kivilinna } 26518163fc30SJussi Kivilinna }, { 2652e080b17aSJussi Kivilinna .alg = "ctr(des3_ede)", 2653e080b17aSJussi Kivilinna .test = alg_test_skcipher, 2654e080b17aSJussi Kivilinna .suite = { 2655e080b17aSJussi Kivilinna .cipher = { 2656e080b17aSJussi Kivilinna .enc = { 2657e080b17aSJussi Kivilinna .vecs = des3_ede_ctr_enc_tv_template, 2658e080b17aSJussi Kivilinna .count = DES3_EDE_CTR_ENC_TEST_VECTORS 2659e080b17aSJussi Kivilinna }, 2660e080b17aSJussi Kivilinna .dec = { 2661e080b17aSJussi Kivilinna .vecs = des3_ede_ctr_dec_tv_template, 2662e080b17aSJussi Kivilinna .count = DES3_EDE_CTR_DEC_TEST_VECTORS 2663e080b17aSJussi Kivilinna } 2664e080b17aSJussi Kivilinna } 2665e080b17aSJussi Kivilinna } 2666e080b17aSJussi Kivilinna }, { 26679d25917dSJussi Kivilinna .alg = "ctr(serpent)", 26689d25917dSJussi Kivilinna .test = alg_test_skcipher, 26699d25917dSJussi Kivilinna .suite = { 26709d25917dSJussi Kivilinna .cipher = { 26719d25917dSJussi Kivilinna .enc = { 26729d25917dSJussi Kivilinna .vecs = serpent_ctr_enc_tv_template, 26739d25917dSJussi Kivilinna .count = SERPENT_CTR_ENC_TEST_VECTORS 26749d25917dSJussi Kivilinna }, 26759d25917dSJussi Kivilinna .dec = { 26769d25917dSJussi Kivilinna .vecs = serpent_ctr_dec_tv_template, 26779d25917dSJussi Kivilinna .count = SERPENT_CTR_DEC_TEST_VECTORS 26789d25917dSJussi Kivilinna } 26799d25917dSJussi Kivilinna } 26809d25917dSJussi Kivilinna } 26819d25917dSJussi Kivilinna }, { 2682573da620SJussi Kivilinna .alg = "ctr(twofish)", 2683573da620SJussi Kivilinna .test = alg_test_skcipher, 2684573da620SJussi Kivilinna .suite = { 2685573da620SJussi Kivilinna .cipher = { 2686573da620SJussi Kivilinna .enc = { 2687573da620SJussi Kivilinna .vecs = tf_ctr_enc_tv_template, 2688573da620SJussi Kivilinna .count = TF_CTR_ENC_TEST_VECTORS 2689573da620SJussi Kivilinna }, 2690573da620SJussi Kivilinna .dec = { 2691573da620SJussi Kivilinna .vecs = tf_ctr_dec_tv_template, 2692573da620SJussi Kivilinna .count = TF_CTR_DEC_TEST_VECTORS 2693573da620SJussi Kivilinna } 2694573da620SJussi Kivilinna } 2695573da620SJussi Kivilinna } 2696573da620SJussi Kivilinna }, { 2697da7f033dSHerbert Xu .alg = "cts(cbc(aes))", 26981aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2699da7f033dSHerbert Xu .suite = { 2700da7f033dSHerbert Xu .cipher = { 2701da7f033dSHerbert Xu .enc = { 2702da7f033dSHerbert Xu .vecs = cts_mode_enc_tv_template, 2703da7f033dSHerbert Xu .count = CTS_MODE_ENC_TEST_VECTORS 2704da7f033dSHerbert Xu }, 2705da7f033dSHerbert Xu .dec = { 2706da7f033dSHerbert Xu .vecs = cts_mode_dec_tv_template, 2707da7f033dSHerbert Xu .count = CTS_MODE_DEC_TEST_VECTORS 2708da7f033dSHerbert Xu } 2709da7f033dSHerbert Xu } 2710da7f033dSHerbert Xu } 2711da7f033dSHerbert Xu }, { 2712da7f033dSHerbert Xu .alg = "deflate", 2713da7f033dSHerbert Xu .test = alg_test_comp, 27140818904dSMilan Broz .fips_allowed = 1, 2715da7f033dSHerbert Xu .suite = { 2716da7f033dSHerbert Xu .comp = { 2717da7f033dSHerbert Xu .comp = { 2718da7f033dSHerbert Xu .vecs = deflate_comp_tv_template, 2719da7f033dSHerbert Xu .count = DEFLATE_COMP_TEST_VECTORS 2720da7f033dSHerbert Xu }, 2721da7f033dSHerbert Xu .decomp = { 2722da7f033dSHerbert Xu .vecs = deflate_decomp_tv_template, 2723da7f033dSHerbert Xu .count = DEFLATE_DECOMP_TEST_VECTORS 2724da7f033dSHerbert Xu } 2725da7f033dSHerbert Xu } 2726da7f033dSHerbert Xu } 2727da7f033dSHerbert Xu }, { 2728e448370dSJussi Kivilinna .alg = "digest_null", 2729e448370dSJussi Kivilinna .test = alg_test_null, 2730e448370dSJussi Kivilinna }, { 273164d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes128", 273264d1cdfbSStephan Mueller .test = alg_test_drbg, 273364d1cdfbSStephan Mueller .fips_allowed = 1, 273464d1cdfbSStephan Mueller .suite = { 273564d1cdfbSStephan Mueller .drbg = { 273664d1cdfbSStephan Mueller .vecs = drbg_nopr_ctr_aes128_tv_template, 273764d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_ctr_aes128_tv_template) 273864d1cdfbSStephan Mueller } 273964d1cdfbSStephan Mueller } 274064d1cdfbSStephan Mueller }, { 274164d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes192", 274264d1cdfbSStephan Mueller .test = alg_test_drbg, 274364d1cdfbSStephan Mueller .fips_allowed = 1, 274464d1cdfbSStephan Mueller .suite = { 274564d1cdfbSStephan Mueller .drbg = { 274664d1cdfbSStephan Mueller .vecs = drbg_nopr_ctr_aes192_tv_template, 274764d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_ctr_aes192_tv_template) 274864d1cdfbSStephan Mueller } 274964d1cdfbSStephan Mueller } 275064d1cdfbSStephan Mueller }, { 275164d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes256", 275264d1cdfbSStephan Mueller .test = alg_test_drbg, 275364d1cdfbSStephan Mueller .fips_allowed = 1, 275464d1cdfbSStephan Mueller .suite = { 275564d1cdfbSStephan Mueller .drbg = { 275664d1cdfbSStephan Mueller .vecs = drbg_nopr_ctr_aes256_tv_template, 275764d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_ctr_aes256_tv_template) 275864d1cdfbSStephan Mueller } 275964d1cdfbSStephan Mueller } 276064d1cdfbSStephan Mueller }, { 276164d1cdfbSStephan Mueller /* 276264d1cdfbSStephan Mueller * There is no need to specifically test the DRBG with every 276364d1cdfbSStephan Mueller * backend cipher -- covered by drbg_nopr_hmac_sha256 test 276464d1cdfbSStephan Mueller */ 276564d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha1", 276664d1cdfbSStephan Mueller .fips_allowed = 1, 276764d1cdfbSStephan Mueller .test = alg_test_null, 276864d1cdfbSStephan Mueller }, { 276964d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha256", 277064d1cdfbSStephan Mueller .test = alg_test_drbg, 277164d1cdfbSStephan Mueller .fips_allowed = 1, 277264d1cdfbSStephan Mueller .suite = { 277364d1cdfbSStephan Mueller .drbg = { 277464d1cdfbSStephan Mueller .vecs = drbg_nopr_hmac_sha256_tv_template, 277564d1cdfbSStephan Mueller .count = 277664d1cdfbSStephan Mueller ARRAY_SIZE(drbg_nopr_hmac_sha256_tv_template) 277764d1cdfbSStephan Mueller } 277864d1cdfbSStephan Mueller } 277964d1cdfbSStephan Mueller }, { 278064d1cdfbSStephan Mueller /* covered by drbg_nopr_hmac_sha256 test */ 278164d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha384", 278264d1cdfbSStephan Mueller .fips_allowed = 1, 278364d1cdfbSStephan Mueller .test = alg_test_null, 278464d1cdfbSStephan Mueller }, { 278564d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha512", 278664d1cdfbSStephan Mueller .test = alg_test_null, 278764d1cdfbSStephan Mueller .fips_allowed = 1, 278864d1cdfbSStephan Mueller }, { 278964d1cdfbSStephan Mueller .alg = "drbg_nopr_sha1", 279064d1cdfbSStephan Mueller .fips_allowed = 1, 279164d1cdfbSStephan Mueller .test = alg_test_null, 279264d1cdfbSStephan Mueller }, { 279364d1cdfbSStephan Mueller .alg = "drbg_nopr_sha256", 279464d1cdfbSStephan Mueller .test = alg_test_drbg, 279564d1cdfbSStephan Mueller .fips_allowed = 1, 279664d1cdfbSStephan Mueller .suite = { 279764d1cdfbSStephan Mueller .drbg = { 279864d1cdfbSStephan Mueller .vecs = drbg_nopr_sha256_tv_template, 279964d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_sha256_tv_template) 280064d1cdfbSStephan Mueller } 280164d1cdfbSStephan Mueller } 280264d1cdfbSStephan Mueller }, { 280364d1cdfbSStephan Mueller /* covered by drbg_nopr_sha256 test */ 280464d1cdfbSStephan Mueller .alg = "drbg_nopr_sha384", 280564d1cdfbSStephan Mueller .fips_allowed = 1, 280664d1cdfbSStephan Mueller .test = alg_test_null, 280764d1cdfbSStephan Mueller }, { 280864d1cdfbSStephan Mueller .alg = "drbg_nopr_sha512", 280964d1cdfbSStephan Mueller .fips_allowed = 1, 281064d1cdfbSStephan Mueller .test = alg_test_null, 281164d1cdfbSStephan Mueller }, { 281264d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes128", 281364d1cdfbSStephan Mueller .test = alg_test_drbg, 281464d1cdfbSStephan Mueller .fips_allowed = 1, 281564d1cdfbSStephan Mueller .suite = { 281664d1cdfbSStephan Mueller .drbg = { 281764d1cdfbSStephan Mueller .vecs = drbg_pr_ctr_aes128_tv_template, 281864d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_pr_ctr_aes128_tv_template) 281964d1cdfbSStephan Mueller } 282064d1cdfbSStephan Mueller } 282164d1cdfbSStephan Mueller }, { 282264d1cdfbSStephan Mueller /* covered by drbg_pr_ctr_aes128 test */ 282364d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes192", 282464d1cdfbSStephan Mueller .fips_allowed = 1, 282564d1cdfbSStephan Mueller .test = alg_test_null, 282664d1cdfbSStephan Mueller }, { 282764d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes256", 282864d1cdfbSStephan Mueller .fips_allowed = 1, 282964d1cdfbSStephan Mueller .test = alg_test_null, 283064d1cdfbSStephan Mueller }, { 283164d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha1", 283264d1cdfbSStephan Mueller .fips_allowed = 1, 283364d1cdfbSStephan Mueller .test = alg_test_null, 283464d1cdfbSStephan Mueller }, { 283564d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha256", 283664d1cdfbSStephan Mueller .test = alg_test_drbg, 283764d1cdfbSStephan Mueller .fips_allowed = 1, 283864d1cdfbSStephan Mueller .suite = { 283964d1cdfbSStephan Mueller .drbg = { 284064d1cdfbSStephan Mueller .vecs = drbg_pr_hmac_sha256_tv_template, 284164d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_pr_hmac_sha256_tv_template) 284264d1cdfbSStephan Mueller } 284364d1cdfbSStephan Mueller } 284464d1cdfbSStephan Mueller }, { 284564d1cdfbSStephan Mueller /* covered by drbg_pr_hmac_sha256 test */ 284664d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha384", 284764d1cdfbSStephan Mueller .fips_allowed = 1, 284864d1cdfbSStephan Mueller .test = alg_test_null, 284964d1cdfbSStephan Mueller }, { 285064d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha512", 285164d1cdfbSStephan Mueller .test = alg_test_null, 285264d1cdfbSStephan Mueller .fips_allowed = 1, 285364d1cdfbSStephan Mueller }, { 285464d1cdfbSStephan Mueller .alg = "drbg_pr_sha1", 285564d1cdfbSStephan Mueller .fips_allowed = 1, 285664d1cdfbSStephan Mueller .test = alg_test_null, 285764d1cdfbSStephan Mueller }, { 285864d1cdfbSStephan Mueller .alg = "drbg_pr_sha256", 285964d1cdfbSStephan Mueller .test = alg_test_drbg, 286064d1cdfbSStephan Mueller .fips_allowed = 1, 286164d1cdfbSStephan Mueller .suite = { 286264d1cdfbSStephan Mueller .drbg = { 286364d1cdfbSStephan Mueller .vecs = drbg_pr_sha256_tv_template, 286464d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_pr_sha256_tv_template) 286564d1cdfbSStephan Mueller } 286664d1cdfbSStephan Mueller } 286764d1cdfbSStephan Mueller }, { 286864d1cdfbSStephan Mueller /* covered by drbg_pr_sha256 test */ 286964d1cdfbSStephan Mueller .alg = "drbg_pr_sha384", 287064d1cdfbSStephan Mueller .fips_allowed = 1, 287164d1cdfbSStephan Mueller .test = alg_test_null, 287264d1cdfbSStephan Mueller }, { 287364d1cdfbSStephan Mueller .alg = "drbg_pr_sha512", 287464d1cdfbSStephan Mueller .fips_allowed = 1, 287564d1cdfbSStephan Mueller .test = alg_test_null, 287664d1cdfbSStephan Mueller }, { 2877863b557aSYouquan, Song .alg = "ecb(__aes-aesni)", 2878863b557aSYouquan, Song .test = alg_test_null, 28796c79294fSMilan Broz .fips_allowed = 1, 2880863b557aSYouquan, Song }, { 2881da7f033dSHerbert Xu .alg = "ecb(aes)", 28821aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2883a1915d51SJarod Wilson .fips_allowed = 1, 2884da7f033dSHerbert Xu .suite = { 2885da7f033dSHerbert Xu .cipher = { 2886da7f033dSHerbert Xu .enc = { 2887da7f033dSHerbert Xu .vecs = aes_enc_tv_template, 2888da7f033dSHerbert Xu .count = AES_ENC_TEST_VECTORS 2889da7f033dSHerbert Xu }, 2890da7f033dSHerbert Xu .dec = { 2891da7f033dSHerbert Xu .vecs = aes_dec_tv_template, 2892da7f033dSHerbert Xu .count = AES_DEC_TEST_VECTORS 2893da7f033dSHerbert Xu } 2894da7f033dSHerbert Xu } 2895da7f033dSHerbert Xu } 2896da7f033dSHerbert Xu }, { 2897da7f033dSHerbert Xu .alg = "ecb(anubis)", 28981aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2899da7f033dSHerbert Xu .suite = { 2900da7f033dSHerbert Xu .cipher = { 2901da7f033dSHerbert Xu .enc = { 2902da7f033dSHerbert Xu .vecs = anubis_enc_tv_template, 2903da7f033dSHerbert Xu .count = ANUBIS_ENC_TEST_VECTORS 2904da7f033dSHerbert Xu }, 2905da7f033dSHerbert Xu .dec = { 2906da7f033dSHerbert Xu .vecs = anubis_dec_tv_template, 2907da7f033dSHerbert Xu .count = ANUBIS_DEC_TEST_VECTORS 2908da7f033dSHerbert Xu } 2909da7f033dSHerbert Xu } 2910da7f033dSHerbert Xu } 2911da7f033dSHerbert Xu }, { 2912da7f033dSHerbert Xu .alg = "ecb(arc4)", 29131aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2914da7f033dSHerbert Xu .suite = { 2915da7f033dSHerbert Xu .cipher = { 2916da7f033dSHerbert Xu .enc = { 2917da7f033dSHerbert Xu .vecs = arc4_enc_tv_template, 2918da7f033dSHerbert Xu .count = ARC4_ENC_TEST_VECTORS 2919da7f033dSHerbert Xu }, 2920da7f033dSHerbert Xu .dec = { 2921da7f033dSHerbert Xu .vecs = arc4_dec_tv_template, 2922da7f033dSHerbert Xu .count = ARC4_DEC_TEST_VECTORS 2923da7f033dSHerbert Xu } 2924da7f033dSHerbert Xu } 2925da7f033dSHerbert Xu } 2926da7f033dSHerbert Xu }, { 2927da7f033dSHerbert Xu .alg = "ecb(blowfish)", 29281aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2929da7f033dSHerbert Xu .suite = { 2930da7f033dSHerbert Xu .cipher = { 2931da7f033dSHerbert Xu .enc = { 2932da7f033dSHerbert Xu .vecs = bf_enc_tv_template, 2933da7f033dSHerbert Xu .count = BF_ENC_TEST_VECTORS 2934da7f033dSHerbert Xu }, 2935da7f033dSHerbert Xu .dec = { 2936da7f033dSHerbert Xu .vecs = bf_dec_tv_template, 2937da7f033dSHerbert Xu .count = BF_DEC_TEST_VECTORS 2938da7f033dSHerbert Xu } 2939da7f033dSHerbert Xu } 2940da7f033dSHerbert Xu } 2941da7f033dSHerbert Xu }, { 2942da7f033dSHerbert Xu .alg = "ecb(camellia)", 29431aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2944da7f033dSHerbert Xu .suite = { 2945da7f033dSHerbert Xu .cipher = { 2946da7f033dSHerbert Xu .enc = { 2947da7f033dSHerbert Xu .vecs = camellia_enc_tv_template, 2948da7f033dSHerbert Xu .count = CAMELLIA_ENC_TEST_VECTORS 2949da7f033dSHerbert Xu }, 2950da7f033dSHerbert Xu .dec = { 2951da7f033dSHerbert Xu .vecs = camellia_dec_tv_template, 2952da7f033dSHerbert Xu .count = CAMELLIA_DEC_TEST_VECTORS 2953da7f033dSHerbert Xu } 2954da7f033dSHerbert Xu } 2955da7f033dSHerbert Xu } 2956da7f033dSHerbert Xu }, { 2957da7f033dSHerbert Xu .alg = "ecb(cast5)", 29581aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2959da7f033dSHerbert Xu .suite = { 2960da7f033dSHerbert Xu .cipher = { 2961da7f033dSHerbert Xu .enc = { 2962da7f033dSHerbert Xu .vecs = cast5_enc_tv_template, 2963da7f033dSHerbert Xu .count = CAST5_ENC_TEST_VECTORS 2964da7f033dSHerbert Xu }, 2965da7f033dSHerbert Xu .dec = { 2966da7f033dSHerbert Xu .vecs = cast5_dec_tv_template, 2967da7f033dSHerbert Xu .count = CAST5_DEC_TEST_VECTORS 2968da7f033dSHerbert Xu } 2969da7f033dSHerbert Xu } 2970da7f033dSHerbert Xu } 2971da7f033dSHerbert Xu }, { 2972da7f033dSHerbert Xu .alg = "ecb(cast6)", 29731aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2974da7f033dSHerbert Xu .suite = { 2975da7f033dSHerbert Xu .cipher = { 2976da7f033dSHerbert Xu .enc = { 2977da7f033dSHerbert Xu .vecs = cast6_enc_tv_template, 2978da7f033dSHerbert Xu .count = CAST6_ENC_TEST_VECTORS 2979da7f033dSHerbert Xu }, 2980da7f033dSHerbert Xu .dec = { 2981da7f033dSHerbert Xu .vecs = cast6_dec_tv_template, 2982da7f033dSHerbert Xu .count = CAST6_DEC_TEST_VECTORS 2983da7f033dSHerbert Xu } 2984da7f033dSHerbert Xu } 2985da7f033dSHerbert Xu } 2986da7f033dSHerbert Xu }, { 2987e448370dSJussi Kivilinna .alg = "ecb(cipher_null)", 2988e448370dSJussi Kivilinna .test = alg_test_null, 2989e448370dSJussi Kivilinna }, { 2990da7f033dSHerbert Xu .alg = "ecb(des)", 29911aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2992da7f033dSHerbert Xu .suite = { 2993da7f033dSHerbert Xu .cipher = { 2994da7f033dSHerbert Xu .enc = { 2995da7f033dSHerbert Xu .vecs = des_enc_tv_template, 2996da7f033dSHerbert Xu .count = DES_ENC_TEST_VECTORS 2997da7f033dSHerbert Xu }, 2998da7f033dSHerbert Xu .dec = { 2999da7f033dSHerbert Xu .vecs = des_dec_tv_template, 3000da7f033dSHerbert Xu .count = DES_DEC_TEST_VECTORS 3001da7f033dSHerbert Xu } 3002da7f033dSHerbert Xu } 3003da7f033dSHerbert Xu } 3004da7f033dSHerbert Xu }, { 3005da7f033dSHerbert Xu .alg = "ecb(des3_ede)", 30061aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3007a1915d51SJarod Wilson .fips_allowed = 1, 3008da7f033dSHerbert Xu .suite = { 3009da7f033dSHerbert Xu .cipher = { 3010da7f033dSHerbert Xu .enc = { 3011da7f033dSHerbert Xu .vecs = des3_ede_enc_tv_template, 3012da7f033dSHerbert Xu .count = DES3_EDE_ENC_TEST_VECTORS 3013da7f033dSHerbert Xu }, 3014da7f033dSHerbert Xu .dec = { 3015da7f033dSHerbert Xu .vecs = des3_ede_dec_tv_template, 3016da7f033dSHerbert Xu .count = DES3_EDE_DEC_TEST_VECTORS 3017da7f033dSHerbert Xu } 3018da7f033dSHerbert Xu } 3019da7f033dSHerbert Xu } 3020da7f033dSHerbert Xu }, { 302166e5bd00SJussi Kivilinna .alg = "ecb(fcrypt)", 302266e5bd00SJussi Kivilinna .test = alg_test_skcipher, 302366e5bd00SJussi Kivilinna .suite = { 302466e5bd00SJussi Kivilinna .cipher = { 302566e5bd00SJussi Kivilinna .enc = { 302666e5bd00SJussi Kivilinna .vecs = fcrypt_pcbc_enc_tv_template, 302766e5bd00SJussi Kivilinna .count = 1 302866e5bd00SJussi Kivilinna }, 302966e5bd00SJussi Kivilinna .dec = { 303066e5bd00SJussi Kivilinna .vecs = fcrypt_pcbc_dec_tv_template, 303166e5bd00SJussi Kivilinna .count = 1 303266e5bd00SJussi Kivilinna } 303366e5bd00SJussi Kivilinna } 303466e5bd00SJussi Kivilinna } 303566e5bd00SJussi Kivilinna }, { 3036da7f033dSHerbert Xu .alg = "ecb(khazad)", 30371aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3038da7f033dSHerbert Xu .suite = { 3039da7f033dSHerbert Xu .cipher = { 3040da7f033dSHerbert Xu .enc = { 3041da7f033dSHerbert Xu .vecs = khazad_enc_tv_template, 3042da7f033dSHerbert Xu .count = KHAZAD_ENC_TEST_VECTORS 3043da7f033dSHerbert Xu }, 3044da7f033dSHerbert Xu .dec = { 3045da7f033dSHerbert Xu .vecs = khazad_dec_tv_template, 3046da7f033dSHerbert Xu .count = KHAZAD_DEC_TEST_VECTORS 3047da7f033dSHerbert Xu } 3048da7f033dSHerbert Xu } 3049da7f033dSHerbert Xu } 3050da7f033dSHerbert Xu }, { 3051da7f033dSHerbert Xu .alg = "ecb(seed)", 30521aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3053da7f033dSHerbert Xu .suite = { 3054da7f033dSHerbert Xu .cipher = { 3055da7f033dSHerbert Xu .enc = { 3056da7f033dSHerbert Xu .vecs = seed_enc_tv_template, 3057da7f033dSHerbert Xu .count = SEED_ENC_TEST_VECTORS 3058da7f033dSHerbert Xu }, 3059da7f033dSHerbert Xu .dec = { 3060da7f033dSHerbert Xu .vecs = seed_dec_tv_template, 3061da7f033dSHerbert Xu .count = SEED_DEC_TEST_VECTORS 3062da7f033dSHerbert Xu } 3063da7f033dSHerbert Xu } 3064da7f033dSHerbert Xu } 3065da7f033dSHerbert Xu }, { 3066da7f033dSHerbert Xu .alg = "ecb(serpent)", 30671aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3068da7f033dSHerbert Xu .suite = { 3069da7f033dSHerbert Xu .cipher = { 3070da7f033dSHerbert Xu .enc = { 3071da7f033dSHerbert Xu .vecs = serpent_enc_tv_template, 3072da7f033dSHerbert Xu .count = SERPENT_ENC_TEST_VECTORS 3073da7f033dSHerbert Xu }, 3074da7f033dSHerbert Xu .dec = { 3075da7f033dSHerbert Xu .vecs = serpent_dec_tv_template, 3076da7f033dSHerbert Xu .count = SERPENT_DEC_TEST_VECTORS 3077da7f033dSHerbert Xu } 3078da7f033dSHerbert Xu } 3079da7f033dSHerbert Xu } 3080da7f033dSHerbert Xu }, { 3081da7f033dSHerbert Xu .alg = "ecb(tea)", 30821aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3083da7f033dSHerbert Xu .suite = { 3084da7f033dSHerbert Xu .cipher = { 3085da7f033dSHerbert Xu .enc = { 3086da7f033dSHerbert Xu .vecs = tea_enc_tv_template, 3087da7f033dSHerbert Xu .count = TEA_ENC_TEST_VECTORS 3088da7f033dSHerbert Xu }, 3089da7f033dSHerbert Xu .dec = { 3090da7f033dSHerbert Xu .vecs = tea_dec_tv_template, 3091da7f033dSHerbert Xu .count = TEA_DEC_TEST_VECTORS 3092da7f033dSHerbert Xu } 3093da7f033dSHerbert Xu } 3094da7f033dSHerbert Xu } 3095da7f033dSHerbert Xu }, { 3096da7f033dSHerbert Xu .alg = "ecb(tnepres)", 30971aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3098da7f033dSHerbert Xu .suite = { 3099da7f033dSHerbert Xu .cipher = { 3100da7f033dSHerbert Xu .enc = { 3101da7f033dSHerbert Xu .vecs = tnepres_enc_tv_template, 3102da7f033dSHerbert Xu .count = TNEPRES_ENC_TEST_VECTORS 3103da7f033dSHerbert Xu }, 3104da7f033dSHerbert Xu .dec = { 3105da7f033dSHerbert Xu .vecs = tnepres_dec_tv_template, 3106da7f033dSHerbert Xu .count = TNEPRES_DEC_TEST_VECTORS 3107da7f033dSHerbert Xu } 3108da7f033dSHerbert Xu } 3109da7f033dSHerbert Xu } 3110da7f033dSHerbert Xu }, { 3111da7f033dSHerbert Xu .alg = "ecb(twofish)", 31121aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3113da7f033dSHerbert Xu .suite = { 3114da7f033dSHerbert Xu .cipher = { 3115da7f033dSHerbert Xu .enc = { 3116da7f033dSHerbert Xu .vecs = tf_enc_tv_template, 3117da7f033dSHerbert Xu .count = TF_ENC_TEST_VECTORS 3118da7f033dSHerbert Xu }, 3119da7f033dSHerbert Xu .dec = { 3120da7f033dSHerbert Xu .vecs = tf_dec_tv_template, 3121da7f033dSHerbert Xu .count = TF_DEC_TEST_VECTORS 3122da7f033dSHerbert Xu } 3123da7f033dSHerbert Xu } 3124da7f033dSHerbert Xu } 3125da7f033dSHerbert Xu }, { 3126da7f033dSHerbert Xu .alg = "ecb(xeta)", 31271aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3128da7f033dSHerbert Xu .suite = { 3129da7f033dSHerbert Xu .cipher = { 3130da7f033dSHerbert Xu .enc = { 3131da7f033dSHerbert Xu .vecs = xeta_enc_tv_template, 3132da7f033dSHerbert Xu .count = XETA_ENC_TEST_VECTORS 3133da7f033dSHerbert Xu }, 3134da7f033dSHerbert Xu .dec = { 3135da7f033dSHerbert Xu .vecs = xeta_dec_tv_template, 3136da7f033dSHerbert Xu .count = XETA_DEC_TEST_VECTORS 3137da7f033dSHerbert Xu } 3138da7f033dSHerbert Xu } 3139da7f033dSHerbert Xu } 3140da7f033dSHerbert Xu }, { 3141da7f033dSHerbert Xu .alg = "ecb(xtea)", 31421aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3143da7f033dSHerbert Xu .suite = { 3144da7f033dSHerbert Xu .cipher = { 3145da7f033dSHerbert Xu .enc = { 3146da7f033dSHerbert Xu .vecs = xtea_enc_tv_template, 3147da7f033dSHerbert Xu .count = XTEA_ENC_TEST_VECTORS 3148da7f033dSHerbert Xu }, 3149da7f033dSHerbert Xu .dec = { 3150da7f033dSHerbert Xu .vecs = xtea_dec_tv_template, 3151da7f033dSHerbert Xu .count = XTEA_DEC_TEST_VECTORS 3152da7f033dSHerbert Xu } 3153da7f033dSHerbert Xu } 3154da7f033dSHerbert Xu } 3155da7f033dSHerbert Xu }, { 3156da7f033dSHerbert Xu .alg = "gcm(aes)", 3157da7f033dSHerbert Xu .test = alg_test_aead, 3158a1915d51SJarod Wilson .fips_allowed = 1, 3159da7f033dSHerbert Xu .suite = { 3160da7f033dSHerbert Xu .aead = { 3161da7f033dSHerbert Xu .enc = { 3162da7f033dSHerbert Xu .vecs = aes_gcm_enc_tv_template, 3163da7f033dSHerbert Xu .count = AES_GCM_ENC_TEST_VECTORS 3164da7f033dSHerbert Xu }, 3165da7f033dSHerbert Xu .dec = { 3166da7f033dSHerbert Xu .vecs = aes_gcm_dec_tv_template, 3167da7f033dSHerbert Xu .count = AES_GCM_DEC_TEST_VECTORS 3168da7f033dSHerbert Xu } 3169da7f033dSHerbert Xu } 3170da7f033dSHerbert Xu } 3171da7f033dSHerbert Xu }, { 3172507069c9SYouquan, Song .alg = "ghash", 3173507069c9SYouquan, Song .test = alg_test_hash, 317418c0ebd2SJarod Wilson .fips_allowed = 1, 3175507069c9SYouquan, Song .suite = { 3176507069c9SYouquan, Song .hash = { 3177507069c9SYouquan, Song .vecs = ghash_tv_template, 3178507069c9SYouquan, Song .count = GHASH_TEST_VECTORS 3179507069c9SYouquan, Song } 3180507069c9SYouquan, Song } 3181507069c9SYouquan, Song }, { 3182a482b081SSonic Zhang .alg = "hmac(crc32)", 3183a482b081SSonic Zhang .test = alg_test_hash, 3184a482b081SSonic Zhang .suite = { 3185a482b081SSonic Zhang .hash = { 3186a482b081SSonic Zhang .vecs = bfin_crc_tv_template, 3187a482b081SSonic Zhang .count = BFIN_CRC_TEST_VECTORS 3188a482b081SSonic Zhang } 3189a482b081SSonic Zhang } 3190a482b081SSonic Zhang }, { 3191da7f033dSHerbert Xu .alg = "hmac(md5)", 3192da7f033dSHerbert Xu .test = alg_test_hash, 3193da7f033dSHerbert Xu .suite = { 3194da7f033dSHerbert Xu .hash = { 3195da7f033dSHerbert Xu .vecs = hmac_md5_tv_template, 3196da7f033dSHerbert Xu .count = HMAC_MD5_TEST_VECTORS 3197da7f033dSHerbert Xu } 3198da7f033dSHerbert Xu } 3199da7f033dSHerbert Xu }, { 3200da7f033dSHerbert Xu .alg = "hmac(rmd128)", 3201da7f033dSHerbert Xu .test = alg_test_hash, 3202da7f033dSHerbert Xu .suite = { 3203da7f033dSHerbert Xu .hash = { 3204da7f033dSHerbert Xu .vecs = hmac_rmd128_tv_template, 3205da7f033dSHerbert Xu .count = HMAC_RMD128_TEST_VECTORS 3206da7f033dSHerbert Xu } 3207da7f033dSHerbert Xu } 3208da7f033dSHerbert Xu }, { 3209da7f033dSHerbert Xu .alg = "hmac(rmd160)", 3210da7f033dSHerbert Xu .test = alg_test_hash, 3211da7f033dSHerbert Xu .suite = { 3212da7f033dSHerbert Xu .hash = { 3213da7f033dSHerbert Xu .vecs = hmac_rmd160_tv_template, 3214da7f033dSHerbert Xu .count = HMAC_RMD160_TEST_VECTORS 3215da7f033dSHerbert Xu } 3216da7f033dSHerbert Xu } 3217da7f033dSHerbert Xu }, { 3218da7f033dSHerbert Xu .alg = "hmac(sha1)", 3219da7f033dSHerbert Xu .test = alg_test_hash, 3220a1915d51SJarod Wilson .fips_allowed = 1, 3221da7f033dSHerbert Xu .suite = { 3222da7f033dSHerbert Xu .hash = { 3223da7f033dSHerbert Xu .vecs = hmac_sha1_tv_template, 3224da7f033dSHerbert Xu .count = HMAC_SHA1_TEST_VECTORS 3225da7f033dSHerbert Xu } 3226da7f033dSHerbert Xu } 3227da7f033dSHerbert Xu }, { 3228da7f033dSHerbert Xu .alg = "hmac(sha224)", 3229da7f033dSHerbert Xu .test = alg_test_hash, 3230a1915d51SJarod Wilson .fips_allowed = 1, 3231da7f033dSHerbert Xu .suite = { 3232da7f033dSHerbert Xu .hash = { 3233da7f033dSHerbert Xu .vecs = hmac_sha224_tv_template, 3234da7f033dSHerbert Xu .count = HMAC_SHA224_TEST_VECTORS 3235da7f033dSHerbert Xu } 3236da7f033dSHerbert Xu } 3237da7f033dSHerbert Xu }, { 3238da7f033dSHerbert Xu .alg = "hmac(sha256)", 3239da7f033dSHerbert Xu .test = alg_test_hash, 3240a1915d51SJarod Wilson .fips_allowed = 1, 3241da7f033dSHerbert Xu .suite = { 3242da7f033dSHerbert Xu .hash = { 3243da7f033dSHerbert Xu .vecs = hmac_sha256_tv_template, 3244da7f033dSHerbert Xu .count = HMAC_SHA256_TEST_VECTORS 3245da7f033dSHerbert Xu } 3246da7f033dSHerbert Xu } 3247da7f033dSHerbert Xu }, { 3248da7f033dSHerbert Xu .alg = "hmac(sha384)", 3249da7f033dSHerbert Xu .test = alg_test_hash, 3250a1915d51SJarod Wilson .fips_allowed = 1, 3251da7f033dSHerbert Xu .suite = { 3252da7f033dSHerbert Xu .hash = { 3253da7f033dSHerbert Xu .vecs = hmac_sha384_tv_template, 3254da7f033dSHerbert Xu .count = HMAC_SHA384_TEST_VECTORS 3255da7f033dSHerbert Xu } 3256da7f033dSHerbert Xu } 3257da7f033dSHerbert Xu }, { 3258da7f033dSHerbert Xu .alg = "hmac(sha512)", 3259da7f033dSHerbert Xu .test = alg_test_hash, 3260a1915d51SJarod Wilson .fips_allowed = 1, 3261da7f033dSHerbert Xu .suite = { 3262da7f033dSHerbert Xu .hash = { 3263da7f033dSHerbert Xu .vecs = hmac_sha512_tv_template, 3264da7f033dSHerbert Xu .count = HMAC_SHA512_TEST_VECTORS 3265da7f033dSHerbert Xu } 3266da7f033dSHerbert Xu } 3267da7f033dSHerbert Xu }, { 3268bb5530e4SStephan Mueller .alg = "jitterentropy_rng", 3269bb5530e4SStephan Mueller .fips_allowed = 1, 3270bb5530e4SStephan Mueller .test = alg_test_null, 3271bb5530e4SStephan Mueller }, { 327235351988SStephan Mueller .alg = "kw(aes)", 327335351988SStephan Mueller .test = alg_test_skcipher, 327435351988SStephan Mueller .fips_allowed = 1, 327535351988SStephan Mueller .suite = { 327635351988SStephan Mueller .cipher = { 327735351988SStephan Mueller .enc = { 327835351988SStephan Mueller .vecs = aes_kw_enc_tv_template, 327935351988SStephan Mueller .count = ARRAY_SIZE(aes_kw_enc_tv_template) 328035351988SStephan Mueller }, 328135351988SStephan Mueller .dec = { 328235351988SStephan Mueller .vecs = aes_kw_dec_tv_template, 328335351988SStephan Mueller .count = ARRAY_SIZE(aes_kw_dec_tv_template) 328435351988SStephan Mueller } 328535351988SStephan Mueller } 328635351988SStephan Mueller } 328735351988SStephan Mueller }, { 3288da7f033dSHerbert Xu .alg = "lrw(aes)", 32891aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3290da7f033dSHerbert Xu .suite = { 3291da7f033dSHerbert Xu .cipher = { 3292da7f033dSHerbert Xu .enc = { 3293da7f033dSHerbert Xu .vecs = aes_lrw_enc_tv_template, 3294da7f033dSHerbert Xu .count = AES_LRW_ENC_TEST_VECTORS 3295da7f033dSHerbert Xu }, 3296da7f033dSHerbert Xu .dec = { 3297da7f033dSHerbert Xu .vecs = aes_lrw_dec_tv_template, 3298da7f033dSHerbert Xu .count = AES_LRW_DEC_TEST_VECTORS 3299da7f033dSHerbert Xu } 3300da7f033dSHerbert Xu } 3301da7f033dSHerbert Xu } 3302da7f033dSHerbert Xu }, { 33030840605eSJussi Kivilinna .alg = "lrw(camellia)", 33040840605eSJussi Kivilinna .test = alg_test_skcipher, 33050840605eSJussi Kivilinna .suite = { 33060840605eSJussi Kivilinna .cipher = { 33070840605eSJussi Kivilinna .enc = { 33080840605eSJussi Kivilinna .vecs = camellia_lrw_enc_tv_template, 33090840605eSJussi Kivilinna .count = CAMELLIA_LRW_ENC_TEST_VECTORS 33100840605eSJussi Kivilinna }, 33110840605eSJussi Kivilinna .dec = { 33120840605eSJussi Kivilinna .vecs = camellia_lrw_dec_tv_template, 33130840605eSJussi Kivilinna .count = CAMELLIA_LRW_DEC_TEST_VECTORS 33140840605eSJussi Kivilinna } 33150840605eSJussi Kivilinna } 33160840605eSJussi Kivilinna } 33170840605eSJussi Kivilinna }, { 33189b8b0405SJohannes Goetzfried .alg = "lrw(cast6)", 33199b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 33209b8b0405SJohannes Goetzfried .suite = { 33219b8b0405SJohannes Goetzfried .cipher = { 33229b8b0405SJohannes Goetzfried .enc = { 33239b8b0405SJohannes Goetzfried .vecs = cast6_lrw_enc_tv_template, 33249b8b0405SJohannes Goetzfried .count = CAST6_LRW_ENC_TEST_VECTORS 33259b8b0405SJohannes Goetzfried }, 33269b8b0405SJohannes Goetzfried .dec = { 33279b8b0405SJohannes Goetzfried .vecs = cast6_lrw_dec_tv_template, 33289b8b0405SJohannes Goetzfried .count = CAST6_LRW_DEC_TEST_VECTORS 33299b8b0405SJohannes Goetzfried } 33309b8b0405SJohannes Goetzfried } 33319b8b0405SJohannes Goetzfried } 33329b8b0405SJohannes Goetzfried }, { 3333d7bfc0faSJussi Kivilinna .alg = "lrw(serpent)", 3334d7bfc0faSJussi Kivilinna .test = alg_test_skcipher, 3335d7bfc0faSJussi Kivilinna .suite = { 3336d7bfc0faSJussi Kivilinna .cipher = { 3337d7bfc0faSJussi Kivilinna .enc = { 3338d7bfc0faSJussi Kivilinna .vecs = serpent_lrw_enc_tv_template, 3339d7bfc0faSJussi Kivilinna .count = SERPENT_LRW_ENC_TEST_VECTORS 3340d7bfc0faSJussi Kivilinna }, 3341d7bfc0faSJussi Kivilinna .dec = { 3342d7bfc0faSJussi Kivilinna .vecs = serpent_lrw_dec_tv_template, 3343d7bfc0faSJussi Kivilinna .count = SERPENT_LRW_DEC_TEST_VECTORS 3344d7bfc0faSJussi Kivilinna } 3345d7bfc0faSJussi Kivilinna } 3346d7bfc0faSJussi Kivilinna } 3347d7bfc0faSJussi Kivilinna }, { 33480b2a1551SJussi Kivilinna .alg = "lrw(twofish)", 33490b2a1551SJussi Kivilinna .test = alg_test_skcipher, 33500b2a1551SJussi Kivilinna .suite = { 33510b2a1551SJussi Kivilinna .cipher = { 33520b2a1551SJussi Kivilinna .enc = { 33530b2a1551SJussi Kivilinna .vecs = tf_lrw_enc_tv_template, 33540b2a1551SJussi Kivilinna .count = TF_LRW_ENC_TEST_VECTORS 33550b2a1551SJussi Kivilinna }, 33560b2a1551SJussi Kivilinna .dec = { 33570b2a1551SJussi Kivilinna .vecs = tf_lrw_dec_tv_template, 33580b2a1551SJussi Kivilinna .count = TF_LRW_DEC_TEST_VECTORS 33590b2a1551SJussi Kivilinna } 33600b2a1551SJussi Kivilinna } 33610b2a1551SJussi Kivilinna } 33620b2a1551SJussi Kivilinna }, { 33631443cc9bSKOVACS Krisztian .alg = "lz4", 33641443cc9bSKOVACS Krisztian .test = alg_test_comp, 33651443cc9bSKOVACS Krisztian .fips_allowed = 1, 33661443cc9bSKOVACS Krisztian .suite = { 33671443cc9bSKOVACS Krisztian .comp = { 33681443cc9bSKOVACS Krisztian .comp = { 33691443cc9bSKOVACS Krisztian .vecs = lz4_comp_tv_template, 33701443cc9bSKOVACS Krisztian .count = LZ4_COMP_TEST_VECTORS 33711443cc9bSKOVACS Krisztian }, 33721443cc9bSKOVACS Krisztian .decomp = { 33731443cc9bSKOVACS Krisztian .vecs = lz4_decomp_tv_template, 33741443cc9bSKOVACS Krisztian .count = LZ4_DECOMP_TEST_VECTORS 33751443cc9bSKOVACS Krisztian } 33761443cc9bSKOVACS Krisztian } 33771443cc9bSKOVACS Krisztian } 33781443cc9bSKOVACS Krisztian }, { 33791443cc9bSKOVACS Krisztian .alg = "lz4hc", 33801443cc9bSKOVACS Krisztian .test = alg_test_comp, 33811443cc9bSKOVACS Krisztian .fips_allowed = 1, 33821443cc9bSKOVACS Krisztian .suite = { 33831443cc9bSKOVACS Krisztian .comp = { 33841443cc9bSKOVACS Krisztian .comp = { 33851443cc9bSKOVACS Krisztian .vecs = lz4hc_comp_tv_template, 33861443cc9bSKOVACS Krisztian .count = LZ4HC_COMP_TEST_VECTORS 33871443cc9bSKOVACS Krisztian }, 33881443cc9bSKOVACS Krisztian .decomp = { 33891443cc9bSKOVACS Krisztian .vecs = lz4hc_decomp_tv_template, 33901443cc9bSKOVACS Krisztian .count = LZ4HC_DECOMP_TEST_VECTORS 33911443cc9bSKOVACS Krisztian } 33921443cc9bSKOVACS Krisztian } 33931443cc9bSKOVACS Krisztian } 33941443cc9bSKOVACS Krisztian }, { 3395da7f033dSHerbert Xu .alg = "lzo", 3396da7f033dSHerbert Xu .test = alg_test_comp, 33970818904dSMilan Broz .fips_allowed = 1, 3398da7f033dSHerbert Xu .suite = { 3399da7f033dSHerbert Xu .comp = { 3400da7f033dSHerbert Xu .comp = { 3401da7f033dSHerbert Xu .vecs = lzo_comp_tv_template, 3402da7f033dSHerbert Xu .count = LZO_COMP_TEST_VECTORS 3403da7f033dSHerbert Xu }, 3404da7f033dSHerbert Xu .decomp = { 3405da7f033dSHerbert Xu .vecs = lzo_decomp_tv_template, 3406da7f033dSHerbert Xu .count = LZO_DECOMP_TEST_VECTORS 3407da7f033dSHerbert Xu } 3408da7f033dSHerbert Xu } 3409da7f033dSHerbert Xu } 3410da7f033dSHerbert Xu }, { 3411da7f033dSHerbert Xu .alg = "md4", 3412da7f033dSHerbert Xu .test = alg_test_hash, 3413da7f033dSHerbert Xu .suite = { 3414da7f033dSHerbert Xu .hash = { 3415da7f033dSHerbert Xu .vecs = md4_tv_template, 3416da7f033dSHerbert Xu .count = MD4_TEST_VECTORS 3417da7f033dSHerbert Xu } 3418da7f033dSHerbert Xu } 3419da7f033dSHerbert Xu }, { 3420da7f033dSHerbert Xu .alg = "md5", 3421da7f033dSHerbert Xu .test = alg_test_hash, 3422da7f033dSHerbert Xu .suite = { 3423da7f033dSHerbert Xu .hash = { 3424da7f033dSHerbert Xu .vecs = md5_tv_template, 3425da7f033dSHerbert Xu .count = MD5_TEST_VECTORS 3426da7f033dSHerbert Xu } 3427da7f033dSHerbert Xu } 3428da7f033dSHerbert Xu }, { 3429da7f033dSHerbert Xu .alg = "michael_mic", 3430da7f033dSHerbert Xu .test = alg_test_hash, 3431da7f033dSHerbert Xu .suite = { 3432da7f033dSHerbert Xu .hash = { 3433da7f033dSHerbert Xu .vecs = michael_mic_tv_template, 3434da7f033dSHerbert Xu .count = MICHAEL_MIC_TEST_VECTORS 3435da7f033dSHerbert Xu } 3436da7f033dSHerbert Xu } 3437da7f033dSHerbert Xu }, { 3438ba0e14acSPuneet Saxena .alg = "ofb(aes)", 3439ba0e14acSPuneet Saxena .test = alg_test_skcipher, 3440ba0e14acSPuneet Saxena .fips_allowed = 1, 3441ba0e14acSPuneet Saxena .suite = { 3442ba0e14acSPuneet Saxena .cipher = { 3443ba0e14acSPuneet Saxena .enc = { 3444ba0e14acSPuneet Saxena .vecs = aes_ofb_enc_tv_template, 3445ba0e14acSPuneet Saxena .count = AES_OFB_ENC_TEST_VECTORS 3446ba0e14acSPuneet Saxena }, 3447ba0e14acSPuneet Saxena .dec = { 3448ba0e14acSPuneet Saxena .vecs = aes_ofb_dec_tv_template, 3449ba0e14acSPuneet Saxena .count = AES_OFB_DEC_TEST_VECTORS 3450ba0e14acSPuneet Saxena } 3451ba0e14acSPuneet Saxena } 3452ba0e14acSPuneet Saxena } 3453ba0e14acSPuneet Saxena }, { 3454da7f033dSHerbert Xu .alg = "pcbc(fcrypt)", 34551aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3456da7f033dSHerbert Xu .suite = { 3457da7f033dSHerbert Xu .cipher = { 3458da7f033dSHerbert Xu .enc = { 3459da7f033dSHerbert Xu .vecs = fcrypt_pcbc_enc_tv_template, 3460da7f033dSHerbert Xu .count = FCRYPT_ENC_TEST_VECTORS 3461da7f033dSHerbert Xu }, 3462da7f033dSHerbert Xu .dec = { 3463da7f033dSHerbert Xu .vecs = fcrypt_pcbc_dec_tv_template, 3464da7f033dSHerbert Xu .count = FCRYPT_DEC_TEST_VECTORS 3465da7f033dSHerbert Xu } 3466da7f033dSHerbert Xu } 3467da7f033dSHerbert Xu } 3468da7f033dSHerbert Xu }, { 3469eee9dc61SMartin Willi .alg = "poly1305", 3470eee9dc61SMartin Willi .test = alg_test_hash, 3471eee9dc61SMartin Willi .suite = { 3472eee9dc61SMartin Willi .hash = { 3473eee9dc61SMartin Willi .vecs = poly1305_tv_template, 3474eee9dc61SMartin Willi .count = POLY1305_TEST_VECTORS 3475eee9dc61SMartin Willi } 3476eee9dc61SMartin Willi } 3477eee9dc61SMartin Willi }, { 3478da7f033dSHerbert Xu .alg = "rfc3686(ctr(aes))", 34791aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3480a1915d51SJarod Wilson .fips_allowed = 1, 3481da7f033dSHerbert Xu .suite = { 3482da7f033dSHerbert Xu .cipher = { 3483da7f033dSHerbert Xu .enc = { 3484f7cb80f2SJarod Wilson .vecs = aes_ctr_rfc3686_enc_tv_template, 3485f7cb80f2SJarod Wilson .count = AES_CTR_3686_ENC_TEST_VECTORS 3486da7f033dSHerbert Xu }, 3487da7f033dSHerbert Xu .dec = { 3488f7cb80f2SJarod Wilson .vecs = aes_ctr_rfc3686_dec_tv_template, 3489f7cb80f2SJarod Wilson .count = AES_CTR_3686_DEC_TEST_VECTORS 3490da7f033dSHerbert Xu } 3491da7f033dSHerbert Xu } 3492da7f033dSHerbert Xu } 3493da7f033dSHerbert Xu }, { 34943f31a740SHerbert Xu .alg = "rfc4106(gcm(aes))", 349569435b94SAdrian Hoban .test = alg_test_aead, 3496db71f29aSJarod Wilson .fips_allowed = 1, 349769435b94SAdrian Hoban .suite = { 349869435b94SAdrian Hoban .aead = { 349969435b94SAdrian Hoban .enc = { 350069435b94SAdrian Hoban .vecs = aes_gcm_rfc4106_enc_tv_template, 350169435b94SAdrian Hoban .count = AES_GCM_4106_ENC_TEST_VECTORS 350269435b94SAdrian Hoban }, 350369435b94SAdrian Hoban .dec = { 350469435b94SAdrian Hoban .vecs = aes_gcm_rfc4106_dec_tv_template, 350569435b94SAdrian Hoban .count = AES_GCM_4106_DEC_TEST_VECTORS 350669435b94SAdrian Hoban } 350769435b94SAdrian Hoban } 350869435b94SAdrian Hoban } 350969435b94SAdrian Hoban }, { 3510544c436aSHerbert Xu .alg = "rfc4309(ccm(aes))", 35115d667322SJarod Wilson .test = alg_test_aead, 3512a1915d51SJarod Wilson .fips_allowed = 1, 35135d667322SJarod Wilson .suite = { 35145d667322SJarod Wilson .aead = { 35155d667322SJarod Wilson .enc = { 35165d667322SJarod Wilson .vecs = aes_ccm_rfc4309_enc_tv_template, 35175d667322SJarod Wilson .count = AES_CCM_4309_ENC_TEST_VECTORS 35185d667322SJarod Wilson }, 35195d667322SJarod Wilson .dec = { 35205d667322SJarod Wilson .vecs = aes_ccm_rfc4309_dec_tv_template, 35215d667322SJarod Wilson .count = AES_CCM_4309_DEC_TEST_VECTORS 35225d667322SJarod Wilson } 35235d667322SJarod Wilson } 35245d667322SJarod Wilson } 35255d667322SJarod Wilson }, { 3526bb68745eSHerbert Xu .alg = "rfc4543(gcm(aes))", 3527e9b7441aSJussi Kivilinna .test = alg_test_aead, 3528e9b7441aSJussi Kivilinna .suite = { 3529e9b7441aSJussi Kivilinna .aead = { 3530e9b7441aSJussi Kivilinna .enc = { 3531e9b7441aSJussi Kivilinna .vecs = aes_gcm_rfc4543_enc_tv_template, 3532e9b7441aSJussi Kivilinna .count = AES_GCM_4543_ENC_TEST_VECTORS 3533e9b7441aSJussi Kivilinna }, 3534e9b7441aSJussi Kivilinna .dec = { 3535e9b7441aSJussi Kivilinna .vecs = aes_gcm_rfc4543_dec_tv_template, 3536e9b7441aSJussi Kivilinna .count = AES_GCM_4543_DEC_TEST_VECTORS 3537e9b7441aSJussi Kivilinna }, 3538e9b7441aSJussi Kivilinna } 3539e9b7441aSJussi Kivilinna } 3540e9b7441aSJussi Kivilinna }, { 3541af2b76b5SMartin Willi .alg = "rfc7539(chacha20,poly1305)", 3542af2b76b5SMartin Willi .test = alg_test_aead, 3543af2b76b5SMartin Willi .suite = { 3544af2b76b5SMartin Willi .aead = { 3545af2b76b5SMartin Willi .enc = { 3546af2b76b5SMartin Willi .vecs = rfc7539_enc_tv_template, 3547af2b76b5SMartin Willi .count = RFC7539_ENC_TEST_VECTORS 3548af2b76b5SMartin Willi }, 3549af2b76b5SMartin Willi .dec = { 3550af2b76b5SMartin Willi .vecs = rfc7539_dec_tv_template, 3551af2b76b5SMartin Willi .count = RFC7539_DEC_TEST_VECTORS 3552af2b76b5SMartin Willi }, 3553af2b76b5SMartin Willi } 3554af2b76b5SMartin Willi } 3555af2b76b5SMartin Willi }, { 35565900758dSMartin Willi .alg = "rfc7539esp(chacha20,poly1305)", 35575900758dSMartin Willi .test = alg_test_aead, 35585900758dSMartin Willi .suite = { 35595900758dSMartin Willi .aead = { 35605900758dSMartin Willi .enc = { 35615900758dSMartin Willi .vecs = rfc7539esp_enc_tv_template, 35625900758dSMartin Willi .count = RFC7539ESP_ENC_TEST_VECTORS 35635900758dSMartin Willi }, 35645900758dSMartin Willi .dec = { 35655900758dSMartin Willi .vecs = rfc7539esp_dec_tv_template, 35665900758dSMartin Willi .count = RFC7539ESP_DEC_TEST_VECTORS 35675900758dSMartin Willi }, 35685900758dSMartin Willi } 35695900758dSMartin Willi } 35705900758dSMartin Willi }, { 3571da7f033dSHerbert Xu .alg = "rmd128", 3572da7f033dSHerbert Xu .test = alg_test_hash, 3573da7f033dSHerbert Xu .suite = { 3574da7f033dSHerbert Xu .hash = { 3575da7f033dSHerbert Xu .vecs = rmd128_tv_template, 3576da7f033dSHerbert Xu .count = RMD128_TEST_VECTORS 3577da7f033dSHerbert Xu } 3578da7f033dSHerbert Xu } 3579da7f033dSHerbert Xu }, { 3580da7f033dSHerbert Xu .alg = "rmd160", 3581da7f033dSHerbert Xu .test = alg_test_hash, 3582da7f033dSHerbert Xu .suite = { 3583da7f033dSHerbert Xu .hash = { 3584da7f033dSHerbert Xu .vecs = rmd160_tv_template, 3585da7f033dSHerbert Xu .count = RMD160_TEST_VECTORS 3586da7f033dSHerbert Xu } 3587da7f033dSHerbert Xu } 3588da7f033dSHerbert Xu }, { 3589da7f033dSHerbert Xu .alg = "rmd256", 3590da7f033dSHerbert Xu .test = alg_test_hash, 3591da7f033dSHerbert Xu .suite = { 3592da7f033dSHerbert Xu .hash = { 3593da7f033dSHerbert Xu .vecs = rmd256_tv_template, 3594da7f033dSHerbert Xu .count = RMD256_TEST_VECTORS 3595da7f033dSHerbert Xu } 3596da7f033dSHerbert Xu } 3597da7f033dSHerbert Xu }, { 3598da7f033dSHerbert Xu .alg = "rmd320", 3599da7f033dSHerbert Xu .test = alg_test_hash, 3600da7f033dSHerbert Xu .suite = { 3601da7f033dSHerbert Xu .hash = { 3602da7f033dSHerbert Xu .vecs = rmd320_tv_template, 3603da7f033dSHerbert Xu .count = RMD320_TEST_VECTORS 3604da7f033dSHerbert Xu } 3605da7f033dSHerbert Xu } 3606da7f033dSHerbert Xu }, { 3607946cc463STadeusz Struk .alg = "rsa", 3608946cc463STadeusz Struk .test = alg_test_akcipher, 3609946cc463STadeusz Struk .fips_allowed = 1, 3610946cc463STadeusz Struk .suite = { 3611946cc463STadeusz Struk .akcipher = { 3612946cc463STadeusz Struk .vecs = rsa_tv_template, 3613946cc463STadeusz Struk .count = RSA_TEST_VECTORS 3614946cc463STadeusz Struk } 3615946cc463STadeusz Struk } 3616946cc463STadeusz Struk }, { 3617da7f033dSHerbert Xu .alg = "salsa20", 36181aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3619da7f033dSHerbert Xu .suite = { 3620da7f033dSHerbert Xu .cipher = { 3621da7f033dSHerbert Xu .enc = { 3622da7f033dSHerbert Xu .vecs = salsa20_stream_enc_tv_template, 3623da7f033dSHerbert Xu .count = SALSA20_STREAM_ENC_TEST_VECTORS 3624da7f033dSHerbert Xu } 3625da7f033dSHerbert Xu } 3626da7f033dSHerbert Xu } 3627da7f033dSHerbert Xu }, { 3628da7f033dSHerbert Xu .alg = "sha1", 3629da7f033dSHerbert Xu .test = alg_test_hash, 3630a1915d51SJarod Wilson .fips_allowed = 1, 3631da7f033dSHerbert Xu .suite = { 3632da7f033dSHerbert Xu .hash = { 3633da7f033dSHerbert Xu .vecs = sha1_tv_template, 3634da7f033dSHerbert Xu .count = SHA1_TEST_VECTORS 3635da7f033dSHerbert Xu } 3636da7f033dSHerbert Xu } 3637da7f033dSHerbert Xu }, { 3638da7f033dSHerbert Xu .alg = "sha224", 3639da7f033dSHerbert Xu .test = alg_test_hash, 3640a1915d51SJarod Wilson .fips_allowed = 1, 3641da7f033dSHerbert Xu .suite = { 3642da7f033dSHerbert Xu .hash = { 3643da7f033dSHerbert Xu .vecs = sha224_tv_template, 3644da7f033dSHerbert Xu .count = SHA224_TEST_VECTORS 3645da7f033dSHerbert Xu } 3646da7f033dSHerbert Xu } 3647da7f033dSHerbert Xu }, { 3648da7f033dSHerbert Xu .alg = "sha256", 3649da7f033dSHerbert Xu .test = alg_test_hash, 3650a1915d51SJarod Wilson .fips_allowed = 1, 3651da7f033dSHerbert Xu .suite = { 3652da7f033dSHerbert Xu .hash = { 3653da7f033dSHerbert Xu .vecs = sha256_tv_template, 3654da7f033dSHerbert Xu .count = SHA256_TEST_VECTORS 3655da7f033dSHerbert Xu } 3656da7f033dSHerbert Xu } 3657da7f033dSHerbert Xu }, { 3658da7f033dSHerbert Xu .alg = "sha384", 3659da7f033dSHerbert Xu .test = alg_test_hash, 3660a1915d51SJarod Wilson .fips_allowed = 1, 3661da7f033dSHerbert Xu .suite = { 3662da7f033dSHerbert Xu .hash = { 3663da7f033dSHerbert Xu .vecs = sha384_tv_template, 3664da7f033dSHerbert Xu .count = SHA384_TEST_VECTORS 3665da7f033dSHerbert Xu } 3666da7f033dSHerbert Xu } 3667da7f033dSHerbert Xu }, { 3668da7f033dSHerbert Xu .alg = "sha512", 3669da7f033dSHerbert Xu .test = alg_test_hash, 3670a1915d51SJarod Wilson .fips_allowed = 1, 3671da7f033dSHerbert Xu .suite = { 3672da7f033dSHerbert Xu .hash = { 3673da7f033dSHerbert Xu .vecs = sha512_tv_template, 3674da7f033dSHerbert Xu .count = SHA512_TEST_VECTORS 3675da7f033dSHerbert Xu } 3676da7f033dSHerbert Xu } 3677da7f033dSHerbert Xu }, { 3678da7f033dSHerbert Xu .alg = "tgr128", 3679da7f033dSHerbert Xu .test = alg_test_hash, 3680da7f033dSHerbert Xu .suite = { 3681da7f033dSHerbert Xu .hash = { 3682da7f033dSHerbert Xu .vecs = tgr128_tv_template, 3683da7f033dSHerbert Xu .count = TGR128_TEST_VECTORS 3684da7f033dSHerbert Xu } 3685da7f033dSHerbert Xu } 3686da7f033dSHerbert Xu }, { 3687da7f033dSHerbert Xu .alg = "tgr160", 3688da7f033dSHerbert Xu .test = alg_test_hash, 3689da7f033dSHerbert Xu .suite = { 3690da7f033dSHerbert Xu .hash = { 3691da7f033dSHerbert Xu .vecs = tgr160_tv_template, 3692da7f033dSHerbert Xu .count = TGR160_TEST_VECTORS 3693da7f033dSHerbert Xu } 3694da7f033dSHerbert Xu } 3695da7f033dSHerbert Xu }, { 3696da7f033dSHerbert Xu .alg = "tgr192", 3697da7f033dSHerbert Xu .test = alg_test_hash, 3698da7f033dSHerbert Xu .suite = { 3699da7f033dSHerbert Xu .hash = { 3700da7f033dSHerbert Xu .vecs = tgr192_tv_template, 3701da7f033dSHerbert Xu .count = TGR192_TEST_VECTORS 3702da7f033dSHerbert Xu } 3703da7f033dSHerbert Xu } 3704da7f033dSHerbert Xu }, { 3705f1939f7cSShane Wang .alg = "vmac(aes)", 3706f1939f7cSShane Wang .test = alg_test_hash, 3707f1939f7cSShane Wang .suite = { 3708f1939f7cSShane Wang .hash = { 3709f1939f7cSShane Wang .vecs = aes_vmac128_tv_template, 3710f1939f7cSShane Wang .count = VMAC_AES_TEST_VECTORS 3711f1939f7cSShane Wang } 3712f1939f7cSShane Wang } 3713f1939f7cSShane Wang }, { 3714da7f033dSHerbert Xu .alg = "wp256", 3715da7f033dSHerbert Xu .test = alg_test_hash, 3716da7f033dSHerbert Xu .suite = { 3717da7f033dSHerbert Xu .hash = { 3718da7f033dSHerbert Xu .vecs = wp256_tv_template, 3719da7f033dSHerbert Xu .count = WP256_TEST_VECTORS 3720da7f033dSHerbert Xu } 3721da7f033dSHerbert Xu } 3722da7f033dSHerbert Xu }, { 3723da7f033dSHerbert Xu .alg = "wp384", 3724da7f033dSHerbert Xu .test = alg_test_hash, 3725da7f033dSHerbert Xu .suite = { 3726da7f033dSHerbert Xu .hash = { 3727da7f033dSHerbert Xu .vecs = wp384_tv_template, 3728da7f033dSHerbert Xu .count = WP384_TEST_VECTORS 3729da7f033dSHerbert Xu } 3730da7f033dSHerbert Xu } 3731da7f033dSHerbert Xu }, { 3732da7f033dSHerbert Xu .alg = "wp512", 3733da7f033dSHerbert Xu .test = alg_test_hash, 3734da7f033dSHerbert Xu .suite = { 3735da7f033dSHerbert Xu .hash = { 3736da7f033dSHerbert Xu .vecs = wp512_tv_template, 3737da7f033dSHerbert Xu .count = WP512_TEST_VECTORS 3738da7f033dSHerbert Xu } 3739da7f033dSHerbert Xu } 3740da7f033dSHerbert Xu }, { 3741da7f033dSHerbert Xu .alg = "xcbc(aes)", 3742da7f033dSHerbert Xu .test = alg_test_hash, 3743da7f033dSHerbert Xu .suite = { 3744da7f033dSHerbert Xu .hash = { 3745da7f033dSHerbert Xu .vecs = aes_xcbc128_tv_template, 3746da7f033dSHerbert Xu .count = XCBC_AES_TEST_VECTORS 3747da7f033dSHerbert Xu } 3748da7f033dSHerbert Xu } 3749da7f033dSHerbert Xu }, { 3750da7f033dSHerbert Xu .alg = "xts(aes)", 37511aa4ecd9SHerbert Xu .test = alg_test_skcipher, 37522918aa8dSJarod Wilson .fips_allowed = 1, 3753da7f033dSHerbert Xu .suite = { 3754da7f033dSHerbert Xu .cipher = { 3755da7f033dSHerbert Xu .enc = { 3756da7f033dSHerbert Xu .vecs = aes_xts_enc_tv_template, 3757da7f033dSHerbert Xu .count = AES_XTS_ENC_TEST_VECTORS 3758da7f033dSHerbert Xu }, 3759da7f033dSHerbert Xu .dec = { 3760da7f033dSHerbert Xu .vecs = aes_xts_dec_tv_template, 3761da7f033dSHerbert Xu .count = AES_XTS_DEC_TEST_VECTORS 3762da7f033dSHerbert Xu } 3763da7f033dSHerbert Xu } 3764da7f033dSHerbert Xu } 37650c01aed5SGeert Uytterhoeven }, { 37660840605eSJussi Kivilinna .alg = "xts(camellia)", 37670840605eSJussi Kivilinna .test = alg_test_skcipher, 37680840605eSJussi Kivilinna .suite = { 37690840605eSJussi Kivilinna .cipher = { 37700840605eSJussi Kivilinna .enc = { 37710840605eSJussi Kivilinna .vecs = camellia_xts_enc_tv_template, 37720840605eSJussi Kivilinna .count = CAMELLIA_XTS_ENC_TEST_VECTORS 37730840605eSJussi Kivilinna }, 37740840605eSJussi Kivilinna .dec = { 37750840605eSJussi Kivilinna .vecs = camellia_xts_dec_tv_template, 37760840605eSJussi Kivilinna .count = CAMELLIA_XTS_DEC_TEST_VECTORS 37770840605eSJussi Kivilinna } 37780840605eSJussi Kivilinna } 37790840605eSJussi Kivilinna } 37800840605eSJussi Kivilinna }, { 37819b8b0405SJohannes Goetzfried .alg = "xts(cast6)", 37829b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 37839b8b0405SJohannes Goetzfried .suite = { 37849b8b0405SJohannes Goetzfried .cipher = { 37859b8b0405SJohannes Goetzfried .enc = { 37869b8b0405SJohannes Goetzfried .vecs = cast6_xts_enc_tv_template, 37879b8b0405SJohannes Goetzfried .count = CAST6_XTS_ENC_TEST_VECTORS 37889b8b0405SJohannes Goetzfried }, 37899b8b0405SJohannes Goetzfried .dec = { 37909b8b0405SJohannes Goetzfried .vecs = cast6_xts_dec_tv_template, 37919b8b0405SJohannes Goetzfried .count = CAST6_XTS_DEC_TEST_VECTORS 37929b8b0405SJohannes Goetzfried } 37939b8b0405SJohannes Goetzfried } 37949b8b0405SJohannes Goetzfried } 37959b8b0405SJohannes Goetzfried }, { 379618be20b9SJussi Kivilinna .alg = "xts(serpent)", 379718be20b9SJussi Kivilinna .test = alg_test_skcipher, 379818be20b9SJussi Kivilinna .suite = { 379918be20b9SJussi Kivilinna .cipher = { 380018be20b9SJussi Kivilinna .enc = { 380118be20b9SJussi Kivilinna .vecs = serpent_xts_enc_tv_template, 380218be20b9SJussi Kivilinna .count = SERPENT_XTS_ENC_TEST_VECTORS 380318be20b9SJussi Kivilinna }, 380418be20b9SJussi Kivilinna .dec = { 380518be20b9SJussi Kivilinna .vecs = serpent_xts_dec_tv_template, 380618be20b9SJussi Kivilinna .count = SERPENT_XTS_DEC_TEST_VECTORS 380718be20b9SJussi Kivilinna } 380818be20b9SJussi Kivilinna } 380918be20b9SJussi Kivilinna } 381018be20b9SJussi Kivilinna }, { 3811aed265b9SJussi Kivilinna .alg = "xts(twofish)", 3812aed265b9SJussi Kivilinna .test = alg_test_skcipher, 3813aed265b9SJussi Kivilinna .suite = { 3814aed265b9SJussi Kivilinna .cipher = { 3815aed265b9SJussi Kivilinna .enc = { 3816aed265b9SJussi Kivilinna .vecs = tf_xts_enc_tv_template, 3817aed265b9SJussi Kivilinna .count = TF_XTS_ENC_TEST_VECTORS 3818aed265b9SJussi Kivilinna }, 3819aed265b9SJussi Kivilinna .dec = { 3820aed265b9SJussi Kivilinna .vecs = tf_xts_dec_tv_template, 3821aed265b9SJussi Kivilinna .count = TF_XTS_DEC_TEST_VECTORS 3822aed265b9SJussi Kivilinna } 3823aed265b9SJussi Kivilinna } 3824aed265b9SJussi Kivilinna } 3825da7f033dSHerbert Xu } 3826da7f033dSHerbert Xu }; 3827da7f033dSHerbert Xu 38285714758bSJussi Kivilinna static bool alg_test_descs_checked; 38295714758bSJussi Kivilinna 38305714758bSJussi Kivilinna static void alg_test_descs_check_order(void) 38315714758bSJussi Kivilinna { 38325714758bSJussi Kivilinna int i; 38335714758bSJussi Kivilinna 38345714758bSJussi Kivilinna /* only check once */ 38355714758bSJussi Kivilinna if (alg_test_descs_checked) 38365714758bSJussi Kivilinna return; 38375714758bSJussi Kivilinna 38385714758bSJussi Kivilinna alg_test_descs_checked = true; 38395714758bSJussi Kivilinna 38405714758bSJussi Kivilinna for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) { 38415714758bSJussi Kivilinna int diff = strcmp(alg_test_descs[i - 1].alg, 38425714758bSJussi Kivilinna alg_test_descs[i].alg); 38435714758bSJussi Kivilinna 38445714758bSJussi Kivilinna if (WARN_ON(diff > 0)) { 38455714758bSJussi Kivilinna pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n", 38465714758bSJussi Kivilinna alg_test_descs[i - 1].alg, 38475714758bSJussi Kivilinna alg_test_descs[i].alg); 38485714758bSJussi Kivilinna } 38495714758bSJussi Kivilinna 38505714758bSJussi Kivilinna if (WARN_ON(diff == 0)) { 38515714758bSJussi Kivilinna pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n", 38525714758bSJussi Kivilinna alg_test_descs[i].alg); 38535714758bSJussi Kivilinna } 38545714758bSJussi Kivilinna } 38555714758bSJussi Kivilinna } 38565714758bSJussi Kivilinna 38571aa4ecd9SHerbert Xu static int alg_find_test(const char *alg) 3858da7f033dSHerbert Xu { 3859da7f033dSHerbert Xu int start = 0; 3860da7f033dSHerbert Xu int end = ARRAY_SIZE(alg_test_descs); 3861da7f033dSHerbert Xu 3862da7f033dSHerbert Xu while (start < end) { 3863da7f033dSHerbert Xu int i = (start + end) / 2; 3864da7f033dSHerbert Xu int diff = strcmp(alg_test_descs[i].alg, alg); 3865da7f033dSHerbert Xu 3866da7f033dSHerbert Xu if (diff > 0) { 3867da7f033dSHerbert Xu end = i; 3868da7f033dSHerbert Xu continue; 3869da7f033dSHerbert Xu } 3870da7f033dSHerbert Xu 3871da7f033dSHerbert Xu if (diff < 0) { 3872da7f033dSHerbert Xu start = i + 1; 3873da7f033dSHerbert Xu continue; 3874da7f033dSHerbert Xu } 3875da7f033dSHerbert Xu 38761aa4ecd9SHerbert Xu return i; 3877da7f033dSHerbert Xu } 3878da7f033dSHerbert Xu 38791aa4ecd9SHerbert Xu return -1; 38801aa4ecd9SHerbert Xu } 38811aa4ecd9SHerbert Xu 38821aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 38831aa4ecd9SHerbert Xu { 38841aa4ecd9SHerbert Xu int i; 3885a68f6610SHerbert Xu int j; 3886d12d6b6dSNeil Horman int rc; 38871aa4ecd9SHerbert Xu 38885714758bSJussi Kivilinna alg_test_descs_check_order(); 38895714758bSJussi Kivilinna 38901aa4ecd9SHerbert Xu if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) { 38911aa4ecd9SHerbert Xu char nalg[CRYPTO_MAX_ALG_NAME]; 38921aa4ecd9SHerbert Xu 38931aa4ecd9SHerbert Xu if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >= 38941aa4ecd9SHerbert Xu sizeof(nalg)) 38951aa4ecd9SHerbert Xu return -ENAMETOOLONG; 38961aa4ecd9SHerbert Xu 38971aa4ecd9SHerbert Xu i = alg_find_test(nalg); 38981aa4ecd9SHerbert Xu if (i < 0) 38991aa4ecd9SHerbert Xu goto notest; 39001aa4ecd9SHerbert Xu 3901a3bef3a3SJarod Wilson if (fips_enabled && !alg_test_descs[i].fips_allowed) 3902a3bef3a3SJarod Wilson goto non_fips_alg; 3903a3bef3a3SJarod Wilson 3904941fb328SJarod Wilson rc = alg_test_cipher(alg_test_descs + i, driver, type, mask); 3905941fb328SJarod Wilson goto test_done; 39061aa4ecd9SHerbert Xu } 39071aa4ecd9SHerbert Xu 39081aa4ecd9SHerbert Xu i = alg_find_test(alg); 3909a68f6610SHerbert Xu j = alg_find_test(driver); 3910a68f6610SHerbert Xu if (i < 0 && j < 0) 39111aa4ecd9SHerbert Xu goto notest; 39121aa4ecd9SHerbert Xu 3913a68f6610SHerbert Xu if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) || 3914a68f6610SHerbert Xu (j >= 0 && !alg_test_descs[j].fips_allowed))) 3915a3bef3a3SJarod Wilson goto non_fips_alg; 3916a3bef3a3SJarod Wilson 3917a68f6610SHerbert Xu rc = 0; 3918a68f6610SHerbert Xu if (i >= 0) 3919a68f6610SHerbert Xu rc |= alg_test_descs[i].test(alg_test_descs + i, driver, 39201aa4ecd9SHerbert Xu type, mask); 3921032c8cacSCristian Stoica if (j >= 0 && j != i) 3922a68f6610SHerbert Xu rc |= alg_test_descs[j].test(alg_test_descs + j, driver, 3923a68f6610SHerbert Xu type, mask); 3924a68f6610SHerbert Xu 3925941fb328SJarod Wilson test_done: 3926d12d6b6dSNeil Horman if (fips_enabled && rc) 3927d12d6b6dSNeil Horman panic("%s: %s alg self test failed in fips mode!\n", driver, alg); 3928d12d6b6dSNeil Horman 392929ecd4abSJarod Wilson if (fips_enabled && !rc) 39303e8cffd4SMasanari Iida pr_info("alg: self-tests for %s (%s) passed\n", driver, alg); 393129ecd4abSJarod Wilson 3932d12d6b6dSNeil Horman return rc; 39331aa4ecd9SHerbert Xu 39341aa4ecd9SHerbert Xu notest: 3935da7f033dSHerbert Xu printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver); 3936da7f033dSHerbert Xu return 0; 3937a3bef3a3SJarod Wilson non_fips_alg: 3938a3bef3a3SJarod Wilson return -EINVAL; 3939da7f033dSHerbert Xu } 39400b767f96SAlexander Shishkin 3941326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */ 39420b767f96SAlexander Shishkin 3943da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test); 3944