1da7f033dSHerbert Xu /* 2da7f033dSHerbert Xu * Algorithm testing framework and tests. 3da7f033dSHerbert Xu * 4da7f033dSHerbert Xu * Copyright (c) 2002 James Morris <jmorris@intercode.com.au> 5da7f033dSHerbert Xu * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org> 6da7f033dSHerbert Xu * Copyright (c) 2007 Nokia Siemens Networks 7da7f033dSHerbert Xu * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au> 8da7f033dSHerbert Xu * 969435b94SAdrian Hoban * Updated RFC4106 AES-GCM testing. 1069435b94SAdrian Hoban * Authors: Aidan O'Mahony (aidan.o.mahony@intel.com) 1169435b94SAdrian Hoban * Adrian Hoban <adrian.hoban@intel.com> 1269435b94SAdrian Hoban * Gabriele Paoloni <gabriele.paoloni@intel.com> 1369435b94SAdrian Hoban * Tadeusz Struk (tadeusz.struk@intel.com) 1469435b94SAdrian Hoban * Copyright (c) 2010, Intel Corporation. 1569435b94SAdrian Hoban * 16da7f033dSHerbert Xu * This program is free software; you can redistribute it and/or modify it 17da7f033dSHerbert Xu * under the terms of the GNU General Public License as published by the Free 18da7f033dSHerbert Xu * Software Foundation; either version 2 of the License, or (at your option) 19da7f033dSHerbert Xu * any later version. 20da7f033dSHerbert Xu * 21da7f033dSHerbert Xu */ 22da7f033dSHerbert Xu 23da7f033dSHerbert Xu #include <crypto/hash.h> 24da7f033dSHerbert Xu #include <linux/err.h> 25da7f033dSHerbert Xu #include <linux/module.h> 26da7f033dSHerbert Xu #include <linux/scatterlist.h> 27da7f033dSHerbert Xu #include <linux/slab.h> 28da7f033dSHerbert Xu #include <linux/string.h> 297647d6ceSJarod Wilson #include <crypto/rng.h> 30da7f033dSHerbert Xu 31da7f033dSHerbert Xu #include "internal.h" 320b767f96SAlexander Shishkin 33326a6346SHerbert Xu #ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS 340b767f96SAlexander Shishkin 350b767f96SAlexander Shishkin /* a perfect nop */ 360b767f96SAlexander Shishkin int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 370b767f96SAlexander Shishkin { 380b767f96SAlexander Shishkin return 0; 390b767f96SAlexander Shishkin } 400b767f96SAlexander Shishkin 410b767f96SAlexander Shishkin #else 420b767f96SAlexander Shishkin 43da7f033dSHerbert Xu #include "testmgr.h" 44da7f033dSHerbert Xu 45da7f033dSHerbert Xu /* 46da7f033dSHerbert Xu * Need slab memory for testing (size in number of pages). 47da7f033dSHerbert Xu */ 48da7f033dSHerbert Xu #define XBUFSIZE 8 49da7f033dSHerbert Xu 50da7f033dSHerbert Xu /* 51da7f033dSHerbert Xu * Indexes into the xbuf to simulate cross-page access. 52da7f033dSHerbert Xu */ 53da7f033dSHerbert Xu #define IDX1 32 54da7f033dSHerbert Xu #define IDX2 32400 55da7f033dSHerbert Xu #define IDX3 1 56da7f033dSHerbert Xu #define IDX4 8193 57da7f033dSHerbert Xu #define IDX5 22222 58da7f033dSHerbert Xu #define IDX6 17101 59da7f033dSHerbert Xu #define IDX7 27333 60da7f033dSHerbert Xu #define IDX8 3000 61da7f033dSHerbert Xu 62da7f033dSHerbert Xu /* 63da7f033dSHerbert Xu * Used by test_cipher() 64da7f033dSHerbert Xu */ 65da7f033dSHerbert Xu #define ENCRYPT 1 66da7f033dSHerbert Xu #define DECRYPT 0 67da7f033dSHerbert Xu 68da7f033dSHerbert Xu struct tcrypt_result { 69da7f033dSHerbert Xu struct completion completion; 70da7f033dSHerbert Xu int err; 71da7f033dSHerbert Xu }; 72da7f033dSHerbert Xu 73da7f033dSHerbert Xu struct aead_test_suite { 74da7f033dSHerbert Xu struct { 75da7f033dSHerbert Xu struct aead_testvec *vecs; 76da7f033dSHerbert Xu unsigned int count; 77da7f033dSHerbert Xu } enc, dec; 78da7f033dSHerbert Xu }; 79da7f033dSHerbert Xu 80da7f033dSHerbert Xu struct cipher_test_suite { 81da7f033dSHerbert Xu struct { 82da7f033dSHerbert Xu struct cipher_testvec *vecs; 83da7f033dSHerbert Xu unsigned int count; 84da7f033dSHerbert Xu } enc, dec; 85da7f033dSHerbert Xu }; 86da7f033dSHerbert Xu 87da7f033dSHerbert Xu struct comp_test_suite { 88da7f033dSHerbert Xu struct { 89da7f033dSHerbert Xu struct comp_testvec *vecs; 90da7f033dSHerbert Xu unsigned int count; 91da7f033dSHerbert Xu } comp, decomp; 92da7f033dSHerbert Xu }; 93da7f033dSHerbert Xu 948064efb8SGeert Uytterhoeven struct pcomp_test_suite { 958064efb8SGeert Uytterhoeven struct { 968064efb8SGeert Uytterhoeven struct pcomp_testvec *vecs; 978064efb8SGeert Uytterhoeven unsigned int count; 988064efb8SGeert Uytterhoeven } comp, decomp; 998064efb8SGeert Uytterhoeven }; 1008064efb8SGeert Uytterhoeven 101da7f033dSHerbert Xu struct hash_test_suite { 102da7f033dSHerbert Xu struct hash_testvec *vecs; 103da7f033dSHerbert Xu unsigned int count; 104da7f033dSHerbert Xu }; 105da7f033dSHerbert Xu 1067647d6ceSJarod Wilson struct cprng_test_suite { 1077647d6ceSJarod Wilson struct cprng_testvec *vecs; 1087647d6ceSJarod Wilson unsigned int count; 1097647d6ceSJarod Wilson }; 1107647d6ceSJarod Wilson 111da7f033dSHerbert Xu struct alg_test_desc { 112da7f033dSHerbert Xu const char *alg; 113da7f033dSHerbert Xu int (*test)(const struct alg_test_desc *desc, const char *driver, 114da7f033dSHerbert Xu u32 type, u32 mask); 115a1915d51SJarod Wilson int fips_allowed; /* set if alg is allowed in fips mode */ 116da7f033dSHerbert Xu 117da7f033dSHerbert Xu union { 118da7f033dSHerbert Xu struct aead_test_suite aead; 119da7f033dSHerbert Xu struct cipher_test_suite cipher; 120da7f033dSHerbert Xu struct comp_test_suite comp; 1218064efb8SGeert Uytterhoeven struct pcomp_test_suite pcomp; 122da7f033dSHerbert Xu struct hash_test_suite hash; 1237647d6ceSJarod Wilson struct cprng_test_suite cprng; 124da7f033dSHerbert Xu } suite; 125da7f033dSHerbert Xu }; 126da7f033dSHerbert Xu 127da7f033dSHerbert Xu static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 }; 128da7f033dSHerbert Xu 129da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len) 130da7f033dSHerbert Xu { 131da7f033dSHerbert Xu print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET, 132da7f033dSHerbert Xu 16, 1, 133da7f033dSHerbert Xu buf, len, false); 134da7f033dSHerbert Xu } 135da7f033dSHerbert Xu 136da7f033dSHerbert Xu static void tcrypt_complete(struct crypto_async_request *req, int err) 137da7f033dSHerbert Xu { 138da7f033dSHerbert Xu struct tcrypt_result *res = req->data; 139da7f033dSHerbert Xu 140da7f033dSHerbert Xu if (err == -EINPROGRESS) 141da7f033dSHerbert Xu return; 142da7f033dSHerbert Xu 143da7f033dSHerbert Xu res->err = err; 144da7f033dSHerbert Xu complete(&res->completion); 145da7f033dSHerbert Xu } 146da7f033dSHerbert Xu 147f8b0d4d0SHerbert Xu static int testmgr_alloc_buf(char *buf[XBUFSIZE]) 148f8b0d4d0SHerbert Xu { 149f8b0d4d0SHerbert Xu int i; 150f8b0d4d0SHerbert Xu 151f8b0d4d0SHerbert Xu for (i = 0; i < XBUFSIZE; i++) { 152f8b0d4d0SHerbert Xu buf[i] = (void *)__get_free_page(GFP_KERNEL); 153f8b0d4d0SHerbert Xu if (!buf[i]) 154f8b0d4d0SHerbert Xu goto err_free_buf; 155f8b0d4d0SHerbert Xu } 156f8b0d4d0SHerbert Xu 157f8b0d4d0SHerbert Xu return 0; 158f8b0d4d0SHerbert Xu 159f8b0d4d0SHerbert Xu err_free_buf: 160f8b0d4d0SHerbert Xu while (i-- > 0) 161f8b0d4d0SHerbert Xu free_page((unsigned long)buf[i]); 162f8b0d4d0SHerbert Xu 163f8b0d4d0SHerbert Xu return -ENOMEM; 164f8b0d4d0SHerbert Xu } 165f8b0d4d0SHerbert Xu 166f8b0d4d0SHerbert Xu static void testmgr_free_buf(char *buf[XBUFSIZE]) 167f8b0d4d0SHerbert Xu { 168f8b0d4d0SHerbert Xu int i; 169f8b0d4d0SHerbert Xu 170f8b0d4d0SHerbert Xu for (i = 0; i < XBUFSIZE; i++) 171f8b0d4d0SHerbert Xu free_page((unsigned long)buf[i]); 172f8b0d4d0SHerbert Xu } 173f8b0d4d0SHerbert Xu 174a8f1a052SDavid S. Miller static int do_one_async_hash_op(struct ahash_request *req, 175a8f1a052SDavid S. Miller struct tcrypt_result *tr, 176a8f1a052SDavid S. Miller int ret) 177a8f1a052SDavid S. Miller { 178a8f1a052SDavid S. Miller if (ret == -EINPROGRESS || ret == -EBUSY) { 179a8f1a052SDavid S. Miller ret = wait_for_completion_interruptible(&tr->completion); 180a8f1a052SDavid S. Miller if (!ret) 181a8f1a052SDavid S. Miller ret = tr->err; 182a8f1a052SDavid S. Miller INIT_COMPLETION(tr->completion); 183a8f1a052SDavid S. Miller } 184a8f1a052SDavid S. Miller return ret; 185a8f1a052SDavid S. Miller } 186a8f1a052SDavid S. Miller 187da7f033dSHerbert Xu static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template, 188a8f1a052SDavid S. Miller unsigned int tcount, bool use_digest) 189da7f033dSHerbert Xu { 190da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm)); 191da7f033dSHerbert Xu unsigned int i, j, k, temp; 192da7f033dSHerbert Xu struct scatterlist sg[8]; 193da7f033dSHerbert Xu char result[64]; 194da7f033dSHerbert Xu struct ahash_request *req; 195da7f033dSHerbert Xu struct tcrypt_result tresult; 196da7f033dSHerbert Xu void *hash_buff; 197f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 198f8b0d4d0SHerbert Xu int ret = -ENOMEM; 199f8b0d4d0SHerbert Xu 200f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 201f8b0d4d0SHerbert Xu goto out_nobuf; 202da7f033dSHerbert Xu 203da7f033dSHerbert Xu init_completion(&tresult.completion); 204da7f033dSHerbert Xu 205da7f033dSHerbert Xu req = ahash_request_alloc(tfm, GFP_KERNEL); 206da7f033dSHerbert Xu if (!req) { 207da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to allocate request for " 208da7f033dSHerbert Xu "%s\n", algo); 209da7f033dSHerbert Xu goto out_noreq; 210da7f033dSHerbert Xu } 211da7f033dSHerbert Xu ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 212da7f033dSHerbert Xu tcrypt_complete, &tresult); 213da7f033dSHerbert Xu 214a0cfae59SHerbert Xu j = 0; 215da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 216a0cfae59SHerbert Xu if (template[i].np) 217a0cfae59SHerbert Xu continue; 218a0cfae59SHerbert Xu 219a0cfae59SHerbert Xu j++; 220da7f033dSHerbert Xu memset(result, 0, 64); 221da7f033dSHerbert Xu 222da7f033dSHerbert Xu hash_buff = xbuf[0]; 223da7f033dSHerbert Xu 224da7f033dSHerbert Xu memcpy(hash_buff, template[i].plaintext, template[i].psize); 225da7f033dSHerbert Xu sg_init_one(&sg[0], hash_buff, template[i].psize); 226da7f033dSHerbert Xu 227da7f033dSHerbert Xu if (template[i].ksize) { 228da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 229da7f033dSHerbert Xu ret = crypto_ahash_setkey(tfm, template[i].key, 230da7f033dSHerbert Xu template[i].ksize); 231da7f033dSHerbert Xu if (ret) { 232da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey failed on " 233a0cfae59SHerbert Xu "test %d for %s: ret=%d\n", j, algo, 234da7f033dSHerbert Xu -ret); 235da7f033dSHerbert Xu goto out; 236da7f033dSHerbert Xu } 237da7f033dSHerbert Xu } 238da7f033dSHerbert Xu 239da7f033dSHerbert Xu ahash_request_set_crypt(req, sg, result, template[i].psize); 240a8f1a052SDavid S. Miller if (use_digest) { 241a8f1a052SDavid S. Miller ret = do_one_async_hash_op(req, &tresult, 242a8f1a052SDavid S. Miller crypto_ahash_digest(req)); 243a8f1a052SDavid S. Miller if (ret) { 244a8f1a052SDavid S. Miller pr_err("alg: hash: digest failed on test %d " 245a0cfae59SHerbert Xu "for %s: ret=%d\n", j, algo, -ret); 246da7f033dSHerbert Xu goto out; 247da7f033dSHerbert Xu } 248a8f1a052SDavid S. Miller } else { 249a8f1a052SDavid S. Miller ret = do_one_async_hash_op(req, &tresult, 250a8f1a052SDavid S. Miller crypto_ahash_init(req)); 251a8f1a052SDavid S. Miller if (ret) { 252a8f1a052SDavid S. Miller pr_err("alt: hash: init failed on test %d " 253a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 254a8f1a052SDavid S. Miller goto out; 255a8f1a052SDavid S. Miller } 256a8f1a052SDavid S. Miller ret = do_one_async_hash_op(req, &tresult, 257a8f1a052SDavid S. Miller crypto_ahash_update(req)); 258a8f1a052SDavid S. Miller if (ret) { 259a8f1a052SDavid S. Miller pr_err("alt: hash: update failed on test %d " 260a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 261a8f1a052SDavid S. Miller goto out; 262a8f1a052SDavid S. Miller } 263a8f1a052SDavid S. Miller ret = do_one_async_hash_op(req, &tresult, 264a8f1a052SDavid S. Miller crypto_ahash_final(req)); 265a8f1a052SDavid S. Miller if (ret) { 266a8f1a052SDavid S. Miller pr_err("alt: hash: final failed on test %d " 267a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 268a8f1a052SDavid S. Miller goto out; 269a8f1a052SDavid S. Miller } 270a8f1a052SDavid S. Miller } 271da7f033dSHerbert Xu 272da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 273da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 274da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Test %d failed for %s\n", 275a0cfae59SHerbert Xu j, algo); 276da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 277da7f033dSHerbert Xu ret = -EINVAL; 278da7f033dSHerbert Xu goto out; 279da7f033dSHerbert Xu } 280da7f033dSHerbert Xu } 281da7f033dSHerbert Xu 282da7f033dSHerbert Xu j = 0; 283da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 284da7f033dSHerbert Xu if (template[i].np) { 285da7f033dSHerbert Xu j++; 286da7f033dSHerbert Xu memset(result, 0, 64); 287da7f033dSHerbert Xu 288da7f033dSHerbert Xu temp = 0; 289da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 290fd57f22aSHerbert Xu ret = -EINVAL; 291da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 292fd57f22aSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 293fd57f22aSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 294fd57f22aSHerbert Xu goto out; 295da7f033dSHerbert Xu sg_set_buf(&sg[k], 296da7f033dSHerbert Xu memcpy(xbuf[IDX[k] >> PAGE_SHIFT] + 297da7f033dSHerbert Xu offset_in_page(IDX[k]), 298da7f033dSHerbert Xu template[i].plaintext + temp, 299da7f033dSHerbert Xu template[i].tap[k]), 300da7f033dSHerbert Xu template[i].tap[k]); 301da7f033dSHerbert Xu temp += template[i].tap[k]; 302da7f033dSHerbert Xu } 303da7f033dSHerbert Xu 304da7f033dSHerbert Xu if (template[i].ksize) { 305da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 306da7f033dSHerbert Xu ret = crypto_ahash_setkey(tfm, template[i].key, 307da7f033dSHerbert Xu template[i].ksize); 308da7f033dSHerbert Xu 309da7f033dSHerbert Xu if (ret) { 310da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey " 311da7f033dSHerbert Xu "failed on chunking test %d " 312da7f033dSHerbert Xu "for %s: ret=%d\n", j, algo, 313da7f033dSHerbert Xu -ret); 314da7f033dSHerbert Xu goto out; 315da7f033dSHerbert Xu } 316da7f033dSHerbert Xu } 317da7f033dSHerbert Xu 318da7f033dSHerbert Xu ahash_request_set_crypt(req, sg, result, 319da7f033dSHerbert Xu template[i].psize); 320da7f033dSHerbert Xu ret = crypto_ahash_digest(req); 321da7f033dSHerbert Xu switch (ret) { 322da7f033dSHerbert Xu case 0: 323da7f033dSHerbert Xu break; 324da7f033dSHerbert Xu case -EINPROGRESS: 325da7f033dSHerbert Xu case -EBUSY: 326da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 327da7f033dSHerbert Xu &tresult.completion); 328da7f033dSHerbert Xu if (!ret && !(ret = tresult.err)) { 329da7f033dSHerbert Xu INIT_COMPLETION(tresult.completion); 330da7f033dSHerbert Xu break; 331da7f033dSHerbert Xu } 332da7f033dSHerbert Xu /* fall through */ 333da7f033dSHerbert Xu default: 334da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: digest failed " 335da7f033dSHerbert Xu "on chunking test %d for %s: " 336da7f033dSHerbert Xu "ret=%d\n", j, algo, -ret); 337da7f033dSHerbert Xu goto out; 338da7f033dSHerbert Xu } 339da7f033dSHerbert Xu 340da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 341da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 342da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Chunking test %d " 343da7f033dSHerbert Xu "failed for %s\n", j, algo); 344da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 345da7f033dSHerbert Xu ret = -EINVAL; 346da7f033dSHerbert Xu goto out; 347da7f033dSHerbert Xu } 348da7f033dSHerbert Xu } 349da7f033dSHerbert Xu } 350da7f033dSHerbert Xu 351da7f033dSHerbert Xu ret = 0; 352da7f033dSHerbert Xu 353da7f033dSHerbert Xu out: 354da7f033dSHerbert Xu ahash_request_free(req); 355da7f033dSHerbert Xu out_noreq: 356f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 357f8b0d4d0SHerbert Xu out_nobuf: 358da7f033dSHerbert Xu return ret; 359da7f033dSHerbert Xu } 360da7f033dSHerbert Xu 361da7f033dSHerbert Xu static int test_aead(struct crypto_aead *tfm, int enc, 362da7f033dSHerbert Xu struct aead_testvec *template, unsigned int tcount) 363da7f033dSHerbert Xu { 364da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)); 365da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 366f8b0d4d0SHerbert Xu int ret = -ENOMEM; 367da7f033dSHerbert Xu char *q; 368da7f033dSHerbert Xu char *key; 369da7f033dSHerbert Xu struct aead_request *req; 370da7f033dSHerbert Xu struct scatterlist sg[8]; 371da7f033dSHerbert Xu struct scatterlist asg[8]; 372da7f033dSHerbert Xu const char *e; 373da7f033dSHerbert Xu struct tcrypt_result result; 374da7f033dSHerbert Xu unsigned int authsize; 375da7f033dSHerbert Xu void *input; 376da7f033dSHerbert Xu void *assoc; 377da7f033dSHerbert Xu char iv[MAX_IVLEN]; 378f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 379f8b0d4d0SHerbert Xu char *axbuf[XBUFSIZE]; 380f8b0d4d0SHerbert Xu 381f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 382f8b0d4d0SHerbert Xu goto out_noxbuf; 383f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(axbuf)) 384f8b0d4d0SHerbert Xu goto out_noaxbuf; 385da7f033dSHerbert Xu 386da7f033dSHerbert Xu if (enc == ENCRYPT) 387da7f033dSHerbert Xu e = "encryption"; 388da7f033dSHerbert Xu else 389da7f033dSHerbert Xu e = "decryption"; 390da7f033dSHerbert Xu 391da7f033dSHerbert Xu init_completion(&result.completion); 392da7f033dSHerbert Xu 393da7f033dSHerbert Xu req = aead_request_alloc(tfm, GFP_KERNEL); 394da7f033dSHerbert Xu if (!req) { 395da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to allocate request for " 396da7f033dSHerbert Xu "%s\n", algo); 397da7f033dSHerbert Xu goto out; 398da7f033dSHerbert Xu } 399da7f033dSHerbert Xu 400da7f033dSHerbert Xu aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 401da7f033dSHerbert Xu tcrypt_complete, &result); 402da7f033dSHerbert Xu 403da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 404da7f033dSHerbert Xu if (!template[i].np) { 405da7f033dSHerbert Xu j++; 406da7f033dSHerbert Xu 407da7f033dSHerbert Xu /* some tepmplates have no input data but they will 408da7f033dSHerbert Xu * touch input 409da7f033dSHerbert Xu */ 410da7f033dSHerbert Xu input = xbuf[0]; 411da7f033dSHerbert Xu assoc = axbuf[0]; 412da7f033dSHerbert Xu 413fd57f22aSHerbert Xu ret = -EINVAL; 414fd57f22aSHerbert Xu if (WARN_ON(template[i].ilen > PAGE_SIZE || 415fd57f22aSHerbert Xu template[i].alen > PAGE_SIZE)) 416fd57f22aSHerbert Xu goto out; 417fd57f22aSHerbert Xu 418da7f033dSHerbert Xu memcpy(input, template[i].input, template[i].ilen); 419da7f033dSHerbert Xu memcpy(assoc, template[i].assoc, template[i].alen); 420da7f033dSHerbert Xu if (template[i].iv) 421da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 422da7f033dSHerbert Xu else 423da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 424da7f033dSHerbert Xu 425da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 426da7f033dSHerbert Xu if (template[i].wk) 427da7f033dSHerbert Xu crypto_aead_set_flags( 428da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 429da7f033dSHerbert Xu 430da7f033dSHerbert Xu key = template[i].key; 431da7f033dSHerbert Xu 432da7f033dSHerbert Xu ret = crypto_aead_setkey(tfm, key, 433da7f033dSHerbert Xu template[i].klen); 434da7f033dSHerbert Xu if (!ret == template[i].fail) { 435da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: setkey failed on " 436da7f033dSHerbert Xu "test %d for %s: flags=%x\n", j, algo, 437da7f033dSHerbert Xu crypto_aead_get_flags(tfm)); 438da7f033dSHerbert Xu goto out; 439da7f033dSHerbert Xu } else if (ret) 440da7f033dSHerbert Xu continue; 441da7f033dSHerbert Xu 442da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 443da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 444da7f033dSHerbert Xu if (ret) { 445da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to set " 446da7f033dSHerbert Xu "authsize to %u on test %d for %s\n", 447da7f033dSHerbert Xu authsize, j, algo); 448da7f033dSHerbert Xu goto out; 449da7f033dSHerbert Xu } 450da7f033dSHerbert Xu 451da7f033dSHerbert Xu sg_init_one(&sg[0], input, 452da7f033dSHerbert Xu template[i].ilen + (enc ? authsize : 0)); 453da7f033dSHerbert Xu 454da7f033dSHerbert Xu sg_init_one(&asg[0], assoc, template[i].alen); 455da7f033dSHerbert Xu 456da7f033dSHerbert Xu aead_request_set_crypt(req, sg, sg, 457da7f033dSHerbert Xu template[i].ilen, iv); 458da7f033dSHerbert Xu 459da7f033dSHerbert Xu aead_request_set_assoc(req, asg, template[i].alen); 460da7f033dSHerbert Xu 461da7f033dSHerbert Xu ret = enc ? 462da7f033dSHerbert Xu crypto_aead_encrypt(req) : 463da7f033dSHerbert Xu crypto_aead_decrypt(req); 464da7f033dSHerbert Xu 465da7f033dSHerbert Xu switch (ret) { 466da7f033dSHerbert Xu case 0: 467e44a1b44SJarod Wilson if (template[i].novrfy) { 468e44a1b44SJarod Wilson /* verification was supposed to fail */ 469e44a1b44SJarod Wilson printk(KERN_ERR "alg: aead: %s failed " 470e44a1b44SJarod Wilson "on test %d for %s: ret was 0, " 471e44a1b44SJarod Wilson "expected -EBADMSG\n", 472e44a1b44SJarod Wilson e, j, algo); 473e44a1b44SJarod Wilson /* so really, we got a bad message */ 474e44a1b44SJarod Wilson ret = -EBADMSG; 475e44a1b44SJarod Wilson goto out; 476e44a1b44SJarod Wilson } 477da7f033dSHerbert Xu break; 478da7f033dSHerbert Xu case -EINPROGRESS: 479da7f033dSHerbert Xu case -EBUSY: 480da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 481da7f033dSHerbert Xu &result.completion); 482da7f033dSHerbert Xu if (!ret && !(ret = result.err)) { 483da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 484da7f033dSHerbert Xu break; 485da7f033dSHerbert Xu } 486e44a1b44SJarod Wilson case -EBADMSG: 487e44a1b44SJarod Wilson if (template[i].novrfy) 488e44a1b44SJarod Wilson /* verification failure was expected */ 489e44a1b44SJarod Wilson continue; 490da7f033dSHerbert Xu /* fall through */ 491da7f033dSHerbert Xu default: 492da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: %s failed on test " 493da7f033dSHerbert Xu "%d for %s: ret=%d\n", e, j, algo, -ret); 494da7f033dSHerbert Xu goto out; 495da7f033dSHerbert Xu } 496da7f033dSHerbert Xu 497da7f033dSHerbert Xu q = input; 498da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 499da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Test %d failed on " 500da7f033dSHerbert Xu "%s for %s\n", j, e, algo); 501da7f033dSHerbert Xu hexdump(q, template[i].rlen); 502da7f033dSHerbert Xu ret = -EINVAL; 503da7f033dSHerbert Xu goto out; 504da7f033dSHerbert Xu } 505da7f033dSHerbert Xu } 506da7f033dSHerbert Xu } 507da7f033dSHerbert Xu 508da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 509da7f033dSHerbert Xu if (template[i].np) { 510da7f033dSHerbert Xu j++; 511da7f033dSHerbert Xu 512da7f033dSHerbert Xu if (template[i].iv) 513da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 514da7f033dSHerbert Xu else 515da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 516da7f033dSHerbert Xu 517da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 518da7f033dSHerbert Xu if (template[i].wk) 519da7f033dSHerbert Xu crypto_aead_set_flags( 520da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 521da7f033dSHerbert Xu key = template[i].key; 522da7f033dSHerbert Xu 523da7f033dSHerbert Xu ret = crypto_aead_setkey(tfm, key, template[i].klen); 524da7f033dSHerbert Xu if (!ret == template[i].fail) { 525da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: setkey failed on " 526da7f033dSHerbert Xu "chunk test %d for %s: flags=%x\n", j, 527da7f033dSHerbert Xu algo, crypto_aead_get_flags(tfm)); 528da7f033dSHerbert Xu goto out; 529da7f033dSHerbert Xu } else if (ret) 530da7f033dSHerbert Xu continue; 531da7f033dSHerbert Xu 532da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 533da7f033dSHerbert Xu 534da7f033dSHerbert Xu ret = -EINVAL; 535da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 536da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 537da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 538da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 539da7f033dSHerbert Xu goto out; 540da7f033dSHerbert Xu 541da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 542da7f033dSHerbert Xu offset_in_page(IDX[k]); 543da7f033dSHerbert Xu 544da7f033dSHerbert Xu memcpy(q, template[i].input + temp, 545da7f033dSHerbert Xu template[i].tap[k]); 546da7f033dSHerbert Xu 547da7f033dSHerbert Xu n = template[i].tap[k]; 548da7f033dSHerbert Xu if (k == template[i].np - 1 && enc) 549da7f033dSHerbert Xu n += authsize; 550da7f033dSHerbert Xu if (offset_in_page(q) + n < PAGE_SIZE) 551da7f033dSHerbert Xu q[n] = 0; 552da7f033dSHerbert Xu 553da7f033dSHerbert Xu sg_set_buf(&sg[k], q, template[i].tap[k]); 554da7f033dSHerbert Xu temp += template[i].tap[k]; 555da7f033dSHerbert Xu } 556da7f033dSHerbert Xu 557da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 558da7f033dSHerbert Xu if (ret) { 559da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to set " 560da7f033dSHerbert Xu "authsize to %u on chunk test %d for " 561da7f033dSHerbert Xu "%s\n", authsize, j, algo); 562da7f033dSHerbert Xu goto out; 563da7f033dSHerbert Xu } 564da7f033dSHerbert Xu 565da7f033dSHerbert Xu if (enc) { 566da7f033dSHerbert Xu if (WARN_ON(sg[k - 1].offset + 567da7f033dSHerbert Xu sg[k - 1].length + authsize > 568da7f033dSHerbert Xu PAGE_SIZE)) { 569da7f033dSHerbert Xu ret = -EINVAL; 570da7f033dSHerbert Xu goto out; 571da7f033dSHerbert Xu } 572da7f033dSHerbert Xu 573da7f033dSHerbert Xu sg[k - 1].length += authsize; 574da7f033dSHerbert Xu } 575da7f033dSHerbert Xu 576da7f033dSHerbert Xu sg_init_table(asg, template[i].anp); 577fd57f22aSHerbert Xu ret = -EINVAL; 578da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].anp; k++) { 579fd57f22aSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 580fd57f22aSHerbert Xu template[i].atap[k] > PAGE_SIZE)) 581fd57f22aSHerbert Xu goto out; 582da7f033dSHerbert Xu sg_set_buf(&asg[k], 583da7f033dSHerbert Xu memcpy(axbuf[IDX[k] >> PAGE_SHIFT] + 584da7f033dSHerbert Xu offset_in_page(IDX[k]), 585da7f033dSHerbert Xu template[i].assoc + temp, 586da7f033dSHerbert Xu template[i].atap[k]), 587da7f033dSHerbert Xu template[i].atap[k]); 588da7f033dSHerbert Xu temp += template[i].atap[k]; 589da7f033dSHerbert Xu } 590da7f033dSHerbert Xu 591da7f033dSHerbert Xu aead_request_set_crypt(req, sg, sg, 592da7f033dSHerbert Xu template[i].ilen, 593da7f033dSHerbert Xu iv); 594da7f033dSHerbert Xu 595da7f033dSHerbert Xu aead_request_set_assoc(req, asg, template[i].alen); 596da7f033dSHerbert Xu 597da7f033dSHerbert Xu ret = enc ? 598da7f033dSHerbert Xu crypto_aead_encrypt(req) : 599da7f033dSHerbert Xu crypto_aead_decrypt(req); 600da7f033dSHerbert Xu 601da7f033dSHerbert Xu switch (ret) { 602da7f033dSHerbert Xu case 0: 603e44a1b44SJarod Wilson if (template[i].novrfy) { 604e44a1b44SJarod Wilson /* verification was supposed to fail */ 605e44a1b44SJarod Wilson printk(KERN_ERR "alg: aead: %s failed " 606e44a1b44SJarod Wilson "on chunk test %d for %s: ret " 607e44a1b44SJarod Wilson "was 0, expected -EBADMSG\n", 608e44a1b44SJarod Wilson e, j, algo); 609e44a1b44SJarod Wilson /* so really, we got a bad message */ 610e44a1b44SJarod Wilson ret = -EBADMSG; 611e44a1b44SJarod Wilson goto out; 612e44a1b44SJarod Wilson } 613da7f033dSHerbert Xu break; 614da7f033dSHerbert Xu case -EINPROGRESS: 615da7f033dSHerbert Xu case -EBUSY: 616da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 617da7f033dSHerbert Xu &result.completion); 618da7f033dSHerbert Xu if (!ret && !(ret = result.err)) { 619da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 620da7f033dSHerbert Xu break; 621da7f033dSHerbert Xu } 622e44a1b44SJarod Wilson case -EBADMSG: 623e44a1b44SJarod Wilson if (template[i].novrfy) 624e44a1b44SJarod Wilson /* verification failure was expected */ 625e44a1b44SJarod Wilson continue; 626da7f033dSHerbert Xu /* fall through */ 627da7f033dSHerbert Xu default: 628da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: %s failed on " 629da7f033dSHerbert Xu "chunk test %d for %s: ret=%d\n", e, j, 630da7f033dSHerbert Xu algo, -ret); 631da7f033dSHerbert Xu goto out; 632da7f033dSHerbert Xu } 633da7f033dSHerbert Xu 634da7f033dSHerbert Xu ret = -EINVAL; 635da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 636da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 637da7f033dSHerbert Xu offset_in_page(IDX[k]); 638da7f033dSHerbert Xu 639da7f033dSHerbert Xu n = template[i].tap[k]; 640da7f033dSHerbert Xu if (k == template[i].np - 1) 641da7f033dSHerbert Xu n += enc ? authsize : -authsize; 642da7f033dSHerbert Xu 643da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, n)) { 644da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Chunk " 645da7f033dSHerbert Xu "test %d failed on %s at page " 646da7f033dSHerbert Xu "%u for %s\n", j, e, k, algo); 647da7f033dSHerbert Xu hexdump(q, n); 648da7f033dSHerbert Xu goto out; 649da7f033dSHerbert Xu } 650da7f033dSHerbert Xu 651da7f033dSHerbert Xu q += n; 652da7f033dSHerbert Xu if (k == template[i].np - 1 && !enc) { 653da7f033dSHerbert Xu if (memcmp(q, template[i].input + 654da7f033dSHerbert Xu temp + n, authsize)) 655da7f033dSHerbert Xu n = authsize; 656da7f033dSHerbert Xu else 657da7f033dSHerbert Xu n = 0; 658da7f033dSHerbert Xu } else { 659da7f033dSHerbert Xu for (n = 0; offset_in_page(q + n) && 660da7f033dSHerbert Xu q[n]; n++) 661da7f033dSHerbert Xu ; 662da7f033dSHerbert Xu } 663da7f033dSHerbert Xu if (n) { 664da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Result " 665da7f033dSHerbert Xu "buffer corruption in chunk " 666da7f033dSHerbert Xu "test %d on %s at page %u for " 667da7f033dSHerbert Xu "%s: %u bytes:\n", j, e, k, 668da7f033dSHerbert Xu algo, n); 669da7f033dSHerbert Xu hexdump(q, n); 670da7f033dSHerbert Xu goto out; 671da7f033dSHerbert Xu } 672da7f033dSHerbert Xu 673da7f033dSHerbert Xu temp += template[i].tap[k]; 674da7f033dSHerbert Xu } 675da7f033dSHerbert Xu } 676da7f033dSHerbert Xu } 677da7f033dSHerbert Xu 678da7f033dSHerbert Xu ret = 0; 679da7f033dSHerbert Xu 680da7f033dSHerbert Xu out: 681da7f033dSHerbert Xu aead_request_free(req); 682f8b0d4d0SHerbert Xu testmgr_free_buf(axbuf); 683f8b0d4d0SHerbert Xu out_noaxbuf: 684f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 685f8b0d4d0SHerbert Xu out_noxbuf: 686da7f033dSHerbert Xu return ret; 687da7f033dSHerbert Xu } 688da7f033dSHerbert Xu 6891aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc, 6901aa4ecd9SHerbert Xu struct cipher_testvec *template, unsigned int tcount) 6911aa4ecd9SHerbert Xu { 6921aa4ecd9SHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm)); 6931aa4ecd9SHerbert Xu unsigned int i, j, k; 6941aa4ecd9SHerbert Xu char *q; 6951aa4ecd9SHerbert Xu const char *e; 6961aa4ecd9SHerbert Xu void *data; 697f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 698f8b0d4d0SHerbert Xu int ret = -ENOMEM; 699f8b0d4d0SHerbert Xu 700f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 701f8b0d4d0SHerbert Xu goto out_nobuf; 7021aa4ecd9SHerbert Xu 7031aa4ecd9SHerbert Xu if (enc == ENCRYPT) 7041aa4ecd9SHerbert Xu e = "encryption"; 7051aa4ecd9SHerbert Xu else 7061aa4ecd9SHerbert Xu e = "decryption"; 7071aa4ecd9SHerbert Xu 7081aa4ecd9SHerbert Xu j = 0; 7091aa4ecd9SHerbert Xu for (i = 0; i < tcount; i++) { 7101aa4ecd9SHerbert Xu if (template[i].np) 7111aa4ecd9SHerbert Xu continue; 7121aa4ecd9SHerbert Xu 7131aa4ecd9SHerbert Xu j++; 7141aa4ecd9SHerbert Xu 715fd57f22aSHerbert Xu ret = -EINVAL; 716fd57f22aSHerbert Xu if (WARN_ON(template[i].ilen > PAGE_SIZE)) 717fd57f22aSHerbert Xu goto out; 718fd57f22aSHerbert Xu 7191aa4ecd9SHerbert Xu data = xbuf[0]; 7201aa4ecd9SHerbert Xu memcpy(data, template[i].input, template[i].ilen); 7211aa4ecd9SHerbert Xu 7221aa4ecd9SHerbert Xu crypto_cipher_clear_flags(tfm, ~0); 7231aa4ecd9SHerbert Xu if (template[i].wk) 7241aa4ecd9SHerbert Xu crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 7251aa4ecd9SHerbert Xu 7261aa4ecd9SHerbert Xu ret = crypto_cipher_setkey(tfm, template[i].key, 7271aa4ecd9SHerbert Xu template[i].klen); 7281aa4ecd9SHerbert Xu if (!ret == template[i].fail) { 7291aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: setkey failed " 7301aa4ecd9SHerbert Xu "on test %d for %s: flags=%x\n", j, 7311aa4ecd9SHerbert Xu algo, crypto_cipher_get_flags(tfm)); 7321aa4ecd9SHerbert Xu goto out; 7331aa4ecd9SHerbert Xu } else if (ret) 7341aa4ecd9SHerbert Xu continue; 7351aa4ecd9SHerbert Xu 7361aa4ecd9SHerbert Xu for (k = 0; k < template[i].ilen; 7371aa4ecd9SHerbert Xu k += crypto_cipher_blocksize(tfm)) { 7381aa4ecd9SHerbert Xu if (enc) 7391aa4ecd9SHerbert Xu crypto_cipher_encrypt_one(tfm, data + k, 7401aa4ecd9SHerbert Xu data + k); 7411aa4ecd9SHerbert Xu else 7421aa4ecd9SHerbert Xu crypto_cipher_decrypt_one(tfm, data + k, 7431aa4ecd9SHerbert Xu data + k); 7441aa4ecd9SHerbert Xu } 7451aa4ecd9SHerbert Xu 7461aa4ecd9SHerbert Xu q = data; 7471aa4ecd9SHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 7481aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: Test %d failed " 7491aa4ecd9SHerbert Xu "on %s for %s\n", j, e, algo); 7501aa4ecd9SHerbert Xu hexdump(q, template[i].rlen); 7511aa4ecd9SHerbert Xu ret = -EINVAL; 7521aa4ecd9SHerbert Xu goto out; 7531aa4ecd9SHerbert Xu } 7541aa4ecd9SHerbert Xu } 7551aa4ecd9SHerbert Xu 7561aa4ecd9SHerbert Xu ret = 0; 7571aa4ecd9SHerbert Xu 7581aa4ecd9SHerbert Xu out: 759f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 760f8b0d4d0SHerbert Xu out_nobuf: 7611aa4ecd9SHerbert Xu return ret; 7621aa4ecd9SHerbert Xu } 7631aa4ecd9SHerbert Xu 7641aa4ecd9SHerbert Xu static int test_skcipher(struct crypto_ablkcipher *tfm, int enc, 765da7f033dSHerbert Xu struct cipher_testvec *template, unsigned int tcount) 766da7f033dSHerbert Xu { 767da7f033dSHerbert Xu const char *algo = 768da7f033dSHerbert Xu crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm)); 769da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 770da7f033dSHerbert Xu char *q; 771da7f033dSHerbert Xu struct ablkcipher_request *req; 772da7f033dSHerbert Xu struct scatterlist sg[8]; 773da7f033dSHerbert Xu const char *e; 774da7f033dSHerbert Xu struct tcrypt_result result; 775da7f033dSHerbert Xu void *data; 776da7f033dSHerbert Xu char iv[MAX_IVLEN]; 777f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 778f8b0d4d0SHerbert Xu int ret = -ENOMEM; 779f8b0d4d0SHerbert Xu 780f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 781f8b0d4d0SHerbert Xu goto out_nobuf; 782da7f033dSHerbert Xu 783da7f033dSHerbert Xu if (enc == ENCRYPT) 784da7f033dSHerbert Xu e = "encryption"; 785da7f033dSHerbert Xu else 786da7f033dSHerbert Xu e = "decryption"; 787da7f033dSHerbert Xu 788da7f033dSHerbert Xu init_completion(&result.completion); 789da7f033dSHerbert Xu 790da7f033dSHerbert Xu req = ablkcipher_request_alloc(tfm, GFP_KERNEL); 791da7f033dSHerbert Xu if (!req) { 7921aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Failed to allocate request " 7931aa4ecd9SHerbert Xu "for %s\n", algo); 794da7f033dSHerbert Xu goto out; 795da7f033dSHerbert Xu } 796da7f033dSHerbert Xu 797da7f033dSHerbert Xu ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 798da7f033dSHerbert Xu tcrypt_complete, &result); 799da7f033dSHerbert Xu 800da7f033dSHerbert Xu j = 0; 801da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 802da7f033dSHerbert Xu if (template[i].iv) 803da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 804da7f033dSHerbert Xu else 805da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 806da7f033dSHerbert Xu 807da7f033dSHerbert Xu if (!(template[i].np)) { 808da7f033dSHerbert Xu j++; 809da7f033dSHerbert Xu 810fd57f22aSHerbert Xu ret = -EINVAL; 811fd57f22aSHerbert Xu if (WARN_ON(template[i].ilen > PAGE_SIZE)) 812fd57f22aSHerbert Xu goto out; 813fd57f22aSHerbert Xu 814da7f033dSHerbert Xu data = xbuf[0]; 815da7f033dSHerbert Xu memcpy(data, template[i].input, template[i].ilen); 816da7f033dSHerbert Xu 817da7f033dSHerbert Xu crypto_ablkcipher_clear_flags(tfm, ~0); 818da7f033dSHerbert Xu if (template[i].wk) 819da7f033dSHerbert Xu crypto_ablkcipher_set_flags( 820da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 821da7f033dSHerbert Xu 822da7f033dSHerbert Xu ret = crypto_ablkcipher_setkey(tfm, template[i].key, 823da7f033dSHerbert Xu template[i].klen); 824da7f033dSHerbert Xu if (!ret == template[i].fail) { 8251aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: setkey failed " 826da7f033dSHerbert Xu "on test %d for %s: flags=%x\n", j, 827da7f033dSHerbert Xu algo, crypto_ablkcipher_get_flags(tfm)); 828da7f033dSHerbert Xu goto out; 829da7f033dSHerbert Xu } else if (ret) 830da7f033dSHerbert Xu continue; 831da7f033dSHerbert Xu 832da7f033dSHerbert Xu sg_init_one(&sg[0], data, template[i].ilen); 833da7f033dSHerbert Xu 834da7f033dSHerbert Xu ablkcipher_request_set_crypt(req, sg, sg, 835da7f033dSHerbert Xu template[i].ilen, iv); 836da7f033dSHerbert Xu ret = enc ? 837da7f033dSHerbert Xu crypto_ablkcipher_encrypt(req) : 838da7f033dSHerbert Xu crypto_ablkcipher_decrypt(req); 839da7f033dSHerbert Xu 840da7f033dSHerbert Xu switch (ret) { 841da7f033dSHerbert Xu case 0: 842da7f033dSHerbert Xu break; 843da7f033dSHerbert Xu case -EINPROGRESS: 844da7f033dSHerbert Xu case -EBUSY: 845da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 846da7f033dSHerbert Xu &result.completion); 847da7f033dSHerbert Xu if (!ret && !((ret = result.err))) { 848da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 849da7f033dSHerbert Xu break; 850da7f033dSHerbert Xu } 851da7f033dSHerbert Xu /* fall through */ 852da7f033dSHerbert Xu default: 8531aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: %s failed on " 854da7f033dSHerbert Xu "test %d for %s: ret=%d\n", e, j, algo, 855da7f033dSHerbert Xu -ret); 856da7f033dSHerbert Xu goto out; 857da7f033dSHerbert Xu } 858da7f033dSHerbert Xu 859da7f033dSHerbert Xu q = data; 860da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 8611aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Test %d " 8621aa4ecd9SHerbert Xu "failed on %s for %s\n", j, e, algo); 863da7f033dSHerbert Xu hexdump(q, template[i].rlen); 864da7f033dSHerbert Xu ret = -EINVAL; 865da7f033dSHerbert Xu goto out; 866da7f033dSHerbert Xu } 867da7f033dSHerbert Xu } 868da7f033dSHerbert Xu } 869da7f033dSHerbert Xu 870da7f033dSHerbert Xu j = 0; 871da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 872da7f033dSHerbert Xu 873da7f033dSHerbert Xu if (template[i].iv) 874da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 875da7f033dSHerbert Xu else 876da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 877da7f033dSHerbert Xu 878da7f033dSHerbert Xu if (template[i].np) { 879da7f033dSHerbert Xu j++; 880da7f033dSHerbert Xu 881da7f033dSHerbert Xu crypto_ablkcipher_clear_flags(tfm, ~0); 882da7f033dSHerbert Xu if (template[i].wk) 883da7f033dSHerbert Xu crypto_ablkcipher_set_flags( 884da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 885da7f033dSHerbert Xu 886da7f033dSHerbert Xu ret = crypto_ablkcipher_setkey(tfm, template[i].key, 887da7f033dSHerbert Xu template[i].klen); 888da7f033dSHerbert Xu if (!ret == template[i].fail) { 8891aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: setkey failed " 890da7f033dSHerbert Xu "on chunk test %d for %s: flags=%x\n", 891da7f033dSHerbert Xu j, algo, 892da7f033dSHerbert Xu crypto_ablkcipher_get_flags(tfm)); 893da7f033dSHerbert Xu goto out; 894da7f033dSHerbert Xu } else if (ret) 895da7f033dSHerbert Xu continue; 896da7f033dSHerbert Xu 897da7f033dSHerbert Xu temp = 0; 898da7f033dSHerbert Xu ret = -EINVAL; 899da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 900da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 901da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 902da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 903da7f033dSHerbert Xu goto out; 904da7f033dSHerbert Xu 905da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 906da7f033dSHerbert Xu offset_in_page(IDX[k]); 907da7f033dSHerbert Xu 908da7f033dSHerbert Xu memcpy(q, template[i].input + temp, 909da7f033dSHerbert Xu template[i].tap[k]); 910da7f033dSHerbert Xu 911da7f033dSHerbert Xu if (offset_in_page(q) + template[i].tap[k] < 912da7f033dSHerbert Xu PAGE_SIZE) 913da7f033dSHerbert Xu q[template[i].tap[k]] = 0; 914da7f033dSHerbert Xu 915da7f033dSHerbert Xu sg_set_buf(&sg[k], q, template[i].tap[k]); 916da7f033dSHerbert Xu 917da7f033dSHerbert Xu temp += template[i].tap[k]; 918da7f033dSHerbert Xu } 919da7f033dSHerbert Xu 920da7f033dSHerbert Xu ablkcipher_request_set_crypt(req, sg, sg, 921da7f033dSHerbert Xu template[i].ilen, iv); 922da7f033dSHerbert Xu 923da7f033dSHerbert Xu ret = enc ? 924da7f033dSHerbert Xu crypto_ablkcipher_encrypt(req) : 925da7f033dSHerbert Xu crypto_ablkcipher_decrypt(req); 926da7f033dSHerbert Xu 927da7f033dSHerbert Xu switch (ret) { 928da7f033dSHerbert Xu case 0: 929da7f033dSHerbert Xu break; 930da7f033dSHerbert Xu case -EINPROGRESS: 931da7f033dSHerbert Xu case -EBUSY: 932da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 933da7f033dSHerbert Xu &result.completion); 934da7f033dSHerbert Xu if (!ret && !((ret = result.err))) { 935da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 936da7f033dSHerbert Xu break; 937da7f033dSHerbert Xu } 938da7f033dSHerbert Xu /* fall through */ 939da7f033dSHerbert Xu default: 9401aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: %s failed on " 941da7f033dSHerbert Xu "chunk test %d for %s: ret=%d\n", e, j, 942da7f033dSHerbert Xu algo, -ret); 943da7f033dSHerbert Xu goto out; 944da7f033dSHerbert Xu } 945da7f033dSHerbert Xu 946da7f033dSHerbert Xu temp = 0; 947da7f033dSHerbert Xu ret = -EINVAL; 948da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 949da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 950da7f033dSHerbert Xu offset_in_page(IDX[k]); 951da7f033dSHerbert Xu 952da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, 953da7f033dSHerbert Xu template[i].tap[k])) { 9541aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Chunk " 955da7f033dSHerbert Xu "test %d failed on %s at page " 956da7f033dSHerbert Xu "%u for %s\n", j, e, k, algo); 957da7f033dSHerbert Xu hexdump(q, template[i].tap[k]); 958da7f033dSHerbert Xu goto out; 959da7f033dSHerbert Xu } 960da7f033dSHerbert Xu 961da7f033dSHerbert Xu q += template[i].tap[k]; 962da7f033dSHerbert Xu for (n = 0; offset_in_page(q + n) && q[n]; n++) 963da7f033dSHerbert Xu ; 964da7f033dSHerbert Xu if (n) { 9651aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: " 966da7f033dSHerbert Xu "Result buffer corruption in " 967da7f033dSHerbert Xu "chunk test %d on %s at page " 968da7f033dSHerbert Xu "%u for %s: %u bytes:\n", j, e, 969da7f033dSHerbert Xu k, algo, n); 970da7f033dSHerbert Xu hexdump(q, n); 971da7f033dSHerbert Xu goto out; 972da7f033dSHerbert Xu } 973da7f033dSHerbert Xu temp += template[i].tap[k]; 974da7f033dSHerbert Xu } 975da7f033dSHerbert Xu } 976da7f033dSHerbert Xu } 977da7f033dSHerbert Xu 978da7f033dSHerbert Xu ret = 0; 979da7f033dSHerbert Xu 980da7f033dSHerbert Xu out: 981da7f033dSHerbert Xu ablkcipher_request_free(req); 982f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 983f8b0d4d0SHerbert Xu out_nobuf: 984da7f033dSHerbert Xu return ret; 985da7f033dSHerbert Xu } 986da7f033dSHerbert Xu 987da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate, 988da7f033dSHerbert Xu struct comp_testvec *dtemplate, int ctcount, int dtcount) 989da7f033dSHerbert Xu { 990da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm)); 991da7f033dSHerbert Xu unsigned int i; 992da7f033dSHerbert Xu char result[COMP_BUF_SIZE]; 993da7f033dSHerbert Xu int ret; 994da7f033dSHerbert Xu 995da7f033dSHerbert Xu for (i = 0; i < ctcount; i++) { 996c79cf910SGeert Uytterhoeven int ilen; 997c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 998da7f033dSHerbert Xu 999da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 1000da7f033dSHerbert Xu 1001da7f033dSHerbert Xu ilen = ctemplate[i].inlen; 1002da7f033dSHerbert Xu ret = crypto_comp_compress(tfm, ctemplate[i].input, 1003da7f033dSHerbert Xu ilen, result, &dlen); 1004da7f033dSHerbert Xu if (ret) { 1005da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: compression failed " 1006da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1007da7f033dSHerbert Xu -ret); 1008da7f033dSHerbert Xu goto out; 1009da7f033dSHerbert Xu } 1010da7f033dSHerbert Xu 1011b812eb00SGeert Uytterhoeven if (dlen != ctemplate[i].outlen) { 1012b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Compression test %d " 1013b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1014b812eb00SGeert Uytterhoeven dlen); 1015b812eb00SGeert Uytterhoeven ret = -EINVAL; 1016b812eb00SGeert Uytterhoeven goto out; 1017b812eb00SGeert Uytterhoeven } 1018b812eb00SGeert Uytterhoeven 1019da7f033dSHerbert Xu if (memcmp(result, ctemplate[i].output, dlen)) { 1020da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Compression test %d " 1021da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 1022da7f033dSHerbert Xu hexdump(result, dlen); 1023da7f033dSHerbert Xu ret = -EINVAL; 1024da7f033dSHerbert Xu goto out; 1025da7f033dSHerbert Xu } 1026da7f033dSHerbert Xu } 1027da7f033dSHerbert Xu 1028da7f033dSHerbert Xu for (i = 0; i < dtcount; i++) { 1029c79cf910SGeert Uytterhoeven int ilen; 1030c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 1031da7f033dSHerbert Xu 1032da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 1033da7f033dSHerbert Xu 1034da7f033dSHerbert Xu ilen = dtemplate[i].inlen; 1035da7f033dSHerbert Xu ret = crypto_comp_decompress(tfm, dtemplate[i].input, 1036da7f033dSHerbert Xu ilen, result, &dlen); 1037da7f033dSHerbert Xu if (ret) { 1038da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: decompression failed " 1039da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1040da7f033dSHerbert Xu -ret); 1041da7f033dSHerbert Xu goto out; 1042da7f033dSHerbert Xu } 1043da7f033dSHerbert Xu 1044b812eb00SGeert Uytterhoeven if (dlen != dtemplate[i].outlen) { 1045b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Decompression test %d " 1046b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1047b812eb00SGeert Uytterhoeven dlen); 1048b812eb00SGeert Uytterhoeven ret = -EINVAL; 1049b812eb00SGeert Uytterhoeven goto out; 1050b812eb00SGeert Uytterhoeven } 1051b812eb00SGeert Uytterhoeven 1052da7f033dSHerbert Xu if (memcmp(result, dtemplate[i].output, dlen)) { 1053da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Decompression test %d " 1054da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 1055da7f033dSHerbert Xu hexdump(result, dlen); 1056da7f033dSHerbert Xu ret = -EINVAL; 1057da7f033dSHerbert Xu goto out; 1058da7f033dSHerbert Xu } 1059da7f033dSHerbert Xu } 1060da7f033dSHerbert Xu 1061da7f033dSHerbert Xu ret = 0; 1062da7f033dSHerbert Xu 1063da7f033dSHerbert Xu out: 1064da7f033dSHerbert Xu return ret; 1065da7f033dSHerbert Xu } 1066da7f033dSHerbert Xu 10678064efb8SGeert Uytterhoeven static int test_pcomp(struct crypto_pcomp *tfm, 10688064efb8SGeert Uytterhoeven struct pcomp_testvec *ctemplate, 10698064efb8SGeert Uytterhoeven struct pcomp_testvec *dtemplate, int ctcount, 10708064efb8SGeert Uytterhoeven int dtcount) 10718064efb8SGeert Uytterhoeven { 10728064efb8SGeert Uytterhoeven const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm)); 10738064efb8SGeert Uytterhoeven unsigned int i; 10748064efb8SGeert Uytterhoeven char result[COMP_BUF_SIZE]; 10753ce858cbSGeert Uytterhoeven int res; 10768064efb8SGeert Uytterhoeven 10778064efb8SGeert Uytterhoeven for (i = 0; i < ctcount; i++) { 10788064efb8SGeert Uytterhoeven struct comp_request req; 10793ce858cbSGeert Uytterhoeven unsigned int produced = 0; 10808064efb8SGeert Uytterhoeven 10813ce858cbSGeert Uytterhoeven res = crypto_compress_setup(tfm, ctemplate[i].params, 10828064efb8SGeert Uytterhoeven ctemplate[i].paramsize); 10833ce858cbSGeert Uytterhoeven if (res) { 10848064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression setup failed on test " 10853ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 10863ce858cbSGeert Uytterhoeven return res; 10878064efb8SGeert Uytterhoeven } 10888064efb8SGeert Uytterhoeven 10893ce858cbSGeert Uytterhoeven res = crypto_compress_init(tfm); 10903ce858cbSGeert Uytterhoeven if (res) { 10918064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression init failed on test " 10923ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 10933ce858cbSGeert Uytterhoeven return res; 10948064efb8SGeert Uytterhoeven } 10958064efb8SGeert Uytterhoeven 10968064efb8SGeert Uytterhoeven memset(result, 0, sizeof(result)); 10978064efb8SGeert Uytterhoeven 10988064efb8SGeert Uytterhoeven req.next_in = ctemplate[i].input; 10998064efb8SGeert Uytterhoeven req.avail_in = ctemplate[i].inlen / 2; 11008064efb8SGeert Uytterhoeven req.next_out = result; 11018064efb8SGeert Uytterhoeven req.avail_out = ctemplate[i].outlen / 2; 11028064efb8SGeert Uytterhoeven 11033ce858cbSGeert Uytterhoeven res = crypto_compress_update(tfm, &req); 11043ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 11058064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression update failed on test " 11063ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 11073ce858cbSGeert Uytterhoeven return res; 11088064efb8SGeert Uytterhoeven } 11093ce858cbSGeert Uytterhoeven if (res > 0) 11103ce858cbSGeert Uytterhoeven produced += res; 11118064efb8SGeert Uytterhoeven 11128064efb8SGeert Uytterhoeven /* Add remaining input data */ 11138064efb8SGeert Uytterhoeven req.avail_in += (ctemplate[i].inlen + 1) / 2; 11148064efb8SGeert Uytterhoeven 11153ce858cbSGeert Uytterhoeven res = crypto_compress_update(tfm, &req); 11163ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 11178064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression update failed on test " 11183ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 11193ce858cbSGeert Uytterhoeven return res; 11208064efb8SGeert Uytterhoeven } 11213ce858cbSGeert Uytterhoeven if (res > 0) 11223ce858cbSGeert Uytterhoeven produced += res; 11238064efb8SGeert Uytterhoeven 11248064efb8SGeert Uytterhoeven /* Provide remaining output space */ 11258064efb8SGeert Uytterhoeven req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2; 11268064efb8SGeert Uytterhoeven 11273ce858cbSGeert Uytterhoeven res = crypto_compress_final(tfm, &req); 11283ce858cbSGeert Uytterhoeven if (res < 0) { 11298064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression final failed on test " 11303ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 11313ce858cbSGeert Uytterhoeven return res; 11328064efb8SGeert Uytterhoeven } 11333ce858cbSGeert Uytterhoeven produced += res; 11348064efb8SGeert Uytterhoeven 11358064efb8SGeert Uytterhoeven if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) { 11368064efb8SGeert Uytterhoeven pr_err("alg: comp: Compression test %d failed for %s: " 11378064efb8SGeert Uytterhoeven "output len = %d (expected %d)\n", i + 1, algo, 11388064efb8SGeert Uytterhoeven COMP_BUF_SIZE - req.avail_out, 11398064efb8SGeert Uytterhoeven ctemplate[i].outlen); 11408064efb8SGeert Uytterhoeven return -EINVAL; 11418064efb8SGeert Uytterhoeven } 11428064efb8SGeert Uytterhoeven 11433ce858cbSGeert Uytterhoeven if (produced != ctemplate[i].outlen) { 11443ce858cbSGeert Uytterhoeven pr_err("alg: comp: Compression test %d failed for %s: " 11453ce858cbSGeert Uytterhoeven "returned len = %u (expected %d)\n", i + 1, 11463ce858cbSGeert Uytterhoeven algo, produced, ctemplate[i].outlen); 11473ce858cbSGeert Uytterhoeven return -EINVAL; 11483ce858cbSGeert Uytterhoeven } 11493ce858cbSGeert Uytterhoeven 11508064efb8SGeert Uytterhoeven if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) { 11518064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Compression test %d failed for " 11528064efb8SGeert Uytterhoeven "%s\n", i + 1, algo); 11538064efb8SGeert Uytterhoeven hexdump(result, ctemplate[i].outlen); 11548064efb8SGeert Uytterhoeven return -EINVAL; 11558064efb8SGeert Uytterhoeven } 11568064efb8SGeert Uytterhoeven } 11578064efb8SGeert Uytterhoeven 11588064efb8SGeert Uytterhoeven for (i = 0; i < dtcount; i++) { 11598064efb8SGeert Uytterhoeven struct comp_request req; 11603ce858cbSGeert Uytterhoeven unsigned int produced = 0; 11618064efb8SGeert Uytterhoeven 11623ce858cbSGeert Uytterhoeven res = crypto_decompress_setup(tfm, dtemplate[i].params, 11638064efb8SGeert Uytterhoeven dtemplate[i].paramsize); 11643ce858cbSGeert Uytterhoeven if (res) { 11658064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression setup failed on " 11663ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 11673ce858cbSGeert Uytterhoeven return res; 11688064efb8SGeert Uytterhoeven } 11698064efb8SGeert Uytterhoeven 11703ce858cbSGeert Uytterhoeven res = crypto_decompress_init(tfm); 11713ce858cbSGeert Uytterhoeven if (res) { 11728064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression init failed on test " 11733ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 11743ce858cbSGeert Uytterhoeven return res; 11758064efb8SGeert Uytterhoeven } 11768064efb8SGeert Uytterhoeven 11778064efb8SGeert Uytterhoeven memset(result, 0, sizeof(result)); 11788064efb8SGeert Uytterhoeven 11798064efb8SGeert Uytterhoeven req.next_in = dtemplate[i].input; 11808064efb8SGeert Uytterhoeven req.avail_in = dtemplate[i].inlen / 2; 11818064efb8SGeert Uytterhoeven req.next_out = result; 11828064efb8SGeert Uytterhoeven req.avail_out = dtemplate[i].outlen / 2; 11838064efb8SGeert Uytterhoeven 11843ce858cbSGeert Uytterhoeven res = crypto_decompress_update(tfm, &req); 11853ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 11868064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression update failed on " 11873ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 11883ce858cbSGeert Uytterhoeven return res; 11898064efb8SGeert Uytterhoeven } 11903ce858cbSGeert Uytterhoeven if (res > 0) 11913ce858cbSGeert Uytterhoeven produced += res; 11928064efb8SGeert Uytterhoeven 11938064efb8SGeert Uytterhoeven /* Add remaining input data */ 11948064efb8SGeert Uytterhoeven req.avail_in += (dtemplate[i].inlen + 1) / 2; 11958064efb8SGeert Uytterhoeven 11963ce858cbSGeert Uytterhoeven res = crypto_decompress_update(tfm, &req); 11973ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 11988064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression update failed on " 11993ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 12003ce858cbSGeert Uytterhoeven return res; 12018064efb8SGeert Uytterhoeven } 12023ce858cbSGeert Uytterhoeven if (res > 0) 12033ce858cbSGeert Uytterhoeven produced += res; 12048064efb8SGeert Uytterhoeven 12058064efb8SGeert Uytterhoeven /* Provide remaining output space */ 12068064efb8SGeert Uytterhoeven req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2; 12078064efb8SGeert Uytterhoeven 12083ce858cbSGeert Uytterhoeven res = crypto_decompress_final(tfm, &req); 12093ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 12108064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression final failed on " 12113ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 12123ce858cbSGeert Uytterhoeven return res; 12138064efb8SGeert Uytterhoeven } 12143ce858cbSGeert Uytterhoeven if (res > 0) 12153ce858cbSGeert Uytterhoeven produced += res; 12168064efb8SGeert Uytterhoeven 12178064efb8SGeert Uytterhoeven if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) { 12188064efb8SGeert Uytterhoeven pr_err("alg: comp: Decompression test %d failed for " 12198064efb8SGeert Uytterhoeven "%s: output len = %d (expected %d)\n", i + 1, 12208064efb8SGeert Uytterhoeven algo, COMP_BUF_SIZE - req.avail_out, 12218064efb8SGeert Uytterhoeven dtemplate[i].outlen); 12228064efb8SGeert Uytterhoeven return -EINVAL; 12238064efb8SGeert Uytterhoeven } 12248064efb8SGeert Uytterhoeven 12253ce858cbSGeert Uytterhoeven if (produced != dtemplate[i].outlen) { 12263ce858cbSGeert Uytterhoeven pr_err("alg: comp: Decompression test %d failed for " 12273ce858cbSGeert Uytterhoeven "%s: returned len = %u (expected %d)\n", i + 1, 12283ce858cbSGeert Uytterhoeven algo, produced, dtemplate[i].outlen); 12293ce858cbSGeert Uytterhoeven return -EINVAL; 12303ce858cbSGeert Uytterhoeven } 12313ce858cbSGeert Uytterhoeven 12328064efb8SGeert Uytterhoeven if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) { 12338064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Decompression test %d failed for " 12348064efb8SGeert Uytterhoeven "%s\n", i + 1, algo); 12358064efb8SGeert Uytterhoeven hexdump(result, dtemplate[i].outlen); 12368064efb8SGeert Uytterhoeven return -EINVAL; 12378064efb8SGeert Uytterhoeven } 12388064efb8SGeert Uytterhoeven } 12398064efb8SGeert Uytterhoeven 12408064efb8SGeert Uytterhoeven return 0; 12418064efb8SGeert Uytterhoeven } 12428064efb8SGeert Uytterhoeven 12437647d6ceSJarod Wilson 12447647d6ceSJarod Wilson static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template, 12457647d6ceSJarod Wilson unsigned int tcount) 12467647d6ceSJarod Wilson { 12477647d6ceSJarod Wilson const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm)); 1248fa4ef8a6SFelipe Contreras int err = 0, i, j, seedsize; 12497647d6ceSJarod Wilson u8 *seed; 12507647d6ceSJarod Wilson char result[32]; 12517647d6ceSJarod Wilson 12527647d6ceSJarod Wilson seedsize = crypto_rng_seedsize(tfm); 12537647d6ceSJarod Wilson 12547647d6ceSJarod Wilson seed = kmalloc(seedsize, GFP_KERNEL); 12557647d6ceSJarod Wilson if (!seed) { 12567647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to allocate seed space " 12577647d6ceSJarod Wilson "for %s\n", algo); 12587647d6ceSJarod Wilson return -ENOMEM; 12597647d6ceSJarod Wilson } 12607647d6ceSJarod Wilson 12617647d6ceSJarod Wilson for (i = 0; i < tcount; i++) { 12627647d6ceSJarod Wilson memset(result, 0, 32); 12637647d6ceSJarod Wilson 12647647d6ceSJarod Wilson memcpy(seed, template[i].v, template[i].vlen); 12657647d6ceSJarod Wilson memcpy(seed + template[i].vlen, template[i].key, 12667647d6ceSJarod Wilson template[i].klen); 12677647d6ceSJarod Wilson memcpy(seed + template[i].vlen + template[i].klen, 12687647d6ceSJarod Wilson template[i].dt, template[i].dtlen); 12697647d6ceSJarod Wilson 12707647d6ceSJarod Wilson err = crypto_rng_reset(tfm, seed, seedsize); 12717647d6ceSJarod Wilson if (err) { 12727647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to reset rng " 12737647d6ceSJarod Wilson "for %s\n", algo); 12747647d6ceSJarod Wilson goto out; 12757647d6ceSJarod Wilson } 12767647d6ceSJarod Wilson 12777647d6ceSJarod Wilson for (j = 0; j < template[i].loops; j++) { 12787647d6ceSJarod Wilson err = crypto_rng_get_bytes(tfm, result, 12797647d6ceSJarod Wilson template[i].rlen); 12807647d6ceSJarod Wilson if (err != template[i].rlen) { 12817647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to obtain " 12827647d6ceSJarod Wilson "the correct amount of random data for " 12837647d6ceSJarod Wilson "%s (requested %d, got %d)\n", algo, 12847647d6ceSJarod Wilson template[i].rlen, err); 12857647d6ceSJarod Wilson goto out; 12867647d6ceSJarod Wilson } 12877647d6ceSJarod Wilson } 12887647d6ceSJarod Wilson 12897647d6ceSJarod Wilson err = memcmp(result, template[i].result, 12907647d6ceSJarod Wilson template[i].rlen); 12917647d6ceSJarod Wilson if (err) { 12927647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Test %d failed for %s\n", 12937647d6ceSJarod Wilson i, algo); 12947647d6ceSJarod Wilson hexdump(result, template[i].rlen); 12957647d6ceSJarod Wilson err = -EINVAL; 12967647d6ceSJarod Wilson goto out; 12977647d6ceSJarod Wilson } 12987647d6ceSJarod Wilson } 12997647d6ceSJarod Wilson 13007647d6ceSJarod Wilson out: 13017647d6ceSJarod Wilson kfree(seed); 13027647d6ceSJarod Wilson return err; 13037647d6ceSJarod Wilson } 13047647d6ceSJarod Wilson 1305da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver, 1306da7f033dSHerbert Xu u32 type, u32 mask) 1307da7f033dSHerbert Xu { 1308da7f033dSHerbert Xu struct crypto_aead *tfm; 1309da7f033dSHerbert Xu int err = 0; 1310da7f033dSHerbert Xu 1311da7f033dSHerbert Xu tfm = crypto_alloc_aead(driver, type, mask); 1312da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1313da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to load transform for %s: " 1314da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1315da7f033dSHerbert Xu return PTR_ERR(tfm); 1316da7f033dSHerbert Xu } 1317da7f033dSHerbert Xu 1318da7f033dSHerbert Xu if (desc->suite.aead.enc.vecs) { 1319da7f033dSHerbert Xu err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs, 1320da7f033dSHerbert Xu desc->suite.aead.enc.count); 1321da7f033dSHerbert Xu if (err) 1322da7f033dSHerbert Xu goto out; 1323da7f033dSHerbert Xu } 1324da7f033dSHerbert Xu 1325da7f033dSHerbert Xu if (!err && desc->suite.aead.dec.vecs) 1326da7f033dSHerbert Xu err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs, 1327da7f033dSHerbert Xu desc->suite.aead.dec.count); 1328da7f033dSHerbert Xu 1329da7f033dSHerbert Xu out: 1330da7f033dSHerbert Xu crypto_free_aead(tfm); 1331da7f033dSHerbert Xu return err; 1332da7f033dSHerbert Xu } 1333da7f033dSHerbert Xu 1334da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc, 1335da7f033dSHerbert Xu const char *driver, u32 type, u32 mask) 1336da7f033dSHerbert Xu { 13371aa4ecd9SHerbert Xu struct crypto_cipher *tfm; 1338da7f033dSHerbert Xu int err = 0; 1339da7f033dSHerbert Xu 13401aa4ecd9SHerbert Xu tfm = crypto_alloc_cipher(driver, type, mask); 1341da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1342da7f033dSHerbert Xu printk(KERN_ERR "alg: cipher: Failed to load transform for " 1343da7f033dSHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 1344da7f033dSHerbert Xu return PTR_ERR(tfm); 1345da7f033dSHerbert Xu } 1346da7f033dSHerbert Xu 1347da7f033dSHerbert Xu if (desc->suite.cipher.enc.vecs) { 1348da7f033dSHerbert Xu err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 1349da7f033dSHerbert Xu desc->suite.cipher.enc.count); 1350da7f033dSHerbert Xu if (err) 1351da7f033dSHerbert Xu goto out; 1352da7f033dSHerbert Xu } 1353da7f033dSHerbert Xu 1354da7f033dSHerbert Xu if (desc->suite.cipher.dec.vecs) 1355da7f033dSHerbert Xu err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 1356da7f033dSHerbert Xu desc->suite.cipher.dec.count); 1357da7f033dSHerbert Xu 1358da7f033dSHerbert Xu out: 13591aa4ecd9SHerbert Xu crypto_free_cipher(tfm); 13601aa4ecd9SHerbert Xu return err; 13611aa4ecd9SHerbert Xu } 13621aa4ecd9SHerbert Xu 13631aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc, 13641aa4ecd9SHerbert Xu const char *driver, u32 type, u32 mask) 13651aa4ecd9SHerbert Xu { 13661aa4ecd9SHerbert Xu struct crypto_ablkcipher *tfm; 13671aa4ecd9SHerbert Xu int err = 0; 13681aa4ecd9SHerbert Xu 13691aa4ecd9SHerbert Xu tfm = crypto_alloc_ablkcipher(driver, type, mask); 13701aa4ecd9SHerbert Xu if (IS_ERR(tfm)) { 13711aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Failed to load transform for " 13721aa4ecd9SHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 13731aa4ecd9SHerbert Xu return PTR_ERR(tfm); 13741aa4ecd9SHerbert Xu } 13751aa4ecd9SHerbert Xu 13761aa4ecd9SHerbert Xu if (desc->suite.cipher.enc.vecs) { 13771aa4ecd9SHerbert Xu err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 13781aa4ecd9SHerbert Xu desc->suite.cipher.enc.count); 13791aa4ecd9SHerbert Xu if (err) 13801aa4ecd9SHerbert Xu goto out; 13811aa4ecd9SHerbert Xu } 13821aa4ecd9SHerbert Xu 13831aa4ecd9SHerbert Xu if (desc->suite.cipher.dec.vecs) 13841aa4ecd9SHerbert Xu err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 13851aa4ecd9SHerbert Xu desc->suite.cipher.dec.count); 13861aa4ecd9SHerbert Xu 13871aa4ecd9SHerbert Xu out: 1388da7f033dSHerbert Xu crypto_free_ablkcipher(tfm); 1389da7f033dSHerbert Xu return err; 1390da7f033dSHerbert Xu } 1391da7f033dSHerbert Xu 1392da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver, 1393da7f033dSHerbert Xu u32 type, u32 mask) 1394da7f033dSHerbert Xu { 1395da7f033dSHerbert Xu struct crypto_comp *tfm; 1396da7f033dSHerbert Xu int err; 1397da7f033dSHerbert Xu 1398da7f033dSHerbert Xu tfm = crypto_alloc_comp(driver, type, mask); 1399da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1400da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Failed to load transform for %s: " 1401da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1402da7f033dSHerbert Xu return PTR_ERR(tfm); 1403da7f033dSHerbert Xu } 1404da7f033dSHerbert Xu 1405da7f033dSHerbert Xu err = test_comp(tfm, desc->suite.comp.comp.vecs, 1406da7f033dSHerbert Xu desc->suite.comp.decomp.vecs, 1407da7f033dSHerbert Xu desc->suite.comp.comp.count, 1408da7f033dSHerbert Xu desc->suite.comp.decomp.count); 1409da7f033dSHerbert Xu 1410da7f033dSHerbert Xu crypto_free_comp(tfm); 1411da7f033dSHerbert Xu return err; 1412da7f033dSHerbert Xu } 1413da7f033dSHerbert Xu 14148064efb8SGeert Uytterhoeven static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver, 14158064efb8SGeert Uytterhoeven u32 type, u32 mask) 14168064efb8SGeert Uytterhoeven { 14178064efb8SGeert Uytterhoeven struct crypto_pcomp *tfm; 14188064efb8SGeert Uytterhoeven int err; 14198064efb8SGeert Uytterhoeven 14208064efb8SGeert Uytterhoeven tfm = crypto_alloc_pcomp(driver, type, mask); 14218064efb8SGeert Uytterhoeven if (IS_ERR(tfm)) { 14228064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Failed to load transform for %s: %ld\n", 14238064efb8SGeert Uytterhoeven driver, PTR_ERR(tfm)); 14248064efb8SGeert Uytterhoeven return PTR_ERR(tfm); 14258064efb8SGeert Uytterhoeven } 14268064efb8SGeert Uytterhoeven 14278064efb8SGeert Uytterhoeven err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs, 14288064efb8SGeert Uytterhoeven desc->suite.pcomp.decomp.vecs, 14298064efb8SGeert Uytterhoeven desc->suite.pcomp.comp.count, 14308064efb8SGeert Uytterhoeven desc->suite.pcomp.decomp.count); 14318064efb8SGeert Uytterhoeven 14328064efb8SGeert Uytterhoeven crypto_free_pcomp(tfm); 14338064efb8SGeert Uytterhoeven return err; 14348064efb8SGeert Uytterhoeven } 14358064efb8SGeert Uytterhoeven 1436da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver, 1437da7f033dSHerbert Xu u32 type, u32 mask) 1438da7f033dSHerbert Xu { 1439da7f033dSHerbert Xu struct crypto_ahash *tfm; 1440da7f033dSHerbert Xu int err; 1441da7f033dSHerbert Xu 1442da7f033dSHerbert Xu tfm = crypto_alloc_ahash(driver, type, mask); 1443da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1444da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to load transform for %s: " 1445da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1446da7f033dSHerbert Xu return PTR_ERR(tfm); 1447da7f033dSHerbert Xu } 1448da7f033dSHerbert Xu 1449a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1450a8f1a052SDavid S. Miller desc->suite.hash.count, true); 1451a8f1a052SDavid S. Miller if (!err) 1452a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1453a8f1a052SDavid S. Miller desc->suite.hash.count, false); 1454da7f033dSHerbert Xu 1455da7f033dSHerbert Xu crypto_free_ahash(tfm); 1456da7f033dSHerbert Xu return err; 1457da7f033dSHerbert Xu } 1458da7f033dSHerbert Xu 14598e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc, 14608e3ee85eSHerbert Xu const char *driver, u32 type, u32 mask) 14618e3ee85eSHerbert Xu { 14628e3ee85eSHerbert Xu struct crypto_shash *tfm; 14638e3ee85eSHerbert Xu u32 val; 14648e3ee85eSHerbert Xu int err; 14658e3ee85eSHerbert Xu 14668e3ee85eSHerbert Xu err = alg_test_hash(desc, driver, type, mask); 14678e3ee85eSHerbert Xu if (err) 14688e3ee85eSHerbert Xu goto out; 14698e3ee85eSHerbert Xu 14708e3ee85eSHerbert Xu tfm = crypto_alloc_shash(driver, type, mask); 14718e3ee85eSHerbert Xu if (IS_ERR(tfm)) { 14728e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: " 14738e3ee85eSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 14748e3ee85eSHerbert Xu err = PTR_ERR(tfm); 14758e3ee85eSHerbert Xu goto out; 14768e3ee85eSHerbert Xu } 14778e3ee85eSHerbert Xu 14788e3ee85eSHerbert Xu do { 14798e3ee85eSHerbert Xu struct { 14808e3ee85eSHerbert Xu struct shash_desc shash; 14818e3ee85eSHerbert Xu char ctx[crypto_shash_descsize(tfm)]; 14828e3ee85eSHerbert Xu } sdesc; 14838e3ee85eSHerbert Xu 14848e3ee85eSHerbert Xu sdesc.shash.tfm = tfm; 14858e3ee85eSHerbert Xu sdesc.shash.flags = 0; 14868e3ee85eSHerbert Xu 14878e3ee85eSHerbert Xu *(u32 *)sdesc.ctx = le32_to_cpu(420553207); 14888e3ee85eSHerbert Xu err = crypto_shash_final(&sdesc.shash, (u8 *)&val); 14898e3ee85eSHerbert Xu if (err) { 14908e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Operation failed for " 14918e3ee85eSHerbert Xu "%s: %d\n", driver, err); 14928e3ee85eSHerbert Xu break; 14938e3ee85eSHerbert Xu } 14948e3ee85eSHerbert Xu 14958e3ee85eSHerbert Xu if (val != ~420553207) { 14968e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Test failed for %s: " 14978e3ee85eSHerbert Xu "%d\n", driver, val); 14988e3ee85eSHerbert Xu err = -EINVAL; 14998e3ee85eSHerbert Xu } 15008e3ee85eSHerbert Xu } while (0); 15018e3ee85eSHerbert Xu 15028e3ee85eSHerbert Xu crypto_free_shash(tfm); 15038e3ee85eSHerbert Xu 15048e3ee85eSHerbert Xu out: 15058e3ee85eSHerbert Xu return err; 15068e3ee85eSHerbert Xu } 15078e3ee85eSHerbert Xu 15087647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver, 15097647d6ceSJarod Wilson u32 type, u32 mask) 15107647d6ceSJarod Wilson { 15117647d6ceSJarod Wilson struct crypto_rng *rng; 15127647d6ceSJarod Wilson int err; 15137647d6ceSJarod Wilson 15147647d6ceSJarod Wilson rng = crypto_alloc_rng(driver, type, mask); 15157647d6ceSJarod Wilson if (IS_ERR(rng)) { 15167647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to load transform for %s: " 15177647d6ceSJarod Wilson "%ld\n", driver, PTR_ERR(rng)); 15187647d6ceSJarod Wilson return PTR_ERR(rng); 15197647d6ceSJarod Wilson } 15207647d6ceSJarod Wilson 15217647d6ceSJarod Wilson err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count); 15227647d6ceSJarod Wilson 15237647d6ceSJarod Wilson crypto_free_rng(rng); 15247647d6ceSJarod Wilson 15257647d6ceSJarod Wilson return err; 15267647d6ceSJarod Wilson } 15277647d6ceSJarod Wilson 1528863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc, 1529863b557aSYouquan, Song const char *driver, u32 type, u32 mask) 1530863b557aSYouquan, Song { 1531863b557aSYouquan, Song return 0; 1532863b557aSYouquan, Song } 1533863b557aSYouquan, Song 1534da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */ 1535da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = { 1536da7f033dSHerbert Xu { 1537863b557aSYouquan, Song .alg = "__driver-cbc-aes-aesni", 1538863b557aSYouquan, Song .test = alg_test_null, 1539863b557aSYouquan, Song .suite = { 1540863b557aSYouquan, Song .cipher = { 1541863b557aSYouquan, Song .enc = { 1542863b557aSYouquan, Song .vecs = NULL, 1543863b557aSYouquan, Song .count = 0 1544863b557aSYouquan, Song }, 1545863b557aSYouquan, Song .dec = { 1546863b557aSYouquan, Song .vecs = NULL, 1547863b557aSYouquan, Song .count = 0 1548863b557aSYouquan, Song } 1549863b557aSYouquan, Song } 1550863b557aSYouquan, Song } 1551863b557aSYouquan, Song }, { 1552863b557aSYouquan, Song .alg = "__driver-ecb-aes-aesni", 1553863b557aSYouquan, Song .test = alg_test_null, 1554863b557aSYouquan, Song .suite = { 1555863b557aSYouquan, Song .cipher = { 1556863b557aSYouquan, Song .enc = { 1557863b557aSYouquan, Song .vecs = NULL, 1558863b557aSYouquan, Song .count = 0 1559863b557aSYouquan, Song }, 1560863b557aSYouquan, Song .dec = { 1561863b557aSYouquan, Song .vecs = NULL, 1562863b557aSYouquan, Song .count = 0 1563863b557aSYouquan, Song } 1564863b557aSYouquan, Song } 1565863b557aSYouquan, Song } 1566863b557aSYouquan, Song }, { 1567863b557aSYouquan, Song .alg = "__ghash-pclmulqdqni", 1568863b557aSYouquan, Song .test = alg_test_null, 1569863b557aSYouquan, Song .suite = { 1570863b557aSYouquan, Song .hash = { 1571863b557aSYouquan, Song .vecs = NULL, 1572863b557aSYouquan, Song .count = 0 1573863b557aSYouquan, Song } 1574863b557aSYouquan, Song } 1575863b557aSYouquan, Song }, { 1576e08ca2daSJarod Wilson .alg = "ansi_cprng", 1577e08ca2daSJarod Wilson .test = alg_test_cprng, 1578a1915d51SJarod Wilson .fips_allowed = 1, 1579e08ca2daSJarod Wilson .suite = { 1580e08ca2daSJarod Wilson .cprng = { 1581e08ca2daSJarod Wilson .vecs = ansi_cprng_aes_tv_template, 1582e08ca2daSJarod Wilson .count = ANSI_CPRNG_AES_TEST_VECTORS 1583e08ca2daSJarod Wilson } 1584e08ca2daSJarod Wilson } 1585e08ca2daSJarod Wilson }, { 1586da7f033dSHerbert Xu .alg = "cbc(aes)", 15871aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1588a1915d51SJarod Wilson .fips_allowed = 1, 1589da7f033dSHerbert Xu .suite = { 1590da7f033dSHerbert Xu .cipher = { 1591da7f033dSHerbert Xu .enc = { 1592da7f033dSHerbert Xu .vecs = aes_cbc_enc_tv_template, 1593da7f033dSHerbert Xu .count = AES_CBC_ENC_TEST_VECTORS 1594da7f033dSHerbert Xu }, 1595da7f033dSHerbert Xu .dec = { 1596da7f033dSHerbert Xu .vecs = aes_cbc_dec_tv_template, 1597da7f033dSHerbert Xu .count = AES_CBC_DEC_TEST_VECTORS 1598da7f033dSHerbert Xu } 1599da7f033dSHerbert Xu } 1600da7f033dSHerbert Xu } 1601da7f033dSHerbert Xu }, { 1602da7f033dSHerbert Xu .alg = "cbc(anubis)", 16031aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1604da7f033dSHerbert Xu .suite = { 1605da7f033dSHerbert Xu .cipher = { 1606da7f033dSHerbert Xu .enc = { 1607da7f033dSHerbert Xu .vecs = anubis_cbc_enc_tv_template, 1608da7f033dSHerbert Xu .count = ANUBIS_CBC_ENC_TEST_VECTORS 1609da7f033dSHerbert Xu }, 1610da7f033dSHerbert Xu .dec = { 1611da7f033dSHerbert Xu .vecs = anubis_cbc_dec_tv_template, 1612da7f033dSHerbert Xu .count = ANUBIS_CBC_DEC_TEST_VECTORS 1613da7f033dSHerbert Xu } 1614da7f033dSHerbert Xu } 1615da7f033dSHerbert Xu } 1616da7f033dSHerbert Xu }, { 1617da7f033dSHerbert Xu .alg = "cbc(blowfish)", 16181aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1619da7f033dSHerbert Xu .suite = { 1620da7f033dSHerbert Xu .cipher = { 1621da7f033dSHerbert Xu .enc = { 1622da7f033dSHerbert Xu .vecs = bf_cbc_enc_tv_template, 1623da7f033dSHerbert Xu .count = BF_CBC_ENC_TEST_VECTORS 1624da7f033dSHerbert Xu }, 1625da7f033dSHerbert Xu .dec = { 1626da7f033dSHerbert Xu .vecs = bf_cbc_dec_tv_template, 1627da7f033dSHerbert Xu .count = BF_CBC_DEC_TEST_VECTORS 1628da7f033dSHerbert Xu } 1629da7f033dSHerbert Xu } 1630da7f033dSHerbert Xu } 1631da7f033dSHerbert Xu }, { 1632da7f033dSHerbert Xu .alg = "cbc(camellia)", 16331aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1634da7f033dSHerbert Xu .suite = { 1635da7f033dSHerbert Xu .cipher = { 1636da7f033dSHerbert Xu .enc = { 1637da7f033dSHerbert Xu .vecs = camellia_cbc_enc_tv_template, 1638da7f033dSHerbert Xu .count = CAMELLIA_CBC_ENC_TEST_VECTORS 1639da7f033dSHerbert Xu }, 1640da7f033dSHerbert Xu .dec = { 1641da7f033dSHerbert Xu .vecs = camellia_cbc_dec_tv_template, 1642da7f033dSHerbert Xu .count = CAMELLIA_CBC_DEC_TEST_VECTORS 1643da7f033dSHerbert Xu } 1644da7f033dSHerbert Xu } 1645da7f033dSHerbert Xu } 1646da7f033dSHerbert Xu }, { 1647da7f033dSHerbert Xu .alg = "cbc(des)", 16481aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1649da7f033dSHerbert Xu .suite = { 1650da7f033dSHerbert Xu .cipher = { 1651da7f033dSHerbert Xu .enc = { 1652da7f033dSHerbert Xu .vecs = des_cbc_enc_tv_template, 1653da7f033dSHerbert Xu .count = DES_CBC_ENC_TEST_VECTORS 1654da7f033dSHerbert Xu }, 1655da7f033dSHerbert Xu .dec = { 1656da7f033dSHerbert Xu .vecs = des_cbc_dec_tv_template, 1657da7f033dSHerbert Xu .count = DES_CBC_DEC_TEST_VECTORS 1658da7f033dSHerbert Xu } 1659da7f033dSHerbert Xu } 1660da7f033dSHerbert Xu } 1661da7f033dSHerbert Xu }, { 1662da7f033dSHerbert Xu .alg = "cbc(des3_ede)", 16631aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1664a1915d51SJarod Wilson .fips_allowed = 1, 1665da7f033dSHerbert Xu .suite = { 1666da7f033dSHerbert Xu .cipher = { 1667da7f033dSHerbert Xu .enc = { 1668da7f033dSHerbert Xu .vecs = des3_ede_cbc_enc_tv_template, 1669da7f033dSHerbert Xu .count = DES3_EDE_CBC_ENC_TEST_VECTORS 1670da7f033dSHerbert Xu }, 1671da7f033dSHerbert Xu .dec = { 1672da7f033dSHerbert Xu .vecs = des3_ede_cbc_dec_tv_template, 1673da7f033dSHerbert Xu .count = DES3_EDE_CBC_DEC_TEST_VECTORS 1674da7f033dSHerbert Xu } 1675da7f033dSHerbert Xu } 1676da7f033dSHerbert Xu } 1677da7f033dSHerbert Xu }, { 1678da7f033dSHerbert Xu .alg = "cbc(twofish)", 16791aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1680da7f033dSHerbert Xu .suite = { 1681da7f033dSHerbert Xu .cipher = { 1682da7f033dSHerbert Xu .enc = { 1683da7f033dSHerbert Xu .vecs = tf_cbc_enc_tv_template, 1684da7f033dSHerbert Xu .count = TF_CBC_ENC_TEST_VECTORS 1685da7f033dSHerbert Xu }, 1686da7f033dSHerbert Xu .dec = { 1687da7f033dSHerbert Xu .vecs = tf_cbc_dec_tv_template, 1688da7f033dSHerbert Xu .count = TF_CBC_DEC_TEST_VECTORS 1689da7f033dSHerbert Xu } 1690da7f033dSHerbert Xu } 1691da7f033dSHerbert Xu } 1692da7f033dSHerbert Xu }, { 1693da7f033dSHerbert Xu .alg = "ccm(aes)", 1694da7f033dSHerbert Xu .test = alg_test_aead, 1695a1915d51SJarod Wilson .fips_allowed = 1, 1696da7f033dSHerbert Xu .suite = { 1697da7f033dSHerbert Xu .aead = { 1698da7f033dSHerbert Xu .enc = { 1699da7f033dSHerbert Xu .vecs = aes_ccm_enc_tv_template, 1700da7f033dSHerbert Xu .count = AES_CCM_ENC_TEST_VECTORS 1701da7f033dSHerbert Xu }, 1702da7f033dSHerbert Xu .dec = { 1703da7f033dSHerbert Xu .vecs = aes_ccm_dec_tv_template, 1704da7f033dSHerbert Xu .count = AES_CCM_DEC_TEST_VECTORS 1705da7f033dSHerbert Xu } 1706da7f033dSHerbert Xu } 1707da7f033dSHerbert Xu } 1708da7f033dSHerbert Xu }, { 1709da7f033dSHerbert Xu .alg = "crc32c", 17108e3ee85eSHerbert Xu .test = alg_test_crc32c, 1711a1915d51SJarod Wilson .fips_allowed = 1, 1712da7f033dSHerbert Xu .suite = { 1713da7f033dSHerbert Xu .hash = { 1714da7f033dSHerbert Xu .vecs = crc32c_tv_template, 1715da7f033dSHerbert Xu .count = CRC32C_TEST_VECTORS 1716da7f033dSHerbert Xu } 1717da7f033dSHerbert Xu } 1718da7f033dSHerbert Xu }, { 1719863b557aSYouquan, Song .alg = "cryptd(__driver-ecb-aes-aesni)", 1720863b557aSYouquan, Song .test = alg_test_null, 1721863b557aSYouquan, Song .suite = { 1722863b557aSYouquan, Song .cipher = { 1723863b557aSYouquan, Song .enc = { 1724863b557aSYouquan, Song .vecs = NULL, 1725863b557aSYouquan, Song .count = 0 1726863b557aSYouquan, Song }, 1727863b557aSYouquan, Song .dec = { 1728863b557aSYouquan, Song .vecs = NULL, 1729863b557aSYouquan, Song .count = 0 1730863b557aSYouquan, Song } 1731863b557aSYouquan, Song } 1732863b557aSYouquan, Song } 1733863b557aSYouquan, Song }, { 1734863b557aSYouquan, Song .alg = "cryptd(__ghash-pclmulqdqni)", 1735863b557aSYouquan, Song .test = alg_test_null, 1736863b557aSYouquan, Song .suite = { 1737863b557aSYouquan, Song .hash = { 1738863b557aSYouquan, Song .vecs = NULL, 1739863b557aSYouquan, Song .count = 0 1740863b557aSYouquan, Song } 1741863b557aSYouquan, Song } 1742863b557aSYouquan, Song }, { 1743f7cb80f2SJarod Wilson .alg = "ctr(aes)", 1744f7cb80f2SJarod Wilson .test = alg_test_skcipher, 1745a1915d51SJarod Wilson .fips_allowed = 1, 1746f7cb80f2SJarod Wilson .suite = { 1747f7cb80f2SJarod Wilson .cipher = { 1748f7cb80f2SJarod Wilson .enc = { 1749f7cb80f2SJarod Wilson .vecs = aes_ctr_enc_tv_template, 1750f7cb80f2SJarod Wilson .count = AES_CTR_ENC_TEST_VECTORS 1751f7cb80f2SJarod Wilson }, 1752f7cb80f2SJarod Wilson .dec = { 1753f7cb80f2SJarod Wilson .vecs = aes_ctr_dec_tv_template, 1754f7cb80f2SJarod Wilson .count = AES_CTR_DEC_TEST_VECTORS 1755f7cb80f2SJarod Wilson } 1756f7cb80f2SJarod Wilson } 1757f7cb80f2SJarod Wilson } 1758f7cb80f2SJarod Wilson }, { 175985b63e34SJussi Kivilinna .alg = "ctr(blowfish)", 176085b63e34SJussi Kivilinna .test = alg_test_skcipher, 176185b63e34SJussi Kivilinna .suite = { 176285b63e34SJussi Kivilinna .cipher = { 176385b63e34SJussi Kivilinna .enc = { 176485b63e34SJussi Kivilinna .vecs = bf_ctr_enc_tv_template, 176585b63e34SJussi Kivilinna .count = BF_CTR_ENC_TEST_VECTORS 176685b63e34SJussi Kivilinna }, 176785b63e34SJussi Kivilinna .dec = { 176885b63e34SJussi Kivilinna .vecs = bf_ctr_dec_tv_template, 176985b63e34SJussi Kivilinna .count = BF_CTR_DEC_TEST_VECTORS 177085b63e34SJussi Kivilinna } 177185b63e34SJussi Kivilinna } 177285b63e34SJussi Kivilinna } 177385b63e34SJussi Kivilinna }, { 1774*573da620SJussi Kivilinna .alg = "ctr(twofish)", 1775*573da620SJussi Kivilinna .test = alg_test_skcipher, 1776*573da620SJussi Kivilinna .suite = { 1777*573da620SJussi Kivilinna .cipher = { 1778*573da620SJussi Kivilinna .enc = { 1779*573da620SJussi Kivilinna .vecs = tf_ctr_enc_tv_template, 1780*573da620SJussi Kivilinna .count = TF_CTR_ENC_TEST_VECTORS 1781*573da620SJussi Kivilinna }, 1782*573da620SJussi Kivilinna .dec = { 1783*573da620SJussi Kivilinna .vecs = tf_ctr_dec_tv_template, 1784*573da620SJussi Kivilinna .count = TF_CTR_DEC_TEST_VECTORS 1785*573da620SJussi Kivilinna } 1786*573da620SJussi Kivilinna } 1787*573da620SJussi Kivilinna } 1788*573da620SJussi Kivilinna }, { 1789da7f033dSHerbert Xu .alg = "cts(cbc(aes))", 17901aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1791da7f033dSHerbert Xu .suite = { 1792da7f033dSHerbert Xu .cipher = { 1793da7f033dSHerbert Xu .enc = { 1794da7f033dSHerbert Xu .vecs = cts_mode_enc_tv_template, 1795da7f033dSHerbert Xu .count = CTS_MODE_ENC_TEST_VECTORS 1796da7f033dSHerbert Xu }, 1797da7f033dSHerbert Xu .dec = { 1798da7f033dSHerbert Xu .vecs = cts_mode_dec_tv_template, 1799da7f033dSHerbert Xu .count = CTS_MODE_DEC_TEST_VECTORS 1800da7f033dSHerbert Xu } 1801da7f033dSHerbert Xu } 1802da7f033dSHerbert Xu } 1803da7f033dSHerbert Xu }, { 1804da7f033dSHerbert Xu .alg = "deflate", 1805da7f033dSHerbert Xu .test = alg_test_comp, 1806da7f033dSHerbert Xu .suite = { 1807da7f033dSHerbert Xu .comp = { 1808da7f033dSHerbert Xu .comp = { 1809da7f033dSHerbert Xu .vecs = deflate_comp_tv_template, 1810da7f033dSHerbert Xu .count = DEFLATE_COMP_TEST_VECTORS 1811da7f033dSHerbert Xu }, 1812da7f033dSHerbert Xu .decomp = { 1813da7f033dSHerbert Xu .vecs = deflate_decomp_tv_template, 1814da7f033dSHerbert Xu .count = DEFLATE_DECOMP_TEST_VECTORS 1815da7f033dSHerbert Xu } 1816da7f033dSHerbert Xu } 1817da7f033dSHerbert Xu } 1818da7f033dSHerbert Xu }, { 1819863b557aSYouquan, Song .alg = "ecb(__aes-aesni)", 1820863b557aSYouquan, Song .test = alg_test_null, 1821863b557aSYouquan, Song .suite = { 1822863b557aSYouquan, Song .cipher = { 1823863b557aSYouquan, Song .enc = { 1824863b557aSYouquan, Song .vecs = NULL, 1825863b557aSYouquan, Song .count = 0 1826863b557aSYouquan, Song }, 1827863b557aSYouquan, Song .dec = { 1828863b557aSYouquan, Song .vecs = NULL, 1829863b557aSYouquan, Song .count = 0 1830863b557aSYouquan, Song } 1831863b557aSYouquan, Song } 1832863b557aSYouquan, Song } 1833863b557aSYouquan, Song }, { 1834da7f033dSHerbert Xu .alg = "ecb(aes)", 18351aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1836a1915d51SJarod Wilson .fips_allowed = 1, 1837da7f033dSHerbert Xu .suite = { 1838da7f033dSHerbert Xu .cipher = { 1839da7f033dSHerbert Xu .enc = { 1840da7f033dSHerbert Xu .vecs = aes_enc_tv_template, 1841da7f033dSHerbert Xu .count = AES_ENC_TEST_VECTORS 1842da7f033dSHerbert Xu }, 1843da7f033dSHerbert Xu .dec = { 1844da7f033dSHerbert Xu .vecs = aes_dec_tv_template, 1845da7f033dSHerbert Xu .count = AES_DEC_TEST_VECTORS 1846da7f033dSHerbert Xu } 1847da7f033dSHerbert Xu } 1848da7f033dSHerbert Xu } 1849da7f033dSHerbert Xu }, { 1850da7f033dSHerbert Xu .alg = "ecb(anubis)", 18511aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1852da7f033dSHerbert Xu .suite = { 1853da7f033dSHerbert Xu .cipher = { 1854da7f033dSHerbert Xu .enc = { 1855da7f033dSHerbert Xu .vecs = anubis_enc_tv_template, 1856da7f033dSHerbert Xu .count = ANUBIS_ENC_TEST_VECTORS 1857da7f033dSHerbert Xu }, 1858da7f033dSHerbert Xu .dec = { 1859da7f033dSHerbert Xu .vecs = anubis_dec_tv_template, 1860da7f033dSHerbert Xu .count = ANUBIS_DEC_TEST_VECTORS 1861da7f033dSHerbert Xu } 1862da7f033dSHerbert Xu } 1863da7f033dSHerbert Xu } 1864da7f033dSHerbert Xu }, { 1865da7f033dSHerbert Xu .alg = "ecb(arc4)", 18661aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1867da7f033dSHerbert Xu .suite = { 1868da7f033dSHerbert Xu .cipher = { 1869da7f033dSHerbert Xu .enc = { 1870da7f033dSHerbert Xu .vecs = arc4_enc_tv_template, 1871da7f033dSHerbert Xu .count = ARC4_ENC_TEST_VECTORS 1872da7f033dSHerbert Xu }, 1873da7f033dSHerbert Xu .dec = { 1874da7f033dSHerbert Xu .vecs = arc4_dec_tv_template, 1875da7f033dSHerbert Xu .count = ARC4_DEC_TEST_VECTORS 1876da7f033dSHerbert Xu } 1877da7f033dSHerbert Xu } 1878da7f033dSHerbert Xu } 1879da7f033dSHerbert Xu }, { 1880da7f033dSHerbert Xu .alg = "ecb(blowfish)", 18811aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1882da7f033dSHerbert Xu .suite = { 1883da7f033dSHerbert Xu .cipher = { 1884da7f033dSHerbert Xu .enc = { 1885da7f033dSHerbert Xu .vecs = bf_enc_tv_template, 1886da7f033dSHerbert Xu .count = BF_ENC_TEST_VECTORS 1887da7f033dSHerbert Xu }, 1888da7f033dSHerbert Xu .dec = { 1889da7f033dSHerbert Xu .vecs = bf_dec_tv_template, 1890da7f033dSHerbert Xu .count = BF_DEC_TEST_VECTORS 1891da7f033dSHerbert Xu } 1892da7f033dSHerbert Xu } 1893da7f033dSHerbert Xu } 1894da7f033dSHerbert Xu }, { 1895da7f033dSHerbert Xu .alg = "ecb(camellia)", 18961aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1897da7f033dSHerbert Xu .suite = { 1898da7f033dSHerbert Xu .cipher = { 1899da7f033dSHerbert Xu .enc = { 1900da7f033dSHerbert Xu .vecs = camellia_enc_tv_template, 1901da7f033dSHerbert Xu .count = CAMELLIA_ENC_TEST_VECTORS 1902da7f033dSHerbert Xu }, 1903da7f033dSHerbert Xu .dec = { 1904da7f033dSHerbert Xu .vecs = camellia_dec_tv_template, 1905da7f033dSHerbert Xu .count = CAMELLIA_DEC_TEST_VECTORS 1906da7f033dSHerbert Xu } 1907da7f033dSHerbert Xu } 1908da7f033dSHerbert Xu } 1909da7f033dSHerbert Xu }, { 1910da7f033dSHerbert Xu .alg = "ecb(cast5)", 19111aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1912da7f033dSHerbert Xu .suite = { 1913da7f033dSHerbert Xu .cipher = { 1914da7f033dSHerbert Xu .enc = { 1915da7f033dSHerbert Xu .vecs = cast5_enc_tv_template, 1916da7f033dSHerbert Xu .count = CAST5_ENC_TEST_VECTORS 1917da7f033dSHerbert Xu }, 1918da7f033dSHerbert Xu .dec = { 1919da7f033dSHerbert Xu .vecs = cast5_dec_tv_template, 1920da7f033dSHerbert Xu .count = CAST5_DEC_TEST_VECTORS 1921da7f033dSHerbert Xu } 1922da7f033dSHerbert Xu } 1923da7f033dSHerbert Xu } 1924da7f033dSHerbert Xu }, { 1925da7f033dSHerbert Xu .alg = "ecb(cast6)", 19261aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1927da7f033dSHerbert Xu .suite = { 1928da7f033dSHerbert Xu .cipher = { 1929da7f033dSHerbert Xu .enc = { 1930da7f033dSHerbert Xu .vecs = cast6_enc_tv_template, 1931da7f033dSHerbert Xu .count = CAST6_ENC_TEST_VECTORS 1932da7f033dSHerbert Xu }, 1933da7f033dSHerbert Xu .dec = { 1934da7f033dSHerbert Xu .vecs = cast6_dec_tv_template, 1935da7f033dSHerbert Xu .count = CAST6_DEC_TEST_VECTORS 1936da7f033dSHerbert Xu } 1937da7f033dSHerbert Xu } 1938da7f033dSHerbert Xu } 1939da7f033dSHerbert Xu }, { 1940da7f033dSHerbert Xu .alg = "ecb(des)", 19411aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1942a1915d51SJarod Wilson .fips_allowed = 1, 1943da7f033dSHerbert Xu .suite = { 1944da7f033dSHerbert Xu .cipher = { 1945da7f033dSHerbert Xu .enc = { 1946da7f033dSHerbert Xu .vecs = des_enc_tv_template, 1947da7f033dSHerbert Xu .count = DES_ENC_TEST_VECTORS 1948da7f033dSHerbert Xu }, 1949da7f033dSHerbert Xu .dec = { 1950da7f033dSHerbert Xu .vecs = des_dec_tv_template, 1951da7f033dSHerbert Xu .count = DES_DEC_TEST_VECTORS 1952da7f033dSHerbert Xu } 1953da7f033dSHerbert Xu } 1954da7f033dSHerbert Xu } 1955da7f033dSHerbert Xu }, { 1956da7f033dSHerbert Xu .alg = "ecb(des3_ede)", 19571aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1958a1915d51SJarod Wilson .fips_allowed = 1, 1959da7f033dSHerbert Xu .suite = { 1960da7f033dSHerbert Xu .cipher = { 1961da7f033dSHerbert Xu .enc = { 1962da7f033dSHerbert Xu .vecs = des3_ede_enc_tv_template, 1963da7f033dSHerbert Xu .count = DES3_EDE_ENC_TEST_VECTORS 1964da7f033dSHerbert Xu }, 1965da7f033dSHerbert Xu .dec = { 1966da7f033dSHerbert Xu .vecs = des3_ede_dec_tv_template, 1967da7f033dSHerbert Xu .count = DES3_EDE_DEC_TEST_VECTORS 1968da7f033dSHerbert Xu } 1969da7f033dSHerbert Xu } 1970da7f033dSHerbert Xu } 1971da7f033dSHerbert Xu }, { 1972da7f033dSHerbert Xu .alg = "ecb(khazad)", 19731aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1974da7f033dSHerbert Xu .suite = { 1975da7f033dSHerbert Xu .cipher = { 1976da7f033dSHerbert Xu .enc = { 1977da7f033dSHerbert Xu .vecs = khazad_enc_tv_template, 1978da7f033dSHerbert Xu .count = KHAZAD_ENC_TEST_VECTORS 1979da7f033dSHerbert Xu }, 1980da7f033dSHerbert Xu .dec = { 1981da7f033dSHerbert Xu .vecs = khazad_dec_tv_template, 1982da7f033dSHerbert Xu .count = KHAZAD_DEC_TEST_VECTORS 1983da7f033dSHerbert Xu } 1984da7f033dSHerbert Xu } 1985da7f033dSHerbert Xu } 1986da7f033dSHerbert Xu }, { 1987da7f033dSHerbert Xu .alg = "ecb(seed)", 19881aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1989da7f033dSHerbert Xu .suite = { 1990da7f033dSHerbert Xu .cipher = { 1991da7f033dSHerbert Xu .enc = { 1992da7f033dSHerbert Xu .vecs = seed_enc_tv_template, 1993da7f033dSHerbert Xu .count = SEED_ENC_TEST_VECTORS 1994da7f033dSHerbert Xu }, 1995da7f033dSHerbert Xu .dec = { 1996da7f033dSHerbert Xu .vecs = seed_dec_tv_template, 1997da7f033dSHerbert Xu .count = SEED_DEC_TEST_VECTORS 1998da7f033dSHerbert Xu } 1999da7f033dSHerbert Xu } 2000da7f033dSHerbert Xu } 2001da7f033dSHerbert Xu }, { 2002da7f033dSHerbert Xu .alg = "ecb(serpent)", 20031aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2004da7f033dSHerbert Xu .suite = { 2005da7f033dSHerbert Xu .cipher = { 2006da7f033dSHerbert Xu .enc = { 2007da7f033dSHerbert Xu .vecs = serpent_enc_tv_template, 2008da7f033dSHerbert Xu .count = SERPENT_ENC_TEST_VECTORS 2009da7f033dSHerbert Xu }, 2010da7f033dSHerbert Xu .dec = { 2011da7f033dSHerbert Xu .vecs = serpent_dec_tv_template, 2012da7f033dSHerbert Xu .count = SERPENT_DEC_TEST_VECTORS 2013da7f033dSHerbert Xu } 2014da7f033dSHerbert Xu } 2015da7f033dSHerbert Xu } 2016da7f033dSHerbert Xu }, { 2017da7f033dSHerbert Xu .alg = "ecb(tea)", 20181aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2019da7f033dSHerbert Xu .suite = { 2020da7f033dSHerbert Xu .cipher = { 2021da7f033dSHerbert Xu .enc = { 2022da7f033dSHerbert Xu .vecs = tea_enc_tv_template, 2023da7f033dSHerbert Xu .count = TEA_ENC_TEST_VECTORS 2024da7f033dSHerbert Xu }, 2025da7f033dSHerbert Xu .dec = { 2026da7f033dSHerbert Xu .vecs = tea_dec_tv_template, 2027da7f033dSHerbert Xu .count = TEA_DEC_TEST_VECTORS 2028da7f033dSHerbert Xu } 2029da7f033dSHerbert Xu } 2030da7f033dSHerbert Xu } 2031da7f033dSHerbert Xu }, { 2032da7f033dSHerbert Xu .alg = "ecb(tnepres)", 20331aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2034da7f033dSHerbert Xu .suite = { 2035da7f033dSHerbert Xu .cipher = { 2036da7f033dSHerbert Xu .enc = { 2037da7f033dSHerbert Xu .vecs = tnepres_enc_tv_template, 2038da7f033dSHerbert Xu .count = TNEPRES_ENC_TEST_VECTORS 2039da7f033dSHerbert Xu }, 2040da7f033dSHerbert Xu .dec = { 2041da7f033dSHerbert Xu .vecs = tnepres_dec_tv_template, 2042da7f033dSHerbert Xu .count = TNEPRES_DEC_TEST_VECTORS 2043da7f033dSHerbert Xu } 2044da7f033dSHerbert Xu } 2045da7f033dSHerbert Xu } 2046da7f033dSHerbert Xu }, { 2047da7f033dSHerbert Xu .alg = "ecb(twofish)", 20481aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2049da7f033dSHerbert Xu .suite = { 2050da7f033dSHerbert Xu .cipher = { 2051da7f033dSHerbert Xu .enc = { 2052da7f033dSHerbert Xu .vecs = tf_enc_tv_template, 2053da7f033dSHerbert Xu .count = TF_ENC_TEST_VECTORS 2054da7f033dSHerbert Xu }, 2055da7f033dSHerbert Xu .dec = { 2056da7f033dSHerbert Xu .vecs = tf_dec_tv_template, 2057da7f033dSHerbert Xu .count = TF_DEC_TEST_VECTORS 2058da7f033dSHerbert Xu } 2059da7f033dSHerbert Xu } 2060da7f033dSHerbert Xu } 2061da7f033dSHerbert Xu }, { 2062da7f033dSHerbert Xu .alg = "ecb(xeta)", 20631aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2064da7f033dSHerbert Xu .suite = { 2065da7f033dSHerbert Xu .cipher = { 2066da7f033dSHerbert Xu .enc = { 2067da7f033dSHerbert Xu .vecs = xeta_enc_tv_template, 2068da7f033dSHerbert Xu .count = XETA_ENC_TEST_VECTORS 2069da7f033dSHerbert Xu }, 2070da7f033dSHerbert Xu .dec = { 2071da7f033dSHerbert Xu .vecs = xeta_dec_tv_template, 2072da7f033dSHerbert Xu .count = XETA_DEC_TEST_VECTORS 2073da7f033dSHerbert Xu } 2074da7f033dSHerbert Xu } 2075da7f033dSHerbert Xu } 2076da7f033dSHerbert Xu }, { 2077da7f033dSHerbert Xu .alg = "ecb(xtea)", 20781aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2079da7f033dSHerbert Xu .suite = { 2080da7f033dSHerbert Xu .cipher = { 2081da7f033dSHerbert Xu .enc = { 2082da7f033dSHerbert Xu .vecs = xtea_enc_tv_template, 2083da7f033dSHerbert Xu .count = XTEA_ENC_TEST_VECTORS 2084da7f033dSHerbert Xu }, 2085da7f033dSHerbert Xu .dec = { 2086da7f033dSHerbert Xu .vecs = xtea_dec_tv_template, 2087da7f033dSHerbert Xu .count = XTEA_DEC_TEST_VECTORS 2088da7f033dSHerbert Xu } 2089da7f033dSHerbert Xu } 2090da7f033dSHerbert Xu } 2091da7f033dSHerbert Xu }, { 2092da7f033dSHerbert Xu .alg = "gcm(aes)", 2093da7f033dSHerbert Xu .test = alg_test_aead, 2094a1915d51SJarod Wilson .fips_allowed = 1, 2095da7f033dSHerbert Xu .suite = { 2096da7f033dSHerbert Xu .aead = { 2097da7f033dSHerbert Xu .enc = { 2098da7f033dSHerbert Xu .vecs = aes_gcm_enc_tv_template, 2099da7f033dSHerbert Xu .count = AES_GCM_ENC_TEST_VECTORS 2100da7f033dSHerbert Xu }, 2101da7f033dSHerbert Xu .dec = { 2102da7f033dSHerbert Xu .vecs = aes_gcm_dec_tv_template, 2103da7f033dSHerbert Xu .count = AES_GCM_DEC_TEST_VECTORS 2104da7f033dSHerbert Xu } 2105da7f033dSHerbert Xu } 2106da7f033dSHerbert Xu } 2107da7f033dSHerbert Xu }, { 2108507069c9SYouquan, Song .alg = "ghash", 2109507069c9SYouquan, Song .test = alg_test_hash, 211018c0ebd2SJarod Wilson .fips_allowed = 1, 2111507069c9SYouquan, Song .suite = { 2112507069c9SYouquan, Song .hash = { 2113507069c9SYouquan, Song .vecs = ghash_tv_template, 2114507069c9SYouquan, Song .count = GHASH_TEST_VECTORS 2115507069c9SYouquan, Song } 2116507069c9SYouquan, Song } 2117507069c9SYouquan, Song }, { 2118da7f033dSHerbert Xu .alg = "hmac(md5)", 2119da7f033dSHerbert Xu .test = alg_test_hash, 2120da7f033dSHerbert Xu .suite = { 2121da7f033dSHerbert Xu .hash = { 2122da7f033dSHerbert Xu .vecs = hmac_md5_tv_template, 2123da7f033dSHerbert Xu .count = HMAC_MD5_TEST_VECTORS 2124da7f033dSHerbert Xu } 2125da7f033dSHerbert Xu } 2126da7f033dSHerbert Xu }, { 2127da7f033dSHerbert Xu .alg = "hmac(rmd128)", 2128da7f033dSHerbert Xu .test = alg_test_hash, 2129da7f033dSHerbert Xu .suite = { 2130da7f033dSHerbert Xu .hash = { 2131da7f033dSHerbert Xu .vecs = hmac_rmd128_tv_template, 2132da7f033dSHerbert Xu .count = HMAC_RMD128_TEST_VECTORS 2133da7f033dSHerbert Xu } 2134da7f033dSHerbert Xu } 2135da7f033dSHerbert Xu }, { 2136da7f033dSHerbert Xu .alg = "hmac(rmd160)", 2137da7f033dSHerbert Xu .test = alg_test_hash, 2138da7f033dSHerbert Xu .suite = { 2139da7f033dSHerbert Xu .hash = { 2140da7f033dSHerbert Xu .vecs = hmac_rmd160_tv_template, 2141da7f033dSHerbert Xu .count = HMAC_RMD160_TEST_VECTORS 2142da7f033dSHerbert Xu } 2143da7f033dSHerbert Xu } 2144da7f033dSHerbert Xu }, { 2145da7f033dSHerbert Xu .alg = "hmac(sha1)", 2146da7f033dSHerbert Xu .test = alg_test_hash, 2147a1915d51SJarod Wilson .fips_allowed = 1, 2148da7f033dSHerbert Xu .suite = { 2149da7f033dSHerbert Xu .hash = { 2150da7f033dSHerbert Xu .vecs = hmac_sha1_tv_template, 2151da7f033dSHerbert Xu .count = HMAC_SHA1_TEST_VECTORS 2152da7f033dSHerbert Xu } 2153da7f033dSHerbert Xu } 2154da7f033dSHerbert Xu }, { 2155da7f033dSHerbert Xu .alg = "hmac(sha224)", 2156da7f033dSHerbert Xu .test = alg_test_hash, 2157a1915d51SJarod Wilson .fips_allowed = 1, 2158da7f033dSHerbert Xu .suite = { 2159da7f033dSHerbert Xu .hash = { 2160da7f033dSHerbert Xu .vecs = hmac_sha224_tv_template, 2161da7f033dSHerbert Xu .count = HMAC_SHA224_TEST_VECTORS 2162da7f033dSHerbert Xu } 2163da7f033dSHerbert Xu } 2164da7f033dSHerbert Xu }, { 2165da7f033dSHerbert Xu .alg = "hmac(sha256)", 2166da7f033dSHerbert Xu .test = alg_test_hash, 2167a1915d51SJarod Wilson .fips_allowed = 1, 2168da7f033dSHerbert Xu .suite = { 2169da7f033dSHerbert Xu .hash = { 2170da7f033dSHerbert Xu .vecs = hmac_sha256_tv_template, 2171da7f033dSHerbert Xu .count = HMAC_SHA256_TEST_VECTORS 2172da7f033dSHerbert Xu } 2173da7f033dSHerbert Xu } 2174da7f033dSHerbert Xu }, { 2175da7f033dSHerbert Xu .alg = "hmac(sha384)", 2176da7f033dSHerbert Xu .test = alg_test_hash, 2177a1915d51SJarod Wilson .fips_allowed = 1, 2178da7f033dSHerbert Xu .suite = { 2179da7f033dSHerbert Xu .hash = { 2180da7f033dSHerbert Xu .vecs = hmac_sha384_tv_template, 2181da7f033dSHerbert Xu .count = HMAC_SHA384_TEST_VECTORS 2182da7f033dSHerbert Xu } 2183da7f033dSHerbert Xu } 2184da7f033dSHerbert Xu }, { 2185da7f033dSHerbert Xu .alg = "hmac(sha512)", 2186da7f033dSHerbert Xu .test = alg_test_hash, 2187a1915d51SJarod Wilson .fips_allowed = 1, 2188da7f033dSHerbert Xu .suite = { 2189da7f033dSHerbert Xu .hash = { 2190da7f033dSHerbert Xu .vecs = hmac_sha512_tv_template, 2191da7f033dSHerbert Xu .count = HMAC_SHA512_TEST_VECTORS 2192da7f033dSHerbert Xu } 2193da7f033dSHerbert Xu } 2194da7f033dSHerbert Xu }, { 2195da7f033dSHerbert Xu .alg = "lrw(aes)", 21961aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2197da7f033dSHerbert Xu .suite = { 2198da7f033dSHerbert Xu .cipher = { 2199da7f033dSHerbert Xu .enc = { 2200da7f033dSHerbert Xu .vecs = aes_lrw_enc_tv_template, 2201da7f033dSHerbert Xu .count = AES_LRW_ENC_TEST_VECTORS 2202da7f033dSHerbert Xu }, 2203da7f033dSHerbert Xu .dec = { 2204da7f033dSHerbert Xu .vecs = aes_lrw_dec_tv_template, 2205da7f033dSHerbert Xu .count = AES_LRW_DEC_TEST_VECTORS 2206da7f033dSHerbert Xu } 2207da7f033dSHerbert Xu } 2208da7f033dSHerbert Xu } 2209da7f033dSHerbert Xu }, { 2210da7f033dSHerbert Xu .alg = "lzo", 2211da7f033dSHerbert Xu .test = alg_test_comp, 2212da7f033dSHerbert Xu .suite = { 2213da7f033dSHerbert Xu .comp = { 2214da7f033dSHerbert Xu .comp = { 2215da7f033dSHerbert Xu .vecs = lzo_comp_tv_template, 2216da7f033dSHerbert Xu .count = LZO_COMP_TEST_VECTORS 2217da7f033dSHerbert Xu }, 2218da7f033dSHerbert Xu .decomp = { 2219da7f033dSHerbert Xu .vecs = lzo_decomp_tv_template, 2220da7f033dSHerbert Xu .count = LZO_DECOMP_TEST_VECTORS 2221da7f033dSHerbert Xu } 2222da7f033dSHerbert Xu } 2223da7f033dSHerbert Xu } 2224da7f033dSHerbert Xu }, { 2225da7f033dSHerbert Xu .alg = "md4", 2226da7f033dSHerbert Xu .test = alg_test_hash, 2227da7f033dSHerbert Xu .suite = { 2228da7f033dSHerbert Xu .hash = { 2229da7f033dSHerbert Xu .vecs = md4_tv_template, 2230da7f033dSHerbert Xu .count = MD4_TEST_VECTORS 2231da7f033dSHerbert Xu } 2232da7f033dSHerbert Xu } 2233da7f033dSHerbert Xu }, { 2234da7f033dSHerbert Xu .alg = "md5", 2235da7f033dSHerbert Xu .test = alg_test_hash, 2236da7f033dSHerbert Xu .suite = { 2237da7f033dSHerbert Xu .hash = { 2238da7f033dSHerbert Xu .vecs = md5_tv_template, 2239da7f033dSHerbert Xu .count = MD5_TEST_VECTORS 2240da7f033dSHerbert Xu } 2241da7f033dSHerbert Xu } 2242da7f033dSHerbert Xu }, { 2243da7f033dSHerbert Xu .alg = "michael_mic", 2244da7f033dSHerbert Xu .test = alg_test_hash, 2245da7f033dSHerbert Xu .suite = { 2246da7f033dSHerbert Xu .hash = { 2247da7f033dSHerbert Xu .vecs = michael_mic_tv_template, 2248da7f033dSHerbert Xu .count = MICHAEL_MIC_TEST_VECTORS 2249da7f033dSHerbert Xu } 2250da7f033dSHerbert Xu } 2251da7f033dSHerbert Xu }, { 2252ba0e14acSPuneet Saxena .alg = "ofb(aes)", 2253ba0e14acSPuneet Saxena .test = alg_test_skcipher, 2254ba0e14acSPuneet Saxena .fips_allowed = 1, 2255ba0e14acSPuneet Saxena .suite = { 2256ba0e14acSPuneet Saxena .cipher = { 2257ba0e14acSPuneet Saxena .enc = { 2258ba0e14acSPuneet Saxena .vecs = aes_ofb_enc_tv_template, 2259ba0e14acSPuneet Saxena .count = AES_OFB_ENC_TEST_VECTORS 2260ba0e14acSPuneet Saxena }, 2261ba0e14acSPuneet Saxena .dec = { 2262ba0e14acSPuneet Saxena .vecs = aes_ofb_dec_tv_template, 2263ba0e14acSPuneet Saxena .count = AES_OFB_DEC_TEST_VECTORS 2264ba0e14acSPuneet Saxena } 2265ba0e14acSPuneet Saxena } 2266ba0e14acSPuneet Saxena } 2267ba0e14acSPuneet Saxena }, { 2268da7f033dSHerbert Xu .alg = "pcbc(fcrypt)", 22691aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2270da7f033dSHerbert Xu .suite = { 2271da7f033dSHerbert Xu .cipher = { 2272da7f033dSHerbert Xu .enc = { 2273da7f033dSHerbert Xu .vecs = fcrypt_pcbc_enc_tv_template, 2274da7f033dSHerbert Xu .count = FCRYPT_ENC_TEST_VECTORS 2275da7f033dSHerbert Xu }, 2276da7f033dSHerbert Xu .dec = { 2277da7f033dSHerbert Xu .vecs = fcrypt_pcbc_dec_tv_template, 2278da7f033dSHerbert Xu .count = FCRYPT_DEC_TEST_VECTORS 2279da7f033dSHerbert Xu } 2280da7f033dSHerbert Xu } 2281da7f033dSHerbert Xu } 2282da7f033dSHerbert Xu }, { 2283da7f033dSHerbert Xu .alg = "rfc3686(ctr(aes))", 22841aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2285a1915d51SJarod Wilson .fips_allowed = 1, 2286da7f033dSHerbert Xu .suite = { 2287da7f033dSHerbert Xu .cipher = { 2288da7f033dSHerbert Xu .enc = { 2289f7cb80f2SJarod Wilson .vecs = aes_ctr_rfc3686_enc_tv_template, 2290f7cb80f2SJarod Wilson .count = AES_CTR_3686_ENC_TEST_VECTORS 2291da7f033dSHerbert Xu }, 2292da7f033dSHerbert Xu .dec = { 2293f7cb80f2SJarod Wilson .vecs = aes_ctr_rfc3686_dec_tv_template, 2294f7cb80f2SJarod Wilson .count = AES_CTR_3686_DEC_TEST_VECTORS 2295da7f033dSHerbert Xu } 2296da7f033dSHerbert Xu } 2297da7f033dSHerbert Xu } 2298da7f033dSHerbert Xu }, { 229969435b94SAdrian Hoban .alg = "rfc4106(gcm(aes))", 230069435b94SAdrian Hoban .test = alg_test_aead, 230169435b94SAdrian Hoban .suite = { 230269435b94SAdrian Hoban .aead = { 230369435b94SAdrian Hoban .enc = { 230469435b94SAdrian Hoban .vecs = aes_gcm_rfc4106_enc_tv_template, 230569435b94SAdrian Hoban .count = AES_GCM_4106_ENC_TEST_VECTORS 230669435b94SAdrian Hoban }, 230769435b94SAdrian Hoban .dec = { 230869435b94SAdrian Hoban .vecs = aes_gcm_rfc4106_dec_tv_template, 230969435b94SAdrian Hoban .count = AES_GCM_4106_DEC_TEST_VECTORS 231069435b94SAdrian Hoban } 231169435b94SAdrian Hoban } 231269435b94SAdrian Hoban } 231369435b94SAdrian Hoban }, { 231469435b94SAdrian Hoban 231569435b94SAdrian Hoban 23165d667322SJarod Wilson .alg = "rfc4309(ccm(aes))", 23175d667322SJarod Wilson .test = alg_test_aead, 2318a1915d51SJarod Wilson .fips_allowed = 1, 23195d667322SJarod Wilson .suite = { 23205d667322SJarod Wilson .aead = { 23215d667322SJarod Wilson .enc = { 23225d667322SJarod Wilson .vecs = aes_ccm_rfc4309_enc_tv_template, 23235d667322SJarod Wilson .count = AES_CCM_4309_ENC_TEST_VECTORS 23245d667322SJarod Wilson }, 23255d667322SJarod Wilson .dec = { 23265d667322SJarod Wilson .vecs = aes_ccm_rfc4309_dec_tv_template, 23275d667322SJarod Wilson .count = AES_CCM_4309_DEC_TEST_VECTORS 23285d667322SJarod Wilson } 23295d667322SJarod Wilson } 23305d667322SJarod Wilson } 23315d667322SJarod Wilson }, { 2332da7f033dSHerbert Xu .alg = "rmd128", 2333da7f033dSHerbert Xu .test = alg_test_hash, 2334da7f033dSHerbert Xu .suite = { 2335da7f033dSHerbert Xu .hash = { 2336da7f033dSHerbert Xu .vecs = rmd128_tv_template, 2337da7f033dSHerbert Xu .count = RMD128_TEST_VECTORS 2338da7f033dSHerbert Xu } 2339da7f033dSHerbert Xu } 2340da7f033dSHerbert Xu }, { 2341da7f033dSHerbert Xu .alg = "rmd160", 2342da7f033dSHerbert Xu .test = alg_test_hash, 2343da7f033dSHerbert Xu .suite = { 2344da7f033dSHerbert Xu .hash = { 2345da7f033dSHerbert Xu .vecs = rmd160_tv_template, 2346da7f033dSHerbert Xu .count = RMD160_TEST_VECTORS 2347da7f033dSHerbert Xu } 2348da7f033dSHerbert Xu } 2349da7f033dSHerbert Xu }, { 2350da7f033dSHerbert Xu .alg = "rmd256", 2351da7f033dSHerbert Xu .test = alg_test_hash, 2352da7f033dSHerbert Xu .suite = { 2353da7f033dSHerbert Xu .hash = { 2354da7f033dSHerbert Xu .vecs = rmd256_tv_template, 2355da7f033dSHerbert Xu .count = RMD256_TEST_VECTORS 2356da7f033dSHerbert Xu } 2357da7f033dSHerbert Xu } 2358da7f033dSHerbert Xu }, { 2359da7f033dSHerbert Xu .alg = "rmd320", 2360da7f033dSHerbert Xu .test = alg_test_hash, 2361da7f033dSHerbert Xu .suite = { 2362da7f033dSHerbert Xu .hash = { 2363da7f033dSHerbert Xu .vecs = rmd320_tv_template, 2364da7f033dSHerbert Xu .count = RMD320_TEST_VECTORS 2365da7f033dSHerbert Xu } 2366da7f033dSHerbert Xu } 2367da7f033dSHerbert Xu }, { 2368da7f033dSHerbert Xu .alg = "salsa20", 23691aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2370da7f033dSHerbert Xu .suite = { 2371da7f033dSHerbert Xu .cipher = { 2372da7f033dSHerbert Xu .enc = { 2373da7f033dSHerbert Xu .vecs = salsa20_stream_enc_tv_template, 2374da7f033dSHerbert Xu .count = SALSA20_STREAM_ENC_TEST_VECTORS 2375da7f033dSHerbert Xu } 2376da7f033dSHerbert Xu } 2377da7f033dSHerbert Xu } 2378da7f033dSHerbert Xu }, { 2379da7f033dSHerbert Xu .alg = "sha1", 2380da7f033dSHerbert Xu .test = alg_test_hash, 2381a1915d51SJarod Wilson .fips_allowed = 1, 2382da7f033dSHerbert Xu .suite = { 2383da7f033dSHerbert Xu .hash = { 2384da7f033dSHerbert Xu .vecs = sha1_tv_template, 2385da7f033dSHerbert Xu .count = SHA1_TEST_VECTORS 2386da7f033dSHerbert Xu } 2387da7f033dSHerbert Xu } 2388da7f033dSHerbert Xu }, { 2389da7f033dSHerbert Xu .alg = "sha224", 2390da7f033dSHerbert Xu .test = alg_test_hash, 2391a1915d51SJarod Wilson .fips_allowed = 1, 2392da7f033dSHerbert Xu .suite = { 2393da7f033dSHerbert Xu .hash = { 2394da7f033dSHerbert Xu .vecs = sha224_tv_template, 2395da7f033dSHerbert Xu .count = SHA224_TEST_VECTORS 2396da7f033dSHerbert Xu } 2397da7f033dSHerbert Xu } 2398da7f033dSHerbert Xu }, { 2399da7f033dSHerbert Xu .alg = "sha256", 2400da7f033dSHerbert Xu .test = alg_test_hash, 2401a1915d51SJarod Wilson .fips_allowed = 1, 2402da7f033dSHerbert Xu .suite = { 2403da7f033dSHerbert Xu .hash = { 2404da7f033dSHerbert Xu .vecs = sha256_tv_template, 2405da7f033dSHerbert Xu .count = SHA256_TEST_VECTORS 2406da7f033dSHerbert Xu } 2407da7f033dSHerbert Xu } 2408da7f033dSHerbert Xu }, { 2409da7f033dSHerbert Xu .alg = "sha384", 2410da7f033dSHerbert Xu .test = alg_test_hash, 2411a1915d51SJarod Wilson .fips_allowed = 1, 2412da7f033dSHerbert Xu .suite = { 2413da7f033dSHerbert Xu .hash = { 2414da7f033dSHerbert Xu .vecs = sha384_tv_template, 2415da7f033dSHerbert Xu .count = SHA384_TEST_VECTORS 2416da7f033dSHerbert Xu } 2417da7f033dSHerbert Xu } 2418da7f033dSHerbert Xu }, { 2419da7f033dSHerbert Xu .alg = "sha512", 2420da7f033dSHerbert Xu .test = alg_test_hash, 2421a1915d51SJarod Wilson .fips_allowed = 1, 2422da7f033dSHerbert Xu .suite = { 2423da7f033dSHerbert Xu .hash = { 2424da7f033dSHerbert Xu .vecs = sha512_tv_template, 2425da7f033dSHerbert Xu .count = SHA512_TEST_VECTORS 2426da7f033dSHerbert Xu } 2427da7f033dSHerbert Xu } 2428da7f033dSHerbert Xu }, { 2429da7f033dSHerbert Xu .alg = "tgr128", 2430da7f033dSHerbert Xu .test = alg_test_hash, 2431da7f033dSHerbert Xu .suite = { 2432da7f033dSHerbert Xu .hash = { 2433da7f033dSHerbert Xu .vecs = tgr128_tv_template, 2434da7f033dSHerbert Xu .count = TGR128_TEST_VECTORS 2435da7f033dSHerbert Xu } 2436da7f033dSHerbert Xu } 2437da7f033dSHerbert Xu }, { 2438da7f033dSHerbert Xu .alg = "tgr160", 2439da7f033dSHerbert Xu .test = alg_test_hash, 2440da7f033dSHerbert Xu .suite = { 2441da7f033dSHerbert Xu .hash = { 2442da7f033dSHerbert Xu .vecs = tgr160_tv_template, 2443da7f033dSHerbert Xu .count = TGR160_TEST_VECTORS 2444da7f033dSHerbert Xu } 2445da7f033dSHerbert Xu } 2446da7f033dSHerbert Xu }, { 2447da7f033dSHerbert Xu .alg = "tgr192", 2448da7f033dSHerbert Xu .test = alg_test_hash, 2449da7f033dSHerbert Xu .suite = { 2450da7f033dSHerbert Xu .hash = { 2451da7f033dSHerbert Xu .vecs = tgr192_tv_template, 2452da7f033dSHerbert Xu .count = TGR192_TEST_VECTORS 2453da7f033dSHerbert Xu } 2454da7f033dSHerbert Xu } 2455da7f033dSHerbert Xu }, { 2456f1939f7cSShane Wang .alg = "vmac(aes)", 2457f1939f7cSShane Wang .test = alg_test_hash, 2458f1939f7cSShane Wang .suite = { 2459f1939f7cSShane Wang .hash = { 2460f1939f7cSShane Wang .vecs = aes_vmac128_tv_template, 2461f1939f7cSShane Wang .count = VMAC_AES_TEST_VECTORS 2462f1939f7cSShane Wang } 2463f1939f7cSShane Wang } 2464f1939f7cSShane Wang }, { 2465da7f033dSHerbert Xu .alg = "wp256", 2466da7f033dSHerbert Xu .test = alg_test_hash, 2467da7f033dSHerbert Xu .suite = { 2468da7f033dSHerbert Xu .hash = { 2469da7f033dSHerbert Xu .vecs = wp256_tv_template, 2470da7f033dSHerbert Xu .count = WP256_TEST_VECTORS 2471da7f033dSHerbert Xu } 2472da7f033dSHerbert Xu } 2473da7f033dSHerbert Xu }, { 2474da7f033dSHerbert Xu .alg = "wp384", 2475da7f033dSHerbert Xu .test = alg_test_hash, 2476da7f033dSHerbert Xu .suite = { 2477da7f033dSHerbert Xu .hash = { 2478da7f033dSHerbert Xu .vecs = wp384_tv_template, 2479da7f033dSHerbert Xu .count = WP384_TEST_VECTORS 2480da7f033dSHerbert Xu } 2481da7f033dSHerbert Xu } 2482da7f033dSHerbert Xu }, { 2483da7f033dSHerbert Xu .alg = "wp512", 2484da7f033dSHerbert Xu .test = alg_test_hash, 2485da7f033dSHerbert Xu .suite = { 2486da7f033dSHerbert Xu .hash = { 2487da7f033dSHerbert Xu .vecs = wp512_tv_template, 2488da7f033dSHerbert Xu .count = WP512_TEST_VECTORS 2489da7f033dSHerbert Xu } 2490da7f033dSHerbert Xu } 2491da7f033dSHerbert Xu }, { 2492da7f033dSHerbert Xu .alg = "xcbc(aes)", 2493da7f033dSHerbert Xu .test = alg_test_hash, 2494da7f033dSHerbert Xu .suite = { 2495da7f033dSHerbert Xu .hash = { 2496da7f033dSHerbert Xu .vecs = aes_xcbc128_tv_template, 2497da7f033dSHerbert Xu .count = XCBC_AES_TEST_VECTORS 2498da7f033dSHerbert Xu } 2499da7f033dSHerbert Xu } 2500da7f033dSHerbert Xu }, { 2501da7f033dSHerbert Xu .alg = "xts(aes)", 25021aa4ecd9SHerbert Xu .test = alg_test_skcipher, 25032918aa8dSJarod Wilson .fips_allowed = 1, 2504da7f033dSHerbert Xu .suite = { 2505da7f033dSHerbert Xu .cipher = { 2506da7f033dSHerbert Xu .enc = { 2507da7f033dSHerbert Xu .vecs = aes_xts_enc_tv_template, 2508da7f033dSHerbert Xu .count = AES_XTS_ENC_TEST_VECTORS 2509da7f033dSHerbert Xu }, 2510da7f033dSHerbert Xu .dec = { 2511da7f033dSHerbert Xu .vecs = aes_xts_dec_tv_template, 2512da7f033dSHerbert Xu .count = AES_XTS_DEC_TEST_VECTORS 2513da7f033dSHerbert Xu } 2514da7f033dSHerbert Xu } 2515da7f033dSHerbert Xu } 25160c01aed5SGeert Uytterhoeven }, { 25170c01aed5SGeert Uytterhoeven .alg = "zlib", 25180c01aed5SGeert Uytterhoeven .test = alg_test_pcomp, 25190c01aed5SGeert Uytterhoeven .suite = { 25200c01aed5SGeert Uytterhoeven .pcomp = { 25210c01aed5SGeert Uytterhoeven .comp = { 25220c01aed5SGeert Uytterhoeven .vecs = zlib_comp_tv_template, 25230c01aed5SGeert Uytterhoeven .count = ZLIB_COMP_TEST_VECTORS 25240c01aed5SGeert Uytterhoeven }, 25250c01aed5SGeert Uytterhoeven .decomp = { 25260c01aed5SGeert Uytterhoeven .vecs = zlib_decomp_tv_template, 25270c01aed5SGeert Uytterhoeven .count = ZLIB_DECOMP_TEST_VECTORS 25280c01aed5SGeert Uytterhoeven } 25290c01aed5SGeert Uytterhoeven } 25300c01aed5SGeert Uytterhoeven } 2531da7f033dSHerbert Xu } 2532da7f033dSHerbert Xu }; 2533da7f033dSHerbert Xu 25341aa4ecd9SHerbert Xu static int alg_find_test(const char *alg) 2535da7f033dSHerbert Xu { 2536da7f033dSHerbert Xu int start = 0; 2537da7f033dSHerbert Xu int end = ARRAY_SIZE(alg_test_descs); 2538da7f033dSHerbert Xu 2539da7f033dSHerbert Xu while (start < end) { 2540da7f033dSHerbert Xu int i = (start + end) / 2; 2541da7f033dSHerbert Xu int diff = strcmp(alg_test_descs[i].alg, alg); 2542da7f033dSHerbert Xu 2543da7f033dSHerbert Xu if (diff > 0) { 2544da7f033dSHerbert Xu end = i; 2545da7f033dSHerbert Xu continue; 2546da7f033dSHerbert Xu } 2547da7f033dSHerbert Xu 2548da7f033dSHerbert Xu if (diff < 0) { 2549da7f033dSHerbert Xu start = i + 1; 2550da7f033dSHerbert Xu continue; 2551da7f033dSHerbert Xu } 2552da7f033dSHerbert Xu 25531aa4ecd9SHerbert Xu return i; 2554da7f033dSHerbert Xu } 2555da7f033dSHerbert Xu 25561aa4ecd9SHerbert Xu return -1; 25571aa4ecd9SHerbert Xu } 25581aa4ecd9SHerbert Xu 25591aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 25601aa4ecd9SHerbert Xu { 25611aa4ecd9SHerbert Xu int i; 2562a68f6610SHerbert Xu int j; 2563d12d6b6dSNeil Horman int rc; 25641aa4ecd9SHerbert Xu 25651aa4ecd9SHerbert Xu if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) { 25661aa4ecd9SHerbert Xu char nalg[CRYPTO_MAX_ALG_NAME]; 25671aa4ecd9SHerbert Xu 25681aa4ecd9SHerbert Xu if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >= 25691aa4ecd9SHerbert Xu sizeof(nalg)) 25701aa4ecd9SHerbert Xu return -ENAMETOOLONG; 25711aa4ecd9SHerbert Xu 25721aa4ecd9SHerbert Xu i = alg_find_test(nalg); 25731aa4ecd9SHerbert Xu if (i < 0) 25741aa4ecd9SHerbert Xu goto notest; 25751aa4ecd9SHerbert Xu 2576a3bef3a3SJarod Wilson if (fips_enabled && !alg_test_descs[i].fips_allowed) 2577a3bef3a3SJarod Wilson goto non_fips_alg; 2578a3bef3a3SJarod Wilson 2579941fb328SJarod Wilson rc = alg_test_cipher(alg_test_descs + i, driver, type, mask); 2580941fb328SJarod Wilson goto test_done; 25811aa4ecd9SHerbert Xu } 25821aa4ecd9SHerbert Xu 25831aa4ecd9SHerbert Xu i = alg_find_test(alg); 2584a68f6610SHerbert Xu j = alg_find_test(driver); 2585a68f6610SHerbert Xu if (i < 0 && j < 0) 25861aa4ecd9SHerbert Xu goto notest; 25871aa4ecd9SHerbert Xu 2588a68f6610SHerbert Xu if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) || 2589a68f6610SHerbert Xu (j >= 0 && !alg_test_descs[j].fips_allowed))) 2590a3bef3a3SJarod Wilson goto non_fips_alg; 2591a3bef3a3SJarod Wilson 2592a68f6610SHerbert Xu rc = 0; 2593a68f6610SHerbert Xu if (i >= 0) 2594a68f6610SHerbert Xu rc |= alg_test_descs[i].test(alg_test_descs + i, driver, 25951aa4ecd9SHerbert Xu type, mask); 2596a68f6610SHerbert Xu if (j >= 0) 2597a68f6610SHerbert Xu rc |= alg_test_descs[j].test(alg_test_descs + j, driver, 2598a68f6610SHerbert Xu type, mask); 2599a68f6610SHerbert Xu 2600941fb328SJarod Wilson test_done: 2601d12d6b6dSNeil Horman if (fips_enabled && rc) 2602d12d6b6dSNeil Horman panic("%s: %s alg self test failed in fips mode!\n", driver, alg); 2603d12d6b6dSNeil Horman 260429ecd4abSJarod Wilson if (fips_enabled && !rc) 260529ecd4abSJarod Wilson printk(KERN_INFO "alg: self-tests for %s (%s) passed\n", 260629ecd4abSJarod Wilson driver, alg); 260729ecd4abSJarod Wilson 2608d12d6b6dSNeil Horman return rc; 26091aa4ecd9SHerbert Xu 26101aa4ecd9SHerbert Xu notest: 2611da7f033dSHerbert Xu printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver); 2612da7f033dSHerbert Xu return 0; 2613a3bef3a3SJarod Wilson non_fips_alg: 2614a3bef3a3SJarod Wilson return -EINVAL; 2615da7f033dSHerbert Xu } 26160b767f96SAlexander Shishkin 2617326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */ 26180b767f96SAlexander Shishkin 2619da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test); 2620