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> 35802c7f1cSSalvatore Benedetto #include <crypto/kpp.h> 36da7f033dSHerbert Xu 37da7f033dSHerbert Xu #include "internal.h" 380b767f96SAlexander Shishkin 399e5c9fe4SRichard W.M. Jones static bool notests; 409e5c9fe4SRichard W.M. Jones module_param(notests, bool, 0644); 419e5c9fe4SRichard W.M. Jones MODULE_PARM_DESC(notests, "disable crypto self-tests"); 429e5c9fe4SRichard W.M. Jones 43326a6346SHerbert Xu #ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS 440b767f96SAlexander Shishkin 450b767f96SAlexander Shishkin /* a perfect nop */ 460b767f96SAlexander Shishkin int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 470b767f96SAlexander Shishkin { 480b767f96SAlexander Shishkin return 0; 490b767f96SAlexander Shishkin } 500b767f96SAlexander Shishkin 510b767f96SAlexander Shishkin #else 520b767f96SAlexander Shishkin 53da7f033dSHerbert Xu #include "testmgr.h" 54da7f033dSHerbert Xu 55da7f033dSHerbert Xu /* 56da7f033dSHerbert Xu * Need slab memory for testing (size in number of pages). 57da7f033dSHerbert Xu */ 58da7f033dSHerbert Xu #define XBUFSIZE 8 59da7f033dSHerbert Xu 60da7f033dSHerbert Xu /* 61da7f033dSHerbert Xu * Indexes into the xbuf to simulate cross-page access. 62da7f033dSHerbert Xu */ 63da7f033dSHerbert Xu #define IDX1 32 64da7f033dSHerbert Xu #define IDX2 32400 65da7f033dSHerbert Xu #define IDX3 1 66da7f033dSHerbert Xu #define IDX4 8193 67da7f033dSHerbert Xu #define IDX5 22222 68da7f033dSHerbert Xu #define IDX6 17101 69da7f033dSHerbert Xu #define IDX7 27333 70da7f033dSHerbert Xu #define IDX8 3000 71da7f033dSHerbert Xu 72da7f033dSHerbert Xu /* 73da7f033dSHerbert Xu * Used by test_cipher() 74da7f033dSHerbert Xu */ 75da7f033dSHerbert Xu #define ENCRYPT 1 76da7f033dSHerbert Xu #define DECRYPT 0 77da7f033dSHerbert Xu 78da7f033dSHerbert Xu struct tcrypt_result { 79da7f033dSHerbert Xu struct completion completion; 80da7f033dSHerbert Xu int err; 81da7f033dSHerbert Xu }; 82da7f033dSHerbert Xu 83da7f033dSHerbert Xu struct aead_test_suite { 84da7f033dSHerbert Xu struct { 85da7f033dSHerbert Xu struct aead_testvec *vecs; 86da7f033dSHerbert Xu unsigned int count; 87da7f033dSHerbert Xu } enc, dec; 88da7f033dSHerbert Xu }; 89da7f033dSHerbert Xu 90da7f033dSHerbert Xu struct cipher_test_suite { 91da7f033dSHerbert Xu struct { 92da7f033dSHerbert Xu struct cipher_testvec *vecs; 93da7f033dSHerbert Xu unsigned int count; 94da7f033dSHerbert Xu } enc, dec; 95da7f033dSHerbert Xu }; 96da7f033dSHerbert Xu 97da7f033dSHerbert Xu struct comp_test_suite { 98da7f033dSHerbert Xu struct { 99da7f033dSHerbert Xu struct comp_testvec *vecs; 100da7f033dSHerbert Xu unsigned int count; 101da7f033dSHerbert Xu } comp, decomp; 102da7f033dSHerbert Xu }; 103da7f033dSHerbert Xu 104da7f033dSHerbert Xu struct hash_test_suite { 105da7f033dSHerbert Xu struct hash_testvec *vecs; 106da7f033dSHerbert Xu unsigned int count; 107da7f033dSHerbert Xu }; 108da7f033dSHerbert Xu 1097647d6ceSJarod Wilson struct cprng_test_suite { 1107647d6ceSJarod Wilson struct cprng_testvec *vecs; 1117647d6ceSJarod Wilson unsigned int count; 1127647d6ceSJarod Wilson }; 1137647d6ceSJarod Wilson 11464d1cdfbSStephan Mueller struct drbg_test_suite { 11564d1cdfbSStephan Mueller struct drbg_testvec *vecs; 11664d1cdfbSStephan Mueller unsigned int count; 11764d1cdfbSStephan Mueller }; 11864d1cdfbSStephan Mueller 119946cc463STadeusz Struk struct akcipher_test_suite { 120946cc463STadeusz Struk struct akcipher_testvec *vecs; 121946cc463STadeusz Struk unsigned int count; 122946cc463STadeusz Struk }; 123946cc463STadeusz Struk 124802c7f1cSSalvatore Benedetto struct kpp_test_suite { 125802c7f1cSSalvatore Benedetto struct kpp_testvec *vecs; 126802c7f1cSSalvatore Benedetto unsigned int count; 127802c7f1cSSalvatore Benedetto }; 128802c7f1cSSalvatore Benedetto 129da7f033dSHerbert Xu struct alg_test_desc { 130da7f033dSHerbert Xu const char *alg; 131da7f033dSHerbert Xu int (*test)(const struct alg_test_desc *desc, const char *driver, 132da7f033dSHerbert Xu u32 type, u32 mask); 133a1915d51SJarod Wilson int fips_allowed; /* set if alg is allowed in fips mode */ 134da7f033dSHerbert Xu 135da7f033dSHerbert Xu union { 136da7f033dSHerbert Xu struct aead_test_suite aead; 137da7f033dSHerbert Xu struct cipher_test_suite cipher; 138da7f033dSHerbert Xu struct comp_test_suite comp; 139da7f033dSHerbert Xu struct hash_test_suite hash; 1407647d6ceSJarod Wilson struct cprng_test_suite cprng; 14164d1cdfbSStephan Mueller struct drbg_test_suite drbg; 142946cc463STadeusz Struk struct akcipher_test_suite akcipher; 143802c7f1cSSalvatore Benedetto struct kpp_test_suite kpp; 144da7f033dSHerbert Xu } suite; 145da7f033dSHerbert Xu }; 146da7f033dSHerbert Xu 147da7f033dSHerbert Xu static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 }; 148da7f033dSHerbert Xu 149da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len) 150da7f033dSHerbert Xu { 151da7f033dSHerbert Xu print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET, 152da7f033dSHerbert Xu 16, 1, 153da7f033dSHerbert Xu buf, len, false); 154da7f033dSHerbert Xu } 155da7f033dSHerbert Xu 156da7f033dSHerbert Xu static void tcrypt_complete(struct crypto_async_request *req, int err) 157da7f033dSHerbert Xu { 158da7f033dSHerbert Xu struct tcrypt_result *res = req->data; 159da7f033dSHerbert Xu 160da7f033dSHerbert Xu if (err == -EINPROGRESS) 161da7f033dSHerbert Xu return; 162da7f033dSHerbert Xu 163da7f033dSHerbert Xu res->err = err; 164da7f033dSHerbert Xu complete(&res->completion); 165da7f033dSHerbert Xu } 166da7f033dSHerbert Xu 167f8b0d4d0SHerbert Xu static int testmgr_alloc_buf(char *buf[XBUFSIZE]) 168f8b0d4d0SHerbert Xu { 169f8b0d4d0SHerbert Xu int i; 170f8b0d4d0SHerbert Xu 171f8b0d4d0SHerbert Xu for (i = 0; i < XBUFSIZE; i++) { 172f8b0d4d0SHerbert Xu buf[i] = (void *)__get_free_page(GFP_KERNEL); 173f8b0d4d0SHerbert Xu if (!buf[i]) 174f8b0d4d0SHerbert Xu goto err_free_buf; 175f8b0d4d0SHerbert Xu } 176f8b0d4d0SHerbert Xu 177f8b0d4d0SHerbert Xu return 0; 178f8b0d4d0SHerbert Xu 179f8b0d4d0SHerbert Xu err_free_buf: 180f8b0d4d0SHerbert Xu while (i-- > 0) 181f8b0d4d0SHerbert Xu free_page((unsigned long)buf[i]); 182f8b0d4d0SHerbert Xu 183f8b0d4d0SHerbert Xu return -ENOMEM; 184f8b0d4d0SHerbert Xu } 185f8b0d4d0SHerbert Xu 186f8b0d4d0SHerbert Xu static void testmgr_free_buf(char *buf[XBUFSIZE]) 187f8b0d4d0SHerbert Xu { 188f8b0d4d0SHerbert Xu int i; 189f8b0d4d0SHerbert Xu 190f8b0d4d0SHerbert Xu for (i = 0; i < XBUFSIZE; i++) 191f8b0d4d0SHerbert Xu free_page((unsigned long)buf[i]); 192f8b0d4d0SHerbert Xu } 193f8b0d4d0SHerbert Xu 194d4c85f9bSCristian Stoica static int wait_async_op(struct tcrypt_result *tr, int ret) 195a8f1a052SDavid S. Miller { 196a8f1a052SDavid S. Miller if (ret == -EINPROGRESS || ret == -EBUSY) { 1978a45ac12SRabin Vincent wait_for_completion(&tr->completion); 19816735d02SWolfram Sang reinit_completion(&tr->completion); 1998a45ac12SRabin Vincent ret = tr->err; 200a8f1a052SDavid S. Miller } 201a8f1a052SDavid S. Miller return ret; 202a8f1a052SDavid S. Miller } 203a8f1a052SDavid S. Miller 204018ba95cSWang, Rui Y static int ahash_partial_update(struct ahash_request **preq, 205018ba95cSWang, Rui Y struct crypto_ahash *tfm, struct hash_testvec *template, 206018ba95cSWang, Rui Y void *hash_buff, int k, int temp, struct scatterlist *sg, 207018ba95cSWang, Rui Y const char *algo, char *result, struct tcrypt_result *tresult) 208018ba95cSWang, Rui Y { 209018ba95cSWang, Rui Y char *state; 210018ba95cSWang, Rui Y struct ahash_request *req; 211018ba95cSWang, Rui Y int statesize, ret = -EINVAL; 212018ba95cSWang, Rui Y 213018ba95cSWang, Rui Y req = *preq; 214018ba95cSWang, Rui Y statesize = crypto_ahash_statesize( 215018ba95cSWang, Rui Y crypto_ahash_reqtfm(req)); 216018ba95cSWang, Rui Y state = kmalloc(statesize, GFP_KERNEL); 217018ba95cSWang, Rui Y if (!state) { 218018ba95cSWang, Rui Y pr_err("alt: hash: Failed to alloc state for %s\n", algo); 219018ba95cSWang, Rui Y goto out_nostate; 220018ba95cSWang, Rui Y } 221018ba95cSWang, Rui Y ret = crypto_ahash_export(req, state); 222018ba95cSWang, Rui Y if (ret) { 223018ba95cSWang, Rui Y pr_err("alt: hash: Failed to export() for %s\n", algo); 224018ba95cSWang, Rui Y goto out; 225018ba95cSWang, Rui Y } 226018ba95cSWang, Rui Y ahash_request_free(req); 227018ba95cSWang, Rui Y req = ahash_request_alloc(tfm, GFP_KERNEL); 228018ba95cSWang, Rui Y if (!req) { 229018ba95cSWang, Rui Y pr_err("alg: hash: Failed to alloc request for %s\n", algo); 230018ba95cSWang, Rui Y goto out_noreq; 231018ba95cSWang, Rui Y } 232018ba95cSWang, Rui Y ahash_request_set_callback(req, 233018ba95cSWang, Rui Y CRYPTO_TFM_REQ_MAY_BACKLOG, 234018ba95cSWang, Rui Y tcrypt_complete, tresult); 235018ba95cSWang, Rui Y 236018ba95cSWang, Rui Y memcpy(hash_buff, template->plaintext + temp, 237018ba95cSWang, Rui Y template->tap[k]); 238018ba95cSWang, Rui Y sg_init_one(&sg[0], hash_buff, template->tap[k]); 239018ba95cSWang, Rui Y ahash_request_set_crypt(req, sg, result, template->tap[k]); 240018ba95cSWang, Rui Y ret = crypto_ahash_import(req, state); 241018ba95cSWang, Rui Y if (ret) { 242018ba95cSWang, Rui Y pr_err("alg: hash: Failed to import() for %s\n", algo); 243018ba95cSWang, Rui Y goto out; 244018ba95cSWang, Rui Y } 245018ba95cSWang, Rui Y ret = wait_async_op(tresult, crypto_ahash_update(req)); 246018ba95cSWang, Rui Y if (ret) 247018ba95cSWang, Rui Y goto out; 248018ba95cSWang, Rui Y *preq = req; 249018ba95cSWang, Rui Y ret = 0; 250018ba95cSWang, Rui Y goto out_noreq; 251018ba95cSWang, Rui Y out: 252018ba95cSWang, Rui Y ahash_request_free(req); 253018ba95cSWang, Rui Y out_noreq: 254018ba95cSWang, Rui Y kfree(state); 255018ba95cSWang, Rui Y out_nostate: 256018ba95cSWang, Rui Y return ret; 257018ba95cSWang, Rui Y } 258018ba95cSWang, Rui Y 259da5ffe11SJussi Kivilinna static int __test_hash(struct crypto_ahash *tfm, struct hash_testvec *template, 260da5ffe11SJussi Kivilinna unsigned int tcount, bool use_digest, 261da5ffe11SJussi Kivilinna const int align_offset) 262da7f033dSHerbert Xu { 263da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm)); 264da7f033dSHerbert Xu unsigned int i, j, k, temp; 265da7f033dSHerbert Xu struct scatterlist sg[8]; 26629b77e5dSHoria Geanta char *result; 26729b77e5dSHoria Geanta char *key; 268da7f033dSHerbert Xu struct ahash_request *req; 269da7f033dSHerbert Xu struct tcrypt_result tresult; 270da7f033dSHerbert Xu void *hash_buff; 271f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 272f8b0d4d0SHerbert Xu int ret = -ENOMEM; 273f8b0d4d0SHerbert Xu 27429b77e5dSHoria Geanta result = kmalloc(MAX_DIGEST_SIZE, GFP_KERNEL); 27529b77e5dSHoria Geanta if (!result) 27629b77e5dSHoria Geanta return ret; 27729b77e5dSHoria Geanta key = kmalloc(MAX_KEYLEN, GFP_KERNEL); 27829b77e5dSHoria Geanta if (!key) 27929b77e5dSHoria Geanta goto out_nobuf; 280f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 281f8b0d4d0SHerbert Xu goto out_nobuf; 282da7f033dSHerbert Xu 283da7f033dSHerbert Xu init_completion(&tresult.completion); 284da7f033dSHerbert Xu 285da7f033dSHerbert Xu req = ahash_request_alloc(tfm, GFP_KERNEL); 286da7f033dSHerbert Xu if (!req) { 287da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to allocate request for " 288da7f033dSHerbert Xu "%s\n", algo); 289da7f033dSHerbert Xu goto out_noreq; 290da7f033dSHerbert Xu } 291da7f033dSHerbert Xu ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 292da7f033dSHerbert Xu tcrypt_complete, &tresult); 293da7f033dSHerbert Xu 294a0cfae59SHerbert Xu j = 0; 295da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 296a0cfae59SHerbert Xu if (template[i].np) 297a0cfae59SHerbert Xu continue; 298a0cfae59SHerbert Xu 299da5ffe11SJussi Kivilinna ret = -EINVAL; 300da5ffe11SJussi Kivilinna if (WARN_ON(align_offset + template[i].psize > PAGE_SIZE)) 301da5ffe11SJussi Kivilinna goto out; 302da5ffe11SJussi Kivilinna 303a0cfae59SHerbert Xu j++; 30429b77e5dSHoria Geanta memset(result, 0, MAX_DIGEST_SIZE); 305da7f033dSHerbert Xu 306da7f033dSHerbert Xu hash_buff = xbuf[0]; 307da5ffe11SJussi Kivilinna hash_buff += align_offset; 308da7f033dSHerbert Xu 309da7f033dSHerbert Xu memcpy(hash_buff, template[i].plaintext, template[i].psize); 310da7f033dSHerbert Xu sg_init_one(&sg[0], hash_buff, template[i].psize); 311da7f033dSHerbert Xu 312da7f033dSHerbert Xu if (template[i].ksize) { 313da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 31429b77e5dSHoria Geanta if (template[i].ksize > MAX_KEYLEN) { 31529b77e5dSHoria Geanta pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n", 31629b77e5dSHoria Geanta j, algo, template[i].ksize, MAX_KEYLEN); 31729b77e5dSHoria Geanta ret = -EINVAL; 31829b77e5dSHoria Geanta goto out; 31929b77e5dSHoria Geanta } 32029b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].ksize); 32129b77e5dSHoria Geanta ret = crypto_ahash_setkey(tfm, key, template[i].ksize); 322da7f033dSHerbert Xu if (ret) { 323da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey failed on " 324a0cfae59SHerbert Xu "test %d for %s: ret=%d\n", j, algo, 325da7f033dSHerbert Xu -ret); 326da7f033dSHerbert Xu goto out; 327da7f033dSHerbert Xu } 328da7f033dSHerbert Xu } 329da7f033dSHerbert Xu 330da7f033dSHerbert Xu ahash_request_set_crypt(req, sg, result, template[i].psize); 331a8f1a052SDavid S. Miller if (use_digest) { 332d4c85f9bSCristian Stoica ret = wait_async_op(&tresult, crypto_ahash_digest(req)); 333a8f1a052SDavid S. Miller if (ret) { 334a8f1a052SDavid S. Miller pr_err("alg: hash: digest failed on test %d " 335a0cfae59SHerbert Xu "for %s: ret=%d\n", j, algo, -ret); 336da7f033dSHerbert Xu goto out; 337da7f033dSHerbert Xu } 338a8f1a052SDavid S. Miller } else { 339d4c85f9bSCristian Stoica ret = wait_async_op(&tresult, crypto_ahash_init(req)); 340a8f1a052SDavid S. Miller if (ret) { 341a8f1a052SDavid S. Miller pr_err("alt: hash: init failed on test %d " 342a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 343a8f1a052SDavid S. Miller goto out; 344a8f1a052SDavid S. Miller } 345d4c85f9bSCristian Stoica ret = wait_async_op(&tresult, crypto_ahash_update(req)); 346a8f1a052SDavid S. Miller if (ret) { 347a8f1a052SDavid S. Miller pr_err("alt: hash: update failed on test %d " 348a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 349a8f1a052SDavid S. Miller goto out; 350a8f1a052SDavid S. Miller } 351d4c85f9bSCristian Stoica ret = wait_async_op(&tresult, crypto_ahash_final(req)); 352a8f1a052SDavid S. Miller if (ret) { 353a8f1a052SDavid S. Miller pr_err("alt: hash: final failed on test %d " 354a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 355a8f1a052SDavid S. Miller goto out; 356a8f1a052SDavid S. Miller } 357a8f1a052SDavid S. Miller } 358da7f033dSHerbert Xu 359da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 360da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 361da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Test %d failed for %s\n", 362a0cfae59SHerbert Xu j, algo); 363da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 364da7f033dSHerbert Xu ret = -EINVAL; 365da7f033dSHerbert Xu goto out; 366da7f033dSHerbert Xu } 367da7f033dSHerbert Xu } 368da7f033dSHerbert Xu 369da7f033dSHerbert Xu j = 0; 370da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 371da5ffe11SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 372da5ffe11SJussi Kivilinna if (align_offset != 0) 373da5ffe11SJussi Kivilinna break; 374da5ffe11SJussi Kivilinna 3755f2b424eSCristian Stoica if (!template[i].np) 3765f2b424eSCristian Stoica continue; 3775f2b424eSCristian Stoica 378da7f033dSHerbert Xu j++; 37929b77e5dSHoria Geanta memset(result, 0, MAX_DIGEST_SIZE); 380da7f033dSHerbert Xu 381da7f033dSHerbert Xu temp = 0; 382da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 383fd57f22aSHerbert Xu ret = -EINVAL; 384da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 385fd57f22aSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 386fd57f22aSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 387fd57f22aSHerbert Xu goto out; 388da7f033dSHerbert Xu sg_set_buf(&sg[k], 389da7f033dSHerbert Xu memcpy(xbuf[IDX[k] >> PAGE_SHIFT] + 390da7f033dSHerbert Xu offset_in_page(IDX[k]), 391da7f033dSHerbert Xu template[i].plaintext + temp, 392da7f033dSHerbert Xu template[i].tap[k]), 393da7f033dSHerbert Xu template[i].tap[k]); 394da7f033dSHerbert Xu temp += template[i].tap[k]; 395da7f033dSHerbert Xu } 396da7f033dSHerbert Xu 397da7f033dSHerbert Xu if (template[i].ksize) { 39829b77e5dSHoria Geanta if (template[i].ksize > MAX_KEYLEN) { 39929b77e5dSHoria Geanta pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n", 4005f2b424eSCristian Stoica j, algo, template[i].ksize, MAX_KEYLEN); 40129b77e5dSHoria Geanta ret = -EINVAL; 40229b77e5dSHoria Geanta goto out; 40329b77e5dSHoria Geanta } 404da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 40529b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].ksize); 4065f2b424eSCristian Stoica ret = crypto_ahash_setkey(tfm, key, template[i].ksize); 407da7f033dSHerbert Xu 408da7f033dSHerbert Xu if (ret) { 409da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey " 410da7f033dSHerbert Xu "failed on chunking test %d " 4115f2b424eSCristian Stoica "for %s: ret=%d\n", j, algo, -ret); 412da7f033dSHerbert Xu goto out; 413da7f033dSHerbert Xu } 414da7f033dSHerbert Xu } 415da7f033dSHerbert Xu 4165f2b424eSCristian Stoica ahash_request_set_crypt(req, sg, result, template[i].psize); 417da7f033dSHerbert Xu ret = crypto_ahash_digest(req); 418da7f033dSHerbert Xu switch (ret) { 419da7f033dSHerbert Xu case 0: 420da7f033dSHerbert Xu break; 421da7f033dSHerbert Xu case -EINPROGRESS: 422da7f033dSHerbert Xu case -EBUSY: 4238a45ac12SRabin Vincent wait_for_completion(&tresult.completion); 42416735d02SWolfram Sang reinit_completion(&tresult.completion); 4258a45ac12SRabin Vincent ret = tresult.err; 4268a45ac12SRabin Vincent if (!ret) 427da7f033dSHerbert Xu break; 428da7f033dSHerbert Xu /* fall through */ 429da7f033dSHerbert Xu default: 430da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: digest failed " 431da7f033dSHerbert Xu "on chunking test %d for %s: " 432da7f033dSHerbert Xu "ret=%d\n", j, algo, -ret); 433da7f033dSHerbert Xu goto out; 434da7f033dSHerbert Xu } 435da7f033dSHerbert Xu 436da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 437da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 438da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Chunking test %d " 439da7f033dSHerbert Xu "failed for %s\n", j, algo); 440da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 441da7f033dSHerbert Xu ret = -EINVAL; 442da7f033dSHerbert Xu goto out; 443da7f033dSHerbert Xu } 444da7f033dSHerbert Xu } 445da7f033dSHerbert Xu 446018ba95cSWang, Rui Y /* partial update exercise */ 447018ba95cSWang, Rui Y j = 0; 448018ba95cSWang, Rui Y for (i = 0; i < tcount; i++) { 449018ba95cSWang, Rui Y /* alignment tests are only done with continuous buffers */ 450018ba95cSWang, Rui Y if (align_offset != 0) 451018ba95cSWang, Rui Y break; 452018ba95cSWang, Rui Y 453018ba95cSWang, Rui Y if (template[i].np < 2) 454018ba95cSWang, Rui Y continue; 455018ba95cSWang, Rui Y 456018ba95cSWang, Rui Y j++; 457018ba95cSWang, Rui Y memset(result, 0, MAX_DIGEST_SIZE); 458018ba95cSWang, Rui Y 459018ba95cSWang, Rui Y ret = -EINVAL; 460018ba95cSWang, Rui Y hash_buff = xbuf[0]; 461018ba95cSWang, Rui Y memcpy(hash_buff, template[i].plaintext, 462018ba95cSWang, Rui Y template[i].tap[0]); 463018ba95cSWang, Rui Y sg_init_one(&sg[0], hash_buff, template[i].tap[0]); 464018ba95cSWang, Rui Y 465018ba95cSWang, Rui Y if (template[i].ksize) { 466018ba95cSWang, Rui Y crypto_ahash_clear_flags(tfm, ~0); 467018ba95cSWang, Rui Y if (template[i].ksize > MAX_KEYLEN) { 468018ba95cSWang, Rui Y pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n", 469018ba95cSWang, Rui Y j, algo, template[i].ksize, MAX_KEYLEN); 470018ba95cSWang, Rui Y ret = -EINVAL; 471018ba95cSWang, Rui Y goto out; 472018ba95cSWang, Rui Y } 473018ba95cSWang, Rui Y memcpy(key, template[i].key, template[i].ksize); 474018ba95cSWang, Rui Y ret = crypto_ahash_setkey(tfm, key, template[i].ksize); 475018ba95cSWang, Rui Y if (ret) { 476018ba95cSWang, Rui Y pr_err("alg: hash: setkey failed on test %d for %s: ret=%d\n", 477018ba95cSWang, Rui Y j, algo, -ret); 478018ba95cSWang, Rui Y goto out; 479018ba95cSWang, Rui Y } 480018ba95cSWang, Rui Y } 481018ba95cSWang, Rui Y 482018ba95cSWang, Rui Y ahash_request_set_crypt(req, sg, result, template[i].tap[0]); 483018ba95cSWang, Rui Y ret = wait_async_op(&tresult, crypto_ahash_init(req)); 484018ba95cSWang, Rui Y if (ret) { 485018ba95cSWang, Rui Y pr_err("alt: hash: init failed on test %d for %s: ret=%d\n", 486018ba95cSWang, Rui Y j, algo, -ret); 487018ba95cSWang, Rui Y goto out; 488018ba95cSWang, Rui Y } 489018ba95cSWang, Rui Y ret = wait_async_op(&tresult, crypto_ahash_update(req)); 490018ba95cSWang, Rui Y if (ret) { 491018ba95cSWang, Rui Y pr_err("alt: hash: update failed on test %d for %s: ret=%d\n", 492018ba95cSWang, Rui Y j, algo, -ret); 493018ba95cSWang, Rui Y goto out; 494018ba95cSWang, Rui Y } 495018ba95cSWang, Rui Y 496018ba95cSWang, Rui Y temp = template[i].tap[0]; 497018ba95cSWang, Rui Y for (k = 1; k < template[i].np; k++) { 498018ba95cSWang, Rui Y ret = ahash_partial_update(&req, tfm, &template[i], 499018ba95cSWang, Rui Y hash_buff, k, temp, &sg[0], algo, result, 500018ba95cSWang, Rui Y &tresult); 501018ba95cSWang, Rui Y if (ret) { 502018ba95cSWang, Rui Y pr_err("hash: partial update failed on test %d for %s: ret=%d\n", 503018ba95cSWang, Rui Y j, algo, -ret); 504018ba95cSWang, Rui Y goto out_noreq; 505018ba95cSWang, Rui Y } 506018ba95cSWang, Rui Y temp += template[i].tap[k]; 507018ba95cSWang, Rui Y } 508018ba95cSWang, Rui Y ret = wait_async_op(&tresult, crypto_ahash_final(req)); 509018ba95cSWang, Rui Y if (ret) { 510018ba95cSWang, Rui Y pr_err("alt: hash: final failed on test %d for %s: ret=%d\n", 511018ba95cSWang, Rui Y j, algo, -ret); 512018ba95cSWang, Rui Y goto out; 513018ba95cSWang, Rui Y } 514018ba95cSWang, Rui Y if (memcmp(result, template[i].digest, 515018ba95cSWang, Rui Y crypto_ahash_digestsize(tfm))) { 516018ba95cSWang, Rui Y pr_err("alg: hash: Partial Test %d failed for %s\n", 517018ba95cSWang, Rui Y j, algo); 518018ba95cSWang, Rui Y hexdump(result, crypto_ahash_digestsize(tfm)); 519018ba95cSWang, Rui Y ret = -EINVAL; 520018ba95cSWang, Rui Y goto out; 521018ba95cSWang, Rui Y } 522018ba95cSWang, Rui Y } 523018ba95cSWang, Rui Y 524da7f033dSHerbert Xu ret = 0; 525da7f033dSHerbert Xu 526da7f033dSHerbert Xu out: 527da7f033dSHerbert Xu ahash_request_free(req); 528da7f033dSHerbert Xu out_noreq: 529f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 530f8b0d4d0SHerbert Xu out_nobuf: 53129b77e5dSHoria Geanta kfree(key); 53229b77e5dSHoria Geanta kfree(result); 533da7f033dSHerbert Xu return ret; 534da7f033dSHerbert Xu } 535da7f033dSHerbert Xu 536da5ffe11SJussi Kivilinna static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template, 537da5ffe11SJussi Kivilinna unsigned int tcount, bool use_digest) 538da5ffe11SJussi Kivilinna { 539da5ffe11SJussi Kivilinna unsigned int alignmask; 540da5ffe11SJussi Kivilinna int ret; 541da5ffe11SJussi Kivilinna 542da5ffe11SJussi Kivilinna ret = __test_hash(tfm, template, tcount, use_digest, 0); 543da5ffe11SJussi Kivilinna if (ret) 544da5ffe11SJussi Kivilinna return ret; 545da5ffe11SJussi Kivilinna 546da5ffe11SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 547da5ffe11SJussi Kivilinna ret = __test_hash(tfm, template, tcount, use_digest, 1); 548da5ffe11SJussi Kivilinna if (ret) 549da5ffe11SJussi Kivilinna return ret; 550da5ffe11SJussi Kivilinna 551da5ffe11SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 552da5ffe11SJussi Kivilinna if (alignmask) { 553da5ffe11SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 554da5ffe11SJussi Kivilinna ret = __test_hash(tfm, template, tcount, use_digest, 555da5ffe11SJussi Kivilinna alignmask + 1); 556da5ffe11SJussi Kivilinna if (ret) 557da5ffe11SJussi Kivilinna return ret; 558da5ffe11SJussi Kivilinna } 559da5ffe11SJussi Kivilinna 560da5ffe11SJussi Kivilinna return 0; 561da5ffe11SJussi Kivilinna } 562da5ffe11SJussi Kivilinna 563d8a32ac2SJussi Kivilinna static int __test_aead(struct crypto_aead *tfm, int enc, 564d8a32ac2SJussi Kivilinna struct aead_testvec *template, unsigned int tcount, 56558dcf548SJussi Kivilinna const bool diff_dst, const int align_offset) 566da7f033dSHerbert Xu { 567da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)); 568da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 569f8b0d4d0SHerbert Xu int ret = -ENOMEM; 570da7f033dSHerbert Xu char *q; 571da7f033dSHerbert Xu char *key; 572da7f033dSHerbert Xu struct aead_request *req; 573d8a32ac2SJussi Kivilinna struct scatterlist *sg; 574d8a32ac2SJussi Kivilinna struct scatterlist *sgout; 575d8a32ac2SJussi Kivilinna const char *e, *d; 576da7f033dSHerbert Xu struct tcrypt_result result; 577424a5da6SCristian Stoica unsigned int authsize, iv_len; 578da7f033dSHerbert Xu void *input; 579d8a32ac2SJussi Kivilinna void *output; 580da7f033dSHerbert Xu void *assoc; 5819bac019dSTadeusz Struk char *iv; 582f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 583d8a32ac2SJussi Kivilinna char *xoutbuf[XBUFSIZE]; 584f8b0d4d0SHerbert Xu char *axbuf[XBUFSIZE]; 585f8b0d4d0SHerbert Xu 5869bac019dSTadeusz Struk iv = kzalloc(MAX_IVLEN, GFP_KERNEL); 5879bac019dSTadeusz Struk if (!iv) 5889bac019dSTadeusz Struk return ret; 58929b77e5dSHoria Geanta key = kmalloc(MAX_KEYLEN, GFP_KERNEL); 59029b77e5dSHoria Geanta if (!key) 59129b77e5dSHoria Geanta goto out_noxbuf; 592f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 593f8b0d4d0SHerbert Xu goto out_noxbuf; 594f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(axbuf)) 595f8b0d4d0SHerbert Xu goto out_noaxbuf; 596d8a32ac2SJussi Kivilinna if (diff_dst && testmgr_alloc_buf(xoutbuf)) 597d8a32ac2SJussi Kivilinna goto out_nooutbuf; 598d8a32ac2SJussi Kivilinna 599d8a32ac2SJussi Kivilinna /* avoid "the frame size is larger than 1024 bytes" compiler warning */ 6008a525fcdSHerbert Xu sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 4 : 2), GFP_KERNEL); 601d8a32ac2SJussi Kivilinna if (!sg) 602d8a32ac2SJussi Kivilinna goto out_nosg; 6038a525fcdSHerbert Xu sgout = &sg[16]; 604d8a32ac2SJussi Kivilinna 605d8a32ac2SJussi Kivilinna if (diff_dst) 606d8a32ac2SJussi Kivilinna d = "-ddst"; 607d8a32ac2SJussi Kivilinna else 608d8a32ac2SJussi Kivilinna d = ""; 609d8a32ac2SJussi Kivilinna 610da7f033dSHerbert Xu if (enc == ENCRYPT) 611da7f033dSHerbert Xu e = "encryption"; 612da7f033dSHerbert Xu else 613da7f033dSHerbert Xu e = "decryption"; 614da7f033dSHerbert Xu 615da7f033dSHerbert Xu init_completion(&result.completion); 616da7f033dSHerbert Xu 617da7f033dSHerbert Xu req = aead_request_alloc(tfm, GFP_KERNEL); 618da7f033dSHerbert Xu if (!req) { 619d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to allocate request for %s\n", 620d8a32ac2SJussi Kivilinna d, algo); 621da7f033dSHerbert Xu goto out; 622da7f033dSHerbert Xu } 623da7f033dSHerbert Xu 624da7f033dSHerbert Xu aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 625da7f033dSHerbert Xu tcrypt_complete, &result); 626da7f033dSHerbert Xu 627abfa7f43SJerome Marchand iv_len = crypto_aead_ivsize(tfm); 628abfa7f43SJerome Marchand 629da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 63005b1d338SCristian Stoica if (template[i].np) 63105b1d338SCristian Stoica continue; 63205b1d338SCristian Stoica 633da7f033dSHerbert Xu j++; 634da7f033dSHerbert Xu 63558dcf548SJussi Kivilinna /* some templates have no input data but they will 636da7f033dSHerbert Xu * touch input 637da7f033dSHerbert Xu */ 638da7f033dSHerbert Xu input = xbuf[0]; 63958dcf548SJussi Kivilinna input += align_offset; 640da7f033dSHerbert Xu assoc = axbuf[0]; 641da7f033dSHerbert Xu 642fd57f22aSHerbert Xu ret = -EINVAL; 64358dcf548SJussi Kivilinna if (WARN_ON(align_offset + template[i].ilen > 64458dcf548SJussi Kivilinna PAGE_SIZE || template[i].alen > PAGE_SIZE)) 645fd57f22aSHerbert Xu goto out; 646fd57f22aSHerbert Xu 647da7f033dSHerbert Xu memcpy(input, template[i].input, template[i].ilen); 648da7f033dSHerbert Xu memcpy(assoc, template[i].assoc, template[i].alen); 649da7f033dSHerbert Xu if (template[i].iv) 650424a5da6SCristian Stoica memcpy(iv, template[i].iv, iv_len); 651da7f033dSHerbert Xu else 652424a5da6SCristian Stoica memset(iv, 0, iv_len); 653da7f033dSHerbert Xu 654da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 655da7f033dSHerbert Xu if (template[i].wk) 65605b1d338SCristian Stoica crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 657da7f033dSHerbert Xu 65829b77e5dSHoria Geanta if (template[i].klen > MAX_KEYLEN) { 65929b77e5dSHoria Geanta pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n", 66029b77e5dSHoria Geanta d, j, algo, template[i].klen, 66129b77e5dSHoria Geanta MAX_KEYLEN); 66229b77e5dSHoria Geanta ret = -EINVAL; 66329b77e5dSHoria Geanta goto out; 66429b77e5dSHoria Geanta } 66529b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].klen); 666da7f033dSHerbert Xu 66705b1d338SCristian Stoica ret = crypto_aead_setkey(tfm, key, template[i].klen); 6680fae0c1eSYanjiang Jin if (template[i].fail == !ret) { 669d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n", 670d8a32ac2SJussi Kivilinna d, j, algo, crypto_aead_get_flags(tfm)); 671da7f033dSHerbert Xu goto out; 672da7f033dSHerbert Xu } else if (ret) 673da7f033dSHerbert Xu continue; 674da7f033dSHerbert Xu 675da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 676da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 677da7f033dSHerbert Xu if (ret) { 678d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n", 679d8a32ac2SJussi Kivilinna d, authsize, j, algo); 680da7f033dSHerbert Xu goto out; 681da7f033dSHerbert Xu } 682da7f033dSHerbert Xu 6838a525fcdSHerbert Xu k = !!template[i].alen; 6848a525fcdSHerbert Xu sg_init_table(sg, k + 1); 6858a525fcdSHerbert Xu sg_set_buf(&sg[0], assoc, template[i].alen); 6868a525fcdSHerbert Xu sg_set_buf(&sg[k], input, 68705b1d338SCristian Stoica template[i].ilen + (enc ? authsize : 0)); 688d8a32ac2SJussi Kivilinna output = input; 689d8a32ac2SJussi Kivilinna 6908a525fcdSHerbert Xu if (diff_dst) { 6918a525fcdSHerbert Xu sg_init_table(sgout, k + 1); 6928a525fcdSHerbert Xu sg_set_buf(&sgout[0], assoc, template[i].alen); 6938a525fcdSHerbert Xu 6948a525fcdSHerbert Xu output = xoutbuf[0]; 6958a525fcdSHerbert Xu output += align_offset; 6968a525fcdSHerbert Xu sg_set_buf(&sgout[k], output, 6978a525fcdSHerbert Xu template[i].rlen + (enc ? 0 : authsize)); 6988a525fcdSHerbert Xu } 699da7f033dSHerbert Xu 700d8a32ac2SJussi Kivilinna aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 701da7f033dSHerbert Xu template[i].ilen, iv); 702da7f033dSHerbert Xu 7038a525fcdSHerbert Xu aead_request_set_ad(req, template[i].alen); 704da7f033dSHerbert Xu 70505b1d338SCristian Stoica ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req); 706da7f033dSHerbert Xu 707da7f033dSHerbert Xu switch (ret) { 708da7f033dSHerbert Xu case 0: 709e44a1b44SJarod Wilson if (template[i].novrfy) { 710e44a1b44SJarod Wilson /* verification was supposed to fail */ 711d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n", 712d8a32ac2SJussi Kivilinna d, e, j, algo); 713e44a1b44SJarod Wilson /* so really, we got a bad message */ 714e44a1b44SJarod Wilson ret = -EBADMSG; 715e44a1b44SJarod Wilson goto out; 716e44a1b44SJarod Wilson } 717da7f033dSHerbert Xu break; 718da7f033dSHerbert Xu case -EINPROGRESS: 719da7f033dSHerbert Xu case -EBUSY: 7208a45ac12SRabin Vincent wait_for_completion(&result.completion); 72116735d02SWolfram Sang reinit_completion(&result.completion); 7228a45ac12SRabin Vincent ret = result.err; 7238a45ac12SRabin Vincent if (!ret) 724da7f033dSHerbert Xu break; 725e44a1b44SJarod Wilson case -EBADMSG: 726e44a1b44SJarod Wilson if (template[i].novrfy) 727e44a1b44SJarod Wilson /* verification failure was expected */ 728e44a1b44SJarod Wilson continue; 729da7f033dSHerbert Xu /* fall through */ 730da7f033dSHerbert Xu default: 731d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n", 732d8a32ac2SJussi Kivilinna d, e, j, algo, -ret); 733da7f033dSHerbert Xu goto out; 734da7f033dSHerbert Xu } 735da7f033dSHerbert Xu 736d8a32ac2SJussi Kivilinna q = output; 737da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 738d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Test %d failed on %s for %s\n", 739d8a32ac2SJussi Kivilinna d, j, e, algo); 740da7f033dSHerbert Xu hexdump(q, template[i].rlen); 741da7f033dSHerbert Xu ret = -EINVAL; 742da7f033dSHerbert Xu goto out; 743da7f033dSHerbert Xu } 744da7f033dSHerbert Xu } 745da7f033dSHerbert Xu 746da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 74758dcf548SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 74858dcf548SJussi Kivilinna if (align_offset != 0) 74958dcf548SJussi Kivilinna break; 75058dcf548SJussi Kivilinna 75105b1d338SCristian Stoica if (!template[i].np) 75205b1d338SCristian Stoica continue; 75305b1d338SCristian Stoica 754da7f033dSHerbert Xu j++; 755da7f033dSHerbert Xu 756da7f033dSHerbert Xu if (template[i].iv) 757abfa7f43SJerome Marchand memcpy(iv, template[i].iv, iv_len); 758da7f033dSHerbert Xu else 759da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 760da7f033dSHerbert Xu 761da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 762da7f033dSHerbert Xu if (template[i].wk) 76305b1d338SCristian Stoica crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 76429b77e5dSHoria Geanta if (template[i].klen > MAX_KEYLEN) { 76529b77e5dSHoria Geanta pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n", 76605b1d338SCristian Stoica d, j, algo, template[i].klen, MAX_KEYLEN); 76729b77e5dSHoria Geanta ret = -EINVAL; 76829b77e5dSHoria Geanta goto out; 76929b77e5dSHoria Geanta } 77029b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].klen); 771da7f033dSHerbert Xu 772da7f033dSHerbert Xu ret = crypto_aead_setkey(tfm, key, template[i].klen); 7730fae0c1eSYanjiang Jin if (template[i].fail == !ret) { 774d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n", 775d8a32ac2SJussi Kivilinna d, j, algo, crypto_aead_get_flags(tfm)); 776da7f033dSHerbert Xu goto out; 777da7f033dSHerbert Xu } else if (ret) 778da7f033dSHerbert Xu continue; 779da7f033dSHerbert Xu 780da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 781da7f033dSHerbert Xu 782da7f033dSHerbert Xu ret = -EINVAL; 7838a525fcdSHerbert Xu sg_init_table(sg, template[i].anp + template[i].np); 784d8a32ac2SJussi Kivilinna if (diff_dst) 7858a525fcdSHerbert Xu sg_init_table(sgout, template[i].anp + template[i].np); 7868a525fcdSHerbert Xu 7878a525fcdSHerbert Xu ret = -EINVAL; 7888a525fcdSHerbert Xu for (k = 0, temp = 0; k < template[i].anp; k++) { 7898a525fcdSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 7908a525fcdSHerbert Xu template[i].atap[k] > PAGE_SIZE)) 7918a525fcdSHerbert Xu goto out; 7928a525fcdSHerbert Xu sg_set_buf(&sg[k], 7938a525fcdSHerbert Xu memcpy(axbuf[IDX[k] >> PAGE_SHIFT] + 7948a525fcdSHerbert Xu offset_in_page(IDX[k]), 7958a525fcdSHerbert Xu template[i].assoc + temp, 7968a525fcdSHerbert Xu template[i].atap[k]), 7978a525fcdSHerbert Xu template[i].atap[k]); 7988a525fcdSHerbert Xu if (diff_dst) 7998a525fcdSHerbert Xu sg_set_buf(&sgout[k], 8008a525fcdSHerbert Xu axbuf[IDX[k] >> PAGE_SHIFT] + 8018a525fcdSHerbert Xu offset_in_page(IDX[k]), 8028a525fcdSHerbert Xu template[i].atap[k]); 8038a525fcdSHerbert Xu temp += template[i].atap[k]; 8048a525fcdSHerbert Xu } 8058a525fcdSHerbert Xu 806da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 807da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 808da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 809da7f033dSHerbert Xu goto out; 810da7f033dSHerbert Xu 81105b1d338SCristian Stoica q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]); 81205b1d338SCristian Stoica memcpy(q, template[i].input + temp, template[i].tap[k]); 8138a525fcdSHerbert Xu sg_set_buf(&sg[template[i].anp + k], 8148a525fcdSHerbert Xu q, template[i].tap[k]); 815d8a32ac2SJussi Kivilinna 816d8a32ac2SJussi Kivilinna if (diff_dst) { 817d8a32ac2SJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 818d8a32ac2SJussi Kivilinna offset_in_page(IDX[k]); 819d8a32ac2SJussi Kivilinna 820d8a32ac2SJussi Kivilinna memset(q, 0, template[i].tap[k]); 821d8a32ac2SJussi Kivilinna 8228a525fcdSHerbert Xu sg_set_buf(&sgout[template[i].anp + k], 8238a525fcdSHerbert Xu q, template[i].tap[k]); 824d8a32ac2SJussi Kivilinna } 825d8a32ac2SJussi Kivilinna 8268ec25c51SHoria Geanta n = template[i].tap[k]; 8278ec25c51SHoria Geanta if (k == template[i].np - 1 && enc) 8288ec25c51SHoria Geanta n += authsize; 8298ec25c51SHoria Geanta if (offset_in_page(q) + n < PAGE_SIZE) 8308ec25c51SHoria Geanta q[n] = 0; 8318ec25c51SHoria Geanta 832da7f033dSHerbert Xu temp += template[i].tap[k]; 833da7f033dSHerbert Xu } 834da7f033dSHerbert Xu 835da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 836da7f033dSHerbert Xu if (ret) { 837d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n", 838d8a32ac2SJussi Kivilinna d, authsize, j, algo); 839da7f033dSHerbert Xu goto out; 840da7f033dSHerbert Xu } 841da7f033dSHerbert Xu 842da7f033dSHerbert Xu if (enc) { 8438a525fcdSHerbert Xu if (WARN_ON(sg[template[i].anp + k - 1].offset + 8448a525fcdSHerbert Xu sg[template[i].anp + k - 1].length + 8458a525fcdSHerbert Xu authsize > PAGE_SIZE)) { 846da7f033dSHerbert Xu ret = -EINVAL; 847da7f033dSHerbert Xu goto out; 848da7f033dSHerbert Xu } 849da7f033dSHerbert Xu 850d8a32ac2SJussi Kivilinna if (diff_dst) 8518a525fcdSHerbert Xu sgout[template[i].anp + k - 1].length += 8528a525fcdSHerbert Xu authsize; 8538a525fcdSHerbert Xu sg[template[i].anp + k - 1].length += authsize; 854da7f033dSHerbert Xu } 855da7f033dSHerbert Xu 856d8a32ac2SJussi Kivilinna aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 857da7f033dSHerbert Xu template[i].ilen, 858da7f033dSHerbert Xu iv); 859da7f033dSHerbert Xu 8608a525fcdSHerbert Xu aead_request_set_ad(req, template[i].alen); 861da7f033dSHerbert Xu 86205b1d338SCristian Stoica ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req); 863da7f033dSHerbert Xu 864da7f033dSHerbert Xu switch (ret) { 865da7f033dSHerbert Xu case 0: 866e44a1b44SJarod Wilson if (template[i].novrfy) { 867e44a1b44SJarod Wilson /* verification was supposed to fail */ 868d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n", 869d8a32ac2SJussi Kivilinna d, e, j, algo); 870e44a1b44SJarod Wilson /* so really, we got a bad message */ 871e44a1b44SJarod Wilson ret = -EBADMSG; 872e44a1b44SJarod Wilson goto out; 873e44a1b44SJarod Wilson } 874da7f033dSHerbert Xu break; 875da7f033dSHerbert Xu case -EINPROGRESS: 876da7f033dSHerbert Xu case -EBUSY: 8778a45ac12SRabin Vincent wait_for_completion(&result.completion); 87816735d02SWolfram Sang reinit_completion(&result.completion); 8798a45ac12SRabin Vincent ret = result.err; 8808a45ac12SRabin Vincent if (!ret) 881da7f033dSHerbert Xu break; 882e44a1b44SJarod Wilson case -EBADMSG: 883e44a1b44SJarod Wilson if (template[i].novrfy) 884e44a1b44SJarod Wilson /* verification failure was expected */ 885e44a1b44SJarod Wilson continue; 886da7f033dSHerbert Xu /* fall through */ 887da7f033dSHerbert Xu default: 888d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n", 889d8a32ac2SJussi Kivilinna d, e, j, algo, -ret); 890da7f033dSHerbert Xu goto out; 891da7f033dSHerbert Xu } 892da7f033dSHerbert Xu 893da7f033dSHerbert Xu ret = -EINVAL; 894da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 895d8a32ac2SJussi Kivilinna if (diff_dst) 896d8a32ac2SJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 897d8a32ac2SJussi Kivilinna offset_in_page(IDX[k]); 898d8a32ac2SJussi Kivilinna else 899da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 900da7f033dSHerbert Xu offset_in_page(IDX[k]); 901da7f033dSHerbert Xu 902da7f033dSHerbert Xu n = template[i].tap[k]; 903da7f033dSHerbert Xu if (k == template[i].np - 1) 904da7f033dSHerbert Xu n += enc ? authsize : -authsize; 905da7f033dSHerbert Xu 906da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, n)) { 907d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n", 908d8a32ac2SJussi Kivilinna d, j, e, k, algo); 909da7f033dSHerbert Xu hexdump(q, n); 910da7f033dSHerbert Xu goto out; 911da7f033dSHerbert Xu } 912da7f033dSHerbert Xu 913da7f033dSHerbert Xu q += n; 914da7f033dSHerbert Xu if (k == template[i].np - 1 && !enc) { 915d8a32ac2SJussi Kivilinna if (!diff_dst && 916d8a32ac2SJussi Kivilinna memcmp(q, template[i].input + 917da7f033dSHerbert Xu temp + n, authsize)) 918da7f033dSHerbert Xu n = authsize; 919da7f033dSHerbert Xu else 920da7f033dSHerbert Xu n = 0; 921da7f033dSHerbert Xu } else { 92205b1d338SCristian Stoica for (n = 0; offset_in_page(q + n) && q[n]; n++) 923da7f033dSHerbert Xu ; 924da7f033dSHerbert Xu } 925da7f033dSHerbert Xu if (n) { 926d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n", 927d8a32ac2SJussi Kivilinna d, j, e, k, algo, n); 928da7f033dSHerbert Xu hexdump(q, n); 929da7f033dSHerbert Xu goto out; 930da7f033dSHerbert Xu } 931da7f033dSHerbert Xu 932da7f033dSHerbert Xu temp += template[i].tap[k]; 933da7f033dSHerbert Xu } 934da7f033dSHerbert Xu } 935da7f033dSHerbert Xu 936da7f033dSHerbert Xu ret = 0; 937da7f033dSHerbert Xu 938da7f033dSHerbert Xu out: 939da7f033dSHerbert Xu aead_request_free(req); 940d8a32ac2SJussi Kivilinna kfree(sg); 941d8a32ac2SJussi Kivilinna out_nosg: 942d8a32ac2SJussi Kivilinna if (diff_dst) 943d8a32ac2SJussi Kivilinna testmgr_free_buf(xoutbuf); 944d8a32ac2SJussi Kivilinna out_nooutbuf: 945f8b0d4d0SHerbert Xu testmgr_free_buf(axbuf); 946f8b0d4d0SHerbert Xu out_noaxbuf: 947f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 948f8b0d4d0SHerbert Xu out_noxbuf: 94929b77e5dSHoria Geanta kfree(key); 9509bac019dSTadeusz Struk kfree(iv); 951da7f033dSHerbert Xu return ret; 952da7f033dSHerbert Xu } 953da7f033dSHerbert Xu 954d8a32ac2SJussi Kivilinna static int test_aead(struct crypto_aead *tfm, int enc, 955d8a32ac2SJussi Kivilinna struct aead_testvec *template, unsigned int tcount) 956d8a32ac2SJussi Kivilinna { 95758dcf548SJussi Kivilinna unsigned int alignmask; 958d8a32ac2SJussi Kivilinna int ret; 959d8a32ac2SJussi Kivilinna 960d8a32ac2SJussi Kivilinna /* test 'dst == src' case */ 96158dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, false, 0); 962d8a32ac2SJussi Kivilinna if (ret) 963d8a32ac2SJussi Kivilinna return ret; 964d8a32ac2SJussi Kivilinna 965d8a32ac2SJussi Kivilinna /* test 'dst != src' case */ 96658dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 0); 96758dcf548SJussi Kivilinna if (ret) 96858dcf548SJussi Kivilinna return ret; 96958dcf548SJussi Kivilinna 97058dcf548SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 97158dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 1); 97258dcf548SJussi Kivilinna if (ret) 97358dcf548SJussi Kivilinna return ret; 97458dcf548SJussi Kivilinna 97558dcf548SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 97658dcf548SJussi Kivilinna if (alignmask) { 97758dcf548SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 97858dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 97958dcf548SJussi Kivilinna alignmask + 1); 98058dcf548SJussi Kivilinna if (ret) 98158dcf548SJussi Kivilinna return ret; 98258dcf548SJussi Kivilinna } 98358dcf548SJussi Kivilinna 98458dcf548SJussi Kivilinna return 0; 985d8a32ac2SJussi Kivilinna } 986d8a32ac2SJussi Kivilinna 9871aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc, 9881aa4ecd9SHerbert Xu struct cipher_testvec *template, unsigned int tcount) 9891aa4ecd9SHerbert Xu { 9901aa4ecd9SHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm)); 9911aa4ecd9SHerbert Xu unsigned int i, j, k; 9921aa4ecd9SHerbert Xu char *q; 9931aa4ecd9SHerbert Xu const char *e; 9941aa4ecd9SHerbert Xu void *data; 995f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 996f8b0d4d0SHerbert Xu int ret = -ENOMEM; 997f8b0d4d0SHerbert Xu 998f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 999f8b0d4d0SHerbert Xu goto out_nobuf; 10001aa4ecd9SHerbert Xu 10011aa4ecd9SHerbert Xu if (enc == ENCRYPT) 10021aa4ecd9SHerbert Xu e = "encryption"; 10031aa4ecd9SHerbert Xu else 10041aa4ecd9SHerbert Xu e = "decryption"; 10051aa4ecd9SHerbert Xu 10061aa4ecd9SHerbert Xu j = 0; 10071aa4ecd9SHerbert Xu for (i = 0; i < tcount; i++) { 10081aa4ecd9SHerbert Xu if (template[i].np) 10091aa4ecd9SHerbert Xu continue; 10101aa4ecd9SHerbert Xu 101110faa8c0SStephan Mueller if (fips_enabled && template[i].fips_skip) 101210faa8c0SStephan Mueller continue; 101310faa8c0SStephan Mueller 10141aa4ecd9SHerbert Xu j++; 10151aa4ecd9SHerbert Xu 1016fd57f22aSHerbert Xu ret = -EINVAL; 1017fd57f22aSHerbert Xu if (WARN_ON(template[i].ilen > PAGE_SIZE)) 1018fd57f22aSHerbert Xu goto out; 1019fd57f22aSHerbert Xu 10201aa4ecd9SHerbert Xu data = xbuf[0]; 10211aa4ecd9SHerbert Xu memcpy(data, template[i].input, template[i].ilen); 10221aa4ecd9SHerbert Xu 10231aa4ecd9SHerbert Xu crypto_cipher_clear_flags(tfm, ~0); 10241aa4ecd9SHerbert Xu if (template[i].wk) 10251aa4ecd9SHerbert Xu crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 10261aa4ecd9SHerbert Xu 10271aa4ecd9SHerbert Xu ret = crypto_cipher_setkey(tfm, template[i].key, 10281aa4ecd9SHerbert Xu template[i].klen); 10290fae0c1eSYanjiang Jin if (template[i].fail == !ret) { 10301aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: setkey failed " 10311aa4ecd9SHerbert Xu "on test %d for %s: flags=%x\n", j, 10321aa4ecd9SHerbert Xu algo, crypto_cipher_get_flags(tfm)); 10331aa4ecd9SHerbert Xu goto out; 10341aa4ecd9SHerbert Xu } else if (ret) 10351aa4ecd9SHerbert Xu continue; 10361aa4ecd9SHerbert Xu 10371aa4ecd9SHerbert Xu for (k = 0; k < template[i].ilen; 10381aa4ecd9SHerbert Xu k += crypto_cipher_blocksize(tfm)) { 10391aa4ecd9SHerbert Xu if (enc) 10401aa4ecd9SHerbert Xu crypto_cipher_encrypt_one(tfm, data + k, 10411aa4ecd9SHerbert Xu data + k); 10421aa4ecd9SHerbert Xu else 10431aa4ecd9SHerbert Xu crypto_cipher_decrypt_one(tfm, data + k, 10441aa4ecd9SHerbert Xu data + k); 10451aa4ecd9SHerbert Xu } 10461aa4ecd9SHerbert Xu 10471aa4ecd9SHerbert Xu q = data; 10481aa4ecd9SHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 10491aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: Test %d failed " 10501aa4ecd9SHerbert Xu "on %s for %s\n", j, e, algo); 10511aa4ecd9SHerbert Xu hexdump(q, template[i].rlen); 10521aa4ecd9SHerbert Xu ret = -EINVAL; 10531aa4ecd9SHerbert Xu goto out; 10541aa4ecd9SHerbert Xu } 10551aa4ecd9SHerbert Xu } 10561aa4ecd9SHerbert Xu 10571aa4ecd9SHerbert Xu ret = 0; 10581aa4ecd9SHerbert Xu 10591aa4ecd9SHerbert Xu out: 1060f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 1061f8b0d4d0SHerbert Xu out_nobuf: 10621aa4ecd9SHerbert Xu return ret; 10631aa4ecd9SHerbert Xu } 10641aa4ecd9SHerbert Xu 106512773d93SHerbert Xu static int __test_skcipher(struct crypto_skcipher *tfm, int enc, 106608d6af8cSJussi Kivilinna struct cipher_testvec *template, unsigned int tcount, 10673a338f20SJussi Kivilinna const bool diff_dst, const int align_offset) 1068da7f033dSHerbert Xu { 1069da7f033dSHerbert Xu const char *algo = 107012773d93SHerbert Xu crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)); 1071da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 1072da7f033dSHerbert Xu char *q; 107312773d93SHerbert Xu struct skcipher_request *req; 1074da7f033dSHerbert Xu struct scatterlist sg[8]; 107508d6af8cSJussi Kivilinna struct scatterlist sgout[8]; 107608d6af8cSJussi Kivilinna const char *e, *d; 1077da7f033dSHerbert Xu struct tcrypt_result result; 1078da7f033dSHerbert Xu void *data; 1079da7f033dSHerbert Xu char iv[MAX_IVLEN]; 1080f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 108108d6af8cSJussi Kivilinna char *xoutbuf[XBUFSIZE]; 1082f8b0d4d0SHerbert Xu int ret = -ENOMEM; 108384cba178SAndrey Ryabinin unsigned int ivsize = crypto_skcipher_ivsize(tfm); 1084f8b0d4d0SHerbert Xu 1085f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 1086f8b0d4d0SHerbert Xu goto out_nobuf; 1087da7f033dSHerbert Xu 108808d6af8cSJussi Kivilinna if (diff_dst && testmgr_alloc_buf(xoutbuf)) 108908d6af8cSJussi Kivilinna goto out_nooutbuf; 109008d6af8cSJussi Kivilinna 109108d6af8cSJussi Kivilinna if (diff_dst) 109208d6af8cSJussi Kivilinna d = "-ddst"; 109308d6af8cSJussi Kivilinna else 109408d6af8cSJussi Kivilinna d = ""; 109508d6af8cSJussi Kivilinna 1096da7f033dSHerbert Xu if (enc == ENCRYPT) 1097da7f033dSHerbert Xu e = "encryption"; 1098da7f033dSHerbert Xu else 1099da7f033dSHerbert Xu e = "decryption"; 1100da7f033dSHerbert Xu 1101da7f033dSHerbert Xu init_completion(&result.completion); 1102da7f033dSHerbert Xu 110312773d93SHerbert Xu req = skcipher_request_alloc(tfm, GFP_KERNEL); 1104da7f033dSHerbert Xu if (!req) { 110508d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Failed to allocate request for %s\n", 110608d6af8cSJussi Kivilinna d, algo); 1107da7f033dSHerbert Xu goto out; 1108da7f033dSHerbert Xu } 1109da7f033dSHerbert Xu 111012773d93SHerbert Xu skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 1111da7f033dSHerbert Xu tcrypt_complete, &result); 1112da7f033dSHerbert Xu 1113da7f033dSHerbert Xu j = 0; 1114da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 1115bbb9a7ddSCristian Stoica if (template[i].np && !template[i].also_non_np) 1116bbb9a7ddSCristian Stoica continue; 1117bbb9a7ddSCristian Stoica 111810faa8c0SStephan Mueller if (fips_enabled && template[i].fips_skip) 111910faa8c0SStephan Mueller continue; 112010faa8c0SStephan Mueller 1121da7f033dSHerbert Xu if (template[i].iv) 112284cba178SAndrey Ryabinin memcpy(iv, template[i].iv, ivsize); 1123da7f033dSHerbert Xu else 1124da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 1125da7f033dSHerbert Xu 1126da7f033dSHerbert Xu j++; 1127fd57f22aSHerbert Xu ret = -EINVAL; 1128a1aa44a2SCristian Stoica if (WARN_ON(align_offset + template[i].ilen > PAGE_SIZE)) 1129fd57f22aSHerbert Xu goto out; 1130fd57f22aSHerbert Xu 1131da7f033dSHerbert Xu data = xbuf[0]; 11323a338f20SJussi Kivilinna data += align_offset; 1133da7f033dSHerbert Xu memcpy(data, template[i].input, template[i].ilen); 1134da7f033dSHerbert Xu 113512773d93SHerbert Xu crypto_skcipher_clear_flags(tfm, ~0); 1136da7f033dSHerbert Xu if (template[i].wk) 113712773d93SHerbert Xu crypto_skcipher_set_flags(tfm, 113812773d93SHerbert Xu CRYPTO_TFM_REQ_WEAK_KEY); 1139da7f033dSHerbert Xu 114012773d93SHerbert Xu ret = crypto_skcipher_setkey(tfm, template[i].key, 1141da7f033dSHerbert Xu template[i].klen); 11420fae0c1eSYanjiang Jin if (template[i].fail == !ret) { 114308d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n", 114412773d93SHerbert Xu d, j, algo, crypto_skcipher_get_flags(tfm)); 1145da7f033dSHerbert Xu goto out; 1146da7f033dSHerbert Xu } else if (ret) 1147da7f033dSHerbert Xu continue; 1148da7f033dSHerbert Xu 1149da7f033dSHerbert Xu sg_init_one(&sg[0], data, template[i].ilen); 115008d6af8cSJussi Kivilinna if (diff_dst) { 115108d6af8cSJussi Kivilinna data = xoutbuf[0]; 11523a338f20SJussi Kivilinna data += align_offset; 115308d6af8cSJussi Kivilinna sg_init_one(&sgout[0], data, template[i].ilen); 115408d6af8cSJussi Kivilinna } 1155da7f033dSHerbert Xu 115612773d93SHerbert Xu skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 1157da7f033dSHerbert Xu template[i].ilen, iv); 115812773d93SHerbert Xu ret = enc ? crypto_skcipher_encrypt(req) : 115912773d93SHerbert Xu crypto_skcipher_decrypt(req); 1160da7f033dSHerbert Xu 1161da7f033dSHerbert Xu switch (ret) { 1162da7f033dSHerbert Xu case 0: 1163da7f033dSHerbert Xu break; 1164da7f033dSHerbert Xu case -EINPROGRESS: 1165da7f033dSHerbert Xu case -EBUSY: 11668a45ac12SRabin Vincent wait_for_completion(&result.completion); 116716735d02SWolfram Sang reinit_completion(&result.completion); 11688a45ac12SRabin Vincent ret = result.err; 11698a45ac12SRabin Vincent if (!ret) 1170da7f033dSHerbert Xu break; 1171da7f033dSHerbert Xu /* fall through */ 1172da7f033dSHerbert Xu default: 117308d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n", 117408d6af8cSJussi Kivilinna d, e, j, algo, -ret); 1175da7f033dSHerbert Xu goto out; 1176da7f033dSHerbert Xu } 1177da7f033dSHerbert Xu 1178da7f033dSHerbert Xu q = data; 1179da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 11808a826a34SBoris BREZILLON pr_err("alg: skcipher%s: Test %d failed (invalid result) on %s for %s\n", 118108d6af8cSJussi Kivilinna d, j, e, algo); 1182da7f033dSHerbert Xu hexdump(q, template[i].rlen); 1183da7f033dSHerbert Xu ret = -EINVAL; 1184da7f033dSHerbert Xu goto out; 1185da7f033dSHerbert Xu } 11868a826a34SBoris BREZILLON 11878a826a34SBoris BREZILLON if (template[i].iv_out && 11888a826a34SBoris BREZILLON memcmp(iv, template[i].iv_out, 11898a826a34SBoris BREZILLON crypto_skcipher_ivsize(tfm))) { 11908a826a34SBoris BREZILLON pr_err("alg: skcipher%s: Test %d failed (invalid output IV) on %s for %s\n", 11918a826a34SBoris BREZILLON d, j, e, algo); 11928a826a34SBoris BREZILLON hexdump(iv, crypto_skcipher_ivsize(tfm)); 11938a826a34SBoris BREZILLON ret = -EINVAL; 11948a826a34SBoris BREZILLON goto out; 11958a826a34SBoris BREZILLON } 1196da7f033dSHerbert Xu } 1197da7f033dSHerbert Xu 1198da7f033dSHerbert Xu j = 0; 1199da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 12003a338f20SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 12013a338f20SJussi Kivilinna if (align_offset != 0) 12023a338f20SJussi Kivilinna break; 1203da7f033dSHerbert Xu 1204bbb9a7ddSCristian Stoica if (!template[i].np) 1205bbb9a7ddSCristian Stoica continue; 1206bbb9a7ddSCristian Stoica 120710faa8c0SStephan Mueller if (fips_enabled && template[i].fips_skip) 120810faa8c0SStephan Mueller continue; 120910faa8c0SStephan Mueller 1210da7f033dSHerbert Xu if (template[i].iv) 121184cba178SAndrey Ryabinin memcpy(iv, template[i].iv, ivsize); 1212da7f033dSHerbert Xu else 1213da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 1214da7f033dSHerbert Xu 1215da7f033dSHerbert Xu j++; 121612773d93SHerbert Xu crypto_skcipher_clear_flags(tfm, ~0); 1217da7f033dSHerbert Xu if (template[i].wk) 121812773d93SHerbert Xu crypto_skcipher_set_flags(tfm, 121912773d93SHerbert Xu CRYPTO_TFM_REQ_WEAK_KEY); 1220da7f033dSHerbert Xu 122112773d93SHerbert Xu ret = crypto_skcipher_setkey(tfm, template[i].key, 1222da7f033dSHerbert Xu template[i].klen); 12230fae0c1eSYanjiang Jin if (template[i].fail == !ret) { 122408d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n", 122512773d93SHerbert Xu d, j, algo, crypto_skcipher_get_flags(tfm)); 1226da7f033dSHerbert Xu goto out; 1227da7f033dSHerbert Xu } else if (ret) 1228da7f033dSHerbert Xu continue; 1229da7f033dSHerbert Xu 1230da7f033dSHerbert Xu temp = 0; 1231da7f033dSHerbert Xu ret = -EINVAL; 1232da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 123308d6af8cSJussi Kivilinna if (diff_dst) 123408d6af8cSJussi Kivilinna sg_init_table(sgout, template[i].np); 1235da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 1236da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 1237da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 1238da7f033dSHerbert Xu goto out; 1239da7f033dSHerbert Xu 1240a1aa44a2SCristian Stoica q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]); 1241da7f033dSHerbert Xu 1242a1aa44a2SCristian Stoica memcpy(q, template[i].input + temp, template[i].tap[k]); 1243da7f033dSHerbert Xu 1244a1aa44a2SCristian Stoica if (offset_in_page(q) + template[i].tap[k] < PAGE_SIZE) 1245da7f033dSHerbert Xu q[template[i].tap[k]] = 0; 1246da7f033dSHerbert Xu 1247da7f033dSHerbert Xu sg_set_buf(&sg[k], q, template[i].tap[k]); 124808d6af8cSJussi Kivilinna if (diff_dst) { 124908d6af8cSJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 125008d6af8cSJussi Kivilinna offset_in_page(IDX[k]); 125108d6af8cSJussi Kivilinna 1252a1aa44a2SCristian Stoica sg_set_buf(&sgout[k], q, template[i].tap[k]); 125308d6af8cSJussi Kivilinna 125408d6af8cSJussi Kivilinna memset(q, 0, template[i].tap[k]); 125508d6af8cSJussi Kivilinna if (offset_in_page(q) + 125608d6af8cSJussi Kivilinna template[i].tap[k] < PAGE_SIZE) 125708d6af8cSJussi Kivilinna q[template[i].tap[k]] = 0; 125808d6af8cSJussi Kivilinna } 1259da7f033dSHerbert Xu 1260da7f033dSHerbert Xu temp += template[i].tap[k]; 1261da7f033dSHerbert Xu } 1262da7f033dSHerbert Xu 126312773d93SHerbert Xu skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 1264da7f033dSHerbert Xu template[i].ilen, iv); 1265da7f033dSHerbert Xu 126612773d93SHerbert Xu ret = enc ? crypto_skcipher_encrypt(req) : 126712773d93SHerbert Xu crypto_skcipher_decrypt(req); 1268da7f033dSHerbert Xu 1269da7f033dSHerbert Xu switch (ret) { 1270da7f033dSHerbert Xu case 0: 1271da7f033dSHerbert Xu break; 1272da7f033dSHerbert Xu case -EINPROGRESS: 1273da7f033dSHerbert Xu case -EBUSY: 12748a45ac12SRabin Vincent wait_for_completion(&result.completion); 127516735d02SWolfram Sang reinit_completion(&result.completion); 12768a45ac12SRabin Vincent ret = result.err; 12778a45ac12SRabin Vincent if (!ret) 1278da7f033dSHerbert Xu break; 1279da7f033dSHerbert Xu /* fall through */ 1280da7f033dSHerbert Xu default: 128108d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n", 128208d6af8cSJussi Kivilinna d, e, j, algo, -ret); 1283da7f033dSHerbert Xu goto out; 1284da7f033dSHerbert Xu } 1285da7f033dSHerbert Xu 1286da7f033dSHerbert Xu temp = 0; 1287da7f033dSHerbert Xu ret = -EINVAL; 1288da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 128908d6af8cSJussi Kivilinna if (diff_dst) 129008d6af8cSJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 129108d6af8cSJussi Kivilinna offset_in_page(IDX[k]); 129208d6af8cSJussi Kivilinna else 1293da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 1294da7f033dSHerbert Xu offset_in_page(IDX[k]); 1295da7f033dSHerbert Xu 1296da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, 1297da7f033dSHerbert Xu template[i].tap[k])) { 129808d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n", 129908d6af8cSJussi Kivilinna d, j, e, k, algo); 1300da7f033dSHerbert Xu hexdump(q, template[i].tap[k]); 1301da7f033dSHerbert Xu goto out; 1302da7f033dSHerbert Xu } 1303da7f033dSHerbert Xu 1304da7f033dSHerbert Xu q += template[i].tap[k]; 1305da7f033dSHerbert Xu for (n = 0; offset_in_page(q + n) && q[n]; n++) 1306da7f033dSHerbert Xu ; 1307da7f033dSHerbert Xu if (n) { 130808d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n", 130908d6af8cSJussi Kivilinna d, j, e, k, algo, n); 1310da7f033dSHerbert Xu hexdump(q, n); 1311da7f033dSHerbert Xu goto out; 1312da7f033dSHerbert Xu } 1313da7f033dSHerbert Xu temp += template[i].tap[k]; 1314da7f033dSHerbert Xu } 1315da7f033dSHerbert Xu } 1316da7f033dSHerbert Xu 1317da7f033dSHerbert Xu ret = 0; 1318da7f033dSHerbert Xu 1319da7f033dSHerbert Xu out: 132012773d93SHerbert Xu skcipher_request_free(req); 132108d6af8cSJussi Kivilinna if (diff_dst) 132208d6af8cSJussi Kivilinna testmgr_free_buf(xoutbuf); 132308d6af8cSJussi Kivilinna out_nooutbuf: 1324f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 1325f8b0d4d0SHerbert Xu out_nobuf: 1326da7f033dSHerbert Xu return ret; 1327da7f033dSHerbert Xu } 1328da7f033dSHerbert Xu 132912773d93SHerbert Xu static int test_skcipher(struct crypto_skcipher *tfm, int enc, 133008d6af8cSJussi Kivilinna struct cipher_testvec *template, unsigned int tcount) 133108d6af8cSJussi Kivilinna { 13323a338f20SJussi Kivilinna unsigned int alignmask; 133308d6af8cSJussi Kivilinna int ret; 133408d6af8cSJussi Kivilinna 133508d6af8cSJussi Kivilinna /* test 'dst == src' case */ 13363a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, false, 0); 133708d6af8cSJussi Kivilinna if (ret) 133808d6af8cSJussi Kivilinna return ret; 133908d6af8cSJussi Kivilinna 134008d6af8cSJussi Kivilinna /* test 'dst != src' case */ 13413a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 0); 13423a338f20SJussi Kivilinna if (ret) 13433a338f20SJussi Kivilinna return ret; 13443a338f20SJussi Kivilinna 13453a338f20SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 13463a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 1); 13473a338f20SJussi Kivilinna if (ret) 13483a338f20SJussi Kivilinna return ret; 13493a338f20SJussi Kivilinna 13503a338f20SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 13513a338f20SJussi Kivilinna if (alignmask) { 13523a338f20SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 13533a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 13543a338f20SJussi Kivilinna alignmask + 1); 13553a338f20SJussi Kivilinna if (ret) 13563a338f20SJussi Kivilinna return ret; 13573a338f20SJussi Kivilinna } 13583a338f20SJussi Kivilinna 13593a338f20SJussi Kivilinna return 0; 136008d6af8cSJussi Kivilinna } 136108d6af8cSJussi Kivilinna 1362da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate, 1363da7f033dSHerbert Xu struct comp_testvec *dtemplate, int ctcount, int dtcount) 1364da7f033dSHerbert Xu { 1365da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm)); 1366da7f033dSHerbert Xu unsigned int i; 1367da7f033dSHerbert Xu char result[COMP_BUF_SIZE]; 1368da7f033dSHerbert Xu int ret; 1369da7f033dSHerbert Xu 1370da7f033dSHerbert Xu for (i = 0; i < ctcount; i++) { 1371c79cf910SGeert Uytterhoeven int ilen; 1372c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 1373da7f033dSHerbert Xu 1374da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 1375da7f033dSHerbert Xu 1376da7f033dSHerbert Xu ilen = ctemplate[i].inlen; 1377da7f033dSHerbert Xu ret = crypto_comp_compress(tfm, ctemplate[i].input, 1378da7f033dSHerbert Xu ilen, result, &dlen); 1379da7f033dSHerbert Xu if (ret) { 1380da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: compression failed " 1381da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1382da7f033dSHerbert Xu -ret); 1383da7f033dSHerbert Xu goto out; 1384da7f033dSHerbert Xu } 1385da7f033dSHerbert Xu 1386b812eb00SGeert Uytterhoeven if (dlen != ctemplate[i].outlen) { 1387b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Compression test %d " 1388b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1389b812eb00SGeert Uytterhoeven dlen); 1390b812eb00SGeert Uytterhoeven ret = -EINVAL; 1391b812eb00SGeert Uytterhoeven goto out; 1392b812eb00SGeert Uytterhoeven } 1393b812eb00SGeert Uytterhoeven 1394da7f033dSHerbert Xu if (memcmp(result, ctemplate[i].output, dlen)) { 1395da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Compression test %d " 1396da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 1397da7f033dSHerbert Xu hexdump(result, dlen); 1398da7f033dSHerbert Xu ret = -EINVAL; 1399da7f033dSHerbert Xu goto out; 1400da7f033dSHerbert Xu } 1401da7f033dSHerbert Xu } 1402da7f033dSHerbert Xu 1403da7f033dSHerbert Xu for (i = 0; i < dtcount; i++) { 1404c79cf910SGeert Uytterhoeven int ilen; 1405c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 1406da7f033dSHerbert Xu 1407da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 1408da7f033dSHerbert Xu 1409da7f033dSHerbert Xu ilen = dtemplate[i].inlen; 1410da7f033dSHerbert Xu ret = crypto_comp_decompress(tfm, dtemplate[i].input, 1411da7f033dSHerbert Xu ilen, result, &dlen); 1412da7f033dSHerbert Xu if (ret) { 1413da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: decompression failed " 1414da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1415da7f033dSHerbert Xu -ret); 1416da7f033dSHerbert Xu goto out; 1417da7f033dSHerbert Xu } 1418da7f033dSHerbert Xu 1419b812eb00SGeert Uytterhoeven if (dlen != dtemplate[i].outlen) { 1420b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Decompression test %d " 1421b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1422b812eb00SGeert Uytterhoeven dlen); 1423b812eb00SGeert Uytterhoeven ret = -EINVAL; 1424b812eb00SGeert Uytterhoeven goto out; 1425b812eb00SGeert Uytterhoeven } 1426b812eb00SGeert Uytterhoeven 1427da7f033dSHerbert Xu if (memcmp(result, dtemplate[i].output, dlen)) { 1428da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Decompression test %d " 1429da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 1430da7f033dSHerbert Xu hexdump(result, dlen); 1431da7f033dSHerbert Xu ret = -EINVAL; 1432da7f033dSHerbert Xu goto out; 1433da7f033dSHerbert Xu } 1434da7f033dSHerbert Xu } 1435da7f033dSHerbert Xu 1436da7f033dSHerbert Xu ret = 0; 1437da7f033dSHerbert Xu 1438da7f033dSHerbert Xu out: 1439da7f033dSHerbert Xu return ret; 1440da7f033dSHerbert Xu } 1441da7f033dSHerbert Xu 14427647d6ceSJarod Wilson static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template, 14437647d6ceSJarod Wilson unsigned int tcount) 14447647d6ceSJarod Wilson { 14457647d6ceSJarod Wilson const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm)); 1446fa4ef8a6SFelipe Contreras int err = 0, i, j, seedsize; 14477647d6ceSJarod Wilson u8 *seed; 14487647d6ceSJarod Wilson char result[32]; 14497647d6ceSJarod Wilson 14507647d6ceSJarod Wilson seedsize = crypto_rng_seedsize(tfm); 14517647d6ceSJarod Wilson 14527647d6ceSJarod Wilson seed = kmalloc(seedsize, GFP_KERNEL); 14537647d6ceSJarod Wilson if (!seed) { 14547647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to allocate seed space " 14557647d6ceSJarod Wilson "for %s\n", algo); 14567647d6ceSJarod Wilson return -ENOMEM; 14577647d6ceSJarod Wilson } 14587647d6ceSJarod Wilson 14597647d6ceSJarod Wilson for (i = 0; i < tcount; i++) { 14607647d6ceSJarod Wilson memset(result, 0, 32); 14617647d6ceSJarod Wilson 14627647d6ceSJarod Wilson memcpy(seed, template[i].v, template[i].vlen); 14637647d6ceSJarod Wilson memcpy(seed + template[i].vlen, template[i].key, 14647647d6ceSJarod Wilson template[i].klen); 14657647d6ceSJarod Wilson memcpy(seed + template[i].vlen + template[i].klen, 14667647d6ceSJarod Wilson template[i].dt, template[i].dtlen); 14677647d6ceSJarod Wilson 14687647d6ceSJarod Wilson err = crypto_rng_reset(tfm, seed, seedsize); 14697647d6ceSJarod Wilson if (err) { 14707647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to reset rng " 14717647d6ceSJarod Wilson "for %s\n", algo); 14727647d6ceSJarod Wilson goto out; 14737647d6ceSJarod Wilson } 14747647d6ceSJarod Wilson 14757647d6ceSJarod Wilson for (j = 0; j < template[i].loops; j++) { 14767647d6ceSJarod Wilson err = crypto_rng_get_bytes(tfm, result, 14777647d6ceSJarod Wilson template[i].rlen); 147819e60e13SStephan Mueller if (err < 0) { 14797647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to obtain " 14807647d6ceSJarod Wilson "the correct amount of random data for " 148119e60e13SStephan Mueller "%s (requested %d)\n", algo, 148219e60e13SStephan Mueller template[i].rlen); 14837647d6ceSJarod Wilson goto out; 14847647d6ceSJarod Wilson } 14857647d6ceSJarod Wilson } 14867647d6ceSJarod Wilson 14877647d6ceSJarod Wilson err = memcmp(result, template[i].result, 14887647d6ceSJarod Wilson template[i].rlen); 14897647d6ceSJarod Wilson if (err) { 14907647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Test %d failed for %s\n", 14917647d6ceSJarod Wilson i, algo); 14927647d6ceSJarod Wilson hexdump(result, template[i].rlen); 14937647d6ceSJarod Wilson err = -EINVAL; 14947647d6ceSJarod Wilson goto out; 14957647d6ceSJarod Wilson } 14967647d6ceSJarod Wilson } 14977647d6ceSJarod Wilson 14987647d6ceSJarod Wilson out: 14997647d6ceSJarod Wilson kfree(seed); 15007647d6ceSJarod Wilson return err; 15017647d6ceSJarod Wilson } 15027647d6ceSJarod Wilson 1503da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver, 1504da7f033dSHerbert Xu u32 type, u32 mask) 1505da7f033dSHerbert Xu { 1506da7f033dSHerbert Xu struct crypto_aead *tfm; 1507da7f033dSHerbert Xu int err = 0; 1508da7f033dSHerbert Xu 1509425a8829SStephan Mueller tfm = crypto_alloc_aead(driver, type | CRYPTO_ALG_INTERNAL, mask); 1510da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1511da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to load transform for %s: " 1512da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1513da7f033dSHerbert Xu return PTR_ERR(tfm); 1514da7f033dSHerbert Xu } 1515da7f033dSHerbert Xu 1516da7f033dSHerbert Xu if (desc->suite.aead.enc.vecs) { 1517da7f033dSHerbert Xu err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs, 1518da7f033dSHerbert Xu desc->suite.aead.enc.count); 1519da7f033dSHerbert Xu if (err) 1520da7f033dSHerbert Xu goto out; 1521da7f033dSHerbert Xu } 1522da7f033dSHerbert Xu 1523da7f033dSHerbert Xu if (!err && desc->suite.aead.dec.vecs) 1524da7f033dSHerbert Xu err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs, 1525da7f033dSHerbert Xu desc->suite.aead.dec.count); 1526da7f033dSHerbert Xu 1527da7f033dSHerbert Xu out: 1528da7f033dSHerbert Xu crypto_free_aead(tfm); 1529da7f033dSHerbert Xu return err; 1530da7f033dSHerbert Xu } 1531da7f033dSHerbert Xu 1532da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc, 1533da7f033dSHerbert Xu const char *driver, u32 type, u32 mask) 1534da7f033dSHerbert Xu { 15351aa4ecd9SHerbert Xu struct crypto_cipher *tfm; 1536da7f033dSHerbert Xu int err = 0; 1537da7f033dSHerbert Xu 1538425a8829SStephan Mueller tfm = crypto_alloc_cipher(driver, type | CRYPTO_ALG_INTERNAL, mask); 1539da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1540da7f033dSHerbert Xu printk(KERN_ERR "alg: cipher: Failed to load transform for " 1541da7f033dSHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 1542da7f033dSHerbert Xu return PTR_ERR(tfm); 1543da7f033dSHerbert Xu } 1544da7f033dSHerbert Xu 1545da7f033dSHerbert Xu if (desc->suite.cipher.enc.vecs) { 1546da7f033dSHerbert Xu err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 1547da7f033dSHerbert Xu desc->suite.cipher.enc.count); 1548da7f033dSHerbert Xu if (err) 1549da7f033dSHerbert Xu goto out; 1550da7f033dSHerbert Xu } 1551da7f033dSHerbert Xu 1552da7f033dSHerbert Xu if (desc->suite.cipher.dec.vecs) 1553da7f033dSHerbert Xu err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 1554da7f033dSHerbert Xu desc->suite.cipher.dec.count); 1555da7f033dSHerbert Xu 1556da7f033dSHerbert Xu out: 15571aa4ecd9SHerbert Xu crypto_free_cipher(tfm); 15581aa4ecd9SHerbert Xu return err; 15591aa4ecd9SHerbert Xu } 15601aa4ecd9SHerbert Xu 15611aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc, 15621aa4ecd9SHerbert Xu const char *driver, u32 type, u32 mask) 15631aa4ecd9SHerbert Xu { 156412773d93SHerbert Xu struct crypto_skcipher *tfm; 15651aa4ecd9SHerbert Xu int err = 0; 15661aa4ecd9SHerbert Xu 156712773d93SHerbert Xu tfm = crypto_alloc_skcipher(driver, type | CRYPTO_ALG_INTERNAL, mask); 15681aa4ecd9SHerbert Xu if (IS_ERR(tfm)) { 15691aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Failed to load transform for " 15701aa4ecd9SHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 15711aa4ecd9SHerbert Xu return PTR_ERR(tfm); 15721aa4ecd9SHerbert Xu } 15731aa4ecd9SHerbert Xu 15741aa4ecd9SHerbert Xu if (desc->suite.cipher.enc.vecs) { 15751aa4ecd9SHerbert Xu err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 15761aa4ecd9SHerbert Xu desc->suite.cipher.enc.count); 15771aa4ecd9SHerbert Xu if (err) 15781aa4ecd9SHerbert Xu goto out; 15791aa4ecd9SHerbert Xu } 15801aa4ecd9SHerbert Xu 15811aa4ecd9SHerbert Xu if (desc->suite.cipher.dec.vecs) 15821aa4ecd9SHerbert Xu err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 15831aa4ecd9SHerbert Xu desc->suite.cipher.dec.count); 15841aa4ecd9SHerbert Xu 15851aa4ecd9SHerbert Xu out: 158612773d93SHerbert Xu crypto_free_skcipher(tfm); 1587da7f033dSHerbert Xu return err; 1588da7f033dSHerbert Xu } 1589da7f033dSHerbert Xu 1590da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver, 1591da7f033dSHerbert Xu u32 type, u32 mask) 1592da7f033dSHerbert Xu { 1593da7f033dSHerbert Xu struct crypto_comp *tfm; 1594da7f033dSHerbert Xu int err; 1595da7f033dSHerbert Xu 1596da7f033dSHerbert Xu tfm = crypto_alloc_comp(driver, type, mask); 1597da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1598da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Failed to load transform for %s: " 1599da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1600da7f033dSHerbert Xu return PTR_ERR(tfm); 1601da7f033dSHerbert Xu } 1602da7f033dSHerbert Xu 1603da7f033dSHerbert Xu err = test_comp(tfm, desc->suite.comp.comp.vecs, 1604da7f033dSHerbert Xu desc->suite.comp.decomp.vecs, 1605da7f033dSHerbert Xu desc->suite.comp.comp.count, 1606da7f033dSHerbert Xu desc->suite.comp.decomp.count); 1607da7f033dSHerbert Xu 1608da7f033dSHerbert Xu crypto_free_comp(tfm); 1609da7f033dSHerbert Xu return err; 1610da7f033dSHerbert Xu } 1611da7f033dSHerbert Xu 1612da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver, 1613da7f033dSHerbert Xu u32 type, u32 mask) 1614da7f033dSHerbert Xu { 1615da7f033dSHerbert Xu struct crypto_ahash *tfm; 1616da7f033dSHerbert Xu int err; 1617da7f033dSHerbert Xu 1618425a8829SStephan Mueller tfm = crypto_alloc_ahash(driver, type | CRYPTO_ALG_INTERNAL, mask); 1619da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1620da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to load transform for %s: " 1621da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1622da7f033dSHerbert Xu return PTR_ERR(tfm); 1623da7f033dSHerbert Xu } 1624da7f033dSHerbert Xu 1625a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1626a8f1a052SDavid S. Miller desc->suite.hash.count, true); 1627a8f1a052SDavid S. Miller if (!err) 1628a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1629a8f1a052SDavid S. Miller desc->suite.hash.count, false); 1630da7f033dSHerbert Xu 1631da7f033dSHerbert Xu crypto_free_ahash(tfm); 1632da7f033dSHerbert Xu return err; 1633da7f033dSHerbert Xu } 1634da7f033dSHerbert Xu 16358e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc, 16368e3ee85eSHerbert Xu const char *driver, u32 type, u32 mask) 16378e3ee85eSHerbert Xu { 16388e3ee85eSHerbert Xu struct crypto_shash *tfm; 16398e3ee85eSHerbert Xu u32 val; 16408e3ee85eSHerbert Xu int err; 16418e3ee85eSHerbert Xu 16428e3ee85eSHerbert Xu err = alg_test_hash(desc, driver, type, mask); 16438e3ee85eSHerbert Xu if (err) 16448e3ee85eSHerbert Xu goto out; 16458e3ee85eSHerbert Xu 1646425a8829SStephan Mueller tfm = crypto_alloc_shash(driver, type | CRYPTO_ALG_INTERNAL, mask); 16478e3ee85eSHerbert Xu if (IS_ERR(tfm)) { 16488e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: " 16498e3ee85eSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 16508e3ee85eSHerbert Xu err = PTR_ERR(tfm); 16518e3ee85eSHerbert Xu goto out; 16528e3ee85eSHerbert Xu } 16538e3ee85eSHerbert Xu 16548e3ee85eSHerbert Xu do { 16554c5c3024SJan-Simon Möller SHASH_DESC_ON_STACK(shash, tfm); 16564c5c3024SJan-Simon Möller u32 *ctx = (u32 *)shash_desc_ctx(shash); 16578e3ee85eSHerbert Xu 16584c5c3024SJan-Simon Möller shash->tfm = tfm; 16594c5c3024SJan-Simon Möller shash->flags = 0; 16608e3ee85eSHerbert Xu 16614c5c3024SJan-Simon Möller *ctx = le32_to_cpu(420553207); 16624c5c3024SJan-Simon Möller err = crypto_shash_final(shash, (u8 *)&val); 16638e3ee85eSHerbert Xu if (err) { 16648e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Operation failed for " 16658e3ee85eSHerbert Xu "%s: %d\n", driver, err); 16668e3ee85eSHerbert Xu break; 16678e3ee85eSHerbert Xu } 16688e3ee85eSHerbert Xu 16698e3ee85eSHerbert Xu if (val != ~420553207) { 16708e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Test failed for %s: " 16718e3ee85eSHerbert Xu "%d\n", driver, val); 16728e3ee85eSHerbert Xu err = -EINVAL; 16738e3ee85eSHerbert Xu } 16748e3ee85eSHerbert Xu } while (0); 16758e3ee85eSHerbert Xu 16768e3ee85eSHerbert Xu crypto_free_shash(tfm); 16778e3ee85eSHerbert Xu 16788e3ee85eSHerbert Xu out: 16798e3ee85eSHerbert Xu return err; 16808e3ee85eSHerbert Xu } 16818e3ee85eSHerbert Xu 16827647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver, 16837647d6ceSJarod Wilson u32 type, u32 mask) 16847647d6ceSJarod Wilson { 16857647d6ceSJarod Wilson struct crypto_rng *rng; 16867647d6ceSJarod Wilson int err; 16877647d6ceSJarod Wilson 1688425a8829SStephan Mueller rng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask); 16897647d6ceSJarod Wilson if (IS_ERR(rng)) { 16907647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to load transform for %s: " 16917647d6ceSJarod Wilson "%ld\n", driver, PTR_ERR(rng)); 16927647d6ceSJarod Wilson return PTR_ERR(rng); 16937647d6ceSJarod Wilson } 16947647d6ceSJarod Wilson 16957647d6ceSJarod Wilson err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count); 16967647d6ceSJarod Wilson 16977647d6ceSJarod Wilson crypto_free_rng(rng); 16987647d6ceSJarod Wilson 16997647d6ceSJarod Wilson return err; 17007647d6ceSJarod Wilson } 17017647d6ceSJarod Wilson 170264d1cdfbSStephan Mueller 170364d1cdfbSStephan Mueller static int drbg_cavs_test(struct drbg_testvec *test, int pr, 170464d1cdfbSStephan Mueller const char *driver, u32 type, u32 mask) 170564d1cdfbSStephan Mueller { 170664d1cdfbSStephan Mueller int ret = -EAGAIN; 170764d1cdfbSStephan Mueller struct crypto_rng *drng; 170864d1cdfbSStephan Mueller struct drbg_test_data test_data; 170964d1cdfbSStephan Mueller struct drbg_string addtl, pers, testentropy; 171064d1cdfbSStephan Mueller unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL); 171164d1cdfbSStephan Mueller 171264d1cdfbSStephan Mueller if (!buf) 171364d1cdfbSStephan Mueller return -ENOMEM; 171464d1cdfbSStephan Mueller 1715425a8829SStephan Mueller drng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask); 171664d1cdfbSStephan Mueller if (IS_ERR(drng)) { 171764d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for " 171864d1cdfbSStephan Mueller "%s\n", driver); 171964d1cdfbSStephan Mueller kzfree(buf); 172064d1cdfbSStephan Mueller return -ENOMEM; 172164d1cdfbSStephan Mueller } 172264d1cdfbSStephan Mueller 172364d1cdfbSStephan Mueller test_data.testentropy = &testentropy; 172464d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entropy, test->entropylen); 172564d1cdfbSStephan Mueller drbg_string_fill(&pers, test->pers, test->perslen); 172664d1cdfbSStephan Mueller ret = crypto_drbg_reset_test(drng, &pers, &test_data); 172764d1cdfbSStephan Mueller if (ret) { 172864d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: Failed to reset rng\n"); 172964d1cdfbSStephan Mueller goto outbuf; 173064d1cdfbSStephan Mueller } 173164d1cdfbSStephan Mueller 173264d1cdfbSStephan Mueller drbg_string_fill(&addtl, test->addtla, test->addtllen); 173364d1cdfbSStephan Mueller if (pr) { 173464d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entpra, test->entprlen); 173564d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl_test(drng, 173664d1cdfbSStephan Mueller buf, test->expectedlen, &addtl, &test_data); 173764d1cdfbSStephan Mueller } else { 173864d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl(drng, 173964d1cdfbSStephan Mueller buf, test->expectedlen, &addtl); 174064d1cdfbSStephan Mueller } 174119e60e13SStephan Mueller if (ret < 0) { 174264d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not obtain random data for " 174364d1cdfbSStephan Mueller "driver %s\n", driver); 174464d1cdfbSStephan Mueller goto outbuf; 174564d1cdfbSStephan Mueller } 174664d1cdfbSStephan Mueller 174764d1cdfbSStephan Mueller drbg_string_fill(&addtl, test->addtlb, test->addtllen); 174864d1cdfbSStephan Mueller if (pr) { 174964d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entprb, test->entprlen); 175064d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl_test(drng, 175164d1cdfbSStephan Mueller buf, test->expectedlen, &addtl, &test_data); 175264d1cdfbSStephan Mueller } else { 175364d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl(drng, 175464d1cdfbSStephan Mueller buf, test->expectedlen, &addtl); 175564d1cdfbSStephan Mueller } 175619e60e13SStephan Mueller if (ret < 0) { 175764d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not obtain random data for " 175864d1cdfbSStephan Mueller "driver %s\n", driver); 175964d1cdfbSStephan Mueller goto outbuf; 176064d1cdfbSStephan Mueller } 176164d1cdfbSStephan Mueller 176264d1cdfbSStephan Mueller ret = memcmp(test->expected, buf, test->expectedlen); 176364d1cdfbSStephan Mueller 176464d1cdfbSStephan Mueller outbuf: 176564d1cdfbSStephan Mueller crypto_free_rng(drng); 176664d1cdfbSStephan Mueller kzfree(buf); 176764d1cdfbSStephan Mueller return ret; 176864d1cdfbSStephan Mueller } 176964d1cdfbSStephan Mueller 177064d1cdfbSStephan Mueller 177164d1cdfbSStephan Mueller static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver, 177264d1cdfbSStephan Mueller u32 type, u32 mask) 177364d1cdfbSStephan Mueller { 177464d1cdfbSStephan Mueller int err = 0; 177564d1cdfbSStephan Mueller int pr = 0; 177664d1cdfbSStephan Mueller int i = 0; 177764d1cdfbSStephan Mueller struct drbg_testvec *template = desc->suite.drbg.vecs; 177864d1cdfbSStephan Mueller unsigned int tcount = desc->suite.drbg.count; 177964d1cdfbSStephan Mueller 178064d1cdfbSStephan Mueller if (0 == memcmp(driver, "drbg_pr_", 8)) 178164d1cdfbSStephan Mueller pr = 1; 178264d1cdfbSStephan Mueller 178364d1cdfbSStephan Mueller for (i = 0; i < tcount; i++) { 178464d1cdfbSStephan Mueller err = drbg_cavs_test(&template[i], pr, driver, type, mask); 178564d1cdfbSStephan Mueller if (err) { 178664d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: Test %d failed for %s\n", 178764d1cdfbSStephan Mueller i, driver); 178864d1cdfbSStephan Mueller err = -EINVAL; 178964d1cdfbSStephan Mueller break; 179064d1cdfbSStephan Mueller } 179164d1cdfbSStephan Mueller } 179264d1cdfbSStephan Mueller return err; 179364d1cdfbSStephan Mueller 179464d1cdfbSStephan Mueller } 179564d1cdfbSStephan Mueller 1796802c7f1cSSalvatore Benedetto static int do_test_kpp(struct crypto_kpp *tfm, struct kpp_testvec *vec, 1797802c7f1cSSalvatore Benedetto const char *alg) 1798802c7f1cSSalvatore Benedetto { 1799802c7f1cSSalvatore Benedetto struct kpp_request *req; 1800802c7f1cSSalvatore Benedetto void *input_buf = NULL; 1801802c7f1cSSalvatore Benedetto void *output_buf = NULL; 1802802c7f1cSSalvatore Benedetto struct tcrypt_result result; 1803802c7f1cSSalvatore Benedetto unsigned int out_len_max; 1804802c7f1cSSalvatore Benedetto int err = -ENOMEM; 1805802c7f1cSSalvatore Benedetto struct scatterlist src, dst; 1806802c7f1cSSalvatore Benedetto 1807802c7f1cSSalvatore Benedetto req = kpp_request_alloc(tfm, GFP_KERNEL); 1808802c7f1cSSalvatore Benedetto if (!req) 1809802c7f1cSSalvatore Benedetto return err; 1810802c7f1cSSalvatore Benedetto 1811802c7f1cSSalvatore Benedetto init_completion(&result.completion); 1812802c7f1cSSalvatore Benedetto 1813802c7f1cSSalvatore Benedetto err = crypto_kpp_set_secret(tfm, vec->secret, vec->secret_size); 1814802c7f1cSSalvatore Benedetto if (err < 0) 1815802c7f1cSSalvatore Benedetto goto free_req; 1816802c7f1cSSalvatore Benedetto 1817802c7f1cSSalvatore Benedetto out_len_max = crypto_kpp_maxsize(tfm); 1818802c7f1cSSalvatore Benedetto output_buf = kzalloc(out_len_max, GFP_KERNEL); 1819802c7f1cSSalvatore Benedetto if (!output_buf) { 1820802c7f1cSSalvatore Benedetto err = -ENOMEM; 1821802c7f1cSSalvatore Benedetto goto free_req; 1822802c7f1cSSalvatore Benedetto } 1823802c7f1cSSalvatore Benedetto 1824802c7f1cSSalvatore Benedetto /* Use appropriate parameter as base */ 1825802c7f1cSSalvatore Benedetto kpp_request_set_input(req, NULL, 0); 1826802c7f1cSSalvatore Benedetto sg_init_one(&dst, output_buf, out_len_max); 1827802c7f1cSSalvatore Benedetto kpp_request_set_output(req, &dst, out_len_max); 1828802c7f1cSSalvatore Benedetto kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 1829802c7f1cSSalvatore Benedetto tcrypt_complete, &result); 1830802c7f1cSSalvatore Benedetto 1831802c7f1cSSalvatore Benedetto /* Compute public key */ 1832802c7f1cSSalvatore Benedetto err = wait_async_op(&result, crypto_kpp_generate_public_key(req)); 1833802c7f1cSSalvatore Benedetto if (err) { 1834802c7f1cSSalvatore Benedetto pr_err("alg: %s: generate public key test failed. err %d\n", 1835802c7f1cSSalvatore Benedetto alg, err); 1836802c7f1cSSalvatore Benedetto goto free_output; 1837802c7f1cSSalvatore Benedetto } 1838802c7f1cSSalvatore Benedetto /* Verify calculated public key */ 1839802c7f1cSSalvatore Benedetto if (memcmp(vec->expected_a_public, sg_virt(req->dst), 1840802c7f1cSSalvatore Benedetto vec->expected_a_public_size)) { 1841802c7f1cSSalvatore Benedetto pr_err("alg: %s: generate public key test failed. Invalid output\n", 1842802c7f1cSSalvatore Benedetto alg); 1843802c7f1cSSalvatore Benedetto err = -EINVAL; 1844802c7f1cSSalvatore Benedetto goto free_output; 1845802c7f1cSSalvatore Benedetto } 1846802c7f1cSSalvatore Benedetto 1847802c7f1cSSalvatore Benedetto /* Calculate shared secret key by using counter part (b) public key. */ 1848802c7f1cSSalvatore Benedetto input_buf = kzalloc(vec->b_public_size, GFP_KERNEL); 1849802c7f1cSSalvatore Benedetto if (!input_buf) { 1850802c7f1cSSalvatore Benedetto err = -ENOMEM; 1851802c7f1cSSalvatore Benedetto goto free_output; 1852802c7f1cSSalvatore Benedetto } 1853802c7f1cSSalvatore Benedetto 1854802c7f1cSSalvatore Benedetto memcpy(input_buf, vec->b_public, vec->b_public_size); 1855802c7f1cSSalvatore Benedetto sg_init_one(&src, input_buf, vec->b_public_size); 1856802c7f1cSSalvatore Benedetto sg_init_one(&dst, output_buf, out_len_max); 1857802c7f1cSSalvatore Benedetto kpp_request_set_input(req, &src, vec->b_public_size); 1858802c7f1cSSalvatore Benedetto kpp_request_set_output(req, &dst, out_len_max); 1859802c7f1cSSalvatore Benedetto kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 1860802c7f1cSSalvatore Benedetto tcrypt_complete, &result); 1861802c7f1cSSalvatore Benedetto err = wait_async_op(&result, crypto_kpp_compute_shared_secret(req)); 1862802c7f1cSSalvatore Benedetto if (err) { 1863802c7f1cSSalvatore Benedetto pr_err("alg: %s: compute shard secret test failed. err %d\n", 1864802c7f1cSSalvatore Benedetto alg, err); 1865802c7f1cSSalvatore Benedetto goto free_all; 1866802c7f1cSSalvatore Benedetto } 1867802c7f1cSSalvatore Benedetto /* 1868802c7f1cSSalvatore Benedetto * verify shared secret from which the user will derive 1869802c7f1cSSalvatore Benedetto * secret key by executing whatever hash it has chosen 1870802c7f1cSSalvatore Benedetto */ 1871802c7f1cSSalvatore Benedetto if (memcmp(vec->expected_ss, sg_virt(req->dst), 1872802c7f1cSSalvatore Benedetto vec->expected_ss_size)) { 1873802c7f1cSSalvatore Benedetto pr_err("alg: %s: compute shared secret test failed. Invalid output\n", 1874802c7f1cSSalvatore Benedetto alg); 1875802c7f1cSSalvatore Benedetto err = -EINVAL; 1876802c7f1cSSalvatore Benedetto } 1877802c7f1cSSalvatore Benedetto 1878802c7f1cSSalvatore Benedetto free_all: 1879802c7f1cSSalvatore Benedetto kfree(input_buf); 1880802c7f1cSSalvatore Benedetto free_output: 1881802c7f1cSSalvatore Benedetto kfree(output_buf); 1882802c7f1cSSalvatore Benedetto free_req: 1883802c7f1cSSalvatore Benedetto kpp_request_free(req); 1884802c7f1cSSalvatore Benedetto return err; 1885802c7f1cSSalvatore Benedetto } 1886802c7f1cSSalvatore Benedetto 1887802c7f1cSSalvatore Benedetto static int test_kpp(struct crypto_kpp *tfm, const char *alg, 1888802c7f1cSSalvatore Benedetto struct kpp_testvec *vecs, unsigned int tcount) 1889802c7f1cSSalvatore Benedetto { 1890802c7f1cSSalvatore Benedetto int ret, i; 1891802c7f1cSSalvatore Benedetto 1892802c7f1cSSalvatore Benedetto for (i = 0; i < tcount; i++) { 1893802c7f1cSSalvatore Benedetto ret = do_test_kpp(tfm, vecs++, alg); 1894802c7f1cSSalvatore Benedetto if (ret) { 1895802c7f1cSSalvatore Benedetto pr_err("alg: %s: test failed on vector %d, err=%d\n", 1896802c7f1cSSalvatore Benedetto alg, i + 1, ret); 1897802c7f1cSSalvatore Benedetto return ret; 1898802c7f1cSSalvatore Benedetto } 1899802c7f1cSSalvatore Benedetto } 1900802c7f1cSSalvatore Benedetto return 0; 1901802c7f1cSSalvatore Benedetto } 1902802c7f1cSSalvatore Benedetto 1903802c7f1cSSalvatore Benedetto static int alg_test_kpp(const struct alg_test_desc *desc, const char *driver, 1904802c7f1cSSalvatore Benedetto u32 type, u32 mask) 1905802c7f1cSSalvatore Benedetto { 1906802c7f1cSSalvatore Benedetto struct crypto_kpp *tfm; 1907802c7f1cSSalvatore Benedetto int err = 0; 1908802c7f1cSSalvatore Benedetto 1909802c7f1cSSalvatore Benedetto tfm = crypto_alloc_kpp(driver, type | CRYPTO_ALG_INTERNAL, mask); 1910802c7f1cSSalvatore Benedetto if (IS_ERR(tfm)) { 1911802c7f1cSSalvatore Benedetto pr_err("alg: kpp: Failed to load tfm for %s: %ld\n", 1912802c7f1cSSalvatore Benedetto driver, PTR_ERR(tfm)); 1913802c7f1cSSalvatore Benedetto return PTR_ERR(tfm); 1914802c7f1cSSalvatore Benedetto } 1915802c7f1cSSalvatore Benedetto if (desc->suite.kpp.vecs) 1916802c7f1cSSalvatore Benedetto err = test_kpp(tfm, desc->alg, desc->suite.kpp.vecs, 1917802c7f1cSSalvatore Benedetto desc->suite.kpp.count); 1918802c7f1cSSalvatore Benedetto 1919802c7f1cSSalvatore Benedetto crypto_free_kpp(tfm); 1920802c7f1cSSalvatore Benedetto return err; 1921802c7f1cSSalvatore Benedetto } 1922802c7f1cSSalvatore Benedetto 192350d2b643SHerbert Xu static int test_akcipher_one(struct crypto_akcipher *tfm, 1924946cc463STadeusz Struk struct akcipher_testvec *vecs) 1925946cc463STadeusz Struk { 1926df27b26fSHerbert Xu char *xbuf[XBUFSIZE]; 1927946cc463STadeusz Struk struct akcipher_request *req; 1928946cc463STadeusz Struk void *outbuf_enc = NULL; 1929946cc463STadeusz Struk void *outbuf_dec = NULL; 1930946cc463STadeusz Struk struct tcrypt_result result; 1931946cc463STadeusz Struk unsigned int out_len_max, out_len = 0; 1932946cc463STadeusz Struk int err = -ENOMEM; 193322287b0bSTadeusz Struk struct scatterlist src, dst, src_tab[2]; 1934946cc463STadeusz Struk 1935df27b26fSHerbert Xu if (testmgr_alloc_buf(xbuf)) 1936df27b26fSHerbert Xu return err; 1937df27b26fSHerbert Xu 1938946cc463STadeusz Struk req = akcipher_request_alloc(tfm, GFP_KERNEL); 1939946cc463STadeusz Struk if (!req) 1940df27b26fSHerbert Xu goto free_xbuf; 1941946cc463STadeusz Struk 1942946cc463STadeusz Struk init_completion(&result.completion); 194322287b0bSTadeusz Struk 194422287b0bSTadeusz Struk if (vecs->public_key_vec) 194522287b0bSTadeusz Struk err = crypto_akcipher_set_pub_key(tfm, vecs->key, 194622287b0bSTadeusz Struk vecs->key_len); 194722287b0bSTadeusz Struk else 194822287b0bSTadeusz Struk err = crypto_akcipher_set_priv_key(tfm, vecs->key, 194922287b0bSTadeusz Struk vecs->key_len); 1950946cc463STadeusz Struk if (err) 1951946cc463STadeusz Struk goto free_req; 1952946cc463STadeusz Struk 195357763f5eSSalvatore Benedetto err = -ENOMEM; 195422287b0bSTadeusz Struk out_len_max = crypto_akcipher_maxsize(tfm); 1955946cc463STadeusz Struk outbuf_enc = kzalloc(out_len_max, GFP_KERNEL); 1956946cc463STadeusz Struk if (!outbuf_enc) 1957946cc463STadeusz Struk goto free_req; 1958946cc463STadeusz Struk 1959df27b26fSHerbert Xu if (WARN_ON(vecs->m_size > PAGE_SIZE)) 1960df27b26fSHerbert Xu goto free_all; 1961df27b26fSHerbert Xu 1962df27b26fSHerbert Xu memcpy(xbuf[0], vecs->m, vecs->m_size); 1963df27b26fSHerbert Xu 196422287b0bSTadeusz Struk sg_init_table(src_tab, 2); 1965df27b26fSHerbert Xu sg_set_buf(&src_tab[0], xbuf[0], 8); 1966df27b26fSHerbert Xu sg_set_buf(&src_tab[1], xbuf[0] + 8, vecs->m_size - 8); 196722287b0bSTadeusz Struk sg_init_one(&dst, outbuf_enc, out_len_max); 196822287b0bSTadeusz Struk akcipher_request_set_crypt(req, src_tab, &dst, vecs->m_size, 196922287b0bSTadeusz Struk out_len_max); 1970946cc463STadeusz Struk akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 1971946cc463STadeusz Struk tcrypt_complete, &result); 1972946cc463STadeusz Struk 1973946cc463STadeusz Struk /* Run RSA encrypt - c = m^e mod n;*/ 1974946cc463STadeusz Struk err = wait_async_op(&result, crypto_akcipher_encrypt(req)); 1975946cc463STadeusz Struk if (err) { 197650d2b643SHerbert Xu pr_err("alg: akcipher: encrypt test failed. err %d\n", err); 1977946cc463STadeusz Struk goto free_all; 1978946cc463STadeusz Struk } 197922287b0bSTadeusz Struk if (req->dst_len != vecs->c_size) { 198050d2b643SHerbert Xu pr_err("alg: akcipher: encrypt test failed. Invalid output len\n"); 1981946cc463STadeusz Struk err = -EINVAL; 1982946cc463STadeusz Struk goto free_all; 1983946cc463STadeusz Struk } 1984946cc463STadeusz Struk /* verify that encrypted message is equal to expected */ 1985df27b26fSHerbert Xu if (memcmp(vecs->c, outbuf_enc, vecs->c_size)) { 198650d2b643SHerbert Xu pr_err("alg: akcipher: encrypt test failed. Invalid output\n"); 198750d2b643SHerbert Xu hexdump(outbuf_enc, vecs->c_size); 1988946cc463STadeusz Struk err = -EINVAL; 1989946cc463STadeusz Struk goto free_all; 1990946cc463STadeusz Struk } 1991946cc463STadeusz Struk /* Don't invoke decrypt for vectors with public key */ 1992946cc463STadeusz Struk if (vecs->public_key_vec) { 1993946cc463STadeusz Struk err = 0; 1994946cc463STadeusz Struk goto free_all; 1995946cc463STadeusz Struk } 1996946cc463STadeusz Struk outbuf_dec = kzalloc(out_len_max, GFP_KERNEL); 1997946cc463STadeusz Struk if (!outbuf_dec) { 1998946cc463STadeusz Struk err = -ENOMEM; 1999946cc463STadeusz Struk goto free_all; 2000946cc463STadeusz Struk } 2001df27b26fSHerbert Xu 2002df27b26fSHerbert Xu if (WARN_ON(vecs->c_size > PAGE_SIZE)) 2003df27b26fSHerbert Xu goto free_all; 2004df27b26fSHerbert Xu 2005df27b26fSHerbert Xu memcpy(xbuf[0], vecs->c, vecs->c_size); 2006df27b26fSHerbert Xu 2007df27b26fSHerbert Xu sg_init_one(&src, xbuf[0], vecs->c_size); 200822287b0bSTadeusz Struk sg_init_one(&dst, outbuf_dec, out_len_max); 2009946cc463STadeusz Struk init_completion(&result.completion); 201022287b0bSTadeusz Struk akcipher_request_set_crypt(req, &src, &dst, vecs->c_size, out_len_max); 2011946cc463STadeusz Struk 2012946cc463STadeusz Struk /* Run RSA decrypt - m = c^d mod n;*/ 2013946cc463STadeusz Struk err = wait_async_op(&result, crypto_akcipher_decrypt(req)); 2014946cc463STadeusz Struk if (err) { 201550d2b643SHerbert Xu pr_err("alg: akcipher: decrypt test failed. err %d\n", err); 2016946cc463STadeusz Struk goto free_all; 2017946cc463STadeusz Struk } 2018946cc463STadeusz Struk out_len = req->dst_len; 201950d2b643SHerbert Xu if (out_len < vecs->m_size) { 202050d2b643SHerbert Xu pr_err("alg: akcipher: decrypt test failed. " 202150d2b643SHerbert Xu "Invalid output len %u\n", out_len); 2022946cc463STadeusz Struk err = -EINVAL; 2023946cc463STadeusz Struk goto free_all; 2024946cc463STadeusz Struk } 2025946cc463STadeusz Struk /* verify that decrypted message is equal to the original msg */ 202650d2b643SHerbert Xu if (memchr_inv(outbuf_dec, 0, out_len - vecs->m_size) || 202750d2b643SHerbert Xu memcmp(vecs->m, outbuf_dec + out_len - vecs->m_size, 202850d2b643SHerbert Xu vecs->m_size)) { 202950d2b643SHerbert Xu pr_err("alg: akcipher: decrypt test failed. Invalid output\n"); 203050d2b643SHerbert Xu hexdump(outbuf_dec, out_len); 2031946cc463STadeusz Struk err = -EINVAL; 2032946cc463STadeusz Struk } 2033946cc463STadeusz Struk free_all: 2034946cc463STadeusz Struk kfree(outbuf_dec); 2035946cc463STadeusz Struk kfree(outbuf_enc); 2036946cc463STadeusz Struk free_req: 2037946cc463STadeusz Struk akcipher_request_free(req); 2038df27b26fSHerbert Xu free_xbuf: 2039df27b26fSHerbert Xu testmgr_free_buf(xbuf); 2040946cc463STadeusz Struk return err; 2041946cc463STadeusz Struk } 2042946cc463STadeusz Struk 204350d2b643SHerbert Xu static int test_akcipher(struct crypto_akcipher *tfm, const char *alg, 204450d2b643SHerbert Xu struct akcipher_testvec *vecs, unsigned int tcount) 2045946cc463STadeusz Struk { 204615226e48SHerbert Xu const char *algo = 204715226e48SHerbert Xu crypto_tfm_alg_driver_name(crypto_akcipher_tfm(tfm)); 2048946cc463STadeusz Struk int ret, i; 2049946cc463STadeusz Struk 2050946cc463STadeusz Struk for (i = 0; i < tcount; i++) { 205150d2b643SHerbert Xu ret = test_akcipher_one(tfm, vecs++); 205250d2b643SHerbert Xu if (!ret) 205350d2b643SHerbert Xu continue; 205450d2b643SHerbert Xu 205515226e48SHerbert Xu pr_err("alg: akcipher: test %d failed for %s, err=%d\n", 205615226e48SHerbert Xu i + 1, algo, ret); 2057946cc463STadeusz Struk return ret; 2058946cc463STadeusz Struk } 2059946cc463STadeusz Struk return 0; 2060946cc463STadeusz Struk } 2061946cc463STadeusz Struk 2062946cc463STadeusz Struk static int alg_test_akcipher(const struct alg_test_desc *desc, 2063946cc463STadeusz Struk const char *driver, u32 type, u32 mask) 2064946cc463STadeusz Struk { 2065946cc463STadeusz Struk struct crypto_akcipher *tfm; 2066946cc463STadeusz Struk int err = 0; 2067946cc463STadeusz Struk 2068946cc463STadeusz Struk tfm = crypto_alloc_akcipher(driver, type | CRYPTO_ALG_INTERNAL, mask); 2069946cc463STadeusz Struk if (IS_ERR(tfm)) { 2070946cc463STadeusz Struk pr_err("alg: akcipher: Failed to load tfm for %s: %ld\n", 2071946cc463STadeusz Struk driver, PTR_ERR(tfm)); 2072946cc463STadeusz Struk return PTR_ERR(tfm); 2073946cc463STadeusz Struk } 2074946cc463STadeusz Struk if (desc->suite.akcipher.vecs) 2075946cc463STadeusz Struk err = test_akcipher(tfm, desc->alg, desc->suite.akcipher.vecs, 2076946cc463STadeusz Struk desc->suite.akcipher.count); 2077946cc463STadeusz Struk 2078946cc463STadeusz Struk crypto_free_akcipher(tfm); 2079946cc463STadeusz Struk return err; 2080946cc463STadeusz Struk } 2081946cc463STadeusz Struk 2082863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc, 2083863b557aSYouquan, Song const char *driver, u32 type, u32 mask) 2084863b557aSYouquan, Song { 2085863b557aSYouquan, Song return 0; 2086863b557aSYouquan, Song } 2087863b557aSYouquan, Song 2088da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */ 2089da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = { 2090da7f033dSHerbert Xu { 20914d6d6a2cSJohannes Goetzfried .alg = "__cbc-cast5-avx", 20924d6d6a2cSJohannes Goetzfried .test = alg_test_null, 20934d6d6a2cSJohannes Goetzfried }, { 20944ea1277dSJohannes Goetzfried .alg = "__cbc-cast6-avx", 20954ea1277dSJohannes Goetzfried .test = alg_test_null, 20964ea1277dSJohannes Goetzfried }, { 20977efe4076SJohannes Goetzfried .alg = "__cbc-serpent-avx", 20987efe4076SJohannes Goetzfried .test = alg_test_null, 20997efe4076SJohannes Goetzfried }, { 210056d76c96SJussi Kivilinna .alg = "__cbc-serpent-avx2", 210156d76c96SJussi Kivilinna .test = alg_test_null, 210256d76c96SJussi Kivilinna }, { 2103937c30d7SJussi Kivilinna .alg = "__cbc-serpent-sse2", 2104937c30d7SJussi Kivilinna .test = alg_test_null, 2105937c30d7SJussi Kivilinna }, { 2106107778b5SJohannes Goetzfried .alg = "__cbc-twofish-avx", 2107107778b5SJohannes Goetzfried .test = alg_test_null, 2108107778b5SJohannes Goetzfried }, { 2109863b557aSYouquan, Song .alg = "__driver-cbc-aes-aesni", 2110863b557aSYouquan, Song .test = alg_test_null, 21116c79294fSMilan Broz .fips_allowed = 1, 2112863b557aSYouquan, Song }, { 2113d9b1d2e7SJussi Kivilinna .alg = "__driver-cbc-camellia-aesni", 2114d9b1d2e7SJussi Kivilinna .test = alg_test_null, 2115d9b1d2e7SJussi Kivilinna }, { 2116f3f935a7SJussi Kivilinna .alg = "__driver-cbc-camellia-aesni-avx2", 2117f3f935a7SJussi Kivilinna .test = alg_test_null, 2118f3f935a7SJussi Kivilinna }, { 21194d6d6a2cSJohannes Goetzfried .alg = "__driver-cbc-cast5-avx", 21204d6d6a2cSJohannes Goetzfried .test = alg_test_null, 21214d6d6a2cSJohannes Goetzfried }, { 21224ea1277dSJohannes Goetzfried .alg = "__driver-cbc-cast6-avx", 21234ea1277dSJohannes Goetzfried .test = alg_test_null, 21244ea1277dSJohannes Goetzfried }, { 21257efe4076SJohannes Goetzfried .alg = "__driver-cbc-serpent-avx", 21267efe4076SJohannes Goetzfried .test = alg_test_null, 21277efe4076SJohannes Goetzfried }, { 212856d76c96SJussi Kivilinna .alg = "__driver-cbc-serpent-avx2", 212956d76c96SJussi Kivilinna .test = alg_test_null, 213056d76c96SJussi Kivilinna }, { 2131937c30d7SJussi Kivilinna .alg = "__driver-cbc-serpent-sse2", 2132937c30d7SJussi Kivilinna .test = alg_test_null, 2133937c30d7SJussi Kivilinna }, { 2134107778b5SJohannes Goetzfried .alg = "__driver-cbc-twofish-avx", 2135107778b5SJohannes Goetzfried .test = alg_test_null, 2136107778b5SJohannes Goetzfried }, { 2137863b557aSYouquan, Song .alg = "__driver-ecb-aes-aesni", 2138863b557aSYouquan, Song .test = alg_test_null, 21396c79294fSMilan Broz .fips_allowed = 1, 2140863b557aSYouquan, Song }, { 2141d9b1d2e7SJussi Kivilinna .alg = "__driver-ecb-camellia-aesni", 2142d9b1d2e7SJussi Kivilinna .test = alg_test_null, 2143d9b1d2e7SJussi Kivilinna }, { 2144f3f935a7SJussi Kivilinna .alg = "__driver-ecb-camellia-aesni-avx2", 2145f3f935a7SJussi Kivilinna .test = alg_test_null, 2146f3f935a7SJussi Kivilinna }, { 21474d6d6a2cSJohannes Goetzfried .alg = "__driver-ecb-cast5-avx", 21484d6d6a2cSJohannes Goetzfried .test = alg_test_null, 21494d6d6a2cSJohannes Goetzfried }, { 21504ea1277dSJohannes Goetzfried .alg = "__driver-ecb-cast6-avx", 21514ea1277dSJohannes Goetzfried .test = alg_test_null, 21524ea1277dSJohannes Goetzfried }, { 21537efe4076SJohannes Goetzfried .alg = "__driver-ecb-serpent-avx", 21547efe4076SJohannes Goetzfried .test = alg_test_null, 21557efe4076SJohannes Goetzfried }, { 215656d76c96SJussi Kivilinna .alg = "__driver-ecb-serpent-avx2", 215756d76c96SJussi Kivilinna .test = alg_test_null, 215856d76c96SJussi Kivilinna }, { 2159937c30d7SJussi Kivilinna .alg = "__driver-ecb-serpent-sse2", 2160937c30d7SJussi Kivilinna .test = alg_test_null, 2161937c30d7SJussi Kivilinna }, { 2162107778b5SJohannes Goetzfried .alg = "__driver-ecb-twofish-avx", 2163107778b5SJohannes Goetzfried .test = alg_test_null, 2164107778b5SJohannes Goetzfried }, { 21659d77b6c2STadeusz Struk .alg = "__driver-gcm-aes-aesni", 21669d77b6c2STadeusz Struk .test = alg_test_null, 21679d77b6c2STadeusz Struk .fips_allowed = 1, 21689d77b6c2STadeusz Struk }, { 2169863b557aSYouquan, Song .alg = "__ghash-pclmulqdqni", 2170863b557aSYouquan, Song .test = alg_test_null, 21716c79294fSMilan Broz .fips_allowed = 1, 2172863b557aSYouquan, Song }, { 2173e08ca2daSJarod Wilson .alg = "ansi_cprng", 2174e08ca2daSJarod Wilson .test = alg_test_cprng, 2175e08ca2daSJarod Wilson .suite = { 2176e08ca2daSJarod Wilson .cprng = { 2177e08ca2daSJarod Wilson .vecs = ansi_cprng_aes_tv_template, 2178e08ca2daSJarod Wilson .count = ANSI_CPRNG_AES_TEST_VECTORS 2179e08ca2daSJarod Wilson } 2180e08ca2daSJarod Wilson } 2181e08ca2daSJarod Wilson }, { 2182bca4feb0SHoria Geanta .alg = "authenc(hmac(md5),ecb(cipher_null))", 2183bca4feb0SHoria Geanta .test = alg_test_aead, 2184bca4feb0SHoria Geanta .suite = { 2185bca4feb0SHoria Geanta .aead = { 2186bca4feb0SHoria Geanta .enc = { 2187bca4feb0SHoria Geanta .vecs = hmac_md5_ecb_cipher_null_enc_tv_template, 2188bca4feb0SHoria Geanta .count = HMAC_MD5_ECB_CIPHER_NULL_ENC_TEST_VECTORS 2189bca4feb0SHoria Geanta }, 2190bca4feb0SHoria Geanta .dec = { 2191bca4feb0SHoria Geanta .vecs = hmac_md5_ecb_cipher_null_dec_tv_template, 2192bca4feb0SHoria Geanta .count = HMAC_MD5_ECB_CIPHER_NULL_DEC_TEST_VECTORS 2193bca4feb0SHoria Geanta } 2194bca4feb0SHoria Geanta } 2195bca4feb0SHoria Geanta } 2196bca4feb0SHoria Geanta }, { 2197a4198fd4SHerbert Xu .alg = "authenc(hmac(sha1),cbc(aes))", 2198e46e9a46SHoria Geanta .test = alg_test_aead, 2199e46e9a46SHoria Geanta .suite = { 2200e46e9a46SHoria Geanta .aead = { 2201e46e9a46SHoria Geanta .enc = { 22025208ed2cSNitesh Lal .vecs = 22035208ed2cSNitesh Lal hmac_sha1_aes_cbc_enc_tv_temp, 22045208ed2cSNitesh Lal .count = 22055208ed2cSNitesh Lal HMAC_SHA1_AES_CBC_ENC_TEST_VEC 22065208ed2cSNitesh Lal } 22075208ed2cSNitesh Lal } 22085208ed2cSNitesh Lal } 22095208ed2cSNitesh Lal }, { 2210a4198fd4SHerbert Xu .alg = "authenc(hmac(sha1),cbc(des))", 22115208ed2cSNitesh Lal .test = alg_test_aead, 22125208ed2cSNitesh Lal .suite = { 22135208ed2cSNitesh Lal .aead = { 22145208ed2cSNitesh Lal .enc = { 22155208ed2cSNitesh Lal .vecs = 22165208ed2cSNitesh Lal hmac_sha1_des_cbc_enc_tv_temp, 22175208ed2cSNitesh Lal .count = 22185208ed2cSNitesh Lal HMAC_SHA1_DES_CBC_ENC_TEST_VEC 22195208ed2cSNitesh Lal } 22205208ed2cSNitesh Lal } 22215208ed2cSNitesh Lal } 22225208ed2cSNitesh Lal }, { 2223a4198fd4SHerbert Xu .alg = "authenc(hmac(sha1),cbc(des3_ede))", 22245208ed2cSNitesh Lal .test = alg_test_aead, 2225ed1afac9SMarcus Meissner .fips_allowed = 1, 22265208ed2cSNitesh Lal .suite = { 22275208ed2cSNitesh Lal .aead = { 22285208ed2cSNitesh Lal .enc = { 22295208ed2cSNitesh Lal .vecs = 22305208ed2cSNitesh Lal hmac_sha1_des3_ede_cbc_enc_tv_temp, 22315208ed2cSNitesh Lal .count = 22325208ed2cSNitesh Lal HMAC_SHA1_DES3_EDE_CBC_ENC_TEST_VEC 2233e46e9a46SHoria Geanta } 2234e46e9a46SHoria Geanta } 2235e46e9a46SHoria Geanta } 2236e46e9a46SHoria Geanta }, { 2237fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha1),ctr(aes))", 2238fb16abc2SMarcus Meissner .test = alg_test_null, 2239fb16abc2SMarcus Meissner .fips_allowed = 1, 2240fb16abc2SMarcus Meissner }, { 2241bca4feb0SHoria Geanta .alg = "authenc(hmac(sha1),ecb(cipher_null))", 2242bca4feb0SHoria Geanta .test = alg_test_aead, 2243bca4feb0SHoria Geanta .suite = { 2244bca4feb0SHoria Geanta .aead = { 2245bca4feb0SHoria Geanta .enc = { 22465208ed2cSNitesh Lal .vecs = 22475208ed2cSNitesh Lal hmac_sha1_ecb_cipher_null_enc_tv_temp, 22485208ed2cSNitesh Lal .count = 22495208ed2cSNitesh Lal HMAC_SHA1_ECB_CIPHER_NULL_ENC_TEST_VEC 2250bca4feb0SHoria Geanta }, 2251bca4feb0SHoria Geanta .dec = { 22525208ed2cSNitesh Lal .vecs = 22535208ed2cSNitesh Lal hmac_sha1_ecb_cipher_null_dec_tv_temp, 22545208ed2cSNitesh Lal .count = 22555208ed2cSNitesh Lal HMAC_SHA1_ECB_CIPHER_NULL_DEC_TEST_VEC 22565208ed2cSNitesh Lal } 22575208ed2cSNitesh Lal } 22585208ed2cSNitesh Lal } 22595208ed2cSNitesh Lal }, { 22608888690eSMarcus Meissner .alg = "authenc(hmac(sha1),rfc3686(ctr(aes)))", 22618888690eSMarcus Meissner .test = alg_test_null, 22628888690eSMarcus Meissner .fips_allowed = 1, 22638888690eSMarcus Meissner }, { 2264a4198fd4SHerbert Xu .alg = "authenc(hmac(sha224),cbc(des))", 22655208ed2cSNitesh Lal .test = alg_test_aead, 22665208ed2cSNitesh Lal .suite = { 22675208ed2cSNitesh Lal .aead = { 22685208ed2cSNitesh Lal .enc = { 22695208ed2cSNitesh Lal .vecs = 22705208ed2cSNitesh Lal hmac_sha224_des_cbc_enc_tv_temp, 22715208ed2cSNitesh Lal .count = 22725208ed2cSNitesh Lal HMAC_SHA224_DES_CBC_ENC_TEST_VEC 22735208ed2cSNitesh Lal } 22745208ed2cSNitesh Lal } 22755208ed2cSNitesh Lal } 22765208ed2cSNitesh Lal }, { 2277a4198fd4SHerbert Xu .alg = "authenc(hmac(sha224),cbc(des3_ede))", 22785208ed2cSNitesh Lal .test = alg_test_aead, 2279ed1afac9SMarcus Meissner .fips_allowed = 1, 22805208ed2cSNitesh Lal .suite = { 22815208ed2cSNitesh Lal .aead = { 22825208ed2cSNitesh Lal .enc = { 22835208ed2cSNitesh Lal .vecs = 22845208ed2cSNitesh Lal hmac_sha224_des3_ede_cbc_enc_tv_temp, 22855208ed2cSNitesh Lal .count = 22865208ed2cSNitesh Lal HMAC_SHA224_DES3_EDE_CBC_ENC_TEST_VEC 2287bca4feb0SHoria Geanta } 2288bca4feb0SHoria Geanta } 2289bca4feb0SHoria Geanta } 2290bca4feb0SHoria Geanta }, { 2291a4198fd4SHerbert Xu .alg = "authenc(hmac(sha256),cbc(aes))", 2292e46e9a46SHoria Geanta .test = alg_test_aead, 2293ed1afac9SMarcus Meissner .fips_allowed = 1, 2294e46e9a46SHoria Geanta .suite = { 2295e46e9a46SHoria Geanta .aead = { 2296e46e9a46SHoria Geanta .enc = { 22975208ed2cSNitesh Lal .vecs = 22985208ed2cSNitesh Lal hmac_sha256_aes_cbc_enc_tv_temp, 22995208ed2cSNitesh Lal .count = 23005208ed2cSNitesh Lal HMAC_SHA256_AES_CBC_ENC_TEST_VEC 23015208ed2cSNitesh Lal } 23025208ed2cSNitesh Lal } 23035208ed2cSNitesh Lal } 23045208ed2cSNitesh Lal }, { 2305a4198fd4SHerbert Xu .alg = "authenc(hmac(sha256),cbc(des))", 23065208ed2cSNitesh Lal .test = alg_test_aead, 23075208ed2cSNitesh Lal .suite = { 23085208ed2cSNitesh Lal .aead = { 23095208ed2cSNitesh Lal .enc = { 23105208ed2cSNitesh Lal .vecs = 23115208ed2cSNitesh Lal hmac_sha256_des_cbc_enc_tv_temp, 23125208ed2cSNitesh Lal .count = 23135208ed2cSNitesh Lal HMAC_SHA256_DES_CBC_ENC_TEST_VEC 23145208ed2cSNitesh Lal } 23155208ed2cSNitesh Lal } 23165208ed2cSNitesh Lal } 23175208ed2cSNitesh Lal }, { 2318a4198fd4SHerbert Xu .alg = "authenc(hmac(sha256),cbc(des3_ede))", 23195208ed2cSNitesh Lal .test = alg_test_aead, 2320ed1afac9SMarcus Meissner .fips_allowed = 1, 23215208ed2cSNitesh Lal .suite = { 23225208ed2cSNitesh Lal .aead = { 23235208ed2cSNitesh Lal .enc = { 23245208ed2cSNitesh Lal .vecs = 23255208ed2cSNitesh Lal hmac_sha256_des3_ede_cbc_enc_tv_temp, 23265208ed2cSNitesh Lal .count = 23275208ed2cSNitesh Lal HMAC_SHA256_DES3_EDE_CBC_ENC_TEST_VEC 23285208ed2cSNitesh Lal } 23295208ed2cSNitesh Lal } 23305208ed2cSNitesh Lal } 23315208ed2cSNitesh Lal }, { 2332fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha256),ctr(aes))", 2333fb16abc2SMarcus Meissner .test = alg_test_null, 2334fb16abc2SMarcus Meissner .fips_allowed = 1, 2335fb16abc2SMarcus Meissner }, { 23368888690eSMarcus Meissner .alg = "authenc(hmac(sha256),rfc3686(ctr(aes)))", 23378888690eSMarcus Meissner .test = alg_test_null, 23388888690eSMarcus Meissner .fips_allowed = 1, 23398888690eSMarcus Meissner }, { 2340a4198fd4SHerbert Xu .alg = "authenc(hmac(sha384),cbc(des))", 23415208ed2cSNitesh Lal .test = alg_test_aead, 23425208ed2cSNitesh Lal .suite = { 23435208ed2cSNitesh Lal .aead = { 23445208ed2cSNitesh Lal .enc = { 23455208ed2cSNitesh Lal .vecs = 23465208ed2cSNitesh Lal hmac_sha384_des_cbc_enc_tv_temp, 23475208ed2cSNitesh Lal .count = 23485208ed2cSNitesh Lal HMAC_SHA384_DES_CBC_ENC_TEST_VEC 23495208ed2cSNitesh Lal } 23505208ed2cSNitesh Lal } 23515208ed2cSNitesh Lal } 23525208ed2cSNitesh Lal }, { 2353a4198fd4SHerbert Xu .alg = "authenc(hmac(sha384),cbc(des3_ede))", 23545208ed2cSNitesh Lal .test = alg_test_aead, 2355ed1afac9SMarcus Meissner .fips_allowed = 1, 23565208ed2cSNitesh Lal .suite = { 23575208ed2cSNitesh Lal .aead = { 23585208ed2cSNitesh Lal .enc = { 23595208ed2cSNitesh Lal .vecs = 23605208ed2cSNitesh Lal hmac_sha384_des3_ede_cbc_enc_tv_temp, 23615208ed2cSNitesh Lal .count = 23625208ed2cSNitesh Lal HMAC_SHA384_DES3_EDE_CBC_ENC_TEST_VEC 2363e46e9a46SHoria Geanta } 2364e46e9a46SHoria Geanta } 2365e46e9a46SHoria Geanta } 2366e46e9a46SHoria Geanta }, { 2367fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha384),ctr(aes))", 2368fb16abc2SMarcus Meissner .test = alg_test_null, 2369fb16abc2SMarcus Meissner .fips_allowed = 1, 2370fb16abc2SMarcus Meissner }, { 23718888690eSMarcus Meissner .alg = "authenc(hmac(sha384),rfc3686(ctr(aes)))", 23728888690eSMarcus Meissner .test = alg_test_null, 23738888690eSMarcus Meissner .fips_allowed = 1, 23748888690eSMarcus Meissner }, { 2375a4198fd4SHerbert Xu .alg = "authenc(hmac(sha512),cbc(aes))", 2376ed1afac9SMarcus Meissner .fips_allowed = 1, 2377e46e9a46SHoria Geanta .test = alg_test_aead, 2378e46e9a46SHoria Geanta .suite = { 2379e46e9a46SHoria Geanta .aead = { 2380e46e9a46SHoria Geanta .enc = { 23815208ed2cSNitesh Lal .vecs = 23825208ed2cSNitesh Lal hmac_sha512_aes_cbc_enc_tv_temp, 23835208ed2cSNitesh Lal .count = 23845208ed2cSNitesh Lal HMAC_SHA512_AES_CBC_ENC_TEST_VEC 23855208ed2cSNitesh Lal } 23865208ed2cSNitesh Lal } 23875208ed2cSNitesh Lal } 23885208ed2cSNitesh Lal }, { 2389a4198fd4SHerbert Xu .alg = "authenc(hmac(sha512),cbc(des))", 23905208ed2cSNitesh Lal .test = alg_test_aead, 23915208ed2cSNitesh Lal .suite = { 23925208ed2cSNitesh Lal .aead = { 23935208ed2cSNitesh Lal .enc = { 23945208ed2cSNitesh Lal .vecs = 23955208ed2cSNitesh Lal hmac_sha512_des_cbc_enc_tv_temp, 23965208ed2cSNitesh Lal .count = 23975208ed2cSNitesh Lal HMAC_SHA512_DES_CBC_ENC_TEST_VEC 23985208ed2cSNitesh Lal } 23995208ed2cSNitesh Lal } 24005208ed2cSNitesh Lal } 24015208ed2cSNitesh Lal }, { 2402a4198fd4SHerbert Xu .alg = "authenc(hmac(sha512),cbc(des3_ede))", 24035208ed2cSNitesh Lal .test = alg_test_aead, 2404ed1afac9SMarcus Meissner .fips_allowed = 1, 24055208ed2cSNitesh Lal .suite = { 24065208ed2cSNitesh Lal .aead = { 24075208ed2cSNitesh Lal .enc = { 24085208ed2cSNitesh Lal .vecs = 24095208ed2cSNitesh Lal hmac_sha512_des3_ede_cbc_enc_tv_temp, 24105208ed2cSNitesh Lal .count = 24115208ed2cSNitesh Lal HMAC_SHA512_DES3_EDE_CBC_ENC_TEST_VEC 2412e46e9a46SHoria Geanta } 2413e46e9a46SHoria Geanta } 2414e46e9a46SHoria Geanta } 2415e46e9a46SHoria Geanta }, { 2416fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha512),ctr(aes))", 2417fb16abc2SMarcus Meissner .test = alg_test_null, 2418fb16abc2SMarcus Meissner .fips_allowed = 1, 2419fb16abc2SMarcus Meissner }, { 24208888690eSMarcus Meissner .alg = "authenc(hmac(sha512),rfc3686(ctr(aes)))", 24218888690eSMarcus Meissner .test = alg_test_null, 24228888690eSMarcus Meissner .fips_allowed = 1, 24238888690eSMarcus Meissner }, { 2424da7f033dSHerbert Xu .alg = "cbc(aes)", 24251aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2426a1915d51SJarod Wilson .fips_allowed = 1, 2427da7f033dSHerbert Xu .suite = { 2428da7f033dSHerbert Xu .cipher = { 2429da7f033dSHerbert Xu .enc = { 2430da7f033dSHerbert Xu .vecs = aes_cbc_enc_tv_template, 2431da7f033dSHerbert Xu .count = AES_CBC_ENC_TEST_VECTORS 2432da7f033dSHerbert Xu }, 2433da7f033dSHerbert Xu .dec = { 2434da7f033dSHerbert Xu .vecs = aes_cbc_dec_tv_template, 2435da7f033dSHerbert Xu .count = AES_CBC_DEC_TEST_VECTORS 2436da7f033dSHerbert Xu } 2437da7f033dSHerbert Xu } 2438da7f033dSHerbert Xu } 2439da7f033dSHerbert Xu }, { 2440da7f033dSHerbert Xu .alg = "cbc(anubis)", 24411aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2442da7f033dSHerbert Xu .suite = { 2443da7f033dSHerbert Xu .cipher = { 2444da7f033dSHerbert Xu .enc = { 2445da7f033dSHerbert Xu .vecs = anubis_cbc_enc_tv_template, 2446da7f033dSHerbert Xu .count = ANUBIS_CBC_ENC_TEST_VECTORS 2447da7f033dSHerbert Xu }, 2448da7f033dSHerbert Xu .dec = { 2449da7f033dSHerbert Xu .vecs = anubis_cbc_dec_tv_template, 2450da7f033dSHerbert Xu .count = ANUBIS_CBC_DEC_TEST_VECTORS 2451da7f033dSHerbert Xu } 2452da7f033dSHerbert Xu } 2453da7f033dSHerbert Xu } 2454da7f033dSHerbert Xu }, { 2455da7f033dSHerbert Xu .alg = "cbc(blowfish)", 24561aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2457da7f033dSHerbert Xu .suite = { 2458da7f033dSHerbert Xu .cipher = { 2459da7f033dSHerbert Xu .enc = { 2460da7f033dSHerbert Xu .vecs = bf_cbc_enc_tv_template, 2461da7f033dSHerbert Xu .count = BF_CBC_ENC_TEST_VECTORS 2462da7f033dSHerbert Xu }, 2463da7f033dSHerbert Xu .dec = { 2464da7f033dSHerbert Xu .vecs = bf_cbc_dec_tv_template, 2465da7f033dSHerbert Xu .count = BF_CBC_DEC_TEST_VECTORS 2466da7f033dSHerbert Xu } 2467da7f033dSHerbert Xu } 2468da7f033dSHerbert Xu } 2469da7f033dSHerbert Xu }, { 2470da7f033dSHerbert Xu .alg = "cbc(camellia)", 24711aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2472da7f033dSHerbert Xu .suite = { 2473da7f033dSHerbert Xu .cipher = { 2474da7f033dSHerbert Xu .enc = { 2475da7f033dSHerbert Xu .vecs = camellia_cbc_enc_tv_template, 2476da7f033dSHerbert Xu .count = CAMELLIA_CBC_ENC_TEST_VECTORS 2477da7f033dSHerbert Xu }, 2478da7f033dSHerbert Xu .dec = { 2479da7f033dSHerbert Xu .vecs = camellia_cbc_dec_tv_template, 2480da7f033dSHerbert Xu .count = CAMELLIA_CBC_DEC_TEST_VECTORS 2481da7f033dSHerbert Xu } 2482da7f033dSHerbert Xu } 2483da7f033dSHerbert Xu } 2484da7f033dSHerbert Xu }, { 2485a2c58260SJohannes Goetzfried .alg = "cbc(cast5)", 2486a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 2487a2c58260SJohannes Goetzfried .suite = { 2488a2c58260SJohannes Goetzfried .cipher = { 2489a2c58260SJohannes Goetzfried .enc = { 2490a2c58260SJohannes Goetzfried .vecs = cast5_cbc_enc_tv_template, 2491a2c58260SJohannes Goetzfried .count = CAST5_CBC_ENC_TEST_VECTORS 2492a2c58260SJohannes Goetzfried }, 2493a2c58260SJohannes Goetzfried .dec = { 2494a2c58260SJohannes Goetzfried .vecs = cast5_cbc_dec_tv_template, 2495a2c58260SJohannes Goetzfried .count = CAST5_CBC_DEC_TEST_VECTORS 2496a2c58260SJohannes Goetzfried } 2497a2c58260SJohannes Goetzfried } 2498a2c58260SJohannes Goetzfried } 2499a2c58260SJohannes Goetzfried }, { 25009b8b0405SJohannes Goetzfried .alg = "cbc(cast6)", 25019b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 25029b8b0405SJohannes Goetzfried .suite = { 25039b8b0405SJohannes Goetzfried .cipher = { 25049b8b0405SJohannes Goetzfried .enc = { 25059b8b0405SJohannes Goetzfried .vecs = cast6_cbc_enc_tv_template, 25069b8b0405SJohannes Goetzfried .count = CAST6_CBC_ENC_TEST_VECTORS 25079b8b0405SJohannes Goetzfried }, 25089b8b0405SJohannes Goetzfried .dec = { 25099b8b0405SJohannes Goetzfried .vecs = cast6_cbc_dec_tv_template, 25109b8b0405SJohannes Goetzfried .count = CAST6_CBC_DEC_TEST_VECTORS 25119b8b0405SJohannes Goetzfried } 25129b8b0405SJohannes Goetzfried } 25139b8b0405SJohannes Goetzfried } 25149b8b0405SJohannes Goetzfried }, { 2515da7f033dSHerbert Xu .alg = "cbc(des)", 25161aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2517da7f033dSHerbert Xu .suite = { 2518da7f033dSHerbert Xu .cipher = { 2519da7f033dSHerbert Xu .enc = { 2520da7f033dSHerbert Xu .vecs = des_cbc_enc_tv_template, 2521da7f033dSHerbert Xu .count = DES_CBC_ENC_TEST_VECTORS 2522da7f033dSHerbert Xu }, 2523da7f033dSHerbert Xu .dec = { 2524da7f033dSHerbert Xu .vecs = des_cbc_dec_tv_template, 2525da7f033dSHerbert Xu .count = DES_CBC_DEC_TEST_VECTORS 2526da7f033dSHerbert Xu } 2527da7f033dSHerbert Xu } 2528da7f033dSHerbert Xu } 2529da7f033dSHerbert Xu }, { 2530da7f033dSHerbert Xu .alg = "cbc(des3_ede)", 25311aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2532a1915d51SJarod Wilson .fips_allowed = 1, 2533da7f033dSHerbert Xu .suite = { 2534da7f033dSHerbert Xu .cipher = { 2535da7f033dSHerbert Xu .enc = { 2536da7f033dSHerbert Xu .vecs = des3_ede_cbc_enc_tv_template, 2537da7f033dSHerbert Xu .count = DES3_EDE_CBC_ENC_TEST_VECTORS 2538da7f033dSHerbert Xu }, 2539da7f033dSHerbert Xu .dec = { 2540da7f033dSHerbert Xu .vecs = des3_ede_cbc_dec_tv_template, 2541da7f033dSHerbert Xu .count = DES3_EDE_CBC_DEC_TEST_VECTORS 2542da7f033dSHerbert Xu } 2543da7f033dSHerbert Xu } 2544da7f033dSHerbert Xu } 2545da7f033dSHerbert Xu }, { 25469d25917dSJussi Kivilinna .alg = "cbc(serpent)", 25479d25917dSJussi Kivilinna .test = alg_test_skcipher, 25489d25917dSJussi Kivilinna .suite = { 25499d25917dSJussi Kivilinna .cipher = { 25509d25917dSJussi Kivilinna .enc = { 25519d25917dSJussi Kivilinna .vecs = serpent_cbc_enc_tv_template, 25529d25917dSJussi Kivilinna .count = SERPENT_CBC_ENC_TEST_VECTORS 25539d25917dSJussi Kivilinna }, 25549d25917dSJussi Kivilinna .dec = { 25559d25917dSJussi Kivilinna .vecs = serpent_cbc_dec_tv_template, 25569d25917dSJussi Kivilinna .count = SERPENT_CBC_DEC_TEST_VECTORS 25579d25917dSJussi Kivilinna } 25589d25917dSJussi Kivilinna } 25599d25917dSJussi Kivilinna } 25609d25917dSJussi Kivilinna }, { 2561da7f033dSHerbert Xu .alg = "cbc(twofish)", 25621aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2563da7f033dSHerbert Xu .suite = { 2564da7f033dSHerbert Xu .cipher = { 2565da7f033dSHerbert Xu .enc = { 2566da7f033dSHerbert Xu .vecs = tf_cbc_enc_tv_template, 2567da7f033dSHerbert Xu .count = TF_CBC_ENC_TEST_VECTORS 2568da7f033dSHerbert Xu }, 2569da7f033dSHerbert Xu .dec = { 2570da7f033dSHerbert Xu .vecs = tf_cbc_dec_tv_template, 2571da7f033dSHerbert Xu .count = TF_CBC_DEC_TEST_VECTORS 2572da7f033dSHerbert Xu } 2573da7f033dSHerbert Xu } 2574da7f033dSHerbert Xu } 2575da7f033dSHerbert Xu }, { 2576da7f033dSHerbert Xu .alg = "ccm(aes)", 2577da7f033dSHerbert Xu .test = alg_test_aead, 2578a1915d51SJarod Wilson .fips_allowed = 1, 2579da7f033dSHerbert Xu .suite = { 2580da7f033dSHerbert Xu .aead = { 2581da7f033dSHerbert Xu .enc = { 2582da7f033dSHerbert Xu .vecs = aes_ccm_enc_tv_template, 2583da7f033dSHerbert Xu .count = AES_CCM_ENC_TEST_VECTORS 2584da7f033dSHerbert Xu }, 2585da7f033dSHerbert Xu .dec = { 2586da7f033dSHerbert Xu .vecs = aes_ccm_dec_tv_template, 2587da7f033dSHerbert Xu .count = AES_CCM_DEC_TEST_VECTORS 2588da7f033dSHerbert Xu } 2589da7f033dSHerbert Xu } 2590da7f033dSHerbert Xu } 2591da7f033dSHerbert Xu }, { 25923590ebf2SMartin Willi .alg = "chacha20", 25933590ebf2SMartin Willi .test = alg_test_skcipher, 25943590ebf2SMartin Willi .suite = { 25953590ebf2SMartin Willi .cipher = { 25963590ebf2SMartin Willi .enc = { 25973590ebf2SMartin Willi .vecs = chacha20_enc_tv_template, 25983590ebf2SMartin Willi .count = CHACHA20_ENC_TEST_VECTORS 25993590ebf2SMartin Willi }, 26003590ebf2SMartin Willi .dec = { 26013590ebf2SMartin Willi .vecs = chacha20_enc_tv_template, 26023590ebf2SMartin Willi .count = CHACHA20_ENC_TEST_VECTORS 26033590ebf2SMartin Willi }, 26043590ebf2SMartin Willi } 26053590ebf2SMartin Willi } 26063590ebf2SMartin Willi }, { 260793b5e86aSJussi Kivilinna .alg = "cmac(aes)", 26088f183751SStephan Mueller .fips_allowed = 1, 260993b5e86aSJussi Kivilinna .test = alg_test_hash, 261093b5e86aSJussi Kivilinna .suite = { 261193b5e86aSJussi Kivilinna .hash = { 261293b5e86aSJussi Kivilinna .vecs = aes_cmac128_tv_template, 261393b5e86aSJussi Kivilinna .count = CMAC_AES_TEST_VECTORS 261493b5e86aSJussi Kivilinna } 261593b5e86aSJussi Kivilinna } 261693b5e86aSJussi Kivilinna }, { 261793b5e86aSJussi Kivilinna .alg = "cmac(des3_ede)", 26188f183751SStephan Mueller .fips_allowed = 1, 261993b5e86aSJussi Kivilinna .test = alg_test_hash, 262093b5e86aSJussi Kivilinna .suite = { 262193b5e86aSJussi Kivilinna .hash = { 262293b5e86aSJussi Kivilinna .vecs = des3_ede_cmac64_tv_template, 262393b5e86aSJussi Kivilinna .count = CMAC_DES3_EDE_TEST_VECTORS 262493b5e86aSJussi Kivilinna } 262593b5e86aSJussi Kivilinna } 262693b5e86aSJussi Kivilinna }, { 2627e448370dSJussi Kivilinna .alg = "compress_null", 2628e448370dSJussi Kivilinna .test = alg_test_null, 2629e448370dSJussi Kivilinna }, { 2630ebb3472fSArd Biesheuvel .alg = "crc32", 2631ebb3472fSArd Biesheuvel .test = alg_test_hash, 2632ebb3472fSArd Biesheuvel .suite = { 2633ebb3472fSArd Biesheuvel .hash = { 2634ebb3472fSArd Biesheuvel .vecs = crc32_tv_template, 2635ebb3472fSArd Biesheuvel .count = CRC32_TEST_VECTORS 2636ebb3472fSArd Biesheuvel } 2637ebb3472fSArd Biesheuvel } 2638ebb3472fSArd Biesheuvel }, { 2639da7f033dSHerbert Xu .alg = "crc32c", 26408e3ee85eSHerbert Xu .test = alg_test_crc32c, 2641a1915d51SJarod Wilson .fips_allowed = 1, 2642da7f033dSHerbert Xu .suite = { 2643da7f033dSHerbert Xu .hash = { 2644da7f033dSHerbert Xu .vecs = crc32c_tv_template, 2645da7f033dSHerbert Xu .count = CRC32C_TEST_VECTORS 2646da7f033dSHerbert Xu } 2647da7f033dSHerbert Xu } 2648da7f033dSHerbert Xu }, { 264968411521SHerbert Xu .alg = "crct10dif", 265068411521SHerbert Xu .test = alg_test_hash, 265168411521SHerbert Xu .fips_allowed = 1, 265268411521SHerbert Xu .suite = { 265368411521SHerbert Xu .hash = { 265468411521SHerbert Xu .vecs = crct10dif_tv_template, 265568411521SHerbert Xu .count = CRCT10DIF_TEST_VECTORS 265668411521SHerbert Xu } 265768411521SHerbert Xu } 265868411521SHerbert Xu }, { 26596c79294fSMilan Broz .alg = "cryptd(__driver-cbc-aes-aesni)", 26606c79294fSMilan Broz .test = alg_test_null, 26616c79294fSMilan Broz .fips_allowed = 1, 26626c79294fSMilan Broz }, { 2663d9b1d2e7SJussi Kivilinna .alg = "cryptd(__driver-cbc-camellia-aesni)", 2664d9b1d2e7SJussi Kivilinna .test = alg_test_null, 2665d9b1d2e7SJussi Kivilinna }, { 2666f3f935a7SJussi Kivilinna .alg = "cryptd(__driver-cbc-camellia-aesni-avx2)", 2667f3f935a7SJussi Kivilinna .test = alg_test_null, 2668f3f935a7SJussi Kivilinna }, { 266956d76c96SJussi Kivilinna .alg = "cryptd(__driver-cbc-serpent-avx2)", 267056d76c96SJussi Kivilinna .test = alg_test_null, 267156d76c96SJussi Kivilinna }, { 2672863b557aSYouquan, Song .alg = "cryptd(__driver-ecb-aes-aesni)", 2673863b557aSYouquan, Song .test = alg_test_null, 26746c79294fSMilan Broz .fips_allowed = 1, 2675863b557aSYouquan, Song }, { 2676d9b1d2e7SJussi Kivilinna .alg = "cryptd(__driver-ecb-camellia-aesni)", 2677d9b1d2e7SJussi Kivilinna .test = alg_test_null, 2678d9b1d2e7SJussi Kivilinna }, { 2679f3f935a7SJussi Kivilinna .alg = "cryptd(__driver-ecb-camellia-aesni-avx2)", 2680f3f935a7SJussi Kivilinna .test = alg_test_null, 2681f3f935a7SJussi Kivilinna }, { 26824d6d6a2cSJohannes Goetzfried .alg = "cryptd(__driver-ecb-cast5-avx)", 26834d6d6a2cSJohannes Goetzfried .test = alg_test_null, 26844d6d6a2cSJohannes Goetzfried }, { 26854ea1277dSJohannes Goetzfried .alg = "cryptd(__driver-ecb-cast6-avx)", 26864ea1277dSJohannes Goetzfried .test = alg_test_null, 26874ea1277dSJohannes Goetzfried }, { 26887efe4076SJohannes Goetzfried .alg = "cryptd(__driver-ecb-serpent-avx)", 26897efe4076SJohannes Goetzfried .test = alg_test_null, 26907efe4076SJohannes Goetzfried }, { 269156d76c96SJussi Kivilinna .alg = "cryptd(__driver-ecb-serpent-avx2)", 269256d76c96SJussi Kivilinna .test = alg_test_null, 269356d76c96SJussi Kivilinna }, { 2694937c30d7SJussi Kivilinna .alg = "cryptd(__driver-ecb-serpent-sse2)", 2695937c30d7SJussi Kivilinna .test = alg_test_null, 2696937c30d7SJussi Kivilinna }, { 2697107778b5SJohannes Goetzfried .alg = "cryptd(__driver-ecb-twofish-avx)", 2698107778b5SJohannes Goetzfried .test = alg_test_null, 2699107778b5SJohannes Goetzfried }, { 27006c79294fSMilan Broz .alg = "cryptd(__driver-gcm-aes-aesni)", 27016c79294fSMilan Broz .test = alg_test_null, 27026c79294fSMilan Broz .fips_allowed = 1, 27036c79294fSMilan Broz }, { 2704863b557aSYouquan, Song .alg = "cryptd(__ghash-pclmulqdqni)", 2705863b557aSYouquan, Song .test = alg_test_null, 27066c79294fSMilan Broz .fips_allowed = 1, 2707863b557aSYouquan, Song }, { 2708f7cb80f2SJarod Wilson .alg = "ctr(aes)", 2709f7cb80f2SJarod Wilson .test = alg_test_skcipher, 2710a1915d51SJarod Wilson .fips_allowed = 1, 2711f7cb80f2SJarod Wilson .suite = { 2712f7cb80f2SJarod Wilson .cipher = { 2713f7cb80f2SJarod Wilson .enc = { 2714f7cb80f2SJarod Wilson .vecs = aes_ctr_enc_tv_template, 2715f7cb80f2SJarod Wilson .count = AES_CTR_ENC_TEST_VECTORS 2716f7cb80f2SJarod Wilson }, 2717f7cb80f2SJarod Wilson .dec = { 2718f7cb80f2SJarod Wilson .vecs = aes_ctr_dec_tv_template, 2719f7cb80f2SJarod Wilson .count = AES_CTR_DEC_TEST_VECTORS 2720f7cb80f2SJarod Wilson } 2721f7cb80f2SJarod Wilson } 2722f7cb80f2SJarod Wilson } 2723f7cb80f2SJarod Wilson }, { 272485b63e34SJussi Kivilinna .alg = "ctr(blowfish)", 272585b63e34SJussi Kivilinna .test = alg_test_skcipher, 272685b63e34SJussi Kivilinna .suite = { 272785b63e34SJussi Kivilinna .cipher = { 272885b63e34SJussi Kivilinna .enc = { 272985b63e34SJussi Kivilinna .vecs = bf_ctr_enc_tv_template, 273085b63e34SJussi Kivilinna .count = BF_CTR_ENC_TEST_VECTORS 273185b63e34SJussi Kivilinna }, 273285b63e34SJussi Kivilinna .dec = { 273385b63e34SJussi Kivilinna .vecs = bf_ctr_dec_tv_template, 273485b63e34SJussi Kivilinna .count = BF_CTR_DEC_TEST_VECTORS 273585b63e34SJussi Kivilinna } 273685b63e34SJussi Kivilinna } 273785b63e34SJussi Kivilinna } 273885b63e34SJussi Kivilinna }, { 27390840605eSJussi Kivilinna .alg = "ctr(camellia)", 27400840605eSJussi Kivilinna .test = alg_test_skcipher, 27410840605eSJussi Kivilinna .suite = { 27420840605eSJussi Kivilinna .cipher = { 27430840605eSJussi Kivilinna .enc = { 27440840605eSJussi Kivilinna .vecs = camellia_ctr_enc_tv_template, 27450840605eSJussi Kivilinna .count = CAMELLIA_CTR_ENC_TEST_VECTORS 27460840605eSJussi Kivilinna }, 27470840605eSJussi Kivilinna .dec = { 27480840605eSJussi Kivilinna .vecs = camellia_ctr_dec_tv_template, 27490840605eSJussi Kivilinna .count = CAMELLIA_CTR_DEC_TEST_VECTORS 27500840605eSJussi Kivilinna } 27510840605eSJussi Kivilinna } 27520840605eSJussi Kivilinna } 27530840605eSJussi Kivilinna }, { 2754a2c58260SJohannes Goetzfried .alg = "ctr(cast5)", 2755a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 2756a2c58260SJohannes Goetzfried .suite = { 2757a2c58260SJohannes Goetzfried .cipher = { 2758a2c58260SJohannes Goetzfried .enc = { 2759a2c58260SJohannes Goetzfried .vecs = cast5_ctr_enc_tv_template, 2760a2c58260SJohannes Goetzfried .count = CAST5_CTR_ENC_TEST_VECTORS 2761a2c58260SJohannes Goetzfried }, 2762a2c58260SJohannes Goetzfried .dec = { 2763a2c58260SJohannes Goetzfried .vecs = cast5_ctr_dec_tv_template, 2764a2c58260SJohannes Goetzfried .count = CAST5_CTR_DEC_TEST_VECTORS 2765a2c58260SJohannes Goetzfried } 2766a2c58260SJohannes Goetzfried } 2767a2c58260SJohannes Goetzfried } 2768a2c58260SJohannes Goetzfried }, { 27699b8b0405SJohannes Goetzfried .alg = "ctr(cast6)", 27709b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 27719b8b0405SJohannes Goetzfried .suite = { 27729b8b0405SJohannes Goetzfried .cipher = { 27739b8b0405SJohannes Goetzfried .enc = { 27749b8b0405SJohannes Goetzfried .vecs = cast6_ctr_enc_tv_template, 27759b8b0405SJohannes Goetzfried .count = CAST6_CTR_ENC_TEST_VECTORS 27769b8b0405SJohannes Goetzfried }, 27779b8b0405SJohannes Goetzfried .dec = { 27789b8b0405SJohannes Goetzfried .vecs = cast6_ctr_dec_tv_template, 27799b8b0405SJohannes Goetzfried .count = CAST6_CTR_DEC_TEST_VECTORS 27809b8b0405SJohannes Goetzfried } 27819b8b0405SJohannes Goetzfried } 27829b8b0405SJohannes Goetzfried } 27839b8b0405SJohannes Goetzfried }, { 27848163fc30SJussi Kivilinna .alg = "ctr(des)", 27858163fc30SJussi Kivilinna .test = alg_test_skcipher, 27868163fc30SJussi Kivilinna .suite = { 27878163fc30SJussi Kivilinna .cipher = { 27888163fc30SJussi Kivilinna .enc = { 27898163fc30SJussi Kivilinna .vecs = des_ctr_enc_tv_template, 27908163fc30SJussi Kivilinna .count = DES_CTR_ENC_TEST_VECTORS 27918163fc30SJussi Kivilinna }, 27928163fc30SJussi Kivilinna .dec = { 27938163fc30SJussi Kivilinna .vecs = des_ctr_dec_tv_template, 27948163fc30SJussi Kivilinna .count = DES_CTR_DEC_TEST_VECTORS 27958163fc30SJussi Kivilinna } 27968163fc30SJussi Kivilinna } 27978163fc30SJussi Kivilinna } 27988163fc30SJussi Kivilinna }, { 2799e080b17aSJussi Kivilinna .alg = "ctr(des3_ede)", 2800e080b17aSJussi Kivilinna .test = alg_test_skcipher, 2801e080b17aSJussi Kivilinna .suite = { 2802e080b17aSJussi Kivilinna .cipher = { 2803e080b17aSJussi Kivilinna .enc = { 2804e080b17aSJussi Kivilinna .vecs = des3_ede_ctr_enc_tv_template, 2805e080b17aSJussi Kivilinna .count = DES3_EDE_CTR_ENC_TEST_VECTORS 2806e080b17aSJussi Kivilinna }, 2807e080b17aSJussi Kivilinna .dec = { 2808e080b17aSJussi Kivilinna .vecs = des3_ede_ctr_dec_tv_template, 2809e080b17aSJussi Kivilinna .count = DES3_EDE_CTR_DEC_TEST_VECTORS 2810e080b17aSJussi Kivilinna } 2811e080b17aSJussi Kivilinna } 2812e080b17aSJussi Kivilinna } 2813e080b17aSJussi Kivilinna }, { 28149d25917dSJussi Kivilinna .alg = "ctr(serpent)", 28159d25917dSJussi Kivilinna .test = alg_test_skcipher, 28169d25917dSJussi Kivilinna .suite = { 28179d25917dSJussi Kivilinna .cipher = { 28189d25917dSJussi Kivilinna .enc = { 28199d25917dSJussi Kivilinna .vecs = serpent_ctr_enc_tv_template, 28209d25917dSJussi Kivilinna .count = SERPENT_CTR_ENC_TEST_VECTORS 28219d25917dSJussi Kivilinna }, 28229d25917dSJussi Kivilinna .dec = { 28239d25917dSJussi Kivilinna .vecs = serpent_ctr_dec_tv_template, 28249d25917dSJussi Kivilinna .count = SERPENT_CTR_DEC_TEST_VECTORS 28259d25917dSJussi Kivilinna } 28269d25917dSJussi Kivilinna } 28279d25917dSJussi Kivilinna } 28289d25917dSJussi Kivilinna }, { 2829573da620SJussi Kivilinna .alg = "ctr(twofish)", 2830573da620SJussi Kivilinna .test = alg_test_skcipher, 2831573da620SJussi Kivilinna .suite = { 2832573da620SJussi Kivilinna .cipher = { 2833573da620SJussi Kivilinna .enc = { 2834573da620SJussi Kivilinna .vecs = tf_ctr_enc_tv_template, 2835573da620SJussi Kivilinna .count = TF_CTR_ENC_TEST_VECTORS 2836573da620SJussi Kivilinna }, 2837573da620SJussi Kivilinna .dec = { 2838573da620SJussi Kivilinna .vecs = tf_ctr_dec_tv_template, 2839573da620SJussi Kivilinna .count = TF_CTR_DEC_TEST_VECTORS 2840573da620SJussi Kivilinna } 2841573da620SJussi Kivilinna } 2842573da620SJussi Kivilinna } 2843573da620SJussi Kivilinna }, { 2844da7f033dSHerbert Xu .alg = "cts(cbc(aes))", 28451aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2846da7f033dSHerbert Xu .suite = { 2847da7f033dSHerbert Xu .cipher = { 2848da7f033dSHerbert Xu .enc = { 2849da7f033dSHerbert Xu .vecs = cts_mode_enc_tv_template, 2850da7f033dSHerbert Xu .count = CTS_MODE_ENC_TEST_VECTORS 2851da7f033dSHerbert Xu }, 2852da7f033dSHerbert Xu .dec = { 2853da7f033dSHerbert Xu .vecs = cts_mode_dec_tv_template, 2854da7f033dSHerbert Xu .count = CTS_MODE_DEC_TEST_VECTORS 2855da7f033dSHerbert Xu } 2856da7f033dSHerbert Xu } 2857da7f033dSHerbert Xu } 2858da7f033dSHerbert Xu }, { 2859da7f033dSHerbert Xu .alg = "deflate", 2860da7f033dSHerbert Xu .test = alg_test_comp, 28610818904dSMilan Broz .fips_allowed = 1, 2862da7f033dSHerbert Xu .suite = { 2863da7f033dSHerbert Xu .comp = { 2864da7f033dSHerbert Xu .comp = { 2865da7f033dSHerbert Xu .vecs = deflate_comp_tv_template, 2866da7f033dSHerbert Xu .count = DEFLATE_COMP_TEST_VECTORS 2867da7f033dSHerbert Xu }, 2868da7f033dSHerbert Xu .decomp = { 2869da7f033dSHerbert Xu .vecs = deflate_decomp_tv_template, 2870da7f033dSHerbert Xu .count = DEFLATE_DECOMP_TEST_VECTORS 2871da7f033dSHerbert Xu } 2872da7f033dSHerbert Xu } 2873da7f033dSHerbert Xu } 2874da7f033dSHerbert Xu }, { 2875802c7f1cSSalvatore Benedetto .alg = "dh", 2876802c7f1cSSalvatore Benedetto .test = alg_test_kpp, 2877802c7f1cSSalvatore Benedetto .fips_allowed = 1, 2878802c7f1cSSalvatore Benedetto .suite = { 2879802c7f1cSSalvatore Benedetto .kpp = { 2880802c7f1cSSalvatore Benedetto .vecs = dh_tv_template, 2881802c7f1cSSalvatore Benedetto .count = DH_TEST_VECTORS 2882802c7f1cSSalvatore Benedetto } 2883802c7f1cSSalvatore Benedetto } 2884802c7f1cSSalvatore Benedetto }, { 2885e448370dSJussi Kivilinna .alg = "digest_null", 2886e448370dSJussi Kivilinna .test = alg_test_null, 2887e448370dSJussi Kivilinna }, { 288864d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes128", 288964d1cdfbSStephan Mueller .test = alg_test_drbg, 289064d1cdfbSStephan Mueller .fips_allowed = 1, 289164d1cdfbSStephan Mueller .suite = { 289264d1cdfbSStephan Mueller .drbg = { 289364d1cdfbSStephan Mueller .vecs = drbg_nopr_ctr_aes128_tv_template, 289464d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_ctr_aes128_tv_template) 289564d1cdfbSStephan Mueller } 289664d1cdfbSStephan Mueller } 289764d1cdfbSStephan Mueller }, { 289864d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes192", 289964d1cdfbSStephan Mueller .test = alg_test_drbg, 290064d1cdfbSStephan Mueller .fips_allowed = 1, 290164d1cdfbSStephan Mueller .suite = { 290264d1cdfbSStephan Mueller .drbg = { 290364d1cdfbSStephan Mueller .vecs = drbg_nopr_ctr_aes192_tv_template, 290464d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_ctr_aes192_tv_template) 290564d1cdfbSStephan Mueller } 290664d1cdfbSStephan Mueller } 290764d1cdfbSStephan Mueller }, { 290864d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes256", 290964d1cdfbSStephan Mueller .test = alg_test_drbg, 291064d1cdfbSStephan Mueller .fips_allowed = 1, 291164d1cdfbSStephan Mueller .suite = { 291264d1cdfbSStephan Mueller .drbg = { 291364d1cdfbSStephan Mueller .vecs = drbg_nopr_ctr_aes256_tv_template, 291464d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_ctr_aes256_tv_template) 291564d1cdfbSStephan Mueller } 291664d1cdfbSStephan Mueller } 291764d1cdfbSStephan Mueller }, { 291864d1cdfbSStephan Mueller /* 291964d1cdfbSStephan Mueller * There is no need to specifically test the DRBG with every 292064d1cdfbSStephan Mueller * backend cipher -- covered by drbg_nopr_hmac_sha256 test 292164d1cdfbSStephan Mueller */ 292264d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha1", 292364d1cdfbSStephan Mueller .fips_allowed = 1, 292464d1cdfbSStephan Mueller .test = alg_test_null, 292564d1cdfbSStephan Mueller }, { 292664d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha256", 292764d1cdfbSStephan Mueller .test = alg_test_drbg, 292864d1cdfbSStephan Mueller .fips_allowed = 1, 292964d1cdfbSStephan Mueller .suite = { 293064d1cdfbSStephan Mueller .drbg = { 293164d1cdfbSStephan Mueller .vecs = drbg_nopr_hmac_sha256_tv_template, 293264d1cdfbSStephan Mueller .count = 293364d1cdfbSStephan Mueller ARRAY_SIZE(drbg_nopr_hmac_sha256_tv_template) 293464d1cdfbSStephan Mueller } 293564d1cdfbSStephan Mueller } 293664d1cdfbSStephan Mueller }, { 293764d1cdfbSStephan Mueller /* covered by drbg_nopr_hmac_sha256 test */ 293864d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha384", 293964d1cdfbSStephan Mueller .fips_allowed = 1, 294064d1cdfbSStephan Mueller .test = alg_test_null, 294164d1cdfbSStephan Mueller }, { 294264d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha512", 294364d1cdfbSStephan Mueller .test = alg_test_null, 294464d1cdfbSStephan Mueller .fips_allowed = 1, 294564d1cdfbSStephan Mueller }, { 294664d1cdfbSStephan Mueller .alg = "drbg_nopr_sha1", 294764d1cdfbSStephan Mueller .fips_allowed = 1, 294864d1cdfbSStephan Mueller .test = alg_test_null, 294964d1cdfbSStephan Mueller }, { 295064d1cdfbSStephan Mueller .alg = "drbg_nopr_sha256", 295164d1cdfbSStephan Mueller .test = alg_test_drbg, 295264d1cdfbSStephan Mueller .fips_allowed = 1, 295364d1cdfbSStephan Mueller .suite = { 295464d1cdfbSStephan Mueller .drbg = { 295564d1cdfbSStephan Mueller .vecs = drbg_nopr_sha256_tv_template, 295664d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_sha256_tv_template) 295764d1cdfbSStephan Mueller } 295864d1cdfbSStephan Mueller } 295964d1cdfbSStephan Mueller }, { 296064d1cdfbSStephan Mueller /* covered by drbg_nopr_sha256 test */ 296164d1cdfbSStephan Mueller .alg = "drbg_nopr_sha384", 296264d1cdfbSStephan Mueller .fips_allowed = 1, 296364d1cdfbSStephan Mueller .test = alg_test_null, 296464d1cdfbSStephan Mueller }, { 296564d1cdfbSStephan Mueller .alg = "drbg_nopr_sha512", 296664d1cdfbSStephan Mueller .fips_allowed = 1, 296764d1cdfbSStephan Mueller .test = alg_test_null, 296864d1cdfbSStephan Mueller }, { 296964d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes128", 297064d1cdfbSStephan Mueller .test = alg_test_drbg, 297164d1cdfbSStephan Mueller .fips_allowed = 1, 297264d1cdfbSStephan Mueller .suite = { 297364d1cdfbSStephan Mueller .drbg = { 297464d1cdfbSStephan Mueller .vecs = drbg_pr_ctr_aes128_tv_template, 297564d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_pr_ctr_aes128_tv_template) 297664d1cdfbSStephan Mueller } 297764d1cdfbSStephan Mueller } 297864d1cdfbSStephan Mueller }, { 297964d1cdfbSStephan Mueller /* covered by drbg_pr_ctr_aes128 test */ 298064d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes192", 298164d1cdfbSStephan Mueller .fips_allowed = 1, 298264d1cdfbSStephan Mueller .test = alg_test_null, 298364d1cdfbSStephan Mueller }, { 298464d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes256", 298564d1cdfbSStephan Mueller .fips_allowed = 1, 298664d1cdfbSStephan Mueller .test = alg_test_null, 298764d1cdfbSStephan Mueller }, { 298864d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha1", 298964d1cdfbSStephan Mueller .fips_allowed = 1, 299064d1cdfbSStephan Mueller .test = alg_test_null, 299164d1cdfbSStephan Mueller }, { 299264d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha256", 299364d1cdfbSStephan Mueller .test = alg_test_drbg, 299464d1cdfbSStephan Mueller .fips_allowed = 1, 299564d1cdfbSStephan Mueller .suite = { 299664d1cdfbSStephan Mueller .drbg = { 299764d1cdfbSStephan Mueller .vecs = drbg_pr_hmac_sha256_tv_template, 299864d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_pr_hmac_sha256_tv_template) 299964d1cdfbSStephan Mueller } 300064d1cdfbSStephan Mueller } 300164d1cdfbSStephan Mueller }, { 300264d1cdfbSStephan Mueller /* covered by drbg_pr_hmac_sha256 test */ 300364d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha384", 300464d1cdfbSStephan Mueller .fips_allowed = 1, 300564d1cdfbSStephan Mueller .test = alg_test_null, 300664d1cdfbSStephan Mueller }, { 300764d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha512", 300864d1cdfbSStephan Mueller .test = alg_test_null, 300964d1cdfbSStephan Mueller .fips_allowed = 1, 301064d1cdfbSStephan Mueller }, { 301164d1cdfbSStephan Mueller .alg = "drbg_pr_sha1", 301264d1cdfbSStephan Mueller .fips_allowed = 1, 301364d1cdfbSStephan Mueller .test = alg_test_null, 301464d1cdfbSStephan Mueller }, { 301564d1cdfbSStephan Mueller .alg = "drbg_pr_sha256", 301664d1cdfbSStephan Mueller .test = alg_test_drbg, 301764d1cdfbSStephan Mueller .fips_allowed = 1, 301864d1cdfbSStephan Mueller .suite = { 301964d1cdfbSStephan Mueller .drbg = { 302064d1cdfbSStephan Mueller .vecs = drbg_pr_sha256_tv_template, 302164d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_pr_sha256_tv_template) 302264d1cdfbSStephan Mueller } 302364d1cdfbSStephan Mueller } 302464d1cdfbSStephan Mueller }, { 302564d1cdfbSStephan Mueller /* covered by drbg_pr_sha256 test */ 302664d1cdfbSStephan Mueller .alg = "drbg_pr_sha384", 302764d1cdfbSStephan Mueller .fips_allowed = 1, 302864d1cdfbSStephan Mueller .test = alg_test_null, 302964d1cdfbSStephan Mueller }, { 303064d1cdfbSStephan Mueller .alg = "drbg_pr_sha512", 303164d1cdfbSStephan Mueller .fips_allowed = 1, 303264d1cdfbSStephan Mueller .test = alg_test_null, 303364d1cdfbSStephan Mueller }, { 3034863b557aSYouquan, Song .alg = "ecb(__aes-aesni)", 3035863b557aSYouquan, Song .test = alg_test_null, 30366c79294fSMilan Broz .fips_allowed = 1, 3037863b557aSYouquan, Song }, { 3038da7f033dSHerbert Xu .alg = "ecb(aes)", 30391aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3040a1915d51SJarod Wilson .fips_allowed = 1, 3041da7f033dSHerbert Xu .suite = { 3042da7f033dSHerbert Xu .cipher = { 3043da7f033dSHerbert Xu .enc = { 3044da7f033dSHerbert Xu .vecs = aes_enc_tv_template, 3045da7f033dSHerbert Xu .count = AES_ENC_TEST_VECTORS 3046da7f033dSHerbert Xu }, 3047da7f033dSHerbert Xu .dec = { 3048da7f033dSHerbert Xu .vecs = aes_dec_tv_template, 3049da7f033dSHerbert Xu .count = AES_DEC_TEST_VECTORS 3050da7f033dSHerbert Xu } 3051da7f033dSHerbert Xu } 3052da7f033dSHerbert Xu } 3053da7f033dSHerbert Xu }, { 3054da7f033dSHerbert Xu .alg = "ecb(anubis)", 30551aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3056da7f033dSHerbert Xu .suite = { 3057da7f033dSHerbert Xu .cipher = { 3058da7f033dSHerbert Xu .enc = { 3059da7f033dSHerbert Xu .vecs = anubis_enc_tv_template, 3060da7f033dSHerbert Xu .count = ANUBIS_ENC_TEST_VECTORS 3061da7f033dSHerbert Xu }, 3062da7f033dSHerbert Xu .dec = { 3063da7f033dSHerbert Xu .vecs = anubis_dec_tv_template, 3064da7f033dSHerbert Xu .count = ANUBIS_DEC_TEST_VECTORS 3065da7f033dSHerbert Xu } 3066da7f033dSHerbert Xu } 3067da7f033dSHerbert Xu } 3068da7f033dSHerbert Xu }, { 3069da7f033dSHerbert Xu .alg = "ecb(arc4)", 30701aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3071da7f033dSHerbert Xu .suite = { 3072da7f033dSHerbert Xu .cipher = { 3073da7f033dSHerbert Xu .enc = { 3074da7f033dSHerbert Xu .vecs = arc4_enc_tv_template, 3075da7f033dSHerbert Xu .count = ARC4_ENC_TEST_VECTORS 3076da7f033dSHerbert Xu }, 3077da7f033dSHerbert Xu .dec = { 3078da7f033dSHerbert Xu .vecs = arc4_dec_tv_template, 3079da7f033dSHerbert Xu .count = ARC4_DEC_TEST_VECTORS 3080da7f033dSHerbert Xu } 3081da7f033dSHerbert Xu } 3082da7f033dSHerbert Xu } 3083da7f033dSHerbert Xu }, { 3084da7f033dSHerbert Xu .alg = "ecb(blowfish)", 30851aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3086da7f033dSHerbert Xu .suite = { 3087da7f033dSHerbert Xu .cipher = { 3088da7f033dSHerbert Xu .enc = { 3089da7f033dSHerbert Xu .vecs = bf_enc_tv_template, 3090da7f033dSHerbert Xu .count = BF_ENC_TEST_VECTORS 3091da7f033dSHerbert Xu }, 3092da7f033dSHerbert Xu .dec = { 3093da7f033dSHerbert Xu .vecs = bf_dec_tv_template, 3094da7f033dSHerbert Xu .count = BF_DEC_TEST_VECTORS 3095da7f033dSHerbert Xu } 3096da7f033dSHerbert Xu } 3097da7f033dSHerbert Xu } 3098da7f033dSHerbert Xu }, { 3099da7f033dSHerbert Xu .alg = "ecb(camellia)", 31001aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3101da7f033dSHerbert Xu .suite = { 3102da7f033dSHerbert Xu .cipher = { 3103da7f033dSHerbert Xu .enc = { 3104da7f033dSHerbert Xu .vecs = camellia_enc_tv_template, 3105da7f033dSHerbert Xu .count = CAMELLIA_ENC_TEST_VECTORS 3106da7f033dSHerbert Xu }, 3107da7f033dSHerbert Xu .dec = { 3108da7f033dSHerbert Xu .vecs = camellia_dec_tv_template, 3109da7f033dSHerbert Xu .count = CAMELLIA_DEC_TEST_VECTORS 3110da7f033dSHerbert Xu } 3111da7f033dSHerbert Xu } 3112da7f033dSHerbert Xu } 3113da7f033dSHerbert Xu }, { 3114da7f033dSHerbert Xu .alg = "ecb(cast5)", 31151aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3116da7f033dSHerbert Xu .suite = { 3117da7f033dSHerbert Xu .cipher = { 3118da7f033dSHerbert Xu .enc = { 3119da7f033dSHerbert Xu .vecs = cast5_enc_tv_template, 3120da7f033dSHerbert Xu .count = CAST5_ENC_TEST_VECTORS 3121da7f033dSHerbert Xu }, 3122da7f033dSHerbert Xu .dec = { 3123da7f033dSHerbert Xu .vecs = cast5_dec_tv_template, 3124da7f033dSHerbert Xu .count = CAST5_DEC_TEST_VECTORS 3125da7f033dSHerbert Xu } 3126da7f033dSHerbert Xu } 3127da7f033dSHerbert Xu } 3128da7f033dSHerbert Xu }, { 3129da7f033dSHerbert Xu .alg = "ecb(cast6)", 31301aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3131da7f033dSHerbert Xu .suite = { 3132da7f033dSHerbert Xu .cipher = { 3133da7f033dSHerbert Xu .enc = { 3134da7f033dSHerbert Xu .vecs = cast6_enc_tv_template, 3135da7f033dSHerbert Xu .count = CAST6_ENC_TEST_VECTORS 3136da7f033dSHerbert Xu }, 3137da7f033dSHerbert Xu .dec = { 3138da7f033dSHerbert Xu .vecs = cast6_dec_tv_template, 3139da7f033dSHerbert Xu .count = CAST6_DEC_TEST_VECTORS 3140da7f033dSHerbert Xu } 3141da7f033dSHerbert Xu } 3142da7f033dSHerbert Xu } 3143da7f033dSHerbert Xu }, { 3144e448370dSJussi Kivilinna .alg = "ecb(cipher_null)", 3145e448370dSJussi Kivilinna .test = alg_test_null, 3146e448370dSJussi Kivilinna }, { 3147da7f033dSHerbert Xu .alg = "ecb(des)", 31481aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3149da7f033dSHerbert Xu .suite = { 3150da7f033dSHerbert Xu .cipher = { 3151da7f033dSHerbert Xu .enc = { 3152da7f033dSHerbert Xu .vecs = des_enc_tv_template, 3153da7f033dSHerbert Xu .count = DES_ENC_TEST_VECTORS 3154da7f033dSHerbert Xu }, 3155da7f033dSHerbert Xu .dec = { 3156da7f033dSHerbert Xu .vecs = des_dec_tv_template, 3157da7f033dSHerbert Xu .count = DES_DEC_TEST_VECTORS 3158da7f033dSHerbert Xu } 3159da7f033dSHerbert Xu } 3160da7f033dSHerbert Xu } 3161da7f033dSHerbert Xu }, { 3162da7f033dSHerbert Xu .alg = "ecb(des3_ede)", 31631aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3164a1915d51SJarod Wilson .fips_allowed = 1, 3165da7f033dSHerbert Xu .suite = { 3166da7f033dSHerbert Xu .cipher = { 3167da7f033dSHerbert Xu .enc = { 3168da7f033dSHerbert Xu .vecs = des3_ede_enc_tv_template, 3169da7f033dSHerbert Xu .count = DES3_EDE_ENC_TEST_VECTORS 3170da7f033dSHerbert Xu }, 3171da7f033dSHerbert Xu .dec = { 3172da7f033dSHerbert Xu .vecs = des3_ede_dec_tv_template, 3173da7f033dSHerbert Xu .count = DES3_EDE_DEC_TEST_VECTORS 3174da7f033dSHerbert Xu } 3175da7f033dSHerbert Xu } 3176da7f033dSHerbert Xu } 3177da7f033dSHerbert Xu }, { 317866e5bd00SJussi Kivilinna .alg = "ecb(fcrypt)", 317966e5bd00SJussi Kivilinna .test = alg_test_skcipher, 318066e5bd00SJussi Kivilinna .suite = { 318166e5bd00SJussi Kivilinna .cipher = { 318266e5bd00SJussi Kivilinna .enc = { 318366e5bd00SJussi Kivilinna .vecs = fcrypt_pcbc_enc_tv_template, 318466e5bd00SJussi Kivilinna .count = 1 318566e5bd00SJussi Kivilinna }, 318666e5bd00SJussi Kivilinna .dec = { 318766e5bd00SJussi Kivilinna .vecs = fcrypt_pcbc_dec_tv_template, 318866e5bd00SJussi Kivilinna .count = 1 318966e5bd00SJussi Kivilinna } 319066e5bd00SJussi Kivilinna } 319166e5bd00SJussi Kivilinna } 319266e5bd00SJussi Kivilinna }, { 3193da7f033dSHerbert Xu .alg = "ecb(khazad)", 31941aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3195da7f033dSHerbert Xu .suite = { 3196da7f033dSHerbert Xu .cipher = { 3197da7f033dSHerbert Xu .enc = { 3198da7f033dSHerbert Xu .vecs = khazad_enc_tv_template, 3199da7f033dSHerbert Xu .count = KHAZAD_ENC_TEST_VECTORS 3200da7f033dSHerbert Xu }, 3201da7f033dSHerbert Xu .dec = { 3202da7f033dSHerbert Xu .vecs = khazad_dec_tv_template, 3203da7f033dSHerbert Xu .count = KHAZAD_DEC_TEST_VECTORS 3204da7f033dSHerbert Xu } 3205da7f033dSHerbert Xu } 3206da7f033dSHerbert Xu } 3207da7f033dSHerbert Xu }, { 3208da7f033dSHerbert Xu .alg = "ecb(seed)", 32091aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3210da7f033dSHerbert Xu .suite = { 3211da7f033dSHerbert Xu .cipher = { 3212da7f033dSHerbert Xu .enc = { 3213da7f033dSHerbert Xu .vecs = seed_enc_tv_template, 3214da7f033dSHerbert Xu .count = SEED_ENC_TEST_VECTORS 3215da7f033dSHerbert Xu }, 3216da7f033dSHerbert Xu .dec = { 3217da7f033dSHerbert Xu .vecs = seed_dec_tv_template, 3218da7f033dSHerbert Xu .count = SEED_DEC_TEST_VECTORS 3219da7f033dSHerbert Xu } 3220da7f033dSHerbert Xu } 3221da7f033dSHerbert Xu } 3222da7f033dSHerbert Xu }, { 3223da7f033dSHerbert Xu .alg = "ecb(serpent)", 32241aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3225da7f033dSHerbert Xu .suite = { 3226da7f033dSHerbert Xu .cipher = { 3227da7f033dSHerbert Xu .enc = { 3228da7f033dSHerbert Xu .vecs = serpent_enc_tv_template, 3229da7f033dSHerbert Xu .count = SERPENT_ENC_TEST_VECTORS 3230da7f033dSHerbert Xu }, 3231da7f033dSHerbert Xu .dec = { 3232da7f033dSHerbert Xu .vecs = serpent_dec_tv_template, 3233da7f033dSHerbert Xu .count = SERPENT_DEC_TEST_VECTORS 3234da7f033dSHerbert Xu } 3235da7f033dSHerbert Xu } 3236da7f033dSHerbert Xu } 3237da7f033dSHerbert Xu }, { 3238da7f033dSHerbert Xu .alg = "ecb(tea)", 32391aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3240da7f033dSHerbert Xu .suite = { 3241da7f033dSHerbert Xu .cipher = { 3242da7f033dSHerbert Xu .enc = { 3243da7f033dSHerbert Xu .vecs = tea_enc_tv_template, 3244da7f033dSHerbert Xu .count = TEA_ENC_TEST_VECTORS 3245da7f033dSHerbert Xu }, 3246da7f033dSHerbert Xu .dec = { 3247da7f033dSHerbert Xu .vecs = tea_dec_tv_template, 3248da7f033dSHerbert Xu .count = TEA_DEC_TEST_VECTORS 3249da7f033dSHerbert Xu } 3250da7f033dSHerbert Xu } 3251da7f033dSHerbert Xu } 3252da7f033dSHerbert Xu }, { 3253da7f033dSHerbert Xu .alg = "ecb(tnepres)", 32541aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3255da7f033dSHerbert Xu .suite = { 3256da7f033dSHerbert Xu .cipher = { 3257da7f033dSHerbert Xu .enc = { 3258da7f033dSHerbert Xu .vecs = tnepres_enc_tv_template, 3259da7f033dSHerbert Xu .count = TNEPRES_ENC_TEST_VECTORS 3260da7f033dSHerbert Xu }, 3261da7f033dSHerbert Xu .dec = { 3262da7f033dSHerbert Xu .vecs = tnepres_dec_tv_template, 3263da7f033dSHerbert Xu .count = TNEPRES_DEC_TEST_VECTORS 3264da7f033dSHerbert Xu } 3265da7f033dSHerbert Xu } 3266da7f033dSHerbert Xu } 3267da7f033dSHerbert Xu }, { 3268da7f033dSHerbert Xu .alg = "ecb(twofish)", 32691aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3270da7f033dSHerbert Xu .suite = { 3271da7f033dSHerbert Xu .cipher = { 3272da7f033dSHerbert Xu .enc = { 3273da7f033dSHerbert Xu .vecs = tf_enc_tv_template, 3274da7f033dSHerbert Xu .count = TF_ENC_TEST_VECTORS 3275da7f033dSHerbert Xu }, 3276da7f033dSHerbert Xu .dec = { 3277da7f033dSHerbert Xu .vecs = tf_dec_tv_template, 3278da7f033dSHerbert Xu .count = TF_DEC_TEST_VECTORS 3279da7f033dSHerbert Xu } 3280da7f033dSHerbert Xu } 3281da7f033dSHerbert Xu } 3282da7f033dSHerbert Xu }, { 3283da7f033dSHerbert Xu .alg = "ecb(xeta)", 32841aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3285da7f033dSHerbert Xu .suite = { 3286da7f033dSHerbert Xu .cipher = { 3287da7f033dSHerbert Xu .enc = { 3288da7f033dSHerbert Xu .vecs = xeta_enc_tv_template, 3289da7f033dSHerbert Xu .count = XETA_ENC_TEST_VECTORS 3290da7f033dSHerbert Xu }, 3291da7f033dSHerbert Xu .dec = { 3292da7f033dSHerbert Xu .vecs = xeta_dec_tv_template, 3293da7f033dSHerbert Xu .count = XETA_DEC_TEST_VECTORS 3294da7f033dSHerbert Xu } 3295da7f033dSHerbert Xu } 3296da7f033dSHerbert Xu } 3297da7f033dSHerbert Xu }, { 3298da7f033dSHerbert Xu .alg = "ecb(xtea)", 32991aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3300da7f033dSHerbert Xu .suite = { 3301da7f033dSHerbert Xu .cipher = { 3302da7f033dSHerbert Xu .enc = { 3303da7f033dSHerbert Xu .vecs = xtea_enc_tv_template, 3304da7f033dSHerbert Xu .count = XTEA_ENC_TEST_VECTORS 3305da7f033dSHerbert Xu }, 3306da7f033dSHerbert Xu .dec = { 3307da7f033dSHerbert Xu .vecs = xtea_dec_tv_template, 3308da7f033dSHerbert Xu .count = XTEA_DEC_TEST_VECTORS 3309da7f033dSHerbert Xu } 3310da7f033dSHerbert Xu } 3311da7f033dSHerbert Xu } 3312da7f033dSHerbert Xu }, { 33133c4b2390SSalvatore Benedetto .alg = "ecdh", 33143c4b2390SSalvatore Benedetto .test = alg_test_kpp, 33153c4b2390SSalvatore Benedetto .fips_allowed = 1, 33163c4b2390SSalvatore Benedetto .suite = { 33173c4b2390SSalvatore Benedetto .kpp = { 33183c4b2390SSalvatore Benedetto .vecs = ecdh_tv_template, 33193c4b2390SSalvatore Benedetto .count = ECDH_TEST_VECTORS 33203c4b2390SSalvatore Benedetto } 33213c4b2390SSalvatore Benedetto } 33223c4b2390SSalvatore Benedetto }, { 3323da7f033dSHerbert Xu .alg = "gcm(aes)", 3324da7f033dSHerbert Xu .test = alg_test_aead, 3325a1915d51SJarod Wilson .fips_allowed = 1, 3326da7f033dSHerbert Xu .suite = { 3327da7f033dSHerbert Xu .aead = { 3328da7f033dSHerbert Xu .enc = { 3329da7f033dSHerbert Xu .vecs = aes_gcm_enc_tv_template, 3330da7f033dSHerbert Xu .count = AES_GCM_ENC_TEST_VECTORS 3331da7f033dSHerbert Xu }, 3332da7f033dSHerbert Xu .dec = { 3333da7f033dSHerbert Xu .vecs = aes_gcm_dec_tv_template, 3334da7f033dSHerbert Xu .count = AES_GCM_DEC_TEST_VECTORS 3335da7f033dSHerbert Xu } 3336da7f033dSHerbert Xu } 3337da7f033dSHerbert Xu } 3338da7f033dSHerbert Xu }, { 3339507069c9SYouquan, Song .alg = "ghash", 3340507069c9SYouquan, Song .test = alg_test_hash, 334118c0ebd2SJarod Wilson .fips_allowed = 1, 3342507069c9SYouquan, Song .suite = { 3343507069c9SYouquan, Song .hash = { 3344507069c9SYouquan, Song .vecs = ghash_tv_template, 3345507069c9SYouquan, Song .count = GHASH_TEST_VECTORS 3346507069c9SYouquan, Song } 3347507069c9SYouquan, Song } 3348507069c9SYouquan, Song }, { 3349a482b081SSonic Zhang .alg = "hmac(crc32)", 3350a482b081SSonic Zhang .test = alg_test_hash, 3351a482b081SSonic Zhang .suite = { 3352a482b081SSonic Zhang .hash = { 3353a482b081SSonic Zhang .vecs = bfin_crc_tv_template, 3354a482b081SSonic Zhang .count = BFIN_CRC_TEST_VECTORS 3355a482b081SSonic Zhang } 3356a482b081SSonic Zhang } 3357a482b081SSonic Zhang }, { 3358da7f033dSHerbert Xu .alg = "hmac(md5)", 3359da7f033dSHerbert Xu .test = alg_test_hash, 3360da7f033dSHerbert Xu .suite = { 3361da7f033dSHerbert Xu .hash = { 3362da7f033dSHerbert Xu .vecs = hmac_md5_tv_template, 3363da7f033dSHerbert Xu .count = HMAC_MD5_TEST_VECTORS 3364da7f033dSHerbert Xu } 3365da7f033dSHerbert Xu } 3366da7f033dSHerbert Xu }, { 3367da7f033dSHerbert Xu .alg = "hmac(rmd128)", 3368da7f033dSHerbert Xu .test = alg_test_hash, 3369da7f033dSHerbert Xu .suite = { 3370da7f033dSHerbert Xu .hash = { 3371da7f033dSHerbert Xu .vecs = hmac_rmd128_tv_template, 3372da7f033dSHerbert Xu .count = HMAC_RMD128_TEST_VECTORS 3373da7f033dSHerbert Xu } 3374da7f033dSHerbert Xu } 3375da7f033dSHerbert Xu }, { 3376da7f033dSHerbert Xu .alg = "hmac(rmd160)", 3377da7f033dSHerbert Xu .test = alg_test_hash, 3378da7f033dSHerbert Xu .suite = { 3379da7f033dSHerbert Xu .hash = { 3380da7f033dSHerbert Xu .vecs = hmac_rmd160_tv_template, 3381da7f033dSHerbert Xu .count = HMAC_RMD160_TEST_VECTORS 3382da7f033dSHerbert Xu } 3383da7f033dSHerbert Xu } 3384da7f033dSHerbert Xu }, { 3385da7f033dSHerbert Xu .alg = "hmac(sha1)", 3386da7f033dSHerbert Xu .test = alg_test_hash, 3387a1915d51SJarod Wilson .fips_allowed = 1, 3388da7f033dSHerbert Xu .suite = { 3389da7f033dSHerbert Xu .hash = { 3390da7f033dSHerbert Xu .vecs = hmac_sha1_tv_template, 3391da7f033dSHerbert Xu .count = HMAC_SHA1_TEST_VECTORS 3392da7f033dSHerbert Xu } 3393da7f033dSHerbert Xu } 3394da7f033dSHerbert Xu }, { 3395da7f033dSHerbert Xu .alg = "hmac(sha224)", 3396da7f033dSHerbert Xu .test = alg_test_hash, 3397a1915d51SJarod Wilson .fips_allowed = 1, 3398da7f033dSHerbert Xu .suite = { 3399da7f033dSHerbert Xu .hash = { 3400da7f033dSHerbert Xu .vecs = hmac_sha224_tv_template, 3401da7f033dSHerbert Xu .count = HMAC_SHA224_TEST_VECTORS 3402da7f033dSHerbert Xu } 3403da7f033dSHerbert Xu } 3404da7f033dSHerbert Xu }, { 3405da7f033dSHerbert Xu .alg = "hmac(sha256)", 3406da7f033dSHerbert Xu .test = alg_test_hash, 3407a1915d51SJarod Wilson .fips_allowed = 1, 3408da7f033dSHerbert Xu .suite = { 3409da7f033dSHerbert Xu .hash = { 3410da7f033dSHerbert Xu .vecs = hmac_sha256_tv_template, 3411da7f033dSHerbert Xu .count = HMAC_SHA256_TEST_VECTORS 3412da7f033dSHerbert Xu } 3413da7f033dSHerbert Xu } 3414da7f033dSHerbert Xu }, { 341598eca72fSraveendra padasalagi .alg = "hmac(sha3-224)", 341698eca72fSraveendra padasalagi .test = alg_test_hash, 341798eca72fSraveendra padasalagi .fips_allowed = 1, 341898eca72fSraveendra padasalagi .suite = { 341998eca72fSraveendra padasalagi .hash = { 342098eca72fSraveendra padasalagi .vecs = hmac_sha3_224_tv_template, 342198eca72fSraveendra padasalagi .count = HMAC_SHA3_224_TEST_VECTORS 342298eca72fSraveendra padasalagi } 342398eca72fSraveendra padasalagi } 342498eca72fSraveendra padasalagi }, { 342598eca72fSraveendra padasalagi .alg = "hmac(sha3-256)", 342698eca72fSraveendra padasalagi .test = alg_test_hash, 342798eca72fSraveendra padasalagi .fips_allowed = 1, 342898eca72fSraveendra padasalagi .suite = { 342998eca72fSraveendra padasalagi .hash = { 343098eca72fSraveendra padasalagi .vecs = hmac_sha3_256_tv_template, 343198eca72fSraveendra padasalagi .count = HMAC_SHA3_256_TEST_VECTORS 343298eca72fSraveendra padasalagi } 343398eca72fSraveendra padasalagi } 343498eca72fSraveendra padasalagi }, { 343598eca72fSraveendra padasalagi .alg = "hmac(sha3-384)", 343698eca72fSraveendra padasalagi .test = alg_test_hash, 343798eca72fSraveendra padasalagi .fips_allowed = 1, 343898eca72fSraveendra padasalagi .suite = { 343998eca72fSraveendra padasalagi .hash = { 344098eca72fSraveendra padasalagi .vecs = hmac_sha3_384_tv_template, 344198eca72fSraveendra padasalagi .count = HMAC_SHA3_384_TEST_VECTORS 344298eca72fSraveendra padasalagi } 344398eca72fSraveendra padasalagi } 344498eca72fSraveendra padasalagi }, { 344598eca72fSraveendra padasalagi .alg = "hmac(sha3-512)", 344698eca72fSraveendra padasalagi .test = alg_test_hash, 344798eca72fSraveendra padasalagi .fips_allowed = 1, 344898eca72fSraveendra padasalagi .suite = { 344998eca72fSraveendra padasalagi .hash = { 345098eca72fSraveendra padasalagi .vecs = hmac_sha3_512_tv_template, 345198eca72fSraveendra padasalagi .count = HMAC_SHA3_512_TEST_VECTORS 345298eca72fSraveendra padasalagi } 345398eca72fSraveendra padasalagi } 345498eca72fSraveendra padasalagi }, { 3455da7f033dSHerbert Xu .alg = "hmac(sha384)", 3456da7f033dSHerbert Xu .test = alg_test_hash, 3457a1915d51SJarod Wilson .fips_allowed = 1, 3458da7f033dSHerbert Xu .suite = { 3459da7f033dSHerbert Xu .hash = { 3460da7f033dSHerbert Xu .vecs = hmac_sha384_tv_template, 3461da7f033dSHerbert Xu .count = HMAC_SHA384_TEST_VECTORS 3462da7f033dSHerbert Xu } 3463da7f033dSHerbert Xu } 3464da7f033dSHerbert Xu }, { 3465da7f033dSHerbert Xu .alg = "hmac(sha512)", 3466da7f033dSHerbert Xu .test = alg_test_hash, 3467a1915d51SJarod Wilson .fips_allowed = 1, 3468da7f033dSHerbert Xu .suite = { 3469da7f033dSHerbert Xu .hash = { 3470da7f033dSHerbert Xu .vecs = hmac_sha512_tv_template, 3471da7f033dSHerbert Xu .count = HMAC_SHA512_TEST_VECTORS 3472da7f033dSHerbert Xu } 3473da7f033dSHerbert Xu } 3474da7f033dSHerbert Xu }, { 3475bb5530e4SStephan Mueller .alg = "jitterentropy_rng", 3476bb5530e4SStephan Mueller .fips_allowed = 1, 3477bb5530e4SStephan Mueller .test = alg_test_null, 3478bb5530e4SStephan Mueller }, { 347935351988SStephan Mueller .alg = "kw(aes)", 348035351988SStephan Mueller .test = alg_test_skcipher, 348135351988SStephan Mueller .fips_allowed = 1, 348235351988SStephan Mueller .suite = { 348335351988SStephan Mueller .cipher = { 348435351988SStephan Mueller .enc = { 348535351988SStephan Mueller .vecs = aes_kw_enc_tv_template, 348635351988SStephan Mueller .count = ARRAY_SIZE(aes_kw_enc_tv_template) 348735351988SStephan Mueller }, 348835351988SStephan Mueller .dec = { 348935351988SStephan Mueller .vecs = aes_kw_dec_tv_template, 349035351988SStephan Mueller .count = ARRAY_SIZE(aes_kw_dec_tv_template) 349135351988SStephan Mueller } 349235351988SStephan Mueller } 349335351988SStephan Mueller } 349435351988SStephan Mueller }, { 3495da7f033dSHerbert Xu .alg = "lrw(aes)", 34961aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3497da7f033dSHerbert Xu .suite = { 3498da7f033dSHerbert Xu .cipher = { 3499da7f033dSHerbert Xu .enc = { 3500da7f033dSHerbert Xu .vecs = aes_lrw_enc_tv_template, 3501da7f033dSHerbert Xu .count = AES_LRW_ENC_TEST_VECTORS 3502da7f033dSHerbert Xu }, 3503da7f033dSHerbert Xu .dec = { 3504da7f033dSHerbert Xu .vecs = aes_lrw_dec_tv_template, 3505da7f033dSHerbert Xu .count = AES_LRW_DEC_TEST_VECTORS 3506da7f033dSHerbert Xu } 3507da7f033dSHerbert Xu } 3508da7f033dSHerbert Xu } 3509da7f033dSHerbert Xu }, { 35100840605eSJussi Kivilinna .alg = "lrw(camellia)", 35110840605eSJussi Kivilinna .test = alg_test_skcipher, 35120840605eSJussi Kivilinna .suite = { 35130840605eSJussi Kivilinna .cipher = { 35140840605eSJussi Kivilinna .enc = { 35150840605eSJussi Kivilinna .vecs = camellia_lrw_enc_tv_template, 35160840605eSJussi Kivilinna .count = CAMELLIA_LRW_ENC_TEST_VECTORS 35170840605eSJussi Kivilinna }, 35180840605eSJussi Kivilinna .dec = { 35190840605eSJussi Kivilinna .vecs = camellia_lrw_dec_tv_template, 35200840605eSJussi Kivilinna .count = CAMELLIA_LRW_DEC_TEST_VECTORS 35210840605eSJussi Kivilinna } 35220840605eSJussi Kivilinna } 35230840605eSJussi Kivilinna } 35240840605eSJussi Kivilinna }, { 35259b8b0405SJohannes Goetzfried .alg = "lrw(cast6)", 35269b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 35279b8b0405SJohannes Goetzfried .suite = { 35289b8b0405SJohannes Goetzfried .cipher = { 35299b8b0405SJohannes Goetzfried .enc = { 35309b8b0405SJohannes Goetzfried .vecs = cast6_lrw_enc_tv_template, 35319b8b0405SJohannes Goetzfried .count = CAST6_LRW_ENC_TEST_VECTORS 35329b8b0405SJohannes Goetzfried }, 35339b8b0405SJohannes Goetzfried .dec = { 35349b8b0405SJohannes Goetzfried .vecs = cast6_lrw_dec_tv_template, 35359b8b0405SJohannes Goetzfried .count = CAST6_LRW_DEC_TEST_VECTORS 35369b8b0405SJohannes Goetzfried } 35379b8b0405SJohannes Goetzfried } 35389b8b0405SJohannes Goetzfried } 35399b8b0405SJohannes Goetzfried }, { 3540d7bfc0faSJussi Kivilinna .alg = "lrw(serpent)", 3541d7bfc0faSJussi Kivilinna .test = alg_test_skcipher, 3542d7bfc0faSJussi Kivilinna .suite = { 3543d7bfc0faSJussi Kivilinna .cipher = { 3544d7bfc0faSJussi Kivilinna .enc = { 3545d7bfc0faSJussi Kivilinna .vecs = serpent_lrw_enc_tv_template, 3546d7bfc0faSJussi Kivilinna .count = SERPENT_LRW_ENC_TEST_VECTORS 3547d7bfc0faSJussi Kivilinna }, 3548d7bfc0faSJussi Kivilinna .dec = { 3549d7bfc0faSJussi Kivilinna .vecs = serpent_lrw_dec_tv_template, 3550d7bfc0faSJussi Kivilinna .count = SERPENT_LRW_DEC_TEST_VECTORS 3551d7bfc0faSJussi Kivilinna } 3552d7bfc0faSJussi Kivilinna } 3553d7bfc0faSJussi Kivilinna } 3554d7bfc0faSJussi Kivilinna }, { 35550b2a1551SJussi Kivilinna .alg = "lrw(twofish)", 35560b2a1551SJussi Kivilinna .test = alg_test_skcipher, 35570b2a1551SJussi Kivilinna .suite = { 35580b2a1551SJussi Kivilinna .cipher = { 35590b2a1551SJussi Kivilinna .enc = { 35600b2a1551SJussi Kivilinna .vecs = tf_lrw_enc_tv_template, 35610b2a1551SJussi Kivilinna .count = TF_LRW_ENC_TEST_VECTORS 35620b2a1551SJussi Kivilinna }, 35630b2a1551SJussi Kivilinna .dec = { 35640b2a1551SJussi Kivilinna .vecs = tf_lrw_dec_tv_template, 35650b2a1551SJussi Kivilinna .count = TF_LRW_DEC_TEST_VECTORS 35660b2a1551SJussi Kivilinna } 35670b2a1551SJussi Kivilinna } 35680b2a1551SJussi Kivilinna } 35690b2a1551SJussi Kivilinna }, { 35701443cc9bSKOVACS Krisztian .alg = "lz4", 35711443cc9bSKOVACS Krisztian .test = alg_test_comp, 35721443cc9bSKOVACS Krisztian .fips_allowed = 1, 35731443cc9bSKOVACS Krisztian .suite = { 35741443cc9bSKOVACS Krisztian .comp = { 35751443cc9bSKOVACS Krisztian .comp = { 35761443cc9bSKOVACS Krisztian .vecs = lz4_comp_tv_template, 35771443cc9bSKOVACS Krisztian .count = LZ4_COMP_TEST_VECTORS 35781443cc9bSKOVACS Krisztian }, 35791443cc9bSKOVACS Krisztian .decomp = { 35801443cc9bSKOVACS Krisztian .vecs = lz4_decomp_tv_template, 35811443cc9bSKOVACS Krisztian .count = LZ4_DECOMP_TEST_VECTORS 35821443cc9bSKOVACS Krisztian } 35831443cc9bSKOVACS Krisztian } 35841443cc9bSKOVACS Krisztian } 35851443cc9bSKOVACS Krisztian }, { 35861443cc9bSKOVACS Krisztian .alg = "lz4hc", 35871443cc9bSKOVACS Krisztian .test = alg_test_comp, 35881443cc9bSKOVACS Krisztian .fips_allowed = 1, 35891443cc9bSKOVACS Krisztian .suite = { 35901443cc9bSKOVACS Krisztian .comp = { 35911443cc9bSKOVACS Krisztian .comp = { 35921443cc9bSKOVACS Krisztian .vecs = lz4hc_comp_tv_template, 35931443cc9bSKOVACS Krisztian .count = LZ4HC_COMP_TEST_VECTORS 35941443cc9bSKOVACS Krisztian }, 35951443cc9bSKOVACS Krisztian .decomp = { 35961443cc9bSKOVACS Krisztian .vecs = lz4hc_decomp_tv_template, 35971443cc9bSKOVACS Krisztian .count = LZ4HC_DECOMP_TEST_VECTORS 35981443cc9bSKOVACS Krisztian } 35991443cc9bSKOVACS Krisztian } 36001443cc9bSKOVACS Krisztian } 36011443cc9bSKOVACS Krisztian }, { 3602da7f033dSHerbert Xu .alg = "lzo", 3603da7f033dSHerbert Xu .test = alg_test_comp, 36040818904dSMilan Broz .fips_allowed = 1, 3605da7f033dSHerbert Xu .suite = { 3606da7f033dSHerbert Xu .comp = { 3607da7f033dSHerbert Xu .comp = { 3608da7f033dSHerbert Xu .vecs = lzo_comp_tv_template, 3609da7f033dSHerbert Xu .count = LZO_COMP_TEST_VECTORS 3610da7f033dSHerbert Xu }, 3611da7f033dSHerbert Xu .decomp = { 3612da7f033dSHerbert Xu .vecs = lzo_decomp_tv_template, 3613da7f033dSHerbert Xu .count = LZO_DECOMP_TEST_VECTORS 3614da7f033dSHerbert Xu } 3615da7f033dSHerbert Xu } 3616da7f033dSHerbert Xu } 3617da7f033dSHerbert Xu }, { 3618da7f033dSHerbert Xu .alg = "md4", 3619da7f033dSHerbert Xu .test = alg_test_hash, 3620da7f033dSHerbert Xu .suite = { 3621da7f033dSHerbert Xu .hash = { 3622da7f033dSHerbert Xu .vecs = md4_tv_template, 3623da7f033dSHerbert Xu .count = MD4_TEST_VECTORS 3624da7f033dSHerbert Xu } 3625da7f033dSHerbert Xu } 3626da7f033dSHerbert Xu }, { 3627da7f033dSHerbert Xu .alg = "md5", 3628da7f033dSHerbert Xu .test = alg_test_hash, 3629da7f033dSHerbert Xu .suite = { 3630da7f033dSHerbert Xu .hash = { 3631da7f033dSHerbert Xu .vecs = md5_tv_template, 3632da7f033dSHerbert Xu .count = MD5_TEST_VECTORS 3633da7f033dSHerbert Xu } 3634da7f033dSHerbert Xu } 3635da7f033dSHerbert Xu }, { 3636da7f033dSHerbert Xu .alg = "michael_mic", 3637da7f033dSHerbert Xu .test = alg_test_hash, 3638da7f033dSHerbert Xu .suite = { 3639da7f033dSHerbert Xu .hash = { 3640da7f033dSHerbert Xu .vecs = michael_mic_tv_template, 3641da7f033dSHerbert Xu .count = MICHAEL_MIC_TEST_VECTORS 3642da7f033dSHerbert Xu } 3643da7f033dSHerbert Xu } 3644da7f033dSHerbert Xu }, { 3645ba0e14acSPuneet Saxena .alg = "ofb(aes)", 3646ba0e14acSPuneet Saxena .test = alg_test_skcipher, 3647ba0e14acSPuneet Saxena .fips_allowed = 1, 3648ba0e14acSPuneet Saxena .suite = { 3649ba0e14acSPuneet Saxena .cipher = { 3650ba0e14acSPuneet Saxena .enc = { 3651ba0e14acSPuneet Saxena .vecs = aes_ofb_enc_tv_template, 3652ba0e14acSPuneet Saxena .count = AES_OFB_ENC_TEST_VECTORS 3653ba0e14acSPuneet Saxena }, 3654ba0e14acSPuneet Saxena .dec = { 3655ba0e14acSPuneet Saxena .vecs = aes_ofb_dec_tv_template, 3656ba0e14acSPuneet Saxena .count = AES_OFB_DEC_TEST_VECTORS 3657ba0e14acSPuneet Saxena } 3658ba0e14acSPuneet Saxena } 3659ba0e14acSPuneet Saxena } 3660ba0e14acSPuneet Saxena }, { 3661da7f033dSHerbert Xu .alg = "pcbc(fcrypt)", 36621aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3663da7f033dSHerbert Xu .suite = { 3664da7f033dSHerbert Xu .cipher = { 3665da7f033dSHerbert Xu .enc = { 3666da7f033dSHerbert Xu .vecs = fcrypt_pcbc_enc_tv_template, 3667da7f033dSHerbert Xu .count = FCRYPT_ENC_TEST_VECTORS 3668da7f033dSHerbert Xu }, 3669da7f033dSHerbert Xu .dec = { 3670da7f033dSHerbert Xu .vecs = fcrypt_pcbc_dec_tv_template, 3671da7f033dSHerbert Xu .count = FCRYPT_DEC_TEST_VECTORS 3672da7f033dSHerbert Xu } 3673da7f033dSHerbert Xu } 3674da7f033dSHerbert Xu } 3675da7f033dSHerbert Xu }, { 3676eee9dc61SMartin Willi .alg = "poly1305", 3677eee9dc61SMartin Willi .test = alg_test_hash, 3678eee9dc61SMartin Willi .suite = { 3679eee9dc61SMartin Willi .hash = { 3680eee9dc61SMartin Willi .vecs = poly1305_tv_template, 3681eee9dc61SMartin Willi .count = POLY1305_TEST_VECTORS 3682eee9dc61SMartin Willi } 3683eee9dc61SMartin Willi } 3684eee9dc61SMartin Willi }, { 3685da7f033dSHerbert Xu .alg = "rfc3686(ctr(aes))", 36861aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3687a1915d51SJarod Wilson .fips_allowed = 1, 3688da7f033dSHerbert Xu .suite = { 3689da7f033dSHerbert Xu .cipher = { 3690da7f033dSHerbert Xu .enc = { 3691f7cb80f2SJarod Wilson .vecs = aes_ctr_rfc3686_enc_tv_template, 3692f7cb80f2SJarod Wilson .count = AES_CTR_3686_ENC_TEST_VECTORS 3693da7f033dSHerbert Xu }, 3694da7f033dSHerbert Xu .dec = { 3695f7cb80f2SJarod Wilson .vecs = aes_ctr_rfc3686_dec_tv_template, 3696f7cb80f2SJarod Wilson .count = AES_CTR_3686_DEC_TEST_VECTORS 3697da7f033dSHerbert Xu } 3698da7f033dSHerbert Xu } 3699da7f033dSHerbert Xu } 3700da7f033dSHerbert Xu }, { 37013f31a740SHerbert Xu .alg = "rfc4106(gcm(aes))", 370269435b94SAdrian Hoban .test = alg_test_aead, 3703db71f29aSJarod Wilson .fips_allowed = 1, 370469435b94SAdrian Hoban .suite = { 370569435b94SAdrian Hoban .aead = { 370669435b94SAdrian Hoban .enc = { 370769435b94SAdrian Hoban .vecs = aes_gcm_rfc4106_enc_tv_template, 370869435b94SAdrian Hoban .count = AES_GCM_4106_ENC_TEST_VECTORS 370969435b94SAdrian Hoban }, 371069435b94SAdrian Hoban .dec = { 371169435b94SAdrian Hoban .vecs = aes_gcm_rfc4106_dec_tv_template, 371269435b94SAdrian Hoban .count = AES_GCM_4106_DEC_TEST_VECTORS 371369435b94SAdrian Hoban } 371469435b94SAdrian Hoban } 371569435b94SAdrian Hoban } 371669435b94SAdrian Hoban }, { 3717544c436aSHerbert Xu .alg = "rfc4309(ccm(aes))", 37185d667322SJarod Wilson .test = alg_test_aead, 3719a1915d51SJarod Wilson .fips_allowed = 1, 37205d667322SJarod Wilson .suite = { 37215d667322SJarod Wilson .aead = { 37225d667322SJarod Wilson .enc = { 37235d667322SJarod Wilson .vecs = aes_ccm_rfc4309_enc_tv_template, 37245d667322SJarod Wilson .count = AES_CCM_4309_ENC_TEST_VECTORS 37255d667322SJarod Wilson }, 37265d667322SJarod Wilson .dec = { 37275d667322SJarod Wilson .vecs = aes_ccm_rfc4309_dec_tv_template, 37285d667322SJarod Wilson .count = AES_CCM_4309_DEC_TEST_VECTORS 37295d667322SJarod Wilson } 37305d667322SJarod Wilson } 37315d667322SJarod Wilson } 37325d667322SJarod Wilson }, { 3733bb68745eSHerbert Xu .alg = "rfc4543(gcm(aes))", 3734e9b7441aSJussi Kivilinna .test = alg_test_aead, 3735e9b7441aSJussi Kivilinna .suite = { 3736e9b7441aSJussi Kivilinna .aead = { 3737e9b7441aSJussi Kivilinna .enc = { 3738e9b7441aSJussi Kivilinna .vecs = aes_gcm_rfc4543_enc_tv_template, 3739e9b7441aSJussi Kivilinna .count = AES_GCM_4543_ENC_TEST_VECTORS 3740e9b7441aSJussi Kivilinna }, 3741e9b7441aSJussi Kivilinna .dec = { 3742e9b7441aSJussi Kivilinna .vecs = aes_gcm_rfc4543_dec_tv_template, 3743e9b7441aSJussi Kivilinna .count = AES_GCM_4543_DEC_TEST_VECTORS 3744e9b7441aSJussi Kivilinna }, 3745e9b7441aSJussi Kivilinna } 3746e9b7441aSJussi Kivilinna } 3747e9b7441aSJussi Kivilinna }, { 3748af2b76b5SMartin Willi .alg = "rfc7539(chacha20,poly1305)", 3749af2b76b5SMartin Willi .test = alg_test_aead, 3750af2b76b5SMartin Willi .suite = { 3751af2b76b5SMartin Willi .aead = { 3752af2b76b5SMartin Willi .enc = { 3753af2b76b5SMartin Willi .vecs = rfc7539_enc_tv_template, 3754af2b76b5SMartin Willi .count = RFC7539_ENC_TEST_VECTORS 3755af2b76b5SMartin Willi }, 3756af2b76b5SMartin Willi .dec = { 3757af2b76b5SMartin Willi .vecs = rfc7539_dec_tv_template, 3758af2b76b5SMartin Willi .count = RFC7539_DEC_TEST_VECTORS 3759af2b76b5SMartin Willi }, 3760af2b76b5SMartin Willi } 3761af2b76b5SMartin Willi } 3762af2b76b5SMartin Willi }, { 37635900758dSMartin Willi .alg = "rfc7539esp(chacha20,poly1305)", 37645900758dSMartin Willi .test = alg_test_aead, 37655900758dSMartin Willi .suite = { 37665900758dSMartin Willi .aead = { 37675900758dSMartin Willi .enc = { 37685900758dSMartin Willi .vecs = rfc7539esp_enc_tv_template, 37695900758dSMartin Willi .count = RFC7539ESP_ENC_TEST_VECTORS 37705900758dSMartin Willi }, 37715900758dSMartin Willi .dec = { 37725900758dSMartin Willi .vecs = rfc7539esp_dec_tv_template, 37735900758dSMartin Willi .count = RFC7539ESP_DEC_TEST_VECTORS 37745900758dSMartin Willi }, 37755900758dSMartin Willi } 37765900758dSMartin Willi } 37775900758dSMartin Willi }, { 3778da7f033dSHerbert Xu .alg = "rmd128", 3779da7f033dSHerbert Xu .test = alg_test_hash, 3780da7f033dSHerbert Xu .suite = { 3781da7f033dSHerbert Xu .hash = { 3782da7f033dSHerbert Xu .vecs = rmd128_tv_template, 3783da7f033dSHerbert Xu .count = RMD128_TEST_VECTORS 3784da7f033dSHerbert Xu } 3785da7f033dSHerbert Xu } 3786da7f033dSHerbert Xu }, { 3787da7f033dSHerbert Xu .alg = "rmd160", 3788da7f033dSHerbert Xu .test = alg_test_hash, 3789da7f033dSHerbert Xu .suite = { 3790da7f033dSHerbert Xu .hash = { 3791da7f033dSHerbert Xu .vecs = rmd160_tv_template, 3792da7f033dSHerbert Xu .count = RMD160_TEST_VECTORS 3793da7f033dSHerbert Xu } 3794da7f033dSHerbert Xu } 3795da7f033dSHerbert Xu }, { 3796da7f033dSHerbert Xu .alg = "rmd256", 3797da7f033dSHerbert Xu .test = alg_test_hash, 3798da7f033dSHerbert Xu .suite = { 3799da7f033dSHerbert Xu .hash = { 3800da7f033dSHerbert Xu .vecs = rmd256_tv_template, 3801da7f033dSHerbert Xu .count = RMD256_TEST_VECTORS 3802da7f033dSHerbert Xu } 3803da7f033dSHerbert Xu } 3804da7f033dSHerbert Xu }, { 3805da7f033dSHerbert Xu .alg = "rmd320", 3806da7f033dSHerbert Xu .test = alg_test_hash, 3807da7f033dSHerbert Xu .suite = { 3808da7f033dSHerbert Xu .hash = { 3809da7f033dSHerbert Xu .vecs = rmd320_tv_template, 3810da7f033dSHerbert Xu .count = RMD320_TEST_VECTORS 3811da7f033dSHerbert Xu } 3812da7f033dSHerbert Xu } 3813da7f033dSHerbert Xu }, { 3814946cc463STadeusz Struk .alg = "rsa", 3815946cc463STadeusz Struk .test = alg_test_akcipher, 3816946cc463STadeusz Struk .fips_allowed = 1, 3817946cc463STadeusz Struk .suite = { 3818946cc463STadeusz Struk .akcipher = { 3819946cc463STadeusz Struk .vecs = rsa_tv_template, 3820946cc463STadeusz Struk .count = RSA_TEST_VECTORS 3821946cc463STadeusz Struk } 3822946cc463STadeusz Struk } 3823946cc463STadeusz Struk }, { 3824da7f033dSHerbert Xu .alg = "salsa20", 38251aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3826da7f033dSHerbert Xu .suite = { 3827da7f033dSHerbert Xu .cipher = { 3828da7f033dSHerbert Xu .enc = { 3829da7f033dSHerbert Xu .vecs = salsa20_stream_enc_tv_template, 3830da7f033dSHerbert Xu .count = SALSA20_STREAM_ENC_TEST_VECTORS 3831da7f033dSHerbert Xu } 3832da7f033dSHerbert Xu } 3833da7f033dSHerbert Xu } 3834da7f033dSHerbert Xu }, { 3835da7f033dSHerbert Xu .alg = "sha1", 3836da7f033dSHerbert Xu .test = alg_test_hash, 3837a1915d51SJarod Wilson .fips_allowed = 1, 3838da7f033dSHerbert Xu .suite = { 3839da7f033dSHerbert Xu .hash = { 3840da7f033dSHerbert Xu .vecs = sha1_tv_template, 3841da7f033dSHerbert Xu .count = SHA1_TEST_VECTORS 3842da7f033dSHerbert Xu } 3843da7f033dSHerbert Xu } 3844da7f033dSHerbert Xu }, { 3845da7f033dSHerbert Xu .alg = "sha224", 3846da7f033dSHerbert Xu .test = alg_test_hash, 3847a1915d51SJarod Wilson .fips_allowed = 1, 3848da7f033dSHerbert Xu .suite = { 3849da7f033dSHerbert Xu .hash = { 3850da7f033dSHerbert Xu .vecs = sha224_tv_template, 3851da7f033dSHerbert Xu .count = SHA224_TEST_VECTORS 3852da7f033dSHerbert Xu } 3853da7f033dSHerbert Xu } 3854da7f033dSHerbert Xu }, { 3855da7f033dSHerbert Xu .alg = "sha256", 3856da7f033dSHerbert Xu .test = alg_test_hash, 3857a1915d51SJarod Wilson .fips_allowed = 1, 3858da7f033dSHerbert Xu .suite = { 3859da7f033dSHerbert Xu .hash = { 3860da7f033dSHerbert Xu .vecs = sha256_tv_template, 3861da7f033dSHerbert Xu .count = SHA256_TEST_VECTORS 3862da7f033dSHerbert Xu } 3863da7f033dSHerbert Xu } 3864da7f033dSHerbert Xu }, { 386579cc6ab8Sraveendra padasalagi .alg = "sha3-224", 386679cc6ab8Sraveendra padasalagi .test = alg_test_hash, 386779cc6ab8Sraveendra padasalagi .fips_allowed = 1, 386879cc6ab8Sraveendra padasalagi .suite = { 386979cc6ab8Sraveendra padasalagi .hash = { 387079cc6ab8Sraveendra padasalagi .vecs = sha3_224_tv_template, 387179cc6ab8Sraveendra padasalagi .count = SHA3_224_TEST_VECTORS 387279cc6ab8Sraveendra padasalagi } 387379cc6ab8Sraveendra padasalagi } 387479cc6ab8Sraveendra padasalagi }, { 387579cc6ab8Sraveendra padasalagi .alg = "sha3-256", 387679cc6ab8Sraveendra padasalagi .test = alg_test_hash, 387779cc6ab8Sraveendra padasalagi .fips_allowed = 1, 387879cc6ab8Sraveendra padasalagi .suite = { 387979cc6ab8Sraveendra padasalagi .hash = { 388079cc6ab8Sraveendra padasalagi .vecs = sha3_256_tv_template, 388179cc6ab8Sraveendra padasalagi .count = SHA3_256_TEST_VECTORS 388279cc6ab8Sraveendra padasalagi } 388379cc6ab8Sraveendra padasalagi } 388479cc6ab8Sraveendra padasalagi }, { 388579cc6ab8Sraveendra padasalagi .alg = "sha3-384", 388679cc6ab8Sraveendra padasalagi .test = alg_test_hash, 388779cc6ab8Sraveendra padasalagi .fips_allowed = 1, 388879cc6ab8Sraveendra padasalagi .suite = { 388979cc6ab8Sraveendra padasalagi .hash = { 389079cc6ab8Sraveendra padasalagi .vecs = sha3_384_tv_template, 389179cc6ab8Sraveendra padasalagi .count = SHA3_384_TEST_VECTORS 389279cc6ab8Sraveendra padasalagi } 389379cc6ab8Sraveendra padasalagi } 389479cc6ab8Sraveendra padasalagi }, { 389579cc6ab8Sraveendra padasalagi .alg = "sha3-512", 389679cc6ab8Sraveendra padasalagi .test = alg_test_hash, 389779cc6ab8Sraveendra padasalagi .fips_allowed = 1, 389879cc6ab8Sraveendra padasalagi .suite = { 389979cc6ab8Sraveendra padasalagi .hash = { 390079cc6ab8Sraveendra padasalagi .vecs = sha3_512_tv_template, 390179cc6ab8Sraveendra padasalagi .count = SHA3_512_TEST_VECTORS 390279cc6ab8Sraveendra padasalagi } 390379cc6ab8Sraveendra padasalagi } 390479cc6ab8Sraveendra padasalagi }, { 3905da7f033dSHerbert Xu .alg = "sha384", 3906da7f033dSHerbert Xu .test = alg_test_hash, 3907a1915d51SJarod Wilson .fips_allowed = 1, 3908da7f033dSHerbert Xu .suite = { 3909da7f033dSHerbert Xu .hash = { 3910da7f033dSHerbert Xu .vecs = sha384_tv_template, 3911da7f033dSHerbert Xu .count = SHA384_TEST_VECTORS 3912da7f033dSHerbert Xu } 3913da7f033dSHerbert Xu } 3914da7f033dSHerbert Xu }, { 3915da7f033dSHerbert Xu .alg = "sha512", 3916da7f033dSHerbert Xu .test = alg_test_hash, 3917a1915d51SJarod Wilson .fips_allowed = 1, 3918da7f033dSHerbert Xu .suite = { 3919da7f033dSHerbert Xu .hash = { 3920da7f033dSHerbert Xu .vecs = sha512_tv_template, 3921da7f033dSHerbert Xu .count = SHA512_TEST_VECTORS 3922da7f033dSHerbert Xu } 3923da7f033dSHerbert Xu } 3924da7f033dSHerbert Xu }, { 3925da7f033dSHerbert Xu .alg = "tgr128", 3926da7f033dSHerbert Xu .test = alg_test_hash, 3927da7f033dSHerbert Xu .suite = { 3928da7f033dSHerbert Xu .hash = { 3929da7f033dSHerbert Xu .vecs = tgr128_tv_template, 3930da7f033dSHerbert Xu .count = TGR128_TEST_VECTORS 3931da7f033dSHerbert Xu } 3932da7f033dSHerbert Xu } 3933da7f033dSHerbert Xu }, { 3934da7f033dSHerbert Xu .alg = "tgr160", 3935da7f033dSHerbert Xu .test = alg_test_hash, 3936da7f033dSHerbert Xu .suite = { 3937da7f033dSHerbert Xu .hash = { 3938da7f033dSHerbert Xu .vecs = tgr160_tv_template, 3939da7f033dSHerbert Xu .count = TGR160_TEST_VECTORS 3940da7f033dSHerbert Xu } 3941da7f033dSHerbert Xu } 3942da7f033dSHerbert Xu }, { 3943da7f033dSHerbert Xu .alg = "tgr192", 3944da7f033dSHerbert Xu .test = alg_test_hash, 3945da7f033dSHerbert Xu .suite = { 3946da7f033dSHerbert Xu .hash = { 3947da7f033dSHerbert Xu .vecs = tgr192_tv_template, 3948da7f033dSHerbert Xu .count = TGR192_TEST_VECTORS 3949da7f033dSHerbert Xu } 3950da7f033dSHerbert Xu } 3951da7f033dSHerbert Xu }, { 3952f1939f7cSShane Wang .alg = "vmac(aes)", 3953f1939f7cSShane Wang .test = alg_test_hash, 3954f1939f7cSShane Wang .suite = { 3955f1939f7cSShane Wang .hash = { 3956f1939f7cSShane Wang .vecs = aes_vmac128_tv_template, 3957f1939f7cSShane Wang .count = VMAC_AES_TEST_VECTORS 3958f1939f7cSShane Wang } 3959f1939f7cSShane Wang } 3960f1939f7cSShane Wang }, { 3961da7f033dSHerbert Xu .alg = "wp256", 3962da7f033dSHerbert Xu .test = alg_test_hash, 3963da7f033dSHerbert Xu .suite = { 3964da7f033dSHerbert Xu .hash = { 3965da7f033dSHerbert Xu .vecs = wp256_tv_template, 3966da7f033dSHerbert Xu .count = WP256_TEST_VECTORS 3967da7f033dSHerbert Xu } 3968da7f033dSHerbert Xu } 3969da7f033dSHerbert Xu }, { 3970da7f033dSHerbert Xu .alg = "wp384", 3971da7f033dSHerbert Xu .test = alg_test_hash, 3972da7f033dSHerbert Xu .suite = { 3973da7f033dSHerbert Xu .hash = { 3974da7f033dSHerbert Xu .vecs = wp384_tv_template, 3975da7f033dSHerbert Xu .count = WP384_TEST_VECTORS 3976da7f033dSHerbert Xu } 3977da7f033dSHerbert Xu } 3978da7f033dSHerbert Xu }, { 3979da7f033dSHerbert Xu .alg = "wp512", 3980da7f033dSHerbert Xu .test = alg_test_hash, 3981da7f033dSHerbert Xu .suite = { 3982da7f033dSHerbert Xu .hash = { 3983da7f033dSHerbert Xu .vecs = wp512_tv_template, 3984da7f033dSHerbert Xu .count = WP512_TEST_VECTORS 3985da7f033dSHerbert Xu } 3986da7f033dSHerbert Xu } 3987da7f033dSHerbert Xu }, { 3988da7f033dSHerbert Xu .alg = "xcbc(aes)", 3989da7f033dSHerbert Xu .test = alg_test_hash, 3990da7f033dSHerbert Xu .suite = { 3991da7f033dSHerbert Xu .hash = { 3992da7f033dSHerbert Xu .vecs = aes_xcbc128_tv_template, 3993da7f033dSHerbert Xu .count = XCBC_AES_TEST_VECTORS 3994da7f033dSHerbert Xu } 3995da7f033dSHerbert Xu } 3996da7f033dSHerbert Xu }, { 3997da7f033dSHerbert Xu .alg = "xts(aes)", 39981aa4ecd9SHerbert Xu .test = alg_test_skcipher, 39992918aa8dSJarod Wilson .fips_allowed = 1, 4000da7f033dSHerbert Xu .suite = { 4001da7f033dSHerbert Xu .cipher = { 4002da7f033dSHerbert Xu .enc = { 4003da7f033dSHerbert Xu .vecs = aes_xts_enc_tv_template, 4004da7f033dSHerbert Xu .count = AES_XTS_ENC_TEST_VECTORS 4005da7f033dSHerbert Xu }, 4006da7f033dSHerbert Xu .dec = { 4007da7f033dSHerbert Xu .vecs = aes_xts_dec_tv_template, 4008da7f033dSHerbert Xu .count = AES_XTS_DEC_TEST_VECTORS 4009da7f033dSHerbert Xu } 4010da7f033dSHerbert Xu } 4011da7f033dSHerbert Xu } 40120c01aed5SGeert Uytterhoeven }, { 40130840605eSJussi Kivilinna .alg = "xts(camellia)", 40140840605eSJussi Kivilinna .test = alg_test_skcipher, 40150840605eSJussi Kivilinna .suite = { 40160840605eSJussi Kivilinna .cipher = { 40170840605eSJussi Kivilinna .enc = { 40180840605eSJussi Kivilinna .vecs = camellia_xts_enc_tv_template, 40190840605eSJussi Kivilinna .count = CAMELLIA_XTS_ENC_TEST_VECTORS 40200840605eSJussi Kivilinna }, 40210840605eSJussi Kivilinna .dec = { 40220840605eSJussi Kivilinna .vecs = camellia_xts_dec_tv_template, 40230840605eSJussi Kivilinna .count = CAMELLIA_XTS_DEC_TEST_VECTORS 40240840605eSJussi Kivilinna } 40250840605eSJussi Kivilinna } 40260840605eSJussi Kivilinna } 40270840605eSJussi Kivilinna }, { 40289b8b0405SJohannes Goetzfried .alg = "xts(cast6)", 40299b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 40309b8b0405SJohannes Goetzfried .suite = { 40319b8b0405SJohannes Goetzfried .cipher = { 40329b8b0405SJohannes Goetzfried .enc = { 40339b8b0405SJohannes Goetzfried .vecs = cast6_xts_enc_tv_template, 40349b8b0405SJohannes Goetzfried .count = CAST6_XTS_ENC_TEST_VECTORS 40359b8b0405SJohannes Goetzfried }, 40369b8b0405SJohannes Goetzfried .dec = { 40379b8b0405SJohannes Goetzfried .vecs = cast6_xts_dec_tv_template, 40389b8b0405SJohannes Goetzfried .count = CAST6_XTS_DEC_TEST_VECTORS 40399b8b0405SJohannes Goetzfried } 40409b8b0405SJohannes Goetzfried } 40419b8b0405SJohannes Goetzfried } 40429b8b0405SJohannes Goetzfried }, { 404318be20b9SJussi Kivilinna .alg = "xts(serpent)", 404418be20b9SJussi Kivilinna .test = alg_test_skcipher, 404518be20b9SJussi Kivilinna .suite = { 404618be20b9SJussi Kivilinna .cipher = { 404718be20b9SJussi Kivilinna .enc = { 404818be20b9SJussi Kivilinna .vecs = serpent_xts_enc_tv_template, 404918be20b9SJussi Kivilinna .count = SERPENT_XTS_ENC_TEST_VECTORS 405018be20b9SJussi Kivilinna }, 405118be20b9SJussi Kivilinna .dec = { 405218be20b9SJussi Kivilinna .vecs = serpent_xts_dec_tv_template, 405318be20b9SJussi Kivilinna .count = SERPENT_XTS_DEC_TEST_VECTORS 405418be20b9SJussi Kivilinna } 405518be20b9SJussi Kivilinna } 405618be20b9SJussi Kivilinna } 405718be20b9SJussi Kivilinna }, { 4058aed265b9SJussi Kivilinna .alg = "xts(twofish)", 4059aed265b9SJussi Kivilinna .test = alg_test_skcipher, 4060aed265b9SJussi Kivilinna .suite = { 4061aed265b9SJussi Kivilinna .cipher = { 4062aed265b9SJussi Kivilinna .enc = { 4063aed265b9SJussi Kivilinna .vecs = tf_xts_enc_tv_template, 4064aed265b9SJussi Kivilinna .count = TF_XTS_ENC_TEST_VECTORS 4065aed265b9SJussi Kivilinna }, 4066aed265b9SJussi Kivilinna .dec = { 4067aed265b9SJussi Kivilinna .vecs = tf_xts_dec_tv_template, 4068aed265b9SJussi Kivilinna .count = TF_XTS_DEC_TEST_VECTORS 4069aed265b9SJussi Kivilinna } 4070aed265b9SJussi Kivilinna } 4071aed265b9SJussi Kivilinna } 4072da7f033dSHerbert Xu } 4073da7f033dSHerbert Xu }; 4074da7f033dSHerbert Xu 40755714758bSJussi Kivilinna static bool alg_test_descs_checked; 40765714758bSJussi Kivilinna 40775714758bSJussi Kivilinna static void alg_test_descs_check_order(void) 40785714758bSJussi Kivilinna { 40795714758bSJussi Kivilinna int i; 40805714758bSJussi Kivilinna 40815714758bSJussi Kivilinna /* only check once */ 40825714758bSJussi Kivilinna if (alg_test_descs_checked) 40835714758bSJussi Kivilinna return; 40845714758bSJussi Kivilinna 40855714758bSJussi Kivilinna alg_test_descs_checked = true; 40865714758bSJussi Kivilinna 40875714758bSJussi Kivilinna for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) { 40885714758bSJussi Kivilinna int diff = strcmp(alg_test_descs[i - 1].alg, 40895714758bSJussi Kivilinna alg_test_descs[i].alg); 40905714758bSJussi Kivilinna 40915714758bSJussi Kivilinna if (WARN_ON(diff > 0)) { 40925714758bSJussi Kivilinna pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n", 40935714758bSJussi Kivilinna alg_test_descs[i - 1].alg, 40945714758bSJussi Kivilinna alg_test_descs[i].alg); 40955714758bSJussi Kivilinna } 40965714758bSJussi Kivilinna 40975714758bSJussi Kivilinna if (WARN_ON(diff == 0)) { 40985714758bSJussi Kivilinna pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n", 40995714758bSJussi Kivilinna alg_test_descs[i].alg); 41005714758bSJussi Kivilinna } 41015714758bSJussi Kivilinna } 41025714758bSJussi Kivilinna } 41035714758bSJussi Kivilinna 41041aa4ecd9SHerbert Xu static int alg_find_test(const char *alg) 4105da7f033dSHerbert Xu { 4106da7f033dSHerbert Xu int start = 0; 4107da7f033dSHerbert Xu int end = ARRAY_SIZE(alg_test_descs); 4108da7f033dSHerbert Xu 4109da7f033dSHerbert Xu while (start < end) { 4110da7f033dSHerbert Xu int i = (start + end) / 2; 4111da7f033dSHerbert Xu int diff = strcmp(alg_test_descs[i].alg, alg); 4112da7f033dSHerbert Xu 4113da7f033dSHerbert Xu if (diff > 0) { 4114da7f033dSHerbert Xu end = i; 4115da7f033dSHerbert Xu continue; 4116da7f033dSHerbert Xu } 4117da7f033dSHerbert Xu 4118da7f033dSHerbert Xu if (diff < 0) { 4119da7f033dSHerbert Xu start = i + 1; 4120da7f033dSHerbert Xu continue; 4121da7f033dSHerbert Xu } 4122da7f033dSHerbert Xu 41231aa4ecd9SHerbert Xu return i; 4124da7f033dSHerbert Xu } 4125da7f033dSHerbert Xu 41261aa4ecd9SHerbert Xu return -1; 41271aa4ecd9SHerbert Xu } 41281aa4ecd9SHerbert Xu 41291aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 41301aa4ecd9SHerbert Xu { 41311aa4ecd9SHerbert Xu int i; 4132a68f6610SHerbert Xu int j; 4133d12d6b6dSNeil Horman int rc; 41341aa4ecd9SHerbert Xu 41359e5c9fe4SRichard W.M. Jones if (!fips_enabled && notests) { 41369e5c9fe4SRichard W.M. Jones printk_once(KERN_INFO "alg: self-tests disabled\n"); 41379e5c9fe4SRichard W.M. Jones return 0; 41389e5c9fe4SRichard W.M. Jones } 41399e5c9fe4SRichard W.M. Jones 41405714758bSJussi Kivilinna alg_test_descs_check_order(); 41415714758bSJussi Kivilinna 41421aa4ecd9SHerbert Xu if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) { 41431aa4ecd9SHerbert Xu char nalg[CRYPTO_MAX_ALG_NAME]; 41441aa4ecd9SHerbert Xu 41451aa4ecd9SHerbert Xu if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >= 41461aa4ecd9SHerbert Xu sizeof(nalg)) 41471aa4ecd9SHerbert Xu return -ENAMETOOLONG; 41481aa4ecd9SHerbert Xu 41491aa4ecd9SHerbert Xu i = alg_find_test(nalg); 41501aa4ecd9SHerbert Xu if (i < 0) 41511aa4ecd9SHerbert Xu goto notest; 41521aa4ecd9SHerbert Xu 4153a3bef3a3SJarod Wilson if (fips_enabled && !alg_test_descs[i].fips_allowed) 4154a3bef3a3SJarod Wilson goto non_fips_alg; 4155a3bef3a3SJarod Wilson 4156941fb328SJarod Wilson rc = alg_test_cipher(alg_test_descs + i, driver, type, mask); 4157941fb328SJarod Wilson goto test_done; 41581aa4ecd9SHerbert Xu } 41591aa4ecd9SHerbert Xu 41601aa4ecd9SHerbert Xu i = alg_find_test(alg); 4161a68f6610SHerbert Xu j = alg_find_test(driver); 4162a68f6610SHerbert Xu if (i < 0 && j < 0) 41631aa4ecd9SHerbert Xu goto notest; 41641aa4ecd9SHerbert Xu 4165a68f6610SHerbert Xu if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) || 4166a68f6610SHerbert Xu (j >= 0 && !alg_test_descs[j].fips_allowed))) 4167a3bef3a3SJarod Wilson goto non_fips_alg; 4168a3bef3a3SJarod Wilson 4169a68f6610SHerbert Xu rc = 0; 4170a68f6610SHerbert Xu if (i >= 0) 4171a68f6610SHerbert Xu rc |= alg_test_descs[i].test(alg_test_descs + i, driver, 41721aa4ecd9SHerbert Xu type, mask); 4173032c8cacSCristian Stoica if (j >= 0 && j != i) 4174a68f6610SHerbert Xu rc |= alg_test_descs[j].test(alg_test_descs + j, driver, 4175a68f6610SHerbert Xu type, mask); 4176a68f6610SHerbert Xu 4177941fb328SJarod Wilson test_done: 4178d12d6b6dSNeil Horman if (fips_enabled && rc) 4179d12d6b6dSNeil Horman panic("%s: %s alg self test failed in fips mode!\n", driver, alg); 4180d12d6b6dSNeil Horman 418129ecd4abSJarod Wilson if (fips_enabled && !rc) 41823e8cffd4SMasanari Iida pr_info("alg: self-tests for %s (%s) passed\n", driver, alg); 418329ecd4abSJarod Wilson 4184d12d6b6dSNeil Horman return rc; 41851aa4ecd9SHerbert Xu 41861aa4ecd9SHerbert Xu notest: 4187da7f033dSHerbert Xu printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver); 4188da7f033dSHerbert Xu return 0; 4189a3bef3a3SJarod Wilson non_fips_alg: 4190a3bef3a3SJarod Wilson return -EINVAL; 4191da7f033dSHerbert Xu } 41920b767f96SAlexander Shishkin 4193326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */ 41940b767f96SAlexander Shishkin 4195da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test); 4196