1da7f033dSHerbert Xu /* 2da7f033dSHerbert Xu * Algorithm testing framework and tests. 3da7f033dSHerbert Xu * 4da7f033dSHerbert Xu * Copyright (c) 2002 James Morris <jmorris@intercode.com.au> 5da7f033dSHerbert Xu * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org> 6da7f033dSHerbert Xu * Copyright (c) 2007 Nokia Siemens Networks 7da7f033dSHerbert Xu * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au> 8da7f033dSHerbert Xu * 969435b94SAdrian Hoban * Updated RFC4106 AES-GCM testing. 1069435b94SAdrian Hoban * Authors: Aidan O'Mahony (aidan.o.mahony@intel.com) 1169435b94SAdrian Hoban * Adrian Hoban <adrian.hoban@intel.com> 1269435b94SAdrian Hoban * Gabriele Paoloni <gabriele.paoloni@intel.com> 1369435b94SAdrian Hoban * Tadeusz Struk (tadeusz.struk@intel.com) 1469435b94SAdrian Hoban * Copyright (c) 2010, Intel Corporation. 1569435b94SAdrian Hoban * 16da7f033dSHerbert Xu * This program is free software; you can redistribute it and/or modify it 17da7f033dSHerbert Xu * under the terms of the GNU General Public License as published by the Free 18da7f033dSHerbert Xu * Software Foundation; either version 2 of the License, or (at your option) 19da7f033dSHerbert Xu * any later version. 20da7f033dSHerbert Xu * 21da7f033dSHerbert Xu */ 22da7f033dSHerbert Xu 231ce33115SHerbert Xu #include <crypto/aead.h> 24da7f033dSHerbert Xu #include <crypto/hash.h> 2512773d93SHerbert Xu #include <crypto/skcipher.h> 26da7f033dSHerbert Xu #include <linux/err.h> 271c41b882SHerbert Xu #include <linux/fips.h> 28da7f033dSHerbert Xu #include <linux/module.h> 29da7f033dSHerbert Xu #include <linux/scatterlist.h> 30da7f033dSHerbert Xu #include <linux/slab.h> 31da7f033dSHerbert Xu #include <linux/string.h> 327647d6ceSJarod Wilson #include <crypto/rng.h> 3364d1cdfbSStephan Mueller #include <crypto/drbg.h> 34946cc463STadeusz Struk #include <crypto/akcipher.h> 35802c7f1cSSalvatore Benedetto #include <crypto/kpp.h> 36d7db7a88SGiovanni Cabiddu #include <crypto/acompress.h> 37da7f033dSHerbert Xu 38da7f033dSHerbert Xu #include "internal.h" 390b767f96SAlexander Shishkin 409e5c9fe4SRichard W.M. Jones static bool notests; 419e5c9fe4SRichard W.M. Jones module_param(notests, bool, 0644); 429e5c9fe4SRichard W.M. Jones MODULE_PARM_DESC(notests, "disable crypto self-tests"); 439e5c9fe4SRichard W.M. Jones 44326a6346SHerbert Xu #ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS 450b767f96SAlexander Shishkin 460b767f96SAlexander Shishkin /* a perfect nop */ 470b767f96SAlexander Shishkin int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 480b767f96SAlexander Shishkin { 490b767f96SAlexander Shishkin return 0; 500b767f96SAlexander Shishkin } 510b767f96SAlexander Shishkin 520b767f96SAlexander Shishkin #else 530b767f96SAlexander Shishkin 54da7f033dSHerbert Xu #include "testmgr.h" 55da7f033dSHerbert Xu 56da7f033dSHerbert Xu /* 57da7f033dSHerbert Xu * Need slab memory for testing (size in number of pages). 58da7f033dSHerbert Xu */ 59da7f033dSHerbert Xu #define XBUFSIZE 8 60da7f033dSHerbert Xu 61da7f033dSHerbert Xu /* 62da7f033dSHerbert Xu * Indexes into the xbuf to simulate cross-page access. 63da7f033dSHerbert Xu */ 64da7f033dSHerbert Xu #define IDX1 32 65da7f033dSHerbert Xu #define IDX2 32400 6604b46fbdSArd Biesheuvel #define IDX3 1511 67da7f033dSHerbert Xu #define IDX4 8193 68da7f033dSHerbert Xu #define IDX5 22222 69da7f033dSHerbert Xu #define IDX6 17101 70da7f033dSHerbert Xu #define IDX7 27333 71da7f033dSHerbert Xu #define IDX8 3000 72da7f033dSHerbert Xu 73da7f033dSHerbert Xu /* 74da7f033dSHerbert Xu * Used by test_cipher() 75da7f033dSHerbert Xu */ 76da7f033dSHerbert Xu #define ENCRYPT 1 77da7f033dSHerbert Xu #define DECRYPT 0 78da7f033dSHerbert Xu 79da7f033dSHerbert Xu struct tcrypt_result { 80da7f033dSHerbert Xu struct completion completion; 81da7f033dSHerbert Xu int err; 82da7f033dSHerbert Xu }; 83da7f033dSHerbert Xu 84da7f033dSHerbert Xu struct aead_test_suite { 85da7f033dSHerbert Xu struct { 86b13b1e0cSEric Biggers const struct aead_testvec *vecs; 87da7f033dSHerbert Xu unsigned int count; 88da7f033dSHerbert Xu } enc, dec; 89da7f033dSHerbert Xu }; 90da7f033dSHerbert Xu 91da7f033dSHerbert Xu struct cipher_test_suite { 92da7f033dSHerbert Xu struct { 93b13b1e0cSEric Biggers const struct cipher_testvec *vecs; 94da7f033dSHerbert Xu unsigned int count; 95da7f033dSHerbert Xu } enc, dec; 96da7f033dSHerbert Xu }; 97da7f033dSHerbert Xu 98da7f033dSHerbert Xu struct comp_test_suite { 99da7f033dSHerbert Xu struct { 100b13b1e0cSEric Biggers const struct comp_testvec *vecs; 101da7f033dSHerbert Xu unsigned int count; 102da7f033dSHerbert Xu } comp, decomp; 103da7f033dSHerbert Xu }; 104da7f033dSHerbert Xu 105da7f033dSHerbert Xu struct hash_test_suite { 106b13b1e0cSEric Biggers const struct hash_testvec *vecs; 107da7f033dSHerbert Xu unsigned int count; 108da7f033dSHerbert Xu }; 109da7f033dSHerbert Xu 1107647d6ceSJarod Wilson struct cprng_test_suite { 111b13b1e0cSEric Biggers const struct cprng_testvec *vecs; 1127647d6ceSJarod Wilson unsigned int count; 1137647d6ceSJarod Wilson }; 1147647d6ceSJarod Wilson 11564d1cdfbSStephan Mueller struct drbg_test_suite { 116b13b1e0cSEric Biggers const struct drbg_testvec *vecs; 11764d1cdfbSStephan Mueller unsigned int count; 11864d1cdfbSStephan Mueller }; 11964d1cdfbSStephan Mueller 120946cc463STadeusz Struk struct akcipher_test_suite { 121b13b1e0cSEric Biggers const struct akcipher_testvec *vecs; 122946cc463STadeusz Struk unsigned int count; 123946cc463STadeusz Struk }; 124946cc463STadeusz Struk 125802c7f1cSSalvatore Benedetto struct kpp_test_suite { 126b13b1e0cSEric Biggers const struct kpp_testvec *vecs; 127802c7f1cSSalvatore Benedetto unsigned int count; 128802c7f1cSSalvatore Benedetto }; 129802c7f1cSSalvatore Benedetto 130da7f033dSHerbert Xu struct alg_test_desc { 131da7f033dSHerbert Xu const char *alg; 132da7f033dSHerbert Xu int (*test)(const struct alg_test_desc *desc, const char *driver, 133da7f033dSHerbert Xu u32 type, u32 mask); 134a1915d51SJarod Wilson int fips_allowed; /* set if alg is allowed in fips mode */ 135da7f033dSHerbert Xu 136da7f033dSHerbert Xu union { 137da7f033dSHerbert Xu struct aead_test_suite aead; 138da7f033dSHerbert Xu struct cipher_test_suite cipher; 139da7f033dSHerbert Xu struct comp_test_suite comp; 140da7f033dSHerbert Xu struct hash_test_suite hash; 1417647d6ceSJarod Wilson struct cprng_test_suite cprng; 14264d1cdfbSStephan Mueller struct drbg_test_suite drbg; 143946cc463STadeusz Struk struct akcipher_test_suite akcipher; 144802c7f1cSSalvatore Benedetto struct kpp_test_suite kpp; 145da7f033dSHerbert Xu } suite; 146da7f033dSHerbert Xu }; 147da7f033dSHerbert Xu 148b13b1e0cSEric Biggers static const unsigned int IDX[8] = { 149b13b1e0cSEric Biggers IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 }; 150da7f033dSHerbert Xu 151da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len) 152da7f033dSHerbert Xu { 153da7f033dSHerbert Xu print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET, 154da7f033dSHerbert Xu 16, 1, 155da7f033dSHerbert Xu buf, len, false); 156da7f033dSHerbert Xu } 157da7f033dSHerbert Xu 158da7f033dSHerbert Xu static void tcrypt_complete(struct crypto_async_request *req, int err) 159da7f033dSHerbert Xu { 160da7f033dSHerbert Xu struct tcrypt_result *res = req->data; 161da7f033dSHerbert Xu 162da7f033dSHerbert Xu if (err == -EINPROGRESS) 163da7f033dSHerbert Xu return; 164da7f033dSHerbert Xu 165da7f033dSHerbert Xu res->err = err; 166da7f033dSHerbert Xu complete(&res->completion); 167da7f033dSHerbert Xu } 168da7f033dSHerbert Xu 169f8b0d4d0SHerbert Xu static int testmgr_alloc_buf(char *buf[XBUFSIZE]) 170f8b0d4d0SHerbert Xu { 171f8b0d4d0SHerbert Xu int i; 172f8b0d4d0SHerbert Xu 173f8b0d4d0SHerbert Xu for (i = 0; i < XBUFSIZE; i++) { 174f8b0d4d0SHerbert Xu buf[i] = (void *)__get_free_page(GFP_KERNEL); 175f8b0d4d0SHerbert Xu if (!buf[i]) 176f8b0d4d0SHerbert Xu goto err_free_buf; 177f8b0d4d0SHerbert Xu } 178f8b0d4d0SHerbert Xu 179f8b0d4d0SHerbert Xu return 0; 180f8b0d4d0SHerbert Xu 181f8b0d4d0SHerbert Xu err_free_buf: 182f8b0d4d0SHerbert Xu while (i-- > 0) 183f8b0d4d0SHerbert Xu free_page((unsigned long)buf[i]); 184f8b0d4d0SHerbert Xu 185f8b0d4d0SHerbert Xu return -ENOMEM; 186f8b0d4d0SHerbert Xu } 187f8b0d4d0SHerbert Xu 188f8b0d4d0SHerbert Xu static void testmgr_free_buf(char *buf[XBUFSIZE]) 189f8b0d4d0SHerbert Xu { 190f8b0d4d0SHerbert Xu int i; 191f8b0d4d0SHerbert Xu 192f8b0d4d0SHerbert Xu for (i = 0; i < XBUFSIZE; i++) 193f8b0d4d0SHerbert Xu free_page((unsigned long)buf[i]); 194f8b0d4d0SHerbert Xu } 195f8b0d4d0SHerbert Xu 196d4c85f9bSCristian Stoica static int wait_async_op(struct tcrypt_result *tr, int ret) 197a8f1a052SDavid S. Miller { 198a8f1a052SDavid S. Miller if (ret == -EINPROGRESS || ret == -EBUSY) { 1998a45ac12SRabin Vincent wait_for_completion(&tr->completion); 20016735d02SWolfram Sang reinit_completion(&tr->completion); 2018a45ac12SRabin Vincent ret = tr->err; 202a8f1a052SDavid S. Miller } 203a8f1a052SDavid S. Miller return ret; 204a8f1a052SDavid S. Miller } 205a8f1a052SDavid S. Miller 206018ba95cSWang, Rui Y static int ahash_partial_update(struct ahash_request **preq, 207b13b1e0cSEric Biggers struct crypto_ahash *tfm, const struct hash_testvec *template, 208018ba95cSWang, Rui Y void *hash_buff, int k, int temp, struct scatterlist *sg, 209018ba95cSWang, Rui Y const char *algo, char *result, struct tcrypt_result *tresult) 210018ba95cSWang, Rui Y { 211018ba95cSWang, Rui Y char *state; 212018ba95cSWang, Rui Y struct ahash_request *req; 213018ba95cSWang, Rui Y int statesize, ret = -EINVAL; 2147bcb87bcSJan Stancek const char guard[] = { 0x00, 0xba, 0xad, 0x00 }; 215018ba95cSWang, Rui Y 216018ba95cSWang, Rui Y req = *preq; 217018ba95cSWang, Rui Y statesize = crypto_ahash_statesize( 218018ba95cSWang, Rui Y crypto_ahash_reqtfm(req)); 2197bcb87bcSJan Stancek state = kmalloc(statesize + sizeof(guard), GFP_KERNEL); 220018ba95cSWang, Rui Y if (!state) { 221018ba95cSWang, Rui Y pr_err("alt: hash: Failed to alloc state for %s\n", algo); 222018ba95cSWang, Rui Y goto out_nostate; 223018ba95cSWang, Rui Y } 2247bcb87bcSJan Stancek memcpy(state + statesize, guard, sizeof(guard)); 225018ba95cSWang, Rui Y ret = crypto_ahash_export(req, state); 2267bcb87bcSJan Stancek WARN_ON(memcmp(state + statesize, guard, sizeof(guard))); 227018ba95cSWang, Rui Y if (ret) { 228018ba95cSWang, Rui Y pr_err("alt: hash: Failed to export() for %s\n", algo); 229018ba95cSWang, Rui Y goto out; 230018ba95cSWang, Rui Y } 231018ba95cSWang, Rui Y ahash_request_free(req); 232018ba95cSWang, Rui Y req = ahash_request_alloc(tfm, GFP_KERNEL); 233018ba95cSWang, Rui Y if (!req) { 234018ba95cSWang, Rui Y pr_err("alg: hash: Failed to alloc request for %s\n", algo); 235018ba95cSWang, Rui Y goto out_noreq; 236018ba95cSWang, Rui Y } 237018ba95cSWang, Rui Y ahash_request_set_callback(req, 238018ba95cSWang, Rui Y CRYPTO_TFM_REQ_MAY_BACKLOG, 239018ba95cSWang, Rui Y tcrypt_complete, tresult); 240018ba95cSWang, Rui Y 241018ba95cSWang, Rui Y memcpy(hash_buff, template->plaintext + temp, 242018ba95cSWang, Rui Y template->tap[k]); 243018ba95cSWang, Rui Y sg_init_one(&sg[0], hash_buff, template->tap[k]); 244018ba95cSWang, Rui Y ahash_request_set_crypt(req, sg, result, template->tap[k]); 245018ba95cSWang, Rui Y ret = crypto_ahash_import(req, state); 246018ba95cSWang, Rui Y if (ret) { 247018ba95cSWang, Rui Y pr_err("alg: hash: Failed to import() for %s\n", algo); 248018ba95cSWang, Rui Y goto out; 249018ba95cSWang, Rui Y } 250018ba95cSWang, Rui Y ret = wait_async_op(tresult, crypto_ahash_update(req)); 251018ba95cSWang, Rui Y if (ret) 252018ba95cSWang, Rui Y goto out; 253018ba95cSWang, Rui Y *preq = req; 254018ba95cSWang, Rui Y ret = 0; 255018ba95cSWang, Rui Y goto out_noreq; 256018ba95cSWang, Rui Y out: 257018ba95cSWang, Rui Y ahash_request_free(req); 258018ba95cSWang, Rui Y out_noreq: 259018ba95cSWang, Rui Y kfree(state); 260018ba95cSWang, Rui Y out_nostate: 261018ba95cSWang, Rui Y return ret; 262018ba95cSWang, Rui Y } 263018ba95cSWang, Rui Y 264b13b1e0cSEric Biggers static int __test_hash(struct crypto_ahash *tfm, 265b13b1e0cSEric Biggers const struct hash_testvec *template, unsigned int tcount, 266b13b1e0cSEric Biggers bool use_digest, const int align_offset) 267da7f033dSHerbert Xu { 268da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm)); 269e93acd6fSAndrew Lutomirski size_t digest_size = crypto_ahash_digestsize(tfm); 270da7f033dSHerbert Xu unsigned int i, j, k, temp; 271da7f033dSHerbert Xu struct scatterlist sg[8]; 27229b77e5dSHoria Geanta char *result; 27329b77e5dSHoria Geanta char *key; 274da7f033dSHerbert Xu struct ahash_request *req; 275da7f033dSHerbert Xu struct tcrypt_result tresult; 276da7f033dSHerbert Xu void *hash_buff; 277f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 278f8b0d4d0SHerbert Xu int ret = -ENOMEM; 279f8b0d4d0SHerbert Xu 280e93acd6fSAndrew Lutomirski result = kmalloc(digest_size, GFP_KERNEL); 28129b77e5dSHoria Geanta if (!result) 28229b77e5dSHoria Geanta return ret; 28329b77e5dSHoria Geanta key = kmalloc(MAX_KEYLEN, GFP_KERNEL); 28429b77e5dSHoria Geanta if (!key) 28529b77e5dSHoria Geanta goto out_nobuf; 286f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 287f8b0d4d0SHerbert Xu goto out_nobuf; 288da7f033dSHerbert Xu 289da7f033dSHerbert Xu init_completion(&tresult.completion); 290da7f033dSHerbert Xu 291da7f033dSHerbert Xu req = ahash_request_alloc(tfm, GFP_KERNEL); 292da7f033dSHerbert Xu if (!req) { 293da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to allocate request for " 294da7f033dSHerbert Xu "%s\n", algo); 295da7f033dSHerbert Xu goto out_noreq; 296da7f033dSHerbert Xu } 297da7f033dSHerbert Xu ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 298da7f033dSHerbert Xu tcrypt_complete, &tresult); 299da7f033dSHerbert Xu 300a0cfae59SHerbert Xu j = 0; 301da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 302a0cfae59SHerbert Xu if (template[i].np) 303a0cfae59SHerbert Xu continue; 304a0cfae59SHerbert Xu 305da5ffe11SJussi Kivilinna ret = -EINVAL; 306da5ffe11SJussi Kivilinna if (WARN_ON(align_offset + template[i].psize > PAGE_SIZE)) 307da5ffe11SJussi Kivilinna goto out; 308da5ffe11SJussi Kivilinna 309a0cfae59SHerbert Xu j++; 310e93acd6fSAndrew Lutomirski memset(result, 0, digest_size); 311da7f033dSHerbert Xu 312da7f033dSHerbert Xu hash_buff = xbuf[0]; 313da5ffe11SJussi Kivilinna hash_buff += align_offset; 314da7f033dSHerbert Xu 315da7f033dSHerbert Xu memcpy(hash_buff, template[i].plaintext, template[i].psize); 316da7f033dSHerbert Xu sg_init_one(&sg[0], hash_buff, template[i].psize); 317da7f033dSHerbert Xu 318da7f033dSHerbert Xu if (template[i].ksize) { 319da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 32029b77e5dSHoria Geanta if (template[i].ksize > MAX_KEYLEN) { 32129b77e5dSHoria Geanta pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n", 32229b77e5dSHoria Geanta j, algo, template[i].ksize, MAX_KEYLEN); 32329b77e5dSHoria Geanta ret = -EINVAL; 32429b77e5dSHoria Geanta goto out; 32529b77e5dSHoria Geanta } 32629b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].ksize); 32729b77e5dSHoria Geanta ret = crypto_ahash_setkey(tfm, key, template[i].ksize); 328da7f033dSHerbert Xu if (ret) { 329da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey failed on " 330a0cfae59SHerbert Xu "test %d for %s: ret=%d\n", j, algo, 331da7f033dSHerbert Xu -ret); 332da7f033dSHerbert Xu goto out; 333da7f033dSHerbert Xu } 334da7f033dSHerbert Xu } 335da7f033dSHerbert Xu 336da7f033dSHerbert Xu ahash_request_set_crypt(req, sg, result, template[i].psize); 337a8f1a052SDavid S. Miller if (use_digest) { 338d4c85f9bSCristian Stoica ret = wait_async_op(&tresult, crypto_ahash_digest(req)); 339a8f1a052SDavid S. Miller if (ret) { 340a8f1a052SDavid S. Miller pr_err("alg: hash: digest failed on test %d " 341a0cfae59SHerbert Xu "for %s: ret=%d\n", j, algo, -ret); 342da7f033dSHerbert Xu goto out; 343da7f033dSHerbert Xu } 344a8f1a052SDavid S. Miller } else { 345d4c85f9bSCristian Stoica ret = wait_async_op(&tresult, crypto_ahash_init(req)); 346a8f1a052SDavid S. Miller if (ret) { 347a8f1a052SDavid S. Miller pr_err("alt: hash: init failed on test %d " 348a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 349a8f1a052SDavid S. Miller goto out; 350a8f1a052SDavid S. Miller } 351d4c85f9bSCristian Stoica ret = wait_async_op(&tresult, crypto_ahash_update(req)); 352a8f1a052SDavid S. Miller if (ret) { 353a8f1a052SDavid S. Miller pr_err("alt: hash: update failed on test %d " 354a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 355a8f1a052SDavid S. Miller goto out; 356a8f1a052SDavid S. Miller } 357d4c85f9bSCristian Stoica ret = wait_async_op(&tresult, crypto_ahash_final(req)); 358a8f1a052SDavid S. Miller if (ret) { 359a8f1a052SDavid S. Miller pr_err("alt: hash: final failed on test %d " 360a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 361a8f1a052SDavid S. Miller goto out; 362a8f1a052SDavid S. Miller } 363a8f1a052SDavid S. Miller } 364da7f033dSHerbert Xu 365da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 366da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 367da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Test %d failed for %s\n", 368a0cfae59SHerbert Xu j, algo); 369da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 370da7f033dSHerbert Xu ret = -EINVAL; 371da7f033dSHerbert Xu goto out; 372da7f033dSHerbert Xu } 373da7f033dSHerbert Xu } 374da7f033dSHerbert Xu 375da7f033dSHerbert Xu j = 0; 376da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 377da5ffe11SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 378da5ffe11SJussi Kivilinna if (align_offset != 0) 379da5ffe11SJussi Kivilinna break; 380da5ffe11SJussi Kivilinna 3815f2b424eSCristian Stoica if (!template[i].np) 3825f2b424eSCristian Stoica continue; 3835f2b424eSCristian Stoica 384da7f033dSHerbert Xu j++; 385e93acd6fSAndrew Lutomirski memset(result, 0, digest_size); 386da7f033dSHerbert Xu 387da7f033dSHerbert Xu temp = 0; 388da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 389fd57f22aSHerbert Xu ret = -EINVAL; 390da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 391fd57f22aSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 392fd57f22aSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 393fd57f22aSHerbert Xu goto out; 394da7f033dSHerbert Xu sg_set_buf(&sg[k], 395da7f033dSHerbert Xu memcpy(xbuf[IDX[k] >> PAGE_SHIFT] + 396da7f033dSHerbert Xu offset_in_page(IDX[k]), 397da7f033dSHerbert Xu template[i].plaintext + temp, 398da7f033dSHerbert Xu template[i].tap[k]), 399da7f033dSHerbert Xu template[i].tap[k]); 400da7f033dSHerbert Xu temp += template[i].tap[k]; 401da7f033dSHerbert Xu } 402da7f033dSHerbert Xu 403da7f033dSHerbert Xu if (template[i].ksize) { 40429b77e5dSHoria Geanta if (template[i].ksize > MAX_KEYLEN) { 40529b77e5dSHoria Geanta pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n", 4065f2b424eSCristian Stoica j, algo, template[i].ksize, MAX_KEYLEN); 40729b77e5dSHoria Geanta ret = -EINVAL; 40829b77e5dSHoria Geanta goto out; 40929b77e5dSHoria Geanta } 410da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 41129b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].ksize); 4125f2b424eSCristian Stoica ret = crypto_ahash_setkey(tfm, key, template[i].ksize); 413da7f033dSHerbert Xu 414da7f033dSHerbert Xu if (ret) { 415da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey " 416da7f033dSHerbert Xu "failed on chunking test %d " 4175f2b424eSCristian Stoica "for %s: ret=%d\n", j, algo, -ret); 418da7f033dSHerbert Xu goto out; 419da7f033dSHerbert Xu } 420da7f033dSHerbert Xu } 421da7f033dSHerbert Xu 4225f2b424eSCristian Stoica ahash_request_set_crypt(req, sg, result, template[i].psize); 423da7f033dSHerbert Xu ret = crypto_ahash_digest(req); 424da7f033dSHerbert Xu switch (ret) { 425da7f033dSHerbert Xu case 0: 426da7f033dSHerbert Xu break; 427da7f033dSHerbert Xu case -EINPROGRESS: 428da7f033dSHerbert Xu case -EBUSY: 4298a45ac12SRabin Vincent wait_for_completion(&tresult.completion); 43016735d02SWolfram Sang reinit_completion(&tresult.completion); 4318a45ac12SRabin Vincent ret = tresult.err; 4328a45ac12SRabin Vincent if (!ret) 433da7f033dSHerbert Xu break; 434da7f033dSHerbert Xu /* fall through */ 435da7f033dSHerbert Xu default: 436da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: digest failed " 437da7f033dSHerbert Xu "on chunking test %d for %s: " 438da7f033dSHerbert Xu "ret=%d\n", j, algo, -ret); 439da7f033dSHerbert Xu goto out; 440da7f033dSHerbert Xu } 441da7f033dSHerbert Xu 442da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 443da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 444da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Chunking test %d " 445da7f033dSHerbert Xu "failed for %s\n", j, algo); 446da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 447da7f033dSHerbert Xu ret = -EINVAL; 448da7f033dSHerbert Xu goto out; 449da7f033dSHerbert Xu } 450da7f033dSHerbert Xu } 451da7f033dSHerbert Xu 452018ba95cSWang, Rui Y /* partial update exercise */ 453018ba95cSWang, Rui Y j = 0; 454018ba95cSWang, Rui Y for (i = 0; i < tcount; i++) { 455018ba95cSWang, Rui Y /* alignment tests are only done with continuous buffers */ 456018ba95cSWang, Rui Y if (align_offset != 0) 457018ba95cSWang, Rui Y break; 458018ba95cSWang, Rui Y 459018ba95cSWang, Rui Y if (template[i].np < 2) 460018ba95cSWang, Rui Y continue; 461018ba95cSWang, Rui Y 462018ba95cSWang, Rui Y j++; 463e93acd6fSAndrew Lutomirski memset(result, 0, digest_size); 464018ba95cSWang, Rui Y 465018ba95cSWang, Rui Y ret = -EINVAL; 466018ba95cSWang, Rui Y hash_buff = xbuf[0]; 467018ba95cSWang, Rui Y memcpy(hash_buff, template[i].plaintext, 468018ba95cSWang, Rui Y template[i].tap[0]); 469018ba95cSWang, Rui Y sg_init_one(&sg[0], hash_buff, template[i].tap[0]); 470018ba95cSWang, Rui Y 471018ba95cSWang, Rui Y if (template[i].ksize) { 472018ba95cSWang, Rui Y crypto_ahash_clear_flags(tfm, ~0); 473018ba95cSWang, Rui Y if (template[i].ksize > MAX_KEYLEN) { 474018ba95cSWang, Rui Y pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n", 475018ba95cSWang, Rui Y j, algo, template[i].ksize, MAX_KEYLEN); 476018ba95cSWang, Rui Y ret = -EINVAL; 477018ba95cSWang, Rui Y goto out; 478018ba95cSWang, Rui Y } 479018ba95cSWang, Rui Y memcpy(key, template[i].key, template[i].ksize); 480018ba95cSWang, Rui Y ret = crypto_ahash_setkey(tfm, key, template[i].ksize); 481018ba95cSWang, Rui Y if (ret) { 482018ba95cSWang, Rui Y pr_err("alg: hash: setkey failed on test %d for %s: ret=%d\n", 483018ba95cSWang, Rui Y j, algo, -ret); 484018ba95cSWang, Rui Y goto out; 485018ba95cSWang, Rui Y } 486018ba95cSWang, Rui Y } 487018ba95cSWang, Rui Y 488018ba95cSWang, Rui Y ahash_request_set_crypt(req, sg, result, template[i].tap[0]); 489018ba95cSWang, Rui Y ret = wait_async_op(&tresult, crypto_ahash_init(req)); 490018ba95cSWang, Rui Y if (ret) { 491018ba95cSWang, Rui Y pr_err("alt: hash: init failed on test %d for %s: ret=%d\n", 492018ba95cSWang, Rui Y j, algo, -ret); 493018ba95cSWang, Rui Y goto out; 494018ba95cSWang, Rui Y } 495018ba95cSWang, Rui Y ret = wait_async_op(&tresult, crypto_ahash_update(req)); 496018ba95cSWang, Rui Y if (ret) { 497018ba95cSWang, Rui Y pr_err("alt: hash: update failed on test %d for %s: ret=%d\n", 498018ba95cSWang, Rui Y j, algo, -ret); 499018ba95cSWang, Rui Y goto out; 500018ba95cSWang, Rui Y } 501018ba95cSWang, Rui Y 502018ba95cSWang, Rui Y temp = template[i].tap[0]; 503018ba95cSWang, Rui Y for (k = 1; k < template[i].np; k++) { 504018ba95cSWang, Rui Y ret = ahash_partial_update(&req, tfm, &template[i], 505018ba95cSWang, Rui Y hash_buff, k, temp, &sg[0], algo, result, 506018ba95cSWang, Rui Y &tresult); 507018ba95cSWang, Rui Y if (ret) { 508018ba95cSWang, Rui Y pr_err("hash: partial update failed on test %d for %s: ret=%d\n", 509018ba95cSWang, Rui Y j, algo, -ret); 510018ba95cSWang, Rui Y goto out_noreq; 511018ba95cSWang, Rui Y } 512018ba95cSWang, Rui Y temp += template[i].tap[k]; 513018ba95cSWang, Rui Y } 514018ba95cSWang, Rui Y ret = wait_async_op(&tresult, crypto_ahash_final(req)); 515018ba95cSWang, Rui Y if (ret) { 516018ba95cSWang, Rui Y pr_err("alt: hash: final failed on test %d for %s: ret=%d\n", 517018ba95cSWang, Rui Y j, algo, -ret); 518018ba95cSWang, Rui Y goto out; 519018ba95cSWang, Rui Y } 520018ba95cSWang, Rui Y if (memcmp(result, template[i].digest, 521018ba95cSWang, Rui Y crypto_ahash_digestsize(tfm))) { 522018ba95cSWang, Rui Y pr_err("alg: hash: Partial Test %d failed for %s\n", 523018ba95cSWang, Rui Y j, algo); 524018ba95cSWang, Rui Y hexdump(result, crypto_ahash_digestsize(tfm)); 525018ba95cSWang, Rui Y ret = -EINVAL; 526018ba95cSWang, Rui Y goto out; 527018ba95cSWang, Rui Y } 528018ba95cSWang, Rui Y } 529018ba95cSWang, Rui Y 530da7f033dSHerbert Xu ret = 0; 531da7f033dSHerbert Xu 532da7f033dSHerbert Xu out: 533da7f033dSHerbert Xu ahash_request_free(req); 534da7f033dSHerbert Xu out_noreq: 535f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 536f8b0d4d0SHerbert Xu out_nobuf: 53729b77e5dSHoria Geanta kfree(key); 53829b77e5dSHoria Geanta kfree(result); 539da7f033dSHerbert Xu return ret; 540da7f033dSHerbert Xu } 541da7f033dSHerbert Xu 542b13b1e0cSEric Biggers static int test_hash(struct crypto_ahash *tfm, 543b13b1e0cSEric Biggers const struct hash_testvec *template, 544da5ffe11SJussi Kivilinna unsigned int tcount, bool use_digest) 545da5ffe11SJussi Kivilinna { 546da5ffe11SJussi Kivilinna unsigned int alignmask; 547da5ffe11SJussi Kivilinna int ret; 548da5ffe11SJussi Kivilinna 549da5ffe11SJussi Kivilinna ret = __test_hash(tfm, template, tcount, use_digest, 0); 550da5ffe11SJussi Kivilinna if (ret) 551da5ffe11SJussi Kivilinna return ret; 552da5ffe11SJussi Kivilinna 553da5ffe11SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 554da5ffe11SJussi Kivilinna ret = __test_hash(tfm, template, tcount, use_digest, 1); 555da5ffe11SJussi Kivilinna if (ret) 556da5ffe11SJussi Kivilinna return ret; 557da5ffe11SJussi Kivilinna 558da5ffe11SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 559da5ffe11SJussi Kivilinna if (alignmask) { 560da5ffe11SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 561da5ffe11SJussi Kivilinna ret = __test_hash(tfm, template, tcount, use_digest, 562da5ffe11SJussi Kivilinna alignmask + 1); 563da5ffe11SJussi Kivilinna if (ret) 564da5ffe11SJussi Kivilinna return ret; 565da5ffe11SJussi Kivilinna } 566da5ffe11SJussi Kivilinna 567da5ffe11SJussi Kivilinna return 0; 568da5ffe11SJussi Kivilinna } 569da5ffe11SJussi Kivilinna 570d8a32ac2SJussi Kivilinna static int __test_aead(struct crypto_aead *tfm, int enc, 571b13b1e0cSEric Biggers const struct aead_testvec *template, unsigned int tcount, 57258dcf548SJussi Kivilinna const bool diff_dst, const int align_offset) 573da7f033dSHerbert Xu { 574da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)); 575da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 576f8b0d4d0SHerbert Xu int ret = -ENOMEM; 577da7f033dSHerbert Xu char *q; 578da7f033dSHerbert Xu char *key; 579da7f033dSHerbert Xu struct aead_request *req; 580d8a32ac2SJussi Kivilinna struct scatterlist *sg; 581d8a32ac2SJussi Kivilinna struct scatterlist *sgout; 582d8a32ac2SJussi Kivilinna const char *e, *d; 583da7f033dSHerbert Xu struct tcrypt_result result; 584424a5da6SCristian Stoica unsigned int authsize, iv_len; 585da7f033dSHerbert Xu void *input; 586d8a32ac2SJussi Kivilinna void *output; 587da7f033dSHerbert Xu void *assoc; 5889bac019dSTadeusz Struk char *iv; 589f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 590d8a32ac2SJussi Kivilinna char *xoutbuf[XBUFSIZE]; 591f8b0d4d0SHerbert Xu char *axbuf[XBUFSIZE]; 592f8b0d4d0SHerbert Xu 5939bac019dSTadeusz Struk iv = kzalloc(MAX_IVLEN, GFP_KERNEL); 5949bac019dSTadeusz Struk if (!iv) 5959bac019dSTadeusz Struk return ret; 59629b77e5dSHoria Geanta key = kmalloc(MAX_KEYLEN, GFP_KERNEL); 59729b77e5dSHoria Geanta if (!key) 59829b77e5dSHoria Geanta goto out_noxbuf; 599f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 600f8b0d4d0SHerbert Xu goto out_noxbuf; 601f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(axbuf)) 602f8b0d4d0SHerbert Xu goto out_noaxbuf; 603d8a32ac2SJussi Kivilinna if (diff_dst && testmgr_alloc_buf(xoutbuf)) 604d8a32ac2SJussi Kivilinna goto out_nooutbuf; 605d8a32ac2SJussi Kivilinna 606d8a32ac2SJussi Kivilinna /* avoid "the frame size is larger than 1024 bytes" compiler warning */ 6078a525fcdSHerbert Xu sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 4 : 2), GFP_KERNEL); 608d8a32ac2SJussi Kivilinna if (!sg) 609d8a32ac2SJussi Kivilinna goto out_nosg; 6108a525fcdSHerbert Xu sgout = &sg[16]; 611d8a32ac2SJussi Kivilinna 612d8a32ac2SJussi Kivilinna if (diff_dst) 613d8a32ac2SJussi Kivilinna d = "-ddst"; 614d8a32ac2SJussi Kivilinna else 615d8a32ac2SJussi Kivilinna d = ""; 616d8a32ac2SJussi Kivilinna 617da7f033dSHerbert Xu if (enc == ENCRYPT) 618da7f033dSHerbert Xu e = "encryption"; 619da7f033dSHerbert Xu else 620da7f033dSHerbert Xu e = "decryption"; 621da7f033dSHerbert Xu 622da7f033dSHerbert Xu init_completion(&result.completion); 623da7f033dSHerbert Xu 624da7f033dSHerbert Xu req = aead_request_alloc(tfm, GFP_KERNEL); 625da7f033dSHerbert Xu if (!req) { 626d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to allocate request for %s\n", 627d8a32ac2SJussi Kivilinna d, algo); 628da7f033dSHerbert Xu goto out; 629da7f033dSHerbert Xu } 630da7f033dSHerbert Xu 631da7f033dSHerbert Xu aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 632da7f033dSHerbert Xu tcrypt_complete, &result); 633da7f033dSHerbert Xu 634abfa7f43SJerome Marchand iv_len = crypto_aead_ivsize(tfm); 635abfa7f43SJerome Marchand 636da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 63705b1d338SCristian Stoica if (template[i].np) 63805b1d338SCristian Stoica continue; 63905b1d338SCristian Stoica 640da7f033dSHerbert Xu j++; 641da7f033dSHerbert Xu 64258dcf548SJussi Kivilinna /* some templates have no input data but they will 643da7f033dSHerbert Xu * touch input 644da7f033dSHerbert Xu */ 645da7f033dSHerbert Xu input = xbuf[0]; 64658dcf548SJussi Kivilinna input += align_offset; 647da7f033dSHerbert Xu assoc = axbuf[0]; 648da7f033dSHerbert Xu 649fd57f22aSHerbert Xu ret = -EINVAL; 65058dcf548SJussi Kivilinna if (WARN_ON(align_offset + template[i].ilen > 65158dcf548SJussi Kivilinna PAGE_SIZE || template[i].alen > PAGE_SIZE)) 652fd57f22aSHerbert Xu goto out; 653fd57f22aSHerbert Xu 654da7f033dSHerbert Xu memcpy(input, template[i].input, template[i].ilen); 655da7f033dSHerbert Xu memcpy(assoc, template[i].assoc, template[i].alen); 656da7f033dSHerbert Xu if (template[i].iv) 657424a5da6SCristian Stoica memcpy(iv, template[i].iv, iv_len); 658da7f033dSHerbert Xu else 659424a5da6SCristian Stoica memset(iv, 0, iv_len); 660da7f033dSHerbert Xu 661da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 662da7f033dSHerbert Xu if (template[i].wk) 66305b1d338SCristian Stoica crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 664da7f033dSHerbert Xu 66529b77e5dSHoria Geanta if (template[i].klen > MAX_KEYLEN) { 66629b77e5dSHoria Geanta pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n", 66729b77e5dSHoria Geanta d, j, algo, template[i].klen, 66829b77e5dSHoria Geanta MAX_KEYLEN); 66929b77e5dSHoria Geanta ret = -EINVAL; 67029b77e5dSHoria Geanta goto out; 67129b77e5dSHoria Geanta } 67229b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].klen); 673da7f033dSHerbert Xu 67405b1d338SCristian Stoica ret = crypto_aead_setkey(tfm, key, template[i].klen); 6750fae0c1eSYanjiang Jin if (template[i].fail == !ret) { 676d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n", 677d8a32ac2SJussi Kivilinna d, j, algo, crypto_aead_get_flags(tfm)); 678da7f033dSHerbert Xu goto out; 679da7f033dSHerbert Xu } else if (ret) 680da7f033dSHerbert Xu continue; 681da7f033dSHerbert Xu 682da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 683da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 684da7f033dSHerbert Xu if (ret) { 685d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n", 686d8a32ac2SJussi Kivilinna d, authsize, j, algo); 687da7f033dSHerbert Xu goto out; 688da7f033dSHerbert Xu } 689da7f033dSHerbert Xu 6908a525fcdSHerbert Xu k = !!template[i].alen; 6918a525fcdSHerbert Xu sg_init_table(sg, k + 1); 6928a525fcdSHerbert Xu sg_set_buf(&sg[0], assoc, template[i].alen); 6938a525fcdSHerbert Xu sg_set_buf(&sg[k], input, 69405b1d338SCristian Stoica template[i].ilen + (enc ? authsize : 0)); 695d8a32ac2SJussi Kivilinna output = input; 696d8a32ac2SJussi Kivilinna 6978a525fcdSHerbert Xu if (diff_dst) { 6988a525fcdSHerbert Xu sg_init_table(sgout, k + 1); 6998a525fcdSHerbert Xu sg_set_buf(&sgout[0], assoc, template[i].alen); 7008a525fcdSHerbert Xu 7018a525fcdSHerbert Xu output = xoutbuf[0]; 7028a525fcdSHerbert Xu output += align_offset; 7038a525fcdSHerbert Xu sg_set_buf(&sgout[k], output, 7048a525fcdSHerbert Xu template[i].rlen + (enc ? 0 : authsize)); 7058a525fcdSHerbert Xu } 706da7f033dSHerbert Xu 707d8a32ac2SJussi Kivilinna aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 708da7f033dSHerbert Xu template[i].ilen, iv); 709da7f033dSHerbert Xu 7108a525fcdSHerbert Xu aead_request_set_ad(req, template[i].alen); 711da7f033dSHerbert Xu 71205b1d338SCristian Stoica ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req); 713da7f033dSHerbert Xu 714da7f033dSHerbert Xu switch (ret) { 715da7f033dSHerbert Xu case 0: 716e44a1b44SJarod Wilson if (template[i].novrfy) { 717e44a1b44SJarod Wilson /* verification was supposed to fail */ 718d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n", 719d8a32ac2SJussi Kivilinna d, e, j, algo); 720e44a1b44SJarod Wilson /* so really, we got a bad message */ 721e44a1b44SJarod Wilson ret = -EBADMSG; 722e44a1b44SJarod Wilson goto out; 723e44a1b44SJarod Wilson } 724da7f033dSHerbert Xu break; 725da7f033dSHerbert Xu case -EINPROGRESS: 726da7f033dSHerbert Xu case -EBUSY: 7278a45ac12SRabin Vincent wait_for_completion(&result.completion); 72816735d02SWolfram Sang reinit_completion(&result.completion); 7298a45ac12SRabin Vincent ret = result.err; 7308a45ac12SRabin Vincent if (!ret) 731da7f033dSHerbert Xu break; 732e44a1b44SJarod Wilson case -EBADMSG: 733e44a1b44SJarod Wilson if (template[i].novrfy) 734e44a1b44SJarod Wilson /* verification failure was expected */ 735e44a1b44SJarod Wilson continue; 736da7f033dSHerbert Xu /* fall through */ 737da7f033dSHerbert Xu default: 738d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n", 739d8a32ac2SJussi Kivilinna d, e, j, algo, -ret); 740da7f033dSHerbert Xu goto out; 741da7f033dSHerbert Xu } 742da7f033dSHerbert Xu 743d8a32ac2SJussi Kivilinna q = output; 744da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 745d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Test %d failed on %s for %s\n", 746d8a32ac2SJussi Kivilinna d, j, e, algo); 747da7f033dSHerbert Xu hexdump(q, template[i].rlen); 748da7f033dSHerbert Xu ret = -EINVAL; 749da7f033dSHerbert Xu goto out; 750da7f033dSHerbert Xu } 751da7f033dSHerbert Xu } 752da7f033dSHerbert Xu 753da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 75458dcf548SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 75558dcf548SJussi Kivilinna if (align_offset != 0) 75658dcf548SJussi Kivilinna break; 75758dcf548SJussi Kivilinna 75805b1d338SCristian Stoica if (!template[i].np) 75905b1d338SCristian Stoica continue; 76005b1d338SCristian Stoica 761da7f033dSHerbert Xu j++; 762da7f033dSHerbert Xu 763da7f033dSHerbert Xu if (template[i].iv) 764abfa7f43SJerome Marchand memcpy(iv, template[i].iv, iv_len); 765da7f033dSHerbert Xu else 766da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 767da7f033dSHerbert Xu 768da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 769da7f033dSHerbert Xu if (template[i].wk) 77005b1d338SCristian Stoica crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 77129b77e5dSHoria Geanta if (template[i].klen > MAX_KEYLEN) { 77229b77e5dSHoria Geanta pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n", 77305b1d338SCristian Stoica d, j, algo, template[i].klen, MAX_KEYLEN); 77429b77e5dSHoria Geanta ret = -EINVAL; 77529b77e5dSHoria Geanta goto out; 77629b77e5dSHoria Geanta } 77729b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].klen); 778da7f033dSHerbert Xu 779da7f033dSHerbert Xu ret = crypto_aead_setkey(tfm, key, template[i].klen); 7800fae0c1eSYanjiang Jin if (template[i].fail == !ret) { 781d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n", 782d8a32ac2SJussi Kivilinna d, j, algo, crypto_aead_get_flags(tfm)); 783da7f033dSHerbert Xu goto out; 784da7f033dSHerbert Xu } else if (ret) 785da7f033dSHerbert Xu continue; 786da7f033dSHerbert Xu 787da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 788da7f033dSHerbert Xu 789da7f033dSHerbert Xu ret = -EINVAL; 7908a525fcdSHerbert Xu sg_init_table(sg, template[i].anp + template[i].np); 791d8a32ac2SJussi Kivilinna if (diff_dst) 7928a525fcdSHerbert Xu sg_init_table(sgout, template[i].anp + template[i].np); 7938a525fcdSHerbert Xu 7948a525fcdSHerbert Xu ret = -EINVAL; 7958a525fcdSHerbert Xu for (k = 0, temp = 0; k < template[i].anp; k++) { 7968a525fcdSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 7978a525fcdSHerbert Xu template[i].atap[k] > PAGE_SIZE)) 7988a525fcdSHerbert Xu goto out; 7998a525fcdSHerbert Xu sg_set_buf(&sg[k], 8008a525fcdSHerbert Xu memcpy(axbuf[IDX[k] >> PAGE_SHIFT] + 8018a525fcdSHerbert Xu offset_in_page(IDX[k]), 8028a525fcdSHerbert Xu template[i].assoc + temp, 8038a525fcdSHerbert Xu template[i].atap[k]), 8048a525fcdSHerbert Xu template[i].atap[k]); 8058a525fcdSHerbert Xu if (diff_dst) 8068a525fcdSHerbert Xu sg_set_buf(&sgout[k], 8078a525fcdSHerbert Xu axbuf[IDX[k] >> PAGE_SHIFT] + 8088a525fcdSHerbert Xu offset_in_page(IDX[k]), 8098a525fcdSHerbert Xu template[i].atap[k]); 8108a525fcdSHerbert Xu temp += template[i].atap[k]; 8118a525fcdSHerbert Xu } 8128a525fcdSHerbert Xu 813da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 814da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 815da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 816da7f033dSHerbert Xu goto out; 817da7f033dSHerbert Xu 81805b1d338SCristian Stoica q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]); 81905b1d338SCristian Stoica memcpy(q, template[i].input + temp, template[i].tap[k]); 8208a525fcdSHerbert Xu sg_set_buf(&sg[template[i].anp + k], 8218a525fcdSHerbert Xu q, template[i].tap[k]); 822d8a32ac2SJussi Kivilinna 823d8a32ac2SJussi Kivilinna if (diff_dst) { 824d8a32ac2SJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 825d8a32ac2SJussi Kivilinna offset_in_page(IDX[k]); 826d8a32ac2SJussi Kivilinna 827d8a32ac2SJussi Kivilinna memset(q, 0, template[i].tap[k]); 828d8a32ac2SJussi Kivilinna 8298a525fcdSHerbert Xu sg_set_buf(&sgout[template[i].anp + k], 8308a525fcdSHerbert Xu q, template[i].tap[k]); 831d8a32ac2SJussi Kivilinna } 832d8a32ac2SJussi Kivilinna 8338ec25c51SHoria Geanta n = template[i].tap[k]; 8348ec25c51SHoria Geanta if (k == template[i].np - 1 && enc) 8358ec25c51SHoria Geanta n += authsize; 8368ec25c51SHoria Geanta if (offset_in_page(q) + n < PAGE_SIZE) 8378ec25c51SHoria Geanta q[n] = 0; 8388ec25c51SHoria Geanta 839da7f033dSHerbert Xu temp += template[i].tap[k]; 840da7f033dSHerbert Xu } 841da7f033dSHerbert Xu 842da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 843da7f033dSHerbert Xu if (ret) { 844d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n", 845d8a32ac2SJussi Kivilinna d, authsize, j, algo); 846da7f033dSHerbert Xu goto out; 847da7f033dSHerbert Xu } 848da7f033dSHerbert Xu 849da7f033dSHerbert Xu if (enc) { 8508a525fcdSHerbert Xu if (WARN_ON(sg[template[i].anp + k - 1].offset + 8518a525fcdSHerbert Xu sg[template[i].anp + k - 1].length + 8528a525fcdSHerbert Xu authsize > PAGE_SIZE)) { 853da7f033dSHerbert Xu ret = -EINVAL; 854da7f033dSHerbert Xu goto out; 855da7f033dSHerbert Xu } 856da7f033dSHerbert Xu 857d8a32ac2SJussi Kivilinna if (diff_dst) 8588a525fcdSHerbert Xu sgout[template[i].anp + k - 1].length += 8598a525fcdSHerbert Xu authsize; 8608a525fcdSHerbert Xu sg[template[i].anp + k - 1].length += authsize; 861da7f033dSHerbert Xu } 862da7f033dSHerbert Xu 863d8a32ac2SJussi Kivilinna aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 864da7f033dSHerbert Xu template[i].ilen, 865da7f033dSHerbert Xu iv); 866da7f033dSHerbert Xu 8678a525fcdSHerbert Xu aead_request_set_ad(req, template[i].alen); 868da7f033dSHerbert Xu 86905b1d338SCristian Stoica ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req); 870da7f033dSHerbert Xu 871da7f033dSHerbert Xu switch (ret) { 872da7f033dSHerbert Xu case 0: 873e44a1b44SJarod Wilson if (template[i].novrfy) { 874e44a1b44SJarod Wilson /* verification was supposed to fail */ 875d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n", 876d8a32ac2SJussi Kivilinna d, e, j, algo); 877e44a1b44SJarod Wilson /* so really, we got a bad message */ 878e44a1b44SJarod Wilson ret = -EBADMSG; 879e44a1b44SJarod Wilson goto out; 880e44a1b44SJarod Wilson } 881da7f033dSHerbert Xu break; 882da7f033dSHerbert Xu case -EINPROGRESS: 883da7f033dSHerbert Xu case -EBUSY: 8848a45ac12SRabin Vincent wait_for_completion(&result.completion); 88516735d02SWolfram Sang reinit_completion(&result.completion); 8868a45ac12SRabin Vincent ret = result.err; 8878a45ac12SRabin Vincent if (!ret) 888da7f033dSHerbert Xu break; 889e44a1b44SJarod Wilson case -EBADMSG: 890e44a1b44SJarod Wilson if (template[i].novrfy) 891e44a1b44SJarod Wilson /* verification failure was expected */ 892e44a1b44SJarod Wilson continue; 893da7f033dSHerbert Xu /* fall through */ 894da7f033dSHerbert Xu default: 895d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n", 896d8a32ac2SJussi Kivilinna d, e, j, algo, -ret); 897da7f033dSHerbert Xu goto out; 898da7f033dSHerbert Xu } 899da7f033dSHerbert Xu 900da7f033dSHerbert Xu ret = -EINVAL; 901da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 902d8a32ac2SJussi Kivilinna if (diff_dst) 903d8a32ac2SJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 904d8a32ac2SJussi Kivilinna offset_in_page(IDX[k]); 905d8a32ac2SJussi Kivilinna else 906da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 907da7f033dSHerbert Xu offset_in_page(IDX[k]); 908da7f033dSHerbert Xu 909da7f033dSHerbert Xu n = template[i].tap[k]; 910da7f033dSHerbert Xu if (k == template[i].np - 1) 911da7f033dSHerbert Xu n += enc ? authsize : -authsize; 912da7f033dSHerbert Xu 913da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, n)) { 914d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n", 915d8a32ac2SJussi Kivilinna d, j, e, k, algo); 916da7f033dSHerbert Xu hexdump(q, n); 917da7f033dSHerbert Xu goto out; 918da7f033dSHerbert Xu } 919da7f033dSHerbert Xu 920da7f033dSHerbert Xu q += n; 921da7f033dSHerbert Xu if (k == template[i].np - 1 && !enc) { 922d8a32ac2SJussi Kivilinna if (!diff_dst && 923d8a32ac2SJussi Kivilinna memcmp(q, template[i].input + 924da7f033dSHerbert Xu temp + n, authsize)) 925da7f033dSHerbert Xu n = authsize; 926da7f033dSHerbert Xu else 927da7f033dSHerbert Xu n = 0; 928da7f033dSHerbert Xu } else { 92905b1d338SCristian Stoica for (n = 0; offset_in_page(q + n) && q[n]; n++) 930da7f033dSHerbert Xu ; 931da7f033dSHerbert Xu } 932da7f033dSHerbert Xu if (n) { 933d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n", 934d8a32ac2SJussi Kivilinna d, j, e, k, algo, n); 935da7f033dSHerbert Xu hexdump(q, n); 936da7f033dSHerbert Xu goto out; 937da7f033dSHerbert Xu } 938da7f033dSHerbert Xu 939da7f033dSHerbert Xu temp += template[i].tap[k]; 940da7f033dSHerbert Xu } 941da7f033dSHerbert Xu } 942da7f033dSHerbert Xu 943da7f033dSHerbert Xu ret = 0; 944da7f033dSHerbert Xu 945da7f033dSHerbert Xu out: 946da7f033dSHerbert Xu aead_request_free(req); 947d8a32ac2SJussi Kivilinna kfree(sg); 948d8a32ac2SJussi Kivilinna out_nosg: 949d8a32ac2SJussi Kivilinna if (diff_dst) 950d8a32ac2SJussi Kivilinna testmgr_free_buf(xoutbuf); 951d8a32ac2SJussi Kivilinna out_nooutbuf: 952f8b0d4d0SHerbert Xu testmgr_free_buf(axbuf); 953f8b0d4d0SHerbert Xu out_noaxbuf: 954f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 955f8b0d4d0SHerbert Xu out_noxbuf: 95629b77e5dSHoria Geanta kfree(key); 9579bac019dSTadeusz Struk kfree(iv); 958da7f033dSHerbert Xu return ret; 959da7f033dSHerbert Xu } 960da7f033dSHerbert Xu 961d8a32ac2SJussi Kivilinna static int test_aead(struct crypto_aead *tfm, int enc, 962b13b1e0cSEric Biggers const struct aead_testvec *template, unsigned int tcount) 963d8a32ac2SJussi Kivilinna { 96458dcf548SJussi Kivilinna unsigned int alignmask; 965d8a32ac2SJussi Kivilinna int ret; 966d8a32ac2SJussi Kivilinna 967d8a32ac2SJussi Kivilinna /* test 'dst == src' case */ 96858dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, false, 0); 969d8a32ac2SJussi Kivilinna if (ret) 970d8a32ac2SJussi Kivilinna return ret; 971d8a32ac2SJussi Kivilinna 972d8a32ac2SJussi Kivilinna /* test 'dst != src' case */ 97358dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 0); 97458dcf548SJussi Kivilinna if (ret) 97558dcf548SJussi Kivilinna return ret; 97658dcf548SJussi Kivilinna 97758dcf548SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 97858dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 1); 97958dcf548SJussi Kivilinna if (ret) 98058dcf548SJussi Kivilinna return ret; 98158dcf548SJussi Kivilinna 98258dcf548SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 98358dcf548SJussi Kivilinna if (alignmask) { 98458dcf548SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 98558dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 98658dcf548SJussi Kivilinna alignmask + 1); 98758dcf548SJussi Kivilinna if (ret) 98858dcf548SJussi Kivilinna return ret; 98958dcf548SJussi Kivilinna } 99058dcf548SJussi Kivilinna 99158dcf548SJussi Kivilinna return 0; 992d8a32ac2SJussi Kivilinna } 993d8a32ac2SJussi Kivilinna 9941aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc, 995b13b1e0cSEric Biggers const struct cipher_testvec *template, 996b13b1e0cSEric Biggers unsigned int tcount) 9971aa4ecd9SHerbert Xu { 9981aa4ecd9SHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm)); 9991aa4ecd9SHerbert Xu unsigned int i, j, k; 10001aa4ecd9SHerbert Xu char *q; 10011aa4ecd9SHerbert Xu const char *e; 10021aa4ecd9SHerbert Xu void *data; 1003f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 1004f8b0d4d0SHerbert Xu int ret = -ENOMEM; 1005f8b0d4d0SHerbert Xu 1006f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 1007f8b0d4d0SHerbert Xu goto out_nobuf; 10081aa4ecd9SHerbert Xu 10091aa4ecd9SHerbert Xu if (enc == ENCRYPT) 10101aa4ecd9SHerbert Xu e = "encryption"; 10111aa4ecd9SHerbert Xu else 10121aa4ecd9SHerbert Xu e = "decryption"; 10131aa4ecd9SHerbert Xu 10141aa4ecd9SHerbert Xu j = 0; 10151aa4ecd9SHerbert Xu for (i = 0; i < tcount; i++) { 10161aa4ecd9SHerbert Xu if (template[i].np) 10171aa4ecd9SHerbert Xu continue; 10181aa4ecd9SHerbert Xu 101910faa8c0SStephan Mueller if (fips_enabled && template[i].fips_skip) 102010faa8c0SStephan Mueller continue; 102110faa8c0SStephan Mueller 10221aa4ecd9SHerbert Xu j++; 10231aa4ecd9SHerbert Xu 1024fd57f22aSHerbert Xu ret = -EINVAL; 1025fd57f22aSHerbert Xu if (WARN_ON(template[i].ilen > PAGE_SIZE)) 1026fd57f22aSHerbert Xu goto out; 1027fd57f22aSHerbert Xu 10281aa4ecd9SHerbert Xu data = xbuf[0]; 10291aa4ecd9SHerbert Xu memcpy(data, template[i].input, template[i].ilen); 10301aa4ecd9SHerbert Xu 10311aa4ecd9SHerbert Xu crypto_cipher_clear_flags(tfm, ~0); 10321aa4ecd9SHerbert Xu if (template[i].wk) 10331aa4ecd9SHerbert Xu crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 10341aa4ecd9SHerbert Xu 10351aa4ecd9SHerbert Xu ret = crypto_cipher_setkey(tfm, template[i].key, 10361aa4ecd9SHerbert Xu template[i].klen); 10370fae0c1eSYanjiang Jin if (template[i].fail == !ret) { 10381aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: setkey failed " 10391aa4ecd9SHerbert Xu "on test %d for %s: flags=%x\n", j, 10401aa4ecd9SHerbert Xu algo, crypto_cipher_get_flags(tfm)); 10411aa4ecd9SHerbert Xu goto out; 10421aa4ecd9SHerbert Xu } else if (ret) 10431aa4ecd9SHerbert Xu continue; 10441aa4ecd9SHerbert Xu 10451aa4ecd9SHerbert Xu for (k = 0; k < template[i].ilen; 10461aa4ecd9SHerbert Xu k += crypto_cipher_blocksize(tfm)) { 10471aa4ecd9SHerbert Xu if (enc) 10481aa4ecd9SHerbert Xu crypto_cipher_encrypt_one(tfm, data + k, 10491aa4ecd9SHerbert Xu data + k); 10501aa4ecd9SHerbert Xu else 10511aa4ecd9SHerbert Xu crypto_cipher_decrypt_one(tfm, data + k, 10521aa4ecd9SHerbert Xu data + k); 10531aa4ecd9SHerbert Xu } 10541aa4ecd9SHerbert Xu 10551aa4ecd9SHerbert Xu q = data; 10561aa4ecd9SHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 10571aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: Test %d failed " 10581aa4ecd9SHerbert Xu "on %s for %s\n", j, e, algo); 10591aa4ecd9SHerbert Xu hexdump(q, template[i].rlen); 10601aa4ecd9SHerbert Xu ret = -EINVAL; 10611aa4ecd9SHerbert Xu goto out; 10621aa4ecd9SHerbert Xu } 10631aa4ecd9SHerbert Xu } 10641aa4ecd9SHerbert Xu 10651aa4ecd9SHerbert Xu ret = 0; 10661aa4ecd9SHerbert Xu 10671aa4ecd9SHerbert Xu out: 1068f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 1069f8b0d4d0SHerbert Xu out_nobuf: 10701aa4ecd9SHerbert Xu return ret; 10711aa4ecd9SHerbert Xu } 10721aa4ecd9SHerbert Xu 107312773d93SHerbert Xu static int __test_skcipher(struct crypto_skcipher *tfm, int enc, 1074b13b1e0cSEric Biggers const struct cipher_testvec *template, 1075b13b1e0cSEric Biggers unsigned int tcount, 10763a338f20SJussi Kivilinna const bool diff_dst, const int align_offset) 1077da7f033dSHerbert Xu { 1078da7f033dSHerbert Xu const char *algo = 107912773d93SHerbert Xu crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)); 1080da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 1081da7f033dSHerbert Xu char *q; 108212773d93SHerbert Xu struct skcipher_request *req; 1083da7f033dSHerbert Xu struct scatterlist sg[8]; 108408d6af8cSJussi Kivilinna struct scatterlist sgout[8]; 108508d6af8cSJussi Kivilinna const char *e, *d; 1086da7f033dSHerbert Xu struct tcrypt_result result; 1087da7f033dSHerbert Xu void *data; 1088da7f033dSHerbert Xu char iv[MAX_IVLEN]; 1089f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 109008d6af8cSJussi Kivilinna char *xoutbuf[XBUFSIZE]; 1091f8b0d4d0SHerbert Xu int ret = -ENOMEM; 109284cba178SAndrey Ryabinin unsigned int ivsize = crypto_skcipher_ivsize(tfm); 1093f8b0d4d0SHerbert Xu 1094f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 1095f8b0d4d0SHerbert Xu goto out_nobuf; 1096da7f033dSHerbert Xu 109708d6af8cSJussi Kivilinna if (diff_dst && testmgr_alloc_buf(xoutbuf)) 109808d6af8cSJussi Kivilinna goto out_nooutbuf; 109908d6af8cSJussi Kivilinna 110008d6af8cSJussi Kivilinna if (diff_dst) 110108d6af8cSJussi Kivilinna d = "-ddst"; 110208d6af8cSJussi Kivilinna else 110308d6af8cSJussi Kivilinna d = ""; 110408d6af8cSJussi Kivilinna 1105da7f033dSHerbert Xu if (enc == ENCRYPT) 1106da7f033dSHerbert Xu e = "encryption"; 1107da7f033dSHerbert Xu else 1108da7f033dSHerbert Xu e = "decryption"; 1109da7f033dSHerbert Xu 1110da7f033dSHerbert Xu init_completion(&result.completion); 1111da7f033dSHerbert Xu 111212773d93SHerbert Xu req = skcipher_request_alloc(tfm, GFP_KERNEL); 1113da7f033dSHerbert Xu if (!req) { 111408d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Failed to allocate request for %s\n", 111508d6af8cSJussi Kivilinna d, algo); 1116da7f033dSHerbert Xu goto out; 1117da7f033dSHerbert Xu } 1118da7f033dSHerbert Xu 111912773d93SHerbert Xu skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 1120da7f033dSHerbert Xu tcrypt_complete, &result); 1121da7f033dSHerbert Xu 1122da7f033dSHerbert Xu j = 0; 1123da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 1124bbb9a7ddSCristian Stoica if (template[i].np && !template[i].also_non_np) 1125bbb9a7ddSCristian Stoica continue; 1126bbb9a7ddSCristian Stoica 112710faa8c0SStephan Mueller if (fips_enabled && template[i].fips_skip) 112810faa8c0SStephan Mueller continue; 112910faa8c0SStephan Mueller 1130da7f033dSHerbert Xu if (template[i].iv) 113184cba178SAndrey Ryabinin memcpy(iv, template[i].iv, ivsize); 1132da7f033dSHerbert Xu else 1133da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 1134da7f033dSHerbert Xu 1135da7f033dSHerbert Xu j++; 1136fd57f22aSHerbert Xu ret = -EINVAL; 1137a1aa44a2SCristian Stoica if (WARN_ON(align_offset + template[i].ilen > PAGE_SIZE)) 1138fd57f22aSHerbert Xu goto out; 1139fd57f22aSHerbert Xu 1140da7f033dSHerbert Xu data = xbuf[0]; 11413a338f20SJussi Kivilinna data += align_offset; 1142da7f033dSHerbert Xu memcpy(data, template[i].input, template[i].ilen); 1143da7f033dSHerbert Xu 114412773d93SHerbert Xu crypto_skcipher_clear_flags(tfm, ~0); 1145da7f033dSHerbert Xu if (template[i].wk) 114612773d93SHerbert Xu crypto_skcipher_set_flags(tfm, 114712773d93SHerbert Xu CRYPTO_TFM_REQ_WEAK_KEY); 1148da7f033dSHerbert Xu 114912773d93SHerbert Xu ret = crypto_skcipher_setkey(tfm, template[i].key, 1150da7f033dSHerbert Xu template[i].klen); 11510fae0c1eSYanjiang Jin if (template[i].fail == !ret) { 115208d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n", 115312773d93SHerbert Xu d, j, algo, crypto_skcipher_get_flags(tfm)); 1154da7f033dSHerbert Xu goto out; 1155da7f033dSHerbert Xu } else if (ret) 1156da7f033dSHerbert Xu continue; 1157da7f033dSHerbert Xu 1158da7f033dSHerbert Xu sg_init_one(&sg[0], data, template[i].ilen); 115908d6af8cSJussi Kivilinna if (diff_dst) { 116008d6af8cSJussi Kivilinna data = xoutbuf[0]; 11613a338f20SJussi Kivilinna data += align_offset; 116208d6af8cSJussi Kivilinna sg_init_one(&sgout[0], data, template[i].ilen); 116308d6af8cSJussi Kivilinna } 1164da7f033dSHerbert Xu 116512773d93SHerbert Xu skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 1166da7f033dSHerbert Xu template[i].ilen, iv); 116712773d93SHerbert Xu ret = enc ? crypto_skcipher_encrypt(req) : 116812773d93SHerbert Xu crypto_skcipher_decrypt(req); 1169da7f033dSHerbert Xu 1170da7f033dSHerbert Xu switch (ret) { 1171da7f033dSHerbert Xu case 0: 1172da7f033dSHerbert Xu break; 1173da7f033dSHerbert Xu case -EINPROGRESS: 1174da7f033dSHerbert Xu case -EBUSY: 11758a45ac12SRabin Vincent wait_for_completion(&result.completion); 117616735d02SWolfram Sang reinit_completion(&result.completion); 11778a45ac12SRabin Vincent ret = result.err; 11788a45ac12SRabin Vincent if (!ret) 1179da7f033dSHerbert Xu break; 1180da7f033dSHerbert Xu /* fall through */ 1181da7f033dSHerbert Xu default: 118208d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n", 118308d6af8cSJussi Kivilinna d, e, j, algo, -ret); 1184da7f033dSHerbert Xu goto out; 1185da7f033dSHerbert Xu } 1186da7f033dSHerbert Xu 1187da7f033dSHerbert Xu q = data; 1188da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 11898a826a34SBoris BREZILLON pr_err("alg: skcipher%s: Test %d failed (invalid result) on %s for %s\n", 119008d6af8cSJussi Kivilinna d, j, e, algo); 1191da7f033dSHerbert Xu hexdump(q, template[i].rlen); 1192da7f033dSHerbert Xu ret = -EINVAL; 1193da7f033dSHerbert Xu goto out; 1194da7f033dSHerbert Xu } 11958a826a34SBoris BREZILLON 11968a826a34SBoris BREZILLON if (template[i].iv_out && 11978a826a34SBoris BREZILLON memcmp(iv, template[i].iv_out, 11988a826a34SBoris BREZILLON crypto_skcipher_ivsize(tfm))) { 11998a826a34SBoris BREZILLON pr_err("alg: skcipher%s: Test %d failed (invalid output IV) on %s for %s\n", 12008a826a34SBoris BREZILLON d, j, e, algo); 12018a826a34SBoris BREZILLON hexdump(iv, crypto_skcipher_ivsize(tfm)); 12028a826a34SBoris BREZILLON ret = -EINVAL; 12038a826a34SBoris BREZILLON goto out; 12048a826a34SBoris BREZILLON } 1205da7f033dSHerbert Xu } 1206da7f033dSHerbert Xu 1207da7f033dSHerbert Xu j = 0; 1208da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 12093a338f20SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 12103a338f20SJussi Kivilinna if (align_offset != 0) 12113a338f20SJussi Kivilinna break; 1212da7f033dSHerbert Xu 1213bbb9a7ddSCristian Stoica if (!template[i].np) 1214bbb9a7ddSCristian Stoica continue; 1215bbb9a7ddSCristian Stoica 121610faa8c0SStephan Mueller if (fips_enabled && template[i].fips_skip) 121710faa8c0SStephan Mueller continue; 121810faa8c0SStephan Mueller 1219da7f033dSHerbert Xu if (template[i].iv) 122084cba178SAndrey Ryabinin memcpy(iv, template[i].iv, ivsize); 1221da7f033dSHerbert Xu else 1222da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 1223da7f033dSHerbert Xu 1224da7f033dSHerbert Xu j++; 122512773d93SHerbert Xu crypto_skcipher_clear_flags(tfm, ~0); 1226da7f033dSHerbert Xu if (template[i].wk) 122712773d93SHerbert Xu crypto_skcipher_set_flags(tfm, 122812773d93SHerbert Xu CRYPTO_TFM_REQ_WEAK_KEY); 1229da7f033dSHerbert Xu 123012773d93SHerbert Xu ret = crypto_skcipher_setkey(tfm, template[i].key, 1231da7f033dSHerbert Xu template[i].klen); 12320fae0c1eSYanjiang Jin if (template[i].fail == !ret) { 123308d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n", 123412773d93SHerbert Xu d, j, algo, crypto_skcipher_get_flags(tfm)); 1235da7f033dSHerbert Xu goto out; 1236da7f033dSHerbert Xu } else if (ret) 1237da7f033dSHerbert Xu continue; 1238da7f033dSHerbert Xu 1239da7f033dSHerbert Xu temp = 0; 1240da7f033dSHerbert Xu ret = -EINVAL; 1241da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 124208d6af8cSJussi Kivilinna if (diff_dst) 124308d6af8cSJussi Kivilinna sg_init_table(sgout, template[i].np); 1244da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 1245da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 1246da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 1247da7f033dSHerbert Xu goto out; 1248da7f033dSHerbert Xu 1249a1aa44a2SCristian Stoica q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]); 1250da7f033dSHerbert Xu 1251a1aa44a2SCristian Stoica memcpy(q, template[i].input + temp, template[i].tap[k]); 1252da7f033dSHerbert Xu 1253a1aa44a2SCristian Stoica if (offset_in_page(q) + template[i].tap[k] < PAGE_SIZE) 1254da7f033dSHerbert Xu q[template[i].tap[k]] = 0; 1255da7f033dSHerbert Xu 1256da7f033dSHerbert Xu sg_set_buf(&sg[k], q, template[i].tap[k]); 125708d6af8cSJussi Kivilinna if (diff_dst) { 125808d6af8cSJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 125908d6af8cSJussi Kivilinna offset_in_page(IDX[k]); 126008d6af8cSJussi Kivilinna 1261a1aa44a2SCristian Stoica sg_set_buf(&sgout[k], q, template[i].tap[k]); 126208d6af8cSJussi Kivilinna 126308d6af8cSJussi Kivilinna memset(q, 0, template[i].tap[k]); 126408d6af8cSJussi Kivilinna if (offset_in_page(q) + 126508d6af8cSJussi Kivilinna template[i].tap[k] < PAGE_SIZE) 126608d6af8cSJussi Kivilinna q[template[i].tap[k]] = 0; 126708d6af8cSJussi Kivilinna } 1268da7f033dSHerbert Xu 1269da7f033dSHerbert Xu temp += template[i].tap[k]; 1270da7f033dSHerbert Xu } 1271da7f033dSHerbert Xu 127212773d93SHerbert Xu skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 1273da7f033dSHerbert Xu template[i].ilen, iv); 1274da7f033dSHerbert Xu 127512773d93SHerbert Xu ret = enc ? crypto_skcipher_encrypt(req) : 127612773d93SHerbert Xu crypto_skcipher_decrypt(req); 1277da7f033dSHerbert Xu 1278da7f033dSHerbert Xu switch (ret) { 1279da7f033dSHerbert Xu case 0: 1280da7f033dSHerbert Xu break; 1281da7f033dSHerbert Xu case -EINPROGRESS: 1282da7f033dSHerbert Xu case -EBUSY: 12838a45ac12SRabin Vincent wait_for_completion(&result.completion); 128416735d02SWolfram Sang reinit_completion(&result.completion); 12858a45ac12SRabin Vincent ret = result.err; 12868a45ac12SRabin Vincent if (!ret) 1287da7f033dSHerbert Xu break; 1288da7f033dSHerbert Xu /* fall through */ 1289da7f033dSHerbert Xu default: 129008d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n", 129108d6af8cSJussi Kivilinna d, e, j, algo, -ret); 1292da7f033dSHerbert Xu goto out; 1293da7f033dSHerbert Xu } 1294da7f033dSHerbert Xu 1295da7f033dSHerbert Xu temp = 0; 1296da7f033dSHerbert Xu ret = -EINVAL; 1297da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 129808d6af8cSJussi Kivilinna if (diff_dst) 129908d6af8cSJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 130008d6af8cSJussi Kivilinna offset_in_page(IDX[k]); 130108d6af8cSJussi Kivilinna else 1302da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 1303da7f033dSHerbert Xu offset_in_page(IDX[k]); 1304da7f033dSHerbert Xu 1305da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, 1306da7f033dSHerbert Xu template[i].tap[k])) { 130708d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n", 130808d6af8cSJussi Kivilinna d, j, e, k, algo); 1309da7f033dSHerbert Xu hexdump(q, template[i].tap[k]); 1310da7f033dSHerbert Xu goto out; 1311da7f033dSHerbert Xu } 1312da7f033dSHerbert Xu 1313da7f033dSHerbert Xu q += template[i].tap[k]; 1314da7f033dSHerbert Xu for (n = 0; offset_in_page(q + n) && q[n]; n++) 1315da7f033dSHerbert Xu ; 1316da7f033dSHerbert Xu if (n) { 131708d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n", 131808d6af8cSJussi Kivilinna d, j, e, k, algo, n); 1319da7f033dSHerbert Xu hexdump(q, n); 1320da7f033dSHerbert Xu goto out; 1321da7f033dSHerbert Xu } 1322da7f033dSHerbert Xu temp += template[i].tap[k]; 1323da7f033dSHerbert Xu } 1324da7f033dSHerbert Xu } 1325da7f033dSHerbert Xu 1326da7f033dSHerbert Xu ret = 0; 1327da7f033dSHerbert Xu 1328da7f033dSHerbert Xu out: 132912773d93SHerbert Xu skcipher_request_free(req); 133008d6af8cSJussi Kivilinna if (diff_dst) 133108d6af8cSJussi Kivilinna testmgr_free_buf(xoutbuf); 133208d6af8cSJussi Kivilinna out_nooutbuf: 1333f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 1334f8b0d4d0SHerbert Xu out_nobuf: 1335da7f033dSHerbert Xu return ret; 1336da7f033dSHerbert Xu } 1337da7f033dSHerbert Xu 133812773d93SHerbert Xu static int test_skcipher(struct crypto_skcipher *tfm, int enc, 1339b13b1e0cSEric Biggers const struct cipher_testvec *template, 1340b13b1e0cSEric Biggers unsigned int tcount) 134108d6af8cSJussi Kivilinna { 13423a338f20SJussi Kivilinna unsigned int alignmask; 134308d6af8cSJussi Kivilinna int ret; 134408d6af8cSJussi Kivilinna 134508d6af8cSJussi Kivilinna /* test 'dst == src' case */ 13463a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, false, 0); 134708d6af8cSJussi Kivilinna if (ret) 134808d6af8cSJussi Kivilinna return ret; 134908d6af8cSJussi Kivilinna 135008d6af8cSJussi Kivilinna /* test 'dst != src' case */ 13513a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 0); 13523a338f20SJussi Kivilinna if (ret) 13533a338f20SJussi Kivilinna return ret; 13543a338f20SJussi Kivilinna 13553a338f20SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 13563a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 1); 13573a338f20SJussi Kivilinna if (ret) 13583a338f20SJussi Kivilinna return ret; 13593a338f20SJussi Kivilinna 13603a338f20SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 13613a338f20SJussi Kivilinna if (alignmask) { 13623a338f20SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 13633a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 13643a338f20SJussi Kivilinna alignmask + 1); 13653a338f20SJussi Kivilinna if (ret) 13663a338f20SJussi Kivilinna return ret; 13673a338f20SJussi Kivilinna } 13683a338f20SJussi Kivilinna 13693a338f20SJussi Kivilinna return 0; 137008d6af8cSJussi Kivilinna } 137108d6af8cSJussi Kivilinna 1372b13b1e0cSEric Biggers static int test_comp(struct crypto_comp *tfm, 1373b13b1e0cSEric Biggers const struct comp_testvec *ctemplate, 1374b13b1e0cSEric Biggers const struct comp_testvec *dtemplate, 1375b13b1e0cSEric Biggers int ctcount, int dtcount) 1376da7f033dSHerbert Xu { 1377da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm)); 1378da7f033dSHerbert Xu unsigned int i; 1379da7f033dSHerbert Xu char result[COMP_BUF_SIZE]; 1380da7f033dSHerbert Xu int ret; 1381da7f033dSHerbert Xu 1382da7f033dSHerbert Xu for (i = 0; i < ctcount; i++) { 1383c79cf910SGeert Uytterhoeven int ilen; 1384c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 1385da7f033dSHerbert Xu 1386da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 1387da7f033dSHerbert Xu 1388da7f033dSHerbert Xu ilen = ctemplate[i].inlen; 1389da7f033dSHerbert Xu ret = crypto_comp_compress(tfm, ctemplate[i].input, 1390da7f033dSHerbert Xu ilen, result, &dlen); 1391da7f033dSHerbert Xu if (ret) { 1392da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: compression failed " 1393da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1394da7f033dSHerbert Xu -ret); 1395da7f033dSHerbert Xu goto out; 1396da7f033dSHerbert Xu } 1397da7f033dSHerbert Xu 1398b812eb00SGeert Uytterhoeven if (dlen != ctemplate[i].outlen) { 1399b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Compression test %d " 1400b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1401b812eb00SGeert Uytterhoeven dlen); 1402b812eb00SGeert Uytterhoeven ret = -EINVAL; 1403b812eb00SGeert Uytterhoeven goto out; 1404b812eb00SGeert Uytterhoeven } 1405b812eb00SGeert Uytterhoeven 1406da7f033dSHerbert Xu if (memcmp(result, ctemplate[i].output, dlen)) { 1407da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Compression test %d " 1408da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 1409da7f033dSHerbert Xu hexdump(result, dlen); 1410da7f033dSHerbert Xu ret = -EINVAL; 1411da7f033dSHerbert Xu goto out; 1412da7f033dSHerbert Xu } 1413da7f033dSHerbert Xu } 1414da7f033dSHerbert Xu 1415da7f033dSHerbert Xu for (i = 0; i < dtcount; i++) { 1416c79cf910SGeert Uytterhoeven int ilen; 1417c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 1418da7f033dSHerbert Xu 1419da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 1420da7f033dSHerbert Xu 1421da7f033dSHerbert Xu ilen = dtemplate[i].inlen; 1422da7f033dSHerbert Xu ret = crypto_comp_decompress(tfm, dtemplate[i].input, 1423da7f033dSHerbert Xu ilen, result, &dlen); 1424da7f033dSHerbert Xu if (ret) { 1425da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: decompression failed " 1426da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1427da7f033dSHerbert Xu -ret); 1428da7f033dSHerbert Xu goto out; 1429da7f033dSHerbert Xu } 1430da7f033dSHerbert Xu 1431b812eb00SGeert Uytterhoeven if (dlen != dtemplate[i].outlen) { 1432b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Decompression test %d " 1433b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1434b812eb00SGeert Uytterhoeven dlen); 1435b812eb00SGeert Uytterhoeven ret = -EINVAL; 1436b812eb00SGeert Uytterhoeven goto out; 1437b812eb00SGeert Uytterhoeven } 1438b812eb00SGeert Uytterhoeven 1439da7f033dSHerbert Xu if (memcmp(result, dtemplate[i].output, dlen)) { 1440da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Decompression test %d " 1441da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 1442da7f033dSHerbert Xu hexdump(result, dlen); 1443da7f033dSHerbert Xu ret = -EINVAL; 1444da7f033dSHerbert Xu goto out; 1445da7f033dSHerbert Xu } 1446da7f033dSHerbert Xu } 1447da7f033dSHerbert Xu 1448da7f033dSHerbert Xu ret = 0; 1449da7f033dSHerbert Xu 1450da7f033dSHerbert Xu out: 1451da7f033dSHerbert Xu return ret; 1452da7f033dSHerbert Xu } 1453da7f033dSHerbert Xu 1454b13b1e0cSEric Biggers static int test_acomp(struct crypto_acomp *tfm, 1455b13b1e0cSEric Biggers const struct comp_testvec *ctemplate, 1456b13b1e0cSEric Biggers const struct comp_testvec *dtemplate, 1457b13b1e0cSEric Biggers int ctcount, int dtcount) 1458d7db7a88SGiovanni Cabiddu { 1459d7db7a88SGiovanni Cabiddu const char *algo = crypto_tfm_alg_driver_name(crypto_acomp_tfm(tfm)); 1460d7db7a88SGiovanni Cabiddu unsigned int i; 1461eb095593SEric Biggers char *output; 1462d7db7a88SGiovanni Cabiddu int ret; 1463d7db7a88SGiovanni Cabiddu struct scatterlist src, dst; 1464d7db7a88SGiovanni Cabiddu struct acomp_req *req; 1465d7db7a88SGiovanni Cabiddu struct tcrypt_result result; 1466d7db7a88SGiovanni Cabiddu 1467eb095593SEric Biggers output = kmalloc(COMP_BUF_SIZE, GFP_KERNEL); 1468eb095593SEric Biggers if (!output) 1469eb095593SEric Biggers return -ENOMEM; 1470eb095593SEric Biggers 1471d7db7a88SGiovanni Cabiddu for (i = 0; i < ctcount; i++) { 1472d7db7a88SGiovanni Cabiddu unsigned int dlen = COMP_BUF_SIZE; 1473d7db7a88SGiovanni Cabiddu int ilen = ctemplate[i].inlen; 147402608e02SLaura Abbott void *input_vec; 1475d7db7a88SGiovanni Cabiddu 1476d2110224SEric Biggers input_vec = kmemdup(ctemplate[i].input, ilen, GFP_KERNEL); 147702608e02SLaura Abbott if (!input_vec) { 147802608e02SLaura Abbott ret = -ENOMEM; 147902608e02SLaura Abbott goto out; 148002608e02SLaura Abbott } 148102608e02SLaura Abbott 1482eb095593SEric Biggers memset(output, 0, dlen); 1483d7db7a88SGiovanni Cabiddu init_completion(&result.completion); 148402608e02SLaura Abbott sg_init_one(&src, input_vec, ilen); 1485d7db7a88SGiovanni Cabiddu sg_init_one(&dst, output, dlen); 1486d7db7a88SGiovanni Cabiddu 1487d7db7a88SGiovanni Cabiddu req = acomp_request_alloc(tfm); 1488d7db7a88SGiovanni Cabiddu if (!req) { 1489d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: request alloc failed for %s\n", 1490d7db7a88SGiovanni Cabiddu algo); 149102608e02SLaura Abbott kfree(input_vec); 1492d7db7a88SGiovanni Cabiddu ret = -ENOMEM; 1493d7db7a88SGiovanni Cabiddu goto out; 1494d7db7a88SGiovanni Cabiddu } 1495d7db7a88SGiovanni Cabiddu 1496d7db7a88SGiovanni Cabiddu acomp_request_set_params(req, &src, &dst, ilen, dlen); 1497d7db7a88SGiovanni Cabiddu acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 1498d7db7a88SGiovanni Cabiddu tcrypt_complete, &result); 1499d7db7a88SGiovanni Cabiddu 1500d7db7a88SGiovanni Cabiddu ret = wait_async_op(&result, crypto_acomp_compress(req)); 1501d7db7a88SGiovanni Cabiddu if (ret) { 1502d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: compression failed on test %d for %s: ret=%d\n", 1503d7db7a88SGiovanni Cabiddu i + 1, algo, -ret); 150402608e02SLaura Abbott kfree(input_vec); 1505d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1506d7db7a88SGiovanni Cabiddu goto out; 1507d7db7a88SGiovanni Cabiddu } 1508d7db7a88SGiovanni Cabiddu 1509d7db7a88SGiovanni Cabiddu if (req->dlen != ctemplate[i].outlen) { 1510d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: Compression test %d failed for %s: output len = %d\n", 1511d7db7a88SGiovanni Cabiddu i + 1, algo, req->dlen); 1512d7db7a88SGiovanni Cabiddu ret = -EINVAL; 151302608e02SLaura Abbott kfree(input_vec); 1514d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1515d7db7a88SGiovanni Cabiddu goto out; 1516d7db7a88SGiovanni Cabiddu } 1517d7db7a88SGiovanni Cabiddu 1518d7db7a88SGiovanni Cabiddu if (memcmp(output, ctemplate[i].output, req->dlen)) { 1519d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: Compression test %d failed for %s\n", 1520d7db7a88SGiovanni Cabiddu i + 1, algo); 1521d7db7a88SGiovanni Cabiddu hexdump(output, req->dlen); 1522d7db7a88SGiovanni Cabiddu ret = -EINVAL; 152302608e02SLaura Abbott kfree(input_vec); 1524d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1525d7db7a88SGiovanni Cabiddu goto out; 1526d7db7a88SGiovanni Cabiddu } 1527d7db7a88SGiovanni Cabiddu 152802608e02SLaura Abbott kfree(input_vec); 1529d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1530d7db7a88SGiovanni Cabiddu } 1531d7db7a88SGiovanni Cabiddu 1532d7db7a88SGiovanni Cabiddu for (i = 0; i < dtcount; i++) { 1533d7db7a88SGiovanni Cabiddu unsigned int dlen = COMP_BUF_SIZE; 1534d7db7a88SGiovanni Cabiddu int ilen = dtemplate[i].inlen; 153502608e02SLaura Abbott void *input_vec; 1536d7db7a88SGiovanni Cabiddu 1537d2110224SEric Biggers input_vec = kmemdup(dtemplate[i].input, ilen, GFP_KERNEL); 153802608e02SLaura Abbott if (!input_vec) { 153902608e02SLaura Abbott ret = -ENOMEM; 154002608e02SLaura Abbott goto out; 154102608e02SLaura Abbott } 154202608e02SLaura Abbott 1543eb095593SEric Biggers memset(output, 0, dlen); 1544d7db7a88SGiovanni Cabiddu init_completion(&result.completion); 154502608e02SLaura Abbott sg_init_one(&src, input_vec, ilen); 1546d7db7a88SGiovanni Cabiddu sg_init_one(&dst, output, dlen); 1547d7db7a88SGiovanni Cabiddu 1548d7db7a88SGiovanni Cabiddu req = acomp_request_alloc(tfm); 1549d7db7a88SGiovanni Cabiddu if (!req) { 1550d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: request alloc failed for %s\n", 1551d7db7a88SGiovanni Cabiddu algo); 155202608e02SLaura Abbott kfree(input_vec); 1553d7db7a88SGiovanni Cabiddu ret = -ENOMEM; 1554d7db7a88SGiovanni Cabiddu goto out; 1555d7db7a88SGiovanni Cabiddu } 1556d7db7a88SGiovanni Cabiddu 1557d7db7a88SGiovanni Cabiddu acomp_request_set_params(req, &src, &dst, ilen, dlen); 1558d7db7a88SGiovanni Cabiddu acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 1559d7db7a88SGiovanni Cabiddu tcrypt_complete, &result); 1560d7db7a88SGiovanni Cabiddu 1561d7db7a88SGiovanni Cabiddu ret = wait_async_op(&result, crypto_acomp_decompress(req)); 1562d7db7a88SGiovanni Cabiddu if (ret) { 1563d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: decompression failed on test %d for %s: ret=%d\n", 1564d7db7a88SGiovanni Cabiddu i + 1, algo, -ret); 156502608e02SLaura Abbott kfree(input_vec); 1566d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1567d7db7a88SGiovanni Cabiddu goto out; 1568d7db7a88SGiovanni Cabiddu } 1569d7db7a88SGiovanni Cabiddu 1570d7db7a88SGiovanni Cabiddu if (req->dlen != dtemplate[i].outlen) { 1571d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: Decompression test %d failed for %s: output len = %d\n", 1572d7db7a88SGiovanni Cabiddu i + 1, algo, req->dlen); 1573d7db7a88SGiovanni Cabiddu ret = -EINVAL; 157402608e02SLaura Abbott kfree(input_vec); 1575d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1576d7db7a88SGiovanni Cabiddu goto out; 1577d7db7a88SGiovanni Cabiddu } 1578d7db7a88SGiovanni Cabiddu 1579d7db7a88SGiovanni Cabiddu if (memcmp(output, dtemplate[i].output, req->dlen)) { 1580d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: Decompression test %d failed for %s\n", 1581d7db7a88SGiovanni Cabiddu i + 1, algo); 1582d7db7a88SGiovanni Cabiddu hexdump(output, req->dlen); 1583d7db7a88SGiovanni Cabiddu ret = -EINVAL; 158402608e02SLaura Abbott kfree(input_vec); 1585d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1586d7db7a88SGiovanni Cabiddu goto out; 1587d7db7a88SGiovanni Cabiddu } 1588d7db7a88SGiovanni Cabiddu 158902608e02SLaura Abbott kfree(input_vec); 1590d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1591d7db7a88SGiovanni Cabiddu } 1592d7db7a88SGiovanni Cabiddu 1593d7db7a88SGiovanni Cabiddu ret = 0; 1594d7db7a88SGiovanni Cabiddu 1595d7db7a88SGiovanni Cabiddu out: 1596eb095593SEric Biggers kfree(output); 1597d7db7a88SGiovanni Cabiddu return ret; 1598d7db7a88SGiovanni Cabiddu } 1599d7db7a88SGiovanni Cabiddu 1600b13b1e0cSEric Biggers static int test_cprng(struct crypto_rng *tfm, 1601b13b1e0cSEric Biggers const struct cprng_testvec *template, 16027647d6ceSJarod Wilson unsigned int tcount) 16037647d6ceSJarod Wilson { 16047647d6ceSJarod Wilson const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm)); 1605fa4ef8a6SFelipe Contreras int err = 0, i, j, seedsize; 16067647d6ceSJarod Wilson u8 *seed; 16077647d6ceSJarod Wilson char result[32]; 16087647d6ceSJarod Wilson 16097647d6ceSJarod Wilson seedsize = crypto_rng_seedsize(tfm); 16107647d6ceSJarod Wilson 16117647d6ceSJarod Wilson seed = kmalloc(seedsize, GFP_KERNEL); 16127647d6ceSJarod Wilson if (!seed) { 16137647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to allocate seed space " 16147647d6ceSJarod Wilson "for %s\n", algo); 16157647d6ceSJarod Wilson return -ENOMEM; 16167647d6ceSJarod Wilson } 16177647d6ceSJarod Wilson 16187647d6ceSJarod Wilson for (i = 0; i < tcount; i++) { 16197647d6ceSJarod Wilson memset(result, 0, 32); 16207647d6ceSJarod Wilson 16217647d6ceSJarod Wilson memcpy(seed, template[i].v, template[i].vlen); 16227647d6ceSJarod Wilson memcpy(seed + template[i].vlen, template[i].key, 16237647d6ceSJarod Wilson template[i].klen); 16247647d6ceSJarod Wilson memcpy(seed + template[i].vlen + template[i].klen, 16257647d6ceSJarod Wilson template[i].dt, template[i].dtlen); 16267647d6ceSJarod Wilson 16277647d6ceSJarod Wilson err = crypto_rng_reset(tfm, seed, seedsize); 16287647d6ceSJarod Wilson if (err) { 16297647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to reset rng " 16307647d6ceSJarod Wilson "for %s\n", algo); 16317647d6ceSJarod Wilson goto out; 16327647d6ceSJarod Wilson } 16337647d6ceSJarod Wilson 16347647d6ceSJarod Wilson for (j = 0; j < template[i].loops; j++) { 16357647d6ceSJarod Wilson err = crypto_rng_get_bytes(tfm, result, 16367647d6ceSJarod Wilson template[i].rlen); 163719e60e13SStephan Mueller if (err < 0) { 16387647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to obtain " 16397647d6ceSJarod Wilson "the correct amount of random data for " 164019e60e13SStephan Mueller "%s (requested %d)\n", algo, 164119e60e13SStephan Mueller template[i].rlen); 16427647d6ceSJarod Wilson goto out; 16437647d6ceSJarod Wilson } 16447647d6ceSJarod Wilson } 16457647d6ceSJarod Wilson 16467647d6ceSJarod Wilson err = memcmp(result, template[i].result, 16477647d6ceSJarod Wilson template[i].rlen); 16487647d6ceSJarod Wilson if (err) { 16497647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Test %d failed for %s\n", 16507647d6ceSJarod Wilson i, algo); 16517647d6ceSJarod Wilson hexdump(result, template[i].rlen); 16527647d6ceSJarod Wilson err = -EINVAL; 16537647d6ceSJarod Wilson goto out; 16547647d6ceSJarod Wilson } 16557647d6ceSJarod Wilson } 16567647d6ceSJarod Wilson 16577647d6ceSJarod Wilson out: 16587647d6ceSJarod Wilson kfree(seed); 16597647d6ceSJarod Wilson return err; 16607647d6ceSJarod Wilson } 16617647d6ceSJarod Wilson 1662da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver, 1663da7f033dSHerbert Xu u32 type, u32 mask) 1664da7f033dSHerbert Xu { 1665da7f033dSHerbert Xu struct crypto_aead *tfm; 1666da7f033dSHerbert Xu int err = 0; 1667da7f033dSHerbert Xu 1668eed93e0cSHerbert Xu tfm = crypto_alloc_aead(driver, type, mask); 1669da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1670da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to load transform for %s: " 1671da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1672da7f033dSHerbert Xu return PTR_ERR(tfm); 1673da7f033dSHerbert Xu } 1674da7f033dSHerbert Xu 1675da7f033dSHerbert Xu if (desc->suite.aead.enc.vecs) { 1676da7f033dSHerbert Xu err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs, 1677da7f033dSHerbert Xu desc->suite.aead.enc.count); 1678da7f033dSHerbert Xu if (err) 1679da7f033dSHerbert Xu goto out; 1680da7f033dSHerbert Xu } 1681da7f033dSHerbert Xu 1682da7f033dSHerbert Xu if (!err && desc->suite.aead.dec.vecs) 1683da7f033dSHerbert Xu err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs, 1684da7f033dSHerbert Xu desc->suite.aead.dec.count); 1685da7f033dSHerbert Xu 1686da7f033dSHerbert Xu out: 1687da7f033dSHerbert Xu crypto_free_aead(tfm); 1688da7f033dSHerbert Xu return err; 1689da7f033dSHerbert Xu } 1690da7f033dSHerbert Xu 1691da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc, 1692da7f033dSHerbert Xu const char *driver, u32 type, u32 mask) 1693da7f033dSHerbert Xu { 16941aa4ecd9SHerbert Xu struct crypto_cipher *tfm; 1695da7f033dSHerbert Xu int err = 0; 1696da7f033dSHerbert Xu 1697eed93e0cSHerbert Xu tfm = crypto_alloc_cipher(driver, type, mask); 1698da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1699da7f033dSHerbert Xu printk(KERN_ERR "alg: cipher: Failed to load transform for " 1700da7f033dSHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 1701da7f033dSHerbert Xu return PTR_ERR(tfm); 1702da7f033dSHerbert Xu } 1703da7f033dSHerbert Xu 1704da7f033dSHerbert Xu if (desc->suite.cipher.enc.vecs) { 1705da7f033dSHerbert Xu err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 1706da7f033dSHerbert Xu desc->suite.cipher.enc.count); 1707da7f033dSHerbert Xu if (err) 1708da7f033dSHerbert Xu goto out; 1709da7f033dSHerbert Xu } 1710da7f033dSHerbert Xu 1711da7f033dSHerbert Xu if (desc->suite.cipher.dec.vecs) 1712da7f033dSHerbert Xu err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 1713da7f033dSHerbert Xu desc->suite.cipher.dec.count); 1714da7f033dSHerbert Xu 1715da7f033dSHerbert Xu out: 17161aa4ecd9SHerbert Xu crypto_free_cipher(tfm); 17171aa4ecd9SHerbert Xu return err; 17181aa4ecd9SHerbert Xu } 17191aa4ecd9SHerbert Xu 17201aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc, 17211aa4ecd9SHerbert Xu const char *driver, u32 type, u32 mask) 17221aa4ecd9SHerbert Xu { 172312773d93SHerbert Xu struct crypto_skcipher *tfm; 17241aa4ecd9SHerbert Xu int err = 0; 17251aa4ecd9SHerbert Xu 1726eed93e0cSHerbert Xu tfm = crypto_alloc_skcipher(driver, type, mask); 17271aa4ecd9SHerbert Xu if (IS_ERR(tfm)) { 17281aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Failed to load transform for " 17291aa4ecd9SHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 17301aa4ecd9SHerbert Xu return PTR_ERR(tfm); 17311aa4ecd9SHerbert Xu } 17321aa4ecd9SHerbert Xu 17331aa4ecd9SHerbert Xu if (desc->suite.cipher.enc.vecs) { 17341aa4ecd9SHerbert Xu err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 17351aa4ecd9SHerbert Xu desc->suite.cipher.enc.count); 17361aa4ecd9SHerbert Xu if (err) 17371aa4ecd9SHerbert Xu goto out; 17381aa4ecd9SHerbert Xu } 17391aa4ecd9SHerbert Xu 17401aa4ecd9SHerbert Xu if (desc->suite.cipher.dec.vecs) 17411aa4ecd9SHerbert Xu err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 17421aa4ecd9SHerbert Xu desc->suite.cipher.dec.count); 17431aa4ecd9SHerbert Xu 17441aa4ecd9SHerbert Xu out: 174512773d93SHerbert Xu crypto_free_skcipher(tfm); 1746da7f033dSHerbert Xu return err; 1747da7f033dSHerbert Xu } 1748da7f033dSHerbert Xu 1749da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver, 1750da7f033dSHerbert Xu u32 type, u32 mask) 1751da7f033dSHerbert Xu { 1752d7db7a88SGiovanni Cabiddu struct crypto_comp *comp; 1753d7db7a88SGiovanni Cabiddu struct crypto_acomp *acomp; 1754da7f033dSHerbert Xu int err; 1755d7db7a88SGiovanni Cabiddu u32 algo_type = type & CRYPTO_ALG_TYPE_ACOMPRESS_MASK; 1756da7f033dSHerbert Xu 1757d7db7a88SGiovanni Cabiddu if (algo_type == CRYPTO_ALG_TYPE_ACOMPRESS) { 1758d7db7a88SGiovanni Cabiddu acomp = crypto_alloc_acomp(driver, type, mask); 1759d7db7a88SGiovanni Cabiddu if (IS_ERR(acomp)) { 1760d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: Failed to load transform for %s: %ld\n", 1761d7db7a88SGiovanni Cabiddu driver, PTR_ERR(acomp)); 1762d7db7a88SGiovanni Cabiddu return PTR_ERR(acomp); 1763d7db7a88SGiovanni Cabiddu } 1764d7db7a88SGiovanni Cabiddu err = test_acomp(acomp, desc->suite.comp.comp.vecs, 1765d7db7a88SGiovanni Cabiddu desc->suite.comp.decomp.vecs, 1766d7db7a88SGiovanni Cabiddu desc->suite.comp.comp.count, 1767d7db7a88SGiovanni Cabiddu desc->suite.comp.decomp.count); 1768d7db7a88SGiovanni Cabiddu crypto_free_acomp(acomp); 1769d7db7a88SGiovanni Cabiddu } else { 1770d7db7a88SGiovanni Cabiddu comp = crypto_alloc_comp(driver, type, mask); 1771d7db7a88SGiovanni Cabiddu if (IS_ERR(comp)) { 1772d7db7a88SGiovanni Cabiddu pr_err("alg: comp: Failed to load transform for %s: %ld\n", 1773d7db7a88SGiovanni Cabiddu driver, PTR_ERR(comp)); 1774d7db7a88SGiovanni Cabiddu return PTR_ERR(comp); 1775da7f033dSHerbert Xu } 1776da7f033dSHerbert Xu 1777d7db7a88SGiovanni Cabiddu err = test_comp(comp, desc->suite.comp.comp.vecs, 1778da7f033dSHerbert Xu desc->suite.comp.decomp.vecs, 1779da7f033dSHerbert Xu desc->suite.comp.comp.count, 1780da7f033dSHerbert Xu desc->suite.comp.decomp.count); 1781da7f033dSHerbert Xu 1782d7db7a88SGiovanni Cabiddu crypto_free_comp(comp); 1783d7db7a88SGiovanni Cabiddu } 1784da7f033dSHerbert Xu return err; 1785da7f033dSHerbert Xu } 1786da7f033dSHerbert Xu 1787da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver, 1788da7f033dSHerbert Xu u32 type, u32 mask) 1789da7f033dSHerbert Xu { 1790da7f033dSHerbert Xu struct crypto_ahash *tfm; 1791da7f033dSHerbert Xu int err; 1792da7f033dSHerbert Xu 1793eed93e0cSHerbert Xu tfm = crypto_alloc_ahash(driver, type, mask); 1794da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1795da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to load transform for %s: " 1796da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1797da7f033dSHerbert Xu return PTR_ERR(tfm); 1798da7f033dSHerbert Xu } 1799da7f033dSHerbert Xu 1800a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1801a8f1a052SDavid S. Miller desc->suite.hash.count, true); 1802a8f1a052SDavid S. Miller if (!err) 1803a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1804a8f1a052SDavid S. Miller desc->suite.hash.count, false); 1805da7f033dSHerbert Xu 1806da7f033dSHerbert Xu crypto_free_ahash(tfm); 1807da7f033dSHerbert Xu return err; 1808da7f033dSHerbert Xu } 1809da7f033dSHerbert Xu 18108e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc, 18118e3ee85eSHerbert Xu const char *driver, u32 type, u32 mask) 18128e3ee85eSHerbert Xu { 18138e3ee85eSHerbert Xu struct crypto_shash *tfm; 18148e3ee85eSHerbert Xu u32 val; 18158e3ee85eSHerbert Xu int err; 18168e3ee85eSHerbert Xu 18178e3ee85eSHerbert Xu err = alg_test_hash(desc, driver, type, mask); 18188e3ee85eSHerbert Xu if (err) 18198e3ee85eSHerbert Xu goto out; 18208e3ee85eSHerbert Xu 1821eed93e0cSHerbert Xu tfm = crypto_alloc_shash(driver, type, mask); 18228e3ee85eSHerbert Xu if (IS_ERR(tfm)) { 18238e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: " 18248e3ee85eSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 18258e3ee85eSHerbert Xu err = PTR_ERR(tfm); 18268e3ee85eSHerbert Xu goto out; 18278e3ee85eSHerbert Xu } 18288e3ee85eSHerbert Xu 18298e3ee85eSHerbert Xu do { 18304c5c3024SJan-Simon Möller SHASH_DESC_ON_STACK(shash, tfm); 18314c5c3024SJan-Simon Möller u32 *ctx = (u32 *)shash_desc_ctx(shash); 18328e3ee85eSHerbert Xu 18334c5c3024SJan-Simon Möller shash->tfm = tfm; 18344c5c3024SJan-Simon Möller shash->flags = 0; 18358e3ee85eSHerbert Xu 18364c5c3024SJan-Simon Möller *ctx = le32_to_cpu(420553207); 18374c5c3024SJan-Simon Möller err = crypto_shash_final(shash, (u8 *)&val); 18388e3ee85eSHerbert Xu if (err) { 18398e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Operation failed for " 18408e3ee85eSHerbert Xu "%s: %d\n", driver, err); 18418e3ee85eSHerbert Xu break; 18428e3ee85eSHerbert Xu } 18438e3ee85eSHerbert Xu 18448e3ee85eSHerbert Xu if (val != ~420553207) { 18458e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Test failed for %s: " 18468e3ee85eSHerbert Xu "%d\n", driver, val); 18478e3ee85eSHerbert Xu err = -EINVAL; 18488e3ee85eSHerbert Xu } 18498e3ee85eSHerbert Xu } while (0); 18508e3ee85eSHerbert Xu 18518e3ee85eSHerbert Xu crypto_free_shash(tfm); 18528e3ee85eSHerbert Xu 18538e3ee85eSHerbert Xu out: 18548e3ee85eSHerbert Xu return err; 18558e3ee85eSHerbert Xu } 18568e3ee85eSHerbert Xu 18577647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver, 18587647d6ceSJarod Wilson u32 type, u32 mask) 18597647d6ceSJarod Wilson { 18607647d6ceSJarod Wilson struct crypto_rng *rng; 18617647d6ceSJarod Wilson int err; 18627647d6ceSJarod Wilson 1863eed93e0cSHerbert Xu rng = crypto_alloc_rng(driver, type, mask); 18647647d6ceSJarod Wilson if (IS_ERR(rng)) { 18657647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to load transform for %s: " 18667647d6ceSJarod Wilson "%ld\n", driver, PTR_ERR(rng)); 18677647d6ceSJarod Wilson return PTR_ERR(rng); 18687647d6ceSJarod Wilson } 18697647d6ceSJarod Wilson 18707647d6ceSJarod Wilson err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count); 18717647d6ceSJarod Wilson 18727647d6ceSJarod Wilson crypto_free_rng(rng); 18737647d6ceSJarod Wilson 18747647d6ceSJarod Wilson return err; 18757647d6ceSJarod Wilson } 18767647d6ceSJarod Wilson 187764d1cdfbSStephan Mueller 1878b13b1e0cSEric Biggers static int drbg_cavs_test(const struct drbg_testvec *test, int pr, 187964d1cdfbSStephan Mueller const char *driver, u32 type, u32 mask) 188064d1cdfbSStephan Mueller { 188164d1cdfbSStephan Mueller int ret = -EAGAIN; 188264d1cdfbSStephan Mueller struct crypto_rng *drng; 188364d1cdfbSStephan Mueller struct drbg_test_data test_data; 188464d1cdfbSStephan Mueller struct drbg_string addtl, pers, testentropy; 188564d1cdfbSStephan Mueller unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL); 188664d1cdfbSStephan Mueller 188764d1cdfbSStephan Mueller if (!buf) 188864d1cdfbSStephan Mueller return -ENOMEM; 188964d1cdfbSStephan Mueller 1890eed93e0cSHerbert Xu drng = crypto_alloc_rng(driver, type, mask); 189164d1cdfbSStephan Mueller if (IS_ERR(drng)) { 189264d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for " 189364d1cdfbSStephan Mueller "%s\n", driver); 189464d1cdfbSStephan Mueller kzfree(buf); 189564d1cdfbSStephan Mueller return -ENOMEM; 189664d1cdfbSStephan Mueller } 189764d1cdfbSStephan Mueller 189864d1cdfbSStephan Mueller test_data.testentropy = &testentropy; 189964d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entropy, test->entropylen); 190064d1cdfbSStephan Mueller drbg_string_fill(&pers, test->pers, test->perslen); 190164d1cdfbSStephan Mueller ret = crypto_drbg_reset_test(drng, &pers, &test_data); 190264d1cdfbSStephan Mueller if (ret) { 190364d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: Failed to reset rng\n"); 190464d1cdfbSStephan Mueller goto outbuf; 190564d1cdfbSStephan Mueller } 190664d1cdfbSStephan Mueller 190764d1cdfbSStephan Mueller drbg_string_fill(&addtl, test->addtla, test->addtllen); 190864d1cdfbSStephan Mueller if (pr) { 190964d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entpra, test->entprlen); 191064d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl_test(drng, 191164d1cdfbSStephan Mueller buf, test->expectedlen, &addtl, &test_data); 191264d1cdfbSStephan Mueller } else { 191364d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl(drng, 191464d1cdfbSStephan Mueller buf, test->expectedlen, &addtl); 191564d1cdfbSStephan Mueller } 191619e60e13SStephan Mueller if (ret < 0) { 191764d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not obtain random data for " 191864d1cdfbSStephan Mueller "driver %s\n", driver); 191964d1cdfbSStephan Mueller goto outbuf; 192064d1cdfbSStephan Mueller } 192164d1cdfbSStephan Mueller 192264d1cdfbSStephan Mueller drbg_string_fill(&addtl, test->addtlb, test->addtllen); 192364d1cdfbSStephan Mueller if (pr) { 192464d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entprb, test->entprlen); 192564d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl_test(drng, 192664d1cdfbSStephan Mueller buf, test->expectedlen, &addtl, &test_data); 192764d1cdfbSStephan Mueller } else { 192864d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl(drng, 192964d1cdfbSStephan Mueller buf, test->expectedlen, &addtl); 193064d1cdfbSStephan Mueller } 193119e60e13SStephan Mueller if (ret < 0) { 193264d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not obtain random data for " 193364d1cdfbSStephan Mueller "driver %s\n", driver); 193464d1cdfbSStephan Mueller goto outbuf; 193564d1cdfbSStephan Mueller } 193664d1cdfbSStephan Mueller 193764d1cdfbSStephan Mueller ret = memcmp(test->expected, buf, test->expectedlen); 193864d1cdfbSStephan Mueller 193964d1cdfbSStephan Mueller outbuf: 194064d1cdfbSStephan Mueller crypto_free_rng(drng); 194164d1cdfbSStephan Mueller kzfree(buf); 194264d1cdfbSStephan Mueller return ret; 194364d1cdfbSStephan Mueller } 194464d1cdfbSStephan Mueller 194564d1cdfbSStephan Mueller 194664d1cdfbSStephan Mueller static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver, 194764d1cdfbSStephan Mueller u32 type, u32 mask) 194864d1cdfbSStephan Mueller { 194964d1cdfbSStephan Mueller int err = 0; 195064d1cdfbSStephan Mueller int pr = 0; 195164d1cdfbSStephan Mueller int i = 0; 1952b13b1e0cSEric Biggers const struct drbg_testvec *template = desc->suite.drbg.vecs; 195364d1cdfbSStephan Mueller unsigned int tcount = desc->suite.drbg.count; 195464d1cdfbSStephan Mueller 195564d1cdfbSStephan Mueller if (0 == memcmp(driver, "drbg_pr_", 8)) 195664d1cdfbSStephan Mueller pr = 1; 195764d1cdfbSStephan Mueller 195864d1cdfbSStephan Mueller for (i = 0; i < tcount; i++) { 195964d1cdfbSStephan Mueller err = drbg_cavs_test(&template[i], pr, driver, type, mask); 196064d1cdfbSStephan Mueller if (err) { 196164d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: Test %d failed for %s\n", 196264d1cdfbSStephan Mueller i, driver); 196364d1cdfbSStephan Mueller err = -EINVAL; 196464d1cdfbSStephan Mueller break; 196564d1cdfbSStephan Mueller } 196664d1cdfbSStephan Mueller } 196764d1cdfbSStephan Mueller return err; 196864d1cdfbSStephan Mueller 196964d1cdfbSStephan Mueller } 197064d1cdfbSStephan Mueller 1971b13b1e0cSEric Biggers static int do_test_kpp(struct crypto_kpp *tfm, const struct kpp_testvec *vec, 1972802c7f1cSSalvatore Benedetto const char *alg) 1973802c7f1cSSalvatore Benedetto { 1974802c7f1cSSalvatore Benedetto struct kpp_request *req; 1975802c7f1cSSalvatore Benedetto void *input_buf = NULL; 1976802c7f1cSSalvatore Benedetto void *output_buf = NULL; 1977802c7f1cSSalvatore Benedetto struct tcrypt_result result; 1978802c7f1cSSalvatore Benedetto unsigned int out_len_max; 1979802c7f1cSSalvatore Benedetto int err = -ENOMEM; 1980802c7f1cSSalvatore Benedetto struct scatterlist src, dst; 1981802c7f1cSSalvatore Benedetto 1982802c7f1cSSalvatore Benedetto req = kpp_request_alloc(tfm, GFP_KERNEL); 1983802c7f1cSSalvatore Benedetto if (!req) 1984802c7f1cSSalvatore Benedetto return err; 1985802c7f1cSSalvatore Benedetto 1986802c7f1cSSalvatore Benedetto init_completion(&result.completion); 1987802c7f1cSSalvatore Benedetto 1988802c7f1cSSalvatore Benedetto err = crypto_kpp_set_secret(tfm, vec->secret, vec->secret_size); 1989802c7f1cSSalvatore Benedetto if (err < 0) 1990802c7f1cSSalvatore Benedetto goto free_req; 1991802c7f1cSSalvatore Benedetto 1992802c7f1cSSalvatore Benedetto out_len_max = crypto_kpp_maxsize(tfm); 1993802c7f1cSSalvatore Benedetto output_buf = kzalloc(out_len_max, GFP_KERNEL); 1994802c7f1cSSalvatore Benedetto if (!output_buf) { 1995802c7f1cSSalvatore Benedetto err = -ENOMEM; 1996802c7f1cSSalvatore Benedetto goto free_req; 1997802c7f1cSSalvatore Benedetto } 1998802c7f1cSSalvatore Benedetto 1999802c7f1cSSalvatore Benedetto /* Use appropriate parameter as base */ 2000802c7f1cSSalvatore Benedetto kpp_request_set_input(req, NULL, 0); 2001802c7f1cSSalvatore Benedetto sg_init_one(&dst, output_buf, out_len_max); 2002802c7f1cSSalvatore Benedetto kpp_request_set_output(req, &dst, out_len_max); 2003802c7f1cSSalvatore Benedetto kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 2004802c7f1cSSalvatore Benedetto tcrypt_complete, &result); 2005802c7f1cSSalvatore Benedetto 2006802c7f1cSSalvatore Benedetto /* Compute public key */ 2007802c7f1cSSalvatore Benedetto err = wait_async_op(&result, crypto_kpp_generate_public_key(req)); 2008802c7f1cSSalvatore Benedetto if (err) { 2009802c7f1cSSalvatore Benedetto pr_err("alg: %s: generate public key test failed. err %d\n", 2010802c7f1cSSalvatore Benedetto alg, err); 2011802c7f1cSSalvatore Benedetto goto free_output; 2012802c7f1cSSalvatore Benedetto } 2013802c7f1cSSalvatore Benedetto /* Verify calculated public key */ 2014802c7f1cSSalvatore Benedetto if (memcmp(vec->expected_a_public, sg_virt(req->dst), 2015802c7f1cSSalvatore Benedetto vec->expected_a_public_size)) { 2016802c7f1cSSalvatore Benedetto pr_err("alg: %s: generate public key test failed. Invalid output\n", 2017802c7f1cSSalvatore Benedetto alg); 2018802c7f1cSSalvatore Benedetto err = -EINVAL; 2019802c7f1cSSalvatore Benedetto goto free_output; 2020802c7f1cSSalvatore Benedetto } 2021802c7f1cSSalvatore Benedetto 2022802c7f1cSSalvatore Benedetto /* Calculate shared secret key by using counter part (b) public key. */ 2023802c7f1cSSalvatore Benedetto input_buf = kzalloc(vec->b_public_size, GFP_KERNEL); 2024802c7f1cSSalvatore Benedetto if (!input_buf) { 2025802c7f1cSSalvatore Benedetto err = -ENOMEM; 2026802c7f1cSSalvatore Benedetto goto free_output; 2027802c7f1cSSalvatore Benedetto } 2028802c7f1cSSalvatore Benedetto 2029802c7f1cSSalvatore Benedetto memcpy(input_buf, vec->b_public, vec->b_public_size); 2030802c7f1cSSalvatore Benedetto sg_init_one(&src, input_buf, vec->b_public_size); 2031802c7f1cSSalvatore Benedetto sg_init_one(&dst, output_buf, out_len_max); 2032802c7f1cSSalvatore Benedetto kpp_request_set_input(req, &src, vec->b_public_size); 2033802c7f1cSSalvatore Benedetto kpp_request_set_output(req, &dst, out_len_max); 2034802c7f1cSSalvatore Benedetto kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 2035802c7f1cSSalvatore Benedetto tcrypt_complete, &result); 2036802c7f1cSSalvatore Benedetto err = wait_async_op(&result, crypto_kpp_compute_shared_secret(req)); 2037802c7f1cSSalvatore Benedetto if (err) { 2038802c7f1cSSalvatore Benedetto pr_err("alg: %s: compute shard secret test failed. err %d\n", 2039802c7f1cSSalvatore Benedetto alg, err); 2040802c7f1cSSalvatore Benedetto goto free_all; 2041802c7f1cSSalvatore Benedetto } 2042802c7f1cSSalvatore Benedetto /* 2043802c7f1cSSalvatore Benedetto * verify shared secret from which the user will derive 2044802c7f1cSSalvatore Benedetto * secret key by executing whatever hash it has chosen 2045802c7f1cSSalvatore Benedetto */ 2046802c7f1cSSalvatore Benedetto if (memcmp(vec->expected_ss, sg_virt(req->dst), 2047802c7f1cSSalvatore Benedetto vec->expected_ss_size)) { 2048802c7f1cSSalvatore Benedetto pr_err("alg: %s: compute shared secret test failed. Invalid output\n", 2049802c7f1cSSalvatore Benedetto alg); 2050802c7f1cSSalvatore Benedetto err = -EINVAL; 2051802c7f1cSSalvatore Benedetto } 2052802c7f1cSSalvatore Benedetto 2053802c7f1cSSalvatore Benedetto free_all: 2054802c7f1cSSalvatore Benedetto kfree(input_buf); 2055802c7f1cSSalvatore Benedetto free_output: 2056802c7f1cSSalvatore Benedetto kfree(output_buf); 2057802c7f1cSSalvatore Benedetto free_req: 2058802c7f1cSSalvatore Benedetto kpp_request_free(req); 2059802c7f1cSSalvatore Benedetto return err; 2060802c7f1cSSalvatore Benedetto } 2061802c7f1cSSalvatore Benedetto 2062802c7f1cSSalvatore Benedetto static int test_kpp(struct crypto_kpp *tfm, const char *alg, 2063b13b1e0cSEric Biggers const struct kpp_testvec *vecs, unsigned int tcount) 2064802c7f1cSSalvatore Benedetto { 2065802c7f1cSSalvatore Benedetto int ret, i; 2066802c7f1cSSalvatore Benedetto 2067802c7f1cSSalvatore Benedetto for (i = 0; i < tcount; i++) { 2068802c7f1cSSalvatore Benedetto ret = do_test_kpp(tfm, vecs++, alg); 2069802c7f1cSSalvatore Benedetto if (ret) { 2070802c7f1cSSalvatore Benedetto pr_err("alg: %s: test failed on vector %d, err=%d\n", 2071802c7f1cSSalvatore Benedetto alg, i + 1, ret); 2072802c7f1cSSalvatore Benedetto return ret; 2073802c7f1cSSalvatore Benedetto } 2074802c7f1cSSalvatore Benedetto } 2075802c7f1cSSalvatore Benedetto return 0; 2076802c7f1cSSalvatore Benedetto } 2077802c7f1cSSalvatore Benedetto 2078802c7f1cSSalvatore Benedetto static int alg_test_kpp(const struct alg_test_desc *desc, const char *driver, 2079802c7f1cSSalvatore Benedetto u32 type, u32 mask) 2080802c7f1cSSalvatore Benedetto { 2081802c7f1cSSalvatore Benedetto struct crypto_kpp *tfm; 2082802c7f1cSSalvatore Benedetto int err = 0; 2083802c7f1cSSalvatore Benedetto 2084eed93e0cSHerbert Xu tfm = crypto_alloc_kpp(driver, type, mask); 2085802c7f1cSSalvatore Benedetto if (IS_ERR(tfm)) { 2086802c7f1cSSalvatore Benedetto pr_err("alg: kpp: Failed to load tfm for %s: %ld\n", 2087802c7f1cSSalvatore Benedetto driver, PTR_ERR(tfm)); 2088802c7f1cSSalvatore Benedetto return PTR_ERR(tfm); 2089802c7f1cSSalvatore Benedetto } 2090802c7f1cSSalvatore Benedetto if (desc->suite.kpp.vecs) 2091802c7f1cSSalvatore Benedetto err = test_kpp(tfm, desc->alg, desc->suite.kpp.vecs, 2092802c7f1cSSalvatore Benedetto desc->suite.kpp.count); 2093802c7f1cSSalvatore Benedetto 2094802c7f1cSSalvatore Benedetto crypto_free_kpp(tfm); 2095802c7f1cSSalvatore Benedetto return err; 2096802c7f1cSSalvatore Benedetto } 2097802c7f1cSSalvatore Benedetto 209850d2b643SHerbert Xu static int test_akcipher_one(struct crypto_akcipher *tfm, 2099b13b1e0cSEric Biggers const struct akcipher_testvec *vecs) 2100946cc463STadeusz Struk { 2101df27b26fSHerbert Xu char *xbuf[XBUFSIZE]; 2102946cc463STadeusz Struk struct akcipher_request *req; 2103946cc463STadeusz Struk void *outbuf_enc = NULL; 2104946cc463STadeusz Struk void *outbuf_dec = NULL; 2105946cc463STadeusz Struk struct tcrypt_result result; 2106946cc463STadeusz Struk unsigned int out_len_max, out_len = 0; 2107946cc463STadeusz Struk int err = -ENOMEM; 210822287b0bSTadeusz Struk struct scatterlist src, dst, src_tab[2]; 2109946cc463STadeusz Struk 2110df27b26fSHerbert Xu if (testmgr_alloc_buf(xbuf)) 2111df27b26fSHerbert Xu return err; 2112df27b26fSHerbert Xu 2113946cc463STadeusz Struk req = akcipher_request_alloc(tfm, GFP_KERNEL); 2114946cc463STadeusz Struk if (!req) 2115df27b26fSHerbert Xu goto free_xbuf; 2116946cc463STadeusz Struk 2117946cc463STadeusz Struk init_completion(&result.completion); 211822287b0bSTadeusz Struk 211922287b0bSTadeusz Struk if (vecs->public_key_vec) 212022287b0bSTadeusz Struk err = crypto_akcipher_set_pub_key(tfm, vecs->key, 212122287b0bSTadeusz Struk vecs->key_len); 212222287b0bSTadeusz Struk else 212322287b0bSTadeusz Struk err = crypto_akcipher_set_priv_key(tfm, vecs->key, 212422287b0bSTadeusz Struk vecs->key_len); 2125946cc463STadeusz Struk if (err) 2126946cc463STadeusz Struk goto free_req; 2127946cc463STadeusz Struk 212857763f5eSSalvatore Benedetto err = -ENOMEM; 212922287b0bSTadeusz Struk out_len_max = crypto_akcipher_maxsize(tfm); 2130946cc463STadeusz Struk outbuf_enc = kzalloc(out_len_max, GFP_KERNEL); 2131946cc463STadeusz Struk if (!outbuf_enc) 2132946cc463STadeusz Struk goto free_req; 2133946cc463STadeusz Struk 2134df27b26fSHerbert Xu if (WARN_ON(vecs->m_size > PAGE_SIZE)) 2135df27b26fSHerbert Xu goto free_all; 2136df27b26fSHerbert Xu 2137df27b26fSHerbert Xu memcpy(xbuf[0], vecs->m, vecs->m_size); 2138df27b26fSHerbert Xu 213922287b0bSTadeusz Struk sg_init_table(src_tab, 2); 2140df27b26fSHerbert Xu sg_set_buf(&src_tab[0], xbuf[0], 8); 2141df27b26fSHerbert Xu sg_set_buf(&src_tab[1], xbuf[0] + 8, vecs->m_size - 8); 214222287b0bSTadeusz Struk sg_init_one(&dst, outbuf_enc, out_len_max); 214322287b0bSTadeusz Struk akcipher_request_set_crypt(req, src_tab, &dst, vecs->m_size, 214422287b0bSTadeusz Struk out_len_max); 2145946cc463STadeusz Struk akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 2146946cc463STadeusz Struk tcrypt_complete, &result); 2147946cc463STadeusz Struk 2148946cc463STadeusz Struk /* Run RSA encrypt - c = m^e mod n;*/ 2149946cc463STadeusz Struk err = wait_async_op(&result, crypto_akcipher_encrypt(req)); 2150946cc463STadeusz Struk if (err) { 215150d2b643SHerbert Xu pr_err("alg: akcipher: encrypt test failed. err %d\n", err); 2152946cc463STadeusz Struk goto free_all; 2153946cc463STadeusz Struk } 215422287b0bSTadeusz Struk if (req->dst_len != vecs->c_size) { 215550d2b643SHerbert Xu pr_err("alg: akcipher: encrypt test failed. Invalid output len\n"); 2156946cc463STadeusz Struk err = -EINVAL; 2157946cc463STadeusz Struk goto free_all; 2158946cc463STadeusz Struk } 2159946cc463STadeusz Struk /* verify that encrypted message is equal to expected */ 2160df27b26fSHerbert Xu if (memcmp(vecs->c, outbuf_enc, vecs->c_size)) { 216150d2b643SHerbert Xu pr_err("alg: akcipher: encrypt test failed. Invalid output\n"); 216250d2b643SHerbert Xu hexdump(outbuf_enc, vecs->c_size); 2163946cc463STadeusz Struk err = -EINVAL; 2164946cc463STadeusz Struk goto free_all; 2165946cc463STadeusz Struk } 2166946cc463STadeusz Struk /* Don't invoke decrypt for vectors with public key */ 2167946cc463STadeusz Struk if (vecs->public_key_vec) { 2168946cc463STadeusz Struk err = 0; 2169946cc463STadeusz Struk goto free_all; 2170946cc463STadeusz Struk } 2171946cc463STadeusz Struk outbuf_dec = kzalloc(out_len_max, GFP_KERNEL); 2172946cc463STadeusz Struk if (!outbuf_dec) { 2173946cc463STadeusz Struk err = -ENOMEM; 2174946cc463STadeusz Struk goto free_all; 2175946cc463STadeusz Struk } 2176df27b26fSHerbert Xu 2177df27b26fSHerbert Xu if (WARN_ON(vecs->c_size > PAGE_SIZE)) 2178df27b26fSHerbert Xu goto free_all; 2179df27b26fSHerbert Xu 2180df27b26fSHerbert Xu memcpy(xbuf[0], vecs->c, vecs->c_size); 2181df27b26fSHerbert Xu 2182df27b26fSHerbert Xu sg_init_one(&src, xbuf[0], vecs->c_size); 218322287b0bSTadeusz Struk sg_init_one(&dst, outbuf_dec, out_len_max); 2184946cc463STadeusz Struk init_completion(&result.completion); 218522287b0bSTadeusz Struk akcipher_request_set_crypt(req, &src, &dst, vecs->c_size, out_len_max); 2186946cc463STadeusz Struk 2187946cc463STadeusz Struk /* Run RSA decrypt - m = c^d mod n;*/ 2188946cc463STadeusz Struk err = wait_async_op(&result, crypto_akcipher_decrypt(req)); 2189946cc463STadeusz Struk if (err) { 219050d2b643SHerbert Xu pr_err("alg: akcipher: decrypt test failed. err %d\n", err); 2191946cc463STadeusz Struk goto free_all; 2192946cc463STadeusz Struk } 2193946cc463STadeusz Struk out_len = req->dst_len; 219450d2b643SHerbert Xu if (out_len < vecs->m_size) { 219550d2b643SHerbert Xu pr_err("alg: akcipher: decrypt test failed. " 219650d2b643SHerbert Xu "Invalid output len %u\n", out_len); 2197946cc463STadeusz Struk err = -EINVAL; 2198946cc463STadeusz Struk goto free_all; 2199946cc463STadeusz Struk } 2200946cc463STadeusz Struk /* verify that decrypted message is equal to the original msg */ 220150d2b643SHerbert Xu if (memchr_inv(outbuf_dec, 0, out_len - vecs->m_size) || 220250d2b643SHerbert Xu memcmp(vecs->m, outbuf_dec + out_len - vecs->m_size, 220350d2b643SHerbert Xu vecs->m_size)) { 220450d2b643SHerbert Xu pr_err("alg: akcipher: decrypt test failed. Invalid output\n"); 220550d2b643SHerbert Xu hexdump(outbuf_dec, out_len); 2206946cc463STadeusz Struk err = -EINVAL; 2207946cc463STadeusz Struk } 2208946cc463STadeusz Struk free_all: 2209946cc463STadeusz Struk kfree(outbuf_dec); 2210946cc463STadeusz Struk kfree(outbuf_enc); 2211946cc463STadeusz Struk free_req: 2212946cc463STadeusz Struk akcipher_request_free(req); 2213df27b26fSHerbert Xu free_xbuf: 2214df27b26fSHerbert Xu testmgr_free_buf(xbuf); 2215946cc463STadeusz Struk return err; 2216946cc463STadeusz Struk } 2217946cc463STadeusz Struk 221850d2b643SHerbert Xu static int test_akcipher(struct crypto_akcipher *tfm, const char *alg, 2219b13b1e0cSEric Biggers const struct akcipher_testvec *vecs, 2220b13b1e0cSEric Biggers unsigned int tcount) 2221946cc463STadeusz Struk { 222215226e48SHerbert Xu const char *algo = 222315226e48SHerbert Xu crypto_tfm_alg_driver_name(crypto_akcipher_tfm(tfm)); 2224946cc463STadeusz Struk int ret, i; 2225946cc463STadeusz Struk 2226946cc463STadeusz Struk for (i = 0; i < tcount; i++) { 222750d2b643SHerbert Xu ret = test_akcipher_one(tfm, vecs++); 222850d2b643SHerbert Xu if (!ret) 222950d2b643SHerbert Xu continue; 223050d2b643SHerbert Xu 223115226e48SHerbert Xu pr_err("alg: akcipher: test %d failed for %s, err=%d\n", 223215226e48SHerbert Xu i + 1, algo, ret); 2233946cc463STadeusz Struk return ret; 2234946cc463STadeusz Struk } 2235946cc463STadeusz Struk return 0; 2236946cc463STadeusz Struk } 2237946cc463STadeusz Struk 2238946cc463STadeusz Struk static int alg_test_akcipher(const struct alg_test_desc *desc, 2239946cc463STadeusz Struk const char *driver, u32 type, u32 mask) 2240946cc463STadeusz Struk { 2241946cc463STadeusz Struk struct crypto_akcipher *tfm; 2242946cc463STadeusz Struk int err = 0; 2243946cc463STadeusz Struk 2244eed93e0cSHerbert Xu tfm = crypto_alloc_akcipher(driver, type, mask); 2245946cc463STadeusz Struk if (IS_ERR(tfm)) { 2246946cc463STadeusz Struk pr_err("alg: akcipher: Failed to load tfm for %s: %ld\n", 2247946cc463STadeusz Struk driver, PTR_ERR(tfm)); 2248946cc463STadeusz Struk return PTR_ERR(tfm); 2249946cc463STadeusz Struk } 2250946cc463STadeusz Struk if (desc->suite.akcipher.vecs) 2251946cc463STadeusz Struk err = test_akcipher(tfm, desc->alg, desc->suite.akcipher.vecs, 2252946cc463STadeusz Struk desc->suite.akcipher.count); 2253946cc463STadeusz Struk 2254946cc463STadeusz Struk crypto_free_akcipher(tfm); 2255946cc463STadeusz Struk return err; 2256946cc463STadeusz Struk } 2257946cc463STadeusz Struk 2258863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc, 2259863b557aSYouquan, Song const char *driver, u32 type, u32 mask) 2260863b557aSYouquan, Song { 2261863b557aSYouquan, Song return 0; 2262863b557aSYouquan, Song } 2263863b557aSYouquan, Song 226421c8e720SArd Biesheuvel #define __VECS(tv) { .vecs = tv, .count = ARRAY_SIZE(tv) } 226521c8e720SArd Biesheuvel 2266da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */ 2267da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = { 2268da7f033dSHerbert Xu { 2269e08ca2daSJarod Wilson .alg = "ansi_cprng", 2270e08ca2daSJarod Wilson .test = alg_test_cprng, 2271e08ca2daSJarod Wilson .suite = { 227221c8e720SArd Biesheuvel .cprng = __VECS(ansi_cprng_aes_tv_template) 2273e08ca2daSJarod Wilson } 2274e08ca2daSJarod Wilson }, { 2275bca4feb0SHoria Geanta .alg = "authenc(hmac(md5),ecb(cipher_null))", 2276bca4feb0SHoria Geanta .test = alg_test_aead, 2277bca4feb0SHoria Geanta .suite = { 2278bca4feb0SHoria Geanta .aead = { 227921c8e720SArd Biesheuvel .enc = __VECS(hmac_md5_ecb_cipher_null_enc_tv_template), 228021c8e720SArd Biesheuvel .dec = __VECS(hmac_md5_ecb_cipher_null_dec_tv_template) 2281bca4feb0SHoria Geanta } 2282bca4feb0SHoria Geanta } 2283bca4feb0SHoria Geanta }, { 2284a4198fd4SHerbert Xu .alg = "authenc(hmac(sha1),cbc(aes))", 2285e46e9a46SHoria Geanta .test = alg_test_aead, 2286e46e9a46SHoria Geanta .suite = { 2287e46e9a46SHoria Geanta .aead = { 228821c8e720SArd Biesheuvel .enc = __VECS(hmac_sha1_aes_cbc_enc_tv_temp) 22895208ed2cSNitesh Lal } 22905208ed2cSNitesh Lal } 22915208ed2cSNitesh Lal }, { 2292a4198fd4SHerbert Xu .alg = "authenc(hmac(sha1),cbc(des))", 22935208ed2cSNitesh Lal .test = alg_test_aead, 22945208ed2cSNitesh Lal .suite = { 22955208ed2cSNitesh Lal .aead = { 229621c8e720SArd Biesheuvel .enc = __VECS(hmac_sha1_des_cbc_enc_tv_temp) 22975208ed2cSNitesh Lal } 22985208ed2cSNitesh Lal } 22995208ed2cSNitesh Lal }, { 2300a4198fd4SHerbert Xu .alg = "authenc(hmac(sha1),cbc(des3_ede))", 23015208ed2cSNitesh Lal .test = alg_test_aead, 2302ed1afac9SMarcus Meissner .fips_allowed = 1, 23035208ed2cSNitesh Lal .suite = { 23045208ed2cSNitesh Lal .aead = { 230521c8e720SArd Biesheuvel .enc = __VECS(hmac_sha1_des3_ede_cbc_enc_tv_temp) 2306e46e9a46SHoria Geanta } 2307e46e9a46SHoria Geanta } 2308e46e9a46SHoria Geanta }, { 2309fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha1),ctr(aes))", 2310fb16abc2SMarcus Meissner .test = alg_test_null, 2311fb16abc2SMarcus Meissner .fips_allowed = 1, 2312fb16abc2SMarcus Meissner }, { 2313bca4feb0SHoria Geanta .alg = "authenc(hmac(sha1),ecb(cipher_null))", 2314bca4feb0SHoria Geanta .test = alg_test_aead, 2315bca4feb0SHoria Geanta .suite = { 2316bca4feb0SHoria Geanta .aead = { 231721c8e720SArd Biesheuvel .enc = __VECS(hmac_sha1_ecb_cipher_null_enc_tv_temp), 231821c8e720SArd Biesheuvel .dec = __VECS(hmac_sha1_ecb_cipher_null_dec_tv_temp) 23195208ed2cSNitesh Lal } 23205208ed2cSNitesh Lal } 23215208ed2cSNitesh Lal }, { 23228888690eSMarcus Meissner .alg = "authenc(hmac(sha1),rfc3686(ctr(aes)))", 23238888690eSMarcus Meissner .test = alg_test_null, 23248888690eSMarcus Meissner .fips_allowed = 1, 23258888690eSMarcus Meissner }, { 2326a4198fd4SHerbert Xu .alg = "authenc(hmac(sha224),cbc(des))", 23275208ed2cSNitesh Lal .test = alg_test_aead, 23285208ed2cSNitesh Lal .suite = { 23295208ed2cSNitesh Lal .aead = { 233021c8e720SArd Biesheuvel .enc = __VECS(hmac_sha224_des_cbc_enc_tv_temp) 23315208ed2cSNitesh Lal } 23325208ed2cSNitesh Lal } 23335208ed2cSNitesh Lal }, { 2334a4198fd4SHerbert Xu .alg = "authenc(hmac(sha224),cbc(des3_ede))", 23355208ed2cSNitesh Lal .test = alg_test_aead, 2336ed1afac9SMarcus Meissner .fips_allowed = 1, 23375208ed2cSNitesh Lal .suite = { 23385208ed2cSNitesh Lal .aead = { 233921c8e720SArd Biesheuvel .enc = __VECS(hmac_sha224_des3_ede_cbc_enc_tv_temp) 2340bca4feb0SHoria Geanta } 2341bca4feb0SHoria Geanta } 2342bca4feb0SHoria Geanta }, { 2343a4198fd4SHerbert Xu .alg = "authenc(hmac(sha256),cbc(aes))", 2344e46e9a46SHoria Geanta .test = alg_test_aead, 2345ed1afac9SMarcus Meissner .fips_allowed = 1, 2346e46e9a46SHoria Geanta .suite = { 2347e46e9a46SHoria Geanta .aead = { 234821c8e720SArd Biesheuvel .enc = __VECS(hmac_sha256_aes_cbc_enc_tv_temp) 23495208ed2cSNitesh Lal } 23505208ed2cSNitesh Lal } 23515208ed2cSNitesh Lal }, { 2352a4198fd4SHerbert Xu .alg = "authenc(hmac(sha256),cbc(des))", 23535208ed2cSNitesh Lal .test = alg_test_aead, 23545208ed2cSNitesh Lal .suite = { 23555208ed2cSNitesh Lal .aead = { 235621c8e720SArd Biesheuvel .enc = __VECS(hmac_sha256_des_cbc_enc_tv_temp) 23575208ed2cSNitesh Lal } 23585208ed2cSNitesh Lal } 23595208ed2cSNitesh Lal }, { 2360a4198fd4SHerbert Xu .alg = "authenc(hmac(sha256),cbc(des3_ede))", 23615208ed2cSNitesh Lal .test = alg_test_aead, 2362ed1afac9SMarcus Meissner .fips_allowed = 1, 23635208ed2cSNitesh Lal .suite = { 23645208ed2cSNitesh Lal .aead = { 236521c8e720SArd Biesheuvel .enc = __VECS(hmac_sha256_des3_ede_cbc_enc_tv_temp) 23665208ed2cSNitesh Lal } 23675208ed2cSNitesh Lal } 23685208ed2cSNitesh Lal }, { 2369fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha256),ctr(aes))", 2370fb16abc2SMarcus Meissner .test = alg_test_null, 2371fb16abc2SMarcus Meissner .fips_allowed = 1, 2372fb16abc2SMarcus Meissner }, { 23738888690eSMarcus Meissner .alg = "authenc(hmac(sha256),rfc3686(ctr(aes)))", 23748888690eSMarcus Meissner .test = alg_test_null, 23758888690eSMarcus Meissner .fips_allowed = 1, 23768888690eSMarcus Meissner }, { 2377a4198fd4SHerbert Xu .alg = "authenc(hmac(sha384),cbc(des))", 23785208ed2cSNitesh Lal .test = alg_test_aead, 23795208ed2cSNitesh Lal .suite = { 23805208ed2cSNitesh Lal .aead = { 238121c8e720SArd Biesheuvel .enc = __VECS(hmac_sha384_des_cbc_enc_tv_temp) 23825208ed2cSNitesh Lal } 23835208ed2cSNitesh Lal } 23845208ed2cSNitesh Lal }, { 2385a4198fd4SHerbert Xu .alg = "authenc(hmac(sha384),cbc(des3_ede))", 23865208ed2cSNitesh Lal .test = alg_test_aead, 2387ed1afac9SMarcus Meissner .fips_allowed = 1, 23885208ed2cSNitesh Lal .suite = { 23895208ed2cSNitesh Lal .aead = { 239021c8e720SArd Biesheuvel .enc = __VECS(hmac_sha384_des3_ede_cbc_enc_tv_temp) 2391e46e9a46SHoria Geanta } 2392e46e9a46SHoria Geanta } 2393e46e9a46SHoria Geanta }, { 2394fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha384),ctr(aes))", 2395fb16abc2SMarcus Meissner .test = alg_test_null, 2396fb16abc2SMarcus Meissner .fips_allowed = 1, 2397fb16abc2SMarcus Meissner }, { 23988888690eSMarcus Meissner .alg = "authenc(hmac(sha384),rfc3686(ctr(aes)))", 23998888690eSMarcus Meissner .test = alg_test_null, 24008888690eSMarcus Meissner .fips_allowed = 1, 24018888690eSMarcus Meissner }, { 2402a4198fd4SHerbert Xu .alg = "authenc(hmac(sha512),cbc(aes))", 2403ed1afac9SMarcus Meissner .fips_allowed = 1, 2404e46e9a46SHoria Geanta .test = alg_test_aead, 2405e46e9a46SHoria Geanta .suite = { 2406e46e9a46SHoria Geanta .aead = { 240721c8e720SArd Biesheuvel .enc = __VECS(hmac_sha512_aes_cbc_enc_tv_temp) 24085208ed2cSNitesh Lal } 24095208ed2cSNitesh Lal } 24105208ed2cSNitesh Lal }, { 2411a4198fd4SHerbert Xu .alg = "authenc(hmac(sha512),cbc(des))", 24125208ed2cSNitesh Lal .test = alg_test_aead, 24135208ed2cSNitesh Lal .suite = { 24145208ed2cSNitesh Lal .aead = { 241521c8e720SArd Biesheuvel .enc = __VECS(hmac_sha512_des_cbc_enc_tv_temp) 24165208ed2cSNitesh Lal } 24175208ed2cSNitesh Lal } 24185208ed2cSNitesh Lal }, { 2419a4198fd4SHerbert Xu .alg = "authenc(hmac(sha512),cbc(des3_ede))", 24205208ed2cSNitesh Lal .test = alg_test_aead, 2421ed1afac9SMarcus Meissner .fips_allowed = 1, 24225208ed2cSNitesh Lal .suite = { 24235208ed2cSNitesh Lal .aead = { 242421c8e720SArd Biesheuvel .enc = __VECS(hmac_sha512_des3_ede_cbc_enc_tv_temp) 2425e46e9a46SHoria Geanta } 2426e46e9a46SHoria Geanta } 2427e46e9a46SHoria Geanta }, { 2428fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha512),ctr(aes))", 2429fb16abc2SMarcus Meissner .test = alg_test_null, 2430fb16abc2SMarcus Meissner .fips_allowed = 1, 2431fb16abc2SMarcus Meissner }, { 24328888690eSMarcus Meissner .alg = "authenc(hmac(sha512),rfc3686(ctr(aes)))", 24338888690eSMarcus Meissner .test = alg_test_null, 24348888690eSMarcus Meissner .fips_allowed = 1, 24358888690eSMarcus Meissner }, { 2436da7f033dSHerbert Xu .alg = "cbc(aes)", 24371aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2438a1915d51SJarod Wilson .fips_allowed = 1, 2439da7f033dSHerbert Xu .suite = { 2440da7f033dSHerbert Xu .cipher = { 244121c8e720SArd Biesheuvel .enc = __VECS(aes_cbc_enc_tv_template), 244221c8e720SArd Biesheuvel .dec = __VECS(aes_cbc_dec_tv_template) 2443da7f033dSHerbert Xu } 2444da7f033dSHerbert Xu } 2445da7f033dSHerbert Xu }, { 2446da7f033dSHerbert Xu .alg = "cbc(anubis)", 24471aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2448da7f033dSHerbert Xu .suite = { 2449da7f033dSHerbert Xu .cipher = { 245021c8e720SArd Biesheuvel .enc = __VECS(anubis_cbc_enc_tv_template), 245121c8e720SArd Biesheuvel .dec = __VECS(anubis_cbc_dec_tv_template) 2452da7f033dSHerbert Xu } 2453da7f033dSHerbert Xu } 2454da7f033dSHerbert Xu }, { 2455da7f033dSHerbert Xu .alg = "cbc(blowfish)", 24561aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2457da7f033dSHerbert Xu .suite = { 2458da7f033dSHerbert Xu .cipher = { 245921c8e720SArd Biesheuvel .enc = __VECS(bf_cbc_enc_tv_template), 246021c8e720SArd Biesheuvel .dec = __VECS(bf_cbc_dec_tv_template) 2461da7f033dSHerbert Xu } 2462da7f033dSHerbert Xu } 2463da7f033dSHerbert Xu }, { 2464da7f033dSHerbert Xu .alg = "cbc(camellia)", 24651aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2466da7f033dSHerbert Xu .suite = { 2467da7f033dSHerbert Xu .cipher = { 246821c8e720SArd Biesheuvel .enc = __VECS(camellia_cbc_enc_tv_template), 246921c8e720SArd Biesheuvel .dec = __VECS(camellia_cbc_dec_tv_template) 2470da7f033dSHerbert Xu } 2471da7f033dSHerbert Xu } 2472da7f033dSHerbert Xu }, { 2473a2c58260SJohannes Goetzfried .alg = "cbc(cast5)", 2474a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 2475a2c58260SJohannes Goetzfried .suite = { 2476a2c58260SJohannes Goetzfried .cipher = { 247721c8e720SArd Biesheuvel .enc = __VECS(cast5_cbc_enc_tv_template), 247821c8e720SArd Biesheuvel .dec = __VECS(cast5_cbc_dec_tv_template) 2479a2c58260SJohannes Goetzfried } 2480a2c58260SJohannes Goetzfried } 2481a2c58260SJohannes Goetzfried }, { 24829b8b0405SJohannes Goetzfried .alg = "cbc(cast6)", 24839b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 24849b8b0405SJohannes Goetzfried .suite = { 24859b8b0405SJohannes Goetzfried .cipher = { 248621c8e720SArd Biesheuvel .enc = __VECS(cast6_cbc_enc_tv_template), 248721c8e720SArd Biesheuvel .dec = __VECS(cast6_cbc_dec_tv_template) 24889b8b0405SJohannes Goetzfried } 24899b8b0405SJohannes Goetzfried } 24909b8b0405SJohannes Goetzfried }, { 2491da7f033dSHerbert Xu .alg = "cbc(des)", 24921aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2493da7f033dSHerbert Xu .suite = { 2494da7f033dSHerbert Xu .cipher = { 249521c8e720SArd Biesheuvel .enc = __VECS(des_cbc_enc_tv_template), 249621c8e720SArd Biesheuvel .dec = __VECS(des_cbc_dec_tv_template) 2497da7f033dSHerbert Xu } 2498da7f033dSHerbert Xu } 2499da7f033dSHerbert Xu }, { 2500da7f033dSHerbert Xu .alg = "cbc(des3_ede)", 25011aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2502a1915d51SJarod Wilson .fips_allowed = 1, 2503da7f033dSHerbert Xu .suite = { 2504da7f033dSHerbert Xu .cipher = { 250521c8e720SArd Biesheuvel .enc = __VECS(des3_ede_cbc_enc_tv_template), 250621c8e720SArd Biesheuvel .dec = __VECS(des3_ede_cbc_dec_tv_template) 2507da7f033dSHerbert Xu } 2508da7f033dSHerbert Xu } 2509da7f033dSHerbert Xu }, { 25109d25917dSJussi Kivilinna .alg = "cbc(serpent)", 25119d25917dSJussi Kivilinna .test = alg_test_skcipher, 25129d25917dSJussi Kivilinna .suite = { 25139d25917dSJussi Kivilinna .cipher = { 251421c8e720SArd Biesheuvel .enc = __VECS(serpent_cbc_enc_tv_template), 251521c8e720SArd Biesheuvel .dec = __VECS(serpent_cbc_dec_tv_template) 25169d25917dSJussi Kivilinna } 25179d25917dSJussi Kivilinna } 25189d25917dSJussi Kivilinna }, { 2519da7f033dSHerbert Xu .alg = "cbc(twofish)", 25201aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2521da7f033dSHerbert Xu .suite = { 2522da7f033dSHerbert Xu .cipher = { 252321c8e720SArd Biesheuvel .enc = __VECS(tf_cbc_enc_tv_template), 252421c8e720SArd Biesheuvel .dec = __VECS(tf_cbc_dec_tv_template) 2525da7f033dSHerbert Xu } 2526da7f033dSHerbert Xu } 2527da7f033dSHerbert Xu }, { 2528092acf06SArd Biesheuvel .alg = "cbcmac(aes)", 2529092acf06SArd Biesheuvel .fips_allowed = 1, 2530092acf06SArd Biesheuvel .test = alg_test_hash, 2531092acf06SArd Biesheuvel .suite = { 2532092acf06SArd Biesheuvel .hash = __VECS(aes_cbcmac_tv_template) 2533092acf06SArd Biesheuvel } 2534092acf06SArd Biesheuvel }, { 2535da7f033dSHerbert Xu .alg = "ccm(aes)", 2536da7f033dSHerbert Xu .test = alg_test_aead, 2537a1915d51SJarod Wilson .fips_allowed = 1, 2538da7f033dSHerbert Xu .suite = { 2539da7f033dSHerbert Xu .aead = { 254021c8e720SArd Biesheuvel .enc = __VECS(aes_ccm_enc_tv_template), 254121c8e720SArd Biesheuvel .dec = __VECS(aes_ccm_dec_tv_template) 2542da7f033dSHerbert Xu } 2543da7f033dSHerbert Xu } 2544da7f033dSHerbert Xu }, { 25453590ebf2SMartin Willi .alg = "chacha20", 25463590ebf2SMartin Willi .test = alg_test_skcipher, 25473590ebf2SMartin Willi .suite = { 25483590ebf2SMartin Willi .cipher = { 254921c8e720SArd Biesheuvel .enc = __VECS(chacha20_enc_tv_template), 255021c8e720SArd Biesheuvel .dec = __VECS(chacha20_enc_tv_template), 25513590ebf2SMartin Willi } 25523590ebf2SMartin Willi } 25533590ebf2SMartin Willi }, { 255493b5e86aSJussi Kivilinna .alg = "cmac(aes)", 25558f183751SStephan Mueller .fips_allowed = 1, 255693b5e86aSJussi Kivilinna .test = alg_test_hash, 255793b5e86aSJussi Kivilinna .suite = { 255821c8e720SArd Biesheuvel .hash = __VECS(aes_cmac128_tv_template) 255993b5e86aSJussi Kivilinna } 256093b5e86aSJussi Kivilinna }, { 256193b5e86aSJussi Kivilinna .alg = "cmac(des3_ede)", 25628f183751SStephan Mueller .fips_allowed = 1, 256393b5e86aSJussi Kivilinna .test = alg_test_hash, 256493b5e86aSJussi Kivilinna .suite = { 256521c8e720SArd Biesheuvel .hash = __VECS(des3_ede_cmac64_tv_template) 256693b5e86aSJussi Kivilinna } 256793b5e86aSJussi Kivilinna }, { 2568e448370dSJussi Kivilinna .alg = "compress_null", 2569e448370dSJussi Kivilinna .test = alg_test_null, 2570e448370dSJussi Kivilinna }, { 2571ebb3472fSArd Biesheuvel .alg = "crc32", 2572ebb3472fSArd Biesheuvel .test = alg_test_hash, 2573ebb3472fSArd Biesheuvel .suite = { 257421c8e720SArd Biesheuvel .hash = __VECS(crc32_tv_template) 2575ebb3472fSArd Biesheuvel } 2576ebb3472fSArd Biesheuvel }, { 2577da7f033dSHerbert Xu .alg = "crc32c", 25788e3ee85eSHerbert Xu .test = alg_test_crc32c, 2579a1915d51SJarod Wilson .fips_allowed = 1, 2580da7f033dSHerbert Xu .suite = { 258121c8e720SArd Biesheuvel .hash = __VECS(crc32c_tv_template) 2582da7f033dSHerbert Xu } 2583da7f033dSHerbert Xu }, { 258468411521SHerbert Xu .alg = "crct10dif", 258568411521SHerbert Xu .test = alg_test_hash, 258668411521SHerbert Xu .fips_allowed = 1, 258768411521SHerbert Xu .suite = { 258821c8e720SArd Biesheuvel .hash = __VECS(crct10dif_tv_template) 258968411521SHerbert Xu } 259068411521SHerbert Xu }, { 2591f7cb80f2SJarod Wilson .alg = "ctr(aes)", 2592f7cb80f2SJarod Wilson .test = alg_test_skcipher, 2593a1915d51SJarod Wilson .fips_allowed = 1, 2594f7cb80f2SJarod Wilson .suite = { 2595f7cb80f2SJarod Wilson .cipher = { 259621c8e720SArd Biesheuvel .enc = __VECS(aes_ctr_enc_tv_template), 259721c8e720SArd Biesheuvel .dec = __VECS(aes_ctr_dec_tv_template) 2598f7cb80f2SJarod Wilson } 2599f7cb80f2SJarod Wilson } 2600f7cb80f2SJarod Wilson }, { 260185b63e34SJussi Kivilinna .alg = "ctr(blowfish)", 260285b63e34SJussi Kivilinna .test = alg_test_skcipher, 260385b63e34SJussi Kivilinna .suite = { 260485b63e34SJussi Kivilinna .cipher = { 260521c8e720SArd Biesheuvel .enc = __VECS(bf_ctr_enc_tv_template), 260621c8e720SArd Biesheuvel .dec = __VECS(bf_ctr_dec_tv_template) 260785b63e34SJussi Kivilinna } 260885b63e34SJussi Kivilinna } 260985b63e34SJussi Kivilinna }, { 26100840605eSJussi Kivilinna .alg = "ctr(camellia)", 26110840605eSJussi Kivilinna .test = alg_test_skcipher, 26120840605eSJussi Kivilinna .suite = { 26130840605eSJussi Kivilinna .cipher = { 261421c8e720SArd Biesheuvel .enc = __VECS(camellia_ctr_enc_tv_template), 261521c8e720SArd Biesheuvel .dec = __VECS(camellia_ctr_dec_tv_template) 26160840605eSJussi Kivilinna } 26170840605eSJussi Kivilinna } 26180840605eSJussi Kivilinna }, { 2619a2c58260SJohannes Goetzfried .alg = "ctr(cast5)", 2620a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 2621a2c58260SJohannes Goetzfried .suite = { 2622a2c58260SJohannes Goetzfried .cipher = { 262321c8e720SArd Biesheuvel .enc = __VECS(cast5_ctr_enc_tv_template), 262421c8e720SArd Biesheuvel .dec = __VECS(cast5_ctr_dec_tv_template) 2625a2c58260SJohannes Goetzfried } 2626a2c58260SJohannes Goetzfried } 2627a2c58260SJohannes Goetzfried }, { 26289b8b0405SJohannes Goetzfried .alg = "ctr(cast6)", 26299b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 26309b8b0405SJohannes Goetzfried .suite = { 26319b8b0405SJohannes Goetzfried .cipher = { 263221c8e720SArd Biesheuvel .enc = __VECS(cast6_ctr_enc_tv_template), 263321c8e720SArd Biesheuvel .dec = __VECS(cast6_ctr_dec_tv_template) 26349b8b0405SJohannes Goetzfried } 26359b8b0405SJohannes Goetzfried } 26369b8b0405SJohannes Goetzfried }, { 26378163fc30SJussi Kivilinna .alg = "ctr(des)", 26388163fc30SJussi Kivilinna .test = alg_test_skcipher, 26398163fc30SJussi Kivilinna .suite = { 26408163fc30SJussi Kivilinna .cipher = { 264121c8e720SArd Biesheuvel .enc = __VECS(des_ctr_enc_tv_template), 264221c8e720SArd Biesheuvel .dec = __VECS(des_ctr_dec_tv_template) 26438163fc30SJussi Kivilinna } 26448163fc30SJussi Kivilinna } 26458163fc30SJussi Kivilinna }, { 2646e080b17aSJussi Kivilinna .alg = "ctr(des3_ede)", 2647e080b17aSJussi Kivilinna .test = alg_test_skcipher, 2648e080b17aSJussi Kivilinna .suite = { 2649e080b17aSJussi Kivilinna .cipher = { 265021c8e720SArd Biesheuvel .enc = __VECS(des3_ede_ctr_enc_tv_template), 265121c8e720SArd Biesheuvel .dec = __VECS(des3_ede_ctr_dec_tv_template) 2652e080b17aSJussi Kivilinna } 2653e080b17aSJussi Kivilinna } 2654e080b17aSJussi Kivilinna }, { 26559d25917dSJussi Kivilinna .alg = "ctr(serpent)", 26569d25917dSJussi Kivilinna .test = alg_test_skcipher, 26579d25917dSJussi Kivilinna .suite = { 26589d25917dSJussi Kivilinna .cipher = { 265921c8e720SArd Biesheuvel .enc = __VECS(serpent_ctr_enc_tv_template), 266021c8e720SArd Biesheuvel .dec = __VECS(serpent_ctr_dec_tv_template) 26619d25917dSJussi Kivilinna } 26629d25917dSJussi Kivilinna } 26639d25917dSJussi Kivilinna }, { 2664573da620SJussi Kivilinna .alg = "ctr(twofish)", 2665573da620SJussi Kivilinna .test = alg_test_skcipher, 2666573da620SJussi Kivilinna .suite = { 2667573da620SJussi Kivilinna .cipher = { 266821c8e720SArd Biesheuvel .enc = __VECS(tf_ctr_enc_tv_template), 266921c8e720SArd Biesheuvel .dec = __VECS(tf_ctr_dec_tv_template) 2670573da620SJussi Kivilinna } 2671573da620SJussi Kivilinna } 2672573da620SJussi Kivilinna }, { 2673da7f033dSHerbert Xu .alg = "cts(cbc(aes))", 26741aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2675da7f033dSHerbert Xu .suite = { 2676da7f033dSHerbert Xu .cipher = { 267721c8e720SArd Biesheuvel .enc = __VECS(cts_mode_enc_tv_template), 267821c8e720SArd Biesheuvel .dec = __VECS(cts_mode_dec_tv_template) 2679da7f033dSHerbert Xu } 2680da7f033dSHerbert Xu } 2681da7f033dSHerbert Xu }, { 2682da7f033dSHerbert Xu .alg = "deflate", 2683da7f033dSHerbert Xu .test = alg_test_comp, 26840818904dSMilan Broz .fips_allowed = 1, 2685da7f033dSHerbert Xu .suite = { 2686da7f033dSHerbert Xu .comp = { 268721c8e720SArd Biesheuvel .comp = __VECS(deflate_comp_tv_template), 268821c8e720SArd Biesheuvel .decomp = __VECS(deflate_decomp_tv_template) 2689da7f033dSHerbert Xu } 2690da7f033dSHerbert Xu } 2691da7f033dSHerbert Xu }, { 2692802c7f1cSSalvatore Benedetto .alg = "dh", 2693802c7f1cSSalvatore Benedetto .test = alg_test_kpp, 2694802c7f1cSSalvatore Benedetto .fips_allowed = 1, 2695802c7f1cSSalvatore Benedetto .suite = { 269621c8e720SArd Biesheuvel .kpp = __VECS(dh_tv_template) 2697802c7f1cSSalvatore Benedetto } 2698802c7f1cSSalvatore Benedetto }, { 2699e448370dSJussi Kivilinna .alg = "digest_null", 2700e448370dSJussi Kivilinna .test = alg_test_null, 2701e448370dSJussi Kivilinna }, { 270264d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes128", 270364d1cdfbSStephan Mueller .test = alg_test_drbg, 270464d1cdfbSStephan Mueller .fips_allowed = 1, 270564d1cdfbSStephan Mueller .suite = { 270621c8e720SArd Biesheuvel .drbg = __VECS(drbg_nopr_ctr_aes128_tv_template) 270764d1cdfbSStephan Mueller } 270864d1cdfbSStephan Mueller }, { 270964d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes192", 271064d1cdfbSStephan Mueller .test = alg_test_drbg, 271164d1cdfbSStephan Mueller .fips_allowed = 1, 271264d1cdfbSStephan Mueller .suite = { 271321c8e720SArd Biesheuvel .drbg = __VECS(drbg_nopr_ctr_aes192_tv_template) 271464d1cdfbSStephan Mueller } 271564d1cdfbSStephan Mueller }, { 271664d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes256", 271764d1cdfbSStephan Mueller .test = alg_test_drbg, 271864d1cdfbSStephan Mueller .fips_allowed = 1, 271964d1cdfbSStephan Mueller .suite = { 272021c8e720SArd Biesheuvel .drbg = __VECS(drbg_nopr_ctr_aes256_tv_template) 272164d1cdfbSStephan Mueller } 272264d1cdfbSStephan Mueller }, { 272364d1cdfbSStephan Mueller /* 272464d1cdfbSStephan Mueller * There is no need to specifically test the DRBG with every 272564d1cdfbSStephan Mueller * backend cipher -- covered by drbg_nopr_hmac_sha256 test 272664d1cdfbSStephan Mueller */ 272764d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha1", 272864d1cdfbSStephan Mueller .fips_allowed = 1, 272964d1cdfbSStephan Mueller .test = alg_test_null, 273064d1cdfbSStephan Mueller }, { 273164d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha256", 273264d1cdfbSStephan Mueller .test = alg_test_drbg, 273364d1cdfbSStephan Mueller .fips_allowed = 1, 273464d1cdfbSStephan Mueller .suite = { 273521c8e720SArd Biesheuvel .drbg = __VECS(drbg_nopr_hmac_sha256_tv_template) 273664d1cdfbSStephan Mueller } 273764d1cdfbSStephan Mueller }, { 273864d1cdfbSStephan Mueller /* covered by drbg_nopr_hmac_sha256 test */ 273964d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha384", 274064d1cdfbSStephan Mueller .fips_allowed = 1, 274164d1cdfbSStephan Mueller .test = alg_test_null, 274264d1cdfbSStephan Mueller }, { 274364d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha512", 274464d1cdfbSStephan Mueller .test = alg_test_null, 274564d1cdfbSStephan Mueller .fips_allowed = 1, 274664d1cdfbSStephan Mueller }, { 274764d1cdfbSStephan Mueller .alg = "drbg_nopr_sha1", 274864d1cdfbSStephan Mueller .fips_allowed = 1, 274964d1cdfbSStephan Mueller .test = alg_test_null, 275064d1cdfbSStephan Mueller }, { 275164d1cdfbSStephan Mueller .alg = "drbg_nopr_sha256", 275264d1cdfbSStephan Mueller .test = alg_test_drbg, 275364d1cdfbSStephan Mueller .fips_allowed = 1, 275464d1cdfbSStephan Mueller .suite = { 275521c8e720SArd Biesheuvel .drbg = __VECS(drbg_nopr_sha256_tv_template) 275664d1cdfbSStephan Mueller } 275764d1cdfbSStephan Mueller }, { 275864d1cdfbSStephan Mueller /* covered by drbg_nopr_sha256 test */ 275964d1cdfbSStephan Mueller .alg = "drbg_nopr_sha384", 276064d1cdfbSStephan Mueller .fips_allowed = 1, 276164d1cdfbSStephan Mueller .test = alg_test_null, 276264d1cdfbSStephan Mueller }, { 276364d1cdfbSStephan Mueller .alg = "drbg_nopr_sha512", 276464d1cdfbSStephan Mueller .fips_allowed = 1, 276564d1cdfbSStephan Mueller .test = alg_test_null, 276664d1cdfbSStephan Mueller }, { 276764d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes128", 276864d1cdfbSStephan Mueller .test = alg_test_drbg, 276964d1cdfbSStephan Mueller .fips_allowed = 1, 277064d1cdfbSStephan Mueller .suite = { 277121c8e720SArd Biesheuvel .drbg = __VECS(drbg_pr_ctr_aes128_tv_template) 277264d1cdfbSStephan Mueller } 277364d1cdfbSStephan Mueller }, { 277464d1cdfbSStephan Mueller /* covered by drbg_pr_ctr_aes128 test */ 277564d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes192", 277664d1cdfbSStephan Mueller .fips_allowed = 1, 277764d1cdfbSStephan Mueller .test = alg_test_null, 277864d1cdfbSStephan Mueller }, { 277964d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes256", 278064d1cdfbSStephan Mueller .fips_allowed = 1, 278164d1cdfbSStephan Mueller .test = alg_test_null, 278264d1cdfbSStephan Mueller }, { 278364d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha1", 278464d1cdfbSStephan Mueller .fips_allowed = 1, 278564d1cdfbSStephan Mueller .test = alg_test_null, 278664d1cdfbSStephan Mueller }, { 278764d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha256", 278864d1cdfbSStephan Mueller .test = alg_test_drbg, 278964d1cdfbSStephan Mueller .fips_allowed = 1, 279064d1cdfbSStephan Mueller .suite = { 279121c8e720SArd Biesheuvel .drbg = __VECS(drbg_pr_hmac_sha256_tv_template) 279264d1cdfbSStephan Mueller } 279364d1cdfbSStephan Mueller }, { 279464d1cdfbSStephan Mueller /* covered by drbg_pr_hmac_sha256 test */ 279564d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha384", 279664d1cdfbSStephan Mueller .fips_allowed = 1, 279764d1cdfbSStephan Mueller .test = alg_test_null, 279864d1cdfbSStephan Mueller }, { 279964d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha512", 280064d1cdfbSStephan Mueller .test = alg_test_null, 280164d1cdfbSStephan Mueller .fips_allowed = 1, 280264d1cdfbSStephan Mueller }, { 280364d1cdfbSStephan Mueller .alg = "drbg_pr_sha1", 280464d1cdfbSStephan Mueller .fips_allowed = 1, 280564d1cdfbSStephan Mueller .test = alg_test_null, 280664d1cdfbSStephan Mueller }, { 280764d1cdfbSStephan Mueller .alg = "drbg_pr_sha256", 280864d1cdfbSStephan Mueller .test = alg_test_drbg, 280964d1cdfbSStephan Mueller .fips_allowed = 1, 281064d1cdfbSStephan Mueller .suite = { 281121c8e720SArd Biesheuvel .drbg = __VECS(drbg_pr_sha256_tv_template) 281264d1cdfbSStephan Mueller } 281364d1cdfbSStephan Mueller }, { 281464d1cdfbSStephan Mueller /* covered by drbg_pr_sha256 test */ 281564d1cdfbSStephan Mueller .alg = "drbg_pr_sha384", 281664d1cdfbSStephan Mueller .fips_allowed = 1, 281764d1cdfbSStephan Mueller .test = alg_test_null, 281864d1cdfbSStephan Mueller }, { 281964d1cdfbSStephan Mueller .alg = "drbg_pr_sha512", 282064d1cdfbSStephan Mueller .fips_allowed = 1, 282164d1cdfbSStephan Mueller .test = alg_test_null, 282264d1cdfbSStephan Mueller }, { 2823da7f033dSHerbert Xu .alg = "ecb(aes)", 28241aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2825a1915d51SJarod Wilson .fips_allowed = 1, 2826da7f033dSHerbert Xu .suite = { 2827da7f033dSHerbert Xu .cipher = { 282821c8e720SArd Biesheuvel .enc = __VECS(aes_enc_tv_template), 282921c8e720SArd Biesheuvel .dec = __VECS(aes_dec_tv_template) 2830da7f033dSHerbert Xu } 2831da7f033dSHerbert Xu } 2832da7f033dSHerbert Xu }, { 2833da7f033dSHerbert Xu .alg = "ecb(anubis)", 28341aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2835da7f033dSHerbert Xu .suite = { 2836da7f033dSHerbert Xu .cipher = { 283721c8e720SArd Biesheuvel .enc = __VECS(anubis_enc_tv_template), 283821c8e720SArd Biesheuvel .dec = __VECS(anubis_dec_tv_template) 2839da7f033dSHerbert Xu } 2840da7f033dSHerbert Xu } 2841da7f033dSHerbert Xu }, { 2842da7f033dSHerbert Xu .alg = "ecb(arc4)", 28431aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2844da7f033dSHerbert Xu .suite = { 2845da7f033dSHerbert Xu .cipher = { 284621c8e720SArd Biesheuvel .enc = __VECS(arc4_enc_tv_template), 284721c8e720SArd Biesheuvel .dec = __VECS(arc4_dec_tv_template) 2848da7f033dSHerbert Xu } 2849da7f033dSHerbert Xu } 2850da7f033dSHerbert Xu }, { 2851da7f033dSHerbert Xu .alg = "ecb(blowfish)", 28521aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2853da7f033dSHerbert Xu .suite = { 2854da7f033dSHerbert Xu .cipher = { 285521c8e720SArd Biesheuvel .enc = __VECS(bf_enc_tv_template), 285621c8e720SArd Biesheuvel .dec = __VECS(bf_dec_tv_template) 2857da7f033dSHerbert Xu } 2858da7f033dSHerbert Xu } 2859da7f033dSHerbert Xu }, { 2860da7f033dSHerbert Xu .alg = "ecb(camellia)", 28611aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2862da7f033dSHerbert Xu .suite = { 2863da7f033dSHerbert Xu .cipher = { 286421c8e720SArd Biesheuvel .enc = __VECS(camellia_enc_tv_template), 286521c8e720SArd Biesheuvel .dec = __VECS(camellia_dec_tv_template) 2866da7f033dSHerbert Xu } 2867da7f033dSHerbert Xu } 2868da7f033dSHerbert Xu }, { 2869da7f033dSHerbert Xu .alg = "ecb(cast5)", 28701aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2871da7f033dSHerbert Xu .suite = { 2872da7f033dSHerbert Xu .cipher = { 287321c8e720SArd Biesheuvel .enc = __VECS(cast5_enc_tv_template), 287421c8e720SArd Biesheuvel .dec = __VECS(cast5_dec_tv_template) 2875da7f033dSHerbert Xu } 2876da7f033dSHerbert Xu } 2877da7f033dSHerbert Xu }, { 2878da7f033dSHerbert Xu .alg = "ecb(cast6)", 28791aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2880da7f033dSHerbert Xu .suite = { 2881da7f033dSHerbert Xu .cipher = { 288221c8e720SArd Biesheuvel .enc = __VECS(cast6_enc_tv_template), 288321c8e720SArd Biesheuvel .dec = __VECS(cast6_dec_tv_template) 2884da7f033dSHerbert Xu } 2885da7f033dSHerbert Xu } 2886da7f033dSHerbert Xu }, { 2887e448370dSJussi Kivilinna .alg = "ecb(cipher_null)", 2888e448370dSJussi Kivilinna .test = alg_test_null, 2889e448370dSJussi Kivilinna }, { 2890da7f033dSHerbert Xu .alg = "ecb(des)", 28911aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2892da7f033dSHerbert Xu .suite = { 2893da7f033dSHerbert Xu .cipher = { 289421c8e720SArd Biesheuvel .enc = __VECS(des_enc_tv_template), 289521c8e720SArd Biesheuvel .dec = __VECS(des_dec_tv_template) 2896da7f033dSHerbert Xu } 2897da7f033dSHerbert Xu } 2898da7f033dSHerbert Xu }, { 2899da7f033dSHerbert Xu .alg = "ecb(des3_ede)", 29001aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2901a1915d51SJarod Wilson .fips_allowed = 1, 2902da7f033dSHerbert Xu .suite = { 2903da7f033dSHerbert Xu .cipher = { 290421c8e720SArd Biesheuvel .enc = __VECS(des3_ede_enc_tv_template), 290521c8e720SArd Biesheuvel .dec = __VECS(des3_ede_dec_tv_template) 2906da7f033dSHerbert Xu } 2907da7f033dSHerbert Xu } 2908da7f033dSHerbert Xu }, { 290966e5bd00SJussi Kivilinna .alg = "ecb(fcrypt)", 291066e5bd00SJussi Kivilinna .test = alg_test_skcipher, 291166e5bd00SJussi Kivilinna .suite = { 291266e5bd00SJussi Kivilinna .cipher = { 291366e5bd00SJussi Kivilinna .enc = { 291466e5bd00SJussi Kivilinna .vecs = fcrypt_pcbc_enc_tv_template, 291566e5bd00SJussi Kivilinna .count = 1 291666e5bd00SJussi Kivilinna }, 291766e5bd00SJussi Kivilinna .dec = { 291866e5bd00SJussi Kivilinna .vecs = fcrypt_pcbc_dec_tv_template, 291966e5bd00SJussi Kivilinna .count = 1 292066e5bd00SJussi Kivilinna } 292166e5bd00SJussi Kivilinna } 292266e5bd00SJussi Kivilinna } 292366e5bd00SJussi Kivilinna }, { 2924da7f033dSHerbert Xu .alg = "ecb(khazad)", 29251aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2926da7f033dSHerbert Xu .suite = { 2927da7f033dSHerbert Xu .cipher = { 292821c8e720SArd Biesheuvel .enc = __VECS(khazad_enc_tv_template), 292921c8e720SArd Biesheuvel .dec = __VECS(khazad_dec_tv_template) 2930da7f033dSHerbert Xu } 2931da7f033dSHerbert Xu } 2932da7f033dSHerbert Xu }, { 2933da7f033dSHerbert Xu .alg = "ecb(seed)", 29341aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2935da7f033dSHerbert Xu .suite = { 2936da7f033dSHerbert Xu .cipher = { 293721c8e720SArd Biesheuvel .enc = __VECS(seed_enc_tv_template), 293821c8e720SArd Biesheuvel .dec = __VECS(seed_dec_tv_template) 2939da7f033dSHerbert Xu } 2940da7f033dSHerbert Xu } 2941da7f033dSHerbert Xu }, { 2942da7f033dSHerbert Xu .alg = "ecb(serpent)", 29431aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2944da7f033dSHerbert Xu .suite = { 2945da7f033dSHerbert Xu .cipher = { 294621c8e720SArd Biesheuvel .enc = __VECS(serpent_enc_tv_template), 294721c8e720SArd Biesheuvel .dec = __VECS(serpent_dec_tv_template) 2948da7f033dSHerbert Xu } 2949da7f033dSHerbert Xu } 2950da7f033dSHerbert Xu }, { 2951da7f033dSHerbert Xu .alg = "ecb(tea)", 29521aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2953da7f033dSHerbert Xu .suite = { 2954da7f033dSHerbert Xu .cipher = { 295521c8e720SArd Biesheuvel .enc = __VECS(tea_enc_tv_template), 295621c8e720SArd Biesheuvel .dec = __VECS(tea_dec_tv_template) 2957da7f033dSHerbert Xu } 2958da7f033dSHerbert Xu } 2959da7f033dSHerbert Xu }, { 2960da7f033dSHerbert Xu .alg = "ecb(tnepres)", 29611aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2962da7f033dSHerbert Xu .suite = { 2963da7f033dSHerbert Xu .cipher = { 296421c8e720SArd Biesheuvel .enc = __VECS(tnepres_enc_tv_template), 296521c8e720SArd Biesheuvel .dec = __VECS(tnepres_dec_tv_template) 2966da7f033dSHerbert Xu } 2967da7f033dSHerbert Xu } 2968da7f033dSHerbert Xu }, { 2969da7f033dSHerbert Xu .alg = "ecb(twofish)", 29701aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2971da7f033dSHerbert Xu .suite = { 2972da7f033dSHerbert Xu .cipher = { 297321c8e720SArd Biesheuvel .enc = __VECS(tf_enc_tv_template), 297421c8e720SArd Biesheuvel .dec = __VECS(tf_dec_tv_template) 2975da7f033dSHerbert Xu } 2976da7f033dSHerbert Xu } 2977da7f033dSHerbert Xu }, { 2978da7f033dSHerbert Xu .alg = "ecb(xeta)", 29791aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2980da7f033dSHerbert Xu .suite = { 2981da7f033dSHerbert Xu .cipher = { 298221c8e720SArd Biesheuvel .enc = __VECS(xeta_enc_tv_template), 298321c8e720SArd Biesheuvel .dec = __VECS(xeta_dec_tv_template) 2984da7f033dSHerbert Xu } 2985da7f033dSHerbert Xu } 2986da7f033dSHerbert Xu }, { 2987da7f033dSHerbert Xu .alg = "ecb(xtea)", 29881aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2989da7f033dSHerbert Xu .suite = { 2990da7f033dSHerbert Xu .cipher = { 299121c8e720SArd Biesheuvel .enc = __VECS(xtea_enc_tv_template), 299221c8e720SArd Biesheuvel .dec = __VECS(xtea_dec_tv_template) 2993da7f033dSHerbert Xu } 2994da7f033dSHerbert Xu } 2995da7f033dSHerbert Xu }, { 29963c4b2390SSalvatore Benedetto .alg = "ecdh", 29973c4b2390SSalvatore Benedetto .test = alg_test_kpp, 29983c4b2390SSalvatore Benedetto .fips_allowed = 1, 29993c4b2390SSalvatore Benedetto .suite = { 300021c8e720SArd Biesheuvel .kpp = __VECS(ecdh_tv_template) 30013c4b2390SSalvatore Benedetto } 30023c4b2390SSalvatore Benedetto }, { 3003da7f033dSHerbert Xu .alg = "gcm(aes)", 3004da7f033dSHerbert Xu .test = alg_test_aead, 3005a1915d51SJarod Wilson .fips_allowed = 1, 3006da7f033dSHerbert Xu .suite = { 3007da7f033dSHerbert Xu .aead = { 300821c8e720SArd Biesheuvel .enc = __VECS(aes_gcm_enc_tv_template), 300921c8e720SArd Biesheuvel .dec = __VECS(aes_gcm_dec_tv_template) 3010da7f033dSHerbert Xu } 3011da7f033dSHerbert Xu } 3012da7f033dSHerbert Xu }, { 3013507069c9SYouquan, Song .alg = "ghash", 3014507069c9SYouquan, Song .test = alg_test_hash, 301518c0ebd2SJarod Wilson .fips_allowed = 1, 3016507069c9SYouquan, Song .suite = { 301721c8e720SArd Biesheuvel .hash = __VECS(ghash_tv_template) 3018507069c9SYouquan, Song } 3019507069c9SYouquan, Song }, { 3020a482b081SSonic Zhang .alg = "hmac(crc32)", 3021a482b081SSonic Zhang .test = alg_test_hash, 3022a482b081SSonic Zhang .suite = { 302321c8e720SArd Biesheuvel .hash = __VECS(bfin_crc_tv_template) 3024a482b081SSonic Zhang } 3025a482b081SSonic Zhang }, { 3026da7f033dSHerbert Xu .alg = "hmac(md5)", 3027da7f033dSHerbert Xu .test = alg_test_hash, 3028da7f033dSHerbert Xu .suite = { 302921c8e720SArd Biesheuvel .hash = __VECS(hmac_md5_tv_template) 3030da7f033dSHerbert Xu } 3031da7f033dSHerbert Xu }, { 3032da7f033dSHerbert Xu .alg = "hmac(rmd128)", 3033da7f033dSHerbert Xu .test = alg_test_hash, 3034da7f033dSHerbert Xu .suite = { 303521c8e720SArd Biesheuvel .hash = __VECS(hmac_rmd128_tv_template) 3036da7f033dSHerbert Xu } 3037da7f033dSHerbert Xu }, { 3038da7f033dSHerbert Xu .alg = "hmac(rmd160)", 3039da7f033dSHerbert Xu .test = alg_test_hash, 3040da7f033dSHerbert Xu .suite = { 304121c8e720SArd Biesheuvel .hash = __VECS(hmac_rmd160_tv_template) 3042da7f033dSHerbert Xu } 3043da7f033dSHerbert Xu }, { 3044da7f033dSHerbert Xu .alg = "hmac(sha1)", 3045da7f033dSHerbert Xu .test = alg_test_hash, 3046a1915d51SJarod Wilson .fips_allowed = 1, 3047da7f033dSHerbert Xu .suite = { 304821c8e720SArd Biesheuvel .hash = __VECS(hmac_sha1_tv_template) 3049da7f033dSHerbert Xu } 3050da7f033dSHerbert Xu }, { 3051da7f033dSHerbert Xu .alg = "hmac(sha224)", 3052da7f033dSHerbert Xu .test = alg_test_hash, 3053a1915d51SJarod Wilson .fips_allowed = 1, 3054da7f033dSHerbert Xu .suite = { 305521c8e720SArd Biesheuvel .hash = __VECS(hmac_sha224_tv_template) 3056da7f033dSHerbert Xu } 3057da7f033dSHerbert Xu }, { 3058da7f033dSHerbert Xu .alg = "hmac(sha256)", 3059da7f033dSHerbert Xu .test = alg_test_hash, 3060a1915d51SJarod Wilson .fips_allowed = 1, 3061da7f033dSHerbert Xu .suite = { 306221c8e720SArd Biesheuvel .hash = __VECS(hmac_sha256_tv_template) 3063da7f033dSHerbert Xu } 3064da7f033dSHerbert Xu }, { 306598eca72fSraveendra padasalagi .alg = "hmac(sha3-224)", 306698eca72fSraveendra padasalagi .test = alg_test_hash, 306798eca72fSraveendra padasalagi .fips_allowed = 1, 306898eca72fSraveendra padasalagi .suite = { 306921c8e720SArd Biesheuvel .hash = __VECS(hmac_sha3_224_tv_template) 307098eca72fSraveendra padasalagi } 307198eca72fSraveendra padasalagi }, { 307298eca72fSraveendra padasalagi .alg = "hmac(sha3-256)", 307398eca72fSraveendra padasalagi .test = alg_test_hash, 307498eca72fSraveendra padasalagi .fips_allowed = 1, 307598eca72fSraveendra padasalagi .suite = { 307621c8e720SArd Biesheuvel .hash = __VECS(hmac_sha3_256_tv_template) 307798eca72fSraveendra padasalagi } 307898eca72fSraveendra padasalagi }, { 307998eca72fSraveendra padasalagi .alg = "hmac(sha3-384)", 308098eca72fSraveendra padasalagi .test = alg_test_hash, 308198eca72fSraveendra padasalagi .fips_allowed = 1, 308298eca72fSraveendra padasalagi .suite = { 308321c8e720SArd Biesheuvel .hash = __VECS(hmac_sha3_384_tv_template) 308498eca72fSraveendra padasalagi } 308598eca72fSraveendra padasalagi }, { 308698eca72fSraveendra padasalagi .alg = "hmac(sha3-512)", 308798eca72fSraveendra padasalagi .test = alg_test_hash, 308898eca72fSraveendra padasalagi .fips_allowed = 1, 308998eca72fSraveendra padasalagi .suite = { 309021c8e720SArd Biesheuvel .hash = __VECS(hmac_sha3_512_tv_template) 309198eca72fSraveendra padasalagi } 309298eca72fSraveendra padasalagi }, { 3093da7f033dSHerbert Xu .alg = "hmac(sha384)", 3094da7f033dSHerbert Xu .test = alg_test_hash, 3095a1915d51SJarod Wilson .fips_allowed = 1, 3096da7f033dSHerbert Xu .suite = { 309721c8e720SArd Biesheuvel .hash = __VECS(hmac_sha384_tv_template) 3098da7f033dSHerbert Xu } 3099da7f033dSHerbert Xu }, { 3100da7f033dSHerbert Xu .alg = "hmac(sha512)", 3101da7f033dSHerbert Xu .test = alg_test_hash, 3102a1915d51SJarod Wilson .fips_allowed = 1, 3103da7f033dSHerbert Xu .suite = { 310421c8e720SArd Biesheuvel .hash = __VECS(hmac_sha512_tv_template) 3105da7f033dSHerbert Xu } 3106da7f033dSHerbert Xu }, { 3107bb5530e4SStephan Mueller .alg = "jitterentropy_rng", 3108bb5530e4SStephan Mueller .fips_allowed = 1, 3109bb5530e4SStephan Mueller .test = alg_test_null, 3110bb5530e4SStephan Mueller }, { 311135351988SStephan Mueller .alg = "kw(aes)", 311235351988SStephan Mueller .test = alg_test_skcipher, 311335351988SStephan Mueller .fips_allowed = 1, 311435351988SStephan Mueller .suite = { 311535351988SStephan Mueller .cipher = { 311621c8e720SArd Biesheuvel .enc = __VECS(aes_kw_enc_tv_template), 311721c8e720SArd Biesheuvel .dec = __VECS(aes_kw_dec_tv_template) 311835351988SStephan Mueller } 311935351988SStephan Mueller } 312035351988SStephan Mueller }, { 3121da7f033dSHerbert Xu .alg = "lrw(aes)", 31221aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3123da7f033dSHerbert Xu .suite = { 3124da7f033dSHerbert Xu .cipher = { 312521c8e720SArd Biesheuvel .enc = __VECS(aes_lrw_enc_tv_template), 312621c8e720SArd Biesheuvel .dec = __VECS(aes_lrw_dec_tv_template) 3127da7f033dSHerbert Xu } 3128da7f033dSHerbert Xu } 3129da7f033dSHerbert Xu }, { 31300840605eSJussi Kivilinna .alg = "lrw(camellia)", 31310840605eSJussi Kivilinna .test = alg_test_skcipher, 31320840605eSJussi Kivilinna .suite = { 31330840605eSJussi Kivilinna .cipher = { 313421c8e720SArd Biesheuvel .enc = __VECS(camellia_lrw_enc_tv_template), 313521c8e720SArd Biesheuvel .dec = __VECS(camellia_lrw_dec_tv_template) 31360840605eSJussi Kivilinna } 31370840605eSJussi Kivilinna } 31380840605eSJussi Kivilinna }, { 31399b8b0405SJohannes Goetzfried .alg = "lrw(cast6)", 31409b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 31419b8b0405SJohannes Goetzfried .suite = { 31429b8b0405SJohannes Goetzfried .cipher = { 314321c8e720SArd Biesheuvel .enc = __VECS(cast6_lrw_enc_tv_template), 314421c8e720SArd Biesheuvel .dec = __VECS(cast6_lrw_dec_tv_template) 31459b8b0405SJohannes Goetzfried } 31469b8b0405SJohannes Goetzfried } 31479b8b0405SJohannes Goetzfried }, { 3148d7bfc0faSJussi Kivilinna .alg = "lrw(serpent)", 3149d7bfc0faSJussi Kivilinna .test = alg_test_skcipher, 3150d7bfc0faSJussi Kivilinna .suite = { 3151d7bfc0faSJussi Kivilinna .cipher = { 315221c8e720SArd Biesheuvel .enc = __VECS(serpent_lrw_enc_tv_template), 315321c8e720SArd Biesheuvel .dec = __VECS(serpent_lrw_dec_tv_template) 3154d7bfc0faSJussi Kivilinna } 3155d7bfc0faSJussi Kivilinna } 3156d7bfc0faSJussi Kivilinna }, { 31570b2a1551SJussi Kivilinna .alg = "lrw(twofish)", 31580b2a1551SJussi Kivilinna .test = alg_test_skcipher, 31590b2a1551SJussi Kivilinna .suite = { 31600b2a1551SJussi Kivilinna .cipher = { 316121c8e720SArd Biesheuvel .enc = __VECS(tf_lrw_enc_tv_template), 316221c8e720SArd Biesheuvel .dec = __VECS(tf_lrw_dec_tv_template) 31630b2a1551SJussi Kivilinna } 31640b2a1551SJussi Kivilinna } 31650b2a1551SJussi Kivilinna }, { 31661443cc9bSKOVACS Krisztian .alg = "lz4", 31671443cc9bSKOVACS Krisztian .test = alg_test_comp, 31681443cc9bSKOVACS Krisztian .fips_allowed = 1, 31691443cc9bSKOVACS Krisztian .suite = { 31701443cc9bSKOVACS Krisztian .comp = { 317121c8e720SArd Biesheuvel .comp = __VECS(lz4_comp_tv_template), 317221c8e720SArd Biesheuvel .decomp = __VECS(lz4_decomp_tv_template) 31731443cc9bSKOVACS Krisztian } 31741443cc9bSKOVACS Krisztian } 31751443cc9bSKOVACS Krisztian }, { 31761443cc9bSKOVACS Krisztian .alg = "lz4hc", 31771443cc9bSKOVACS Krisztian .test = alg_test_comp, 31781443cc9bSKOVACS Krisztian .fips_allowed = 1, 31791443cc9bSKOVACS Krisztian .suite = { 31801443cc9bSKOVACS Krisztian .comp = { 318121c8e720SArd Biesheuvel .comp = __VECS(lz4hc_comp_tv_template), 318221c8e720SArd Biesheuvel .decomp = __VECS(lz4hc_decomp_tv_template) 31831443cc9bSKOVACS Krisztian } 31841443cc9bSKOVACS Krisztian } 31851443cc9bSKOVACS Krisztian }, { 3186da7f033dSHerbert Xu .alg = "lzo", 3187da7f033dSHerbert Xu .test = alg_test_comp, 31880818904dSMilan Broz .fips_allowed = 1, 3189da7f033dSHerbert Xu .suite = { 3190da7f033dSHerbert Xu .comp = { 319121c8e720SArd Biesheuvel .comp = __VECS(lzo_comp_tv_template), 319221c8e720SArd Biesheuvel .decomp = __VECS(lzo_decomp_tv_template) 3193da7f033dSHerbert Xu } 3194da7f033dSHerbert Xu } 3195da7f033dSHerbert Xu }, { 3196da7f033dSHerbert Xu .alg = "md4", 3197da7f033dSHerbert Xu .test = alg_test_hash, 3198da7f033dSHerbert Xu .suite = { 319921c8e720SArd Biesheuvel .hash = __VECS(md4_tv_template) 3200da7f033dSHerbert Xu } 3201da7f033dSHerbert Xu }, { 3202da7f033dSHerbert Xu .alg = "md5", 3203da7f033dSHerbert Xu .test = alg_test_hash, 3204da7f033dSHerbert Xu .suite = { 320521c8e720SArd Biesheuvel .hash = __VECS(md5_tv_template) 3206da7f033dSHerbert Xu } 3207da7f033dSHerbert Xu }, { 3208da7f033dSHerbert Xu .alg = "michael_mic", 3209da7f033dSHerbert Xu .test = alg_test_hash, 3210da7f033dSHerbert Xu .suite = { 321121c8e720SArd Biesheuvel .hash = __VECS(michael_mic_tv_template) 3212da7f033dSHerbert Xu } 3213da7f033dSHerbert Xu }, { 3214ba0e14acSPuneet Saxena .alg = "ofb(aes)", 3215ba0e14acSPuneet Saxena .test = alg_test_skcipher, 3216ba0e14acSPuneet Saxena .fips_allowed = 1, 3217ba0e14acSPuneet Saxena .suite = { 3218ba0e14acSPuneet Saxena .cipher = { 321921c8e720SArd Biesheuvel .enc = __VECS(aes_ofb_enc_tv_template), 322021c8e720SArd Biesheuvel .dec = __VECS(aes_ofb_dec_tv_template) 3221ba0e14acSPuneet Saxena } 3222ba0e14acSPuneet Saxena } 3223ba0e14acSPuneet Saxena }, { 3224da7f033dSHerbert Xu .alg = "pcbc(fcrypt)", 32251aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3226da7f033dSHerbert Xu .suite = { 3227da7f033dSHerbert Xu .cipher = { 322821c8e720SArd Biesheuvel .enc = __VECS(fcrypt_pcbc_enc_tv_template), 322921c8e720SArd Biesheuvel .dec = __VECS(fcrypt_pcbc_dec_tv_template) 3230da7f033dSHerbert Xu } 3231da7f033dSHerbert Xu } 3232da7f033dSHerbert Xu }, { 3233eee9dc61SMartin Willi .alg = "poly1305", 3234eee9dc61SMartin Willi .test = alg_test_hash, 3235eee9dc61SMartin Willi .suite = { 323621c8e720SArd Biesheuvel .hash = __VECS(poly1305_tv_template) 3237eee9dc61SMartin Willi } 3238eee9dc61SMartin Willi }, { 3239da7f033dSHerbert Xu .alg = "rfc3686(ctr(aes))", 32401aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3241a1915d51SJarod Wilson .fips_allowed = 1, 3242da7f033dSHerbert Xu .suite = { 3243da7f033dSHerbert Xu .cipher = { 324421c8e720SArd Biesheuvel .enc = __VECS(aes_ctr_rfc3686_enc_tv_template), 324521c8e720SArd Biesheuvel .dec = __VECS(aes_ctr_rfc3686_dec_tv_template) 3246da7f033dSHerbert Xu } 3247da7f033dSHerbert Xu } 3248da7f033dSHerbert Xu }, { 32493f31a740SHerbert Xu .alg = "rfc4106(gcm(aes))", 325069435b94SAdrian Hoban .test = alg_test_aead, 3251db71f29aSJarod Wilson .fips_allowed = 1, 325269435b94SAdrian Hoban .suite = { 325369435b94SAdrian Hoban .aead = { 325421c8e720SArd Biesheuvel .enc = __VECS(aes_gcm_rfc4106_enc_tv_template), 325521c8e720SArd Biesheuvel .dec = __VECS(aes_gcm_rfc4106_dec_tv_template) 325669435b94SAdrian Hoban } 325769435b94SAdrian Hoban } 325869435b94SAdrian Hoban }, { 3259544c436aSHerbert Xu .alg = "rfc4309(ccm(aes))", 32605d667322SJarod Wilson .test = alg_test_aead, 3261a1915d51SJarod Wilson .fips_allowed = 1, 32625d667322SJarod Wilson .suite = { 32635d667322SJarod Wilson .aead = { 326421c8e720SArd Biesheuvel .enc = __VECS(aes_ccm_rfc4309_enc_tv_template), 326521c8e720SArd Biesheuvel .dec = __VECS(aes_ccm_rfc4309_dec_tv_template) 32665d667322SJarod Wilson } 32675d667322SJarod Wilson } 32685d667322SJarod Wilson }, { 3269bb68745eSHerbert Xu .alg = "rfc4543(gcm(aes))", 3270e9b7441aSJussi Kivilinna .test = alg_test_aead, 3271e9b7441aSJussi Kivilinna .suite = { 3272e9b7441aSJussi Kivilinna .aead = { 327321c8e720SArd Biesheuvel .enc = __VECS(aes_gcm_rfc4543_enc_tv_template), 327421c8e720SArd Biesheuvel .dec = __VECS(aes_gcm_rfc4543_dec_tv_template), 3275e9b7441aSJussi Kivilinna } 3276e9b7441aSJussi Kivilinna } 3277e9b7441aSJussi Kivilinna }, { 3278af2b76b5SMartin Willi .alg = "rfc7539(chacha20,poly1305)", 3279af2b76b5SMartin Willi .test = alg_test_aead, 3280af2b76b5SMartin Willi .suite = { 3281af2b76b5SMartin Willi .aead = { 328221c8e720SArd Biesheuvel .enc = __VECS(rfc7539_enc_tv_template), 328321c8e720SArd Biesheuvel .dec = __VECS(rfc7539_dec_tv_template), 3284af2b76b5SMartin Willi } 3285af2b76b5SMartin Willi } 3286af2b76b5SMartin Willi }, { 32875900758dSMartin Willi .alg = "rfc7539esp(chacha20,poly1305)", 32885900758dSMartin Willi .test = alg_test_aead, 32895900758dSMartin Willi .suite = { 32905900758dSMartin Willi .aead = { 329121c8e720SArd Biesheuvel .enc = __VECS(rfc7539esp_enc_tv_template), 329221c8e720SArd Biesheuvel .dec = __VECS(rfc7539esp_dec_tv_template), 32935900758dSMartin Willi } 32945900758dSMartin Willi } 32955900758dSMartin Willi }, { 3296da7f033dSHerbert Xu .alg = "rmd128", 3297da7f033dSHerbert Xu .test = alg_test_hash, 3298da7f033dSHerbert Xu .suite = { 329921c8e720SArd Biesheuvel .hash = __VECS(rmd128_tv_template) 3300da7f033dSHerbert Xu } 3301da7f033dSHerbert Xu }, { 3302da7f033dSHerbert Xu .alg = "rmd160", 3303da7f033dSHerbert Xu .test = alg_test_hash, 3304da7f033dSHerbert Xu .suite = { 330521c8e720SArd Biesheuvel .hash = __VECS(rmd160_tv_template) 3306da7f033dSHerbert Xu } 3307da7f033dSHerbert Xu }, { 3308da7f033dSHerbert Xu .alg = "rmd256", 3309da7f033dSHerbert Xu .test = alg_test_hash, 3310da7f033dSHerbert Xu .suite = { 331121c8e720SArd Biesheuvel .hash = __VECS(rmd256_tv_template) 3312da7f033dSHerbert Xu } 3313da7f033dSHerbert Xu }, { 3314da7f033dSHerbert Xu .alg = "rmd320", 3315da7f033dSHerbert Xu .test = alg_test_hash, 3316da7f033dSHerbert Xu .suite = { 331721c8e720SArd Biesheuvel .hash = __VECS(rmd320_tv_template) 3318da7f033dSHerbert Xu } 3319da7f033dSHerbert Xu }, { 3320946cc463STadeusz Struk .alg = "rsa", 3321946cc463STadeusz Struk .test = alg_test_akcipher, 3322946cc463STadeusz Struk .fips_allowed = 1, 3323946cc463STadeusz Struk .suite = { 332421c8e720SArd Biesheuvel .akcipher = __VECS(rsa_tv_template) 3325946cc463STadeusz Struk } 3326946cc463STadeusz Struk }, { 3327da7f033dSHerbert Xu .alg = "salsa20", 33281aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3329da7f033dSHerbert Xu .suite = { 3330da7f033dSHerbert Xu .cipher = { 333121c8e720SArd Biesheuvel .enc = __VECS(salsa20_stream_enc_tv_template) 3332da7f033dSHerbert Xu } 3333da7f033dSHerbert Xu } 3334da7f033dSHerbert Xu }, { 3335da7f033dSHerbert Xu .alg = "sha1", 3336da7f033dSHerbert Xu .test = alg_test_hash, 3337a1915d51SJarod Wilson .fips_allowed = 1, 3338da7f033dSHerbert Xu .suite = { 333921c8e720SArd Biesheuvel .hash = __VECS(sha1_tv_template) 3340da7f033dSHerbert Xu } 3341da7f033dSHerbert Xu }, { 3342da7f033dSHerbert Xu .alg = "sha224", 3343da7f033dSHerbert Xu .test = alg_test_hash, 3344a1915d51SJarod Wilson .fips_allowed = 1, 3345da7f033dSHerbert Xu .suite = { 334621c8e720SArd Biesheuvel .hash = __VECS(sha224_tv_template) 3347da7f033dSHerbert Xu } 3348da7f033dSHerbert Xu }, { 3349da7f033dSHerbert Xu .alg = "sha256", 3350da7f033dSHerbert Xu .test = alg_test_hash, 3351a1915d51SJarod Wilson .fips_allowed = 1, 3352da7f033dSHerbert Xu .suite = { 335321c8e720SArd Biesheuvel .hash = __VECS(sha256_tv_template) 3354da7f033dSHerbert Xu } 3355da7f033dSHerbert Xu }, { 335679cc6ab8Sraveendra padasalagi .alg = "sha3-224", 335779cc6ab8Sraveendra padasalagi .test = alg_test_hash, 335879cc6ab8Sraveendra padasalagi .fips_allowed = 1, 335979cc6ab8Sraveendra padasalagi .suite = { 336021c8e720SArd Biesheuvel .hash = __VECS(sha3_224_tv_template) 336179cc6ab8Sraveendra padasalagi } 336279cc6ab8Sraveendra padasalagi }, { 336379cc6ab8Sraveendra padasalagi .alg = "sha3-256", 336479cc6ab8Sraveendra padasalagi .test = alg_test_hash, 336579cc6ab8Sraveendra padasalagi .fips_allowed = 1, 336679cc6ab8Sraveendra padasalagi .suite = { 336721c8e720SArd Biesheuvel .hash = __VECS(sha3_256_tv_template) 336879cc6ab8Sraveendra padasalagi } 336979cc6ab8Sraveendra padasalagi }, { 337079cc6ab8Sraveendra padasalagi .alg = "sha3-384", 337179cc6ab8Sraveendra padasalagi .test = alg_test_hash, 337279cc6ab8Sraveendra padasalagi .fips_allowed = 1, 337379cc6ab8Sraveendra padasalagi .suite = { 337421c8e720SArd Biesheuvel .hash = __VECS(sha3_384_tv_template) 337579cc6ab8Sraveendra padasalagi } 337679cc6ab8Sraveendra padasalagi }, { 337779cc6ab8Sraveendra padasalagi .alg = "sha3-512", 337879cc6ab8Sraveendra padasalagi .test = alg_test_hash, 337979cc6ab8Sraveendra padasalagi .fips_allowed = 1, 338079cc6ab8Sraveendra padasalagi .suite = { 338121c8e720SArd Biesheuvel .hash = __VECS(sha3_512_tv_template) 338279cc6ab8Sraveendra padasalagi } 338379cc6ab8Sraveendra padasalagi }, { 3384da7f033dSHerbert Xu .alg = "sha384", 3385da7f033dSHerbert Xu .test = alg_test_hash, 3386a1915d51SJarod Wilson .fips_allowed = 1, 3387da7f033dSHerbert Xu .suite = { 338821c8e720SArd Biesheuvel .hash = __VECS(sha384_tv_template) 3389da7f033dSHerbert Xu } 3390da7f033dSHerbert Xu }, { 3391da7f033dSHerbert Xu .alg = "sha512", 3392da7f033dSHerbert Xu .test = alg_test_hash, 3393a1915d51SJarod Wilson .fips_allowed = 1, 3394da7f033dSHerbert Xu .suite = { 339521c8e720SArd Biesheuvel .hash = __VECS(sha512_tv_template) 3396da7f033dSHerbert Xu } 3397da7f033dSHerbert Xu }, { 3398da7f033dSHerbert Xu .alg = "tgr128", 3399da7f033dSHerbert Xu .test = alg_test_hash, 3400da7f033dSHerbert Xu .suite = { 340121c8e720SArd Biesheuvel .hash = __VECS(tgr128_tv_template) 3402da7f033dSHerbert Xu } 3403da7f033dSHerbert Xu }, { 3404da7f033dSHerbert Xu .alg = "tgr160", 3405da7f033dSHerbert Xu .test = alg_test_hash, 3406da7f033dSHerbert Xu .suite = { 340721c8e720SArd Biesheuvel .hash = __VECS(tgr160_tv_template) 3408da7f033dSHerbert Xu } 3409da7f033dSHerbert Xu }, { 3410da7f033dSHerbert Xu .alg = "tgr192", 3411da7f033dSHerbert Xu .test = alg_test_hash, 3412da7f033dSHerbert Xu .suite = { 341321c8e720SArd Biesheuvel .hash = __VECS(tgr192_tv_template) 3414da7f033dSHerbert Xu } 3415da7f033dSHerbert Xu }, { 3416f1939f7cSShane Wang .alg = "vmac(aes)", 3417f1939f7cSShane Wang .test = alg_test_hash, 3418f1939f7cSShane Wang .suite = { 341921c8e720SArd Biesheuvel .hash = __VECS(aes_vmac128_tv_template) 3420f1939f7cSShane Wang } 3421f1939f7cSShane Wang }, { 3422da7f033dSHerbert Xu .alg = "wp256", 3423da7f033dSHerbert Xu .test = alg_test_hash, 3424da7f033dSHerbert Xu .suite = { 342521c8e720SArd Biesheuvel .hash = __VECS(wp256_tv_template) 3426da7f033dSHerbert Xu } 3427da7f033dSHerbert Xu }, { 3428da7f033dSHerbert Xu .alg = "wp384", 3429da7f033dSHerbert Xu .test = alg_test_hash, 3430da7f033dSHerbert Xu .suite = { 343121c8e720SArd Biesheuvel .hash = __VECS(wp384_tv_template) 3432da7f033dSHerbert Xu } 3433da7f033dSHerbert Xu }, { 3434da7f033dSHerbert Xu .alg = "wp512", 3435da7f033dSHerbert Xu .test = alg_test_hash, 3436da7f033dSHerbert Xu .suite = { 343721c8e720SArd Biesheuvel .hash = __VECS(wp512_tv_template) 3438da7f033dSHerbert Xu } 3439da7f033dSHerbert Xu }, { 3440da7f033dSHerbert Xu .alg = "xcbc(aes)", 3441da7f033dSHerbert Xu .test = alg_test_hash, 3442da7f033dSHerbert Xu .suite = { 344321c8e720SArd Biesheuvel .hash = __VECS(aes_xcbc128_tv_template) 3444da7f033dSHerbert Xu } 3445da7f033dSHerbert Xu }, { 3446da7f033dSHerbert Xu .alg = "xts(aes)", 34471aa4ecd9SHerbert Xu .test = alg_test_skcipher, 34482918aa8dSJarod Wilson .fips_allowed = 1, 3449da7f033dSHerbert Xu .suite = { 3450da7f033dSHerbert Xu .cipher = { 345121c8e720SArd Biesheuvel .enc = __VECS(aes_xts_enc_tv_template), 345221c8e720SArd Biesheuvel .dec = __VECS(aes_xts_dec_tv_template) 3453da7f033dSHerbert Xu } 3454da7f033dSHerbert Xu } 34550c01aed5SGeert Uytterhoeven }, { 34560840605eSJussi Kivilinna .alg = "xts(camellia)", 34570840605eSJussi Kivilinna .test = alg_test_skcipher, 34580840605eSJussi Kivilinna .suite = { 34590840605eSJussi Kivilinna .cipher = { 346021c8e720SArd Biesheuvel .enc = __VECS(camellia_xts_enc_tv_template), 346121c8e720SArd Biesheuvel .dec = __VECS(camellia_xts_dec_tv_template) 34620840605eSJussi Kivilinna } 34630840605eSJussi Kivilinna } 34640840605eSJussi Kivilinna }, { 34659b8b0405SJohannes Goetzfried .alg = "xts(cast6)", 34669b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 34679b8b0405SJohannes Goetzfried .suite = { 34689b8b0405SJohannes Goetzfried .cipher = { 346921c8e720SArd Biesheuvel .enc = __VECS(cast6_xts_enc_tv_template), 347021c8e720SArd Biesheuvel .dec = __VECS(cast6_xts_dec_tv_template) 34719b8b0405SJohannes Goetzfried } 34729b8b0405SJohannes Goetzfried } 34739b8b0405SJohannes Goetzfried }, { 347418be20b9SJussi Kivilinna .alg = "xts(serpent)", 347518be20b9SJussi Kivilinna .test = alg_test_skcipher, 347618be20b9SJussi Kivilinna .suite = { 347718be20b9SJussi Kivilinna .cipher = { 347821c8e720SArd Biesheuvel .enc = __VECS(serpent_xts_enc_tv_template), 347921c8e720SArd Biesheuvel .dec = __VECS(serpent_xts_dec_tv_template) 348018be20b9SJussi Kivilinna } 348118be20b9SJussi Kivilinna } 348218be20b9SJussi Kivilinna }, { 3483aed265b9SJussi Kivilinna .alg = "xts(twofish)", 3484aed265b9SJussi Kivilinna .test = alg_test_skcipher, 3485aed265b9SJussi Kivilinna .suite = { 3486aed265b9SJussi Kivilinna .cipher = { 348721c8e720SArd Biesheuvel .enc = __VECS(tf_xts_enc_tv_template), 348821c8e720SArd Biesheuvel .dec = __VECS(tf_xts_dec_tv_template) 3489aed265b9SJussi Kivilinna } 3490aed265b9SJussi Kivilinna } 3491da7f033dSHerbert Xu } 3492da7f033dSHerbert Xu }; 3493da7f033dSHerbert Xu 34945714758bSJussi Kivilinna static bool alg_test_descs_checked; 34955714758bSJussi Kivilinna 34965714758bSJussi Kivilinna static void alg_test_descs_check_order(void) 34975714758bSJussi Kivilinna { 34985714758bSJussi Kivilinna int i; 34995714758bSJussi Kivilinna 35005714758bSJussi Kivilinna /* only check once */ 35015714758bSJussi Kivilinna if (alg_test_descs_checked) 35025714758bSJussi Kivilinna return; 35035714758bSJussi Kivilinna 35045714758bSJussi Kivilinna alg_test_descs_checked = true; 35055714758bSJussi Kivilinna 35065714758bSJussi Kivilinna for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) { 35075714758bSJussi Kivilinna int diff = strcmp(alg_test_descs[i - 1].alg, 35085714758bSJussi Kivilinna alg_test_descs[i].alg); 35095714758bSJussi Kivilinna 35105714758bSJussi Kivilinna if (WARN_ON(diff > 0)) { 35115714758bSJussi Kivilinna pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n", 35125714758bSJussi Kivilinna alg_test_descs[i - 1].alg, 35135714758bSJussi Kivilinna alg_test_descs[i].alg); 35145714758bSJussi Kivilinna } 35155714758bSJussi Kivilinna 35165714758bSJussi Kivilinna if (WARN_ON(diff == 0)) { 35175714758bSJussi Kivilinna pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n", 35185714758bSJussi Kivilinna alg_test_descs[i].alg); 35195714758bSJussi Kivilinna } 35205714758bSJussi Kivilinna } 35215714758bSJussi Kivilinna } 35225714758bSJussi Kivilinna 35231aa4ecd9SHerbert Xu static int alg_find_test(const char *alg) 3524da7f033dSHerbert Xu { 3525da7f033dSHerbert Xu int start = 0; 3526da7f033dSHerbert Xu int end = ARRAY_SIZE(alg_test_descs); 3527da7f033dSHerbert Xu 3528da7f033dSHerbert Xu while (start < end) { 3529da7f033dSHerbert Xu int i = (start + end) / 2; 3530da7f033dSHerbert Xu int diff = strcmp(alg_test_descs[i].alg, alg); 3531da7f033dSHerbert Xu 3532da7f033dSHerbert Xu if (diff > 0) { 3533da7f033dSHerbert Xu end = i; 3534da7f033dSHerbert Xu continue; 3535da7f033dSHerbert Xu } 3536da7f033dSHerbert Xu 3537da7f033dSHerbert Xu if (diff < 0) { 3538da7f033dSHerbert Xu start = i + 1; 3539da7f033dSHerbert Xu continue; 3540da7f033dSHerbert Xu } 3541da7f033dSHerbert Xu 35421aa4ecd9SHerbert Xu return i; 3543da7f033dSHerbert Xu } 3544da7f033dSHerbert Xu 35451aa4ecd9SHerbert Xu return -1; 35461aa4ecd9SHerbert Xu } 35471aa4ecd9SHerbert Xu 35481aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 35491aa4ecd9SHerbert Xu { 35501aa4ecd9SHerbert Xu int i; 3551a68f6610SHerbert Xu int j; 3552d12d6b6dSNeil Horman int rc; 35531aa4ecd9SHerbert Xu 35549e5c9fe4SRichard W.M. Jones if (!fips_enabled && notests) { 35559e5c9fe4SRichard W.M. Jones printk_once(KERN_INFO "alg: self-tests disabled\n"); 35569e5c9fe4SRichard W.M. Jones return 0; 35579e5c9fe4SRichard W.M. Jones } 35589e5c9fe4SRichard W.M. Jones 35595714758bSJussi Kivilinna alg_test_descs_check_order(); 35605714758bSJussi Kivilinna 35611aa4ecd9SHerbert Xu if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) { 35621aa4ecd9SHerbert Xu char nalg[CRYPTO_MAX_ALG_NAME]; 35631aa4ecd9SHerbert Xu 35641aa4ecd9SHerbert Xu if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >= 35651aa4ecd9SHerbert Xu sizeof(nalg)) 35661aa4ecd9SHerbert Xu return -ENAMETOOLONG; 35671aa4ecd9SHerbert Xu 35681aa4ecd9SHerbert Xu i = alg_find_test(nalg); 35691aa4ecd9SHerbert Xu if (i < 0) 35701aa4ecd9SHerbert Xu goto notest; 35711aa4ecd9SHerbert Xu 3572a3bef3a3SJarod Wilson if (fips_enabled && !alg_test_descs[i].fips_allowed) 3573a3bef3a3SJarod Wilson goto non_fips_alg; 3574a3bef3a3SJarod Wilson 3575941fb328SJarod Wilson rc = alg_test_cipher(alg_test_descs + i, driver, type, mask); 3576941fb328SJarod Wilson goto test_done; 35771aa4ecd9SHerbert Xu } 35781aa4ecd9SHerbert Xu 35791aa4ecd9SHerbert Xu i = alg_find_test(alg); 3580a68f6610SHerbert Xu j = alg_find_test(driver); 3581a68f6610SHerbert Xu if (i < 0 && j < 0) 35821aa4ecd9SHerbert Xu goto notest; 35831aa4ecd9SHerbert Xu 3584a68f6610SHerbert Xu if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) || 3585a68f6610SHerbert Xu (j >= 0 && !alg_test_descs[j].fips_allowed))) 3586a3bef3a3SJarod Wilson goto non_fips_alg; 3587a3bef3a3SJarod Wilson 3588a68f6610SHerbert Xu rc = 0; 3589a68f6610SHerbert Xu if (i >= 0) 3590a68f6610SHerbert Xu rc |= alg_test_descs[i].test(alg_test_descs + i, driver, 35911aa4ecd9SHerbert Xu type, mask); 3592032c8cacSCristian Stoica if (j >= 0 && j != i) 3593a68f6610SHerbert Xu rc |= alg_test_descs[j].test(alg_test_descs + j, driver, 3594a68f6610SHerbert Xu type, mask); 3595a68f6610SHerbert Xu 3596941fb328SJarod Wilson test_done: 3597d12d6b6dSNeil Horman if (fips_enabled && rc) 3598d12d6b6dSNeil Horman panic("%s: %s alg self test failed in fips mode!\n", driver, alg); 3599d12d6b6dSNeil Horman 360029ecd4abSJarod Wilson if (fips_enabled && !rc) 36013e8cffd4SMasanari Iida pr_info("alg: self-tests for %s (%s) passed\n", driver, alg); 360229ecd4abSJarod Wilson 3603d12d6b6dSNeil Horman return rc; 36041aa4ecd9SHerbert Xu 36051aa4ecd9SHerbert Xu notest: 3606da7f033dSHerbert Xu printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver); 3607da7f033dSHerbert Xu return 0; 3608a3bef3a3SJarod Wilson non_fips_alg: 3609a3bef3a3SJarod Wilson return -EINVAL; 3610da7f033dSHerbert Xu } 36110b767f96SAlexander Shishkin 3612326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */ 36130b767f96SAlexander Shishkin 3614da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test); 3615