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 { 1537937c30d7SJussi Kivilinna .alg = "__cbc-serpent-sse2", 1538937c30d7SJussi Kivilinna .test = alg_test_null, 1539937c30d7SJussi Kivilinna .suite = { 1540937c30d7SJussi Kivilinna .cipher = { 1541937c30d7SJussi Kivilinna .enc = { 1542937c30d7SJussi Kivilinna .vecs = NULL, 1543937c30d7SJussi Kivilinna .count = 0 1544937c30d7SJussi Kivilinna }, 1545937c30d7SJussi Kivilinna .dec = { 1546937c30d7SJussi Kivilinna .vecs = NULL, 1547937c30d7SJussi Kivilinna .count = 0 1548937c30d7SJussi Kivilinna } 1549937c30d7SJussi Kivilinna } 1550937c30d7SJussi Kivilinna } 1551937c30d7SJussi Kivilinna }, { 1552863b557aSYouquan, Song .alg = "__driver-cbc-aes-aesni", 1553863b557aSYouquan, Song .test = alg_test_null, 1554863b557aSYouquan, Song .suite = { 1555863b557aSYouquan, Song .cipher = { 1556863b557aSYouquan, Song .enc = { 1557863b557aSYouquan, Song .vecs = NULL, 1558863b557aSYouquan, Song .count = 0 1559863b557aSYouquan, Song }, 1560863b557aSYouquan, Song .dec = { 1561863b557aSYouquan, Song .vecs = NULL, 1562863b557aSYouquan, Song .count = 0 1563863b557aSYouquan, Song } 1564863b557aSYouquan, Song } 1565863b557aSYouquan, Song } 1566863b557aSYouquan, Song }, { 1567937c30d7SJussi Kivilinna .alg = "__driver-cbc-serpent-sse2", 1568937c30d7SJussi Kivilinna .test = alg_test_null, 1569937c30d7SJussi Kivilinna .suite = { 1570937c30d7SJussi Kivilinna .cipher = { 1571937c30d7SJussi Kivilinna .enc = { 1572937c30d7SJussi Kivilinna .vecs = NULL, 1573937c30d7SJussi Kivilinna .count = 0 1574937c30d7SJussi Kivilinna }, 1575937c30d7SJussi Kivilinna .dec = { 1576937c30d7SJussi Kivilinna .vecs = NULL, 1577937c30d7SJussi Kivilinna .count = 0 1578937c30d7SJussi Kivilinna } 1579937c30d7SJussi Kivilinna } 1580937c30d7SJussi Kivilinna } 1581937c30d7SJussi Kivilinna }, { 1582863b557aSYouquan, Song .alg = "__driver-ecb-aes-aesni", 1583863b557aSYouquan, Song .test = alg_test_null, 1584863b557aSYouquan, Song .suite = { 1585863b557aSYouquan, Song .cipher = { 1586863b557aSYouquan, Song .enc = { 1587863b557aSYouquan, Song .vecs = NULL, 1588863b557aSYouquan, Song .count = 0 1589863b557aSYouquan, Song }, 1590863b557aSYouquan, Song .dec = { 1591863b557aSYouquan, Song .vecs = NULL, 1592863b557aSYouquan, Song .count = 0 1593863b557aSYouquan, Song } 1594863b557aSYouquan, Song } 1595863b557aSYouquan, Song } 1596863b557aSYouquan, Song }, { 1597937c30d7SJussi Kivilinna .alg = "__driver-ecb-serpent-sse2", 1598937c30d7SJussi Kivilinna .test = alg_test_null, 1599937c30d7SJussi Kivilinna .suite = { 1600937c30d7SJussi Kivilinna .cipher = { 1601937c30d7SJussi Kivilinna .enc = { 1602937c30d7SJussi Kivilinna .vecs = NULL, 1603937c30d7SJussi Kivilinna .count = 0 1604937c30d7SJussi Kivilinna }, 1605937c30d7SJussi Kivilinna .dec = { 1606937c30d7SJussi Kivilinna .vecs = NULL, 1607937c30d7SJussi Kivilinna .count = 0 1608937c30d7SJussi Kivilinna } 1609937c30d7SJussi Kivilinna } 1610937c30d7SJussi Kivilinna } 1611937c30d7SJussi Kivilinna }, { 1612863b557aSYouquan, Song .alg = "__ghash-pclmulqdqni", 1613863b557aSYouquan, Song .test = alg_test_null, 1614863b557aSYouquan, Song .suite = { 1615863b557aSYouquan, Song .hash = { 1616863b557aSYouquan, Song .vecs = NULL, 1617863b557aSYouquan, Song .count = 0 1618863b557aSYouquan, Song } 1619863b557aSYouquan, Song } 1620863b557aSYouquan, Song }, { 1621e08ca2daSJarod Wilson .alg = "ansi_cprng", 1622e08ca2daSJarod Wilson .test = alg_test_cprng, 1623a1915d51SJarod Wilson .fips_allowed = 1, 1624e08ca2daSJarod Wilson .suite = { 1625e08ca2daSJarod Wilson .cprng = { 1626e08ca2daSJarod Wilson .vecs = ansi_cprng_aes_tv_template, 1627e08ca2daSJarod Wilson .count = ANSI_CPRNG_AES_TEST_VECTORS 1628e08ca2daSJarod Wilson } 1629e08ca2daSJarod Wilson } 1630e08ca2daSJarod Wilson }, { 1631da7f033dSHerbert Xu .alg = "cbc(aes)", 16321aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1633a1915d51SJarod Wilson .fips_allowed = 1, 1634da7f033dSHerbert Xu .suite = { 1635da7f033dSHerbert Xu .cipher = { 1636da7f033dSHerbert Xu .enc = { 1637da7f033dSHerbert Xu .vecs = aes_cbc_enc_tv_template, 1638da7f033dSHerbert Xu .count = AES_CBC_ENC_TEST_VECTORS 1639da7f033dSHerbert Xu }, 1640da7f033dSHerbert Xu .dec = { 1641da7f033dSHerbert Xu .vecs = aes_cbc_dec_tv_template, 1642da7f033dSHerbert Xu .count = AES_CBC_DEC_TEST_VECTORS 1643da7f033dSHerbert Xu } 1644da7f033dSHerbert Xu } 1645da7f033dSHerbert Xu } 1646da7f033dSHerbert Xu }, { 1647da7f033dSHerbert Xu .alg = "cbc(anubis)", 16481aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1649da7f033dSHerbert Xu .suite = { 1650da7f033dSHerbert Xu .cipher = { 1651da7f033dSHerbert Xu .enc = { 1652da7f033dSHerbert Xu .vecs = anubis_cbc_enc_tv_template, 1653da7f033dSHerbert Xu .count = ANUBIS_CBC_ENC_TEST_VECTORS 1654da7f033dSHerbert Xu }, 1655da7f033dSHerbert Xu .dec = { 1656da7f033dSHerbert Xu .vecs = anubis_cbc_dec_tv_template, 1657da7f033dSHerbert Xu .count = ANUBIS_CBC_DEC_TEST_VECTORS 1658da7f033dSHerbert Xu } 1659da7f033dSHerbert Xu } 1660da7f033dSHerbert Xu } 1661da7f033dSHerbert Xu }, { 1662da7f033dSHerbert Xu .alg = "cbc(blowfish)", 16631aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1664da7f033dSHerbert Xu .suite = { 1665da7f033dSHerbert Xu .cipher = { 1666da7f033dSHerbert Xu .enc = { 1667da7f033dSHerbert Xu .vecs = bf_cbc_enc_tv_template, 1668da7f033dSHerbert Xu .count = BF_CBC_ENC_TEST_VECTORS 1669da7f033dSHerbert Xu }, 1670da7f033dSHerbert Xu .dec = { 1671da7f033dSHerbert Xu .vecs = bf_cbc_dec_tv_template, 1672da7f033dSHerbert Xu .count = BF_CBC_DEC_TEST_VECTORS 1673da7f033dSHerbert Xu } 1674da7f033dSHerbert Xu } 1675da7f033dSHerbert Xu } 1676da7f033dSHerbert Xu }, { 1677da7f033dSHerbert Xu .alg = "cbc(camellia)", 16781aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1679da7f033dSHerbert Xu .suite = { 1680da7f033dSHerbert Xu .cipher = { 1681da7f033dSHerbert Xu .enc = { 1682da7f033dSHerbert Xu .vecs = camellia_cbc_enc_tv_template, 1683da7f033dSHerbert Xu .count = CAMELLIA_CBC_ENC_TEST_VECTORS 1684da7f033dSHerbert Xu }, 1685da7f033dSHerbert Xu .dec = { 1686da7f033dSHerbert Xu .vecs = camellia_cbc_dec_tv_template, 1687da7f033dSHerbert Xu .count = CAMELLIA_CBC_DEC_TEST_VECTORS 1688da7f033dSHerbert Xu } 1689da7f033dSHerbert Xu } 1690da7f033dSHerbert Xu } 1691da7f033dSHerbert Xu }, { 1692da7f033dSHerbert Xu .alg = "cbc(des)", 16931aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1694da7f033dSHerbert Xu .suite = { 1695da7f033dSHerbert Xu .cipher = { 1696da7f033dSHerbert Xu .enc = { 1697da7f033dSHerbert Xu .vecs = des_cbc_enc_tv_template, 1698da7f033dSHerbert Xu .count = DES_CBC_ENC_TEST_VECTORS 1699da7f033dSHerbert Xu }, 1700da7f033dSHerbert Xu .dec = { 1701da7f033dSHerbert Xu .vecs = des_cbc_dec_tv_template, 1702da7f033dSHerbert Xu .count = DES_CBC_DEC_TEST_VECTORS 1703da7f033dSHerbert Xu } 1704da7f033dSHerbert Xu } 1705da7f033dSHerbert Xu } 1706da7f033dSHerbert Xu }, { 1707da7f033dSHerbert Xu .alg = "cbc(des3_ede)", 17081aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1709a1915d51SJarod Wilson .fips_allowed = 1, 1710da7f033dSHerbert Xu .suite = { 1711da7f033dSHerbert Xu .cipher = { 1712da7f033dSHerbert Xu .enc = { 1713da7f033dSHerbert Xu .vecs = des3_ede_cbc_enc_tv_template, 1714da7f033dSHerbert Xu .count = DES3_EDE_CBC_ENC_TEST_VECTORS 1715da7f033dSHerbert Xu }, 1716da7f033dSHerbert Xu .dec = { 1717da7f033dSHerbert Xu .vecs = des3_ede_cbc_dec_tv_template, 1718da7f033dSHerbert Xu .count = DES3_EDE_CBC_DEC_TEST_VECTORS 1719da7f033dSHerbert Xu } 1720da7f033dSHerbert Xu } 1721da7f033dSHerbert Xu } 1722da7f033dSHerbert Xu }, { 17239d25917dSJussi Kivilinna .alg = "cbc(serpent)", 17249d25917dSJussi Kivilinna .test = alg_test_skcipher, 17259d25917dSJussi Kivilinna .suite = { 17269d25917dSJussi Kivilinna .cipher = { 17279d25917dSJussi Kivilinna .enc = { 17289d25917dSJussi Kivilinna .vecs = serpent_cbc_enc_tv_template, 17299d25917dSJussi Kivilinna .count = SERPENT_CBC_ENC_TEST_VECTORS 17309d25917dSJussi Kivilinna }, 17319d25917dSJussi Kivilinna .dec = { 17329d25917dSJussi Kivilinna .vecs = serpent_cbc_dec_tv_template, 17339d25917dSJussi Kivilinna .count = SERPENT_CBC_DEC_TEST_VECTORS 17349d25917dSJussi Kivilinna } 17359d25917dSJussi Kivilinna } 17369d25917dSJussi Kivilinna } 17379d25917dSJussi Kivilinna }, { 1738da7f033dSHerbert Xu .alg = "cbc(twofish)", 17391aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1740da7f033dSHerbert Xu .suite = { 1741da7f033dSHerbert Xu .cipher = { 1742da7f033dSHerbert Xu .enc = { 1743da7f033dSHerbert Xu .vecs = tf_cbc_enc_tv_template, 1744da7f033dSHerbert Xu .count = TF_CBC_ENC_TEST_VECTORS 1745da7f033dSHerbert Xu }, 1746da7f033dSHerbert Xu .dec = { 1747da7f033dSHerbert Xu .vecs = tf_cbc_dec_tv_template, 1748da7f033dSHerbert Xu .count = TF_CBC_DEC_TEST_VECTORS 1749da7f033dSHerbert Xu } 1750da7f033dSHerbert Xu } 1751da7f033dSHerbert Xu } 1752da7f033dSHerbert Xu }, { 1753da7f033dSHerbert Xu .alg = "ccm(aes)", 1754da7f033dSHerbert Xu .test = alg_test_aead, 1755a1915d51SJarod Wilson .fips_allowed = 1, 1756da7f033dSHerbert Xu .suite = { 1757da7f033dSHerbert Xu .aead = { 1758da7f033dSHerbert Xu .enc = { 1759da7f033dSHerbert Xu .vecs = aes_ccm_enc_tv_template, 1760da7f033dSHerbert Xu .count = AES_CCM_ENC_TEST_VECTORS 1761da7f033dSHerbert Xu }, 1762da7f033dSHerbert Xu .dec = { 1763da7f033dSHerbert Xu .vecs = aes_ccm_dec_tv_template, 1764da7f033dSHerbert Xu .count = AES_CCM_DEC_TEST_VECTORS 1765da7f033dSHerbert Xu } 1766da7f033dSHerbert Xu } 1767da7f033dSHerbert Xu } 1768da7f033dSHerbert Xu }, { 1769da7f033dSHerbert Xu .alg = "crc32c", 17708e3ee85eSHerbert Xu .test = alg_test_crc32c, 1771a1915d51SJarod Wilson .fips_allowed = 1, 1772da7f033dSHerbert Xu .suite = { 1773da7f033dSHerbert Xu .hash = { 1774da7f033dSHerbert Xu .vecs = crc32c_tv_template, 1775da7f033dSHerbert Xu .count = CRC32C_TEST_VECTORS 1776da7f033dSHerbert Xu } 1777da7f033dSHerbert Xu } 1778da7f033dSHerbert Xu }, { 1779863b557aSYouquan, Song .alg = "cryptd(__driver-ecb-aes-aesni)", 1780863b557aSYouquan, Song .test = alg_test_null, 1781863b557aSYouquan, Song .suite = { 1782863b557aSYouquan, Song .cipher = { 1783863b557aSYouquan, Song .enc = { 1784863b557aSYouquan, Song .vecs = NULL, 1785863b557aSYouquan, Song .count = 0 1786863b557aSYouquan, Song }, 1787863b557aSYouquan, Song .dec = { 1788863b557aSYouquan, Song .vecs = NULL, 1789863b557aSYouquan, Song .count = 0 1790863b557aSYouquan, Song } 1791863b557aSYouquan, Song } 1792863b557aSYouquan, Song } 1793863b557aSYouquan, Song }, { 1794937c30d7SJussi Kivilinna .alg = "cryptd(__driver-ecb-serpent-sse2)", 1795937c30d7SJussi Kivilinna .test = alg_test_null, 1796937c30d7SJussi Kivilinna .suite = { 1797937c30d7SJussi Kivilinna .cipher = { 1798937c30d7SJussi Kivilinna .enc = { 1799937c30d7SJussi Kivilinna .vecs = NULL, 1800937c30d7SJussi Kivilinna .count = 0 1801937c30d7SJussi Kivilinna }, 1802937c30d7SJussi Kivilinna .dec = { 1803937c30d7SJussi Kivilinna .vecs = NULL, 1804937c30d7SJussi Kivilinna .count = 0 1805937c30d7SJussi Kivilinna } 1806937c30d7SJussi Kivilinna } 1807937c30d7SJussi Kivilinna } 1808937c30d7SJussi Kivilinna }, { 1809863b557aSYouquan, Song .alg = "cryptd(__ghash-pclmulqdqni)", 1810863b557aSYouquan, Song .test = alg_test_null, 1811863b557aSYouquan, Song .suite = { 1812863b557aSYouquan, Song .hash = { 1813863b557aSYouquan, Song .vecs = NULL, 1814863b557aSYouquan, Song .count = 0 1815863b557aSYouquan, Song } 1816863b557aSYouquan, Song } 1817863b557aSYouquan, Song }, { 1818f7cb80f2SJarod Wilson .alg = "ctr(aes)", 1819f7cb80f2SJarod Wilson .test = alg_test_skcipher, 1820a1915d51SJarod Wilson .fips_allowed = 1, 1821f7cb80f2SJarod Wilson .suite = { 1822f7cb80f2SJarod Wilson .cipher = { 1823f7cb80f2SJarod Wilson .enc = { 1824f7cb80f2SJarod Wilson .vecs = aes_ctr_enc_tv_template, 1825f7cb80f2SJarod Wilson .count = AES_CTR_ENC_TEST_VECTORS 1826f7cb80f2SJarod Wilson }, 1827f7cb80f2SJarod Wilson .dec = { 1828f7cb80f2SJarod Wilson .vecs = aes_ctr_dec_tv_template, 1829f7cb80f2SJarod Wilson .count = AES_CTR_DEC_TEST_VECTORS 1830f7cb80f2SJarod Wilson } 1831f7cb80f2SJarod Wilson } 1832f7cb80f2SJarod Wilson } 1833f7cb80f2SJarod Wilson }, { 183485b63e34SJussi Kivilinna .alg = "ctr(blowfish)", 183585b63e34SJussi Kivilinna .test = alg_test_skcipher, 183685b63e34SJussi Kivilinna .suite = { 183785b63e34SJussi Kivilinna .cipher = { 183885b63e34SJussi Kivilinna .enc = { 183985b63e34SJussi Kivilinna .vecs = bf_ctr_enc_tv_template, 184085b63e34SJussi Kivilinna .count = BF_CTR_ENC_TEST_VECTORS 184185b63e34SJussi Kivilinna }, 184285b63e34SJussi Kivilinna .dec = { 184385b63e34SJussi Kivilinna .vecs = bf_ctr_dec_tv_template, 184485b63e34SJussi Kivilinna .count = BF_CTR_DEC_TEST_VECTORS 184585b63e34SJussi Kivilinna } 184685b63e34SJussi Kivilinna } 184785b63e34SJussi Kivilinna } 184885b63e34SJussi Kivilinna }, { 18490840605eSJussi Kivilinna .alg = "ctr(camellia)", 18500840605eSJussi Kivilinna .test = alg_test_skcipher, 18510840605eSJussi Kivilinna .suite = { 18520840605eSJussi Kivilinna .cipher = { 18530840605eSJussi Kivilinna .enc = { 18540840605eSJussi Kivilinna .vecs = camellia_ctr_enc_tv_template, 18550840605eSJussi Kivilinna .count = CAMELLIA_CTR_ENC_TEST_VECTORS 18560840605eSJussi Kivilinna }, 18570840605eSJussi Kivilinna .dec = { 18580840605eSJussi Kivilinna .vecs = camellia_ctr_dec_tv_template, 18590840605eSJussi Kivilinna .count = CAMELLIA_CTR_DEC_TEST_VECTORS 18600840605eSJussi Kivilinna } 18610840605eSJussi Kivilinna } 18620840605eSJussi Kivilinna } 18630840605eSJussi Kivilinna }, { 18649d25917dSJussi Kivilinna .alg = "ctr(serpent)", 18659d25917dSJussi Kivilinna .test = alg_test_skcipher, 18669d25917dSJussi Kivilinna .suite = { 18679d25917dSJussi Kivilinna .cipher = { 18689d25917dSJussi Kivilinna .enc = { 18699d25917dSJussi Kivilinna .vecs = serpent_ctr_enc_tv_template, 18709d25917dSJussi Kivilinna .count = SERPENT_CTR_ENC_TEST_VECTORS 18719d25917dSJussi Kivilinna }, 18729d25917dSJussi Kivilinna .dec = { 18739d25917dSJussi Kivilinna .vecs = serpent_ctr_dec_tv_template, 18749d25917dSJussi Kivilinna .count = SERPENT_CTR_DEC_TEST_VECTORS 18759d25917dSJussi Kivilinna } 18769d25917dSJussi Kivilinna } 18779d25917dSJussi Kivilinna } 18789d25917dSJussi Kivilinna }, { 1879573da620SJussi Kivilinna .alg = "ctr(twofish)", 1880573da620SJussi Kivilinna .test = alg_test_skcipher, 1881573da620SJussi Kivilinna .suite = { 1882573da620SJussi Kivilinna .cipher = { 1883573da620SJussi Kivilinna .enc = { 1884573da620SJussi Kivilinna .vecs = tf_ctr_enc_tv_template, 1885573da620SJussi Kivilinna .count = TF_CTR_ENC_TEST_VECTORS 1886573da620SJussi Kivilinna }, 1887573da620SJussi Kivilinna .dec = { 1888573da620SJussi Kivilinna .vecs = tf_ctr_dec_tv_template, 1889573da620SJussi Kivilinna .count = TF_CTR_DEC_TEST_VECTORS 1890573da620SJussi Kivilinna } 1891573da620SJussi Kivilinna } 1892573da620SJussi Kivilinna } 1893573da620SJussi Kivilinna }, { 1894da7f033dSHerbert Xu .alg = "cts(cbc(aes))", 18951aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1896da7f033dSHerbert Xu .suite = { 1897da7f033dSHerbert Xu .cipher = { 1898da7f033dSHerbert Xu .enc = { 1899da7f033dSHerbert Xu .vecs = cts_mode_enc_tv_template, 1900da7f033dSHerbert Xu .count = CTS_MODE_ENC_TEST_VECTORS 1901da7f033dSHerbert Xu }, 1902da7f033dSHerbert Xu .dec = { 1903da7f033dSHerbert Xu .vecs = cts_mode_dec_tv_template, 1904da7f033dSHerbert Xu .count = CTS_MODE_DEC_TEST_VECTORS 1905da7f033dSHerbert Xu } 1906da7f033dSHerbert Xu } 1907da7f033dSHerbert Xu } 1908da7f033dSHerbert Xu }, { 1909da7f033dSHerbert Xu .alg = "deflate", 1910da7f033dSHerbert Xu .test = alg_test_comp, 1911da7f033dSHerbert Xu .suite = { 1912da7f033dSHerbert Xu .comp = { 1913da7f033dSHerbert Xu .comp = { 1914da7f033dSHerbert Xu .vecs = deflate_comp_tv_template, 1915da7f033dSHerbert Xu .count = DEFLATE_COMP_TEST_VECTORS 1916da7f033dSHerbert Xu }, 1917da7f033dSHerbert Xu .decomp = { 1918da7f033dSHerbert Xu .vecs = deflate_decomp_tv_template, 1919da7f033dSHerbert Xu .count = DEFLATE_DECOMP_TEST_VECTORS 1920da7f033dSHerbert Xu } 1921da7f033dSHerbert Xu } 1922da7f033dSHerbert Xu } 1923da7f033dSHerbert Xu }, { 1924863b557aSYouquan, Song .alg = "ecb(__aes-aesni)", 1925863b557aSYouquan, Song .test = alg_test_null, 1926863b557aSYouquan, Song .suite = { 1927863b557aSYouquan, Song .cipher = { 1928863b557aSYouquan, Song .enc = { 1929863b557aSYouquan, Song .vecs = NULL, 1930863b557aSYouquan, Song .count = 0 1931863b557aSYouquan, Song }, 1932863b557aSYouquan, Song .dec = { 1933863b557aSYouquan, Song .vecs = NULL, 1934863b557aSYouquan, Song .count = 0 1935863b557aSYouquan, Song } 1936863b557aSYouquan, Song } 1937863b557aSYouquan, Song } 1938863b557aSYouquan, Song }, { 1939da7f033dSHerbert Xu .alg = "ecb(aes)", 19401aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1941a1915d51SJarod Wilson .fips_allowed = 1, 1942da7f033dSHerbert Xu .suite = { 1943da7f033dSHerbert Xu .cipher = { 1944da7f033dSHerbert Xu .enc = { 1945da7f033dSHerbert Xu .vecs = aes_enc_tv_template, 1946da7f033dSHerbert Xu .count = AES_ENC_TEST_VECTORS 1947da7f033dSHerbert Xu }, 1948da7f033dSHerbert Xu .dec = { 1949da7f033dSHerbert Xu .vecs = aes_dec_tv_template, 1950da7f033dSHerbert Xu .count = AES_DEC_TEST_VECTORS 1951da7f033dSHerbert Xu } 1952da7f033dSHerbert Xu } 1953da7f033dSHerbert Xu } 1954da7f033dSHerbert Xu }, { 1955da7f033dSHerbert Xu .alg = "ecb(anubis)", 19561aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1957da7f033dSHerbert Xu .suite = { 1958da7f033dSHerbert Xu .cipher = { 1959da7f033dSHerbert Xu .enc = { 1960da7f033dSHerbert Xu .vecs = anubis_enc_tv_template, 1961da7f033dSHerbert Xu .count = ANUBIS_ENC_TEST_VECTORS 1962da7f033dSHerbert Xu }, 1963da7f033dSHerbert Xu .dec = { 1964da7f033dSHerbert Xu .vecs = anubis_dec_tv_template, 1965da7f033dSHerbert Xu .count = ANUBIS_DEC_TEST_VECTORS 1966da7f033dSHerbert Xu } 1967da7f033dSHerbert Xu } 1968da7f033dSHerbert Xu } 1969da7f033dSHerbert Xu }, { 1970da7f033dSHerbert Xu .alg = "ecb(arc4)", 19711aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1972da7f033dSHerbert Xu .suite = { 1973da7f033dSHerbert Xu .cipher = { 1974da7f033dSHerbert Xu .enc = { 1975da7f033dSHerbert Xu .vecs = arc4_enc_tv_template, 1976da7f033dSHerbert Xu .count = ARC4_ENC_TEST_VECTORS 1977da7f033dSHerbert Xu }, 1978da7f033dSHerbert Xu .dec = { 1979da7f033dSHerbert Xu .vecs = arc4_dec_tv_template, 1980da7f033dSHerbert Xu .count = ARC4_DEC_TEST_VECTORS 1981da7f033dSHerbert Xu } 1982da7f033dSHerbert Xu } 1983da7f033dSHerbert Xu } 1984da7f033dSHerbert Xu }, { 1985da7f033dSHerbert Xu .alg = "ecb(blowfish)", 19861aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1987da7f033dSHerbert Xu .suite = { 1988da7f033dSHerbert Xu .cipher = { 1989da7f033dSHerbert Xu .enc = { 1990da7f033dSHerbert Xu .vecs = bf_enc_tv_template, 1991da7f033dSHerbert Xu .count = BF_ENC_TEST_VECTORS 1992da7f033dSHerbert Xu }, 1993da7f033dSHerbert Xu .dec = { 1994da7f033dSHerbert Xu .vecs = bf_dec_tv_template, 1995da7f033dSHerbert Xu .count = BF_DEC_TEST_VECTORS 1996da7f033dSHerbert Xu } 1997da7f033dSHerbert Xu } 1998da7f033dSHerbert Xu } 1999da7f033dSHerbert Xu }, { 2000da7f033dSHerbert Xu .alg = "ecb(camellia)", 20011aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2002da7f033dSHerbert Xu .suite = { 2003da7f033dSHerbert Xu .cipher = { 2004da7f033dSHerbert Xu .enc = { 2005da7f033dSHerbert Xu .vecs = camellia_enc_tv_template, 2006da7f033dSHerbert Xu .count = CAMELLIA_ENC_TEST_VECTORS 2007da7f033dSHerbert Xu }, 2008da7f033dSHerbert Xu .dec = { 2009da7f033dSHerbert Xu .vecs = camellia_dec_tv_template, 2010da7f033dSHerbert Xu .count = CAMELLIA_DEC_TEST_VECTORS 2011da7f033dSHerbert Xu } 2012da7f033dSHerbert Xu } 2013da7f033dSHerbert Xu } 2014da7f033dSHerbert Xu }, { 2015da7f033dSHerbert Xu .alg = "ecb(cast5)", 20161aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2017da7f033dSHerbert Xu .suite = { 2018da7f033dSHerbert Xu .cipher = { 2019da7f033dSHerbert Xu .enc = { 2020da7f033dSHerbert Xu .vecs = cast5_enc_tv_template, 2021da7f033dSHerbert Xu .count = CAST5_ENC_TEST_VECTORS 2022da7f033dSHerbert Xu }, 2023da7f033dSHerbert Xu .dec = { 2024da7f033dSHerbert Xu .vecs = cast5_dec_tv_template, 2025da7f033dSHerbert Xu .count = CAST5_DEC_TEST_VECTORS 2026da7f033dSHerbert Xu } 2027da7f033dSHerbert Xu } 2028da7f033dSHerbert Xu } 2029da7f033dSHerbert Xu }, { 2030da7f033dSHerbert Xu .alg = "ecb(cast6)", 20311aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2032da7f033dSHerbert Xu .suite = { 2033da7f033dSHerbert Xu .cipher = { 2034da7f033dSHerbert Xu .enc = { 2035da7f033dSHerbert Xu .vecs = cast6_enc_tv_template, 2036da7f033dSHerbert Xu .count = CAST6_ENC_TEST_VECTORS 2037da7f033dSHerbert Xu }, 2038da7f033dSHerbert Xu .dec = { 2039da7f033dSHerbert Xu .vecs = cast6_dec_tv_template, 2040da7f033dSHerbert Xu .count = CAST6_DEC_TEST_VECTORS 2041da7f033dSHerbert Xu } 2042da7f033dSHerbert Xu } 2043da7f033dSHerbert Xu } 2044da7f033dSHerbert Xu }, { 2045da7f033dSHerbert Xu .alg = "ecb(des)", 20461aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2047a1915d51SJarod Wilson .fips_allowed = 1, 2048da7f033dSHerbert Xu .suite = { 2049da7f033dSHerbert Xu .cipher = { 2050da7f033dSHerbert Xu .enc = { 2051da7f033dSHerbert Xu .vecs = des_enc_tv_template, 2052da7f033dSHerbert Xu .count = DES_ENC_TEST_VECTORS 2053da7f033dSHerbert Xu }, 2054da7f033dSHerbert Xu .dec = { 2055da7f033dSHerbert Xu .vecs = des_dec_tv_template, 2056da7f033dSHerbert Xu .count = DES_DEC_TEST_VECTORS 2057da7f033dSHerbert Xu } 2058da7f033dSHerbert Xu } 2059da7f033dSHerbert Xu } 2060da7f033dSHerbert Xu }, { 2061da7f033dSHerbert Xu .alg = "ecb(des3_ede)", 20621aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2063a1915d51SJarod Wilson .fips_allowed = 1, 2064da7f033dSHerbert Xu .suite = { 2065da7f033dSHerbert Xu .cipher = { 2066da7f033dSHerbert Xu .enc = { 2067da7f033dSHerbert Xu .vecs = des3_ede_enc_tv_template, 2068da7f033dSHerbert Xu .count = DES3_EDE_ENC_TEST_VECTORS 2069da7f033dSHerbert Xu }, 2070da7f033dSHerbert Xu .dec = { 2071da7f033dSHerbert Xu .vecs = des3_ede_dec_tv_template, 2072da7f033dSHerbert Xu .count = DES3_EDE_DEC_TEST_VECTORS 2073da7f033dSHerbert Xu } 2074da7f033dSHerbert Xu } 2075da7f033dSHerbert Xu } 2076da7f033dSHerbert Xu }, { 2077da7f033dSHerbert Xu .alg = "ecb(khazad)", 20781aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2079da7f033dSHerbert Xu .suite = { 2080da7f033dSHerbert Xu .cipher = { 2081da7f033dSHerbert Xu .enc = { 2082da7f033dSHerbert Xu .vecs = khazad_enc_tv_template, 2083da7f033dSHerbert Xu .count = KHAZAD_ENC_TEST_VECTORS 2084da7f033dSHerbert Xu }, 2085da7f033dSHerbert Xu .dec = { 2086da7f033dSHerbert Xu .vecs = khazad_dec_tv_template, 2087da7f033dSHerbert Xu .count = KHAZAD_DEC_TEST_VECTORS 2088da7f033dSHerbert Xu } 2089da7f033dSHerbert Xu } 2090da7f033dSHerbert Xu } 2091da7f033dSHerbert Xu }, { 2092da7f033dSHerbert Xu .alg = "ecb(seed)", 20931aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2094da7f033dSHerbert Xu .suite = { 2095da7f033dSHerbert Xu .cipher = { 2096da7f033dSHerbert Xu .enc = { 2097da7f033dSHerbert Xu .vecs = seed_enc_tv_template, 2098da7f033dSHerbert Xu .count = SEED_ENC_TEST_VECTORS 2099da7f033dSHerbert Xu }, 2100da7f033dSHerbert Xu .dec = { 2101da7f033dSHerbert Xu .vecs = seed_dec_tv_template, 2102da7f033dSHerbert Xu .count = SEED_DEC_TEST_VECTORS 2103da7f033dSHerbert Xu } 2104da7f033dSHerbert Xu } 2105da7f033dSHerbert Xu } 2106da7f033dSHerbert Xu }, { 2107da7f033dSHerbert Xu .alg = "ecb(serpent)", 21081aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2109da7f033dSHerbert Xu .suite = { 2110da7f033dSHerbert Xu .cipher = { 2111da7f033dSHerbert Xu .enc = { 2112da7f033dSHerbert Xu .vecs = serpent_enc_tv_template, 2113da7f033dSHerbert Xu .count = SERPENT_ENC_TEST_VECTORS 2114da7f033dSHerbert Xu }, 2115da7f033dSHerbert Xu .dec = { 2116da7f033dSHerbert Xu .vecs = serpent_dec_tv_template, 2117da7f033dSHerbert Xu .count = SERPENT_DEC_TEST_VECTORS 2118da7f033dSHerbert Xu } 2119da7f033dSHerbert Xu } 2120da7f033dSHerbert Xu } 2121da7f033dSHerbert Xu }, { 2122da7f033dSHerbert Xu .alg = "ecb(tea)", 21231aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2124da7f033dSHerbert Xu .suite = { 2125da7f033dSHerbert Xu .cipher = { 2126da7f033dSHerbert Xu .enc = { 2127da7f033dSHerbert Xu .vecs = tea_enc_tv_template, 2128da7f033dSHerbert Xu .count = TEA_ENC_TEST_VECTORS 2129da7f033dSHerbert Xu }, 2130da7f033dSHerbert Xu .dec = { 2131da7f033dSHerbert Xu .vecs = tea_dec_tv_template, 2132da7f033dSHerbert Xu .count = TEA_DEC_TEST_VECTORS 2133da7f033dSHerbert Xu } 2134da7f033dSHerbert Xu } 2135da7f033dSHerbert Xu } 2136da7f033dSHerbert Xu }, { 2137da7f033dSHerbert Xu .alg = "ecb(tnepres)", 21381aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2139da7f033dSHerbert Xu .suite = { 2140da7f033dSHerbert Xu .cipher = { 2141da7f033dSHerbert Xu .enc = { 2142da7f033dSHerbert Xu .vecs = tnepres_enc_tv_template, 2143da7f033dSHerbert Xu .count = TNEPRES_ENC_TEST_VECTORS 2144da7f033dSHerbert Xu }, 2145da7f033dSHerbert Xu .dec = { 2146da7f033dSHerbert Xu .vecs = tnepres_dec_tv_template, 2147da7f033dSHerbert Xu .count = TNEPRES_DEC_TEST_VECTORS 2148da7f033dSHerbert Xu } 2149da7f033dSHerbert Xu } 2150da7f033dSHerbert Xu } 2151da7f033dSHerbert Xu }, { 2152da7f033dSHerbert Xu .alg = "ecb(twofish)", 21531aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2154da7f033dSHerbert Xu .suite = { 2155da7f033dSHerbert Xu .cipher = { 2156da7f033dSHerbert Xu .enc = { 2157da7f033dSHerbert Xu .vecs = tf_enc_tv_template, 2158da7f033dSHerbert Xu .count = TF_ENC_TEST_VECTORS 2159da7f033dSHerbert Xu }, 2160da7f033dSHerbert Xu .dec = { 2161da7f033dSHerbert Xu .vecs = tf_dec_tv_template, 2162da7f033dSHerbert Xu .count = TF_DEC_TEST_VECTORS 2163da7f033dSHerbert Xu } 2164da7f033dSHerbert Xu } 2165da7f033dSHerbert Xu } 2166da7f033dSHerbert Xu }, { 2167da7f033dSHerbert Xu .alg = "ecb(xeta)", 21681aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2169da7f033dSHerbert Xu .suite = { 2170da7f033dSHerbert Xu .cipher = { 2171da7f033dSHerbert Xu .enc = { 2172da7f033dSHerbert Xu .vecs = xeta_enc_tv_template, 2173da7f033dSHerbert Xu .count = XETA_ENC_TEST_VECTORS 2174da7f033dSHerbert Xu }, 2175da7f033dSHerbert Xu .dec = { 2176da7f033dSHerbert Xu .vecs = xeta_dec_tv_template, 2177da7f033dSHerbert Xu .count = XETA_DEC_TEST_VECTORS 2178da7f033dSHerbert Xu } 2179da7f033dSHerbert Xu } 2180da7f033dSHerbert Xu } 2181da7f033dSHerbert Xu }, { 2182da7f033dSHerbert Xu .alg = "ecb(xtea)", 21831aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2184da7f033dSHerbert Xu .suite = { 2185da7f033dSHerbert Xu .cipher = { 2186da7f033dSHerbert Xu .enc = { 2187da7f033dSHerbert Xu .vecs = xtea_enc_tv_template, 2188da7f033dSHerbert Xu .count = XTEA_ENC_TEST_VECTORS 2189da7f033dSHerbert Xu }, 2190da7f033dSHerbert Xu .dec = { 2191da7f033dSHerbert Xu .vecs = xtea_dec_tv_template, 2192da7f033dSHerbert Xu .count = XTEA_DEC_TEST_VECTORS 2193da7f033dSHerbert Xu } 2194da7f033dSHerbert Xu } 2195da7f033dSHerbert Xu } 2196da7f033dSHerbert Xu }, { 2197da7f033dSHerbert Xu .alg = "gcm(aes)", 2198da7f033dSHerbert Xu .test = alg_test_aead, 2199a1915d51SJarod Wilson .fips_allowed = 1, 2200da7f033dSHerbert Xu .suite = { 2201da7f033dSHerbert Xu .aead = { 2202da7f033dSHerbert Xu .enc = { 2203da7f033dSHerbert Xu .vecs = aes_gcm_enc_tv_template, 2204da7f033dSHerbert Xu .count = AES_GCM_ENC_TEST_VECTORS 2205da7f033dSHerbert Xu }, 2206da7f033dSHerbert Xu .dec = { 2207da7f033dSHerbert Xu .vecs = aes_gcm_dec_tv_template, 2208da7f033dSHerbert Xu .count = AES_GCM_DEC_TEST_VECTORS 2209da7f033dSHerbert Xu } 2210da7f033dSHerbert Xu } 2211da7f033dSHerbert Xu } 2212da7f033dSHerbert Xu }, { 2213507069c9SYouquan, Song .alg = "ghash", 2214507069c9SYouquan, Song .test = alg_test_hash, 221518c0ebd2SJarod Wilson .fips_allowed = 1, 2216507069c9SYouquan, Song .suite = { 2217507069c9SYouquan, Song .hash = { 2218507069c9SYouquan, Song .vecs = ghash_tv_template, 2219507069c9SYouquan, Song .count = GHASH_TEST_VECTORS 2220507069c9SYouquan, Song } 2221507069c9SYouquan, Song } 2222507069c9SYouquan, Song }, { 2223da7f033dSHerbert Xu .alg = "hmac(md5)", 2224da7f033dSHerbert Xu .test = alg_test_hash, 2225da7f033dSHerbert Xu .suite = { 2226da7f033dSHerbert Xu .hash = { 2227da7f033dSHerbert Xu .vecs = hmac_md5_tv_template, 2228da7f033dSHerbert Xu .count = HMAC_MD5_TEST_VECTORS 2229da7f033dSHerbert Xu } 2230da7f033dSHerbert Xu } 2231da7f033dSHerbert Xu }, { 2232da7f033dSHerbert Xu .alg = "hmac(rmd128)", 2233da7f033dSHerbert Xu .test = alg_test_hash, 2234da7f033dSHerbert Xu .suite = { 2235da7f033dSHerbert Xu .hash = { 2236da7f033dSHerbert Xu .vecs = hmac_rmd128_tv_template, 2237da7f033dSHerbert Xu .count = HMAC_RMD128_TEST_VECTORS 2238da7f033dSHerbert Xu } 2239da7f033dSHerbert Xu } 2240da7f033dSHerbert Xu }, { 2241da7f033dSHerbert Xu .alg = "hmac(rmd160)", 2242da7f033dSHerbert Xu .test = alg_test_hash, 2243da7f033dSHerbert Xu .suite = { 2244da7f033dSHerbert Xu .hash = { 2245da7f033dSHerbert Xu .vecs = hmac_rmd160_tv_template, 2246da7f033dSHerbert Xu .count = HMAC_RMD160_TEST_VECTORS 2247da7f033dSHerbert Xu } 2248da7f033dSHerbert Xu } 2249da7f033dSHerbert Xu }, { 2250da7f033dSHerbert Xu .alg = "hmac(sha1)", 2251da7f033dSHerbert Xu .test = alg_test_hash, 2252a1915d51SJarod Wilson .fips_allowed = 1, 2253da7f033dSHerbert Xu .suite = { 2254da7f033dSHerbert Xu .hash = { 2255da7f033dSHerbert Xu .vecs = hmac_sha1_tv_template, 2256da7f033dSHerbert Xu .count = HMAC_SHA1_TEST_VECTORS 2257da7f033dSHerbert Xu } 2258da7f033dSHerbert Xu } 2259da7f033dSHerbert Xu }, { 2260da7f033dSHerbert Xu .alg = "hmac(sha224)", 2261da7f033dSHerbert Xu .test = alg_test_hash, 2262a1915d51SJarod Wilson .fips_allowed = 1, 2263da7f033dSHerbert Xu .suite = { 2264da7f033dSHerbert Xu .hash = { 2265da7f033dSHerbert Xu .vecs = hmac_sha224_tv_template, 2266da7f033dSHerbert Xu .count = HMAC_SHA224_TEST_VECTORS 2267da7f033dSHerbert Xu } 2268da7f033dSHerbert Xu } 2269da7f033dSHerbert Xu }, { 2270da7f033dSHerbert Xu .alg = "hmac(sha256)", 2271da7f033dSHerbert Xu .test = alg_test_hash, 2272a1915d51SJarod Wilson .fips_allowed = 1, 2273da7f033dSHerbert Xu .suite = { 2274da7f033dSHerbert Xu .hash = { 2275da7f033dSHerbert Xu .vecs = hmac_sha256_tv_template, 2276da7f033dSHerbert Xu .count = HMAC_SHA256_TEST_VECTORS 2277da7f033dSHerbert Xu } 2278da7f033dSHerbert Xu } 2279da7f033dSHerbert Xu }, { 2280da7f033dSHerbert Xu .alg = "hmac(sha384)", 2281da7f033dSHerbert Xu .test = alg_test_hash, 2282a1915d51SJarod Wilson .fips_allowed = 1, 2283da7f033dSHerbert Xu .suite = { 2284da7f033dSHerbert Xu .hash = { 2285da7f033dSHerbert Xu .vecs = hmac_sha384_tv_template, 2286da7f033dSHerbert Xu .count = HMAC_SHA384_TEST_VECTORS 2287da7f033dSHerbert Xu } 2288da7f033dSHerbert Xu } 2289da7f033dSHerbert Xu }, { 2290da7f033dSHerbert Xu .alg = "hmac(sha512)", 2291da7f033dSHerbert Xu .test = alg_test_hash, 2292a1915d51SJarod Wilson .fips_allowed = 1, 2293da7f033dSHerbert Xu .suite = { 2294da7f033dSHerbert Xu .hash = { 2295da7f033dSHerbert Xu .vecs = hmac_sha512_tv_template, 2296da7f033dSHerbert Xu .count = HMAC_SHA512_TEST_VECTORS 2297da7f033dSHerbert Xu } 2298da7f033dSHerbert Xu } 2299da7f033dSHerbert Xu }, { 2300da7f033dSHerbert Xu .alg = "lrw(aes)", 23011aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2302da7f033dSHerbert Xu .suite = { 2303da7f033dSHerbert Xu .cipher = { 2304da7f033dSHerbert Xu .enc = { 2305da7f033dSHerbert Xu .vecs = aes_lrw_enc_tv_template, 2306da7f033dSHerbert Xu .count = AES_LRW_ENC_TEST_VECTORS 2307da7f033dSHerbert Xu }, 2308da7f033dSHerbert Xu .dec = { 2309da7f033dSHerbert Xu .vecs = aes_lrw_dec_tv_template, 2310da7f033dSHerbert Xu .count = AES_LRW_DEC_TEST_VECTORS 2311da7f033dSHerbert Xu } 2312da7f033dSHerbert Xu } 2313da7f033dSHerbert Xu } 2314da7f033dSHerbert Xu }, { 23150840605eSJussi Kivilinna .alg = "lrw(camellia)", 23160840605eSJussi Kivilinna .test = alg_test_skcipher, 23170840605eSJussi Kivilinna .suite = { 23180840605eSJussi Kivilinna .cipher = { 23190840605eSJussi Kivilinna .enc = { 23200840605eSJussi Kivilinna .vecs = camellia_lrw_enc_tv_template, 23210840605eSJussi Kivilinna .count = CAMELLIA_LRW_ENC_TEST_VECTORS 23220840605eSJussi Kivilinna }, 23230840605eSJussi Kivilinna .dec = { 23240840605eSJussi Kivilinna .vecs = camellia_lrw_dec_tv_template, 23250840605eSJussi Kivilinna .count = CAMELLIA_LRW_DEC_TEST_VECTORS 23260840605eSJussi Kivilinna } 23270840605eSJussi Kivilinna } 23280840605eSJussi Kivilinna } 23290840605eSJussi Kivilinna }, { 2330d7bfc0faSJussi Kivilinna .alg = "lrw(serpent)", 2331d7bfc0faSJussi Kivilinna .test = alg_test_skcipher, 2332d7bfc0faSJussi Kivilinna .suite = { 2333d7bfc0faSJussi Kivilinna .cipher = { 2334d7bfc0faSJussi Kivilinna .enc = { 2335d7bfc0faSJussi Kivilinna .vecs = serpent_lrw_enc_tv_template, 2336d7bfc0faSJussi Kivilinna .count = SERPENT_LRW_ENC_TEST_VECTORS 2337d7bfc0faSJussi Kivilinna }, 2338d7bfc0faSJussi Kivilinna .dec = { 2339d7bfc0faSJussi Kivilinna .vecs = serpent_lrw_dec_tv_template, 2340d7bfc0faSJussi Kivilinna .count = SERPENT_LRW_DEC_TEST_VECTORS 2341d7bfc0faSJussi Kivilinna } 2342d7bfc0faSJussi Kivilinna } 2343d7bfc0faSJussi Kivilinna } 2344d7bfc0faSJussi Kivilinna }, { 23450b2a1551SJussi Kivilinna .alg = "lrw(twofish)", 23460b2a1551SJussi Kivilinna .test = alg_test_skcipher, 23470b2a1551SJussi Kivilinna .suite = { 23480b2a1551SJussi Kivilinna .cipher = { 23490b2a1551SJussi Kivilinna .enc = { 23500b2a1551SJussi Kivilinna .vecs = tf_lrw_enc_tv_template, 23510b2a1551SJussi Kivilinna .count = TF_LRW_ENC_TEST_VECTORS 23520b2a1551SJussi Kivilinna }, 23530b2a1551SJussi Kivilinna .dec = { 23540b2a1551SJussi Kivilinna .vecs = tf_lrw_dec_tv_template, 23550b2a1551SJussi Kivilinna .count = TF_LRW_DEC_TEST_VECTORS 23560b2a1551SJussi Kivilinna } 23570b2a1551SJussi Kivilinna } 23580b2a1551SJussi Kivilinna } 23590b2a1551SJussi Kivilinna }, { 2360da7f033dSHerbert Xu .alg = "lzo", 2361da7f033dSHerbert Xu .test = alg_test_comp, 2362da7f033dSHerbert Xu .suite = { 2363da7f033dSHerbert Xu .comp = { 2364da7f033dSHerbert Xu .comp = { 2365da7f033dSHerbert Xu .vecs = lzo_comp_tv_template, 2366da7f033dSHerbert Xu .count = LZO_COMP_TEST_VECTORS 2367da7f033dSHerbert Xu }, 2368da7f033dSHerbert Xu .decomp = { 2369da7f033dSHerbert Xu .vecs = lzo_decomp_tv_template, 2370da7f033dSHerbert Xu .count = LZO_DECOMP_TEST_VECTORS 2371da7f033dSHerbert Xu } 2372da7f033dSHerbert Xu } 2373da7f033dSHerbert Xu } 2374da7f033dSHerbert Xu }, { 2375da7f033dSHerbert Xu .alg = "md4", 2376da7f033dSHerbert Xu .test = alg_test_hash, 2377da7f033dSHerbert Xu .suite = { 2378da7f033dSHerbert Xu .hash = { 2379da7f033dSHerbert Xu .vecs = md4_tv_template, 2380da7f033dSHerbert Xu .count = MD4_TEST_VECTORS 2381da7f033dSHerbert Xu } 2382da7f033dSHerbert Xu } 2383da7f033dSHerbert Xu }, { 2384da7f033dSHerbert Xu .alg = "md5", 2385da7f033dSHerbert Xu .test = alg_test_hash, 2386da7f033dSHerbert Xu .suite = { 2387da7f033dSHerbert Xu .hash = { 2388da7f033dSHerbert Xu .vecs = md5_tv_template, 2389da7f033dSHerbert Xu .count = MD5_TEST_VECTORS 2390da7f033dSHerbert Xu } 2391da7f033dSHerbert Xu } 2392da7f033dSHerbert Xu }, { 2393da7f033dSHerbert Xu .alg = "michael_mic", 2394da7f033dSHerbert Xu .test = alg_test_hash, 2395da7f033dSHerbert Xu .suite = { 2396da7f033dSHerbert Xu .hash = { 2397da7f033dSHerbert Xu .vecs = michael_mic_tv_template, 2398da7f033dSHerbert Xu .count = MICHAEL_MIC_TEST_VECTORS 2399da7f033dSHerbert Xu } 2400da7f033dSHerbert Xu } 2401da7f033dSHerbert Xu }, { 2402ba0e14acSPuneet Saxena .alg = "ofb(aes)", 2403ba0e14acSPuneet Saxena .test = alg_test_skcipher, 2404ba0e14acSPuneet Saxena .fips_allowed = 1, 2405ba0e14acSPuneet Saxena .suite = { 2406ba0e14acSPuneet Saxena .cipher = { 2407ba0e14acSPuneet Saxena .enc = { 2408ba0e14acSPuneet Saxena .vecs = aes_ofb_enc_tv_template, 2409ba0e14acSPuneet Saxena .count = AES_OFB_ENC_TEST_VECTORS 2410ba0e14acSPuneet Saxena }, 2411ba0e14acSPuneet Saxena .dec = { 2412ba0e14acSPuneet Saxena .vecs = aes_ofb_dec_tv_template, 2413ba0e14acSPuneet Saxena .count = AES_OFB_DEC_TEST_VECTORS 2414ba0e14acSPuneet Saxena } 2415ba0e14acSPuneet Saxena } 2416ba0e14acSPuneet Saxena } 2417ba0e14acSPuneet Saxena }, { 2418da7f033dSHerbert Xu .alg = "pcbc(fcrypt)", 24191aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2420da7f033dSHerbert Xu .suite = { 2421da7f033dSHerbert Xu .cipher = { 2422da7f033dSHerbert Xu .enc = { 2423da7f033dSHerbert Xu .vecs = fcrypt_pcbc_enc_tv_template, 2424da7f033dSHerbert Xu .count = FCRYPT_ENC_TEST_VECTORS 2425da7f033dSHerbert Xu }, 2426da7f033dSHerbert Xu .dec = { 2427da7f033dSHerbert Xu .vecs = fcrypt_pcbc_dec_tv_template, 2428da7f033dSHerbert Xu .count = FCRYPT_DEC_TEST_VECTORS 2429da7f033dSHerbert Xu } 2430da7f033dSHerbert Xu } 2431da7f033dSHerbert Xu } 2432da7f033dSHerbert Xu }, { 2433da7f033dSHerbert Xu .alg = "rfc3686(ctr(aes))", 24341aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2435a1915d51SJarod Wilson .fips_allowed = 1, 2436da7f033dSHerbert Xu .suite = { 2437da7f033dSHerbert Xu .cipher = { 2438da7f033dSHerbert Xu .enc = { 2439f7cb80f2SJarod Wilson .vecs = aes_ctr_rfc3686_enc_tv_template, 2440f7cb80f2SJarod Wilson .count = AES_CTR_3686_ENC_TEST_VECTORS 2441da7f033dSHerbert Xu }, 2442da7f033dSHerbert Xu .dec = { 2443f7cb80f2SJarod Wilson .vecs = aes_ctr_rfc3686_dec_tv_template, 2444f7cb80f2SJarod Wilson .count = AES_CTR_3686_DEC_TEST_VECTORS 2445da7f033dSHerbert Xu } 2446da7f033dSHerbert Xu } 2447da7f033dSHerbert Xu } 2448da7f033dSHerbert Xu }, { 244969435b94SAdrian Hoban .alg = "rfc4106(gcm(aes))", 245069435b94SAdrian Hoban .test = alg_test_aead, 245169435b94SAdrian Hoban .suite = { 245269435b94SAdrian Hoban .aead = { 245369435b94SAdrian Hoban .enc = { 245469435b94SAdrian Hoban .vecs = aes_gcm_rfc4106_enc_tv_template, 245569435b94SAdrian Hoban .count = AES_GCM_4106_ENC_TEST_VECTORS 245669435b94SAdrian Hoban }, 245769435b94SAdrian Hoban .dec = { 245869435b94SAdrian Hoban .vecs = aes_gcm_rfc4106_dec_tv_template, 245969435b94SAdrian Hoban .count = AES_GCM_4106_DEC_TEST_VECTORS 246069435b94SAdrian Hoban } 246169435b94SAdrian Hoban } 246269435b94SAdrian Hoban } 246369435b94SAdrian Hoban }, { 246469435b94SAdrian Hoban 246569435b94SAdrian Hoban 24665d667322SJarod Wilson .alg = "rfc4309(ccm(aes))", 24675d667322SJarod Wilson .test = alg_test_aead, 2468a1915d51SJarod Wilson .fips_allowed = 1, 24695d667322SJarod Wilson .suite = { 24705d667322SJarod Wilson .aead = { 24715d667322SJarod Wilson .enc = { 24725d667322SJarod Wilson .vecs = aes_ccm_rfc4309_enc_tv_template, 24735d667322SJarod Wilson .count = AES_CCM_4309_ENC_TEST_VECTORS 24745d667322SJarod Wilson }, 24755d667322SJarod Wilson .dec = { 24765d667322SJarod Wilson .vecs = aes_ccm_rfc4309_dec_tv_template, 24775d667322SJarod Wilson .count = AES_CCM_4309_DEC_TEST_VECTORS 24785d667322SJarod Wilson } 24795d667322SJarod Wilson } 24805d667322SJarod Wilson } 24815d667322SJarod Wilson }, { 2482da7f033dSHerbert Xu .alg = "rmd128", 2483da7f033dSHerbert Xu .test = alg_test_hash, 2484da7f033dSHerbert Xu .suite = { 2485da7f033dSHerbert Xu .hash = { 2486da7f033dSHerbert Xu .vecs = rmd128_tv_template, 2487da7f033dSHerbert Xu .count = RMD128_TEST_VECTORS 2488da7f033dSHerbert Xu } 2489da7f033dSHerbert Xu } 2490da7f033dSHerbert Xu }, { 2491da7f033dSHerbert Xu .alg = "rmd160", 2492da7f033dSHerbert Xu .test = alg_test_hash, 2493da7f033dSHerbert Xu .suite = { 2494da7f033dSHerbert Xu .hash = { 2495da7f033dSHerbert Xu .vecs = rmd160_tv_template, 2496da7f033dSHerbert Xu .count = RMD160_TEST_VECTORS 2497da7f033dSHerbert Xu } 2498da7f033dSHerbert Xu } 2499da7f033dSHerbert Xu }, { 2500da7f033dSHerbert Xu .alg = "rmd256", 2501da7f033dSHerbert Xu .test = alg_test_hash, 2502da7f033dSHerbert Xu .suite = { 2503da7f033dSHerbert Xu .hash = { 2504da7f033dSHerbert Xu .vecs = rmd256_tv_template, 2505da7f033dSHerbert Xu .count = RMD256_TEST_VECTORS 2506da7f033dSHerbert Xu } 2507da7f033dSHerbert Xu } 2508da7f033dSHerbert Xu }, { 2509da7f033dSHerbert Xu .alg = "rmd320", 2510da7f033dSHerbert Xu .test = alg_test_hash, 2511da7f033dSHerbert Xu .suite = { 2512da7f033dSHerbert Xu .hash = { 2513da7f033dSHerbert Xu .vecs = rmd320_tv_template, 2514da7f033dSHerbert Xu .count = RMD320_TEST_VECTORS 2515da7f033dSHerbert Xu } 2516da7f033dSHerbert Xu } 2517da7f033dSHerbert Xu }, { 2518da7f033dSHerbert Xu .alg = "salsa20", 25191aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2520da7f033dSHerbert Xu .suite = { 2521da7f033dSHerbert Xu .cipher = { 2522da7f033dSHerbert Xu .enc = { 2523da7f033dSHerbert Xu .vecs = salsa20_stream_enc_tv_template, 2524da7f033dSHerbert Xu .count = SALSA20_STREAM_ENC_TEST_VECTORS 2525da7f033dSHerbert Xu } 2526da7f033dSHerbert Xu } 2527da7f033dSHerbert Xu } 2528da7f033dSHerbert Xu }, { 2529da7f033dSHerbert Xu .alg = "sha1", 2530da7f033dSHerbert Xu .test = alg_test_hash, 2531a1915d51SJarod Wilson .fips_allowed = 1, 2532da7f033dSHerbert Xu .suite = { 2533da7f033dSHerbert Xu .hash = { 2534da7f033dSHerbert Xu .vecs = sha1_tv_template, 2535da7f033dSHerbert Xu .count = SHA1_TEST_VECTORS 2536da7f033dSHerbert Xu } 2537da7f033dSHerbert Xu } 2538da7f033dSHerbert Xu }, { 2539da7f033dSHerbert Xu .alg = "sha224", 2540da7f033dSHerbert Xu .test = alg_test_hash, 2541a1915d51SJarod Wilson .fips_allowed = 1, 2542da7f033dSHerbert Xu .suite = { 2543da7f033dSHerbert Xu .hash = { 2544da7f033dSHerbert Xu .vecs = sha224_tv_template, 2545da7f033dSHerbert Xu .count = SHA224_TEST_VECTORS 2546da7f033dSHerbert Xu } 2547da7f033dSHerbert Xu } 2548da7f033dSHerbert Xu }, { 2549da7f033dSHerbert Xu .alg = "sha256", 2550da7f033dSHerbert Xu .test = alg_test_hash, 2551a1915d51SJarod Wilson .fips_allowed = 1, 2552da7f033dSHerbert Xu .suite = { 2553da7f033dSHerbert Xu .hash = { 2554da7f033dSHerbert Xu .vecs = sha256_tv_template, 2555da7f033dSHerbert Xu .count = SHA256_TEST_VECTORS 2556da7f033dSHerbert Xu } 2557da7f033dSHerbert Xu } 2558da7f033dSHerbert Xu }, { 2559da7f033dSHerbert Xu .alg = "sha384", 2560da7f033dSHerbert Xu .test = alg_test_hash, 2561a1915d51SJarod Wilson .fips_allowed = 1, 2562da7f033dSHerbert Xu .suite = { 2563da7f033dSHerbert Xu .hash = { 2564da7f033dSHerbert Xu .vecs = sha384_tv_template, 2565da7f033dSHerbert Xu .count = SHA384_TEST_VECTORS 2566da7f033dSHerbert Xu } 2567da7f033dSHerbert Xu } 2568da7f033dSHerbert Xu }, { 2569da7f033dSHerbert Xu .alg = "sha512", 2570da7f033dSHerbert Xu .test = alg_test_hash, 2571a1915d51SJarod Wilson .fips_allowed = 1, 2572da7f033dSHerbert Xu .suite = { 2573da7f033dSHerbert Xu .hash = { 2574da7f033dSHerbert Xu .vecs = sha512_tv_template, 2575da7f033dSHerbert Xu .count = SHA512_TEST_VECTORS 2576da7f033dSHerbert Xu } 2577da7f033dSHerbert Xu } 2578da7f033dSHerbert Xu }, { 2579da7f033dSHerbert Xu .alg = "tgr128", 2580da7f033dSHerbert Xu .test = alg_test_hash, 2581da7f033dSHerbert Xu .suite = { 2582da7f033dSHerbert Xu .hash = { 2583da7f033dSHerbert Xu .vecs = tgr128_tv_template, 2584da7f033dSHerbert Xu .count = TGR128_TEST_VECTORS 2585da7f033dSHerbert Xu } 2586da7f033dSHerbert Xu } 2587da7f033dSHerbert Xu }, { 2588da7f033dSHerbert Xu .alg = "tgr160", 2589da7f033dSHerbert Xu .test = alg_test_hash, 2590da7f033dSHerbert Xu .suite = { 2591da7f033dSHerbert Xu .hash = { 2592da7f033dSHerbert Xu .vecs = tgr160_tv_template, 2593da7f033dSHerbert Xu .count = TGR160_TEST_VECTORS 2594da7f033dSHerbert Xu } 2595da7f033dSHerbert Xu } 2596da7f033dSHerbert Xu }, { 2597da7f033dSHerbert Xu .alg = "tgr192", 2598da7f033dSHerbert Xu .test = alg_test_hash, 2599da7f033dSHerbert Xu .suite = { 2600da7f033dSHerbert Xu .hash = { 2601da7f033dSHerbert Xu .vecs = tgr192_tv_template, 2602da7f033dSHerbert Xu .count = TGR192_TEST_VECTORS 2603da7f033dSHerbert Xu } 2604da7f033dSHerbert Xu } 2605da7f033dSHerbert Xu }, { 2606f1939f7cSShane Wang .alg = "vmac(aes)", 2607f1939f7cSShane Wang .test = alg_test_hash, 2608f1939f7cSShane Wang .suite = { 2609f1939f7cSShane Wang .hash = { 2610f1939f7cSShane Wang .vecs = aes_vmac128_tv_template, 2611f1939f7cSShane Wang .count = VMAC_AES_TEST_VECTORS 2612f1939f7cSShane Wang } 2613f1939f7cSShane Wang } 2614f1939f7cSShane Wang }, { 2615da7f033dSHerbert Xu .alg = "wp256", 2616da7f033dSHerbert Xu .test = alg_test_hash, 2617da7f033dSHerbert Xu .suite = { 2618da7f033dSHerbert Xu .hash = { 2619da7f033dSHerbert Xu .vecs = wp256_tv_template, 2620da7f033dSHerbert Xu .count = WP256_TEST_VECTORS 2621da7f033dSHerbert Xu } 2622da7f033dSHerbert Xu } 2623da7f033dSHerbert Xu }, { 2624da7f033dSHerbert Xu .alg = "wp384", 2625da7f033dSHerbert Xu .test = alg_test_hash, 2626da7f033dSHerbert Xu .suite = { 2627da7f033dSHerbert Xu .hash = { 2628da7f033dSHerbert Xu .vecs = wp384_tv_template, 2629da7f033dSHerbert Xu .count = WP384_TEST_VECTORS 2630da7f033dSHerbert Xu } 2631da7f033dSHerbert Xu } 2632da7f033dSHerbert Xu }, { 2633da7f033dSHerbert Xu .alg = "wp512", 2634da7f033dSHerbert Xu .test = alg_test_hash, 2635da7f033dSHerbert Xu .suite = { 2636da7f033dSHerbert Xu .hash = { 2637da7f033dSHerbert Xu .vecs = wp512_tv_template, 2638da7f033dSHerbert Xu .count = WP512_TEST_VECTORS 2639da7f033dSHerbert Xu } 2640da7f033dSHerbert Xu } 2641da7f033dSHerbert Xu }, { 2642da7f033dSHerbert Xu .alg = "xcbc(aes)", 2643da7f033dSHerbert Xu .test = alg_test_hash, 2644da7f033dSHerbert Xu .suite = { 2645da7f033dSHerbert Xu .hash = { 2646da7f033dSHerbert Xu .vecs = aes_xcbc128_tv_template, 2647da7f033dSHerbert Xu .count = XCBC_AES_TEST_VECTORS 2648da7f033dSHerbert Xu } 2649da7f033dSHerbert Xu } 2650da7f033dSHerbert Xu }, { 2651da7f033dSHerbert Xu .alg = "xts(aes)", 26521aa4ecd9SHerbert Xu .test = alg_test_skcipher, 26532918aa8dSJarod Wilson .fips_allowed = 1, 2654da7f033dSHerbert Xu .suite = { 2655da7f033dSHerbert Xu .cipher = { 2656da7f033dSHerbert Xu .enc = { 2657da7f033dSHerbert Xu .vecs = aes_xts_enc_tv_template, 2658da7f033dSHerbert Xu .count = AES_XTS_ENC_TEST_VECTORS 2659da7f033dSHerbert Xu }, 2660da7f033dSHerbert Xu .dec = { 2661da7f033dSHerbert Xu .vecs = aes_xts_dec_tv_template, 2662da7f033dSHerbert Xu .count = AES_XTS_DEC_TEST_VECTORS 2663da7f033dSHerbert Xu } 2664da7f033dSHerbert Xu } 2665da7f033dSHerbert Xu } 26660c01aed5SGeert Uytterhoeven }, { 26670840605eSJussi Kivilinna .alg = "xts(camellia)", 26680840605eSJussi Kivilinna .test = alg_test_skcipher, 26690840605eSJussi Kivilinna .suite = { 26700840605eSJussi Kivilinna .cipher = { 26710840605eSJussi Kivilinna .enc = { 26720840605eSJussi Kivilinna .vecs = camellia_xts_enc_tv_template, 26730840605eSJussi Kivilinna .count = CAMELLIA_XTS_ENC_TEST_VECTORS 26740840605eSJussi Kivilinna }, 26750840605eSJussi Kivilinna .dec = { 26760840605eSJussi Kivilinna .vecs = camellia_xts_dec_tv_template, 26770840605eSJussi Kivilinna .count = CAMELLIA_XTS_DEC_TEST_VECTORS 26780840605eSJussi Kivilinna } 26790840605eSJussi Kivilinna } 26800840605eSJussi Kivilinna } 26810840605eSJussi Kivilinna }, { 268218be20b9SJussi Kivilinna .alg = "xts(serpent)", 268318be20b9SJussi Kivilinna .test = alg_test_skcipher, 268418be20b9SJussi Kivilinna .suite = { 268518be20b9SJussi Kivilinna .cipher = { 268618be20b9SJussi Kivilinna .enc = { 268718be20b9SJussi Kivilinna .vecs = serpent_xts_enc_tv_template, 268818be20b9SJussi Kivilinna .count = SERPENT_XTS_ENC_TEST_VECTORS 268918be20b9SJussi Kivilinna }, 269018be20b9SJussi Kivilinna .dec = { 269118be20b9SJussi Kivilinna .vecs = serpent_xts_dec_tv_template, 269218be20b9SJussi Kivilinna .count = SERPENT_XTS_DEC_TEST_VECTORS 269318be20b9SJussi Kivilinna } 269418be20b9SJussi Kivilinna } 269518be20b9SJussi Kivilinna } 269618be20b9SJussi Kivilinna }, { 2697aed265b9SJussi Kivilinna .alg = "xts(twofish)", 2698aed265b9SJussi Kivilinna .test = alg_test_skcipher, 2699aed265b9SJussi Kivilinna .suite = { 2700aed265b9SJussi Kivilinna .cipher = { 2701aed265b9SJussi Kivilinna .enc = { 2702aed265b9SJussi Kivilinna .vecs = tf_xts_enc_tv_template, 2703aed265b9SJussi Kivilinna .count = TF_XTS_ENC_TEST_VECTORS 2704aed265b9SJussi Kivilinna }, 2705aed265b9SJussi Kivilinna .dec = { 2706aed265b9SJussi Kivilinna .vecs = tf_xts_dec_tv_template, 2707aed265b9SJussi Kivilinna .count = TF_XTS_DEC_TEST_VECTORS 2708aed265b9SJussi Kivilinna } 2709aed265b9SJussi Kivilinna } 2710aed265b9SJussi Kivilinna } 2711aed265b9SJussi Kivilinna }, { 27120c01aed5SGeert Uytterhoeven .alg = "zlib", 27130c01aed5SGeert Uytterhoeven .test = alg_test_pcomp, 27140c01aed5SGeert Uytterhoeven .suite = { 27150c01aed5SGeert Uytterhoeven .pcomp = { 27160c01aed5SGeert Uytterhoeven .comp = { 27170c01aed5SGeert Uytterhoeven .vecs = zlib_comp_tv_template, 27180c01aed5SGeert Uytterhoeven .count = ZLIB_COMP_TEST_VECTORS 27190c01aed5SGeert Uytterhoeven }, 27200c01aed5SGeert Uytterhoeven .decomp = { 27210c01aed5SGeert Uytterhoeven .vecs = zlib_decomp_tv_template, 27220c01aed5SGeert Uytterhoeven .count = ZLIB_DECOMP_TEST_VECTORS 27230c01aed5SGeert Uytterhoeven } 27240c01aed5SGeert Uytterhoeven } 27250c01aed5SGeert Uytterhoeven } 2726da7f033dSHerbert Xu } 2727da7f033dSHerbert Xu }; 2728da7f033dSHerbert Xu 27291aa4ecd9SHerbert Xu static int alg_find_test(const char *alg) 2730da7f033dSHerbert Xu { 2731da7f033dSHerbert Xu int start = 0; 2732da7f033dSHerbert Xu int end = ARRAY_SIZE(alg_test_descs); 2733da7f033dSHerbert Xu 2734da7f033dSHerbert Xu while (start < end) { 2735da7f033dSHerbert Xu int i = (start + end) / 2; 2736da7f033dSHerbert Xu int diff = strcmp(alg_test_descs[i].alg, alg); 2737da7f033dSHerbert Xu 2738da7f033dSHerbert Xu if (diff > 0) { 2739da7f033dSHerbert Xu end = i; 2740da7f033dSHerbert Xu continue; 2741da7f033dSHerbert Xu } 2742da7f033dSHerbert Xu 2743da7f033dSHerbert Xu if (diff < 0) { 2744da7f033dSHerbert Xu start = i + 1; 2745da7f033dSHerbert Xu continue; 2746da7f033dSHerbert Xu } 2747da7f033dSHerbert Xu 27481aa4ecd9SHerbert Xu return i; 2749da7f033dSHerbert Xu } 2750da7f033dSHerbert Xu 27511aa4ecd9SHerbert Xu return -1; 27521aa4ecd9SHerbert Xu } 27531aa4ecd9SHerbert Xu 27541aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 27551aa4ecd9SHerbert Xu { 27561aa4ecd9SHerbert Xu int i; 2757a68f6610SHerbert Xu int j; 2758d12d6b6dSNeil Horman int rc; 27591aa4ecd9SHerbert Xu 27601aa4ecd9SHerbert Xu if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) { 27611aa4ecd9SHerbert Xu char nalg[CRYPTO_MAX_ALG_NAME]; 27621aa4ecd9SHerbert Xu 27631aa4ecd9SHerbert Xu if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >= 27641aa4ecd9SHerbert Xu sizeof(nalg)) 27651aa4ecd9SHerbert Xu return -ENAMETOOLONG; 27661aa4ecd9SHerbert Xu 27671aa4ecd9SHerbert Xu i = alg_find_test(nalg); 27681aa4ecd9SHerbert Xu if (i < 0) 27691aa4ecd9SHerbert Xu goto notest; 27701aa4ecd9SHerbert Xu 2771a3bef3a3SJarod Wilson if (fips_enabled && !alg_test_descs[i].fips_allowed) 2772a3bef3a3SJarod Wilson goto non_fips_alg; 2773a3bef3a3SJarod Wilson 2774941fb328SJarod Wilson rc = alg_test_cipher(alg_test_descs + i, driver, type, mask); 2775941fb328SJarod Wilson goto test_done; 27761aa4ecd9SHerbert Xu } 27771aa4ecd9SHerbert Xu 27781aa4ecd9SHerbert Xu i = alg_find_test(alg); 2779a68f6610SHerbert Xu j = alg_find_test(driver); 2780a68f6610SHerbert Xu if (i < 0 && j < 0) 27811aa4ecd9SHerbert Xu goto notest; 27821aa4ecd9SHerbert Xu 2783a68f6610SHerbert Xu if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) || 2784a68f6610SHerbert Xu (j >= 0 && !alg_test_descs[j].fips_allowed))) 2785a3bef3a3SJarod Wilson goto non_fips_alg; 2786a3bef3a3SJarod Wilson 2787a68f6610SHerbert Xu rc = 0; 2788a68f6610SHerbert Xu if (i >= 0) 2789a68f6610SHerbert Xu rc |= alg_test_descs[i].test(alg_test_descs + i, driver, 27901aa4ecd9SHerbert Xu type, mask); 2791a68f6610SHerbert Xu if (j >= 0) 2792a68f6610SHerbert Xu rc |= alg_test_descs[j].test(alg_test_descs + j, driver, 2793a68f6610SHerbert Xu type, mask); 2794a68f6610SHerbert Xu 2795941fb328SJarod Wilson test_done: 2796d12d6b6dSNeil Horman if (fips_enabled && rc) 2797d12d6b6dSNeil Horman panic("%s: %s alg self test failed in fips mode!\n", driver, alg); 2798d12d6b6dSNeil Horman 279929ecd4abSJarod Wilson if (fips_enabled && !rc) 280029ecd4abSJarod Wilson printk(KERN_INFO "alg: self-tests for %s (%s) passed\n", 280129ecd4abSJarod Wilson driver, alg); 280229ecd4abSJarod Wilson 2803d12d6b6dSNeil Horman return rc; 28041aa4ecd9SHerbert Xu 28051aa4ecd9SHerbert Xu notest: 2806da7f033dSHerbert Xu printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver); 2807da7f033dSHerbert Xu return 0; 2808a3bef3a3SJarod Wilson non_fips_alg: 2809a3bef3a3SJarod Wilson return -EINVAL; 2810da7f033dSHerbert Xu } 28110b767f96SAlexander Shishkin 2812326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */ 28130b767f96SAlexander Shishkin 2814da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test); 2815