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; 94384cba178SAndrey Ryabinin unsigned int ivsize = crypto_skcipher_ivsize(tfm); 944f8b0d4d0SHerbert Xu 945f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 946f8b0d4d0SHerbert Xu goto out_nobuf; 947da7f033dSHerbert Xu 94808d6af8cSJussi Kivilinna if (diff_dst && testmgr_alloc_buf(xoutbuf)) 94908d6af8cSJussi Kivilinna goto out_nooutbuf; 95008d6af8cSJussi Kivilinna 95108d6af8cSJussi Kivilinna if (diff_dst) 95208d6af8cSJussi Kivilinna d = "-ddst"; 95308d6af8cSJussi Kivilinna else 95408d6af8cSJussi Kivilinna d = ""; 95508d6af8cSJussi Kivilinna 956da7f033dSHerbert Xu if (enc == ENCRYPT) 957da7f033dSHerbert Xu e = "encryption"; 958da7f033dSHerbert Xu else 959da7f033dSHerbert Xu e = "decryption"; 960da7f033dSHerbert Xu 961da7f033dSHerbert Xu init_completion(&result.completion); 962da7f033dSHerbert Xu 96312773d93SHerbert Xu req = skcipher_request_alloc(tfm, GFP_KERNEL); 964da7f033dSHerbert Xu if (!req) { 96508d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Failed to allocate request for %s\n", 96608d6af8cSJussi Kivilinna d, algo); 967da7f033dSHerbert Xu goto out; 968da7f033dSHerbert Xu } 969da7f033dSHerbert Xu 97012773d93SHerbert Xu skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 971da7f033dSHerbert Xu tcrypt_complete, &result); 972da7f033dSHerbert Xu 973da7f033dSHerbert Xu j = 0; 974da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 975bbb9a7ddSCristian Stoica if (template[i].np && !template[i].also_non_np) 976bbb9a7ddSCristian Stoica continue; 977bbb9a7ddSCristian Stoica 978da7f033dSHerbert Xu if (template[i].iv) 97984cba178SAndrey Ryabinin memcpy(iv, template[i].iv, ivsize); 980da7f033dSHerbert Xu else 981da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 982da7f033dSHerbert Xu 983da7f033dSHerbert Xu j++; 984fd57f22aSHerbert Xu ret = -EINVAL; 985a1aa44a2SCristian Stoica if (WARN_ON(align_offset + template[i].ilen > PAGE_SIZE)) 986fd57f22aSHerbert Xu goto out; 987fd57f22aSHerbert Xu 988da7f033dSHerbert Xu data = xbuf[0]; 9893a338f20SJussi Kivilinna data += align_offset; 990da7f033dSHerbert Xu memcpy(data, template[i].input, template[i].ilen); 991da7f033dSHerbert Xu 99212773d93SHerbert Xu crypto_skcipher_clear_flags(tfm, ~0); 993da7f033dSHerbert Xu if (template[i].wk) 99412773d93SHerbert Xu crypto_skcipher_set_flags(tfm, 99512773d93SHerbert Xu CRYPTO_TFM_REQ_WEAK_KEY); 996da7f033dSHerbert Xu 99712773d93SHerbert Xu ret = crypto_skcipher_setkey(tfm, template[i].key, 998da7f033dSHerbert Xu template[i].klen); 999da7f033dSHerbert Xu if (!ret == template[i].fail) { 100008d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n", 100112773d93SHerbert Xu d, j, algo, crypto_skcipher_get_flags(tfm)); 1002da7f033dSHerbert Xu goto out; 1003da7f033dSHerbert Xu } else if (ret) 1004da7f033dSHerbert Xu continue; 1005da7f033dSHerbert Xu 1006da7f033dSHerbert Xu sg_init_one(&sg[0], data, template[i].ilen); 100708d6af8cSJussi Kivilinna if (diff_dst) { 100808d6af8cSJussi Kivilinna data = xoutbuf[0]; 10093a338f20SJussi Kivilinna data += align_offset; 101008d6af8cSJussi Kivilinna sg_init_one(&sgout[0], data, template[i].ilen); 101108d6af8cSJussi Kivilinna } 1012da7f033dSHerbert Xu 101312773d93SHerbert Xu skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 1014da7f033dSHerbert Xu template[i].ilen, iv); 101512773d93SHerbert Xu ret = enc ? crypto_skcipher_encrypt(req) : 101612773d93SHerbert Xu crypto_skcipher_decrypt(req); 1017da7f033dSHerbert Xu 1018da7f033dSHerbert Xu switch (ret) { 1019da7f033dSHerbert Xu case 0: 1020da7f033dSHerbert Xu break; 1021da7f033dSHerbert Xu case -EINPROGRESS: 1022da7f033dSHerbert Xu case -EBUSY: 10238a45ac12SRabin Vincent wait_for_completion(&result.completion); 102416735d02SWolfram Sang reinit_completion(&result.completion); 10258a45ac12SRabin Vincent ret = result.err; 10268a45ac12SRabin Vincent if (!ret) 1027da7f033dSHerbert Xu break; 1028da7f033dSHerbert Xu /* fall through */ 1029da7f033dSHerbert Xu default: 103008d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n", 103108d6af8cSJussi Kivilinna d, e, j, algo, -ret); 1032da7f033dSHerbert Xu goto out; 1033da7f033dSHerbert Xu } 1034da7f033dSHerbert Xu 1035da7f033dSHerbert Xu q = data; 1036da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 103708d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Test %d failed on %s for %s\n", 103808d6af8cSJussi Kivilinna d, j, e, algo); 1039da7f033dSHerbert Xu hexdump(q, template[i].rlen); 1040da7f033dSHerbert Xu ret = -EINVAL; 1041da7f033dSHerbert Xu goto out; 1042da7f033dSHerbert Xu } 1043da7f033dSHerbert Xu } 1044da7f033dSHerbert Xu 1045da7f033dSHerbert Xu j = 0; 1046da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 10473a338f20SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 10483a338f20SJussi Kivilinna if (align_offset != 0) 10493a338f20SJussi Kivilinna break; 1050da7f033dSHerbert Xu 1051bbb9a7ddSCristian Stoica if (!template[i].np) 1052bbb9a7ddSCristian Stoica continue; 1053bbb9a7ddSCristian Stoica 1054da7f033dSHerbert Xu if (template[i].iv) 105584cba178SAndrey Ryabinin memcpy(iv, template[i].iv, ivsize); 1056da7f033dSHerbert Xu else 1057da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 1058da7f033dSHerbert Xu 1059da7f033dSHerbert Xu j++; 106012773d93SHerbert Xu crypto_skcipher_clear_flags(tfm, ~0); 1061da7f033dSHerbert Xu if (template[i].wk) 106212773d93SHerbert Xu crypto_skcipher_set_flags(tfm, 106312773d93SHerbert Xu CRYPTO_TFM_REQ_WEAK_KEY); 1064da7f033dSHerbert Xu 106512773d93SHerbert Xu ret = crypto_skcipher_setkey(tfm, template[i].key, 1066da7f033dSHerbert Xu template[i].klen); 1067da7f033dSHerbert Xu if (!ret == template[i].fail) { 106808d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n", 106912773d93SHerbert Xu d, j, algo, crypto_skcipher_get_flags(tfm)); 1070da7f033dSHerbert Xu goto out; 1071da7f033dSHerbert Xu } else if (ret) 1072da7f033dSHerbert Xu continue; 1073da7f033dSHerbert Xu 1074da7f033dSHerbert Xu temp = 0; 1075da7f033dSHerbert Xu ret = -EINVAL; 1076da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 107708d6af8cSJussi Kivilinna if (diff_dst) 107808d6af8cSJussi Kivilinna sg_init_table(sgout, template[i].np); 1079da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 1080da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 1081da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 1082da7f033dSHerbert Xu goto out; 1083da7f033dSHerbert Xu 1084a1aa44a2SCristian Stoica q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]); 1085da7f033dSHerbert Xu 1086a1aa44a2SCristian Stoica memcpy(q, template[i].input + temp, template[i].tap[k]); 1087da7f033dSHerbert Xu 1088a1aa44a2SCristian Stoica if (offset_in_page(q) + template[i].tap[k] < PAGE_SIZE) 1089da7f033dSHerbert Xu q[template[i].tap[k]] = 0; 1090da7f033dSHerbert Xu 1091da7f033dSHerbert Xu sg_set_buf(&sg[k], q, template[i].tap[k]); 109208d6af8cSJussi Kivilinna if (diff_dst) { 109308d6af8cSJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 109408d6af8cSJussi Kivilinna offset_in_page(IDX[k]); 109508d6af8cSJussi Kivilinna 1096a1aa44a2SCristian Stoica sg_set_buf(&sgout[k], q, template[i].tap[k]); 109708d6af8cSJussi Kivilinna 109808d6af8cSJussi Kivilinna memset(q, 0, template[i].tap[k]); 109908d6af8cSJussi Kivilinna if (offset_in_page(q) + 110008d6af8cSJussi Kivilinna template[i].tap[k] < PAGE_SIZE) 110108d6af8cSJussi Kivilinna q[template[i].tap[k]] = 0; 110208d6af8cSJussi Kivilinna } 1103da7f033dSHerbert Xu 1104da7f033dSHerbert Xu temp += template[i].tap[k]; 1105da7f033dSHerbert Xu } 1106da7f033dSHerbert Xu 110712773d93SHerbert Xu skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 1108da7f033dSHerbert Xu template[i].ilen, iv); 1109da7f033dSHerbert Xu 111012773d93SHerbert Xu ret = enc ? crypto_skcipher_encrypt(req) : 111112773d93SHerbert Xu crypto_skcipher_decrypt(req); 1112da7f033dSHerbert Xu 1113da7f033dSHerbert Xu switch (ret) { 1114da7f033dSHerbert Xu case 0: 1115da7f033dSHerbert Xu break; 1116da7f033dSHerbert Xu case -EINPROGRESS: 1117da7f033dSHerbert Xu case -EBUSY: 11188a45ac12SRabin Vincent wait_for_completion(&result.completion); 111916735d02SWolfram Sang reinit_completion(&result.completion); 11208a45ac12SRabin Vincent ret = result.err; 11218a45ac12SRabin Vincent if (!ret) 1122da7f033dSHerbert Xu break; 1123da7f033dSHerbert Xu /* fall through */ 1124da7f033dSHerbert Xu default: 112508d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n", 112608d6af8cSJussi Kivilinna d, e, j, algo, -ret); 1127da7f033dSHerbert Xu goto out; 1128da7f033dSHerbert Xu } 1129da7f033dSHerbert Xu 1130da7f033dSHerbert Xu temp = 0; 1131da7f033dSHerbert Xu ret = -EINVAL; 1132da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 113308d6af8cSJussi Kivilinna if (diff_dst) 113408d6af8cSJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 113508d6af8cSJussi Kivilinna offset_in_page(IDX[k]); 113608d6af8cSJussi Kivilinna else 1137da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 1138da7f033dSHerbert Xu offset_in_page(IDX[k]); 1139da7f033dSHerbert Xu 1140da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, 1141da7f033dSHerbert Xu template[i].tap[k])) { 114208d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n", 114308d6af8cSJussi Kivilinna d, j, e, k, algo); 1144da7f033dSHerbert Xu hexdump(q, template[i].tap[k]); 1145da7f033dSHerbert Xu goto out; 1146da7f033dSHerbert Xu } 1147da7f033dSHerbert Xu 1148da7f033dSHerbert Xu q += template[i].tap[k]; 1149da7f033dSHerbert Xu for (n = 0; offset_in_page(q + n) && q[n]; n++) 1150da7f033dSHerbert Xu ; 1151da7f033dSHerbert Xu if (n) { 115208d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n", 115308d6af8cSJussi Kivilinna d, j, e, k, algo, n); 1154da7f033dSHerbert Xu hexdump(q, n); 1155da7f033dSHerbert Xu goto out; 1156da7f033dSHerbert Xu } 1157da7f033dSHerbert Xu temp += template[i].tap[k]; 1158da7f033dSHerbert Xu } 1159da7f033dSHerbert Xu } 1160da7f033dSHerbert Xu 1161da7f033dSHerbert Xu ret = 0; 1162da7f033dSHerbert Xu 1163da7f033dSHerbert Xu out: 116412773d93SHerbert Xu skcipher_request_free(req); 116508d6af8cSJussi Kivilinna if (diff_dst) 116608d6af8cSJussi Kivilinna testmgr_free_buf(xoutbuf); 116708d6af8cSJussi Kivilinna out_nooutbuf: 1168f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 1169f8b0d4d0SHerbert Xu out_nobuf: 1170da7f033dSHerbert Xu return ret; 1171da7f033dSHerbert Xu } 1172da7f033dSHerbert Xu 117312773d93SHerbert Xu static int test_skcipher(struct crypto_skcipher *tfm, int enc, 117408d6af8cSJussi Kivilinna struct cipher_testvec *template, unsigned int tcount) 117508d6af8cSJussi Kivilinna { 11763a338f20SJussi Kivilinna unsigned int alignmask; 117708d6af8cSJussi Kivilinna int ret; 117808d6af8cSJussi Kivilinna 117908d6af8cSJussi Kivilinna /* test 'dst == src' case */ 11803a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, false, 0); 118108d6af8cSJussi Kivilinna if (ret) 118208d6af8cSJussi Kivilinna return ret; 118308d6af8cSJussi Kivilinna 118408d6af8cSJussi Kivilinna /* test 'dst != src' case */ 11853a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 0); 11863a338f20SJussi Kivilinna if (ret) 11873a338f20SJussi Kivilinna return ret; 11883a338f20SJussi Kivilinna 11893a338f20SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 11903a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 1); 11913a338f20SJussi Kivilinna if (ret) 11923a338f20SJussi Kivilinna return ret; 11933a338f20SJussi Kivilinna 11943a338f20SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 11953a338f20SJussi Kivilinna if (alignmask) { 11963a338f20SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 11973a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 11983a338f20SJussi Kivilinna alignmask + 1); 11993a338f20SJussi Kivilinna if (ret) 12003a338f20SJussi Kivilinna return ret; 12013a338f20SJussi Kivilinna } 12023a338f20SJussi Kivilinna 12033a338f20SJussi Kivilinna return 0; 120408d6af8cSJussi Kivilinna } 120508d6af8cSJussi Kivilinna 1206da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate, 1207da7f033dSHerbert Xu struct comp_testvec *dtemplate, int ctcount, int dtcount) 1208da7f033dSHerbert Xu { 1209da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm)); 1210da7f033dSHerbert Xu unsigned int i; 1211da7f033dSHerbert Xu char result[COMP_BUF_SIZE]; 1212da7f033dSHerbert Xu int ret; 1213da7f033dSHerbert Xu 1214da7f033dSHerbert Xu for (i = 0; i < ctcount; i++) { 1215c79cf910SGeert Uytterhoeven int ilen; 1216c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 1217da7f033dSHerbert Xu 1218da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 1219da7f033dSHerbert Xu 1220da7f033dSHerbert Xu ilen = ctemplate[i].inlen; 1221da7f033dSHerbert Xu ret = crypto_comp_compress(tfm, ctemplate[i].input, 1222da7f033dSHerbert Xu ilen, result, &dlen); 1223da7f033dSHerbert Xu if (ret) { 1224da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: compression failed " 1225da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1226da7f033dSHerbert Xu -ret); 1227da7f033dSHerbert Xu goto out; 1228da7f033dSHerbert Xu } 1229da7f033dSHerbert Xu 1230b812eb00SGeert Uytterhoeven if (dlen != ctemplate[i].outlen) { 1231b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Compression test %d " 1232b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1233b812eb00SGeert Uytterhoeven dlen); 1234b812eb00SGeert Uytterhoeven ret = -EINVAL; 1235b812eb00SGeert Uytterhoeven goto out; 1236b812eb00SGeert Uytterhoeven } 1237b812eb00SGeert Uytterhoeven 1238da7f033dSHerbert Xu if (memcmp(result, ctemplate[i].output, dlen)) { 1239da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Compression test %d " 1240da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 1241da7f033dSHerbert Xu hexdump(result, dlen); 1242da7f033dSHerbert Xu ret = -EINVAL; 1243da7f033dSHerbert Xu goto out; 1244da7f033dSHerbert Xu } 1245da7f033dSHerbert Xu } 1246da7f033dSHerbert Xu 1247da7f033dSHerbert Xu for (i = 0; i < dtcount; i++) { 1248c79cf910SGeert Uytterhoeven int ilen; 1249c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 1250da7f033dSHerbert Xu 1251da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 1252da7f033dSHerbert Xu 1253da7f033dSHerbert Xu ilen = dtemplate[i].inlen; 1254da7f033dSHerbert Xu ret = crypto_comp_decompress(tfm, dtemplate[i].input, 1255da7f033dSHerbert Xu ilen, result, &dlen); 1256da7f033dSHerbert Xu if (ret) { 1257da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: decompression failed " 1258da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1259da7f033dSHerbert Xu -ret); 1260da7f033dSHerbert Xu goto out; 1261da7f033dSHerbert Xu } 1262da7f033dSHerbert Xu 1263b812eb00SGeert Uytterhoeven if (dlen != dtemplate[i].outlen) { 1264b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Decompression test %d " 1265b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1266b812eb00SGeert Uytterhoeven dlen); 1267b812eb00SGeert Uytterhoeven ret = -EINVAL; 1268b812eb00SGeert Uytterhoeven goto out; 1269b812eb00SGeert Uytterhoeven } 1270b812eb00SGeert Uytterhoeven 1271da7f033dSHerbert Xu if (memcmp(result, dtemplate[i].output, dlen)) { 1272da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Decompression test %d " 1273da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 1274da7f033dSHerbert Xu hexdump(result, dlen); 1275da7f033dSHerbert Xu ret = -EINVAL; 1276da7f033dSHerbert Xu goto out; 1277da7f033dSHerbert Xu } 1278da7f033dSHerbert Xu } 1279da7f033dSHerbert Xu 1280da7f033dSHerbert Xu ret = 0; 1281da7f033dSHerbert Xu 1282da7f033dSHerbert Xu out: 1283da7f033dSHerbert Xu return ret; 1284da7f033dSHerbert Xu } 1285da7f033dSHerbert Xu 12868064efb8SGeert Uytterhoeven static int test_pcomp(struct crypto_pcomp *tfm, 12878064efb8SGeert Uytterhoeven struct pcomp_testvec *ctemplate, 12888064efb8SGeert Uytterhoeven struct pcomp_testvec *dtemplate, int ctcount, 12898064efb8SGeert Uytterhoeven int dtcount) 12908064efb8SGeert Uytterhoeven { 12918064efb8SGeert Uytterhoeven const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm)); 12928064efb8SGeert Uytterhoeven unsigned int i; 12938064efb8SGeert Uytterhoeven char result[COMP_BUF_SIZE]; 12943ce858cbSGeert Uytterhoeven int res; 12958064efb8SGeert Uytterhoeven 12968064efb8SGeert Uytterhoeven for (i = 0; i < ctcount; i++) { 12978064efb8SGeert Uytterhoeven struct comp_request req; 12983ce858cbSGeert Uytterhoeven unsigned int produced = 0; 12998064efb8SGeert Uytterhoeven 13003ce858cbSGeert Uytterhoeven res = crypto_compress_setup(tfm, ctemplate[i].params, 13018064efb8SGeert Uytterhoeven ctemplate[i].paramsize); 13023ce858cbSGeert Uytterhoeven if (res) { 13038064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression setup failed on test " 13043ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 13053ce858cbSGeert Uytterhoeven return res; 13068064efb8SGeert Uytterhoeven } 13078064efb8SGeert Uytterhoeven 13083ce858cbSGeert Uytterhoeven res = crypto_compress_init(tfm); 13093ce858cbSGeert Uytterhoeven if (res) { 13108064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression init failed on test " 13113ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 13123ce858cbSGeert Uytterhoeven return res; 13138064efb8SGeert Uytterhoeven } 13148064efb8SGeert Uytterhoeven 13158064efb8SGeert Uytterhoeven memset(result, 0, sizeof(result)); 13168064efb8SGeert Uytterhoeven 13178064efb8SGeert Uytterhoeven req.next_in = ctemplate[i].input; 13188064efb8SGeert Uytterhoeven req.avail_in = ctemplate[i].inlen / 2; 13198064efb8SGeert Uytterhoeven req.next_out = result; 13208064efb8SGeert Uytterhoeven req.avail_out = ctemplate[i].outlen / 2; 13218064efb8SGeert Uytterhoeven 13223ce858cbSGeert Uytterhoeven res = crypto_compress_update(tfm, &req); 13233ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 13248064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression update failed on test " 13253ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 13263ce858cbSGeert Uytterhoeven return res; 13278064efb8SGeert Uytterhoeven } 13283ce858cbSGeert Uytterhoeven if (res > 0) 13293ce858cbSGeert Uytterhoeven produced += res; 13308064efb8SGeert Uytterhoeven 13318064efb8SGeert Uytterhoeven /* Add remaining input data */ 13328064efb8SGeert Uytterhoeven req.avail_in += (ctemplate[i].inlen + 1) / 2; 13338064efb8SGeert Uytterhoeven 13343ce858cbSGeert Uytterhoeven res = crypto_compress_update(tfm, &req); 13353ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 13368064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression update failed on test " 13373ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 13383ce858cbSGeert Uytterhoeven return res; 13398064efb8SGeert Uytterhoeven } 13403ce858cbSGeert Uytterhoeven if (res > 0) 13413ce858cbSGeert Uytterhoeven produced += res; 13428064efb8SGeert Uytterhoeven 13438064efb8SGeert Uytterhoeven /* Provide remaining output space */ 13448064efb8SGeert Uytterhoeven req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2; 13458064efb8SGeert Uytterhoeven 13463ce858cbSGeert Uytterhoeven res = crypto_compress_final(tfm, &req); 13473ce858cbSGeert Uytterhoeven if (res < 0) { 13488064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression final failed on test " 13493ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 13503ce858cbSGeert Uytterhoeven return res; 13518064efb8SGeert Uytterhoeven } 13523ce858cbSGeert Uytterhoeven produced += res; 13538064efb8SGeert Uytterhoeven 13548064efb8SGeert Uytterhoeven if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) { 13558064efb8SGeert Uytterhoeven pr_err("alg: comp: Compression test %d failed for %s: " 13568064efb8SGeert Uytterhoeven "output len = %d (expected %d)\n", i + 1, algo, 13578064efb8SGeert Uytterhoeven COMP_BUF_SIZE - req.avail_out, 13588064efb8SGeert Uytterhoeven ctemplate[i].outlen); 13598064efb8SGeert Uytterhoeven return -EINVAL; 13608064efb8SGeert Uytterhoeven } 13618064efb8SGeert Uytterhoeven 13623ce858cbSGeert Uytterhoeven if (produced != ctemplate[i].outlen) { 13633ce858cbSGeert Uytterhoeven pr_err("alg: comp: Compression test %d failed for %s: " 13643ce858cbSGeert Uytterhoeven "returned len = %u (expected %d)\n", i + 1, 13653ce858cbSGeert Uytterhoeven algo, produced, ctemplate[i].outlen); 13663ce858cbSGeert Uytterhoeven return -EINVAL; 13673ce858cbSGeert Uytterhoeven } 13683ce858cbSGeert Uytterhoeven 13698064efb8SGeert Uytterhoeven if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) { 13708064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Compression test %d failed for " 13718064efb8SGeert Uytterhoeven "%s\n", i + 1, algo); 13728064efb8SGeert Uytterhoeven hexdump(result, ctemplate[i].outlen); 13738064efb8SGeert Uytterhoeven return -EINVAL; 13748064efb8SGeert Uytterhoeven } 13758064efb8SGeert Uytterhoeven } 13768064efb8SGeert Uytterhoeven 13778064efb8SGeert Uytterhoeven for (i = 0; i < dtcount; i++) { 13788064efb8SGeert Uytterhoeven struct comp_request req; 13793ce858cbSGeert Uytterhoeven unsigned int produced = 0; 13808064efb8SGeert Uytterhoeven 13813ce858cbSGeert Uytterhoeven res = crypto_decompress_setup(tfm, dtemplate[i].params, 13828064efb8SGeert Uytterhoeven dtemplate[i].paramsize); 13833ce858cbSGeert Uytterhoeven if (res) { 13848064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression setup failed on " 13853ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 13863ce858cbSGeert Uytterhoeven return res; 13878064efb8SGeert Uytterhoeven } 13888064efb8SGeert Uytterhoeven 13893ce858cbSGeert Uytterhoeven res = crypto_decompress_init(tfm); 13903ce858cbSGeert Uytterhoeven if (res) { 13918064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression init failed on test " 13923ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 13933ce858cbSGeert Uytterhoeven return res; 13948064efb8SGeert Uytterhoeven } 13958064efb8SGeert Uytterhoeven 13968064efb8SGeert Uytterhoeven memset(result, 0, sizeof(result)); 13978064efb8SGeert Uytterhoeven 13988064efb8SGeert Uytterhoeven req.next_in = dtemplate[i].input; 13998064efb8SGeert Uytterhoeven req.avail_in = dtemplate[i].inlen / 2; 14008064efb8SGeert Uytterhoeven req.next_out = result; 14018064efb8SGeert Uytterhoeven req.avail_out = dtemplate[i].outlen / 2; 14028064efb8SGeert Uytterhoeven 14033ce858cbSGeert Uytterhoeven res = crypto_decompress_update(tfm, &req); 14043ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 14058064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression update failed on " 14063ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 14073ce858cbSGeert Uytterhoeven return res; 14088064efb8SGeert Uytterhoeven } 14093ce858cbSGeert Uytterhoeven if (res > 0) 14103ce858cbSGeert Uytterhoeven produced += res; 14118064efb8SGeert Uytterhoeven 14128064efb8SGeert Uytterhoeven /* Add remaining input data */ 14138064efb8SGeert Uytterhoeven req.avail_in += (dtemplate[i].inlen + 1) / 2; 14148064efb8SGeert Uytterhoeven 14153ce858cbSGeert Uytterhoeven res = crypto_decompress_update(tfm, &req); 14163ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 14178064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression update failed on " 14183ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 14193ce858cbSGeert Uytterhoeven return res; 14208064efb8SGeert Uytterhoeven } 14213ce858cbSGeert Uytterhoeven if (res > 0) 14223ce858cbSGeert Uytterhoeven produced += res; 14238064efb8SGeert Uytterhoeven 14248064efb8SGeert Uytterhoeven /* Provide remaining output space */ 14258064efb8SGeert Uytterhoeven req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2; 14268064efb8SGeert Uytterhoeven 14273ce858cbSGeert Uytterhoeven res = crypto_decompress_final(tfm, &req); 14283ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 14298064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression final failed on " 14303ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 14313ce858cbSGeert Uytterhoeven return res; 14328064efb8SGeert Uytterhoeven } 14333ce858cbSGeert Uytterhoeven if (res > 0) 14343ce858cbSGeert Uytterhoeven produced += res; 14358064efb8SGeert Uytterhoeven 14368064efb8SGeert Uytterhoeven if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) { 14378064efb8SGeert Uytterhoeven pr_err("alg: comp: Decompression test %d failed for " 14388064efb8SGeert Uytterhoeven "%s: output len = %d (expected %d)\n", i + 1, 14398064efb8SGeert Uytterhoeven algo, COMP_BUF_SIZE - req.avail_out, 14408064efb8SGeert Uytterhoeven dtemplate[i].outlen); 14418064efb8SGeert Uytterhoeven return -EINVAL; 14428064efb8SGeert Uytterhoeven } 14438064efb8SGeert Uytterhoeven 14443ce858cbSGeert Uytterhoeven if (produced != dtemplate[i].outlen) { 14453ce858cbSGeert Uytterhoeven pr_err("alg: comp: Decompression test %d failed for " 14463ce858cbSGeert Uytterhoeven "%s: returned len = %u (expected %d)\n", i + 1, 14473ce858cbSGeert Uytterhoeven algo, produced, dtemplate[i].outlen); 14483ce858cbSGeert Uytterhoeven return -EINVAL; 14493ce858cbSGeert Uytterhoeven } 14503ce858cbSGeert Uytterhoeven 14518064efb8SGeert Uytterhoeven if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) { 14528064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Decompression test %d failed for " 14538064efb8SGeert Uytterhoeven "%s\n", i + 1, algo); 14548064efb8SGeert Uytterhoeven hexdump(result, dtemplate[i].outlen); 14558064efb8SGeert Uytterhoeven return -EINVAL; 14568064efb8SGeert Uytterhoeven } 14578064efb8SGeert Uytterhoeven } 14588064efb8SGeert Uytterhoeven 14598064efb8SGeert Uytterhoeven return 0; 14608064efb8SGeert Uytterhoeven } 14618064efb8SGeert Uytterhoeven 14627647d6ceSJarod Wilson 14637647d6ceSJarod Wilson static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template, 14647647d6ceSJarod Wilson unsigned int tcount) 14657647d6ceSJarod Wilson { 14667647d6ceSJarod Wilson const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm)); 1467fa4ef8a6SFelipe Contreras int err = 0, i, j, seedsize; 14687647d6ceSJarod Wilson u8 *seed; 14697647d6ceSJarod Wilson char result[32]; 14707647d6ceSJarod Wilson 14717647d6ceSJarod Wilson seedsize = crypto_rng_seedsize(tfm); 14727647d6ceSJarod Wilson 14737647d6ceSJarod Wilson seed = kmalloc(seedsize, GFP_KERNEL); 14747647d6ceSJarod Wilson if (!seed) { 14757647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to allocate seed space " 14767647d6ceSJarod Wilson "for %s\n", algo); 14777647d6ceSJarod Wilson return -ENOMEM; 14787647d6ceSJarod Wilson } 14797647d6ceSJarod Wilson 14807647d6ceSJarod Wilson for (i = 0; i < tcount; i++) { 14817647d6ceSJarod Wilson memset(result, 0, 32); 14827647d6ceSJarod Wilson 14837647d6ceSJarod Wilson memcpy(seed, template[i].v, template[i].vlen); 14847647d6ceSJarod Wilson memcpy(seed + template[i].vlen, template[i].key, 14857647d6ceSJarod Wilson template[i].klen); 14867647d6ceSJarod Wilson memcpy(seed + template[i].vlen + template[i].klen, 14877647d6ceSJarod Wilson template[i].dt, template[i].dtlen); 14887647d6ceSJarod Wilson 14897647d6ceSJarod Wilson err = crypto_rng_reset(tfm, seed, seedsize); 14907647d6ceSJarod Wilson if (err) { 14917647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to reset rng " 14927647d6ceSJarod Wilson "for %s\n", algo); 14937647d6ceSJarod Wilson goto out; 14947647d6ceSJarod Wilson } 14957647d6ceSJarod Wilson 14967647d6ceSJarod Wilson for (j = 0; j < template[i].loops; j++) { 14977647d6ceSJarod Wilson err = crypto_rng_get_bytes(tfm, result, 14987647d6ceSJarod Wilson template[i].rlen); 149919e60e13SStephan Mueller if (err < 0) { 15007647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to obtain " 15017647d6ceSJarod Wilson "the correct amount of random data for " 150219e60e13SStephan Mueller "%s (requested %d)\n", algo, 150319e60e13SStephan Mueller template[i].rlen); 15047647d6ceSJarod Wilson goto out; 15057647d6ceSJarod Wilson } 15067647d6ceSJarod Wilson } 15077647d6ceSJarod Wilson 15087647d6ceSJarod Wilson err = memcmp(result, template[i].result, 15097647d6ceSJarod Wilson template[i].rlen); 15107647d6ceSJarod Wilson if (err) { 15117647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Test %d failed for %s\n", 15127647d6ceSJarod Wilson i, algo); 15137647d6ceSJarod Wilson hexdump(result, template[i].rlen); 15147647d6ceSJarod Wilson err = -EINVAL; 15157647d6ceSJarod Wilson goto out; 15167647d6ceSJarod Wilson } 15177647d6ceSJarod Wilson } 15187647d6ceSJarod Wilson 15197647d6ceSJarod Wilson out: 15207647d6ceSJarod Wilson kfree(seed); 15217647d6ceSJarod Wilson return err; 15227647d6ceSJarod Wilson } 15237647d6ceSJarod Wilson 1524da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver, 1525da7f033dSHerbert Xu u32 type, u32 mask) 1526da7f033dSHerbert Xu { 1527da7f033dSHerbert Xu struct crypto_aead *tfm; 1528da7f033dSHerbert Xu int err = 0; 1529da7f033dSHerbert Xu 1530425a8829SStephan Mueller tfm = crypto_alloc_aead(driver, type | CRYPTO_ALG_INTERNAL, mask); 1531da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1532da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to load transform for %s: " 1533da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1534da7f033dSHerbert Xu return PTR_ERR(tfm); 1535da7f033dSHerbert Xu } 1536da7f033dSHerbert Xu 1537da7f033dSHerbert Xu if (desc->suite.aead.enc.vecs) { 1538da7f033dSHerbert Xu err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs, 1539da7f033dSHerbert Xu desc->suite.aead.enc.count); 1540da7f033dSHerbert Xu if (err) 1541da7f033dSHerbert Xu goto out; 1542da7f033dSHerbert Xu } 1543da7f033dSHerbert Xu 1544da7f033dSHerbert Xu if (!err && desc->suite.aead.dec.vecs) 1545da7f033dSHerbert Xu err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs, 1546da7f033dSHerbert Xu desc->suite.aead.dec.count); 1547da7f033dSHerbert Xu 1548da7f033dSHerbert Xu out: 1549da7f033dSHerbert Xu crypto_free_aead(tfm); 1550da7f033dSHerbert Xu return err; 1551da7f033dSHerbert Xu } 1552da7f033dSHerbert Xu 1553da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc, 1554da7f033dSHerbert Xu const char *driver, u32 type, u32 mask) 1555da7f033dSHerbert Xu { 15561aa4ecd9SHerbert Xu struct crypto_cipher *tfm; 1557da7f033dSHerbert Xu int err = 0; 1558da7f033dSHerbert Xu 1559425a8829SStephan Mueller tfm = crypto_alloc_cipher(driver, type | CRYPTO_ALG_INTERNAL, mask); 1560da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1561da7f033dSHerbert Xu printk(KERN_ERR "alg: cipher: Failed to load transform for " 1562da7f033dSHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 1563da7f033dSHerbert Xu return PTR_ERR(tfm); 1564da7f033dSHerbert Xu } 1565da7f033dSHerbert Xu 1566da7f033dSHerbert Xu if (desc->suite.cipher.enc.vecs) { 1567da7f033dSHerbert Xu err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 1568da7f033dSHerbert Xu desc->suite.cipher.enc.count); 1569da7f033dSHerbert Xu if (err) 1570da7f033dSHerbert Xu goto out; 1571da7f033dSHerbert Xu } 1572da7f033dSHerbert Xu 1573da7f033dSHerbert Xu if (desc->suite.cipher.dec.vecs) 1574da7f033dSHerbert Xu err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 1575da7f033dSHerbert Xu desc->suite.cipher.dec.count); 1576da7f033dSHerbert Xu 1577da7f033dSHerbert Xu out: 15781aa4ecd9SHerbert Xu crypto_free_cipher(tfm); 15791aa4ecd9SHerbert Xu return err; 15801aa4ecd9SHerbert Xu } 15811aa4ecd9SHerbert Xu 15821aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc, 15831aa4ecd9SHerbert Xu const char *driver, u32 type, u32 mask) 15841aa4ecd9SHerbert Xu { 158512773d93SHerbert Xu struct crypto_skcipher *tfm; 15861aa4ecd9SHerbert Xu int err = 0; 15871aa4ecd9SHerbert Xu 158812773d93SHerbert Xu tfm = crypto_alloc_skcipher(driver, type | CRYPTO_ALG_INTERNAL, mask); 15891aa4ecd9SHerbert Xu if (IS_ERR(tfm)) { 15901aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Failed to load transform for " 15911aa4ecd9SHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 15921aa4ecd9SHerbert Xu return PTR_ERR(tfm); 15931aa4ecd9SHerbert Xu } 15941aa4ecd9SHerbert Xu 15951aa4ecd9SHerbert Xu if (desc->suite.cipher.enc.vecs) { 15961aa4ecd9SHerbert Xu err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 15971aa4ecd9SHerbert Xu desc->suite.cipher.enc.count); 15981aa4ecd9SHerbert Xu if (err) 15991aa4ecd9SHerbert Xu goto out; 16001aa4ecd9SHerbert Xu } 16011aa4ecd9SHerbert Xu 16021aa4ecd9SHerbert Xu if (desc->suite.cipher.dec.vecs) 16031aa4ecd9SHerbert Xu err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 16041aa4ecd9SHerbert Xu desc->suite.cipher.dec.count); 16051aa4ecd9SHerbert Xu 16061aa4ecd9SHerbert Xu out: 160712773d93SHerbert Xu crypto_free_skcipher(tfm); 1608da7f033dSHerbert Xu return err; 1609da7f033dSHerbert Xu } 1610da7f033dSHerbert Xu 1611da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver, 1612da7f033dSHerbert Xu u32 type, u32 mask) 1613da7f033dSHerbert Xu { 1614da7f033dSHerbert Xu struct crypto_comp *tfm; 1615da7f033dSHerbert Xu int err; 1616da7f033dSHerbert Xu 1617da7f033dSHerbert Xu tfm = crypto_alloc_comp(driver, type, mask); 1618da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1619da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Failed to load transform for %s: " 1620da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1621da7f033dSHerbert Xu return PTR_ERR(tfm); 1622da7f033dSHerbert Xu } 1623da7f033dSHerbert Xu 1624da7f033dSHerbert Xu err = test_comp(tfm, desc->suite.comp.comp.vecs, 1625da7f033dSHerbert Xu desc->suite.comp.decomp.vecs, 1626da7f033dSHerbert Xu desc->suite.comp.comp.count, 1627da7f033dSHerbert Xu desc->suite.comp.decomp.count); 1628da7f033dSHerbert Xu 1629da7f033dSHerbert Xu crypto_free_comp(tfm); 1630da7f033dSHerbert Xu return err; 1631da7f033dSHerbert Xu } 1632da7f033dSHerbert Xu 16338064efb8SGeert Uytterhoeven static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver, 16348064efb8SGeert Uytterhoeven u32 type, u32 mask) 16358064efb8SGeert Uytterhoeven { 16368064efb8SGeert Uytterhoeven struct crypto_pcomp *tfm; 16378064efb8SGeert Uytterhoeven int err; 16388064efb8SGeert Uytterhoeven 16398064efb8SGeert Uytterhoeven tfm = crypto_alloc_pcomp(driver, type, mask); 16408064efb8SGeert Uytterhoeven if (IS_ERR(tfm)) { 16418064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Failed to load transform for %s: %ld\n", 16428064efb8SGeert Uytterhoeven driver, PTR_ERR(tfm)); 16438064efb8SGeert Uytterhoeven return PTR_ERR(tfm); 16448064efb8SGeert Uytterhoeven } 16458064efb8SGeert Uytterhoeven 16468064efb8SGeert Uytterhoeven err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs, 16478064efb8SGeert Uytterhoeven desc->suite.pcomp.decomp.vecs, 16488064efb8SGeert Uytterhoeven desc->suite.pcomp.comp.count, 16498064efb8SGeert Uytterhoeven desc->suite.pcomp.decomp.count); 16508064efb8SGeert Uytterhoeven 16518064efb8SGeert Uytterhoeven crypto_free_pcomp(tfm); 16528064efb8SGeert Uytterhoeven return err; 16538064efb8SGeert Uytterhoeven } 16548064efb8SGeert Uytterhoeven 1655da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver, 1656da7f033dSHerbert Xu u32 type, u32 mask) 1657da7f033dSHerbert Xu { 1658da7f033dSHerbert Xu struct crypto_ahash *tfm; 1659da7f033dSHerbert Xu int err; 1660da7f033dSHerbert Xu 1661425a8829SStephan Mueller tfm = crypto_alloc_ahash(driver, type | CRYPTO_ALG_INTERNAL, mask); 1662da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1663da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to load transform for %s: " 1664da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1665da7f033dSHerbert Xu return PTR_ERR(tfm); 1666da7f033dSHerbert Xu } 1667da7f033dSHerbert Xu 1668a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1669a8f1a052SDavid S. Miller desc->suite.hash.count, true); 1670a8f1a052SDavid S. Miller if (!err) 1671a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1672a8f1a052SDavid S. Miller desc->suite.hash.count, false); 1673da7f033dSHerbert Xu 1674da7f033dSHerbert Xu crypto_free_ahash(tfm); 1675da7f033dSHerbert Xu return err; 1676da7f033dSHerbert Xu } 1677da7f033dSHerbert Xu 16788e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc, 16798e3ee85eSHerbert Xu const char *driver, u32 type, u32 mask) 16808e3ee85eSHerbert Xu { 16818e3ee85eSHerbert Xu struct crypto_shash *tfm; 16828e3ee85eSHerbert Xu u32 val; 16838e3ee85eSHerbert Xu int err; 16848e3ee85eSHerbert Xu 16858e3ee85eSHerbert Xu err = alg_test_hash(desc, driver, type, mask); 16868e3ee85eSHerbert Xu if (err) 16878e3ee85eSHerbert Xu goto out; 16888e3ee85eSHerbert Xu 1689425a8829SStephan Mueller tfm = crypto_alloc_shash(driver, type | CRYPTO_ALG_INTERNAL, mask); 16908e3ee85eSHerbert Xu if (IS_ERR(tfm)) { 16918e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: " 16928e3ee85eSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 16938e3ee85eSHerbert Xu err = PTR_ERR(tfm); 16948e3ee85eSHerbert Xu goto out; 16958e3ee85eSHerbert Xu } 16968e3ee85eSHerbert Xu 16978e3ee85eSHerbert Xu do { 16984c5c3024SJan-Simon Möller SHASH_DESC_ON_STACK(shash, tfm); 16994c5c3024SJan-Simon Möller u32 *ctx = (u32 *)shash_desc_ctx(shash); 17008e3ee85eSHerbert Xu 17014c5c3024SJan-Simon Möller shash->tfm = tfm; 17024c5c3024SJan-Simon Möller shash->flags = 0; 17038e3ee85eSHerbert Xu 17044c5c3024SJan-Simon Möller *ctx = le32_to_cpu(420553207); 17054c5c3024SJan-Simon Möller err = crypto_shash_final(shash, (u8 *)&val); 17068e3ee85eSHerbert Xu if (err) { 17078e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Operation failed for " 17088e3ee85eSHerbert Xu "%s: %d\n", driver, err); 17098e3ee85eSHerbert Xu break; 17108e3ee85eSHerbert Xu } 17118e3ee85eSHerbert Xu 17128e3ee85eSHerbert Xu if (val != ~420553207) { 17138e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Test failed for %s: " 17148e3ee85eSHerbert Xu "%d\n", driver, val); 17158e3ee85eSHerbert Xu err = -EINVAL; 17168e3ee85eSHerbert Xu } 17178e3ee85eSHerbert Xu } while (0); 17188e3ee85eSHerbert Xu 17198e3ee85eSHerbert Xu crypto_free_shash(tfm); 17208e3ee85eSHerbert Xu 17218e3ee85eSHerbert Xu out: 17228e3ee85eSHerbert Xu return err; 17238e3ee85eSHerbert Xu } 17248e3ee85eSHerbert Xu 17257647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver, 17267647d6ceSJarod Wilson u32 type, u32 mask) 17277647d6ceSJarod Wilson { 17287647d6ceSJarod Wilson struct crypto_rng *rng; 17297647d6ceSJarod Wilson int err; 17307647d6ceSJarod Wilson 1731425a8829SStephan Mueller rng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask); 17327647d6ceSJarod Wilson if (IS_ERR(rng)) { 17337647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to load transform for %s: " 17347647d6ceSJarod Wilson "%ld\n", driver, PTR_ERR(rng)); 17357647d6ceSJarod Wilson return PTR_ERR(rng); 17367647d6ceSJarod Wilson } 17377647d6ceSJarod Wilson 17387647d6ceSJarod Wilson err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count); 17397647d6ceSJarod Wilson 17407647d6ceSJarod Wilson crypto_free_rng(rng); 17417647d6ceSJarod Wilson 17427647d6ceSJarod Wilson return err; 17437647d6ceSJarod Wilson } 17447647d6ceSJarod Wilson 174564d1cdfbSStephan Mueller 174664d1cdfbSStephan Mueller static int drbg_cavs_test(struct drbg_testvec *test, int pr, 174764d1cdfbSStephan Mueller const char *driver, u32 type, u32 mask) 174864d1cdfbSStephan Mueller { 174964d1cdfbSStephan Mueller int ret = -EAGAIN; 175064d1cdfbSStephan Mueller struct crypto_rng *drng; 175164d1cdfbSStephan Mueller struct drbg_test_data test_data; 175264d1cdfbSStephan Mueller struct drbg_string addtl, pers, testentropy; 175364d1cdfbSStephan Mueller unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL); 175464d1cdfbSStephan Mueller 175564d1cdfbSStephan Mueller if (!buf) 175664d1cdfbSStephan Mueller return -ENOMEM; 175764d1cdfbSStephan Mueller 1758425a8829SStephan Mueller drng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask); 175964d1cdfbSStephan Mueller if (IS_ERR(drng)) { 176064d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for " 176164d1cdfbSStephan Mueller "%s\n", driver); 176264d1cdfbSStephan Mueller kzfree(buf); 176364d1cdfbSStephan Mueller return -ENOMEM; 176464d1cdfbSStephan Mueller } 176564d1cdfbSStephan Mueller 176664d1cdfbSStephan Mueller test_data.testentropy = &testentropy; 176764d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entropy, test->entropylen); 176864d1cdfbSStephan Mueller drbg_string_fill(&pers, test->pers, test->perslen); 176964d1cdfbSStephan Mueller ret = crypto_drbg_reset_test(drng, &pers, &test_data); 177064d1cdfbSStephan Mueller if (ret) { 177164d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: Failed to reset rng\n"); 177264d1cdfbSStephan Mueller goto outbuf; 177364d1cdfbSStephan Mueller } 177464d1cdfbSStephan Mueller 177564d1cdfbSStephan Mueller drbg_string_fill(&addtl, test->addtla, test->addtllen); 177664d1cdfbSStephan Mueller if (pr) { 177764d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entpra, test->entprlen); 177864d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl_test(drng, 177964d1cdfbSStephan Mueller buf, test->expectedlen, &addtl, &test_data); 178064d1cdfbSStephan Mueller } else { 178164d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl(drng, 178264d1cdfbSStephan Mueller buf, test->expectedlen, &addtl); 178364d1cdfbSStephan Mueller } 178419e60e13SStephan Mueller if (ret < 0) { 178564d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not obtain random data for " 178664d1cdfbSStephan Mueller "driver %s\n", driver); 178764d1cdfbSStephan Mueller goto outbuf; 178864d1cdfbSStephan Mueller } 178964d1cdfbSStephan Mueller 179064d1cdfbSStephan Mueller drbg_string_fill(&addtl, test->addtlb, test->addtllen); 179164d1cdfbSStephan Mueller if (pr) { 179264d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entprb, test->entprlen); 179364d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl_test(drng, 179464d1cdfbSStephan Mueller buf, test->expectedlen, &addtl, &test_data); 179564d1cdfbSStephan Mueller } else { 179664d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl(drng, 179764d1cdfbSStephan Mueller buf, test->expectedlen, &addtl); 179864d1cdfbSStephan Mueller } 179919e60e13SStephan Mueller if (ret < 0) { 180064d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not obtain random data for " 180164d1cdfbSStephan Mueller "driver %s\n", driver); 180264d1cdfbSStephan Mueller goto outbuf; 180364d1cdfbSStephan Mueller } 180464d1cdfbSStephan Mueller 180564d1cdfbSStephan Mueller ret = memcmp(test->expected, buf, test->expectedlen); 180664d1cdfbSStephan Mueller 180764d1cdfbSStephan Mueller outbuf: 180864d1cdfbSStephan Mueller crypto_free_rng(drng); 180964d1cdfbSStephan Mueller kzfree(buf); 181064d1cdfbSStephan Mueller return ret; 181164d1cdfbSStephan Mueller } 181264d1cdfbSStephan Mueller 181364d1cdfbSStephan Mueller 181464d1cdfbSStephan Mueller static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver, 181564d1cdfbSStephan Mueller u32 type, u32 mask) 181664d1cdfbSStephan Mueller { 181764d1cdfbSStephan Mueller int err = 0; 181864d1cdfbSStephan Mueller int pr = 0; 181964d1cdfbSStephan Mueller int i = 0; 182064d1cdfbSStephan Mueller struct drbg_testvec *template = desc->suite.drbg.vecs; 182164d1cdfbSStephan Mueller unsigned int tcount = desc->suite.drbg.count; 182264d1cdfbSStephan Mueller 182364d1cdfbSStephan Mueller if (0 == memcmp(driver, "drbg_pr_", 8)) 182464d1cdfbSStephan Mueller pr = 1; 182564d1cdfbSStephan Mueller 182664d1cdfbSStephan Mueller for (i = 0; i < tcount; i++) { 182764d1cdfbSStephan Mueller err = drbg_cavs_test(&template[i], pr, driver, type, mask); 182864d1cdfbSStephan Mueller if (err) { 182964d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: Test %d failed for %s\n", 183064d1cdfbSStephan Mueller i, driver); 183164d1cdfbSStephan Mueller err = -EINVAL; 183264d1cdfbSStephan Mueller break; 183364d1cdfbSStephan Mueller } 183464d1cdfbSStephan Mueller } 183564d1cdfbSStephan Mueller return err; 183664d1cdfbSStephan Mueller 183764d1cdfbSStephan Mueller } 183864d1cdfbSStephan Mueller 1839946cc463STadeusz Struk static int do_test_rsa(struct crypto_akcipher *tfm, 1840946cc463STadeusz Struk struct akcipher_testvec *vecs) 1841946cc463STadeusz Struk { 1842946cc463STadeusz Struk struct akcipher_request *req; 1843946cc463STadeusz Struk void *outbuf_enc = NULL; 1844946cc463STadeusz Struk void *outbuf_dec = NULL; 1845946cc463STadeusz Struk struct tcrypt_result result; 1846946cc463STadeusz Struk unsigned int out_len_max, out_len = 0; 1847946cc463STadeusz Struk int err = -ENOMEM; 184822287b0bSTadeusz Struk struct scatterlist src, dst, src_tab[2]; 1849946cc463STadeusz Struk 1850946cc463STadeusz Struk req = akcipher_request_alloc(tfm, GFP_KERNEL); 1851946cc463STadeusz Struk if (!req) 1852946cc463STadeusz Struk return err; 1853946cc463STadeusz Struk 1854946cc463STadeusz Struk init_completion(&result.completion); 185522287b0bSTadeusz Struk 185622287b0bSTadeusz Struk if (vecs->public_key_vec) 185722287b0bSTadeusz Struk err = crypto_akcipher_set_pub_key(tfm, vecs->key, 185822287b0bSTadeusz Struk vecs->key_len); 185922287b0bSTadeusz Struk else 186022287b0bSTadeusz Struk err = crypto_akcipher_set_priv_key(tfm, vecs->key, 186122287b0bSTadeusz Struk vecs->key_len); 1862946cc463STadeusz Struk if (err) 1863946cc463STadeusz Struk goto free_req; 1864946cc463STadeusz Struk 186522287b0bSTadeusz Struk out_len_max = crypto_akcipher_maxsize(tfm); 1866946cc463STadeusz Struk outbuf_enc = kzalloc(out_len_max, GFP_KERNEL); 1867946cc463STadeusz Struk if (!outbuf_enc) 1868946cc463STadeusz Struk goto free_req; 1869946cc463STadeusz Struk 187022287b0bSTadeusz Struk sg_init_table(src_tab, 2); 187122287b0bSTadeusz Struk sg_set_buf(&src_tab[0], vecs->m, 8); 187222287b0bSTadeusz Struk sg_set_buf(&src_tab[1], vecs->m + 8, vecs->m_size - 8); 187322287b0bSTadeusz Struk sg_init_one(&dst, outbuf_enc, out_len_max); 187422287b0bSTadeusz Struk akcipher_request_set_crypt(req, src_tab, &dst, vecs->m_size, 187522287b0bSTadeusz Struk out_len_max); 1876946cc463STadeusz Struk akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 1877946cc463STadeusz Struk tcrypt_complete, &result); 1878946cc463STadeusz Struk 1879946cc463STadeusz Struk /* Run RSA encrypt - c = m^e mod n;*/ 1880946cc463STadeusz Struk err = wait_async_op(&result, crypto_akcipher_encrypt(req)); 1881946cc463STadeusz Struk if (err) { 1882946cc463STadeusz Struk pr_err("alg: rsa: encrypt test failed. err %d\n", err); 1883946cc463STadeusz Struk goto free_all; 1884946cc463STadeusz Struk } 188522287b0bSTadeusz Struk if (req->dst_len != vecs->c_size) { 1886946cc463STadeusz Struk pr_err("alg: rsa: encrypt test failed. Invalid output len\n"); 1887946cc463STadeusz Struk err = -EINVAL; 1888946cc463STadeusz Struk goto free_all; 1889946cc463STadeusz Struk } 1890946cc463STadeusz Struk /* verify that encrypted message is equal to expected */ 189122287b0bSTadeusz Struk if (memcmp(vecs->c, sg_virt(req->dst), vecs->c_size)) { 1892946cc463STadeusz Struk pr_err("alg: rsa: encrypt test failed. Invalid output\n"); 1893946cc463STadeusz Struk err = -EINVAL; 1894946cc463STadeusz Struk goto free_all; 1895946cc463STadeusz Struk } 1896946cc463STadeusz Struk /* Don't invoke decrypt for vectors with public key */ 1897946cc463STadeusz Struk if (vecs->public_key_vec) { 1898946cc463STadeusz Struk err = 0; 1899946cc463STadeusz Struk goto free_all; 1900946cc463STadeusz Struk } 1901946cc463STadeusz Struk outbuf_dec = kzalloc(out_len_max, GFP_KERNEL); 1902946cc463STadeusz Struk if (!outbuf_dec) { 1903946cc463STadeusz Struk err = -ENOMEM; 1904946cc463STadeusz Struk goto free_all; 1905946cc463STadeusz Struk } 190622287b0bSTadeusz Struk sg_init_one(&src, vecs->c, vecs->c_size); 190722287b0bSTadeusz Struk sg_init_one(&dst, outbuf_dec, out_len_max); 1908946cc463STadeusz Struk init_completion(&result.completion); 190922287b0bSTadeusz Struk akcipher_request_set_crypt(req, &src, &dst, vecs->c_size, out_len_max); 1910946cc463STadeusz Struk 1911946cc463STadeusz Struk /* Run RSA decrypt - m = c^d mod n;*/ 1912946cc463STadeusz Struk err = wait_async_op(&result, crypto_akcipher_decrypt(req)); 1913946cc463STadeusz Struk if (err) { 1914946cc463STadeusz Struk pr_err("alg: rsa: decrypt test failed. err %d\n", err); 1915946cc463STadeusz Struk goto free_all; 1916946cc463STadeusz Struk } 1917946cc463STadeusz Struk out_len = req->dst_len; 1918946cc463STadeusz Struk if (out_len != vecs->m_size) { 1919946cc463STadeusz Struk pr_err("alg: rsa: decrypt test failed. Invalid output len\n"); 1920946cc463STadeusz Struk err = -EINVAL; 1921946cc463STadeusz Struk goto free_all; 1922946cc463STadeusz Struk } 1923946cc463STadeusz Struk /* verify that decrypted message is equal to the original msg */ 1924946cc463STadeusz Struk if (memcmp(vecs->m, outbuf_dec, vecs->m_size)) { 1925946cc463STadeusz Struk pr_err("alg: rsa: decrypt test failed. Invalid output\n"); 1926946cc463STadeusz Struk err = -EINVAL; 1927946cc463STadeusz Struk } 1928946cc463STadeusz Struk free_all: 1929946cc463STadeusz Struk kfree(outbuf_dec); 1930946cc463STadeusz Struk kfree(outbuf_enc); 1931946cc463STadeusz Struk free_req: 1932946cc463STadeusz Struk akcipher_request_free(req); 1933946cc463STadeusz Struk return err; 1934946cc463STadeusz Struk } 1935946cc463STadeusz Struk 1936946cc463STadeusz Struk static int test_rsa(struct crypto_akcipher *tfm, struct akcipher_testvec *vecs, 1937946cc463STadeusz Struk unsigned int tcount) 1938946cc463STadeusz Struk { 1939946cc463STadeusz Struk int ret, i; 1940946cc463STadeusz Struk 1941946cc463STadeusz Struk for (i = 0; i < tcount; i++) { 1942946cc463STadeusz Struk ret = do_test_rsa(tfm, vecs++); 1943946cc463STadeusz Struk if (ret) { 1944946cc463STadeusz Struk pr_err("alg: rsa: test failed on vector %d, err=%d\n", 1945946cc463STadeusz Struk i + 1, ret); 1946946cc463STadeusz Struk return ret; 1947946cc463STadeusz Struk } 1948946cc463STadeusz Struk } 1949946cc463STadeusz Struk return 0; 1950946cc463STadeusz Struk } 1951946cc463STadeusz Struk 1952946cc463STadeusz Struk static int test_akcipher(struct crypto_akcipher *tfm, const char *alg, 1953946cc463STadeusz Struk struct akcipher_testvec *vecs, unsigned int tcount) 1954946cc463STadeusz Struk { 1955946cc463STadeusz Struk if (strncmp(alg, "rsa", 3) == 0) 1956946cc463STadeusz Struk return test_rsa(tfm, vecs, tcount); 1957946cc463STadeusz Struk 1958946cc463STadeusz Struk return 0; 1959946cc463STadeusz Struk } 1960946cc463STadeusz Struk 1961946cc463STadeusz Struk static int alg_test_akcipher(const struct alg_test_desc *desc, 1962946cc463STadeusz Struk const char *driver, u32 type, u32 mask) 1963946cc463STadeusz Struk { 1964946cc463STadeusz Struk struct crypto_akcipher *tfm; 1965946cc463STadeusz Struk int err = 0; 1966946cc463STadeusz Struk 1967946cc463STadeusz Struk tfm = crypto_alloc_akcipher(driver, type | CRYPTO_ALG_INTERNAL, mask); 1968946cc463STadeusz Struk if (IS_ERR(tfm)) { 1969946cc463STadeusz Struk pr_err("alg: akcipher: Failed to load tfm for %s: %ld\n", 1970946cc463STadeusz Struk driver, PTR_ERR(tfm)); 1971946cc463STadeusz Struk return PTR_ERR(tfm); 1972946cc463STadeusz Struk } 1973946cc463STadeusz Struk if (desc->suite.akcipher.vecs) 1974946cc463STadeusz Struk err = test_akcipher(tfm, desc->alg, desc->suite.akcipher.vecs, 1975946cc463STadeusz Struk desc->suite.akcipher.count); 1976946cc463STadeusz Struk 1977946cc463STadeusz Struk crypto_free_akcipher(tfm); 1978946cc463STadeusz Struk return err; 1979946cc463STadeusz Struk } 1980946cc463STadeusz Struk 1981863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc, 1982863b557aSYouquan, Song const char *driver, u32 type, u32 mask) 1983863b557aSYouquan, Song { 1984863b557aSYouquan, Song return 0; 1985863b557aSYouquan, Song } 1986863b557aSYouquan, Song 1987da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */ 1988da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = { 1989da7f033dSHerbert Xu { 19904d6d6a2cSJohannes Goetzfried .alg = "__cbc-cast5-avx", 19914d6d6a2cSJohannes Goetzfried .test = alg_test_null, 19924d6d6a2cSJohannes Goetzfried }, { 19934ea1277dSJohannes Goetzfried .alg = "__cbc-cast6-avx", 19944ea1277dSJohannes Goetzfried .test = alg_test_null, 19954ea1277dSJohannes Goetzfried }, { 19967efe4076SJohannes Goetzfried .alg = "__cbc-serpent-avx", 19977efe4076SJohannes Goetzfried .test = alg_test_null, 19987efe4076SJohannes Goetzfried }, { 199956d76c96SJussi Kivilinna .alg = "__cbc-serpent-avx2", 200056d76c96SJussi Kivilinna .test = alg_test_null, 200156d76c96SJussi Kivilinna }, { 2002937c30d7SJussi Kivilinna .alg = "__cbc-serpent-sse2", 2003937c30d7SJussi Kivilinna .test = alg_test_null, 2004937c30d7SJussi Kivilinna }, { 2005107778b5SJohannes Goetzfried .alg = "__cbc-twofish-avx", 2006107778b5SJohannes Goetzfried .test = alg_test_null, 2007107778b5SJohannes Goetzfried }, { 2008863b557aSYouquan, Song .alg = "__driver-cbc-aes-aesni", 2009863b557aSYouquan, Song .test = alg_test_null, 20106c79294fSMilan Broz .fips_allowed = 1, 2011863b557aSYouquan, Song }, { 2012d9b1d2e7SJussi Kivilinna .alg = "__driver-cbc-camellia-aesni", 2013d9b1d2e7SJussi Kivilinna .test = alg_test_null, 2014d9b1d2e7SJussi Kivilinna }, { 2015f3f935a7SJussi Kivilinna .alg = "__driver-cbc-camellia-aesni-avx2", 2016f3f935a7SJussi Kivilinna .test = alg_test_null, 2017f3f935a7SJussi Kivilinna }, { 20184d6d6a2cSJohannes Goetzfried .alg = "__driver-cbc-cast5-avx", 20194d6d6a2cSJohannes Goetzfried .test = alg_test_null, 20204d6d6a2cSJohannes Goetzfried }, { 20214ea1277dSJohannes Goetzfried .alg = "__driver-cbc-cast6-avx", 20224ea1277dSJohannes Goetzfried .test = alg_test_null, 20234ea1277dSJohannes Goetzfried }, { 20247efe4076SJohannes Goetzfried .alg = "__driver-cbc-serpent-avx", 20257efe4076SJohannes Goetzfried .test = alg_test_null, 20267efe4076SJohannes Goetzfried }, { 202756d76c96SJussi Kivilinna .alg = "__driver-cbc-serpent-avx2", 202856d76c96SJussi Kivilinna .test = alg_test_null, 202956d76c96SJussi Kivilinna }, { 2030937c30d7SJussi Kivilinna .alg = "__driver-cbc-serpent-sse2", 2031937c30d7SJussi Kivilinna .test = alg_test_null, 2032937c30d7SJussi Kivilinna }, { 2033107778b5SJohannes Goetzfried .alg = "__driver-cbc-twofish-avx", 2034107778b5SJohannes Goetzfried .test = alg_test_null, 2035107778b5SJohannes Goetzfried }, { 2036863b557aSYouquan, Song .alg = "__driver-ecb-aes-aesni", 2037863b557aSYouquan, Song .test = alg_test_null, 20386c79294fSMilan Broz .fips_allowed = 1, 2039863b557aSYouquan, Song }, { 2040d9b1d2e7SJussi Kivilinna .alg = "__driver-ecb-camellia-aesni", 2041d9b1d2e7SJussi Kivilinna .test = alg_test_null, 2042d9b1d2e7SJussi Kivilinna }, { 2043f3f935a7SJussi Kivilinna .alg = "__driver-ecb-camellia-aesni-avx2", 2044f3f935a7SJussi Kivilinna .test = alg_test_null, 2045f3f935a7SJussi Kivilinna }, { 20464d6d6a2cSJohannes Goetzfried .alg = "__driver-ecb-cast5-avx", 20474d6d6a2cSJohannes Goetzfried .test = alg_test_null, 20484d6d6a2cSJohannes Goetzfried }, { 20494ea1277dSJohannes Goetzfried .alg = "__driver-ecb-cast6-avx", 20504ea1277dSJohannes Goetzfried .test = alg_test_null, 20514ea1277dSJohannes Goetzfried }, { 20527efe4076SJohannes Goetzfried .alg = "__driver-ecb-serpent-avx", 20537efe4076SJohannes Goetzfried .test = alg_test_null, 20547efe4076SJohannes Goetzfried }, { 205556d76c96SJussi Kivilinna .alg = "__driver-ecb-serpent-avx2", 205656d76c96SJussi Kivilinna .test = alg_test_null, 205756d76c96SJussi Kivilinna }, { 2058937c30d7SJussi Kivilinna .alg = "__driver-ecb-serpent-sse2", 2059937c30d7SJussi Kivilinna .test = alg_test_null, 2060937c30d7SJussi Kivilinna }, { 2061107778b5SJohannes Goetzfried .alg = "__driver-ecb-twofish-avx", 2062107778b5SJohannes Goetzfried .test = alg_test_null, 2063107778b5SJohannes Goetzfried }, { 20649d77b6c2STadeusz Struk .alg = "__driver-gcm-aes-aesni", 20659d77b6c2STadeusz Struk .test = alg_test_null, 20669d77b6c2STadeusz Struk .fips_allowed = 1, 20679d77b6c2STadeusz Struk }, { 2068863b557aSYouquan, Song .alg = "__ghash-pclmulqdqni", 2069863b557aSYouquan, Song .test = alg_test_null, 20706c79294fSMilan Broz .fips_allowed = 1, 2071863b557aSYouquan, Song }, { 2072e08ca2daSJarod Wilson .alg = "ansi_cprng", 2073e08ca2daSJarod Wilson .test = alg_test_cprng, 2074a1915d51SJarod Wilson .fips_allowed = 1, 2075e08ca2daSJarod Wilson .suite = { 2076e08ca2daSJarod Wilson .cprng = { 2077e08ca2daSJarod Wilson .vecs = ansi_cprng_aes_tv_template, 2078e08ca2daSJarod Wilson .count = ANSI_CPRNG_AES_TEST_VECTORS 2079e08ca2daSJarod Wilson } 2080e08ca2daSJarod Wilson } 2081e08ca2daSJarod Wilson }, { 2082bca4feb0SHoria Geanta .alg = "authenc(hmac(md5),ecb(cipher_null))", 2083bca4feb0SHoria Geanta .test = alg_test_aead, 2084bca4feb0SHoria Geanta .suite = { 2085bca4feb0SHoria Geanta .aead = { 2086bca4feb0SHoria Geanta .enc = { 2087bca4feb0SHoria Geanta .vecs = hmac_md5_ecb_cipher_null_enc_tv_template, 2088bca4feb0SHoria Geanta .count = HMAC_MD5_ECB_CIPHER_NULL_ENC_TEST_VECTORS 2089bca4feb0SHoria Geanta }, 2090bca4feb0SHoria Geanta .dec = { 2091bca4feb0SHoria Geanta .vecs = hmac_md5_ecb_cipher_null_dec_tv_template, 2092bca4feb0SHoria Geanta .count = HMAC_MD5_ECB_CIPHER_NULL_DEC_TEST_VECTORS 2093bca4feb0SHoria Geanta } 2094bca4feb0SHoria Geanta } 2095bca4feb0SHoria Geanta } 2096bca4feb0SHoria Geanta }, { 2097a4198fd4SHerbert Xu .alg = "authenc(hmac(sha1),cbc(aes))", 2098e46e9a46SHoria Geanta .test = alg_test_aead, 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 .suite = { 21135208ed2cSNitesh Lal .aead = { 21145208ed2cSNitesh Lal .enc = { 21155208ed2cSNitesh Lal .vecs = 21165208ed2cSNitesh Lal hmac_sha1_des_cbc_enc_tv_temp, 21175208ed2cSNitesh Lal .count = 21185208ed2cSNitesh Lal HMAC_SHA1_DES_CBC_ENC_TEST_VEC 21195208ed2cSNitesh Lal } 21205208ed2cSNitesh Lal } 21215208ed2cSNitesh Lal } 21225208ed2cSNitesh Lal }, { 2123a4198fd4SHerbert Xu .alg = "authenc(hmac(sha1),cbc(des3_ede))", 21245208ed2cSNitesh Lal .test = alg_test_aead, 21255208ed2cSNitesh Lal .suite = { 21265208ed2cSNitesh Lal .aead = { 21275208ed2cSNitesh Lal .enc = { 21285208ed2cSNitesh Lal .vecs = 21295208ed2cSNitesh Lal hmac_sha1_des3_ede_cbc_enc_tv_temp, 21305208ed2cSNitesh Lal .count = 21315208ed2cSNitesh Lal HMAC_SHA1_DES3_EDE_CBC_ENC_TEST_VEC 2132e46e9a46SHoria Geanta } 2133e46e9a46SHoria Geanta } 2134e46e9a46SHoria Geanta } 2135e46e9a46SHoria Geanta }, { 2136bca4feb0SHoria Geanta .alg = "authenc(hmac(sha1),ecb(cipher_null))", 2137bca4feb0SHoria Geanta .test = alg_test_aead, 2138bca4feb0SHoria Geanta .suite = { 2139bca4feb0SHoria Geanta .aead = { 2140bca4feb0SHoria Geanta .enc = { 21415208ed2cSNitesh Lal .vecs = 21425208ed2cSNitesh Lal hmac_sha1_ecb_cipher_null_enc_tv_temp, 21435208ed2cSNitesh Lal .count = 21445208ed2cSNitesh Lal HMAC_SHA1_ECB_CIPHER_NULL_ENC_TEST_VEC 2145bca4feb0SHoria Geanta }, 2146bca4feb0SHoria Geanta .dec = { 21475208ed2cSNitesh Lal .vecs = 21485208ed2cSNitesh Lal hmac_sha1_ecb_cipher_null_dec_tv_temp, 21495208ed2cSNitesh Lal .count = 21505208ed2cSNitesh Lal HMAC_SHA1_ECB_CIPHER_NULL_DEC_TEST_VEC 21515208ed2cSNitesh Lal } 21525208ed2cSNitesh Lal } 21535208ed2cSNitesh Lal } 21545208ed2cSNitesh Lal }, { 2155a4198fd4SHerbert Xu .alg = "authenc(hmac(sha224),cbc(des))", 21565208ed2cSNitesh Lal .test = alg_test_aead, 21575208ed2cSNitesh Lal .suite = { 21585208ed2cSNitesh Lal .aead = { 21595208ed2cSNitesh Lal .enc = { 21605208ed2cSNitesh Lal .vecs = 21615208ed2cSNitesh Lal hmac_sha224_des_cbc_enc_tv_temp, 21625208ed2cSNitesh Lal .count = 21635208ed2cSNitesh Lal HMAC_SHA224_DES_CBC_ENC_TEST_VEC 21645208ed2cSNitesh Lal } 21655208ed2cSNitesh Lal } 21665208ed2cSNitesh Lal } 21675208ed2cSNitesh Lal }, { 2168a4198fd4SHerbert Xu .alg = "authenc(hmac(sha224),cbc(des3_ede))", 21695208ed2cSNitesh Lal .test = alg_test_aead, 21705208ed2cSNitesh Lal .suite = { 21715208ed2cSNitesh Lal .aead = { 21725208ed2cSNitesh Lal .enc = { 21735208ed2cSNitesh Lal .vecs = 21745208ed2cSNitesh Lal hmac_sha224_des3_ede_cbc_enc_tv_temp, 21755208ed2cSNitesh Lal .count = 21765208ed2cSNitesh Lal HMAC_SHA224_DES3_EDE_CBC_ENC_TEST_VEC 2177bca4feb0SHoria Geanta } 2178bca4feb0SHoria Geanta } 2179bca4feb0SHoria Geanta } 2180bca4feb0SHoria Geanta }, { 2181a4198fd4SHerbert Xu .alg = "authenc(hmac(sha256),cbc(aes))", 2182e46e9a46SHoria Geanta .test = alg_test_aead, 2183e46e9a46SHoria Geanta .suite = { 2184e46e9a46SHoria Geanta .aead = { 2185e46e9a46SHoria Geanta .enc = { 21865208ed2cSNitesh Lal .vecs = 21875208ed2cSNitesh Lal hmac_sha256_aes_cbc_enc_tv_temp, 21885208ed2cSNitesh Lal .count = 21895208ed2cSNitesh Lal HMAC_SHA256_AES_CBC_ENC_TEST_VEC 21905208ed2cSNitesh Lal } 21915208ed2cSNitesh Lal } 21925208ed2cSNitesh Lal } 21935208ed2cSNitesh Lal }, { 2194a4198fd4SHerbert Xu .alg = "authenc(hmac(sha256),cbc(des))", 21955208ed2cSNitesh Lal .test = alg_test_aead, 21965208ed2cSNitesh Lal .suite = { 21975208ed2cSNitesh Lal .aead = { 21985208ed2cSNitesh Lal .enc = { 21995208ed2cSNitesh Lal .vecs = 22005208ed2cSNitesh Lal hmac_sha256_des_cbc_enc_tv_temp, 22015208ed2cSNitesh Lal .count = 22025208ed2cSNitesh Lal HMAC_SHA256_DES_CBC_ENC_TEST_VEC 22035208ed2cSNitesh Lal } 22045208ed2cSNitesh Lal } 22055208ed2cSNitesh Lal } 22065208ed2cSNitesh Lal }, { 2207a4198fd4SHerbert Xu .alg = "authenc(hmac(sha256),cbc(des3_ede))", 22085208ed2cSNitesh Lal .test = alg_test_aead, 22095208ed2cSNitesh Lal .suite = { 22105208ed2cSNitesh Lal .aead = { 22115208ed2cSNitesh Lal .enc = { 22125208ed2cSNitesh Lal .vecs = 22135208ed2cSNitesh Lal hmac_sha256_des3_ede_cbc_enc_tv_temp, 22145208ed2cSNitesh Lal .count = 22155208ed2cSNitesh Lal HMAC_SHA256_DES3_EDE_CBC_ENC_TEST_VEC 22165208ed2cSNitesh Lal } 22175208ed2cSNitesh Lal } 22185208ed2cSNitesh Lal } 22195208ed2cSNitesh Lal }, { 2220a4198fd4SHerbert Xu .alg = "authenc(hmac(sha384),cbc(des))", 22215208ed2cSNitesh Lal .test = alg_test_aead, 22225208ed2cSNitesh Lal .suite = { 22235208ed2cSNitesh Lal .aead = { 22245208ed2cSNitesh Lal .enc = { 22255208ed2cSNitesh Lal .vecs = 22265208ed2cSNitesh Lal hmac_sha384_des_cbc_enc_tv_temp, 22275208ed2cSNitesh Lal .count = 22285208ed2cSNitesh Lal HMAC_SHA384_DES_CBC_ENC_TEST_VEC 22295208ed2cSNitesh Lal } 22305208ed2cSNitesh Lal } 22315208ed2cSNitesh Lal } 22325208ed2cSNitesh Lal }, { 2233a4198fd4SHerbert Xu .alg = "authenc(hmac(sha384),cbc(des3_ede))", 22345208ed2cSNitesh Lal .test = alg_test_aead, 22355208ed2cSNitesh Lal .suite = { 22365208ed2cSNitesh Lal .aead = { 22375208ed2cSNitesh Lal .enc = { 22385208ed2cSNitesh Lal .vecs = 22395208ed2cSNitesh Lal hmac_sha384_des3_ede_cbc_enc_tv_temp, 22405208ed2cSNitesh Lal .count = 22415208ed2cSNitesh Lal HMAC_SHA384_DES3_EDE_CBC_ENC_TEST_VEC 2242e46e9a46SHoria Geanta } 2243e46e9a46SHoria Geanta } 2244e46e9a46SHoria Geanta } 2245e46e9a46SHoria Geanta }, { 2246a4198fd4SHerbert Xu .alg = "authenc(hmac(sha512),cbc(aes))", 2247e46e9a46SHoria Geanta .test = alg_test_aead, 2248e46e9a46SHoria Geanta .suite = { 2249e46e9a46SHoria Geanta .aead = { 2250e46e9a46SHoria Geanta .enc = { 22515208ed2cSNitesh Lal .vecs = 22525208ed2cSNitesh Lal hmac_sha512_aes_cbc_enc_tv_temp, 22535208ed2cSNitesh Lal .count = 22545208ed2cSNitesh Lal HMAC_SHA512_AES_CBC_ENC_TEST_VEC 22555208ed2cSNitesh Lal } 22565208ed2cSNitesh Lal } 22575208ed2cSNitesh Lal } 22585208ed2cSNitesh Lal }, { 2259a4198fd4SHerbert Xu .alg = "authenc(hmac(sha512),cbc(des))", 22605208ed2cSNitesh Lal .test = alg_test_aead, 22615208ed2cSNitesh Lal .suite = { 22625208ed2cSNitesh Lal .aead = { 22635208ed2cSNitesh Lal .enc = { 22645208ed2cSNitesh Lal .vecs = 22655208ed2cSNitesh Lal hmac_sha512_des_cbc_enc_tv_temp, 22665208ed2cSNitesh Lal .count = 22675208ed2cSNitesh Lal HMAC_SHA512_DES_CBC_ENC_TEST_VEC 22685208ed2cSNitesh Lal } 22695208ed2cSNitesh Lal } 22705208ed2cSNitesh Lal } 22715208ed2cSNitesh Lal }, { 2272a4198fd4SHerbert Xu .alg = "authenc(hmac(sha512),cbc(des3_ede))", 22735208ed2cSNitesh Lal .test = alg_test_aead, 22745208ed2cSNitesh Lal .suite = { 22755208ed2cSNitesh Lal .aead = { 22765208ed2cSNitesh Lal .enc = { 22775208ed2cSNitesh Lal .vecs = 22785208ed2cSNitesh Lal hmac_sha512_des3_ede_cbc_enc_tv_temp, 22795208ed2cSNitesh Lal .count = 22805208ed2cSNitesh Lal HMAC_SHA512_DES3_EDE_CBC_ENC_TEST_VEC 2281e46e9a46SHoria Geanta } 2282e46e9a46SHoria Geanta } 2283e46e9a46SHoria Geanta } 2284e46e9a46SHoria Geanta }, { 2285da7f033dSHerbert Xu .alg = "cbc(aes)", 22861aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2287a1915d51SJarod Wilson .fips_allowed = 1, 2288da7f033dSHerbert Xu .suite = { 2289da7f033dSHerbert Xu .cipher = { 2290da7f033dSHerbert Xu .enc = { 2291da7f033dSHerbert Xu .vecs = aes_cbc_enc_tv_template, 2292da7f033dSHerbert Xu .count = AES_CBC_ENC_TEST_VECTORS 2293da7f033dSHerbert Xu }, 2294da7f033dSHerbert Xu .dec = { 2295da7f033dSHerbert Xu .vecs = aes_cbc_dec_tv_template, 2296da7f033dSHerbert Xu .count = AES_CBC_DEC_TEST_VECTORS 2297da7f033dSHerbert Xu } 2298da7f033dSHerbert Xu } 2299da7f033dSHerbert Xu } 2300da7f033dSHerbert Xu }, { 2301da7f033dSHerbert Xu .alg = "cbc(anubis)", 23021aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2303da7f033dSHerbert Xu .suite = { 2304da7f033dSHerbert Xu .cipher = { 2305da7f033dSHerbert Xu .enc = { 2306da7f033dSHerbert Xu .vecs = anubis_cbc_enc_tv_template, 2307da7f033dSHerbert Xu .count = ANUBIS_CBC_ENC_TEST_VECTORS 2308da7f033dSHerbert Xu }, 2309da7f033dSHerbert Xu .dec = { 2310da7f033dSHerbert Xu .vecs = anubis_cbc_dec_tv_template, 2311da7f033dSHerbert Xu .count = ANUBIS_CBC_DEC_TEST_VECTORS 2312da7f033dSHerbert Xu } 2313da7f033dSHerbert Xu } 2314da7f033dSHerbert Xu } 2315da7f033dSHerbert Xu }, { 2316da7f033dSHerbert Xu .alg = "cbc(blowfish)", 23171aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2318da7f033dSHerbert Xu .suite = { 2319da7f033dSHerbert Xu .cipher = { 2320da7f033dSHerbert Xu .enc = { 2321da7f033dSHerbert Xu .vecs = bf_cbc_enc_tv_template, 2322da7f033dSHerbert Xu .count = BF_CBC_ENC_TEST_VECTORS 2323da7f033dSHerbert Xu }, 2324da7f033dSHerbert Xu .dec = { 2325da7f033dSHerbert Xu .vecs = bf_cbc_dec_tv_template, 2326da7f033dSHerbert Xu .count = BF_CBC_DEC_TEST_VECTORS 2327da7f033dSHerbert Xu } 2328da7f033dSHerbert Xu } 2329da7f033dSHerbert Xu } 2330da7f033dSHerbert Xu }, { 2331da7f033dSHerbert Xu .alg = "cbc(camellia)", 23321aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2333da7f033dSHerbert Xu .suite = { 2334da7f033dSHerbert Xu .cipher = { 2335da7f033dSHerbert Xu .enc = { 2336da7f033dSHerbert Xu .vecs = camellia_cbc_enc_tv_template, 2337da7f033dSHerbert Xu .count = CAMELLIA_CBC_ENC_TEST_VECTORS 2338da7f033dSHerbert Xu }, 2339da7f033dSHerbert Xu .dec = { 2340da7f033dSHerbert Xu .vecs = camellia_cbc_dec_tv_template, 2341da7f033dSHerbert Xu .count = CAMELLIA_CBC_DEC_TEST_VECTORS 2342da7f033dSHerbert Xu } 2343da7f033dSHerbert Xu } 2344da7f033dSHerbert Xu } 2345da7f033dSHerbert Xu }, { 2346a2c58260SJohannes Goetzfried .alg = "cbc(cast5)", 2347a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 2348a2c58260SJohannes Goetzfried .suite = { 2349a2c58260SJohannes Goetzfried .cipher = { 2350a2c58260SJohannes Goetzfried .enc = { 2351a2c58260SJohannes Goetzfried .vecs = cast5_cbc_enc_tv_template, 2352a2c58260SJohannes Goetzfried .count = CAST5_CBC_ENC_TEST_VECTORS 2353a2c58260SJohannes Goetzfried }, 2354a2c58260SJohannes Goetzfried .dec = { 2355a2c58260SJohannes Goetzfried .vecs = cast5_cbc_dec_tv_template, 2356a2c58260SJohannes Goetzfried .count = CAST5_CBC_DEC_TEST_VECTORS 2357a2c58260SJohannes Goetzfried } 2358a2c58260SJohannes Goetzfried } 2359a2c58260SJohannes Goetzfried } 2360a2c58260SJohannes Goetzfried }, { 23619b8b0405SJohannes Goetzfried .alg = "cbc(cast6)", 23629b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 23639b8b0405SJohannes Goetzfried .suite = { 23649b8b0405SJohannes Goetzfried .cipher = { 23659b8b0405SJohannes Goetzfried .enc = { 23669b8b0405SJohannes Goetzfried .vecs = cast6_cbc_enc_tv_template, 23679b8b0405SJohannes Goetzfried .count = CAST6_CBC_ENC_TEST_VECTORS 23689b8b0405SJohannes Goetzfried }, 23699b8b0405SJohannes Goetzfried .dec = { 23709b8b0405SJohannes Goetzfried .vecs = cast6_cbc_dec_tv_template, 23719b8b0405SJohannes Goetzfried .count = CAST6_CBC_DEC_TEST_VECTORS 23729b8b0405SJohannes Goetzfried } 23739b8b0405SJohannes Goetzfried } 23749b8b0405SJohannes Goetzfried } 23759b8b0405SJohannes Goetzfried }, { 2376da7f033dSHerbert Xu .alg = "cbc(des)", 23771aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2378da7f033dSHerbert Xu .suite = { 2379da7f033dSHerbert Xu .cipher = { 2380da7f033dSHerbert Xu .enc = { 2381da7f033dSHerbert Xu .vecs = des_cbc_enc_tv_template, 2382da7f033dSHerbert Xu .count = DES_CBC_ENC_TEST_VECTORS 2383da7f033dSHerbert Xu }, 2384da7f033dSHerbert Xu .dec = { 2385da7f033dSHerbert Xu .vecs = des_cbc_dec_tv_template, 2386da7f033dSHerbert Xu .count = DES_CBC_DEC_TEST_VECTORS 2387da7f033dSHerbert Xu } 2388da7f033dSHerbert Xu } 2389da7f033dSHerbert Xu } 2390da7f033dSHerbert Xu }, { 2391da7f033dSHerbert Xu .alg = "cbc(des3_ede)", 23921aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2393a1915d51SJarod Wilson .fips_allowed = 1, 2394da7f033dSHerbert Xu .suite = { 2395da7f033dSHerbert Xu .cipher = { 2396da7f033dSHerbert Xu .enc = { 2397da7f033dSHerbert Xu .vecs = des3_ede_cbc_enc_tv_template, 2398da7f033dSHerbert Xu .count = DES3_EDE_CBC_ENC_TEST_VECTORS 2399da7f033dSHerbert Xu }, 2400da7f033dSHerbert Xu .dec = { 2401da7f033dSHerbert Xu .vecs = des3_ede_cbc_dec_tv_template, 2402da7f033dSHerbert Xu .count = DES3_EDE_CBC_DEC_TEST_VECTORS 2403da7f033dSHerbert Xu } 2404da7f033dSHerbert Xu } 2405da7f033dSHerbert Xu } 2406da7f033dSHerbert Xu }, { 24079d25917dSJussi Kivilinna .alg = "cbc(serpent)", 24089d25917dSJussi Kivilinna .test = alg_test_skcipher, 24099d25917dSJussi Kivilinna .suite = { 24109d25917dSJussi Kivilinna .cipher = { 24119d25917dSJussi Kivilinna .enc = { 24129d25917dSJussi Kivilinna .vecs = serpent_cbc_enc_tv_template, 24139d25917dSJussi Kivilinna .count = SERPENT_CBC_ENC_TEST_VECTORS 24149d25917dSJussi Kivilinna }, 24159d25917dSJussi Kivilinna .dec = { 24169d25917dSJussi Kivilinna .vecs = serpent_cbc_dec_tv_template, 24179d25917dSJussi Kivilinna .count = SERPENT_CBC_DEC_TEST_VECTORS 24189d25917dSJussi Kivilinna } 24199d25917dSJussi Kivilinna } 24209d25917dSJussi Kivilinna } 24219d25917dSJussi Kivilinna }, { 2422da7f033dSHerbert Xu .alg = "cbc(twofish)", 24231aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2424da7f033dSHerbert Xu .suite = { 2425da7f033dSHerbert Xu .cipher = { 2426da7f033dSHerbert Xu .enc = { 2427da7f033dSHerbert Xu .vecs = tf_cbc_enc_tv_template, 2428da7f033dSHerbert Xu .count = TF_CBC_ENC_TEST_VECTORS 2429da7f033dSHerbert Xu }, 2430da7f033dSHerbert Xu .dec = { 2431da7f033dSHerbert Xu .vecs = tf_cbc_dec_tv_template, 2432da7f033dSHerbert Xu .count = TF_CBC_DEC_TEST_VECTORS 2433da7f033dSHerbert Xu } 2434da7f033dSHerbert Xu } 2435da7f033dSHerbert Xu } 2436da7f033dSHerbert Xu }, { 2437da7f033dSHerbert Xu .alg = "ccm(aes)", 2438da7f033dSHerbert Xu .test = alg_test_aead, 2439a1915d51SJarod Wilson .fips_allowed = 1, 2440da7f033dSHerbert Xu .suite = { 2441da7f033dSHerbert Xu .aead = { 2442da7f033dSHerbert Xu .enc = { 2443da7f033dSHerbert Xu .vecs = aes_ccm_enc_tv_template, 2444da7f033dSHerbert Xu .count = AES_CCM_ENC_TEST_VECTORS 2445da7f033dSHerbert Xu }, 2446da7f033dSHerbert Xu .dec = { 2447da7f033dSHerbert Xu .vecs = aes_ccm_dec_tv_template, 2448da7f033dSHerbert Xu .count = AES_CCM_DEC_TEST_VECTORS 2449da7f033dSHerbert Xu } 2450da7f033dSHerbert Xu } 2451da7f033dSHerbert Xu } 2452da7f033dSHerbert Xu }, { 24533590ebf2SMartin Willi .alg = "chacha20", 24543590ebf2SMartin Willi .test = alg_test_skcipher, 24553590ebf2SMartin Willi .suite = { 24563590ebf2SMartin Willi .cipher = { 24573590ebf2SMartin Willi .enc = { 24583590ebf2SMartin Willi .vecs = chacha20_enc_tv_template, 24593590ebf2SMartin Willi .count = CHACHA20_ENC_TEST_VECTORS 24603590ebf2SMartin Willi }, 24613590ebf2SMartin Willi .dec = { 24623590ebf2SMartin Willi .vecs = chacha20_enc_tv_template, 24633590ebf2SMartin Willi .count = CHACHA20_ENC_TEST_VECTORS 24643590ebf2SMartin Willi }, 24653590ebf2SMartin Willi } 24663590ebf2SMartin Willi } 24673590ebf2SMartin Willi }, { 246893b5e86aSJussi Kivilinna .alg = "cmac(aes)", 24698f183751SStephan Mueller .fips_allowed = 1, 247093b5e86aSJussi Kivilinna .test = alg_test_hash, 247193b5e86aSJussi Kivilinna .suite = { 247293b5e86aSJussi Kivilinna .hash = { 247393b5e86aSJussi Kivilinna .vecs = aes_cmac128_tv_template, 247493b5e86aSJussi Kivilinna .count = CMAC_AES_TEST_VECTORS 247593b5e86aSJussi Kivilinna } 247693b5e86aSJussi Kivilinna } 247793b5e86aSJussi Kivilinna }, { 247893b5e86aSJussi Kivilinna .alg = "cmac(des3_ede)", 24798f183751SStephan Mueller .fips_allowed = 1, 248093b5e86aSJussi Kivilinna .test = alg_test_hash, 248193b5e86aSJussi Kivilinna .suite = { 248293b5e86aSJussi Kivilinna .hash = { 248393b5e86aSJussi Kivilinna .vecs = des3_ede_cmac64_tv_template, 248493b5e86aSJussi Kivilinna .count = CMAC_DES3_EDE_TEST_VECTORS 248593b5e86aSJussi Kivilinna } 248693b5e86aSJussi Kivilinna } 248793b5e86aSJussi Kivilinna }, { 2488e448370dSJussi Kivilinna .alg = "compress_null", 2489e448370dSJussi Kivilinna .test = alg_test_null, 2490e448370dSJussi Kivilinna }, { 2491ebb3472fSArd Biesheuvel .alg = "crc32", 2492ebb3472fSArd Biesheuvel .test = alg_test_hash, 2493ebb3472fSArd Biesheuvel .suite = { 2494ebb3472fSArd Biesheuvel .hash = { 2495ebb3472fSArd Biesheuvel .vecs = crc32_tv_template, 2496ebb3472fSArd Biesheuvel .count = CRC32_TEST_VECTORS 2497ebb3472fSArd Biesheuvel } 2498ebb3472fSArd Biesheuvel } 2499ebb3472fSArd Biesheuvel }, { 2500da7f033dSHerbert Xu .alg = "crc32c", 25018e3ee85eSHerbert Xu .test = alg_test_crc32c, 2502a1915d51SJarod Wilson .fips_allowed = 1, 2503da7f033dSHerbert Xu .suite = { 2504da7f033dSHerbert Xu .hash = { 2505da7f033dSHerbert Xu .vecs = crc32c_tv_template, 2506da7f033dSHerbert Xu .count = CRC32C_TEST_VECTORS 2507da7f033dSHerbert Xu } 2508da7f033dSHerbert Xu } 2509da7f033dSHerbert Xu }, { 251068411521SHerbert Xu .alg = "crct10dif", 251168411521SHerbert Xu .test = alg_test_hash, 251268411521SHerbert Xu .fips_allowed = 1, 251368411521SHerbert Xu .suite = { 251468411521SHerbert Xu .hash = { 251568411521SHerbert Xu .vecs = crct10dif_tv_template, 251668411521SHerbert Xu .count = CRCT10DIF_TEST_VECTORS 251768411521SHerbert Xu } 251868411521SHerbert Xu } 251968411521SHerbert Xu }, { 25206c79294fSMilan Broz .alg = "cryptd(__driver-cbc-aes-aesni)", 25216c79294fSMilan Broz .test = alg_test_null, 25226c79294fSMilan Broz .fips_allowed = 1, 25236c79294fSMilan Broz }, { 2524d9b1d2e7SJussi Kivilinna .alg = "cryptd(__driver-cbc-camellia-aesni)", 2525d9b1d2e7SJussi Kivilinna .test = alg_test_null, 2526d9b1d2e7SJussi Kivilinna }, { 2527f3f935a7SJussi Kivilinna .alg = "cryptd(__driver-cbc-camellia-aesni-avx2)", 2528f3f935a7SJussi Kivilinna .test = alg_test_null, 2529f3f935a7SJussi Kivilinna }, { 253056d76c96SJussi Kivilinna .alg = "cryptd(__driver-cbc-serpent-avx2)", 253156d76c96SJussi Kivilinna .test = alg_test_null, 253256d76c96SJussi Kivilinna }, { 2533863b557aSYouquan, Song .alg = "cryptd(__driver-ecb-aes-aesni)", 2534863b557aSYouquan, Song .test = alg_test_null, 25356c79294fSMilan Broz .fips_allowed = 1, 2536863b557aSYouquan, Song }, { 2537d9b1d2e7SJussi Kivilinna .alg = "cryptd(__driver-ecb-camellia-aesni)", 2538d9b1d2e7SJussi Kivilinna .test = alg_test_null, 2539d9b1d2e7SJussi Kivilinna }, { 2540f3f935a7SJussi Kivilinna .alg = "cryptd(__driver-ecb-camellia-aesni-avx2)", 2541f3f935a7SJussi Kivilinna .test = alg_test_null, 2542f3f935a7SJussi Kivilinna }, { 25434d6d6a2cSJohannes Goetzfried .alg = "cryptd(__driver-ecb-cast5-avx)", 25444d6d6a2cSJohannes Goetzfried .test = alg_test_null, 25454d6d6a2cSJohannes Goetzfried }, { 25464ea1277dSJohannes Goetzfried .alg = "cryptd(__driver-ecb-cast6-avx)", 25474ea1277dSJohannes Goetzfried .test = alg_test_null, 25484ea1277dSJohannes Goetzfried }, { 25497efe4076SJohannes Goetzfried .alg = "cryptd(__driver-ecb-serpent-avx)", 25507efe4076SJohannes Goetzfried .test = alg_test_null, 25517efe4076SJohannes Goetzfried }, { 255256d76c96SJussi Kivilinna .alg = "cryptd(__driver-ecb-serpent-avx2)", 255356d76c96SJussi Kivilinna .test = alg_test_null, 255456d76c96SJussi Kivilinna }, { 2555937c30d7SJussi Kivilinna .alg = "cryptd(__driver-ecb-serpent-sse2)", 2556937c30d7SJussi Kivilinna .test = alg_test_null, 2557937c30d7SJussi Kivilinna }, { 2558107778b5SJohannes Goetzfried .alg = "cryptd(__driver-ecb-twofish-avx)", 2559107778b5SJohannes Goetzfried .test = alg_test_null, 2560107778b5SJohannes Goetzfried }, { 25616c79294fSMilan Broz .alg = "cryptd(__driver-gcm-aes-aesni)", 25626c79294fSMilan Broz .test = alg_test_null, 25636c79294fSMilan Broz .fips_allowed = 1, 25646c79294fSMilan Broz }, { 2565863b557aSYouquan, Song .alg = "cryptd(__ghash-pclmulqdqni)", 2566863b557aSYouquan, Song .test = alg_test_null, 25676c79294fSMilan Broz .fips_allowed = 1, 2568863b557aSYouquan, Song }, { 2569f7cb80f2SJarod Wilson .alg = "ctr(aes)", 2570f7cb80f2SJarod Wilson .test = alg_test_skcipher, 2571a1915d51SJarod Wilson .fips_allowed = 1, 2572f7cb80f2SJarod Wilson .suite = { 2573f7cb80f2SJarod Wilson .cipher = { 2574f7cb80f2SJarod Wilson .enc = { 2575f7cb80f2SJarod Wilson .vecs = aes_ctr_enc_tv_template, 2576f7cb80f2SJarod Wilson .count = AES_CTR_ENC_TEST_VECTORS 2577f7cb80f2SJarod Wilson }, 2578f7cb80f2SJarod Wilson .dec = { 2579f7cb80f2SJarod Wilson .vecs = aes_ctr_dec_tv_template, 2580f7cb80f2SJarod Wilson .count = AES_CTR_DEC_TEST_VECTORS 2581f7cb80f2SJarod Wilson } 2582f7cb80f2SJarod Wilson } 2583f7cb80f2SJarod Wilson } 2584f7cb80f2SJarod Wilson }, { 258585b63e34SJussi Kivilinna .alg = "ctr(blowfish)", 258685b63e34SJussi Kivilinna .test = alg_test_skcipher, 258785b63e34SJussi Kivilinna .suite = { 258885b63e34SJussi Kivilinna .cipher = { 258985b63e34SJussi Kivilinna .enc = { 259085b63e34SJussi Kivilinna .vecs = bf_ctr_enc_tv_template, 259185b63e34SJussi Kivilinna .count = BF_CTR_ENC_TEST_VECTORS 259285b63e34SJussi Kivilinna }, 259385b63e34SJussi Kivilinna .dec = { 259485b63e34SJussi Kivilinna .vecs = bf_ctr_dec_tv_template, 259585b63e34SJussi Kivilinna .count = BF_CTR_DEC_TEST_VECTORS 259685b63e34SJussi Kivilinna } 259785b63e34SJussi Kivilinna } 259885b63e34SJussi Kivilinna } 259985b63e34SJussi Kivilinna }, { 26000840605eSJussi Kivilinna .alg = "ctr(camellia)", 26010840605eSJussi Kivilinna .test = alg_test_skcipher, 26020840605eSJussi Kivilinna .suite = { 26030840605eSJussi Kivilinna .cipher = { 26040840605eSJussi Kivilinna .enc = { 26050840605eSJussi Kivilinna .vecs = camellia_ctr_enc_tv_template, 26060840605eSJussi Kivilinna .count = CAMELLIA_CTR_ENC_TEST_VECTORS 26070840605eSJussi Kivilinna }, 26080840605eSJussi Kivilinna .dec = { 26090840605eSJussi Kivilinna .vecs = camellia_ctr_dec_tv_template, 26100840605eSJussi Kivilinna .count = CAMELLIA_CTR_DEC_TEST_VECTORS 26110840605eSJussi Kivilinna } 26120840605eSJussi Kivilinna } 26130840605eSJussi Kivilinna } 26140840605eSJussi Kivilinna }, { 2615a2c58260SJohannes Goetzfried .alg = "ctr(cast5)", 2616a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 2617a2c58260SJohannes Goetzfried .suite = { 2618a2c58260SJohannes Goetzfried .cipher = { 2619a2c58260SJohannes Goetzfried .enc = { 2620a2c58260SJohannes Goetzfried .vecs = cast5_ctr_enc_tv_template, 2621a2c58260SJohannes Goetzfried .count = CAST5_CTR_ENC_TEST_VECTORS 2622a2c58260SJohannes Goetzfried }, 2623a2c58260SJohannes Goetzfried .dec = { 2624a2c58260SJohannes Goetzfried .vecs = cast5_ctr_dec_tv_template, 2625a2c58260SJohannes Goetzfried .count = CAST5_CTR_DEC_TEST_VECTORS 2626a2c58260SJohannes Goetzfried } 2627a2c58260SJohannes Goetzfried } 2628a2c58260SJohannes Goetzfried } 2629a2c58260SJohannes Goetzfried }, { 26309b8b0405SJohannes Goetzfried .alg = "ctr(cast6)", 26319b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 26329b8b0405SJohannes Goetzfried .suite = { 26339b8b0405SJohannes Goetzfried .cipher = { 26349b8b0405SJohannes Goetzfried .enc = { 26359b8b0405SJohannes Goetzfried .vecs = cast6_ctr_enc_tv_template, 26369b8b0405SJohannes Goetzfried .count = CAST6_CTR_ENC_TEST_VECTORS 26379b8b0405SJohannes Goetzfried }, 26389b8b0405SJohannes Goetzfried .dec = { 26399b8b0405SJohannes Goetzfried .vecs = cast6_ctr_dec_tv_template, 26409b8b0405SJohannes Goetzfried .count = CAST6_CTR_DEC_TEST_VECTORS 26419b8b0405SJohannes Goetzfried } 26429b8b0405SJohannes Goetzfried } 26439b8b0405SJohannes Goetzfried } 26449b8b0405SJohannes Goetzfried }, { 26458163fc30SJussi Kivilinna .alg = "ctr(des)", 26468163fc30SJussi Kivilinna .test = alg_test_skcipher, 26478163fc30SJussi Kivilinna .suite = { 26488163fc30SJussi Kivilinna .cipher = { 26498163fc30SJussi Kivilinna .enc = { 26508163fc30SJussi Kivilinna .vecs = des_ctr_enc_tv_template, 26518163fc30SJussi Kivilinna .count = DES_CTR_ENC_TEST_VECTORS 26528163fc30SJussi Kivilinna }, 26538163fc30SJussi Kivilinna .dec = { 26548163fc30SJussi Kivilinna .vecs = des_ctr_dec_tv_template, 26558163fc30SJussi Kivilinna .count = DES_CTR_DEC_TEST_VECTORS 26568163fc30SJussi Kivilinna } 26578163fc30SJussi Kivilinna } 26588163fc30SJussi Kivilinna } 26598163fc30SJussi Kivilinna }, { 2660e080b17aSJussi Kivilinna .alg = "ctr(des3_ede)", 2661e080b17aSJussi Kivilinna .test = alg_test_skcipher, 2662e080b17aSJussi Kivilinna .suite = { 2663e080b17aSJussi Kivilinna .cipher = { 2664e080b17aSJussi Kivilinna .enc = { 2665e080b17aSJussi Kivilinna .vecs = des3_ede_ctr_enc_tv_template, 2666e080b17aSJussi Kivilinna .count = DES3_EDE_CTR_ENC_TEST_VECTORS 2667e080b17aSJussi Kivilinna }, 2668e080b17aSJussi Kivilinna .dec = { 2669e080b17aSJussi Kivilinna .vecs = des3_ede_ctr_dec_tv_template, 2670e080b17aSJussi Kivilinna .count = DES3_EDE_CTR_DEC_TEST_VECTORS 2671e080b17aSJussi Kivilinna } 2672e080b17aSJussi Kivilinna } 2673e080b17aSJussi Kivilinna } 2674e080b17aSJussi Kivilinna }, { 26759d25917dSJussi Kivilinna .alg = "ctr(serpent)", 26769d25917dSJussi Kivilinna .test = alg_test_skcipher, 26779d25917dSJussi Kivilinna .suite = { 26789d25917dSJussi Kivilinna .cipher = { 26799d25917dSJussi Kivilinna .enc = { 26809d25917dSJussi Kivilinna .vecs = serpent_ctr_enc_tv_template, 26819d25917dSJussi Kivilinna .count = SERPENT_CTR_ENC_TEST_VECTORS 26829d25917dSJussi Kivilinna }, 26839d25917dSJussi Kivilinna .dec = { 26849d25917dSJussi Kivilinna .vecs = serpent_ctr_dec_tv_template, 26859d25917dSJussi Kivilinna .count = SERPENT_CTR_DEC_TEST_VECTORS 26869d25917dSJussi Kivilinna } 26879d25917dSJussi Kivilinna } 26889d25917dSJussi Kivilinna } 26899d25917dSJussi Kivilinna }, { 2690573da620SJussi Kivilinna .alg = "ctr(twofish)", 2691573da620SJussi Kivilinna .test = alg_test_skcipher, 2692573da620SJussi Kivilinna .suite = { 2693573da620SJussi Kivilinna .cipher = { 2694573da620SJussi Kivilinna .enc = { 2695573da620SJussi Kivilinna .vecs = tf_ctr_enc_tv_template, 2696573da620SJussi Kivilinna .count = TF_CTR_ENC_TEST_VECTORS 2697573da620SJussi Kivilinna }, 2698573da620SJussi Kivilinna .dec = { 2699573da620SJussi Kivilinna .vecs = tf_ctr_dec_tv_template, 2700573da620SJussi Kivilinna .count = TF_CTR_DEC_TEST_VECTORS 2701573da620SJussi Kivilinna } 2702573da620SJussi Kivilinna } 2703573da620SJussi Kivilinna } 2704573da620SJussi Kivilinna }, { 2705da7f033dSHerbert Xu .alg = "cts(cbc(aes))", 27061aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2707da7f033dSHerbert Xu .suite = { 2708da7f033dSHerbert Xu .cipher = { 2709da7f033dSHerbert Xu .enc = { 2710da7f033dSHerbert Xu .vecs = cts_mode_enc_tv_template, 2711da7f033dSHerbert Xu .count = CTS_MODE_ENC_TEST_VECTORS 2712da7f033dSHerbert Xu }, 2713da7f033dSHerbert Xu .dec = { 2714da7f033dSHerbert Xu .vecs = cts_mode_dec_tv_template, 2715da7f033dSHerbert Xu .count = CTS_MODE_DEC_TEST_VECTORS 2716da7f033dSHerbert Xu } 2717da7f033dSHerbert Xu } 2718da7f033dSHerbert Xu } 2719da7f033dSHerbert Xu }, { 2720da7f033dSHerbert Xu .alg = "deflate", 2721da7f033dSHerbert Xu .test = alg_test_comp, 27220818904dSMilan Broz .fips_allowed = 1, 2723da7f033dSHerbert Xu .suite = { 2724da7f033dSHerbert Xu .comp = { 2725da7f033dSHerbert Xu .comp = { 2726da7f033dSHerbert Xu .vecs = deflate_comp_tv_template, 2727da7f033dSHerbert Xu .count = DEFLATE_COMP_TEST_VECTORS 2728da7f033dSHerbert Xu }, 2729da7f033dSHerbert Xu .decomp = { 2730da7f033dSHerbert Xu .vecs = deflate_decomp_tv_template, 2731da7f033dSHerbert Xu .count = DEFLATE_DECOMP_TEST_VECTORS 2732da7f033dSHerbert Xu } 2733da7f033dSHerbert Xu } 2734da7f033dSHerbert Xu } 2735da7f033dSHerbert Xu }, { 2736e448370dSJussi Kivilinna .alg = "digest_null", 2737e448370dSJussi Kivilinna .test = alg_test_null, 2738e448370dSJussi Kivilinna }, { 273964d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes128", 274064d1cdfbSStephan Mueller .test = alg_test_drbg, 274164d1cdfbSStephan Mueller .fips_allowed = 1, 274264d1cdfbSStephan Mueller .suite = { 274364d1cdfbSStephan Mueller .drbg = { 274464d1cdfbSStephan Mueller .vecs = drbg_nopr_ctr_aes128_tv_template, 274564d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_ctr_aes128_tv_template) 274664d1cdfbSStephan Mueller } 274764d1cdfbSStephan Mueller } 274864d1cdfbSStephan Mueller }, { 274964d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes192", 275064d1cdfbSStephan Mueller .test = alg_test_drbg, 275164d1cdfbSStephan Mueller .fips_allowed = 1, 275264d1cdfbSStephan Mueller .suite = { 275364d1cdfbSStephan Mueller .drbg = { 275464d1cdfbSStephan Mueller .vecs = drbg_nopr_ctr_aes192_tv_template, 275564d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_ctr_aes192_tv_template) 275664d1cdfbSStephan Mueller } 275764d1cdfbSStephan Mueller } 275864d1cdfbSStephan Mueller }, { 275964d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes256", 276064d1cdfbSStephan Mueller .test = alg_test_drbg, 276164d1cdfbSStephan Mueller .fips_allowed = 1, 276264d1cdfbSStephan Mueller .suite = { 276364d1cdfbSStephan Mueller .drbg = { 276464d1cdfbSStephan Mueller .vecs = drbg_nopr_ctr_aes256_tv_template, 276564d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_ctr_aes256_tv_template) 276664d1cdfbSStephan Mueller } 276764d1cdfbSStephan Mueller } 276864d1cdfbSStephan Mueller }, { 276964d1cdfbSStephan Mueller /* 277064d1cdfbSStephan Mueller * There is no need to specifically test the DRBG with every 277164d1cdfbSStephan Mueller * backend cipher -- covered by drbg_nopr_hmac_sha256 test 277264d1cdfbSStephan Mueller */ 277364d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha1", 277464d1cdfbSStephan Mueller .fips_allowed = 1, 277564d1cdfbSStephan Mueller .test = alg_test_null, 277664d1cdfbSStephan Mueller }, { 277764d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha256", 277864d1cdfbSStephan Mueller .test = alg_test_drbg, 277964d1cdfbSStephan Mueller .fips_allowed = 1, 278064d1cdfbSStephan Mueller .suite = { 278164d1cdfbSStephan Mueller .drbg = { 278264d1cdfbSStephan Mueller .vecs = drbg_nopr_hmac_sha256_tv_template, 278364d1cdfbSStephan Mueller .count = 278464d1cdfbSStephan Mueller ARRAY_SIZE(drbg_nopr_hmac_sha256_tv_template) 278564d1cdfbSStephan Mueller } 278664d1cdfbSStephan Mueller } 278764d1cdfbSStephan Mueller }, { 278864d1cdfbSStephan Mueller /* covered by drbg_nopr_hmac_sha256 test */ 278964d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha384", 279064d1cdfbSStephan Mueller .fips_allowed = 1, 279164d1cdfbSStephan Mueller .test = alg_test_null, 279264d1cdfbSStephan Mueller }, { 279364d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha512", 279464d1cdfbSStephan Mueller .test = alg_test_null, 279564d1cdfbSStephan Mueller .fips_allowed = 1, 279664d1cdfbSStephan Mueller }, { 279764d1cdfbSStephan Mueller .alg = "drbg_nopr_sha1", 279864d1cdfbSStephan Mueller .fips_allowed = 1, 279964d1cdfbSStephan Mueller .test = alg_test_null, 280064d1cdfbSStephan Mueller }, { 280164d1cdfbSStephan Mueller .alg = "drbg_nopr_sha256", 280264d1cdfbSStephan Mueller .test = alg_test_drbg, 280364d1cdfbSStephan Mueller .fips_allowed = 1, 280464d1cdfbSStephan Mueller .suite = { 280564d1cdfbSStephan Mueller .drbg = { 280664d1cdfbSStephan Mueller .vecs = drbg_nopr_sha256_tv_template, 280764d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_sha256_tv_template) 280864d1cdfbSStephan Mueller } 280964d1cdfbSStephan Mueller } 281064d1cdfbSStephan Mueller }, { 281164d1cdfbSStephan Mueller /* covered by drbg_nopr_sha256 test */ 281264d1cdfbSStephan Mueller .alg = "drbg_nopr_sha384", 281364d1cdfbSStephan Mueller .fips_allowed = 1, 281464d1cdfbSStephan Mueller .test = alg_test_null, 281564d1cdfbSStephan Mueller }, { 281664d1cdfbSStephan Mueller .alg = "drbg_nopr_sha512", 281764d1cdfbSStephan Mueller .fips_allowed = 1, 281864d1cdfbSStephan Mueller .test = alg_test_null, 281964d1cdfbSStephan Mueller }, { 282064d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes128", 282164d1cdfbSStephan Mueller .test = alg_test_drbg, 282264d1cdfbSStephan Mueller .fips_allowed = 1, 282364d1cdfbSStephan Mueller .suite = { 282464d1cdfbSStephan Mueller .drbg = { 282564d1cdfbSStephan Mueller .vecs = drbg_pr_ctr_aes128_tv_template, 282664d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_pr_ctr_aes128_tv_template) 282764d1cdfbSStephan Mueller } 282864d1cdfbSStephan Mueller } 282964d1cdfbSStephan Mueller }, { 283064d1cdfbSStephan Mueller /* covered by drbg_pr_ctr_aes128 test */ 283164d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes192", 283264d1cdfbSStephan Mueller .fips_allowed = 1, 283364d1cdfbSStephan Mueller .test = alg_test_null, 283464d1cdfbSStephan Mueller }, { 283564d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes256", 283664d1cdfbSStephan Mueller .fips_allowed = 1, 283764d1cdfbSStephan Mueller .test = alg_test_null, 283864d1cdfbSStephan Mueller }, { 283964d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha1", 284064d1cdfbSStephan Mueller .fips_allowed = 1, 284164d1cdfbSStephan Mueller .test = alg_test_null, 284264d1cdfbSStephan Mueller }, { 284364d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha256", 284464d1cdfbSStephan Mueller .test = alg_test_drbg, 284564d1cdfbSStephan Mueller .fips_allowed = 1, 284664d1cdfbSStephan Mueller .suite = { 284764d1cdfbSStephan Mueller .drbg = { 284864d1cdfbSStephan Mueller .vecs = drbg_pr_hmac_sha256_tv_template, 284964d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_pr_hmac_sha256_tv_template) 285064d1cdfbSStephan Mueller } 285164d1cdfbSStephan Mueller } 285264d1cdfbSStephan Mueller }, { 285364d1cdfbSStephan Mueller /* covered by drbg_pr_hmac_sha256 test */ 285464d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha384", 285564d1cdfbSStephan Mueller .fips_allowed = 1, 285664d1cdfbSStephan Mueller .test = alg_test_null, 285764d1cdfbSStephan Mueller }, { 285864d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha512", 285964d1cdfbSStephan Mueller .test = alg_test_null, 286064d1cdfbSStephan Mueller .fips_allowed = 1, 286164d1cdfbSStephan Mueller }, { 286264d1cdfbSStephan Mueller .alg = "drbg_pr_sha1", 286364d1cdfbSStephan Mueller .fips_allowed = 1, 286464d1cdfbSStephan Mueller .test = alg_test_null, 286564d1cdfbSStephan Mueller }, { 286664d1cdfbSStephan Mueller .alg = "drbg_pr_sha256", 286764d1cdfbSStephan Mueller .test = alg_test_drbg, 286864d1cdfbSStephan Mueller .fips_allowed = 1, 286964d1cdfbSStephan Mueller .suite = { 287064d1cdfbSStephan Mueller .drbg = { 287164d1cdfbSStephan Mueller .vecs = drbg_pr_sha256_tv_template, 287264d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_pr_sha256_tv_template) 287364d1cdfbSStephan Mueller } 287464d1cdfbSStephan Mueller } 287564d1cdfbSStephan Mueller }, { 287664d1cdfbSStephan Mueller /* covered by drbg_pr_sha256 test */ 287764d1cdfbSStephan Mueller .alg = "drbg_pr_sha384", 287864d1cdfbSStephan Mueller .fips_allowed = 1, 287964d1cdfbSStephan Mueller .test = alg_test_null, 288064d1cdfbSStephan Mueller }, { 288164d1cdfbSStephan Mueller .alg = "drbg_pr_sha512", 288264d1cdfbSStephan Mueller .fips_allowed = 1, 288364d1cdfbSStephan Mueller .test = alg_test_null, 288464d1cdfbSStephan Mueller }, { 2885863b557aSYouquan, Song .alg = "ecb(__aes-aesni)", 2886863b557aSYouquan, Song .test = alg_test_null, 28876c79294fSMilan Broz .fips_allowed = 1, 2888863b557aSYouquan, Song }, { 2889da7f033dSHerbert Xu .alg = "ecb(aes)", 28901aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2891a1915d51SJarod Wilson .fips_allowed = 1, 2892da7f033dSHerbert Xu .suite = { 2893da7f033dSHerbert Xu .cipher = { 2894da7f033dSHerbert Xu .enc = { 2895da7f033dSHerbert Xu .vecs = aes_enc_tv_template, 2896da7f033dSHerbert Xu .count = AES_ENC_TEST_VECTORS 2897da7f033dSHerbert Xu }, 2898da7f033dSHerbert Xu .dec = { 2899da7f033dSHerbert Xu .vecs = aes_dec_tv_template, 2900da7f033dSHerbert Xu .count = AES_DEC_TEST_VECTORS 2901da7f033dSHerbert Xu } 2902da7f033dSHerbert Xu } 2903da7f033dSHerbert Xu } 2904da7f033dSHerbert Xu }, { 2905da7f033dSHerbert Xu .alg = "ecb(anubis)", 29061aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2907da7f033dSHerbert Xu .suite = { 2908da7f033dSHerbert Xu .cipher = { 2909da7f033dSHerbert Xu .enc = { 2910da7f033dSHerbert Xu .vecs = anubis_enc_tv_template, 2911da7f033dSHerbert Xu .count = ANUBIS_ENC_TEST_VECTORS 2912da7f033dSHerbert Xu }, 2913da7f033dSHerbert Xu .dec = { 2914da7f033dSHerbert Xu .vecs = anubis_dec_tv_template, 2915da7f033dSHerbert Xu .count = ANUBIS_DEC_TEST_VECTORS 2916da7f033dSHerbert Xu } 2917da7f033dSHerbert Xu } 2918da7f033dSHerbert Xu } 2919da7f033dSHerbert Xu }, { 2920da7f033dSHerbert Xu .alg = "ecb(arc4)", 29211aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2922da7f033dSHerbert Xu .suite = { 2923da7f033dSHerbert Xu .cipher = { 2924da7f033dSHerbert Xu .enc = { 2925da7f033dSHerbert Xu .vecs = arc4_enc_tv_template, 2926da7f033dSHerbert Xu .count = ARC4_ENC_TEST_VECTORS 2927da7f033dSHerbert Xu }, 2928da7f033dSHerbert Xu .dec = { 2929da7f033dSHerbert Xu .vecs = arc4_dec_tv_template, 2930da7f033dSHerbert Xu .count = ARC4_DEC_TEST_VECTORS 2931da7f033dSHerbert Xu } 2932da7f033dSHerbert Xu } 2933da7f033dSHerbert Xu } 2934da7f033dSHerbert Xu }, { 2935da7f033dSHerbert Xu .alg = "ecb(blowfish)", 29361aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2937da7f033dSHerbert Xu .suite = { 2938da7f033dSHerbert Xu .cipher = { 2939da7f033dSHerbert Xu .enc = { 2940da7f033dSHerbert Xu .vecs = bf_enc_tv_template, 2941da7f033dSHerbert Xu .count = BF_ENC_TEST_VECTORS 2942da7f033dSHerbert Xu }, 2943da7f033dSHerbert Xu .dec = { 2944da7f033dSHerbert Xu .vecs = bf_dec_tv_template, 2945da7f033dSHerbert Xu .count = BF_DEC_TEST_VECTORS 2946da7f033dSHerbert Xu } 2947da7f033dSHerbert Xu } 2948da7f033dSHerbert Xu } 2949da7f033dSHerbert Xu }, { 2950da7f033dSHerbert Xu .alg = "ecb(camellia)", 29511aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2952da7f033dSHerbert Xu .suite = { 2953da7f033dSHerbert Xu .cipher = { 2954da7f033dSHerbert Xu .enc = { 2955da7f033dSHerbert Xu .vecs = camellia_enc_tv_template, 2956da7f033dSHerbert Xu .count = CAMELLIA_ENC_TEST_VECTORS 2957da7f033dSHerbert Xu }, 2958da7f033dSHerbert Xu .dec = { 2959da7f033dSHerbert Xu .vecs = camellia_dec_tv_template, 2960da7f033dSHerbert Xu .count = CAMELLIA_DEC_TEST_VECTORS 2961da7f033dSHerbert Xu } 2962da7f033dSHerbert Xu } 2963da7f033dSHerbert Xu } 2964da7f033dSHerbert Xu }, { 2965da7f033dSHerbert Xu .alg = "ecb(cast5)", 29661aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2967da7f033dSHerbert Xu .suite = { 2968da7f033dSHerbert Xu .cipher = { 2969da7f033dSHerbert Xu .enc = { 2970da7f033dSHerbert Xu .vecs = cast5_enc_tv_template, 2971da7f033dSHerbert Xu .count = CAST5_ENC_TEST_VECTORS 2972da7f033dSHerbert Xu }, 2973da7f033dSHerbert Xu .dec = { 2974da7f033dSHerbert Xu .vecs = cast5_dec_tv_template, 2975da7f033dSHerbert Xu .count = CAST5_DEC_TEST_VECTORS 2976da7f033dSHerbert Xu } 2977da7f033dSHerbert Xu } 2978da7f033dSHerbert Xu } 2979da7f033dSHerbert Xu }, { 2980da7f033dSHerbert Xu .alg = "ecb(cast6)", 29811aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2982da7f033dSHerbert Xu .suite = { 2983da7f033dSHerbert Xu .cipher = { 2984da7f033dSHerbert Xu .enc = { 2985da7f033dSHerbert Xu .vecs = cast6_enc_tv_template, 2986da7f033dSHerbert Xu .count = CAST6_ENC_TEST_VECTORS 2987da7f033dSHerbert Xu }, 2988da7f033dSHerbert Xu .dec = { 2989da7f033dSHerbert Xu .vecs = cast6_dec_tv_template, 2990da7f033dSHerbert Xu .count = CAST6_DEC_TEST_VECTORS 2991da7f033dSHerbert Xu } 2992da7f033dSHerbert Xu } 2993da7f033dSHerbert Xu } 2994da7f033dSHerbert Xu }, { 2995e448370dSJussi Kivilinna .alg = "ecb(cipher_null)", 2996e448370dSJussi Kivilinna .test = alg_test_null, 2997e448370dSJussi Kivilinna }, { 2998da7f033dSHerbert Xu .alg = "ecb(des)", 29991aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3000da7f033dSHerbert Xu .suite = { 3001da7f033dSHerbert Xu .cipher = { 3002da7f033dSHerbert Xu .enc = { 3003da7f033dSHerbert Xu .vecs = des_enc_tv_template, 3004da7f033dSHerbert Xu .count = DES_ENC_TEST_VECTORS 3005da7f033dSHerbert Xu }, 3006da7f033dSHerbert Xu .dec = { 3007da7f033dSHerbert Xu .vecs = des_dec_tv_template, 3008da7f033dSHerbert Xu .count = DES_DEC_TEST_VECTORS 3009da7f033dSHerbert Xu } 3010da7f033dSHerbert Xu } 3011da7f033dSHerbert Xu } 3012da7f033dSHerbert Xu }, { 3013da7f033dSHerbert Xu .alg = "ecb(des3_ede)", 30141aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3015a1915d51SJarod Wilson .fips_allowed = 1, 3016da7f033dSHerbert Xu .suite = { 3017da7f033dSHerbert Xu .cipher = { 3018da7f033dSHerbert Xu .enc = { 3019da7f033dSHerbert Xu .vecs = des3_ede_enc_tv_template, 3020da7f033dSHerbert Xu .count = DES3_EDE_ENC_TEST_VECTORS 3021da7f033dSHerbert Xu }, 3022da7f033dSHerbert Xu .dec = { 3023da7f033dSHerbert Xu .vecs = des3_ede_dec_tv_template, 3024da7f033dSHerbert Xu .count = DES3_EDE_DEC_TEST_VECTORS 3025da7f033dSHerbert Xu } 3026da7f033dSHerbert Xu } 3027da7f033dSHerbert Xu } 3028da7f033dSHerbert Xu }, { 302966e5bd00SJussi Kivilinna .alg = "ecb(fcrypt)", 303066e5bd00SJussi Kivilinna .test = alg_test_skcipher, 303166e5bd00SJussi Kivilinna .suite = { 303266e5bd00SJussi Kivilinna .cipher = { 303366e5bd00SJussi Kivilinna .enc = { 303466e5bd00SJussi Kivilinna .vecs = fcrypt_pcbc_enc_tv_template, 303566e5bd00SJussi Kivilinna .count = 1 303666e5bd00SJussi Kivilinna }, 303766e5bd00SJussi Kivilinna .dec = { 303866e5bd00SJussi Kivilinna .vecs = fcrypt_pcbc_dec_tv_template, 303966e5bd00SJussi Kivilinna .count = 1 304066e5bd00SJussi Kivilinna } 304166e5bd00SJussi Kivilinna } 304266e5bd00SJussi Kivilinna } 304366e5bd00SJussi Kivilinna }, { 3044da7f033dSHerbert Xu .alg = "ecb(khazad)", 30451aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3046da7f033dSHerbert Xu .suite = { 3047da7f033dSHerbert Xu .cipher = { 3048da7f033dSHerbert Xu .enc = { 3049da7f033dSHerbert Xu .vecs = khazad_enc_tv_template, 3050da7f033dSHerbert Xu .count = KHAZAD_ENC_TEST_VECTORS 3051da7f033dSHerbert Xu }, 3052da7f033dSHerbert Xu .dec = { 3053da7f033dSHerbert Xu .vecs = khazad_dec_tv_template, 3054da7f033dSHerbert Xu .count = KHAZAD_DEC_TEST_VECTORS 3055da7f033dSHerbert Xu } 3056da7f033dSHerbert Xu } 3057da7f033dSHerbert Xu } 3058da7f033dSHerbert Xu }, { 3059da7f033dSHerbert Xu .alg = "ecb(seed)", 30601aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3061da7f033dSHerbert Xu .suite = { 3062da7f033dSHerbert Xu .cipher = { 3063da7f033dSHerbert Xu .enc = { 3064da7f033dSHerbert Xu .vecs = seed_enc_tv_template, 3065da7f033dSHerbert Xu .count = SEED_ENC_TEST_VECTORS 3066da7f033dSHerbert Xu }, 3067da7f033dSHerbert Xu .dec = { 3068da7f033dSHerbert Xu .vecs = seed_dec_tv_template, 3069da7f033dSHerbert Xu .count = SEED_DEC_TEST_VECTORS 3070da7f033dSHerbert Xu } 3071da7f033dSHerbert Xu } 3072da7f033dSHerbert Xu } 3073da7f033dSHerbert Xu }, { 3074da7f033dSHerbert Xu .alg = "ecb(serpent)", 30751aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3076da7f033dSHerbert Xu .suite = { 3077da7f033dSHerbert Xu .cipher = { 3078da7f033dSHerbert Xu .enc = { 3079da7f033dSHerbert Xu .vecs = serpent_enc_tv_template, 3080da7f033dSHerbert Xu .count = SERPENT_ENC_TEST_VECTORS 3081da7f033dSHerbert Xu }, 3082da7f033dSHerbert Xu .dec = { 3083da7f033dSHerbert Xu .vecs = serpent_dec_tv_template, 3084da7f033dSHerbert Xu .count = SERPENT_DEC_TEST_VECTORS 3085da7f033dSHerbert Xu } 3086da7f033dSHerbert Xu } 3087da7f033dSHerbert Xu } 3088da7f033dSHerbert Xu }, { 3089da7f033dSHerbert Xu .alg = "ecb(tea)", 30901aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3091da7f033dSHerbert Xu .suite = { 3092da7f033dSHerbert Xu .cipher = { 3093da7f033dSHerbert Xu .enc = { 3094da7f033dSHerbert Xu .vecs = tea_enc_tv_template, 3095da7f033dSHerbert Xu .count = TEA_ENC_TEST_VECTORS 3096da7f033dSHerbert Xu }, 3097da7f033dSHerbert Xu .dec = { 3098da7f033dSHerbert Xu .vecs = tea_dec_tv_template, 3099da7f033dSHerbert Xu .count = TEA_DEC_TEST_VECTORS 3100da7f033dSHerbert Xu } 3101da7f033dSHerbert Xu } 3102da7f033dSHerbert Xu } 3103da7f033dSHerbert Xu }, { 3104da7f033dSHerbert Xu .alg = "ecb(tnepres)", 31051aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3106da7f033dSHerbert Xu .suite = { 3107da7f033dSHerbert Xu .cipher = { 3108da7f033dSHerbert Xu .enc = { 3109da7f033dSHerbert Xu .vecs = tnepres_enc_tv_template, 3110da7f033dSHerbert Xu .count = TNEPRES_ENC_TEST_VECTORS 3111da7f033dSHerbert Xu }, 3112da7f033dSHerbert Xu .dec = { 3113da7f033dSHerbert Xu .vecs = tnepres_dec_tv_template, 3114da7f033dSHerbert Xu .count = TNEPRES_DEC_TEST_VECTORS 3115da7f033dSHerbert Xu } 3116da7f033dSHerbert Xu } 3117da7f033dSHerbert Xu } 3118da7f033dSHerbert Xu }, { 3119da7f033dSHerbert Xu .alg = "ecb(twofish)", 31201aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3121da7f033dSHerbert Xu .suite = { 3122da7f033dSHerbert Xu .cipher = { 3123da7f033dSHerbert Xu .enc = { 3124da7f033dSHerbert Xu .vecs = tf_enc_tv_template, 3125da7f033dSHerbert Xu .count = TF_ENC_TEST_VECTORS 3126da7f033dSHerbert Xu }, 3127da7f033dSHerbert Xu .dec = { 3128da7f033dSHerbert Xu .vecs = tf_dec_tv_template, 3129da7f033dSHerbert Xu .count = TF_DEC_TEST_VECTORS 3130da7f033dSHerbert Xu } 3131da7f033dSHerbert Xu } 3132da7f033dSHerbert Xu } 3133da7f033dSHerbert Xu }, { 3134da7f033dSHerbert Xu .alg = "ecb(xeta)", 31351aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3136da7f033dSHerbert Xu .suite = { 3137da7f033dSHerbert Xu .cipher = { 3138da7f033dSHerbert Xu .enc = { 3139da7f033dSHerbert Xu .vecs = xeta_enc_tv_template, 3140da7f033dSHerbert Xu .count = XETA_ENC_TEST_VECTORS 3141da7f033dSHerbert Xu }, 3142da7f033dSHerbert Xu .dec = { 3143da7f033dSHerbert Xu .vecs = xeta_dec_tv_template, 3144da7f033dSHerbert Xu .count = XETA_DEC_TEST_VECTORS 3145da7f033dSHerbert Xu } 3146da7f033dSHerbert Xu } 3147da7f033dSHerbert Xu } 3148da7f033dSHerbert Xu }, { 3149da7f033dSHerbert Xu .alg = "ecb(xtea)", 31501aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3151da7f033dSHerbert Xu .suite = { 3152da7f033dSHerbert Xu .cipher = { 3153da7f033dSHerbert Xu .enc = { 3154da7f033dSHerbert Xu .vecs = xtea_enc_tv_template, 3155da7f033dSHerbert Xu .count = XTEA_ENC_TEST_VECTORS 3156da7f033dSHerbert Xu }, 3157da7f033dSHerbert Xu .dec = { 3158da7f033dSHerbert Xu .vecs = xtea_dec_tv_template, 3159da7f033dSHerbert Xu .count = XTEA_DEC_TEST_VECTORS 3160da7f033dSHerbert Xu } 3161da7f033dSHerbert Xu } 3162da7f033dSHerbert Xu } 3163da7f033dSHerbert Xu }, { 3164da7f033dSHerbert Xu .alg = "gcm(aes)", 3165da7f033dSHerbert Xu .test = alg_test_aead, 3166a1915d51SJarod Wilson .fips_allowed = 1, 3167da7f033dSHerbert Xu .suite = { 3168da7f033dSHerbert Xu .aead = { 3169da7f033dSHerbert Xu .enc = { 3170da7f033dSHerbert Xu .vecs = aes_gcm_enc_tv_template, 3171da7f033dSHerbert Xu .count = AES_GCM_ENC_TEST_VECTORS 3172da7f033dSHerbert Xu }, 3173da7f033dSHerbert Xu .dec = { 3174da7f033dSHerbert Xu .vecs = aes_gcm_dec_tv_template, 3175da7f033dSHerbert Xu .count = AES_GCM_DEC_TEST_VECTORS 3176da7f033dSHerbert Xu } 3177da7f033dSHerbert Xu } 3178da7f033dSHerbert Xu } 3179da7f033dSHerbert Xu }, { 3180507069c9SYouquan, Song .alg = "ghash", 3181507069c9SYouquan, Song .test = alg_test_hash, 318218c0ebd2SJarod Wilson .fips_allowed = 1, 3183507069c9SYouquan, Song .suite = { 3184507069c9SYouquan, Song .hash = { 3185507069c9SYouquan, Song .vecs = ghash_tv_template, 3186507069c9SYouquan, Song .count = GHASH_TEST_VECTORS 3187507069c9SYouquan, Song } 3188507069c9SYouquan, Song } 3189507069c9SYouquan, Song }, { 3190a482b081SSonic Zhang .alg = "hmac(crc32)", 3191a482b081SSonic Zhang .test = alg_test_hash, 3192a482b081SSonic Zhang .suite = { 3193a482b081SSonic Zhang .hash = { 3194a482b081SSonic Zhang .vecs = bfin_crc_tv_template, 3195a482b081SSonic Zhang .count = BFIN_CRC_TEST_VECTORS 3196a482b081SSonic Zhang } 3197a482b081SSonic Zhang } 3198a482b081SSonic Zhang }, { 3199da7f033dSHerbert Xu .alg = "hmac(md5)", 3200da7f033dSHerbert Xu .test = alg_test_hash, 3201da7f033dSHerbert Xu .suite = { 3202da7f033dSHerbert Xu .hash = { 3203da7f033dSHerbert Xu .vecs = hmac_md5_tv_template, 3204da7f033dSHerbert Xu .count = HMAC_MD5_TEST_VECTORS 3205da7f033dSHerbert Xu } 3206da7f033dSHerbert Xu } 3207da7f033dSHerbert Xu }, { 3208da7f033dSHerbert Xu .alg = "hmac(rmd128)", 3209da7f033dSHerbert Xu .test = alg_test_hash, 3210da7f033dSHerbert Xu .suite = { 3211da7f033dSHerbert Xu .hash = { 3212da7f033dSHerbert Xu .vecs = hmac_rmd128_tv_template, 3213da7f033dSHerbert Xu .count = HMAC_RMD128_TEST_VECTORS 3214da7f033dSHerbert Xu } 3215da7f033dSHerbert Xu } 3216da7f033dSHerbert Xu }, { 3217da7f033dSHerbert Xu .alg = "hmac(rmd160)", 3218da7f033dSHerbert Xu .test = alg_test_hash, 3219da7f033dSHerbert Xu .suite = { 3220da7f033dSHerbert Xu .hash = { 3221da7f033dSHerbert Xu .vecs = hmac_rmd160_tv_template, 3222da7f033dSHerbert Xu .count = HMAC_RMD160_TEST_VECTORS 3223da7f033dSHerbert Xu } 3224da7f033dSHerbert Xu } 3225da7f033dSHerbert Xu }, { 3226da7f033dSHerbert Xu .alg = "hmac(sha1)", 3227da7f033dSHerbert Xu .test = alg_test_hash, 3228a1915d51SJarod Wilson .fips_allowed = 1, 3229da7f033dSHerbert Xu .suite = { 3230da7f033dSHerbert Xu .hash = { 3231da7f033dSHerbert Xu .vecs = hmac_sha1_tv_template, 3232da7f033dSHerbert Xu .count = HMAC_SHA1_TEST_VECTORS 3233da7f033dSHerbert Xu } 3234da7f033dSHerbert Xu } 3235da7f033dSHerbert Xu }, { 3236da7f033dSHerbert Xu .alg = "hmac(sha224)", 3237da7f033dSHerbert Xu .test = alg_test_hash, 3238a1915d51SJarod Wilson .fips_allowed = 1, 3239da7f033dSHerbert Xu .suite = { 3240da7f033dSHerbert Xu .hash = { 3241da7f033dSHerbert Xu .vecs = hmac_sha224_tv_template, 3242da7f033dSHerbert Xu .count = HMAC_SHA224_TEST_VECTORS 3243da7f033dSHerbert Xu } 3244da7f033dSHerbert Xu } 3245da7f033dSHerbert Xu }, { 3246da7f033dSHerbert Xu .alg = "hmac(sha256)", 3247da7f033dSHerbert Xu .test = alg_test_hash, 3248a1915d51SJarod Wilson .fips_allowed = 1, 3249da7f033dSHerbert Xu .suite = { 3250da7f033dSHerbert Xu .hash = { 3251da7f033dSHerbert Xu .vecs = hmac_sha256_tv_template, 3252da7f033dSHerbert Xu .count = HMAC_SHA256_TEST_VECTORS 3253da7f033dSHerbert Xu } 3254da7f033dSHerbert Xu } 3255da7f033dSHerbert Xu }, { 3256da7f033dSHerbert Xu .alg = "hmac(sha384)", 3257da7f033dSHerbert Xu .test = alg_test_hash, 3258a1915d51SJarod Wilson .fips_allowed = 1, 3259da7f033dSHerbert Xu .suite = { 3260da7f033dSHerbert Xu .hash = { 3261da7f033dSHerbert Xu .vecs = hmac_sha384_tv_template, 3262da7f033dSHerbert Xu .count = HMAC_SHA384_TEST_VECTORS 3263da7f033dSHerbert Xu } 3264da7f033dSHerbert Xu } 3265da7f033dSHerbert Xu }, { 3266da7f033dSHerbert Xu .alg = "hmac(sha512)", 3267da7f033dSHerbert Xu .test = alg_test_hash, 3268a1915d51SJarod Wilson .fips_allowed = 1, 3269da7f033dSHerbert Xu .suite = { 3270da7f033dSHerbert Xu .hash = { 3271da7f033dSHerbert Xu .vecs = hmac_sha512_tv_template, 3272da7f033dSHerbert Xu .count = HMAC_SHA512_TEST_VECTORS 3273da7f033dSHerbert Xu } 3274da7f033dSHerbert Xu } 3275da7f033dSHerbert Xu }, { 3276bb5530e4SStephan Mueller .alg = "jitterentropy_rng", 3277bb5530e4SStephan Mueller .fips_allowed = 1, 3278bb5530e4SStephan Mueller .test = alg_test_null, 3279bb5530e4SStephan Mueller }, { 3280da7f033dSHerbert Xu .alg = "lrw(aes)", 32811aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3282da7f033dSHerbert Xu .suite = { 3283da7f033dSHerbert Xu .cipher = { 3284da7f033dSHerbert Xu .enc = { 3285da7f033dSHerbert Xu .vecs = aes_lrw_enc_tv_template, 3286da7f033dSHerbert Xu .count = AES_LRW_ENC_TEST_VECTORS 3287da7f033dSHerbert Xu }, 3288da7f033dSHerbert Xu .dec = { 3289da7f033dSHerbert Xu .vecs = aes_lrw_dec_tv_template, 3290da7f033dSHerbert Xu .count = AES_LRW_DEC_TEST_VECTORS 3291da7f033dSHerbert Xu } 3292da7f033dSHerbert Xu } 3293da7f033dSHerbert Xu } 3294da7f033dSHerbert Xu }, { 32950840605eSJussi Kivilinna .alg = "lrw(camellia)", 32960840605eSJussi Kivilinna .test = alg_test_skcipher, 32970840605eSJussi Kivilinna .suite = { 32980840605eSJussi Kivilinna .cipher = { 32990840605eSJussi Kivilinna .enc = { 33000840605eSJussi Kivilinna .vecs = camellia_lrw_enc_tv_template, 33010840605eSJussi Kivilinna .count = CAMELLIA_LRW_ENC_TEST_VECTORS 33020840605eSJussi Kivilinna }, 33030840605eSJussi Kivilinna .dec = { 33040840605eSJussi Kivilinna .vecs = camellia_lrw_dec_tv_template, 33050840605eSJussi Kivilinna .count = CAMELLIA_LRW_DEC_TEST_VECTORS 33060840605eSJussi Kivilinna } 33070840605eSJussi Kivilinna } 33080840605eSJussi Kivilinna } 33090840605eSJussi Kivilinna }, { 33109b8b0405SJohannes Goetzfried .alg = "lrw(cast6)", 33119b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 33129b8b0405SJohannes Goetzfried .suite = { 33139b8b0405SJohannes Goetzfried .cipher = { 33149b8b0405SJohannes Goetzfried .enc = { 33159b8b0405SJohannes Goetzfried .vecs = cast6_lrw_enc_tv_template, 33169b8b0405SJohannes Goetzfried .count = CAST6_LRW_ENC_TEST_VECTORS 33179b8b0405SJohannes Goetzfried }, 33189b8b0405SJohannes Goetzfried .dec = { 33199b8b0405SJohannes Goetzfried .vecs = cast6_lrw_dec_tv_template, 33209b8b0405SJohannes Goetzfried .count = CAST6_LRW_DEC_TEST_VECTORS 33219b8b0405SJohannes Goetzfried } 33229b8b0405SJohannes Goetzfried } 33239b8b0405SJohannes Goetzfried } 33249b8b0405SJohannes Goetzfried }, { 3325d7bfc0faSJussi Kivilinna .alg = "lrw(serpent)", 3326d7bfc0faSJussi Kivilinna .test = alg_test_skcipher, 3327d7bfc0faSJussi Kivilinna .suite = { 3328d7bfc0faSJussi Kivilinna .cipher = { 3329d7bfc0faSJussi Kivilinna .enc = { 3330d7bfc0faSJussi Kivilinna .vecs = serpent_lrw_enc_tv_template, 3331d7bfc0faSJussi Kivilinna .count = SERPENT_LRW_ENC_TEST_VECTORS 3332d7bfc0faSJussi Kivilinna }, 3333d7bfc0faSJussi Kivilinna .dec = { 3334d7bfc0faSJussi Kivilinna .vecs = serpent_lrw_dec_tv_template, 3335d7bfc0faSJussi Kivilinna .count = SERPENT_LRW_DEC_TEST_VECTORS 3336d7bfc0faSJussi Kivilinna } 3337d7bfc0faSJussi Kivilinna } 3338d7bfc0faSJussi Kivilinna } 3339d7bfc0faSJussi Kivilinna }, { 33400b2a1551SJussi Kivilinna .alg = "lrw(twofish)", 33410b2a1551SJussi Kivilinna .test = alg_test_skcipher, 33420b2a1551SJussi Kivilinna .suite = { 33430b2a1551SJussi Kivilinna .cipher = { 33440b2a1551SJussi Kivilinna .enc = { 33450b2a1551SJussi Kivilinna .vecs = tf_lrw_enc_tv_template, 33460b2a1551SJussi Kivilinna .count = TF_LRW_ENC_TEST_VECTORS 33470b2a1551SJussi Kivilinna }, 33480b2a1551SJussi Kivilinna .dec = { 33490b2a1551SJussi Kivilinna .vecs = tf_lrw_dec_tv_template, 33500b2a1551SJussi Kivilinna .count = TF_LRW_DEC_TEST_VECTORS 33510b2a1551SJussi Kivilinna } 33520b2a1551SJussi Kivilinna } 33530b2a1551SJussi Kivilinna } 33540b2a1551SJussi Kivilinna }, { 33551443cc9bSKOVACS Krisztian .alg = "lz4", 33561443cc9bSKOVACS Krisztian .test = alg_test_comp, 33571443cc9bSKOVACS Krisztian .fips_allowed = 1, 33581443cc9bSKOVACS Krisztian .suite = { 33591443cc9bSKOVACS Krisztian .comp = { 33601443cc9bSKOVACS Krisztian .comp = { 33611443cc9bSKOVACS Krisztian .vecs = lz4_comp_tv_template, 33621443cc9bSKOVACS Krisztian .count = LZ4_COMP_TEST_VECTORS 33631443cc9bSKOVACS Krisztian }, 33641443cc9bSKOVACS Krisztian .decomp = { 33651443cc9bSKOVACS Krisztian .vecs = lz4_decomp_tv_template, 33661443cc9bSKOVACS Krisztian .count = LZ4_DECOMP_TEST_VECTORS 33671443cc9bSKOVACS Krisztian } 33681443cc9bSKOVACS Krisztian } 33691443cc9bSKOVACS Krisztian } 33701443cc9bSKOVACS Krisztian }, { 33711443cc9bSKOVACS Krisztian .alg = "lz4hc", 33721443cc9bSKOVACS Krisztian .test = alg_test_comp, 33731443cc9bSKOVACS Krisztian .fips_allowed = 1, 33741443cc9bSKOVACS Krisztian .suite = { 33751443cc9bSKOVACS Krisztian .comp = { 33761443cc9bSKOVACS Krisztian .comp = { 33771443cc9bSKOVACS Krisztian .vecs = lz4hc_comp_tv_template, 33781443cc9bSKOVACS Krisztian .count = LZ4HC_COMP_TEST_VECTORS 33791443cc9bSKOVACS Krisztian }, 33801443cc9bSKOVACS Krisztian .decomp = { 33811443cc9bSKOVACS Krisztian .vecs = lz4hc_decomp_tv_template, 33821443cc9bSKOVACS Krisztian .count = LZ4HC_DECOMP_TEST_VECTORS 33831443cc9bSKOVACS Krisztian } 33841443cc9bSKOVACS Krisztian } 33851443cc9bSKOVACS Krisztian } 33861443cc9bSKOVACS Krisztian }, { 3387da7f033dSHerbert Xu .alg = "lzo", 3388da7f033dSHerbert Xu .test = alg_test_comp, 33890818904dSMilan Broz .fips_allowed = 1, 3390da7f033dSHerbert Xu .suite = { 3391da7f033dSHerbert Xu .comp = { 3392da7f033dSHerbert Xu .comp = { 3393da7f033dSHerbert Xu .vecs = lzo_comp_tv_template, 3394da7f033dSHerbert Xu .count = LZO_COMP_TEST_VECTORS 3395da7f033dSHerbert Xu }, 3396da7f033dSHerbert Xu .decomp = { 3397da7f033dSHerbert Xu .vecs = lzo_decomp_tv_template, 3398da7f033dSHerbert Xu .count = LZO_DECOMP_TEST_VECTORS 3399da7f033dSHerbert Xu } 3400da7f033dSHerbert Xu } 3401da7f033dSHerbert Xu } 3402da7f033dSHerbert Xu }, { 3403da7f033dSHerbert Xu .alg = "md4", 3404da7f033dSHerbert Xu .test = alg_test_hash, 3405da7f033dSHerbert Xu .suite = { 3406da7f033dSHerbert Xu .hash = { 3407da7f033dSHerbert Xu .vecs = md4_tv_template, 3408da7f033dSHerbert Xu .count = MD4_TEST_VECTORS 3409da7f033dSHerbert Xu } 3410da7f033dSHerbert Xu } 3411da7f033dSHerbert Xu }, { 3412da7f033dSHerbert Xu .alg = "md5", 3413da7f033dSHerbert Xu .test = alg_test_hash, 3414da7f033dSHerbert Xu .suite = { 3415da7f033dSHerbert Xu .hash = { 3416da7f033dSHerbert Xu .vecs = md5_tv_template, 3417da7f033dSHerbert Xu .count = MD5_TEST_VECTORS 3418da7f033dSHerbert Xu } 3419da7f033dSHerbert Xu } 3420da7f033dSHerbert Xu }, { 3421da7f033dSHerbert Xu .alg = "michael_mic", 3422da7f033dSHerbert Xu .test = alg_test_hash, 3423da7f033dSHerbert Xu .suite = { 3424da7f033dSHerbert Xu .hash = { 3425da7f033dSHerbert Xu .vecs = michael_mic_tv_template, 3426da7f033dSHerbert Xu .count = MICHAEL_MIC_TEST_VECTORS 3427da7f033dSHerbert Xu } 3428da7f033dSHerbert Xu } 3429da7f033dSHerbert Xu }, { 3430ba0e14acSPuneet Saxena .alg = "ofb(aes)", 3431ba0e14acSPuneet Saxena .test = alg_test_skcipher, 3432ba0e14acSPuneet Saxena .fips_allowed = 1, 3433ba0e14acSPuneet Saxena .suite = { 3434ba0e14acSPuneet Saxena .cipher = { 3435ba0e14acSPuneet Saxena .enc = { 3436ba0e14acSPuneet Saxena .vecs = aes_ofb_enc_tv_template, 3437ba0e14acSPuneet Saxena .count = AES_OFB_ENC_TEST_VECTORS 3438ba0e14acSPuneet Saxena }, 3439ba0e14acSPuneet Saxena .dec = { 3440ba0e14acSPuneet Saxena .vecs = aes_ofb_dec_tv_template, 3441ba0e14acSPuneet Saxena .count = AES_OFB_DEC_TEST_VECTORS 3442ba0e14acSPuneet Saxena } 3443ba0e14acSPuneet Saxena } 3444ba0e14acSPuneet Saxena } 3445ba0e14acSPuneet Saxena }, { 3446da7f033dSHerbert Xu .alg = "pcbc(fcrypt)", 34471aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3448da7f033dSHerbert Xu .suite = { 3449da7f033dSHerbert Xu .cipher = { 3450da7f033dSHerbert Xu .enc = { 3451da7f033dSHerbert Xu .vecs = fcrypt_pcbc_enc_tv_template, 3452da7f033dSHerbert Xu .count = FCRYPT_ENC_TEST_VECTORS 3453da7f033dSHerbert Xu }, 3454da7f033dSHerbert Xu .dec = { 3455da7f033dSHerbert Xu .vecs = fcrypt_pcbc_dec_tv_template, 3456da7f033dSHerbert Xu .count = FCRYPT_DEC_TEST_VECTORS 3457da7f033dSHerbert Xu } 3458da7f033dSHerbert Xu } 3459da7f033dSHerbert Xu } 3460da7f033dSHerbert Xu }, { 3461eee9dc61SMartin Willi .alg = "poly1305", 3462eee9dc61SMartin Willi .test = alg_test_hash, 3463eee9dc61SMartin Willi .suite = { 3464eee9dc61SMartin Willi .hash = { 3465eee9dc61SMartin Willi .vecs = poly1305_tv_template, 3466eee9dc61SMartin Willi .count = POLY1305_TEST_VECTORS 3467eee9dc61SMartin Willi } 3468eee9dc61SMartin Willi } 3469eee9dc61SMartin Willi }, { 3470da7f033dSHerbert Xu .alg = "rfc3686(ctr(aes))", 34711aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3472a1915d51SJarod Wilson .fips_allowed = 1, 3473da7f033dSHerbert Xu .suite = { 3474da7f033dSHerbert Xu .cipher = { 3475da7f033dSHerbert Xu .enc = { 3476f7cb80f2SJarod Wilson .vecs = aes_ctr_rfc3686_enc_tv_template, 3477f7cb80f2SJarod Wilson .count = AES_CTR_3686_ENC_TEST_VECTORS 3478da7f033dSHerbert Xu }, 3479da7f033dSHerbert Xu .dec = { 3480f7cb80f2SJarod Wilson .vecs = aes_ctr_rfc3686_dec_tv_template, 3481f7cb80f2SJarod Wilson .count = AES_CTR_3686_DEC_TEST_VECTORS 3482da7f033dSHerbert Xu } 3483da7f033dSHerbert Xu } 3484da7f033dSHerbert Xu } 3485da7f033dSHerbert Xu }, { 34863f31a740SHerbert Xu .alg = "rfc4106(gcm(aes))", 348769435b94SAdrian Hoban .test = alg_test_aead, 3488db71f29aSJarod Wilson .fips_allowed = 1, 348969435b94SAdrian Hoban .suite = { 349069435b94SAdrian Hoban .aead = { 349169435b94SAdrian Hoban .enc = { 349269435b94SAdrian Hoban .vecs = aes_gcm_rfc4106_enc_tv_template, 349369435b94SAdrian Hoban .count = AES_GCM_4106_ENC_TEST_VECTORS 349469435b94SAdrian Hoban }, 349569435b94SAdrian Hoban .dec = { 349669435b94SAdrian Hoban .vecs = aes_gcm_rfc4106_dec_tv_template, 349769435b94SAdrian Hoban .count = AES_GCM_4106_DEC_TEST_VECTORS 349869435b94SAdrian Hoban } 349969435b94SAdrian Hoban } 350069435b94SAdrian Hoban } 350169435b94SAdrian Hoban }, { 3502544c436aSHerbert Xu .alg = "rfc4309(ccm(aes))", 35035d667322SJarod Wilson .test = alg_test_aead, 3504a1915d51SJarod Wilson .fips_allowed = 1, 35055d667322SJarod Wilson .suite = { 35065d667322SJarod Wilson .aead = { 35075d667322SJarod Wilson .enc = { 35085d667322SJarod Wilson .vecs = aes_ccm_rfc4309_enc_tv_template, 35095d667322SJarod Wilson .count = AES_CCM_4309_ENC_TEST_VECTORS 35105d667322SJarod Wilson }, 35115d667322SJarod Wilson .dec = { 35125d667322SJarod Wilson .vecs = aes_ccm_rfc4309_dec_tv_template, 35135d667322SJarod Wilson .count = AES_CCM_4309_DEC_TEST_VECTORS 35145d667322SJarod Wilson } 35155d667322SJarod Wilson } 35165d667322SJarod Wilson } 35175d667322SJarod Wilson }, { 3518bb68745eSHerbert Xu .alg = "rfc4543(gcm(aes))", 3519e9b7441aSJussi Kivilinna .test = alg_test_aead, 3520e9b7441aSJussi Kivilinna .suite = { 3521e9b7441aSJussi Kivilinna .aead = { 3522e9b7441aSJussi Kivilinna .enc = { 3523e9b7441aSJussi Kivilinna .vecs = aes_gcm_rfc4543_enc_tv_template, 3524e9b7441aSJussi Kivilinna .count = AES_GCM_4543_ENC_TEST_VECTORS 3525e9b7441aSJussi Kivilinna }, 3526e9b7441aSJussi Kivilinna .dec = { 3527e9b7441aSJussi Kivilinna .vecs = aes_gcm_rfc4543_dec_tv_template, 3528e9b7441aSJussi Kivilinna .count = AES_GCM_4543_DEC_TEST_VECTORS 3529e9b7441aSJussi Kivilinna }, 3530e9b7441aSJussi Kivilinna } 3531e9b7441aSJussi Kivilinna } 3532e9b7441aSJussi Kivilinna }, { 3533af2b76b5SMartin Willi .alg = "rfc7539(chacha20,poly1305)", 3534af2b76b5SMartin Willi .test = alg_test_aead, 3535af2b76b5SMartin Willi .suite = { 3536af2b76b5SMartin Willi .aead = { 3537af2b76b5SMartin Willi .enc = { 3538af2b76b5SMartin Willi .vecs = rfc7539_enc_tv_template, 3539af2b76b5SMartin Willi .count = RFC7539_ENC_TEST_VECTORS 3540af2b76b5SMartin Willi }, 3541af2b76b5SMartin Willi .dec = { 3542af2b76b5SMartin Willi .vecs = rfc7539_dec_tv_template, 3543af2b76b5SMartin Willi .count = RFC7539_DEC_TEST_VECTORS 3544af2b76b5SMartin Willi }, 3545af2b76b5SMartin Willi } 3546af2b76b5SMartin Willi } 3547af2b76b5SMartin Willi }, { 35485900758dSMartin Willi .alg = "rfc7539esp(chacha20,poly1305)", 35495900758dSMartin Willi .test = alg_test_aead, 35505900758dSMartin Willi .suite = { 35515900758dSMartin Willi .aead = { 35525900758dSMartin Willi .enc = { 35535900758dSMartin Willi .vecs = rfc7539esp_enc_tv_template, 35545900758dSMartin Willi .count = RFC7539ESP_ENC_TEST_VECTORS 35555900758dSMartin Willi }, 35565900758dSMartin Willi .dec = { 35575900758dSMartin Willi .vecs = rfc7539esp_dec_tv_template, 35585900758dSMartin Willi .count = RFC7539ESP_DEC_TEST_VECTORS 35595900758dSMartin Willi }, 35605900758dSMartin Willi } 35615900758dSMartin Willi } 35625900758dSMartin Willi }, { 3563da7f033dSHerbert Xu .alg = "rmd128", 3564da7f033dSHerbert Xu .test = alg_test_hash, 3565da7f033dSHerbert Xu .suite = { 3566da7f033dSHerbert Xu .hash = { 3567da7f033dSHerbert Xu .vecs = rmd128_tv_template, 3568da7f033dSHerbert Xu .count = RMD128_TEST_VECTORS 3569da7f033dSHerbert Xu } 3570da7f033dSHerbert Xu } 3571da7f033dSHerbert Xu }, { 3572da7f033dSHerbert Xu .alg = "rmd160", 3573da7f033dSHerbert Xu .test = alg_test_hash, 3574da7f033dSHerbert Xu .suite = { 3575da7f033dSHerbert Xu .hash = { 3576da7f033dSHerbert Xu .vecs = rmd160_tv_template, 3577da7f033dSHerbert Xu .count = RMD160_TEST_VECTORS 3578da7f033dSHerbert Xu } 3579da7f033dSHerbert Xu } 3580da7f033dSHerbert Xu }, { 3581da7f033dSHerbert Xu .alg = "rmd256", 3582da7f033dSHerbert Xu .test = alg_test_hash, 3583da7f033dSHerbert Xu .suite = { 3584da7f033dSHerbert Xu .hash = { 3585da7f033dSHerbert Xu .vecs = rmd256_tv_template, 3586da7f033dSHerbert Xu .count = RMD256_TEST_VECTORS 3587da7f033dSHerbert Xu } 3588da7f033dSHerbert Xu } 3589da7f033dSHerbert Xu }, { 3590da7f033dSHerbert Xu .alg = "rmd320", 3591da7f033dSHerbert Xu .test = alg_test_hash, 3592da7f033dSHerbert Xu .suite = { 3593da7f033dSHerbert Xu .hash = { 3594da7f033dSHerbert Xu .vecs = rmd320_tv_template, 3595da7f033dSHerbert Xu .count = RMD320_TEST_VECTORS 3596da7f033dSHerbert Xu } 3597da7f033dSHerbert Xu } 3598da7f033dSHerbert Xu }, { 3599946cc463STadeusz Struk .alg = "rsa", 3600946cc463STadeusz Struk .test = alg_test_akcipher, 3601946cc463STadeusz Struk .fips_allowed = 1, 3602946cc463STadeusz Struk .suite = { 3603946cc463STadeusz Struk .akcipher = { 3604946cc463STadeusz Struk .vecs = rsa_tv_template, 3605946cc463STadeusz Struk .count = RSA_TEST_VECTORS 3606946cc463STadeusz Struk } 3607946cc463STadeusz Struk } 3608946cc463STadeusz Struk }, { 3609da7f033dSHerbert Xu .alg = "salsa20", 36101aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3611da7f033dSHerbert Xu .suite = { 3612da7f033dSHerbert Xu .cipher = { 3613da7f033dSHerbert Xu .enc = { 3614da7f033dSHerbert Xu .vecs = salsa20_stream_enc_tv_template, 3615da7f033dSHerbert Xu .count = SALSA20_STREAM_ENC_TEST_VECTORS 3616da7f033dSHerbert Xu } 3617da7f033dSHerbert Xu } 3618da7f033dSHerbert Xu } 3619da7f033dSHerbert Xu }, { 3620da7f033dSHerbert Xu .alg = "sha1", 3621da7f033dSHerbert Xu .test = alg_test_hash, 3622a1915d51SJarod Wilson .fips_allowed = 1, 3623da7f033dSHerbert Xu .suite = { 3624da7f033dSHerbert Xu .hash = { 3625da7f033dSHerbert Xu .vecs = sha1_tv_template, 3626da7f033dSHerbert Xu .count = SHA1_TEST_VECTORS 3627da7f033dSHerbert Xu } 3628da7f033dSHerbert Xu } 3629da7f033dSHerbert Xu }, { 3630da7f033dSHerbert Xu .alg = "sha224", 3631da7f033dSHerbert Xu .test = alg_test_hash, 3632a1915d51SJarod Wilson .fips_allowed = 1, 3633da7f033dSHerbert Xu .suite = { 3634da7f033dSHerbert Xu .hash = { 3635da7f033dSHerbert Xu .vecs = sha224_tv_template, 3636da7f033dSHerbert Xu .count = SHA224_TEST_VECTORS 3637da7f033dSHerbert Xu } 3638da7f033dSHerbert Xu } 3639da7f033dSHerbert Xu }, { 3640da7f033dSHerbert Xu .alg = "sha256", 3641da7f033dSHerbert Xu .test = alg_test_hash, 3642a1915d51SJarod Wilson .fips_allowed = 1, 3643da7f033dSHerbert Xu .suite = { 3644da7f033dSHerbert Xu .hash = { 3645da7f033dSHerbert Xu .vecs = sha256_tv_template, 3646da7f033dSHerbert Xu .count = SHA256_TEST_VECTORS 3647da7f033dSHerbert Xu } 3648da7f033dSHerbert Xu } 3649da7f033dSHerbert Xu }, { 3650da7f033dSHerbert Xu .alg = "sha384", 3651da7f033dSHerbert Xu .test = alg_test_hash, 3652a1915d51SJarod Wilson .fips_allowed = 1, 3653da7f033dSHerbert Xu .suite = { 3654da7f033dSHerbert Xu .hash = { 3655da7f033dSHerbert Xu .vecs = sha384_tv_template, 3656da7f033dSHerbert Xu .count = SHA384_TEST_VECTORS 3657da7f033dSHerbert Xu } 3658da7f033dSHerbert Xu } 3659da7f033dSHerbert Xu }, { 3660da7f033dSHerbert Xu .alg = "sha512", 3661da7f033dSHerbert Xu .test = alg_test_hash, 3662a1915d51SJarod Wilson .fips_allowed = 1, 3663da7f033dSHerbert Xu .suite = { 3664da7f033dSHerbert Xu .hash = { 3665da7f033dSHerbert Xu .vecs = sha512_tv_template, 3666da7f033dSHerbert Xu .count = SHA512_TEST_VECTORS 3667da7f033dSHerbert Xu } 3668da7f033dSHerbert Xu } 3669da7f033dSHerbert Xu }, { 3670da7f033dSHerbert Xu .alg = "tgr128", 3671da7f033dSHerbert Xu .test = alg_test_hash, 3672da7f033dSHerbert Xu .suite = { 3673da7f033dSHerbert Xu .hash = { 3674da7f033dSHerbert Xu .vecs = tgr128_tv_template, 3675da7f033dSHerbert Xu .count = TGR128_TEST_VECTORS 3676da7f033dSHerbert Xu } 3677da7f033dSHerbert Xu } 3678da7f033dSHerbert Xu }, { 3679da7f033dSHerbert Xu .alg = "tgr160", 3680da7f033dSHerbert Xu .test = alg_test_hash, 3681da7f033dSHerbert Xu .suite = { 3682da7f033dSHerbert Xu .hash = { 3683da7f033dSHerbert Xu .vecs = tgr160_tv_template, 3684da7f033dSHerbert Xu .count = TGR160_TEST_VECTORS 3685da7f033dSHerbert Xu } 3686da7f033dSHerbert Xu } 3687da7f033dSHerbert Xu }, { 3688da7f033dSHerbert Xu .alg = "tgr192", 3689da7f033dSHerbert Xu .test = alg_test_hash, 3690da7f033dSHerbert Xu .suite = { 3691da7f033dSHerbert Xu .hash = { 3692da7f033dSHerbert Xu .vecs = tgr192_tv_template, 3693da7f033dSHerbert Xu .count = TGR192_TEST_VECTORS 3694da7f033dSHerbert Xu } 3695da7f033dSHerbert Xu } 3696da7f033dSHerbert Xu }, { 3697f1939f7cSShane Wang .alg = "vmac(aes)", 3698f1939f7cSShane Wang .test = alg_test_hash, 3699f1939f7cSShane Wang .suite = { 3700f1939f7cSShane Wang .hash = { 3701f1939f7cSShane Wang .vecs = aes_vmac128_tv_template, 3702f1939f7cSShane Wang .count = VMAC_AES_TEST_VECTORS 3703f1939f7cSShane Wang } 3704f1939f7cSShane Wang } 3705f1939f7cSShane Wang }, { 3706da7f033dSHerbert Xu .alg = "wp256", 3707da7f033dSHerbert Xu .test = alg_test_hash, 3708da7f033dSHerbert Xu .suite = { 3709da7f033dSHerbert Xu .hash = { 3710da7f033dSHerbert Xu .vecs = wp256_tv_template, 3711da7f033dSHerbert Xu .count = WP256_TEST_VECTORS 3712da7f033dSHerbert Xu } 3713da7f033dSHerbert Xu } 3714da7f033dSHerbert Xu }, { 3715da7f033dSHerbert Xu .alg = "wp384", 3716da7f033dSHerbert Xu .test = alg_test_hash, 3717da7f033dSHerbert Xu .suite = { 3718da7f033dSHerbert Xu .hash = { 3719da7f033dSHerbert Xu .vecs = wp384_tv_template, 3720da7f033dSHerbert Xu .count = WP384_TEST_VECTORS 3721da7f033dSHerbert Xu } 3722da7f033dSHerbert Xu } 3723da7f033dSHerbert Xu }, { 3724da7f033dSHerbert Xu .alg = "wp512", 3725da7f033dSHerbert Xu .test = alg_test_hash, 3726da7f033dSHerbert Xu .suite = { 3727da7f033dSHerbert Xu .hash = { 3728da7f033dSHerbert Xu .vecs = wp512_tv_template, 3729da7f033dSHerbert Xu .count = WP512_TEST_VECTORS 3730da7f033dSHerbert Xu } 3731da7f033dSHerbert Xu } 3732da7f033dSHerbert Xu }, { 3733da7f033dSHerbert Xu .alg = "xcbc(aes)", 3734da7f033dSHerbert Xu .test = alg_test_hash, 3735da7f033dSHerbert Xu .suite = { 3736da7f033dSHerbert Xu .hash = { 3737da7f033dSHerbert Xu .vecs = aes_xcbc128_tv_template, 3738da7f033dSHerbert Xu .count = XCBC_AES_TEST_VECTORS 3739da7f033dSHerbert Xu } 3740da7f033dSHerbert Xu } 3741da7f033dSHerbert Xu }, { 3742da7f033dSHerbert Xu .alg = "xts(aes)", 37431aa4ecd9SHerbert Xu .test = alg_test_skcipher, 37442918aa8dSJarod Wilson .fips_allowed = 1, 3745da7f033dSHerbert Xu .suite = { 3746da7f033dSHerbert Xu .cipher = { 3747da7f033dSHerbert Xu .enc = { 3748da7f033dSHerbert Xu .vecs = aes_xts_enc_tv_template, 3749da7f033dSHerbert Xu .count = AES_XTS_ENC_TEST_VECTORS 3750da7f033dSHerbert Xu }, 3751da7f033dSHerbert Xu .dec = { 3752da7f033dSHerbert Xu .vecs = aes_xts_dec_tv_template, 3753da7f033dSHerbert Xu .count = AES_XTS_DEC_TEST_VECTORS 3754da7f033dSHerbert Xu } 3755da7f033dSHerbert Xu } 3756da7f033dSHerbert Xu } 37570c01aed5SGeert Uytterhoeven }, { 37580840605eSJussi Kivilinna .alg = "xts(camellia)", 37590840605eSJussi Kivilinna .test = alg_test_skcipher, 37600840605eSJussi Kivilinna .suite = { 37610840605eSJussi Kivilinna .cipher = { 37620840605eSJussi Kivilinna .enc = { 37630840605eSJussi Kivilinna .vecs = camellia_xts_enc_tv_template, 37640840605eSJussi Kivilinna .count = CAMELLIA_XTS_ENC_TEST_VECTORS 37650840605eSJussi Kivilinna }, 37660840605eSJussi Kivilinna .dec = { 37670840605eSJussi Kivilinna .vecs = camellia_xts_dec_tv_template, 37680840605eSJussi Kivilinna .count = CAMELLIA_XTS_DEC_TEST_VECTORS 37690840605eSJussi Kivilinna } 37700840605eSJussi Kivilinna } 37710840605eSJussi Kivilinna } 37720840605eSJussi Kivilinna }, { 37739b8b0405SJohannes Goetzfried .alg = "xts(cast6)", 37749b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 37759b8b0405SJohannes Goetzfried .suite = { 37769b8b0405SJohannes Goetzfried .cipher = { 37779b8b0405SJohannes Goetzfried .enc = { 37789b8b0405SJohannes Goetzfried .vecs = cast6_xts_enc_tv_template, 37799b8b0405SJohannes Goetzfried .count = CAST6_XTS_ENC_TEST_VECTORS 37809b8b0405SJohannes Goetzfried }, 37819b8b0405SJohannes Goetzfried .dec = { 37829b8b0405SJohannes Goetzfried .vecs = cast6_xts_dec_tv_template, 37839b8b0405SJohannes Goetzfried .count = CAST6_XTS_DEC_TEST_VECTORS 37849b8b0405SJohannes Goetzfried } 37859b8b0405SJohannes Goetzfried } 37869b8b0405SJohannes Goetzfried } 37879b8b0405SJohannes Goetzfried }, { 378818be20b9SJussi Kivilinna .alg = "xts(serpent)", 378918be20b9SJussi Kivilinna .test = alg_test_skcipher, 379018be20b9SJussi Kivilinna .suite = { 379118be20b9SJussi Kivilinna .cipher = { 379218be20b9SJussi Kivilinna .enc = { 379318be20b9SJussi Kivilinna .vecs = serpent_xts_enc_tv_template, 379418be20b9SJussi Kivilinna .count = SERPENT_XTS_ENC_TEST_VECTORS 379518be20b9SJussi Kivilinna }, 379618be20b9SJussi Kivilinna .dec = { 379718be20b9SJussi Kivilinna .vecs = serpent_xts_dec_tv_template, 379818be20b9SJussi Kivilinna .count = SERPENT_XTS_DEC_TEST_VECTORS 379918be20b9SJussi Kivilinna } 380018be20b9SJussi Kivilinna } 380118be20b9SJussi Kivilinna } 380218be20b9SJussi Kivilinna }, { 3803aed265b9SJussi Kivilinna .alg = "xts(twofish)", 3804aed265b9SJussi Kivilinna .test = alg_test_skcipher, 3805aed265b9SJussi Kivilinna .suite = { 3806aed265b9SJussi Kivilinna .cipher = { 3807aed265b9SJussi Kivilinna .enc = { 3808aed265b9SJussi Kivilinna .vecs = tf_xts_enc_tv_template, 3809aed265b9SJussi Kivilinna .count = TF_XTS_ENC_TEST_VECTORS 3810aed265b9SJussi Kivilinna }, 3811aed265b9SJussi Kivilinna .dec = { 3812aed265b9SJussi Kivilinna .vecs = tf_xts_dec_tv_template, 3813aed265b9SJussi Kivilinna .count = TF_XTS_DEC_TEST_VECTORS 3814aed265b9SJussi Kivilinna } 3815aed265b9SJussi Kivilinna } 3816aed265b9SJussi Kivilinna } 3817aed265b9SJussi Kivilinna }, { 38180c01aed5SGeert Uytterhoeven .alg = "zlib", 38190c01aed5SGeert Uytterhoeven .test = alg_test_pcomp, 38200818904dSMilan Broz .fips_allowed = 1, 38210c01aed5SGeert Uytterhoeven .suite = { 38220c01aed5SGeert Uytterhoeven .pcomp = { 38230c01aed5SGeert Uytterhoeven .comp = { 38240c01aed5SGeert Uytterhoeven .vecs = zlib_comp_tv_template, 38250c01aed5SGeert Uytterhoeven .count = ZLIB_COMP_TEST_VECTORS 38260c01aed5SGeert Uytterhoeven }, 38270c01aed5SGeert Uytterhoeven .decomp = { 38280c01aed5SGeert Uytterhoeven .vecs = zlib_decomp_tv_template, 38290c01aed5SGeert Uytterhoeven .count = ZLIB_DECOMP_TEST_VECTORS 38300c01aed5SGeert Uytterhoeven } 38310c01aed5SGeert Uytterhoeven } 38320c01aed5SGeert Uytterhoeven } 3833da7f033dSHerbert Xu } 3834da7f033dSHerbert Xu }; 3835da7f033dSHerbert Xu 38365714758bSJussi Kivilinna static bool alg_test_descs_checked; 38375714758bSJussi Kivilinna 38385714758bSJussi Kivilinna static void alg_test_descs_check_order(void) 38395714758bSJussi Kivilinna { 38405714758bSJussi Kivilinna int i; 38415714758bSJussi Kivilinna 38425714758bSJussi Kivilinna /* only check once */ 38435714758bSJussi Kivilinna if (alg_test_descs_checked) 38445714758bSJussi Kivilinna return; 38455714758bSJussi Kivilinna 38465714758bSJussi Kivilinna alg_test_descs_checked = true; 38475714758bSJussi Kivilinna 38485714758bSJussi Kivilinna for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) { 38495714758bSJussi Kivilinna int diff = strcmp(alg_test_descs[i - 1].alg, 38505714758bSJussi Kivilinna alg_test_descs[i].alg); 38515714758bSJussi Kivilinna 38525714758bSJussi Kivilinna if (WARN_ON(diff > 0)) { 38535714758bSJussi Kivilinna pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n", 38545714758bSJussi Kivilinna alg_test_descs[i - 1].alg, 38555714758bSJussi Kivilinna alg_test_descs[i].alg); 38565714758bSJussi Kivilinna } 38575714758bSJussi Kivilinna 38585714758bSJussi Kivilinna if (WARN_ON(diff == 0)) { 38595714758bSJussi Kivilinna pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n", 38605714758bSJussi Kivilinna alg_test_descs[i].alg); 38615714758bSJussi Kivilinna } 38625714758bSJussi Kivilinna } 38635714758bSJussi Kivilinna } 38645714758bSJussi Kivilinna 38651aa4ecd9SHerbert Xu static int alg_find_test(const char *alg) 3866da7f033dSHerbert Xu { 3867da7f033dSHerbert Xu int start = 0; 3868da7f033dSHerbert Xu int end = ARRAY_SIZE(alg_test_descs); 3869da7f033dSHerbert Xu 3870da7f033dSHerbert Xu while (start < end) { 3871da7f033dSHerbert Xu int i = (start + end) / 2; 3872da7f033dSHerbert Xu int diff = strcmp(alg_test_descs[i].alg, alg); 3873da7f033dSHerbert Xu 3874da7f033dSHerbert Xu if (diff > 0) { 3875da7f033dSHerbert Xu end = i; 3876da7f033dSHerbert Xu continue; 3877da7f033dSHerbert Xu } 3878da7f033dSHerbert Xu 3879da7f033dSHerbert Xu if (diff < 0) { 3880da7f033dSHerbert Xu start = i + 1; 3881da7f033dSHerbert Xu continue; 3882da7f033dSHerbert Xu } 3883da7f033dSHerbert Xu 38841aa4ecd9SHerbert Xu return i; 3885da7f033dSHerbert Xu } 3886da7f033dSHerbert Xu 38871aa4ecd9SHerbert Xu return -1; 38881aa4ecd9SHerbert Xu } 38891aa4ecd9SHerbert Xu 38901aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 38911aa4ecd9SHerbert Xu { 38921aa4ecd9SHerbert Xu int i; 3893a68f6610SHerbert Xu int j; 3894d12d6b6dSNeil Horman int rc; 38951aa4ecd9SHerbert Xu 38965714758bSJussi Kivilinna alg_test_descs_check_order(); 38975714758bSJussi Kivilinna 38981aa4ecd9SHerbert Xu if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) { 38991aa4ecd9SHerbert Xu char nalg[CRYPTO_MAX_ALG_NAME]; 39001aa4ecd9SHerbert Xu 39011aa4ecd9SHerbert Xu if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >= 39021aa4ecd9SHerbert Xu sizeof(nalg)) 39031aa4ecd9SHerbert Xu return -ENAMETOOLONG; 39041aa4ecd9SHerbert Xu 39051aa4ecd9SHerbert Xu i = alg_find_test(nalg); 39061aa4ecd9SHerbert Xu if (i < 0) 39071aa4ecd9SHerbert Xu goto notest; 39081aa4ecd9SHerbert Xu 3909a3bef3a3SJarod Wilson if (fips_enabled && !alg_test_descs[i].fips_allowed) 3910a3bef3a3SJarod Wilson goto non_fips_alg; 3911a3bef3a3SJarod Wilson 3912941fb328SJarod Wilson rc = alg_test_cipher(alg_test_descs + i, driver, type, mask); 3913941fb328SJarod Wilson goto test_done; 39141aa4ecd9SHerbert Xu } 39151aa4ecd9SHerbert Xu 39161aa4ecd9SHerbert Xu i = alg_find_test(alg); 3917a68f6610SHerbert Xu j = alg_find_test(driver); 3918a68f6610SHerbert Xu if (i < 0 && j < 0) 39191aa4ecd9SHerbert Xu goto notest; 39201aa4ecd9SHerbert Xu 3921a68f6610SHerbert Xu if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) || 3922a68f6610SHerbert Xu (j >= 0 && !alg_test_descs[j].fips_allowed))) 3923a3bef3a3SJarod Wilson goto non_fips_alg; 3924a3bef3a3SJarod Wilson 3925a68f6610SHerbert Xu rc = 0; 3926a68f6610SHerbert Xu if (i >= 0) 3927a68f6610SHerbert Xu rc |= alg_test_descs[i].test(alg_test_descs + i, driver, 39281aa4ecd9SHerbert Xu type, mask); 3929032c8cacSCristian Stoica if (j >= 0 && j != i) 3930a68f6610SHerbert Xu rc |= alg_test_descs[j].test(alg_test_descs + j, driver, 3931a68f6610SHerbert Xu type, mask); 3932a68f6610SHerbert Xu 3933941fb328SJarod Wilson test_done: 3934d12d6b6dSNeil Horman if (fips_enabled && rc) 3935d12d6b6dSNeil Horman panic("%s: %s alg self test failed in fips mode!\n", driver, alg); 3936d12d6b6dSNeil Horman 393729ecd4abSJarod Wilson if (fips_enabled && !rc) 39383e8cffd4SMasanari Iida pr_info("alg: self-tests for %s (%s) passed\n", driver, alg); 393929ecd4abSJarod Wilson 3940d12d6b6dSNeil Horman return rc; 39411aa4ecd9SHerbert Xu 39421aa4ecd9SHerbert Xu notest: 3943da7f033dSHerbert Xu printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver); 3944da7f033dSHerbert Xu return 0; 3945a3bef3a3SJarod Wilson non_fips_alg: 3946a3bef3a3SJarod Wilson return -EINVAL; 3947da7f033dSHerbert Xu } 39480b767f96SAlexander Shishkin 3949326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */ 39500b767f96SAlexander Shishkin 3951da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test); 3952