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> 30da7f033dSHerbert Xu 31da7f033dSHerbert Xu #include "internal.h" 320b767f96SAlexander Shishkin 33326a6346SHerbert Xu #ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS 340b767f96SAlexander Shishkin 350b767f96SAlexander Shishkin /* a perfect nop */ 360b767f96SAlexander Shishkin int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 370b767f96SAlexander Shishkin { 380b767f96SAlexander Shishkin return 0; 390b767f96SAlexander Shishkin } 400b767f96SAlexander Shishkin 410b767f96SAlexander Shishkin #else 420b767f96SAlexander Shishkin 43da7f033dSHerbert Xu #include "testmgr.h" 44da7f033dSHerbert Xu 45da7f033dSHerbert Xu /* 46da7f033dSHerbert Xu * Need slab memory for testing (size in number of pages). 47da7f033dSHerbert Xu */ 48da7f033dSHerbert Xu #define XBUFSIZE 8 49da7f033dSHerbert Xu 50da7f033dSHerbert Xu /* 51da7f033dSHerbert Xu * Indexes into the xbuf to simulate cross-page access. 52da7f033dSHerbert Xu */ 53da7f033dSHerbert Xu #define IDX1 32 54da7f033dSHerbert Xu #define IDX2 32400 55da7f033dSHerbert Xu #define IDX3 1 56da7f033dSHerbert Xu #define IDX4 8193 57da7f033dSHerbert Xu #define IDX5 22222 58da7f033dSHerbert Xu #define IDX6 17101 59da7f033dSHerbert Xu #define IDX7 27333 60da7f033dSHerbert Xu #define IDX8 3000 61da7f033dSHerbert Xu 62da7f033dSHerbert Xu /* 63da7f033dSHerbert Xu * Used by test_cipher() 64da7f033dSHerbert Xu */ 65da7f033dSHerbert Xu #define ENCRYPT 1 66da7f033dSHerbert Xu #define DECRYPT 0 67da7f033dSHerbert Xu 68da7f033dSHerbert Xu struct tcrypt_result { 69da7f033dSHerbert Xu struct completion completion; 70da7f033dSHerbert Xu int err; 71da7f033dSHerbert Xu }; 72da7f033dSHerbert Xu 73da7f033dSHerbert Xu struct aead_test_suite { 74da7f033dSHerbert Xu struct { 75da7f033dSHerbert Xu struct aead_testvec *vecs; 76da7f033dSHerbert Xu unsigned int count; 77da7f033dSHerbert Xu } enc, dec; 78da7f033dSHerbert Xu }; 79da7f033dSHerbert Xu 80da7f033dSHerbert Xu struct cipher_test_suite { 81da7f033dSHerbert Xu struct { 82da7f033dSHerbert Xu struct cipher_testvec *vecs; 83da7f033dSHerbert Xu unsigned int count; 84da7f033dSHerbert Xu } enc, dec; 85da7f033dSHerbert Xu }; 86da7f033dSHerbert Xu 87da7f033dSHerbert Xu struct comp_test_suite { 88da7f033dSHerbert Xu struct { 89da7f033dSHerbert Xu struct comp_testvec *vecs; 90da7f033dSHerbert Xu unsigned int count; 91da7f033dSHerbert Xu } comp, decomp; 92da7f033dSHerbert Xu }; 93da7f033dSHerbert Xu 948064efb8SGeert Uytterhoeven struct pcomp_test_suite { 958064efb8SGeert Uytterhoeven struct { 968064efb8SGeert Uytterhoeven struct pcomp_testvec *vecs; 978064efb8SGeert Uytterhoeven unsigned int count; 988064efb8SGeert Uytterhoeven } comp, decomp; 998064efb8SGeert Uytterhoeven }; 1008064efb8SGeert Uytterhoeven 101da7f033dSHerbert Xu struct hash_test_suite { 102da7f033dSHerbert Xu struct hash_testvec *vecs; 103da7f033dSHerbert Xu unsigned int count; 104da7f033dSHerbert Xu }; 105da7f033dSHerbert Xu 1067647d6ceSJarod Wilson struct cprng_test_suite { 1077647d6ceSJarod Wilson struct cprng_testvec *vecs; 1087647d6ceSJarod Wilson unsigned int count; 1097647d6ceSJarod Wilson }; 1107647d6ceSJarod Wilson 111da7f033dSHerbert Xu struct alg_test_desc { 112da7f033dSHerbert Xu const char *alg; 113da7f033dSHerbert Xu int (*test)(const struct alg_test_desc *desc, const char *driver, 114da7f033dSHerbert Xu u32 type, u32 mask); 115a1915d51SJarod Wilson int fips_allowed; /* set if alg is allowed in fips mode */ 116da7f033dSHerbert Xu 117da7f033dSHerbert Xu union { 118da7f033dSHerbert Xu struct aead_test_suite aead; 119da7f033dSHerbert Xu struct cipher_test_suite cipher; 120da7f033dSHerbert Xu struct comp_test_suite comp; 1218064efb8SGeert Uytterhoeven struct pcomp_test_suite pcomp; 122da7f033dSHerbert Xu struct hash_test_suite hash; 1237647d6ceSJarod Wilson struct cprng_test_suite cprng; 124da7f033dSHerbert Xu } suite; 125da7f033dSHerbert Xu }; 126da7f033dSHerbert Xu 127da7f033dSHerbert Xu static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 }; 128da7f033dSHerbert Xu 129da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len) 130da7f033dSHerbert Xu { 131da7f033dSHerbert Xu print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET, 132da7f033dSHerbert Xu 16, 1, 133da7f033dSHerbert Xu buf, len, false); 134da7f033dSHerbert Xu } 135da7f033dSHerbert Xu 136da7f033dSHerbert Xu static void tcrypt_complete(struct crypto_async_request *req, int err) 137da7f033dSHerbert Xu { 138da7f033dSHerbert Xu struct tcrypt_result *res = req->data; 139da7f033dSHerbert Xu 140da7f033dSHerbert Xu if (err == -EINPROGRESS) 141da7f033dSHerbert Xu return; 142da7f033dSHerbert Xu 143da7f033dSHerbert Xu res->err = err; 144da7f033dSHerbert Xu complete(&res->completion); 145da7f033dSHerbert Xu } 146da7f033dSHerbert Xu 147f8b0d4d0SHerbert Xu static int testmgr_alloc_buf(char *buf[XBUFSIZE]) 148f8b0d4d0SHerbert Xu { 149f8b0d4d0SHerbert Xu int i; 150f8b0d4d0SHerbert Xu 151f8b0d4d0SHerbert Xu for (i = 0; i < XBUFSIZE; i++) { 152f8b0d4d0SHerbert Xu buf[i] = (void *)__get_free_page(GFP_KERNEL); 153f8b0d4d0SHerbert Xu if (!buf[i]) 154f8b0d4d0SHerbert Xu goto err_free_buf; 155f8b0d4d0SHerbert Xu } 156f8b0d4d0SHerbert Xu 157f8b0d4d0SHerbert Xu return 0; 158f8b0d4d0SHerbert Xu 159f8b0d4d0SHerbert Xu err_free_buf: 160f8b0d4d0SHerbert Xu while (i-- > 0) 161f8b0d4d0SHerbert Xu free_page((unsigned long)buf[i]); 162f8b0d4d0SHerbert Xu 163f8b0d4d0SHerbert Xu return -ENOMEM; 164f8b0d4d0SHerbert Xu } 165f8b0d4d0SHerbert Xu 166f8b0d4d0SHerbert Xu static void testmgr_free_buf(char *buf[XBUFSIZE]) 167f8b0d4d0SHerbert Xu { 168f8b0d4d0SHerbert Xu int i; 169f8b0d4d0SHerbert Xu 170f8b0d4d0SHerbert Xu for (i = 0; i < XBUFSIZE; i++) 171f8b0d4d0SHerbert Xu free_page((unsigned long)buf[i]); 172f8b0d4d0SHerbert Xu } 173f8b0d4d0SHerbert Xu 174a8f1a052SDavid S. Miller static int do_one_async_hash_op(struct ahash_request *req, 175a8f1a052SDavid S. Miller struct tcrypt_result *tr, 176a8f1a052SDavid S. Miller int ret) 177a8f1a052SDavid S. Miller { 178a8f1a052SDavid S. Miller if (ret == -EINPROGRESS || ret == -EBUSY) { 179a8f1a052SDavid S. Miller ret = wait_for_completion_interruptible(&tr->completion); 180a8f1a052SDavid S. Miller if (!ret) 181a8f1a052SDavid S. Miller ret = tr->err; 182a8f1a052SDavid S. Miller INIT_COMPLETION(tr->completion); 183a8f1a052SDavid S. Miller } 184a8f1a052SDavid S. Miller return ret; 185a8f1a052SDavid S. Miller } 186a8f1a052SDavid S. Miller 187da7f033dSHerbert Xu static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template, 188a8f1a052SDavid S. Miller unsigned int tcount, bool use_digest) 189da7f033dSHerbert Xu { 190da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm)); 191da7f033dSHerbert Xu unsigned int i, j, k, temp; 192da7f033dSHerbert Xu struct scatterlist sg[8]; 193da7f033dSHerbert Xu char result[64]; 194da7f033dSHerbert Xu struct ahash_request *req; 195da7f033dSHerbert Xu struct tcrypt_result tresult; 196da7f033dSHerbert Xu void *hash_buff; 197f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 198f8b0d4d0SHerbert Xu int ret = -ENOMEM; 199f8b0d4d0SHerbert Xu 200f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 201f8b0d4d0SHerbert Xu goto out_nobuf; 202da7f033dSHerbert Xu 203da7f033dSHerbert Xu init_completion(&tresult.completion); 204da7f033dSHerbert Xu 205da7f033dSHerbert Xu req = ahash_request_alloc(tfm, GFP_KERNEL); 206da7f033dSHerbert Xu if (!req) { 207da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to allocate request for " 208da7f033dSHerbert Xu "%s\n", algo); 209da7f033dSHerbert Xu goto out_noreq; 210da7f033dSHerbert Xu } 211da7f033dSHerbert Xu ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 212da7f033dSHerbert Xu tcrypt_complete, &tresult); 213da7f033dSHerbert Xu 214a0cfae59SHerbert Xu j = 0; 215da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 216a0cfae59SHerbert Xu if (template[i].np) 217a0cfae59SHerbert Xu continue; 218a0cfae59SHerbert Xu 219a0cfae59SHerbert Xu j++; 220da7f033dSHerbert Xu memset(result, 0, 64); 221da7f033dSHerbert Xu 222da7f033dSHerbert Xu hash_buff = xbuf[0]; 223da7f033dSHerbert Xu 224da7f033dSHerbert Xu memcpy(hash_buff, template[i].plaintext, template[i].psize); 225da7f033dSHerbert Xu sg_init_one(&sg[0], hash_buff, template[i].psize); 226da7f033dSHerbert Xu 227da7f033dSHerbert Xu if (template[i].ksize) { 228da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 229da7f033dSHerbert Xu ret = crypto_ahash_setkey(tfm, template[i].key, 230da7f033dSHerbert Xu template[i].ksize); 231da7f033dSHerbert Xu if (ret) { 232da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey failed on " 233a0cfae59SHerbert Xu "test %d for %s: ret=%d\n", j, algo, 234da7f033dSHerbert Xu -ret); 235da7f033dSHerbert Xu goto out; 236da7f033dSHerbert Xu } 237da7f033dSHerbert Xu } 238da7f033dSHerbert Xu 239da7f033dSHerbert Xu ahash_request_set_crypt(req, sg, result, template[i].psize); 240a8f1a052SDavid S. Miller if (use_digest) { 241a8f1a052SDavid S. Miller ret = do_one_async_hash_op(req, &tresult, 242a8f1a052SDavid S. Miller crypto_ahash_digest(req)); 243a8f1a052SDavid S. Miller if (ret) { 244a8f1a052SDavid S. Miller pr_err("alg: hash: digest failed on test %d " 245a0cfae59SHerbert Xu "for %s: ret=%d\n", j, algo, -ret); 246da7f033dSHerbert Xu goto out; 247da7f033dSHerbert Xu } 248a8f1a052SDavid S. Miller } else { 249a8f1a052SDavid S. Miller ret = do_one_async_hash_op(req, &tresult, 250a8f1a052SDavid S. Miller crypto_ahash_init(req)); 251a8f1a052SDavid S. Miller if (ret) { 252a8f1a052SDavid S. Miller pr_err("alt: hash: init failed on test %d " 253a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 254a8f1a052SDavid S. Miller goto out; 255a8f1a052SDavid S. Miller } 256a8f1a052SDavid S. Miller ret = do_one_async_hash_op(req, &tresult, 257a8f1a052SDavid S. Miller crypto_ahash_update(req)); 258a8f1a052SDavid S. Miller if (ret) { 259a8f1a052SDavid S. Miller pr_err("alt: hash: update failed on test %d " 260a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 261a8f1a052SDavid S. Miller goto out; 262a8f1a052SDavid S. Miller } 263a8f1a052SDavid S. Miller ret = do_one_async_hash_op(req, &tresult, 264a8f1a052SDavid S. Miller crypto_ahash_final(req)); 265a8f1a052SDavid S. Miller if (ret) { 266a8f1a052SDavid S. Miller pr_err("alt: hash: final failed on test %d " 267a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 268a8f1a052SDavid S. Miller goto out; 269a8f1a052SDavid S. Miller } 270a8f1a052SDavid S. Miller } 271da7f033dSHerbert Xu 272da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 273da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 274da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Test %d failed for %s\n", 275a0cfae59SHerbert Xu j, algo); 276da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 277da7f033dSHerbert Xu ret = -EINVAL; 278da7f033dSHerbert Xu goto out; 279da7f033dSHerbert Xu } 280da7f033dSHerbert Xu } 281da7f033dSHerbert Xu 282da7f033dSHerbert Xu j = 0; 283da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 284da7f033dSHerbert Xu if (template[i].np) { 285da7f033dSHerbert Xu j++; 286da7f033dSHerbert Xu memset(result, 0, 64); 287da7f033dSHerbert Xu 288da7f033dSHerbert Xu temp = 0; 289da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 290fd57f22aSHerbert Xu ret = -EINVAL; 291da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 292fd57f22aSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 293fd57f22aSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 294fd57f22aSHerbert Xu goto out; 295da7f033dSHerbert Xu sg_set_buf(&sg[k], 296da7f033dSHerbert Xu memcpy(xbuf[IDX[k] >> PAGE_SHIFT] + 297da7f033dSHerbert Xu offset_in_page(IDX[k]), 298da7f033dSHerbert Xu template[i].plaintext + temp, 299da7f033dSHerbert Xu template[i].tap[k]), 300da7f033dSHerbert Xu template[i].tap[k]); 301da7f033dSHerbert Xu temp += template[i].tap[k]; 302da7f033dSHerbert Xu } 303da7f033dSHerbert Xu 304da7f033dSHerbert Xu if (template[i].ksize) { 305da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 306da7f033dSHerbert Xu ret = crypto_ahash_setkey(tfm, template[i].key, 307da7f033dSHerbert Xu template[i].ksize); 308da7f033dSHerbert Xu 309da7f033dSHerbert Xu if (ret) { 310da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey " 311da7f033dSHerbert Xu "failed on chunking test %d " 312da7f033dSHerbert Xu "for %s: ret=%d\n", j, algo, 313da7f033dSHerbert Xu -ret); 314da7f033dSHerbert Xu goto out; 315da7f033dSHerbert Xu } 316da7f033dSHerbert Xu } 317da7f033dSHerbert Xu 318da7f033dSHerbert Xu ahash_request_set_crypt(req, sg, result, 319da7f033dSHerbert Xu template[i].psize); 320da7f033dSHerbert Xu ret = crypto_ahash_digest(req); 321da7f033dSHerbert Xu switch (ret) { 322da7f033dSHerbert Xu case 0: 323da7f033dSHerbert Xu break; 324da7f033dSHerbert Xu case -EINPROGRESS: 325da7f033dSHerbert Xu case -EBUSY: 326da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 327da7f033dSHerbert Xu &tresult.completion); 328da7f033dSHerbert Xu if (!ret && !(ret = tresult.err)) { 329da7f033dSHerbert Xu INIT_COMPLETION(tresult.completion); 330da7f033dSHerbert Xu break; 331da7f033dSHerbert Xu } 332da7f033dSHerbert Xu /* fall through */ 333da7f033dSHerbert Xu default: 334da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: digest failed " 335da7f033dSHerbert Xu "on chunking test %d for %s: " 336da7f033dSHerbert Xu "ret=%d\n", j, algo, -ret); 337da7f033dSHerbert Xu goto out; 338da7f033dSHerbert Xu } 339da7f033dSHerbert Xu 340da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 341da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 342da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Chunking test %d " 343da7f033dSHerbert Xu "failed for %s\n", j, algo); 344da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 345da7f033dSHerbert Xu ret = -EINVAL; 346da7f033dSHerbert Xu goto out; 347da7f033dSHerbert Xu } 348da7f033dSHerbert Xu } 349da7f033dSHerbert Xu } 350da7f033dSHerbert Xu 351da7f033dSHerbert Xu ret = 0; 352da7f033dSHerbert Xu 353da7f033dSHerbert Xu out: 354da7f033dSHerbert Xu ahash_request_free(req); 355da7f033dSHerbert Xu out_noreq: 356f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 357f8b0d4d0SHerbert Xu out_nobuf: 358da7f033dSHerbert Xu return ret; 359da7f033dSHerbert Xu } 360da7f033dSHerbert Xu 361d8a32ac2SJussi Kivilinna static int __test_aead(struct crypto_aead *tfm, int enc, 362d8a32ac2SJussi Kivilinna struct aead_testvec *template, unsigned int tcount, 363*58dcf548SJussi Kivilinna const bool diff_dst, const int align_offset) 364da7f033dSHerbert Xu { 365da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)); 366da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 367f8b0d4d0SHerbert Xu int ret = -ENOMEM; 368da7f033dSHerbert Xu char *q; 369da7f033dSHerbert Xu char *key; 370da7f033dSHerbert Xu struct aead_request *req; 371d8a32ac2SJussi Kivilinna struct scatterlist *sg; 372d8a32ac2SJussi Kivilinna struct scatterlist *asg; 373d8a32ac2SJussi Kivilinna struct scatterlist *sgout; 374d8a32ac2SJussi Kivilinna const char *e, *d; 375da7f033dSHerbert Xu struct tcrypt_result result; 376da7f033dSHerbert Xu unsigned int authsize; 377da7f033dSHerbert Xu void *input; 378d8a32ac2SJussi Kivilinna void *output; 379da7f033dSHerbert Xu void *assoc; 380da7f033dSHerbert Xu char iv[MAX_IVLEN]; 381f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 382d8a32ac2SJussi Kivilinna char *xoutbuf[XBUFSIZE]; 383f8b0d4d0SHerbert Xu char *axbuf[XBUFSIZE]; 384f8b0d4d0SHerbert Xu 385f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 386f8b0d4d0SHerbert Xu goto out_noxbuf; 387f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(axbuf)) 388f8b0d4d0SHerbert Xu goto out_noaxbuf; 389da7f033dSHerbert Xu 390d8a32ac2SJussi Kivilinna if (diff_dst && testmgr_alloc_buf(xoutbuf)) 391d8a32ac2SJussi Kivilinna goto out_nooutbuf; 392d8a32ac2SJussi Kivilinna 393d8a32ac2SJussi Kivilinna /* avoid "the frame size is larger than 1024 bytes" compiler warning */ 394d8a32ac2SJussi Kivilinna sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 3 : 2), GFP_KERNEL); 395d8a32ac2SJussi Kivilinna if (!sg) 396d8a32ac2SJussi Kivilinna goto out_nosg; 397d8a32ac2SJussi Kivilinna asg = &sg[8]; 398d8a32ac2SJussi Kivilinna sgout = &asg[8]; 399d8a32ac2SJussi Kivilinna 400d8a32ac2SJussi Kivilinna if (diff_dst) 401d8a32ac2SJussi Kivilinna d = "-ddst"; 402d8a32ac2SJussi Kivilinna else 403d8a32ac2SJussi Kivilinna d = ""; 404d8a32ac2SJussi Kivilinna 405da7f033dSHerbert Xu if (enc == ENCRYPT) 406da7f033dSHerbert Xu e = "encryption"; 407da7f033dSHerbert Xu else 408da7f033dSHerbert Xu e = "decryption"; 409da7f033dSHerbert Xu 410da7f033dSHerbert Xu init_completion(&result.completion); 411da7f033dSHerbert Xu 412da7f033dSHerbert Xu req = aead_request_alloc(tfm, GFP_KERNEL); 413da7f033dSHerbert Xu if (!req) { 414d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to allocate request for %s\n", 415d8a32ac2SJussi Kivilinna d, algo); 416da7f033dSHerbert Xu goto out; 417da7f033dSHerbert Xu } 418da7f033dSHerbert Xu 419da7f033dSHerbert Xu aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 420da7f033dSHerbert Xu tcrypt_complete, &result); 421da7f033dSHerbert Xu 422da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 423da7f033dSHerbert Xu if (!template[i].np) { 424da7f033dSHerbert Xu j++; 425da7f033dSHerbert Xu 426*58dcf548SJussi Kivilinna /* some templates have no input data but they will 427da7f033dSHerbert Xu * touch input 428da7f033dSHerbert Xu */ 429da7f033dSHerbert Xu input = xbuf[0]; 430*58dcf548SJussi Kivilinna input += align_offset; 431da7f033dSHerbert Xu assoc = axbuf[0]; 432da7f033dSHerbert Xu 433fd57f22aSHerbert Xu ret = -EINVAL; 434*58dcf548SJussi Kivilinna if (WARN_ON(align_offset + template[i].ilen > 435*58dcf548SJussi Kivilinna PAGE_SIZE || template[i].alen > PAGE_SIZE)) 436fd57f22aSHerbert Xu goto out; 437fd57f22aSHerbert Xu 438da7f033dSHerbert Xu memcpy(input, template[i].input, template[i].ilen); 439da7f033dSHerbert Xu memcpy(assoc, template[i].assoc, template[i].alen); 440da7f033dSHerbert Xu if (template[i].iv) 441da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 442da7f033dSHerbert Xu else 443da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 444da7f033dSHerbert Xu 445da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 446da7f033dSHerbert Xu if (template[i].wk) 447da7f033dSHerbert Xu crypto_aead_set_flags( 448da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 449da7f033dSHerbert Xu 450da7f033dSHerbert Xu key = template[i].key; 451da7f033dSHerbert Xu 452da7f033dSHerbert Xu ret = crypto_aead_setkey(tfm, key, 453da7f033dSHerbert Xu template[i].klen); 454da7f033dSHerbert Xu if (!ret == template[i].fail) { 455d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n", 456d8a32ac2SJussi Kivilinna d, j, algo, crypto_aead_get_flags(tfm)); 457da7f033dSHerbert Xu goto out; 458da7f033dSHerbert Xu } else if (ret) 459da7f033dSHerbert Xu continue; 460da7f033dSHerbert Xu 461da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 462da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 463da7f033dSHerbert Xu if (ret) { 464d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n", 465d8a32ac2SJussi Kivilinna d, authsize, j, algo); 466da7f033dSHerbert Xu goto out; 467da7f033dSHerbert Xu } 468da7f033dSHerbert Xu 469da7f033dSHerbert Xu sg_init_one(&sg[0], input, 470da7f033dSHerbert Xu template[i].ilen + (enc ? authsize : 0)); 471da7f033dSHerbert Xu 472d8a32ac2SJussi Kivilinna if (diff_dst) { 473d8a32ac2SJussi Kivilinna output = xoutbuf[0]; 474*58dcf548SJussi Kivilinna output += align_offset; 475d8a32ac2SJussi Kivilinna sg_init_one(&sgout[0], output, 476d8a32ac2SJussi Kivilinna template[i].ilen + 477d8a32ac2SJussi Kivilinna (enc ? authsize : 0)); 478d8a32ac2SJussi Kivilinna } else { 479d8a32ac2SJussi Kivilinna output = input; 480d8a32ac2SJussi Kivilinna } 481d8a32ac2SJussi Kivilinna 482da7f033dSHerbert Xu sg_init_one(&asg[0], assoc, template[i].alen); 483da7f033dSHerbert Xu 484d8a32ac2SJussi Kivilinna aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 485da7f033dSHerbert Xu template[i].ilen, iv); 486da7f033dSHerbert Xu 487da7f033dSHerbert Xu aead_request_set_assoc(req, asg, template[i].alen); 488da7f033dSHerbert Xu 489da7f033dSHerbert Xu ret = enc ? 490da7f033dSHerbert Xu crypto_aead_encrypt(req) : 491da7f033dSHerbert Xu crypto_aead_decrypt(req); 492da7f033dSHerbert Xu 493da7f033dSHerbert Xu switch (ret) { 494da7f033dSHerbert Xu case 0: 495e44a1b44SJarod Wilson if (template[i].novrfy) { 496e44a1b44SJarod Wilson /* verification was supposed to fail */ 497d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n", 498d8a32ac2SJussi Kivilinna d, e, j, algo); 499e44a1b44SJarod Wilson /* so really, we got a bad message */ 500e44a1b44SJarod Wilson ret = -EBADMSG; 501e44a1b44SJarod Wilson goto out; 502e44a1b44SJarod Wilson } 503da7f033dSHerbert Xu break; 504da7f033dSHerbert Xu case -EINPROGRESS: 505da7f033dSHerbert Xu case -EBUSY: 506da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 507da7f033dSHerbert Xu &result.completion); 508da7f033dSHerbert Xu if (!ret && !(ret = result.err)) { 509da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 510da7f033dSHerbert Xu break; 511da7f033dSHerbert Xu } 512e44a1b44SJarod Wilson case -EBADMSG: 513e44a1b44SJarod Wilson if (template[i].novrfy) 514e44a1b44SJarod Wilson /* verification failure was expected */ 515e44a1b44SJarod Wilson continue; 516da7f033dSHerbert Xu /* fall through */ 517da7f033dSHerbert Xu default: 518d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n", 519d8a32ac2SJussi Kivilinna d, e, j, algo, -ret); 520da7f033dSHerbert Xu goto out; 521da7f033dSHerbert Xu } 522da7f033dSHerbert Xu 523d8a32ac2SJussi Kivilinna q = output; 524da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 525d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Test %d failed on %s for %s\n", 526d8a32ac2SJussi Kivilinna d, j, e, algo); 527da7f033dSHerbert Xu hexdump(q, template[i].rlen); 528da7f033dSHerbert Xu ret = -EINVAL; 529da7f033dSHerbert Xu goto out; 530da7f033dSHerbert Xu } 531da7f033dSHerbert Xu } 532da7f033dSHerbert Xu } 533da7f033dSHerbert Xu 534da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 535*58dcf548SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 536*58dcf548SJussi Kivilinna if (align_offset != 0) 537*58dcf548SJussi Kivilinna break; 538*58dcf548SJussi Kivilinna 539da7f033dSHerbert Xu if (template[i].np) { 540da7f033dSHerbert Xu j++; 541da7f033dSHerbert Xu 542da7f033dSHerbert Xu if (template[i].iv) 543da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 544da7f033dSHerbert Xu else 545da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 546da7f033dSHerbert Xu 547da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 548da7f033dSHerbert Xu if (template[i].wk) 549da7f033dSHerbert Xu crypto_aead_set_flags( 550da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 551da7f033dSHerbert Xu key = template[i].key; 552da7f033dSHerbert Xu 553da7f033dSHerbert Xu ret = crypto_aead_setkey(tfm, key, template[i].klen); 554da7f033dSHerbert Xu if (!ret == template[i].fail) { 555d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n", 556d8a32ac2SJussi Kivilinna d, j, algo, crypto_aead_get_flags(tfm)); 557da7f033dSHerbert Xu goto out; 558da7f033dSHerbert Xu } else if (ret) 559da7f033dSHerbert Xu continue; 560da7f033dSHerbert Xu 561da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 562da7f033dSHerbert Xu 563da7f033dSHerbert Xu ret = -EINVAL; 564da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 565d8a32ac2SJussi Kivilinna if (diff_dst) 566d8a32ac2SJussi Kivilinna sg_init_table(sgout, template[i].np); 567da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 568da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 569da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 570da7f033dSHerbert Xu goto out; 571da7f033dSHerbert Xu 572da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 573da7f033dSHerbert Xu offset_in_page(IDX[k]); 574da7f033dSHerbert Xu 575da7f033dSHerbert Xu memcpy(q, template[i].input + temp, 576da7f033dSHerbert Xu template[i].tap[k]); 577da7f033dSHerbert Xu 578da7f033dSHerbert Xu n = template[i].tap[k]; 579da7f033dSHerbert Xu if (k == template[i].np - 1 && enc) 580da7f033dSHerbert Xu n += authsize; 581da7f033dSHerbert Xu if (offset_in_page(q) + n < PAGE_SIZE) 582da7f033dSHerbert Xu q[n] = 0; 583da7f033dSHerbert Xu 584da7f033dSHerbert Xu sg_set_buf(&sg[k], q, template[i].tap[k]); 585d8a32ac2SJussi Kivilinna 586d8a32ac2SJussi Kivilinna if (diff_dst) { 587d8a32ac2SJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 588d8a32ac2SJussi Kivilinna offset_in_page(IDX[k]); 589d8a32ac2SJussi Kivilinna 590d8a32ac2SJussi Kivilinna memset(q, 0, template[i].tap[k]); 591d8a32ac2SJussi Kivilinna if (offset_in_page(q) + n < PAGE_SIZE) 592d8a32ac2SJussi Kivilinna q[n] = 0; 593d8a32ac2SJussi Kivilinna 594d8a32ac2SJussi Kivilinna sg_set_buf(&sgout[k], q, 595d8a32ac2SJussi Kivilinna template[i].tap[k]); 596d8a32ac2SJussi Kivilinna } 597d8a32ac2SJussi Kivilinna 598da7f033dSHerbert Xu temp += template[i].tap[k]; 599da7f033dSHerbert Xu } 600da7f033dSHerbert Xu 601da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 602da7f033dSHerbert Xu if (ret) { 603d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n", 604d8a32ac2SJussi Kivilinna d, authsize, j, algo); 605da7f033dSHerbert Xu goto out; 606da7f033dSHerbert Xu } 607da7f033dSHerbert Xu 608da7f033dSHerbert Xu if (enc) { 609da7f033dSHerbert Xu if (WARN_ON(sg[k - 1].offset + 610da7f033dSHerbert Xu sg[k - 1].length + authsize > 611da7f033dSHerbert Xu PAGE_SIZE)) { 612da7f033dSHerbert Xu ret = -EINVAL; 613da7f033dSHerbert Xu goto out; 614da7f033dSHerbert Xu } 615da7f033dSHerbert Xu 616da7f033dSHerbert Xu sg[k - 1].length += authsize; 617d8a32ac2SJussi Kivilinna 618d8a32ac2SJussi Kivilinna if (diff_dst) 619d8a32ac2SJussi Kivilinna sgout[k - 1].length += authsize; 620da7f033dSHerbert Xu } 621da7f033dSHerbert Xu 622da7f033dSHerbert Xu sg_init_table(asg, template[i].anp); 623fd57f22aSHerbert Xu ret = -EINVAL; 624da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].anp; k++) { 625fd57f22aSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 626fd57f22aSHerbert Xu template[i].atap[k] > PAGE_SIZE)) 627fd57f22aSHerbert Xu goto out; 628da7f033dSHerbert Xu sg_set_buf(&asg[k], 629da7f033dSHerbert Xu memcpy(axbuf[IDX[k] >> PAGE_SHIFT] + 630da7f033dSHerbert Xu offset_in_page(IDX[k]), 631da7f033dSHerbert Xu template[i].assoc + temp, 632da7f033dSHerbert Xu template[i].atap[k]), 633da7f033dSHerbert Xu template[i].atap[k]); 634da7f033dSHerbert Xu temp += template[i].atap[k]; 635da7f033dSHerbert Xu } 636da7f033dSHerbert Xu 637d8a32ac2SJussi Kivilinna aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 638da7f033dSHerbert Xu template[i].ilen, 639da7f033dSHerbert Xu iv); 640da7f033dSHerbert Xu 641da7f033dSHerbert Xu aead_request_set_assoc(req, asg, template[i].alen); 642da7f033dSHerbert Xu 643da7f033dSHerbert Xu ret = enc ? 644da7f033dSHerbert Xu crypto_aead_encrypt(req) : 645da7f033dSHerbert Xu crypto_aead_decrypt(req); 646da7f033dSHerbert Xu 647da7f033dSHerbert Xu switch (ret) { 648da7f033dSHerbert Xu case 0: 649e44a1b44SJarod Wilson if (template[i].novrfy) { 650e44a1b44SJarod Wilson /* verification was supposed to fail */ 651d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n", 652d8a32ac2SJussi Kivilinna d, e, j, algo); 653e44a1b44SJarod Wilson /* so really, we got a bad message */ 654e44a1b44SJarod Wilson ret = -EBADMSG; 655e44a1b44SJarod Wilson goto out; 656e44a1b44SJarod Wilson } 657da7f033dSHerbert Xu break; 658da7f033dSHerbert Xu case -EINPROGRESS: 659da7f033dSHerbert Xu case -EBUSY: 660da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 661da7f033dSHerbert Xu &result.completion); 662da7f033dSHerbert Xu if (!ret && !(ret = result.err)) { 663da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 664da7f033dSHerbert Xu break; 665da7f033dSHerbert Xu } 666e44a1b44SJarod Wilson case -EBADMSG: 667e44a1b44SJarod Wilson if (template[i].novrfy) 668e44a1b44SJarod Wilson /* verification failure was expected */ 669e44a1b44SJarod Wilson continue; 670da7f033dSHerbert Xu /* fall through */ 671da7f033dSHerbert Xu default: 672d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n", 673d8a32ac2SJussi Kivilinna d, e, j, algo, -ret); 674da7f033dSHerbert Xu goto out; 675da7f033dSHerbert Xu } 676da7f033dSHerbert Xu 677da7f033dSHerbert Xu ret = -EINVAL; 678da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 679d8a32ac2SJussi Kivilinna if (diff_dst) 680d8a32ac2SJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 681d8a32ac2SJussi Kivilinna offset_in_page(IDX[k]); 682d8a32ac2SJussi Kivilinna else 683da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 684da7f033dSHerbert Xu offset_in_page(IDX[k]); 685da7f033dSHerbert Xu 686da7f033dSHerbert Xu n = template[i].tap[k]; 687da7f033dSHerbert Xu if (k == template[i].np - 1) 688da7f033dSHerbert Xu n += enc ? authsize : -authsize; 689da7f033dSHerbert Xu 690da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, n)) { 691d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n", 692d8a32ac2SJussi Kivilinna d, j, e, k, algo); 693da7f033dSHerbert Xu hexdump(q, n); 694da7f033dSHerbert Xu goto out; 695da7f033dSHerbert Xu } 696da7f033dSHerbert Xu 697da7f033dSHerbert Xu q += n; 698da7f033dSHerbert Xu if (k == template[i].np - 1 && !enc) { 699d8a32ac2SJussi Kivilinna if (!diff_dst && 700d8a32ac2SJussi Kivilinna memcmp(q, template[i].input + 701da7f033dSHerbert Xu temp + n, authsize)) 702da7f033dSHerbert Xu n = authsize; 703da7f033dSHerbert Xu else 704da7f033dSHerbert Xu n = 0; 705da7f033dSHerbert Xu } else { 706da7f033dSHerbert Xu for (n = 0; offset_in_page(q + n) && 707da7f033dSHerbert Xu q[n]; n++) 708da7f033dSHerbert Xu ; 709da7f033dSHerbert Xu } 710da7f033dSHerbert Xu if (n) { 711d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n", 712d8a32ac2SJussi Kivilinna d, j, e, k, algo, n); 713da7f033dSHerbert Xu hexdump(q, n); 714da7f033dSHerbert Xu goto out; 715da7f033dSHerbert Xu } 716da7f033dSHerbert Xu 717da7f033dSHerbert Xu temp += template[i].tap[k]; 718da7f033dSHerbert Xu } 719da7f033dSHerbert Xu } 720da7f033dSHerbert Xu } 721da7f033dSHerbert Xu 722da7f033dSHerbert Xu ret = 0; 723da7f033dSHerbert Xu 724da7f033dSHerbert Xu out: 725da7f033dSHerbert Xu aead_request_free(req); 726d8a32ac2SJussi Kivilinna kfree(sg); 727d8a32ac2SJussi Kivilinna out_nosg: 728d8a32ac2SJussi Kivilinna if (diff_dst) 729d8a32ac2SJussi Kivilinna testmgr_free_buf(xoutbuf); 730d8a32ac2SJussi Kivilinna out_nooutbuf: 731f8b0d4d0SHerbert Xu testmgr_free_buf(axbuf); 732f8b0d4d0SHerbert Xu out_noaxbuf: 733f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 734f8b0d4d0SHerbert Xu out_noxbuf: 735da7f033dSHerbert Xu return ret; 736da7f033dSHerbert Xu } 737da7f033dSHerbert Xu 738d8a32ac2SJussi Kivilinna static int test_aead(struct crypto_aead *tfm, int enc, 739d8a32ac2SJussi Kivilinna struct aead_testvec *template, unsigned int tcount) 740d8a32ac2SJussi Kivilinna { 741*58dcf548SJussi Kivilinna unsigned int alignmask; 742d8a32ac2SJussi Kivilinna int ret; 743d8a32ac2SJussi Kivilinna 744d8a32ac2SJussi Kivilinna /* test 'dst == src' case */ 745*58dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, false, 0); 746d8a32ac2SJussi Kivilinna if (ret) 747d8a32ac2SJussi Kivilinna return ret; 748d8a32ac2SJussi Kivilinna 749d8a32ac2SJussi Kivilinna /* test 'dst != src' case */ 750*58dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 0); 751*58dcf548SJussi Kivilinna if (ret) 752*58dcf548SJussi Kivilinna return ret; 753*58dcf548SJussi Kivilinna 754*58dcf548SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 755*58dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 1); 756*58dcf548SJussi Kivilinna if (ret) 757*58dcf548SJussi Kivilinna return ret; 758*58dcf548SJussi Kivilinna 759*58dcf548SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 760*58dcf548SJussi Kivilinna if (alignmask) { 761*58dcf548SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 762*58dcf548SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, true, 763*58dcf548SJussi Kivilinna alignmask + 1); 764*58dcf548SJussi Kivilinna if (ret) 765*58dcf548SJussi Kivilinna return ret; 766*58dcf548SJussi Kivilinna } 767*58dcf548SJussi Kivilinna 768*58dcf548SJussi Kivilinna return 0; 769d8a32ac2SJussi Kivilinna } 770d8a32ac2SJussi Kivilinna 7711aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc, 7721aa4ecd9SHerbert Xu struct cipher_testvec *template, unsigned int tcount) 7731aa4ecd9SHerbert Xu { 7741aa4ecd9SHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm)); 7751aa4ecd9SHerbert Xu unsigned int i, j, k; 7761aa4ecd9SHerbert Xu char *q; 7771aa4ecd9SHerbert Xu const char *e; 7781aa4ecd9SHerbert Xu void *data; 779f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 780f8b0d4d0SHerbert Xu int ret = -ENOMEM; 781f8b0d4d0SHerbert Xu 782f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 783f8b0d4d0SHerbert Xu goto out_nobuf; 7841aa4ecd9SHerbert Xu 7851aa4ecd9SHerbert Xu if (enc == ENCRYPT) 7861aa4ecd9SHerbert Xu e = "encryption"; 7871aa4ecd9SHerbert Xu else 7881aa4ecd9SHerbert Xu e = "decryption"; 7891aa4ecd9SHerbert Xu 7901aa4ecd9SHerbert Xu j = 0; 7911aa4ecd9SHerbert Xu for (i = 0; i < tcount; i++) { 7921aa4ecd9SHerbert Xu if (template[i].np) 7931aa4ecd9SHerbert Xu continue; 7941aa4ecd9SHerbert Xu 7951aa4ecd9SHerbert Xu j++; 7961aa4ecd9SHerbert Xu 797fd57f22aSHerbert Xu ret = -EINVAL; 798fd57f22aSHerbert Xu if (WARN_ON(template[i].ilen > PAGE_SIZE)) 799fd57f22aSHerbert Xu goto out; 800fd57f22aSHerbert Xu 8011aa4ecd9SHerbert Xu data = xbuf[0]; 8021aa4ecd9SHerbert Xu memcpy(data, template[i].input, template[i].ilen); 8031aa4ecd9SHerbert Xu 8041aa4ecd9SHerbert Xu crypto_cipher_clear_flags(tfm, ~0); 8051aa4ecd9SHerbert Xu if (template[i].wk) 8061aa4ecd9SHerbert Xu crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 8071aa4ecd9SHerbert Xu 8081aa4ecd9SHerbert Xu ret = crypto_cipher_setkey(tfm, template[i].key, 8091aa4ecd9SHerbert Xu template[i].klen); 8101aa4ecd9SHerbert Xu if (!ret == template[i].fail) { 8111aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: setkey failed " 8121aa4ecd9SHerbert Xu "on test %d for %s: flags=%x\n", j, 8131aa4ecd9SHerbert Xu algo, crypto_cipher_get_flags(tfm)); 8141aa4ecd9SHerbert Xu goto out; 8151aa4ecd9SHerbert Xu } else if (ret) 8161aa4ecd9SHerbert Xu continue; 8171aa4ecd9SHerbert Xu 8181aa4ecd9SHerbert Xu for (k = 0; k < template[i].ilen; 8191aa4ecd9SHerbert Xu k += crypto_cipher_blocksize(tfm)) { 8201aa4ecd9SHerbert Xu if (enc) 8211aa4ecd9SHerbert Xu crypto_cipher_encrypt_one(tfm, data + k, 8221aa4ecd9SHerbert Xu data + k); 8231aa4ecd9SHerbert Xu else 8241aa4ecd9SHerbert Xu crypto_cipher_decrypt_one(tfm, data + k, 8251aa4ecd9SHerbert Xu data + k); 8261aa4ecd9SHerbert Xu } 8271aa4ecd9SHerbert Xu 8281aa4ecd9SHerbert Xu q = data; 8291aa4ecd9SHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 8301aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: Test %d failed " 8311aa4ecd9SHerbert Xu "on %s for %s\n", j, e, algo); 8321aa4ecd9SHerbert Xu hexdump(q, template[i].rlen); 8331aa4ecd9SHerbert Xu ret = -EINVAL; 8341aa4ecd9SHerbert Xu goto out; 8351aa4ecd9SHerbert Xu } 8361aa4ecd9SHerbert Xu } 8371aa4ecd9SHerbert Xu 8381aa4ecd9SHerbert Xu ret = 0; 8391aa4ecd9SHerbert Xu 8401aa4ecd9SHerbert Xu out: 841f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 842f8b0d4d0SHerbert Xu out_nobuf: 8431aa4ecd9SHerbert Xu return ret; 8441aa4ecd9SHerbert Xu } 8451aa4ecd9SHerbert Xu 84608d6af8cSJussi Kivilinna static int __test_skcipher(struct crypto_ablkcipher *tfm, int enc, 84708d6af8cSJussi Kivilinna struct cipher_testvec *template, unsigned int tcount, 8483a338f20SJussi Kivilinna const bool diff_dst, const int align_offset) 849da7f033dSHerbert Xu { 850da7f033dSHerbert Xu const char *algo = 851da7f033dSHerbert Xu crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm)); 852da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 853da7f033dSHerbert Xu char *q; 854da7f033dSHerbert Xu struct ablkcipher_request *req; 855da7f033dSHerbert Xu struct scatterlist sg[8]; 85608d6af8cSJussi Kivilinna struct scatterlist sgout[8]; 85708d6af8cSJussi Kivilinna const char *e, *d; 858da7f033dSHerbert Xu struct tcrypt_result result; 859da7f033dSHerbert Xu void *data; 860da7f033dSHerbert Xu char iv[MAX_IVLEN]; 861f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 86208d6af8cSJussi Kivilinna char *xoutbuf[XBUFSIZE]; 863f8b0d4d0SHerbert Xu int ret = -ENOMEM; 864f8b0d4d0SHerbert Xu 865f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 866f8b0d4d0SHerbert Xu goto out_nobuf; 867da7f033dSHerbert Xu 86808d6af8cSJussi Kivilinna if (diff_dst && testmgr_alloc_buf(xoutbuf)) 86908d6af8cSJussi Kivilinna goto out_nooutbuf; 87008d6af8cSJussi Kivilinna 87108d6af8cSJussi Kivilinna if (diff_dst) 87208d6af8cSJussi Kivilinna d = "-ddst"; 87308d6af8cSJussi Kivilinna else 87408d6af8cSJussi Kivilinna d = ""; 87508d6af8cSJussi Kivilinna 876da7f033dSHerbert Xu if (enc == ENCRYPT) 877da7f033dSHerbert Xu e = "encryption"; 878da7f033dSHerbert Xu else 879da7f033dSHerbert Xu e = "decryption"; 880da7f033dSHerbert Xu 881da7f033dSHerbert Xu init_completion(&result.completion); 882da7f033dSHerbert Xu 883da7f033dSHerbert Xu req = ablkcipher_request_alloc(tfm, GFP_KERNEL); 884da7f033dSHerbert Xu if (!req) { 88508d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Failed to allocate request for %s\n", 88608d6af8cSJussi Kivilinna d, algo); 887da7f033dSHerbert Xu goto out; 888da7f033dSHerbert Xu } 889da7f033dSHerbert Xu 890da7f033dSHerbert Xu ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 891da7f033dSHerbert Xu tcrypt_complete, &result); 892da7f033dSHerbert Xu 893da7f033dSHerbert Xu j = 0; 894da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 895da7f033dSHerbert Xu if (template[i].iv) 896da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 897da7f033dSHerbert Xu else 898da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 899da7f033dSHerbert Xu 900f44d83d1SJussi Kivilinna if (!(template[i].np) || (template[i].also_non_np)) { 901da7f033dSHerbert Xu j++; 902da7f033dSHerbert Xu 903fd57f22aSHerbert Xu ret = -EINVAL; 9043a338f20SJussi Kivilinna if (WARN_ON(align_offset + template[i].ilen > 9053a338f20SJussi Kivilinna PAGE_SIZE)) 906fd57f22aSHerbert Xu goto out; 907fd57f22aSHerbert Xu 908da7f033dSHerbert Xu data = xbuf[0]; 9093a338f20SJussi Kivilinna data += align_offset; 910da7f033dSHerbert Xu memcpy(data, template[i].input, template[i].ilen); 911da7f033dSHerbert Xu 912da7f033dSHerbert Xu crypto_ablkcipher_clear_flags(tfm, ~0); 913da7f033dSHerbert Xu if (template[i].wk) 914da7f033dSHerbert Xu crypto_ablkcipher_set_flags( 915da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 916da7f033dSHerbert Xu 917da7f033dSHerbert Xu ret = crypto_ablkcipher_setkey(tfm, template[i].key, 918da7f033dSHerbert Xu template[i].klen); 919da7f033dSHerbert Xu if (!ret == template[i].fail) { 92008d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n", 92108d6af8cSJussi Kivilinna d, j, algo, 92208d6af8cSJussi Kivilinna crypto_ablkcipher_get_flags(tfm)); 923da7f033dSHerbert Xu goto out; 924da7f033dSHerbert Xu } else if (ret) 925da7f033dSHerbert Xu continue; 926da7f033dSHerbert Xu 927da7f033dSHerbert Xu sg_init_one(&sg[0], data, template[i].ilen); 92808d6af8cSJussi Kivilinna if (diff_dst) { 92908d6af8cSJussi Kivilinna data = xoutbuf[0]; 9303a338f20SJussi Kivilinna data += align_offset; 93108d6af8cSJussi Kivilinna sg_init_one(&sgout[0], data, template[i].ilen); 93208d6af8cSJussi Kivilinna } 933da7f033dSHerbert Xu 93408d6af8cSJussi Kivilinna ablkcipher_request_set_crypt(req, sg, 93508d6af8cSJussi Kivilinna (diff_dst) ? sgout : sg, 936da7f033dSHerbert Xu template[i].ilen, iv); 937da7f033dSHerbert Xu ret = enc ? 938da7f033dSHerbert Xu crypto_ablkcipher_encrypt(req) : 939da7f033dSHerbert Xu crypto_ablkcipher_decrypt(req); 940da7f033dSHerbert Xu 941da7f033dSHerbert Xu switch (ret) { 942da7f033dSHerbert Xu case 0: 943da7f033dSHerbert Xu break; 944da7f033dSHerbert Xu case -EINPROGRESS: 945da7f033dSHerbert Xu case -EBUSY: 946da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 947da7f033dSHerbert Xu &result.completion); 948da7f033dSHerbert Xu if (!ret && !((ret = result.err))) { 949da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 950da7f033dSHerbert Xu break; 951da7f033dSHerbert Xu } 952da7f033dSHerbert Xu /* fall through */ 953da7f033dSHerbert Xu default: 95408d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n", 95508d6af8cSJussi Kivilinna d, e, j, algo, -ret); 956da7f033dSHerbert Xu goto out; 957da7f033dSHerbert Xu } 958da7f033dSHerbert Xu 959da7f033dSHerbert Xu q = data; 960da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 96108d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Test %d failed on %s for %s\n", 96208d6af8cSJussi Kivilinna d, j, e, algo); 963da7f033dSHerbert Xu hexdump(q, template[i].rlen); 964da7f033dSHerbert Xu ret = -EINVAL; 965da7f033dSHerbert Xu goto out; 966da7f033dSHerbert Xu } 967da7f033dSHerbert Xu } 968da7f033dSHerbert Xu } 969da7f033dSHerbert Xu 970da7f033dSHerbert Xu j = 0; 971da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 9723a338f20SJussi Kivilinna /* alignment tests are only done with continuous buffers */ 9733a338f20SJussi Kivilinna if (align_offset != 0) 9743a338f20SJussi Kivilinna break; 975da7f033dSHerbert Xu 976da7f033dSHerbert Xu if (template[i].iv) 977da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 978da7f033dSHerbert Xu else 979da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 980da7f033dSHerbert Xu 981da7f033dSHerbert Xu if (template[i].np) { 982da7f033dSHerbert Xu j++; 983da7f033dSHerbert Xu 984da7f033dSHerbert Xu crypto_ablkcipher_clear_flags(tfm, ~0); 985da7f033dSHerbert Xu if (template[i].wk) 986da7f033dSHerbert Xu crypto_ablkcipher_set_flags( 987da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 988da7f033dSHerbert Xu 989da7f033dSHerbert Xu ret = crypto_ablkcipher_setkey(tfm, template[i].key, 990da7f033dSHerbert Xu template[i].klen); 991da7f033dSHerbert Xu if (!ret == template[i].fail) { 99208d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n", 99308d6af8cSJussi Kivilinna d, j, algo, 994da7f033dSHerbert Xu crypto_ablkcipher_get_flags(tfm)); 995da7f033dSHerbert Xu goto out; 996da7f033dSHerbert Xu } else if (ret) 997da7f033dSHerbert Xu continue; 998da7f033dSHerbert Xu 999da7f033dSHerbert Xu temp = 0; 1000da7f033dSHerbert Xu ret = -EINVAL; 1001da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 100208d6af8cSJussi Kivilinna if (diff_dst) 100308d6af8cSJussi Kivilinna sg_init_table(sgout, template[i].np); 1004da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 1005da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 1006da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 1007da7f033dSHerbert Xu goto out; 1008da7f033dSHerbert Xu 1009da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 1010da7f033dSHerbert Xu offset_in_page(IDX[k]); 1011da7f033dSHerbert Xu 1012da7f033dSHerbert Xu memcpy(q, template[i].input + temp, 1013da7f033dSHerbert Xu template[i].tap[k]); 1014da7f033dSHerbert Xu 1015da7f033dSHerbert Xu if (offset_in_page(q) + template[i].tap[k] < 1016da7f033dSHerbert Xu PAGE_SIZE) 1017da7f033dSHerbert Xu q[template[i].tap[k]] = 0; 1018da7f033dSHerbert Xu 1019da7f033dSHerbert Xu sg_set_buf(&sg[k], q, template[i].tap[k]); 102008d6af8cSJussi Kivilinna if (diff_dst) { 102108d6af8cSJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 102208d6af8cSJussi Kivilinna offset_in_page(IDX[k]); 102308d6af8cSJussi Kivilinna 102408d6af8cSJussi Kivilinna sg_set_buf(&sgout[k], q, 102508d6af8cSJussi Kivilinna template[i].tap[k]); 102608d6af8cSJussi Kivilinna 102708d6af8cSJussi Kivilinna memset(q, 0, template[i].tap[k]); 102808d6af8cSJussi Kivilinna if (offset_in_page(q) + 102908d6af8cSJussi Kivilinna template[i].tap[k] < PAGE_SIZE) 103008d6af8cSJussi Kivilinna q[template[i].tap[k]] = 0; 103108d6af8cSJussi Kivilinna } 1032da7f033dSHerbert Xu 1033da7f033dSHerbert Xu temp += template[i].tap[k]; 1034da7f033dSHerbert Xu } 1035da7f033dSHerbert Xu 103608d6af8cSJussi Kivilinna ablkcipher_request_set_crypt(req, sg, 103708d6af8cSJussi Kivilinna (diff_dst) ? sgout : sg, 1038da7f033dSHerbert Xu template[i].ilen, iv); 1039da7f033dSHerbert Xu 1040da7f033dSHerbert Xu ret = enc ? 1041da7f033dSHerbert Xu crypto_ablkcipher_encrypt(req) : 1042da7f033dSHerbert Xu crypto_ablkcipher_decrypt(req); 1043da7f033dSHerbert Xu 1044da7f033dSHerbert Xu switch (ret) { 1045da7f033dSHerbert Xu case 0: 1046da7f033dSHerbert Xu break; 1047da7f033dSHerbert Xu case -EINPROGRESS: 1048da7f033dSHerbert Xu case -EBUSY: 1049da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 1050da7f033dSHerbert Xu &result.completion); 1051da7f033dSHerbert Xu if (!ret && !((ret = result.err))) { 1052da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 1053da7f033dSHerbert Xu break; 1054da7f033dSHerbert Xu } 1055da7f033dSHerbert Xu /* fall through */ 1056da7f033dSHerbert Xu default: 105708d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n", 105808d6af8cSJussi Kivilinna d, e, j, algo, -ret); 1059da7f033dSHerbert Xu goto out; 1060da7f033dSHerbert Xu } 1061da7f033dSHerbert Xu 1062da7f033dSHerbert Xu temp = 0; 1063da7f033dSHerbert Xu ret = -EINVAL; 1064da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 106508d6af8cSJussi Kivilinna if (diff_dst) 106608d6af8cSJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 106708d6af8cSJussi Kivilinna offset_in_page(IDX[k]); 106808d6af8cSJussi Kivilinna else 1069da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 1070da7f033dSHerbert Xu offset_in_page(IDX[k]); 1071da7f033dSHerbert Xu 1072da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, 1073da7f033dSHerbert Xu template[i].tap[k])) { 107408d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n", 107508d6af8cSJussi Kivilinna d, j, e, k, algo); 1076da7f033dSHerbert Xu hexdump(q, template[i].tap[k]); 1077da7f033dSHerbert Xu goto out; 1078da7f033dSHerbert Xu } 1079da7f033dSHerbert Xu 1080da7f033dSHerbert Xu q += template[i].tap[k]; 1081da7f033dSHerbert Xu for (n = 0; offset_in_page(q + n) && q[n]; n++) 1082da7f033dSHerbert Xu ; 1083da7f033dSHerbert Xu if (n) { 108408d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n", 108508d6af8cSJussi Kivilinna d, j, e, k, algo, n); 1086da7f033dSHerbert Xu hexdump(q, n); 1087da7f033dSHerbert Xu goto out; 1088da7f033dSHerbert Xu } 1089da7f033dSHerbert Xu temp += template[i].tap[k]; 1090da7f033dSHerbert Xu } 1091da7f033dSHerbert Xu } 1092da7f033dSHerbert Xu } 1093da7f033dSHerbert Xu 1094da7f033dSHerbert Xu ret = 0; 1095da7f033dSHerbert Xu 1096da7f033dSHerbert Xu out: 1097da7f033dSHerbert Xu ablkcipher_request_free(req); 109808d6af8cSJussi Kivilinna if (diff_dst) 109908d6af8cSJussi Kivilinna testmgr_free_buf(xoutbuf); 110008d6af8cSJussi Kivilinna out_nooutbuf: 1101f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 1102f8b0d4d0SHerbert Xu out_nobuf: 1103da7f033dSHerbert Xu return ret; 1104da7f033dSHerbert Xu } 1105da7f033dSHerbert Xu 110608d6af8cSJussi Kivilinna static int test_skcipher(struct crypto_ablkcipher *tfm, int enc, 110708d6af8cSJussi Kivilinna struct cipher_testvec *template, unsigned int tcount) 110808d6af8cSJussi Kivilinna { 11093a338f20SJussi Kivilinna unsigned int alignmask; 111008d6af8cSJussi Kivilinna int ret; 111108d6af8cSJussi Kivilinna 111208d6af8cSJussi Kivilinna /* test 'dst == src' case */ 11133a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, false, 0); 111408d6af8cSJussi Kivilinna if (ret) 111508d6af8cSJussi Kivilinna return ret; 111608d6af8cSJussi Kivilinna 111708d6af8cSJussi Kivilinna /* test 'dst != src' case */ 11183a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 0); 11193a338f20SJussi Kivilinna if (ret) 11203a338f20SJussi Kivilinna return ret; 11213a338f20SJussi Kivilinna 11223a338f20SJussi Kivilinna /* test unaligned buffers, check with one byte offset */ 11233a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 1); 11243a338f20SJussi Kivilinna if (ret) 11253a338f20SJussi Kivilinna return ret; 11263a338f20SJussi Kivilinna 11273a338f20SJussi Kivilinna alignmask = crypto_tfm_alg_alignmask(&tfm->base); 11283a338f20SJussi Kivilinna if (alignmask) { 11293a338f20SJussi Kivilinna /* Check if alignment mask for tfm is correctly set. */ 11303a338f20SJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, true, 11313a338f20SJussi Kivilinna alignmask + 1); 11323a338f20SJussi Kivilinna if (ret) 11333a338f20SJussi Kivilinna return ret; 11343a338f20SJussi Kivilinna } 11353a338f20SJussi Kivilinna 11363a338f20SJussi Kivilinna return 0; 113708d6af8cSJussi Kivilinna } 113808d6af8cSJussi Kivilinna 1139da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate, 1140da7f033dSHerbert Xu struct comp_testvec *dtemplate, int ctcount, int dtcount) 1141da7f033dSHerbert Xu { 1142da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm)); 1143da7f033dSHerbert Xu unsigned int i; 1144da7f033dSHerbert Xu char result[COMP_BUF_SIZE]; 1145da7f033dSHerbert Xu int ret; 1146da7f033dSHerbert Xu 1147da7f033dSHerbert Xu for (i = 0; i < ctcount; i++) { 1148c79cf910SGeert Uytterhoeven int ilen; 1149c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 1150da7f033dSHerbert Xu 1151da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 1152da7f033dSHerbert Xu 1153da7f033dSHerbert Xu ilen = ctemplate[i].inlen; 1154da7f033dSHerbert Xu ret = crypto_comp_compress(tfm, ctemplate[i].input, 1155da7f033dSHerbert Xu ilen, result, &dlen); 1156da7f033dSHerbert Xu if (ret) { 1157da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: compression failed " 1158da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1159da7f033dSHerbert Xu -ret); 1160da7f033dSHerbert Xu goto out; 1161da7f033dSHerbert Xu } 1162da7f033dSHerbert Xu 1163b812eb00SGeert Uytterhoeven if (dlen != ctemplate[i].outlen) { 1164b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Compression test %d " 1165b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1166b812eb00SGeert Uytterhoeven dlen); 1167b812eb00SGeert Uytterhoeven ret = -EINVAL; 1168b812eb00SGeert Uytterhoeven goto out; 1169b812eb00SGeert Uytterhoeven } 1170b812eb00SGeert Uytterhoeven 1171da7f033dSHerbert Xu if (memcmp(result, ctemplate[i].output, dlen)) { 1172da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Compression test %d " 1173da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 1174da7f033dSHerbert Xu hexdump(result, dlen); 1175da7f033dSHerbert Xu ret = -EINVAL; 1176da7f033dSHerbert Xu goto out; 1177da7f033dSHerbert Xu } 1178da7f033dSHerbert Xu } 1179da7f033dSHerbert Xu 1180da7f033dSHerbert Xu for (i = 0; i < dtcount; i++) { 1181c79cf910SGeert Uytterhoeven int ilen; 1182c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 1183da7f033dSHerbert Xu 1184da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 1185da7f033dSHerbert Xu 1186da7f033dSHerbert Xu ilen = dtemplate[i].inlen; 1187da7f033dSHerbert Xu ret = crypto_comp_decompress(tfm, dtemplate[i].input, 1188da7f033dSHerbert Xu ilen, result, &dlen); 1189da7f033dSHerbert Xu if (ret) { 1190da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: decompression failed " 1191da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1192da7f033dSHerbert Xu -ret); 1193da7f033dSHerbert Xu goto out; 1194da7f033dSHerbert Xu } 1195da7f033dSHerbert Xu 1196b812eb00SGeert Uytterhoeven if (dlen != dtemplate[i].outlen) { 1197b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Decompression test %d " 1198b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1199b812eb00SGeert Uytterhoeven dlen); 1200b812eb00SGeert Uytterhoeven ret = -EINVAL; 1201b812eb00SGeert Uytterhoeven goto out; 1202b812eb00SGeert Uytterhoeven } 1203b812eb00SGeert Uytterhoeven 1204da7f033dSHerbert Xu if (memcmp(result, dtemplate[i].output, dlen)) { 1205da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Decompression test %d " 1206da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 1207da7f033dSHerbert Xu hexdump(result, dlen); 1208da7f033dSHerbert Xu ret = -EINVAL; 1209da7f033dSHerbert Xu goto out; 1210da7f033dSHerbert Xu } 1211da7f033dSHerbert Xu } 1212da7f033dSHerbert Xu 1213da7f033dSHerbert Xu ret = 0; 1214da7f033dSHerbert Xu 1215da7f033dSHerbert Xu out: 1216da7f033dSHerbert Xu return ret; 1217da7f033dSHerbert Xu } 1218da7f033dSHerbert Xu 12198064efb8SGeert Uytterhoeven static int test_pcomp(struct crypto_pcomp *tfm, 12208064efb8SGeert Uytterhoeven struct pcomp_testvec *ctemplate, 12218064efb8SGeert Uytterhoeven struct pcomp_testvec *dtemplate, int ctcount, 12228064efb8SGeert Uytterhoeven int dtcount) 12238064efb8SGeert Uytterhoeven { 12248064efb8SGeert Uytterhoeven const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm)); 12258064efb8SGeert Uytterhoeven unsigned int i; 12268064efb8SGeert Uytterhoeven char result[COMP_BUF_SIZE]; 12273ce858cbSGeert Uytterhoeven int res; 12288064efb8SGeert Uytterhoeven 12298064efb8SGeert Uytterhoeven for (i = 0; i < ctcount; i++) { 12308064efb8SGeert Uytterhoeven struct comp_request req; 12313ce858cbSGeert Uytterhoeven unsigned int produced = 0; 12328064efb8SGeert Uytterhoeven 12333ce858cbSGeert Uytterhoeven res = crypto_compress_setup(tfm, ctemplate[i].params, 12348064efb8SGeert Uytterhoeven ctemplate[i].paramsize); 12353ce858cbSGeert Uytterhoeven if (res) { 12368064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression setup failed on test " 12373ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 12383ce858cbSGeert Uytterhoeven return res; 12398064efb8SGeert Uytterhoeven } 12408064efb8SGeert Uytterhoeven 12413ce858cbSGeert Uytterhoeven res = crypto_compress_init(tfm); 12423ce858cbSGeert Uytterhoeven if (res) { 12438064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression init failed on test " 12443ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 12453ce858cbSGeert Uytterhoeven return res; 12468064efb8SGeert Uytterhoeven } 12478064efb8SGeert Uytterhoeven 12488064efb8SGeert Uytterhoeven memset(result, 0, sizeof(result)); 12498064efb8SGeert Uytterhoeven 12508064efb8SGeert Uytterhoeven req.next_in = ctemplate[i].input; 12518064efb8SGeert Uytterhoeven req.avail_in = ctemplate[i].inlen / 2; 12528064efb8SGeert Uytterhoeven req.next_out = result; 12538064efb8SGeert Uytterhoeven req.avail_out = ctemplate[i].outlen / 2; 12548064efb8SGeert Uytterhoeven 12553ce858cbSGeert Uytterhoeven res = crypto_compress_update(tfm, &req); 12563ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 12578064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression update failed on test " 12583ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 12593ce858cbSGeert Uytterhoeven return res; 12608064efb8SGeert Uytterhoeven } 12613ce858cbSGeert Uytterhoeven if (res > 0) 12623ce858cbSGeert Uytterhoeven produced += res; 12638064efb8SGeert Uytterhoeven 12648064efb8SGeert Uytterhoeven /* Add remaining input data */ 12658064efb8SGeert Uytterhoeven req.avail_in += (ctemplate[i].inlen + 1) / 2; 12668064efb8SGeert Uytterhoeven 12673ce858cbSGeert Uytterhoeven res = crypto_compress_update(tfm, &req); 12683ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 12698064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression update failed on test " 12703ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 12713ce858cbSGeert Uytterhoeven return res; 12728064efb8SGeert Uytterhoeven } 12733ce858cbSGeert Uytterhoeven if (res > 0) 12743ce858cbSGeert Uytterhoeven produced += res; 12758064efb8SGeert Uytterhoeven 12768064efb8SGeert Uytterhoeven /* Provide remaining output space */ 12778064efb8SGeert Uytterhoeven req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2; 12788064efb8SGeert Uytterhoeven 12793ce858cbSGeert Uytterhoeven res = crypto_compress_final(tfm, &req); 12803ce858cbSGeert Uytterhoeven if (res < 0) { 12818064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression final failed on test " 12823ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 12833ce858cbSGeert Uytterhoeven return res; 12848064efb8SGeert Uytterhoeven } 12853ce858cbSGeert Uytterhoeven produced += res; 12868064efb8SGeert Uytterhoeven 12878064efb8SGeert Uytterhoeven if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) { 12888064efb8SGeert Uytterhoeven pr_err("alg: comp: Compression test %d failed for %s: " 12898064efb8SGeert Uytterhoeven "output len = %d (expected %d)\n", i + 1, algo, 12908064efb8SGeert Uytterhoeven COMP_BUF_SIZE - req.avail_out, 12918064efb8SGeert Uytterhoeven ctemplate[i].outlen); 12928064efb8SGeert Uytterhoeven return -EINVAL; 12938064efb8SGeert Uytterhoeven } 12948064efb8SGeert Uytterhoeven 12953ce858cbSGeert Uytterhoeven if (produced != ctemplate[i].outlen) { 12963ce858cbSGeert Uytterhoeven pr_err("alg: comp: Compression test %d failed for %s: " 12973ce858cbSGeert Uytterhoeven "returned len = %u (expected %d)\n", i + 1, 12983ce858cbSGeert Uytterhoeven algo, produced, ctemplate[i].outlen); 12993ce858cbSGeert Uytterhoeven return -EINVAL; 13003ce858cbSGeert Uytterhoeven } 13013ce858cbSGeert Uytterhoeven 13028064efb8SGeert Uytterhoeven if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) { 13038064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Compression test %d failed for " 13048064efb8SGeert Uytterhoeven "%s\n", i + 1, algo); 13058064efb8SGeert Uytterhoeven hexdump(result, ctemplate[i].outlen); 13068064efb8SGeert Uytterhoeven return -EINVAL; 13078064efb8SGeert Uytterhoeven } 13088064efb8SGeert Uytterhoeven } 13098064efb8SGeert Uytterhoeven 13108064efb8SGeert Uytterhoeven for (i = 0; i < dtcount; i++) { 13118064efb8SGeert Uytterhoeven struct comp_request req; 13123ce858cbSGeert Uytterhoeven unsigned int produced = 0; 13138064efb8SGeert Uytterhoeven 13143ce858cbSGeert Uytterhoeven res = crypto_decompress_setup(tfm, dtemplate[i].params, 13158064efb8SGeert Uytterhoeven dtemplate[i].paramsize); 13163ce858cbSGeert Uytterhoeven if (res) { 13178064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression setup failed on " 13183ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 13193ce858cbSGeert Uytterhoeven return res; 13208064efb8SGeert Uytterhoeven } 13218064efb8SGeert Uytterhoeven 13223ce858cbSGeert Uytterhoeven res = crypto_decompress_init(tfm); 13233ce858cbSGeert Uytterhoeven if (res) { 13248064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression init failed on test " 13253ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 13263ce858cbSGeert Uytterhoeven return res; 13278064efb8SGeert Uytterhoeven } 13288064efb8SGeert Uytterhoeven 13298064efb8SGeert Uytterhoeven memset(result, 0, sizeof(result)); 13308064efb8SGeert Uytterhoeven 13318064efb8SGeert Uytterhoeven req.next_in = dtemplate[i].input; 13328064efb8SGeert Uytterhoeven req.avail_in = dtemplate[i].inlen / 2; 13338064efb8SGeert Uytterhoeven req.next_out = result; 13348064efb8SGeert Uytterhoeven req.avail_out = dtemplate[i].outlen / 2; 13358064efb8SGeert Uytterhoeven 13363ce858cbSGeert Uytterhoeven res = crypto_decompress_update(tfm, &req); 13373ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 13388064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression update failed on " 13393ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 13403ce858cbSGeert Uytterhoeven return res; 13418064efb8SGeert Uytterhoeven } 13423ce858cbSGeert Uytterhoeven if (res > 0) 13433ce858cbSGeert Uytterhoeven produced += res; 13448064efb8SGeert Uytterhoeven 13458064efb8SGeert Uytterhoeven /* Add remaining input data */ 13468064efb8SGeert Uytterhoeven req.avail_in += (dtemplate[i].inlen + 1) / 2; 13478064efb8SGeert Uytterhoeven 13483ce858cbSGeert Uytterhoeven res = crypto_decompress_update(tfm, &req); 13493ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 13508064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression update failed on " 13513ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 13523ce858cbSGeert Uytterhoeven return res; 13538064efb8SGeert Uytterhoeven } 13543ce858cbSGeert Uytterhoeven if (res > 0) 13553ce858cbSGeert Uytterhoeven produced += res; 13568064efb8SGeert Uytterhoeven 13578064efb8SGeert Uytterhoeven /* Provide remaining output space */ 13588064efb8SGeert Uytterhoeven req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2; 13598064efb8SGeert Uytterhoeven 13603ce858cbSGeert Uytterhoeven res = crypto_decompress_final(tfm, &req); 13613ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 13628064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression final failed on " 13633ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 13643ce858cbSGeert Uytterhoeven return res; 13658064efb8SGeert Uytterhoeven } 13663ce858cbSGeert Uytterhoeven if (res > 0) 13673ce858cbSGeert Uytterhoeven produced += res; 13688064efb8SGeert Uytterhoeven 13698064efb8SGeert Uytterhoeven if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) { 13708064efb8SGeert Uytterhoeven pr_err("alg: comp: Decompression test %d failed for " 13718064efb8SGeert Uytterhoeven "%s: output len = %d (expected %d)\n", i + 1, 13728064efb8SGeert Uytterhoeven algo, COMP_BUF_SIZE - req.avail_out, 13738064efb8SGeert Uytterhoeven dtemplate[i].outlen); 13748064efb8SGeert Uytterhoeven return -EINVAL; 13758064efb8SGeert Uytterhoeven } 13768064efb8SGeert Uytterhoeven 13773ce858cbSGeert Uytterhoeven if (produced != dtemplate[i].outlen) { 13783ce858cbSGeert Uytterhoeven pr_err("alg: comp: Decompression test %d failed for " 13793ce858cbSGeert Uytterhoeven "%s: returned len = %u (expected %d)\n", i + 1, 13803ce858cbSGeert Uytterhoeven algo, produced, dtemplate[i].outlen); 13813ce858cbSGeert Uytterhoeven return -EINVAL; 13823ce858cbSGeert Uytterhoeven } 13833ce858cbSGeert Uytterhoeven 13848064efb8SGeert Uytterhoeven if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) { 13858064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Decompression test %d failed for " 13868064efb8SGeert Uytterhoeven "%s\n", i + 1, algo); 13878064efb8SGeert Uytterhoeven hexdump(result, dtemplate[i].outlen); 13888064efb8SGeert Uytterhoeven return -EINVAL; 13898064efb8SGeert Uytterhoeven } 13908064efb8SGeert Uytterhoeven } 13918064efb8SGeert Uytterhoeven 13928064efb8SGeert Uytterhoeven return 0; 13938064efb8SGeert Uytterhoeven } 13948064efb8SGeert Uytterhoeven 13957647d6ceSJarod Wilson 13967647d6ceSJarod Wilson static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template, 13977647d6ceSJarod Wilson unsigned int tcount) 13987647d6ceSJarod Wilson { 13997647d6ceSJarod Wilson const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm)); 1400fa4ef8a6SFelipe Contreras int err = 0, i, j, seedsize; 14017647d6ceSJarod Wilson u8 *seed; 14027647d6ceSJarod Wilson char result[32]; 14037647d6ceSJarod Wilson 14047647d6ceSJarod Wilson seedsize = crypto_rng_seedsize(tfm); 14057647d6ceSJarod Wilson 14067647d6ceSJarod Wilson seed = kmalloc(seedsize, GFP_KERNEL); 14077647d6ceSJarod Wilson if (!seed) { 14087647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to allocate seed space " 14097647d6ceSJarod Wilson "for %s\n", algo); 14107647d6ceSJarod Wilson return -ENOMEM; 14117647d6ceSJarod Wilson } 14127647d6ceSJarod Wilson 14137647d6ceSJarod Wilson for (i = 0; i < tcount; i++) { 14147647d6ceSJarod Wilson memset(result, 0, 32); 14157647d6ceSJarod Wilson 14167647d6ceSJarod Wilson memcpy(seed, template[i].v, template[i].vlen); 14177647d6ceSJarod Wilson memcpy(seed + template[i].vlen, template[i].key, 14187647d6ceSJarod Wilson template[i].klen); 14197647d6ceSJarod Wilson memcpy(seed + template[i].vlen + template[i].klen, 14207647d6ceSJarod Wilson template[i].dt, template[i].dtlen); 14217647d6ceSJarod Wilson 14227647d6ceSJarod Wilson err = crypto_rng_reset(tfm, seed, seedsize); 14237647d6ceSJarod Wilson if (err) { 14247647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to reset rng " 14257647d6ceSJarod Wilson "for %s\n", algo); 14267647d6ceSJarod Wilson goto out; 14277647d6ceSJarod Wilson } 14287647d6ceSJarod Wilson 14297647d6ceSJarod Wilson for (j = 0; j < template[i].loops; j++) { 14307647d6ceSJarod Wilson err = crypto_rng_get_bytes(tfm, result, 14317647d6ceSJarod Wilson template[i].rlen); 14327647d6ceSJarod Wilson if (err != template[i].rlen) { 14337647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to obtain " 14347647d6ceSJarod Wilson "the correct amount of random data for " 14357647d6ceSJarod Wilson "%s (requested %d, got %d)\n", algo, 14367647d6ceSJarod Wilson template[i].rlen, err); 14377647d6ceSJarod Wilson goto out; 14387647d6ceSJarod Wilson } 14397647d6ceSJarod Wilson } 14407647d6ceSJarod Wilson 14417647d6ceSJarod Wilson err = memcmp(result, template[i].result, 14427647d6ceSJarod Wilson template[i].rlen); 14437647d6ceSJarod Wilson if (err) { 14447647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Test %d failed for %s\n", 14457647d6ceSJarod Wilson i, algo); 14467647d6ceSJarod Wilson hexdump(result, template[i].rlen); 14477647d6ceSJarod Wilson err = -EINVAL; 14487647d6ceSJarod Wilson goto out; 14497647d6ceSJarod Wilson } 14507647d6ceSJarod Wilson } 14517647d6ceSJarod Wilson 14527647d6ceSJarod Wilson out: 14537647d6ceSJarod Wilson kfree(seed); 14547647d6ceSJarod Wilson return err; 14557647d6ceSJarod Wilson } 14567647d6ceSJarod Wilson 1457da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver, 1458da7f033dSHerbert Xu u32 type, u32 mask) 1459da7f033dSHerbert Xu { 1460da7f033dSHerbert Xu struct crypto_aead *tfm; 1461da7f033dSHerbert Xu int err = 0; 1462da7f033dSHerbert Xu 1463da7f033dSHerbert Xu tfm = crypto_alloc_aead(driver, type, mask); 1464da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1465da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to load transform for %s: " 1466da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1467da7f033dSHerbert Xu return PTR_ERR(tfm); 1468da7f033dSHerbert Xu } 1469da7f033dSHerbert Xu 1470da7f033dSHerbert Xu if (desc->suite.aead.enc.vecs) { 1471da7f033dSHerbert Xu err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs, 1472da7f033dSHerbert Xu desc->suite.aead.enc.count); 1473da7f033dSHerbert Xu if (err) 1474da7f033dSHerbert Xu goto out; 1475da7f033dSHerbert Xu } 1476da7f033dSHerbert Xu 1477da7f033dSHerbert Xu if (!err && desc->suite.aead.dec.vecs) 1478da7f033dSHerbert Xu err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs, 1479da7f033dSHerbert Xu desc->suite.aead.dec.count); 1480da7f033dSHerbert Xu 1481da7f033dSHerbert Xu out: 1482da7f033dSHerbert Xu crypto_free_aead(tfm); 1483da7f033dSHerbert Xu return err; 1484da7f033dSHerbert Xu } 1485da7f033dSHerbert Xu 1486da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc, 1487da7f033dSHerbert Xu const char *driver, u32 type, u32 mask) 1488da7f033dSHerbert Xu { 14891aa4ecd9SHerbert Xu struct crypto_cipher *tfm; 1490da7f033dSHerbert Xu int err = 0; 1491da7f033dSHerbert Xu 14921aa4ecd9SHerbert Xu tfm = crypto_alloc_cipher(driver, type, mask); 1493da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1494da7f033dSHerbert Xu printk(KERN_ERR "alg: cipher: Failed to load transform for " 1495da7f033dSHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 1496da7f033dSHerbert Xu return PTR_ERR(tfm); 1497da7f033dSHerbert Xu } 1498da7f033dSHerbert Xu 1499da7f033dSHerbert Xu if (desc->suite.cipher.enc.vecs) { 1500da7f033dSHerbert Xu err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 1501da7f033dSHerbert Xu desc->suite.cipher.enc.count); 1502da7f033dSHerbert Xu if (err) 1503da7f033dSHerbert Xu goto out; 1504da7f033dSHerbert Xu } 1505da7f033dSHerbert Xu 1506da7f033dSHerbert Xu if (desc->suite.cipher.dec.vecs) 1507da7f033dSHerbert Xu err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 1508da7f033dSHerbert Xu desc->suite.cipher.dec.count); 1509da7f033dSHerbert Xu 1510da7f033dSHerbert Xu out: 15111aa4ecd9SHerbert Xu crypto_free_cipher(tfm); 15121aa4ecd9SHerbert Xu return err; 15131aa4ecd9SHerbert Xu } 15141aa4ecd9SHerbert Xu 15151aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc, 15161aa4ecd9SHerbert Xu const char *driver, u32 type, u32 mask) 15171aa4ecd9SHerbert Xu { 15181aa4ecd9SHerbert Xu struct crypto_ablkcipher *tfm; 15191aa4ecd9SHerbert Xu int err = 0; 15201aa4ecd9SHerbert Xu 15211aa4ecd9SHerbert Xu tfm = crypto_alloc_ablkcipher(driver, type, mask); 15221aa4ecd9SHerbert Xu if (IS_ERR(tfm)) { 15231aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Failed to load transform for " 15241aa4ecd9SHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 15251aa4ecd9SHerbert Xu return PTR_ERR(tfm); 15261aa4ecd9SHerbert Xu } 15271aa4ecd9SHerbert Xu 15281aa4ecd9SHerbert Xu if (desc->suite.cipher.enc.vecs) { 15291aa4ecd9SHerbert Xu err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 15301aa4ecd9SHerbert Xu desc->suite.cipher.enc.count); 15311aa4ecd9SHerbert Xu if (err) 15321aa4ecd9SHerbert Xu goto out; 15331aa4ecd9SHerbert Xu } 15341aa4ecd9SHerbert Xu 15351aa4ecd9SHerbert Xu if (desc->suite.cipher.dec.vecs) 15361aa4ecd9SHerbert Xu err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 15371aa4ecd9SHerbert Xu desc->suite.cipher.dec.count); 15381aa4ecd9SHerbert Xu 15391aa4ecd9SHerbert Xu out: 1540da7f033dSHerbert Xu crypto_free_ablkcipher(tfm); 1541da7f033dSHerbert Xu return err; 1542da7f033dSHerbert Xu } 1543da7f033dSHerbert Xu 1544da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver, 1545da7f033dSHerbert Xu u32 type, u32 mask) 1546da7f033dSHerbert Xu { 1547da7f033dSHerbert Xu struct crypto_comp *tfm; 1548da7f033dSHerbert Xu int err; 1549da7f033dSHerbert Xu 1550da7f033dSHerbert Xu tfm = crypto_alloc_comp(driver, type, mask); 1551da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1552da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Failed to load transform for %s: " 1553da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1554da7f033dSHerbert Xu return PTR_ERR(tfm); 1555da7f033dSHerbert Xu } 1556da7f033dSHerbert Xu 1557da7f033dSHerbert Xu err = test_comp(tfm, desc->suite.comp.comp.vecs, 1558da7f033dSHerbert Xu desc->suite.comp.decomp.vecs, 1559da7f033dSHerbert Xu desc->suite.comp.comp.count, 1560da7f033dSHerbert Xu desc->suite.comp.decomp.count); 1561da7f033dSHerbert Xu 1562da7f033dSHerbert Xu crypto_free_comp(tfm); 1563da7f033dSHerbert Xu return err; 1564da7f033dSHerbert Xu } 1565da7f033dSHerbert Xu 15668064efb8SGeert Uytterhoeven static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver, 15678064efb8SGeert Uytterhoeven u32 type, u32 mask) 15688064efb8SGeert Uytterhoeven { 15698064efb8SGeert Uytterhoeven struct crypto_pcomp *tfm; 15708064efb8SGeert Uytterhoeven int err; 15718064efb8SGeert Uytterhoeven 15728064efb8SGeert Uytterhoeven tfm = crypto_alloc_pcomp(driver, type, mask); 15738064efb8SGeert Uytterhoeven if (IS_ERR(tfm)) { 15748064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Failed to load transform for %s: %ld\n", 15758064efb8SGeert Uytterhoeven driver, PTR_ERR(tfm)); 15768064efb8SGeert Uytterhoeven return PTR_ERR(tfm); 15778064efb8SGeert Uytterhoeven } 15788064efb8SGeert Uytterhoeven 15798064efb8SGeert Uytterhoeven err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs, 15808064efb8SGeert Uytterhoeven desc->suite.pcomp.decomp.vecs, 15818064efb8SGeert Uytterhoeven desc->suite.pcomp.comp.count, 15828064efb8SGeert Uytterhoeven desc->suite.pcomp.decomp.count); 15838064efb8SGeert Uytterhoeven 15848064efb8SGeert Uytterhoeven crypto_free_pcomp(tfm); 15858064efb8SGeert Uytterhoeven return err; 15868064efb8SGeert Uytterhoeven } 15878064efb8SGeert Uytterhoeven 1588da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver, 1589da7f033dSHerbert Xu u32 type, u32 mask) 1590da7f033dSHerbert Xu { 1591da7f033dSHerbert Xu struct crypto_ahash *tfm; 1592da7f033dSHerbert Xu int err; 1593da7f033dSHerbert Xu 1594da7f033dSHerbert Xu tfm = crypto_alloc_ahash(driver, type, mask); 1595da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1596da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to load transform for %s: " 1597da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1598da7f033dSHerbert Xu return PTR_ERR(tfm); 1599da7f033dSHerbert Xu } 1600da7f033dSHerbert Xu 1601a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1602a8f1a052SDavid S. Miller desc->suite.hash.count, true); 1603a8f1a052SDavid S. Miller if (!err) 1604a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1605a8f1a052SDavid S. Miller desc->suite.hash.count, false); 1606da7f033dSHerbert Xu 1607da7f033dSHerbert Xu crypto_free_ahash(tfm); 1608da7f033dSHerbert Xu return err; 1609da7f033dSHerbert Xu } 1610da7f033dSHerbert Xu 16118e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc, 16128e3ee85eSHerbert Xu const char *driver, u32 type, u32 mask) 16138e3ee85eSHerbert Xu { 16148e3ee85eSHerbert Xu struct crypto_shash *tfm; 16158e3ee85eSHerbert Xu u32 val; 16168e3ee85eSHerbert Xu int err; 16178e3ee85eSHerbert Xu 16188e3ee85eSHerbert Xu err = alg_test_hash(desc, driver, type, mask); 16198e3ee85eSHerbert Xu if (err) 16208e3ee85eSHerbert Xu goto out; 16218e3ee85eSHerbert Xu 16228e3ee85eSHerbert Xu tfm = crypto_alloc_shash(driver, type, mask); 16238e3ee85eSHerbert Xu if (IS_ERR(tfm)) { 16248e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: " 16258e3ee85eSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 16268e3ee85eSHerbert Xu err = PTR_ERR(tfm); 16278e3ee85eSHerbert Xu goto out; 16288e3ee85eSHerbert Xu } 16298e3ee85eSHerbert Xu 16308e3ee85eSHerbert Xu do { 16318e3ee85eSHerbert Xu struct { 16328e3ee85eSHerbert Xu struct shash_desc shash; 16338e3ee85eSHerbert Xu char ctx[crypto_shash_descsize(tfm)]; 16348e3ee85eSHerbert Xu } sdesc; 16358e3ee85eSHerbert Xu 16368e3ee85eSHerbert Xu sdesc.shash.tfm = tfm; 16378e3ee85eSHerbert Xu sdesc.shash.flags = 0; 16388e3ee85eSHerbert Xu 16398e3ee85eSHerbert Xu *(u32 *)sdesc.ctx = le32_to_cpu(420553207); 16408e3ee85eSHerbert Xu err = crypto_shash_final(&sdesc.shash, (u8 *)&val); 16418e3ee85eSHerbert Xu if (err) { 16428e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Operation failed for " 16438e3ee85eSHerbert Xu "%s: %d\n", driver, err); 16448e3ee85eSHerbert Xu break; 16458e3ee85eSHerbert Xu } 16468e3ee85eSHerbert Xu 16478e3ee85eSHerbert Xu if (val != ~420553207) { 16488e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Test failed for %s: " 16498e3ee85eSHerbert Xu "%d\n", driver, val); 16508e3ee85eSHerbert Xu err = -EINVAL; 16518e3ee85eSHerbert Xu } 16528e3ee85eSHerbert Xu } while (0); 16538e3ee85eSHerbert Xu 16548e3ee85eSHerbert Xu crypto_free_shash(tfm); 16558e3ee85eSHerbert Xu 16568e3ee85eSHerbert Xu out: 16578e3ee85eSHerbert Xu return err; 16588e3ee85eSHerbert Xu } 16598e3ee85eSHerbert Xu 16607647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver, 16617647d6ceSJarod Wilson u32 type, u32 mask) 16627647d6ceSJarod Wilson { 16637647d6ceSJarod Wilson struct crypto_rng *rng; 16647647d6ceSJarod Wilson int err; 16657647d6ceSJarod Wilson 16667647d6ceSJarod Wilson rng = crypto_alloc_rng(driver, type, mask); 16677647d6ceSJarod Wilson if (IS_ERR(rng)) { 16687647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to load transform for %s: " 16697647d6ceSJarod Wilson "%ld\n", driver, PTR_ERR(rng)); 16707647d6ceSJarod Wilson return PTR_ERR(rng); 16717647d6ceSJarod Wilson } 16727647d6ceSJarod Wilson 16737647d6ceSJarod Wilson err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count); 16747647d6ceSJarod Wilson 16757647d6ceSJarod Wilson crypto_free_rng(rng); 16767647d6ceSJarod Wilson 16777647d6ceSJarod Wilson return err; 16787647d6ceSJarod Wilson } 16797647d6ceSJarod Wilson 1680863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc, 1681863b557aSYouquan, Song const char *driver, u32 type, u32 mask) 1682863b557aSYouquan, Song { 1683863b557aSYouquan, Song return 0; 1684863b557aSYouquan, Song } 1685863b557aSYouquan, Song 1686da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */ 1687da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = { 1688da7f033dSHerbert Xu { 16894d6d6a2cSJohannes Goetzfried .alg = "__cbc-cast5-avx", 16904d6d6a2cSJohannes Goetzfried .test = alg_test_null, 16914d6d6a2cSJohannes Goetzfried }, { 16924ea1277dSJohannes Goetzfried .alg = "__cbc-cast6-avx", 16934ea1277dSJohannes Goetzfried .test = alg_test_null, 16944ea1277dSJohannes Goetzfried }, { 16957efe4076SJohannes Goetzfried .alg = "__cbc-serpent-avx", 16967efe4076SJohannes Goetzfried .test = alg_test_null, 16977efe4076SJohannes Goetzfried }, { 169856d76c96SJussi Kivilinna .alg = "__cbc-serpent-avx2", 169956d76c96SJussi Kivilinna .test = alg_test_null, 170056d76c96SJussi Kivilinna }, { 1701937c30d7SJussi Kivilinna .alg = "__cbc-serpent-sse2", 1702937c30d7SJussi Kivilinna .test = alg_test_null, 1703937c30d7SJussi Kivilinna }, { 1704107778b5SJohannes Goetzfried .alg = "__cbc-twofish-avx", 1705107778b5SJohannes Goetzfried .test = alg_test_null, 1706107778b5SJohannes Goetzfried }, { 1707863b557aSYouquan, Song .alg = "__driver-cbc-aes-aesni", 1708863b557aSYouquan, Song .test = alg_test_null, 17096c79294fSMilan Broz .fips_allowed = 1, 1710863b557aSYouquan, Song }, { 1711d9b1d2e7SJussi Kivilinna .alg = "__driver-cbc-camellia-aesni", 1712d9b1d2e7SJussi Kivilinna .test = alg_test_null, 1713d9b1d2e7SJussi Kivilinna }, { 1714f3f935a7SJussi Kivilinna .alg = "__driver-cbc-camellia-aesni-avx2", 1715f3f935a7SJussi Kivilinna .test = alg_test_null, 1716f3f935a7SJussi Kivilinna }, { 17174d6d6a2cSJohannes Goetzfried .alg = "__driver-cbc-cast5-avx", 17184d6d6a2cSJohannes Goetzfried .test = alg_test_null, 17194d6d6a2cSJohannes Goetzfried }, { 17204ea1277dSJohannes Goetzfried .alg = "__driver-cbc-cast6-avx", 17214ea1277dSJohannes Goetzfried .test = alg_test_null, 17224ea1277dSJohannes Goetzfried }, { 17237efe4076SJohannes Goetzfried .alg = "__driver-cbc-serpent-avx", 17247efe4076SJohannes Goetzfried .test = alg_test_null, 17257efe4076SJohannes Goetzfried }, { 172656d76c96SJussi Kivilinna .alg = "__driver-cbc-serpent-avx2", 172756d76c96SJussi Kivilinna .test = alg_test_null, 172856d76c96SJussi Kivilinna }, { 1729937c30d7SJussi Kivilinna .alg = "__driver-cbc-serpent-sse2", 1730937c30d7SJussi Kivilinna .test = alg_test_null, 1731937c30d7SJussi Kivilinna }, { 1732107778b5SJohannes Goetzfried .alg = "__driver-cbc-twofish-avx", 1733107778b5SJohannes Goetzfried .test = alg_test_null, 1734107778b5SJohannes Goetzfried }, { 1735863b557aSYouquan, Song .alg = "__driver-ecb-aes-aesni", 1736863b557aSYouquan, Song .test = alg_test_null, 17376c79294fSMilan Broz .fips_allowed = 1, 1738863b557aSYouquan, Song }, { 1739d9b1d2e7SJussi Kivilinna .alg = "__driver-ecb-camellia-aesni", 1740d9b1d2e7SJussi Kivilinna .test = alg_test_null, 1741d9b1d2e7SJussi Kivilinna }, { 1742f3f935a7SJussi Kivilinna .alg = "__driver-ecb-camellia-aesni-avx2", 1743f3f935a7SJussi Kivilinna .test = alg_test_null, 1744f3f935a7SJussi Kivilinna }, { 17454d6d6a2cSJohannes Goetzfried .alg = "__driver-ecb-cast5-avx", 17464d6d6a2cSJohannes Goetzfried .test = alg_test_null, 17474d6d6a2cSJohannes Goetzfried }, { 17484ea1277dSJohannes Goetzfried .alg = "__driver-ecb-cast6-avx", 17494ea1277dSJohannes Goetzfried .test = alg_test_null, 17504ea1277dSJohannes Goetzfried }, { 17517efe4076SJohannes Goetzfried .alg = "__driver-ecb-serpent-avx", 17527efe4076SJohannes Goetzfried .test = alg_test_null, 17537efe4076SJohannes Goetzfried }, { 175456d76c96SJussi Kivilinna .alg = "__driver-ecb-serpent-avx2", 175556d76c96SJussi Kivilinna .test = alg_test_null, 175656d76c96SJussi Kivilinna }, { 1757937c30d7SJussi Kivilinna .alg = "__driver-ecb-serpent-sse2", 1758937c30d7SJussi Kivilinna .test = alg_test_null, 1759937c30d7SJussi Kivilinna }, { 1760107778b5SJohannes Goetzfried .alg = "__driver-ecb-twofish-avx", 1761107778b5SJohannes Goetzfried .test = alg_test_null, 1762107778b5SJohannes Goetzfried }, { 1763863b557aSYouquan, Song .alg = "__ghash-pclmulqdqni", 1764863b557aSYouquan, Song .test = alg_test_null, 17656c79294fSMilan Broz .fips_allowed = 1, 1766863b557aSYouquan, Song }, { 1767e08ca2daSJarod Wilson .alg = "ansi_cprng", 1768e08ca2daSJarod Wilson .test = alg_test_cprng, 1769a1915d51SJarod Wilson .fips_allowed = 1, 1770e08ca2daSJarod Wilson .suite = { 1771e08ca2daSJarod Wilson .cprng = { 1772e08ca2daSJarod Wilson .vecs = ansi_cprng_aes_tv_template, 1773e08ca2daSJarod Wilson .count = ANSI_CPRNG_AES_TEST_VECTORS 1774e08ca2daSJarod Wilson } 1775e08ca2daSJarod Wilson } 1776e08ca2daSJarod Wilson }, { 1777e46e9a46SHoria Geanta .alg = "authenc(hmac(sha1),cbc(aes))", 1778e46e9a46SHoria Geanta .test = alg_test_aead, 1779e46e9a46SHoria Geanta .fips_allowed = 1, 1780e46e9a46SHoria Geanta .suite = { 1781e46e9a46SHoria Geanta .aead = { 1782e46e9a46SHoria Geanta .enc = { 1783e46e9a46SHoria Geanta .vecs = hmac_sha1_aes_cbc_enc_tv_template, 1784e46e9a46SHoria Geanta .count = HMAC_SHA1_AES_CBC_ENC_TEST_VECTORS 1785e46e9a46SHoria Geanta } 1786e46e9a46SHoria Geanta } 1787e46e9a46SHoria Geanta } 1788e46e9a46SHoria Geanta }, { 1789e46e9a46SHoria Geanta .alg = "authenc(hmac(sha256),cbc(aes))", 1790e46e9a46SHoria Geanta .test = alg_test_aead, 1791e46e9a46SHoria Geanta .fips_allowed = 1, 1792e46e9a46SHoria Geanta .suite = { 1793e46e9a46SHoria Geanta .aead = { 1794e46e9a46SHoria Geanta .enc = { 1795e46e9a46SHoria Geanta .vecs = hmac_sha256_aes_cbc_enc_tv_template, 1796e46e9a46SHoria Geanta .count = HMAC_SHA256_AES_CBC_ENC_TEST_VECTORS 1797e46e9a46SHoria Geanta } 1798e46e9a46SHoria Geanta } 1799e46e9a46SHoria Geanta } 1800e46e9a46SHoria Geanta }, { 1801e46e9a46SHoria Geanta .alg = "authenc(hmac(sha512),cbc(aes))", 1802e46e9a46SHoria Geanta .test = alg_test_aead, 1803e46e9a46SHoria Geanta .fips_allowed = 1, 1804e46e9a46SHoria Geanta .suite = { 1805e46e9a46SHoria Geanta .aead = { 1806e46e9a46SHoria Geanta .enc = { 1807e46e9a46SHoria Geanta .vecs = hmac_sha512_aes_cbc_enc_tv_template, 1808e46e9a46SHoria Geanta .count = HMAC_SHA512_AES_CBC_ENC_TEST_VECTORS 1809e46e9a46SHoria Geanta } 1810e46e9a46SHoria Geanta } 1811e46e9a46SHoria Geanta } 1812e46e9a46SHoria Geanta }, { 1813da7f033dSHerbert Xu .alg = "cbc(aes)", 18141aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1815a1915d51SJarod Wilson .fips_allowed = 1, 1816da7f033dSHerbert Xu .suite = { 1817da7f033dSHerbert Xu .cipher = { 1818da7f033dSHerbert Xu .enc = { 1819da7f033dSHerbert Xu .vecs = aes_cbc_enc_tv_template, 1820da7f033dSHerbert Xu .count = AES_CBC_ENC_TEST_VECTORS 1821da7f033dSHerbert Xu }, 1822da7f033dSHerbert Xu .dec = { 1823da7f033dSHerbert Xu .vecs = aes_cbc_dec_tv_template, 1824da7f033dSHerbert Xu .count = AES_CBC_DEC_TEST_VECTORS 1825da7f033dSHerbert Xu } 1826da7f033dSHerbert Xu } 1827da7f033dSHerbert Xu } 1828da7f033dSHerbert Xu }, { 1829da7f033dSHerbert Xu .alg = "cbc(anubis)", 18301aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1831da7f033dSHerbert Xu .suite = { 1832da7f033dSHerbert Xu .cipher = { 1833da7f033dSHerbert Xu .enc = { 1834da7f033dSHerbert Xu .vecs = anubis_cbc_enc_tv_template, 1835da7f033dSHerbert Xu .count = ANUBIS_CBC_ENC_TEST_VECTORS 1836da7f033dSHerbert Xu }, 1837da7f033dSHerbert Xu .dec = { 1838da7f033dSHerbert Xu .vecs = anubis_cbc_dec_tv_template, 1839da7f033dSHerbert Xu .count = ANUBIS_CBC_DEC_TEST_VECTORS 1840da7f033dSHerbert Xu } 1841da7f033dSHerbert Xu } 1842da7f033dSHerbert Xu } 1843da7f033dSHerbert Xu }, { 1844da7f033dSHerbert Xu .alg = "cbc(blowfish)", 18451aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1846da7f033dSHerbert Xu .suite = { 1847da7f033dSHerbert Xu .cipher = { 1848da7f033dSHerbert Xu .enc = { 1849da7f033dSHerbert Xu .vecs = bf_cbc_enc_tv_template, 1850da7f033dSHerbert Xu .count = BF_CBC_ENC_TEST_VECTORS 1851da7f033dSHerbert Xu }, 1852da7f033dSHerbert Xu .dec = { 1853da7f033dSHerbert Xu .vecs = bf_cbc_dec_tv_template, 1854da7f033dSHerbert Xu .count = BF_CBC_DEC_TEST_VECTORS 1855da7f033dSHerbert Xu } 1856da7f033dSHerbert Xu } 1857da7f033dSHerbert Xu } 1858da7f033dSHerbert Xu }, { 1859da7f033dSHerbert Xu .alg = "cbc(camellia)", 18601aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1861da7f033dSHerbert Xu .suite = { 1862da7f033dSHerbert Xu .cipher = { 1863da7f033dSHerbert Xu .enc = { 1864da7f033dSHerbert Xu .vecs = camellia_cbc_enc_tv_template, 1865da7f033dSHerbert Xu .count = CAMELLIA_CBC_ENC_TEST_VECTORS 1866da7f033dSHerbert Xu }, 1867da7f033dSHerbert Xu .dec = { 1868da7f033dSHerbert Xu .vecs = camellia_cbc_dec_tv_template, 1869da7f033dSHerbert Xu .count = CAMELLIA_CBC_DEC_TEST_VECTORS 1870da7f033dSHerbert Xu } 1871da7f033dSHerbert Xu } 1872da7f033dSHerbert Xu } 1873da7f033dSHerbert Xu }, { 1874a2c58260SJohannes Goetzfried .alg = "cbc(cast5)", 1875a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 1876a2c58260SJohannes Goetzfried .suite = { 1877a2c58260SJohannes Goetzfried .cipher = { 1878a2c58260SJohannes Goetzfried .enc = { 1879a2c58260SJohannes Goetzfried .vecs = cast5_cbc_enc_tv_template, 1880a2c58260SJohannes Goetzfried .count = CAST5_CBC_ENC_TEST_VECTORS 1881a2c58260SJohannes Goetzfried }, 1882a2c58260SJohannes Goetzfried .dec = { 1883a2c58260SJohannes Goetzfried .vecs = cast5_cbc_dec_tv_template, 1884a2c58260SJohannes Goetzfried .count = CAST5_CBC_DEC_TEST_VECTORS 1885a2c58260SJohannes Goetzfried } 1886a2c58260SJohannes Goetzfried } 1887a2c58260SJohannes Goetzfried } 1888a2c58260SJohannes Goetzfried }, { 18899b8b0405SJohannes Goetzfried .alg = "cbc(cast6)", 18909b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 18919b8b0405SJohannes Goetzfried .suite = { 18929b8b0405SJohannes Goetzfried .cipher = { 18939b8b0405SJohannes Goetzfried .enc = { 18949b8b0405SJohannes Goetzfried .vecs = cast6_cbc_enc_tv_template, 18959b8b0405SJohannes Goetzfried .count = CAST6_CBC_ENC_TEST_VECTORS 18969b8b0405SJohannes Goetzfried }, 18979b8b0405SJohannes Goetzfried .dec = { 18989b8b0405SJohannes Goetzfried .vecs = cast6_cbc_dec_tv_template, 18999b8b0405SJohannes Goetzfried .count = CAST6_CBC_DEC_TEST_VECTORS 19009b8b0405SJohannes Goetzfried } 19019b8b0405SJohannes Goetzfried } 19029b8b0405SJohannes Goetzfried } 19039b8b0405SJohannes Goetzfried }, { 1904da7f033dSHerbert Xu .alg = "cbc(des)", 19051aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1906da7f033dSHerbert Xu .suite = { 1907da7f033dSHerbert Xu .cipher = { 1908da7f033dSHerbert Xu .enc = { 1909da7f033dSHerbert Xu .vecs = des_cbc_enc_tv_template, 1910da7f033dSHerbert Xu .count = DES_CBC_ENC_TEST_VECTORS 1911da7f033dSHerbert Xu }, 1912da7f033dSHerbert Xu .dec = { 1913da7f033dSHerbert Xu .vecs = des_cbc_dec_tv_template, 1914da7f033dSHerbert Xu .count = DES_CBC_DEC_TEST_VECTORS 1915da7f033dSHerbert Xu } 1916da7f033dSHerbert Xu } 1917da7f033dSHerbert Xu } 1918da7f033dSHerbert Xu }, { 1919da7f033dSHerbert Xu .alg = "cbc(des3_ede)", 19201aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1921a1915d51SJarod Wilson .fips_allowed = 1, 1922da7f033dSHerbert Xu .suite = { 1923da7f033dSHerbert Xu .cipher = { 1924da7f033dSHerbert Xu .enc = { 1925da7f033dSHerbert Xu .vecs = des3_ede_cbc_enc_tv_template, 1926da7f033dSHerbert Xu .count = DES3_EDE_CBC_ENC_TEST_VECTORS 1927da7f033dSHerbert Xu }, 1928da7f033dSHerbert Xu .dec = { 1929da7f033dSHerbert Xu .vecs = des3_ede_cbc_dec_tv_template, 1930da7f033dSHerbert Xu .count = DES3_EDE_CBC_DEC_TEST_VECTORS 1931da7f033dSHerbert Xu } 1932da7f033dSHerbert Xu } 1933da7f033dSHerbert Xu } 1934da7f033dSHerbert Xu }, { 19359d25917dSJussi Kivilinna .alg = "cbc(serpent)", 19369d25917dSJussi Kivilinna .test = alg_test_skcipher, 19379d25917dSJussi Kivilinna .suite = { 19389d25917dSJussi Kivilinna .cipher = { 19399d25917dSJussi Kivilinna .enc = { 19409d25917dSJussi Kivilinna .vecs = serpent_cbc_enc_tv_template, 19419d25917dSJussi Kivilinna .count = SERPENT_CBC_ENC_TEST_VECTORS 19429d25917dSJussi Kivilinna }, 19439d25917dSJussi Kivilinna .dec = { 19449d25917dSJussi Kivilinna .vecs = serpent_cbc_dec_tv_template, 19459d25917dSJussi Kivilinna .count = SERPENT_CBC_DEC_TEST_VECTORS 19469d25917dSJussi Kivilinna } 19479d25917dSJussi Kivilinna } 19489d25917dSJussi Kivilinna } 19499d25917dSJussi Kivilinna }, { 1950da7f033dSHerbert Xu .alg = "cbc(twofish)", 19511aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1952da7f033dSHerbert Xu .suite = { 1953da7f033dSHerbert Xu .cipher = { 1954da7f033dSHerbert Xu .enc = { 1955da7f033dSHerbert Xu .vecs = tf_cbc_enc_tv_template, 1956da7f033dSHerbert Xu .count = TF_CBC_ENC_TEST_VECTORS 1957da7f033dSHerbert Xu }, 1958da7f033dSHerbert Xu .dec = { 1959da7f033dSHerbert Xu .vecs = tf_cbc_dec_tv_template, 1960da7f033dSHerbert Xu .count = TF_CBC_DEC_TEST_VECTORS 1961da7f033dSHerbert Xu } 1962da7f033dSHerbert Xu } 1963da7f033dSHerbert Xu } 1964da7f033dSHerbert Xu }, { 1965da7f033dSHerbert Xu .alg = "ccm(aes)", 1966da7f033dSHerbert Xu .test = alg_test_aead, 1967a1915d51SJarod Wilson .fips_allowed = 1, 1968da7f033dSHerbert Xu .suite = { 1969da7f033dSHerbert Xu .aead = { 1970da7f033dSHerbert Xu .enc = { 1971da7f033dSHerbert Xu .vecs = aes_ccm_enc_tv_template, 1972da7f033dSHerbert Xu .count = AES_CCM_ENC_TEST_VECTORS 1973da7f033dSHerbert Xu }, 1974da7f033dSHerbert Xu .dec = { 1975da7f033dSHerbert Xu .vecs = aes_ccm_dec_tv_template, 1976da7f033dSHerbert Xu .count = AES_CCM_DEC_TEST_VECTORS 1977da7f033dSHerbert Xu } 1978da7f033dSHerbert Xu } 1979da7f033dSHerbert Xu } 1980da7f033dSHerbert Xu }, { 198193b5e86aSJussi Kivilinna .alg = "cmac(aes)", 198293b5e86aSJussi Kivilinna .test = alg_test_hash, 198393b5e86aSJussi Kivilinna .suite = { 198493b5e86aSJussi Kivilinna .hash = { 198593b5e86aSJussi Kivilinna .vecs = aes_cmac128_tv_template, 198693b5e86aSJussi Kivilinna .count = CMAC_AES_TEST_VECTORS 198793b5e86aSJussi Kivilinna } 198893b5e86aSJussi Kivilinna } 198993b5e86aSJussi Kivilinna }, { 199093b5e86aSJussi Kivilinna .alg = "cmac(des3_ede)", 199193b5e86aSJussi Kivilinna .test = alg_test_hash, 199293b5e86aSJussi Kivilinna .suite = { 199393b5e86aSJussi Kivilinna .hash = { 199493b5e86aSJussi Kivilinna .vecs = des3_ede_cmac64_tv_template, 199593b5e86aSJussi Kivilinna .count = CMAC_DES3_EDE_TEST_VECTORS 199693b5e86aSJussi Kivilinna } 199793b5e86aSJussi Kivilinna } 199893b5e86aSJussi Kivilinna }, { 1999e448370dSJussi Kivilinna .alg = "compress_null", 2000e448370dSJussi Kivilinna .test = alg_test_null, 2001e448370dSJussi Kivilinna }, { 2002da7f033dSHerbert Xu .alg = "crc32c", 20038e3ee85eSHerbert Xu .test = alg_test_crc32c, 2004a1915d51SJarod Wilson .fips_allowed = 1, 2005da7f033dSHerbert Xu .suite = { 2006da7f033dSHerbert Xu .hash = { 2007da7f033dSHerbert Xu .vecs = crc32c_tv_template, 2008da7f033dSHerbert Xu .count = CRC32C_TEST_VECTORS 2009da7f033dSHerbert Xu } 2010da7f033dSHerbert Xu } 2011da7f033dSHerbert Xu }, { 201239761214STim Chen .alg = "crct10dif", 201339761214STim Chen .test = alg_test_hash, 201439761214STim Chen .fips_allowed = 1, 201539761214STim Chen .suite = { 201639761214STim Chen .hash = { 201739761214STim Chen .vecs = crct10dif_tv_template, 201839761214STim Chen .count = CRCT10DIF_TEST_VECTORS 201939761214STim Chen } 202039761214STim Chen } 202139761214STim Chen }, { 20226c79294fSMilan Broz .alg = "cryptd(__driver-cbc-aes-aesni)", 20236c79294fSMilan Broz .test = alg_test_null, 20246c79294fSMilan Broz .fips_allowed = 1, 20256c79294fSMilan Broz }, { 2026d9b1d2e7SJussi Kivilinna .alg = "cryptd(__driver-cbc-camellia-aesni)", 2027d9b1d2e7SJussi Kivilinna .test = alg_test_null, 2028d9b1d2e7SJussi Kivilinna }, { 2029f3f935a7SJussi Kivilinna .alg = "cryptd(__driver-cbc-camellia-aesni-avx2)", 2030f3f935a7SJussi Kivilinna .test = alg_test_null, 2031f3f935a7SJussi Kivilinna }, { 203256d76c96SJussi Kivilinna .alg = "cryptd(__driver-cbc-serpent-avx2)", 203356d76c96SJussi Kivilinna .test = alg_test_null, 203456d76c96SJussi Kivilinna }, { 2035863b557aSYouquan, Song .alg = "cryptd(__driver-ecb-aes-aesni)", 2036863b557aSYouquan, Song .test = alg_test_null, 20376c79294fSMilan Broz .fips_allowed = 1, 2038863b557aSYouquan, Song }, { 2039d9b1d2e7SJussi Kivilinna .alg = "cryptd(__driver-ecb-camellia-aesni)", 2040d9b1d2e7SJussi Kivilinna .test = alg_test_null, 2041d9b1d2e7SJussi Kivilinna }, { 2042f3f935a7SJussi Kivilinna .alg = "cryptd(__driver-ecb-camellia-aesni-avx2)", 2043f3f935a7SJussi Kivilinna .test = alg_test_null, 2044f3f935a7SJussi Kivilinna }, { 20454d6d6a2cSJohannes Goetzfried .alg = "cryptd(__driver-ecb-cast5-avx)", 20464d6d6a2cSJohannes Goetzfried .test = alg_test_null, 20474d6d6a2cSJohannes Goetzfried }, { 20484ea1277dSJohannes Goetzfried .alg = "cryptd(__driver-ecb-cast6-avx)", 20494ea1277dSJohannes Goetzfried .test = alg_test_null, 20504ea1277dSJohannes Goetzfried }, { 20517efe4076SJohannes Goetzfried .alg = "cryptd(__driver-ecb-serpent-avx)", 20527efe4076SJohannes Goetzfried .test = alg_test_null, 20537efe4076SJohannes Goetzfried }, { 205456d76c96SJussi Kivilinna .alg = "cryptd(__driver-ecb-serpent-avx2)", 205556d76c96SJussi Kivilinna .test = alg_test_null, 205656d76c96SJussi Kivilinna }, { 2057937c30d7SJussi Kivilinna .alg = "cryptd(__driver-ecb-serpent-sse2)", 2058937c30d7SJussi Kivilinna .test = alg_test_null, 2059937c30d7SJussi Kivilinna }, { 2060107778b5SJohannes Goetzfried .alg = "cryptd(__driver-ecb-twofish-avx)", 2061107778b5SJohannes Goetzfried .test = alg_test_null, 2062107778b5SJohannes Goetzfried }, { 20636c79294fSMilan Broz .alg = "cryptd(__driver-gcm-aes-aesni)", 20646c79294fSMilan Broz .test = alg_test_null, 20656c79294fSMilan Broz .fips_allowed = 1, 20666c79294fSMilan Broz }, { 2067863b557aSYouquan, Song .alg = "cryptd(__ghash-pclmulqdqni)", 2068863b557aSYouquan, Song .test = alg_test_null, 20696c79294fSMilan Broz .fips_allowed = 1, 2070863b557aSYouquan, Song }, { 2071f7cb80f2SJarod Wilson .alg = "ctr(aes)", 2072f7cb80f2SJarod Wilson .test = alg_test_skcipher, 2073a1915d51SJarod Wilson .fips_allowed = 1, 2074f7cb80f2SJarod Wilson .suite = { 2075f7cb80f2SJarod Wilson .cipher = { 2076f7cb80f2SJarod Wilson .enc = { 2077f7cb80f2SJarod Wilson .vecs = aes_ctr_enc_tv_template, 2078f7cb80f2SJarod Wilson .count = AES_CTR_ENC_TEST_VECTORS 2079f7cb80f2SJarod Wilson }, 2080f7cb80f2SJarod Wilson .dec = { 2081f7cb80f2SJarod Wilson .vecs = aes_ctr_dec_tv_template, 2082f7cb80f2SJarod Wilson .count = AES_CTR_DEC_TEST_VECTORS 2083f7cb80f2SJarod Wilson } 2084f7cb80f2SJarod Wilson } 2085f7cb80f2SJarod Wilson } 2086f7cb80f2SJarod Wilson }, { 208785b63e34SJussi Kivilinna .alg = "ctr(blowfish)", 208885b63e34SJussi Kivilinna .test = alg_test_skcipher, 208985b63e34SJussi Kivilinna .suite = { 209085b63e34SJussi Kivilinna .cipher = { 209185b63e34SJussi Kivilinna .enc = { 209285b63e34SJussi Kivilinna .vecs = bf_ctr_enc_tv_template, 209385b63e34SJussi Kivilinna .count = BF_CTR_ENC_TEST_VECTORS 209485b63e34SJussi Kivilinna }, 209585b63e34SJussi Kivilinna .dec = { 209685b63e34SJussi Kivilinna .vecs = bf_ctr_dec_tv_template, 209785b63e34SJussi Kivilinna .count = BF_CTR_DEC_TEST_VECTORS 209885b63e34SJussi Kivilinna } 209985b63e34SJussi Kivilinna } 210085b63e34SJussi Kivilinna } 210185b63e34SJussi Kivilinna }, { 21020840605eSJussi Kivilinna .alg = "ctr(camellia)", 21030840605eSJussi Kivilinna .test = alg_test_skcipher, 21040840605eSJussi Kivilinna .suite = { 21050840605eSJussi Kivilinna .cipher = { 21060840605eSJussi Kivilinna .enc = { 21070840605eSJussi Kivilinna .vecs = camellia_ctr_enc_tv_template, 21080840605eSJussi Kivilinna .count = CAMELLIA_CTR_ENC_TEST_VECTORS 21090840605eSJussi Kivilinna }, 21100840605eSJussi Kivilinna .dec = { 21110840605eSJussi Kivilinna .vecs = camellia_ctr_dec_tv_template, 21120840605eSJussi Kivilinna .count = CAMELLIA_CTR_DEC_TEST_VECTORS 21130840605eSJussi Kivilinna } 21140840605eSJussi Kivilinna } 21150840605eSJussi Kivilinna } 21160840605eSJussi Kivilinna }, { 2117a2c58260SJohannes Goetzfried .alg = "ctr(cast5)", 2118a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 2119a2c58260SJohannes Goetzfried .suite = { 2120a2c58260SJohannes Goetzfried .cipher = { 2121a2c58260SJohannes Goetzfried .enc = { 2122a2c58260SJohannes Goetzfried .vecs = cast5_ctr_enc_tv_template, 2123a2c58260SJohannes Goetzfried .count = CAST5_CTR_ENC_TEST_VECTORS 2124a2c58260SJohannes Goetzfried }, 2125a2c58260SJohannes Goetzfried .dec = { 2126a2c58260SJohannes Goetzfried .vecs = cast5_ctr_dec_tv_template, 2127a2c58260SJohannes Goetzfried .count = CAST5_CTR_DEC_TEST_VECTORS 2128a2c58260SJohannes Goetzfried } 2129a2c58260SJohannes Goetzfried } 2130a2c58260SJohannes Goetzfried } 2131a2c58260SJohannes Goetzfried }, { 21329b8b0405SJohannes Goetzfried .alg = "ctr(cast6)", 21339b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 21349b8b0405SJohannes Goetzfried .suite = { 21359b8b0405SJohannes Goetzfried .cipher = { 21369b8b0405SJohannes Goetzfried .enc = { 21379b8b0405SJohannes Goetzfried .vecs = cast6_ctr_enc_tv_template, 21389b8b0405SJohannes Goetzfried .count = CAST6_CTR_ENC_TEST_VECTORS 21399b8b0405SJohannes Goetzfried }, 21409b8b0405SJohannes Goetzfried .dec = { 21419b8b0405SJohannes Goetzfried .vecs = cast6_ctr_dec_tv_template, 21429b8b0405SJohannes Goetzfried .count = CAST6_CTR_DEC_TEST_VECTORS 21439b8b0405SJohannes Goetzfried } 21449b8b0405SJohannes Goetzfried } 21459b8b0405SJohannes Goetzfried } 21469b8b0405SJohannes Goetzfried }, { 21478163fc30SJussi Kivilinna .alg = "ctr(des)", 21488163fc30SJussi Kivilinna .test = alg_test_skcipher, 21498163fc30SJussi Kivilinna .suite = { 21508163fc30SJussi Kivilinna .cipher = { 21518163fc30SJussi Kivilinna .enc = { 21528163fc30SJussi Kivilinna .vecs = des_ctr_enc_tv_template, 21538163fc30SJussi Kivilinna .count = DES_CTR_ENC_TEST_VECTORS 21548163fc30SJussi Kivilinna }, 21558163fc30SJussi Kivilinna .dec = { 21568163fc30SJussi Kivilinna .vecs = des_ctr_dec_tv_template, 21578163fc30SJussi Kivilinna .count = DES_CTR_DEC_TEST_VECTORS 21588163fc30SJussi Kivilinna } 21598163fc30SJussi Kivilinna } 21608163fc30SJussi Kivilinna } 21618163fc30SJussi Kivilinna }, { 2162e080b17aSJussi Kivilinna .alg = "ctr(des3_ede)", 2163e080b17aSJussi Kivilinna .test = alg_test_skcipher, 2164e080b17aSJussi Kivilinna .suite = { 2165e080b17aSJussi Kivilinna .cipher = { 2166e080b17aSJussi Kivilinna .enc = { 2167e080b17aSJussi Kivilinna .vecs = des3_ede_ctr_enc_tv_template, 2168e080b17aSJussi Kivilinna .count = DES3_EDE_CTR_ENC_TEST_VECTORS 2169e080b17aSJussi Kivilinna }, 2170e080b17aSJussi Kivilinna .dec = { 2171e080b17aSJussi Kivilinna .vecs = des3_ede_ctr_dec_tv_template, 2172e080b17aSJussi Kivilinna .count = DES3_EDE_CTR_DEC_TEST_VECTORS 2173e080b17aSJussi Kivilinna } 2174e080b17aSJussi Kivilinna } 2175e080b17aSJussi Kivilinna } 2176e080b17aSJussi Kivilinna }, { 21779d25917dSJussi Kivilinna .alg = "ctr(serpent)", 21789d25917dSJussi Kivilinna .test = alg_test_skcipher, 21799d25917dSJussi Kivilinna .suite = { 21809d25917dSJussi Kivilinna .cipher = { 21819d25917dSJussi Kivilinna .enc = { 21829d25917dSJussi Kivilinna .vecs = serpent_ctr_enc_tv_template, 21839d25917dSJussi Kivilinna .count = SERPENT_CTR_ENC_TEST_VECTORS 21849d25917dSJussi Kivilinna }, 21859d25917dSJussi Kivilinna .dec = { 21869d25917dSJussi Kivilinna .vecs = serpent_ctr_dec_tv_template, 21879d25917dSJussi Kivilinna .count = SERPENT_CTR_DEC_TEST_VECTORS 21889d25917dSJussi Kivilinna } 21899d25917dSJussi Kivilinna } 21909d25917dSJussi Kivilinna } 21919d25917dSJussi Kivilinna }, { 2192573da620SJussi Kivilinna .alg = "ctr(twofish)", 2193573da620SJussi Kivilinna .test = alg_test_skcipher, 2194573da620SJussi Kivilinna .suite = { 2195573da620SJussi Kivilinna .cipher = { 2196573da620SJussi Kivilinna .enc = { 2197573da620SJussi Kivilinna .vecs = tf_ctr_enc_tv_template, 2198573da620SJussi Kivilinna .count = TF_CTR_ENC_TEST_VECTORS 2199573da620SJussi Kivilinna }, 2200573da620SJussi Kivilinna .dec = { 2201573da620SJussi Kivilinna .vecs = tf_ctr_dec_tv_template, 2202573da620SJussi Kivilinna .count = TF_CTR_DEC_TEST_VECTORS 2203573da620SJussi Kivilinna } 2204573da620SJussi Kivilinna } 2205573da620SJussi Kivilinna } 2206573da620SJussi Kivilinna }, { 2207da7f033dSHerbert Xu .alg = "cts(cbc(aes))", 22081aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2209da7f033dSHerbert Xu .suite = { 2210da7f033dSHerbert Xu .cipher = { 2211da7f033dSHerbert Xu .enc = { 2212da7f033dSHerbert Xu .vecs = cts_mode_enc_tv_template, 2213da7f033dSHerbert Xu .count = CTS_MODE_ENC_TEST_VECTORS 2214da7f033dSHerbert Xu }, 2215da7f033dSHerbert Xu .dec = { 2216da7f033dSHerbert Xu .vecs = cts_mode_dec_tv_template, 2217da7f033dSHerbert Xu .count = CTS_MODE_DEC_TEST_VECTORS 2218da7f033dSHerbert Xu } 2219da7f033dSHerbert Xu } 2220da7f033dSHerbert Xu } 2221da7f033dSHerbert Xu }, { 2222da7f033dSHerbert Xu .alg = "deflate", 2223da7f033dSHerbert Xu .test = alg_test_comp, 22240818904dSMilan Broz .fips_allowed = 1, 2225da7f033dSHerbert Xu .suite = { 2226da7f033dSHerbert Xu .comp = { 2227da7f033dSHerbert Xu .comp = { 2228da7f033dSHerbert Xu .vecs = deflate_comp_tv_template, 2229da7f033dSHerbert Xu .count = DEFLATE_COMP_TEST_VECTORS 2230da7f033dSHerbert Xu }, 2231da7f033dSHerbert Xu .decomp = { 2232da7f033dSHerbert Xu .vecs = deflate_decomp_tv_template, 2233da7f033dSHerbert Xu .count = DEFLATE_DECOMP_TEST_VECTORS 2234da7f033dSHerbert Xu } 2235da7f033dSHerbert Xu } 2236da7f033dSHerbert Xu } 2237da7f033dSHerbert Xu }, { 2238e448370dSJussi Kivilinna .alg = "digest_null", 2239e448370dSJussi Kivilinna .test = alg_test_null, 2240e448370dSJussi Kivilinna }, { 2241863b557aSYouquan, Song .alg = "ecb(__aes-aesni)", 2242863b557aSYouquan, Song .test = alg_test_null, 22436c79294fSMilan Broz .fips_allowed = 1, 2244863b557aSYouquan, Song }, { 2245da7f033dSHerbert Xu .alg = "ecb(aes)", 22461aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2247a1915d51SJarod Wilson .fips_allowed = 1, 2248da7f033dSHerbert Xu .suite = { 2249da7f033dSHerbert Xu .cipher = { 2250da7f033dSHerbert Xu .enc = { 2251da7f033dSHerbert Xu .vecs = aes_enc_tv_template, 2252da7f033dSHerbert Xu .count = AES_ENC_TEST_VECTORS 2253da7f033dSHerbert Xu }, 2254da7f033dSHerbert Xu .dec = { 2255da7f033dSHerbert Xu .vecs = aes_dec_tv_template, 2256da7f033dSHerbert Xu .count = AES_DEC_TEST_VECTORS 2257da7f033dSHerbert Xu } 2258da7f033dSHerbert Xu } 2259da7f033dSHerbert Xu } 2260da7f033dSHerbert Xu }, { 2261da7f033dSHerbert Xu .alg = "ecb(anubis)", 22621aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2263da7f033dSHerbert Xu .suite = { 2264da7f033dSHerbert Xu .cipher = { 2265da7f033dSHerbert Xu .enc = { 2266da7f033dSHerbert Xu .vecs = anubis_enc_tv_template, 2267da7f033dSHerbert Xu .count = ANUBIS_ENC_TEST_VECTORS 2268da7f033dSHerbert Xu }, 2269da7f033dSHerbert Xu .dec = { 2270da7f033dSHerbert Xu .vecs = anubis_dec_tv_template, 2271da7f033dSHerbert Xu .count = ANUBIS_DEC_TEST_VECTORS 2272da7f033dSHerbert Xu } 2273da7f033dSHerbert Xu } 2274da7f033dSHerbert Xu } 2275da7f033dSHerbert Xu }, { 2276da7f033dSHerbert Xu .alg = "ecb(arc4)", 22771aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2278da7f033dSHerbert Xu .suite = { 2279da7f033dSHerbert Xu .cipher = { 2280da7f033dSHerbert Xu .enc = { 2281da7f033dSHerbert Xu .vecs = arc4_enc_tv_template, 2282da7f033dSHerbert Xu .count = ARC4_ENC_TEST_VECTORS 2283da7f033dSHerbert Xu }, 2284da7f033dSHerbert Xu .dec = { 2285da7f033dSHerbert Xu .vecs = arc4_dec_tv_template, 2286da7f033dSHerbert Xu .count = ARC4_DEC_TEST_VECTORS 2287da7f033dSHerbert Xu } 2288da7f033dSHerbert Xu } 2289da7f033dSHerbert Xu } 2290da7f033dSHerbert Xu }, { 2291da7f033dSHerbert Xu .alg = "ecb(blowfish)", 22921aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2293da7f033dSHerbert Xu .suite = { 2294da7f033dSHerbert Xu .cipher = { 2295da7f033dSHerbert Xu .enc = { 2296da7f033dSHerbert Xu .vecs = bf_enc_tv_template, 2297da7f033dSHerbert Xu .count = BF_ENC_TEST_VECTORS 2298da7f033dSHerbert Xu }, 2299da7f033dSHerbert Xu .dec = { 2300da7f033dSHerbert Xu .vecs = bf_dec_tv_template, 2301da7f033dSHerbert Xu .count = BF_DEC_TEST_VECTORS 2302da7f033dSHerbert Xu } 2303da7f033dSHerbert Xu } 2304da7f033dSHerbert Xu } 2305da7f033dSHerbert Xu }, { 2306da7f033dSHerbert Xu .alg = "ecb(camellia)", 23071aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2308da7f033dSHerbert Xu .suite = { 2309da7f033dSHerbert Xu .cipher = { 2310da7f033dSHerbert Xu .enc = { 2311da7f033dSHerbert Xu .vecs = camellia_enc_tv_template, 2312da7f033dSHerbert Xu .count = CAMELLIA_ENC_TEST_VECTORS 2313da7f033dSHerbert Xu }, 2314da7f033dSHerbert Xu .dec = { 2315da7f033dSHerbert Xu .vecs = camellia_dec_tv_template, 2316da7f033dSHerbert Xu .count = CAMELLIA_DEC_TEST_VECTORS 2317da7f033dSHerbert Xu } 2318da7f033dSHerbert Xu } 2319da7f033dSHerbert Xu } 2320da7f033dSHerbert Xu }, { 2321da7f033dSHerbert Xu .alg = "ecb(cast5)", 23221aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2323da7f033dSHerbert Xu .suite = { 2324da7f033dSHerbert Xu .cipher = { 2325da7f033dSHerbert Xu .enc = { 2326da7f033dSHerbert Xu .vecs = cast5_enc_tv_template, 2327da7f033dSHerbert Xu .count = CAST5_ENC_TEST_VECTORS 2328da7f033dSHerbert Xu }, 2329da7f033dSHerbert Xu .dec = { 2330da7f033dSHerbert Xu .vecs = cast5_dec_tv_template, 2331da7f033dSHerbert Xu .count = CAST5_DEC_TEST_VECTORS 2332da7f033dSHerbert Xu } 2333da7f033dSHerbert Xu } 2334da7f033dSHerbert Xu } 2335da7f033dSHerbert Xu }, { 2336da7f033dSHerbert Xu .alg = "ecb(cast6)", 23371aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2338da7f033dSHerbert Xu .suite = { 2339da7f033dSHerbert Xu .cipher = { 2340da7f033dSHerbert Xu .enc = { 2341da7f033dSHerbert Xu .vecs = cast6_enc_tv_template, 2342da7f033dSHerbert Xu .count = CAST6_ENC_TEST_VECTORS 2343da7f033dSHerbert Xu }, 2344da7f033dSHerbert Xu .dec = { 2345da7f033dSHerbert Xu .vecs = cast6_dec_tv_template, 2346da7f033dSHerbert Xu .count = CAST6_DEC_TEST_VECTORS 2347da7f033dSHerbert Xu } 2348da7f033dSHerbert Xu } 2349da7f033dSHerbert Xu } 2350da7f033dSHerbert Xu }, { 2351e448370dSJussi Kivilinna .alg = "ecb(cipher_null)", 2352e448370dSJussi Kivilinna .test = alg_test_null, 2353e448370dSJussi Kivilinna }, { 2354da7f033dSHerbert Xu .alg = "ecb(des)", 23551aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2356a1915d51SJarod Wilson .fips_allowed = 1, 2357da7f033dSHerbert Xu .suite = { 2358da7f033dSHerbert Xu .cipher = { 2359da7f033dSHerbert Xu .enc = { 2360da7f033dSHerbert Xu .vecs = des_enc_tv_template, 2361da7f033dSHerbert Xu .count = DES_ENC_TEST_VECTORS 2362da7f033dSHerbert Xu }, 2363da7f033dSHerbert Xu .dec = { 2364da7f033dSHerbert Xu .vecs = des_dec_tv_template, 2365da7f033dSHerbert Xu .count = DES_DEC_TEST_VECTORS 2366da7f033dSHerbert Xu } 2367da7f033dSHerbert Xu } 2368da7f033dSHerbert Xu } 2369da7f033dSHerbert Xu }, { 2370da7f033dSHerbert Xu .alg = "ecb(des3_ede)", 23711aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2372a1915d51SJarod Wilson .fips_allowed = 1, 2373da7f033dSHerbert Xu .suite = { 2374da7f033dSHerbert Xu .cipher = { 2375da7f033dSHerbert Xu .enc = { 2376da7f033dSHerbert Xu .vecs = des3_ede_enc_tv_template, 2377da7f033dSHerbert Xu .count = DES3_EDE_ENC_TEST_VECTORS 2378da7f033dSHerbert Xu }, 2379da7f033dSHerbert Xu .dec = { 2380da7f033dSHerbert Xu .vecs = des3_ede_dec_tv_template, 2381da7f033dSHerbert Xu .count = DES3_EDE_DEC_TEST_VECTORS 2382da7f033dSHerbert Xu } 2383da7f033dSHerbert Xu } 2384da7f033dSHerbert Xu } 2385da7f033dSHerbert Xu }, { 238666e5bd00SJussi Kivilinna .alg = "ecb(fcrypt)", 238766e5bd00SJussi Kivilinna .test = alg_test_skcipher, 238866e5bd00SJussi Kivilinna .suite = { 238966e5bd00SJussi Kivilinna .cipher = { 239066e5bd00SJussi Kivilinna .enc = { 239166e5bd00SJussi Kivilinna .vecs = fcrypt_pcbc_enc_tv_template, 239266e5bd00SJussi Kivilinna .count = 1 239366e5bd00SJussi Kivilinna }, 239466e5bd00SJussi Kivilinna .dec = { 239566e5bd00SJussi Kivilinna .vecs = fcrypt_pcbc_dec_tv_template, 239666e5bd00SJussi Kivilinna .count = 1 239766e5bd00SJussi Kivilinna } 239866e5bd00SJussi Kivilinna } 239966e5bd00SJussi Kivilinna } 240066e5bd00SJussi Kivilinna }, { 2401da7f033dSHerbert Xu .alg = "ecb(khazad)", 24021aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2403da7f033dSHerbert Xu .suite = { 2404da7f033dSHerbert Xu .cipher = { 2405da7f033dSHerbert Xu .enc = { 2406da7f033dSHerbert Xu .vecs = khazad_enc_tv_template, 2407da7f033dSHerbert Xu .count = KHAZAD_ENC_TEST_VECTORS 2408da7f033dSHerbert Xu }, 2409da7f033dSHerbert Xu .dec = { 2410da7f033dSHerbert Xu .vecs = khazad_dec_tv_template, 2411da7f033dSHerbert Xu .count = KHAZAD_DEC_TEST_VECTORS 2412da7f033dSHerbert Xu } 2413da7f033dSHerbert Xu } 2414da7f033dSHerbert Xu } 2415da7f033dSHerbert Xu }, { 2416da7f033dSHerbert Xu .alg = "ecb(seed)", 24171aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2418da7f033dSHerbert Xu .suite = { 2419da7f033dSHerbert Xu .cipher = { 2420da7f033dSHerbert Xu .enc = { 2421da7f033dSHerbert Xu .vecs = seed_enc_tv_template, 2422da7f033dSHerbert Xu .count = SEED_ENC_TEST_VECTORS 2423da7f033dSHerbert Xu }, 2424da7f033dSHerbert Xu .dec = { 2425da7f033dSHerbert Xu .vecs = seed_dec_tv_template, 2426da7f033dSHerbert Xu .count = SEED_DEC_TEST_VECTORS 2427da7f033dSHerbert Xu } 2428da7f033dSHerbert Xu } 2429da7f033dSHerbert Xu } 2430da7f033dSHerbert Xu }, { 2431da7f033dSHerbert Xu .alg = "ecb(serpent)", 24321aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2433da7f033dSHerbert Xu .suite = { 2434da7f033dSHerbert Xu .cipher = { 2435da7f033dSHerbert Xu .enc = { 2436da7f033dSHerbert Xu .vecs = serpent_enc_tv_template, 2437da7f033dSHerbert Xu .count = SERPENT_ENC_TEST_VECTORS 2438da7f033dSHerbert Xu }, 2439da7f033dSHerbert Xu .dec = { 2440da7f033dSHerbert Xu .vecs = serpent_dec_tv_template, 2441da7f033dSHerbert Xu .count = SERPENT_DEC_TEST_VECTORS 2442da7f033dSHerbert Xu } 2443da7f033dSHerbert Xu } 2444da7f033dSHerbert Xu } 2445da7f033dSHerbert Xu }, { 2446da7f033dSHerbert Xu .alg = "ecb(tea)", 24471aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2448da7f033dSHerbert Xu .suite = { 2449da7f033dSHerbert Xu .cipher = { 2450da7f033dSHerbert Xu .enc = { 2451da7f033dSHerbert Xu .vecs = tea_enc_tv_template, 2452da7f033dSHerbert Xu .count = TEA_ENC_TEST_VECTORS 2453da7f033dSHerbert Xu }, 2454da7f033dSHerbert Xu .dec = { 2455da7f033dSHerbert Xu .vecs = tea_dec_tv_template, 2456da7f033dSHerbert Xu .count = TEA_DEC_TEST_VECTORS 2457da7f033dSHerbert Xu } 2458da7f033dSHerbert Xu } 2459da7f033dSHerbert Xu } 2460da7f033dSHerbert Xu }, { 2461da7f033dSHerbert Xu .alg = "ecb(tnepres)", 24621aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2463da7f033dSHerbert Xu .suite = { 2464da7f033dSHerbert Xu .cipher = { 2465da7f033dSHerbert Xu .enc = { 2466da7f033dSHerbert Xu .vecs = tnepres_enc_tv_template, 2467da7f033dSHerbert Xu .count = TNEPRES_ENC_TEST_VECTORS 2468da7f033dSHerbert Xu }, 2469da7f033dSHerbert Xu .dec = { 2470da7f033dSHerbert Xu .vecs = tnepres_dec_tv_template, 2471da7f033dSHerbert Xu .count = TNEPRES_DEC_TEST_VECTORS 2472da7f033dSHerbert Xu } 2473da7f033dSHerbert Xu } 2474da7f033dSHerbert Xu } 2475da7f033dSHerbert Xu }, { 2476da7f033dSHerbert Xu .alg = "ecb(twofish)", 24771aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2478da7f033dSHerbert Xu .suite = { 2479da7f033dSHerbert Xu .cipher = { 2480da7f033dSHerbert Xu .enc = { 2481da7f033dSHerbert Xu .vecs = tf_enc_tv_template, 2482da7f033dSHerbert Xu .count = TF_ENC_TEST_VECTORS 2483da7f033dSHerbert Xu }, 2484da7f033dSHerbert Xu .dec = { 2485da7f033dSHerbert Xu .vecs = tf_dec_tv_template, 2486da7f033dSHerbert Xu .count = TF_DEC_TEST_VECTORS 2487da7f033dSHerbert Xu } 2488da7f033dSHerbert Xu } 2489da7f033dSHerbert Xu } 2490da7f033dSHerbert Xu }, { 2491da7f033dSHerbert Xu .alg = "ecb(xeta)", 24921aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2493da7f033dSHerbert Xu .suite = { 2494da7f033dSHerbert Xu .cipher = { 2495da7f033dSHerbert Xu .enc = { 2496da7f033dSHerbert Xu .vecs = xeta_enc_tv_template, 2497da7f033dSHerbert Xu .count = XETA_ENC_TEST_VECTORS 2498da7f033dSHerbert Xu }, 2499da7f033dSHerbert Xu .dec = { 2500da7f033dSHerbert Xu .vecs = xeta_dec_tv_template, 2501da7f033dSHerbert Xu .count = XETA_DEC_TEST_VECTORS 2502da7f033dSHerbert Xu } 2503da7f033dSHerbert Xu } 2504da7f033dSHerbert Xu } 2505da7f033dSHerbert Xu }, { 2506da7f033dSHerbert Xu .alg = "ecb(xtea)", 25071aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2508da7f033dSHerbert Xu .suite = { 2509da7f033dSHerbert Xu .cipher = { 2510da7f033dSHerbert Xu .enc = { 2511da7f033dSHerbert Xu .vecs = xtea_enc_tv_template, 2512da7f033dSHerbert Xu .count = XTEA_ENC_TEST_VECTORS 2513da7f033dSHerbert Xu }, 2514da7f033dSHerbert Xu .dec = { 2515da7f033dSHerbert Xu .vecs = xtea_dec_tv_template, 2516da7f033dSHerbert Xu .count = XTEA_DEC_TEST_VECTORS 2517da7f033dSHerbert Xu } 2518da7f033dSHerbert Xu } 2519da7f033dSHerbert Xu } 2520da7f033dSHerbert Xu }, { 2521da7f033dSHerbert Xu .alg = "gcm(aes)", 2522da7f033dSHerbert Xu .test = alg_test_aead, 2523a1915d51SJarod Wilson .fips_allowed = 1, 2524da7f033dSHerbert Xu .suite = { 2525da7f033dSHerbert Xu .aead = { 2526da7f033dSHerbert Xu .enc = { 2527da7f033dSHerbert Xu .vecs = aes_gcm_enc_tv_template, 2528da7f033dSHerbert Xu .count = AES_GCM_ENC_TEST_VECTORS 2529da7f033dSHerbert Xu }, 2530da7f033dSHerbert Xu .dec = { 2531da7f033dSHerbert Xu .vecs = aes_gcm_dec_tv_template, 2532da7f033dSHerbert Xu .count = AES_GCM_DEC_TEST_VECTORS 2533da7f033dSHerbert Xu } 2534da7f033dSHerbert Xu } 2535da7f033dSHerbert Xu } 2536da7f033dSHerbert Xu }, { 2537507069c9SYouquan, Song .alg = "ghash", 2538507069c9SYouquan, Song .test = alg_test_hash, 253918c0ebd2SJarod Wilson .fips_allowed = 1, 2540507069c9SYouquan, Song .suite = { 2541507069c9SYouquan, Song .hash = { 2542507069c9SYouquan, Song .vecs = ghash_tv_template, 2543507069c9SYouquan, Song .count = GHASH_TEST_VECTORS 2544507069c9SYouquan, Song } 2545507069c9SYouquan, Song } 2546507069c9SYouquan, Song }, { 2547a482b081SSonic Zhang .alg = "hmac(crc32)", 2548a482b081SSonic Zhang .test = alg_test_hash, 2549a482b081SSonic Zhang .suite = { 2550a482b081SSonic Zhang .hash = { 2551a482b081SSonic Zhang .vecs = bfin_crc_tv_template, 2552a482b081SSonic Zhang .count = BFIN_CRC_TEST_VECTORS 2553a482b081SSonic Zhang } 2554a482b081SSonic Zhang } 2555a482b081SSonic Zhang }, { 2556da7f033dSHerbert Xu .alg = "hmac(md5)", 2557da7f033dSHerbert Xu .test = alg_test_hash, 2558da7f033dSHerbert Xu .suite = { 2559da7f033dSHerbert Xu .hash = { 2560da7f033dSHerbert Xu .vecs = hmac_md5_tv_template, 2561da7f033dSHerbert Xu .count = HMAC_MD5_TEST_VECTORS 2562da7f033dSHerbert Xu } 2563da7f033dSHerbert Xu } 2564da7f033dSHerbert Xu }, { 2565da7f033dSHerbert Xu .alg = "hmac(rmd128)", 2566da7f033dSHerbert Xu .test = alg_test_hash, 2567da7f033dSHerbert Xu .suite = { 2568da7f033dSHerbert Xu .hash = { 2569da7f033dSHerbert Xu .vecs = hmac_rmd128_tv_template, 2570da7f033dSHerbert Xu .count = HMAC_RMD128_TEST_VECTORS 2571da7f033dSHerbert Xu } 2572da7f033dSHerbert Xu } 2573da7f033dSHerbert Xu }, { 2574da7f033dSHerbert Xu .alg = "hmac(rmd160)", 2575da7f033dSHerbert Xu .test = alg_test_hash, 2576da7f033dSHerbert Xu .suite = { 2577da7f033dSHerbert Xu .hash = { 2578da7f033dSHerbert Xu .vecs = hmac_rmd160_tv_template, 2579da7f033dSHerbert Xu .count = HMAC_RMD160_TEST_VECTORS 2580da7f033dSHerbert Xu } 2581da7f033dSHerbert Xu } 2582da7f033dSHerbert Xu }, { 2583da7f033dSHerbert Xu .alg = "hmac(sha1)", 2584da7f033dSHerbert Xu .test = alg_test_hash, 2585a1915d51SJarod Wilson .fips_allowed = 1, 2586da7f033dSHerbert Xu .suite = { 2587da7f033dSHerbert Xu .hash = { 2588da7f033dSHerbert Xu .vecs = hmac_sha1_tv_template, 2589da7f033dSHerbert Xu .count = HMAC_SHA1_TEST_VECTORS 2590da7f033dSHerbert Xu } 2591da7f033dSHerbert Xu } 2592da7f033dSHerbert Xu }, { 2593da7f033dSHerbert Xu .alg = "hmac(sha224)", 2594da7f033dSHerbert Xu .test = alg_test_hash, 2595a1915d51SJarod Wilson .fips_allowed = 1, 2596da7f033dSHerbert Xu .suite = { 2597da7f033dSHerbert Xu .hash = { 2598da7f033dSHerbert Xu .vecs = hmac_sha224_tv_template, 2599da7f033dSHerbert Xu .count = HMAC_SHA224_TEST_VECTORS 2600da7f033dSHerbert Xu } 2601da7f033dSHerbert Xu } 2602da7f033dSHerbert Xu }, { 2603da7f033dSHerbert Xu .alg = "hmac(sha256)", 2604da7f033dSHerbert Xu .test = alg_test_hash, 2605a1915d51SJarod Wilson .fips_allowed = 1, 2606da7f033dSHerbert Xu .suite = { 2607da7f033dSHerbert Xu .hash = { 2608da7f033dSHerbert Xu .vecs = hmac_sha256_tv_template, 2609da7f033dSHerbert Xu .count = HMAC_SHA256_TEST_VECTORS 2610da7f033dSHerbert Xu } 2611da7f033dSHerbert Xu } 2612da7f033dSHerbert Xu }, { 2613da7f033dSHerbert Xu .alg = "hmac(sha384)", 2614da7f033dSHerbert Xu .test = alg_test_hash, 2615a1915d51SJarod Wilson .fips_allowed = 1, 2616da7f033dSHerbert Xu .suite = { 2617da7f033dSHerbert Xu .hash = { 2618da7f033dSHerbert Xu .vecs = hmac_sha384_tv_template, 2619da7f033dSHerbert Xu .count = HMAC_SHA384_TEST_VECTORS 2620da7f033dSHerbert Xu } 2621da7f033dSHerbert Xu } 2622da7f033dSHerbert Xu }, { 2623da7f033dSHerbert Xu .alg = "hmac(sha512)", 2624da7f033dSHerbert Xu .test = alg_test_hash, 2625a1915d51SJarod Wilson .fips_allowed = 1, 2626da7f033dSHerbert Xu .suite = { 2627da7f033dSHerbert Xu .hash = { 2628da7f033dSHerbert Xu .vecs = hmac_sha512_tv_template, 2629da7f033dSHerbert Xu .count = HMAC_SHA512_TEST_VECTORS 2630da7f033dSHerbert Xu } 2631da7f033dSHerbert Xu } 2632da7f033dSHerbert Xu }, { 2633da7f033dSHerbert Xu .alg = "lrw(aes)", 26341aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2635da7f033dSHerbert Xu .suite = { 2636da7f033dSHerbert Xu .cipher = { 2637da7f033dSHerbert Xu .enc = { 2638da7f033dSHerbert Xu .vecs = aes_lrw_enc_tv_template, 2639da7f033dSHerbert Xu .count = AES_LRW_ENC_TEST_VECTORS 2640da7f033dSHerbert Xu }, 2641da7f033dSHerbert Xu .dec = { 2642da7f033dSHerbert Xu .vecs = aes_lrw_dec_tv_template, 2643da7f033dSHerbert Xu .count = AES_LRW_DEC_TEST_VECTORS 2644da7f033dSHerbert Xu } 2645da7f033dSHerbert Xu } 2646da7f033dSHerbert Xu } 2647da7f033dSHerbert Xu }, { 26480840605eSJussi Kivilinna .alg = "lrw(camellia)", 26490840605eSJussi Kivilinna .test = alg_test_skcipher, 26500840605eSJussi Kivilinna .suite = { 26510840605eSJussi Kivilinna .cipher = { 26520840605eSJussi Kivilinna .enc = { 26530840605eSJussi Kivilinna .vecs = camellia_lrw_enc_tv_template, 26540840605eSJussi Kivilinna .count = CAMELLIA_LRW_ENC_TEST_VECTORS 26550840605eSJussi Kivilinna }, 26560840605eSJussi Kivilinna .dec = { 26570840605eSJussi Kivilinna .vecs = camellia_lrw_dec_tv_template, 26580840605eSJussi Kivilinna .count = CAMELLIA_LRW_DEC_TEST_VECTORS 26590840605eSJussi Kivilinna } 26600840605eSJussi Kivilinna } 26610840605eSJussi Kivilinna } 26620840605eSJussi Kivilinna }, { 26639b8b0405SJohannes Goetzfried .alg = "lrw(cast6)", 26649b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 26659b8b0405SJohannes Goetzfried .suite = { 26669b8b0405SJohannes Goetzfried .cipher = { 26679b8b0405SJohannes Goetzfried .enc = { 26689b8b0405SJohannes Goetzfried .vecs = cast6_lrw_enc_tv_template, 26699b8b0405SJohannes Goetzfried .count = CAST6_LRW_ENC_TEST_VECTORS 26709b8b0405SJohannes Goetzfried }, 26719b8b0405SJohannes Goetzfried .dec = { 26729b8b0405SJohannes Goetzfried .vecs = cast6_lrw_dec_tv_template, 26739b8b0405SJohannes Goetzfried .count = CAST6_LRW_DEC_TEST_VECTORS 26749b8b0405SJohannes Goetzfried } 26759b8b0405SJohannes Goetzfried } 26769b8b0405SJohannes Goetzfried } 26779b8b0405SJohannes Goetzfried }, { 2678d7bfc0faSJussi Kivilinna .alg = "lrw(serpent)", 2679d7bfc0faSJussi Kivilinna .test = alg_test_skcipher, 2680d7bfc0faSJussi Kivilinna .suite = { 2681d7bfc0faSJussi Kivilinna .cipher = { 2682d7bfc0faSJussi Kivilinna .enc = { 2683d7bfc0faSJussi Kivilinna .vecs = serpent_lrw_enc_tv_template, 2684d7bfc0faSJussi Kivilinna .count = SERPENT_LRW_ENC_TEST_VECTORS 2685d7bfc0faSJussi Kivilinna }, 2686d7bfc0faSJussi Kivilinna .dec = { 2687d7bfc0faSJussi Kivilinna .vecs = serpent_lrw_dec_tv_template, 2688d7bfc0faSJussi Kivilinna .count = SERPENT_LRW_DEC_TEST_VECTORS 2689d7bfc0faSJussi Kivilinna } 2690d7bfc0faSJussi Kivilinna } 2691d7bfc0faSJussi Kivilinna } 2692d7bfc0faSJussi Kivilinna }, { 26930b2a1551SJussi Kivilinna .alg = "lrw(twofish)", 26940b2a1551SJussi Kivilinna .test = alg_test_skcipher, 26950b2a1551SJussi Kivilinna .suite = { 26960b2a1551SJussi Kivilinna .cipher = { 26970b2a1551SJussi Kivilinna .enc = { 26980b2a1551SJussi Kivilinna .vecs = tf_lrw_enc_tv_template, 26990b2a1551SJussi Kivilinna .count = TF_LRW_ENC_TEST_VECTORS 27000b2a1551SJussi Kivilinna }, 27010b2a1551SJussi Kivilinna .dec = { 27020b2a1551SJussi Kivilinna .vecs = tf_lrw_dec_tv_template, 27030b2a1551SJussi Kivilinna .count = TF_LRW_DEC_TEST_VECTORS 27040b2a1551SJussi Kivilinna } 27050b2a1551SJussi Kivilinna } 27060b2a1551SJussi Kivilinna } 27070b2a1551SJussi Kivilinna }, { 2708da7f033dSHerbert Xu .alg = "lzo", 2709da7f033dSHerbert Xu .test = alg_test_comp, 27100818904dSMilan Broz .fips_allowed = 1, 2711da7f033dSHerbert Xu .suite = { 2712da7f033dSHerbert Xu .comp = { 2713da7f033dSHerbert Xu .comp = { 2714da7f033dSHerbert Xu .vecs = lzo_comp_tv_template, 2715da7f033dSHerbert Xu .count = LZO_COMP_TEST_VECTORS 2716da7f033dSHerbert Xu }, 2717da7f033dSHerbert Xu .decomp = { 2718da7f033dSHerbert Xu .vecs = lzo_decomp_tv_template, 2719da7f033dSHerbert Xu .count = LZO_DECOMP_TEST_VECTORS 2720da7f033dSHerbert Xu } 2721da7f033dSHerbert Xu } 2722da7f033dSHerbert Xu } 2723da7f033dSHerbert Xu }, { 2724da7f033dSHerbert Xu .alg = "md4", 2725da7f033dSHerbert Xu .test = alg_test_hash, 2726da7f033dSHerbert Xu .suite = { 2727da7f033dSHerbert Xu .hash = { 2728da7f033dSHerbert Xu .vecs = md4_tv_template, 2729da7f033dSHerbert Xu .count = MD4_TEST_VECTORS 2730da7f033dSHerbert Xu } 2731da7f033dSHerbert Xu } 2732da7f033dSHerbert Xu }, { 2733da7f033dSHerbert Xu .alg = "md5", 2734da7f033dSHerbert Xu .test = alg_test_hash, 2735da7f033dSHerbert Xu .suite = { 2736da7f033dSHerbert Xu .hash = { 2737da7f033dSHerbert Xu .vecs = md5_tv_template, 2738da7f033dSHerbert Xu .count = MD5_TEST_VECTORS 2739da7f033dSHerbert Xu } 2740da7f033dSHerbert Xu } 2741da7f033dSHerbert Xu }, { 2742da7f033dSHerbert Xu .alg = "michael_mic", 2743da7f033dSHerbert Xu .test = alg_test_hash, 2744da7f033dSHerbert Xu .suite = { 2745da7f033dSHerbert Xu .hash = { 2746da7f033dSHerbert Xu .vecs = michael_mic_tv_template, 2747da7f033dSHerbert Xu .count = MICHAEL_MIC_TEST_VECTORS 2748da7f033dSHerbert Xu } 2749da7f033dSHerbert Xu } 2750da7f033dSHerbert Xu }, { 2751ba0e14acSPuneet Saxena .alg = "ofb(aes)", 2752ba0e14acSPuneet Saxena .test = alg_test_skcipher, 2753ba0e14acSPuneet Saxena .fips_allowed = 1, 2754ba0e14acSPuneet Saxena .suite = { 2755ba0e14acSPuneet Saxena .cipher = { 2756ba0e14acSPuneet Saxena .enc = { 2757ba0e14acSPuneet Saxena .vecs = aes_ofb_enc_tv_template, 2758ba0e14acSPuneet Saxena .count = AES_OFB_ENC_TEST_VECTORS 2759ba0e14acSPuneet Saxena }, 2760ba0e14acSPuneet Saxena .dec = { 2761ba0e14acSPuneet Saxena .vecs = aes_ofb_dec_tv_template, 2762ba0e14acSPuneet Saxena .count = AES_OFB_DEC_TEST_VECTORS 2763ba0e14acSPuneet Saxena } 2764ba0e14acSPuneet Saxena } 2765ba0e14acSPuneet Saxena } 2766ba0e14acSPuneet Saxena }, { 2767da7f033dSHerbert Xu .alg = "pcbc(fcrypt)", 27681aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2769da7f033dSHerbert Xu .suite = { 2770da7f033dSHerbert Xu .cipher = { 2771da7f033dSHerbert Xu .enc = { 2772da7f033dSHerbert Xu .vecs = fcrypt_pcbc_enc_tv_template, 2773da7f033dSHerbert Xu .count = FCRYPT_ENC_TEST_VECTORS 2774da7f033dSHerbert Xu }, 2775da7f033dSHerbert Xu .dec = { 2776da7f033dSHerbert Xu .vecs = fcrypt_pcbc_dec_tv_template, 2777da7f033dSHerbert Xu .count = FCRYPT_DEC_TEST_VECTORS 2778da7f033dSHerbert Xu } 2779da7f033dSHerbert Xu } 2780da7f033dSHerbert Xu } 2781da7f033dSHerbert Xu }, { 2782da7f033dSHerbert Xu .alg = "rfc3686(ctr(aes))", 27831aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2784a1915d51SJarod Wilson .fips_allowed = 1, 2785da7f033dSHerbert Xu .suite = { 2786da7f033dSHerbert Xu .cipher = { 2787da7f033dSHerbert Xu .enc = { 2788f7cb80f2SJarod Wilson .vecs = aes_ctr_rfc3686_enc_tv_template, 2789f7cb80f2SJarod Wilson .count = AES_CTR_3686_ENC_TEST_VECTORS 2790da7f033dSHerbert Xu }, 2791da7f033dSHerbert Xu .dec = { 2792f7cb80f2SJarod Wilson .vecs = aes_ctr_rfc3686_dec_tv_template, 2793f7cb80f2SJarod Wilson .count = AES_CTR_3686_DEC_TEST_VECTORS 2794da7f033dSHerbert Xu } 2795da7f033dSHerbert Xu } 2796da7f033dSHerbert Xu } 2797da7f033dSHerbert Xu }, { 279869435b94SAdrian Hoban .alg = "rfc4106(gcm(aes))", 279969435b94SAdrian Hoban .test = alg_test_aead, 280069435b94SAdrian Hoban .suite = { 280169435b94SAdrian Hoban .aead = { 280269435b94SAdrian Hoban .enc = { 280369435b94SAdrian Hoban .vecs = aes_gcm_rfc4106_enc_tv_template, 280469435b94SAdrian Hoban .count = AES_GCM_4106_ENC_TEST_VECTORS 280569435b94SAdrian Hoban }, 280669435b94SAdrian Hoban .dec = { 280769435b94SAdrian Hoban .vecs = aes_gcm_rfc4106_dec_tv_template, 280869435b94SAdrian Hoban .count = AES_GCM_4106_DEC_TEST_VECTORS 280969435b94SAdrian Hoban } 281069435b94SAdrian Hoban } 281169435b94SAdrian Hoban } 281269435b94SAdrian Hoban }, { 28135d667322SJarod Wilson .alg = "rfc4309(ccm(aes))", 28145d667322SJarod Wilson .test = alg_test_aead, 2815a1915d51SJarod Wilson .fips_allowed = 1, 28165d667322SJarod Wilson .suite = { 28175d667322SJarod Wilson .aead = { 28185d667322SJarod Wilson .enc = { 28195d667322SJarod Wilson .vecs = aes_ccm_rfc4309_enc_tv_template, 28205d667322SJarod Wilson .count = AES_CCM_4309_ENC_TEST_VECTORS 28215d667322SJarod Wilson }, 28225d667322SJarod Wilson .dec = { 28235d667322SJarod Wilson .vecs = aes_ccm_rfc4309_dec_tv_template, 28245d667322SJarod Wilson .count = AES_CCM_4309_DEC_TEST_VECTORS 28255d667322SJarod Wilson } 28265d667322SJarod Wilson } 28275d667322SJarod Wilson } 28285d667322SJarod Wilson }, { 2829e9b7441aSJussi Kivilinna .alg = "rfc4543(gcm(aes))", 2830e9b7441aSJussi Kivilinna .test = alg_test_aead, 2831e9b7441aSJussi Kivilinna .suite = { 2832e9b7441aSJussi Kivilinna .aead = { 2833e9b7441aSJussi Kivilinna .enc = { 2834e9b7441aSJussi Kivilinna .vecs = aes_gcm_rfc4543_enc_tv_template, 2835e9b7441aSJussi Kivilinna .count = AES_GCM_4543_ENC_TEST_VECTORS 2836e9b7441aSJussi Kivilinna }, 2837e9b7441aSJussi Kivilinna .dec = { 2838e9b7441aSJussi Kivilinna .vecs = aes_gcm_rfc4543_dec_tv_template, 2839e9b7441aSJussi Kivilinna .count = AES_GCM_4543_DEC_TEST_VECTORS 2840e9b7441aSJussi Kivilinna }, 2841e9b7441aSJussi Kivilinna } 2842e9b7441aSJussi Kivilinna } 2843e9b7441aSJussi Kivilinna }, { 2844da7f033dSHerbert Xu .alg = "rmd128", 2845da7f033dSHerbert Xu .test = alg_test_hash, 2846da7f033dSHerbert Xu .suite = { 2847da7f033dSHerbert Xu .hash = { 2848da7f033dSHerbert Xu .vecs = rmd128_tv_template, 2849da7f033dSHerbert Xu .count = RMD128_TEST_VECTORS 2850da7f033dSHerbert Xu } 2851da7f033dSHerbert Xu } 2852da7f033dSHerbert Xu }, { 2853da7f033dSHerbert Xu .alg = "rmd160", 2854da7f033dSHerbert Xu .test = alg_test_hash, 2855da7f033dSHerbert Xu .suite = { 2856da7f033dSHerbert Xu .hash = { 2857da7f033dSHerbert Xu .vecs = rmd160_tv_template, 2858da7f033dSHerbert Xu .count = RMD160_TEST_VECTORS 2859da7f033dSHerbert Xu } 2860da7f033dSHerbert Xu } 2861da7f033dSHerbert Xu }, { 2862da7f033dSHerbert Xu .alg = "rmd256", 2863da7f033dSHerbert Xu .test = alg_test_hash, 2864da7f033dSHerbert Xu .suite = { 2865da7f033dSHerbert Xu .hash = { 2866da7f033dSHerbert Xu .vecs = rmd256_tv_template, 2867da7f033dSHerbert Xu .count = RMD256_TEST_VECTORS 2868da7f033dSHerbert Xu } 2869da7f033dSHerbert Xu } 2870da7f033dSHerbert Xu }, { 2871da7f033dSHerbert Xu .alg = "rmd320", 2872da7f033dSHerbert Xu .test = alg_test_hash, 2873da7f033dSHerbert Xu .suite = { 2874da7f033dSHerbert Xu .hash = { 2875da7f033dSHerbert Xu .vecs = rmd320_tv_template, 2876da7f033dSHerbert Xu .count = RMD320_TEST_VECTORS 2877da7f033dSHerbert Xu } 2878da7f033dSHerbert Xu } 2879da7f033dSHerbert Xu }, { 2880da7f033dSHerbert Xu .alg = "salsa20", 28811aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2882da7f033dSHerbert Xu .suite = { 2883da7f033dSHerbert Xu .cipher = { 2884da7f033dSHerbert Xu .enc = { 2885da7f033dSHerbert Xu .vecs = salsa20_stream_enc_tv_template, 2886da7f033dSHerbert Xu .count = SALSA20_STREAM_ENC_TEST_VECTORS 2887da7f033dSHerbert Xu } 2888da7f033dSHerbert Xu } 2889da7f033dSHerbert Xu } 2890da7f033dSHerbert Xu }, { 2891da7f033dSHerbert Xu .alg = "sha1", 2892da7f033dSHerbert Xu .test = alg_test_hash, 2893a1915d51SJarod Wilson .fips_allowed = 1, 2894da7f033dSHerbert Xu .suite = { 2895da7f033dSHerbert Xu .hash = { 2896da7f033dSHerbert Xu .vecs = sha1_tv_template, 2897da7f033dSHerbert Xu .count = SHA1_TEST_VECTORS 2898da7f033dSHerbert Xu } 2899da7f033dSHerbert Xu } 2900da7f033dSHerbert Xu }, { 2901da7f033dSHerbert Xu .alg = "sha224", 2902da7f033dSHerbert Xu .test = alg_test_hash, 2903a1915d51SJarod Wilson .fips_allowed = 1, 2904da7f033dSHerbert Xu .suite = { 2905da7f033dSHerbert Xu .hash = { 2906da7f033dSHerbert Xu .vecs = sha224_tv_template, 2907da7f033dSHerbert Xu .count = SHA224_TEST_VECTORS 2908da7f033dSHerbert Xu } 2909da7f033dSHerbert Xu } 2910da7f033dSHerbert Xu }, { 2911da7f033dSHerbert Xu .alg = "sha256", 2912da7f033dSHerbert Xu .test = alg_test_hash, 2913a1915d51SJarod Wilson .fips_allowed = 1, 2914da7f033dSHerbert Xu .suite = { 2915da7f033dSHerbert Xu .hash = { 2916da7f033dSHerbert Xu .vecs = sha256_tv_template, 2917da7f033dSHerbert Xu .count = SHA256_TEST_VECTORS 2918da7f033dSHerbert Xu } 2919da7f033dSHerbert Xu } 2920da7f033dSHerbert Xu }, { 2921da7f033dSHerbert Xu .alg = "sha384", 2922da7f033dSHerbert Xu .test = alg_test_hash, 2923a1915d51SJarod Wilson .fips_allowed = 1, 2924da7f033dSHerbert Xu .suite = { 2925da7f033dSHerbert Xu .hash = { 2926da7f033dSHerbert Xu .vecs = sha384_tv_template, 2927da7f033dSHerbert Xu .count = SHA384_TEST_VECTORS 2928da7f033dSHerbert Xu } 2929da7f033dSHerbert Xu } 2930da7f033dSHerbert Xu }, { 2931da7f033dSHerbert Xu .alg = "sha512", 2932da7f033dSHerbert Xu .test = alg_test_hash, 2933a1915d51SJarod Wilson .fips_allowed = 1, 2934da7f033dSHerbert Xu .suite = { 2935da7f033dSHerbert Xu .hash = { 2936da7f033dSHerbert Xu .vecs = sha512_tv_template, 2937da7f033dSHerbert Xu .count = SHA512_TEST_VECTORS 2938da7f033dSHerbert Xu } 2939da7f033dSHerbert Xu } 2940da7f033dSHerbert Xu }, { 2941da7f033dSHerbert Xu .alg = "tgr128", 2942da7f033dSHerbert Xu .test = alg_test_hash, 2943da7f033dSHerbert Xu .suite = { 2944da7f033dSHerbert Xu .hash = { 2945da7f033dSHerbert Xu .vecs = tgr128_tv_template, 2946da7f033dSHerbert Xu .count = TGR128_TEST_VECTORS 2947da7f033dSHerbert Xu } 2948da7f033dSHerbert Xu } 2949da7f033dSHerbert Xu }, { 2950da7f033dSHerbert Xu .alg = "tgr160", 2951da7f033dSHerbert Xu .test = alg_test_hash, 2952da7f033dSHerbert Xu .suite = { 2953da7f033dSHerbert Xu .hash = { 2954da7f033dSHerbert Xu .vecs = tgr160_tv_template, 2955da7f033dSHerbert Xu .count = TGR160_TEST_VECTORS 2956da7f033dSHerbert Xu } 2957da7f033dSHerbert Xu } 2958da7f033dSHerbert Xu }, { 2959da7f033dSHerbert Xu .alg = "tgr192", 2960da7f033dSHerbert Xu .test = alg_test_hash, 2961da7f033dSHerbert Xu .suite = { 2962da7f033dSHerbert Xu .hash = { 2963da7f033dSHerbert Xu .vecs = tgr192_tv_template, 2964da7f033dSHerbert Xu .count = TGR192_TEST_VECTORS 2965da7f033dSHerbert Xu } 2966da7f033dSHerbert Xu } 2967da7f033dSHerbert Xu }, { 2968f1939f7cSShane Wang .alg = "vmac(aes)", 2969f1939f7cSShane Wang .test = alg_test_hash, 2970f1939f7cSShane Wang .suite = { 2971f1939f7cSShane Wang .hash = { 2972f1939f7cSShane Wang .vecs = aes_vmac128_tv_template, 2973f1939f7cSShane Wang .count = VMAC_AES_TEST_VECTORS 2974f1939f7cSShane Wang } 2975f1939f7cSShane Wang } 2976f1939f7cSShane Wang }, { 2977da7f033dSHerbert Xu .alg = "wp256", 2978da7f033dSHerbert Xu .test = alg_test_hash, 2979da7f033dSHerbert Xu .suite = { 2980da7f033dSHerbert Xu .hash = { 2981da7f033dSHerbert Xu .vecs = wp256_tv_template, 2982da7f033dSHerbert Xu .count = WP256_TEST_VECTORS 2983da7f033dSHerbert Xu } 2984da7f033dSHerbert Xu } 2985da7f033dSHerbert Xu }, { 2986da7f033dSHerbert Xu .alg = "wp384", 2987da7f033dSHerbert Xu .test = alg_test_hash, 2988da7f033dSHerbert Xu .suite = { 2989da7f033dSHerbert Xu .hash = { 2990da7f033dSHerbert Xu .vecs = wp384_tv_template, 2991da7f033dSHerbert Xu .count = WP384_TEST_VECTORS 2992da7f033dSHerbert Xu } 2993da7f033dSHerbert Xu } 2994da7f033dSHerbert Xu }, { 2995da7f033dSHerbert Xu .alg = "wp512", 2996da7f033dSHerbert Xu .test = alg_test_hash, 2997da7f033dSHerbert Xu .suite = { 2998da7f033dSHerbert Xu .hash = { 2999da7f033dSHerbert Xu .vecs = wp512_tv_template, 3000da7f033dSHerbert Xu .count = WP512_TEST_VECTORS 3001da7f033dSHerbert Xu } 3002da7f033dSHerbert Xu } 3003da7f033dSHerbert Xu }, { 3004da7f033dSHerbert Xu .alg = "xcbc(aes)", 3005da7f033dSHerbert Xu .test = alg_test_hash, 3006da7f033dSHerbert Xu .suite = { 3007da7f033dSHerbert Xu .hash = { 3008da7f033dSHerbert Xu .vecs = aes_xcbc128_tv_template, 3009da7f033dSHerbert Xu .count = XCBC_AES_TEST_VECTORS 3010da7f033dSHerbert Xu } 3011da7f033dSHerbert Xu } 3012da7f033dSHerbert Xu }, { 3013da7f033dSHerbert Xu .alg = "xts(aes)", 30141aa4ecd9SHerbert Xu .test = alg_test_skcipher, 30152918aa8dSJarod Wilson .fips_allowed = 1, 3016da7f033dSHerbert Xu .suite = { 3017da7f033dSHerbert Xu .cipher = { 3018da7f033dSHerbert Xu .enc = { 3019da7f033dSHerbert Xu .vecs = aes_xts_enc_tv_template, 3020da7f033dSHerbert Xu .count = AES_XTS_ENC_TEST_VECTORS 3021da7f033dSHerbert Xu }, 3022da7f033dSHerbert Xu .dec = { 3023da7f033dSHerbert Xu .vecs = aes_xts_dec_tv_template, 3024da7f033dSHerbert Xu .count = AES_XTS_DEC_TEST_VECTORS 3025da7f033dSHerbert Xu } 3026da7f033dSHerbert Xu } 3027da7f033dSHerbert Xu } 30280c01aed5SGeert Uytterhoeven }, { 30290840605eSJussi Kivilinna .alg = "xts(camellia)", 30300840605eSJussi Kivilinna .test = alg_test_skcipher, 30310840605eSJussi Kivilinna .suite = { 30320840605eSJussi Kivilinna .cipher = { 30330840605eSJussi Kivilinna .enc = { 30340840605eSJussi Kivilinna .vecs = camellia_xts_enc_tv_template, 30350840605eSJussi Kivilinna .count = CAMELLIA_XTS_ENC_TEST_VECTORS 30360840605eSJussi Kivilinna }, 30370840605eSJussi Kivilinna .dec = { 30380840605eSJussi Kivilinna .vecs = camellia_xts_dec_tv_template, 30390840605eSJussi Kivilinna .count = CAMELLIA_XTS_DEC_TEST_VECTORS 30400840605eSJussi Kivilinna } 30410840605eSJussi Kivilinna } 30420840605eSJussi Kivilinna } 30430840605eSJussi Kivilinna }, { 30449b8b0405SJohannes Goetzfried .alg = "xts(cast6)", 30459b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 30469b8b0405SJohannes Goetzfried .suite = { 30479b8b0405SJohannes Goetzfried .cipher = { 30489b8b0405SJohannes Goetzfried .enc = { 30499b8b0405SJohannes Goetzfried .vecs = cast6_xts_enc_tv_template, 30509b8b0405SJohannes Goetzfried .count = CAST6_XTS_ENC_TEST_VECTORS 30519b8b0405SJohannes Goetzfried }, 30529b8b0405SJohannes Goetzfried .dec = { 30539b8b0405SJohannes Goetzfried .vecs = cast6_xts_dec_tv_template, 30549b8b0405SJohannes Goetzfried .count = CAST6_XTS_DEC_TEST_VECTORS 30559b8b0405SJohannes Goetzfried } 30569b8b0405SJohannes Goetzfried } 30579b8b0405SJohannes Goetzfried } 30589b8b0405SJohannes Goetzfried }, { 305918be20b9SJussi Kivilinna .alg = "xts(serpent)", 306018be20b9SJussi Kivilinna .test = alg_test_skcipher, 306118be20b9SJussi Kivilinna .suite = { 306218be20b9SJussi Kivilinna .cipher = { 306318be20b9SJussi Kivilinna .enc = { 306418be20b9SJussi Kivilinna .vecs = serpent_xts_enc_tv_template, 306518be20b9SJussi Kivilinna .count = SERPENT_XTS_ENC_TEST_VECTORS 306618be20b9SJussi Kivilinna }, 306718be20b9SJussi Kivilinna .dec = { 306818be20b9SJussi Kivilinna .vecs = serpent_xts_dec_tv_template, 306918be20b9SJussi Kivilinna .count = SERPENT_XTS_DEC_TEST_VECTORS 307018be20b9SJussi Kivilinna } 307118be20b9SJussi Kivilinna } 307218be20b9SJussi Kivilinna } 307318be20b9SJussi Kivilinna }, { 3074aed265b9SJussi Kivilinna .alg = "xts(twofish)", 3075aed265b9SJussi Kivilinna .test = alg_test_skcipher, 3076aed265b9SJussi Kivilinna .suite = { 3077aed265b9SJussi Kivilinna .cipher = { 3078aed265b9SJussi Kivilinna .enc = { 3079aed265b9SJussi Kivilinna .vecs = tf_xts_enc_tv_template, 3080aed265b9SJussi Kivilinna .count = TF_XTS_ENC_TEST_VECTORS 3081aed265b9SJussi Kivilinna }, 3082aed265b9SJussi Kivilinna .dec = { 3083aed265b9SJussi Kivilinna .vecs = tf_xts_dec_tv_template, 3084aed265b9SJussi Kivilinna .count = TF_XTS_DEC_TEST_VECTORS 3085aed265b9SJussi Kivilinna } 3086aed265b9SJussi Kivilinna } 3087aed265b9SJussi Kivilinna } 3088aed265b9SJussi Kivilinna }, { 30890c01aed5SGeert Uytterhoeven .alg = "zlib", 30900c01aed5SGeert Uytterhoeven .test = alg_test_pcomp, 30910818904dSMilan Broz .fips_allowed = 1, 30920c01aed5SGeert Uytterhoeven .suite = { 30930c01aed5SGeert Uytterhoeven .pcomp = { 30940c01aed5SGeert Uytterhoeven .comp = { 30950c01aed5SGeert Uytterhoeven .vecs = zlib_comp_tv_template, 30960c01aed5SGeert Uytterhoeven .count = ZLIB_COMP_TEST_VECTORS 30970c01aed5SGeert Uytterhoeven }, 30980c01aed5SGeert Uytterhoeven .decomp = { 30990c01aed5SGeert Uytterhoeven .vecs = zlib_decomp_tv_template, 31000c01aed5SGeert Uytterhoeven .count = ZLIB_DECOMP_TEST_VECTORS 31010c01aed5SGeert Uytterhoeven } 31020c01aed5SGeert Uytterhoeven } 31030c01aed5SGeert Uytterhoeven } 3104da7f033dSHerbert Xu } 3105da7f033dSHerbert Xu }; 3106da7f033dSHerbert Xu 31075714758bSJussi Kivilinna static bool alg_test_descs_checked; 31085714758bSJussi Kivilinna 31095714758bSJussi Kivilinna static void alg_test_descs_check_order(void) 31105714758bSJussi Kivilinna { 31115714758bSJussi Kivilinna int i; 31125714758bSJussi Kivilinna 31135714758bSJussi Kivilinna /* only check once */ 31145714758bSJussi Kivilinna if (alg_test_descs_checked) 31155714758bSJussi Kivilinna return; 31165714758bSJussi Kivilinna 31175714758bSJussi Kivilinna alg_test_descs_checked = true; 31185714758bSJussi Kivilinna 31195714758bSJussi Kivilinna for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) { 31205714758bSJussi Kivilinna int diff = strcmp(alg_test_descs[i - 1].alg, 31215714758bSJussi Kivilinna alg_test_descs[i].alg); 31225714758bSJussi Kivilinna 31235714758bSJussi Kivilinna if (WARN_ON(diff > 0)) { 31245714758bSJussi Kivilinna pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n", 31255714758bSJussi Kivilinna alg_test_descs[i - 1].alg, 31265714758bSJussi Kivilinna alg_test_descs[i].alg); 31275714758bSJussi Kivilinna } 31285714758bSJussi Kivilinna 31295714758bSJussi Kivilinna if (WARN_ON(diff == 0)) { 31305714758bSJussi Kivilinna pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n", 31315714758bSJussi Kivilinna alg_test_descs[i].alg); 31325714758bSJussi Kivilinna } 31335714758bSJussi Kivilinna } 31345714758bSJussi Kivilinna } 31355714758bSJussi Kivilinna 31361aa4ecd9SHerbert Xu static int alg_find_test(const char *alg) 3137da7f033dSHerbert Xu { 3138da7f033dSHerbert Xu int start = 0; 3139da7f033dSHerbert Xu int end = ARRAY_SIZE(alg_test_descs); 3140da7f033dSHerbert Xu 3141da7f033dSHerbert Xu while (start < end) { 3142da7f033dSHerbert Xu int i = (start + end) / 2; 3143da7f033dSHerbert Xu int diff = strcmp(alg_test_descs[i].alg, alg); 3144da7f033dSHerbert Xu 3145da7f033dSHerbert Xu if (diff > 0) { 3146da7f033dSHerbert Xu end = i; 3147da7f033dSHerbert Xu continue; 3148da7f033dSHerbert Xu } 3149da7f033dSHerbert Xu 3150da7f033dSHerbert Xu if (diff < 0) { 3151da7f033dSHerbert Xu start = i + 1; 3152da7f033dSHerbert Xu continue; 3153da7f033dSHerbert Xu } 3154da7f033dSHerbert Xu 31551aa4ecd9SHerbert Xu return i; 3156da7f033dSHerbert Xu } 3157da7f033dSHerbert Xu 31581aa4ecd9SHerbert Xu return -1; 31591aa4ecd9SHerbert Xu } 31601aa4ecd9SHerbert Xu 31611aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 31621aa4ecd9SHerbert Xu { 31631aa4ecd9SHerbert Xu int i; 3164a68f6610SHerbert Xu int j; 3165d12d6b6dSNeil Horman int rc; 31661aa4ecd9SHerbert Xu 31675714758bSJussi Kivilinna alg_test_descs_check_order(); 31685714758bSJussi Kivilinna 31691aa4ecd9SHerbert Xu if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) { 31701aa4ecd9SHerbert Xu char nalg[CRYPTO_MAX_ALG_NAME]; 31711aa4ecd9SHerbert Xu 31721aa4ecd9SHerbert Xu if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >= 31731aa4ecd9SHerbert Xu sizeof(nalg)) 31741aa4ecd9SHerbert Xu return -ENAMETOOLONG; 31751aa4ecd9SHerbert Xu 31761aa4ecd9SHerbert Xu i = alg_find_test(nalg); 31771aa4ecd9SHerbert Xu if (i < 0) 31781aa4ecd9SHerbert Xu goto notest; 31791aa4ecd9SHerbert Xu 3180a3bef3a3SJarod Wilson if (fips_enabled && !alg_test_descs[i].fips_allowed) 3181a3bef3a3SJarod Wilson goto non_fips_alg; 3182a3bef3a3SJarod Wilson 3183941fb328SJarod Wilson rc = alg_test_cipher(alg_test_descs + i, driver, type, mask); 3184941fb328SJarod Wilson goto test_done; 31851aa4ecd9SHerbert Xu } 31861aa4ecd9SHerbert Xu 31871aa4ecd9SHerbert Xu i = alg_find_test(alg); 3188a68f6610SHerbert Xu j = alg_find_test(driver); 3189a68f6610SHerbert Xu if (i < 0 && j < 0) 31901aa4ecd9SHerbert Xu goto notest; 31911aa4ecd9SHerbert Xu 3192a68f6610SHerbert Xu if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) || 3193a68f6610SHerbert Xu (j >= 0 && !alg_test_descs[j].fips_allowed))) 3194a3bef3a3SJarod Wilson goto non_fips_alg; 3195a3bef3a3SJarod Wilson 3196a68f6610SHerbert Xu rc = 0; 3197a68f6610SHerbert Xu if (i >= 0) 3198a68f6610SHerbert Xu rc |= alg_test_descs[i].test(alg_test_descs + i, driver, 31991aa4ecd9SHerbert Xu type, mask); 3200a68f6610SHerbert Xu if (j >= 0) 3201a68f6610SHerbert Xu rc |= alg_test_descs[j].test(alg_test_descs + j, driver, 3202a68f6610SHerbert Xu type, mask); 3203a68f6610SHerbert Xu 3204941fb328SJarod Wilson test_done: 3205d12d6b6dSNeil Horman if (fips_enabled && rc) 3206d12d6b6dSNeil Horman panic("%s: %s alg self test failed in fips mode!\n", driver, alg); 3207d12d6b6dSNeil Horman 320829ecd4abSJarod Wilson if (fips_enabled && !rc) 320929ecd4abSJarod Wilson printk(KERN_INFO "alg: self-tests for %s (%s) passed\n", 321029ecd4abSJarod Wilson driver, alg); 321129ecd4abSJarod Wilson 3212d12d6b6dSNeil Horman return rc; 32131aa4ecd9SHerbert Xu 32141aa4ecd9SHerbert Xu notest: 3215da7f033dSHerbert Xu printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver); 3216da7f033dSHerbert Xu return 0; 3217a3bef3a3SJarod Wilson non_fips_alg: 3218a3bef3a3SJarod Wilson return -EINVAL; 3219da7f033dSHerbert Xu } 32200b767f96SAlexander Shishkin 3221326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */ 32220b767f96SAlexander Shishkin 3223da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test); 3224