1da7f033dSHerbert Xu /* 2da7f033dSHerbert Xu * Algorithm testing framework and tests. 3da7f033dSHerbert Xu * 4da7f033dSHerbert Xu * Copyright (c) 2002 James Morris <jmorris@intercode.com.au> 5da7f033dSHerbert Xu * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org> 6da7f033dSHerbert Xu * Copyright (c) 2007 Nokia Siemens Networks 7da7f033dSHerbert Xu * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au> 8da7f033dSHerbert Xu * 969435b94SAdrian Hoban * Updated RFC4106 AES-GCM testing. 1069435b94SAdrian Hoban * Authors: Aidan O'Mahony (aidan.o.mahony@intel.com) 1169435b94SAdrian Hoban * Adrian Hoban <adrian.hoban@intel.com> 1269435b94SAdrian Hoban * Gabriele Paoloni <gabriele.paoloni@intel.com> 1369435b94SAdrian Hoban * Tadeusz Struk (tadeusz.struk@intel.com) 1469435b94SAdrian Hoban * Copyright (c) 2010, Intel Corporation. 1569435b94SAdrian Hoban * 16da7f033dSHerbert Xu * This program is free software; you can redistribute it and/or modify it 17da7f033dSHerbert Xu * under the terms of the GNU General Public License as published by the Free 18da7f033dSHerbert Xu * Software Foundation; either version 2 of the License, or (at your option) 19da7f033dSHerbert Xu * any later version. 20da7f033dSHerbert Xu * 21da7f033dSHerbert Xu */ 22da7f033dSHerbert Xu 231ce33115SHerbert Xu #include <crypto/aead.h> 24da7f033dSHerbert Xu #include <crypto/hash.h> 2512773d93SHerbert Xu #include <crypto/skcipher.h> 26da7f033dSHerbert Xu #include <linux/err.h> 271c41b882SHerbert Xu #include <linux/fips.h> 28da7f033dSHerbert Xu #include <linux/module.h> 29da7f033dSHerbert Xu #include <linux/scatterlist.h> 30da7f033dSHerbert Xu #include <linux/slab.h> 31da7f033dSHerbert Xu #include <linux/string.h> 327647d6ceSJarod Wilson #include <crypto/rng.h> 3364d1cdfbSStephan Mueller #include <crypto/drbg.h> 34946cc463STadeusz Struk #include <crypto/akcipher.h> 35da7f033dSHerbert Xu 36da7f033dSHerbert Xu #include "internal.h" 370b767f96SAlexander Shishkin 389e5c9fe4SRichard W.M. Jones static bool notests; 399e5c9fe4SRichard W.M. Jones module_param(notests, bool, 0644); 409e5c9fe4SRichard W.M. Jones MODULE_PARM_DESC(notests, "disable crypto self-tests"); 419e5c9fe4SRichard W.M. Jones 42326a6346SHerbert Xu #ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS 430b767f96SAlexander Shishkin 440b767f96SAlexander Shishkin /* a perfect nop */ 450b767f96SAlexander Shishkin int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 460b767f96SAlexander Shishkin { 470b767f96SAlexander Shishkin return 0; 480b767f96SAlexander Shishkin } 490b767f96SAlexander Shishkin 500b767f96SAlexander Shishkin #else 510b767f96SAlexander Shishkin 52da7f033dSHerbert Xu #include "testmgr.h" 53da7f033dSHerbert Xu 54da7f033dSHerbert Xu /* 55da7f033dSHerbert Xu * Need slab memory for testing (size in number of pages). 56da7f033dSHerbert Xu */ 57da7f033dSHerbert Xu #define XBUFSIZE 8 58da7f033dSHerbert Xu 59da7f033dSHerbert Xu /* 60da7f033dSHerbert Xu * Indexes into the xbuf to simulate cross-page access. 61da7f033dSHerbert Xu */ 62da7f033dSHerbert Xu #define IDX1 32 63da7f033dSHerbert Xu #define IDX2 32400 64da7f033dSHerbert Xu #define IDX3 1 65da7f033dSHerbert Xu #define IDX4 8193 66da7f033dSHerbert Xu #define IDX5 22222 67da7f033dSHerbert Xu #define IDX6 17101 68da7f033dSHerbert Xu #define IDX7 27333 69da7f033dSHerbert Xu #define IDX8 3000 70da7f033dSHerbert Xu 71da7f033dSHerbert Xu /* 72da7f033dSHerbert Xu * Used by test_cipher() 73da7f033dSHerbert Xu */ 74da7f033dSHerbert Xu #define ENCRYPT 1 75da7f033dSHerbert Xu #define DECRYPT 0 76da7f033dSHerbert Xu 77da7f033dSHerbert Xu struct tcrypt_result { 78da7f033dSHerbert Xu struct completion completion; 79da7f033dSHerbert Xu int err; 80da7f033dSHerbert Xu }; 81da7f033dSHerbert Xu 82da7f033dSHerbert Xu struct aead_test_suite { 83da7f033dSHerbert Xu struct { 84da7f033dSHerbert Xu struct aead_testvec *vecs; 85da7f033dSHerbert Xu unsigned int count; 86da7f033dSHerbert Xu } enc, dec; 87da7f033dSHerbert Xu }; 88da7f033dSHerbert Xu 89da7f033dSHerbert Xu struct cipher_test_suite { 90da7f033dSHerbert Xu struct { 91da7f033dSHerbert Xu struct cipher_testvec *vecs; 92da7f033dSHerbert Xu unsigned int count; 93da7f033dSHerbert Xu } enc, dec; 94da7f033dSHerbert Xu }; 95da7f033dSHerbert Xu 96da7f033dSHerbert Xu struct comp_test_suite { 97da7f033dSHerbert Xu struct { 98da7f033dSHerbert Xu struct comp_testvec *vecs; 99da7f033dSHerbert Xu unsigned int count; 100da7f033dSHerbert Xu } comp, decomp; 101da7f033dSHerbert Xu }; 102da7f033dSHerbert Xu 103da7f033dSHerbert Xu struct hash_test_suite { 104da7f033dSHerbert Xu struct hash_testvec *vecs; 105da7f033dSHerbert Xu unsigned int count; 106da7f033dSHerbert Xu }; 107da7f033dSHerbert Xu 1087647d6ceSJarod Wilson struct cprng_test_suite { 1097647d6ceSJarod Wilson struct cprng_testvec *vecs; 1107647d6ceSJarod Wilson unsigned int count; 1117647d6ceSJarod Wilson }; 1127647d6ceSJarod Wilson 11364d1cdfbSStephan Mueller struct drbg_test_suite { 11464d1cdfbSStephan Mueller struct drbg_testvec *vecs; 11564d1cdfbSStephan Mueller unsigned int count; 11664d1cdfbSStephan Mueller }; 11764d1cdfbSStephan Mueller 118946cc463STadeusz Struk struct akcipher_test_suite { 119946cc463STadeusz Struk struct akcipher_testvec *vecs; 120946cc463STadeusz Struk unsigned int count; 121946cc463STadeusz Struk }; 122946cc463STadeusz Struk 123da7f033dSHerbert Xu struct alg_test_desc { 124da7f033dSHerbert Xu const char *alg; 125da7f033dSHerbert Xu int (*test)(const struct alg_test_desc *desc, const char *driver, 126da7f033dSHerbert Xu u32 type, u32 mask); 127a1915d51SJarod Wilson int fips_allowed; /* set if alg is allowed in fips mode */ 128da7f033dSHerbert Xu 129da7f033dSHerbert Xu union { 130da7f033dSHerbert Xu struct aead_test_suite aead; 131da7f033dSHerbert Xu struct cipher_test_suite cipher; 132da7f033dSHerbert Xu struct comp_test_suite comp; 133da7f033dSHerbert Xu struct hash_test_suite hash; 1347647d6ceSJarod Wilson struct cprng_test_suite cprng; 13564d1cdfbSStephan Mueller struct drbg_test_suite drbg; 136946cc463STadeusz Struk struct akcipher_test_suite akcipher; 137da7f033dSHerbert Xu } suite; 138da7f033dSHerbert Xu }; 139da7f033dSHerbert Xu 140da7f033dSHerbert Xu static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 }; 141da7f033dSHerbert Xu 142da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len) 143da7f033dSHerbert Xu { 144da7f033dSHerbert Xu print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET, 145da7f033dSHerbert Xu 16, 1, 146da7f033dSHerbert Xu buf, len, false); 147da7f033dSHerbert Xu } 148da7f033dSHerbert Xu 149da7f033dSHerbert Xu static void tcrypt_complete(struct crypto_async_request *req, int err) 150da7f033dSHerbert Xu { 151da7f033dSHerbert Xu struct tcrypt_result *res = req->data; 152da7f033dSHerbert Xu 153da7f033dSHerbert Xu if (err == -EINPROGRESS) 154da7f033dSHerbert Xu return; 155da7f033dSHerbert Xu 156da7f033dSHerbert Xu res->err = err; 157da7f033dSHerbert Xu complete(&res->completion); 158da7f033dSHerbert Xu } 159da7f033dSHerbert Xu 160f8b0d4d0SHerbert Xu static int testmgr_alloc_buf(char *buf[XBUFSIZE]) 161f8b0d4d0SHerbert Xu { 162f8b0d4d0SHerbert Xu int i; 163f8b0d4d0SHerbert Xu 164f8b0d4d0SHerbert Xu for (i = 0; i < XBUFSIZE; i++) { 165f8b0d4d0SHerbert Xu buf[i] = (void *)__get_free_page(GFP_KERNEL); 166f8b0d4d0SHerbert Xu if (!buf[i]) 167f8b0d4d0SHerbert Xu goto err_free_buf; 168f8b0d4d0SHerbert Xu } 169f8b0d4d0SHerbert Xu 170f8b0d4d0SHerbert Xu return 0; 171f8b0d4d0SHerbert Xu 172f8b0d4d0SHerbert Xu err_free_buf: 173f8b0d4d0SHerbert Xu while (i-- > 0) 174f8b0d4d0SHerbert Xu free_page((unsigned long)buf[i]); 175f8b0d4d0SHerbert Xu 176f8b0d4d0SHerbert Xu return -ENOMEM; 177f8b0d4d0SHerbert Xu } 178f8b0d4d0SHerbert Xu 179f8b0d4d0SHerbert Xu static void testmgr_free_buf(char *buf[XBUFSIZE]) 180f8b0d4d0SHerbert Xu { 181f8b0d4d0SHerbert Xu int i; 182f8b0d4d0SHerbert Xu 183f8b0d4d0SHerbert Xu for (i = 0; i < XBUFSIZE; i++) 184f8b0d4d0SHerbert Xu free_page((unsigned long)buf[i]); 185f8b0d4d0SHerbert Xu } 186f8b0d4d0SHerbert Xu 187d4c85f9bSCristian Stoica static int wait_async_op(struct tcrypt_result *tr, int ret) 188a8f1a052SDavid S. Miller { 189a8f1a052SDavid S. Miller if (ret == -EINPROGRESS || ret == -EBUSY) { 1908a45ac12SRabin Vincent wait_for_completion(&tr->completion); 19116735d02SWolfram Sang reinit_completion(&tr->completion); 1928a45ac12SRabin Vincent ret = tr->err; 193a8f1a052SDavid S. Miller } 194a8f1a052SDavid S. Miller return ret; 195a8f1a052SDavid S. Miller } 196a8f1a052SDavid S. Miller 197018ba95cSWang, Rui Y static int ahash_partial_update(struct ahash_request **preq, 198018ba95cSWang, Rui Y struct crypto_ahash *tfm, struct hash_testvec *template, 199018ba95cSWang, Rui Y void *hash_buff, int k, int temp, struct scatterlist *sg, 200018ba95cSWang, Rui Y const char *algo, char *result, struct tcrypt_result *tresult) 201018ba95cSWang, Rui Y { 202018ba95cSWang, Rui Y char *state; 203018ba95cSWang, Rui Y struct ahash_request *req; 204018ba95cSWang, Rui Y int statesize, ret = -EINVAL; 205018ba95cSWang, Rui Y 206018ba95cSWang, Rui Y req = *preq; 207018ba95cSWang, Rui Y statesize = crypto_ahash_statesize( 208018ba95cSWang, Rui Y crypto_ahash_reqtfm(req)); 209018ba95cSWang, Rui Y state = kmalloc(statesize, GFP_KERNEL); 210018ba95cSWang, Rui Y if (!state) { 211018ba95cSWang, Rui Y pr_err("alt: hash: Failed to alloc state for %s\n", algo); 212018ba95cSWang, Rui Y goto out_nostate; 213018ba95cSWang, Rui Y } 214018ba95cSWang, Rui Y ret = crypto_ahash_export(req, state); 215018ba95cSWang, Rui Y if (ret) { 216018ba95cSWang, Rui Y pr_err("alt: hash: Failed to export() for %s\n", algo); 217018ba95cSWang, Rui Y goto out; 218018ba95cSWang, Rui Y } 219018ba95cSWang, Rui Y ahash_request_free(req); 220018ba95cSWang, Rui Y req = ahash_request_alloc(tfm, GFP_KERNEL); 221018ba95cSWang, Rui Y if (!req) { 222018ba95cSWang, Rui Y pr_err("alg: hash: Failed to alloc request for %s\n", algo); 223018ba95cSWang, Rui Y goto out_noreq; 224018ba95cSWang, Rui Y } 225018ba95cSWang, Rui Y ahash_request_set_callback(req, 226018ba95cSWang, Rui Y CRYPTO_TFM_REQ_MAY_BACKLOG, 227018ba95cSWang, Rui Y tcrypt_complete, tresult); 228018ba95cSWang, Rui Y 229018ba95cSWang, Rui Y memcpy(hash_buff, template->plaintext + temp, 230018ba95cSWang, Rui Y template->tap[k]); 231018ba95cSWang, Rui Y sg_init_one(&sg[0], hash_buff, template->tap[k]); 232018ba95cSWang, Rui Y ahash_request_set_crypt(req, sg, result, template->tap[k]); 233018ba95cSWang, Rui Y ret = crypto_ahash_import(req, state); 234018ba95cSWang, Rui Y if (ret) { 235018ba95cSWang, Rui Y pr_err("alg: hash: Failed to import() for %s\n", algo); 236018ba95cSWang, Rui Y goto out; 237018ba95cSWang, Rui Y } 238018ba95cSWang, Rui Y ret = wait_async_op(tresult, crypto_ahash_update(req)); 239018ba95cSWang, Rui Y if (ret) 240018ba95cSWang, Rui Y goto out; 241018ba95cSWang, Rui Y *preq = req; 242018ba95cSWang, Rui Y ret = 0; 243018ba95cSWang, Rui Y goto out_noreq; 244018ba95cSWang, Rui Y out: 245018ba95cSWang, Rui Y ahash_request_free(req); 246018ba95cSWang, Rui Y out_noreq: 247018ba95cSWang, Rui Y kfree(state); 248018ba95cSWang, Rui Y out_nostate: 249018ba95cSWang, Rui Y return ret; 250018ba95cSWang, Rui Y } 251018ba95cSWang, Rui Y 252da5ffe11SJussi Kivilinna static int __test_hash(struct crypto_ahash *tfm, struct hash_testvec *template, 253da5ffe11SJussi Kivilinna unsigned int tcount, bool use_digest, 254da5ffe11SJussi Kivilinna const int align_offset) 255da7f033dSHerbert Xu { 256da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm)); 257da7f033dSHerbert Xu unsigned int i, j, k, temp; 258da7f033dSHerbert Xu struct scatterlist sg[8]; 25929b77e5dSHoria Geanta char *result; 26029b77e5dSHoria Geanta char *key; 261da7f033dSHerbert Xu struct ahash_request *req; 262da7f033dSHerbert Xu struct tcrypt_result tresult; 263da7f033dSHerbert Xu void *hash_buff; 264f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 265f8b0d4d0SHerbert Xu int ret = -ENOMEM; 266f8b0d4d0SHerbert Xu 26729b77e5dSHoria Geanta result = kmalloc(MAX_DIGEST_SIZE, GFP_KERNEL); 26829b77e5dSHoria Geanta if (!result) 26929b77e5dSHoria Geanta return ret; 27029b77e5dSHoria Geanta key = kmalloc(MAX_KEYLEN, GFP_KERNEL); 27129b77e5dSHoria Geanta if (!key) 27229b77e5dSHoria Geanta goto out_nobuf; 273f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 274f8b0d4d0SHerbert Xu goto out_nobuf; 275da7f033dSHerbert Xu 276da7f033dSHerbert Xu init_completion(&tresult.completion); 277da7f033dSHerbert Xu 278da7f033dSHerbert Xu req = ahash_request_alloc(tfm, GFP_KERNEL); 279da7f033dSHerbert Xu if (!req) { 280da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to allocate request for " 281da7f033dSHerbert Xu "%s\n", algo); 282da7f033dSHerbert Xu goto out_noreq; 283da7f033dSHerbert Xu } 284da7f033dSHerbert Xu ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 285da7f033dSHerbert Xu tcrypt_complete, &tresult); 286da7f033dSHerbert Xu 287a0cfae59SHerbert Xu j = 0; 288da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 289a0cfae59SHerbert Xu if (template[i].np) 290a0cfae59SHerbert Xu continue; 291a0cfae59SHerbert Xu 292da5ffe11SJussi Kivilinna ret = -EINVAL; 293da5ffe11SJussi Kivilinna if (WARN_ON(align_offset + template[i].psize > PAGE_SIZE)) 294da5ffe11SJussi Kivilinna goto out; 295da5ffe11SJussi Kivilinna 296a0cfae59SHerbert Xu j++; 29729b77e5dSHoria Geanta memset(result, 0, MAX_DIGEST_SIZE); 298da7f033dSHerbert Xu 299da7f033dSHerbert Xu hash_buff = xbuf[0]; 300da5ffe11SJussi Kivilinna hash_buff += align_offset; 301da7f033dSHerbert Xu 302da7f033dSHerbert Xu memcpy(hash_buff, template[i].plaintext, template[i].psize); 303da7f033dSHerbert Xu sg_init_one(&sg[0], hash_buff, template[i].psize); 304da7f033dSHerbert Xu 305da7f033dSHerbert Xu if (template[i].ksize) { 306da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 30729b77e5dSHoria Geanta if (template[i].ksize > MAX_KEYLEN) { 30829b77e5dSHoria Geanta pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n", 30929b77e5dSHoria Geanta j, algo, template[i].ksize, MAX_KEYLEN); 31029b77e5dSHoria Geanta ret = -EINVAL; 31129b77e5dSHoria Geanta goto out; 31229b77e5dSHoria Geanta } 31329b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].ksize); 31429b77e5dSHoria Geanta ret = crypto_ahash_setkey(tfm, key, template[i].ksize); 315da7f033dSHerbert Xu if (ret) { 316da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey failed on " 317a0cfae59SHerbert Xu "test %d for %s: ret=%d\n", j, algo, 318da7f033dSHerbert Xu -ret); 319da7f033dSHerbert Xu goto out; 320da7f033dSHerbert Xu } 321da7f033dSHerbert Xu } 322da7f033dSHerbert Xu 323da7f033dSHerbert Xu ahash_request_set_crypt(req, sg, result, template[i].psize); 324a8f1a052SDavid S. Miller if (use_digest) { 325d4c85f9bSCristian Stoica ret = wait_async_op(&tresult, crypto_ahash_digest(req)); 326a8f1a052SDavid S. Miller if (ret) { 327a8f1a052SDavid S. Miller pr_err("alg: hash: digest failed on test %d " 328a0cfae59SHerbert Xu "for %s: ret=%d\n", j, algo, -ret); 329da7f033dSHerbert Xu goto out; 330da7f033dSHerbert Xu } 331a8f1a052SDavid S. Miller } else { 332d4c85f9bSCristian Stoica ret = wait_async_op(&tresult, crypto_ahash_init(req)); 333a8f1a052SDavid S. Miller if (ret) { 334a8f1a052SDavid S. Miller pr_err("alt: hash: init failed on test %d " 335a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 336a8f1a052SDavid S. Miller goto out; 337a8f1a052SDavid S. Miller } 338d4c85f9bSCristian Stoica ret = wait_async_op(&tresult, crypto_ahash_update(req)); 339a8f1a052SDavid S. Miller if (ret) { 340a8f1a052SDavid S. Miller pr_err("alt: hash: update failed on test %d " 341a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 342a8f1a052SDavid S. Miller goto out; 343a8f1a052SDavid S. Miller } 344d4c85f9bSCristian Stoica ret = wait_async_op(&tresult, crypto_ahash_final(req)); 345a8f1a052SDavid S. Miller if (ret) { 346a8f1a052SDavid S. Miller pr_err("alt: hash: final failed on test %d " 347a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 348a8f1a052SDavid S. Miller goto out; 349a8f1a052SDavid S. Miller } 350a8f1a052SDavid S. Miller } 351da7f033dSHerbert Xu 352da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 353da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 354da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Test %d failed for %s\n", 355a0cfae59SHerbert Xu j, algo); 356da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 357da7f033dSHerbert Xu ret = -EINVAL; 358da7f033dSHerbert Xu goto out; 359da7f033dSHerbert Xu } 360da7f033dSHerbert Xu } 361da7f033dSHerbert Xu 362da7f033dSHerbert Xu j = 0; 363da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 364da5ffe11SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 365da5ffe11SJussi Kivilinna if (align_offset != 0) 366da5ffe11SJussi Kivilinna break; 367da5ffe11SJussi Kivilinna 3685f2b424eSCristian Stoica if (!template[i].np) 3695f2b424eSCristian Stoica continue; 3705f2b424eSCristian Stoica 371da7f033dSHerbert Xu j++; 37229b77e5dSHoria Geanta memset(result, 0, MAX_DIGEST_SIZE); 373da7f033dSHerbert Xu 374da7f033dSHerbert Xu temp = 0; 375da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 376fd57f22aSHerbert Xu ret = -EINVAL; 377da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 378fd57f22aSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 379fd57f22aSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 380fd57f22aSHerbert Xu goto out; 381da7f033dSHerbert Xu sg_set_buf(&sg[k], 382da7f033dSHerbert Xu memcpy(xbuf[IDX[k] >> PAGE_SHIFT] + 383da7f033dSHerbert Xu offset_in_page(IDX[k]), 384da7f033dSHerbert Xu template[i].plaintext + temp, 385da7f033dSHerbert Xu template[i].tap[k]), 386da7f033dSHerbert Xu template[i].tap[k]); 387da7f033dSHerbert Xu temp += template[i].tap[k]; 388da7f033dSHerbert Xu } 389da7f033dSHerbert Xu 390da7f033dSHerbert Xu if (template[i].ksize) { 39129b77e5dSHoria Geanta if (template[i].ksize > MAX_KEYLEN) { 39229b77e5dSHoria Geanta pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n", 3935f2b424eSCristian Stoica j, algo, template[i].ksize, MAX_KEYLEN); 39429b77e5dSHoria Geanta ret = -EINVAL; 39529b77e5dSHoria Geanta goto out; 39629b77e5dSHoria Geanta } 397da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 39829b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].ksize); 3995f2b424eSCristian Stoica ret = crypto_ahash_setkey(tfm, key, template[i].ksize); 400da7f033dSHerbert Xu 401da7f033dSHerbert Xu if (ret) { 402da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey " 403da7f033dSHerbert Xu "failed on chunking test %d " 4045f2b424eSCristian Stoica "for %s: ret=%d\n", j, algo, -ret); 405da7f033dSHerbert Xu goto out; 406da7f033dSHerbert Xu } 407da7f033dSHerbert Xu } 408da7f033dSHerbert Xu 4095f2b424eSCristian Stoica ahash_request_set_crypt(req, sg, result, template[i].psize); 410da7f033dSHerbert Xu ret = crypto_ahash_digest(req); 411da7f033dSHerbert Xu switch (ret) { 412da7f033dSHerbert Xu case 0: 413da7f033dSHerbert Xu break; 414da7f033dSHerbert Xu case -EINPROGRESS: 415da7f033dSHerbert Xu case -EBUSY: 4168a45ac12SRabin Vincent wait_for_completion(&tresult.completion); 41716735d02SWolfram Sang reinit_completion(&tresult.completion); 4188a45ac12SRabin Vincent ret = tresult.err; 4198a45ac12SRabin Vincent if (!ret) 420da7f033dSHerbert Xu break; 421da7f033dSHerbert Xu /* fall through */ 422da7f033dSHerbert Xu default: 423da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: digest failed " 424da7f033dSHerbert Xu "on chunking test %d for %s: " 425da7f033dSHerbert Xu "ret=%d\n", j, algo, -ret); 426da7f033dSHerbert Xu goto out; 427da7f033dSHerbert Xu } 428da7f033dSHerbert Xu 429da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 430da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 431da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Chunking test %d " 432da7f033dSHerbert Xu "failed for %s\n", j, algo); 433da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 434da7f033dSHerbert Xu ret = -EINVAL; 435da7f033dSHerbert Xu goto out; 436da7f033dSHerbert Xu } 437da7f033dSHerbert Xu } 438da7f033dSHerbert Xu 439018ba95cSWang, Rui Y /* partial update exercise */ 440018ba95cSWang, Rui Y j = 0; 441018ba95cSWang, Rui Y for (i = 0; i < tcount; i++) { 442018ba95cSWang, Rui Y /* alignment tests are only done with continuous buffers */ 443018ba95cSWang, Rui Y if (align_offset != 0) 444018ba95cSWang, Rui Y break; 445018ba95cSWang, Rui Y 446018ba95cSWang, Rui Y if (template[i].np < 2) 447018ba95cSWang, Rui Y continue; 448018ba95cSWang, Rui Y 449018ba95cSWang, Rui Y j++; 450018ba95cSWang, Rui Y memset(result, 0, MAX_DIGEST_SIZE); 451018ba95cSWang, Rui Y 452018ba95cSWang, Rui Y ret = -EINVAL; 453018ba95cSWang, Rui Y hash_buff = xbuf[0]; 454018ba95cSWang, Rui Y memcpy(hash_buff, template[i].plaintext, 455018ba95cSWang, Rui Y template[i].tap[0]); 456018ba95cSWang, Rui Y sg_init_one(&sg[0], hash_buff, template[i].tap[0]); 457018ba95cSWang, Rui Y 458018ba95cSWang, Rui Y if (template[i].ksize) { 459018ba95cSWang, Rui Y crypto_ahash_clear_flags(tfm, ~0); 460018ba95cSWang, Rui Y if (template[i].ksize > MAX_KEYLEN) { 461018ba95cSWang, Rui Y pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n", 462018ba95cSWang, Rui Y j, algo, template[i].ksize, MAX_KEYLEN); 463018ba95cSWang, Rui Y ret = -EINVAL; 464018ba95cSWang, Rui Y goto out; 465018ba95cSWang, Rui Y } 466018ba95cSWang, Rui Y memcpy(key, template[i].key, template[i].ksize); 467018ba95cSWang, Rui Y ret = crypto_ahash_setkey(tfm, key, template[i].ksize); 468018ba95cSWang, Rui Y if (ret) { 469018ba95cSWang, Rui Y pr_err("alg: hash: setkey failed on test %d for %s: ret=%d\n", 470018ba95cSWang, Rui Y j, algo, -ret); 471018ba95cSWang, Rui Y goto out; 472018ba95cSWang, Rui Y } 473018ba95cSWang, Rui Y } 474018ba95cSWang, Rui Y 475018ba95cSWang, Rui Y ahash_request_set_crypt(req, sg, result, template[i].tap[0]); 476018ba95cSWang, Rui Y ret = wait_async_op(&tresult, crypto_ahash_init(req)); 477018ba95cSWang, Rui Y if (ret) { 478018ba95cSWang, Rui Y pr_err("alt: hash: init failed on test %d for %s: ret=%d\n", 479018ba95cSWang, Rui Y j, algo, -ret); 480018ba95cSWang, Rui Y goto out; 481018ba95cSWang, Rui Y } 482018ba95cSWang, Rui Y ret = wait_async_op(&tresult, crypto_ahash_update(req)); 483018ba95cSWang, Rui Y if (ret) { 484018ba95cSWang, Rui Y pr_err("alt: hash: update failed on test %d for %s: ret=%d\n", 485018ba95cSWang, Rui Y j, algo, -ret); 486018ba95cSWang, Rui Y goto out; 487018ba95cSWang, Rui Y } 488018ba95cSWang, Rui Y 489018ba95cSWang, Rui Y temp = template[i].tap[0]; 490018ba95cSWang, Rui Y for (k = 1; k < template[i].np; k++) { 491018ba95cSWang, Rui Y ret = ahash_partial_update(&req, tfm, &template[i], 492018ba95cSWang, Rui Y hash_buff, k, temp, &sg[0], algo, result, 493018ba95cSWang, Rui Y &tresult); 494018ba95cSWang, Rui Y if (ret) { 495018ba95cSWang, Rui Y pr_err("hash: partial update failed on test %d for %s: ret=%d\n", 496018ba95cSWang, Rui Y j, algo, -ret); 497018ba95cSWang, Rui Y goto out_noreq; 498018ba95cSWang, Rui Y } 499018ba95cSWang, Rui Y temp += template[i].tap[k]; 500018ba95cSWang, Rui Y } 501018ba95cSWang, Rui Y ret = wait_async_op(&tresult, crypto_ahash_final(req)); 502018ba95cSWang, Rui Y if (ret) { 503018ba95cSWang, Rui Y pr_err("alt: hash: final failed on test %d for %s: ret=%d\n", 504018ba95cSWang, Rui Y j, algo, -ret); 505018ba95cSWang, Rui Y goto out; 506018ba95cSWang, Rui Y } 507018ba95cSWang, Rui Y if (memcmp(result, template[i].digest, 508018ba95cSWang, Rui Y crypto_ahash_digestsize(tfm))) { 509018ba95cSWang, Rui Y pr_err("alg: hash: Partial Test %d failed for %s\n", 510018ba95cSWang, Rui Y j, algo); 511018ba95cSWang, Rui Y hexdump(result, crypto_ahash_digestsize(tfm)); 512018ba95cSWang, Rui Y ret = -EINVAL; 513018ba95cSWang, Rui Y goto out; 514018ba95cSWang, Rui Y } 515018ba95cSWang, Rui Y } 516018ba95cSWang, Rui Y 517da7f033dSHerbert Xu ret = 0; 518da7f033dSHerbert Xu 519da7f033dSHerbert Xu out: 520da7f033dSHerbert Xu ahash_request_free(req); 521da7f033dSHerbert Xu out_noreq: 522f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 523f8b0d4d0SHerbert Xu out_nobuf: 52429b77e5dSHoria Geanta kfree(key); 52529b77e5dSHoria Geanta kfree(result); 526da7f033dSHerbert Xu return ret; 527da7f033dSHerbert Xu } 528da7f033dSHerbert Xu 529da5ffe11SJussi Kivilinna static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template, 530da5ffe11SJussi Kivilinna unsigned int tcount, bool use_digest) 531da5ffe11SJussi Kivilinna { 532da5ffe11SJussi Kivilinna unsigned int alignmask; 533da5ffe11SJussi Kivilinna int ret; 534da5ffe11SJussi Kivilinna 535da5ffe11SJussi Kivilinna ret = __test_hash(tfm, template, tcount, use_digest, 0); 536da5ffe11SJussi Kivilinna if (ret) 537da5ffe11SJussi Kivilinna return ret; 538da5ffe11SJussi Kivilinna 539da5ffe11SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 540da5ffe11SJussi Kivilinna ret = __test_hash(tfm, template, tcount, use_digest, 1); 541da5ffe11SJussi Kivilinna if (ret) 542da5ffe11SJussi Kivilinna return ret; 543da5ffe11SJussi Kivilinna 544da5ffe11SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 545da5ffe11SJussi Kivilinna if (alignmask) { 546da5ffe11SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 547da5ffe11SJussi Kivilinna ret = __test_hash(tfm, template, tcount, use_digest, 548da5ffe11SJussi Kivilinna alignmask + 1); 549da5ffe11SJussi Kivilinna if (ret) 550da5ffe11SJussi Kivilinna return ret; 551da5ffe11SJussi Kivilinna } 552da5ffe11SJussi Kivilinna 553da5ffe11SJussi Kivilinna return 0; 554da5ffe11SJussi Kivilinna } 555da5ffe11SJussi Kivilinna 556d8a32ac2SJussi Kivilinna static int __test_aead(struct crypto_aead *tfm, int enc, 557d8a32ac2SJussi Kivilinna struct aead_testvec *template, unsigned int tcount, 55858dcf548SJussi Kivilinna const bool diff_dst, const int align_offset) 559da7f033dSHerbert Xu { 560da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)); 561da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 562f8b0d4d0SHerbert Xu int ret = -ENOMEM; 563da7f033dSHerbert Xu char *q; 564da7f033dSHerbert Xu char *key; 565da7f033dSHerbert Xu struct aead_request *req; 566d8a32ac2SJussi Kivilinna struct scatterlist *sg; 567d8a32ac2SJussi Kivilinna struct scatterlist *sgout; 568d8a32ac2SJussi Kivilinna const char *e, *d; 569da7f033dSHerbert Xu struct tcrypt_result result; 570424a5da6SCristian Stoica unsigned int authsize, iv_len; 571da7f033dSHerbert Xu void *input; 572d8a32ac2SJussi Kivilinna void *output; 573da7f033dSHerbert Xu void *assoc; 5749bac019dSTadeusz Struk char *iv; 575f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 576d8a32ac2SJussi Kivilinna char *xoutbuf[XBUFSIZE]; 577f8b0d4d0SHerbert Xu char *axbuf[XBUFSIZE]; 578f8b0d4d0SHerbert Xu 5799bac019dSTadeusz Struk iv = kzalloc(MAX_IVLEN, GFP_KERNEL); 5809bac019dSTadeusz Struk if (!iv) 5819bac019dSTadeusz Struk return ret; 58229b77e5dSHoria Geanta key = kmalloc(MAX_KEYLEN, GFP_KERNEL); 58329b77e5dSHoria Geanta if (!key) 58429b77e5dSHoria Geanta goto out_noxbuf; 585f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 586f8b0d4d0SHerbert Xu goto out_noxbuf; 587f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(axbuf)) 588f8b0d4d0SHerbert Xu goto out_noaxbuf; 589d8a32ac2SJussi Kivilinna if (diff_dst && testmgr_alloc_buf(xoutbuf)) 590d8a32ac2SJussi Kivilinna goto out_nooutbuf; 591d8a32ac2SJussi Kivilinna 592d8a32ac2SJussi Kivilinna /* avoid "the frame size is larger than 1024 bytes" compiler warning */ 5938a525fcdSHerbert Xu sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 4 : 2), GFP_KERNEL); 594d8a32ac2SJussi Kivilinna if (!sg) 595d8a32ac2SJussi Kivilinna goto out_nosg; 5968a525fcdSHerbert Xu sgout = &sg[16]; 597d8a32ac2SJussi Kivilinna 598d8a32ac2SJussi Kivilinna if (diff_dst) 599d8a32ac2SJussi Kivilinna d = "-ddst"; 600d8a32ac2SJussi Kivilinna else 601d8a32ac2SJussi Kivilinna d = ""; 602d8a32ac2SJussi Kivilinna 603da7f033dSHerbert Xu if (enc == ENCRYPT) 604da7f033dSHerbert Xu e = "encryption"; 605da7f033dSHerbert Xu else 606da7f033dSHerbert Xu e = "decryption"; 607da7f033dSHerbert Xu 608da7f033dSHerbert Xu init_completion(&result.completion); 609da7f033dSHerbert Xu 610da7f033dSHerbert Xu req = aead_request_alloc(tfm, GFP_KERNEL); 611da7f033dSHerbert Xu if (!req) { 612d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to allocate request for %s\n", 613d8a32ac2SJussi Kivilinna d, algo); 614da7f033dSHerbert Xu goto out; 615da7f033dSHerbert Xu } 616da7f033dSHerbert Xu 617da7f033dSHerbert Xu aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 618da7f033dSHerbert Xu tcrypt_complete, &result); 619da7f033dSHerbert Xu 620abfa7f43SJerome Marchand iv_len = crypto_aead_ivsize(tfm); 621abfa7f43SJerome Marchand 622da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 62305b1d338SCristian Stoica if (template[i].np) 62405b1d338SCristian Stoica continue; 62505b1d338SCristian Stoica 626da7f033dSHerbert Xu j++; 627da7f033dSHerbert Xu 62858dcf548SJussi Kivilinna /* some templates have no input data but they will 629da7f033dSHerbert Xu * touch input 630da7f033dSHerbert Xu */ 631da7f033dSHerbert Xu input = xbuf[0]; 63258dcf548SJussi Kivilinna input += align_offset; 633da7f033dSHerbert Xu assoc = axbuf[0]; 634da7f033dSHerbert Xu 635fd57f22aSHerbert Xu ret = -EINVAL; 63658dcf548SJussi Kivilinna if (WARN_ON(align_offset + template[i].ilen > 63758dcf548SJussi Kivilinna PAGE_SIZE || template[i].alen > PAGE_SIZE)) 638fd57f22aSHerbert Xu goto out; 639fd57f22aSHerbert Xu 640da7f033dSHerbert Xu memcpy(input, template[i].input, template[i].ilen); 641da7f033dSHerbert Xu memcpy(assoc, template[i].assoc, template[i].alen); 642da7f033dSHerbert Xu if (template[i].iv) 643424a5da6SCristian Stoica memcpy(iv, template[i].iv, iv_len); 644da7f033dSHerbert Xu else 645424a5da6SCristian Stoica memset(iv, 0, iv_len); 646da7f033dSHerbert Xu 647da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 648da7f033dSHerbert Xu if (template[i].wk) 64905b1d338SCristian Stoica crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 650da7f033dSHerbert Xu 65129b77e5dSHoria Geanta if (template[i].klen > MAX_KEYLEN) { 65229b77e5dSHoria Geanta pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n", 65329b77e5dSHoria Geanta d, j, algo, template[i].klen, 65429b77e5dSHoria Geanta MAX_KEYLEN); 65529b77e5dSHoria Geanta ret = -EINVAL; 65629b77e5dSHoria Geanta goto out; 65729b77e5dSHoria Geanta } 65829b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].klen); 659da7f033dSHerbert Xu 66005b1d338SCristian Stoica ret = crypto_aead_setkey(tfm, key, template[i].klen); 661da7f033dSHerbert Xu if (!ret == template[i].fail) { 662d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n", 663d8a32ac2SJussi Kivilinna d, j, algo, crypto_aead_get_flags(tfm)); 664da7f033dSHerbert Xu goto out; 665da7f033dSHerbert Xu } else if (ret) 666da7f033dSHerbert Xu continue; 667da7f033dSHerbert Xu 668da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 669da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 670da7f033dSHerbert Xu if (ret) { 671d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n", 672d8a32ac2SJussi Kivilinna d, authsize, j, algo); 673da7f033dSHerbert Xu goto out; 674da7f033dSHerbert Xu } 675da7f033dSHerbert Xu 6768a525fcdSHerbert Xu k = !!template[i].alen; 6778a525fcdSHerbert Xu sg_init_table(sg, k + 1); 6788a525fcdSHerbert Xu sg_set_buf(&sg[0], assoc, template[i].alen); 6798a525fcdSHerbert Xu sg_set_buf(&sg[k], input, 68005b1d338SCristian Stoica template[i].ilen + (enc ? authsize : 0)); 681d8a32ac2SJussi Kivilinna output = input; 682d8a32ac2SJussi Kivilinna 6838a525fcdSHerbert Xu if (diff_dst) { 6848a525fcdSHerbert Xu sg_init_table(sgout, k + 1); 6858a525fcdSHerbert Xu sg_set_buf(&sgout[0], assoc, template[i].alen); 6868a525fcdSHerbert Xu 6878a525fcdSHerbert Xu output = xoutbuf[0]; 6888a525fcdSHerbert Xu output += align_offset; 6898a525fcdSHerbert Xu sg_set_buf(&sgout[k], output, 6908a525fcdSHerbert Xu template[i].rlen + (enc ? 0 : authsize)); 6918a525fcdSHerbert Xu } 692da7f033dSHerbert Xu 693d8a32ac2SJussi Kivilinna aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 694da7f033dSHerbert Xu template[i].ilen, iv); 695da7f033dSHerbert Xu 6968a525fcdSHerbert Xu aead_request_set_ad(req, template[i].alen); 697da7f033dSHerbert Xu 69805b1d338SCristian Stoica ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req); 699da7f033dSHerbert Xu 700da7f033dSHerbert Xu switch (ret) { 701da7f033dSHerbert Xu case 0: 702e44a1b44SJarod Wilson if (template[i].novrfy) { 703e44a1b44SJarod Wilson /* verification was supposed to fail */ 704d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n", 705d8a32ac2SJussi Kivilinna d, e, j, algo); 706e44a1b44SJarod Wilson /* so really, we got a bad message */ 707e44a1b44SJarod Wilson ret = -EBADMSG; 708e44a1b44SJarod Wilson goto out; 709e44a1b44SJarod Wilson } 710da7f033dSHerbert Xu break; 711da7f033dSHerbert Xu case -EINPROGRESS: 712da7f033dSHerbert Xu case -EBUSY: 7138a45ac12SRabin Vincent wait_for_completion(&result.completion); 71416735d02SWolfram Sang reinit_completion(&result.completion); 7158a45ac12SRabin Vincent ret = result.err; 7168a45ac12SRabin Vincent if (!ret) 717da7f033dSHerbert Xu break; 718e44a1b44SJarod Wilson case -EBADMSG: 719e44a1b44SJarod Wilson if (template[i].novrfy) 720e44a1b44SJarod Wilson /* verification failure was expected */ 721e44a1b44SJarod Wilson continue; 722da7f033dSHerbert Xu /* fall through */ 723da7f033dSHerbert Xu default: 724d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n", 725d8a32ac2SJussi Kivilinna d, e, j, algo, -ret); 726da7f033dSHerbert Xu goto out; 727da7f033dSHerbert Xu } 728da7f033dSHerbert Xu 729d8a32ac2SJussi Kivilinna q = output; 730da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 731d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Test %d failed on %s for %s\n", 732d8a32ac2SJussi Kivilinna d, j, e, algo); 733da7f033dSHerbert Xu hexdump(q, template[i].rlen); 734da7f033dSHerbert Xu ret = -EINVAL; 735da7f033dSHerbert Xu goto out; 736da7f033dSHerbert Xu } 737da7f033dSHerbert Xu } 738da7f033dSHerbert Xu 739da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 74058dcf548SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 74158dcf548SJussi Kivilinna if (align_offset != 0) 74258dcf548SJussi Kivilinna break; 74358dcf548SJussi Kivilinna 74405b1d338SCristian Stoica if (!template[i].np) 74505b1d338SCristian Stoica continue; 74605b1d338SCristian Stoica 747da7f033dSHerbert Xu j++; 748da7f033dSHerbert Xu 749da7f033dSHerbert Xu if (template[i].iv) 750abfa7f43SJerome Marchand memcpy(iv, template[i].iv, iv_len); 751da7f033dSHerbert Xu else 752da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 753da7f033dSHerbert Xu 754da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 755da7f033dSHerbert Xu if (template[i].wk) 75605b1d338SCristian Stoica crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 75729b77e5dSHoria Geanta if (template[i].klen > MAX_KEYLEN) { 75829b77e5dSHoria Geanta pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n", 75905b1d338SCristian Stoica d, j, algo, template[i].klen, MAX_KEYLEN); 76029b77e5dSHoria Geanta ret = -EINVAL; 76129b77e5dSHoria Geanta goto out; 76229b77e5dSHoria Geanta } 76329b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].klen); 764da7f033dSHerbert Xu 765da7f033dSHerbert Xu ret = crypto_aead_setkey(tfm, key, template[i].klen); 766da7f033dSHerbert Xu if (!ret == template[i].fail) { 767d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n", 768d8a32ac2SJussi Kivilinna d, j, algo, crypto_aead_get_flags(tfm)); 769da7f033dSHerbert Xu goto out; 770da7f033dSHerbert Xu } else if (ret) 771da7f033dSHerbert Xu continue; 772da7f033dSHerbert Xu 773da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 774da7f033dSHerbert Xu 775da7f033dSHerbert Xu ret = -EINVAL; 7768a525fcdSHerbert Xu sg_init_table(sg, template[i].anp + template[i].np); 777d8a32ac2SJussi Kivilinna if (diff_dst) 7788a525fcdSHerbert Xu sg_init_table(sgout, template[i].anp + template[i].np); 7798a525fcdSHerbert Xu 7808a525fcdSHerbert Xu ret = -EINVAL; 7818a525fcdSHerbert Xu for (k = 0, temp = 0; k < template[i].anp; k++) { 7828a525fcdSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 7838a525fcdSHerbert Xu template[i].atap[k] > PAGE_SIZE)) 7848a525fcdSHerbert Xu goto out; 7858a525fcdSHerbert Xu sg_set_buf(&sg[k], 7868a525fcdSHerbert Xu memcpy(axbuf[IDX[k] >> PAGE_SHIFT] + 7878a525fcdSHerbert Xu offset_in_page(IDX[k]), 7888a525fcdSHerbert Xu template[i].assoc + temp, 7898a525fcdSHerbert Xu template[i].atap[k]), 7908a525fcdSHerbert Xu template[i].atap[k]); 7918a525fcdSHerbert Xu if (diff_dst) 7928a525fcdSHerbert Xu sg_set_buf(&sgout[k], 7938a525fcdSHerbert Xu axbuf[IDX[k] >> PAGE_SHIFT] + 7948a525fcdSHerbert Xu offset_in_page(IDX[k]), 7958a525fcdSHerbert Xu template[i].atap[k]); 7968a525fcdSHerbert Xu temp += template[i].atap[k]; 7978a525fcdSHerbert Xu } 7988a525fcdSHerbert Xu 799da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 800da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 801da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 802da7f033dSHerbert Xu goto out; 803da7f033dSHerbert Xu 80405b1d338SCristian Stoica q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]); 80505b1d338SCristian Stoica memcpy(q, template[i].input + temp, template[i].tap[k]); 8068a525fcdSHerbert Xu sg_set_buf(&sg[template[i].anp + k], 8078a525fcdSHerbert Xu q, template[i].tap[k]); 808d8a32ac2SJussi Kivilinna 809d8a32ac2SJussi Kivilinna if (diff_dst) { 810d8a32ac2SJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 811d8a32ac2SJussi Kivilinna offset_in_page(IDX[k]); 812d8a32ac2SJussi Kivilinna 813d8a32ac2SJussi Kivilinna memset(q, 0, template[i].tap[k]); 814d8a32ac2SJussi Kivilinna 8158a525fcdSHerbert Xu sg_set_buf(&sgout[template[i].anp + k], 8168a525fcdSHerbert Xu q, template[i].tap[k]); 817d8a32ac2SJussi Kivilinna } 818d8a32ac2SJussi Kivilinna 8198ec25c51SHoria Geanta n = template[i].tap[k]; 8208ec25c51SHoria Geanta if (k == template[i].np - 1 && enc) 8218ec25c51SHoria Geanta n += authsize; 8228ec25c51SHoria Geanta if (offset_in_page(q) + n < PAGE_SIZE) 8238ec25c51SHoria Geanta q[n] = 0; 8248ec25c51SHoria Geanta 825da7f033dSHerbert Xu temp += template[i].tap[k]; 826da7f033dSHerbert Xu } 827da7f033dSHerbert Xu 828da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 829da7f033dSHerbert Xu if (ret) { 830d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n", 831d8a32ac2SJussi Kivilinna d, authsize, j, algo); 832da7f033dSHerbert Xu goto out; 833da7f033dSHerbert Xu } 834da7f033dSHerbert Xu 835da7f033dSHerbert Xu if (enc) { 8368a525fcdSHerbert Xu if (WARN_ON(sg[template[i].anp + k - 1].offset + 8378a525fcdSHerbert Xu sg[template[i].anp + k - 1].length + 8388a525fcdSHerbert Xu authsize > PAGE_SIZE)) { 839da7f033dSHerbert Xu ret = -EINVAL; 840da7f033dSHerbert Xu goto out; 841da7f033dSHerbert Xu } 842da7f033dSHerbert Xu 843d8a32ac2SJussi Kivilinna if (diff_dst) 8448a525fcdSHerbert Xu sgout[template[i].anp + k - 1].length += 8458a525fcdSHerbert Xu authsize; 8468a525fcdSHerbert Xu sg[template[i].anp + k - 1].length += authsize; 847da7f033dSHerbert Xu } 848da7f033dSHerbert Xu 849d8a32ac2SJussi Kivilinna aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 850da7f033dSHerbert Xu template[i].ilen, 851da7f033dSHerbert Xu iv); 852da7f033dSHerbert Xu 8538a525fcdSHerbert Xu aead_request_set_ad(req, template[i].alen); 854da7f033dSHerbert Xu 85505b1d338SCristian Stoica ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req); 856da7f033dSHerbert Xu 857da7f033dSHerbert Xu switch (ret) { 858da7f033dSHerbert Xu case 0: 859e44a1b44SJarod Wilson if (template[i].novrfy) { 860e44a1b44SJarod Wilson /* verification was supposed to fail */ 861d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n", 862d8a32ac2SJussi Kivilinna d, e, j, algo); 863e44a1b44SJarod Wilson /* so really, we got a bad message */ 864e44a1b44SJarod Wilson ret = -EBADMSG; 865e44a1b44SJarod Wilson goto out; 866e44a1b44SJarod Wilson } 867da7f033dSHerbert Xu break; 868da7f033dSHerbert Xu case -EINPROGRESS: 869da7f033dSHerbert Xu case -EBUSY: 8708a45ac12SRabin Vincent wait_for_completion(&result.completion); 87116735d02SWolfram Sang reinit_completion(&result.completion); 8728a45ac12SRabin Vincent ret = result.err; 8738a45ac12SRabin Vincent if (!ret) 874da7f033dSHerbert Xu break; 875e44a1b44SJarod Wilson case -EBADMSG: 876e44a1b44SJarod Wilson if (template[i].novrfy) 877e44a1b44SJarod Wilson /* verification failure was expected */ 878e44a1b44SJarod Wilson continue; 879da7f033dSHerbert Xu /* fall through */ 880da7f033dSHerbert Xu default: 881d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n", 882d8a32ac2SJussi Kivilinna d, e, j, algo, -ret); 883da7f033dSHerbert Xu goto out; 884da7f033dSHerbert Xu } 885da7f033dSHerbert Xu 886da7f033dSHerbert Xu ret = -EINVAL; 887da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 888d8a32ac2SJussi Kivilinna if (diff_dst) 889d8a32ac2SJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 890d8a32ac2SJussi Kivilinna offset_in_page(IDX[k]); 891d8a32ac2SJussi Kivilinna else 892da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 893da7f033dSHerbert Xu offset_in_page(IDX[k]); 894da7f033dSHerbert Xu 895da7f033dSHerbert Xu n = template[i].tap[k]; 896da7f033dSHerbert Xu if (k == template[i].np - 1) 897da7f033dSHerbert Xu n += enc ? authsize : -authsize; 898da7f033dSHerbert Xu 899da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, n)) { 900d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n", 901d8a32ac2SJussi Kivilinna d, j, e, k, algo); 902da7f033dSHerbert Xu hexdump(q, n); 903da7f033dSHerbert Xu goto out; 904da7f033dSHerbert Xu } 905da7f033dSHerbert Xu 906da7f033dSHerbert Xu q += n; 907da7f033dSHerbert Xu if (k == template[i].np - 1 && !enc) { 908d8a32ac2SJussi Kivilinna if (!diff_dst && 909d8a32ac2SJussi Kivilinna memcmp(q, template[i].input + 910da7f033dSHerbert Xu temp + n, authsize)) 911da7f033dSHerbert Xu n = authsize; 912da7f033dSHerbert Xu else 913da7f033dSHerbert Xu n = 0; 914da7f033dSHerbert Xu } else { 91505b1d338SCristian Stoica for (n = 0; offset_in_page(q + n) && q[n]; n++) 916da7f033dSHerbert Xu ; 917da7f033dSHerbert Xu } 918da7f033dSHerbert Xu if (n) { 919d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n", 920d8a32ac2SJussi Kivilinna d, j, e, k, algo, n); 921da7f033dSHerbert Xu hexdump(q, n); 922da7f033dSHerbert Xu goto out; 923da7f033dSHerbert Xu } 924da7f033dSHerbert Xu 925da7f033dSHerbert Xu temp += template[i].tap[k]; 926da7f033dSHerbert Xu } 927da7f033dSHerbert Xu } 928da7f033dSHerbert Xu 929da7f033dSHerbert Xu ret = 0; 930da7f033dSHerbert Xu 931da7f033dSHerbert Xu out: 932da7f033dSHerbert Xu aead_request_free(req); 933d8a32ac2SJussi Kivilinna kfree(sg); 934d8a32ac2SJussi Kivilinna out_nosg: 935d8a32ac2SJussi Kivilinna if (diff_dst) 936d8a32ac2SJussi Kivilinna testmgr_free_buf(xoutbuf); 937d8a32ac2SJussi Kivilinna out_nooutbuf: 938f8b0d4d0SHerbert Xu testmgr_free_buf(axbuf); 939f8b0d4d0SHerbert Xu out_noaxbuf: 940f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 941f8b0d4d0SHerbert Xu out_noxbuf: 94229b77e5dSHoria Geanta kfree(key); 9439bac019dSTadeusz Struk kfree(iv); 944da7f033dSHerbert Xu return ret; 945da7f033dSHerbert Xu } 946da7f033dSHerbert Xu 947d8a32ac2SJussi Kivilinna static int test_aead(struct crypto_aead *tfm, int enc, 948d8a32ac2SJussi Kivilinna struct aead_testvec *template, unsigned int tcount) 949d8a32ac2SJussi Kivilinna { 95058dcf548SJussi Kivilinna unsigned int alignmask; 951d8a32ac2SJussi Kivilinna int ret; 952d8a32ac2SJussi Kivilinna 953d8a32ac2SJussi Kivilinna /* test 'dst == src' case */ 95458dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, false, 0); 955d8a32ac2SJussi Kivilinna if (ret) 956d8a32ac2SJussi Kivilinna return ret; 957d8a32ac2SJussi Kivilinna 958d8a32ac2SJussi Kivilinna /* test 'dst != src' case */ 95958dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 0); 96058dcf548SJussi Kivilinna if (ret) 96158dcf548SJussi Kivilinna return ret; 96258dcf548SJussi Kivilinna 96358dcf548SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 96458dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 1); 96558dcf548SJussi Kivilinna if (ret) 96658dcf548SJussi Kivilinna return ret; 96758dcf548SJussi Kivilinna 96858dcf548SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 96958dcf548SJussi Kivilinna if (alignmask) { 97058dcf548SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 97158dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 97258dcf548SJussi Kivilinna alignmask + 1); 97358dcf548SJussi Kivilinna if (ret) 97458dcf548SJussi Kivilinna return ret; 97558dcf548SJussi Kivilinna } 97658dcf548SJussi Kivilinna 97758dcf548SJussi Kivilinna return 0; 978d8a32ac2SJussi Kivilinna } 979d8a32ac2SJussi Kivilinna 9801aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc, 9811aa4ecd9SHerbert Xu struct cipher_testvec *template, unsigned int tcount) 9821aa4ecd9SHerbert Xu { 9831aa4ecd9SHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm)); 9841aa4ecd9SHerbert Xu unsigned int i, j, k; 9851aa4ecd9SHerbert Xu char *q; 9861aa4ecd9SHerbert Xu const char *e; 9871aa4ecd9SHerbert Xu void *data; 988f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 989f8b0d4d0SHerbert Xu int ret = -ENOMEM; 990f8b0d4d0SHerbert Xu 991f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 992f8b0d4d0SHerbert Xu goto out_nobuf; 9931aa4ecd9SHerbert Xu 9941aa4ecd9SHerbert Xu if (enc == ENCRYPT) 9951aa4ecd9SHerbert Xu e = "encryption"; 9961aa4ecd9SHerbert Xu else 9971aa4ecd9SHerbert Xu e = "decryption"; 9981aa4ecd9SHerbert Xu 9991aa4ecd9SHerbert Xu j = 0; 10001aa4ecd9SHerbert Xu for (i = 0; i < tcount; i++) { 10011aa4ecd9SHerbert Xu if (template[i].np) 10021aa4ecd9SHerbert Xu continue; 10031aa4ecd9SHerbert Xu 10041aa4ecd9SHerbert Xu j++; 10051aa4ecd9SHerbert Xu 1006fd57f22aSHerbert Xu ret = -EINVAL; 1007fd57f22aSHerbert Xu if (WARN_ON(template[i].ilen > PAGE_SIZE)) 1008fd57f22aSHerbert Xu goto out; 1009fd57f22aSHerbert Xu 10101aa4ecd9SHerbert Xu data = xbuf[0]; 10111aa4ecd9SHerbert Xu memcpy(data, template[i].input, template[i].ilen); 10121aa4ecd9SHerbert Xu 10131aa4ecd9SHerbert Xu crypto_cipher_clear_flags(tfm, ~0); 10141aa4ecd9SHerbert Xu if (template[i].wk) 10151aa4ecd9SHerbert Xu crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 10161aa4ecd9SHerbert Xu 10171aa4ecd9SHerbert Xu ret = crypto_cipher_setkey(tfm, template[i].key, 10181aa4ecd9SHerbert Xu template[i].klen); 10191aa4ecd9SHerbert Xu if (!ret == template[i].fail) { 10201aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: setkey failed " 10211aa4ecd9SHerbert Xu "on test %d for %s: flags=%x\n", j, 10221aa4ecd9SHerbert Xu algo, crypto_cipher_get_flags(tfm)); 10231aa4ecd9SHerbert Xu goto out; 10241aa4ecd9SHerbert Xu } else if (ret) 10251aa4ecd9SHerbert Xu continue; 10261aa4ecd9SHerbert Xu 10271aa4ecd9SHerbert Xu for (k = 0; k < template[i].ilen; 10281aa4ecd9SHerbert Xu k += crypto_cipher_blocksize(tfm)) { 10291aa4ecd9SHerbert Xu if (enc) 10301aa4ecd9SHerbert Xu crypto_cipher_encrypt_one(tfm, data + k, 10311aa4ecd9SHerbert Xu data + k); 10321aa4ecd9SHerbert Xu else 10331aa4ecd9SHerbert Xu crypto_cipher_decrypt_one(tfm, data + k, 10341aa4ecd9SHerbert Xu data + k); 10351aa4ecd9SHerbert Xu } 10361aa4ecd9SHerbert Xu 10371aa4ecd9SHerbert Xu q = data; 10381aa4ecd9SHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 10391aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: Test %d failed " 10401aa4ecd9SHerbert Xu "on %s for %s\n", j, e, algo); 10411aa4ecd9SHerbert Xu hexdump(q, template[i].rlen); 10421aa4ecd9SHerbert Xu ret = -EINVAL; 10431aa4ecd9SHerbert Xu goto out; 10441aa4ecd9SHerbert Xu } 10451aa4ecd9SHerbert Xu } 10461aa4ecd9SHerbert Xu 10471aa4ecd9SHerbert Xu ret = 0; 10481aa4ecd9SHerbert Xu 10491aa4ecd9SHerbert Xu out: 1050f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 1051f8b0d4d0SHerbert Xu out_nobuf: 10521aa4ecd9SHerbert Xu return ret; 10531aa4ecd9SHerbert Xu } 10541aa4ecd9SHerbert Xu 105512773d93SHerbert Xu static int __test_skcipher(struct crypto_skcipher *tfm, int enc, 105608d6af8cSJussi Kivilinna struct cipher_testvec *template, unsigned int tcount, 10573a338f20SJussi Kivilinna const bool diff_dst, const int align_offset) 1058da7f033dSHerbert Xu { 1059da7f033dSHerbert Xu const char *algo = 106012773d93SHerbert Xu crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)); 1061da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 1062da7f033dSHerbert Xu char *q; 106312773d93SHerbert Xu struct skcipher_request *req; 1064da7f033dSHerbert Xu struct scatterlist sg[8]; 106508d6af8cSJussi Kivilinna struct scatterlist sgout[8]; 106608d6af8cSJussi Kivilinna const char *e, *d; 1067da7f033dSHerbert Xu struct tcrypt_result result; 1068da7f033dSHerbert Xu void *data; 1069da7f033dSHerbert Xu char iv[MAX_IVLEN]; 1070f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 107108d6af8cSJussi Kivilinna char *xoutbuf[XBUFSIZE]; 1072f8b0d4d0SHerbert Xu int ret = -ENOMEM; 107384cba178SAndrey Ryabinin unsigned int ivsize = crypto_skcipher_ivsize(tfm); 1074f8b0d4d0SHerbert Xu 1075f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 1076f8b0d4d0SHerbert Xu goto out_nobuf; 1077da7f033dSHerbert Xu 107808d6af8cSJussi Kivilinna if (diff_dst && testmgr_alloc_buf(xoutbuf)) 107908d6af8cSJussi Kivilinna goto out_nooutbuf; 108008d6af8cSJussi Kivilinna 108108d6af8cSJussi Kivilinna if (diff_dst) 108208d6af8cSJussi Kivilinna d = "-ddst"; 108308d6af8cSJussi Kivilinna else 108408d6af8cSJussi Kivilinna d = ""; 108508d6af8cSJussi Kivilinna 1086da7f033dSHerbert Xu if (enc == ENCRYPT) 1087da7f033dSHerbert Xu e = "encryption"; 1088da7f033dSHerbert Xu else 1089da7f033dSHerbert Xu e = "decryption"; 1090da7f033dSHerbert Xu 1091da7f033dSHerbert Xu init_completion(&result.completion); 1092da7f033dSHerbert Xu 109312773d93SHerbert Xu req = skcipher_request_alloc(tfm, GFP_KERNEL); 1094da7f033dSHerbert Xu if (!req) { 109508d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Failed to allocate request for %s\n", 109608d6af8cSJussi Kivilinna d, algo); 1097da7f033dSHerbert Xu goto out; 1098da7f033dSHerbert Xu } 1099da7f033dSHerbert Xu 110012773d93SHerbert Xu skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 1101da7f033dSHerbert Xu tcrypt_complete, &result); 1102da7f033dSHerbert Xu 1103da7f033dSHerbert Xu j = 0; 1104da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 1105bbb9a7ddSCristian Stoica if (template[i].np && !template[i].also_non_np) 1106bbb9a7ddSCristian Stoica continue; 1107bbb9a7ddSCristian Stoica 1108da7f033dSHerbert Xu if (template[i].iv) 110984cba178SAndrey Ryabinin memcpy(iv, template[i].iv, ivsize); 1110da7f033dSHerbert Xu else 1111da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 1112da7f033dSHerbert Xu 1113da7f033dSHerbert Xu j++; 1114fd57f22aSHerbert Xu ret = -EINVAL; 1115a1aa44a2SCristian Stoica if (WARN_ON(align_offset + template[i].ilen > PAGE_SIZE)) 1116fd57f22aSHerbert Xu goto out; 1117fd57f22aSHerbert Xu 1118da7f033dSHerbert Xu data = xbuf[0]; 11193a338f20SJussi Kivilinna data += align_offset; 1120da7f033dSHerbert Xu memcpy(data, template[i].input, template[i].ilen); 1121da7f033dSHerbert Xu 112212773d93SHerbert Xu crypto_skcipher_clear_flags(tfm, ~0); 1123da7f033dSHerbert Xu if (template[i].wk) 112412773d93SHerbert Xu crypto_skcipher_set_flags(tfm, 112512773d93SHerbert Xu CRYPTO_TFM_REQ_WEAK_KEY); 1126da7f033dSHerbert Xu 112712773d93SHerbert Xu ret = crypto_skcipher_setkey(tfm, template[i].key, 1128da7f033dSHerbert Xu template[i].klen); 1129da7f033dSHerbert Xu if (!ret == template[i].fail) { 113008d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n", 113112773d93SHerbert Xu d, j, algo, crypto_skcipher_get_flags(tfm)); 1132da7f033dSHerbert Xu goto out; 1133da7f033dSHerbert Xu } else if (ret) 1134da7f033dSHerbert Xu continue; 1135da7f033dSHerbert Xu 1136da7f033dSHerbert Xu sg_init_one(&sg[0], data, template[i].ilen); 113708d6af8cSJussi Kivilinna if (diff_dst) { 113808d6af8cSJussi Kivilinna data = xoutbuf[0]; 11393a338f20SJussi Kivilinna data += align_offset; 114008d6af8cSJussi Kivilinna sg_init_one(&sgout[0], data, template[i].ilen); 114108d6af8cSJussi Kivilinna } 1142da7f033dSHerbert Xu 114312773d93SHerbert Xu skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 1144da7f033dSHerbert Xu template[i].ilen, iv); 114512773d93SHerbert Xu ret = enc ? crypto_skcipher_encrypt(req) : 114612773d93SHerbert Xu crypto_skcipher_decrypt(req); 1147da7f033dSHerbert Xu 1148da7f033dSHerbert Xu switch (ret) { 1149da7f033dSHerbert Xu case 0: 1150da7f033dSHerbert Xu break; 1151da7f033dSHerbert Xu case -EINPROGRESS: 1152da7f033dSHerbert Xu case -EBUSY: 11538a45ac12SRabin Vincent wait_for_completion(&result.completion); 115416735d02SWolfram Sang reinit_completion(&result.completion); 11558a45ac12SRabin Vincent ret = result.err; 11568a45ac12SRabin Vincent if (!ret) 1157da7f033dSHerbert Xu break; 1158da7f033dSHerbert Xu /* fall through */ 1159da7f033dSHerbert Xu default: 116008d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n", 116108d6af8cSJussi Kivilinna d, e, j, algo, -ret); 1162da7f033dSHerbert Xu goto out; 1163da7f033dSHerbert Xu } 1164da7f033dSHerbert Xu 1165da7f033dSHerbert Xu q = data; 1166da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 11678a826a34SBoris BREZILLON pr_err("alg: skcipher%s: Test %d failed (invalid result) on %s for %s\n", 116808d6af8cSJussi Kivilinna d, j, e, algo); 1169da7f033dSHerbert Xu hexdump(q, template[i].rlen); 1170da7f033dSHerbert Xu ret = -EINVAL; 1171da7f033dSHerbert Xu goto out; 1172da7f033dSHerbert Xu } 11738a826a34SBoris BREZILLON 11748a826a34SBoris BREZILLON if (template[i].iv_out && 11758a826a34SBoris BREZILLON memcmp(iv, template[i].iv_out, 11768a826a34SBoris BREZILLON crypto_skcipher_ivsize(tfm))) { 11778a826a34SBoris BREZILLON pr_err("alg: skcipher%s: Test %d failed (invalid output IV) on %s for %s\n", 11788a826a34SBoris BREZILLON d, j, e, algo); 11798a826a34SBoris BREZILLON hexdump(iv, crypto_skcipher_ivsize(tfm)); 11808a826a34SBoris BREZILLON ret = -EINVAL; 11818a826a34SBoris BREZILLON goto out; 11828a826a34SBoris BREZILLON } 1183da7f033dSHerbert Xu } 1184da7f033dSHerbert Xu 1185da7f033dSHerbert Xu j = 0; 1186da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 11873a338f20SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 11883a338f20SJussi Kivilinna if (align_offset != 0) 11893a338f20SJussi Kivilinna break; 1190da7f033dSHerbert Xu 1191bbb9a7ddSCristian Stoica if (!template[i].np) 1192bbb9a7ddSCristian Stoica continue; 1193bbb9a7ddSCristian Stoica 1194da7f033dSHerbert Xu if (template[i].iv) 119584cba178SAndrey Ryabinin memcpy(iv, template[i].iv, ivsize); 1196da7f033dSHerbert Xu else 1197da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 1198da7f033dSHerbert Xu 1199da7f033dSHerbert Xu j++; 120012773d93SHerbert Xu crypto_skcipher_clear_flags(tfm, ~0); 1201da7f033dSHerbert Xu if (template[i].wk) 120212773d93SHerbert Xu crypto_skcipher_set_flags(tfm, 120312773d93SHerbert Xu CRYPTO_TFM_REQ_WEAK_KEY); 1204da7f033dSHerbert Xu 120512773d93SHerbert Xu ret = crypto_skcipher_setkey(tfm, template[i].key, 1206da7f033dSHerbert Xu template[i].klen); 1207da7f033dSHerbert Xu if (!ret == template[i].fail) { 120808d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n", 120912773d93SHerbert Xu d, j, algo, crypto_skcipher_get_flags(tfm)); 1210da7f033dSHerbert Xu goto out; 1211da7f033dSHerbert Xu } else if (ret) 1212da7f033dSHerbert Xu continue; 1213da7f033dSHerbert Xu 1214da7f033dSHerbert Xu temp = 0; 1215da7f033dSHerbert Xu ret = -EINVAL; 1216da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 121708d6af8cSJussi Kivilinna if (diff_dst) 121808d6af8cSJussi Kivilinna sg_init_table(sgout, template[i].np); 1219da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 1220da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 1221da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 1222da7f033dSHerbert Xu goto out; 1223da7f033dSHerbert Xu 1224a1aa44a2SCristian Stoica q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]); 1225da7f033dSHerbert Xu 1226a1aa44a2SCristian Stoica memcpy(q, template[i].input + temp, template[i].tap[k]); 1227da7f033dSHerbert Xu 1228a1aa44a2SCristian Stoica if (offset_in_page(q) + template[i].tap[k] < PAGE_SIZE) 1229da7f033dSHerbert Xu q[template[i].tap[k]] = 0; 1230da7f033dSHerbert Xu 1231da7f033dSHerbert Xu sg_set_buf(&sg[k], q, template[i].tap[k]); 123208d6af8cSJussi Kivilinna if (diff_dst) { 123308d6af8cSJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 123408d6af8cSJussi Kivilinna offset_in_page(IDX[k]); 123508d6af8cSJussi Kivilinna 1236a1aa44a2SCristian Stoica sg_set_buf(&sgout[k], q, template[i].tap[k]); 123708d6af8cSJussi Kivilinna 123808d6af8cSJussi Kivilinna memset(q, 0, template[i].tap[k]); 123908d6af8cSJussi Kivilinna if (offset_in_page(q) + 124008d6af8cSJussi Kivilinna template[i].tap[k] < PAGE_SIZE) 124108d6af8cSJussi Kivilinna q[template[i].tap[k]] = 0; 124208d6af8cSJussi Kivilinna } 1243da7f033dSHerbert Xu 1244da7f033dSHerbert Xu temp += template[i].tap[k]; 1245da7f033dSHerbert Xu } 1246da7f033dSHerbert Xu 124712773d93SHerbert Xu skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 1248da7f033dSHerbert Xu template[i].ilen, iv); 1249da7f033dSHerbert Xu 125012773d93SHerbert Xu ret = enc ? crypto_skcipher_encrypt(req) : 125112773d93SHerbert Xu crypto_skcipher_decrypt(req); 1252da7f033dSHerbert Xu 1253da7f033dSHerbert Xu switch (ret) { 1254da7f033dSHerbert Xu case 0: 1255da7f033dSHerbert Xu break; 1256da7f033dSHerbert Xu case -EINPROGRESS: 1257da7f033dSHerbert Xu case -EBUSY: 12588a45ac12SRabin Vincent wait_for_completion(&result.completion); 125916735d02SWolfram Sang reinit_completion(&result.completion); 12608a45ac12SRabin Vincent ret = result.err; 12618a45ac12SRabin Vincent if (!ret) 1262da7f033dSHerbert Xu break; 1263da7f033dSHerbert Xu /* fall through */ 1264da7f033dSHerbert Xu default: 126508d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n", 126608d6af8cSJussi Kivilinna d, e, j, algo, -ret); 1267da7f033dSHerbert Xu goto out; 1268da7f033dSHerbert Xu } 1269da7f033dSHerbert Xu 1270da7f033dSHerbert Xu temp = 0; 1271da7f033dSHerbert Xu ret = -EINVAL; 1272da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 127308d6af8cSJussi Kivilinna if (diff_dst) 127408d6af8cSJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 127508d6af8cSJussi Kivilinna offset_in_page(IDX[k]); 127608d6af8cSJussi Kivilinna else 1277da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 1278da7f033dSHerbert Xu offset_in_page(IDX[k]); 1279da7f033dSHerbert Xu 1280da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, 1281da7f033dSHerbert Xu template[i].tap[k])) { 128208d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n", 128308d6af8cSJussi Kivilinna d, j, e, k, algo); 1284da7f033dSHerbert Xu hexdump(q, template[i].tap[k]); 1285da7f033dSHerbert Xu goto out; 1286da7f033dSHerbert Xu } 1287da7f033dSHerbert Xu 1288da7f033dSHerbert Xu q += template[i].tap[k]; 1289da7f033dSHerbert Xu for (n = 0; offset_in_page(q + n) && q[n]; n++) 1290da7f033dSHerbert Xu ; 1291da7f033dSHerbert Xu if (n) { 129208d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n", 129308d6af8cSJussi Kivilinna d, j, e, k, algo, n); 1294da7f033dSHerbert Xu hexdump(q, n); 1295da7f033dSHerbert Xu goto out; 1296da7f033dSHerbert Xu } 1297da7f033dSHerbert Xu temp += template[i].tap[k]; 1298da7f033dSHerbert Xu } 1299da7f033dSHerbert Xu } 1300da7f033dSHerbert Xu 1301da7f033dSHerbert Xu ret = 0; 1302da7f033dSHerbert Xu 1303da7f033dSHerbert Xu out: 130412773d93SHerbert Xu skcipher_request_free(req); 130508d6af8cSJussi Kivilinna if (diff_dst) 130608d6af8cSJussi Kivilinna testmgr_free_buf(xoutbuf); 130708d6af8cSJussi Kivilinna out_nooutbuf: 1308f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 1309f8b0d4d0SHerbert Xu out_nobuf: 1310da7f033dSHerbert Xu return ret; 1311da7f033dSHerbert Xu } 1312da7f033dSHerbert Xu 131312773d93SHerbert Xu static int test_skcipher(struct crypto_skcipher *tfm, int enc, 131408d6af8cSJussi Kivilinna struct cipher_testvec *template, unsigned int tcount) 131508d6af8cSJussi Kivilinna { 13163a338f20SJussi Kivilinna unsigned int alignmask; 131708d6af8cSJussi Kivilinna int ret; 131808d6af8cSJussi Kivilinna 131908d6af8cSJussi Kivilinna /* test 'dst == src' case */ 13203a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, false, 0); 132108d6af8cSJussi Kivilinna if (ret) 132208d6af8cSJussi Kivilinna return ret; 132308d6af8cSJussi Kivilinna 132408d6af8cSJussi Kivilinna /* test 'dst != src' case */ 13253a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 0); 13263a338f20SJussi Kivilinna if (ret) 13273a338f20SJussi Kivilinna return ret; 13283a338f20SJussi Kivilinna 13293a338f20SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 13303a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 1); 13313a338f20SJussi Kivilinna if (ret) 13323a338f20SJussi Kivilinna return ret; 13333a338f20SJussi Kivilinna 13343a338f20SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 13353a338f20SJussi Kivilinna if (alignmask) { 13363a338f20SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 13373a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 13383a338f20SJussi Kivilinna alignmask + 1); 13393a338f20SJussi Kivilinna if (ret) 13403a338f20SJussi Kivilinna return ret; 13413a338f20SJussi Kivilinna } 13423a338f20SJussi Kivilinna 13433a338f20SJussi Kivilinna return 0; 134408d6af8cSJussi Kivilinna } 134508d6af8cSJussi Kivilinna 1346da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate, 1347da7f033dSHerbert Xu struct comp_testvec *dtemplate, int ctcount, int dtcount) 1348da7f033dSHerbert Xu { 1349da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm)); 1350da7f033dSHerbert Xu unsigned int i; 1351da7f033dSHerbert Xu char result[COMP_BUF_SIZE]; 1352da7f033dSHerbert Xu int ret; 1353da7f033dSHerbert Xu 1354da7f033dSHerbert Xu for (i = 0; i < ctcount; i++) { 1355c79cf910SGeert Uytterhoeven int ilen; 1356c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 1357da7f033dSHerbert Xu 1358da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 1359da7f033dSHerbert Xu 1360da7f033dSHerbert Xu ilen = ctemplate[i].inlen; 1361da7f033dSHerbert Xu ret = crypto_comp_compress(tfm, ctemplate[i].input, 1362da7f033dSHerbert Xu ilen, result, &dlen); 1363da7f033dSHerbert Xu if (ret) { 1364da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: compression failed " 1365da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1366da7f033dSHerbert Xu -ret); 1367da7f033dSHerbert Xu goto out; 1368da7f033dSHerbert Xu } 1369da7f033dSHerbert Xu 1370b812eb00SGeert Uytterhoeven if (dlen != ctemplate[i].outlen) { 1371b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Compression test %d " 1372b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1373b812eb00SGeert Uytterhoeven dlen); 1374b812eb00SGeert Uytterhoeven ret = -EINVAL; 1375b812eb00SGeert Uytterhoeven goto out; 1376b812eb00SGeert Uytterhoeven } 1377b812eb00SGeert Uytterhoeven 1378da7f033dSHerbert Xu if (memcmp(result, ctemplate[i].output, dlen)) { 1379da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Compression test %d " 1380da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 1381da7f033dSHerbert Xu hexdump(result, dlen); 1382da7f033dSHerbert Xu ret = -EINVAL; 1383da7f033dSHerbert Xu goto out; 1384da7f033dSHerbert Xu } 1385da7f033dSHerbert Xu } 1386da7f033dSHerbert Xu 1387da7f033dSHerbert Xu for (i = 0; i < dtcount; i++) { 1388c79cf910SGeert Uytterhoeven int ilen; 1389c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 1390da7f033dSHerbert Xu 1391da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 1392da7f033dSHerbert Xu 1393da7f033dSHerbert Xu ilen = dtemplate[i].inlen; 1394da7f033dSHerbert Xu ret = crypto_comp_decompress(tfm, dtemplate[i].input, 1395da7f033dSHerbert Xu ilen, result, &dlen); 1396da7f033dSHerbert Xu if (ret) { 1397da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: decompression failed " 1398da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1399da7f033dSHerbert Xu -ret); 1400da7f033dSHerbert Xu goto out; 1401da7f033dSHerbert Xu } 1402da7f033dSHerbert Xu 1403b812eb00SGeert Uytterhoeven if (dlen != dtemplate[i].outlen) { 1404b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Decompression test %d " 1405b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1406b812eb00SGeert Uytterhoeven dlen); 1407b812eb00SGeert Uytterhoeven ret = -EINVAL; 1408b812eb00SGeert Uytterhoeven goto out; 1409b812eb00SGeert Uytterhoeven } 1410b812eb00SGeert Uytterhoeven 1411da7f033dSHerbert Xu if (memcmp(result, dtemplate[i].output, dlen)) { 1412da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Decompression test %d " 1413da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 1414da7f033dSHerbert Xu hexdump(result, dlen); 1415da7f033dSHerbert Xu ret = -EINVAL; 1416da7f033dSHerbert Xu goto out; 1417da7f033dSHerbert Xu } 1418da7f033dSHerbert Xu } 1419da7f033dSHerbert Xu 1420da7f033dSHerbert Xu ret = 0; 1421da7f033dSHerbert Xu 1422da7f033dSHerbert Xu out: 1423da7f033dSHerbert Xu return ret; 1424da7f033dSHerbert Xu } 1425da7f033dSHerbert Xu 14267647d6ceSJarod Wilson static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template, 14277647d6ceSJarod Wilson unsigned int tcount) 14287647d6ceSJarod Wilson { 14297647d6ceSJarod Wilson const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm)); 1430fa4ef8a6SFelipe Contreras int err = 0, i, j, seedsize; 14317647d6ceSJarod Wilson u8 *seed; 14327647d6ceSJarod Wilson char result[32]; 14337647d6ceSJarod Wilson 14347647d6ceSJarod Wilson seedsize = crypto_rng_seedsize(tfm); 14357647d6ceSJarod Wilson 14367647d6ceSJarod Wilson seed = kmalloc(seedsize, GFP_KERNEL); 14377647d6ceSJarod Wilson if (!seed) { 14387647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to allocate seed space " 14397647d6ceSJarod Wilson "for %s\n", algo); 14407647d6ceSJarod Wilson return -ENOMEM; 14417647d6ceSJarod Wilson } 14427647d6ceSJarod Wilson 14437647d6ceSJarod Wilson for (i = 0; i < tcount; i++) { 14447647d6ceSJarod Wilson memset(result, 0, 32); 14457647d6ceSJarod Wilson 14467647d6ceSJarod Wilson memcpy(seed, template[i].v, template[i].vlen); 14477647d6ceSJarod Wilson memcpy(seed + template[i].vlen, template[i].key, 14487647d6ceSJarod Wilson template[i].klen); 14497647d6ceSJarod Wilson memcpy(seed + template[i].vlen + template[i].klen, 14507647d6ceSJarod Wilson template[i].dt, template[i].dtlen); 14517647d6ceSJarod Wilson 14527647d6ceSJarod Wilson err = crypto_rng_reset(tfm, seed, seedsize); 14537647d6ceSJarod Wilson if (err) { 14547647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to reset rng " 14557647d6ceSJarod Wilson "for %s\n", algo); 14567647d6ceSJarod Wilson goto out; 14577647d6ceSJarod Wilson } 14587647d6ceSJarod Wilson 14597647d6ceSJarod Wilson for (j = 0; j < template[i].loops; j++) { 14607647d6ceSJarod Wilson err = crypto_rng_get_bytes(tfm, result, 14617647d6ceSJarod Wilson template[i].rlen); 146219e60e13SStephan Mueller if (err < 0) { 14637647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to obtain " 14647647d6ceSJarod Wilson "the correct amount of random data for " 146519e60e13SStephan Mueller "%s (requested %d)\n", algo, 146619e60e13SStephan Mueller template[i].rlen); 14677647d6ceSJarod Wilson goto out; 14687647d6ceSJarod Wilson } 14697647d6ceSJarod Wilson } 14707647d6ceSJarod Wilson 14717647d6ceSJarod Wilson err = memcmp(result, template[i].result, 14727647d6ceSJarod Wilson template[i].rlen); 14737647d6ceSJarod Wilson if (err) { 14747647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Test %d failed for %s\n", 14757647d6ceSJarod Wilson i, algo); 14767647d6ceSJarod Wilson hexdump(result, template[i].rlen); 14777647d6ceSJarod Wilson err = -EINVAL; 14787647d6ceSJarod Wilson goto out; 14797647d6ceSJarod Wilson } 14807647d6ceSJarod Wilson } 14817647d6ceSJarod Wilson 14827647d6ceSJarod Wilson out: 14837647d6ceSJarod Wilson kfree(seed); 14847647d6ceSJarod Wilson return err; 14857647d6ceSJarod Wilson } 14867647d6ceSJarod Wilson 1487da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver, 1488da7f033dSHerbert Xu u32 type, u32 mask) 1489da7f033dSHerbert Xu { 1490da7f033dSHerbert Xu struct crypto_aead *tfm; 1491da7f033dSHerbert Xu int err = 0; 1492da7f033dSHerbert Xu 1493425a8829SStephan Mueller tfm = crypto_alloc_aead(driver, type | CRYPTO_ALG_INTERNAL, mask); 1494da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1495da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to load transform for %s: " 1496da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1497da7f033dSHerbert Xu return PTR_ERR(tfm); 1498da7f033dSHerbert Xu } 1499da7f033dSHerbert Xu 1500da7f033dSHerbert Xu if (desc->suite.aead.enc.vecs) { 1501da7f033dSHerbert Xu err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs, 1502da7f033dSHerbert Xu desc->suite.aead.enc.count); 1503da7f033dSHerbert Xu if (err) 1504da7f033dSHerbert Xu goto out; 1505da7f033dSHerbert Xu } 1506da7f033dSHerbert Xu 1507da7f033dSHerbert Xu if (!err && desc->suite.aead.dec.vecs) 1508da7f033dSHerbert Xu err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs, 1509da7f033dSHerbert Xu desc->suite.aead.dec.count); 1510da7f033dSHerbert Xu 1511da7f033dSHerbert Xu out: 1512da7f033dSHerbert Xu crypto_free_aead(tfm); 1513da7f033dSHerbert Xu return err; 1514da7f033dSHerbert Xu } 1515da7f033dSHerbert Xu 1516da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc, 1517da7f033dSHerbert Xu const char *driver, u32 type, u32 mask) 1518da7f033dSHerbert Xu { 15191aa4ecd9SHerbert Xu struct crypto_cipher *tfm; 1520da7f033dSHerbert Xu int err = 0; 1521da7f033dSHerbert Xu 1522425a8829SStephan Mueller tfm = crypto_alloc_cipher(driver, type | CRYPTO_ALG_INTERNAL, mask); 1523da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1524da7f033dSHerbert Xu printk(KERN_ERR "alg: cipher: Failed to load transform for " 1525da7f033dSHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 1526da7f033dSHerbert Xu return PTR_ERR(tfm); 1527da7f033dSHerbert Xu } 1528da7f033dSHerbert Xu 1529da7f033dSHerbert Xu if (desc->suite.cipher.enc.vecs) { 1530da7f033dSHerbert Xu err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 1531da7f033dSHerbert Xu desc->suite.cipher.enc.count); 1532da7f033dSHerbert Xu if (err) 1533da7f033dSHerbert Xu goto out; 1534da7f033dSHerbert Xu } 1535da7f033dSHerbert Xu 1536da7f033dSHerbert Xu if (desc->suite.cipher.dec.vecs) 1537da7f033dSHerbert Xu err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 1538da7f033dSHerbert Xu desc->suite.cipher.dec.count); 1539da7f033dSHerbert Xu 1540da7f033dSHerbert Xu out: 15411aa4ecd9SHerbert Xu crypto_free_cipher(tfm); 15421aa4ecd9SHerbert Xu return err; 15431aa4ecd9SHerbert Xu } 15441aa4ecd9SHerbert Xu 15451aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc, 15461aa4ecd9SHerbert Xu const char *driver, u32 type, u32 mask) 15471aa4ecd9SHerbert Xu { 154812773d93SHerbert Xu struct crypto_skcipher *tfm; 15491aa4ecd9SHerbert Xu int err = 0; 15501aa4ecd9SHerbert Xu 155112773d93SHerbert Xu tfm = crypto_alloc_skcipher(driver, type | CRYPTO_ALG_INTERNAL, mask); 15521aa4ecd9SHerbert Xu if (IS_ERR(tfm)) { 15531aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Failed to load transform for " 15541aa4ecd9SHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 15551aa4ecd9SHerbert Xu return PTR_ERR(tfm); 15561aa4ecd9SHerbert Xu } 15571aa4ecd9SHerbert Xu 15581aa4ecd9SHerbert Xu if (desc->suite.cipher.enc.vecs) { 15591aa4ecd9SHerbert Xu err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 15601aa4ecd9SHerbert Xu desc->suite.cipher.enc.count); 15611aa4ecd9SHerbert Xu if (err) 15621aa4ecd9SHerbert Xu goto out; 15631aa4ecd9SHerbert Xu } 15641aa4ecd9SHerbert Xu 15651aa4ecd9SHerbert Xu if (desc->suite.cipher.dec.vecs) 15661aa4ecd9SHerbert Xu err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 15671aa4ecd9SHerbert Xu desc->suite.cipher.dec.count); 15681aa4ecd9SHerbert Xu 15691aa4ecd9SHerbert Xu out: 157012773d93SHerbert Xu crypto_free_skcipher(tfm); 1571da7f033dSHerbert Xu return err; 1572da7f033dSHerbert Xu } 1573da7f033dSHerbert Xu 1574da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver, 1575da7f033dSHerbert Xu u32 type, u32 mask) 1576da7f033dSHerbert Xu { 1577da7f033dSHerbert Xu struct crypto_comp *tfm; 1578da7f033dSHerbert Xu int err; 1579da7f033dSHerbert Xu 1580da7f033dSHerbert Xu tfm = crypto_alloc_comp(driver, type, mask); 1581da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1582da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Failed to load transform for %s: " 1583da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1584da7f033dSHerbert Xu return PTR_ERR(tfm); 1585da7f033dSHerbert Xu } 1586da7f033dSHerbert Xu 1587da7f033dSHerbert Xu err = test_comp(tfm, desc->suite.comp.comp.vecs, 1588da7f033dSHerbert Xu desc->suite.comp.decomp.vecs, 1589da7f033dSHerbert Xu desc->suite.comp.comp.count, 1590da7f033dSHerbert Xu desc->suite.comp.decomp.count); 1591da7f033dSHerbert Xu 1592da7f033dSHerbert Xu crypto_free_comp(tfm); 1593da7f033dSHerbert Xu return err; 1594da7f033dSHerbert Xu } 1595da7f033dSHerbert Xu 1596da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver, 1597da7f033dSHerbert Xu u32 type, u32 mask) 1598da7f033dSHerbert Xu { 1599da7f033dSHerbert Xu struct crypto_ahash *tfm; 1600da7f033dSHerbert Xu int err; 1601da7f033dSHerbert Xu 1602425a8829SStephan Mueller tfm = crypto_alloc_ahash(driver, type | CRYPTO_ALG_INTERNAL, mask); 1603da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1604da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to load transform for %s: " 1605da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1606da7f033dSHerbert Xu return PTR_ERR(tfm); 1607da7f033dSHerbert Xu } 1608da7f033dSHerbert Xu 1609a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1610a8f1a052SDavid S. Miller desc->suite.hash.count, true); 1611a8f1a052SDavid S. Miller if (!err) 1612a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1613a8f1a052SDavid S. Miller desc->suite.hash.count, false); 1614da7f033dSHerbert Xu 1615da7f033dSHerbert Xu crypto_free_ahash(tfm); 1616da7f033dSHerbert Xu return err; 1617da7f033dSHerbert Xu } 1618da7f033dSHerbert Xu 16198e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc, 16208e3ee85eSHerbert Xu const char *driver, u32 type, u32 mask) 16218e3ee85eSHerbert Xu { 16228e3ee85eSHerbert Xu struct crypto_shash *tfm; 16238e3ee85eSHerbert Xu u32 val; 16248e3ee85eSHerbert Xu int err; 16258e3ee85eSHerbert Xu 16268e3ee85eSHerbert Xu err = alg_test_hash(desc, driver, type, mask); 16278e3ee85eSHerbert Xu if (err) 16288e3ee85eSHerbert Xu goto out; 16298e3ee85eSHerbert Xu 1630425a8829SStephan Mueller tfm = crypto_alloc_shash(driver, type | CRYPTO_ALG_INTERNAL, mask); 16318e3ee85eSHerbert Xu if (IS_ERR(tfm)) { 16328e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: " 16338e3ee85eSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 16348e3ee85eSHerbert Xu err = PTR_ERR(tfm); 16358e3ee85eSHerbert Xu goto out; 16368e3ee85eSHerbert Xu } 16378e3ee85eSHerbert Xu 16388e3ee85eSHerbert Xu do { 16394c5c3024SJan-Simon Möller SHASH_DESC_ON_STACK(shash, tfm); 16404c5c3024SJan-Simon Möller u32 *ctx = (u32 *)shash_desc_ctx(shash); 16418e3ee85eSHerbert Xu 16424c5c3024SJan-Simon Möller shash->tfm = tfm; 16434c5c3024SJan-Simon Möller shash->flags = 0; 16448e3ee85eSHerbert Xu 16454c5c3024SJan-Simon Möller *ctx = le32_to_cpu(420553207); 16464c5c3024SJan-Simon Möller err = crypto_shash_final(shash, (u8 *)&val); 16478e3ee85eSHerbert Xu if (err) { 16488e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Operation failed for " 16498e3ee85eSHerbert Xu "%s: %d\n", driver, err); 16508e3ee85eSHerbert Xu break; 16518e3ee85eSHerbert Xu } 16528e3ee85eSHerbert Xu 16538e3ee85eSHerbert Xu if (val != ~420553207) { 16548e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Test failed for %s: " 16558e3ee85eSHerbert Xu "%d\n", driver, val); 16568e3ee85eSHerbert Xu err = -EINVAL; 16578e3ee85eSHerbert Xu } 16588e3ee85eSHerbert Xu } while (0); 16598e3ee85eSHerbert Xu 16608e3ee85eSHerbert Xu crypto_free_shash(tfm); 16618e3ee85eSHerbert Xu 16628e3ee85eSHerbert Xu out: 16638e3ee85eSHerbert Xu return err; 16648e3ee85eSHerbert Xu } 16658e3ee85eSHerbert Xu 16667647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver, 16677647d6ceSJarod Wilson u32 type, u32 mask) 16687647d6ceSJarod Wilson { 16697647d6ceSJarod Wilson struct crypto_rng *rng; 16707647d6ceSJarod Wilson int err; 16717647d6ceSJarod Wilson 1672425a8829SStephan Mueller rng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask); 16737647d6ceSJarod Wilson if (IS_ERR(rng)) { 16747647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to load transform for %s: " 16757647d6ceSJarod Wilson "%ld\n", driver, PTR_ERR(rng)); 16767647d6ceSJarod Wilson return PTR_ERR(rng); 16777647d6ceSJarod Wilson } 16787647d6ceSJarod Wilson 16797647d6ceSJarod Wilson err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count); 16807647d6ceSJarod Wilson 16817647d6ceSJarod Wilson crypto_free_rng(rng); 16827647d6ceSJarod Wilson 16837647d6ceSJarod Wilson return err; 16847647d6ceSJarod Wilson } 16857647d6ceSJarod Wilson 168664d1cdfbSStephan Mueller 168764d1cdfbSStephan Mueller static int drbg_cavs_test(struct drbg_testvec *test, int pr, 168864d1cdfbSStephan Mueller const char *driver, u32 type, u32 mask) 168964d1cdfbSStephan Mueller { 169064d1cdfbSStephan Mueller int ret = -EAGAIN; 169164d1cdfbSStephan Mueller struct crypto_rng *drng; 169264d1cdfbSStephan Mueller struct drbg_test_data test_data; 169364d1cdfbSStephan Mueller struct drbg_string addtl, pers, testentropy; 169464d1cdfbSStephan Mueller unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL); 169564d1cdfbSStephan Mueller 169664d1cdfbSStephan Mueller if (!buf) 169764d1cdfbSStephan Mueller return -ENOMEM; 169864d1cdfbSStephan Mueller 1699425a8829SStephan Mueller drng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask); 170064d1cdfbSStephan Mueller if (IS_ERR(drng)) { 170164d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for " 170264d1cdfbSStephan Mueller "%s\n", driver); 170364d1cdfbSStephan Mueller kzfree(buf); 170464d1cdfbSStephan Mueller return -ENOMEM; 170564d1cdfbSStephan Mueller } 170664d1cdfbSStephan Mueller 170764d1cdfbSStephan Mueller test_data.testentropy = &testentropy; 170864d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entropy, test->entropylen); 170964d1cdfbSStephan Mueller drbg_string_fill(&pers, test->pers, test->perslen); 171064d1cdfbSStephan Mueller ret = crypto_drbg_reset_test(drng, &pers, &test_data); 171164d1cdfbSStephan Mueller if (ret) { 171264d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: Failed to reset rng\n"); 171364d1cdfbSStephan Mueller goto outbuf; 171464d1cdfbSStephan Mueller } 171564d1cdfbSStephan Mueller 171664d1cdfbSStephan Mueller drbg_string_fill(&addtl, test->addtla, test->addtllen); 171764d1cdfbSStephan Mueller if (pr) { 171864d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entpra, test->entprlen); 171964d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl_test(drng, 172064d1cdfbSStephan Mueller buf, test->expectedlen, &addtl, &test_data); 172164d1cdfbSStephan Mueller } else { 172264d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl(drng, 172364d1cdfbSStephan Mueller buf, test->expectedlen, &addtl); 172464d1cdfbSStephan Mueller } 172519e60e13SStephan Mueller if (ret < 0) { 172664d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not obtain random data for " 172764d1cdfbSStephan Mueller "driver %s\n", driver); 172864d1cdfbSStephan Mueller goto outbuf; 172964d1cdfbSStephan Mueller } 173064d1cdfbSStephan Mueller 173164d1cdfbSStephan Mueller drbg_string_fill(&addtl, test->addtlb, test->addtllen); 173264d1cdfbSStephan Mueller if (pr) { 173364d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entprb, test->entprlen); 173464d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl_test(drng, 173564d1cdfbSStephan Mueller buf, test->expectedlen, &addtl, &test_data); 173664d1cdfbSStephan Mueller } else { 173764d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl(drng, 173864d1cdfbSStephan Mueller buf, test->expectedlen, &addtl); 173964d1cdfbSStephan Mueller } 174019e60e13SStephan Mueller if (ret < 0) { 174164d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not obtain random data for " 174264d1cdfbSStephan Mueller "driver %s\n", driver); 174364d1cdfbSStephan Mueller goto outbuf; 174464d1cdfbSStephan Mueller } 174564d1cdfbSStephan Mueller 174664d1cdfbSStephan Mueller ret = memcmp(test->expected, buf, test->expectedlen); 174764d1cdfbSStephan Mueller 174864d1cdfbSStephan Mueller outbuf: 174964d1cdfbSStephan Mueller crypto_free_rng(drng); 175064d1cdfbSStephan Mueller kzfree(buf); 175164d1cdfbSStephan Mueller return ret; 175264d1cdfbSStephan Mueller } 175364d1cdfbSStephan Mueller 175464d1cdfbSStephan Mueller 175564d1cdfbSStephan Mueller static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver, 175664d1cdfbSStephan Mueller u32 type, u32 mask) 175764d1cdfbSStephan Mueller { 175864d1cdfbSStephan Mueller int err = 0; 175964d1cdfbSStephan Mueller int pr = 0; 176064d1cdfbSStephan Mueller int i = 0; 176164d1cdfbSStephan Mueller struct drbg_testvec *template = desc->suite.drbg.vecs; 176264d1cdfbSStephan Mueller unsigned int tcount = desc->suite.drbg.count; 176364d1cdfbSStephan Mueller 176464d1cdfbSStephan Mueller if (0 == memcmp(driver, "drbg_pr_", 8)) 176564d1cdfbSStephan Mueller pr = 1; 176664d1cdfbSStephan Mueller 176764d1cdfbSStephan Mueller for (i = 0; i < tcount; i++) { 176864d1cdfbSStephan Mueller err = drbg_cavs_test(&template[i], pr, driver, type, mask); 176964d1cdfbSStephan Mueller if (err) { 177064d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: Test %d failed for %s\n", 177164d1cdfbSStephan Mueller i, driver); 177264d1cdfbSStephan Mueller err = -EINVAL; 177364d1cdfbSStephan Mueller break; 177464d1cdfbSStephan Mueller } 177564d1cdfbSStephan Mueller } 177664d1cdfbSStephan Mueller return err; 177764d1cdfbSStephan Mueller 177864d1cdfbSStephan Mueller } 177964d1cdfbSStephan Mueller 1780946cc463STadeusz Struk static int do_test_rsa(struct crypto_akcipher *tfm, 1781946cc463STadeusz Struk struct akcipher_testvec *vecs) 1782946cc463STadeusz Struk { 1783946cc463STadeusz Struk struct akcipher_request *req; 1784946cc463STadeusz Struk void *outbuf_enc = NULL; 1785946cc463STadeusz Struk void *outbuf_dec = NULL; 1786946cc463STadeusz Struk struct tcrypt_result result; 1787946cc463STadeusz Struk unsigned int out_len_max, out_len = 0; 1788946cc463STadeusz Struk int err = -ENOMEM; 178922287b0bSTadeusz Struk struct scatterlist src, dst, src_tab[2]; 1790946cc463STadeusz Struk 1791946cc463STadeusz Struk req = akcipher_request_alloc(tfm, GFP_KERNEL); 1792946cc463STadeusz Struk if (!req) 1793946cc463STadeusz Struk return err; 1794946cc463STadeusz Struk 1795946cc463STadeusz Struk init_completion(&result.completion); 179622287b0bSTadeusz Struk 179722287b0bSTadeusz Struk if (vecs->public_key_vec) 179822287b0bSTadeusz Struk err = crypto_akcipher_set_pub_key(tfm, vecs->key, 179922287b0bSTadeusz Struk vecs->key_len); 180022287b0bSTadeusz Struk else 180122287b0bSTadeusz Struk err = crypto_akcipher_set_priv_key(tfm, vecs->key, 180222287b0bSTadeusz Struk vecs->key_len); 1803946cc463STadeusz Struk if (err) 1804946cc463STadeusz Struk goto free_req; 1805946cc463STadeusz Struk 180622287b0bSTadeusz Struk out_len_max = crypto_akcipher_maxsize(tfm); 1807946cc463STadeusz Struk outbuf_enc = kzalloc(out_len_max, GFP_KERNEL); 1808946cc463STadeusz Struk if (!outbuf_enc) 1809946cc463STadeusz Struk goto free_req; 1810946cc463STadeusz Struk 181122287b0bSTadeusz Struk sg_init_table(src_tab, 2); 181222287b0bSTadeusz Struk sg_set_buf(&src_tab[0], vecs->m, 8); 181322287b0bSTadeusz Struk sg_set_buf(&src_tab[1], vecs->m + 8, vecs->m_size - 8); 181422287b0bSTadeusz Struk sg_init_one(&dst, outbuf_enc, out_len_max); 181522287b0bSTadeusz Struk akcipher_request_set_crypt(req, src_tab, &dst, vecs->m_size, 181622287b0bSTadeusz Struk out_len_max); 1817946cc463STadeusz Struk akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 1818946cc463STadeusz Struk tcrypt_complete, &result); 1819946cc463STadeusz Struk 1820946cc463STadeusz Struk /* Run RSA encrypt - c = m^e mod n;*/ 1821946cc463STadeusz Struk err = wait_async_op(&result, crypto_akcipher_encrypt(req)); 1822946cc463STadeusz Struk if (err) { 1823946cc463STadeusz Struk pr_err("alg: rsa: encrypt test failed. err %d\n", err); 1824946cc463STadeusz Struk goto free_all; 1825946cc463STadeusz Struk } 182622287b0bSTadeusz Struk if (req->dst_len != vecs->c_size) { 1827946cc463STadeusz Struk pr_err("alg: rsa: encrypt test failed. Invalid output len\n"); 1828946cc463STadeusz Struk err = -EINVAL; 1829946cc463STadeusz Struk goto free_all; 1830946cc463STadeusz Struk } 1831946cc463STadeusz Struk /* verify that encrypted message is equal to expected */ 183222287b0bSTadeusz Struk if (memcmp(vecs->c, sg_virt(req->dst), vecs->c_size)) { 1833946cc463STadeusz Struk pr_err("alg: rsa: encrypt test failed. Invalid output\n"); 1834946cc463STadeusz Struk err = -EINVAL; 1835946cc463STadeusz Struk goto free_all; 1836946cc463STadeusz Struk } 1837946cc463STadeusz Struk /* Don't invoke decrypt for vectors with public key */ 1838946cc463STadeusz Struk if (vecs->public_key_vec) { 1839946cc463STadeusz Struk err = 0; 1840946cc463STadeusz Struk goto free_all; 1841946cc463STadeusz Struk } 1842946cc463STadeusz Struk outbuf_dec = kzalloc(out_len_max, GFP_KERNEL); 1843946cc463STadeusz Struk if (!outbuf_dec) { 1844946cc463STadeusz Struk err = -ENOMEM; 1845946cc463STadeusz Struk goto free_all; 1846946cc463STadeusz Struk } 184722287b0bSTadeusz Struk sg_init_one(&src, vecs->c, vecs->c_size); 184822287b0bSTadeusz Struk sg_init_one(&dst, outbuf_dec, out_len_max); 1849946cc463STadeusz Struk init_completion(&result.completion); 185022287b0bSTadeusz Struk akcipher_request_set_crypt(req, &src, &dst, vecs->c_size, out_len_max); 1851946cc463STadeusz Struk 1852946cc463STadeusz Struk /* Run RSA decrypt - m = c^d mod n;*/ 1853946cc463STadeusz Struk err = wait_async_op(&result, crypto_akcipher_decrypt(req)); 1854946cc463STadeusz Struk if (err) { 1855946cc463STadeusz Struk pr_err("alg: rsa: decrypt test failed. err %d\n", err); 1856946cc463STadeusz Struk goto free_all; 1857946cc463STadeusz Struk } 1858946cc463STadeusz Struk out_len = req->dst_len; 1859946cc463STadeusz Struk if (out_len != vecs->m_size) { 1860946cc463STadeusz Struk pr_err("alg: rsa: decrypt test failed. Invalid output len\n"); 1861946cc463STadeusz Struk err = -EINVAL; 1862946cc463STadeusz Struk goto free_all; 1863946cc463STadeusz Struk } 1864946cc463STadeusz Struk /* verify that decrypted message is equal to the original msg */ 1865946cc463STadeusz Struk if (memcmp(vecs->m, outbuf_dec, vecs->m_size)) { 1866946cc463STadeusz Struk pr_err("alg: rsa: decrypt test failed. Invalid output\n"); 1867946cc463STadeusz Struk err = -EINVAL; 1868946cc463STadeusz Struk } 1869946cc463STadeusz Struk free_all: 1870946cc463STadeusz Struk kfree(outbuf_dec); 1871946cc463STadeusz Struk kfree(outbuf_enc); 1872946cc463STadeusz Struk free_req: 1873946cc463STadeusz Struk akcipher_request_free(req); 1874946cc463STadeusz Struk return err; 1875946cc463STadeusz Struk } 1876946cc463STadeusz Struk 1877946cc463STadeusz Struk static int test_rsa(struct crypto_akcipher *tfm, struct akcipher_testvec *vecs, 1878946cc463STadeusz Struk unsigned int tcount) 1879946cc463STadeusz Struk { 1880946cc463STadeusz Struk int ret, i; 1881946cc463STadeusz Struk 1882946cc463STadeusz Struk for (i = 0; i < tcount; i++) { 1883946cc463STadeusz Struk ret = do_test_rsa(tfm, vecs++); 1884946cc463STadeusz Struk if (ret) { 1885946cc463STadeusz Struk pr_err("alg: rsa: test failed on vector %d, err=%d\n", 1886946cc463STadeusz Struk i + 1, ret); 1887946cc463STadeusz Struk return ret; 1888946cc463STadeusz Struk } 1889946cc463STadeusz Struk } 1890946cc463STadeusz Struk return 0; 1891946cc463STadeusz Struk } 1892946cc463STadeusz Struk 1893946cc463STadeusz Struk static int test_akcipher(struct crypto_akcipher *tfm, const char *alg, 1894946cc463STadeusz Struk struct akcipher_testvec *vecs, unsigned int tcount) 1895946cc463STadeusz Struk { 1896946cc463STadeusz Struk if (strncmp(alg, "rsa", 3) == 0) 1897946cc463STadeusz Struk return test_rsa(tfm, vecs, tcount); 1898946cc463STadeusz Struk 1899946cc463STadeusz Struk return 0; 1900946cc463STadeusz Struk } 1901946cc463STadeusz Struk 1902946cc463STadeusz Struk static int alg_test_akcipher(const struct alg_test_desc *desc, 1903946cc463STadeusz Struk const char *driver, u32 type, u32 mask) 1904946cc463STadeusz Struk { 1905946cc463STadeusz Struk struct crypto_akcipher *tfm; 1906946cc463STadeusz Struk int err = 0; 1907946cc463STadeusz Struk 1908946cc463STadeusz Struk tfm = crypto_alloc_akcipher(driver, type | CRYPTO_ALG_INTERNAL, mask); 1909946cc463STadeusz Struk if (IS_ERR(tfm)) { 1910946cc463STadeusz Struk pr_err("alg: akcipher: Failed to load tfm for %s: %ld\n", 1911946cc463STadeusz Struk driver, PTR_ERR(tfm)); 1912946cc463STadeusz Struk return PTR_ERR(tfm); 1913946cc463STadeusz Struk } 1914946cc463STadeusz Struk if (desc->suite.akcipher.vecs) 1915946cc463STadeusz Struk err = test_akcipher(tfm, desc->alg, desc->suite.akcipher.vecs, 1916946cc463STadeusz Struk desc->suite.akcipher.count); 1917946cc463STadeusz Struk 1918946cc463STadeusz Struk crypto_free_akcipher(tfm); 1919946cc463STadeusz Struk return err; 1920946cc463STadeusz Struk } 1921946cc463STadeusz Struk 1922863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc, 1923863b557aSYouquan, Song const char *driver, u32 type, u32 mask) 1924863b557aSYouquan, Song { 1925863b557aSYouquan, Song return 0; 1926863b557aSYouquan, Song } 1927863b557aSYouquan, Song 1928da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */ 1929da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = { 1930da7f033dSHerbert Xu { 19314d6d6a2cSJohannes Goetzfried .alg = "__cbc-cast5-avx", 19324d6d6a2cSJohannes Goetzfried .test = alg_test_null, 19334d6d6a2cSJohannes Goetzfried }, { 19344ea1277dSJohannes Goetzfried .alg = "__cbc-cast6-avx", 19354ea1277dSJohannes Goetzfried .test = alg_test_null, 19364ea1277dSJohannes Goetzfried }, { 19377efe4076SJohannes Goetzfried .alg = "__cbc-serpent-avx", 19387efe4076SJohannes Goetzfried .test = alg_test_null, 19397efe4076SJohannes Goetzfried }, { 194056d76c96SJussi Kivilinna .alg = "__cbc-serpent-avx2", 194156d76c96SJussi Kivilinna .test = alg_test_null, 194256d76c96SJussi Kivilinna }, { 1943937c30d7SJussi Kivilinna .alg = "__cbc-serpent-sse2", 1944937c30d7SJussi Kivilinna .test = alg_test_null, 1945937c30d7SJussi Kivilinna }, { 1946107778b5SJohannes Goetzfried .alg = "__cbc-twofish-avx", 1947107778b5SJohannes Goetzfried .test = alg_test_null, 1948107778b5SJohannes Goetzfried }, { 1949863b557aSYouquan, Song .alg = "__driver-cbc-aes-aesni", 1950863b557aSYouquan, Song .test = alg_test_null, 19516c79294fSMilan Broz .fips_allowed = 1, 1952863b557aSYouquan, Song }, { 1953d9b1d2e7SJussi Kivilinna .alg = "__driver-cbc-camellia-aesni", 1954d9b1d2e7SJussi Kivilinna .test = alg_test_null, 1955d9b1d2e7SJussi Kivilinna }, { 1956f3f935a7SJussi Kivilinna .alg = "__driver-cbc-camellia-aesni-avx2", 1957f3f935a7SJussi Kivilinna .test = alg_test_null, 1958f3f935a7SJussi Kivilinna }, { 19594d6d6a2cSJohannes Goetzfried .alg = "__driver-cbc-cast5-avx", 19604d6d6a2cSJohannes Goetzfried .test = alg_test_null, 19614d6d6a2cSJohannes Goetzfried }, { 19624ea1277dSJohannes Goetzfried .alg = "__driver-cbc-cast6-avx", 19634ea1277dSJohannes Goetzfried .test = alg_test_null, 19644ea1277dSJohannes Goetzfried }, { 19657efe4076SJohannes Goetzfried .alg = "__driver-cbc-serpent-avx", 19667efe4076SJohannes Goetzfried .test = alg_test_null, 19677efe4076SJohannes Goetzfried }, { 196856d76c96SJussi Kivilinna .alg = "__driver-cbc-serpent-avx2", 196956d76c96SJussi Kivilinna .test = alg_test_null, 197056d76c96SJussi Kivilinna }, { 1971937c30d7SJussi Kivilinna .alg = "__driver-cbc-serpent-sse2", 1972937c30d7SJussi Kivilinna .test = alg_test_null, 1973937c30d7SJussi Kivilinna }, { 1974107778b5SJohannes Goetzfried .alg = "__driver-cbc-twofish-avx", 1975107778b5SJohannes Goetzfried .test = alg_test_null, 1976107778b5SJohannes Goetzfried }, { 1977863b557aSYouquan, Song .alg = "__driver-ecb-aes-aesni", 1978863b557aSYouquan, Song .test = alg_test_null, 19796c79294fSMilan Broz .fips_allowed = 1, 1980863b557aSYouquan, Song }, { 1981d9b1d2e7SJussi Kivilinna .alg = "__driver-ecb-camellia-aesni", 1982d9b1d2e7SJussi Kivilinna .test = alg_test_null, 1983d9b1d2e7SJussi Kivilinna }, { 1984f3f935a7SJussi Kivilinna .alg = "__driver-ecb-camellia-aesni-avx2", 1985f3f935a7SJussi Kivilinna .test = alg_test_null, 1986f3f935a7SJussi Kivilinna }, { 19874d6d6a2cSJohannes Goetzfried .alg = "__driver-ecb-cast5-avx", 19884d6d6a2cSJohannes Goetzfried .test = alg_test_null, 19894d6d6a2cSJohannes Goetzfried }, { 19904ea1277dSJohannes Goetzfried .alg = "__driver-ecb-cast6-avx", 19914ea1277dSJohannes Goetzfried .test = alg_test_null, 19924ea1277dSJohannes Goetzfried }, { 19937efe4076SJohannes Goetzfried .alg = "__driver-ecb-serpent-avx", 19947efe4076SJohannes Goetzfried .test = alg_test_null, 19957efe4076SJohannes Goetzfried }, { 199656d76c96SJussi Kivilinna .alg = "__driver-ecb-serpent-avx2", 199756d76c96SJussi Kivilinna .test = alg_test_null, 199856d76c96SJussi Kivilinna }, { 1999937c30d7SJussi Kivilinna .alg = "__driver-ecb-serpent-sse2", 2000937c30d7SJussi Kivilinna .test = alg_test_null, 2001937c30d7SJussi Kivilinna }, { 2002107778b5SJohannes Goetzfried .alg = "__driver-ecb-twofish-avx", 2003107778b5SJohannes Goetzfried .test = alg_test_null, 2004107778b5SJohannes Goetzfried }, { 20059d77b6c2STadeusz Struk .alg = "__driver-gcm-aes-aesni", 20069d77b6c2STadeusz Struk .test = alg_test_null, 20079d77b6c2STadeusz Struk .fips_allowed = 1, 20089d77b6c2STadeusz Struk }, { 2009863b557aSYouquan, Song .alg = "__ghash-pclmulqdqni", 2010863b557aSYouquan, Song .test = alg_test_null, 20116c79294fSMilan Broz .fips_allowed = 1, 2012863b557aSYouquan, Song }, { 2013e08ca2daSJarod Wilson .alg = "ansi_cprng", 2014e08ca2daSJarod Wilson .test = alg_test_cprng, 2015e08ca2daSJarod Wilson .suite = { 2016e08ca2daSJarod Wilson .cprng = { 2017e08ca2daSJarod Wilson .vecs = ansi_cprng_aes_tv_template, 2018e08ca2daSJarod Wilson .count = ANSI_CPRNG_AES_TEST_VECTORS 2019e08ca2daSJarod Wilson } 2020e08ca2daSJarod Wilson } 2021e08ca2daSJarod Wilson }, { 2022bca4feb0SHoria Geanta .alg = "authenc(hmac(md5),ecb(cipher_null))", 2023bca4feb0SHoria Geanta .test = alg_test_aead, 2024bca4feb0SHoria Geanta .suite = { 2025bca4feb0SHoria Geanta .aead = { 2026bca4feb0SHoria Geanta .enc = { 2027bca4feb0SHoria Geanta .vecs = hmac_md5_ecb_cipher_null_enc_tv_template, 2028bca4feb0SHoria Geanta .count = HMAC_MD5_ECB_CIPHER_NULL_ENC_TEST_VECTORS 2029bca4feb0SHoria Geanta }, 2030bca4feb0SHoria Geanta .dec = { 2031bca4feb0SHoria Geanta .vecs = hmac_md5_ecb_cipher_null_dec_tv_template, 2032bca4feb0SHoria Geanta .count = HMAC_MD5_ECB_CIPHER_NULL_DEC_TEST_VECTORS 2033bca4feb0SHoria Geanta } 2034bca4feb0SHoria Geanta } 2035bca4feb0SHoria Geanta } 2036bca4feb0SHoria Geanta }, { 2037a4198fd4SHerbert Xu .alg = "authenc(hmac(sha1),cbc(aes))", 2038e46e9a46SHoria Geanta .test = alg_test_aead, 2039e46e9a46SHoria Geanta .suite = { 2040e46e9a46SHoria Geanta .aead = { 2041e46e9a46SHoria Geanta .enc = { 20425208ed2cSNitesh Lal .vecs = 20435208ed2cSNitesh Lal hmac_sha1_aes_cbc_enc_tv_temp, 20445208ed2cSNitesh Lal .count = 20455208ed2cSNitesh Lal HMAC_SHA1_AES_CBC_ENC_TEST_VEC 20465208ed2cSNitesh Lal } 20475208ed2cSNitesh Lal } 20485208ed2cSNitesh Lal } 20495208ed2cSNitesh Lal }, { 2050a4198fd4SHerbert Xu .alg = "authenc(hmac(sha1),cbc(des))", 20515208ed2cSNitesh Lal .test = alg_test_aead, 20525208ed2cSNitesh Lal .suite = { 20535208ed2cSNitesh Lal .aead = { 20545208ed2cSNitesh Lal .enc = { 20555208ed2cSNitesh Lal .vecs = 20565208ed2cSNitesh Lal hmac_sha1_des_cbc_enc_tv_temp, 20575208ed2cSNitesh Lal .count = 20585208ed2cSNitesh Lal HMAC_SHA1_DES_CBC_ENC_TEST_VEC 20595208ed2cSNitesh Lal } 20605208ed2cSNitesh Lal } 20615208ed2cSNitesh Lal } 20625208ed2cSNitesh Lal }, { 2063a4198fd4SHerbert Xu .alg = "authenc(hmac(sha1),cbc(des3_ede))", 20645208ed2cSNitesh Lal .test = alg_test_aead, 2065ed1afac9SMarcus Meissner .fips_allowed = 1, 20665208ed2cSNitesh Lal .suite = { 20675208ed2cSNitesh Lal .aead = { 20685208ed2cSNitesh Lal .enc = { 20695208ed2cSNitesh Lal .vecs = 20705208ed2cSNitesh Lal hmac_sha1_des3_ede_cbc_enc_tv_temp, 20715208ed2cSNitesh Lal .count = 20725208ed2cSNitesh Lal HMAC_SHA1_DES3_EDE_CBC_ENC_TEST_VEC 2073e46e9a46SHoria Geanta } 2074e46e9a46SHoria Geanta } 2075e46e9a46SHoria Geanta } 2076e46e9a46SHoria Geanta }, { 2077fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha1),ctr(aes))", 2078fb16abc2SMarcus Meissner .test = alg_test_null, 2079fb16abc2SMarcus Meissner .fips_allowed = 1, 2080fb16abc2SMarcus Meissner }, { 2081bca4feb0SHoria Geanta .alg = "authenc(hmac(sha1),ecb(cipher_null))", 2082bca4feb0SHoria Geanta .test = alg_test_aead, 2083bca4feb0SHoria Geanta .suite = { 2084bca4feb0SHoria Geanta .aead = { 2085bca4feb0SHoria Geanta .enc = { 20865208ed2cSNitesh Lal .vecs = 20875208ed2cSNitesh Lal hmac_sha1_ecb_cipher_null_enc_tv_temp, 20885208ed2cSNitesh Lal .count = 20895208ed2cSNitesh Lal HMAC_SHA1_ECB_CIPHER_NULL_ENC_TEST_VEC 2090bca4feb0SHoria Geanta }, 2091bca4feb0SHoria Geanta .dec = { 20925208ed2cSNitesh Lal .vecs = 20935208ed2cSNitesh Lal hmac_sha1_ecb_cipher_null_dec_tv_temp, 20945208ed2cSNitesh Lal .count = 20955208ed2cSNitesh Lal HMAC_SHA1_ECB_CIPHER_NULL_DEC_TEST_VEC 20965208ed2cSNitesh Lal } 20975208ed2cSNitesh Lal } 20985208ed2cSNitesh Lal } 20995208ed2cSNitesh Lal }, { 21008888690eSMarcus Meissner .alg = "authenc(hmac(sha1),rfc3686(ctr(aes)))", 21018888690eSMarcus Meissner .test = alg_test_null, 21028888690eSMarcus Meissner .fips_allowed = 1, 21038888690eSMarcus Meissner }, { 2104a4198fd4SHerbert Xu .alg = "authenc(hmac(sha224),cbc(des))", 21055208ed2cSNitesh Lal .test = alg_test_aead, 21065208ed2cSNitesh Lal .suite = { 21075208ed2cSNitesh Lal .aead = { 21085208ed2cSNitesh Lal .enc = { 21095208ed2cSNitesh Lal .vecs = 21105208ed2cSNitesh Lal hmac_sha224_des_cbc_enc_tv_temp, 21115208ed2cSNitesh Lal .count = 21125208ed2cSNitesh Lal HMAC_SHA224_DES_CBC_ENC_TEST_VEC 21135208ed2cSNitesh Lal } 21145208ed2cSNitesh Lal } 21155208ed2cSNitesh Lal } 21165208ed2cSNitesh Lal }, { 2117a4198fd4SHerbert Xu .alg = "authenc(hmac(sha224),cbc(des3_ede))", 21185208ed2cSNitesh Lal .test = alg_test_aead, 2119ed1afac9SMarcus Meissner .fips_allowed = 1, 21205208ed2cSNitesh Lal .suite = { 21215208ed2cSNitesh Lal .aead = { 21225208ed2cSNitesh Lal .enc = { 21235208ed2cSNitesh Lal .vecs = 21245208ed2cSNitesh Lal hmac_sha224_des3_ede_cbc_enc_tv_temp, 21255208ed2cSNitesh Lal .count = 21265208ed2cSNitesh Lal HMAC_SHA224_DES3_EDE_CBC_ENC_TEST_VEC 2127bca4feb0SHoria Geanta } 2128bca4feb0SHoria Geanta } 2129bca4feb0SHoria Geanta } 2130bca4feb0SHoria Geanta }, { 2131a4198fd4SHerbert Xu .alg = "authenc(hmac(sha256),cbc(aes))", 2132e46e9a46SHoria Geanta .test = alg_test_aead, 2133ed1afac9SMarcus Meissner .fips_allowed = 1, 2134e46e9a46SHoria Geanta .suite = { 2135e46e9a46SHoria Geanta .aead = { 2136e46e9a46SHoria Geanta .enc = { 21375208ed2cSNitesh Lal .vecs = 21385208ed2cSNitesh Lal hmac_sha256_aes_cbc_enc_tv_temp, 21395208ed2cSNitesh Lal .count = 21405208ed2cSNitesh Lal HMAC_SHA256_AES_CBC_ENC_TEST_VEC 21415208ed2cSNitesh Lal } 21425208ed2cSNitesh Lal } 21435208ed2cSNitesh Lal } 21445208ed2cSNitesh Lal }, { 2145a4198fd4SHerbert Xu .alg = "authenc(hmac(sha256),cbc(des))", 21465208ed2cSNitesh Lal .test = alg_test_aead, 21475208ed2cSNitesh Lal .suite = { 21485208ed2cSNitesh Lal .aead = { 21495208ed2cSNitesh Lal .enc = { 21505208ed2cSNitesh Lal .vecs = 21515208ed2cSNitesh Lal hmac_sha256_des_cbc_enc_tv_temp, 21525208ed2cSNitesh Lal .count = 21535208ed2cSNitesh Lal HMAC_SHA256_DES_CBC_ENC_TEST_VEC 21545208ed2cSNitesh Lal } 21555208ed2cSNitesh Lal } 21565208ed2cSNitesh Lal } 21575208ed2cSNitesh Lal }, { 2158a4198fd4SHerbert Xu .alg = "authenc(hmac(sha256),cbc(des3_ede))", 21595208ed2cSNitesh Lal .test = alg_test_aead, 2160ed1afac9SMarcus Meissner .fips_allowed = 1, 21615208ed2cSNitesh Lal .suite = { 21625208ed2cSNitesh Lal .aead = { 21635208ed2cSNitesh Lal .enc = { 21645208ed2cSNitesh Lal .vecs = 21655208ed2cSNitesh Lal hmac_sha256_des3_ede_cbc_enc_tv_temp, 21665208ed2cSNitesh Lal .count = 21675208ed2cSNitesh Lal HMAC_SHA256_DES3_EDE_CBC_ENC_TEST_VEC 21685208ed2cSNitesh Lal } 21695208ed2cSNitesh Lal } 21705208ed2cSNitesh Lal } 21715208ed2cSNitesh Lal }, { 2172fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha256),ctr(aes))", 2173fb16abc2SMarcus Meissner .test = alg_test_null, 2174fb16abc2SMarcus Meissner .fips_allowed = 1, 2175fb16abc2SMarcus Meissner }, { 21768888690eSMarcus Meissner .alg = "authenc(hmac(sha256),rfc3686(ctr(aes)))", 21778888690eSMarcus Meissner .test = alg_test_null, 21788888690eSMarcus Meissner .fips_allowed = 1, 21798888690eSMarcus Meissner }, { 2180a4198fd4SHerbert Xu .alg = "authenc(hmac(sha384),cbc(des))", 21815208ed2cSNitesh Lal .test = alg_test_aead, 21825208ed2cSNitesh Lal .suite = { 21835208ed2cSNitesh Lal .aead = { 21845208ed2cSNitesh Lal .enc = { 21855208ed2cSNitesh Lal .vecs = 21865208ed2cSNitesh Lal hmac_sha384_des_cbc_enc_tv_temp, 21875208ed2cSNitesh Lal .count = 21885208ed2cSNitesh Lal HMAC_SHA384_DES_CBC_ENC_TEST_VEC 21895208ed2cSNitesh Lal } 21905208ed2cSNitesh Lal } 21915208ed2cSNitesh Lal } 21925208ed2cSNitesh Lal }, { 2193a4198fd4SHerbert Xu .alg = "authenc(hmac(sha384),cbc(des3_ede))", 21945208ed2cSNitesh Lal .test = alg_test_aead, 2195ed1afac9SMarcus Meissner .fips_allowed = 1, 21965208ed2cSNitesh Lal .suite = { 21975208ed2cSNitesh Lal .aead = { 21985208ed2cSNitesh Lal .enc = { 21995208ed2cSNitesh Lal .vecs = 22005208ed2cSNitesh Lal hmac_sha384_des3_ede_cbc_enc_tv_temp, 22015208ed2cSNitesh Lal .count = 22025208ed2cSNitesh Lal HMAC_SHA384_DES3_EDE_CBC_ENC_TEST_VEC 2203e46e9a46SHoria Geanta } 2204e46e9a46SHoria Geanta } 2205e46e9a46SHoria Geanta } 2206e46e9a46SHoria Geanta }, { 2207fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha384),ctr(aes))", 2208fb16abc2SMarcus Meissner .test = alg_test_null, 2209fb16abc2SMarcus Meissner .fips_allowed = 1, 2210fb16abc2SMarcus Meissner }, { 22118888690eSMarcus Meissner .alg = "authenc(hmac(sha384),rfc3686(ctr(aes)))", 22128888690eSMarcus Meissner .test = alg_test_null, 22138888690eSMarcus Meissner .fips_allowed = 1, 22148888690eSMarcus Meissner }, { 2215a4198fd4SHerbert Xu .alg = "authenc(hmac(sha512),cbc(aes))", 2216ed1afac9SMarcus Meissner .fips_allowed = 1, 2217e46e9a46SHoria Geanta .test = alg_test_aead, 2218e46e9a46SHoria Geanta .suite = { 2219e46e9a46SHoria Geanta .aead = { 2220e46e9a46SHoria Geanta .enc = { 22215208ed2cSNitesh Lal .vecs = 22225208ed2cSNitesh Lal hmac_sha512_aes_cbc_enc_tv_temp, 22235208ed2cSNitesh Lal .count = 22245208ed2cSNitesh Lal HMAC_SHA512_AES_CBC_ENC_TEST_VEC 22255208ed2cSNitesh Lal } 22265208ed2cSNitesh Lal } 22275208ed2cSNitesh Lal } 22285208ed2cSNitesh Lal }, { 2229a4198fd4SHerbert Xu .alg = "authenc(hmac(sha512),cbc(des))", 22305208ed2cSNitesh Lal .test = alg_test_aead, 22315208ed2cSNitesh Lal .suite = { 22325208ed2cSNitesh Lal .aead = { 22335208ed2cSNitesh Lal .enc = { 22345208ed2cSNitesh Lal .vecs = 22355208ed2cSNitesh Lal hmac_sha512_des_cbc_enc_tv_temp, 22365208ed2cSNitesh Lal .count = 22375208ed2cSNitesh Lal HMAC_SHA512_DES_CBC_ENC_TEST_VEC 22385208ed2cSNitesh Lal } 22395208ed2cSNitesh Lal } 22405208ed2cSNitesh Lal } 22415208ed2cSNitesh Lal }, { 2242a4198fd4SHerbert Xu .alg = "authenc(hmac(sha512),cbc(des3_ede))", 22435208ed2cSNitesh Lal .test = alg_test_aead, 2244ed1afac9SMarcus Meissner .fips_allowed = 1, 22455208ed2cSNitesh Lal .suite = { 22465208ed2cSNitesh Lal .aead = { 22475208ed2cSNitesh Lal .enc = { 22485208ed2cSNitesh Lal .vecs = 22495208ed2cSNitesh Lal hmac_sha512_des3_ede_cbc_enc_tv_temp, 22505208ed2cSNitesh Lal .count = 22515208ed2cSNitesh Lal HMAC_SHA512_DES3_EDE_CBC_ENC_TEST_VEC 2252e46e9a46SHoria Geanta } 2253e46e9a46SHoria Geanta } 2254e46e9a46SHoria Geanta } 2255e46e9a46SHoria Geanta }, { 2256fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha512),ctr(aes))", 2257fb16abc2SMarcus Meissner .test = alg_test_null, 2258fb16abc2SMarcus Meissner .fips_allowed = 1, 2259fb16abc2SMarcus Meissner }, { 22608888690eSMarcus Meissner .alg = "authenc(hmac(sha512),rfc3686(ctr(aes)))", 22618888690eSMarcus Meissner .test = alg_test_null, 22628888690eSMarcus Meissner .fips_allowed = 1, 22638888690eSMarcus Meissner }, { 2264da7f033dSHerbert Xu .alg = "cbc(aes)", 22651aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2266a1915d51SJarod Wilson .fips_allowed = 1, 2267da7f033dSHerbert Xu .suite = { 2268da7f033dSHerbert Xu .cipher = { 2269da7f033dSHerbert Xu .enc = { 2270da7f033dSHerbert Xu .vecs = aes_cbc_enc_tv_template, 2271da7f033dSHerbert Xu .count = AES_CBC_ENC_TEST_VECTORS 2272da7f033dSHerbert Xu }, 2273da7f033dSHerbert Xu .dec = { 2274da7f033dSHerbert Xu .vecs = aes_cbc_dec_tv_template, 2275da7f033dSHerbert Xu .count = AES_CBC_DEC_TEST_VECTORS 2276da7f033dSHerbert Xu } 2277da7f033dSHerbert Xu } 2278da7f033dSHerbert Xu } 2279da7f033dSHerbert Xu }, { 2280da7f033dSHerbert Xu .alg = "cbc(anubis)", 22811aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2282da7f033dSHerbert Xu .suite = { 2283da7f033dSHerbert Xu .cipher = { 2284da7f033dSHerbert Xu .enc = { 2285da7f033dSHerbert Xu .vecs = anubis_cbc_enc_tv_template, 2286da7f033dSHerbert Xu .count = ANUBIS_CBC_ENC_TEST_VECTORS 2287da7f033dSHerbert Xu }, 2288da7f033dSHerbert Xu .dec = { 2289da7f033dSHerbert Xu .vecs = anubis_cbc_dec_tv_template, 2290da7f033dSHerbert Xu .count = ANUBIS_CBC_DEC_TEST_VECTORS 2291da7f033dSHerbert Xu } 2292da7f033dSHerbert Xu } 2293da7f033dSHerbert Xu } 2294da7f033dSHerbert Xu }, { 2295da7f033dSHerbert Xu .alg = "cbc(blowfish)", 22961aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2297da7f033dSHerbert Xu .suite = { 2298da7f033dSHerbert Xu .cipher = { 2299da7f033dSHerbert Xu .enc = { 2300da7f033dSHerbert Xu .vecs = bf_cbc_enc_tv_template, 2301da7f033dSHerbert Xu .count = BF_CBC_ENC_TEST_VECTORS 2302da7f033dSHerbert Xu }, 2303da7f033dSHerbert Xu .dec = { 2304da7f033dSHerbert Xu .vecs = bf_cbc_dec_tv_template, 2305da7f033dSHerbert Xu .count = BF_CBC_DEC_TEST_VECTORS 2306da7f033dSHerbert Xu } 2307da7f033dSHerbert Xu } 2308da7f033dSHerbert Xu } 2309da7f033dSHerbert Xu }, { 2310da7f033dSHerbert Xu .alg = "cbc(camellia)", 23111aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2312da7f033dSHerbert Xu .suite = { 2313da7f033dSHerbert Xu .cipher = { 2314da7f033dSHerbert Xu .enc = { 2315da7f033dSHerbert Xu .vecs = camellia_cbc_enc_tv_template, 2316da7f033dSHerbert Xu .count = CAMELLIA_CBC_ENC_TEST_VECTORS 2317da7f033dSHerbert Xu }, 2318da7f033dSHerbert Xu .dec = { 2319da7f033dSHerbert Xu .vecs = camellia_cbc_dec_tv_template, 2320da7f033dSHerbert Xu .count = CAMELLIA_CBC_DEC_TEST_VECTORS 2321da7f033dSHerbert Xu } 2322da7f033dSHerbert Xu } 2323da7f033dSHerbert Xu } 2324da7f033dSHerbert Xu }, { 2325a2c58260SJohannes Goetzfried .alg = "cbc(cast5)", 2326a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 2327a2c58260SJohannes Goetzfried .suite = { 2328a2c58260SJohannes Goetzfried .cipher = { 2329a2c58260SJohannes Goetzfried .enc = { 2330a2c58260SJohannes Goetzfried .vecs = cast5_cbc_enc_tv_template, 2331a2c58260SJohannes Goetzfried .count = CAST5_CBC_ENC_TEST_VECTORS 2332a2c58260SJohannes Goetzfried }, 2333a2c58260SJohannes Goetzfried .dec = { 2334a2c58260SJohannes Goetzfried .vecs = cast5_cbc_dec_tv_template, 2335a2c58260SJohannes Goetzfried .count = CAST5_CBC_DEC_TEST_VECTORS 2336a2c58260SJohannes Goetzfried } 2337a2c58260SJohannes Goetzfried } 2338a2c58260SJohannes Goetzfried } 2339a2c58260SJohannes Goetzfried }, { 23409b8b0405SJohannes Goetzfried .alg = "cbc(cast6)", 23419b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 23429b8b0405SJohannes Goetzfried .suite = { 23439b8b0405SJohannes Goetzfried .cipher = { 23449b8b0405SJohannes Goetzfried .enc = { 23459b8b0405SJohannes Goetzfried .vecs = cast6_cbc_enc_tv_template, 23469b8b0405SJohannes Goetzfried .count = CAST6_CBC_ENC_TEST_VECTORS 23479b8b0405SJohannes Goetzfried }, 23489b8b0405SJohannes Goetzfried .dec = { 23499b8b0405SJohannes Goetzfried .vecs = cast6_cbc_dec_tv_template, 23509b8b0405SJohannes Goetzfried .count = CAST6_CBC_DEC_TEST_VECTORS 23519b8b0405SJohannes Goetzfried } 23529b8b0405SJohannes Goetzfried } 23539b8b0405SJohannes Goetzfried } 23549b8b0405SJohannes Goetzfried }, { 2355da7f033dSHerbert Xu .alg = "cbc(des)", 23561aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2357da7f033dSHerbert Xu .suite = { 2358da7f033dSHerbert Xu .cipher = { 2359da7f033dSHerbert Xu .enc = { 2360da7f033dSHerbert Xu .vecs = des_cbc_enc_tv_template, 2361da7f033dSHerbert Xu .count = DES_CBC_ENC_TEST_VECTORS 2362da7f033dSHerbert Xu }, 2363da7f033dSHerbert Xu .dec = { 2364da7f033dSHerbert Xu .vecs = des_cbc_dec_tv_template, 2365da7f033dSHerbert Xu .count = DES_CBC_DEC_TEST_VECTORS 2366da7f033dSHerbert Xu } 2367da7f033dSHerbert Xu } 2368da7f033dSHerbert Xu } 2369da7f033dSHerbert Xu }, { 2370da7f033dSHerbert Xu .alg = "cbc(des3_ede)", 23711aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2372a1915d51SJarod Wilson .fips_allowed = 1, 2373da7f033dSHerbert Xu .suite = { 2374da7f033dSHerbert Xu .cipher = { 2375da7f033dSHerbert Xu .enc = { 2376da7f033dSHerbert Xu .vecs = des3_ede_cbc_enc_tv_template, 2377da7f033dSHerbert Xu .count = DES3_EDE_CBC_ENC_TEST_VECTORS 2378da7f033dSHerbert Xu }, 2379da7f033dSHerbert Xu .dec = { 2380da7f033dSHerbert Xu .vecs = des3_ede_cbc_dec_tv_template, 2381da7f033dSHerbert Xu .count = DES3_EDE_CBC_DEC_TEST_VECTORS 2382da7f033dSHerbert Xu } 2383da7f033dSHerbert Xu } 2384da7f033dSHerbert Xu } 2385da7f033dSHerbert Xu }, { 23869d25917dSJussi Kivilinna .alg = "cbc(serpent)", 23879d25917dSJussi Kivilinna .test = alg_test_skcipher, 23889d25917dSJussi Kivilinna .suite = { 23899d25917dSJussi Kivilinna .cipher = { 23909d25917dSJussi Kivilinna .enc = { 23919d25917dSJussi Kivilinna .vecs = serpent_cbc_enc_tv_template, 23929d25917dSJussi Kivilinna .count = SERPENT_CBC_ENC_TEST_VECTORS 23939d25917dSJussi Kivilinna }, 23949d25917dSJussi Kivilinna .dec = { 23959d25917dSJussi Kivilinna .vecs = serpent_cbc_dec_tv_template, 23969d25917dSJussi Kivilinna .count = SERPENT_CBC_DEC_TEST_VECTORS 23979d25917dSJussi Kivilinna } 23989d25917dSJussi Kivilinna } 23999d25917dSJussi Kivilinna } 24009d25917dSJussi Kivilinna }, { 2401da7f033dSHerbert Xu .alg = "cbc(twofish)", 24021aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2403da7f033dSHerbert Xu .suite = { 2404da7f033dSHerbert Xu .cipher = { 2405da7f033dSHerbert Xu .enc = { 2406da7f033dSHerbert Xu .vecs = tf_cbc_enc_tv_template, 2407da7f033dSHerbert Xu .count = TF_CBC_ENC_TEST_VECTORS 2408da7f033dSHerbert Xu }, 2409da7f033dSHerbert Xu .dec = { 2410da7f033dSHerbert Xu .vecs = tf_cbc_dec_tv_template, 2411da7f033dSHerbert Xu .count = TF_CBC_DEC_TEST_VECTORS 2412da7f033dSHerbert Xu } 2413da7f033dSHerbert Xu } 2414da7f033dSHerbert Xu } 2415da7f033dSHerbert Xu }, { 2416da7f033dSHerbert Xu .alg = "ccm(aes)", 2417da7f033dSHerbert Xu .test = alg_test_aead, 2418a1915d51SJarod Wilson .fips_allowed = 1, 2419da7f033dSHerbert Xu .suite = { 2420da7f033dSHerbert Xu .aead = { 2421da7f033dSHerbert Xu .enc = { 2422da7f033dSHerbert Xu .vecs = aes_ccm_enc_tv_template, 2423da7f033dSHerbert Xu .count = AES_CCM_ENC_TEST_VECTORS 2424da7f033dSHerbert Xu }, 2425da7f033dSHerbert Xu .dec = { 2426da7f033dSHerbert Xu .vecs = aes_ccm_dec_tv_template, 2427da7f033dSHerbert Xu .count = AES_CCM_DEC_TEST_VECTORS 2428da7f033dSHerbert Xu } 2429da7f033dSHerbert Xu } 2430da7f033dSHerbert Xu } 2431da7f033dSHerbert Xu }, { 24323590ebf2SMartin Willi .alg = "chacha20", 24333590ebf2SMartin Willi .test = alg_test_skcipher, 24343590ebf2SMartin Willi .suite = { 24353590ebf2SMartin Willi .cipher = { 24363590ebf2SMartin Willi .enc = { 24373590ebf2SMartin Willi .vecs = chacha20_enc_tv_template, 24383590ebf2SMartin Willi .count = CHACHA20_ENC_TEST_VECTORS 24393590ebf2SMartin Willi }, 24403590ebf2SMartin Willi .dec = { 24413590ebf2SMartin Willi .vecs = chacha20_enc_tv_template, 24423590ebf2SMartin Willi .count = CHACHA20_ENC_TEST_VECTORS 24433590ebf2SMartin Willi }, 24443590ebf2SMartin Willi } 24453590ebf2SMartin Willi } 24463590ebf2SMartin Willi }, { 244793b5e86aSJussi Kivilinna .alg = "cmac(aes)", 24488f183751SStephan Mueller .fips_allowed = 1, 244993b5e86aSJussi Kivilinna .test = alg_test_hash, 245093b5e86aSJussi Kivilinna .suite = { 245193b5e86aSJussi Kivilinna .hash = { 245293b5e86aSJussi Kivilinna .vecs = aes_cmac128_tv_template, 245393b5e86aSJussi Kivilinna .count = CMAC_AES_TEST_VECTORS 245493b5e86aSJussi Kivilinna } 245593b5e86aSJussi Kivilinna } 245693b5e86aSJussi Kivilinna }, { 245793b5e86aSJussi Kivilinna .alg = "cmac(des3_ede)", 24588f183751SStephan Mueller .fips_allowed = 1, 245993b5e86aSJussi Kivilinna .test = alg_test_hash, 246093b5e86aSJussi Kivilinna .suite = { 246193b5e86aSJussi Kivilinna .hash = { 246293b5e86aSJussi Kivilinna .vecs = des3_ede_cmac64_tv_template, 246393b5e86aSJussi Kivilinna .count = CMAC_DES3_EDE_TEST_VECTORS 246493b5e86aSJussi Kivilinna } 246593b5e86aSJussi Kivilinna } 246693b5e86aSJussi Kivilinna }, { 2467e448370dSJussi Kivilinna .alg = "compress_null", 2468e448370dSJussi Kivilinna .test = alg_test_null, 2469e448370dSJussi Kivilinna }, { 2470ebb3472fSArd Biesheuvel .alg = "crc32", 2471ebb3472fSArd Biesheuvel .test = alg_test_hash, 2472ebb3472fSArd Biesheuvel .suite = { 2473ebb3472fSArd Biesheuvel .hash = { 2474ebb3472fSArd Biesheuvel .vecs = crc32_tv_template, 2475ebb3472fSArd Biesheuvel .count = CRC32_TEST_VECTORS 2476ebb3472fSArd Biesheuvel } 2477ebb3472fSArd Biesheuvel } 2478ebb3472fSArd Biesheuvel }, { 2479da7f033dSHerbert Xu .alg = "crc32c", 24808e3ee85eSHerbert Xu .test = alg_test_crc32c, 2481a1915d51SJarod Wilson .fips_allowed = 1, 2482da7f033dSHerbert Xu .suite = { 2483da7f033dSHerbert Xu .hash = { 2484da7f033dSHerbert Xu .vecs = crc32c_tv_template, 2485da7f033dSHerbert Xu .count = CRC32C_TEST_VECTORS 2486da7f033dSHerbert Xu } 2487da7f033dSHerbert Xu } 2488da7f033dSHerbert Xu }, { 248968411521SHerbert Xu .alg = "crct10dif", 249068411521SHerbert Xu .test = alg_test_hash, 249168411521SHerbert Xu .fips_allowed = 1, 249268411521SHerbert Xu .suite = { 249368411521SHerbert Xu .hash = { 249468411521SHerbert Xu .vecs = crct10dif_tv_template, 249568411521SHerbert Xu .count = CRCT10DIF_TEST_VECTORS 249668411521SHerbert Xu } 249768411521SHerbert Xu } 249868411521SHerbert Xu }, { 24996c79294fSMilan Broz .alg = "cryptd(__driver-cbc-aes-aesni)", 25006c79294fSMilan Broz .test = alg_test_null, 25016c79294fSMilan Broz .fips_allowed = 1, 25026c79294fSMilan Broz }, { 2503d9b1d2e7SJussi Kivilinna .alg = "cryptd(__driver-cbc-camellia-aesni)", 2504d9b1d2e7SJussi Kivilinna .test = alg_test_null, 2505d9b1d2e7SJussi Kivilinna }, { 2506f3f935a7SJussi Kivilinna .alg = "cryptd(__driver-cbc-camellia-aesni-avx2)", 2507f3f935a7SJussi Kivilinna .test = alg_test_null, 2508f3f935a7SJussi Kivilinna }, { 250956d76c96SJussi Kivilinna .alg = "cryptd(__driver-cbc-serpent-avx2)", 251056d76c96SJussi Kivilinna .test = alg_test_null, 251156d76c96SJussi Kivilinna }, { 2512863b557aSYouquan, Song .alg = "cryptd(__driver-ecb-aes-aesni)", 2513863b557aSYouquan, Song .test = alg_test_null, 25146c79294fSMilan Broz .fips_allowed = 1, 2515863b557aSYouquan, Song }, { 2516d9b1d2e7SJussi Kivilinna .alg = "cryptd(__driver-ecb-camellia-aesni)", 2517d9b1d2e7SJussi Kivilinna .test = alg_test_null, 2518d9b1d2e7SJussi Kivilinna }, { 2519f3f935a7SJussi Kivilinna .alg = "cryptd(__driver-ecb-camellia-aesni-avx2)", 2520f3f935a7SJussi Kivilinna .test = alg_test_null, 2521f3f935a7SJussi Kivilinna }, { 25224d6d6a2cSJohannes Goetzfried .alg = "cryptd(__driver-ecb-cast5-avx)", 25234d6d6a2cSJohannes Goetzfried .test = alg_test_null, 25244d6d6a2cSJohannes Goetzfried }, { 25254ea1277dSJohannes Goetzfried .alg = "cryptd(__driver-ecb-cast6-avx)", 25264ea1277dSJohannes Goetzfried .test = alg_test_null, 25274ea1277dSJohannes Goetzfried }, { 25287efe4076SJohannes Goetzfried .alg = "cryptd(__driver-ecb-serpent-avx)", 25297efe4076SJohannes Goetzfried .test = alg_test_null, 25307efe4076SJohannes Goetzfried }, { 253156d76c96SJussi Kivilinna .alg = "cryptd(__driver-ecb-serpent-avx2)", 253256d76c96SJussi Kivilinna .test = alg_test_null, 253356d76c96SJussi Kivilinna }, { 2534937c30d7SJussi Kivilinna .alg = "cryptd(__driver-ecb-serpent-sse2)", 2535937c30d7SJussi Kivilinna .test = alg_test_null, 2536937c30d7SJussi Kivilinna }, { 2537107778b5SJohannes Goetzfried .alg = "cryptd(__driver-ecb-twofish-avx)", 2538107778b5SJohannes Goetzfried .test = alg_test_null, 2539107778b5SJohannes Goetzfried }, { 25406c79294fSMilan Broz .alg = "cryptd(__driver-gcm-aes-aesni)", 25416c79294fSMilan Broz .test = alg_test_null, 25426c79294fSMilan Broz .fips_allowed = 1, 25436c79294fSMilan Broz }, { 2544863b557aSYouquan, Song .alg = "cryptd(__ghash-pclmulqdqni)", 2545863b557aSYouquan, Song .test = alg_test_null, 25466c79294fSMilan Broz .fips_allowed = 1, 2547863b557aSYouquan, Song }, { 2548f7cb80f2SJarod Wilson .alg = "ctr(aes)", 2549f7cb80f2SJarod Wilson .test = alg_test_skcipher, 2550a1915d51SJarod Wilson .fips_allowed = 1, 2551f7cb80f2SJarod Wilson .suite = { 2552f7cb80f2SJarod Wilson .cipher = { 2553f7cb80f2SJarod Wilson .enc = { 2554f7cb80f2SJarod Wilson .vecs = aes_ctr_enc_tv_template, 2555f7cb80f2SJarod Wilson .count = AES_CTR_ENC_TEST_VECTORS 2556f7cb80f2SJarod Wilson }, 2557f7cb80f2SJarod Wilson .dec = { 2558f7cb80f2SJarod Wilson .vecs = aes_ctr_dec_tv_template, 2559f7cb80f2SJarod Wilson .count = AES_CTR_DEC_TEST_VECTORS 2560f7cb80f2SJarod Wilson } 2561f7cb80f2SJarod Wilson } 2562f7cb80f2SJarod Wilson } 2563f7cb80f2SJarod Wilson }, { 256485b63e34SJussi Kivilinna .alg = "ctr(blowfish)", 256585b63e34SJussi Kivilinna .test = alg_test_skcipher, 256685b63e34SJussi Kivilinna .suite = { 256785b63e34SJussi Kivilinna .cipher = { 256885b63e34SJussi Kivilinna .enc = { 256985b63e34SJussi Kivilinna .vecs = bf_ctr_enc_tv_template, 257085b63e34SJussi Kivilinna .count = BF_CTR_ENC_TEST_VECTORS 257185b63e34SJussi Kivilinna }, 257285b63e34SJussi Kivilinna .dec = { 257385b63e34SJussi Kivilinna .vecs = bf_ctr_dec_tv_template, 257485b63e34SJussi Kivilinna .count = BF_CTR_DEC_TEST_VECTORS 257585b63e34SJussi Kivilinna } 257685b63e34SJussi Kivilinna } 257785b63e34SJussi Kivilinna } 257885b63e34SJussi Kivilinna }, { 25790840605eSJussi Kivilinna .alg = "ctr(camellia)", 25800840605eSJussi Kivilinna .test = alg_test_skcipher, 25810840605eSJussi Kivilinna .suite = { 25820840605eSJussi Kivilinna .cipher = { 25830840605eSJussi Kivilinna .enc = { 25840840605eSJussi Kivilinna .vecs = camellia_ctr_enc_tv_template, 25850840605eSJussi Kivilinna .count = CAMELLIA_CTR_ENC_TEST_VECTORS 25860840605eSJussi Kivilinna }, 25870840605eSJussi Kivilinna .dec = { 25880840605eSJussi Kivilinna .vecs = camellia_ctr_dec_tv_template, 25890840605eSJussi Kivilinna .count = CAMELLIA_CTR_DEC_TEST_VECTORS 25900840605eSJussi Kivilinna } 25910840605eSJussi Kivilinna } 25920840605eSJussi Kivilinna } 25930840605eSJussi Kivilinna }, { 2594a2c58260SJohannes Goetzfried .alg = "ctr(cast5)", 2595a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 2596a2c58260SJohannes Goetzfried .suite = { 2597a2c58260SJohannes Goetzfried .cipher = { 2598a2c58260SJohannes Goetzfried .enc = { 2599a2c58260SJohannes Goetzfried .vecs = cast5_ctr_enc_tv_template, 2600a2c58260SJohannes Goetzfried .count = CAST5_CTR_ENC_TEST_VECTORS 2601a2c58260SJohannes Goetzfried }, 2602a2c58260SJohannes Goetzfried .dec = { 2603a2c58260SJohannes Goetzfried .vecs = cast5_ctr_dec_tv_template, 2604a2c58260SJohannes Goetzfried .count = CAST5_CTR_DEC_TEST_VECTORS 2605a2c58260SJohannes Goetzfried } 2606a2c58260SJohannes Goetzfried } 2607a2c58260SJohannes Goetzfried } 2608a2c58260SJohannes Goetzfried }, { 26099b8b0405SJohannes Goetzfried .alg = "ctr(cast6)", 26109b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 26119b8b0405SJohannes Goetzfried .suite = { 26129b8b0405SJohannes Goetzfried .cipher = { 26139b8b0405SJohannes Goetzfried .enc = { 26149b8b0405SJohannes Goetzfried .vecs = cast6_ctr_enc_tv_template, 26159b8b0405SJohannes Goetzfried .count = CAST6_CTR_ENC_TEST_VECTORS 26169b8b0405SJohannes Goetzfried }, 26179b8b0405SJohannes Goetzfried .dec = { 26189b8b0405SJohannes Goetzfried .vecs = cast6_ctr_dec_tv_template, 26199b8b0405SJohannes Goetzfried .count = CAST6_CTR_DEC_TEST_VECTORS 26209b8b0405SJohannes Goetzfried } 26219b8b0405SJohannes Goetzfried } 26229b8b0405SJohannes Goetzfried } 26239b8b0405SJohannes Goetzfried }, { 26248163fc30SJussi Kivilinna .alg = "ctr(des)", 26258163fc30SJussi Kivilinna .test = alg_test_skcipher, 26268163fc30SJussi Kivilinna .suite = { 26278163fc30SJussi Kivilinna .cipher = { 26288163fc30SJussi Kivilinna .enc = { 26298163fc30SJussi Kivilinna .vecs = des_ctr_enc_tv_template, 26308163fc30SJussi Kivilinna .count = DES_CTR_ENC_TEST_VECTORS 26318163fc30SJussi Kivilinna }, 26328163fc30SJussi Kivilinna .dec = { 26338163fc30SJussi Kivilinna .vecs = des_ctr_dec_tv_template, 26348163fc30SJussi Kivilinna .count = DES_CTR_DEC_TEST_VECTORS 26358163fc30SJussi Kivilinna } 26368163fc30SJussi Kivilinna } 26378163fc30SJussi Kivilinna } 26388163fc30SJussi Kivilinna }, { 2639e080b17aSJussi Kivilinna .alg = "ctr(des3_ede)", 2640e080b17aSJussi Kivilinna .test = alg_test_skcipher, 2641e080b17aSJussi Kivilinna .suite = { 2642e080b17aSJussi Kivilinna .cipher = { 2643e080b17aSJussi Kivilinna .enc = { 2644e080b17aSJussi Kivilinna .vecs = des3_ede_ctr_enc_tv_template, 2645e080b17aSJussi Kivilinna .count = DES3_EDE_CTR_ENC_TEST_VECTORS 2646e080b17aSJussi Kivilinna }, 2647e080b17aSJussi Kivilinna .dec = { 2648e080b17aSJussi Kivilinna .vecs = des3_ede_ctr_dec_tv_template, 2649e080b17aSJussi Kivilinna .count = DES3_EDE_CTR_DEC_TEST_VECTORS 2650e080b17aSJussi Kivilinna } 2651e080b17aSJussi Kivilinna } 2652e080b17aSJussi Kivilinna } 2653e080b17aSJussi Kivilinna }, { 26549d25917dSJussi Kivilinna .alg = "ctr(serpent)", 26559d25917dSJussi Kivilinna .test = alg_test_skcipher, 26569d25917dSJussi Kivilinna .suite = { 26579d25917dSJussi Kivilinna .cipher = { 26589d25917dSJussi Kivilinna .enc = { 26599d25917dSJussi Kivilinna .vecs = serpent_ctr_enc_tv_template, 26609d25917dSJussi Kivilinna .count = SERPENT_CTR_ENC_TEST_VECTORS 26619d25917dSJussi Kivilinna }, 26629d25917dSJussi Kivilinna .dec = { 26639d25917dSJussi Kivilinna .vecs = serpent_ctr_dec_tv_template, 26649d25917dSJussi Kivilinna .count = SERPENT_CTR_DEC_TEST_VECTORS 26659d25917dSJussi Kivilinna } 26669d25917dSJussi Kivilinna } 26679d25917dSJussi Kivilinna } 26689d25917dSJussi Kivilinna }, { 2669573da620SJussi Kivilinna .alg = "ctr(twofish)", 2670573da620SJussi Kivilinna .test = alg_test_skcipher, 2671573da620SJussi Kivilinna .suite = { 2672573da620SJussi Kivilinna .cipher = { 2673573da620SJussi Kivilinna .enc = { 2674573da620SJussi Kivilinna .vecs = tf_ctr_enc_tv_template, 2675573da620SJussi Kivilinna .count = TF_CTR_ENC_TEST_VECTORS 2676573da620SJussi Kivilinna }, 2677573da620SJussi Kivilinna .dec = { 2678573da620SJussi Kivilinna .vecs = tf_ctr_dec_tv_template, 2679573da620SJussi Kivilinna .count = TF_CTR_DEC_TEST_VECTORS 2680573da620SJussi Kivilinna } 2681573da620SJussi Kivilinna } 2682573da620SJussi Kivilinna } 2683573da620SJussi Kivilinna }, { 2684da7f033dSHerbert Xu .alg = "cts(cbc(aes))", 26851aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2686da7f033dSHerbert Xu .suite = { 2687da7f033dSHerbert Xu .cipher = { 2688da7f033dSHerbert Xu .enc = { 2689da7f033dSHerbert Xu .vecs = cts_mode_enc_tv_template, 2690da7f033dSHerbert Xu .count = CTS_MODE_ENC_TEST_VECTORS 2691da7f033dSHerbert Xu }, 2692da7f033dSHerbert Xu .dec = { 2693da7f033dSHerbert Xu .vecs = cts_mode_dec_tv_template, 2694da7f033dSHerbert Xu .count = CTS_MODE_DEC_TEST_VECTORS 2695da7f033dSHerbert Xu } 2696da7f033dSHerbert Xu } 2697da7f033dSHerbert Xu } 2698da7f033dSHerbert Xu }, { 2699da7f033dSHerbert Xu .alg = "deflate", 2700da7f033dSHerbert Xu .test = alg_test_comp, 27010818904dSMilan Broz .fips_allowed = 1, 2702da7f033dSHerbert Xu .suite = { 2703da7f033dSHerbert Xu .comp = { 2704da7f033dSHerbert Xu .comp = { 2705da7f033dSHerbert Xu .vecs = deflate_comp_tv_template, 2706da7f033dSHerbert Xu .count = DEFLATE_COMP_TEST_VECTORS 2707da7f033dSHerbert Xu }, 2708da7f033dSHerbert Xu .decomp = { 2709da7f033dSHerbert Xu .vecs = deflate_decomp_tv_template, 2710da7f033dSHerbert Xu .count = DEFLATE_DECOMP_TEST_VECTORS 2711da7f033dSHerbert Xu } 2712da7f033dSHerbert Xu } 2713da7f033dSHerbert Xu } 2714da7f033dSHerbert Xu }, { 2715e448370dSJussi Kivilinna .alg = "digest_null", 2716e448370dSJussi Kivilinna .test = alg_test_null, 2717e448370dSJussi Kivilinna }, { 271864d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes128", 271964d1cdfbSStephan Mueller .test = alg_test_drbg, 272064d1cdfbSStephan Mueller .fips_allowed = 1, 272164d1cdfbSStephan Mueller .suite = { 272264d1cdfbSStephan Mueller .drbg = { 272364d1cdfbSStephan Mueller .vecs = drbg_nopr_ctr_aes128_tv_template, 272464d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_ctr_aes128_tv_template) 272564d1cdfbSStephan Mueller } 272664d1cdfbSStephan Mueller } 272764d1cdfbSStephan Mueller }, { 272864d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes192", 272964d1cdfbSStephan Mueller .test = alg_test_drbg, 273064d1cdfbSStephan Mueller .fips_allowed = 1, 273164d1cdfbSStephan Mueller .suite = { 273264d1cdfbSStephan Mueller .drbg = { 273364d1cdfbSStephan Mueller .vecs = drbg_nopr_ctr_aes192_tv_template, 273464d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_ctr_aes192_tv_template) 273564d1cdfbSStephan Mueller } 273664d1cdfbSStephan Mueller } 273764d1cdfbSStephan Mueller }, { 273864d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes256", 273964d1cdfbSStephan Mueller .test = alg_test_drbg, 274064d1cdfbSStephan Mueller .fips_allowed = 1, 274164d1cdfbSStephan Mueller .suite = { 274264d1cdfbSStephan Mueller .drbg = { 274364d1cdfbSStephan Mueller .vecs = drbg_nopr_ctr_aes256_tv_template, 274464d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_ctr_aes256_tv_template) 274564d1cdfbSStephan Mueller } 274664d1cdfbSStephan Mueller } 274764d1cdfbSStephan Mueller }, { 274864d1cdfbSStephan Mueller /* 274964d1cdfbSStephan Mueller * There is no need to specifically test the DRBG with every 275064d1cdfbSStephan Mueller * backend cipher -- covered by drbg_nopr_hmac_sha256 test 275164d1cdfbSStephan Mueller */ 275264d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha1", 275364d1cdfbSStephan Mueller .fips_allowed = 1, 275464d1cdfbSStephan Mueller .test = alg_test_null, 275564d1cdfbSStephan Mueller }, { 275664d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha256", 275764d1cdfbSStephan Mueller .test = alg_test_drbg, 275864d1cdfbSStephan Mueller .fips_allowed = 1, 275964d1cdfbSStephan Mueller .suite = { 276064d1cdfbSStephan Mueller .drbg = { 276164d1cdfbSStephan Mueller .vecs = drbg_nopr_hmac_sha256_tv_template, 276264d1cdfbSStephan Mueller .count = 276364d1cdfbSStephan Mueller ARRAY_SIZE(drbg_nopr_hmac_sha256_tv_template) 276464d1cdfbSStephan Mueller } 276564d1cdfbSStephan Mueller } 276664d1cdfbSStephan Mueller }, { 276764d1cdfbSStephan Mueller /* covered by drbg_nopr_hmac_sha256 test */ 276864d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha384", 276964d1cdfbSStephan Mueller .fips_allowed = 1, 277064d1cdfbSStephan Mueller .test = alg_test_null, 277164d1cdfbSStephan Mueller }, { 277264d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha512", 277364d1cdfbSStephan Mueller .test = alg_test_null, 277464d1cdfbSStephan Mueller .fips_allowed = 1, 277564d1cdfbSStephan Mueller }, { 277664d1cdfbSStephan Mueller .alg = "drbg_nopr_sha1", 277764d1cdfbSStephan Mueller .fips_allowed = 1, 277864d1cdfbSStephan Mueller .test = alg_test_null, 277964d1cdfbSStephan Mueller }, { 278064d1cdfbSStephan Mueller .alg = "drbg_nopr_sha256", 278164d1cdfbSStephan Mueller .test = alg_test_drbg, 278264d1cdfbSStephan Mueller .fips_allowed = 1, 278364d1cdfbSStephan Mueller .suite = { 278464d1cdfbSStephan Mueller .drbg = { 278564d1cdfbSStephan Mueller .vecs = drbg_nopr_sha256_tv_template, 278664d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_sha256_tv_template) 278764d1cdfbSStephan Mueller } 278864d1cdfbSStephan Mueller } 278964d1cdfbSStephan Mueller }, { 279064d1cdfbSStephan Mueller /* covered by drbg_nopr_sha256 test */ 279164d1cdfbSStephan Mueller .alg = "drbg_nopr_sha384", 279264d1cdfbSStephan Mueller .fips_allowed = 1, 279364d1cdfbSStephan Mueller .test = alg_test_null, 279464d1cdfbSStephan Mueller }, { 279564d1cdfbSStephan Mueller .alg = "drbg_nopr_sha512", 279664d1cdfbSStephan Mueller .fips_allowed = 1, 279764d1cdfbSStephan Mueller .test = alg_test_null, 279864d1cdfbSStephan Mueller }, { 279964d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes128", 280064d1cdfbSStephan Mueller .test = alg_test_drbg, 280164d1cdfbSStephan Mueller .fips_allowed = 1, 280264d1cdfbSStephan Mueller .suite = { 280364d1cdfbSStephan Mueller .drbg = { 280464d1cdfbSStephan Mueller .vecs = drbg_pr_ctr_aes128_tv_template, 280564d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_pr_ctr_aes128_tv_template) 280664d1cdfbSStephan Mueller } 280764d1cdfbSStephan Mueller } 280864d1cdfbSStephan Mueller }, { 280964d1cdfbSStephan Mueller /* covered by drbg_pr_ctr_aes128 test */ 281064d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes192", 281164d1cdfbSStephan Mueller .fips_allowed = 1, 281264d1cdfbSStephan Mueller .test = alg_test_null, 281364d1cdfbSStephan Mueller }, { 281464d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes256", 281564d1cdfbSStephan Mueller .fips_allowed = 1, 281664d1cdfbSStephan Mueller .test = alg_test_null, 281764d1cdfbSStephan Mueller }, { 281864d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha1", 281964d1cdfbSStephan Mueller .fips_allowed = 1, 282064d1cdfbSStephan Mueller .test = alg_test_null, 282164d1cdfbSStephan Mueller }, { 282264d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha256", 282364d1cdfbSStephan Mueller .test = alg_test_drbg, 282464d1cdfbSStephan Mueller .fips_allowed = 1, 282564d1cdfbSStephan Mueller .suite = { 282664d1cdfbSStephan Mueller .drbg = { 282764d1cdfbSStephan Mueller .vecs = drbg_pr_hmac_sha256_tv_template, 282864d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_pr_hmac_sha256_tv_template) 282964d1cdfbSStephan Mueller } 283064d1cdfbSStephan Mueller } 283164d1cdfbSStephan Mueller }, { 283264d1cdfbSStephan Mueller /* covered by drbg_pr_hmac_sha256 test */ 283364d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha384", 283464d1cdfbSStephan Mueller .fips_allowed = 1, 283564d1cdfbSStephan Mueller .test = alg_test_null, 283664d1cdfbSStephan Mueller }, { 283764d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha512", 283864d1cdfbSStephan Mueller .test = alg_test_null, 283964d1cdfbSStephan Mueller .fips_allowed = 1, 284064d1cdfbSStephan Mueller }, { 284164d1cdfbSStephan Mueller .alg = "drbg_pr_sha1", 284264d1cdfbSStephan Mueller .fips_allowed = 1, 284364d1cdfbSStephan Mueller .test = alg_test_null, 284464d1cdfbSStephan Mueller }, { 284564d1cdfbSStephan Mueller .alg = "drbg_pr_sha256", 284664d1cdfbSStephan Mueller .test = alg_test_drbg, 284764d1cdfbSStephan Mueller .fips_allowed = 1, 284864d1cdfbSStephan Mueller .suite = { 284964d1cdfbSStephan Mueller .drbg = { 285064d1cdfbSStephan Mueller .vecs = drbg_pr_sha256_tv_template, 285164d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_pr_sha256_tv_template) 285264d1cdfbSStephan Mueller } 285364d1cdfbSStephan Mueller } 285464d1cdfbSStephan Mueller }, { 285564d1cdfbSStephan Mueller /* covered by drbg_pr_sha256 test */ 285664d1cdfbSStephan Mueller .alg = "drbg_pr_sha384", 285764d1cdfbSStephan Mueller .fips_allowed = 1, 285864d1cdfbSStephan Mueller .test = alg_test_null, 285964d1cdfbSStephan Mueller }, { 286064d1cdfbSStephan Mueller .alg = "drbg_pr_sha512", 286164d1cdfbSStephan Mueller .fips_allowed = 1, 286264d1cdfbSStephan Mueller .test = alg_test_null, 286364d1cdfbSStephan Mueller }, { 2864863b557aSYouquan, Song .alg = "ecb(__aes-aesni)", 2865863b557aSYouquan, Song .test = alg_test_null, 28666c79294fSMilan Broz .fips_allowed = 1, 2867863b557aSYouquan, Song }, { 2868da7f033dSHerbert Xu .alg = "ecb(aes)", 28691aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2870a1915d51SJarod Wilson .fips_allowed = 1, 2871da7f033dSHerbert Xu .suite = { 2872da7f033dSHerbert Xu .cipher = { 2873da7f033dSHerbert Xu .enc = { 2874da7f033dSHerbert Xu .vecs = aes_enc_tv_template, 2875da7f033dSHerbert Xu .count = AES_ENC_TEST_VECTORS 2876da7f033dSHerbert Xu }, 2877da7f033dSHerbert Xu .dec = { 2878da7f033dSHerbert Xu .vecs = aes_dec_tv_template, 2879da7f033dSHerbert Xu .count = AES_DEC_TEST_VECTORS 2880da7f033dSHerbert Xu } 2881da7f033dSHerbert Xu } 2882da7f033dSHerbert Xu } 2883da7f033dSHerbert Xu }, { 2884da7f033dSHerbert Xu .alg = "ecb(anubis)", 28851aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2886da7f033dSHerbert Xu .suite = { 2887da7f033dSHerbert Xu .cipher = { 2888da7f033dSHerbert Xu .enc = { 2889da7f033dSHerbert Xu .vecs = anubis_enc_tv_template, 2890da7f033dSHerbert Xu .count = ANUBIS_ENC_TEST_VECTORS 2891da7f033dSHerbert Xu }, 2892da7f033dSHerbert Xu .dec = { 2893da7f033dSHerbert Xu .vecs = anubis_dec_tv_template, 2894da7f033dSHerbert Xu .count = ANUBIS_DEC_TEST_VECTORS 2895da7f033dSHerbert Xu } 2896da7f033dSHerbert Xu } 2897da7f033dSHerbert Xu } 2898da7f033dSHerbert Xu }, { 2899da7f033dSHerbert Xu .alg = "ecb(arc4)", 29001aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2901da7f033dSHerbert Xu .suite = { 2902da7f033dSHerbert Xu .cipher = { 2903da7f033dSHerbert Xu .enc = { 2904da7f033dSHerbert Xu .vecs = arc4_enc_tv_template, 2905da7f033dSHerbert Xu .count = ARC4_ENC_TEST_VECTORS 2906da7f033dSHerbert Xu }, 2907da7f033dSHerbert Xu .dec = { 2908da7f033dSHerbert Xu .vecs = arc4_dec_tv_template, 2909da7f033dSHerbert Xu .count = ARC4_DEC_TEST_VECTORS 2910da7f033dSHerbert Xu } 2911da7f033dSHerbert Xu } 2912da7f033dSHerbert Xu } 2913da7f033dSHerbert Xu }, { 2914da7f033dSHerbert Xu .alg = "ecb(blowfish)", 29151aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2916da7f033dSHerbert Xu .suite = { 2917da7f033dSHerbert Xu .cipher = { 2918da7f033dSHerbert Xu .enc = { 2919da7f033dSHerbert Xu .vecs = bf_enc_tv_template, 2920da7f033dSHerbert Xu .count = BF_ENC_TEST_VECTORS 2921da7f033dSHerbert Xu }, 2922da7f033dSHerbert Xu .dec = { 2923da7f033dSHerbert Xu .vecs = bf_dec_tv_template, 2924da7f033dSHerbert Xu .count = BF_DEC_TEST_VECTORS 2925da7f033dSHerbert Xu } 2926da7f033dSHerbert Xu } 2927da7f033dSHerbert Xu } 2928da7f033dSHerbert Xu }, { 2929da7f033dSHerbert Xu .alg = "ecb(camellia)", 29301aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2931da7f033dSHerbert Xu .suite = { 2932da7f033dSHerbert Xu .cipher = { 2933da7f033dSHerbert Xu .enc = { 2934da7f033dSHerbert Xu .vecs = camellia_enc_tv_template, 2935da7f033dSHerbert Xu .count = CAMELLIA_ENC_TEST_VECTORS 2936da7f033dSHerbert Xu }, 2937da7f033dSHerbert Xu .dec = { 2938da7f033dSHerbert Xu .vecs = camellia_dec_tv_template, 2939da7f033dSHerbert Xu .count = CAMELLIA_DEC_TEST_VECTORS 2940da7f033dSHerbert Xu } 2941da7f033dSHerbert Xu } 2942da7f033dSHerbert Xu } 2943da7f033dSHerbert Xu }, { 2944da7f033dSHerbert Xu .alg = "ecb(cast5)", 29451aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2946da7f033dSHerbert Xu .suite = { 2947da7f033dSHerbert Xu .cipher = { 2948da7f033dSHerbert Xu .enc = { 2949da7f033dSHerbert Xu .vecs = cast5_enc_tv_template, 2950da7f033dSHerbert Xu .count = CAST5_ENC_TEST_VECTORS 2951da7f033dSHerbert Xu }, 2952da7f033dSHerbert Xu .dec = { 2953da7f033dSHerbert Xu .vecs = cast5_dec_tv_template, 2954da7f033dSHerbert Xu .count = CAST5_DEC_TEST_VECTORS 2955da7f033dSHerbert Xu } 2956da7f033dSHerbert Xu } 2957da7f033dSHerbert Xu } 2958da7f033dSHerbert Xu }, { 2959da7f033dSHerbert Xu .alg = "ecb(cast6)", 29601aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2961da7f033dSHerbert Xu .suite = { 2962da7f033dSHerbert Xu .cipher = { 2963da7f033dSHerbert Xu .enc = { 2964da7f033dSHerbert Xu .vecs = cast6_enc_tv_template, 2965da7f033dSHerbert Xu .count = CAST6_ENC_TEST_VECTORS 2966da7f033dSHerbert Xu }, 2967da7f033dSHerbert Xu .dec = { 2968da7f033dSHerbert Xu .vecs = cast6_dec_tv_template, 2969da7f033dSHerbert Xu .count = CAST6_DEC_TEST_VECTORS 2970da7f033dSHerbert Xu } 2971da7f033dSHerbert Xu } 2972da7f033dSHerbert Xu } 2973da7f033dSHerbert Xu }, { 2974e448370dSJussi Kivilinna .alg = "ecb(cipher_null)", 2975e448370dSJussi Kivilinna .test = alg_test_null, 2976e448370dSJussi Kivilinna }, { 2977da7f033dSHerbert Xu .alg = "ecb(des)", 29781aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2979da7f033dSHerbert Xu .suite = { 2980da7f033dSHerbert Xu .cipher = { 2981da7f033dSHerbert Xu .enc = { 2982da7f033dSHerbert Xu .vecs = des_enc_tv_template, 2983da7f033dSHerbert Xu .count = DES_ENC_TEST_VECTORS 2984da7f033dSHerbert Xu }, 2985da7f033dSHerbert Xu .dec = { 2986da7f033dSHerbert Xu .vecs = des_dec_tv_template, 2987da7f033dSHerbert Xu .count = DES_DEC_TEST_VECTORS 2988da7f033dSHerbert Xu } 2989da7f033dSHerbert Xu } 2990da7f033dSHerbert Xu } 2991da7f033dSHerbert Xu }, { 2992da7f033dSHerbert Xu .alg = "ecb(des3_ede)", 29931aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2994a1915d51SJarod Wilson .fips_allowed = 1, 2995da7f033dSHerbert Xu .suite = { 2996da7f033dSHerbert Xu .cipher = { 2997da7f033dSHerbert Xu .enc = { 2998da7f033dSHerbert Xu .vecs = des3_ede_enc_tv_template, 2999da7f033dSHerbert Xu .count = DES3_EDE_ENC_TEST_VECTORS 3000da7f033dSHerbert Xu }, 3001da7f033dSHerbert Xu .dec = { 3002da7f033dSHerbert Xu .vecs = des3_ede_dec_tv_template, 3003da7f033dSHerbert Xu .count = DES3_EDE_DEC_TEST_VECTORS 3004da7f033dSHerbert Xu } 3005da7f033dSHerbert Xu } 3006da7f033dSHerbert Xu } 3007da7f033dSHerbert Xu }, { 300866e5bd00SJussi Kivilinna .alg = "ecb(fcrypt)", 300966e5bd00SJussi Kivilinna .test = alg_test_skcipher, 301066e5bd00SJussi Kivilinna .suite = { 301166e5bd00SJussi Kivilinna .cipher = { 301266e5bd00SJussi Kivilinna .enc = { 301366e5bd00SJussi Kivilinna .vecs = fcrypt_pcbc_enc_tv_template, 301466e5bd00SJussi Kivilinna .count = 1 301566e5bd00SJussi Kivilinna }, 301666e5bd00SJussi Kivilinna .dec = { 301766e5bd00SJussi Kivilinna .vecs = fcrypt_pcbc_dec_tv_template, 301866e5bd00SJussi Kivilinna .count = 1 301966e5bd00SJussi Kivilinna } 302066e5bd00SJussi Kivilinna } 302166e5bd00SJussi Kivilinna } 302266e5bd00SJussi Kivilinna }, { 3023da7f033dSHerbert Xu .alg = "ecb(khazad)", 30241aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3025da7f033dSHerbert Xu .suite = { 3026da7f033dSHerbert Xu .cipher = { 3027da7f033dSHerbert Xu .enc = { 3028da7f033dSHerbert Xu .vecs = khazad_enc_tv_template, 3029da7f033dSHerbert Xu .count = KHAZAD_ENC_TEST_VECTORS 3030da7f033dSHerbert Xu }, 3031da7f033dSHerbert Xu .dec = { 3032da7f033dSHerbert Xu .vecs = khazad_dec_tv_template, 3033da7f033dSHerbert Xu .count = KHAZAD_DEC_TEST_VECTORS 3034da7f033dSHerbert Xu } 3035da7f033dSHerbert Xu } 3036da7f033dSHerbert Xu } 3037da7f033dSHerbert Xu }, { 3038da7f033dSHerbert Xu .alg = "ecb(seed)", 30391aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3040da7f033dSHerbert Xu .suite = { 3041da7f033dSHerbert Xu .cipher = { 3042da7f033dSHerbert Xu .enc = { 3043da7f033dSHerbert Xu .vecs = seed_enc_tv_template, 3044da7f033dSHerbert Xu .count = SEED_ENC_TEST_VECTORS 3045da7f033dSHerbert Xu }, 3046da7f033dSHerbert Xu .dec = { 3047da7f033dSHerbert Xu .vecs = seed_dec_tv_template, 3048da7f033dSHerbert Xu .count = SEED_DEC_TEST_VECTORS 3049da7f033dSHerbert Xu } 3050da7f033dSHerbert Xu } 3051da7f033dSHerbert Xu } 3052da7f033dSHerbert Xu }, { 3053da7f033dSHerbert Xu .alg = "ecb(serpent)", 30541aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3055da7f033dSHerbert Xu .suite = { 3056da7f033dSHerbert Xu .cipher = { 3057da7f033dSHerbert Xu .enc = { 3058da7f033dSHerbert Xu .vecs = serpent_enc_tv_template, 3059da7f033dSHerbert Xu .count = SERPENT_ENC_TEST_VECTORS 3060da7f033dSHerbert Xu }, 3061da7f033dSHerbert Xu .dec = { 3062da7f033dSHerbert Xu .vecs = serpent_dec_tv_template, 3063da7f033dSHerbert Xu .count = SERPENT_DEC_TEST_VECTORS 3064da7f033dSHerbert Xu } 3065da7f033dSHerbert Xu } 3066da7f033dSHerbert Xu } 3067da7f033dSHerbert Xu }, { 3068da7f033dSHerbert Xu .alg = "ecb(tea)", 30691aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3070da7f033dSHerbert Xu .suite = { 3071da7f033dSHerbert Xu .cipher = { 3072da7f033dSHerbert Xu .enc = { 3073da7f033dSHerbert Xu .vecs = tea_enc_tv_template, 3074da7f033dSHerbert Xu .count = TEA_ENC_TEST_VECTORS 3075da7f033dSHerbert Xu }, 3076da7f033dSHerbert Xu .dec = { 3077da7f033dSHerbert Xu .vecs = tea_dec_tv_template, 3078da7f033dSHerbert Xu .count = TEA_DEC_TEST_VECTORS 3079da7f033dSHerbert Xu } 3080da7f033dSHerbert Xu } 3081da7f033dSHerbert Xu } 3082da7f033dSHerbert Xu }, { 3083da7f033dSHerbert Xu .alg = "ecb(tnepres)", 30841aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3085da7f033dSHerbert Xu .suite = { 3086da7f033dSHerbert Xu .cipher = { 3087da7f033dSHerbert Xu .enc = { 3088da7f033dSHerbert Xu .vecs = tnepres_enc_tv_template, 3089da7f033dSHerbert Xu .count = TNEPRES_ENC_TEST_VECTORS 3090da7f033dSHerbert Xu }, 3091da7f033dSHerbert Xu .dec = { 3092da7f033dSHerbert Xu .vecs = tnepres_dec_tv_template, 3093da7f033dSHerbert Xu .count = TNEPRES_DEC_TEST_VECTORS 3094da7f033dSHerbert Xu } 3095da7f033dSHerbert Xu } 3096da7f033dSHerbert Xu } 3097da7f033dSHerbert Xu }, { 3098da7f033dSHerbert Xu .alg = "ecb(twofish)", 30991aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3100da7f033dSHerbert Xu .suite = { 3101da7f033dSHerbert Xu .cipher = { 3102da7f033dSHerbert Xu .enc = { 3103da7f033dSHerbert Xu .vecs = tf_enc_tv_template, 3104da7f033dSHerbert Xu .count = TF_ENC_TEST_VECTORS 3105da7f033dSHerbert Xu }, 3106da7f033dSHerbert Xu .dec = { 3107da7f033dSHerbert Xu .vecs = tf_dec_tv_template, 3108da7f033dSHerbert Xu .count = TF_DEC_TEST_VECTORS 3109da7f033dSHerbert Xu } 3110da7f033dSHerbert Xu } 3111da7f033dSHerbert Xu } 3112da7f033dSHerbert Xu }, { 3113da7f033dSHerbert Xu .alg = "ecb(xeta)", 31141aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3115da7f033dSHerbert Xu .suite = { 3116da7f033dSHerbert Xu .cipher = { 3117da7f033dSHerbert Xu .enc = { 3118da7f033dSHerbert Xu .vecs = xeta_enc_tv_template, 3119da7f033dSHerbert Xu .count = XETA_ENC_TEST_VECTORS 3120da7f033dSHerbert Xu }, 3121da7f033dSHerbert Xu .dec = { 3122da7f033dSHerbert Xu .vecs = xeta_dec_tv_template, 3123da7f033dSHerbert Xu .count = XETA_DEC_TEST_VECTORS 3124da7f033dSHerbert Xu } 3125da7f033dSHerbert Xu } 3126da7f033dSHerbert Xu } 3127da7f033dSHerbert Xu }, { 3128da7f033dSHerbert Xu .alg = "ecb(xtea)", 31291aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3130da7f033dSHerbert Xu .suite = { 3131da7f033dSHerbert Xu .cipher = { 3132da7f033dSHerbert Xu .enc = { 3133da7f033dSHerbert Xu .vecs = xtea_enc_tv_template, 3134da7f033dSHerbert Xu .count = XTEA_ENC_TEST_VECTORS 3135da7f033dSHerbert Xu }, 3136da7f033dSHerbert Xu .dec = { 3137da7f033dSHerbert Xu .vecs = xtea_dec_tv_template, 3138da7f033dSHerbert Xu .count = XTEA_DEC_TEST_VECTORS 3139da7f033dSHerbert Xu } 3140da7f033dSHerbert Xu } 3141da7f033dSHerbert Xu } 3142da7f033dSHerbert Xu }, { 3143da7f033dSHerbert Xu .alg = "gcm(aes)", 3144da7f033dSHerbert Xu .test = alg_test_aead, 3145a1915d51SJarod Wilson .fips_allowed = 1, 3146da7f033dSHerbert Xu .suite = { 3147da7f033dSHerbert Xu .aead = { 3148da7f033dSHerbert Xu .enc = { 3149da7f033dSHerbert Xu .vecs = aes_gcm_enc_tv_template, 3150da7f033dSHerbert Xu .count = AES_GCM_ENC_TEST_VECTORS 3151da7f033dSHerbert Xu }, 3152da7f033dSHerbert Xu .dec = { 3153da7f033dSHerbert Xu .vecs = aes_gcm_dec_tv_template, 3154da7f033dSHerbert Xu .count = AES_GCM_DEC_TEST_VECTORS 3155da7f033dSHerbert Xu } 3156da7f033dSHerbert Xu } 3157da7f033dSHerbert Xu } 3158da7f033dSHerbert Xu }, { 3159507069c9SYouquan, Song .alg = "ghash", 3160507069c9SYouquan, Song .test = alg_test_hash, 316118c0ebd2SJarod Wilson .fips_allowed = 1, 3162507069c9SYouquan, Song .suite = { 3163507069c9SYouquan, Song .hash = { 3164507069c9SYouquan, Song .vecs = ghash_tv_template, 3165507069c9SYouquan, Song .count = GHASH_TEST_VECTORS 3166507069c9SYouquan, Song } 3167507069c9SYouquan, Song } 3168507069c9SYouquan, Song }, { 3169a482b081SSonic Zhang .alg = "hmac(crc32)", 3170a482b081SSonic Zhang .test = alg_test_hash, 3171a482b081SSonic Zhang .suite = { 3172a482b081SSonic Zhang .hash = { 3173a482b081SSonic Zhang .vecs = bfin_crc_tv_template, 3174a482b081SSonic Zhang .count = BFIN_CRC_TEST_VECTORS 3175a482b081SSonic Zhang } 3176a482b081SSonic Zhang } 3177a482b081SSonic Zhang }, { 3178da7f033dSHerbert Xu .alg = "hmac(md5)", 3179da7f033dSHerbert Xu .test = alg_test_hash, 3180da7f033dSHerbert Xu .suite = { 3181da7f033dSHerbert Xu .hash = { 3182da7f033dSHerbert Xu .vecs = hmac_md5_tv_template, 3183da7f033dSHerbert Xu .count = HMAC_MD5_TEST_VECTORS 3184da7f033dSHerbert Xu } 3185da7f033dSHerbert Xu } 3186da7f033dSHerbert Xu }, { 3187da7f033dSHerbert Xu .alg = "hmac(rmd128)", 3188da7f033dSHerbert Xu .test = alg_test_hash, 3189da7f033dSHerbert Xu .suite = { 3190da7f033dSHerbert Xu .hash = { 3191da7f033dSHerbert Xu .vecs = hmac_rmd128_tv_template, 3192da7f033dSHerbert Xu .count = HMAC_RMD128_TEST_VECTORS 3193da7f033dSHerbert Xu } 3194da7f033dSHerbert Xu } 3195da7f033dSHerbert Xu }, { 3196da7f033dSHerbert Xu .alg = "hmac(rmd160)", 3197da7f033dSHerbert Xu .test = alg_test_hash, 3198da7f033dSHerbert Xu .suite = { 3199da7f033dSHerbert Xu .hash = { 3200da7f033dSHerbert Xu .vecs = hmac_rmd160_tv_template, 3201da7f033dSHerbert Xu .count = HMAC_RMD160_TEST_VECTORS 3202da7f033dSHerbert Xu } 3203da7f033dSHerbert Xu } 3204da7f033dSHerbert Xu }, { 3205da7f033dSHerbert Xu .alg = "hmac(sha1)", 3206da7f033dSHerbert Xu .test = alg_test_hash, 3207a1915d51SJarod Wilson .fips_allowed = 1, 3208da7f033dSHerbert Xu .suite = { 3209da7f033dSHerbert Xu .hash = { 3210da7f033dSHerbert Xu .vecs = hmac_sha1_tv_template, 3211da7f033dSHerbert Xu .count = HMAC_SHA1_TEST_VECTORS 3212da7f033dSHerbert Xu } 3213da7f033dSHerbert Xu } 3214da7f033dSHerbert Xu }, { 3215da7f033dSHerbert Xu .alg = "hmac(sha224)", 3216da7f033dSHerbert Xu .test = alg_test_hash, 3217a1915d51SJarod Wilson .fips_allowed = 1, 3218da7f033dSHerbert Xu .suite = { 3219da7f033dSHerbert Xu .hash = { 3220da7f033dSHerbert Xu .vecs = hmac_sha224_tv_template, 3221da7f033dSHerbert Xu .count = HMAC_SHA224_TEST_VECTORS 3222da7f033dSHerbert Xu } 3223da7f033dSHerbert Xu } 3224da7f033dSHerbert Xu }, { 3225da7f033dSHerbert Xu .alg = "hmac(sha256)", 3226da7f033dSHerbert Xu .test = alg_test_hash, 3227a1915d51SJarod Wilson .fips_allowed = 1, 3228da7f033dSHerbert Xu .suite = { 3229da7f033dSHerbert Xu .hash = { 3230da7f033dSHerbert Xu .vecs = hmac_sha256_tv_template, 3231da7f033dSHerbert Xu .count = HMAC_SHA256_TEST_VECTORS 3232da7f033dSHerbert Xu } 3233da7f033dSHerbert Xu } 3234da7f033dSHerbert Xu }, { 3235da7f033dSHerbert Xu .alg = "hmac(sha384)", 3236da7f033dSHerbert Xu .test = alg_test_hash, 3237a1915d51SJarod Wilson .fips_allowed = 1, 3238da7f033dSHerbert Xu .suite = { 3239da7f033dSHerbert Xu .hash = { 3240da7f033dSHerbert Xu .vecs = hmac_sha384_tv_template, 3241da7f033dSHerbert Xu .count = HMAC_SHA384_TEST_VECTORS 3242da7f033dSHerbert Xu } 3243da7f033dSHerbert Xu } 3244da7f033dSHerbert Xu }, { 3245da7f033dSHerbert Xu .alg = "hmac(sha512)", 3246da7f033dSHerbert Xu .test = alg_test_hash, 3247a1915d51SJarod Wilson .fips_allowed = 1, 3248da7f033dSHerbert Xu .suite = { 3249da7f033dSHerbert Xu .hash = { 3250da7f033dSHerbert Xu .vecs = hmac_sha512_tv_template, 3251da7f033dSHerbert Xu .count = HMAC_SHA512_TEST_VECTORS 3252da7f033dSHerbert Xu } 3253da7f033dSHerbert Xu } 3254da7f033dSHerbert Xu }, { 3255bb5530e4SStephan Mueller .alg = "jitterentropy_rng", 3256bb5530e4SStephan Mueller .fips_allowed = 1, 3257bb5530e4SStephan Mueller .test = alg_test_null, 3258bb5530e4SStephan Mueller }, { 325935351988SStephan Mueller .alg = "kw(aes)", 326035351988SStephan Mueller .test = alg_test_skcipher, 326135351988SStephan Mueller .fips_allowed = 1, 326235351988SStephan Mueller .suite = { 326335351988SStephan Mueller .cipher = { 326435351988SStephan Mueller .enc = { 326535351988SStephan Mueller .vecs = aes_kw_enc_tv_template, 326635351988SStephan Mueller .count = ARRAY_SIZE(aes_kw_enc_tv_template) 326735351988SStephan Mueller }, 326835351988SStephan Mueller .dec = { 326935351988SStephan Mueller .vecs = aes_kw_dec_tv_template, 327035351988SStephan Mueller .count = ARRAY_SIZE(aes_kw_dec_tv_template) 327135351988SStephan Mueller } 327235351988SStephan Mueller } 327335351988SStephan Mueller } 327435351988SStephan Mueller }, { 3275da7f033dSHerbert Xu .alg = "lrw(aes)", 32761aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3277da7f033dSHerbert Xu .suite = { 3278da7f033dSHerbert Xu .cipher = { 3279da7f033dSHerbert Xu .enc = { 3280da7f033dSHerbert Xu .vecs = aes_lrw_enc_tv_template, 3281da7f033dSHerbert Xu .count = AES_LRW_ENC_TEST_VECTORS 3282da7f033dSHerbert Xu }, 3283da7f033dSHerbert Xu .dec = { 3284da7f033dSHerbert Xu .vecs = aes_lrw_dec_tv_template, 3285da7f033dSHerbert Xu .count = AES_LRW_DEC_TEST_VECTORS 3286da7f033dSHerbert Xu } 3287da7f033dSHerbert Xu } 3288da7f033dSHerbert Xu } 3289da7f033dSHerbert Xu }, { 32900840605eSJussi Kivilinna .alg = "lrw(camellia)", 32910840605eSJussi Kivilinna .test = alg_test_skcipher, 32920840605eSJussi Kivilinna .suite = { 32930840605eSJussi Kivilinna .cipher = { 32940840605eSJussi Kivilinna .enc = { 32950840605eSJussi Kivilinna .vecs = camellia_lrw_enc_tv_template, 32960840605eSJussi Kivilinna .count = CAMELLIA_LRW_ENC_TEST_VECTORS 32970840605eSJussi Kivilinna }, 32980840605eSJussi Kivilinna .dec = { 32990840605eSJussi Kivilinna .vecs = camellia_lrw_dec_tv_template, 33000840605eSJussi Kivilinna .count = CAMELLIA_LRW_DEC_TEST_VECTORS 33010840605eSJussi Kivilinna } 33020840605eSJussi Kivilinna } 33030840605eSJussi Kivilinna } 33040840605eSJussi Kivilinna }, { 33059b8b0405SJohannes Goetzfried .alg = "lrw(cast6)", 33069b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 33079b8b0405SJohannes Goetzfried .suite = { 33089b8b0405SJohannes Goetzfried .cipher = { 33099b8b0405SJohannes Goetzfried .enc = { 33109b8b0405SJohannes Goetzfried .vecs = cast6_lrw_enc_tv_template, 33119b8b0405SJohannes Goetzfried .count = CAST6_LRW_ENC_TEST_VECTORS 33129b8b0405SJohannes Goetzfried }, 33139b8b0405SJohannes Goetzfried .dec = { 33149b8b0405SJohannes Goetzfried .vecs = cast6_lrw_dec_tv_template, 33159b8b0405SJohannes Goetzfried .count = CAST6_LRW_DEC_TEST_VECTORS 33169b8b0405SJohannes Goetzfried } 33179b8b0405SJohannes Goetzfried } 33189b8b0405SJohannes Goetzfried } 33199b8b0405SJohannes Goetzfried }, { 3320d7bfc0faSJussi Kivilinna .alg = "lrw(serpent)", 3321d7bfc0faSJussi Kivilinna .test = alg_test_skcipher, 3322d7bfc0faSJussi Kivilinna .suite = { 3323d7bfc0faSJussi Kivilinna .cipher = { 3324d7bfc0faSJussi Kivilinna .enc = { 3325d7bfc0faSJussi Kivilinna .vecs = serpent_lrw_enc_tv_template, 3326d7bfc0faSJussi Kivilinna .count = SERPENT_LRW_ENC_TEST_VECTORS 3327d7bfc0faSJussi Kivilinna }, 3328d7bfc0faSJussi Kivilinna .dec = { 3329d7bfc0faSJussi Kivilinna .vecs = serpent_lrw_dec_tv_template, 3330d7bfc0faSJussi Kivilinna .count = SERPENT_LRW_DEC_TEST_VECTORS 3331d7bfc0faSJussi Kivilinna } 3332d7bfc0faSJussi Kivilinna } 3333d7bfc0faSJussi Kivilinna } 3334d7bfc0faSJussi Kivilinna }, { 33350b2a1551SJussi Kivilinna .alg = "lrw(twofish)", 33360b2a1551SJussi Kivilinna .test = alg_test_skcipher, 33370b2a1551SJussi Kivilinna .suite = { 33380b2a1551SJussi Kivilinna .cipher = { 33390b2a1551SJussi Kivilinna .enc = { 33400b2a1551SJussi Kivilinna .vecs = tf_lrw_enc_tv_template, 33410b2a1551SJussi Kivilinna .count = TF_LRW_ENC_TEST_VECTORS 33420b2a1551SJussi Kivilinna }, 33430b2a1551SJussi Kivilinna .dec = { 33440b2a1551SJussi Kivilinna .vecs = tf_lrw_dec_tv_template, 33450b2a1551SJussi Kivilinna .count = TF_LRW_DEC_TEST_VECTORS 33460b2a1551SJussi Kivilinna } 33470b2a1551SJussi Kivilinna } 33480b2a1551SJussi Kivilinna } 33490b2a1551SJussi Kivilinna }, { 33501443cc9bSKOVACS Krisztian .alg = "lz4", 33511443cc9bSKOVACS Krisztian .test = alg_test_comp, 33521443cc9bSKOVACS Krisztian .fips_allowed = 1, 33531443cc9bSKOVACS Krisztian .suite = { 33541443cc9bSKOVACS Krisztian .comp = { 33551443cc9bSKOVACS Krisztian .comp = { 33561443cc9bSKOVACS Krisztian .vecs = lz4_comp_tv_template, 33571443cc9bSKOVACS Krisztian .count = LZ4_COMP_TEST_VECTORS 33581443cc9bSKOVACS Krisztian }, 33591443cc9bSKOVACS Krisztian .decomp = { 33601443cc9bSKOVACS Krisztian .vecs = lz4_decomp_tv_template, 33611443cc9bSKOVACS Krisztian .count = LZ4_DECOMP_TEST_VECTORS 33621443cc9bSKOVACS Krisztian } 33631443cc9bSKOVACS Krisztian } 33641443cc9bSKOVACS Krisztian } 33651443cc9bSKOVACS Krisztian }, { 33661443cc9bSKOVACS Krisztian .alg = "lz4hc", 33671443cc9bSKOVACS Krisztian .test = alg_test_comp, 33681443cc9bSKOVACS Krisztian .fips_allowed = 1, 33691443cc9bSKOVACS Krisztian .suite = { 33701443cc9bSKOVACS Krisztian .comp = { 33711443cc9bSKOVACS Krisztian .comp = { 33721443cc9bSKOVACS Krisztian .vecs = lz4hc_comp_tv_template, 33731443cc9bSKOVACS Krisztian .count = LZ4HC_COMP_TEST_VECTORS 33741443cc9bSKOVACS Krisztian }, 33751443cc9bSKOVACS Krisztian .decomp = { 33761443cc9bSKOVACS Krisztian .vecs = lz4hc_decomp_tv_template, 33771443cc9bSKOVACS Krisztian .count = LZ4HC_DECOMP_TEST_VECTORS 33781443cc9bSKOVACS Krisztian } 33791443cc9bSKOVACS Krisztian } 33801443cc9bSKOVACS Krisztian } 33811443cc9bSKOVACS Krisztian }, { 3382da7f033dSHerbert Xu .alg = "lzo", 3383da7f033dSHerbert Xu .test = alg_test_comp, 33840818904dSMilan Broz .fips_allowed = 1, 3385da7f033dSHerbert Xu .suite = { 3386da7f033dSHerbert Xu .comp = { 3387da7f033dSHerbert Xu .comp = { 3388da7f033dSHerbert Xu .vecs = lzo_comp_tv_template, 3389da7f033dSHerbert Xu .count = LZO_COMP_TEST_VECTORS 3390da7f033dSHerbert Xu }, 3391da7f033dSHerbert Xu .decomp = { 3392da7f033dSHerbert Xu .vecs = lzo_decomp_tv_template, 3393da7f033dSHerbert Xu .count = LZO_DECOMP_TEST_VECTORS 3394da7f033dSHerbert Xu } 3395da7f033dSHerbert Xu } 3396da7f033dSHerbert Xu } 3397da7f033dSHerbert Xu }, { 3398da7f033dSHerbert Xu .alg = "md4", 3399da7f033dSHerbert Xu .test = alg_test_hash, 3400da7f033dSHerbert Xu .suite = { 3401da7f033dSHerbert Xu .hash = { 3402da7f033dSHerbert Xu .vecs = md4_tv_template, 3403da7f033dSHerbert Xu .count = MD4_TEST_VECTORS 3404da7f033dSHerbert Xu } 3405da7f033dSHerbert Xu } 3406da7f033dSHerbert Xu }, { 3407da7f033dSHerbert Xu .alg = "md5", 3408da7f033dSHerbert Xu .test = alg_test_hash, 3409da7f033dSHerbert Xu .suite = { 3410da7f033dSHerbert Xu .hash = { 3411da7f033dSHerbert Xu .vecs = md5_tv_template, 3412da7f033dSHerbert Xu .count = MD5_TEST_VECTORS 3413da7f033dSHerbert Xu } 3414da7f033dSHerbert Xu } 3415da7f033dSHerbert Xu }, { 3416da7f033dSHerbert Xu .alg = "michael_mic", 3417da7f033dSHerbert Xu .test = alg_test_hash, 3418da7f033dSHerbert Xu .suite = { 3419da7f033dSHerbert Xu .hash = { 3420da7f033dSHerbert Xu .vecs = michael_mic_tv_template, 3421da7f033dSHerbert Xu .count = MICHAEL_MIC_TEST_VECTORS 3422da7f033dSHerbert Xu } 3423da7f033dSHerbert Xu } 3424da7f033dSHerbert Xu }, { 3425ba0e14acSPuneet Saxena .alg = "ofb(aes)", 3426ba0e14acSPuneet Saxena .test = alg_test_skcipher, 3427ba0e14acSPuneet Saxena .fips_allowed = 1, 3428ba0e14acSPuneet Saxena .suite = { 3429ba0e14acSPuneet Saxena .cipher = { 3430ba0e14acSPuneet Saxena .enc = { 3431ba0e14acSPuneet Saxena .vecs = aes_ofb_enc_tv_template, 3432ba0e14acSPuneet Saxena .count = AES_OFB_ENC_TEST_VECTORS 3433ba0e14acSPuneet Saxena }, 3434ba0e14acSPuneet Saxena .dec = { 3435ba0e14acSPuneet Saxena .vecs = aes_ofb_dec_tv_template, 3436ba0e14acSPuneet Saxena .count = AES_OFB_DEC_TEST_VECTORS 3437ba0e14acSPuneet Saxena } 3438ba0e14acSPuneet Saxena } 3439ba0e14acSPuneet Saxena } 3440ba0e14acSPuneet Saxena }, { 3441da7f033dSHerbert Xu .alg = "pcbc(fcrypt)", 34421aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3443da7f033dSHerbert Xu .suite = { 3444da7f033dSHerbert Xu .cipher = { 3445da7f033dSHerbert Xu .enc = { 3446da7f033dSHerbert Xu .vecs = fcrypt_pcbc_enc_tv_template, 3447da7f033dSHerbert Xu .count = FCRYPT_ENC_TEST_VECTORS 3448da7f033dSHerbert Xu }, 3449da7f033dSHerbert Xu .dec = { 3450da7f033dSHerbert Xu .vecs = fcrypt_pcbc_dec_tv_template, 3451da7f033dSHerbert Xu .count = FCRYPT_DEC_TEST_VECTORS 3452da7f033dSHerbert Xu } 3453da7f033dSHerbert Xu } 3454da7f033dSHerbert Xu } 3455da7f033dSHerbert Xu }, { 3456eee9dc61SMartin Willi .alg = "poly1305", 3457eee9dc61SMartin Willi .test = alg_test_hash, 3458eee9dc61SMartin Willi .suite = { 3459eee9dc61SMartin Willi .hash = { 3460eee9dc61SMartin Willi .vecs = poly1305_tv_template, 3461eee9dc61SMartin Willi .count = POLY1305_TEST_VECTORS 3462eee9dc61SMartin Willi } 3463eee9dc61SMartin Willi } 3464eee9dc61SMartin Willi }, { 3465da7f033dSHerbert Xu .alg = "rfc3686(ctr(aes))", 34661aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3467a1915d51SJarod Wilson .fips_allowed = 1, 3468da7f033dSHerbert Xu .suite = { 3469da7f033dSHerbert Xu .cipher = { 3470da7f033dSHerbert Xu .enc = { 3471f7cb80f2SJarod Wilson .vecs = aes_ctr_rfc3686_enc_tv_template, 3472f7cb80f2SJarod Wilson .count = AES_CTR_3686_ENC_TEST_VECTORS 3473da7f033dSHerbert Xu }, 3474da7f033dSHerbert Xu .dec = { 3475f7cb80f2SJarod Wilson .vecs = aes_ctr_rfc3686_dec_tv_template, 3476f7cb80f2SJarod Wilson .count = AES_CTR_3686_DEC_TEST_VECTORS 3477da7f033dSHerbert Xu } 3478da7f033dSHerbert Xu } 3479da7f033dSHerbert Xu } 3480da7f033dSHerbert Xu }, { 34813f31a740SHerbert Xu .alg = "rfc4106(gcm(aes))", 348269435b94SAdrian Hoban .test = alg_test_aead, 3483db71f29aSJarod Wilson .fips_allowed = 1, 348469435b94SAdrian Hoban .suite = { 348569435b94SAdrian Hoban .aead = { 348669435b94SAdrian Hoban .enc = { 348769435b94SAdrian Hoban .vecs = aes_gcm_rfc4106_enc_tv_template, 348869435b94SAdrian Hoban .count = AES_GCM_4106_ENC_TEST_VECTORS 348969435b94SAdrian Hoban }, 349069435b94SAdrian Hoban .dec = { 349169435b94SAdrian Hoban .vecs = aes_gcm_rfc4106_dec_tv_template, 349269435b94SAdrian Hoban .count = AES_GCM_4106_DEC_TEST_VECTORS 349369435b94SAdrian Hoban } 349469435b94SAdrian Hoban } 349569435b94SAdrian Hoban } 349669435b94SAdrian Hoban }, { 3497544c436aSHerbert Xu .alg = "rfc4309(ccm(aes))", 34985d667322SJarod Wilson .test = alg_test_aead, 3499a1915d51SJarod Wilson .fips_allowed = 1, 35005d667322SJarod Wilson .suite = { 35015d667322SJarod Wilson .aead = { 35025d667322SJarod Wilson .enc = { 35035d667322SJarod Wilson .vecs = aes_ccm_rfc4309_enc_tv_template, 35045d667322SJarod Wilson .count = AES_CCM_4309_ENC_TEST_VECTORS 35055d667322SJarod Wilson }, 35065d667322SJarod Wilson .dec = { 35075d667322SJarod Wilson .vecs = aes_ccm_rfc4309_dec_tv_template, 35085d667322SJarod Wilson .count = AES_CCM_4309_DEC_TEST_VECTORS 35095d667322SJarod Wilson } 35105d667322SJarod Wilson } 35115d667322SJarod Wilson } 35125d667322SJarod Wilson }, { 3513bb68745eSHerbert Xu .alg = "rfc4543(gcm(aes))", 3514e9b7441aSJussi Kivilinna .test = alg_test_aead, 3515e9b7441aSJussi Kivilinna .suite = { 3516e9b7441aSJussi Kivilinna .aead = { 3517e9b7441aSJussi Kivilinna .enc = { 3518e9b7441aSJussi Kivilinna .vecs = aes_gcm_rfc4543_enc_tv_template, 3519e9b7441aSJussi Kivilinna .count = AES_GCM_4543_ENC_TEST_VECTORS 3520e9b7441aSJussi Kivilinna }, 3521e9b7441aSJussi Kivilinna .dec = { 3522e9b7441aSJussi Kivilinna .vecs = aes_gcm_rfc4543_dec_tv_template, 3523e9b7441aSJussi Kivilinna .count = AES_GCM_4543_DEC_TEST_VECTORS 3524e9b7441aSJussi Kivilinna }, 3525e9b7441aSJussi Kivilinna } 3526e9b7441aSJussi Kivilinna } 3527e9b7441aSJussi Kivilinna }, { 3528af2b76b5SMartin Willi .alg = "rfc7539(chacha20,poly1305)", 3529af2b76b5SMartin Willi .test = alg_test_aead, 3530af2b76b5SMartin Willi .suite = { 3531af2b76b5SMartin Willi .aead = { 3532af2b76b5SMartin Willi .enc = { 3533af2b76b5SMartin Willi .vecs = rfc7539_enc_tv_template, 3534af2b76b5SMartin Willi .count = RFC7539_ENC_TEST_VECTORS 3535af2b76b5SMartin Willi }, 3536af2b76b5SMartin Willi .dec = { 3537af2b76b5SMartin Willi .vecs = rfc7539_dec_tv_template, 3538af2b76b5SMartin Willi .count = RFC7539_DEC_TEST_VECTORS 3539af2b76b5SMartin Willi }, 3540af2b76b5SMartin Willi } 3541af2b76b5SMartin Willi } 3542af2b76b5SMartin Willi }, { 35435900758dSMartin Willi .alg = "rfc7539esp(chacha20,poly1305)", 35445900758dSMartin Willi .test = alg_test_aead, 35455900758dSMartin Willi .suite = { 35465900758dSMartin Willi .aead = { 35475900758dSMartin Willi .enc = { 35485900758dSMartin Willi .vecs = rfc7539esp_enc_tv_template, 35495900758dSMartin Willi .count = RFC7539ESP_ENC_TEST_VECTORS 35505900758dSMartin Willi }, 35515900758dSMartin Willi .dec = { 35525900758dSMartin Willi .vecs = rfc7539esp_dec_tv_template, 35535900758dSMartin Willi .count = RFC7539ESP_DEC_TEST_VECTORS 35545900758dSMartin Willi }, 35555900758dSMartin Willi } 35565900758dSMartin Willi } 35575900758dSMartin Willi }, { 3558da7f033dSHerbert Xu .alg = "rmd128", 3559da7f033dSHerbert Xu .test = alg_test_hash, 3560da7f033dSHerbert Xu .suite = { 3561da7f033dSHerbert Xu .hash = { 3562da7f033dSHerbert Xu .vecs = rmd128_tv_template, 3563da7f033dSHerbert Xu .count = RMD128_TEST_VECTORS 3564da7f033dSHerbert Xu } 3565da7f033dSHerbert Xu } 3566da7f033dSHerbert Xu }, { 3567da7f033dSHerbert Xu .alg = "rmd160", 3568da7f033dSHerbert Xu .test = alg_test_hash, 3569da7f033dSHerbert Xu .suite = { 3570da7f033dSHerbert Xu .hash = { 3571da7f033dSHerbert Xu .vecs = rmd160_tv_template, 3572da7f033dSHerbert Xu .count = RMD160_TEST_VECTORS 3573da7f033dSHerbert Xu } 3574da7f033dSHerbert Xu } 3575da7f033dSHerbert Xu }, { 3576da7f033dSHerbert Xu .alg = "rmd256", 3577da7f033dSHerbert Xu .test = alg_test_hash, 3578da7f033dSHerbert Xu .suite = { 3579da7f033dSHerbert Xu .hash = { 3580da7f033dSHerbert Xu .vecs = rmd256_tv_template, 3581da7f033dSHerbert Xu .count = RMD256_TEST_VECTORS 3582da7f033dSHerbert Xu } 3583da7f033dSHerbert Xu } 3584da7f033dSHerbert Xu }, { 3585da7f033dSHerbert Xu .alg = "rmd320", 3586da7f033dSHerbert Xu .test = alg_test_hash, 3587da7f033dSHerbert Xu .suite = { 3588da7f033dSHerbert Xu .hash = { 3589da7f033dSHerbert Xu .vecs = rmd320_tv_template, 3590da7f033dSHerbert Xu .count = RMD320_TEST_VECTORS 3591da7f033dSHerbert Xu } 3592da7f033dSHerbert Xu } 3593da7f033dSHerbert Xu }, { 3594946cc463STadeusz Struk .alg = "rsa", 3595946cc463STadeusz Struk .test = alg_test_akcipher, 3596946cc463STadeusz Struk .fips_allowed = 1, 3597946cc463STadeusz Struk .suite = { 3598946cc463STadeusz Struk .akcipher = { 3599946cc463STadeusz Struk .vecs = rsa_tv_template, 3600946cc463STadeusz Struk .count = RSA_TEST_VECTORS 3601946cc463STadeusz Struk } 3602946cc463STadeusz Struk } 3603946cc463STadeusz Struk }, { 3604da7f033dSHerbert Xu .alg = "salsa20", 36051aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3606da7f033dSHerbert Xu .suite = { 3607da7f033dSHerbert Xu .cipher = { 3608da7f033dSHerbert Xu .enc = { 3609da7f033dSHerbert Xu .vecs = salsa20_stream_enc_tv_template, 3610da7f033dSHerbert Xu .count = SALSA20_STREAM_ENC_TEST_VECTORS 3611da7f033dSHerbert Xu } 3612da7f033dSHerbert Xu } 3613da7f033dSHerbert Xu } 3614da7f033dSHerbert Xu }, { 3615da7f033dSHerbert Xu .alg = "sha1", 3616da7f033dSHerbert Xu .test = alg_test_hash, 3617a1915d51SJarod Wilson .fips_allowed = 1, 3618da7f033dSHerbert Xu .suite = { 3619da7f033dSHerbert Xu .hash = { 3620da7f033dSHerbert Xu .vecs = sha1_tv_template, 3621da7f033dSHerbert Xu .count = SHA1_TEST_VECTORS 3622da7f033dSHerbert Xu } 3623da7f033dSHerbert Xu } 3624da7f033dSHerbert Xu }, { 3625da7f033dSHerbert Xu .alg = "sha224", 3626da7f033dSHerbert Xu .test = alg_test_hash, 3627a1915d51SJarod Wilson .fips_allowed = 1, 3628da7f033dSHerbert Xu .suite = { 3629da7f033dSHerbert Xu .hash = { 3630da7f033dSHerbert Xu .vecs = sha224_tv_template, 3631da7f033dSHerbert Xu .count = SHA224_TEST_VECTORS 3632da7f033dSHerbert Xu } 3633da7f033dSHerbert Xu } 3634da7f033dSHerbert Xu }, { 3635da7f033dSHerbert Xu .alg = "sha256", 3636da7f033dSHerbert Xu .test = alg_test_hash, 3637a1915d51SJarod Wilson .fips_allowed = 1, 3638da7f033dSHerbert Xu .suite = { 3639da7f033dSHerbert Xu .hash = { 3640da7f033dSHerbert Xu .vecs = sha256_tv_template, 3641da7f033dSHerbert Xu .count = SHA256_TEST_VECTORS 3642da7f033dSHerbert Xu } 3643da7f033dSHerbert Xu } 3644da7f033dSHerbert Xu }, { 3645da7f033dSHerbert Xu .alg = "sha384", 3646da7f033dSHerbert Xu .test = alg_test_hash, 3647a1915d51SJarod Wilson .fips_allowed = 1, 3648da7f033dSHerbert Xu .suite = { 3649da7f033dSHerbert Xu .hash = { 3650da7f033dSHerbert Xu .vecs = sha384_tv_template, 3651da7f033dSHerbert Xu .count = SHA384_TEST_VECTORS 3652da7f033dSHerbert Xu } 3653da7f033dSHerbert Xu } 3654da7f033dSHerbert Xu }, { 3655da7f033dSHerbert Xu .alg = "sha512", 3656da7f033dSHerbert Xu .test = alg_test_hash, 3657a1915d51SJarod Wilson .fips_allowed = 1, 3658da7f033dSHerbert Xu .suite = { 3659da7f033dSHerbert Xu .hash = { 3660da7f033dSHerbert Xu .vecs = sha512_tv_template, 3661da7f033dSHerbert Xu .count = SHA512_TEST_VECTORS 3662da7f033dSHerbert Xu } 3663da7f033dSHerbert Xu } 3664da7f033dSHerbert Xu }, { 3665da7f033dSHerbert Xu .alg = "tgr128", 3666da7f033dSHerbert Xu .test = alg_test_hash, 3667da7f033dSHerbert Xu .suite = { 3668da7f033dSHerbert Xu .hash = { 3669da7f033dSHerbert Xu .vecs = tgr128_tv_template, 3670da7f033dSHerbert Xu .count = TGR128_TEST_VECTORS 3671da7f033dSHerbert Xu } 3672da7f033dSHerbert Xu } 3673da7f033dSHerbert Xu }, { 3674da7f033dSHerbert Xu .alg = "tgr160", 3675da7f033dSHerbert Xu .test = alg_test_hash, 3676da7f033dSHerbert Xu .suite = { 3677da7f033dSHerbert Xu .hash = { 3678da7f033dSHerbert Xu .vecs = tgr160_tv_template, 3679da7f033dSHerbert Xu .count = TGR160_TEST_VECTORS 3680da7f033dSHerbert Xu } 3681da7f033dSHerbert Xu } 3682da7f033dSHerbert Xu }, { 3683da7f033dSHerbert Xu .alg = "tgr192", 3684da7f033dSHerbert Xu .test = alg_test_hash, 3685da7f033dSHerbert Xu .suite = { 3686da7f033dSHerbert Xu .hash = { 3687da7f033dSHerbert Xu .vecs = tgr192_tv_template, 3688da7f033dSHerbert Xu .count = TGR192_TEST_VECTORS 3689da7f033dSHerbert Xu } 3690da7f033dSHerbert Xu } 3691da7f033dSHerbert Xu }, { 3692f1939f7cSShane Wang .alg = "vmac(aes)", 3693f1939f7cSShane Wang .test = alg_test_hash, 3694f1939f7cSShane Wang .suite = { 3695f1939f7cSShane Wang .hash = { 3696f1939f7cSShane Wang .vecs = aes_vmac128_tv_template, 3697f1939f7cSShane Wang .count = VMAC_AES_TEST_VECTORS 3698f1939f7cSShane Wang } 3699f1939f7cSShane Wang } 3700f1939f7cSShane Wang }, { 3701da7f033dSHerbert Xu .alg = "wp256", 3702da7f033dSHerbert Xu .test = alg_test_hash, 3703da7f033dSHerbert Xu .suite = { 3704da7f033dSHerbert Xu .hash = { 3705da7f033dSHerbert Xu .vecs = wp256_tv_template, 3706da7f033dSHerbert Xu .count = WP256_TEST_VECTORS 3707da7f033dSHerbert Xu } 3708da7f033dSHerbert Xu } 3709da7f033dSHerbert Xu }, { 3710da7f033dSHerbert Xu .alg = "wp384", 3711da7f033dSHerbert Xu .test = alg_test_hash, 3712da7f033dSHerbert Xu .suite = { 3713da7f033dSHerbert Xu .hash = { 3714da7f033dSHerbert Xu .vecs = wp384_tv_template, 3715da7f033dSHerbert Xu .count = WP384_TEST_VECTORS 3716da7f033dSHerbert Xu } 3717da7f033dSHerbert Xu } 3718da7f033dSHerbert Xu }, { 3719da7f033dSHerbert Xu .alg = "wp512", 3720da7f033dSHerbert Xu .test = alg_test_hash, 3721da7f033dSHerbert Xu .suite = { 3722da7f033dSHerbert Xu .hash = { 3723da7f033dSHerbert Xu .vecs = wp512_tv_template, 3724da7f033dSHerbert Xu .count = WP512_TEST_VECTORS 3725da7f033dSHerbert Xu } 3726da7f033dSHerbert Xu } 3727da7f033dSHerbert Xu }, { 3728da7f033dSHerbert Xu .alg = "xcbc(aes)", 3729da7f033dSHerbert Xu .test = alg_test_hash, 3730da7f033dSHerbert Xu .suite = { 3731da7f033dSHerbert Xu .hash = { 3732da7f033dSHerbert Xu .vecs = aes_xcbc128_tv_template, 3733da7f033dSHerbert Xu .count = XCBC_AES_TEST_VECTORS 3734da7f033dSHerbert Xu } 3735da7f033dSHerbert Xu } 3736da7f033dSHerbert Xu }, { 3737da7f033dSHerbert Xu .alg = "xts(aes)", 37381aa4ecd9SHerbert Xu .test = alg_test_skcipher, 37392918aa8dSJarod Wilson .fips_allowed = 1, 3740da7f033dSHerbert Xu .suite = { 3741da7f033dSHerbert Xu .cipher = { 3742da7f033dSHerbert Xu .enc = { 3743da7f033dSHerbert Xu .vecs = aes_xts_enc_tv_template, 3744da7f033dSHerbert Xu .count = AES_XTS_ENC_TEST_VECTORS 3745da7f033dSHerbert Xu }, 3746da7f033dSHerbert Xu .dec = { 3747da7f033dSHerbert Xu .vecs = aes_xts_dec_tv_template, 3748da7f033dSHerbert Xu .count = AES_XTS_DEC_TEST_VECTORS 3749da7f033dSHerbert Xu } 3750da7f033dSHerbert Xu } 3751da7f033dSHerbert Xu } 37520c01aed5SGeert Uytterhoeven }, { 37530840605eSJussi Kivilinna .alg = "xts(camellia)", 37540840605eSJussi Kivilinna .test = alg_test_skcipher, 37550840605eSJussi Kivilinna .suite = { 37560840605eSJussi Kivilinna .cipher = { 37570840605eSJussi Kivilinna .enc = { 37580840605eSJussi Kivilinna .vecs = camellia_xts_enc_tv_template, 37590840605eSJussi Kivilinna .count = CAMELLIA_XTS_ENC_TEST_VECTORS 37600840605eSJussi Kivilinna }, 37610840605eSJussi Kivilinna .dec = { 37620840605eSJussi Kivilinna .vecs = camellia_xts_dec_tv_template, 37630840605eSJussi Kivilinna .count = CAMELLIA_XTS_DEC_TEST_VECTORS 37640840605eSJussi Kivilinna } 37650840605eSJussi Kivilinna } 37660840605eSJussi Kivilinna } 37670840605eSJussi Kivilinna }, { 37689b8b0405SJohannes Goetzfried .alg = "xts(cast6)", 37699b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 37709b8b0405SJohannes Goetzfried .suite = { 37719b8b0405SJohannes Goetzfried .cipher = { 37729b8b0405SJohannes Goetzfried .enc = { 37739b8b0405SJohannes Goetzfried .vecs = cast6_xts_enc_tv_template, 37749b8b0405SJohannes Goetzfried .count = CAST6_XTS_ENC_TEST_VECTORS 37759b8b0405SJohannes Goetzfried }, 37769b8b0405SJohannes Goetzfried .dec = { 37779b8b0405SJohannes Goetzfried .vecs = cast6_xts_dec_tv_template, 37789b8b0405SJohannes Goetzfried .count = CAST6_XTS_DEC_TEST_VECTORS 37799b8b0405SJohannes Goetzfried } 37809b8b0405SJohannes Goetzfried } 37819b8b0405SJohannes Goetzfried } 37829b8b0405SJohannes Goetzfried }, { 378318be20b9SJussi Kivilinna .alg = "xts(serpent)", 378418be20b9SJussi Kivilinna .test = alg_test_skcipher, 378518be20b9SJussi Kivilinna .suite = { 378618be20b9SJussi Kivilinna .cipher = { 378718be20b9SJussi Kivilinna .enc = { 378818be20b9SJussi Kivilinna .vecs = serpent_xts_enc_tv_template, 378918be20b9SJussi Kivilinna .count = SERPENT_XTS_ENC_TEST_VECTORS 379018be20b9SJussi Kivilinna }, 379118be20b9SJussi Kivilinna .dec = { 379218be20b9SJussi Kivilinna .vecs = serpent_xts_dec_tv_template, 379318be20b9SJussi Kivilinna .count = SERPENT_XTS_DEC_TEST_VECTORS 379418be20b9SJussi Kivilinna } 379518be20b9SJussi Kivilinna } 379618be20b9SJussi Kivilinna } 379718be20b9SJussi Kivilinna }, { 3798aed265b9SJussi Kivilinna .alg = "xts(twofish)", 3799aed265b9SJussi Kivilinna .test = alg_test_skcipher, 3800aed265b9SJussi Kivilinna .suite = { 3801aed265b9SJussi Kivilinna .cipher = { 3802aed265b9SJussi Kivilinna .enc = { 3803aed265b9SJussi Kivilinna .vecs = tf_xts_enc_tv_template, 3804aed265b9SJussi Kivilinna .count = TF_XTS_ENC_TEST_VECTORS 3805aed265b9SJussi Kivilinna }, 3806aed265b9SJussi Kivilinna .dec = { 3807aed265b9SJussi Kivilinna .vecs = tf_xts_dec_tv_template, 3808aed265b9SJussi Kivilinna .count = TF_XTS_DEC_TEST_VECTORS 3809aed265b9SJussi Kivilinna } 3810aed265b9SJussi Kivilinna } 3811aed265b9SJussi Kivilinna } 3812da7f033dSHerbert Xu } 3813da7f033dSHerbert Xu }; 3814da7f033dSHerbert Xu 38155714758bSJussi Kivilinna static bool alg_test_descs_checked; 38165714758bSJussi Kivilinna 38175714758bSJussi Kivilinna static void alg_test_descs_check_order(void) 38185714758bSJussi Kivilinna { 38195714758bSJussi Kivilinna int i; 38205714758bSJussi Kivilinna 38215714758bSJussi Kivilinna /* only check once */ 38225714758bSJussi Kivilinna if (alg_test_descs_checked) 38235714758bSJussi Kivilinna return; 38245714758bSJussi Kivilinna 38255714758bSJussi Kivilinna alg_test_descs_checked = true; 38265714758bSJussi Kivilinna 38275714758bSJussi Kivilinna for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) { 38285714758bSJussi Kivilinna int diff = strcmp(alg_test_descs[i - 1].alg, 38295714758bSJussi Kivilinna alg_test_descs[i].alg); 38305714758bSJussi Kivilinna 38315714758bSJussi Kivilinna if (WARN_ON(diff > 0)) { 38325714758bSJussi Kivilinna pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n", 38335714758bSJussi Kivilinna alg_test_descs[i - 1].alg, 38345714758bSJussi Kivilinna alg_test_descs[i].alg); 38355714758bSJussi Kivilinna } 38365714758bSJussi Kivilinna 38375714758bSJussi Kivilinna if (WARN_ON(diff == 0)) { 38385714758bSJussi Kivilinna pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n", 38395714758bSJussi Kivilinna alg_test_descs[i].alg); 38405714758bSJussi Kivilinna } 38415714758bSJussi Kivilinna } 38425714758bSJussi Kivilinna } 38435714758bSJussi Kivilinna 38441aa4ecd9SHerbert Xu static int alg_find_test(const char *alg) 3845da7f033dSHerbert Xu { 3846da7f033dSHerbert Xu int start = 0; 3847da7f033dSHerbert Xu int end = ARRAY_SIZE(alg_test_descs); 3848da7f033dSHerbert Xu 3849da7f033dSHerbert Xu while (start < end) { 3850da7f033dSHerbert Xu int i = (start + end) / 2; 3851da7f033dSHerbert Xu int diff = strcmp(alg_test_descs[i].alg, alg); 3852da7f033dSHerbert Xu 3853da7f033dSHerbert Xu if (diff > 0) { 3854da7f033dSHerbert Xu end = i; 3855da7f033dSHerbert Xu continue; 3856da7f033dSHerbert Xu } 3857da7f033dSHerbert Xu 3858da7f033dSHerbert Xu if (diff < 0) { 3859da7f033dSHerbert Xu start = i + 1; 3860da7f033dSHerbert Xu continue; 3861da7f033dSHerbert Xu } 3862da7f033dSHerbert Xu 38631aa4ecd9SHerbert Xu return i; 3864da7f033dSHerbert Xu } 3865da7f033dSHerbert Xu 38661aa4ecd9SHerbert Xu return -1; 38671aa4ecd9SHerbert Xu } 38681aa4ecd9SHerbert Xu 38691aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 38701aa4ecd9SHerbert Xu { 38711aa4ecd9SHerbert Xu int i; 3872a68f6610SHerbert Xu int j; 3873d12d6b6dSNeil Horman int rc; 38741aa4ecd9SHerbert Xu 38759e5c9fe4SRichard W.M. Jones if (!fips_enabled && notests) { 38769e5c9fe4SRichard W.M. Jones printk_once(KERN_INFO "alg: self-tests disabled\n"); 38779e5c9fe4SRichard W.M. Jones return 0; 38789e5c9fe4SRichard W.M. Jones } 38799e5c9fe4SRichard W.M. Jones 38805714758bSJussi Kivilinna alg_test_descs_check_order(); 38815714758bSJussi Kivilinna 38821aa4ecd9SHerbert Xu if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) { 38831aa4ecd9SHerbert Xu char nalg[CRYPTO_MAX_ALG_NAME]; 38841aa4ecd9SHerbert Xu 38851aa4ecd9SHerbert Xu if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >= 38861aa4ecd9SHerbert Xu sizeof(nalg)) 38871aa4ecd9SHerbert Xu return -ENAMETOOLONG; 38881aa4ecd9SHerbert Xu 38891aa4ecd9SHerbert Xu i = alg_find_test(nalg); 38901aa4ecd9SHerbert Xu if (i < 0) 38911aa4ecd9SHerbert Xu goto notest; 38921aa4ecd9SHerbert Xu 3893a3bef3a3SJarod Wilson if (fips_enabled && !alg_test_descs[i].fips_allowed) 3894a3bef3a3SJarod Wilson goto non_fips_alg; 3895a3bef3a3SJarod Wilson 3896941fb328SJarod Wilson rc = alg_test_cipher(alg_test_descs + i, driver, type, mask); 3897941fb328SJarod Wilson goto test_done; 38981aa4ecd9SHerbert Xu } 38991aa4ecd9SHerbert Xu 39001aa4ecd9SHerbert Xu i = alg_find_test(alg); 3901a68f6610SHerbert Xu j = alg_find_test(driver); 3902a68f6610SHerbert Xu if (i < 0 && j < 0) 39031aa4ecd9SHerbert Xu goto notest; 39041aa4ecd9SHerbert Xu 3905a68f6610SHerbert Xu if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) || 3906a68f6610SHerbert Xu (j >= 0 && !alg_test_descs[j].fips_allowed))) 3907a3bef3a3SJarod Wilson goto non_fips_alg; 3908a3bef3a3SJarod Wilson 3909a68f6610SHerbert Xu rc = 0; 3910a68f6610SHerbert Xu if (i >= 0) 3911a68f6610SHerbert Xu rc |= alg_test_descs[i].test(alg_test_descs + i, driver, 39121aa4ecd9SHerbert Xu type, mask); 3913032c8cacSCristian Stoica if (j >= 0 && j != i) 3914a68f6610SHerbert Xu rc |= alg_test_descs[j].test(alg_test_descs + j, driver, 3915a68f6610SHerbert Xu type, mask); 3916a68f6610SHerbert Xu 3917941fb328SJarod Wilson test_done: 3918d12d6b6dSNeil Horman if (fips_enabled && rc) 3919d12d6b6dSNeil Horman panic("%s: %s alg self test failed in fips mode!\n", driver, alg); 3920d12d6b6dSNeil Horman 392129ecd4abSJarod Wilson if (fips_enabled && !rc) 39223e8cffd4SMasanari Iida pr_info("alg: self-tests for %s (%s) passed\n", driver, alg); 392329ecd4abSJarod Wilson 3924d12d6b6dSNeil Horman return rc; 39251aa4ecd9SHerbert Xu 39261aa4ecd9SHerbert Xu notest: 3927da7f033dSHerbert Xu printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver); 3928da7f033dSHerbert Xu return 0; 3929a3bef3a3SJarod Wilson non_fips_alg: 3930a3bef3a3SJarod Wilson return -EINVAL; 3931da7f033dSHerbert Xu } 39320b767f96SAlexander Shishkin 3933326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */ 39340b767f96SAlexander Shishkin 3935da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test); 3936