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> 25da7f033dSHerbert Xu #include <linux/module.h> 26da7f033dSHerbert Xu #include <linux/scatterlist.h> 27da7f033dSHerbert Xu #include <linux/slab.h> 28da7f033dSHerbert Xu #include <linux/string.h> 297647d6ceSJarod Wilson #include <crypto/rng.h> 3064d1cdfbSStephan Mueller #include <crypto/drbg.h> 31da7f033dSHerbert Xu 32da7f033dSHerbert Xu #include "internal.h" 330b767f96SAlexander Shishkin 34326a6346SHerbert Xu #ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS 350b767f96SAlexander Shishkin 360b767f96SAlexander Shishkin /* a perfect nop */ 370b767f96SAlexander Shishkin int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 380b767f96SAlexander Shishkin { 390b767f96SAlexander Shishkin return 0; 400b767f96SAlexander Shishkin } 410b767f96SAlexander Shishkin 420b767f96SAlexander Shishkin #else 430b767f96SAlexander Shishkin 44da7f033dSHerbert Xu #include "testmgr.h" 45da7f033dSHerbert Xu 46da7f033dSHerbert Xu /* 47da7f033dSHerbert Xu * Need slab memory for testing (size in number of pages). 48da7f033dSHerbert Xu */ 49da7f033dSHerbert Xu #define XBUFSIZE 8 50da7f033dSHerbert Xu 51da7f033dSHerbert Xu /* 52da7f033dSHerbert Xu * Indexes into the xbuf to simulate cross-page access. 53da7f033dSHerbert Xu */ 54da7f033dSHerbert Xu #define IDX1 32 55da7f033dSHerbert Xu #define IDX2 32400 56da7f033dSHerbert Xu #define IDX3 1 57da7f033dSHerbert Xu #define IDX4 8193 58da7f033dSHerbert Xu #define IDX5 22222 59da7f033dSHerbert Xu #define IDX6 17101 60da7f033dSHerbert Xu #define IDX7 27333 61da7f033dSHerbert Xu #define IDX8 3000 62da7f033dSHerbert Xu 63da7f033dSHerbert Xu /* 64da7f033dSHerbert Xu * Used by test_cipher() 65da7f033dSHerbert Xu */ 66da7f033dSHerbert Xu #define ENCRYPT 1 67da7f033dSHerbert Xu #define DECRYPT 0 68da7f033dSHerbert Xu 69da7f033dSHerbert Xu struct tcrypt_result { 70da7f033dSHerbert Xu struct completion completion; 71da7f033dSHerbert Xu int err; 72da7f033dSHerbert Xu }; 73da7f033dSHerbert Xu 74da7f033dSHerbert Xu struct aead_test_suite { 75da7f033dSHerbert Xu struct { 76da7f033dSHerbert Xu struct aead_testvec *vecs; 77da7f033dSHerbert Xu unsigned int count; 78da7f033dSHerbert Xu } enc, dec; 79da7f033dSHerbert Xu }; 80da7f033dSHerbert Xu 81da7f033dSHerbert Xu struct cipher_test_suite { 82da7f033dSHerbert Xu struct { 83da7f033dSHerbert Xu struct cipher_testvec *vecs; 84da7f033dSHerbert Xu unsigned int count; 85da7f033dSHerbert Xu } enc, dec; 86da7f033dSHerbert Xu }; 87da7f033dSHerbert Xu 88da7f033dSHerbert Xu struct comp_test_suite { 89da7f033dSHerbert Xu struct { 90da7f033dSHerbert Xu struct comp_testvec *vecs; 91da7f033dSHerbert Xu unsigned int count; 92da7f033dSHerbert Xu } comp, decomp; 93da7f033dSHerbert Xu }; 94da7f033dSHerbert Xu 958064efb8SGeert Uytterhoeven struct pcomp_test_suite { 968064efb8SGeert Uytterhoeven struct { 978064efb8SGeert Uytterhoeven struct pcomp_testvec *vecs; 988064efb8SGeert Uytterhoeven unsigned int count; 998064efb8SGeert Uytterhoeven } comp, decomp; 1008064efb8SGeert Uytterhoeven }; 1018064efb8SGeert Uytterhoeven 102da7f033dSHerbert Xu struct hash_test_suite { 103da7f033dSHerbert Xu struct hash_testvec *vecs; 104da7f033dSHerbert Xu unsigned int count; 105da7f033dSHerbert Xu }; 106da7f033dSHerbert Xu 1077647d6ceSJarod Wilson struct cprng_test_suite { 1087647d6ceSJarod Wilson struct cprng_testvec *vecs; 1097647d6ceSJarod Wilson unsigned int count; 1107647d6ceSJarod Wilson }; 1117647d6ceSJarod Wilson 11264d1cdfbSStephan Mueller struct drbg_test_suite { 11364d1cdfbSStephan Mueller struct drbg_testvec *vecs; 11464d1cdfbSStephan Mueller unsigned int count; 11564d1cdfbSStephan Mueller }; 11664d1cdfbSStephan Mueller 117da7f033dSHerbert Xu struct alg_test_desc { 118da7f033dSHerbert Xu const char *alg; 119da7f033dSHerbert Xu int (*test)(const struct alg_test_desc *desc, const char *driver, 120da7f033dSHerbert Xu u32 type, u32 mask); 121a1915d51SJarod Wilson int fips_allowed; /* set if alg is allowed in fips mode */ 122da7f033dSHerbert Xu 123da7f033dSHerbert Xu union { 124da7f033dSHerbert Xu struct aead_test_suite aead; 125da7f033dSHerbert Xu struct cipher_test_suite cipher; 126da7f033dSHerbert Xu struct comp_test_suite comp; 1278064efb8SGeert Uytterhoeven struct pcomp_test_suite pcomp; 128da7f033dSHerbert Xu struct hash_test_suite hash; 1297647d6ceSJarod Wilson struct cprng_test_suite cprng; 13064d1cdfbSStephan Mueller struct drbg_test_suite drbg; 131da7f033dSHerbert Xu } suite; 132da7f033dSHerbert Xu }; 133da7f033dSHerbert Xu 134da7f033dSHerbert Xu static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 }; 135da7f033dSHerbert Xu 136da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len) 137da7f033dSHerbert Xu { 138da7f033dSHerbert Xu print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET, 139da7f033dSHerbert Xu 16, 1, 140da7f033dSHerbert Xu buf, len, false); 141da7f033dSHerbert Xu } 142da7f033dSHerbert Xu 143da7f033dSHerbert Xu static void tcrypt_complete(struct crypto_async_request *req, int err) 144da7f033dSHerbert Xu { 145da7f033dSHerbert Xu struct tcrypt_result *res = req->data; 146da7f033dSHerbert Xu 147da7f033dSHerbert Xu if (err == -EINPROGRESS) 148da7f033dSHerbert Xu return; 149da7f033dSHerbert Xu 150da7f033dSHerbert Xu res->err = err; 151da7f033dSHerbert Xu complete(&res->completion); 152da7f033dSHerbert Xu } 153da7f033dSHerbert Xu 154f8b0d4d0SHerbert Xu static int testmgr_alloc_buf(char *buf[XBUFSIZE]) 155f8b0d4d0SHerbert Xu { 156f8b0d4d0SHerbert Xu int i; 157f8b0d4d0SHerbert Xu 158f8b0d4d0SHerbert Xu for (i = 0; i < XBUFSIZE; i++) { 159f8b0d4d0SHerbert Xu buf[i] = (void *)__get_free_page(GFP_KERNEL); 160f8b0d4d0SHerbert Xu if (!buf[i]) 161f8b0d4d0SHerbert Xu goto err_free_buf; 162f8b0d4d0SHerbert Xu } 163f8b0d4d0SHerbert Xu 164f8b0d4d0SHerbert Xu return 0; 165f8b0d4d0SHerbert Xu 166f8b0d4d0SHerbert Xu err_free_buf: 167f8b0d4d0SHerbert Xu while (i-- > 0) 168f8b0d4d0SHerbert Xu free_page((unsigned long)buf[i]); 169f8b0d4d0SHerbert Xu 170f8b0d4d0SHerbert Xu return -ENOMEM; 171f8b0d4d0SHerbert Xu } 172f8b0d4d0SHerbert Xu 173f8b0d4d0SHerbert Xu static void testmgr_free_buf(char *buf[XBUFSIZE]) 174f8b0d4d0SHerbert Xu { 175f8b0d4d0SHerbert Xu int i; 176f8b0d4d0SHerbert Xu 177f8b0d4d0SHerbert Xu for (i = 0; i < XBUFSIZE; i++) 178f8b0d4d0SHerbert Xu free_page((unsigned long)buf[i]); 179f8b0d4d0SHerbert Xu } 180f8b0d4d0SHerbert Xu 181a8f1a052SDavid S. Miller static int do_one_async_hash_op(struct ahash_request *req, 182a8f1a052SDavid S. Miller struct tcrypt_result *tr, 183a8f1a052SDavid S. Miller int ret) 184a8f1a052SDavid S. Miller { 185a8f1a052SDavid S. Miller if (ret == -EINPROGRESS || ret == -EBUSY) { 186a8f1a052SDavid S. Miller ret = wait_for_completion_interruptible(&tr->completion); 187a8f1a052SDavid S. Miller if (!ret) 188a8f1a052SDavid S. Miller ret = tr->err; 18916735d02SWolfram Sang reinit_completion(&tr->completion); 190a8f1a052SDavid S. Miller } 191a8f1a052SDavid S. Miller return ret; 192a8f1a052SDavid S. Miller } 193a8f1a052SDavid S. Miller 194da5ffe11SJussi Kivilinna static int __test_hash(struct crypto_ahash *tfm, struct hash_testvec *template, 195da5ffe11SJussi Kivilinna unsigned int tcount, bool use_digest, 196da5ffe11SJussi Kivilinna const int align_offset) 197da7f033dSHerbert Xu { 198da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm)); 199da7f033dSHerbert Xu unsigned int i, j, k, temp; 200da7f033dSHerbert Xu struct scatterlist sg[8]; 20129b77e5dSHoria Geanta char *result; 20229b77e5dSHoria Geanta char *key; 203da7f033dSHerbert Xu struct ahash_request *req; 204da7f033dSHerbert Xu struct tcrypt_result tresult; 205da7f033dSHerbert Xu void *hash_buff; 206f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 207f8b0d4d0SHerbert Xu int ret = -ENOMEM; 208f8b0d4d0SHerbert Xu 20929b77e5dSHoria Geanta result = kmalloc(MAX_DIGEST_SIZE, GFP_KERNEL); 21029b77e5dSHoria Geanta if (!result) 21129b77e5dSHoria Geanta return ret; 21229b77e5dSHoria Geanta key = kmalloc(MAX_KEYLEN, GFP_KERNEL); 21329b77e5dSHoria Geanta if (!key) 21429b77e5dSHoria Geanta goto out_nobuf; 215f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 216f8b0d4d0SHerbert Xu goto out_nobuf; 217da7f033dSHerbert Xu 218da7f033dSHerbert Xu init_completion(&tresult.completion); 219da7f033dSHerbert Xu 220da7f033dSHerbert Xu req = ahash_request_alloc(tfm, GFP_KERNEL); 221da7f033dSHerbert Xu if (!req) { 222da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to allocate request for " 223da7f033dSHerbert Xu "%s\n", algo); 224da7f033dSHerbert Xu goto out_noreq; 225da7f033dSHerbert Xu } 226da7f033dSHerbert Xu ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 227da7f033dSHerbert Xu tcrypt_complete, &tresult); 228da7f033dSHerbert Xu 229a0cfae59SHerbert Xu j = 0; 230da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 231a0cfae59SHerbert Xu if (template[i].np) 232a0cfae59SHerbert Xu continue; 233a0cfae59SHerbert Xu 234da5ffe11SJussi Kivilinna ret = -EINVAL; 235da5ffe11SJussi Kivilinna if (WARN_ON(align_offset + template[i].psize > PAGE_SIZE)) 236da5ffe11SJussi Kivilinna goto out; 237da5ffe11SJussi Kivilinna 238a0cfae59SHerbert Xu j++; 23929b77e5dSHoria Geanta memset(result, 0, MAX_DIGEST_SIZE); 240da7f033dSHerbert Xu 241da7f033dSHerbert Xu hash_buff = xbuf[0]; 242da5ffe11SJussi Kivilinna hash_buff += align_offset; 243da7f033dSHerbert Xu 244da7f033dSHerbert Xu memcpy(hash_buff, template[i].plaintext, template[i].psize); 245da7f033dSHerbert Xu sg_init_one(&sg[0], hash_buff, template[i].psize); 246da7f033dSHerbert Xu 247da7f033dSHerbert Xu if (template[i].ksize) { 248da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 24929b77e5dSHoria Geanta if (template[i].ksize > MAX_KEYLEN) { 25029b77e5dSHoria Geanta pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n", 25129b77e5dSHoria Geanta j, algo, template[i].ksize, MAX_KEYLEN); 25229b77e5dSHoria Geanta ret = -EINVAL; 25329b77e5dSHoria Geanta goto out; 25429b77e5dSHoria Geanta } 25529b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].ksize); 25629b77e5dSHoria Geanta ret = crypto_ahash_setkey(tfm, key, template[i].ksize); 257da7f033dSHerbert Xu if (ret) { 258da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey failed on " 259a0cfae59SHerbert Xu "test %d for %s: ret=%d\n", j, algo, 260da7f033dSHerbert Xu -ret); 261da7f033dSHerbert Xu goto out; 262da7f033dSHerbert Xu } 263da7f033dSHerbert Xu } 264da7f033dSHerbert Xu 265da7f033dSHerbert Xu ahash_request_set_crypt(req, sg, result, template[i].psize); 266a8f1a052SDavid S. Miller if (use_digest) { 267a8f1a052SDavid S. Miller ret = do_one_async_hash_op(req, &tresult, 268a8f1a052SDavid S. Miller crypto_ahash_digest(req)); 269a8f1a052SDavid S. Miller if (ret) { 270a8f1a052SDavid S. Miller pr_err("alg: hash: digest failed on test %d " 271a0cfae59SHerbert Xu "for %s: ret=%d\n", j, algo, -ret); 272da7f033dSHerbert Xu goto out; 273da7f033dSHerbert Xu } 274a8f1a052SDavid S. Miller } else { 275a8f1a052SDavid S. Miller ret = do_one_async_hash_op(req, &tresult, 276a8f1a052SDavid S. Miller crypto_ahash_init(req)); 277a8f1a052SDavid S. Miller if (ret) { 278a8f1a052SDavid S. Miller pr_err("alt: hash: init failed on test %d " 279a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 280a8f1a052SDavid S. Miller goto out; 281a8f1a052SDavid S. Miller } 282a8f1a052SDavid S. Miller ret = do_one_async_hash_op(req, &tresult, 283a8f1a052SDavid S. Miller crypto_ahash_update(req)); 284a8f1a052SDavid S. Miller if (ret) { 285a8f1a052SDavid S. Miller pr_err("alt: hash: update failed on test %d " 286a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 287a8f1a052SDavid S. Miller goto out; 288a8f1a052SDavid S. Miller } 289a8f1a052SDavid S. Miller ret = do_one_async_hash_op(req, &tresult, 290a8f1a052SDavid S. Miller crypto_ahash_final(req)); 291a8f1a052SDavid S. Miller if (ret) { 292a8f1a052SDavid S. Miller pr_err("alt: hash: final failed on test %d " 293a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 294a8f1a052SDavid S. Miller goto out; 295a8f1a052SDavid S. Miller } 296a8f1a052SDavid S. Miller } 297da7f033dSHerbert Xu 298da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 299da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 300da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Test %d failed for %s\n", 301a0cfae59SHerbert Xu j, algo); 302da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 303da7f033dSHerbert Xu ret = -EINVAL; 304da7f033dSHerbert Xu goto out; 305da7f033dSHerbert Xu } 306da7f033dSHerbert Xu } 307da7f033dSHerbert Xu 308da7f033dSHerbert Xu j = 0; 309da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 310da5ffe11SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 311da5ffe11SJussi Kivilinna if (align_offset != 0) 312da5ffe11SJussi Kivilinna break; 313da5ffe11SJussi Kivilinna 314da7f033dSHerbert Xu if (template[i].np) { 315da7f033dSHerbert Xu j++; 31629b77e5dSHoria Geanta memset(result, 0, MAX_DIGEST_SIZE); 317da7f033dSHerbert Xu 318da7f033dSHerbert Xu temp = 0; 319da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 320fd57f22aSHerbert Xu ret = -EINVAL; 321da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 322fd57f22aSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 323fd57f22aSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 324fd57f22aSHerbert Xu goto out; 325da7f033dSHerbert Xu sg_set_buf(&sg[k], 326da7f033dSHerbert Xu memcpy(xbuf[IDX[k] >> PAGE_SHIFT] + 327da7f033dSHerbert Xu offset_in_page(IDX[k]), 328da7f033dSHerbert Xu template[i].plaintext + temp, 329da7f033dSHerbert Xu template[i].tap[k]), 330da7f033dSHerbert Xu template[i].tap[k]); 331da7f033dSHerbert Xu temp += template[i].tap[k]; 332da7f033dSHerbert Xu } 333da7f033dSHerbert Xu 334da7f033dSHerbert Xu if (template[i].ksize) { 33529b77e5dSHoria Geanta if (template[i].ksize > MAX_KEYLEN) { 33629b77e5dSHoria Geanta pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n", 33729b77e5dSHoria Geanta j, algo, template[i].ksize, 33829b77e5dSHoria Geanta MAX_KEYLEN); 33929b77e5dSHoria Geanta ret = -EINVAL; 34029b77e5dSHoria Geanta goto out; 34129b77e5dSHoria Geanta } 342da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 34329b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].ksize); 34429b77e5dSHoria Geanta ret = crypto_ahash_setkey(tfm, key, 345da7f033dSHerbert Xu template[i].ksize); 346da7f033dSHerbert Xu 347da7f033dSHerbert Xu if (ret) { 348da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey " 349da7f033dSHerbert Xu "failed on chunking test %d " 350da7f033dSHerbert Xu "for %s: ret=%d\n", j, algo, 351da7f033dSHerbert Xu -ret); 352da7f033dSHerbert Xu goto out; 353da7f033dSHerbert Xu } 354da7f033dSHerbert Xu } 355da7f033dSHerbert Xu 356da7f033dSHerbert Xu ahash_request_set_crypt(req, sg, result, 357da7f033dSHerbert Xu template[i].psize); 358da7f033dSHerbert Xu ret = crypto_ahash_digest(req); 359da7f033dSHerbert Xu switch (ret) { 360da7f033dSHerbert Xu case 0: 361da7f033dSHerbert Xu break; 362da7f033dSHerbert Xu case -EINPROGRESS: 363da7f033dSHerbert Xu case -EBUSY: 364da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 365da7f033dSHerbert Xu &tresult.completion); 366da7f033dSHerbert Xu if (!ret && !(ret = tresult.err)) { 36716735d02SWolfram Sang reinit_completion(&tresult.completion); 368da7f033dSHerbert Xu break; 369da7f033dSHerbert Xu } 370da7f033dSHerbert Xu /* fall through */ 371da7f033dSHerbert Xu default: 372da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: digest failed " 373da7f033dSHerbert Xu "on chunking test %d for %s: " 374da7f033dSHerbert Xu "ret=%d\n", j, algo, -ret); 375da7f033dSHerbert Xu goto out; 376da7f033dSHerbert Xu } 377da7f033dSHerbert Xu 378da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 379da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 380da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Chunking test %d " 381da7f033dSHerbert Xu "failed for %s\n", j, algo); 382da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 383da7f033dSHerbert Xu ret = -EINVAL; 384da7f033dSHerbert Xu goto out; 385da7f033dSHerbert Xu } 386da7f033dSHerbert Xu } 387da7f033dSHerbert Xu } 388da7f033dSHerbert Xu 389da7f033dSHerbert Xu ret = 0; 390da7f033dSHerbert Xu 391da7f033dSHerbert Xu out: 392da7f033dSHerbert Xu ahash_request_free(req); 393da7f033dSHerbert Xu out_noreq: 394f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 395f8b0d4d0SHerbert Xu out_nobuf: 39629b77e5dSHoria Geanta kfree(key); 39729b77e5dSHoria Geanta kfree(result); 398da7f033dSHerbert Xu return ret; 399da7f033dSHerbert Xu } 400da7f033dSHerbert Xu 401da5ffe11SJussi Kivilinna static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template, 402da5ffe11SJussi Kivilinna unsigned int tcount, bool use_digest) 403da5ffe11SJussi Kivilinna { 404da5ffe11SJussi Kivilinna unsigned int alignmask; 405da5ffe11SJussi Kivilinna int ret; 406da5ffe11SJussi Kivilinna 407da5ffe11SJussi Kivilinna ret = __test_hash(tfm, template, tcount, use_digest, 0); 408da5ffe11SJussi Kivilinna if (ret) 409da5ffe11SJussi Kivilinna return ret; 410da5ffe11SJussi Kivilinna 411da5ffe11SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 412da5ffe11SJussi Kivilinna ret = __test_hash(tfm, template, tcount, use_digest, 1); 413da5ffe11SJussi Kivilinna if (ret) 414da5ffe11SJussi Kivilinna return ret; 415da5ffe11SJussi Kivilinna 416da5ffe11SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 417da5ffe11SJussi Kivilinna if (alignmask) { 418da5ffe11SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 419da5ffe11SJussi Kivilinna ret = __test_hash(tfm, template, tcount, use_digest, 420da5ffe11SJussi Kivilinna alignmask + 1); 421da5ffe11SJussi Kivilinna if (ret) 422da5ffe11SJussi Kivilinna return ret; 423da5ffe11SJussi Kivilinna } 424da5ffe11SJussi Kivilinna 425da5ffe11SJussi Kivilinna return 0; 426da5ffe11SJussi Kivilinna } 427da5ffe11SJussi Kivilinna 428d8a32ac2SJussi Kivilinna static int __test_aead(struct crypto_aead *tfm, int enc, 429d8a32ac2SJussi Kivilinna struct aead_testvec *template, unsigned int tcount, 43058dcf548SJussi Kivilinna const bool diff_dst, const int align_offset) 431da7f033dSHerbert Xu { 432da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)); 433da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 434f8b0d4d0SHerbert Xu int ret = -ENOMEM; 435da7f033dSHerbert Xu char *q; 436da7f033dSHerbert Xu char *key; 437da7f033dSHerbert Xu struct aead_request *req; 438d8a32ac2SJussi Kivilinna struct scatterlist *sg; 439d8a32ac2SJussi Kivilinna struct scatterlist *asg; 440d8a32ac2SJussi Kivilinna struct scatterlist *sgout; 441d8a32ac2SJussi Kivilinna const char *e, *d; 442da7f033dSHerbert Xu struct tcrypt_result result; 443da7f033dSHerbert Xu unsigned int authsize; 444da7f033dSHerbert Xu void *input; 445d8a32ac2SJussi Kivilinna void *output; 446da7f033dSHerbert Xu void *assoc; 4479bac019dSTadeusz Struk char *iv; 448f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 449d8a32ac2SJussi Kivilinna char *xoutbuf[XBUFSIZE]; 450f8b0d4d0SHerbert Xu char *axbuf[XBUFSIZE]; 451f8b0d4d0SHerbert Xu 4529bac019dSTadeusz Struk iv = kzalloc(MAX_IVLEN, GFP_KERNEL); 4539bac019dSTadeusz Struk if (!iv) 4549bac019dSTadeusz Struk return ret; 45529b77e5dSHoria Geanta key = kmalloc(MAX_KEYLEN, GFP_KERNEL); 45629b77e5dSHoria Geanta if (!key) 45729b77e5dSHoria Geanta goto out_noxbuf; 458f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 459f8b0d4d0SHerbert Xu goto out_noxbuf; 460f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(axbuf)) 461f8b0d4d0SHerbert Xu goto out_noaxbuf; 462d8a32ac2SJussi Kivilinna if (diff_dst && testmgr_alloc_buf(xoutbuf)) 463d8a32ac2SJussi Kivilinna goto out_nooutbuf; 464d8a32ac2SJussi Kivilinna 465d8a32ac2SJussi Kivilinna /* avoid "the frame size is larger than 1024 bytes" compiler warning */ 466d8a32ac2SJussi Kivilinna sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 3 : 2), GFP_KERNEL); 467d8a32ac2SJussi Kivilinna if (!sg) 468d8a32ac2SJussi Kivilinna goto out_nosg; 469d8a32ac2SJussi Kivilinna asg = &sg[8]; 470d8a32ac2SJussi Kivilinna sgout = &asg[8]; 471d8a32ac2SJussi Kivilinna 472d8a32ac2SJussi Kivilinna if (diff_dst) 473d8a32ac2SJussi Kivilinna d = "-ddst"; 474d8a32ac2SJussi Kivilinna else 475d8a32ac2SJussi Kivilinna d = ""; 476d8a32ac2SJussi Kivilinna 477da7f033dSHerbert Xu if (enc == ENCRYPT) 478da7f033dSHerbert Xu e = "encryption"; 479da7f033dSHerbert Xu else 480da7f033dSHerbert Xu e = "decryption"; 481da7f033dSHerbert Xu 482da7f033dSHerbert Xu init_completion(&result.completion); 483da7f033dSHerbert Xu 484da7f033dSHerbert Xu req = aead_request_alloc(tfm, GFP_KERNEL); 485da7f033dSHerbert Xu if (!req) { 486d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to allocate request for %s\n", 487d8a32ac2SJussi Kivilinna d, algo); 488da7f033dSHerbert Xu goto out; 489da7f033dSHerbert Xu } 490da7f033dSHerbert Xu 491da7f033dSHerbert Xu aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 492da7f033dSHerbert Xu tcrypt_complete, &result); 493da7f033dSHerbert Xu 494da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 495da7f033dSHerbert Xu if (!template[i].np) { 496da7f033dSHerbert Xu j++; 497da7f033dSHerbert Xu 49858dcf548SJussi Kivilinna /* some templates have no input data but they will 499da7f033dSHerbert Xu * touch input 500da7f033dSHerbert Xu */ 501da7f033dSHerbert Xu input = xbuf[0]; 50258dcf548SJussi Kivilinna input += align_offset; 503da7f033dSHerbert Xu assoc = axbuf[0]; 504da7f033dSHerbert Xu 505fd57f22aSHerbert Xu ret = -EINVAL; 50658dcf548SJussi Kivilinna if (WARN_ON(align_offset + template[i].ilen > 50758dcf548SJussi Kivilinna PAGE_SIZE || template[i].alen > PAGE_SIZE)) 508fd57f22aSHerbert Xu goto out; 509fd57f22aSHerbert Xu 510da7f033dSHerbert Xu memcpy(input, template[i].input, template[i].ilen); 511da7f033dSHerbert Xu memcpy(assoc, template[i].assoc, template[i].alen); 512da7f033dSHerbert Xu if (template[i].iv) 513da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 514da7f033dSHerbert Xu else 515da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 516da7f033dSHerbert Xu 517da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 518da7f033dSHerbert Xu if (template[i].wk) 519da7f033dSHerbert Xu crypto_aead_set_flags( 520da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 521da7f033dSHerbert Xu 52229b77e5dSHoria Geanta if (template[i].klen > MAX_KEYLEN) { 52329b77e5dSHoria Geanta pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n", 52429b77e5dSHoria Geanta d, j, algo, template[i].klen, 52529b77e5dSHoria Geanta MAX_KEYLEN); 52629b77e5dSHoria Geanta ret = -EINVAL; 52729b77e5dSHoria Geanta goto out; 52829b77e5dSHoria Geanta } 52929b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].klen); 530da7f033dSHerbert Xu 531da7f033dSHerbert Xu ret = crypto_aead_setkey(tfm, key, 532da7f033dSHerbert Xu template[i].klen); 533da7f033dSHerbert Xu if (!ret == template[i].fail) { 534d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n", 535d8a32ac2SJussi Kivilinna d, j, algo, crypto_aead_get_flags(tfm)); 536da7f033dSHerbert Xu goto out; 537da7f033dSHerbert Xu } else if (ret) 538da7f033dSHerbert Xu continue; 539da7f033dSHerbert Xu 540da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 541da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 542da7f033dSHerbert Xu if (ret) { 543d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n", 544d8a32ac2SJussi Kivilinna d, authsize, j, algo); 545da7f033dSHerbert Xu goto out; 546da7f033dSHerbert Xu } 547da7f033dSHerbert Xu 548d8a32ac2SJussi Kivilinna if (diff_dst) { 549d8a32ac2SJussi Kivilinna output = xoutbuf[0]; 55058dcf548SJussi Kivilinna output += align_offset; 5518ec25c51SHoria Geanta sg_init_one(&sg[0], input, template[i].ilen); 552d8a32ac2SJussi Kivilinna sg_init_one(&sgout[0], output, 5538ec25c51SHoria Geanta template[i].rlen); 5548ec25c51SHoria Geanta } else { 5558ec25c51SHoria Geanta sg_init_one(&sg[0], input, 556d8a32ac2SJussi Kivilinna template[i].ilen + 557d8a32ac2SJussi Kivilinna (enc ? authsize : 0)); 558d8a32ac2SJussi Kivilinna output = input; 559d8a32ac2SJussi Kivilinna } 560d8a32ac2SJussi Kivilinna 561da7f033dSHerbert Xu sg_init_one(&asg[0], assoc, template[i].alen); 562da7f033dSHerbert Xu 563d8a32ac2SJussi Kivilinna aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 564da7f033dSHerbert Xu template[i].ilen, iv); 565da7f033dSHerbert Xu 566da7f033dSHerbert Xu aead_request_set_assoc(req, asg, template[i].alen); 567da7f033dSHerbert Xu 568da7f033dSHerbert Xu ret = enc ? 569da7f033dSHerbert Xu crypto_aead_encrypt(req) : 570da7f033dSHerbert Xu crypto_aead_decrypt(req); 571da7f033dSHerbert Xu 572da7f033dSHerbert Xu switch (ret) { 573da7f033dSHerbert Xu case 0: 574e44a1b44SJarod Wilson if (template[i].novrfy) { 575e44a1b44SJarod Wilson /* verification was supposed to fail */ 576d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n", 577d8a32ac2SJussi Kivilinna d, e, j, algo); 578e44a1b44SJarod Wilson /* so really, we got a bad message */ 579e44a1b44SJarod Wilson ret = -EBADMSG; 580e44a1b44SJarod Wilson goto out; 581e44a1b44SJarod Wilson } 582da7f033dSHerbert Xu break; 583da7f033dSHerbert Xu case -EINPROGRESS: 584da7f033dSHerbert Xu case -EBUSY: 585da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 586da7f033dSHerbert Xu &result.completion); 587da7f033dSHerbert Xu if (!ret && !(ret = result.err)) { 58816735d02SWolfram Sang reinit_completion(&result.completion); 589da7f033dSHerbert Xu break; 590da7f033dSHerbert Xu } 591e44a1b44SJarod Wilson case -EBADMSG: 592e44a1b44SJarod Wilson if (template[i].novrfy) 593e44a1b44SJarod Wilson /* verification failure was expected */ 594e44a1b44SJarod Wilson continue; 595da7f033dSHerbert Xu /* fall through */ 596da7f033dSHerbert Xu default: 597d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n", 598d8a32ac2SJussi Kivilinna d, e, j, algo, -ret); 599da7f033dSHerbert Xu goto out; 600da7f033dSHerbert Xu } 601da7f033dSHerbert Xu 602d8a32ac2SJussi Kivilinna q = output; 603da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 604d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Test %d failed on %s for %s\n", 605d8a32ac2SJussi Kivilinna d, j, e, algo); 606da7f033dSHerbert Xu hexdump(q, template[i].rlen); 607da7f033dSHerbert Xu ret = -EINVAL; 608da7f033dSHerbert Xu goto out; 609da7f033dSHerbert Xu } 610da7f033dSHerbert Xu } 611da7f033dSHerbert Xu } 612da7f033dSHerbert Xu 613da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 61458dcf548SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 61558dcf548SJussi Kivilinna if (align_offset != 0) 61658dcf548SJussi Kivilinna break; 61758dcf548SJussi Kivilinna 618da7f033dSHerbert Xu if (template[i].np) { 619da7f033dSHerbert Xu j++; 620da7f033dSHerbert Xu 621da7f033dSHerbert Xu if (template[i].iv) 622da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 623da7f033dSHerbert Xu else 624da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 625da7f033dSHerbert Xu 626da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 627da7f033dSHerbert Xu if (template[i].wk) 628da7f033dSHerbert Xu crypto_aead_set_flags( 629da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 63029b77e5dSHoria Geanta if (template[i].klen > MAX_KEYLEN) { 63129b77e5dSHoria Geanta pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n", 63229b77e5dSHoria Geanta d, j, algo, template[i].klen, 63329b77e5dSHoria Geanta MAX_KEYLEN); 63429b77e5dSHoria Geanta ret = -EINVAL; 63529b77e5dSHoria Geanta goto out; 63629b77e5dSHoria Geanta } 63729b77e5dSHoria Geanta memcpy(key, template[i].key, template[i].klen); 638da7f033dSHerbert Xu 639da7f033dSHerbert Xu ret = crypto_aead_setkey(tfm, key, template[i].klen); 640da7f033dSHerbert Xu if (!ret == template[i].fail) { 641d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n", 642d8a32ac2SJussi Kivilinna d, j, algo, crypto_aead_get_flags(tfm)); 643da7f033dSHerbert Xu goto out; 644da7f033dSHerbert Xu } else if (ret) 645da7f033dSHerbert Xu continue; 646da7f033dSHerbert Xu 647da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 648da7f033dSHerbert Xu 649da7f033dSHerbert Xu ret = -EINVAL; 650da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 651d8a32ac2SJussi Kivilinna if (diff_dst) 652d8a32ac2SJussi Kivilinna sg_init_table(sgout, template[i].np); 653da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 654da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 655da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 656da7f033dSHerbert Xu goto out; 657da7f033dSHerbert Xu 658da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 659da7f033dSHerbert Xu offset_in_page(IDX[k]); 660da7f033dSHerbert Xu 661da7f033dSHerbert Xu memcpy(q, template[i].input + temp, 662da7f033dSHerbert Xu template[i].tap[k]); 663da7f033dSHerbert Xu 664da7f033dSHerbert Xu sg_set_buf(&sg[k], q, template[i].tap[k]); 665d8a32ac2SJussi Kivilinna 666d8a32ac2SJussi Kivilinna if (diff_dst) { 667d8a32ac2SJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 668d8a32ac2SJussi Kivilinna offset_in_page(IDX[k]); 669d8a32ac2SJussi Kivilinna 670d8a32ac2SJussi Kivilinna memset(q, 0, template[i].tap[k]); 671d8a32ac2SJussi Kivilinna 672d8a32ac2SJussi Kivilinna sg_set_buf(&sgout[k], q, 673d8a32ac2SJussi Kivilinna template[i].tap[k]); 674d8a32ac2SJussi Kivilinna } 675d8a32ac2SJussi Kivilinna 6768ec25c51SHoria Geanta n = template[i].tap[k]; 6778ec25c51SHoria Geanta if (k == template[i].np - 1 && enc) 6788ec25c51SHoria Geanta n += authsize; 6798ec25c51SHoria Geanta if (offset_in_page(q) + n < PAGE_SIZE) 6808ec25c51SHoria Geanta q[n] = 0; 6818ec25c51SHoria Geanta 682da7f033dSHerbert Xu temp += template[i].tap[k]; 683da7f033dSHerbert Xu } 684da7f033dSHerbert Xu 685da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 686da7f033dSHerbert Xu if (ret) { 687d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n", 688d8a32ac2SJussi Kivilinna d, authsize, j, algo); 689da7f033dSHerbert Xu goto out; 690da7f033dSHerbert Xu } 691da7f033dSHerbert Xu 692da7f033dSHerbert Xu if (enc) { 693da7f033dSHerbert Xu if (WARN_ON(sg[k - 1].offset + 694da7f033dSHerbert Xu sg[k - 1].length + authsize > 695da7f033dSHerbert Xu PAGE_SIZE)) { 696da7f033dSHerbert Xu ret = -EINVAL; 697da7f033dSHerbert Xu goto out; 698da7f033dSHerbert Xu } 699da7f033dSHerbert Xu 700d8a32ac2SJussi Kivilinna if (diff_dst) 701d8a32ac2SJussi Kivilinna sgout[k - 1].length += authsize; 7028ec25c51SHoria Geanta else 7038ec25c51SHoria Geanta sg[k - 1].length += authsize; 704da7f033dSHerbert Xu } 705da7f033dSHerbert Xu 706da7f033dSHerbert Xu sg_init_table(asg, template[i].anp); 707fd57f22aSHerbert Xu ret = -EINVAL; 708da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].anp; k++) { 709fd57f22aSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 710fd57f22aSHerbert Xu template[i].atap[k] > PAGE_SIZE)) 711fd57f22aSHerbert Xu goto out; 712da7f033dSHerbert Xu sg_set_buf(&asg[k], 713da7f033dSHerbert Xu memcpy(axbuf[IDX[k] >> PAGE_SHIFT] + 714da7f033dSHerbert Xu offset_in_page(IDX[k]), 715da7f033dSHerbert Xu template[i].assoc + temp, 716da7f033dSHerbert Xu template[i].atap[k]), 717da7f033dSHerbert Xu template[i].atap[k]); 718da7f033dSHerbert Xu temp += template[i].atap[k]; 719da7f033dSHerbert Xu } 720da7f033dSHerbert Xu 721d8a32ac2SJussi Kivilinna aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 722da7f033dSHerbert Xu template[i].ilen, 723da7f033dSHerbert Xu iv); 724da7f033dSHerbert Xu 725da7f033dSHerbert Xu aead_request_set_assoc(req, asg, template[i].alen); 726da7f033dSHerbert Xu 727da7f033dSHerbert Xu ret = enc ? 728da7f033dSHerbert Xu crypto_aead_encrypt(req) : 729da7f033dSHerbert Xu crypto_aead_decrypt(req); 730da7f033dSHerbert Xu 731da7f033dSHerbert Xu switch (ret) { 732da7f033dSHerbert Xu case 0: 733e44a1b44SJarod Wilson if (template[i].novrfy) { 734e44a1b44SJarod Wilson /* verification was supposed to fail */ 735d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n", 736d8a32ac2SJussi Kivilinna d, e, j, algo); 737e44a1b44SJarod Wilson /* so really, we got a bad message */ 738e44a1b44SJarod Wilson ret = -EBADMSG; 739e44a1b44SJarod Wilson goto out; 740e44a1b44SJarod Wilson } 741da7f033dSHerbert Xu break; 742da7f033dSHerbert Xu case -EINPROGRESS: 743da7f033dSHerbert Xu case -EBUSY: 744da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 745da7f033dSHerbert Xu &result.completion); 746da7f033dSHerbert Xu if (!ret && !(ret = result.err)) { 74716735d02SWolfram Sang reinit_completion(&result.completion); 748da7f033dSHerbert Xu break; 749da7f033dSHerbert Xu } 750e44a1b44SJarod Wilson case -EBADMSG: 751e44a1b44SJarod Wilson if (template[i].novrfy) 752e44a1b44SJarod Wilson /* verification failure was expected */ 753e44a1b44SJarod Wilson continue; 754da7f033dSHerbert Xu /* fall through */ 755da7f033dSHerbert Xu default: 756d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n", 757d8a32ac2SJussi Kivilinna d, e, j, algo, -ret); 758da7f033dSHerbert Xu goto out; 759da7f033dSHerbert Xu } 760da7f033dSHerbert Xu 761da7f033dSHerbert Xu ret = -EINVAL; 762da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 763d8a32ac2SJussi Kivilinna if (diff_dst) 764d8a32ac2SJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 765d8a32ac2SJussi Kivilinna offset_in_page(IDX[k]); 766d8a32ac2SJussi Kivilinna else 767da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 768da7f033dSHerbert Xu offset_in_page(IDX[k]); 769da7f033dSHerbert Xu 770da7f033dSHerbert Xu n = template[i].tap[k]; 771da7f033dSHerbert Xu if (k == template[i].np - 1) 772da7f033dSHerbert Xu n += enc ? authsize : -authsize; 773da7f033dSHerbert Xu 774da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, n)) { 775d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n", 776d8a32ac2SJussi Kivilinna d, j, e, k, algo); 777da7f033dSHerbert Xu hexdump(q, n); 778da7f033dSHerbert Xu goto out; 779da7f033dSHerbert Xu } 780da7f033dSHerbert Xu 781da7f033dSHerbert Xu q += n; 782da7f033dSHerbert Xu if (k == template[i].np - 1 && !enc) { 783d8a32ac2SJussi Kivilinna if (!diff_dst && 784d8a32ac2SJussi Kivilinna memcmp(q, template[i].input + 785da7f033dSHerbert Xu temp + n, authsize)) 786da7f033dSHerbert Xu n = authsize; 787da7f033dSHerbert Xu else 788da7f033dSHerbert Xu n = 0; 789da7f033dSHerbert Xu } else { 790da7f033dSHerbert Xu for (n = 0; offset_in_page(q + n) && 791da7f033dSHerbert Xu q[n]; n++) 792da7f033dSHerbert Xu ; 793da7f033dSHerbert Xu } 794da7f033dSHerbert Xu if (n) { 795d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n", 796d8a32ac2SJussi Kivilinna d, j, e, k, algo, n); 797da7f033dSHerbert Xu hexdump(q, n); 798da7f033dSHerbert Xu goto out; 799da7f033dSHerbert Xu } 800da7f033dSHerbert Xu 801da7f033dSHerbert Xu temp += template[i].tap[k]; 802da7f033dSHerbert Xu } 803da7f033dSHerbert Xu } 804da7f033dSHerbert Xu } 805da7f033dSHerbert Xu 806da7f033dSHerbert Xu ret = 0; 807da7f033dSHerbert Xu 808da7f033dSHerbert Xu out: 809da7f033dSHerbert Xu aead_request_free(req); 810d8a32ac2SJussi Kivilinna kfree(sg); 811d8a32ac2SJussi Kivilinna out_nosg: 812d8a32ac2SJussi Kivilinna if (diff_dst) 813d8a32ac2SJussi Kivilinna testmgr_free_buf(xoutbuf); 814d8a32ac2SJussi Kivilinna out_nooutbuf: 815f8b0d4d0SHerbert Xu testmgr_free_buf(axbuf); 816f8b0d4d0SHerbert Xu out_noaxbuf: 817f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 818f8b0d4d0SHerbert Xu out_noxbuf: 81929b77e5dSHoria Geanta kfree(key); 8209bac019dSTadeusz Struk kfree(iv); 821da7f033dSHerbert Xu return ret; 822da7f033dSHerbert Xu } 823da7f033dSHerbert Xu 824d8a32ac2SJussi Kivilinna static int test_aead(struct crypto_aead *tfm, int enc, 825d8a32ac2SJussi Kivilinna struct aead_testvec *template, unsigned int tcount) 826d8a32ac2SJussi Kivilinna { 82758dcf548SJussi Kivilinna unsigned int alignmask; 828d8a32ac2SJussi Kivilinna int ret; 829d8a32ac2SJussi Kivilinna 830d8a32ac2SJussi Kivilinna /* test 'dst == src' case */ 83158dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, false, 0); 832d8a32ac2SJussi Kivilinna if (ret) 833d8a32ac2SJussi Kivilinna return ret; 834d8a32ac2SJussi Kivilinna 835d8a32ac2SJussi Kivilinna /* test 'dst != src' case */ 83658dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 0); 83758dcf548SJussi Kivilinna if (ret) 83858dcf548SJussi Kivilinna return ret; 83958dcf548SJussi Kivilinna 84058dcf548SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 84158dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 1); 84258dcf548SJussi Kivilinna if (ret) 84358dcf548SJussi Kivilinna return ret; 84458dcf548SJussi Kivilinna 84558dcf548SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 84658dcf548SJussi Kivilinna if (alignmask) { 84758dcf548SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 84858dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 84958dcf548SJussi Kivilinna alignmask + 1); 85058dcf548SJussi Kivilinna if (ret) 85158dcf548SJussi Kivilinna return ret; 85258dcf548SJussi Kivilinna } 85358dcf548SJussi Kivilinna 85458dcf548SJussi Kivilinna return 0; 855d8a32ac2SJussi Kivilinna } 856d8a32ac2SJussi Kivilinna 8571aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc, 8581aa4ecd9SHerbert Xu struct cipher_testvec *template, unsigned int tcount) 8591aa4ecd9SHerbert Xu { 8601aa4ecd9SHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm)); 8611aa4ecd9SHerbert Xu unsigned int i, j, k; 8621aa4ecd9SHerbert Xu char *q; 8631aa4ecd9SHerbert Xu const char *e; 8641aa4ecd9SHerbert Xu void *data; 865f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 866f8b0d4d0SHerbert Xu int ret = -ENOMEM; 867f8b0d4d0SHerbert Xu 868f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 869f8b0d4d0SHerbert Xu goto out_nobuf; 8701aa4ecd9SHerbert Xu 8711aa4ecd9SHerbert Xu if (enc == ENCRYPT) 8721aa4ecd9SHerbert Xu e = "encryption"; 8731aa4ecd9SHerbert Xu else 8741aa4ecd9SHerbert Xu e = "decryption"; 8751aa4ecd9SHerbert Xu 8761aa4ecd9SHerbert Xu j = 0; 8771aa4ecd9SHerbert Xu for (i = 0; i < tcount; i++) { 8781aa4ecd9SHerbert Xu if (template[i].np) 8791aa4ecd9SHerbert Xu continue; 8801aa4ecd9SHerbert Xu 8811aa4ecd9SHerbert Xu j++; 8821aa4ecd9SHerbert Xu 883fd57f22aSHerbert Xu ret = -EINVAL; 884fd57f22aSHerbert Xu if (WARN_ON(template[i].ilen > PAGE_SIZE)) 885fd57f22aSHerbert Xu goto out; 886fd57f22aSHerbert Xu 8871aa4ecd9SHerbert Xu data = xbuf[0]; 8881aa4ecd9SHerbert Xu memcpy(data, template[i].input, template[i].ilen); 8891aa4ecd9SHerbert Xu 8901aa4ecd9SHerbert Xu crypto_cipher_clear_flags(tfm, ~0); 8911aa4ecd9SHerbert Xu if (template[i].wk) 8921aa4ecd9SHerbert Xu crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 8931aa4ecd9SHerbert Xu 8941aa4ecd9SHerbert Xu ret = crypto_cipher_setkey(tfm, template[i].key, 8951aa4ecd9SHerbert Xu template[i].klen); 8961aa4ecd9SHerbert Xu if (!ret == template[i].fail) { 8971aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: setkey failed " 8981aa4ecd9SHerbert Xu "on test %d for %s: flags=%x\n", j, 8991aa4ecd9SHerbert Xu algo, crypto_cipher_get_flags(tfm)); 9001aa4ecd9SHerbert Xu goto out; 9011aa4ecd9SHerbert Xu } else if (ret) 9021aa4ecd9SHerbert Xu continue; 9031aa4ecd9SHerbert Xu 9041aa4ecd9SHerbert Xu for (k = 0; k < template[i].ilen; 9051aa4ecd9SHerbert Xu k += crypto_cipher_blocksize(tfm)) { 9061aa4ecd9SHerbert Xu if (enc) 9071aa4ecd9SHerbert Xu crypto_cipher_encrypt_one(tfm, data + k, 9081aa4ecd9SHerbert Xu data + k); 9091aa4ecd9SHerbert Xu else 9101aa4ecd9SHerbert Xu crypto_cipher_decrypt_one(tfm, data + k, 9111aa4ecd9SHerbert Xu data + k); 9121aa4ecd9SHerbert Xu } 9131aa4ecd9SHerbert Xu 9141aa4ecd9SHerbert Xu q = data; 9151aa4ecd9SHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 9161aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: Test %d failed " 9171aa4ecd9SHerbert Xu "on %s for %s\n", j, e, algo); 9181aa4ecd9SHerbert Xu hexdump(q, template[i].rlen); 9191aa4ecd9SHerbert Xu ret = -EINVAL; 9201aa4ecd9SHerbert Xu goto out; 9211aa4ecd9SHerbert Xu } 9221aa4ecd9SHerbert Xu } 9231aa4ecd9SHerbert Xu 9241aa4ecd9SHerbert Xu ret = 0; 9251aa4ecd9SHerbert Xu 9261aa4ecd9SHerbert Xu out: 927f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 928f8b0d4d0SHerbert Xu out_nobuf: 9291aa4ecd9SHerbert Xu return ret; 9301aa4ecd9SHerbert Xu } 9311aa4ecd9SHerbert Xu 93208d6af8cSJussi Kivilinna static int __test_skcipher(struct crypto_ablkcipher *tfm, int enc, 93308d6af8cSJussi Kivilinna struct cipher_testvec *template, unsigned int tcount, 9343a338f20SJussi Kivilinna const bool diff_dst, const int align_offset) 935da7f033dSHerbert Xu { 936da7f033dSHerbert Xu const char *algo = 937da7f033dSHerbert Xu crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm)); 938da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 939da7f033dSHerbert Xu char *q; 940da7f033dSHerbert Xu struct ablkcipher_request *req; 941da7f033dSHerbert Xu struct scatterlist sg[8]; 94208d6af8cSJussi Kivilinna struct scatterlist sgout[8]; 94308d6af8cSJussi Kivilinna const char *e, *d; 944da7f033dSHerbert Xu struct tcrypt_result result; 945da7f033dSHerbert Xu void *data; 946da7f033dSHerbert Xu char iv[MAX_IVLEN]; 947f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 94808d6af8cSJussi Kivilinna char *xoutbuf[XBUFSIZE]; 949f8b0d4d0SHerbert Xu int ret = -ENOMEM; 950f8b0d4d0SHerbert Xu 951f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 952f8b0d4d0SHerbert Xu goto out_nobuf; 953da7f033dSHerbert Xu 95408d6af8cSJussi Kivilinna if (diff_dst && testmgr_alloc_buf(xoutbuf)) 95508d6af8cSJussi Kivilinna goto out_nooutbuf; 95608d6af8cSJussi Kivilinna 95708d6af8cSJussi Kivilinna if (diff_dst) 95808d6af8cSJussi Kivilinna d = "-ddst"; 95908d6af8cSJussi Kivilinna else 96008d6af8cSJussi Kivilinna d = ""; 96108d6af8cSJussi Kivilinna 962da7f033dSHerbert Xu if (enc == ENCRYPT) 963da7f033dSHerbert Xu e = "encryption"; 964da7f033dSHerbert Xu else 965da7f033dSHerbert Xu e = "decryption"; 966da7f033dSHerbert Xu 967da7f033dSHerbert Xu init_completion(&result.completion); 968da7f033dSHerbert Xu 969da7f033dSHerbert Xu req = ablkcipher_request_alloc(tfm, GFP_KERNEL); 970da7f033dSHerbert Xu if (!req) { 97108d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Failed to allocate request for %s\n", 97208d6af8cSJussi Kivilinna d, algo); 973da7f033dSHerbert Xu goto out; 974da7f033dSHerbert Xu } 975da7f033dSHerbert Xu 976da7f033dSHerbert Xu ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 977da7f033dSHerbert Xu tcrypt_complete, &result); 978da7f033dSHerbert Xu 979da7f033dSHerbert Xu j = 0; 980da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 981da7f033dSHerbert Xu if (template[i].iv) 982da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 983da7f033dSHerbert Xu else 984da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 985da7f033dSHerbert Xu 986f44d83d1SJussi Kivilinna if (!(template[i].np) || (template[i].also_non_np)) { 987da7f033dSHerbert Xu j++; 988da7f033dSHerbert Xu 989fd57f22aSHerbert Xu ret = -EINVAL; 9903a338f20SJussi Kivilinna if (WARN_ON(align_offset + template[i].ilen > 9913a338f20SJussi Kivilinna PAGE_SIZE)) 992fd57f22aSHerbert Xu goto out; 993fd57f22aSHerbert Xu 994da7f033dSHerbert Xu data = xbuf[0]; 9953a338f20SJussi Kivilinna data += align_offset; 996da7f033dSHerbert Xu memcpy(data, template[i].input, template[i].ilen); 997da7f033dSHerbert Xu 998da7f033dSHerbert Xu crypto_ablkcipher_clear_flags(tfm, ~0); 999da7f033dSHerbert Xu if (template[i].wk) 1000da7f033dSHerbert Xu crypto_ablkcipher_set_flags( 1001da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 1002da7f033dSHerbert Xu 1003da7f033dSHerbert Xu ret = crypto_ablkcipher_setkey(tfm, template[i].key, 1004da7f033dSHerbert Xu template[i].klen); 1005da7f033dSHerbert Xu if (!ret == template[i].fail) { 100608d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n", 100708d6af8cSJussi Kivilinna d, j, algo, 100808d6af8cSJussi Kivilinna crypto_ablkcipher_get_flags(tfm)); 1009da7f033dSHerbert Xu goto out; 1010da7f033dSHerbert Xu } else if (ret) 1011da7f033dSHerbert Xu continue; 1012da7f033dSHerbert Xu 1013da7f033dSHerbert Xu sg_init_one(&sg[0], data, template[i].ilen); 101408d6af8cSJussi Kivilinna if (diff_dst) { 101508d6af8cSJussi Kivilinna data = xoutbuf[0]; 10163a338f20SJussi Kivilinna data += align_offset; 101708d6af8cSJussi Kivilinna sg_init_one(&sgout[0], data, template[i].ilen); 101808d6af8cSJussi Kivilinna } 1019da7f033dSHerbert Xu 102008d6af8cSJussi Kivilinna ablkcipher_request_set_crypt(req, sg, 102108d6af8cSJussi Kivilinna (diff_dst) ? sgout : sg, 1022da7f033dSHerbert Xu template[i].ilen, iv); 1023da7f033dSHerbert Xu ret = enc ? 1024da7f033dSHerbert Xu crypto_ablkcipher_encrypt(req) : 1025da7f033dSHerbert Xu crypto_ablkcipher_decrypt(req); 1026da7f033dSHerbert Xu 1027da7f033dSHerbert Xu switch (ret) { 1028da7f033dSHerbert Xu case 0: 1029da7f033dSHerbert Xu break; 1030da7f033dSHerbert Xu case -EINPROGRESS: 1031da7f033dSHerbert Xu case -EBUSY: 1032da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 1033da7f033dSHerbert Xu &result.completion); 1034da7f033dSHerbert Xu if (!ret && !((ret = result.err))) { 103516735d02SWolfram Sang reinit_completion(&result.completion); 1036da7f033dSHerbert Xu break; 1037da7f033dSHerbert Xu } 1038da7f033dSHerbert Xu /* fall through */ 1039da7f033dSHerbert Xu default: 104008d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n", 104108d6af8cSJussi Kivilinna d, e, j, algo, -ret); 1042da7f033dSHerbert Xu goto out; 1043da7f033dSHerbert Xu } 1044da7f033dSHerbert Xu 1045da7f033dSHerbert Xu q = data; 1046da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 104708d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Test %d failed on %s for %s\n", 104808d6af8cSJussi Kivilinna d, j, e, algo); 1049da7f033dSHerbert Xu hexdump(q, template[i].rlen); 1050da7f033dSHerbert Xu ret = -EINVAL; 1051da7f033dSHerbert Xu goto out; 1052da7f033dSHerbert Xu } 1053da7f033dSHerbert Xu } 1054da7f033dSHerbert Xu } 1055da7f033dSHerbert Xu 1056da7f033dSHerbert Xu j = 0; 1057da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 10583a338f20SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 10593a338f20SJussi Kivilinna if (align_offset != 0) 10603a338f20SJussi Kivilinna break; 1061da7f033dSHerbert Xu 1062da7f033dSHerbert Xu if (template[i].iv) 1063da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 1064da7f033dSHerbert Xu else 1065da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 1066da7f033dSHerbert Xu 1067da7f033dSHerbert Xu if (template[i].np) { 1068da7f033dSHerbert Xu j++; 1069da7f033dSHerbert Xu 1070da7f033dSHerbert Xu crypto_ablkcipher_clear_flags(tfm, ~0); 1071da7f033dSHerbert Xu if (template[i].wk) 1072da7f033dSHerbert Xu crypto_ablkcipher_set_flags( 1073da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 1074da7f033dSHerbert Xu 1075da7f033dSHerbert Xu ret = crypto_ablkcipher_setkey(tfm, template[i].key, 1076da7f033dSHerbert Xu template[i].klen); 1077da7f033dSHerbert Xu if (!ret == template[i].fail) { 107808d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n", 107908d6af8cSJussi Kivilinna d, j, algo, 1080da7f033dSHerbert Xu crypto_ablkcipher_get_flags(tfm)); 1081da7f033dSHerbert Xu goto out; 1082da7f033dSHerbert Xu } else if (ret) 1083da7f033dSHerbert Xu continue; 1084da7f033dSHerbert Xu 1085da7f033dSHerbert Xu temp = 0; 1086da7f033dSHerbert Xu ret = -EINVAL; 1087da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 108808d6af8cSJussi Kivilinna if (diff_dst) 108908d6af8cSJussi Kivilinna sg_init_table(sgout, template[i].np); 1090da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 1091da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 1092da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 1093da7f033dSHerbert Xu goto out; 1094da7f033dSHerbert Xu 1095da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 1096da7f033dSHerbert Xu offset_in_page(IDX[k]); 1097da7f033dSHerbert Xu 1098da7f033dSHerbert Xu memcpy(q, template[i].input + temp, 1099da7f033dSHerbert Xu template[i].tap[k]); 1100da7f033dSHerbert Xu 1101da7f033dSHerbert Xu if (offset_in_page(q) + template[i].tap[k] < 1102da7f033dSHerbert Xu PAGE_SIZE) 1103da7f033dSHerbert Xu q[template[i].tap[k]] = 0; 1104da7f033dSHerbert Xu 1105da7f033dSHerbert Xu sg_set_buf(&sg[k], q, template[i].tap[k]); 110608d6af8cSJussi Kivilinna if (diff_dst) { 110708d6af8cSJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 110808d6af8cSJussi Kivilinna offset_in_page(IDX[k]); 110908d6af8cSJussi Kivilinna 111008d6af8cSJussi Kivilinna sg_set_buf(&sgout[k], q, 111108d6af8cSJussi Kivilinna template[i].tap[k]); 111208d6af8cSJussi Kivilinna 111308d6af8cSJussi Kivilinna memset(q, 0, template[i].tap[k]); 111408d6af8cSJussi Kivilinna if (offset_in_page(q) + 111508d6af8cSJussi Kivilinna template[i].tap[k] < PAGE_SIZE) 111608d6af8cSJussi Kivilinna q[template[i].tap[k]] = 0; 111708d6af8cSJussi Kivilinna } 1118da7f033dSHerbert Xu 1119da7f033dSHerbert Xu temp += template[i].tap[k]; 1120da7f033dSHerbert Xu } 1121da7f033dSHerbert Xu 112208d6af8cSJussi Kivilinna ablkcipher_request_set_crypt(req, sg, 112308d6af8cSJussi Kivilinna (diff_dst) ? sgout : sg, 1124da7f033dSHerbert Xu template[i].ilen, iv); 1125da7f033dSHerbert Xu 1126da7f033dSHerbert Xu ret = enc ? 1127da7f033dSHerbert Xu crypto_ablkcipher_encrypt(req) : 1128da7f033dSHerbert Xu crypto_ablkcipher_decrypt(req); 1129da7f033dSHerbert Xu 1130da7f033dSHerbert Xu switch (ret) { 1131da7f033dSHerbert Xu case 0: 1132da7f033dSHerbert Xu break; 1133da7f033dSHerbert Xu case -EINPROGRESS: 1134da7f033dSHerbert Xu case -EBUSY: 1135da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 1136da7f033dSHerbert Xu &result.completion); 1137da7f033dSHerbert Xu if (!ret && !((ret = result.err))) { 113816735d02SWolfram Sang reinit_completion(&result.completion); 1139da7f033dSHerbert Xu break; 1140da7f033dSHerbert Xu } 1141da7f033dSHerbert Xu /* fall through */ 1142da7f033dSHerbert Xu default: 114308d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n", 114408d6af8cSJussi Kivilinna d, e, j, algo, -ret); 1145da7f033dSHerbert Xu goto out; 1146da7f033dSHerbert Xu } 1147da7f033dSHerbert Xu 1148da7f033dSHerbert Xu temp = 0; 1149da7f033dSHerbert Xu ret = -EINVAL; 1150da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 115108d6af8cSJussi Kivilinna if (diff_dst) 115208d6af8cSJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 115308d6af8cSJussi Kivilinna offset_in_page(IDX[k]); 115408d6af8cSJussi Kivilinna else 1155da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 1156da7f033dSHerbert Xu offset_in_page(IDX[k]); 1157da7f033dSHerbert Xu 1158da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, 1159da7f033dSHerbert Xu template[i].tap[k])) { 116008d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n", 116108d6af8cSJussi Kivilinna d, j, e, k, algo); 1162da7f033dSHerbert Xu hexdump(q, template[i].tap[k]); 1163da7f033dSHerbert Xu goto out; 1164da7f033dSHerbert Xu } 1165da7f033dSHerbert Xu 1166da7f033dSHerbert Xu q += template[i].tap[k]; 1167da7f033dSHerbert Xu for (n = 0; offset_in_page(q + n) && q[n]; n++) 1168da7f033dSHerbert Xu ; 1169da7f033dSHerbert Xu if (n) { 117008d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n", 117108d6af8cSJussi Kivilinna d, j, e, k, algo, n); 1172da7f033dSHerbert Xu hexdump(q, n); 1173da7f033dSHerbert Xu goto out; 1174da7f033dSHerbert Xu } 1175da7f033dSHerbert Xu temp += template[i].tap[k]; 1176da7f033dSHerbert Xu } 1177da7f033dSHerbert Xu } 1178da7f033dSHerbert Xu } 1179da7f033dSHerbert Xu 1180da7f033dSHerbert Xu ret = 0; 1181da7f033dSHerbert Xu 1182da7f033dSHerbert Xu out: 1183da7f033dSHerbert Xu ablkcipher_request_free(req); 118408d6af8cSJussi Kivilinna if (diff_dst) 118508d6af8cSJussi Kivilinna testmgr_free_buf(xoutbuf); 118608d6af8cSJussi Kivilinna out_nooutbuf: 1187f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 1188f8b0d4d0SHerbert Xu out_nobuf: 1189da7f033dSHerbert Xu return ret; 1190da7f033dSHerbert Xu } 1191da7f033dSHerbert Xu 119208d6af8cSJussi Kivilinna static int test_skcipher(struct crypto_ablkcipher *tfm, int enc, 119308d6af8cSJussi Kivilinna struct cipher_testvec *template, unsigned int tcount) 119408d6af8cSJussi Kivilinna { 11953a338f20SJussi Kivilinna unsigned int alignmask; 119608d6af8cSJussi Kivilinna int ret; 119708d6af8cSJussi Kivilinna 119808d6af8cSJussi Kivilinna /* test 'dst == src' case */ 11993a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, false, 0); 120008d6af8cSJussi Kivilinna if (ret) 120108d6af8cSJussi Kivilinna return ret; 120208d6af8cSJussi Kivilinna 120308d6af8cSJussi Kivilinna /* test 'dst != src' case */ 12043a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 0); 12053a338f20SJussi Kivilinna if (ret) 12063a338f20SJussi Kivilinna return ret; 12073a338f20SJussi Kivilinna 12083a338f20SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 12093a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 1); 12103a338f20SJussi Kivilinna if (ret) 12113a338f20SJussi Kivilinna return ret; 12123a338f20SJussi Kivilinna 12133a338f20SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 12143a338f20SJussi Kivilinna if (alignmask) { 12153a338f20SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 12163a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 12173a338f20SJussi Kivilinna alignmask + 1); 12183a338f20SJussi Kivilinna if (ret) 12193a338f20SJussi Kivilinna return ret; 12203a338f20SJussi Kivilinna } 12213a338f20SJussi Kivilinna 12223a338f20SJussi Kivilinna return 0; 122308d6af8cSJussi Kivilinna } 122408d6af8cSJussi Kivilinna 1225da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate, 1226da7f033dSHerbert Xu struct comp_testvec *dtemplate, int ctcount, int dtcount) 1227da7f033dSHerbert Xu { 1228da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm)); 1229da7f033dSHerbert Xu unsigned int i; 1230da7f033dSHerbert Xu char result[COMP_BUF_SIZE]; 1231da7f033dSHerbert Xu int ret; 1232da7f033dSHerbert Xu 1233da7f033dSHerbert Xu for (i = 0; i < ctcount; i++) { 1234c79cf910SGeert Uytterhoeven int ilen; 1235c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 1236da7f033dSHerbert Xu 1237da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 1238da7f033dSHerbert Xu 1239da7f033dSHerbert Xu ilen = ctemplate[i].inlen; 1240da7f033dSHerbert Xu ret = crypto_comp_compress(tfm, ctemplate[i].input, 1241da7f033dSHerbert Xu ilen, result, &dlen); 1242da7f033dSHerbert Xu if (ret) { 1243da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: compression failed " 1244da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1245da7f033dSHerbert Xu -ret); 1246da7f033dSHerbert Xu goto out; 1247da7f033dSHerbert Xu } 1248da7f033dSHerbert Xu 1249b812eb00SGeert Uytterhoeven if (dlen != ctemplate[i].outlen) { 1250b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Compression test %d " 1251b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1252b812eb00SGeert Uytterhoeven dlen); 1253b812eb00SGeert Uytterhoeven ret = -EINVAL; 1254b812eb00SGeert Uytterhoeven goto out; 1255b812eb00SGeert Uytterhoeven } 1256b812eb00SGeert Uytterhoeven 1257da7f033dSHerbert Xu if (memcmp(result, ctemplate[i].output, dlen)) { 1258da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Compression test %d " 1259da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 1260da7f033dSHerbert Xu hexdump(result, dlen); 1261da7f033dSHerbert Xu ret = -EINVAL; 1262da7f033dSHerbert Xu goto out; 1263da7f033dSHerbert Xu } 1264da7f033dSHerbert Xu } 1265da7f033dSHerbert Xu 1266da7f033dSHerbert Xu for (i = 0; i < dtcount; i++) { 1267c79cf910SGeert Uytterhoeven int ilen; 1268c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 1269da7f033dSHerbert Xu 1270da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 1271da7f033dSHerbert Xu 1272da7f033dSHerbert Xu ilen = dtemplate[i].inlen; 1273da7f033dSHerbert Xu ret = crypto_comp_decompress(tfm, dtemplate[i].input, 1274da7f033dSHerbert Xu ilen, result, &dlen); 1275da7f033dSHerbert Xu if (ret) { 1276da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: decompression failed " 1277da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1278da7f033dSHerbert Xu -ret); 1279da7f033dSHerbert Xu goto out; 1280da7f033dSHerbert Xu } 1281da7f033dSHerbert Xu 1282b812eb00SGeert Uytterhoeven if (dlen != dtemplate[i].outlen) { 1283b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Decompression test %d " 1284b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1285b812eb00SGeert Uytterhoeven dlen); 1286b812eb00SGeert Uytterhoeven ret = -EINVAL; 1287b812eb00SGeert Uytterhoeven goto out; 1288b812eb00SGeert Uytterhoeven } 1289b812eb00SGeert Uytterhoeven 1290da7f033dSHerbert Xu if (memcmp(result, dtemplate[i].output, dlen)) { 1291da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Decompression test %d " 1292da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 1293da7f033dSHerbert Xu hexdump(result, dlen); 1294da7f033dSHerbert Xu ret = -EINVAL; 1295da7f033dSHerbert Xu goto out; 1296da7f033dSHerbert Xu } 1297da7f033dSHerbert Xu } 1298da7f033dSHerbert Xu 1299da7f033dSHerbert Xu ret = 0; 1300da7f033dSHerbert Xu 1301da7f033dSHerbert Xu out: 1302da7f033dSHerbert Xu return ret; 1303da7f033dSHerbert Xu } 1304da7f033dSHerbert Xu 13058064efb8SGeert Uytterhoeven static int test_pcomp(struct crypto_pcomp *tfm, 13068064efb8SGeert Uytterhoeven struct pcomp_testvec *ctemplate, 13078064efb8SGeert Uytterhoeven struct pcomp_testvec *dtemplate, int ctcount, 13088064efb8SGeert Uytterhoeven int dtcount) 13098064efb8SGeert Uytterhoeven { 13108064efb8SGeert Uytterhoeven const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm)); 13118064efb8SGeert Uytterhoeven unsigned int i; 13128064efb8SGeert Uytterhoeven char result[COMP_BUF_SIZE]; 13133ce858cbSGeert Uytterhoeven int res; 13148064efb8SGeert Uytterhoeven 13158064efb8SGeert Uytterhoeven for (i = 0; i < ctcount; i++) { 13168064efb8SGeert Uytterhoeven struct comp_request req; 13173ce858cbSGeert Uytterhoeven unsigned int produced = 0; 13188064efb8SGeert Uytterhoeven 13193ce858cbSGeert Uytterhoeven res = crypto_compress_setup(tfm, ctemplate[i].params, 13208064efb8SGeert Uytterhoeven ctemplate[i].paramsize); 13213ce858cbSGeert Uytterhoeven if (res) { 13228064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression setup failed on test " 13233ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 13243ce858cbSGeert Uytterhoeven return res; 13258064efb8SGeert Uytterhoeven } 13268064efb8SGeert Uytterhoeven 13273ce858cbSGeert Uytterhoeven res = crypto_compress_init(tfm); 13283ce858cbSGeert Uytterhoeven if (res) { 13298064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression init failed on test " 13303ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 13313ce858cbSGeert Uytterhoeven return res; 13328064efb8SGeert Uytterhoeven } 13338064efb8SGeert Uytterhoeven 13348064efb8SGeert Uytterhoeven memset(result, 0, sizeof(result)); 13358064efb8SGeert Uytterhoeven 13368064efb8SGeert Uytterhoeven req.next_in = ctemplate[i].input; 13378064efb8SGeert Uytterhoeven req.avail_in = ctemplate[i].inlen / 2; 13388064efb8SGeert Uytterhoeven req.next_out = result; 13398064efb8SGeert Uytterhoeven req.avail_out = ctemplate[i].outlen / 2; 13408064efb8SGeert Uytterhoeven 13413ce858cbSGeert Uytterhoeven res = crypto_compress_update(tfm, &req); 13423ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 13438064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression update failed on test " 13443ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 13453ce858cbSGeert Uytterhoeven return res; 13468064efb8SGeert Uytterhoeven } 13473ce858cbSGeert Uytterhoeven if (res > 0) 13483ce858cbSGeert Uytterhoeven produced += res; 13498064efb8SGeert Uytterhoeven 13508064efb8SGeert Uytterhoeven /* Add remaining input data */ 13518064efb8SGeert Uytterhoeven req.avail_in += (ctemplate[i].inlen + 1) / 2; 13528064efb8SGeert Uytterhoeven 13533ce858cbSGeert Uytterhoeven res = crypto_compress_update(tfm, &req); 13543ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 13558064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression update failed on test " 13563ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 13573ce858cbSGeert Uytterhoeven return res; 13588064efb8SGeert Uytterhoeven } 13593ce858cbSGeert Uytterhoeven if (res > 0) 13603ce858cbSGeert Uytterhoeven produced += res; 13618064efb8SGeert Uytterhoeven 13628064efb8SGeert Uytterhoeven /* Provide remaining output space */ 13638064efb8SGeert Uytterhoeven req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2; 13648064efb8SGeert Uytterhoeven 13653ce858cbSGeert Uytterhoeven res = crypto_compress_final(tfm, &req); 13663ce858cbSGeert Uytterhoeven if (res < 0) { 13678064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression final failed on test " 13683ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 13693ce858cbSGeert Uytterhoeven return res; 13708064efb8SGeert Uytterhoeven } 13713ce858cbSGeert Uytterhoeven produced += res; 13728064efb8SGeert Uytterhoeven 13738064efb8SGeert Uytterhoeven if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) { 13748064efb8SGeert Uytterhoeven pr_err("alg: comp: Compression test %d failed for %s: " 13758064efb8SGeert Uytterhoeven "output len = %d (expected %d)\n", i + 1, algo, 13768064efb8SGeert Uytterhoeven COMP_BUF_SIZE - req.avail_out, 13778064efb8SGeert Uytterhoeven ctemplate[i].outlen); 13788064efb8SGeert Uytterhoeven return -EINVAL; 13798064efb8SGeert Uytterhoeven } 13808064efb8SGeert Uytterhoeven 13813ce858cbSGeert Uytterhoeven if (produced != ctemplate[i].outlen) { 13823ce858cbSGeert Uytterhoeven pr_err("alg: comp: Compression test %d failed for %s: " 13833ce858cbSGeert Uytterhoeven "returned len = %u (expected %d)\n", i + 1, 13843ce858cbSGeert Uytterhoeven algo, produced, ctemplate[i].outlen); 13853ce858cbSGeert Uytterhoeven return -EINVAL; 13863ce858cbSGeert Uytterhoeven } 13873ce858cbSGeert Uytterhoeven 13888064efb8SGeert Uytterhoeven if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) { 13898064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Compression test %d failed for " 13908064efb8SGeert Uytterhoeven "%s\n", i + 1, algo); 13918064efb8SGeert Uytterhoeven hexdump(result, ctemplate[i].outlen); 13928064efb8SGeert Uytterhoeven return -EINVAL; 13938064efb8SGeert Uytterhoeven } 13948064efb8SGeert Uytterhoeven } 13958064efb8SGeert Uytterhoeven 13968064efb8SGeert Uytterhoeven for (i = 0; i < dtcount; i++) { 13978064efb8SGeert Uytterhoeven struct comp_request req; 13983ce858cbSGeert Uytterhoeven unsigned int produced = 0; 13998064efb8SGeert Uytterhoeven 14003ce858cbSGeert Uytterhoeven res = crypto_decompress_setup(tfm, dtemplate[i].params, 14018064efb8SGeert Uytterhoeven dtemplate[i].paramsize); 14023ce858cbSGeert Uytterhoeven if (res) { 14038064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression setup failed on " 14043ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 14053ce858cbSGeert Uytterhoeven return res; 14068064efb8SGeert Uytterhoeven } 14078064efb8SGeert Uytterhoeven 14083ce858cbSGeert Uytterhoeven res = crypto_decompress_init(tfm); 14093ce858cbSGeert Uytterhoeven if (res) { 14108064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression init failed on test " 14113ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 14123ce858cbSGeert Uytterhoeven return res; 14138064efb8SGeert Uytterhoeven } 14148064efb8SGeert Uytterhoeven 14158064efb8SGeert Uytterhoeven memset(result, 0, sizeof(result)); 14168064efb8SGeert Uytterhoeven 14178064efb8SGeert Uytterhoeven req.next_in = dtemplate[i].input; 14188064efb8SGeert Uytterhoeven req.avail_in = dtemplate[i].inlen / 2; 14198064efb8SGeert Uytterhoeven req.next_out = result; 14208064efb8SGeert Uytterhoeven req.avail_out = dtemplate[i].outlen / 2; 14218064efb8SGeert Uytterhoeven 14223ce858cbSGeert Uytterhoeven res = crypto_decompress_update(tfm, &req); 14233ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 14248064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression update failed on " 14253ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 14263ce858cbSGeert Uytterhoeven return res; 14278064efb8SGeert Uytterhoeven } 14283ce858cbSGeert Uytterhoeven if (res > 0) 14293ce858cbSGeert Uytterhoeven produced += res; 14308064efb8SGeert Uytterhoeven 14318064efb8SGeert Uytterhoeven /* Add remaining input data */ 14328064efb8SGeert Uytterhoeven req.avail_in += (dtemplate[i].inlen + 1) / 2; 14338064efb8SGeert Uytterhoeven 14343ce858cbSGeert Uytterhoeven res = crypto_decompress_update(tfm, &req); 14353ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 14368064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression update failed on " 14373ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 14383ce858cbSGeert Uytterhoeven return res; 14398064efb8SGeert Uytterhoeven } 14403ce858cbSGeert Uytterhoeven if (res > 0) 14413ce858cbSGeert Uytterhoeven produced += res; 14428064efb8SGeert Uytterhoeven 14438064efb8SGeert Uytterhoeven /* Provide remaining output space */ 14448064efb8SGeert Uytterhoeven req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2; 14458064efb8SGeert Uytterhoeven 14463ce858cbSGeert Uytterhoeven res = crypto_decompress_final(tfm, &req); 14473ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 14488064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression final failed on " 14493ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 14503ce858cbSGeert Uytterhoeven return res; 14518064efb8SGeert Uytterhoeven } 14523ce858cbSGeert Uytterhoeven if (res > 0) 14533ce858cbSGeert Uytterhoeven produced += res; 14548064efb8SGeert Uytterhoeven 14558064efb8SGeert Uytterhoeven if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) { 14568064efb8SGeert Uytterhoeven pr_err("alg: comp: Decompression test %d failed for " 14578064efb8SGeert Uytterhoeven "%s: output len = %d (expected %d)\n", i + 1, 14588064efb8SGeert Uytterhoeven algo, COMP_BUF_SIZE - req.avail_out, 14598064efb8SGeert Uytterhoeven dtemplate[i].outlen); 14608064efb8SGeert Uytterhoeven return -EINVAL; 14618064efb8SGeert Uytterhoeven } 14628064efb8SGeert Uytterhoeven 14633ce858cbSGeert Uytterhoeven if (produced != dtemplate[i].outlen) { 14643ce858cbSGeert Uytterhoeven pr_err("alg: comp: Decompression test %d failed for " 14653ce858cbSGeert Uytterhoeven "%s: returned len = %u (expected %d)\n", i + 1, 14663ce858cbSGeert Uytterhoeven algo, produced, dtemplate[i].outlen); 14673ce858cbSGeert Uytterhoeven return -EINVAL; 14683ce858cbSGeert Uytterhoeven } 14693ce858cbSGeert Uytterhoeven 14708064efb8SGeert Uytterhoeven if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) { 14718064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Decompression test %d failed for " 14728064efb8SGeert Uytterhoeven "%s\n", i + 1, algo); 14738064efb8SGeert Uytterhoeven hexdump(result, dtemplate[i].outlen); 14748064efb8SGeert Uytterhoeven return -EINVAL; 14758064efb8SGeert Uytterhoeven } 14768064efb8SGeert Uytterhoeven } 14778064efb8SGeert Uytterhoeven 14788064efb8SGeert Uytterhoeven return 0; 14798064efb8SGeert Uytterhoeven } 14808064efb8SGeert Uytterhoeven 14817647d6ceSJarod Wilson 14827647d6ceSJarod Wilson static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template, 14837647d6ceSJarod Wilson unsigned int tcount) 14847647d6ceSJarod Wilson { 14857647d6ceSJarod Wilson const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm)); 1486fa4ef8a6SFelipe Contreras int err = 0, i, j, seedsize; 14877647d6ceSJarod Wilson u8 *seed; 14887647d6ceSJarod Wilson char result[32]; 14897647d6ceSJarod Wilson 14907647d6ceSJarod Wilson seedsize = crypto_rng_seedsize(tfm); 14917647d6ceSJarod Wilson 14927647d6ceSJarod Wilson seed = kmalloc(seedsize, GFP_KERNEL); 14937647d6ceSJarod Wilson if (!seed) { 14947647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to allocate seed space " 14957647d6ceSJarod Wilson "for %s\n", algo); 14967647d6ceSJarod Wilson return -ENOMEM; 14977647d6ceSJarod Wilson } 14987647d6ceSJarod Wilson 14997647d6ceSJarod Wilson for (i = 0; i < tcount; i++) { 15007647d6ceSJarod Wilson memset(result, 0, 32); 15017647d6ceSJarod Wilson 15027647d6ceSJarod Wilson memcpy(seed, template[i].v, template[i].vlen); 15037647d6ceSJarod Wilson memcpy(seed + template[i].vlen, template[i].key, 15047647d6ceSJarod Wilson template[i].klen); 15057647d6ceSJarod Wilson memcpy(seed + template[i].vlen + template[i].klen, 15067647d6ceSJarod Wilson template[i].dt, template[i].dtlen); 15077647d6ceSJarod Wilson 15087647d6ceSJarod Wilson err = crypto_rng_reset(tfm, seed, seedsize); 15097647d6ceSJarod Wilson if (err) { 15107647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to reset rng " 15117647d6ceSJarod Wilson "for %s\n", algo); 15127647d6ceSJarod Wilson goto out; 15137647d6ceSJarod Wilson } 15147647d6ceSJarod Wilson 15157647d6ceSJarod Wilson for (j = 0; j < template[i].loops; j++) { 15167647d6ceSJarod Wilson err = crypto_rng_get_bytes(tfm, result, 15177647d6ceSJarod Wilson template[i].rlen); 15187647d6ceSJarod Wilson if (err != template[i].rlen) { 15197647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to obtain " 15207647d6ceSJarod Wilson "the correct amount of random data for " 15217647d6ceSJarod Wilson "%s (requested %d, got %d)\n", algo, 15227647d6ceSJarod Wilson template[i].rlen, err); 15237647d6ceSJarod Wilson goto out; 15247647d6ceSJarod Wilson } 15257647d6ceSJarod Wilson } 15267647d6ceSJarod Wilson 15277647d6ceSJarod Wilson err = memcmp(result, template[i].result, 15287647d6ceSJarod Wilson template[i].rlen); 15297647d6ceSJarod Wilson if (err) { 15307647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Test %d failed for %s\n", 15317647d6ceSJarod Wilson i, algo); 15327647d6ceSJarod Wilson hexdump(result, template[i].rlen); 15337647d6ceSJarod Wilson err = -EINVAL; 15347647d6ceSJarod Wilson goto out; 15357647d6ceSJarod Wilson } 15367647d6ceSJarod Wilson } 15377647d6ceSJarod Wilson 15387647d6ceSJarod Wilson out: 15397647d6ceSJarod Wilson kfree(seed); 15407647d6ceSJarod Wilson return err; 15417647d6ceSJarod Wilson } 15427647d6ceSJarod Wilson 1543da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver, 1544da7f033dSHerbert Xu u32 type, u32 mask) 1545da7f033dSHerbert Xu { 1546da7f033dSHerbert Xu struct crypto_aead *tfm; 1547da7f033dSHerbert Xu int err = 0; 1548da7f033dSHerbert Xu 1549da7f033dSHerbert Xu tfm = crypto_alloc_aead(driver, type, mask); 1550da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1551da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to load transform for %s: " 1552da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1553da7f033dSHerbert Xu return PTR_ERR(tfm); 1554da7f033dSHerbert Xu } 1555da7f033dSHerbert Xu 1556da7f033dSHerbert Xu if (desc->suite.aead.enc.vecs) { 1557da7f033dSHerbert Xu err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs, 1558da7f033dSHerbert Xu desc->suite.aead.enc.count); 1559da7f033dSHerbert Xu if (err) 1560da7f033dSHerbert Xu goto out; 1561da7f033dSHerbert Xu } 1562da7f033dSHerbert Xu 1563da7f033dSHerbert Xu if (!err && desc->suite.aead.dec.vecs) 1564da7f033dSHerbert Xu err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs, 1565da7f033dSHerbert Xu desc->suite.aead.dec.count); 1566da7f033dSHerbert Xu 1567da7f033dSHerbert Xu out: 1568da7f033dSHerbert Xu crypto_free_aead(tfm); 1569da7f033dSHerbert Xu return err; 1570da7f033dSHerbert Xu } 1571da7f033dSHerbert Xu 1572da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc, 1573da7f033dSHerbert Xu const char *driver, u32 type, u32 mask) 1574da7f033dSHerbert Xu { 15751aa4ecd9SHerbert Xu struct crypto_cipher *tfm; 1576da7f033dSHerbert Xu int err = 0; 1577da7f033dSHerbert Xu 15781aa4ecd9SHerbert Xu tfm = crypto_alloc_cipher(driver, type, mask); 1579da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1580da7f033dSHerbert Xu printk(KERN_ERR "alg: cipher: Failed to load transform for " 1581da7f033dSHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 1582da7f033dSHerbert Xu return PTR_ERR(tfm); 1583da7f033dSHerbert Xu } 1584da7f033dSHerbert Xu 1585da7f033dSHerbert Xu if (desc->suite.cipher.enc.vecs) { 1586da7f033dSHerbert Xu err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 1587da7f033dSHerbert Xu desc->suite.cipher.enc.count); 1588da7f033dSHerbert Xu if (err) 1589da7f033dSHerbert Xu goto out; 1590da7f033dSHerbert Xu } 1591da7f033dSHerbert Xu 1592da7f033dSHerbert Xu if (desc->suite.cipher.dec.vecs) 1593da7f033dSHerbert Xu err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 1594da7f033dSHerbert Xu desc->suite.cipher.dec.count); 1595da7f033dSHerbert Xu 1596da7f033dSHerbert Xu out: 15971aa4ecd9SHerbert Xu crypto_free_cipher(tfm); 15981aa4ecd9SHerbert Xu return err; 15991aa4ecd9SHerbert Xu } 16001aa4ecd9SHerbert Xu 16011aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc, 16021aa4ecd9SHerbert Xu const char *driver, u32 type, u32 mask) 16031aa4ecd9SHerbert Xu { 16041aa4ecd9SHerbert Xu struct crypto_ablkcipher *tfm; 16051aa4ecd9SHerbert Xu int err = 0; 16061aa4ecd9SHerbert Xu 16071aa4ecd9SHerbert Xu tfm = crypto_alloc_ablkcipher(driver, type, mask); 16081aa4ecd9SHerbert Xu if (IS_ERR(tfm)) { 16091aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Failed to load transform for " 16101aa4ecd9SHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 16111aa4ecd9SHerbert Xu return PTR_ERR(tfm); 16121aa4ecd9SHerbert Xu } 16131aa4ecd9SHerbert Xu 16141aa4ecd9SHerbert Xu if (desc->suite.cipher.enc.vecs) { 16151aa4ecd9SHerbert Xu err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 16161aa4ecd9SHerbert Xu desc->suite.cipher.enc.count); 16171aa4ecd9SHerbert Xu if (err) 16181aa4ecd9SHerbert Xu goto out; 16191aa4ecd9SHerbert Xu } 16201aa4ecd9SHerbert Xu 16211aa4ecd9SHerbert Xu if (desc->suite.cipher.dec.vecs) 16221aa4ecd9SHerbert Xu err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 16231aa4ecd9SHerbert Xu desc->suite.cipher.dec.count); 16241aa4ecd9SHerbert Xu 16251aa4ecd9SHerbert Xu out: 1626da7f033dSHerbert Xu crypto_free_ablkcipher(tfm); 1627da7f033dSHerbert Xu return err; 1628da7f033dSHerbert Xu } 1629da7f033dSHerbert Xu 1630da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver, 1631da7f033dSHerbert Xu u32 type, u32 mask) 1632da7f033dSHerbert Xu { 1633da7f033dSHerbert Xu struct crypto_comp *tfm; 1634da7f033dSHerbert Xu int err; 1635da7f033dSHerbert Xu 1636da7f033dSHerbert Xu tfm = crypto_alloc_comp(driver, type, mask); 1637da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1638da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Failed to load transform for %s: " 1639da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1640da7f033dSHerbert Xu return PTR_ERR(tfm); 1641da7f033dSHerbert Xu } 1642da7f033dSHerbert Xu 1643da7f033dSHerbert Xu err = test_comp(tfm, desc->suite.comp.comp.vecs, 1644da7f033dSHerbert Xu desc->suite.comp.decomp.vecs, 1645da7f033dSHerbert Xu desc->suite.comp.comp.count, 1646da7f033dSHerbert Xu desc->suite.comp.decomp.count); 1647da7f033dSHerbert Xu 1648da7f033dSHerbert Xu crypto_free_comp(tfm); 1649da7f033dSHerbert Xu return err; 1650da7f033dSHerbert Xu } 1651da7f033dSHerbert Xu 16528064efb8SGeert Uytterhoeven static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver, 16538064efb8SGeert Uytterhoeven u32 type, u32 mask) 16548064efb8SGeert Uytterhoeven { 16558064efb8SGeert Uytterhoeven struct crypto_pcomp *tfm; 16568064efb8SGeert Uytterhoeven int err; 16578064efb8SGeert Uytterhoeven 16588064efb8SGeert Uytterhoeven tfm = crypto_alloc_pcomp(driver, type, mask); 16598064efb8SGeert Uytterhoeven if (IS_ERR(tfm)) { 16608064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Failed to load transform for %s: %ld\n", 16618064efb8SGeert Uytterhoeven driver, PTR_ERR(tfm)); 16628064efb8SGeert Uytterhoeven return PTR_ERR(tfm); 16638064efb8SGeert Uytterhoeven } 16648064efb8SGeert Uytterhoeven 16658064efb8SGeert Uytterhoeven err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs, 16668064efb8SGeert Uytterhoeven desc->suite.pcomp.decomp.vecs, 16678064efb8SGeert Uytterhoeven desc->suite.pcomp.comp.count, 16688064efb8SGeert Uytterhoeven desc->suite.pcomp.decomp.count); 16698064efb8SGeert Uytterhoeven 16708064efb8SGeert Uytterhoeven crypto_free_pcomp(tfm); 16718064efb8SGeert Uytterhoeven return err; 16728064efb8SGeert Uytterhoeven } 16738064efb8SGeert Uytterhoeven 1674da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver, 1675da7f033dSHerbert Xu u32 type, u32 mask) 1676da7f033dSHerbert Xu { 1677da7f033dSHerbert Xu struct crypto_ahash *tfm; 1678da7f033dSHerbert Xu int err; 1679da7f033dSHerbert Xu 1680da7f033dSHerbert Xu tfm = crypto_alloc_ahash(driver, type, mask); 1681da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1682da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to load transform for %s: " 1683da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1684da7f033dSHerbert Xu return PTR_ERR(tfm); 1685da7f033dSHerbert Xu } 1686da7f033dSHerbert Xu 1687a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1688a8f1a052SDavid S. Miller desc->suite.hash.count, true); 1689a8f1a052SDavid S. Miller if (!err) 1690a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1691a8f1a052SDavid S. Miller desc->suite.hash.count, false); 1692da7f033dSHerbert Xu 1693da7f033dSHerbert Xu crypto_free_ahash(tfm); 1694da7f033dSHerbert Xu return err; 1695da7f033dSHerbert Xu } 1696da7f033dSHerbert Xu 16978e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc, 16988e3ee85eSHerbert Xu const char *driver, u32 type, u32 mask) 16998e3ee85eSHerbert Xu { 17008e3ee85eSHerbert Xu struct crypto_shash *tfm; 17018e3ee85eSHerbert Xu u32 val; 17028e3ee85eSHerbert Xu int err; 17038e3ee85eSHerbert Xu 17048e3ee85eSHerbert Xu err = alg_test_hash(desc, driver, type, mask); 17058e3ee85eSHerbert Xu if (err) 17068e3ee85eSHerbert Xu goto out; 17078e3ee85eSHerbert Xu 17088e3ee85eSHerbert Xu tfm = crypto_alloc_shash(driver, type, mask); 17098e3ee85eSHerbert Xu if (IS_ERR(tfm)) { 17108e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: " 17118e3ee85eSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 17128e3ee85eSHerbert Xu err = PTR_ERR(tfm); 17138e3ee85eSHerbert Xu goto out; 17148e3ee85eSHerbert Xu } 17158e3ee85eSHerbert Xu 17168e3ee85eSHerbert Xu do { 17178e3ee85eSHerbert Xu struct { 17188e3ee85eSHerbert Xu struct shash_desc shash; 17198e3ee85eSHerbert Xu char ctx[crypto_shash_descsize(tfm)]; 17208e3ee85eSHerbert Xu } sdesc; 17218e3ee85eSHerbert Xu 17228e3ee85eSHerbert Xu sdesc.shash.tfm = tfm; 17238e3ee85eSHerbert Xu sdesc.shash.flags = 0; 17248e3ee85eSHerbert Xu 17258e3ee85eSHerbert Xu *(u32 *)sdesc.ctx = le32_to_cpu(420553207); 17268e3ee85eSHerbert Xu err = crypto_shash_final(&sdesc.shash, (u8 *)&val); 17278e3ee85eSHerbert Xu if (err) { 17288e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Operation failed for " 17298e3ee85eSHerbert Xu "%s: %d\n", driver, err); 17308e3ee85eSHerbert Xu break; 17318e3ee85eSHerbert Xu } 17328e3ee85eSHerbert Xu 17338e3ee85eSHerbert Xu if (val != ~420553207) { 17348e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Test failed for %s: " 17358e3ee85eSHerbert Xu "%d\n", driver, val); 17368e3ee85eSHerbert Xu err = -EINVAL; 17378e3ee85eSHerbert Xu } 17388e3ee85eSHerbert Xu } while (0); 17398e3ee85eSHerbert Xu 17408e3ee85eSHerbert Xu crypto_free_shash(tfm); 17418e3ee85eSHerbert Xu 17428e3ee85eSHerbert Xu out: 17438e3ee85eSHerbert Xu return err; 17448e3ee85eSHerbert Xu } 17458e3ee85eSHerbert Xu 17467647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver, 17477647d6ceSJarod Wilson u32 type, u32 mask) 17487647d6ceSJarod Wilson { 17497647d6ceSJarod Wilson struct crypto_rng *rng; 17507647d6ceSJarod Wilson int err; 17517647d6ceSJarod Wilson 17527647d6ceSJarod Wilson rng = crypto_alloc_rng(driver, type, mask); 17537647d6ceSJarod Wilson if (IS_ERR(rng)) { 17547647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to load transform for %s: " 17557647d6ceSJarod Wilson "%ld\n", driver, PTR_ERR(rng)); 17567647d6ceSJarod Wilson return PTR_ERR(rng); 17577647d6ceSJarod Wilson } 17587647d6ceSJarod Wilson 17597647d6ceSJarod Wilson err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count); 17607647d6ceSJarod Wilson 17617647d6ceSJarod Wilson crypto_free_rng(rng); 17627647d6ceSJarod Wilson 17637647d6ceSJarod Wilson return err; 17647647d6ceSJarod Wilson } 17657647d6ceSJarod Wilson 176664d1cdfbSStephan Mueller 176764d1cdfbSStephan Mueller static int drbg_cavs_test(struct drbg_testvec *test, int pr, 176864d1cdfbSStephan Mueller const char *driver, u32 type, u32 mask) 176964d1cdfbSStephan Mueller { 177064d1cdfbSStephan Mueller int ret = -EAGAIN; 177164d1cdfbSStephan Mueller struct crypto_rng *drng; 177264d1cdfbSStephan Mueller struct drbg_test_data test_data; 177364d1cdfbSStephan Mueller struct drbg_string addtl, pers, testentropy; 177464d1cdfbSStephan Mueller unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL); 177564d1cdfbSStephan Mueller 177664d1cdfbSStephan Mueller if (!buf) 177764d1cdfbSStephan Mueller return -ENOMEM; 177864d1cdfbSStephan Mueller 177964d1cdfbSStephan Mueller drng = crypto_alloc_rng(driver, type, mask); 178064d1cdfbSStephan Mueller if (IS_ERR(drng)) { 178164d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for" 178264d1cdfbSStephan Mueller "%s\n", driver); 178364d1cdfbSStephan Mueller kzfree(buf); 178464d1cdfbSStephan Mueller return -ENOMEM; 178564d1cdfbSStephan Mueller } 178664d1cdfbSStephan Mueller 178764d1cdfbSStephan Mueller test_data.testentropy = &testentropy; 178864d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entropy, test->entropylen); 178964d1cdfbSStephan Mueller drbg_string_fill(&pers, test->pers, test->perslen); 179064d1cdfbSStephan Mueller ret = crypto_drbg_reset_test(drng, &pers, &test_data); 179164d1cdfbSStephan Mueller if (ret) { 179264d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: Failed to reset rng\n"); 179364d1cdfbSStephan Mueller goto outbuf; 179464d1cdfbSStephan Mueller } 179564d1cdfbSStephan Mueller 179664d1cdfbSStephan Mueller drbg_string_fill(&addtl, test->addtla, test->addtllen); 179764d1cdfbSStephan Mueller if (pr) { 179864d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entpra, test->entprlen); 179964d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl_test(drng, 180064d1cdfbSStephan Mueller buf, test->expectedlen, &addtl, &test_data); 180164d1cdfbSStephan Mueller } else { 180264d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl(drng, 180364d1cdfbSStephan Mueller buf, test->expectedlen, &addtl); 180464d1cdfbSStephan Mueller } 180564d1cdfbSStephan Mueller if (ret <= 0) { 180664d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not obtain random data for" 180764d1cdfbSStephan Mueller "driver %s\n", driver); 180864d1cdfbSStephan Mueller goto outbuf; 180964d1cdfbSStephan Mueller } 181064d1cdfbSStephan Mueller 181164d1cdfbSStephan Mueller drbg_string_fill(&addtl, test->addtlb, test->addtllen); 181264d1cdfbSStephan Mueller if (pr) { 181364d1cdfbSStephan Mueller drbg_string_fill(&testentropy, test->entprb, test->entprlen); 181464d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl_test(drng, 181564d1cdfbSStephan Mueller buf, test->expectedlen, &addtl, &test_data); 181664d1cdfbSStephan Mueller } else { 181764d1cdfbSStephan Mueller ret = crypto_drbg_get_bytes_addtl(drng, 181864d1cdfbSStephan Mueller buf, test->expectedlen, &addtl); 181964d1cdfbSStephan Mueller } 182064d1cdfbSStephan Mueller if (ret <= 0) { 182164d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: could not obtain random data for" 182264d1cdfbSStephan Mueller "driver %s\n", driver); 182364d1cdfbSStephan Mueller goto outbuf; 182464d1cdfbSStephan Mueller } 182564d1cdfbSStephan Mueller 182664d1cdfbSStephan Mueller ret = memcmp(test->expected, buf, test->expectedlen); 182764d1cdfbSStephan Mueller 182864d1cdfbSStephan Mueller outbuf: 182964d1cdfbSStephan Mueller crypto_free_rng(drng); 183064d1cdfbSStephan Mueller kzfree(buf); 183164d1cdfbSStephan Mueller return ret; 183264d1cdfbSStephan Mueller } 183364d1cdfbSStephan Mueller 183464d1cdfbSStephan Mueller 183564d1cdfbSStephan Mueller static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver, 183664d1cdfbSStephan Mueller u32 type, u32 mask) 183764d1cdfbSStephan Mueller { 183864d1cdfbSStephan Mueller int err = 0; 183964d1cdfbSStephan Mueller int pr = 0; 184064d1cdfbSStephan Mueller int i = 0; 184164d1cdfbSStephan Mueller struct drbg_testvec *template = desc->suite.drbg.vecs; 184264d1cdfbSStephan Mueller unsigned int tcount = desc->suite.drbg.count; 184364d1cdfbSStephan Mueller 184464d1cdfbSStephan Mueller if (0 == memcmp(driver, "drbg_pr_", 8)) 184564d1cdfbSStephan Mueller pr = 1; 184664d1cdfbSStephan Mueller 184764d1cdfbSStephan Mueller for (i = 0; i < tcount; i++) { 184864d1cdfbSStephan Mueller err = drbg_cavs_test(&template[i], pr, driver, type, mask); 184964d1cdfbSStephan Mueller if (err) { 185064d1cdfbSStephan Mueller printk(KERN_ERR "alg: drbg: Test %d failed for %s\n", 185164d1cdfbSStephan Mueller i, driver); 185264d1cdfbSStephan Mueller err = -EINVAL; 185364d1cdfbSStephan Mueller break; 185464d1cdfbSStephan Mueller } 185564d1cdfbSStephan Mueller } 185664d1cdfbSStephan Mueller return err; 185764d1cdfbSStephan Mueller 185864d1cdfbSStephan Mueller } 185964d1cdfbSStephan Mueller 1860863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc, 1861863b557aSYouquan, Song const char *driver, u32 type, u32 mask) 1862863b557aSYouquan, Song { 1863863b557aSYouquan, Song return 0; 1864863b557aSYouquan, Song } 1865863b557aSYouquan, Song 1866da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */ 1867da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = { 1868da7f033dSHerbert Xu { 18694d6d6a2cSJohannes Goetzfried .alg = "__cbc-cast5-avx", 18704d6d6a2cSJohannes Goetzfried .test = alg_test_null, 18714d6d6a2cSJohannes Goetzfried }, { 18724ea1277dSJohannes Goetzfried .alg = "__cbc-cast6-avx", 18734ea1277dSJohannes Goetzfried .test = alg_test_null, 18744ea1277dSJohannes Goetzfried }, { 18757efe4076SJohannes Goetzfried .alg = "__cbc-serpent-avx", 18767efe4076SJohannes Goetzfried .test = alg_test_null, 18777efe4076SJohannes Goetzfried }, { 187856d76c96SJussi Kivilinna .alg = "__cbc-serpent-avx2", 187956d76c96SJussi Kivilinna .test = alg_test_null, 188056d76c96SJussi Kivilinna }, { 1881937c30d7SJussi Kivilinna .alg = "__cbc-serpent-sse2", 1882937c30d7SJussi Kivilinna .test = alg_test_null, 1883937c30d7SJussi Kivilinna }, { 1884107778b5SJohannes Goetzfried .alg = "__cbc-twofish-avx", 1885107778b5SJohannes Goetzfried .test = alg_test_null, 1886107778b5SJohannes Goetzfried }, { 1887863b557aSYouquan, Song .alg = "__driver-cbc-aes-aesni", 1888863b557aSYouquan, Song .test = alg_test_null, 18896c79294fSMilan Broz .fips_allowed = 1, 1890863b557aSYouquan, Song }, { 1891d9b1d2e7SJussi Kivilinna .alg = "__driver-cbc-camellia-aesni", 1892d9b1d2e7SJussi Kivilinna .test = alg_test_null, 1893d9b1d2e7SJussi Kivilinna }, { 1894f3f935a7SJussi Kivilinna .alg = "__driver-cbc-camellia-aesni-avx2", 1895f3f935a7SJussi Kivilinna .test = alg_test_null, 1896f3f935a7SJussi Kivilinna }, { 18974d6d6a2cSJohannes Goetzfried .alg = "__driver-cbc-cast5-avx", 18984d6d6a2cSJohannes Goetzfried .test = alg_test_null, 18994d6d6a2cSJohannes Goetzfried }, { 19004ea1277dSJohannes Goetzfried .alg = "__driver-cbc-cast6-avx", 19014ea1277dSJohannes Goetzfried .test = alg_test_null, 19024ea1277dSJohannes Goetzfried }, { 19037efe4076SJohannes Goetzfried .alg = "__driver-cbc-serpent-avx", 19047efe4076SJohannes Goetzfried .test = alg_test_null, 19057efe4076SJohannes Goetzfried }, { 190656d76c96SJussi Kivilinna .alg = "__driver-cbc-serpent-avx2", 190756d76c96SJussi Kivilinna .test = alg_test_null, 190856d76c96SJussi Kivilinna }, { 1909937c30d7SJussi Kivilinna .alg = "__driver-cbc-serpent-sse2", 1910937c30d7SJussi Kivilinna .test = alg_test_null, 1911937c30d7SJussi Kivilinna }, { 1912107778b5SJohannes Goetzfried .alg = "__driver-cbc-twofish-avx", 1913107778b5SJohannes Goetzfried .test = alg_test_null, 1914107778b5SJohannes Goetzfried }, { 1915863b557aSYouquan, Song .alg = "__driver-ecb-aes-aesni", 1916863b557aSYouquan, Song .test = alg_test_null, 19176c79294fSMilan Broz .fips_allowed = 1, 1918863b557aSYouquan, Song }, { 1919d9b1d2e7SJussi Kivilinna .alg = "__driver-ecb-camellia-aesni", 1920d9b1d2e7SJussi Kivilinna .test = alg_test_null, 1921d9b1d2e7SJussi Kivilinna }, { 1922f3f935a7SJussi Kivilinna .alg = "__driver-ecb-camellia-aesni-avx2", 1923f3f935a7SJussi Kivilinna .test = alg_test_null, 1924f3f935a7SJussi Kivilinna }, { 19254d6d6a2cSJohannes Goetzfried .alg = "__driver-ecb-cast5-avx", 19264d6d6a2cSJohannes Goetzfried .test = alg_test_null, 19274d6d6a2cSJohannes Goetzfried }, { 19284ea1277dSJohannes Goetzfried .alg = "__driver-ecb-cast6-avx", 19294ea1277dSJohannes Goetzfried .test = alg_test_null, 19304ea1277dSJohannes Goetzfried }, { 19317efe4076SJohannes Goetzfried .alg = "__driver-ecb-serpent-avx", 19327efe4076SJohannes Goetzfried .test = alg_test_null, 19337efe4076SJohannes Goetzfried }, { 193456d76c96SJussi Kivilinna .alg = "__driver-ecb-serpent-avx2", 193556d76c96SJussi Kivilinna .test = alg_test_null, 193656d76c96SJussi Kivilinna }, { 1937937c30d7SJussi Kivilinna .alg = "__driver-ecb-serpent-sse2", 1938937c30d7SJussi Kivilinna .test = alg_test_null, 1939937c30d7SJussi Kivilinna }, { 1940107778b5SJohannes Goetzfried .alg = "__driver-ecb-twofish-avx", 1941107778b5SJohannes Goetzfried .test = alg_test_null, 1942107778b5SJohannes Goetzfried }, { 1943863b557aSYouquan, Song .alg = "__ghash-pclmulqdqni", 1944863b557aSYouquan, Song .test = alg_test_null, 19456c79294fSMilan Broz .fips_allowed = 1, 1946863b557aSYouquan, Song }, { 1947e08ca2daSJarod Wilson .alg = "ansi_cprng", 1948e08ca2daSJarod Wilson .test = alg_test_cprng, 1949a1915d51SJarod Wilson .fips_allowed = 1, 1950e08ca2daSJarod Wilson .suite = { 1951e08ca2daSJarod Wilson .cprng = { 1952e08ca2daSJarod Wilson .vecs = ansi_cprng_aes_tv_template, 1953e08ca2daSJarod Wilson .count = ANSI_CPRNG_AES_TEST_VECTORS 1954e08ca2daSJarod Wilson } 1955e08ca2daSJarod Wilson } 1956e08ca2daSJarod Wilson }, { 1957bca4feb0SHoria Geanta .alg = "authenc(hmac(md5),ecb(cipher_null))", 1958bca4feb0SHoria Geanta .test = alg_test_aead, 1959bca4feb0SHoria Geanta .fips_allowed = 1, 1960bca4feb0SHoria Geanta .suite = { 1961bca4feb0SHoria Geanta .aead = { 1962bca4feb0SHoria Geanta .enc = { 1963bca4feb0SHoria Geanta .vecs = hmac_md5_ecb_cipher_null_enc_tv_template, 1964bca4feb0SHoria Geanta .count = HMAC_MD5_ECB_CIPHER_NULL_ENC_TEST_VECTORS 1965bca4feb0SHoria Geanta }, 1966bca4feb0SHoria Geanta .dec = { 1967bca4feb0SHoria Geanta .vecs = hmac_md5_ecb_cipher_null_dec_tv_template, 1968bca4feb0SHoria Geanta .count = HMAC_MD5_ECB_CIPHER_NULL_DEC_TEST_VECTORS 1969bca4feb0SHoria Geanta } 1970bca4feb0SHoria Geanta } 1971bca4feb0SHoria Geanta } 1972bca4feb0SHoria Geanta }, { 1973e46e9a46SHoria Geanta .alg = "authenc(hmac(sha1),cbc(aes))", 1974e46e9a46SHoria Geanta .test = alg_test_aead, 1975e46e9a46SHoria Geanta .fips_allowed = 1, 1976e46e9a46SHoria Geanta .suite = { 1977e46e9a46SHoria Geanta .aead = { 1978e46e9a46SHoria Geanta .enc = { 19795208ed2cSNitesh Lal .vecs = 19805208ed2cSNitesh Lal hmac_sha1_aes_cbc_enc_tv_temp, 19815208ed2cSNitesh Lal .count = 19825208ed2cSNitesh Lal HMAC_SHA1_AES_CBC_ENC_TEST_VEC 19835208ed2cSNitesh Lal } 19845208ed2cSNitesh Lal } 19855208ed2cSNitesh Lal } 19865208ed2cSNitesh Lal }, { 19875208ed2cSNitesh Lal .alg = "authenc(hmac(sha1),cbc(des))", 19885208ed2cSNitesh Lal .test = alg_test_aead, 19895208ed2cSNitesh Lal .fips_allowed = 1, 19905208ed2cSNitesh Lal .suite = { 19915208ed2cSNitesh Lal .aead = { 19925208ed2cSNitesh Lal .enc = { 19935208ed2cSNitesh Lal .vecs = 19945208ed2cSNitesh Lal hmac_sha1_des_cbc_enc_tv_temp, 19955208ed2cSNitesh Lal .count = 19965208ed2cSNitesh Lal HMAC_SHA1_DES_CBC_ENC_TEST_VEC 19975208ed2cSNitesh Lal } 19985208ed2cSNitesh Lal } 19995208ed2cSNitesh Lal } 20005208ed2cSNitesh Lal }, { 20015208ed2cSNitesh Lal .alg = "authenc(hmac(sha1),cbc(des3_ede))", 20025208ed2cSNitesh Lal .test = alg_test_aead, 20035208ed2cSNitesh Lal .fips_allowed = 1, 20045208ed2cSNitesh Lal .suite = { 20055208ed2cSNitesh Lal .aead = { 20065208ed2cSNitesh Lal .enc = { 20075208ed2cSNitesh Lal .vecs = 20085208ed2cSNitesh Lal hmac_sha1_des3_ede_cbc_enc_tv_temp, 20095208ed2cSNitesh Lal .count = 20105208ed2cSNitesh Lal HMAC_SHA1_DES3_EDE_CBC_ENC_TEST_VEC 2011e46e9a46SHoria Geanta } 2012e46e9a46SHoria Geanta } 2013e46e9a46SHoria Geanta } 2014e46e9a46SHoria Geanta }, { 2015bca4feb0SHoria Geanta .alg = "authenc(hmac(sha1),ecb(cipher_null))", 2016bca4feb0SHoria Geanta .test = alg_test_aead, 2017bca4feb0SHoria Geanta .fips_allowed = 1, 2018bca4feb0SHoria Geanta .suite = { 2019bca4feb0SHoria Geanta .aead = { 2020bca4feb0SHoria Geanta .enc = { 20215208ed2cSNitesh Lal .vecs = 20225208ed2cSNitesh Lal hmac_sha1_ecb_cipher_null_enc_tv_temp, 20235208ed2cSNitesh Lal .count = 20245208ed2cSNitesh Lal HMAC_SHA1_ECB_CIPHER_NULL_ENC_TEST_VEC 2025bca4feb0SHoria Geanta }, 2026bca4feb0SHoria Geanta .dec = { 20275208ed2cSNitesh Lal .vecs = 20285208ed2cSNitesh Lal hmac_sha1_ecb_cipher_null_dec_tv_temp, 20295208ed2cSNitesh Lal .count = 20305208ed2cSNitesh Lal HMAC_SHA1_ECB_CIPHER_NULL_DEC_TEST_VEC 20315208ed2cSNitesh Lal } 20325208ed2cSNitesh Lal } 20335208ed2cSNitesh Lal } 20345208ed2cSNitesh Lal }, { 20355208ed2cSNitesh Lal .alg = "authenc(hmac(sha224),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_sha224_des_cbc_enc_tv_temp, 20435208ed2cSNitesh Lal .count = 20445208ed2cSNitesh Lal HMAC_SHA224_DES_CBC_ENC_TEST_VEC 20455208ed2cSNitesh Lal } 20465208ed2cSNitesh Lal } 20475208ed2cSNitesh Lal } 20485208ed2cSNitesh Lal }, { 20495208ed2cSNitesh Lal .alg = "authenc(hmac(sha224),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_sha224_des3_ede_cbc_enc_tv_temp, 20575208ed2cSNitesh Lal .count = 20585208ed2cSNitesh Lal HMAC_SHA224_DES3_EDE_CBC_ENC_TEST_VEC 2059bca4feb0SHoria Geanta } 2060bca4feb0SHoria Geanta } 2061bca4feb0SHoria Geanta } 2062bca4feb0SHoria Geanta }, { 2063e46e9a46SHoria Geanta .alg = "authenc(hmac(sha256),cbc(aes))", 2064e46e9a46SHoria Geanta .test = alg_test_aead, 2065e46e9a46SHoria Geanta .fips_allowed = 1, 2066e46e9a46SHoria Geanta .suite = { 2067e46e9a46SHoria Geanta .aead = { 2068e46e9a46SHoria Geanta .enc = { 20695208ed2cSNitesh Lal .vecs = 20705208ed2cSNitesh Lal hmac_sha256_aes_cbc_enc_tv_temp, 20715208ed2cSNitesh Lal .count = 20725208ed2cSNitesh Lal HMAC_SHA256_AES_CBC_ENC_TEST_VEC 20735208ed2cSNitesh Lal } 20745208ed2cSNitesh Lal } 20755208ed2cSNitesh Lal } 20765208ed2cSNitesh Lal }, { 20775208ed2cSNitesh Lal .alg = "authenc(hmac(sha256),cbc(des))", 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_sha256_des_cbc_enc_tv_temp, 20855208ed2cSNitesh Lal .count = 20865208ed2cSNitesh Lal HMAC_SHA256_DES_CBC_ENC_TEST_VEC 20875208ed2cSNitesh Lal } 20885208ed2cSNitesh Lal } 20895208ed2cSNitesh Lal } 20905208ed2cSNitesh Lal }, { 20915208ed2cSNitesh Lal .alg = "authenc(hmac(sha256),cbc(des3_ede))", 20925208ed2cSNitesh Lal .test = alg_test_aead, 20935208ed2cSNitesh Lal .fips_allowed = 1, 20945208ed2cSNitesh Lal .suite = { 20955208ed2cSNitesh Lal .aead = { 20965208ed2cSNitesh Lal .enc = { 20975208ed2cSNitesh Lal .vecs = 20985208ed2cSNitesh Lal hmac_sha256_des3_ede_cbc_enc_tv_temp, 20995208ed2cSNitesh Lal .count = 21005208ed2cSNitesh Lal HMAC_SHA256_DES3_EDE_CBC_ENC_TEST_VEC 21015208ed2cSNitesh Lal } 21025208ed2cSNitesh Lal } 21035208ed2cSNitesh Lal } 21045208ed2cSNitesh Lal }, { 21055208ed2cSNitesh Lal .alg = "authenc(hmac(sha384),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_sha384_des_cbc_enc_tv_temp, 21135208ed2cSNitesh Lal .count = 21145208ed2cSNitesh Lal HMAC_SHA384_DES_CBC_ENC_TEST_VEC 21155208ed2cSNitesh Lal } 21165208ed2cSNitesh Lal } 21175208ed2cSNitesh Lal } 21185208ed2cSNitesh Lal }, { 21195208ed2cSNitesh Lal .alg = "authenc(hmac(sha384),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_sha384_des3_ede_cbc_enc_tv_temp, 21275208ed2cSNitesh Lal .count = 21285208ed2cSNitesh Lal HMAC_SHA384_DES3_EDE_CBC_ENC_TEST_VEC 2129e46e9a46SHoria Geanta } 2130e46e9a46SHoria Geanta } 2131e46e9a46SHoria Geanta } 2132e46e9a46SHoria Geanta }, { 2133e46e9a46SHoria Geanta .alg = "authenc(hmac(sha512),cbc(aes))", 2134e46e9a46SHoria Geanta .test = alg_test_aead, 2135e46e9a46SHoria Geanta .fips_allowed = 1, 2136e46e9a46SHoria Geanta .suite = { 2137e46e9a46SHoria Geanta .aead = { 2138e46e9a46SHoria Geanta .enc = { 21395208ed2cSNitesh Lal .vecs = 21405208ed2cSNitesh Lal hmac_sha512_aes_cbc_enc_tv_temp, 21415208ed2cSNitesh Lal .count = 21425208ed2cSNitesh Lal HMAC_SHA512_AES_CBC_ENC_TEST_VEC 21435208ed2cSNitesh Lal } 21445208ed2cSNitesh Lal } 21455208ed2cSNitesh Lal } 21465208ed2cSNitesh Lal }, { 21475208ed2cSNitesh Lal .alg = "authenc(hmac(sha512),cbc(des))", 21485208ed2cSNitesh Lal .test = alg_test_aead, 21495208ed2cSNitesh Lal .fips_allowed = 1, 21505208ed2cSNitesh Lal .suite = { 21515208ed2cSNitesh Lal .aead = { 21525208ed2cSNitesh Lal .enc = { 21535208ed2cSNitesh Lal .vecs = 21545208ed2cSNitesh Lal hmac_sha512_des_cbc_enc_tv_temp, 21555208ed2cSNitesh Lal .count = 21565208ed2cSNitesh Lal HMAC_SHA512_DES_CBC_ENC_TEST_VEC 21575208ed2cSNitesh Lal } 21585208ed2cSNitesh Lal } 21595208ed2cSNitesh Lal } 21605208ed2cSNitesh Lal }, { 21615208ed2cSNitesh Lal .alg = "authenc(hmac(sha512),cbc(des3_ede))", 21625208ed2cSNitesh Lal .test = alg_test_aead, 21635208ed2cSNitesh Lal .fips_allowed = 1, 21645208ed2cSNitesh Lal .suite = { 21655208ed2cSNitesh Lal .aead = { 21665208ed2cSNitesh Lal .enc = { 21675208ed2cSNitesh Lal .vecs = 21685208ed2cSNitesh Lal hmac_sha512_des3_ede_cbc_enc_tv_temp, 21695208ed2cSNitesh Lal .count = 21705208ed2cSNitesh Lal HMAC_SHA512_DES3_EDE_CBC_ENC_TEST_VEC 2171e46e9a46SHoria Geanta } 2172e46e9a46SHoria Geanta } 2173e46e9a46SHoria Geanta } 2174e46e9a46SHoria Geanta }, { 2175da7f033dSHerbert Xu .alg = "cbc(aes)", 21761aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2177a1915d51SJarod Wilson .fips_allowed = 1, 2178da7f033dSHerbert Xu .suite = { 2179da7f033dSHerbert Xu .cipher = { 2180da7f033dSHerbert Xu .enc = { 2181da7f033dSHerbert Xu .vecs = aes_cbc_enc_tv_template, 2182da7f033dSHerbert Xu .count = AES_CBC_ENC_TEST_VECTORS 2183da7f033dSHerbert Xu }, 2184da7f033dSHerbert Xu .dec = { 2185da7f033dSHerbert Xu .vecs = aes_cbc_dec_tv_template, 2186da7f033dSHerbert Xu .count = AES_CBC_DEC_TEST_VECTORS 2187da7f033dSHerbert Xu } 2188da7f033dSHerbert Xu } 2189da7f033dSHerbert Xu } 2190da7f033dSHerbert Xu }, { 2191da7f033dSHerbert Xu .alg = "cbc(anubis)", 21921aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2193da7f033dSHerbert Xu .suite = { 2194da7f033dSHerbert Xu .cipher = { 2195da7f033dSHerbert Xu .enc = { 2196da7f033dSHerbert Xu .vecs = anubis_cbc_enc_tv_template, 2197da7f033dSHerbert Xu .count = ANUBIS_CBC_ENC_TEST_VECTORS 2198da7f033dSHerbert Xu }, 2199da7f033dSHerbert Xu .dec = { 2200da7f033dSHerbert Xu .vecs = anubis_cbc_dec_tv_template, 2201da7f033dSHerbert Xu .count = ANUBIS_CBC_DEC_TEST_VECTORS 2202da7f033dSHerbert Xu } 2203da7f033dSHerbert Xu } 2204da7f033dSHerbert Xu } 2205da7f033dSHerbert Xu }, { 2206da7f033dSHerbert Xu .alg = "cbc(blowfish)", 22071aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2208da7f033dSHerbert Xu .suite = { 2209da7f033dSHerbert Xu .cipher = { 2210da7f033dSHerbert Xu .enc = { 2211da7f033dSHerbert Xu .vecs = bf_cbc_enc_tv_template, 2212da7f033dSHerbert Xu .count = BF_CBC_ENC_TEST_VECTORS 2213da7f033dSHerbert Xu }, 2214da7f033dSHerbert Xu .dec = { 2215da7f033dSHerbert Xu .vecs = bf_cbc_dec_tv_template, 2216da7f033dSHerbert Xu .count = BF_CBC_DEC_TEST_VECTORS 2217da7f033dSHerbert Xu } 2218da7f033dSHerbert Xu } 2219da7f033dSHerbert Xu } 2220da7f033dSHerbert Xu }, { 2221da7f033dSHerbert Xu .alg = "cbc(camellia)", 22221aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2223da7f033dSHerbert Xu .suite = { 2224da7f033dSHerbert Xu .cipher = { 2225da7f033dSHerbert Xu .enc = { 2226da7f033dSHerbert Xu .vecs = camellia_cbc_enc_tv_template, 2227da7f033dSHerbert Xu .count = CAMELLIA_CBC_ENC_TEST_VECTORS 2228da7f033dSHerbert Xu }, 2229da7f033dSHerbert Xu .dec = { 2230da7f033dSHerbert Xu .vecs = camellia_cbc_dec_tv_template, 2231da7f033dSHerbert Xu .count = CAMELLIA_CBC_DEC_TEST_VECTORS 2232da7f033dSHerbert Xu } 2233da7f033dSHerbert Xu } 2234da7f033dSHerbert Xu } 2235da7f033dSHerbert Xu }, { 2236a2c58260SJohannes Goetzfried .alg = "cbc(cast5)", 2237a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 2238a2c58260SJohannes Goetzfried .suite = { 2239a2c58260SJohannes Goetzfried .cipher = { 2240a2c58260SJohannes Goetzfried .enc = { 2241a2c58260SJohannes Goetzfried .vecs = cast5_cbc_enc_tv_template, 2242a2c58260SJohannes Goetzfried .count = CAST5_CBC_ENC_TEST_VECTORS 2243a2c58260SJohannes Goetzfried }, 2244a2c58260SJohannes Goetzfried .dec = { 2245a2c58260SJohannes Goetzfried .vecs = cast5_cbc_dec_tv_template, 2246a2c58260SJohannes Goetzfried .count = CAST5_CBC_DEC_TEST_VECTORS 2247a2c58260SJohannes Goetzfried } 2248a2c58260SJohannes Goetzfried } 2249a2c58260SJohannes Goetzfried } 2250a2c58260SJohannes Goetzfried }, { 22519b8b0405SJohannes Goetzfried .alg = "cbc(cast6)", 22529b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 22539b8b0405SJohannes Goetzfried .suite = { 22549b8b0405SJohannes Goetzfried .cipher = { 22559b8b0405SJohannes Goetzfried .enc = { 22569b8b0405SJohannes Goetzfried .vecs = cast6_cbc_enc_tv_template, 22579b8b0405SJohannes Goetzfried .count = CAST6_CBC_ENC_TEST_VECTORS 22589b8b0405SJohannes Goetzfried }, 22599b8b0405SJohannes Goetzfried .dec = { 22609b8b0405SJohannes Goetzfried .vecs = cast6_cbc_dec_tv_template, 22619b8b0405SJohannes Goetzfried .count = CAST6_CBC_DEC_TEST_VECTORS 22629b8b0405SJohannes Goetzfried } 22639b8b0405SJohannes Goetzfried } 22649b8b0405SJohannes Goetzfried } 22659b8b0405SJohannes Goetzfried }, { 2266da7f033dSHerbert Xu .alg = "cbc(des)", 22671aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2268da7f033dSHerbert Xu .suite = { 2269da7f033dSHerbert Xu .cipher = { 2270da7f033dSHerbert Xu .enc = { 2271da7f033dSHerbert Xu .vecs = des_cbc_enc_tv_template, 2272da7f033dSHerbert Xu .count = DES_CBC_ENC_TEST_VECTORS 2273da7f033dSHerbert Xu }, 2274da7f033dSHerbert Xu .dec = { 2275da7f033dSHerbert Xu .vecs = des_cbc_dec_tv_template, 2276da7f033dSHerbert Xu .count = DES_CBC_DEC_TEST_VECTORS 2277da7f033dSHerbert Xu } 2278da7f033dSHerbert Xu } 2279da7f033dSHerbert Xu } 2280da7f033dSHerbert Xu }, { 2281da7f033dSHerbert Xu .alg = "cbc(des3_ede)", 22821aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2283a1915d51SJarod Wilson .fips_allowed = 1, 2284da7f033dSHerbert Xu .suite = { 2285da7f033dSHerbert Xu .cipher = { 2286da7f033dSHerbert Xu .enc = { 2287da7f033dSHerbert Xu .vecs = des3_ede_cbc_enc_tv_template, 2288da7f033dSHerbert Xu .count = DES3_EDE_CBC_ENC_TEST_VECTORS 2289da7f033dSHerbert Xu }, 2290da7f033dSHerbert Xu .dec = { 2291da7f033dSHerbert Xu .vecs = des3_ede_cbc_dec_tv_template, 2292da7f033dSHerbert Xu .count = DES3_EDE_CBC_DEC_TEST_VECTORS 2293da7f033dSHerbert Xu } 2294da7f033dSHerbert Xu } 2295da7f033dSHerbert Xu } 2296da7f033dSHerbert Xu }, { 22979d25917dSJussi Kivilinna .alg = "cbc(serpent)", 22989d25917dSJussi Kivilinna .test = alg_test_skcipher, 22999d25917dSJussi Kivilinna .suite = { 23009d25917dSJussi Kivilinna .cipher = { 23019d25917dSJussi Kivilinna .enc = { 23029d25917dSJussi Kivilinna .vecs = serpent_cbc_enc_tv_template, 23039d25917dSJussi Kivilinna .count = SERPENT_CBC_ENC_TEST_VECTORS 23049d25917dSJussi Kivilinna }, 23059d25917dSJussi Kivilinna .dec = { 23069d25917dSJussi Kivilinna .vecs = serpent_cbc_dec_tv_template, 23079d25917dSJussi Kivilinna .count = SERPENT_CBC_DEC_TEST_VECTORS 23089d25917dSJussi Kivilinna } 23099d25917dSJussi Kivilinna } 23109d25917dSJussi Kivilinna } 23119d25917dSJussi Kivilinna }, { 2312da7f033dSHerbert Xu .alg = "cbc(twofish)", 23131aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2314da7f033dSHerbert Xu .suite = { 2315da7f033dSHerbert Xu .cipher = { 2316da7f033dSHerbert Xu .enc = { 2317da7f033dSHerbert Xu .vecs = tf_cbc_enc_tv_template, 2318da7f033dSHerbert Xu .count = TF_CBC_ENC_TEST_VECTORS 2319da7f033dSHerbert Xu }, 2320da7f033dSHerbert Xu .dec = { 2321da7f033dSHerbert Xu .vecs = tf_cbc_dec_tv_template, 2322da7f033dSHerbert Xu .count = TF_CBC_DEC_TEST_VECTORS 2323da7f033dSHerbert Xu } 2324da7f033dSHerbert Xu } 2325da7f033dSHerbert Xu } 2326da7f033dSHerbert Xu }, { 2327da7f033dSHerbert Xu .alg = "ccm(aes)", 2328da7f033dSHerbert Xu .test = alg_test_aead, 2329a1915d51SJarod Wilson .fips_allowed = 1, 2330da7f033dSHerbert Xu .suite = { 2331da7f033dSHerbert Xu .aead = { 2332da7f033dSHerbert Xu .enc = { 2333da7f033dSHerbert Xu .vecs = aes_ccm_enc_tv_template, 2334da7f033dSHerbert Xu .count = AES_CCM_ENC_TEST_VECTORS 2335da7f033dSHerbert Xu }, 2336da7f033dSHerbert Xu .dec = { 2337da7f033dSHerbert Xu .vecs = aes_ccm_dec_tv_template, 2338da7f033dSHerbert Xu .count = AES_CCM_DEC_TEST_VECTORS 2339da7f033dSHerbert Xu } 2340da7f033dSHerbert Xu } 2341da7f033dSHerbert Xu } 2342da7f033dSHerbert Xu }, { 234393b5e86aSJussi Kivilinna .alg = "cmac(aes)", 234493b5e86aSJussi Kivilinna .test = alg_test_hash, 234593b5e86aSJussi Kivilinna .suite = { 234693b5e86aSJussi Kivilinna .hash = { 234793b5e86aSJussi Kivilinna .vecs = aes_cmac128_tv_template, 234893b5e86aSJussi Kivilinna .count = CMAC_AES_TEST_VECTORS 234993b5e86aSJussi Kivilinna } 235093b5e86aSJussi Kivilinna } 235193b5e86aSJussi Kivilinna }, { 235293b5e86aSJussi Kivilinna .alg = "cmac(des3_ede)", 235393b5e86aSJussi Kivilinna .test = alg_test_hash, 235493b5e86aSJussi Kivilinna .suite = { 235593b5e86aSJussi Kivilinna .hash = { 235693b5e86aSJussi Kivilinna .vecs = des3_ede_cmac64_tv_template, 235793b5e86aSJussi Kivilinna .count = CMAC_DES3_EDE_TEST_VECTORS 235893b5e86aSJussi Kivilinna } 235993b5e86aSJussi Kivilinna } 236093b5e86aSJussi Kivilinna }, { 2361e448370dSJussi Kivilinna .alg = "compress_null", 2362e448370dSJussi Kivilinna .test = alg_test_null, 2363e448370dSJussi Kivilinna }, { 2364da7f033dSHerbert Xu .alg = "crc32c", 23658e3ee85eSHerbert Xu .test = alg_test_crc32c, 2366a1915d51SJarod Wilson .fips_allowed = 1, 2367da7f033dSHerbert Xu .suite = { 2368da7f033dSHerbert Xu .hash = { 2369da7f033dSHerbert Xu .vecs = crc32c_tv_template, 2370da7f033dSHerbert Xu .count = CRC32C_TEST_VECTORS 2371da7f033dSHerbert Xu } 2372da7f033dSHerbert Xu } 2373da7f033dSHerbert Xu }, { 237468411521SHerbert Xu .alg = "crct10dif", 237568411521SHerbert Xu .test = alg_test_hash, 237668411521SHerbert Xu .fips_allowed = 1, 237768411521SHerbert Xu .suite = { 237868411521SHerbert Xu .hash = { 237968411521SHerbert Xu .vecs = crct10dif_tv_template, 238068411521SHerbert Xu .count = CRCT10DIF_TEST_VECTORS 238168411521SHerbert Xu } 238268411521SHerbert Xu } 238368411521SHerbert Xu }, { 23846c79294fSMilan Broz .alg = "cryptd(__driver-cbc-aes-aesni)", 23856c79294fSMilan Broz .test = alg_test_null, 23866c79294fSMilan Broz .fips_allowed = 1, 23876c79294fSMilan Broz }, { 2388d9b1d2e7SJussi Kivilinna .alg = "cryptd(__driver-cbc-camellia-aesni)", 2389d9b1d2e7SJussi Kivilinna .test = alg_test_null, 2390d9b1d2e7SJussi Kivilinna }, { 2391f3f935a7SJussi Kivilinna .alg = "cryptd(__driver-cbc-camellia-aesni-avx2)", 2392f3f935a7SJussi Kivilinna .test = alg_test_null, 2393f3f935a7SJussi Kivilinna }, { 239456d76c96SJussi Kivilinna .alg = "cryptd(__driver-cbc-serpent-avx2)", 239556d76c96SJussi Kivilinna .test = alg_test_null, 239656d76c96SJussi Kivilinna }, { 2397863b557aSYouquan, Song .alg = "cryptd(__driver-ecb-aes-aesni)", 2398863b557aSYouquan, Song .test = alg_test_null, 23996c79294fSMilan Broz .fips_allowed = 1, 2400863b557aSYouquan, Song }, { 2401d9b1d2e7SJussi Kivilinna .alg = "cryptd(__driver-ecb-camellia-aesni)", 2402d9b1d2e7SJussi Kivilinna .test = alg_test_null, 2403d9b1d2e7SJussi Kivilinna }, { 2404f3f935a7SJussi Kivilinna .alg = "cryptd(__driver-ecb-camellia-aesni-avx2)", 2405f3f935a7SJussi Kivilinna .test = alg_test_null, 2406f3f935a7SJussi Kivilinna }, { 24074d6d6a2cSJohannes Goetzfried .alg = "cryptd(__driver-ecb-cast5-avx)", 24084d6d6a2cSJohannes Goetzfried .test = alg_test_null, 24094d6d6a2cSJohannes Goetzfried }, { 24104ea1277dSJohannes Goetzfried .alg = "cryptd(__driver-ecb-cast6-avx)", 24114ea1277dSJohannes Goetzfried .test = alg_test_null, 24124ea1277dSJohannes Goetzfried }, { 24137efe4076SJohannes Goetzfried .alg = "cryptd(__driver-ecb-serpent-avx)", 24147efe4076SJohannes Goetzfried .test = alg_test_null, 24157efe4076SJohannes Goetzfried }, { 241656d76c96SJussi Kivilinna .alg = "cryptd(__driver-ecb-serpent-avx2)", 241756d76c96SJussi Kivilinna .test = alg_test_null, 241856d76c96SJussi Kivilinna }, { 2419937c30d7SJussi Kivilinna .alg = "cryptd(__driver-ecb-serpent-sse2)", 2420937c30d7SJussi Kivilinna .test = alg_test_null, 2421937c30d7SJussi Kivilinna }, { 2422107778b5SJohannes Goetzfried .alg = "cryptd(__driver-ecb-twofish-avx)", 2423107778b5SJohannes Goetzfried .test = alg_test_null, 2424107778b5SJohannes Goetzfried }, { 24256c79294fSMilan Broz .alg = "cryptd(__driver-gcm-aes-aesni)", 24266c79294fSMilan Broz .test = alg_test_null, 24276c79294fSMilan Broz .fips_allowed = 1, 24286c79294fSMilan Broz }, { 2429863b557aSYouquan, Song .alg = "cryptd(__ghash-pclmulqdqni)", 2430863b557aSYouquan, Song .test = alg_test_null, 24316c79294fSMilan Broz .fips_allowed = 1, 2432863b557aSYouquan, Song }, { 2433f7cb80f2SJarod Wilson .alg = "ctr(aes)", 2434f7cb80f2SJarod Wilson .test = alg_test_skcipher, 2435a1915d51SJarod Wilson .fips_allowed = 1, 2436f7cb80f2SJarod Wilson .suite = { 2437f7cb80f2SJarod Wilson .cipher = { 2438f7cb80f2SJarod Wilson .enc = { 2439f7cb80f2SJarod Wilson .vecs = aes_ctr_enc_tv_template, 2440f7cb80f2SJarod Wilson .count = AES_CTR_ENC_TEST_VECTORS 2441f7cb80f2SJarod Wilson }, 2442f7cb80f2SJarod Wilson .dec = { 2443f7cb80f2SJarod Wilson .vecs = aes_ctr_dec_tv_template, 2444f7cb80f2SJarod Wilson .count = AES_CTR_DEC_TEST_VECTORS 2445f7cb80f2SJarod Wilson } 2446f7cb80f2SJarod Wilson } 2447f7cb80f2SJarod Wilson } 2448f7cb80f2SJarod Wilson }, { 244985b63e34SJussi Kivilinna .alg = "ctr(blowfish)", 245085b63e34SJussi Kivilinna .test = alg_test_skcipher, 245185b63e34SJussi Kivilinna .suite = { 245285b63e34SJussi Kivilinna .cipher = { 245385b63e34SJussi Kivilinna .enc = { 245485b63e34SJussi Kivilinna .vecs = bf_ctr_enc_tv_template, 245585b63e34SJussi Kivilinna .count = BF_CTR_ENC_TEST_VECTORS 245685b63e34SJussi Kivilinna }, 245785b63e34SJussi Kivilinna .dec = { 245885b63e34SJussi Kivilinna .vecs = bf_ctr_dec_tv_template, 245985b63e34SJussi Kivilinna .count = BF_CTR_DEC_TEST_VECTORS 246085b63e34SJussi Kivilinna } 246185b63e34SJussi Kivilinna } 246285b63e34SJussi Kivilinna } 246385b63e34SJussi Kivilinna }, { 24640840605eSJussi Kivilinna .alg = "ctr(camellia)", 24650840605eSJussi Kivilinna .test = alg_test_skcipher, 24660840605eSJussi Kivilinna .suite = { 24670840605eSJussi Kivilinna .cipher = { 24680840605eSJussi Kivilinna .enc = { 24690840605eSJussi Kivilinna .vecs = camellia_ctr_enc_tv_template, 24700840605eSJussi Kivilinna .count = CAMELLIA_CTR_ENC_TEST_VECTORS 24710840605eSJussi Kivilinna }, 24720840605eSJussi Kivilinna .dec = { 24730840605eSJussi Kivilinna .vecs = camellia_ctr_dec_tv_template, 24740840605eSJussi Kivilinna .count = CAMELLIA_CTR_DEC_TEST_VECTORS 24750840605eSJussi Kivilinna } 24760840605eSJussi Kivilinna } 24770840605eSJussi Kivilinna } 24780840605eSJussi Kivilinna }, { 2479a2c58260SJohannes Goetzfried .alg = "ctr(cast5)", 2480a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 2481a2c58260SJohannes Goetzfried .suite = { 2482a2c58260SJohannes Goetzfried .cipher = { 2483a2c58260SJohannes Goetzfried .enc = { 2484a2c58260SJohannes Goetzfried .vecs = cast5_ctr_enc_tv_template, 2485a2c58260SJohannes Goetzfried .count = CAST5_CTR_ENC_TEST_VECTORS 2486a2c58260SJohannes Goetzfried }, 2487a2c58260SJohannes Goetzfried .dec = { 2488a2c58260SJohannes Goetzfried .vecs = cast5_ctr_dec_tv_template, 2489a2c58260SJohannes Goetzfried .count = CAST5_CTR_DEC_TEST_VECTORS 2490a2c58260SJohannes Goetzfried } 2491a2c58260SJohannes Goetzfried } 2492a2c58260SJohannes Goetzfried } 2493a2c58260SJohannes Goetzfried }, { 24949b8b0405SJohannes Goetzfried .alg = "ctr(cast6)", 24959b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 24969b8b0405SJohannes Goetzfried .suite = { 24979b8b0405SJohannes Goetzfried .cipher = { 24989b8b0405SJohannes Goetzfried .enc = { 24999b8b0405SJohannes Goetzfried .vecs = cast6_ctr_enc_tv_template, 25009b8b0405SJohannes Goetzfried .count = CAST6_CTR_ENC_TEST_VECTORS 25019b8b0405SJohannes Goetzfried }, 25029b8b0405SJohannes Goetzfried .dec = { 25039b8b0405SJohannes Goetzfried .vecs = cast6_ctr_dec_tv_template, 25049b8b0405SJohannes Goetzfried .count = CAST6_CTR_DEC_TEST_VECTORS 25059b8b0405SJohannes Goetzfried } 25069b8b0405SJohannes Goetzfried } 25079b8b0405SJohannes Goetzfried } 25089b8b0405SJohannes Goetzfried }, { 25098163fc30SJussi Kivilinna .alg = "ctr(des)", 25108163fc30SJussi Kivilinna .test = alg_test_skcipher, 25118163fc30SJussi Kivilinna .suite = { 25128163fc30SJussi Kivilinna .cipher = { 25138163fc30SJussi Kivilinna .enc = { 25148163fc30SJussi Kivilinna .vecs = des_ctr_enc_tv_template, 25158163fc30SJussi Kivilinna .count = DES_CTR_ENC_TEST_VECTORS 25168163fc30SJussi Kivilinna }, 25178163fc30SJussi Kivilinna .dec = { 25188163fc30SJussi Kivilinna .vecs = des_ctr_dec_tv_template, 25198163fc30SJussi Kivilinna .count = DES_CTR_DEC_TEST_VECTORS 25208163fc30SJussi Kivilinna } 25218163fc30SJussi Kivilinna } 25228163fc30SJussi Kivilinna } 25238163fc30SJussi Kivilinna }, { 2524e080b17aSJussi Kivilinna .alg = "ctr(des3_ede)", 2525e080b17aSJussi Kivilinna .test = alg_test_skcipher, 2526e080b17aSJussi Kivilinna .suite = { 2527e080b17aSJussi Kivilinna .cipher = { 2528e080b17aSJussi Kivilinna .enc = { 2529e080b17aSJussi Kivilinna .vecs = des3_ede_ctr_enc_tv_template, 2530e080b17aSJussi Kivilinna .count = DES3_EDE_CTR_ENC_TEST_VECTORS 2531e080b17aSJussi Kivilinna }, 2532e080b17aSJussi Kivilinna .dec = { 2533e080b17aSJussi Kivilinna .vecs = des3_ede_ctr_dec_tv_template, 2534e080b17aSJussi Kivilinna .count = DES3_EDE_CTR_DEC_TEST_VECTORS 2535e080b17aSJussi Kivilinna } 2536e080b17aSJussi Kivilinna } 2537e080b17aSJussi Kivilinna } 2538e080b17aSJussi Kivilinna }, { 25399d25917dSJussi Kivilinna .alg = "ctr(serpent)", 25409d25917dSJussi Kivilinna .test = alg_test_skcipher, 25419d25917dSJussi Kivilinna .suite = { 25429d25917dSJussi Kivilinna .cipher = { 25439d25917dSJussi Kivilinna .enc = { 25449d25917dSJussi Kivilinna .vecs = serpent_ctr_enc_tv_template, 25459d25917dSJussi Kivilinna .count = SERPENT_CTR_ENC_TEST_VECTORS 25469d25917dSJussi Kivilinna }, 25479d25917dSJussi Kivilinna .dec = { 25489d25917dSJussi Kivilinna .vecs = serpent_ctr_dec_tv_template, 25499d25917dSJussi Kivilinna .count = SERPENT_CTR_DEC_TEST_VECTORS 25509d25917dSJussi Kivilinna } 25519d25917dSJussi Kivilinna } 25529d25917dSJussi Kivilinna } 25539d25917dSJussi Kivilinna }, { 2554573da620SJussi Kivilinna .alg = "ctr(twofish)", 2555573da620SJussi Kivilinna .test = alg_test_skcipher, 2556573da620SJussi Kivilinna .suite = { 2557573da620SJussi Kivilinna .cipher = { 2558573da620SJussi Kivilinna .enc = { 2559573da620SJussi Kivilinna .vecs = tf_ctr_enc_tv_template, 2560573da620SJussi Kivilinna .count = TF_CTR_ENC_TEST_VECTORS 2561573da620SJussi Kivilinna }, 2562573da620SJussi Kivilinna .dec = { 2563573da620SJussi Kivilinna .vecs = tf_ctr_dec_tv_template, 2564573da620SJussi Kivilinna .count = TF_CTR_DEC_TEST_VECTORS 2565573da620SJussi Kivilinna } 2566573da620SJussi Kivilinna } 2567573da620SJussi Kivilinna } 2568573da620SJussi Kivilinna }, { 2569da7f033dSHerbert Xu .alg = "cts(cbc(aes))", 25701aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2571da7f033dSHerbert Xu .suite = { 2572da7f033dSHerbert Xu .cipher = { 2573da7f033dSHerbert Xu .enc = { 2574da7f033dSHerbert Xu .vecs = cts_mode_enc_tv_template, 2575da7f033dSHerbert Xu .count = CTS_MODE_ENC_TEST_VECTORS 2576da7f033dSHerbert Xu }, 2577da7f033dSHerbert Xu .dec = { 2578da7f033dSHerbert Xu .vecs = cts_mode_dec_tv_template, 2579da7f033dSHerbert Xu .count = CTS_MODE_DEC_TEST_VECTORS 2580da7f033dSHerbert Xu } 2581da7f033dSHerbert Xu } 2582da7f033dSHerbert Xu } 2583da7f033dSHerbert Xu }, { 2584da7f033dSHerbert Xu .alg = "deflate", 2585da7f033dSHerbert Xu .test = alg_test_comp, 25860818904dSMilan Broz .fips_allowed = 1, 2587da7f033dSHerbert Xu .suite = { 2588da7f033dSHerbert Xu .comp = { 2589da7f033dSHerbert Xu .comp = { 2590da7f033dSHerbert Xu .vecs = deflate_comp_tv_template, 2591da7f033dSHerbert Xu .count = DEFLATE_COMP_TEST_VECTORS 2592da7f033dSHerbert Xu }, 2593da7f033dSHerbert Xu .decomp = { 2594da7f033dSHerbert Xu .vecs = deflate_decomp_tv_template, 2595da7f033dSHerbert Xu .count = DEFLATE_DECOMP_TEST_VECTORS 2596da7f033dSHerbert Xu } 2597da7f033dSHerbert Xu } 2598da7f033dSHerbert Xu } 2599da7f033dSHerbert Xu }, { 2600e448370dSJussi Kivilinna .alg = "digest_null", 2601e448370dSJussi Kivilinna .test = alg_test_null, 2602e448370dSJussi Kivilinna }, { 260364d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes128", 260464d1cdfbSStephan Mueller .test = alg_test_drbg, 260564d1cdfbSStephan Mueller .fips_allowed = 1, 260664d1cdfbSStephan Mueller .suite = { 260764d1cdfbSStephan Mueller .drbg = { 260864d1cdfbSStephan Mueller .vecs = drbg_nopr_ctr_aes128_tv_template, 260964d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_ctr_aes128_tv_template) 261064d1cdfbSStephan Mueller } 261164d1cdfbSStephan Mueller } 261264d1cdfbSStephan Mueller }, { 261364d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes192", 261464d1cdfbSStephan Mueller .test = alg_test_drbg, 261564d1cdfbSStephan Mueller .fips_allowed = 1, 261664d1cdfbSStephan Mueller .suite = { 261764d1cdfbSStephan Mueller .drbg = { 261864d1cdfbSStephan Mueller .vecs = drbg_nopr_ctr_aes192_tv_template, 261964d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_ctr_aes192_tv_template) 262064d1cdfbSStephan Mueller } 262164d1cdfbSStephan Mueller } 262264d1cdfbSStephan Mueller }, { 262364d1cdfbSStephan Mueller .alg = "drbg_nopr_ctr_aes256", 262464d1cdfbSStephan Mueller .test = alg_test_drbg, 262564d1cdfbSStephan Mueller .fips_allowed = 1, 262664d1cdfbSStephan Mueller .suite = { 262764d1cdfbSStephan Mueller .drbg = { 262864d1cdfbSStephan Mueller .vecs = drbg_nopr_ctr_aes256_tv_template, 262964d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_ctr_aes256_tv_template) 263064d1cdfbSStephan Mueller } 263164d1cdfbSStephan Mueller } 263264d1cdfbSStephan Mueller }, { 263364d1cdfbSStephan Mueller /* 263464d1cdfbSStephan Mueller * There is no need to specifically test the DRBG with every 263564d1cdfbSStephan Mueller * backend cipher -- covered by drbg_nopr_hmac_sha256 test 263664d1cdfbSStephan Mueller */ 263764d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha1", 263864d1cdfbSStephan Mueller .fips_allowed = 1, 263964d1cdfbSStephan Mueller .test = alg_test_null, 264064d1cdfbSStephan Mueller }, { 264164d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha256", 264264d1cdfbSStephan Mueller .test = alg_test_drbg, 264364d1cdfbSStephan Mueller .fips_allowed = 1, 264464d1cdfbSStephan Mueller .suite = { 264564d1cdfbSStephan Mueller .drbg = { 264664d1cdfbSStephan Mueller .vecs = drbg_nopr_hmac_sha256_tv_template, 264764d1cdfbSStephan Mueller .count = 264864d1cdfbSStephan Mueller ARRAY_SIZE(drbg_nopr_hmac_sha256_tv_template) 264964d1cdfbSStephan Mueller } 265064d1cdfbSStephan Mueller } 265164d1cdfbSStephan Mueller }, { 265264d1cdfbSStephan Mueller /* covered by drbg_nopr_hmac_sha256 test */ 265364d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha384", 265464d1cdfbSStephan Mueller .fips_allowed = 1, 265564d1cdfbSStephan Mueller .test = alg_test_null, 265664d1cdfbSStephan Mueller }, { 265764d1cdfbSStephan Mueller .alg = "drbg_nopr_hmac_sha512", 265864d1cdfbSStephan Mueller .test = alg_test_null, 265964d1cdfbSStephan Mueller .fips_allowed = 1, 266064d1cdfbSStephan Mueller }, { 266164d1cdfbSStephan Mueller .alg = "drbg_nopr_sha1", 266264d1cdfbSStephan Mueller .fips_allowed = 1, 266364d1cdfbSStephan Mueller .test = alg_test_null, 266464d1cdfbSStephan Mueller }, { 266564d1cdfbSStephan Mueller .alg = "drbg_nopr_sha256", 266664d1cdfbSStephan Mueller .test = alg_test_drbg, 266764d1cdfbSStephan Mueller .fips_allowed = 1, 266864d1cdfbSStephan Mueller .suite = { 266964d1cdfbSStephan Mueller .drbg = { 267064d1cdfbSStephan Mueller .vecs = drbg_nopr_sha256_tv_template, 267164d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_nopr_sha256_tv_template) 267264d1cdfbSStephan Mueller } 267364d1cdfbSStephan Mueller } 267464d1cdfbSStephan Mueller }, { 267564d1cdfbSStephan Mueller /* covered by drbg_nopr_sha256 test */ 267664d1cdfbSStephan Mueller .alg = "drbg_nopr_sha384", 267764d1cdfbSStephan Mueller .fips_allowed = 1, 267864d1cdfbSStephan Mueller .test = alg_test_null, 267964d1cdfbSStephan Mueller }, { 268064d1cdfbSStephan Mueller .alg = "drbg_nopr_sha512", 268164d1cdfbSStephan Mueller .fips_allowed = 1, 268264d1cdfbSStephan Mueller .test = alg_test_null, 268364d1cdfbSStephan Mueller }, { 268464d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes128", 268564d1cdfbSStephan Mueller .test = alg_test_drbg, 268664d1cdfbSStephan Mueller .fips_allowed = 1, 268764d1cdfbSStephan Mueller .suite = { 268864d1cdfbSStephan Mueller .drbg = { 268964d1cdfbSStephan Mueller .vecs = drbg_pr_ctr_aes128_tv_template, 269064d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_pr_ctr_aes128_tv_template) 269164d1cdfbSStephan Mueller } 269264d1cdfbSStephan Mueller } 269364d1cdfbSStephan Mueller }, { 269464d1cdfbSStephan Mueller /* covered by drbg_pr_ctr_aes128 test */ 269564d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes192", 269664d1cdfbSStephan Mueller .fips_allowed = 1, 269764d1cdfbSStephan Mueller .test = alg_test_null, 269864d1cdfbSStephan Mueller }, { 269964d1cdfbSStephan Mueller .alg = "drbg_pr_ctr_aes256", 270064d1cdfbSStephan Mueller .fips_allowed = 1, 270164d1cdfbSStephan Mueller .test = alg_test_null, 270264d1cdfbSStephan Mueller }, { 270364d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha1", 270464d1cdfbSStephan Mueller .fips_allowed = 1, 270564d1cdfbSStephan Mueller .test = alg_test_null, 270664d1cdfbSStephan Mueller }, { 270764d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha256", 270864d1cdfbSStephan Mueller .test = alg_test_drbg, 270964d1cdfbSStephan Mueller .fips_allowed = 1, 271064d1cdfbSStephan Mueller .suite = { 271164d1cdfbSStephan Mueller .drbg = { 271264d1cdfbSStephan Mueller .vecs = drbg_pr_hmac_sha256_tv_template, 271364d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_pr_hmac_sha256_tv_template) 271464d1cdfbSStephan Mueller } 271564d1cdfbSStephan Mueller } 271664d1cdfbSStephan Mueller }, { 271764d1cdfbSStephan Mueller /* covered by drbg_pr_hmac_sha256 test */ 271864d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha384", 271964d1cdfbSStephan Mueller .fips_allowed = 1, 272064d1cdfbSStephan Mueller .test = alg_test_null, 272164d1cdfbSStephan Mueller }, { 272264d1cdfbSStephan Mueller .alg = "drbg_pr_hmac_sha512", 272364d1cdfbSStephan Mueller .test = alg_test_null, 272464d1cdfbSStephan Mueller .fips_allowed = 1, 272564d1cdfbSStephan Mueller }, { 272664d1cdfbSStephan Mueller .alg = "drbg_pr_sha1", 272764d1cdfbSStephan Mueller .fips_allowed = 1, 272864d1cdfbSStephan Mueller .test = alg_test_null, 272964d1cdfbSStephan Mueller }, { 273064d1cdfbSStephan Mueller .alg = "drbg_pr_sha256", 273164d1cdfbSStephan Mueller .test = alg_test_drbg, 273264d1cdfbSStephan Mueller .fips_allowed = 1, 273364d1cdfbSStephan Mueller .suite = { 273464d1cdfbSStephan Mueller .drbg = { 273564d1cdfbSStephan Mueller .vecs = drbg_pr_sha256_tv_template, 273664d1cdfbSStephan Mueller .count = ARRAY_SIZE(drbg_pr_sha256_tv_template) 273764d1cdfbSStephan Mueller } 273864d1cdfbSStephan Mueller } 273964d1cdfbSStephan Mueller }, { 274064d1cdfbSStephan Mueller /* covered by drbg_pr_sha256 test */ 274164d1cdfbSStephan Mueller .alg = "drbg_pr_sha384", 274264d1cdfbSStephan Mueller .fips_allowed = 1, 274364d1cdfbSStephan Mueller .test = alg_test_null, 274464d1cdfbSStephan Mueller }, { 274564d1cdfbSStephan Mueller .alg = "drbg_pr_sha512", 274664d1cdfbSStephan Mueller .fips_allowed = 1, 274764d1cdfbSStephan Mueller .test = alg_test_null, 274864d1cdfbSStephan Mueller }, { 2749863b557aSYouquan, Song .alg = "ecb(__aes-aesni)", 2750863b557aSYouquan, Song .test = alg_test_null, 27516c79294fSMilan Broz .fips_allowed = 1, 2752863b557aSYouquan, Song }, { 2753da7f033dSHerbert Xu .alg = "ecb(aes)", 27541aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2755a1915d51SJarod Wilson .fips_allowed = 1, 2756da7f033dSHerbert Xu .suite = { 2757da7f033dSHerbert Xu .cipher = { 2758da7f033dSHerbert Xu .enc = { 2759da7f033dSHerbert Xu .vecs = aes_enc_tv_template, 2760da7f033dSHerbert Xu .count = AES_ENC_TEST_VECTORS 2761da7f033dSHerbert Xu }, 2762da7f033dSHerbert Xu .dec = { 2763da7f033dSHerbert Xu .vecs = aes_dec_tv_template, 2764da7f033dSHerbert Xu .count = AES_DEC_TEST_VECTORS 2765da7f033dSHerbert Xu } 2766da7f033dSHerbert Xu } 2767da7f033dSHerbert Xu } 2768da7f033dSHerbert Xu }, { 2769da7f033dSHerbert Xu .alg = "ecb(anubis)", 27701aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2771da7f033dSHerbert Xu .suite = { 2772da7f033dSHerbert Xu .cipher = { 2773da7f033dSHerbert Xu .enc = { 2774da7f033dSHerbert Xu .vecs = anubis_enc_tv_template, 2775da7f033dSHerbert Xu .count = ANUBIS_ENC_TEST_VECTORS 2776da7f033dSHerbert Xu }, 2777da7f033dSHerbert Xu .dec = { 2778da7f033dSHerbert Xu .vecs = anubis_dec_tv_template, 2779da7f033dSHerbert Xu .count = ANUBIS_DEC_TEST_VECTORS 2780da7f033dSHerbert Xu } 2781da7f033dSHerbert Xu } 2782da7f033dSHerbert Xu } 2783da7f033dSHerbert Xu }, { 2784da7f033dSHerbert Xu .alg = "ecb(arc4)", 27851aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2786da7f033dSHerbert Xu .suite = { 2787da7f033dSHerbert Xu .cipher = { 2788da7f033dSHerbert Xu .enc = { 2789da7f033dSHerbert Xu .vecs = arc4_enc_tv_template, 2790da7f033dSHerbert Xu .count = ARC4_ENC_TEST_VECTORS 2791da7f033dSHerbert Xu }, 2792da7f033dSHerbert Xu .dec = { 2793da7f033dSHerbert Xu .vecs = arc4_dec_tv_template, 2794da7f033dSHerbert Xu .count = ARC4_DEC_TEST_VECTORS 2795da7f033dSHerbert Xu } 2796da7f033dSHerbert Xu } 2797da7f033dSHerbert Xu } 2798da7f033dSHerbert Xu }, { 2799da7f033dSHerbert Xu .alg = "ecb(blowfish)", 28001aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2801da7f033dSHerbert Xu .suite = { 2802da7f033dSHerbert Xu .cipher = { 2803da7f033dSHerbert Xu .enc = { 2804da7f033dSHerbert Xu .vecs = bf_enc_tv_template, 2805da7f033dSHerbert Xu .count = BF_ENC_TEST_VECTORS 2806da7f033dSHerbert Xu }, 2807da7f033dSHerbert Xu .dec = { 2808da7f033dSHerbert Xu .vecs = bf_dec_tv_template, 2809da7f033dSHerbert Xu .count = BF_DEC_TEST_VECTORS 2810da7f033dSHerbert Xu } 2811da7f033dSHerbert Xu } 2812da7f033dSHerbert Xu } 2813da7f033dSHerbert Xu }, { 2814da7f033dSHerbert Xu .alg = "ecb(camellia)", 28151aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2816da7f033dSHerbert Xu .suite = { 2817da7f033dSHerbert Xu .cipher = { 2818da7f033dSHerbert Xu .enc = { 2819da7f033dSHerbert Xu .vecs = camellia_enc_tv_template, 2820da7f033dSHerbert Xu .count = CAMELLIA_ENC_TEST_VECTORS 2821da7f033dSHerbert Xu }, 2822da7f033dSHerbert Xu .dec = { 2823da7f033dSHerbert Xu .vecs = camellia_dec_tv_template, 2824da7f033dSHerbert Xu .count = CAMELLIA_DEC_TEST_VECTORS 2825da7f033dSHerbert Xu } 2826da7f033dSHerbert Xu } 2827da7f033dSHerbert Xu } 2828da7f033dSHerbert Xu }, { 2829da7f033dSHerbert Xu .alg = "ecb(cast5)", 28301aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2831da7f033dSHerbert Xu .suite = { 2832da7f033dSHerbert Xu .cipher = { 2833da7f033dSHerbert Xu .enc = { 2834da7f033dSHerbert Xu .vecs = cast5_enc_tv_template, 2835da7f033dSHerbert Xu .count = CAST5_ENC_TEST_VECTORS 2836da7f033dSHerbert Xu }, 2837da7f033dSHerbert Xu .dec = { 2838da7f033dSHerbert Xu .vecs = cast5_dec_tv_template, 2839da7f033dSHerbert Xu .count = CAST5_DEC_TEST_VECTORS 2840da7f033dSHerbert Xu } 2841da7f033dSHerbert Xu } 2842da7f033dSHerbert Xu } 2843da7f033dSHerbert Xu }, { 2844da7f033dSHerbert Xu .alg = "ecb(cast6)", 28451aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2846da7f033dSHerbert Xu .suite = { 2847da7f033dSHerbert Xu .cipher = { 2848da7f033dSHerbert Xu .enc = { 2849da7f033dSHerbert Xu .vecs = cast6_enc_tv_template, 2850da7f033dSHerbert Xu .count = CAST6_ENC_TEST_VECTORS 2851da7f033dSHerbert Xu }, 2852da7f033dSHerbert Xu .dec = { 2853da7f033dSHerbert Xu .vecs = cast6_dec_tv_template, 2854da7f033dSHerbert Xu .count = CAST6_DEC_TEST_VECTORS 2855da7f033dSHerbert Xu } 2856da7f033dSHerbert Xu } 2857da7f033dSHerbert Xu } 2858da7f033dSHerbert Xu }, { 2859e448370dSJussi Kivilinna .alg = "ecb(cipher_null)", 2860e448370dSJussi Kivilinna .test = alg_test_null, 2861e448370dSJussi Kivilinna }, { 2862da7f033dSHerbert Xu .alg = "ecb(des)", 28631aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2864a1915d51SJarod Wilson .fips_allowed = 1, 2865da7f033dSHerbert Xu .suite = { 2866da7f033dSHerbert Xu .cipher = { 2867da7f033dSHerbert Xu .enc = { 2868da7f033dSHerbert Xu .vecs = des_enc_tv_template, 2869da7f033dSHerbert Xu .count = DES_ENC_TEST_VECTORS 2870da7f033dSHerbert Xu }, 2871da7f033dSHerbert Xu .dec = { 2872da7f033dSHerbert Xu .vecs = des_dec_tv_template, 2873da7f033dSHerbert Xu .count = DES_DEC_TEST_VECTORS 2874da7f033dSHerbert Xu } 2875da7f033dSHerbert Xu } 2876da7f033dSHerbert Xu } 2877da7f033dSHerbert Xu }, { 2878da7f033dSHerbert Xu .alg = "ecb(des3_ede)", 28791aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2880a1915d51SJarod Wilson .fips_allowed = 1, 2881da7f033dSHerbert Xu .suite = { 2882da7f033dSHerbert Xu .cipher = { 2883da7f033dSHerbert Xu .enc = { 2884da7f033dSHerbert Xu .vecs = des3_ede_enc_tv_template, 2885da7f033dSHerbert Xu .count = DES3_EDE_ENC_TEST_VECTORS 2886da7f033dSHerbert Xu }, 2887da7f033dSHerbert Xu .dec = { 2888da7f033dSHerbert Xu .vecs = des3_ede_dec_tv_template, 2889da7f033dSHerbert Xu .count = DES3_EDE_DEC_TEST_VECTORS 2890da7f033dSHerbert Xu } 2891da7f033dSHerbert Xu } 2892da7f033dSHerbert Xu } 2893da7f033dSHerbert Xu }, { 289466e5bd00SJussi Kivilinna .alg = "ecb(fcrypt)", 289566e5bd00SJussi Kivilinna .test = alg_test_skcipher, 289666e5bd00SJussi Kivilinna .suite = { 289766e5bd00SJussi Kivilinna .cipher = { 289866e5bd00SJussi Kivilinna .enc = { 289966e5bd00SJussi Kivilinna .vecs = fcrypt_pcbc_enc_tv_template, 290066e5bd00SJussi Kivilinna .count = 1 290166e5bd00SJussi Kivilinna }, 290266e5bd00SJussi Kivilinna .dec = { 290366e5bd00SJussi Kivilinna .vecs = fcrypt_pcbc_dec_tv_template, 290466e5bd00SJussi Kivilinna .count = 1 290566e5bd00SJussi Kivilinna } 290666e5bd00SJussi Kivilinna } 290766e5bd00SJussi Kivilinna } 290866e5bd00SJussi Kivilinna }, { 2909da7f033dSHerbert Xu .alg = "ecb(khazad)", 29101aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2911da7f033dSHerbert Xu .suite = { 2912da7f033dSHerbert Xu .cipher = { 2913da7f033dSHerbert Xu .enc = { 2914da7f033dSHerbert Xu .vecs = khazad_enc_tv_template, 2915da7f033dSHerbert Xu .count = KHAZAD_ENC_TEST_VECTORS 2916da7f033dSHerbert Xu }, 2917da7f033dSHerbert Xu .dec = { 2918da7f033dSHerbert Xu .vecs = khazad_dec_tv_template, 2919da7f033dSHerbert Xu .count = KHAZAD_DEC_TEST_VECTORS 2920da7f033dSHerbert Xu } 2921da7f033dSHerbert Xu } 2922da7f033dSHerbert Xu } 2923da7f033dSHerbert Xu }, { 2924da7f033dSHerbert Xu .alg = "ecb(seed)", 29251aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2926da7f033dSHerbert Xu .suite = { 2927da7f033dSHerbert Xu .cipher = { 2928da7f033dSHerbert Xu .enc = { 2929da7f033dSHerbert Xu .vecs = seed_enc_tv_template, 2930da7f033dSHerbert Xu .count = SEED_ENC_TEST_VECTORS 2931da7f033dSHerbert Xu }, 2932da7f033dSHerbert Xu .dec = { 2933da7f033dSHerbert Xu .vecs = seed_dec_tv_template, 2934da7f033dSHerbert Xu .count = SEED_DEC_TEST_VECTORS 2935da7f033dSHerbert Xu } 2936da7f033dSHerbert Xu } 2937da7f033dSHerbert Xu } 2938da7f033dSHerbert Xu }, { 2939da7f033dSHerbert Xu .alg = "ecb(serpent)", 29401aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2941da7f033dSHerbert Xu .suite = { 2942da7f033dSHerbert Xu .cipher = { 2943da7f033dSHerbert Xu .enc = { 2944da7f033dSHerbert Xu .vecs = serpent_enc_tv_template, 2945da7f033dSHerbert Xu .count = SERPENT_ENC_TEST_VECTORS 2946da7f033dSHerbert Xu }, 2947da7f033dSHerbert Xu .dec = { 2948da7f033dSHerbert Xu .vecs = serpent_dec_tv_template, 2949da7f033dSHerbert Xu .count = SERPENT_DEC_TEST_VECTORS 2950da7f033dSHerbert Xu } 2951da7f033dSHerbert Xu } 2952da7f033dSHerbert Xu } 2953da7f033dSHerbert Xu }, { 2954da7f033dSHerbert Xu .alg = "ecb(tea)", 29551aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2956da7f033dSHerbert Xu .suite = { 2957da7f033dSHerbert Xu .cipher = { 2958da7f033dSHerbert Xu .enc = { 2959da7f033dSHerbert Xu .vecs = tea_enc_tv_template, 2960da7f033dSHerbert Xu .count = TEA_ENC_TEST_VECTORS 2961da7f033dSHerbert Xu }, 2962da7f033dSHerbert Xu .dec = { 2963da7f033dSHerbert Xu .vecs = tea_dec_tv_template, 2964da7f033dSHerbert Xu .count = TEA_DEC_TEST_VECTORS 2965da7f033dSHerbert Xu } 2966da7f033dSHerbert Xu } 2967da7f033dSHerbert Xu } 2968da7f033dSHerbert Xu }, { 2969da7f033dSHerbert Xu .alg = "ecb(tnepres)", 29701aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2971da7f033dSHerbert Xu .suite = { 2972da7f033dSHerbert Xu .cipher = { 2973da7f033dSHerbert Xu .enc = { 2974da7f033dSHerbert Xu .vecs = tnepres_enc_tv_template, 2975da7f033dSHerbert Xu .count = TNEPRES_ENC_TEST_VECTORS 2976da7f033dSHerbert Xu }, 2977da7f033dSHerbert Xu .dec = { 2978da7f033dSHerbert Xu .vecs = tnepres_dec_tv_template, 2979da7f033dSHerbert Xu .count = TNEPRES_DEC_TEST_VECTORS 2980da7f033dSHerbert Xu } 2981da7f033dSHerbert Xu } 2982da7f033dSHerbert Xu } 2983da7f033dSHerbert Xu }, { 2984da7f033dSHerbert Xu .alg = "ecb(twofish)", 29851aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2986da7f033dSHerbert Xu .suite = { 2987da7f033dSHerbert Xu .cipher = { 2988da7f033dSHerbert Xu .enc = { 2989da7f033dSHerbert Xu .vecs = tf_enc_tv_template, 2990da7f033dSHerbert Xu .count = TF_ENC_TEST_VECTORS 2991da7f033dSHerbert Xu }, 2992da7f033dSHerbert Xu .dec = { 2993da7f033dSHerbert Xu .vecs = tf_dec_tv_template, 2994da7f033dSHerbert Xu .count = TF_DEC_TEST_VECTORS 2995da7f033dSHerbert Xu } 2996da7f033dSHerbert Xu } 2997da7f033dSHerbert Xu } 2998da7f033dSHerbert Xu }, { 2999da7f033dSHerbert Xu .alg = "ecb(xeta)", 30001aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3001da7f033dSHerbert Xu .suite = { 3002da7f033dSHerbert Xu .cipher = { 3003da7f033dSHerbert Xu .enc = { 3004da7f033dSHerbert Xu .vecs = xeta_enc_tv_template, 3005da7f033dSHerbert Xu .count = XETA_ENC_TEST_VECTORS 3006da7f033dSHerbert Xu }, 3007da7f033dSHerbert Xu .dec = { 3008da7f033dSHerbert Xu .vecs = xeta_dec_tv_template, 3009da7f033dSHerbert Xu .count = XETA_DEC_TEST_VECTORS 3010da7f033dSHerbert Xu } 3011da7f033dSHerbert Xu } 3012da7f033dSHerbert Xu } 3013da7f033dSHerbert Xu }, { 3014da7f033dSHerbert Xu .alg = "ecb(xtea)", 30151aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3016da7f033dSHerbert Xu .suite = { 3017da7f033dSHerbert Xu .cipher = { 3018da7f033dSHerbert Xu .enc = { 3019da7f033dSHerbert Xu .vecs = xtea_enc_tv_template, 3020da7f033dSHerbert Xu .count = XTEA_ENC_TEST_VECTORS 3021da7f033dSHerbert Xu }, 3022da7f033dSHerbert Xu .dec = { 3023da7f033dSHerbert Xu .vecs = xtea_dec_tv_template, 3024da7f033dSHerbert Xu .count = XTEA_DEC_TEST_VECTORS 3025da7f033dSHerbert Xu } 3026da7f033dSHerbert Xu } 3027da7f033dSHerbert Xu } 3028da7f033dSHerbert Xu }, { 3029da7f033dSHerbert Xu .alg = "gcm(aes)", 3030da7f033dSHerbert Xu .test = alg_test_aead, 3031a1915d51SJarod Wilson .fips_allowed = 1, 3032da7f033dSHerbert Xu .suite = { 3033da7f033dSHerbert Xu .aead = { 3034da7f033dSHerbert Xu .enc = { 3035da7f033dSHerbert Xu .vecs = aes_gcm_enc_tv_template, 3036da7f033dSHerbert Xu .count = AES_GCM_ENC_TEST_VECTORS 3037da7f033dSHerbert Xu }, 3038da7f033dSHerbert Xu .dec = { 3039da7f033dSHerbert Xu .vecs = aes_gcm_dec_tv_template, 3040da7f033dSHerbert Xu .count = AES_GCM_DEC_TEST_VECTORS 3041da7f033dSHerbert Xu } 3042da7f033dSHerbert Xu } 3043da7f033dSHerbert Xu } 3044da7f033dSHerbert Xu }, { 3045507069c9SYouquan, Song .alg = "ghash", 3046507069c9SYouquan, Song .test = alg_test_hash, 304718c0ebd2SJarod Wilson .fips_allowed = 1, 3048507069c9SYouquan, Song .suite = { 3049507069c9SYouquan, Song .hash = { 3050507069c9SYouquan, Song .vecs = ghash_tv_template, 3051507069c9SYouquan, Song .count = GHASH_TEST_VECTORS 3052507069c9SYouquan, Song } 3053507069c9SYouquan, Song } 3054507069c9SYouquan, Song }, { 3055a482b081SSonic Zhang .alg = "hmac(crc32)", 3056a482b081SSonic Zhang .test = alg_test_hash, 3057a482b081SSonic Zhang .suite = { 3058a482b081SSonic Zhang .hash = { 3059a482b081SSonic Zhang .vecs = bfin_crc_tv_template, 3060a482b081SSonic Zhang .count = BFIN_CRC_TEST_VECTORS 3061a482b081SSonic Zhang } 3062a482b081SSonic Zhang } 3063a482b081SSonic Zhang }, { 3064da7f033dSHerbert Xu .alg = "hmac(md5)", 3065da7f033dSHerbert Xu .test = alg_test_hash, 3066da7f033dSHerbert Xu .suite = { 3067da7f033dSHerbert Xu .hash = { 3068da7f033dSHerbert Xu .vecs = hmac_md5_tv_template, 3069da7f033dSHerbert Xu .count = HMAC_MD5_TEST_VECTORS 3070da7f033dSHerbert Xu } 3071da7f033dSHerbert Xu } 3072da7f033dSHerbert Xu }, { 3073da7f033dSHerbert Xu .alg = "hmac(rmd128)", 3074da7f033dSHerbert Xu .test = alg_test_hash, 3075da7f033dSHerbert Xu .suite = { 3076da7f033dSHerbert Xu .hash = { 3077da7f033dSHerbert Xu .vecs = hmac_rmd128_tv_template, 3078da7f033dSHerbert Xu .count = HMAC_RMD128_TEST_VECTORS 3079da7f033dSHerbert Xu } 3080da7f033dSHerbert Xu } 3081da7f033dSHerbert Xu }, { 3082da7f033dSHerbert Xu .alg = "hmac(rmd160)", 3083da7f033dSHerbert Xu .test = alg_test_hash, 3084da7f033dSHerbert Xu .suite = { 3085da7f033dSHerbert Xu .hash = { 3086da7f033dSHerbert Xu .vecs = hmac_rmd160_tv_template, 3087da7f033dSHerbert Xu .count = HMAC_RMD160_TEST_VECTORS 3088da7f033dSHerbert Xu } 3089da7f033dSHerbert Xu } 3090da7f033dSHerbert Xu }, { 3091da7f033dSHerbert Xu .alg = "hmac(sha1)", 3092da7f033dSHerbert Xu .test = alg_test_hash, 3093a1915d51SJarod Wilson .fips_allowed = 1, 3094da7f033dSHerbert Xu .suite = { 3095da7f033dSHerbert Xu .hash = { 3096da7f033dSHerbert Xu .vecs = hmac_sha1_tv_template, 3097da7f033dSHerbert Xu .count = HMAC_SHA1_TEST_VECTORS 3098da7f033dSHerbert Xu } 3099da7f033dSHerbert Xu } 3100da7f033dSHerbert Xu }, { 3101da7f033dSHerbert Xu .alg = "hmac(sha224)", 3102da7f033dSHerbert Xu .test = alg_test_hash, 3103a1915d51SJarod Wilson .fips_allowed = 1, 3104da7f033dSHerbert Xu .suite = { 3105da7f033dSHerbert Xu .hash = { 3106da7f033dSHerbert Xu .vecs = hmac_sha224_tv_template, 3107da7f033dSHerbert Xu .count = HMAC_SHA224_TEST_VECTORS 3108da7f033dSHerbert Xu } 3109da7f033dSHerbert Xu } 3110da7f033dSHerbert Xu }, { 3111da7f033dSHerbert Xu .alg = "hmac(sha256)", 3112da7f033dSHerbert Xu .test = alg_test_hash, 3113a1915d51SJarod Wilson .fips_allowed = 1, 3114da7f033dSHerbert Xu .suite = { 3115da7f033dSHerbert Xu .hash = { 3116da7f033dSHerbert Xu .vecs = hmac_sha256_tv_template, 3117da7f033dSHerbert Xu .count = HMAC_SHA256_TEST_VECTORS 3118da7f033dSHerbert Xu } 3119da7f033dSHerbert Xu } 3120da7f033dSHerbert Xu }, { 3121da7f033dSHerbert Xu .alg = "hmac(sha384)", 3122da7f033dSHerbert Xu .test = alg_test_hash, 3123a1915d51SJarod Wilson .fips_allowed = 1, 3124da7f033dSHerbert Xu .suite = { 3125da7f033dSHerbert Xu .hash = { 3126da7f033dSHerbert Xu .vecs = hmac_sha384_tv_template, 3127da7f033dSHerbert Xu .count = HMAC_SHA384_TEST_VECTORS 3128da7f033dSHerbert Xu } 3129da7f033dSHerbert Xu } 3130da7f033dSHerbert Xu }, { 3131da7f033dSHerbert Xu .alg = "hmac(sha512)", 3132da7f033dSHerbert Xu .test = alg_test_hash, 3133a1915d51SJarod Wilson .fips_allowed = 1, 3134da7f033dSHerbert Xu .suite = { 3135da7f033dSHerbert Xu .hash = { 3136da7f033dSHerbert Xu .vecs = hmac_sha512_tv_template, 3137da7f033dSHerbert Xu .count = HMAC_SHA512_TEST_VECTORS 3138da7f033dSHerbert Xu } 3139da7f033dSHerbert Xu } 3140da7f033dSHerbert Xu }, { 3141da7f033dSHerbert Xu .alg = "lrw(aes)", 31421aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3143da7f033dSHerbert Xu .suite = { 3144da7f033dSHerbert Xu .cipher = { 3145da7f033dSHerbert Xu .enc = { 3146da7f033dSHerbert Xu .vecs = aes_lrw_enc_tv_template, 3147da7f033dSHerbert Xu .count = AES_LRW_ENC_TEST_VECTORS 3148da7f033dSHerbert Xu }, 3149da7f033dSHerbert Xu .dec = { 3150da7f033dSHerbert Xu .vecs = aes_lrw_dec_tv_template, 3151da7f033dSHerbert Xu .count = AES_LRW_DEC_TEST_VECTORS 3152da7f033dSHerbert Xu } 3153da7f033dSHerbert Xu } 3154da7f033dSHerbert Xu } 3155da7f033dSHerbert Xu }, { 31560840605eSJussi Kivilinna .alg = "lrw(camellia)", 31570840605eSJussi Kivilinna .test = alg_test_skcipher, 31580840605eSJussi Kivilinna .suite = { 31590840605eSJussi Kivilinna .cipher = { 31600840605eSJussi Kivilinna .enc = { 31610840605eSJussi Kivilinna .vecs = camellia_lrw_enc_tv_template, 31620840605eSJussi Kivilinna .count = CAMELLIA_LRW_ENC_TEST_VECTORS 31630840605eSJussi Kivilinna }, 31640840605eSJussi Kivilinna .dec = { 31650840605eSJussi Kivilinna .vecs = camellia_lrw_dec_tv_template, 31660840605eSJussi Kivilinna .count = CAMELLIA_LRW_DEC_TEST_VECTORS 31670840605eSJussi Kivilinna } 31680840605eSJussi Kivilinna } 31690840605eSJussi Kivilinna } 31700840605eSJussi Kivilinna }, { 31719b8b0405SJohannes Goetzfried .alg = "lrw(cast6)", 31729b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 31739b8b0405SJohannes Goetzfried .suite = { 31749b8b0405SJohannes Goetzfried .cipher = { 31759b8b0405SJohannes Goetzfried .enc = { 31769b8b0405SJohannes Goetzfried .vecs = cast6_lrw_enc_tv_template, 31779b8b0405SJohannes Goetzfried .count = CAST6_LRW_ENC_TEST_VECTORS 31789b8b0405SJohannes Goetzfried }, 31799b8b0405SJohannes Goetzfried .dec = { 31809b8b0405SJohannes Goetzfried .vecs = cast6_lrw_dec_tv_template, 31819b8b0405SJohannes Goetzfried .count = CAST6_LRW_DEC_TEST_VECTORS 31829b8b0405SJohannes Goetzfried } 31839b8b0405SJohannes Goetzfried } 31849b8b0405SJohannes Goetzfried } 31859b8b0405SJohannes Goetzfried }, { 3186d7bfc0faSJussi Kivilinna .alg = "lrw(serpent)", 3187d7bfc0faSJussi Kivilinna .test = alg_test_skcipher, 3188d7bfc0faSJussi Kivilinna .suite = { 3189d7bfc0faSJussi Kivilinna .cipher = { 3190d7bfc0faSJussi Kivilinna .enc = { 3191d7bfc0faSJussi Kivilinna .vecs = serpent_lrw_enc_tv_template, 3192d7bfc0faSJussi Kivilinna .count = SERPENT_LRW_ENC_TEST_VECTORS 3193d7bfc0faSJussi Kivilinna }, 3194d7bfc0faSJussi Kivilinna .dec = { 3195d7bfc0faSJussi Kivilinna .vecs = serpent_lrw_dec_tv_template, 3196d7bfc0faSJussi Kivilinna .count = SERPENT_LRW_DEC_TEST_VECTORS 3197d7bfc0faSJussi Kivilinna } 3198d7bfc0faSJussi Kivilinna } 3199d7bfc0faSJussi Kivilinna } 3200d7bfc0faSJussi Kivilinna }, { 32010b2a1551SJussi Kivilinna .alg = "lrw(twofish)", 32020b2a1551SJussi Kivilinna .test = alg_test_skcipher, 32030b2a1551SJussi Kivilinna .suite = { 32040b2a1551SJussi Kivilinna .cipher = { 32050b2a1551SJussi Kivilinna .enc = { 32060b2a1551SJussi Kivilinna .vecs = tf_lrw_enc_tv_template, 32070b2a1551SJussi Kivilinna .count = TF_LRW_ENC_TEST_VECTORS 32080b2a1551SJussi Kivilinna }, 32090b2a1551SJussi Kivilinna .dec = { 32100b2a1551SJussi Kivilinna .vecs = tf_lrw_dec_tv_template, 32110b2a1551SJussi Kivilinna .count = TF_LRW_DEC_TEST_VECTORS 32120b2a1551SJussi Kivilinna } 32130b2a1551SJussi Kivilinna } 32140b2a1551SJussi Kivilinna } 32150b2a1551SJussi Kivilinna }, { 3216da7f033dSHerbert Xu .alg = "lzo", 3217da7f033dSHerbert Xu .test = alg_test_comp, 32180818904dSMilan Broz .fips_allowed = 1, 3219da7f033dSHerbert Xu .suite = { 3220da7f033dSHerbert Xu .comp = { 3221da7f033dSHerbert Xu .comp = { 3222da7f033dSHerbert Xu .vecs = lzo_comp_tv_template, 3223da7f033dSHerbert Xu .count = LZO_COMP_TEST_VECTORS 3224da7f033dSHerbert Xu }, 3225da7f033dSHerbert Xu .decomp = { 3226da7f033dSHerbert Xu .vecs = lzo_decomp_tv_template, 3227da7f033dSHerbert Xu .count = LZO_DECOMP_TEST_VECTORS 3228da7f033dSHerbert Xu } 3229da7f033dSHerbert Xu } 3230da7f033dSHerbert Xu } 3231da7f033dSHerbert Xu }, { 3232da7f033dSHerbert Xu .alg = "md4", 3233da7f033dSHerbert Xu .test = alg_test_hash, 3234da7f033dSHerbert Xu .suite = { 3235da7f033dSHerbert Xu .hash = { 3236da7f033dSHerbert Xu .vecs = md4_tv_template, 3237da7f033dSHerbert Xu .count = MD4_TEST_VECTORS 3238da7f033dSHerbert Xu } 3239da7f033dSHerbert Xu } 3240da7f033dSHerbert Xu }, { 3241da7f033dSHerbert Xu .alg = "md5", 3242da7f033dSHerbert Xu .test = alg_test_hash, 3243da7f033dSHerbert Xu .suite = { 3244da7f033dSHerbert Xu .hash = { 3245da7f033dSHerbert Xu .vecs = md5_tv_template, 3246da7f033dSHerbert Xu .count = MD5_TEST_VECTORS 3247da7f033dSHerbert Xu } 3248da7f033dSHerbert Xu } 3249da7f033dSHerbert Xu }, { 3250da7f033dSHerbert Xu .alg = "michael_mic", 3251da7f033dSHerbert Xu .test = alg_test_hash, 3252da7f033dSHerbert Xu .suite = { 3253da7f033dSHerbert Xu .hash = { 3254da7f033dSHerbert Xu .vecs = michael_mic_tv_template, 3255da7f033dSHerbert Xu .count = MICHAEL_MIC_TEST_VECTORS 3256da7f033dSHerbert Xu } 3257da7f033dSHerbert Xu } 3258da7f033dSHerbert Xu }, { 3259ba0e14acSPuneet Saxena .alg = "ofb(aes)", 3260ba0e14acSPuneet Saxena .test = alg_test_skcipher, 3261ba0e14acSPuneet Saxena .fips_allowed = 1, 3262ba0e14acSPuneet Saxena .suite = { 3263ba0e14acSPuneet Saxena .cipher = { 3264ba0e14acSPuneet Saxena .enc = { 3265ba0e14acSPuneet Saxena .vecs = aes_ofb_enc_tv_template, 3266ba0e14acSPuneet Saxena .count = AES_OFB_ENC_TEST_VECTORS 3267ba0e14acSPuneet Saxena }, 3268ba0e14acSPuneet Saxena .dec = { 3269ba0e14acSPuneet Saxena .vecs = aes_ofb_dec_tv_template, 3270ba0e14acSPuneet Saxena .count = AES_OFB_DEC_TEST_VECTORS 3271ba0e14acSPuneet Saxena } 3272ba0e14acSPuneet Saxena } 3273ba0e14acSPuneet Saxena } 3274ba0e14acSPuneet Saxena }, { 3275da7f033dSHerbert Xu .alg = "pcbc(fcrypt)", 32761aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3277da7f033dSHerbert Xu .suite = { 3278da7f033dSHerbert Xu .cipher = { 3279da7f033dSHerbert Xu .enc = { 3280da7f033dSHerbert Xu .vecs = fcrypt_pcbc_enc_tv_template, 3281da7f033dSHerbert Xu .count = FCRYPT_ENC_TEST_VECTORS 3282da7f033dSHerbert Xu }, 3283da7f033dSHerbert Xu .dec = { 3284da7f033dSHerbert Xu .vecs = fcrypt_pcbc_dec_tv_template, 3285da7f033dSHerbert Xu .count = FCRYPT_DEC_TEST_VECTORS 3286da7f033dSHerbert Xu } 3287da7f033dSHerbert Xu } 3288da7f033dSHerbert Xu } 3289da7f033dSHerbert Xu }, { 3290da7f033dSHerbert Xu .alg = "rfc3686(ctr(aes))", 32911aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3292a1915d51SJarod Wilson .fips_allowed = 1, 3293da7f033dSHerbert Xu .suite = { 3294da7f033dSHerbert Xu .cipher = { 3295da7f033dSHerbert Xu .enc = { 3296f7cb80f2SJarod Wilson .vecs = aes_ctr_rfc3686_enc_tv_template, 3297f7cb80f2SJarod Wilson .count = AES_CTR_3686_ENC_TEST_VECTORS 3298da7f033dSHerbert Xu }, 3299da7f033dSHerbert Xu .dec = { 3300f7cb80f2SJarod Wilson .vecs = aes_ctr_rfc3686_dec_tv_template, 3301f7cb80f2SJarod Wilson .count = AES_CTR_3686_DEC_TEST_VECTORS 3302da7f033dSHerbert Xu } 3303da7f033dSHerbert Xu } 3304da7f033dSHerbert Xu } 3305da7f033dSHerbert Xu }, { 330669435b94SAdrian Hoban .alg = "rfc4106(gcm(aes))", 330769435b94SAdrian Hoban .test = alg_test_aead, 330869435b94SAdrian Hoban .suite = { 330969435b94SAdrian Hoban .aead = { 331069435b94SAdrian Hoban .enc = { 331169435b94SAdrian Hoban .vecs = aes_gcm_rfc4106_enc_tv_template, 331269435b94SAdrian Hoban .count = AES_GCM_4106_ENC_TEST_VECTORS 331369435b94SAdrian Hoban }, 331469435b94SAdrian Hoban .dec = { 331569435b94SAdrian Hoban .vecs = aes_gcm_rfc4106_dec_tv_template, 331669435b94SAdrian Hoban .count = AES_GCM_4106_DEC_TEST_VECTORS 331769435b94SAdrian Hoban } 331869435b94SAdrian Hoban } 331969435b94SAdrian Hoban } 332069435b94SAdrian Hoban }, { 33215d667322SJarod Wilson .alg = "rfc4309(ccm(aes))", 33225d667322SJarod Wilson .test = alg_test_aead, 3323a1915d51SJarod Wilson .fips_allowed = 1, 33245d667322SJarod Wilson .suite = { 33255d667322SJarod Wilson .aead = { 33265d667322SJarod Wilson .enc = { 33275d667322SJarod Wilson .vecs = aes_ccm_rfc4309_enc_tv_template, 33285d667322SJarod Wilson .count = AES_CCM_4309_ENC_TEST_VECTORS 33295d667322SJarod Wilson }, 33305d667322SJarod Wilson .dec = { 33315d667322SJarod Wilson .vecs = aes_ccm_rfc4309_dec_tv_template, 33325d667322SJarod Wilson .count = AES_CCM_4309_DEC_TEST_VECTORS 33335d667322SJarod Wilson } 33345d667322SJarod Wilson } 33355d667322SJarod Wilson } 33365d667322SJarod Wilson }, { 3337e9b7441aSJussi Kivilinna .alg = "rfc4543(gcm(aes))", 3338e9b7441aSJussi Kivilinna .test = alg_test_aead, 3339e9b7441aSJussi Kivilinna .suite = { 3340e9b7441aSJussi Kivilinna .aead = { 3341e9b7441aSJussi Kivilinna .enc = { 3342e9b7441aSJussi Kivilinna .vecs = aes_gcm_rfc4543_enc_tv_template, 3343e9b7441aSJussi Kivilinna .count = AES_GCM_4543_ENC_TEST_VECTORS 3344e9b7441aSJussi Kivilinna }, 3345e9b7441aSJussi Kivilinna .dec = { 3346e9b7441aSJussi Kivilinna .vecs = aes_gcm_rfc4543_dec_tv_template, 3347e9b7441aSJussi Kivilinna .count = AES_GCM_4543_DEC_TEST_VECTORS 3348e9b7441aSJussi Kivilinna }, 3349e9b7441aSJussi Kivilinna } 3350e9b7441aSJussi Kivilinna } 3351e9b7441aSJussi Kivilinna }, { 3352da7f033dSHerbert Xu .alg = "rmd128", 3353da7f033dSHerbert Xu .test = alg_test_hash, 3354da7f033dSHerbert Xu .suite = { 3355da7f033dSHerbert Xu .hash = { 3356da7f033dSHerbert Xu .vecs = rmd128_tv_template, 3357da7f033dSHerbert Xu .count = RMD128_TEST_VECTORS 3358da7f033dSHerbert Xu } 3359da7f033dSHerbert Xu } 3360da7f033dSHerbert Xu }, { 3361da7f033dSHerbert Xu .alg = "rmd160", 3362da7f033dSHerbert Xu .test = alg_test_hash, 3363da7f033dSHerbert Xu .suite = { 3364da7f033dSHerbert Xu .hash = { 3365da7f033dSHerbert Xu .vecs = rmd160_tv_template, 3366da7f033dSHerbert Xu .count = RMD160_TEST_VECTORS 3367da7f033dSHerbert Xu } 3368da7f033dSHerbert Xu } 3369da7f033dSHerbert Xu }, { 3370da7f033dSHerbert Xu .alg = "rmd256", 3371da7f033dSHerbert Xu .test = alg_test_hash, 3372da7f033dSHerbert Xu .suite = { 3373da7f033dSHerbert Xu .hash = { 3374da7f033dSHerbert Xu .vecs = rmd256_tv_template, 3375da7f033dSHerbert Xu .count = RMD256_TEST_VECTORS 3376da7f033dSHerbert Xu } 3377da7f033dSHerbert Xu } 3378da7f033dSHerbert Xu }, { 3379da7f033dSHerbert Xu .alg = "rmd320", 3380da7f033dSHerbert Xu .test = alg_test_hash, 3381da7f033dSHerbert Xu .suite = { 3382da7f033dSHerbert Xu .hash = { 3383da7f033dSHerbert Xu .vecs = rmd320_tv_template, 3384da7f033dSHerbert Xu .count = RMD320_TEST_VECTORS 3385da7f033dSHerbert Xu } 3386da7f033dSHerbert Xu } 3387da7f033dSHerbert Xu }, { 3388da7f033dSHerbert Xu .alg = "salsa20", 33891aa4ecd9SHerbert Xu .test = alg_test_skcipher, 3390da7f033dSHerbert Xu .suite = { 3391da7f033dSHerbert Xu .cipher = { 3392da7f033dSHerbert Xu .enc = { 3393da7f033dSHerbert Xu .vecs = salsa20_stream_enc_tv_template, 3394da7f033dSHerbert Xu .count = SALSA20_STREAM_ENC_TEST_VECTORS 3395da7f033dSHerbert Xu } 3396da7f033dSHerbert Xu } 3397da7f033dSHerbert Xu } 3398da7f033dSHerbert Xu }, { 3399da7f033dSHerbert Xu .alg = "sha1", 3400da7f033dSHerbert Xu .test = alg_test_hash, 3401a1915d51SJarod Wilson .fips_allowed = 1, 3402da7f033dSHerbert Xu .suite = { 3403da7f033dSHerbert Xu .hash = { 3404da7f033dSHerbert Xu .vecs = sha1_tv_template, 3405da7f033dSHerbert Xu .count = SHA1_TEST_VECTORS 3406da7f033dSHerbert Xu } 3407da7f033dSHerbert Xu } 3408da7f033dSHerbert Xu }, { 3409da7f033dSHerbert Xu .alg = "sha224", 3410da7f033dSHerbert Xu .test = alg_test_hash, 3411a1915d51SJarod Wilson .fips_allowed = 1, 3412da7f033dSHerbert Xu .suite = { 3413da7f033dSHerbert Xu .hash = { 3414da7f033dSHerbert Xu .vecs = sha224_tv_template, 3415da7f033dSHerbert Xu .count = SHA224_TEST_VECTORS 3416da7f033dSHerbert Xu } 3417da7f033dSHerbert Xu } 3418da7f033dSHerbert Xu }, { 3419da7f033dSHerbert Xu .alg = "sha256", 3420da7f033dSHerbert Xu .test = alg_test_hash, 3421a1915d51SJarod Wilson .fips_allowed = 1, 3422da7f033dSHerbert Xu .suite = { 3423da7f033dSHerbert Xu .hash = { 3424da7f033dSHerbert Xu .vecs = sha256_tv_template, 3425da7f033dSHerbert Xu .count = SHA256_TEST_VECTORS 3426da7f033dSHerbert Xu } 3427da7f033dSHerbert Xu } 3428da7f033dSHerbert Xu }, { 3429da7f033dSHerbert Xu .alg = "sha384", 3430da7f033dSHerbert Xu .test = alg_test_hash, 3431a1915d51SJarod Wilson .fips_allowed = 1, 3432da7f033dSHerbert Xu .suite = { 3433da7f033dSHerbert Xu .hash = { 3434da7f033dSHerbert Xu .vecs = sha384_tv_template, 3435da7f033dSHerbert Xu .count = SHA384_TEST_VECTORS 3436da7f033dSHerbert Xu } 3437da7f033dSHerbert Xu } 3438da7f033dSHerbert Xu }, { 3439da7f033dSHerbert Xu .alg = "sha512", 3440da7f033dSHerbert Xu .test = alg_test_hash, 3441a1915d51SJarod Wilson .fips_allowed = 1, 3442da7f033dSHerbert Xu .suite = { 3443da7f033dSHerbert Xu .hash = { 3444da7f033dSHerbert Xu .vecs = sha512_tv_template, 3445da7f033dSHerbert Xu .count = SHA512_TEST_VECTORS 3446da7f033dSHerbert Xu } 3447da7f033dSHerbert Xu } 3448da7f033dSHerbert Xu }, { 3449da7f033dSHerbert Xu .alg = "tgr128", 3450da7f033dSHerbert Xu .test = alg_test_hash, 3451da7f033dSHerbert Xu .suite = { 3452da7f033dSHerbert Xu .hash = { 3453da7f033dSHerbert Xu .vecs = tgr128_tv_template, 3454da7f033dSHerbert Xu .count = TGR128_TEST_VECTORS 3455da7f033dSHerbert Xu } 3456da7f033dSHerbert Xu } 3457da7f033dSHerbert Xu }, { 3458da7f033dSHerbert Xu .alg = "tgr160", 3459da7f033dSHerbert Xu .test = alg_test_hash, 3460da7f033dSHerbert Xu .suite = { 3461da7f033dSHerbert Xu .hash = { 3462da7f033dSHerbert Xu .vecs = tgr160_tv_template, 3463da7f033dSHerbert Xu .count = TGR160_TEST_VECTORS 3464da7f033dSHerbert Xu } 3465da7f033dSHerbert Xu } 3466da7f033dSHerbert Xu }, { 3467da7f033dSHerbert Xu .alg = "tgr192", 3468da7f033dSHerbert Xu .test = alg_test_hash, 3469da7f033dSHerbert Xu .suite = { 3470da7f033dSHerbert Xu .hash = { 3471da7f033dSHerbert Xu .vecs = tgr192_tv_template, 3472da7f033dSHerbert Xu .count = TGR192_TEST_VECTORS 3473da7f033dSHerbert Xu } 3474da7f033dSHerbert Xu } 3475da7f033dSHerbert Xu }, { 3476f1939f7cSShane Wang .alg = "vmac(aes)", 3477f1939f7cSShane Wang .test = alg_test_hash, 3478f1939f7cSShane Wang .suite = { 3479f1939f7cSShane Wang .hash = { 3480f1939f7cSShane Wang .vecs = aes_vmac128_tv_template, 3481f1939f7cSShane Wang .count = VMAC_AES_TEST_VECTORS 3482f1939f7cSShane Wang } 3483f1939f7cSShane Wang } 3484f1939f7cSShane Wang }, { 3485da7f033dSHerbert Xu .alg = "wp256", 3486da7f033dSHerbert Xu .test = alg_test_hash, 3487da7f033dSHerbert Xu .suite = { 3488da7f033dSHerbert Xu .hash = { 3489da7f033dSHerbert Xu .vecs = wp256_tv_template, 3490da7f033dSHerbert Xu .count = WP256_TEST_VECTORS 3491da7f033dSHerbert Xu } 3492da7f033dSHerbert Xu } 3493da7f033dSHerbert Xu }, { 3494da7f033dSHerbert Xu .alg = "wp384", 3495da7f033dSHerbert Xu .test = alg_test_hash, 3496da7f033dSHerbert Xu .suite = { 3497da7f033dSHerbert Xu .hash = { 3498da7f033dSHerbert Xu .vecs = wp384_tv_template, 3499da7f033dSHerbert Xu .count = WP384_TEST_VECTORS 3500da7f033dSHerbert Xu } 3501da7f033dSHerbert Xu } 3502da7f033dSHerbert Xu }, { 3503da7f033dSHerbert Xu .alg = "wp512", 3504da7f033dSHerbert Xu .test = alg_test_hash, 3505da7f033dSHerbert Xu .suite = { 3506da7f033dSHerbert Xu .hash = { 3507da7f033dSHerbert Xu .vecs = wp512_tv_template, 3508da7f033dSHerbert Xu .count = WP512_TEST_VECTORS 3509da7f033dSHerbert Xu } 3510da7f033dSHerbert Xu } 3511da7f033dSHerbert Xu }, { 3512da7f033dSHerbert Xu .alg = "xcbc(aes)", 3513da7f033dSHerbert Xu .test = alg_test_hash, 3514da7f033dSHerbert Xu .suite = { 3515da7f033dSHerbert Xu .hash = { 3516da7f033dSHerbert Xu .vecs = aes_xcbc128_tv_template, 3517da7f033dSHerbert Xu .count = XCBC_AES_TEST_VECTORS 3518da7f033dSHerbert Xu } 3519da7f033dSHerbert Xu } 3520da7f033dSHerbert Xu }, { 3521da7f033dSHerbert Xu .alg = "xts(aes)", 35221aa4ecd9SHerbert Xu .test = alg_test_skcipher, 35232918aa8dSJarod Wilson .fips_allowed = 1, 3524da7f033dSHerbert Xu .suite = { 3525da7f033dSHerbert Xu .cipher = { 3526da7f033dSHerbert Xu .enc = { 3527da7f033dSHerbert Xu .vecs = aes_xts_enc_tv_template, 3528da7f033dSHerbert Xu .count = AES_XTS_ENC_TEST_VECTORS 3529da7f033dSHerbert Xu }, 3530da7f033dSHerbert Xu .dec = { 3531da7f033dSHerbert Xu .vecs = aes_xts_dec_tv_template, 3532da7f033dSHerbert Xu .count = AES_XTS_DEC_TEST_VECTORS 3533da7f033dSHerbert Xu } 3534da7f033dSHerbert Xu } 3535da7f033dSHerbert Xu } 35360c01aed5SGeert Uytterhoeven }, { 35370840605eSJussi Kivilinna .alg = "xts(camellia)", 35380840605eSJussi Kivilinna .test = alg_test_skcipher, 35390840605eSJussi Kivilinna .suite = { 35400840605eSJussi Kivilinna .cipher = { 35410840605eSJussi Kivilinna .enc = { 35420840605eSJussi Kivilinna .vecs = camellia_xts_enc_tv_template, 35430840605eSJussi Kivilinna .count = CAMELLIA_XTS_ENC_TEST_VECTORS 35440840605eSJussi Kivilinna }, 35450840605eSJussi Kivilinna .dec = { 35460840605eSJussi Kivilinna .vecs = camellia_xts_dec_tv_template, 35470840605eSJussi Kivilinna .count = CAMELLIA_XTS_DEC_TEST_VECTORS 35480840605eSJussi Kivilinna } 35490840605eSJussi Kivilinna } 35500840605eSJussi Kivilinna } 35510840605eSJussi Kivilinna }, { 35529b8b0405SJohannes Goetzfried .alg = "xts(cast6)", 35539b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 35549b8b0405SJohannes Goetzfried .suite = { 35559b8b0405SJohannes Goetzfried .cipher = { 35569b8b0405SJohannes Goetzfried .enc = { 35579b8b0405SJohannes Goetzfried .vecs = cast6_xts_enc_tv_template, 35589b8b0405SJohannes Goetzfried .count = CAST6_XTS_ENC_TEST_VECTORS 35599b8b0405SJohannes Goetzfried }, 35609b8b0405SJohannes Goetzfried .dec = { 35619b8b0405SJohannes Goetzfried .vecs = cast6_xts_dec_tv_template, 35629b8b0405SJohannes Goetzfried .count = CAST6_XTS_DEC_TEST_VECTORS 35639b8b0405SJohannes Goetzfried } 35649b8b0405SJohannes Goetzfried } 35659b8b0405SJohannes Goetzfried } 35669b8b0405SJohannes Goetzfried }, { 356718be20b9SJussi Kivilinna .alg = "xts(serpent)", 356818be20b9SJussi Kivilinna .test = alg_test_skcipher, 356918be20b9SJussi Kivilinna .suite = { 357018be20b9SJussi Kivilinna .cipher = { 357118be20b9SJussi Kivilinna .enc = { 357218be20b9SJussi Kivilinna .vecs = serpent_xts_enc_tv_template, 357318be20b9SJussi Kivilinna .count = SERPENT_XTS_ENC_TEST_VECTORS 357418be20b9SJussi Kivilinna }, 357518be20b9SJussi Kivilinna .dec = { 357618be20b9SJussi Kivilinna .vecs = serpent_xts_dec_tv_template, 357718be20b9SJussi Kivilinna .count = SERPENT_XTS_DEC_TEST_VECTORS 357818be20b9SJussi Kivilinna } 357918be20b9SJussi Kivilinna } 358018be20b9SJussi Kivilinna } 358118be20b9SJussi Kivilinna }, { 3582aed265b9SJussi Kivilinna .alg = "xts(twofish)", 3583aed265b9SJussi Kivilinna .test = alg_test_skcipher, 3584aed265b9SJussi Kivilinna .suite = { 3585aed265b9SJussi Kivilinna .cipher = { 3586aed265b9SJussi Kivilinna .enc = { 3587aed265b9SJussi Kivilinna .vecs = tf_xts_enc_tv_template, 3588aed265b9SJussi Kivilinna .count = TF_XTS_ENC_TEST_VECTORS 3589aed265b9SJussi Kivilinna }, 3590aed265b9SJussi Kivilinna .dec = { 3591aed265b9SJussi Kivilinna .vecs = tf_xts_dec_tv_template, 3592aed265b9SJussi Kivilinna .count = TF_XTS_DEC_TEST_VECTORS 3593aed265b9SJussi Kivilinna } 3594aed265b9SJussi Kivilinna } 3595aed265b9SJussi Kivilinna } 3596aed265b9SJussi Kivilinna }, { 35970c01aed5SGeert Uytterhoeven .alg = "zlib", 35980c01aed5SGeert Uytterhoeven .test = alg_test_pcomp, 35990818904dSMilan Broz .fips_allowed = 1, 36000c01aed5SGeert Uytterhoeven .suite = { 36010c01aed5SGeert Uytterhoeven .pcomp = { 36020c01aed5SGeert Uytterhoeven .comp = { 36030c01aed5SGeert Uytterhoeven .vecs = zlib_comp_tv_template, 36040c01aed5SGeert Uytterhoeven .count = ZLIB_COMP_TEST_VECTORS 36050c01aed5SGeert Uytterhoeven }, 36060c01aed5SGeert Uytterhoeven .decomp = { 36070c01aed5SGeert Uytterhoeven .vecs = zlib_decomp_tv_template, 36080c01aed5SGeert Uytterhoeven .count = ZLIB_DECOMP_TEST_VECTORS 36090c01aed5SGeert Uytterhoeven } 36100c01aed5SGeert Uytterhoeven } 36110c01aed5SGeert Uytterhoeven } 3612da7f033dSHerbert Xu } 3613da7f033dSHerbert Xu }; 3614da7f033dSHerbert Xu 36155714758bSJussi Kivilinna static bool alg_test_descs_checked; 36165714758bSJussi Kivilinna 36175714758bSJussi Kivilinna static void alg_test_descs_check_order(void) 36185714758bSJussi Kivilinna { 36195714758bSJussi Kivilinna int i; 36205714758bSJussi Kivilinna 36215714758bSJussi Kivilinna /* only check once */ 36225714758bSJussi Kivilinna if (alg_test_descs_checked) 36235714758bSJussi Kivilinna return; 36245714758bSJussi Kivilinna 36255714758bSJussi Kivilinna alg_test_descs_checked = true; 36265714758bSJussi Kivilinna 36275714758bSJussi Kivilinna for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) { 36285714758bSJussi Kivilinna int diff = strcmp(alg_test_descs[i - 1].alg, 36295714758bSJussi Kivilinna alg_test_descs[i].alg); 36305714758bSJussi Kivilinna 36315714758bSJussi Kivilinna if (WARN_ON(diff > 0)) { 36325714758bSJussi Kivilinna pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n", 36335714758bSJussi Kivilinna alg_test_descs[i - 1].alg, 36345714758bSJussi Kivilinna alg_test_descs[i].alg); 36355714758bSJussi Kivilinna } 36365714758bSJussi Kivilinna 36375714758bSJussi Kivilinna if (WARN_ON(diff == 0)) { 36385714758bSJussi Kivilinna pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n", 36395714758bSJussi Kivilinna alg_test_descs[i].alg); 36405714758bSJussi Kivilinna } 36415714758bSJussi Kivilinna } 36425714758bSJussi Kivilinna } 36435714758bSJussi Kivilinna 36441aa4ecd9SHerbert Xu static int alg_find_test(const char *alg) 3645da7f033dSHerbert Xu { 3646da7f033dSHerbert Xu int start = 0; 3647da7f033dSHerbert Xu int end = ARRAY_SIZE(alg_test_descs); 3648da7f033dSHerbert Xu 3649da7f033dSHerbert Xu while (start < end) { 3650da7f033dSHerbert Xu int i = (start + end) / 2; 3651da7f033dSHerbert Xu int diff = strcmp(alg_test_descs[i].alg, alg); 3652da7f033dSHerbert Xu 3653da7f033dSHerbert Xu if (diff > 0) { 3654da7f033dSHerbert Xu end = i; 3655da7f033dSHerbert Xu continue; 3656da7f033dSHerbert Xu } 3657da7f033dSHerbert Xu 3658da7f033dSHerbert Xu if (diff < 0) { 3659da7f033dSHerbert Xu start = i + 1; 3660da7f033dSHerbert Xu continue; 3661da7f033dSHerbert Xu } 3662da7f033dSHerbert Xu 36631aa4ecd9SHerbert Xu return i; 3664da7f033dSHerbert Xu } 3665da7f033dSHerbert Xu 36661aa4ecd9SHerbert Xu return -1; 36671aa4ecd9SHerbert Xu } 36681aa4ecd9SHerbert Xu 36691aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 36701aa4ecd9SHerbert Xu { 36711aa4ecd9SHerbert Xu int i; 3672a68f6610SHerbert Xu int j; 3673d12d6b6dSNeil Horman int rc; 36741aa4ecd9SHerbert Xu 36755714758bSJussi Kivilinna alg_test_descs_check_order(); 36765714758bSJussi Kivilinna 36771aa4ecd9SHerbert Xu if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) { 36781aa4ecd9SHerbert Xu char nalg[CRYPTO_MAX_ALG_NAME]; 36791aa4ecd9SHerbert Xu 36801aa4ecd9SHerbert Xu if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >= 36811aa4ecd9SHerbert Xu sizeof(nalg)) 36821aa4ecd9SHerbert Xu return -ENAMETOOLONG; 36831aa4ecd9SHerbert Xu 36841aa4ecd9SHerbert Xu i = alg_find_test(nalg); 36851aa4ecd9SHerbert Xu if (i < 0) 36861aa4ecd9SHerbert Xu goto notest; 36871aa4ecd9SHerbert Xu 3688a3bef3a3SJarod Wilson if (fips_enabled && !alg_test_descs[i].fips_allowed) 3689a3bef3a3SJarod Wilson goto non_fips_alg; 3690a3bef3a3SJarod Wilson 3691941fb328SJarod Wilson rc = alg_test_cipher(alg_test_descs + i, driver, type, mask); 3692941fb328SJarod Wilson goto test_done; 36931aa4ecd9SHerbert Xu } 36941aa4ecd9SHerbert Xu 36951aa4ecd9SHerbert Xu i = alg_find_test(alg); 3696a68f6610SHerbert Xu j = alg_find_test(driver); 3697a68f6610SHerbert Xu if (i < 0 && j < 0) 36981aa4ecd9SHerbert Xu goto notest; 36991aa4ecd9SHerbert Xu 3700a68f6610SHerbert Xu if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) || 3701a68f6610SHerbert Xu (j >= 0 && !alg_test_descs[j].fips_allowed))) 3702a3bef3a3SJarod Wilson goto non_fips_alg; 3703a3bef3a3SJarod Wilson 3704a68f6610SHerbert Xu rc = 0; 3705a68f6610SHerbert Xu if (i >= 0) 3706a68f6610SHerbert Xu rc |= alg_test_descs[i].test(alg_test_descs + i, driver, 37071aa4ecd9SHerbert Xu type, mask); 3708032c8cacSCristian Stoica if (j >= 0 && j != i) 3709a68f6610SHerbert Xu rc |= alg_test_descs[j].test(alg_test_descs + j, driver, 3710a68f6610SHerbert Xu type, mask); 3711a68f6610SHerbert Xu 3712941fb328SJarod Wilson test_done: 3713d12d6b6dSNeil Horman if (fips_enabled && rc) 3714d12d6b6dSNeil Horman panic("%s: %s alg self test failed in fips mode!\n", driver, alg); 3715d12d6b6dSNeil Horman 371629ecd4abSJarod Wilson if (fips_enabled && !rc) 37175208ed2cSNitesh Lal pr_info(KERN_INFO "alg: self-tests for %s (%s) passed\n", 371829ecd4abSJarod Wilson driver, alg); 371929ecd4abSJarod Wilson 3720d12d6b6dSNeil Horman return rc; 37211aa4ecd9SHerbert Xu 37221aa4ecd9SHerbert Xu notest: 3723da7f033dSHerbert Xu printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver); 3724da7f033dSHerbert Xu return 0; 3725a3bef3a3SJarod Wilson non_fips_alg: 3726a3bef3a3SJarod Wilson return -EINVAL; 3727da7f033dSHerbert Xu } 37280b767f96SAlexander Shishkin 3729326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */ 37300b767f96SAlexander Shishkin 3731da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test); 3732