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 180018ba95cSWang, Rui Y static int ahash_partial_update(struct ahash_request **preq, 181b13b1e0cSEric Biggers struct crypto_ahash *tfm, const struct hash_testvec *template, 182018ba95cSWang, Rui Y void *hash_buff, int k, int temp, struct scatterlist *sg, 1837f397136SGilad Ben-Yossef const char *algo, char *result, struct crypto_wait *wait) 184018ba95cSWang, Rui Y { 185018ba95cSWang, Rui Y char *state; 186018ba95cSWang, Rui Y struct ahash_request *req; 187018ba95cSWang, Rui Y int statesize, ret = -EINVAL; 1887bcb87bcSJan Stancek const char guard[] = { 0x00, 0xba, 0xad, 0x00 }; 189018ba95cSWang, Rui Y 190018ba95cSWang, Rui Y req = *preq; 191018ba95cSWang, Rui Y statesize = crypto_ahash_statesize( 192018ba95cSWang, Rui Y crypto_ahash_reqtfm(req)); 1937bcb87bcSJan Stancek state = kmalloc(statesize + sizeof(guard), GFP_KERNEL); 194018ba95cSWang, Rui Y if (!state) { 195cf3f9609SGilad Ben-Yossef pr_err("alg: hash: Failed to alloc state for %s\n", algo); 196018ba95cSWang, Rui Y goto out_nostate; 197018ba95cSWang, Rui Y } 1987bcb87bcSJan Stancek memcpy(state + statesize, guard, sizeof(guard)); 199018ba95cSWang, Rui Y ret = crypto_ahash_export(req, state); 2007bcb87bcSJan Stancek WARN_ON(memcmp(state + statesize, guard, sizeof(guard))); 201018ba95cSWang, Rui Y if (ret) { 202cf3f9609SGilad Ben-Yossef pr_err("alg: hash: Failed to export() for %s\n", algo); 203018ba95cSWang, Rui Y goto out; 204018ba95cSWang, Rui Y } 205018ba95cSWang, Rui Y ahash_request_free(req); 206018ba95cSWang, Rui Y req = ahash_request_alloc(tfm, GFP_KERNEL); 207018ba95cSWang, Rui Y if (!req) { 208018ba95cSWang, Rui Y pr_err("alg: hash: Failed to alloc request for %s\n", algo); 209018ba95cSWang, Rui Y goto out_noreq; 210018ba95cSWang, Rui Y } 211018ba95cSWang, Rui Y ahash_request_set_callback(req, 212018ba95cSWang, Rui Y CRYPTO_TFM_REQ_MAY_BACKLOG, 2137f397136SGilad Ben-Yossef crypto_req_done, wait); 214018ba95cSWang, Rui Y 215018ba95cSWang, Rui Y memcpy(hash_buff, template->plaintext + temp, 216018ba95cSWang, Rui Y template->tap[k]); 217018ba95cSWang, Rui Y sg_init_one(&sg[0], hash_buff, template->tap[k]); 218018ba95cSWang, Rui Y ahash_request_set_crypt(req, sg, result, template->tap[k]); 219018ba95cSWang, Rui Y ret = crypto_ahash_import(req, state); 220018ba95cSWang, Rui Y if (ret) { 221018ba95cSWang, Rui Y pr_err("alg: hash: Failed to import() for %s\n", algo); 222018ba95cSWang, Rui Y goto out; 223018ba95cSWang, Rui Y } 2247f397136SGilad Ben-Yossef ret = crypto_wait_req(crypto_ahash_update(req), wait); 225018ba95cSWang, Rui Y if (ret) 226018ba95cSWang, Rui Y goto out; 227018ba95cSWang, Rui Y *preq = req; 228018ba95cSWang, Rui Y ret = 0; 229018ba95cSWang, Rui Y goto out_noreq; 230018ba95cSWang, Rui Y out: 231018ba95cSWang, Rui Y ahash_request_free(req); 232018ba95cSWang, Rui Y out_noreq: 233018ba95cSWang, Rui Y kfree(state); 234018ba95cSWang, Rui Y out_nostate: 235018ba95cSWang, Rui Y return ret; 236018ba95cSWang, Rui Y } 237018ba95cSWang, Rui Y 238b13b1e0cSEric Biggers static int __test_hash(struct crypto_ahash *tfm, 239b13b1e0cSEric Biggers const struct hash_testvec *template, unsigned int tcount, 240b13b1e0cSEric Biggers bool use_digest, const int align_offset) 241da7f033dSHerbert Xu { 242da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm)); 243e93acd6fSAndrew Lutomirski size_t digest_size = crypto_ahash_digestsize(tfm); 244da7f033dSHerbert Xu unsigned int i, j, k, temp; 245da7f033dSHerbert Xu struct scatterlist sg[8]; 24629b77e5dSHoria Geanta char *result; 24729b77e5dSHoria Geanta char *key; 248da7f033dSHerbert Xu struct ahash_request *req; 2497f397136SGilad Ben-Yossef struct crypto_wait wait; 250da7f033dSHerbert Xu void *hash_buff; 251f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 252f8b0d4d0SHerbert Xu int ret = -ENOMEM; 253f8b0d4d0SHerbert Xu 254e93acd6fSAndrew Lutomirski result = kmalloc(digest_size, GFP_KERNEL); 25529b77e5dSHoria Geanta if (!result) 25629b77e5dSHoria Geanta return ret; 25729b77e5dSHoria Geanta key = kmalloc(MAX_KEYLEN, GFP_KERNEL); 25829b77e5dSHoria Geanta if (!key) 25929b77e5dSHoria Geanta goto out_nobuf; 260f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 261f8b0d4d0SHerbert Xu goto out_nobuf; 262da7f033dSHerbert Xu 2637f397136SGilad Ben-Yossef crypto_init_wait(&wait); 264da7f033dSHerbert Xu 265da7f033dSHerbert Xu req = ahash_request_alloc(tfm, GFP_KERNEL); 266da7f033dSHerbert Xu if (!req) { 267da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to allocate request for " 268da7f033dSHerbert Xu "%s\n", algo); 269da7f033dSHerbert Xu goto out_noreq; 270da7f033dSHerbert Xu } 271da7f033dSHerbert Xu ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 2727f397136SGilad Ben-Yossef crypto_req_done, &wait); 273da7f033dSHerbert Xu 274a0cfae59SHerbert Xu j = 0; 275da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 276a0cfae59SHerbert Xu if (template[i].np) 277a0cfae59SHerbert Xu continue; 278a0cfae59SHerbert Xu 279da5ffe11SJussi Kivilinna ret = -EINVAL; 280da5ffe11SJussi Kivilinna if (WARN_ON(align_offset + template[i].psize > PAGE_SIZE)) 281da5ffe11SJussi Kivilinna goto out; 282da5ffe11SJussi Kivilinna 283a0cfae59SHerbert Xu j++; 284e93acd6fSAndrew Lutomirski memset(result, 0, digest_size); 285da7f033dSHerbert Xu 286da7f033dSHerbert Xu hash_buff = xbuf[0]; 287da5ffe11SJussi Kivilinna hash_buff += align_offset; 288da7f033dSHerbert Xu 289da7f033dSHerbert Xu memcpy(hash_buff, template[i].plaintext, template[i].psize); 290da7f033dSHerbert Xu sg_init_one(&sg[0], hash_buff, template[i].psize); 291da7f033dSHerbert Xu 292da7f033dSHerbert Xu if (template[i].ksize) { 293da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 29429b77e5dSHoria Geanta if (template[i].ksize > MAX_KEYLEN) { 29529b77e5dSHoria Geanta pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n", 29629b77e5dSHoria Geanta j, algo, template[i].ksize, MAX_KEYLEN); 29729b77e5dSHoria Geanta ret = -EINVAL; 29829b77e5dSHoria Geanta goto out; 29929b77e5dSHoria Geanta } 30029b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].ksize); 30129b77e5dSHoria Geanta ret = crypto_ahash_setkey(tfm, key, template[i].ksize); 302da7f033dSHerbert Xu if (ret) { 303da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey failed on " 304a0cfae59SHerbert Xu "test %d for %s: ret=%d\n", j, algo, 305da7f033dSHerbert Xu -ret); 306da7f033dSHerbert Xu goto out; 307da7f033dSHerbert Xu } 308da7f033dSHerbert Xu } 309da7f033dSHerbert Xu 310da7f033dSHerbert Xu ahash_request_set_crypt(req, sg, result, template[i].psize); 311a8f1a052SDavid S. Miller if (use_digest) { 3127f397136SGilad Ben-Yossef ret = crypto_wait_req(crypto_ahash_digest(req), &wait); 313a8f1a052SDavid S. Miller if (ret) { 314a8f1a052SDavid S. Miller pr_err("alg: hash: digest failed on test %d " 315a0cfae59SHerbert Xu "for %s: ret=%d\n", j, algo, -ret); 316da7f033dSHerbert Xu goto out; 317da7f033dSHerbert Xu } 318a8f1a052SDavid S. Miller } else { 3197f397136SGilad Ben-Yossef ret = crypto_wait_req(crypto_ahash_init(req), &wait); 320a8f1a052SDavid S. Miller if (ret) { 321cf3f9609SGilad Ben-Yossef pr_err("alg: hash: init failed on test %d " 322a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 323a8f1a052SDavid S. Miller goto out; 324a8f1a052SDavid S. Miller } 3257f397136SGilad Ben-Yossef ret = crypto_wait_req(crypto_ahash_update(req), &wait); 326a8f1a052SDavid S. Miller if (ret) { 327cf3f9609SGilad Ben-Yossef pr_err("alg: hash: update failed on test %d " 328a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 329a8f1a052SDavid S. Miller goto out; 330a8f1a052SDavid S. Miller } 3317f397136SGilad Ben-Yossef ret = crypto_wait_req(crypto_ahash_final(req), &wait); 332a8f1a052SDavid S. Miller if (ret) { 333cf3f9609SGilad Ben-Yossef pr_err("alg: hash: final failed on test %d " 334a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 335a8f1a052SDavid S. Miller goto out; 336a8f1a052SDavid S. Miller } 337a8f1a052SDavid S. Miller } 338da7f033dSHerbert Xu 339da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 340da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 341da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Test %d failed for %s\n", 342a0cfae59SHerbert Xu j, algo); 343da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 344da7f033dSHerbert Xu ret = -EINVAL; 345da7f033dSHerbert Xu goto out; 346da7f033dSHerbert Xu } 347da7f033dSHerbert Xu } 348da7f033dSHerbert Xu 349da7f033dSHerbert Xu j = 0; 350da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 351da5ffe11SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 352da5ffe11SJussi Kivilinna if (align_offset != 0) 353da5ffe11SJussi Kivilinna break; 354da5ffe11SJussi Kivilinna 3555f2b424eSCristian Stoica if (!template[i].np) 3565f2b424eSCristian Stoica continue; 3575f2b424eSCristian Stoica 358da7f033dSHerbert Xu j++; 359e93acd6fSAndrew Lutomirski memset(result, 0, digest_size); 360da7f033dSHerbert Xu 361da7f033dSHerbert Xu temp = 0; 362da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 363fd57f22aSHerbert Xu ret = -EINVAL; 364da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 365fd57f22aSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 366fd57f22aSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 367fd57f22aSHerbert Xu goto out; 368da7f033dSHerbert Xu sg_set_buf(&sg[k], 369da7f033dSHerbert Xu memcpy(xbuf[IDX[k] >> PAGE_SHIFT] + 370da7f033dSHerbert Xu offset_in_page(IDX[k]), 371da7f033dSHerbert Xu template[i].plaintext + temp, 372da7f033dSHerbert Xu template[i].tap[k]), 373da7f033dSHerbert Xu template[i].tap[k]); 374da7f033dSHerbert Xu temp += template[i].tap[k]; 375da7f033dSHerbert Xu } 376da7f033dSHerbert Xu 377da7f033dSHerbert Xu if (template[i].ksize) { 37829b77e5dSHoria Geanta if (template[i].ksize > MAX_KEYLEN) { 37929b77e5dSHoria Geanta pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n", 3805f2b424eSCristian Stoica j, algo, template[i].ksize, MAX_KEYLEN); 38129b77e5dSHoria Geanta ret = -EINVAL; 38229b77e5dSHoria Geanta goto out; 38329b77e5dSHoria Geanta } 384da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 38529b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].ksize); 3865f2b424eSCristian Stoica ret = crypto_ahash_setkey(tfm, key, template[i].ksize); 387da7f033dSHerbert Xu 388da7f033dSHerbert Xu if (ret) { 389da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey " 390da7f033dSHerbert Xu "failed on chunking test %d " 3915f2b424eSCristian Stoica "for %s: ret=%d\n", j, algo, -ret); 392da7f033dSHerbert Xu goto out; 393da7f033dSHerbert Xu } 394da7f033dSHerbert Xu } 395da7f033dSHerbert Xu 3965f2b424eSCristian Stoica ahash_request_set_crypt(req, sg, result, template[i].psize); 3977f397136SGilad Ben-Yossef ret = crypto_wait_req(crypto_ahash_digest(req), &wait); 3987f397136SGilad Ben-Yossef if (ret) { 3997f397136SGilad Ben-Yossef pr_err("alg: hash: digest failed on chunking test %d for %s: ret=%d\n", 4007f397136SGilad Ben-Yossef j, algo, -ret); 401da7f033dSHerbert Xu goto out; 402da7f033dSHerbert Xu } 403da7f033dSHerbert Xu 404da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 405da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 406da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Chunking test %d " 407da7f033dSHerbert Xu "failed for %s\n", j, algo); 408da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 409da7f033dSHerbert Xu ret = -EINVAL; 410da7f033dSHerbert Xu goto out; 411da7f033dSHerbert Xu } 412da7f033dSHerbert Xu } 413da7f033dSHerbert Xu 414018ba95cSWang, Rui Y /* partial update exercise */ 415018ba95cSWang, Rui Y j = 0; 416018ba95cSWang, Rui Y for (i = 0; i < tcount; i++) { 417018ba95cSWang, Rui Y /* alignment tests are only done with continuous buffers */ 418018ba95cSWang, Rui Y if (align_offset != 0) 419018ba95cSWang, Rui Y break; 420018ba95cSWang, Rui Y 421018ba95cSWang, Rui Y if (template[i].np < 2) 422018ba95cSWang, Rui Y continue; 423018ba95cSWang, Rui Y 424018ba95cSWang, Rui Y j++; 425e93acd6fSAndrew Lutomirski memset(result, 0, digest_size); 426018ba95cSWang, Rui Y 427018ba95cSWang, Rui Y ret = -EINVAL; 428018ba95cSWang, Rui Y hash_buff = xbuf[0]; 429018ba95cSWang, Rui Y memcpy(hash_buff, template[i].plaintext, 430018ba95cSWang, Rui Y template[i].tap[0]); 431018ba95cSWang, Rui Y sg_init_one(&sg[0], hash_buff, template[i].tap[0]); 432018ba95cSWang, Rui Y 433018ba95cSWang, Rui Y if (template[i].ksize) { 434018ba95cSWang, Rui Y crypto_ahash_clear_flags(tfm, ~0); 435018ba95cSWang, Rui Y if (template[i].ksize > MAX_KEYLEN) { 436018ba95cSWang, Rui Y pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n", 437018ba95cSWang, Rui Y j, algo, template[i].ksize, MAX_KEYLEN); 438018ba95cSWang, Rui Y ret = -EINVAL; 439018ba95cSWang, Rui Y goto out; 440018ba95cSWang, Rui Y } 441018ba95cSWang, Rui Y memcpy(key, template[i].key, template[i].ksize); 442018ba95cSWang, Rui Y ret = crypto_ahash_setkey(tfm, key, template[i].ksize); 443018ba95cSWang, Rui Y if (ret) { 444018ba95cSWang, Rui Y pr_err("alg: hash: setkey failed on test %d for %s: ret=%d\n", 445018ba95cSWang, Rui Y j, algo, -ret); 446018ba95cSWang, Rui Y goto out; 447018ba95cSWang, Rui Y } 448018ba95cSWang, Rui Y } 449018ba95cSWang, Rui Y 450018ba95cSWang, Rui Y ahash_request_set_crypt(req, sg, result, template[i].tap[0]); 4517f397136SGilad Ben-Yossef ret = crypto_wait_req(crypto_ahash_init(req), &wait); 452018ba95cSWang, Rui Y if (ret) { 453cf3f9609SGilad Ben-Yossef pr_err("alg: hash: init failed on test %d for %s: ret=%d\n", 454018ba95cSWang, Rui Y j, algo, -ret); 455018ba95cSWang, Rui Y goto out; 456018ba95cSWang, Rui Y } 4577f397136SGilad Ben-Yossef ret = crypto_wait_req(crypto_ahash_update(req), &wait); 458018ba95cSWang, Rui Y if (ret) { 459cf3f9609SGilad Ben-Yossef pr_err("alg: hash: update failed on test %d for %s: ret=%d\n", 460018ba95cSWang, Rui Y j, algo, -ret); 461018ba95cSWang, Rui Y goto out; 462018ba95cSWang, Rui Y } 463018ba95cSWang, Rui Y 464018ba95cSWang, Rui Y temp = template[i].tap[0]; 465018ba95cSWang, Rui Y for (k = 1; k < template[i].np; k++) { 466018ba95cSWang, Rui Y ret = ahash_partial_update(&req, tfm, &template[i], 467018ba95cSWang, Rui Y hash_buff, k, temp, &sg[0], algo, result, 4687f397136SGilad Ben-Yossef &wait); 469018ba95cSWang, Rui Y if (ret) { 470cf3f9609SGilad Ben-Yossef pr_err("alg: hash: partial update failed on test %d for %s: ret=%d\n", 471018ba95cSWang, Rui Y j, algo, -ret); 472018ba95cSWang, Rui Y goto out_noreq; 473018ba95cSWang, Rui Y } 474018ba95cSWang, Rui Y temp += template[i].tap[k]; 475018ba95cSWang, Rui Y } 4767f397136SGilad Ben-Yossef ret = crypto_wait_req(crypto_ahash_final(req), &wait); 477018ba95cSWang, Rui Y if (ret) { 478cf3f9609SGilad Ben-Yossef pr_err("alg: hash: final failed on test %d for %s: ret=%d\n", 479018ba95cSWang, Rui Y j, algo, -ret); 480018ba95cSWang, Rui Y goto out; 481018ba95cSWang, Rui Y } 482018ba95cSWang, Rui Y if (memcmp(result, template[i].digest, 483018ba95cSWang, Rui Y crypto_ahash_digestsize(tfm))) { 484018ba95cSWang, Rui Y pr_err("alg: hash: Partial Test %d failed for %s\n", 485018ba95cSWang, Rui Y j, algo); 486018ba95cSWang, Rui Y hexdump(result, crypto_ahash_digestsize(tfm)); 487018ba95cSWang, Rui Y ret = -EINVAL; 488018ba95cSWang, Rui Y goto out; 489018ba95cSWang, Rui Y } 490018ba95cSWang, Rui Y } 491018ba95cSWang, Rui Y 492da7f033dSHerbert Xu ret = 0; 493da7f033dSHerbert Xu 494da7f033dSHerbert Xu out: 495da7f033dSHerbert Xu ahash_request_free(req); 496da7f033dSHerbert Xu out_noreq: 497f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 498f8b0d4d0SHerbert Xu out_nobuf: 49929b77e5dSHoria Geanta kfree(key); 50029b77e5dSHoria Geanta kfree(result); 501da7f033dSHerbert Xu return ret; 502da7f033dSHerbert Xu } 503da7f033dSHerbert Xu 504b13b1e0cSEric Biggers static int test_hash(struct crypto_ahash *tfm, 505b13b1e0cSEric Biggers const struct hash_testvec *template, 506da5ffe11SJussi Kivilinna unsigned int tcount, bool use_digest) 507da5ffe11SJussi Kivilinna { 508da5ffe11SJussi Kivilinna unsigned int alignmask; 509da5ffe11SJussi Kivilinna int ret; 510da5ffe11SJussi Kivilinna 511da5ffe11SJussi Kivilinna ret = __test_hash(tfm, template, tcount, use_digest, 0); 512da5ffe11SJussi Kivilinna if (ret) 513da5ffe11SJussi Kivilinna return ret; 514da5ffe11SJussi Kivilinna 515da5ffe11SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 516da5ffe11SJussi Kivilinna ret = __test_hash(tfm, template, tcount, use_digest, 1); 517da5ffe11SJussi Kivilinna if (ret) 518da5ffe11SJussi Kivilinna return ret; 519da5ffe11SJussi Kivilinna 520da5ffe11SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 521da5ffe11SJussi Kivilinna if (alignmask) { 522da5ffe11SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 523da5ffe11SJussi Kivilinna ret = __test_hash(tfm, template, tcount, use_digest, 524da5ffe11SJussi Kivilinna alignmask + 1); 525da5ffe11SJussi Kivilinna if (ret) 526da5ffe11SJussi Kivilinna return ret; 527da5ffe11SJussi Kivilinna } 528da5ffe11SJussi Kivilinna 529da5ffe11SJussi Kivilinna return 0; 530da5ffe11SJussi Kivilinna } 531da5ffe11SJussi Kivilinna 532d8a32ac2SJussi Kivilinna static int __test_aead(struct crypto_aead *tfm, int enc, 533b13b1e0cSEric Biggers const struct aead_testvec *template, unsigned int tcount, 53458dcf548SJussi Kivilinna const bool diff_dst, const int align_offset) 535da7f033dSHerbert Xu { 536da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)); 537da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 538f8b0d4d0SHerbert Xu int ret = -ENOMEM; 539da7f033dSHerbert Xu char *q; 540da7f033dSHerbert Xu char *key; 541da7f033dSHerbert Xu struct aead_request *req; 542d8a32ac2SJussi Kivilinna struct scatterlist *sg; 543d8a32ac2SJussi Kivilinna struct scatterlist *sgout; 544d8a32ac2SJussi Kivilinna const char *e, *d; 5457f397136SGilad Ben-Yossef struct crypto_wait wait; 546424a5da6SCristian Stoica unsigned int authsize, iv_len; 547da7f033dSHerbert Xu void *input; 548d8a32ac2SJussi Kivilinna void *output; 549da7f033dSHerbert Xu void *assoc; 5509bac019dSTadeusz Struk char *iv; 551f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 552d8a32ac2SJussi Kivilinna char *xoutbuf[XBUFSIZE]; 553f8b0d4d0SHerbert Xu char *axbuf[XBUFSIZE]; 554f8b0d4d0SHerbert Xu 5559bac019dSTadeusz Struk iv = kzalloc(MAX_IVLEN, GFP_KERNEL); 5569bac019dSTadeusz Struk if (!iv) 5579bac019dSTadeusz Struk return ret; 55829b77e5dSHoria Geanta key = kmalloc(MAX_KEYLEN, GFP_KERNEL); 55929b77e5dSHoria Geanta if (!key) 56029b77e5dSHoria Geanta goto out_noxbuf; 561f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 562f8b0d4d0SHerbert Xu goto out_noxbuf; 563f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(axbuf)) 564f8b0d4d0SHerbert Xu goto out_noaxbuf; 565d8a32ac2SJussi Kivilinna if (diff_dst && testmgr_alloc_buf(xoutbuf)) 566d8a32ac2SJussi Kivilinna goto out_nooutbuf; 567d8a32ac2SJussi Kivilinna 568d8a32ac2SJussi Kivilinna /* avoid "the frame size is larger than 1024 bytes" compiler warning */ 5698a525fcdSHerbert Xu sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 4 : 2), GFP_KERNEL); 570d8a32ac2SJussi Kivilinna if (!sg) 571d8a32ac2SJussi Kivilinna goto out_nosg; 5728a525fcdSHerbert Xu sgout = &sg[16]; 573d8a32ac2SJussi Kivilinna 574d8a32ac2SJussi Kivilinna if (diff_dst) 575d8a32ac2SJussi Kivilinna d = "-ddst"; 576d8a32ac2SJussi Kivilinna else 577d8a32ac2SJussi Kivilinna d = ""; 578d8a32ac2SJussi Kivilinna 579da7f033dSHerbert Xu if (enc == ENCRYPT) 580da7f033dSHerbert Xu e = "encryption"; 581da7f033dSHerbert Xu else 582da7f033dSHerbert Xu e = "decryption"; 583da7f033dSHerbert Xu 5847f397136SGilad Ben-Yossef crypto_init_wait(&wait); 585da7f033dSHerbert Xu 586da7f033dSHerbert Xu req = aead_request_alloc(tfm, GFP_KERNEL); 587da7f033dSHerbert Xu if (!req) { 588d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to allocate request for %s\n", 589d8a32ac2SJussi Kivilinna d, algo); 590da7f033dSHerbert Xu goto out; 591da7f033dSHerbert Xu } 592da7f033dSHerbert Xu 593da7f033dSHerbert Xu aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 5947f397136SGilad Ben-Yossef crypto_req_done, &wait); 595da7f033dSHerbert Xu 596abfa7f43SJerome Marchand iv_len = crypto_aead_ivsize(tfm); 597abfa7f43SJerome Marchand 598da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 59905b1d338SCristian Stoica if (template[i].np) 60005b1d338SCristian Stoica continue; 60105b1d338SCristian Stoica 602da7f033dSHerbert Xu j++; 603da7f033dSHerbert Xu 60458dcf548SJussi Kivilinna /* some templates have no input data but they will 605da7f033dSHerbert Xu * touch input 606da7f033dSHerbert Xu */ 607da7f033dSHerbert Xu input = xbuf[0]; 60858dcf548SJussi Kivilinna input += align_offset; 609da7f033dSHerbert Xu assoc = axbuf[0]; 610da7f033dSHerbert Xu 611fd57f22aSHerbert Xu ret = -EINVAL; 61258dcf548SJussi Kivilinna if (WARN_ON(align_offset + template[i].ilen > 61358dcf548SJussi Kivilinna PAGE_SIZE || template[i].alen > PAGE_SIZE)) 614fd57f22aSHerbert Xu goto out; 615fd57f22aSHerbert Xu 616da7f033dSHerbert Xu memcpy(input, template[i].input, template[i].ilen); 617da7f033dSHerbert Xu memcpy(assoc, template[i].assoc, template[i].alen); 618da7f033dSHerbert Xu if (template[i].iv) 619424a5da6SCristian Stoica memcpy(iv, template[i].iv, iv_len); 620da7f033dSHerbert Xu else 621424a5da6SCristian Stoica memset(iv, 0, iv_len); 622da7f033dSHerbert Xu 623da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 624da7f033dSHerbert Xu if (template[i].wk) 62505b1d338SCristian Stoica crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 626da7f033dSHerbert Xu 62729b77e5dSHoria Geanta if (template[i].klen > MAX_KEYLEN) { 62829b77e5dSHoria Geanta pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n", 62929b77e5dSHoria Geanta d, j, algo, template[i].klen, 63029b77e5dSHoria Geanta MAX_KEYLEN); 63129b77e5dSHoria Geanta ret = -EINVAL; 63229b77e5dSHoria Geanta goto out; 63329b77e5dSHoria Geanta } 63429b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].klen); 635da7f033dSHerbert Xu 63605b1d338SCristian Stoica ret = crypto_aead_setkey(tfm, key, template[i].klen); 6370fae0c1eSYanjiang Jin if (template[i].fail == !ret) { 638d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n", 639d8a32ac2SJussi Kivilinna d, j, algo, crypto_aead_get_flags(tfm)); 640da7f033dSHerbert Xu goto out; 641da7f033dSHerbert Xu } else if (ret) 642da7f033dSHerbert Xu continue; 643da7f033dSHerbert Xu 644da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 645da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 646da7f033dSHerbert Xu if (ret) { 647d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n", 648d8a32ac2SJussi Kivilinna d, authsize, j, algo); 649da7f033dSHerbert Xu goto out; 650da7f033dSHerbert Xu } 651da7f033dSHerbert Xu 6528a525fcdSHerbert Xu k = !!template[i].alen; 6538a525fcdSHerbert Xu sg_init_table(sg, k + 1); 6548a525fcdSHerbert Xu sg_set_buf(&sg[0], assoc, template[i].alen); 6558a525fcdSHerbert Xu sg_set_buf(&sg[k], input, 65605b1d338SCristian Stoica template[i].ilen + (enc ? authsize : 0)); 657d8a32ac2SJussi Kivilinna output = input; 658d8a32ac2SJussi Kivilinna 6598a525fcdSHerbert Xu if (diff_dst) { 6608a525fcdSHerbert Xu sg_init_table(sgout, k + 1); 6618a525fcdSHerbert Xu sg_set_buf(&sgout[0], assoc, template[i].alen); 6628a525fcdSHerbert Xu 6638a525fcdSHerbert Xu output = xoutbuf[0]; 6648a525fcdSHerbert Xu output += align_offset; 6658a525fcdSHerbert Xu sg_set_buf(&sgout[k], output, 6668a525fcdSHerbert Xu template[i].rlen + (enc ? 0 : authsize)); 6678a525fcdSHerbert Xu } 668da7f033dSHerbert Xu 669d8a32ac2SJussi Kivilinna aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 670da7f033dSHerbert Xu template[i].ilen, iv); 671da7f033dSHerbert Xu 6728a525fcdSHerbert Xu aead_request_set_ad(req, template[i].alen); 673da7f033dSHerbert Xu 6747f397136SGilad Ben-Yossef ret = crypto_wait_req(enc ? crypto_aead_encrypt(req) 6757f397136SGilad Ben-Yossef : crypto_aead_decrypt(req), &wait); 676da7f033dSHerbert Xu 677da7f033dSHerbert Xu switch (ret) { 678da7f033dSHerbert Xu case 0: 679e44a1b44SJarod Wilson if (template[i].novrfy) { 680e44a1b44SJarod Wilson /* verification was supposed to fail */ 681d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n", 682d8a32ac2SJussi Kivilinna d, e, j, algo); 683e44a1b44SJarod Wilson /* so really, we got a bad message */ 684e44a1b44SJarod Wilson ret = -EBADMSG; 685e44a1b44SJarod Wilson goto out; 686e44a1b44SJarod Wilson } 687da7f033dSHerbert Xu break; 688e44a1b44SJarod Wilson case -EBADMSG: 689e44a1b44SJarod Wilson if (template[i].novrfy) 690e44a1b44SJarod Wilson /* verification failure was expected */ 691e44a1b44SJarod Wilson continue; 692da7f033dSHerbert Xu /* fall through */ 693da7f033dSHerbert Xu default: 694d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n", 695d8a32ac2SJussi Kivilinna d, e, j, algo, -ret); 696da7f033dSHerbert Xu goto out; 697da7f033dSHerbert Xu } 698da7f033dSHerbert Xu 699d8a32ac2SJussi Kivilinna q = output; 700da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 701d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Test %d failed on %s for %s\n", 702d8a32ac2SJussi Kivilinna d, j, e, algo); 703da7f033dSHerbert Xu hexdump(q, template[i].rlen); 704da7f033dSHerbert Xu ret = -EINVAL; 705da7f033dSHerbert Xu goto out; 706da7f033dSHerbert Xu } 707da7f033dSHerbert Xu } 708da7f033dSHerbert Xu 709da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 71058dcf548SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 71158dcf548SJussi Kivilinna if (align_offset != 0) 71258dcf548SJussi Kivilinna break; 71358dcf548SJussi Kivilinna 71405b1d338SCristian Stoica if (!template[i].np) 71505b1d338SCristian Stoica continue; 71605b1d338SCristian Stoica 717da7f033dSHerbert Xu j++; 718da7f033dSHerbert Xu 719da7f033dSHerbert Xu if (template[i].iv) 720abfa7f43SJerome Marchand memcpy(iv, template[i].iv, iv_len); 721da7f033dSHerbert Xu else 722da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 723da7f033dSHerbert Xu 724da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 725da7f033dSHerbert Xu if (template[i].wk) 72605b1d338SCristian Stoica crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 72729b77e5dSHoria Geanta if (template[i].klen > MAX_KEYLEN) { 72829b77e5dSHoria Geanta pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n", 72905b1d338SCristian Stoica d, j, algo, template[i].klen, MAX_KEYLEN); 73029b77e5dSHoria Geanta ret = -EINVAL; 73129b77e5dSHoria Geanta goto out; 73229b77e5dSHoria Geanta } 73329b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].klen); 734da7f033dSHerbert Xu 735da7f033dSHerbert Xu ret = crypto_aead_setkey(tfm, key, template[i].klen); 7360fae0c1eSYanjiang Jin if (template[i].fail == !ret) { 737d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n", 738d8a32ac2SJussi Kivilinna d, j, algo, crypto_aead_get_flags(tfm)); 739da7f033dSHerbert Xu goto out; 740da7f033dSHerbert Xu } else if (ret) 741da7f033dSHerbert Xu continue; 742da7f033dSHerbert Xu 743da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 744da7f033dSHerbert Xu 745da7f033dSHerbert Xu ret = -EINVAL; 7468a525fcdSHerbert Xu sg_init_table(sg, template[i].anp + template[i].np); 747d8a32ac2SJussi Kivilinna if (diff_dst) 7488a525fcdSHerbert Xu sg_init_table(sgout, template[i].anp + template[i].np); 7498a525fcdSHerbert Xu 7508a525fcdSHerbert Xu ret = -EINVAL; 7518a525fcdSHerbert Xu for (k = 0, temp = 0; k < template[i].anp; k++) { 7528a525fcdSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 7538a525fcdSHerbert Xu template[i].atap[k] > PAGE_SIZE)) 7548a525fcdSHerbert Xu goto out; 7558a525fcdSHerbert Xu sg_set_buf(&sg[k], 7568a525fcdSHerbert Xu memcpy(axbuf[IDX[k] >> PAGE_SHIFT] + 7578a525fcdSHerbert Xu offset_in_page(IDX[k]), 7588a525fcdSHerbert Xu template[i].assoc + temp, 7598a525fcdSHerbert Xu template[i].atap[k]), 7608a525fcdSHerbert Xu template[i].atap[k]); 7618a525fcdSHerbert Xu if (diff_dst) 7628a525fcdSHerbert Xu sg_set_buf(&sgout[k], 7638a525fcdSHerbert Xu axbuf[IDX[k] >> PAGE_SHIFT] + 7648a525fcdSHerbert Xu offset_in_page(IDX[k]), 7658a525fcdSHerbert Xu template[i].atap[k]); 7668a525fcdSHerbert Xu temp += template[i].atap[k]; 7678a525fcdSHerbert Xu } 7688a525fcdSHerbert Xu 769da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 770da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 771da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 772da7f033dSHerbert Xu goto out; 773da7f033dSHerbert Xu 77405b1d338SCristian Stoica q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]); 77505b1d338SCristian Stoica memcpy(q, template[i].input + temp, template[i].tap[k]); 7768a525fcdSHerbert Xu sg_set_buf(&sg[template[i].anp + k], 7778a525fcdSHerbert Xu q, template[i].tap[k]); 778d8a32ac2SJussi Kivilinna 779d8a32ac2SJussi Kivilinna if (diff_dst) { 780d8a32ac2SJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 781d8a32ac2SJussi Kivilinna offset_in_page(IDX[k]); 782d8a32ac2SJussi Kivilinna 783d8a32ac2SJussi Kivilinna memset(q, 0, template[i].tap[k]); 784d8a32ac2SJussi Kivilinna 7858a525fcdSHerbert Xu sg_set_buf(&sgout[template[i].anp + k], 7868a525fcdSHerbert Xu q, template[i].tap[k]); 787d8a32ac2SJussi Kivilinna } 788d8a32ac2SJussi Kivilinna 7898ec25c51SHoria Geanta n = template[i].tap[k]; 7908ec25c51SHoria Geanta if (k == template[i].np - 1 && enc) 7918ec25c51SHoria Geanta n += authsize; 7928ec25c51SHoria Geanta if (offset_in_page(q) + n < PAGE_SIZE) 7938ec25c51SHoria Geanta q[n] = 0; 7948ec25c51SHoria Geanta 795da7f033dSHerbert Xu temp += template[i].tap[k]; 796da7f033dSHerbert Xu } 797da7f033dSHerbert Xu 798da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 799da7f033dSHerbert Xu if (ret) { 800d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n", 801d8a32ac2SJussi Kivilinna d, authsize, j, algo); 802da7f033dSHerbert Xu goto out; 803da7f033dSHerbert Xu } 804da7f033dSHerbert Xu 805da7f033dSHerbert Xu if (enc) { 8068a525fcdSHerbert Xu if (WARN_ON(sg[template[i].anp + k - 1].offset + 8078a525fcdSHerbert Xu sg[template[i].anp + k - 1].length + 8088a525fcdSHerbert Xu authsize > PAGE_SIZE)) { 809da7f033dSHerbert Xu ret = -EINVAL; 810da7f033dSHerbert Xu goto out; 811da7f033dSHerbert Xu } 812da7f033dSHerbert Xu 813d8a32ac2SJussi Kivilinna if (diff_dst) 8148a525fcdSHerbert Xu sgout[template[i].anp + k - 1].length += 8158a525fcdSHerbert Xu authsize; 8168a525fcdSHerbert Xu sg[template[i].anp + k - 1].length += authsize; 817da7f033dSHerbert Xu } 818da7f033dSHerbert Xu 819d8a32ac2SJussi Kivilinna aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 820da7f033dSHerbert Xu template[i].ilen, 821da7f033dSHerbert Xu iv); 822da7f033dSHerbert Xu 8238a525fcdSHerbert Xu aead_request_set_ad(req, template[i].alen); 824da7f033dSHerbert Xu 8257f397136SGilad Ben-Yossef ret = crypto_wait_req(enc ? crypto_aead_encrypt(req) 8267f397136SGilad Ben-Yossef : crypto_aead_decrypt(req), &wait); 827da7f033dSHerbert Xu 828da7f033dSHerbert Xu switch (ret) { 829da7f033dSHerbert Xu case 0: 830e44a1b44SJarod Wilson if (template[i].novrfy) { 831e44a1b44SJarod Wilson /* verification was supposed to fail */ 832d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n", 833d8a32ac2SJussi Kivilinna d, e, j, algo); 834e44a1b44SJarod Wilson /* so really, we got a bad message */ 835e44a1b44SJarod Wilson ret = -EBADMSG; 836e44a1b44SJarod Wilson goto out; 837e44a1b44SJarod Wilson } 838da7f033dSHerbert Xu break; 839e44a1b44SJarod Wilson case -EBADMSG: 840e44a1b44SJarod Wilson if (template[i].novrfy) 841e44a1b44SJarod Wilson /* verification failure was expected */ 842e44a1b44SJarod Wilson continue; 843da7f033dSHerbert Xu /* fall through */ 844da7f033dSHerbert Xu default: 845d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n", 846d8a32ac2SJussi Kivilinna d, e, j, algo, -ret); 847da7f033dSHerbert Xu goto out; 848da7f033dSHerbert Xu } 849da7f033dSHerbert Xu 850da7f033dSHerbert Xu ret = -EINVAL; 851da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 852d8a32ac2SJussi Kivilinna if (diff_dst) 853d8a32ac2SJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 854d8a32ac2SJussi Kivilinna offset_in_page(IDX[k]); 855d8a32ac2SJussi Kivilinna else 856da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 857da7f033dSHerbert Xu offset_in_page(IDX[k]); 858da7f033dSHerbert Xu 859da7f033dSHerbert Xu n = template[i].tap[k]; 860da7f033dSHerbert Xu if (k == template[i].np - 1) 861da7f033dSHerbert Xu n += enc ? authsize : -authsize; 862da7f033dSHerbert Xu 863da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, n)) { 864d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n", 865d8a32ac2SJussi Kivilinna d, j, e, k, algo); 866da7f033dSHerbert Xu hexdump(q, n); 867da7f033dSHerbert Xu goto out; 868da7f033dSHerbert Xu } 869da7f033dSHerbert Xu 870da7f033dSHerbert Xu q += n; 871da7f033dSHerbert Xu if (k == template[i].np - 1 && !enc) { 872d8a32ac2SJussi Kivilinna if (!diff_dst && 873d8a32ac2SJussi Kivilinna memcmp(q, template[i].input + 874da7f033dSHerbert Xu temp + n, authsize)) 875da7f033dSHerbert Xu n = authsize; 876da7f033dSHerbert Xu else 877da7f033dSHerbert Xu n = 0; 878da7f033dSHerbert Xu } else { 87905b1d338SCristian Stoica for (n = 0; offset_in_page(q + n) && q[n]; n++) 880da7f033dSHerbert Xu ; 881da7f033dSHerbert Xu } 882da7f033dSHerbert Xu if (n) { 883d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n", 884d8a32ac2SJussi Kivilinna d, j, e, k, algo, n); 885da7f033dSHerbert Xu hexdump(q, n); 886da7f033dSHerbert Xu goto out; 887da7f033dSHerbert Xu } 888da7f033dSHerbert Xu 889da7f033dSHerbert Xu temp += template[i].tap[k]; 890da7f033dSHerbert Xu } 891da7f033dSHerbert Xu } 892da7f033dSHerbert Xu 893da7f033dSHerbert Xu ret = 0; 894da7f033dSHerbert Xu 895da7f033dSHerbert Xu out: 896da7f033dSHerbert Xu aead_request_free(req); 897d8a32ac2SJussi Kivilinna kfree(sg); 898d8a32ac2SJussi Kivilinna out_nosg: 899d8a32ac2SJussi Kivilinna if (diff_dst) 900d8a32ac2SJussi Kivilinna testmgr_free_buf(xoutbuf); 901d8a32ac2SJussi Kivilinna out_nooutbuf: 902f8b0d4d0SHerbert Xu testmgr_free_buf(axbuf); 903f8b0d4d0SHerbert Xu out_noaxbuf: 904f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 905f8b0d4d0SHerbert Xu out_noxbuf: 90629b77e5dSHoria Geanta kfree(key); 9079bac019dSTadeusz Struk kfree(iv); 908da7f033dSHerbert Xu return ret; 909da7f033dSHerbert Xu } 910da7f033dSHerbert Xu 911d8a32ac2SJussi Kivilinna static int test_aead(struct crypto_aead *tfm, int enc, 912b13b1e0cSEric Biggers const struct aead_testvec *template, unsigned int tcount) 913d8a32ac2SJussi Kivilinna { 91458dcf548SJussi Kivilinna unsigned int alignmask; 915d8a32ac2SJussi Kivilinna int ret; 916d8a32ac2SJussi Kivilinna 917d8a32ac2SJussi Kivilinna /* test 'dst == src' case */ 91858dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, false, 0); 919d8a32ac2SJussi Kivilinna if (ret) 920d8a32ac2SJussi Kivilinna return ret; 921d8a32ac2SJussi Kivilinna 922d8a32ac2SJussi Kivilinna /* test 'dst != src' case */ 92358dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 0); 92458dcf548SJussi Kivilinna if (ret) 92558dcf548SJussi Kivilinna return ret; 92658dcf548SJussi Kivilinna 92758dcf548SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 92858dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 1); 92958dcf548SJussi Kivilinna if (ret) 93058dcf548SJussi Kivilinna return ret; 93158dcf548SJussi Kivilinna 93258dcf548SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 93358dcf548SJussi Kivilinna if (alignmask) { 93458dcf548SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 93558dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 93658dcf548SJussi Kivilinna alignmask + 1); 93758dcf548SJussi Kivilinna if (ret) 93858dcf548SJussi Kivilinna return ret; 93958dcf548SJussi Kivilinna } 94058dcf548SJussi Kivilinna 94158dcf548SJussi Kivilinna return 0; 942d8a32ac2SJussi Kivilinna } 943d8a32ac2SJussi Kivilinna 9441aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc, 945b13b1e0cSEric Biggers const struct cipher_testvec *template, 946b13b1e0cSEric Biggers unsigned int tcount) 9471aa4ecd9SHerbert Xu { 9481aa4ecd9SHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm)); 9491aa4ecd9SHerbert Xu unsigned int i, j, k; 9501aa4ecd9SHerbert Xu char *q; 9511aa4ecd9SHerbert Xu const char *e; 9521aa4ecd9SHerbert Xu void *data; 953f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 954f8b0d4d0SHerbert Xu int ret = -ENOMEM; 955f8b0d4d0SHerbert Xu 956f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 957f8b0d4d0SHerbert Xu goto out_nobuf; 9581aa4ecd9SHerbert Xu 9591aa4ecd9SHerbert Xu if (enc == ENCRYPT) 9601aa4ecd9SHerbert Xu e = "encryption"; 9611aa4ecd9SHerbert Xu else 9621aa4ecd9SHerbert Xu e = "decryption"; 9631aa4ecd9SHerbert Xu 9641aa4ecd9SHerbert Xu j = 0; 9651aa4ecd9SHerbert Xu for (i = 0; i < tcount; i++) { 9661aa4ecd9SHerbert Xu if (template[i].np) 9671aa4ecd9SHerbert Xu continue; 9681aa4ecd9SHerbert Xu 96910faa8c0SStephan Mueller if (fips_enabled && template[i].fips_skip) 97010faa8c0SStephan Mueller continue; 97110faa8c0SStephan Mueller 9721aa4ecd9SHerbert Xu j++; 9731aa4ecd9SHerbert Xu 974fd57f22aSHerbert Xu ret = -EINVAL; 975fd57f22aSHerbert Xu if (WARN_ON(template[i].ilen > PAGE_SIZE)) 976fd57f22aSHerbert Xu goto out; 977fd57f22aSHerbert Xu 9781aa4ecd9SHerbert Xu data = xbuf[0]; 9791aa4ecd9SHerbert Xu memcpy(data, template[i].input, template[i].ilen); 9801aa4ecd9SHerbert Xu 9811aa4ecd9SHerbert Xu crypto_cipher_clear_flags(tfm, ~0); 9821aa4ecd9SHerbert Xu if (template[i].wk) 9831aa4ecd9SHerbert Xu crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 9841aa4ecd9SHerbert Xu 9851aa4ecd9SHerbert Xu ret = crypto_cipher_setkey(tfm, template[i].key, 9861aa4ecd9SHerbert Xu template[i].klen); 9870fae0c1eSYanjiang Jin if (template[i].fail == !ret) { 9881aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: setkey failed " 9891aa4ecd9SHerbert Xu "on test %d for %s: flags=%x\n", j, 9901aa4ecd9SHerbert Xu algo, crypto_cipher_get_flags(tfm)); 9911aa4ecd9SHerbert Xu goto out; 9921aa4ecd9SHerbert Xu } else if (ret) 9931aa4ecd9SHerbert Xu continue; 9941aa4ecd9SHerbert Xu 9951aa4ecd9SHerbert Xu for (k = 0; k < template[i].ilen; 9961aa4ecd9SHerbert Xu k += crypto_cipher_blocksize(tfm)) { 9971aa4ecd9SHerbert Xu if (enc) 9981aa4ecd9SHerbert Xu crypto_cipher_encrypt_one(tfm, data + k, 9991aa4ecd9SHerbert Xu data + k); 10001aa4ecd9SHerbert Xu else 10011aa4ecd9SHerbert Xu crypto_cipher_decrypt_one(tfm, data + k, 10021aa4ecd9SHerbert Xu data + k); 10031aa4ecd9SHerbert Xu } 10041aa4ecd9SHerbert Xu 10051aa4ecd9SHerbert Xu q = data; 10061aa4ecd9SHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 10071aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: Test %d failed " 10081aa4ecd9SHerbert Xu "on %s for %s\n", j, e, algo); 10091aa4ecd9SHerbert Xu hexdump(q, template[i].rlen); 10101aa4ecd9SHerbert Xu ret = -EINVAL; 10111aa4ecd9SHerbert Xu goto out; 10121aa4ecd9SHerbert Xu } 10131aa4ecd9SHerbert Xu } 10141aa4ecd9SHerbert Xu 10151aa4ecd9SHerbert Xu ret = 0; 10161aa4ecd9SHerbert Xu 10171aa4ecd9SHerbert Xu out: 1018f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 1019f8b0d4d0SHerbert Xu out_nobuf: 10201aa4ecd9SHerbert Xu return ret; 10211aa4ecd9SHerbert Xu } 10221aa4ecd9SHerbert Xu 102312773d93SHerbert Xu static int __test_skcipher(struct crypto_skcipher *tfm, int enc, 1024b13b1e0cSEric Biggers const struct cipher_testvec *template, 1025b13b1e0cSEric Biggers unsigned int tcount, 10263a338f20SJussi Kivilinna const bool diff_dst, const int align_offset) 1027da7f033dSHerbert Xu { 1028da7f033dSHerbert Xu const char *algo = 102912773d93SHerbert Xu crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)); 1030da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 1031da7f033dSHerbert Xu char *q; 103212773d93SHerbert Xu struct skcipher_request *req; 1033da7f033dSHerbert Xu struct scatterlist sg[8]; 103408d6af8cSJussi Kivilinna struct scatterlist sgout[8]; 103508d6af8cSJussi Kivilinna const char *e, *d; 10367f397136SGilad Ben-Yossef struct crypto_wait wait; 1037da7f033dSHerbert Xu void *data; 1038da7f033dSHerbert Xu char iv[MAX_IVLEN]; 1039f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 104008d6af8cSJussi Kivilinna char *xoutbuf[XBUFSIZE]; 1041f8b0d4d0SHerbert Xu int ret = -ENOMEM; 104284cba178SAndrey Ryabinin unsigned int ivsize = crypto_skcipher_ivsize(tfm); 1043f8b0d4d0SHerbert Xu 1044f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 1045f8b0d4d0SHerbert Xu goto out_nobuf; 1046da7f033dSHerbert Xu 104708d6af8cSJussi Kivilinna if (diff_dst && testmgr_alloc_buf(xoutbuf)) 104808d6af8cSJussi Kivilinna goto out_nooutbuf; 104908d6af8cSJussi Kivilinna 105008d6af8cSJussi Kivilinna if (diff_dst) 105108d6af8cSJussi Kivilinna d = "-ddst"; 105208d6af8cSJussi Kivilinna else 105308d6af8cSJussi Kivilinna d = ""; 105408d6af8cSJussi Kivilinna 1055da7f033dSHerbert Xu if (enc == ENCRYPT) 1056da7f033dSHerbert Xu e = "encryption"; 1057da7f033dSHerbert Xu else 1058da7f033dSHerbert Xu e = "decryption"; 1059da7f033dSHerbert Xu 10607f397136SGilad Ben-Yossef crypto_init_wait(&wait); 1061da7f033dSHerbert Xu 106212773d93SHerbert Xu req = skcipher_request_alloc(tfm, GFP_KERNEL); 1063da7f033dSHerbert Xu if (!req) { 106408d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Failed to allocate request for %s\n", 106508d6af8cSJussi Kivilinna d, algo); 1066da7f033dSHerbert Xu goto out; 1067da7f033dSHerbert Xu } 1068da7f033dSHerbert Xu 106912773d93SHerbert Xu skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 10707f397136SGilad Ben-Yossef crypto_req_done, &wait); 1071da7f033dSHerbert Xu 1072da7f033dSHerbert Xu j = 0; 1073da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 1074bbb9a7ddSCristian Stoica if (template[i].np && !template[i].also_non_np) 1075bbb9a7ddSCristian Stoica continue; 1076bbb9a7ddSCristian Stoica 107710faa8c0SStephan Mueller if (fips_enabled && template[i].fips_skip) 107810faa8c0SStephan Mueller continue; 107910faa8c0SStephan Mueller 1080da7f033dSHerbert Xu if (template[i].iv) 108184cba178SAndrey Ryabinin memcpy(iv, template[i].iv, ivsize); 1082da7f033dSHerbert Xu else 1083da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 1084da7f033dSHerbert Xu 1085da7f033dSHerbert Xu j++; 1086fd57f22aSHerbert Xu ret = -EINVAL; 1087a1aa44a2SCristian Stoica if (WARN_ON(align_offset + template[i].ilen > PAGE_SIZE)) 1088fd57f22aSHerbert Xu goto out; 1089fd57f22aSHerbert Xu 1090da7f033dSHerbert Xu data = xbuf[0]; 10913a338f20SJussi Kivilinna data += align_offset; 1092da7f033dSHerbert Xu memcpy(data, template[i].input, template[i].ilen); 1093da7f033dSHerbert Xu 109412773d93SHerbert Xu crypto_skcipher_clear_flags(tfm, ~0); 1095da7f033dSHerbert Xu if (template[i].wk) 109612773d93SHerbert Xu crypto_skcipher_set_flags(tfm, 109712773d93SHerbert Xu CRYPTO_TFM_REQ_WEAK_KEY); 1098da7f033dSHerbert Xu 109912773d93SHerbert Xu ret = crypto_skcipher_setkey(tfm, template[i].key, 1100da7f033dSHerbert Xu template[i].klen); 11010fae0c1eSYanjiang Jin if (template[i].fail == !ret) { 110208d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n", 110312773d93SHerbert Xu d, j, algo, crypto_skcipher_get_flags(tfm)); 1104da7f033dSHerbert Xu goto out; 1105da7f033dSHerbert Xu } else if (ret) 1106da7f033dSHerbert Xu continue; 1107da7f033dSHerbert Xu 1108da7f033dSHerbert Xu sg_init_one(&sg[0], data, template[i].ilen); 110908d6af8cSJussi Kivilinna if (diff_dst) { 111008d6af8cSJussi Kivilinna data = xoutbuf[0]; 11113a338f20SJussi Kivilinna data += align_offset; 111208d6af8cSJussi Kivilinna sg_init_one(&sgout[0], data, template[i].ilen); 111308d6af8cSJussi Kivilinna } 1114da7f033dSHerbert Xu 111512773d93SHerbert Xu skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 1116da7f033dSHerbert Xu template[i].ilen, iv); 11177f397136SGilad Ben-Yossef ret = crypto_wait_req(enc ? crypto_skcipher_encrypt(req) : 11187f397136SGilad Ben-Yossef crypto_skcipher_decrypt(req), &wait); 1119da7f033dSHerbert Xu 11207f397136SGilad Ben-Yossef if (ret) { 112108d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n", 112208d6af8cSJussi Kivilinna d, e, j, algo, -ret); 1123da7f033dSHerbert Xu goto out; 1124da7f033dSHerbert Xu } 1125da7f033dSHerbert Xu 1126da7f033dSHerbert Xu q = data; 1127da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 11288a826a34SBoris BREZILLON pr_err("alg: skcipher%s: Test %d failed (invalid result) on %s for %s\n", 112908d6af8cSJussi Kivilinna d, j, e, algo); 1130da7f033dSHerbert Xu hexdump(q, template[i].rlen); 1131da7f033dSHerbert Xu ret = -EINVAL; 1132da7f033dSHerbert Xu goto out; 1133da7f033dSHerbert Xu } 11348a826a34SBoris BREZILLON 11358a826a34SBoris BREZILLON if (template[i].iv_out && 11368a826a34SBoris BREZILLON memcmp(iv, template[i].iv_out, 11378a826a34SBoris BREZILLON crypto_skcipher_ivsize(tfm))) { 11388a826a34SBoris BREZILLON pr_err("alg: skcipher%s: Test %d failed (invalid output IV) on %s for %s\n", 11398a826a34SBoris BREZILLON d, j, e, algo); 11408a826a34SBoris BREZILLON hexdump(iv, crypto_skcipher_ivsize(tfm)); 11418a826a34SBoris BREZILLON ret = -EINVAL; 11428a826a34SBoris BREZILLON goto out; 11438a826a34SBoris BREZILLON } 1144da7f033dSHerbert Xu } 1145da7f033dSHerbert Xu 1146da7f033dSHerbert Xu j = 0; 1147da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 11483a338f20SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 11493a338f20SJussi Kivilinna if (align_offset != 0) 11503a338f20SJussi Kivilinna break; 1151da7f033dSHerbert Xu 1152bbb9a7ddSCristian Stoica if (!template[i].np) 1153bbb9a7ddSCristian Stoica continue; 1154bbb9a7ddSCristian Stoica 115510faa8c0SStephan Mueller if (fips_enabled && template[i].fips_skip) 115610faa8c0SStephan Mueller continue; 115710faa8c0SStephan Mueller 1158da7f033dSHerbert Xu if (template[i].iv) 115984cba178SAndrey Ryabinin memcpy(iv, template[i].iv, ivsize); 1160da7f033dSHerbert Xu else 1161da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 1162da7f033dSHerbert Xu 1163da7f033dSHerbert Xu j++; 116412773d93SHerbert Xu crypto_skcipher_clear_flags(tfm, ~0); 1165da7f033dSHerbert Xu if (template[i].wk) 116612773d93SHerbert Xu crypto_skcipher_set_flags(tfm, 116712773d93SHerbert Xu CRYPTO_TFM_REQ_WEAK_KEY); 1168da7f033dSHerbert Xu 116912773d93SHerbert Xu ret = crypto_skcipher_setkey(tfm, template[i].key, 1170da7f033dSHerbert Xu template[i].klen); 11710fae0c1eSYanjiang Jin if (template[i].fail == !ret) { 117208d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n", 117312773d93SHerbert Xu d, j, algo, crypto_skcipher_get_flags(tfm)); 1174da7f033dSHerbert Xu goto out; 1175da7f033dSHerbert Xu } else if (ret) 1176da7f033dSHerbert Xu continue; 1177da7f033dSHerbert Xu 1178da7f033dSHerbert Xu temp = 0; 1179da7f033dSHerbert Xu ret = -EINVAL; 1180da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 118108d6af8cSJussi Kivilinna if (diff_dst) 118208d6af8cSJussi Kivilinna sg_init_table(sgout, template[i].np); 1183da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 1184da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 1185da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 1186da7f033dSHerbert Xu goto out; 1187da7f033dSHerbert Xu 1188a1aa44a2SCristian Stoica q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]); 1189da7f033dSHerbert Xu 1190a1aa44a2SCristian Stoica memcpy(q, template[i].input + temp, template[i].tap[k]); 1191da7f033dSHerbert Xu 1192a1aa44a2SCristian Stoica if (offset_in_page(q) + template[i].tap[k] < PAGE_SIZE) 1193da7f033dSHerbert Xu q[template[i].tap[k]] = 0; 1194da7f033dSHerbert Xu 1195da7f033dSHerbert Xu sg_set_buf(&sg[k], q, template[i].tap[k]); 119608d6af8cSJussi Kivilinna if (diff_dst) { 119708d6af8cSJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 119808d6af8cSJussi Kivilinna offset_in_page(IDX[k]); 119908d6af8cSJussi Kivilinna 1200a1aa44a2SCristian Stoica sg_set_buf(&sgout[k], q, template[i].tap[k]); 120108d6af8cSJussi Kivilinna 120208d6af8cSJussi Kivilinna memset(q, 0, template[i].tap[k]); 120308d6af8cSJussi Kivilinna if (offset_in_page(q) + 120408d6af8cSJussi Kivilinna template[i].tap[k] < PAGE_SIZE) 120508d6af8cSJussi Kivilinna q[template[i].tap[k]] = 0; 120608d6af8cSJussi Kivilinna } 1207da7f033dSHerbert Xu 1208da7f033dSHerbert Xu temp += template[i].tap[k]; 1209da7f033dSHerbert Xu } 1210da7f033dSHerbert Xu 121112773d93SHerbert Xu skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 1212da7f033dSHerbert Xu template[i].ilen, iv); 1213da7f033dSHerbert Xu 12147f397136SGilad Ben-Yossef ret = crypto_wait_req(enc ? crypto_skcipher_encrypt(req) : 12157f397136SGilad Ben-Yossef crypto_skcipher_decrypt(req), &wait); 1216da7f033dSHerbert Xu 12177f397136SGilad Ben-Yossef if (ret) { 121808d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n", 121908d6af8cSJussi Kivilinna d, e, j, algo, -ret); 1220da7f033dSHerbert Xu goto out; 1221da7f033dSHerbert Xu } 1222da7f033dSHerbert Xu 1223da7f033dSHerbert Xu temp = 0; 1224da7f033dSHerbert Xu ret = -EINVAL; 1225da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 122608d6af8cSJussi Kivilinna if (diff_dst) 122708d6af8cSJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 122808d6af8cSJussi Kivilinna offset_in_page(IDX[k]); 122908d6af8cSJussi Kivilinna else 1230da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 1231da7f033dSHerbert Xu offset_in_page(IDX[k]); 1232da7f033dSHerbert Xu 1233da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, 1234da7f033dSHerbert Xu template[i].tap[k])) { 123508d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n", 123608d6af8cSJussi Kivilinna d, j, e, k, algo); 1237da7f033dSHerbert Xu hexdump(q, template[i].tap[k]); 1238da7f033dSHerbert Xu goto out; 1239da7f033dSHerbert Xu } 1240da7f033dSHerbert Xu 1241da7f033dSHerbert Xu q += template[i].tap[k]; 1242da7f033dSHerbert Xu for (n = 0; offset_in_page(q + n) && q[n]; n++) 1243da7f033dSHerbert Xu ; 1244da7f033dSHerbert Xu if (n) { 124508d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n", 124608d6af8cSJussi Kivilinna d, j, e, k, algo, n); 1247da7f033dSHerbert Xu hexdump(q, n); 1248da7f033dSHerbert Xu goto out; 1249da7f033dSHerbert Xu } 1250da7f033dSHerbert Xu temp += template[i].tap[k]; 1251da7f033dSHerbert Xu } 1252da7f033dSHerbert Xu } 1253da7f033dSHerbert Xu 1254da7f033dSHerbert Xu ret = 0; 1255da7f033dSHerbert Xu 1256da7f033dSHerbert Xu out: 125712773d93SHerbert Xu skcipher_request_free(req); 125808d6af8cSJussi Kivilinna if (diff_dst) 125908d6af8cSJussi Kivilinna testmgr_free_buf(xoutbuf); 126008d6af8cSJussi Kivilinna out_nooutbuf: 1261f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 1262f8b0d4d0SHerbert Xu out_nobuf: 1263da7f033dSHerbert Xu return ret; 1264da7f033dSHerbert Xu } 1265da7f033dSHerbert Xu 126612773d93SHerbert Xu static int test_skcipher(struct crypto_skcipher *tfm, int enc, 1267b13b1e0cSEric Biggers const struct cipher_testvec *template, 1268b13b1e0cSEric Biggers unsigned int tcount) 126908d6af8cSJussi Kivilinna { 12703a338f20SJussi Kivilinna unsigned int alignmask; 127108d6af8cSJussi Kivilinna int ret; 127208d6af8cSJussi Kivilinna 127308d6af8cSJussi Kivilinna /* test 'dst == src' case */ 12743a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, false, 0); 127508d6af8cSJussi Kivilinna if (ret) 127608d6af8cSJussi Kivilinna return ret; 127708d6af8cSJussi Kivilinna 127808d6af8cSJussi Kivilinna /* test 'dst != src' case */ 12793a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 0); 12803a338f20SJussi Kivilinna if (ret) 12813a338f20SJussi Kivilinna return ret; 12823a338f20SJussi Kivilinna 12833a338f20SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 12843a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 1); 12853a338f20SJussi Kivilinna if (ret) 12863a338f20SJussi Kivilinna return ret; 12873a338f20SJussi Kivilinna 12883a338f20SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 12893a338f20SJussi Kivilinna if (alignmask) { 12903a338f20SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 12913a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 12923a338f20SJussi Kivilinna alignmask + 1); 12933a338f20SJussi Kivilinna if (ret) 12943a338f20SJussi Kivilinna return ret; 12953a338f20SJussi Kivilinna } 12963a338f20SJussi Kivilinna 12973a338f20SJussi Kivilinna return 0; 129808d6af8cSJussi Kivilinna } 129908d6af8cSJussi Kivilinna 1300b13b1e0cSEric Biggers static int test_comp(struct crypto_comp *tfm, 1301b13b1e0cSEric Biggers const struct comp_testvec *ctemplate, 1302b13b1e0cSEric Biggers const struct comp_testvec *dtemplate, 1303b13b1e0cSEric Biggers int ctcount, int dtcount) 1304da7f033dSHerbert Xu { 1305da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm)); 1306da7f033dSHerbert Xu unsigned int i; 1307da7f033dSHerbert Xu char result[COMP_BUF_SIZE]; 1308da7f033dSHerbert Xu int ret; 1309da7f033dSHerbert Xu 1310da7f033dSHerbert Xu for (i = 0; i < ctcount; i++) { 1311c79cf910SGeert Uytterhoeven int ilen; 1312c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 1313da7f033dSHerbert Xu 1314da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 1315da7f033dSHerbert Xu 1316da7f033dSHerbert Xu ilen = ctemplate[i].inlen; 1317da7f033dSHerbert Xu ret = crypto_comp_compress(tfm, ctemplate[i].input, 1318da7f033dSHerbert Xu ilen, result, &dlen); 1319da7f033dSHerbert Xu if (ret) { 1320da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: compression failed " 1321da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1322da7f033dSHerbert Xu -ret); 1323da7f033dSHerbert Xu goto out; 1324da7f033dSHerbert Xu } 1325da7f033dSHerbert Xu 1326b812eb00SGeert Uytterhoeven if (dlen != ctemplate[i].outlen) { 1327b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Compression test %d " 1328b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1329b812eb00SGeert Uytterhoeven dlen); 1330b812eb00SGeert Uytterhoeven ret = -EINVAL; 1331b812eb00SGeert Uytterhoeven goto out; 1332b812eb00SGeert Uytterhoeven } 1333b812eb00SGeert Uytterhoeven 1334da7f033dSHerbert Xu if (memcmp(result, ctemplate[i].output, dlen)) { 1335da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Compression test %d " 1336da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 1337da7f033dSHerbert Xu hexdump(result, dlen); 1338da7f033dSHerbert Xu ret = -EINVAL; 1339da7f033dSHerbert Xu goto out; 1340da7f033dSHerbert Xu } 1341da7f033dSHerbert Xu } 1342da7f033dSHerbert Xu 1343da7f033dSHerbert Xu for (i = 0; i < dtcount; i++) { 1344c79cf910SGeert Uytterhoeven int ilen; 1345c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 1346da7f033dSHerbert Xu 1347da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 1348da7f033dSHerbert Xu 1349da7f033dSHerbert Xu ilen = dtemplate[i].inlen; 1350da7f033dSHerbert Xu ret = crypto_comp_decompress(tfm, dtemplate[i].input, 1351da7f033dSHerbert Xu ilen, result, &dlen); 1352da7f033dSHerbert Xu if (ret) { 1353da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: decompression failed " 1354da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1355da7f033dSHerbert Xu -ret); 1356da7f033dSHerbert Xu goto out; 1357da7f033dSHerbert Xu } 1358da7f033dSHerbert Xu 1359b812eb00SGeert Uytterhoeven if (dlen != dtemplate[i].outlen) { 1360b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Decompression test %d " 1361b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1362b812eb00SGeert Uytterhoeven dlen); 1363b812eb00SGeert Uytterhoeven ret = -EINVAL; 1364b812eb00SGeert Uytterhoeven goto out; 1365b812eb00SGeert Uytterhoeven } 1366b812eb00SGeert Uytterhoeven 1367da7f033dSHerbert Xu if (memcmp(result, dtemplate[i].output, dlen)) { 1368da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Decompression test %d " 1369da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 1370da7f033dSHerbert Xu hexdump(result, dlen); 1371da7f033dSHerbert Xu ret = -EINVAL; 1372da7f033dSHerbert Xu goto out; 1373da7f033dSHerbert Xu } 1374da7f033dSHerbert Xu } 1375da7f033dSHerbert Xu 1376da7f033dSHerbert Xu ret = 0; 1377da7f033dSHerbert Xu 1378da7f033dSHerbert Xu out: 1379da7f033dSHerbert Xu return ret; 1380da7f033dSHerbert Xu } 1381da7f033dSHerbert Xu 1382b13b1e0cSEric Biggers static int test_acomp(struct crypto_acomp *tfm, 1383b13b1e0cSEric Biggers const struct comp_testvec *ctemplate, 1384b13b1e0cSEric Biggers const struct comp_testvec *dtemplate, 1385b13b1e0cSEric Biggers int ctcount, int dtcount) 1386d7db7a88SGiovanni Cabiddu { 1387d7db7a88SGiovanni Cabiddu const char *algo = crypto_tfm_alg_driver_name(crypto_acomp_tfm(tfm)); 1388d7db7a88SGiovanni Cabiddu unsigned int i; 1389a9943a0aSGiovanni Cabiddu char *output, *decomp_out; 1390d7db7a88SGiovanni Cabiddu int ret; 1391d7db7a88SGiovanni Cabiddu struct scatterlist src, dst; 1392d7db7a88SGiovanni Cabiddu struct acomp_req *req; 13937f397136SGilad Ben-Yossef struct crypto_wait wait; 1394d7db7a88SGiovanni Cabiddu 1395eb095593SEric Biggers output = kmalloc(COMP_BUF_SIZE, GFP_KERNEL); 1396eb095593SEric Biggers if (!output) 1397eb095593SEric Biggers return -ENOMEM; 1398eb095593SEric Biggers 1399a9943a0aSGiovanni Cabiddu decomp_out = kmalloc(COMP_BUF_SIZE, GFP_KERNEL); 1400a9943a0aSGiovanni Cabiddu if (!decomp_out) { 1401a9943a0aSGiovanni Cabiddu kfree(output); 1402a9943a0aSGiovanni Cabiddu return -ENOMEM; 1403a9943a0aSGiovanni Cabiddu } 1404a9943a0aSGiovanni Cabiddu 1405d7db7a88SGiovanni Cabiddu for (i = 0; i < ctcount; i++) { 1406d7db7a88SGiovanni Cabiddu unsigned int dlen = COMP_BUF_SIZE; 1407d7db7a88SGiovanni Cabiddu int ilen = ctemplate[i].inlen; 140802608e02SLaura Abbott void *input_vec; 1409d7db7a88SGiovanni Cabiddu 1410d2110224SEric Biggers input_vec = kmemdup(ctemplate[i].input, ilen, GFP_KERNEL); 141102608e02SLaura Abbott if (!input_vec) { 141202608e02SLaura Abbott ret = -ENOMEM; 141302608e02SLaura Abbott goto out; 141402608e02SLaura Abbott } 141502608e02SLaura Abbott 1416eb095593SEric Biggers memset(output, 0, dlen); 14177f397136SGilad Ben-Yossef crypto_init_wait(&wait); 141802608e02SLaura Abbott sg_init_one(&src, input_vec, ilen); 1419d7db7a88SGiovanni Cabiddu sg_init_one(&dst, output, dlen); 1420d7db7a88SGiovanni Cabiddu 1421d7db7a88SGiovanni Cabiddu req = acomp_request_alloc(tfm); 1422d7db7a88SGiovanni Cabiddu if (!req) { 1423d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: request alloc failed for %s\n", 1424d7db7a88SGiovanni Cabiddu algo); 142502608e02SLaura Abbott kfree(input_vec); 1426d7db7a88SGiovanni Cabiddu ret = -ENOMEM; 1427d7db7a88SGiovanni Cabiddu goto out; 1428d7db7a88SGiovanni Cabiddu } 1429d7db7a88SGiovanni Cabiddu 1430d7db7a88SGiovanni Cabiddu acomp_request_set_params(req, &src, &dst, ilen, dlen); 1431d7db7a88SGiovanni Cabiddu acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 14327f397136SGilad Ben-Yossef crypto_req_done, &wait); 1433d7db7a88SGiovanni Cabiddu 14347f397136SGilad Ben-Yossef ret = crypto_wait_req(crypto_acomp_compress(req), &wait); 1435d7db7a88SGiovanni Cabiddu if (ret) { 1436d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: compression failed on test %d for %s: ret=%d\n", 1437d7db7a88SGiovanni Cabiddu i + 1, algo, -ret); 143802608e02SLaura Abbott kfree(input_vec); 1439d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1440d7db7a88SGiovanni Cabiddu goto out; 1441d7db7a88SGiovanni Cabiddu } 1442d7db7a88SGiovanni Cabiddu 1443a9943a0aSGiovanni Cabiddu ilen = req->dlen; 1444a9943a0aSGiovanni Cabiddu dlen = COMP_BUF_SIZE; 1445a9943a0aSGiovanni Cabiddu sg_init_one(&src, output, ilen); 1446a9943a0aSGiovanni Cabiddu sg_init_one(&dst, decomp_out, dlen); 14477f397136SGilad Ben-Yossef crypto_init_wait(&wait); 1448a9943a0aSGiovanni Cabiddu acomp_request_set_params(req, &src, &dst, ilen, dlen); 1449a9943a0aSGiovanni Cabiddu 14507f397136SGilad Ben-Yossef ret = crypto_wait_req(crypto_acomp_decompress(req), &wait); 1451a9943a0aSGiovanni Cabiddu if (ret) { 1452a9943a0aSGiovanni Cabiddu pr_err("alg: acomp: compression failed on test %d for %s: ret=%d\n", 1453a9943a0aSGiovanni Cabiddu i + 1, algo, -ret); 1454a9943a0aSGiovanni Cabiddu kfree(input_vec); 1455a9943a0aSGiovanni Cabiddu acomp_request_free(req); 1456a9943a0aSGiovanni Cabiddu goto out; 1457a9943a0aSGiovanni Cabiddu } 1458a9943a0aSGiovanni Cabiddu 1459a9943a0aSGiovanni Cabiddu if (req->dlen != ctemplate[i].inlen) { 1460d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: Compression test %d failed for %s: output len = %d\n", 1461d7db7a88SGiovanni Cabiddu i + 1, algo, req->dlen); 1462d7db7a88SGiovanni Cabiddu ret = -EINVAL; 146302608e02SLaura Abbott kfree(input_vec); 1464d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1465d7db7a88SGiovanni Cabiddu goto out; 1466d7db7a88SGiovanni Cabiddu } 1467d7db7a88SGiovanni Cabiddu 1468a9943a0aSGiovanni Cabiddu if (memcmp(input_vec, decomp_out, req->dlen)) { 1469d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: Compression test %d failed for %s\n", 1470d7db7a88SGiovanni Cabiddu i + 1, algo); 1471d7db7a88SGiovanni Cabiddu hexdump(output, req->dlen); 1472d7db7a88SGiovanni Cabiddu ret = -EINVAL; 147302608e02SLaura Abbott kfree(input_vec); 1474d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1475d7db7a88SGiovanni Cabiddu goto out; 1476d7db7a88SGiovanni Cabiddu } 1477d7db7a88SGiovanni Cabiddu 147802608e02SLaura Abbott kfree(input_vec); 1479d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1480d7db7a88SGiovanni Cabiddu } 1481d7db7a88SGiovanni Cabiddu 1482d7db7a88SGiovanni Cabiddu for (i = 0; i < dtcount; i++) { 1483d7db7a88SGiovanni Cabiddu unsigned int dlen = COMP_BUF_SIZE; 1484d7db7a88SGiovanni Cabiddu int ilen = dtemplate[i].inlen; 148502608e02SLaura Abbott void *input_vec; 1486d7db7a88SGiovanni Cabiddu 1487d2110224SEric Biggers input_vec = kmemdup(dtemplate[i].input, ilen, GFP_KERNEL); 148802608e02SLaura Abbott if (!input_vec) { 148902608e02SLaura Abbott ret = -ENOMEM; 149002608e02SLaura Abbott goto out; 149102608e02SLaura Abbott } 149202608e02SLaura Abbott 1493eb095593SEric Biggers memset(output, 0, dlen); 14947f397136SGilad Ben-Yossef crypto_init_wait(&wait); 149502608e02SLaura Abbott sg_init_one(&src, input_vec, ilen); 1496d7db7a88SGiovanni Cabiddu sg_init_one(&dst, output, dlen); 1497d7db7a88SGiovanni Cabiddu 1498d7db7a88SGiovanni Cabiddu req = acomp_request_alloc(tfm); 1499d7db7a88SGiovanni Cabiddu if (!req) { 1500d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: request alloc failed for %s\n", 1501d7db7a88SGiovanni Cabiddu algo); 150202608e02SLaura Abbott kfree(input_vec); 1503d7db7a88SGiovanni Cabiddu ret = -ENOMEM; 1504d7db7a88SGiovanni Cabiddu goto out; 1505d7db7a88SGiovanni Cabiddu } 1506d7db7a88SGiovanni Cabiddu 1507d7db7a88SGiovanni Cabiddu acomp_request_set_params(req, &src, &dst, ilen, dlen); 1508d7db7a88SGiovanni Cabiddu acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 15097f397136SGilad Ben-Yossef crypto_req_done, &wait); 1510d7db7a88SGiovanni Cabiddu 15117f397136SGilad Ben-Yossef ret = crypto_wait_req(crypto_acomp_decompress(req), &wait); 1512d7db7a88SGiovanni Cabiddu if (ret) { 1513d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: decompression failed on test %d for %s: ret=%d\n", 1514d7db7a88SGiovanni Cabiddu i + 1, algo, -ret); 151502608e02SLaura Abbott kfree(input_vec); 1516d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1517d7db7a88SGiovanni Cabiddu goto out; 1518d7db7a88SGiovanni Cabiddu } 1519d7db7a88SGiovanni Cabiddu 1520d7db7a88SGiovanni Cabiddu if (req->dlen != dtemplate[i].outlen) { 1521d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: Decompression test %d failed for %s: output len = %d\n", 1522d7db7a88SGiovanni Cabiddu i + 1, algo, req->dlen); 1523d7db7a88SGiovanni Cabiddu ret = -EINVAL; 152402608e02SLaura Abbott kfree(input_vec); 1525d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1526d7db7a88SGiovanni Cabiddu goto out; 1527d7db7a88SGiovanni Cabiddu } 1528d7db7a88SGiovanni Cabiddu 1529d7db7a88SGiovanni Cabiddu if (memcmp(output, dtemplate[i].output, req->dlen)) { 1530d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: Decompression test %d failed for %s\n", 1531d7db7a88SGiovanni Cabiddu i + 1, algo); 1532d7db7a88SGiovanni Cabiddu hexdump(output, req->dlen); 1533d7db7a88SGiovanni Cabiddu ret = -EINVAL; 153402608e02SLaura Abbott kfree(input_vec); 1535d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1536d7db7a88SGiovanni Cabiddu goto out; 1537d7db7a88SGiovanni Cabiddu } 1538d7db7a88SGiovanni Cabiddu 153902608e02SLaura Abbott kfree(input_vec); 1540d7db7a88SGiovanni Cabiddu acomp_request_free(req); 1541d7db7a88SGiovanni Cabiddu } 1542d7db7a88SGiovanni Cabiddu 1543d7db7a88SGiovanni Cabiddu ret = 0; 1544d7db7a88SGiovanni Cabiddu 1545d7db7a88SGiovanni Cabiddu out: 1546a9943a0aSGiovanni Cabiddu kfree(decomp_out); 1547eb095593SEric Biggers kfree(output); 1548d7db7a88SGiovanni Cabiddu return ret; 1549d7db7a88SGiovanni Cabiddu } 1550d7db7a88SGiovanni Cabiddu 1551b13b1e0cSEric Biggers static int test_cprng(struct crypto_rng *tfm, 1552b13b1e0cSEric Biggers const struct cprng_testvec *template, 15537647d6ceSJarod Wilson unsigned int tcount) 15547647d6ceSJarod Wilson { 15557647d6ceSJarod Wilson const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm)); 1556fa4ef8a6SFelipe Contreras int err = 0, i, j, seedsize; 15577647d6ceSJarod Wilson u8 *seed; 15587647d6ceSJarod Wilson char result[32]; 15597647d6ceSJarod Wilson 15607647d6ceSJarod Wilson seedsize = crypto_rng_seedsize(tfm); 15617647d6ceSJarod Wilson 15627647d6ceSJarod Wilson seed = kmalloc(seedsize, GFP_KERNEL); 15637647d6ceSJarod Wilson if (!seed) { 15647647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to allocate seed space " 15657647d6ceSJarod Wilson "for %s\n", algo); 15667647d6ceSJarod Wilson return -ENOMEM; 15677647d6ceSJarod Wilson } 15687647d6ceSJarod Wilson 15697647d6ceSJarod Wilson for (i = 0; i < tcount; i++) { 15707647d6ceSJarod Wilson memset(result, 0, 32); 15717647d6ceSJarod Wilson 15727647d6ceSJarod Wilson memcpy(seed, template[i].v, template[i].vlen); 15737647d6ceSJarod Wilson memcpy(seed + template[i].vlen, template[i].key, 15747647d6ceSJarod Wilson template[i].klen); 15757647d6ceSJarod Wilson memcpy(seed + template[i].vlen + template[i].klen, 15767647d6ceSJarod Wilson template[i].dt, template[i].dtlen); 15777647d6ceSJarod Wilson 15787647d6ceSJarod Wilson err = crypto_rng_reset(tfm, seed, seedsize); 15797647d6ceSJarod Wilson if (err) { 15807647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to reset rng " 15817647d6ceSJarod Wilson "for %s\n", algo); 15827647d6ceSJarod Wilson goto out; 15837647d6ceSJarod Wilson } 15847647d6ceSJarod Wilson 15857647d6ceSJarod Wilson for (j = 0; j < template[i].loops; j++) { 15867647d6ceSJarod Wilson err = crypto_rng_get_bytes(tfm, result, 15877647d6ceSJarod Wilson template[i].rlen); 158819e60e13SStephan Mueller if (err < 0) { 15897647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to obtain " 15907647d6ceSJarod Wilson "the correct amount of random data for " 159119e60e13SStephan Mueller "%s (requested %d)\n", algo, 159219e60e13SStephan Mueller template[i].rlen); 15937647d6ceSJarod Wilson goto out; 15947647d6ceSJarod Wilson } 15957647d6ceSJarod Wilson } 15967647d6ceSJarod Wilson 15977647d6ceSJarod Wilson err = memcmp(result, template[i].result, 15987647d6ceSJarod Wilson template[i].rlen); 15997647d6ceSJarod Wilson if (err) { 16007647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Test %d failed for %s\n", 16017647d6ceSJarod Wilson i, algo); 16027647d6ceSJarod Wilson hexdump(result, template[i].rlen); 16037647d6ceSJarod Wilson err = -EINVAL; 16047647d6ceSJarod Wilson goto out; 16057647d6ceSJarod Wilson } 16067647d6ceSJarod Wilson } 16077647d6ceSJarod Wilson 16087647d6ceSJarod Wilson out: 16097647d6ceSJarod Wilson kfree(seed); 16107647d6ceSJarod Wilson return err; 16117647d6ceSJarod Wilson } 16127647d6ceSJarod Wilson 1613da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver, 1614da7f033dSHerbert Xu u32 type, u32 mask) 1615da7f033dSHerbert Xu { 1616da7f033dSHerbert Xu struct crypto_aead *tfm; 1617da7f033dSHerbert Xu int err = 0; 1618da7f033dSHerbert Xu 1619eed93e0cSHerbert Xu tfm = crypto_alloc_aead(driver, type, mask); 1620da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1621da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to load transform for %s: " 1622da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1623da7f033dSHerbert Xu return PTR_ERR(tfm); 1624da7f033dSHerbert Xu } 1625da7f033dSHerbert Xu 1626da7f033dSHerbert Xu if (desc->suite.aead.enc.vecs) { 1627da7f033dSHerbert Xu err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs, 1628da7f033dSHerbert Xu desc->suite.aead.enc.count); 1629da7f033dSHerbert Xu if (err) 1630da7f033dSHerbert Xu goto out; 1631da7f033dSHerbert Xu } 1632da7f033dSHerbert Xu 1633da7f033dSHerbert Xu if (!err && desc->suite.aead.dec.vecs) 1634da7f033dSHerbert Xu err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs, 1635da7f033dSHerbert Xu desc->suite.aead.dec.count); 1636da7f033dSHerbert Xu 1637da7f033dSHerbert Xu out: 1638da7f033dSHerbert Xu crypto_free_aead(tfm); 1639da7f033dSHerbert Xu return err; 1640da7f033dSHerbert Xu } 1641da7f033dSHerbert Xu 1642da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc, 1643da7f033dSHerbert Xu const char *driver, u32 type, u32 mask) 1644da7f033dSHerbert Xu { 16451aa4ecd9SHerbert Xu struct crypto_cipher *tfm; 1646da7f033dSHerbert Xu int err = 0; 1647da7f033dSHerbert Xu 1648eed93e0cSHerbert Xu tfm = crypto_alloc_cipher(driver, type, mask); 1649da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1650da7f033dSHerbert Xu printk(KERN_ERR "alg: cipher: Failed to load transform for " 1651da7f033dSHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 1652da7f033dSHerbert Xu return PTR_ERR(tfm); 1653da7f033dSHerbert Xu } 1654da7f033dSHerbert Xu 1655da7f033dSHerbert Xu if (desc->suite.cipher.enc.vecs) { 1656da7f033dSHerbert Xu err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 1657da7f033dSHerbert Xu desc->suite.cipher.enc.count); 1658da7f033dSHerbert Xu if (err) 1659da7f033dSHerbert Xu goto out; 1660da7f033dSHerbert Xu } 1661da7f033dSHerbert Xu 1662da7f033dSHerbert Xu if (desc->suite.cipher.dec.vecs) 1663da7f033dSHerbert Xu err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 1664da7f033dSHerbert Xu desc->suite.cipher.dec.count); 1665da7f033dSHerbert Xu 1666da7f033dSHerbert Xu out: 16671aa4ecd9SHerbert Xu crypto_free_cipher(tfm); 16681aa4ecd9SHerbert Xu return err; 16691aa4ecd9SHerbert Xu } 16701aa4ecd9SHerbert Xu 16711aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc, 16721aa4ecd9SHerbert Xu const char *driver, u32 type, u32 mask) 16731aa4ecd9SHerbert Xu { 167412773d93SHerbert Xu struct crypto_skcipher *tfm; 16751aa4ecd9SHerbert Xu int err = 0; 16761aa4ecd9SHerbert Xu 1677eed93e0cSHerbert Xu tfm = crypto_alloc_skcipher(driver, type, mask); 16781aa4ecd9SHerbert Xu if (IS_ERR(tfm)) { 16791aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Failed to load transform for " 16801aa4ecd9SHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 16811aa4ecd9SHerbert Xu return PTR_ERR(tfm); 16821aa4ecd9SHerbert Xu } 16831aa4ecd9SHerbert Xu 16841aa4ecd9SHerbert Xu if (desc->suite.cipher.enc.vecs) { 16851aa4ecd9SHerbert Xu err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 16861aa4ecd9SHerbert Xu desc->suite.cipher.enc.count); 16871aa4ecd9SHerbert Xu if (err) 16881aa4ecd9SHerbert Xu goto out; 16891aa4ecd9SHerbert Xu } 16901aa4ecd9SHerbert Xu 16911aa4ecd9SHerbert Xu if (desc->suite.cipher.dec.vecs) 16921aa4ecd9SHerbert Xu err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 16931aa4ecd9SHerbert Xu desc->suite.cipher.dec.count); 16941aa4ecd9SHerbert Xu 16951aa4ecd9SHerbert Xu out: 169612773d93SHerbert Xu crypto_free_skcipher(tfm); 1697da7f033dSHerbert Xu return err; 1698da7f033dSHerbert Xu } 1699da7f033dSHerbert Xu 1700da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver, 1701da7f033dSHerbert Xu u32 type, u32 mask) 1702da7f033dSHerbert Xu { 1703d7db7a88SGiovanni Cabiddu struct crypto_comp *comp; 1704d7db7a88SGiovanni Cabiddu struct crypto_acomp *acomp; 1705da7f033dSHerbert Xu int err; 1706d7db7a88SGiovanni Cabiddu u32 algo_type = type & CRYPTO_ALG_TYPE_ACOMPRESS_MASK; 1707da7f033dSHerbert Xu 1708d7db7a88SGiovanni Cabiddu if (algo_type == CRYPTO_ALG_TYPE_ACOMPRESS) { 1709d7db7a88SGiovanni Cabiddu acomp = crypto_alloc_acomp(driver, type, mask); 1710d7db7a88SGiovanni Cabiddu if (IS_ERR(acomp)) { 1711d7db7a88SGiovanni Cabiddu pr_err("alg: acomp: Failed to load transform for %s: %ld\n", 1712d7db7a88SGiovanni Cabiddu driver, PTR_ERR(acomp)); 1713d7db7a88SGiovanni Cabiddu return PTR_ERR(acomp); 1714d7db7a88SGiovanni Cabiddu } 1715d7db7a88SGiovanni Cabiddu err = test_acomp(acomp, desc->suite.comp.comp.vecs, 1716d7db7a88SGiovanni Cabiddu desc->suite.comp.decomp.vecs, 1717d7db7a88SGiovanni Cabiddu desc->suite.comp.comp.count, 1718d7db7a88SGiovanni Cabiddu desc->suite.comp.decomp.count); 1719d7db7a88SGiovanni Cabiddu crypto_free_acomp(acomp); 1720d7db7a88SGiovanni Cabiddu } else { 1721d7db7a88SGiovanni Cabiddu comp = crypto_alloc_comp(driver, type, mask); 1722d7db7a88SGiovanni Cabiddu if (IS_ERR(comp)) { 1723d7db7a88SGiovanni Cabiddu pr_err("alg: comp: Failed to load transform for %s: %ld\n", 1724d7db7a88SGiovanni Cabiddu driver, PTR_ERR(comp)); 1725d7db7a88SGiovanni Cabiddu return PTR_ERR(comp); 1726da7f033dSHerbert Xu } 1727da7f033dSHerbert Xu 1728d7db7a88SGiovanni Cabiddu err = test_comp(comp, desc->suite.comp.comp.vecs, 1729da7f033dSHerbert Xu desc->suite.comp.decomp.vecs, 1730da7f033dSHerbert Xu desc->suite.comp.comp.count, 1731da7f033dSHerbert Xu desc->suite.comp.decomp.count); 1732da7f033dSHerbert Xu 1733d7db7a88SGiovanni Cabiddu crypto_free_comp(comp); 1734d7db7a88SGiovanni Cabiddu } 1735da7f033dSHerbert Xu return err; 1736da7f033dSHerbert Xu } 1737da7f033dSHerbert Xu 1738da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver, 1739da7f033dSHerbert Xu u32 type, u32 mask) 1740da7f033dSHerbert Xu { 1741da7f033dSHerbert Xu struct crypto_ahash *tfm; 1742da7f033dSHerbert Xu int err; 1743da7f033dSHerbert Xu 1744eed93e0cSHerbert Xu tfm = crypto_alloc_ahash(driver, type, mask); 1745da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1746da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to load transform for %s: " 1747da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1748da7f033dSHerbert Xu return PTR_ERR(tfm); 1749da7f033dSHerbert Xu } 1750da7f033dSHerbert Xu 1751a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1752a8f1a052SDavid S. Miller desc->suite.hash.count, true); 1753a8f1a052SDavid S. Miller if (!err) 1754a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1755a8f1a052SDavid S. Miller desc->suite.hash.count, false); 1756da7f033dSHerbert Xu 1757da7f033dSHerbert Xu crypto_free_ahash(tfm); 1758da7f033dSHerbert Xu return err; 1759da7f033dSHerbert Xu } 1760da7f033dSHerbert Xu 17618e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc, 17628e3ee85eSHerbert Xu const char *driver, u32 type, u32 mask) 17638e3ee85eSHerbert Xu { 17648e3ee85eSHerbert Xu struct crypto_shash *tfm; 17658e3ee85eSHerbert Xu u32 val; 17668e3ee85eSHerbert Xu int err; 17678e3ee85eSHerbert Xu 17688e3ee85eSHerbert Xu err = alg_test_hash(desc, driver, type, mask); 17698e3ee85eSHerbert Xu if (err) 17708e3ee85eSHerbert Xu goto out; 17718e3ee85eSHerbert Xu 1772eed93e0cSHerbert Xu tfm = crypto_alloc_shash(driver, type, mask); 17738e3ee85eSHerbert Xu if (IS_ERR(tfm)) { 17748e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: " 17758e3ee85eSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 17768e3ee85eSHerbert Xu err = PTR_ERR(tfm); 17778e3ee85eSHerbert Xu goto out; 17788e3ee85eSHerbert Xu } 17798e3ee85eSHerbert Xu 17808e3ee85eSHerbert Xu do { 17814c5c3024SJan-Simon Möller SHASH_DESC_ON_STACK(shash, tfm); 17824c5c3024SJan-Simon Möller u32 *ctx = (u32 *)shash_desc_ctx(shash); 17838e3ee85eSHerbert Xu 17844c5c3024SJan-Simon Möller shash->tfm = tfm; 17854c5c3024SJan-Simon Möller shash->flags = 0; 17868e3ee85eSHerbert Xu 17874c5c3024SJan-Simon Möller *ctx = le32_to_cpu(420553207); 17884c5c3024SJan-Simon Möller err = crypto_shash_final(shash, (u8 *)&val); 17898e3ee85eSHerbert Xu if (err) { 17908e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Operation failed for " 17918e3ee85eSHerbert Xu "%s: %d\n", driver, err); 17928e3ee85eSHerbert Xu break; 17938e3ee85eSHerbert Xu } 17948e3ee85eSHerbert Xu 17958e3ee85eSHerbert Xu if (val != ~420553207) { 17968e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Test failed for %s: " 17978e3ee85eSHerbert Xu "%d\n", driver, val); 17988e3ee85eSHerbert Xu err = -EINVAL; 17998e3ee85eSHerbert Xu } 18008e3ee85eSHerbert Xu } while (0); 18018e3ee85eSHerbert Xu 18028e3ee85eSHerbert Xu crypto_free_shash(tfm); 18038e3ee85eSHerbert Xu 18048e3ee85eSHerbert Xu out: 18058e3ee85eSHerbert Xu return err; 18068e3ee85eSHerbert Xu } 18078e3ee85eSHerbert Xu 18087647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver, 18097647d6ceSJarod Wilson u32 type, u32 mask) 18107647d6ceSJarod Wilson { 18117647d6ceSJarod Wilson struct crypto_rng *rng; 18127647d6ceSJarod Wilson int err; 18137647d6ceSJarod Wilson 1814eed93e0cSHerbert Xu rng = crypto_alloc_rng(driver, type, mask); 18157647d6ceSJarod Wilson if (IS_ERR(rng)) { 18167647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to load transform for %s: " 18177647d6ceSJarod Wilson "%ld\n", driver, PTR_ERR(rng)); 18187647d6ceSJarod Wilson return PTR_ERR(rng); 18197647d6ceSJarod Wilson } 18207647d6ceSJarod Wilson 18217647d6ceSJarod Wilson err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count); 18227647d6ceSJarod Wilson 18237647d6ceSJarod Wilson crypto_free_rng(rng); 18247647d6ceSJarod Wilson 18257647d6ceSJarod Wilson return err; 18267647d6ceSJarod Wilson } 18277647d6ceSJarod Wilson 182864d1cdfbSStephan Mueller 1829b13b1e0cSEric Biggers static int drbg_cavs_test(const struct drbg_testvec *test, int pr, 183064d1cdfbSStephan Mueller const char *driver, u32 type, u32 mask) 183164d1cdfbSStephan Mueller { 183264d1cdfbSStephan Mueller int ret = -EAGAIN; 183364d1cdfbSStephan Mueller struct crypto_rng *drng; 183464d1cdfbSStephan Mueller struct drbg_test_data test_data; 183564d1cdfbSStephan Mueller struct drbg_string addtl, pers, testentropy; 183664d1cdfbSStephan Mueller unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL); 183764d1cdfbSStephan Mueller 183864d1cdfbSStephan Mueller if (!buf) 183964d1cdfbSStephan Mueller return -ENOMEM; 184064d1cdfbSStephan Mueller 1841eed93e0cSHerbert Xu drng = crypto_alloc_rng(driver, type, mask); 184264d1cdfbSStephan Mueller if (IS_ERR(drng)) { 184364d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for " 184464d1cdfbSStephan Mueller "%s\n", driver); 184564d1cdfbSStephan Mueller kzfree(buf); 184664d1cdfbSStephan Mueller return -ENOMEM; 184764d1cdfbSStephan Mueller } 184864d1cdfbSStephan Mueller 184964d1cdfbSStephan Mueller test_data.testentropy = &testentropy; 185064d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entropy, test->entropylen); 185164d1cdfbSStephan Mueller drbg_string_fill(&pers, test->pers, test->perslen); 185264d1cdfbSStephan Mueller ret = crypto_drbg_reset_test(drng, &pers, &test_data); 185364d1cdfbSStephan Mueller if (ret) { 185464d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: Failed to reset rng\n"); 185564d1cdfbSStephan Mueller goto outbuf; 185664d1cdfbSStephan Mueller } 185764d1cdfbSStephan Mueller 185864d1cdfbSStephan Mueller drbg_string_fill(&addtl, test->addtla, test->addtllen); 185964d1cdfbSStephan Mueller if (pr) { 186064d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entpra, test->entprlen); 186164d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl_test(drng, 186264d1cdfbSStephan Mueller buf, test->expectedlen, &addtl, &test_data); 186364d1cdfbSStephan Mueller } else { 186464d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl(drng, 186564d1cdfbSStephan Mueller buf, test->expectedlen, &addtl); 186664d1cdfbSStephan Mueller } 186719e60e13SStephan Mueller if (ret < 0) { 186864d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not obtain random data for " 186964d1cdfbSStephan Mueller "driver %s\n", driver); 187064d1cdfbSStephan Mueller goto outbuf; 187164d1cdfbSStephan Mueller } 187264d1cdfbSStephan Mueller 187364d1cdfbSStephan Mueller drbg_string_fill(&addtl, test->addtlb, test->addtllen); 187464d1cdfbSStephan Mueller if (pr) { 187564d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entprb, test->entprlen); 187664d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl_test(drng, 187764d1cdfbSStephan Mueller buf, test->expectedlen, &addtl, &test_data); 187864d1cdfbSStephan Mueller } else { 187964d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl(drng, 188064d1cdfbSStephan Mueller buf, test->expectedlen, &addtl); 188164d1cdfbSStephan Mueller } 188219e60e13SStephan Mueller if (ret < 0) { 188364d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not obtain random data for " 188464d1cdfbSStephan Mueller "driver %s\n", driver); 188564d1cdfbSStephan Mueller goto outbuf; 188664d1cdfbSStephan Mueller } 188764d1cdfbSStephan Mueller 188864d1cdfbSStephan Mueller ret = memcmp(test->expected, buf, test->expectedlen); 188964d1cdfbSStephan Mueller 189064d1cdfbSStephan Mueller outbuf: 189164d1cdfbSStephan Mueller crypto_free_rng(drng); 189264d1cdfbSStephan Mueller kzfree(buf); 189364d1cdfbSStephan Mueller return ret; 189464d1cdfbSStephan Mueller } 189564d1cdfbSStephan Mueller 189664d1cdfbSStephan Mueller 189764d1cdfbSStephan Mueller static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver, 189864d1cdfbSStephan Mueller u32 type, u32 mask) 189964d1cdfbSStephan Mueller { 190064d1cdfbSStephan Mueller int err = 0; 190164d1cdfbSStephan Mueller int pr = 0; 190264d1cdfbSStephan Mueller int i = 0; 1903b13b1e0cSEric Biggers const struct drbg_testvec *template = desc->suite.drbg.vecs; 190464d1cdfbSStephan Mueller unsigned int tcount = desc->suite.drbg.count; 190564d1cdfbSStephan Mueller 190664d1cdfbSStephan Mueller if (0 == memcmp(driver, "drbg_pr_", 8)) 190764d1cdfbSStephan Mueller pr = 1; 190864d1cdfbSStephan Mueller 190964d1cdfbSStephan Mueller for (i = 0; i < tcount; i++) { 191064d1cdfbSStephan Mueller err = drbg_cavs_test(&template[i], pr, driver, type, mask); 191164d1cdfbSStephan Mueller if (err) { 191264d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: Test %d failed for %s\n", 191364d1cdfbSStephan Mueller i, driver); 191464d1cdfbSStephan Mueller err = -EINVAL; 191564d1cdfbSStephan Mueller break; 191664d1cdfbSStephan Mueller } 191764d1cdfbSStephan Mueller } 191864d1cdfbSStephan Mueller return err; 191964d1cdfbSStephan Mueller 192064d1cdfbSStephan Mueller } 192164d1cdfbSStephan Mueller 1922b13b1e0cSEric Biggers static int do_test_kpp(struct crypto_kpp *tfm, const struct kpp_testvec *vec, 1923802c7f1cSSalvatore Benedetto const char *alg) 1924802c7f1cSSalvatore Benedetto { 1925802c7f1cSSalvatore Benedetto struct kpp_request *req; 1926802c7f1cSSalvatore Benedetto void *input_buf = NULL; 1927802c7f1cSSalvatore Benedetto void *output_buf = NULL; 192847d3fd39STudor-Dan Ambarus void *a_public = NULL; 192947d3fd39STudor-Dan Ambarus void *a_ss = NULL; 193047d3fd39STudor-Dan Ambarus void *shared_secret = NULL; 19317f397136SGilad Ben-Yossef struct crypto_wait wait; 1932802c7f1cSSalvatore Benedetto unsigned int out_len_max; 1933802c7f1cSSalvatore Benedetto int err = -ENOMEM; 1934802c7f1cSSalvatore Benedetto struct scatterlist src, dst; 1935802c7f1cSSalvatore Benedetto 1936802c7f1cSSalvatore Benedetto req = kpp_request_alloc(tfm, GFP_KERNEL); 1937802c7f1cSSalvatore Benedetto if (!req) 1938802c7f1cSSalvatore Benedetto return err; 1939802c7f1cSSalvatore Benedetto 19407f397136SGilad Ben-Yossef crypto_init_wait(&wait); 1941802c7f1cSSalvatore Benedetto 1942802c7f1cSSalvatore Benedetto err = crypto_kpp_set_secret(tfm, vec->secret, vec->secret_size); 1943802c7f1cSSalvatore Benedetto if (err < 0) 1944802c7f1cSSalvatore Benedetto goto free_req; 1945802c7f1cSSalvatore Benedetto 1946802c7f1cSSalvatore Benedetto out_len_max = crypto_kpp_maxsize(tfm); 1947802c7f1cSSalvatore Benedetto output_buf = kzalloc(out_len_max, GFP_KERNEL); 1948802c7f1cSSalvatore Benedetto if (!output_buf) { 1949802c7f1cSSalvatore Benedetto err = -ENOMEM; 1950802c7f1cSSalvatore Benedetto goto free_req; 1951802c7f1cSSalvatore Benedetto } 1952802c7f1cSSalvatore Benedetto 1953802c7f1cSSalvatore Benedetto /* Use appropriate parameter as base */ 1954802c7f1cSSalvatore Benedetto kpp_request_set_input(req, NULL, 0); 1955802c7f1cSSalvatore Benedetto sg_init_one(&dst, output_buf, out_len_max); 1956802c7f1cSSalvatore Benedetto kpp_request_set_output(req, &dst, out_len_max); 1957802c7f1cSSalvatore Benedetto kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 19587f397136SGilad Ben-Yossef crypto_req_done, &wait); 1959802c7f1cSSalvatore Benedetto 196047d3fd39STudor-Dan Ambarus /* Compute party A's public key */ 19617f397136SGilad Ben-Yossef err = crypto_wait_req(crypto_kpp_generate_public_key(req), &wait); 1962802c7f1cSSalvatore Benedetto if (err) { 196347d3fd39STudor-Dan Ambarus pr_err("alg: %s: Party A: generate public key test failed. err %d\n", 1964802c7f1cSSalvatore Benedetto alg, err); 1965802c7f1cSSalvatore Benedetto goto free_output; 1966802c7f1cSSalvatore Benedetto } 196747d3fd39STudor-Dan Ambarus 196847d3fd39STudor-Dan Ambarus if (vec->genkey) { 196947d3fd39STudor-Dan Ambarus /* Save party A's public key */ 197047d3fd39STudor-Dan Ambarus a_public = kzalloc(out_len_max, GFP_KERNEL); 197147d3fd39STudor-Dan Ambarus if (!a_public) { 197247d3fd39STudor-Dan Ambarus err = -ENOMEM; 197347d3fd39STudor-Dan Ambarus goto free_output; 197447d3fd39STudor-Dan Ambarus } 197547d3fd39STudor-Dan Ambarus memcpy(a_public, sg_virt(req->dst), out_len_max); 197647d3fd39STudor-Dan Ambarus } else { 1977802c7f1cSSalvatore Benedetto /* Verify calculated public key */ 1978802c7f1cSSalvatore Benedetto if (memcmp(vec->expected_a_public, sg_virt(req->dst), 1979802c7f1cSSalvatore Benedetto vec->expected_a_public_size)) { 198047d3fd39STudor-Dan Ambarus pr_err("alg: %s: Party A: generate public key test failed. Invalid output\n", 1981802c7f1cSSalvatore Benedetto alg); 1982802c7f1cSSalvatore Benedetto err = -EINVAL; 1983802c7f1cSSalvatore Benedetto goto free_output; 1984802c7f1cSSalvatore Benedetto } 198547d3fd39STudor-Dan Ambarus } 1986802c7f1cSSalvatore Benedetto 1987802c7f1cSSalvatore Benedetto /* Calculate shared secret key by using counter part (b) public key. */ 1988802c7f1cSSalvatore Benedetto input_buf = kzalloc(vec->b_public_size, GFP_KERNEL); 1989802c7f1cSSalvatore Benedetto if (!input_buf) { 1990802c7f1cSSalvatore Benedetto err = -ENOMEM; 1991802c7f1cSSalvatore Benedetto goto free_output; 1992802c7f1cSSalvatore Benedetto } 1993802c7f1cSSalvatore Benedetto 1994802c7f1cSSalvatore Benedetto memcpy(input_buf, vec->b_public, vec->b_public_size); 1995802c7f1cSSalvatore Benedetto sg_init_one(&src, input_buf, vec->b_public_size); 1996802c7f1cSSalvatore Benedetto sg_init_one(&dst, output_buf, out_len_max); 1997802c7f1cSSalvatore Benedetto kpp_request_set_input(req, &src, vec->b_public_size); 1998802c7f1cSSalvatore Benedetto kpp_request_set_output(req, &dst, out_len_max); 1999802c7f1cSSalvatore Benedetto kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 20007f397136SGilad Ben-Yossef crypto_req_done, &wait); 20017f397136SGilad Ben-Yossef err = crypto_wait_req(crypto_kpp_compute_shared_secret(req), &wait); 2002802c7f1cSSalvatore Benedetto if (err) { 200347d3fd39STudor-Dan Ambarus pr_err("alg: %s: Party A: compute shared secret test failed. err %d\n", 2004802c7f1cSSalvatore Benedetto alg, err); 2005802c7f1cSSalvatore Benedetto goto free_all; 2006802c7f1cSSalvatore Benedetto } 200747d3fd39STudor-Dan Ambarus 200847d3fd39STudor-Dan Ambarus if (vec->genkey) { 200947d3fd39STudor-Dan Ambarus /* Save the shared secret obtained by party A */ 201047d3fd39STudor-Dan Ambarus a_ss = kzalloc(vec->expected_ss_size, GFP_KERNEL); 201147d3fd39STudor-Dan Ambarus if (!a_ss) { 201247d3fd39STudor-Dan Ambarus err = -ENOMEM; 201347d3fd39STudor-Dan Ambarus goto free_all; 201447d3fd39STudor-Dan Ambarus } 201547d3fd39STudor-Dan Ambarus memcpy(a_ss, sg_virt(req->dst), vec->expected_ss_size); 201647d3fd39STudor-Dan Ambarus 201747d3fd39STudor-Dan Ambarus /* 201847d3fd39STudor-Dan Ambarus * Calculate party B's shared secret by using party A's 201947d3fd39STudor-Dan Ambarus * public key. 202047d3fd39STudor-Dan Ambarus */ 202147d3fd39STudor-Dan Ambarus err = crypto_kpp_set_secret(tfm, vec->b_secret, 202247d3fd39STudor-Dan Ambarus vec->b_secret_size); 202347d3fd39STudor-Dan Ambarus if (err < 0) 202447d3fd39STudor-Dan Ambarus goto free_all; 202547d3fd39STudor-Dan Ambarus 202647d3fd39STudor-Dan Ambarus sg_init_one(&src, a_public, vec->expected_a_public_size); 202747d3fd39STudor-Dan Ambarus sg_init_one(&dst, output_buf, out_len_max); 202847d3fd39STudor-Dan Ambarus kpp_request_set_input(req, &src, vec->expected_a_public_size); 202947d3fd39STudor-Dan Ambarus kpp_request_set_output(req, &dst, out_len_max); 203047d3fd39STudor-Dan Ambarus kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 20317f397136SGilad Ben-Yossef crypto_req_done, &wait); 20327f397136SGilad Ben-Yossef err = crypto_wait_req(crypto_kpp_compute_shared_secret(req), 20337f397136SGilad Ben-Yossef &wait); 203447d3fd39STudor-Dan Ambarus if (err) { 203547d3fd39STudor-Dan Ambarus pr_err("alg: %s: Party B: compute shared secret failed. err %d\n", 203647d3fd39STudor-Dan Ambarus alg, err); 203747d3fd39STudor-Dan Ambarus goto free_all; 203847d3fd39STudor-Dan Ambarus } 203947d3fd39STudor-Dan Ambarus 204047d3fd39STudor-Dan Ambarus shared_secret = a_ss; 204147d3fd39STudor-Dan Ambarus } else { 204247d3fd39STudor-Dan Ambarus shared_secret = (void *)vec->expected_ss; 204347d3fd39STudor-Dan Ambarus } 204447d3fd39STudor-Dan Ambarus 2045802c7f1cSSalvatore Benedetto /* 2046802c7f1cSSalvatore Benedetto * verify shared secret from which the user will derive 2047802c7f1cSSalvatore Benedetto * secret key by executing whatever hash it has chosen 2048802c7f1cSSalvatore Benedetto */ 204947d3fd39STudor-Dan Ambarus if (memcmp(shared_secret, sg_virt(req->dst), 2050802c7f1cSSalvatore Benedetto vec->expected_ss_size)) { 2051802c7f1cSSalvatore Benedetto pr_err("alg: %s: compute shared secret test failed. Invalid output\n", 2052802c7f1cSSalvatore Benedetto alg); 2053802c7f1cSSalvatore Benedetto err = -EINVAL; 2054802c7f1cSSalvatore Benedetto } 2055802c7f1cSSalvatore Benedetto 2056802c7f1cSSalvatore Benedetto free_all: 205747d3fd39STudor-Dan Ambarus kfree(a_ss); 2058802c7f1cSSalvatore Benedetto kfree(input_buf); 2059802c7f1cSSalvatore Benedetto free_output: 206047d3fd39STudor-Dan Ambarus kfree(a_public); 2061802c7f1cSSalvatore Benedetto kfree(output_buf); 2062802c7f1cSSalvatore Benedetto free_req: 2063802c7f1cSSalvatore Benedetto kpp_request_free(req); 2064802c7f1cSSalvatore Benedetto return err; 2065802c7f1cSSalvatore Benedetto } 2066802c7f1cSSalvatore Benedetto 2067802c7f1cSSalvatore Benedetto static int test_kpp(struct crypto_kpp *tfm, const char *alg, 2068b13b1e0cSEric Biggers const struct kpp_testvec *vecs, unsigned int tcount) 2069802c7f1cSSalvatore Benedetto { 2070802c7f1cSSalvatore Benedetto int ret, i; 2071802c7f1cSSalvatore Benedetto 2072802c7f1cSSalvatore Benedetto for (i = 0; i < tcount; i++) { 2073802c7f1cSSalvatore Benedetto ret = do_test_kpp(tfm, vecs++, alg); 2074802c7f1cSSalvatore Benedetto if (ret) { 2075802c7f1cSSalvatore Benedetto pr_err("alg: %s: test failed on vector %d, err=%d\n", 2076802c7f1cSSalvatore Benedetto alg, i + 1, ret); 2077802c7f1cSSalvatore Benedetto return ret; 2078802c7f1cSSalvatore Benedetto } 2079802c7f1cSSalvatore Benedetto } 2080802c7f1cSSalvatore Benedetto return 0; 2081802c7f1cSSalvatore Benedetto } 2082802c7f1cSSalvatore Benedetto 2083802c7f1cSSalvatore Benedetto static int alg_test_kpp(const struct alg_test_desc *desc, const char *driver, 2084802c7f1cSSalvatore Benedetto u32 type, u32 mask) 2085802c7f1cSSalvatore Benedetto { 2086802c7f1cSSalvatore Benedetto struct crypto_kpp *tfm; 2087802c7f1cSSalvatore Benedetto int err = 0; 2088802c7f1cSSalvatore Benedetto 2089eed93e0cSHerbert Xu tfm = crypto_alloc_kpp(driver, type, mask); 2090802c7f1cSSalvatore Benedetto if (IS_ERR(tfm)) { 2091802c7f1cSSalvatore Benedetto pr_err("alg: kpp: Failed to load tfm for %s: %ld\n", 2092802c7f1cSSalvatore Benedetto driver, PTR_ERR(tfm)); 2093802c7f1cSSalvatore Benedetto return PTR_ERR(tfm); 2094802c7f1cSSalvatore Benedetto } 2095802c7f1cSSalvatore Benedetto if (desc->suite.kpp.vecs) 2096802c7f1cSSalvatore Benedetto err = test_kpp(tfm, desc->alg, desc->suite.kpp.vecs, 2097802c7f1cSSalvatore Benedetto desc->suite.kpp.count); 2098802c7f1cSSalvatore Benedetto 2099802c7f1cSSalvatore Benedetto crypto_free_kpp(tfm); 2100802c7f1cSSalvatore Benedetto return err; 2101802c7f1cSSalvatore Benedetto } 2102802c7f1cSSalvatore Benedetto 210350d2b643SHerbert Xu static int test_akcipher_one(struct crypto_akcipher *tfm, 2104b13b1e0cSEric Biggers const struct akcipher_testvec *vecs) 2105946cc463STadeusz Struk { 2106df27b26fSHerbert Xu char *xbuf[XBUFSIZE]; 2107946cc463STadeusz Struk struct akcipher_request *req; 2108946cc463STadeusz Struk void *outbuf_enc = NULL; 2109946cc463STadeusz Struk void *outbuf_dec = NULL; 21107f397136SGilad Ben-Yossef struct crypto_wait wait; 2111946cc463STadeusz Struk unsigned int out_len_max, out_len = 0; 2112946cc463STadeusz Struk int err = -ENOMEM; 211322287b0bSTadeusz Struk struct scatterlist src, dst, src_tab[2]; 2114946cc463STadeusz Struk 2115df27b26fSHerbert Xu if (testmgr_alloc_buf(xbuf)) 2116df27b26fSHerbert Xu return err; 2117df27b26fSHerbert Xu 2118946cc463STadeusz Struk req = akcipher_request_alloc(tfm, GFP_KERNEL); 2119946cc463STadeusz Struk if (!req) 2120df27b26fSHerbert Xu goto free_xbuf; 2121946cc463STadeusz Struk 21227f397136SGilad Ben-Yossef crypto_init_wait(&wait); 212322287b0bSTadeusz Struk 212422287b0bSTadeusz Struk if (vecs->public_key_vec) 212522287b0bSTadeusz Struk err = crypto_akcipher_set_pub_key(tfm, vecs->key, 212622287b0bSTadeusz Struk vecs->key_len); 212722287b0bSTadeusz Struk else 212822287b0bSTadeusz Struk err = crypto_akcipher_set_priv_key(tfm, vecs->key, 212922287b0bSTadeusz Struk vecs->key_len); 2130946cc463STadeusz Struk if (err) 2131946cc463STadeusz Struk goto free_req; 2132946cc463STadeusz Struk 213357763f5eSSalvatore Benedetto err = -ENOMEM; 213422287b0bSTadeusz Struk out_len_max = crypto_akcipher_maxsize(tfm); 2135946cc463STadeusz Struk outbuf_enc = kzalloc(out_len_max, GFP_KERNEL); 2136946cc463STadeusz Struk if (!outbuf_enc) 2137946cc463STadeusz Struk goto free_req; 2138946cc463STadeusz Struk 2139df27b26fSHerbert Xu if (WARN_ON(vecs->m_size > PAGE_SIZE)) 2140df27b26fSHerbert Xu goto free_all; 2141df27b26fSHerbert Xu 2142df27b26fSHerbert Xu memcpy(xbuf[0], vecs->m, vecs->m_size); 2143df27b26fSHerbert Xu 214422287b0bSTadeusz Struk sg_init_table(src_tab, 2); 2145df27b26fSHerbert Xu sg_set_buf(&src_tab[0], xbuf[0], 8); 2146df27b26fSHerbert Xu sg_set_buf(&src_tab[1], xbuf[0] + 8, vecs->m_size - 8); 214722287b0bSTadeusz Struk sg_init_one(&dst, outbuf_enc, out_len_max); 214822287b0bSTadeusz Struk akcipher_request_set_crypt(req, src_tab, &dst, vecs->m_size, 214922287b0bSTadeusz Struk out_len_max); 2150946cc463STadeusz Struk akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 21517f397136SGilad Ben-Yossef crypto_req_done, &wait); 2152946cc463STadeusz Struk 21537f397136SGilad Ben-Yossef err = crypto_wait_req(vecs->siggen_sigver_test ? 21541207107cSStephan Mueller /* Run asymmetric signature generation */ 21551207107cSStephan Mueller crypto_akcipher_sign(req) : 21561207107cSStephan Mueller /* Run asymmetric encrypt */ 21577f397136SGilad Ben-Yossef crypto_akcipher_encrypt(req), &wait); 2158946cc463STadeusz Struk if (err) { 215950d2b643SHerbert Xu pr_err("alg: akcipher: encrypt test failed. err %d\n", err); 2160946cc463STadeusz Struk goto free_all; 2161946cc463STadeusz Struk } 216222287b0bSTadeusz Struk if (req->dst_len != vecs->c_size) { 216350d2b643SHerbert Xu pr_err("alg: akcipher: encrypt test failed. Invalid output len\n"); 2164946cc463STadeusz Struk err = -EINVAL; 2165946cc463STadeusz Struk goto free_all; 2166946cc463STadeusz Struk } 2167946cc463STadeusz Struk /* verify that encrypted message is equal to expected */ 2168df27b26fSHerbert Xu if (memcmp(vecs->c, outbuf_enc, vecs->c_size)) { 216950d2b643SHerbert Xu pr_err("alg: akcipher: encrypt test failed. Invalid output\n"); 217050d2b643SHerbert Xu hexdump(outbuf_enc, vecs->c_size); 2171946cc463STadeusz Struk err = -EINVAL; 2172946cc463STadeusz Struk goto free_all; 2173946cc463STadeusz Struk } 2174946cc463STadeusz Struk /* Don't invoke decrypt for vectors with public key */ 2175946cc463STadeusz Struk if (vecs->public_key_vec) { 2176946cc463STadeusz Struk err = 0; 2177946cc463STadeusz Struk goto free_all; 2178946cc463STadeusz Struk } 2179946cc463STadeusz Struk outbuf_dec = kzalloc(out_len_max, GFP_KERNEL); 2180946cc463STadeusz Struk if (!outbuf_dec) { 2181946cc463STadeusz Struk err = -ENOMEM; 2182946cc463STadeusz Struk goto free_all; 2183946cc463STadeusz Struk } 2184df27b26fSHerbert Xu 2185df27b26fSHerbert Xu if (WARN_ON(vecs->c_size > PAGE_SIZE)) 2186df27b26fSHerbert Xu goto free_all; 2187df27b26fSHerbert Xu 2188df27b26fSHerbert Xu memcpy(xbuf[0], vecs->c, vecs->c_size); 2189df27b26fSHerbert Xu 2190df27b26fSHerbert Xu sg_init_one(&src, xbuf[0], vecs->c_size); 219122287b0bSTadeusz Struk sg_init_one(&dst, outbuf_dec, out_len_max); 21927f397136SGilad Ben-Yossef crypto_init_wait(&wait); 219322287b0bSTadeusz Struk akcipher_request_set_crypt(req, &src, &dst, vecs->c_size, out_len_max); 2194946cc463STadeusz Struk 21957f397136SGilad Ben-Yossef err = crypto_wait_req(vecs->siggen_sigver_test ? 21961207107cSStephan Mueller /* Run asymmetric signature verification */ 21971207107cSStephan Mueller crypto_akcipher_verify(req) : 21981207107cSStephan Mueller /* Run asymmetric decrypt */ 21997f397136SGilad Ben-Yossef crypto_akcipher_decrypt(req), &wait); 2200946cc463STadeusz Struk if (err) { 220150d2b643SHerbert Xu pr_err("alg: akcipher: decrypt test failed. err %d\n", err); 2202946cc463STadeusz Struk goto free_all; 2203946cc463STadeusz Struk } 2204946cc463STadeusz Struk out_len = req->dst_len; 220550d2b643SHerbert Xu if (out_len < vecs->m_size) { 220650d2b643SHerbert Xu pr_err("alg: akcipher: decrypt test failed. " 220750d2b643SHerbert Xu "Invalid output len %u\n", out_len); 2208946cc463STadeusz Struk err = -EINVAL; 2209946cc463STadeusz Struk goto free_all; 2210946cc463STadeusz Struk } 2211946cc463STadeusz Struk /* verify that decrypted message is equal to the original msg */ 221250d2b643SHerbert Xu if (memchr_inv(outbuf_dec, 0, out_len - vecs->m_size) || 221350d2b643SHerbert Xu memcmp(vecs->m, outbuf_dec + out_len - vecs->m_size, 221450d2b643SHerbert Xu vecs->m_size)) { 221550d2b643SHerbert Xu pr_err("alg: akcipher: decrypt test failed. Invalid output\n"); 221650d2b643SHerbert Xu hexdump(outbuf_dec, out_len); 2217946cc463STadeusz Struk err = -EINVAL; 2218946cc463STadeusz Struk } 2219946cc463STadeusz Struk free_all: 2220946cc463STadeusz Struk kfree(outbuf_dec); 2221946cc463STadeusz Struk kfree(outbuf_enc); 2222946cc463STadeusz Struk free_req: 2223946cc463STadeusz Struk akcipher_request_free(req); 2224df27b26fSHerbert Xu free_xbuf: 2225df27b26fSHerbert Xu testmgr_free_buf(xbuf); 2226946cc463STadeusz Struk return err; 2227946cc463STadeusz Struk } 2228946cc463STadeusz Struk 222950d2b643SHerbert Xu static int test_akcipher(struct crypto_akcipher *tfm, const char *alg, 2230b13b1e0cSEric Biggers const struct akcipher_testvec *vecs, 2231b13b1e0cSEric Biggers unsigned int tcount) 2232946cc463STadeusz Struk { 223315226e48SHerbert Xu const char *algo = 223415226e48SHerbert Xu crypto_tfm_alg_driver_name(crypto_akcipher_tfm(tfm)); 2235946cc463STadeusz Struk int ret, i; 2236946cc463STadeusz Struk 2237946cc463STadeusz Struk for (i = 0; i < tcount; i++) { 223850d2b643SHerbert Xu ret = test_akcipher_one(tfm, vecs++); 223950d2b643SHerbert Xu if (!ret) 224050d2b643SHerbert Xu continue; 224150d2b643SHerbert Xu 224215226e48SHerbert Xu pr_err("alg: akcipher: test %d failed for %s, err=%d\n", 224315226e48SHerbert Xu i + 1, algo, ret); 2244946cc463STadeusz Struk return ret; 2245946cc463STadeusz Struk } 2246946cc463STadeusz Struk return 0; 2247946cc463STadeusz Struk } 2248946cc463STadeusz Struk 2249946cc463STadeusz Struk static int alg_test_akcipher(const struct alg_test_desc *desc, 2250946cc463STadeusz Struk const char *driver, u32 type, u32 mask) 2251946cc463STadeusz Struk { 2252946cc463STadeusz Struk struct crypto_akcipher *tfm; 2253946cc463STadeusz Struk int err = 0; 2254946cc463STadeusz Struk 2255eed93e0cSHerbert Xu tfm = crypto_alloc_akcipher(driver, type, mask); 2256946cc463STadeusz Struk if (IS_ERR(tfm)) { 2257946cc463STadeusz Struk pr_err("alg: akcipher: Failed to load tfm for %s: %ld\n", 2258946cc463STadeusz Struk driver, PTR_ERR(tfm)); 2259946cc463STadeusz Struk return PTR_ERR(tfm); 2260946cc463STadeusz Struk } 2261946cc463STadeusz Struk if (desc->suite.akcipher.vecs) 2262946cc463STadeusz Struk err = test_akcipher(tfm, desc->alg, desc->suite.akcipher.vecs, 2263946cc463STadeusz Struk desc->suite.akcipher.count); 2264946cc463STadeusz Struk 2265946cc463STadeusz Struk crypto_free_akcipher(tfm); 2266946cc463STadeusz Struk return err; 2267946cc463STadeusz Struk } 2268946cc463STadeusz Struk 2269863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc, 2270863b557aSYouquan, Song const char *driver, u32 type, u32 mask) 2271863b557aSYouquan, Song { 2272863b557aSYouquan, Song return 0; 2273863b557aSYouquan, Song } 2274863b557aSYouquan, Song 227521c8e720SArd Biesheuvel #define __VECS(tv) { .vecs = tv, .count = ARRAY_SIZE(tv) } 227621c8e720SArd Biesheuvel 2277da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */ 2278da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = { 2279da7f033dSHerbert Xu { 2280e08ca2daSJarod Wilson .alg = "ansi_cprng", 2281e08ca2daSJarod Wilson .test = alg_test_cprng, 2282e08ca2daSJarod Wilson .suite = { 228321c8e720SArd Biesheuvel .cprng = __VECS(ansi_cprng_aes_tv_template) 2284e08ca2daSJarod Wilson } 2285e08ca2daSJarod Wilson }, { 2286bca4feb0SHoria Geanta .alg = "authenc(hmac(md5),ecb(cipher_null))", 2287bca4feb0SHoria Geanta .test = alg_test_aead, 2288bca4feb0SHoria Geanta .suite = { 2289bca4feb0SHoria Geanta .aead = { 229021c8e720SArd Biesheuvel .enc = __VECS(hmac_md5_ecb_cipher_null_enc_tv_template), 229121c8e720SArd Biesheuvel .dec = __VECS(hmac_md5_ecb_cipher_null_dec_tv_template) 2292bca4feb0SHoria Geanta } 2293bca4feb0SHoria Geanta } 2294bca4feb0SHoria Geanta }, { 2295a4198fd4SHerbert Xu .alg = "authenc(hmac(sha1),cbc(aes))", 2296e46e9a46SHoria Geanta .test = alg_test_aead, 2297bcf741cbSHerbert Xu .fips_allowed = 1, 2298e46e9a46SHoria Geanta .suite = { 2299e46e9a46SHoria Geanta .aead = { 230021c8e720SArd Biesheuvel .enc = __VECS(hmac_sha1_aes_cbc_enc_tv_temp) 23015208ed2cSNitesh Lal } 23025208ed2cSNitesh Lal } 23035208ed2cSNitesh Lal }, { 2304a4198fd4SHerbert Xu .alg = "authenc(hmac(sha1),cbc(des))", 23055208ed2cSNitesh Lal .test = alg_test_aead, 23065208ed2cSNitesh Lal .suite = { 23075208ed2cSNitesh Lal .aead = { 230821c8e720SArd Biesheuvel .enc = __VECS(hmac_sha1_des_cbc_enc_tv_temp) 23095208ed2cSNitesh Lal } 23105208ed2cSNitesh Lal } 23115208ed2cSNitesh Lal }, { 2312a4198fd4SHerbert Xu .alg = "authenc(hmac(sha1),cbc(des3_ede))", 23135208ed2cSNitesh Lal .test = alg_test_aead, 2314ed1afac9SMarcus Meissner .fips_allowed = 1, 23155208ed2cSNitesh Lal .suite = { 23165208ed2cSNitesh Lal .aead = { 231721c8e720SArd Biesheuvel .enc = __VECS(hmac_sha1_des3_ede_cbc_enc_tv_temp) 2318e46e9a46SHoria Geanta } 2319e46e9a46SHoria Geanta } 2320e46e9a46SHoria Geanta }, { 2321fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha1),ctr(aes))", 2322fb16abc2SMarcus Meissner .test = alg_test_null, 2323fb16abc2SMarcus Meissner .fips_allowed = 1, 2324fb16abc2SMarcus Meissner }, { 2325bca4feb0SHoria Geanta .alg = "authenc(hmac(sha1),ecb(cipher_null))", 2326bca4feb0SHoria Geanta .test = alg_test_aead, 2327bca4feb0SHoria Geanta .suite = { 2328bca4feb0SHoria Geanta .aead = { 232921c8e720SArd Biesheuvel .enc = __VECS(hmac_sha1_ecb_cipher_null_enc_tv_temp), 233021c8e720SArd Biesheuvel .dec = __VECS(hmac_sha1_ecb_cipher_null_dec_tv_temp) 23315208ed2cSNitesh Lal } 23325208ed2cSNitesh Lal } 23335208ed2cSNitesh Lal }, { 23348888690eSMarcus Meissner .alg = "authenc(hmac(sha1),rfc3686(ctr(aes)))", 23358888690eSMarcus Meissner .test = alg_test_null, 23368888690eSMarcus Meissner .fips_allowed = 1, 23378888690eSMarcus Meissner }, { 2338a4198fd4SHerbert Xu .alg = "authenc(hmac(sha224),cbc(des))", 23395208ed2cSNitesh Lal .test = alg_test_aead, 23405208ed2cSNitesh Lal .suite = { 23415208ed2cSNitesh Lal .aead = { 234221c8e720SArd Biesheuvel .enc = __VECS(hmac_sha224_des_cbc_enc_tv_temp) 23435208ed2cSNitesh Lal } 23445208ed2cSNitesh Lal } 23455208ed2cSNitesh Lal }, { 2346a4198fd4SHerbert Xu .alg = "authenc(hmac(sha224),cbc(des3_ede))", 23475208ed2cSNitesh Lal .test = alg_test_aead, 2348ed1afac9SMarcus Meissner .fips_allowed = 1, 23495208ed2cSNitesh Lal .suite = { 23505208ed2cSNitesh Lal .aead = { 235121c8e720SArd Biesheuvel .enc = __VECS(hmac_sha224_des3_ede_cbc_enc_tv_temp) 2352bca4feb0SHoria Geanta } 2353bca4feb0SHoria Geanta } 2354bca4feb0SHoria Geanta }, { 2355a4198fd4SHerbert Xu .alg = "authenc(hmac(sha256),cbc(aes))", 2356e46e9a46SHoria Geanta .test = alg_test_aead, 2357ed1afac9SMarcus Meissner .fips_allowed = 1, 2358e46e9a46SHoria Geanta .suite = { 2359e46e9a46SHoria Geanta .aead = { 236021c8e720SArd Biesheuvel .enc = __VECS(hmac_sha256_aes_cbc_enc_tv_temp) 23615208ed2cSNitesh Lal } 23625208ed2cSNitesh Lal } 23635208ed2cSNitesh Lal }, { 2364a4198fd4SHerbert Xu .alg = "authenc(hmac(sha256),cbc(des))", 23655208ed2cSNitesh Lal .test = alg_test_aead, 23665208ed2cSNitesh Lal .suite = { 23675208ed2cSNitesh Lal .aead = { 236821c8e720SArd Biesheuvel .enc = __VECS(hmac_sha256_des_cbc_enc_tv_temp) 23695208ed2cSNitesh Lal } 23705208ed2cSNitesh Lal } 23715208ed2cSNitesh Lal }, { 2372a4198fd4SHerbert Xu .alg = "authenc(hmac(sha256),cbc(des3_ede))", 23735208ed2cSNitesh Lal .test = alg_test_aead, 2374ed1afac9SMarcus Meissner .fips_allowed = 1, 23755208ed2cSNitesh Lal .suite = { 23765208ed2cSNitesh Lal .aead = { 237721c8e720SArd Biesheuvel .enc = __VECS(hmac_sha256_des3_ede_cbc_enc_tv_temp) 23785208ed2cSNitesh Lal } 23795208ed2cSNitesh Lal } 23805208ed2cSNitesh Lal }, { 2381fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha256),ctr(aes))", 2382fb16abc2SMarcus Meissner .test = alg_test_null, 2383fb16abc2SMarcus Meissner .fips_allowed = 1, 2384fb16abc2SMarcus Meissner }, { 23858888690eSMarcus Meissner .alg = "authenc(hmac(sha256),rfc3686(ctr(aes)))", 23868888690eSMarcus Meissner .test = alg_test_null, 23878888690eSMarcus Meissner .fips_allowed = 1, 23888888690eSMarcus Meissner }, { 2389a4198fd4SHerbert Xu .alg = "authenc(hmac(sha384),cbc(des))", 23905208ed2cSNitesh Lal .test = alg_test_aead, 23915208ed2cSNitesh Lal .suite = { 23925208ed2cSNitesh Lal .aead = { 239321c8e720SArd Biesheuvel .enc = __VECS(hmac_sha384_des_cbc_enc_tv_temp) 23945208ed2cSNitesh Lal } 23955208ed2cSNitesh Lal } 23965208ed2cSNitesh Lal }, { 2397a4198fd4SHerbert Xu .alg = "authenc(hmac(sha384),cbc(des3_ede))", 23985208ed2cSNitesh Lal .test = alg_test_aead, 2399ed1afac9SMarcus Meissner .fips_allowed = 1, 24005208ed2cSNitesh Lal .suite = { 24015208ed2cSNitesh Lal .aead = { 240221c8e720SArd Biesheuvel .enc = __VECS(hmac_sha384_des3_ede_cbc_enc_tv_temp) 2403e46e9a46SHoria Geanta } 2404e46e9a46SHoria Geanta } 2405e46e9a46SHoria Geanta }, { 2406fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha384),ctr(aes))", 2407fb16abc2SMarcus Meissner .test = alg_test_null, 2408fb16abc2SMarcus Meissner .fips_allowed = 1, 2409fb16abc2SMarcus Meissner }, { 24108888690eSMarcus Meissner .alg = "authenc(hmac(sha384),rfc3686(ctr(aes)))", 24118888690eSMarcus Meissner .test = alg_test_null, 24128888690eSMarcus Meissner .fips_allowed = 1, 24138888690eSMarcus Meissner }, { 2414a4198fd4SHerbert Xu .alg = "authenc(hmac(sha512),cbc(aes))", 2415ed1afac9SMarcus Meissner .fips_allowed = 1, 2416e46e9a46SHoria Geanta .test = alg_test_aead, 2417e46e9a46SHoria Geanta .suite = { 2418e46e9a46SHoria Geanta .aead = { 241921c8e720SArd Biesheuvel .enc = __VECS(hmac_sha512_aes_cbc_enc_tv_temp) 24205208ed2cSNitesh Lal } 24215208ed2cSNitesh Lal } 24225208ed2cSNitesh Lal }, { 2423a4198fd4SHerbert Xu .alg = "authenc(hmac(sha512),cbc(des))", 24245208ed2cSNitesh Lal .test = alg_test_aead, 24255208ed2cSNitesh Lal .suite = { 24265208ed2cSNitesh Lal .aead = { 242721c8e720SArd Biesheuvel .enc = __VECS(hmac_sha512_des_cbc_enc_tv_temp) 24285208ed2cSNitesh Lal } 24295208ed2cSNitesh Lal } 24305208ed2cSNitesh Lal }, { 2431a4198fd4SHerbert Xu .alg = "authenc(hmac(sha512),cbc(des3_ede))", 24325208ed2cSNitesh Lal .test = alg_test_aead, 2433ed1afac9SMarcus Meissner .fips_allowed = 1, 24345208ed2cSNitesh Lal .suite = { 24355208ed2cSNitesh Lal .aead = { 243621c8e720SArd Biesheuvel .enc = __VECS(hmac_sha512_des3_ede_cbc_enc_tv_temp) 2437e46e9a46SHoria Geanta } 2438e46e9a46SHoria Geanta } 2439e46e9a46SHoria Geanta }, { 2440fb16abc2SMarcus Meissner .alg = "authenc(hmac(sha512),ctr(aes))", 2441fb16abc2SMarcus Meissner .test = alg_test_null, 2442fb16abc2SMarcus Meissner .fips_allowed = 1, 2443fb16abc2SMarcus Meissner }, { 24448888690eSMarcus Meissner .alg = "authenc(hmac(sha512),rfc3686(ctr(aes)))", 24458888690eSMarcus Meissner .test = alg_test_null, 24468888690eSMarcus Meissner .fips_allowed = 1, 24478888690eSMarcus Meissner }, { 2448da7f033dSHerbert Xu .alg = "cbc(aes)", 24491aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2450a1915d51SJarod Wilson .fips_allowed = 1, 2451da7f033dSHerbert Xu .suite = { 2452da7f033dSHerbert Xu .cipher = { 245321c8e720SArd Biesheuvel .enc = __VECS(aes_cbc_enc_tv_template), 245421c8e720SArd Biesheuvel .dec = __VECS(aes_cbc_dec_tv_template) 2455da7f033dSHerbert Xu } 2456da7f033dSHerbert Xu } 2457da7f033dSHerbert Xu }, { 2458da7f033dSHerbert Xu .alg = "cbc(anubis)", 24591aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2460da7f033dSHerbert Xu .suite = { 2461da7f033dSHerbert Xu .cipher = { 246221c8e720SArd Biesheuvel .enc = __VECS(anubis_cbc_enc_tv_template), 246321c8e720SArd Biesheuvel .dec = __VECS(anubis_cbc_dec_tv_template) 2464da7f033dSHerbert Xu } 2465da7f033dSHerbert Xu } 2466da7f033dSHerbert Xu }, { 2467da7f033dSHerbert Xu .alg = "cbc(blowfish)", 24681aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2469da7f033dSHerbert Xu .suite = { 2470da7f033dSHerbert Xu .cipher = { 247121c8e720SArd Biesheuvel .enc = __VECS(bf_cbc_enc_tv_template), 247221c8e720SArd Biesheuvel .dec = __VECS(bf_cbc_dec_tv_template) 2473da7f033dSHerbert Xu } 2474da7f033dSHerbert Xu } 2475da7f033dSHerbert Xu }, { 2476da7f033dSHerbert Xu .alg = "cbc(camellia)", 24771aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2478da7f033dSHerbert Xu .suite = { 2479da7f033dSHerbert Xu .cipher = { 248021c8e720SArd Biesheuvel .enc = __VECS(camellia_cbc_enc_tv_template), 248121c8e720SArd Biesheuvel .dec = __VECS(camellia_cbc_dec_tv_template) 2482da7f033dSHerbert Xu } 2483da7f033dSHerbert Xu } 2484da7f033dSHerbert Xu }, { 2485a2c58260SJohannes Goetzfried .alg = "cbc(cast5)", 2486a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 2487a2c58260SJohannes Goetzfried .suite = { 2488a2c58260SJohannes Goetzfried .cipher = { 248921c8e720SArd Biesheuvel .enc = __VECS(cast5_cbc_enc_tv_template), 249021c8e720SArd Biesheuvel .dec = __VECS(cast5_cbc_dec_tv_template) 2491a2c58260SJohannes Goetzfried } 2492a2c58260SJohannes Goetzfried } 2493a2c58260SJohannes Goetzfried }, { 24949b8b0405SJohannes Goetzfried .alg = "cbc(cast6)", 24959b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 24969b8b0405SJohannes Goetzfried .suite = { 24979b8b0405SJohannes Goetzfried .cipher = { 249821c8e720SArd Biesheuvel .enc = __VECS(cast6_cbc_enc_tv_template), 249921c8e720SArd Biesheuvel .dec = __VECS(cast6_cbc_dec_tv_template) 25009b8b0405SJohannes Goetzfried } 25019b8b0405SJohannes Goetzfried } 25029b8b0405SJohannes Goetzfried }, { 2503da7f033dSHerbert Xu .alg = "cbc(des)", 25041aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2505da7f033dSHerbert Xu .suite = { 2506da7f033dSHerbert Xu .cipher = { 250721c8e720SArd Biesheuvel .enc = __VECS(des_cbc_enc_tv_template), 250821c8e720SArd Biesheuvel .dec = __VECS(des_cbc_dec_tv_template) 2509da7f033dSHerbert Xu } 2510da7f033dSHerbert Xu } 2511da7f033dSHerbert Xu }, { 2512da7f033dSHerbert Xu .alg = "cbc(des3_ede)", 25131aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2514a1915d51SJarod Wilson .fips_allowed = 1, 2515da7f033dSHerbert Xu .suite = { 2516da7f033dSHerbert Xu .cipher = { 251721c8e720SArd Biesheuvel .enc = __VECS(des3_ede_cbc_enc_tv_template), 251821c8e720SArd Biesheuvel .dec = __VECS(des3_ede_cbc_dec_tv_template) 2519da7f033dSHerbert Xu } 2520da7f033dSHerbert Xu } 2521da7f033dSHerbert Xu }, { 25229d25917dSJussi Kivilinna .alg = "cbc(serpent)", 25239d25917dSJussi Kivilinna .test = alg_test_skcipher, 25249d25917dSJussi Kivilinna .suite = { 25259d25917dSJussi Kivilinna .cipher = { 252621c8e720SArd Biesheuvel .enc = __VECS(serpent_cbc_enc_tv_template), 252721c8e720SArd Biesheuvel .dec = __VECS(serpent_cbc_dec_tv_template) 25289d25917dSJussi Kivilinna } 25299d25917dSJussi Kivilinna } 25309d25917dSJussi Kivilinna }, { 2531da7f033dSHerbert Xu .alg = "cbc(twofish)", 25321aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2533da7f033dSHerbert Xu .suite = { 2534da7f033dSHerbert Xu .cipher = { 253521c8e720SArd Biesheuvel .enc = __VECS(tf_cbc_enc_tv_template), 253621c8e720SArd Biesheuvel .dec = __VECS(tf_cbc_dec_tv_template) 2537da7f033dSHerbert Xu } 2538da7f033dSHerbert Xu } 2539da7f033dSHerbert Xu }, { 2540092acf06SArd Biesheuvel .alg = "cbcmac(aes)", 2541092acf06SArd Biesheuvel .fips_allowed = 1, 2542092acf06SArd Biesheuvel .test = alg_test_hash, 2543092acf06SArd Biesheuvel .suite = { 2544092acf06SArd Biesheuvel .hash = __VECS(aes_cbcmac_tv_template) 2545092acf06SArd Biesheuvel } 2546092acf06SArd Biesheuvel }, { 2547da7f033dSHerbert Xu .alg = "ccm(aes)", 2548da7f033dSHerbert Xu .test = alg_test_aead, 2549a1915d51SJarod Wilson .fips_allowed = 1, 2550da7f033dSHerbert Xu .suite = { 2551da7f033dSHerbert Xu .aead = { 255221c8e720SArd Biesheuvel .enc = __VECS(aes_ccm_enc_tv_template), 255321c8e720SArd Biesheuvel .dec = __VECS(aes_ccm_dec_tv_template) 2554da7f033dSHerbert Xu } 2555da7f033dSHerbert Xu } 2556da7f033dSHerbert Xu }, { 25573590ebf2SMartin Willi .alg = "chacha20", 25583590ebf2SMartin Willi .test = alg_test_skcipher, 25593590ebf2SMartin Willi .suite = { 25603590ebf2SMartin Willi .cipher = { 256121c8e720SArd Biesheuvel .enc = __VECS(chacha20_enc_tv_template), 256221c8e720SArd Biesheuvel .dec = __VECS(chacha20_enc_tv_template), 25633590ebf2SMartin Willi } 25643590ebf2SMartin Willi } 25653590ebf2SMartin Willi }, { 256693b5e86aSJussi Kivilinna .alg = "cmac(aes)", 25678f183751SStephan Mueller .fips_allowed = 1, 256893b5e86aSJussi Kivilinna .test = alg_test_hash, 256993b5e86aSJussi Kivilinna .suite = { 257021c8e720SArd Biesheuvel .hash = __VECS(aes_cmac128_tv_template) 257193b5e86aSJussi Kivilinna } 257293b5e86aSJussi Kivilinna }, { 257393b5e86aSJussi Kivilinna .alg = "cmac(des3_ede)", 25748f183751SStephan Mueller .fips_allowed = 1, 257593b5e86aSJussi Kivilinna .test = alg_test_hash, 257693b5e86aSJussi Kivilinna .suite = { 257721c8e720SArd Biesheuvel .hash = __VECS(des3_ede_cmac64_tv_template) 257893b5e86aSJussi Kivilinna } 257993b5e86aSJussi Kivilinna }, { 2580e448370dSJussi Kivilinna .alg = "compress_null", 2581e448370dSJussi Kivilinna .test = alg_test_null, 2582e448370dSJussi Kivilinna }, { 2583ebb3472fSArd Biesheuvel .alg = "crc32", 2584ebb3472fSArd Biesheuvel .test = alg_test_hash, 2585ebb3472fSArd Biesheuvel .suite = { 258621c8e720SArd Biesheuvel .hash = __VECS(crc32_tv_template) 2587ebb3472fSArd Biesheuvel } 2588ebb3472fSArd Biesheuvel }, { 2589da7f033dSHerbert Xu .alg = "crc32c", 25908e3ee85eSHerbert Xu .test = alg_test_crc32c, 2591a1915d51SJarod Wilson .fips_allowed = 1, 2592da7f033dSHerbert Xu .suite = { 259321c8e720SArd Biesheuvel .hash = __VECS(crc32c_tv_template) 2594da7f033dSHerbert Xu } 2595da7f033dSHerbert Xu }, { 259668411521SHerbert Xu .alg = "crct10dif", 259768411521SHerbert Xu .test = alg_test_hash, 259868411521SHerbert Xu .fips_allowed = 1, 259968411521SHerbert Xu .suite = { 260021c8e720SArd Biesheuvel .hash = __VECS(crct10dif_tv_template) 260168411521SHerbert Xu } 260268411521SHerbert Xu }, { 2603f7cb80f2SJarod Wilson .alg = "ctr(aes)", 2604f7cb80f2SJarod Wilson .test = alg_test_skcipher, 2605a1915d51SJarod Wilson .fips_allowed = 1, 2606f7cb80f2SJarod Wilson .suite = { 2607f7cb80f2SJarod Wilson .cipher = { 260821c8e720SArd Biesheuvel .enc = __VECS(aes_ctr_enc_tv_template), 260921c8e720SArd Biesheuvel .dec = __VECS(aes_ctr_dec_tv_template) 2610f7cb80f2SJarod Wilson } 2611f7cb80f2SJarod Wilson } 2612f7cb80f2SJarod Wilson }, { 261385b63e34SJussi Kivilinna .alg = "ctr(blowfish)", 261485b63e34SJussi Kivilinna .test = alg_test_skcipher, 261585b63e34SJussi Kivilinna .suite = { 261685b63e34SJussi Kivilinna .cipher = { 261721c8e720SArd Biesheuvel .enc = __VECS(bf_ctr_enc_tv_template), 261821c8e720SArd Biesheuvel .dec = __VECS(bf_ctr_dec_tv_template) 261985b63e34SJussi Kivilinna } 262085b63e34SJussi Kivilinna } 262185b63e34SJussi Kivilinna }, { 26220840605eSJussi Kivilinna .alg = "ctr(camellia)", 26230840605eSJussi Kivilinna .test = alg_test_skcipher, 26240840605eSJussi Kivilinna .suite = { 26250840605eSJussi Kivilinna .cipher = { 262621c8e720SArd Biesheuvel .enc = __VECS(camellia_ctr_enc_tv_template), 262721c8e720SArd Biesheuvel .dec = __VECS(camellia_ctr_dec_tv_template) 26280840605eSJussi Kivilinna } 26290840605eSJussi Kivilinna } 26300840605eSJussi Kivilinna }, { 2631a2c58260SJohannes Goetzfried .alg = "ctr(cast5)", 2632a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 2633a2c58260SJohannes Goetzfried .suite = { 2634a2c58260SJohannes Goetzfried .cipher = { 263521c8e720SArd Biesheuvel .enc = __VECS(cast5_ctr_enc_tv_template), 263621c8e720SArd Biesheuvel .dec = __VECS(cast5_ctr_dec_tv_template) 2637a2c58260SJohannes Goetzfried } 2638a2c58260SJohannes Goetzfried } 2639a2c58260SJohannes Goetzfried }, { 26409b8b0405SJohannes Goetzfried .alg = "ctr(cast6)", 26419b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 26429b8b0405SJohannes Goetzfried .suite = { 26439b8b0405SJohannes Goetzfried .cipher = { 264421c8e720SArd Biesheuvel .enc = __VECS(cast6_ctr_enc_tv_template), 264521c8e720SArd Biesheuvel .dec = __VECS(cast6_ctr_dec_tv_template) 26469b8b0405SJohannes Goetzfried } 26479b8b0405SJohannes Goetzfried } 26489b8b0405SJohannes Goetzfried }, { 26498163fc30SJussi Kivilinna .alg = "ctr(des)", 26508163fc30SJussi Kivilinna .test = alg_test_skcipher, 26518163fc30SJussi Kivilinna .suite = { 26528163fc30SJussi Kivilinna .cipher = { 265321c8e720SArd Biesheuvel .enc = __VECS(des_ctr_enc_tv_template), 265421c8e720SArd Biesheuvel .dec = __VECS(des_ctr_dec_tv_template) 26558163fc30SJussi Kivilinna } 26568163fc30SJussi Kivilinna } 26578163fc30SJussi Kivilinna }, { 2658e080b17aSJussi Kivilinna .alg = "ctr(des3_ede)", 2659e080b17aSJussi Kivilinna .test = alg_test_skcipher, 26600d8da104SMarcelo Cerri .fips_allowed = 1, 2661e080b17aSJussi Kivilinna .suite = { 2662e080b17aSJussi Kivilinna .cipher = { 266321c8e720SArd Biesheuvel .enc = __VECS(des3_ede_ctr_enc_tv_template), 266421c8e720SArd Biesheuvel .dec = __VECS(des3_ede_ctr_dec_tv_template) 2665e080b17aSJussi Kivilinna } 2666e080b17aSJussi Kivilinna } 2667e080b17aSJussi Kivilinna }, { 26689d25917dSJussi Kivilinna .alg = "ctr(serpent)", 26699d25917dSJussi Kivilinna .test = alg_test_skcipher, 26709d25917dSJussi Kivilinna .suite = { 26719d25917dSJussi Kivilinna .cipher = { 267221c8e720SArd Biesheuvel .enc = __VECS(serpent_ctr_enc_tv_template), 267321c8e720SArd Biesheuvel .dec = __VECS(serpent_ctr_dec_tv_template) 26749d25917dSJussi Kivilinna } 26759d25917dSJussi Kivilinna } 26769d25917dSJussi Kivilinna }, { 2677573da620SJussi Kivilinna .alg = "ctr(twofish)", 2678573da620SJussi Kivilinna .test = alg_test_skcipher, 2679573da620SJussi Kivilinna .suite = { 2680573da620SJussi Kivilinna .cipher = { 268121c8e720SArd Biesheuvel .enc = __VECS(tf_ctr_enc_tv_template), 268221c8e720SArd Biesheuvel .dec = __VECS(tf_ctr_dec_tv_template) 2683573da620SJussi Kivilinna } 2684573da620SJussi Kivilinna } 2685573da620SJussi Kivilinna }, { 2686da7f033dSHerbert Xu .alg = "cts(cbc(aes))", 26871aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2688da7f033dSHerbert Xu .suite = { 2689da7f033dSHerbert Xu .cipher = { 269021c8e720SArd Biesheuvel .enc = __VECS(cts_mode_enc_tv_template), 269121c8e720SArd Biesheuvel .dec = __VECS(cts_mode_dec_tv_template) 2692da7f033dSHerbert Xu } 2693da7f033dSHerbert Xu } 2694da7f033dSHerbert Xu }, { 2695da7f033dSHerbert Xu .alg = "deflate", 2696da7f033dSHerbert Xu .test = alg_test_comp, 26970818904dSMilan Broz .fips_allowed = 1, 2698da7f033dSHerbert Xu .suite = { 2699da7f033dSHerbert Xu .comp = { 270021c8e720SArd Biesheuvel .comp = __VECS(deflate_comp_tv_template), 270121c8e720SArd Biesheuvel .decomp = __VECS(deflate_decomp_tv_template) 2702da7f033dSHerbert Xu } 2703da7f033dSHerbert Xu } 2704da7f033dSHerbert Xu }, { 2705802c7f1cSSalvatore Benedetto .alg = "dh", 2706802c7f1cSSalvatore Benedetto .test = alg_test_kpp, 2707802c7f1cSSalvatore Benedetto .fips_allowed = 1, 2708802c7f1cSSalvatore Benedetto .suite = { 270921c8e720SArd Biesheuvel .kpp = __VECS(dh_tv_template) 2710802c7f1cSSalvatore Benedetto } 2711802c7f1cSSalvatore Benedetto }, { 2712e448370dSJussi Kivilinna .alg = "digest_null", 2713e448370dSJussi Kivilinna .test = alg_test_null, 2714e448370dSJussi Kivilinna }, { 271564d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes128", 271664d1cdfbSStephan Mueller .test = alg_test_drbg, 271764d1cdfbSStephan Mueller .fips_allowed = 1, 271864d1cdfbSStephan Mueller .suite = { 271921c8e720SArd Biesheuvel .drbg = __VECS(drbg_nopr_ctr_aes128_tv_template) 272064d1cdfbSStephan Mueller } 272164d1cdfbSStephan Mueller }, { 272264d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes192", 272364d1cdfbSStephan Mueller .test = alg_test_drbg, 272464d1cdfbSStephan Mueller .fips_allowed = 1, 272564d1cdfbSStephan Mueller .suite = { 272621c8e720SArd Biesheuvel .drbg = __VECS(drbg_nopr_ctr_aes192_tv_template) 272764d1cdfbSStephan Mueller } 272864d1cdfbSStephan Mueller }, { 272964d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes256", 273064d1cdfbSStephan Mueller .test = alg_test_drbg, 273164d1cdfbSStephan Mueller .fips_allowed = 1, 273264d1cdfbSStephan Mueller .suite = { 273321c8e720SArd Biesheuvel .drbg = __VECS(drbg_nopr_ctr_aes256_tv_template) 273464d1cdfbSStephan Mueller } 273564d1cdfbSStephan Mueller }, { 273664d1cdfbSStephan Mueller /* 273764d1cdfbSStephan Mueller * There is no need to specifically test the DRBG with every 273864d1cdfbSStephan Mueller * backend cipher -- covered by drbg_nopr_hmac_sha256 test 273964d1cdfbSStephan Mueller */ 274064d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha1", 274164d1cdfbSStephan Mueller .fips_allowed = 1, 274264d1cdfbSStephan Mueller .test = alg_test_null, 274364d1cdfbSStephan Mueller }, { 274464d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha256", 274564d1cdfbSStephan Mueller .test = alg_test_drbg, 274664d1cdfbSStephan Mueller .fips_allowed = 1, 274764d1cdfbSStephan Mueller .suite = { 274821c8e720SArd Biesheuvel .drbg = __VECS(drbg_nopr_hmac_sha256_tv_template) 274964d1cdfbSStephan Mueller } 275064d1cdfbSStephan Mueller }, { 275164d1cdfbSStephan Mueller /* covered by drbg_nopr_hmac_sha256 test */ 275264d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha384", 275364d1cdfbSStephan Mueller .fips_allowed = 1, 275464d1cdfbSStephan Mueller .test = alg_test_null, 275564d1cdfbSStephan Mueller }, { 275664d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha512", 275764d1cdfbSStephan Mueller .test = alg_test_null, 275864d1cdfbSStephan Mueller .fips_allowed = 1, 275964d1cdfbSStephan Mueller }, { 276064d1cdfbSStephan Mueller .alg = "drbg_nopr_sha1", 276164d1cdfbSStephan Mueller .fips_allowed = 1, 276264d1cdfbSStephan Mueller .test = alg_test_null, 276364d1cdfbSStephan Mueller }, { 276464d1cdfbSStephan Mueller .alg = "drbg_nopr_sha256", 276564d1cdfbSStephan Mueller .test = alg_test_drbg, 276664d1cdfbSStephan Mueller .fips_allowed = 1, 276764d1cdfbSStephan Mueller .suite = { 276821c8e720SArd Biesheuvel .drbg = __VECS(drbg_nopr_sha256_tv_template) 276964d1cdfbSStephan Mueller } 277064d1cdfbSStephan Mueller }, { 277164d1cdfbSStephan Mueller /* covered by drbg_nopr_sha256 test */ 277264d1cdfbSStephan Mueller .alg = "drbg_nopr_sha384", 277364d1cdfbSStephan Mueller .fips_allowed = 1, 277464d1cdfbSStephan Mueller .test = alg_test_null, 277564d1cdfbSStephan Mueller }, { 277664d1cdfbSStephan Mueller .alg = "drbg_nopr_sha512", 277764d1cdfbSStephan Mueller .fips_allowed = 1, 277864d1cdfbSStephan Mueller .test = alg_test_null, 277964d1cdfbSStephan Mueller }, { 278064d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes128", 278164d1cdfbSStephan Mueller .test = alg_test_drbg, 278264d1cdfbSStephan Mueller .fips_allowed = 1, 278364d1cdfbSStephan Mueller .suite = { 278421c8e720SArd Biesheuvel .drbg = __VECS(drbg_pr_ctr_aes128_tv_template) 278564d1cdfbSStephan Mueller } 278664d1cdfbSStephan Mueller }, { 278764d1cdfbSStephan Mueller /* covered by drbg_pr_ctr_aes128 test */ 278864d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes192", 278964d1cdfbSStephan Mueller .fips_allowed = 1, 279064d1cdfbSStephan Mueller .test = alg_test_null, 279164d1cdfbSStephan Mueller }, { 279264d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes256", 279364d1cdfbSStephan Mueller .fips_allowed = 1, 279464d1cdfbSStephan Mueller .test = alg_test_null, 279564d1cdfbSStephan Mueller }, { 279664d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha1", 279764d1cdfbSStephan Mueller .fips_allowed = 1, 279864d1cdfbSStephan Mueller .test = alg_test_null, 279964d1cdfbSStephan Mueller }, { 280064d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha256", 280164d1cdfbSStephan Mueller .test = alg_test_drbg, 280264d1cdfbSStephan Mueller .fips_allowed = 1, 280364d1cdfbSStephan Mueller .suite = { 280421c8e720SArd Biesheuvel .drbg = __VECS(drbg_pr_hmac_sha256_tv_template) 280564d1cdfbSStephan Mueller } 280664d1cdfbSStephan Mueller }, { 280764d1cdfbSStephan Mueller /* covered by drbg_pr_hmac_sha256 test */ 280864d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha384", 280964d1cdfbSStephan Mueller .fips_allowed = 1, 281064d1cdfbSStephan Mueller .test = alg_test_null, 281164d1cdfbSStephan Mueller }, { 281264d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha512", 281364d1cdfbSStephan Mueller .test = alg_test_null, 281464d1cdfbSStephan Mueller .fips_allowed = 1, 281564d1cdfbSStephan Mueller }, { 281664d1cdfbSStephan Mueller .alg = "drbg_pr_sha1", 281764d1cdfbSStephan Mueller .fips_allowed = 1, 281864d1cdfbSStephan Mueller .test = alg_test_null, 281964d1cdfbSStephan Mueller }, { 282064d1cdfbSStephan Mueller .alg = "drbg_pr_sha256", 282164d1cdfbSStephan Mueller .test = alg_test_drbg, 282264d1cdfbSStephan Mueller .fips_allowed = 1, 282364d1cdfbSStephan Mueller .suite = { 282421c8e720SArd Biesheuvel .drbg = __VECS(drbg_pr_sha256_tv_template) 282564d1cdfbSStephan Mueller } 282664d1cdfbSStephan Mueller }, { 282764d1cdfbSStephan Mueller /* covered by drbg_pr_sha256 test */ 282864d1cdfbSStephan Mueller .alg = "drbg_pr_sha384", 282964d1cdfbSStephan Mueller .fips_allowed = 1, 283064d1cdfbSStephan Mueller .test = alg_test_null, 283164d1cdfbSStephan Mueller }, { 283264d1cdfbSStephan Mueller .alg = "drbg_pr_sha512", 283364d1cdfbSStephan Mueller .fips_allowed = 1, 283464d1cdfbSStephan Mueller .test = alg_test_null, 283564d1cdfbSStephan Mueller }, { 2836da7f033dSHerbert Xu .alg = "ecb(aes)", 28371aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2838a1915d51SJarod Wilson .fips_allowed = 1, 2839da7f033dSHerbert Xu .suite = { 2840da7f033dSHerbert Xu .cipher = { 284121c8e720SArd Biesheuvel .enc = __VECS(aes_enc_tv_template), 284221c8e720SArd Biesheuvel .dec = __VECS(aes_dec_tv_template) 2843da7f033dSHerbert Xu } 2844da7f033dSHerbert Xu } 2845da7f033dSHerbert Xu }, { 2846da7f033dSHerbert Xu .alg = "ecb(anubis)", 28471aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2848da7f033dSHerbert Xu .suite = { 2849da7f033dSHerbert Xu .cipher = { 285021c8e720SArd Biesheuvel .enc = __VECS(anubis_enc_tv_template), 285121c8e720SArd Biesheuvel .dec = __VECS(anubis_dec_tv_template) 2852da7f033dSHerbert Xu } 2853da7f033dSHerbert Xu } 2854da7f033dSHerbert Xu }, { 2855da7f033dSHerbert Xu .alg = "ecb(arc4)", 28561aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2857da7f033dSHerbert Xu .suite = { 2858da7f033dSHerbert Xu .cipher = { 285921c8e720SArd Biesheuvel .enc = __VECS(arc4_enc_tv_template), 286021c8e720SArd Biesheuvel .dec = __VECS(arc4_dec_tv_template) 2861da7f033dSHerbert Xu } 2862da7f033dSHerbert Xu } 2863da7f033dSHerbert Xu }, { 2864da7f033dSHerbert Xu .alg = "ecb(blowfish)", 28651aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2866da7f033dSHerbert Xu .suite = { 2867da7f033dSHerbert Xu .cipher = { 286821c8e720SArd Biesheuvel .enc = __VECS(bf_enc_tv_template), 286921c8e720SArd Biesheuvel .dec = __VECS(bf_dec_tv_template) 2870da7f033dSHerbert Xu } 2871da7f033dSHerbert Xu } 2872da7f033dSHerbert Xu }, { 2873da7f033dSHerbert Xu .alg = "ecb(camellia)", 28741aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2875da7f033dSHerbert Xu .suite = { 2876da7f033dSHerbert Xu .cipher = { 287721c8e720SArd Biesheuvel .enc = __VECS(camellia_enc_tv_template), 287821c8e720SArd Biesheuvel .dec = __VECS(camellia_dec_tv_template) 2879da7f033dSHerbert Xu } 2880da7f033dSHerbert Xu } 2881da7f033dSHerbert Xu }, { 2882da7f033dSHerbert Xu .alg = "ecb(cast5)", 28831aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2884da7f033dSHerbert Xu .suite = { 2885da7f033dSHerbert Xu .cipher = { 288621c8e720SArd Biesheuvel .enc = __VECS(cast5_enc_tv_template), 288721c8e720SArd Biesheuvel .dec = __VECS(cast5_dec_tv_template) 2888da7f033dSHerbert Xu } 2889da7f033dSHerbert Xu } 2890da7f033dSHerbert Xu }, { 2891da7f033dSHerbert Xu .alg = "ecb(cast6)", 28921aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2893da7f033dSHerbert Xu .suite = { 2894da7f033dSHerbert Xu .cipher = { 289521c8e720SArd Biesheuvel .enc = __VECS(cast6_enc_tv_template), 289621c8e720SArd Biesheuvel .dec = __VECS(cast6_dec_tv_template) 2897da7f033dSHerbert Xu } 2898da7f033dSHerbert Xu } 2899da7f033dSHerbert Xu }, { 2900e448370dSJussi Kivilinna .alg = "ecb(cipher_null)", 2901e448370dSJussi Kivilinna .test = alg_test_null, 29026175ca2bSMilan Broz .fips_allowed = 1, 2903e448370dSJussi Kivilinna }, { 2904da7f033dSHerbert Xu .alg = "ecb(des)", 29051aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2906da7f033dSHerbert Xu .suite = { 2907da7f033dSHerbert Xu .cipher = { 290821c8e720SArd Biesheuvel .enc = __VECS(des_enc_tv_template), 290921c8e720SArd Biesheuvel .dec = __VECS(des_dec_tv_template) 2910da7f033dSHerbert Xu } 2911da7f033dSHerbert Xu } 2912da7f033dSHerbert Xu }, { 2913da7f033dSHerbert Xu .alg = "ecb(des3_ede)", 29141aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2915a1915d51SJarod Wilson .fips_allowed = 1, 2916da7f033dSHerbert Xu .suite = { 2917da7f033dSHerbert Xu .cipher = { 291821c8e720SArd Biesheuvel .enc = __VECS(des3_ede_enc_tv_template), 291921c8e720SArd Biesheuvel .dec = __VECS(des3_ede_dec_tv_template) 2920da7f033dSHerbert Xu } 2921da7f033dSHerbert Xu } 2922da7f033dSHerbert Xu }, { 292366e5bd00SJussi Kivilinna .alg = "ecb(fcrypt)", 292466e5bd00SJussi Kivilinna .test = alg_test_skcipher, 292566e5bd00SJussi Kivilinna .suite = { 292666e5bd00SJussi Kivilinna .cipher = { 292766e5bd00SJussi Kivilinna .enc = { 292866e5bd00SJussi Kivilinna .vecs = fcrypt_pcbc_enc_tv_template, 292966e5bd00SJussi Kivilinna .count = 1 293066e5bd00SJussi Kivilinna }, 293166e5bd00SJussi Kivilinna .dec = { 293266e5bd00SJussi Kivilinna .vecs = fcrypt_pcbc_dec_tv_template, 293366e5bd00SJussi Kivilinna .count = 1 293466e5bd00SJussi Kivilinna } 293566e5bd00SJussi Kivilinna } 293666e5bd00SJussi Kivilinna } 293766e5bd00SJussi Kivilinna }, { 2938da7f033dSHerbert Xu .alg = "ecb(khazad)", 29391aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2940da7f033dSHerbert Xu .suite = { 2941da7f033dSHerbert Xu .cipher = { 294221c8e720SArd Biesheuvel .enc = __VECS(khazad_enc_tv_template), 294321c8e720SArd Biesheuvel .dec = __VECS(khazad_dec_tv_template) 2944da7f033dSHerbert Xu } 2945da7f033dSHerbert Xu } 2946da7f033dSHerbert Xu }, { 2947da7f033dSHerbert Xu .alg = "ecb(seed)", 29481aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2949da7f033dSHerbert Xu .suite = { 2950da7f033dSHerbert Xu .cipher = { 295121c8e720SArd Biesheuvel .enc = __VECS(seed_enc_tv_template), 295221c8e720SArd Biesheuvel .dec = __VECS(seed_dec_tv_template) 2953da7f033dSHerbert Xu } 2954da7f033dSHerbert Xu } 2955da7f033dSHerbert Xu }, { 2956da7f033dSHerbert Xu .alg = "ecb(serpent)", 29571aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2958da7f033dSHerbert Xu .suite = { 2959da7f033dSHerbert Xu .cipher = { 296021c8e720SArd Biesheuvel .enc = __VECS(serpent_enc_tv_template), 296121c8e720SArd Biesheuvel .dec = __VECS(serpent_dec_tv_template) 2962da7f033dSHerbert Xu } 2963da7f033dSHerbert Xu } 2964da7f033dSHerbert Xu }, { 2965da7f033dSHerbert Xu .alg = "ecb(tea)", 29661aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2967da7f033dSHerbert Xu .suite = { 2968da7f033dSHerbert Xu .cipher = { 296921c8e720SArd Biesheuvel .enc = __VECS(tea_enc_tv_template), 297021c8e720SArd Biesheuvel .dec = __VECS(tea_dec_tv_template) 2971da7f033dSHerbert Xu } 2972da7f033dSHerbert Xu } 2973da7f033dSHerbert Xu }, { 2974da7f033dSHerbert Xu .alg = "ecb(tnepres)", 29751aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2976da7f033dSHerbert Xu .suite = { 2977da7f033dSHerbert Xu .cipher = { 297821c8e720SArd Biesheuvel .enc = __VECS(tnepres_enc_tv_template), 297921c8e720SArd Biesheuvel .dec = __VECS(tnepres_dec_tv_template) 2980da7f033dSHerbert Xu } 2981da7f033dSHerbert Xu } 2982da7f033dSHerbert Xu }, { 2983da7f033dSHerbert Xu .alg = "ecb(twofish)", 29841aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2985da7f033dSHerbert Xu .suite = { 2986da7f033dSHerbert Xu .cipher = { 298721c8e720SArd Biesheuvel .enc = __VECS(tf_enc_tv_template), 298821c8e720SArd Biesheuvel .dec = __VECS(tf_dec_tv_template) 2989da7f033dSHerbert Xu } 2990da7f033dSHerbert Xu } 2991da7f033dSHerbert Xu }, { 2992da7f033dSHerbert Xu .alg = "ecb(xeta)", 29931aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2994da7f033dSHerbert Xu .suite = { 2995da7f033dSHerbert Xu .cipher = { 299621c8e720SArd Biesheuvel .enc = __VECS(xeta_enc_tv_template), 299721c8e720SArd Biesheuvel .dec = __VECS(xeta_dec_tv_template) 2998da7f033dSHerbert Xu } 2999da7f033dSHerbert Xu } 3000da7f033dSHerbert Xu }, { 3001da7f033dSHerbert Xu .alg = "ecb(xtea)", 30021aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3003da7f033dSHerbert Xu .suite = { 3004da7f033dSHerbert Xu .cipher = { 300521c8e720SArd Biesheuvel .enc = __VECS(xtea_enc_tv_template), 300621c8e720SArd Biesheuvel .dec = __VECS(xtea_dec_tv_template) 3007da7f033dSHerbert Xu } 3008da7f033dSHerbert Xu } 3009da7f033dSHerbert Xu }, { 30103c4b2390SSalvatore Benedetto .alg = "ecdh", 30113c4b2390SSalvatore Benedetto .test = alg_test_kpp, 30123c4b2390SSalvatore Benedetto .fips_allowed = 1, 30133c4b2390SSalvatore Benedetto .suite = { 301421c8e720SArd Biesheuvel .kpp = __VECS(ecdh_tv_template) 30153c4b2390SSalvatore Benedetto } 30163c4b2390SSalvatore Benedetto }, { 3017da7f033dSHerbert Xu .alg = "gcm(aes)", 3018da7f033dSHerbert Xu .test = alg_test_aead, 3019a1915d51SJarod Wilson .fips_allowed = 1, 3020da7f033dSHerbert Xu .suite = { 3021da7f033dSHerbert Xu .aead = { 302221c8e720SArd Biesheuvel .enc = __VECS(aes_gcm_enc_tv_template), 302321c8e720SArd Biesheuvel .dec = __VECS(aes_gcm_dec_tv_template) 3024da7f033dSHerbert Xu } 3025da7f033dSHerbert Xu } 3026da7f033dSHerbert Xu }, { 3027507069c9SYouquan, Song .alg = "ghash", 3028507069c9SYouquan, Song .test = alg_test_hash, 302918c0ebd2SJarod Wilson .fips_allowed = 1, 3030507069c9SYouquan, Song .suite = { 303121c8e720SArd Biesheuvel .hash = __VECS(ghash_tv_template) 3032507069c9SYouquan, Song } 3033507069c9SYouquan, Song }, { 3034a482b081SSonic Zhang .alg = "hmac(crc32)", 3035a482b081SSonic Zhang .test = alg_test_hash, 3036a482b081SSonic Zhang .suite = { 303721c8e720SArd Biesheuvel .hash = __VECS(bfin_crc_tv_template) 3038a482b081SSonic Zhang } 3039a482b081SSonic Zhang }, { 3040da7f033dSHerbert Xu .alg = "hmac(md5)", 3041da7f033dSHerbert Xu .test = alg_test_hash, 3042da7f033dSHerbert Xu .suite = { 304321c8e720SArd Biesheuvel .hash = __VECS(hmac_md5_tv_template) 3044da7f033dSHerbert Xu } 3045da7f033dSHerbert Xu }, { 3046da7f033dSHerbert Xu .alg = "hmac(rmd128)", 3047da7f033dSHerbert Xu .test = alg_test_hash, 3048da7f033dSHerbert Xu .suite = { 304921c8e720SArd Biesheuvel .hash = __VECS(hmac_rmd128_tv_template) 3050da7f033dSHerbert Xu } 3051da7f033dSHerbert Xu }, { 3052da7f033dSHerbert Xu .alg = "hmac(rmd160)", 3053da7f033dSHerbert Xu .test = alg_test_hash, 3054da7f033dSHerbert Xu .suite = { 305521c8e720SArd Biesheuvel .hash = __VECS(hmac_rmd160_tv_template) 3056da7f033dSHerbert Xu } 3057da7f033dSHerbert Xu }, { 3058da7f033dSHerbert Xu .alg = "hmac(sha1)", 3059da7f033dSHerbert Xu .test = alg_test_hash, 3060a1915d51SJarod Wilson .fips_allowed = 1, 3061da7f033dSHerbert Xu .suite = { 306221c8e720SArd Biesheuvel .hash = __VECS(hmac_sha1_tv_template) 3063da7f033dSHerbert Xu } 3064da7f033dSHerbert Xu }, { 3065da7f033dSHerbert Xu .alg = "hmac(sha224)", 3066da7f033dSHerbert Xu .test = alg_test_hash, 3067a1915d51SJarod Wilson .fips_allowed = 1, 3068da7f033dSHerbert Xu .suite = { 306921c8e720SArd Biesheuvel .hash = __VECS(hmac_sha224_tv_template) 3070da7f033dSHerbert Xu } 3071da7f033dSHerbert Xu }, { 3072da7f033dSHerbert Xu .alg = "hmac(sha256)", 3073da7f033dSHerbert Xu .test = alg_test_hash, 3074a1915d51SJarod Wilson .fips_allowed = 1, 3075da7f033dSHerbert Xu .suite = { 307621c8e720SArd Biesheuvel .hash = __VECS(hmac_sha256_tv_template) 3077da7f033dSHerbert Xu } 3078da7f033dSHerbert Xu }, { 307998eca72fSraveendra padasalagi .alg = "hmac(sha3-224)", 308098eca72fSraveendra padasalagi .test = alg_test_hash, 308198eca72fSraveendra padasalagi .fips_allowed = 1, 308298eca72fSraveendra padasalagi .suite = { 308321c8e720SArd Biesheuvel .hash = __VECS(hmac_sha3_224_tv_template) 308498eca72fSraveendra padasalagi } 308598eca72fSraveendra padasalagi }, { 308698eca72fSraveendra padasalagi .alg = "hmac(sha3-256)", 308798eca72fSraveendra padasalagi .test = alg_test_hash, 308898eca72fSraveendra padasalagi .fips_allowed = 1, 308998eca72fSraveendra padasalagi .suite = { 309021c8e720SArd Biesheuvel .hash = __VECS(hmac_sha3_256_tv_template) 309198eca72fSraveendra padasalagi } 309298eca72fSraveendra padasalagi }, { 309398eca72fSraveendra padasalagi .alg = "hmac(sha3-384)", 309498eca72fSraveendra padasalagi .test = alg_test_hash, 309598eca72fSraveendra padasalagi .fips_allowed = 1, 309698eca72fSraveendra padasalagi .suite = { 309721c8e720SArd Biesheuvel .hash = __VECS(hmac_sha3_384_tv_template) 309898eca72fSraveendra padasalagi } 309998eca72fSraveendra padasalagi }, { 310098eca72fSraveendra padasalagi .alg = "hmac(sha3-512)", 310198eca72fSraveendra padasalagi .test = alg_test_hash, 310298eca72fSraveendra padasalagi .fips_allowed = 1, 310398eca72fSraveendra padasalagi .suite = { 310421c8e720SArd Biesheuvel .hash = __VECS(hmac_sha3_512_tv_template) 310598eca72fSraveendra padasalagi } 310698eca72fSraveendra padasalagi }, { 3107da7f033dSHerbert Xu .alg = "hmac(sha384)", 3108da7f033dSHerbert Xu .test = alg_test_hash, 3109a1915d51SJarod Wilson .fips_allowed = 1, 3110da7f033dSHerbert Xu .suite = { 311121c8e720SArd Biesheuvel .hash = __VECS(hmac_sha384_tv_template) 3112da7f033dSHerbert Xu } 3113da7f033dSHerbert Xu }, { 3114da7f033dSHerbert Xu .alg = "hmac(sha512)", 3115da7f033dSHerbert Xu .test = alg_test_hash, 3116a1915d51SJarod Wilson .fips_allowed = 1, 3117da7f033dSHerbert Xu .suite = { 311821c8e720SArd Biesheuvel .hash = __VECS(hmac_sha512_tv_template) 3119da7f033dSHerbert Xu } 3120da7f033dSHerbert Xu }, { 3121bb5530e4SStephan Mueller .alg = "jitterentropy_rng", 3122bb5530e4SStephan Mueller .fips_allowed = 1, 3123bb5530e4SStephan Mueller .test = alg_test_null, 3124bb5530e4SStephan Mueller }, { 312535351988SStephan Mueller .alg = "kw(aes)", 312635351988SStephan Mueller .test = alg_test_skcipher, 312735351988SStephan Mueller .fips_allowed = 1, 312835351988SStephan Mueller .suite = { 312935351988SStephan Mueller .cipher = { 313021c8e720SArd Biesheuvel .enc = __VECS(aes_kw_enc_tv_template), 313121c8e720SArd Biesheuvel .dec = __VECS(aes_kw_dec_tv_template) 313235351988SStephan Mueller } 313335351988SStephan Mueller } 313435351988SStephan Mueller }, { 3135da7f033dSHerbert Xu .alg = "lrw(aes)", 31361aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3137da7f033dSHerbert Xu .suite = { 3138da7f033dSHerbert Xu .cipher = { 313921c8e720SArd Biesheuvel .enc = __VECS(aes_lrw_enc_tv_template), 314021c8e720SArd Biesheuvel .dec = __VECS(aes_lrw_dec_tv_template) 3141da7f033dSHerbert Xu } 3142da7f033dSHerbert Xu } 3143da7f033dSHerbert Xu }, { 31440840605eSJussi Kivilinna .alg = "lrw(camellia)", 31450840605eSJussi Kivilinna .test = alg_test_skcipher, 31460840605eSJussi Kivilinna .suite = { 31470840605eSJussi Kivilinna .cipher = { 314821c8e720SArd Biesheuvel .enc = __VECS(camellia_lrw_enc_tv_template), 314921c8e720SArd Biesheuvel .dec = __VECS(camellia_lrw_dec_tv_template) 31500840605eSJussi Kivilinna } 31510840605eSJussi Kivilinna } 31520840605eSJussi Kivilinna }, { 31539b8b0405SJohannes Goetzfried .alg = "lrw(cast6)", 31549b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 31559b8b0405SJohannes Goetzfried .suite = { 31569b8b0405SJohannes Goetzfried .cipher = { 315721c8e720SArd Biesheuvel .enc = __VECS(cast6_lrw_enc_tv_template), 315821c8e720SArd Biesheuvel .dec = __VECS(cast6_lrw_dec_tv_template) 31599b8b0405SJohannes Goetzfried } 31609b8b0405SJohannes Goetzfried } 31619b8b0405SJohannes Goetzfried }, { 3162d7bfc0faSJussi Kivilinna .alg = "lrw(serpent)", 3163d7bfc0faSJussi Kivilinna .test = alg_test_skcipher, 3164d7bfc0faSJussi Kivilinna .suite = { 3165d7bfc0faSJussi Kivilinna .cipher = { 316621c8e720SArd Biesheuvel .enc = __VECS(serpent_lrw_enc_tv_template), 316721c8e720SArd Biesheuvel .dec = __VECS(serpent_lrw_dec_tv_template) 3168d7bfc0faSJussi Kivilinna } 3169d7bfc0faSJussi Kivilinna } 3170d7bfc0faSJussi Kivilinna }, { 31710b2a1551SJussi Kivilinna .alg = "lrw(twofish)", 31720b2a1551SJussi Kivilinna .test = alg_test_skcipher, 31730b2a1551SJussi Kivilinna .suite = { 31740b2a1551SJussi Kivilinna .cipher = { 317521c8e720SArd Biesheuvel .enc = __VECS(tf_lrw_enc_tv_template), 317621c8e720SArd Biesheuvel .dec = __VECS(tf_lrw_dec_tv_template) 31770b2a1551SJussi Kivilinna } 31780b2a1551SJussi Kivilinna } 31790b2a1551SJussi Kivilinna }, { 31801443cc9bSKOVACS Krisztian .alg = "lz4", 31811443cc9bSKOVACS Krisztian .test = alg_test_comp, 31821443cc9bSKOVACS Krisztian .fips_allowed = 1, 31831443cc9bSKOVACS Krisztian .suite = { 31841443cc9bSKOVACS Krisztian .comp = { 318521c8e720SArd Biesheuvel .comp = __VECS(lz4_comp_tv_template), 318621c8e720SArd Biesheuvel .decomp = __VECS(lz4_decomp_tv_template) 31871443cc9bSKOVACS Krisztian } 31881443cc9bSKOVACS Krisztian } 31891443cc9bSKOVACS Krisztian }, { 31901443cc9bSKOVACS Krisztian .alg = "lz4hc", 31911443cc9bSKOVACS Krisztian .test = alg_test_comp, 31921443cc9bSKOVACS Krisztian .fips_allowed = 1, 31931443cc9bSKOVACS Krisztian .suite = { 31941443cc9bSKOVACS Krisztian .comp = { 319521c8e720SArd Biesheuvel .comp = __VECS(lz4hc_comp_tv_template), 319621c8e720SArd Biesheuvel .decomp = __VECS(lz4hc_decomp_tv_template) 31971443cc9bSKOVACS Krisztian } 31981443cc9bSKOVACS Krisztian } 31991443cc9bSKOVACS Krisztian }, { 3200da7f033dSHerbert Xu .alg = "lzo", 3201da7f033dSHerbert Xu .test = alg_test_comp, 32020818904dSMilan Broz .fips_allowed = 1, 3203da7f033dSHerbert Xu .suite = { 3204da7f033dSHerbert Xu .comp = { 320521c8e720SArd Biesheuvel .comp = __VECS(lzo_comp_tv_template), 320621c8e720SArd Biesheuvel .decomp = __VECS(lzo_decomp_tv_template) 3207da7f033dSHerbert Xu } 3208da7f033dSHerbert Xu } 3209da7f033dSHerbert Xu }, { 3210da7f033dSHerbert Xu .alg = "md4", 3211da7f033dSHerbert Xu .test = alg_test_hash, 3212da7f033dSHerbert Xu .suite = { 321321c8e720SArd Biesheuvel .hash = __VECS(md4_tv_template) 3214da7f033dSHerbert Xu } 3215da7f033dSHerbert Xu }, { 3216da7f033dSHerbert Xu .alg = "md5", 3217da7f033dSHerbert Xu .test = alg_test_hash, 3218da7f033dSHerbert Xu .suite = { 321921c8e720SArd Biesheuvel .hash = __VECS(md5_tv_template) 3220da7f033dSHerbert Xu } 3221da7f033dSHerbert Xu }, { 3222da7f033dSHerbert Xu .alg = "michael_mic", 3223da7f033dSHerbert Xu .test = alg_test_hash, 3224da7f033dSHerbert Xu .suite = { 322521c8e720SArd Biesheuvel .hash = __VECS(michael_mic_tv_template) 3226da7f033dSHerbert Xu } 3227da7f033dSHerbert Xu }, { 3228ba0e14acSPuneet Saxena .alg = "ofb(aes)", 3229ba0e14acSPuneet Saxena .test = alg_test_skcipher, 3230ba0e14acSPuneet Saxena .fips_allowed = 1, 3231ba0e14acSPuneet Saxena .suite = { 3232ba0e14acSPuneet Saxena .cipher = { 323321c8e720SArd Biesheuvel .enc = __VECS(aes_ofb_enc_tv_template), 323421c8e720SArd Biesheuvel .dec = __VECS(aes_ofb_dec_tv_template) 3235ba0e14acSPuneet Saxena } 3236ba0e14acSPuneet Saxena } 3237ba0e14acSPuneet Saxena }, { 3238da7f033dSHerbert Xu .alg = "pcbc(fcrypt)", 32391aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3240da7f033dSHerbert Xu .suite = { 3241da7f033dSHerbert Xu .cipher = { 324221c8e720SArd Biesheuvel .enc = __VECS(fcrypt_pcbc_enc_tv_template), 324321c8e720SArd Biesheuvel .dec = __VECS(fcrypt_pcbc_dec_tv_template) 3244da7f033dSHerbert Xu } 3245da7f033dSHerbert Xu } 3246da7f033dSHerbert Xu }, { 32471207107cSStephan Mueller .alg = "pkcs1pad(rsa,sha224)", 32481207107cSStephan Mueller .test = alg_test_null, 32491207107cSStephan Mueller .fips_allowed = 1, 32501207107cSStephan Mueller }, { 32511207107cSStephan Mueller .alg = "pkcs1pad(rsa,sha256)", 32521207107cSStephan Mueller .test = alg_test_akcipher, 32531207107cSStephan Mueller .fips_allowed = 1, 32541207107cSStephan Mueller .suite = { 32551207107cSStephan Mueller .akcipher = __VECS(pkcs1pad_rsa_tv_template) 32561207107cSStephan Mueller } 32571207107cSStephan Mueller }, { 32581207107cSStephan Mueller .alg = "pkcs1pad(rsa,sha384)", 32591207107cSStephan Mueller .test = alg_test_null, 32601207107cSStephan Mueller .fips_allowed = 1, 32611207107cSStephan Mueller }, { 32621207107cSStephan Mueller .alg = "pkcs1pad(rsa,sha512)", 32631207107cSStephan Mueller .test = alg_test_null, 32641207107cSStephan Mueller .fips_allowed = 1, 32651207107cSStephan Mueller }, { 3266eee9dc61SMartin Willi .alg = "poly1305", 3267eee9dc61SMartin Willi .test = alg_test_hash, 3268eee9dc61SMartin Willi .suite = { 326921c8e720SArd Biesheuvel .hash = __VECS(poly1305_tv_template) 3270eee9dc61SMartin Willi } 3271eee9dc61SMartin Willi }, { 3272da7f033dSHerbert Xu .alg = "rfc3686(ctr(aes))", 32731aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3274a1915d51SJarod Wilson .fips_allowed = 1, 3275da7f033dSHerbert Xu .suite = { 3276da7f033dSHerbert Xu .cipher = { 327721c8e720SArd Biesheuvel .enc = __VECS(aes_ctr_rfc3686_enc_tv_template), 327821c8e720SArd Biesheuvel .dec = __VECS(aes_ctr_rfc3686_dec_tv_template) 3279da7f033dSHerbert Xu } 3280da7f033dSHerbert Xu } 3281da7f033dSHerbert Xu }, { 32823f31a740SHerbert Xu .alg = "rfc4106(gcm(aes))", 328369435b94SAdrian Hoban .test = alg_test_aead, 3284db71f29aSJarod Wilson .fips_allowed = 1, 328569435b94SAdrian Hoban .suite = { 328669435b94SAdrian Hoban .aead = { 328721c8e720SArd Biesheuvel .enc = __VECS(aes_gcm_rfc4106_enc_tv_template), 328821c8e720SArd Biesheuvel .dec = __VECS(aes_gcm_rfc4106_dec_tv_template) 328969435b94SAdrian Hoban } 329069435b94SAdrian Hoban } 329169435b94SAdrian Hoban }, { 3292544c436aSHerbert Xu .alg = "rfc4309(ccm(aes))", 32935d667322SJarod Wilson .test = alg_test_aead, 3294a1915d51SJarod Wilson .fips_allowed = 1, 32955d667322SJarod Wilson .suite = { 32965d667322SJarod Wilson .aead = { 329721c8e720SArd Biesheuvel .enc = __VECS(aes_ccm_rfc4309_enc_tv_template), 329821c8e720SArd Biesheuvel .dec = __VECS(aes_ccm_rfc4309_dec_tv_template) 32995d667322SJarod Wilson } 33005d667322SJarod Wilson } 33015d667322SJarod Wilson }, { 3302bb68745eSHerbert Xu .alg = "rfc4543(gcm(aes))", 3303e9b7441aSJussi Kivilinna .test = alg_test_aead, 3304e9b7441aSJussi Kivilinna .suite = { 3305e9b7441aSJussi Kivilinna .aead = { 330621c8e720SArd Biesheuvel .enc = __VECS(aes_gcm_rfc4543_enc_tv_template), 330721c8e720SArd Biesheuvel .dec = __VECS(aes_gcm_rfc4543_dec_tv_template), 3308e9b7441aSJussi Kivilinna } 3309e9b7441aSJussi Kivilinna } 3310e9b7441aSJussi Kivilinna }, { 3311af2b76b5SMartin Willi .alg = "rfc7539(chacha20,poly1305)", 3312af2b76b5SMartin Willi .test = alg_test_aead, 3313af2b76b5SMartin Willi .suite = { 3314af2b76b5SMartin Willi .aead = { 331521c8e720SArd Biesheuvel .enc = __VECS(rfc7539_enc_tv_template), 331621c8e720SArd Biesheuvel .dec = __VECS(rfc7539_dec_tv_template), 3317af2b76b5SMartin Willi } 3318af2b76b5SMartin Willi } 3319af2b76b5SMartin Willi }, { 33205900758dSMartin Willi .alg = "rfc7539esp(chacha20,poly1305)", 33215900758dSMartin Willi .test = alg_test_aead, 33225900758dSMartin Willi .suite = { 33235900758dSMartin Willi .aead = { 332421c8e720SArd Biesheuvel .enc = __VECS(rfc7539esp_enc_tv_template), 332521c8e720SArd Biesheuvel .dec = __VECS(rfc7539esp_dec_tv_template), 33265900758dSMartin Willi } 33275900758dSMartin Willi } 33285900758dSMartin Willi }, { 3329da7f033dSHerbert Xu .alg = "rmd128", 3330da7f033dSHerbert Xu .test = alg_test_hash, 3331da7f033dSHerbert Xu .suite = { 333221c8e720SArd Biesheuvel .hash = __VECS(rmd128_tv_template) 3333da7f033dSHerbert Xu } 3334da7f033dSHerbert Xu }, { 3335da7f033dSHerbert Xu .alg = "rmd160", 3336da7f033dSHerbert Xu .test = alg_test_hash, 3337da7f033dSHerbert Xu .suite = { 333821c8e720SArd Biesheuvel .hash = __VECS(rmd160_tv_template) 3339da7f033dSHerbert Xu } 3340da7f033dSHerbert Xu }, { 3341da7f033dSHerbert Xu .alg = "rmd256", 3342da7f033dSHerbert Xu .test = alg_test_hash, 3343da7f033dSHerbert Xu .suite = { 334421c8e720SArd Biesheuvel .hash = __VECS(rmd256_tv_template) 3345da7f033dSHerbert Xu } 3346da7f033dSHerbert Xu }, { 3347da7f033dSHerbert Xu .alg = "rmd320", 3348da7f033dSHerbert Xu .test = alg_test_hash, 3349da7f033dSHerbert Xu .suite = { 335021c8e720SArd Biesheuvel .hash = __VECS(rmd320_tv_template) 3351da7f033dSHerbert Xu } 3352da7f033dSHerbert Xu }, { 3353946cc463STadeusz Struk .alg = "rsa", 3354946cc463STadeusz Struk .test = alg_test_akcipher, 3355946cc463STadeusz Struk .fips_allowed = 1, 3356946cc463STadeusz Struk .suite = { 335721c8e720SArd Biesheuvel .akcipher = __VECS(rsa_tv_template) 3358946cc463STadeusz Struk } 3359946cc463STadeusz Struk }, { 3360da7f033dSHerbert Xu .alg = "salsa20", 33611aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3362da7f033dSHerbert Xu .suite = { 3363da7f033dSHerbert Xu .cipher = { 336421c8e720SArd Biesheuvel .enc = __VECS(salsa20_stream_enc_tv_template) 3365da7f033dSHerbert Xu } 3366da7f033dSHerbert Xu } 3367da7f033dSHerbert Xu }, { 3368da7f033dSHerbert Xu .alg = "sha1", 3369da7f033dSHerbert Xu .test = alg_test_hash, 3370a1915d51SJarod Wilson .fips_allowed = 1, 3371da7f033dSHerbert Xu .suite = { 337221c8e720SArd Biesheuvel .hash = __VECS(sha1_tv_template) 3373da7f033dSHerbert Xu } 3374da7f033dSHerbert Xu }, { 3375da7f033dSHerbert Xu .alg = "sha224", 3376da7f033dSHerbert Xu .test = alg_test_hash, 3377a1915d51SJarod Wilson .fips_allowed = 1, 3378da7f033dSHerbert Xu .suite = { 337921c8e720SArd Biesheuvel .hash = __VECS(sha224_tv_template) 3380da7f033dSHerbert Xu } 3381da7f033dSHerbert Xu }, { 3382da7f033dSHerbert Xu .alg = "sha256", 3383da7f033dSHerbert Xu .test = alg_test_hash, 3384a1915d51SJarod Wilson .fips_allowed = 1, 3385da7f033dSHerbert Xu .suite = { 338621c8e720SArd Biesheuvel .hash = __VECS(sha256_tv_template) 3387da7f033dSHerbert Xu } 3388da7f033dSHerbert Xu }, { 338979cc6ab8Sraveendra padasalagi .alg = "sha3-224", 339079cc6ab8Sraveendra padasalagi .test = alg_test_hash, 339179cc6ab8Sraveendra padasalagi .fips_allowed = 1, 339279cc6ab8Sraveendra padasalagi .suite = { 339321c8e720SArd Biesheuvel .hash = __VECS(sha3_224_tv_template) 339479cc6ab8Sraveendra padasalagi } 339579cc6ab8Sraveendra padasalagi }, { 339679cc6ab8Sraveendra padasalagi .alg = "sha3-256", 339779cc6ab8Sraveendra padasalagi .test = alg_test_hash, 339879cc6ab8Sraveendra padasalagi .fips_allowed = 1, 339979cc6ab8Sraveendra padasalagi .suite = { 340021c8e720SArd Biesheuvel .hash = __VECS(sha3_256_tv_template) 340179cc6ab8Sraveendra padasalagi } 340279cc6ab8Sraveendra padasalagi }, { 340379cc6ab8Sraveendra padasalagi .alg = "sha3-384", 340479cc6ab8Sraveendra padasalagi .test = alg_test_hash, 340579cc6ab8Sraveendra padasalagi .fips_allowed = 1, 340679cc6ab8Sraveendra padasalagi .suite = { 340721c8e720SArd Biesheuvel .hash = __VECS(sha3_384_tv_template) 340879cc6ab8Sraveendra padasalagi } 340979cc6ab8Sraveendra padasalagi }, { 341079cc6ab8Sraveendra padasalagi .alg = "sha3-512", 341179cc6ab8Sraveendra padasalagi .test = alg_test_hash, 341279cc6ab8Sraveendra padasalagi .fips_allowed = 1, 341379cc6ab8Sraveendra padasalagi .suite = { 341421c8e720SArd Biesheuvel .hash = __VECS(sha3_512_tv_template) 341579cc6ab8Sraveendra padasalagi } 341679cc6ab8Sraveendra padasalagi }, { 3417da7f033dSHerbert Xu .alg = "sha384", 3418da7f033dSHerbert Xu .test = alg_test_hash, 3419a1915d51SJarod Wilson .fips_allowed = 1, 3420da7f033dSHerbert Xu .suite = { 342121c8e720SArd Biesheuvel .hash = __VECS(sha384_tv_template) 3422da7f033dSHerbert Xu } 3423da7f033dSHerbert Xu }, { 3424da7f033dSHerbert Xu .alg = "sha512", 3425da7f033dSHerbert Xu .test = alg_test_hash, 3426a1915d51SJarod Wilson .fips_allowed = 1, 3427da7f033dSHerbert Xu .suite = { 342821c8e720SArd Biesheuvel .hash = __VECS(sha512_tv_template) 3429da7f033dSHerbert Xu } 3430da7f033dSHerbert Xu }, { 3431b7e27530SGilad Ben-Yossef .alg = "sm3", 3432b7e27530SGilad Ben-Yossef .test = alg_test_hash, 3433b7e27530SGilad Ben-Yossef .suite = { 3434b7e27530SGilad Ben-Yossef .hash = __VECS(sm3_tv_template) 3435b7e27530SGilad Ben-Yossef } 3436b7e27530SGilad Ben-Yossef }, { 3437da7f033dSHerbert Xu .alg = "tgr128", 3438da7f033dSHerbert Xu .test = alg_test_hash, 3439da7f033dSHerbert Xu .suite = { 344021c8e720SArd Biesheuvel .hash = __VECS(tgr128_tv_template) 3441da7f033dSHerbert Xu } 3442da7f033dSHerbert Xu }, { 3443da7f033dSHerbert Xu .alg = "tgr160", 3444da7f033dSHerbert Xu .test = alg_test_hash, 3445da7f033dSHerbert Xu .suite = { 344621c8e720SArd Biesheuvel .hash = __VECS(tgr160_tv_template) 3447da7f033dSHerbert Xu } 3448da7f033dSHerbert Xu }, { 3449da7f033dSHerbert Xu .alg = "tgr192", 3450da7f033dSHerbert Xu .test = alg_test_hash, 3451da7f033dSHerbert Xu .suite = { 345221c8e720SArd Biesheuvel .hash = __VECS(tgr192_tv_template) 3453da7f033dSHerbert Xu } 3454da7f033dSHerbert Xu }, { 3455f1939f7cSShane Wang .alg = "vmac(aes)", 3456f1939f7cSShane Wang .test = alg_test_hash, 3457f1939f7cSShane Wang .suite = { 345821c8e720SArd Biesheuvel .hash = __VECS(aes_vmac128_tv_template) 3459f1939f7cSShane Wang } 3460f1939f7cSShane Wang }, { 3461da7f033dSHerbert Xu .alg = "wp256", 3462da7f033dSHerbert Xu .test = alg_test_hash, 3463da7f033dSHerbert Xu .suite = { 346421c8e720SArd Biesheuvel .hash = __VECS(wp256_tv_template) 3465da7f033dSHerbert Xu } 3466da7f033dSHerbert Xu }, { 3467da7f033dSHerbert Xu .alg = "wp384", 3468da7f033dSHerbert Xu .test = alg_test_hash, 3469da7f033dSHerbert Xu .suite = { 347021c8e720SArd Biesheuvel .hash = __VECS(wp384_tv_template) 3471da7f033dSHerbert Xu } 3472da7f033dSHerbert Xu }, { 3473da7f033dSHerbert Xu .alg = "wp512", 3474da7f033dSHerbert Xu .test = alg_test_hash, 3475da7f033dSHerbert Xu .suite = { 347621c8e720SArd Biesheuvel .hash = __VECS(wp512_tv_template) 3477da7f033dSHerbert Xu } 3478da7f033dSHerbert Xu }, { 3479da7f033dSHerbert Xu .alg = "xcbc(aes)", 3480da7f033dSHerbert Xu .test = alg_test_hash, 3481da7f033dSHerbert Xu .suite = { 348221c8e720SArd Biesheuvel .hash = __VECS(aes_xcbc128_tv_template) 3483da7f033dSHerbert Xu } 3484da7f033dSHerbert Xu }, { 3485da7f033dSHerbert Xu .alg = "xts(aes)", 34861aa4ecd9SHerbert Xu .test = alg_test_skcipher, 34872918aa8dSJarod Wilson .fips_allowed = 1, 3488da7f033dSHerbert Xu .suite = { 3489da7f033dSHerbert Xu .cipher = { 349021c8e720SArd Biesheuvel .enc = __VECS(aes_xts_enc_tv_template), 349121c8e720SArd Biesheuvel .dec = __VECS(aes_xts_dec_tv_template) 3492da7f033dSHerbert Xu } 3493da7f033dSHerbert Xu } 34940c01aed5SGeert Uytterhoeven }, { 34950840605eSJussi Kivilinna .alg = "xts(camellia)", 34960840605eSJussi Kivilinna .test = alg_test_skcipher, 34970840605eSJussi Kivilinna .suite = { 34980840605eSJussi Kivilinna .cipher = { 349921c8e720SArd Biesheuvel .enc = __VECS(camellia_xts_enc_tv_template), 350021c8e720SArd Biesheuvel .dec = __VECS(camellia_xts_dec_tv_template) 35010840605eSJussi Kivilinna } 35020840605eSJussi Kivilinna } 35030840605eSJussi Kivilinna }, { 35049b8b0405SJohannes Goetzfried .alg = "xts(cast6)", 35059b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 35069b8b0405SJohannes Goetzfried .suite = { 35079b8b0405SJohannes Goetzfried .cipher = { 350821c8e720SArd Biesheuvel .enc = __VECS(cast6_xts_enc_tv_template), 350921c8e720SArd Biesheuvel .dec = __VECS(cast6_xts_dec_tv_template) 35109b8b0405SJohannes Goetzfried } 35119b8b0405SJohannes Goetzfried } 35129b8b0405SJohannes Goetzfried }, { 351318be20b9SJussi Kivilinna .alg = "xts(serpent)", 351418be20b9SJussi Kivilinna .test = alg_test_skcipher, 351518be20b9SJussi Kivilinna .suite = { 351618be20b9SJussi Kivilinna .cipher = { 351721c8e720SArd Biesheuvel .enc = __VECS(serpent_xts_enc_tv_template), 351821c8e720SArd Biesheuvel .dec = __VECS(serpent_xts_dec_tv_template) 351918be20b9SJussi Kivilinna } 352018be20b9SJussi Kivilinna } 352118be20b9SJussi Kivilinna }, { 3522aed265b9SJussi Kivilinna .alg = "xts(twofish)", 3523aed265b9SJussi Kivilinna .test = alg_test_skcipher, 3524aed265b9SJussi Kivilinna .suite = { 3525aed265b9SJussi Kivilinna .cipher = { 352621c8e720SArd Biesheuvel .enc = __VECS(tf_xts_enc_tv_template), 352721c8e720SArd Biesheuvel .dec = __VECS(tf_xts_dec_tv_template) 3528aed265b9SJussi Kivilinna } 3529aed265b9SJussi Kivilinna } 3530a368f43dSGiovanni Cabiddu }, { 3531a368f43dSGiovanni Cabiddu .alg = "zlib-deflate", 3532a368f43dSGiovanni Cabiddu .test = alg_test_comp, 3533a368f43dSGiovanni Cabiddu .fips_allowed = 1, 3534a368f43dSGiovanni Cabiddu .suite = { 3535a368f43dSGiovanni Cabiddu .comp = { 3536a368f43dSGiovanni Cabiddu .comp = __VECS(zlib_deflate_comp_tv_template), 3537a368f43dSGiovanni Cabiddu .decomp = __VECS(zlib_deflate_decomp_tv_template) 3538a368f43dSGiovanni Cabiddu } 3539a368f43dSGiovanni Cabiddu } 3540da7f033dSHerbert Xu } 3541da7f033dSHerbert Xu }; 3542da7f033dSHerbert Xu 35435714758bSJussi Kivilinna static bool alg_test_descs_checked; 35445714758bSJussi Kivilinna 35455714758bSJussi Kivilinna static void alg_test_descs_check_order(void) 35465714758bSJussi Kivilinna { 35475714758bSJussi Kivilinna int i; 35485714758bSJussi Kivilinna 35495714758bSJussi Kivilinna /* only check once */ 35505714758bSJussi Kivilinna if (alg_test_descs_checked) 35515714758bSJussi Kivilinna return; 35525714758bSJussi Kivilinna 35535714758bSJussi Kivilinna alg_test_descs_checked = true; 35545714758bSJussi Kivilinna 35555714758bSJussi Kivilinna for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) { 35565714758bSJussi Kivilinna int diff = strcmp(alg_test_descs[i - 1].alg, 35575714758bSJussi Kivilinna alg_test_descs[i].alg); 35585714758bSJussi Kivilinna 35595714758bSJussi Kivilinna if (WARN_ON(diff > 0)) { 35605714758bSJussi Kivilinna pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n", 35615714758bSJussi Kivilinna alg_test_descs[i - 1].alg, 35625714758bSJussi Kivilinna alg_test_descs[i].alg); 35635714758bSJussi Kivilinna } 35645714758bSJussi Kivilinna 35655714758bSJussi Kivilinna if (WARN_ON(diff == 0)) { 35665714758bSJussi Kivilinna pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n", 35675714758bSJussi Kivilinna alg_test_descs[i].alg); 35685714758bSJussi Kivilinna } 35695714758bSJussi Kivilinna } 35705714758bSJussi Kivilinna } 35715714758bSJussi Kivilinna 35721aa4ecd9SHerbert Xu static int alg_find_test(const char *alg) 3573da7f033dSHerbert Xu { 3574da7f033dSHerbert Xu int start = 0; 3575da7f033dSHerbert Xu int end = ARRAY_SIZE(alg_test_descs); 3576da7f033dSHerbert Xu 3577da7f033dSHerbert Xu while (start < end) { 3578da7f033dSHerbert Xu int i = (start + end) / 2; 3579da7f033dSHerbert Xu int diff = strcmp(alg_test_descs[i].alg, alg); 3580da7f033dSHerbert Xu 3581da7f033dSHerbert Xu if (diff > 0) { 3582da7f033dSHerbert Xu end = i; 3583da7f033dSHerbert Xu continue; 3584da7f033dSHerbert Xu } 3585da7f033dSHerbert Xu 3586da7f033dSHerbert Xu if (diff < 0) { 3587da7f033dSHerbert Xu start = i + 1; 3588da7f033dSHerbert Xu continue; 3589da7f033dSHerbert Xu } 3590da7f033dSHerbert Xu 35911aa4ecd9SHerbert Xu return i; 3592da7f033dSHerbert Xu } 3593da7f033dSHerbert Xu 35941aa4ecd9SHerbert Xu return -1; 35951aa4ecd9SHerbert Xu } 35961aa4ecd9SHerbert Xu 35971aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 35981aa4ecd9SHerbert Xu { 35991aa4ecd9SHerbert Xu int i; 3600a68f6610SHerbert Xu int j; 3601d12d6b6dSNeil Horman int rc; 36021aa4ecd9SHerbert Xu 36039e5c9fe4SRichard W.M. Jones if (!fips_enabled && notests) { 36049e5c9fe4SRichard W.M. Jones printk_once(KERN_INFO "alg: self-tests disabled\n"); 36059e5c9fe4SRichard W.M. Jones return 0; 36069e5c9fe4SRichard W.M. Jones } 36079e5c9fe4SRichard W.M. Jones 36085714758bSJussi Kivilinna alg_test_descs_check_order(); 36095714758bSJussi Kivilinna 36101aa4ecd9SHerbert Xu if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) { 36111aa4ecd9SHerbert Xu char nalg[CRYPTO_MAX_ALG_NAME]; 36121aa4ecd9SHerbert Xu 36131aa4ecd9SHerbert Xu if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >= 36141aa4ecd9SHerbert Xu sizeof(nalg)) 36151aa4ecd9SHerbert Xu return -ENAMETOOLONG; 36161aa4ecd9SHerbert Xu 36171aa4ecd9SHerbert Xu i = alg_find_test(nalg); 36181aa4ecd9SHerbert Xu if (i < 0) 36191aa4ecd9SHerbert Xu goto notest; 36201aa4ecd9SHerbert Xu 3621a3bef3a3SJarod Wilson if (fips_enabled && !alg_test_descs[i].fips_allowed) 3622a3bef3a3SJarod Wilson goto non_fips_alg; 3623a3bef3a3SJarod Wilson 3624941fb328SJarod Wilson rc = alg_test_cipher(alg_test_descs + i, driver, type, mask); 3625941fb328SJarod Wilson goto test_done; 36261aa4ecd9SHerbert Xu } 36271aa4ecd9SHerbert Xu 36281aa4ecd9SHerbert Xu i = alg_find_test(alg); 3629a68f6610SHerbert Xu j = alg_find_test(driver); 3630a68f6610SHerbert Xu if (i < 0 && j < 0) 36311aa4ecd9SHerbert Xu goto notest; 36321aa4ecd9SHerbert Xu 3633a68f6610SHerbert Xu if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) || 3634a68f6610SHerbert Xu (j >= 0 && !alg_test_descs[j].fips_allowed))) 3635a3bef3a3SJarod Wilson goto non_fips_alg; 3636a3bef3a3SJarod Wilson 3637a68f6610SHerbert Xu rc = 0; 3638a68f6610SHerbert Xu if (i >= 0) 3639a68f6610SHerbert Xu rc |= alg_test_descs[i].test(alg_test_descs + i, driver, 36401aa4ecd9SHerbert Xu type, mask); 3641032c8cacSCristian Stoica if (j >= 0 && j != i) 3642a68f6610SHerbert Xu rc |= alg_test_descs[j].test(alg_test_descs + j, driver, 3643a68f6610SHerbert Xu type, mask); 3644a68f6610SHerbert Xu 3645941fb328SJarod Wilson test_done: 3646d12d6b6dSNeil Horman if (fips_enabled && rc) 3647d12d6b6dSNeil Horman panic("%s: %s alg self test failed in fips mode!\n", driver, alg); 3648d12d6b6dSNeil Horman 364929ecd4abSJarod Wilson if (fips_enabled && !rc) 36503e8cffd4SMasanari Iida pr_info("alg: self-tests for %s (%s) passed\n", driver, alg); 365129ecd4abSJarod Wilson 3652d12d6b6dSNeil Horman return rc; 36531aa4ecd9SHerbert Xu 36541aa4ecd9SHerbert Xu notest: 3655da7f033dSHerbert Xu printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver); 3656da7f033dSHerbert Xu return 0; 3657a3bef3a3SJarod Wilson non_fips_alg: 3658a3bef3a3SJarod Wilson return -EINVAL; 3659da7f033dSHerbert Xu } 36600b767f96SAlexander Shishkin 3661326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */ 36620b767f96SAlexander Shishkin 3663da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test); 3664