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 aead_test_suite { 80da7f033dSHerbert Xu struct { 81b13b1e0cSEric Biggers const struct aead_testvec *vecs; 82da7f033dSHerbert Xu unsigned int count; 83da7f033dSHerbert Xu } enc, dec; 84da7f033dSHerbert Xu }; 85da7f033dSHerbert Xu 86da7f033dSHerbert Xu struct cipher_test_suite { 87da7f033dSHerbert Xu struct { 88b13b1e0cSEric Biggers const struct cipher_testvec *vecs; 89da7f033dSHerbert Xu unsigned int count; 90da7f033dSHerbert Xu } enc, dec; 91da7f033dSHerbert Xu }; 92da7f033dSHerbert Xu 93da7f033dSHerbert Xu struct comp_test_suite { 94da7f033dSHerbert Xu struct { 95b13b1e0cSEric Biggers const struct comp_testvec *vecs; 96da7f033dSHerbert Xu unsigned int count; 97da7f033dSHerbert Xu } comp, decomp; 98da7f033dSHerbert Xu }; 99da7f033dSHerbert Xu 100da7f033dSHerbert Xu struct hash_test_suite { 101b13b1e0cSEric Biggers const struct hash_testvec *vecs; 102da7f033dSHerbert Xu unsigned int count; 103da7f033dSHerbert Xu }; 104da7f033dSHerbert Xu 1057647d6ceSJarod Wilson struct cprng_test_suite { 106b13b1e0cSEric Biggers const struct cprng_testvec *vecs; 1077647d6ceSJarod Wilson unsigned int count; 1087647d6ceSJarod Wilson }; 1097647d6ceSJarod Wilson 11064d1cdfbSStephan Mueller struct drbg_test_suite { 111b13b1e0cSEric Biggers const struct drbg_testvec *vecs; 11264d1cdfbSStephan Mueller unsigned int count; 11364d1cdfbSStephan Mueller }; 11464d1cdfbSStephan Mueller 115946cc463STadeusz Struk struct akcipher_test_suite { 116b13b1e0cSEric Biggers const struct akcipher_testvec *vecs; 117946cc463STadeusz Struk unsigned int count; 118946cc463STadeusz Struk }; 119946cc463STadeusz Struk 120802c7f1cSSalvatore Benedetto struct kpp_test_suite { 121b13b1e0cSEric Biggers const struct kpp_testvec *vecs; 122802c7f1cSSalvatore Benedetto unsigned int count; 123802c7f1cSSalvatore Benedetto }; 124802c7f1cSSalvatore Benedetto 125da7f033dSHerbert Xu struct alg_test_desc { 126da7f033dSHerbert Xu const char *alg; 127da7f033dSHerbert Xu int (*test)(const struct alg_test_desc *desc, const char *driver, 128da7f033dSHerbert Xu u32 type, u32 mask); 129a1915d51SJarod Wilson int fips_allowed; /* set if alg is allowed in fips mode */ 130da7f033dSHerbert Xu 131da7f033dSHerbert Xu union { 132da7f033dSHerbert Xu struct aead_test_suite aead; 133da7f033dSHerbert Xu struct cipher_test_suite cipher; 134da7f033dSHerbert Xu struct comp_test_suite comp; 135da7f033dSHerbert Xu struct hash_test_suite hash; 1367647d6ceSJarod Wilson struct cprng_test_suite cprng; 13764d1cdfbSStephan Mueller struct drbg_test_suite drbg; 138946cc463STadeusz Struk struct akcipher_test_suite akcipher; 139802c7f1cSSalvatore Benedetto struct kpp_test_suite kpp; 140da7f033dSHerbert Xu } suite; 141da7f033dSHerbert Xu }; 142da7f033dSHerbert Xu 143b13b1e0cSEric Biggers static const unsigned int IDX[8] = { 144b13b1e0cSEric Biggers IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 }; 145da7f033dSHerbert Xu 146da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len) 147da7f033dSHerbert Xu { 148da7f033dSHerbert Xu print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET, 149da7f033dSHerbert Xu 16, 1, 150da7f033dSHerbert Xu buf, len, false); 151da7f033dSHerbert Xu } 152da7f033dSHerbert Xu 153f8b0d4d0SHerbert Xu static int testmgr_alloc_buf(char *buf[XBUFSIZE]) 154f8b0d4d0SHerbert Xu { 155f8b0d4d0SHerbert Xu int i; 156f8b0d4d0SHerbert Xu 157f8b0d4d0SHerbert Xu for (i = 0; i < XBUFSIZE; i++) { 158f8b0d4d0SHerbert Xu buf[i] = (void *)__get_free_page(GFP_KERNEL); 159f8b0d4d0SHerbert Xu if (!buf[i]) 160f8b0d4d0SHerbert Xu goto err_free_buf; 161f8b0d4d0SHerbert Xu } 162f8b0d4d0SHerbert Xu 163f8b0d4d0SHerbert Xu return 0; 164f8b0d4d0SHerbert Xu 165f8b0d4d0SHerbert Xu err_free_buf: 166f8b0d4d0SHerbert Xu while (i-- > 0) 167f8b0d4d0SHerbert Xu free_page((unsigned long)buf[i]); 168f8b0d4d0SHerbert Xu 169f8b0d4d0SHerbert Xu return -ENOMEM; 170f8b0d4d0SHerbert Xu } 171f8b0d4d0SHerbert Xu 172f8b0d4d0SHerbert Xu static void testmgr_free_buf(char *buf[XBUFSIZE]) 173f8b0d4d0SHerbert Xu { 174f8b0d4d0SHerbert Xu int i; 175f8b0d4d0SHerbert Xu 176f8b0d4d0SHerbert Xu for (i = 0; i < XBUFSIZE; i++) 177f8b0d4d0SHerbert Xu free_page((unsigned long)buf[i]); 178f8b0d4d0SHerbert Xu } 179f8b0d4d0SHerbert Xu 180466d7b9fSKamil Konieczny static int ahash_guard_result(char *result, char c, int size) 181466d7b9fSKamil Konieczny { 182466d7b9fSKamil Konieczny int i; 183466d7b9fSKamil Konieczny 184466d7b9fSKamil Konieczny for (i = 0; i < size; i++) { 185466d7b9fSKamil Konieczny if (result[i] != c) 186466d7b9fSKamil Konieczny return -EINVAL; 187466d7b9fSKamil Konieczny } 188466d7b9fSKamil Konieczny 189466d7b9fSKamil Konieczny return 0; 190466d7b9fSKamil Konieczny } 191466d7b9fSKamil Konieczny 192018ba95cSWang, Rui Y static int ahash_partial_update(struct ahash_request **preq, 193b13b1e0cSEric Biggers struct crypto_ahash *tfm, const struct hash_testvec *template, 194018ba95cSWang, Rui Y void *hash_buff, int k, int temp, struct scatterlist *sg, 1957f397136SGilad Ben-Yossef const char *algo, char *result, struct crypto_wait *wait) 196018ba95cSWang, Rui Y { 197018ba95cSWang, Rui Y char *state; 198018ba95cSWang, Rui Y struct ahash_request *req; 199018ba95cSWang, Rui Y int statesize, ret = -EINVAL; 200da1729ceSJoey Pabalinas static const unsigned char guard[] = { 0x00, 0xba, 0xad, 0x00 }; 201466d7b9fSKamil Konieczny int digestsize = crypto_ahash_digestsize(tfm); 202018ba95cSWang, Rui Y 203018ba95cSWang, Rui Y req = *preq; 204018ba95cSWang, Rui Y statesize = crypto_ahash_statesize( 205018ba95cSWang, Rui Y crypto_ahash_reqtfm(req)); 2067bcb87bcSJan Stancek state = kmalloc(statesize + sizeof(guard), GFP_KERNEL); 207018ba95cSWang, Rui Y if (!state) { 208cf3f9609SGilad Ben-Yossef pr_err("alg: hash: Failed to alloc state for %s\n", algo); 209018ba95cSWang, Rui Y goto out_nostate; 210018ba95cSWang, Rui Y } 2117bcb87bcSJan Stancek memcpy(state + statesize, guard, sizeof(guard)); 212466d7b9fSKamil Konieczny memset(result, 1, digestsize); 213018ba95cSWang, Rui Y ret = crypto_ahash_export(req, state); 2147bcb87bcSJan Stancek WARN_ON(memcmp(state + statesize, guard, sizeof(guard))); 215018ba95cSWang, Rui Y if (ret) { 216cf3f9609SGilad Ben-Yossef pr_err("alg: hash: Failed to export() for %s\n", algo); 217018ba95cSWang, Rui Y goto out; 218018ba95cSWang, Rui Y } 219466d7b9fSKamil Konieczny ret = ahash_guard_result(result, 1, digestsize); 220466d7b9fSKamil Konieczny if (ret) { 221466d7b9fSKamil Konieczny pr_err("alg: hash: Failed, export used req->result for %s\n", 222466d7b9fSKamil Konieczny algo); 223466d7b9fSKamil Konieczny goto out; 224466d7b9fSKamil Konieczny } 225018ba95cSWang, Rui Y ahash_request_free(req); 226018ba95cSWang, Rui Y req = ahash_request_alloc(tfm, GFP_KERNEL); 227018ba95cSWang, Rui Y if (!req) { 228018ba95cSWang, Rui Y pr_err("alg: hash: Failed to alloc request for %s\n", algo); 229018ba95cSWang, Rui Y goto out_noreq; 230018ba95cSWang, Rui Y } 231018ba95cSWang, Rui Y ahash_request_set_callback(req, 232018ba95cSWang, Rui Y CRYPTO_TFM_REQ_MAY_BACKLOG, 2337f397136SGilad Ben-Yossef crypto_req_done, wait); 234018ba95cSWang, Rui Y 235018ba95cSWang, Rui Y memcpy(hash_buff, template->plaintext + temp, 236018ba95cSWang, Rui Y template->tap[k]); 237018ba95cSWang, Rui Y sg_init_one(&sg[0], hash_buff, template->tap[k]); 238018ba95cSWang, Rui Y ahash_request_set_crypt(req, sg, result, template->tap[k]); 239018ba95cSWang, Rui Y ret = crypto_ahash_import(req, state); 240018ba95cSWang, Rui Y if (ret) { 241018ba95cSWang, Rui Y pr_err("alg: hash: Failed to import() for %s\n", algo); 242018ba95cSWang, Rui Y goto out; 243018ba95cSWang, Rui Y } 244466d7b9fSKamil Konieczny ret = ahash_guard_result(result, 1, digestsize); 245466d7b9fSKamil Konieczny if (ret) { 246466d7b9fSKamil Konieczny pr_err("alg: hash: Failed, import used req->result for %s\n", 247466d7b9fSKamil Konieczny algo); 248466d7b9fSKamil Konieczny goto out; 249466d7b9fSKamil Konieczny } 2507f397136SGilad Ben-Yossef ret = crypto_wait_req(crypto_ahash_update(req), wait); 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; 2757f397136SGilad Ben-Yossef struct crypto_wait wait; 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 2897f397136SGilad Ben-Yossef crypto_init_wait(&wait); 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, 2987f397136SGilad Ben-Yossef crypto_req_done, &wait); 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) { 3387f397136SGilad Ben-Yossef ret = crypto_wait_req(crypto_ahash_digest(req), &wait); 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 { 345466d7b9fSKamil Konieczny memset(result, 1, digest_size); 3467f397136SGilad Ben-Yossef ret = crypto_wait_req(crypto_ahash_init(req), &wait); 347a8f1a052SDavid S. Miller if (ret) { 348cf3f9609SGilad Ben-Yossef pr_err("alg: hash: init failed on test %d " 349a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 350a8f1a052SDavid S. Miller goto out; 351a8f1a052SDavid S. Miller } 352466d7b9fSKamil Konieczny ret = ahash_guard_result(result, 1, digest_size); 353466d7b9fSKamil Konieczny if (ret) { 354466d7b9fSKamil Konieczny pr_err("alg: hash: init failed on test %d " 355466d7b9fSKamil Konieczny "for %s: used req->result\n", j, algo); 356466d7b9fSKamil Konieczny goto out; 357466d7b9fSKamil Konieczny } 3587f397136SGilad Ben-Yossef ret = crypto_wait_req(crypto_ahash_update(req), &wait); 359a8f1a052SDavid S. Miller if (ret) { 360cf3f9609SGilad Ben-Yossef pr_err("alg: hash: update failed on test %d " 361a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 362a8f1a052SDavid S. Miller goto out; 363a8f1a052SDavid S. Miller } 364466d7b9fSKamil Konieczny ret = ahash_guard_result(result, 1, digest_size); 365466d7b9fSKamil Konieczny if (ret) { 366466d7b9fSKamil Konieczny pr_err("alg: hash: update failed on test %d " 367466d7b9fSKamil Konieczny "for %s: used req->result\n", j, algo); 368466d7b9fSKamil Konieczny goto out; 369466d7b9fSKamil Konieczny } 3707f397136SGilad Ben-Yossef ret = crypto_wait_req(crypto_ahash_final(req), &wait); 371a8f1a052SDavid S. Miller if (ret) { 372cf3f9609SGilad Ben-Yossef pr_err("alg: hash: final failed on test %d " 373a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 374a8f1a052SDavid S. Miller goto out; 375a8f1a052SDavid S. Miller } 376a8f1a052SDavid S. Miller } 377da7f033dSHerbert Xu 378da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 379da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 380da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Test %d failed for %s\n", 381a0cfae59SHerbert Xu j, algo); 382da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 383da7f033dSHerbert Xu ret = -EINVAL; 384da7f033dSHerbert Xu goto out; 385da7f033dSHerbert Xu } 386da7f033dSHerbert Xu } 387da7f033dSHerbert Xu 388da7f033dSHerbert Xu j = 0; 389da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 390da5ffe11SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 391da5ffe11SJussi Kivilinna if (align_offset != 0) 392da5ffe11SJussi Kivilinna break; 393da5ffe11SJussi Kivilinna 3945f2b424eSCristian Stoica if (!template[i].np) 3955f2b424eSCristian Stoica continue; 3965f2b424eSCristian Stoica 397da7f033dSHerbert Xu j++; 398e93acd6fSAndrew Lutomirski memset(result, 0, digest_size); 399da7f033dSHerbert Xu 400da7f033dSHerbert Xu temp = 0; 401da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 402fd57f22aSHerbert Xu ret = -EINVAL; 403da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 404fd57f22aSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 405fd57f22aSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 406fd57f22aSHerbert Xu goto out; 407da7f033dSHerbert Xu sg_set_buf(&sg[k], 408da7f033dSHerbert Xu memcpy(xbuf[IDX[k] >> PAGE_SHIFT] + 409da7f033dSHerbert Xu offset_in_page(IDX[k]), 410da7f033dSHerbert Xu template[i].plaintext + temp, 411da7f033dSHerbert Xu template[i].tap[k]), 412da7f033dSHerbert Xu template[i].tap[k]); 413da7f033dSHerbert Xu temp += template[i].tap[k]; 414da7f033dSHerbert Xu } 415da7f033dSHerbert Xu 416da7f033dSHerbert Xu if (template[i].ksize) { 41729b77e5dSHoria Geanta if (template[i].ksize > MAX_KEYLEN) { 41829b77e5dSHoria Geanta pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n", 4195f2b424eSCristian Stoica j, algo, template[i].ksize, MAX_KEYLEN); 42029b77e5dSHoria Geanta ret = -EINVAL; 42129b77e5dSHoria Geanta goto out; 42229b77e5dSHoria Geanta } 423da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 42429b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].ksize); 4255f2b424eSCristian Stoica ret = crypto_ahash_setkey(tfm, key, template[i].ksize); 426da7f033dSHerbert Xu 427da7f033dSHerbert Xu if (ret) { 428da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey " 429da7f033dSHerbert Xu "failed on chunking test %d " 4305f2b424eSCristian Stoica "for %s: ret=%d\n", j, algo, -ret); 431da7f033dSHerbert Xu goto out; 432da7f033dSHerbert Xu } 433da7f033dSHerbert Xu } 434da7f033dSHerbert Xu 4355f2b424eSCristian Stoica ahash_request_set_crypt(req, sg, result, template[i].psize); 4367f397136SGilad Ben-Yossef ret = crypto_wait_req(crypto_ahash_digest(req), &wait); 4377f397136SGilad Ben-Yossef if (ret) { 4387f397136SGilad Ben-Yossef pr_err("alg: hash: digest failed on chunking test %d for %s: ret=%d\n", 4397f397136SGilad Ben-Yossef j, algo, -ret); 440da7f033dSHerbert Xu goto out; 441da7f033dSHerbert Xu } 442da7f033dSHerbert Xu 443da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 444da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 445da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Chunking test %d " 446da7f033dSHerbert Xu "failed for %s\n", j, algo); 447da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 448da7f033dSHerbert Xu ret = -EINVAL; 449da7f033dSHerbert Xu goto out; 450da7f033dSHerbert Xu } 451da7f033dSHerbert Xu } 452da7f033dSHerbert Xu 453018ba95cSWang, Rui Y /* partial update exercise */ 454018ba95cSWang, Rui Y j = 0; 455018ba95cSWang, Rui Y for (i = 0; i < tcount; i++) { 456018ba95cSWang, Rui Y /* alignment tests are only done with continuous buffers */ 457018ba95cSWang, Rui Y if (align_offset != 0) 458018ba95cSWang, Rui Y break; 459018ba95cSWang, Rui Y 460018ba95cSWang, Rui Y if (template[i].np < 2) 461018ba95cSWang, Rui Y continue; 462018ba95cSWang, Rui Y 463018ba95cSWang, Rui Y j++; 464e93acd6fSAndrew Lutomirski memset(result, 0, digest_size); 465018ba95cSWang, Rui Y 466018ba95cSWang, Rui Y ret = -EINVAL; 467018ba95cSWang, Rui Y hash_buff = xbuf[0]; 468018ba95cSWang, Rui Y memcpy(hash_buff, template[i].plaintext, 469018ba95cSWang, Rui Y template[i].tap[0]); 470018ba95cSWang, Rui Y sg_init_one(&sg[0], hash_buff, template[i].tap[0]); 471018ba95cSWang, Rui Y 472018ba95cSWang, Rui Y if (template[i].ksize) { 473018ba95cSWang, Rui Y crypto_ahash_clear_flags(tfm, ~0); 474018ba95cSWang, Rui Y if (template[i].ksize > MAX_KEYLEN) { 475018ba95cSWang, Rui Y pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n", 476018ba95cSWang, Rui Y j, algo, template[i].ksize, MAX_KEYLEN); 477018ba95cSWang, Rui Y ret = -EINVAL; 478018ba95cSWang, Rui Y goto out; 479018ba95cSWang, Rui Y } 480018ba95cSWang, Rui Y memcpy(key, template[i].key, template[i].ksize); 481018ba95cSWang, Rui Y ret = crypto_ahash_setkey(tfm, key, template[i].ksize); 482018ba95cSWang, Rui Y if (ret) { 483018ba95cSWang, Rui Y pr_err("alg: hash: setkey failed on test %d for %s: ret=%d\n", 484018ba95cSWang, Rui Y j, algo, -ret); 485018ba95cSWang, Rui Y goto out; 486018ba95cSWang, Rui Y } 487018ba95cSWang, Rui Y } 488018ba95cSWang, Rui Y 489018ba95cSWang, Rui Y ahash_request_set_crypt(req, sg, result, template[i].tap[0]); 4907f397136SGilad Ben-Yossef ret = crypto_wait_req(crypto_ahash_init(req), &wait); 491018ba95cSWang, Rui Y if (ret) { 492cf3f9609SGilad Ben-Yossef pr_err("alg: hash: init failed on test %d for %s: ret=%d\n", 493018ba95cSWang, Rui Y j, algo, -ret); 494018ba95cSWang, Rui Y goto out; 495018ba95cSWang, Rui Y } 4967f397136SGilad Ben-Yossef ret = crypto_wait_req(crypto_ahash_update(req), &wait); 497018ba95cSWang, Rui Y if (ret) { 498cf3f9609SGilad Ben-Yossef pr_err("alg: hash: update failed on test %d for %s: ret=%d\n", 499018ba95cSWang, Rui Y j, algo, -ret); 500018ba95cSWang, Rui Y goto out; 501018ba95cSWang, Rui Y } 502018ba95cSWang, Rui Y 503018ba95cSWang, Rui Y temp = template[i].tap[0]; 504018ba95cSWang, Rui Y for (k = 1; k < template[i].np; k++) { 505018ba95cSWang, Rui Y ret = ahash_partial_update(&req, tfm, &template[i], 506018ba95cSWang, Rui Y hash_buff, k, temp, &sg[0], algo, result, 5077f397136SGilad Ben-Yossef &wait); 508018ba95cSWang, Rui Y if (ret) { 509cf3f9609SGilad Ben-Yossef pr_err("alg: hash: partial update failed on test %d for %s: ret=%d\n", 510018ba95cSWang, Rui Y j, algo, -ret); 511018ba95cSWang, Rui Y goto out_noreq; 512018ba95cSWang, Rui Y } 513018ba95cSWang, Rui Y temp += template[i].tap[k]; 514018ba95cSWang, Rui Y } 5157f397136SGilad Ben-Yossef ret = crypto_wait_req(crypto_ahash_final(req), &wait); 516018ba95cSWang, Rui Y if (ret) { 517cf3f9609SGilad Ben-Yossef pr_err("alg: hash: final failed on test %d for %s: ret=%d\n", 518018ba95cSWang, Rui Y j, algo, -ret); 519018ba95cSWang, Rui Y goto out; 520018ba95cSWang, Rui Y } 521018ba95cSWang, Rui Y if (memcmp(result, template[i].digest, 522018ba95cSWang, Rui Y crypto_ahash_digestsize(tfm))) { 523018ba95cSWang, Rui Y pr_err("alg: hash: Partial Test %d failed for %s\n", 524018ba95cSWang, Rui Y j, algo); 525018ba95cSWang, Rui Y hexdump(result, crypto_ahash_digestsize(tfm)); 526018ba95cSWang, Rui Y ret = -EINVAL; 527018ba95cSWang, Rui Y goto out; 528018ba95cSWang, Rui Y } 529018ba95cSWang, Rui Y } 530018ba95cSWang, Rui Y 531da7f033dSHerbert Xu ret = 0; 532da7f033dSHerbert Xu 533da7f033dSHerbert Xu out: 534da7f033dSHerbert Xu ahash_request_free(req); 535da7f033dSHerbert Xu out_noreq: 536f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 537f8b0d4d0SHerbert Xu out_nobuf: 53829b77e5dSHoria Geanta kfree(key); 53929b77e5dSHoria Geanta kfree(result); 540da7f033dSHerbert Xu return ret; 541da7f033dSHerbert Xu } 542da7f033dSHerbert Xu 543b13b1e0cSEric Biggers static int test_hash(struct crypto_ahash *tfm, 544b13b1e0cSEric Biggers const struct hash_testvec *template, 545da5ffe11SJussi Kivilinna unsigned int tcount, bool use_digest) 546da5ffe11SJussi Kivilinna { 547da5ffe11SJussi Kivilinna unsigned int alignmask; 548da5ffe11SJussi Kivilinna int ret; 549da5ffe11SJussi Kivilinna 550da5ffe11SJussi Kivilinna ret = __test_hash(tfm, template, tcount, use_digest, 0); 551da5ffe11SJussi Kivilinna if (ret) 552da5ffe11SJussi Kivilinna return ret; 553da5ffe11SJussi Kivilinna 554da5ffe11SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 555da5ffe11SJussi Kivilinna ret = __test_hash(tfm, template, tcount, use_digest, 1); 556da5ffe11SJussi Kivilinna if (ret) 557da5ffe11SJussi Kivilinna return ret; 558da5ffe11SJussi Kivilinna 559da5ffe11SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 560da5ffe11SJussi Kivilinna if (alignmask) { 561da5ffe11SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 562da5ffe11SJussi Kivilinna ret = __test_hash(tfm, template, tcount, use_digest, 563da5ffe11SJussi Kivilinna alignmask + 1); 564da5ffe11SJussi Kivilinna if (ret) 565da5ffe11SJussi Kivilinna return ret; 566da5ffe11SJussi Kivilinna } 567da5ffe11SJussi Kivilinna 568da5ffe11SJussi Kivilinna return 0; 569da5ffe11SJussi Kivilinna } 570da5ffe11SJussi Kivilinna 571d8a32ac2SJussi Kivilinna static int __test_aead(struct crypto_aead *tfm, int enc, 572b13b1e0cSEric Biggers const struct aead_testvec *template, unsigned int tcount, 57358dcf548SJussi Kivilinna const bool diff_dst, const int align_offset) 574da7f033dSHerbert Xu { 575da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)); 576da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 577f8b0d4d0SHerbert Xu int ret = -ENOMEM; 578da7f033dSHerbert Xu char *q; 579da7f033dSHerbert Xu char *key; 580da7f033dSHerbert Xu struct aead_request *req; 581d8a32ac2SJussi Kivilinna struct scatterlist *sg; 582d8a32ac2SJussi Kivilinna struct scatterlist *sgout; 583d8a32ac2SJussi Kivilinna const char *e, *d; 5847f397136SGilad Ben-Yossef struct crypto_wait wait; 585424a5da6SCristian Stoica unsigned int authsize, iv_len; 586da7f033dSHerbert Xu void *input; 587d8a32ac2SJussi Kivilinna void *output; 588da7f033dSHerbert Xu void *assoc; 5899bac019dSTadeusz Struk char *iv; 590f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 591d8a32ac2SJussi Kivilinna char *xoutbuf[XBUFSIZE]; 592f8b0d4d0SHerbert Xu char *axbuf[XBUFSIZE]; 593f8b0d4d0SHerbert Xu 5949bac019dSTadeusz Struk iv = kzalloc(MAX_IVLEN, GFP_KERNEL); 5959bac019dSTadeusz Struk if (!iv) 5969bac019dSTadeusz Struk return ret; 59729b77e5dSHoria Geanta key = kmalloc(MAX_KEYLEN, GFP_KERNEL); 59829b77e5dSHoria Geanta if (!key) 59929b77e5dSHoria Geanta goto out_noxbuf; 600f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 601f8b0d4d0SHerbert Xu goto out_noxbuf; 602f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(axbuf)) 603f8b0d4d0SHerbert Xu goto out_noaxbuf; 604d8a32ac2SJussi Kivilinna if (diff_dst && testmgr_alloc_buf(xoutbuf)) 605d8a32ac2SJussi Kivilinna goto out_nooutbuf; 606d8a32ac2SJussi Kivilinna 607d8a32ac2SJussi Kivilinna /* avoid "the frame size is larger than 1024 bytes" compiler warning */ 6088a525fcdSHerbert Xu sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 4 : 2), GFP_KERNEL); 609d8a32ac2SJussi Kivilinna if (!sg) 610d8a32ac2SJussi Kivilinna goto out_nosg; 6118a525fcdSHerbert Xu sgout = &sg[16]; 612d8a32ac2SJussi Kivilinna 613d8a32ac2SJussi Kivilinna if (diff_dst) 614d8a32ac2SJussi Kivilinna d = "-ddst"; 615d8a32ac2SJussi Kivilinna else 616d8a32ac2SJussi Kivilinna d = ""; 617d8a32ac2SJussi Kivilinna 618da7f033dSHerbert Xu if (enc == ENCRYPT) 619da7f033dSHerbert Xu e = "encryption"; 620da7f033dSHerbert Xu else 621da7f033dSHerbert Xu e = "decryption"; 622da7f033dSHerbert Xu 6237f397136SGilad Ben-Yossef crypto_init_wait(&wait); 624da7f033dSHerbert Xu 625da7f033dSHerbert Xu req = aead_request_alloc(tfm, GFP_KERNEL); 626da7f033dSHerbert Xu if (!req) { 627d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to allocate request for %s\n", 628d8a32ac2SJussi Kivilinna d, algo); 629da7f033dSHerbert Xu goto out; 630da7f033dSHerbert Xu } 631da7f033dSHerbert Xu 632da7f033dSHerbert Xu aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 6337f397136SGilad Ben-Yossef crypto_req_done, &wait); 634da7f033dSHerbert Xu 635abfa7f43SJerome Marchand iv_len = crypto_aead_ivsize(tfm); 636abfa7f43SJerome Marchand 637da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 63805b1d338SCristian Stoica if (template[i].np) 63905b1d338SCristian Stoica continue; 64005b1d338SCristian Stoica 641da7f033dSHerbert Xu j++; 642da7f033dSHerbert Xu 64358dcf548SJussi Kivilinna /* some templates have no input data but they will 644da7f033dSHerbert Xu * touch input 645da7f033dSHerbert Xu */ 646da7f033dSHerbert Xu input = xbuf[0]; 64758dcf548SJussi Kivilinna input += align_offset; 648da7f033dSHerbert Xu assoc = axbuf[0]; 649da7f033dSHerbert Xu 650fd57f22aSHerbert Xu ret = -EINVAL; 65158dcf548SJussi Kivilinna if (WARN_ON(align_offset + template[i].ilen > 65258dcf548SJussi Kivilinna PAGE_SIZE || template[i].alen > PAGE_SIZE)) 653fd57f22aSHerbert Xu goto out; 654fd57f22aSHerbert Xu 655da7f033dSHerbert Xu memcpy(input, template[i].input, template[i].ilen); 656da7f033dSHerbert Xu memcpy(assoc, template[i].assoc, template[i].alen); 657da7f033dSHerbert Xu if (template[i].iv) 658424a5da6SCristian Stoica memcpy(iv, template[i].iv, iv_len); 659da7f033dSHerbert Xu else 660424a5da6SCristian Stoica memset(iv, 0, iv_len); 661da7f033dSHerbert Xu 662da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 663da7f033dSHerbert Xu if (template[i].wk) 66405b1d338SCristian Stoica crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 665da7f033dSHerbert Xu 66629b77e5dSHoria Geanta if (template[i].klen > MAX_KEYLEN) { 66729b77e5dSHoria Geanta pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n", 66829b77e5dSHoria Geanta d, j, algo, template[i].klen, 66929b77e5dSHoria Geanta MAX_KEYLEN); 67029b77e5dSHoria Geanta ret = -EINVAL; 67129b77e5dSHoria Geanta goto out; 67229b77e5dSHoria Geanta } 67329b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].klen); 674da7f033dSHerbert Xu 67505b1d338SCristian Stoica ret = crypto_aead_setkey(tfm, key, template[i].klen); 6760fae0c1eSYanjiang Jin if (template[i].fail == !ret) { 677d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n", 678d8a32ac2SJussi Kivilinna d, j, algo, crypto_aead_get_flags(tfm)); 679da7f033dSHerbert Xu goto out; 680da7f033dSHerbert Xu } else if (ret) 681da7f033dSHerbert Xu continue; 682da7f033dSHerbert Xu 683da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 684da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 685da7f033dSHerbert Xu if (ret) { 686d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n", 687d8a32ac2SJussi Kivilinna d, authsize, j, algo); 688da7f033dSHerbert Xu goto out; 689da7f033dSHerbert Xu } 690da7f033dSHerbert Xu 6918a525fcdSHerbert Xu k = !!template[i].alen; 6928a525fcdSHerbert Xu sg_init_table(sg, k + 1); 6938a525fcdSHerbert Xu sg_set_buf(&sg[0], assoc, template[i].alen); 6948a525fcdSHerbert Xu sg_set_buf(&sg[k], input, 69505b1d338SCristian Stoica template[i].ilen + (enc ? authsize : 0)); 696d8a32ac2SJussi Kivilinna output = input; 697d8a32ac2SJussi Kivilinna 6988a525fcdSHerbert Xu if (diff_dst) { 6998a525fcdSHerbert Xu sg_init_table(sgout, k + 1); 7008a525fcdSHerbert Xu sg_set_buf(&sgout[0], assoc, template[i].alen); 7018a525fcdSHerbert Xu 7028a525fcdSHerbert Xu output = xoutbuf[0]; 7038a525fcdSHerbert Xu output += align_offset; 7048a525fcdSHerbert Xu sg_set_buf(&sgout[k], output, 7058a525fcdSHerbert Xu template[i].rlen + (enc ? 0 : authsize)); 7068a525fcdSHerbert Xu } 707da7f033dSHerbert Xu 708d8a32ac2SJussi Kivilinna aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 709da7f033dSHerbert Xu template[i].ilen, iv); 710da7f033dSHerbert Xu 7118a525fcdSHerbert Xu aead_request_set_ad(req, template[i].alen); 712da7f033dSHerbert Xu 7137f397136SGilad Ben-Yossef ret = crypto_wait_req(enc ? crypto_aead_encrypt(req) 7147f397136SGilad Ben-Yossef : crypto_aead_decrypt(req), &wait); 715da7f033dSHerbert Xu 716da7f033dSHerbert Xu switch (ret) { 717da7f033dSHerbert Xu case 0: 718e44a1b44SJarod Wilson if (template[i].novrfy) { 719e44a1b44SJarod Wilson /* verification was supposed to fail */ 720d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n", 721d8a32ac2SJussi Kivilinna d, e, j, algo); 722e44a1b44SJarod Wilson /* so really, we got a bad message */ 723e44a1b44SJarod Wilson ret = -EBADMSG; 724e44a1b44SJarod Wilson goto out; 725e44a1b44SJarod Wilson } 726da7f033dSHerbert Xu break; 727e44a1b44SJarod Wilson case -EBADMSG: 728e44a1b44SJarod Wilson if (template[i].novrfy) 729e44a1b44SJarod Wilson /* verification failure was expected */ 730e44a1b44SJarod Wilson continue; 731da7f033dSHerbert Xu /* fall through */ 732da7f033dSHerbert Xu default: 733d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n", 734d8a32ac2SJussi Kivilinna d, e, j, algo, -ret); 735da7f033dSHerbert Xu goto out; 736da7f033dSHerbert Xu } 737da7f033dSHerbert Xu 738d8a32ac2SJussi Kivilinna q = output; 739da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 740d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Test %d failed on %s for %s\n", 741d8a32ac2SJussi Kivilinna d, j, e, algo); 742da7f033dSHerbert Xu hexdump(q, template[i].rlen); 743da7f033dSHerbert Xu ret = -EINVAL; 744da7f033dSHerbert Xu goto out; 745da7f033dSHerbert Xu } 746da7f033dSHerbert Xu } 747da7f033dSHerbert Xu 748da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 74958dcf548SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 75058dcf548SJussi Kivilinna if (align_offset != 0) 75158dcf548SJussi Kivilinna break; 75258dcf548SJussi Kivilinna 75305b1d338SCristian Stoica if (!template[i].np) 75405b1d338SCristian Stoica continue; 75505b1d338SCristian Stoica 756da7f033dSHerbert Xu j++; 757da7f033dSHerbert Xu 758da7f033dSHerbert Xu if (template[i].iv) 759abfa7f43SJerome Marchand memcpy(iv, template[i].iv, iv_len); 760da7f033dSHerbert Xu else 761da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 762da7f033dSHerbert Xu 763da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 764da7f033dSHerbert Xu if (template[i].wk) 76505b1d338SCristian Stoica crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 76629b77e5dSHoria Geanta if (template[i].klen > MAX_KEYLEN) { 76729b77e5dSHoria Geanta pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n", 76805b1d338SCristian Stoica d, j, algo, template[i].klen, MAX_KEYLEN); 76929b77e5dSHoria Geanta ret = -EINVAL; 77029b77e5dSHoria Geanta goto out; 77129b77e5dSHoria Geanta } 77229b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].klen); 773da7f033dSHerbert Xu 774da7f033dSHerbert Xu ret = crypto_aead_setkey(tfm, key, template[i].klen); 7750fae0c1eSYanjiang Jin if (template[i].fail == !ret) { 776d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n", 777d8a32ac2SJussi Kivilinna d, j, algo, crypto_aead_get_flags(tfm)); 778da7f033dSHerbert Xu goto out; 779da7f033dSHerbert Xu } else if (ret) 780da7f033dSHerbert Xu continue; 781da7f033dSHerbert Xu 782da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 783da7f033dSHerbert Xu 784da7f033dSHerbert Xu ret = -EINVAL; 7858a525fcdSHerbert Xu sg_init_table(sg, template[i].anp + template[i].np); 786d8a32ac2SJussi Kivilinna if (diff_dst) 7878a525fcdSHerbert Xu sg_init_table(sgout, template[i].anp + template[i].np); 7888a525fcdSHerbert Xu 7898a525fcdSHerbert Xu ret = -EINVAL; 7908a525fcdSHerbert Xu for (k = 0, temp = 0; k < template[i].anp; k++) { 7918a525fcdSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 7928a525fcdSHerbert Xu template[i].atap[k] > PAGE_SIZE)) 7938a525fcdSHerbert Xu goto out; 7948a525fcdSHerbert Xu sg_set_buf(&sg[k], 7958a525fcdSHerbert Xu memcpy(axbuf[IDX[k] >> PAGE_SHIFT] + 7968a525fcdSHerbert Xu offset_in_page(IDX[k]), 7978a525fcdSHerbert Xu template[i].assoc + temp, 7988a525fcdSHerbert Xu template[i].atap[k]), 7998a525fcdSHerbert Xu template[i].atap[k]); 8008a525fcdSHerbert Xu if (diff_dst) 8018a525fcdSHerbert Xu sg_set_buf(&sgout[k], 8028a525fcdSHerbert Xu axbuf[IDX[k] >> PAGE_SHIFT] + 8038a525fcdSHerbert Xu offset_in_page(IDX[k]), 8048a525fcdSHerbert Xu template[i].atap[k]); 8058a525fcdSHerbert Xu temp += template[i].atap[k]; 8068a525fcdSHerbert Xu } 8078a525fcdSHerbert Xu 808da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 809da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 810da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 811da7f033dSHerbert Xu goto out; 812da7f033dSHerbert Xu 81305b1d338SCristian Stoica q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]); 81405b1d338SCristian Stoica memcpy(q, template[i].input + temp, template[i].tap[k]); 8158a525fcdSHerbert Xu sg_set_buf(&sg[template[i].anp + k], 8168a525fcdSHerbert Xu q, template[i].tap[k]); 817d8a32ac2SJussi Kivilinna 818d8a32ac2SJussi Kivilinna if (diff_dst) { 819d8a32ac2SJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 820d8a32ac2SJussi Kivilinna offset_in_page(IDX[k]); 821d8a32ac2SJussi Kivilinna 822d8a32ac2SJussi Kivilinna memset(q, 0, template[i].tap[k]); 823d8a32ac2SJussi Kivilinna 8248a525fcdSHerbert Xu sg_set_buf(&sgout[template[i].anp + k], 8258a525fcdSHerbert Xu q, template[i].tap[k]); 826d8a32ac2SJussi Kivilinna } 827d8a32ac2SJussi Kivilinna 8288ec25c51SHoria Geanta n = template[i].tap[k]; 8298ec25c51SHoria Geanta if (k == template[i].np - 1 && enc) 8308ec25c51SHoria Geanta n += authsize; 8318ec25c51SHoria Geanta if (offset_in_page(q) + n < PAGE_SIZE) 8328ec25c51SHoria Geanta q[n] = 0; 8338ec25c51SHoria Geanta 834da7f033dSHerbert Xu temp += template[i].tap[k]; 835da7f033dSHerbert Xu } 836da7f033dSHerbert Xu 837da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 838da7f033dSHerbert Xu if (ret) { 839d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n", 840d8a32ac2SJussi Kivilinna d, authsize, j, algo); 841da7f033dSHerbert Xu goto out; 842da7f033dSHerbert Xu } 843da7f033dSHerbert Xu 844da7f033dSHerbert Xu if (enc) { 8458a525fcdSHerbert Xu if (WARN_ON(sg[template[i].anp + k - 1].offset + 8468a525fcdSHerbert Xu sg[template[i].anp + k - 1].length + 8478a525fcdSHerbert Xu authsize > PAGE_SIZE)) { 848da7f033dSHerbert Xu ret = -EINVAL; 849da7f033dSHerbert Xu goto out; 850da7f033dSHerbert Xu } 851da7f033dSHerbert Xu 852d8a32ac2SJussi Kivilinna if (diff_dst) 8538a525fcdSHerbert Xu sgout[template[i].anp + k - 1].length += 8548a525fcdSHerbert Xu authsize; 8558a525fcdSHerbert Xu sg[template[i].anp + k - 1].length += authsize; 856da7f033dSHerbert Xu } 857da7f033dSHerbert Xu 858d8a32ac2SJussi Kivilinna aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 859da7f033dSHerbert Xu template[i].ilen, 860da7f033dSHerbert Xu iv); 861da7f033dSHerbert Xu 8628a525fcdSHerbert Xu aead_request_set_ad(req, template[i].alen); 863da7f033dSHerbert Xu 8647f397136SGilad Ben-Yossef ret = crypto_wait_req(enc ? crypto_aead_encrypt(req) 8657f397136SGilad Ben-Yossef : crypto_aead_decrypt(req), &wait); 866da7f033dSHerbert Xu 867da7f033dSHerbert Xu switch (ret) { 868da7f033dSHerbert Xu case 0: 869e44a1b44SJarod Wilson if (template[i].novrfy) { 870e44a1b44SJarod Wilson /* verification was supposed to fail */ 871d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n", 872d8a32ac2SJussi Kivilinna d, e, j, algo); 873e44a1b44SJarod Wilson /* so really, we got a bad message */ 874e44a1b44SJarod Wilson ret = -EBADMSG; 875e44a1b44SJarod Wilson goto out; 876e44a1b44SJarod Wilson } 877da7f033dSHerbert Xu break; 878e44a1b44SJarod Wilson case -EBADMSG: 879e44a1b44SJarod Wilson if (template[i].novrfy) 880e44a1b44SJarod Wilson /* verification failure was expected */ 881e44a1b44SJarod Wilson continue; 882da7f033dSHerbert Xu /* fall through */ 883da7f033dSHerbert Xu default: 884d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n", 885d8a32ac2SJussi Kivilinna d, e, j, algo, -ret); 886da7f033dSHerbert Xu goto out; 887da7f033dSHerbert Xu } 888da7f033dSHerbert Xu 889da7f033dSHerbert Xu ret = -EINVAL; 890da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 891d8a32ac2SJussi Kivilinna if (diff_dst) 892d8a32ac2SJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 893d8a32ac2SJussi Kivilinna offset_in_page(IDX[k]); 894d8a32ac2SJussi Kivilinna else 895da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 896da7f033dSHerbert Xu offset_in_page(IDX[k]); 897da7f033dSHerbert Xu 898da7f033dSHerbert Xu n = template[i].tap[k]; 899da7f033dSHerbert Xu if (k == template[i].np - 1) 900da7f033dSHerbert Xu n += enc ? authsize : -authsize; 901da7f033dSHerbert Xu 902da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, n)) { 903d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n", 904d8a32ac2SJussi Kivilinna d, j, e, k, algo); 905da7f033dSHerbert Xu hexdump(q, n); 906da7f033dSHerbert Xu goto out; 907da7f033dSHerbert Xu } 908da7f033dSHerbert Xu 909da7f033dSHerbert Xu q += n; 910da7f033dSHerbert Xu if (k == template[i].np - 1 && !enc) { 911d8a32ac2SJussi Kivilinna if (!diff_dst && 912d8a32ac2SJussi Kivilinna memcmp(q, template[i].input + 913da7f033dSHerbert Xu temp + n, authsize)) 914da7f033dSHerbert Xu n = authsize; 915da7f033dSHerbert Xu else 916da7f033dSHerbert Xu n = 0; 917da7f033dSHerbert Xu } else { 91805b1d338SCristian Stoica for (n = 0; offset_in_page(q + n) && q[n]; n++) 919da7f033dSHerbert Xu ; 920da7f033dSHerbert Xu } 921da7f033dSHerbert Xu if (n) { 922d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n", 923d8a32ac2SJussi Kivilinna d, j, e, k, algo, n); 924da7f033dSHerbert Xu hexdump(q, n); 925da7f033dSHerbert Xu goto out; 926da7f033dSHerbert Xu } 927da7f033dSHerbert Xu 928da7f033dSHerbert Xu temp += template[i].tap[k]; 929da7f033dSHerbert Xu } 930da7f033dSHerbert Xu } 931da7f033dSHerbert Xu 932da7f033dSHerbert Xu ret = 0; 933da7f033dSHerbert Xu 934da7f033dSHerbert Xu out: 935da7f033dSHerbert Xu aead_request_free(req); 936d8a32ac2SJussi Kivilinna kfree(sg); 937d8a32ac2SJussi Kivilinna out_nosg: 938d8a32ac2SJussi Kivilinna if (diff_dst) 939d8a32ac2SJussi Kivilinna testmgr_free_buf(xoutbuf); 940d8a32ac2SJussi Kivilinna out_nooutbuf: 941f8b0d4d0SHerbert Xu testmgr_free_buf(axbuf); 942f8b0d4d0SHerbert Xu out_noaxbuf: 943f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 944f8b0d4d0SHerbert Xu out_noxbuf: 94529b77e5dSHoria Geanta kfree(key); 9469bac019dSTadeusz Struk kfree(iv); 947da7f033dSHerbert Xu return ret; 948da7f033dSHerbert Xu } 949da7f033dSHerbert Xu 950d8a32ac2SJussi Kivilinna static int test_aead(struct crypto_aead *tfm, int enc, 951b13b1e0cSEric Biggers const struct aead_testvec *template, unsigned int tcount) 952d8a32ac2SJussi Kivilinna { 95358dcf548SJussi Kivilinna unsigned int alignmask; 954d8a32ac2SJussi Kivilinna int ret; 955d8a32ac2SJussi Kivilinna 956d8a32ac2SJussi Kivilinna /* test 'dst == src' case */ 95758dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, false, 0); 958d8a32ac2SJussi Kivilinna if (ret) 959d8a32ac2SJussi Kivilinna return ret; 960d8a32ac2SJussi Kivilinna 961d8a32ac2SJussi Kivilinna /* test 'dst != src' case */ 96258dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 0); 96358dcf548SJussi Kivilinna if (ret) 96458dcf548SJussi Kivilinna return ret; 96558dcf548SJussi Kivilinna 96658dcf548SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 96758dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 1); 96858dcf548SJussi Kivilinna if (ret) 96958dcf548SJussi Kivilinna return ret; 97058dcf548SJussi Kivilinna 97158dcf548SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 97258dcf548SJussi Kivilinna if (alignmask) { 97358dcf548SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 97458dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 97558dcf548SJussi Kivilinna alignmask + 1); 97658dcf548SJussi Kivilinna if (ret) 97758dcf548SJussi Kivilinna return ret; 97858dcf548SJussi Kivilinna } 97958dcf548SJussi Kivilinna 98058dcf548SJussi Kivilinna return 0; 981d8a32ac2SJussi Kivilinna } 982d8a32ac2SJussi Kivilinna 9831aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc, 984b13b1e0cSEric Biggers const struct cipher_testvec *template, 985b13b1e0cSEric Biggers unsigned int tcount) 9861aa4ecd9SHerbert Xu { 9871aa4ecd9SHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm)); 9881aa4ecd9SHerbert Xu unsigned int i, j, k; 9891aa4ecd9SHerbert Xu char *q; 9901aa4ecd9SHerbert Xu const char *e; 9911aa4ecd9SHerbert Xu void *data; 992f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 993f8b0d4d0SHerbert Xu int ret = -ENOMEM; 994f8b0d4d0SHerbert Xu 995f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 996f8b0d4d0SHerbert Xu goto out_nobuf; 9971aa4ecd9SHerbert Xu 9981aa4ecd9SHerbert Xu if (enc == ENCRYPT) 9991aa4ecd9SHerbert Xu e = "encryption"; 10001aa4ecd9SHerbert Xu else 10011aa4ecd9SHerbert Xu e = "decryption"; 10021aa4ecd9SHerbert Xu 10031aa4ecd9SHerbert Xu j = 0; 10041aa4ecd9SHerbert Xu for (i = 0; i < tcount; i++) { 10051aa4ecd9SHerbert Xu if (template[i].np) 10061aa4ecd9SHerbert Xu continue; 10071aa4ecd9SHerbert Xu 100810faa8c0SStephan Mueller if (fips_enabled && template[i].fips_skip) 100910faa8c0SStephan Mueller continue; 101010faa8c0SStephan Mueller 10111aa4ecd9SHerbert Xu j++; 10121aa4ecd9SHerbert Xu 1013fd57f22aSHerbert Xu ret = -EINVAL; 1014fd57f22aSHerbert Xu if (WARN_ON(template[i].ilen > PAGE_SIZE)) 1015fd57f22aSHerbert Xu goto out; 1016fd57f22aSHerbert Xu 10171aa4ecd9SHerbert Xu data = xbuf[0]; 10181aa4ecd9SHerbert Xu memcpy(data, template[i].input, template[i].ilen); 10191aa4ecd9SHerbert Xu 10201aa4ecd9SHerbert Xu crypto_cipher_clear_flags(tfm, ~0); 10211aa4ecd9SHerbert Xu if (template[i].wk) 10221aa4ecd9SHerbert Xu crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 10231aa4ecd9SHerbert Xu 10241aa4ecd9SHerbert Xu ret = crypto_cipher_setkey(tfm, template[i].key, 10251aa4ecd9SHerbert Xu template[i].klen); 10260fae0c1eSYanjiang Jin if (template[i].fail == !ret) { 10271aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: setkey failed " 10281aa4ecd9SHerbert Xu "on test %d for %s: flags=%x\n", j, 10291aa4ecd9SHerbert Xu algo, crypto_cipher_get_flags(tfm)); 10301aa4ecd9SHerbert Xu goto out; 10311aa4ecd9SHerbert Xu } else if (ret) 10321aa4ecd9SHerbert Xu continue; 10331aa4ecd9SHerbert Xu 10341aa4ecd9SHerbert Xu for (k = 0; k < template[i].ilen; 10351aa4ecd9SHerbert Xu k += crypto_cipher_blocksize(tfm)) { 10361aa4ecd9SHerbert Xu if (enc) 10371aa4ecd9SHerbert Xu crypto_cipher_encrypt_one(tfm, data + k, 10381aa4ecd9SHerbert Xu data + k); 10391aa4ecd9SHerbert Xu else 10401aa4ecd9SHerbert Xu crypto_cipher_decrypt_one(tfm, data + k, 10411aa4ecd9SHerbert Xu data + k); 10421aa4ecd9SHerbert Xu } 10431aa4ecd9SHerbert Xu 10441aa4ecd9SHerbert Xu q = data; 10451aa4ecd9SHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 10461aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: Test %d failed " 10471aa4ecd9SHerbert Xu "on %s for %s\n", j, e, algo); 10481aa4ecd9SHerbert Xu hexdump(q, template[i].rlen); 10491aa4ecd9SHerbert Xu ret = -EINVAL; 10501aa4ecd9SHerbert Xu goto out; 10511aa4ecd9SHerbert Xu } 10521aa4ecd9SHerbert Xu } 10531aa4ecd9SHerbert Xu 10541aa4ecd9SHerbert Xu ret = 0; 10551aa4ecd9SHerbert Xu 10561aa4ecd9SHerbert Xu out: 1057f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 1058f8b0d4d0SHerbert Xu out_nobuf: 10591aa4ecd9SHerbert Xu return ret; 10601aa4ecd9SHerbert Xu } 10611aa4ecd9SHerbert Xu 106212773d93SHerbert Xu static int __test_skcipher(struct crypto_skcipher *tfm, int enc, 1063b13b1e0cSEric Biggers const struct cipher_testvec *template, 1064b13b1e0cSEric Biggers unsigned int tcount, 10653a338f20SJussi Kivilinna const bool diff_dst, const int align_offset) 1066da7f033dSHerbert Xu { 1067da7f033dSHerbert Xu const char *algo = 106812773d93SHerbert Xu crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)); 1069da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 1070da7f033dSHerbert Xu char *q; 107112773d93SHerbert Xu struct skcipher_request *req; 1072da7f033dSHerbert Xu struct scatterlist sg[8]; 107308d6af8cSJussi Kivilinna struct scatterlist sgout[8]; 107408d6af8cSJussi Kivilinna const char *e, *d; 10757f397136SGilad Ben-Yossef struct crypto_wait wait; 1076da7f033dSHerbert Xu void *data; 1077da7f033dSHerbert Xu char iv[MAX_IVLEN]; 1078f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 107908d6af8cSJussi Kivilinna char *xoutbuf[XBUFSIZE]; 1080f8b0d4d0SHerbert Xu int ret = -ENOMEM; 108184cba178SAndrey Ryabinin unsigned int ivsize = crypto_skcipher_ivsize(tfm); 1082f8b0d4d0SHerbert Xu 1083f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 1084f8b0d4d0SHerbert Xu goto out_nobuf; 1085da7f033dSHerbert Xu 108608d6af8cSJussi Kivilinna if (diff_dst && testmgr_alloc_buf(xoutbuf)) 108708d6af8cSJussi Kivilinna goto out_nooutbuf; 108808d6af8cSJussi Kivilinna 108908d6af8cSJussi Kivilinna if (diff_dst) 109008d6af8cSJussi Kivilinna d = "-ddst"; 109108d6af8cSJussi Kivilinna else 109208d6af8cSJussi Kivilinna d = ""; 109308d6af8cSJussi Kivilinna 1094da7f033dSHerbert Xu if (enc == ENCRYPT) 1095da7f033dSHerbert Xu e = "encryption"; 1096da7f033dSHerbert Xu else 1097da7f033dSHerbert Xu e = "decryption"; 1098da7f033dSHerbert Xu 10997f397136SGilad Ben-Yossef crypto_init_wait(&wait); 1100da7f033dSHerbert Xu 110112773d93SHerbert Xu req = skcipher_request_alloc(tfm, GFP_KERNEL); 1102da7f033dSHerbert Xu if (!req) { 110308d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Failed to allocate request for %s\n", 110408d6af8cSJussi Kivilinna d, algo); 1105da7f033dSHerbert Xu goto out; 1106da7f033dSHerbert Xu } 1107da7f033dSHerbert Xu 110812773d93SHerbert Xu skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 11097f397136SGilad Ben-Yossef crypto_req_done, &wait); 1110da7f033dSHerbert Xu 1111da7f033dSHerbert Xu j = 0; 1112da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 1113bbb9a7ddSCristian Stoica if (template[i].np && !template[i].also_non_np) 1114bbb9a7ddSCristian Stoica continue; 1115bbb9a7ddSCristian Stoica 111610faa8c0SStephan Mueller if (fips_enabled && template[i].fips_skip) 111710faa8c0SStephan Mueller continue; 111810faa8c0SStephan Mueller 1119da7f033dSHerbert Xu if (template[i].iv) 112084cba178SAndrey Ryabinin memcpy(iv, template[i].iv, ivsize); 1121da7f033dSHerbert Xu else 1122da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 1123da7f033dSHerbert Xu 1124da7f033dSHerbert Xu j++; 1125fd57f22aSHerbert Xu ret = -EINVAL; 1126a1aa44a2SCristian Stoica if (WARN_ON(align_offset + template[i].ilen > PAGE_SIZE)) 1127fd57f22aSHerbert Xu goto out; 1128fd57f22aSHerbert Xu 1129da7f033dSHerbert Xu data = xbuf[0]; 11303a338f20SJussi Kivilinna data += align_offset; 1131da7f033dSHerbert Xu memcpy(data, template[i].input, template[i].ilen); 1132da7f033dSHerbert Xu 113312773d93SHerbert Xu crypto_skcipher_clear_flags(tfm, ~0); 1134da7f033dSHerbert Xu if (template[i].wk) 113512773d93SHerbert Xu crypto_skcipher_set_flags(tfm, 113612773d93SHerbert Xu CRYPTO_TFM_REQ_WEAK_KEY); 1137da7f033dSHerbert Xu 113812773d93SHerbert Xu ret = crypto_skcipher_setkey(tfm, template[i].key, 1139da7f033dSHerbert Xu template[i].klen); 11400fae0c1eSYanjiang Jin if (template[i].fail == !ret) { 114108d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n", 114212773d93SHerbert Xu d, j, algo, crypto_skcipher_get_flags(tfm)); 1143da7f033dSHerbert Xu goto out; 1144da7f033dSHerbert Xu } else if (ret) 1145da7f033dSHerbert Xu continue; 1146da7f033dSHerbert Xu 1147da7f033dSHerbert Xu sg_init_one(&sg[0], data, template[i].ilen); 114808d6af8cSJussi Kivilinna if (diff_dst) { 114908d6af8cSJussi Kivilinna data = xoutbuf[0]; 11503a338f20SJussi Kivilinna data += align_offset; 115108d6af8cSJussi Kivilinna sg_init_one(&sgout[0], data, template[i].ilen); 115208d6af8cSJussi Kivilinna } 1153da7f033dSHerbert Xu 115412773d93SHerbert Xu skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 1155da7f033dSHerbert Xu template[i].ilen, iv); 11567f397136SGilad Ben-Yossef ret = crypto_wait_req(enc ? crypto_skcipher_encrypt(req) : 11577f397136SGilad Ben-Yossef crypto_skcipher_decrypt(req), &wait); 1158da7f033dSHerbert Xu 11597f397136SGilad Ben-Yossef if (ret) { 116008d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n", 116108d6af8cSJussi Kivilinna d, e, j, algo, -ret); 1162da7f033dSHerbert Xu goto out; 1163da7f033dSHerbert Xu } 1164da7f033dSHerbert Xu 1165da7f033dSHerbert Xu q = data; 1166da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 11678a826a34SBoris BREZILLON pr_err("alg: skcipher%s: Test %d failed (invalid result) on %s for %s\n", 116808d6af8cSJussi Kivilinna d, j, e, algo); 1169da7f033dSHerbert Xu hexdump(q, template[i].rlen); 1170da7f033dSHerbert Xu ret = -EINVAL; 1171da7f033dSHerbert Xu goto out; 1172da7f033dSHerbert Xu } 11738a826a34SBoris BREZILLON 11748a826a34SBoris BREZILLON if (template[i].iv_out && 11758a826a34SBoris BREZILLON memcmp(iv, template[i].iv_out, 11768a826a34SBoris BREZILLON crypto_skcipher_ivsize(tfm))) { 11778a826a34SBoris BREZILLON pr_err("alg: skcipher%s: Test %d failed (invalid output IV) on %s for %s\n", 11788a826a34SBoris BREZILLON d, j, e, algo); 11798a826a34SBoris BREZILLON hexdump(iv, crypto_skcipher_ivsize(tfm)); 11808a826a34SBoris BREZILLON ret = -EINVAL; 11818a826a34SBoris BREZILLON goto out; 11828a826a34SBoris BREZILLON } 1183da7f033dSHerbert Xu } 1184da7f033dSHerbert Xu 1185da7f033dSHerbert Xu j = 0; 1186da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 11873a338f20SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 11883a338f20SJussi Kivilinna if (align_offset != 0) 11893a338f20SJussi Kivilinna break; 1190da7f033dSHerbert Xu 1191bbb9a7ddSCristian Stoica if (!template[i].np) 1192bbb9a7ddSCristian Stoica continue; 1193bbb9a7ddSCristian Stoica 119410faa8c0SStephan Mueller if (fips_enabled && template[i].fips_skip) 119510faa8c0SStephan Mueller continue; 119610faa8c0SStephan Mueller 1197da7f033dSHerbert Xu if (template[i].iv) 119884cba178SAndrey Ryabinin memcpy(iv, template[i].iv, ivsize); 1199da7f033dSHerbert Xu else 1200da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 1201da7f033dSHerbert Xu 1202da7f033dSHerbert Xu j++; 120312773d93SHerbert Xu crypto_skcipher_clear_flags(tfm, ~0); 1204da7f033dSHerbert Xu if (template[i].wk) 120512773d93SHerbert Xu crypto_skcipher_set_flags(tfm, 120612773d93SHerbert Xu CRYPTO_TFM_REQ_WEAK_KEY); 1207da7f033dSHerbert Xu 120812773d93SHerbert Xu ret = crypto_skcipher_setkey(tfm, template[i].key, 1209da7f033dSHerbert Xu template[i].klen); 12100fae0c1eSYanjiang Jin if (template[i].fail == !ret) { 121108d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n", 121212773d93SHerbert Xu d, j, algo, crypto_skcipher_get_flags(tfm)); 1213da7f033dSHerbert Xu goto out; 1214da7f033dSHerbert Xu } else if (ret) 1215da7f033dSHerbert Xu continue; 1216da7f033dSHerbert Xu 1217da7f033dSHerbert Xu temp = 0; 1218da7f033dSHerbert Xu ret = -EINVAL; 1219da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 122008d6af8cSJussi Kivilinna if (diff_dst) 122108d6af8cSJussi Kivilinna sg_init_table(sgout, template[i].np); 1222da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 1223da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 1224da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 1225da7f033dSHerbert Xu goto out; 1226da7f033dSHerbert Xu 1227a1aa44a2SCristian Stoica q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]); 1228da7f033dSHerbert Xu 1229a1aa44a2SCristian Stoica memcpy(q, template[i].input + temp, template[i].tap[k]); 1230da7f033dSHerbert Xu 1231a1aa44a2SCristian Stoica if (offset_in_page(q) + template[i].tap[k] < PAGE_SIZE) 1232da7f033dSHerbert Xu q[template[i].tap[k]] = 0; 1233da7f033dSHerbert Xu 1234da7f033dSHerbert Xu sg_set_buf(&sg[k], q, template[i].tap[k]); 123508d6af8cSJussi Kivilinna if (diff_dst) { 123608d6af8cSJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 123708d6af8cSJussi Kivilinna offset_in_page(IDX[k]); 123808d6af8cSJussi Kivilinna 1239a1aa44a2SCristian Stoica sg_set_buf(&sgout[k], q, template[i].tap[k]); 124008d6af8cSJussi Kivilinna 124108d6af8cSJussi Kivilinna memset(q, 0, template[i].tap[k]); 124208d6af8cSJussi Kivilinna if (offset_in_page(q) + 124308d6af8cSJussi Kivilinna template[i].tap[k] < PAGE_SIZE) 124408d6af8cSJussi Kivilinna q[template[i].tap[k]] = 0; 124508d6af8cSJussi Kivilinna } 1246da7f033dSHerbert Xu 1247da7f033dSHerbert Xu temp += template[i].tap[k]; 1248da7f033dSHerbert Xu } 1249da7f033dSHerbert Xu 125012773d93SHerbert Xu skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 1251da7f033dSHerbert Xu template[i].ilen, iv); 1252da7f033dSHerbert Xu 12537f397136SGilad Ben-Yossef ret = crypto_wait_req(enc ? crypto_skcipher_encrypt(req) : 12547f397136SGilad Ben-Yossef crypto_skcipher_decrypt(req), &wait); 1255da7f033dSHerbert Xu 12567f397136SGilad Ben-Yossef if (ret) { 125708d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n", 125808d6af8cSJussi Kivilinna d, e, j, algo, -ret); 1259da7f033dSHerbert Xu goto out; 1260da7f033dSHerbert Xu } 1261da7f033dSHerbert Xu 1262da7f033dSHerbert Xu temp = 0; 1263da7f033dSHerbert Xu ret = -EINVAL; 1264da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 126508d6af8cSJussi Kivilinna if (diff_dst) 126608d6af8cSJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 126708d6af8cSJussi Kivilinna offset_in_page(IDX[k]); 126808d6af8cSJussi Kivilinna else 1269da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 1270da7f033dSHerbert Xu offset_in_page(IDX[k]); 1271da7f033dSHerbert Xu 1272da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, 1273da7f033dSHerbert Xu template[i].tap[k])) { 127408d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n", 127508d6af8cSJussi Kivilinna d, j, e, k, algo); 1276da7f033dSHerbert Xu hexdump(q, template[i].tap[k]); 1277da7f033dSHerbert Xu goto out; 1278da7f033dSHerbert Xu } 1279da7f033dSHerbert Xu 1280da7f033dSHerbert Xu q += template[i].tap[k]; 1281da7f033dSHerbert Xu for (n = 0; offset_in_page(q + n) && q[n]; n++) 1282da7f033dSHerbert Xu ; 1283da7f033dSHerbert Xu if (n) { 128408d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n", 128508d6af8cSJussi Kivilinna d, j, e, k, algo, n); 1286da7f033dSHerbert Xu hexdump(q, n); 1287da7f033dSHerbert Xu goto out; 1288da7f033dSHerbert Xu } 1289da7f033dSHerbert Xu temp += template[i].tap[k]; 1290da7f033dSHerbert Xu } 1291da7f033dSHerbert Xu } 1292da7f033dSHerbert Xu 1293da7f033dSHerbert Xu ret = 0; 1294da7f033dSHerbert Xu 1295da7f033dSHerbert Xu out: 129612773d93SHerbert Xu skcipher_request_free(req); 129708d6af8cSJussi Kivilinna if (diff_dst) 129808d6af8cSJussi Kivilinna testmgr_free_buf(xoutbuf); 129908d6af8cSJussi Kivilinna out_nooutbuf: 1300f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 1301f8b0d4d0SHerbert Xu out_nobuf: 1302da7f033dSHerbert Xu return ret; 1303da7f033dSHerbert Xu } 1304da7f033dSHerbert Xu 130512773d93SHerbert Xu static int test_skcipher(struct crypto_skcipher *tfm, int enc, 1306b13b1e0cSEric Biggers const struct cipher_testvec *template, 1307b13b1e0cSEric Biggers unsigned int tcount) 130808d6af8cSJussi Kivilinna { 13093a338f20SJussi Kivilinna unsigned int alignmask; 131008d6af8cSJussi Kivilinna int ret; 131108d6af8cSJussi Kivilinna 131208d6af8cSJussi Kivilinna /* test 'dst == src' case */ 13133a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, false, 0); 131408d6af8cSJussi Kivilinna if (ret) 131508d6af8cSJussi Kivilinna return ret; 131608d6af8cSJussi Kivilinna 131708d6af8cSJussi Kivilinna /* test 'dst != src' case */ 13183a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 0); 13193a338f20SJussi Kivilinna if (ret) 13203a338f20SJussi Kivilinna return ret; 13213a338f20SJussi Kivilinna 13223a338f20SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 13233a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 1); 13243a338f20SJussi Kivilinna if (ret) 13253a338f20SJussi Kivilinna return ret; 13263a338f20SJussi Kivilinna 13273a338f20SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 13283a338f20SJussi Kivilinna if (alignmask) { 13293a338f20SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 13303a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 13313a338f20SJussi Kivilinna alignmask + 1); 13323a338f20SJussi Kivilinna if (ret) 13333a338f20SJussi Kivilinna return ret; 13343a338f20SJussi Kivilinna } 13353a338f20SJussi Kivilinna 13363a338f20SJussi Kivilinna return 0; 133708d6af8cSJussi Kivilinna } 133808d6af8cSJussi Kivilinna 1339b13b1e0cSEric Biggers static int test_comp(struct crypto_comp *tfm, 1340b13b1e0cSEric Biggers const struct comp_testvec *ctemplate, 1341b13b1e0cSEric Biggers const struct comp_testvec *dtemplate, 1342b13b1e0cSEric Biggers int ctcount, int dtcount) 1343da7f033dSHerbert Xu { 1344da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm)); 134533607384SMahipal Challa char *output, *decomp_output; 1346da7f033dSHerbert Xu unsigned int i; 1347da7f033dSHerbert Xu int ret; 1348da7f033dSHerbert Xu 134933607384SMahipal Challa output = kmalloc(COMP_BUF_SIZE, GFP_KERNEL); 135033607384SMahipal Challa if (!output) 135133607384SMahipal Challa return -ENOMEM; 135233607384SMahipal Challa 135333607384SMahipal Challa decomp_output = kmalloc(COMP_BUF_SIZE, GFP_KERNEL); 135433607384SMahipal Challa if (!decomp_output) { 135533607384SMahipal Challa kfree(output); 135633607384SMahipal Challa return -ENOMEM; 135733607384SMahipal Challa } 135833607384SMahipal Challa 1359da7f033dSHerbert Xu for (i = 0; i < ctcount; i++) { 1360c79cf910SGeert Uytterhoeven int ilen; 1361c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 1362da7f033dSHerbert Xu 136333607384SMahipal Challa memset(output, 0, sizeof(COMP_BUF_SIZE)); 136433607384SMahipal Challa memset(decomp_output, 0, sizeof(COMP_BUF_SIZE)); 1365da7f033dSHerbert Xu 1366da7f033dSHerbert Xu ilen = ctemplate[i].inlen; 1367da7f033dSHerbert Xu ret = crypto_comp_compress(tfm, ctemplate[i].input, 136833607384SMahipal Challa ilen, output, &dlen); 1369da7f033dSHerbert Xu if (ret) { 1370da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: compression failed " 1371da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1372da7f033dSHerbert Xu -ret); 1373da7f033dSHerbert Xu goto out; 1374da7f033dSHerbert Xu } 1375da7f033dSHerbert Xu 137633607384SMahipal Challa ilen = dlen; 137733607384SMahipal Challa dlen = COMP_BUF_SIZE; 137833607384SMahipal Challa ret = crypto_comp_decompress(tfm, output, 137933607384SMahipal Challa ilen, decomp_output, &dlen); 138033607384SMahipal Challa if (ret) { 138133607384SMahipal Challa pr_err("alg: comp: compression failed: decompress: on test %d for %s failed: ret=%d\n", 138233607384SMahipal Challa i + 1, algo, -ret); 138333607384SMahipal Challa goto out; 138433607384SMahipal Challa } 138533607384SMahipal Challa 138633607384SMahipal Challa if (dlen != ctemplate[i].inlen) { 1387b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Compression test %d " 1388b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1389b812eb00SGeert Uytterhoeven dlen); 1390b812eb00SGeert Uytterhoeven ret = -EINVAL; 1391b812eb00SGeert Uytterhoeven goto out; 1392b812eb00SGeert Uytterhoeven } 1393b812eb00SGeert Uytterhoeven 139433607384SMahipal Challa if (memcmp(decomp_output, ctemplate[i].input, 139533607384SMahipal Challa ctemplate[i].inlen)) { 139633607384SMahipal Challa pr_err("alg: comp: compression failed: output differs: on test %d for %s\n", 139733607384SMahipal Challa i + 1, algo); 139833607384SMahipal Challa hexdump(decomp_output, dlen); 1399da7f033dSHerbert Xu ret = -EINVAL; 1400da7f033dSHerbert Xu goto out; 1401da7f033dSHerbert Xu } 1402da7f033dSHerbert Xu } 1403da7f033dSHerbert Xu 1404da7f033dSHerbert Xu for (i = 0; i < dtcount; i++) { 1405c79cf910SGeert Uytterhoeven int ilen; 1406c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 1407da7f033dSHerbert Xu 140833607384SMahipal Challa memset(decomp_output, 0, sizeof(COMP_BUF_SIZE)); 1409da7f033dSHerbert Xu 1410da7f033dSHerbert Xu ilen = dtemplate[i].inlen; 1411da7f033dSHerbert Xu ret = crypto_comp_decompress(tfm, dtemplate[i].input, 141233607384SMahipal Challa ilen, decomp_output, &dlen); 1413da7f033dSHerbert Xu if (ret) { 1414da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: decompression failed " 1415da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1416da7f033dSHerbert Xu -ret); 1417da7f033dSHerbert Xu goto out; 1418da7f033dSHerbert Xu } 1419da7f033dSHerbert Xu 1420b812eb00SGeert Uytterhoeven if (dlen != dtemplate[i].outlen) { 1421b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Decompression test %d " 1422b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1423b812eb00SGeert Uytterhoeven dlen); 1424b812eb00SGeert Uytterhoeven ret = -EINVAL; 1425b812eb00SGeert Uytterhoeven goto out; 1426b812eb00SGeert Uytterhoeven } 1427b812eb00SGeert Uytterhoeven 142833607384SMahipal Challa if (memcmp(decomp_output, dtemplate[i].output, dlen)) { 1429da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Decompression test %d " 1430da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 143133607384SMahipal Challa hexdump(decomp_output, dlen); 1432da7f033dSHerbert Xu ret = -EINVAL; 1433da7f033dSHerbert Xu goto out; 1434da7f033dSHerbert Xu } 1435da7f033dSHerbert Xu } 1436da7f033dSHerbert Xu 1437da7f033dSHerbert Xu ret = 0; 1438da7f033dSHerbert Xu 1439da7f033dSHerbert Xu out: 144033607384SMahipal Challa kfree(decomp_output); 144133607384SMahipal Challa kfree(output); 1442da7f033dSHerbert Xu return ret; 1443da7f033dSHerbert Xu } 1444da7f033dSHerbert Xu 1445b13b1e0cSEric Biggers static int test_acomp(struct crypto_acomp *tfm, 1446b13b1e0cSEric Biggers const struct comp_testvec *ctemplate, 1447b13b1e0cSEric Biggers const struct comp_testvec *dtemplate, 1448b13b1e0cSEric Biggers int ctcount, int dtcount) 1449d7db7a88SGiovanni Cabiddu { 1450d7db7a88SGiovanni Cabiddu const char *algo = crypto_tfm_alg_driver_name(crypto_acomp_tfm(tfm)); 1451d7db7a88SGiovanni Cabiddu unsigned int i; 1452a9943a0aSGiovanni Cabiddu char *output, *decomp_out; 1453d7db7a88SGiovanni Cabiddu int ret; 1454d7db7a88SGiovanni Cabiddu struct scatterlist src, dst; 1455d7db7a88SGiovanni Cabiddu struct acomp_req *req; 14567f397136SGilad Ben-Yossef struct crypto_wait wait; 1457d7db7a88SGiovanni Cabiddu 1458eb095593SEric Biggers output = kmalloc(COMP_BUF_SIZE, GFP_KERNEL); 1459eb095593SEric Biggers if (!output) 1460eb095593SEric Biggers return -ENOMEM; 1461eb095593SEric Biggers 1462a9943a0aSGiovanni Cabiddu decomp_out = kmalloc(COMP_BUF_SIZE, GFP_KERNEL); 1463a9943a0aSGiovanni Cabiddu if (!decomp_out) { 1464a9943a0aSGiovanni Cabiddu kfree(output); 1465a9943a0aSGiovanni Cabiddu return -ENOMEM; 1466a9943a0aSGiovanni Cabiddu } 1467a9943a0aSGiovanni Cabiddu 1468d7db7a88SGiovanni Cabiddu for (i = 0; i < ctcount; i++) { 1469d7db7a88SGiovanni Cabiddu unsigned int dlen = COMP_BUF_SIZE; 1470d7db7a88SGiovanni Cabiddu int ilen = ctemplate[i].inlen; 147102608e02SLaura Abbott void *input_vec; 1472d7db7a88SGiovanni Cabiddu 1473d2110224SEric Biggers input_vec = kmemdup(ctemplate[i].input, ilen, GFP_KERNEL); 147402608e02SLaura Abbott if (!input_vec) { 147502608e02SLaura Abbott ret = -ENOMEM; 147602608e02SLaura Abbott goto out; 147702608e02SLaura Abbott } 147802608e02SLaura Abbott 1479eb095593SEric Biggers memset(output, 0, dlen); 14807f397136SGilad Ben-Yossef crypto_init_wait(&wait); 148102608e02SLaura Abbott sg_init_one(&src, input_vec, ilen); 1482d7db7a88SGiovanni Cabiddu sg_init_one(&dst, output, dlen); 1483d7db7a88SGiovanni Cabiddu 1484d7db7a88SGiovanni Cabiddu req = acomp_request_alloc(tfm); 1485d7db7a88SGiovanni Cabiddu if (!req) { 1486d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: request alloc failed for %s\n", 1487d7db7a88SGiovanni Cabiddu algo); 148802608e02SLaura Abbott kfree(input_vec); 1489d7db7a88SGiovanni Cabiddu ret = -ENOMEM; 1490d7db7a88SGiovanni Cabiddu goto out; 1491d7db7a88SGiovanni Cabiddu } 1492d7db7a88SGiovanni Cabiddu 1493d7db7a88SGiovanni Cabiddu acomp_request_set_params(req, &src, &dst, ilen, dlen); 1494d7db7a88SGiovanni Cabiddu acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 14957f397136SGilad Ben-Yossef crypto_req_done, &wait); 1496d7db7a88SGiovanni Cabiddu 14977f397136SGilad Ben-Yossef ret = crypto_wait_req(crypto_acomp_compress(req), &wait); 1498d7db7a88SGiovanni Cabiddu if (ret) { 1499d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: compression failed on test %d for %s: ret=%d\n", 1500d7db7a88SGiovanni Cabiddu i + 1, algo, -ret); 150102608e02SLaura Abbott kfree(input_vec); 1502d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1503d7db7a88SGiovanni Cabiddu goto out; 1504d7db7a88SGiovanni Cabiddu } 1505d7db7a88SGiovanni Cabiddu 1506a9943a0aSGiovanni Cabiddu ilen = req->dlen; 1507a9943a0aSGiovanni Cabiddu dlen = COMP_BUF_SIZE; 1508a9943a0aSGiovanni Cabiddu sg_init_one(&src, output, ilen); 1509a9943a0aSGiovanni Cabiddu sg_init_one(&dst, decomp_out, dlen); 15107f397136SGilad Ben-Yossef crypto_init_wait(&wait); 1511a9943a0aSGiovanni Cabiddu acomp_request_set_params(req, &src, &dst, ilen, dlen); 1512a9943a0aSGiovanni Cabiddu 15137f397136SGilad Ben-Yossef ret = crypto_wait_req(crypto_acomp_decompress(req), &wait); 1514a9943a0aSGiovanni Cabiddu if (ret) { 1515a9943a0aSGiovanni Cabiddu pr_err("alg: acomp: compression failed on test %d for %s: ret=%d\n", 1516a9943a0aSGiovanni Cabiddu i + 1, algo, -ret); 1517a9943a0aSGiovanni Cabiddu kfree(input_vec); 1518a9943a0aSGiovanni Cabiddu acomp_request_free(req); 1519a9943a0aSGiovanni Cabiddu goto out; 1520a9943a0aSGiovanni Cabiddu } 1521a9943a0aSGiovanni Cabiddu 1522a9943a0aSGiovanni Cabiddu if (req->dlen != ctemplate[i].inlen) { 1523d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: Compression test %d failed for %s: output len = %d\n", 1524d7db7a88SGiovanni Cabiddu i + 1, algo, req->dlen); 1525d7db7a88SGiovanni Cabiddu ret = -EINVAL; 152602608e02SLaura Abbott kfree(input_vec); 1527d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1528d7db7a88SGiovanni Cabiddu goto out; 1529d7db7a88SGiovanni Cabiddu } 1530d7db7a88SGiovanni Cabiddu 1531a9943a0aSGiovanni Cabiddu if (memcmp(input_vec, decomp_out, req->dlen)) { 1532d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: Compression test %d failed for %s\n", 1533d7db7a88SGiovanni Cabiddu i + 1, algo); 1534d7db7a88SGiovanni Cabiddu hexdump(output, req->dlen); 1535d7db7a88SGiovanni Cabiddu ret = -EINVAL; 153602608e02SLaura Abbott kfree(input_vec); 1537d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1538d7db7a88SGiovanni Cabiddu goto out; 1539d7db7a88SGiovanni Cabiddu } 1540d7db7a88SGiovanni Cabiddu 154102608e02SLaura Abbott kfree(input_vec); 1542d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1543d7db7a88SGiovanni Cabiddu } 1544d7db7a88SGiovanni Cabiddu 1545d7db7a88SGiovanni Cabiddu for (i = 0; i < dtcount; i++) { 1546d7db7a88SGiovanni Cabiddu unsigned int dlen = COMP_BUF_SIZE; 1547d7db7a88SGiovanni Cabiddu int ilen = dtemplate[i].inlen; 154802608e02SLaura Abbott void *input_vec; 1549d7db7a88SGiovanni Cabiddu 1550d2110224SEric Biggers input_vec = kmemdup(dtemplate[i].input, ilen, GFP_KERNEL); 155102608e02SLaura Abbott if (!input_vec) { 155202608e02SLaura Abbott ret = -ENOMEM; 155302608e02SLaura Abbott goto out; 155402608e02SLaura Abbott } 155502608e02SLaura Abbott 1556eb095593SEric Biggers memset(output, 0, dlen); 15577f397136SGilad Ben-Yossef crypto_init_wait(&wait); 155802608e02SLaura Abbott sg_init_one(&src, input_vec, ilen); 1559d7db7a88SGiovanni Cabiddu sg_init_one(&dst, output, dlen); 1560d7db7a88SGiovanni Cabiddu 1561d7db7a88SGiovanni Cabiddu req = acomp_request_alloc(tfm); 1562d7db7a88SGiovanni Cabiddu if (!req) { 1563d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: request alloc failed for %s\n", 1564d7db7a88SGiovanni Cabiddu algo); 156502608e02SLaura Abbott kfree(input_vec); 1566d7db7a88SGiovanni Cabiddu ret = -ENOMEM; 1567d7db7a88SGiovanni Cabiddu goto out; 1568d7db7a88SGiovanni Cabiddu } 1569d7db7a88SGiovanni Cabiddu 1570d7db7a88SGiovanni Cabiddu acomp_request_set_params(req, &src, &dst, ilen, dlen); 1571d7db7a88SGiovanni Cabiddu acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 15727f397136SGilad Ben-Yossef crypto_req_done, &wait); 1573d7db7a88SGiovanni Cabiddu 15747f397136SGilad Ben-Yossef ret = crypto_wait_req(crypto_acomp_decompress(req), &wait); 1575d7db7a88SGiovanni Cabiddu if (ret) { 1576d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: decompression failed on test %d for %s: ret=%d\n", 1577d7db7a88SGiovanni Cabiddu i + 1, algo, -ret); 157802608e02SLaura Abbott kfree(input_vec); 1579d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1580d7db7a88SGiovanni Cabiddu goto out; 1581d7db7a88SGiovanni Cabiddu } 1582d7db7a88SGiovanni Cabiddu 1583d7db7a88SGiovanni Cabiddu if (req->dlen != dtemplate[i].outlen) { 1584d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: Decompression test %d failed for %s: output len = %d\n", 1585d7db7a88SGiovanni Cabiddu i + 1, algo, req->dlen); 1586d7db7a88SGiovanni Cabiddu ret = -EINVAL; 158702608e02SLaura Abbott kfree(input_vec); 1588d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1589d7db7a88SGiovanni Cabiddu goto out; 1590d7db7a88SGiovanni Cabiddu } 1591d7db7a88SGiovanni Cabiddu 1592d7db7a88SGiovanni Cabiddu if (memcmp(output, dtemplate[i].output, req->dlen)) { 1593d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: Decompression test %d failed for %s\n", 1594d7db7a88SGiovanni Cabiddu i + 1, algo); 1595d7db7a88SGiovanni Cabiddu hexdump(output, req->dlen); 1596d7db7a88SGiovanni Cabiddu ret = -EINVAL; 159702608e02SLaura Abbott kfree(input_vec); 1598d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1599d7db7a88SGiovanni Cabiddu goto out; 1600d7db7a88SGiovanni Cabiddu } 1601d7db7a88SGiovanni Cabiddu 160202608e02SLaura Abbott kfree(input_vec); 1603d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1604d7db7a88SGiovanni Cabiddu } 1605d7db7a88SGiovanni Cabiddu 1606d7db7a88SGiovanni Cabiddu ret = 0; 1607d7db7a88SGiovanni Cabiddu 1608d7db7a88SGiovanni Cabiddu out: 1609a9943a0aSGiovanni Cabiddu kfree(decomp_out); 1610eb095593SEric Biggers kfree(output); 1611d7db7a88SGiovanni Cabiddu return ret; 1612d7db7a88SGiovanni Cabiddu } 1613d7db7a88SGiovanni Cabiddu 1614b13b1e0cSEric Biggers static int test_cprng(struct crypto_rng *tfm, 1615b13b1e0cSEric Biggers const struct cprng_testvec *template, 16167647d6ceSJarod Wilson unsigned int tcount) 16177647d6ceSJarod Wilson { 16187647d6ceSJarod Wilson const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm)); 1619fa4ef8a6SFelipe Contreras int err = 0, i, j, seedsize; 16207647d6ceSJarod Wilson u8 *seed; 16217647d6ceSJarod Wilson char result[32]; 16227647d6ceSJarod Wilson 16237647d6ceSJarod Wilson seedsize = crypto_rng_seedsize(tfm); 16247647d6ceSJarod Wilson 16257647d6ceSJarod Wilson seed = kmalloc(seedsize, GFP_KERNEL); 16267647d6ceSJarod Wilson if (!seed) { 16277647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to allocate seed space " 16287647d6ceSJarod Wilson "for %s\n", algo); 16297647d6ceSJarod Wilson return -ENOMEM; 16307647d6ceSJarod Wilson } 16317647d6ceSJarod Wilson 16327647d6ceSJarod Wilson for (i = 0; i < tcount; i++) { 16337647d6ceSJarod Wilson memset(result, 0, 32); 16347647d6ceSJarod Wilson 16357647d6ceSJarod Wilson memcpy(seed, template[i].v, template[i].vlen); 16367647d6ceSJarod Wilson memcpy(seed + template[i].vlen, template[i].key, 16377647d6ceSJarod Wilson template[i].klen); 16387647d6ceSJarod Wilson memcpy(seed + template[i].vlen + template[i].klen, 16397647d6ceSJarod Wilson template[i].dt, template[i].dtlen); 16407647d6ceSJarod Wilson 16417647d6ceSJarod Wilson err = crypto_rng_reset(tfm, seed, seedsize); 16427647d6ceSJarod Wilson if (err) { 16437647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to reset rng " 16447647d6ceSJarod Wilson "for %s\n", algo); 16457647d6ceSJarod Wilson goto out; 16467647d6ceSJarod Wilson } 16477647d6ceSJarod Wilson 16487647d6ceSJarod Wilson for (j = 0; j < template[i].loops; j++) { 16497647d6ceSJarod Wilson err = crypto_rng_get_bytes(tfm, result, 16507647d6ceSJarod Wilson template[i].rlen); 165119e60e13SStephan Mueller if (err < 0) { 16527647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to obtain " 16537647d6ceSJarod Wilson "the correct amount of random data for " 165419e60e13SStephan Mueller "%s (requested %d)\n", algo, 165519e60e13SStephan Mueller template[i].rlen); 16567647d6ceSJarod Wilson goto out; 16577647d6ceSJarod Wilson } 16587647d6ceSJarod Wilson } 16597647d6ceSJarod Wilson 16607647d6ceSJarod Wilson err = memcmp(result, template[i].result, 16617647d6ceSJarod Wilson template[i].rlen); 16627647d6ceSJarod Wilson if (err) { 16637647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Test %d failed for %s\n", 16647647d6ceSJarod Wilson i, algo); 16657647d6ceSJarod Wilson hexdump(result, template[i].rlen); 16667647d6ceSJarod Wilson err = -EINVAL; 16677647d6ceSJarod Wilson goto out; 16687647d6ceSJarod Wilson } 16697647d6ceSJarod Wilson } 16707647d6ceSJarod Wilson 16717647d6ceSJarod Wilson out: 16727647d6ceSJarod Wilson kfree(seed); 16737647d6ceSJarod Wilson return err; 16747647d6ceSJarod Wilson } 16757647d6ceSJarod Wilson 1676da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver, 1677da7f033dSHerbert Xu u32 type, u32 mask) 1678da7f033dSHerbert Xu { 1679da7f033dSHerbert Xu struct crypto_aead *tfm; 1680da7f033dSHerbert Xu int err = 0; 1681da7f033dSHerbert Xu 1682eed93e0cSHerbert Xu tfm = crypto_alloc_aead(driver, type, mask); 1683da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1684da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to load transform for %s: " 1685da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1686da7f033dSHerbert Xu return PTR_ERR(tfm); 1687da7f033dSHerbert Xu } 1688da7f033dSHerbert Xu 1689da7f033dSHerbert Xu if (desc->suite.aead.enc.vecs) { 1690da7f033dSHerbert Xu err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs, 1691da7f033dSHerbert Xu desc->suite.aead.enc.count); 1692da7f033dSHerbert Xu if (err) 1693da7f033dSHerbert Xu goto out; 1694da7f033dSHerbert Xu } 1695da7f033dSHerbert Xu 1696da7f033dSHerbert Xu if (!err && desc->suite.aead.dec.vecs) 1697da7f033dSHerbert Xu err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs, 1698da7f033dSHerbert Xu desc->suite.aead.dec.count); 1699da7f033dSHerbert Xu 1700da7f033dSHerbert Xu out: 1701da7f033dSHerbert Xu crypto_free_aead(tfm); 1702da7f033dSHerbert Xu return err; 1703da7f033dSHerbert Xu } 1704da7f033dSHerbert Xu 1705da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc, 1706da7f033dSHerbert Xu const char *driver, u32 type, u32 mask) 1707da7f033dSHerbert Xu { 17081aa4ecd9SHerbert Xu struct crypto_cipher *tfm; 1709da7f033dSHerbert Xu int err = 0; 1710da7f033dSHerbert Xu 1711eed93e0cSHerbert Xu tfm = crypto_alloc_cipher(driver, type, mask); 1712da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1713da7f033dSHerbert Xu printk(KERN_ERR "alg: cipher: Failed to load transform for " 1714da7f033dSHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 1715da7f033dSHerbert Xu return PTR_ERR(tfm); 1716da7f033dSHerbert Xu } 1717da7f033dSHerbert Xu 1718da7f033dSHerbert Xu if (desc->suite.cipher.enc.vecs) { 1719da7f033dSHerbert Xu err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 1720da7f033dSHerbert Xu desc->suite.cipher.enc.count); 1721da7f033dSHerbert Xu if (err) 1722da7f033dSHerbert Xu goto out; 1723da7f033dSHerbert Xu } 1724da7f033dSHerbert Xu 1725da7f033dSHerbert Xu if (desc->suite.cipher.dec.vecs) 1726da7f033dSHerbert Xu err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 1727da7f033dSHerbert Xu desc->suite.cipher.dec.count); 1728da7f033dSHerbert Xu 1729da7f033dSHerbert Xu out: 17301aa4ecd9SHerbert Xu crypto_free_cipher(tfm); 17311aa4ecd9SHerbert Xu return err; 17321aa4ecd9SHerbert Xu } 17331aa4ecd9SHerbert Xu 17341aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc, 17351aa4ecd9SHerbert Xu const char *driver, u32 type, u32 mask) 17361aa4ecd9SHerbert Xu { 173712773d93SHerbert Xu struct crypto_skcipher *tfm; 17381aa4ecd9SHerbert Xu int err = 0; 17391aa4ecd9SHerbert Xu 1740eed93e0cSHerbert Xu tfm = crypto_alloc_skcipher(driver, type, mask); 17411aa4ecd9SHerbert Xu if (IS_ERR(tfm)) { 17421aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Failed to load transform for " 17431aa4ecd9SHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 17441aa4ecd9SHerbert Xu return PTR_ERR(tfm); 17451aa4ecd9SHerbert Xu } 17461aa4ecd9SHerbert Xu 17471aa4ecd9SHerbert Xu if (desc->suite.cipher.enc.vecs) { 17481aa4ecd9SHerbert Xu err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 17491aa4ecd9SHerbert Xu desc->suite.cipher.enc.count); 17501aa4ecd9SHerbert Xu if (err) 17511aa4ecd9SHerbert Xu goto out; 17521aa4ecd9SHerbert Xu } 17531aa4ecd9SHerbert Xu 17541aa4ecd9SHerbert Xu if (desc->suite.cipher.dec.vecs) 17551aa4ecd9SHerbert Xu err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 17561aa4ecd9SHerbert Xu desc->suite.cipher.dec.count); 17571aa4ecd9SHerbert Xu 17581aa4ecd9SHerbert Xu out: 175912773d93SHerbert Xu crypto_free_skcipher(tfm); 1760da7f033dSHerbert Xu return err; 1761da7f033dSHerbert Xu } 1762da7f033dSHerbert Xu 1763da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver, 1764da7f033dSHerbert Xu u32 type, u32 mask) 1765da7f033dSHerbert Xu { 1766d7db7a88SGiovanni Cabiddu struct crypto_comp *comp; 1767d7db7a88SGiovanni Cabiddu struct crypto_acomp *acomp; 1768da7f033dSHerbert Xu int err; 1769d7db7a88SGiovanni Cabiddu u32 algo_type = type & CRYPTO_ALG_TYPE_ACOMPRESS_MASK; 1770da7f033dSHerbert Xu 1771d7db7a88SGiovanni Cabiddu if (algo_type == CRYPTO_ALG_TYPE_ACOMPRESS) { 1772d7db7a88SGiovanni Cabiddu acomp = crypto_alloc_acomp(driver, type, mask); 1773d7db7a88SGiovanni Cabiddu if (IS_ERR(acomp)) { 1774d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: Failed to load transform for %s: %ld\n", 1775d7db7a88SGiovanni Cabiddu driver, PTR_ERR(acomp)); 1776d7db7a88SGiovanni Cabiddu return PTR_ERR(acomp); 1777d7db7a88SGiovanni Cabiddu } 1778d7db7a88SGiovanni Cabiddu err = test_acomp(acomp, desc->suite.comp.comp.vecs, 1779d7db7a88SGiovanni Cabiddu desc->suite.comp.decomp.vecs, 1780d7db7a88SGiovanni Cabiddu desc->suite.comp.comp.count, 1781d7db7a88SGiovanni Cabiddu desc->suite.comp.decomp.count); 1782d7db7a88SGiovanni Cabiddu crypto_free_acomp(acomp); 1783d7db7a88SGiovanni Cabiddu } else { 1784d7db7a88SGiovanni Cabiddu comp = crypto_alloc_comp(driver, type, mask); 1785d7db7a88SGiovanni Cabiddu if (IS_ERR(comp)) { 1786d7db7a88SGiovanni Cabiddu pr_err("alg: comp: Failed to load transform for %s: %ld\n", 1787d7db7a88SGiovanni Cabiddu driver, PTR_ERR(comp)); 1788d7db7a88SGiovanni Cabiddu return PTR_ERR(comp); 1789da7f033dSHerbert Xu } 1790da7f033dSHerbert Xu 1791d7db7a88SGiovanni Cabiddu err = test_comp(comp, desc->suite.comp.comp.vecs, 1792da7f033dSHerbert Xu desc->suite.comp.decomp.vecs, 1793da7f033dSHerbert Xu desc->suite.comp.comp.count, 1794da7f033dSHerbert Xu desc->suite.comp.decomp.count); 1795da7f033dSHerbert Xu 1796d7db7a88SGiovanni Cabiddu crypto_free_comp(comp); 1797d7db7a88SGiovanni Cabiddu } 1798da7f033dSHerbert Xu return err; 1799da7f033dSHerbert Xu } 1800da7f033dSHerbert Xu 1801da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver, 1802da7f033dSHerbert Xu u32 type, u32 mask) 1803da7f033dSHerbert Xu { 1804da7f033dSHerbert Xu struct crypto_ahash *tfm; 1805da7f033dSHerbert Xu int err; 1806da7f033dSHerbert Xu 1807eed93e0cSHerbert Xu tfm = crypto_alloc_ahash(driver, type, mask); 1808da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1809da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to load transform for %s: " 1810da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1811da7f033dSHerbert Xu return PTR_ERR(tfm); 1812da7f033dSHerbert Xu } 1813da7f033dSHerbert Xu 1814a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1815a8f1a052SDavid S. Miller desc->suite.hash.count, true); 1816a8f1a052SDavid S. Miller if (!err) 1817a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1818a8f1a052SDavid S. Miller desc->suite.hash.count, false); 1819da7f033dSHerbert Xu 1820da7f033dSHerbert Xu crypto_free_ahash(tfm); 1821da7f033dSHerbert Xu return err; 1822da7f033dSHerbert Xu } 1823da7f033dSHerbert Xu 18248e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc, 18258e3ee85eSHerbert Xu const char *driver, u32 type, u32 mask) 18268e3ee85eSHerbert Xu { 18278e3ee85eSHerbert Xu struct crypto_shash *tfm; 18288e3ee85eSHerbert Xu u32 val; 18298e3ee85eSHerbert Xu int err; 18308e3ee85eSHerbert Xu 18318e3ee85eSHerbert Xu err = alg_test_hash(desc, driver, type, mask); 18328e3ee85eSHerbert Xu if (err) 18338e3ee85eSHerbert Xu goto out; 18348e3ee85eSHerbert Xu 1835eed93e0cSHerbert Xu tfm = crypto_alloc_shash(driver, type, mask); 18368e3ee85eSHerbert Xu if (IS_ERR(tfm)) { 18378e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: " 18388e3ee85eSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 18398e3ee85eSHerbert Xu err = PTR_ERR(tfm); 18408e3ee85eSHerbert Xu goto out; 18418e3ee85eSHerbert Xu } 18428e3ee85eSHerbert Xu 18438e3ee85eSHerbert Xu do { 18444c5c3024SJan-Simon Möller SHASH_DESC_ON_STACK(shash, tfm); 18454c5c3024SJan-Simon Möller u32 *ctx = (u32 *)shash_desc_ctx(shash); 18468e3ee85eSHerbert Xu 18474c5c3024SJan-Simon Möller shash->tfm = tfm; 18484c5c3024SJan-Simon Möller shash->flags = 0; 18498e3ee85eSHerbert Xu 18504c5c3024SJan-Simon Möller *ctx = le32_to_cpu(420553207); 18514c5c3024SJan-Simon Möller err = crypto_shash_final(shash, (u8 *)&val); 18528e3ee85eSHerbert Xu if (err) { 18538e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Operation failed for " 18548e3ee85eSHerbert Xu "%s: %d\n", driver, err); 18558e3ee85eSHerbert Xu break; 18568e3ee85eSHerbert Xu } 18578e3ee85eSHerbert Xu 18588e3ee85eSHerbert Xu if (val != ~420553207) { 18598e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Test failed for %s: " 18608e3ee85eSHerbert Xu "%d\n", driver, val); 18618e3ee85eSHerbert Xu err = -EINVAL; 18628e3ee85eSHerbert Xu } 18638e3ee85eSHerbert Xu } while (0); 18648e3ee85eSHerbert Xu 18658e3ee85eSHerbert Xu crypto_free_shash(tfm); 18668e3ee85eSHerbert Xu 18678e3ee85eSHerbert Xu out: 18688e3ee85eSHerbert Xu return err; 18698e3ee85eSHerbert Xu } 18708e3ee85eSHerbert Xu 18717647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver, 18727647d6ceSJarod Wilson u32 type, u32 mask) 18737647d6ceSJarod Wilson { 18747647d6ceSJarod Wilson struct crypto_rng *rng; 18757647d6ceSJarod Wilson int err; 18767647d6ceSJarod Wilson 1877eed93e0cSHerbert Xu rng = crypto_alloc_rng(driver, type, mask); 18787647d6ceSJarod Wilson if (IS_ERR(rng)) { 18797647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to load transform for %s: " 18807647d6ceSJarod Wilson "%ld\n", driver, PTR_ERR(rng)); 18817647d6ceSJarod Wilson return PTR_ERR(rng); 18827647d6ceSJarod Wilson } 18837647d6ceSJarod Wilson 18847647d6ceSJarod Wilson err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count); 18857647d6ceSJarod Wilson 18867647d6ceSJarod Wilson crypto_free_rng(rng); 18877647d6ceSJarod Wilson 18887647d6ceSJarod Wilson return err; 18897647d6ceSJarod Wilson } 18907647d6ceSJarod Wilson 189164d1cdfbSStephan Mueller 1892b13b1e0cSEric Biggers static int drbg_cavs_test(const struct drbg_testvec *test, int pr, 189364d1cdfbSStephan Mueller const char *driver, u32 type, u32 mask) 189464d1cdfbSStephan Mueller { 189564d1cdfbSStephan Mueller int ret = -EAGAIN; 189664d1cdfbSStephan Mueller struct crypto_rng *drng; 189764d1cdfbSStephan Mueller struct drbg_test_data test_data; 189864d1cdfbSStephan Mueller struct drbg_string addtl, pers, testentropy; 189964d1cdfbSStephan Mueller unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL); 190064d1cdfbSStephan Mueller 190164d1cdfbSStephan Mueller if (!buf) 190264d1cdfbSStephan Mueller return -ENOMEM; 190364d1cdfbSStephan Mueller 1904eed93e0cSHerbert Xu drng = crypto_alloc_rng(driver, type, mask); 190564d1cdfbSStephan Mueller if (IS_ERR(drng)) { 190664d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for " 190764d1cdfbSStephan Mueller "%s\n", driver); 190864d1cdfbSStephan Mueller kzfree(buf); 190964d1cdfbSStephan Mueller return -ENOMEM; 191064d1cdfbSStephan Mueller } 191164d1cdfbSStephan Mueller 191264d1cdfbSStephan Mueller test_data.testentropy = &testentropy; 191364d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entropy, test->entropylen); 191464d1cdfbSStephan Mueller drbg_string_fill(&pers, test->pers, test->perslen); 191564d1cdfbSStephan Mueller ret = crypto_drbg_reset_test(drng, &pers, &test_data); 191664d1cdfbSStephan Mueller if (ret) { 191764d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: Failed to reset rng\n"); 191864d1cdfbSStephan Mueller goto outbuf; 191964d1cdfbSStephan Mueller } 192064d1cdfbSStephan Mueller 192164d1cdfbSStephan Mueller drbg_string_fill(&addtl, test->addtla, test->addtllen); 192264d1cdfbSStephan Mueller if (pr) { 192364d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entpra, test->entprlen); 192464d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl_test(drng, 192564d1cdfbSStephan Mueller buf, test->expectedlen, &addtl, &test_data); 192664d1cdfbSStephan Mueller } else { 192764d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl(drng, 192864d1cdfbSStephan Mueller buf, test->expectedlen, &addtl); 192964d1cdfbSStephan Mueller } 193019e60e13SStephan Mueller if (ret < 0) { 193164d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not obtain random data for " 193264d1cdfbSStephan Mueller "driver %s\n", driver); 193364d1cdfbSStephan Mueller goto outbuf; 193464d1cdfbSStephan Mueller } 193564d1cdfbSStephan Mueller 193664d1cdfbSStephan Mueller drbg_string_fill(&addtl, test->addtlb, test->addtllen); 193764d1cdfbSStephan Mueller if (pr) { 193864d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entprb, test->entprlen); 193964d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl_test(drng, 194064d1cdfbSStephan Mueller buf, test->expectedlen, &addtl, &test_data); 194164d1cdfbSStephan Mueller } else { 194264d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl(drng, 194364d1cdfbSStephan Mueller buf, test->expectedlen, &addtl); 194464d1cdfbSStephan Mueller } 194519e60e13SStephan Mueller if (ret < 0) { 194664d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not obtain random data for " 194764d1cdfbSStephan Mueller "driver %s\n", driver); 194864d1cdfbSStephan Mueller goto outbuf; 194964d1cdfbSStephan Mueller } 195064d1cdfbSStephan Mueller 195164d1cdfbSStephan Mueller ret = memcmp(test->expected, buf, test->expectedlen); 195264d1cdfbSStephan Mueller 195364d1cdfbSStephan Mueller outbuf: 195464d1cdfbSStephan Mueller crypto_free_rng(drng); 195564d1cdfbSStephan Mueller kzfree(buf); 195664d1cdfbSStephan Mueller return ret; 195764d1cdfbSStephan Mueller } 195864d1cdfbSStephan Mueller 195964d1cdfbSStephan Mueller 196064d1cdfbSStephan Mueller static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver, 196164d1cdfbSStephan Mueller u32 type, u32 mask) 196264d1cdfbSStephan Mueller { 196364d1cdfbSStephan Mueller int err = 0; 196464d1cdfbSStephan Mueller int pr = 0; 196564d1cdfbSStephan Mueller int i = 0; 1966b13b1e0cSEric Biggers const struct drbg_testvec *template = desc->suite.drbg.vecs; 196764d1cdfbSStephan Mueller unsigned int tcount = desc->suite.drbg.count; 196864d1cdfbSStephan Mueller 196964d1cdfbSStephan Mueller if (0 == memcmp(driver, "drbg_pr_", 8)) 197064d1cdfbSStephan Mueller pr = 1; 197164d1cdfbSStephan Mueller 197264d1cdfbSStephan Mueller for (i = 0; i < tcount; i++) { 197364d1cdfbSStephan Mueller err = drbg_cavs_test(&template[i], pr, driver, type, mask); 197464d1cdfbSStephan Mueller if (err) { 197564d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: Test %d failed for %s\n", 197664d1cdfbSStephan Mueller i, driver); 197764d1cdfbSStephan Mueller err = -EINVAL; 197864d1cdfbSStephan Mueller break; 197964d1cdfbSStephan Mueller } 198064d1cdfbSStephan Mueller } 198164d1cdfbSStephan Mueller return err; 198264d1cdfbSStephan Mueller 198364d1cdfbSStephan Mueller } 198464d1cdfbSStephan Mueller 1985b13b1e0cSEric Biggers static int do_test_kpp(struct crypto_kpp *tfm, const struct kpp_testvec *vec, 1986802c7f1cSSalvatore Benedetto const char *alg) 1987802c7f1cSSalvatore Benedetto { 1988802c7f1cSSalvatore Benedetto struct kpp_request *req; 1989802c7f1cSSalvatore Benedetto void *input_buf = NULL; 1990802c7f1cSSalvatore Benedetto void *output_buf = NULL; 199147d3fd39STudor-Dan Ambarus void *a_public = NULL; 199247d3fd39STudor-Dan Ambarus void *a_ss = NULL; 199347d3fd39STudor-Dan Ambarus void *shared_secret = NULL; 19947f397136SGilad Ben-Yossef struct crypto_wait wait; 1995802c7f1cSSalvatore Benedetto unsigned int out_len_max; 1996802c7f1cSSalvatore Benedetto int err = -ENOMEM; 1997802c7f1cSSalvatore Benedetto struct scatterlist src, dst; 1998802c7f1cSSalvatore Benedetto 1999802c7f1cSSalvatore Benedetto req = kpp_request_alloc(tfm, GFP_KERNEL); 2000802c7f1cSSalvatore Benedetto if (!req) 2001802c7f1cSSalvatore Benedetto return err; 2002802c7f1cSSalvatore Benedetto 20037f397136SGilad Ben-Yossef crypto_init_wait(&wait); 2004802c7f1cSSalvatore Benedetto 2005802c7f1cSSalvatore Benedetto err = crypto_kpp_set_secret(tfm, vec->secret, vec->secret_size); 2006802c7f1cSSalvatore Benedetto if (err < 0) 2007802c7f1cSSalvatore Benedetto goto free_req; 2008802c7f1cSSalvatore Benedetto 2009802c7f1cSSalvatore Benedetto out_len_max = crypto_kpp_maxsize(tfm); 2010802c7f1cSSalvatore Benedetto output_buf = kzalloc(out_len_max, GFP_KERNEL); 2011802c7f1cSSalvatore Benedetto if (!output_buf) { 2012802c7f1cSSalvatore Benedetto err = -ENOMEM; 2013802c7f1cSSalvatore Benedetto goto free_req; 2014802c7f1cSSalvatore Benedetto } 2015802c7f1cSSalvatore Benedetto 2016802c7f1cSSalvatore Benedetto /* Use appropriate parameter as base */ 2017802c7f1cSSalvatore Benedetto kpp_request_set_input(req, NULL, 0); 2018802c7f1cSSalvatore Benedetto sg_init_one(&dst, output_buf, out_len_max); 2019802c7f1cSSalvatore Benedetto kpp_request_set_output(req, &dst, out_len_max); 2020802c7f1cSSalvatore Benedetto kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 20217f397136SGilad Ben-Yossef crypto_req_done, &wait); 2022802c7f1cSSalvatore Benedetto 202347d3fd39STudor-Dan Ambarus /* Compute party A's public key */ 20247f397136SGilad Ben-Yossef err = crypto_wait_req(crypto_kpp_generate_public_key(req), &wait); 2025802c7f1cSSalvatore Benedetto if (err) { 202647d3fd39STudor-Dan Ambarus pr_err("alg: %s: Party A: generate public key test failed. err %d\n", 2027802c7f1cSSalvatore Benedetto alg, err); 2028802c7f1cSSalvatore Benedetto goto free_output; 2029802c7f1cSSalvatore Benedetto } 203047d3fd39STudor-Dan Ambarus 203147d3fd39STudor-Dan Ambarus if (vec->genkey) { 203247d3fd39STudor-Dan Ambarus /* Save party A's public key */ 203347d3fd39STudor-Dan Ambarus a_public = kzalloc(out_len_max, GFP_KERNEL); 203447d3fd39STudor-Dan Ambarus if (!a_public) { 203547d3fd39STudor-Dan Ambarus err = -ENOMEM; 203647d3fd39STudor-Dan Ambarus goto free_output; 203747d3fd39STudor-Dan Ambarus } 203847d3fd39STudor-Dan Ambarus memcpy(a_public, sg_virt(req->dst), out_len_max); 203947d3fd39STudor-Dan Ambarus } else { 2040802c7f1cSSalvatore Benedetto /* Verify calculated public key */ 2041802c7f1cSSalvatore Benedetto if (memcmp(vec->expected_a_public, sg_virt(req->dst), 2042802c7f1cSSalvatore Benedetto vec->expected_a_public_size)) { 204347d3fd39STudor-Dan Ambarus pr_err("alg: %s: Party A: generate public key test failed. Invalid output\n", 2044802c7f1cSSalvatore Benedetto alg); 2045802c7f1cSSalvatore Benedetto err = -EINVAL; 2046802c7f1cSSalvatore Benedetto goto free_output; 2047802c7f1cSSalvatore Benedetto } 204847d3fd39STudor-Dan Ambarus } 2049802c7f1cSSalvatore Benedetto 2050802c7f1cSSalvatore Benedetto /* Calculate shared secret key by using counter part (b) public key. */ 2051802c7f1cSSalvatore Benedetto input_buf = kzalloc(vec->b_public_size, GFP_KERNEL); 2052802c7f1cSSalvatore Benedetto if (!input_buf) { 2053802c7f1cSSalvatore Benedetto err = -ENOMEM; 2054802c7f1cSSalvatore Benedetto goto free_output; 2055802c7f1cSSalvatore Benedetto } 2056802c7f1cSSalvatore Benedetto 2057802c7f1cSSalvatore Benedetto memcpy(input_buf, vec->b_public, vec->b_public_size); 2058802c7f1cSSalvatore Benedetto sg_init_one(&src, input_buf, vec->b_public_size); 2059802c7f1cSSalvatore Benedetto sg_init_one(&dst, output_buf, out_len_max); 2060802c7f1cSSalvatore Benedetto kpp_request_set_input(req, &src, vec->b_public_size); 2061802c7f1cSSalvatore Benedetto kpp_request_set_output(req, &dst, out_len_max); 2062802c7f1cSSalvatore Benedetto kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 20637f397136SGilad Ben-Yossef crypto_req_done, &wait); 20647f397136SGilad Ben-Yossef err = crypto_wait_req(crypto_kpp_compute_shared_secret(req), &wait); 2065802c7f1cSSalvatore Benedetto if (err) { 206647d3fd39STudor-Dan Ambarus pr_err("alg: %s: Party A: compute shared secret test failed. err %d\n", 2067802c7f1cSSalvatore Benedetto alg, err); 2068802c7f1cSSalvatore Benedetto goto free_all; 2069802c7f1cSSalvatore Benedetto } 207047d3fd39STudor-Dan Ambarus 207147d3fd39STudor-Dan Ambarus if (vec->genkey) { 207247d3fd39STudor-Dan Ambarus /* Save the shared secret obtained by party A */ 207347d3fd39STudor-Dan Ambarus a_ss = kzalloc(vec->expected_ss_size, GFP_KERNEL); 207447d3fd39STudor-Dan Ambarus if (!a_ss) { 207547d3fd39STudor-Dan Ambarus err = -ENOMEM; 207647d3fd39STudor-Dan Ambarus goto free_all; 207747d3fd39STudor-Dan Ambarus } 207847d3fd39STudor-Dan Ambarus memcpy(a_ss, sg_virt(req->dst), vec->expected_ss_size); 207947d3fd39STudor-Dan Ambarus 208047d3fd39STudor-Dan Ambarus /* 208147d3fd39STudor-Dan Ambarus * Calculate party B's shared secret by using party A's 208247d3fd39STudor-Dan Ambarus * public key. 208347d3fd39STudor-Dan Ambarus */ 208447d3fd39STudor-Dan Ambarus err = crypto_kpp_set_secret(tfm, vec->b_secret, 208547d3fd39STudor-Dan Ambarus vec->b_secret_size); 208647d3fd39STudor-Dan Ambarus if (err < 0) 208747d3fd39STudor-Dan Ambarus goto free_all; 208847d3fd39STudor-Dan Ambarus 208947d3fd39STudor-Dan Ambarus sg_init_one(&src, a_public, vec->expected_a_public_size); 209047d3fd39STudor-Dan Ambarus sg_init_one(&dst, output_buf, out_len_max); 209147d3fd39STudor-Dan Ambarus kpp_request_set_input(req, &src, vec->expected_a_public_size); 209247d3fd39STudor-Dan Ambarus kpp_request_set_output(req, &dst, out_len_max); 209347d3fd39STudor-Dan Ambarus kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 20947f397136SGilad Ben-Yossef crypto_req_done, &wait); 20957f397136SGilad Ben-Yossef err = crypto_wait_req(crypto_kpp_compute_shared_secret(req), 20967f397136SGilad Ben-Yossef &wait); 209747d3fd39STudor-Dan Ambarus if (err) { 209847d3fd39STudor-Dan Ambarus pr_err("alg: %s: Party B: compute shared secret failed. err %d\n", 209947d3fd39STudor-Dan Ambarus alg, err); 210047d3fd39STudor-Dan Ambarus goto free_all; 210147d3fd39STudor-Dan Ambarus } 210247d3fd39STudor-Dan Ambarus 210347d3fd39STudor-Dan Ambarus shared_secret = a_ss; 210447d3fd39STudor-Dan Ambarus } else { 210547d3fd39STudor-Dan Ambarus shared_secret = (void *)vec->expected_ss; 210647d3fd39STudor-Dan Ambarus } 210747d3fd39STudor-Dan Ambarus 2108802c7f1cSSalvatore Benedetto /* 2109802c7f1cSSalvatore Benedetto * verify shared secret from which the user will derive 2110802c7f1cSSalvatore Benedetto * secret key by executing whatever hash it has chosen 2111802c7f1cSSalvatore Benedetto */ 211247d3fd39STudor-Dan Ambarus if (memcmp(shared_secret, sg_virt(req->dst), 2113802c7f1cSSalvatore Benedetto vec->expected_ss_size)) { 2114802c7f1cSSalvatore Benedetto pr_err("alg: %s: compute shared secret test failed. Invalid output\n", 2115802c7f1cSSalvatore Benedetto alg); 2116802c7f1cSSalvatore Benedetto err = -EINVAL; 2117802c7f1cSSalvatore Benedetto } 2118802c7f1cSSalvatore Benedetto 2119802c7f1cSSalvatore Benedetto free_all: 212047d3fd39STudor-Dan Ambarus kfree(a_ss); 2121802c7f1cSSalvatore Benedetto kfree(input_buf); 2122802c7f1cSSalvatore Benedetto free_output: 212347d3fd39STudor-Dan Ambarus kfree(a_public); 2124802c7f1cSSalvatore Benedetto kfree(output_buf); 2125802c7f1cSSalvatore Benedetto free_req: 2126802c7f1cSSalvatore Benedetto kpp_request_free(req); 2127802c7f1cSSalvatore Benedetto return err; 2128802c7f1cSSalvatore Benedetto } 2129802c7f1cSSalvatore Benedetto 2130802c7f1cSSalvatore Benedetto static int test_kpp(struct crypto_kpp *tfm, const char *alg, 2131b13b1e0cSEric Biggers const struct kpp_testvec *vecs, unsigned int tcount) 2132802c7f1cSSalvatore Benedetto { 2133802c7f1cSSalvatore Benedetto int ret, i; 2134802c7f1cSSalvatore Benedetto 2135802c7f1cSSalvatore Benedetto for (i = 0; i < tcount; i++) { 2136802c7f1cSSalvatore Benedetto ret = do_test_kpp(tfm, vecs++, alg); 2137802c7f1cSSalvatore Benedetto if (ret) { 2138802c7f1cSSalvatore Benedetto pr_err("alg: %s: test failed on vector %d, err=%d\n", 2139802c7f1cSSalvatore Benedetto alg, i + 1, ret); 2140802c7f1cSSalvatore Benedetto return ret; 2141802c7f1cSSalvatore Benedetto } 2142802c7f1cSSalvatore Benedetto } 2143802c7f1cSSalvatore Benedetto return 0; 2144802c7f1cSSalvatore Benedetto } 2145802c7f1cSSalvatore Benedetto 2146802c7f1cSSalvatore Benedetto static int alg_test_kpp(const struct alg_test_desc *desc, const char *driver, 2147802c7f1cSSalvatore Benedetto u32 type, u32 mask) 2148802c7f1cSSalvatore Benedetto { 2149802c7f1cSSalvatore Benedetto struct crypto_kpp *tfm; 2150802c7f1cSSalvatore Benedetto int err = 0; 2151802c7f1cSSalvatore Benedetto 2152eed93e0cSHerbert Xu tfm = crypto_alloc_kpp(driver, type, mask); 2153802c7f1cSSalvatore Benedetto if (IS_ERR(tfm)) { 2154802c7f1cSSalvatore Benedetto pr_err("alg: kpp: Failed to load tfm for %s: %ld\n", 2155802c7f1cSSalvatore Benedetto driver, PTR_ERR(tfm)); 2156802c7f1cSSalvatore Benedetto return PTR_ERR(tfm); 2157802c7f1cSSalvatore Benedetto } 2158802c7f1cSSalvatore Benedetto if (desc->suite.kpp.vecs) 2159802c7f1cSSalvatore Benedetto err = test_kpp(tfm, desc->alg, desc->suite.kpp.vecs, 2160802c7f1cSSalvatore Benedetto desc->suite.kpp.count); 2161802c7f1cSSalvatore Benedetto 2162802c7f1cSSalvatore Benedetto crypto_free_kpp(tfm); 2163802c7f1cSSalvatore Benedetto return err; 2164802c7f1cSSalvatore Benedetto } 2165802c7f1cSSalvatore Benedetto 216650d2b643SHerbert Xu static int test_akcipher_one(struct crypto_akcipher *tfm, 2167b13b1e0cSEric Biggers const struct akcipher_testvec *vecs) 2168946cc463STadeusz Struk { 2169df27b26fSHerbert Xu char *xbuf[XBUFSIZE]; 2170946cc463STadeusz Struk struct akcipher_request *req; 2171946cc463STadeusz Struk void *outbuf_enc = NULL; 2172946cc463STadeusz Struk void *outbuf_dec = NULL; 21737f397136SGilad Ben-Yossef struct crypto_wait wait; 2174946cc463STadeusz Struk unsigned int out_len_max, out_len = 0; 2175946cc463STadeusz Struk int err = -ENOMEM; 217622287b0bSTadeusz Struk struct scatterlist src, dst, src_tab[2]; 2177946cc463STadeusz Struk 2178df27b26fSHerbert Xu if (testmgr_alloc_buf(xbuf)) 2179df27b26fSHerbert Xu return err; 2180df27b26fSHerbert Xu 2181946cc463STadeusz Struk req = akcipher_request_alloc(tfm, GFP_KERNEL); 2182946cc463STadeusz Struk if (!req) 2183df27b26fSHerbert Xu goto free_xbuf; 2184946cc463STadeusz Struk 21857f397136SGilad Ben-Yossef crypto_init_wait(&wait); 218622287b0bSTadeusz Struk 218722287b0bSTadeusz Struk if (vecs->public_key_vec) 218822287b0bSTadeusz Struk err = crypto_akcipher_set_pub_key(tfm, vecs->key, 218922287b0bSTadeusz Struk vecs->key_len); 219022287b0bSTadeusz Struk else 219122287b0bSTadeusz Struk err = crypto_akcipher_set_priv_key(tfm, vecs->key, 219222287b0bSTadeusz Struk vecs->key_len); 2193946cc463STadeusz Struk if (err) 2194946cc463STadeusz Struk goto free_req; 2195946cc463STadeusz Struk 219657763f5eSSalvatore Benedetto err = -ENOMEM; 219722287b0bSTadeusz Struk out_len_max = crypto_akcipher_maxsize(tfm); 2198946cc463STadeusz Struk outbuf_enc = kzalloc(out_len_max, GFP_KERNEL); 2199946cc463STadeusz Struk if (!outbuf_enc) 2200946cc463STadeusz Struk goto free_req; 2201946cc463STadeusz Struk 2202df27b26fSHerbert Xu if (WARN_ON(vecs->m_size > PAGE_SIZE)) 2203df27b26fSHerbert Xu goto free_all; 2204df27b26fSHerbert Xu 2205df27b26fSHerbert Xu memcpy(xbuf[0], vecs->m, vecs->m_size); 2206df27b26fSHerbert Xu 220722287b0bSTadeusz Struk sg_init_table(src_tab, 2); 2208df27b26fSHerbert Xu sg_set_buf(&src_tab[0], xbuf[0], 8); 2209df27b26fSHerbert Xu sg_set_buf(&src_tab[1], xbuf[0] + 8, vecs->m_size - 8); 221022287b0bSTadeusz Struk sg_init_one(&dst, outbuf_enc, out_len_max); 221122287b0bSTadeusz Struk akcipher_request_set_crypt(req, src_tab, &dst, vecs->m_size, 221222287b0bSTadeusz Struk out_len_max); 2213946cc463STadeusz Struk akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 22147f397136SGilad Ben-Yossef crypto_req_done, &wait); 2215946cc463STadeusz Struk 22167f397136SGilad Ben-Yossef err = crypto_wait_req(vecs->siggen_sigver_test ? 22171207107cSStephan Mueller /* Run asymmetric signature generation */ 22181207107cSStephan Mueller crypto_akcipher_sign(req) : 22191207107cSStephan Mueller /* Run asymmetric encrypt */ 22207f397136SGilad Ben-Yossef crypto_akcipher_encrypt(req), &wait); 2221946cc463STadeusz Struk if (err) { 222250d2b643SHerbert Xu pr_err("alg: akcipher: encrypt test failed. err %d\n", err); 2223946cc463STadeusz Struk goto free_all; 2224946cc463STadeusz Struk } 222522287b0bSTadeusz Struk if (req->dst_len != vecs->c_size) { 222650d2b643SHerbert Xu pr_err("alg: akcipher: encrypt test failed. Invalid output len\n"); 2227946cc463STadeusz Struk err = -EINVAL; 2228946cc463STadeusz Struk goto free_all; 2229946cc463STadeusz Struk } 2230946cc463STadeusz Struk /* verify that encrypted message is equal to expected */ 2231df27b26fSHerbert Xu if (memcmp(vecs->c, outbuf_enc, vecs->c_size)) { 223250d2b643SHerbert Xu pr_err("alg: akcipher: encrypt test failed. Invalid output\n"); 223350d2b643SHerbert Xu hexdump(outbuf_enc, vecs->c_size); 2234946cc463STadeusz Struk err = -EINVAL; 2235946cc463STadeusz Struk goto free_all; 2236946cc463STadeusz Struk } 2237946cc463STadeusz Struk /* Don't invoke decrypt for vectors with public key */ 2238946cc463STadeusz Struk if (vecs->public_key_vec) { 2239946cc463STadeusz Struk err = 0; 2240946cc463STadeusz Struk goto free_all; 2241946cc463STadeusz Struk } 2242946cc463STadeusz Struk outbuf_dec = kzalloc(out_len_max, GFP_KERNEL); 2243946cc463STadeusz Struk if (!outbuf_dec) { 2244946cc463STadeusz Struk err = -ENOMEM; 2245946cc463STadeusz Struk goto free_all; 2246946cc463STadeusz Struk } 2247df27b26fSHerbert Xu 2248df27b26fSHerbert Xu if (WARN_ON(vecs->c_size > PAGE_SIZE)) 2249df27b26fSHerbert Xu goto free_all; 2250df27b26fSHerbert Xu 2251df27b26fSHerbert Xu memcpy(xbuf[0], vecs->c, vecs->c_size); 2252df27b26fSHerbert Xu 2253df27b26fSHerbert Xu sg_init_one(&src, xbuf[0], vecs->c_size); 225422287b0bSTadeusz Struk sg_init_one(&dst, outbuf_dec, out_len_max); 22557f397136SGilad Ben-Yossef crypto_init_wait(&wait); 225622287b0bSTadeusz Struk akcipher_request_set_crypt(req, &src, &dst, vecs->c_size, out_len_max); 2257946cc463STadeusz Struk 22587f397136SGilad Ben-Yossef err = crypto_wait_req(vecs->siggen_sigver_test ? 22591207107cSStephan Mueller /* Run asymmetric signature verification */ 22601207107cSStephan Mueller crypto_akcipher_verify(req) : 22611207107cSStephan Mueller /* Run asymmetric decrypt */ 22627f397136SGilad Ben-Yossef crypto_akcipher_decrypt(req), &wait); 2263946cc463STadeusz Struk if (err) { 226450d2b643SHerbert Xu pr_err("alg: akcipher: decrypt test failed. err %d\n", err); 2265946cc463STadeusz Struk goto free_all; 2266946cc463STadeusz Struk } 2267946cc463STadeusz Struk out_len = req->dst_len; 226850d2b643SHerbert Xu if (out_len < vecs->m_size) { 226950d2b643SHerbert Xu pr_err("alg: akcipher: decrypt test failed. " 227050d2b643SHerbert Xu "Invalid output len %u\n", out_len); 2271946cc463STadeusz Struk err = -EINVAL; 2272946cc463STadeusz Struk goto free_all; 2273946cc463STadeusz Struk } 2274946cc463STadeusz Struk /* verify that decrypted message is equal to the original msg */ 227550d2b643SHerbert Xu if (memchr_inv(outbuf_dec, 0, out_len - vecs->m_size) || 227650d2b643SHerbert Xu memcmp(vecs->m, outbuf_dec + out_len - vecs->m_size, 227750d2b643SHerbert Xu vecs->m_size)) { 227850d2b643SHerbert Xu pr_err("alg: akcipher: decrypt test failed. Invalid output\n"); 227950d2b643SHerbert Xu hexdump(outbuf_dec, out_len); 2280946cc463STadeusz Struk err = -EINVAL; 2281946cc463STadeusz Struk } 2282946cc463STadeusz Struk free_all: 2283946cc463STadeusz Struk kfree(outbuf_dec); 2284946cc463STadeusz Struk kfree(outbuf_enc); 2285946cc463STadeusz Struk free_req: 2286946cc463STadeusz Struk akcipher_request_free(req); 2287df27b26fSHerbert Xu free_xbuf: 2288df27b26fSHerbert Xu testmgr_free_buf(xbuf); 2289946cc463STadeusz Struk return err; 2290946cc463STadeusz Struk } 2291946cc463STadeusz Struk 229250d2b643SHerbert Xu static int test_akcipher(struct crypto_akcipher *tfm, const char *alg, 2293b13b1e0cSEric Biggers const struct akcipher_testvec *vecs, 2294b13b1e0cSEric Biggers unsigned int tcount) 2295946cc463STadeusz Struk { 229615226e48SHerbert Xu const char *algo = 229715226e48SHerbert Xu crypto_tfm_alg_driver_name(crypto_akcipher_tfm(tfm)); 2298946cc463STadeusz Struk int ret, i; 2299946cc463STadeusz Struk 2300946cc463STadeusz Struk for (i = 0; i < tcount; i++) { 230150d2b643SHerbert Xu ret = test_akcipher_one(tfm, vecs++); 230250d2b643SHerbert Xu if (!ret) 230350d2b643SHerbert Xu continue; 230450d2b643SHerbert Xu 230515226e48SHerbert Xu pr_err("alg: akcipher: test %d failed for %s, err=%d\n", 230615226e48SHerbert Xu i + 1, algo, ret); 2307946cc463STadeusz Struk return ret; 2308946cc463STadeusz Struk } 2309946cc463STadeusz Struk return 0; 2310946cc463STadeusz Struk } 2311946cc463STadeusz Struk 2312946cc463STadeusz Struk static int alg_test_akcipher(const struct alg_test_desc *desc, 2313946cc463STadeusz Struk const char *driver, u32 type, u32 mask) 2314946cc463STadeusz Struk { 2315946cc463STadeusz Struk struct crypto_akcipher *tfm; 2316946cc463STadeusz Struk int err = 0; 2317946cc463STadeusz Struk 2318eed93e0cSHerbert Xu tfm = crypto_alloc_akcipher(driver, type, mask); 2319946cc463STadeusz Struk if (IS_ERR(tfm)) { 2320946cc463STadeusz Struk pr_err("alg: akcipher: Failed to load tfm for %s: %ld\n", 2321946cc463STadeusz Struk driver, PTR_ERR(tfm)); 2322946cc463STadeusz Struk return PTR_ERR(tfm); 2323946cc463STadeusz Struk } 2324946cc463STadeusz Struk if (desc->suite.akcipher.vecs) 2325946cc463STadeusz Struk err = test_akcipher(tfm, desc->alg, desc->suite.akcipher.vecs, 2326946cc463STadeusz Struk desc->suite.akcipher.count); 2327946cc463STadeusz Struk 2328946cc463STadeusz Struk crypto_free_akcipher(tfm); 2329946cc463STadeusz Struk return err; 2330946cc463STadeusz Struk } 2331946cc463STadeusz Struk 2332863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc, 2333863b557aSYouquan, Song const char *driver, u32 type, u32 mask) 2334863b557aSYouquan, Song { 2335863b557aSYouquan, Song return 0; 2336863b557aSYouquan, Song } 2337863b557aSYouquan, Song 233821c8e720SArd Biesheuvel #define __VECS(tv) { .vecs = tv, .count = ARRAY_SIZE(tv) } 233921c8e720SArd Biesheuvel 2340da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */ 2341da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = { 2342da7f033dSHerbert Xu { 2343e08ca2daSJarod Wilson .alg = "ansi_cprng", 2344e08ca2daSJarod Wilson .test = alg_test_cprng, 2345e08ca2daSJarod Wilson .suite = { 234621c8e720SArd Biesheuvel .cprng = __VECS(ansi_cprng_aes_tv_template) 2347e08ca2daSJarod Wilson } 2348e08ca2daSJarod Wilson }, { 2349bca4feb0SHoria Geanta .alg = "authenc(hmac(md5),ecb(cipher_null))", 2350bca4feb0SHoria Geanta .test = alg_test_aead, 2351bca4feb0SHoria Geanta .suite = { 2352bca4feb0SHoria Geanta .aead = { 235321c8e720SArd Biesheuvel .enc = __VECS(hmac_md5_ecb_cipher_null_enc_tv_template), 235421c8e720SArd Biesheuvel .dec = __VECS(hmac_md5_ecb_cipher_null_dec_tv_template) 2355bca4feb0SHoria Geanta } 2356bca4feb0SHoria Geanta } 2357bca4feb0SHoria Geanta }, { 2358a4198fd4SHerbert Xu .alg = "authenc(hmac(sha1),cbc(aes))", 2359e46e9a46SHoria Geanta .test = alg_test_aead, 2360bcf741cbSHerbert Xu .fips_allowed = 1, 2361e46e9a46SHoria Geanta .suite = { 2362e46e9a46SHoria Geanta .aead = { 236321c8e720SArd Biesheuvel .enc = __VECS(hmac_sha1_aes_cbc_enc_tv_temp) 23645208ed2cSNitesh Lal } 23655208ed2cSNitesh Lal } 23665208ed2cSNitesh Lal }, { 2367a4198fd4SHerbert Xu .alg = "authenc(hmac(sha1),cbc(des))", 23685208ed2cSNitesh Lal .test = alg_test_aead, 23695208ed2cSNitesh Lal .suite = { 23705208ed2cSNitesh Lal .aead = { 237121c8e720SArd Biesheuvel .enc = __VECS(hmac_sha1_des_cbc_enc_tv_temp) 23725208ed2cSNitesh Lal } 23735208ed2cSNitesh Lal } 23745208ed2cSNitesh Lal }, { 2375a4198fd4SHerbert Xu .alg = "authenc(hmac(sha1),cbc(des3_ede))", 23765208ed2cSNitesh Lal .test = alg_test_aead, 2377ed1afac9SMarcus Meissner .fips_allowed = 1, 23785208ed2cSNitesh Lal .suite = { 23795208ed2cSNitesh Lal .aead = { 238021c8e720SArd Biesheuvel .enc = __VECS(hmac_sha1_des3_ede_cbc_enc_tv_temp) 2381e46e9a46SHoria Geanta } 2382e46e9a46SHoria Geanta } 2383e46e9a46SHoria Geanta }, { 2384fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha1),ctr(aes))", 2385fb16abc2SMarcus Meissner .test = alg_test_null, 2386fb16abc2SMarcus Meissner .fips_allowed = 1, 2387fb16abc2SMarcus Meissner }, { 2388bca4feb0SHoria Geanta .alg = "authenc(hmac(sha1),ecb(cipher_null))", 2389bca4feb0SHoria Geanta .test = alg_test_aead, 2390bca4feb0SHoria Geanta .suite = { 2391bca4feb0SHoria Geanta .aead = { 239221c8e720SArd Biesheuvel .enc = __VECS(hmac_sha1_ecb_cipher_null_enc_tv_temp), 239321c8e720SArd Biesheuvel .dec = __VECS(hmac_sha1_ecb_cipher_null_dec_tv_temp) 23945208ed2cSNitesh Lal } 23955208ed2cSNitesh Lal } 23965208ed2cSNitesh Lal }, { 23978888690eSMarcus Meissner .alg = "authenc(hmac(sha1),rfc3686(ctr(aes)))", 23988888690eSMarcus Meissner .test = alg_test_null, 23998888690eSMarcus Meissner .fips_allowed = 1, 24008888690eSMarcus Meissner }, { 2401a4198fd4SHerbert Xu .alg = "authenc(hmac(sha224),cbc(des))", 24025208ed2cSNitesh Lal .test = alg_test_aead, 24035208ed2cSNitesh Lal .suite = { 24045208ed2cSNitesh Lal .aead = { 240521c8e720SArd Biesheuvel .enc = __VECS(hmac_sha224_des_cbc_enc_tv_temp) 24065208ed2cSNitesh Lal } 24075208ed2cSNitesh Lal } 24085208ed2cSNitesh Lal }, { 2409a4198fd4SHerbert Xu .alg = "authenc(hmac(sha224),cbc(des3_ede))", 24105208ed2cSNitesh Lal .test = alg_test_aead, 2411ed1afac9SMarcus Meissner .fips_allowed = 1, 24125208ed2cSNitesh Lal .suite = { 24135208ed2cSNitesh Lal .aead = { 241421c8e720SArd Biesheuvel .enc = __VECS(hmac_sha224_des3_ede_cbc_enc_tv_temp) 2415bca4feb0SHoria Geanta } 2416bca4feb0SHoria Geanta } 2417bca4feb0SHoria Geanta }, { 2418a4198fd4SHerbert Xu .alg = "authenc(hmac(sha256),cbc(aes))", 2419e46e9a46SHoria Geanta .test = alg_test_aead, 2420ed1afac9SMarcus Meissner .fips_allowed = 1, 2421e46e9a46SHoria Geanta .suite = { 2422e46e9a46SHoria Geanta .aead = { 242321c8e720SArd Biesheuvel .enc = __VECS(hmac_sha256_aes_cbc_enc_tv_temp) 24245208ed2cSNitesh Lal } 24255208ed2cSNitesh Lal } 24265208ed2cSNitesh Lal }, { 2427a4198fd4SHerbert Xu .alg = "authenc(hmac(sha256),cbc(des))", 24285208ed2cSNitesh Lal .test = alg_test_aead, 24295208ed2cSNitesh Lal .suite = { 24305208ed2cSNitesh Lal .aead = { 243121c8e720SArd Biesheuvel .enc = __VECS(hmac_sha256_des_cbc_enc_tv_temp) 24325208ed2cSNitesh Lal } 24335208ed2cSNitesh Lal } 24345208ed2cSNitesh Lal }, { 2435a4198fd4SHerbert Xu .alg = "authenc(hmac(sha256),cbc(des3_ede))", 24365208ed2cSNitesh Lal .test = alg_test_aead, 2437ed1afac9SMarcus Meissner .fips_allowed = 1, 24385208ed2cSNitesh Lal .suite = { 24395208ed2cSNitesh Lal .aead = { 244021c8e720SArd Biesheuvel .enc = __VECS(hmac_sha256_des3_ede_cbc_enc_tv_temp) 24415208ed2cSNitesh Lal } 24425208ed2cSNitesh Lal } 24435208ed2cSNitesh Lal }, { 2444fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha256),ctr(aes))", 2445fb16abc2SMarcus Meissner .test = alg_test_null, 2446fb16abc2SMarcus Meissner .fips_allowed = 1, 2447fb16abc2SMarcus Meissner }, { 24488888690eSMarcus Meissner .alg = "authenc(hmac(sha256),rfc3686(ctr(aes)))", 24498888690eSMarcus Meissner .test = alg_test_null, 24508888690eSMarcus Meissner .fips_allowed = 1, 24518888690eSMarcus Meissner }, { 2452a4198fd4SHerbert Xu .alg = "authenc(hmac(sha384),cbc(des))", 24535208ed2cSNitesh Lal .test = alg_test_aead, 24545208ed2cSNitesh Lal .suite = { 24555208ed2cSNitesh Lal .aead = { 245621c8e720SArd Biesheuvel .enc = __VECS(hmac_sha384_des_cbc_enc_tv_temp) 24575208ed2cSNitesh Lal } 24585208ed2cSNitesh Lal } 24595208ed2cSNitesh Lal }, { 2460a4198fd4SHerbert Xu .alg = "authenc(hmac(sha384),cbc(des3_ede))", 24615208ed2cSNitesh Lal .test = alg_test_aead, 2462ed1afac9SMarcus Meissner .fips_allowed = 1, 24635208ed2cSNitesh Lal .suite = { 24645208ed2cSNitesh Lal .aead = { 246521c8e720SArd Biesheuvel .enc = __VECS(hmac_sha384_des3_ede_cbc_enc_tv_temp) 2466e46e9a46SHoria Geanta } 2467e46e9a46SHoria Geanta } 2468e46e9a46SHoria Geanta }, { 2469fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha384),ctr(aes))", 2470fb16abc2SMarcus Meissner .test = alg_test_null, 2471fb16abc2SMarcus Meissner .fips_allowed = 1, 2472fb16abc2SMarcus Meissner }, { 24738888690eSMarcus Meissner .alg = "authenc(hmac(sha384),rfc3686(ctr(aes)))", 24748888690eSMarcus Meissner .test = alg_test_null, 24758888690eSMarcus Meissner .fips_allowed = 1, 24768888690eSMarcus Meissner }, { 2477a4198fd4SHerbert Xu .alg = "authenc(hmac(sha512),cbc(aes))", 2478ed1afac9SMarcus Meissner .fips_allowed = 1, 2479e46e9a46SHoria Geanta .test = alg_test_aead, 2480e46e9a46SHoria Geanta .suite = { 2481e46e9a46SHoria Geanta .aead = { 248221c8e720SArd Biesheuvel .enc = __VECS(hmac_sha512_aes_cbc_enc_tv_temp) 24835208ed2cSNitesh Lal } 24845208ed2cSNitesh Lal } 24855208ed2cSNitesh Lal }, { 2486a4198fd4SHerbert Xu .alg = "authenc(hmac(sha512),cbc(des))", 24875208ed2cSNitesh Lal .test = alg_test_aead, 24885208ed2cSNitesh Lal .suite = { 24895208ed2cSNitesh Lal .aead = { 249021c8e720SArd Biesheuvel .enc = __VECS(hmac_sha512_des_cbc_enc_tv_temp) 24915208ed2cSNitesh Lal } 24925208ed2cSNitesh Lal } 24935208ed2cSNitesh Lal }, { 2494a4198fd4SHerbert Xu .alg = "authenc(hmac(sha512),cbc(des3_ede))", 24955208ed2cSNitesh Lal .test = alg_test_aead, 2496ed1afac9SMarcus Meissner .fips_allowed = 1, 24975208ed2cSNitesh Lal .suite = { 24985208ed2cSNitesh Lal .aead = { 249921c8e720SArd Biesheuvel .enc = __VECS(hmac_sha512_des3_ede_cbc_enc_tv_temp) 2500e46e9a46SHoria Geanta } 2501e46e9a46SHoria Geanta } 2502e46e9a46SHoria Geanta }, { 2503fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha512),ctr(aes))", 2504fb16abc2SMarcus Meissner .test = alg_test_null, 2505fb16abc2SMarcus Meissner .fips_allowed = 1, 2506fb16abc2SMarcus Meissner }, { 25078888690eSMarcus Meissner .alg = "authenc(hmac(sha512),rfc3686(ctr(aes)))", 25088888690eSMarcus Meissner .test = alg_test_null, 25098888690eSMarcus Meissner .fips_allowed = 1, 25108888690eSMarcus Meissner }, { 2511da7f033dSHerbert Xu .alg = "cbc(aes)", 25121aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2513a1915d51SJarod Wilson .fips_allowed = 1, 2514da7f033dSHerbert Xu .suite = { 2515da7f033dSHerbert Xu .cipher = { 251621c8e720SArd Biesheuvel .enc = __VECS(aes_cbc_enc_tv_template), 251721c8e720SArd Biesheuvel .dec = __VECS(aes_cbc_dec_tv_template) 2518da7f033dSHerbert Xu } 2519da7f033dSHerbert Xu } 2520da7f033dSHerbert Xu }, { 2521da7f033dSHerbert Xu .alg = "cbc(anubis)", 25221aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2523da7f033dSHerbert Xu .suite = { 2524da7f033dSHerbert Xu .cipher = { 252521c8e720SArd Biesheuvel .enc = __VECS(anubis_cbc_enc_tv_template), 252621c8e720SArd Biesheuvel .dec = __VECS(anubis_cbc_dec_tv_template) 2527da7f033dSHerbert Xu } 2528da7f033dSHerbert Xu } 2529da7f033dSHerbert Xu }, { 2530da7f033dSHerbert Xu .alg = "cbc(blowfish)", 25311aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2532da7f033dSHerbert Xu .suite = { 2533da7f033dSHerbert Xu .cipher = { 253421c8e720SArd Biesheuvel .enc = __VECS(bf_cbc_enc_tv_template), 253521c8e720SArd Biesheuvel .dec = __VECS(bf_cbc_dec_tv_template) 2536da7f033dSHerbert Xu } 2537da7f033dSHerbert Xu } 2538da7f033dSHerbert Xu }, { 2539da7f033dSHerbert Xu .alg = "cbc(camellia)", 25401aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2541da7f033dSHerbert Xu .suite = { 2542da7f033dSHerbert Xu .cipher = { 254321c8e720SArd Biesheuvel .enc = __VECS(camellia_cbc_enc_tv_template), 254421c8e720SArd Biesheuvel .dec = __VECS(camellia_cbc_dec_tv_template) 2545da7f033dSHerbert Xu } 2546da7f033dSHerbert Xu } 2547da7f033dSHerbert Xu }, { 2548a2c58260SJohannes Goetzfried .alg = "cbc(cast5)", 2549a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 2550a2c58260SJohannes Goetzfried .suite = { 2551a2c58260SJohannes Goetzfried .cipher = { 255221c8e720SArd Biesheuvel .enc = __VECS(cast5_cbc_enc_tv_template), 255321c8e720SArd Biesheuvel .dec = __VECS(cast5_cbc_dec_tv_template) 2554a2c58260SJohannes Goetzfried } 2555a2c58260SJohannes Goetzfried } 2556a2c58260SJohannes Goetzfried }, { 25579b8b0405SJohannes Goetzfried .alg = "cbc(cast6)", 25589b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 25599b8b0405SJohannes Goetzfried .suite = { 25609b8b0405SJohannes Goetzfried .cipher = { 256121c8e720SArd Biesheuvel .enc = __VECS(cast6_cbc_enc_tv_template), 256221c8e720SArd Biesheuvel .dec = __VECS(cast6_cbc_dec_tv_template) 25639b8b0405SJohannes Goetzfried } 25649b8b0405SJohannes Goetzfried } 25659b8b0405SJohannes Goetzfried }, { 2566da7f033dSHerbert Xu .alg = "cbc(des)", 25671aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2568da7f033dSHerbert Xu .suite = { 2569da7f033dSHerbert Xu .cipher = { 257021c8e720SArd Biesheuvel .enc = __VECS(des_cbc_enc_tv_template), 257121c8e720SArd Biesheuvel .dec = __VECS(des_cbc_dec_tv_template) 2572da7f033dSHerbert Xu } 2573da7f033dSHerbert Xu } 2574da7f033dSHerbert Xu }, { 2575da7f033dSHerbert Xu .alg = "cbc(des3_ede)", 25761aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2577a1915d51SJarod Wilson .fips_allowed = 1, 2578da7f033dSHerbert Xu .suite = { 2579da7f033dSHerbert Xu .cipher = { 258021c8e720SArd Biesheuvel .enc = __VECS(des3_ede_cbc_enc_tv_template), 258121c8e720SArd Biesheuvel .dec = __VECS(des3_ede_cbc_dec_tv_template) 2582da7f033dSHerbert Xu } 2583da7f033dSHerbert Xu } 2584da7f033dSHerbert Xu }, { 25859d25917dSJussi Kivilinna .alg = "cbc(serpent)", 25869d25917dSJussi Kivilinna .test = alg_test_skcipher, 25879d25917dSJussi Kivilinna .suite = { 25889d25917dSJussi Kivilinna .cipher = { 258921c8e720SArd Biesheuvel .enc = __VECS(serpent_cbc_enc_tv_template), 259021c8e720SArd Biesheuvel .dec = __VECS(serpent_cbc_dec_tv_template) 25919d25917dSJussi Kivilinna } 25929d25917dSJussi Kivilinna } 25939d25917dSJussi Kivilinna }, { 2594da7f033dSHerbert Xu .alg = "cbc(twofish)", 25951aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2596da7f033dSHerbert Xu .suite = { 2597da7f033dSHerbert Xu .cipher = { 259821c8e720SArd Biesheuvel .enc = __VECS(tf_cbc_enc_tv_template), 259921c8e720SArd Biesheuvel .dec = __VECS(tf_cbc_dec_tv_template) 2600da7f033dSHerbert Xu } 2601da7f033dSHerbert Xu } 2602da7f033dSHerbert Xu }, { 2603092acf06SArd Biesheuvel .alg = "cbcmac(aes)", 2604092acf06SArd Biesheuvel .fips_allowed = 1, 2605092acf06SArd Biesheuvel .test = alg_test_hash, 2606092acf06SArd Biesheuvel .suite = { 2607092acf06SArd Biesheuvel .hash = __VECS(aes_cbcmac_tv_template) 2608092acf06SArd Biesheuvel } 2609092acf06SArd Biesheuvel }, { 2610da7f033dSHerbert Xu .alg = "ccm(aes)", 2611da7f033dSHerbert Xu .test = alg_test_aead, 2612a1915d51SJarod Wilson .fips_allowed = 1, 2613da7f033dSHerbert Xu .suite = { 2614da7f033dSHerbert Xu .aead = { 261521c8e720SArd Biesheuvel .enc = __VECS(aes_ccm_enc_tv_template), 261621c8e720SArd Biesheuvel .dec = __VECS(aes_ccm_dec_tv_template) 2617da7f033dSHerbert Xu } 2618da7f033dSHerbert Xu } 2619da7f033dSHerbert Xu }, { 26203590ebf2SMartin Willi .alg = "chacha20", 26213590ebf2SMartin Willi .test = alg_test_skcipher, 26223590ebf2SMartin Willi .suite = { 26233590ebf2SMartin Willi .cipher = { 262421c8e720SArd Biesheuvel .enc = __VECS(chacha20_enc_tv_template), 262521c8e720SArd Biesheuvel .dec = __VECS(chacha20_enc_tv_template), 26263590ebf2SMartin Willi } 26273590ebf2SMartin Willi } 26283590ebf2SMartin Willi }, { 262993b5e86aSJussi Kivilinna .alg = "cmac(aes)", 26308f183751SStephan Mueller .fips_allowed = 1, 263193b5e86aSJussi Kivilinna .test = alg_test_hash, 263293b5e86aSJussi Kivilinna .suite = { 263321c8e720SArd Biesheuvel .hash = __VECS(aes_cmac128_tv_template) 263493b5e86aSJussi Kivilinna } 263593b5e86aSJussi Kivilinna }, { 263693b5e86aSJussi Kivilinna .alg = "cmac(des3_ede)", 26378f183751SStephan Mueller .fips_allowed = 1, 263893b5e86aSJussi Kivilinna .test = alg_test_hash, 263993b5e86aSJussi Kivilinna .suite = { 264021c8e720SArd Biesheuvel .hash = __VECS(des3_ede_cmac64_tv_template) 264193b5e86aSJussi Kivilinna } 264293b5e86aSJussi Kivilinna }, { 2643e448370dSJussi Kivilinna .alg = "compress_null", 2644e448370dSJussi Kivilinna .test = alg_test_null, 2645e448370dSJussi Kivilinna }, { 2646ebb3472fSArd Biesheuvel .alg = "crc32", 2647ebb3472fSArd Biesheuvel .test = alg_test_hash, 2648ebb3472fSArd Biesheuvel .suite = { 264921c8e720SArd Biesheuvel .hash = __VECS(crc32_tv_template) 2650ebb3472fSArd Biesheuvel } 2651ebb3472fSArd Biesheuvel }, { 2652da7f033dSHerbert Xu .alg = "crc32c", 26538e3ee85eSHerbert Xu .test = alg_test_crc32c, 2654a1915d51SJarod Wilson .fips_allowed = 1, 2655da7f033dSHerbert Xu .suite = { 265621c8e720SArd Biesheuvel .hash = __VECS(crc32c_tv_template) 2657da7f033dSHerbert Xu } 2658da7f033dSHerbert Xu }, { 265968411521SHerbert Xu .alg = "crct10dif", 266068411521SHerbert Xu .test = alg_test_hash, 266168411521SHerbert Xu .fips_allowed = 1, 266268411521SHerbert Xu .suite = { 266321c8e720SArd Biesheuvel .hash = __VECS(crct10dif_tv_template) 266468411521SHerbert Xu } 266568411521SHerbert Xu }, { 2666f7cb80f2SJarod Wilson .alg = "ctr(aes)", 2667f7cb80f2SJarod Wilson .test = alg_test_skcipher, 2668a1915d51SJarod Wilson .fips_allowed = 1, 2669f7cb80f2SJarod Wilson .suite = { 2670f7cb80f2SJarod Wilson .cipher = { 267121c8e720SArd Biesheuvel .enc = __VECS(aes_ctr_enc_tv_template), 267221c8e720SArd Biesheuvel .dec = __VECS(aes_ctr_dec_tv_template) 2673f7cb80f2SJarod Wilson } 2674f7cb80f2SJarod Wilson } 2675f7cb80f2SJarod Wilson }, { 267685b63e34SJussi Kivilinna .alg = "ctr(blowfish)", 267785b63e34SJussi Kivilinna .test = alg_test_skcipher, 267885b63e34SJussi Kivilinna .suite = { 267985b63e34SJussi Kivilinna .cipher = { 268021c8e720SArd Biesheuvel .enc = __VECS(bf_ctr_enc_tv_template), 268121c8e720SArd Biesheuvel .dec = __VECS(bf_ctr_dec_tv_template) 268285b63e34SJussi Kivilinna } 268385b63e34SJussi Kivilinna } 268485b63e34SJussi Kivilinna }, { 26850840605eSJussi Kivilinna .alg = "ctr(camellia)", 26860840605eSJussi Kivilinna .test = alg_test_skcipher, 26870840605eSJussi Kivilinna .suite = { 26880840605eSJussi Kivilinna .cipher = { 268921c8e720SArd Biesheuvel .enc = __VECS(camellia_ctr_enc_tv_template), 269021c8e720SArd Biesheuvel .dec = __VECS(camellia_ctr_dec_tv_template) 26910840605eSJussi Kivilinna } 26920840605eSJussi Kivilinna } 26930840605eSJussi Kivilinna }, { 2694a2c58260SJohannes Goetzfried .alg = "ctr(cast5)", 2695a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 2696a2c58260SJohannes Goetzfried .suite = { 2697a2c58260SJohannes Goetzfried .cipher = { 269821c8e720SArd Biesheuvel .enc = __VECS(cast5_ctr_enc_tv_template), 269921c8e720SArd Biesheuvel .dec = __VECS(cast5_ctr_dec_tv_template) 2700a2c58260SJohannes Goetzfried } 2701a2c58260SJohannes Goetzfried } 2702a2c58260SJohannes Goetzfried }, { 27039b8b0405SJohannes Goetzfried .alg = "ctr(cast6)", 27049b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 27059b8b0405SJohannes Goetzfried .suite = { 27069b8b0405SJohannes Goetzfried .cipher = { 270721c8e720SArd Biesheuvel .enc = __VECS(cast6_ctr_enc_tv_template), 270821c8e720SArd Biesheuvel .dec = __VECS(cast6_ctr_dec_tv_template) 27099b8b0405SJohannes Goetzfried } 27109b8b0405SJohannes Goetzfried } 27119b8b0405SJohannes Goetzfried }, { 27128163fc30SJussi Kivilinna .alg = "ctr(des)", 27138163fc30SJussi Kivilinna .test = alg_test_skcipher, 27148163fc30SJussi Kivilinna .suite = { 27158163fc30SJussi Kivilinna .cipher = { 271621c8e720SArd Biesheuvel .enc = __VECS(des_ctr_enc_tv_template), 271721c8e720SArd Biesheuvel .dec = __VECS(des_ctr_dec_tv_template) 27188163fc30SJussi Kivilinna } 27198163fc30SJussi Kivilinna } 27208163fc30SJussi Kivilinna }, { 2721e080b17aSJussi Kivilinna .alg = "ctr(des3_ede)", 2722e080b17aSJussi Kivilinna .test = alg_test_skcipher, 27230d8da104SMarcelo Cerri .fips_allowed = 1, 2724e080b17aSJussi Kivilinna .suite = { 2725e080b17aSJussi Kivilinna .cipher = { 272621c8e720SArd Biesheuvel .enc = __VECS(des3_ede_ctr_enc_tv_template), 272721c8e720SArd Biesheuvel .dec = __VECS(des3_ede_ctr_dec_tv_template) 2728e080b17aSJussi Kivilinna } 2729e080b17aSJussi Kivilinna } 2730e080b17aSJussi Kivilinna }, { 27319d25917dSJussi Kivilinna .alg = "ctr(serpent)", 27329d25917dSJussi Kivilinna .test = alg_test_skcipher, 27339d25917dSJussi Kivilinna .suite = { 27349d25917dSJussi Kivilinna .cipher = { 273521c8e720SArd Biesheuvel .enc = __VECS(serpent_ctr_enc_tv_template), 273621c8e720SArd Biesheuvel .dec = __VECS(serpent_ctr_dec_tv_template) 27379d25917dSJussi Kivilinna } 27389d25917dSJussi Kivilinna } 27399d25917dSJussi Kivilinna }, { 2740573da620SJussi Kivilinna .alg = "ctr(twofish)", 2741573da620SJussi Kivilinna .test = alg_test_skcipher, 2742573da620SJussi Kivilinna .suite = { 2743573da620SJussi Kivilinna .cipher = { 274421c8e720SArd Biesheuvel .enc = __VECS(tf_ctr_enc_tv_template), 274521c8e720SArd Biesheuvel .dec = __VECS(tf_ctr_dec_tv_template) 2746573da620SJussi Kivilinna } 2747573da620SJussi Kivilinna } 2748573da620SJussi Kivilinna }, { 2749da7f033dSHerbert Xu .alg = "cts(cbc(aes))", 27501aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2751da7f033dSHerbert Xu .suite = { 2752da7f033dSHerbert Xu .cipher = { 275321c8e720SArd Biesheuvel .enc = __VECS(cts_mode_enc_tv_template), 275421c8e720SArd Biesheuvel .dec = __VECS(cts_mode_dec_tv_template) 2755da7f033dSHerbert Xu } 2756da7f033dSHerbert Xu } 2757da7f033dSHerbert Xu }, { 2758da7f033dSHerbert Xu .alg = "deflate", 2759da7f033dSHerbert Xu .test = alg_test_comp, 27600818904dSMilan Broz .fips_allowed = 1, 2761da7f033dSHerbert Xu .suite = { 2762da7f033dSHerbert Xu .comp = { 276321c8e720SArd Biesheuvel .comp = __VECS(deflate_comp_tv_template), 276421c8e720SArd Biesheuvel .decomp = __VECS(deflate_decomp_tv_template) 2765da7f033dSHerbert Xu } 2766da7f033dSHerbert Xu } 2767da7f033dSHerbert Xu }, { 2768802c7f1cSSalvatore Benedetto .alg = "dh", 2769802c7f1cSSalvatore Benedetto .test = alg_test_kpp, 2770802c7f1cSSalvatore Benedetto .fips_allowed = 1, 2771802c7f1cSSalvatore Benedetto .suite = { 277221c8e720SArd Biesheuvel .kpp = __VECS(dh_tv_template) 2773802c7f1cSSalvatore Benedetto } 2774802c7f1cSSalvatore Benedetto }, { 2775e448370dSJussi Kivilinna .alg = "digest_null", 2776e448370dSJussi Kivilinna .test = alg_test_null, 2777e448370dSJussi Kivilinna }, { 277864d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes128", 277964d1cdfbSStephan Mueller .test = alg_test_drbg, 278064d1cdfbSStephan Mueller .fips_allowed = 1, 278164d1cdfbSStephan Mueller .suite = { 278221c8e720SArd Biesheuvel .drbg = __VECS(drbg_nopr_ctr_aes128_tv_template) 278364d1cdfbSStephan Mueller } 278464d1cdfbSStephan Mueller }, { 278564d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes192", 278664d1cdfbSStephan Mueller .test = alg_test_drbg, 278764d1cdfbSStephan Mueller .fips_allowed = 1, 278864d1cdfbSStephan Mueller .suite = { 278921c8e720SArd Biesheuvel .drbg = __VECS(drbg_nopr_ctr_aes192_tv_template) 279064d1cdfbSStephan Mueller } 279164d1cdfbSStephan Mueller }, { 279264d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes256", 279364d1cdfbSStephan Mueller .test = alg_test_drbg, 279464d1cdfbSStephan Mueller .fips_allowed = 1, 279564d1cdfbSStephan Mueller .suite = { 279621c8e720SArd Biesheuvel .drbg = __VECS(drbg_nopr_ctr_aes256_tv_template) 279764d1cdfbSStephan Mueller } 279864d1cdfbSStephan Mueller }, { 279964d1cdfbSStephan Mueller /* 280064d1cdfbSStephan Mueller * There is no need to specifically test the DRBG with every 280164d1cdfbSStephan Mueller * backend cipher -- covered by drbg_nopr_hmac_sha256 test 280264d1cdfbSStephan Mueller */ 280364d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha1", 280464d1cdfbSStephan Mueller .fips_allowed = 1, 280564d1cdfbSStephan Mueller .test = alg_test_null, 280664d1cdfbSStephan Mueller }, { 280764d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha256", 280864d1cdfbSStephan Mueller .test = alg_test_drbg, 280964d1cdfbSStephan Mueller .fips_allowed = 1, 281064d1cdfbSStephan Mueller .suite = { 281121c8e720SArd Biesheuvel .drbg = __VECS(drbg_nopr_hmac_sha256_tv_template) 281264d1cdfbSStephan Mueller } 281364d1cdfbSStephan Mueller }, { 281464d1cdfbSStephan Mueller /* covered by drbg_nopr_hmac_sha256 test */ 281564d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha384", 281664d1cdfbSStephan Mueller .fips_allowed = 1, 281764d1cdfbSStephan Mueller .test = alg_test_null, 281864d1cdfbSStephan Mueller }, { 281964d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha512", 282064d1cdfbSStephan Mueller .test = alg_test_null, 282164d1cdfbSStephan Mueller .fips_allowed = 1, 282264d1cdfbSStephan Mueller }, { 282364d1cdfbSStephan Mueller .alg = "drbg_nopr_sha1", 282464d1cdfbSStephan Mueller .fips_allowed = 1, 282564d1cdfbSStephan Mueller .test = alg_test_null, 282664d1cdfbSStephan Mueller }, { 282764d1cdfbSStephan Mueller .alg = "drbg_nopr_sha256", 282864d1cdfbSStephan Mueller .test = alg_test_drbg, 282964d1cdfbSStephan Mueller .fips_allowed = 1, 283064d1cdfbSStephan Mueller .suite = { 283121c8e720SArd Biesheuvel .drbg = __VECS(drbg_nopr_sha256_tv_template) 283264d1cdfbSStephan Mueller } 283364d1cdfbSStephan Mueller }, { 283464d1cdfbSStephan Mueller /* covered by drbg_nopr_sha256 test */ 283564d1cdfbSStephan Mueller .alg = "drbg_nopr_sha384", 283664d1cdfbSStephan Mueller .fips_allowed = 1, 283764d1cdfbSStephan Mueller .test = alg_test_null, 283864d1cdfbSStephan Mueller }, { 283964d1cdfbSStephan Mueller .alg = "drbg_nopr_sha512", 284064d1cdfbSStephan Mueller .fips_allowed = 1, 284164d1cdfbSStephan Mueller .test = alg_test_null, 284264d1cdfbSStephan Mueller }, { 284364d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes128", 284464d1cdfbSStephan Mueller .test = alg_test_drbg, 284564d1cdfbSStephan Mueller .fips_allowed = 1, 284664d1cdfbSStephan Mueller .suite = { 284721c8e720SArd Biesheuvel .drbg = __VECS(drbg_pr_ctr_aes128_tv_template) 284864d1cdfbSStephan Mueller } 284964d1cdfbSStephan Mueller }, { 285064d1cdfbSStephan Mueller /* covered by drbg_pr_ctr_aes128 test */ 285164d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes192", 285264d1cdfbSStephan Mueller .fips_allowed = 1, 285364d1cdfbSStephan Mueller .test = alg_test_null, 285464d1cdfbSStephan Mueller }, { 285564d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes256", 285664d1cdfbSStephan Mueller .fips_allowed = 1, 285764d1cdfbSStephan Mueller .test = alg_test_null, 285864d1cdfbSStephan Mueller }, { 285964d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha1", 286064d1cdfbSStephan Mueller .fips_allowed = 1, 286164d1cdfbSStephan Mueller .test = alg_test_null, 286264d1cdfbSStephan Mueller }, { 286364d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha256", 286464d1cdfbSStephan Mueller .test = alg_test_drbg, 286564d1cdfbSStephan Mueller .fips_allowed = 1, 286664d1cdfbSStephan Mueller .suite = { 286721c8e720SArd Biesheuvel .drbg = __VECS(drbg_pr_hmac_sha256_tv_template) 286864d1cdfbSStephan Mueller } 286964d1cdfbSStephan Mueller }, { 287064d1cdfbSStephan Mueller /* covered by drbg_pr_hmac_sha256 test */ 287164d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha384", 287264d1cdfbSStephan Mueller .fips_allowed = 1, 287364d1cdfbSStephan Mueller .test = alg_test_null, 287464d1cdfbSStephan Mueller }, { 287564d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha512", 287664d1cdfbSStephan Mueller .test = alg_test_null, 287764d1cdfbSStephan Mueller .fips_allowed = 1, 287864d1cdfbSStephan Mueller }, { 287964d1cdfbSStephan Mueller .alg = "drbg_pr_sha1", 288064d1cdfbSStephan Mueller .fips_allowed = 1, 288164d1cdfbSStephan Mueller .test = alg_test_null, 288264d1cdfbSStephan Mueller }, { 288364d1cdfbSStephan Mueller .alg = "drbg_pr_sha256", 288464d1cdfbSStephan Mueller .test = alg_test_drbg, 288564d1cdfbSStephan Mueller .fips_allowed = 1, 288664d1cdfbSStephan Mueller .suite = { 288721c8e720SArd Biesheuvel .drbg = __VECS(drbg_pr_sha256_tv_template) 288864d1cdfbSStephan Mueller } 288964d1cdfbSStephan Mueller }, { 289064d1cdfbSStephan Mueller /* covered by drbg_pr_sha256 test */ 289164d1cdfbSStephan Mueller .alg = "drbg_pr_sha384", 289264d1cdfbSStephan Mueller .fips_allowed = 1, 289364d1cdfbSStephan Mueller .test = alg_test_null, 289464d1cdfbSStephan Mueller }, { 289564d1cdfbSStephan Mueller .alg = "drbg_pr_sha512", 289664d1cdfbSStephan Mueller .fips_allowed = 1, 289764d1cdfbSStephan Mueller .test = alg_test_null, 289864d1cdfbSStephan Mueller }, { 2899da7f033dSHerbert Xu .alg = "ecb(aes)", 29001aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2901a1915d51SJarod Wilson .fips_allowed = 1, 2902da7f033dSHerbert Xu .suite = { 2903da7f033dSHerbert Xu .cipher = { 290421c8e720SArd Biesheuvel .enc = __VECS(aes_enc_tv_template), 290521c8e720SArd Biesheuvel .dec = __VECS(aes_dec_tv_template) 2906da7f033dSHerbert Xu } 2907da7f033dSHerbert Xu } 2908da7f033dSHerbert Xu }, { 2909da7f033dSHerbert Xu .alg = "ecb(anubis)", 29101aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2911da7f033dSHerbert Xu .suite = { 2912da7f033dSHerbert Xu .cipher = { 291321c8e720SArd Biesheuvel .enc = __VECS(anubis_enc_tv_template), 291421c8e720SArd Biesheuvel .dec = __VECS(anubis_dec_tv_template) 2915da7f033dSHerbert Xu } 2916da7f033dSHerbert Xu } 2917da7f033dSHerbert Xu }, { 2918da7f033dSHerbert Xu .alg = "ecb(arc4)", 29191aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2920da7f033dSHerbert Xu .suite = { 2921da7f033dSHerbert Xu .cipher = { 292221c8e720SArd Biesheuvel .enc = __VECS(arc4_enc_tv_template), 292321c8e720SArd Biesheuvel .dec = __VECS(arc4_dec_tv_template) 2924da7f033dSHerbert Xu } 2925da7f033dSHerbert Xu } 2926da7f033dSHerbert Xu }, { 2927da7f033dSHerbert Xu .alg = "ecb(blowfish)", 29281aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2929da7f033dSHerbert Xu .suite = { 2930da7f033dSHerbert Xu .cipher = { 293121c8e720SArd Biesheuvel .enc = __VECS(bf_enc_tv_template), 293221c8e720SArd Biesheuvel .dec = __VECS(bf_dec_tv_template) 2933da7f033dSHerbert Xu } 2934da7f033dSHerbert Xu } 2935da7f033dSHerbert Xu }, { 2936da7f033dSHerbert Xu .alg = "ecb(camellia)", 29371aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2938da7f033dSHerbert Xu .suite = { 2939da7f033dSHerbert Xu .cipher = { 294021c8e720SArd Biesheuvel .enc = __VECS(camellia_enc_tv_template), 294121c8e720SArd Biesheuvel .dec = __VECS(camellia_dec_tv_template) 2942da7f033dSHerbert Xu } 2943da7f033dSHerbert Xu } 2944da7f033dSHerbert Xu }, { 2945da7f033dSHerbert Xu .alg = "ecb(cast5)", 29461aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2947da7f033dSHerbert Xu .suite = { 2948da7f033dSHerbert Xu .cipher = { 294921c8e720SArd Biesheuvel .enc = __VECS(cast5_enc_tv_template), 295021c8e720SArd Biesheuvel .dec = __VECS(cast5_dec_tv_template) 2951da7f033dSHerbert Xu } 2952da7f033dSHerbert Xu } 2953da7f033dSHerbert Xu }, { 2954da7f033dSHerbert Xu .alg = "ecb(cast6)", 29551aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2956da7f033dSHerbert Xu .suite = { 2957da7f033dSHerbert Xu .cipher = { 295821c8e720SArd Biesheuvel .enc = __VECS(cast6_enc_tv_template), 295921c8e720SArd Biesheuvel .dec = __VECS(cast6_dec_tv_template) 2960da7f033dSHerbert Xu } 2961da7f033dSHerbert Xu } 2962da7f033dSHerbert Xu }, { 2963e448370dSJussi Kivilinna .alg = "ecb(cipher_null)", 2964e448370dSJussi Kivilinna .test = alg_test_null, 29656175ca2bSMilan Broz .fips_allowed = 1, 2966e448370dSJussi Kivilinna }, { 2967da7f033dSHerbert Xu .alg = "ecb(des)", 29681aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2969da7f033dSHerbert Xu .suite = { 2970da7f033dSHerbert Xu .cipher = { 297121c8e720SArd Biesheuvel .enc = __VECS(des_enc_tv_template), 297221c8e720SArd Biesheuvel .dec = __VECS(des_dec_tv_template) 2973da7f033dSHerbert Xu } 2974da7f033dSHerbert Xu } 2975da7f033dSHerbert Xu }, { 2976da7f033dSHerbert Xu .alg = "ecb(des3_ede)", 29771aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2978a1915d51SJarod Wilson .fips_allowed = 1, 2979da7f033dSHerbert Xu .suite = { 2980da7f033dSHerbert Xu .cipher = { 298121c8e720SArd Biesheuvel .enc = __VECS(des3_ede_enc_tv_template), 298221c8e720SArd Biesheuvel .dec = __VECS(des3_ede_dec_tv_template) 2983da7f033dSHerbert Xu } 2984da7f033dSHerbert Xu } 2985da7f033dSHerbert Xu }, { 298666e5bd00SJussi Kivilinna .alg = "ecb(fcrypt)", 298766e5bd00SJussi Kivilinna .test = alg_test_skcipher, 298866e5bd00SJussi Kivilinna .suite = { 298966e5bd00SJussi Kivilinna .cipher = { 299066e5bd00SJussi Kivilinna .enc = { 299166e5bd00SJussi Kivilinna .vecs = fcrypt_pcbc_enc_tv_template, 299266e5bd00SJussi Kivilinna .count = 1 299366e5bd00SJussi Kivilinna }, 299466e5bd00SJussi Kivilinna .dec = { 299566e5bd00SJussi Kivilinna .vecs = fcrypt_pcbc_dec_tv_template, 299666e5bd00SJussi Kivilinna .count = 1 299766e5bd00SJussi Kivilinna } 299866e5bd00SJussi Kivilinna } 299966e5bd00SJussi Kivilinna } 300066e5bd00SJussi Kivilinna }, { 3001da7f033dSHerbert Xu .alg = "ecb(khazad)", 30021aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3003da7f033dSHerbert Xu .suite = { 3004da7f033dSHerbert Xu .cipher = { 300521c8e720SArd Biesheuvel .enc = __VECS(khazad_enc_tv_template), 300621c8e720SArd Biesheuvel .dec = __VECS(khazad_dec_tv_template) 3007da7f033dSHerbert Xu } 3008da7f033dSHerbert Xu } 3009da7f033dSHerbert Xu }, { 3010da7f033dSHerbert Xu .alg = "ecb(seed)", 30111aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3012da7f033dSHerbert Xu .suite = { 3013da7f033dSHerbert Xu .cipher = { 301421c8e720SArd Biesheuvel .enc = __VECS(seed_enc_tv_template), 301521c8e720SArd Biesheuvel .dec = __VECS(seed_dec_tv_template) 3016da7f033dSHerbert Xu } 3017da7f033dSHerbert Xu } 3018da7f033dSHerbert Xu }, { 3019da7f033dSHerbert Xu .alg = "ecb(serpent)", 30201aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3021da7f033dSHerbert Xu .suite = { 3022da7f033dSHerbert Xu .cipher = { 302321c8e720SArd Biesheuvel .enc = __VECS(serpent_enc_tv_template), 302421c8e720SArd Biesheuvel .dec = __VECS(serpent_dec_tv_template) 3025da7f033dSHerbert Xu } 3026da7f033dSHerbert Xu } 3027da7f033dSHerbert Xu }, { 3028cd83a8a7SGilad Ben-Yossef .alg = "ecb(sm4)", 3029cd83a8a7SGilad Ben-Yossef .test = alg_test_skcipher, 3030cd83a8a7SGilad Ben-Yossef .suite = { 3031cd83a8a7SGilad Ben-Yossef .cipher = { 3032cd83a8a7SGilad Ben-Yossef .enc = __VECS(sm4_enc_tv_template), 3033cd83a8a7SGilad Ben-Yossef .dec = __VECS(sm4_dec_tv_template) 3034cd83a8a7SGilad Ben-Yossef } 3035cd83a8a7SGilad Ben-Yossef } 3036cd83a8a7SGilad Ben-Yossef }, { 3037da7a0ab5SEric Biggers .alg = "ecb(speck128)", 3038da7a0ab5SEric Biggers .test = alg_test_skcipher, 3039da7a0ab5SEric Biggers .suite = { 3040da7a0ab5SEric Biggers .cipher = { 3041da7a0ab5SEric Biggers .enc = __VECS(speck128_enc_tv_template), 3042da7a0ab5SEric Biggers .dec = __VECS(speck128_dec_tv_template) 3043da7a0ab5SEric Biggers } 3044da7a0ab5SEric Biggers } 3045da7a0ab5SEric Biggers }, { 3046da7a0ab5SEric Biggers .alg = "ecb(speck64)", 3047da7a0ab5SEric Biggers .test = alg_test_skcipher, 3048da7a0ab5SEric Biggers .suite = { 3049da7a0ab5SEric Biggers .cipher = { 3050da7a0ab5SEric Biggers .enc = __VECS(speck64_enc_tv_template), 3051da7a0ab5SEric Biggers .dec = __VECS(speck64_dec_tv_template) 3052da7a0ab5SEric Biggers } 3053da7a0ab5SEric Biggers } 3054da7a0ab5SEric Biggers }, { 3055da7f033dSHerbert Xu .alg = "ecb(tea)", 30561aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3057da7f033dSHerbert Xu .suite = { 3058da7f033dSHerbert Xu .cipher = { 305921c8e720SArd Biesheuvel .enc = __VECS(tea_enc_tv_template), 306021c8e720SArd Biesheuvel .dec = __VECS(tea_dec_tv_template) 3061da7f033dSHerbert Xu } 3062da7f033dSHerbert Xu } 3063da7f033dSHerbert Xu }, { 3064da7f033dSHerbert Xu .alg = "ecb(tnepres)", 30651aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3066da7f033dSHerbert Xu .suite = { 3067da7f033dSHerbert Xu .cipher = { 306821c8e720SArd Biesheuvel .enc = __VECS(tnepres_enc_tv_template), 306921c8e720SArd Biesheuvel .dec = __VECS(tnepres_dec_tv_template) 3070da7f033dSHerbert Xu } 3071da7f033dSHerbert Xu } 3072da7f033dSHerbert Xu }, { 3073da7f033dSHerbert Xu .alg = "ecb(twofish)", 30741aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3075da7f033dSHerbert Xu .suite = { 3076da7f033dSHerbert Xu .cipher = { 307721c8e720SArd Biesheuvel .enc = __VECS(tf_enc_tv_template), 307821c8e720SArd Biesheuvel .dec = __VECS(tf_dec_tv_template) 3079da7f033dSHerbert Xu } 3080da7f033dSHerbert Xu } 3081da7f033dSHerbert Xu }, { 3082da7f033dSHerbert Xu .alg = "ecb(xeta)", 30831aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3084da7f033dSHerbert Xu .suite = { 3085da7f033dSHerbert Xu .cipher = { 308621c8e720SArd Biesheuvel .enc = __VECS(xeta_enc_tv_template), 308721c8e720SArd Biesheuvel .dec = __VECS(xeta_dec_tv_template) 3088da7f033dSHerbert Xu } 3089da7f033dSHerbert Xu } 3090da7f033dSHerbert Xu }, { 3091da7f033dSHerbert Xu .alg = "ecb(xtea)", 30921aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3093da7f033dSHerbert Xu .suite = { 3094da7f033dSHerbert Xu .cipher = { 309521c8e720SArd Biesheuvel .enc = __VECS(xtea_enc_tv_template), 309621c8e720SArd Biesheuvel .dec = __VECS(xtea_dec_tv_template) 3097da7f033dSHerbert Xu } 3098da7f033dSHerbert Xu } 3099da7f033dSHerbert Xu }, { 31003c4b2390SSalvatore Benedetto .alg = "ecdh", 31013c4b2390SSalvatore Benedetto .test = alg_test_kpp, 31023c4b2390SSalvatore Benedetto .fips_allowed = 1, 31033c4b2390SSalvatore Benedetto .suite = { 310421c8e720SArd Biesheuvel .kpp = __VECS(ecdh_tv_template) 31053c4b2390SSalvatore Benedetto } 31063c4b2390SSalvatore Benedetto }, { 3107da7f033dSHerbert Xu .alg = "gcm(aes)", 3108da7f033dSHerbert Xu .test = alg_test_aead, 3109a1915d51SJarod Wilson .fips_allowed = 1, 3110da7f033dSHerbert Xu .suite = { 3111da7f033dSHerbert Xu .aead = { 311221c8e720SArd Biesheuvel .enc = __VECS(aes_gcm_enc_tv_template), 311321c8e720SArd Biesheuvel .dec = __VECS(aes_gcm_dec_tv_template) 3114da7f033dSHerbert Xu } 3115da7f033dSHerbert Xu } 3116da7f033dSHerbert Xu }, { 3117507069c9SYouquan, Song .alg = "ghash", 3118507069c9SYouquan, Song .test = alg_test_hash, 311918c0ebd2SJarod Wilson .fips_allowed = 1, 3120507069c9SYouquan, Song .suite = { 312121c8e720SArd Biesheuvel .hash = __VECS(ghash_tv_template) 3122507069c9SYouquan, Song } 3123507069c9SYouquan, Song }, { 3124a482b081SSonic Zhang .alg = "hmac(crc32)", 3125a482b081SSonic Zhang .test = alg_test_hash, 3126a482b081SSonic Zhang .suite = { 312721c8e720SArd Biesheuvel .hash = __VECS(bfin_crc_tv_template) 3128a482b081SSonic Zhang } 3129a482b081SSonic Zhang }, { 3130da7f033dSHerbert Xu .alg = "hmac(md5)", 3131da7f033dSHerbert Xu .test = alg_test_hash, 3132da7f033dSHerbert Xu .suite = { 313321c8e720SArd Biesheuvel .hash = __VECS(hmac_md5_tv_template) 3134da7f033dSHerbert Xu } 3135da7f033dSHerbert Xu }, { 3136da7f033dSHerbert Xu .alg = "hmac(rmd128)", 3137da7f033dSHerbert Xu .test = alg_test_hash, 3138da7f033dSHerbert Xu .suite = { 313921c8e720SArd Biesheuvel .hash = __VECS(hmac_rmd128_tv_template) 3140da7f033dSHerbert Xu } 3141da7f033dSHerbert Xu }, { 3142da7f033dSHerbert Xu .alg = "hmac(rmd160)", 3143da7f033dSHerbert Xu .test = alg_test_hash, 3144da7f033dSHerbert Xu .suite = { 314521c8e720SArd Biesheuvel .hash = __VECS(hmac_rmd160_tv_template) 3146da7f033dSHerbert Xu } 3147da7f033dSHerbert Xu }, { 3148da7f033dSHerbert Xu .alg = "hmac(sha1)", 3149da7f033dSHerbert Xu .test = alg_test_hash, 3150a1915d51SJarod Wilson .fips_allowed = 1, 3151da7f033dSHerbert Xu .suite = { 315221c8e720SArd Biesheuvel .hash = __VECS(hmac_sha1_tv_template) 3153da7f033dSHerbert Xu } 3154da7f033dSHerbert Xu }, { 3155da7f033dSHerbert Xu .alg = "hmac(sha224)", 3156da7f033dSHerbert Xu .test = alg_test_hash, 3157a1915d51SJarod Wilson .fips_allowed = 1, 3158da7f033dSHerbert Xu .suite = { 315921c8e720SArd Biesheuvel .hash = __VECS(hmac_sha224_tv_template) 3160da7f033dSHerbert Xu } 3161da7f033dSHerbert Xu }, { 3162da7f033dSHerbert Xu .alg = "hmac(sha256)", 3163da7f033dSHerbert Xu .test = alg_test_hash, 3164a1915d51SJarod Wilson .fips_allowed = 1, 3165da7f033dSHerbert Xu .suite = { 316621c8e720SArd Biesheuvel .hash = __VECS(hmac_sha256_tv_template) 3167da7f033dSHerbert Xu } 3168da7f033dSHerbert Xu }, { 316998eca72fSraveendra padasalagi .alg = "hmac(sha3-224)", 317098eca72fSraveendra padasalagi .test = alg_test_hash, 317198eca72fSraveendra padasalagi .fips_allowed = 1, 317298eca72fSraveendra padasalagi .suite = { 317321c8e720SArd Biesheuvel .hash = __VECS(hmac_sha3_224_tv_template) 317498eca72fSraveendra padasalagi } 317598eca72fSraveendra padasalagi }, { 317698eca72fSraveendra padasalagi .alg = "hmac(sha3-256)", 317798eca72fSraveendra padasalagi .test = alg_test_hash, 317898eca72fSraveendra padasalagi .fips_allowed = 1, 317998eca72fSraveendra padasalagi .suite = { 318021c8e720SArd Biesheuvel .hash = __VECS(hmac_sha3_256_tv_template) 318198eca72fSraveendra padasalagi } 318298eca72fSraveendra padasalagi }, { 318398eca72fSraveendra padasalagi .alg = "hmac(sha3-384)", 318498eca72fSraveendra padasalagi .test = alg_test_hash, 318598eca72fSraveendra padasalagi .fips_allowed = 1, 318698eca72fSraveendra padasalagi .suite = { 318721c8e720SArd Biesheuvel .hash = __VECS(hmac_sha3_384_tv_template) 318898eca72fSraveendra padasalagi } 318998eca72fSraveendra padasalagi }, { 319098eca72fSraveendra padasalagi .alg = "hmac(sha3-512)", 319198eca72fSraveendra padasalagi .test = alg_test_hash, 319298eca72fSraveendra padasalagi .fips_allowed = 1, 319398eca72fSraveendra padasalagi .suite = { 319421c8e720SArd Biesheuvel .hash = __VECS(hmac_sha3_512_tv_template) 319598eca72fSraveendra padasalagi } 319698eca72fSraveendra padasalagi }, { 3197da7f033dSHerbert Xu .alg = "hmac(sha384)", 3198da7f033dSHerbert Xu .test = alg_test_hash, 3199a1915d51SJarod Wilson .fips_allowed = 1, 3200da7f033dSHerbert Xu .suite = { 320121c8e720SArd Biesheuvel .hash = __VECS(hmac_sha384_tv_template) 3202da7f033dSHerbert Xu } 3203da7f033dSHerbert Xu }, { 3204da7f033dSHerbert Xu .alg = "hmac(sha512)", 3205da7f033dSHerbert Xu .test = alg_test_hash, 3206a1915d51SJarod Wilson .fips_allowed = 1, 3207da7f033dSHerbert Xu .suite = { 320821c8e720SArd Biesheuvel .hash = __VECS(hmac_sha512_tv_template) 3209da7f033dSHerbert Xu } 3210da7f033dSHerbert Xu }, { 3211bb5530e4SStephan Mueller .alg = "jitterentropy_rng", 3212bb5530e4SStephan Mueller .fips_allowed = 1, 3213bb5530e4SStephan Mueller .test = alg_test_null, 3214bb5530e4SStephan Mueller }, { 321535351988SStephan Mueller .alg = "kw(aes)", 321635351988SStephan Mueller .test = alg_test_skcipher, 321735351988SStephan Mueller .fips_allowed = 1, 321835351988SStephan Mueller .suite = { 321935351988SStephan Mueller .cipher = { 322021c8e720SArd Biesheuvel .enc = __VECS(aes_kw_enc_tv_template), 322121c8e720SArd Biesheuvel .dec = __VECS(aes_kw_dec_tv_template) 322235351988SStephan Mueller } 322335351988SStephan Mueller } 322435351988SStephan Mueller }, { 3225da7f033dSHerbert Xu .alg = "lrw(aes)", 32261aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3227da7f033dSHerbert Xu .suite = { 3228da7f033dSHerbert Xu .cipher = { 322921c8e720SArd Biesheuvel .enc = __VECS(aes_lrw_enc_tv_template), 323021c8e720SArd Biesheuvel .dec = __VECS(aes_lrw_dec_tv_template) 3231da7f033dSHerbert Xu } 3232da7f033dSHerbert Xu } 3233da7f033dSHerbert Xu }, { 32340840605eSJussi Kivilinna .alg = "lrw(camellia)", 32350840605eSJussi Kivilinna .test = alg_test_skcipher, 32360840605eSJussi Kivilinna .suite = { 32370840605eSJussi Kivilinna .cipher = { 323821c8e720SArd Biesheuvel .enc = __VECS(camellia_lrw_enc_tv_template), 323921c8e720SArd Biesheuvel .dec = __VECS(camellia_lrw_dec_tv_template) 32400840605eSJussi Kivilinna } 32410840605eSJussi Kivilinna } 32420840605eSJussi Kivilinna }, { 32439b8b0405SJohannes Goetzfried .alg = "lrw(cast6)", 32449b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 32459b8b0405SJohannes Goetzfried .suite = { 32469b8b0405SJohannes Goetzfried .cipher = { 324721c8e720SArd Biesheuvel .enc = __VECS(cast6_lrw_enc_tv_template), 324821c8e720SArd Biesheuvel .dec = __VECS(cast6_lrw_dec_tv_template) 32499b8b0405SJohannes Goetzfried } 32509b8b0405SJohannes Goetzfried } 32519b8b0405SJohannes Goetzfried }, { 3252d7bfc0faSJussi Kivilinna .alg = "lrw(serpent)", 3253d7bfc0faSJussi Kivilinna .test = alg_test_skcipher, 3254d7bfc0faSJussi Kivilinna .suite = { 3255d7bfc0faSJussi Kivilinna .cipher = { 325621c8e720SArd Biesheuvel .enc = __VECS(serpent_lrw_enc_tv_template), 325721c8e720SArd Biesheuvel .dec = __VECS(serpent_lrw_dec_tv_template) 3258d7bfc0faSJussi Kivilinna } 3259d7bfc0faSJussi Kivilinna } 3260d7bfc0faSJussi Kivilinna }, { 32610b2a1551SJussi Kivilinna .alg = "lrw(twofish)", 32620b2a1551SJussi Kivilinna .test = alg_test_skcipher, 32630b2a1551SJussi Kivilinna .suite = { 32640b2a1551SJussi Kivilinna .cipher = { 326521c8e720SArd Biesheuvel .enc = __VECS(tf_lrw_enc_tv_template), 326621c8e720SArd Biesheuvel .dec = __VECS(tf_lrw_dec_tv_template) 32670b2a1551SJussi Kivilinna } 32680b2a1551SJussi Kivilinna } 32690b2a1551SJussi Kivilinna }, { 32701443cc9bSKOVACS Krisztian .alg = "lz4", 32711443cc9bSKOVACS Krisztian .test = alg_test_comp, 32721443cc9bSKOVACS Krisztian .fips_allowed = 1, 32731443cc9bSKOVACS Krisztian .suite = { 32741443cc9bSKOVACS Krisztian .comp = { 327521c8e720SArd Biesheuvel .comp = __VECS(lz4_comp_tv_template), 327621c8e720SArd Biesheuvel .decomp = __VECS(lz4_decomp_tv_template) 32771443cc9bSKOVACS Krisztian } 32781443cc9bSKOVACS Krisztian } 32791443cc9bSKOVACS Krisztian }, { 32801443cc9bSKOVACS Krisztian .alg = "lz4hc", 32811443cc9bSKOVACS Krisztian .test = alg_test_comp, 32821443cc9bSKOVACS Krisztian .fips_allowed = 1, 32831443cc9bSKOVACS Krisztian .suite = { 32841443cc9bSKOVACS Krisztian .comp = { 328521c8e720SArd Biesheuvel .comp = __VECS(lz4hc_comp_tv_template), 328621c8e720SArd Biesheuvel .decomp = __VECS(lz4hc_decomp_tv_template) 32871443cc9bSKOVACS Krisztian } 32881443cc9bSKOVACS Krisztian } 32891443cc9bSKOVACS Krisztian }, { 3290da7f033dSHerbert Xu .alg = "lzo", 3291da7f033dSHerbert Xu .test = alg_test_comp, 32920818904dSMilan Broz .fips_allowed = 1, 3293da7f033dSHerbert Xu .suite = { 3294da7f033dSHerbert Xu .comp = { 329521c8e720SArd Biesheuvel .comp = __VECS(lzo_comp_tv_template), 329621c8e720SArd Biesheuvel .decomp = __VECS(lzo_decomp_tv_template) 3297da7f033dSHerbert Xu } 3298da7f033dSHerbert Xu } 3299da7f033dSHerbert Xu }, { 3300da7f033dSHerbert Xu .alg = "md4", 3301da7f033dSHerbert Xu .test = alg_test_hash, 3302da7f033dSHerbert Xu .suite = { 330321c8e720SArd Biesheuvel .hash = __VECS(md4_tv_template) 3304da7f033dSHerbert Xu } 3305da7f033dSHerbert Xu }, { 3306da7f033dSHerbert Xu .alg = "md5", 3307da7f033dSHerbert Xu .test = alg_test_hash, 3308da7f033dSHerbert Xu .suite = { 330921c8e720SArd Biesheuvel .hash = __VECS(md5_tv_template) 3310da7f033dSHerbert Xu } 3311da7f033dSHerbert Xu }, { 3312da7f033dSHerbert Xu .alg = "michael_mic", 3313da7f033dSHerbert Xu .test = alg_test_hash, 3314da7f033dSHerbert Xu .suite = { 331521c8e720SArd Biesheuvel .hash = __VECS(michael_mic_tv_template) 3316da7f033dSHerbert Xu } 3317da7f033dSHerbert Xu }, { 3318ba0e14acSPuneet Saxena .alg = "ofb(aes)", 3319ba0e14acSPuneet Saxena .test = alg_test_skcipher, 3320ba0e14acSPuneet Saxena .fips_allowed = 1, 3321ba0e14acSPuneet Saxena .suite = { 3322ba0e14acSPuneet Saxena .cipher = { 332321c8e720SArd Biesheuvel .enc = __VECS(aes_ofb_enc_tv_template), 332421c8e720SArd Biesheuvel .dec = __VECS(aes_ofb_dec_tv_template) 3325ba0e14acSPuneet Saxena } 3326ba0e14acSPuneet Saxena } 3327ba0e14acSPuneet Saxena }, { 3328da7f033dSHerbert Xu .alg = "pcbc(fcrypt)", 33291aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3330da7f033dSHerbert Xu .suite = { 3331da7f033dSHerbert Xu .cipher = { 333221c8e720SArd Biesheuvel .enc = __VECS(fcrypt_pcbc_enc_tv_template), 333321c8e720SArd Biesheuvel .dec = __VECS(fcrypt_pcbc_dec_tv_template) 3334da7f033dSHerbert Xu } 3335da7f033dSHerbert Xu } 3336da7f033dSHerbert Xu }, { 33371207107cSStephan Mueller .alg = "pkcs1pad(rsa,sha224)", 33381207107cSStephan Mueller .test = alg_test_null, 33391207107cSStephan Mueller .fips_allowed = 1, 33401207107cSStephan Mueller }, { 33411207107cSStephan Mueller .alg = "pkcs1pad(rsa,sha256)", 33421207107cSStephan Mueller .test = alg_test_akcipher, 33431207107cSStephan Mueller .fips_allowed = 1, 33441207107cSStephan Mueller .suite = { 33451207107cSStephan Mueller .akcipher = __VECS(pkcs1pad_rsa_tv_template) 33461207107cSStephan Mueller } 33471207107cSStephan Mueller }, { 33481207107cSStephan Mueller .alg = "pkcs1pad(rsa,sha384)", 33491207107cSStephan Mueller .test = alg_test_null, 33501207107cSStephan Mueller .fips_allowed = 1, 33511207107cSStephan Mueller }, { 33521207107cSStephan Mueller .alg = "pkcs1pad(rsa,sha512)", 33531207107cSStephan Mueller .test = alg_test_null, 33541207107cSStephan Mueller .fips_allowed = 1, 33551207107cSStephan Mueller }, { 3356eee9dc61SMartin Willi .alg = "poly1305", 3357eee9dc61SMartin Willi .test = alg_test_hash, 3358eee9dc61SMartin Willi .suite = { 335921c8e720SArd Biesheuvel .hash = __VECS(poly1305_tv_template) 3360eee9dc61SMartin Willi } 3361eee9dc61SMartin Willi }, { 3362da7f033dSHerbert Xu .alg = "rfc3686(ctr(aes))", 33631aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3364a1915d51SJarod Wilson .fips_allowed = 1, 3365da7f033dSHerbert Xu .suite = { 3366da7f033dSHerbert Xu .cipher = { 336721c8e720SArd Biesheuvel .enc = __VECS(aes_ctr_rfc3686_enc_tv_template), 336821c8e720SArd Biesheuvel .dec = __VECS(aes_ctr_rfc3686_dec_tv_template) 3369da7f033dSHerbert Xu } 3370da7f033dSHerbert Xu } 3371da7f033dSHerbert Xu }, { 33723f31a740SHerbert Xu .alg = "rfc4106(gcm(aes))", 337369435b94SAdrian Hoban .test = alg_test_aead, 3374db71f29aSJarod Wilson .fips_allowed = 1, 337569435b94SAdrian Hoban .suite = { 337669435b94SAdrian Hoban .aead = { 337721c8e720SArd Biesheuvel .enc = __VECS(aes_gcm_rfc4106_enc_tv_template), 337821c8e720SArd Biesheuvel .dec = __VECS(aes_gcm_rfc4106_dec_tv_template) 337969435b94SAdrian Hoban } 338069435b94SAdrian Hoban } 338169435b94SAdrian Hoban }, { 3382544c436aSHerbert Xu .alg = "rfc4309(ccm(aes))", 33835d667322SJarod Wilson .test = alg_test_aead, 3384a1915d51SJarod Wilson .fips_allowed = 1, 33855d667322SJarod Wilson .suite = { 33865d667322SJarod Wilson .aead = { 338721c8e720SArd Biesheuvel .enc = __VECS(aes_ccm_rfc4309_enc_tv_template), 338821c8e720SArd Biesheuvel .dec = __VECS(aes_ccm_rfc4309_dec_tv_template) 33895d667322SJarod Wilson } 33905d667322SJarod Wilson } 33915d667322SJarod Wilson }, { 3392bb68745eSHerbert Xu .alg = "rfc4543(gcm(aes))", 3393e9b7441aSJussi Kivilinna .test = alg_test_aead, 3394e9b7441aSJussi Kivilinna .suite = { 3395e9b7441aSJussi Kivilinna .aead = { 339621c8e720SArd Biesheuvel .enc = __VECS(aes_gcm_rfc4543_enc_tv_template), 339721c8e720SArd Biesheuvel .dec = __VECS(aes_gcm_rfc4543_dec_tv_template), 3398e9b7441aSJussi Kivilinna } 3399e9b7441aSJussi Kivilinna } 3400e9b7441aSJussi Kivilinna }, { 3401af2b76b5SMartin Willi .alg = "rfc7539(chacha20,poly1305)", 3402af2b76b5SMartin Willi .test = alg_test_aead, 3403af2b76b5SMartin Willi .suite = { 3404af2b76b5SMartin Willi .aead = { 340521c8e720SArd Biesheuvel .enc = __VECS(rfc7539_enc_tv_template), 340621c8e720SArd Biesheuvel .dec = __VECS(rfc7539_dec_tv_template), 3407af2b76b5SMartin Willi } 3408af2b76b5SMartin Willi } 3409af2b76b5SMartin Willi }, { 34105900758dSMartin Willi .alg = "rfc7539esp(chacha20,poly1305)", 34115900758dSMartin Willi .test = alg_test_aead, 34125900758dSMartin Willi .suite = { 34135900758dSMartin Willi .aead = { 341421c8e720SArd Biesheuvel .enc = __VECS(rfc7539esp_enc_tv_template), 341521c8e720SArd Biesheuvel .dec = __VECS(rfc7539esp_dec_tv_template), 34165900758dSMartin Willi } 34175900758dSMartin Willi } 34185900758dSMartin Willi }, { 3419da7f033dSHerbert Xu .alg = "rmd128", 3420da7f033dSHerbert Xu .test = alg_test_hash, 3421da7f033dSHerbert Xu .suite = { 342221c8e720SArd Biesheuvel .hash = __VECS(rmd128_tv_template) 3423da7f033dSHerbert Xu } 3424da7f033dSHerbert Xu }, { 3425da7f033dSHerbert Xu .alg = "rmd160", 3426da7f033dSHerbert Xu .test = alg_test_hash, 3427da7f033dSHerbert Xu .suite = { 342821c8e720SArd Biesheuvel .hash = __VECS(rmd160_tv_template) 3429da7f033dSHerbert Xu } 3430da7f033dSHerbert Xu }, { 3431da7f033dSHerbert Xu .alg = "rmd256", 3432da7f033dSHerbert Xu .test = alg_test_hash, 3433da7f033dSHerbert Xu .suite = { 343421c8e720SArd Biesheuvel .hash = __VECS(rmd256_tv_template) 3435da7f033dSHerbert Xu } 3436da7f033dSHerbert Xu }, { 3437da7f033dSHerbert Xu .alg = "rmd320", 3438da7f033dSHerbert Xu .test = alg_test_hash, 3439da7f033dSHerbert Xu .suite = { 344021c8e720SArd Biesheuvel .hash = __VECS(rmd320_tv_template) 3441da7f033dSHerbert Xu } 3442da7f033dSHerbert Xu }, { 3443946cc463STadeusz Struk .alg = "rsa", 3444946cc463STadeusz Struk .test = alg_test_akcipher, 3445946cc463STadeusz Struk .fips_allowed = 1, 3446946cc463STadeusz Struk .suite = { 344721c8e720SArd Biesheuvel .akcipher = __VECS(rsa_tv_template) 3448946cc463STadeusz Struk } 3449946cc463STadeusz Struk }, { 3450da7f033dSHerbert Xu .alg = "salsa20", 34511aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3452da7f033dSHerbert Xu .suite = { 3453da7f033dSHerbert Xu .cipher = { 345421c8e720SArd Biesheuvel .enc = __VECS(salsa20_stream_enc_tv_template) 3455da7f033dSHerbert Xu } 3456da7f033dSHerbert Xu } 3457da7f033dSHerbert Xu }, { 3458da7f033dSHerbert Xu .alg = "sha1", 3459da7f033dSHerbert Xu .test = alg_test_hash, 3460a1915d51SJarod Wilson .fips_allowed = 1, 3461da7f033dSHerbert Xu .suite = { 346221c8e720SArd Biesheuvel .hash = __VECS(sha1_tv_template) 3463da7f033dSHerbert Xu } 3464da7f033dSHerbert Xu }, { 3465da7f033dSHerbert Xu .alg = "sha224", 3466da7f033dSHerbert Xu .test = alg_test_hash, 3467a1915d51SJarod Wilson .fips_allowed = 1, 3468da7f033dSHerbert Xu .suite = { 346921c8e720SArd Biesheuvel .hash = __VECS(sha224_tv_template) 3470da7f033dSHerbert Xu } 3471da7f033dSHerbert Xu }, { 3472da7f033dSHerbert Xu .alg = "sha256", 3473da7f033dSHerbert Xu .test = alg_test_hash, 3474a1915d51SJarod Wilson .fips_allowed = 1, 3475da7f033dSHerbert Xu .suite = { 347621c8e720SArd Biesheuvel .hash = __VECS(sha256_tv_template) 3477da7f033dSHerbert Xu } 3478da7f033dSHerbert Xu }, { 347979cc6ab8Sraveendra padasalagi .alg = "sha3-224", 348079cc6ab8Sraveendra padasalagi .test = alg_test_hash, 348179cc6ab8Sraveendra padasalagi .fips_allowed = 1, 348279cc6ab8Sraveendra padasalagi .suite = { 348321c8e720SArd Biesheuvel .hash = __VECS(sha3_224_tv_template) 348479cc6ab8Sraveendra padasalagi } 348579cc6ab8Sraveendra padasalagi }, { 348679cc6ab8Sraveendra padasalagi .alg = "sha3-256", 348779cc6ab8Sraveendra padasalagi .test = alg_test_hash, 348879cc6ab8Sraveendra padasalagi .fips_allowed = 1, 348979cc6ab8Sraveendra padasalagi .suite = { 349021c8e720SArd Biesheuvel .hash = __VECS(sha3_256_tv_template) 349179cc6ab8Sraveendra padasalagi } 349279cc6ab8Sraveendra padasalagi }, { 349379cc6ab8Sraveendra padasalagi .alg = "sha3-384", 349479cc6ab8Sraveendra padasalagi .test = alg_test_hash, 349579cc6ab8Sraveendra padasalagi .fips_allowed = 1, 349679cc6ab8Sraveendra padasalagi .suite = { 349721c8e720SArd Biesheuvel .hash = __VECS(sha3_384_tv_template) 349879cc6ab8Sraveendra padasalagi } 349979cc6ab8Sraveendra padasalagi }, { 350079cc6ab8Sraveendra padasalagi .alg = "sha3-512", 350179cc6ab8Sraveendra padasalagi .test = alg_test_hash, 350279cc6ab8Sraveendra padasalagi .fips_allowed = 1, 350379cc6ab8Sraveendra padasalagi .suite = { 350421c8e720SArd Biesheuvel .hash = __VECS(sha3_512_tv_template) 350579cc6ab8Sraveendra padasalagi } 350679cc6ab8Sraveendra padasalagi }, { 3507da7f033dSHerbert Xu .alg = "sha384", 3508da7f033dSHerbert Xu .test = alg_test_hash, 3509a1915d51SJarod Wilson .fips_allowed = 1, 3510da7f033dSHerbert Xu .suite = { 351121c8e720SArd Biesheuvel .hash = __VECS(sha384_tv_template) 3512da7f033dSHerbert Xu } 3513da7f033dSHerbert Xu }, { 3514da7f033dSHerbert Xu .alg = "sha512", 3515da7f033dSHerbert Xu .test = alg_test_hash, 3516a1915d51SJarod Wilson .fips_allowed = 1, 3517da7f033dSHerbert Xu .suite = { 351821c8e720SArd Biesheuvel .hash = __VECS(sha512_tv_template) 3519da7f033dSHerbert Xu } 3520da7f033dSHerbert Xu }, { 3521b7e27530SGilad Ben-Yossef .alg = "sm3", 3522b7e27530SGilad Ben-Yossef .test = alg_test_hash, 3523b7e27530SGilad Ben-Yossef .suite = { 3524b7e27530SGilad Ben-Yossef .hash = __VECS(sm3_tv_template) 3525b7e27530SGilad Ben-Yossef } 3526b7e27530SGilad Ben-Yossef }, { 3527da7f033dSHerbert Xu .alg = "tgr128", 3528da7f033dSHerbert Xu .test = alg_test_hash, 3529da7f033dSHerbert Xu .suite = { 353021c8e720SArd Biesheuvel .hash = __VECS(tgr128_tv_template) 3531da7f033dSHerbert Xu } 3532da7f033dSHerbert Xu }, { 3533da7f033dSHerbert Xu .alg = "tgr160", 3534da7f033dSHerbert Xu .test = alg_test_hash, 3535da7f033dSHerbert Xu .suite = { 353621c8e720SArd Biesheuvel .hash = __VECS(tgr160_tv_template) 3537da7f033dSHerbert Xu } 3538da7f033dSHerbert Xu }, { 3539da7f033dSHerbert Xu .alg = "tgr192", 3540da7f033dSHerbert Xu .test = alg_test_hash, 3541da7f033dSHerbert Xu .suite = { 354221c8e720SArd Biesheuvel .hash = __VECS(tgr192_tv_template) 3543da7f033dSHerbert Xu } 3544da7f033dSHerbert Xu }, { 3545f1939f7cSShane Wang .alg = "vmac(aes)", 3546f1939f7cSShane Wang .test = alg_test_hash, 3547f1939f7cSShane Wang .suite = { 354821c8e720SArd Biesheuvel .hash = __VECS(aes_vmac128_tv_template) 3549f1939f7cSShane Wang } 3550f1939f7cSShane Wang }, { 3551da7f033dSHerbert Xu .alg = "wp256", 3552da7f033dSHerbert Xu .test = alg_test_hash, 3553da7f033dSHerbert Xu .suite = { 355421c8e720SArd Biesheuvel .hash = __VECS(wp256_tv_template) 3555da7f033dSHerbert Xu } 3556da7f033dSHerbert Xu }, { 3557da7f033dSHerbert Xu .alg = "wp384", 3558da7f033dSHerbert Xu .test = alg_test_hash, 3559da7f033dSHerbert Xu .suite = { 356021c8e720SArd Biesheuvel .hash = __VECS(wp384_tv_template) 3561da7f033dSHerbert Xu } 3562da7f033dSHerbert Xu }, { 3563da7f033dSHerbert Xu .alg = "wp512", 3564da7f033dSHerbert Xu .test = alg_test_hash, 3565da7f033dSHerbert Xu .suite = { 356621c8e720SArd Biesheuvel .hash = __VECS(wp512_tv_template) 3567da7f033dSHerbert Xu } 3568da7f033dSHerbert Xu }, { 3569da7f033dSHerbert Xu .alg = "xcbc(aes)", 3570da7f033dSHerbert Xu .test = alg_test_hash, 3571da7f033dSHerbert Xu .suite = { 357221c8e720SArd Biesheuvel .hash = __VECS(aes_xcbc128_tv_template) 3573da7f033dSHerbert Xu } 3574da7f033dSHerbert Xu }, { 3575da7f033dSHerbert Xu .alg = "xts(aes)", 35761aa4ecd9SHerbert Xu .test = alg_test_skcipher, 35772918aa8dSJarod Wilson .fips_allowed = 1, 3578da7f033dSHerbert Xu .suite = { 3579da7f033dSHerbert Xu .cipher = { 358021c8e720SArd Biesheuvel .enc = __VECS(aes_xts_enc_tv_template), 358121c8e720SArd Biesheuvel .dec = __VECS(aes_xts_dec_tv_template) 3582da7f033dSHerbert Xu } 3583da7f033dSHerbert Xu } 35840c01aed5SGeert Uytterhoeven }, { 35850840605eSJussi Kivilinna .alg = "xts(camellia)", 35860840605eSJussi Kivilinna .test = alg_test_skcipher, 35870840605eSJussi Kivilinna .suite = { 35880840605eSJussi Kivilinna .cipher = { 358921c8e720SArd Biesheuvel .enc = __VECS(camellia_xts_enc_tv_template), 359021c8e720SArd Biesheuvel .dec = __VECS(camellia_xts_dec_tv_template) 35910840605eSJussi Kivilinna } 35920840605eSJussi Kivilinna } 35930840605eSJussi Kivilinna }, { 35949b8b0405SJohannes Goetzfried .alg = "xts(cast6)", 35959b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 35969b8b0405SJohannes Goetzfried .suite = { 35979b8b0405SJohannes Goetzfried .cipher = { 359821c8e720SArd Biesheuvel .enc = __VECS(cast6_xts_enc_tv_template), 359921c8e720SArd Biesheuvel .dec = __VECS(cast6_xts_dec_tv_template) 36009b8b0405SJohannes Goetzfried } 36019b8b0405SJohannes Goetzfried } 36029b8b0405SJohannes Goetzfried }, { 360318be20b9SJussi Kivilinna .alg = "xts(serpent)", 360418be20b9SJussi Kivilinna .test = alg_test_skcipher, 360518be20b9SJussi Kivilinna .suite = { 360618be20b9SJussi Kivilinna .cipher = { 360721c8e720SArd Biesheuvel .enc = __VECS(serpent_xts_enc_tv_template), 360821c8e720SArd Biesheuvel .dec = __VECS(serpent_xts_dec_tv_template) 360918be20b9SJussi Kivilinna } 361018be20b9SJussi Kivilinna } 361118be20b9SJussi Kivilinna }, { 3612c3bb521bSEric Biggers .alg = "xts(speck128)", 3613c3bb521bSEric Biggers .test = alg_test_skcipher, 3614c3bb521bSEric Biggers .suite = { 3615c3bb521bSEric Biggers .cipher = { 3616c3bb521bSEric Biggers .enc = __VECS(speck128_xts_enc_tv_template), 3617c3bb521bSEric Biggers .dec = __VECS(speck128_xts_dec_tv_template) 3618c3bb521bSEric Biggers } 3619c3bb521bSEric Biggers } 3620c3bb521bSEric Biggers }, { 362141b3316eSEric Biggers .alg = "xts(speck64)", 362241b3316eSEric Biggers .test = alg_test_skcipher, 362341b3316eSEric Biggers .suite = { 362441b3316eSEric Biggers .cipher = { 362541b3316eSEric Biggers .enc = __VECS(speck64_xts_enc_tv_template), 362641b3316eSEric Biggers .dec = __VECS(speck64_xts_dec_tv_template) 362741b3316eSEric Biggers } 362841b3316eSEric Biggers } 362941b3316eSEric Biggers }, { 3630aed265b9SJussi Kivilinna .alg = "xts(twofish)", 3631aed265b9SJussi Kivilinna .test = alg_test_skcipher, 3632aed265b9SJussi Kivilinna .suite = { 3633aed265b9SJussi Kivilinna .cipher = { 363421c8e720SArd Biesheuvel .enc = __VECS(tf_xts_enc_tv_template), 363521c8e720SArd Biesheuvel .dec = __VECS(tf_xts_dec_tv_template) 3636aed265b9SJussi Kivilinna } 3637aed265b9SJussi Kivilinna } 3638a368f43dSGiovanni Cabiddu }, { 3639a368f43dSGiovanni Cabiddu .alg = "zlib-deflate", 3640a368f43dSGiovanni Cabiddu .test = alg_test_comp, 3641a368f43dSGiovanni Cabiddu .fips_allowed = 1, 3642a368f43dSGiovanni Cabiddu .suite = { 3643a368f43dSGiovanni Cabiddu .comp = { 3644a368f43dSGiovanni Cabiddu .comp = __VECS(zlib_deflate_comp_tv_template), 3645a368f43dSGiovanni Cabiddu .decomp = __VECS(zlib_deflate_decomp_tv_template) 3646a368f43dSGiovanni Cabiddu } 3647a368f43dSGiovanni Cabiddu } 3648d28fc3dbSNick Terrell }, { 3649d28fc3dbSNick Terrell .alg = "zstd", 3650d28fc3dbSNick Terrell .test = alg_test_comp, 3651d28fc3dbSNick Terrell .fips_allowed = 1, 3652d28fc3dbSNick Terrell .suite = { 3653d28fc3dbSNick Terrell .comp = { 3654d28fc3dbSNick Terrell .comp = __VECS(zstd_comp_tv_template), 3655d28fc3dbSNick Terrell .decomp = __VECS(zstd_decomp_tv_template) 3656d28fc3dbSNick Terrell } 3657d28fc3dbSNick Terrell } 3658da7f033dSHerbert Xu } 3659da7f033dSHerbert Xu }; 3660da7f033dSHerbert Xu 36615714758bSJussi Kivilinna static bool alg_test_descs_checked; 36625714758bSJussi Kivilinna 36635714758bSJussi Kivilinna static void alg_test_descs_check_order(void) 36645714758bSJussi Kivilinna { 36655714758bSJussi Kivilinna int i; 36665714758bSJussi Kivilinna 36675714758bSJussi Kivilinna /* only check once */ 36685714758bSJussi Kivilinna if (alg_test_descs_checked) 36695714758bSJussi Kivilinna return; 36705714758bSJussi Kivilinna 36715714758bSJussi Kivilinna alg_test_descs_checked = true; 36725714758bSJussi Kivilinna 36735714758bSJussi Kivilinna for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) { 36745714758bSJussi Kivilinna int diff = strcmp(alg_test_descs[i - 1].alg, 36755714758bSJussi Kivilinna alg_test_descs[i].alg); 36765714758bSJussi Kivilinna 36775714758bSJussi Kivilinna if (WARN_ON(diff > 0)) { 36785714758bSJussi Kivilinna pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n", 36795714758bSJussi Kivilinna alg_test_descs[i - 1].alg, 36805714758bSJussi Kivilinna alg_test_descs[i].alg); 36815714758bSJussi Kivilinna } 36825714758bSJussi Kivilinna 36835714758bSJussi Kivilinna if (WARN_ON(diff == 0)) { 36845714758bSJussi Kivilinna pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n", 36855714758bSJussi Kivilinna alg_test_descs[i].alg); 36865714758bSJussi Kivilinna } 36875714758bSJussi Kivilinna } 36885714758bSJussi Kivilinna } 36895714758bSJussi Kivilinna 36901aa4ecd9SHerbert Xu static int alg_find_test(const char *alg) 3691da7f033dSHerbert Xu { 3692da7f033dSHerbert Xu int start = 0; 3693da7f033dSHerbert Xu int end = ARRAY_SIZE(alg_test_descs); 3694da7f033dSHerbert Xu 3695da7f033dSHerbert Xu while (start < end) { 3696da7f033dSHerbert Xu int i = (start + end) / 2; 3697da7f033dSHerbert Xu int diff = strcmp(alg_test_descs[i].alg, alg); 3698da7f033dSHerbert Xu 3699da7f033dSHerbert Xu if (diff > 0) { 3700da7f033dSHerbert Xu end = i; 3701da7f033dSHerbert Xu continue; 3702da7f033dSHerbert Xu } 3703da7f033dSHerbert Xu 3704da7f033dSHerbert Xu if (diff < 0) { 3705da7f033dSHerbert Xu start = i + 1; 3706da7f033dSHerbert Xu continue; 3707da7f033dSHerbert Xu } 3708da7f033dSHerbert Xu 37091aa4ecd9SHerbert Xu return i; 3710da7f033dSHerbert Xu } 3711da7f033dSHerbert Xu 37121aa4ecd9SHerbert Xu return -1; 37131aa4ecd9SHerbert Xu } 37141aa4ecd9SHerbert Xu 37151aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 37161aa4ecd9SHerbert Xu { 37171aa4ecd9SHerbert Xu int i; 3718a68f6610SHerbert Xu int j; 3719d12d6b6dSNeil Horman int rc; 37201aa4ecd9SHerbert Xu 37219e5c9fe4SRichard W.M. Jones if (!fips_enabled && notests) { 37229e5c9fe4SRichard W.M. Jones printk_once(KERN_INFO "alg: self-tests disabled\n"); 37239e5c9fe4SRichard W.M. Jones return 0; 37249e5c9fe4SRichard W.M. Jones } 37259e5c9fe4SRichard W.M. Jones 37265714758bSJussi Kivilinna alg_test_descs_check_order(); 37275714758bSJussi Kivilinna 37281aa4ecd9SHerbert Xu if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) { 37291aa4ecd9SHerbert Xu char nalg[CRYPTO_MAX_ALG_NAME]; 37301aa4ecd9SHerbert Xu 37311aa4ecd9SHerbert Xu if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >= 37321aa4ecd9SHerbert Xu sizeof(nalg)) 37331aa4ecd9SHerbert Xu return -ENAMETOOLONG; 37341aa4ecd9SHerbert Xu 37351aa4ecd9SHerbert Xu i = alg_find_test(nalg); 37361aa4ecd9SHerbert Xu if (i < 0) 37371aa4ecd9SHerbert Xu goto notest; 37381aa4ecd9SHerbert Xu 3739a3bef3a3SJarod Wilson if (fips_enabled && !alg_test_descs[i].fips_allowed) 3740a3bef3a3SJarod Wilson goto non_fips_alg; 3741a3bef3a3SJarod Wilson 3742941fb328SJarod Wilson rc = alg_test_cipher(alg_test_descs + i, driver, type, mask); 3743941fb328SJarod Wilson goto test_done; 37441aa4ecd9SHerbert Xu } 37451aa4ecd9SHerbert Xu 37461aa4ecd9SHerbert Xu i = alg_find_test(alg); 3747a68f6610SHerbert Xu j = alg_find_test(driver); 3748a68f6610SHerbert Xu if (i < 0 && j < 0) 37491aa4ecd9SHerbert Xu goto notest; 37501aa4ecd9SHerbert Xu 3751a68f6610SHerbert Xu if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) || 3752a68f6610SHerbert Xu (j >= 0 && !alg_test_descs[j].fips_allowed))) 3753a3bef3a3SJarod Wilson goto non_fips_alg; 3754a3bef3a3SJarod Wilson 3755a68f6610SHerbert Xu rc = 0; 3756a68f6610SHerbert Xu if (i >= 0) 3757a68f6610SHerbert Xu rc |= alg_test_descs[i].test(alg_test_descs + i, driver, 37581aa4ecd9SHerbert Xu type, mask); 3759032c8cacSCristian Stoica if (j >= 0 && j != i) 3760a68f6610SHerbert Xu rc |= alg_test_descs[j].test(alg_test_descs + j, driver, 3761a68f6610SHerbert Xu type, mask); 3762a68f6610SHerbert Xu 3763941fb328SJarod Wilson test_done: 3764d12d6b6dSNeil Horman if (fips_enabled && rc) 3765d12d6b6dSNeil Horman panic("%s: %s alg self test failed in fips mode!\n", driver, alg); 3766d12d6b6dSNeil Horman 376729ecd4abSJarod Wilson if (fips_enabled && !rc) 37683e8cffd4SMasanari Iida pr_info("alg: self-tests for %s (%s) passed\n", driver, alg); 376929ecd4abSJarod Wilson 3770d12d6b6dSNeil Horman return rc; 37711aa4ecd9SHerbert Xu 37721aa4ecd9SHerbert Xu notest: 3773da7f033dSHerbert Xu printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver); 3774da7f033dSHerbert Xu return 0; 3775a3bef3a3SJarod Wilson non_fips_alg: 3776a3bef3a3SJarod Wilson return -EINVAL; 3777da7f033dSHerbert Xu } 37780b767f96SAlexander Shishkin 3779326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */ 37800b767f96SAlexander Shishkin 3781da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test); 3782