1da7f033dSHerbert Xu /* 2da7f033dSHerbert Xu * Algorithm testing framework and tests. 3da7f033dSHerbert Xu * 4da7f033dSHerbert Xu * Copyright (c) 2002 James Morris <jmorris@intercode.com.au> 5da7f033dSHerbert Xu * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org> 6da7f033dSHerbert Xu * Copyright (c) 2007 Nokia Siemens Networks 7da7f033dSHerbert Xu * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au> 8da7f033dSHerbert Xu * 969435b94SAdrian Hoban * Updated RFC4106 AES-GCM testing. 1069435b94SAdrian Hoban * Authors: Aidan O'Mahony (aidan.o.mahony@intel.com) 1169435b94SAdrian Hoban * Adrian Hoban <adrian.hoban@intel.com> 1269435b94SAdrian Hoban * Gabriele Paoloni <gabriele.paoloni@intel.com> 1369435b94SAdrian Hoban * Tadeusz Struk (tadeusz.struk@intel.com) 1469435b94SAdrian Hoban * Copyright (c) 2010, Intel Corporation. 1569435b94SAdrian Hoban * 16da7f033dSHerbert Xu * This program is free software; you can redistribute it and/or modify it 17da7f033dSHerbert Xu * under the terms of the GNU General Public License as published by the Free 18da7f033dSHerbert Xu * Software Foundation; either version 2 of the License, or (at your option) 19da7f033dSHerbert Xu * any later version. 20da7f033dSHerbert Xu * 21da7f033dSHerbert Xu */ 22da7f033dSHerbert Xu 231ce33115SHerbert Xu #include <crypto/aead.h> 24da7f033dSHerbert Xu #include <crypto/hash.h> 2512773d93SHerbert Xu #include <crypto/skcipher.h> 26da7f033dSHerbert Xu #include <linux/err.h> 271c41b882SHerbert Xu #include <linux/fips.h> 28da7f033dSHerbert Xu #include <linux/module.h> 29da7f033dSHerbert Xu #include <linux/scatterlist.h> 30da7f033dSHerbert Xu #include <linux/slab.h> 31da7f033dSHerbert Xu #include <linux/string.h> 327647d6ceSJarod Wilson #include <crypto/rng.h> 3364d1cdfbSStephan Mueller #include <crypto/drbg.h> 34946cc463STadeusz Struk #include <crypto/akcipher.h> 35da7f033dSHerbert Xu 36da7f033dSHerbert Xu #include "internal.h" 370b767f96SAlexander Shishkin 38326a6346SHerbert Xu #ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS 390b767f96SAlexander Shishkin 400b767f96SAlexander Shishkin /* a perfect nop */ 410b767f96SAlexander Shishkin int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 420b767f96SAlexander Shishkin { 430b767f96SAlexander Shishkin return 0; 440b767f96SAlexander Shishkin } 450b767f96SAlexander Shishkin 460b767f96SAlexander Shishkin #else 470b767f96SAlexander Shishkin 48da7f033dSHerbert Xu #include "testmgr.h" 49da7f033dSHerbert Xu 50da7f033dSHerbert Xu /* 51da7f033dSHerbert Xu * Need slab memory for testing (size in number of pages). 52da7f033dSHerbert Xu */ 53da7f033dSHerbert Xu #define XBUFSIZE 8 54da7f033dSHerbert Xu 55da7f033dSHerbert Xu /* 56da7f033dSHerbert Xu * Indexes into the xbuf to simulate cross-page access. 57da7f033dSHerbert Xu */ 58da7f033dSHerbert Xu #define IDX1 32 59da7f033dSHerbert Xu #define IDX2 32400 60da7f033dSHerbert Xu #define IDX3 1 61da7f033dSHerbert Xu #define IDX4 8193 62da7f033dSHerbert Xu #define IDX5 22222 63da7f033dSHerbert Xu #define IDX6 17101 64da7f033dSHerbert Xu #define IDX7 27333 65da7f033dSHerbert Xu #define IDX8 3000 66da7f033dSHerbert Xu 67da7f033dSHerbert Xu /* 68da7f033dSHerbert Xu * Used by test_cipher() 69da7f033dSHerbert Xu */ 70da7f033dSHerbert Xu #define ENCRYPT 1 71da7f033dSHerbert Xu #define DECRYPT 0 72da7f033dSHerbert Xu 73da7f033dSHerbert Xu struct tcrypt_result { 74da7f033dSHerbert Xu struct completion completion; 75da7f033dSHerbert Xu int err; 76da7f033dSHerbert Xu }; 77da7f033dSHerbert Xu 78da7f033dSHerbert Xu struct aead_test_suite { 79da7f033dSHerbert Xu struct { 80da7f033dSHerbert Xu struct aead_testvec *vecs; 81da7f033dSHerbert Xu unsigned int count; 82da7f033dSHerbert Xu } enc, dec; 83da7f033dSHerbert Xu }; 84da7f033dSHerbert Xu 85da7f033dSHerbert Xu struct cipher_test_suite { 86da7f033dSHerbert Xu struct { 87da7f033dSHerbert Xu struct cipher_testvec *vecs; 88da7f033dSHerbert Xu unsigned int count; 89da7f033dSHerbert Xu } enc, dec; 90da7f033dSHerbert Xu }; 91da7f033dSHerbert Xu 92da7f033dSHerbert Xu struct comp_test_suite { 93da7f033dSHerbert Xu struct { 94da7f033dSHerbert Xu struct comp_testvec *vecs; 95da7f033dSHerbert Xu unsigned int count; 96da7f033dSHerbert Xu } comp, decomp; 97da7f033dSHerbert Xu }; 98da7f033dSHerbert Xu 998064efb8SGeert Uytterhoeven struct pcomp_test_suite { 1008064efb8SGeert Uytterhoeven struct { 1018064efb8SGeert Uytterhoeven struct pcomp_testvec *vecs; 1028064efb8SGeert Uytterhoeven unsigned int count; 1038064efb8SGeert Uytterhoeven } comp, decomp; 1048064efb8SGeert Uytterhoeven }; 1058064efb8SGeert Uytterhoeven 106da7f033dSHerbert Xu struct hash_test_suite { 107da7f033dSHerbert Xu struct hash_testvec *vecs; 108da7f033dSHerbert Xu unsigned int count; 109da7f033dSHerbert Xu }; 110da7f033dSHerbert Xu 1117647d6ceSJarod Wilson struct cprng_test_suite { 1127647d6ceSJarod Wilson struct cprng_testvec *vecs; 1137647d6ceSJarod Wilson unsigned int count; 1147647d6ceSJarod Wilson }; 1157647d6ceSJarod Wilson 11664d1cdfbSStephan Mueller struct drbg_test_suite { 11764d1cdfbSStephan Mueller struct drbg_testvec *vecs; 11864d1cdfbSStephan Mueller unsigned int count; 11964d1cdfbSStephan Mueller }; 12064d1cdfbSStephan Mueller 121946cc463STadeusz Struk struct akcipher_test_suite { 122946cc463STadeusz Struk struct akcipher_testvec *vecs; 123946cc463STadeusz Struk unsigned int count; 124946cc463STadeusz Struk }; 125946cc463STadeusz Struk 126da7f033dSHerbert Xu struct alg_test_desc { 127da7f033dSHerbert Xu const char *alg; 128da7f033dSHerbert Xu int (*test)(const struct alg_test_desc *desc, const char *driver, 129da7f033dSHerbert Xu u32 type, u32 mask); 130a1915d51SJarod Wilson int fips_allowed; /* set if alg is allowed in fips mode */ 131da7f033dSHerbert Xu 132da7f033dSHerbert Xu union { 133da7f033dSHerbert Xu struct aead_test_suite aead; 134da7f033dSHerbert Xu struct cipher_test_suite cipher; 135da7f033dSHerbert Xu struct comp_test_suite comp; 1368064efb8SGeert Uytterhoeven struct pcomp_test_suite pcomp; 137da7f033dSHerbert Xu struct hash_test_suite hash; 1387647d6ceSJarod Wilson struct cprng_test_suite cprng; 13964d1cdfbSStephan Mueller struct drbg_test_suite drbg; 140946cc463STadeusz Struk struct akcipher_test_suite akcipher; 141da7f033dSHerbert Xu } suite; 142da7f033dSHerbert Xu }; 143da7f033dSHerbert Xu 144da7f033dSHerbert Xu static unsigned int IDX[8] = { 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 153da7f033dSHerbert Xu static void tcrypt_complete(struct crypto_async_request *req, int err) 154da7f033dSHerbert Xu { 155da7f033dSHerbert Xu struct tcrypt_result *res = req->data; 156da7f033dSHerbert Xu 157da7f033dSHerbert Xu if (err == -EINPROGRESS) 158da7f033dSHerbert Xu return; 159da7f033dSHerbert Xu 160da7f033dSHerbert Xu res->err = err; 161da7f033dSHerbert Xu complete(&res->completion); 162da7f033dSHerbert Xu } 163da7f033dSHerbert Xu 164f8b0d4d0SHerbert Xu static int testmgr_alloc_buf(char *buf[XBUFSIZE]) 165f8b0d4d0SHerbert Xu { 166f8b0d4d0SHerbert Xu int i; 167f8b0d4d0SHerbert Xu 168f8b0d4d0SHerbert Xu for (i = 0; i < XBUFSIZE; i++) { 169f8b0d4d0SHerbert Xu buf[i] = (void *)__get_free_page(GFP_KERNEL); 170f8b0d4d0SHerbert Xu if (!buf[i]) 171f8b0d4d0SHerbert Xu goto err_free_buf; 172f8b0d4d0SHerbert Xu } 173f8b0d4d0SHerbert Xu 174f8b0d4d0SHerbert Xu return 0; 175f8b0d4d0SHerbert Xu 176f8b0d4d0SHerbert Xu err_free_buf: 177f8b0d4d0SHerbert Xu while (i-- > 0) 178f8b0d4d0SHerbert Xu free_page((unsigned long)buf[i]); 179f8b0d4d0SHerbert Xu 180f8b0d4d0SHerbert Xu return -ENOMEM; 181f8b0d4d0SHerbert Xu } 182f8b0d4d0SHerbert Xu 183f8b0d4d0SHerbert Xu static void testmgr_free_buf(char *buf[XBUFSIZE]) 184f8b0d4d0SHerbert Xu { 185f8b0d4d0SHerbert Xu int i; 186f8b0d4d0SHerbert Xu 187f8b0d4d0SHerbert Xu for (i = 0; i < XBUFSIZE; i++) 188f8b0d4d0SHerbert Xu free_page((unsigned long)buf[i]); 189f8b0d4d0SHerbert Xu } 190f8b0d4d0SHerbert Xu 191d4c85f9bSCristian Stoica static int wait_async_op(struct tcrypt_result *tr, int ret) 192a8f1a052SDavid S. Miller { 193a8f1a052SDavid S. Miller if (ret == -EINPROGRESS || ret == -EBUSY) { 1948a45ac12SRabin Vincent wait_for_completion(&tr->completion); 19516735d02SWolfram Sang reinit_completion(&tr->completion); 1968a45ac12SRabin Vincent ret = tr->err; 197a8f1a052SDavid S. Miller } 198a8f1a052SDavid S. Miller return ret; 199a8f1a052SDavid S. Miller } 200a8f1a052SDavid S. Miller 201da5ffe11SJussi Kivilinna static int __test_hash(struct crypto_ahash *tfm, struct hash_testvec *template, 202da5ffe11SJussi Kivilinna unsigned int tcount, bool use_digest, 203da5ffe11SJussi Kivilinna const int align_offset) 204da7f033dSHerbert Xu { 205da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm)); 206da7f033dSHerbert Xu unsigned int i, j, k, temp; 207da7f033dSHerbert Xu struct scatterlist sg[8]; 20829b77e5dSHoria Geanta char *result; 20929b77e5dSHoria Geanta char *key; 210da7f033dSHerbert Xu struct ahash_request *req; 211da7f033dSHerbert Xu struct tcrypt_result tresult; 212da7f033dSHerbert Xu void *hash_buff; 213f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 214f8b0d4d0SHerbert Xu int ret = -ENOMEM; 215f8b0d4d0SHerbert Xu 21629b77e5dSHoria Geanta result = kmalloc(MAX_DIGEST_SIZE, GFP_KERNEL); 21729b77e5dSHoria Geanta if (!result) 21829b77e5dSHoria Geanta return ret; 21929b77e5dSHoria Geanta key = kmalloc(MAX_KEYLEN, GFP_KERNEL); 22029b77e5dSHoria Geanta if (!key) 22129b77e5dSHoria Geanta goto out_nobuf; 222f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 223f8b0d4d0SHerbert Xu goto out_nobuf; 224da7f033dSHerbert Xu 225da7f033dSHerbert Xu init_completion(&tresult.completion); 226da7f033dSHerbert Xu 227da7f033dSHerbert Xu req = ahash_request_alloc(tfm, GFP_KERNEL); 228da7f033dSHerbert Xu if (!req) { 229da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to allocate request for " 230da7f033dSHerbert Xu "%s\n", algo); 231da7f033dSHerbert Xu goto out_noreq; 232da7f033dSHerbert Xu } 233da7f033dSHerbert Xu ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 234da7f033dSHerbert Xu tcrypt_complete, &tresult); 235da7f033dSHerbert Xu 236a0cfae59SHerbert Xu j = 0; 237da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 238a0cfae59SHerbert Xu if (template[i].np) 239a0cfae59SHerbert Xu continue; 240a0cfae59SHerbert Xu 241da5ffe11SJussi Kivilinna ret = -EINVAL; 242da5ffe11SJussi Kivilinna if (WARN_ON(align_offset + template[i].psize > PAGE_SIZE)) 243da5ffe11SJussi Kivilinna goto out; 244da5ffe11SJussi Kivilinna 245a0cfae59SHerbert Xu j++; 24629b77e5dSHoria Geanta memset(result, 0, MAX_DIGEST_SIZE); 247da7f033dSHerbert Xu 248da7f033dSHerbert Xu hash_buff = xbuf[0]; 249da5ffe11SJussi Kivilinna hash_buff += align_offset; 250da7f033dSHerbert Xu 251da7f033dSHerbert Xu memcpy(hash_buff, template[i].plaintext, template[i].psize); 252da7f033dSHerbert Xu sg_init_one(&sg[0], hash_buff, template[i].psize); 253da7f033dSHerbert Xu 254da7f033dSHerbert Xu if (template[i].ksize) { 255da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 25629b77e5dSHoria Geanta if (template[i].ksize > MAX_KEYLEN) { 25729b77e5dSHoria Geanta pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n", 25829b77e5dSHoria Geanta j, algo, template[i].ksize, MAX_KEYLEN); 25929b77e5dSHoria Geanta ret = -EINVAL; 26029b77e5dSHoria Geanta goto out; 26129b77e5dSHoria Geanta } 26229b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].ksize); 26329b77e5dSHoria Geanta ret = crypto_ahash_setkey(tfm, key, template[i].ksize); 264da7f033dSHerbert Xu if (ret) { 265da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey failed on " 266a0cfae59SHerbert Xu "test %d for %s: ret=%d\n", j, algo, 267da7f033dSHerbert Xu -ret); 268da7f033dSHerbert Xu goto out; 269da7f033dSHerbert Xu } 270da7f033dSHerbert Xu } 271da7f033dSHerbert Xu 272da7f033dSHerbert Xu ahash_request_set_crypt(req, sg, result, template[i].psize); 273a8f1a052SDavid S. Miller if (use_digest) { 274d4c85f9bSCristian Stoica ret = wait_async_op(&tresult, crypto_ahash_digest(req)); 275a8f1a052SDavid S. Miller if (ret) { 276a8f1a052SDavid S. Miller pr_err("alg: hash: digest failed on test %d " 277a0cfae59SHerbert Xu "for %s: ret=%d\n", j, algo, -ret); 278da7f033dSHerbert Xu goto out; 279da7f033dSHerbert Xu } 280a8f1a052SDavid S. Miller } else { 281d4c85f9bSCristian Stoica ret = wait_async_op(&tresult, crypto_ahash_init(req)); 282a8f1a052SDavid S. Miller if (ret) { 283a8f1a052SDavid S. Miller pr_err("alt: hash: init failed on test %d " 284a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 285a8f1a052SDavid S. Miller goto out; 286a8f1a052SDavid S. Miller } 287d4c85f9bSCristian Stoica ret = wait_async_op(&tresult, crypto_ahash_update(req)); 288a8f1a052SDavid S. Miller if (ret) { 289a8f1a052SDavid S. Miller pr_err("alt: hash: update failed on test %d " 290a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 291a8f1a052SDavid S. Miller goto out; 292a8f1a052SDavid S. Miller } 293d4c85f9bSCristian Stoica ret = wait_async_op(&tresult, crypto_ahash_final(req)); 294a8f1a052SDavid S. Miller if (ret) { 295a8f1a052SDavid S. Miller pr_err("alt: hash: final failed on test %d " 296a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 297a8f1a052SDavid S. Miller goto out; 298a8f1a052SDavid S. Miller } 299a8f1a052SDavid S. Miller } 300da7f033dSHerbert Xu 301da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 302da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 303da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Test %d failed for %s\n", 304a0cfae59SHerbert Xu j, algo); 305da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 306da7f033dSHerbert Xu ret = -EINVAL; 307da7f033dSHerbert Xu goto out; 308da7f033dSHerbert Xu } 309da7f033dSHerbert Xu } 310da7f033dSHerbert Xu 311da7f033dSHerbert Xu j = 0; 312da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 313da5ffe11SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 314da5ffe11SJussi Kivilinna if (align_offset != 0) 315da5ffe11SJussi Kivilinna break; 316da5ffe11SJussi Kivilinna 3175f2b424eSCristian Stoica if (!template[i].np) 3185f2b424eSCristian Stoica continue; 3195f2b424eSCristian Stoica 320da7f033dSHerbert Xu j++; 32129b77e5dSHoria Geanta memset(result, 0, MAX_DIGEST_SIZE); 322da7f033dSHerbert Xu 323da7f033dSHerbert Xu temp = 0; 324da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 325fd57f22aSHerbert Xu ret = -EINVAL; 326da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 327fd57f22aSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 328fd57f22aSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 329fd57f22aSHerbert Xu goto out; 330da7f033dSHerbert Xu sg_set_buf(&sg[k], 331da7f033dSHerbert Xu memcpy(xbuf[IDX[k] >> PAGE_SHIFT] + 332da7f033dSHerbert Xu offset_in_page(IDX[k]), 333da7f033dSHerbert Xu template[i].plaintext + temp, 334da7f033dSHerbert Xu template[i].tap[k]), 335da7f033dSHerbert Xu template[i].tap[k]); 336da7f033dSHerbert Xu temp += template[i].tap[k]; 337da7f033dSHerbert Xu } 338da7f033dSHerbert Xu 339da7f033dSHerbert Xu if (template[i].ksize) { 34029b77e5dSHoria Geanta if (template[i].ksize > MAX_KEYLEN) { 34129b77e5dSHoria Geanta pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n", 3425f2b424eSCristian Stoica j, algo, template[i].ksize, MAX_KEYLEN); 34329b77e5dSHoria Geanta ret = -EINVAL; 34429b77e5dSHoria Geanta goto out; 34529b77e5dSHoria Geanta } 346da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 34729b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].ksize); 3485f2b424eSCristian Stoica ret = crypto_ahash_setkey(tfm, key, template[i].ksize); 349da7f033dSHerbert Xu 350da7f033dSHerbert Xu if (ret) { 351da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey " 352da7f033dSHerbert Xu "failed on chunking test %d " 3535f2b424eSCristian Stoica "for %s: ret=%d\n", j, algo, -ret); 354da7f033dSHerbert Xu goto out; 355da7f033dSHerbert Xu } 356da7f033dSHerbert Xu } 357da7f033dSHerbert Xu 3585f2b424eSCristian Stoica ahash_request_set_crypt(req, sg, result, template[i].psize); 359da7f033dSHerbert Xu ret = crypto_ahash_digest(req); 360da7f033dSHerbert Xu switch (ret) { 361da7f033dSHerbert Xu case 0: 362da7f033dSHerbert Xu break; 363da7f033dSHerbert Xu case -EINPROGRESS: 364da7f033dSHerbert Xu case -EBUSY: 3658a45ac12SRabin Vincent wait_for_completion(&tresult.completion); 36616735d02SWolfram Sang reinit_completion(&tresult.completion); 3678a45ac12SRabin Vincent ret = tresult.err; 3688a45ac12SRabin Vincent if (!ret) 369da7f033dSHerbert Xu break; 370da7f033dSHerbert Xu /* fall through */ 371da7f033dSHerbert Xu default: 372da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: digest failed " 373da7f033dSHerbert Xu "on chunking test %d for %s: " 374da7f033dSHerbert Xu "ret=%d\n", j, algo, -ret); 375da7f033dSHerbert Xu goto out; 376da7f033dSHerbert Xu } 377da7f033dSHerbert Xu 378da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 379da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 380da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Chunking test %d " 381da7f033dSHerbert Xu "failed for %s\n", j, algo); 382da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 383da7f033dSHerbert Xu ret = -EINVAL; 384da7f033dSHerbert Xu goto out; 385da7f033dSHerbert Xu } 386da7f033dSHerbert Xu } 387da7f033dSHerbert Xu 388da7f033dSHerbert Xu ret = 0; 389da7f033dSHerbert Xu 390da7f033dSHerbert Xu out: 391da7f033dSHerbert Xu ahash_request_free(req); 392da7f033dSHerbert Xu out_noreq: 393f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 394f8b0d4d0SHerbert Xu out_nobuf: 39529b77e5dSHoria Geanta kfree(key); 39629b77e5dSHoria Geanta kfree(result); 397da7f033dSHerbert Xu return ret; 398da7f033dSHerbert Xu } 399da7f033dSHerbert Xu 400da5ffe11SJussi Kivilinna static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template, 401da5ffe11SJussi Kivilinna unsigned int tcount, bool use_digest) 402da5ffe11SJussi Kivilinna { 403da5ffe11SJussi Kivilinna unsigned int alignmask; 404da5ffe11SJussi Kivilinna int ret; 405da5ffe11SJussi Kivilinna 406da5ffe11SJussi Kivilinna ret = __test_hash(tfm, template, tcount, use_digest, 0); 407da5ffe11SJussi Kivilinna if (ret) 408da5ffe11SJussi Kivilinna return ret; 409da5ffe11SJussi Kivilinna 410da5ffe11SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 411da5ffe11SJussi Kivilinna ret = __test_hash(tfm, template, tcount, use_digest, 1); 412da5ffe11SJussi Kivilinna if (ret) 413da5ffe11SJussi Kivilinna return ret; 414da5ffe11SJussi Kivilinna 415da5ffe11SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 416da5ffe11SJussi Kivilinna if (alignmask) { 417da5ffe11SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 418da5ffe11SJussi Kivilinna ret = __test_hash(tfm, template, tcount, use_digest, 419da5ffe11SJussi Kivilinna alignmask + 1); 420da5ffe11SJussi Kivilinna if (ret) 421da5ffe11SJussi Kivilinna return ret; 422da5ffe11SJussi Kivilinna } 423da5ffe11SJussi Kivilinna 424da5ffe11SJussi Kivilinna return 0; 425da5ffe11SJussi Kivilinna } 426da5ffe11SJussi Kivilinna 427d8a32ac2SJussi Kivilinna static int __test_aead(struct crypto_aead *tfm, int enc, 428d8a32ac2SJussi Kivilinna struct aead_testvec *template, unsigned int tcount, 42958dcf548SJussi Kivilinna const bool diff_dst, const int align_offset) 430da7f033dSHerbert Xu { 431da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)); 432da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 433f8b0d4d0SHerbert Xu int ret = -ENOMEM; 434da7f033dSHerbert Xu char *q; 435da7f033dSHerbert Xu char *key; 436da7f033dSHerbert Xu struct aead_request *req; 437d8a32ac2SJussi Kivilinna struct scatterlist *sg; 438d8a32ac2SJussi Kivilinna struct scatterlist *sgout; 439d8a32ac2SJussi Kivilinna const char *e, *d; 440da7f033dSHerbert Xu struct tcrypt_result result; 441424a5da6SCristian Stoica unsigned int authsize, iv_len; 442da7f033dSHerbert Xu void *input; 443d8a32ac2SJussi Kivilinna void *output; 444da7f033dSHerbert Xu void *assoc; 4459bac019dSTadeusz Struk char *iv; 446f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 447d8a32ac2SJussi Kivilinna char *xoutbuf[XBUFSIZE]; 448f8b0d4d0SHerbert Xu char *axbuf[XBUFSIZE]; 449f8b0d4d0SHerbert Xu 4509bac019dSTadeusz Struk iv = kzalloc(MAX_IVLEN, GFP_KERNEL); 4519bac019dSTadeusz Struk if (!iv) 4529bac019dSTadeusz Struk return ret; 45329b77e5dSHoria Geanta key = kmalloc(MAX_KEYLEN, GFP_KERNEL); 45429b77e5dSHoria Geanta if (!key) 45529b77e5dSHoria Geanta goto out_noxbuf; 456f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 457f8b0d4d0SHerbert Xu goto out_noxbuf; 458f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(axbuf)) 459f8b0d4d0SHerbert Xu goto out_noaxbuf; 460d8a32ac2SJussi Kivilinna if (diff_dst && testmgr_alloc_buf(xoutbuf)) 461d8a32ac2SJussi Kivilinna goto out_nooutbuf; 462d8a32ac2SJussi Kivilinna 463d8a32ac2SJussi Kivilinna /* avoid "the frame size is larger than 1024 bytes" compiler warning */ 4648a525fcdSHerbert Xu sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 4 : 2), GFP_KERNEL); 465d8a32ac2SJussi Kivilinna if (!sg) 466d8a32ac2SJussi Kivilinna goto out_nosg; 4678a525fcdSHerbert Xu sgout = &sg[16]; 468d8a32ac2SJussi Kivilinna 469d8a32ac2SJussi Kivilinna if (diff_dst) 470d8a32ac2SJussi Kivilinna d = "-ddst"; 471d8a32ac2SJussi Kivilinna else 472d8a32ac2SJussi Kivilinna d = ""; 473d8a32ac2SJussi Kivilinna 474da7f033dSHerbert Xu if (enc == ENCRYPT) 475da7f033dSHerbert Xu e = "encryption"; 476da7f033dSHerbert Xu else 477da7f033dSHerbert Xu e = "decryption"; 478da7f033dSHerbert Xu 479da7f033dSHerbert Xu init_completion(&result.completion); 480da7f033dSHerbert Xu 481da7f033dSHerbert Xu req = aead_request_alloc(tfm, GFP_KERNEL); 482da7f033dSHerbert Xu if (!req) { 483d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to allocate request for %s\n", 484d8a32ac2SJussi Kivilinna d, algo); 485da7f033dSHerbert Xu goto out; 486da7f033dSHerbert Xu } 487da7f033dSHerbert Xu 488da7f033dSHerbert Xu aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 489da7f033dSHerbert Xu tcrypt_complete, &result); 490da7f033dSHerbert Xu 491da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 49205b1d338SCristian Stoica if (template[i].np) 49305b1d338SCristian Stoica continue; 49405b1d338SCristian Stoica 495da7f033dSHerbert Xu j++; 496da7f033dSHerbert Xu 49758dcf548SJussi Kivilinna /* some templates have no input data but they will 498da7f033dSHerbert Xu * touch input 499da7f033dSHerbert Xu */ 500da7f033dSHerbert Xu input = xbuf[0]; 50158dcf548SJussi Kivilinna input += align_offset; 502da7f033dSHerbert Xu assoc = axbuf[0]; 503da7f033dSHerbert Xu 504fd57f22aSHerbert Xu ret = -EINVAL; 50558dcf548SJussi Kivilinna if (WARN_ON(align_offset + template[i].ilen > 50658dcf548SJussi Kivilinna PAGE_SIZE || template[i].alen > PAGE_SIZE)) 507fd57f22aSHerbert Xu goto out; 508fd57f22aSHerbert Xu 509da7f033dSHerbert Xu memcpy(input, template[i].input, template[i].ilen); 510da7f033dSHerbert Xu memcpy(assoc, template[i].assoc, template[i].alen); 511424a5da6SCristian Stoica iv_len = crypto_aead_ivsize(tfm); 512da7f033dSHerbert Xu if (template[i].iv) 513424a5da6SCristian Stoica memcpy(iv, template[i].iv, iv_len); 514da7f033dSHerbert Xu else 515424a5da6SCristian Stoica memset(iv, 0, iv_len); 516da7f033dSHerbert Xu 517da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 518da7f033dSHerbert Xu if (template[i].wk) 51905b1d338SCristian Stoica crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 520da7f033dSHerbert Xu 52129b77e5dSHoria Geanta if (template[i].klen > MAX_KEYLEN) { 52229b77e5dSHoria Geanta pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n", 52329b77e5dSHoria Geanta d, j, algo, template[i].klen, 52429b77e5dSHoria Geanta MAX_KEYLEN); 52529b77e5dSHoria Geanta ret = -EINVAL; 52629b77e5dSHoria Geanta goto out; 52729b77e5dSHoria Geanta } 52829b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].klen); 529da7f033dSHerbert Xu 53005b1d338SCristian Stoica ret = crypto_aead_setkey(tfm, key, template[i].klen); 531da7f033dSHerbert Xu if (!ret == template[i].fail) { 532d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n", 533d8a32ac2SJussi Kivilinna d, j, algo, crypto_aead_get_flags(tfm)); 534da7f033dSHerbert Xu goto out; 535da7f033dSHerbert Xu } else if (ret) 536da7f033dSHerbert Xu continue; 537da7f033dSHerbert Xu 538da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 539da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 540da7f033dSHerbert Xu if (ret) { 541d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n", 542d8a32ac2SJussi Kivilinna d, authsize, j, algo); 543da7f033dSHerbert Xu goto out; 544da7f033dSHerbert Xu } 545da7f033dSHerbert Xu 5468a525fcdSHerbert Xu k = !!template[i].alen; 5478a525fcdSHerbert Xu sg_init_table(sg, k + 1); 5488a525fcdSHerbert Xu sg_set_buf(&sg[0], assoc, template[i].alen); 5498a525fcdSHerbert Xu sg_set_buf(&sg[k], input, 55005b1d338SCristian Stoica template[i].ilen + (enc ? authsize : 0)); 551d8a32ac2SJussi Kivilinna output = input; 552d8a32ac2SJussi Kivilinna 5538a525fcdSHerbert Xu if (diff_dst) { 5548a525fcdSHerbert Xu sg_init_table(sgout, k + 1); 5558a525fcdSHerbert Xu sg_set_buf(&sgout[0], assoc, template[i].alen); 5568a525fcdSHerbert Xu 5578a525fcdSHerbert Xu output = xoutbuf[0]; 5588a525fcdSHerbert Xu output += align_offset; 5598a525fcdSHerbert Xu sg_set_buf(&sgout[k], output, 5608a525fcdSHerbert Xu template[i].rlen + (enc ? 0 : authsize)); 5618a525fcdSHerbert Xu } 562da7f033dSHerbert Xu 563d8a32ac2SJussi Kivilinna aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 564da7f033dSHerbert Xu template[i].ilen, iv); 565da7f033dSHerbert Xu 5668a525fcdSHerbert Xu aead_request_set_ad(req, template[i].alen); 567da7f033dSHerbert Xu 56805b1d338SCristian Stoica ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req); 569da7f033dSHerbert Xu 570da7f033dSHerbert Xu switch (ret) { 571da7f033dSHerbert Xu case 0: 572e44a1b44SJarod Wilson if (template[i].novrfy) { 573e44a1b44SJarod Wilson /* verification was supposed to fail */ 574d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n", 575d8a32ac2SJussi Kivilinna d, e, j, algo); 576e44a1b44SJarod Wilson /* so really, we got a bad message */ 577e44a1b44SJarod Wilson ret = -EBADMSG; 578e44a1b44SJarod Wilson goto out; 579e44a1b44SJarod Wilson } 580da7f033dSHerbert Xu break; 581da7f033dSHerbert Xu case -EINPROGRESS: 582da7f033dSHerbert Xu case -EBUSY: 5838a45ac12SRabin Vincent wait_for_completion(&result.completion); 58416735d02SWolfram Sang reinit_completion(&result.completion); 5858a45ac12SRabin Vincent ret = result.err; 5868a45ac12SRabin Vincent if (!ret) 587da7f033dSHerbert Xu break; 588e44a1b44SJarod Wilson case -EBADMSG: 589e44a1b44SJarod Wilson if (template[i].novrfy) 590e44a1b44SJarod Wilson /* verification failure was expected */ 591e44a1b44SJarod Wilson continue; 592da7f033dSHerbert Xu /* fall through */ 593da7f033dSHerbert Xu default: 594d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n", 595d8a32ac2SJussi Kivilinna d, e, j, algo, -ret); 596da7f033dSHerbert Xu goto out; 597da7f033dSHerbert Xu } 598da7f033dSHerbert Xu 599d8a32ac2SJussi Kivilinna q = output; 600da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 601d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Test %d failed on %s for %s\n", 602d8a32ac2SJussi Kivilinna d, j, e, algo); 603da7f033dSHerbert Xu hexdump(q, template[i].rlen); 604da7f033dSHerbert Xu ret = -EINVAL; 605da7f033dSHerbert Xu goto out; 606da7f033dSHerbert Xu } 607da7f033dSHerbert Xu } 608da7f033dSHerbert Xu 609da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 61058dcf548SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 61158dcf548SJussi Kivilinna if (align_offset != 0) 61258dcf548SJussi Kivilinna break; 61358dcf548SJussi Kivilinna 61405b1d338SCristian Stoica if (!template[i].np) 61505b1d338SCristian Stoica continue; 61605b1d338SCristian Stoica 617da7f033dSHerbert Xu j++; 618da7f033dSHerbert Xu 619da7f033dSHerbert Xu if (template[i].iv) 620da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 621da7f033dSHerbert Xu else 622da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 623da7f033dSHerbert Xu 624da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 625da7f033dSHerbert Xu if (template[i].wk) 62605b1d338SCristian Stoica crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 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", 62905b1d338SCristian Stoica d, j, algo, template[i].klen, MAX_KEYLEN); 63029b77e5dSHoria Geanta ret = -EINVAL; 63129b77e5dSHoria Geanta goto out; 63229b77e5dSHoria Geanta } 63329b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].klen); 634da7f033dSHerbert Xu 635da7f033dSHerbert Xu ret = crypto_aead_setkey(tfm, key, template[i].klen); 636da7f033dSHerbert Xu if (!ret == template[i].fail) { 637d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n", 638d8a32ac2SJussi Kivilinna d, j, algo, crypto_aead_get_flags(tfm)); 639da7f033dSHerbert Xu goto out; 640da7f033dSHerbert Xu } else if (ret) 641da7f033dSHerbert Xu continue; 642da7f033dSHerbert Xu 643da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 644da7f033dSHerbert Xu 645da7f033dSHerbert Xu ret = -EINVAL; 6468a525fcdSHerbert Xu sg_init_table(sg, template[i].anp + template[i].np); 647d8a32ac2SJussi Kivilinna if (diff_dst) 6488a525fcdSHerbert Xu sg_init_table(sgout, template[i].anp + template[i].np); 6498a525fcdSHerbert Xu 6508a525fcdSHerbert Xu ret = -EINVAL; 6518a525fcdSHerbert Xu for (k = 0, temp = 0; k < template[i].anp; k++) { 6528a525fcdSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 6538a525fcdSHerbert Xu template[i].atap[k] > PAGE_SIZE)) 6548a525fcdSHerbert Xu goto out; 6558a525fcdSHerbert Xu sg_set_buf(&sg[k], 6568a525fcdSHerbert Xu memcpy(axbuf[IDX[k] >> PAGE_SHIFT] + 6578a525fcdSHerbert Xu offset_in_page(IDX[k]), 6588a525fcdSHerbert Xu template[i].assoc + temp, 6598a525fcdSHerbert Xu template[i].atap[k]), 6608a525fcdSHerbert Xu template[i].atap[k]); 6618a525fcdSHerbert Xu if (diff_dst) 6628a525fcdSHerbert Xu sg_set_buf(&sgout[k], 6638a525fcdSHerbert Xu axbuf[IDX[k] >> PAGE_SHIFT] + 6648a525fcdSHerbert Xu offset_in_page(IDX[k]), 6658a525fcdSHerbert Xu template[i].atap[k]); 6668a525fcdSHerbert Xu temp += template[i].atap[k]; 6678a525fcdSHerbert Xu } 6688a525fcdSHerbert Xu 669da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 670da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 671da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 672da7f033dSHerbert Xu goto out; 673da7f033dSHerbert Xu 67405b1d338SCristian Stoica q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]); 67505b1d338SCristian Stoica memcpy(q, template[i].input + temp, template[i].tap[k]); 6768a525fcdSHerbert Xu sg_set_buf(&sg[template[i].anp + k], 6778a525fcdSHerbert Xu q, template[i].tap[k]); 678d8a32ac2SJussi Kivilinna 679d8a32ac2SJussi Kivilinna if (diff_dst) { 680d8a32ac2SJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 681d8a32ac2SJussi Kivilinna offset_in_page(IDX[k]); 682d8a32ac2SJussi Kivilinna 683d8a32ac2SJussi Kivilinna memset(q, 0, template[i].tap[k]); 684d8a32ac2SJussi Kivilinna 6858a525fcdSHerbert Xu sg_set_buf(&sgout[template[i].anp + k], 6868a525fcdSHerbert Xu q, template[i].tap[k]); 687d8a32ac2SJussi Kivilinna } 688d8a32ac2SJussi Kivilinna 6898ec25c51SHoria Geanta n = template[i].tap[k]; 6908ec25c51SHoria Geanta if (k == template[i].np - 1 && enc) 6918ec25c51SHoria Geanta n += authsize; 6928ec25c51SHoria Geanta if (offset_in_page(q) + n < PAGE_SIZE) 6938ec25c51SHoria Geanta q[n] = 0; 6948ec25c51SHoria Geanta 695da7f033dSHerbert Xu temp += template[i].tap[k]; 696da7f033dSHerbert Xu } 697da7f033dSHerbert Xu 698da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 699da7f033dSHerbert Xu if (ret) { 700d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n", 701d8a32ac2SJussi Kivilinna d, authsize, j, algo); 702da7f033dSHerbert Xu goto out; 703da7f033dSHerbert Xu } 704da7f033dSHerbert Xu 705da7f033dSHerbert Xu if (enc) { 7068a525fcdSHerbert Xu if (WARN_ON(sg[template[i].anp + k - 1].offset + 7078a525fcdSHerbert Xu sg[template[i].anp + k - 1].length + 7088a525fcdSHerbert Xu authsize > PAGE_SIZE)) { 709da7f033dSHerbert Xu ret = -EINVAL; 710da7f033dSHerbert Xu goto out; 711da7f033dSHerbert Xu } 712da7f033dSHerbert Xu 713d8a32ac2SJussi Kivilinna if (diff_dst) 7148a525fcdSHerbert Xu sgout[template[i].anp + k - 1].length += 7158a525fcdSHerbert Xu authsize; 7168a525fcdSHerbert Xu sg[template[i].anp + k - 1].length += authsize; 717da7f033dSHerbert Xu } 718da7f033dSHerbert Xu 719d8a32ac2SJussi Kivilinna aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 720da7f033dSHerbert Xu template[i].ilen, 721da7f033dSHerbert Xu iv); 722da7f033dSHerbert Xu 7238a525fcdSHerbert Xu aead_request_set_ad(req, template[i].alen); 724da7f033dSHerbert Xu 72505b1d338SCristian Stoica ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req); 726da7f033dSHerbert Xu 727da7f033dSHerbert Xu switch (ret) { 728da7f033dSHerbert Xu case 0: 729e44a1b44SJarod Wilson if (template[i].novrfy) { 730e44a1b44SJarod Wilson /* verification was supposed to fail */ 731d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n", 732d8a32ac2SJussi Kivilinna d, e, j, algo); 733e44a1b44SJarod Wilson /* so really, we got a bad message */ 734e44a1b44SJarod Wilson ret = -EBADMSG; 735e44a1b44SJarod Wilson goto out; 736e44a1b44SJarod Wilson } 737da7f033dSHerbert Xu break; 738da7f033dSHerbert Xu case -EINPROGRESS: 739da7f033dSHerbert Xu case -EBUSY: 7408a45ac12SRabin Vincent wait_for_completion(&result.completion); 74116735d02SWolfram Sang reinit_completion(&result.completion); 7428a45ac12SRabin Vincent ret = result.err; 7438a45ac12SRabin Vincent if (!ret) 744da7f033dSHerbert Xu break; 745e44a1b44SJarod Wilson case -EBADMSG: 746e44a1b44SJarod Wilson if (template[i].novrfy) 747e44a1b44SJarod Wilson /* verification failure was expected */ 748e44a1b44SJarod Wilson continue; 749da7f033dSHerbert Xu /* fall through */ 750da7f033dSHerbert Xu default: 751d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n", 752d8a32ac2SJussi Kivilinna d, e, j, algo, -ret); 753da7f033dSHerbert Xu goto out; 754da7f033dSHerbert Xu } 755da7f033dSHerbert Xu 756da7f033dSHerbert Xu ret = -EINVAL; 757da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 758d8a32ac2SJussi Kivilinna if (diff_dst) 759d8a32ac2SJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 760d8a32ac2SJussi Kivilinna offset_in_page(IDX[k]); 761d8a32ac2SJussi Kivilinna else 762da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 763da7f033dSHerbert Xu offset_in_page(IDX[k]); 764da7f033dSHerbert Xu 765da7f033dSHerbert Xu n = template[i].tap[k]; 766da7f033dSHerbert Xu if (k == template[i].np - 1) 767da7f033dSHerbert Xu n += enc ? authsize : -authsize; 768da7f033dSHerbert Xu 769da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, n)) { 770d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n", 771d8a32ac2SJussi Kivilinna d, j, e, k, algo); 772da7f033dSHerbert Xu hexdump(q, n); 773da7f033dSHerbert Xu goto out; 774da7f033dSHerbert Xu } 775da7f033dSHerbert Xu 776da7f033dSHerbert Xu q += n; 777da7f033dSHerbert Xu if (k == template[i].np - 1 && !enc) { 778d8a32ac2SJussi Kivilinna if (!diff_dst && 779d8a32ac2SJussi Kivilinna memcmp(q, template[i].input + 780da7f033dSHerbert Xu temp + n, authsize)) 781da7f033dSHerbert Xu n = authsize; 782da7f033dSHerbert Xu else 783da7f033dSHerbert Xu n = 0; 784da7f033dSHerbert Xu } else { 78505b1d338SCristian Stoica for (n = 0; offset_in_page(q + n) && q[n]; n++) 786da7f033dSHerbert Xu ; 787da7f033dSHerbert Xu } 788da7f033dSHerbert Xu if (n) { 789d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n", 790d8a32ac2SJussi Kivilinna d, j, e, k, algo, n); 791da7f033dSHerbert Xu hexdump(q, n); 792da7f033dSHerbert Xu goto out; 793da7f033dSHerbert Xu } 794da7f033dSHerbert Xu 795da7f033dSHerbert Xu temp += template[i].tap[k]; 796da7f033dSHerbert Xu } 797da7f033dSHerbert Xu } 798da7f033dSHerbert Xu 799da7f033dSHerbert Xu ret = 0; 800da7f033dSHerbert Xu 801da7f033dSHerbert Xu out: 802da7f033dSHerbert Xu aead_request_free(req); 803d8a32ac2SJussi Kivilinna kfree(sg); 804d8a32ac2SJussi Kivilinna out_nosg: 805d8a32ac2SJussi Kivilinna if (diff_dst) 806d8a32ac2SJussi Kivilinna testmgr_free_buf(xoutbuf); 807d8a32ac2SJussi Kivilinna out_nooutbuf: 808f8b0d4d0SHerbert Xu testmgr_free_buf(axbuf); 809f8b0d4d0SHerbert Xu out_noaxbuf: 810f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 811f8b0d4d0SHerbert Xu out_noxbuf: 81229b77e5dSHoria Geanta kfree(key); 8139bac019dSTadeusz Struk kfree(iv); 814da7f033dSHerbert Xu return ret; 815da7f033dSHerbert Xu } 816da7f033dSHerbert Xu 817d8a32ac2SJussi Kivilinna static int test_aead(struct crypto_aead *tfm, int enc, 818d8a32ac2SJussi Kivilinna struct aead_testvec *template, unsigned int tcount) 819d8a32ac2SJussi Kivilinna { 82058dcf548SJussi Kivilinna unsigned int alignmask; 821d8a32ac2SJussi Kivilinna int ret; 822d8a32ac2SJussi Kivilinna 823d8a32ac2SJussi Kivilinna /* test 'dst == src' case */ 82458dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, false, 0); 825d8a32ac2SJussi Kivilinna if (ret) 826d8a32ac2SJussi Kivilinna return ret; 827d8a32ac2SJussi Kivilinna 828d8a32ac2SJussi Kivilinna /* test 'dst != src' case */ 82958dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 0); 83058dcf548SJussi Kivilinna if (ret) 83158dcf548SJussi Kivilinna return ret; 83258dcf548SJussi Kivilinna 83358dcf548SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 83458dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 1); 83558dcf548SJussi Kivilinna if (ret) 83658dcf548SJussi Kivilinna return ret; 83758dcf548SJussi Kivilinna 83858dcf548SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 83958dcf548SJussi Kivilinna if (alignmask) { 84058dcf548SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 84158dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 84258dcf548SJussi Kivilinna alignmask + 1); 84358dcf548SJussi Kivilinna if (ret) 84458dcf548SJussi Kivilinna return ret; 84558dcf548SJussi Kivilinna } 84658dcf548SJussi Kivilinna 84758dcf548SJussi Kivilinna return 0; 848d8a32ac2SJussi Kivilinna } 849d8a32ac2SJussi Kivilinna 8501aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc, 8511aa4ecd9SHerbert Xu struct cipher_testvec *template, unsigned int tcount) 8521aa4ecd9SHerbert Xu { 8531aa4ecd9SHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm)); 8541aa4ecd9SHerbert Xu unsigned int i, j, k; 8551aa4ecd9SHerbert Xu char *q; 8561aa4ecd9SHerbert Xu const char *e; 8571aa4ecd9SHerbert Xu void *data; 858f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 859f8b0d4d0SHerbert Xu int ret = -ENOMEM; 860f8b0d4d0SHerbert Xu 861f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 862f8b0d4d0SHerbert Xu goto out_nobuf; 8631aa4ecd9SHerbert Xu 8641aa4ecd9SHerbert Xu if (enc == ENCRYPT) 8651aa4ecd9SHerbert Xu e = "encryption"; 8661aa4ecd9SHerbert Xu else 8671aa4ecd9SHerbert Xu e = "decryption"; 8681aa4ecd9SHerbert Xu 8691aa4ecd9SHerbert Xu j = 0; 8701aa4ecd9SHerbert Xu for (i = 0; i < tcount; i++) { 8711aa4ecd9SHerbert Xu if (template[i].np) 8721aa4ecd9SHerbert Xu continue; 8731aa4ecd9SHerbert Xu 8741aa4ecd9SHerbert Xu j++; 8751aa4ecd9SHerbert Xu 876fd57f22aSHerbert Xu ret = -EINVAL; 877fd57f22aSHerbert Xu if (WARN_ON(template[i].ilen > PAGE_SIZE)) 878fd57f22aSHerbert Xu goto out; 879fd57f22aSHerbert Xu 8801aa4ecd9SHerbert Xu data = xbuf[0]; 8811aa4ecd9SHerbert Xu memcpy(data, template[i].input, template[i].ilen); 8821aa4ecd9SHerbert Xu 8831aa4ecd9SHerbert Xu crypto_cipher_clear_flags(tfm, ~0); 8841aa4ecd9SHerbert Xu if (template[i].wk) 8851aa4ecd9SHerbert Xu crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 8861aa4ecd9SHerbert Xu 8871aa4ecd9SHerbert Xu ret = crypto_cipher_setkey(tfm, template[i].key, 8881aa4ecd9SHerbert Xu template[i].klen); 8891aa4ecd9SHerbert Xu if (!ret == template[i].fail) { 8901aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: setkey failed " 8911aa4ecd9SHerbert Xu "on test %d for %s: flags=%x\n", j, 8921aa4ecd9SHerbert Xu algo, crypto_cipher_get_flags(tfm)); 8931aa4ecd9SHerbert Xu goto out; 8941aa4ecd9SHerbert Xu } else if (ret) 8951aa4ecd9SHerbert Xu continue; 8961aa4ecd9SHerbert Xu 8971aa4ecd9SHerbert Xu for (k = 0; k < template[i].ilen; 8981aa4ecd9SHerbert Xu k += crypto_cipher_blocksize(tfm)) { 8991aa4ecd9SHerbert Xu if (enc) 9001aa4ecd9SHerbert Xu crypto_cipher_encrypt_one(tfm, data + k, 9011aa4ecd9SHerbert Xu data + k); 9021aa4ecd9SHerbert Xu else 9031aa4ecd9SHerbert Xu crypto_cipher_decrypt_one(tfm, data + k, 9041aa4ecd9SHerbert Xu data + k); 9051aa4ecd9SHerbert Xu } 9061aa4ecd9SHerbert Xu 9071aa4ecd9SHerbert Xu q = data; 9081aa4ecd9SHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 9091aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: Test %d failed " 9101aa4ecd9SHerbert Xu "on %s for %s\n", j, e, algo); 9111aa4ecd9SHerbert Xu hexdump(q, template[i].rlen); 9121aa4ecd9SHerbert Xu ret = -EINVAL; 9131aa4ecd9SHerbert Xu goto out; 9141aa4ecd9SHerbert Xu } 9151aa4ecd9SHerbert Xu } 9161aa4ecd9SHerbert Xu 9171aa4ecd9SHerbert Xu ret = 0; 9181aa4ecd9SHerbert Xu 9191aa4ecd9SHerbert Xu out: 920f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 921f8b0d4d0SHerbert Xu out_nobuf: 9221aa4ecd9SHerbert Xu return ret; 9231aa4ecd9SHerbert Xu } 9241aa4ecd9SHerbert Xu 92512773d93SHerbert Xu static int __test_skcipher(struct crypto_skcipher *tfm, int enc, 92608d6af8cSJussi Kivilinna struct cipher_testvec *template, unsigned int tcount, 9273a338f20SJussi Kivilinna const bool diff_dst, const int align_offset) 928da7f033dSHerbert Xu { 929da7f033dSHerbert Xu const char *algo = 93012773d93SHerbert Xu crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)); 931da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 932da7f033dSHerbert Xu char *q; 93312773d93SHerbert Xu struct skcipher_request *req; 934da7f033dSHerbert Xu struct scatterlist sg[8]; 93508d6af8cSJussi Kivilinna struct scatterlist sgout[8]; 93608d6af8cSJussi Kivilinna const char *e, *d; 937da7f033dSHerbert Xu struct tcrypt_result result; 938da7f033dSHerbert Xu void *data; 939da7f033dSHerbert Xu char iv[MAX_IVLEN]; 940f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 94108d6af8cSJussi Kivilinna char *xoutbuf[XBUFSIZE]; 942f8b0d4d0SHerbert Xu int ret = -ENOMEM; 943f8b0d4d0SHerbert Xu 944f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 945f8b0d4d0SHerbert Xu goto out_nobuf; 946da7f033dSHerbert Xu 94708d6af8cSJussi Kivilinna if (diff_dst && testmgr_alloc_buf(xoutbuf)) 94808d6af8cSJussi Kivilinna goto out_nooutbuf; 94908d6af8cSJussi Kivilinna 95008d6af8cSJussi Kivilinna if (diff_dst) 95108d6af8cSJussi Kivilinna d = "-ddst"; 95208d6af8cSJussi Kivilinna else 95308d6af8cSJussi Kivilinna d = ""; 95408d6af8cSJussi Kivilinna 955da7f033dSHerbert Xu if (enc == ENCRYPT) 956da7f033dSHerbert Xu e = "encryption"; 957da7f033dSHerbert Xu else 958da7f033dSHerbert Xu e = "decryption"; 959da7f033dSHerbert Xu 960da7f033dSHerbert Xu init_completion(&result.completion); 961da7f033dSHerbert Xu 96212773d93SHerbert Xu req = skcipher_request_alloc(tfm, GFP_KERNEL); 963da7f033dSHerbert Xu if (!req) { 96408d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Failed to allocate request for %s\n", 96508d6af8cSJussi Kivilinna d, algo); 966da7f033dSHerbert Xu goto out; 967da7f033dSHerbert Xu } 968da7f033dSHerbert Xu 96912773d93SHerbert Xu skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 970da7f033dSHerbert Xu tcrypt_complete, &result); 971da7f033dSHerbert Xu 972da7f033dSHerbert Xu j = 0; 973da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 974bbb9a7ddSCristian Stoica if (template[i].np && !template[i].also_non_np) 975bbb9a7ddSCristian Stoica continue; 976bbb9a7ddSCristian Stoica 977da7f033dSHerbert Xu if (template[i].iv) 978da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 979da7f033dSHerbert Xu else 980da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 981da7f033dSHerbert Xu 982da7f033dSHerbert Xu j++; 983fd57f22aSHerbert Xu ret = -EINVAL; 984a1aa44a2SCristian Stoica if (WARN_ON(align_offset + template[i].ilen > PAGE_SIZE)) 985fd57f22aSHerbert Xu goto out; 986fd57f22aSHerbert Xu 987da7f033dSHerbert Xu data = xbuf[0]; 9883a338f20SJussi Kivilinna data += align_offset; 989da7f033dSHerbert Xu memcpy(data, template[i].input, template[i].ilen); 990da7f033dSHerbert Xu 99112773d93SHerbert Xu crypto_skcipher_clear_flags(tfm, ~0); 992da7f033dSHerbert Xu if (template[i].wk) 99312773d93SHerbert Xu crypto_skcipher_set_flags(tfm, 99412773d93SHerbert Xu CRYPTO_TFM_REQ_WEAK_KEY); 995da7f033dSHerbert Xu 99612773d93SHerbert Xu ret = crypto_skcipher_setkey(tfm, template[i].key, 997da7f033dSHerbert Xu template[i].klen); 998da7f033dSHerbert Xu if (!ret == template[i].fail) { 99908d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n", 100012773d93SHerbert Xu d, j, algo, crypto_skcipher_get_flags(tfm)); 1001da7f033dSHerbert Xu goto out; 1002da7f033dSHerbert Xu } else if (ret) 1003da7f033dSHerbert Xu continue; 1004da7f033dSHerbert Xu 1005da7f033dSHerbert Xu sg_init_one(&sg[0], data, template[i].ilen); 100608d6af8cSJussi Kivilinna if (diff_dst) { 100708d6af8cSJussi Kivilinna data = xoutbuf[0]; 10083a338f20SJussi Kivilinna data += align_offset; 100908d6af8cSJussi Kivilinna sg_init_one(&sgout[0], data, template[i].ilen); 101008d6af8cSJussi Kivilinna } 1011da7f033dSHerbert Xu 101212773d93SHerbert Xu skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 1013da7f033dSHerbert Xu template[i].ilen, iv); 101412773d93SHerbert Xu ret = enc ? crypto_skcipher_encrypt(req) : 101512773d93SHerbert Xu crypto_skcipher_decrypt(req); 1016da7f033dSHerbert Xu 1017da7f033dSHerbert Xu switch (ret) { 1018da7f033dSHerbert Xu case 0: 1019da7f033dSHerbert Xu break; 1020da7f033dSHerbert Xu case -EINPROGRESS: 1021da7f033dSHerbert Xu case -EBUSY: 10228a45ac12SRabin Vincent wait_for_completion(&result.completion); 102316735d02SWolfram Sang reinit_completion(&result.completion); 10248a45ac12SRabin Vincent ret = result.err; 10258a45ac12SRabin Vincent if (!ret) 1026da7f033dSHerbert Xu break; 1027da7f033dSHerbert Xu /* fall through */ 1028da7f033dSHerbert Xu default: 102908d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n", 103008d6af8cSJussi Kivilinna d, e, j, algo, -ret); 1031da7f033dSHerbert Xu goto out; 1032da7f033dSHerbert Xu } 1033da7f033dSHerbert Xu 1034da7f033dSHerbert Xu q = data; 1035da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 103608d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Test %d failed on %s for %s\n", 103708d6af8cSJussi Kivilinna d, j, e, algo); 1038da7f033dSHerbert Xu hexdump(q, template[i].rlen); 1039da7f033dSHerbert Xu ret = -EINVAL; 1040da7f033dSHerbert Xu goto out; 1041da7f033dSHerbert Xu } 1042da7f033dSHerbert Xu } 1043da7f033dSHerbert Xu 1044da7f033dSHerbert Xu j = 0; 1045da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 10463a338f20SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 10473a338f20SJussi Kivilinna if (align_offset != 0) 10483a338f20SJussi Kivilinna break; 1049da7f033dSHerbert Xu 1050bbb9a7ddSCristian Stoica if (!template[i].np) 1051bbb9a7ddSCristian Stoica continue; 1052bbb9a7ddSCristian Stoica 1053da7f033dSHerbert Xu if (template[i].iv) 1054da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 1055da7f033dSHerbert Xu else 1056da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 1057da7f033dSHerbert Xu 1058da7f033dSHerbert Xu j++; 105912773d93SHerbert Xu crypto_skcipher_clear_flags(tfm, ~0); 1060da7f033dSHerbert Xu if (template[i].wk) 106112773d93SHerbert Xu crypto_skcipher_set_flags(tfm, 106212773d93SHerbert Xu CRYPTO_TFM_REQ_WEAK_KEY); 1063da7f033dSHerbert Xu 106412773d93SHerbert Xu ret = crypto_skcipher_setkey(tfm, template[i].key, 1065da7f033dSHerbert Xu template[i].klen); 1066da7f033dSHerbert Xu if (!ret == template[i].fail) { 106708d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n", 106812773d93SHerbert Xu d, j, algo, crypto_skcipher_get_flags(tfm)); 1069da7f033dSHerbert Xu goto out; 1070da7f033dSHerbert Xu } else if (ret) 1071da7f033dSHerbert Xu continue; 1072da7f033dSHerbert Xu 1073da7f033dSHerbert Xu temp = 0; 1074da7f033dSHerbert Xu ret = -EINVAL; 1075da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 107608d6af8cSJussi Kivilinna if (diff_dst) 107708d6af8cSJussi Kivilinna sg_init_table(sgout, template[i].np); 1078da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 1079da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 1080da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 1081da7f033dSHerbert Xu goto out; 1082da7f033dSHerbert Xu 1083a1aa44a2SCristian Stoica q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]); 1084da7f033dSHerbert Xu 1085a1aa44a2SCristian Stoica memcpy(q, template[i].input + temp, template[i].tap[k]); 1086da7f033dSHerbert Xu 1087a1aa44a2SCristian Stoica if (offset_in_page(q) + template[i].tap[k] < PAGE_SIZE) 1088da7f033dSHerbert Xu q[template[i].tap[k]] = 0; 1089da7f033dSHerbert Xu 1090da7f033dSHerbert Xu sg_set_buf(&sg[k], q, template[i].tap[k]); 109108d6af8cSJussi Kivilinna if (diff_dst) { 109208d6af8cSJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 109308d6af8cSJussi Kivilinna offset_in_page(IDX[k]); 109408d6af8cSJussi Kivilinna 1095a1aa44a2SCristian Stoica sg_set_buf(&sgout[k], q, template[i].tap[k]); 109608d6af8cSJussi Kivilinna 109708d6af8cSJussi Kivilinna memset(q, 0, template[i].tap[k]); 109808d6af8cSJussi Kivilinna if (offset_in_page(q) + 109908d6af8cSJussi Kivilinna template[i].tap[k] < PAGE_SIZE) 110008d6af8cSJussi Kivilinna q[template[i].tap[k]] = 0; 110108d6af8cSJussi Kivilinna } 1102da7f033dSHerbert Xu 1103da7f033dSHerbert Xu temp += template[i].tap[k]; 1104da7f033dSHerbert Xu } 1105da7f033dSHerbert Xu 110612773d93SHerbert Xu skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 1107da7f033dSHerbert Xu template[i].ilen, iv); 1108da7f033dSHerbert Xu 110912773d93SHerbert Xu ret = enc ? crypto_skcipher_encrypt(req) : 111012773d93SHerbert Xu crypto_skcipher_decrypt(req); 1111da7f033dSHerbert Xu 1112da7f033dSHerbert Xu switch (ret) { 1113da7f033dSHerbert Xu case 0: 1114da7f033dSHerbert Xu break; 1115da7f033dSHerbert Xu case -EINPROGRESS: 1116da7f033dSHerbert Xu case -EBUSY: 11178a45ac12SRabin Vincent wait_for_completion(&result.completion); 111816735d02SWolfram Sang reinit_completion(&result.completion); 11198a45ac12SRabin Vincent ret = result.err; 11208a45ac12SRabin Vincent if (!ret) 1121da7f033dSHerbert Xu break; 1122da7f033dSHerbert Xu /* fall through */ 1123da7f033dSHerbert Xu default: 112408d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n", 112508d6af8cSJussi Kivilinna d, e, j, algo, -ret); 1126da7f033dSHerbert Xu goto out; 1127da7f033dSHerbert Xu } 1128da7f033dSHerbert Xu 1129da7f033dSHerbert Xu temp = 0; 1130da7f033dSHerbert Xu ret = -EINVAL; 1131da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 113208d6af8cSJussi Kivilinna if (diff_dst) 113308d6af8cSJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 113408d6af8cSJussi Kivilinna offset_in_page(IDX[k]); 113508d6af8cSJussi Kivilinna else 1136da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 1137da7f033dSHerbert Xu offset_in_page(IDX[k]); 1138da7f033dSHerbert Xu 1139da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, 1140da7f033dSHerbert Xu template[i].tap[k])) { 114108d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n", 114208d6af8cSJussi Kivilinna d, j, e, k, algo); 1143da7f033dSHerbert Xu hexdump(q, template[i].tap[k]); 1144da7f033dSHerbert Xu goto out; 1145da7f033dSHerbert Xu } 1146da7f033dSHerbert Xu 1147da7f033dSHerbert Xu q += template[i].tap[k]; 1148da7f033dSHerbert Xu for (n = 0; offset_in_page(q + n) && q[n]; n++) 1149da7f033dSHerbert Xu ; 1150da7f033dSHerbert Xu if (n) { 115108d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n", 115208d6af8cSJussi Kivilinna d, j, e, k, algo, n); 1153da7f033dSHerbert Xu hexdump(q, n); 1154da7f033dSHerbert Xu goto out; 1155da7f033dSHerbert Xu } 1156da7f033dSHerbert Xu temp += template[i].tap[k]; 1157da7f033dSHerbert Xu } 1158da7f033dSHerbert Xu } 1159da7f033dSHerbert Xu 1160da7f033dSHerbert Xu ret = 0; 1161da7f033dSHerbert Xu 1162da7f033dSHerbert Xu out: 116312773d93SHerbert Xu skcipher_request_free(req); 116408d6af8cSJussi Kivilinna if (diff_dst) 116508d6af8cSJussi Kivilinna testmgr_free_buf(xoutbuf); 116608d6af8cSJussi Kivilinna out_nooutbuf: 1167f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 1168f8b0d4d0SHerbert Xu out_nobuf: 1169da7f033dSHerbert Xu return ret; 1170da7f033dSHerbert Xu } 1171da7f033dSHerbert Xu 117212773d93SHerbert Xu static int test_skcipher(struct crypto_skcipher *tfm, int enc, 117308d6af8cSJussi Kivilinna struct cipher_testvec *template, unsigned int tcount) 117408d6af8cSJussi Kivilinna { 11753a338f20SJussi Kivilinna unsigned int alignmask; 117608d6af8cSJussi Kivilinna int ret; 117708d6af8cSJussi Kivilinna 117808d6af8cSJussi Kivilinna /* test 'dst == src' case */ 11793a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, false, 0); 118008d6af8cSJussi Kivilinna if (ret) 118108d6af8cSJussi Kivilinna return ret; 118208d6af8cSJussi Kivilinna 118308d6af8cSJussi Kivilinna /* test 'dst != src' case */ 11843a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 0); 11853a338f20SJussi Kivilinna if (ret) 11863a338f20SJussi Kivilinna return ret; 11873a338f20SJussi Kivilinna 11883a338f20SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 11893a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 1); 11903a338f20SJussi Kivilinna if (ret) 11913a338f20SJussi Kivilinna return ret; 11923a338f20SJussi Kivilinna 11933a338f20SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 11943a338f20SJussi Kivilinna if (alignmask) { 11953a338f20SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 11963a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 11973a338f20SJussi Kivilinna alignmask + 1); 11983a338f20SJussi Kivilinna if (ret) 11993a338f20SJussi Kivilinna return ret; 12003a338f20SJussi Kivilinna } 12013a338f20SJussi Kivilinna 12023a338f20SJussi Kivilinna return 0; 120308d6af8cSJussi Kivilinna } 120408d6af8cSJussi Kivilinna 1205da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate, 1206da7f033dSHerbert Xu struct comp_testvec *dtemplate, int ctcount, int dtcount) 1207da7f033dSHerbert Xu { 1208da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm)); 1209da7f033dSHerbert Xu unsigned int i; 1210da7f033dSHerbert Xu char result[COMP_BUF_SIZE]; 1211da7f033dSHerbert Xu int ret; 1212da7f033dSHerbert Xu 1213da7f033dSHerbert Xu for (i = 0; i < ctcount; i++) { 1214c79cf910SGeert Uytterhoeven int ilen; 1215c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 1216da7f033dSHerbert Xu 1217da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 1218da7f033dSHerbert Xu 1219da7f033dSHerbert Xu ilen = ctemplate[i].inlen; 1220da7f033dSHerbert Xu ret = crypto_comp_compress(tfm, ctemplate[i].input, 1221da7f033dSHerbert Xu ilen, result, &dlen); 1222da7f033dSHerbert Xu if (ret) { 1223da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: compression failed " 1224da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1225da7f033dSHerbert Xu -ret); 1226da7f033dSHerbert Xu goto out; 1227da7f033dSHerbert Xu } 1228da7f033dSHerbert Xu 1229b812eb00SGeert Uytterhoeven if (dlen != ctemplate[i].outlen) { 1230b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Compression test %d " 1231b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1232b812eb00SGeert Uytterhoeven dlen); 1233b812eb00SGeert Uytterhoeven ret = -EINVAL; 1234b812eb00SGeert Uytterhoeven goto out; 1235b812eb00SGeert Uytterhoeven } 1236b812eb00SGeert Uytterhoeven 1237da7f033dSHerbert Xu if (memcmp(result, ctemplate[i].output, dlen)) { 1238da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Compression test %d " 1239da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 1240da7f033dSHerbert Xu hexdump(result, dlen); 1241da7f033dSHerbert Xu ret = -EINVAL; 1242da7f033dSHerbert Xu goto out; 1243da7f033dSHerbert Xu } 1244da7f033dSHerbert Xu } 1245da7f033dSHerbert Xu 1246da7f033dSHerbert Xu for (i = 0; i < dtcount; i++) { 1247c79cf910SGeert Uytterhoeven int ilen; 1248c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 1249da7f033dSHerbert Xu 1250da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 1251da7f033dSHerbert Xu 1252da7f033dSHerbert Xu ilen = dtemplate[i].inlen; 1253da7f033dSHerbert Xu ret = crypto_comp_decompress(tfm, dtemplate[i].input, 1254da7f033dSHerbert Xu ilen, result, &dlen); 1255da7f033dSHerbert Xu if (ret) { 1256da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: decompression failed " 1257da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1258da7f033dSHerbert Xu -ret); 1259da7f033dSHerbert Xu goto out; 1260da7f033dSHerbert Xu } 1261da7f033dSHerbert Xu 1262b812eb00SGeert Uytterhoeven if (dlen != dtemplate[i].outlen) { 1263b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Decompression test %d " 1264b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1265b812eb00SGeert Uytterhoeven dlen); 1266b812eb00SGeert Uytterhoeven ret = -EINVAL; 1267b812eb00SGeert Uytterhoeven goto out; 1268b812eb00SGeert Uytterhoeven } 1269b812eb00SGeert Uytterhoeven 1270da7f033dSHerbert Xu if (memcmp(result, dtemplate[i].output, dlen)) { 1271da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Decompression test %d " 1272da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 1273da7f033dSHerbert Xu hexdump(result, dlen); 1274da7f033dSHerbert Xu ret = -EINVAL; 1275da7f033dSHerbert Xu goto out; 1276da7f033dSHerbert Xu } 1277da7f033dSHerbert Xu } 1278da7f033dSHerbert Xu 1279da7f033dSHerbert Xu ret = 0; 1280da7f033dSHerbert Xu 1281da7f033dSHerbert Xu out: 1282da7f033dSHerbert Xu return ret; 1283da7f033dSHerbert Xu } 1284da7f033dSHerbert Xu 12858064efb8SGeert Uytterhoeven static int test_pcomp(struct crypto_pcomp *tfm, 12868064efb8SGeert Uytterhoeven struct pcomp_testvec *ctemplate, 12878064efb8SGeert Uytterhoeven struct pcomp_testvec *dtemplate, int ctcount, 12888064efb8SGeert Uytterhoeven int dtcount) 12898064efb8SGeert Uytterhoeven { 12908064efb8SGeert Uytterhoeven const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm)); 12918064efb8SGeert Uytterhoeven unsigned int i; 12928064efb8SGeert Uytterhoeven char result[COMP_BUF_SIZE]; 12933ce858cbSGeert Uytterhoeven int res; 12948064efb8SGeert Uytterhoeven 12958064efb8SGeert Uytterhoeven for (i = 0; i < ctcount; i++) { 12968064efb8SGeert Uytterhoeven struct comp_request req; 12973ce858cbSGeert Uytterhoeven unsigned int produced = 0; 12988064efb8SGeert Uytterhoeven 12993ce858cbSGeert Uytterhoeven res = crypto_compress_setup(tfm, ctemplate[i].params, 13008064efb8SGeert Uytterhoeven ctemplate[i].paramsize); 13013ce858cbSGeert Uytterhoeven if (res) { 13028064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression setup failed on test " 13033ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 13043ce858cbSGeert Uytterhoeven return res; 13058064efb8SGeert Uytterhoeven } 13068064efb8SGeert Uytterhoeven 13073ce858cbSGeert Uytterhoeven res = crypto_compress_init(tfm); 13083ce858cbSGeert Uytterhoeven if (res) { 13098064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression init failed on test " 13103ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 13113ce858cbSGeert Uytterhoeven return res; 13128064efb8SGeert Uytterhoeven } 13138064efb8SGeert Uytterhoeven 13148064efb8SGeert Uytterhoeven memset(result, 0, sizeof(result)); 13158064efb8SGeert Uytterhoeven 13168064efb8SGeert Uytterhoeven req.next_in = ctemplate[i].input; 13178064efb8SGeert Uytterhoeven req.avail_in = ctemplate[i].inlen / 2; 13188064efb8SGeert Uytterhoeven req.next_out = result; 13198064efb8SGeert Uytterhoeven req.avail_out = ctemplate[i].outlen / 2; 13208064efb8SGeert Uytterhoeven 13213ce858cbSGeert Uytterhoeven res = crypto_compress_update(tfm, &req); 13223ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 13238064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression update failed on test " 13243ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 13253ce858cbSGeert Uytterhoeven return res; 13268064efb8SGeert Uytterhoeven } 13273ce858cbSGeert Uytterhoeven if (res > 0) 13283ce858cbSGeert Uytterhoeven produced += res; 13298064efb8SGeert Uytterhoeven 13308064efb8SGeert Uytterhoeven /* Add remaining input data */ 13318064efb8SGeert Uytterhoeven req.avail_in += (ctemplate[i].inlen + 1) / 2; 13328064efb8SGeert Uytterhoeven 13333ce858cbSGeert Uytterhoeven res = crypto_compress_update(tfm, &req); 13343ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 13358064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression update failed on test " 13363ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 13373ce858cbSGeert Uytterhoeven return res; 13388064efb8SGeert Uytterhoeven } 13393ce858cbSGeert Uytterhoeven if (res > 0) 13403ce858cbSGeert Uytterhoeven produced += res; 13418064efb8SGeert Uytterhoeven 13428064efb8SGeert Uytterhoeven /* Provide remaining output space */ 13438064efb8SGeert Uytterhoeven req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2; 13448064efb8SGeert Uytterhoeven 13453ce858cbSGeert Uytterhoeven res = crypto_compress_final(tfm, &req); 13463ce858cbSGeert Uytterhoeven if (res < 0) { 13478064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression final failed on test " 13483ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 13493ce858cbSGeert Uytterhoeven return res; 13508064efb8SGeert Uytterhoeven } 13513ce858cbSGeert Uytterhoeven produced += res; 13528064efb8SGeert Uytterhoeven 13538064efb8SGeert Uytterhoeven if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) { 13548064efb8SGeert Uytterhoeven pr_err("alg: comp: Compression test %d failed for %s: " 13558064efb8SGeert Uytterhoeven "output len = %d (expected %d)\n", i + 1, algo, 13568064efb8SGeert Uytterhoeven COMP_BUF_SIZE - req.avail_out, 13578064efb8SGeert Uytterhoeven ctemplate[i].outlen); 13588064efb8SGeert Uytterhoeven return -EINVAL; 13598064efb8SGeert Uytterhoeven } 13608064efb8SGeert Uytterhoeven 13613ce858cbSGeert Uytterhoeven if (produced != ctemplate[i].outlen) { 13623ce858cbSGeert Uytterhoeven pr_err("alg: comp: Compression test %d failed for %s: " 13633ce858cbSGeert Uytterhoeven "returned len = %u (expected %d)\n", i + 1, 13643ce858cbSGeert Uytterhoeven algo, produced, ctemplate[i].outlen); 13653ce858cbSGeert Uytterhoeven return -EINVAL; 13663ce858cbSGeert Uytterhoeven } 13673ce858cbSGeert Uytterhoeven 13688064efb8SGeert Uytterhoeven if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) { 13698064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Compression test %d failed for " 13708064efb8SGeert Uytterhoeven "%s\n", i + 1, algo); 13718064efb8SGeert Uytterhoeven hexdump(result, ctemplate[i].outlen); 13728064efb8SGeert Uytterhoeven return -EINVAL; 13738064efb8SGeert Uytterhoeven } 13748064efb8SGeert Uytterhoeven } 13758064efb8SGeert Uytterhoeven 13768064efb8SGeert Uytterhoeven for (i = 0; i < dtcount; i++) { 13778064efb8SGeert Uytterhoeven struct comp_request req; 13783ce858cbSGeert Uytterhoeven unsigned int produced = 0; 13798064efb8SGeert Uytterhoeven 13803ce858cbSGeert Uytterhoeven res = crypto_decompress_setup(tfm, dtemplate[i].params, 13818064efb8SGeert Uytterhoeven dtemplate[i].paramsize); 13823ce858cbSGeert Uytterhoeven if (res) { 13838064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression setup failed on " 13843ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 13853ce858cbSGeert Uytterhoeven return res; 13868064efb8SGeert Uytterhoeven } 13878064efb8SGeert Uytterhoeven 13883ce858cbSGeert Uytterhoeven res = crypto_decompress_init(tfm); 13893ce858cbSGeert Uytterhoeven if (res) { 13908064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression init failed on test " 13913ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 13923ce858cbSGeert Uytterhoeven return res; 13938064efb8SGeert Uytterhoeven } 13948064efb8SGeert Uytterhoeven 13958064efb8SGeert Uytterhoeven memset(result, 0, sizeof(result)); 13968064efb8SGeert Uytterhoeven 13978064efb8SGeert Uytterhoeven req.next_in = dtemplate[i].input; 13988064efb8SGeert Uytterhoeven req.avail_in = dtemplate[i].inlen / 2; 13998064efb8SGeert Uytterhoeven req.next_out = result; 14008064efb8SGeert Uytterhoeven req.avail_out = dtemplate[i].outlen / 2; 14018064efb8SGeert Uytterhoeven 14023ce858cbSGeert Uytterhoeven res = crypto_decompress_update(tfm, &req); 14033ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 14048064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression update failed on " 14053ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 14063ce858cbSGeert Uytterhoeven return res; 14078064efb8SGeert Uytterhoeven } 14083ce858cbSGeert Uytterhoeven if (res > 0) 14093ce858cbSGeert Uytterhoeven produced += res; 14108064efb8SGeert Uytterhoeven 14118064efb8SGeert Uytterhoeven /* Add remaining input data */ 14128064efb8SGeert Uytterhoeven req.avail_in += (dtemplate[i].inlen + 1) / 2; 14138064efb8SGeert Uytterhoeven 14143ce858cbSGeert Uytterhoeven res = crypto_decompress_update(tfm, &req); 14153ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 14168064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression update failed on " 14173ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 14183ce858cbSGeert Uytterhoeven return res; 14198064efb8SGeert Uytterhoeven } 14203ce858cbSGeert Uytterhoeven if (res > 0) 14213ce858cbSGeert Uytterhoeven produced += res; 14228064efb8SGeert Uytterhoeven 14238064efb8SGeert Uytterhoeven /* Provide remaining output space */ 14248064efb8SGeert Uytterhoeven req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2; 14258064efb8SGeert Uytterhoeven 14263ce858cbSGeert Uytterhoeven res = crypto_decompress_final(tfm, &req); 14273ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 14288064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression final failed on " 14293ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 14303ce858cbSGeert Uytterhoeven return res; 14318064efb8SGeert Uytterhoeven } 14323ce858cbSGeert Uytterhoeven if (res > 0) 14333ce858cbSGeert Uytterhoeven produced += res; 14348064efb8SGeert Uytterhoeven 14358064efb8SGeert Uytterhoeven if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) { 14368064efb8SGeert Uytterhoeven pr_err("alg: comp: Decompression test %d failed for " 14378064efb8SGeert Uytterhoeven "%s: output len = %d (expected %d)\n", i + 1, 14388064efb8SGeert Uytterhoeven algo, COMP_BUF_SIZE - req.avail_out, 14398064efb8SGeert Uytterhoeven dtemplate[i].outlen); 14408064efb8SGeert Uytterhoeven return -EINVAL; 14418064efb8SGeert Uytterhoeven } 14428064efb8SGeert Uytterhoeven 14433ce858cbSGeert Uytterhoeven if (produced != dtemplate[i].outlen) { 14443ce858cbSGeert Uytterhoeven pr_err("alg: comp: Decompression test %d failed for " 14453ce858cbSGeert Uytterhoeven "%s: returned len = %u (expected %d)\n", i + 1, 14463ce858cbSGeert Uytterhoeven algo, produced, dtemplate[i].outlen); 14473ce858cbSGeert Uytterhoeven return -EINVAL; 14483ce858cbSGeert Uytterhoeven } 14493ce858cbSGeert Uytterhoeven 14508064efb8SGeert Uytterhoeven if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) { 14518064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Decompression test %d failed for " 14528064efb8SGeert Uytterhoeven "%s\n", i + 1, algo); 14538064efb8SGeert Uytterhoeven hexdump(result, dtemplate[i].outlen); 14548064efb8SGeert Uytterhoeven return -EINVAL; 14558064efb8SGeert Uytterhoeven } 14568064efb8SGeert Uytterhoeven } 14578064efb8SGeert Uytterhoeven 14588064efb8SGeert Uytterhoeven return 0; 14598064efb8SGeert Uytterhoeven } 14608064efb8SGeert Uytterhoeven 14617647d6ceSJarod Wilson 14627647d6ceSJarod Wilson static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template, 14637647d6ceSJarod Wilson unsigned int tcount) 14647647d6ceSJarod Wilson { 14657647d6ceSJarod Wilson const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm)); 1466fa4ef8a6SFelipe Contreras int err = 0, i, j, seedsize; 14677647d6ceSJarod Wilson u8 *seed; 14687647d6ceSJarod Wilson char result[32]; 14697647d6ceSJarod Wilson 14707647d6ceSJarod Wilson seedsize = crypto_rng_seedsize(tfm); 14717647d6ceSJarod Wilson 14727647d6ceSJarod Wilson seed = kmalloc(seedsize, GFP_KERNEL); 14737647d6ceSJarod Wilson if (!seed) { 14747647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to allocate seed space " 14757647d6ceSJarod Wilson "for %s\n", algo); 14767647d6ceSJarod Wilson return -ENOMEM; 14777647d6ceSJarod Wilson } 14787647d6ceSJarod Wilson 14797647d6ceSJarod Wilson for (i = 0; i < tcount; i++) { 14807647d6ceSJarod Wilson memset(result, 0, 32); 14817647d6ceSJarod Wilson 14827647d6ceSJarod Wilson memcpy(seed, template[i].v, template[i].vlen); 14837647d6ceSJarod Wilson memcpy(seed + template[i].vlen, template[i].key, 14847647d6ceSJarod Wilson template[i].klen); 14857647d6ceSJarod Wilson memcpy(seed + template[i].vlen + template[i].klen, 14867647d6ceSJarod Wilson template[i].dt, template[i].dtlen); 14877647d6ceSJarod Wilson 14887647d6ceSJarod Wilson err = crypto_rng_reset(tfm, seed, seedsize); 14897647d6ceSJarod Wilson if (err) { 14907647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to reset rng " 14917647d6ceSJarod Wilson "for %s\n", algo); 14927647d6ceSJarod Wilson goto out; 14937647d6ceSJarod Wilson } 14947647d6ceSJarod Wilson 14957647d6ceSJarod Wilson for (j = 0; j < template[i].loops; j++) { 14967647d6ceSJarod Wilson err = crypto_rng_get_bytes(tfm, result, 14977647d6ceSJarod Wilson template[i].rlen); 149819e60e13SStephan Mueller if (err < 0) { 14997647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to obtain " 15007647d6ceSJarod Wilson "the correct amount of random data for " 150119e60e13SStephan Mueller "%s (requested %d)\n", algo, 150219e60e13SStephan Mueller template[i].rlen); 15037647d6ceSJarod Wilson goto out; 15047647d6ceSJarod Wilson } 15057647d6ceSJarod Wilson } 15067647d6ceSJarod Wilson 15077647d6ceSJarod Wilson err = memcmp(result, template[i].result, 15087647d6ceSJarod Wilson template[i].rlen); 15097647d6ceSJarod Wilson if (err) { 15107647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Test %d failed for %s\n", 15117647d6ceSJarod Wilson i, algo); 15127647d6ceSJarod Wilson hexdump(result, template[i].rlen); 15137647d6ceSJarod Wilson err = -EINVAL; 15147647d6ceSJarod Wilson goto out; 15157647d6ceSJarod Wilson } 15167647d6ceSJarod Wilson } 15177647d6ceSJarod Wilson 15187647d6ceSJarod Wilson out: 15197647d6ceSJarod Wilson kfree(seed); 15207647d6ceSJarod Wilson return err; 15217647d6ceSJarod Wilson } 15227647d6ceSJarod Wilson 1523da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver, 1524da7f033dSHerbert Xu u32 type, u32 mask) 1525da7f033dSHerbert Xu { 1526da7f033dSHerbert Xu struct crypto_aead *tfm; 1527da7f033dSHerbert Xu int err = 0; 1528da7f033dSHerbert Xu 1529425a8829SStephan Mueller tfm = crypto_alloc_aead(driver, type | CRYPTO_ALG_INTERNAL, mask); 1530da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1531da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to load transform for %s: " 1532da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1533da7f033dSHerbert Xu return PTR_ERR(tfm); 1534da7f033dSHerbert Xu } 1535da7f033dSHerbert Xu 1536da7f033dSHerbert Xu if (desc->suite.aead.enc.vecs) { 1537da7f033dSHerbert Xu err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs, 1538da7f033dSHerbert Xu desc->suite.aead.enc.count); 1539da7f033dSHerbert Xu if (err) 1540da7f033dSHerbert Xu goto out; 1541da7f033dSHerbert Xu } 1542da7f033dSHerbert Xu 1543da7f033dSHerbert Xu if (!err && desc->suite.aead.dec.vecs) 1544da7f033dSHerbert Xu err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs, 1545da7f033dSHerbert Xu desc->suite.aead.dec.count); 1546da7f033dSHerbert Xu 1547da7f033dSHerbert Xu out: 1548da7f033dSHerbert Xu crypto_free_aead(tfm); 1549da7f033dSHerbert Xu return err; 1550da7f033dSHerbert Xu } 1551da7f033dSHerbert Xu 1552da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc, 1553da7f033dSHerbert Xu const char *driver, u32 type, u32 mask) 1554da7f033dSHerbert Xu { 15551aa4ecd9SHerbert Xu struct crypto_cipher *tfm; 1556da7f033dSHerbert Xu int err = 0; 1557da7f033dSHerbert Xu 1558425a8829SStephan Mueller tfm = crypto_alloc_cipher(driver, type | CRYPTO_ALG_INTERNAL, mask); 1559da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1560da7f033dSHerbert Xu printk(KERN_ERR "alg: cipher: Failed to load transform for " 1561da7f033dSHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 1562da7f033dSHerbert Xu return PTR_ERR(tfm); 1563da7f033dSHerbert Xu } 1564da7f033dSHerbert Xu 1565da7f033dSHerbert Xu if (desc->suite.cipher.enc.vecs) { 1566da7f033dSHerbert Xu err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 1567da7f033dSHerbert Xu desc->suite.cipher.enc.count); 1568da7f033dSHerbert Xu if (err) 1569da7f033dSHerbert Xu goto out; 1570da7f033dSHerbert Xu } 1571da7f033dSHerbert Xu 1572da7f033dSHerbert Xu if (desc->suite.cipher.dec.vecs) 1573da7f033dSHerbert Xu err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 1574da7f033dSHerbert Xu desc->suite.cipher.dec.count); 1575da7f033dSHerbert Xu 1576da7f033dSHerbert Xu out: 15771aa4ecd9SHerbert Xu crypto_free_cipher(tfm); 15781aa4ecd9SHerbert Xu return err; 15791aa4ecd9SHerbert Xu } 15801aa4ecd9SHerbert Xu 15811aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc, 15821aa4ecd9SHerbert Xu const char *driver, u32 type, u32 mask) 15831aa4ecd9SHerbert Xu { 158412773d93SHerbert Xu struct crypto_skcipher *tfm; 15851aa4ecd9SHerbert Xu int err = 0; 15861aa4ecd9SHerbert Xu 158712773d93SHerbert Xu tfm = crypto_alloc_skcipher(driver, type | CRYPTO_ALG_INTERNAL, mask); 15881aa4ecd9SHerbert Xu if (IS_ERR(tfm)) { 15891aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Failed to load transform for " 15901aa4ecd9SHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 15911aa4ecd9SHerbert Xu return PTR_ERR(tfm); 15921aa4ecd9SHerbert Xu } 15931aa4ecd9SHerbert Xu 15941aa4ecd9SHerbert Xu if (desc->suite.cipher.enc.vecs) { 15951aa4ecd9SHerbert Xu err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 15961aa4ecd9SHerbert Xu desc->suite.cipher.enc.count); 15971aa4ecd9SHerbert Xu if (err) 15981aa4ecd9SHerbert Xu goto out; 15991aa4ecd9SHerbert Xu } 16001aa4ecd9SHerbert Xu 16011aa4ecd9SHerbert Xu if (desc->suite.cipher.dec.vecs) 16021aa4ecd9SHerbert Xu err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 16031aa4ecd9SHerbert Xu desc->suite.cipher.dec.count); 16041aa4ecd9SHerbert Xu 16051aa4ecd9SHerbert Xu out: 160612773d93SHerbert Xu crypto_free_skcipher(tfm); 1607da7f033dSHerbert Xu return err; 1608da7f033dSHerbert Xu } 1609da7f033dSHerbert Xu 1610da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver, 1611da7f033dSHerbert Xu u32 type, u32 mask) 1612da7f033dSHerbert Xu { 1613da7f033dSHerbert Xu struct crypto_comp *tfm; 1614da7f033dSHerbert Xu int err; 1615da7f033dSHerbert Xu 1616da7f033dSHerbert Xu tfm = crypto_alloc_comp(driver, type, mask); 1617da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1618da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Failed to load transform for %s: " 1619da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1620da7f033dSHerbert Xu return PTR_ERR(tfm); 1621da7f033dSHerbert Xu } 1622da7f033dSHerbert Xu 1623da7f033dSHerbert Xu err = test_comp(tfm, desc->suite.comp.comp.vecs, 1624da7f033dSHerbert Xu desc->suite.comp.decomp.vecs, 1625da7f033dSHerbert Xu desc->suite.comp.comp.count, 1626da7f033dSHerbert Xu desc->suite.comp.decomp.count); 1627da7f033dSHerbert Xu 1628da7f033dSHerbert Xu crypto_free_comp(tfm); 1629da7f033dSHerbert Xu return err; 1630da7f033dSHerbert Xu } 1631da7f033dSHerbert Xu 16328064efb8SGeert Uytterhoeven static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver, 16338064efb8SGeert Uytterhoeven u32 type, u32 mask) 16348064efb8SGeert Uytterhoeven { 16358064efb8SGeert Uytterhoeven struct crypto_pcomp *tfm; 16368064efb8SGeert Uytterhoeven int err; 16378064efb8SGeert Uytterhoeven 16388064efb8SGeert Uytterhoeven tfm = crypto_alloc_pcomp(driver, type, mask); 16398064efb8SGeert Uytterhoeven if (IS_ERR(tfm)) { 16408064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Failed to load transform for %s: %ld\n", 16418064efb8SGeert Uytterhoeven driver, PTR_ERR(tfm)); 16428064efb8SGeert Uytterhoeven return PTR_ERR(tfm); 16438064efb8SGeert Uytterhoeven } 16448064efb8SGeert Uytterhoeven 16458064efb8SGeert Uytterhoeven err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs, 16468064efb8SGeert Uytterhoeven desc->suite.pcomp.decomp.vecs, 16478064efb8SGeert Uytterhoeven desc->suite.pcomp.comp.count, 16488064efb8SGeert Uytterhoeven desc->suite.pcomp.decomp.count); 16498064efb8SGeert Uytterhoeven 16508064efb8SGeert Uytterhoeven crypto_free_pcomp(tfm); 16518064efb8SGeert Uytterhoeven return err; 16528064efb8SGeert Uytterhoeven } 16538064efb8SGeert Uytterhoeven 1654da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver, 1655da7f033dSHerbert Xu u32 type, u32 mask) 1656da7f033dSHerbert Xu { 1657da7f033dSHerbert Xu struct crypto_ahash *tfm; 1658da7f033dSHerbert Xu int err; 1659da7f033dSHerbert Xu 1660425a8829SStephan Mueller tfm = crypto_alloc_ahash(driver, type | CRYPTO_ALG_INTERNAL, mask); 1661da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1662da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to load transform for %s: " 1663da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1664da7f033dSHerbert Xu return PTR_ERR(tfm); 1665da7f033dSHerbert Xu } 1666da7f033dSHerbert Xu 1667a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1668a8f1a052SDavid S. Miller desc->suite.hash.count, true); 1669a8f1a052SDavid S. Miller if (!err) 1670a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1671a8f1a052SDavid S. Miller desc->suite.hash.count, false); 1672da7f033dSHerbert Xu 1673da7f033dSHerbert Xu crypto_free_ahash(tfm); 1674da7f033dSHerbert Xu return err; 1675da7f033dSHerbert Xu } 1676da7f033dSHerbert Xu 16778e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc, 16788e3ee85eSHerbert Xu const char *driver, u32 type, u32 mask) 16798e3ee85eSHerbert Xu { 16808e3ee85eSHerbert Xu struct crypto_shash *tfm; 16818e3ee85eSHerbert Xu u32 val; 16828e3ee85eSHerbert Xu int err; 16838e3ee85eSHerbert Xu 16848e3ee85eSHerbert Xu err = alg_test_hash(desc, driver, type, mask); 16858e3ee85eSHerbert Xu if (err) 16868e3ee85eSHerbert Xu goto out; 16878e3ee85eSHerbert Xu 1688425a8829SStephan Mueller tfm = crypto_alloc_shash(driver, type | CRYPTO_ALG_INTERNAL, mask); 16898e3ee85eSHerbert Xu if (IS_ERR(tfm)) { 16908e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: " 16918e3ee85eSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 16928e3ee85eSHerbert Xu err = PTR_ERR(tfm); 16938e3ee85eSHerbert Xu goto out; 16948e3ee85eSHerbert Xu } 16958e3ee85eSHerbert Xu 16968e3ee85eSHerbert Xu do { 16974c5c3024SJan-Simon Möller SHASH_DESC_ON_STACK(shash, tfm); 16984c5c3024SJan-Simon Möller u32 *ctx = (u32 *)shash_desc_ctx(shash); 16998e3ee85eSHerbert Xu 17004c5c3024SJan-Simon Möller shash->tfm = tfm; 17014c5c3024SJan-Simon Möller shash->flags = 0; 17028e3ee85eSHerbert Xu 17034c5c3024SJan-Simon Möller *ctx = le32_to_cpu(420553207); 17044c5c3024SJan-Simon Möller err = crypto_shash_final(shash, (u8 *)&val); 17058e3ee85eSHerbert Xu if (err) { 17068e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Operation failed for " 17078e3ee85eSHerbert Xu "%s: %d\n", driver, err); 17088e3ee85eSHerbert Xu break; 17098e3ee85eSHerbert Xu } 17108e3ee85eSHerbert Xu 17118e3ee85eSHerbert Xu if (val != ~420553207) { 17128e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Test failed for %s: " 17138e3ee85eSHerbert Xu "%d\n", driver, val); 17148e3ee85eSHerbert Xu err = -EINVAL; 17158e3ee85eSHerbert Xu } 17168e3ee85eSHerbert Xu } while (0); 17178e3ee85eSHerbert Xu 17188e3ee85eSHerbert Xu crypto_free_shash(tfm); 17198e3ee85eSHerbert Xu 17208e3ee85eSHerbert Xu out: 17218e3ee85eSHerbert Xu return err; 17228e3ee85eSHerbert Xu } 17238e3ee85eSHerbert Xu 17247647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver, 17257647d6ceSJarod Wilson u32 type, u32 mask) 17267647d6ceSJarod Wilson { 17277647d6ceSJarod Wilson struct crypto_rng *rng; 17287647d6ceSJarod Wilson int err; 17297647d6ceSJarod Wilson 1730425a8829SStephan Mueller rng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask); 17317647d6ceSJarod Wilson if (IS_ERR(rng)) { 17327647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to load transform for %s: " 17337647d6ceSJarod Wilson "%ld\n", driver, PTR_ERR(rng)); 17347647d6ceSJarod Wilson return PTR_ERR(rng); 17357647d6ceSJarod Wilson } 17367647d6ceSJarod Wilson 17377647d6ceSJarod Wilson err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count); 17387647d6ceSJarod Wilson 17397647d6ceSJarod Wilson crypto_free_rng(rng); 17407647d6ceSJarod Wilson 17417647d6ceSJarod Wilson return err; 17427647d6ceSJarod Wilson } 17437647d6ceSJarod Wilson 174464d1cdfbSStephan Mueller 174564d1cdfbSStephan Mueller static int drbg_cavs_test(struct drbg_testvec *test, int pr, 174664d1cdfbSStephan Mueller const char *driver, u32 type, u32 mask) 174764d1cdfbSStephan Mueller { 174864d1cdfbSStephan Mueller int ret = -EAGAIN; 174964d1cdfbSStephan Mueller struct crypto_rng *drng; 175064d1cdfbSStephan Mueller struct drbg_test_data test_data; 175164d1cdfbSStephan Mueller struct drbg_string addtl, pers, testentropy; 175264d1cdfbSStephan Mueller unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL); 175364d1cdfbSStephan Mueller 175464d1cdfbSStephan Mueller if (!buf) 175564d1cdfbSStephan Mueller return -ENOMEM; 175664d1cdfbSStephan Mueller 1757425a8829SStephan Mueller drng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask); 175864d1cdfbSStephan Mueller if (IS_ERR(drng)) { 175964d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for " 176064d1cdfbSStephan Mueller "%s\n", driver); 176164d1cdfbSStephan Mueller kzfree(buf); 176264d1cdfbSStephan Mueller return -ENOMEM; 176364d1cdfbSStephan Mueller } 176464d1cdfbSStephan Mueller 176564d1cdfbSStephan Mueller test_data.testentropy = &testentropy; 176664d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entropy, test->entropylen); 176764d1cdfbSStephan Mueller drbg_string_fill(&pers, test->pers, test->perslen); 176864d1cdfbSStephan Mueller ret = crypto_drbg_reset_test(drng, &pers, &test_data); 176964d1cdfbSStephan Mueller if (ret) { 177064d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: Failed to reset rng\n"); 177164d1cdfbSStephan Mueller goto outbuf; 177264d1cdfbSStephan Mueller } 177364d1cdfbSStephan Mueller 177464d1cdfbSStephan Mueller drbg_string_fill(&addtl, test->addtla, test->addtllen); 177564d1cdfbSStephan Mueller if (pr) { 177664d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entpra, test->entprlen); 177764d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl_test(drng, 177864d1cdfbSStephan Mueller buf, test->expectedlen, &addtl, &test_data); 177964d1cdfbSStephan Mueller } else { 178064d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl(drng, 178164d1cdfbSStephan Mueller buf, test->expectedlen, &addtl); 178264d1cdfbSStephan Mueller } 178319e60e13SStephan Mueller if (ret < 0) { 178464d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not obtain random data for " 178564d1cdfbSStephan Mueller "driver %s\n", driver); 178664d1cdfbSStephan Mueller goto outbuf; 178764d1cdfbSStephan Mueller } 178864d1cdfbSStephan Mueller 178964d1cdfbSStephan Mueller drbg_string_fill(&addtl, test->addtlb, test->addtllen); 179064d1cdfbSStephan Mueller if (pr) { 179164d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entprb, test->entprlen); 179264d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl_test(drng, 179364d1cdfbSStephan Mueller buf, test->expectedlen, &addtl, &test_data); 179464d1cdfbSStephan Mueller } else { 179564d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl(drng, 179664d1cdfbSStephan Mueller buf, test->expectedlen, &addtl); 179764d1cdfbSStephan Mueller } 179819e60e13SStephan Mueller if (ret < 0) { 179964d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not obtain random data for " 180064d1cdfbSStephan Mueller "driver %s\n", driver); 180164d1cdfbSStephan Mueller goto outbuf; 180264d1cdfbSStephan Mueller } 180364d1cdfbSStephan Mueller 180464d1cdfbSStephan Mueller ret = memcmp(test->expected, buf, test->expectedlen); 180564d1cdfbSStephan Mueller 180664d1cdfbSStephan Mueller outbuf: 180764d1cdfbSStephan Mueller crypto_free_rng(drng); 180864d1cdfbSStephan Mueller kzfree(buf); 180964d1cdfbSStephan Mueller return ret; 181064d1cdfbSStephan Mueller } 181164d1cdfbSStephan Mueller 181264d1cdfbSStephan Mueller 181364d1cdfbSStephan Mueller static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver, 181464d1cdfbSStephan Mueller u32 type, u32 mask) 181564d1cdfbSStephan Mueller { 181664d1cdfbSStephan Mueller int err = 0; 181764d1cdfbSStephan Mueller int pr = 0; 181864d1cdfbSStephan Mueller int i = 0; 181964d1cdfbSStephan Mueller struct drbg_testvec *template = desc->suite.drbg.vecs; 182064d1cdfbSStephan Mueller unsigned int tcount = desc->suite.drbg.count; 182164d1cdfbSStephan Mueller 182264d1cdfbSStephan Mueller if (0 == memcmp(driver, "drbg_pr_", 8)) 182364d1cdfbSStephan Mueller pr = 1; 182464d1cdfbSStephan Mueller 182564d1cdfbSStephan Mueller for (i = 0; i < tcount; i++) { 182664d1cdfbSStephan Mueller err = drbg_cavs_test(&template[i], pr, driver, type, mask); 182764d1cdfbSStephan Mueller if (err) { 182864d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: Test %d failed for %s\n", 182964d1cdfbSStephan Mueller i, driver); 183064d1cdfbSStephan Mueller err = -EINVAL; 183164d1cdfbSStephan Mueller break; 183264d1cdfbSStephan Mueller } 183364d1cdfbSStephan Mueller } 183464d1cdfbSStephan Mueller return err; 183564d1cdfbSStephan Mueller 183664d1cdfbSStephan Mueller } 183764d1cdfbSStephan Mueller 1838946cc463STadeusz Struk static int do_test_rsa(struct crypto_akcipher *tfm, 1839946cc463STadeusz Struk struct akcipher_testvec *vecs) 1840946cc463STadeusz Struk { 1841946cc463STadeusz Struk struct akcipher_request *req; 1842946cc463STadeusz Struk void *outbuf_enc = NULL; 1843946cc463STadeusz Struk void *outbuf_dec = NULL; 1844946cc463STadeusz Struk struct tcrypt_result result; 1845946cc463STadeusz Struk unsigned int out_len_max, out_len = 0; 1846946cc463STadeusz Struk int err = -ENOMEM; 1847946cc463STadeusz Struk 1848946cc463STadeusz Struk req = akcipher_request_alloc(tfm, GFP_KERNEL); 1849946cc463STadeusz Struk if (!req) 1850946cc463STadeusz Struk return err; 1851946cc463STadeusz Struk 1852946cc463STadeusz Struk init_completion(&result.completion); 1853946cc463STadeusz Struk err = crypto_akcipher_setkey(tfm, vecs->key, vecs->key_len); 1854946cc463STadeusz Struk if (err) 1855946cc463STadeusz Struk goto free_req; 1856946cc463STadeusz Struk 1857946cc463STadeusz Struk akcipher_request_set_crypt(req, vecs->m, outbuf_enc, vecs->m_size, 1858946cc463STadeusz Struk out_len); 1859946cc463STadeusz Struk /* expect this to fail, and update the required buf len */ 1860946cc463STadeusz Struk crypto_akcipher_encrypt(req); 1861946cc463STadeusz Struk out_len = req->dst_len; 1862946cc463STadeusz Struk if (!out_len) { 1863946cc463STadeusz Struk err = -EINVAL; 1864946cc463STadeusz Struk goto free_req; 1865946cc463STadeusz Struk } 1866946cc463STadeusz Struk 1867946cc463STadeusz Struk out_len_max = out_len; 1868946cc463STadeusz Struk err = -ENOMEM; 1869946cc463STadeusz Struk outbuf_enc = kzalloc(out_len_max, GFP_KERNEL); 1870946cc463STadeusz Struk if (!outbuf_enc) 1871946cc463STadeusz Struk goto free_req; 1872946cc463STadeusz Struk 1873946cc463STadeusz Struk akcipher_request_set_crypt(req, vecs->m, outbuf_enc, vecs->m_size, 1874946cc463STadeusz Struk out_len); 1875946cc463STadeusz Struk akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 1876946cc463STadeusz Struk tcrypt_complete, &result); 1877946cc463STadeusz Struk 1878946cc463STadeusz Struk /* Run RSA encrypt - c = m^e mod n;*/ 1879946cc463STadeusz Struk err = wait_async_op(&result, crypto_akcipher_encrypt(req)); 1880946cc463STadeusz Struk if (err) { 1881946cc463STadeusz Struk pr_err("alg: rsa: encrypt test failed. err %d\n", err); 1882946cc463STadeusz Struk goto free_all; 1883946cc463STadeusz Struk } 1884946cc463STadeusz Struk if (out_len != vecs->c_size) { 1885946cc463STadeusz Struk pr_err("alg: rsa: encrypt test failed. Invalid output len\n"); 1886946cc463STadeusz Struk err = -EINVAL; 1887946cc463STadeusz Struk goto free_all; 1888946cc463STadeusz Struk } 1889946cc463STadeusz Struk /* verify that encrypted message is equal to expected */ 1890946cc463STadeusz Struk if (memcmp(vecs->c, outbuf_enc, vecs->c_size)) { 1891946cc463STadeusz Struk pr_err("alg: rsa: encrypt test failed. Invalid output\n"); 1892946cc463STadeusz Struk err = -EINVAL; 1893946cc463STadeusz Struk goto free_all; 1894946cc463STadeusz Struk } 1895946cc463STadeusz Struk /* Don't invoke decrypt for vectors with public key */ 1896946cc463STadeusz Struk if (vecs->public_key_vec) { 1897946cc463STadeusz Struk err = 0; 1898946cc463STadeusz Struk goto free_all; 1899946cc463STadeusz Struk } 1900946cc463STadeusz Struk outbuf_dec = kzalloc(out_len_max, GFP_KERNEL); 1901946cc463STadeusz Struk if (!outbuf_dec) { 1902946cc463STadeusz Struk err = -ENOMEM; 1903946cc463STadeusz Struk goto free_all; 1904946cc463STadeusz Struk } 1905946cc463STadeusz Struk init_completion(&result.completion); 1906946cc463STadeusz Struk akcipher_request_set_crypt(req, outbuf_enc, outbuf_dec, vecs->c_size, 1907946cc463STadeusz Struk out_len); 1908946cc463STadeusz Struk 1909946cc463STadeusz Struk /* Run RSA decrypt - m = c^d mod n;*/ 1910946cc463STadeusz Struk err = wait_async_op(&result, crypto_akcipher_decrypt(req)); 1911946cc463STadeusz Struk if (err) { 1912946cc463STadeusz Struk pr_err("alg: rsa: decrypt test failed. err %d\n", err); 1913946cc463STadeusz Struk goto free_all; 1914946cc463STadeusz Struk } 1915946cc463STadeusz Struk out_len = req->dst_len; 1916946cc463STadeusz Struk if (out_len != vecs->m_size) { 1917946cc463STadeusz Struk pr_err("alg: rsa: decrypt test failed. Invalid output len\n"); 1918946cc463STadeusz Struk err = -EINVAL; 1919946cc463STadeusz Struk goto free_all; 1920946cc463STadeusz Struk } 1921946cc463STadeusz Struk /* verify that decrypted message is equal to the original msg */ 1922946cc463STadeusz Struk if (memcmp(vecs->m, outbuf_dec, vecs->m_size)) { 1923946cc463STadeusz Struk pr_err("alg: rsa: decrypt test failed. Invalid output\n"); 1924946cc463STadeusz Struk err = -EINVAL; 1925946cc463STadeusz Struk } 1926946cc463STadeusz Struk free_all: 1927946cc463STadeusz Struk kfree(outbuf_dec); 1928946cc463STadeusz Struk kfree(outbuf_enc); 1929946cc463STadeusz Struk free_req: 1930946cc463STadeusz Struk akcipher_request_free(req); 1931946cc463STadeusz Struk return err; 1932946cc463STadeusz Struk } 1933946cc463STadeusz Struk 1934946cc463STadeusz Struk static int test_rsa(struct crypto_akcipher *tfm, struct akcipher_testvec *vecs, 1935946cc463STadeusz Struk unsigned int tcount) 1936946cc463STadeusz Struk { 1937946cc463STadeusz Struk int ret, i; 1938946cc463STadeusz Struk 1939946cc463STadeusz Struk for (i = 0; i < tcount; i++) { 1940946cc463STadeusz Struk ret = do_test_rsa(tfm, vecs++); 1941946cc463STadeusz Struk if (ret) { 1942946cc463STadeusz Struk pr_err("alg: rsa: test failed on vector %d, err=%d\n", 1943946cc463STadeusz Struk i + 1, ret); 1944946cc463STadeusz Struk return ret; 1945946cc463STadeusz Struk } 1946946cc463STadeusz Struk } 1947946cc463STadeusz Struk return 0; 1948946cc463STadeusz Struk } 1949946cc463STadeusz Struk 1950946cc463STadeusz Struk static int test_akcipher(struct crypto_akcipher *tfm, const char *alg, 1951946cc463STadeusz Struk struct akcipher_testvec *vecs, unsigned int tcount) 1952946cc463STadeusz Struk { 1953946cc463STadeusz Struk if (strncmp(alg, "rsa", 3) == 0) 1954946cc463STadeusz Struk return test_rsa(tfm, vecs, tcount); 1955946cc463STadeusz Struk 1956946cc463STadeusz Struk return 0; 1957946cc463STadeusz Struk } 1958946cc463STadeusz Struk 1959946cc463STadeusz Struk static int alg_test_akcipher(const struct alg_test_desc *desc, 1960946cc463STadeusz Struk const char *driver, u32 type, u32 mask) 1961946cc463STadeusz Struk { 1962946cc463STadeusz Struk struct crypto_akcipher *tfm; 1963946cc463STadeusz Struk int err = 0; 1964946cc463STadeusz Struk 1965946cc463STadeusz Struk tfm = crypto_alloc_akcipher(driver, type | CRYPTO_ALG_INTERNAL, mask); 1966946cc463STadeusz Struk if (IS_ERR(tfm)) { 1967946cc463STadeusz Struk pr_err("alg: akcipher: Failed to load tfm for %s: %ld\n", 1968946cc463STadeusz Struk driver, PTR_ERR(tfm)); 1969946cc463STadeusz Struk return PTR_ERR(tfm); 1970946cc463STadeusz Struk } 1971946cc463STadeusz Struk if (desc->suite.akcipher.vecs) 1972946cc463STadeusz Struk err = test_akcipher(tfm, desc->alg, desc->suite.akcipher.vecs, 1973946cc463STadeusz Struk desc->suite.akcipher.count); 1974946cc463STadeusz Struk 1975946cc463STadeusz Struk crypto_free_akcipher(tfm); 1976946cc463STadeusz Struk return err; 1977946cc463STadeusz Struk } 1978946cc463STadeusz Struk 1979863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc, 1980863b557aSYouquan, Song const char *driver, u32 type, u32 mask) 1981863b557aSYouquan, Song { 1982863b557aSYouquan, Song return 0; 1983863b557aSYouquan, Song } 1984863b557aSYouquan, Song 1985da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */ 1986da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = { 1987da7f033dSHerbert Xu { 19884d6d6a2cSJohannes Goetzfried .alg = "__cbc-cast5-avx", 19894d6d6a2cSJohannes Goetzfried .test = alg_test_null, 19904d6d6a2cSJohannes Goetzfried }, { 19914ea1277dSJohannes Goetzfried .alg = "__cbc-cast6-avx", 19924ea1277dSJohannes Goetzfried .test = alg_test_null, 19934ea1277dSJohannes Goetzfried }, { 19947efe4076SJohannes Goetzfried .alg = "__cbc-serpent-avx", 19957efe4076SJohannes Goetzfried .test = alg_test_null, 19967efe4076SJohannes Goetzfried }, { 199756d76c96SJussi Kivilinna .alg = "__cbc-serpent-avx2", 199856d76c96SJussi Kivilinna .test = alg_test_null, 199956d76c96SJussi Kivilinna }, { 2000937c30d7SJussi Kivilinna .alg = "__cbc-serpent-sse2", 2001937c30d7SJussi Kivilinna .test = alg_test_null, 2002937c30d7SJussi Kivilinna }, { 2003107778b5SJohannes Goetzfried .alg = "__cbc-twofish-avx", 2004107778b5SJohannes Goetzfried .test = alg_test_null, 2005107778b5SJohannes Goetzfried }, { 2006863b557aSYouquan, Song .alg = "__driver-cbc-aes-aesni", 2007863b557aSYouquan, Song .test = alg_test_null, 20086c79294fSMilan Broz .fips_allowed = 1, 2009863b557aSYouquan, Song }, { 2010d9b1d2e7SJussi Kivilinna .alg = "__driver-cbc-camellia-aesni", 2011d9b1d2e7SJussi Kivilinna .test = alg_test_null, 2012d9b1d2e7SJussi Kivilinna }, { 2013f3f935a7SJussi Kivilinna .alg = "__driver-cbc-camellia-aesni-avx2", 2014f3f935a7SJussi Kivilinna .test = alg_test_null, 2015f3f935a7SJussi Kivilinna }, { 20164d6d6a2cSJohannes Goetzfried .alg = "__driver-cbc-cast5-avx", 20174d6d6a2cSJohannes Goetzfried .test = alg_test_null, 20184d6d6a2cSJohannes Goetzfried }, { 20194ea1277dSJohannes Goetzfried .alg = "__driver-cbc-cast6-avx", 20204ea1277dSJohannes Goetzfried .test = alg_test_null, 20214ea1277dSJohannes Goetzfried }, { 20227efe4076SJohannes Goetzfried .alg = "__driver-cbc-serpent-avx", 20237efe4076SJohannes Goetzfried .test = alg_test_null, 20247efe4076SJohannes Goetzfried }, { 202556d76c96SJussi Kivilinna .alg = "__driver-cbc-serpent-avx2", 202656d76c96SJussi Kivilinna .test = alg_test_null, 202756d76c96SJussi Kivilinna }, { 2028937c30d7SJussi Kivilinna .alg = "__driver-cbc-serpent-sse2", 2029937c30d7SJussi Kivilinna .test = alg_test_null, 2030937c30d7SJussi Kivilinna }, { 2031107778b5SJohannes Goetzfried .alg = "__driver-cbc-twofish-avx", 2032107778b5SJohannes Goetzfried .test = alg_test_null, 2033107778b5SJohannes Goetzfried }, { 2034863b557aSYouquan, Song .alg = "__driver-ecb-aes-aesni", 2035863b557aSYouquan, Song .test = alg_test_null, 20366c79294fSMilan Broz .fips_allowed = 1, 2037863b557aSYouquan, Song }, { 2038d9b1d2e7SJussi Kivilinna .alg = "__driver-ecb-camellia-aesni", 2039d9b1d2e7SJussi Kivilinna .test = alg_test_null, 2040d9b1d2e7SJussi Kivilinna }, { 2041f3f935a7SJussi Kivilinna .alg = "__driver-ecb-camellia-aesni-avx2", 2042f3f935a7SJussi Kivilinna .test = alg_test_null, 2043f3f935a7SJussi Kivilinna }, { 20444d6d6a2cSJohannes Goetzfried .alg = "__driver-ecb-cast5-avx", 20454d6d6a2cSJohannes Goetzfried .test = alg_test_null, 20464d6d6a2cSJohannes Goetzfried }, { 20474ea1277dSJohannes Goetzfried .alg = "__driver-ecb-cast6-avx", 20484ea1277dSJohannes Goetzfried .test = alg_test_null, 20494ea1277dSJohannes Goetzfried }, { 20507efe4076SJohannes Goetzfried .alg = "__driver-ecb-serpent-avx", 20517efe4076SJohannes Goetzfried .test = alg_test_null, 20527efe4076SJohannes Goetzfried }, { 205356d76c96SJussi Kivilinna .alg = "__driver-ecb-serpent-avx2", 205456d76c96SJussi Kivilinna .test = alg_test_null, 205556d76c96SJussi Kivilinna }, { 2056937c30d7SJussi Kivilinna .alg = "__driver-ecb-serpent-sse2", 2057937c30d7SJussi Kivilinna .test = alg_test_null, 2058937c30d7SJussi Kivilinna }, { 2059107778b5SJohannes Goetzfried .alg = "__driver-ecb-twofish-avx", 2060107778b5SJohannes Goetzfried .test = alg_test_null, 2061107778b5SJohannes Goetzfried }, { 20629d77b6c2STadeusz Struk .alg = "__driver-gcm-aes-aesni", 20639d77b6c2STadeusz Struk .test = alg_test_null, 20649d77b6c2STadeusz Struk .fips_allowed = 1, 20659d77b6c2STadeusz Struk }, { 2066863b557aSYouquan, Song .alg = "__ghash-pclmulqdqni", 2067863b557aSYouquan, Song .test = alg_test_null, 20686c79294fSMilan Broz .fips_allowed = 1, 2069863b557aSYouquan, Song }, { 2070e08ca2daSJarod Wilson .alg = "ansi_cprng", 2071e08ca2daSJarod Wilson .test = alg_test_cprng, 2072a1915d51SJarod Wilson .fips_allowed = 1, 2073e08ca2daSJarod Wilson .suite = { 2074e08ca2daSJarod Wilson .cprng = { 2075e08ca2daSJarod Wilson .vecs = ansi_cprng_aes_tv_template, 2076e08ca2daSJarod Wilson .count = ANSI_CPRNG_AES_TEST_VECTORS 2077e08ca2daSJarod Wilson } 2078e08ca2daSJarod Wilson } 2079e08ca2daSJarod Wilson }, { 2080bca4feb0SHoria Geanta .alg = "authenc(hmac(md5),ecb(cipher_null))", 2081bca4feb0SHoria Geanta .test = alg_test_aead, 2082bca4feb0SHoria Geanta .fips_allowed = 1, 2083bca4feb0SHoria Geanta .suite = { 2084bca4feb0SHoria Geanta .aead = { 2085bca4feb0SHoria Geanta .enc = { 2086bca4feb0SHoria Geanta .vecs = hmac_md5_ecb_cipher_null_enc_tv_template, 2087bca4feb0SHoria Geanta .count = HMAC_MD5_ECB_CIPHER_NULL_ENC_TEST_VECTORS 2088bca4feb0SHoria Geanta }, 2089bca4feb0SHoria Geanta .dec = { 2090bca4feb0SHoria Geanta .vecs = hmac_md5_ecb_cipher_null_dec_tv_template, 2091bca4feb0SHoria Geanta .count = HMAC_MD5_ECB_CIPHER_NULL_DEC_TEST_VECTORS 2092bca4feb0SHoria Geanta } 2093bca4feb0SHoria Geanta } 2094bca4feb0SHoria Geanta } 2095bca4feb0SHoria Geanta }, { 2096a4198fd4SHerbert Xu .alg = "authenc(hmac(sha1),cbc(aes))", 2097e46e9a46SHoria Geanta .test = alg_test_aead, 2098e46e9a46SHoria Geanta .fips_allowed = 1, 2099e46e9a46SHoria Geanta .suite = { 2100e46e9a46SHoria Geanta .aead = { 2101e46e9a46SHoria Geanta .enc = { 21025208ed2cSNitesh Lal .vecs = 21035208ed2cSNitesh Lal hmac_sha1_aes_cbc_enc_tv_temp, 21045208ed2cSNitesh Lal .count = 21055208ed2cSNitesh Lal HMAC_SHA1_AES_CBC_ENC_TEST_VEC 21065208ed2cSNitesh Lal } 21075208ed2cSNitesh Lal } 21085208ed2cSNitesh Lal } 21095208ed2cSNitesh Lal }, { 2110a4198fd4SHerbert Xu .alg = "authenc(hmac(sha1),cbc(des))", 21115208ed2cSNitesh Lal .test = alg_test_aead, 21125208ed2cSNitesh Lal .fips_allowed = 1, 21135208ed2cSNitesh Lal .suite = { 21145208ed2cSNitesh Lal .aead = { 21155208ed2cSNitesh Lal .enc = { 21165208ed2cSNitesh Lal .vecs = 21175208ed2cSNitesh Lal hmac_sha1_des_cbc_enc_tv_temp, 21185208ed2cSNitesh Lal .count = 21195208ed2cSNitesh Lal HMAC_SHA1_DES_CBC_ENC_TEST_VEC 21205208ed2cSNitesh Lal } 21215208ed2cSNitesh Lal } 21225208ed2cSNitesh Lal } 21235208ed2cSNitesh Lal }, { 2124a4198fd4SHerbert Xu .alg = "authenc(hmac(sha1),cbc(des3_ede))", 21255208ed2cSNitesh Lal .test = alg_test_aead, 21265208ed2cSNitesh Lal .fips_allowed = 1, 21275208ed2cSNitesh Lal .suite = { 21285208ed2cSNitesh Lal .aead = { 21295208ed2cSNitesh Lal .enc = { 21305208ed2cSNitesh Lal .vecs = 21315208ed2cSNitesh Lal hmac_sha1_des3_ede_cbc_enc_tv_temp, 21325208ed2cSNitesh Lal .count = 21335208ed2cSNitesh Lal HMAC_SHA1_DES3_EDE_CBC_ENC_TEST_VEC 2134e46e9a46SHoria Geanta } 2135e46e9a46SHoria Geanta } 2136e46e9a46SHoria Geanta } 2137e46e9a46SHoria Geanta }, { 2138bca4feb0SHoria Geanta .alg = "authenc(hmac(sha1),ecb(cipher_null))", 2139bca4feb0SHoria Geanta .test = alg_test_aead, 2140bca4feb0SHoria Geanta .fips_allowed = 1, 2141bca4feb0SHoria Geanta .suite = { 2142bca4feb0SHoria Geanta .aead = { 2143bca4feb0SHoria Geanta .enc = { 21445208ed2cSNitesh Lal .vecs = 21455208ed2cSNitesh Lal hmac_sha1_ecb_cipher_null_enc_tv_temp, 21465208ed2cSNitesh Lal .count = 21475208ed2cSNitesh Lal HMAC_SHA1_ECB_CIPHER_NULL_ENC_TEST_VEC 2148bca4feb0SHoria Geanta }, 2149bca4feb0SHoria Geanta .dec = { 21505208ed2cSNitesh Lal .vecs = 21515208ed2cSNitesh Lal hmac_sha1_ecb_cipher_null_dec_tv_temp, 21525208ed2cSNitesh Lal .count = 21535208ed2cSNitesh Lal HMAC_SHA1_ECB_CIPHER_NULL_DEC_TEST_VEC 21545208ed2cSNitesh Lal } 21555208ed2cSNitesh Lal } 21565208ed2cSNitesh Lal } 21575208ed2cSNitesh Lal }, { 2158a4198fd4SHerbert Xu .alg = "authenc(hmac(sha224),cbc(des))", 21595208ed2cSNitesh Lal .test = alg_test_aead, 21605208ed2cSNitesh Lal .fips_allowed = 1, 21615208ed2cSNitesh Lal .suite = { 21625208ed2cSNitesh Lal .aead = { 21635208ed2cSNitesh Lal .enc = { 21645208ed2cSNitesh Lal .vecs = 21655208ed2cSNitesh Lal hmac_sha224_des_cbc_enc_tv_temp, 21665208ed2cSNitesh Lal .count = 21675208ed2cSNitesh Lal HMAC_SHA224_DES_CBC_ENC_TEST_VEC 21685208ed2cSNitesh Lal } 21695208ed2cSNitesh Lal } 21705208ed2cSNitesh Lal } 21715208ed2cSNitesh Lal }, { 2172a4198fd4SHerbert Xu .alg = "authenc(hmac(sha224),cbc(des3_ede))", 21735208ed2cSNitesh Lal .test = alg_test_aead, 21745208ed2cSNitesh Lal .fips_allowed = 1, 21755208ed2cSNitesh Lal .suite = { 21765208ed2cSNitesh Lal .aead = { 21775208ed2cSNitesh Lal .enc = { 21785208ed2cSNitesh Lal .vecs = 21795208ed2cSNitesh Lal hmac_sha224_des3_ede_cbc_enc_tv_temp, 21805208ed2cSNitesh Lal .count = 21815208ed2cSNitesh Lal HMAC_SHA224_DES3_EDE_CBC_ENC_TEST_VEC 2182bca4feb0SHoria Geanta } 2183bca4feb0SHoria Geanta } 2184bca4feb0SHoria Geanta } 2185bca4feb0SHoria Geanta }, { 2186a4198fd4SHerbert Xu .alg = "authenc(hmac(sha256),cbc(aes))", 2187e46e9a46SHoria Geanta .test = alg_test_aead, 2188e46e9a46SHoria Geanta .fips_allowed = 1, 2189e46e9a46SHoria Geanta .suite = { 2190e46e9a46SHoria Geanta .aead = { 2191e46e9a46SHoria Geanta .enc = { 21925208ed2cSNitesh Lal .vecs = 21935208ed2cSNitesh Lal hmac_sha256_aes_cbc_enc_tv_temp, 21945208ed2cSNitesh Lal .count = 21955208ed2cSNitesh Lal HMAC_SHA256_AES_CBC_ENC_TEST_VEC 21965208ed2cSNitesh Lal } 21975208ed2cSNitesh Lal } 21985208ed2cSNitesh Lal } 21995208ed2cSNitesh Lal }, { 2200a4198fd4SHerbert Xu .alg = "authenc(hmac(sha256),cbc(des))", 22015208ed2cSNitesh Lal .test = alg_test_aead, 22025208ed2cSNitesh Lal .fips_allowed = 1, 22035208ed2cSNitesh Lal .suite = { 22045208ed2cSNitesh Lal .aead = { 22055208ed2cSNitesh Lal .enc = { 22065208ed2cSNitesh Lal .vecs = 22075208ed2cSNitesh Lal hmac_sha256_des_cbc_enc_tv_temp, 22085208ed2cSNitesh Lal .count = 22095208ed2cSNitesh Lal HMAC_SHA256_DES_CBC_ENC_TEST_VEC 22105208ed2cSNitesh Lal } 22115208ed2cSNitesh Lal } 22125208ed2cSNitesh Lal } 22135208ed2cSNitesh Lal }, { 2214a4198fd4SHerbert Xu .alg = "authenc(hmac(sha256),cbc(des3_ede))", 22155208ed2cSNitesh Lal .test = alg_test_aead, 22165208ed2cSNitesh Lal .fips_allowed = 1, 22175208ed2cSNitesh Lal .suite = { 22185208ed2cSNitesh Lal .aead = { 22195208ed2cSNitesh Lal .enc = { 22205208ed2cSNitesh Lal .vecs = 22215208ed2cSNitesh Lal hmac_sha256_des3_ede_cbc_enc_tv_temp, 22225208ed2cSNitesh Lal .count = 22235208ed2cSNitesh Lal HMAC_SHA256_DES3_EDE_CBC_ENC_TEST_VEC 22245208ed2cSNitesh Lal } 22255208ed2cSNitesh Lal } 22265208ed2cSNitesh Lal } 22275208ed2cSNitesh Lal }, { 2228a4198fd4SHerbert Xu .alg = "authenc(hmac(sha384),cbc(des))", 22295208ed2cSNitesh Lal .test = alg_test_aead, 22305208ed2cSNitesh Lal .fips_allowed = 1, 22315208ed2cSNitesh Lal .suite = { 22325208ed2cSNitesh Lal .aead = { 22335208ed2cSNitesh Lal .enc = { 22345208ed2cSNitesh Lal .vecs = 22355208ed2cSNitesh Lal hmac_sha384_des_cbc_enc_tv_temp, 22365208ed2cSNitesh Lal .count = 22375208ed2cSNitesh Lal HMAC_SHA384_DES_CBC_ENC_TEST_VEC 22385208ed2cSNitesh Lal } 22395208ed2cSNitesh Lal } 22405208ed2cSNitesh Lal } 22415208ed2cSNitesh Lal }, { 2242a4198fd4SHerbert Xu .alg = "authenc(hmac(sha384),cbc(des3_ede))", 22435208ed2cSNitesh Lal .test = alg_test_aead, 22445208ed2cSNitesh Lal .fips_allowed = 1, 22455208ed2cSNitesh Lal .suite = { 22465208ed2cSNitesh Lal .aead = { 22475208ed2cSNitesh Lal .enc = { 22485208ed2cSNitesh Lal .vecs = 22495208ed2cSNitesh Lal hmac_sha384_des3_ede_cbc_enc_tv_temp, 22505208ed2cSNitesh Lal .count = 22515208ed2cSNitesh Lal HMAC_SHA384_DES3_EDE_CBC_ENC_TEST_VEC 2252e46e9a46SHoria Geanta } 2253e46e9a46SHoria Geanta } 2254e46e9a46SHoria Geanta } 2255e46e9a46SHoria Geanta }, { 2256a4198fd4SHerbert Xu .alg = "authenc(hmac(sha512),cbc(aes))", 2257e46e9a46SHoria Geanta .test = alg_test_aead, 2258e46e9a46SHoria Geanta .fips_allowed = 1, 2259e46e9a46SHoria Geanta .suite = { 2260e46e9a46SHoria Geanta .aead = { 2261e46e9a46SHoria Geanta .enc = { 22625208ed2cSNitesh Lal .vecs = 22635208ed2cSNitesh Lal hmac_sha512_aes_cbc_enc_tv_temp, 22645208ed2cSNitesh Lal .count = 22655208ed2cSNitesh Lal HMAC_SHA512_AES_CBC_ENC_TEST_VEC 22665208ed2cSNitesh Lal } 22675208ed2cSNitesh Lal } 22685208ed2cSNitesh Lal } 22695208ed2cSNitesh Lal }, { 2270a4198fd4SHerbert Xu .alg = "authenc(hmac(sha512),cbc(des))", 22715208ed2cSNitesh Lal .test = alg_test_aead, 22725208ed2cSNitesh Lal .fips_allowed = 1, 22735208ed2cSNitesh Lal .suite = { 22745208ed2cSNitesh Lal .aead = { 22755208ed2cSNitesh Lal .enc = { 22765208ed2cSNitesh Lal .vecs = 22775208ed2cSNitesh Lal hmac_sha512_des_cbc_enc_tv_temp, 22785208ed2cSNitesh Lal .count = 22795208ed2cSNitesh Lal HMAC_SHA512_DES_CBC_ENC_TEST_VEC 22805208ed2cSNitesh Lal } 22815208ed2cSNitesh Lal } 22825208ed2cSNitesh Lal } 22835208ed2cSNitesh Lal }, { 2284a4198fd4SHerbert Xu .alg = "authenc(hmac(sha512),cbc(des3_ede))", 22855208ed2cSNitesh Lal .test = alg_test_aead, 22865208ed2cSNitesh Lal .fips_allowed = 1, 22875208ed2cSNitesh Lal .suite = { 22885208ed2cSNitesh Lal .aead = { 22895208ed2cSNitesh Lal .enc = { 22905208ed2cSNitesh Lal .vecs = 22915208ed2cSNitesh Lal hmac_sha512_des3_ede_cbc_enc_tv_temp, 22925208ed2cSNitesh Lal .count = 22935208ed2cSNitesh Lal HMAC_SHA512_DES3_EDE_CBC_ENC_TEST_VEC 2294e46e9a46SHoria Geanta } 2295e46e9a46SHoria Geanta } 2296e46e9a46SHoria Geanta } 2297e46e9a46SHoria Geanta }, { 2298da7f033dSHerbert Xu .alg = "cbc(aes)", 22991aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2300a1915d51SJarod Wilson .fips_allowed = 1, 2301da7f033dSHerbert Xu .suite = { 2302da7f033dSHerbert Xu .cipher = { 2303da7f033dSHerbert Xu .enc = { 2304da7f033dSHerbert Xu .vecs = aes_cbc_enc_tv_template, 2305da7f033dSHerbert Xu .count = AES_CBC_ENC_TEST_VECTORS 2306da7f033dSHerbert Xu }, 2307da7f033dSHerbert Xu .dec = { 2308da7f033dSHerbert Xu .vecs = aes_cbc_dec_tv_template, 2309da7f033dSHerbert Xu .count = AES_CBC_DEC_TEST_VECTORS 2310da7f033dSHerbert Xu } 2311da7f033dSHerbert Xu } 2312da7f033dSHerbert Xu } 2313da7f033dSHerbert Xu }, { 2314da7f033dSHerbert Xu .alg = "cbc(anubis)", 23151aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2316da7f033dSHerbert Xu .suite = { 2317da7f033dSHerbert Xu .cipher = { 2318da7f033dSHerbert Xu .enc = { 2319da7f033dSHerbert Xu .vecs = anubis_cbc_enc_tv_template, 2320da7f033dSHerbert Xu .count = ANUBIS_CBC_ENC_TEST_VECTORS 2321da7f033dSHerbert Xu }, 2322da7f033dSHerbert Xu .dec = { 2323da7f033dSHerbert Xu .vecs = anubis_cbc_dec_tv_template, 2324da7f033dSHerbert Xu .count = ANUBIS_CBC_DEC_TEST_VECTORS 2325da7f033dSHerbert Xu } 2326da7f033dSHerbert Xu } 2327da7f033dSHerbert Xu } 2328da7f033dSHerbert Xu }, { 2329da7f033dSHerbert Xu .alg = "cbc(blowfish)", 23301aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2331da7f033dSHerbert Xu .suite = { 2332da7f033dSHerbert Xu .cipher = { 2333da7f033dSHerbert Xu .enc = { 2334da7f033dSHerbert Xu .vecs = bf_cbc_enc_tv_template, 2335da7f033dSHerbert Xu .count = BF_CBC_ENC_TEST_VECTORS 2336da7f033dSHerbert Xu }, 2337da7f033dSHerbert Xu .dec = { 2338da7f033dSHerbert Xu .vecs = bf_cbc_dec_tv_template, 2339da7f033dSHerbert Xu .count = BF_CBC_DEC_TEST_VECTORS 2340da7f033dSHerbert Xu } 2341da7f033dSHerbert Xu } 2342da7f033dSHerbert Xu } 2343da7f033dSHerbert Xu }, { 2344da7f033dSHerbert Xu .alg = "cbc(camellia)", 23451aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2346da7f033dSHerbert Xu .suite = { 2347da7f033dSHerbert Xu .cipher = { 2348da7f033dSHerbert Xu .enc = { 2349da7f033dSHerbert Xu .vecs = camellia_cbc_enc_tv_template, 2350da7f033dSHerbert Xu .count = CAMELLIA_CBC_ENC_TEST_VECTORS 2351da7f033dSHerbert Xu }, 2352da7f033dSHerbert Xu .dec = { 2353da7f033dSHerbert Xu .vecs = camellia_cbc_dec_tv_template, 2354da7f033dSHerbert Xu .count = CAMELLIA_CBC_DEC_TEST_VECTORS 2355da7f033dSHerbert Xu } 2356da7f033dSHerbert Xu } 2357da7f033dSHerbert Xu } 2358da7f033dSHerbert Xu }, { 2359a2c58260SJohannes Goetzfried .alg = "cbc(cast5)", 2360a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 2361a2c58260SJohannes Goetzfried .suite = { 2362a2c58260SJohannes Goetzfried .cipher = { 2363a2c58260SJohannes Goetzfried .enc = { 2364a2c58260SJohannes Goetzfried .vecs = cast5_cbc_enc_tv_template, 2365a2c58260SJohannes Goetzfried .count = CAST5_CBC_ENC_TEST_VECTORS 2366a2c58260SJohannes Goetzfried }, 2367a2c58260SJohannes Goetzfried .dec = { 2368a2c58260SJohannes Goetzfried .vecs = cast5_cbc_dec_tv_template, 2369a2c58260SJohannes Goetzfried .count = CAST5_CBC_DEC_TEST_VECTORS 2370a2c58260SJohannes Goetzfried } 2371a2c58260SJohannes Goetzfried } 2372a2c58260SJohannes Goetzfried } 2373a2c58260SJohannes Goetzfried }, { 23749b8b0405SJohannes Goetzfried .alg = "cbc(cast6)", 23759b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 23769b8b0405SJohannes Goetzfried .suite = { 23779b8b0405SJohannes Goetzfried .cipher = { 23789b8b0405SJohannes Goetzfried .enc = { 23799b8b0405SJohannes Goetzfried .vecs = cast6_cbc_enc_tv_template, 23809b8b0405SJohannes Goetzfried .count = CAST6_CBC_ENC_TEST_VECTORS 23819b8b0405SJohannes Goetzfried }, 23829b8b0405SJohannes Goetzfried .dec = { 23839b8b0405SJohannes Goetzfried .vecs = cast6_cbc_dec_tv_template, 23849b8b0405SJohannes Goetzfried .count = CAST6_CBC_DEC_TEST_VECTORS 23859b8b0405SJohannes Goetzfried } 23869b8b0405SJohannes Goetzfried } 23879b8b0405SJohannes Goetzfried } 23889b8b0405SJohannes Goetzfried }, { 2389da7f033dSHerbert Xu .alg = "cbc(des)", 23901aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2391da7f033dSHerbert Xu .suite = { 2392da7f033dSHerbert Xu .cipher = { 2393da7f033dSHerbert Xu .enc = { 2394da7f033dSHerbert Xu .vecs = des_cbc_enc_tv_template, 2395da7f033dSHerbert Xu .count = DES_CBC_ENC_TEST_VECTORS 2396da7f033dSHerbert Xu }, 2397da7f033dSHerbert Xu .dec = { 2398da7f033dSHerbert Xu .vecs = des_cbc_dec_tv_template, 2399da7f033dSHerbert Xu .count = DES_CBC_DEC_TEST_VECTORS 2400da7f033dSHerbert Xu } 2401da7f033dSHerbert Xu } 2402da7f033dSHerbert Xu } 2403da7f033dSHerbert Xu }, { 2404da7f033dSHerbert Xu .alg = "cbc(des3_ede)", 24051aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2406a1915d51SJarod Wilson .fips_allowed = 1, 2407da7f033dSHerbert Xu .suite = { 2408da7f033dSHerbert Xu .cipher = { 2409da7f033dSHerbert Xu .enc = { 2410da7f033dSHerbert Xu .vecs = des3_ede_cbc_enc_tv_template, 2411da7f033dSHerbert Xu .count = DES3_EDE_CBC_ENC_TEST_VECTORS 2412da7f033dSHerbert Xu }, 2413da7f033dSHerbert Xu .dec = { 2414da7f033dSHerbert Xu .vecs = des3_ede_cbc_dec_tv_template, 2415da7f033dSHerbert Xu .count = DES3_EDE_CBC_DEC_TEST_VECTORS 2416da7f033dSHerbert Xu } 2417da7f033dSHerbert Xu } 2418da7f033dSHerbert Xu } 2419da7f033dSHerbert Xu }, { 24209d25917dSJussi Kivilinna .alg = "cbc(serpent)", 24219d25917dSJussi Kivilinna .test = alg_test_skcipher, 24229d25917dSJussi Kivilinna .suite = { 24239d25917dSJussi Kivilinna .cipher = { 24249d25917dSJussi Kivilinna .enc = { 24259d25917dSJussi Kivilinna .vecs = serpent_cbc_enc_tv_template, 24269d25917dSJussi Kivilinna .count = SERPENT_CBC_ENC_TEST_VECTORS 24279d25917dSJussi Kivilinna }, 24289d25917dSJussi Kivilinna .dec = { 24299d25917dSJussi Kivilinna .vecs = serpent_cbc_dec_tv_template, 24309d25917dSJussi Kivilinna .count = SERPENT_CBC_DEC_TEST_VECTORS 24319d25917dSJussi Kivilinna } 24329d25917dSJussi Kivilinna } 24339d25917dSJussi Kivilinna } 24349d25917dSJussi Kivilinna }, { 2435da7f033dSHerbert Xu .alg = "cbc(twofish)", 24361aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2437da7f033dSHerbert Xu .suite = { 2438da7f033dSHerbert Xu .cipher = { 2439da7f033dSHerbert Xu .enc = { 2440da7f033dSHerbert Xu .vecs = tf_cbc_enc_tv_template, 2441da7f033dSHerbert Xu .count = TF_CBC_ENC_TEST_VECTORS 2442da7f033dSHerbert Xu }, 2443da7f033dSHerbert Xu .dec = { 2444da7f033dSHerbert Xu .vecs = tf_cbc_dec_tv_template, 2445da7f033dSHerbert Xu .count = TF_CBC_DEC_TEST_VECTORS 2446da7f033dSHerbert Xu } 2447da7f033dSHerbert Xu } 2448da7f033dSHerbert Xu } 2449da7f033dSHerbert Xu }, { 2450da7f033dSHerbert Xu .alg = "ccm(aes)", 2451da7f033dSHerbert Xu .test = alg_test_aead, 2452a1915d51SJarod Wilson .fips_allowed = 1, 2453da7f033dSHerbert Xu .suite = { 2454da7f033dSHerbert Xu .aead = { 2455da7f033dSHerbert Xu .enc = { 2456da7f033dSHerbert Xu .vecs = aes_ccm_enc_tv_template, 2457da7f033dSHerbert Xu .count = AES_CCM_ENC_TEST_VECTORS 2458da7f033dSHerbert Xu }, 2459da7f033dSHerbert Xu .dec = { 2460da7f033dSHerbert Xu .vecs = aes_ccm_dec_tv_template, 2461da7f033dSHerbert Xu .count = AES_CCM_DEC_TEST_VECTORS 2462da7f033dSHerbert Xu } 2463da7f033dSHerbert Xu } 2464da7f033dSHerbert Xu } 2465da7f033dSHerbert Xu }, { 24663590ebf2SMartin Willi .alg = "chacha20", 24673590ebf2SMartin Willi .test = alg_test_skcipher, 24683590ebf2SMartin Willi .suite = { 24693590ebf2SMartin Willi .cipher = { 24703590ebf2SMartin Willi .enc = { 24713590ebf2SMartin Willi .vecs = chacha20_enc_tv_template, 24723590ebf2SMartin Willi .count = CHACHA20_ENC_TEST_VECTORS 24733590ebf2SMartin Willi }, 24743590ebf2SMartin Willi .dec = { 24753590ebf2SMartin Willi .vecs = chacha20_enc_tv_template, 24763590ebf2SMartin Willi .count = CHACHA20_ENC_TEST_VECTORS 24773590ebf2SMartin Willi }, 24783590ebf2SMartin Willi } 24793590ebf2SMartin Willi } 24803590ebf2SMartin Willi }, { 248193b5e86aSJussi Kivilinna .alg = "cmac(aes)", 24828f183751SStephan Mueller .fips_allowed = 1, 248393b5e86aSJussi Kivilinna .test = alg_test_hash, 248493b5e86aSJussi Kivilinna .suite = { 248593b5e86aSJussi Kivilinna .hash = { 248693b5e86aSJussi Kivilinna .vecs = aes_cmac128_tv_template, 248793b5e86aSJussi Kivilinna .count = CMAC_AES_TEST_VECTORS 248893b5e86aSJussi Kivilinna } 248993b5e86aSJussi Kivilinna } 249093b5e86aSJussi Kivilinna }, { 249193b5e86aSJussi Kivilinna .alg = "cmac(des3_ede)", 24928f183751SStephan Mueller .fips_allowed = 1, 249393b5e86aSJussi Kivilinna .test = alg_test_hash, 249493b5e86aSJussi Kivilinna .suite = { 249593b5e86aSJussi Kivilinna .hash = { 249693b5e86aSJussi Kivilinna .vecs = des3_ede_cmac64_tv_template, 249793b5e86aSJussi Kivilinna .count = CMAC_DES3_EDE_TEST_VECTORS 249893b5e86aSJussi Kivilinna } 249993b5e86aSJussi Kivilinna } 250093b5e86aSJussi Kivilinna }, { 2501e448370dSJussi Kivilinna .alg = "compress_null", 2502e448370dSJussi Kivilinna .test = alg_test_null, 2503e448370dSJussi Kivilinna }, { 2504ebb3472fSArd Biesheuvel .alg = "crc32", 2505ebb3472fSArd Biesheuvel .test = alg_test_hash, 2506ebb3472fSArd Biesheuvel .suite = { 2507ebb3472fSArd Biesheuvel .hash = { 2508ebb3472fSArd Biesheuvel .vecs = crc32_tv_template, 2509ebb3472fSArd Biesheuvel .count = CRC32_TEST_VECTORS 2510ebb3472fSArd Biesheuvel } 2511ebb3472fSArd Biesheuvel } 2512ebb3472fSArd Biesheuvel }, { 2513da7f033dSHerbert Xu .alg = "crc32c", 25148e3ee85eSHerbert Xu .test = alg_test_crc32c, 2515a1915d51SJarod Wilson .fips_allowed = 1, 2516da7f033dSHerbert Xu .suite = { 2517da7f033dSHerbert Xu .hash = { 2518da7f033dSHerbert Xu .vecs = crc32c_tv_template, 2519da7f033dSHerbert Xu .count = CRC32C_TEST_VECTORS 2520da7f033dSHerbert Xu } 2521da7f033dSHerbert Xu } 2522da7f033dSHerbert Xu }, { 252368411521SHerbert Xu .alg = "crct10dif", 252468411521SHerbert Xu .test = alg_test_hash, 252568411521SHerbert Xu .fips_allowed = 1, 252668411521SHerbert Xu .suite = { 252768411521SHerbert Xu .hash = { 252868411521SHerbert Xu .vecs = crct10dif_tv_template, 252968411521SHerbert Xu .count = CRCT10DIF_TEST_VECTORS 253068411521SHerbert Xu } 253168411521SHerbert Xu } 253268411521SHerbert Xu }, { 25336c79294fSMilan Broz .alg = "cryptd(__driver-cbc-aes-aesni)", 25346c79294fSMilan Broz .test = alg_test_null, 25356c79294fSMilan Broz .fips_allowed = 1, 25366c79294fSMilan Broz }, { 2537d9b1d2e7SJussi Kivilinna .alg = "cryptd(__driver-cbc-camellia-aesni)", 2538d9b1d2e7SJussi Kivilinna .test = alg_test_null, 2539d9b1d2e7SJussi Kivilinna }, { 2540f3f935a7SJussi Kivilinna .alg = "cryptd(__driver-cbc-camellia-aesni-avx2)", 2541f3f935a7SJussi Kivilinna .test = alg_test_null, 2542f3f935a7SJussi Kivilinna }, { 254356d76c96SJussi Kivilinna .alg = "cryptd(__driver-cbc-serpent-avx2)", 254456d76c96SJussi Kivilinna .test = alg_test_null, 254556d76c96SJussi Kivilinna }, { 2546863b557aSYouquan, Song .alg = "cryptd(__driver-ecb-aes-aesni)", 2547863b557aSYouquan, Song .test = alg_test_null, 25486c79294fSMilan Broz .fips_allowed = 1, 2549863b557aSYouquan, Song }, { 2550d9b1d2e7SJussi Kivilinna .alg = "cryptd(__driver-ecb-camellia-aesni)", 2551d9b1d2e7SJussi Kivilinna .test = alg_test_null, 2552d9b1d2e7SJussi Kivilinna }, { 2553f3f935a7SJussi Kivilinna .alg = "cryptd(__driver-ecb-camellia-aesni-avx2)", 2554f3f935a7SJussi Kivilinna .test = alg_test_null, 2555f3f935a7SJussi Kivilinna }, { 25564d6d6a2cSJohannes Goetzfried .alg = "cryptd(__driver-ecb-cast5-avx)", 25574d6d6a2cSJohannes Goetzfried .test = alg_test_null, 25584d6d6a2cSJohannes Goetzfried }, { 25594ea1277dSJohannes Goetzfried .alg = "cryptd(__driver-ecb-cast6-avx)", 25604ea1277dSJohannes Goetzfried .test = alg_test_null, 25614ea1277dSJohannes Goetzfried }, { 25627efe4076SJohannes Goetzfried .alg = "cryptd(__driver-ecb-serpent-avx)", 25637efe4076SJohannes Goetzfried .test = alg_test_null, 25647efe4076SJohannes Goetzfried }, { 256556d76c96SJussi Kivilinna .alg = "cryptd(__driver-ecb-serpent-avx2)", 256656d76c96SJussi Kivilinna .test = alg_test_null, 256756d76c96SJussi Kivilinna }, { 2568937c30d7SJussi Kivilinna .alg = "cryptd(__driver-ecb-serpent-sse2)", 2569937c30d7SJussi Kivilinna .test = alg_test_null, 2570937c30d7SJussi Kivilinna }, { 2571107778b5SJohannes Goetzfried .alg = "cryptd(__driver-ecb-twofish-avx)", 2572107778b5SJohannes Goetzfried .test = alg_test_null, 2573107778b5SJohannes Goetzfried }, { 25746c79294fSMilan Broz .alg = "cryptd(__driver-gcm-aes-aesni)", 25756c79294fSMilan Broz .test = alg_test_null, 25766c79294fSMilan Broz .fips_allowed = 1, 25776c79294fSMilan Broz }, { 2578863b557aSYouquan, Song .alg = "cryptd(__ghash-pclmulqdqni)", 2579863b557aSYouquan, Song .test = alg_test_null, 25806c79294fSMilan Broz .fips_allowed = 1, 2581863b557aSYouquan, Song }, { 2582f7cb80f2SJarod Wilson .alg = "ctr(aes)", 2583f7cb80f2SJarod Wilson .test = alg_test_skcipher, 2584a1915d51SJarod Wilson .fips_allowed = 1, 2585f7cb80f2SJarod Wilson .suite = { 2586f7cb80f2SJarod Wilson .cipher = { 2587f7cb80f2SJarod Wilson .enc = { 2588f7cb80f2SJarod Wilson .vecs = aes_ctr_enc_tv_template, 2589f7cb80f2SJarod Wilson .count = AES_CTR_ENC_TEST_VECTORS 2590f7cb80f2SJarod Wilson }, 2591f7cb80f2SJarod Wilson .dec = { 2592f7cb80f2SJarod Wilson .vecs = aes_ctr_dec_tv_template, 2593f7cb80f2SJarod Wilson .count = AES_CTR_DEC_TEST_VECTORS 2594f7cb80f2SJarod Wilson } 2595f7cb80f2SJarod Wilson } 2596f7cb80f2SJarod Wilson } 2597f7cb80f2SJarod Wilson }, { 259885b63e34SJussi Kivilinna .alg = "ctr(blowfish)", 259985b63e34SJussi Kivilinna .test = alg_test_skcipher, 260085b63e34SJussi Kivilinna .suite = { 260185b63e34SJussi Kivilinna .cipher = { 260285b63e34SJussi Kivilinna .enc = { 260385b63e34SJussi Kivilinna .vecs = bf_ctr_enc_tv_template, 260485b63e34SJussi Kivilinna .count = BF_CTR_ENC_TEST_VECTORS 260585b63e34SJussi Kivilinna }, 260685b63e34SJussi Kivilinna .dec = { 260785b63e34SJussi Kivilinna .vecs = bf_ctr_dec_tv_template, 260885b63e34SJussi Kivilinna .count = BF_CTR_DEC_TEST_VECTORS 260985b63e34SJussi Kivilinna } 261085b63e34SJussi Kivilinna } 261185b63e34SJussi Kivilinna } 261285b63e34SJussi Kivilinna }, { 26130840605eSJussi Kivilinna .alg = "ctr(camellia)", 26140840605eSJussi Kivilinna .test = alg_test_skcipher, 26150840605eSJussi Kivilinna .suite = { 26160840605eSJussi Kivilinna .cipher = { 26170840605eSJussi Kivilinna .enc = { 26180840605eSJussi Kivilinna .vecs = camellia_ctr_enc_tv_template, 26190840605eSJussi Kivilinna .count = CAMELLIA_CTR_ENC_TEST_VECTORS 26200840605eSJussi Kivilinna }, 26210840605eSJussi Kivilinna .dec = { 26220840605eSJussi Kivilinna .vecs = camellia_ctr_dec_tv_template, 26230840605eSJussi Kivilinna .count = CAMELLIA_CTR_DEC_TEST_VECTORS 26240840605eSJussi Kivilinna } 26250840605eSJussi Kivilinna } 26260840605eSJussi Kivilinna } 26270840605eSJussi Kivilinna }, { 2628a2c58260SJohannes Goetzfried .alg = "ctr(cast5)", 2629a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 2630a2c58260SJohannes Goetzfried .suite = { 2631a2c58260SJohannes Goetzfried .cipher = { 2632a2c58260SJohannes Goetzfried .enc = { 2633a2c58260SJohannes Goetzfried .vecs = cast5_ctr_enc_tv_template, 2634a2c58260SJohannes Goetzfried .count = CAST5_CTR_ENC_TEST_VECTORS 2635a2c58260SJohannes Goetzfried }, 2636a2c58260SJohannes Goetzfried .dec = { 2637a2c58260SJohannes Goetzfried .vecs = cast5_ctr_dec_tv_template, 2638a2c58260SJohannes Goetzfried .count = CAST5_CTR_DEC_TEST_VECTORS 2639a2c58260SJohannes Goetzfried } 2640a2c58260SJohannes Goetzfried } 2641a2c58260SJohannes Goetzfried } 2642a2c58260SJohannes Goetzfried }, { 26439b8b0405SJohannes Goetzfried .alg = "ctr(cast6)", 26449b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 26459b8b0405SJohannes Goetzfried .suite = { 26469b8b0405SJohannes Goetzfried .cipher = { 26479b8b0405SJohannes Goetzfried .enc = { 26489b8b0405SJohannes Goetzfried .vecs = cast6_ctr_enc_tv_template, 26499b8b0405SJohannes Goetzfried .count = CAST6_CTR_ENC_TEST_VECTORS 26509b8b0405SJohannes Goetzfried }, 26519b8b0405SJohannes Goetzfried .dec = { 26529b8b0405SJohannes Goetzfried .vecs = cast6_ctr_dec_tv_template, 26539b8b0405SJohannes Goetzfried .count = CAST6_CTR_DEC_TEST_VECTORS 26549b8b0405SJohannes Goetzfried } 26559b8b0405SJohannes Goetzfried } 26569b8b0405SJohannes Goetzfried } 26579b8b0405SJohannes Goetzfried }, { 26588163fc30SJussi Kivilinna .alg = "ctr(des)", 26598163fc30SJussi Kivilinna .test = alg_test_skcipher, 26608163fc30SJussi Kivilinna .suite = { 26618163fc30SJussi Kivilinna .cipher = { 26628163fc30SJussi Kivilinna .enc = { 26638163fc30SJussi Kivilinna .vecs = des_ctr_enc_tv_template, 26648163fc30SJussi Kivilinna .count = DES_CTR_ENC_TEST_VECTORS 26658163fc30SJussi Kivilinna }, 26668163fc30SJussi Kivilinna .dec = { 26678163fc30SJussi Kivilinna .vecs = des_ctr_dec_tv_template, 26688163fc30SJussi Kivilinna .count = DES_CTR_DEC_TEST_VECTORS 26698163fc30SJussi Kivilinna } 26708163fc30SJussi Kivilinna } 26718163fc30SJussi Kivilinna } 26728163fc30SJussi Kivilinna }, { 2673e080b17aSJussi Kivilinna .alg = "ctr(des3_ede)", 2674e080b17aSJussi Kivilinna .test = alg_test_skcipher, 2675e080b17aSJussi Kivilinna .suite = { 2676e080b17aSJussi Kivilinna .cipher = { 2677e080b17aSJussi Kivilinna .enc = { 2678e080b17aSJussi Kivilinna .vecs = des3_ede_ctr_enc_tv_template, 2679e080b17aSJussi Kivilinna .count = DES3_EDE_CTR_ENC_TEST_VECTORS 2680e080b17aSJussi Kivilinna }, 2681e080b17aSJussi Kivilinna .dec = { 2682e080b17aSJussi Kivilinna .vecs = des3_ede_ctr_dec_tv_template, 2683e080b17aSJussi Kivilinna .count = DES3_EDE_CTR_DEC_TEST_VECTORS 2684e080b17aSJussi Kivilinna } 2685e080b17aSJussi Kivilinna } 2686e080b17aSJussi Kivilinna } 2687e080b17aSJussi Kivilinna }, { 26889d25917dSJussi Kivilinna .alg = "ctr(serpent)", 26899d25917dSJussi Kivilinna .test = alg_test_skcipher, 26909d25917dSJussi Kivilinna .suite = { 26919d25917dSJussi Kivilinna .cipher = { 26929d25917dSJussi Kivilinna .enc = { 26939d25917dSJussi Kivilinna .vecs = serpent_ctr_enc_tv_template, 26949d25917dSJussi Kivilinna .count = SERPENT_CTR_ENC_TEST_VECTORS 26959d25917dSJussi Kivilinna }, 26969d25917dSJussi Kivilinna .dec = { 26979d25917dSJussi Kivilinna .vecs = serpent_ctr_dec_tv_template, 26989d25917dSJussi Kivilinna .count = SERPENT_CTR_DEC_TEST_VECTORS 26999d25917dSJussi Kivilinna } 27009d25917dSJussi Kivilinna } 27019d25917dSJussi Kivilinna } 27029d25917dSJussi Kivilinna }, { 2703573da620SJussi Kivilinna .alg = "ctr(twofish)", 2704573da620SJussi Kivilinna .test = alg_test_skcipher, 2705573da620SJussi Kivilinna .suite = { 2706573da620SJussi Kivilinna .cipher = { 2707573da620SJussi Kivilinna .enc = { 2708573da620SJussi Kivilinna .vecs = tf_ctr_enc_tv_template, 2709573da620SJussi Kivilinna .count = TF_CTR_ENC_TEST_VECTORS 2710573da620SJussi Kivilinna }, 2711573da620SJussi Kivilinna .dec = { 2712573da620SJussi Kivilinna .vecs = tf_ctr_dec_tv_template, 2713573da620SJussi Kivilinna .count = TF_CTR_DEC_TEST_VECTORS 2714573da620SJussi Kivilinna } 2715573da620SJussi Kivilinna } 2716573da620SJussi Kivilinna } 2717573da620SJussi Kivilinna }, { 2718da7f033dSHerbert Xu .alg = "cts(cbc(aes))", 27191aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2720da7f033dSHerbert Xu .suite = { 2721da7f033dSHerbert Xu .cipher = { 2722da7f033dSHerbert Xu .enc = { 2723da7f033dSHerbert Xu .vecs = cts_mode_enc_tv_template, 2724da7f033dSHerbert Xu .count = CTS_MODE_ENC_TEST_VECTORS 2725da7f033dSHerbert Xu }, 2726da7f033dSHerbert Xu .dec = { 2727da7f033dSHerbert Xu .vecs = cts_mode_dec_tv_template, 2728da7f033dSHerbert Xu .count = CTS_MODE_DEC_TEST_VECTORS 2729da7f033dSHerbert Xu } 2730da7f033dSHerbert Xu } 2731da7f033dSHerbert Xu } 2732da7f033dSHerbert Xu }, { 2733da7f033dSHerbert Xu .alg = "deflate", 2734da7f033dSHerbert Xu .test = alg_test_comp, 27350818904dSMilan Broz .fips_allowed = 1, 2736da7f033dSHerbert Xu .suite = { 2737da7f033dSHerbert Xu .comp = { 2738da7f033dSHerbert Xu .comp = { 2739da7f033dSHerbert Xu .vecs = deflate_comp_tv_template, 2740da7f033dSHerbert Xu .count = DEFLATE_COMP_TEST_VECTORS 2741da7f033dSHerbert Xu }, 2742da7f033dSHerbert Xu .decomp = { 2743da7f033dSHerbert Xu .vecs = deflate_decomp_tv_template, 2744da7f033dSHerbert Xu .count = DEFLATE_DECOMP_TEST_VECTORS 2745da7f033dSHerbert Xu } 2746da7f033dSHerbert Xu } 2747da7f033dSHerbert Xu } 2748da7f033dSHerbert Xu }, { 2749e448370dSJussi Kivilinna .alg = "digest_null", 2750e448370dSJussi Kivilinna .test = alg_test_null, 2751e448370dSJussi Kivilinna }, { 275264d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes128", 275364d1cdfbSStephan Mueller .test = alg_test_drbg, 275464d1cdfbSStephan Mueller .fips_allowed = 1, 275564d1cdfbSStephan Mueller .suite = { 275664d1cdfbSStephan Mueller .drbg = { 275764d1cdfbSStephan Mueller .vecs = drbg_nopr_ctr_aes128_tv_template, 275864d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_ctr_aes128_tv_template) 275964d1cdfbSStephan Mueller } 276064d1cdfbSStephan Mueller } 276164d1cdfbSStephan Mueller }, { 276264d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes192", 276364d1cdfbSStephan Mueller .test = alg_test_drbg, 276464d1cdfbSStephan Mueller .fips_allowed = 1, 276564d1cdfbSStephan Mueller .suite = { 276664d1cdfbSStephan Mueller .drbg = { 276764d1cdfbSStephan Mueller .vecs = drbg_nopr_ctr_aes192_tv_template, 276864d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_ctr_aes192_tv_template) 276964d1cdfbSStephan Mueller } 277064d1cdfbSStephan Mueller } 277164d1cdfbSStephan Mueller }, { 277264d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes256", 277364d1cdfbSStephan Mueller .test = alg_test_drbg, 277464d1cdfbSStephan Mueller .fips_allowed = 1, 277564d1cdfbSStephan Mueller .suite = { 277664d1cdfbSStephan Mueller .drbg = { 277764d1cdfbSStephan Mueller .vecs = drbg_nopr_ctr_aes256_tv_template, 277864d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_ctr_aes256_tv_template) 277964d1cdfbSStephan Mueller } 278064d1cdfbSStephan Mueller } 278164d1cdfbSStephan Mueller }, { 278264d1cdfbSStephan Mueller /* 278364d1cdfbSStephan Mueller * There is no need to specifically test the DRBG with every 278464d1cdfbSStephan Mueller * backend cipher -- covered by drbg_nopr_hmac_sha256 test 278564d1cdfbSStephan Mueller */ 278664d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha1", 278764d1cdfbSStephan Mueller .fips_allowed = 1, 278864d1cdfbSStephan Mueller .test = alg_test_null, 278964d1cdfbSStephan Mueller }, { 279064d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha256", 279164d1cdfbSStephan Mueller .test = alg_test_drbg, 279264d1cdfbSStephan Mueller .fips_allowed = 1, 279364d1cdfbSStephan Mueller .suite = { 279464d1cdfbSStephan Mueller .drbg = { 279564d1cdfbSStephan Mueller .vecs = drbg_nopr_hmac_sha256_tv_template, 279664d1cdfbSStephan Mueller .count = 279764d1cdfbSStephan Mueller ARRAY_SIZE(drbg_nopr_hmac_sha256_tv_template) 279864d1cdfbSStephan Mueller } 279964d1cdfbSStephan Mueller } 280064d1cdfbSStephan Mueller }, { 280164d1cdfbSStephan Mueller /* covered by drbg_nopr_hmac_sha256 test */ 280264d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha384", 280364d1cdfbSStephan Mueller .fips_allowed = 1, 280464d1cdfbSStephan Mueller .test = alg_test_null, 280564d1cdfbSStephan Mueller }, { 280664d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha512", 280764d1cdfbSStephan Mueller .test = alg_test_null, 280864d1cdfbSStephan Mueller .fips_allowed = 1, 280964d1cdfbSStephan Mueller }, { 281064d1cdfbSStephan Mueller .alg = "drbg_nopr_sha1", 281164d1cdfbSStephan Mueller .fips_allowed = 1, 281264d1cdfbSStephan Mueller .test = alg_test_null, 281364d1cdfbSStephan Mueller }, { 281464d1cdfbSStephan Mueller .alg = "drbg_nopr_sha256", 281564d1cdfbSStephan Mueller .test = alg_test_drbg, 281664d1cdfbSStephan Mueller .fips_allowed = 1, 281764d1cdfbSStephan Mueller .suite = { 281864d1cdfbSStephan Mueller .drbg = { 281964d1cdfbSStephan Mueller .vecs = drbg_nopr_sha256_tv_template, 282064d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_sha256_tv_template) 282164d1cdfbSStephan Mueller } 282264d1cdfbSStephan Mueller } 282364d1cdfbSStephan Mueller }, { 282464d1cdfbSStephan Mueller /* covered by drbg_nopr_sha256 test */ 282564d1cdfbSStephan Mueller .alg = "drbg_nopr_sha384", 282664d1cdfbSStephan Mueller .fips_allowed = 1, 282764d1cdfbSStephan Mueller .test = alg_test_null, 282864d1cdfbSStephan Mueller }, { 282964d1cdfbSStephan Mueller .alg = "drbg_nopr_sha512", 283064d1cdfbSStephan Mueller .fips_allowed = 1, 283164d1cdfbSStephan Mueller .test = alg_test_null, 283264d1cdfbSStephan Mueller }, { 283364d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes128", 283464d1cdfbSStephan Mueller .test = alg_test_drbg, 283564d1cdfbSStephan Mueller .fips_allowed = 1, 283664d1cdfbSStephan Mueller .suite = { 283764d1cdfbSStephan Mueller .drbg = { 283864d1cdfbSStephan Mueller .vecs = drbg_pr_ctr_aes128_tv_template, 283964d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_pr_ctr_aes128_tv_template) 284064d1cdfbSStephan Mueller } 284164d1cdfbSStephan Mueller } 284264d1cdfbSStephan Mueller }, { 284364d1cdfbSStephan Mueller /* covered by drbg_pr_ctr_aes128 test */ 284464d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes192", 284564d1cdfbSStephan Mueller .fips_allowed = 1, 284664d1cdfbSStephan Mueller .test = alg_test_null, 284764d1cdfbSStephan Mueller }, { 284864d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes256", 284964d1cdfbSStephan Mueller .fips_allowed = 1, 285064d1cdfbSStephan Mueller .test = alg_test_null, 285164d1cdfbSStephan Mueller }, { 285264d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha1", 285364d1cdfbSStephan Mueller .fips_allowed = 1, 285464d1cdfbSStephan Mueller .test = alg_test_null, 285564d1cdfbSStephan Mueller }, { 285664d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha256", 285764d1cdfbSStephan Mueller .test = alg_test_drbg, 285864d1cdfbSStephan Mueller .fips_allowed = 1, 285964d1cdfbSStephan Mueller .suite = { 286064d1cdfbSStephan Mueller .drbg = { 286164d1cdfbSStephan Mueller .vecs = drbg_pr_hmac_sha256_tv_template, 286264d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_pr_hmac_sha256_tv_template) 286364d1cdfbSStephan Mueller } 286464d1cdfbSStephan Mueller } 286564d1cdfbSStephan Mueller }, { 286664d1cdfbSStephan Mueller /* covered by drbg_pr_hmac_sha256 test */ 286764d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha384", 286864d1cdfbSStephan Mueller .fips_allowed = 1, 286964d1cdfbSStephan Mueller .test = alg_test_null, 287064d1cdfbSStephan Mueller }, { 287164d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha512", 287264d1cdfbSStephan Mueller .test = alg_test_null, 287364d1cdfbSStephan Mueller .fips_allowed = 1, 287464d1cdfbSStephan Mueller }, { 287564d1cdfbSStephan Mueller .alg = "drbg_pr_sha1", 287664d1cdfbSStephan Mueller .fips_allowed = 1, 287764d1cdfbSStephan Mueller .test = alg_test_null, 287864d1cdfbSStephan Mueller }, { 287964d1cdfbSStephan Mueller .alg = "drbg_pr_sha256", 288064d1cdfbSStephan Mueller .test = alg_test_drbg, 288164d1cdfbSStephan Mueller .fips_allowed = 1, 288264d1cdfbSStephan Mueller .suite = { 288364d1cdfbSStephan Mueller .drbg = { 288464d1cdfbSStephan Mueller .vecs = drbg_pr_sha256_tv_template, 288564d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_pr_sha256_tv_template) 288664d1cdfbSStephan Mueller } 288764d1cdfbSStephan Mueller } 288864d1cdfbSStephan Mueller }, { 288964d1cdfbSStephan Mueller /* covered by drbg_pr_sha256 test */ 289064d1cdfbSStephan Mueller .alg = "drbg_pr_sha384", 289164d1cdfbSStephan Mueller .fips_allowed = 1, 289264d1cdfbSStephan Mueller .test = alg_test_null, 289364d1cdfbSStephan Mueller }, { 289464d1cdfbSStephan Mueller .alg = "drbg_pr_sha512", 289564d1cdfbSStephan Mueller .fips_allowed = 1, 289664d1cdfbSStephan Mueller .test = alg_test_null, 289764d1cdfbSStephan Mueller }, { 2898863b557aSYouquan, Song .alg = "ecb(__aes-aesni)", 2899863b557aSYouquan, Song .test = alg_test_null, 29006c79294fSMilan Broz .fips_allowed = 1, 2901863b557aSYouquan, Song }, { 2902da7f033dSHerbert Xu .alg = "ecb(aes)", 29031aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2904a1915d51SJarod Wilson .fips_allowed = 1, 2905da7f033dSHerbert Xu .suite = { 2906da7f033dSHerbert Xu .cipher = { 2907da7f033dSHerbert Xu .enc = { 2908da7f033dSHerbert Xu .vecs = aes_enc_tv_template, 2909da7f033dSHerbert Xu .count = AES_ENC_TEST_VECTORS 2910da7f033dSHerbert Xu }, 2911da7f033dSHerbert Xu .dec = { 2912da7f033dSHerbert Xu .vecs = aes_dec_tv_template, 2913da7f033dSHerbert Xu .count = AES_DEC_TEST_VECTORS 2914da7f033dSHerbert Xu } 2915da7f033dSHerbert Xu } 2916da7f033dSHerbert Xu } 2917da7f033dSHerbert Xu }, { 2918da7f033dSHerbert Xu .alg = "ecb(anubis)", 29191aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2920da7f033dSHerbert Xu .suite = { 2921da7f033dSHerbert Xu .cipher = { 2922da7f033dSHerbert Xu .enc = { 2923da7f033dSHerbert Xu .vecs = anubis_enc_tv_template, 2924da7f033dSHerbert Xu .count = ANUBIS_ENC_TEST_VECTORS 2925da7f033dSHerbert Xu }, 2926da7f033dSHerbert Xu .dec = { 2927da7f033dSHerbert Xu .vecs = anubis_dec_tv_template, 2928da7f033dSHerbert Xu .count = ANUBIS_DEC_TEST_VECTORS 2929da7f033dSHerbert Xu } 2930da7f033dSHerbert Xu } 2931da7f033dSHerbert Xu } 2932da7f033dSHerbert Xu }, { 2933da7f033dSHerbert Xu .alg = "ecb(arc4)", 29341aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2935da7f033dSHerbert Xu .suite = { 2936da7f033dSHerbert Xu .cipher = { 2937da7f033dSHerbert Xu .enc = { 2938da7f033dSHerbert Xu .vecs = arc4_enc_tv_template, 2939da7f033dSHerbert Xu .count = ARC4_ENC_TEST_VECTORS 2940da7f033dSHerbert Xu }, 2941da7f033dSHerbert Xu .dec = { 2942da7f033dSHerbert Xu .vecs = arc4_dec_tv_template, 2943da7f033dSHerbert Xu .count = ARC4_DEC_TEST_VECTORS 2944da7f033dSHerbert Xu } 2945da7f033dSHerbert Xu } 2946da7f033dSHerbert Xu } 2947da7f033dSHerbert Xu }, { 2948da7f033dSHerbert Xu .alg = "ecb(blowfish)", 29491aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2950da7f033dSHerbert Xu .suite = { 2951da7f033dSHerbert Xu .cipher = { 2952da7f033dSHerbert Xu .enc = { 2953da7f033dSHerbert Xu .vecs = bf_enc_tv_template, 2954da7f033dSHerbert Xu .count = BF_ENC_TEST_VECTORS 2955da7f033dSHerbert Xu }, 2956da7f033dSHerbert Xu .dec = { 2957da7f033dSHerbert Xu .vecs = bf_dec_tv_template, 2958da7f033dSHerbert Xu .count = BF_DEC_TEST_VECTORS 2959da7f033dSHerbert Xu } 2960da7f033dSHerbert Xu } 2961da7f033dSHerbert Xu } 2962da7f033dSHerbert Xu }, { 2963da7f033dSHerbert Xu .alg = "ecb(camellia)", 29641aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2965da7f033dSHerbert Xu .suite = { 2966da7f033dSHerbert Xu .cipher = { 2967da7f033dSHerbert Xu .enc = { 2968da7f033dSHerbert Xu .vecs = camellia_enc_tv_template, 2969da7f033dSHerbert Xu .count = CAMELLIA_ENC_TEST_VECTORS 2970da7f033dSHerbert Xu }, 2971da7f033dSHerbert Xu .dec = { 2972da7f033dSHerbert Xu .vecs = camellia_dec_tv_template, 2973da7f033dSHerbert Xu .count = CAMELLIA_DEC_TEST_VECTORS 2974da7f033dSHerbert Xu } 2975da7f033dSHerbert Xu } 2976da7f033dSHerbert Xu } 2977da7f033dSHerbert Xu }, { 2978da7f033dSHerbert Xu .alg = "ecb(cast5)", 29791aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2980da7f033dSHerbert Xu .suite = { 2981da7f033dSHerbert Xu .cipher = { 2982da7f033dSHerbert Xu .enc = { 2983da7f033dSHerbert Xu .vecs = cast5_enc_tv_template, 2984da7f033dSHerbert Xu .count = CAST5_ENC_TEST_VECTORS 2985da7f033dSHerbert Xu }, 2986da7f033dSHerbert Xu .dec = { 2987da7f033dSHerbert Xu .vecs = cast5_dec_tv_template, 2988da7f033dSHerbert Xu .count = CAST5_DEC_TEST_VECTORS 2989da7f033dSHerbert Xu } 2990da7f033dSHerbert Xu } 2991da7f033dSHerbert Xu } 2992da7f033dSHerbert Xu }, { 2993da7f033dSHerbert Xu .alg = "ecb(cast6)", 29941aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2995da7f033dSHerbert Xu .suite = { 2996da7f033dSHerbert Xu .cipher = { 2997da7f033dSHerbert Xu .enc = { 2998da7f033dSHerbert Xu .vecs = cast6_enc_tv_template, 2999da7f033dSHerbert Xu .count = CAST6_ENC_TEST_VECTORS 3000da7f033dSHerbert Xu }, 3001da7f033dSHerbert Xu .dec = { 3002da7f033dSHerbert Xu .vecs = cast6_dec_tv_template, 3003da7f033dSHerbert Xu .count = CAST6_DEC_TEST_VECTORS 3004da7f033dSHerbert Xu } 3005da7f033dSHerbert Xu } 3006da7f033dSHerbert Xu } 3007da7f033dSHerbert Xu }, { 3008e448370dSJussi Kivilinna .alg = "ecb(cipher_null)", 3009e448370dSJussi Kivilinna .test = alg_test_null, 3010e448370dSJussi Kivilinna }, { 3011da7f033dSHerbert Xu .alg = "ecb(des)", 30121aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3013a1915d51SJarod Wilson .fips_allowed = 1, 3014da7f033dSHerbert Xu .suite = { 3015da7f033dSHerbert Xu .cipher = { 3016da7f033dSHerbert Xu .enc = { 3017da7f033dSHerbert Xu .vecs = des_enc_tv_template, 3018da7f033dSHerbert Xu .count = DES_ENC_TEST_VECTORS 3019da7f033dSHerbert Xu }, 3020da7f033dSHerbert Xu .dec = { 3021da7f033dSHerbert Xu .vecs = des_dec_tv_template, 3022da7f033dSHerbert Xu .count = DES_DEC_TEST_VECTORS 3023da7f033dSHerbert Xu } 3024da7f033dSHerbert Xu } 3025da7f033dSHerbert Xu } 3026da7f033dSHerbert Xu }, { 3027da7f033dSHerbert Xu .alg = "ecb(des3_ede)", 30281aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3029a1915d51SJarod Wilson .fips_allowed = 1, 3030da7f033dSHerbert Xu .suite = { 3031da7f033dSHerbert Xu .cipher = { 3032da7f033dSHerbert Xu .enc = { 3033da7f033dSHerbert Xu .vecs = des3_ede_enc_tv_template, 3034da7f033dSHerbert Xu .count = DES3_EDE_ENC_TEST_VECTORS 3035da7f033dSHerbert Xu }, 3036da7f033dSHerbert Xu .dec = { 3037da7f033dSHerbert Xu .vecs = des3_ede_dec_tv_template, 3038da7f033dSHerbert Xu .count = DES3_EDE_DEC_TEST_VECTORS 3039da7f033dSHerbert Xu } 3040da7f033dSHerbert Xu } 3041da7f033dSHerbert Xu } 3042da7f033dSHerbert Xu }, { 304366e5bd00SJussi Kivilinna .alg = "ecb(fcrypt)", 304466e5bd00SJussi Kivilinna .test = alg_test_skcipher, 304566e5bd00SJussi Kivilinna .suite = { 304666e5bd00SJussi Kivilinna .cipher = { 304766e5bd00SJussi Kivilinna .enc = { 304866e5bd00SJussi Kivilinna .vecs = fcrypt_pcbc_enc_tv_template, 304966e5bd00SJussi Kivilinna .count = 1 305066e5bd00SJussi Kivilinna }, 305166e5bd00SJussi Kivilinna .dec = { 305266e5bd00SJussi Kivilinna .vecs = fcrypt_pcbc_dec_tv_template, 305366e5bd00SJussi Kivilinna .count = 1 305466e5bd00SJussi Kivilinna } 305566e5bd00SJussi Kivilinna } 305666e5bd00SJussi Kivilinna } 305766e5bd00SJussi Kivilinna }, { 3058da7f033dSHerbert Xu .alg = "ecb(khazad)", 30591aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3060da7f033dSHerbert Xu .suite = { 3061da7f033dSHerbert Xu .cipher = { 3062da7f033dSHerbert Xu .enc = { 3063da7f033dSHerbert Xu .vecs = khazad_enc_tv_template, 3064da7f033dSHerbert Xu .count = KHAZAD_ENC_TEST_VECTORS 3065da7f033dSHerbert Xu }, 3066da7f033dSHerbert Xu .dec = { 3067da7f033dSHerbert Xu .vecs = khazad_dec_tv_template, 3068da7f033dSHerbert Xu .count = KHAZAD_DEC_TEST_VECTORS 3069da7f033dSHerbert Xu } 3070da7f033dSHerbert Xu } 3071da7f033dSHerbert Xu } 3072da7f033dSHerbert Xu }, { 3073da7f033dSHerbert Xu .alg = "ecb(seed)", 30741aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3075da7f033dSHerbert Xu .suite = { 3076da7f033dSHerbert Xu .cipher = { 3077da7f033dSHerbert Xu .enc = { 3078da7f033dSHerbert Xu .vecs = seed_enc_tv_template, 3079da7f033dSHerbert Xu .count = SEED_ENC_TEST_VECTORS 3080da7f033dSHerbert Xu }, 3081da7f033dSHerbert Xu .dec = { 3082da7f033dSHerbert Xu .vecs = seed_dec_tv_template, 3083da7f033dSHerbert Xu .count = SEED_DEC_TEST_VECTORS 3084da7f033dSHerbert Xu } 3085da7f033dSHerbert Xu } 3086da7f033dSHerbert Xu } 3087da7f033dSHerbert Xu }, { 3088da7f033dSHerbert Xu .alg = "ecb(serpent)", 30891aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3090da7f033dSHerbert Xu .suite = { 3091da7f033dSHerbert Xu .cipher = { 3092da7f033dSHerbert Xu .enc = { 3093da7f033dSHerbert Xu .vecs = serpent_enc_tv_template, 3094da7f033dSHerbert Xu .count = SERPENT_ENC_TEST_VECTORS 3095da7f033dSHerbert Xu }, 3096da7f033dSHerbert Xu .dec = { 3097da7f033dSHerbert Xu .vecs = serpent_dec_tv_template, 3098da7f033dSHerbert Xu .count = SERPENT_DEC_TEST_VECTORS 3099da7f033dSHerbert Xu } 3100da7f033dSHerbert Xu } 3101da7f033dSHerbert Xu } 3102da7f033dSHerbert Xu }, { 3103da7f033dSHerbert Xu .alg = "ecb(tea)", 31041aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3105da7f033dSHerbert Xu .suite = { 3106da7f033dSHerbert Xu .cipher = { 3107da7f033dSHerbert Xu .enc = { 3108da7f033dSHerbert Xu .vecs = tea_enc_tv_template, 3109da7f033dSHerbert Xu .count = TEA_ENC_TEST_VECTORS 3110da7f033dSHerbert Xu }, 3111da7f033dSHerbert Xu .dec = { 3112da7f033dSHerbert Xu .vecs = tea_dec_tv_template, 3113da7f033dSHerbert Xu .count = TEA_DEC_TEST_VECTORS 3114da7f033dSHerbert Xu } 3115da7f033dSHerbert Xu } 3116da7f033dSHerbert Xu } 3117da7f033dSHerbert Xu }, { 3118da7f033dSHerbert Xu .alg = "ecb(tnepres)", 31191aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3120da7f033dSHerbert Xu .suite = { 3121da7f033dSHerbert Xu .cipher = { 3122da7f033dSHerbert Xu .enc = { 3123da7f033dSHerbert Xu .vecs = tnepres_enc_tv_template, 3124da7f033dSHerbert Xu .count = TNEPRES_ENC_TEST_VECTORS 3125da7f033dSHerbert Xu }, 3126da7f033dSHerbert Xu .dec = { 3127da7f033dSHerbert Xu .vecs = tnepres_dec_tv_template, 3128da7f033dSHerbert Xu .count = TNEPRES_DEC_TEST_VECTORS 3129da7f033dSHerbert Xu } 3130da7f033dSHerbert Xu } 3131da7f033dSHerbert Xu } 3132da7f033dSHerbert Xu }, { 3133da7f033dSHerbert Xu .alg = "ecb(twofish)", 31341aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3135da7f033dSHerbert Xu .suite = { 3136da7f033dSHerbert Xu .cipher = { 3137da7f033dSHerbert Xu .enc = { 3138da7f033dSHerbert Xu .vecs = tf_enc_tv_template, 3139da7f033dSHerbert Xu .count = TF_ENC_TEST_VECTORS 3140da7f033dSHerbert Xu }, 3141da7f033dSHerbert Xu .dec = { 3142da7f033dSHerbert Xu .vecs = tf_dec_tv_template, 3143da7f033dSHerbert Xu .count = TF_DEC_TEST_VECTORS 3144da7f033dSHerbert Xu } 3145da7f033dSHerbert Xu } 3146da7f033dSHerbert Xu } 3147da7f033dSHerbert Xu }, { 3148da7f033dSHerbert Xu .alg = "ecb(xeta)", 31491aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3150da7f033dSHerbert Xu .suite = { 3151da7f033dSHerbert Xu .cipher = { 3152da7f033dSHerbert Xu .enc = { 3153da7f033dSHerbert Xu .vecs = xeta_enc_tv_template, 3154da7f033dSHerbert Xu .count = XETA_ENC_TEST_VECTORS 3155da7f033dSHerbert Xu }, 3156da7f033dSHerbert Xu .dec = { 3157da7f033dSHerbert Xu .vecs = xeta_dec_tv_template, 3158da7f033dSHerbert Xu .count = XETA_DEC_TEST_VECTORS 3159da7f033dSHerbert Xu } 3160da7f033dSHerbert Xu } 3161da7f033dSHerbert Xu } 3162da7f033dSHerbert Xu }, { 3163da7f033dSHerbert Xu .alg = "ecb(xtea)", 31641aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3165da7f033dSHerbert Xu .suite = { 3166da7f033dSHerbert Xu .cipher = { 3167da7f033dSHerbert Xu .enc = { 3168da7f033dSHerbert Xu .vecs = xtea_enc_tv_template, 3169da7f033dSHerbert Xu .count = XTEA_ENC_TEST_VECTORS 3170da7f033dSHerbert Xu }, 3171da7f033dSHerbert Xu .dec = { 3172da7f033dSHerbert Xu .vecs = xtea_dec_tv_template, 3173da7f033dSHerbert Xu .count = XTEA_DEC_TEST_VECTORS 3174da7f033dSHerbert Xu } 3175da7f033dSHerbert Xu } 3176da7f033dSHerbert Xu } 3177da7f033dSHerbert Xu }, { 3178da7f033dSHerbert Xu .alg = "gcm(aes)", 3179da7f033dSHerbert Xu .test = alg_test_aead, 3180a1915d51SJarod Wilson .fips_allowed = 1, 3181da7f033dSHerbert Xu .suite = { 3182da7f033dSHerbert Xu .aead = { 3183da7f033dSHerbert Xu .enc = { 3184da7f033dSHerbert Xu .vecs = aes_gcm_enc_tv_template, 3185da7f033dSHerbert Xu .count = AES_GCM_ENC_TEST_VECTORS 3186da7f033dSHerbert Xu }, 3187da7f033dSHerbert Xu .dec = { 3188da7f033dSHerbert Xu .vecs = aes_gcm_dec_tv_template, 3189da7f033dSHerbert Xu .count = AES_GCM_DEC_TEST_VECTORS 3190da7f033dSHerbert Xu } 3191da7f033dSHerbert Xu } 3192da7f033dSHerbert Xu } 3193da7f033dSHerbert Xu }, { 3194507069c9SYouquan, Song .alg = "ghash", 3195507069c9SYouquan, Song .test = alg_test_hash, 319618c0ebd2SJarod Wilson .fips_allowed = 1, 3197507069c9SYouquan, Song .suite = { 3198507069c9SYouquan, Song .hash = { 3199507069c9SYouquan, Song .vecs = ghash_tv_template, 3200507069c9SYouquan, Song .count = GHASH_TEST_VECTORS 3201507069c9SYouquan, Song } 3202507069c9SYouquan, Song } 3203507069c9SYouquan, Song }, { 3204a482b081SSonic Zhang .alg = "hmac(crc32)", 3205a482b081SSonic Zhang .test = alg_test_hash, 3206a482b081SSonic Zhang .suite = { 3207a482b081SSonic Zhang .hash = { 3208a482b081SSonic Zhang .vecs = bfin_crc_tv_template, 3209a482b081SSonic Zhang .count = BFIN_CRC_TEST_VECTORS 3210a482b081SSonic Zhang } 3211a482b081SSonic Zhang } 3212a482b081SSonic Zhang }, { 3213da7f033dSHerbert Xu .alg = "hmac(md5)", 3214da7f033dSHerbert Xu .test = alg_test_hash, 3215da7f033dSHerbert Xu .suite = { 3216da7f033dSHerbert Xu .hash = { 3217da7f033dSHerbert Xu .vecs = hmac_md5_tv_template, 3218da7f033dSHerbert Xu .count = HMAC_MD5_TEST_VECTORS 3219da7f033dSHerbert Xu } 3220da7f033dSHerbert Xu } 3221da7f033dSHerbert Xu }, { 3222da7f033dSHerbert Xu .alg = "hmac(rmd128)", 3223da7f033dSHerbert Xu .test = alg_test_hash, 3224da7f033dSHerbert Xu .suite = { 3225da7f033dSHerbert Xu .hash = { 3226da7f033dSHerbert Xu .vecs = hmac_rmd128_tv_template, 3227da7f033dSHerbert Xu .count = HMAC_RMD128_TEST_VECTORS 3228da7f033dSHerbert Xu } 3229da7f033dSHerbert Xu } 3230da7f033dSHerbert Xu }, { 3231da7f033dSHerbert Xu .alg = "hmac(rmd160)", 3232da7f033dSHerbert Xu .test = alg_test_hash, 3233da7f033dSHerbert Xu .suite = { 3234da7f033dSHerbert Xu .hash = { 3235da7f033dSHerbert Xu .vecs = hmac_rmd160_tv_template, 3236da7f033dSHerbert Xu .count = HMAC_RMD160_TEST_VECTORS 3237da7f033dSHerbert Xu } 3238da7f033dSHerbert Xu } 3239da7f033dSHerbert Xu }, { 3240da7f033dSHerbert Xu .alg = "hmac(sha1)", 3241da7f033dSHerbert Xu .test = alg_test_hash, 3242a1915d51SJarod Wilson .fips_allowed = 1, 3243da7f033dSHerbert Xu .suite = { 3244da7f033dSHerbert Xu .hash = { 3245da7f033dSHerbert Xu .vecs = hmac_sha1_tv_template, 3246da7f033dSHerbert Xu .count = HMAC_SHA1_TEST_VECTORS 3247da7f033dSHerbert Xu } 3248da7f033dSHerbert Xu } 3249da7f033dSHerbert Xu }, { 3250da7f033dSHerbert Xu .alg = "hmac(sha224)", 3251da7f033dSHerbert Xu .test = alg_test_hash, 3252a1915d51SJarod Wilson .fips_allowed = 1, 3253da7f033dSHerbert Xu .suite = { 3254da7f033dSHerbert Xu .hash = { 3255da7f033dSHerbert Xu .vecs = hmac_sha224_tv_template, 3256da7f033dSHerbert Xu .count = HMAC_SHA224_TEST_VECTORS 3257da7f033dSHerbert Xu } 3258da7f033dSHerbert Xu } 3259da7f033dSHerbert Xu }, { 3260da7f033dSHerbert Xu .alg = "hmac(sha256)", 3261da7f033dSHerbert Xu .test = alg_test_hash, 3262a1915d51SJarod Wilson .fips_allowed = 1, 3263da7f033dSHerbert Xu .suite = { 3264da7f033dSHerbert Xu .hash = { 3265da7f033dSHerbert Xu .vecs = hmac_sha256_tv_template, 3266da7f033dSHerbert Xu .count = HMAC_SHA256_TEST_VECTORS 3267da7f033dSHerbert Xu } 3268da7f033dSHerbert Xu } 3269da7f033dSHerbert Xu }, { 3270da7f033dSHerbert Xu .alg = "hmac(sha384)", 3271da7f033dSHerbert Xu .test = alg_test_hash, 3272a1915d51SJarod Wilson .fips_allowed = 1, 3273da7f033dSHerbert Xu .suite = { 3274da7f033dSHerbert Xu .hash = { 3275da7f033dSHerbert Xu .vecs = hmac_sha384_tv_template, 3276da7f033dSHerbert Xu .count = HMAC_SHA384_TEST_VECTORS 3277da7f033dSHerbert Xu } 3278da7f033dSHerbert Xu } 3279da7f033dSHerbert Xu }, { 3280da7f033dSHerbert Xu .alg = "hmac(sha512)", 3281da7f033dSHerbert Xu .test = alg_test_hash, 3282a1915d51SJarod Wilson .fips_allowed = 1, 3283da7f033dSHerbert Xu .suite = { 3284da7f033dSHerbert Xu .hash = { 3285da7f033dSHerbert Xu .vecs = hmac_sha512_tv_template, 3286da7f033dSHerbert Xu .count = HMAC_SHA512_TEST_VECTORS 3287da7f033dSHerbert Xu } 3288da7f033dSHerbert Xu } 3289da7f033dSHerbert Xu }, { 3290bb5530e4SStephan Mueller .alg = "jitterentropy_rng", 3291bb5530e4SStephan Mueller .fips_allowed = 1, 3292bb5530e4SStephan Mueller .test = alg_test_null, 3293bb5530e4SStephan Mueller }, { 3294da7f033dSHerbert Xu .alg = "lrw(aes)", 32951aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3296da7f033dSHerbert Xu .suite = { 3297da7f033dSHerbert Xu .cipher = { 3298da7f033dSHerbert Xu .enc = { 3299da7f033dSHerbert Xu .vecs = aes_lrw_enc_tv_template, 3300da7f033dSHerbert Xu .count = AES_LRW_ENC_TEST_VECTORS 3301da7f033dSHerbert Xu }, 3302da7f033dSHerbert Xu .dec = { 3303da7f033dSHerbert Xu .vecs = aes_lrw_dec_tv_template, 3304da7f033dSHerbert Xu .count = AES_LRW_DEC_TEST_VECTORS 3305da7f033dSHerbert Xu } 3306da7f033dSHerbert Xu } 3307da7f033dSHerbert Xu } 3308da7f033dSHerbert Xu }, { 33090840605eSJussi Kivilinna .alg = "lrw(camellia)", 33100840605eSJussi Kivilinna .test = alg_test_skcipher, 33110840605eSJussi Kivilinna .suite = { 33120840605eSJussi Kivilinna .cipher = { 33130840605eSJussi Kivilinna .enc = { 33140840605eSJussi Kivilinna .vecs = camellia_lrw_enc_tv_template, 33150840605eSJussi Kivilinna .count = CAMELLIA_LRW_ENC_TEST_VECTORS 33160840605eSJussi Kivilinna }, 33170840605eSJussi Kivilinna .dec = { 33180840605eSJussi Kivilinna .vecs = camellia_lrw_dec_tv_template, 33190840605eSJussi Kivilinna .count = CAMELLIA_LRW_DEC_TEST_VECTORS 33200840605eSJussi Kivilinna } 33210840605eSJussi Kivilinna } 33220840605eSJussi Kivilinna } 33230840605eSJussi Kivilinna }, { 33249b8b0405SJohannes Goetzfried .alg = "lrw(cast6)", 33259b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 33269b8b0405SJohannes Goetzfried .suite = { 33279b8b0405SJohannes Goetzfried .cipher = { 33289b8b0405SJohannes Goetzfried .enc = { 33299b8b0405SJohannes Goetzfried .vecs = cast6_lrw_enc_tv_template, 33309b8b0405SJohannes Goetzfried .count = CAST6_LRW_ENC_TEST_VECTORS 33319b8b0405SJohannes Goetzfried }, 33329b8b0405SJohannes Goetzfried .dec = { 33339b8b0405SJohannes Goetzfried .vecs = cast6_lrw_dec_tv_template, 33349b8b0405SJohannes Goetzfried .count = CAST6_LRW_DEC_TEST_VECTORS 33359b8b0405SJohannes Goetzfried } 33369b8b0405SJohannes Goetzfried } 33379b8b0405SJohannes Goetzfried } 33389b8b0405SJohannes Goetzfried }, { 3339d7bfc0faSJussi Kivilinna .alg = "lrw(serpent)", 3340d7bfc0faSJussi Kivilinna .test = alg_test_skcipher, 3341d7bfc0faSJussi Kivilinna .suite = { 3342d7bfc0faSJussi Kivilinna .cipher = { 3343d7bfc0faSJussi Kivilinna .enc = { 3344d7bfc0faSJussi Kivilinna .vecs = serpent_lrw_enc_tv_template, 3345d7bfc0faSJussi Kivilinna .count = SERPENT_LRW_ENC_TEST_VECTORS 3346d7bfc0faSJussi Kivilinna }, 3347d7bfc0faSJussi Kivilinna .dec = { 3348d7bfc0faSJussi Kivilinna .vecs = serpent_lrw_dec_tv_template, 3349d7bfc0faSJussi Kivilinna .count = SERPENT_LRW_DEC_TEST_VECTORS 3350d7bfc0faSJussi Kivilinna } 3351d7bfc0faSJussi Kivilinna } 3352d7bfc0faSJussi Kivilinna } 3353d7bfc0faSJussi Kivilinna }, { 33540b2a1551SJussi Kivilinna .alg = "lrw(twofish)", 33550b2a1551SJussi Kivilinna .test = alg_test_skcipher, 33560b2a1551SJussi Kivilinna .suite = { 33570b2a1551SJussi Kivilinna .cipher = { 33580b2a1551SJussi Kivilinna .enc = { 33590b2a1551SJussi Kivilinna .vecs = tf_lrw_enc_tv_template, 33600b2a1551SJussi Kivilinna .count = TF_LRW_ENC_TEST_VECTORS 33610b2a1551SJussi Kivilinna }, 33620b2a1551SJussi Kivilinna .dec = { 33630b2a1551SJussi Kivilinna .vecs = tf_lrw_dec_tv_template, 33640b2a1551SJussi Kivilinna .count = TF_LRW_DEC_TEST_VECTORS 33650b2a1551SJussi Kivilinna } 33660b2a1551SJussi Kivilinna } 33670b2a1551SJussi Kivilinna } 33680b2a1551SJussi Kivilinna }, { 33691443cc9bSKOVACS Krisztian .alg = "lz4", 33701443cc9bSKOVACS Krisztian .test = alg_test_comp, 33711443cc9bSKOVACS Krisztian .fips_allowed = 1, 33721443cc9bSKOVACS Krisztian .suite = { 33731443cc9bSKOVACS Krisztian .comp = { 33741443cc9bSKOVACS Krisztian .comp = { 33751443cc9bSKOVACS Krisztian .vecs = lz4_comp_tv_template, 33761443cc9bSKOVACS Krisztian .count = LZ4_COMP_TEST_VECTORS 33771443cc9bSKOVACS Krisztian }, 33781443cc9bSKOVACS Krisztian .decomp = { 33791443cc9bSKOVACS Krisztian .vecs = lz4_decomp_tv_template, 33801443cc9bSKOVACS Krisztian .count = LZ4_DECOMP_TEST_VECTORS 33811443cc9bSKOVACS Krisztian } 33821443cc9bSKOVACS Krisztian } 33831443cc9bSKOVACS Krisztian } 33841443cc9bSKOVACS Krisztian }, { 33851443cc9bSKOVACS Krisztian .alg = "lz4hc", 33861443cc9bSKOVACS Krisztian .test = alg_test_comp, 33871443cc9bSKOVACS Krisztian .fips_allowed = 1, 33881443cc9bSKOVACS Krisztian .suite = { 33891443cc9bSKOVACS Krisztian .comp = { 33901443cc9bSKOVACS Krisztian .comp = { 33911443cc9bSKOVACS Krisztian .vecs = lz4hc_comp_tv_template, 33921443cc9bSKOVACS Krisztian .count = LZ4HC_COMP_TEST_VECTORS 33931443cc9bSKOVACS Krisztian }, 33941443cc9bSKOVACS Krisztian .decomp = { 33951443cc9bSKOVACS Krisztian .vecs = lz4hc_decomp_tv_template, 33961443cc9bSKOVACS Krisztian .count = LZ4HC_DECOMP_TEST_VECTORS 33971443cc9bSKOVACS Krisztian } 33981443cc9bSKOVACS Krisztian } 33991443cc9bSKOVACS Krisztian } 34001443cc9bSKOVACS Krisztian }, { 3401da7f033dSHerbert Xu .alg = "lzo", 3402da7f033dSHerbert Xu .test = alg_test_comp, 34030818904dSMilan Broz .fips_allowed = 1, 3404da7f033dSHerbert Xu .suite = { 3405da7f033dSHerbert Xu .comp = { 3406da7f033dSHerbert Xu .comp = { 3407da7f033dSHerbert Xu .vecs = lzo_comp_tv_template, 3408da7f033dSHerbert Xu .count = LZO_COMP_TEST_VECTORS 3409da7f033dSHerbert Xu }, 3410da7f033dSHerbert Xu .decomp = { 3411da7f033dSHerbert Xu .vecs = lzo_decomp_tv_template, 3412da7f033dSHerbert Xu .count = LZO_DECOMP_TEST_VECTORS 3413da7f033dSHerbert Xu } 3414da7f033dSHerbert Xu } 3415da7f033dSHerbert Xu } 3416da7f033dSHerbert Xu }, { 3417da7f033dSHerbert Xu .alg = "md4", 3418da7f033dSHerbert Xu .test = alg_test_hash, 3419da7f033dSHerbert Xu .suite = { 3420da7f033dSHerbert Xu .hash = { 3421da7f033dSHerbert Xu .vecs = md4_tv_template, 3422da7f033dSHerbert Xu .count = MD4_TEST_VECTORS 3423da7f033dSHerbert Xu } 3424da7f033dSHerbert Xu } 3425da7f033dSHerbert Xu }, { 3426da7f033dSHerbert Xu .alg = "md5", 3427da7f033dSHerbert Xu .test = alg_test_hash, 3428da7f033dSHerbert Xu .suite = { 3429da7f033dSHerbert Xu .hash = { 3430da7f033dSHerbert Xu .vecs = md5_tv_template, 3431da7f033dSHerbert Xu .count = MD5_TEST_VECTORS 3432da7f033dSHerbert Xu } 3433da7f033dSHerbert Xu } 3434da7f033dSHerbert Xu }, { 3435da7f033dSHerbert Xu .alg = "michael_mic", 3436da7f033dSHerbert Xu .test = alg_test_hash, 3437da7f033dSHerbert Xu .suite = { 3438da7f033dSHerbert Xu .hash = { 3439da7f033dSHerbert Xu .vecs = michael_mic_tv_template, 3440da7f033dSHerbert Xu .count = MICHAEL_MIC_TEST_VECTORS 3441da7f033dSHerbert Xu } 3442da7f033dSHerbert Xu } 3443da7f033dSHerbert Xu }, { 3444ba0e14acSPuneet Saxena .alg = "ofb(aes)", 3445ba0e14acSPuneet Saxena .test = alg_test_skcipher, 3446ba0e14acSPuneet Saxena .fips_allowed = 1, 3447ba0e14acSPuneet Saxena .suite = { 3448ba0e14acSPuneet Saxena .cipher = { 3449ba0e14acSPuneet Saxena .enc = { 3450ba0e14acSPuneet Saxena .vecs = aes_ofb_enc_tv_template, 3451ba0e14acSPuneet Saxena .count = AES_OFB_ENC_TEST_VECTORS 3452ba0e14acSPuneet Saxena }, 3453ba0e14acSPuneet Saxena .dec = { 3454ba0e14acSPuneet Saxena .vecs = aes_ofb_dec_tv_template, 3455ba0e14acSPuneet Saxena .count = AES_OFB_DEC_TEST_VECTORS 3456ba0e14acSPuneet Saxena } 3457ba0e14acSPuneet Saxena } 3458ba0e14acSPuneet Saxena } 3459ba0e14acSPuneet Saxena }, { 3460da7f033dSHerbert Xu .alg = "pcbc(fcrypt)", 34611aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3462da7f033dSHerbert Xu .suite = { 3463da7f033dSHerbert Xu .cipher = { 3464da7f033dSHerbert Xu .enc = { 3465da7f033dSHerbert Xu .vecs = fcrypt_pcbc_enc_tv_template, 3466da7f033dSHerbert Xu .count = FCRYPT_ENC_TEST_VECTORS 3467da7f033dSHerbert Xu }, 3468da7f033dSHerbert Xu .dec = { 3469da7f033dSHerbert Xu .vecs = fcrypt_pcbc_dec_tv_template, 3470da7f033dSHerbert Xu .count = FCRYPT_DEC_TEST_VECTORS 3471da7f033dSHerbert Xu } 3472da7f033dSHerbert Xu } 3473da7f033dSHerbert Xu } 3474da7f033dSHerbert Xu }, { 3475eee9dc61SMartin Willi .alg = "poly1305", 3476eee9dc61SMartin Willi .test = alg_test_hash, 3477eee9dc61SMartin Willi .suite = { 3478eee9dc61SMartin Willi .hash = { 3479eee9dc61SMartin Willi .vecs = poly1305_tv_template, 3480eee9dc61SMartin Willi .count = POLY1305_TEST_VECTORS 3481eee9dc61SMartin Willi } 3482eee9dc61SMartin Willi } 3483eee9dc61SMartin Willi }, { 3484da7f033dSHerbert Xu .alg = "rfc3686(ctr(aes))", 34851aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3486a1915d51SJarod Wilson .fips_allowed = 1, 3487da7f033dSHerbert Xu .suite = { 3488da7f033dSHerbert Xu .cipher = { 3489da7f033dSHerbert Xu .enc = { 3490f7cb80f2SJarod Wilson .vecs = aes_ctr_rfc3686_enc_tv_template, 3491f7cb80f2SJarod Wilson .count = AES_CTR_3686_ENC_TEST_VECTORS 3492da7f033dSHerbert Xu }, 3493da7f033dSHerbert Xu .dec = { 3494f7cb80f2SJarod Wilson .vecs = aes_ctr_rfc3686_dec_tv_template, 3495f7cb80f2SJarod Wilson .count = AES_CTR_3686_DEC_TEST_VECTORS 3496da7f033dSHerbert Xu } 3497da7f033dSHerbert Xu } 3498da7f033dSHerbert Xu } 3499da7f033dSHerbert Xu }, { 35003f31a740SHerbert Xu .alg = "rfc4106(gcm(aes))", 350169435b94SAdrian Hoban .test = alg_test_aead, 3502db71f29aSJarod Wilson .fips_allowed = 1, 350369435b94SAdrian Hoban .suite = { 350469435b94SAdrian Hoban .aead = { 350569435b94SAdrian Hoban .enc = { 350669435b94SAdrian Hoban .vecs = aes_gcm_rfc4106_enc_tv_template, 350769435b94SAdrian Hoban .count = AES_GCM_4106_ENC_TEST_VECTORS 350869435b94SAdrian Hoban }, 350969435b94SAdrian Hoban .dec = { 351069435b94SAdrian Hoban .vecs = aes_gcm_rfc4106_dec_tv_template, 351169435b94SAdrian Hoban .count = AES_GCM_4106_DEC_TEST_VECTORS 351269435b94SAdrian Hoban } 351369435b94SAdrian Hoban } 351469435b94SAdrian Hoban } 351569435b94SAdrian Hoban }, { 3516544c436aSHerbert Xu .alg = "rfc4309(ccm(aes))", 35175d667322SJarod Wilson .test = alg_test_aead, 3518a1915d51SJarod Wilson .fips_allowed = 1, 35195d667322SJarod Wilson .suite = { 35205d667322SJarod Wilson .aead = { 35215d667322SJarod Wilson .enc = { 35225d667322SJarod Wilson .vecs = aes_ccm_rfc4309_enc_tv_template, 35235d667322SJarod Wilson .count = AES_CCM_4309_ENC_TEST_VECTORS 35245d667322SJarod Wilson }, 35255d667322SJarod Wilson .dec = { 35265d667322SJarod Wilson .vecs = aes_ccm_rfc4309_dec_tv_template, 35275d667322SJarod Wilson .count = AES_CCM_4309_DEC_TEST_VECTORS 35285d667322SJarod Wilson } 35295d667322SJarod Wilson } 35305d667322SJarod Wilson } 35315d667322SJarod Wilson }, { 3532bb68745eSHerbert Xu .alg = "rfc4543(gcm(aes))", 3533e9b7441aSJussi Kivilinna .test = alg_test_aead, 3534e9b7441aSJussi Kivilinna .suite = { 3535e9b7441aSJussi Kivilinna .aead = { 3536e9b7441aSJussi Kivilinna .enc = { 3537e9b7441aSJussi Kivilinna .vecs = aes_gcm_rfc4543_enc_tv_template, 3538e9b7441aSJussi Kivilinna .count = AES_GCM_4543_ENC_TEST_VECTORS 3539e9b7441aSJussi Kivilinna }, 3540e9b7441aSJussi Kivilinna .dec = { 3541e9b7441aSJussi Kivilinna .vecs = aes_gcm_rfc4543_dec_tv_template, 3542e9b7441aSJussi Kivilinna .count = AES_GCM_4543_DEC_TEST_VECTORS 3543e9b7441aSJussi Kivilinna }, 3544e9b7441aSJussi Kivilinna } 3545e9b7441aSJussi Kivilinna } 3546e9b7441aSJussi Kivilinna }, { 3547af2b76b5SMartin Willi .alg = "rfc7539(chacha20,poly1305)", 3548af2b76b5SMartin Willi .test = alg_test_aead, 3549af2b76b5SMartin Willi .suite = { 3550af2b76b5SMartin Willi .aead = { 3551af2b76b5SMartin Willi .enc = { 3552af2b76b5SMartin Willi .vecs = rfc7539_enc_tv_template, 3553af2b76b5SMartin Willi .count = RFC7539_ENC_TEST_VECTORS 3554af2b76b5SMartin Willi }, 3555af2b76b5SMartin Willi .dec = { 3556af2b76b5SMartin Willi .vecs = rfc7539_dec_tv_template, 3557af2b76b5SMartin Willi .count = RFC7539_DEC_TEST_VECTORS 3558af2b76b5SMartin Willi }, 3559af2b76b5SMartin Willi } 3560af2b76b5SMartin Willi } 3561af2b76b5SMartin Willi }, { 35625900758dSMartin Willi .alg = "rfc7539esp(chacha20,poly1305)", 35635900758dSMartin Willi .test = alg_test_aead, 35645900758dSMartin Willi .suite = { 35655900758dSMartin Willi .aead = { 35665900758dSMartin Willi .enc = { 35675900758dSMartin Willi .vecs = rfc7539esp_enc_tv_template, 35685900758dSMartin Willi .count = RFC7539ESP_ENC_TEST_VECTORS 35695900758dSMartin Willi }, 35705900758dSMartin Willi .dec = { 35715900758dSMartin Willi .vecs = rfc7539esp_dec_tv_template, 35725900758dSMartin Willi .count = RFC7539ESP_DEC_TEST_VECTORS 35735900758dSMartin Willi }, 35745900758dSMartin Willi } 35755900758dSMartin Willi } 35765900758dSMartin Willi }, { 3577da7f033dSHerbert Xu .alg = "rmd128", 3578da7f033dSHerbert Xu .test = alg_test_hash, 3579da7f033dSHerbert Xu .suite = { 3580da7f033dSHerbert Xu .hash = { 3581da7f033dSHerbert Xu .vecs = rmd128_tv_template, 3582da7f033dSHerbert Xu .count = RMD128_TEST_VECTORS 3583da7f033dSHerbert Xu } 3584da7f033dSHerbert Xu } 3585da7f033dSHerbert Xu }, { 3586da7f033dSHerbert Xu .alg = "rmd160", 3587da7f033dSHerbert Xu .test = alg_test_hash, 3588da7f033dSHerbert Xu .suite = { 3589da7f033dSHerbert Xu .hash = { 3590da7f033dSHerbert Xu .vecs = rmd160_tv_template, 3591da7f033dSHerbert Xu .count = RMD160_TEST_VECTORS 3592da7f033dSHerbert Xu } 3593da7f033dSHerbert Xu } 3594da7f033dSHerbert Xu }, { 3595da7f033dSHerbert Xu .alg = "rmd256", 3596da7f033dSHerbert Xu .test = alg_test_hash, 3597da7f033dSHerbert Xu .suite = { 3598da7f033dSHerbert Xu .hash = { 3599da7f033dSHerbert Xu .vecs = rmd256_tv_template, 3600da7f033dSHerbert Xu .count = RMD256_TEST_VECTORS 3601da7f033dSHerbert Xu } 3602da7f033dSHerbert Xu } 3603da7f033dSHerbert Xu }, { 3604da7f033dSHerbert Xu .alg = "rmd320", 3605da7f033dSHerbert Xu .test = alg_test_hash, 3606da7f033dSHerbert Xu .suite = { 3607da7f033dSHerbert Xu .hash = { 3608da7f033dSHerbert Xu .vecs = rmd320_tv_template, 3609da7f033dSHerbert Xu .count = RMD320_TEST_VECTORS 3610da7f033dSHerbert Xu } 3611da7f033dSHerbert Xu } 3612da7f033dSHerbert Xu }, { 3613946cc463STadeusz Struk .alg = "rsa", 3614946cc463STadeusz Struk .test = alg_test_akcipher, 3615946cc463STadeusz Struk .fips_allowed = 1, 3616946cc463STadeusz Struk .suite = { 3617946cc463STadeusz Struk .akcipher = { 3618946cc463STadeusz Struk .vecs = rsa_tv_template, 3619946cc463STadeusz Struk .count = RSA_TEST_VECTORS 3620946cc463STadeusz Struk } 3621946cc463STadeusz Struk } 3622946cc463STadeusz Struk }, { 3623da7f033dSHerbert Xu .alg = "salsa20", 36241aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3625da7f033dSHerbert Xu .suite = { 3626da7f033dSHerbert Xu .cipher = { 3627da7f033dSHerbert Xu .enc = { 3628da7f033dSHerbert Xu .vecs = salsa20_stream_enc_tv_template, 3629da7f033dSHerbert Xu .count = SALSA20_STREAM_ENC_TEST_VECTORS 3630da7f033dSHerbert Xu } 3631da7f033dSHerbert Xu } 3632da7f033dSHerbert Xu } 3633da7f033dSHerbert Xu }, { 3634da7f033dSHerbert Xu .alg = "sha1", 3635da7f033dSHerbert Xu .test = alg_test_hash, 3636a1915d51SJarod Wilson .fips_allowed = 1, 3637da7f033dSHerbert Xu .suite = { 3638da7f033dSHerbert Xu .hash = { 3639da7f033dSHerbert Xu .vecs = sha1_tv_template, 3640da7f033dSHerbert Xu .count = SHA1_TEST_VECTORS 3641da7f033dSHerbert Xu } 3642da7f033dSHerbert Xu } 3643da7f033dSHerbert Xu }, { 3644da7f033dSHerbert Xu .alg = "sha224", 3645da7f033dSHerbert Xu .test = alg_test_hash, 3646a1915d51SJarod Wilson .fips_allowed = 1, 3647da7f033dSHerbert Xu .suite = { 3648da7f033dSHerbert Xu .hash = { 3649da7f033dSHerbert Xu .vecs = sha224_tv_template, 3650da7f033dSHerbert Xu .count = SHA224_TEST_VECTORS 3651da7f033dSHerbert Xu } 3652da7f033dSHerbert Xu } 3653da7f033dSHerbert Xu }, { 3654da7f033dSHerbert Xu .alg = "sha256", 3655da7f033dSHerbert Xu .test = alg_test_hash, 3656a1915d51SJarod Wilson .fips_allowed = 1, 3657da7f033dSHerbert Xu .suite = { 3658da7f033dSHerbert Xu .hash = { 3659da7f033dSHerbert Xu .vecs = sha256_tv_template, 3660da7f033dSHerbert Xu .count = SHA256_TEST_VECTORS 3661da7f033dSHerbert Xu } 3662da7f033dSHerbert Xu } 3663da7f033dSHerbert Xu }, { 3664da7f033dSHerbert Xu .alg = "sha384", 3665da7f033dSHerbert Xu .test = alg_test_hash, 3666a1915d51SJarod Wilson .fips_allowed = 1, 3667da7f033dSHerbert Xu .suite = { 3668da7f033dSHerbert Xu .hash = { 3669da7f033dSHerbert Xu .vecs = sha384_tv_template, 3670da7f033dSHerbert Xu .count = SHA384_TEST_VECTORS 3671da7f033dSHerbert Xu } 3672da7f033dSHerbert Xu } 3673da7f033dSHerbert Xu }, { 3674da7f033dSHerbert Xu .alg = "sha512", 3675da7f033dSHerbert Xu .test = alg_test_hash, 3676a1915d51SJarod Wilson .fips_allowed = 1, 3677da7f033dSHerbert Xu .suite = { 3678da7f033dSHerbert Xu .hash = { 3679da7f033dSHerbert Xu .vecs = sha512_tv_template, 3680da7f033dSHerbert Xu .count = SHA512_TEST_VECTORS 3681da7f033dSHerbert Xu } 3682da7f033dSHerbert Xu } 3683da7f033dSHerbert Xu }, { 3684da7f033dSHerbert Xu .alg = "tgr128", 3685da7f033dSHerbert Xu .test = alg_test_hash, 3686da7f033dSHerbert Xu .suite = { 3687da7f033dSHerbert Xu .hash = { 3688da7f033dSHerbert Xu .vecs = tgr128_tv_template, 3689da7f033dSHerbert Xu .count = TGR128_TEST_VECTORS 3690da7f033dSHerbert Xu } 3691da7f033dSHerbert Xu } 3692da7f033dSHerbert Xu }, { 3693da7f033dSHerbert Xu .alg = "tgr160", 3694da7f033dSHerbert Xu .test = alg_test_hash, 3695da7f033dSHerbert Xu .suite = { 3696da7f033dSHerbert Xu .hash = { 3697da7f033dSHerbert Xu .vecs = tgr160_tv_template, 3698da7f033dSHerbert Xu .count = TGR160_TEST_VECTORS 3699da7f033dSHerbert Xu } 3700da7f033dSHerbert Xu } 3701da7f033dSHerbert Xu }, { 3702da7f033dSHerbert Xu .alg = "tgr192", 3703da7f033dSHerbert Xu .test = alg_test_hash, 3704da7f033dSHerbert Xu .suite = { 3705da7f033dSHerbert Xu .hash = { 3706da7f033dSHerbert Xu .vecs = tgr192_tv_template, 3707da7f033dSHerbert Xu .count = TGR192_TEST_VECTORS 3708da7f033dSHerbert Xu } 3709da7f033dSHerbert Xu } 3710da7f033dSHerbert Xu }, { 3711f1939f7cSShane Wang .alg = "vmac(aes)", 3712f1939f7cSShane Wang .test = alg_test_hash, 3713f1939f7cSShane Wang .suite = { 3714f1939f7cSShane Wang .hash = { 3715f1939f7cSShane Wang .vecs = aes_vmac128_tv_template, 3716f1939f7cSShane Wang .count = VMAC_AES_TEST_VECTORS 3717f1939f7cSShane Wang } 3718f1939f7cSShane Wang } 3719f1939f7cSShane Wang }, { 3720da7f033dSHerbert Xu .alg = "wp256", 3721da7f033dSHerbert Xu .test = alg_test_hash, 3722da7f033dSHerbert Xu .suite = { 3723da7f033dSHerbert Xu .hash = { 3724da7f033dSHerbert Xu .vecs = wp256_tv_template, 3725da7f033dSHerbert Xu .count = WP256_TEST_VECTORS 3726da7f033dSHerbert Xu } 3727da7f033dSHerbert Xu } 3728da7f033dSHerbert Xu }, { 3729da7f033dSHerbert Xu .alg = "wp384", 3730da7f033dSHerbert Xu .test = alg_test_hash, 3731da7f033dSHerbert Xu .suite = { 3732da7f033dSHerbert Xu .hash = { 3733da7f033dSHerbert Xu .vecs = wp384_tv_template, 3734da7f033dSHerbert Xu .count = WP384_TEST_VECTORS 3735da7f033dSHerbert Xu } 3736da7f033dSHerbert Xu } 3737da7f033dSHerbert Xu }, { 3738da7f033dSHerbert Xu .alg = "wp512", 3739da7f033dSHerbert Xu .test = alg_test_hash, 3740da7f033dSHerbert Xu .suite = { 3741da7f033dSHerbert Xu .hash = { 3742da7f033dSHerbert Xu .vecs = wp512_tv_template, 3743da7f033dSHerbert Xu .count = WP512_TEST_VECTORS 3744da7f033dSHerbert Xu } 3745da7f033dSHerbert Xu } 3746da7f033dSHerbert Xu }, { 3747da7f033dSHerbert Xu .alg = "xcbc(aes)", 3748da7f033dSHerbert Xu .test = alg_test_hash, 3749da7f033dSHerbert Xu .suite = { 3750da7f033dSHerbert Xu .hash = { 3751da7f033dSHerbert Xu .vecs = aes_xcbc128_tv_template, 3752da7f033dSHerbert Xu .count = XCBC_AES_TEST_VECTORS 3753da7f033dSHerbert Xu } 3754da7f033dSHerbert Xu } 3755da7f033dSHerbert Xu }, { 3756da7f033dSHerbert Xu .alg = "xts(aes)", 37571aa4ecd9SHerbert Xu .test = alg_test_skcipher, 37582918aa8dSJarod Wilson .fips_allowed = 1, 3759da7f033dSHerbert Xu .suite = { 3760da7f033dSHerbert Xu .cipher = { 3761da7f033dSHerbert Xu .enc = { 3762da7f033dSHerbert Xu .vecs = aes_xts_enc_tv_template, 3763da7f033dSHerbert Xu .count = AES_XTS_ENC_TEST_VECTORS 3764da7f033dSHerbert Xu }, 3765da7f033dSHerbert Xu .dec = { 3766da7f033dSHerbert Xu .vecs = aes_xts_dec_tv_template, 3767da7f033dSHerbert Xu .count = AES_XTS_DEC_TEST_VECTORS 3768da7f033dSHerbert Xu } 3769da7f033dSHerbert Xu } 3770da7f033dSHerbert Xu } 37710c01aed5SGeert Uytterhoeven }, { 37720840605eSJussi Kivilinna .alg = "xts(camellia)", 37730840605eSJussi Kivilinna .test = alg_test_skcipher, 37740840605eSJussi Kivilinna .suite = { 37750840605eSJussi Kivilinna .cipher = { 37760840605eSJussi Kivilinna .enc = { 37770840605eSJussi Kivilinna .vecs = camellia_xts_enc_tv_template, 37780840605eSJussi Kivilinna .count = CAMELLIA_XTS_ENC_TEST_VECTORS 37790840605eSJussi Kivilinna }, 37800840605eSJussi Kivilinna .dec = { 37810840605eSJussi Kivilinna .vecs = camellia_xts_dec_tv_template, 37820840605eSJussi Kivilinna .count = CAMELLIA_XTS_DEC_TEST_VECTORS 37830840605eSJussi Kivilinna } 37840840605eSJussi Kivilinna } 37850840605eSJussi Kivilinna } 37860840605eSJussi Kivilinna }, { 37879b8b0405SJohannes Goetzfried .alg = "xts(cast6)", 37889b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 37899b8b0405SJohannes Goetzfried .suite = { 37909b8b0405SJohannes Goetzfried .cipher = { 37919b8b0405SJohannes Goetzfried .enc = { 37929b8b0405SJohannes Goetzfried .vecs = cast6_xts_enc_tv_template, 37939b8b0405SJohannes Goetzfried .count = CAST6_XTS_ENC_TEST_VECTORS 37949b8b0405SJohannes Goetzfried }, 37959b8b0405SJohannes Goetzfried .dec = { 37969b8b0405SJohannes Goetzfried .vecs = cast6_xts_dec_tv_template, 37979b8b0405SJohannes Goetzfried .count = CAST6_XTS_DEC_TEST_VECTORS 37989b8b0405SJohannes Goetzfried } 37999b8b0405SJohannes Goetzfried } 38009b8b0405SJohannes Goetzfried } 38019b8b0405SJohannes Goetzfried }, { 380218be20b9SJussi Kivilinna .alg = "xts(serpent)", 380318be20b9SJussi Kivilinna .test = alg_test_skcipher, 380418be20b9SJussi Kivilinna .suite = { 380518be20b9SJussi Kivilinna .cipher = { 380618be20b9SJussi Kivilinna .enc = { 380718be20b9SJussi Kivilinna .vecs = serpent_xts_enc_tv_template, 380818be20b9SJussi Kivilinna .count = SERPENT_XTS_ENC_TEST_VECTORS 380918be20b9SJussi Kivilinna }, 381018be20b9SJussi Kivilinna .dec = { 381118be20b9SJussi Kivilinna .vecs = serpent_xts_dec_tv_template, 381218be20b9SJussi Kivilinna .count = SERPENT_XTS_DEC_TEST_VECTORS 381318be20b9SJussi Kivilinna } 381418be20b9SJussi Kivilinna } 381518be20b9SJussi Kivilinna } 381618be20b9SJussi Kivilinna }, { 3817aed265b9SJussi Kivilinna .alg = "xts(twofish)", 3818aed265b9SJussi Kivilinna .test = alg_test_skcipher, 3819aed265b9SJussi Kivilinna .suite = { 3820aed265b9SJussi Kivilinna .cipher = { 3821aed265b9SJussi Kivilinna .enc = { 3822aed265b9SJussi Kivilinna .vecs = tf_xts_enc_tv_template, 3823aed265b9SJussi Kivilinna .count = TF_XTS_ENC_TEST_VECTORS 3824aed265b9SJussi Kivilinna }, 3825aed265b9SJussi Kivilinna .dec = { 3826aed265b9SJussi Kivilinna .vecs = tf_xts_dec_tv_template, 3827aed265b9SJussi Kivilinna .count = TF_XTS_DEC_TEST_VECTORS 3828aed265b9SJussi Kivilinna } 3829aed265b9SJussi Kivilinna } 3830aed265b9SJussi Kivilinna } 3831aed265b9SJussi Kivilinna }, { 38320c01aed5SGeert Uytterhoeven .alg = "zlib", 38330c01aed5SGeert Uytterhoeven .test = alg_test_pcomp, 38340818904dSMilan Broz .fips_allowed = 1, 38350c01aed5SGeert Uytterhoeven .suite = { 38360c01aed5SGeert Uytterhoeven .pcomp = { 38370c01aed5SGeert Uytterhoeven .comp = { 38380c01aed5SGeert Uytterhoeven .vecs = zlib_comp_tv_template, 38390c01aed5SGeert Uytterhoeven .count = ZLIB_COMP_TEST_VECTORS 38400c01aed5SGeert Uytterhoeven }, 38410c01aed5SGeert Uytterhoeven .decomp = { 38420c01aed5SGeert Uytterhoeven .vecs = zlib_decomp_tv_template, 38430c01aed5SGeert Uytterhoeven .count = ZLIB_DECOMP_TEST_VECTORS 38440c01aed5SGeert Uytterhoeven } 38450c01aed5SGeert Uytterhoeven } 38460c01aed5SGeert Uytterhoeven } 3847da7f033dSHerbert Xu } 3848da7f033dSHerbert Xu }; 3849da7f033dSHerbert Xu 38505714758bSJussi Kivilinna static bool alg_test_descs_checked; 38515714758bSJussi Kivilinna 38525714758bSJussi Kivilinna static void alg_test_descs_check_order(void) 38535714758bSJussi Kivilinna { 38545714758bSJussi Kivilinna int i; 38555714758bSJussi Kivilinna 38565714758bSJussi Kivilinna /* only check once */ 38575714758bSJussi Kivilinna if (alg_test_descs_checked) 38585714758bSJussi Kivilinna return; 38595714758bSJussi Kivilinna 38605714758bSJussi Kivilinna alg_test_descs_checked = true; 38615714758bSJussi Kivilinna 38625714758bSJussi Kivilinna for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) { 38635714758bSJussi Kivilinna int diff = strcmp(alg_test_descs[i - 1].alg, 38645714758bSJussi Kivilinna alg_test_descs[i].alg); 38655714758bSJussi Kivilinna 38665714758bSJussi Kivilinna if (WARN_ON(diff > 0)) { 38675714758bSJussi Kivilinna pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n", 38685714758bSJussi Kivilinna alg_test_descs[i - 1].alg, 38695714758bSJussi Kivilinna alg_test_descs[i].alg); 38705714758bSJussi Kivilinna } 38715714758bSJussi Kivilinna 38725714758bSJussi Kivilinna if (WARN_ON(diff == 0)) { 38735714758bSJussi Kivilinna pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n", 38745714758bSJussi Kivilinna alg_test_descs[i].alg); 38755714758bSJussi Kivilinna } 38765714758bSJussi Kivilinna } 38775714758bSJussi Kivilinna } 38785714758bSJussi Kivilinna 38791aa4ecd9SHerbert Xu static int alg_find_test(const char *alg) 3880da7f033dSHerbert Xu { 3881da7f033dSHerbert Xu int start = 0; 3882da7f033dSHerbert Xu int end = ARRAY_SIZE(alg_test_descs); 3883da7f033dSHerbert Xu 3884da7f033dSHerbert Xu while (start < end) { 3885da7f033dSHerbert Xu int i = (start + end) / 2; 3886da7f033dSHerbert Xu int diff = strcmp(alg_test_descs[i].alg, alg); 3887da7f033dSHerbert Xu 3888da7f033dSHerbert Xu if (diff > 0) { 3889da7f033dSHerbert Xu end = i; 3890da7f033dSHerbert Xu continue; 3891da7f033dSHerbert Xu } 3892da7f033dSHerbert Xu 3893da7f033dSHerbert Xu if (diff < 0) { 3894da7f033dSHerbert Xu start = i + 1; 3895da7f033dSHerbert Xu continue; 3896da7f033dSHerbert Xu } 3897da7f033dSHerbert Xu 38981aa4ecd9SHerbert Xu return i; 3899da7f033dSHerbert Xu } 3900da7f033dSHerbert Xu 39011aa4ecd9SHerbert Xu return -1; 39021aa4ecd9SHerbert Xu } 39031aa4ecd9SHerbert Xu 39041aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 39051aa4ecd9SHerbert Xu { 39061aa4ecd9SHerbert Xu int i; 3907a68f6610SHerbert Xu int j; 3908d12d6b6dSNeil Horman int rc; 39091aa4ecd9SHerbert Xu 39105714758bSJussi Kivilinna alg_test_descs_check_order(); 39115714758bSJussi Kivilinna 39121aa4ecd9SHerbert Xu if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) { 39131aa4ecd9SHerbert Xu char nalg[CRYPTO_MAX_ALG_NAME]; 39141aa4ecd9SHerbert Xu 39151aa4ecd9SHerbert Xu if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >= 39161aa4ecd9SHerbert Xu sizeof(nalg)) 39171aa4ecd9SHerbert Xu return -ENAMETOOLONG; 39181aa4ecd9SHerbert Xu 39191aa4ecd9SHerbert Xu i = alg_find_test(nalg); 39201aa4ecd9SHerbert Xu if (i < 0) 39211aa4ecd9SHerbert Xu goto notest; 39221aa4ecd9SHerbert Xu 3923a3bef3a3SJarod Wilson if (fips_enabled && !alg_test_descs[i].fips_allowed) 3924a3bef3a3SJarod Wilson goto non_fips_alg; 3925a3bef3a3SJarod Wilson 3926941fb328SJarod Wilson rc = alg_test_cipher(alg_test_descs + i, driver, type, mask); 3927941fb328SJarod Wilson goto test_done; 39281aa4ecd9SHerbert Xu } 39291aa4ecd9SHerbert Xu 39301aa4ecd9SHerbert Xu i = alg_find_test(alg); 3931a68f6610SHerbert Xu j = alg_find_test(driver); 3932a68f6610SHerbert Xu if (i < 0 && j < 0) 39331aa4ecd9SHerbert Xu goto notest; 39341aa4ecd9SHerbert Xu 3935a68f6610SHerbert Xu if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) || 3936a68f6610SHerbert Xu (j >= 0 && !alg_test_descs[j].fips_allowed))) 3937a3bef3a3SJarod Wilson goto non_fips_alg; 3938a3bef3a3SJarod Wilson 3939a68f6610SHerbert Xu rc = 0; 3940a68f6610SHerbert Xu if (i >= 0) 3941a68f6610SHerbert Xu rc |= alg_test_descs[i].test(alg_test_descs + i, driver, 39421aa4ecd9SHerbert Xu type, mask); 3943032c8cacSCristian Stoica if (j >= 0 && j != i) 3944a68f6610SHerbert Xu rc |= alg_test_descs[j].test(alg_test_descs + j, driver, 3945a68f6610SHerbert Xu type, mask); 3946a68f6610SHerbert Xu 3947941fb328SJarod Wilson test_done: 3948d12d6b6dSNeil Horman if (fips_enabled && rc) 3949d12d6b6dSNeil Horman panic("%s: %s alg self test failed in fips mode!\n", driver, alg); 3950d12d6b6dSNeil Horman 395129ecd4abSJarod Wilson if (fips_enabled && !rc) 39523e8cffd4SMasanari Iida pr_info("alg: self-tests for %s (%s) passed\n", driver, alg); 395329ecd4abSJarod Wilson 3954d12d6b6dSNeil Horman return rc; 39551aa4ecd9SHerbert Xu 39561aa4ecd9SHerbert Xu notest: 3957da7f033dSHerbert Xu printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver); 3958da7f033dSHerbert Xu return 0; 3959a3bef3a3SJarod Wilson non_fips_alg: 3960a3bef3a3SJarod Wilson return -EINVAL; 3961da7f033dSHerbert Xu } 39620b767f96SAlexander Shishkin 3963326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */ 39640b767f96SAlexander Shishkin 3965da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test); 3966