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 23da7f033dSHerbert Xu #include <crypto/hash.h> 24da7f033dSHerbert Xu #include <linux/err.h> 251c41b882SHerbert Xu #include <linux/fips.h> 26da7f033dSHerbert Xu #include <linux/module.h> 27da7f033dSHerbert Xu #include <linux/scatterlist.h> 28da7f033dSHerbert Xu #include <linux/slab.h> 29da7f033dSHerbert Xu #include <linux/string.h> 307647d6ceSJarod Wilson #include <crypto/rng.h> 3164d1cdfbSStephan Mueller #include <crypto/drbg.h> 32da7f033dSHerbert Xu 33da7f033dSHerbert Xu #include "internal.h" 340b767f96SAlexander Shishkin 35326a6346SHerbert Xu #ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS 360b767f96SAlexander Shishkin 370b767f96SAlexander Shishkin /* a perfect nop */ 380b767f96SAlexander Shishkin int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 390b767f96SAlexander Shishkin { 400b767f96SAlexander Shishkin return 0; 410b767f96SAlexander Shishkin } 420b767f96SAlexander Shishkin 430b767f96SAlexander Shishkin #else 440b767f96SAlexander Shishkin 45da7f033dSHerbert Xu #include "testmgr.h" 46da7f033dSHerbert Xu 47da7f033dSHerbert Xu /* 48da7f033dSHerbert Xu * Need slab memory for testing (size in number of pages). 49da7f033dSHerbert Xu */ 50da7f033dSHerbert Xu #define XBUFSIZE 8 51da7f033dSHerbert Xu 52da7f033dSHerbert Xu /* 53da7f033dSHerbert Xu * Indexes into the xbuf to simulate cross-page access. 54da7f033dSHerbert Xu */ 55da7f033dSHerbert Xu #define IDX1 32 56da7f033dSHerbert Xu #define IDX2 32400 57da7f033dSHerbert Xu #define IDX3 1 58da7f033dSHerbert Xu #define IDX4 8193 59da7f033dSHerbert Xu #define IDX5 22222 60da7f033dSHerbert Xu #define IDX6 17101 61da7f033dSHerbert Xu #define IDX7 27333 62da7f033dSHerbert Xu #define IDX8 3000 63da7f033dSHerbert Xu 64da7f033dSHerbert Xu /* 65da7f033dSHerbert Xu * Used by test_cipher() 66da7f033dSHerbert Xu */ 67da7f033dSHerbert Xu #define ENCRYPT 1 68da7f033dSHerbert Xu #define DECRYPT 0 69da7f033dSHerbert Xu 70da7f033dSHerbert Xu struct tcrypt_result { 71da7f033dSHerbert Xu struct completion completion; 72da7f033dSHerbert Xu int err; 73da7f033dSHerbert Xu }; 74da7f033dSHerbert Xu 75da7f033dSHerbert Xu struct aead_test_suite { 76da7f033dSHerbert Xu struct { 77da7f033dSHerbert Xu struct aead_testvec *vecs; 78da7f033dSHerbert Xu unsigned int count; 79da7f033dSHerbert Xu } enc, dec; 80da7f033dSHerbert Xu }; 81da7f033dSHerbert Xu 82da7f033dSHerbert Xu struct cipher_test_suite { 83da7f033dSHerbert Xu struct { 84da7f033dSHerbert Xu struct cipher_testvec *vecs; 85da7f033dSHerbert Xu unsigned int count; 86da7f033dSHerbert Xu } enc, dec; 87da7f033dSHerbert Xu }; 88da7f033dSHerbert Xu 89da7f033dSHerbert Xu struct comp_test_suite { 90da7f033dSHerbert Xu struct { 91da7f033dSHerbert Xu struct comp_testvec *vecs; 92da7f033dSHerbert Xu unsigned int count; 93da7f033dSHerbert Xu } comp, decomp; 94da7f033dSHerbert Xu }; 95da7f033dSHerbert Xu 968064efb8SGeert Uytterhoeven struct pcomp_test_suite { 978064efb8SGeert Uytterhoeven struct { 988064efb8SGeert Uytterhoeven struct pcomp_testvec *vecs; 998064efb8SGeert Uytterhoeven unsigned int count; 1008064efb8SGeert Uytterhoeven } comp, decomp; 1018064efb8SGeert Uytterhoeven }; 1028064efb8SGeert Uytterhoeven 103da7f033dSHerbert Xu struct hash_test_suite { 104da7f033dSHerbert Xu struct hash_testvec *vecs; 105da7f033dSHerbert Xu unsigned int count; 106da7f033dSHerbert Xu }; 107da7f033dSHerbert Xu 1087647d6ceSJarod Wilson struct cprng_test_suite { 1097647d6ceSJarod Wilson struct cprng_testvec *vecs; 1107647d6ceSJarod Wilson unsigned int count; 1117647d6ceSJarod Wilson }; 1127647d6ceSJarod Wilson 11364d1cdfbSStephan Mueller struct drbg_test_suite { 11464d1cdfbSStephan Mueller struct drbg_testvec *vecs; 11564d1cdfbSStephan Mueller unsigned int count; 11664d1cdfbSStephan Mueller }; 11764d1cdfbSStephan Mueller 118da7f033dSHerbert Xu struct alg_test_desc { 119da7f033dSHerbert Xu const char *alg; 120da7f033dSHerbert Xu int (*test)(const struct alg_test_desc *desc, const char *driver, 121da7f033dSHerbert Xu u32 type, u32 mask); 122a1915d51SJarod Wilson int fips_allowed; /* set if alg is allowed in fips mode */ 123da7f033dSHerbert Xu 124da7f033dSHerbert Xu union { 125da7f033dSHerbert Xu struct aead_test_suite aead; 126da7f033dSHerbert Xu struct cipher_test_suite cipher; 127da7f033dSHerbert Xu struct comp_test_suite comp; 1288064efb8SGeert Uytterhoeven struct pcomp_test_suite pcomp; 129da7f033dSHerbert Xu struct hash_test_suite hash; 1307647d6ceSJarod Wilson struct cprng_test_suite cprng; 13164d1cdfbSStephan Mueller struct drbg_test_suite drbg; 132da7f033dSHerbert Xu } suite; 133da7f033dSHerbert Xu }; 134da7f033dSHerbert Xu 135da7f033dSHerbert Xu static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 }; 136da7f033dSHerbert Xu 137da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len) 138da7f033dSHerbert Xu { 139da7f033dSHerbert Xu print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET, 140da7f033dSHerbert Xu 16, 1, 141da7f033dSHerbert Xu buf, len, false); 142da7f033dSHerbert Xu } 143da7f033dSHerbert Xu 144da7f033dSHerbert Xu static void tcrypt_complete(struct crypto_async_request *req, int err) 145da7f033dSHerbert Xu { 146da7f033dSHerbert Xu struct tcrypt_result *res = req->data; 147da7f033dSHerbert Xu 148da7f033dSHerbert Xu if (err == -EINPROGRESS) 149da7f033dSHerbert Xu return; 150da7f033dSHerbert Xu 151da7f033dSHerbert Xu res->err = err; 152da7f033dSHerbert Xu complete(&res->completion); 153da7f033dSHerbert Xu } 154da7f033dSHerbert Xu 155f8b0d4d0SHerbert Xu static int testmgr_alloc_buf(char *buf[XBUFSIZE]) 156f8b0d4d0SHerbert Xu { 157f8b0d4d0SHerbert Xu int i; 158f8b0d4d0SHerbert Xu 159f8b0d4d0SHerbert Xu for (i = 0; i < XBUFSIZE; i++) { 160f8b0d4d0SHerbert Xu buf[i] = (void *)__get_free_page(GFP_KERNEL); 161f8b0d4d0SHerbert Xu if (!buf[i]) 162f8b0d4d0SHerbert Xu goto err_free_buf; 163f8b0d4d0SHerbert Xu } 164f8b0d4d0SHerbert Xu 165f8b0d4d0SHerbert Xu return 0; 166f8b0d4d0SHerbert Xu 167f8b0d4d0SHerbert Xu err_free_buf: 168f8b0d4d0SHerbert Xu while (i-- > 0) 169f8b0d4d0SHerbert Xu free_page((unsigned long)buf[i]); 170f8b0d4d0SHerbert Xu 171f8b0d4d0SHerbert Xu return -ENOMEM; 172f8b0d4d0SHerbert Xu } 173f8b0d4d0SHerbert Xu 174f8b0d4d0SHerbert Xu static void testmgr_free_buf(char *buf[XBUFSIZE]) 175f8b0d4d0SHerbert Xu { 176f8b0d4d0SHerbert Xu int i; 177f8b0d4d0SHerbert Xu 178f8b0d4d0SHerbert Xu for (i = 0; i < XBUFSIZE; i++) 179f8b0d4d0SHerbert Xu free_page((unsigned long)buf[i]); 180f8b0d4d0SHerbert Xu } 181f8b0d4d0SHerbert Xu 182d4c85f9bSCristian Stoica static int wait_async_op(struct tcrypt_result *tr, int ret) 183a8f1a052SDavid S. Miller { 184a8f1a052SDavid S. Miller if (ret == -EINPROGRESS || ret == -EBUSY) { 1858a45ac12SRabin Vincent wait_for_completion(&tr->completion); 18616735d02SWolfram Sang reinit_completion(&tr->completion); 1878a45ac12SRabin Vincent ret = tr->err; 188a8f1a052SDavid S. Miller } 189a8f1a052SDavid S. Miller return ret; 190a8f1a052SDavid S. Miller } 191a8f1a052SDavid S. Miller 192da5ffe11SJussi Kivilinna static int __test_hash(struct crypto_ahash *tfm, struct hash_testvec *template, 193da5ffe11SJussi Kivilinna unsigned int tcount, bool use_digest, 194da5ffe11SJussi Kivilinna const int align_offset) 195da7f033dSHerbert Xu { 196da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm)); 197da7f033dSHerbert Xu unsigned int i, j, k, temp; 198da7f033dSHerbert Xu struct scatterlist sg[8]; 19929b77e5dSHoria Geanta char *result; 20029b77e5dSHoria Geanta char *key; 201da7f033dSHerbert Xu struct ahash_request *req; 202da7f033dSHerbert Xu struct tcrypt_result tresult; 203da7f033dSHerbert Xu void *hash_buff; 204f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 205f8b0d4d0SHerbert Xu int ret = -ENOMEM; 206f8b0d4d0SHerbert Xu 20729b77e5dSHoria Geanta result = kmalloc(MAX_DIGEST_SIZE, GFP_KERNEL); 20829b77e5dSHoria Geanta if (!result) 20929b77e5dSHoria Geanta return ret; 21029b77e5dSHoria Geanta key = kmalloc(MAX_KEYLEN, GFP_KERNEL); 21129b77e5dSHoria Geanta if (!key) 21229b77e5dSHoria Geanta goto out_nobuf; 213f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 214f8b0d4d0SHerbert Xu goto out_nobuf; 215da7f033dSHerbert Xu 216da7f033dSHerbert Xu init_completion(&tresult.completion); 217da7f033dSHerbert Xu 218da7f033dSHerbert Xu req = ahash_request_alloc(tfm, GFP_KERNEL); 219da7f033dSHerbert Xu if (!req) { 220da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to allocate request for " 221da7f033dSHerbert Xu "%s\n", algo); 222da7f033dSHerbert Xu goto out_noreq; 223da7f033dSHerbert Xu } 224da7f033dSHerbert Xu ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 225da7f033dSHerbert Xu tcrypt_complete, &tresult); 226da7f033dSHerbert Xu 227a0cfae59SHerbert Xu j = 0; 228da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 229a0cfae59SHerbert Xu if (template[i].np) 230a0cfae59SHerbert Xu continue; 231a0cfae59SHerbert Xu 232da5ffe11SJussi Kivilinna ret = -EINVAL; 233da5ffe11SJussi Kivilinna if (WARN_ON(align_offset + template[i].psize > PAGE_SIZE)) 234da5ffe11SJussi Kivilinna goto out; 235da5ffe11SJussi Kivilinna 236a0cfae59SHerbert Xu j++; 23729b77e5dSHoria Geanta memset(result, 0, MAX_DIGEST_SIZE); 238da7f033dSHerbert Xu 239da7f033dSHerbert Xu hash_buff = xbuf[0]; 240da5ffe11SJussi Kivilinna hash_buff += align_offset; 241da7f033dSHerbert Xu 242da7f033dSHerbert Xu memcpy(hash_buff, template[i].plaintext, template[i].psize); 243da7f033dSHerbert Xu sg_init_one(&sg[0], hash_buff, template[i].psize); 244da7f033dSHerbert Xu 245da7f033dSHerbert Xu if (template[i].ksize) { 246da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 24729b77e5dSHoria Geanta if (template[i].ksize > MAX_KEYLEN) { 24829b77e5dSHoria Geanta pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n", 24929b77e5dSHoria Geanta j, algo, template[i].ksize, MAX_KEYLEN); 25029b77e5dSHoria Geanta ret = -EINVAL; 25129b77e5dSHoria Geanta goto out; 25229b77e5dSHoria Geanta } 25329b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].ksize); 25429b77e5dSHoria Geanta ret = crypto_ahash_setkey(tfm, key, template[i].ksize); 255da7f033dSHerbert Xu if (ret) { 256da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey failed on " 257a0cfae59SHerbert Xu "test %d for %s: ret=%d\n", j, algo, 258da7f033dSHerbert Xu -ret); 259da7f033dSHerbert Xu goto out; 260da7f033dSHerbert Xu } 261da7f033dSHerbert Xu } 262da7f033dSHerbert Xu 263da7f033dSHerbert Xu ahash_request_set_crypt(req, sg, result, template[i].psize); 264a8f1a052SDavid S. Miller if (use_digest) { 265d4c85f9bSCristian Stoica ret = wait_async_op(&tresult, crypto_ahash_digest(req)); 266a8f1a052SDavid S. Miller if (ret) { 267a8f1a052SDavid S. Miller pr_err("alg: hash: digest failed on test %d " 268a0cfae59SHerbert Xu "for %s: ret=%d\n", j, algo, -ret); 269da7f033dSHerbert Xu goto out; 270da7f033dSHerbert Xu } 271a8f1a052SDavid S. Miller } else { 272d4c85f9bSCristian Stoica ret = wait_async_op(&tresult, crypto_ahash_init(req)); 273a8f1a052SDavid S. Miller if (ret) { 274a8f1a052SDavid S. Miller pr_err("alt: hash: init failed on test %d " 275a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 276a8f1a052SDavid S. Miller goto out; 277a8f1a052SDavid S. Miller } 278d4c85f9bSCristian Stoica ret = wait_async_op(&tresult, crypto_ahash_update(req)); 279a8f1a052SDavid S. Miller if (ret) { 280a8f1a052SDavid S. Miller pr_err("alt: hash: update failed on test %d " 281a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 282a8f1a052SDavid S. Miller goto out; 283a8f1a052SDavid S. Miller } 284d4c85f9bSCristian Stoica ret = wait_async_op(&tresult, crypto_ahash_final(req)); 285a8f1a052SDavid S. Miller if (ret) { 286a8f1a052SDavid S. Miller pr_err("alt: hash: final failed on test %d " 287a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 288a8f1a052SDavid S. Miller goto out; 289a8f1a052SDavid S. Miller } 290a8f1a052SDavid S. Miller } 291da7f033dSHerbert Xu 292da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 293da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 294da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Test %d failed for %s\n", 295a0cfae59SHerbert Xu j, algo); 296da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 297da7f033dSHerbert Xu ret = -EINVAL; 298da7f033dSHerbert Xu goto out; 299da7f033dSHerbert Xu } 300da7f033dSHerbert Xu } 301da7f033dSHerbert Xu 302da7f033dSHerbert Xu j = 0; 303da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 304da5ffe11SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 305da5ffe11SJussi Kivilinna if (align_offset != 0) 306da5ffe11SJussi Kivilinna break; 307da5ffe11SJussi Kivilinna 3085f2b424eSCristian Stoica if (!template[i].np) 3095f2b424eSCristian Stoica continue; 3105f2b424eSCristian Stoica 311da7f033dSHerbert Xu j++; 31229b77e5dSHoria Geanta memset(result, 0, MAX_DIGEST_SIZE); 313da7f033dSHerbert Xu 314da7f033dSHerbert Xu temp = 0; 315da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 316fd57f22aSHerbert Xu ret = -EINVAL; 317da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 318fd57f22aSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 319fd57f22aSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 320fd57f22aSHerbert Xu goto out; 321da7f033dSHerbert Xu sg_set_buf(&sg[k], 322da7f033dSHerbert Xu memcpy(xbuf[IDX[k] >> PAGE_SHIFT] + 323da7f033dSHerbert Xu offset_in_page(IDX[k]), 324da7f033dSHerbert Xu template[i].plaintext + temp, 325da7f033dSHerbert Xu template[i].tap[k]), 326da7f033dSHerbert Xu template[i].tap[k]); 327da7f033dSHerbert Xu temp += template[i].tap[k]; 328da7f033dSHerbert Xu } 329da7f033dSHerbert Xu 330da7f033dSHerbert Xu if (template[i].ksize) { 33129b77e5dSHoria Geanta if (template[i].ksize > MAX_KEYLEN) { 33229b77e5dSHoria Geanta pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n", 3335f2b424eSCristian Stoica j, algo, template[i].ksize, MAX_KEYLEN); 33429b77e5dSHoria Geanta ret = -EINVAL; 33529b77e5dSHoria Geanta goto out; 33629b77e5dSHoria Geanta } 337da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 33829b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].ksize); 3395f2b424eSCristian Stoica ret = crypto_ahash_setkey(tfm, key, template[i].ksize); 340da7f033dSHerbert Xu 341da7f033dSHerbert Xu if (ret) { 342da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey " 343da7f033dSHerbert Xu "failed on chunking test %d " 3445f2b424eSCristian Stoica "for %s: ret=%d\n", j, algo, -ret); 345da7f033dSHerbert Xu goto out; 346da7f033dSHerbert Xu } 347da7f033dSHerbert Xu } 348da7f033dSHerbert Xu 3495f2b424eSCristian Stoica ahash_request_set_crypt(req, sg, result, template[i].psize); 350da7f033dSHerbert Xu ret = crypto_ahash_digest(req); 351da7f033dSHerbert Xu switch (ret) { 352da7f033dSHerbert Xu case 0: 353da7f033dSHerbert Xu break; 354da7f033dSHerbert Xu case -EINPROGRESS: 355da7f033dSHerbert Xu case -EBUSY: 3568a45ac12SRabin Vincent wait_for_completion(&tresult.completion); 35716735d02SWolfram Sang reinit_completion(&tresult.completion); 3588a45ac12SRabin Vincent ret = tresult.err; 3598a45ac12SRabin Vincent if (!ret) 360da7f033dSHerbert Xu break; 361da7f033dSHerbert Xu /* fall through */ 362da7f033dSHerbert Xu default: 363da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: digest failed " 364da7f033dSHerbert Xu "on chunking test %d for %s: " 365da7f033dSHerbert Xu "ret=%d\n", j, algo, -ret); 366da7f033dSHerbert Xu goto out; 367da7f033dSHerbert Xu } 368da7f033dSHerbert Xu 369da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 370da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 371da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Chunking test %d " 372da7f033dSHerbert Xu "failed for %s\n", j, algo); 373da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 374da7f033dSHerbert Xu ret = -EINVAL; 375da7f033dSHerbert Xu goto out; 376da7f033dSHerbert Xu } 377da7f033dSHerbert Xu } 378da7f033dSHerbert Xu 379da7f033dSHerbert Xu ret = 0; 380da7f033dSHerbert Xu 381da7f033dSHerbert Xu out: 382da7f033dSHerbert Xu ahash_request_free(req); 383da7f033dSHerbert Xu out_noreq: 384f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 385f8b0d4d0SHerbert Xu out_nobuf: 38629b77e5dSHoria Geanta kfree(key); 38729b77e5dSHoria Geanta kfree(result); 388da7f033dSHerbert Xu return ret; 389da7f033dSHerbert Xu } 390da7f033dSHerbert Xu 391da5ffe11SJussi Kivilinna static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template, 392da5ffe11SJussi Kivilinna unsigned int tcount, bool use_digest) 393da5ffe11SJussi Kivilinna { 394da5ffe11SJussi Kivilinna unsigned int alignmask; 395da5ffe11SJussi Kivilinna int ret; 396da5ffe11SJussi Kivilinna 397da5ffe11SJussi Kivilinna ret = __test_hash(tfm, template, tcount, use_digest, 0); 398da5ffe11SJussi Kivilinna if (ret) 399da5ffe11SJussi Kivilinna return ret; 400da5ffe11SJussi Kivilinna 401da5ffe11SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 402da5ffe11SJussi Kivilinna ret = __test_hash(tfm, template, tcount, use_digest, 1); 403da5ffe11SJussi Kivilinna if (ret) 404da5ffe11SJussi Kivilinna return ret; 405da5ffe11SJussi Kivilinna 406da5ffe11SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 407da5ffe11SJussi Kivilinna if (alignmask) { 408da5ffe11SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 409da5ffe11SJussi Kivilinna ret = __test_hash(tfm, template, tcount, use_digest, 410da5ffe11SJussi Kivilinna alignmask + 1); 411da5ffe11SJussi Kivilinna if (ret) 412da5ffe11SJussi Kivilinna return ret; 413da5ffe11SJussi Kivilinna } 414da5ffe11SJussi Kivilinna 415da5ffe11SJussi Kivilinna return 0; 416da5ffe11SJussi Kivilinna } 417da5ffe11SJussi Kivilinna 418d8a32ac2SJussi Kivilinna static int __test_aead(struct crypto_aead *tfm, int enc, 419d8a32ac2SJussi Kivilinna struct aead_testvec *template, unsigned int tcount, 42058dcf548SJussi Kivilinna const bool diff_dst, const int align_offset) 421da7f033dSHerbert Xu { 422da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)); 423da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 424f8b0d4d0SHerbert Xu int ret = -ENOMEM; 425da7f033dSHerbert Xu char *q; 426da7f033dSHerbert Xu char *key; 427da7f033dSHerbert Xu struct aead_request *req; 428d8a32ac2SJussi Kivilinna struct scatterlist *sg; 429d8a32ac2SJussi Kivilinna struct scatterlist *asg; 430d8a32ac2SJussi Kivilinna struct scatterlist *sgout; 431d8a32ac2SJussi Kivilinna const char *e, *d; 432da7f033dSHerbert Xu struct tcrypt_result result; 433424a5da6SCristian Stoica unsigned int authsize, iv_len; 434da7f033dSHerbert Xu void *input; 435d8a32ac2SJussi Kivilinna void *output; 436da7f033dSHerbert Xu void *assoc; 4379bac019dSTadeusz Struk char *iv; 438f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 439d8a32ac2SJussi Kivilinna char *xoutbuf[XBUFSIZE]; 440f8b0d4d0SHerbert Xu char *axbuf[XBUFSIZE]; 441f8b0d4d0SHerbert Xu 4429bac019dSTadeusz Struk iv = kzalloc(MAX_IVLEN, GFP_KERNEL); 4439bac019dSTadeusz Struk if (!iv) 4449bac019dSTadeusz Struk return ret; 44529b77e5dSHoria Geanta key = kmalloc(MAX_KEYLEN, GFP_KERNEL); 44629b77e5dSHoria Geanta if (!key) 44729b77e5dSHoria Geanta goto out_noxbuf; 448f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 449f8b0d4d0SHerbert Xu goto out_noxbuf; 450f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(axbuf)) 451f8b0d4d0SHerbert Xu goto out_noaxbuf; 452d8a32ac2SJussi Kivilinna if (diff_dst && testmgr_alloc_buf(xoutbuf)) 453d8a32ac2SJussi Kivilinna goto out_nooutbuf; 454d8a32ac2SJussi Kivilinna 455d8a32ac2SJussi Kivilinna /* avoid "the frame size is larger than 1024 bytes" compiler warning */ 456d8a32ac2SJussi Kivilinna sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 3 : 2), GFP_KERNEL); 457d8a32ac2SJussi Kivilinna if (!sg) 458d8a32ac2SJussi Kivilinna goto out_nosg; 459d8a32ac2SJussi Kivilinna asg = &sg[8]; 460d8a32ac2SJussi Kivilinna sgout = &asg[8]; 461d8a32ac2SJussi Kivilinna 462d8a32ac2SJussi Kivilinna if (diff_dst) 463d8a32ac2SJussi Kivilinna d = "-ddst"; 464d8a32ac2SJussi Kivilinna else 465d8a32ac2SJussi Kivilinna d = ""; 466d8a32ac2SJussi Kivilinna 467da7f033dSHerbert Xu if (enc == ENCRYPT) 468da7f033dSHerbert Xu e = "encryption"; 469da7f033dSHerbert Xu else 470da7f033dSHerbert Xu e = "decryption"; 471da7f033dSHerbert Xu 472da7f033dSHerbert Xu init_completion(&result.completion); 473da7f033dSHerbert Xu 474da7f033dSHerbert Xu req = aead_request_alloc(tfm, GFP_KERNEL); 475da7f033dSHerbert Xu if (!req) { 476d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to allocate request for %s\n", 477d8a32ac2SJussi Kivilinna d, algo); 478da7f033dSHerbert Xu goto out; 479da7f033dSHerbert Xu } 480da7f033dSHerbert Xu 481da7f033dSHerbert Xu aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 482da7f033dSHerbert Xu tcrypt_complete, &result); 483da7f033dSHerbert Xu 484da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 48505b1d338SCristian Stoica if (template[i].np) 48605b1d338SCristian Stoica continue; 48705b1d338SCristian Stoica 488da7f033dSHerbert Xu j++; 489da7f033dSHerbert Xu 49058dcf548SJussi Kivilinna /* some templates have no input data but they will 491da7f033dSHerbert Xu * touch input 492da7f033dSHerbert Xu */ 493da7f033dSHerbert Xu input = xbuf[0]; 49458dcf548SJussi Kivilinna input += align_offset; 495da7f033dSHerbert Xu assoc = axbuf[0]; 496da7f033dSHerbert Xu 497fd57f22aSHerbert Xu ret = -EINVAL; 49858dcf548SJussi Kivilinna if (WARN_ON(align_offset + template[i].ilen > 49958dcf548SJussi Kivilinna PAGE_SIZE || template[i].alen > PAGE_SIZE)) 500fd57f22aSHerbert Xu goto out; 501fd57f22aSHerbert Xu 502da7f033dSHerbert Xu memcpy(input, template[i].input, template[i].ilen); 503da7f033dSHerbert Xu memcpy(assoc, template[i].assoc, template[i].alen); 504424a5da6SCristian Stoica iv_len = crypto_aead_ivsize(tfm); 505da7f033dSHerbert Xu if (template[i].iv) 506424a5da6SCristian Stoica memcpy(iv, template[i].iv, iv_len); 507da7f033dSHerbert Xu else 508424a5da6SCristian Stoica memset(iv, 0, iv_len); 509da7f033dSHerbert Xu 510da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 511da7f033dSHerbert Xu if (template[i].wk) 51205b1d338SCristian Stoica crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 513da7f033dSHerbert Xu 51429b77e5dSHoria Geanta if (template[i].klen > MAX_KEYLEN) { 51529b77e5dSHoria Geanta pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n", 51629b77e5dSHoria Geanta d, j, algo, template[i].klen, 51729b77e5dSHoria Geanta MAX_KEYLEN); 51829b77e5dSHoria Geanta ret = -EINVAL; 51929b77e5dSHoria Geanta goto out; 52029b77e5dSHoria Geanta } 52129b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].klen); 522da7f033dSHerbert Xu 52305b1d338SCristian Stoica ret = crypto_aead_setkey(tfm, key, template[i].klen); 524da7f033dSHerbert Xu if (!ret == template[i].fail) { 525d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n", 526d8a32ac2SJussi Kivilinna d, j, algo, crypto_aead_get_flags(tfm)); 527da7f033dSHerbert Xu goto out; 528da7f033dSHerbert Xu } else if (ret) 529da7f033dSHerbert Xu continue; 530da7f033dSHerbert Xu 531da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 532da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 533da7f033dSHerbert Xu if (ret) { 534d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n", 535d8a32ac2SJussi Kivilinna d, authsize, j, algo); 536da7f033dSHerbert Xu goto out; 537da7f033dSHerbert Xu } 538da7f033dSHerbert Xu 539d8a32ac2SJussi Kivilinna if (diff_dst) { 540d8a32ac2SJussi Kivilinna output = xoutbuf[0]; 54158dcf548SJussi Kivilinna output += align_offset; 5428ec25c51SHoria Geanta sg_init_one(&sg[0], input, template[i].ilen); 54305b1d338SCristian Stoica sg_init_one(&sgout[0], output, template[i].rlen); 5448ec25c51SHoria Geanta } else { 5458ec25c51SHoria Geanta sg_init_one(&sg[0], input, 54605b1d338SCristian Stoica template[i].ilen + (enc ? authsize : 0)); 547d8a32ac2SJussi Kivilinna output = input; 548d8a32ac2SJussi Kivilinna } 549d8a32ac2SJussi Kivilinna 550da7f033dSHerbert Xu sg_init_one(&asg[0], assoc, template[i].alen); 551da7f033dSHerbert Xu 552d8a32ac2SJussi Kivilinna aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 553da7f033dSHerbert Xu template[i].ilen, iv); 554da7f033dSHerbert Xu 555da7f033dSHerbert Xu aead_request_set_assoc(req, asg, template[i].alen); 556da7f033dSHerbert Xu 55705b1d338SCristian Stoica ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req); 558da7f033dSHerbert Xu 559da7f033dSHerbert Xu switch (ret) { 560da7f033dSHerbert Xu case 0: 561e44a1b44SJarod Wilson if (template[i].novrfy) { 562e44a1b44SJarod Wilson /* verification was supposed to fail */ 563d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n", 564d8a32ac2SJussi Kivilinna d, e, j, algo); 565e44a1b44SJarod Wilson /* so really, we got a bad message */ 566e44a1b44SJarod Wilson ret = -EBADMSG; 567e44a1b44SJarod Wilson goto out; 568e44a1b44SJarod Wilson } 569da7f033dSHerbert Xu break; 570da7f033dSHerbert Xu case -EINPROGRESS: 571da7f033dSHerbert Xu case -EBUSY: 5728a45ac12SRabin Vincent wait_for_completion(&result.completion); 57316735d02SWolfram Sang reinit_completion(&result.completion); 5748a45ac12SRabin Vincent ret = result.err; 5758a45ac12SRabin Vincent if (!ret) 576da7f033dSHerbert Xu break; 577e44a1b44SJarod Wilson case -EBADMSG: 578e44a1b44SJarod Wilson if (template[i].novrfy) 579e44a1b44SJarod Wilson /* verification failure was expected */ 580e44a1b44SJarod Wilson continue; 581da7f033dSHerbert Xu /* fall through */ 582da7f033dSHerbert Xu default: 583d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n", 584d8a32ac2SJussi Kivilinna d, e, j, algo, -ret); 585da7f033dSHerbert Xu goto out; 586da7f033dSHerbert Xu } 587da7f033dSHerbert Xu 588d8a32ac2SJussi Kivilinna q = output; 589da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 590d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Test %d failed on %s for %s\n", 591d8a32ac2SJussi Kivilinna d, j, e, algo); 592da7f033dSHerbert Xu hexdump(q, template[i].rlen); 593da7f033dSHerbert Xu ret = -EINVAL; 594da7f033dSHerbert Xu goto out; 595da7f033dSHerbert Xu } 596da7f033dSHerbert Xu } 597da7f033dSHerbert Xu 598da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 59958dcf548SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 60058dcf548SJussi Kivilinna if (align_offset != 0) 60158dcf548SJussi Kivilinna break; 60258dcf548SJussi Kivilinna 60305b1d338SCristian Stoica if (!template[i].np) 60405b1d338SCristian Stoica continue; 60505b1d338SCristian Stoica 606da7f033dSHerbert Xu j++; 607da7f033dSHerbert Xu 608da7f033dSHerbert Xu if (template[i].iv) 609da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 610da7f033dSHerbert Xu else 611da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 612da7f033dSHerbert Xu 613da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 614da7f033dSHerbert Xu if (template[i].wk) 61505b1d338SCristian Stoica crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 61629b77e5dSHoria Geanta if (template[i].klen > MAX_KEYLEN) { 61729b77e5dSHoria Geanta pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n", 61805b1d338SCristian Stoica d, j, algo, template[i].klen, MAX_KEYLEN); 61929b77e5dSHoria Geanta ret = -EINVAL; 62029b77e5dSHoria Geanta goto out; 62129b77e5dSHoria Geanta } 62229b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].klen); 623da7f033dSHerbert Xu 624da7f033dSHerbert Xu ret = crypto_aead_setkey(tfm, key, template[i].klen); 625da7f033dSHerbert Xu if (!ret == template[i].fail) { 626d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n", 627d8a32ac2SJussi Kivilinna d, j, algo, crypto_aead_get_flags(tfm)); 628da7f033dSHerbert Xu goto out; 629da7f033dSHerbert Xu } else if (ret) 630da7f033dSHerbert Xu continue; 631da7f033dSHerbert Xu 632da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 633da7f033dSHerbert Xu 634da7f033dSHerbert Xu ret = -EINVAL; 635da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 636d8a32ac2SJussi Kivilinna if (diff_dst) 637d8a32ac2SJussi Kivilinna sg_init_table(sgout, template[i].np); 638da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 639da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 640da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 641da7f033dSHerbert Xu goto out; 642da7f033dSHerbert Xu 64305b1d338SCristian Stoica q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]); 64405b1d338SCristian Stoica memcpy(q, template[i].input + temp, template[i].tap[k]); 645da7f033dSHerbert Xu sg_set_buf(&sg[k], q, template[i].tap[k]); 646d8a32ac2SJussi Kivilinna 647d8a32ac2SJussi Kivilinna if (diff_dst) { 648d8a32ac2SJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 649d8a32ac2SJussi Kivilinna offset_in_page(IDX[k]); 650d8a32ac2SJussi Kivilinna 651d8a32ac2SJussi Kivilinna memset(q, 0, template[i].tap[k]); 652d8a32ac2SJussi Kivilinna 65305b1d338SCristian Stoica sg_set_buf(&sgout[k], q, template[i].tap[k]); 654d8a32ac2SJussi Kivilinna } 655d8a32ac2SJussi Kivilinna 6568ec25c51SHoria Geanta n = template[i].tap[k]; 6578ec25c51SHoria Geanta if (k == template[i].np - 1 && enc) 6588ec25c51SHoria Geanta n += authsize; 6598ec25c51SHoria Geanta if (offset_in_page(q) + n < PAGE_SIZE) 6608ec25c51SHoria Geanta q[n] = 0; 6618ec25c51SHoria Geanta 662da7f033dSHerbert Xu temp += template[i].tap[k]; 663da7f033dSHerbert Xu } 664da7f033dSHerbert Xu 665da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 666da7f033dSHerbert Xu if (ret) { 667d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n", 668d8a32ac2SJussi Kivilinna d, authsize, j, algo); 669da7f033dSHerbert Xu goto out; 670da7f033dSHerbert Xu } 671da7f033dSHerbert Xu 672da7f033dSHerbert Xu if (enc) { 673da7f033dSHerbert Xu if (WARN_ON(sg[k - 1].offset + 674da7f033dSHerbert Xu sg[k - 1].length + authsize > 675da7f033dSHerbert Xu PAGE_SIZE)) { 676da7f033dSHerbert Xu ret = -EINVAL; 677da7f033dSHerbert Xu goto out; 678da7f033dSHerbert Xu } 679da7f033dSHerbert Xu 680d8a32ac2SJussi Kivilinna if (diff_dst) 681d8a32ac2SJussi Kivilinna sgout[k - 1].length += authsize; 6828ec25c51SHoria Geanta else 6838ec25c51SHoria Geanta sg[k - 1].length += authsize; 684da7f033dSHerbert Xu } 685da7f033dSHerbert Xu 686da7f033dSHerbert Xu sg_init_table(asg, template[i].anp); 687fd57f22aSHerbert Xu ret = -EINVAL; 688da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].anp; k++) { 689fd57f22aSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 690fd57f22aSHerbert Xu template[i].atap[k] > PAGE_SIZE)) 691fd57f22aSHerbert Xu goto out; 692da7f033dSHerbert Xu sg_set_buf(&asg[k], 693da7f033dSHerbert Xu memcpy(axbuf[IDX[k] >> PAGE_SHIFT] + 694da7f033dSHerbert Xu offset_in_page(IDX[k]), 695da7f033dSHerbert Xu template[i].assoc + temp, 696da7f033dSHerbert Xu template[i].atap[k]), 697da7f033dSHerbert Xu template[i].atap[k]); 698da7f033dSHerbert Xu temp += template[i].atap[k]; 699da7f033dSHerbert Xu } 700da7f033dSHerbert Xu 701d8a32ac2SJussi Kivilinna aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 702da7f033dSHerbert Xu template[i].ilen, 703da7f033dSHerbert Xu iv); 704da7f033dSHerbert Xu 705da7f033dSHerbert Xu aead_request_set_assoc(req, asg, template[i].alen); 706da7f033dSHerbert Xu 70705b1d338SCristian Stoica ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req); 708da7f033dSHerbert Xu 709da7f033dSHerbert Xu switch (ret) { 710da7f033dSHerbert Xu case 0: 711e44a1b44SJarod Wilson if (template[i].novrfy) { 712e44a1b44SJarod Wilson /* verification was supposed to fail */ 713d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n", 714d8a32ac2SJussi Kivilinna d, e, j, algo); 715e44a1b44SJarod Wilson /* so really, we got a bad message */ 716e44a1b44SJarod Wilson ret = -EBADMSG; 717e44a1b44SJarod Wilson goto out; 718e44a1b44SJarod Wilson } 719da7f033dSHerbert Xu break; 720da7f033dSHerbert Xu case -EINPROGRESS: 721da7f033dSHerbert Xu case -EBUSY: 7228a45ac12SRabin Vincent wait_for_completion(&result.completion); 72316735d02SWolfram Sang reinit_completion(&result.completion); 7248a45ac12SRabin Vincent ret = result.err; 7258a45ac12SRabin Vincent if (!ret) 726da7f033dSHerbert Xu break; 727e44a1b44SJarod Wilson case -EBADMSG: 728e44a1b44SJarod Wilson if (template[i].novrfy) 729e44a1b44SJarod Wilson /* verification failure was expected */ 730e44a1b44SJarod Wilson continue; 731da7f033dSHerbert Xu /* fall through */ 732da7f033dSHerbert Xu default: 733d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n", 734d8a32ac2SJussi Kivilinna d, e, j, algo, -ret); 735da7f033dSHerbert Xu goto out; 736da7f033dSHerbert Xu } 737da7f033dSHerbert Xu 738da7f033dSHerbert Xu ret = -EINVAL; 739da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 740d8a32ac2SJussi Kivilinna if (diff_dst) 741d8a32ac2SJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 742d8a32ac2SJussi Kivilinna offset_in_page(IDX[k]); 743d8a32ac2SJussi Kivilinna else 744da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 745da7f033dSHerbert Xu offset_in_page(IDX[k]); 746da7f033dSHerbert Xu 747da7f033dSHerbert Xu n = template[i].tap[k]; 748da7f033dSHerbert Xu if (k == template[i].np - 1) 749da7f033dSHerbert Xu n += enc ? authsize : -authsize; 750da7f033dSHerbert Xu 751da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, n)) { 752d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n", 753d8a32ac2SJussi Kivilinna d, j, e, k, algo); 754da7f033dSHerbert Xu hexdump(q, n); 755da7f033dSHerbert Xu goto out; 756da7f033dSHerbert Xu } 757da7f033dSHerbert Xu 758da7f033dSHerbert Xu q += n; 759da7f033dSHerbert Xu if (k == template[i].np - 1 && !enc) { 760d8a32ac2SJussi Kivilinna if (!diff_dst && 761d8a32ac2SJussi Kivilinna memcmp(q, template[i].input + 762da7f033dSHerbert Xu temp + n, authsize)) 763da7f033dSHerbert Xu n = authsize; 764da7f033dSHerbert Xu else 765da7f033dSHerbert Xu n = 0; 766da7f033dSHerbert Xu } else { 76705b1d338SCristian Stoica for (n = 0; offset_in_page(q + n) && q[n]; n++) 768da7f033dSHerbert Xu ; 769da7f033dSHerbert Xu } 770da7f033dSHerbert Xu if (n) { 771d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n", 772d8a32ac2SJussi Kivilinna d, j, e, k, algo, n); 773da7f033dSHerbert Xu hexdump(q, n); 774da7f033dSHerbert Xu goto out; 775da7f033dSHerbert Xu } 776da7f033dSHerbert Xu 777da7f033dSHerbert Xu temp += template[i].tap[k]; 778da7f033dSHerbert Xu } 779da7f033dSHerbert Xu } 780da7f033dSHerbert Xu 781da7f033dSHerbert Xu ret = 0; 782da7f033dSHerbert Xu 783da7f033dSHerbert Xu out: 784da7f033dSHerbert Xu aead_request_free(req); 785d8a32ac2SJussi Kivilinna kfree(sg); 786d8a32ac2SJussi Kivilinna out_nosg: 787d8a32ac2SJussi Kivilinna if (diff_dst) 788d8a32ac2SJussi Kivilinna testmgr_free_buf(xoutbuf); 789d8a32ac2SJussi Kivilinna out_nooutbuf: 790f8b0d4d0SHerbert Xu testmgr_free_buf(axbuf); 791f8b0d4d0SHerbert Xu out_noaxbuf: 792f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 793f8b0d4d0SHerbert Xu out_noxbuf: 79429b77e5dSHoria Geanta kfree(key); 7959bac019dSTadeusz Struk kfree(iv); 796da7f033dSHerbert Xu return ret; 797da7f033dSHerbert Xu } 798da7f033dSHerbert Xu 799d8a32ac2SJussi Kivilinna static int test_aead(struct crypto_aead *tfm, int enc, 800d8a32ac2SJussi Kivilinna struct aead_testvec *template, unsigned int tcount) 801d8a32ac2SJussi Kivilinna { 80258dcf548SJussi Kivilinna unsigned int alignmask; 803d8a32ac2SJussi Kivilinna int ret; 804d8a32ac2SJussi Kivilinna 805d8a32ac2SJussi Kivilinna /* test 'dst == src' case */ 80658dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, false, 0); 807d8a32ac2SJussi Kivilinna if (ret) 808d8a32ac2SJussi Kivilinna return ret; 809d8a32ac2SJussi Kivilinna 810d8a32ac2SJussi Kivilinna /* test 'dst != src' case */ 81158dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 0); 81258dcf548SJussi Kivilinna if (ret) 81358dcf548SJussi Kivilinna return ret; 81458dcf548SJussi Kivilinna 81558dcf548SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 81658dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 1); 81758dcf548SJussi Kivilinna if (ret) 81858dcf548SJussi Kivilinna return ret; 81958dcf548SJussi Kivilinna 82058dcf548SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 82158dcf548SJussi Kivilinna if (alignmask) { 82258dcf548SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 82358dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 82458dcf548SJussi Kivilinna alignmask + 1); 82558dcf548SJussi Kivilinna if (ret) 82658dcf548SJussi Kivilinna return ret; 82758dcf548SJussi Kivilinna } 82858dcf548SJussi Kivilinna 82958dcf548SJussi Kivilinna return 0; 830d8a32ac2SJussi Kivilinna } 831d8a32ac2SJussi Kivilinna 8321aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc, 8331aa4ecd9SHerbert Xu struct cipher_testvec *template, unsigned int tcount) 8341aa4ecd9SHerbert Xu { 8351aa4ecd9SHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm)); 8361aa4ecd9SHerbert Xu unsigned int i, j, k; 8371aa4ecd9SHerbert Xu char *q; 8381aa4ecd9SHerbert Xu const char *e; 8391aa4ecd9SHerbert Xu void *data; 840f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 841f8b0d4d0SHerbert Xu int ret = -ENOMEM; 842f8b0d4d0SHerbert Xu 843f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 844f8b0d4d0SHerbert Xu goto out_nobuf; 8451aa4ecd9SHerbert Xu 8461aa4ecd9SHerbert Xu if (enc == ENCRYPT) 8471aa4ecd9SHerbert Xu e = "encryption"; 8481aa4ecd9SHerbert Xu else 8491aa4ecd9SHerbert Xu e = "decryption"; 8501aa4ecd9SHerbert Xu 8511aa4ecd9SHerbert Xu j = 0; 8521aa4ecd9SHerbert Xu for (i = 0; i < tcount; i++) { 8531aa4ecd9SHerbert Xu if (template[i].np) 8541aa4ecd9SHerbert Xu continue; 8551aa4ecd9SHerbert Xu 8561aa4ecd9SHerbert Xu j++; 8571aa4ecd9SHerbert Xu 858fd57f22aSHerbert Xu ret = -EINVAL; 859fd57f22aSHerbert Xu if (WARN_ON(template[i].ilen > PAGE_SIZE)) 860fd57f22aSHerbert Xu goto out; 861fd57f22aSHerbert Xu 8621aa4ecd9SHerbert Xu data = xbuf[0]; 8631aa4ecd9SHerbert Xu memcpy(data, template[i].input, template[i].ilen); 8641aa4ecd9SHerbert Xu 8651aa4ecd9SHerbert Xu crypto_cipher_clear_flags(tfm, ~0); 8661aa4ecd9SHerbert Xu if (template[i].wk) 8671aa4ecd9SHerbert Xu crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 8681aa4ecd9SHerbert Xu 8691aa4ecd9SHerbert Xu ret = crypto_cipher_setkey(tfm, template[i].key, 8701aa4ecd9SHerbert Xu template[i].klen); 8711aa4ecd9SHerbert Xu if (!ret == template[i].fail) { 8721aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: setkey failed " 8731aa4ecd9SHerbert Xu "on test %d for %s: flags=%x\n", j, 8741aa4ecd9SHerbert Xu algo, crypto_cipher_get_flags(tfm)); 8751aa4ecd9SHerbert Xu goto out; 8761aa4ecd9SHerbert Xu } else if (ret) 8771aa4ecd9SHerbert Xu continue; 8781aa4ecd9SHerbert Xu 8791aa4ecd9SHerbert Xu for (k = 0; k < template[i].ilen; 8801aa4ecd9SHerbert Xu k += crypto_cipher_blocksize(tfm)) { 8811aa4ecd9SHerbert Xu if (enc) 8821aa4ecd9SHerbert Xu crypto_cipher_encrypt_one(tfm, data + k, 8831aa4ecd9SHerbert Xu data + k); 8841aa4ecd9SHerbert Xu else 8851aa4ecd9SHerbert Xu crypto_cipher_decrypt_one(tfm, data + k, 8861aa4ecd9SHerbert Xu data + k); 8871aa4ecd9SHerbert Xu } 8881aa4ecd9SHerbert Xu 8891aa4ecd9SHerbert Xu q = data; 8901aa4ecd9SHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 8911aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: Test %d failed " 8921aa4ecd9SHerbert Xu "on %s for %s\n", j, e, algo); 8931aa4ecd9SHerbert Xu hexdump(q, template[i].rlen); 8941aa4ecd9SHerbert Xu ret = -EINVAL; 8951aa4ecd9SHerbert Xu goto out; 8961aa4ecd9SHerbert Xu } 8971aa4ecd9SHerbert Xu } 8981aa4ecd9SHerbert Xu 8991aa4ecd9SHerbert Xu ret = 0; 9001aa4ecd9SHerbert Xu 9011aa4ecd9SHerbert Xu out: 902f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 903f8b0d4d0SHerbert Xu out_nobuf: 9041aa4ecd9SHerbert Xu return ret; 9051aa4ecd9SHerbert Xu } 9061aa4ecd9SHerbert Xu 90708d6af8cSJussi Kivilinna static int __test_skcipher(struct crypto_ablkcipher *tfm, int enc, 90808d6af8cSJussi Kivilinna struct cipher_testvec *template, unsigned int tcount, 9093a338f20SJussi Kivilinna const bool diff_dst, const int align_offset) 910da7f033dSHerbert Xu { 911da7f033dSHerbert Xu const char *algo = 912da7f033dSHerbert Xu crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm)); 913da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 914da7f033dSHerbert Xu char *q; 915da7f033dSHerbert Xu struct ablkcipher_request *req; 916da7f033dSHerbert Xu struct scatterlist sg[8]; 91708d6af8cSJussi Kivilinna struct scatterlist sgout[8]; 91808d6af8cSJussi Kivilinna const char *e, *d; 919da7f033dSHerbert Xu struct tcrypt_result result; 920da7f033dSHerbert Xu void *data; 921da7f033dSHerbert Xu char iv[MAX_IVLEN]; 922f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 92308d6af8cSJussi Kivilinna char *xoutbuf[XBUFSIZE]; 924f8b0d4d0SHerbert Xu int ret = -ENOMEM; 925f8b0d4d0SHerbert Xu 926f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 927f8b0d4d0SHerbert Xu goto out_nobuf; 928da7f033dSHerbert Xu 92908d6af8cSJussi Kivilinna if (diff_dst && testmgr_alloc_buf(xoutbuf)) 93008d6af8cSJussi Kivilinna goto out_nooutbuf; 93108d6af8cSJussi Kivilinna 93208d6af8cSJussi Kivilinna if (diff_dst) 93308d6af8cSJussi Kivilinna d = "-ddst"; 93408d6af8cSJussi Kivilinna else 93508d6af8cSJussi Kivilinna d = ""; 93608d6af8cSJussi Kivilinna 937da7f033dSHerbert Xu if (enc == ENCRYPT) 938da7f033dSHerbert Xu e = "encryption"; 939da7f033dSHerbert Xu else 940da7f033dSHerbert Xu e = "decryption"; 941da7f033dSHerbert Xu 942da7f033dSHerbert Xu init_completion(&result.completion); 943da7f033dSHerbert Xu 944da7f033dSHerbert Xu req = ablkcipher_request_alloc(tfm, GFP_KERNEL); 945da7f033dSHerbert Xu if (!req) { 94608d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Failed to allocate request for %s\n", 94708d6af8cSJussi Kivilinna d, algo); 948da7f033dSHerbert Xu goto out; 949da7f033dSHerbert Xu } 950da7f033dSHerbert Xu 951da7f033dSHerbert Xu ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 952da7f033dSHerbert Xu tcrypt_complete, &result); 953da7f033dSHerbert Xu 954da7f033dSHerbert Xu j = 0; 955da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 956bbb9a7ddSCristian Stoica if (template[i].np && !template[i].also_non_np) 957bbb9a7ddSCristian Stoica continue; 958bbb9a7ddSCristian Stoica 959da7f033dSHerbert Xu if (template[i].iv) 960da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 961da7f033dSHerbert Xu else 962da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 963da7f033dSHerbert Xu 964da7f033dSHerbert Xu j++; 965fd57f22aSHerbert Xu ret = -EINVAL; 966a1aa44a2SCristian Stoica if (WARN_ON(align_offset + template[i].ilen > PAGE_SIZE)) 967fd57f22aSHerbert Xu goto out; 968fd57f22aSHerbert Xu 969da7f033dSHerbert Xu data = xbuf[0]; 9703a338f20SJussi Kivilinna data += align_offset; 971da7f033dSHerbert Xu memcpy(data, template[i].input, template[i].ilen); 972da7f033dSHerbert Xu 973da7f033dSHerbert Xu crypto_ablkcipher_clear_flags(tfm, ~0); 974da7f033dSHerbert Xu if (template[i].wk) 975a1aa44a2SCristian Stoica crypto_ablkcipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 976da7f033dSHerbert Xu 977da7f033dSHerbert Xu ret = crypto_ablkcipher_setkey(tfm, template[i].key, 978da7f033dSHerbert Xu template[i].klen); 979da7f033dSHerbert Xu if (!ret == template[i].fail) { 98008d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n", 981a1aa44a2SCristian Stoica d, j, algo, crypto_ablkcipher_get_flags(tfm)); 982da7f033dSHerbert Xu goto out; 983da7f033dSHerbert Xu } else if (ret) 984da7f033dSHerbert Xu continue; 985da7f033dSHerbert Xu 986da7f033dSHerbert Xu sg_init_one(&sg[0], data, template[i].ilen); 98708d6af8cSJussi Kivilinna if (diff_dst) { 98808d6af8cSJussi Kivilinna data = xoutbuf[0]; 9893a338f20SJussi Kivilinna data += align_offset; 99008d6af8cSJussi Kivilinna sg_init_one(&sgout[0], data, template[i].ilen); 99108d6af8cSJussi Kivilinna } 992da7f033dSHerbert Xu 993a1aa44a2SCristian Stoica ablkcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 994da7f033dSHerbert Xu template[i].ilen, iv); 995a1aa44a2SCristian Stoica ret = enc ? crypto_ablkcipher_encrypt(req) : 996da7f033dSHerbert Xu crypto_ablkcipher_decrypt(req); 997da7f033dSHerbert Xu 998da7f033dSHerbert Xu switch (ret) { 999da7f033dSHerbert Xu case 0: 1000da7f033dSHerbert Xu break; 1001da7f033dSHerbert Xu case -EINPROGRESS: 1002da7f033dSHerbert Xu case -EBUSY: 10038a45ac12SRabin Vincent wait_for_completion(&result.completion); 100416735d02SWolfram Sang reinit_completion(&result.completion); 10058a45ac12SRabin Vincent ret = result.err; 10068a45ac12SRabin Vincent if (!ret) 1007da7f033dSHerbert Xu break; 1008da7f033dSHerbert Xu /* fall through */ 1009da7f033dSHerbert Xu default: 101008d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n", 101108d6af8cSJussi Kivilinna d, e, j, algo, -ret); 1012da7f033dSHerbert Xu goto out; 1013da7f033dSHerbert Xu } 1014da7f033dSHerbert Xu 1015da7f033dSHerbert Xu q = data; 1016da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 101708d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Test %d failed on %s for %s\n", 101808d6af8cSJussi Kivilinna d, j, e, algo); 1019da7f033dSHerbert Xu hexdump(q, template[i].rlen); 1020da7f033dSHerbert Xu ret = -EINVAL; 1021da7f033dSHerbert Xu goto out; 1022da7f033dSHerbert Xu } 1023da7f033dSHerbert Xu } 1024da7f033dSHerbert Xu 1025da7f033dSHerbert Xu j = 0; 1026da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 10273a338f20SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 10283a338f20SJussi Kivilinna if (align_offset != 0) 10293a338f20SJussi Kivilinna break; 1030da7f033dSHerbert Xu 1031bbb9a7ddSCristian Stoica if (!template[i].np) 1032bbb9a7ddSCristian Stoica continue; 1033bbb9a7ddSCristian Stoica 1034da7f033dSHerbert Xu if (template[i].iv) 1035da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 1036da7f033dSHerbert Xu else 1037da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 1038da7f033dSHerbert Xu 1039da7f033dSHerbert Xu j++; 1040da7f033dSHerbert Xu crypto_ablkcipher_clear_flags(tfm, ~0); 1041da7f033dSHerbert Xu if (template[i].wk) 1042a1aa44a2SCristian Stoica crypto_ablkcipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 1043da7f033dSHerbert Xu 1044da7f033dSHerbert Xu ret = crypto_ablkcipher_setkey(tfm, template[i].key, 1045da7f033dSHerbert Xu template[i].klen); 1046da7f033dSHerbert Xu if (!ret == template[i].fail) { 104708d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n", 1048a1aa44a2SCristian Stoica d, j, algo, crypto_ablkcipher_get_flags(tfm)); 1049da7f033dSHerbert Xu goto out; 1050da7f033dSHerbert Xu } else if (ret) 1051da7f033dSHerbert Xu continue; 1052da7f033dSHerbert Xu 1053da7f033dSHerbert Xu temp = 0; 1054da7f033dSHerbert Xu ret = -EINVAL; 1055da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 105608d6af8cSJussi Kivilinna if (diff_dst) 105708d6af8cSJussi Kivilinna sg_init_table(sgout, template[i].np); 1058da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 1059da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 1060da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 1061da7f033dSHerbert Xu goto out; 1062da7f033dSHerbert Xu 1063a1aa44a2SCristian Stoica q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]); 1064da7f033dSHerbert Xu 1065a1aa44a2SCristian Stoica memcpy(q, template[i].input + temp, template[i].tap[k]); 1066da7f033dSHerbert Xu 1067a1aa44a2SCristian Stoica if (offset_in_page(q) + template[i].tap[k] < PAGE_SIZE) 1068da7f033dSHerbert Xu q[template[i].tap[k]] = 0; 1069da7f033dSHerbert Xu 1070da7f033dSHerbert Xu sg_set_buf(&sg[k], q, template[i].tap[k]); 107108d6af8cSJussi Kivilinna if (diff_dst) { 107208d6af8cSJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 107308d6af8cSJussi Kivilinna offset_in_page(IDX[k]); 107408d6af8cSJussi Kivilinna 1075a1aa44a2SCristian Stoica sg_set_buf(&sgout[k], q, template[i].tap[k]); 107608d6af8cSJussi Kivilinna 107708d6af8cSJussi Kivilinna memset(q, 0, template[i].tap[k]); 107808d6af8cSJussi Kivilinna if (offset_in_page(q) + 107908d6af8cSJussi Kivilinna template[i].tap[k] < PAGE_SIZE) 108008d6af8cSJussi Kivilinna q[template[i].tap[k]] = 0; 108108d6af8cSJussi Kivilinna } 1082da7f033dSHerbert Xu 1083da7f033dSHerbert Xu temp += template[i].tap[k]; 1084da7f033dSHerbert Xu } 1085da7f033dSHerbert Xu 1086a1aa44a2SCristian Stoica ablkcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 1087da7f033dSHerbert Xu template[i].ilen, iv); 1088da7f033dSHerbert Xu 1089a1aa44a2SCristian Stoica ret = enc ? crypto_ablkcipher_encrypt(req) : 1090da7f033dSHerbert Xu crypto_ablkcipher_decrypt(req); 1091da7f033dSHerbert Xu 1092da7f033dSHerbert Xu switch (ret) { 1093da7f033dSHerbert Xu case 0: 1094da7f033dSHerbert Xu break; 1095da7f033dSHerbert Xu case -EINPROGRESS: 1096da7f033dSHerbert Xu case -EBUSY: 10978a45ac12SRabin Vincent wait_for_completion(&result.completion); 109816735d02SWolfram Sang reinit_completion(&result.completion); 10998a45ac12SRabin Vincent ret = result.err; 11008a45ac12SRabin Vincent if (!ret) 1101da7f033dSHerbert Xu break; 1102da7f033dSHerbert Xu /* fall through */ 1103da7f033dSHerbert Xu default: 110408d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n", 110508d6af8cSJussi Kivilinna d, e, j, algo, -ret); 1106da7f033dSHerbert Xu goto out; 1107da7f033dSHerbert Xu } 1108da7f033dSHerbert Xu 1109da7f033dSHerbert Xu temp = 0; 1110da7f033dSHerbert Xu ret = -EINVAL; 1111da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 111208d6af8cSJussi Kivilinna if (diff_dst) 111308d6af8cSJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 111408d6af8cSJussi Kivilinna offset_in_page(IDX[k]); 111508d6af8cSJussi Kivilinna else 1116da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 1117da7f033dSHerbert Xu offset_in_page(IDX[k]); 1118da7f033dSHerbert Xu 1119da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, 1120da7f033dSHerbert Xu template[i].tap[k])) { 112108d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n", 112208d6af8cSJussi Kivilinna d, j, e, k, algo); 1123da7f033dSHerbert Xu hexdump(q, template[i].tap[k]); 1124da7f033dSHerbert Xu goto out; 1125da7f033dSHerbert Xu } 1126da7f033dSHerbert Xu 1127da7f033dSHerbert Xu q += template[i].tap[k]; 1128da7f033dSHerbert Xu for (n = 0; offset_in_page(q + n) && q[n]; n++) 1129da7f033dSHerbert Xu ; 1130da7f033dSHerbert Xu if (n) { 113108d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n", 113208d6af8cSJussi Kivilinna d, j, e, k, algo, n); 1133da7f033dSHerbert Xu hexdump(q, n); 1134da7f033dSHerbert Xu goto out; 1135da7f033dSHerbert Xu } 1136da7f033dSHerbert Xu temp += template[i].tap[k]; 1137da7f033dSHerbert Xu } 1138da7f033dSHerbert Xu } 1139da7f033dSHerbert Xu 1140da7f033dSHerbert Xu ret = 0; 1141da7f033dSHerbert Xu 1142da7f033dSHerbert Xu out: 1143da7f033dSHerbert Xu ablkcipher_request_free(req); 114408d6af8cSJussi Kivilinna if (diff_dst) 114508d6af8cSJussi Kivilinna testmgr_free_buf(xoutbuf); 114608d6af8cSJussi Kivilinna out_nooutbuf: 1147f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 1148f8b0d4d0SHerbert Xu out_nobuf: 1149da7f033dSHerbert Xu return ret; 1150da7f033dSHerbert Xu } 1151da7f033dSHerbert Xu 115208d6af8cSJussi Kivilinna static int test_skcipher(struct crypto_ablkcipher *tfm, int enc, 115308d6af8cSJussi Kivilinna struct cipher_testvec *template, unsigned int tcount) 115408d6af8cSJussi Kivilinna { 11553a338f20SJussi Kivilinna unsigned int alignmask; 115608d6af8cSJussi Kivilinna int ret; 115708d6af8cSJussi Kivilinna 115808d6af8cSJussi Kivilinna /* test 'dst == src' case */ 11593a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, false, 0); 116008d6af8cSJussi Kivilinna if (ret) 116108d6af8cSJussi Kivilinna return ret; 116208d6af8cSJussi Kivilinna 116308d6af8cSJussi Kivilinna /* test 'dst != src' case */ 11643a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 0); 11653a338f20SJussi Kivilinna if (ret) 11663a338f20SJussi Kivilinna return ret; 11673a338f20SJussi Kivilinna 11683a338f20SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 11693a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 1); 11703a338f20SJussi Kivilinna if (ret) 11713a338f20SJussi Kivilinna return ret; 11723a338f20SJussi Kivilinna 11733a338f20SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 11743a338f20SJussi Kivilinna if (alignmask) { 11753a338f20SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 11763a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 11773a338f20SJussi Kivilinna alignmask + 1); 11783a338f20SJussi Kivilinna if (ret) 11793a338f20SJussi Kivilinna return ret; 11803a338f20SJussi Kivilinna } 11813a338f20SJussi Kivilinna 11823a338f20SJussi Kivilinna return 0; 118308d6af8cSJussi Kivilinna } 118408d6af8cSJussi Kivilinna 1185da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate, 1186da7f033dSHerbert Xu struct comp_testvec *dtemplate, int ctcount, int dtcount) 1187da7f033dSHerbert Xu { 1188da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm)); 1189da7f033dSHerbert Xu unsigned int i; 1190da7f033dSHerbert Xu char result[COMP_BUF_SIZE]; 1191da7f033dSHerbert Xu int ret; 1192da7f033dSHerbert Xu 1193da7f033dSHerbert Xu for (i = 0; i < ctcount; i++) { 1194c79cf910SGeert Uytterhoeven int ilen; 1195c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 1196da7f033dSHerbert Xu 1197da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 1198da7f033dSHerbert Xu 1199da7f033dSHerbert Xu ilen = ctemplate[i].inlen; 1200da7f033dSHerbert Xu ret = crypto_comp_compress(tfm, ctemplate[i].input, 1201da7f033dSHerbert Xu ilen, result, &dlen); 1202da7f033dSHerbert Xu if (ret) { 1203da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: compression failed " 1204da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1205da7f033dSHerbert Xu -ret); 1206da7f033dSHerbert Xu goto out; 1207da7f033dSHerbert Xu } 1208da7f033dSHerbert Xu 1209b812eb00SGeert Uytterhoeven if (dlen != ctemplate[i].outlen) { 1210b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Compression test %d " 1211b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1212b812eb00SGeert Uytterhoeven dlen); 1213b812eb00SGeert Uytterhoeven ret = -EINVAL; 1214b812eb00SGeert Uytterhoeven goto out; 1215b812eb00SGeert Uytterhoeven } 1216b812eb00SGeert Uytterhoeven 1217da7f033dSHerbert Xu if (memcmp(result, ctemplate[i].output, dlen)) { 1218da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Compression test %d " 1219da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 1220da7f033dSHerbert Xu hexdump(result, dlen); 1221da7f033dSHerbert Xu ret = -EINVAL; 1222da7f033dSHerbert Xu goto out; 1223da7f033dSHerbert Xu } 1224da7f033dSHerbert Xu } 1225da7f033dSHerbert Xu 1226da7f033dSHerbert Xu for (i = 0; i < dtcount; i++) { 1227c79cf910SGeert Uytterhoeven int ilen; 1228c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 1229da7f033dSHerbert Xu 1230da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 1231da7f033dSHerbert Xu 1232da7f033dSHerbert Xu ilen = dtemplate[i].inlen; 1233da7f033dSHerbert Xu ret = crypto_comp_decompress(tfm, dtemplate[i].input, 1234da7f033dSHerbert Xu ilen, result, &dlen); 1235da7f033dSHerbert Xu if (ret) { 1236da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: decompression failed " 1237da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1238da7f033dSHerbert Xu -ret); 1239da7f033dSHerbert Xu goto out; 1240da7f033dSHerbert Xu } 1241da7f033dSHerbert Xu 1242b812eb00SGeert Uytterhoeven if (dlen != dtemplate[i].outlen) { 1243b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Decompression test %d " 1244b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1245b812eb00SGeert Uytterhoeven dlen); 1246b812eb00SGeert Uytterhoeven ret = -EINVAL; 1247b812eb00SGeert Uytterhoeven goto out; 1248b812eb00SGeert Uytterhoeven } 1249b812eb00SGeert Uytterhoeven 1250da7f033dSHerbert Xu if (memcmp(result, dtemplate[i].output, dlen)) { 1251da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Decompression test %d " 1252da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 1253da7f033dSHerbert Xu hexdump(result, dlen); 1254da7f033dSHerbert Xu ret = -EINVAL; 1255da7f033dSHerbert Xu goto out; 1256da7f033dSHerbert Xu } 1257da7f033dSHerbert Xu } 1258da7f033dSHerbert Xu 1259da7f033dSHerbert Xu ret = 0; 1260da7f033dSHerbert Xu 1261da7f033dSHerbert Xu out: 1262da7f033dSHerbert Xu return ret; 1263da7f033dSHerbert Xu } 1264da7f033dSHerbert Xu 12658064efb8SGeert Uytterhoeven static int test_pcomp(struct crypto_pcomp *tfm, 12668064efb8SGeert Uytterhoeven struct pcomp_testvec *ctemplate, 12678064efb8SGeert Uytterhoeven struct pcomp_testvec *dtemplate, int ctcount, 12688064efb8SGeert Uytterhoeven int dtcount) 12698064efb8SGeert Uytterhoeven { 12708064efb8SGeert Uytterhoeven const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm)); 12718064efb8SGeert Uytterhoeven unsigned int i; 12728064efb8SGeert Uytterhoeven char result[COMP_BUF_SIZE]; 12733ce858cbSGeert Uytterhoeven int res; 12748064efb8SGeert Uytterhoeven 12758064efb8SGeert Uytterhoeven for (i = 0; i < ctcount; i++) { 12768064efb8SGeert Uytterhoeven struct comp_request req; 12773ce858cbSGeert Uytterhoeven unsigned int produced = 0; 12788064efb8SGeert Uytterhoeven 12793ce858cbSGeert Uytterhoeven res = crypto_compress_setup(tfm, ctemplate[i].params, 12808064efb8SGeert Uytterhoeven ctemplate[i].paramsize); 12813ce858cbSGeert Uytterhoeven if (res) { 12828064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression setup failed on test " 12833ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 12843ce858cbSGeert Uytterhoeven return res; 12858064efb8SGeert Uytterhoeven } 12868064efb8SGeert Uytterhoeven 12873ce858cbSGeert Uytterhoeven res = crypto_compress_init(tfm); 12883ce858cbSGeert Uytterhoeven if (res) { 12898064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression init failed on test " 12903ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 12913ce858cbSGeert Uytterhoeven return res; 12928064efb8SGeert Uytterhoeven } 12938064efb8SGeert Uytterhoeven 12948064efb8SGeert Uytterhoeven memset(result, 0, sizeof(result)); 12958064efb8SGeert Uytterhoeven 12968064efb8SGeert Uytterhoeven req.next_in = ctemplate[i].input; 12978064efb8SGeert Uytterhoeven req.avail_in = ctemplate[i].inlen / 2; 12988064efb8SGeert Uytterhoeven req.next_out = result; 12998064efb8SGeert Uytterhoeven req.avail_out = ctemplate[i].outlen / 2; 13008064efb8SGeert Uytterhoeven 13013ce858cbSGeert Uytterhoeven res = crypto_compress_update(tfm, &req); 13023ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 13038064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression update failed on test " 13043ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 13053ce858cbSGeert Uytterhoeven return res; 13068064efb8SGeert Uytterhoeven } 13073ce858cbSGeert Uytterhoeven if (res > 0) 13083ce858cbSGeert Uytterhoeven produced += res; 13098064efb8SGeert Uytterhoeven 13108064efb8SGeert Uytterhoeven /* Add remaining input data */ 13118064efb8SGeert Uytterhoeven req.avail_in += (ctemplate[i].inlen + 1) / 2; 13128064efb8SGeert Uytterhoeven 13133ce858cbSGeert Uytterhoeven res = crypto_compress_update(tfm, &req); 13143ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 13158064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression update failed on test " 13163ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 13173ce858cbSGeert Uytterhoeven return res; 13188064efb8SGeert Uytterhoeven } 13193ce858cbSGeert Uytterhoeven if (res > 0) 13203ce858cbSGeert Uytterhoeven produced += res; 13218064efb8SGeert Uytterhoeven 13228064efb8SGeert Uytterhoeven /* Provide remaining output space */ 13238064efb8SGeert Uytterhoeven req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2; 13248064efb8SGeert Uytterhoeven 13253ce858cbSGeert Uytterhoeven res = crypto_compress_final(tfm, &req); 13263ce858cbSGeert Uytterhoeven if (res < 0) { 13278064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression final failed on test " 13283ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 13293ce858cbSGeert Uytterhoeven return res; 13308064efb8SGeert Uytterhoeven } 13313ce858cbSGeert Uytterhoeven produced += res; 13328064efb8SGeert Uytterhoeven 13338064efb8SGeert Uytterhoeven if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) { 13348064efb8SGeert Uytterhoeven pr_err("alg: comp: Compression test %d failed for %s: " 13358064efb8SGeert Uytterhoeven "output len = %d (expected %d)\n", i + 1, algo, 13368064efb8SGeert Uytterhoeven COMP_BUF_SIZE - req.avail_out, 13378064efb8SGeert Uytterhoeven ctemplate[i].outlen); 13388064efb8SGeert Uytterhoeven return -EINVAL; 13398064efb8SGeert Uytterhoeven } 13408064efb8SGeert Uytterhoeven 13413ce858cbSGeert Uytterhoeven if (produced != ctemplate[i].outlen) { 13423ce858cbSGeert Uytterhoeven pr_err("alg: comp: Compression test %d failed for %s: " 13433ce858cbSGeert Uytterhoeven "returned len = %u (expected %d)\n", i + 1, 13443ce858cbSGeert Uytterhoeven algo, produced, ctemplate[i].outlen); 13453ce858cbSGeert Uytterhoeven return -EINVAL; 13463ce858cbSGeert Uytterhoeven } 13473ce858cbSGeert Uytterhoeven 13488064efb8SGeert Uytterhoeven if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) { 13498064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Compression test %d failed for " 13508064efb8SGeert Uytterhoeven "%s\n", i + 1, algo); 13518064efb8SGeert Uytterhoeven hexdump(result, ctemplate[i].outlen); 13528064efb8SGeert Uytterhoeven return -EINVAL; 13538064efb8SGeert Uytterhoeven } 13548064efb8SGeert Uytterhoeven } 13558064efb8SGeert Uytterhoeven 13568064efb8SGeert Uytterhoeven for (i = 0; i < dtcount; i++) { 13578064efb8SGeert Uytterhoeven struct comp_request req; 13583ce858cbSGeert Uytterhoeven unsigned int produced = 0; 13598064efb8SGeert Uytterhoeven 13603ce858cbSGeert Uytterhoeven res = crypto_decompress_setup(tfm, dtemplate[i].params, 13618064efb8SGeert Uytterhoeven dtemplate[i].paramsize); 13623ce858cbSGeert Uytterhoeven if (res) { 13638064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression setup failed on " 13643ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 13653ce858cbSGeert Uytterhoeven return res; 13668064efb8SGeert Uytterhoeven } 13678064efb8SGeert Uytterhoeven 13683ce858cbSGeert Uytterhoeven res = crypto_decompress_init(tfm); 13693ce858cbSGeert Uytterhoeven if (res) { 13708064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression init failed on test " 13713ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 13723ce858cbSGeert Uytterhoeven return res; 13738064efb8SGeert Uytterhoeven } 13748064efb8SGeert Uytterhoeven 13758064efb8SGeert Uytterhoeven memset(result, 0, sizeof(result)); 13768064efb8SGeert Uytterhoeven 13778064efb8SGeert Uytterhoeven req.next_in = dtemplate[i].input; 13788064efb8SGeert Uytterhoeven req.avail_in = dtemplate[i].inlen / 2; 13798064efb8SGeert Uytterhoeven req.next_out = result; 13808064efb8SGeert Uytterhoeven req.avail_out = dtemplate[i].outlen / 2; 13818064efb8SGeert Uytterhoeven 13823ce858cbSGeert Uytterhoeven res = crypto_decompress_update(tfm, &req); 13833ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 13848064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression update failed on " 13853ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 13863ce858cbSGeert Uytterhoeven return res; 13878064efb8SGeert Uytterhoeven } 13883ce858cbSGeert Uytterhoeven if (res > 0) 13893ce858cbSGeert Uytterhoeven produced += res; 13908064efb8SGeert Uytterhoeven 13918064efb8SGeert Uytterhoeven /* Add remaining input data */ 13928064efb8SGeert Uytterhoeven req.avail_in += (dtemplate[i].inlen + 1) / 2; 13938064efb8SGeert Uytterhoeven 13943ce858cbSGeert Uytterhoeven res = crypto_decompress_update(tfm, &req); 13953ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 13968064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression update failed on " 13973ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 13983ce858cbSGeert Uytterhoeven return res; 13998064efb8SGeert Uytterhoeven } 14003ce858cbSGeert Uytterhoeven if (res > 0) 14013ce858cbSGeert Uytterhoeven produced += res; 14028064efb8SGeert Uytterhoeven 14038064efb8SGeert Uytterhoeven /* Provide remaining output space */ 14048064efb8SGeert Uytterhoeven req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2; 14058064efb8SGeert Uytterhoeven 14063ce858cbSGeert Uytterhoeven res = crypto_decompress_final(tfm, &req); 14073ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 14088064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression final failed on " 14093ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 14103ce858cbSGeert Uytterhoeven return res; 14118064efb8SGeert Uytterhoeven } 14123ce858cbSGeert Uytterhoeven if (res > 0) 14133ce858cbSGeert Uytterhoeven produced += res; 14148064efb8SGeert Uytterhoeven 14158064efb8SGeert Uytterhoeven if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) { 14168064efb8SGeert Uytterhoeven pr_err("alg: comp: Decompression test %d failed for " 14178064efb8SGeert Uytterhoeven "%s: output len = %d (expected %d)\n", i + 1, 14188064efb8SGeert Uytterhoeven algo, COMP_BUF_SIZE - req.avail_out, 14198064efb8SGeert Uytterhoeven dtemplate[i].outlen); 14208064efb8SGeert Uytterhoeven return -EINVAL; 14218064efb8SGeert Uytterhoeven } 14228064efb8SGeert Uytterhoeven 14233ce858cbSGeert Uytterhoeven if (produced != dtemplate[i].outlen) { 14243ce858cbSGeert Uytterhoeven pr_err("alg: comp: Decompression test %d failed for " 14253ce858cbSGeert Uytterhoeven "%s: returned len = %u (expected %d)\n", i + 1, 14263ce858cbSGeert Uytterhoeven algo, produced, dtemplate[i].outlen); 14273ce858cbSGeert Uytterhoeven return -EINVAL; 14283ce858cbSGeert Uytterhoeven } 14293ce858cbSGeert Uytterhoeven 14308064efb8SGeert Uytterhoeven if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) { 14318064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Decompression test %d failed for " 14328064efb8SGeert Uytterhoeven "%s\n", i + 1, algo); 14338064efb8SGeert Uytterhoeven hexdump(result, dtemplate[i].outlen); 14348064efb8SGeert Uytterhoeven return -EINVAL; 14358064efb8SGeert Uytterhoeven } 14368064efb8SGeert Uytterhoeven } 14378064efb8SGeert Uytterhoeven 14388064efb8SGeert Uytterhoeven return 0; 14398064efb8SGeert Uytterhoeven } 14408064efb8SGeert Uytterhoeven 14417647d6ceSJarod Wilson 14427647d6ceSJarod Wilson static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template, 14437647d6ceSJarod Wilson unsigned int tcount) 14447647d6ceSJarod Wilson { 14457647d6ceSJarod Wilson const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm)); 1446fa4ef8a6SFelipe Contreras int err = 0, i, j, seedsize; 14477647d6ceSJarod Wilson u8 *seed; 14487647d6ceSJarod Wilson char result[32]; 14497647d6ceSJarod Wilson 14507647d6ceSJarod Wilson seedsize = crypto_rng_seedsize(tfm); 14517647d6ceSJarod Wilson 14527647d6ceSJarod Wilson seed = kmalloc(seedsize, GFP_KERNEL); 14537647d6ceSJarod Wilson if (!seed) { 14547647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to allocate seed space " 14557647d6ceSJarod Wilson "for %s\n", algo); 14567647d6ceSJarod Wilson return -ENOMEM; 14577647d6ceSJarod Wilson } 14587647d6ceSJarod Wilson 14597647d6ceSJarod Wilson for (i = 0; i < tcount; i++) { 14607647d6ceSJarod Wilson memset(result, 0, 32); 14617647d6ceSJarod Wilson 14627647d6ceSJarod Wilson memcpy(seed, template[i].v, template[i].vlen); 14637647d6ceSJarod Wilson memcpy(seed + template[i].vlen, template[i].key, 14647647d6ceSJarod Wilson template[i].klen); 14657647d6ceSJarod Wilson memcpy(seed + template[i].vlen + template[i].klen, 14667647d6ceSJarod Wilson template[i].dt, template[i].dtlen); 14677647d6ceSJarod Wilson 14687647d6ceSJarod Wilson err = crypto_rng_reset(tfm, seed, seedsize); 14697647d6ceSJarod Wilson if (err) { 14707647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to reset rng " 14717647d6ceSJarod Wilson "for %s\n", algo); 14727647d6ceSJarod Wilson goto out; 14737647d6ceSJarod Wilson } 14747647d6ceSJarod Wilson 14757647d6ceSJarod Wilson for (j = 0; j < template[i].loops; j++) { 14767647d6ceSJarod Wilson err = crypto_rng_get_bytes(tfm, result, 14777647d6ceSJarod Wilson template[i].rlen); 147819e60e13SStephan Mueller if (err < 0) { 14797647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to obtain " 14807647d6ceSJarod Wilson "the correct amount of random data for " 148119e60e13SStephan Mueller "%s (requested %d)\n", algo, 148219e60e13SStephan Mueller template[i].rlen); 14837647d6ceSJarod Wilson goto out; 14847647d6ceSJarod Wilson } 14857647d6ceSJarod Wilson } 14867647d6ceSJarod Wilson 14877647d6ceSJarod Wilson err = memcmp(result, template[i].result, 14887647d6ceSJarod Wilson template[i].rlen); 14897647d6ceSJarod Wilson if (err) { 14907647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Test %d failed for %s\n", 14917647d6ceSJarod Wilson i, algo); 14927647d6ceSJarod Wilson hexdump(result, template[i].rlen); 14937647d6ceSJarod Wilson err = -EINVAL; 14947647d6ceSJarod Wilson goto out; 14957647d6ceSJarod Wilson } 14967647d6ceSJarod Wilson } 14977647d6ceSJarod Wilson 14987647d6ceSJarod Wilson out: 14997647d6ceSJarod Wilson kfree(seed); 15007647d6ceSJarod Wilson return err; 15017647d6ceSJarod Wilson } 15027647d6ceSJarod Wilson 1503da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver, 1504da7f033dSHerbert Xu u32 type, u32 mask) 1505da7f033dSHerbert Xu { 1506da7f033dSHerbert Xu struct crypto_aead *tfm; 1507da7f033dSHerbert Xu int err = 0; 1508da7f033dSHerbert Xu 1509425a8829SStephan Mueller tfm = crypto_alloc_aead(driver, type | CRYPTO_ALG_INTERNAL, mask); 1510da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1511da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to load transform for %s: " 1512da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1513da7f033dSHerbert Xu return PTR_ERR(tfm); 1514da7f033dSHerbert Xu } 1515da7f033dSHerbert Xu 1516da7f033dSHerbert Xu if (desc->suite.aead.enc.vecs) { 1517da7f033dSHerbert Xu err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs, 1518da7f033dSHerbert Xu desc->suite.aead.enc.count); 1519da7f033dSHerbert Xu if (err) 1520da7f033dSHerbert Xu goto out; 1521da7f033dSHerbert Xu } 1522da7f033dSHerbert Xu 1523da7f033dSHerbert Xu if (!err && desc->suite.aead.dec.vecs) 1524da7f033dSHerbert Xu err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs, 1525da7f033dSHerbert Xu desc->suite.aead.dec.count); 1526da7f033dSHerbert Xu 1527da7f033dSHerbert Xu out: 1528da7f033dSHerbert Xu crypto_free_aead(tfm); 1529da7f033dSHerbert Xu return err; 1530da7f033dSHerbert Xu } 1531da7f033dSHerbert Xu 1532da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc, 1533da7f033dSHerbert Xu const char *driver, u32 type, u32 mask) 1534da7f033dSHerbert Xu { 15351aa4ecd9SHerbert Xu struct crypto_cipher *tfm; 1536da7f033dSHerbert Xu int err = 0; 1537da7f033dSHerbert Xu 1538425a8829SStephan Mueller tfm = crypto_alloc_cipher(driver, type | CRYPTO_ALG_INTERNAL, mask); 1539da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1540da7f033dSHerbert Xu printk(KERN_ERR "alg: cipher: Failed to load transform for " 1541da7f033dSHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 1542da7f033dSHerbert Xu return PTR_ERR(tfm); 1543da7f033dSHerbert Xu } 1544da7f033dSHerbert Xu 1545da7f033dSHerbert Xu if (desc->suite.cipher.enc.vecs) { 1546da7f033dSHerbert Xu err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 1547da7f033dSHerbert Xu desc->suite.cipher.enc.count); 1548da7f033dSHerbert Xu if (err) 1549da7f033dSHerbert Xu goto out; 1550da7f033dSHerbert Xu } 1551da7f033dSHerbert Xu 1552da7f033dSHerbert Xu if (desc->suite.cipher.dec.vecs) 1553da7f033dSHerbert Xu err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 1554da7f033dSHerbert Xu desc->suite.cipher.dec.count); 1555da7f033dSHerbert Xu 1556da7f033dSHerbert Xu out: 15571aa4ecd9SHerbert Xu crypto_free_cipher(tfm); 15581aa4ecd9SHerbert Xu return err; 15591aa4ecd9SHerbert Xu } 15601aa4ecd9SHerbert Xu 15611aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc, 15621aa4ecd9SHerbert Xu const char *driver, u32 type, u32 mask) 15631aa4ecd9SHerbert Xu { 15641aa4ecd9SHerbert Xu struct crypto_ablkcipher *tfm; 15651aa4ecd9SHerbert Xu int err = 0; 15661aa4ecd9SHerbert Xu 1567425a8829SStephan Mueller tfm = crypto_alloc_ablkcipher(driver, type | CRYPTO_ALG_INTERNAL, mask); 15681aa4ecd9SHerbert Xu if (IS_ERR(tfm)) { 15691aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Failed to load transform for " 15701aa4ecd9SHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 15711aa4ecd9SHerbert Xu return PTR_ERR(tfm); 15721aa4ecd9SHerbert Xu } 15731aa4ecd9SHerbert Xu 15741aa4ecd9SHerbert Xu if (desc->suite.cipher.enc.vecs) { 15751aa4ecd9SHerbert Xu err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 15761aa4ecd9SHerbert Xu desc->suite.cipher.enc.count); 15771aa4ecd9SHerbert Xu if (err) 15781aa4ecd9SHerbert Xu goto out; 15791aa4ecd9SHerbert Xu } 15801aa4ecd9SHerbert Xu 15811aa4ecd9SHerbert Xu if (desc->suite.cipher.dec.vecs) 15821aa4ecd9SHerbert Xu err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 15831aa4ecd9SHerbert Xu desc->suite.cipher.dec.count); 15841aa4ecd9SHerbert Xu 15851aa4ecd9SHerbert Xu out: 1586da7f033dSHerbert Xu crypto_free_ablkcipher(tfm); 1587da7f033dSHerbert Xu return err; 1588da7f033dSHerbert Xu } 1589da7f033dSHerbert Xu 1590da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver, 1591da7f033dSHerbert Xu u32 type, u32 mask) 1592da7f033dSHerbert Xu { 1593da7f033dSHerbert Xu struct crypto_comp *tfm; 1594da7f033dSHerbert Xu int err; 1595da7f033dSHerbert Xu 1596da7f033dSHerbert Xu tfm = crypto_alloc_comp(driver, type, mask); 1597da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1598da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Failed to load transform for %s: " 1599da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1600da7f033dSHerbert Xu return PTR_ERR(tfm); 1601da7f033dSHerbert Xu } 1602da7f033dSHerbert Xu 1603da7f033dSHerbert Xu err = test_comp(tfm, desc->suite.comp.comp.vecs, 1604da7f033dSHerbert Xu desc->suite.comp.decomp.vecs, 1605da7f033dSHerbert Xu desc->suite.comp.comp.count, 1606da7f033dSHerbert Xu desc->suite.comp.decomp.count); 1607da7f033dSHerbert Xu 1608da7f033dSHerbert Xu crypto_free_comp(tfm); 1609da7f033dSHerbert Xu return err; 1610da7f033dSHerbert Xu } 1611da7f033dSHerbert Xu 16128064efb8SGeert Uytterhoeven static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver, 16138064efb8SGeert Uytterhoeven u32 type, u32 mask) 16148064efb8SGeert Uytterhoeven { 16158064efb8SGeert Uytterhoeven struct crypto_pcomp *tfm; 16168064efb8SGeert Uytterhoeven int err; 16178064efb8SGeert Uytterhoeven 16188064efb8SGeert Uytterhoeven tfm = crypto_alloc_pcomp(driver, type, mask); 16198064efb8SGeert Uytterhoeven if (IS_ERR(tfm)) { 16208064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Failed to load transform for %s: %ld\n", 16218064efb8SGeert Uytterhoeven driver, PTR_ERR(tfm)); 16228064efb8SGeert Uytterhoeven return PTR_ERR(tfm); 16238064efb8SGeert Uytterhoeven } 16248064efb8SGeert Uytterhoeven 16258064efb8SGeert Uytterhoeven err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs, 16268064efb8SGeert Uytterhoeven desc->suite.pcomp.decomp.vecs, 16278064efb8SGeert Uytterhoeven desc->suite.pcomp.comp.count, 16288064efb8SGeert Uytterhoeven desc->suite.pcomp.decomp.count); 16298064efb8SGeert Uytterhoeven 16308064efb8SGeert Uytterhoeven crypto_free_pcomp(tfm); 16318064efb8SGeert Uytterhoeven return err; 16328064efb8SGeert Uytterhoeven } 16338064efb8SGeert Uytterhoeven 1634da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver, 1635da7f033dSHerbert Xu u32 type, u32 mask) 1636da7f033dSHerbert Xu { 1637da7f033dSHerbert Xu struct crypto_ahash *tfm; 1638da7f033dSHerbert Xu int err; 1639da7f033dSHerbert Xu 1640425a8829SStephan Mueller tfm = crypto_alloc_ahash(driver, type | CRYPTO_ALG_INTERNAL, mask); 1641da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1642da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to load transform for %s: " 1643da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1644da7f033dSHerbert Xu return PTR_ERR(tfm); 1645da7f033dSHerbert Xu } 1646da7f033dSHerbert Xu 1647a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1648a8f1a052SDavid S. Miller desc->suite.hash.count, true); 1649a8f1a052SDavid S. Miller if (!err) 1650a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1651a8f1a052SDavid S. Miller desc->suite.hash.count, false); 1652da7f033dSHerbert Xu 1653da7f033dSHerbert Xu crypto_free_ahash(tfm); 1654da7f033dSHerbert Xu return err; 1655da7f033dSHerbert Xu } 1656da7f033dSHerbert Xu 16578e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc, 16588e3ee85eSHerbert Xu const char *driver, u32 type, u32 mask) 16598e3ee85eSHerbert Xu { 16608e3ee85eSHerbert Xu struct crypto_shash *tfm; 16618e3ee85eSHerbert Xu u32 val; 16628e3ee85eSHerbert Xu int err; 16638e3ee85eSHerbert Xu 16648e3ee85eSHerbert Xu err = alg_test_hash(desc, driver, type, mask); 16658e3ee85eSHerbert Xu if (err) 16668e3ee85eSHerbert Xu goto out; 16678e3ee85eSHerbert Xu 1668425a8829SStephan Mueller tfm = crypto_alloc_shash(driver, type | CRYPTO_ALG_INTERNAL, mask); 16698e3ee85eSHerbert Xu if (IS_ERR(tfm)) { 16708e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: " 16718e3ee85eSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 16728e3ee85eSHerbert Xu err = PTR_ERR(tfm); 16738e3ee85eSHerbert Xu goto out; 16748e3ee85eSHerbert Xu } 16758e3ee85eSHerbert Xu 16768e3ee85eSHerbert Xu do { 16774c5c3024SJan-Simon Möller SHASH_DESC_ON_STACK(shash, tfm); 16784c5c3024SJan-Simon Möller u32 *ctx = (u32 *)shash_desc_ctx(shash); 16798e3ee85eSHerbert Xu 16804c5c3024SJan-Simon Möller shash->tfm = tfm; 16814c5c3024SJan-Simon Möller shash->flags = 0; 16828e3ee85eSHerbert Xu 16834c5c3024SJan-Simon Möller *ctx = le32_to_cpu(420553207); 16844c5c3024SJan-Simon Möller err = crypto_shash_final(shash, (u8 *)&val); 16858e3ee85eSHerbert Xu if (err) { 16868e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Operation failed for " 16878e3ee85eSHerbert Xu "%s: %d\n", driver, err); 16888e3ee85eSHerbert Xu break; 16898e3ee85eSHerbert Xu } 16908e3ee85eSHerbert Xu 16918e3ee85eSHerbert Xu if (val != ~420553207) { 16928e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Test failed for %s: " 16938e3ee85eSHerbert Xu "%d\n", driver, val); 16948e3ee85eSHerbert Xu err = -EINVAL; 16958e3ee85eSHerbert Xu } 16968e3ee85eSHerbert Xu } while (0); 16978e3ee85eSHerbert Xu 16988e3ee85eSHerbert Xu crypto_free_shash(tfm); 16998e3ee85eSHerbert Xu 17008e3ee85eSHerbert Xu out: 17018e3ee85eSHerbert Xu return err; 17028e3ee85eSHerbert Xu } 17038e3ee85eSHerbert Xu 17047647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver, 17057647d6ceSJarod Wilson u32 type, u32 mask) 17067647d6ceSJarod Wilson { 17077647d6ceSJarod Wilson struct crypto_rng *rng; 17087647d6ceSJarod Wilson int err; 17097647d6ceSJarod Wilson 1710425a8829SStephan Mueller rng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask); 17117647d6ceSJarod Wilson if (IS_ERR(rng)) { 17127647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to load transform for %s: " 17137647d6ceSJarod Wilson "%ld\n", driver, PTR_ERR(rng)); 17147647d6ceSJarod Wilson return PTR_ERR(rng); 17157647d6ceSJarod Wilson } 17167647d6ceSJarod Wilson 17177647d6ceSJarod Wilson err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count); 17187647d6ceSJarod Wilson 17197647d6ceSJarod Wilson crypto_free_rng(rng); 17207647d6ceSJarod Wilson 17217647d6ceSJarod Wilson return err; 17227647d6ceSJarod Wilson } 17237647d6ceSJarod Wilson 172464d1cdfbSStephan Mueller 172564d1cdfbSStephan Mueller static int drbg_cavs_test(struct drbg_testvec *test, int pr, 172664d1cdfbSStephan Mueller const char *driver, u32 type, u32 mask) 172764d1cdfbSStephan Mueller { 172864d1cdfbSStephan Mueller int ret = -EAGAIN; 172964d1cdfbSStephan Mueller struct crypto_rng *drng; 173064d1cdfbSStephan Mueller struct drbg_test_data test_data; 173164d1cdfbSStephan Mueller struct drbg_string addtl, pers, testentropy; 173264d1cdfbSStephan Mueller unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL); 173364d1cdfbSStephan Mueller 173464d1cdfbSStephan Mueller if (!buf) 173564d1cdfbSStephan Mueller return -ENOMEM; 173664d1cdfbSStephan Mueller 1737425a8829SStephan Mueller drng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask); 173864d1cdfbSStephan Mueller if (IS_ERR(drng)) { 173964d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for " 174064d1cdfbSStephan Mueller "%s\n", driver); 174164d1cdfbSStephan Mueller kzfree(buf); 174264d1cdfbSStephan Mueller return -ENOMEM; 174364d1cdfbSStephan Mueller } 174464d1cdfbSStephan Mueller 174564d1cdfbSStephan Mueller test_data.testentropy = &testentropy; 174664d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entropy, test->entropylen); 174764d1cdfbSStephan Mueller drbg_string_fill(&pers, test->pers, test->perslen); 174864d1cdfbSStephan Mueller ret = crypto_drbg_reset_test(drng, &pers, &test_data); 174964d1cdfbSStephan Mueller if (ret) { 175064d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: Failed to reset rng\n"); 175164d1cdfbSStephan Mueller goto outbuf; 175264d1cdfbSStephan Mueller } 175364d1cdfbSStephan Mueller 175464d1cdfbSStephan Mueller drbg_string_fill(&addtl, test->addtla, test->addtllen); 175564d1cdfbSStephan Mueller if (pr) { 175664d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entpra, test->entprlen); 175764d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl_test(drng, 175864d1cdfbSStephan Mueller buf, test->expectedlen, &addtl, &test_data); 175964d1cdfbSStephan Mueller } else { 176064d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl(drng, 176164d1cdfbSStephan Mueller buf, test->expectedlen, &addtl); 176264d1cdfbSStephan Mueller } 176319e60e13SStephan Mueller if (ret < 0) { 176464d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not obtain random data for " 176564d1cdfbSStephan Mueller "driver %s\n", driver); 176664d1cdfbSStephan Mueller goto outbuf; 176764d1cdfbSStephan Mueller } 176864d1cdfbSStephan Mueller 176964d1cdfbSStephan Mueller drbg_string_fill(&addtl, test->addtlb, test->addtllen); 177064d1cdfbSStephan Mueller if (pr) { 177164d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entprb, test->entprlen); 177264d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl_test(drng, 177364d1cdfbSStephan Mueller buf, test->expectedlen, &addtl, &test_data); 177464d1cdfbSStephan Mueller } else { 177564d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl(drng, 177664d1cdfbSStephan Mueller buf, test->expectedlen, &addtl); 177764d1cdfbSStephan Mueller } 177819e60e13SStephan Mueller if (ret < 0) { 177964d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not obtain random data for " 178064d1cdfbSStephan Mueller "driver %s\n", driver); 178164d1cdfbSStephan Mueller goto outbuf; 178264d1cdfbSStephan Mueller } 178364d1cdfbSStephan Mueller 178464d1cdfbSStephan Mueller ret = memcmp(test->expected, buf, test->expectedlen); 178564d1cdfbSStephan Mueller 178664d1cdfbSStephan Mueller outbuf: 178764d1cdfbSStephan Mueller crypto_free_rng(drng); 178864d1cdfbSStephan Mueller kzfree(buf); 178964d1cdfbSStephan Mueller return ret; 179064d1cdfbSStephan Mueller } 179164d1cdfbSStephan Mueller 179264d1cdfbSStephan Mueller 179364d1cdfbSStephan Mueller static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver, 179464d1cdfbSStephan Mueller u32 type, u32 mask) 179564d1cdfbSStephan Mueller { 179664d1cdfbSStephan Mueller int err = 0; 179764d1cdfbSStephan Mueller int pr = 0; 179864d1cdfbSStephan Mueller int i = 0; 179964d1cdfbSStephan Mueller struct drbg_testvec *template = desc->suite.drbg.vecs; 180064d1cdfbSStephan Mueller unsigned int tcount = desc->suite.drbg.count; 180164d1cdfbSStephan Mueller 180264d1cdfbSStephan Mueller if (0 == memcmp(driver, "drbg_pr_", 8)) 180364d1cdfbSStephan Mueller pr = 1; 180464d1cdfbSStephan Mueller 180564d1cdfbSStephan Mueller for (i = 0; i < tcount; i++) { 180664d1cdfbSStephan Mueller err = drbg_cavs_test(&template[i], pr, driver, type, mask); 180764d1cdfbSStephan Mueller if (err) { 180864d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: Test %d failed for %s\n", 180964d1cdfbSStephan Mueller i, driver); 181064d1cdfbSStephan Mueller err = -EINVAL; 181164d1cdfbSStephan Mueller break; 181264d1cdfbSStephan Mueller } 181364d1cdfbSStephan Mueller } 181464d1cdfbSStephan Mueller return err; 181564d1cdfbSStephan Mueller 181664d1cdfbSStephan Mueller } 181764d1cdfbSStephan Mueller 1818863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc, 1819863b557aSYouquan, Song const char *driver, u32 type, u32 mask) 1820863b557aSYouquan, Song { 1821863b557aSYouquan, Song return 0; 1822863b557aSYouquan, Song } 1823863b557aSYouquan, Song 1824da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */ 1825da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = { 1826da7f033dSHerbert Xu { 18274d6d6a2cSJohannes Goetzfried .alg = "__cbc-cast5-avx", 18284d6d6a2cSJohannes Goetzfried .test = alg_test_null, 18294d6d6a2cSJohannes Goetzfried }, { 18304ea1277dSJohannes Goetzfried .alg = "__cbc-cast6-avx", 18314ea1277dSJohannes Goetzfried .test = alg_test_null, 18324ea1277dSJohannes Goetzfried }, { 18337efe4076SJohannes Goetzfried .alg = "__cbc-serpent-avx", 18347efe4076SJohannes Goetzfried .test = alg_test_null, 18357efe4076SJohannes Goetzfried }, { 183656d76c96SJussi Kivilinna .alg = "__cbc-serpent-avx2", 183756d76c96SJussi Kivilinna .test = alg_test_null, 183856d76c96SJussi Kivilinna }, { 1839937c30d7SJussi Kivilinna .alg = "__cbc-serpent-sse2", 1840937c30d7SJussi Kivilinna .test = alg_test_null, 1841937c30d7SJussi Kivilinna }, { 1842107778b5SJohannes Goetzfried .alg = "__cbc-twofish-avx", 1843107778b5SJohannes Goetzfried .test = alg_test_null, 1844107778b5SJohannes Goetzfried }, { 1845863b557aSYouquan, Song .alg = "__driver-cbc-aes-aesni", 1846863b557aSYouquan, Song .test = alg_test_null, 18476c79294fSMilan Broz .fips_allowed = 1, 1848863b557aSYouquan, Song }, { 1849d9b1d2e7SJussi Kivilinna .alg = "__driver-cbc-camellia-aesni", 1850d9b1d2e7SJussi Kivilinna .test = alg_test_null, 1851d9b1d2e7SJussi Kivilinna }, { 1852f3f935a7SJussi Kivilinna .alg = "__driver-cbc-camellia-aesni-avx2", 1853f3f935a7SJussi Kivilinna .test = alg_test_null, 1854f3f935a7SJussi Kivilinna }, { 18554d6d6a2cSJohannes Goetzfried .alg = "__driver-cbc-cast5-avx", 18564d6d6a2cSJohannes Goetzfried .test = alg_test_null, 18574d6d6a2cSJohannes Goetzfried }, { 18584ea1277dSJohannes Goetzfried .alg = "__driver-cbc-cast6-avx", 18594ea1277dSJohannes Goetzfried .test = alg_test_null, 18604ea1277dSJohannes Goetzfried }, { 18617efe4076SJohannes Goetzfried .alg = "__driver-cbc-serpent-avx", 18627efe4076SJohannes Goetzfried .test = alg_test_null, 18637efe4076SJohannes Goetzfried }, { 186456d76c96SJussi Kivilinna .alg = "__driver-cbc-serpent-avx2", 186556d76c96SJussi Kivilinna .test = alg_test_null, 186656d76c96SJussi Kivilinna }, { 1867937c30d7SJussi Kivilinna .alg = "__driver-cbc-serpent-sse2", 1868937c30d7SJussi Kivilinna .test = alg_test_null, 1869937c30d7SJussi Kivilinna }, { 1870107778b5SJohannes Goetzfried .alg = "__driver-cbc-twofish-avx", 1871107778b5SJohannes Goetzfried .test = alg_test_null, 1872107778b5SJohannes Goetzfried }, { 1873863b557aSYouquan, Song .alg = "__driver-ecb-aes-aesni", 1874863b557aSYouquan, Song .test = alg_test_null, 18756c79294fSMilan Broz .fips_allowed = 1, 1876863b557aSYouquan, Song }, { 1877d9b1d2e7SJussi Kivilinna .alg = "__driver-ecb-camellia-aesni", 1878d9b1d2e7SJussi Kivilinna .test = alg_test_null, 1879d9b1d2e7SJussi Kivilinna }, { 1880f3f935a7SJussi Kivilinna .alg = "__driver-ecb-camellia-aesni-avx2", 1881f3f935a7SJussi Kivilinna .test = alg_test_null, 1882f3f935a7SJussi Kivilinna }, { 18834d6d6a2cSJohannes Goetzfried .alg = "__driver-ecb-cast5-avx", 18844d6d6a2cSJohannes Goetzfried .test = alg_test_null, 18854d6d6a2cSJohannes Goetzfried }, { 18864ea1277dSJohannes Goetzfried .alg = "__driver-ecb-cast6-avx", 18874ea1277dSJohannes Goetzfried .test = alg_test_null, 18884ea1277dSJohannes Goetzfried }, { 18897efe4076SJohannes Goetzfried .alg = "__driver-ecb-serpent-avx", 18907efe4076SJohannes Goetzfried .test = alg_test_null, 18917efe4076SJohannes Goetzfried }, { 189256d76c96SJussi Kivilinna .alg = "__driver-ecb-serpent-avx2", 189356d76c96SJussi Kivilinna .test = alg_test_null, 189456d76c96SJussi Kivilinna }, { 1895937c30d7SJussi Kivilinna .alg = "__driver-ecb-serpent-sse2", 1896937c30d7SJussi Kivilinna .test = alg_test_null, 1897937c30d7SJussi Kivilinna }, { 1898107778b5SJohannes Goetzfried .alg = "__driver-ecb-twofish-avx", 1899107778b5SJohannes Goetzfried .test = alg_test_null, 1900107778b5SJohannes Goetzfried }, { 1901863b557aSYouquan, Song .alg = "__ghash-pclmulqdqni", 1902863b557aSYouquan, Song .test = alg_test_null, 19036c79294fSMilan Broz .fips_allowed = 1, 1904863b557aSYouquan, Song }, { 1905e08ca2daSJarod Wilson .alg = "ansi_cprng", 1906e08ca2daSJarod Wilson .test = alg_test_cprng, 1907a1915d51SJarod Wilson .fips_allowed = 1, 1908e08ca2daSJarod Wilson .suite = { 1909e08ca2daSJarod Wilson .cprng = { 1910e08ca2daSJarod Wilson .vecs = ansi_cprng_aes_tv_template, 1911e08ca2daSJarod Wilson .count = ANSI_CPRNG_AES_TEST_VECTORS 1912e08ca2daSJarod Wilson } 1913e08ca2daSJarod Wilson } 1914e08ca2daSJarod Wilson }, { 1915bca4feb0SHoria Geanta .alg = "authenc(hmac(md5),ecb(cipher_null))", 1916bca4feb0SHoria Geanta .test = alg_test_aead, 1917bca4feb0SHoria Geanta .fips_allowed = 1, 1918bca4feb0SHoria Geanta .suite = { 1919bca4feb0SHoria Geanta .aead = { 1920bca4feb0SHoria Geanta .enc = { 1921bca4feb0SHoria Geanta .vecs = hmac_md5_ecb_cipher_null_enc_tv_template, 1922bca4feb0SHoria Geanta .count = HMAC_MD5_ECB_CIPHER_NULL_ENC_TEST_VECTORS 1923bca4feb0SHoria Geanta }, 1924bca4feb0SHoria Geanta .dec = { 1925bca4feb0SHoria Geanta .vecs = hmac_md5_ecb_cipher_null_dec_tv_template, 1926bca4feb0SHoria Geanta .count = HMAC_MD5_ECB_CIPHER_NULL_DEC_TEST_VECTORS 1927bca4feb0SHoria Geanta } 1928bca4feb0SHoria Geanta } 1929bca4feb0SHoria Geanta } 1930bca4feb0SHoria Geanta }, { 1931e46e9a46SHoria Geanta .alg = "authenc(hmac(sha1),cbc(aes))", 1932e46e9a46SHoria Geanta .test = alg_test_aead, 1933e46e9a46SHoria Geanta .fips_allowed = 1, 1934e46e9a46SHoria Geanta .suite = { 1935e46e9a46SHoria Geanta .aead = { 1936e46e9a46SHoria Geanta .enc = { 19375208ed2cSNitesh Lal .vecs = 19385208ed2cSNitesh Lal hmac_sha1_aes_cbc_enc_tv_temp, 19395208ed2cSNitesh Lal .count = 19405208ed2cSNitesh Lal HMAC_SHA1_AES_CBC_ENC_TEST_VEC 19415208ed2cSNitesh Lal } 19425208ed2cSNitesh Lal } 19435208ed2cSNitesh Lal } 19445208ed2cSNitesh Lal }, { 19455208ed2cSNitesh Lal .alg = "authenc(hmac(sha1),cbc(des))", 19465208ed2cSNitesh Lal .test = alg_test_aead, 19475208ed2cSNitesh Lal .fips_allowed = 1, 19485208ed2cSNitesh Lal .suite = { 19495208ed2cSNitesh Lal .aead = { 19505208ed2cSNitesh Lal .enc = { 19515208ed2cSNitesh Lal .vecs = 19525208ed2cSNitesh Lal hmac_sha1_des_cbc_enc_tv_temp, 19535208ed2cSNitesh Lal .count = 19545208ed2cSNitesh Lal HMAC_SHA1_DES_CBC_ENC_TEST_VEC 19555208ed2cSNitesh Lal } 19565208ed2cSNitesh Lal } 19575208ed2cSNitesh Lal } 19585208ed2cSNitesh Lal }, { 19595208ed2cSNitesh Lal .alg = "authenc(hmac(sha1),cbc(des3_ede))", 19605208ed2cSNitesh Lal .test = alg_test_aead, 19615208ed2cSNitesh Lal .fips_allowed = 1, 19625208ed2cSNitesh Lal .suite = { 19635208ed2cSNitesh Lal .aead = { 19645208ed2cSNitesh Lal .enc = { 19655208ed2cSNitesh Lal .vecs = 19665208ed2cSNitesh Lal hmac_sha1_des3_ede_cbc_enc_tv_temp, 19675208ed2cSNitesh Lal .count = 19685208ed2cSNitesh Lal HMAC_SHA1_DES3_EDE_CBC_ENC_TEST_VEC 1969e46e9a46SHoria Geanta } 1970e46e9a46SHoria Geanta } 1971e46e9a46SHoria Geanta } 1972e46e9a46SHoria Geanta }, { 1973bca4feb0SHoria Geanta .alg = "authenc(hmac(sha1),ecb(cipher_null))", 1974bca4feb0SHoria Geanta .test = alg_test_aead, 1975bca4feb0SHoria Geanta .fips_allowed = 1, 1976bca4feb0SHoria Geanta .suite = { 1977bca4feb0SHoria Geanta .aead = { 1978bca4feb0SHoria Geanta .enc = { 19795208ed2cSNitesh Lal .vecs = 19805208ed2cSNitesh Lal hmac_sha1_ecb_cipher_null_enc_tv_temp, 19815208ed2cSNitesh Lal .count = 19825208ed2cSNitesh Lal HMAC_SHA1_ECB_CIPHER_NULL_ENC_TEST_VEC 1983bca4feb0SHoria Geanta }, 1984bca4feb0SHoria Geanta .dec = { 19855208ed2cSNitesh Lal .vecs = 19865208ed2cSNitesh Lal hmac_sha1_ecb_cipher_null_dec_tv_temp, 19875208ed2cSNitesh Lal .count = 19885208ed2cSNitesh Lal HMAC_SHA1_ECB_CIPHER_NULL_DEC_TEST_VEC 19895208ed2cSNitesh Lal } 19905208ed2cSNitesh Lal } 19915208ed2cSNitesh Lal } 19925208ed2cSNitesh Lal }, { 19935208ed2cSNitesh Lal .alg = "authenc(hmac(sha224),cbc(des))", 19945208ed2cSNitesh Lal .test = alg_test_aead, 19955208ed2cSNitesh Lal .fips_allowed = 1, 19965208ed2cSNitesh Lal .suite = { 19975208ed2cSNitesh Lal .aead = { 19985208ed2cSNitesh Lal .enc = { 19995208ed2cSNitesh Lal .vecs = 20005208ed2cSNitesh Lal hmac_sha224_des_cbc_enc_tv_temp, 20015208ed2cSNitesh Lal .count = 20025208ed2cSNitesh Lal HMAC_SHA224_DES_CBC_ENC_TEST_VEC 20035208ed2cSNitesh Lal } 20045208ed2cSNitesh Lal } 20055208ed2cSNitesh Lal } 20065208ed2cSNitesh Lal }, { 20075208ed2cSNitesh Lal .alg = "authenc(hmac(sha224),cbc(des3_ede))", 20085208ed2cSNitesh Lal .test = alg_test_aead, 20095208ed2cSNitesh Lal .fips_allowed = 1, 20105208ed2cSNitesh Lal .suite = { 20115208ed2cSNitesh Lal .aead = { 20125208ed2cSNitesh Lal .enc = { 20135208ed2cSNitesh Lal .vecs = 20145208ed2cSNitesh Lal hmac_sha224_des3_ede_cbc_enc_tv_temp, 20155208ed2cSNitesh Lal .count = 20165208ed2cSNitesh Lal HMAC_SHA224_DES3_EDE_CBC_ENC_TEST_VEC 2017bca4feb0SHoria Geanta } 2018bca4feb0SHoria Geanta } 2019bca4feb0SHoria Geanta } 2020bca4feb0SHoria Geanta }, { 2021e46e9a46SHoria Geanta .alg = "authenc(hmac(sha256),cbc(aes))", 2022e46e9a46SHoria Geanta .test = alg_test_aead, 2023e46e9a46SHoria Geanta .fips_allowed = 1, 2024e46e9a46SHoria Geanta .suite = { 2025e46e9a46SHoria Geanta .aead = { 2026e46e9a46SHoria Geanta .enc = { 20275208ed2cSNitesh Lal .vecs = 20285208ed2cSNitesh Lal hmac_sha256_aes_cbc_enc_tv_temp, 20295208ed2cSNitesh Lal .count = 20305208ed2cSNitesh Lal HMAC_SHA256_AES_CBC_ENC_TEST_VEC 20315208ed2cSNitesh Lal } 20325208ed2cSNitesh Lal } 20335208ed2cSNitesh Lal } 20345208ed2cSNitesh Lal }, { 20355208ed2cSNitesh Lal .alg = "authenc(hmac(sha256),cbc(des))", 20365208ed2cSNitesh Lal .test = alg_test_aead, 20375208ed2cSNitesh Lal .fips_allowed = 1, 20385208ed2cSNitesh Lal .suite = { 20395208ed2cSNitesh Lal .aead = { 20405208ed2cSNitesh Lal .enc = { 20415208ed2cSNitesh Lal .vecs = 20425208ed2cSNitesh Lal hmac_sha256_des_cbc_enc_tv_temp, 20435208ed2cSNitesh Lal .count = 20445208ed2cSNitesh Lal HMAC_SHA256_DES_CBC_ENC_TEST_VEC 20455208ed2cSNitesh Lal } 20465208ed2cSNitesh Lal } 20475208ed2cSNitesh Lal } 20485208ed2cSNitesh Lal }, { 20495208ed2cSNitesh Lal .alg = "authenc(hmac(sha256),cbc(des3_ede))", 20505208ed2cSNitesh Lal .test = alg_test_aead, 20515208ed2cSNitesh Lal .fips_allowed = 1, 20525208ed2cSNitesh Lal .suite = { 20535208ed2cSNitesh Lal .aead = { 20545208ed2cSNitesh Lal .enc = { 20555208ed2cSNitesh Lal .vecs = 20565208ed2cSNitesh Lal hmac_sha256_des3_ede_cbc_enc_tv_temp, 20575208ed2cSNitesh Lal .count = 20585208ed2cSNitesh Lal HMAC_SHA256_DES3_EDE_CBC_ENC_TEST_VEC 20595208ed2cSNitesh Lal } 20605208ed2cSNitesh Lal } 20615208ed2cSNitesh Lal } 20625208ed2cSNitesh Lal }, { 20635208ed2cSNitesh Lal .alg = "authenc(hmac(sha384),cbc(des))", 20645208ed2cSNitesh Lal .test = alg_test_aead, 20655208ed2cSNitesh Lal .fips_allowed = 1, 20665208ed2cSNitesh Lal .suite = { 20675208ed2cSNitesh Lal .aead = { 20685208ed2cSNitesh Lal .enc = { 20695208ed2cSNitesh Lal .vecs = 20705208ed2cSNitesh Lal hmac_sha384_des_cbc_enc_tv_temp, 20715208ed2cSNitesh Lal .count = 20725208ed2cSNitesh Lal HMAC_SHA384_DES_CBC_ENC_TEST_VEC 20735208ed2cSNitesh Lal } 20745208ed2cSNitesh Lal } 20755208ed2cSNitesh Lal } 20765208ed2cSNitesh Lal }, { 20775208ed2cSNitesh Lal .alg = "authenc(hmac(sha384),cbc(des3_ede))", 20785208ed2cSNitesh Lal .test = alg_test_aead, 20795208ed2cSNitesh Lal .fips_allowed = 1, 20805208ed2cSNitesh Lal .suite = { 20815208ed2cSNitesh Lal .aead = { 20825208ed2cSNitesh Lal .enc = { 20835208ed2cSNitesh Lal .vecs = 20845208ed2cSNitesh Lal hmac_sha384_des3_ede_cbc_enc_tv_temp, 20855208ed2cSNitesh Lal .count = 20865208ed2cSNitesh Lal HMAC_SHA384_DES3_EDE_CBC_ENC_TEST_VEC 2087e46e9a46SHoria Geanta } 2088e46e9a46SHoria Geanta } 2089e46e9a46SHoria Geanta } 2090e46e9a46SHoria Geanta }, { 2091e46e9a46SHoria Geanta .alg = "authenc(hmac(sha512),cbc(aes))", 2092e46e9a46SHoria Geanta .test = alg_test_aead, 2093e46e9a46SHoria Geanta .fips_allowed = 1, 2094e46e9a46SHoria Geanta .suite = { 2095e46e9a46SHoria Geanta .aead = { 2096e46e9a46SHoria Geanta .enc = { 20975208ed2cSNitesh Lal .vecs = 20985208ed2cSNitesh Lal hmac_sha512_aes_cbc_enc_tv_temp, 20995208ed2cSNitesh Lal .count = 21005208ed2cSNitesh Lal HMAC_SHA512_AES_CBC_ENC_TEST_VEC 21015208ed2cSNitesh Lal } 21025208ed2cSNitesh Lal } 21035208ed2cSNitesh Lal } 21045208ed2cSNitesh Lal }, { 21055208ed2cSNitesh Lal .alg = "authenc(hmac(sha512),cbc(des))", 21065208ed2cSNitesh Lal .test = alg_test_aead, 21075208ed2cSNitesh Lal .fips_allowed = 1, 21085208ed2cSNitesh Lal .suite = { 21095208ed2cSNitesh Lal .aead = { 21105208ed2cSNitesh Lal .enc = { 21115208ed2cSNitesh Lal .vecs = 21125208ed2cSNitesh Lal hmac_sha512_des_cbc_enc_tv_temp, 21135208ed2cSNitesh Lal .count = 21145208ed2cSNitesh Lal HMAC_SHA512_DES_CBC_ENC_TEST_VEC 21155208ed2cSNitesh Lal } 21165208ed2cSNitesh Lal } 21175208ed2cSNitesh Lal } 21185208ed2cSNitesh Lal }, { 21195208ed2cSNitesh Lal .alg = "authenc(hmac(sha512),cbc(des3_ede))", 21205208ed2cSNitesh Lal .test = alg_test_aead, 21215208ed2cSNitesh Lal .fips_allowed = 1, 21225208ed2cSNitesh Lal .suite = { 21235208ed2cSNitesh Lal .aead = { 21245208ed2cSNitesh Lal .enc = { 21255208ed2cSNitesh Lal .vecs = 21265208ed2cSNitesh Lal hmac_sha512_des3_ede_cbc_enc_tv_temp, 21275208ed2cSNitesh Lal .count = 21285208ed2cSNitesh Lal HMAC_SHA512_DES3_EDE_CBC_ENC_TEST_VEC 2129e46e9a46SHoria Geanta } 2130e46e9a46SHoria Geanta } 2131e46e9a46SHoria Geanta } 2132e46e9a46SHoria Geanta }, { 2133da7f033dSHerbert Xu .alg = "cbc(aes)", 21341aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2135a1915d51SJarod Wilson .fips_allowed = 1, 2136da7f033dSHerbert Xu .suite = { 2137da7f033dSHerbert Xu .cipher = { 2138da7f033dSHerbert Xu .enc = { 2139da7f033dSHerbert Xu .vecs = aes_cbc_enc_tv_template, 2140da7f033dSHerbert Xu .count = AES_CBC_ENC_TEST_VECTORS 2141da7f033dSHerbert Xu }, 2142da7f033dSHerbert Xu .dec = { 2143da7f033dSHerbert Xu .vecs = aes_cbc_dec_tv_template, 2144da7f033dSHerbert Xu .count = AES_CBC_DEC_TEST_VECTORS 2145da7f033dSHerbert Xu } 2146da7f033dSHerbert Xu } 2147da7f033dSHerbert Xu } 2148da7f033dSHerbert Xu }, { 2149da7f033dSHerbert Xu .alg = "cbc(anubis)", 21501aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2151da7f033dSHerbert Xu .suite = { 2152da7f033dSHerbert Xu .cipher = { 2153da7f033dSHerbert Xu .enc = { 2154da7f033dSHerbert Xu .vecs = anubis_cbc_enc_tv_template, 2155da7f033dSHerbert Xu .count = ANUBIS_CBC_ENC_TEST_VECTORS 2156da7f033dSHerbert Xu }, 2157da7f033dSHerbert Xu .dec = { 2158da7f033dSHerbert Xu .vecs = anubis_cbc_dec_tv_template, 2159da7f033dSHerbert Xu .count = ANUBIS_CBC_DEC_TEST_VECTORS 2160da7f033dSHerbert Xu } 2161da7f033dSHerbert Xu } 2162da7f033dSHerbert Xu } 2163da7f033dSHerbert Xu }, { 2164da7f033dSHerbert Xu .alg = "cbc(blowfish)", 21651aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2166da7f033dSHerbert Xu .suite = { 2167da7f033dSHerbert Xu .cipher = { 2168da7f033dSHerbert Xu .enc = { 2169da7f033dSHerbert Xu .vecs = bf_cbc_enc_tv_template, 2170da7f033dSHerbert Xu .count = BF_CBC_ENC_TEST_VECTORS 2171da7f033dSHerbert Xu }, 2172da7f033dSHerbert Xu .dec = { 2173da7f033dSHerbert Xu .vecs = bf_cbc_dec_tv_template, 2174da7f033dSHerbert Xu .count = BF_CBC_DEC_TEST_VECTORS 2175da7f033dSHerbert Xu } 2176da7f033dSHerbert Xu } 2177da7f033dSHerbert Xu } 2178da7f033dSHerbert Xu }, { 2179da7f033dSHerbert Xu .alg = "cbc(camellia)", 21801aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2181da7f033dSHerbert Xu .suite = { 2182da7f033dSHerbert Xu .cipher = { 2183da7f033dSHerbert Xu .enc = { 2184da7f033dSHerbert Xu .vecs = camellia_cbc_enc_tv_template, 2185da7f033dSHerbert Xu .count = CAMELLIA_CBC_ENC_TEST_VECTORS 2186da7f033dSHerbert Xu }, 2187da7f033dSHerbert Xu .dec = { 2188da7f033dSHerbert Xu .vecs = camellia_cbc_dec_tv_template, 2189da7f033dSHerbert Xu .count = CAMELLIA_CBC_DEC_TEST_VECTORS 2190da7f033dSHerbert Xu } 2191da7f033dSHerbert Xu } 2192da7f033dSHerbert Xu } 2193da7f033dSHerbert Xu }, { 2194a2c58260SJohannes Goetzfried .alg = "cbc(cast5)", 2195a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 2196a2c58260SJohannes Goetzfried .suite = { 2197a2c58260SJohannes Goetzfried .cipher = { 2198a2c58260SJohannes Goetzfried .enc = { 2199a2c58260SJohannes Goetzfried .vecs = cast5_cbc_enc_tv_template, 2200a2c58260SJohannes Goetzfried .count = CAST5_CBC_ENC_TEST_VECTORS 2201a2c58260SJohannes Goetzfried }, 2202a2c58260SJohannes Goetzfried .dec = { 2203a2c58260SJohannes Goetzfried .vecs = cast5_cbc_dec_tv_template, 2204a2c58260SJohannes Goetzfried .count = CAST5_CBC_DEC_TEST_VECTORS 2205a2c58260SJohannes Goetzfried } 2206a2c58260SJohannes Goetzfried } 2207a2c58260SJohannes Goetzfried } 2208a2c58260SJohannes Goetzfried }, { 22099b8b0405SJohannes Goetzfried .alg = "cbc(cast6)", 22109b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 22119b8b0405SJohannes Goetzfried .suite = { 22129b8b0405SJohannes Goetzfried .cipher = { 22139b8b0405SJohannes Goetzfried .enc = { 22149b8b0405SJohannes Goetzfried .vecs = cast6_cbc_enc_tv_template, 22159b8b0405SJohannes Goetzfried .count = CAST6_CBC_ENC_TEST_VECTORS 22169b8b0405SJohannes Goetzfried }, 22179b8b0405SJohannes Goetzfried .dec = { 22189b8b0405SJohannes Goetzfried .vecs = cast6_cbc_dec_tv_template, 22199b8b0405SJohannes Goetzfried .count = CAST6_CBC_DEC_TEST_VECTORS 22209b8b0405SJohannes Goetzfried } 22219b8b0405SJohannes Goetzfried } 22229b8b0405SJohannes Goetzfried } 22239b8b0405SJohannes Goetzfried }, { 2224da7f033dSHerbert Xu .alg = "cbc(des)", 22251aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2226da7f033dSHerbert Xu .suite = { 2227da7f033dSHerbert Xu .cipher = { 2228da7f033dSHerbert Xu .enc = { 2229da7f033dSHerbert Xu .vecs = des_cbc_enc_tv_template, 2230da7f033dSHerbert Xu .count = DES_CBC_ENC_TEST_VECTORS 2231da7f033dSHerbert Xu }, 2232da7f033dSHerbert Xu .dec = { 2233da7f033dSHerbert Xu .vecs = des_cbc_dec_tv_template, 2234da7f033dSHerbert Xu .count = DES_CBC_DEC_TEST_VECTORS 2235da7f033dSHerbert Xu } 2236da7f033dSHerbert Xu } 2237da7f033dSHerbert Xu } 2238da7f033dSHerbert Xu }, { 2239da7f033dSHerbert Xu .alg = "cbc(des3_ede)", 22401aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2241a1915d51SJarod Wilson .fips_allowed = 1, 2242da7f033dSHerbert Xu .suite = { 2243da7f033dSHerbert Xu .cipher = { 2244da7f033dSHerbert Xu .enc = { 2245da7f033dSHerbert Xu .vecs = des3_ede_cbc_enc_tv_template, 2246da7f033dSHerbert Xu .count = DES3_EDE_CBC_ENC_TEST_VECTORS 2247da7f033dSHerbert Xu }, 2248da7f033dSHerbert Xu .dec = { 2249da7f033dSHerbert Xu .vecs = des3_ede_cbc_dec_tv_template, 2250da7f033dSHerbert Xu .count = DES3_EDE_CBC_DEC_TEST_VECTORS 2251da7f033dSHerbert Xu } 2252da7f033dSHerbert Xu } 2253da7f033dSHerbert Xu } 2254da7f033dSHerbert Xu }, { 22559d25917dSJussi Kivilinna .alg = "cbc(serpent)", 22569d25917dSJussi Kivilinna .test = alg_test_skcipher, 22579d25917dSJussi Kivilinna .suite = { 22589d25917dSJussi Kivilinna .cipher = { 22599d25917dSJussi Kivilinna .enc = { 22609d25917dSJussi Kivilinna .vecs = serpent_cbc_enc_tv_template, 22619d25917dSJussi Kivilinna .count = SERPENT_CBC_ENC_TEST_VECTORS 22629d25917dSJussi Kivilinna }, 22639d25917dSJussi Kivilinna .dec = { 22649d25917dSJussi Kivilinna .vecs = serpent_cbc_dec_tv_template, 22659d25917dSJussi Kivilinna .count = SERPENT_CBC_DEC_TEST_VECTORS 22669d25917dSJussi Kivilinna } 22679d25917dSJussi Kivilinna } 22689d25917dSJussi Kivilinna } 22699d25917dSJussi Kivilinna }, { 2270da7f033dSHerbert Xu .alg = "cbc(twofish)", 22711aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2272da7f033dSHerbert Xu .suite = { 2273da7f033dSHerbert Xu .cipher = { 2274da7f033dSHerbert Xu .enc = { 2275da7f033dSHerbert Xu .vecs = tf_cbc_enc_tv_template, 2276da7f033dSHerbert Xu .count = TF_CBC_ENC_TEST_VECTORS 2277da7f033dSHerbert Xu }, 2278da7f033dSHerbert Xu .dec = { 2279da7f033dSHerbert Xu .vecs = tf_cbc_dec_tv_template, 2280da7f033dSHerbert Xu .count = TF_CBC_DEC_TEST_VECTORS 2281da7f033dSHerbert Xu } 2282da7f033dSHerbert Xu } 2283da7f033dSHerbert Xu } 2284da7f033dSHerbert Xu }, { 2285da7f033dSHerbert Xu .alg = "ccm(aes)", 2286da7f033dSHerbert Xu .test = alg_test_aead, 2287a1915d51SJarod Wilson .fips_allowed = 1, 2288da7f033dSHerbert Xu .suite = { 2289da7f033dSHerbert Xu .aead = { 2290da7f033dSHerbert Xu .enc = { 2291da7f033dSHerbert Xu .vecs = aes_ccm_enc_tv_template, 2292da7f033dSHerbert Xu .count = AES_CCM_ENC_TEST_VECTORS 2293da7f033dSHerbert Xu }, 2294da7f033dSHerbert Xu .dec = { 2295da7f033dSHerbert Xu .vecs = aes_ccm_dec_tv_template, 2296da7f033dSHerbert Xu .count = AES_CCM_DEC_TEST_VECTORS 2297da7f033dSHerbert Xu } 2298da7f033dSHerbert Xu } 2299da7f033dSHerbert Xu } 2300da7f033dSHerbert Xu }, { 230193b5e86aSJussi Kivilinna .alg = "cmac(aes)", 230293b5e86aSJussi Kivilinna .test = alg_test_hash, 230393b5e86aSJussi Kivilinna .suite = { 230493b5e86aSJussi Kivilinna .hash = { 230593b5e86aSJussi Kivilinna .vecs = aes_cmac128_tv_template, 230693b5e86aSJussi Kivilinna .count = CMAC_AES_TEST_VECTORS 230793b5e86aSJussi Kivilinna } 230893b5e86aSJussi Kivilinna } 230993b5e86aSJussi Kivilinna }, { 231093b5e86aSJussi Kivilinna .alg = "cmac(des3_ede)", 231193b5e86aSJussi Kivilinna .test = alg_test_hash, 231293b5e86aSJussi Kivilinna .suite = { 231393b5e86aSJussi Kivilinna .hash = { 231493b5e86aSJussi Kivilinna .vecs = des3_ede_cmac64_tv_template, 231593b5e86aSJussi Kivilinna .count = CMAC_DES3_EDE_TEST_VECTORS 231693b5e86aSJussi Kivilinna } 231793b5e86aSJussi Kivilinna } 231893b5e86aSJussi Kivilinna }, { 2319e448370dSJussi Kivilinna .alg = "compress_null", 2320e448370dSJussi Kivilinna .test = alg_test_null, 2321e448370dSJussi Kivilinna }, { 2322da7f033dSHerbert Xu .alg = "crc32c", 23238e3ee85eSHerbert Xu .test = alg_test_crc32c, 2324a1915d51SJarod Wilson .fips_allowed = 1, 2325da7f033dSHerbert Xu .suite = { 2326da7f033dSHerbert Xu .hash = { 2327da7f033dSHerbert Xu .vecs = crc32c_tv_template, 2328da7f033dSHerbert Xu .count = CRC32C_TEST_VECTORS 2329da7f033dSHerbert Xu } 2330da7f033dSHerbert Xu } 2331da7f033dSHerbert Xu }, { 233268411521SHerbert Xu .alg = "crct10dif", 233368411521SHerbert Xu .test = alg_test_hash, 233468411521SHerbert Xu .fips_allowed = 1, 233568411521SHerbert Xu .suite = { 233668411521SHerbert Xu .hash = { 233768411521SHerbert Xu .vecs = crct10dif_tv_template, 233868411521SHerbert Xu .count = CRCT10DIF_TEST_VECTORS 233968411521SHerbert Xu } 234068411521SHerbert Xu } 234168411521SHerbert Xu }, { 23426c79294fSMilan Broz .alg = "cryptd(__driver-cbc-aes-aesni)", 23436c79294fSMilan Broz .test = alg_test_null, 23446c79294fSMilan Broz .fips_allowed = 1, 23456c79294fSMilan Broz }, { 2346d9b1d2e7SJussi Kivilinna .alg = "cryptd(__driver-cbc-camellia-aesni)", 2347d9b1d2e7SJussi Kivilinna .test = alg_test_null, 2348d9b1d2e7SJussi Kivilinna }, { 2349f3f935a7SJussi Kivilinna .alg = "cryptd(__driver-cbc-camellia-aesni-avx2)", 2350f3f935a7SJussi Kivilinna .test = alg_test_null, 2351f3f935a7SJussi Kivilinna }, { 235256d76c96SJussi Kivilinna .alg = "cryptd(__driver-cbc-serpent-avx2)", 235356d76c96SJussi Kivilinna .test = alg_test_null, 235456d76c96SJussi Kivilinna }, { 2355863b557aSYouquan, Song .alg = "cryptd(__driver-ecb-aes-aesni)", 2356863b557aSYouquan, Song .test = alg_test_null, 23576c79294fSMilan Broz .fips_allowed = 1, 2358863b557aSYouquan, Song }, { 2359d9b1d2e7SJussi Kivilinna .alg = "cryptd(__driver-ecb-camellia-aesni)", 2360d9b1d2e7SJussi Kivilinna .test = alg_test_null, 2361d9b1d2e7SJussi Kivilinna }, { 2362f3f935a7SJussi Kivilinna .alg = "cryptd(__driver-ecb-camellia-aesni-avx2)", 2363f3f935a7SJussi Kivilinna .test = alg_test_null, 2364f3f935a7SJussi Kivilinna }, { 23654d6d6a2cSJohannes Goetzfried .alg = "cryptd(__driver-ecb-cast5-avx)", 23664d6d6a2cSJohannes Goetzfried .test = alg_test_null, 23674d6d6a2cSJohannes Goetzfried }, { 23684ea1277dSJohannes Goetzfried .alg = "cryptd(__driver-ecb-cast6-avx)", 23694ea1277dSJohannes Goetzfried .test = alg_test_null, 23704ea1277dSJohannes Goetzfried }, { 23717efe4076SJohannes Goetzfried .alg = "cryptd(__driver-ecb-serpent-avx)", 23727efe4076SJohannes Goetzfried .test = alg_test_null, 23737efe4076SJohannes Goetzfried }, { 237456d76c96SJussi Kivilinna .alg = "cryptd(__driver-ecb-serpent-avx2)", 237556d76c96SJussi Kivilinna .test = alg_test_null, 237656d76c96SJussi Kivilinna }, { 2377937c30d7SJussi Kivilinna .alg = "cryptd(__driver-ecb-serpent-sse2)", 2378937c30d7SJussi Kivilinna .test = alg_test_null, 2379937c30d7SJussi Kivilinna }, { 2380107778b5SJohannes Goetzfried .alg = "cryptd(__driver-ecb-twofish-avx)", 2381107778b5SJohannes Goetzfried .test = alg_test_null, 2382107778b5SJohannes Goetzfried }, { 23836c79294fSMilan Broz .alg = "cryptd(__driver-gcm-aes-aesni)", 23846c79294fSMilan Broz .test = alg_test_null, 23856c79294fSMilan Broz .fips_allowed = 1, 23866c79294fSMilan Broz }, { 2387863b557aSYouquan, Song .alg = "cryptd(__ghash-pclmulqdqni)", 2388863b557aSYouquan, Song .test = alg_test_null, 23896c79294fSMilan Broz .fips_allowed = 1, 2390863b557aSYouquan, Song }, { 2391f7cb80f2SJarod Wilson .alg = "ctr(aes)", 2392f7cb80f2SJarod Wilson .test = alg_test_skcipher, 2393a1915d51SJarod Wilson .fips_allowed = 1, 2394f7cb80f2SJarod Wilson .suite = { 2395f7cb80f2SJarod Wilson .cipher = { 2396f7cb80f2SJarod Wilson .enc = { 2397f7cb80f2SJarod Wilson .vecs = aes_ctr_enc_tv_template, 2398f7cb80f2SJarod Wilson .count = AES_CTR_ENC_TEST_VECTORS 2399f7cb80f2SJarod Wilson }, 2400f7cb80f2SJarod Wilson .dec = { 2401f7cb80f2SJarod Wilson .vecs = aes_ctr_dec_tv_template, 2402f7cb80f2SJarod Wilson .count = AES_CTR_DEC_TEST_VECTORS 2403f7cb80f2SJarod Wilson } 2404f7cb80f2SJarod Wilson } 2405f7cb80f2SJarod Wilson } 2406f7cb80f2SJarod Wilson }, { 240785b63e34SJussi Kivilinna .alg = "ctr(blowfish)", 240885b63e34SJussi Kivilinna .test = alg_test_skcipher, 240985b63e34SJussi Kivilinna .suite = { 241085b63e34SJussi Kivilinna .cipher = { 241185b63e34SJussi Kivilinna .enc = { 241285b63e34SJussi Kivilinna .vecs = bf_ctr_enc_tv_template, 241385b63e34SJussi Kivilinna .count = BF_CTR_ENC_TEST_VECTORS 241485b63e34SJussi Kivilinna }, 241585b63e34SJussi Kivilinna .dec = { 241685b63e34SJussi Kivilinna .vecs = bf_ctr_dec_tv_template, 241785b63e34SJussi Kivilinna .count = BF_CTR_DEC_TEST_VECTORS 241885b63e34SJussi Kivilinna } 241985b63e34SJussi Kivilinna } 242085b63e34SJussi Kivilinna } 242185b63e34SJussi Kivilinna }, { 24220840605eSJussi Kivilinna .alg = "ctr(camellia)", 24230840605eSJussi Kivilinna .test = alg_test_skcipher, 24240840605eSJussi Kivilinna .suite = { 24250840605eSJussi Kivilinna .cipher = { 24260840605eSJussi Kivilinna .enc = { 24270840605eSJussi Kivilinna .vecs = camellia_ctr_enc_tv_template, 24280840605eSJussi Kivilinna .count = CAMELLIA_CTR_ENC_TEST_VECTORS 24290840605eSJussi Kivilinna }, 24300840605eSJussi Kivilinna .dec = { 24310840605eSJussi Kivilinna .vecs = camellia_ctr_dec_tv_template, 24320840605eSJussi Kivilinna .count = CAMELLIA_CTR_DEC_TEST_VECTORS 24330840605eSJussi Kivilinna } 24340840605eSJussi Kivilinna } 24350840605eSJussi Kivilinna } 24360840605eSJussi Kivilinna }, { 2437a2c58260SJohannes Goetzfried .alg = "ctr(cast5)", 2438a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 2439a2c58260SJohannes Goetzfried .suite = { 2440a2c58260SJohannes Goetzfried .cipher = { 2441a2c58260SJohannes Goetzfried .enc = { 2442a2c58260SJohannes Goetzfried .vecs = cast5_ctr_enc_tv_template, 2443a2c58260SJohannes Goetzfried .count = CAST5_CTR_ENC_TEST_VECTORS 2444a2c58260SJohannes Goetzfried }, 2445a2c58260SJohannes Goetzfried .dec = { 2446a2c58260SJohannes Goetzfried .vecs = cast5_ctr_dec_tv_template, 2447a2c58260SJohannes Goetzfried .count = CAST5_CTR_DEC_TEST_VECTORS 2448a2c58260SJohannes Goetzfried } 2449a2c58260SJohannes Goetzfried } 2450a2c58260SJohannes Goetzfried } 2451a2c58260SJohannes Goetzfried }, { 24529b8b0405SJohannes Goetzfried .alg = "ctr(cast6)", 24539b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 24549b8b0405SJohannes Goetzfried .suite = { 24559b8b0405SJohannes Goetzfried .cipher = { 24569b8b0405SJohannes Goetzfried .enc = { 24579b8b0405SJohannes Goetzfried .vecs = cast6_ctr_enc_tv_template, 24589b8b0405SJohannes Goetzfried .count = CAST6_CTR_ENC_TEST_VECTORS 24599b8b0405SJohannes Goetzfried }, 24609b8b0405SJohannes Goetzfried .dec = { 24619b8b0405SJohannes Goetzfried .vecs = cast6_ctr_dec_tv_template, 24629b8b0405SJohannes Goetzfried .count = CAST6_CTR_DEC_TEST_VECTORS 24639b8b0405SJohannes Goetzfried } 24649b8b0405SJohannes Goetzfried } 24659b8b0405SJohannes Goetzfried } 24669b8b0405SJohannes Goetzfried }, { 24678163fc30SJussi Kivilinna .alg = "ctr(des)", 24688163fc30SJussi Kivilinna .test = alg_test_skcipher, 24698163fc30SJussi Kivilinna .suite = { 24708163fc30SJussi Kivilinna .cipher = { 24718163fc30SJussi Kivilinna .enc = { 24728163fc30SJussi Kivilinna .vecs = des_ctr_enc_tv_template, 24738163fc30SJussi Kivilinna .count = DES_CTR_ENC_TEST_VECTORS 24748163fc30SJussi Kivilinna }, 24758163fc30SJussi Kivilinna .dec = { 24768163fc30SJussi Kivilinna .vecs = des_ctr_dec_tv_template, 24778163fc30SJussi Kivilinna .count = DES_CTR_DEC_TEST_VECTORS 24788163fc30SJussi Kivilinna } 24798163fc30SJussi Kivilinna } 24808163fc30SJussi Kivilinna } 24818163fc30SJussi Kivilinna }, { 2482e080b17aSJussi Kivilinna .alg = "ctr(des3_ede)", 2483e080b17aSJussi Kivilinna .test = alg_test_skcipher, 2484e080b17aSJussi Kivilinna .suite = { 2485e080b17aSJussi Kivilinna .cipher = { 2486e080b17aSJussi Kivilinna .enc = { 2487e080b17aSJussi Kivilinna .vecs = des3_ede_ctr_enc_tv_template, 2488e080b17aSJussi Kivilinna .count = DES3_EDE_CTR_ENC_TEST_VECTORS 2489e080b17aSJussi Kivilinna }, 2490e080b17aSJussi Kivilinna .dec = { 2491e080b17aSJussi Kivilinna .vecs = des3_ede_ctr_dec_tv_template, 2492e080b17aSJussi Kivilinna .count = DES3_EDE_CTR_DEC_TEST_VECTORS 2493e080b17aSJussi Kivilinna } 2494e080b17aSJussi Kivilinna } 2495e080b17aSJussi Kivilinna } 2496e080b17aSJussi Kivilinna }, { 24979d25917dSJussi Kivilinna .alg = "ctr(serpent)", 24989d25917dSJussi Kivilinna .test = alg_test_skcipher, 24999d25917dSJussi Kivilinna .suite = { 25009d25917dSJussi Kivilinna .cipher = { 25019d25917dSJussi Kivilinna .enc = { 25029d25917dSJussi Kivilinna .vecs = serpent_ctr_enc_tv_template, 25039d25917dSJussi Kivilinna .count = SERPENT_CTR_ENC_TEST_VECTORS 25049d25917dSJussi Kivilinna }, 25059d25917dSJussi Kivilinna .dec = { 25069d25917dSJussi Kivilinna .vecs = serpent_ctr_dec_tv_template, 25079d25917dSJussi Kivilinna .count = SERPENT_CTR_DEC_TEST_VECTORS 25089d25917dSJussi Kivilinna } 25099d25917dSJussi Kivilinna } 25109d25917dSJussi Kivilinna } 25119d25917dSJussi Kivilinna }, { 2512573da620SJussi Kivilinna .alg = "ctr(twofish)", 2513573da620SJussi Kivilinna .test = alg_test_skcipher, 2514573da620SJussi Kivilinna .suite = { 2515573da620SJussi Kivilinna .cipher = { 2516573da620SJussi Kivilinna .enc = { 2517573da620SJussi Kivilinna .vecs = tf_ctr_enc_tv_template, 2518573da620SJussi Kivilinna .count = TF_CTR_ENC_TEST_VECTORS 2519573da620SJussi Kivilinna }, 2520573da620SJussi Kivilinna .dec = { 2521573da620SJussi Kivilinna .vecs = tf_ctr_dec_tv_template, 2522573da620SJussi Kivilinna .count = TF_CTR_DEC_TEST_VECTORS 2523573da620SJussi Kivilinna } 2524573da620SJussi Kivilinna } 2525573da620SJussi Kivilinna } 2526573da620SJussi Kivilinna }, { 2527da7f033dSHerbert Xu .alg = "cts(cbc(aes))", 25281aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2529da7f033dSHerbert Xu .suite = { 2530da7f033dSHerbert Xu .cipher = { 2531da7f033dSHerbert Xu .enc = { 2532da7f033dSHerbert Xu .vecs = cts_mode_enc_tv_template, 2533da7f033dSHerbert Xu .count = CTS_MODE_ENC_TEST_VECTORS 2534da7f033dSHerbert Xu }, 2535da7f033dSHerbert Xu .dec = { 2536da7f033dSHerbert Xu .vecs = cts_mode_dec_tv_template, 2537da7f033dSHerbert Xu .count = CTS_MODE_DEC_TEST_VECTORS 2538da7f033dSHerbert Xu } 2539da7f033dSHerbert Xu } 2540da7f033dSHerbert Xu } 2541da7f033dSHerbert Xu }, { 2542da7f033dSHerbert Xu .alg = "deflate", 2543da7f033dSHerbert Xu .test = alg_test_comp, 25440818904dSMilan Broz .fips_allowed = 1, 2545da7f033dSHerbert Xu .suite = { 2546da7f033dSHerbert Xu .comp = { 2547da7f033dSHerbert Xu .comp = { 2548da7f033dSHerbert Xu .vecs = deflate_comp_tv_template, 2549da7f033dSHerbert Xu .count = DEFLATE_COMP_TEST_VECTORS 2550da7f033dSHerbert Xu }, 2551da7f033dSHerbert Xu .decomp = { 2552da7f033dSHerbert Xu .vecs = deflate_decomp_tv_template, 2553da7f033dSHerbert Xu .count = DEFLATE_DECOMP_TEST_VECTORS 2554da7f033dSHerbert Xu } 2555da7f033dSHerbert Xu } 2556da7f033dSHerbert Xu } 2557da7f033dSHerbert Xu }, { 2558e448370dSJussi Kivilinna .alg = "digest_null", 2559e448370dSJussi Kivilinna .test = alg_test_null, 2560e448370dSJussi Kivilinna }, { 256164d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes128", 256264d1cdfbSStephan Mueller .test = alg_test_drbg, 256364d1cdfbSStephan Mueller .fips_allowed = 1, 256464d1cdfbSStephan Mueller .suite = { 256564d1cdfbSStephan Mueller .drbg = { 256664d1cdfbSStephan Mueller .vecs = drbg_nopr_ctr_aes128_tv_template, 256764d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_ctr_aes128_tv_template) 256864d1cdfbSStephan Mueller } 256964d1cdfbSStephan Mueller } 257064d1cdfbSStephan Mueller }, { 257164d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes192", 257264d1cdfbSStephan Mueller .test = alg_test_drbg, 257364d1cdfbSStephan Mueller .fips_allowed = 1, 257464d1cdfbSStephan Mueller .suite = { 257564d1cdfbSStephan Mueller .drbg = { 257664d1cdfbSStephan Mueller .vecs = drbg_nopr_ctr_aes192_tv_template, 257764d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_ctr_aes192_tv_template) 257864d1cdfbSStephan Mueller } 257964d1cdfbSStephan Mueller } 258064d1cdfbSStephan Mueller }, { 258164d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes256", 258264d1cdfbSStephan Mueller .test = alg_test_drbg, 258364d1cdfbSStephan Mueller .fips_allowed = 1, 258464d1cdfbSStephan Mueller .suite = { 258564d1cdfbSStephan Mueller .drbg = { 258664d1cdfbSStephan Mueller .vecs = drbg_nopr_ctr_aes256_tv_template, 258764d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_ctr_aes256_tv_template) 258864d1cdfbSStephan Mueller } 258964d1cdfbSStephan Mueller } 259064d1cdfbSStephan Mueller }, { 259164d1cdfbSStephan Mueller /* 259264d1cdfbSStephan Mueller * There is no need to specifically test the DRBG with every 259364d1cdfbSStephan Mueller * backend cipher -- covered by drbg_nopr_hmac_sha256 test 259464d1cdfbSStephan Mueller */ 259564d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha1", 259664d1cdfbSStephan Mueller .fips_allowed = 1, 259764d1cdfbSStephan Mueller .test = alg_test_null, 259864d1cdfbSStephan Mueller }, { 259964d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha256", 260064d1cdfbSStephan Mueller .test = alg_test_drbg, 260164d1cdfbSStephan Mueller .fips_allowed = 1, 260264d1cdfbSStephan Mueller .suite = { 260364d1cdfbSStephan Mueller .drbg = { 260464d1cdfbSStephan Mueller .vecs = drbg_nopr_hmac_sha256_tv_template, 260564d1cdfbSStephan Mueller .count = 260664d1cdfbSStephan Mueller ARRAY_SIZE(drbg_nopr_hmac_sha256_tv_template) 260764d1cdfbSStephan Mueller } 260864d1cdfbSStephan Mueller } 260964d1cdfbSStephan Mueller }, { 261064d1cdfbSStephan Mueller /* covered by drbg_nopr_hmac_sha256 test */ 261164d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha384", 261264d1cdfbSStephan Mueller .fips_allowed = 1, 261364d1cdfbSStephan Mueller .test = alg_test_null, 261464d1cdfbSStephan Mueller }, { 261564d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha512", 261664d1cdfbSStephan Mueller .test = alg_test_null, 261764d1cdfbSStephan Mueller .fips_allowed = 1, 261864d1cdfbSStephan Mueller }, { 261964d1cdfbSStephan Mueller .alg = "drbg_nopr_sha1", 262064d1cdfbSStephan Mueller .fips_allowed = 1, 262164d1cdfbSStephan Mueller .test = alg_test_null, 262264d1cdfbSStephan Mueller }, { 262364d1cdfbSStephan Mueller .alg = "drbg_nopr_sha256", 262464d1cdfbSStephan Mueller .test = alg_test_drbg, 262564d1cdfbSStephan Mueller .fips_allowed = 1, 262664d1cdfbSStephan Mueller .suite = { 262764d1cdfbSStephan Mueller .drbg = { 262864d1cdfbSStephan Mueller .vecs = drbg_nopr_sha256_tv_template, 262964d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_sha256_tv_template) 263064d1cdfbSStephan Mueller } 263164d1cdfbSStephan Mueller } 263264d1cdfbSStephan Mueller }, { 263364d1cdfbSStephan Mueller /* covered by drbg_nopr_sha256 test */ 263464d1cdfbSStephan Mueller .alg = "drbg_nopr_sha384", 263564d1cdfbSStephan Mueller .fips_allowed = 1, 263664d1cdfbSStephan Mueller .test = alg_test_null, 263764d1cdfbSStephan Mueller }, { 263864d1cdfbSStephan Mueller .alg = "drbg_nopr_sha512", 263964d1cdfbSStephan Mueller .fips_allowed = 1, 264064d1cdfbSStephan Mueller .test = alg_test_null, 264164d1cdfbSStephan Mueller }, { 264264d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes128", 264364d1cdfbSStephan Mueller .test = alg_test_drbg, 264464d1cdfbSStephan Mueller .fips_allowed = 1, 264564d1cdfbSStephan Mueller .suite = { 264664d1cdfbSStephan Mueller .drbg = { 264764d1cdfbSStephan Mueller .vecs = drbg_pr_ctr_aes128_tv_template, 264864d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_pr_ctr_aes128_tv_template) 264964d1cdfbSStephan Mueller } 265064d1cdfbSStephan Mueller } 265164d1cdfbSStephan Mueller }, { 265264d1cdfbSStephan Mueller /* covered by drbg_pr_ctr_aes128 test */ 265364d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes192", 265464d1cdfbSStephan Mueller .fips_allowed = 1, 265564d1cdfbSStephan Mueller .test = alg_test_null, 265664d1cdfbSStephan Mueller }, { 265764d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes256", 265864d1cdfbSStephan Mueller .fips_allowed = 1, 265964d1cdfbSStephan Mueller .test = alg_test_null, 266064d1cdfbSStephan Mueller }, { 266164d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha1", 266264d1cdfbSStephan Mueller .fips_allowed = 1, 266364d1cdfbSStephan Mueller .test = alg_test_null, 266464d1cdfbSStephan Mueller }, { 266564d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha256", 266664d1cdfbSStephan Mueller .test = alg_test_drbg, 266764d1cdfbSStephan Mueller .fips_allowed = 1, 266864d1cdfbSStephan Mueller .suite = { 266964d1cdfbSStephan Mueller .drbg = { 267064d1cdfbSStephan Mueller .vecs = drbg_pr_hmac_sha256_tv_template, 267164d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_pr_hmac_sha256_tv_template) 267264d1cdfbSStephan Mueller } 267364d1cdfbSStephan Mueller } 267464d1cdfbSStephan Mueller }, { 267564d1cdfbSStephan Mueller /* covered by drbg_pr_hmac_sha256 test */ 267664d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha384", 267764d1cdfbSStephan Mueller .fips_allowed = 1, 267864d1cdfbSStephan Mueller .test = alg_test_null, 267964d1cdfbSStephan Mueller }, { 268064d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha512", 268164d1cdfbSStephan Mueller .test = alg_test_null, 268264d1cdfbSStephan Mueller .fips_allowed = 1, 268364d1cdfbSStephan Mueller }, { 268464d1cdfbSStephan Mueller .alg = "drbg_pr_sha1", 268564d1cdfbSStephan Mueller .fips_allowed = 1, 268664d1cdfbSStephan Mueller .test = alg_test_null, 268764d1cdfbSStephan Mueller }, { 268864d1cdfbSStephan Mueller .alg = "drbg_pr_sha256", 268964d1cdfbSStephan Mueller .test = alg_test_drbg, 269064d1cdfbSStephan Mueller .fips_allowed = 1, 269164d1cdfbSStephan Mueller .suite = { 269264d1cdfbSStephan Mueller .drbg = { 269364d1cdfbSStephan Mueller .vecs = drbg_pr_sha256_tv_template, 269464d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_pr_sha256_tv_template) 269564d1cdfbSStephan Mueller } 269664d1cdfbSStephan Mueller } 269764d1cdfbSStephan Mueller }, { 269864d1cdfbSStephan Mueller /* covered by drbg_pr_sha256 test */ 269964d1cdfbSStephan Mueller .alg = "drbg_pr_sha384", 270064d1cdfbSStephan Mueller .fips_allowed = 1, 270164d1cdfbSStephan Mueller .test = alg_test_null, 270264d1cdfbSStephan Mueller }, { 270364d1cdfbSStephan Mueller .alg = "drbg_pr_sha512", 270464d1cdfbSStephan Mueller .fips_allowed = 1, 270564d1cdfbSStephan Mueller .test = alg_test_null, 270664d1cdfbSStephan Mueller }, { 2707863b557aSYouquan, Song .alg = "ecb(__aes-aesni)", 2708863b557aSYouquan, Song .test = alg_test_null, 27096c79294fSMilan Broz .fips_allowed = 1, 2710863b557aSYouquan, Song }, { 2711da7f033dSHerbert Xu .alg = "ecb(aes)", 27121aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2713a1915d51SJarod Wilson .fips_allowed = 1, 2714da7f033dSHerbert Xu .suite = { 2715da7f033dSHerbert Xu .cipher = { 2716da7f033dSHerbert Xu .enc = { 2717da7f033dSHerbert Xu .vecs = aes_enc_tv_template, 2718da7f033dSHerbert Xu .count = AES_ENC_TEST_VECTORS 2719da7f033dSHerbert Xu }, 2720da7f033dSHerbert Xu .dec = { 2721da7f033dSHerbert Xu .vecs = aes_dec_tv_template, 2722da7f033dSHerbert Xu .count = AES_DEC_TEST_VECTORS 2723da7f033dSHerbert Xu } 2724da7f033dSHerbert Xu } 2725da7f033dSHerbert Xu } 2726da7f033dSHerbert Xu }, { 2727da7f033dSHerbert Xu .alg = "ecb(anubis)", 27281aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2729da7f033dSHerbert Xu .suite = { 2730da7f033dSHerbert Xu .cipher = { 2731da7f033dSHerbert Xu .enc = { 2732da7f033dSHerbert Xu .vecs = anubis_enc_tv_template, 2733da7f033dSHerbert Xu .count = ANUBIS_ENC_TEST_VECTORS 2734da7f033dSHerbert Xu }, 2735da7f033dSHerbert Xu .dec = { 2736da7f033dSHerbert Xu .vecs = anubis_dec_tv_template, 2737da7f033dSHerbert Xu .count = ANUBIS_DEC_TEST_VECTORS 2738da7f033dSHerbert Xu } 2739da7f033dSHerbert Xu } 2740da7f033dSHerbert Xu } 2741da7f033dSHerbert Xu }, { 2742da7f033dSHerbert Xu .alg = "ecb(arc4)", 27431aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2744da7f033dSHerbert Xu .suite = { 2745da7f033dSHerbert Xu .cipher = { 2746da7f033dSHerbert Xu .enc = { 2747da7f033dSHerbert Xu .vecs = arc4_enc_tv_template, 2748da7f033dSHerbert Xu .count = ARC4_ENC_TEST_VECTORS 2749da7f033dSHerbert Xu }, 2750da7f033dSHerbert Xu .dec = { 2751da7f033dSHerbert Xu .vecs = arc4_dec_tv_template, 2752da7f033dSHerbert Xu .count = ARC4_DEC_TEST_VECTORS 2753da7f033dSHerbert Xu } 2754da7f033dSHerbert Xu } 2755da7f033dSHerbert Xu } 2756da7f033dSHerbert Xu }, { 2757da7f033dSHerbert Xu .alg = "ecb(blowfish)", 27581aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2759da7f033dSHerbert Xu .suite = { 2760da7f033dSHerbert Xu .cipher = { 2761da7f033dSHerbert Xu .enc = { 2762da7f033dSHerbert Xu .vecs = bf_enc_tv_template, 2763da7f033dSHerbert Xu .count = BF_ENC_TEST_VECTORS 2764da7f033dSHerbert Xu }, 2765da7f033dSHerbert Xu .dec = { 2766da7f033dSHerbert Xu .vecs = bf_dec_tv_template, 2767da7f033dSHerbert Xu .count = BF_DEC_TEST_VECTORS 2768da7f033dSHerbert Xu } 2769da7f033dSHerbert Xu } 2770da7f033dSHerbert Xu } 2771da7f033dSHerbert Xu }, { 2772da7f033dSHerbert Xu .alg = "ecb(camellia)", 27731aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2774da7f033dSHerbert Xu .suite = { 2775da7f033dSHerbert Xu .cipher = { 2776da7f033dSHerbert Xu .enc = { 2777da7f033dSHerbert Xu .vecs = camellia_enc_tv_template, 2778da7f033dSHerbert Xu .count = CAMELLIA_ENC_TEST_VECTORS 2779da7f033dSHerbert Xu }, 2780da7f033dSHerbert Xu .dec = { 2781da7f033dSHerbert Xu .vecs = camellia_dec_tv_template, 2782da7f033dSHerbert Xu .count = CAMELLIA_DEC_TEST_VECTORS 2783da7f033dSHerbert Xu } 2784da7f033dSHerbert Xu } 2785da7f033dSHerbert Xu } 2786da7f033dSHerbert Xu }, { 2787da7f033dSHerbert Xu .alg = "ecb(cast5)", 27881aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2789da7f033dSHerbert Xu .suite = { 2790da7f033dSHerbert Xu .cipher = { 2791da7f033dSHerbert Xu .enc = { 2792da7f033dSHerbert Xu .vecs = cast5_enc_tv_template, 2793da7f033dSHerbert Xu .count = CAST5_ENC_TEST_VECTORS 2794da7f033dSHerbert Xu }, 2795da7f033dSHerbert Xu .dec = { 2796da7f033dSHerbert Xu .vecs = cast5_dec_tv_template, 2797da7f033dSHerbert Xu .count = CAST5_DEC_TEST_VECTORS 2798da7f033dSHerbert Xu } 2799da7f033dSHerbert Xu } 2800da7f033dSHerbert Xu } 2801da7f033dSHerbert Xu }, { 2802da7f033dSHerbert Xu .alg = "ecb(cast6)", 28031aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2804da7f033dSHerbert Xu .suite = { 2805da7f033dSHerbert Xu .cipher = { 2806da7f033dSHerbert Xu .enc = { 2807da7f033dSHerbert Xu .vecs = cast6_enc_tv_template, 2808da7f033dSHerbert Xu .count = CAST6_ENC_TEST_VECTORS 2809da7f033dSHerbert Xu }, 2810da7f033dSHerbert Xu .dec = { 2811da7f033dSHerbert Xu .vecs = cast6_dec_tv_template, 2812da7f033dSHerbert Xu .count = CAST6_DEC_TEST_VECTORS 2813da7f033dSHerbert Xu } 2814da7f033dSHerbert Xu } 2815da7f033dSHerbert Xu } 2816da7f033dSHerbert Xu }, { 2817e448370dSJussi Kivilinna .alg = "ecb(cipher_null)", 2818e448370dSJussi Kivilinna .test = alg_test_null, 2819e448370dSJussi Kivilinna }, { 2820da7f033dSHerbert Xu .alg = "ecb(des)", 28211aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2822a1915d51SJarod Wilson .fips_allowed = 1, 2823da7f033dSHerbert Xu .suite = { 2824da7f033dSHerbert Xu .cipher = { 2825da7f033dSHerbert Xu .enc = { 2826da7f033dSHerbert Xu .vecs = des_enc_tv_template, 2827da7f033dSHerbert Xu .count = DES_ENC_TEST_VECTORS 2828da7f033dSHerbert Xu }, 2829da7f033dSHerbert Xu .dec = { 2830da7f033dSHerbert Xu .vecs = des_dec_tv_template, 2831da7f033dSHerbert Xu .count = DES_DEC_TEST_VECTORS 2832da7f033dSHerbert Xu } 2833da7f033dSHerbert Xu } 2834da7f033dSHerbert Xu } 2835da7f033dSHerbert Xu }, { 2836da7f033dSHerbert Xu .alg = "ecb(des3_ede)", 28371aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2838a1915d51SJarod Wilson .fips_allowed = 1, 2839da7f033dSHerbert Xu .suite = { 2840da7f033dSHerbert Xu .cipher = { 2841da7f033dSHerbert Xu .enc = { 2842da7f033dSHerbert Xu .vecs = des3_ede_enc_tv_template, 2843da7f033dSHerbert Xu .count = DES3_EDE_ENC_TEST_VECTORS 2844da7f033dSHerbert Xu }, 2845da7f033dSHerbert Xu .dec = { 2846da7f033dSHerbert Xu .vecs = des3_ede_dec_tv_template, 2847da7f033dSHerbert Xu .count = DES3_EDE_DEC_TEST_VECTORS 2848da7f033dSHerbert Xu } 2849da7f033dSHerbert Xu } 2850da7f033dSHerbert Xu } 2851da7f033dSHerbert Xu }, { 285266e5bd00SJussi Kivilinna .alg = "ecb(fcrypt)", 285366e5bd00SJussi Kivilinna .test = alg_test_skcipher, 285466e5bd00SJussi Kivilinna .suite = { 285566e5bd00SJussi Kivilinna .cipher = { 285666e5bd00SJussi Kivilinna .enc = { 285766e5bd00SJussi Kivilinna .vecs = fcrypt_pcbc_enc_tv_template, 285866e5bd00SJussi Kivilinna .count = 1 285966e5bd00SJussi Kivilinna }, 286066e5bd00SJussi Kivilinna .dec = { 286166e5bd00SJussi Kivilinna .vecs = fcrypt_pcbc_dec_tv_template, 286266e5bd00SJussi Kivilinna .count = 1 286366e5bd00SJussi Kivilinna } 286466e5bd00SJussi Kivilinna } 286566e5bd00SJussi Kivilinna } 286666e5bd00SJussi Kivilinna }, { 2867da7f033dSHerbert Xu .alg = "ecb(khazad)", 28681aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2869da7f033dSHerbert Xu .suite = { 2870da7f033dSHerbert Xu .cipher = { 2871da7f033dSHerbert Xu .enc = { 2872da7f033dSHerbert Xu .vecs = khazad_enc_tv_template, 2873da7f033dSHerbert Xu .count = KHAZAD_ENC_TEST_VECTORS 2874da7f033dSHerbert Xu }, 2875da7f033dSHerbert Xu .dec = { 2876da7f033dSHerbert Xu .vecs = khazad_dec_tv_template, 2877da7f033dSHerbert Xu .count = KHAZAD_DEC_TEST_VECTORS 2878da7f033dSHerbert Xu } 2879da7f033dSHerbert Xu } 2880da7f033dSHerbert Xu } 2881da7f033dSHerbert Xu }, { 2882da7f033dSHerbert Xu .alg = "ecb(seed)", 28831aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2884da7f033dSHerbert Xu .suite = { 2885da7f033dSHerbert Xu .cipher = { 2886da7f033dSHerbert Xu .enc = { 2887da7f033dSHerbert Xu .vecs = seed_enc_tv_template, 2888da7f033dSHerbert Xu .count = SEED_ENC_TEST_VECTORS 2889da7f033dSHerbert Xu }, 2890da7f033dSHerbert Xu .dec = { 2891da7f033dSHerbert Xu .vecs = seed_dec_tv_template, 2892da7f033dSHerbert Xu .count = SEED_DEC_TEST_VECTORS 2893da7f033dSHerbert Xu } 2894da7f033dSHerbert Xu } 2895da7f033dSHerbert Xu } 2896da7f033dSHerbert Xu }, { 2897da7f033dSHerbert Xu .alg = "ecb(serpent)", 28981aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2899da7f033dSHerbert Xu .suite = { 2900da7f033dSHerbert Xu .cipher = { 2901da7f033dSHerbert Xu .enc = { 2902da7f033dSHerbert Xu .vecs = serpent_enc_tv_template, 2903da7f033dSHerbert Xu .count = SERPENT_ENC_TEST_VECTORS 2904da7f033dSHerbert Xu }, 2905da7f033dSHerbert Xu .dec = { 2906da7f033dSHerbert Xu .vecs = serpent_dec_tv_template, 2907da7f033dSHerbert Xu .count = SERPENT_DEC_TEST_VECTORS 2908da7f033dSHerbert Xu } 2909da7f033dSHerbert Xu } 2910da7f033dSHerbert Xu } 2911da7f033dSHerbert Xu }, { 2912da7f033dSHerbert Xu .alg = "ecb(tea)", 29131aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2914da7f033dSHerbert Xu .suite = { 2915da7f033dSHerbert Xu .cipher = { 2916da7f033dSHerbert Xu .enc = { 2917da7f033dSHerbert Xu .vecs = tea_enc_tv_template, 2918da7f033dSHerbert Xu .count = TEA_ENC_TEST_VECTORS 2919da7f033dSHerbert Xu }, 2920da7f033dSHerbert Xu .dec = { 2921da7f033dSHerbert Xu .vecs = tea_dec_tv_template, 2922da7f033dSHerbert Xu .count = TEA_DEC_TEST_VECTORS 2923da7f033dSHerbert Xu } 2924da7f033dSHerbert Xu } 2925da7f033dSHerbert Xu } 2926da7f033dSHerbert Xu }, { 2927da7f033dSHerbert Xu .alg = "ecb(tnepres)", 29281aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2929da7f033dSHerbert Xu .suite = { 2930da7f033dSHerbert Xu .cipher = { 2931da7f033dSHerbert Xu .enc = { 2932da7f033dSHerbert Xu .vecs = tnepres_enc_tv_template, 2933da7f033dSHerbert Xu .count = TNEPRES_ENC_TEST_VECTORS 2934da7f033dSHerbert Xu }, 2935da7f033dSHerbert Xu .dec = { 2936da7f033dSHerbert Xu .vecs = tnepres_dec_tv_template, 2937da7f033dSHerbert Xu .count = TNEPRES_DEC_TEST_VECTORS 2938da7f033dSHerbert Xu } 2939da7f033dSHerbert Xu } 2940da7f033dSHerbert Xu } 2941da7f033dSHerbert Xu }, { 2942da7f033dSHerbert Xu .alg = "ecb(twofish)", 29431aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2944da7f033dSHerbert Xu .suite = { 2945da7f033dSHerbert Xu .cipher = { 2946da7f033dSHerbert Xu .enc = { 2947da7f033dSHerbert Xu .vecs = tf_enc_tv_template, 2948da7f033dSHerbert Xu .count = TF_ENC_TEST_VECTORS 2949da7f033dSHerbert Xu }, 2950da7f033dSHerbert Xu .dec = { 2951da7f033dSHerbert Xu .vecs = tf_dec_tv_template, 2952da7f033dSHerbert Xu .count = TF_DEC_TEST_VECTORS 2953da7f033dSHerbert Xu } 2954da7f033dSHerbert Xu } 2955da7f033dSHerbert Xu } 2956da7f033dSHerbert Xu }, { 2957da7f033dSHerbert Xu .alg = "ecb(xeta)", 29581aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2959da7f033dSHerbert Xu .suite = { 2960da7f033dSHerbert Xu .cipher = { 2961da7f033dSHerbert Xu .enc = { 2962da7f033dSHerbert Xu .vecs = xeta_enc_tv_template, 2963da7f033dSHerbert Xu .count = XETA_ENC_TEST_VECTORS 2964da7f033dSHerbert Xu }, 2965da7f033dSHerbert Xu .dec = { 2966da7f033dSHerbert Xu .vecs = xeta_dec_tv_template, 2967da7f033dSHerbert Xu .count = XETA_DEC_TEST_VECTORS 2968da7f033dSHerbert Xu } 2969da7f033dSHerbert Xu } 2970da7f033dSHerbert Xu } 2971da7f033dSHerbert Xu }, { 2972da7f033dSHerbert Xu .alg = "ecb(xtea)", 29731aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2974da7f033dSHerbert Xu .suite = { 2975da7f033dSHerbert Xu .cipher = { 2976da7f033dSHerbert Xu .enc = { 2977da7f033dSHerbert Xu .vecs = xtea_enc_tv_template, 2978da7f033dSHerbert Xu .count = XTEA_ENC_TEST_VECTORS 2979da7f033dSHerbert Xu }, 2980da7f033dSHerbert Xu .dec = { 2981da7f033dSHerbert Xu .vecs = xtea_dec_tv_template, 2982da7f033dSHerbert Xu .count = XTEA_DEC_TEST_VECTORS 2983da7f033dSHerbert Xu } 2984da7f033dSHerbert Xu } 2985da7f033dSHerbert Xu } 2986da7f033dSHerbert Xu }, { 2987da7f033dSHerbert Xu .alg = "gcm(aes)", 2988da7f033dSHerbert Xu .test = alg_test_aead, 2989a1915d51SJarod Wilson .fips_allowed = 1, 2990da7f033dSHerbert Xu .suite = { 2991da7f033dSHerbert Xu .aead = { 2992da7f033dSHerbert Xu .enc = { 2993da7f033dSHerbert Xu .vecs = aes_gcm_enc_tv_template, 2994da7f033dSHerbert Xu .count = AES_GCM_ENC_TEST_VECTORS 2995da7f033dSHerbert Xu }, 2996da7f033dSHerbert Xu .dec = { 2997da7f033dSHerbert Xu .vecs = aes_gcm_dec_tv_template, 2998da7f033dSHerbert Xu .count = AES_GCM_DEC_TEST_VECTORS 2999da7f033dSHerbert Xu } 3000da7f033dSHerbert Xu } 3001da7f033dSHerbert Xu } 3002da7f033dSHerbert Xu }, { 3003507069c9SYouquan, Song .alg = "ghash", 3004507069c9SYouquan, Song .test = alg_test_hash, 300518c0ebd2SJarod Wilson .fips_allowed = 1, 3006507069c9SYouquan, Song .suite = { 3007507069c9SYouquan, Song .hash = { 3008507069c9SYouquan, Song .vecs = ghash_tv_template, 3009507069c9SYouquan, Song .count = GHASH_TEST_VECTORS 3010507069c9SYouquan, Song } 3011507069c9SYouquan, Song } 3012507069c9SYouquan, Song }, { 3013a482b081SSonic Zhang .alg = "hmac(crc32)", 3014a482b081SSonic Zhang .test = alg_test_hash, 3015a482b081SSonic Zhang .suite = { 3016a482b081SSonic Zhang .hash = { 3017a482b081SSonic Zhang .vecs = bfin_crc_tv_template, 3018a482b081SSonic Zhang .count = BFIN_CRC_TEST_VECTORS 3019a482b081SSonic Zhang } 3020a482b081SSonic Zhang } 3021a482b081SSonic Zhang }, { 3022da7f033dSHerbert Xu .alg = "hmac(md5)", 3023da7f033dSHerbert Xu .test = alg_test_hash, 3024da7f033dSHerbert Xu .suite = { 3025da7f033dSHerbert Xu .hash = { 3026da7f033dSHerbert Xu .vecs = hmac_md5_tv_template, 3027da7f033dSHerbert Xu .count = HMAC_MD5_TEST_VECTORS 3028da7f033dSHerbert Xu } 3029da7f033dSHerbert Xu } 3030da7f033dSHerbert Xu }, { 3031da7f033dSHerbert Xu .alg = "hmac(rmd128)", 3032da7f033dSHerbert Xu .test = alg_test_hash, 3033da7f033dSHerbert Xu .suite = { 3034da7f033dSHerbert Xu .hash = { 3035da7f033dSHerbert Xu .vecs = hmac_rmd128_tv_template, 3036da7f033dSHerbert Xu .count = HMAC_RMD128_TEST_VECTORS 3037da7f033dSHerbert Xu } 3038da7f033dSHerbert Xu } 3039da7f033dSHerbert Xu }, { 3040da7f033dSHerbert Xu .alg = "hmac(rmd160)", 3041da7f033dSHerbert Xu .test = alg_test_hash, 3042da7f033dSHerbert Xu .suite = { 3043da7f033dSHerbert Xu .hash = { 3044da7f033dSHerbert Xu .vecs = hmac_rmd160_tv_template, 3045da7f033dSHerbert Xu .count = HMAC_RMD160_TEST_VECTORS 3046da7f033dSHerbert Xu } 3047da7f033dSHerbert Xu } 3048da7f033dSHerbert Xu }, { 3049da7f033dSHerbert Xu .alg = "hmac(sha1)", 3050da7f033dSHerbert Xu .test = alg_test_hash, 3051a1915d51SJarod Wilson .fips_allowed = 1, 3052da7f033dSHerbert Xu .suite = { 3053da7f033dSHerbert Xu .hash = { 3054da7f033dSHerbert Xu .vecs = hmac_sha1_tv_template, 3055da7f033dSHerbert Xu .count = HMAC_SHA1_TEST_VECTORS 3056da7f033dSHerbert Xu } 3057da7f033dSHerbert Xu } 3058da7f033dSHerbert Xu }, { 3059da7f033dSHerbert Xu .alg = "hmac(sha224)", 3060da7f033dSHerbert Xu .test = alg_test_hash, 3061a1915d51SJarod Wilson .fips_allowed = 1, 3062da7f033dSHerbert Xu .suite = { 3063da7f033dSHerbert Xu .hash = { 3064da7f033dSHerbert Xu .vecs = hmac_sha224_tv_template, 3065da7f033dSHerbert Xu .count = HMAC_SHA224_TEST_VECTORS 3066da7f033dSHerbert Xu } 3067da7f033dSHerbert Xu } 3068da7f033dSHerbert Xu }, { 3069da7f033dSHerbert Xu .alg = "hmac(sha256)", 3070da7f033dSHerbert Xu .test = alg_test_hash, 3071a1915d51SJarod Wilson .fips_allowed = 1, 3072da7f033dSHerbert Xu .suite = { 3073da7f033dSHerbert Xu .hash = { 3074da7f033dSHerbert Xu .vecs = hmac_sha256_tv_template, 3075da7f033dSHerbert Xu .count = HMAC_SHA256_TEST_VECTORS 3076da7f033dSHerbert Xu } 3077da7f033dSHerbert Xu } 3078da7f033dSHerbert Xu }, { 3079da7f033dSHerbert Xu .alg = "hmac(sha384)", 3080da7f033dSHerbert Xu .test = alg_test_hash, 3081a1915d51SJarod Wilson .fips_allowed = 1, 3082da7f033dSHerbert Xu .suite = { 3083da7f033dSHerbert Xu .hash = { 3084da7f033dSHerbert Xu .vecs = hmac_sha384_tv_template, 3085da7f033dSHerbert Xu .count = HMAC_SHA384_TEST_VECTORS 3086da7f033dSHerbert Xu } 3087da7f033dSHerbert Xu } 3088da7f033dSHerbert Xu }, { 3089da7f033dSHerbert Xu .alg = "hmac(sha512)", 3090da7f033dSHerbert Xu .test = alg_test_hash, 3091a1915d51SJarod Wilson .fips_allowed = 1, 3092da7f033dSHerbert Xu .suite = { 3093da7f033dSHerbert Xu .hash = { 3094da7f033dSHerbert Xu .vecs = hmac_sha512_tv_template, 3095da7f033dSHerbert Xu .count = HMAC_SHA512_TEST_VECTORS 3096da7f033dSHerbert Xu } 3097da7f033dSHerbert Xu } 3098da7f033dSHerbert Xu }, { 3099da7f033dSHerbert Xu .alg = "lrw(aes)", 31001aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3101da7f033dSHerbert Xu .suite = { 3102da7f033dSHerbert Xu .cipher = { 3103da7f033dSHerbert Xu .enc = { 3104da7f033dSHerbert Xu .vecs = aes_lrw_enc_tv_template, 3105da7f033dSHerbert Xu .count = AES_LRW_ENC_TEST_VECTORS 3106da7f033dSHerbert Xu }, 3107da7f033dSHerbert Xu .dec = { 3108da7f033dSHerbert Xu .vecs = aes_lrw_dec_tv_template, 3109da7f033dSHerbert Xu .count = AES_LRW_DEC_TEST_VECTORS 3110da7f033dSHerbert Xu } 3111da7f033dSHerbert Xu } 3112da7f033dSHerbert Xu } 3113da7f033dSHerbert Xu }, { 31140840605eSJussi Kivilinna .alg = "lrw(camellia)", 31150840605eSJussi Kivilinna .test = alg_test_skcipher, 31160840605eSJussi Kivilinna .suite = { 31170840605eSJussi Kivilinna .cipher = { 31180840605eSJussi Kivilinna .enc = { 31190840605eSJussi Kivilinna .vecs = camellia_lrw_enc_tv_template, 31200840605eSJussi Kivilinna .count = CAMELLIA_LRW_ENC_TEST_VECTORS 31210840605eSJussi Kivilinna }, 31220840605eSJussi Kivilinna .dec = { 31230840605eSJussi Kivilinna .vecs = camellia_lrw_dec_tv_template, 31240840605eSJussi Kivilinna .count = CAMELLIA_LRW_DEC_TEST_VECTORS 31250840605eSJussi Kivilinna } 31260840605eSJussi Kivilinna } 31270840605eSJussi Kivilinna } 31280840605eSJussi Kivilinna }, { 31299b8b0405SJohannes Goetzfried .alg = "lrw(cast6)", 31309b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 31319b8b0405SJohannes Goetzfried .suite = { 31329b8b0405SJohannes Goetzfried .cipher = { 31339b8b0405SJohannes Goetzfried .enc = { 31349b8b0405SJohannes Goetzfried .vecs = cast6_lrw_enc_tv_template, 31359b8b0405SJohannes Goetzfried .count = CAST6_LRW_ENC_TEST_VECTORS 31369b8b0405SJohannes Goetzfried }, 31379b8b0405SJohannes Goetzfried .dec = { 31389b8b0405SJohannes Goetzfried .vecs = cast6_lrw_dec_tv_template, 31399b8b0405SJohannes Goetzfried .count = CAST6_LRW_DEC_TEST_VECTORS 31409b8b0405SJohannes Goetzfried } 31419b8b0405SJohannes Goetzfried } 31429b8b0405SJohannes Goetzfried } 31439b8b0405SJohannes Goetzfried }, { 3144d7bfc0faSJussi Kivilinna .alg = "lrw(serpent)", 3145d7bfc0faSJussi Kivilinna .test = alg_test_skcipher, 3146d7bfc0faSJussi Kivilinna .suite = { 3147d7bfc0faSJussi Kivilinna .cipher = { 3148d7bfc0faSJussi Kivilinna .enc = { 3149d7bfc0faSJussi Kivilinna .vecs = serpent_lrw_enc_tv_template, 3150d7bfc0faSJussi Kivilinna .count = SERPENT_LRW_ENC_TEST_VECTORS 3151d7bfc0faSJussi Kivilinna }, 3152d7bfc0faSJussi Kivilinna .dec = { 3153d7bfc0faSJussi Kivilinna .vecs = serpent_lrw_dec_tv_template, 3154d7bfc0faSJussi Kivilinna .count = SERPENT_LRW_DEC_TEST_VECTORS 3155d7bfc0faSJussi Kivilinna } 3156d7bfc0faSJussi Kivilinna } 3157d7bfc0faSJussi Kivilinna } 3158d7bfc0faSJussi Kivilinna }, { 31590b2a1551SJussi Kivilinna .alg = "lrw(twofish)", 31600b2a1551SJussi Kivilinna .test = alg_test_skcipher, 31610b2a1551SJussi Kivilinna .suite = { 31620b2a1551SJussi Kivilinna .cipher = { 31630b2a1551SJussi Kivilinna .enc = { 31640b2a1551SJussi Kivilinna .vecs = tf_lrw_enc_tv_template, 31650b2a1551SJussi Kivilinna .count = TF_LRW_ENC_TEST_VECTORS 31660b2a1551SJussi Kivilinna }, 31670b2a1551SJussi Kivilinna .dec = { 31680b2a1551SJussi Kivilinna .vecs = tf_lrw_dec_tv_template, 31690b2a1551SJussi Kivilinna .count = TF_LRW_DEC_TEST_VECTORS 31700b2a1551SJussi Kivilinna } 31710b2a1551SJussi Kivilinna } 31720b2a1551SJussi Kivilinna } 31730b2a1551SJussi Kivilinna }, { 31741443cc9bSKOVACS Krisztian .alg = "lz4", 31751443cc9bSKOVACS Krisztian .test = alg_test_comp, 31761443cc9bSKOVACS Krisztian .fips_allowed = 1, 31771443cc9bSKOVACS Krisztian .suite = { 31781443cc9bSKOVACS Krisztian .comp = { 31791443cc9bSKOVACS Krisztian .comp = { 31801443cc9bSKOVACS Krisztian .vecs = lz4_comp_tv_template, 31811443cc9bSKOVACS Krisztian .count = LZ4_COMP_TEST_VECTORS 31821443cc9bSKOVACS Krisztian }, 31831443cc9bSKOVACS Krisztian .decomp = { 31841443cc9bSKOVACS Krisztian .vecs = lz4_decomp_tv_template, 31851443cc9bSKOVACS Krisztian .count = LZ4_DECOMP_TEST_VECTORS 31861443cc9bSKOVACS Krisztian } 31871443cc9bSKOVACS Krisztian } 31881443cc9bSKOVACS Krisztian } 31891443cc9bSKOVACS Krisztian }, { 31901443cc9bSKOVACS Krisztian .alg = "lz4hc", 31911443cc9bSKOVACS Krisztian .test = alg_test_comp, 31921443cc9bSKOVACS Krisztian .fips_allowed = 1, 31931443cc9bSKOVACS Krisztian .suite = { 31941443cc9bSKOVACS Krisztian .comp = { 31951443cc9bSKOVACS Krisztian .comp = { 31961443cc9bSKOVACS Krisztian .vecs = lz4hc_comp_tv_template, 31971443cc9bSKOVACS Krisztian .count = LZ4HC_COMP_TEST_VECTORS 31981443cc9bSKOVACS Krisztian }, 31991443cc9bSKOVACS Krisztian .decomp = { 32001443cc9bSKOVACS Krisztian .vecs = lz4hc_decomp_tv_template, 32011443cc9bSKOVACS Krisztian .count = LZ4HC_DECOMP_TEST_VECTORS 32021443cc9bSKOVACS Krisztian } 32031443cc9bSKOVACS Krisztian } 32041443cc9bSKOVACS Krisztian } 32051443cc9bSKOVACS Krisztian }, { 3206da7f033dSHerbert Xu .alg = "lzo", 3207da7f033dSHerbert Xu .test = alg_test_comp, 32080818904dSMilan Broz .fips_allowed = 1, 3209da7f033dSHerbert Xu .suite = { 3210da7f033dSHerbert Xu .comp = { 3211da7f033dSHerbert Xu .comp = { 3212da7f033dSHerbert Xu .vecs = lzo_comp_tv_template, 3213da7f033dSHerbert Xu .count = LZO_COMP_TEST_VECTORS 3214da7f033dSHerbert Xu }, 3215da7f033dSHerbert Xu .decomp = { 3216da7f033dSHerbert Xu .vecs = lzo_decomp_tv_template, 3217da7f033dSHerbert Xu .count = LZO_DECOMP_TEST_VECTORS 3218da7f033dSHerbert Xu } 3219da7f033dSHerbert Xu } 3220da7f033dSHerbert Xu } 3221da7f033dSHerbert Xu }, { 3222da7f033dSHerbert Xu .alg = "md4", 3223da7f033dSHerbert Xu .test = alg_test_hash, 3224da7f033dSHerbert Xu .suite = { 3225da7f033dSHerbert Xu .hash = { 3226da7f033dSHerbert Xu .vecs = md4_tv_template, 3227da7f033dSHerbert Xu .count = MD4_TEST_VECTORS 3228da7f033dSHerbert Xu } 3229da7f033dSHerbert Xu } 3230da7f033dSHerbert Xu }, { 3231da7f033dSHerbert Xu .alg = "md5", 3232da7f033dSHerbert Xu .test = alg_test_hash, 3233da7f033dSHerbert Xu .suite = { 3234da7f033dSHerbert Xu .hash = { 3235da7f033dSHerbert Xu .vecs = md5_tv_template, 3236da7f033dSHerbert Xu .count = MD5_TEST_VECTORS 3237da7f033dSHerbert Xu } 3238da7f033dSHerbert Xu } 3239da7f033dSHerbert Xu }, { 3240da7f033dSHerbert Xu .alg = "michael_mic", 3241da7f033dSHerbert Xu .test = alg_test_hash, 3242da7f033dSHerbert Xu .suite = { 3243da7f033dSHerbert Xu .hash = { 3244da7f033dSHerbert Xu .vecs = michael_mic_tv_template, 3245da7f033dSHerbert Xu .count = MICHAEL_MIC_TEST_VECTORS 3246da7f033dSHerbert Xu } 3247da7f033dSHerbert Xu } 3248da7f033dSHerbert Xu }, { 3249ba0e14acSPuneet Saxena .alg = "ofb(aes)", 3250ba0e14acSPuneet Saxena .test = alg_test_skcipher, 3251ba0e14acSPuneet Saxena .fips_allowed = 1, 3252ba0e14acSPuneet Saxena .suite = { 3253ba0e14acSPuneet Saxena .cipher = { 3254ba0e14acSPuneet Saxena .enc = { 3255ba0e14acSPuneet Saxena .vecs = aes_ofb_enc_tv_template, 3256ba0e14acSPuneet Saxena .count = AES_OFB_ENC_TEST_VECTORS 3257ba0e14acSPuneet Saxena }, 3258ba0e14acSPuneet Saxena .dec = { 3259ba0e14acSPuneet Saxena .vecs = aes_ofb_dec_tv_template, 3260ba0e14acSPuneet Saxena .count = AES_OFB_DEC_TEST_VECTORS 3261ba0e14acSPuneet Saxena } 3262ba0e14acSPuneet Saxena } 3263ba0e14acSPuneet Saxena } 3264ba0e14acSPuneet Saxena }, { 3265da7f033dSHerbert Xu .alg = "pcbc(fcrypt)", 32661aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3267da7f033dSHerbert Xu .suite = { 3268da7f033dSHerbert Xu .cipher = { 3269da7f033dSHerbert Xu .enc = { 3270da7f033dSHerbert Xu .vecs = fcrypt_pcbc_enc_tv_template, 3271da7f033dSHerbert Xu .count = FCRYPT_ENC_TEST_VECTORS 3272da7f033dSHerbert Xu }, 3273da7f033dSHerbert Xu .dec = { 3274da7f033dSHerbert Xu .vecs = fcrypt_pcbc_dec_tv_template, 3275da7f033dSHerbert Xu .count = FCRYPT_DEC_TEST_VECTORS 3276da7f033dSHerbert Xu } 3277da7f033dSHerbert Xu } 3278da7f033dSHerbert Xu } 3279da7f033dSHerbert Xu }, { 3280da7f033dSHerbert Xu .alg = "rfc3686(ctr(aes))", 32811aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3282a1915d51SJarod Wilson .fips_allowed = 1, 3283da7f033dSHerbert Xu .suite = { 3284da7f033dSHerbert Xu .cipher = { 3285da7f033dSHerbert Xu .enc = { 3286f7cb80f2SJarod Wilson .vecs = aes_ctr_rfc3686_enc_tv_template, 3287f7cb80f2SJarod Wilson .count = AES_CTR_3686_ENC_TEST_VECTORS 3288da7f033dSHerbert Xu }, 3289da7f033dSHerbert Xu .dec = { 3290f7cb80f2SJarod Wilson .vecs = aes_ctr_rfc3686_dec_tv_template, 3291f7cb80f2SJarod Wilson .count = AES_CTR_3686_DEC_TEST_VECTORS 3292da7f033dSHerbert Xu } 3293da7f033dSHerbert Xu } 3294da7f033dSHerbert Xu } 3295da7f033dSHerbert Xu }, { 329669435b94SAdrian Hoban .alg = "rfc4106(gcm(aes))", 329769435b94SAdrian Hoban .test = alg_test_aead, 3298db71f29aSJarod Wilson .fips_allowed = 1, 329969435b94SAdrian Hoban .suite = { 330069435b94SAdrian Hoban .aead = { 330169435b94SAdrian Hoban .enc = { 330269435b94SAdrian Hoban .vecs = aes_gcm_rfc4106_enc_tv_template, 330369435b94SAdrian Hoban .count = AES_GCM_4106_ENC_TEST_VECTORS 330469435b94SAdrian Hoban }, 330569435b94SAdrian Hoban .dec = { 330669435b94SAdrian Hoban .vecs = aes_gcm_rfc4106_dec_tv_template, 330769435b94SAdrian Hoban .count = AES_GCM_4106_DEC_TEST_VECTORS 330869435b94SAdrian Hoban } 330969435b94SAdrian Hoban } 331069435b94SAdrian Hoban } 331169435b94SAdrian Hoban }, { 33125d667322SJarod Wilson .alg = "rfc4309(ccm(aes))", 33135d667322SJarod Wilson .test = alg_test_aead, 3314a1915d51SJarod Wilson .fips_allowed = 1, 33155d667322SJarod Wilson .suite = { 33165d667322SJarod Wilson .aead = { 33175d667322SJarod Wilson .enc = { 33185d667322SJarod Wilson .vecs = aes_ccm_rfc4309_enc_tv_template, 33195d667322SJarod Wilson .count = AES_CCM_4309_ENC_TEST_VECTORS 33205d667322SJarod Wilson }, 33215d667322SJarod Wilson .dec = { 33225d667322SJarod Wilson .vecs = aes_ccm_rfc4309_dec_tv_template, 33235d667322SJarod Wilson .count = AES_CCM_4309_DEC_TEST_VECTORS 33245d667322SJarod Wilson } 33255d667322SJarod Wilson } 33265d667322SJarod Wilson } 33275d667322SJarod Wilson }, { 3328e9b7441aSJussi Kivilinna .alg = "rfc4543(gcm(aes))", 3329e9b7441aSJussi Kivilinna .test = alg_test_aead, 3330e9b7441aSJussi Kivilinna .suite = { 3331e9b7441aSJussi Kivilinna .aead = { 3332e9b7441aSJussi Kivilinna .enc = { 3333e9b7441aSJussi Kivilinna .vecs = aes_gcm_rfc4543_enc_tv_template, 3334e9b7441aSJussi Kivilinna .count = AES_GCM_4543_ENC_TEST_VECTORS 3335e9b7441aSJussi Kivilinna }, 3336e9b7441aSJussi Kivilinna .dec = { 3337e9b7441aSJussi Kivilinna .vecs = aes_gcm_rfc4543_dec_tv_template, 3338e9b7441aSJussi Kivilinna .count = AES_GCM_4543_DEC_TEST_VECTORS 3339e9b7441aSJussi Kivilinna }, 3340e9b7441aSJussi Kivilinna } 3341e9b7441aSJussi Kivilinna } 3342e9b7441aSJussi Kivilinna }, { 3343da7f033dSHerbert Xu .alg = "rmd128", 3344da7f033dSHerbert Xu .test = alg_test_hash, 3345da7f033dSHerbert Xu .suite = { 3346da7f033dSHerbert Xu .hash = { 3347da7f033dSHerbert Xu .vecs = rmd128_tv_template, 3348da7f033dSHerbert Xu .count = RMD128_TEST_VECTORS 3349da7f033dSHerbert Xu } 3350da7f033dSHerbert Xu } 3351da7f033dSHerbert Xu }, { 3352da7f033dSHerbert Xu .alg = "rmd160", 3353da7f033dSHerbert Xu .test = alg_test_hash, 3354da7f033dSHerbert Xu .suite = { 3355da7f033dSHerbert Xu .hash = { 3356da7f033dSHerbert Xu .vecs = rmd160_tv_template, 3357da7f033dSHerbert Xu .count = RMD160_TEST_VECTORS 3358da7f033dSHerbert Xu } 3359da7f033dSHerbert Xu } 3360da7f033dSHerbert Xu }, { 3361da7f033dSHerbert Xu .alg = "rmd256", 3362da7f033dSHerbert Xu .test = alg_test_hash, 3363da7f033dSHerbert Xu .suite = { 3364da7f033dSHerbert Xu .hash = { 3365da7f033dSHerbert Xu .vecs = rmd256_tv_template, 3366da7f033dSHerbert Xu .count = RMD256_TEST_VECTORS 3367da7f033dSHerbert Xu } 3368da7f033dSHerbert Xu } 3369da7f033dSHerbert Xu }, { 3370da7f033dSHerbert Xu .alg = "rmd320", 3371da7f033dSHerbert Xu .test = alg_test_hash, 3372da7f033dSHerbert Xu .suite = { 3373da7f033dSHerbert Xu .hash = { 3374da7f033dSHerbert Xu .vecs = rmd320_tv_template, 3375da7f033dSHerbert Xu .count = RMD320_TEST_VECTORS 3376da7f033dSHerbert Xu } 3377da7f033dSHerbert Xu } 3378da7f033dSHerbert Xu }, { 3379da7f033dSHerbert Xu .alg = "salsa20", 33801aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3381da7f033dSHerbert Xu .suite = { 3382da7f033dSHerbert Xu .cipher = { 3383da7f033dSHerbert Xu .enc = { 3384da7f033dSHerbert Xu .vecs = salsa20_stream_enc_tv_template, 3385da7f033dSHerbert Xu .count = SALSA20_STREAM_ENC_TEST_VECTORS 3386da7f033dSHerbert Xu } 3387da7f033dSHerbert Xu } 3388da7f033dSHerbert Xu } 3389da7f033dSHerbert Xu }, { 3390da7f033dSHerbert Xu .alg = "sha1", 3391da7f033dSHerbert Xu .test = alg_test_hash, 3392a1915d51SJarod Wilson .fips_allowed = 1, 3393da7f033dSHerbert Xu .suite = { 3394da7f033dSHerbert Xu .hash = { 3395da7f033dSHerbert Xu .vecs = sha1_tv_template, 3396da7f033dSHerbert Xu .count = SHA1_TEST_VECTORS 3397da7f033dSHerbert Xu } 3398da7f033dSHerbert Xu } 3399da7f033dSHerbert Xu }, { 3400da7f033dSHerbert Xu .alg = "sha224", 3401da7f033dSHerbert Xu .test = alg_test_hash, 3402a1915d51SJarod Wilson .fips_allowed = 1, 3403da7f033dSHerbert Xu .suite = { 3404da7f033dSHerbert Xu .hash = { 3405da7f033dSHerbert Xu .vecs = sha224_tv_template, 3406da7f033dSHerbert Xu .count = SHA224_TEST_VECTORS 3407da7f033dSHerbert Xu } 3408da7f033dSHerbert Xu } 3409da7f033dSHerbert Xu }, { 3410da7f033dSHerbert Xu .alg = "sha256", 3411da7f033dSHerbert Xu .test = alg_test_hash, 3412a1915d51SJarod Wilson .fips_allowed = 1, 3413da7f033dSHerbert Xu .suite = { 3414da7f033dSHerbert Xu .hash = { 3415da7f033dSHerbert Xu .vecs = sha256_tv_template, 3416da7f033dSHerbert Xu .count = SHA256_TEST_VECTORS 3417da7f033dSHerbert Xu } 3418da7f033dSHerbert Xu } 3419da7f033dSHerbert Xu }, { 3420da7f033dSHerbert Xu .alg = "sha384", 3421da7f033dSHerbert Xu .test = alg_test_hash, 3422a1915d51SJarod Wilson .fips_allowed = 1, 3423da7f033dSHerbert Xu .suite = { 3424da7f033dSHerbert Xu .hash = { 3425da7f033dSHerbert Xu .vecs = sha384_tv_template, 3426da7f033dSHerbert Xu .count = SHA384_TEST_VECTORS 3427da7f033dSHerbert Xu } 3428da7f033dSHerbert Xu } 3429da7f033dSHerbert Xu }, { 3430da7f033dSHerbert Xu .alg = "sha512", 3431da7f033dSHerbert Xu .test = alg_test_hash, 3432a1915d51SJarod Wilson .fips_allowed = 1, 3433da7f033dSHerbert Xu .suite = { 3434da7f033dSHerbert Xu .hash = { 3435da7f033dSHerbert Xu .vecs = sha512_tv_template, 3436da7f033dSHerbert Xu .count = SHA512_TEST_VECTORS 3437da7f033dSHerbert Xu } 3438da7f033dSHerbert Xu } 3439da7f033dSHerbert Xu }, { 3440da7f033dSHerbert Xu .alg = "tgr128", 3441da7f033dSHerbert Xu .test = alg_test_hash, 3442da7f033dSHerbert Xu .suite = { 3443da7f033dSHerbert Xu .hash = { 3444da7f033dSHerbert Xu .vecs = tgr128_tv_template, 3445da7f033dSHerbert Xu .count = TGR128_TEST_VECTORS 3446da7f033dSHerbert Xu } 3447da7f033dSHerbert Xu } 3448da7f033dSHerbert Xu }, { 3449da7f033dSHerbert Xu .alg = "tgr160", 3450da7f033dSHerbert Xu .test = alg_test_hash, 3451da7f033dSHerbert Xu .suite = { 3452da7f033dSHerbert Xu .hash = { 3453da7f033dSHerbert Xu .vecs = tgr160_tv_template, 3454da7f033dSHerbert Xu .count = TGR160_TEST_VECTORS 3455da7f033dSHerbert Xu } 3456da7f033dSHerbert Xu } 3457da7f033dSHerbert Xu }, { 3458da7f033dSHerbert Xu .alg = "tgr192", 3459da7f033dSHerbert Xu .test = alg_test_hash, 3460da7f033dSHerbert Xu .suite = { 3461da7f033dSHerbert Xu .hash = { 3462da7f033dSHerbert Xu .vecs = tgr192_tv_template, 3463da7f033dSHerbert Xu .count = TGR192_TEST_VECTORS 3464da7f033dSHerbert Xu } 3465da7f033dSHerbert Xu } 3466da7f033dSHerbert Xu }, { 3467f1939f7cSShane Wang .alg = "vmac(aes)", 3468f1939f7cSShane Wang .test = alg_test_hash, 3469f1939f7cSShane Wang .suite = { 3470f1939f7cSShane Wang .hash = { 3471f1939f7cSShane Wang .vecs = aes_vmac128_tv_template, 3472f1939f7cSShane Wang .count = VMAC_AES_TEST_VECTORS 3473f1939f7cSShane Wang } 3474f1939f7cSShane Wang } 3475f1939f7cSShane Wang }, { 3476da7f033dSHerbert Xu .alg = "wp256", 3477da7f033dSHerbert Xu .test = alg_test_hash, 3478da7f033dSHerbert Xu .suite = { 3479da7f033dSHerbert Xu .hash = { 3480da7f033dSHerbert Xu .vecs = wp256_tv_template, 3481da7f033dSHerbert Xu .count = WP256_TEST_VECTORS 3482da7f033dSHerbert Xu } 3483da7f033dSHerbert Xu } 3484da7f033dSHerbert Xu }, { 3485da7f033dSHerbert Xu .alg = "wp384", 3486da7f033dSHerbert Xu .test = alg_test_hash, 3487da7f033dSHerbert Xu .suite = { 3488da7f033dSHerbert Xu .hash = { 3489da7f033dSHerbert Xu .vecs = wp384_tv_template, 3490da7f033dSHerbert Xu .count = WP384_TEST_VECTORS 3491da7f033dSHerbert Xu } 3492da7f033dSHerbert Xu } 3493da7f033dSHerbert Xu }, { 3494da7f033dSHerbert Xu .alg = "wp512", 3495da7f033dSHerbert Xu .test = alg_test_hash, 3496da7f033dSHerbert Xu .suite = { 3497da7f033dSHerbert Xu .hash = { 3498da7f033dSHerbert Xu .vecs = wp512_tv_template, 3499da7f033dSHerbert Xu .count = WP512_TEST_VECTORS 3500da7f033dSHerbert Xu } 3501da7f033dSHerbert Xu } 3502da7f033dSHerbert Xu }, { 3503da7f033dSHerbert Xu .alg = "xcbc(aes)", 3504da7f033dSHerbert Xu .test = alg_test_hash, 3505da7f033dSHerbert Xu .suite = { 3506da7f033dSHerbert Xu .hash = { 3507da7f033dSHerbert Xu .vecs = aes_xcbc128_tv_template, 3508da7f033dSHerbert Xu .count = XCBC_AES_TEST_VECTORS 3509da7f033dSHerbert Xu } 3510da7f033dSHerbert Xu } 3511da7f033dSHerbert Xu }, { 3512da7f033dSHerbert Xu .alg = "xts(aes)", 35131aa4ecd9SHerbert Xu .test = alg_test_skcipher, 35142918aa8dSJarod Wilson .fips_allowed = 1, 3515da7f033dSHerbert Xu .suite = { 3516da7f033dSHerbert Xu .cipher = { 3517da7f033dSHerbert Xu .enc = { 3518da7f033dSHerbert Xu .vecs = aes_xts_enc_tv_template, 3519da7f033dSHerbert Xu .count = AES_XTS_ENC_TEST_VECTORS 3520da7f033dSHerbert Xu }, 3521da7f033dSHerbert Xu .dec = { 3522da7f033dSHerbert Xu .vecs = aes_xts_dec_tv_template, 3523da7f033dSHerbert Xu .count = AES_XTS_DEC_TEST_VECTORS 3524da7f033dSHerbert Xu } 3525da7f033dSHerbert Xu } 3526da7f033dSHerbert Xu } 35270c01aed5SGeert Uytterhoeven }, { 35280840605eSJussi Kivilinna .alg = "xts(camellia)", 35290840605eSJussi Kivilinna .test = alg_test_skcipher, 35300840605eSJussi Kivilinna .suite = { 35310840605eSJussi Kivilinna .cipher = { 35320840605eSJussi Kivilinna .enc = { 35330840605eSJussi Kivilinna .vecs = camellia_xts_enc_tv_template, 35340840605eSJussi Kivilinna .count = CAMELLIA_XTS_ENC_TEST_VECTORS 35350840605eSJussi Kivilinna }, 35360840605eSJussi Kivilinna .dec = { 35370840605eSJussi Kivilinna .vecs = camellia_xts_dec_tv_template, 35380840605eSJussi Kivilinna .count = CAMELLIA_XTS_DEC_TEST_VECTORS 35390840605eSJussi Kivilinna } 35400840605eSJussi Kivilinna } 35410840605eSJussi Kivilinna } 35420840605eSJussi Kivilinna }, { 35439b8b0405SJohannes Goetzfried .alg = "xts(cast6)", 35449b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 35459b8b0405SJohannes Goetzfried .suite = { 35469b8b0405SJohannes Goetzfried .cipher = { 35479b8b0405SJohannes Goetzfried .enc = { 35489b8b0405SJohannes Goetzfried .vecs = cast6_xts_enc_tv_template, 35499b8b0405SJohannes Goetzfried .count = CAST6_XTS_ENC_TEST_VECTORS 35509b8b0405SJohannes Goetzfried }, 35519b8b0405SJohannes Goetzfried .dec = { 35529b8b0405SJohannes Goetzfried .vecs = cast6_xts_dec_tv_template, 35539b8b0405SJohannes Goetzfried .count = CAST6_XTS_DEC_TEST_VECTORS 35549b8b0405SJohannes Goetzfried } 35559b8b0405SJohannes Goetzfried } 35569b8b0405SJohannes Goetzfried } 35579b8b0405SJohannes Goetzfried }, { 355818be20b9SJussi Kivilinna .alg = "xts(serpent)", 355918be20b9SJussi Kivilinna .test = alg_test_skcipher, 356018be20b9SJussi Kivilinna .suite = { 356118be20b9SJussi Kivilinna .cipher = { 356218be20b9SJussi Kivilinna .enc = { 356318be20b9SJussi Kivilinna .vecs = serpent_xts_enc_tv_template, 356418be20b9SJussi Kivilinna .count = SERPENT_XTS_ENC_TEST_VECTORS 356518be20b9SJussi Kivilinna }, 356618be20b9SJussi Kivilinna .dec = { 356718be20b9SJussi Kivilinna .vecs = serpent_xts_dec_tv_template, 356818be20b9SJussi Kivilinna .count = SERPENT_XTS_DEC_TEST_VECTORS 356918be20b9SJussi Kivilinna } 357018be20b9SJussi Kivilinna } 357118be20b9SJussi Kivilinna } 357218be20b9SJussi Kivilinna }, { 3573aed265b9SJussi Kivilinna .alg = "xts(twofish)", 3574aed265b9SJussi Kivilinna .test = alg_test_skcipher, 3575aed265b9SJussi Kivilinna .suite = { 3576aed265b9SJussi Kivilinna .cipher = { 3577aed265b9SJussi Kivilinna .enc = { 3578aed265b9SJussi Kivilinna .vecs = tf_xts_enc_tv_template, 3579aed265b9SJussi Kivilinna .count = TF_XTS_ENC_TEST_VECTORS 3580aed265b9SJussi Kivilinna }, 3581aed265b9SJussi Kivilinna .dec = { 3582aed265b9SJussi Kivilinna .vecs = tf_xts_dec_tv_template, 3583aed265b9SJussi Kivilinna .count = TF_XTS_DEC_TEST_VECTORS 3584aed265b9SJussi Kivilinna } 3585aed265b9SJussi Kivilinna } 3586aed265b9SJussi Kivilinna } 3587aed265b9SJussi Kivilinna }, { 35880c01aed5SGeert Uytterhoeven .alg = "zlib", 35890c01aed5SGeert Uytterhoeven .test = alg_test_pcomp, 35900818904dSMilan Broz .fips_allowed = 1, 35910c01aed5SGeert Uytterhoeven .suite = { 35920c01aed5SGeert Uytterhoeven .pcomp = { 35930c01aed5SGeert Uytterhoeven .comp = { 35940c01aed5SGeert Uytterhoeven .vecs = zlib_comp_tv_template, 35950c01aed5SGeert Uytterhoeven .count = ZLIB_COMP_TEST_VECTORS 35960c01aed5SGeert Uytterhoeven }, 35970c01aed5SGeert Uytterhoeven .decomp = { 35980c01aed5SGeert Uytterhoeven .vecs = zlib_decomp_tv_template, 35990c01aed5SGeert Uytterhoeven .count = ZLIB_DECOMP_TEST_VECTORS 36000c01aed5SGeert Uytterhoeven } 36010c01aed5SGeert Uytterhoeven } 36020c01aed5SGeert Uytterhoeven } 3603da7f033dSHerbert Xu } 3604da7f033dSHerbert Xu }; 3605da7f033dSHerbert Xu 36065714758bSJussi Kivilinna static bool alg_test_descs_checked; 36075714758bSJussi Kivilinna 36085714758bSJussi Kivilinna static void alg_test_descs_check_order(void) 36095714758bSJussi Kivilinna { 36105714758bSJussi Kivilinna int i; 36115714758bSJussi Kivilinna 36125714758bSJussi Kivilinna /* only check once */ 36135714758bSJussi Kivilinna if (alg_test_descs_checked) 36145714758bSJussi Kivilinna return; 36155714758bSJussi Kivilinna 36165714758bSJussi Kivilinna alg_test_descs_checked = true; 36175714758bSJussi Kivilinna 36185714758bSJussi Kivilinna for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) { 36195714758bSJussi Kivilinna int diff = strcmp(alg_test_descs[i - 1].alg, 36205714758bSJussi Kivilinna alg_test_descs[i].alg); 36215714758bSJussi Kivilinna 36225714758bSJussi Kivilinna if (WARN_ON(diff > 0)) { 36235714758bSJussi Kivilinna pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n", 36245714758bSJussi Kivilinna alg_test_descs[i - 1].alg, 36255714758bSJussi Kivilinna alg_test_descs[i].alg); 36265714758bSJussi Kivilinna } 36275714758bSJussi Kivilinna 36285714758bSJussi Kivilinna if (WARN_ON(diff == 0)) { 36295714758bSJussi Kivilinna pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n", 36305714758bSJussi Kivilinna alg_test_descs[i].alg); 36315714758bSJussi Kivilinna } 36325714758bSJussi Kivilinna } 36335714758bSJussi Kivilinna } 36345714758bSJussi Kivilinna 36351aa4ecd9SHerbert Xu static int alg_find_test(const char *alg) 3636da7f033dSHerbert Xu { 3637da7f033dSHerbert Xu int start = 0; 3638da7f033dSHerbert Xu int end = ARRAY_SIZE(alg_test_descs); 3639da7f033dSHerbert Xu 3640da7f033dSHerbert Xu while (start < end) { 3641da7f033dSHerbert Xu int i = (start + end) / 2; 3642da7f033dSHerbert Xu int diff = strcmp(alg_test_descs[i].alg, alg); 3643da7f033dSHerbert Xu 3644da7f033dSHerbert Xu if (diff > 0) { 3645da7f033dSHerbert Xu end = i; 3646da7f033dSHerbert Xu continue; 3647da7f033dSHerbert Xu } 3648da7f033dSHerbert Xu 3649da7f033dSHerbert Xu if (diff < 0) { 3650da7f033dSHerbert Xu start = i + 1; 3651da7f033dSHerbert Xu continue; 3652da7f033dSHerbert Xu } 3653da7f033dSHerbert Xu 36541aa4ecd9SHerbert Xu return i; 3655da7f033dSHerbert Xu } 3656da7f033dSHerbert Xu 36571aa4ecd9SHerbert Xu return -1; 36581aa4ecd9SHerbert Xu } 36591aa4ecd9SHerbert Xu 36601aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 36611aa4ecd9SHerbert Xu { 36621aa4ecd9SHerbert Xu int i; 3663a68f6610SHerbert Xu int j; 3664d12d6b6dSNeil Horman int rc; 36651aa4ecd9SHerbert Xu 36665714758bSJussi Kivilinna alg_test_descs_check_order(); 36675714758bSJussi Kivilinna 36681aa4ecd9SHerbert Xu if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) { 36691aa4ecd9SHerbert Xu char nalg[CRYPTO_MAX_ALG_NAME]; 36701aa4ecd9SHerbert Xu 36711aa4ecd9SHerbert Xu if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >= 36721aa4ecd9SHerbert Xu sizeof(nalg)) 36731aa4ecd9SHerbert Xu return -ENAMETOOLONG; 36741aa4ecd9SHerbert Xu 36751aa4ecd9SHerbert Xu i = alg_find_test(nalg); 36761aa4ecd9SHerbert Xu if (i < 0) 36771aa4ecd9SHerbert Xu goto notest; 36781aa4ecd9SHerbert Xu 3679a3bef3a3SJarod Wilson if (fips_enabled && !alg_test_descs[i].fips_allowed) 3680a3bef3a3SJarod Wilson goto non_fips_alg; 3681a3bef3a3SJarod Wilson 3682941fb328SJarod Wilson rc = alg_test_cipher(alg_test_descs + i, driver, type, mask); 3683941fb328SJarod Wilson goto test_done; 36841aa4ecd9SHerbert Xu } 36851aa4ecd9SHerbert Xu 36861aa4ecd9SHerbert Xu i = alg_find_test(alg); 3687a68f6610SHerbert Xu j = alg_find_test(driver); 3688a68f6610SHerbert Xu if (i < 0 && j < 0) 36891aa4ecd9SHerbert Xu goto notest; 36901aa4ecd9SHerbert Xu 3691a68f6610SHerbert Xu if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) || 3692a68f6610SHerbert Xu (j >= 0 && !alg_test_descs[j].fips_allowed))) 3693a3bef3a3SJarod Wilson goto non_fips_alg; 3694a3bef3a3SJarod Wilson 3695a68f6610SHerbert Xu rc = 0; 3696a68f6610SHerbert Xu if (i >= 0) 3697a68f6610SHerbert Xu rc |= alg_test_descs[i].test(alg_test_descs + i, driver, 36981aa4ecd9SHerbert Xu type, mask); 3699032c8cacSCristian Stoica if (j >= 0 && j != i) 3700a68f6610SHerbert Xu rc |= alg_test_descs[j].test(alg_test_descs + j, driver, 3701a68f6610SHerbert Xu type, mask); 3702a68f6610SHerbert Xu 3703941fb328SJarod Wilson test_done: 3704d12d6b6dSNeil Horman if (fips_enabled && rc) 3705d12d6b6dSNeil Horman panic("%s: %s alg self test failed in fips mode!\n", driver, alg); 3706d12d6b6dSNeil Horman 370729ecd4abSJarod Wilson if (fips_enabled && !rc) 37083e8cffd4SMasanari Iida pr_info("alg: self-tests for %s (%s) passed\n", driver, alg); 370929ecd4abSJarod Wilson 3710d12d6b6dSNeil Horman return rc; 37111aa4ecd9SHerbert Xu 37121aa4ecd9SHerbert Xu notest: 3713da7f033dSHerbert Xu printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver); 3714da7f033dSHerbert Xu return 0; 3715a3bef3a3SJarod Wilson non_fips_alg: 3716a3bef3a3SJarod Wilson return -EINVAL; 3717da7f033dSHerbert Xu } 37180b767f96SAlexander Shishkin 3719326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */ 37200b767f96SAlexander Shishkin 3721da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test); 3722