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 361da7f033dSHerbert Xu static int test_aead(struct crypto_aead *tfm, int enc, 362da7f033dSHerbert Xu struct aead_testvec *template, unsigned int tcount) 363da7f033dSHerbert Xu { 364da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)); 365da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 366f8b0d4d0SHerbert Xu int ret = -ENOMEM; 367da7f033dSHerbert Xu char *q; 368da7f033dSHerbert Xu char *key; 369da7f033dSHerbert Xu struct aead_request *req; 370da7f033dSHerbert Xu struct scatterlist sg[8]; 371da7f033dSHerbert Xu struct scatterlist asg[8]; 372da7f033dSHerbert Xu const char *e; 373da7f033dSHerbert Xu struct tcrypt_result result; 374da7f033dSHerbert Xu unsigned int authsize; 375da7f033dSHerbert Xu void *input; 376da7f033dSHerbert Xu void *assoc; 377da7f033dSHerbert Xu char iv[MAX_IVLEN]; 378f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 379f8b0d4d0SHerbert Xu char *axbuf[XBUFSIZE]; 380f8b0d4d0SHerbert Xu 381f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 382f8b0d4d0SHerbert Xu goto out_noxbuf; 383f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(axbuf)) 384f8b0d4d0SHerbert Xu goto out_noaxbuf; 385da7f033dSHerbert Xu 386da7f033dSHerbert Xu if (enc == ENCRYPT) 387da7f033dSHerbert Xu e = "encryption"; 388da7f033dSHerbert Xu else 389da7f033dSHerbert Xu e = "decryption"; 390da7f033dSHerbert Xu 391da7f033dSHerbert Xu init_completion(&result.completion); 392da7f033dSHerbert Xu 393da7f033dSHerbert Xu req = aead_request_alloc(tfm, GFP_KERNEL); 394da7f033dSHerbert Xu if (!req) { 395da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to allocate request for " 396da7f033dSHerbert Xu "%s\n", algo); 397da7f033dSHerbert Xu goto out; 398da7f033dSHerbert Xu } 399da7f033dSHerbert Xu 400da7f033dSHerbert Xu aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 401da7f033dSHerbert Xu tcrypt_complete, &result); 402da7f033dSHerbert Xu 403da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 404da7f033dSHerbert Xu if (!template[i].np) { 405da7f033dSHerbert Xu j++; 406da7f033dSHerbert Xu 407da7f033dSHerbert Xu /* some tepmplates have no input data but they will 408da7f033dSHerbert Xu * touch input 409da7f033dSHerbert Xu */ 410da7f033dSHerbert Xu input = xbuf[0]; 411da7f033dSHerbert Xu assoc = axbuf[0]; 412da7f033dSHerbert Xu 413fd57f22aSHerbert Xu ret = -EINVAL; 414fd57f22aSHerbert Xu if (WARN_ON(template[i].ilen > PAGE_SIZE || 415fd57f22aSHerbert Xu template[i].alen > PAGE_SIZE)) 416fd57f22aSHerbert Xu goto out; 417fd57f22aSHerbert Xu 418da7f033dSHerbert Xu memcpy(input, template[i].input, template[i].ilen); 419da7f033dSHerbert Xu memcpy(assoc, template[i].assoc, template[i].alen); 420da7f033dSHerbert Xu if (template[i].iv) 421da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 422da7f033dSHerbert Xu else 423da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 424da7f033dSHerbert Xu 425da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 426da7f033dSHerbert Xu if (template[i].wk) 427da7f033dSHerbert Xu crypto_aead_set_flags( 428da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 429da7f033dSHerbert Xu 430da7f033dSHerbert Xu key = template[i].key; 431da7f033dSHerbert Xu 432da7f033dSHerbert Xu ret = crypto_aead_setkey(tfm, key, 433da7f033dSHerbert Xu template[i].klen); 434da7f033dSHerbert Xu if (!ret == template[i].fail) { 435da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: setkey failed on " 436da7f033dSHerbert Xu "test %d for %s: flags=%x\n", j, algo, 437da7f033dSHerbert Xu crypto_aead_get_flags(tfm)); 438da7f033dSHerbert Xu goto out; 439da7f033dSHerbert Xu } else if (ret) 440da7f033dSHerbert Xu continue; 441da7f033dSHerbert Xu 442da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 443da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 444da7f033dSHerbert Xu if (ret) { 445da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to set " 446da7f033dSHerbert Xu "authsize to %u on test %d for %s\n", 447da7f033dSHerbert Xu authsize, j, algo); 448da7f033dSHerbert Xu goto out; 449da7f033dSHerbert Xu } 450da7f033dSHerbert Xu 451da7f033dSHerbert Xu sg_init_one(&sg[0], input, 452da7f033dSHerbert Xu template[i].ilen + (enc ? authsize : 0)); 453da7f033dSHerbert Xu 454da7f033dSHerbert Xu sg_init_one(&asg[0], assoc, template[i].alen); 455da7f033dSHerbert Xu 456da7f033dSHerbert Xu aead_request_set_crypt(req, sg, sg, 457da7f033dSHerbert Xu template[i].ilen, iv); 458da7f033dSHerbert Xu 459da7f033dSHerbert Xu aead_request_set_assoc(req, asg, template[i].alen); 460da7f033dSHerbert Xu 461da7f033dSHerbert Xu ret = enc ? 462da7f033dSHerbert Xu crypto_aead_encrypt(req) : 463da7f033dSHerbert Xu crypto_aead_decrypt(req); 464da7f033dSHerbert Xu 465da7f033dSHerbert Xu switch (ret) { 466da7f033dSHerbert Xu case 0: 467e44a1b44SJarod Wilson if (template[i].novrfy) { 468e44a1b44SJarod Wilson /* verification was supposed to fail */ 469e44a1b44SJarod Wilson printk(KERN_ERR "alg: aead: %s failed " 470e44a1b44SJarod Wilson "on test %d for %s: ret was 0, " 471e44a1b44SJarod Wilson "expected -EBADMSG\n", 472e44a1b44SJarod Wilson e, j, algo); 473e44a1b44SJarod Wilson /* so really, we got a bad message */ 474e44a1b44SJarod Wilson ret = -EBADMSG; 475e44a1b44SJarod Wilson goto out; 476e44a1b44SJarod Wilson } 477da7f033dSHerbert Xu break; 478da7f033dSHerbert Xu case -EINPROGRESS: 479da7f033dSHerbert Xu case -EBUSY: 480da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 481da7f033dSHerbert Xu &result.completion); 482da7f033dSHerbert Xu if (!ret && !(ret = result.err)) { 483da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 484da7f033dSHerbert Xu break; 485da7f033dSHerbert Xu } 486e44a1b44SJarod Wilson case -EBADMSG: 487e44a1b44SJarod Wilson if (template[i].novrfy) 488e44a1b44SJarod Wilson /* verification failure was expected */ 489e44a1b44SJarod Wilson continue; 490da7f033dSHerbert Xu /* fall through */ 491da7f033dSHerbert Xu default: 492da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: %s failed on test " 493da7f033dSHerbert Xu "%d for %s: ret=%d\n", e, j, algo, -ret); 494da7f033dSHerbert Xu goto out; 495da7f033dSHerbert Xu } 496da7f033dSHerbert Xu 497da7f033dSHerbert Xu q = input; 498da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 499da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Test %d failed on " 500da7f033dSHerbert Xu "%s for %s\n", j, e, algo); 501da7f033dSHerbert Xu hexdump(q, template[i].rlen); 502da7f033dSHerbert Xu ret = -EINVAL; 503da7f033dSHerbert Xu goto out; 504da7f033dSHerbert Xu } 505da7f033dSHerbert Xu } 506da7f033dSHerbert Xu } 507da7f033dSHerbert Xu 508da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 509da7f033dSHerbert Xu if (template[i].np) { 510da7f033dSHerbert Xu j++; 511da7f033dSHerbert Xu 512da7f033dSHerbert Xu if (template[i].iv) 513da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 514da7f033dSHerbert Xu else 515da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 516da7f033dSHerbert Xu 517da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 518da7f033dSHerbert Xu if (template[i].wk) 519da7f033dSHerbert Xu crypto_aead_set_flags( 520da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 521da7f033dSHerbert Xu key = template[i].key; 522da7f033dSHerbert Xu 523da7f033dSHerbert Xu ret = crypto_aead_setkey(tfm, key, template[i].klen); 524da7f033dSHerbert Xu if (!ret == template[i].fail) { 525da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: setkey failed on " 526da7f033dSHerbert Xu "chunk test %d for %s: flags=%x\n", j, 527da7f033dSHerbert Xu algo, crypto_aead_get_flags(tfm)); 528da7f033dSHerbert Xu goto out; 529da7f033dSHerbert Xu } else if (ret) 530da7f033dSHerbert Xu continue; 531da7f033dSHerbert Xu 532da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 533da7f033dSHerbert Xu 534da7f033dSHerbert Xu ret = -EINVAL; 535da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 536da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 537da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 538da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 539da7f033dSHerbert Xu goto out; 540da7f033dSHerbert Xu 541da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 542da7f033dSHerbert Xu offset_in_page(IDX[k]); 543da7f033dSHerbert Xu 544da7f033dSHerbert Xu memcpy(q, template[i].input + temp, 545da7f033dSHerbert Xu template[i].tap[k]); 546da7f033dSHerbert Xu 547da7f033dSHerbert Xu n = template[i].tap[k]; 548da7f033dSHerbert Xu if (k == template[i].np - 1 && enc) 549da7f033dSHerbert Xu n += authsize; 550da7f033dSHerbert Xu if (offset_in_page(q) + n < PAGE_SIZE) 551da7f033dSHerbert Xu q[n] = 0; 552da7f033dSHerbert Xu 553da7f033dSHerbert Xu sg_set_buf(&sg[k], q, template[i].tap[k]); 554da7f033dSHerbert Xu temp += template[i].tap[k]; 555da7f033dSHerbert Xu } 556da7f033dSHerbert Xu 557da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 558da7f033dSHerbert Xu if (ret) { 559da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to set " 560da7f033dSHerbert Xu "authsize to %u on chunk test %d for " 561da7f033dSHerbert Xu "%s\n", authsize, j, algo); 562da7f033dSHerbert Xu goto out; 563da7f033dSHerbert Xu } 564da7f033dSHerbert Xu 565da7f033dSHerbert Xu if (enc) { 566da7f033dSHerbert Xu if (WARN_ON(sg[k - 1].offset + 567da7f033dSHerbert Xu sg[k - 1].length + authsize > 568da7f033dSHerbert Xu PAGE_SIZE)) { 569da7f033dSHerbert Xu ret = -EINVAL; 570da7f033dSHerbert Xu goto out; 571da7f033dSHerbert Xu } 572da7f033dSHerbert Xu 573da7f033dSHerbert Xu sg[k - 1].length += authsize; 574da7f033dSHerbert Xu } 575da7f033dSHerbert Xu 576da7f033dSHerbert Xu sg_init_table(asg, template[i].anp); 577fd57f22aSHerbert Xu ret = -EINVAL; 578da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].anp; k++) { 579fd57f22aSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 580fd57f22aSHerbert Xu template[i].atap[k] > PAGE_SIZE)) 581fd57f22aSHerbert Xu goto out; 582da7f033dSHerbert Xu sg_set_buf(&asg[k], 583da7f033dSHerbert Xu memcpy(axbuf[IDX[k] >> PAGE_SHIFT] + 584da7f033dSHerbert Xu offset_in_page(IDX[k]), 585da7f033dSHerbert Xu template[i].assoc + temp, 586da7f033dSHerbert Xu template[i].atap[k]), 587da7f033dSHerbert Xu template[i].atap[k]); 588da7f033dSHerbert Xu temp += template[i].atap[k]; 589da7f033dSHerbert Xu } 590da7f033dSHerbert Xu 591da7f033dSHerbert Xu aead_request_set_crypt(req, sg, sg, 592da7f033dSHerbert Xu template[i].ilen, 593da7f033dSHerbert Xu iv); 594da7f033dSHerbert Xu 595da7f033dSHerbert Xu aead_request_set_assoc(req, asg, template[i].alen); 596da7f033dSHerbert Xu 597da7f033dSHerbert Xu ret = enc ? 598da7f033dSHerbert Xu crypto_aead_encrypt(req) : 599da7f033dSHerbert Xu crypto_aead_decrypt(req); 600da7f033dSHerbert Xu 601da7f033dSHerbert Xu switch (ret) { 602da7f033dSHerbert Xu case 0: 603e44a1b44SJarod Wilson if (template[i].novrfy) { 604e44a1b44SJarod Wilson /* verification was supposed to fail */ 605e44a1b44SJarod Wilson printk(KERN_ERR "alg: aead: %s failed " 606e44a1b44SJarod Wilson "on chunk test %d for %s: ret " 607e44a1b44SJarod Wilson "was 0, expected -EBADMSG\n", 608e44a1b44SJarod Wilson e, j, algo); 609e44a1b44SJarod Wilson /* so really, we got a bad message */ 610e44a1b44SJarod Wilson ret = -EBADMSG; 611e44a1b44SJarod Wilson goto out; 612e44a1b44SJarod Wilson } 613da7f033dSHerbert Xu break; 614da7f033dSHerbert Xu case -EINPROGRESS: 615da7f033dSHerbert Xu case -EBUSY: 616da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 617da7f033dSHerbert Xu &result.completion); 618da7f033dSHerbert Xu if (!ret && !(ret = result.err)) { 619da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 620da7f033dSHerbert Xu break; 621da7f033dSHerbert Xu } 622e44a1b44SJarod Wilson case -EBADMSG: 623e44a1b44SJarod Wilson if (template[i].novrfy) 624e44a1b44SJarod Wilson /* verification failure was expected */ 625e44a1b44SJarod Wilson continue; 626da7f033dSHerbert Xu /* fall through */ 627da7f033dSHerbert Xu default: 628da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: %s failed on " 629da7f033dSHerbert Xu "chunk test %d for %s: ret=%d\n", e, j, 630da7f033dSHerbert Xu algo, -ret); 631da7f033dSHerbert Xu goto out; 632da7f033dSHerbert Xu } 633da7f033dSHerbert Xu 634da7f033dSHerbert Xu ret = -EINVAL; 635da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 636da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 637da7f033dSHerbert Xu offset_in_page(IDX[k]); 638da7f033dSHerbert Xu 639da7f033dSHerbert Xu n = template[i].tap[k]; 640da7f033dSHerbert Xu if (k == template[i].np - 1) 641da7f033dSHerbert Xu n += enc ? authsize : -authsize; 642da7f033dSHerbert Xu 643da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, n)) { 644da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Chunk " 645da7f033dSHerbert Xu "test %d failed on %s at page " 646da7f033dSHerbert Xu "%u for %s\n", j, e, k, algo); 647da7f033dSHerbert Xu hexdump(q, n); 648da7f033dSHerbert Xu goto out; 649da7f033dSHerbert Xu } 650da7f033dSHerbert Xu 651da7f033dSHerbert Xu q += n; 652da7f033dSHerbert Xu if (k == template[i].np - 1 && !enc) { 653da7f033dSHerbert Xu if (memcmp(q, template[i].input + 654da7f033dSHerbert Xu temp + n, authsize)) 655da7f033dSHerbert Xu n = authsize; 656da7f033dSHerbert Xu else 657da7f033dSHerbert Xu n = 0; 658da7f033dSHerbert Xu } else { 659da7f033dSHerbert Xu for (n = 0; offset_in_page(q + n) && 660da7f033dSHerbert Xu q[n]; n++) 661da7f033dSHerbert Xu ; 662da7f033dSHerbert Xu } 663da7f033dSHerbert Xu if (n) { 664da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Result " 665da7f033dSHerbert Xu "buffer corruption in chunk " 666da7f033dSHerbert Xu "test %d on %s at page %u for " 667da7f033dSHerbert Xu "%s: %u bytes:\n", j, e, k, 668da7f033dSHerbert Xu algo, n); 669da7f033dSHerbert Xu hexdump(q, n); 670da7f033dSHerbert Xu goto out; 671da7f033dSHerbert Xu } 672da7f033dSHerbert Xu 673da7f033dSHerbert Xu temp += template[i].tap[k]; 674da7f033dSHerbert Xu } 675da7f033dSHerbert Xu } 676da7f033dSHerbert Xu } 677da7f033dSHerbert Xu 678da7f033dSHerbert Xu ret = 0; 679da7f033dSHerbert Xu 680da7f033dSHerbert Xu out: 681da7f033dSHerbert Xu aead_request_free(req); 682f8b0d4d0SHerbert Xu testmgr_free_buf(axbuf); 683f8b0d4d0SHerbert Xu out_noaxbuf: 684f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 685f8b0d4d0SHerbert Xu out_noxbuf: 686da7f033dSHerbert Xu return ret; 687da7f033dSHerbert Xu } 688da7f033dSHerbert Xu 6891aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc, 6901aa4ecd9SHerbert Xu struct cipher_testvec *template, unsigned int tcount) 6911aa4ecd9SHerbert Xu { 6921aa4ecd9SHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm)); 6931aa4ecd9SHerbert Xu unsigned int i, j, k; 6941aa4ecd9SHerbert Xu char *q; 6951aa4ecd9SHerbert Xu const char *e; 6961aa4ecd9SHerbert Xu void *data; 697f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 698f8b0d4d0SHerbert Xu int ret = -ENOMEM; 699f8b0d4d0SHerbert Xu 700f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 701f8b0d4d0SHerbert Xu goto out_nobuf; 7021aa4ecd9SHerbert Xu 7031aa4ecd9SHerbert Xu if (enc == ENCRYPT) 7041aa4ecd9SHerbert Xu e = "encryption"; 7051aa4ecd9SHerbert Xu else 7061aa4ecd9SHerbert Xu e = "decryption"; 7071aa4ecd9SHerbert Xu 7081aa4ecd9SHerbert Xu j = 0; 7091aa4ecd9SHerbert Xu for (i = 0; i < tcount; i++) { 7101aa4ecd9SHerbert Xu if (template[i].np) 7111aa4ecd9SHerbert Xu continue; 7121aa4ecd9SHerbert Xu 7131aa4ecd9SHerbert Xu j++; 7141aa4ecd9SHerbert Xu 715fd57f22aSHerbert Xu ret = -EINVAL; 716fd57f22aSHerbert Xu if (WARN_ON(template[i].ilen > PAGE_SIZE)) 717fd57f22aSHerbert Xu goto out; 718fd57f22aSHerbert Xu 7191aa4ecd9SHerbert Xu data = xbuf[0]; 7201aa4ecd9SHerbert Xu memcpy(data, template[i].input, template[i].ilen); 7211aa4ecd9SHerbert Xu 7221aa4ecd9SHerbert Xu crypto_cipher_clear_flags(tfm, ~0); 7231aa4ecd9SHerbert Xu if (template[i].wk) 7241aa4ecd9SHerbert Xu crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 7251aa4ecd9SHerbert Xu 7261aa4ecd9SHerbert Xu ret = crypto_cipher_setkey(tfm, template[i].key, 7271aa4ecd9SHerbert Xu template[i].klen); 7281aa4ecd9SHerbert Xu if (!ret == template[i].fail) { 7291aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: setkey failed " 7301aa4ecd9SHerbert Xu "on test %d for %s: flags=%x\n", j, 7311aa4ecd9SHerbert Xu algo, crypto_cipher_get_flags(tfm)); 7321aa4ecd9SHerbert Xu goto out; 7331aa4ecd9SHerbert Xu } else if (ret) 7341aa4ecd9SHerbert Xu continue; 7351aa4ecd9SHerbert Xu 7361aa4ecd9SHerbert Xu for (k = 0; k < template[i].ilen; 7371aa4ecd9SHerbert Xu k += crypto_cipher_blocksize(tfm)) { 7381aa4ecd9SHerbert Xu if (enc) 7391aa4ecd9SHerbert Xu crypto_cipher_encrypt_one(tfm, data + k, 7401aa4ecd9SHerbert Xu data + k); 7411aa4ecd9SHerbert Xu else 7421aa4ecd9SHerbert Xu crypto_cipher_decrypt_one(tfm, data + k, 7431aa4ecd9SHerbert Xu data + k); 7441aa4ecd9SHerbert Xu } 7451aa4ecd9SHerbert Xu 7461aa4ecd9SHerbert Xu q = data; 7471aa4ecd9SHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 7481aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: Test %d failed " 7491aa4ecd9SHerbert Xu "on %s for %s\n", j, e, algo); 7501aa4ecd9SHerbert Xu hexdump(q, template[i].rlen); 7511aa4ecd9SHerbert Xu ret = -EINVAL; 7521aa4ecd9SHerbert Xu goto out; 7531aa4ecd9SHerbert Xu } 7541aa4ecd9SHerbert Xu } 7551aa4ecd9SHerbert Xu 7561aa4ecd9SHerbert Xu ret = 0; 7571aa4ecd9SHerbert Xu 7581aa4ecd9SHerbert Xu out: 759f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 760f8b0d4d0SHerbert Xu out_nobuf: 7611aa4ecd9SHerbert Xu return ret; 7621aa4ecd9SHerbert Xu } 7631aa4ecd9SHerbert Xu 7641aa4ecd9SHerbert Xu static int test_skcipher(struct crypto_ablkcipher *tfm, int enc, 765da7f033dSHerbert Xu struct cipher_testvec *template, unsigned int tcount) 766da7f033dSHerbert Xu { 767da7f033dSHerbert Xu const char *algo = 768da7f033dSHerbert Xu crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm)); 769da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 770da7f033dSHerbert Xu char *q; 771da7f033dSHerbert Xu struct ablkcipher_request *req; 772da7f033dSHerbert Xu struct scatterlist sg[8]; 773da7f033dSHerbert Xu const char *e; 774da7f033dSHerbert Xu struct tcrypt_result result; 775da7f033dSHerbert Xu void *data; 776da7f033dSHerbert Xu char iv[MAX_IVLEN]; 777f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 778f8b0d4d0SHerbert Xu int ret = -ENOMEM; 779f8b0d4d0SHerbert Xu 780f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 781f8b0d4d0SHerbert Xu goto out_nobuf; 782da7f033dSHerbert Xu 783da7f033dSHerbert Xu if (enc == ENCRYPT) 784da7f033dSHerbert Xu e = "encryption"; 785da7f033dSHerbert Xu else 786da7f033dSHerbert Xu e = "decryption"; 787da7f033dSHerbert Xu 788da7f033dSHerbert Xu init_completion(&result.completion); 789da7f033dSHerbert Xu 790da7f033dSHerbert Xu req = ablkcipher_request_alloc(tfm, GFP_KERNEL); 791da7f033dSHerbert Xu if (!req) { 7921aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Failed to allocate request " 7931aa4ecd9SHerbert Xu "for %s\n", algo); 794da7f033dSHerbert Xu goto out; 795da7f033dSHerbert Xu } 796da7f033dSHerbert Xu 797da7f033dSHerbert Xu ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 798da7f033dSHerbert Xu tcrypt_complete, &result); 799da7f033dSHerbert Xu 800da7f033dSHerbert Xu j = 0; 801da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 802da7f033dSHerbert Xu if (template[i].iv) 803da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 804da7f033dSHerbert Xu else 805da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 806da7f033dSHerbert Xu 807da7f033dSHerbert Xu if (!(template[i].np)) { 808da7f033dSHerbert Xu j++; 809da7f033dSHerbert Xu 810fd57f22aSHerbert Xu ret = -EINVAL; 811fd57f22aSHerbert Xu if (WARN_ON(template[i].ilen > PAGE_SIZE)) 812fd57f22aSHerbert Xu goto out; 813fd57f22aSHerbert Xu 814da7f033dSHerbert Xu data = xbuf[0]; 815da7f033dSHerbert Xu memcpy(data, template[i].input, template[i].ilen); 816da7f033dSHerbert Xu 817da7f033dSHerbert Xu crypto_ablkcipher_clear_flags(tfm, ~0); 818da7f033dSHerbert Xu if (template[i].wk) 819da7f033dSHerbert Xu crypto_ablkcipher_set_flags( 820da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 821da7f033dSHerbert Xu 822da7f033dSHerbert Xu ret = crypto_ablkcipher_setkey(tfm, template[i].key, 823da7f033dSHerbert Xu template[i].klen); 824da7f033dSHerbert Xu if (!ret == template[i].fail) { 8251aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: setkey failed " 826da7f033dSHerbert Xu "on test %d for %s: flags=%x\n", j, 827da7f033dSHerbert Xu algo, crypto_ablkcipher_get_flags(tfm)); 828da7f033dSHerbert Xu goto out; 829da7f033dSHerbert Xu } else if (ret) 830da7f033dSHerbert Xu continue; 831da7f033dSHerbert Xu 832da7f033dSHerbert Xu sg_init_one(&sg[0], data, template[i].ilen); 833da7f033dSHerbert Xu 834da7f033dSHerbert Xu ablkcipher_request_set_crypt(req, sg, sg, 835da7f033dSHerbert Xu template[i].ilen, iv); 836da7f033dSHerbert Xu ret = enc ? 837da7f033dSHerbert Xu crypto_ablkcipher_encrypt(req) : 838da7f033dSHerbert Xu crypto_ablkcipher_decrypt(req); 839da7f033dSHerbert Xu 840da7f033dSHerbert Xu switch (ret) { 841da7f033dSHerbert Xu case 0: 842da7f033dSHerbert Xu break; 843da7f033dSHerbert Xu case -EINPROGRESS: 844da7f033dSHerbert Xu case -EBUSY: 845da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 846da7f033dSHerbert Xu &result.completion); 847da7f033dSHerbert Xu if (!ret && !((ret = result.err))) { 848da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 849da7f033dSHerbert Xu break; 850da7f033dSHerbert Xu } 851da7f033dSHerbert Xu /* fall through */ 852da7f033dSHerbert Xu default: 8531aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: %s failed on " 854da7f033dSHerbert Xu "test %d for %s: ret=%d\n", e, j, algo, 855da7f033dSHerbert Xu -ret); 856da7f033dSHerbert Xu goto out; 857da7f033dSHerbert Xu } 858da7f033dSHerbert Xu 859da7f033dSHerbert Xu q = data; 860da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 8611aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Test %d " 8621aa4ecd9SHerbert Xu "failed on %s for %s\n", j, e, algo); 863da7f033dSHerbert Xu hexdump(q, template[i].rlen); 864da7f033dSHerbert Xu ret = -EINVAL; 865da7f033dSHerbert Xu goto out; 866da7f033dSHerbert Xu } 867da7f033dSHerbert Xu } 868da7f033dSHerbert Xu } 869da7f033dSHerbert Xu 870da7f033dSHerbert Xu j = 0; 871da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 872da7f033dSHerbert Xu 873da7f033dSHerbert Xu if (template[i].iv) 874da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 875da7f033dSHerbert Xu else 876da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 877da7f033dSHerbert Xu 878da7f033dSHerbert Xu if (template[i].np) { 879da7f033dSHerbert Xu j++; 880da7f033dSHerbert Xu 881da7f033dSHerbert Xu crypto_ablkcipher_clear_flags(tfm, ~0); 882da7f033dSHerbert Xu if (template[i].wk) 883da7f033dSHerbert Xu crypto_ablkcipher_set_flags( 884da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 885da7f033dSHerbert Xu 886da7f033dSHerbert Xu ret = crypto_ablkcipher_setkey(tfm, template[i].key, 887da7f033dSHerbert Xu template[i].klen); 888da7f033dSHerbert Xu if (!ret == template[i].fail) { 8891aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: setkey failed " 890da7f033dSHerbert Xu "on chunk test %d for %s: flags=%x\n", 891da7f033dSHerbert Xu j, algo, 892da7f033dSHerbert Xu crypto_ablkcipher_get_flags(tfm)); 893da7f033dSHerbert Xu goto out; 894da7f033dSHerbert Xu } else if (ret) 895da7f033dSHerbert Xu continue; 896da7f033dSHerbert Xu 897da7f033dSHerbert Xu temp = 0; 898da7f033dSHerbert Xu ret = -EINVAL; 899da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 900da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 901da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 902da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 903da7f033dSHerbert Xu goto out; 904da7f033dSHerbert Xu 905da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 906da7f033dSHerbert Xu offset_in_page(IDX[k]); 907da7f033dSHerbert Xu 908da7f033dSHerbert Xu memcpy(q, template[i].input + temp, 909da7f033dSHerbert Xu template[i].tap[k]); 910da7f033dSHerbert Xu 911da7f033dSHerbert Xu if (offset_in_page(q) + template[i].tap[k] < 912da7f033dSHerbert Xu PAGE_SIZE) 913da7f033dSHerbert Xu q[template[i].tap[k]] = 0; 914da7f033dSHerbert Xu 915da7f033dSHerbert Xu sg_set_buf(&sg[k], q, template[i].tap[k]); 916da7f033dSHerbert Xu 917da7f033dSHerbert Xu temp += template[i].tap[k]; 918da7f033dSHerbert Xu } 919da7f033dSHerbert Xu 920da7f033dSHerbert Xu ablkcipher_request_set_crypt(req, sg, sg, 921da7f033dSHerbert Xu template[i].ilen, iv); 922da7f033dSHerbert Xu 923da7f033dSHerbert Xu ret = enc ? 924da7f033dSHerbert Xu crypto_ablkcipher_encrypt(req) : 925da7f033dSHerbert Xu crypto_ablkcipher_decrypt(req); 926da7f033dSHerbert Xu 927da7f033dSHerbert Xu switch (ret) { 928da7f033dSHerbert Xu case 0: 929da7f033dSHerbert Xu break; 930da7f033dSHerbert Xu case -EINPROGRESS: 931da7f033dSHerbert Xu case -EBUSY: 932da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 933da7f033dSHerbert Xu &result.completion); 934da7f033dSHerbert Xu if (!ret && !((ret = result.err))) { 935da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 936da7f033dSHerbert Xu break; 937da7f033dSHerbert Xu } 938da7f033dSHerbert Xu /* fall through */ 939da7f033dSHerbert Xu default: 9401aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: %s failed on " 941da7f033dSHerbert Xu "chunk test %d for %s: ret=%d\n", e, j, 942da7f033dSHerbert Xu algo, -ret); 943da7f033dSHerbert Xu goto out; 944da7f033dSHerbert Xu } 945da7f033dSHerbert Xu 946da7f033dSHerbert Xu temp = 0; 947da7f033dSHerbert Xu ret = -EINVAL; 948da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 949da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 950da7f033dSHerbert Xu offset_in_page(IDX[k]); 951da7f033dSHerbert Xu 952da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, 953da7f033dSHerbert Xu template[i].tap[k])) { 9541aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Chunk " 955da7f033dSHerbert Xu "test %d failed on %s at page " 956da7f033dSHerbert Xu "%u for %s\n", j, e, k, algo); 957da7f033dSHerbert Xu hexdump(q, template[i].tap[k]); 958da7f033dSHerbert Xu goto out; 959da7f033dSHerbert Xu } 960da7f033dSHerbert Xu 961da7f033dSHerbert Xu q += template[i].tap[k]; 962da7f033dSHerbert Xu for (n = 0; offset_in_page(q + n) && q[n]; n++) 963da7f033dSHerbert Xu ; 964da7f033dSHerbert Xu if (n) { 9651aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: " 966da7f033dSHerbert Xu "Result buffer corruption in " 967da7f033dSHerbert Xu "chunk test %d on %s at page " 968da7f033dSHerbert Xu "%u for %s: %u bytes:\n", j, e, 969da7f033dSHerbert Xu k, algo, n); 970da7f033dSHerbert Xu hexdump(q, n); 971da7f033dSHerbert Xu goto out; 972da7f033dSHerbert Xu } 973da7f033dSHerbert Xu temp += template[i].tap[k]; 974da7f033dSHerbert Xu } 975da7f033dSHerbert Xu } 976da7f033dSHerbert Xu } 977da7f033dSHerbert Xu 978da7f033dSHerbert Xu ret = 0; 979da7f033dSHerbert Xu 980da7f033dSHerbert Xu out: 981da7f033dSHerbert Xu ablkcipher_request_free(req); 982f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 983f8b0d4d0SHerbert Xu out_nobuf: 984da7f033dSHerbert Xu return ret; 985da7f033dSHerbert Xu } 986da7f033dSHerbert Xu 987da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate, 988da7f033dSHerbert Xu struct comp_testvec *dtemplate, int ctcount, int dtcount) 989da7f033dSHerbert Xu { 990da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm)); 991da7f033dSHerbert Xu unsigned int i; 992da7f033dSHerbert Xu char result[COMP_BUF_SIZE]; 993da7f033dSHerbert Xu int ret; 994da7f033dSHerbert Xu 995da7f033dSHerbert Xu for (i = 0; i < ctcount; i++) { 996c79cf910SGeert Uytterhoeven int ilen; 997c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 998da7f033dSHerbert Xu 999da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 1000da7f033dSHerbert Xu 1001da7f033dSHerbert Xu ilen = ctemplate[i].inlen; 1002da7f033dSHerbert Xu ret = crypto_comp_compress(tfm, ctemplate[i].input, 1003da7f033dSHerbert Xu ilen, result, &dlen); 1004da7f033dSHerbert Xu if (ret) { 1005da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: compression failed " 1006da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1007da7f033dSHerbert Xu -ret); 1008da7f033dSHerbert Xu goto out; 1009da7f033dSHerbert Xu } 1010da7f033dSHerbert Xu 1011b812eb00SGeert Uytterhoeven if (dlen != ctemplate[i].outlen) { 1012b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Compression test %d " 1013b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1014b812eb00SGeert Uytterhoeven dlen); 1015b812eb00SGeert Uytterhoeven ret = -EINVAL; 1016b812eb00SGeert Uytterhoeven goto out; 1017b812eb00SGeert Uytterhoeven } 1018b812eb00SGeert Uytterhoeven 1019da7f033dSHerbert Xu if (memcmp(result, ctemplate[i].output, dlen)) { 1020da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Compression test %d " 1021da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 1022da7f033dSHerbert Xu hexdump(result, dlen); 1023da7f033dSHerbert Xu ret = -EINVAL; 1024da7f033dSHerbert Xu goto out; 1025da7f033dSHerbert Xu } 1026da7f033dSHerbert Xu } 1027da7f033dSHerbert Xu 1028da7f033dSHerbert Xu for (i = 0; i < dtcount; i++) { 1029c79cf910SGeert Uytterhoeven int ilen; 1030c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 1031da7f033dSHerbert Xu 1032da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 1033da7f033dSHerbert Xu 1034da7f033dSHerbert Xu ilen = dtemplate[i].inlen; 1035da7f033dSHerbert Xu ret = crypto_comp_decompress(tfm, dtemplate[i].input, 1036da7f033dSHerbert Xu ilen, result, &dlen); 1037da7f033dSHerbert Xu if (ret) { 1038da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: decompression failed " 1039da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1040da7f033dSHerbert Xu -ret); 1041da7f033dSHerbert Xu goto out; 1042da7f033dSHerbert Xu } 1043da7f033dSHerbert Xu 1044b812eb00SGeert Uytterhoeven if (dlen != dtemplate[i].outlen) { 1045b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Decompression test %d " 1046b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1047b812eb00SGeert Uytterhoeven dlen); 1048b812eb00SGeert Uytterhoeven ret = -EINVAL; 1049b812eb00SGeert Uytterhoeven goto out; 1050b812eb00SGeert Uytterhoeven } 1051b812eb00SGeert Uytterhoeven 1052da7f033dSHerbert Xu if (memcmp(result, dtemplate[i].output, dlen)) { 1053da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Decompression test %d " 1054da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 1055da7f033dSHerbert Xu hexdump(result, dlen); 1056da7f033dSHerbert Xu ret = -EINVAL; 1057da7f033dSHerbert Xu goto out; 1058da7f033dSHerbert Xu } 1059da7f033dSHerbert Xu } 1060da7f033dSHerbert Xu 1061da7f033dSHerbert Xu ret = 0; 1062da7f033dSHerbert Xu 1063da7f033dSHerbert Xu out: 1064da7f033dSHerbert Xu return ret; 1065da7f033dSHerbert Xu } 1066da7f033dSHerbert Xu 10678064efb8SGeert Uytterhoeven static int test_pcomp(struct crypto_pcomp *tfm, 10688064efb8SGeert Uytterhoeven struct pcomp_testvec *ctemplate, 10698064efb8SGeert Uytterhoeven struct pcomp_testvec *dtemplate, int ctcount, 10708064efb8SGeert Uytterhoeven int dtcount) 10718064efb8SGeert Uytterhoeven { 10728064efb8SGeert Uytterhoeven const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm)); 10738064efb8SGeert Uytterhoeven unsigned int i; 10748064efb8SGeert Uytterhoeven char result[COMP_BUF_SIZE]; 10753ce858cbSGeert Uytterhoeven int res; 10768064efb8SGeert Uytterhoeven 10778064efb8SGeert Uytterhoeven for (i = 0; i < ctcount; i++) { 10788064efb8SGeert Uytterhoeven struct comp_request req; 10793ce858cbSGeert Uytterhoeven unsigned int produced = 0; 10808064efb8SGeert Uytterhoeven 10813ce858cbSGeert Uytterhoeven res = crypto_compress_setup(tfm, ctemplate[i].params, 10828064efb8SGeert Uytterhoeven ctemplate[i].paramsize); 10833ce858cbSGeert Uytterhoeven if (res) { 10848064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression setup failed on test " 10853ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 10863ce858cbSGeert Uytterhoeven return res; 10878064efb8SGeert Uytterhoeven } 10888064efb8SGeert Uytterhoeven 10893ce858cbSGeert Uytterhoeven res = crypto_compress_init(tfm); 10903ce858cbSGeert Uytterhoeven if (res) { 10918064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression init failed on test " 10923ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 10933ce858cbSGeert Uytterhoeven return res; 10948064efb8SGeert Uytterhoeven } 10958064efb8SGeert Uytterhoeven 10968064efb8SGeert Uytterhoeven memset(result, 0, sizeof(result)); 10978064efb8SGeert Uytterhoeven 10988064efb8SGeert Uytterhoeven req.next_in = ctemplate[i].input; 10998064efb8SGeert Uytterhoeven req.avail_in = ctemplate[i].inlen / 2; 11008064efb8SGeert Uytterhoeven req.next_out = result; 11018064efb8SGeert Uytterhoeven req.avail_out = ctemplate[i].outlen / 2; 11028064efb8SGeert Uytterhoeven 11033ce858cbSGeert Uytterhoeven res = crypto_compress_update(tfm, &req); 11043ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 11058064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression update failed on test " 11063ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 11073ce858cbSGeert Uytterhoeven return res; 11088064efb8SGeert Uytterhoeven } 11093ce858cbSGeert Uytterhoeven if (res > 0) 11103ce858cbSGeert Uytterhoeven produced += res; 11118064efb8SGeert Uytterhoeven 11128064efb8SGeert Uytterhoeven /* Add remaining input data */ 11138064efb8SGeert Uytterhoeven req.avail_in += (ctemplate[i].inlen + 1) / 2; 11148064efb8SGeert Uytterhoeven 11153ce858cbSGeert Uytterhoeven res = crypto_compress_update(tfm, &req); 11163ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 11178064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression update failed on test " 11183ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 11193ce858cbSGeert Uytterhoeven return res; 11208064efb8SGeert Uytterhoeven } 11213ce858cbSGeert Uytterhoeven if (res > 0) 11223ce858cbSGeert Uytterhoeven produced += res; 11238064efb8SGeert Uytterhoeven 11248064efb8SGeert Uytterhoeven /* Provide remaining output space */ 11258064efb8SGeert Uytterhoeven req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2; 11268064efb8SGeert Uytterhoeven 11273ce858cbSGeert Uytterhoeven res = crypto_compress_final(tfm, &req); 11283ce858cbSGeert Uytterhoeven if (res < 0) { 11298064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression final failed on test " 11303ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 11313ce858cbSGeert Uytterhoeven return res; 11328064efb8SGeert Uytterhoeven } 11333ce858cbSGeert Uytterhoeven produced += res; 11348064efb8SGeert Uytterhoeven 11358064efb8SGeert Uytterhoeven if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) { 11368064efb8SGeert Uytterhoeven pr_err("alg: comp: Compression test %d failed for %s: " 11378064efb8SGeert Uytterhoeven "output len = %d (expected %d)\n", i + 1, algo, 11388064efb8SGeert Uytterhoeven COMP_BUF_SIZE - req.avail_out, 11398064efb8SGeert Uytterhoeven ctemplate[i].outlen); 11408064efb8SGeert Uytterhoeven return -EINVAL; 11418064efb8SGeert Uytterhoeven } 11428064efb8SGeert Uytterhoeven 11433ce858cbSGeert Uytterhoeven if (produced != ctemplate[i].outlen) { 11443ce858cbSGeert Uytterhoeven pr_err("alg: comp: Compression test %d failed for %s: " 11453ce858cbSGeert Uytterhoeven "returned len = %u (expected %d)\n", i + 1, 11463ce858cbSGeert Uytterhoeven algo, produced, ctemplate[i].outlen); 11473ce858cbSGeert Uytterhoeven return -EINVAL; 11483ce858cbSGeert Uytterhoeven } 11493ce858cbSGeert Uytterhoeven 11508064efb8SGeert Uytterhoeven if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) { 11518064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Compression test %d failed for " 11528064efb8SGeert Uytterhoeven "%s\n", i + 1, algo); 11538064efb8SGeert Uytterhoeven hexdump(result, ctemplate[i].outlen); 11548064efb8SGeert Uytterhoeven return -EINVAL; 11558064efb8SGeert Uytterhoeven } 11568064efb8SGeert Uytterhoeven } 11578064efb8SGeert Uytterhoeven 11588064efb8SGeert Uytterhoeven for (i = 0; i < dtcount; i++) { 11598064efb8SGeert Uytterhoeven struct comp_request req; 11603ce858cbSGeert Uytterhoeven unsigned int produced = 0; 11618064efb8SGeert Uytterhoeven 11623ce858cbSGeert Uytterhoeven res = crypto_decompress_setup(tfm, dtemplate[i].params, 11638064efb8SGeert Uytterhoeven dtemplate[i].paramsize); 11643ce858cbSGeert Uytterhoeven if (res) { 11658064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression setup failed on " 11663ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 11673ce858cbSGeert Uytterhoeven return res; 11688064efb8SGeert Uytterhoeven } 11698064efb8SGeert Uytterhoeven 11703ce858cbSGeert Uytterhoeven res = crypto_decompress_init(tfm); 11713ce858cbSGeert Uytterhoeven if (res) { 11728064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression init failed on test " 11733ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 11743ce858cbSGeert Uytterhoeven return res; 11758064efb8SGeert Uytterhoeven } 11768064efb8SGeert Uytterhoeven 11778064efb8SGeert Uytterhoeven memset(result, 0, sizeof(result)); 11788064efb8SGeert Uytterhoeven 11798064efb8SGeert Uytterhoeven req.next_in = dtemplate[i].input; 11808064efb8SGeert Uytterhoeven req.avail_in = dtemplate[i].inlen / 2; 11818064efb8SGeert Uytterhoeven req.next_out = result; 11828064efb8SGeert Uytterhoeven req.avail_out = dtemplate[i].outlen / 2; 11838064efb8SGeert Uytterhoeven 11843ce858cbSGeert Uytterhoeven res = crypto_decompress_update(tfm, &req); 11853ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 11868064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression update failed on " 11873ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 11883ce858cbSGeert Uytterhoeven return res; 11898064efb8SGeert Uytterhoeven } 11903ce858cbSGeert Uytterhoeven if (res > 0) 11913ce858cbSGeert Uytterhoeven produced += res; 11928064efb8SGeert Uytterhoeven 11938064efb8SGeert Uytterhoeven /* Add remaining input data */ 11948064efb8SGeert Uytterhoeven req.avail_in += (dtemplate[i].inlen + 1) / 2; 11958064efb8SGeert Uytterhoeven 11963ce858cbSGeert Uytterhoeven res = crypto_decompress_update(tfm, &req); 11973ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 11988064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression update failed on " 11993ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 12003ce858cbSGeert Uytterhoeven return res; 12018064efb8SGeert Uytterhoeven } 12023ce858cbSGeert Uytterhoeven if (res > 0) 12033ce858cbSGeert Uytterhoeven produced += res; 12048064efb8SGeert Uytterhoeven 12058064efb8SGeert Uytterhoeven /* Provide remaining output space */ 12068064efb8SGeert Uytterhoeven req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2; 12078064efb8SGeert Uytterhoeven 12083ce858cbSGeert Uytterhoeven res = crypto_decompress_final(tfm, &req); 12093ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 12108064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression final failed on " 12113ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 12123ce858cbSGeert Uytterhoeven return res; 12138064efb8SGeert Uytterhoeven } 12143ce858cbSGeert Uytterhoeven if (res > 0) 12153ce858cbSGeert Uytterhoeven produced += res; 12168064efb8SGeert Uytterhoeven 12178064efb8SGeert Uytterhoeven if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) { 12188064efb8SGeert Uytterhoeven pr_err("alg: comp: Decompression test %d failed for " 12198064efb8SGeert Uytterhoeven "%s: output len = %d (expected %d)\n", i + 1, 12208064efb8SGeert Uytterhoeven algo, COMP_BUF_SIZE - req.avail_out, 12218064efb8SGeert Uytterhoeven dtemplate[i].outlen); 12228064efb8SGeert Uytterhoeven return -EINVAL; 12238064efb8SGeert Uytterhoeven } 12248064efb8SGeert Uytterhoeven 12253ce858cbSGeert Uytterhoeven if (produced != dtemplate[i].outlen) { 12263ce858cbSGeert Uytterhoeven pr_err("alg: comp: Decompression test %d failed for " 12273ce858cbSGeert Uytterhoeven "%s: returned len = %u (expected %d)\n", i + 1, 12283ce858cbSGeert Uytterhoeven algo, produced, dtemplate[i].outlen); 12293ce858cbSGeert Uytterhoeven return -EINVAL; 12303ce858cbSGeert Uytterhoeven } 12313ce858cbSGeert Uytterhoeven 12328064efb8SGeert Uytterhoeven if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) { 12338064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Decompression test %d failed for " 12348064efb8SGeert Uytterhoeven "%s\n", i + 1, algo); 12358064efb8SGeert Uytterhoeven hexdump(result, dtemplate[i].outlen); 12368064efb8SGeert Uytterhoeven return -EINVAL; 12378064efb8SGeert Uytterhoeven } 12388064efb8SGeert Uytterhoeven } 12398064efb8SGeert Uytterhoeven 12408064efb8SGeert Uytterhoeven return 0; 12418064efb8SGeert Uytterhoeven } 12428064efb8SGeert Uytterhoeven 12437647d6ceSJarod Wilson 12447647d6ceSJarod Wilson static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template, 12457647d6ceSJarod Wilson unsigned int tcount) 12467647d6ceSJarod Wilson { 12477647d6ceSJarod Wilson const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm)); 1248fa4ef8a6SFelipe Contreras int err = 0, i, j, seedsize; 12497647d6ceSJarod Wilson u8 *seed; 12507647d6ceSJarod Wilson char result[32]; 12517647d6ceSJarod Wilson 12527647d6ceSJarod Wilson seedsize = crypto_rng_seedsize(tfm); 12537647d6ceSJarod Wilson 12547647d6ceSJarod Wilson seed = kmalloc(seedsize, GFP_KERNEL); 12557647d6ceSJarod Wilson if (!seed) { 12567647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to allocate seed space " 12577647d6ceSJarod Wilson "for %s\n", algo); 12587647d6ceSJarod Wilson return -ENOMEM; 12597647d6ceSJarod Wilson } 12607647d6ceSJarod Wilson 12617647d6ceSJarod Wilson for (i = 0; i < tcount; i++) { 12627647d6ceSJarod Wilson memset(result, 0, 32); 12637647d6ceSJarod Wilson 12647647d6ceSJarod Wilson memcpy(seed, template[i].v, template[i].vlen); 12657647d6ceSJarod Wilson memcpy(seed + template[i].vlen, template[i].key, 12667647d6ceSJarod Wilson template[i].klen); 12677647d6ceSJarod Wilson memcpy(seed + template[i].vlen + template[i].klen, 12687647d6ceSJarod Wilson template[i].dt, template[i].dtlen); 12697647d6ceSJarod Wilson 12707647d6ceSJarod Wilson err = crypto_rng_reset(tfm, seed, seedsize); 12717647d6ceSJarod Wilson if (err) { 12727647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to reset rng " 12737647d6ceSJarod Wilson "for %s\n", algo); 12747647d6ceSJarod Wilson goto out; 12757647d6ceSJarod Wilson } 12767647d6ceSJarod Wilson 12777647d6ceSJarod Wilson for (j = 0; j < template[i].loops; j++) { 12787647d6ceSJarod Wilson err = crypto_rng_get_bytes(tfm, result, 12797647d6ceSJarod Wilson template[i].rlen); 12807647d6ceSJarod Wilson if (err != template[i].rlen) { 12817647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to obtain " 12827647d6ceSJarod Wilson "the correct amount of random data for " 12837647d6ceSJarod Wilson "%s (requested %d, got %d)\n", algo, 12847647d6ceSJarod Wilson template[i].rlen, err); 12857647d6ceSJarod Wilson goto out; 12867647d6ceSJarod Wilson } 12877647d6ceSJarod Wilson } 12887647d6ceSJarod Wilson 12897647d6ceSJarod Wilson err = memcmp(result, template[i].result, 12907647d6ceSJarod Wilson template[i].rlen); 12917647d6ceSJarod Wilson if (err) { 12927647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Test %d failed for %s\n", 12937647d6ceSJarod Wilson i, algo); 12947647d6ceSJarod Wilson hexdump(result, template[i].rlen); 12957647d6ceSJarod Wilson err = -EINVAL; 12967647d6ceSJarod Wilson goto out; 12977647d6ceSJarod Wilson } 12987647d6ceSJarod Wilson } 12997647d6ceSJarod Wilson 13007647d6ceSJarod Wilson out: 13017647d6ceSJarod Wilson kfree(seed); 13027647d6ceSJarod Wilson return err; 13037647d6ceSJarod Wilson } 13047647d6ceSJarod Wilson 1305da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver, 1306da7f033dSHerbert Xu u32 type, u32 mask) 1307da7f033dSHerbert Xu { 1308da7f033dSHerbert Xu struct crypto_aead *tfm; 1309da7f033dSHerbert Xu int err = 0; 1310da7f033dSHerbert Xu 1311da7f033dSHerbert Xu tfm = crypto_alloc_aead(driver, type, mask); 1312da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1313da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to load transform for %s: " 1314da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1315da7f033dSHerbert Xu return PTR_ERR(tfm); 1316da7f033dSHerbert Xu } 1317da7f033dSHerbert Xu 1318da7f033dSHerbert Xu if (desc->suite.aead.enc.vecs) { 1319da7f033dSHerbert Xu err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs, 1320da7f033dSHerbert Xu desc->suite.aead.enc.count); 1321da7f033dSHerbert Xu if (err) 1322da7f033dSHerbert Xu goto out; 1323da7f033dSHerbert Xu } 1324da7f033dSHerbert Xu 1325da7f033dSHerbert Xu if (!err && desc->suite.aead.dec.vecs) 1326da7f033dSHerbert Xu err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs, 1327da7f033dSHerbert Xu desc->suite.aead.dec.count); 1328da7f033dSHerbert Xu 1329da7f033dSHerbert Xu out: 1330da7f033dSHerbert Xu crypto_free_aead(tfm); 1331da7f033dSHerbert Xu return err; 1332da7f033dSHerbert Xu } 1333da7f033dSHerbert Xu 1334da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc, 1335da7f033dSHerbert Xu const char *driver, u32 type, u32 mask) 1336da7f033dSHerbert Xu { 13371aa4ecd9SHerbert Xu struct crypto_cipher *tfm; 1338da7f033dSHerbert Xu int err = 0; 1339da7f033dSHerbert Xu 13401aa4ecd9SHerbert Xu tfm = crypto_alloc_cipher(driver, type, mask); 1341da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1342da7f033dSHerbert Xu printk(KERN_ERR "alg: cipher: Failed to load transform for " 1343da7f033dSHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 1344da7f033dSHerbert Xu return PTR_ERR(tfm); 1345da7f033dSHerbert Xu } 1346da7f033dSHerbert Xu 1347da7f033dSHerbert Xu if (desc->suite.cipher.enc.vecs) { 1348da7f033dSHerbert Xu err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 1349da7f033dSHerbert Xu desc->suite.cipher.enc.count); 1350da7f033dSHerbert Xu if (err) 1351da7f033dSHerbert Xu goto out; 1352da7f033dSHerbert Xu } 1353da7f033dSHerbert Xu 1354da7f033dSHerbert Xu if (desc->suite.cipher.dec.vecs) 1355da7f033dSHerbert Xu err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 1356da7f033dSHerbert Xu desc->suite.cipher.dec.count); 1357da7f033dSHerbert Xu 1358da7f033dSHerbert Xu out: 13591aa4ecd9SHerbert Xu crypto_free_cipher(tfm); 13601aa4ecd9SHerbert Xu return err; 13611aa4ecd9SHerbert Xu } 13621aa4ecd9SHerbert Xu 13631aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc, 13641aa4ecd9SHerbert Xu const char *driver, u32 type, u32 mask) 13651aa4ecd9SHerbert Xu { 13661aa4ecd9SHerbert Xu struct crypto_ablkcipher *tfm; 13671aa4ecd9SHerbert Xu int err = 0; 13681aa4ecd9SHerbert Xu 13691aa4ecd9SHerbert Xu tfm = crypto_alloc_ablkcipher(driver, type, mask); 13701aa4ecd9SHerbert Xu if (IS_ERR(tfm)) { 13711aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Failed to load transform for " 13721aa4ecd9SHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 13731aa4ecd9SHerbert Xu return PTR_ERR(tfm); 13741aa4ecd9SHerbert Xu } 13751aa4ecd9SHerbert Xu 13761aa4ecd9SHerbert Xu if (desc->suite.cipher.enc.vecs) { 13771aa4ecd9SHerbert Xu err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 13781aa4ecd9SHerbert Xu desc->suite.cipher.enc.count); 13791aa4ecd9SHerbert Xu if (err) 13801aa4ecd9SHerbert Xu goto out; 13811aa4ecd9SHerbert Xu } 13821aa4ecd9SHerbert Xu 13831aa4ecd9SHerbert Xu if (desc->suite.cipher.dec.vecs) 13841aa4ecd9SHerbert Xu err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 13851aa4ecd9SHerbert Xu desc->suite.cipher.dec.count); 13861aa4ecd9SHerbert Xu 13871aa4ecd9SHerbert Xu out: 1388da7f033dSHerbert Xu crypto_free_ablkcipher(tfm); 1389da7f033dSHerbert Xu return err; 1390da7f033dSHerbert Xu } 1391da7f033dSHerbert Xu 1392da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver, 1393da7f033dSHerbert Xu u32 type, u32 mask) 1394da7f033dSHerbert Xu { 1395da7f033dSHerbert Xu struct crypto_comp *tfm; 1396da7f033dSHerbert Xu int err; 1397da7f033dSHerbert Xu 1398da7f033dSHerbert Xu tfm = crypto_alloc_comp(driver, type, mask); 1399da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1400da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Failed to load transform for %s: " 1401da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1402da7f033dSHerbert Xu return PTR_ERR(tfm); 1403da7f033dSHerbert Xu } 1404da7f033dSHerbert Xu 1405da7f033dSHerbert Xu err = test_comp(tfm, desc->suite.comp.comp.vecs, 1406da7f033dSHerbert Xu desc->suite.comp.decomp.vecs, 1407da7f033dSHerbert Xu desc->suite.comp.comp.count, 1408da7f033dSHerbert Xu desc->suite.comp.decomp.count); 1409da7f033dSHerbert Xu 1410da7f033dSHerbert Xu crypto_free_comp(tfm); 1411da7f033dSHerbert Xu return err; 1412da7f033dSHerbert Xu } 1413da7f033dSHerbert Xu 14148064efb8SGeert Uytterhoeven static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver, 14158064efb8SGeert Uytterhoeven u32 type, u32 mask) 14168064efb8SGeert Uytterhoeven { 14178064efb8SGeert Uytterhoeven struct crypto_pcomp *tfm; 14188064efb8SGeert Uytterhoeven int err; 14198064efb8SGeert Uytterhoeven 14208064efb8SGeert Uytterhoeven tfm = crypto_alloc_pcomp(driver, type, mask); 14218064efb8SGeert Uytterhoeven if (IS_ERR(tfm)) { 14228064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Failed to load transform for %s: %ld\n", 14238064efb8SGeert Uytterhoeven driver, PTR_ERR(tfm)); 14248064efb8SGeert Uytterhoeven return PTR_ERR(tfm); 14258064efb8SGeert Uytterhoeven } 14268064efb8SGeert Uytterhoeven 14278064efb8SGeert Uytterhoeven err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs, 14288064efb8SGeert Uytterhoeven desc->suite.pcomp.decomp.vecs, 14298064efb8SGeert Uytterhoeven desc->suite.pcomp.comp.count, 14308064efb8SGeert Uytterhoeven desc->suite.pcomp.decomp.count); 14318064efb8SGeert Uytterhoeven 14328064efb8SGeert Uytterhoeven crypto_free_pcomp(tfm); 14338064efb8SGeert Uytterhoeven return err; 14348064efb8SGeert Uytterhoeven } 14358064efb8SGeert Uytterhoeven 1436da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver, 1437da7f033dSHerbert Xu u32 type, u32 mask) 1438da7f033dSHerbert Xu { 1439da7f033dSHerbert Xu struct crypto_ahash *tfm; 1440da7f033dSHerbert Xu int err; 1441da7f033dSHerbert Xu 1442da7f033dSHerbert Xu tfm = crypto_alloc_ahash(driver, type, mask); 1443da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1444da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to load transform for %s: " 1445da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1446da7f033dSHerbert Xu return PTR_ERR(tfm); 1447da7f033dSHerbert Xu } 1448da7f033dSHerbert Xu 1449a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1450a8f1a052SDavid S. Miller desc->suite.hash.count, true); 1451a8f1a052SDavid S. Miller if (!err) 1452a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1453a8f1a052SDavid S. Miller desc->suite.hash.count, false); 1454da7f033dSHerbert Xu 1455da7f033dSHerbert Xu crypto_free_ahash(tfm); 1456da7f033dSHerbert Xu return err; 1457da7f033dSHerbert Xu } 1458da7f033dSHerbert Xu 14598e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc, 14608e3ee85eSHerbert Xu const char *driver, u32 type, u32 mask) 14618e3ee85eSHerbert Xu { 14628e3ee85eSHerbert Xu struct crypto_shash *tfm; 14638e3ee85eSHerbert Xu u32 val; 14648e3ee85eSHerbert Xu int err; 14658e3ee85eSHerbert Xu 14668e3ee85eSHerbert Xu err = alg_test_hash(desc, driver, type, mask); 14678e3ee85eSHerbert Xu if (err) 14688e3ee85eSHerbert Xu goto out; 14698e3ee85eSHerbert Xu 14708e3ee85eSHerbert Xu tfm = crypto_alloc_shash(driver, type, mask); 14718e3ee85eSHerbert Xu if (IS_ERR(tfm)) { 14728e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: " 14738e3ee85eSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 14748e3ee85eSHerbert Xu err = PTR_ERR(tfm); 14758e3ee85eSHerbert Xu goto out; 14768e3ee85eSHerbert Xu } 14778e3ee85eSHerbert Xu 14788e3ee85eSHerbert Xu do { 14798e3ee85eSHerbert Xu struct { 14808e3ee85eSHerbert Xu struct shash_desc shash; 14818e3ee85eSHerbert Xu char ctx[crypto_shash_descsize(tfm)]; 14828e3ee85eSHerbert Xu } sdesc; 14838e3ee85eSHerbert Xu 14848e3ee85eSHerbert Xu sdesc.shash.tfm = tfm; 14858e3ee85eSHerbert Xu sdesc.shash.flags = 0; 14868e3ee85eSHerbert Xu 14878e3ee85eSHerbert Xu *(u32 *)sdesc.ctx = le32_to_cpu(420553207); 14888e3ee85eSHerbert Xu err = crypto_shash_final(&sdesc.shash, (u8 *)&val); 14898e3ee85eSHerbert Xu if (err) { 14908e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Operation failed for " 14918e3ee85eSHerbert Xu "%s: %d\n", driver, err); 14928e3ee85eSHerbert Xu break; 14938e3ee85eSHerbert Xu } 14948e3ee85eSHerbert Xu 14958e3ee85eSHerbert Xu if (val != ~420553207) { 14968e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Test failed for %s: " 14978e3ee85eSHerbert Xu "%d\n", driver, val); 14988e3ee85eSHerbert Xu err = -EINVAL; 14998e3ee85eSHerbert Xu } 15008e3ee85eSHerbert Xu } while (0); 15018e3ee85eSHerbert Xu 15028e3ee85eSHerbert Xu crypto_free_shash(tfm); 15038e3ee85eSHerbert Xu 15048e3ee85eSHerbert Xu out: 15058e3ee85eSHerbert Xu return err; 15068e3ee85eSHerbert Xu } 15078e3ee85eSHerbert Xu 15087647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver, 15097647d6ceSJarod Wilson u32 type, u32 mask) 15107647d6ceSJarod Wilson { 15117647d6ceSJarod Wilson struct crypto_rng *rng; 15127647d6ceSJarod Wilson int err; 15137647d6ceSJarod Wilson 15147647d6ceSJarod Wilson rng = crypto_alloc_rng(driver, type, mask); 15157647d6ceSJarod Wilson if (IS_ERR(rng)) { 15167647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to load transform for %s: " 15177647d6ceSJarod Wilson "%ld\n", driver, PTR_ERR(rng)); 15187647d6ceSJarod Wilson return PTR_ERR(rng); 15197647d6ceSJarod Wilson } 15207647d6ceSJarod Wilson 15217647d6ceSJarod Wilson err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count); 15227647d6ceSJarod Wilson 15237647d6ceSJarod Wilson crypto_free_rng(rng); 15247647d6ceSJarod Wilson 15257647d6ceSJarod Wilson return err; 15267647d6ceSJarod Wilson } 15277647d6ceSJarod Wilson 1528863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc, 1529863b557aSYouquan, Song const char *driver, u32 type, u32 mask) 1530863b557aSYouquan, Song { 1531863b557aSYouquan, Song return 0; 1532863b557aSYouquan, Song } 1533863b557aSYouquan, Song 1534da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */ 1535da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = { 1536da7f033dSHerbert Xu { 15377efe4076SJohannes Goetzfried .alg = "__cbc-serpent-avx", 15387efe4076SJohannes Goetzfried .test = alg_test_null, 15397efe4076SJohannes Goetzfried .suite = { 15407efe4076SJohannes Goetzfried .cipher = { 15417efe4076SJohannes Goetzfried .enc = { 15427efe4076SJohannes Goetzfried .vecs = NULL, 15437efe4076SJohannes Goetzfried .count = 0 15447efe4076SJohannes Goetzfried }, 15457efe4076SJohannes Goetzfried .dec = { 15467efe4076SJohannes Goetzfried .vecs = NULL, 15477efe4076SJohannes Goetzfried .count = 0 15487efe4076SJohannes Goetzfried } 15497efe4076SJohannes Goetzfried } 15507efe4076SJohannes Goetzfried } 15517efe4076SJohannes Goetzfried }, { 1552937c30d7SJussi Kivilinna .alg = "__cbc-serpent-sse2", 1553937c30d7SJussi Kivilinna .test = alg_test_null, 1554937c30d7SJussi Kivilinna .suite = { 1555937c30d7SJussi Kivilinna .cipher = { 1556937c30d7SJussi Kivilinna .enc = { 1557937c30d7SJussi Kivilinna .vecs = NULL, 1558937c30d7SJussi Kivilinna .count = 0 1559937c30d7SJussi Kivilinna }, 1560937c30d7SJussi Kivilinna .dec = { 1561937c30d7SJussi Kivilinna .vecs = NULL, 1562937c30d7SJussi Kivilinna .count = 0 1563937c30d7SJussi Kivilinna } 1564937c30d7SJussi Kivilinna } 1565937c30d7SJussi Kivilinna } 1566937c30d7SJussi Kivilinna }, { 1567107778b5SJohannes Goetzfried .alg = "__cbc-twofish-avx", 1568107778b5SJohannes Goetzfried .test = alg_test_null, 1569107778b5SJohannes Goetzfried .suite = { 1570107778b5SJohannes Goetzfried .cipher = { 1571107778b5SJohannes Goetzfried .enc = { 1572107778b5SJohannes Goetzfried .vecs = NULL, 1573107778b5SJohannes Goetzfried .count = 0 1574107778b5SJohannes Goetzfried }, 1575107778b5SJohannes Goetzfried .dec = { 1576107778b5SJohannes Goetzfried .vecs = NULL, 1577107778b5SJohannes Goetzfried .count = 0 1578107778b5SJohannes Goetzfried } 1579107778b5SJohannes Goetzfried } 1580107778b5SJohannes Goetzfried } 1581107778b5SJohannes Goetzfried }, { 1582863b557aSYouquan, Song .alg = "__driver-cbc-aes-aesni", 1583863b557aSYouquan, Song .test = alg_test_null, 15846c79294fSMilan Broz .fips_allowed = 1, 1585863b557aSYouquan, Song .suite = { 1586863b557aSYouquan, Song .cipher = { 1587863b557aSYouquan, Song .enc = { 1588863b557aSYouquan, Song .vecs = NULL, 1589863b557aSYouquan, Song .count = 0 1590863b557aSYouquan, Song }, 1591863b557aSYouquan, Song .dec = { 1592863b557aSYouquan, Song .vecs = NULL, 1593863b557aSYouquan, Song .count = 0 1594863b557aSYouquan, Song } 1595863b557aSYouquan, Song } 1596863b557aSYouquan, Song } 1597863b557aSYouquan, Song }, { 15987efe4076SJohannes Goetzfried .alg = "__driver-cbc-serpent-avx", 15997efe4076SJohannes Goetzfried .test = alg_test_null, 16007efe4076SJohannes Goetzfried .suite = { 16017efe4076SJohannes Goetzfried .cipher = { 16027efe4076SJohannes Goetzfried .enc = { 16037efe4076SJohannes Goetzfried .vecs = NULL, 16047efe4076SJohannes Goetzfried .count = 0 16057efe4076SJohannes Goetzfried }, 16067efe4076SJohannes Goetzfried .dec = { 16077efe4076SJohannes Goetzfried .vecs = NULL, 16087efe4076SJohannes Goetzfried .count = 0 16097efe4076SJohannes Goetzfried } 16107efe4076SJohannes Goetzfried } 16117efe4076SJohannes Goetzfried } 16127efe4076SJohannes Goetzfried }, { 1613937c30d7SJussi Kivilinna .alg = "__driver-cbc-serpent-sse2", 1614937c30d7SJussi Kivilinna .test = alg_test_null, 1615937c30d7SJussi Kivilinna .suite = { 1616937c30d7SJussi Kivilinna .cipher = { 1617937c30d7SJussi Kivilinna .enc = { 1618937c30d7SJussi Kivilinna .vecs = NULL, 1619937c30d7SJussi Kivilinna .count = 0 1620937c30d7SJussi Kivilinna }, 1621937c30d7SJussi Kivilinna .dec = { 1622937c30d7SJussi Kivilinna .vecs = NULL, 1623937c30d7SJussi Kivilinna .count = 0 1624937c30d7SJussi Kivilinna } 1625937c30d7SJussi Kivilinna } 1626937c30d7SJussi Kivilinna } 1627937c30d7SJussi Kivilinna }, { 1628107778b5SJohannes Goetzfried .alg = "__driver-cbc-twofish-avx", 1629107778b5SJohannes Goetzfried .test = alg_test_null, 1630107778b5SJohannes Goetzfried .suite = { 1631107778b5SJohannes Goetzfried .cipher = { 1632107778b5SJohannes Goetzfried .enc = { 1633107778b5SJohannes Goetzfried .vecs = NULL, 1634107778b5SJohannes Goetzfried .count = 0 1635107778b5SJohannes Goetzfried }, 1636107778b5SJohannes Goetzfried .dec = { 1637107778b5SJohannes Goetzfried .vecs = NULL, 1638107778b5SJohannes Goetzfried .count = 0 1639107778b5SJohannes Goetzfried } 1640107778b5SJohannes Goetzfried } 1641107778b5SJohannes Goetzfried } 1642107778b5SJohannes Goetzfried }, { 1643863b557aSYouquan, Song .alg = "__driver-ecb-aes-aesni", 1644863b557aSYouquan, Song .test = alg_test_null, 16456c79294fSMilan Broz .fips_allowed = 1, 1646863b557aSYouquan, Song .suite = { 1647863b557aSYouquan, Song .cipher = { 1648863b557aSYouquan, Song .enc = { 1649863b557aSYouquan, Song .vecs = NULL, 1650863b557aSYouquan, Song .count = 0 1651863b557aSYouquan, Song }, 1652863b557aSYouquan, Song .dec = { 1653863b557aSYouquan, Song .vecs = NULL, 1654863b557aSYouquan, Song .count = 0 1655863b557aSYouquan, Song } 1656863b557aSYouquan, Song } 1657863b557aSYouquan, Song } 1658863b557aSYouquan, Song }, { 16597efe4076SJohannes Goetzfried .alg = "__driver-ecb-serpent-avx", 16607efe4076SJohannes Goetzfried .test = alg_test_null, 16617efe4076SJohannes Goetzfried .suite = { 16627efe4076SJohannes Goetzfried .cipher = { 16637efe4076SJohannes Goetzfried .enc = { 16647efe4076SJohannes Goetzfried .vecs = NULL, 16657efe4076SJohannes Goetzfried .count = 0 16667efe4076SJohannes Goetzfried }, 16677efe4076SJohannes Goetzfried .dec = { 16687efe4076SJohannes Goetzfried .vecs = NULL, 16697efe4076SJohannes Goetzfried .count = 0 16707efe4076SJohannes Goetzfried } 16717efe4076SJohannes Goetzfried } 16727efe4076SJohannes Goetzfried } 16737efe4076SJohannes Goetzfried }, { 1674937c30d7SJussi Kivilinna .alg = "__driver-ecb-serpent-sse2", 1675937c30d7SJussi Kivilinna .test = alg_test_null, 1676937c30d7SJussi Kivilinna .suite = { 1677937c30d7SJussi Kivilinna .cipher = { 1678937c30d7SJussi Kivilinna .enc = { 1679937c30d7SJussi Kivilinna .vecs = NULL, 1680937c30d7SJussi Kivilinna .count = 0 1681937c30d7SJussi Kivilinna }, 1682937c30d7SJussi Kivilinna .dec = { 1683937c30d7SJussi Kivilinna .vecs = NULL, 1684937c30d7SJussi Kivilinna .count = 0 1685937c30d7SJussi Kivilinna } 1686937c30d7SJussi Kivilinna } 1687937c30d7SJussi Kivilinna } 1688937c30d7SJussi Kivilinna }, { 1689107778b5SJohannes Goetzfried .alg = "__driver-ecb-twofish-avx", 1690107778b5SJohannes Goetzfried .test = alg_test_null, 1691107778b5SJohannes Goetzfried .suite = { 1692107778b5SJohannes Goetzfried .cipher = { 1693107778b5SJohannes Goetzfried .enc = { 1694107778b5SJohannes Goetzfried .vecs = NULL, 1695107778b5SJohannes Goetzfried .count = 0 1696107778b5SJohannes Goetzfried }, 1697107778b5SJohannes Goetzfried .dec = { 1698107778b5SJohannes Goetzfried .vecs = NULL, 1699107778b5SJohannes Goetzfried .count = 0 1700107778b5SJohannes Goetzfried } 1701107778b5SJohannes Goetzfried } 1702107778b5SJohannes Goetzfried } 1703107778b5SJohannes Goetzfried }, { 1704863b557aSYouquan, Song .alg = "__ghash-pclmulqdqni", 1705863b557aSYouquan, Song .test = alg_test_null, 17066c79294fSMilan Broz .fips_allowed = 1, 1707863b557aSYouquan, Song .suite = { 1708863b557aSYouquan, Song .hash = { 1709863b557aSYouquan, Song .vecs = NULL, 1710863b557aSYouquan, Song .count = 0 1711863b557aSYouquan, Song } 1712863b557aSYouquan, Song } 1713863b557aSYouquan, Song }, { 1714e08ca2daSJarod Wilson .alg = "ansi_cprng", 1715e08ca2daSJarod Wilson .test = alg_test_cprng, 1716a1915d51SJarod Wilson .fips_allowed = 1, 1717e08ca2daSJarod Wilson .suite = { 1718e08ca2daSJarod Wilson .cprng = { 1719e08ca2daSJarod Wilson .vecs = ansi_cprng_aes_tv_template, 1720e08ca2daSJarod Wilson .count = ANSI_CPRNG_AES_TEST_VECTORS 1721e08ca2daSJarod Wilson } 1722e08ca2daSJarod Wilson } 1723e08ca2daSJarod Wilson }, { 1724e46e9a46SHoria Geanta .alg = "authenc(hmac(sha1),cbc(aes))", 1725e46e9a46SHoria Geanta .test = alg_test_aead, 1726e46e9a46SHoria Geanta .fips_allowed = 1, 1727e46e9a46SHoria Geanta .suite = { 1728e46e9a46SHoria Geanta .aead = { 1729e46e9a46SHoria Geanta .enc = { 1730e46e9a46SHoria Geanta .vecs = hmac_sha1_aes_cbc_enc_tv_template, 1731e46e9a46SHoria Geanta .count = HMAC_SHA1_AES_CBC_ENC_TEST_VECTORS 1732e46e9a46SHoria Geanta } 1733e46e9a46SHoria Geanta } 1734e46e9a46SHoria Geanta } 1735e46e9a46SHoria Geanta }, { 1736e46e9a46SHoria Geanta .alg = "authenc(hmac(sha256),cbc(aes))", 1737e46e9a46SHoria Geanta .test = alg_test_aead, 1738e46e9a46SHoria Geanta .fips_allowed = 1, 1739e46e9a46SHoria Geanta .suite = { 1740e46e9a46SHoria Geanta .aead = { 1741e46e9a46SHoria Geanta .enc = { 1742e46e9a46SHoria Geanta .vecs = hmac_sha256_aes_cbc_enc_tv_template, 1743e46e9a46SHoria Geanta .count = HMAC_SHA256_AES_CBC_ENC_TEST_VECTORS 1744e46e9a46SHoria Geanta } 1745e46e9a46SHoria Geanta } 1746e46e9a46SHoria Geanta } 1747e46e9a46SHoria Geanta }, { 1748e46e9a46SHoria Geanta .alg = "authenc(hmac(sha512),cbc(aes))", 1749e46e9a46SHoria Geanta .test = alg_test_aead, 1750e46e9a46SHoria Geanta .fips_allowed = 1, 1751e46e9a46SHoria Geanta .suite = { 1752e46e9a46SHoria Geanta .aead = { 1753e46e9a46SHoria Geanta .enc = { 1754e46e9a46SHoria Geanta .vecs = hmac_sha512_aes_cbc_enc_tv_template, 1755e46e9a46SHoria Geanta .count = HMAC_SHA512_AES_CBC_ENC_TEST_VECTORS 1756e46e9a46SHoria Geanta } 1757e46e9a46SHoria Geanta } 1758e46e9a46SHoria Geanta } 1759e46e9a46SHoria Geanta }, { 1760da7f033dSHerbert Xu .alg = "cbc(aes)", 17611aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1762a1915d51SJarod Wilson .fips_allowed = 1, 1763da7f033dSHerbert Xu .suite = { 1764da7f033dSHerbert Xu .cipher = { 1765da7f033dSHerbert Xu .enc = { 1766da7f033dSHerbert Xu .vecs = aes_cbc_enc_tv_template, 1767da7f033dSHerbert Xu .count = AES_CBC_ENC_TEST_VECTORS 1768da7f033dSHerbert Xu }, 1769da7f033dSHerbert Xu .dec = { 1770da7f033dSHerbert Xu .vecs = aes_cbc_dec_tv_template, 1771da7f033dSHerbert Xu .count = AES_CBC_DEC_TEST_VECTORS 1772da7f033dSHerbert Xu } 1773da7f033dSHerbert Xu } 1774da7f033dSHerbert Xu } 1775da7f033dSHerbert Xu }, { 1776da7f033dSHerbert Xu .alg = "cbc(anubis)", 17771aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1778da7f033dSHerbert Xu .suite = { 1779da7f033dSHerbert Xu .cipher = { 1780da7f033dSHerbert Xu .enc = { 1781da7f033dSHerbert Xu .vecs = anubis_cbc_enc_tv_template, 1782da7f033dSHerbert Xu .count = ANUBIS_CBC_ENC_TEST_VECTORS 1783da7f033dSHerbert Xu }, 1784da7f033dSHerbert Xu .dec = { 1785da7f033dSHerbert Xu .vecs = anubis_cbc_dec_tv_template, 1786da7f033dSHerbert Xu .count = ANUBIS_CBC_DEC_TEST_VECTORS 1787da7f033dSHerbert Xu } 1788da7f033dSHerbert Xu } 1789da7f033dSHerbert Xu } 1790da7f033dSHerbert Xu }, { 1791da7f033dSHerbert Xu .alg = "cbc(blowfish)", 17921aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1793da7f033dSHerbert Xu .suite = { 1794da7f033dSHerbert Xu .cipher = { 1795da7f033dSHerbert Xu .enc = { 1796da7f033dSHerbert Xu .vecs = bf_cbc_enc_tv_template, 1797da7f033dSHerbert Xu .count = BF_CBC_ENC_TEST_VECTORS 1798da7f033dSHerbert Xu }, 1799da7f033dSHerbert Xu .dec = { 1800da7f033dSHerbert Xu .vecs = bf_cbc_dec_tv_template, 1801da7f033dSHerbert Xu .count = BF_CBC_DEC_TEST_VECTORS 1802da7f033dSHerbert Xu } 1803da7f033dSHerbert Xu } 1804da7f033dSHerbert Xu } 1805da7f033dSHerbert Xu }, { 1806da7f033dSHerbert Xu .alg = "cbc(camellia)", 18071aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1808da7f033dSHerbert Xu .suite = { 1809da7f033dSHerbert Xu .cipher = { 1810da7f033dSHerbert Xu .enc = { 1811da7f033dSHerbert Xu .vecs = camellia_cbc_enc_tv_template, 1812da7f033dSHerbert Xu .count = CAMELLIA_CBC_ENC_TEST_VECTORS 1813da7f033dSHerbert Xu }, 1814da7f033dSHerbert Xu .dec = { 1815da7f033dSHerbert Xu .vecs = camellia_cbc_dec_tv_template, 1816da7f033dSHerbert Xu .count = CAMELLIA_CBC_DEC_TEST_VECTORS 1817da7f033dSHerbert Xu } 1818da7f033dSHerbert Xu } 1819da7f033dSHerbert Xu } 1820da7f033dSHerbert Xu }, { 1821a2c58260SJohannes Goetzfried .alg = "cbc(cast5)", 1822a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 1823a2c58260SJohannes Goetzfried .suite = { 1824a2c58260SJohannes Goetzfried .cipher = { 1825a2c58260SJohannes Goetzfried .enc = { 1826a2c58260SJohannes Goetzfried .vecs = cast5_cbc_enc_tv_template, 1827a2c58260SJohannes Goetzfried .count = CAST5_CBC_ENC_TEST_VECTORS 1828a2c58260SJohannes Goetzfried }, 1829a2c58260SJohannes Goetzfried .dec = { 1830a2c58260SJohannes Goetzfried .vecs = cast5_cbc_dec_tv_template, 1831a2c58260SJohannes Goetzfried .count = CAST5_CBC_DEC_TEST_VECTORS 1832a2c58260SJohannes Goetzfried } 1833a2c58260SJohannes Goetzfried } 1834a2c58260SJohannes Goetzfried } 1835a2c58260SJohannes Goetzfried }, { 1836da7f033dSHerbert Xu .alg = "cbc(des)", 18371aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1838da7f033dSHerbert Xu .suite = { 1839da7f033dSHerbert Xu .cipher = { 1840da7f033dSHerbert Xu .enc = { 1841da7f033dSHerbert Xu .vecs = des_cbc_enc_tv_template, 1842da7f033dSHerbert Xu .count = DES_CBC_ENC_TEST_VECTORS 1843da7f033dSHerbert Xu }, 1844da7f033dSHerbert Xu .dec = { 1845da7f033dSHerbert Xu .vecs = des_cbc_dec_tv_template, 1846da7f033dSHerbert Xu .count = DES_CBC_DEC_TEST_VECTORS 1847da7f033dSHerbert Xu } 1848da7f033dSHerbert Xu } 1849da7f033dSHerbert Xu } 1850da7f033dSHerbert Xu }, { 1851da7f033dSHerbert Xu .alg = "cbc(des3_ede)", 18521aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1853a1915d51SJarod Wilson .fips_allowed = 1, 1854da7f033dSHerbert Xu .suite = { 1855da7f033dSHerbert Xu .cipher = { 1856da7f033dSHerbert Xu .enc = { 1857da7f033dSHerbert Xu .vecs = des3_ede_cbc_enc_tv_template, 1858da7f033dSHerbert Xu .count = DES3_EDE_CBC_ENC_TEST_VECTORS 1859da7f033dSHerbert Xu }, 1860da7f033dSHerbert Xu .dec = { 1861da7f033dSHerbert Xu .vecs = des3_ede_cbc_dec_tv_template, 1862da7f033dSHerbert Xu .count = DES3_EDE_CBC_DEC_TEST_VECTORS 1863da7f033dSHerbert Xu } 1864da7f033dSHerbert Xu } 1865da7f033dSHerbert Xu } 1866da7f033dSHerbert Xu }, { 18679d25917dSJussi Kivilinna .alg = "cbc(serpent)", 18689d25917dSJussi Kivilinna .test = alg_test_skcipher, 18699d25917dSJussi Kivilinna .suite = { 18709d25917dSJussi Kivilinna .cipher = { 18719d25917dSJussi Kivilinna .enc = { 18729d25917dSJussi Kivilinna .vecs = serpent_cbc_enc_tv_template, 18739d25917dSJussi Kivilinna .count = SERPENT_CBC_ENC_TEST_VECTORS 18749d25917dSJussi Kivilinna }, 18759d25917dSJussi Kivilinna .dec = { 18769d25917dSJussi Kivilinna .vecs = serpent_cbc_dec_tv_template, 18779d25917dSJussi Kivilinna .count = SERPENT_CBC_DEC_TEST_VECTORS 18789d25917dSJussi Kivilinna } 18799d25917dSJussi Kivilinna } 18809d25917dSJussi Kivilinna } 18819d25917dSJussi Kivilinna }, { 1882da7f033dSHerbert Xu .alg = "cbc(twofish)", 18831aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1884da7f033dSHerbert Xu .suite = { 1885da7f033dSHerbert Xu .cipher = { 1886da7f033dSHerbert Xu .enc = { 1887da7f033dSHerbert Xu .vecs = tf_cbc_enc_tv_template, 1888da7f033dSHerbert Xu .count = TF_CBC_ENC_TEST_VECTORS 1889da7f033dSHerbert Xu }, 1890da7f033dSHerbert Xu .dec = { 1891da7f033dSHerbert Xu .vecs = tf_cbc_dec_tv_template, 1892da7f033dSHerbert Xu .count = TF_CBC_DEC_TEST_VECTORS 1893da7f033dSHerbert Xu } 1894da7f033dSHerbert Xu } 1895da7f033dSHerbert Xu } 1896da7f033dSHerbert Xu }, { 1897da7f033dSHerbert Xu .alg = "ccm(aes)", 1898da7f033dSHerbert Xu .test = alg_test_aead, 1899a1915d51SJarod Wilson .fips_allowed = 1, 1900da7f033dSHerbert Xu .suite = { 1901da7f033dSHerbert Xu .aead = { 1902da7f033dSHerbert Xu .enc = { 1903da7f033dSHerbert Xu .vecs = aes_ccm_enc_tv_template, 1904da7f033dSHerbert Xu .count = AES_CCM_ENC_TEST_VECTORS 1905da7f033dSHerbert Xu }, 1906da7f033dSHerbert Xu .dec = { 1907da7f033dSHerbert Xu .vecs = aes_ccm_dec_tv_template, 1908da7f033dSHerbert Xu .count = AES_CCM_DEC_TEST_VECTORS 1909da7f033dSHerbert Xu } 1910da7f033dSHerbert Xu } 1911da7f033dSHerbert Xu } 1912da7f033dSHerbert Xu }, { 1913da7f033dSHerbert Xu .alg = "crc32c", 19148e3ee85eSHerbert Xu .test = alg_test_crc32c, 1915a1915d51SJarod Wilson .fips_allowed = 1, 1916da7f033dSHerbert Xu .suite = { 1917da7f033dSHerbert Xu .hash = { 1918da7f033dSHerbert Xu .vecs = crc32c_tv_template, 1919da7f033dSHerbert Xu .count = CRC32C_TEST_VECTORS 1920da7f033dSHerbert Xu } 1921da7f033dSHerbert Xu } 1922da7f033dSHerbert Xu }, { 19236c79294fSMilan Broz .alg = "cryptd(__driver-cbc-aes-aesni)", 19246c79294fSMilan Broz .test = alg_test_null, 19256c79294fSMilan Broz .fips_allowed = 1, 19266c79294fSMilan Broz .suite = { 19276c79294fSMilan Broz .cipher = { 19286c79294fSMilan Broz .enc = { 19296c79294fSMilan Broz .vecs = NULL, 19306c79294fSMilan Broz .count = 0 19316c79294fSMilan Broz }, 19326c79294fSMilan Broz .dec = { 19336c79294fSMilan Broz .vecs = NULL, 19346c79294fSMilan Broz .count = 0 19356c79294fSMilan Broz } 19366c79294fSMilan Broz } 19376c79294fSMilan Broz } 19386c79294fSMilan Broz }, { 1939863b557aSYouquan, Song .alg = "cryptd(__driver-ecb-aes-aesni)", 1940863b557aSYouquan, Song .test = alg_test_null, 19416c79294fSMilan Broz .fips_allowed = 1, 1942863b557aSYouquan, Song .suite = { 1943863b557aSYouquan, Song .cipher = { 1944863b557aSYouquan, Song .enc = { 1945863b557aSYouquan, Song .vecs = NULL, 1946863b557aSYouquan, Song .count = 0 1947863b557aSYouquan, Song }, 1948863b557aSYouquan, Song .dec = { 1949863b557aSYouquan, Song .vecs = NULL, 1950863b557aSYouquan, Song .count = 0 1951863b557aSYouquan, Song } 1952863b557aSYouquan, Song } 1953863b557aSYouquan, Song } 1954863b557aSYouquan, Song }, { 19557efe4076SJohannes Goetzfried .alg = "cryptd(__driver-ecb-serpent-avx)", 19567efe4076SJohannes Goetzfried .test = alg_test_null, 19577efe4076SJohannes Goetzfried .suite = { 19587efe4076SJohannes Goetzfried .cipher = { 19597efe4076SJohannes Goetzfried .enc = { 19607efe4076SJohannes Goetzfried .vecs = NULL, 19617efe4076SJohannes Goetzfried .count = 0 19627efe4076SJohannes Goetzfried }, 19637efe4076SJohannes Goetzfried .dec = { 19647efe4076SJohannes Goetzfried .vecs = NULL, 19657efe4076SJohannes Goetzfried .count = 0 19667efe4076SJohannes Goetzfried } 19677efe4076SJohannes Goetzfried } 19687efe4076SJohannes Goetzfried } 19697efe4076SJohannes Goetzfried }, { 1970937c30d7SJussi Kivilinna .alg = "cryptd(__driver-ecb-serpent-sse2)", 1971937c30d7SJussi Kivilinna .test = alg_test_null, 1972937c30d7SJussi Kivilinna .suite = { 1973937c30d7SJussi Kivilinna .cipher = { 1974937c30d7SJussi Kivilinna .enc = { 1975937c30d7SJussi Kivilinna .vecs = NULL, 1976937c30d7SJussi Kivilinna .count = 0 1977937c30d7SJussi Kivilinna }, 1978937c30d7SJussi Kivilinna .dec = { 1979937c30d7SJussi Kivilinna .vecs = NULL, 1980937c30d7SJussi Kivilinna .count = 0 1981937c30d7SJussi Kivilinna } 1982937c30d7SJussi Kivilinna } 1983937c30d7SJussi Kivilinna } 1984937c30d7SJussi Kivilinna }, { 1985107778b5SJohannes Goetzfried .alg = "cryptd(__driver-ecb-twofish-avx)", 1986107778b5SJohannes Goetzfried .test = alg_test_null, 1987107778b5SJohannes Goetzfried .suite = { 1988107778b5SJohannes Goetzfried .cipher = { 1989107778b5SJohannes Goetzfried .enc = { 1990107778b5SJohannes Goetzfried .vecs = NULL, 1991107778b5SJohannes Goetzfried .count = 0 1992107778b5SJohannes Goetzfried }, 1993107778b5SJohannes Goetzfried .dec = { 1994107778b5SJohannes Goetzfried .vecs = NULL, 1995107778b5SJohannes Goetzfried .count = 0 1996107778b5SJohannes Goetzfried } 1997107778b5SJohannes Goetzfried } 1998107778b5SJohannes Goetzfried } 1999107778b5SJohannes Goetzfried }, { 20006c79294fSMilan Broz .alg = "cryptd(__driver-gcm-aes-aesni)", 20016c79294fSMilan Broz .test = alg_test_null, 20026c79294fSMilan Broz .fips_allowed = 1, 20036c79294fSMilan Broz .suite = { 20046c79294fSMilan Broz .cipher = { 20056c79294fSMilan Broz .enc = { 20066c79294fSMilan Broz .vecs = NULL, 20076c79294fSMilan Broz .count = 0 20086c79294fSMilan Broz }, 20096c79294fSMilan Broz .dec = { 20106c79294fSMilan Broz .vecs = NULL, 20116c79294fSMilan Broz .count = 0 20126c79294fSMilan Broz } 20136c79294fSMilan Broz } 20146c79294fSMilan Broz } 20156c79294fSMilan Broz }, { 2016863b557aSYouquan, Song .alg = "cryptd(__ghash-pclmulqdqni)", 2017863b557aSYouquan, Song .test = alg_test_null, 20186c79294fSMilan Broz .fips_allowed = 1, 2019863b557aSYouquan, Song .suite = { 2020863b557aSYouquan, Song .hash = { 2021863b557aSYouquan, Song .vecs = NULL, 2022863b557aSYouquan, Song .count = 0 2023863b557aSYouquan, Song } 2024863b557aSYouquan, Song } 2025863b557aSYouquan, Song }, { 2026f7cb80f2SJarod Wilson .alg = "ctr(aes)", 2027f7cb80f2SJarod Wilson .test = alg_test_skcipher, 2028a1915d51SJarod Wilson .fips_allowed = 1, 2029f7cb80f2SJarod Wilson .suite = { 2030f7cb80f2SJarod Wilson .cipher = { 2031f7cb80f2SJarod Wilson .enc = { 2032f7cb80f2SJarod Wilson .vecs = aes_ctr_enc_tv_template, 2033f7cb80f2SJarod Wilson .count = AES_CTR_ENC_TEST_VECTORS 2034f7cb80f2SJarod Wilson }, 2035f7cb80f2SJarod Wilson .dec = { 2036f7cb80f2SJarod Wilson .vecs = aes_ctr_dec_tv_template, 2037f7cb80f2SJarod Wilson .count = AES_CTR_DEC_TEST_VECTORS 2038f7cb80f2SJarod Wilson } 2039f7cb80f2SJarod Wilson } 2040f7cb80f2SJarod Wilson } 2041f7cb80f2SJarod Wilson }, { 204285b63e34SJussi Kivilinna .alg = "ctr(blowfish)", 204385b63e34SJussi Kivilinna .test = alg_test_skcipher, 204485b63e34SJussi Kivilinna .suite = { 204585b63e34SJussi Kivilinna .cipher = { 204685b63e34SJussi Kivilinna .enc = { 204785b63e34SJussi Kivilinna .vecs = bf_ctr_enc_tv_template, 204885b63e34SJussi Kivilinna .count = BF_CTR_ENC_TEST_VECTORS 204985b63e34SJussi Kivilinna }, 205085b63e34SJussi Kivilinna .dec = { 205185b63e34SJussi Kivilinna .vecs = bf_ctr_dec_tv_template, 205285b63e34SJussi Kivilinna .count = BF_CTR_DEC_TEST_VECTORS 205385b63e34SJussi Kivilinna } 205485b63e34SJussi Kivilinna } 205585b63e34SJussi Kivilinna } 205685b63e34SJussi Kivilinna }, { 20570840605eSJussi Kivilinna .alg = "ctr(camellia)", 20580840605eSJussi Kivilinna .test = alg_test_skcipher, 20590840605eSJussi Kivilinna .suite = { 20600840605eSJussi Kivilinna .cipher = { 20610840605eSJussi Kivilinna .enc = { 20620840605eSJussi Kivilinna .vecs = camellia_ctr_enc_tv_template, 20630840605eSJussi Kivilinna .count = CAMELLIA_CTR_ENC_TEST_VECTORS 20640840605eSJussi Kivilinna }, 20650840605eSJussi Kivilinna .dec = { 20660840605eSJussi Kivilinna .vecs = camellia_ctr_dec_tv_template, 20670840605eSJussi Kivilinna .count = CAMELLIA_CTR_DEC_TEST_VECTORS 20680840605eSJussi Kivilinna } 20690840605eSJussi Kivilinna } 20700840605eSJussi Kivilinna } 20710840605eSJussi Kivilinna }, { 2072a2c58260SJohannes Goetzfried .alg = "ctr(cast5)", 2073a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 2074a2c58260SJohannes Goetzfried .suite = { 2075a2c58260SJohannes Goetzfried .cipher = { 2076a2c58260SJohannes Goetzfried .enc = { 2077a2c58260SJohannes Goetzfried .vecs = cast5_ctr_enc_tv_template, 2078a2c58260SJohannes Goetzfried .count = CAST5_CTR_ENC_TEST_VECTORS 2079a2c58260SJohannes Goetzfried }, 2080a2c58260SJohannes Goetzfried .dec = { 2081a2c58260SJohannes Goetzfried .vecs = cast5_ctr_dec_tv_template, 2082a2c58260SJohannes Goetzfried .count = CAST5_CTR_DEC_TEST_VECTORS 2083a2c58260SJohannes Goetzfried } 2084a2c58260SJohannes Goetzfried } 2085a2c58260SJohannes Goetzfried } 2086a2c58260SJohannes Goetzfried }, { 20879d25917dSJussi Kivilinna .alg = "ctr(serpent)", 20889d25917dSJussi Kivilinna .test = alg_test_skcipher, 20899d25917dSJussi Kivilinna .suite = { 20909d25917dSJussi Kivilinna .cipher = { 20919d25917dSJussi Kivilinna .enc = { 20929d25917dSJussi Kivilinna .vecs = serpent_ctr_enc_tv_template, 20939d25917dSJussi Kivilinna .count = SERPENT_CTR_ENC_TEST_VECTORS 20949d25917dSJussi Kivilinna }, 20959d25917dSJussi Kivilinna .dec = { 20969d25917dSJussi Kivilinna .vecs = serpent_ctr_dec_tv_template, 20979d25917dSJussi Kivilinna .count = SERPENT_CTR_DEC_TEST_VECTORS 20989d25917dSJussi Kivilinna } 20999d25917dSJussi Kivilinna } 21009d25917dSJussi Kivilinna } 21019d25917dSJussi Kivilinna }, { 2102573da620SJussi Kivilinna .alg = "ctr(twofish)", 2103573da620SJussi Kivilinna .test = alg_test_skcipher, 2104573da620SJussi Kivilinna .suite = { 2105573da620SJussi Kivilinna .cipher = { 2106573da620SJussi Kivilinna .enc = { 2107573da620SJussi Kivilinna .vecs = tf_ctr_enc_tv_template, 2108573da620SJussi Kivilinna .count = TF_CTR_ENC_TEST_VECTORS 2109573da620SJussi Kivilinna }, 2110573da620SJussi Kivilinna .dec = { 2111573da620SJussi Kivilinna .vecs = tf_ctr_dec_tv_template, 2112573da620SJussi Kivilinna .count = TF_CTR_DEC_TEST_VECTORS 2113573da620SJussi Kivilinna } 2114573da620SJussi Kivilinna } 2115573da620SJussi Kivilinna } 2116573da620SJussi Kivilinna }, { 2117da7f033dSHerbert Xu .alg = "cts(cbc(aes))", 21181aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2119da7f033dSHerbert Xu .suite = { 2120da7f033dSHerbert Xu .cipher = { 2121da7f033dSHerbert Xu .enc = { 2122da7f033dSHerbert Xu .vecs = cts_mode_enc_tv_template, 2123da7f033dSHerbert Xu .count = CTS_MODE_ENC_TEST_VECTORS 2124da7f033dSHerbert Xu }, 2125da7f033dSHerbert Xu .dec = { 2126da7f033dSHerbert Xu .vecs = cts_mode_dec_tv_template, 2127da7f033dSHerbert Xu .count = CTS_MODE_DEC_TEST_VECTORS 2128da7f033dSHerbert Xu } 2129da7f033dSHerbert Xu } 2130da7f033dSHerbert Xu } 2131da7f033dSHerbert Xu }, { 2132da7f033dSHerbert Xu .alg = "deflate", 2133da7f033dSHerbert Xu .test = alg_test_comp, 2134da7f033dSHerbert Xu .suite = { 2135da7f033dSHerbert Xu .comp = { 2136da7f033dSHerbert Xu .comp = { 2137da7f033dSHerbert Xu .vecs = deflate_comp_tv_template, 2138da7f033dSHerbert Xu .count = DEFLATE_COMP_TEST_VECTORS 2139da7f033dSHerbert Xu }, 2140da7f033dSHerbert Xu .decomp = { 2141da7f033dSHerbert Xu .vecs = deflate_decomp_tv_template, 2142da7f033dSHerbert Xu .count = DEFLATE_DECOMP_TEST_VECTORS 2143da7f033dSHerbert Xu } 2144da7f033dSHerbert Xu } 2145da7f033dSHerbert Xu } 2146da7f033dSHerbert Xu }, { 2147863b557aSYouquan, Song .alg = "ecb(__aes-aesni)", 2148863b557aSYouquan, Song .test = alg_test_null, 21496c79294fSMilan Broz .fips_allowed = 1, 2150863b557aSYouquan, Song .suite = { 2151863b557aSYouquan, Song .cipher = { 2152863b557aSYouquan, Song .enc = { 2153863b557aSYouquan, Song .vecs = NULL, 2154863b557aSYouquan, Song .count = 0 2155863b557aSYouquan, Song }, 2156863b557aSYouquan, Song .dec = { 2157863b557aSYouquan, Song .vecs = NULL, 2158863b557aSYouquan, Song .count = 0 2159863b557aSYouquan, Song } 2160863b557aSYouquan, Song } 2161863b557aSYouquan, Song } 2162863b557aSYouquan, Song }, { 2163da7f033dSHerbert Xu .alg = "ecb(aes)", 21641aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2165a1915d51SJarod Wilson .fips_allowed = 1, 2166da7f033dSHerbert Xu .suite = { 2167da7f033dSHerbert Xu .cipher = { 2168da7f033dSHerbert Xu .enc = { 2169da7f033dSHerbert Xu .vecs = aes_enc_tv_template, 2170da7f033dSHerbert Xu .count = AES_ENC_TEST_VECTORS 2171da7f033dSHerbert Xu }, 2172da7f033dSHerbert Xu .dec = { 2173da7f033dSHerbert Xu .vecs = aes_dec_tv_template, 2174da7f033dSHerbert Xu .count = AES_DEC_TEST_VECTORS 2175da7f033dSHerbert Xu } 2176da7f033dSHerbert Xu } 2177da7f033dSHerbert Xu } 2178da7f033dSHerbert Xu }, { 2179da7f033dSHerbert Xu .alg = "ecb(anubis)", 21801aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2181da7f033dSHerbert Xu .suite = { 2182da7f033dSHerbert Xu .cipher = { 2183da7f033dSHerbert Xu .enc = { 2184da7f033dSHerbert Xu .vecs = anubis_enc_tv_template, 2185da7f033dSHerbert Xu .count = ANUBIS_ENC_TEST_VECTORS 2186da7f033dSHerbert Xu }, 2187da7f033dSHerbert Xu .dec = { 2188da7f033dSHerbert Xu .vecs = anubis_dec_tv_template, 2189da7f033dSHerbert Xu .count = ANUBIS_DEC_TEST_VECTORS 2190da7f033dSHerbert Xu } 2191da7f033dSHerbert Xu } 2192da7f033dSHerbert Xu } 2193da7f033dSHerbert Xu }, { 2194da7f033dSHerbert Xu .alg = "ecb(arc4)", 21951aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2196da7f033dSHerbert Xu .suite = { 2197da7f033dSHerbert Xu .cipher = { 2198da7f033dSHerbert Xu .enc = { 2199da7f033dSHerbert Xu .vecs = arc4_enc_tv_template, 2200da7f033dSHerbert Xu .count = ARC4_ENC_TEST_VECTORS 2201da7f033dSHerbert Xu }, 2202da7f033dSHerbert Xu .dec = { 2203da7f033dSHerbert Xu .vecs = arc4_dec_tv_template, 2204da7f033dSHerbert Xu .count = ARC4_DEC_TEST_VECTORS 2205da7f033dSHerbert Xu } 2206da7f033dSHerbert Xu } 2207da7f033dSHerbert Xu } 2208da7f033dSHerbert Xu }, { 2209da7f033dSHerbert Xu .alg = "ecb(blowfish)", 22101aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2211da7f033dSHerbert Xu .suite = { 2212da7f033dSHerbert Xu .cipher = { 2213da7f033dSHerbert Xu .enc = { 2214da7f033dSHerbert Xu .vecs = bf_enc_tv_template, 2215da7f033dSHerbert Xu .count = BF_ENC_TEST_VECTORS 2216da7f033dSHerbert Xu }, 2217da7f033dSHerbert Xu .dec = { 2218da7f033dSHerbert Xu .vecs = bf_dec_tv_template, 2219da7f033dSHerbert Xu .count = BF_DEC_TEST_VECTORS 2220da7f033dSHerbert Xu } 2221da7f033dSHerbert Xu } 2222da7f033dSHerbert Xu } 2223da7f033dSHerbert Xu }, { 2224da7f033dSHerbert Xu .alg = "ecb(camellia)", 22251aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2226da7f033dSHerbert Xu .suite = { 2227da7f033dSHerbert Xu .cipher = { 2228da7f033dSHerbert Xu .enc = { 2229da7f033dSHerbert Xu .vecs = camellia_enc_tv_template, 2230da7f033dSHerbert Xu .count = CAMELLIA_ENC_TEST_VECTORS 2231da7f033dSHerbert Xu }, 2232da7f033dSHerbert Xu .dec = { 2233da7f033dSHerbert Xu .vecs = camellia_dec_tv_template, 2234da7f033dSHerbert Xu .count = CAMELLIA_DEC_TEST_VECTORS 2235da7f033dSHerbert Xu } 2236da7f033dSHerbert Xu } 2237da7f033dSHerbert Xu } 2238da7f033dSHerbert Xu }, { 2239da7f033dSHerbert Xu .alg = "ecb(cast5)", 22401aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2241da7f033dSHerbert Xu .suite = { 2242da7f033dSHerbert Xu .cipher = { 2243da7f033dSHerbert Xu .enc = { 2244da7f033dSHerbert Xu .vecs = cast5_enc_tv_template, 2245da7f033dSHerbert Xu .count = CAST5_ENC_TEST_VECTORS 2246da7f033dSHerbert Xu }, 2247da7f033dSHerbert Xu .dec = { 2248da7f033dSHerbert Xu .vecs = cast5_dec_tv_template, 2249da7f033dSHerbert Xu .count = CAST5_DEC_TEST_VECTORS 2250da7f033dSHerbert Xu } 2251da7f033dSHerbert Xu } 2252da7f033dSHerbert Xu } 2253da7f033dSHerbert Xu }, { 2254da7f033dSHerbert Xu .alg = "ecb(cast6)", 22551aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2256da7f033dSHerbert Xu .suite = { 2257da7f033dSHerbert Xu .cipher = { 2258da7f033dSHerbert Xu .enc = { 2259da7f033dSHerbert Xu .vecs = cast6_enc_tv_template, 2260da7f033dSHerbert Xu .count = CAST6_ENC_TEST_VECTORS 2261da7f033dSHerbert Xu }, 2262da7f033dSHerbert Xu .dec = { 2263da7f033dSHerbert Xu .vecs = cast6_dec_tv_template, 2264da7f033dSHerbert Xu .count = CAST6_DEC_TEST_VECTORS 2265da7f033dSHerbert Xu } 2266da7f033dSHerbert Xu } 2267da7f033dSHerbert Xu } 2268da7f033dSHerbert Xu }, { 2269da7f033dSHerbert Xu .alg = "ecb(des)", 22701aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2271a1915d51SJarod Wilson .fips_allowed = 1, 2272da7f033dSHerbert Xu .suite = { 2273da7f033dSHerbert Xu .cipher = { 2274da7f033dSHerbert Xu .enc = { 2275da7f033dSHerbert Xu .vecs = des_enc_tv_template, 2276da7f033dSHerbert Xu .count = DES_ENC_TEST_VECTORS 2277da7f033dSHerbert Xu }, 2278da7f033dSHerbert Xu .dec = { 2279da7f033dSHerbert Xu .vecs = des_dec_tv_template, 2280da7f033dSHerbert Xu .count = DES_DEC_TEST_VECTORS 2281da7f033dSHerbert Xu } 2282da7f033dSHerbert Xu } 2283da7f033dSHerbert Xu } 2284da7f033dSHerbert Xu }, { 2285da7f033dSHerbert Xu .alg = "ecb(des3_ede)", 22861aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2287a1915d51SJarod Wilson .fips_allowed = 1, 2288da7f033dSHerbert Xu .suite = { 2289da7f033dSHerbert Xu .cipher = { 2290da7f033dSHerbert Xu .enc = { 2291da7f033dSHerbert Xu .vecs = des3_ede_enc_tv_template, 2292da7f033dSHerbert Xu .count = DES3_EDE_ENC_TEST_VECTORS 2293da7f033dSHerbert Xu }, 2294da7f033dSHerbert Xu .dec = { 2295da7f033dSHerbert Xu .vecs = des3_ede_dec_tv_template, 2296da7f033dSHerbert Xu .count = DES3_EDE_DEC_TEST_VECTORS 2297da7f033dSHerbert Xu } 2298da7f033dSHerbert Xu } 2299da7f033dSHerbert Xu } 2300da7f033dSHerbert Xu }, { 2301da7f033dSHerbert Xu .alg = "ecb(khazad)", 23021aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2303da7f033dSHerbert Xu .suite = { 2304da7f033dSHerbert Xu .cipher = { 2305da7f033dSHerbert Xu .enc = { 2306da7f033dSHerbert Xu .vecs = khazad_enc_tv_template, 2307da7f033dSHerbert Xu .count = KHAZAD_ENC_TEST_VECTORS 2308da7f033dSHerbert Xu }, 2309da7f033dSHerbert Xu .dec = { 2310da7f033dSHerbert Xu .vecs = khazad_dec_tv_template, 2311da7f033dSHerbert Xu .count = KHAZAD_DEC_TEST_VECTORS 2312da7f033dSHerbert Xu } 2313da7f033dSHerbert Xu } 2314da7f033dSHerbert Xu } 2315da7f033dSHerbert Xu }, { 2316da7f033dSHerbert Xu .alg = "ecb(seed)", 23171aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2318da7f033dSHerbert Xu .suite = { 2319da7f033dSHerbert Xu .cipher = { 2320da7f033dSHerbert Xu .enc = { 2321da7f033dSHerbert Xu .vecs = seed_enc_tv_template, 2322da7f033dSHerbert Xu .count = SEED_ENC_TEST_VECTORS 2323da7f033dSHerbert Xu }, 2324da7f033dSHerbert Xu .dec = { 2325da7f033dSHerbert Xu .vecs = seed_dec_tv_template, 2326da7f033dSHerbert Xu .count = SEED_DEC_TEST_VECTORS 2327da7f033dSHerbert Xu } 2328da7f033dSHerbert Xu } 2329da7f033dSHerbert Xu } 2330da7f033dSHerbert Xu }, { 2331da7f033dSHerbert Xu .alg = "ecb(serpent)", 23321aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2333da7f033dSHerbert Xu .suite = { 2334da7f033dSHerbert Xu .cipher = { 2335da7f033dSHerbert Xu .enc = { 2336da7f033dSHerbert Xu .vecs = serpent_enc_tv_template, 2337da7f033dSHerbert Xu .count = SERPENT_ENC_TEST_VECTORS 2338da7f033dSHerbert Xu }, 2339da7f033dSHerbert Xu .dec = { 2340da7f033dSHerbert Xu .vecs = serpent_dec_tv_template, 2341da7f033dSHerbert Xu .count = SERPENT_DEC_TEST_VECTORS 2342da7f033dSHerbert Xu } 2343da7f033dSHerbert Xu } 2344da7f033dSHerbert Xu } 2345da7f033dSHerbert Xu }, { 2346da7f033dSHerbert Xu .alg = "ecb(tea)", 23471aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2348da7f033dSHerbert Xu .suite = { 2349da7f033dSHerbert Xu .cipher = { 2350da7f033dSHerbert Xu .enc = { 2351da7f033dSHerbert Xu .vecs = tea_enc_tv_template, 2352da7f033dSHerbert Xu .count = TEA_ENC_TEST_VECTORS 2353da7f033dSHerbert Xu }, 2354da7f033dSHerbert Xu .dec = { 2355da7f033dSHerbert Xu .vecs = tea_dec_tv_template, 2356da7f033dSHerbert Xu .count = TEA_DEC_TEST_VECTORS 2357da7f033dSHerbert Xu } 2358da7f033dSHerbert Xu } 2359da7f033dSHerbert Xu } 2360da7f033dSHerbert Xu }, { 2361da7f033dSHerbert Xu .alg = "ecb(tnepres)", 23621aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2363da7f033dSHerbert Xu .suite = { 2364da7f033dSHerbert Xu .cipher = { 2365da7f033dSHerbert Xu .enc = { 2366da7f033dSHerbert Xu .vecs = tnepres_enc_tv_template, 2367da7f033dSHerbert Xu .count = TNEPRES_ENC_TEST_VECTORS 2368da7f033dSHerbert Xu }, 2369da7f033dSHerbert Xu .dec = { 2370da7f033dSHerbert Xu .vecs = tnepres_dec_tv_template, 2371da7f033dSHerbert Xu .count = TNEPRES_DEC_TEST_VECTORS 2372da7f033dSHerbert Xu } 2373da7f033dSHerbert Xu } 2374da7f033dSHerbert Xu } 2375da7f033dSHerbert Xu }, { 2376da7f033dSHerbert Xu .alg = "ecb(twofish)", 23771aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2378da7f033dSHerbert Xu .suite = { 2379da7f033dSHerbert Xu .cipher = { 2380da7f033dSHerbert Xu .enc = { 2381da7f033dSHerbert Xu .vecs = tf_enc_tv_template, 2382da7f033dSHerbert Xu .count = TF_ENC_TEST_VECTORS 2383da7f033dSHerbert Xu }, 2384da7f033dSHerbert Xu .dec = { 2385da7f033dSHerbert Xu .vecs = tf_dec_tv_template, 2386da7f033dSHerbert Xu .count = TF_DEC_TEST_VECTORS 2387da7f033dSHerbert Xu } 2388da7f033dSHerbert Xu } 2389da7f033dSHerbert Xu } 2390da7f033dSHerbert Xu }, { 2391da7f033dSHerbert Xu .alg = "ecb(xeta)", 23921aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2393da7f033dSHerbert Xu .suite = { 2394da7f033dSHerbert Xu .cipher = { 2395da7f033dSHerbert Xu .enc = { 2396da7f033dSHerbert Xu .vecs = xeta_enc_tv_template, 2397da7f033dSHerbert Xu .count = XETA_ENC_TEST_VECTORS 2398da7f033dSHerbert Xu }, 2399da7f033dSHerbert Xu .dec = { 2400da7f033dSHerbert Xu .vecs = xeta_dec_tv_template, 2401da7f033dSHerbert Xu .count = XETA_DEC_TEST_VECTORS 2402da7f033dSHerbert Xu } 2403da7f033dSHerbert Xu } 2404da7f033dSHerbert Xu } 2405da7f033dSHerbert Xu }, { 2406da7f033dSHerbert Xu .alg = "ecb(xtea)", 24071aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2408da7f033dSHerbert Xu .suite = { 2409da7f033dSHerbert Xu .cipher = { 2410da7f033dSHerbert Xu .enc = { 2411da7f033dSHerbert Xu .vecs = xtea_enc_tv_template, 2412da7f033dSHerbert Xu .count = XTEA_ENC_TEST_VECTORS 2413da7f033dSHerbert Xu }, 2414da7f033dSHerbert Xu .dec = { 2415da7f033dSHerbert Xu .vecs = xtea_dec_tv_template, 2416da7f033dSHerbert Xu .count = XTEA_DEC_TEST_VECTORS 2417da7f033dSHerbert Xu } 2418da7f033dSHerbert Xu } 2419da7f033dSHerbert Xu } 2420da7f033dSHerbert Xu }, { 2421da7f033dSHerbert Xu .alg = "gcm(aes)", 2422da7f033dSHerbert Xu .test = alg_test_aead, 2423a1915d51SJarod Wilson .fips_allowed = 1, 2424da7f033dSHerbert Xu .suite = { 2425da7f033dSHerbert Xu .aead = { 2426da7f033dSHerbert Xu .enc = { 2427da7f033dSHerbert Xu .vecs = aes_gcm_enc_tv_template, 2428da7f033dSHerbert Xu .count = AES_GCM_ENC_TEST_VECTORS 2429da7f033dSHerbert Xu }, 2430da7f033dSHerbert Xu .dec = { 2431da7f033dSHerbert Xu .vecs = aes_gcm_dec_tv_template, 2432da7f033dSHerbert Xu .count = AES_GCM_DEC_TEST_VECTORS 2433da7f033dSHerbert Xu } 2434da7f033dSHerbert Xu } 2435da7f033dSHerbert Xu } 2436da7f033dSHerbert Xu }, { 2437507069c9SYouquan, Song .alg = "ghash", 2438507069c9SYouquan, Song .test = alg_test_hash, 243918c0ebd2SJarod Wilson .fips_allowed = 1, 2440507069c9SYouquan, Song .suite = { 2441507069c9SYouquan, Song .hash = { 2442507069c9SYouquan, Song .vecs = ghash_tv_template, 2443507069c9SYouquan, Song .count = GHASH_TEST_VECTORS 2444507069c9SYouquan, Song } 2445507069c9SYouquan, Song } 2446507069c9SYouquan, Song }, { 2447a482b081SSonic Zhang .alg = "hmac(crc32)", 2448a482b081SSonic Zhang .test = alg_test_hash, 2449a482b081SSonic Zhang .suite = { 2450a482b081SSonic Zhang .hash = { 2451a482b081SSonic Zhang .vecs = bfin_crc_tv_template, 2452a482b081SSonic Zhang .count = BFIN_CRC_TEST_VECTORS 2453a482b081SSonic Zhang } 2454a482b081SSonic Zhang } 2455a482b081SSonic Zhang }, { 2456da7f033dSHerbert Xu .alg = "hmac(md5)", 2457da7f033dSHerbert Xu .test = alg_test_hash, 2458da7f033dSHerbert Xu .suite = { 2459da7f033dSHerbert Xu .hash = { 2460da7f033dSHerbert Xu .vecs = hmac_md5_tv_template, 2461da7f033dSHerbert Xu .count = HMAC_MD5_TEST_VECTORS 2462da7f033dSHerbert Xu } 2463da7f033dSHerbert Xu } 2464da7f033dSHerbert Xu }, { 2465da7f033dSHerbert Xu .alg = "hmac(rmd128)", 2466da7f033dSHerbert Xu .test = alg_test_hash, 2467da7f033dSHerbert Xu .suite = { 2468da7f033dSHerbert Xu .hash = { 2469da7f033dSHerbert Xu .vecs = hmac_rmd128_tv_template, 2470da7f033dSHerbert Xu .count = HMAC_RMD128_TEST_VECTORS 2471da7f033dSHerbert Xu } 2472da7f033dSHerbert Xu } 2473da7f033dSHerbert Xu }, { 2474da7f033dSHerbert Xu .alg = "hmac(rmd160)", 2475da7f033dSHerbert Xu .test = alg_test_hash, 2476da7f033dSHerbert Xu .suite = { 2477da7f033dSHerbert Xu .hash = { 2478da7f033dSHerbert Xu .vecs = hmac_rmd160_tv_template, 2479da7f033dSHerbert Xu .count = HMAC_RMD160_TEST_VECTORS 2480da7f033dSHerbert Xu } 2481da7f033dSHerbert Xu } 2482da7f033dSHerbert Xu }, { 2483da7f033dSHerbert Xu .alg = "hmac(sha1)", 2484da7f033dSHerbert Xu .test = alg_test_hash, 2485a1915d51SJarod Wilson .fips_allowed = 1, 2486da7f033dSHerbert Xu .suite = { 2487da7f033dSHerbert Xu .hash = { 2488da7f033dSHerbert Xu .vecs = hmac_sha1_tv_template, 2489da7f033dSHerbert Xu .count = HMAC_SHA1_TEST_VECTORS 2490da7f033dSHerbert Xu } 2491da7f033dSHerbert Xu } 2492da7f033dSHerbert Xu }, { 2493da7f033dSHerbert Xu .alg = "hmac(sha224)", 2494da7f033dSHerbert Xu .test = alg_test_hash, 2495a1915d51SJarod Wilson .fips_allowed = 1, 2496da7f033dSHerbert Xu .suite = { 2497da7f033dSHerbert Xu .hash = { 2498da7f033dSHerbert Xu .vecs = hmac_sha224_tv_template, 2499da7f033dSHerbert Xu .count = HMAC_SHA224_TEST_VECTORS 2500da7f033dSHerbert Xu } 2501da7f033dSHerbert Xu } 2502da7f033dSHerbert Xu }, { 2503da7f033dSHerbert Xu .alg = "hmac(sha256)", 2504da7f033dSHerbert Xu .test = alg_test_hash, 2505a1915d51SJarod Wilson .fips_allowed = 1, 2506da7f033dSHerbert Xu .suite = { 2507da7f033dSHerbert Xu .hash = { 2508da7f033dSHerbert Xu .vecs = hmac_sha256_tv_template, 2509da7f033dSHerbert Xu .count = HMAC_SHA256_TEST_VECTORS 2510da7f033dSHerbert Xu } 2511da7f033dSHerbert Xu } 2512da7f033dSHerbert Xu }, { 2513da7f033dSHerbert Xu .alg = "hmac(sha384)", 2514da7f033dSHerbert Xu .test = alg_test_hash, 2515a1915d51SJarod Wilson .fips_allowed = 1, 2516da7f033dSHerbert Xu .suite = { 2517da7f033dSHerbert Xu .hash = { 2518da7f033dSHerbert Xu .vecs = hmac_sha384_tv_template, 2519da7f033dSHerbert Xu .count = HMAC_SHA384_TEST_VECTORS 2520da7f033dSHerbert Xu } 2521da7f033dSHerbert Xu } 2522da7f033dSHerbert Xu }, { 2523da7f033dSHerbert Xu .alg = "hmac(sha512)", 2524da7f033dSHerbert Xu .test = alg_test_hash, 2525a1915d51SJarod Wilson .fips_allowed = 1, 2526da7f033dSHerbert Xu .suite = { 2527da7f033dSHerbert Xu .hash = { 2528da7f033dSHerbert Xu .vecs = hmac_sha512_tv_template, 2529da7f033dSHerbert Xu .count = HMAC_SHA512_TEST_VECTORS 2530da7f033dSHerbert Xu } 2531da7f033dSHerbert Xu } 2532da7f033dSHerbert Xu }, { 2533da7f033dSHerbert Xu .alg = "lrw(aes)", 25341aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2535da7f033dSHerbert Xu .suite = { 2536da7f033dSHerbert Xu .cipher = { 2537da7f033dSHerbert Xu .enc = { 2538da7f033dSHerbert Xu .vecs = aes_lrw_enc_tv_template, 2539da7f033dSHerbert Xu .count = AES_LRW_ENC_TEST_VECTORS 2540da7f033dSHerbert Xu }, 2541da7f033dSHerbert Xu .dec = { 2542da7f033dSHerbert Xu .vecs = aes_lrw_dec_tv_template, 2543da7f033dSHerbert Xu .count = AES_LRW_DEC_TEST_VECTORS 2544da7f033dSHerbert Xu } 2545da7f033dSHerbert Xu } 2546da7f033dSHerbert Xu } 2547da7f033dSHerbert Xu }, { 25480840605eSJussi Kivilinna .alg = "lrw(camellia)", 25490840605eSJussi Kivilinna .test = alg_test_skcipher, 25500840605eSJussi Kivilinna .suite = { 25510840605eSJussi Kivilinna .cipher = { 25520840605eSJussi Kivilinna .enc = { 25530840605eSJussi Kivilinna .vecs = camellia_lrw_enc_tv_template, 25540840605eSJussi Kivilinna .count = CAMELLIA_LRW_ENC_TEST_VECTORS 25550840605eSJussi Kivilinna }, 25560840605eSJussi Kivilinna .dec = { 25570840605eSJussi Kivilinna .vecs = camellia_lrw_dec_tv_template, 25580840605eSJussi Kivilinna .count = CAMELLIA_LRW_DEC_TEST_VECTORS 25590840605eSJussi Kivilinna } 25600840605eSJussi Kivilinna } 25610840605eSJussi Kivilinna } 25620840605eSJussi Kivilinna }, { 2563d7bfc0faSJussi Kivilinna .alg = "lrw(serpent)", 2564d7bfc0faSJussi Kivilinna .test = alg_test_skcipher, 2565d7bfc0faSJussi Kivilinna .suite = { 2566d7bfc0faSJussi Kivilinna .cipher = { 2567d7bfc0faSJussi Kivilinna .enc = { 2568d7bfc0faSJussi Kivilinna .vecs = serpent_lrw_enc_tv_template, 2569d7bfc0faSJussi Kivilinna .count = SERPENT_LRW_ENC_TEST_VECTORS 2570d7bfc0faSJussi Kivilinna }, 2571d7bfc0faSJussi Kivilinna .dec = { 2572d7bfc0faSJussi Kivilinna .vecs = serpent_lrw_dec_tv_template, 2573d7bfc0faSJussi Kivilinna .count = SERPENT_LRW_DEC_TEST_VECTORS 2574d7bfc0faSJussi Kivilinna } 2575d7bfc0faSJussi Kivilinna } 2576d7bfc0faSJussi Kivilinna } 2577d7bfc0faSJussi Kivilinna }, { 25780b2a1551SJussi Kivilinna .alg = "lrw(twofish)", 25790b2a1551SJussi Kivilinna .test = alg_test_skcipher, 25800b2a1551SJussi Kivilinna .suite = { 25810b2a1551SJussi Kivilinna .cipher = { 25820b2a1551SJussi Kivilinna .enc = { 25830b2a1551SJussi Kivilinna .vecs = tf_lrw_enc_tv_template, 25840b2a1551SJussi Kivilinna .count = TF_LRW_ENC_TEST_VECTORS 25850b2a1551SJussi Kivilinna }, 25860b2a1551SJussi Kivilinna .dec = { 25870b2a1551SJussi Kivilinna .vecs = tf_lrw_dec_tv_template, 25880b2a1551SJussi Kivilinna .count = TF_LRW_DEC_TEST_VECTORS 25890b2a1551SJussi Kivilinna } 25900b2a1551SJussi Kivilinna } 25910b2a1551SJussi Kivilinna } 25920b2a1551SJussi Kivilinna }, { 2593da7f033dSHerbert Xu .alg = "lzo", 2594da7f033dSHerbert Xu .test = alg_test_comp, 2595da7f033dSHerbert Xu .suite = { 2596da7f033dSHerbert Xu .comp = { 2597da7f033dSHerbert Xu .comp = { 2598da7f033dSHerbert Xu .vecs = lzo_comp_tv_template, 2599da7f033dSHerbert Xu .count = LZO_COMP_TEST_VECTORS 2600da7f033dSHerbert Xu }, 2601da7f033dSHerbert Xu .decomp = { 2602da7f033dSHerbert Xu .vecs = lzo_decomp_tv_template, 2603da7f033dSHerbert Xu .count = LZO_DECOMP_TEST_VECTORS 2604da7f033dSHerbert Xu } 2605da7f033dSHerbert Xu } 2606da7f033dSHerbert Xu } 2607da7f033dSHerbert Xu }, { 2608da7f033dSHerbert Xu .alg = "md4", 2609da7f033dSHerbert Xu .test = alg_test_hash, 2610da7f033dSHerbert Xu .suite = { 2611da7f033dSHerbert Xu .hash = { 2612da7f033dSHerbert Xu .vecs = md4_tv_template, 2613da7f033dSHerbert Xu .count = MD4_TEST_VECTORS 2614da7f033dSHerbert Xu } 2615da7f033dSHerbert Xu } 2616da7f033dSHerbert Xu }, { 2617da7f033dSHerbert Xu .alg = "md5", 2618da7f033dSHerbert Xu .test = alg_test_hash, 2619da7f033dSHerbert Xu .suite = { 2620da7f033dSHerbert Xu .hash = { 2621da7f033dSHerbert Xu .vecs = md5_tv_template, 2622da7f033dSHerbert Xu .count = MD5_TEST_VECTORS 2623da7f033dSHerbert Xu } 2624da7f033dSHerbert Xu } 2625da7f033dSHerbert Xu }, { 2626da7f033dSHerbert Xu .alg = "michael_mic", 2627da7f033dSHerbert Xu .test = alg_test_hash, 2628da7f033dSHerbert Xu .suite = { 2629da7f033dSHerbert Xu .hash = { 2630da7f033dSHerbert Xu .vecs = michael_mic_tv_template, 2631da7f033dSHerbert Xu .count = MICHAEL_MIC_TEST_VECTORS 2632da7f033dSHerbert Xu } 2633da7f033dSHerbert Xu } 2634da7f033dSHerbert Xu }, { 2635ba0e14acSPuneet Saxena .alg = "ofb(aes)", 2636ba0e14acSPuneet Saxena .test = alg_test_skcipher, 2637ba0e14acSPuneet Saxena .fips_allowed = 1, 2638ba0e14acSPuneet Saxena .suite = { 2639ba0e14acSPuneet Saxena .cipher = { 2640ba0e14acSPuneet Saxena .enc = { 2641ba0e14acSPuneet Saxena .vecs = aes_ofb_enc_tv_template, 2642ba0e14acSPuneet Saxena .count = AES_OFB_ENC_TEST_VECTORS 2643ba0e14acSPuneet Saxena }, 2644ba0e14acSPuneet Saxena .dec = { 2645ba0e14acSPuneet Saxena .vecs = aes_ofb_dec_tv_template, 2646ba0e14acSPuneet Saxena .count = AES_OFB_DEC_TEST_VECTORS 2647ba0e14acSPuneet Saxena } 2648ba0e14acSPuneet Saxena } 2649ba0e14acSPuneet Saxena } 2650ba0e14acSPuneet Saxena }, { 2651da7f033dSHerbert Xu .alg = "pcbc(fcrypt)", 26521aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2653da7f033dSHerbert Xu .suite = { 2654da7f033dSHerbert Xu .cipher = { 2655da7f033dSHerbert Xu .enc = { 2656da7f033dSHerbert Xu .vecs = fcrypt_pcbc_enc_tv_template, 2657da7f033dSHerbert Xu .count = FCRYPT_ENC_TEST_VECTORS 2658da7f033dSHerbert Xu }, 2659da7f033dSHerbert Xu .dec = { 2660da7f033dSHerbert Xu .vecs = fcrypt_pcbc_dec_tv_template, 2661da7f033dSHerbert Xu .count = FCRYPT_DEC_TEST_VECTORS 2662da7f033dSHerbert Xu } 2663da7f033dSHerbert Xu } 2664da7f033dSHerbert Xu } 2665da7f033dSHerbert Xu }, { 2666da7f033dSHerbert Xu .alg = "rfc3686(ctr(aes))", 26671aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2668a1915d51SJarod Wilson .fips_allowed = 1, 2669da7f033dSHerbert Xu .suite = { 2670da7f033dSHerbert Xu .cipher = { 2671da7f033dSHerbert Xu .enc = { 2672f7cb80f2SJarod Wilson .vecs = aes_ctr_rfc3686_enc_tv_template, 2673f7cb80f2SJarod Wilson .count = AES_CTR_3686_ENC_TEST_VECTORS 2674da7f033dSHerbert Xu }, 2675da7f033dSHerbert Xu .dec = { 2676f7cb80f2SJarod Wilson .vecs = aes_ctr_rfc3686_dec_tv_template, 2677f7cb80f2SJarod Wilson .count = AES_CTR_3686_DEC_TEST_VECTORS 2678da7f033dSHerbert Xu } 2679da7f033dSHerbert Xu } 2680da7f033dSHerbert Xu } 2681da7f033dSHerbert Xu }, { 268269435b94SAdrian Hoban .alg = "rfc4106(gcm(aes))", 268369435b94SAdrian Hoban .test = alg_test_aead, 268469435b94SAdrian Hoban .suite = { 268569435b94SAdrian Hoban .aead = { 268669435b94SAdrian Hoban .enc = { 268769435b94SAdrian Hoban .vecs = aes_gcm_rfc4106_enc_tv_template, 268869435b94SAdrian Hoban .count = AES_GCM_4106_ENC_TEST_VECTORS 268969435b94SAdrian Hoban }, 269069435b94SAdrian Hoban .dec = { 269169435b94SAdrian Hoban .vecs = aes_gcm_rfc4106_dec_tv_template, 269269435b94SAdrian Hoban .count = AES_GCM_4106_DEC_TEST_VECTORS 269369435b94SAdrian Hoban } 269469435b94SAdrian Hoban } 269569435b94SAdrian Hoban } 269669435b94SAdrian Hoban }, { 269769435b94SAdrian Hoban 269869435b94SAdrian Hoban 26995d667322SJarod Wilson .alg = "rfc4309(ccm(aes))", 27005d667322SJarod Wilson .test = alg_test_aead, 2701a1915d51SJarod Wilson .fips_allowed = 1, 27025d667322SJarod Wilson .suite = { 27035d667322SJarod Wilson .aead = { 27045d667322SJarod Wilson .enc = { 27055d667322SJarod Wilson .vecs = aes_ccm_rfc4309_enc_tv_template, 27065d667322SJarod Wilson .count = AES_CCM_4309_ENC_TEST_VECTORS 27075d667322SJarod Wilson }, 27085d667322SJarod Wilson .dec = { 27095d667322SJarod Wilson .vecs = aes_ccm_rfc4309_dec_tv_template, 27105d667322SJarod Wilson .count = AES_CCM_4309_DEC_TEST_VECTORS 27115d667322SJarod Wilson } 27125d667322SJarod Wilson } 27135d667322SJarod Wilson } 27145d667322SJarod Wilson }, { 2715da7f033dSHerbert Xu .alg = "rmd128", 2716da7f033dSHerbert Xu .test = alg_test_hash, 2717da7f033dSHerbert Xu .suite = { 2718da7f033dSHerbert Xu .hash = { 2719da7f033dSHerbert Xu .vecs = rmd128_tv_template, 2720da7f033dSHerbert Xu .count = RMD128_TEST_VECTORS 2721da7f033dSHerbert Xu } 2722da7f033dSHerbert Xu } 2723da7f033dSHerbert Xu }, { 2724da7f033dSHerbert Xu .alg = "rmd160", 2725da7f033dSHerbert Xu .test = alg_test_hash, 2726da7f033dSHerbert Xu .suite = { 2727da7f033dSHerbert Xu .hash = { 2728da7f033dSHerbert Xu .vecs = rmd160_tv_template, 2729da7f033dSHerbert Xu .count = RMD160_TEST_VECTORS 2730da7f033dSHerbert Xu } 2731da7f033dSHerbert Xu } 2732da7f033dSHerbert Xu }, { 2733da7f033dSHerbert Xu .alg = "rmd256", 2734da7f033dSHerbert Xu .test = alg_test_hash, 2735da7f033dSHerbert Xu .suite = { 2736da7f033dSHerbert Xu .hash = { 2737da7f033dSHerbert Xu .vecs = rmd256_tv_template, 2738da7f033dSHerbert Xu .count = RMD256_TEST_VECTORS 2739da7f033dSHerbert Xu } 2740da7f033dSHerbert Xu } 2741da7f033dSHerbert Xu }, { 2742da7f033dSHerbert Xu .alg = "rmd320", 2743da7f033dSHerbert Xu .test = alg_test_hash, 2744da7f033dSHerbert Xu .suite = { 2745da7f033dSHerbert Xu .hash = { 2746da7f033dSHerbert Xu .vecs = rmd320_tv_template, 2747da7f033dSHerbert Xu .count = RMD320_TEST_VECTORS 2748da7f033dSHerbert Xu } 2749da7f033dSHerbert Xu } 2750da7f033dSHerbert Xu }, { 2751da7f033dSHerbert Xu .alg = "salsa20", 27521aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2753da7f033dSHerbert Xu .suite = { 2754da7f033dSHerbert Xu .cipher = { 2755da7f033dSHerbert Xu .enc = { 2756da7f033dSHerbert Xu .vecs = salsa20_stream_enc_tv_template, 2757da7f033dSHerbert Xu .count = SALSA20_STREAM_ENC_TEST_VECTORS 2758da7f033dSHerbert Xu } 2759da7f033dSHerbert Xu } 2760da7f033dSHerbert Xu } 2761da7f033dSHerbert Xu }, { 2762da7f033dSHerbert Xu .alg = "sha1", 2763da7f033dSHerbert Xu .test = alg_test_hash, 2764a1915d51SJarod Wilson .fips_allowed = 1, 2765da7f033dSHerbert Xu .suite = { 2766da7f033dSHerbert Xu .hash = { 2767da7f033dSHerbert Xu .vecs = sha1_tv_template, 2768da7f033dSHerbert Xu .count = SHA1_TEST_VECTORS 2769da7f033dSHerbert Xu } 2770da7f033dSHerbert Xu } 2771da7f033dSHerbert Xu }, { 2772da7f033dSHerbert Xu .alg = "sha224", 2773da7f033dSHerbert Xu .test = alg_test_hash, 2774a1915d51SJarod Wilson .fips_allowed = 1, 2775da7f033dSHerbert Xu .suite = { 2776da7f033dSHerbert Xu .hash = { 2777da7f033dSHerbert Xu .vecs = sha224_tv_template, 2778da7f033dSHerbert Xu .count = SHA224_TEST_VECTORS 2779da7f033dSHerbert Xu } 2780da7f033dSHerbert Xu } 2781da7f033dSHerbert Xu }, { 2782da7f033dSHerbert Xu .alg = "sha256", 2783da7f033dSHerbert Xu .test = alg_test_hash, 2784a1915d51SJarod Wilson .fips_allowed = 1, 2785da7f033dSHerbert Xu .suite = { 2786da7f033dSHerbert Xu .hash = { 2787da7f033dSHerbert Xu .vecs = sha256_tv_template, 2788da7f033dSHerbert Xu .count = SHA256_TEST_VECTORS 2789da7f033dSHerbert Xu } 2790da7f033dSHerbert Xu } 2791da7f033dSHerbert Xu }, { 2792da7f033dSHerbert Xu .alg = "sha384", 2793da7f033dSHerbert Xu .test = alg_test_hash, 2794a1915d51SJarod Wilson .fips_allowed = 1, 2795da7f033dSHerbert Xu .suite = { 2796da7f033dSHerbert Xu .hash = { 2797da7f033dSHerbert Xu .vecs = sha384_tv_template, 2798da7f033dSHerbert Xu .count = SHA384_TEST_VECTORS 2799da7f033dSHerbert Xu } 2800da7f033dSHerbert Xu } 2801da7f033dSHerbert Xu }, { 2802da7f033dSHerbert Xu .alg = "sha512", 2803da7f033dSHerbert Xu .test = alg_test_hash, 2804a1915d51SJarod Wilson .fips_allowed = 1, 2805da7f033dSHerbert Xu .suite = { 2806da7f033dSHerbert Xu .hash = { 2807da7f033dSHerbert Xu .vecs = sha512_tv_template, 2808da7f033dSHerbert Xu .count = SHA512_TEST_VECTORS 2809da7f033dSHerbert Xu } 2810da7f033dSHerbert Xu } 2811da7f033dSHerbert Xu }, { 2812da7f033dSHerbert Xu .alg = "tgr128", 2813da7f033dSHerbert Xu .test = alg_test_hash, 2814da7f033dSHerbert Xu .suite = { 2815da7f033dSHerbert Xu .hash = { 2816da7f033dSHerbert Xu .vecs = tgr128_tv_template, 2817da7f033dSHerbert Xu .count = TGR128_TEST_VECTORS 2818da7f033dSHerbert Xu } 2819da7f033dSHerbert Xu } 2820da7f033dSHerbert Xu }, { 2821da7f033dSHerbert Xu .alg = "tgr160", 2822da7f033dSHerbert Xu .test = alg_test_hash, 2823da7f033dSHerbert Xu .suite = { 2824da7f033dSHerbert Xu .hash = { 2825da7f033dSHerbert Xu .vecs = tgr160_tv_template, 2826da7f033dSHerbert Xu .count = TGR160_TEST_VECTORS 2827da7f033dSHerbert Xu } 2828da7f033dSHerbert Xu } 2829da7f033dSHerbert Xu }, { 2830da7f033dSHerbert Xu .alg = "tgr192", 2831da7f033dSHerbert Xu .test = alg_test_hash, 2832da7f033dSHerbert Xu .suite = { 2833da7f033dSHerbert Xu .hash = { 2834da7f033dSHerbert Xu .vecs = tgr192_tv_template, 2835da7f033dSHerbert Xu .count = TGR192_TEST_VECTORS 2836da7f033dSHerbert Xu } 2837da7f033dSHerbert Xu } 2838da7f033dSHerbert Xu }, { 2839f1939f7cSShane Wang .alg = "vmac(aes)", 2840f1939f7cSShane Wang .test = alg_test_hash, 2841f1939f7cSShane Wang .suite = { 2842f1939f7cSShane Wang .hash = { 2843f1939f7cSShane Wang .vecs = aes_vmac128_tv_template, 2844f1939f7cSShane Wang .count = VMAC_AES_TEST_VECTORS 2845f1939f7cSShane Wang } 2846f1939f7cSShane Wang } 2847f1939f7cSShane Wang }, { 2848da7f033dSHerbert Xu .alg = "wp256", 2849da7f033dSHerbert Xu .test = alg_test_hash, 2850da7f033dSHerbert Xu .suite = { 2851da7f033dSHerbert Xu .hash = { 2852da7f033dSHerbert Xu .vecs = wp256_tv_template, 2853da7f033dSHerbert Xu .count = WP256_TEST_VECTORS 2854da7f033dSHerbert Xu } 2855da7f033dSHerbert Xu } 2856da7f033dSHerbert Xu }, { 2857da7f033dSHerbert Xu .alg = "wp384", 2858da7f033dSHerbert Xu .test = alg_test_hash, 2859da7f033dSHerbert Xu .suite = { 2860da7f033dSHerbert Xu .hash = { 2861da7f033dSHerbert Xu .vecs = wp384_tv_template, 2862da7f033dSHerbert Xu .count = WP384_TEST_VECTORS 2863da7f033dSHerbert Xu } 2864da7f033dSHerbert Xu } 2865da7f033dSHerbert Xu }, { 2866da7f033dSHerbert Xu .alg = "wp512", 2867da7f033dSHerbert Xu .test = alg_test_hash, 2868da7f033dSHerbert Xu .suite = { 2869da7f033dSHerbert Xu .hash = { 2870da7f033dSHerbert Xu .vecs = wp512_tv_template, 2871da7f033dSHerbert Xu .count = WP512_TEST_VECTORS 2872da7f033dSHerbert Xu } 2873da7f033dSHerbert Xu } 2874da7f033dSHerbert Xu }, { 2875da7f033dSHerbert Xu .alg = "xcbc(aes)", 2876da7f033dSHerbert Xu .test = alg_test_hash, 2877da7f033dSHerbert Xu .suite = { 2878da7f033dSHerbert Xu .hash = { 2879da7f033dSHerbert Xu .vecs = aes_xcbc128_tv_template, 2880da7f033dSHerbert Xu .count = XCBC_AES_TEST_VECTORS 2881da7f033dSHerbert Xu } 2882da7f033dSHerbert Xu } 2883da7f033dSHerbert Xu }, { 2884da7f033dSHerbert Xu .alg = "xts(aes)", 28851aa4ecd9SHerbert Xu .test = alg_test_skcipher, 28862918aa8dSJarod Wilson .fips_allowed = 1, 2887da7f033dSHerbert Xu .suite = { 2888da7f033dSHerbert Xu .cipher = { 2889da7f033dSHerbert Xu .enc = { 2890da7f033dSHerbert Xu .vecs = aes_xts_enc_tv_template, 2891da7f033dSHerbert Xu .count = AES_XTS_ENC_TEST_VECTORS 2892da7f033dSHerbert Xu }, 2893da7f033dSHerbert Xu .dec = { 2894da7f033dSHerbert Xu .vecs = aes_xts_dec_tv_template, 2895da7f033dSHerbert Xu .count = AES_XTS_DEC_TEST_VECTORS 2896da7f033dSHerbert Xu } 2897da7f033dSHerbert Xu } 2898da7f033dSHerbert Xu } 28990c01aed5SGeert Uytterhoeven }, { 29000840605eSJussi Kivilinna .alg = "xts(camellia)", 29010840605eSJussi Kivilinna .test = alg_test_skcipher, 29020840605eSJussi Kivilinna .suite = { 29030840605eSJussi Kivilinna .cipher = { 29040840605eSJussi Kivilinna .enc = { 29050840605eSJussi Kivilinna .vecs = camellia_xts_enc_tv_template, 29060840605eSJussi Kivilinna .count = CAMELLIA_XTS_ENC_TEST_VECTORS 29070840605eSJussi Kivilinna }, 29080840605eSJussi Kivilinna .dec = { 29090840605eSJussi Kivilinna .vecs = camellia_xts_dec_tv_template, 29100840605eSJussi Kivilinna .count = CAMELLIA_XTS_DEC_TEST_VECTORS 29110840605eSJussi Kivilinna } 29120840605eSJussi Kivilinna } 29130840605eSJussi Kivilinna } 29140840605eSJussi Kivilinna }, { 291518be20b9SJussi Kivilinna .alg = "xts(serpent)", 291618be20b9SJussi Kivilinna .test = alg_test_skcipher, 291718be20b9SJussi Kivilinna .suite = { 291818be20b9SJussi Kivilinna .cipher = { 291918be20b9SJussi Kivilinna .enc = { 292018be20b9SJussi Kivilinna .vecs = serpent_xts_enc_tv_template, 292118be20b9SJussi Kivilinna .count = SERPENT_XTS_ENC_TEST_VECTORS 292218be20b9SJussi Kivilinna }, 292318be20b9SJussi Kivilinna .dec = { 292418be20b9SJussi Kivilinna .vecs = serpent_xts_dec_tv_template, 292518be20b9SJussi Kivilinna .count = SERPENT_XTS_DEC_TEST_VECTORS 292618be20b9SJussi Kivilinna } 292718be20b9SJussi Kivilinna } 292818be20b9SJussi Kivilinna } 292918be20b9SJussi Kivilinna }, { 2930aed265b9SJussi Kivilinna .alg = "xts(twofish)", 2931aed265b9SJussi Kivilinna .test = alg_test_skcipher, 2932aed265b9SJussi Kivilinna .suite = { 2933aed265b9SJussi Kivilinna .cipher = { 2934aed265b9SJussi Kivilinna .enc = { 2935aed265b9SJussi Kivilinna .vecs = tf_xts_enc_tv_template, 2936aed265b9SJussi Kivilinna .count = TF_XTS_ENC_TEST_VECTORS 2937aed265b9SJussi Kivilinna }, 2938aed265b9SJussi Kivilinna .dec = { 2939aed265b9SJussi Kivilinna .vecs = tf_xts_dec_tv_template, 2940aed265b9SJussi Kivilinna .count = TF_XTS_DEC_TEST_VECTORS 2941aed265b9SJussi Kivilinna } 2942aed265b9SJussi Kivilinna } 2943aed265b9SJussi Kivilinna } 2944aed265b9SJussi Kivilinna }, { 29450c01aed5SGeert Uytterhoeven .alg = "zlib", 29460c01aed5SGeert Uytterhoeven .test = alg_test_pcomp, 29470c01aed5SGeert Uytterhoeven .suite = { 29480c01aed5SGeert Uytterhoeven .pcomp = { 29490c01aed5SGeert Uytterhoeven .comp = { 29500c01aed5SGeert Uytterhoeven .vecs = zlib_comp_tv_template, 29510c01aed5SGeert Uytterhoeven .count = ZLIB_COMP_TEST_VECTORS 29520c01aed5SGeert Uytterhoeven }, 29530c01aed5SGeert Uytterhoeven .decomp = { 29540c01aed5SGeert Uytterhoeven .vecs = zlib_decomp_tv_template, 29550c01aed5SGeert Uytterhoeven .count = ZLIB_DECOMP_TEST_VECTORS 29560c01aed5SGeert Uytterhoeven } 29570c01aed5SGeert Uytterhoeven } 29580c01aed5SGeert Uytterhoeven } 2959da7f033dSHerbert Xu } 2960da7f033dSHerbert Xu }; 2961da7f033dSHerbert Xu 29621aa4ecd9SHerbert Xu static int alg_find_test(const char *alg) 2963da7f033dSHerbert Xu { 2964da7f033dSHerbert Xu int start = 0; 2965da7f033dSHerbert Xu int end = ARRAY_SIZE(alg_test_descs); 2966da7f033dSHerbert Xu 2967da7f033dSHerbert Xu while (start < end) { 2968da7f033dSHerbert Xu int i = (start + end) / 2; 2969da7f033dSHerbert Xu int diff = strcmp(alg_test_descs[i].alg, alg); 2970da7f033dSHerbert Xu 2971da7f033dSHerbert Xu if (diff > 0) { 2972da7f033dSHerbert Xu end = i; 2973da7f033dSHerbert Xu continue; 2974da7f033dSHerbert Xu } 2975da7f033dSHerbert Xu 2976da7f033dSHerbert Xu if (diff < 0) { 2977da7f033dSHerbert Xu start = i + 1; 2978da7f033dSHerbert Xu continue; 2979da7f033dSHerbert Xu } 2980da7f033dSHerbert Xu 29811aa4ecd9SHerbert Xu return i; 2982da7f033dSHerbert Xu } 2983da7f033dSHerbert Xu 29841aa4ecd9SHerbert Xu return -1; 29851aa4ecd9SHerbert Xu } 29861aa4ecd9SHerbert Xu 29871aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 29881aa4ecd9SHerbert Xu { 29891aa4ecd9SHerbert Xu int i; 2990a68f6610SHerbert Xu int j; 2991d12d6b6dSNeil Horman int rc; 29921aa4ecd9SHerbert Xu 29931aa4ecd9SHerbert Xu if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) { 29941aa4ecd9SHerbert Xu char nalg[CRYPTO_MAX_ALG_NAME]; 29951aa4ecd9SHerbert Xu 29961aa4ecd9SHerbert Xu if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >= 29971aa4ecd9SHerbert Xu sizeof(nalg)) 29981aa4ecd9SHerbert Xu return -ENAMETOOLONG; 29991aa4ecd9SHerbert Xu 30001aa4ecd9SHerbert Xu i = alg_find_test(nalg); 30011aa4ecd9SHerbert Xu if (i < 0) 30021aa4ecd9SHerbert Xu goto notest; 30031aa4ecd9SHerbert Xu 3004a3bef3a3SJarod Wilson if (fips_enabled && !alg_test_descs[i].fips_allowed) 3005a3bef3a3SJarod Wilson goto non_fips_alg; 3006a3bef3a3SJarod Wilson 3007941fb328SJarod Wilson rc = alg_test_cipher(alg_test_descs + i, driver, type, mask); 3008941fb328SJarod Wilson goto test_done; 30091aa4ecd9SHerbert Xu } 30101aa4ecd9SHerbert Xu 30111aa4ecd9SHerbert Xu i = alg_find_test(alg); 3012a68f6610SHerbert Xu j = alg_find_test(driver); 3013a68f6610SHerbert Xu if (i < 0 && j < 0) 30141aa4ecd9SHerbert Xu goto notest; 30151aa4ecd9SHerbert Xu 3016a68f6610SHerbert Xu if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) || 3017a68f6610SHerbert Xu (j >= 0 && !alg_test_descs[j].fips_allowed))) 3018a3bef3a3SJarod Wilson goto non_fips_alg; 3019a3bef3a3SJarod Wilson 3020a68f6610SHerbert Xu rc = 0; 3021a68f6610SHerbert Xu if (i >= 0) 3022a68f6610SHerbert Xu rc |= alg_test_descs[i].test(alg_test_descs + i, driver, 30231aa4ecd9SHerbert Xu type, mask); 3024a68f6610SHerbert Xu if (j >= 0) 3025a68f6610SHerbert Xu rc |= alg_test_descs[j].test(alg_test_descs + j, driver, 3026a68f6610SHerbert Xu type, mask); 3027a68f6610SHerbert Xu 3028941fb328SJarod Wilson test_done: 3029d12d6b6dSNeil Horman if (fips_enabled && rc) 3030d12d6b6dSNeil Horman panic("%s: %s alg self test failed in fips mode!\n", driver, alg); 3031d12d6b6dSNeil Horman 303229ecd4abSJarod Wilson if (fips_enabled && !rc) 303329ecd4abSJarod Wilson printk(KERN_INFO "alg: self-tests for %s (%s) passed\n", 303429ecd4abSJarod Wilson driver, alg); 303529ecd4abSJarod Wilson 3036d12d6b6dSNeil Horman return rc; 30371aa4ecd9SHerbert Xu 30381aa4ecd9SHerbert Xu notest: 3039da7f033dSHerbert Xu printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver); 3040da7f033dSHerbert Xu return 0; 3041a3bef3a3SJarod Wilson non_fips_alg: 3042a3bef3a3SJarod Wilson return -EINVAL; 3043da7f033dSHerbert Xu } 30440b767f96SAlexander Shishkin 3045326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */ 30460b767f96SAlexander Shishkin 3047da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test); 3048