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 * 9da7f033dSHerbert Xu * This program is free software; you can redistribute it and/or modify it 10da7f033dSHerbert Xu * under the terms of the GNU General Public License as published by the Free 11da7f033dSHerbert Xu * Software Foundation; either version 2 of the License, or (at your option) 12da7f033dSHerbert Xu * any later version. 13da7f033dSHerbert Xu * 14da7f033dSHerbert Xu */ 15da7f033dSHerbert Xu 16da7f033dSHerbert Xu #include <crypto/hash.h> 17da7f033dSHerbert Xu #include <linux/err.h> 18da7f033dSHerbert Xu #include <linux/module.h> 19da7f033dSHerbert Xu #include <linux/scatterlist.h> 20da7f033dSHerbert Xu #include <linux/slab.h> 21da7f033dSHerbert Xu #include <linux/string.h> 227647d6ceSJarod Wilson #include <crypto/rng.h> 23da7f033dSHerbert Xu 24da7f033dSHerbert Xu #include "internal.h" 25da7f033dSHerbert Xu #include "testmgr.h" 26da7f033dSHerbert Xu 27da7f033dSHerbert Xu /* 28da7f033dSHerbert Xu * Need slab memory for testing (size in number of pages). 29da7f033dSHerbert Xu */ 30da7f033dSHerbert Xu #define XBUFSIZE 8 31da7f033dSHerbert Xu 32da7f033dSHerbert Xu /* 33da7f033dSHerbert Xu * Indexes into the xbuf to simulate cross-page access. 34da7f033dSHerbert Xu */ 35da7f033dSHerbert Xu #define IDX1 32 36da7f033dSHerbert Xu #define IDX2 32400 37da7f033dSHerbert Xu #define IDX3 1 38da7f033dSHerbert Xu #define IDX4 8193 39da7f033dSHerbert Xu #define IDX5 22222 40da7f033dSHerbert Xu #define IDX6 17101 41da7f033dSHerbert Xu #define IDX7 27333 42da7f033dSHerbert Xu #define IDX8 3000 43da7f033dSHerbert Xu 44da7f033dSHerbert Xu /* 45da7f033dSHerbert Xu * Used by test_cipher() 46da7f033dSHerbert Xu */ 47da7f033dSHerbert Xu #define ENCRYPT 1 48da7f033dSHerbert Xu #define DECRYPT 0 49da7f033dSHerbert Xu 50da7f033dSHerbert Xu struct tcrypt_result { 51da7f033dSHerbert Xu struct completion completion; 52da7f033dSHerbert Xu int err; 53da7f033dSHerbert Xu }; 54da7f033dSHerbert Xu 55da7f033dSHerbert Xu struct aead_test_suite { 56da7f033dSHerbert Xu struct { 57da7f033dSHerbert Xu struct aead_testvec *vecs; 58da7f033dSHerbert Xu unsigned int count; 59da7f033dSHerbert Xu } enc, dec; 60da7f033dSHerbert Xu }; 61da7f033dSHerbert Xu 62da7f033dSHerbert Xu struct cipher_test_suite { 63da7f033dSHerbert Xu struct { 64da7f033dSHerbert Xu struct cipher_testvec *vecs; 65da7f033dSHerbert Xu unsigned int count; 66da7f033dSHerbert Xu } enc, dec; 67da7f033dSHerbert Xu }; 68da7f033dSHerbert Xu 69da7f033dSHerbert Xu struct comp_test_suite { 70da7f033dSHerbert Xu struct { 71da7f033dSHerbert Xu struct comp_testvec *vecs; 72da7f033dSHerbert Xu unsigned int count; 73da7f033dSHerbert Xu } comp, decomp; 74da7f033dSHerbert Xu }; 75da7f033dSHerbert Xu 768064efb8SGeert Uytterhoeven struct pcomp_test_suite { 778064efb8SGeert Uytterhoeven struct { 788064efb8SGeert Uytterhoeven struct pcomp_testvec *vecs; 798064efb8SGeert Uytterhoeven unsigned int count; 808064efb8SGeert Uytterhoeven } comp, decomp; 818064efb8SGeert Uytterhoeven }; 828064efb8SGeert Uytterhoeven 83da7f033dSHerbert Xu struct hash_test_suite { 84da7f033dSHerbert Xu struct hash_testvec *vecs; 85da7f033dSHerbert Xu unsigned int count; 86da7f033dSHerbert Xu }; 87da7f033dSHerbert Xu 887647d6ceSJarod Wilson struct cprng_test_suite { 897647d6ceSJarod Wilson struct cprng_testvec *vecs; 907647d6ceSJarod Wilson unsigned int count; 917647d6ceSJarod Wilson }; 927647d6ceSJarod Wilson 93da7f033dSHerbert Xu struct alg_test_desc { 94da7f033dSHerbert Xu const char *alg; 95da7f033dSHerbert Xu int (*test)(const struct alg_test_desc *desc, const char *driver, 96da7f033dSHerbert Xu u32 type, u32 mask); 97a1915d51SJarod Wilson int fips_allowed; /* set if alg is allowed in fips mode */ 98da7f033dSHerbert Xu 99da7f033dSHerbert Xu union { 100da7f033dSHerbert Xu struct aead_test_suite aead; 101da7f033dSHerbert Xu struct cipher_test_suite cipher; 102da7f033dSHerbert Xu struct comp_test_suite comp; 1038064efb8SGeert Uytterhoeven struct pcomp_test_suite pcomp; 104da7f033dSHerbert Xu struct hash_test_suite hash; 1057647d6ceSJarod Wilson struct cprng_test_suite cprng; 106da7f033dSHerbert Xu } suite; 107da7f033dSHerbert Xu }; 108da7f033dSHerbert Xu 109da7f033dSHerbert Xu static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 }; 110da7f033dSHerbert Xu 111da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len) 112da7f033dSHerbert Xu { 113da7f033dSHerbert Xu print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET, 114da7f033dSHerbert Xu 16, 1, 115da7f033dSHerbert Xu buf, len, false); 116da7f033dSHerbert Xu } 117da7f033dSHerbert Xu 118da7f033dSHerbert Xu static void tcrypt_complete(struct crypto_async_request *req, int err) 119da7f033dSHerbert Xu { 120da7f033dSHerbert Xu struct tcrypt_result *res = req->data; 121da7f033dSHerbert Xu 122da7f033dSHerbert Xu if (err == -EINPROGRESS) 123da7f033dSHerbert Xu return; 124da7f033dSHerbert Xu 125da7f033dSHerbert Xu res->err = err; 126da7f033dSHerbert Xu complete(&res->completion); 127da7f033dSHerbert Xu } 128da7f033dSHerbert Xu 129f8b0d4d0SHerbert Xu static int testmgr_alloc_buf(char *buf[XBUFSIZE]) 130f8b0d4d0SHerbert Xu { 131f8b0d4d0SHerbert Xu int i; 132f8b0d4d0SHerbert Xu 133f8b0d4d0SHerbert Xu for (i = 0; i < XBUFSIZE; i++) { 134f8b0d4d0SHerbert Xu buf[i] = (void *)__get_free_page(GFP_KERNEL); 135f8b0d4d0SHerbert Xu if (!buf[i]) 136f8b0d4d0SHerbert Xu goto err_free_buf; 137f8b0d4d0SHerbert Xu } 138f8b0d4d0SHerbert Xu 139f8b0d4d0SHerbert Xu return 0; 140f8b0d4d0SHerbert Xu 141f8b0d4d0SHerbert Xu err_free_buf: 142f8b0d4d0SHerbert Xu while (i-- > 0) 143f8b0d4d0SHerbert Xu free_page((unsigned long)buf[i]); 144f8b0d4d0SHerbert Xu 145f8b0d4d0SHerbert Xu return -ENOMEM; 146f8b0d4d0SHerbert Xu } 147f8b0d4d0SHerbert Xu 148f8b0d4d0SHerbert Xu static void testmgr_free_buf(char *buf[XBUFSIZE]) 149f8b0d4d0SHerbert Xu { 150f8b0d4d0SHerbert Xu int i; 151f8b0d4d0SHerbert Xu 152f8b0d4d0SHerbert Xu for (i = 0; i < XBUFSIZE; i++) 153f8b0d4d0SHerbert Xu free_page((unsigned long)buf[i]); 154f8b0d4d0SHerbert Xu } 155f8b0d4d0SHerbert Xu 156da7f033dSHerbert Xu static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template, 157da7f033dSHerbert Xu unsigned int tcount) 158da7f033dSHerbert Xu { 159da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm)); 160da7f033dSHerbert Xu unsigned int i, j, k, temp; 161da7f033dSHerbert Xu struct scatterlist sg[8]; 162da7f033dSHerbert Xu char result[64]; 163da7f033dSHerbert Xu struct ahash_request *req; 164da7f033dSHerbert Xu struct tcrypt_result tresult; 165da7f033dSHerbert Xu void *hash_buff; 166f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 167f8b0d4d0SHerbert Xu int ret = -ENOMEM; 168f8b0d4d0SHerbert Xu 169f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 170f8b0d4d0SHerbert Xu goto out_nobuf; 171da7f033dSHerbert Xu 172da7f033dSHerbert Xu init_completion(&tresult.completion); 173da7f033dSHerbert Xu 174da7f033dSHerbert Xu req = ahash_request_alloc(tfm, GFP_KERNEL); 175da7f033dSHerbert Xu if (!req) { 176da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to allocate request for " 177da7f033dSHerbert Xu "%s\n", algo); 178da7f033dSHerbert Xu goto out_noreq; 179da7f033dSHerbert Xu } 180da7f033dSHerbert Xu ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 181da7f033dSHerbert Xu tcrypt_complete, &tresult); 182da7f033dSHerbert Xu 183a0cfae59SHerbert Xu j = 0; 184da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 185a0cfae59SHerbert Xu if (template[i].np) 186a0cfae59SHerbert Xu continue; 187a0cfae59SHerbert Xu 188a0cfae59SHerbert Xu j++; 189da7f033dSHerbert Xu memset(result, 0, 64); 190da7f033dSHerbert Xu 191da7f033dSHerbert Xu hash_buff = xbuf[0]; 192da7f033dSHerbert Xu 193da7f033dSHerbert Xu memcpy(hash_buff, template[i].plaintext, template[i].psize); 194da7f033dSHerbert Xu sg_init_one(&sg[0], hash_buff, template[i].psize); 195da7f033dSHerbert Xu 196da7f033dSHerbert Xu if (template[i].ksize) { 197da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 198da7f033dSHerbert Xu ret = crypto_ahash_setkey(tfm, template[i].key, 199da7f033dSHerbert Xu template[i].ksize); 200da7f033dSHerbert Xu if (ret) { 201da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey failed on " 202a0cfae59SHerbert Xu "test %d for %s: ret=%d\n", j, algo, 203da7f033dSHerbert Xu -ret); 204da7f033dSHerbert Xu goto out; 205da7f033dSHerbert Xu } 206da7f033dSHerbert Xu } 207da7f033dSHerbert Xu 208da7f033dSHerbert Xu ahash_request_set_crypt(req, sg, result, template[i].psize); 209da7f033dSHerbert Xu ret = crypto_ahash_digest(req); 210da7f033dSHerbert Xu switch (ret) { 211da7f033dSHerbert Xu case 0: 212da7f033dSHerbert Xu break; 213da7f033dSHerbert Xu case -EINPROGRESS: 214da7f033dSHerbert Xu case -EBUSY: 215da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 216da7f033dSHerbert Xu &tresult.completion); 217da7f033dSHerbert Xu if (!ret && !(ret = tresult.err)) { 218da7f033dSHerbert Xu INIT_COMPLETION(tresult.completion); 219da7f033dSHerbert Xu break; 220da7f033dSHerbert Xu } 221da7f033dSHerbert Xu /* fall through */ 222da7f033dSHerbert Xu default: 223da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: digest failed on test %d " 224a0cfae59SHerbert Xu "for %s: ret=%d\n", j, algo, -ret); 225da7f033dSHerbert Xu goto out; 226da7f033dSHerbert Xu } 227da7f033dSHerbert Xu 228da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 229da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 230da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Test %d failed for %s\n", 231a0cfae59SHerbert Xu j, algo); 232da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 233da7f033dSHerbert Xu ret = -EINVAL; 234da7f033dSHerbert Xu goto out; 235da7f033dSHerbert Xu } 236da7f033dSHerbert Xu } 237da7f033dSHerbert Xu 238da7f033dSHerbert Xu j = 0; 239da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 240da7f033dSHerbert Xu if (template[i].np) { 241da7f033dSHerbert Xu j++; 242da7f033dSHerbert Xu memset(result, 0, 64); 243da7f033dSHerbert Xu 244da7f033dSHerbert Xu temp = 0; 245da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 246fd57f22aSHerbert Xu ret = -EINVAL; 247da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 248fd57f22aSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 249fd57f22aSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 250fd57f22aSHerbert Xu goto out; 251da7f033dSHerbert Xu sg_set_buf(&sg[k], 252da7f033dSHerbert Xu memcpy(xbuf[IDX[k] >> PAGE_SHIFT] + 253da7f033dSHerbert Xu offset_in_page(IDX[k]), 254da7f033dSHerbert Xu template[i].plaintext + temp, 255da7f033dSHerbert Xu template[i].tap[k]), 256da7f033dSHerbert Xu template[i].tap[k]); 257da7f033dSHerbert Xu temp += template[i].tap[k]; 258da7f033dSHerbert Xu } 259da7f033dSHerbert Xu 260da7f033dSHerbert Xu if (template[i].ksize) { 261da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 262da7f033dSHerbert Xu ret = crypto_ahash_setkey(tfm, template[i].key, 263da7f033dSHerbert Xu template[i].ksize); 264da7f033dSHerbert Xu 265da7f033dSHerbert Xu if (ret) { 266da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey " 267da7f033dSHerbert Xu "failed on chunking test %d " 268da7f033dSHerbert Xu "for %s: ret=%d\n", j, algo, 269da7f033dSHerbert Xu -ret); 270da7f033dSHerbert Xu goto out; 271da7f033dSHerbert Xu } 272da7f033dSHerbert Xu } 273da7f033dSHerbert Xu 274da7f033dSHerbert Xu ahash_request_set_crypt(req, sg, result, 275da7f033dSHerbert Xu template[i].psize); 276da7f033dSHerbert Xu ret = crypto_ahash_digest(req); 277da7f033dSHerbert Xu switch (ret) { 278da7f033dSHerbert Xu case 0: 279da7f033dSHerbert Xu break; 280da7f033dSHerbert Xu case -EINPROGRESS: 281da7f033dSHerbert Xu case -EBUSY: 282da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 283da7f033dSHerbert Xu &tresult.completion); 284da7f033dSHerbert Xu if (!ret && !(ret = tresult.err)) { 285da7f033dSHerbert Xu INIT_COMPLETION(tresult.completion); 286da7f033dSHerbert Xu break; 287da7f033dSHerbert Xu } 288da7f033dSHerbert Xu /* fall through */ 289da7f033dSHerbert Xu default: 290da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: digest failed " 291da7f033dSHerbert Xu "on chunking test %d for %s: " 292da7f033dSHerbert Xu "ret=%d\n", j, algo, -ret); 293da7f033dSHerbert Xu goto out; 294da7f033dSHerbert Xu } 295da7f033dSHerbert Xu 296da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 297da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 298da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Chunking test %d " 299da7f033dSHerbert Xu "failed for %s\n", j, algo); 300da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 301da7f033dSHerbert Xu ret = -EINVAL; 302da7f033dSHerbert Xu goto out; 303da7f033dSHerbert Xu } 304da7f033dSHerbert Xu } 305da7f033dSHerbert Xu } 306da7f033dSHerbert Xu 307da7f033dSHerbert Xu ret = 0; 308da7f033dSHerbert Xu 309da7f033dSHerbert Xu out: 310da7f033dSHerbert Xu ahash_request_free(req); 311da7f033dSHerbert Xu out_noreq: 312f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 313f8b0d4d0SHerbert Xu out_nobuf: 314da7f033dSHerbert Xu return ret; 315da7f033dSHerbert Xu } 316da7f033dSHerbert Xu 317da7f033dSHerbert Xu static int test_aead(struct crypto_aead *tfm, int enc, 318da7f033dSHerbert Xu struct aead_testvec *template, unsigned int tcount) 319da7f033dSHerbert Xu { 320da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)); 321da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 322f8b0d4d0SHerbert Xu int ret = -ENOMEM; 323da7f033dSHerbert Xu char *q; 324da7f033dSHerbert Xu char *key; 325da7f033dSHerbert Xu struct aead_request *req; 326da7f033dSHerbert Xu struct scatterlist sg[8]; 327da7f033dSHerbert Xu struct scatterlist asg[8]; 328da7f033dSHerbert Xu const char *e; 329da7f033dSHerbert Xu struct tcrypt_result result; 330da7f033dSHerbert Xu unsigned int authsize; 331da7f033dSHerbert Xu void *input; 332da7f033dSHerbert Xu void *assoc; 333da7f033dSHerbert Xu char iv[MAX_IVLEN]; 334f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 335f8b0d4d0SHerbert Xu char *axbuf[XBUFSIZE]; 336f8b0d4d0SHerbert Xu 337f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 338f8b0d4d0SHerbert Xu goto out_noxbuf; 339f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(axbuf)) 340f8b0d4d0SHerbert Xu goto out_noaxbuf; 341da7f033dSHerbert Xu 342da7f033dSHerbert Xu if (enc == ENCRYPT) 343da7f033dSHerbert Xu e = "encryption"; 344da7f033dSHerbert Xu else 345da7f033dSHerbert Xu e = "decryption"; 346da7f033dSHerbert Xu 347da7f033dSHerbert Xu init_completion(&result.completion); 348da7f033dSHerbert Xu 349da7f033dSHerbert Xu req = aead_request_alloc(tfm, GFP_KERNEL); 350da7f033dSHerbert Xu if (!req) { 351da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to allocate request for " 352da7f033dSHerbert Xu "%s\n", algo); 353da7f033dSHerbert Xu goto out; 354da7f033dSHerbert Xu } 355da7f033dSHerbert Xu 356da7f033dSHerbert Xu aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 357da7f033dSHerbert Xu tcrypt_complete, &result); 358da7f033dSHerbert Xu 359da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 360da7f033dSHerbert Xu if (!template[i].np) { 361da7f033dSHerbert Xu j++; 362da7f033dSHerbert Xu 363da7f033dSHerbert Xu /* some tepmplates have no input data but they will 364da7f033dSHerbert Xu * touch input 365da7f033dSHerbert Xu */ 366da7f033dSHerbert Xu input = xbuf[0]; 367da7f033dSHerbert Xu assoc = axbuf[0]; 368da7f033dSHerbert Xu 369fd57f22aSHerbert Xu ret = -EINVAL; 370fd57f22aSHerbert Xu if (WARN_ON(template[i].ilen > PAGE_SIZE || 371fd57f22aSHerbert Xu template[i].alen > PAGE_SIZE)) 372fd57f22aSHerbert Xu goto out; 373fd57f22aSHerbert Xu 374da7f033dSHerbert Xu memcpy(input, template[i].input, template[i].ilen); 375da7f033dSHerbert Xu memcpy(assoc, template[i].assoc, template[i].alen); 376da7f033dSHerbert Xu if (template[i].iv) 377da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 378da7f033dSHerbert Xu else 379da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 380da7f033dSHerbert Xu 381da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 382da7f033dSHerbert Xu if (template[i].wk) 383da7f033dSHerbert Xu crypto_aead_set_flags( 384da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 385da7f033dSHerbert Xu 386da7f033dSHerbert Xu key = template[i].key; 387da7f033dSHerbert Xu 388da7f033dSHerbert Xu ret = crypto_aead_setkey(tfm, key, 389da7f033dSHerbert Xu template[i].klen); 390da7f033dSHerbert Xu if (!ret == template[i].fail) { 391da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: setkey failed on " 392da7f033dSHerbert Xu "test %d for %s: flags=%x\n", j, algo, 393da7f033dSHerbert Xu crypto_aead_get_flags(tfm)); 394da7f033dSHerbert Xu goto out; 395da7f033dSHerbert Xu } else if (ret) 396da7f033dSHerbert Xu continue; 397da7f033dSHerbert Xu 398da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 399da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 400da7f033dSHerbert Xu if (ret) { 401da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to set " 402da7f033dSHerbert Xu "authsize to %u on test %d for %s\n", 403da7f033dSHerbert Xu authsize, j, algo); 404da7f033dSHerbert Xu goto out; 405da7f033dSHerbert Xu } 406da7f033dSHerbert Xu 407da7f033dSHerbert Xu sg_init_one(&sg[0], input, 408da7f033dSHerbert Xu template[i].ilen + (enc ? authsize : 0)); 409da7f033dSHerbert Xu 410da7f033dSHerbert Xu sg_init_one(&asg[0], assoc, template[i].alen); 411da7f033dSHerbert Xu 412da7f033dSHerbert Xu aead_request_set_crypt(req, sg, sg, 413da7f033dSHerbert Xu template[i].ilen, iv); 414da7f033dSHerbert Xu 415da7f033dSHerbert Xu aead_request_set_assoc(req, asg, template[i].alen); 416da7f033dSHerbert Xu 417da7f033dSHerbert Xu ret = enc ? 418da7f033dSHerbert Xu crypto_aead_encrypt(req) : 419da7f033dSHerbert Xu crypto_aead_decrypt(req); 420da7f033dSHerbert Xu 421da7f033dSHerbert Xu switch (ret) { 422da7f033dSHerbert Xu case 0: 423e44a1b44SJarod Wilson if (template[i].novrfy) { 424e44a1b44SJarod Wilson /* verification was supposed to fail */ 425e44a1b44SJarod Wilson printk(KERN_ERR "alg: aead: %s failed " 426e44a1b44SJarod Wilson "on test %d for %s: ret was 0, " 427e44a1b44SJarod Wilson "expected -EBADMSG\n", 428e44a1b44SJarod Wilson e, j, algo); 429e44a1b44SJarod Wilson /* so really, we got a bad message */ 430e44a1b44SJarod Wilson ret = -EBADMSG; 431e44a1b44SJarod Wilson goto out; 432e44a1b44SJarod Wilson } 433da7f033dSHerbert Xu break; 434da7f033dSHerbert Xu case -EINPROGRESS: 435da7f033dSHerbert Xu case -EBUSY: 436da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 437da7f033dSHerbert Xu &result.completion); 438da7f033dSHerbert Xu if (!ret && !(ret = result.err)) { 439da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 440da7f033dSHerbert Xu break; 441da7f033dSHerbert Xu } 442e44a1b44SJarod Wilson case -EBADMSG: 443e44a1b44SJarod Wilson if (template[i].novrfy) 444e44a1b44SJarod Wilson /* verification failure was expected */ 445e44a1b44SJarod Wilson continue; 446da7f033dSHerbert Xu /* fall through */ 447da7f033dSHerbert Xu default: 448da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: %s failed on test " 449da7f033dSHerbert Xu "%d for %s: ret=%d\n", e, j, algo, -ret); 450da7f033dSHerbert Xu goto out; 451da7f033dSHerbert Xu } 452da7f033dSHerbert Xu 453da7f033dSHerbert Xu q = input; 454da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 455da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Test %d failed on " 456da7f033dSHerbert Xu "%s for %s\n", j, e, algo); 457da7f033dSHerbert Xu hexdump(q, template[i].rlen); 458da7f033dSHerbert Xu ret = -EINVAL; 459da7f033dSHerbert Xu goto out; 460da7f033dSHerbert Xu } 461da7f033dSHerbert Xu } 462da7f033dSHerbert Xu } 463da7f033dSHerbert Xu 464da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 465da7f033dSHerbert Xu if (template[i].np) { 466da7f033dSHerbert Xu j++; 467da7f033dSHerbert Xu 468da7f033dSHerbert Xu if (template[i].iv) 469da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 470da7f033dSHerbert Xu else 471da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 472da7f033dSHerbert Xu 473da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 474da7f033dSHerbert Xu if (template[i].wk) 475da7f033dSHerbert Xu crypto_aead_set_flags( 476da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 477da7f033dSHerbert Xu key = template[i].key; 478da7f033dSHerbert Xu 479da7f033dSHerbert Xu ret = crypto_aead_setkey(tfm, key, template[i].klen); 480da7f033dSHerbert Xu if (!ret == template[i].fail) { 481da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: setkey failed on " 482da7f033dSHerbert Xu "chunk test %d for %s: flags=%x\n", j, 483da7f033dSHerbert Xu algo, crypto_aead_get_flags(tfm)); 484da7f033dSHerbert Xu goto out; 485da7f033dSHerbert Xu } else if (ret) 486da7f033dSHerbert Xu continue; 487da7f033dSHerbert Xu 488da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 489da7f033dSHerbert Xu 490da7f033dSHerbert Xu ret = -EINVAL; 491da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 492da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 493da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 494da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 495da7f033dSHerbert Xu goto out; 496da7f033dSHerbert Xu 497da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 498da7f033dSHerbert Xu offset_in_page(IDX[k]); 499da7f033dSHerbert Xu 500da7f033dSHerbert Xu memcpy(q, template[i].input + temp, 501da7f033dSHerbert Xu template[i].tap[k]); 502da7f033dSHerbert Xu 503da7f033dSHerbert Xu n = template[i].tap[k]; 504da7f033dSHerbert Xu if (k == template[i].np - 1 && enc) 505da7f033dSHerbert Xu n += authsize; 506da7f033dSHerbert Xu if (offset_in_page(q) + n < PAGE_SIZE) 507da7f033dSHerbert Xu q[n] = 0; 508da7f033dSHerbert Xu 509da7f033dSHerbert Xu sg_set_buf(&sg[k], q, template[i].tap[k]); 510da7f033dSHerbert Xu temp += template[i].tap[k]; 511da7f033dSHerbert Xu } 512da7f033dSHerbert Xu 513da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 514da7f033dSHerbert Xu if (ret) { 515da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to set " 516da7f033dSHerbert Xu "authsize to %u on chunk test %d for " 517da7f033dSHerbert Xu "%s\n", authsize, j, algo); 518da7f033dSHerbert Xu goto out; 519da7f033dSHerbert Xu } 520da7f033dSHerbert Xu 521da7f033dSHerbert Xu if (enc) { 522da7f033dSHerbert Xu if (WARN_ON(sg[k - 1].offset + 523da7f033dSHerbert Xu sg[k - 1].length + authsize > 524da7f033dSHerbert Xu PAGE_SIZE)) { 525da7f033dSHerbert Xu ret = -EINVAL; 526da7f033dSHerbert Xu goto out; 527da7f033dSHerbert Xu } 528da7f033dSHerbert Xu 529da7f033dSHerbert Xu sg[k - 1].length += authsize; 530da7f033dSHerbert Xu } 531da7f033dSHerbert Xu 532da7f033dSHerbert Xu sg_init_table(asg, template[i].anp); 533fd57f22aSHerbert Xu ret = -EINVAL; 534da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].anp; k++) { 535fd57f22aSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 536fd57f22aSHerbert Xu template[i].atap[k] > PAGE_SIZE)) 537fd57f22aSHerbert Xu goto out; 538da7f033dSHerbert Xu sg_set_buf(&asg[k], 539da7f033dSHerbert Xu memcpy(axbuf[IDX[k] >> PAGE_SHIFT] + 540da7f033dSHerbert Xu offset_in_page(IDX[k]), 541da7f033dSHerbert Xu template[i].assoc + temp, 542da7f033dSHerbert Xu template[i].atap[k]), 543da7f033dSHerbert Xu template[i].atap[k]); 544da7f033dSHerbert Xu temp += template[i].atap[k]; 545da7f033dSHerbert Xu } 546da7f033dSHerbert Xu 547da7f033dSHerbert Xu aead_request_set_crypt(req, sg, sg, 548da7f033dSHerbert Xu template[i].ilen, 549da7f033dSHerbert Xu iv); 550da7f033dSHerbert Xu 551da7f033dSHerbert Xu aead_request_set_assoc(req, asg, template[i].alen); 552da7f033dSHerbert Xu 553da7f033dSHerbert Xu ret = enc ? 554da7f033dSHerbert Xu crypto_aead_encrypt(req) : 555da7f033dSHerbert Xu crypto_aead_decrypt(req); 556da7f033dSHerbert Xu 557da7f033dSHerbert Xu switch (ret) { 558da7f033dSHerbert Xu case 0: 559e44a1b44SJarod Wilson if (template[i].novrfy) { 560e44a1b44SJarod Wilson /* verification was supposed to fail */ 561e44a1b44SJarod Wilson printk(KERN_ERR "alg: aead: %s failed " 562e44a1b44SJarod Wilson "on chunk test %d for %s: ret " 563e44a1b44SJarod Wilson "was 0, expected -EBADMSG\n", 564e44a1b44SJarod Wilson e, j, algo); 565e44a1b44SJarod Wilson /* so really, we got a bad message */ 566e44a1b44SJarod Wilson ret = -EBADMSG; 567e44a1b44SJarod Wilson goto out; 568e44a1b44SJarod Wilson } 569da7f033dSHerbert Xu break; 570da7f033dSHerbert Xu case -EINPROGRESS: 571da7f033dSHerbert Xu case -EBUSY: 572da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 573da7f033dSHerbert Xu &result.completion); 574da7f033dSHerbert Xu if (!ret && !(ret = result.err)) { 575da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 576da7f033dSHerbert Xu break; 577da7f033dSHerbert Xu } 578e44a1b44SJarod Wilson case -EBADMSG: 579e44a1b44SJarod Wilson if (template[i].novrfy) 580e44a1b44SJarod Wilson /* verification failure was expected */ 581e44a1b44SJarod Wilson continue; 582da7f033dSHerbert Xu /* fall through */ 583da7f033dSHerbert Xu default: 584da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: %s failed on " 585da7f033dSHerbert Xu "chunk test %d for %s: ret=%d\n", e, j, 586da7f033dSHerbert Xu algo, -ret); 587da7f033dSHerbert Xu goto out; 588da7f033dSHerbert Xu } 589da7f033dSHerbert Xu 590da7f033dSHerbert Xu ret = -EINVAL; 591da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 592da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 593da7f033dSHerbert Xu offset_in_page(IDX[k]); 594da7f033dSHerbert Xu 595da7f033dSHerbert Xu n = template[i].tap[k]; 596da7f033dSHerbert Xu if (k == template[i].np - 1) 597da7f033dSHerbert Xu n += enc ? authsize : -authsize; 598da7f033dSHerbert Xu 599da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, n)) { 600da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Chunk " 601da7f033dSHerbert Xu "test %d failed on %s at page " 602da7f033dSHerbert Xu "%u for %s\n", j, e, k, algo); 603da7f033dSHerbert Xu hexdump(q, n); 604da7f033dSHerbert Xu goto out; 605da7f033dSHerbert Xu } 606da7f033dSHerbert Xu 607da7f033dSHerbert Xu q += n; 608da7f033dSHerbert Xu if (k == template[i].np - 1 && !enc) { 609da7f033dSHerbert Xu if (memcmp(q, template[i].input + 610da7f033dSHerbert Xu temp + n, authsize)) 611da7f033dSHerbert Xu n = authsize; 612da7f033dSHerbert Xu else 613da7f033dSHerbert Xu n = 0; 614da7f033dSHerbert Xu } else { 615da7f033dSHerbert Xu for (n = 0; offset_in_page(q + n) && 616da7f033dSHerbert Xu q[n]; n++) 617da7f033dSHerbert Xu ; 618da7f033dSHerbert Xu } 619da7f033dSHerbert Xu if (n) { 620da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Result " 621da7f033dSHerbert Xu "buffer corruption in chunk " 622da7f033dSHerbert Xu "test %d on %s at page %u for " 623da7f033dSHerbert Xu "%s: %u bytes:\n", j, e, k, 624da7f033dSHerbert Xu algo, n); 625da7f033dSHerbert Xu hexdump(q, n); 626da7f033dSHerbert Xu goto out; 627da7f033dSHerbert Xu } 628da7f033dSHerbert Xu 629da7f033dSHerbert Xu temp += template[i].tap[k]; 630da7f033dSHerbert Xu } 631da7f033dSHerbert Xu } 632da7f033dSHerbert Xu } 633da7f033dSHerbert Xu 634da7f033dSHerbert Xu ret = 0; 635da7f033dSHerbert Xu 636da7f033dSHerbert Xu out: 637da7f033dSHerbert Xu aead_request_free(req); 638f8b0d4d0SHerbert Xu testmgr_free_buf(axbuf); 639f8b0d4d0SHerbert Xu out_noaxbuf: 640f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 641f8b0d4d0SHerbert Xu out_noxbuf: 642da7f033dSHerbert Xu return ret; 643da7f033dSHerbert Xu } 644da7f033dSHerbert Xu 6451aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc, 6461aa4ecd9SHerbert Xu struct cipher_testvec *template, unsigned int tcount) 6471aa4ecd9SHerbert Xu { 6481aa4ecd9SHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm)); 6491aa4ecd9SHerbert Xu unsigned int i, j, k; 6501aa4ecd9SHerbert Xu char *q; 6511aa4ecd9SHerbert Xu const char *e; 6521aa4ecd9SHerbert Xu void *data; 653f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 654f8b0d4d0SHerbert Xu int ret = -ENOMEM; 655f8b0d4d0SHerbert Xu 656f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 657f8b0d4d0SHerbert Xu goto out_nobuf; 6581aa4ecd9SHerbert Xu 6591aa4ecd9SHerbert Xu if (enc == ENCRYPT) 6601aa4ecd9SHerbert Xu e = "encryption"; 6611aa4ecd9SHerbert Xu else 6621aa4ecd9SHerbert Xu e = "decryption"; 6631aa4ecd9SHerbert Xu 6641aa4ecd9SHerbert Xu j = 0; 6651aa4ecd9SHerbert Xu for (i = 0; i < tcount; i++) { 6661aa4ecd9SHerbert Xu if (template[i].np) 6671aa4ecd9SHerbert Xu continue; 6681aa4ecd9SHerbert Xu 6691aa4ecd9SHerbert Xu j++; 6701aa4ecd9SHerbert Xu 671fd57f22aSHerbert Xu ret = -EINVAL; 672fd57f22aSHerbert Xu if (WARN_ON(template[i].ilen > PAGE_SIZE)) 673fd57f22aSHerbert Xu goto out; 674fd57f22aSHerbert Xu 6751aa4ecd9SHerbert Xu data = xbuf[0]; 6761aa4ecd9SHerbert Xu memcpy(data, template[i].input, template[i].ilen); 6771aa4ecd9SHerbert Xu 6781aa4ecd9SHerbert Xu crypto_cipher_clear_flags(tfm, ~0); 6791aa4ecd9SHerbert Xu if (template[i].wk) 6801aa4ecd9SHerbert Xu crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 6811aa4ecd9SHerbert Xu 6821aa4ecd9SHerbert Xu ret = crypto_cipher_setkey(tfm, template[i].key, 6831aa4ecd9SHerbert Xu template[i].klen); 6841aa4ecd9SHerbert Xu if (!ret == template[i].fail) { 6851aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: setkey failed " 6861aa4ecd9SHerbert Xu "on test %d for %s: flags=%x\n", j, 6871aa4ecd9SHerbert Xu algo, crypto_cipher_get_flags(tfm)); 6881aa4ecd9SHerbert Xu goto out; 6891aa4ecd9SHerbert Xu } else if (ret) 6901aa4ecd9SHerbert Xu continue; 6911aa4ecd9SHerbert Xu 6921aa4ecd9SHerbert Xu for (k = 0; k < template[i].ilen; 6931aa4ecd9SHerbert Xu k += crypto_cipher_blocksize(tfm)) { 6941aa4ecd9SHerbert Xu if (enc) 6951aa4ecd9SHerbert Xu crypto_cipher_encrypt_one(tfm, data + k, 6961aa4ecd9SHerbert Xu data + k); 6971aa4ecd9SHerbert Xu else 6981aa4ecd9SHerbert Xu crypto_cipher_decrypt_one(tfm, data + k, 6991aa4ecd9SHerbert Xu data + k); 7001aa4ecd9SHerbert Xu } 7011aa4ecd9SHerbert Xu 7021aa4ecd9SHerbert Xu q = data; 7031aa4ecd9SHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 7041aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: Test %d failed " 7051aa4ecd9SHerbert Xu "on %s for %s\n", j, e, algo); 7061aa4ecd9SHerbert Xu hexdump(q, template[i].rlen); 7071aa4ecd9SHerbert Xu ret = -EINVAL; 7081aa4ecd9SHerbert Xu goto out; 7091aa4ecd9SHerbert Xu } 7101aa4ecd9SHerbert Xu } 7111aa4ecd9SHerbert Xu 7121aa4ecd9SHerbert Xu ret = 0; 7131aa4ecd9SHerbert Xu 7141aa4ecd9SHerbert Xu out: 715f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 716f8b0d4d0SHerbert Xu out_nobuf: 7171aa4ecd9SHerbert Xu return ret; 7181aa4ecd9SHerbert Xu } 7191aa4ecd9SHerbert Xu 7201aa4ecd9SHerbert Xu static int test_skcipher(struct crypto_ablkcipher *tfm, int enc, 721da7f033dSHerbert Xu struct cipher_testvec *template, unsigned int tcount) 722da7f033dSHerbert Xu { 723da7f033dSHerbert Xu const char *algo = 724da7f033dSHerbert Xu crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm)); 725da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 726da7f033dSHerbert Xu char *q; 727da7f033dSHerbert Xu struct ablkcipher_request *req; 728da7f033dSHerbert Xu struct scatterlist sg[8]; 729da7f033dSHerbert Xu const char *e; 730da7f033dSHerbert Xu struct tcrypt_result result; 731da7f033dSHerbert Xu void *data; 732da7f033dSHerbert Xu char iv[MAX_IVLEN]; 733f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 734f8b0d4d0SHerbert Xu int ret = -ENOMEM; 735f8b0d4d0SHerbert Xu 736f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 737f8b0d4d0SHerbert Xu goto out_nobuf; 738da7f033dSHerbert Xu 739da7f033dSHerbert Xu if (enc == ENCRYPT) 740da7f033dSHerbert Xu e = "encryption"; 741da7f033dSHerbert Xu else 742da7f033dSHerbert Xu e = "decryption"; 743da7f033dSHerbert Xu 744da7f033dSHerbert Xu init_completion(&result.completion); 745da7f033dSHerbert Xu 746da7f033dSHerbert Xu req = ablkcipher_request_alloc(tfm, GFP_KERNEL); 747da7f033dSHerbert Xu if (!req) { 7481aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Failed to allocate request " 7491aa4ecd9SHerbert Xu "for %s\n", algo); 750da7f033dSHerbert Xu goto out; 751da7f033dSHerbert Xu } 752da7f033dSHerbert Xu 753da7f033dSHerbert Xu ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 754da7f033dSHerbert Xu tcrypt_complete, &result); 755da7f033dSHerbert Xu 756da7f033dSHerbert Xu j = 0; 757da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 758da7f033dSHerbert Xu if (template[i].iv) 759da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 760da7f033dSHerbert Xu else 761da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 762da7f033dSHerbert Xu 763da7f033dSHerbert Xu if (!(template[i].np)) { 764da7f033dSHerbert Xu j++; 765da7f033dSHerbert Xu 766fd57f22aSHerbert Xu ret = -EINVAL; 767fd57f22aSHerbert Xu if (WARN_ON(template[i].ilen > PAGE_SIZE)) 768fd57f22aSHerbert Xu goto out; 769fd57f22aSHerbert Xu 770da7f033dSHerbert Xu data = xbuf[0]; 771da7f033dSHerbert Xu memcpy(data, template[i].input, template[i].ilen); 772da7f033dSHerbert Xu 773da7f033dSHerbert Xu crypto_ablkcipher_clear_flags(tfm, ~0); 774da7f033dSHerbert Xu if (template[i].wk) 775da7f033dSHerbert Xu crypto_ablkcipher_set_flags( 776da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 777da7f033dSHerbert Xu 778da7f033dSHerbert Xu ret = crypto_ablkcipher_setkey(tfm, template[i].key, 779da7f033dSHerbert Xu template[i].klen); 780da7f033dSHerbert Xu if (!ret == template[i].fail) { 7811aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: setkey failed " 782da7f033dSHerbert Xu "on test %d for %s: flags=%x\n", j, 783da7f033dSHerbert Xu algo, crypto_ablkcipher_get_flags(tfm)); 784da7f033dSHerbert Xu goto out; 785da7f033dSHerbert Xu } else if (ret) 786da7f033dSHerbert Xu continue; 787da7f033dSHerbert Xu 788da7f033dSHerbert Xu sg_init_one(&sg[0], data, template[i].ilen); 789da7f033dSHerbert Xu 790da7f033dSHerbert Xu ablkcipher_request_set_crypt(req, sg, sg, 791da7f033dSHerbert Xu template[i].ilen, iv); 792da7f033dSHerbert Xu ret = enc ? 793da7f033dSHerbert Xu crypto_ablkcipher_encrypt(req) : 794da7f033dSHerbert Xu crypto_ablkcipher_decrypt(req); 795da7f033dSHerbert Xu 796da7f033dSHerbert Xu switch (ret) { 797da7f033dSHerbert Xu case 0: 798da7f033dSHerbert Xu break; 799da7f033dSHerbert Xu case -EINPROGRESS: 800da7f033dSHerbert Xu case -EBUSY: 801da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 802da7f033dSHerbert Xu &result.completion); 803da7f033dSHerbert Xu if (!ret && !((ret = result.err))) { 804da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 805da7f033dSHerbert Xu break; 806da7f033dSHerbert Xu } 807da7f033dSHerbert Xu /* fall through */ 808da7f033dSHerbert Xu default: 8091aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: %s failed on " 810da7f033dSHerbert Xu "test %d for %s: ret=%d\n", e, j, algo, 811da7f033dSHerbert Xu -ret); 812da7f033dSHerbert Xu goto out; 813da7f033dSHerbert Xu } 814da7f033dSHerbert Xu 815da7f033dSHerbert Xu q = data; 816da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 8171aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Test %d " 8181aa4ecd9SHerbert Xu "failed on %s for %s\n", j, e, algo); 819da7f033dSHerbert Xu hexdump(q, template[i].rlen); 820da7f033dSHerbert Xu ret = -EINVAL; 821da7f033dSHerbert Xu goto out; 822da7f033dSHerbert Xu } 823da7f033dSHerbert Xu } 824da7f033dSHerbert Xu } 825da7f033dSHerbert Xu 826da7f033dSHerbert Xu j = 0; 827da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 828da7f033dSHerbert Xu 829da7f033dSHerbert Xu if (template[i].iv) 830da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 831da7f033dSHerbert Xu else 832da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 833da7f033dSHerbert Xu 834da7f033dSHerbert Xu if (template[i].np) { 835da7f033dSHerbert Xu j++; 836da7f033dSHerbert Xu 837da7f033dSHerbert Xu crypto_ablkcipher_clear_flags(tfm, ~0); 838da7f033dSHerbert Xu if (template[i].wk) 839da7f033dSHerbert Xu crypto_ablkcipher_set_flags( 840da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 841da7f033dSHerbert Xu 842da7f033dSHerbert Xu ret = crypto_ablkcipher_setkey(tfm, template[i].key, 843da7f033dSHerbert Xu template[i].klen); 844da7f033dSHerbert Xu if (!ret == template[i].fail) { 8451aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: setkey failed " 846da7f033dSHerbert Xu "on chunk test %d for %s: flags=%x\n", 847da7f033dSHerbert Xu j, algo, 848da7f033dSHerbert Xu crypto_ablkcipher_get_flags(tfm)); 849da7f033dSHerbert Xu goto out; 850da7f033dSHerbert Xu } else if (ret) 851da7f033dSHerbert Xu continue; 852da7f033dSHerbert Xu 853da7f033dSHerbert Xu temp = 0; 854da7f033dSHerbert Xu ret = -EINVAL; 855da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 856da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 857da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 858da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 859da7f033dSHerbert Xu goto out; 860da7f033dSHerbert Xu 861da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 862da7f033dSHerbert Xu offset_in_page(IDX[k]); 863da7f033dSHerbert Xu 864da7f033dSHerbert Xu memcpy(q, template[i].input + temp, 865da7f033dSHerbert Xu template[i].tap[k]); 866da7f033dSHerbert Xu 867da7f033dSHerbert Xu if (offset_in_page(q) + template[i].tap[k] < 868da7f033dSHerbert Xu PAGE_SIZE) 869da7f033dSHerbert Xu q[template[i].tap[k]] = 0; 870da7f033dSHerbert Xu 871da7f033dSHerbert Xu sg_set_buf(&sg[k], q, template[i].tap[k]); 872da7f033dSHerbert Xu 873da7f033dSHerbert Xu temp += template[i].tap[k]; 874da7f033dSHerbert Xu } 875da7f033dSHerbert Xu 876da7f033dSHerbert Xu ablkcipher_request_set_crypt(req, sg, sg, 877da7f033dSHerbert Xu template[i].ilen, iv); 878da7f033dSHerbert Xu 879da7f033dSHerbert Xu ret = enc ? 880da7f033dSHerbert Xu crypto_ablkcipher_encrypt(req) : 881da7f033dSHerbert Xu crypto_ablkcipher_decrypt(req); 882da7f033dSHerbert Xu 883da7f033dSHerbert Xu switch (ret) { 884da7f033dSHerbert Xu case 0: 885da7f033dSHerbert Xu break; 886da7f033dSHerbert Xu case -EINPROGRESS: 887da7f033dSHerbert Xu case -EBUSY: 888da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 889da7f033dSHerbert Xu &result.completion); 890da7f033dSHerbert Xu if (!ret && !((ret = result.err))) { 891da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 892da7f033dSHerbert Xu break; 893da7f033dSHerbert Xu } 894da7f033dSHerbert Xu /* fall through */ 895da7f033dSHerbert Xu default: 8961aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: %s failed on " 897da7f033dSHerbert Xu "chunk test %d for %s: ret=%d\n", e, j, 898da7f033dSHerbert Xu algo, -ret); 899da7f033dSHerbert Xu goto out; 900da7f033dSHerbert Xu } 901da7f033dSHerbert Xu 902da7f033dSHerbert Xu temp = 0; 903da7f033dSHerbert Xu ret = -EINVAL; 904da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 905da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 906da7f033dSHerbert Xu offset_in_page(IDX[k]); 907da7f033dSHerbert Xu 908da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, 909da7f033dSHerbert Xu template[i].tap[k])) { 9101aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Chunk " 911da7f033dSHerbert Xu "test %d failed on %s at page " 912da7f033dSHerbert Xu "%u for %s\n", j, e, k, algo); 913da7f033dSHerbert Xu hexdump(q, template[i].tap[k]); 914da7f033dSHerbert Xu goto out; 915da7f033dSHerbert Xu } 916da7f033dSHerbert Xu 917da7f033dSHerbert Xu q += template[i].tap[k]; 918da7f033dSHerbert Xu for (n = 0; offset_in_page(q + n) && q[n]; n++) 919da7f033dSHerbert Xu ; 920da7f033dSHerbert Xu if (n) { 9211aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: " 922da7f033dSHerbert Xu "Result buffer corruption in " 923da7f033dSHerbert Xu "chunk test %d on %s at page " 924da7f033dSHerbert Xu "%u for %s: %u bytes:\n", j, e, 925da7f033dSHerbert Xu k, algo, n); 926da7f033dSHerbert Xu hexdump(q, n); 927da7f033dSHerbert Xu goto out; 928da7f033dSHerbert Xu } 929da7f033dSHerbert Xu temp += template[i].tap[k]; 930da7f033dSHerbert Xu } 931da7f033dSHerbert Xu } 932da7f033dSHerbert Xu } 933da7f033dSHerbert Xu 934da7f033dSHerbert Xu ret = 0; 935da7f033dSHerbert Xu 936da7f033dSHerbert Xu out: 937da7f033dSHerbert Xu ablkcipher_request_free(req); 938f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 939f8b0d4d0SHerbert Xu out_nobuf: 940da7f033dSHerbert Xu return ret; 941da7f033dSHerbert Xu } 942da7f033dSHerbert Xu 943da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate, 944da7f033dSHerbert Xu struct comp_testvec *dtemplate, int ctcount, int dtcount) 945da7f033dSHerbert Xu { 946da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm)); 947da7f033dSHerbert Xu unsigned int i; 948da7f033dSHerbert Xu char result[COMP_BUF_SIZE]; 949da7f033dSHerbert Xu int ret; 950da7f033dSHerbert Xu 951da7f033dSHerbert Xu for (i = 0; i < ctcount; i++) { 952c79cf910SGeert Uytterhoeven int ilen; 953c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 954da7f033dSHerbert Xu 955da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 956da7f033dSHerbert Xu 957da7f033dSHerbert Xu ilen = ctemplate[i].inlen; 958da7f033dSHerbert Xu ret = crypto_comp_compress(tfm, ctemplate[i].input, 959da7f033dSHerbert Xu ilen, result, &dlen); 960da7f033dSHerbert Xu if (ret) { 961da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: compression failed " 962da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 963da7f033dSHerbert Xu -ret); 964da7f033dSHerbert Xu goto out; 965da7f033dSHerbert Xu } 966da7f033dSHerbert Xu 967b812eb00SGeert Uytterhoeven if (dlen != ctemplate[i].outlen) { 968b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Compression test %d " 969b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 970b812eb00SGeert Uytterhoeven dlen); 971b812eb00SGeert Uytterhoeven ret = -EINVAL; 972b812eb00SGeert Uytterhoeven goto out; 973b812eb00SGeert Uytterhoeven } 974b812eb00SGeert Uytterhoeven 975da7f033dSHerbert Xu if (memcmp(result, ctemplate[i].output, dlen)) { 976da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Compression test %d " 977da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 978da7f033dSHerbert Xu hexdump(result, dlen); 979da7f033dSHerbert Xu ret = -EINVAL; 980da7f033dSHerbert Xu goto out; 981da7f033dSHerbert Xu } 982da7f033dSHerbert Xu } 983da7f033dSHerbert Xu 984da7f033dSHerbert Xu for (i = 0; i < dtcount; i++) { 985c79cf910SGeert Uytterhoeven int ilen; 986c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 987da7f033dSHerbert Xu 988da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 989da7f033dSHerbert Xu 990da7f033dSHerbert Xu ilen = dtemplate[i].inlen; 991da7f033dSHerbert Xu ret = crypto_comp_decompress(tfm, dtemplate[i].input, 992da7f033dSHerbert Xu ilen, result, &dlen); 993da7f033dSHerbert Xu if (ret) { 994da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: decompression failed " 995da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 996da7f033dSHerbert Xu -ret); 997da7f033dSHerbert Xu goto out; 998da7f033dSHerbert Xu } 999da7f033dSHerbert Xu 1000b812eb00SGeert Uytterhoeven if (dlen != dtemplate[i].outlen) { 1001b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Decompression test %d " 1002b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1003b812eb00SGeert Uytterhoeven dlen); 1004b812eb00SGeert Uytterhoeven ret = -EINVAL; 1005b812eb00SGeert Uytterhoeven goto out; 1006b812eb00SGeert Uytterhoeven } 1007b812eb00SGeert Uytterhoeven 1008da7f033dSHerbert Xu if (memcmp(result, dtemplate[i].output, dlen)) { 1009da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Decompression test %d " 1010da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 1011da7f033dSHerbert Xu hexdump(result, dlen); 1012da7f033dSHerbert Xu ret = -EINVAL; 1013da7f033dSHerbert Xu goto out; 1014da7f033dSHerbert Xu } 1015da7f033dSHerbert Xu } 1016da7f033dSHerbert Xu 1017da7f033dSHerbert Xu ret = 0; 1018da7f033dSHerbert Xu 1019da7f033dSHerbert Xu out: 1020da7f033dSHerbert Xu return ret; 1021da7f033dSHerbert Xu } 1022da7f033dSHerbert Xu 10238064efb8SGeert Uytterhoeven static int test_pcomp(struct crypto_pcomp *tfm, 10248064efb8SGeert Uytterhoeven struct pcomp_testvec *ctemplate, 10258064efb8SGeert Uytterhoeven struct pcomp_testvec *dtemplate, int ctcount, 10268064efb8SGeert Uytterhoeven int dtcount) 10278064efb8SGeert Uytterhoeven { 10288064efb8SGeert Uytterhoeven const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm)); 10298064efb8SGeert Uytterhoeven unsigned int i; 10308064efb8SGeert Uytterhoeven char result[COMP_BUF_SIZE]; 10313ce858cbSGeert Uytterhoeven int res; 10328064efb8SGeert Uytterhoeven 10338064efb8SGeert Uytterhoeven for (i = 0; i < ctcount; i++) { 10348064efb8SGeert Uytterhoeven struct comp_request req; 10353ce858cbSGeert Uytterhoeven unsigned int produced = 0; 10368064efb8SGeert Uytterhoeven 10373ce858cbSGeert Uytterhoeven res = crypto_compress_setup(tfm, ctemplate[i].params, 10388064efb8SGeert Uytterhoeven ctemplate[i].paramsize); 10393ce858cbSGeert Uytterhoeven if (res) { 10408064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression setup failed on test " 10413ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 10423ce858cbSGeert Uytterhoeven return res; 10438064efb8SGeert Uytterhoeven } 10448064efb8SGeert Uytterhoeven 10453ce858cbSGeert Uytterhoeven res = crypto_compress_init(tfm); 10463ce858cbSGeert Uytterhoeven if (res) { 10478064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression init failed on test " 10483ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 10493ce858cbSGeert Uytterhoeven return res; 10508064efb8SGeert Uytterhoeven } 10518064efb8SGeert Uytterhoeven 10528064efb8SGeert Uytterhoeven memset(result, 0, sizeof(result)); 10538064efb8SGeert Uytterhoeven 10548064efb8SGeert Uytterhoeven req.next_in = ctemplate[i].input; 10558064efb8SGeert Uytterhoeven req.avail_in = ctemplate[i].inlen / 2; 10568064efb8SGeert Uytterhoeven req.next_out = result; 10578064efb8SGeert Uytterhoeven req.avail_out = ctemplate[i].outlen / 2; 10588064efb8SGeert Uytterhoeven 10593ce858cbSGeert Uytterhoeven res = crypto_compress_update(tfm, &req); 10603ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 10618064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression update failed on test " 10623ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 10633ce858cbSGeert Uytterhoeven return res; 10648064efb8SGeert Uytterhoeven } 10653ce858cbSGeert Uytterhoeven if (res > 0) 10663ce858cbSGeert Uytterhoeven produced += res; 10678064efb8SGeert Uytterhoeven 10688064efb8SGeert Uytterhoeven /* Add remaining input data */ 10698064efb8SGeert Uytterhoeven req.avail_in += (ctemplate[i].inlen + 1) / 2; 10708064efb8SGeert Uytterhoeven 10713ce858cbSGeert Uytterhoeven res = crypto_compress_update(tfm, &req); 10723ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 10738064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression update failed on test " 10743ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 10753ce858cbSGeert Uytterhoeven return res; 10768064efb8SGeert Uytterhoeven } 10773ce858cbSGeert Uytterhoeven if (res > 0) 10783ce858cbSGeert Uytterhoeven produced += res; 10798064efb8SGeert Uytterhoeven 10808064efb8SGeert Uytterhoeven /* Provide remaining output space */ 10818064efb8SGeert Uytterhoeven req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2; 10828064efb8SGeert Uytterhoeven 10833ce858cbSGeert Uytterhoeven res = crypto_compress_final(tfm, &req); 10843ce858cbSGeert Uytterhoeven if (res < 0) { 10858064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression final failed on test " 10863ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 10873ce858cbSGeert Uytterhoeven return res; 10888064efb8SGeert Uytterhoeven } 10893ce858cbSGeert Uytterhoeven produced += res; 10908064efb8SGeert Uytterhoeven 10918064efb8SGeert Uytterhoeven if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) { 10928064efb8SGeert Uytterhoeven pr_err("alg: comp: Compression test %d failed for %s: " 10938064efb8SGeert Uytterhoeven "output len = %d (expected %d)\n", i + 1, algo, 10948064efb8SGeert Uytterhoeven COMP_BUF_SIZE - req.avail_out, 10958064efb8SGeert Uytterhoeven ctemplate[i].outlen); 10968064efb8SGeert Uytterhoeven return -EINVAL; 10978064efb8SGeert Uytterhoeven } 10988064efb8SGeert Uytterhoeven 10993ce858cbSGeert Uytterhoeven if (produced != ctemplate[i].outlen) { 11003ce858cbSGeert Uytterhoeven pr_err("alg: comp: Compression test %d failed for %s: " 11013ce858cbSGeert Uytterhoeven "returned len = %u (expected %d)\n", i + 1, 11023ce858cbSGeert Uytterhoeven algo, produced, ctemplate[i].outlen); 11033ce858cbSGeert Uytterhoeven return -EINVAL; 11043ce858cbSGeert Uytterhoeven } 11053ce858cbSGeert Uytterhoeven 11068064efb8SGeert Uytterhoeven if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) { 11078064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Compression test %d failed for " 11088064efb8SGeert Uytterhoeven "%s\n", i + 1, algo); 11098064efb8SGeert Uytterhoeven hexdump(result, ctemplate[i].outlen); 11108064efb8SGeert Uytterhoeven return -EINVAL; 11118064efb8SGeert Uytterhoeven } 11128064efb8SGeert Uytterhoeven } 11138064efb8SGeert Uytterhoeven 11148064efb8SGeert Uytterhoeven for (i = 0; i < dtcount; i++) { 11158064efb8SGeert Uytterhoeven struct comp_request req; 11163ce858cbSGeert Uytterhoeven unsigned int produced = 0; 11178064efb8SGeert Uytterhoeven 11183ce858cbSGeert Uytterhoeven res = crypto_decompress_setup(tfm, dtemplate[i].params, 11198064efb8SGeert Uytterhoeven dtemplate[i].paramsize); 11203ce858cbSGeert Uytterhoeven if (res) { 11218064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression setup failed on " 11223ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 11233ce858cbSGeert Uytterhoeven return res; 11248064efb8SGeert Uytterhoeven } 11258064efb8SGeert Uytterhoeven 11263ce858cbSGeert Uytterhoeven res = crypto_decompress_init(tfm); 11273ce858cbSGeert Uytterhoeven if (res) { 11288064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression init failed on test " 11293ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 11303ce858cbSGeert Uytterhoeven return res; 11318064efb8SGeert Uytterhoeven } 11328064efb8SGeert Uytterhoeven 11338064efb8SGeert Uytterhoeven memset(result, 0, sizeof(result)); 11348064efb8SGeert Uytterhoeven 11358064efb8SGeert Uytterhoeven req.next_in = dtemplate[i].input; 11368064efb8SGeert Uytterhoeven req.avail_in = dtemplate[i].inlen / 2; 11378064efb8SGeert Uytterhoeven req.next_out = result; 11388064efb8SGeert Uytterhoeven req.avail_out = dtemplate[i].outlen / 2; 11398064efb8SGeert Uytterhoeven 11403ce858cbSGeert Uytterhoeven res = crypto_decompress_update(tfm, &req); 11413ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 11428064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression update failed on " 11433ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 11443ce858cbSGeert Uytterhoeven return res; 11458064efb8SGeert Uytterhoeven } 11463ce858cbSGeert Uytterhoeven if (res > 0) 11473ce858cbSGeert Uytterhoeven produced += res; 11488064efb8SGeert Uytterhoeven 11498064efb8SGeert Uytterhoeven /* Add remaining input data */ 11508064efb8SGeert Uytterhoeven req.avail_in += (dtemplate[i].inlen + 1) / 2; 11518064efb8SGeert Uytterhoeven 11523ce858cbSGeert Uytterhoeven res = crypto_decompress_update(tfm, &req); 11533ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 11548064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression update failed on " 11553ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 11563ce858cbSGeert Uytterhoeven return res; 11578064efb8SGeert Uytterhoeven } 11583ce858cbSGeert Uytterhoeven if (res > 0) 11593ce858cbSGeert Uytterhoeven produced += res; 11608064efb8SGeert Uytterhoeven 11618064efb8SGeert Uytterhoeven /* Provide remaining output space */ 11628064efb8SGeert Uytterhoeven req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2; 11638064efb8SGeert Uytterhoeven 11643ce858cbSGeert Uytterhoeven res = crypto_decompress_final(tfm, &req); 11653ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 11668064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression final failed on " 11673ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 11683ce858cbSGeert Uytterhoeven return res; 11698064efb8SGeert Uytterhoeven } 11703ce858cbSGeert Uytterhoeven if (res > 0) 11713ce858cbSGeert Uytterhoeven produced += res; 11728064efb8SGeert Uytterhoeven 11738064efb8SGeert Uytterhoeven if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) { 11748064efb8SGeert Uytterhoeven pr_err("alg: comp: Decompression test %d failed for " 11758064efb8SGeert Uytterhoeven "%s: output len = %d (expected %d)\n", i + 1, 11768064efb8SGeert Uytterhoeven algo, COMP_BUF_SIZE - req.avail_out, 11778064efb8SGeert Uytterhoeven dtemplate[i].outlen); 11788064efb8SGeert Uytterhoeven return -EINVAL; 11798064efb8SGeert Uytterhoeven } 11808064efb8SGeert Uytterhoeven 11813ce858cbSGeert Uytterhoeven if (produced != dtemplate[i].outlen) { 11823ce858cbSGeert Uytterhoeven pr_err("alg: comp: Decompression test %d failed for " 11833ce858cbSGeert Uytterhoeven "%s: returned len = %u (expected %d)\n", i + 1, 11843ce858cbSGeert Uytterhoeven algo, produced, dtemplate[i].outlen); 11853ce858cbSGeert Uytterhoeven return -EINVAL; 11863ce858cbSGeert Uytterhoeven } 11873ce858cbSGeert Uytterhoeven 11888064efb8SGeert Uytterhoeven if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) { 11898064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Decompression test %d failed for " 11908064efb8SGeert Uytterhoeven "%s\n", i + 1, algo); 11918064efb8SGeert Uytterhoeven hexdump(result, dtemplate[i].outlen); 11928064efb8SGeert Uytterhoeven return -EINVAL; 11938064efb8SGeert Uytterhoeven } 11948064efb8SGeert Uytterhoeven } 11958064efb8SGeert Uytterhoeven 11968064efb8SGeert Uytterhoeven return 0; 11978064efb8SGeert Uytterhoeven } 11988064efb8SGeert Uytterhoeven 11997647d6ceSJarod Wilson 12007647d6ceSJarod Wilson static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template, 12017647d6ceSJarod Wilson unsigned int tcount) 12027647d6ceSJarod Wilson { 12037647d6ceSJarod Wilson const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm)); 12047647d6ceSJarod Wilson int err, i, j, seedsize; 12057647d6ceSJarod Wilson u8 *seed; 12067647d6ceSJarod Wilson char result[32]; 12077647d6ceSJarod Wilson 12087647d6ceSJarod Wilson seedsize = crypto_rng_seedsize(tfm); 12097647d6ceSJarod Wilson 12107647d6ceSJarod Wilson seed = kmalloc(seedsize, GFP_KERNEL); 12117647d6ceSJarod Wilson if (!seed) { 12127647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to allocate seed space " 12137647d6ceSJarod Wilson "for %s\n", algo); 12147647d6ceSJarod Wilson return -ENOMEM; 12157647d6ceSJarod Wilson } 12167647d6ceSJarod Wilson 12177647d6ceSJarod Wilson for (i = 0; i < tcount; i++) { 12187647d6ceSJarod Wilson memset(result, 0, 32); 12197647d6ceSJarod Wilson 12207647d6ceSJarod Wilson memcpy(seed, template[i].v, template[i].vlen); 12217647d6ceSJarod Wilson memcpy(seed + template[i].vlen, template[i].key, 12227647d6ceSJarod Wilson template[i].klen); 12237647d6ceSJarod Wilson memcpy(seed + template[i].vlen + template[i].klen, 12247647d6ceSJarod Wilson template[i].dt, template[i].dtlen); 12257647d6ceSJarod Wilson 12267647d6ceSJarod Wilson err = crypto_rng_reset(tfm, seed, seedsize); 12277647d6ceSJarod Wilson if (err) { 12287647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to reset rng " 12297647d6ceSJarod Wilson "for %s\n", algo); 12307647d6ceSJarod Wilson goto out; 12317647d6ceSJarod Wilson } 12327647d6ceSJarod Wilson 12337647d6ceSJarod Wilson for (j = 0; j < template[i].loops; j++) { 12347647d6ceSJarod Wilson err = crypto_rng_get_bytes(tfm, result, 12357647d6ceSJarod Wilson template[i].rlen); 12367647d6ceSJarod Wilson if (err != template[i].rlen) { 12377647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to obtain " 12387647d6ceSJarod Wilson "the correct amount of random data for " 12397647d6ceSJarod Wilson "%s (requested %d, got %d)\n", algo, 12407647d6ceSJarod Wilson template[i].rlen, err); 12417647d6ceSJarod Wilson goto out; 12427647d6ceSJarod Wilson } 12437647d6ceSJarod Wilson } 12447647d6ceSJarod Wilson 12457647d6ceSJarod Wilson err = memcmp(result, template[i].result, 12467647d6ceSJarod Wilson template[i].rlen); 12477647d6ceSJarod Wilson if (err) { 12487647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Test %d failed for %s\n", 12497647d6ceSJarod Wilson i, algo); 12507647d6ceSJarod Wilson hexdump(result, template[i].rlen); 12517647d6ceSJarod Wilson err = -EINVAL; 12527647d6ceSJarod Wilson goto out; 12537647d6ceSJarod Wilson } 12547647d6ceSJarod Wilson } 12557647d6ceSJarod Wilson 12567647d6ceSJarod Wilson out: 12577647d6ceSJarod Wilson kfree(seed); 12587647d6ceSJarod Wilson return err; 12597647d6ceSJarod Wilson } 12607647d6ceSJarod Wilson 1261da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver, 1262da7f033dSHerbert Xu u32 type, u32 mask) 1263da7f033dSHerbert Xu { 1264da7f033dSHerbert Xu struct crypto_aead *tfm; 1265da7f033dSHerbert Xu int err = 0; 1266da7f033dSHerbert Xu 1267da7f033dSHerbert Xu tfm = crypto_alloc_aead(driver, type, mask); 1268da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1269da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to load transform for %s: " 1270da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1271da7f033dSHerbert Xu return PTR_ERR(tfm); 1272da7f033dSHerbert Xu } 1273da7f033dSHerbert Xu 1274da7f033dSHerbert Xu if (desc->suite.aead.enc.vecs) { 1275da7f033dSHerbert Xu err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs, 1276da7f033dSHerbert Xu desc->suite.aead.enc.count); 1277da7f033dSHerbert Xu if (err) 1278da7f033dSHerbert Xu goto out; 1279da7f033dSHerbert Xu } 1280da7f033dSHerbert Xu 1281da7f033dSHerbert Xu if (!err && desc->suite.aead.dec.vecs) 1282da7f033dSHerbert Xu err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs, 1283da7f033dSHerbert Xu desc->suite.aead.dec.count); 1284da7f033dSHerbert Xu 1285da7f033dSHerbert Xu out: 1286da7f033dSHerbert Xu crypto_free_aead(tfm); 1287da7f033dSHerbert Xu return err; 1288da7f033dSHerbert Xu } 1289da7f033dSHerbert Xu 1290da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc, 1291da7f033dSHerbert Xu const char *driver, u32 type, u32 mask) 1292da7f033dSHerbert Xu { 12931aa4ecd9SHerbert Xu struct crypto_cipher *tfm; 1294da7f033dSHerbert Xu int err = 0; 1295da7f033dSHerbert Xu 12961aa4ecd9SHerbert Xu tfm = crypto_alloc_cipher(driver, type, mask); 1297da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1298da7f033dSHerbert Xu printk(KERN_ERR "alg: cipher: Failed to load transform for " 1299da7f033dSHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 1300da7f033dSHerbert Xu return PTR_ERR(tfm); 1301da7f033dSHerbert Xu } 1302da7f033dSHerbert Xu 1303da7f033dSHerbert Xu if (desc->suite.cipher.enc.vecs) { 1304da7f033dSHerbert Xu err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 1305da7f033dSHerbert Xu desc->suite.cipher.enc.count); 1306da7f033dSHerbert Xu if (err) 1307da7f033dSHerbert Xu goto out; 1308da7f033dSHerbert Xu } 1309da7f033dSHerbert Xu 1310da7f033dSHerbert Xu if (desc->suite.cipher.dec.vecs) 1311da7f033dSHerbert Xu err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 1312da7f033dSHerbert Xu desc->suite.cipher.dec.count); 1313da7f033dSHerbert Xu 1314da7f033dSHerbert Xu out: 13151aa4ecd9SHerbert Xu crypto_free_cipher(tfm); 13161aa4ecd9SHerbert Xu return err; 13171aa4ecd9SHerbert Xu } 13181aa4ecd9SHerbert Xu 13191aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc, 13201aa4ecd9SHerbert Xu const char *driver, u32 type, u32 mask) 13211aa4ecd9SHerbert Xu { 13221aa4ecd9SHerbert Xu struct crypto_ablkcipher *tfm; 13231aa4ecd9SHerbert Xu int err = 0; 13241aa4ecd9SHerbert Xu 13251aa4ecd9SHerbert Xu tfm = crypto_alloc_ablkcipher(driver, type, mask); 13261aa4ecd9SHerbert Xu if (IS_ERR(tfm)) { 13271aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Failed to load transform for " 13281aa4ecd9SHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 13291aa4ecd9SHerbert Xu return PTR_ERR(tfm); 13301aa4ecd9SHerbert Xu } 13311aa4ecd9SHerbert Xu 13321aa4ecd9SHerbert Xu if (desc->suite.cipher.enc.vecs) { 13331aa4ecd9SHerbert Xu err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 13341aa4ecd9SHerbert Xu desc->suite.cipher.enc.count); 13351aa4ecd9SHerbert Xu if (err) 13361aa4ecd9SHerbert Xu goto out; 13371aa4ecd9SHerbert Xu } 13381aa4ecd9SHerbert Xu 13391aa4ecd9SHerbert Xu if (desc->suite.cipher.dec.vecs) 13401aa4ecd9SHerbert Xu err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 13411aa4ecd9SHerbert Xu desc->suite.cipher.dec.count); 13421aa4ecd9SHerbert Xu 13431aa4ecd9SHerbert Xu out: 1344da7f033dSHerbert Xu crypto_free_ablkcipher(tfm); 1345da7f033dSHerbert Xu return err; 1346da7f033dSHerbert Xu } 1347da7f033dSHerbert Xu 1348da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver, 1349da7f033dSHerbert Xu u32 type, u32 mask) 1350da7f033dSHerbert Xu { 1351da7f033dSHerbert Xu struct crypto_comp *tfm; 1352da7f033dSHerbert Xu int err; 1353da7f033dSHerbert Xu 1354da7f033dSHerbert Xu tfm = crypto_alloc_comp(driver, type, mask); 1355da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1356da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Failed to load transform for %s: " 1357da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1358da7f033dSHerbert Xu return PTR_ERR(tfm); 1359da7f033dSHerbert Xu } 1360da7f033dSHerbert Xu 1361da7f033dSHerbert Xu err = test_comp(tfm, desc->suite.comp.comp.vecs, 1362da7f033dSHerbert Xu desc->suite.comp.decomp.vecs, 1363da7f033dSHerbert Xu desc->suite.comp.comp.count, 1364da7f033dSHerbert Xu desc->suite.comp.decomp.count); 1365da7f033dSHerbert Xu 1366da7f033dSHerbert Xu crypto_free_comp(tfm); 1367da7f033dSHerbert Xu return err; 1368da7f033dSHerbert Xu } 1369da7f033dSHerbert Xu 13708064efb8SGeert Uytterhoeven static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver, 13718064efb8SGeert Uytterhoeven u32 type, u32 mask) 13728064efb8SGeert Uytterhoeven { 13738064efb8SGeert Uytterhoeven struct crypto_pcomp *tfm; 13748064efb8SGeert Uytterhoeven int err; 13758064efb8SGeert Uytterhoeven 13768064efb8SGeert Uytterhoeven tfm = crypto_alloc_pcomp(driver, type, mask); 13778064efb8SGeert Uytterhoeven if (IS_ERR(tfm)) { 13788064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Failed to load transform for %s: %ld\n", 13798064efb8SGeert Uytterhoeven driver, PTR_ERR(tfm)); 13808064efb8SGeert Uytterhoeven return PTR_ERR(tfm); 13818064efb8SGeert Uytterhoeven } 13828064efb8SGeert Uytterhoeven 13838064efb8SGeert Uytterhoeven err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs, 13848064efb8SGeert Uytterhoeven desc->suite.pcomp.decomp.vecs, 13858064efb8SGeert Uytterhoeven desc->suite.pcomp.comp.count, 13868064efb8SGeert Uytterhoeven desc->suite.pcomp.decomp.count); 13878064efb8SGeert Uytterhoeven 13888064efb8SGeert Uytterhoeven crypto_free_pcomp(tfm); 13898064efb8SGeert Uytterhoeven return err; 13908064efb8SGeert Uytterhoeven } 13918064efb8SGeert Uytterhoeven 1392da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver, 1393da7f033dSHerbert Xu u32 type, u32 mask) 1394da7f033dSHerbert Xu { 1395da7f033dSHerbert Xu struct crypto_ahash *tfm; 1396da7f033dSHerbert Xu int err; 1397da7f033dSHerbert Xu 1398da7f033dSHerbert Xu tfm = crypto_alloc_ahash(driver, type, mask); 1399da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1400da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: 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_hash(tfm, desc->suite.hash.vecs, desc->suite.hash.count); 1406da7f033dSHerbert Xu 1407da7f033dSHerbert Xu crypto_free_ahash(tfm); 1408da7f033dSHerbert Xu return err; 1409da7f033dSHerbert Xu } 1410da7f033dSHerbert Xu 14118e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc, 14128e3ee85eSHerbert Xu const char *driver, u32 type, u32 mask) 14138e3ee85eSHerbert Xu { 14148e3ee85eSHerbert Xu struct crypto_shash *tfm; 14158e3ee85eSHerbert Xu u32 val; 14168e3ee85eSHerbert Xu int err; 14178e3ee85eSHerbert Xu 14188e3ee85eSHerbert Xu err = alg_test_hash(desc, driver, type, mask); 14198e3ee85eSHerbert Xu if (err) 14208e3ee85eSHerbert Xu goto out; 14218e3ee85eSHerbert Xu 14228e3ee85eSHerbert Xu tfm = crypto_alloc_shash(driver, type, mask); 14238e3ee85eSHerbert Xu if (IS_ERR(tfm)) { 14248e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: " 14258e3ee85eSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 14268e3ee85eSHerbert Xu err = PTR_ERR(tfm); 14278e3ee85eSHerbert Xu goto out; 14288e3ee85eSHerbert Xu } 14298e3ee85eSHerbert Xu 14308e3ee85eSHerbert Xu do { 14318e3ee85eSHerbert Xu struct { 14328e3ee85eSHerbert Xu struct shash_desc shash; 14338e3ee85eSHerbert Xu char ctx[crypto_shash_descsize(tfm)]; 14348e3ee85eSHerbert Xu } sdesc; 14358e3ee85eSHerbert Xu 14368e3ee85eSHerbert Xu sdesc.shash.tfm = tfm; 14378e3ee85eSHerbert Xu sdesc.shash.flags = 0; 14388e3ee85eSHerbert Xu 14398e3ee85eSHerbert Xu *(u32 *)sdesc.ctx = le32_to_cpu(420553207); 14408e3ee85eSHerbert Xu err = crypto_shash_final(&sdesc.shash, (u8 *)&val); 14418e3ee85eSHerbert Xu if (err) { 14428e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Operation failed for " 14438e3ee85eSHerbert Xu "%s: %d\n", driver, err); 14448e3ee85eSHerbert Xu break; 14458e3ee85eSHerbert Xu } 14468e3ee85eSHerbert Xu 14478e3ee85eSHerbert Xu if (val != ~420553207) { 14488e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Test failed for %s: " 14498e3ee85eSHerbert Xu "%d\n", driver, val); 14508e3ee85eSHerbert Xu err = -EINVAL; 14518e3ee85eSHerbert Xu } 14528e3ee85eSHerbert Xu } while (0); 14538e3ee85eSHerbert Xu 14548e3ee85eSHerbert Xu crypto_free_shash(tfm); 14558e3ee85eSHerbert Xu 14568e3ee85eSHerbert Xu out: 14578e3ee85eSHerbert Xu return err; 14588e3ee85eSHerbert Xu } 14598e3ee85eSHerbert Xu 14607647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver, 14617647d6ceSJarod Wilson u32 type, u32 mask) 14627647d6ceSJarod Wilson { 14637647d6ceSJarod Wilson struct crypto_rng *rng; 14647647d6ceSJarod Wilson int err; 14657647d6ceSJarod Wilson 14667647d6ceSJarod Wilson rng = crypto_alloc_rng(driver, type, mask); 14677647d6ceSJarod Wilson if (IS_ERR(rng)) { 14687647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to load transform for %s: " 14697647d6ceSJarod Wilson "%ld\n", driver, PTR_ERR(rng)); 14707647d6ceSJarod Wilson return PTR_ERR(rng); 14717647d6ceSJarod Wilson } 14727647d6ceSJarod Wilson 14737647d6ceSJarod Wilson err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count); 14747647d6ceSJarod Wilson 14757647d6ceSJarod Wilson crypto_free_rng(rng); 14767647d6ceSJarod Wilson 14777647d6ceSJarod Wilson return err; 14787647d6ceSJarod Wilson } 14797647d6ceSJarod Wilson 1480da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */ 1481da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = { 1482da7f033dSHerbert Xu { 1483e08ca2daSJarod Wilson .alg = "ansi_cprng", 1484e08ca2daSJarod Wilson .test = alg_test_cprng, 1485a1915d51SJarod Wilson .fips_allowed = 1, 1486e08ca2daSJarod Wilson .suite = { 1487e08ca2daSJarod Wilson .cprng = { 1488e08ca2daSJarod Wilson .vecs = ansi_cprng_aes_tv_template, 1489e08ca2daSJarod Wilson .count = ANSI_CPRNG_AES_TEST_VECTORS 1490e08ca2daSJarod Wilson } 1491e08ca2daSJarod Wilson } 1492e08ca2daSJarod Wilson }, { 1493da7f033dSHerbert Xu .alg = "cbc(aes)", 14941aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1495a1915d51SJarod Wilson .fips_allowed = 1, 1496da7f033dSHerbert Xu .suite = { 1497da7f033dSHerbert Xu .cipher = { 1498da7f033dSHerbert Xu .enc = { 1499da7f033dSHerbert Xu .vecs = aes_cbc_enc_tv_template, 1500da7f033dSHerbert Xu .count = AES_CBC_ENC_TEST_VECTORS 1501da7f033dSHerbert Xu }, 1502da7f033dSHerbert Xu .dec = { 1503da7f033dSHerbert Xu .vecs = aes_cbc_dec_tv_template, 1504da7f033dSHerbert Xu .count = AES_CBC_DEC_TEST_VECTORS 1505da7f033dSHerbert Xu } 1506da7f033dSHerbert Xu } 1507da7f033dSHerbert Xu } 1508da7f033dSHerbert Xu }, { 1509da7f033dSHerbert Xu .alg = "cbc(anubis)", 15101aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1511da7f033dSHerbert Xu .suite = { 1512da7f033dSHerbert Xu .cipher = { 1513da7f033dSHerbert Xu .enc = { 1514da7f033dSHerbert Xu .vecs = anubis_cbc_enc_tv_template, 1515da7f033dSHerbert Xu .count = ANUBIS_CBC_ENC_TEST_VECTORS 1516da7f033dSHerbert Xu }, 1517da7f033dSHerbert Xu .dec = { 1518da7f033dSHerbert Xu .vecs = anubis_cbc_dec_tv_template, 1519da7f033dSHerbert Xu .count = ANUBIS_CBC_DEC_TEST_VECTORS 1520da7f033dSHerbert Xu } 1521da7f033dSHerbert Xu } 1522da7f033dSHerbert Xu } 1523da7f033dSHerbert Xu }, { 1524da7f033dSHerbert Xu .alg = "cbc(blowfish)", 15251aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1526da7f033dSHerbert Xu .suite = { 1527da7f033dSHerbert Xu .cipher = { 1528da7f033dSHerbert Xu .enc = { 1529da7f033dSHerbert Xu .vecs = bf_cbc_enc_tv_template, 1530da7f033dSHerbert Xu .count = BF_CBC_ENC_TEST_VECTORS 1531da7f033dSHerbert Xu }, 1532da7f033dSHerbert Xu .dec = { 1533da7f033dSHerbert Xu .vecs = bf_cbc_dec_tv_template, 1534da7f033dSHerbert Xu .count = BF_CBC_DEC_TEST_VECTORS 1535da7f033dSHerbert Xu } 1536da7f033dSHerbert Xu } 1537da7f033dSHerbert Xu } 1538da7f033dSHerbert Xu }, { 1539da7f033dSHerbert Xu .alg = "cbc(camellia)", 15401aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1541da7f033dSHerbert Xu .suite = { 1542da7f033dSHerbert Xu .cipher = { 1543da7f033dSHerbert Xu .enc = { 1544da7f033dSHerbert Xu .vecs = camellia_cbc_enc_tv_template, 1545da7f033dSHerbert Xu .count = CAMELLIA_CBC_ENC_TEST_VECTORS 1546da7f033dSHerbert Xu }, 1547da7f033dSHerbert Xu .dec = { 1548da7f033dSHerbert Xu .vecs = camellia_cbc_dec_tv_template, 1549da7f033dSHerbert Xu .count = CAMELLIA_CBC_DEC_TEST_VECTORS 1550da7f033dSHerbert Xu } 1551da7f033dSHerbert Xu } 1552da7f033dSHerbert Xu } 1553da7f033dSHerbert Xu }, { 1554da7f033dSHerbert Xu .alg = "cbc(des)", 15551aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1556da7f033dSHerbert Xu .suite = { 1557da7f033dSHerbert Xu .cipher = { 1558da7f033dSHerbert Xu .enc = { 1559da7f033dSHerbert Xu .vecs = des_cbc_enc_tv_template, 1560da7f033dSHerbert Xu .count = DES_CBC_ENC_TEST_VECTORS 1561da7f033dSHerbert Xu }, 1562da7f033dSHerbert Xu .dec = { 1563da7f033dSHerbert Xu .vecs = des_cbc_dec_tv_template, 1564da7f033dSHerbert Xu .count = DES_CBC_DEC_TEST_VECTORS 1565da7f033dSHerbert Xu } 1566da7f033dSHerbert Xu } 1567da7f033dSHerbert Xu } 1568da7f033dSHerbert Xu }, { 1569da7f033dSHerbert Xu .alg = "cbc(des3_ede)", 15701aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1571a1915d51SJarod Wilson .fips_allowed = 1, 1572da7f033dSHerbert Xu .suite = { 1573da7f033dSHerbert Xu .cipher = { 1574da7f033dSHerbert Xu .enc = { 1575da7f033dSHerbert Xu .vecs = des3_ede_cbc_enc_tv_template, 1576da7f033dSHerbert Xu .count = DES3_EDE_CBC_ENC_TEST_VECTORS 1577da7f033dSHerbert Xu }, 1578da7f033dSHerbert Xu .dec = { 1579da7f033dSHerbert Xu .vecs = des3_ede_cbc_dec_tv_template, 1580da7f033dSHerbert Xu .count = DES3_EDE_CBC_DEC_TEST_VECTORS 1581da7f033dSHerbert Xu } 1582da7f033dSHerbert Xu } 1583da7f033dSHerbert Xu } 1584da7f033dSHerbert Xu }, { 1585da7f033dSHerbert Xu .alg = "cbc(twofish)", 15861aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1587da7f033dSHerbert Xu .suite = { 1588da7f033dSHerbert Xu .cipher = { 1589da7f033dSHerbert Xu .enc = { 1590da7f033dSHerbert Xu .vecs = tf_cbc_enc_tv_template, 1591da7f033dSHerbert Xu .count = TF_CBC_ENC_TEST_VECTORS 1592da7f033dSHerbert Xu }, 1593da7f033dSHerbert Xu .dec = { 1594da7f033dSHerbert Xu .vecs = tf_cbc_dec_tv_template, 1595da7f033dSHerbert Xu .count = TF_CBC_DEC_TEST_VECTORS 1596da7f033dSHerbert Xu } 1597da7f033dSHerbert Xu } 1598da7f033dSHerbert Xu } 1599da7f033dSHerbert Xu }, { 1600da7f033dSHerbert Xu .alg = "ccm(aes)", 1601da7f033dSHerbert Xu .test = alg_test_aead, 1602a1915d51SJarod Wilson .fips_allowed = 1, 1603da7f033dSHerbert Xu .suite = { 1604da7f033dSHerbert Xu .aead = { 1605da7f033dSHerbert Xu .enc = { 1606da7f033dSHerbert Xu .vecs = aes_ccm_enc_tv_template, 1607da7f033dSHerbert Xu .count = AES_CCM_ENC_TEST_VECTORS 1608da7f033dSHerbert Xu }, 1609da7f033dSHerbert Xu .dec = { 1610da7f033dSHerbert Xu .vecs = aes_ccm_dec_tv_template, 1611da7f033dSHerbert Xu .count = AES_CCM_DEC_TEST_VECTORS 1612da7f033dSHerbert Xu } 1613da7f033dSHerbert Xu } 1614da7f033dSHerbert Xu } 1615da7f033dSHerbert Xu }, { 1616da7f033dSHerbert Xu .alg = "crc32c", 16178e3ee85eSHerbert Xu .test = alg_test_crc32c, 1618a1915d51SJarod Wilson .fips_allowed = 1, 1619da7f033dSHerbert Xu .suite = { 1620da7f033dSHerbert Xu .hash = { 1621da7f033dSHerbert Xu .vecs = crc32c_tv_template, 1622da7f033dSHerbert Xu .count = CRC32C_TEST_VECTORS 1623da7f033dSHerbert Xu } 1624da7f033dSHerbert Xu } 1625da7f033dSHerbert Xu }, { 1626f7cb80f2SJarod Wilson .alg = "ctr(aes)", 1627f7cb80f2SJarod Wilson .test = alg_test_skcipher, 1628a1915d51SJarod Wilson .fips_allowed = 1, 1629f7cb80f2SJarod Wilson .suite = { 1630f7cb80f2SJarod Wilson .cipher = { 1631f7cb80f2SJarod Wilson .enc = { 1632f7cb80f2SJarod Wilson .vecs = aes_ctr_enc_tv_template, 1633f7cb80f2SJarod Wilson .count = AES_CTR_ENC_TEST_VECTORS 1634f7cb80f2SJarod Wilson }, 1635f7cb80f2SJarod Wilson .dec = { 1636f7cb80f2SJarod Wilson .vecs = aes_ctr_dec_tv_template, 1637f7cb80f2SJarod Wilson .count = AES_CTR_DEC_TEST_VECTORS 1638f7cb80f2SJarod Wilson } 1639f7cb80f2SJarod Wilson } 1640f7cb80f2SJarod Wilson } 1641f7cb80f2SJarod Wilson }, { 1642da7f033dSHerbert Xu .alg = "cts(cbc(aes))", 16431aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1644da7f033dSHerbert Xu .suite = { 1645da7f033dSHerbert Xu .cipher = { 1646da7f033dSHerbert Xu .enc = { 1647da7f033dSHerbert Xu .vecs = cts_mode_enc_tv_template, 1648da7f033dSHerbert Xu .count = CTS_MODE_ENC_TEST_VECTORS 1649da7f033dSHerbert Xu }, 1650da7f033dSHerbert Xu .dec = { 1651da7f033dSHerbert Xu .vecs = cts_mode_dec_tv_template, 1652da7f033dSHerbert Xu .count = CTS_MODE_DEC_TEST_VECTORS 1653da7f033dSHerbert Xu } 1654da7f033dSHerbert Xu } 1655da7f033dSHerbert Xu } 1656da7f033dSHerbert Xu }, { 1657da7f033dSHerbert Xu .alg = "deflate", 1658da7f033dSHerbert Xu .test = alg_test_comp, 1659da7f033dSHerbert Xu .suite = { 1660da7f033dSHerbert Xu .comp = { 1661da7f033dSHerbert Xu .comp = { 1662da7f033dSHerbert Xu .vecs = deflate_comp_tv_template, 1663da7f033dSHerbert Xu .count = DEFLATE_COMP_TEST_VECTORS 1664da7f033dSHerbert Xu }, 1665da7f033dSHerbert Xu .decomp = { 1666da7f033dSHerbert Xu .vecs = deflate_decomp_tv_template, 1667da7f033dSHerbert Xu .count = DEFLATE_DECOMP_TEST_VECTORS 1668da7f033dSHerbert Xu } 1669da7f033dSHerbert Xu } 1670da7f033dSHerbert Xu } 1671da7f033dSHerbert Xu }, { 1672da7f033dSHerbert Xu .alg = "ecb(aes)", 16731aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1674a1915d51SJarod Wilson .fips_allowed = 1, 1675da7f033dSHerbert Xu .suite = { 1676da7f033dSHerbert Xu .cipher = { 1677da7f033dSHerbert Xu .enc = { 1678da7f033dSHerbert Xu .vecs = aes_enc_tv_template, 1679da7f033dSHerbert Xu .count = AES_ENC_TEST_VECTORS 1680da7f033dSHerbert Xu }, 1681da7f033dSHerbert Xu .dec = { 1682da7f033dSHerbert Xu .vecs = aes_dec_tv_template, 1683da7f033dSHerbert Xu .count = AES_DEC_TEST_VECTORS 1684da7f033dSHerbert Xu } 1685da7f033dSHerbert Xu } 1686da7f033dSHerbert Xu } 1687da7f033dSHerbert Xu }, { 1688da7f033dSHerbert Xu .alg = "ecb(anubis)", 16891aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1690da7f033dSHerbert Xu .suite = { 1691da7f033dSHerbert Xu .cipher = { 1692da7f033dSHerbert Xu .enc = { 1693da7f033dSHerbert Xu .vecs = anubis_enc_tv_template, 1694da7f033dSHerbert Xu .count = ANUBIS_ENC_TEST_VECTORS 1695da7f033dSHerbert Xu }, 1696da7f033dSHerbert Xu .dec = { 1697da7f033dSHerbert Xu .vecs = anubis_dec_tv_template, 1698da7f033dSHerbert Xu .count = ANUBIS_DEC_TEST_VECTORS 1699da7f033dSHerbert Xu } 1700da7f033dSHerbert Xu } 1701da7f033dSHerbert Xu } 1702da7f033dSHerbert Xu }, { 1703da7f033dSHerbert Xu .alg = "ecb(arc4)", 17041aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1705da7f033dSHerbert Xu .suite = { 1706da7f033dSHerbert Xu .cipher = { 1707da7f033dSHerbert Xu .enc = { 1708da7f033dSHerbert Xu .vecs = arc4_enc_tv_template, 1709da7f033dSHerbert Xu .count = ARC4_ENC_TEST_VECTORS 1710da7f033dSHerbert Xu }, 1711da7f033dSHerbert Xu .dec = { 1712da7f033dSHerbert Xu .vecs = arc4_dec_tv_template, 1713da7f033dSHerbert Xu .count = ARC4_DEC_TEST_VECTORS 1714da7f033dSHerbert Xu } 1715da7f033dSHerbert Xu } 1716da7f033dSHerbert Xu } 1717da7f033dSHerbert Xu }, { 1718da7f033dSHerbert Xu .alg = "ecb(blowfish)", 17191aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1720da7f033dSHerbert Xu .suite = { 1721da7f033dSHerbert Xu .cipher = { 1722da7f033dSHerbert Xu .enc = { 1723da7f033dSHerbert Xu .vecs = bf_enc_tv_template, 1724da7f033dSHerbert Xu .count = BF_ENC_TEST_VECTORS 1725da7f033dSHerbert Xu }, 1726da7f033dSHerbert Xu .dec = { 1727da7f033dSHerbert Xu .vecs = bf_dec_tv_template, 1728da7f033dSHerbert Xu .count = BF_DEC_TEST_VECTORS 1729da7f033dSHerbert Xu } 1730da7f033dSHerbert Xu } 1731da7f033dSHerbert Xu } 1732da7f033dSHerbert Xu }, { 1733da7f033dSHerbert Xu .alg = "ecb(camellia)", 17341aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1735da7f033dSHerbert Xu .suite = { 1736da7f033dSHerbert Xu .cipher = { 1737da7f033dSHerbert Xu .enc = { 1738da7f033dSHerbert Xu .vecs = camellia_enc_tv_template, 1739da7f033dSHerbert Xu .count = CAMELLIA_ENC_TEST_VECTORS 1740da7f033dSHerbert Xu }, 1741da7f033dSHerbert Xu .dec = { 1742da7f033dSHerbert Xu .vecs = camellia_dec_tv_template, 1743da7f033dSHerbert Xu .count = CAMELLIA_DEC_TEST_VECTORS 1744da7f033dSHerbert Xu } 1745da7f033dSHerbert Xu } 1746da7f033dSHerbert Xu } 1747da7f033dSHerbert Xu }, { 1748da7f033dSHerbert Xu .alg = "ecb(cast5)", 17491aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1750da7f033dSHerbert Xu .suite = { 1751da7f033dSHerbert Xu .cipher = { 1752da7f033dSHerbert Xu .enc = { 1753da7f033dSHerbert Xu .vecs = cast5_enc_tv_template, 1754da7f033dSHerbert Xu .count = CAST5_ENC_TEST_VECTORS 1755da7f033dSHerbert Xu }, 1756da7f033dSHerbert Xu .dec = { 1757da7f033dSHerbert Xu .vecs = cast5_dec_tv_template, 1758da7f033dSHerbert Xu .count = CAST5_DEC_TEST_VECTORS 1759da7f033dSHerbert Xu } 1760da7f033dSHerbert Xu } 1761da7f033dSHerbert Xu } 1762da7f033dSHerbert Xu }, { 1763da7f033dSHerbert Xu .alg = "ecb(cast6)", 17641aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1765da7f033dSHerbert Xu .suite = { 1766da7f033dSHerbert Xu .cipher = { 1767da7f033dSHerbert Xu .enc = { 1768da7f033dSHerbert Xu .vecs = cast6_enc_tv_template, 1769da7f033dSHerbert Xu .count = CAST6_ENC_TEST_VECTORS 1770da7f033dSHerbert Xu }, 1771da7f033dSHerbert Xu .dec = { 1772da7f033dSHerbert Xu .vecs = cast6_dec_tv_template, 1773da7f033dSHerbert Xu .count = CAST6_DEC_TEST_VECTORS 1774da7f033dSHerbert Xu } 1775da7f033dSHerbert Xu } 1776da7f033dSHerbert Xu } 1777da7f033dSHerbert Xu }, { 1778da7f033dSHerbert Xu .alg = "ecb(des)", 17791aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1780a1915d51SJarod Wilson .fips_allowed = 1, 1781da7f033dSHerbert Xu .suite = { 1782da7f033dSHerbert Xu .cipher = { 1783da7f033dSHerbert Xu .enc = { 1784da7f033dSHerbert Xu .vecs = des_enc_tv_template, 1785da7f033dSHerbert Xu .count = DES_ENC_TEST_VECTORS 1786da7f033dSHerbert Xu }, 1787da7f033dSHerbert Xu .dec = { 1788da7f033dSHerbert Xu .vecs = des_dec_tv_template, 1789da7f033dSHerbert Xu .count = DES_DEC_TEST_VECTORS 1790da7f033dSHerbert Xu } 1791da7f033dSHerbert Xu } 1792da7f033dSHerbert Xu } 1793da7f033dSHerbert Xu }, { 1794da7f033dSHerbert Xu .alg = "ecb(des3_ede)", 17951aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1796a1915d51SJarod Wilson .fips_allowed = 1, 1797da7f033dSHerbert Xu .suite = { 1798da7f033dSHerbert Xu .cipher = { 1799da7f033dSHerbert Xu .enc = { 1800da7f033dSHerbert Xu .vecs = des3_ede_enc_tv_template, 1801da7f033dSHerbert Xu .count = DES3_EDE_ENC_TEST_VECTORS 1802da7f033dSHerbert Xu }, 1803da7f033dSHerbert Xu .dec = { 1804da7f033dSHerbert Xu .vecs = des3_ede_dec_tv_template, 1805da7f033dSHerbert Xu .count = DES3_EDE_DEC_TEST_VECTORS 1806da7f033dSHerbert Xu } 1807da7f033dSHerbert Xu } 1808da7f033dSHerbert Xu } 1809da7f033dSHerbert Xu }, { 1810da7f033dSHerbert Xu .alg = "ecb(khazad)", 18111aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1812da7f033dSHerbert Xu .suite = { 1813da7f033dSHerbert Xu .cipher = { 1814da7f033dSHerbert Xu .enc = { 1815da7f033dSHerbert Xu .vecs = khazad_enc_tv_template, 1816da7f033dSHerbert Xu .count = KHAZAD_ENC_TEST_VECTORS 1817da7f033dSHerbert Xu }, 1818da7f033dSHerbert Xu .dec = { 1819da7f033dSHerbert Xu .vecs = khazad_dec_tv_template, 1820da7f033dSHerbert Xu .count = KHAZAD_DEC_TEST_VECTORS 1821da7f033dSHerbert Xu } 1822da7f033dSHerbert Xu } 1823da7f033dSHerbert Xu } 1824da7f033dSHerbert Xu }, { 1825da7f033dSHerbert Xu .alg = "ecb(seed)", 18261aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1827da7f033dSHerbert Xu .suite = { 1828da7f033dSHerbert Xu .cipher = { 1829da7f033dSHerbert Xu .enc = { 1830da7f033dSHerbert Xu .vecs = seed_enc_tv_template, 1831da7f033dSHerbert Xu .count = SEED_ENC_TEST_VECTORS 1832da7f033dSHerbert Xu }, 1833da7f033dSHerbert Xu .dec = { 1834da7f033dSHerbert Xu .vecs = seed_dec_tv_template, 1835da7f033dSHerbert Xu .count = SEED_DEC_TEST_VECTORS 1836da7f033dSHerbert Xu } 1837da7f033dSHerbert Xu } 1838da7f033dSHerbert Xu } 1839da7f033dSHerbert Xu }, { 1840da7f033dSHerbert Xu .alg = "ecb(serpent)", 18411aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1842da7f033dSHerbert Xu .suite = { 1843da7f033dSHerbert Xu .cipher = { 1844da7f033dSHerbert Xu .enc = { 1845da7f033dSHerbert Xu .vecs = serpent_enc_tv_template, 1846da7f033dSHerbert Xu .count = SERPENT_ENC_TEST_VECTORS 1847da7f033dSHerbert Xu }, 1848da7f033dSHerbert Xu .dec = { 1849da7f033dSHerbert Xu .vecs = serpent_dec_tv_template, 1850da7f033dSHerbert Xu .count = SERPENT_DEC_TEST_VECTORS 1851da7f033dSHerbert Xu } 1852da7f033dSHerbert Xu } 1853da7f033dSHerbert Xu } 1854da7f033dSHerbert Xu }, { 1855da7f033dSHerbert Xu .alg = "ecb(tea)", 18561aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1857da7f033dSHerbert Xu .suite = { 1858da7f033dSHerbert Xu .cipher = { 1859da7f033dSHerbert Xu .enc = { 1860da7f033dSHerbert Xu .vecs = tea_enc_tv_template, 1861da7f033dSHerbert Xu .count = TEA_ENC_TEST_VECTORS 1862da7f033dSHerbert Xu }, 1863da7f033dSHerbert Xu .dec = { 1864da7f033dSHerbert Xu .vecs = tea_dec_tv_template, 1865da7f033dSHerbert Xu .count = TEA_DEC_TEST_VECTORS 1866da7f033dSHerbert Xu } 1867da7f033dSHerbert Xu } 1868da7f033dSHerbert Xu } 1869da7f033dSHerbert Xu }, { 1870da7f033dSHerbert Xu .alg = "ecb(tnepres)", 18711aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1872da7f033dSHerbert Xu .suite = { 1873da7f033dSHerbert Xu .cipher = { 1874da7f033dSHerbert Xu .enc = { 1875da7f033dSHerbert Xu .vecs = tnepres_enc_tv_template, 1876da7f033dSHerbert Xu .count = TNEPRES_ENC_TEST_VECTORS 1877da7f033dSHerbert Xu }, 1878da7f033dSHerbert Xu .dec = { 1879da7f033dSHerbert Xu .vecs = tnepres_dec_tv_template, 1880da7f033dSHerbert Xu .count = TNEPRES_DEC_TEST_VECTORS 1881da7f033dSHerbert Xu } 1882da7f033dSHerbert Xu } 1883da7f033dSHerbert Xu } 1884da7f033dSHerbert Xu }, { 1885da7f033dSHerbert Xu .alg = "ecb(twofish)", 18861aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1887da7f033dSHerbert Xu .suite = { 1888da7f033dSHerbert Xu .cipher = { 1889da7f033dSHerbert Xu .enc = { 1890da7f033dSHerbert Xu .vecs = tf_enc_tv_template, 1891da7f033dSHerbert Xu .count = TF_ENC_TEST_VECTORS 1892da7f033dSHerbert Xu }, 1893da7f033dSHerbert Xu .dec = { 1894da7f033dSHerbert Xu .vecs = tf_dec_tv_template, 1895da7f033dSHerbert Xu .count = TF_DEC_TEST_VECTORS 1896da7f033dSHerbert Xu } 1897da7f033dSHerbert Xu } 1898da7f033dSHerbert Xu } 1899da7f033dSHerbert Xu }, { 1900da7f033dSHerbert Xu .alg = "ecb(xeta)", 19011aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1902da7f033dSHerbert Xu .suite = { 1903da7f033dSHerbert Xu .cipher = { 1904da7f033dSHerbert Xu .enc = { 1905da7f033dSHerbert Xu .vecs = xeta_enc_tv_template, 1906da7f033dSHerbert Xu .count = XETA_ENC_TEST_VECTORS 1907da7f033dSHerbert Xu }, 1908da7f033dSHerbert Xu .dec = { 1909da7f033dSHerbert Xu .vecs = xeta_dec_tv_template, 1910da7f033dSHerbert Xu .count = XETA_DEC_TEST_VECTORS 1911da7f033dSHerbert Xu } 1912da7f033dSHerbert Xu } 1913da7f033dSHerbert Xu } 1914da7f033dSHerbert Xu }, { 1915da7f033dSHerbert Xu .alg = "ecb(xtea)", 19161aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1917da7f033dSHerbert Xu .suite = { 1918da7f033dSHerbert Xu .cipher = { 1919da7f033dSHerbert Xu .enc = { 1920da7f033dSHerbert Xu .vecs = xtea_enc_tv_template, 1921da7f033dSHerbert Xu .count = XTEA_ENC_TEST_VECTORS 1922da7f033dSHerbert Xu }, 1923da7f033dSHerbert Xu .dec = { 1924da7f033dSHerbert Xu .vecs = xtea_dec_tv_template, 1925da7f033dSHerbert Xu .count = XTEA_DEC_TEST_VECTORS 1926da7f033dSHerbert Xu } 1927da7f033dSHerbert Xu } 1928da7f033dSHerbert Xu } 1929da7f033dSHerbert Xu }, { 1930da7f033dSHerbert Xu .alg = "gcm(aes)", 1931da7f033dSHerbert Xu .test = alg_test_aead, 1932a1915d51SJarod Wilson .fips_allowed = 1, 1933da7f033dSHerbert Xu .suite = { 1934da7f033dSHerbert Xu .aead = { 1935da7f033dSHerbert Xu .enc = { 1936da7f033dSHerbert Xu .vecs = aes_gcm_enc_tv_template, 1937da7f033dSHerbert Xu .count = AES_GCM_ENC_TEST_VECTORS 1938da7f033dSHerbert Xu }, 1939da7f033dSHerbert Xu .dec = { 1940da7f033dSHerbert Xu .vecs = aes_gcm_dec_tv_template, 1941da7f033dSHerbert Xu .count = AES_GCM_DEC_TEST_VECTORS 1942da7f033dSHerbert Xu } 1943da7f033dSHerbert Xu } 1944da7f033dSHerbert Xu } 1945da7f033dSHerbert Xu }, { 1946da7f033dSHerbert Xu .alg = "hmac(md5)", 1947da7f033dSHerbert Xu .test = alg_test_hash, 1948da7f033dSHerbert Xu .suite = { 1949da7f033dSHerbert Xu .hash = { 1950da7f033dSHerbert Xu .vecs = hmac_md5_tv_template, 1951da7f033dSHerbert Xu .count = HMAC_MD5_TEST_VECTORS 1952da7f033dSHerbert Xu } 1953da7f033dSHerbert Xu } 1954da7f033dSHerbert Xu }, { 1955da7f033dSHerbert Xu .alg = "hmac(rmd128)", 1956da7f033dSHerbert Xu .test = alg_test_hash, 1957da7f033dSHerbert Xu .suite = { 1958da7f033dSHerbert Xu .hash = { 1959da7f033dSHerbert Xu .vecs = hmac_rmd128_tv_template, 1960da7f033dSHerbert Xu .count = HMAC_RMD128_TEST_VECTORS 1961da7f033dSHerbert Xu } 1962da7f033dSHerbert Xu } 1963da7f033dSHerbert Xu }, { 1964da7f033dSHerbert Xu .alg = "hmac(rmd160)", 1965da7f033dSHerbert Xu .test = alg_test_hash, 1966da7f033dSHerbert Xu .suite = { 1967da7f033dSHerbert Xu .hash = { 1968da7f033dSHerbert Xu .vecs = hmac_rmd160_tv_template, 1969da7f033dSHerbert Xu .count = HMAC_RMD160_TEST_VECTORS 1970da7f033dSHerbert Xu } 1971da7f033dSHerbert Xu } 1972da7f033dSHerbert Xu }, { 1973da7f033dSHerbert Xu .alg = "hmac(sha1)", 1974da7f033dSHerbert Xu .test = alg_test_hash, 1975a1915d51SJarod Wilson .fips_allowed = 1, 1976da7f033dSHerbert Xu .suite = { 1977da7f033dSHerbert Xu .hash = { 1978da7f033dSHerbert Xu .vecs = hmac_sha1_tv_template, 1979da7f033dSHerbert Xu .count = HMAC_SHA1_TEST_VECTORS 1980da7f033dSHerbert Xu } 1981da7f033dSHerbert Xu } 1982da7f033dSHerbert Xu }, { 1983da7f033dSHerbert Xu .alg = "hmac(sha224)", 1984da7f033dSHerbert Xu .test = alg_test_hash, 1985a1915d51SJarod Wilson .fips_allowed = 1, 1986da7f033dSHerbert Xu .suite = { 1987da7f033dSHerbert Xu .hash = { 1988da7f033dSHerbert Xu .vecs = hmac_sha224_tv_template, 1989da7f033dSHerbert Xu .count = HMAC_SHA224_TEST_VECTORS 1990da7f033dSHerbert Xu } 1991da7f033dSHerbert Xu } 1992da7f033dSHerbert Xu }, { 1993da7f033dSHerbert Xu .alg = "hmac(sha256)", 1994da7f033dSHerbert Xu .test = alg_test_hash, 1995a1915d51SJarod Wilson .fips_allowed = 1, 1996da7f033dSHerbert Xu .suite = { 1997da7f033dSHerbert Xu .hash = { 1998da7f033dSHerbert Xu .vecs = hmac_sha256_tv_template, 1999da7f033dSHerbert Xu .count = HMAC_SHA256_TEST_VECTORS 2000da7f033dSHerbert Xu } 2001da7f033dSHerbert Xu } 2002da7f033dSHerbert Xu }, { 2003da7f033dSHerbert Xu .alg = "hmac(sha384)", 2004da7f033dSHerbert Xu .test = alg_test_hash, 2005a1915d51SJarod Wilson .fips_allowed = 1, 2006da7f033dSHerbert Xu .suite = { 2007da7f033dSHerbert Xu .hash = { 2008da7f033dSHerbert Xu .vecs = hmac_sha384_tv_template, 2009da7f033dSHerbert Xu .count = HMAC_SHA384_TEST_VECTORS 2010da7f033dSHerbert Xu } 2011da7f033dSHerbert Xu } 2012da7f033dSHerbert Xu }, { 2013da7f033dSHerbert Xu .alg = "hmac(sha512)", 2014da7f033dSHerbert Xu .test = alg_test_hash, 2015a1915d51SJarod Wilson .fips_allowed = 1, 2016da7f033dSHerbert Xu .suite = { 2017da7f033dSHerbert Xu .hash = { 2018da7f033dSHerbert Xu .vecs = hmac_sha512_tv_template, 2019da7f033dSHerbert Xu .count = HMAC_SHA512_TEST_VECTORS 2020da7f033dSHerbert Xu } 2021da7f033dSHerbert Xu } 2022da7f033dSHerbert Xu }, { 2023da7f033dSHerbert Xu .alg = "lrw(aes)", 20241aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2025da7f033dSHerbert Xu .suite = { 2026da7f033dSHerbert Xu .cipher = { 2027da7f033dSHerbert Xu .enc = { 2028da7f033dSHerbert Xu .vecs = aes_lrw_enc_tv_template, 2029da7f033dSHerbert Xu .count = AES_LRW_ENC_TEST_VECTORS 2030da7f033dSHerbert Xu }, 2031da7f033dSHerbert Xu .dec = { 2032da7f033dSHerbert Xu .vecs = aes_lrw_dec_tv_template, 2033da7f033dSHerbert Xu .count = AES_LRW_DEC_TEST_VECTORS 2034da7f033dSHerbert Xu } 2035da7f033dSHerbert Xu } 2036da7f033dSHerbert Xu } 2037da7f033dSHerbert Xu }, { 2038da7f033dSHerbert Xu .alg = "lzo", 2039da7f033dSHerbert Xu .test = alg_test_comp, 2040da7f033dSHerbert Xu .suite = { 2041da7f033dSHerbert Xu .comp = { 2042da7f033dSHerbert Xu .comp = { 2043da7f033dSHerbert Xu .vecs = lzo_comp_tv_template, 2044da7f033dSHerbert Xu .count = LZO_COMP_TEST_VECTORS 2045da7f033dSHerbert Xu }, 2046da7f033dSHerbert Xu .decomp = { 2047da7f033dSHerbert Xu .vecs = lzo_decomp_tv_template, 2048da7f033dSHerbert Xu .count = LZO_DECOMP_TEST_VECTORS 2049da7f033dSHerbert Xu } 2050da7f033dSHerbert Xu } 2051da7f033dSHerbert Xu } 2052da7f033dSHerbert Xu }, { 2053da7f033dSHerbert Xu .alg = "md4", 2054da7f033dSHerbert Xu .test = alg_test_hash, 2055da7f033dSHerbert Xu .suite = { 2056da7f033dSHerbert Xu .hash = { 2057da7f033dSHerbert Xu .vecs = md4_tv_template, 2058da7f033dSHerbert Xu .count = MD4_TEST_VECTORS 2059da7f033dSHerbert Xu } 2060da7f033dSHerbert Xu } 2061da7f033dSHerbert Xu }, { 2062da7f033dSHerbert Xu .alg = "md5", 2063da7f033dSHerbert Xu .test = alg_test_hash, 2064da7f033dSHerbert Xu .suite = { 2065da7f033dSHerbert Xu .hash = { 2066da7f033dSHerbert Xu .vecs = md5_tv_template, 2067da7f033dSHerbert Xu .count = MD5_TEST_VECTORS 2068da7f033dSHerbert Xu } 2069da7f033dSHerbert Xu } 2070da7f033dSHerbert Xu }, { 2071da7f033dSHerbert Xu .alg = "michael_mic", 2072da7f033dSHerbert Xu .test = alg_test_hash, 2073da7f033dSHerbert Xu .suite = { 2074da7f033dSHerbert Xu .hash = { 2075da7f033dSHerbert Xu .vecs = michael_mic_tv_template, 2076da7f033dSHerbert Xu .count = MICHAEL_MIC_TEST_VECTORS 2077da7f033dSHerbert Xu } 2078da7f033dSHerbert Xu } 2079da7f033dSHerbert Xu }, { 2080da7f033dSHerbert Xu .alg = "pcbc(fcrypt)", 20811aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2082da7f033dSHerbert Xu .suite = { 2083da7f033dSHerbert Xu .cipher = { 2084da7f033dSHerbert Xu .enc = { 2085da7f033dSHerbert Xu .vecs = fcrypt_pcbc_enc_tv_template, 2086da7f033dSHerbert Xu .count = FCRYPT_ENC_TEST_VECTORS 2087da7f033dSHerbert Xu }, 2088da7f033dSHerbert Xu .dec = { 2089da7f033dSHerbert Xu .vecs = fcrypt_pcbc_dec_tv_template, 2090da7f033dSHerbert Xu .count = FCRYPT_DEC_TEST_VECTORS 2091da7f033dSHerbert Xu } 2092da7f033dSHerbert Xu } 2093da7f033dSHerbert Xu } 2094da7f033dSHerbert Xu }, { 2095da7f033dSHerbert Xu .alg = "rfc3686(ctr(aes))", 20961aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2097a1915d51SJarod Wilson .fips_allowed = 1, 2098da7f033dSHerbert Xu .suite = { 2099da7f033dSHerbert Xu .cipher = { 2100da7f033dSHerbert Xu .enc = { 2101f7cb80f2SJarod Wilson .vecs = aes_ctr_rfc3686_enc_tv_template, 2102f7cb80f2SJarod Wilson .count = AES_CTR_3686_ENC_TEST_VECTORS 2103da7f033dSHerbert Xu }, 2104da7f033dSHerbert Xu .dec = { 2105f7cb80f2SJarod Wilson .vecs = aes_ctr_rfc3686_dec_tv_template, 2106f7cb80f2SJarod Wilson .count = AES_CTR_3686_DEC_TEST_VECTORS 2107da7f033dSHerbert Xu } 2108da7f033dSHerbert Xu } 2109da7f033dSHerbert Xu } 2110da7f033dSHerbert Xu }, { 21115d667322SJarod Wilson .alg = "rfc4309(ccm(aes))", 21125d667322SJarod Wilson .test = alg_test_aead, 2113a1915d51SJarod Wilson .fips_allowed = 1, 21145d667322SJarod Wilson .suite = { 21155d667322SJarod Wilson .aead = { 21165d667322SJarod Wilson .enc = { 21175d667322SJarod Wilson .vecs = aes_ccm_rfc4309_enc_tv_template, 21185d667322SJarod Wilson .count = AES_CCM_4309_ENC_TEST_VECTORS 21195d667322SJarod Wilson }, 21205d667322SJarod Wilson .dec = { 21215d667322SJarod Wilson .vecs = aes_ccm_rfc4309_dec_tv_template, 21225d667322SJarod Wilson .count = AES_CCM_4309_DEC_TEST_VECTORS 21235d667322SJarod Wilson } 21245d667322SJarod Wilson } 21255d667322SJarod Wilson } 21265d667322SJarod Wilson }, { 2127da7f033dSHerbert Xu .alg = "rmd128", 2128da7f033dSHerbert Xu .test = alg_test_hash, 2129da7f033dSHerbert Xu .suite = { 2130da7f033dSHerbert Xu .hash = { 2131da7f033dSHerbert Xu .vecs = rmd128_tv_template, 2132da7f033dSHerbert Xu .count = RMD128_TEST_VECTORS 2133da7f033dSHerbert Xu } 2134da7f033dSHerbert Xu } 2135da7f033dSHerbert Xu }, { 2136da7f033dSHerbert Xu .alg = "rmd160", 2137da7f033dSHerbert Xu .test = alg_test_hash, 2138da7f033dSHerbert Xu .suite = { 2139da7f033dSHerbert Xu .hash = { 2140da7f033dSHerbert Xu .vecs = rmd160_tv_template, 2141da7f033dSHerbert Xu .count = RMD160_TEST_VECTORS 2142da7f033dSHerbert Xu } 2143da7f033dSHerbert Xu } 2144da7f033dSHerbert Xu }, { 2145da7f033dSHerbert Xu .alg = "rmd256", 2146da7f033dSHerbert Xu .test = alg_test_hash, 2147da7f033dSHerbert Xu .suite = { 2148da7f033dSHerbert Xu .hash = { 2149da7f033dSHerbert Xu .vecs = rmd256_tv_template, 2150da7f033dSHerbert Xu .count = RMD256_TEST_VECTORS 2151da7f033dSHerbert Xu } 2152da7f033dSHerbert Xu } 2153da7f033dSHerbert Xu }, { 2154da7f033dSHerbert Xu .alg = "rmd320", 2155da7f033dSHerbert Xu .test = alg_test_hash, 2156da7f033dSHerbert Xu .suite = { 2157da7f033dSHerbert Xu .hash = { 2158da7f033dSHerbert Xu .vecs = rmd320_tv_template, 2159da7f033dSHerbert Xu .count = RMD320_TEST_VECTORS 2160da7f033dSHerbert Xu } 2161da7f033dSHerbert Xu } 2162da7f033dSHerbert Xu }, { 2163da7f033dSHerbert Xu .alg = "salsa20", 21641aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2165da7f033dSHerbert Xu .suite = { 2166da7f033dSHerbert Xu .cipher = { 2167da7f033dSHerbert Xu .enc = { 2168da7f033dSHerbert Xu .vecs = salsa20_stream_enc_tv_template, 2169da7f033dSHerbert Xu .count = SALSA20_STREAM_ENC_TEST_VECTORS 2170da7f033dSHerbert Xu } 2171da7f033dSHerbert Xu } 2172da7f033dSHerbert Xu } 2173da7f033dSHerbert Xu }, { 2174da7f033dSHerbert Xu .alg = "sha1", 2175da7f033dSHerbert Xu .test = alg_test_hash, 2176a1915d51SJarod Wilson .fips_allowed = 1, 2177da7f033dSHerbert Xu .suite = { 2178da7f033dSHerbert Xu .hash = { 2179da7f033dSHerbert Xu .vecs = sha1_tv_template, 2180da7f033dSHerbert Xu .count = SHA1_TEST_VECTORS 2181da7f033dSHerbert Xu } 2182da7f033dSHerbert Xu } 2183da7f033dSHerbert Xu }, { 2184da7f033dSHerbert Xu .alg = "sha224", 2185da7f033dSHerbert Xu .test = alg_test_hash, 2186a1915d51SJarod Wilson .fips_allowed = 1, 2187da7f033dSHerbert Xu .suite = { 2188da7f033dSHerbert Xu .hash = { 2189da7f033dSHerbert Xu .vecs = sha224_tv_template, 2190da7f033dSHerbert Xu .count = SHA224_TEST_VECTORS 2191da7f033dSHerbert Xu } 2192da7f033dSHerbert Xu } 2193da7f033dSHerbert Xu }, { 2194da7f033dSHerbert Xu .alg = "sha256", 2195da7f033dSHerbert Xu .test = alg_test_hash, 2196a1915d51SJarod Wilson .fips_allowed = 1, 2197da7f033dSHerbert Xu .suite = { 2198da7f033dSHerbert Xu .hash = { 2199da7f033dSHerbert Xu .vecs = sha256_tv_template, 2200da7f033dSHerbert Xu .count = SHA256_TEST_VECTORS 2201da7f033dSHerbert Xu } 2202da7f033dSHerbert Xu } 2203da7f033dSHerbert Xu }, { 2204da7f033dSHerbert Xu .alg = "sha384", 2205da7f033dSHerbert Xu .test = alg_test_hash, 2206a1915d51SJarod Wilson .fips_allowed = 1, 2207da7f033dSHerbert Xu .suite = { 2208da7f033dSHerbert Xu .hash = { 2209da7f033dSHerbert Xu .vecs = sha384_tv_template, 2210da7f033dSHerbert Xu .count = SHA384_TEST_VECTORS 2211da7f033dSHerbert Xu } 2212da7f033dSHerbert Xu } 2213da7f033dSHerbert Xu }, { 2214da7f033dSHerbert Xu .alg = "sha512", 2215da7f033dSHerbert Xu .test = alg_test_hash, 2216a1915d51SJarod Wilson .fips_allowed = 1, 2217da7f033dSHerbert Xu .suite = { 2218da7f033dSHerbert Xu .hash = { 2219da7f033dSHerbert Xu .vecs = sha512_tv_template, 2220da7f033dSHerbert Xu .count = SHA512_TEST_VECTORS 2221da7f033dSHerbert Xu } 2222da7f033dSHerbert Xu } 2223da7f033dSHerbert Xu }, { 2224da7f033dSHerbert Xu .alg = "tgr128", 2225da7f033dSHerbert Xu .test = alg_test_hash, 2226da7f033dSHerbert Xu .suite = { 2227da7f033dSHerbert Xu .hash = { 2228da7f033dSHerbert Xu .vecs = tgr128_tv_template, 2229da7f033dSHerbert Xu .count = TGR128_TEST_VECTORS 2230da7f033dSHerbert Xu } 2231da7f033dSHerbert Xu } 2232da7f033dSHerbert Xu }, { 2233da7f033dSHerbert Xu .alg = "tgr160", 2234da7f033dSHerbert Xu .test = alg_test_hash, 2235da7f033dSHerbert Xu .suite = { 2236da7f033dSHerbert Xu .hash = { 2237da7f033dSHerbert Xu .vecs = tgr160_tv_template, 2238da7f033dSHerbert Xu .count = TGR160_TEST_VECTORS 2239da7f033dSHerbert Xu } 2240da7f033dSHerbert Xu } 2241da7f033dSHerbert Xu }, { 2242da7f033dSHerbert Xu .alg = "tgr192", 2243da7f033dSHerbert Xu .test = alg_test_hash, 2244da7f033dSHerbert Xu .suite = { 2245da7f033dSHerbert Xu .hash = { 2246da7f033dSHerbert Xu .vecs = tgr192_tv_template, 2247da7f033dSHerbert Xu .count = TGR192_TEST_VECTORS 2248da7f033dSHerbert Xu } 2249da7f033dSHerbert Xu } 2250da7f033dSHerbert Xu }, { 2251da7f033dSHerbert Xu .alg = "wp256", 2252da7f033dSHerbert Xu .test = alg_test_hash, 2253da7f033dSHerbert Xu .suite = { 2254da7f033dSHerbert Xu .hash = { 2255da7f033dSHerbert Xu .vecs = wp256_tv_template, 2256da7f033dSHerbert Xu .count = WP256_TEST_VECTORS 2257da7f033dSHerbert Xu } 2258da7f033dSHerbert Xu } 2259da7f033dSHerbert Xu }, { 2260da7f033dSHerbert Xu .alg = "wp384", 2261da7f033dSHerbert Xu .test = alg_test_hash, 2262da7f033dSHerbert Xu .suite = { 2263da7f033dSHerbert Xu .hash = { 2264da7f033dSHerbert Xu .vecs = wp384_tv_template, 2265da7f033dSHerbert Xu .count = WP384_TEST_VECTORS 2266da7f033dSHerbert Xu } 2267da7f033dSHerbert Xu } 2268da7f033dSHerbert Xu }, { 2269da7f033dSHerbert Xu .alg = "wp512", 2270da7f033dSHerbert Xu .test = alg_test_hash, 2271da7f033dSHerbert Xu .suite = { 2272da7f033dSHerbert Xu .hash = { 2273da7f033dSHerbert Xu .vecs = wp512_tv_template, 2274da7f033dSHerbert Xu .count = WP512_TEST_VECTORS 2275da7f033dSHerbert Xu } 2276da7f033dSHerbert Xu } 2277da7f033dSHerbert Xu }, { 2278da7f033dSHerbert Xu .alg = "xcbc(aes)", 2279da7f033dSHerbert Xu .test = alg_test_hash, 2280da7f033dSHerbert Xu .suite = { 2281da7f033dSHerbert Xu .hash = { 2282da7f033dSHerbert Xu .vecs = aes_xcbc128_tv_template, 2283da7f033dSHerbert Xu .count = XCBC_AES_TEST_VECTORS 2284da7f033dSHerbert Xu } 2285da7f033dSHerbert Xu } 2286da7f033dSHerbert Xu }, { 2287da7f033dSHerbert Xu .alg = "xts(aes)", 22881aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2289da7f033dSHerbert Xu .suite = { 2290da7f033dSHerbert Xu .cipher = { 2291da7f033dSHerbert Xu .enc = { 2292da7f033dSHerbert Xu .vecs = aes_xts_enc_tv_template, 2293da7f033dSHerbert Xu .count = AES_XTS_ENC_TEST_VECTORS 2294da7f033dSHerbert Xu }, 2295da7f033dSHerbert Xu .dec = { 2296da7f033dSHerbert Xu .vecs = aes_xts_dec_tv_template, 2297da7f033dSHerbert Xu .count = AES_XTS_DEC_TEST_VECTORS 2298da7f033dSHerbert Xu } 2299da7f033dSHerbert Xu } 2300da7f033dSHerbert Xu } 23010c01aed5SGeert Uytterhoeven }, { 23020c01aed5SGeert Uytterhoeven .alg = "zlib", 23030c01aed5SGeert Uytterhoeven .test = alg_test_pcomp, 23040c01aed5SGeert Uytterhoeven .suite = { 23050c01aed5SGeert Uytterhoeven .pcomp = { 23060c01aed5SGeert Uytterhoeven .comp = { 23070c01aed5SGeert Uytterhoeven .vecs = zlib_comp_tv_template, 23080c01aed5SGeert Uytterhoeven .count = ZLIB_COMP_TEST_VECTORS 23090c01aed5SGeert Uytterhoeven }, 23100c01aed5SGeert Uytterhoeven .decomp = { 23110c01aed5SGeert Uytterhoeven .vecs = zlib_decomp_tv_template, 23120c01aed5SGeert Uytterhoeven .count = ZLIB_DECOMP_TEST_VECTORS 23130c01aed5SGeert Uytterhoeven } 23140c01aed5SGeert Uytterhoeven } 23150c01aed5SGeert Uytterhoeven } 2316da7f033dSHerbert Xu } 2317da7f033dSHerbert Xu }; 2318da7f033dSHerbert Xu 23191aa4ecd9SHerbert Xu static int alg_find_test(const char *alg) 2320da7f033dSHerbert Xu { 2321da7f033dSHerbert Xu int start = 0; 2322da7f033dSHerbert Xu int end = ARRAY_SIZE(alg_test_descs); 2323da7f033dSHerbert Xu 2324da7f033dSHerbert Xu while (start < end) { 2325da7f033dSHerbert Xu int i = (start + end) / 2; 2326da7f033dSHerbert Xu int diff = strcmp(alg_test_descs[i].alg, alg); 2327da7f033dSHerbert Xu 2328da7f033dSHerbert Xu if (diff > 0) { 2329da7f033dSHerbert Xu end = i; 2330da7f033dSHerbert Xu continue; 2331da7f033dSHerbert Xu } 2332da7f033dSHerbert Xu 2333da7f033dSHerbert Xu if (diff < 0) { 2334da7f033dSHerbert Xu start = i + 1; 2335da7f033dSHerbert Xu continue; 2336da7f033dSHerbert Xu } 2337da7f033dSHerbert Xu 23381aa4ecd9SHerbert Xu return i; 2339da7f033dSHerbert Xu } 2340da7f033dSHerbert Xu 23411aa4ecd9SHerbert Xu return -1; 23421aa4ecd9SHerbert Xu } 23431aa4ecd9SHerbert Xu 23441aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 23451aa4ecd9SHerbert Xu { 23461aa4ecd9SHerbert Xu int i; 2347*a68f6610SHerbert Xu int j; 2348d12d6b6dSNeil Horman int rc; 23491aa4ecd9SHerbert Xu 23501aa4ecd9SHerbert Xu if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) { 23511aa4ecd9SHerbert Xu char nalg[CRYPTO_MAX_ALG_NAME]; 23521aa4ecd9SHerbert Xu 23531aa4ecd9SHerbert Xu if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >= 23541aa4ecd9SHerbert Xu sizeof(nalg)) 23551aa4ecd9SHerbert Xu return -ENAMETOOLONG; 23561aa4ecd9SHerbert Xu 23571aa4ecd9SHerbert Xu i = alg_find_test(nalg); 23581aa4ecd9SHerbert Xu if (i < 0) 23591aa4ecd9SHerbert Xu goto notest; 23601aa4ecd9SHerbert Xu 2361a3bef3a3SJarod Wilson if (fips_enabled && !alg_test_descs[i].fips_allowed) 2362a3bef3a3SJarod Wilson goto non_fips_alg; 2363a3bef3a3SJarod Wilson 2364941fb328SJarod Wilson rc = alg_test_cipher(alg_test_descs + i, driver, type, mask); 2365941fb328SJarod Wilson goto test_done; 23661aa4ecd9SHerbert Xu } 23671aa4ecd9SHerbert Xu 23681aa4ecd9SHerbert Xu i = alg_find_test(alg); 2369*a68f6610SHerbert Xu j = alg_find_test(driver); 2370*a68f6610SHerbert Xu if (i < 0 && j < 0) 23711aa4ecd9SHerbert Xu goto notest; 23721aa4ecd9SHerbert Xu 2373*a68f6610SHerbert Xu if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) || 2374*a68f6610SHerbert Xu (j >= 0 && !alg_test_descs[j].fips_allowed))) 2375a3bef3a3SJarod Wilson goto non_fips_alg; 2376a3bef3a3SJarod Wilson 2377*a68f6610SHerbert Xu rc = 0; 2378*a68f6610SHerbert Xu if (i >= 0) 2379*a68f6610SHerbert Xu rc |= alg_test_descs[i].test(alg_test_descs + i, driver, 23801aa4ecd9SHerbert Xu type, mask); 2381*a68f6610SHerbert Xu if (j >= 0) 2382*a68f6610SHerbert Xu rc |= alg_test_descs[j].test(alg_test_descs + j, driver, 2383*a68f6610SHerbert Xu type, mask); 2384*a68f6610SHerbert Xu 2385941fb328SJarod Wilson test_done: 2386d12d6b6dSNeil Horman if (fips_enabled && rc) 2387d12d6b6dSNeil Horman panic("%s: %s alg self test failed in fips mode!\n", driver, alg); 2388d12d6b6dSNeil Horman 238929ecd4abSJarod Wilson if (fips_enabled && !rc) 239029ecd4abSJarod Wilson printk(KERN_INFO "alg: self-tests for %s (%s) passed\n", 239129ecd4abSJarod Wilson driver, alg); 239229ecd4abSJarod Wilson 2393d12d6b6dSNeil Horman return rc; 23941aa4ecd9SHerbert Xu 23951aa4ecd9SHerbert Xu notest: 2396da7f033dSHerbert Xu printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver); 2397da7f033dSHerbert Xu return 0; 2398a3bef3a3SJarod Wilson non_fips_alg: 2399a3bef3a3SJarod Wilson return -EINVAL; 2400da7f033dSHerbert Xu } 2401da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test); 2402