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; 1461a9943a0aSGiovanni Cabiddu char *output, *decomp_out; 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 1471a9943a0aSGiovanni Cabiddu decomp_out = kmalloc(COMP_BUF_SIZE, GFP_KERNEL); 1472a9943a0aSGiovanni Cabiddu if (!decomp_out) { 1473a9943a0aSGiovanni Cabiddu kfree(output); 1474a9943a0aSGiovanni Cabiddu return -ENOMEM; 1475a9943a0aSGiovanni Cabiddu } 1476a9943a0aSGiovanni Cabiddu 1477d7db7a88SGiovanni Cabiddu for (i = 0; i < ctcount; i++) { 1478d7db7a88SGiovanni Cabiddu unsigned int dlen = COMP_BUF_SIZE; 1479d7db7a88SGiovanni Cabiddu int ilen = ctemplate[i].inlen; 148002608e02SLaura Abbott void *input_vec; 1481d7db7a88SGiovanni Cabiddu 1482d2110224SEric Biggers input_vec = kmemdup(ctemplate[i].input, ilen, GFP_KERNEL); 148302608e02SLaura Abbott if (!input_vec) { 148402608e02SLaura Abbott ret = -ENOMEM; 148502608e02SLaura Abbott goto out; 148602608e02SLaura Abbott } 148702608e02SLaura Abbott 1488eb095593SEric Biggers memset(output, 0, dlen); 1489d7db7a88SGiovanni Cabiddu init_completion(&result.completion); 149002608e02SLaura Abbott sg_init_one(&src, input_vec, ilen); 1491d7db7a88SGiovanni Cabiddu sg_init_one(&dst, output, dlen); 1492d7db7a88SGiovanni Cabiddu 1493d7db7a88SGiovanni Cabiddu req = acomp_request_alloc(tfm); 1494d7db7a88SGiovanni Cabiddu if (!req) { 1495d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: request alloc failed for %s\n", 1496d7db7a88SGiovanni Cabiddu algo); 149702608e02SLaura Abbott kfree(input_vec); 1498d7db7a88SGiovanni Cabiddu ret = -ENOMEM; 1499d7db7a88SGiovanni Cabiddu goto out; 1500d7db7a88SGiovanni Cabiddu } 1501d7db7a88SGiovanni Cabiddu 1502d7db7a88SGiovanni Cabiddu acomp_request_set_params(req, &src, &dst, ilen, dlen); 1503d7db7a88SGiovanni Cabiddu acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 1504d7db7a88SGiovanni Cabiddu tcrypt_complete, &result); 1505d7db7a88SGiovanni Cabiddu 1506d7db7a88SGiovanni Cabiddu ret = wait_async_op(&result, crypto_acomp_compress(req)); 1507d7db7a88SGiovanni Cabiddu if (ret) { 1508d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: compression failed on test %d for %s: ret=%d\n", 1509d7db7a88SGiovanni Cabiddu i + 1, algo, -ret); 151002608e02SLaura Abbott kfree(input_vec); 1511d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1512d7db7a88SGiovanni Cabiddu goto out; 1513d7db7a88SGiovanni Cabiddu } 1514d7db7a88SGiovanni Cabiddu 1515a9943a0aSGiovanni Cabiddu ilen = req->dlen; 1516a9943a0aSGiovanni Cabiddu dlen = COMP_BUF_SIZE; 1517a9943a0aSGiovanni Cabiddu sg_init_one(&src, output, ilen); 1518a9943a0aSGiovanni Cabiddu sg_init_one(&dst, decomp_out, dlen); 1519a9943a0aSGiovanni Cabiddu init_completion(&result.completion); 1520a9943a0aSGiovanni Cabiddu acomp_request_set_params(req, &src, &dst, ilen, dlen); 1521a9943a0aSGiovanni Cabiddu 1522a9943a0aSGiovanni Cabiddu ret = wait_async_op(&result, crypto_acomp_decompress(req)); 1523a9943a0aSGiovanni Cabiddu if (ret) { 1524a9943a0aSGiovanni Cabiddu pr_err("alg: acomp: compression failed on test %d for %s: ret=%d\n", 1525a9943a0aSGiovanni Cabiddu i + 1, algo, -ret); 1526a9943a0aSGiovanni Cabiddu kfree(input_vec); 1527a9943a0aSGiovanni Cabiddu acomp_request_free(req); 1528a9943a0aSGiovanni Cabiddu goto out; 1529a9943a0aSGiovanni Cabiddu } 1530a9943a0aSGiovanni Cabiddu 1531a9943a0aSGiovanni Cabiddu if (req->dlen != ctemplate[i].inlen) { 1532d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: Compression test %d failed for %s: output len = %d\n", 1533d7db7a88SGiovanni Cabiddu i + 1, algo, req->dlen); 1534d7db7a88SGiovanni Cabiddu ret = -EINVAL; 153502608e02SLaura Abbott kfree(input_vec); 1536d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1537d7db7a88SGiovanni Cabiddu goto out; 1538d7db7a88SGiovanni Cabiddu } 1539d7db7a88SGiovanni Cabiddu 1540a9943a0aSGiovanni Cabiddu if (memcmp(input_vec, decomp_out, req->dlen)) { 1541d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: Compression test %d failed for %s\n", 1542d7db7a88SGiovanni Cabiddu i + 1, algo); 1543d7db7a88SGiovanni Cabiddu hexdump(output, req->dlen); 1544d7db7a88SGiovanni Cabiddu ret = -EINVAL; 154502608e02SLaura Abbott kfree(input_vec); 1546d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1547d7db7a88SGiovanni Cabiddu goto out; 1548d7db7a88SGiovanni Cabiddu } 1549d7db7a88SGiovanni Cabiddu 155002608e02SLaura Abbott kfree(input_vec); 1551d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1552d7db7a88SGiovanni Cabiddu } 1553d7db7a88SGiovanni Cabiddu 1554d7db7a88SGiovanni Cabiddu for (i = 0; i < dtcount; i++) { 1555d7db7a88SGiovanni Cabiddu unsigned int dlen = COMP_BUF_SIZE; 1556d7db7a88SGiovanni Cabiddu int ilen = dtemplate[i].inlen; 155702608e02SLaura Abbott void *input_vec; 1558d7db7a88SGiovanni Cabiddu 1559d2110224SEric Biggers input_vec = kmemdup(dtemplate[i].input, ilen, GFP_KERNEL); 156002608e02SLaura Abbott if (!input_vec) { 156102608e02SLaura Abbott ret = -ENOMEM; 156202608e02SLaura Abbott goto out; 156302608e02SLaura Abbott } 156402608e02SLaura Abbott 1565eb095593SEric Biggers memset(output, 0, dlen); 1566d7db7a88SGiovanni Cabiddu init_completion(&result.completion); 156702608e02SLaura Abbott sg_init_one(&src, input_vec, ilen); 1568d7db7a88SGiovanni Cabiddu sg_init_one(&dst, output, dlen); 1569d7db7a88SGiovanni Cabiddu 1570d7db7a88SGiovanni Cabiddu req = acomp_request_alloc(tfm); 1571d7db7a88SGiovanni Cabiddu if (!req) { 1572d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: request alloc failed for %s\n", 1573d7db7a88SGiovanni Cabiddu algo); 157402608e02SLaura Abbott kfree(input_vec); 1575d7db7a88SGiovanni Cabiddu ret = -ENOMEM; 1576d7db7a88SGiovanni Cabiddu goto out; 1577d7db7a88SGiovanni Cabiddu } 1578d7db7a88SGiovanni Cabiddu 1579d7db7a88SGiovanni Cabiddu acomp_request_set_params(req, &src, &dst, ilen, dlen); 1580d7db7a88SGiovanni Cabiddu acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 1581d7db7a88SGiovanni Cabiddu tcrypt_complete, &result); 1582d7db7a88SGiovanni Cabiddu 1583d7db7a88SGiovanni Cabiddu ret = wait_async_op(&result, crypto_acomp_decompress(req)); 1584d7db7a88SGiovanni Cabiddu if (ret) { 1585d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: decompression failed on test %d for %s: ret=%d\n", 1586d7db7a88SGiovanni Cabiddu i + 1, algo, -ret); 158702608e02SLaura Abbott kfree(input_vec); 1588d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1589d7db7a88SGiovanni Cabiddu goto out; 1590d7db7a88SGiovanni Cabiddu } 1591d7db7a88SGiovanni Cabiddu 1592d7db7a88SGiovanni Cabiddu if (req->dlen != dtemplate[i].outlen) { 1593d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: Decompression test %d failed for %s: output len = %d\n", 1594d7db7a88SGiovanni Cabiddu i + 1, algo, req->dlen); 1595d7db7a88SGiovanni Cabiddu ret = -EINVAL; 159602608e02SLaura Abbott kfree(input_vec); 1597d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1598d7db7a88SGiovanni Cabiddu goto out; 1599d7db7a88SGiovanni Cabiddu } 1600d7db7a88SGiovanni Cabiddu 1601d7db7a88SGiovanni Cabiddu if (memcmp(output, dtemplate[i].output, req->dlen)) { 1602d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: Decompression test %d failed for %s\n", 1603d7db7a88SGiovanni Cabiddu i + 1, algo); 1604d7db7a88SGiovanni Cabiddu hexdump(output, req->dlen); 1605d7db7a88SGiovanni Cabiddu ret = -EINVAL; 160602608e02SLaura Abbott kfree(input_vec); 1607d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1608d7db7a88SGiovanni Cabiddu goto out; 1609d7db7a88SGiovanni Cabiddu } 1610d7db7a88SGiovanni Cabiddu 161102608e02SLaura Abbott kfree(input_vec); 1612d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1613d7db7a88SGiovanni Cabiddu } 1614d7db7a88SGiovanni Cabiddu 1615d7db7a88SGiovanni Cabiddu ret = 0; 1616d7db7a88SGiovanni Cabiddu 1617d7db7a88SGiovanni Cabiddu out: 1618a9943a0aSGiovanni Cabiddu kfree(decomp_out); 1619eb095593SEric Biggers kfree(output); 1620d7db7a88SGiovanni Cabiddu return ret; 1621d7db7a88SGiovanni Cabiddu } 1622d7db7a88SGiovanni Cabiddu 1623b13b1e0cSEric Biggers static int test_cprng(struct crypto_rng *tfm, 1624b13b1e0cSEric Biggers const struct cprng_testvec *template, 16257647d6ceSJarod Wilson unsigned int tcount) 16267647d6ceSJarod Wilson { 16277647d6ceSJarod Wilson const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm)); 1628fa4ef8a6SFelipe Contreras int err = 0, i, j, seedsize; 16297647d6ceSJarod Wilson u8 *seed; 16307647d6ceSJarod Wilson char result[32]; 16317647d6ceSJarod Wilson 16327647d6ceSJarod Wilson seedsize = crypto_rng_seedsize(tfm); 16337647d6ceSJarod Wilson 16347647d6ceSJarod Wilson seed = kmalloc(seedsize, GFP_KERNEL); 16357647d6ceSJarod Wilson if (!seed) { 16367647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to allocate seed space " 16377647d6ceSJarod Wilson "for %s\n", algo); 16387647d6ceSJarod Wilson return -ENOMEM; 16397647d6ceSJarod Wilson } 16407647d6ceSJarod Wilson 16417647d6ceSJarod Wilson for (i = 0; i < tcount; i++) { 16427647d6ceSJarod Wilson memset(result, 0, 32); 16437647d6ceSJarod Wilson 16447647d6ceSJarod Wilson memcpy(seed, template[i].v, template[i].vlen); 16457647d6ceSJarod Wilson memcpy(seed + template[i].vlen, template[i].key, 16467647d6ceSJarod Wilson template[i].klen); 16477647d6ceSJarod Wilson memcpy(seed + template[i].vlen + template[i].klen, 16487647d6ceSJarod Wilson template[i].dt, template[i].dtlen); 16497647d6ceSJarod Wilson 16507647d6ceSJarod Wilson err = crypto_rng_reset(tfm, seed, seedsize); 16517647d6ceSJarod Wilson if (err) { 16527647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to reset rng " 16537647d6ceSJarod Wilson "for %s\n", algo); 16547647d6ceSJarod Wilson goto out; 16557647d6ceSJarod Wilson } 16567647d6ceSJarod Wilson 16577647d6ceSJarod Wilson for (j = 0; j < template[i].loops; j++) { 16587647d6ceSJarod Wilson err = crypto_rng_get_bytes(tfm, result, 16597647d6ceSJarod Wilson template[i].rlen); 166019e60e13SStephan Mueller if (err < 0) { 16617647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to obtain " 16627647d6ceSJarod Wilson "the correct amount of random data for " 166319e60e13SStephan Mueller "%s (requested %d)\n", algo, 166419e60e13SStephan Mueller template[i].rlen); 16657647d6ceSJarod Wilson goto out; 16667647d6ceSJarod Wilson } 16677647d6ceSJarod Wilson } 16687647d6ceSJarod Wilson 16697647d6ceSJarod Wilson err = memcmp(result, template[i].result, 16707647d6ceSJarod Wilson template[i].rlen); 16717647d6ceSJarod Wilson if (err) { 16727647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Test %d failed for %s\n", 16737647d6ceSJarod Wilson i, algo); 16747647d6ceSJarod Wilson hexdump(result, template[i].rlen); 16757647d6ceSJarod Wilson err = -EINVAL; 16767647d6ceSJarod Wilson goto out; 16777647d6ceSJarod Wilson } 16787647d6ceSJarod Wilson } 16797647d6ceSJarod Wilson 16807647d6ceSJarod Wilson out: 16817647d6ceSJarod Wilson kfree(seed); 16827647d6ceSJarod Wilson return err; 16837647d6ceSJarod Wilson } 16847647d6ceSJarod Wilson 1685da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver, 1686da7f033dSHerbert Xu u32 type, u32 mask) 1687da7f033dSHerbert Xu { 1688da7f033dSHerbert Xu struct crypto_aead *tfm; 1689da7f033dSHerbert Xu int err = 0; 1690da7f033dSHerbert Xu 1691eed93e0cSHerbert Xu tfm = crypto_alloc_aead(driver, type, mask); 1692da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1693da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to load transform for %s: " 1694da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1695da7f033dSHerbert Xu return PTR_ERR(tfm); 1696da7f033dSHerbert Xu } 1697da7f033dSHerbert Xu 1698da7f033dSHerbert Xu if (desc->suite.aead.enc.vecs) { 1699da7f033dSHerbert Xu err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs, 1700da7f033dSHerbert Xu desc->suite.aead.enc.count); 1701da7f033dSHerbert Xu if (err) 1702da7f033dSHerbert Xu goto out; 1703da7f033dSHerbert Xu } 1704da7f033dSHerbert Xu 1705da7f033dSHerbert Xu if (!err && desc->suite.aead.dec.vecs) 1706da7f033dSHerbert Xu err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs, 1707da7f033dSHerbert Xu desc->suite.aead.dec.count); 1708da7f033dSHerbert Xu 1709da7f033dSHerbert Xu out: 1710da7f033dSHerbert Xu crypto_free_aead(tfm); 1711da7f033dSHerbert Xu return err; 1712da7f033dSHerbert Xu } 1713da7f033dSHerbert Xu 1714da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc, 1715da7f033dSHerbert Xu const char *driver, u32 type, u32 mask) 1716da7f033dSHerbert Xu { 17171aa4ecd9SHerbert Xu struct crypto_cipher *tfm; 1718da7f033dSHerbert Xu int err = 0; 1719da7f033dSHerbert Xu 1720eed93e0cSHerbert Xu tfm = crypto_alloc_cipher(driver, type, mask); 1721da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1722da7f033dSHerbert Xu printk(KERN_ERR "alg: cipher: Failed to load transform for " 1723da7f033dSHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 1724da7f033dSHerbert Xu return PTR_ERR(tfm); 1725da7f033dSHerbert Xu } 1726da7f033dSHerbert Xu 1727da7f033dSHerbert Xu if (desc->suite.cipher.enc.vecs) { 1728da7f033dSHerbert Xu err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 1729da7f033dSHerbert Xu desc->suite.cipher.enc.count); 1730da7f033dSHerbert Xu if (err) 1731da7f033dSHerbert Xu goto out; 1732da7f033dSHerbert Xu } 1733da7f033dSHerbert Xu 1734da7f033dSHerbert Xu if (desc->suite.cipher.dec.vecs) 1735da7f033dSHerbert Xu err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 1736da7f033dSHerbert Xu desc->suite.cipher.dec.count); 1737da7f033dSHerbert Xu 1738da7f033dSHerbert Xu out: 17391aa4ecd9SHerbert Xu crypto_free_cipher(tfm); 17401aa4ecd9SHerbert Xu return err; 17411aa4ecd9SHerbert Xu } 17421aa4ecd9SHerbert Xu 17431aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc, 17441aa4ecd9SHerbert Xu const char *driver, u32 type, u32 mask) 17451aa4ecd9SHerbert Xu { 174612773d93SHerbert Xu struct crypto_skcipher *tfm; 17471aa4ecd9SHerbert Xu int err = 0; 17481aa4ecd9SHerbert Xu 1749eed93e0cSHerbert Xu tfm = crypto_alloc_skcipher(driver, type, mask); 17501aa4ecd9SHerbert Xu if (IS_ERR(tfm)) { 17511aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Failed to load transform for " 17521aa4ecd9SHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 17531aa4ecd9SHerbert Xu return PTR_ERR(tfm); 17541aa4ecd9SHerbert Xu } 17551aa4ecd9SHerbert Xu 17561aa4ecd9SHerbert Xu if (desc->suite.cipher.enc.vecs) { 17571aa4ecd9SHerbert Xu err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 17581aa4ecd9SHerbert Xu desc->suite.cipher.enc.count); 17591aa4ecd9SHerbert Xu if (err) 17601aa4ecd9SHerbert Xu goto out; 17611aa4ecd9SHerbert Xu } 17621aa4ecd9SHerbert Xu 17631aa4ecd9SHerbert Xu if (desc->suite.cipher.dec.vecs) 17641aa4ecd9SHerbert Xu err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 17651aa4ecd9SHerbert Xu desc->suite.cipher.dec.count); 17661aa4ecd9SHerbert Xu 17671aa4ecd9SHerbert Xu out: 176812773d93SHerbert Xu crypto_free_skcipher(tfm); 1769da7f033dSHerbert Xu return err; 1770da7f033dSHerbert Xu } 1771da7f033dSHerbert Xu 1772da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver, 1773da7f033dSHerbert Xu u32 type, u32 mask) 1774da7f033dSHerbert Xu { 1775d7db7a88SGiovanni Cabiddu struct crypto_comp *comp; 1776d7db7a88SGiovanni Cabiddu struct crypto_acomp *acomp; 1777da7f033dSHerbert Xu int err; 1778d7db7a88SGiovanni Cabiddu u32 algo_type = type & CRYPTO_ALG_TYPE_ACOMPRESS_MASK; 1779da7f033dSHerbert Xu 1780d7db7a88SGiovanni Cabiddu if (algo_type == CRYPTO_ALG_TYPE_ACOMPRESS) { 1781d7db7a88SGiovanni Cabiddu acomp = crypto_alloc_acomp(driver, type, mask); 1782d7db7a88SGiovanni Cabiddu if (IS_ERR(acomp)) { 1783d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: Failed to load transform for %s: %ld\n", 1784d7db7a88SGiovanni Cabiddu driver, PTR_ERR(acomp)); 1785d7db7a88SGiovanni Cabiddu return PTR_ERR(acomp); 1786d7db7a88SGiovanni Cabiddu } 1787d7db7a88SGiovanni Cabiddu err = test_acomp(acomp, desc->suite.comp.comp.vecs, 1788d7db7a88SGiovanni Cabiddu desc->suite.comp.decomp.vecs, 1789d7db7a88SGiovanni Cabiddu desc->suite.comp.comp.count, 1790d7db7a88SGiovanni Cabiddu desc->suite.comp.decomp.count); 1791d7db7a88SGiovanni Cabiddu crypto_free_acomp(acomp); 1792d7db7a88SGiovanni Cabiddu } else { 1793d7db7a88SGiovanni Cabiddu comp = crypto_alloc_comp(driver, type, mask); 1794d7db7a88SGiovanni Cabiddu if (IS_ERR(comp)) { 1795d7db7a88SGiovanni Cabiddu pr_err("alg: comp: Failed to load transform for %s: %ld\n", 1796d7db7a88SGiovanni Cabiddu driver, PTR_ERR(comp)); 1797d7db7a88SGiovanni Cabiddu return PTR_ERR(comp); 1798da7f033dSHerbert Xu } 1799da7f033dSHerbert Xu 1800d7db7a88SGiovanni Cabiddu err = test_comp(comp, desc->suite.comp.comp.vecs, 1801da7f033dSHerbert Xu desc->suite.comp.decomp.vecs, 1802da7f033dSHerbert Xu desc->suite.comp.comp.count, 1803da7f033dSHerbert Xu desc->suite.comp.decomp.count); 1804da7f033dSHerbert Xu 1805d7db7a88SGiovanni Cabiddu crypto_free_comp(comp); 1806d7db7a88SGiovanni Cabiddu } 1807da7f033dSHerbert Xu return err; 1808da7f033dSHerbert Xu } 1809da7f033dSHerbert Xu 1810da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver, 1811da7f033dSHerbert Xu u32 type, u32 mask) 1812da7f033dSHerbert Xu { 1813da7f033dSHerbert Xu struct crypto_ahash *tfm; 1814da7f033dSHerbert Xu int err; 1815da7f033dSHerbert Xu 1816eed93e0cSHerbert Xu tfm = crypto_alloc_ahash(driver, type, mask); 1817da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1818da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to load transform for %s: " 1819da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1820da7f033dSHerbert Xu return PTR_ERR(tfm); 1821da7f033dSHerbert Xu } 1822da7f033dSHerbert Xu 1823a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1824a8f1a052SDavid S. Miller desc->suite.hash.count, true); 1825a8f1a052SDavid S. Miller if (!err) 1826a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1827a8f1a052SDavid S. Miller desc->suite.hash.count, false); 1828da7f033dSHerbert Xu 1829da7f033dSHerbert Xu crypto_free_ahash(tfm); 1830da7f033dSHerbert Xu return err; 1831da7f033dSHerbert Xu } 1832da7f033dSHerbert Xu 18338e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc, 18348e3ee85eSHerbert Xu const char *driver, u32 type, u32 mask) 18358e3ee85eSHerbert Xu { 18368e3ee85eSHerbert Xu struct crypto_shash *tfm; 18378e3ee85eSHerbert Xu u32 val; 18388e3ee85eSHerbert Xu int err; 18398e3ee85eSHerbert Xu 18408e3ee85eSHerbert Xu err = alg_test_hash(desc, driver, type, mask); 18418e3ee85eSHerbert Xu if (err) 18428e3ee85eSHerbert Xu goto out; 18438e3ee85eSHerbert Xu 1844eed93e0cSHerbert Xu tfm = crypto_alloc_shash(driver, type, mask); 18458e3ee85eSHerbert Xu if (IS_ERR(tfm)) { 18468e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: " 18478e3ee85eSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 18488e3ee85eSHerbert Xu err = PTR_ERR(tfm); 18498e3ee85eSHerbert Xu goto out; 18508e3ee85eSHerbert Xu } 18518e3ee85eSHerbert Xu 18528e3ee85eSHerbert Xu do { 18534c5c3024SJan-Simon Möller SHASH_DESC_ON_STACK(shash, tfm); 18544c5c3024SJan-Simon Möller u32 *ctx = (u32 *)shash_desc_ctx(shash); 18558e3ee85eSHerbert Xu 18564c5c3024SJan-Simon Möller shash->tfm = tfm; 18574c5c3024SJan-Simon Möller shash->flags = 0; 18588e3ee85eSHerbert Xu 18594c5c3024SJan-Simon Möller *ctx = le32_to_cpu(420553207); 18604c5c3024SJan-Simon Möller err = crypto_shash_final(shash, (u8 *)&val); 18618e3ee85eSHerbert Xu if (err) { 18628e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Operation failed for " 18638e3ee85eSHerbert Xu "%s: %d\n", driver, err); 18648e3ee85eSHerbert Xu break; 18658e3ee85eSHerbert Xu } 18668e3ee85eSHerbert Xu 18678e3ee85eSHerbert Xu if (val != ~420553207) { 18688e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Test failed for %s: " 18698e3ee85eSHerbert Xu "%d\n", driver, val); 18708e3ee85eSHerbert Xu err = -EINVAL; 18718e3ee85eSHerbert Xu } 18728e3ee85eSHerbert Xu } while (0); 18738e3ee85eSHerbert Xu 18748e3ee85eSHerbert Xu crypto_free_shash(tfm); 18758e3ee85eSHerbert Xu 18768e3ee85eSHerbert Xu out: 18778e3ee85eSHerbert Xu return err; 18788e3ee85eSHerbert Xu } 18798e3ee85eSHerbert Xu 18807647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver, 18817647d6ceSJarod Wilson u32 type, u32 mask) 18827647d6ceSJarod Wilson { 18837647d6ceSJarod Wilson struct crypto_rng *rng; 18847647d6ceSJarod Wilson int err; 18857647d6ceSJarod Wilson 1886eed93e0cSHerbert Xu rng = crypto_alloc_rng(driver, type, mask); 18877647d6ceSJarod Wilson if (IS_ERR(rng)) { 18887647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to load transform for %s: " 18897647d6ceSJarod Wilson "%ld\n", driver, PTR_ERR(rng)); 18907647d6ceSJarod Wilson return PTR_ERR(rng); 18917647d6ceSJarod Wilson } 18927647d6ceSJarod Wilson 18937647d6ceSJarod Wilson err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count); 18947647d6ceSJarod Wilson 18957647d6ceSJarod Wilson crypto_free_rng(rng); 18967647d6ceSJarod Wilson 18977647d6ceSJarod Wilson return err; 18987647d6ceSJarod Wilson } 18997647d6ceSJarod Wilson 190064d1cdfbSStephan Mueller 1901b13b1e0cSEric Biggers static int drbg_cavs_test(const struct drbg_testvec *test, int pr, 190264d1cdfbSStephan Mueller const char *driver, u32 type, u32 mask) 190364d1cdfbSStephan Mueller { 190464d1cdfbSStephan Mueller int ret = -EAGAIN; 190564d1cdfbSStephan Mueller struct crypto_rng *drng; 190664d1cdfbSStephan Mueller struct drbg_test_data test_data; 190764d1cdfbSStephan Mueller struct drbg_string addtl, pers, testentropy; 190864d1cdfbSStephan Mueller unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL); 190964d1cdfbSStephan Mueller 191064d1cdfbSStephan Mueller if (!buf) 191164d1cdfbSStephan Mueller return -ENOMEM; 191264d1cdfbSStephan Mueller 1913eed93e0cSHerbert Xu drng = crypto_alloc_rng(driver, type, mask); 191464d1cdfbSStephan Mueller if (IS_ERR(drng)) { 191564d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for " 191664d1cdfbSStephan Mueller "%s\n", driver); 191764d1cdfbSStephan Mueller kzfree(buf); 191864d1cdfbSStephan Mueller return -ENOMEM; 191964d1cdfbSStephan Mueller } 192064d1cdfbSStephan Mueller 192164d1cdfbSStephan Mueller test_data.testentropy = &testentropy; 192264d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entropy, test->entropylen); 192364d1cdfbSStephan Mueller drbg_string_fill(&pers, test->pers, test->perslen); 192464d1cdfbSStephan Mueller ret = crypto_drbg_reset_test(drng, &pers, &test_data); 192564d1cdfbSStephan Mueller if (ret) { 192664d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: Failed to reset rng\n"); 192764d1cdfbSStephan Mueller goto outbuf; 192864d1cdfbSStephan Mueller } 192964d1cdfbSStephan Mueller 193064d1cdfbSStephan Mueller drbg_string_fill(&addtl, test->addtla, test->addtllen); 193164d1cdfbSStephan Mueller if (pr) { 193264d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entpra, test->entprlen); 193364d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl_test(drng, 193464d1cdfbSStephan Mueller buf, test->expectedlen, &addtl, &test_data); 193564d1cdfbSStephan Mueller } else { 193664d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl(drng, 193764d1cdfbSStephan Mueller buf, test->expectedlen, &addtl); 193864d1cdfbSStephan Mueller } 193919e60e13SStephan Mueller if (ret < 0) { 194064d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not obtain random data for " 194164d1cdfbSStephan Mueller "driver %s\n", driver); 194264d1cdfbSStephan Mueller goto outbuf; 194364d1cdfbSStephan Mueller } 194464d1cdfbSStephan Mueller 194564d1cdfbSStephan Mueller drbg_string_fill(&addtl, test->addtlb, test->addtllen); 194664d1cdfbSStephan Mueller if (pr) { 194764d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entprb, test->entprlen); 194864d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl_test(drng, 194964d1cdfbSStephan Mueller buf, test->expectedlen, &addtl, &test_data); 195064d1cdfbSStephan Mueller } else { 195164d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl(drng, 195264d1cdfbSStephan Mueller buf, test->expectedlen, &addtl); 195364d1cdfbSStephan Mueller } 195419e60e13SStephan Mueller if (ret < 0) { 195564d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not obtain random data for " 195664d1cdfbSStephan Mueller "driver %s\n", driver); 195764d1cdfbSStephan Mueller goto outbuf; 195864d1cdfbSStephan Mueller } 195964d1cdfbSStephan Mueller 196064d1cdfbSStephan Mueller ret = memcmp(test->expected, buf, test->expectedlen); 196164d1cdfbSStephan Mueller 196264d1cdfbSStephan Mueller outbuf: 196364d1cdfbSStephan Mueller crypto_free_rng(drng); 196464d1cdfbSStephan Mueller kzfree(buf); 196564d1cdfbSStephan Mueller return ret; 196664d1cdfbSStephan Mueller } 196764d1cdfbSStephan Mueller 196864d1cdfbSStephan Mueller 196964d1cdfbSStephan Mueller static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver, 197064d1cdfbSStephan Mueller u32 type, u32 mask) 197164d1cdfbSStephan Mueller { 197264d1cdfbSStephan Mueller int err = 0; 197364d1cdfbSStephan Mueller int pr = 0; 197464d1cdfbSStephan Mueller int i = 0; 1975b13b1e0cSEric Biggers const struct drbg_testvec *template = desc->suite.drbg.vecs; 197664d1cdfbSStephan Mueller unsigned int tcount = desc->suite.drbg.count; 197764d1cdfbSStephan Mueller 197864d1cdfbSStephan Mueller if (0 == memcmp(driver, "drbg_pr_", 8)) 197964d1cdfbSStephan Mueller pr = 1; 198064d1cdfbSStephan Mueller 198164d1cdfbSStephan Mueller for (i = 0; i < tcount; i++) { 198264d1cdfbSStephan Mueller err = drbg_cavs_test(&template[i], pr, driver, type, mask); 198364d1cdfbSStephan Mueller if (err) { 198464d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: Test %d failed for %s\n", 198564d1cdfbSStephan Mueller i, driver); 198664d1cdfbSStephan Mueller err = -EINVAL; 198764d1cdfbSStephan Mueller break; 198864d1cdfbSStephan Mueller } 198964d1cdfbSStephan Mueller } 199064d1cdfbSStephan Mueller return err; 199164d1cdfbSStephan Mueller 199264d1cdfbSStephan Mueller } 199364d1cdfbSStephan Mueller 1994b13b1e0cSEric Biggers static int do_test_kpp(struct crypto_kpp *tfm, const struct kpp_testvec *vec, 1995802c7f1cSSalvatore Benedetto const char *alg) 1996802c7f1cSSalvatore Benedetto { 1997802c7f1cSSalvatore Benedetto struct kpp_request *req; 1998802c7f1cSSalvatore Benedetto void *input_buf = NULL; 1999802c7f1cSSalvatore Benedetto void *output_buf = NULL; 2000802c7f1cSSalvatore Benedetto struct tcrypt_result result; 2001802c7f1cSSalvatore Benedetto unsigned int out_len_max; 2002802c7f1cSSalvatore Benedetto int err = -ENOMEM; 2003802c7f1cSSalvatore Benedetto struct scatterlist src, dst; 2004802c7f1cSSalvatore Benedetto 2005802c7f1cSSalvatore Benedetto req = kpp_request_alloc(tfm, GFP_KERNEL); 2006802c7f1cSSalvatore Benedetto if (!req) 2007802c7f1cSSalvatore Benedetto return err; 2008802c7f1cSSalvatore Benedetto 2009802c7f1cSSalvatore Benedetto init_completion(&result.completion); 2010802c7f1cSSalvatore Benedetto 2011802c7f1cSSalvatore Benedetto err = crypto_kpp_set_secret(tfm, vec->secret, vec->secret_size); 2012802c7f1cSSalvatore Benedetto if (err < 0) 2013802c7f1cSSalvatore Benedetto goto free_req; 2014802c7f1cSSalvatore Benedetto 2015802c7f1cSSalvatore Benedetto out_len_max = crypto_kpp_maxsize(tfm); 2016802c7f1cSSalvatore Benedetto output_buf = kzalloc(out_len_max, GFP_KERNEL); 2017802c7f1cSSalvatore Benedetto if (!output_buf) { 2018802c7f1cSSalvatore Benedetto err = -ENOMEM; 2019802c7f1cSSalvatore Benedetto goto free_req; 2020802c7f1cSSalvatore Benedetto } 2021802c7f1cSSalvatore Benedetto 2022802c7f1cSSalvatore Benedetto /* Use appropriate parameter as base */ 2023802c7f1cSSalvatore Benedetto kpp_request_set_input(req, NULL, 0); 2024802c7f1cSSalvatore Benedetto sg_init_one(&dst, output_buf, out_len_max); 2025802c7f1cSSalvatore Benedetto kpp_request_set_output(req, &dst, out_len_max); 2026802c7f1cSSalvatore Benedetto kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 2027802c7f1cSSalvatore Benedetto tcrypt_complete, &result); 2028802c7f1cSSalvatore Benedetto 2029802c7f1cSSalvatore Benedetto /* Compute public key */ 2030802c7f1cSSalvatore Benedetto err = wait_async_op(&result, crypto_kpp_generate_public_key(req)); 2031802c7f1cSSalvatore Benedetto if (err) { 2032802c7f1cSSalvatore Benedetto pr_err("alg: %s: generate public key test failed. err %d\n", 2033802c7f1cSSalvatore Benedetto alg, err); 2034802c7f1cSSalvatore Benedetto goto free_output; 2035802c7f1cSSalvatore Benedetto } 2036802c7f1cSSalvatore Benedetto /* Verify calculated public key */ 2037802c7f1cSSalvatore Benedetto if (memcmp(vec->expected_a_public, sg_virt(req->dst), 2038802c7f1cSSalvatore Benedetto vec->expected_a_public_size)) { 2039802c7f1cSSalvatore Benedetto pr_err("alg: %s: generate public key test failed. Invalid output\n", 2040802c7f1cSSalvatore Benedetto alg); 2041802c7f1cSSalvatore Benedetto err = -EINVAL; 2042802c7f1cSSalvatore Benedetto goto free_output; 2043802c7f1cSSalvatore Benedetto } 2044802c7f1cSSalvatore Benedetto 2045802c7f1cSSalvatore Benedetto /* Calculate shared secret key by using counter part (b) public key. */ 2046802c7f1cSSalvatore Benedetto input_buf = kzalloc(vec->b_public_size, GFP_KERNEL); 2047802c7f1cSSalvatore Benedetto if (!input_buf) { 2048802c7f1cSSalvatore Benedetto err = -ENOMEM; 2049802c7f1cSSalvatore Benedetto goto free_output; 2050802c7f1cSSalvatore Benedetto } 2051802c7f1cSSalvatore Benedetto 2052802c7f1cSSalvatore Benedetto memcpy(input_buf, vec->b_public, vec->b_public_size); 2053802c7f1cSSalvatore Benedetto sg_init_one(&src, input_buf, vec->b_public_size); 2054802c7f1cSSalvatore Benedetto sg_init_one(&dst, output_buf, out_len_max); 2055802c7f1cSSalvatore Benedetto kpp_request_set_input(req, &src, vec->b_public_size); 2056802c7f1cSSalvatore Benedetto kpp_request_set_output(req, &dst, out_len_max); 2057802c7f1cSSalvatore Benedetto kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 2058802c7f1cSSalvatore Benedetto tcrypt_complete, &result); 2059802c7f1cSSalvatore Benedetto err = wait_async_op(&result, crypto_kpp_compute_shared_secret(req)); 2060802c7f1cSSalvatore Benedetto if (err) { 2061802c7f1cSSalvatore Benedetto pr_err("alg: %s: compute shard secret test failed. err %d\n", 2062802c7f1cSSalvatore Benedetto alg, err); 2063802c7f1cSSalvatore Benedetto goto free_all; 2064802c7f1cSSalvatore Benedetto } 2065802c7f1cSSalvatore Benedetto /* 2066802c7f1cSSalvatore Benedetto * verify shared secret from which the user will derive 2067802c7f1cSSalvatore Benedetto * secret key by executing whatever hash it has chosen 2068802c7f1cSSalvatore Benedetto */ 2069802c7f1cSSalvatore Benedetto if (memcmp(vec->expected_ss, sg_virt(req->dst), 2070802c7f1cSSalvatore Benedetto vec->expected_ss_size)) { 2071802c7f1cSSalvatore Benedetto pr_err("alg: %s: compute shared secret test failed. Invalid output\n", 2072802c7f1cSSalvatore Benedetto alg); 2073802c7f1cSSalvatore Benedetto err = -EINVAL; 2074802c7f1cSSalvatore Benedetto } 2075802c7f1cSSalvatore Benedetto 2076802c7f1cSSalvatore Benedetto free_all: 2077802c7f1cSSalvatore Benedetto kfree(input_buf); 2078802c7f1cSSalvatore Benedetto free_output: 2079802c7f1cSSalvatore Benedetto kfree(output_buf); 2080802c7f1cSSalvatore Benedetto free_req: 2081802c7f1cSSalvatore Benedetto kpp_request_free(req); 2082802c7f1cSSalvatore Benedetto return err; 2083802c7f1cSSalvatore Benedetto } 2084802c7f1cSSalvatore Benedetto 2085802c7f1cSSalvatore Benedetto static int test_kpp(struct crypto_kpp *tfm, const char *alg, 2086b13b1e0cSEric Biggers const struct kpp_testvec *vecs, unsigned int tcount) 2087802c7f1cSSalvatore Benedetto { 2088802c7f1cSSalvatore Benedetto int ret, i; 2089802c7f1cSSalvatore Benedetto 2090802c7f1cSSalvatore Benedetto for (i = 0; i < tcount; i++) { 2091802c7f1cSSalvatore Benedetto ret = do_test_kpp(tfm, vecs++, alg); 2092802c7f1cSSalvatore Benedetto if (ret) { 2093802c7f1cSSalvatore Benedetto pr_err("alg: %s: test failed on vector %d, err=%d\n", 2094802c7f1cSSalvatore Benedetto alg, i + 1, ret); 2095802c7f1cSSalvatore Benedetto return ret; 2096802c7f1cSSalvatore Benedetto } 2097802c7f1cSSalvatore Benedetto } 2098802c7f1cSSalvatore Benedetto return 0; 2099802c7f1cSSalvatore Benedetto } 2100802c7f1cSSalvatore Benedetto 2101802c7f1cSSalvatore Benedetto static int alg_test_kpp(const struct alg_test_desc *desc, const char *driver, 2102802c7f1cSSalvatore Benedetto u32 type, u32 mask) 2103802c7f1cSSalvatore Benedetto { 2104802c7f1cSSalvatore Benedetto struct crypto_kpp *tfm; 2105802c7f1cSSalvatore Benedetto int err = 0; 2106802c7f1cSSalvatore Benedetto 2107eed93e0cSHerbert Xu tfm = crypto_alloc_kpp(driver, type, mask); 2108802c7f1cSSalvatore Benedetto if (IS_ERR(tfm)) { 2109802c7f1cSSalvatore Benedetto pr_err("alg: kpp: Failed to load tfm for %s: %ld\n", 2110802c7f1cSSalvatore Benedetto driver, PTR_ERR(tfm)); 2111802c7f1cSSalvatore Benedetto return PTR_ERR(tfm); 2112802c7f1cSSalvatore Benedetto } 2113802c7f1cSSalvatore Benedetto if (desc->suite.kpp.vecs) 2114802c7f1cSSalvatore Benedetto err = test_kpp(tfm, desc->alg, desc->suite.kpp.vecs, 2115802c7f1cSSalvatore Benedetto desc->suite.kpp.count); 2116802c7f1cSSalvatore Benedetto 2117802c7f1cSSalvatore Benedetto crypto_free_kpp(tfm); 2118802c7f1cSSalvatore Benedetto return err; 2119802c7f1cSSalvatore Benedetto } 2120802c7f1cSSalvatore Benedetto 212150d2b643SHerbert Xu static int test_akcipher_one(struct crypto_akcipher *tfm, 2122b13b1e0cSEric Biggers const struct akcipher_testvec *vecs) 2123946cc463STadeusz Struk { 2124df27b26fSHerbert Xu char *xbuf[XBUFSIZE]; 2125946cc463STadeusz Struk struct akcipher_request *req; 2126946cc463STadeusz Struk void *outbuf_enc = NULL; 2127946cc463STadeusz Struk void *outbuf_dec = NULL; 2128946cc463STadeusz Struk struct tcrypt_result result; 2129946cc463STadeusz Struk unsigned int out_len_max, out_len = 0; 2130946cc463STadeusz Struk int err = -ENOMEM; 213122287b0bSTadeusz Struk struct scatterlist src, dst, src_tab[2]; 2132946cc463STadeusz Struk 2133df27b26fSHerbert Xu if (testmgr_alloc_buf(xbuf)) 2134df27b26fSHerbert Xu return err; 2135df27b26fSHerbert Xu 2136946cc463STadeusz Struk req = akcipher_request_alloc(tfm, GFP_KERNEL); 2137946cc463STadeusz Struk if (!req) 2138df27b26fSHerbert Xu goto free_xbuf; 2139946cc463STadeusz Struk 2140946cc463STadeusz Struk init_completion(&result.completion); 214122287b0bSTadeusz Struk 214222287b0bSTadeusz Struk if (vecs->public_key_vec) 214322287b0bSTadeusz Struk err = crypto_akcipher_set_pub_key(tfm, vecs->key, 214422287b0bSTadeusz Struk vecs->key_len); 214522287b0bSTadeusz Struk else 214622287b0bSTadeusz Struk err = crypto_akcipher_set_priv_key(tfm, vecs->key, 214722287b0bSTadeusz Struk vecs->key_len); 2148946cc463STadeusz Struk if (err) 2149946cc463STadeusz Struk goto free_req; 2150946cc463STadeusz Struk 215157763f5eSSalvatore Benedetto err = -ENOMEM; 215222287b0bSTadeusz Struk out_len_max = crypto_akcipher_maxsize(tfm); 2153946cc463STadeusz Struk outbuf_enc = kzalloc(out_len_max, GFP_KERNEL); 2154946cc463STadeusz Struk if (!outbuf_enc) 2155946cc463STadeusz Struk goto free_req; 2156946cc463STadeusz Struk 2157df27b26fSHerbert Xu if (WARN_ON(vecs->m_size > PAGE_SIZE)) 2158df27b26fSHerbert Xu goto free_all; 2159df27b26fSHerbert Xu 2160df27b26fSHerbert Xu memcpy(xbuf[0], vecs->m, vecs->m_size); 2161df27b26fSHerbert Xu 216222287b0bSTadeusz Struk sg_init_table(src_tab, 2); 2163df27b26fSHerbert Xu sg_set_buf(&src_tab[0], xbuf[0], 8); 2164df27b26fSHerbert Xu sg_set_buf(&src_tab[1], xbuf[0] + 8, vecs->m_size - 8); 216522287b0bSTadeusz Struk sg_init_one(&dst, outbuf_enc, out_len_max); 216622287b0bSTadeusz Struk akcipher_request_set_crypt(req, src_tab, &dst, vecs->m_size, 216722287b0bSTadeusz Struk out_len_max); 2168946cc463STadeusz Struk akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 2169946cc463STadeusz Struk tcrypt_complete, &result); 2170946cc463STadeusz Struk 2171946cc463STadeusz Struk /* Run RSA encrypt - c = m^e mod n;*/ 2172946cc463STadeusz Struk err = wait_async_op(&result, crypto_akcipher_encrypt(req)); 2173946cc463STadeusz Struk if (err) { 217450d2b643SHerbert Xu pr_err("alg: akcipher: encrypt test failed. err %d\n", err); 2175946cc463STadeusz Struk goto free_all; 2176946cc463STadeusz Struk } 217722287b0bSTadeusz Struk if (req->dst_len != vecs->c_size) { 217850d2b643SHerbert Xu pr_err("alg: akcipher: encrypt test failed. Invalid output len\n"); 2179946cc463STadeusz Struk err = -EINVAL; 2180946cc463STadeusz Struk goto free_all; 2181946cc463STadeusz Struk } 2182946cc463STadeusz Struk /* verify that encrypted message is equal to expected */ 2183df27b26fSHerbert Xu if (memcmp(vecs->c, outbuf_enc, vecs->c_size)) { 218450d2b643SHerbert Xu pr_err("alg: akcipher: encrypt test failed. Invalid output\n"); 218550d2b643SHerbert Xu hexdump(outbuf_enc, vecs->c_size); 2186946cc463STadeusz Struk err = -EINVAL; 2187946cc463STadeusz Struk goto free_all; 2188946cc463STadeusz Struk } 2189946cc463STadeusz Struk /* Don't invoke decrypt for vectors with public key */ 2190946cc463STadeusz Struk if (vecs->public_key_vec) { 2191946cc463STadeusz Struk err = 0; 2192946cc463STadeusz Struk goto free_all; 2193946cc463STadeusz Struk } 2194946cc463STadeusz Struk outbuf_dec = kzalloc(out_len_max, GFP_KERNEL); 2195946cc463STadeusz Struk if (!outbuf_dec) { 2196946cc463STadeusz Struk err = -ENOMEM; 2197946cc463STadeusz Struk goto free_all; 2198946cc463STadeusz Struk } 2199df27b26fSHerbert Xu 2200df27b26fSHerbert Xu if (WARN_ON(vecs->c_size > PAGE_SIZE)) 2201df27b26fSHerbert Xu goto free_all; 2202df27b26fSHerbert Xu 2203df27b26fSHerbert Xu memcpy(xbuf[0], vecs->c, vecs->c_size); 2204df27b26fSHerbert Xu 2205df27b26fSHerbert Xu sg_init_one(&src, xbuf[0], vecs->c_size); 220622287b0bSTadeusz Struk sg_init_one(&dst, outbuf_dec, out_len_max); 2207946cc463STadeusz Struk init_completion(&result.completion); 220822287b0bSTadeusz Struk akcipher_request_set_crypt(req, &src, &dst, vecs->c_size, out_len_max); 2209946cc463STadeusz Struk 2210946cc463STadeusz Struk /* Run RSA decrypt - m = c^d mod n;*/ 2211946cc463STadeusz Struk err = wait_async_op(&result, crypto_akcipher_decrypt(req)); 2212946cc463STadeusz Struk if (err) { 221350d2b643SHerbert Xu pr_err("alg: akcipher: decrypt test failed. err %d\n", err); 2214946cc463STadeusz Struk goto free_all; 2215946cc463STadeusz Struk } 2216946cc463STadeusz Struk out_len = req->dst_len; 221750d2b643SHerbert Xu if (out_len < vecs->m_size) { 221850d2b643SHerbert Xu pr_err("alg: akcipher: decrypt test failed. " 221950d2b643SHerbert Xu "Invalid output len %u\n", out_len); 2220946cc463STadeusz Struk err = -EINVAL; 2221946cc463STadeusz Struk goto free_all; 2222946cc463STadeusz Struk } 2223946cc463STadeusz Struk /* verify that decrypted message is equal to the original msg */ 222450d2b643SHerbert Xu if (memchr_inv(outbuf_dec, 0, out_len - vecs->m_size) || 222550d2b643SHerbert Xu memcmp(vecs->m, outbuf_dec + out_len - vecs->m_size, 222650d2b643SHerbert Xu vecs->m_size)) { 222750d2b643SHerbert Xu pr_err("alg: akcipher: decrypt test failed. Invalid output\n"); 222850d2b643SHerbert Xu hexdump(outbuf_dec, out_len); 2229946cc463STadeusz Struk err = -EINVAL; 2230946cc463STadeusz Struk } 2231946cc463STadeusz Struk free_all: 2232946cc463STadeusz Struk kfree(outbuf_dec); 2233946cc463STadeusz Struk kfree(outbuf_enc); 2234946cc463STadeusz Struk free_req: 2235946cc463STadeusz Struk akcipher_request_free(req); 2236df27b26fSHerbert Xu free_xbuf: 2237df27b26fSHerbert Xu testmgr_free_buf(xbuf); 2238946cc463STadeusz Struk return err; 2239946cc463STadeusz Struk } 2240946cc463STadeusz Struk 224150d2b643SHerbert Xu static int test_akcipher(struct crypto_akcipher *tfm, const char *alg, 2242b13b1e0cSEric Biggers const struct akcipher_testvec *vecs, 2243b13b1e0cSEric Biggers unsigned int tcount) 2244946cc463STadeusz Struk { 224515226e48SHerbert Xu const char *algo = 224615226e48SHerbert Xu crypto_tfm_alg_driver_name(crypto_akcipher_tfm(tfm)); 2247946cc463STadeusz Struk int ret, i; 2248946cc463STadeusz Struk 2249946cc463STadeusz Struk for (i = 0; i < tcount; i++) { 225050d2b643SHerbert Xu ret = test_akcipher_one(tfm, vecs++); 225150d2b643SHerbert Xu if (!ret) 225250d2b643SHerbert Xu continue; 225350d2b643SHerbert Xu 225415226e48SHerbert Xu pr_err("alg: akcipher: test %d failed for %s, err=%d\n", 225515226e48SHerbert Xu i + 1, algo, ret); 2256946cc463STadeusz Struk return ret; 2257946cc463STadeusz Struk } 2258946cc463STadeusz Struk return 0; 2259946cc463STadeusz Struk } 2260946cc463STadeusz Struk 2261946cc463STadeusz Struk static int alg_test_akcipher(const struct alg_test_desc *desc, 2262946cc463STadeusz Struk const char *driver, u32 type, u32 mask) 2263946cc463STadeusz Struk { 2264946cc463STadeusz Struk struct crypto_akcipher *tfm; 2265946cc463STadeusz Struk int err = 0; 2266946cc463STadeusz Struk 2267eed93e0cSHerbert Xu tfm = crypto_alloc_akcipher(driver, type, mask); 2268946cc463STadeusz Struk if (IS_ERR(tfm)) { 2269946cc463STadeusz Struk pr_err("alg: akcipher: Failed to load tfm for %s: %ld\n", 2270946cc463STadeusz Struk driver, PTR_ERR(tfm)); 2271946cc463STadeusz Struk return PTR_ERR(tfm); 2272946cc463STadeusz Struk } 2273946cc463STadeusz Struk if (desc->suite.akcipher.vecs) 2274946cc463STadeusz Struk err = test_akcipher(tfm, desc->alg, desc->suite.akcipher.vecs, 2275946cc463STadeusz Struk desc->suite.akcipher.count); 2276946cc463STadeusz Struk 2277946cc463STadeusz Struk crypto_free_akcipher(tfm); 2278946cc463STadeusz Struk return err; 2279946cc463STadeusz Struk } 2280946cc463STadeusz Struk 2281863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc, 2282863b557aSYouquan, Song const char *driver, u32 type, u32 mask) 2283863b557aSYouquan, Song { 2284863b557aSYouquan, Song return 0; 2285863b557aSYouquan, Song } 2286863b557aSYouquan, Song 228721c8e720SArd Biesheuvel #define __VECS(tv) { .vecs = tv, .count = ARRAY_SIZE(tv) } 228821c8e720SArd Biesheuvel 2289da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */ 2290da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = { 2291da7f033dSHerbert Xu { 2292e08ca2daSJarod Wilson .alg = "ansi_cprng", 2293e08ca2daSJarod Wilson .test = alg_test_cprng, 2294e08ca2daSJarod Wilson .suite = { 229521c8e720SArd Biesheuvel .cprng = __VECS(ansi_cprng_aes_tv_template) 2296e08ca2daSJarod Wilson } 2297e08ca2daSJarod Wilson }, { 2298bca4feb0SHoria Geanta .alg = "authenc(hmac(md5),ecb(cipher_null))", 2299bca4feb0SHoria Geanta .test = alg_test_aead, 2300bca4feb0SHoria Geanta .suite = { 2301bca4feb0SHoria Geanta .aead = { 230221c8e720SArd Biesheuvel .enc = __VECS(hmac_md5_ecb_cipher_null_enc_tv_template), 230321c8e720SArd Biesheuvel .dec = __VECS(hmac_md5_ecb_cipher_null_dec_tv_template) 2304bca4feb0SHoria Geanta } 2305bca4feb0SHoria Geanta } 2306bca4feb0SHoria Geanta }, { 2307a4198fd4SHerbert Xu .alg = "authenc(hmac(sha1),cbc(aes))", 2308e46e9a46SHoria Geanta .test = alg_test_aead, 2309e46e9a46SHoria Geanta .suite = { 2310e46e9a46SHoria Geanta .aead = { 231121c8e720SArd Biesheuvel .enc = __VECS(hmac_sha1_aes_cbc_enc_tv_temp) 23125208ed2cSNitesh Lal } 23135208ed2cSNitesh Lal } 23145208ed2cSNitesh Lal }, { 2315a4198fd4SHerbert Xu .alg = "authenc(hmac(sha1),cbc(des))", 23165208ed2cSNitesh Lal .test = alg_test_aead, 23175208ed2cSNitesh Lal .suite = { 23185208ed2cSNitesh Lal .aead = { 231921c8e720SArd Biesheuvel .enc = __VECS(hmac_sha1_des_cbc_enc_tv_temp) 23205208ed2cSNitesh Lal } 23215208ed2cSNitesh Lal } 23225208ed2cSNitesh Lal }, { 2323a4198fd4SHerbert Xu .alg = "authenc(hmac(sha1),cbc(des3_ede))", 23245208ed2cSNitesh Lal .test = alg_test_aead, 2325ed1afac9SMarcus Meissner .fips_allowed = 1, 23265208ed2cSNitesh Lal .suite = { 23275208ed2cSNitesh Lal .aead = { 232821c8e720SArd Biesheuvel .enc = __VECS(hmac_sha1_des3_ede_cbc_enc_tv_temp) 2329e46e9a46SHoria Geanta } 2330e46e9a46SHoria Geanta } 2331e46e9a46SHoria Geanta }, { 2332fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha1),ctr(aes))", 2333fb16abc2SMarcus Meissner .test = alg_test_null, 2334fb16abc2SMarcus Meissner .fips_allowed = 1, 2335fb16abc2SMarcus Meissner }, { 2336bca4feb0SHoria Geanta .alg = "authenc(hmac(sha1),ecb(cipher_null))", 2337bca4feb0SHoria Geanta .test = alg_test_aead, 2338bca4feb0SHoria Geanta .suite = { 2339bca4feb0SHoria Geanta .aead = { 234021c8e720SArd Biesheuvel .enc = __VECS(hmac_sha1_ecb_cipher_null_enc_tv_temp), 234121c8e720SArd Biesheuvel .dec = __VECS(hmac_sha1_ecb_cipher_null_dec_tv_temp) 23425208ed2cSNitesh Lal } 23435208ed2cSNitesh Lal } 23445208ed2cSNitesh Lal }, { 23458888690eSMarcus Meissner .alg = "authenc(hmac(sha1),rfc3686(ctr(aes)))", 23468888690eSMarcus Meissner .test = alg_test_null, 23478888690eSMarcus Meissner .fips_allowed = 1, 23488888690eSMarcus Meissner }, { 2349a4198fd4SHerbert Xu .alg = "authenc(hmac(sha224),cbc(des))", 23505208ed2cSNitesh Lal .test = alg_test_aead, 23515208ed2cSNitesh Lal .suite = { 23525208ed2cSNitesh Lal .aead = { 235321c8e720SArd Biesheuvel .enc = __VECS(hmac_sha224_des_cbc_enc_tv_temp) 23545208ed2cSNitesh Lal } 23555208ed2cSNitesh Lal } 23565208ed2cSNitesh Lal }, { 2357a4198fd4SHerbert Xu .alg = "authenc(hmac(sha224),cbc(des3_ede))", 23585208ed2cSNitesh Lal .test = alg_test_aead, 2359ed1afac9SMarcus Meissner .fips_allowed = 1, 23605208ed2cSNitesh Lal .suite = { 23615208ed2cSNitesh Lal .aead = { 236221c8e720SArd Biesheuvel .enc = __VECS(hmac_sha224_des3_ede_cbc_enc_tv_temp) 2363bca4feb0SHoria Geanta } 2364bca4feb0SHoria Geanta } 2365bca4feb0SHoria Geanta }, { 2366a4198fd4SHerbert Xu .alg = "authenc(hmac(sha256),cbc(aes))", 2367e46e9a46SHoria Geanta .test = alg_test_aead, 2368ed1afac9SMarcus Meissner .fips_allowed = 1, 2369e46e9a46SHoria Geanta .suite = { 2370e46e9a46SHoria Geanta .aead = { 237121c8e720SArd Biesheuvel .enc = __VECS(hmac_sha256_aes_cbc_enc_tv_temp) 23725208ed2cSNitesh Lal } 23735208ed2cSNitesh Lal } 23745208ed2cSNitesh Lal }, { 2375a4198fd4SHerbert Xu .alg = "authenc(hmac(sha256),cbc(des))", 23765208ed2cSNitesh Lal .test = alg_test_aead, 23775208ed2cSNitesh Lal .suite = { 23785208ed2cSNitesh Lal .aead = { 237921c8e720SArd Biesheuvel .enc = __VECS(hmac_sha256_des_cbc_enc_tv_temp) 23805208ed2cSNitesh Lal } 23815208ed2cSNitesh Lal } 23825208ed2cSNitesh Lal }, { 2383a4198fd4SHerbert Xu .alg = "authenc(hmac(sha256),cbc(des3_ede))", 23845208ed2cSNitesh Lal .test = alg_test_aead, 2385ed1afac9SMarcus Meissner .fips_allowed = 1, 23865208ed2cSNitesh Lal .suite = { 23875208ed2cSNitesh Lal .aead = { 238821c8e720SArd Biesheuvel .enc = __VECS(hmac_sha256_des3_ede_cbc_enc_tv_temp) 23895208ed2cSNitesh Lal } 23905208ed2cSNitesh Lal } 23915208ed2cSNitesh Lal }, { 2392fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha256),ctr(aes))", 2393fb16abc2SMarcus Meissner .test = alg_test_null, 2394fb16abc2SMarcus Meissner .fips_allowed = 1, 2395fb16abc2SMarcus Meissner }, { 23968888690eSMarcus Meissner .alg = "authenc(hmac(sha256),rfc3686(ctr(aes)))", 23978888690eSMarcus Meissner .test = alg_test_null, 23988888690eSMarcus Meissner .fips_allowed = 1, 23998888690eSMarcus Meissner }, { 2400a4198fd4SHerbert Xu .alg = "authenc(hmac(sha384),cbc(des))", 24015208ed2cSNitesh Lal .test = alg_test_aead, 24025208ed2cSNitesh Lal .suite = { 24035208ed2cSNitesh Lal .aead = { 240421c8e720SArd Biesheuvel .enc = __VECS(hmac_sha384_des_cbc_enc_tv_temp) 24055208ed2cSNitesh Lal } 24065208ed2cSNitesh Lal } 24075208ed2cSNitesh Lal }, { 2408a4198fd4SHerbert Xu .alg = "authenc(hmac(sha384),cbc(des3_ede))", 24095208ed2cSNitesh Lal .test = alg_test_aead, 2410ed1afac9SMarcus Meissner .fips_allowed = 1, 24115208ed2cSNitesh Lal .suite = { 24125208ed2cSNitesh Lal .aead = { 241321c8e720SArd Biesheuvel .enc = __VECS(hmac_sha384_des3_ede_cbc_enc_tv_temp) 2414e46e9a46SHoria Geanta } 2415e46e9a46SHoria Geanta } 2416e46e9a46SHoria Geanta }, { 2417fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha384),ctr(aes))", 2418fb16abc2SMarcus Meissner .test = alg_test_null, 2419fb16abc2SMarcus Meissner .fips_allowed = 1, 2420fb16abc2SMarcus Meissner }, { 24218888690eSMarcus Meissner .alg = "authenc(hmac(sha384),rfc3686(ctr(aes)))", 24228888690eSMarcus Meissner .test = alg_test_null, 24238888690eSMarcus Meissner .fips_allowed = 1, 24248888690eSMarcus Meissner }, { 2425a4198fd4SHerbert Xu .alg = "authenc(hmac(sha512),cbc(aes))", 2426ed1afac9SMarcus Meissner .fips_allowed = 1, 2427e46e9a46SHoria Geanta .test = alg_test_aead, 2428e46e9a46SHoria Geanta .suite = { 2429e46e9a46SHoria Geanta .aead = { 243021c8e720SArd Biesheuvel .enc = __VECS(hmac_sha512_aes_cbc_enc_tv_temp) 24315208ed2cSNitesh Lal } 24325208ed2cSNitesh Lal } 24335208ed2cSNitesh Lal }, { 2434a4198fd4SHerbert Xu .alg = "authenc(hmac(sha512),cbc(des))", 24355208ed2cSNitesh Lal .test = alg_test_aead, 24365208ed2cSNitesh Lal .suite = { 24375208ed2cSNitesh Lal .aead = { 243821c8e720SArd Biesheuvel .enc = __VECS(hmac_sha512_des_cbc_enc_tv_temp) 24395208ed2cSNitesh Lal } 24405208ed2cSNitesh Lal } 24415208ed2cSNitesh Lal }, { 2442a4198fd4SHerbert Xu .alg = "authenc(hmac(sha512),cbc(des3_ede))", 24435208ed2cSNitesh Lal .test = alg_test_aead, 2444ed1afac9SMarcus Meissner .fips_allowed = 1, 24455208ed2cSNitesh Lal .suite = { 24465208ed2cSNitesh Lal .aead = { 244721c8e720SArd Biesheuvel .enc = __VECS(hmac_sha512_des3_ede_cbc_enc_tv_temp) 2448e46e9a46SHoria Geanta } 2449e46e9a46SHoria Geanta } 2450e46e9a46SHoria Geanta }, { 2451fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha512),ctr(aes))", 2452fb16abc2SMarcus Meissner .test = alg_test_null, 2453fb16abc2SMarcus Meissner .fips_allowed = 1, 2454fb16abc2SMarcus Meissner }, { 24558888690eSMarcus Meissner .alg = "authenc(hmac(sha512),rfc3686(ctr(aes)))", 24568888690eSMarcus Meissner .test = alg_test_null, 24578888690eSMarcus Meissner .fips_allowed = 1, 24588888690eSMarcus Meissner }, { 2459da7f033dSHerbert Xu .alg = "cbc(aes)", 24601aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2461a1915d51SJarod Wilson .fips_allowed = 1, 2462da7f033dSHerbert Xu .suite = { 2463da7f033dSHerbert Xu .cipher = { 246421c8e720SArd Biesheuvel .enc = __VECS(aes_cbc_enc_tv_template), 246521c8e720SArd Biesheuvel .dec = __VECS(aes_cbc_dec_tv_template) 2466da7f033dSHerbert Xu } 2467da7f033dSHerbert Xu } 2468da7f033dSHerbert Xu }, { 2469da7f033dSHerbert Xu .alg = "cbc(anubis)", 24701aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2471da7f033dSHerbert Xu .suite = { 2472da7f033dSHerbert Xu .cipher = { 247321c8e720SArd Biesheuvel .enc = __VECS(anubis_cbc_enc_tv_template), 247421c8e720SArd Biesheuvel .dec = __VECS(anubis_cbc_dec_tv_template) 2475da7f033dSHerbert Xu } 2476da7f033dSHerbert Xu } 2477da7f033dSHerbert Xu }, { 2478da7f033dSHerbert Xu .alg = "cbc(blowfish)", 24791aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2480da7f033dSHerbert Xu .suite = { 2481da7f033dSHerbert Xu .cipher = { 248221c8e720SArd Biesheuvel .enc = __VECS(bf_cbc_enc_tv_template), 248321c8e720SArd Biesheuvel .dec = __VECS(bf_cbc_dec_tv_template) 2484da7f033dSHerbert Xu } 2485da7f033dSHerbert Xu } 2486da7f033dSHerbert Xu }, { 2487da7f033dSHerbert Xu .alg = "cbc(camellia)", 24881aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2489da7f033dSHerbert Xu .suite = { 2490da7f033dSHerbert Xu .cipher = { 249121c8e720SArd Biesheuvel .enc = __VECS(camellia_cbc_enc_tv_template), 249221c8e720SArd Biesheuvel .dec = __VECS(camellia_cbc_dec_tv_template) 2493da7f033dSHerbert Xu } 2494da7f033dSHerbert Xu } 2495da7f033dSHerbert Xu }, { 2496a2c58260SJohannes Goetzfried .alg = "cbc(cast5)", 2497a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 2498a2c58260SJohannes Goetzfried .suite = { 2499a2c58260SJohannes Goetzfried .cipher = { 250021c8e720SArd Biesheuvel .enc = __VECS(cast5_cbc_enc_tv_template), 250121c8e720SArd Biesheuvel .dec = __VECS(cast5_cbc_dec_tv_template) 2502a2c58260SJohannes Goetzfried } 2503a2c58260SJohannes Goetzfried } 2504a2c58260SJohannes Goetzfried }, { 25059b8b0405SJohannes Goetzfried .alg = "cbc(cast6)", 25069b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 25079b8b0405SJohannes Goetzfried .suite = { 25089b8b0405SJohannes Goetzfried .cipher = { 250921c8e720SArd Biesheuvel .enc = __VECS(cast6_cbc_enc_tv_template), 251021c8e720SArd Biesheuvel .dec = __VECS(cast6_cbc_dec_tv_template) 25119b8b0405SJohannes Goetzfried } 25129b8b0405SJohannes Goetzfried } 25139b8b0405SJohannes Goetzfried }, { 2514da7f033dSHerbert Xu .alg = "cbc(des)", 25151aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2516da7f033dSHerbert Xu .suite = { 2517da7f033dSHerbert Xu .cipher = { 251821c8e720SArd Biesheuvel .enc = __VECS(des_cbc_enc_tv_template), 251921c8e720SArd Biesheuvel .dec = __VECS(des_cbc_dec_tv_template) 2520da7f033dSHerbert Xu } 2521da7f033dSHerbert Xu } 2522da7f033dSHerbert Xu }, { 2523da7f033dSHerbert Xu .alg = "cbc(des3_ede)", 25241aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2525a1915d51SJarod Wilson .fips_allowed = 1, 2526da7f033dSHerbert Xu .suite = { 2527da7f033dSHerbert Xu .cipher = { 252821c8e720SArd Biesheuvel .enc = __VECS(des3_ede_cbc_enc_tv_template), 252921c8e720SArd Biesheuvel .dec = __VECS(des3_ede_cbc_dec_tv_template) 2530da7f033dSHerbert Xu } 2531da7f033dSHerbert Xu } 2532da7f033dSHerbert Xu }, { 25339d25917dSJussi Kivilinna .alg = "cbc(serpent)", 25349d25917dSJussi Kivilinna .test = alg_test_skcipher, 25359d25917dSJussi Kivilinna .suite = { 25369d25917dSJussi Kivilinna .cipher = { 253721c8e720SArd Biesheuvel .enc = __VECS(serpent_cbc_enc_tv_template), 253821c8e720SArd Biesheuvel .dec = __VECS(serpent_cbc_dec_tv_template) 25399d25917dSJussi Kivilinna } 25409d25917dSJussi Kivilinna } 25419d25917dSJussi Kivilinna }, { 2542da7f033dSHerbert Xu .alg = "cbc(twofish)", 25431aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2544da7f033dSHerbert Xu .suite = { 2545da7f033dSHerbert Xu .cipher = { 254621c8e720SArd Biesheuvel .enc = __VECS(tf_cbc_enc_tv_template), 254721c8e720SArd Biesheuvel .dec = __VECS(tf_cbc_dec_tv_template) 2548da7f033dSHerbert Xu } 2549da7f033dSHerbert Xu } 2550da7f033dSHerbert Xu }, { 2551092acf06SArd Biesheuvel .alg = "cbcmac(aes)", 2552092acf06SArd Biesheuvel .fips_allowed = 1, 2553092acf06SArd Biesheuvel .test = alg_test_hash, 2554092acf06SArd Biesheuvel .suite = { 2555092acf06SArd Biesheuvel .hash = __VECS(aes_cbcmac_tv_template) 2556092acf06SArd Biesheuvel } 2557092acf06SArd Biesheuvel }, { 2558da7f033dSHerbert Xu .alg = "ccm(aes)", 2559da7f033dSHerbert Xu .test = alg_test_aead, 2560a1915d51SJarod Wilson .fips_allowed = 1, 2561da7f033dSHerbert Xu .suite = { 2562da7f033dSHerbert Xu .aead = { 256321c8e720SArd Biesheuvel .enc = __VECS(aes_ccm_enc_tv_template), 256421c8e720SArd Biesheuvel .dec = __VECS(aes_ccm_dec_tv_template) 2565da7f033dSHerbert Xu } 2566da7f033dSHerbert Xu } 2567da7f033dSHerbert Xu }, { 25683590ebf2SMartin Willi .alg = "chacha20", 25693590ebf2SMartin Willi .test = alg_test_skcipher, 25703590ebf2SMartin Willi .suite = { 25713590ebf2SMartin Willi .cipher = { 257221c8e720SArd Biesheuvel .enc = __VECS(chacha20_enc_tv_template), 257321c8e720SArd Biesheuvel .dec = __VECS(chacha20_enc_tv_template), 25743590ebf2SMartin Willi } 25753590ebf2SMartin Willi } 25763590ebf2SMartin Willi }, { 257793b5e86aSJussi Kivilinna .alg = "cmac(aes)", 25788f183751SStephan Mueller .fips_allowed = 1, 257993b5e86aSJussi Kivilinna .test = alg_test_hash, 258093b5e86aSJussi Kivilinna .suite = { 258121c8e720SArd Biesheuvel .hash = __VECS(aes_cmac128_tv_template) 258293b5e86aSJussi Kivilinna } 258393b5e86aSJussi Kivilinna }, { 258493b5e86aSJussi Kivilinna .alg = "cmac(des3_ede)", 25858f183751SStephan Mueller .fips_allowed = 1, 258693b5e86aSJussi Kivilinna .test = alg_test_hash, 258793b5e86aSJussi Kivilinna .suite = { 258821c8e720SArd Biesheuvel .hash = __VECS(des3_ede_cmac64_tv_template) 258993b5e86aSJussi Kivilinna } 259093b5e86aSJussi Kivilinna }, { 2591e448370dSJussi Kivilinna .alg = "compress_null", 2592e448370dSJussi Kivilinna .test = alg_test_null, 2593e448370dSJussi Kivilinna }, { 2594ebb3472fSArd Biesheuvel .alg = "crc32", 2595ebb3472fSArd Biesheuvel .test = alg_test_hash, 2596ebb3472fSArd Biesheuvel .suite = { 259721c8e720SArd Biesheuvel .hash = __VECS(crc32_tv_template) 2598ebb3472fSArd Biesheuvel } 2599ebb3472fSArd Biesheuvel }, { 2600da7f033dSHerbert Xu .alg = "crc32c", 26018e3ee85eSHerbert Xu .test = alg_test_crc32c, 2602a1915d51SJarod Wilson .fips_allowed = 1, 2603da7f033dSHerbert Xu .suite = { 260421c8e720SArd Biesheuvel .hash = __VECS(crc32c_tv_template) 2605da7f033dSHerbert Xu } 2606da7f033dSHerbert Xu }, { 260768411521SHerbert Xu .alg = "crct10dif", 260868411521SHerbert Xu .test = alg_test_hash, 260968411521SHerbert Xu .fips_allowed = 1, 261068411521SHerbert Xu .suite = { 261121c8e720SArd Biesheuvel .hash = __VECS(crct10dif_tv_template) 261268411521SHerbert Xu } 261368411521SHerbert Xu }, { 2614f7cb80f2SJarod Wilson .alg = "ctr(aes)", 2615f7cb80f2SJarod Wilson .test = alg_test_skcipher, 2616a1915d51SJarod Wilson .fips_allowed = 1, 2617f7cb80f2SJarod Wilson .suite = { 2618f7cb80f2SJarod Wilson .cipher = { 261921c8e720SArd Biesheuvel .enc = __VECS(aes_ctr_enc_tv_template), 262021c8e720SArd Biesheuvel .dec = __VECS(aes_ctr_dec_tv_template) 2621f7cb80f2SJarod Wilson } 2622f7cb80f2SJarod Wilson } 2623f7cb80f2SJarod Wilson }, { 262485b63e34SJussi Kivilinna .alg = "ctr(blowfish)", 262585b63e34SJussi Kivilinna .test = alg_test_skcipher, 262685b63e34SJussi Kivilinna .suite = { 262785b63e34SJussi Kivilinna .cipher = { 262821c8e720SArd Biesheuvel .enc = __VECS(bf_ctr_enc_tv_template), 262921c8e720SArd Biesheuvel .dec = __VECS(bf_ctr_dec_tv_template) 263085b63e34SJussi Kivilinna } 263185b63e34SJussi Kivilinna } 263285b63e34SJussi Kivilinna }, { 26330840605eSJussi Kivilinna .alg = "ctr(camellia)", 26340840605eSJussi Kivilinna .test = alg_test_skcipher, 26350840605eSJussi Kivilinna .suite = { 26360840605eSJussi Kivilinna .cipher = { 263721c8e720SArd Biesheuvel .enc = __VECS(camellia_ctr_enc_tv_template), 263821c8e720SArd Biesheuvel .dec = __VECS(camellia_ctr_dec_tv_template) 26390840605eSJussi Kivilinna } 26400840605eSJussi Kivilinna } 26410840605eSJussi Kivilinna }, { 2642a2c58260SJohannes Goetzfried .alg = "ctr(cast5)", 2643a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 2644a2c58260SJohannes Goetzfried .suite = { 2645a2c58260SJohannes Goetzfried .cipher = { 264621c8e720SArd Biesheuvel .enc = __VECS(cast5_ctr_enc_tv_template), 264721c8e720SArd Biesheuvel .dec = __VECS(cast5_ctr_dec_tv_template) 2648a2c58260SJohannes Goetzfried } 2649a2c58260SJohannes Goetzfried } 2650a2c58260SJohannes Goetzfried }, { 26519b8b0405SJohannes Goetzfried .alg = "ctr(cast6)", 26529b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 26539b8b0405SJohannes Goetzfried .suite = { 26549b8b0405SJohannes Goetzfried .cipher = { 265521c8e720SArd Biesheuvel .enc = __VECS(cast6_ctr_enc_tv_template), 265621c8e720SArd Biesheuvel .dec = __VECS(cast6_ctr_dec_tv_template) 26579b8b0405SJohannes Goetzfried } 26589b8b0405SJohannes Goetzfried } 26599b8b0405SJohannes Goetzfried }, { 26608163fc30SJussi Kivilinna .alg = "ctr(des)", 26618163fc30SJussi Kivilinna .test = alg_test_skcipher, 26628163fc30SJussi Kivilinna .suite = { 26638163fc30SJussi Kivilinna .cipher = { 266421c8e720SArd Biesheuvel .enc = __VECS(des_ctr_enc_tv_template), 266521c8e720SArd Biesheuvel .dec = __VECS(des_ctr_dec_tv_template) 26668163fc30SJussi Kivilinna } 26678163fc30SJussi Kivilinna } 26688163fc30SJussi Kivilinna }, { 2669e080b17aSJussi Kivilinna .alg = "ctr(des3_ede)", 2670e080b17aSJussi Kivilinna .test = alg_test_skcipher, 26710d8da104SMarcelo Cerri .fips_allowed = 1, 2672e080b17aSJussi Kivilinna .suite = { 2673e080b17aSJussi Kivilinna .cipher = { 267421c8e720SArd Biesheuvel .enc = __VECS(des3_ede_ctr_enc_tv_template), 267521c8e720SArd Biesheuvel .dec = __VECS(des3_ede_ctr_dec_tv_template) 2676e080b17aSJussi Kivilinna } 2677e080b17aSJussi Kivilinna } 2678e080b17aSJussi Kivilinna }, { 26799d25917dSJussi Kivilinna .alg = "ctr(serpent)", 26809d25917dSJussi Kivilinna .test = alg_test_skcipher, 26819d25917dSJussi Kivilinna .suite = { 26829d25917dSJussi Kivilinna .cipher = { 268321c8e720SArd Biesheuvel .enc = __VECS(serpent_ctr_enc_tv_template), 268421c8e720SArd Biesheuvel .dec = __VECS(serpent_ctr_dec_tv_template) 26859d25917dSJussi Kivilinna } 26869d25917dSJussi Kivilinna } 26879d25917dSJussi Kivilinna }, { 2688573da620SJussi Kivilinna .alg = "ctr(twofish)", 2689573da620SJussi Kivilinna .test = alg_test_skcipher, 2690573da620SJussi Kivilinna .suite = { 2691573da620SJussi Kivilinna .cipher = { 269221c8e720SArd Biesheuvel .enc = __VECS(tf_ctr_enc_tv_template), 269321c8e720SArd Biesheuvel .dec = __VECS(tf_ctr_dec_tv_template) 2694573da620SJussi Kivilinna } 2695573da620SJussi Kivilinna } 2696573da620SJussi Kivilinna }, { 2697da7f033dSHerbert Xu .alg = "cts(cbc(aes))", 26981aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2699da7f033dSHerbert Xu .suite = { 2700da7f033dSHerbert Xu .cipher = { 270121c8e720SArd Biesheuvel .enc = __VECS(cts_mode_enc_tv_template), 270221c8e720SArd Biesheuvel .dec = __VECS(cts_mode_dec_tv_template) 2703da7f033dSHerbert Xu } 2704da7f033dSHerbert Xu } 2705da7f033dSHerbert Xu }, { 2706da7f033dSHerbert Xu .alg = "deflate", 2707da7f033dSHerbert Xu .test = alg_test_comp, 27080818904dSMilan Broz .fips_allowed = 1, 2709da7f033dSHerbert Xu .suite = { 2710da7f033dSHerbert Xu .comp = { 271121c8e720SArd Biesheuvel .comp = __VECS(deflate_comp_tv_template), 271221c8e720SArd Biesheuvel .decomp = __VECS(deflate_decomp_tv_template) 2713da7f033dSHerbert Xu } 2714da7f033dSHerbert Xu } 2715da7f033dSHerbert Xu }, { 2716802c7f1cSSalvatore Benedetto .alg = "dh", 2717802c7f1cSSalvatore Benedetto .test = alg_test_kpp, 2718802c7f1cSSalvatore Benedetto .fips_allowed = 1, 2719802c7f1cSSalvatore Benedetto .suite = { 272021c8e720SArd Biesheuvel .kpp = __VECS(dh_tv_template) 2721802c7f1cSSalvatore Benedetto } 2722802c7f1cSSalvatore Benedetto }, { 2723e448370dSJussi Kivilinna .alg = "digest_null", 2724e448370dSJussi Kivilinna .test = alg_test_null, 2725e448370dSJussi Kivilinna }, { 272664d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes128", 272764d1cdfbSStephan Mueller .test = alg_test_drbg, 272864d1cdfbSStephan Mueller .fips_allowed = 1, 272964d1cdfbSStephan Mueller .suite = { 273021c8e720SArd Biesheuvel .drbg = __VECS(drbg_nopr_ctr_aes128_tv_template) 273164d1cdfbSStephan Mueller } 273264d1cdfbSStephan Mueller }, { 273364d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes192", 273464d1cdfbSStephan Mueller .test = alg_test_drbg, 273564d1cdfbSStephan Mueller .fips_allowed = 1, 273664d1cdfbSStephan Mueller .suite = { 273721c8e720SArd Biesheuvel .drbg = __VECS(drbg_nopr_ctr_aes192_tv_template) 273864d1cdfbSStephan Mueller } 273964d1cdfbSStephan Mueller }, { 274064d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes256", 274164d1cdfbSStephan Mueller .test = alg_test_drbg, 274264d1cdfbSStephan Mueller .fips_allowed = 1, 274364d1cdfbSStephan Mueller .suite = { 274421c8e720SArd Biesheuvel .drbg = __VECS(drbg_nopr_ctr_aes256_tv_template) 274564d1cdfbSStephan Mueller } 274664d1cdfbSStephan Mueller }, { 274764d1cdfbSStephan Mueller /* 274864d1cdfbSStephan Mueller * There is no need to specifically test the DRBG with every 274964d1cdfbSStephan Mueller * backend cipher -- covered by drbg_nopr_hmac_sha256 test 275064d1cdfbSStephan Mueller */ 275164d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha1", 275264d1cdfbSStephan Mueller .fips_allowed = 1, 275364d1cdfbSStephan Mueller .test = alg_test_null, 275464d1cdfbSStephan Mueller }, { 275564d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha256", 275664d1cdfbSStephan Mueller .test = alg_test_drbg, 275764d1cdfbSStephan Mueller .fips_allowed = 1, 275864d1cdfbSStephan Mueller .suite = { 275921c8e720SArd Biesheuvel .drbg = __VECS(drbg_nopr_hmac_sha256_tv_template) 276064d1cdfbSStephan Mueller } 276164d1cdfbSStephan Mueller }, { 276264d1cdfbSStephan Mueller /* covered by drbg_nopr_hmac_sha256 test */ 276364d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha384", 276464d1cdfbSStephan Mueller .fips_allowed = 1, 276564d1cdfbSStephan Mueller .test = alg_test_null, 276664d1cdfbSStephan Mueller }, { 276764d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha512", 276864d1cdfbSStephan Mueller .test = alg_test_null, 276964d1cdfbSStephan Mueller .fips_allowed = 1, 277064d1cdfbSStephan Mueller }, { 277164d1cdfbSStephan Mueller .alg = "drbg_nopr_sha1", 277264d1cdfbSStephan Mueller .fips_allowed = 1, 277364d1cdfbSStephan Mueller .test = alg_test_null, 277464d1cdfbSStephan Mueller }, { 277564d1cdfbSStephan Mueller .alg = "drbg_nopr_sha256", 277664d1cdfbSStephan Mueller .test = alg_test_drbg, 277764d1cdfbSStephan Mueller .fips_allowed = 1, 277864d1cdfbSStephan Mueller .suite = { 277921c8e720SArd Biesheuvel .drbg = __VECS(drbg_nopr_sha256_tv_template) 278064d1cdfbSStephan Mueller } 278164d1cdfbSStephan Mueller }, { 278264d1cdfbSStephan Mueller /* covered by drbg_nopr_sha256 test */ 278364d1cdfbSStephan Mueller .alg = "drbg_nopr_sha384", 278464d1cdfbSStephan Mueller .fips_allowed = 1, 278564d1cdfbSStephan Mueller .test = alg_test_null, 278664d1cdfbSStephan Mueller }, { 278764d1cdfbSStephan Mueller .alg = "drbg_nopr_sha512", 278864d1cdfbSStephan Mueller .fips_allowed = 1, 278964d1cdfbSStephan Mueller .test = alg_test_null, 279064d1cdfbSStephan Mueller }, { 279164d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes128", 279264d1cdfbSStephan Mueller .test = alg_test_drbg, 279364d1cdfbSStephan Mueller .fips_allowed = 1, 279464d1cdfbSStephan Mueller .suite = { 279521c8e720SArd Biesheuvel .drbg = __VECS(drbg_pr_ctr_aes128_tv_template) 279664d1cdfbSStephan Mueller } 279764d1cdfbSStephan Mueller }, { 279864d1cdfbSStephan Mueller /* covered by drbg_pr_ctr_aes128 test */ 279964d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes192", 280064d1cdfbSStephan Mueller .fips_allowed = 1, 280164d1cdfbSStephan Mueller .test = alg_test_null, 280264d1cdfbSStephan Mueller }, { 280364d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes256", 280464d1cdfbSStephan Mueller .fips_allowed = 1, 280564d1cdfbSStephan Mueller .test = alg_test_null, 280664d1cdfbSStephan Mueller }, { 280764d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha1", 280864d1cdfbSStephan Mueller .fips_allowed = 1, 280964d1cdfbSStephan Mueller .test = alg_test_null, 281064d1cdfbSStephan Mueller }, { 281164d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha256", 281264d1cdfbSStephan Mueller .test = alg_test_drbg, 281364d1cdfbSStephan Mueller .fips_allowed = 1, 281464d1cdfbSStephan Mueller .suite = { 281521c8e720SArd Biesheuvel .drbg = __VECS(drbg_pr_hmac_sha256_tv_template) 281664d1cdfbSStephan Mueller } 281764d1cdfbSStephan Mueller }, { 281864d1cdfbSStephan Mueller /* covered by drbg_pr_hmac_sha256 test */ 281964d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha384", 282064d1cdfbSStephan Mueller .fips_allowed = 1, 282164d1cdfbSStephan Mueller .test = alg_test_null, 282264d1cdfbSStephan Mueller }, { 282364d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha512", 282464d1cdfbSStephan Mueller .test = alg_test_null, 282564d1cdfbSStephan Mueller .fips_allowed = 1, 282664d1cdfbSStephan Mueller }, { 282764d1cdfbSStephan Mueller .alg = "drbg_pr_sha1", 282864d1cdfbSStephan Mueller .fips_allowed = 1, 282964d1cdfbSStephan Mueller .test = alg_test_null, 283064d1cdfbSStephan Mueller }, { 283164d1cdfbSStephan Mueller .alg = "drbg_pr_sha256", 283264d1cdfbSStephan Mueller .test = alg_test_drbg, 283364d1cdfbSStephan Mueller .fips_allowed = 1, 283464d1cdfbSStephan Mueller .suite = { 283521c8e720SArd Biesheuvel .drbg = __VECS(drbg_pr_sha256_tv_template) 283664d1cdfbSStephan Mueller } 283764d1cdfbSStephan Mueller }, { 283864d1cdfbSStephan Mueller /* covered by drbg_pr_sha256 test */ 283964d1cdfbSStephan Mueller .alg = "drbg_pr_sha384", 284064d1cdfbSStephan Mueller .fips_allowed = 1, 284164d1cdfbSStephan Mueller .test = alg_test_null, 284264d1cdfbSStephan Mueller }, { 284364d1cdfbSStephan Mueller .alg = "drbg_pr_sha512", 284464d1cdfbSStephan Mueller .fips_allowed = 1, 284564d1cdfbSStephan Mueller .test = alg_test_null, 284664d1cdfbSStephan Mueller }, { 2847da7f033dSHerbert Xu .alg = "ecb(aes)", 28481aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2849a1915d51SJarod Wilson .fips_allowed = 1, 2850da7f033dSHerbert Xu .suite = { 2851da7f033dSHerbert Xu .cipher = { 285221c8e720SArd Biesheuvel .enc = __VECS(aes_enc_tv_template), 285321c8e720SArd Biesheuvel .dec = __VECS(aes_dec_tv_template) 2854da7f033dSHerbert Xu } 2855da7f033dSHerbert Xu } 2856da7f033dSHerbert Xu }, { 2857da7f033dSHerbert Xu .alg = "ecb(anubis)", 28581aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2859da7f033dSHerbert Xu .suite = { 2860da7f033dSHerbert Xu .cipher = { 286121c8e720SArd Biesheuvel .enc = __VECS(anubis_enc_tv_template), 286221c8e720SArd Biesheuvel .dec = __VECS(anubis_dec_tv_template) 2863da7f033dSHerbert Xu } 2864da7f033dSHerbert Xu } 2865da7f033dSHerbert Xu }, { 2866da7f033dSHerbert Xu .alg = "ecb(arc4)", 28671aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2868da7f033dSHerbert Xu .suite = { 2869da7f033dSHerbert Xu .cipher = { 287021c8e720SArd Biesheuvel .enc = __VECS(arc4_enc_tv_template), 287121c8e720SArd Biesheuvel .dec = __VECS(arc4_dec_tv_template) 2872da7f033dSHerbert Xu } 2873da7f033dSHerbert Xu } 2874da7f033dSHerbert Xu }, { 2875da7f033dSHerbert Xu .alg = "ecb(blowfish)", 28761aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2877da7f033dSHerbert Xu .suite = { 2878da7f033dSHerbert Xu .cipher = { 287921c8e720SArd Biesheuvel .enc = __VECS(bf_enc_tv_template), 288021c8e720SArd Biesheuvel .dec = __VECS(bf_dec_tv_template) 2881da7f033dSHerbert Xu } 2882da7f033dSHerbert Xu } 2883da7f033dSHerbert Xu }, { 2884da7f033dSHerbert Xu .alg = "ecb(camellia)", 28851aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2886da7f033dSHerbert Xu .suite = { 2887da7f033dSHerbert Xu .cipher = { 288821c8e720SArd Biesheuvel .enc = __VECS(camellia_enc_tv_template), 288921c8e720SArd Biesheuvel .dec = __VECS(camellia_dec_tv_template) 2890da7f033dSHerbert Xu } 2891da7f033dSHerbert Xu } 2892da7f033dSHerbert Xu }, { 2893da7f033dSHerbert Xu .alg = "ecb(cast5)", 28941aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2895da7f033dSHerbert Xu .suite = { 2896da7f033dSHerbert Xu .cipher = { 289721c8e720SArd Biesheuvel .enc = __VECS(cast5_enc_tv_template), 289821c8e720SArd Biesheuvel .dec = __VECS(cast5_dec_tv_template) 2899da7f033dSHerbert Xu } 2900da7f033dSHerbert Xu } 2901da7f033dSHerbert Xu }, { 2902da7f033dSHerbert Xu .alg = "ecb(cast6)", 29031aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2904da7f033dSHerbert Xu .suite = { 2905da7f033dSHerbert Xu .cipher = { 290621c8e720SArd Biesheuvel .enc = __VECS(cast6_enc_tv_template), 290721c8e720SArd Biesheuvel .dec = __VECS(cast6_dec_tv_template) 2908da7f033dSHerbert Xu } 2909da7f033dSHerbert Xu } 2910da7f033dSHerbert Xu }, { 2911e448370dSJussi Kivilinna .alg = "ecb(cipher_null)", 2912e448370dSJussi Kivilinna .test = alg_test_null, 29136175ca2bSMilan Broz .fips_allowed = 1, 2914e448370dSJussi Kivilinna }, { 2915da7f033dSHerbert Xu .alg = "ecb(des)", 29161aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2917da7f033dSHerbert Xu .suite = { 2918da7f033dSHerbert Xu .cipher = { 291921c8e720SArd Biesheuvel .enc = __VECS(des_enc_tv_template), 292021c8e720SArd Biesheuvel .dec = __VECS(des_dec_tv_template) 2921da7f033dSHerbert Xu } 2922da7f033dSHerbert Xu } 2923da7f033dSHerbert Xu }, { 2924da7f033dSHerbert Xu .alg = "ecb(des3_ede)", 29251aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2926a1915d51SJarod Wilson .fips_allowed = 1, 2927da7f033dSHerbert Xu .suite = { 2928da7f033dSHerbert Xu .cipher = { 292921c8e720SArd Biesheuvel .enc = __VECS(des3_ede_enc_tv_template), 293021c8e720SArd Biesheuvel .dec = __VECS(des3_ede_dec_tv_template) 2931da7f033dSHerbert Xu } 2932da7f033dSHerbert Xu } 2933da7f033dSHerbert Xu }, { 293466e5bd00SJussi Kivilinna .alg = "ecb(fcrypt)", 293566e5bd00SJussi Kivilinna .test = alg_test_skcipher, 293666e5bd00SJussi Kivilinna .suite = { 293766e5bd00SJussi Kivilinna .cipher = { 293866e5bd00SJussi Kivilinna .enc = { 293966e5bd00SJussi Kivilinna .vecs = fcrypt_pcbc_enc_tv_template, 294066e5bd00SJussi Kivilinna .count = 1 294166e5bd00SJussi Kivilinna }, 294266e5bd00SJussi Kivilinna .dec = { 294366e5bd00SJussi Kivilinna .vecs = fcrypt_pcbc_dec_tv_template, 294466e5bd00SJussi Kivilinna .count = 1 294566e5bd00SJussi Kivilinna } 294666e5bd00SJussi Kivilinna } 294766e5bd00SJussi Kivilinna } 294866e5bd00SJussi Kivilinna }, { 2949da7f033dSHerbert Xu .alg = "ecb(khazad)", 29501aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2951da7f033dSHerbert Xu .suite = { 2952da7f033dSHerbert Xu .cipher = { 295321c8e720SArd Biesheuvel .enc = __VECS(khazad_enc_tv_template), 295421c8e720SArd Biesheuvel .dec = __VECS(khazad_dec_tv_template) 2955da7f033dSHerbert Xu } 2956da7f033dSHerbert Xu } 2957da7f033dSHerbert Xu }, { 2958da7f033dSHerbert Xu .alg = "ecb(seed)", 29591aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2960da7f033dSHerbert Xu .suite = { 2961da7f033dSHerbert Xu .cipher = { 296221c8e720SArd Biesheuvel .enc = __VECS(seed_enc_tv_template), 296321c8e720SArd Biesheuvel .dec = __VECS(seed_dec_tv_template) 2964da7f033dSHerbert Xu } 2965da7f033dSHerbert Xu } 2966da7f033dSHerbert Xu }, { 2967da7f033dSHerbert Xu .alg = "ecb(serpent)", 29681aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2969da7f033dSHerbert Xu .suite = { 2970da7f033dSHerbert Xu .cipher = { 297121c8e720SArd Biesheuvel .enc = __VECS(serpent_enc_tv_template), 297221c8e720SArd Biesheuvel .dec = __VECS(serpent_dec_tv_template) 2973da7f033dSHerbert Xu } 2974da7f033dSHerbert Xu } 2975da7f033dSHerbert Xu }, { 2976da7f033dSHerbert Xu .alg = "ecb(tea)", 29771aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2978da7f033dSHerbert Xu .suite = { 2979da7f033dSHerbert Xu .cipher = { 298021c8e720SArd Biesheuvel .enc = __VECS(tea_enc_tv_template), 298121c8e720SArd Biesheuvel .dec = __VECS(tea_dec_tv_template) 2982da7f033dSHerbert Xu } 2983da7f033dSHerbert Xu } 2984da7f033dSHerbert Xu }, { 2985da7f033dSHerbert Xu .alg = "ecb(tnepres)", 29861aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2987da7f033dSHerbert Xu .suite = { 2988da7f033dSHerbert Xu .cipher = { 298921c8e720SArd Biesheuvel .enc = __VECS(tnepres_enc_tv_template), 299021c8e720SArd Biesheuvel .dec = __VECS(tnepres_dec_tv_template) 2991da7f033dSHerbert Xu } 2992da7f033dSHerbert Xu } 2993da7f033dSHerbert Xu }, { 2994da7f033dSHerbert Xu .alg = "ecb(twofish)", 29951aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2996da7f033dSHerbert Xu .suite = { 2997da7f033dSHerbert Xu .cipher = { 299821c8e720SArd Biesheuvel .enc = __VECS(tf_enc_tv_template), 299921c8e720SArd Biesheuvel .dec = __VECS(tf_dec_tv_template) 3000da7f033dSHerbert Xu } 3001da7f033dSHerbert Xu } 3002da7f033dSHerbert Xu }, { 3003da7f033dSHerbert Xu .alg = "ecb(xeta)", 30041aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3005da7f033dSHerbert Xu .suite = { 3006da7f033dSHerbert Xu .cipher = { 300721c8e720SArd Biesheuvel .enc = __VECS(xeta_enc_tv_template), 300821c8e720SArd Biesheuvel .dec = __VECS(xeta_dec_tv_template) 3009da7f033dSHerbert Xu } 3010da7f033dSHerbert Xu } 3011da7f033dSHerbert Xu }, { 3012da7f033dSHerbert Xu .alg = "ecb(xtea)", 30131aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3014da7f033dSHerbert Xu .suite = { 3015da7f033dSHerbert Xu .cipher = { 301621c8e720SArd Biesheuvel .enc = __VECS(xtea_enc_tv_template), 301721c8e720SArd Biesheuvel .dec = __VECS(xtea_dec_tv_template) 3018da7f033dSHerbert Xu } 3019da7f033dSHerbert Xu } 3020da7f033dSHerbert Xu }, { 30213c4b2390SSalvatore Benedetto .alg = "ecdh", 30223c4b2390SSalvatore Benedetto .test = alg_test_kpp, 30233c4b2390SSalvatore Benedetto .fips_allowed = 1, 30243c4b2390SSalvatore Benedetto .suite = { 302521c8e720SArd Biesheuvel .kpp = __VECS(ecdh_tv_template) 30263c4b2390SSalvatore Benedetto } 30273c4b2390SSalvatore Benedetto }, { 3028da7f033dSHerbert Xu .alg = "gcm(aes)", 3029da7f033dSHerbert Xu .test = alg_test_aead, 3030a1915d51SJarod Wilson .fips_allowed = 1, 3031da7f033dSHerbert Xu .suite = { 3032da7f033dSHerbert Xu .aead = { 303321c8e720SArd Biesheuvel .enc = __VECS(aes_gcm_enc_tv_template), 303421c8e720SArd Biesheuvel .dec = __VECS(aes_gcm_dec_tv_template) 3035da7f033dSHerbert Xu } 3036da7f033dSHerbert Xu } 3037da7f033dSHerbert Xu }, { 3038507069c9SYouquan, Song .alg = "ghash", 3039507069c9SYouquan, Song .test = alg_test_hash, 304018c0ebd2SJarod Wilson .fips_allowed = 1, 3041507069c9SYouquan, Song .suite = { 304221c8e720SArd Biesheuvel .hash = __VECS(ghash_tv_template) 3043507069c9SYouquan, Song } 3044507069c9SYouquan, Song }, { 3045a482b081SSonic Zhang .alg = "hmac(crc32)", 3046a482b081SSonic Zhang .test = alg_test_hash, 3047a482b081SSonic Zhang .suite = { 304821c8e720SArd Biesheuvel .hash = __VECS(bfin_crc_tv_template) 3049a482b081SSonic Zhang } 3050a482b081SSonic Zhang }, { 3051da7f033dSHerbert Xu .alg = "hmac(md5)", 3052da7f033dSHerbert Xu .test = alg_test_hash, 3053da7f033dSHerbert Xu .suite = { 305421c8e720SArd Biesheuvel .hash = __VECS(hmac_md5_tv_template) 3055da7f033dSHerbert Xu } 3056da7f033dSHerbert Xu }, { 3057da7f033dSHerbert Xu .alg = "hmac(rmd128)", 3058da7f033dSHerbert Xu .test = alg_test_hash, 3059da7f033dSHerbert Xu .suite = { 306021c8e720SArd Biesheuvel .hash = __VECS(hmac_rmd128_tv_template) 3061da7f033dSHerbert Xu } 3062da7f033dSHerbert Xu }, { 3063da7f033dSHerbert Xu .alg = "hmac(rmd160)", 3064da7f033dSHerbert Xu .test = alg_test_hash, 3065da7f033dSHerbert Xu .suite = { 306621c8e720SArd Biesheuvel .hash = __VECS(hmac_rmd160_tv_template) 3067da7f033dSHerbert Xu } 3068da7f033dSHerbert Xu }, { 3069da7f033dSHerbert Xu .alg = "hmac(sha1)", 3070da7f033dSHerbert Xu .test = alg_test_hash, 3071a1915d51SJarod Wilson .fips_allowed = 1, 3072da7f033dSHerbert Xu .suite = { 307321c8e720SArd Biesheuvel .hash = __VECS(hmac_sha1_tv_template) 3074da7f033dSHerbert Xu } 3075da7f033dSHerbert Xu }, { 3076da7f033dSHerbert Xu .alg = "hmac(sha224)", 3077da7f033dSHerbert Xu .test = alg_test_hash, 3078a1915d51SJarod Wilson .fips_allowed = 1, 3079da7f033dSHerbert Xu .suite = { 308021c8e720SArd Biesheuvel .hash = __VECS(hmac_sha224_tv_template) 3081da7f033dSHerbert Xu } 3082da7f033dSHerbert Xu }, { 3083da7f033dSHerbert Xu .alg = "hmac(sha256)", 3084da7f033dSHerbert Xu .test = alg_test_hash, 3085a1915d51SJarod Wilson .fips_allowed = 1, 3086da7f033dSHerbert Xu .suite = { 308721c8e720SArd Biesheuvel .hash = __VECS(hmac_sha256_tv_template) 3088da7f033dSHerbert Xu } 3089da7f033dSHerbert Xu }, { 309098eca72fSraveendra padasalagi .alg = "hmac(sha3-224)", 309198eca72fSraveendra padasalagi .test = alg_test_hash, 309298eca72fSraveendra padasalagi .fips_allowed = 1, 309398eca72fSraveendra padasalagi .suite = { 309421c8e720SArd Biesheuvel .hash = __VECS(hmac_sha3_224_tv_template) 309598eca72fSraveendra padasalagi } 309698eca72fSraveendra padasalagi }, { 309798eca72fSraveendra padasalagi .alg = "hmac(sha3-256)", 309898eca72fSraveendra padasalagi .test = alg_test_hash, 309998eca72fSraveendra padasalagi .fips_allowed = 1, 310098eca72fSraveendra padasalagi .suite = { 310121c8e720SArd Biesheuvel .hash = __VECS(hmac_sha3_256_tv_template) 310298eca72fSraveendra padasalagi } 310398eca72fSraveendra padasalagi }, { 310498eca72fSraveendra padasalagi .alg = "hmac(sha3-384)", 310598eca72fSraveendra padasalagi .test = alg_test_hash, 310698eca72fSraveendra padasalagi .fips_allowed = 1, 310798eca72fSraveendra padasalagi .suite = { 310821c8e720SArd Biesheuvel .hash = __VECS(hmac_sha3_384_tv_template) 310998eca72fSraveendra padasalagi } 311098eca72fSraveendra padasalagi }, { 311198eca72fSraveendra padasalagi .alg = "hmac(sha3-512)", 311298eca72fSraveendra padasalagi .test = alg_test_hash, 311398eca72fSraveendra padasalagi .fips_allowed = 1, 311498eca72fSraveendra padasalagi .suite = { 311521c8e720SArd Biesheuvel .hash = __VECS(hmac_sha3_512_tv_template) 311698eca72fSraveendra padasalagi } 311798eca72fSraveendra padasalagi }, { 3118da7f033dSHerbert Xu .alg = "hmac(sha384)", 3119da7f033dSHerbert Xu .test = alg_test_hash, 3120a1915d51SJarod Wilson .fips_allowed = 1, 3121da7f033dSHerbert Xu .suite = { 312221c8e720SArd Biesheuvel .hash = __VECS(hmac_sha384_tv_template) 3123da7f033dSHerbert Xu } 3124da7f033dSHerbert Xu }, { 3125da7f033dSHerbert Xu .alg = "hmac(sha512)", 3126da7f033dSHerbert Xu .test = alg_test_hash, 3127a1915d51SJarod Wilson .fips_allowed = 1, 3128da7f033dSHerbert Xu .suite = { 312921c8e720SArd Biesheuvel .hash = __VECS(hmac_sha512_tv_template) 3130da7f033dSHerbert Xu } 3131da7f033dSHerbert Xu }, { 3132bb5530e4SStephan Mueller .alg = "jitterentropy_rng", 3133bb5530e4SStephan Mueller .fips_allowed = 1, 3134bb5530e4SStephan Mueller .test = alg_test_null, 3135bb5530e4SStephan Mueller }, { 313635351988SStephan Mueller .alg = "kw(aes)", 313735351988SStephan Mueller .test = alg_test_skcipher, 313835351988SStephan Mueller .fips_allowed = 1, 313935351988SStephan Mueller .suite = { 314035351988SStephan Mueller .cipher = { 314121c8e720SArd Biesheuvel .enc = __VECS(aes_kw_enc_tv_template), 314221c8e720SArd Biesheuvel .dec = __VECS(aes_kw_dec_tv_template) 314335351988SStephan Mueller } 314435351988SStephan Mueller } 314535351988SStephan Mueller }, { 3146da7f033dSHerbert Xu .alg = "lrw(aes)", 31471aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3148da7f033dSHerbert Xu .suite = { 3149da7f033dSHerbert Xu .cipher = { 315021c8e720SArd Biesheuvel .enc = __VECS(aes_lrw_enc_tv_template), 315121c8e720SArd Biesheuvel .dec = __VECS(aes_lrw_dec_tv_template) 3152da7f033dSHerbert Xu } 3153da7f033dSHerbert Xu } 3154da7f033dSHerbert Xu }, { 31550840605eSJussi Kivilinna .alg = "lrw(camellia)", 31560840605eSJussi Kivilinna .test = alg_test_skcipher, 31570840605eSJussi Kivilinna .suite = { 31580840605eSJussi Kivilinna .cipher = { 315921c8e720SArd Biesheuvel .enc = __VECS(camellia_lrw_enc_tv_template), 316021c8e720SArd Biesheuvel .dec = __VECS(camellia_lrw_dec_tv_template) 31610840605eSJussi Kivilinna } 31620840605eSJussi Kivilinna } 31630840605eSJussi Kivilinna }, { 31649b8b0405SJohannes Goetzfried .alg = "lrw(cast6)", 31659b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 31669b8b0405SJohannes Goetzfried .suite = { 31679b8b0405SJohannes Goetzfried .cipher = { 316821c8e720SArd Biesheuvel .enc = __VECS(cast6_lrw_enc_tv_template), 316921c8e720SArd Biesheuvel .dec = __VECS(cast6_lrw_dec_tv_template) 31709b8b0405SJohannes Goetzfried } 31719b8b0405SJohannes Goetzfried } 31729b8b0405SJohannes Goetzfried }, { 3173d7bfc0faSJussi Kivilinna .alg = "lrw(serpent)", 3174d7bfc0faSJussi Kivilinna .test = alg_test_skcipher, 3175d7bfc0faSJussi Kivilinna .suite = { 3176d7bfc0faSJussi Kivilinna .cipher = { 317721c8e720SArd Biesheuvel .enc = __VECS(serpent_lrw_enc_tv_template), 317821c8e720SArd Biesheuvel .dec = __VECS(serpent_lrw_dec_tv_template) 3179d7bfc0faSJussi Kivilinna } 3180d7bfc0faSJussi Kivilinna } 3181d7bfc0faSJussi Kivilinna }, { 31820b2a1551SJussi Kivilinna .alg = "lrw(twofish)", 31830b2a1551SJussi Kivilinna .test = alg_test_skcipher, 31840b2a1551SJussi Kivilinna .suite = { 31850b2a1551SJussi Kivilinna .cipher = { 318621c8e720SArd Biesheuvel .enc = __VECS(tf_lrw_enc_tv_template), 318721c8e720SArd Biesheuvel .dec = __VECS(tf_lrw_dec_tv_template) 31880b2a1551SJussi Kivilinna } 31890b2a1551SJussi Kivilinna } 31900b2a1551SJussi Kivilinna }, { 31911443cc9bSKOVACS Krisztian .alg = "lz4", 31921443cc9bSKOVACS Krisztian .test = alg_test_comp, 31931443cc9bSKOVACS Krisztian .fips_allowed = 1, 31941443cc9bSKOVACS Krisztian .suite = { 31951443cc9bSKOVACS Krisztian .comp = { 319621c8e720SArd Biesheuvel .comp = __VECS(lz4_comp_tv_template), 319721c8e720SArd Biesheuvel .decomp = __VECS(lz4_decomp_tv_template) 31981443cc9bSKOVACS Krisztian } 31991443cc9bSKOVACS Krisztian } 32001443cc9bSKOVACS Krisztian }, { 32011443cc9bSKOVACS Krisztian .alg = "lz4hc", 32021443cc9bSKOVACS Krisztian .test = alg_test_comp, 32031443cc9bSKOVACS Krisztian .fips_allowed = 1, 32041443cc9bSKOVACS Krisztian .suite = { 32051443cc9bSKOVACS Krisztian .comp = { 320621c8e720SArd Biesheuvel .comp = __VECS(lz4hc_comp_tv_template), 320721c8e720SArd Biesheuvel .decomp = __VECS(lz4hc_decomp_tv_template) 32081443cc9bSKOVACS Krisztian } 32091443cc9bSKOVACS Krisztian } 32101443cc9bSKOVACS Krisztian }, { 3211da7f033dSHerbert Xu .alg = "lzo", 3212da7f033dSHerbert Xu .test = alg_test_comp, 32130818904dSMilan Broz .fips_allowed = 1, 3214da7f033dSHerbert Xu .suite = { 3215da7f033dSHerbert Xu .comp = { 321621c8e720SArd Biesheuvel .comp = __VECS(lzo_comp_tv_template), 321721c8e720SArd Biesheuvel .decomp = __VECS(lzo_decomp_tv_template) 3218da7f033dSHerbert Xu } 3219da7f033dSHerbert Xu } 3220da7f033dSHerbert Xu }, { 3221da7f033dSHerbert Xu .alg = "md4", 3222da7f033dSHerbert Xu .test = alg_test_hash, 3223da7f033dSHerbert Xu .suite = { 322421c8e720SArd Biesheuvel .hash = __VECS(md4_tv_template) 3225da7f033dSHerbert Xu } 3226da7f033dSHerbert Xu }, { 3227da7f033dSHerbert Xu .alg = "md5", 3228da7f033dSHerbert Xu .test = alg_test_hash, 3229da7f033dSHerbert Xu .suite = { 323021c8e720SArd Biesheuvel .hash = __VECS(md5_tv_template) 3231da7f033dSHerbert Xu } 3232da7f033dSHerbert Xu }, { 3233da7f033dSHerbert Xu .alg = "michael_mic", 3234da7f033dSHerbert Xu .test = alg_test_hash, 3235da7f033dSHerbert Xu .suite = { 323621c8e720SArd Biesheuvel .hash = __VECS(michael_mic_tv_template) 3237da7f033dSHerbert Xu } 3238da7f033dSHerbert Xu }, { 3239ba0e14acSPuneet Saxena .alg = "ofb(aes)", 3240ba0e14acSPuneet Saxena .test = alg_test_skcipher, 3241ba0e14acSPuneet Saxena .fips_allowed = 1, 3242ba0e14acSPuneet Saxena .suite = { 3243ba0e14acSPuneet Saxena .cipher = { 324421c8e720SArd Biesheuvel .enc = __VECS(aes_ofb_enc_tv_template), 324521c8e720SArd Biesheuvel .dec = __VECS(aes_ofb_dec_tv_template) 3246ba0e14acSPuneet Saxena } 3247ba0e14acSPuneet Saxena } 3248ba0e14acSPuneet Saxena }, { 3249da7f033dSHerbert Xu .alg = "pcbc(fcrypt)", 32501aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3251da7f033dSHerbert Xu .suite = { 3252da7f033dSHerbert Xu .cipher = { 325321c8e720SArd Biesheuvel .enc = __VECS(fcrypt_pcbc_enc_tv_template), 325421c8e720SArd Biesheuvel .dec = __VECS(fcrypt_pcbc_dec_tv_template) 3255da7f033dSHerbert Xu } 3256da7f033dSHerbert Xu } 3257da7f033dSHerbert Xu }, { 3258eee9dc61SMartin Willi .alg = "poly1305", 3259eee9dc61SMartin Willi .test = alg_test_hash, 3260eee9dc61SMartin Willi .suite = { 326121c8e720SArd Biesheuvel .hash = __VECS(poly1305_tv_template) 3262eee9dc61SMartin Willi } 3263eee9dc61SMartin Willi }, { 3264da7f033dSHerbert Xu .alg = "rfc3686(ctr(aes))", 32651aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3266a1915d51SJarod Wilson .fips_allowed = 1, 3267da7f033dSHerbert Xu .suite = { 3268da7f033dSHerbert Xu .cipher = { 326921c8e720SArd Biesheuvel .enc = __VECS(aes_ctr_rfc3686_enc_tv_template), 327021c8e720SArd Biesheuvel .dec = __VECS(aes_ctr_rfc3686_dec_tv_template) 3271da7f033dSHerbert Xu } 3272da7f033dSHerbert Xu } 3273da7f033dSHerbert Xu }, { 32743f31a740SHerbert Xu .alg = "rfc4106(gcm(aes))", 327569435b94SAdrian Hoban .test = alg_test_aead, 3276db71f29aSJarod Wilson .fips_allowed = 1, 327769435b94SAdrian Hoban .suite = { 327869435b94SAdrian Hoban .aead = { 327921c8e720SArd Biesheuvel .enc = __VECS(aes_gcm_rfc4106_enc_tv_template), 328021c8e720SArd Biesheuvel .dec = __VECS(aes_gcm_rfc4106_dec_tv_template) 328169435b94SAdrian Hoban } 328269435b94SAdrian Hoban } 328369435b94SAdrian Hoban }, { 3284544c436aSHerbert Xu .alg = "rfc4309(ccm(aes))", 32855d667322SJarod Wilson .test = alg_test_aead, 3286a1915d51SJarod Wilson .fips_allowed = 1, 32875d667322SJarod Wilson .suite = { 32885d667322SJarod Wilson .aead = { 328921c8e720SArd Biesheuvel .enc = __VECS(aes_ccm_rfc4309_enc_tv_template), 329021c8e720SArd Biesheuvel .dec = __VECS(aes_ccm_rfc4309_dec_tv_template) 32915d667322SJarod Wilson } 32925d667322SJarod Wilson } 32935d667322SJarod Wilson }, { 3294bb68745eSHerbert Xu .alg = "rfc4543(gcm(aes))", 3295e9b7441aSJussi Kivilinna .test = alg_test_aead, 3296e9b7441aSJussi Kivilinna .suite = { 3297e9b7441aSJussi Kivilinna .aead = { 329821c8e720SArd Biesheuvel .enc = __VECS(aes_gcm_rfc4543_enc_tv_template), 329921c8e720SArd Biesheuvel .dec = __VECS(aes_gcm_rfc4543_dec_tv_template), 3300e9b7441aSJussi Kivilinna } 3301e9b7441aSJussi Kivilinna } 3302e9b7441aSJussi Kivilinna }, { 3303af2b76b5SMartin Willi .alg = "rfc7539(chacha20,poly1305)", 3304af2b76b5SMartin Willi .test = alg_test_aead, 3305af2b76b5SMartin Willi .suite = { 3306af2b76b5SMartin Willi .aead = { 330721c8e720SArd Biesheuvel .enc = __VECS(rfc7539_enc_tv_template), 330821c8e720SArd Biesheuvel .dec = __VECS(rfc7539_dec_tv_template), 3309af2b76b5SMartin Willi } 3310af2b76b5SMartin Willi } 3311af2b76b5SMartin Willi }, { 33125900758dSMartin Willi .alg = "rfc7539esp(chacha20,poly1305)", 33135900758dSMartin Willi .test = alg_test_aead, 33145900758dSMartin Willi .suite = { 33155900758dSMartin Willi .aead = { 331621c8e720SArd Biesheuvel .enc = __VECS(rfc7539esp_enc_tv_template), 331721c8e720SArd Biesheuvel .dec = __VECS(rfc7539esp_dec_tv_template), 33185900758dSMartin Willi } 33195900758dSMartin Willi } 33205900758dSMartin Willi }, { 3321da7f033dSHerbert Xu .alg = "rmd128", 3322da7f033dSHerbert Xu .test = alg_test_hash, 3323da7f033dSHerbert Xu .suite = { 332421c8e720SArd Biesheuvel .hash = __VECS(rmd128_tv_template) 3325da7f033dSHerbert Xu } 3326da7f033dSHerbert Xu }, { 3327da7f033dSHerbert Xu .alg = "rmd160", 3328da7f033dSHerbert Xu .test = alg_test_hash, 3329da7f033dSHerbert Xu .suite = { 333021c8e720SArd Biesheuvel .hash = __VECS(rmd160_tv_template) 3331da7f033dSHerbert Xu } 3332da7f033dSHerbert Xu }, { 3333da7f033dSHerbert Xu .alg = "rmd256", 3334da7f033dSHerbert Xu .test = alg_test_hash, 3335da7f033dSHerbert Xu .suite = { 333621c8e720SArd Biesheuvel .hash = __VECS(rmd256_tv_template) 3337da7f033dSHerbert Xu } 3338da7f033dSHerbert Xu }, { 3339da7f033dSHerbert Xu .alg = "rmd320", 3340da7f033dSHerbert Xu .test = alg_test_hash, 3341da7f033dSHerbert Xu .suite = { 334221c8e720SArd Biesheuvel .hash = __VECS(rmd320_tv_template) 3343da7f033dSHerbert Xu } 3344da7f033dSHerbert Xu }, { 3345946cc463STadeusz Struk .alg = "rsa", 3346946cc463STadeusz Struk .test = alg_test_akcipher, 3347946cc463STadeusz Struk .fips_allowed = 1, 3348946cc463STadeusz Struk .suite = { 334921c8e720SArd Biesheuvel .akcipher = __VECS(rsa_tv_template) 3350946cc463STadeusz Struk } 3351946cc463STadeusz Struk }, { 3352da7f033dSHerbert Xu .alg = "salsa20", 33531aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3354da7f033dSHerbert Xu .suite = { 3355da7f033dSHerbert Xu .cipher = { 335621c8e720SArd Biesheuvel .enc = __VECS(salsa20_stream_enc_tv_template) 3357da7f033dSHerbert Xu } 3358da7f033dSHerbert Xu } 3359da7f033dSHerbert Xu }, { 3360da7f033dSHerbert Xu .alg = "sha1", 3361da7f033dSHerbert Xu .test = alg_test_hash, 3362a1915d51SJarod Wilson .fips_allowed = 1, 3363da7f033dSHerbert Xu .suite = { 336421c8e720SArd Biesheuvel .hash = __VECS(sha1_tv_template) 3365da7f033dSHerbert Xu } 3366da7f033dSHerbert Xu }, { 3367da7f033dSHerbert Xu .alg = "sha224", 3368da7f033dSHerbert Xu .test = alg_test_hash, 3369a1915d51SJarod Wilson .fips_allowed = 1, 3370da7f033dSHerbert Xu .suite = { 337121c8e720SArd Biesheuvel .hash = __VECS(sha224_tv_template) 3372da7f033dSHerbert Xu } 3373da7f033dSHerbert Xu }, { 3374da7f033dSHerbert Xu .alg = "sha256", 3375da7f033dSHerbert Xu .test = alg_test_hash, 3376a1915d51SJarod Wilson .fips_allowed = 1, 3377da7f033dSHerbert Xu .suite = { 337821c8e720SArd Biesheuvel .hash = __VECS(sha256_tv_template) 3379da7f033dSHerbert Xu } 3380da7f033dSHerbert Xu }, { 338179cc6ab8Sraveendra padasalagi .alg = "sha3-224", 338279cc6ab8Sraveendra padasalagi .test = alg_test_hash, 338379cc6ab8Sraveendra padasalagi .fips_allowed = 1, 338479cc6ab8Sraveendra padasalagi .suite = { 338521c8e720SArd Biesheuvel .hash = __VECS(sha3_224_tv_template) 338679cc6ab8Sraveendra padasalagi } 338779cc6ab8Sraveendra padasalagi }, { 338879cc6ab8Sraveendra padasalagi .alg = "sha3-256", 338979cc6ab8Sraveendra padasalagi .test = alg_test_hash, 339079cc6ab8Sraveendra padasalagi .fips_allowed = 1, 339179cc6ab8Sraveendra padasalagi .suite = { 339221c8e720SArd Biesheuvel .hash = __VECS(sha3_256_tv_template) 339379cc6ab8Sraveendra padasalagi } 339479cc6ab8Sraveendra padasalagi }, { 339579cc6ab8Sraveendra padasalagi .alg = "sha3-384", 339679cc6ab8Sraveendra padasalagi .test = alg_test_hash, 339779cc6ab8Sraveendra padasalagi .fips_allowed = 1, 339879cc6ab8Sraveendra padasalagi .suite = { 339921c8e720SArd Biesheuvel .hash = __VECS(sha3_384_tv_template) 340079cc6ab8Sraveendra padasalagi } 340179cc6ab8Sraveendra padasalagi }, { 340279cc6ab8Sraveendra padasalagi .alg = "sha3-512", 340379cc6ab8Sraveendra padasalagi .test = alg_test_hash, 340479cc6ab8Sraveendra padasalagi .fips_allowed = 1, 340579cc6ab8Sraveendra padasalagi .suite = { 340621c8e720SArd Biesheuvel .hash = __VECS(sha3_512_tv_template) 340779cc6ab8Sraveendra padasalagi } 340879cc6ab8Sraveendra padasalagi }, { 3409da7f033dSHerbert Xu .alg = "sha384", 3410da7f033dSHerbert Xu .test = alg_test_hash, 3411a1915d51SJarod Wilson .fips_allowed = 1, 3412da7f033dSHerbert Xu .suite = { 341321c8e720SArd Biesheuvel .hash = __VECS(sha384_tv_template) 3414da7f033dSHerbert Xu } 3415da7f033dSHerbert Xu }, { 3416da7f033dSHerbert Xu .alg = "sha512", 3417da7f033dSHerbert Xu .test = alg_test_hash, 3418a1915d51SJarod Wilson .fips_allowed = 1, 3419da7f033dSHerbert Xu .suite = { 342021c8e720SArd Biesheuvel .hash = __VECS(sha512_tv_template) 3421da7f033dSHerbert Xu } 3422da7f033dSHerbert Xu }, { 3423da7f033dSHerbert Xu .alg = "tgr128", 3424da7f033dSHerbert Xu .test = alg_test_hash, 3425da7f033dSHerbert Xu .suite = { 342621c8e720SArd Biesheuvel .hash = __VECS(tgr128_tv_template) 3427da7f033dSHerbert Xu } 3428da7f033dSHerbert Xu }, { 3429da7f033dSHerbert Xu .alg = "tgr160", 3430da7f033dSHerbert Xu .test = alg_test_hash, 3431da7f033dSHerbert Xu .suite = { 343221c8e720SArd Biesheuvel .hash = __VECS(tgr160_tv_template) 3433da7f033dSHerbert Xu } 3434da7f033dSHerbert Xu }, { 3435da7f033dSHerbert Xu .alg = "tgr192", 3436da7f033dSHerbert Xu .test = alg_test_hash, 3437da7f033dSHerbert Xu .suite = { 343821c8e720SArd Biesheuvel .hash = __VECS(tgr192_tv_template) 3439da7f033dSHerbert Xu } 3440da7f033dSHerbert Xu }, { 3441f1939f7cSShane Wang .alg = "vmac(aes)", 3442f1939f7cSShane Wang .test = alg_test_hash, 3443f1939f7cSShane Wang .suite = { 344421c8e720SArd Biesheuvel .hash = __VECS(aes_vmac128_tv_template) 3445f1939f7cSShane Wang } 3446f1939f7cSShane Wang }, { 3447da7f033dSHerbert Xu .alg = "wp256", 3448da7f033dSHerbert Xu .test = alg_test_hash, 3449da7f033dSHerbert Xu .suite = { 345021c8e720SArd Biesheuvel .hash = __VECS(wp256_tv_template) 3451da7f033dSHerbert Xu } 3452da7f033dSHerbert Xu }, { 3453da7f033dSHerbert Xu .alg = "wp384", 3454da7f033dSHerbert Xu .test = alg_test_hash, 3455da7f033dSHerbert Xu .suite = { 345621c8e720SArd Biesheuvel .hash = __VECS(wp384_tv_template) 3457da7f033dSHerbert Xu } 3458da7f033dSHerbert Xu }, { 3459da7f033dSHerbert Xu .alg = "wp512", 3460da7f033dSHerbert Xu .test = alg_test_hash, 3461da7f033dSHerbert Xu .suite = { 346221c8e720SArd Biesheuvel .hash = __VECS(wp512_tv_template) 3463da7f033dSHerbert Xu } 3464da7f033dSHerbert Xu }, { 3465da7f033dSHerbert Xu .alg = "xcbc(aes)", 3466da7f033dSHerbert Xu .test = alg_test_hash, 3467da7f033dSHerbert Xu .suite = { 346821c8e720SArd Biesheuvel .hash = __VECS(aes_xcbc128_tv_template) 3469da7f033dSHerbert Xu } 3470da7f033dSHerbert Xu }, { 3471da7f033dSHerbert Xu .alg = "xts(aes)", 34721aa4ecd9SHerbert Xu .test = alg_test_skcipher, 34732918aa8dSJarod Wilson .fips_allowed = 1, 3474da7f033dSHerbert Xu .suite = { 3475da7f033dSHerbert Xu .cipher = { 347621c8e720SArd Biesheuvel .enc = __VECS(aes_xts_enc_tv_template), 347721c8e720SArd Biesheuvel .dec = __VECS(aes_xts_dec_tv_template) 3478da7f033dSHerbert Xu } 3479da7f033dSHerbert Xu } 34800c01aed5SGeert Uytterhoeven }, { 34810840605eSJussi Kivilinna .alg = "xts(camellia)", 34820840605eSJussi Kivilinna .test = alg_test_skcipher, 34830840605eSJussi Kivilinna .suite = { 34840840605eSJussi Kivilinna .cipher = { 348521c8e720SArd Biesheuvel .enc = __VECS(camellia_xts_enc_tv_template), 348621c8e720SArd Biesheuvel .dec = __VECS(camellia_xts_dec_tv_template) 34870840605eSJussi Kivilinna } 34880840605eSJussi Kivilinna } 34890840605eSJussi Kivilinna }, { 34909b8b0405SJohannes Goetzfried .alg = "xts(cast6)", 34919b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 34929b8b0405SJohannes Goetzfried .suite = { 34939b8b0405SJohannes Goetzfried .cipher = { 349421c8e720SArd Biesheuvel .enc = __VECS(cast6_xts_enc_tv_template), 349521c8e720SArd Biesheuvel .dec = __VECS(cast6_xts_dec_tv_template) 34969b8b0405SJohannes Goetzfried } 34979b8b0405SJohannes Goetzfried } 34989b8b0405SJohannes Goetzfried }, { 349918be20b9SJussi Kivilinna .alg = "xts(serpent)", 350018be20b9SJussi Kivilinna .test = alg_test_skcipher, 350118be20b9SJussi Kivilinna .suite = { 350218be20b9SJussi Kivilinna .cipher = { 350321c8e720SArd Biesheuvel .enc = __VECS(serpent_xts_enc_tv_template), 350421c8e720SArd Biesheuvel .dec = __VECS(serpent_xts_dec_tv_template) 350518be20b9SJussi Kivilinna } 350618be20b9SJussi Kivilinna } 350718be20b9SJussi Kivilinna }, { 3508aed265b9SJussi Kivilinna .alg = "xts(twofish)", 3509aed265b9SJussi Kivilinna .test = alg_test_skcipher, 3510aed265b9SJussi Kivilinna .suite = { 3511aed265b9SJussi Kivilinna .cipher = { 351221c8e720SArd Biesheuvel .enc = __VECS(tf_xts_enc_tv_template), 351321c8e720SArd Biesheuvel .dec = __VECS(tf_xts_dec_tv_template) 3514aed265b9SJussi Kivilinna } 3515aed265b9SJussi Kivilinna } 3516a368f43dSGiovanni Cabiddu }, { 3517a368f43dSGiovanni Cabiddu .alg = "zlib-deflate", 3518a368f43dSGiovanni Cabiddu .test = alg_test_comp, 3519a368f43dSGiovanni Cabiddu .fips_allowed = 1, 3520a368f43dSGiovanni Cabiddu .suite = { 3521a368f43dSGiovanni Cabiddu .comp = { 3522a368f43dSGiovanni Cabiddu .comp = __VECS(zlib_deflate_comp_tv_template), 3523a368f43dSGiovanni Cabiddu .decomp = __VECS(zlib_deflate_decomp_tv_template) 3524a368f43dSGiovanni Cabiddu } 3525a368f43dSGiovanni Cabiddu } 3526da7f033dSHerbert Xu } 3527da7f033dSHerbert Xu }; 3528da7f033dSHerbert Xu 35295714758bSJussi Kivilinna static bool alg_test_descs_checked; 35305714758bSJussi Kivilinna 35315714758bSJussi Kivilinna static void alg_test_descs_check_order(void) 35325714758bSJussi Kivilinna { 35335714758bSJussi Kivilinna int i; 35345714758bSJussi Kivilinna 35355714758bSJussi Kivilinna /* only check once */ 35365714758bSJussi Kivilinna if (alg_test_descs_checked) 35375714758bSJussi Kivilinna return; 35385714758bSJussi Kivilinna 35395714758bSJussi Kivilinna alg_test_descs_checked = true; 35405714758bSJussi Kivilinna 35415714758bSJussi Kivilinna for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) { 35425714758bSJussi Kivilinna int diff = strcmp(alg_test_descs[i - 1].alg, 35435714758bSJussi Kivilinna alg_test_descs[i].alg); 35445714758bSJussi Kivilinna 35455714758bSJussi Kivilinna if (WARN_ON(diff > 0)) { 35465714758bSJussi Kivilinna pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n", 35475714758bSJussi Kivilinna alg_test_descs[i - 1].alg, 35485714758bSJussi Kivilinna alg_test_descs[i].alg); 35495714758bSJussi Kivilinna } 35505714758bSJussi Kivilinna 35515714758bSJussi Kivilinna if (WARN_ON(diff == 0)) { 35525714758bSJussi Kivilinna pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n", 35535714758bSJussi Kivilinna alg_test_descs[i].alg); 35545714758bSJussi Kivilinna } 35555714758bSJussi Kivilinna } 35565714758bSJussi Kivilinna } 35575714758bSJussi Kivilinna 35581aa4ecd9SHerbert Xu static int alg_find_test(const char *alg) 3559da7f033dSHerbert Xu { 3560da7f033dSHerbert Xu int start = 0; 3561da7f033dSHerbert Xu int end = ARRAY_SIZE(alg_test_descs); 3562da7f033dSHerbert Xu 3563da7f033dSHerbert Xu while (start < end) { 3564da7f033dSHerbert Xu int i = (start + end) / 2; 3565da7f033dSHerbert Xu int diff = strcmp(alg_test_descs[i].alg, alg); 3566da7f033dSHerbert Xu 3567da7f033dSHerbert Xu if (diff > 0) { 3568da7f033dSHerbert Xu end = i; 3569da7f033dSHerbert Xu continue; 3570da7f033dSHerbert Xu } 3571da7f033dSHerbert Xu 3572da7f033dSHerbert Xu if (diff < 0) { 3573da7f033dSHerbert Xu start = i + 1; 3574da7f033dSHerbert Xu continue; 3575da7f033dSHerbert Xu } 3576da7f033dSHerbert Xu 35771aa4ecd9SHerbert Xu return i; 3578da7f033dSHerbert Xu } 3579da7f033dSHerbert Xu 35801aa4ecd9SHerbert Xu return -1; 35811aa4ecd9SHerbert Xu } 35821aa4ecd9SHerbert Xu 35831aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 35841aa4ecd9SHerbert Xu { 35851aa4ecd9SHerbert Xu int i; 3586a68f6610SHerbert Xu int j; 3587d12d6b6dSNeil Horman int rc; 35881aa4ecd9SHerbert Xu 35899e5c9fe4SRichard W.M. Jones if (!fips_enabled && notests) { 35909e5c9fe4SRichard W.M. Jones printk_once(KERN_INFO "alg: self-tests disabled\n"); 35919e5c9fe4SRichard W.M. Jones return 0; 35929e5c9fe4SRichard W.M. Jones } 35939e5c9fe4SRichard W.M. Jones 35945714758bSJussi Kivilinna alg_test_descs_check_order(); 35955714758bSJussi Kivilinna 35961aa4ecd9SHerbert Xu if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) { 35971aa4ecd9SHerbert Xu char nalg[CRYPTO_MAX_ALG_NAME]; 35981aa4ecd9SHerbert Xu 35991aa4ecd9SHerbert Xu if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >= 36001aa4ecd9SHerbert Xu sizeof(nalg)) 36011aa4ecd9SHerbert Xu return -ENAMETOOLONG; 36021aa4ecd9SHerbert Xu 36031aa4ecd9SHerbert Xu i = alg_find_test(nalg); 36041aa4ecd9SHerbert Xu if (i < 0) 36051aa4ecd9SHerbert Xu goto notest; 36061aa4ecd9SHerbert Xu 3607a3bef3a3SJarod Wilson if (fips_enabled && !alg_test_descs[i].fips_allowed) 3608a3bef3a3SJarod Wilson goto non_fips_alg; 3609a3bef3a3SJarod Wilson 3610941fb328SJarod Wilson rc = alg_test_cipher(alg_test_descs + i, driver, type, mask); 3611941fb328SJarod Wilson goto test_done; 36121aa4ecd9SHerbert Xu } 36131aa4ecd9SHerbert Xu 36141aa4ecd9SHerbert Xu i = alg_find_test(alg); 3615a68f6610SHerbert Xu j = alg_find_test(driver); 3616a68f6610SHerbert Xu if (i < 0 && j < 0) 36171aa4ecd9SHerbert Xu goto notest; 36181aa4ecd9SHerbert Xu 3619a68f6610SHerbert Xu if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) || 3620a68f6610SHerbert Xu (j >= 0 && !alg_test_descs[j].fips_allowed))) 3621a3bef3a3SJarod Wilson goto non_fips_alg; 3622a3bef3a3SJarod Wilson 3623a68f6610SHerbert Xu rc = 0; 3624a68f6610SHerbert Xu if (i >= 0) 3625a68f6610SHerbert Xu rc |= alg_test_descs[i].test(alg_test_descs + i, driver, 36261aa4ecd9SHerbert Xu type, mask); 3627032c8cacSCristian Stoica if (j >= 0 && j != i) 3628a68f6610SHerbert Xu rc |= alg_test_descs[j].test(alg_test_descs + j, driver, 3629a68f6610SHerbert Xu type, mask); 3630a68f6610SHerbert Xu 3631941fb328SJarod Wilson test_done: 3632d12d6b6dSNeil Horman if (fips_enabled && rc) 3633d12d6b6dSNeil Horman panic("%s: %s alg self test failed in fips mode!\n", driver, alg); 3634d12d6b6dSNeil Horman 363529ecd4abSJarod Wilson if (fips_enabled && !rc) 36363e8cffd4SMasanari Iida pr_info("alg: self-tests for %s (%s) passed\n", driver, alg); 363729ecd4abSJarod Wilson 3638d12d6b6dSNeil Horman return rc; 36391aa4ecd9SHerbert Xu 36401aa4ecd9SHerbert Xu notest: 3641da7f033dSHerbert Xu printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver); 3642da7f033dSHerbert Xu return 0; 3643a3bef3a3SJarod Wilson non_fips_alg: 3644a3bef3a3SJarod Wilson return -EINVAL; 3645da7f033dSHerbert Xu } 36460b767f96SAlexander Shishkin 3647326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */ 36480b767f96SAlexander Shishkin 3649da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test); 3650