1da7f033dSHerbert Xu /* 2da7f033dSHerbert Xu * Algorithm testing framework and tests. 3da7f033dSHerbert Xu * 4da7f033dSHerbert Xu * Copyright (c) 2002 James Morris <jmorris@intercode.com.au> 5da7f033dSHerbert Xu * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org> 6da7f033dSHerbert Xu * Copyright (c) 2007 Nokia Siemens Networks 7da7f033dSHerbert Xu * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au> 8da7f033dSHerbert Xu * 969435b94SAdrian Hoban * Updated RFC4106 AES-GCM testing. 1069435b94SAdrian Hoban * Authors: Aidan O'Mahony (aidan.o.mahony@intel.com) 1169435b94SAdrian Hoban * Adrian Hoban <adrian.hoban@intel.com> 1269435b94SAdrian Hoban * Gabriele Paoloni <gabriele.paoloni@intel.com> 1369435b94SAdrian Hoban * Tadeusz Struk (tadeusz.struk@intel.com) 1469435b94SAdrian Hoban * Copyright (c) 2010, Intel Corporation. 1569435b94SAdrian Hoban * 16da7f033dSHerbert Xu * This program is free software; you can redistribute it and/or modify it 17da7f033dSHerbert Xu * under the terms of the GNU General Public License as published by the Free 18da7f033dSHerbert Xu * Software Foundation; either version 2 of the License, or (at your option) 19da7f033dSHerbert Xu * any later version. 20da7f033dSHerbert Xu * 21da7f033dSHerbert Xu */ 22da7f033dSHerbert Xu 23da7f033dSHerbert Xu #include <crypto/hash.h> 24da7f033dSHerbert Xu #include <linux/err.h> 25da7f033dSHerbert Xu #include <linux/module.h> 26da7f033dSHerbert Xu #include <linux/scatterlist.h> 27da7f033dSHerbert Xu #include <linux/slab.h> 28da7f033dSHerbert Xu #include <linux/string.h> 297647d6ceSJarod Wilson #include <crypto/rng.h> 30da7f033dSHerbert Xu 31da7f033dSHerbert Xu #include "internal.h" 320b767f96SAlexander Shishkin 33326a6346SHerbert Xu #ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS 340b767f96SAlexander Shishkin 350b767f96SAlexander Shishkin /* a perfect nop */ 360b767f96SAlexander Shishkin int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 370b767f96SAlexander Shishkin { 380b767f96SAlexander Shishkin return 0; 390b767f96SAlexander Shishkin } 400b767f96SAlexander Shishkin 410b767f96SAlexander Shishkin #else 420b767f96SAlexander Shishkin 43da7f033dSHerbert Xu #include "testmgr.h" 44da7f033dSHerbert Xu 45da7f033dSHerbert Xu /* 46da7f033dSHerbert Xu * Need slab memory for testing (size in number of pages). 47da7f033dSHerbert Xu */ 48da7f033dSHerbert Xu #define XBUFSIZE 8 49da7f033dSHerbert Xu 50da7f033dSHerbert Xu /* 51da7f033dSHerbert Xu * Indexes into the xbuf to simulate cross-page access. 52da7f033dSHerbert Xu */ 53da7f033dSHerbert Xu #define IDX1 32 54da7f033dSHerbert Xu #define IDX2 32400 55da7f033dSHerbert Xu #define IDX3 1 56da7f033dSHerbert Xu #define IDX4 8193 57da7f033dSHerbert Xu #define IDX5 22222 58da7f033dSHerbert Xu #define IDX6 17101 59da7f033dSHerbert Xu #define IDX7 27333 60da7f033dSHerbert Xu #define IDX8 3000 61da7f033dSHerbert Xu 62da7f033dSHerbert Xu /* 63da7f033dSHerbert Xu * Used by test_cipher() 64da7f033dSHerbert Xu */ 65da7f033dSHerbert Xu #define ENCRYPT 1 66da7f033dSHerbert Xu #define DECRYPT 0 67da7f033dSHerbert Xu 68da7f033dSHerbert Xu struct tcrypt_result { 69da7f033dSHerbert Xu struct completion completion; 70da7f033dSHerbert Xu int err; 71da7f033dSHerbert Xu }; 72da7f033dSHerbert Xu 73da7f033dSHerbert Xu struct aead_test_suite { 74da7f033dSHerbert Xu struct { 75da7f033dSHerbert Xu struct aead_testvec *vecs; 76da7f033dSHerbert Xu unsigned int count; 77da7f033dSHerbert Xu } enc, dec; 78da7f033dSHerbert Xu }; 79da7f033dSHerbert Xu 80da7f033dSHerbert Xu struct cipher_test_suite { 81da7f033dSHerbert Xu struct { 82da7f033dSHerbert Xu struct cipher_testvec *vecs; 83da7f033dSHerbert Xu unsigned int count; 84da7f033dSHerbert Xu } enc, dec; 85da7f033dSHerbert Xu }; 86da7f033dSHerbert Xu 87da7f033dSHerbert Xu struct comp_test_suite { 88da7f033dSHerbert Xu struct { 89da7f033dSHerbert Xu struct comp_testvec *vecs; 90da7f033dSHerbert Xu unsigned int count; 91da7f033dSHerbert Xu } comp, decomp; 92da7f033dSHerbert Xu }; 93da7f033dSHerbert Xu 948064efb8SGeert Uytterhoeven struct pcomp_test_suite { 958064efb8SGeert Uytterhoeven struct { 968064efb8SGeert Uytterhoeven struct pcomp_testvec *vecs; 978064efb8SGeert Uytterhoeven unsigned int count; 988064efb8SGeert Uytterhoeven } comp, decomp; 998064efb8SGeert Uytterhoeven }; 1008064efb8SGeert Uytterhoeven 101da7f033dSHerbert Xu struct hash_test_suite { 102da7f033dSHerbert Xu struct hash_testvec *vecs; 103da7f033dSHerbert Xu unsigned int count; 104da7f033dSHerbert Xu }; 105da7f033dSHerbert Xu 1067647d6ceSJarod Wilson struct cprng_test_suite { 1077647d6ceSJarod Wilson struct cprng_testvec *vecs; 1087647d6ceSJarod Wilson unsigned int count; 1097647d6ceSJarod Wilson }; 1107647d6ceSJarod Wilson 111da7f033dSHerbert Xu struct alg_test_desc { 112da7f033dSHerbert Xu const char *alg; 113da7f033dSHerbert Xu int (*test)(const struct alg_test_desc *desc, const char *driver, 114da7f033dSHerbert Xu u32 type, u32 mask); 115a1915d51SJarod Wilson int fips_allowed; /* set if alg is allowed in fips mode */ 116da7f033dSHerbert Xu 117da7f033dSHerbert Xu union { 118da7f033dSHerbert Xu struct aead_test_suite aead; 119da7f033dSHerbert Xu struct cipher_test_suite cipher; 120da7f033dSHerbert Xu struct comp_test_suite comp; 1218064efb8SGeert Uytterhoeven struct pcomp_test_suite pcomp; 122da7f033dSHerbert Xu struct hash_test_suite hash; 1237647d6ceSJarod Wilson struct cprng_test_suite cprng; 124da7f033dSHerbert Xu } suite; 125da7f033dSHerbert Xu }; 126da7f033dSHerbert Xu 127da7f033dSHerbert Xu static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 }; 128da7f033dSHerbert Xu 129da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len) 130da7f033dSHerbert Xu { 131da7f033dSHerbert Xu print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET, 132da7f033dSHerbert Xu 16, 1, 133da7f033dSHerbert Xu buf, len, false); 134da7f033dSHerbert Xu } 135da7f033dSHerbert Xu 136da7f033dSHerbert Xu static void tcrypt_complete(struct crypto_async_request *req, int err) 137da7f033dSHerbert Xu { 138da7f033dSHerbert Xu struct tcrypt_result *res = req->data; 139da7f033dSHerbert Xu 140da7f033dSHerbert Xu if (err == -EINPROGRESS) 141da7f033dSHerbert Xu return; 142da7f033dSHerbert Xu 143da7f033dSHerbert Xu res->err = err; 144da7f033dSHerbert Xu complete(&res->completion); 145da7f033dSHerbert Xu } 146da7f033dSHerbert Xu 147f8b0d4d0SHerbert Xu static int testmgr_alloc_buf(char *buf[XBUFSIZE]) 148f8b0d4d0SHerbert Xu { 149f8b0d4d0SHerbert Xu int i; 150f8b0d4d0SHerbert Xu 151f8b0d4d0SHerbert Xu for (i = 0; i < XBUFSIZE; i++) { 152f8b0d4d0SHerbert Xu buf[i] = (void *)__get_free_page(GFP_KERNEL); 153f8b0d4d0SHerbert Xu if (!buf[i]) 154f8b0d4d0SHerbert Xu goto err_free_buf; 155f8b0d4d0SHerbert Xu } 156f8b0d4d0SHerbert Xu 157f8b0d4d0SHerbert Xu return 0; 158f8b0d4d0SHerbert Xu 159f8b0d4d0SHerbert Xu err_free_buf: 160f8b0d4d0SHerbert Xu while (i-- > 0) 161f8b0d4d0SHerbert Xu free_page((unsigned long)buf[i]); 162f8b0d4d0SHerbert Xu 163f8b0d4d0SHerbert Xu return -ENOMEM; 164f8b0d4d0SHerbert Xu } 165f8b0d4d0SHerbert Xu 166f8b0d4d0SHerbert Xu static void testmgr_free_buf(char *buf[XBUFSIZE]) 167f8b0d4d0SHerbert Xu { 168f8b0d4d0SHerbert Xu int i; 169f8b0d4d0SHerbert Xu 170f8b0d4d0SHerbert Xu for (i = 0; i < XBUFSIZE; i++) 171f8b0d4d0SHerbert Xu free_page((unsigned long)buf[i]); 172f8b0d4d0SHerbert Xu } 173f8b0d4d0SHerbert Xu 174a8f1a052SDavid S. Miller static int do_one_async_hash_op(struct ahash_request *req, 175a8f1a052SDavid S. Miller struct tcrypt_result *tr, 176a8f1a052SDavid S. Miller int ret) 177a8f1a052SDavid S. Miller { 178a8f1a052SDavid S. Miller if (ret == -EINPROGRESS || ret == -EBUSY) { 179a8f1a052SDavid S. Miller ret = wait_for_completion_interruptible(&tr->completion); 180a8f1a052SDavid S. Miller if (!ret) 181a8f1a052SDavid S. Miller ret = tr->err; 182a8f1a052SDavid S. Miller INIT_COMPLETION(tr->completion); 183a8f1a052SDavid S. Miller } 184a8f1a052SDavid S. Miller return ret; 185a8f1a052SDavid S. Miller } 186a8f1a052SDavid S. Miller 187da7f033dSHerbert Xu static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template, 188a8f1a052SDavid S. Miller unsigned int tcount, bool use_digest) 189da7f033dSHerbert Xu { 190da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm)); 191da7f033dSHerbert Xu unsigned int i, j, k, temp; 192da7f033dSHerbert Xu struct scatterlist sg[8]; 193da7f033dSHerbert Xu char result[64]; 194da7f033dSHerbert Xu struct ahash_request *req; 195da7f033dSHerbert Xu struct tcrypt_result tresult; 196da7f033dSHerbert Xu void *hash_buff; 197f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 198f8b0d4d0SHerbert Xu int ret = -ENOMEM; 199f8b0d4d0SHerbert Xu 200f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 201f8b0d4d0SHerbert Xu goto out_nobuf; 202da7f033dSHerbert Xu 203da7f033dSHerbert Xu init_completion(&tresult.completion); 204da7f033dSHerbert Xu 205da7f033dSHerbert Xu req = ahash_request_alloc(tfm, GFP_KERNEL); 206da7f033dSHerbert Xu if (!req) { 207da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to allocate request for " 208da7f033dSHerbert Xu "%s\n", algo); 209da7f033dSHerbert Xu goto out_noreq; 210da7f033dSHerbert Xu } 211da7f033dSHerbert Xu ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 212da7f033dSHerbert Xu tcrypt_complete, &tresult); 213da7f033dSHerbert Xu 214a0cfae59SHerbert Xu j = 0; 215da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 216a0cfae59SHerbert Xu if (template[i].np) 217a0cfae59SHerbert Xu continue; 218a0cfae59SHerbert Xu 219a0cfae59SHerbert Xu j++; 220da7f033dSHerbert Xu memset(result, 0, 64); 221da7f033dSHerbert Xu 222da7f033dSHerbert Xu hash_buff = xbuf[0]; 223da7f033dSHerbert Xu 224da7f033dSHerbert Xu memcpy(hash_buff, template[i].plaintext, template[i].psize); 225da7f033dSHerbert Xu sg_init_one(&sg[0], hash_buff, template[i].psize); 226da7f033dSHerbert Xu 227da7f033dSHerbert Xu if (template[i].ksize) { 228da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 229da7f033dSHerbert Xu ret = crypto_ahash_setkey(tfm, template[i].key, 230da7f033dSHerbert Xu template[i].ksize); 231da7f033dSHerbert Xu if (ret) { 232da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey failed on " 233a0cfae59SHerbert Xu "test %d for %s: ret=%d\n", j, algo, 234da7f033dSHerbert Xu -ret); 235da7f033dSHerbert Xu goto out; 236da7f033dSHerbert Xu } 237da7f033dSHerbert Xu } 238da7f033dSHerbert Xu 239da7f033dSHerbert Xu ahash_request_set_crypt(req, sg, result, template[i].psize); 240a8f1a052SDavid S. Miller if (use_digest) { 241a8f1a052SDavid S. Miller ret = do_one_async_hash_op(req, &tresult, 242a8f1a052SDavid S. Miller crypto_ahash_digest(req)); 243a8f1a052SDavid S. Miller if (ret) { 244a8f1a052SDavid S. Miller pr_err("alg: hash: digest failed on test %d " 245a0cfae59SHerbert Xu "for %s: ret=%d\n", j, algo, -ret); 246da7f033dSHerbert Xu goto out; 247da7f033dSHerbert Xu } 248a8f1a052SDavid S. Miller } else { 249a8f1a052SDavid S. Miller ret = do_one_async_hash_op(req, &tresult, 250a8f1a052SDavid S. Miller crypto_ahash_init(req)); 251a8f1a052SDavid S. Miller if (ret) { 252a8f1a052SDavid S. Miller pr_err("alt: hash: init failed on test %d " 253a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 254a8f1a052SDavid S. Miller goto out; 255a8f1a052SDavid S. Miller } 256a8f1a052SDavid S. Miller ret = do_one_async_hash_op(req, &tresult, 257a8f1a052SDavid S. Miller crypto_ahash_update(req)); 258a8f1a052SDavid S. Miller if (ret) { 259a8f1a052SDavid S. Miller pr_err("alt: hash: update failed on test %d " 260a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 261a8f1a052SDavid S. Miller goto out; 262a8f1a052SDavid S. Miller } 263a8f1a052SDavid S. Miller ret = do_one_async_hash_op(req, &tresult, 264a8f1a052SDavid S. Miller crypto_ahash_final(req)); 265a8f1a052SDavid S. Miller if (ret) { 266a8f1a052SDavid S. Miller pr_err("alt: hash: final failed on test %d " 267a8f1a052SDavid S. Miller "for %s: ret=%d\n", j, algo, -ret); 268a8f1a052SDavid S. Miller goto out; 269a8f1a052SDavid S. Miller } 270a8f1a052SDavid S. Miller } 271da7f033dSHerbert Xu 272da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 273da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 274da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Test %d failed for %s\n", 275a0cfae59SHerbert Xu j, algo); 276da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 277da7f033dSHerbert Xu ret = -EINVAL; 278da7f033dSHerbert Xu goto out; 279da7f033dSHerbert Xu } 280da7f033dSHerbert Xu } 281da7f033dSHerbert Xu 282da7f033dSHerbert Xu j = 0; 283da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 284da7f033dSHerbert Xu if (template[i].np) { 285da7f033dSHerbert Xu j++; 286da7f033dSHerbert Xu memset(result, 0, 64); 287da7f033dSHerbert Xu 288da7f033dSHerbert Xu temp = 0; 289da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 290fd57f22aSHerbert Xu ret = -EINVAL; 291da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 292fd57f22aSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 293fd57f22aSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 294fd57f22aSHerbert Xu goto out; 295da7f033dSHerbert Xu sg_set_buf(&sg[k], 296da7f033dSHerbert Xu memcpy(xbuf[IDX[k] >> PAGE_SHIFT] + 297da7f033dSHerbert Xu offset_in_page(IDX[k]), 298da7f033dSHerbert Xu template[i].plaintext + temp, 299da7f033dSHerbert Xu template[i].tap[k]), 300da7f033dSHerbert Xu template[i].tap[k]); 301da7f033dSHerbert Xu temp += template[i].tap[k]; 302da7f033dSHerbert Xu } 303da7f033dSHerbert Xu 304da7f033dSHerbert Xu if (template[i].ksize) { 305da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 306da7f033dSHerbert Xu ret = crypto_ahash_setkey(tfm, template[i].key, 307da7f033dSHerbert Xu template[i].ksize); 308da7f033dSHerbert Xu 309da7f033dSHerbert Xu if (ret) { 310da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey " 311da7f033dSHerbert Xu "failed on chunking test %d " 312da7f033dSHerbert Xu "for %s: ret=%d\n", j, algo, 313da7f033dSHerbert Xu -ret); 314da7f033dSHerbert Xu goto out; 315da7f033dSHerbert Xu } 316da7f033dSHerbert Xu } 317da7f033dSHerbert Xu 318da7f033dSHerbert Xu ahash_request_set_crypt(req, sg, result, 319da7f033dSHerbert Xu template[i].psize); 320da7f033dSHerbert Xu ret = crypto_ahash_digest(req); 321da7f033dSHerbert Xu switch (ret) { 322da7f033dSHerbert Xu case 0: 323da7f033dSHerbert Xu break; 324da7f033dSHerbert Xu case -EINPROGRESS: 325da7f033dSHerbert Xu case -EBUSY: 326da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 327da7f033dSHerbert Xu &tresult.completion); 328da7f033dSHerbert Xu if (!ret && !(ret = tresult.err)) { 329da7f033dSHerbert Xu INIT_COMPLETION(tresult.completion); 330da7f033dSHerbert Xu break; 331da7f033dSHerbert Xu } 332da7f033dSHerbert Xu /* fall through */ 333da7f033dSHerbert Xu default: 334da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: digest failed " 335da7f033dSHerbert Xu "on chunking test %d for %s: " 336da7f033dSHerbert Xu "ret=%d\n", j, algo, -ret); 337da7f033dSHerbert Xu goto out; 338da7f033dSHerbert Xu } 339da7f033dSHerbert Xu 340da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 341da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 342da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Chunking test %d " 343da7f033dSHerbert Xu "failed for %s\n", j, algo); 344da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 345da7f033dSHerbert Xu ret = -EINVAL; 346da7f033dSHerbert Xu goto out; 347da7f033dSHerbert Xu } 348da7f033dSHerbert Xu } 349da7f033dSHerbert Xu } 350da7f033dSHerbert Xu 351da7f033dSHerbert Xu ret = 0; 352da7f033dSHerbert Xu 353da7f033dSHerbert Xu out: 354da7f033dSHerbert Xu ahash_request_free(req); 355da7f033dSHerbert Xu out_noreq: 356f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 357f8b0d4d0SHerbert Xu out_nobuf: 358da7f033dSHerbert Xu return ret; 359da7f033dSHerbert Xu } 360da7f033dSHerbert Xu 361d8a32ac2SJussi Kivilinna static int __test_aead(struct crypto_aead *tfm, int enc, 362d8a32ac2SJussi Kivilinna struct aead_testvec *template, unsigned int tcount, 363d8a32ac2SJussi Kivilinna const bool diff_dst) 364da7f033dSHerbert Xu { 365da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)); 366da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 367f8b0d4d0SHerbert Xu int ret = -ENOMEM; 368da7f033dSHerbert Xu char *q; 369da7f033dSHerbert Xu char *key; 370da7f033dSHerbert Xu struct aead_request *req; 371d8a32ac2SJussi Kivilinna struct scatterlist *sg; 372d8a32ac2SJussi Kivilinna struct scatterlist *asg; 373d8a32ac2SJussi Kivilinna struct scatterlist *sgout; 374d8a32ac2SJussi Kivilinna const char *e, *d; 375da7f033dSHerbert Xu struct tcrypt_result result; 376da7f033dSHerbert Xu unsigned int authsize; 377da7f033dSHerbert Xu void *input; 378d8a32ac2SJussi Kivilinna void *output; 379da7f033dSHerbert Xu void *assoc; 380da7f033dSHerbert Xu char iv[MAX_IVLEN]; 381f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 382d8a32ac2SJussi Kivilinna char *xoutbuf[XBUFSIZE]; 383f8b0d4d0SHerbert Xu char *axbuf[XBUFSIZE]; 384f8b0d4d0SHerbert Xu 385f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 386f8b0d4d0SHerbert Xu goto out_noxbuf; 387f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(axbuf)) 388f8b0d4d0SHerbert Xu goto out_noaxbuf; 389da7f033dSHerbert Xu 390d8a32ac2SJussi Kivilinna if (diff_dst && testmgr_alloc_buf(xoutbuf)) 391d8a32ac2SJussi Kivilinna goto out_nooutbuf; 392d8a32ac2SJussi Kivilinna 393d8a32ac2SJussi Kivilinna /* avoid "the frame size is larger than 1024 bytes" compiler warning */ 394d8a32ac2SJussi Kivilinna sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 3 : 2), GFP_KERNEL); 395d8a32ac2SJussi Kivilinna if (!sg) 396d8a32ac2SJussi Kivilinna goto out_nosg; 397d8a32ac2SJussi Kivilinna asg = &sg[8]; 398d8a32ac2SJussi Kivilinna sgout = &asg[8]; 399d8a32ac2SJussi Kivilinna 400d8a32ac2SJussi Kivilinna if (diff_dst) 401d8a32ac2SJussi Kivilinna d = "-ddst"; 402d8a32ac2SJussi Kivilinna else 403d8a32ac2SJussi Kivilinna d = ""; 404d8a32ac2SJussi Kivilinna 405da7f033dSHerbert Xu if (enc == ENCRYPT) 406da7f033dSHerbert Xu e = "encryption"; 407da7f033dSHerbert Xu else 408da7f033dSHerbert Xu e = "decryption"; 409da7f033dSHerbert Xu 410da7f033dSHerbert Xu init_completion(&result.completion); 411da7f033dSHerbert Xu 412da7f033dSHerbert Xu req = aead_request_alloc(tfm, GFP_KERNEL); 413da7f033dSHerbert Xu if (!req) { 414d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to allocate request for %s\n", 415d8a32ac2SJussi Kivilinna d, algo); 416da7f033dSHerbert Xu goto out; 417da7f033dSHerbert Xu } 418da7f033dSHerbert Xu 419da7f033dSHerbert Xu aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 420da7f033dSHerbert Xu tcrypt_complete, &result); 421da7f033dSHerbert Xu 422da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 423da7f033dSHerbert Xu if (!template[i].np) { 424da7f033dSHerbert Xu j++; 425da7f033dSHerbert Xu 426da7f033dSHerbert Xu /* some tepmplates have no input data but they will 427da7f033dSHerbert Xu * touch input 428da7f033dSHerbert Xu */ 429da7f033dSHerbert Xu input = xbuf[0]; 430da7f033dSHerbert Xu assoc = axbuf[0]; 431da7f033dSHerbert Xu 432fd57f22aSHerbert Xu ret = -EINVAL; 433fd57f22aSHerbert Xu if (WARN_ON(template[i].ilen > PAGE_SIZE || 434fd57f22aSHerbert Xu template[i].alen > PAGE_SIZE)) 435fd57f22aSHerbert Xu goto out; 436fd57f22aSHerbert Xu 437da7f033dSHerbert Xu memcpy(input, template[i].input, template[i].ilen); 438da7f033dSHerbert Xu memcpy(assoc, template[i].assoc, template[i].alen); 439da7f033dSHerbert Xu if (template[i].iv) 440da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 441da7f033dSHerbert Xu else 442da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 443da7f033dSHerbert Xu 444da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 445da7f033dSHerbert Xu if (template[i].wk) 446da7f033dSHerbert Xu crypto_aead_set_flags( 447da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 448da7f033dSHerbert Xu 449da7f033dSHerbert Xu key = template[i].key; 450da7f033dSHerbert Xu 451da7f033dSHerbert Xu ret = crypto_aead_setkey(tfm, key, 452da7f033dSHerbert Xu template[i].klen); 453da7f033dSHerbert Xu if (!ret == template[i].fail) { 454d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n", 455d8a32ac2SJussi Kivilinna d, j, algo, crypto_aead_get_flags(tfm)); 456da7f033dSHerbert Xu goto out; 457da7f033dSHerbert Xu } else if (ret) 458da7f033dSHerbert Xu continue; 459da7f033dSHerbert Xu 460da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 461da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 462da7f033dSHerbert Xu if (ret) { 463d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n", 464d8a32ac2SJussi Kivilinna d, authsize, j, algo); 465da7f033dSHerbert Xu goto out; 466da7f033dSHerbert Xu } 467da7f033dSHerbert Xu 468da7f033dSHerbert Xu sg_init_one(&sg[0], input, 469da7f033dSHerbert Xu template[i].ilen + (enc ? authsize : 0)); 470da7f033dSHerbert Xu 471d8a32ac2SJussi Kivilinna if (diff_dst) { 472d8a32ac2SJussi Kivilinna output = xoutbuf[0]; 473d8a32ac2SJussi Kivilinna sg_init_one(&sgout[0], output, 474d8a32ac2SJussi Kivilinna template[i].ilen + 475d8a32ac2SJussi Kivilinna (enc ? authsize : 0)); 476d8a32ac2SJussi Kivilinna } else { 477d8a32ac2SJussi Kivilinna output = input; 478d8a32ac2SJussi Kivilinna } 479d8a32ac2SJussi Kivilinna 480da7f033dSHerbert Xu sg_init_one(&asg[0], assoc, template[i].alen); 481da7f033dSHerbert Xu 482d8a32ac2SJussi Kivilinna aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 483da7f033dSHerbert Xu template[i].ilen, iv); 484da7f033dSHerbert Xu 485da7f033dSHerbert Xu aead_request_set_assoc(req, asg, template[i].alen); 486da7f033dSHerbert Xu 487da7f033dSHerbert Xu ret = enc ? 488da7f033dSHerbert Xu crypto_aead_encrypt(req) : 489da7f033dSHerbert Xu crypto_aead_decrypt(req); 490da7f033dSHerbert Xu 491da7f033dSHerbert Xu switch (ret) { 492da7f033dSHerbert Xu case 0: 493e44a1b44SJarod Wilson if (template[i].novrfy) { 494e44a1b44SJarod Wilson /* verification was supposed to fail */ 495d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n", 496d8a32ac2SJussi Kivilinna d, e, j, algo); 497e44a1b44SJarod Wilson /* so really, we got a bad message */ 498e44a1b44SJarod Wilson ret = -EBADMSG; 499e44a1b44SJarod Wilson goto out; 500e44a1b44SJarod Wilson } 501da7f033dSHerbert Xu break; 502da7f033dSHerbert Xu case -EINPROGRESS: 503da7f033dSHerbert Xu case -EBUSY: 504da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 505da7f033dSHerbert Xu &result.completion); 506da7f033dSHerbert Xu if (!ret && !(ret = result.err)) { 507da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 508da7f033dSHerbert Xu break; 509da7f033dSHerbert Xu } 510e44a1b44SJarod Wilson case -EBADMSG: 511e44a1b44SJarod Wilson if (template[i].novrfy) 512e44a1b44SJarod Wilson /* verification failure was expected */ 513e44a1b44SJarod Wilson continue; 514da7f033dSHerbert Xu /* fall through */ 515da7f033dSHerbert Xu default: 516d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n", 517d8a32ac2SJussi Kivilinna d, e, j, algo, -ret); 518da7f033dSHerbert Xu goto out; 519da7f033dSHerbert Xu } 520da7f033dSHerbert Xu 521d8a32ac2SJussi Kivilinna q = output; 522da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 523d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Test %d failed on %s for %s\n", 524d8a32ac2SJussi Kivilinna d, j, e, algo); 525da7f033dSHerbert Xu hexdump(q, template[i].rlen); 526da7f033dSHerbert Xu ret = -EINVAL; 527da7f033dSHerbert Xu goto out; 528da7f033dSHerbert Xu } 529da7f033dSHerbert Xu } 530da7f033dSHerbert Xu } 531da7f033dSHerbert Xu 532da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 533da7f033dSHerbert Xu if (template[i].np) { 534da7f033dSHerbert Xu j++; 535da7f033dSHerbert Xu 536da7f033dSHerbert Xu if (template[i].iv) 537da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 538da7f033dSHerbert Xu else 539da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 540da7f033dSHerbert Xu 541da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 542da7f033dSHerbert Xu if (template[i].wk) 543da7f033dSHerbert Xu crypto_aead_set_flags( 544da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 545da7f033dSHerbert Xu key = template[i].key; 546da7f033dSHerbert Xu 547da7f033dSHerbert Xu ret = crypto_aead_setkey(tfm, key, template[i].klen); 548da7f033dSHerbert Xu if (!ret == template[i].fail) { 549d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n", 550d8a32ac2SJussi Kivilinna d, j, algo, crypto_aead_get_flags(tfm)); 551da7f033dSHerbert Xu goto out; 552da7f033dSHerbert Xu } else if (ret) 553da7f033dSHerbert Xu continue; 554da7f033dSHerbert Xu 555da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 556da7f033dSHerbert Xu 557da7f033dSHerbert Xu ret = -EINVAL; 558da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 559d8a32ac2SJussi Kivilinna if (diff_dst) 560d8a32ac2SJussi Kivilinna sg_init_table(sgout, template[i].np); 561da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 562da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 563da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 564da7f033dSHerbert Xu goto out; 565da7f033dSHerbert Xu 566da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 567da7f033dSHerbert Xu offset_in_page(IDX[k]); 568da7f033dSHerbert Xu 569da7f033dSHerbert Xu memcpy(q, template[i].input + temp, 570da7f033dSHerbert Xu template[i].tap[k]); 571da7f033dSHerbert Xu 572da7f033dSHerbert Xu n = template[i].tap[k]; 573da7f033dSHerbert Xu if (k == template[i].np - 1 && enc) 574da7f033dSHerbert Xu n += authsize; 575da7f033dSHerbert Xu if (offset_in_page(q) + n < PAGE_SIZE) 576da7f033dSHerbert Xu q[n] = 0; 577da7f033dSHerbert Xu 578da7f033dSHerbert Xu sg_set_buf(&sg[k], q, template[i].tap[k]); 579d8a32ac2SJussi Kivilinna 580d8a32ac2SJussi Kivilinna if (diff_dst) { 581d8a32ac2SJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 582d8a32ac2SJussi Kivilinna offset_in_page(IDX[k]); 583d8a32ac2SJussi Kivilinna 584d8a32ac2SJussi Kivilinna memset(q, 0, template[i].tap[k]); 585d8a32ac2SJussi Kivilinna if (offset_in_page(q) + n < PAGE_SIZE) 586d8a32ac2SJussi Kivilinna q[n] = 0; 587d8a32ac2SJussi Kivilinna 588d8a32ac2SJussi Kivilinna sg_set_buf(&sgout[k], q, 589d8a32ac2SJussi Kivilinna template[i].tap[k]); 590d8a32ac2SJussi Kivilinna } 591d8a32ac2SJussi Kivilinna 592da7f033dSHerbert Xu temp += template[i].tap[k]; 593da7f033dSHerbert Xu } 594da7f033dSHerbert Xu 595da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 596da7f033dSHerbert Xu if (ret) { 597d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n", 598d8a32ac2SJussi Kivilinna d, authsize, j, algo); 599da7f033dSHerbert Xu goto out; 600da7f033dSHerbert Xu } 601da7f033dSHerbert Xu 602da7f033dSHerbert Xu if (enc) { 603da7f033dSHerbert Xu if (WARN_ON(sg[k - 1].offset + 604da7f033dSHerbert Xu sg[k - 1].length + authsize > 605da7f033dSHerbert Xu PAGE_SIZE)) { 606da7f033dSHerbert Xu ret = -EINVAL; 607da7f033dSHerbert Xu goto out; 608da7f033dSHerbert Xu } 609da7f033dSHerbert Xu 610da7f033dSHerbert Xu sg[k - 1].length += authsize; 611d8a32ac2SJussi Kivilinna 612d8a32ac2SJussi Kivilinna if (diff_dst) 613d8a32ac2SJussi Kivilinna sgout[k - 1].length += authsize; 614da7f033dSHerbert Xu } 615da7f033dSHerbert Xu 616da7f033dSHerbert Xu sg_init_table(asg, template[i].anp); 617fd57f22aSHerbert Xu ret = -EINVAL; 618da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].anp; k++) { 619fd57f22aSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 620fd57f22aSHerbert Xu template[i].atap[k] > PAGE_SIZE)) 621fd57f22aSHerbert Xu goto out; 622da7f033dSHerbert Xu sg_set_buf(&asg[k], 623da7f033dSHerbert Xu memcpy(axbuf[IDX[k] >> PAGE_SHIFT] + 624da7f033dSHerbert Xu offset_in_page(IDX[k]), 625da7f033dSHerbert Xu template[i].assoc + temp, 626da7f033dSHerbert Xu template[i].atap[k]), 627da7f033dSHerbert Xu template[i].atap[k]); 628da7f033dSHerbert Xu temp += template[i].atap[k]; 629da7f033dSHerbert Xu } 630da7f033dSHerbert Xu 631d8a32ac2SJussi Kivilinna aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg, 632da7f033dSHerbert Xu template[i].ilen, 633da7f033dSHerbert Xu iv); 634da7f033dSHerbert Xu 635da7f033dSHerbert Xu aead_request_set_assoc(req, asg, template[i].alen); 636da7f033dSHerbert Xu 637da7f033dSHerbert Xu ret = enc ? 638da7f033dSHerbert Xu crypto_aead_encrypt(req) : 639da7f033dSHerbert Xu crypto_aead_decrypt(req); 640da7f033dSHerbert Xu 641da7f033dSHerbert Xu switch (ret) { 642da7f033dSHerbert Xu case 0: 643e44a1b44SJarod Wilson if (template[i].novrfy) { 644e44a1b44SJarod Wilson /* verification was supposed to fail */ 645d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n", 646d8a32ac2SJussi Kivilinna d, e, j, algo); 647e44a1b44SJarod Wilson /* so really, we got a bad message */ 648e44a1b44SJarod Wilson ret = -EBADMSG; 649e44a1b44SJarod Wilson goto out; 650e44a1b44SJarod Wilson } 651da7f033dSHerbert Xu break; 652da7f033dSHerbert Xu case -EINPROGRESS: 653da7f033dSHerbert Xu case -EBUSY: 654da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 655da7f033dSHerbert Xu &result.completion); 656da7f033dSHerbert Xu if (!ret && !(ret = result.err)) { 657da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 658da7f033dSHerbert Xu break; 659da7f033dSHerbert Xu } 660e44a1b44SJarod Wilson case -EBADMSG: 661e44a1b44SJarod Wilson if (template[i].novrfy) 662e44a1b44SJarod Wilson /* verification failure was expected */ 663e44a1b44SJarod Wilson continue; 664da7f033dSHerbert Xu /* fall through */ 665da7f033dSHerbert Xu default: 666d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n", 667d8a32ac2SJussi Kivilinna d, e, j, algo, -ret); 668da7f033dSHerbert Xu goto out; 669da7f033dSHerbert Xu } 670da7f033dSHerbert Xu 671da7f033dSHerbert Xu ret = -EINVAL; 672da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 673d8a32ac2SJussi Kivilinna if (diff_dst) 674d8a32ac2SJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 675d8a32ac2SJussi Kivilinna offset_in_page(IDX[k]); 676d8a32ac2SJussi Kivilinna else 677da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 678da7f033dSHerbert Xu offset_in_page(IDX[k]); 679da7f033dSHerbert Xu 680da7f033dSHerbert Xu n = template[i].tap[k]; 681da7f033dSHerbert Xu if (k == template[i].np - 1) 682da7f033dSHerbert Xu n += enc ? authsize : -authsize; 683da7f033dSHerbert Xu 684da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, n)) { 685d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n", 686d8a32ac2SJussi Kivilinna d, j, e, k, algo); 687da7f033dSHerbert Xu hexdump(q, n); 688da7f033dSHerbert Xu goto out; 689da7f033dSHerbert Xu } 690da7f033dSHerbert Xu 691da7f033dSHerbert Xu q += n; 692da7f033dSHerbert Xu if (k == template[i].np - 1 && !enc) { 693d8a32ac2SJussi Kivilinna if (!diff_dst && 694d8a32ac2SJussi Kivilinna memcmp(q, template[i].input + 695da7f033dSHerbert Xu temp + n, authsize)) 696da7f033dSHerbert Xu n = authsize; 697da7f033dSHerbert Xu else 698da7f033dSHerbert Xu n = 0; 699da7f033dSHerbert Xu } else { 700da7f033dSHerbert Xu for (n = 0; offset_in_page(q + n) && 701da7f033dSHerbert Xu q[n]; n++) 702da7f033dSHerbert Xu ; 703da7f033dSHerbert Xu } 704da7f033dSHerbert Xu if (n) { 705d8a32ac2SJussi Kivilinna pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n", 706d8a32ac2SJussi Kivilinna d, j, e, k, algo, n); 707da7f033dSHerbert Xu hexdump(q, n); 708da7f033dSHerbert Xu goto out; 709da7f033dSHerbert Xu } 710da7f033dSHerbert Xu 711da7f033dSHerbert Xu temp += template[i].tap[k]; 712da7f033dSHerbert Xu } 713da7f033dSHerbert Xu } 714da7f033dSHerbert Xu } 715da7f033dSHerbert Xu 716da7f033dSHerbert Xu ret = 0; 717da7f033dSHerbert Xu 718da7f033dSHerbert Xu out: 719da7f033dSHerbert Xu aead_request_free(req); 720d8a32ac2SJussi Kivilinna kfree(sg); 721d8a32ac2SJussi Kivilinna out_nosg: 722d8a32ac2SJussi Kivilinna if (diff_dst) 723d8a32ac2SJussi Kivilinna testmgr_free_buf(xoutbuf); 724d8a32ac2SJussi Kivilinna out_nooutbuf: 725f8b0d4d0SHerbert Xu testmgr_free_buf(axbuf); 726f8b0d4d0SHerbert Xu out_noaxbuf: 727f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 728f8b0d4d0SHerbert Xu out_noxbuf: 729da7f033dSHerbert Xu return ret; 730da7f033dSHerbert Xu } 731da7f033dSHerbert Xu 732d8a32ac2SJussi Kivilinna static int test_aead(struct crypto_aead *tfm, int enc, 733d8a32ac2SJussi Kivilinna struct aead_testvec *template, unsigned int tcount) 734d8a32ac2SJussi Kivilinna { 735d8a32ac2SJussi Kivilinna int ret; 736d8a32ac2SJussi Kivilinna 737d8a32ac2SJussi Kivilinna /* test 'dst == src' case */ 738d8a32ac2SJussi Kivilinna ret = __test_aead(tfm, enc, template, tcount, false); 739d8a32ac2SJussi Kivilinna if (ret) 740d8a32ac2SJussi Kivilinna return ret; 741d8a32ac2SJussi Kivilinna 742d8a32ac2SJussi Kivilinna /* test 'dst != src' case */ 743d8a32ac2SJussi Kivilinna return __test_aead(tfm, enc, template, tcount, true); 744d8a32ac2SJussi Kivilinna } 745d8a32ac2SJussi Kivilinna 7461aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc, 7471aa4ecd9SHerbert Xu struct cipher_testvec *template, unsigned int tcount) 7481aa4ecd9SHerbert Xu { 7491aa4ecd9SHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm)); 7501aa4ecd9SHerbert Xu unsigned int i, j, k; 7511aa4ecd9SHerbert Xu char *q; 7521aa4ecd9SHerbert Xu const char *e; 7531aa4ecd9SHerbert Xu void *data; 754f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 755f8b0d4d0SHerbert Xu int ret = -ENOMEM; 756f8b0d4d0SHerbert Xu 757f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 758f8b0d4d0SHerbert Xu goto out_nobuf; 7591aa4ecd9SHerbert Xu 7601aa4ecd9SHerbert Xu if (enc == ENCRYPT) 7611aa4ecd9SHerbert Xu e = "encryption"; 7621aa4ecd9SHerbert Xu else 7631aa4ecd9SHerbert Xu e = "decryption"; 7641aa4ecd9SHerbert Xu 7651aa4ecd9SHerbert Xu j = 0; 7661aa4ecd9SHerbert Xu for (i = 0; i < tcount; i++) { 7671aa4ecd9SHerbert Xu if (template[i].np) 7681aa4ecd9SHerbert Xu continue; 7691aa4ecd9SHerbert Xu 7701aa4ecd9SHerbert Xu j++; 7711aa4ecd9SHerbert Xu 772fd57f22aSHerbert Xu ret = -EINVAL; 773fd57f22aSHerbert Xu if (WARN_ON(template[i].ilen > PAGE_SIZE)) 774fd57f22aSHerbert Xu goto out; 775fd57f22aSHerbert Xu 7761aa4ecd9SHerbert Xu data = xbuf[0]; 7771aa4ecd9SHerbert Xu memcpy(data, template[i].input, template[i].ilen); 7781aa4ecd9SHerbert Xu 7791aa4ecd9SHerbert Xu crypto_cipher_clear_flags(tfm, ~0); 7801aa4ecd9SHerbert Xu if (template[i].wk) 7811aa4ecd9SHerbert Xu crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 7821aa4ecd9SHerbert Xu 7831aa4ecd9SHerbert Xu ret = crypto_cipher_setkey(tfm, template[i].key, 7841aa4ecd9SHerbert Xu template[i].klen); 7851aa4ecd9SHerbert Xu if (!ret == template[i].fail) { 7861aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: setkey failed " 7871aa4ecd9SHerbert Xu "on test %d for %s: flags=%x\n", j, 7881aa4ecd9SHerbert Xu algo, crypto_cipher_get_flags(tfm)); 7891aa4ecd9SHerbert Xu goto out; 7901aa4ecd9SHerbert Xu } else if (ret) 7911aa4ecd9SHerbert Xu continue; 7921aa4ecd9SHerbert Xu 7931aa4ecd9SHerbert Xu for (k = 0; k < template[i].ilen; 7941aa4ecd9SHerbert Xu k += crypto_cipher_blocksize(tfm)) { 7951aa4ecd9SHerbert Xu if (enc) 7961aa4ecd9SHerbert Xu crypto_cipher_encrypt_one(tfm, data + k, 7971aa4ecd9SHerbert Xu data + k); 7981aa4ecd9SHerbert Xu else 7991aa4ecd9SHerbert Xu crypto_cipher_decrypt_one(tfm, data + k, 8001aa4ecd9SHerbert Xu data + k); 8011aa4ecd9SHerbert Xu } 8021aa4ecd9SHerbert Xu 8031aa4ecd9SHerbert Xu q = data; 8041aa4ecd9SHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 8051aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: Test %d failed " 8061aa4ecd9SHerbert Xu "on %s for %s\n", j, e, algo); 8071aa4ecd9SHerbert Xu hexdump(q, template[i].rlen); 8081aa4ecd9SHerbert Xu ret = -EINVAL; 8091aa4ecd9SHerbert Xu goto out; 8101aa4ecd9SHerbert Xu } 8111aa4ecd9SHerbert Xu } 8121aa4ecd9SHerbert Xu 8131aa4ecd9SHerbert Xu ret = 0; 8141aa4ecd9SHerbert Xu 8151aa4ecd9SHerbert Xu out: 816f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 817f8b0d4d0SHerbert Xu out_nobuf: 8181aa4ecd9SHerbert Xu return ret; 8191aa4ecd9SHerbert Xu } 8201aa4ecd9SHerbert Xu 82108d6af8cSJussi Kivilinna static int __test_skcipher(struct crypto_ablkcipher *tfm, int enc, 82208d6af8cSJussi Kivilinna struct cipher_testvec *template, unsigned int tcount, 82308d6af8cSJussi Kivilinna const bool diff_dst) 824da7f033dSHerbert Xu { 825da7f033dSHerbert Xu const char *algo = 826da7f033dSHerbert Xu crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm)); 827da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 828da7f033dSHerbert Xu char *q; 829da7f033dSHerbert Xu struct ablkcipher_request *req; 830da7f033dSHerbert Xu struct scatterlist sg[8]; 83108d6af8cSJussi Kivilinna struct scatterlist sgout[8]; 83208d6af8cSJussi Kivilinna const char *e, *d; 833da7f033dSHerbert Xu struct tcrypt_result result; 834da7f033dSHerbert Xu void *data; 835da7f033dSHerbert Xu char iv[MAX_IVLEN]; 836f8b0d4d0SHerbert Xu char *xbuf[XBUFSIZE]; 83708d6af8cSJussi Kivilinna char *xoutbuf[XBUFSIZE]; 838f8b0d4d0SHerbert Xu int ret = -ENOMEM; 839f8b0d4d0SHerbert Xu 840f8b0d4d0SHerbert Xu if (testmgr_alloc_buf(xbuf)) 841f8b0d4d0SHerbert Xu goto out_nobuf; 842da7f033dSHerbert Xu 84308d6af8cSJussi Kivilinna if (diff_dst && testmgr_alloc_buf(xoutbuf)) 84408d6af8cSJussi Kivilinna goto out_nooutbuf; 84508d6af8cSJussi Kivilinna 84608d6af8cSJussi Kivilinna if (diff_dst) 84708d6af8cSJussi Kivilinna d = "-ddst"; 84808d6af8cSJussi Kivilinna else 84908d6af8cSJussi Kivilinna d = ""; 85008d6af8cSJussi Kivilinna 851da7f033dSHerbert Xu if (enc == ENCRYPT) 852da7f033dSHerbert Xu e = "encryption"; 853da7f033dSHerbert Xu else 854da7f033dSHerbert Xu e = "decryption"; 855da7f033dSHerbert Xu 856da7f033dSHerbert Xu init_completion(&result.completion); 857da7f033dSHerbert Xu 858da7f033dSHerbert Xu req = ablkcipher_request_alloc(tfm, GFP_KERNEL); 859da7f033dSHerbert Xu if (!req) { 86008d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Failed to allocate request for %s\n", 86108d6af8cSJussi Kivilinna d, algo); 862da7f033dSHerbert Xu goto out; 863da7f033dSHerbert Xu } 864da7f033dSHerbert Xu 865da7f033dSHerbert Xu ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 866da7f033dSHerbert Xu tcrypt_complete, &result); 867da7f033dSHerbert Xu 868da7f033dSHerbert Xu j = 0; 869da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 870da7f033dSHerbert Xu if (template[i].iv) 871da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 872da7f033dSHerbert Xu else 873da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 874da7f033dSHerbert Xu 875f44d83d1SJussi Kivilinna if (!(template[i].np) || (template[i].also_non_np)) { 876da7f033dSHerbert Xu j++; 877da7f033dSHerbert Xu 878fd57f22aSHerbert Xu ret = -EINVAL; 879fd57f22aSHerbert Xu if (WARN_ON(template[i].ilen > PAGE_SIZE)) 880fd57f22aSHerbert Xu goto out; 881fd57f22aSHerbert Xu 882da7f033dSHerbert Xu data = xbuf[0]; 883da7f033dSHerbert Xu memcpy(data, template[i].input, template[i].ilen); 884da7f033dSHerbert Xu 885da7f033dSHerbert Xu crypto_ablkcipher_clear_flags(tfm, ~0); 886da7f033dSHerbert Xu if (template[i].wk) 887da7f033dSHerbert Xu crypto_ablkcipher_set_flags( 888da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 889da7f033dSHerbert Xu 890da7f033dSHerbert Xu ret = crypto_ablkcipher_setkey(tfm, template[i].key, 891da7f033dSHerbert Xu template[i].klen); 892da7f033dSHerbert Xu if (!ret == template[i].fail) { 89308d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n", 89408d6af8cSJussi Kivilinna d, j, algo, 89508d6af8cSJussi Kivilinna crypto_ablkcipher_get_flags(tfm)); 896da7f033dSHerbert Xu goto out; 897da7f033dSHerbert Xu } else if (ret) 898da7f033dSHerbert Xu continue; 899da7f033dSHerbert Xu 900da7f033dSHerbert Xu sg_init_one(&sg[0], data, template[i].ilen); 90108d6af8cSJussi Kivilinna if (diff_dst) { 90208d6af8cSJussi Kivilinna data = xoutbuf[0]; 90308d6af8cSJussi Kivilinna sg_init_one(&sgout[0], data, template[i].ilen); 90408d6af8cSJussi Kivilinna } 905da7f033dSHerbert Xu 90608d6af8cSJussi Kivilinna ablkcipher_request_set_crypt(req, sg, 90708d6af8cSJussi Kivilinna (diff_dst) ? sgout : sg, 908da7f033dSHerbert Xu template[i].ilen, iv); 909da7f033dSHerbert Xu ret = enc ? 910da7f033dSHerbert Xu crypto_ablkcipher_encrypt(req) : 911da7f033dSHerbert Xu crypto_ablkcipher_decrypt(req); 912da7f033dSHerbert Xu 913da7f033dSHerbert Xu switch (ret) { 914da7f033dSHerbert Xu case 0: 915da7f033dSHerbert Xu break; 916da7f033dSHerbert Xu case -EINPROGRESS: 917da7f033dSHerbert Xu case -EBUSY: 918da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 919da7f033dSHerbert Xu &result.completion); 920da7f033dSHerbert Xu if (!ret && !((ret = result.err))) { 921da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 922da7f033dSHerbert Xu break; 923da7f033dSHerbert Xu } 924da7f033dSHerbert Xu /* fall through */ 925da7f033dSHerbert Xu default: 92608d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n", 92708d6af8cSJussi Kivilinna d, e, j, algo, -ret); 928da7f033dSHerbert Xu goto out; 929da7f033dSHerbert Xu } 930da7f033dSHerbert Xu 931da7f033dSHerbert Xu q = data; 932da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 93308d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Test %d failed on %s for %s\n", 93408d6af8cSJussi Kivilinna d, j, e, algo); 935da7f033dSHerbert Xu hexdump(q, template[i].rlen); 936da7f033dSHerbert Xu ret = -EINVAL; 937da7f033dSHerbert Xu goto out; 938da7f033dSHerbert Xu } 939da7f033dSHerbert Xu } 940da7f033dSHerbert Xu } 941da7f033dSHerbert Xu 942da7f033dSHerbert Xu j = 0; 943da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 944da7f033dSHerbert Xu 945da7f033dSHerbert Xu if (template[i].iv) 946da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 947da7f033dSHerbert Xu else 948da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 949da7f033dSHerbert Xu 950da7f033dSHerbert Xu if (template[i].np) { 951da7f033dSHerbert Xu j++; 952da7f033dSHerbert Xu 953da7f033dSHerbert Xu crypto_ablkcipher_clear_flags(tfm, ~0); 954da7f033dSHerbert Xu if (template[i].wk) 955da7f033dSHerbert Xu crypto_ablkcipher_set_flags( 956da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 957da7f033dSHerbert Xu 958da7f033dSHerbert Xu ret = crypto_ablkcipher_setkey(tfm, template[i].key, 959da7f033dSHerbert Xu template[i].klen); 960da7f033dSHerbert Xu if (!ret == template[i].fail) { 96108d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n", 96208d6af8cSJussi Kivilinna d, j, algo, 963da7f033dSHerbert Xu crypto_ablkcipher_get_flags(tfm)); 964da7f033dSHerbert Xu goto out; 965da7f033dSHerbert Xu } else if (ret) 966da7f033dSHerbert Xu continue; 967da7f033dSHerbert Xu 968da7f033dSHerbert Xu temp = 0; 969da7f033dSHerbert Xu ret = -EINVAL; 970da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 97108d6af8cSJussi Kivilinna if (diff_dst) 97208d6af8cSJussi Kivilinna sg_init_table(sgout, template[i].np); 973da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 974da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 975da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 976da7f033dSHerbert Xu goto out; 977da7f033dSHerbert Xu 978da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 979da7f033dSHerbert Xu offset_in_page(IDX[k]); 980da7f033dSHerbert Xu 981da7f033dSHerbert Xu memcpy(q, template[i].input + temp, 982da7f033dSHerbert Xu template[i].tap[k]); 983da7f033dSHerbert Xu 984da7f033dSHerbert Xu if (offset_in_page(q) + template[i].tap[k] < 985da7f033dSHerbert Xu PAGE_SIZE) 986da7f033dSHerbert Xu q[template[i].tap[k]] = 0; 987da7f033dSHerbert Xu 988da7f033dSHerbert Xu sg_set_buf(&sg[k], q, template[i].tap[k]); 98908d6af8cSJussi Kivilinna if (diff_dst) { 99008d6af8cSJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 99108d6af8cSJussi Kivilinna offset_in_page(IDX[k]); 99208d6af8cSJussi Kivilinna 99308d6af8cSJussi Kivilinna sg_set_buf(&sgout[k], q, 99408d6af8cSJussi Kivilinna template[i].tap[k]); 99508d6af8cSJussi Kivilinna 99608d6af8cSJussi Kivilinna memset(q, 0, template[i].tap[k]); 99708d6af8cSJussi Kivilinna if (offset_in_page(q) + 99808d6af8cSJussi Kivilinna template[i].tap[k] < PAGE_SIZE) 99908d6af8cSJussi Kivilinna q[template[i].tap[k]] = 0; 100008d6af8cSJussi Kivilinna } 1001da7f033dSHerbert Xu 1002da7f033dSHerbert Xu temp += template[i].tap[k]; 1003da7f033dSHerbert Xu } 1004da7f033dSHerbert Xu 100508d6af8cSJussi Kivilinna ablkcipher_request_set_crypt(req, sg, 100608d6af8cSJussi Kivilinna (diff_dst) ? sgout : sg, 1007da7f033dSHerbert Xu template[i].ilen, iv); 1008da7f033dSHerbert Xu 1009da7f033dSHerbert Xu ret = enc ? 1010da7f033dSHerbert Xu crypto_ablkcipher_encrypt(req) : 1011da7f033dSHerbert Xu crypto_ablkcipher_decrypt(req); 1012da7f033dSHerbert Xu 1013da7f033dSHerbert Xu switch (ret) { 1014da7f033dSHerbert Xu case 0: 1015da7f033dSHerbert Xu break; 1016da7f033dSHerbert Xu case -EINPROGRESS: 1017da7f033dSHerbert Xu case -EBUSY: 1018da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 1019da7f033dSHerbert Xu &result.completion); 1020da7f033dSHerbert Xu if (!ret && !((ret = result.err))) { 1021da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 1022da7f033dSHerbert Xu break; 1023da7f033dSHerbert Xu } 1024da7f033dSHerbert Xu /* fall through */ 1025da7f033dSHerbert Xu default: 102608d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n", 102708d6af8cSJussi Kivilinna d, e, j, algo, -ret); 1028da7f033dSHerbert Xu goto out; 1029da7f033dSHerbert Xu } 1030da7f033dSHerbert Xu 1031da7f033dSHerbert Xu temp = 0; 1032da7f033dSHerbert Xu ret = -EINVAL; 1033da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 103408d6af8cSJussi Kivilinna if (diff_dst) 103508d6af8cSJussi Kivilinna q = xoutbuf[IDX[k] >> PAGE_SHIFT] + 103608d6af8cSJussi Kivilinna offset_in_page(IDX[k]); 103708d6af8cSJussi Kivilinna else 1038da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 1039da7f033dSHerbert Xu offset_in_page(IDX[k]); 1040da7f033dSHerbert Xu 1041da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, 1042da7f033dSHerbert Xu template[i].tap[k])) { 104308d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n", 104408d6af8cSJussi Kivilinna d, j, e, k, algo); 1045da7f033dSHerbert Xu hexdump(q, template[i].tap[k]); 1046da7f033dSHerbert Xu goto out; 1047da7f033dSHerbert Xu } 1048da7f033dSHerbert Xu 1049da7f033dSHerbert Xu q += template[i].tap[k]; 1050da7f033dSHerbert Xu for (n = 0; offset_in_page(q + n) && q[n]; n++) 1051da7f033dSHerbert Xu ; 1052da7f033dSHerbert Xu if (n) { 105308d6af8cSJussi Kivilinna pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n", 105408d6af8cSJussi Kivilinna d, j, e, k, algo, n); 1055da7f033dSHerbert Xu hexdump(q, n); 1056da7f033dSHerbert Xu goto out; 1057da7f033dSHerbert Xu } 1058da7f033dSHerbert Xu temp += template[i].tap[k]; 1059da7f033dSHerbert Xu } 1060da7f033dSHerbert Xu } 1061da7f033dSHerbert Xu } 1062da7f033dSHerbert Xu 1063da7f033dSHerbert Xu ret = 0; 1064da7f033dSHerbert Xu 1065da7f033dSHerbert Xu out: 1066da7f033dSHerbert Xu ablkcipher_request_free(req); 106708d6af8cSJussi Kivilinna if (diff_dst) 106808d6af8cSJussi Kivilinna testmgr_free_buf(xoutbuf); 106908d6af8cSJussi Kivilinna out_nooutbuf: 1070f8b0d4d0SHerbert Xu testmgr_free_buf(xbuf); 1071f8b0d4d0SHerbert Xu out_nobuf: 1072da7f033dSHerbert Xu return ret; 1073da7f033dSHerbert Xu } 1074da7f033dSHerbert Xu 107508d6af8cSJussi Kivilinna static int test_skcipher(struct crypto_ablkcipher *tfm, int enc, 107608d6af8cSJussi Kivilinna struct cipher_testvec *template, unsigned int tcount) 107708d6af8cSJussi Kivilinna { 107808d6af8cSJussi Kivilinna int ret; 107908d6af8cSJussi Kivilinna 108008d6af8cSJussi Kivilinna /* test 'dst == src' case */ 108108d6af8cSJussi Kivilinna ret = __test_skcipher(tfm, enc, template, tcount, false); 108208d6af8cSJussi Kivilinna if (ret) 108308d6af8cSJussi Kivilinna return ret; 108408d6af8cSJussi Kivilinna 108508d6af8cSJussi Kivilinna /* test 'dst != src' case */ 108608d6af8cSJussi Kivilinna return __test_skcipher(tfm, enc, template, tcount, true); 108708d6af8cSJussi Kivilinna } 108808d6af8cSJussi Kivilinna 1089da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate, 1090da7f033dSHerbert Xu struct comp_testvec *dtemplate, int ctcount, int dtcount) 1091da7f033dSHerbert Xu { 1092da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm)); 1093da7f033dSHerbert Xu unsigned int i; 1094da7f033dSHerbert Xu char result[COMP_BUF_SIZE]; 1095da7f033dSHerbert Xu int ret; 1096da7f033dSHerbert Xu 1097da7f033dSHerbert Xu for (i = 0; i < ctcount; i++) { 1098c79cf910SGeert Uytterhoeven int ilen; 1099c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 1100da7f033dSHerbert Xu 1101da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 1102da7f033dSHerbert Xu 1103da7f033dSHerbert Xu ilen = ctemplate[i].inlen; 1104da7f033dSHerbert Xu ret = crypto_comp_compress(tfm, ctemplate[i].input, 1105da7f033dSHerbert Xu ilen, result, &dlen); 1106da7f033dSHerbert Xu if (ret) { 1107da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: compression failed " 1108da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1109da7f033dSHerbert Xu -ret); 1110da7f033dSHerbert Xu goto out; 1111da7f033dSHerbert Xu } 1112da7f033dSHerbert Xu 1113b812eb00SGeert Uytterhoeven if (dlen != ctemplate[i].outlen) { 1114b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Compression test %d " 1115b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1116b812eb00SGeert Uytterhoeven dlen); 1117b812eb00SGeert Uytterhoeven ret = -EINVAL; 1118b812eb00SGeert Uytterhoeven goto out; 1119b812eb00SGeert Uytterhoeven } 1120b812eb00SGeert Uytterhoeven 1121da7f033dSHerbert Xu if (memcmp(result, ctemplate[i].output, dlen)) { 1122da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Compression test %d " 1123da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 1124da7f033dSHerbert Xu hexdump(result, dlen); 1125da7f033dSHerbert Xu ret = -EINVAL; 1126da7f033dSHerbert Xu goto out; 1127da7f033dSHerbert Xu } 1128da7f033dSHerbert Xu } 1129da7f033dSHerbert Xu 1130da7f033dSHerbert Xu for (i = 0; i < dtcount; i++) { 1131c79cf910SGeert Uytterhoeven int ilen; 1132c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 1133da7f033dSHerbert Xu 1134da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 1135da7f033dSHerbert Xu 1136da7f033dSHerbert Xu ilen = dtemplate[i].inlen; 1137da7f033dSHerbert Xu ret = crypto_comp_decompress(tfm, dtemplate[i].input, 1138da7f033dSHerbert Xu ilen, result, &dlen); 1139da7f033dSHerbert Xu if (ret) { 1140da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: decompression failed " 1141da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 1142da7f033dSHerbert Xu -ret); 1143da7f033dSHerbert Xu goto out; 1144da7f033dSHerbert Xu } 1145da7f033dSHerbert Xu 1146b812eb00SGeert Uytterhoeven if (dlen != dtemplate[i].outlen) { 1147b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Decompression test %d " 1148b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 1149b812eb00SGeert Uytterhoeven dlen); 1150b812eb00SGeert Uytterhoeven ret = -EINVAL; 1151b812eb00SGeert Uytterhoeven goto out; 1152b812eb00SGeert Uytterhoeven } 1153b812eb00SGeert Uytterhoeven 1154da7f033dSHerbert Xu if (memcmp(result, dtemplate[i].output, dlen)) { 1155da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Decompression test %d " 1156da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 1157da7f033dSHerbert Xu hexdump(result, dlen); 1158da7f033dSHerbert Xu ret = -EINVAL; 1159da7f033dSHerbert Xu goto out; 1160da7f033dSHerbert Xu } 1161da7f033dSHerbert Xu } 1162da7f033dSHerbert Xu 1163da7f033dSHerbert Xu ret = 0; 1164da7f033dSHerbert Xu 1165da7f033dSHerbert Xu out: 1166da7f033dSHerbert Xu return ret; 1167da7f033dSHerbert Xu } 1168da7f033dSHerbert Xu 11698064efb8SGeert Uytterhoeven static int test_pcomp(struct crypto_pcomp *tfm, 11708064efb8SGeert Uytterhoeven struct pcomp_testvec *ctemplate, 11718064efb8SGeert Uytterhoeven struct pcomp_testvec *dtemplate, int ctcount, 11728064efb8SGeert Uytterhoeven int dtcount) 11738064efb8SGeert Uytterhoeven { 11748064efb8SGeert Uytterhoeven const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm)); 11758064efb8SGeert Uytterhoeven unsigned int i; 11768064efb8SGeert Uytterhoeven char result[COMP_BUF_SIZE]; 11773ce858cbSGeert Uytterhoeven int res; 11788064efb8SGeert Uytterhoeven 11798064efb8SGeert Uytterhoeven for (i = 0; i < ctcount; i++) { 11808064efb8SGeert Uytterhoeven struct comp_request req; 11813ce858cbSGeert Uytterhoeven unsigned int produced = 0; 11828064efb8SGeert Uytterhoeven 11833ce858cbSGeert Uytterhoeven res = crypto_compress_setup(tfm, ctemplate[i].params, 11848064efb8SGeert Uytterhoeven ctemplate[i].paramsize); 11853ce858cbSGeert Uytterhoeven if (res) { 11868064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression setup failed on test " 11873ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 11883ce858cbSGeert Uytterhoeven return res; 11898064efb8SGeert Uytterhoeven } 11908064efb8SGeert Uytterhoeven 11913ce858cbSGeert Uytterhoeven res = crypto_compress_init(tfm); 11923ce858cbSGeert Uytterhoeven if (res) { 11938064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression init failed on test " 11943ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 11953ce858cbSGeert Uytterhoeven return res; 11968064efb8SGeert Uytterhoeven } 11978064efb8SGeert Uytterhoeven 11988064efb8SGeert Uytterhoeven memset(result, 0, sizeof(result)); 11998064efb8SGeert Uytterhoeven 12008064efb8SGeert Uytterhoeven req.next_in = ctemplate[i].input; 12018064efb8SGeert Uytterhoeven req.avail_in = ctemplate[i].inlen / 2; 12028064efb8SGeert Uytterhoeven req.next_out = result; 12038064efb8SGeert Uytterhoeven req.avail_out = ctemplate[i].outlen / 2; 12048064efb8SGeert Uytterhoeven 12053ce858cbSGeert Uytterhoeven res = crypto_compress_update(tfm, &req); 12063ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 12078064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression update failed on test " 12083ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 12093ce858cbSGeert Uytterhoeven return res; 12108064efb8SGeert Uytterhoeven } 12113ce858cbSGeert Uytterhoeven if (res > 0) 12123ce858cbSGeert Uytterhoeven produced += res; 12138064efb8SGeert Uytterhoeven 12148064efb8SGeert Uytterhoeven /* Add remaining input data */ 12158064efb8SGeert Uytterhoeven req.avail_in += (ctemplate[i].inlen + 1) / 2; 12168064efb8SGeert Uytterhoeven 12173ce858cbSGeert Uytterhoeven res = crypto_compress_update(tfm, &req); 12183ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 12198064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression update failed on test " 12203ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 12213ce858cbSGeert Uytterhoeven return res; 12228064efb8SGeert Uytterhoeven } 12233ce858cbSGeert Uytterhoeven if (res > 0) 12243ce858cbSGeert Uytterhoeven produced += res; 12258064efb8SGeert Uytterhoeven 12268064efb8SGeert Uytterhoeven /* Provide remaining output space */ 12278064efb8SGeert Uytterhoeven req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2; 12288064efb8SGeert Uytterhoeven 12293ce858cbSGeert Uytterhoeven res = crypto_compress_final(tfm, &req); 12303ce858cbSGeert Uytterhoeven if (res < 0) { 12318064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression final failed on test " 12323ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 12333ce858cbSGeert Uytterhoeven return res; 12348064efb8SGeert Uytterhoeven } 12353ce858cbSGeert Uytterhoeven produced += res; 12368064efb8SGeert Uytterhoeven 12378064efb8SGeert Uytterhoeven if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) { 12388064efb8SGeert Uytterhoeven pr_err("alg: comp: Compression test %d failed for %s: " 12398064efb8SGeert Uytterhoeven "output len = %d (expected %d)\n", i + 1, algo, 12408064efb8SGeert Uytterhoeven COMP_BUF_SIZE - req.avail_out, 12418064efb8SGeert Uytterhoeven ctemplate[i].outlen); 12428064efb8SGeert Uytterhoeven return -EINVAL; 12438064efb8SGeert Uytterhoeven } 12448064efb8SGeert Uytterhoeven 12453ce858cbSGeert Uytterhoeven if (produced != ctemplate[i].outlen) { 12463ce858cbSGeert Uytterhoeven pr_err("alg: comp: Compression test %d failed for %s: " 12473ce858cbSGeert Uytterhoeven "returned len = %u (expected %d)\n", i + 1, 12483ce858cbSGeert Uytterhoeven algo, produced, ctemplate[i].outlen); 12493ce858cbSGeert Uytterhoeven return -EINVAL; 12503ce858cbSGeert Uytterhoeven } 12513ce858cbSGeert Uytterhoeven 12528064efb8SGeert Uytterhoeven if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) { 12538064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Compression test %d failed for " 12548064efb8SGeert Uytterhoeven "%s\n", i + 1, algo); 12558064efb8SGeert Uytterhoeven hexdump(result, ctemplate[i].outlen); 12568064efb8SGeert Uytterhoeven return -EINVAL; 12578064efb8SGeert Uytterhoeven } 12588064efb8SGeert Uytterhoeven } 12598064efb8SGeert Uytterhoeven 12608064efb8SGeert Uytterhoeven for (i = 0; i < dtcount; i++) { 12618064efb8SGeert Uytterhoeven struct comp_request req; 12623ce858cbSGeert Uytterhoeven unsigned int produced = 0; 12638064efb8SGeert Uytterhoeven 12643ce858cbSGeert Uytterhoeven res = crypto_decompress_setup(tfm, dtemplate[i].params, 12658064efb8SGeert Uytterhoeven dtemplate[i].paramsize); 12663ce858cbSGeert Uytterhoeven if (res) { 12678064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression setup failed on " 12683ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 12693ce858cbSGeert Uytterhoeven return res; 12708064efb8SGeert Uytterhoeven } 12718064efb8SGeert Uytterhoeven 12723ce858cbSGeert Uytterhoeven res = crypto_decompress_init(tfm); 12733ce858cbSGeert Uytterhoeven if (res) { 12748064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression init failed on test " 12753ce858cbSGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, res); 12763ce858cbSGeert Uytterhoeven return res; 12778064efb8SGeert Uytterhoeven } 12788064efb8SGeert Uytterhoeven 12798064efb8SGeert Uytterhoeven memset(result, 0, sizeof(result)); 12808064efb8SGeert Uytterhoeven 12818064efb8SGeert Uytterhoeven req.next_in = dtemplate[i].input; 12828064efb8SGeert Uytterhoeven req.avail_in = dtemplate[i].inlen / 2; 12838064efb8SGeert Uytterhoeven req.next_out = result; 12848064efb8SGeert Uytterhoeven req.avail_out = dtemplate[i].outlen / 2; 12858064efb8SGeert Uytterhoeven 12863ce858cbSGeert Uytterhoeven res = crypto_decompress_update(tfm, &req); 12873ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 12888064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression update failed on " 12893ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 12903ce858cbSGeert Uytterhoeven return res; 12918064efb8SGeert Uytterhoeven } 12923ce858cbSGeert Uytterhoeven if (res > 0) 12933ce858cbSGeert Uytterhoeven produced += res; 12948064efb8SGeert Uytterhoeven 12958064efb8SGeert Uytterhoeven /* Add remaining input data */ 12968064efb8SGeert Uytterhoeven req.avail_in += (dtemplate[i].inlen + 1) / 2; 12978064efb8SGeert Uytterhoeven 12983ce858cbSGeert Uytterhoeven res = crypto_decompress_update(tfm, &req); 12993ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 13008064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression update failed on " 13013ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 13023ce858cbSGeert Uytterhoeven return res; 13038064efb8SGeert Uytterhoeven } 13043ce858cbSGeert Uytterhoeven if (res > 0) 13053ce858cbSGeert Uytterhoeven produced += res; 13068064efb8SGeert Uytterhoeven 13078064efb8SGeert Uytterhoeven /* Provide remaining output space */ 13088064efb8SGeert Uytterhoeven req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2; 13098064efb8SGeert Uytterhoeven 13103ce858cbSGeert Uytterhoeven res = crypto_decompress_final(tfm, &req); 13113ce858cbSGeert Uytterhoeven if (res < 0 && (res != -EAGAIN || req.avail_in)) { 13128064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression final failed on " 13133ce858cbSGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, res); 13143ce858cbSGeert Uytterhoeven return res; 13158064efb8SGeert Uytterhoeven } 13163ce858cbSGeert Uytterhoeven if (res > 0) 13173ce858cbSGeert Uytterhoeven produced += res; 13188064efb8SGeert Uytterhoeven 13198064efb8SGeert Uytterhoeven if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) { 13208064efb8SGeert Uytterhoeven pr_err("alg: comp: Decompression test %d failed for " 13218064efb8SGeert Uytterhoeven "%s: output len = %d (expected %d)\n", i + 1, 13228064efb8SGeert Uytterhoeven algo, COMP_BUF_SIZE - req.avail_out, 13238064efb8SGeert Uytterhoeven dtemplate[i].outlen); 13248064efb8SGeert Uytterhoeven return -EINVAL; 13258064efb8SGeert Uytterhoeven } 13268064efb8SGeert Uytterhoeven 13273ce858cbSGeert Uytterhoeven if (produced != dtemplate[i].outlen) { 13283ce858cbSGeert Uytterhoeven pr_err("alg: comp: Decompression test %d failed for " 13293ce858cbSGeert Uytterhoeven "%s: returned len = %u (expected %d)\n", i + 1, 13303ce858cbSGeert Uytterhoeven algo, produced, dtemplate[i].outlen); 13313ce858cbSGeert Uytterhoeven return -EINVAL; 13323ce858cbSGeert Uytterhoeven } 13333ce858cbSGeert Uytterhoeven 13348064efb8SGeert Uytterhoeven if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) { 13358064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Decompression test %d failed for " 13368064efb8SGeert Uytterhoeven "%s\n", i + 1, algo); 13378064efb8SGeert Uytterhoeven hexdump(result, dtemplate[i].outlen); 13388064efb8SGeert Uytterhoeven return -EINVAL; 13398064efb8SGeert Uytterhoeven } 13408064efb8SGeert Uytterhoeven } 13418064efb8SGeert Uytterhoeven 13428064efb8SGeert Uytterhoeven return 0; 13438064efb8SGeert Uytterhoeven } 13448064efb8SGeert Uytterhoeven 13457647d6ceSJarod Wilson 13467647d6ceSJarod Wilson static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template, 13477647d6ceSJarod Wilson unsigned int tcount) 13487647d6ceSJarod Wilson { 13497647d6ceSJarod Wilson const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm)); 1350fa4ef8a6SFelipe Contreras int err = 0, i, j, seedsize; 13517647d6ceSJarod Wilson u8 *seed; 13527647d6ceSJarod Wilson char result[32]; 13537647d6ceSJarod Wilson 13547647d6ceSJarod Wilson seedsize = crypto_rng_seedsize(tfm); 13557647d6ceSJarod Wilson 13567647d6ceSJarod Wilson seed = kmalloc(seedsize, GFP_KERNEL); 13577647d6ceSJarod Wilson if (!seed) { 13587647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to allocate seed space " 13597647d6ceSJarod Wilson "for %s\n", algo); 13607647d6ceSJarod Wilson return -ENOMEM; 13617647d6ceSJarod Wilson } 13627647d6ceSJarod Wilson 13637647d6ceSJarod Wilson for (i = 0; i < tcount; i++) { 13647647d6ceSJarod Wilson memset(result, 0, 32); 13657647d6ceSJarod Wilson 13667647d6ceSJarod Wilson memcpy(seed, template[i].v, template[i].vlen); 13677647d6ceSJarod Wilson memcpy(seed + template[i].vlen, template[i].key, 13687647d6ceSJarod Wilson template[i].klen); 13697647d6ceSJarod Wilson memcpy(seed + template[i].vlen + template[i].klen, 13707647d6ceSJarod Wilson template[i].dt, template[i].dtlen); 13717647d6ceSJarod Wilson 13727647d6ceSJarod Wilson err = crypto_rng_reset(tfm, seed, seedsize); 13737647d6ceSJarod Wilson if (err) { 13747647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to reset rng " 13757647d6ceSJarod Wilson "for %s\n", algo); 13767647d6ceSJarod Wilson goto out; 13777647d6ceSJarod Wilson } 13787647d6ceSJarod Wilson 13797647d6ceSJarod Wilson for (j = 0; j < template[i].loops; j++) { 13807647d6ceSJarod Wilson err = crypto_rng_get_bytes(tfm, result, 13817647d6ceSJarod Wilson template[i].rlen); 13827647d6ceSJarod Wilson if (err != template[i].rlen) { 13837647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to obtain " 13847647d6ceSJarod Wilson "the correct amount of random data for " 13857647d6ceSJarod Wilson "%s (requested %d, got %d)\n", algo, 13867647d6ceSJarod Wilson template[i].rlen, err); 13877647d6ceSJarod Wilson goto out; 13887647d6ceSJarod Wilson } 13897647d6ceSJarod Wilson } 13907647d6ceSJarod Wilson 13917647d6ceSJarod Wilson err = memcmp(result, template[i].result, 13927647d6ceSJarod Wilson template[i].rlen); 13937647d6ceSJarod Wilson if (err) { 13947647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Test %d failed for %s\n", 13957647d6ceSJarod Wilson i, algo); 13967647d6ceSJarod Wilson hexdump(result, template[i].rlen); 13977647d6ceSJarod Wilson err = -EINVAL; 13987647d6ceSJarod Wilson goto out; 13997647d6ceSJarod Wilson } 14007647d6ceSJarod Wilson } 14017647d6ceSJarod Wilson 14027647d6ceSJarod Wilson out: 14037647d6ceSJarod Wilson kfree(seed); 14047647d6ceSJarod Wilson return err; 14057647d6ceSJarod Wilson } 14067647d6ceSJarod Wilson 1407da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver, 1408da7f033dSHerbert Xu u32 type, u32 mask) 1409da7f033dSHerbert Xu { 1410da7f033dSHerbert Xu struct crypto_aead *tfm; 1411da7f033dSHerbert Xu int err = 0; 1412da7f033dSHerbert Xu 1413da7f033dSHerbert Xu tfm = crypto_alloc_aead(driver, type, mask); 1414da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1415da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to load transform for %s: " 1416da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1417da7f033dSHerbert Xu return PTR_ERR(tfm); 1418da7f033dSHerbert Xu } 1419da7f033dSHerbert Xu 1420da7f033dSHerbert Xu if (desc->suite.aead.enc.vecs) { 1421da7f033dSHerbert Xu err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs, 1422da7f033dSHerbert Xu desc->suite.aead.enc.count); 1423da7f033dSHerbert Xu if (err) 1424da7f033dSHerbert Xu goto out; 1425da7f033dSHerbert Xu } 1426da7f033dSHerbert Xu 1427da7f033dSHerbert Xu if (!err && desc->suite.aead.dec.vecs) 1428da7f033dSHerbert Xu err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs, 1429da7f033dSHerbert Xu desc->suite.aead.dec.count); 1430da7f033dSHerbert Xu 1431da7f033dSHerbert Xu out: 1432da7f033dSHerbert Xu crypto_free_aead(tfm); 1433da7f033dSHerbert Xu return err; 1434da7f033dSHerbert Xu } 1435da7f033dSHerbert Xu 1436da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc, 1437da7f033dSHerbert Xu const char *driver, u32 type, u32 mask) 1438da7f033dSHerbert Xu { 14391aa4ecd9SHerbert Xu struct crypto_cipher *tfm; 1440da7f033dSHerbert Xu int err = 0; 1441da7f033dSHerbert Xu 14421aa4ecd9SHerbert Xu tfm = crypto_alloc_cipher(driver, type, mask); 1443da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1444da7f033dSHerbert Xu printk(KERN_ERR "alg: cipher: Failed to load transform for " 1445da7f033dSHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 1446da7f033dSHerbert Xu return PTR_ERR(tfm); 1447da7f033dSHerbert Xu } 1448da7f033dSHerbert Xu 1449da7f033dSHerbert Xu if (desc->suite.cipher.enc.vecs) { 1450da7f033dSHerbert Xu err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 1451da7f033dSHerbert Xu desc->suite.cipher.enc.count); 1452da7f033dSHerbert Xu if (err) 1453da7f033dSHerbert Xu goto out; 1454da7f033dSHerbert Xu } 1455da7f033dSHerbert Xu 1456da7f033dSHerbert Xu if (desc->suite.cipher.dec.vecs) 1457da7f033dSHerbert Xu err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 1458da7f033dSHerbert Xu desc->suite.cipher.dec.count); 1459da7f033dSHerbert Xu 1460da7f033dSHerbert Xu out: 14611aa4ecd9SHerbert Xu crypto_free_cipher(tfm); 14621aa4ecd9SHerbert Xu return err; 14631aa4ecd9SHerbert Xu } 14641aa4ecd9SHerbert Xu 14651aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc, 14661aa4ecd9SHerbert Xu const char *driver, u32 type, u32 mask) 14671aa4ecd9SHerbert Xu { 14681aa4ecd9SHerbert Xu struct crypto_ablkcipher *tfm; 14691aa4ecd9SHerbert Xu int err = 0; 14701aa4ecd9SHerbert Xu 14711aa4ecd9SHerbert Xu tfm = crypto_alloc_ablkcipher(driver, type, mask); 14721aa4ecd9SHerbert Xu if (IS_ERR(tfm)) { 14731aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Failed to load transform for " 14741aa4ecd9SHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 14751aa4ecd9SHerbert Xu return PTR_ERR(tfm); 14761aa4ecd9SHerbert Xu } 14771aa4ecd9SHerbert Xu 14781aa4ecd9SHerbert Xu if (desc->suite.cipher.enc.vecs) { 14791aa4ecd9SHerbert Xu err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 14801aa4ecd9SHerbert Xu desc->suite.cipher.enc.count); 14811aa4ecd9SHerbert Xu if (err) 14821aa4ecd9SHerbert Xu goto out; 14831aa4ecd9SHerbert Xu } 14841aa4ecd9SHerbert Xu 14851aa4ecd9SHerbert Xu if (desc->suite.cipher.dec.vecs) 14861aa4ecd9SHerbert Xu err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 14871aa4ecd9SHerbert Xu desc->suite.cipher.dec.count); 14881aa4ecd9SHerbert Xu 14891aa4ecd9SHerbert Xu out: 1490da7f033dSHerbert Xu crypto_free_ablkcipher(tfm); 1491da7f033dSHerbert Xu return err; 1492da7f033dSHerbert Xu } 1493da7f033dSHerbert Xu 1494da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver, 1495da7f033dSHerbert Xu u32 type, u32 mask) 1496da7f033dSHerbert Xu { 1497da7f033dSHerbert Xu struct crypto_comp *tfm; 1498da7f033dSHerbert Xu int err; 1499da7f033dSHerbert Xu 1500da7f033dSHerbert Xu tfm = crypto_alloc_comp(driver, type, mask); 1501da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1502da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Failed to load transform for %s: " 1503da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1504da7f033dSHerbert Xu return PTR_ERR(tfm); 1505da7f033dSHerbert Xu } 1506da7f033dSHerbert Xu 1507da7f033dSHerbert Xu err = test_comp(tfm, desc->suite.comp.comp.vecs, 1508da7f033dSHerbert Xu desc->suite.comp.decomp.vecs, 1509da7f033dSHerbert Xu desc->suite.comp.comp.count, 1510da7f033dSHerbert Xu desc->suite.comp.decomp.count); 1511da7f033dSHerbert Xu 1512da7f033dSHerbert Xu crypto_free_comp(tfm); 1513da7f033dSHerbert Xu return err; 1514da7f033dSHerbert Xu } 1515da7f033dSHerbert Xu 15168064efb8SGeert Uytterhoeven static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver, 15178064efb8SGeert Uytterhoeven u32 type, u32 mask) 15188064efb8SGeert Uytterhoeven { 15198064efb8SGeert Uytterhoeven struct crypto_pcomp *tfm; 15208064efb8SGeert Uytterhoeven int err; 15218064efb8SGeert Uytterhoeven 15228064efb8SGeert Uytterhoeven tfm = crypto_alloc_pcomp(driver, type, mask); 15238064efb8SGeert Uytterhoeven if (IS_ERR(tfm)) { 15248064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Failed to load transform for %s: %ld\n", 15258064efb8SGeert Uytterhoeven driver, PTR_ERR(tfm)); 15268064efb8SGeert Uytterhoeven return PTR_ERR(tfm); 15278064efb8SGeert Uytterhoeven } 15288064efb8SGeert Uytterhoeven 15298064efb8SGeert Uytterhoeven err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs, 15308064efb8SGeert Uytterhoeven desc->suite.pcomp.decomp.vecs, 15318064efb8SGeert Uytterhoeven desc->suite.pcomp.comp.count, 15328064efb8SGeert Uytterhoeven desc->suite.pcomp.decomp.count); 15338064efb8SGeert Uytterhoeven 15348064efb8SGeert Uytterhoeven crypto_free_pcomp(tfm); 15358064efb8SGeert Uytterhoeven return err; 15368064efb8SGeert Uytterhoeven } 15378064efb8SGeert Uytterhoeven 1538da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver, 1539da7f033dSHerbert Xu u32 type, u32 mask) 1540da7f033dSHerbert Xu { 1541da7f033dSHerbert Xu struct crypto_ahash *tfm; 1542da7f033dSHerbert Xu int err; 1543da7f033dSHerbert Xu 1544da7f033dSHerbert Xu tfm = crypto_alloc_ahash(driver, type, mask); 1545da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1546da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to load transform for %s: " 1547da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1548da7f033dSHerbert Xu return PTR_ERR(tfm); 1549da7f033dSHerbert Xu } 1550da7f033dSHerbert Xu 1551a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1552a8f1a052SDavid S. Miller desc->suite.hash.count, true); 1553a8f1a052SDavid S. Miller if (!err) 1554a8f1a052SDavid S. Miller err = test_hash(tfm, desc->suite.hash.vecs, 1555a8f1a052SDavid S. Miller desc->suite.hash.count, false); 1556da7f033dSHerbert Xu 1557da7f033dSHerbert Xu crypto_free_ahash(tfm); 1558da7f033dSHerbert Xu return err; 1559da7f033dSHerbert Xu } 1560da7f033dSHerbert Xu 15618e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc, 15628e3ee85eSHerbert Xu const char *driver, u32 type, u32 mask) 15638e3ee85eSHerbert Xu { 15648e3ee85eSHerbert Xu struct crypto_shash *tfm; 15658e3ee85eSHerbert Xu u32 val; 15668e3ee85eSHerbert Xu int err; 15678e3ee85eSHerbert Xu 15688e3ee85eSHerbert Xu err = alg_test_hash(desc, driver, type, mask); 15698e3ee85eSHerbert Xu if (err) 15708e3ee85eSHerbert Xu goto out; 15718e3ee85eSHerbert Xu 15728e3ee85eSHerbert Xu tfm = crypto_alloc_shash(driver, type, mask); 15738e3ee85eSHerbert Xu if (IS_ERR(tfm)) { 15748e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: " 15758e3ee85eSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 15768e3ee85eSHerbert Xu err = PTR_ERR(tfm); 15778e3ee85eSHerbert Xu goto out; 15788e3ee85eSHerbert Xu } 15798e3ee85eSHerbert Xu 15808e3ee85eSHerbert Xu do { 15818e3ee85eSHerbert Xu struct { 15828e3ee85eSHerbert Xu struct shash_desc shash; 15838e3ee85eSHerbert Xu char ctx[crypto_shash_descsize(tfm)]; 15848e3ee85eSHerbert Xu } sdesc; 15858e3ee85eSHerbert Xu 15868e3ee85eSHerbert Xu sdesc.shash.tfm = tfm; 15878e3ee85eSHerbert Xu sdesc.shash.flags = 0; 15888e3ee85eSHerbert Xu 15898e3ee85eSHerbert Xu *(u32 *)sdesc.ctx = le32_to_cpu(420553207); 15908e3ee85eSHerbert Xu err = crypto_shash_final(&sdesc.shash, (u8 *)&val); 15918e3ee85eSHerbert Xu if (err) { 15928e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Operation failed for " 15938e3ee85eSHerbert Xu "%s: %d\n", driver, err); 15948e3ee85eSHerbert Xu break; 15958e3ee85eSHerbert Xu } 15968e3ee85eSHerbert Xu 15978e3ee85eSHerbert Xu if (val != ~420553207) { 15988e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Test failed for %s: " 15998e3ee85eSHerbert Xu "%d\n", driver, val); 16008e3ee85eSHerbert Xu err = -EINVAL; 16018e3ee85eSHerbert Xu } 16028e3ee85eSHerbert Xu } while (0); 16038e3ee85eSHerbert Xu 16048e3ee85eSHerbert Xu crypto_free_shash(tfm); 16058e3ee85eSHerbert Xu 16068e3ee85eSHerbert Xu out: 16078e3ee85eSHerbert Xu return err; 16088e3ee85eSHerbert Xu } 16098e3ee85eSHerbert Xu 16107647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver, 16117647d6ceSJarod Wilson u32 type, u32 mask) 16127647d6ceSJarod Wilson { 16137647d6ceSJarod Wilson struct crypto_rng *rng; 16147647d6ceSJarod Wilson int err; 16157647d6ceSJarod Wilson 16167647d6ceSJarod Wilson rng = crypto_alloc_rng(driver, type, mask); 16177647d6ceSJarod Wilson if (IS_ERR(rng)) { 16187647d6ceSJarod Wilson printk(KERN_ERR "alg: cprng: Failed to load transform for %s: " 16197647d6ceSJarod Wilson "%ld\n", driver, PTR_ERR(rng)); 16207647d6ceSJarod Wilson return PTR_ERR(rng); 16217647d6ceSJarod Wilson } 16227647d6ceSJarod Wilson 16237647d6ceSJarod Wilson err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count); 16247647d6ceSJarod Wilson 16257647d6ceSJarod Wilson crypto_free_rng(rng); 16267647d6ceSJarod Wilson 16277647d6ceSJarod Wilson return err; 16287647d6ceSJarod Wilson } 16297647d6ceSJarod Wilson 1630863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc, 1631863b557aSYouquan, Song const char *driver, u32 type, u32 mask) 1632863b557aSYouquan, Song { 1633863b557aSYouquan, Song return 0; 1634863b557aSYouquan, Song } 1635863b557aSYouquan, Song 1636da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */ 1637da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = { 1638da7f033dSHerbert Xu { 16394d6d6a2cSJohannes Goetzfried .alg = "__cbc-cast5-avx", 16404d6d6a2cSJohannes Goetzfried .test = alg_test_null, 16414d6d6a2cSJohannes Goetzfried }, { 16424ea1277dSJohannes Goetzfried .alg = "__cbc-cast6-avx", 16434ea1277dSJohannes Goetzfried .test = alg_test_null, 16444ea1277dSJohannes Goetzfried }, { 16457efe4076SJohannes Goetzfried .alg = "__cbc-serpent-avx", 16467efe4076SJohannes Goetzfried .test = alg_test_null, 16477efe4076SJohannes Goetzfried }, { 1648937c30d7SJussi Kivilinna .alg = "__cbc-serpent-sse2", 1649937c30d7SJussi Kivilinna .test = alg_test_null, 1650937c30d7SJussi Kivilinna }, { 1651107778b5SJohannes Goetzfried .alg = "__cbc-twofish-avx", 1652107778b5SJohannes Goetzfried .test = alg_test_null, 1653107778b5SJohannes Goetzfried }, { 1654863b557aSYouquan, Song .alg = "__driver-cbc-aes-aesni", 1655863b557aSYouquan, Song .test = alg_test_null, 16566c79294fSMilan Broz .fips_allowed = 1, 1657863b557aSYouquan, Song }, { 1658d9b1d2e7SJussi Kivilinna .alg = "__driver-cbc-camellia-aesni", 1659d9b1d2e7SJussi Kivilinna .test = alg_test_null, 1660d9b1d2e7SJussi Kivilinna }, { 16614d6d6a2cSJohannes Goetzfried .alg = "__driver-cbc-cast5-avx", 16624d6d6a2cSJohannes Goetzfried .test = alg_test_null, 16634d6d6a2cSJohannes Goetzfried }, { 16644ea1277dSJohannes Goetzfried .alg = "__driver-cbc-cast6-avx", 16654ea1277dSJohannes Goetzfried .test = alg_test_null, 16664ea1277dSJohannes Goetzfried }, { 16677efe4076SJohannes Goetzfried .alg = "__driver-cbc-serpent-avx", 16687efe4076SJohannes Goetzfried .test = alg_test_null, 16697efe4076SJohannes Goetzfried }, { 1670937c30d7SJussi Kivilinna .alg = "__driver-cbc-serpent-sse2", 1671937c30d7SJussi Kivilinna .test = alg_test_null, 1672937c30d7SJussi Kivilinna }, { 1673107778b5SJohannes Goetzfried .alg = "__driver-cbc-twofish-avx", 1674107778b5SJohannes Goetzfried .test = alg_test_null, 1675107778b5SJohannes Goetzfried }, { 1676863b557aSYouquan, Song .alg = "__driver-ecb-aes-aesni", 1677863b557aSYouquan, Song .test = alg_test_null, 16786c79294fSMilan Broz .fips_allowed = 1, 1679863b557aSYouquan, Song }, { 1680d9b1d2e7SJussi Kivilinna .alg = "__driver-ecb-camellia-aesni", 1681d9b1d2e7SJussi Kivilinna .test = alg_test_null, 1682d9b1d2e7SJussi Kivilinna }, { 16834d6d6a2cSJohannes Goetzfried .alg = "__driver-ecb-cast5-avx", 16844d6d6a2cSJohannes Goetzfried .test = alg_test_null, 16854d6d6a2cSJohannes Goetzfried }, { 16864ea1277dSJohannes Goetzfried .alg = "__driver-ecb-cast6-avx", 16874ea1277dSJohannes Goetzfried .test = alg_test_null, 16884ea1277dSJohannes Goetzfried }, { 16897efe4076SJohannes Goetzfried .alg = "__driver-ecb-serpent-avx", 16907efe4076SJohannes Goetzfried .test = alg_test_null, 16917efe4076SJohannes Goetzfried }, { 1692937c30d7SJussi Kivilinna .alg = "__driver-ecb-serpent-sse2", 1693937c30d7SJussi Kivilinna .test = alg_test_null, 1694937c30d7SJussi Kivilinna }, { 1695107778b5SJohannes Goetzfried .alg = "__driver-ecb-twofish-avx", 1696107778b5SJohannes Goetzfried .test = alg_test_null, 1697107778b5SJohannes Goetzfried }, { 1698863b557aSYouquan, Song .alg = "__ghash-pclmulqdqni", 1699863b557aSYouquan, Song .test = alg_test_null, 17006c79294fSMilan Broz .fips_allowed = 1, 1701863b557aSYouquan, Song }, { 1702e08ca2daSJarod Wilson .alg = "ansi_cprng", 1703e08ca2daSJarod Wilson .test = alg_test_cprng, 1704a1915d51SJarod Wilson .fips_allowed = 1, 1705e08ca2daSJarod Wilson .suite = { 1706e08ca2daSJarod Wilson .cprng = { 1707e08ca2daSJarod Wilson .vecs = ansi_cprng_aes_tv_template, 1708e08ca2daSJarod Wilson .count = ANSI_CPRNG_AES_TEST_VECTORS 1709e08ca2daSJarod Wilson } 1710e08ca2daSJarod Wilson } 1711e08ca2daSJarod Wilson }, { 1712e46e9a46SHoria Geanta .alg = "authenc(hmac(sha1),cbc(aes))", 1713e46e9a46SHoria Geanta .test = alg_test_aead, 1714e46e9a46SHoria Geanta .fips_allowed = 1, 1715e46e9a46SHoria Geanta .suite = { 1716e46e9a46SHoria Geanta .aead = { 1717e46e9a46SHoria Geanta .enc = { 1718e46e9a46SHoria Geanta .vecs = hmac_sha1_aes_cbc_enc_tv_template, 1719e46e9a46SHoria Geanta .count = HMAC_SHA1_AES_CBC_ENC_TEST_VECTORS 1720e46e9a46SHoria Geanta } 1721e46e9a46SHoria Geanta } 1722e46e9a46SHoria Geanta } 1723e46e9a46SHoria Geanta }, { 1724e46e9a46SHoria Geanta .alg = "authenc(hmac(sha256),cbc(aes))", 1725e46e9a46SHoria Geanta .test = alg_test_aead, 1726e46e9a46SHoria Geanta .fips_allowed = 1, 1727e46e9a46SHoria Geanta .suite = { 1728e46e9a46SHoria Geanta .aead = { 1729e46e9a46SHoria Geanta .enc = { 1730e46e9a46SHoria Geanta .vecs = hmac_sha256_aes_cbc_enc_tv_template, 1731e46e9a46SHoria Geanta .count = HMAC_SHA256_AES_CBC_ENC_TEST_VECTORS 1732e46e9a46SHoria Geanta } 1733e46e9a46SHoria Geanta } 1734e46e9a46SHoria Geanta } 1735e46e9a46SHoria Geanta }, { 1736e46e9a46SHoria Geanta .alg = "authenc(hmac(sha512),cbc(aes))", 1737e46e9a46SHoria Geanta .test = alg_test_aead, 1738e46e9a46SHoria Geanta .fips_allowed = 1, 1739e46e9a46SHoria Geanta .suite = { 1740e46e9a46SHoria Geanta .aead = { 1741e46e9a46SHoria Geanta .enc = { 1742e46e9a46SHoria Geanta .vecs = hmac_sha512_aes_cbc_enc_tv_template, 1743e46e9a46SHoria Geanta .count = HMAC_SHA512_AES_CBC_ENC_TEST_VECTORS 1744e46e9a46SHoria Geanta } 1745e46e9a46SHoria Geanta } 1746e46e9a46SHoria Geanta } 1747e46e9a46SHoria Geanta }, { 1748da7f033dSHerbert Xu .alg = "cbc(aes)", 17491aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1750a1915d51SJarod Wilson .fips_allowed = 1, 1751da7f033dSHerbert Xu .suite = { 1752da7f033dSHerbert Xu .cipher = { 1753da7f033dSHerbert Xu .enc = { 1754da7f033dSHerbert Xu .vecs = aes_cbc_enc_tv_template, 1755da7f033dSHerbert Xu .count = AES_CBC_ENC_TEST_VECTORS 1756da7f033dSHerbert Xu }, 1757da7f033dSHerbert Xu .dec = { 1758da7f033dSHerbert Xu .vecs = aes_cbc_dec_tv_template, 1759da7f033dSHerbert Xu .count = AES_CBC_DEC_TEST_VECTORS 1760da7f033dSHerbert Xu } 1761da7f033dSHerbert Xu } 1762da7f033dSHerbert Xu } 1763da7f033dSHerbert Xu }, { 1764da7f033dSHerbert Xu .alg = "cbc(anubis)", 17651aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1766da7f033dSHerbert Xu .suite = { 1767da7f033dSHerbert Xu .cipher = { 1768da7f033dSHerbert Xu .enc = { 1769da7f033dSHerbert Xu .vecs = anubis_cbc_enc_tv_template, 1770da7f033dSHerbert Xu .count = ANUBIS_CBC_ENC_TEST_VECTORS 1771da7f033dSHerbert Xu }, 1772da7f033dSHerbert Xu .dec = { 1773da7f033dSHerbert Xu .vecs = anubis_cbc_dec_tv_template, 1774da7f033dSHerbert Xu .count = ANUBIS_CBC_DEC_TEST_VECTORS 1775da7f033dSHerbert Xu } 1776da7f033dSHerbert Xu } 1777da7f033dSHerbert Xu } 1778da7f033dSHerbert Xu }, { 1779da7f033dSHerbert Xu .alg = "cbc(blowfish)", 17801aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1781da7f033dSHerbert Xu .suite = { 1782da7f033dSHerbert Xu .cipher = { 1783da7f033dSHerbert Xu .enc = { 1784da7f033dSHerbert Xu .vecs = bf_cbc_enc_tv_template, 1785da7f033dSHerbert Xu .count = BF_CBC_ENC_TEST_VECTORS 1786da7f033dSHerbert Xu }, 1787da7f033dSHerbert Xu .dec = { 1788da7f033dSHerbert Xu .vecs = bf_cbc_dec_tv_template, 1789da7f033dSHerbert Xu .count = BF_CBC_DEC_TEST_VECTORS 1790da7f033dSHerbert Xu } 1791da7f033dSHerbert Xu } 1792da7f033dSHerbert Xu } 1793da7f033dSHerbert Xu }, { 1794da7f033dSHerbert Xu .alg = "cbc(camellia)", 17951aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1796da7f033dSHerbert Xu .suite = { 1797da7f033dSHerbert Xu .cipher = { 1798da7f033dSHerbert Xu .enc = { 1799da7f033dSHerbert Xu .vecs = camellia_cbc_enc_tv_template, 1800da7f033dSHerbert Xu .count = CAMELLIA_CBC_ENC_TEST_VECTORS 1801da7f033dSHerbert Xu }, 1802da7f033dSHerbert Xu .dec = { 1803da7f033dSHerbert Xu .vecs = camellia_cbc_dec_tv_template, 1804da7f033dSHerbert Xu .count = CAMELLIA_CBC_DEC_TEST_VECTORS 1805da7f033dSHerbert Xu } 1806da7f033dSHerbert Xu } 1807da7f033dSHerbert Xu } 1808da7f033dSHerbert Xu }, { 1809a2c58260SJohannes Goetzfried .alg = "cbc(cast5)", 1810a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 1811a2c58260SJohannes Goetzfried .suite = { 1812a2c58260SJohannes Goetzfried .cipher = { 1813a2c58260SJohannes Goetzfried .enc = { 1814a2c58260SJohannes Goetzfried .vecs = cast5_cbc_enc_tv_template, 1815a2c58260SJohannes Goetzfried .count = CAST5_CBC_ENC_TEST_VECTORS 1816a2c58260SJohannes Goetzfried }, 1817a2c58260SJohannes Goetzfried .dec = { 1818a2c58260SJohannes Goetzfried .vecs = cast5_cbc_dec_tv_template, 1819a2c58260SJohannes Goetzfried .count = CAST5_CBC_DEC_TEST_VECTORS 1820a2c58260SJohannes Goetzfried } 1821a2c58260SJohannes Goetzfried } 1822a2c58260SJohannes Goetzfried } 1823a2c58260SJohannes Goetzfried }, { 18249b8b0405SJohannes Goetzfried .alg = "cbc(cast6)", 18259b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 18269b8b0405SJohannes Goetzfried .suite = { 18279b8b0405SJohannes Goetzfried .cipher = { 18289b8b0405SJohannes Goetzfried .enc = { 18299b8b0405SJohannes Goetzfried .vecs = cast6_cbc_enc_tv_template, 18309b8b0405SJohannes Goetzfried .count = CAST6_CBC_ENC_TEST_VECTORS 18319b8b0405SJohannes Goetzfried }, 18329b8b0405SJohannes Goetzfried .dec = { 18339b8b0405SJohannes Goetzfried .vecs = cast6_cbc_dec_tv_template, 18349b8b0405SJohannes Goetzfried .count = CAST6_CBC_DEC_TEST_VECTORS 18359b8b0405SJohannes Goetzfried } 18369b8b0405SJohannes Goetzfried } 18379b8b0405SJohannes Goetzfried } 18389b8b0405SJohannes Goetzfried }, { 1839da7f033dSHerbert Xu .alg = "cbc(des)", 18401aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1841da7f033dSHerbert Xu .suite = { 1842da7f033dSHerbert Xu .cipher = { 1843da7f033dSHerbert Xu .enc = { 1844da7f033dSHerbert Xu .vecs = des_cbc_enc_tv_template, 1845da7f033dSHerbert Xu .count = DES_CBC_ENC_TEST_VECTORS 1846da7f033dSHerbert Xu }, 1847da7f033dSHerbert Xu .dec = { 1848da7f033dSHerbert Xu .vecs = des_cbc_dec_tv_template, 1849da7f033dSHerbert Xu .count = DES_CBC_DEC_TEST_VECTORS 1850da7f033dSHerbert Xu } 1851da7f033dSHerbert Xu } 1852da7f033dSHerbert Xu } 1853da7f033dSHerbert Xu }, { 1854da7f033dSHerbert Xu .alg = "cbc(des3_ede)", 18551aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1856a1915d51SJarod Wilson .fips_allowed = 1, 1857da7f033dSHerbert Xu .suite = { 1858da7f033dSHerbert Xu .cipher = { 1859da7f033dSHerbert Xu .enc = { 1860da7f033dSHerbert Xu .vecs = des3_ede_cbc_enc_tv_template, 1861da7f033dSHerbert Xu .count = DES3_EDE_CBC_ENC_TEST_VECTORS 1862da7f033dSHerbert Xu }, 1863da7f033dSHerbert Xu .dec = { 1864da7f033dSHerbert Xu .vecs = des3_ede_cbc_dec_tv_template, 1865da7f033dSHerbert Xu .count = DES3_EDE_CBC_DEC_TEST_VECTORS 1866da7f033dSHerbert Xu } 1867da7f033dSHerbert Xu } 1868da7f033dSHerbert Xu } 1869da7f033dSHerbert Xu }, { 18709d25917dSJussi Kivilinna .alg = "cbc(serpent)", 18719d25917dSJussi Kivilinna .test = alg_test_skcipher, 18729d25917dSJussi Kivilinna .suite = { 18739d25917dSJussi Kivilinna .cipher = { 18749d25917dSJussi Kivilinna .enc = { 18759d25917dSJussi Kivilinna .vecs = serpent_cbc_enc_tv_template, 18769d25917dSJussi Kivilinna .count = SERPENT_CBC_ENC_TEST_VECTORS 18779d25917dSJussi Kivilinna }, 18789d25917dSJussi Kivilinna .dec = { 18799d25917dSJussi Kivilinna .vecs = serpent_cbc_dec_tv_template, 18809d25917dSJussi Kivilinna .count = SERPENT_CBC_DEC_TEST_VECTORS 18819d25917dSJussi Kivilinna } 18829d25917dSJussi Kivilinna } 18839d25917dSJussi Kivilinna } 18849d25917dSJussi Kivilinna }, { 1885da7f033dSHerbert Xu .alg = "cbc(twofish)", 18861aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1887da7f033dSHerbert Xu .suite = { 1888da7f033dSHerbert Xu .cipher = { 1889da7f033dSHerbert Xu .enc = { 1890da7f033dSHerbert Xu .vecs = tf_cbc_enc_tv_template, 1891da7f033dSHerbert Xu .count = TF_CBC_ENC_TEST_VECTORS 1892da7f033dSHerbert Xu }, 1893da7f033dSHerbert Xu .dec = { 1894da7f033dSHerbert Xu .vecs = tf_cbc_dec_tv_template, 1895da7f033dSHerbert Xu .count = TF_CBC_DEC_TEST_VECTORS 1896da7f033dSHerbert Xu } 1897da7f033dSHerbert Xu } 1898da7f033dSHerbert Xu } 1899da7f033dSHerbert Xu }, { 1900da7f033dSHerbert Xu .alg = "ccm(aes)", 1901da7f033dSHerbert Xu .test = alg_test_aead, 1902a1915d51SJarod Wilson .fips_allowed = 1, 1903da7f033dSHerbert Xu .suite = { 1904da7f033dSHerbert Xu .aead = { 1905da7f033dSHerbert Xu .enc = { 1906da7f033dSHerbert Xu .vecs = aes_ccm_enc_tv_template, 1907da7f033dSHerbert Xu .count = AES_CCM_ENC_TEST_VECTORS 1908da7f033dSHerbert Xu }, 1909da7f033dSHerbert Xu .dec = { 1910da7f033dSHerbert Xu .vecs = aes_ccm_dec_tv_template, 1911da7f033dSHerbert Xu .count = AES_CCM_DEC_TEST_VECTORS 1912da7f033dSHerbert Xu } 1913da7f033dSHerbert Xu } 1914da7f033dSHerbert Xu } 1915da7f033dSHerbert Xu }, { 1916da7f033dSHerbert Xu .alg = "crc32c", 19178e3ee85eSHerbert Xu .test = alg_test_crc32c, 1918a1915d51SJarod Wilson .fips_allowed = 1, 1919da7f033dSHerbert Xu .suite = { 1920da7f033dSHerbert Xu .hash = { 1921da7f033dSHerbert Xu .vecs = crc32c_tv_template, 1922da7f033dSHerbert Xu .count = CRC32C_TEST_VECTORS 1923da7f033dSHerbert Xu } 1924da7f033dSHerbert Xu } 1925da7f033dSHerbert Xu }, { 19266c79294fSMilan Broz .alg = "cryptd(__driver-cbc-aes-aesni)", 19276c79294fSMilan Broz .test = alg_test_null, 19286c79294fSMilan Broz .fips_allowed = 1, 19296c79294fSMilan Broz }, { 1930d9b1d2e7SJussi Kivilinna .alg = "cryptd(__driver-cbc-camellia-aesni)", 1931d9b1d2e7SJussi Kivilinna .test = alg_test_null, 1932d9b1d2e7SJussi Kivilinna }, { 1933863b557aSYouquan, Song .alg = "cryptd(__driver-ecb-aes-aesni)", 1934863b557aSYouquan, Song .test = alg_test_null, 19356c79294fSMilan Broz .fips_allowed = 1, 1936863b557aSYouquan, Song }, { 1937d9b1d2e7SJussi Kivilinna .alg = "cryptd(__driver-ecb-camellia-aesni)", 1938d9b1d2e7SJussi Kivilinna .test = alg_test_null, 1939d9b1d2e7SJussi Kivilinna }, { 19404d6d6a2cSJohannes Goetzfried .alg = "cryptd(__driver-ecb-cast5-avx)", 19414d6d6a2cSJohannes Goetzfried .test = alg_test_null, 19424d6d6a2cSJohannes Goetzfried }, { 19434ea1277dSJohannes Goetzfried .alg = "cryptd(__driver-ecb-cast6-avx)", 19444ea1277dSJohannes Goetzfried .test = alg_test_null, 19454ea1277dSJohannes Goetzfried }, { 19467efe4076SJohannes Goetzfried .alg = "cryptd(__driver-ecb-serpent-avx)", 19477efe4076SJohannes Goetzfried .test = alg_test_null, 19487efe4076SJohannes Goetzfried }, { 1949937c30d7SJussi Kivilinna .alg = "cryptd(__driver-ecb-serpent-sse2)", 1950937c30d7SJussi Kivilinna .test = alg_test_null, 1951937c30d7SJussi Kivilinna }, { 1952107778b5SJohannes Goetzfried .alg = "cryptd(__driver-ecb-twofish-avx)", 1953107778b5SJohannes Goetzfried .test = alg_test_null, 1954107778b5SJohannes Goetzfried }, { 19556c79294fSMilan Broz .alg = "cryptd(__driver-gcm-aes-aesni)", 19566c79294fSMilan Broz .test = alg_test_null, 19576c79294fSMilan Broz .fips_allowed = 1, 19586c79294fSMilan Broz }, { 1959863b557aSYouquan, Song .alg = "cryptd(__ghash-pclmulqdqni)", 1960863b557aSYouquan, Song .test = alg_test_null, 19616c79294fSMilan Broz .fips_allowed = 1, 1962863b557aSYouquan, Song }, { 1963f7cb80f2SJarod Wilson .alg = "ctr(aes)", 1964f7cb80f2SJarod Wilson .test = alg_test_skcipher, 1965a1915d51SJarod Wilson .fips_allowed = 1, 1966f7cb80f2SJarod Wilson .suite = { 1967f7cb80f2SJarod Wilson .cipher = { 1968f7cb80f2SJarod Wilson .enc = { 1969f7cb80f2SJarod Wilson .vecs = aes_ctr_enc_tv_template, 1970f7cb80f2SJarod Wilson .count = AES_CTR_ENC_TEST_VECTORS 1971f7cb80f2SJarod Wilson }, 1972f7cb80f2SJarod Wilson .dec = { 1973f7cb80f2SJarod Wilson .vecs = aes_ctr_dec_tv_template, 1974f7cb80f2SJarod Wilson .count = AES_CTR_DEC_TEST_VECTORS 1975f7cb80f2SJarod Wilson } 1976f7cb80f2SJarod Wilson } 1977f7cb80f2SJarod Wilson } 1978f7cb80f2SJarod Wilson }, { 197985b63e34SJussi Kivilinna .alg = "ctr(blowfish)", 198085b63e34SJussi Kivilinna .test = alg_test_skcipher, 198185b63e34SJussi Kivilinna .suite = { 198285b63e34SJussi Kivilinna .cipher = { 198385b63e34SJussi Kivilinna .enc = { 198485b63e34SJussi Kivilinna .vecs = bf_ctr_enc_tv_template, 198585b63e34SJussi Kivilinna .count = BF_CTR_ENC_TEST_VECTORS 198685b63e34SJussi Kivilinna }, 198785b63e34SJussi Kivilinna .dec = { 198885b63e34SJussi Kivilinna .vecs = bf_ctr_dec_tv_template, 198985b63e34SJussi Kivilinna .count = BF_CTR_DEC_TEST_VECTORS 199085b63e34SJussi Kivilinna } 199185b63e34SJussi Kivilinna } 199285b63e34SJussi Kivilinna } 199385b63e34SJussi Kivilinna }, { 19940840605eSJussi Kivilinna .alg = "ctr(camellia)", 19950840605eSJussi Kivilinna .test = alg_test_skcipher, 19960840605eSJussi Kivilinna .suite = { 19970840605eSJussi Kivilinna .cipher = { 19980840605eSJussi Kivilinna .enc = { 19990840605eSJussi Kivilinna .vecs = camellia_ctr_enc_tv_template, 20000840605eSJussi Kivilinna .count = CAMELLIA_CTR_ENC_TEST_VECTORS 20010840605eSJussi Kivilinna }, 20020840605eSJussi Kivilinna .dec = { 20030840605eSJussi Kivilinna .vecs = camellia_ctr_dec_tv_template, 20040840605eSJussi Kivilinna .count = CAMELLIA_CTR_DEC_TEST_VECTORS 20050840605eSJussi Kivilinna } 20060840605eSJussi Kivilinna } 20070840605eSJussi Kivilinna } 20080840605eSJussi Kivilinna }, { 2009a2c58260SJohannes Goetzfried .alg = "ctr(cast5)", 2010a2c58260SJohannes Goetzfried .test = alg_test_skcipher, 2011a2c58260SJohannes Goetzfried .suite = { 2012a2c58260SJohannes Goetzfried .cipher = { 2013a2c58260SJohannes Goetzfried .enc = { 2014a2c58260SJohannes Goetzfried .vecs = cast5_ctr_enc_tv_template, 2015a2c58260SJohannes Goetzfried .count = CAST5_CTR_ENC_TEST_VECTORS 2016a2c58260SJohannes Goetzfried }, 2017a2c58260SJohannes Goetzfried .dec = { 2018a2c58260SJohannes Goetzfried .vecs = cast5_ctr_dec_tv_template, 2019a2c58260SJohannes Goetzfried .count = CAST5_CTR_DEC_TEST_VECTORS 2020a2c58260SJohannes Goetzfried } 2021a2c58260SJohannes Goetzfried } 2022a2c58260SJohannes Goetzfried } 2023a2c58260SJohannes Goetzfried }, { 20249b8b0405SJohannes Goetzfried .alg = "ctr(cast6)", 20259b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 20269b8b0405SJohannes Goetzfried .suite = { 20279b8b0405SJohannes Goetzfried .cipher = { 20289b8b0405SJohannes Goetzfried .enc = { 20299b8b0405SJohannes Goetzfried .vecs = cast6_ctr_enc_tv_template, 20309b8b0405SJohannes Goetzfried .count = CAST6_CTR_ENC_TEST_VECTORS 20319b8b0405SJohannes Goetzfried }, 20329b8b0405SJohannes Goetzfried .dec = { 20339b8b0405SJohannes Goetzfried .vecs = cast6_ctr_dec_tv_template, 20349b8b0405SJohannes Goetzfried .count = CAST6_CTR_DEC_TEST_VECTORS 20359b8b0405SJohannes Goetzfried } 20369b8b0405SJohannes Goetzfried } 20379b8b0405SJohannes Goetzfried } 20389b8b0405SJohannes Goetzfried }, { 20398163fc30SJussi Kivilinna .alg = "ctr(des)", 20408163fc30SJussi Kivilinna .test = alg_test_skcipher, 20418163fc30SJussi Kivilinna .suite = { 20428163fc30SJussi Kivilinna .cipher = { 20438163fc30SJussi Kivilinna .enc = { 20448163fc30SJussi Kivilinna .vecs = des_ctr_enc_tv_template, 20458163fc30SJussi Kivilinna .count = DES_CTR_ENC_TEST_VECTORS 20468163fc30SJussi Kivilinna }, 20478163fc30SJussi Kivilinna .dec = { 20488163fc30SJussi Kivilinna .vecs = des_ctr_dec_tv_template, 20498163fc30SJussi Kivilinna .count = DES_CTR_DEC_TEST_VECTORS 20508163fc30SJussi Kivilinna } 20518163fc30SJussi Kivilinna } 20528163fc30SJussi Kivilinna } 20538163fc30SJussi Kivilinna }, { 2054e080b17aSJussi Kivilinna .alg = "ctr(des3_ede)", 2055e080b17aSJussi Kivilinna .test = alg_test_skcipher, 2056e080b17aSJussi Kivilinna .suite = { 2057e080b17aSJussi Kivilinna .cipher = { 2058e080b17aSJussi Kivilinna .enc = { 2059e080b17aSJussi Kivilinna .vecs = des3_ede_ctr_enc_tv_template, 2060e080b17aSJussi Kivilinna .count = DES3_EDE_CTR_ENC_TEST_VECTORS 2061e080b17aSJussi Kivilinna }, 2062e080b17aSJussi Kivilinna .dec = { 2063e080b17aSJussi Kivilinna .vecs = des3_ede_ctr_dec_tv_template, 2064e080b17aSJussi Kivilinna .count = DES3_EDE_CTR_DEC_TEST_VECTORS 2065e080b17aSJussi Kivilinna } 2066e080b17aSJussi Kivilinna } 2067e080b17aSJussi Kivilinna } 2068e080b17aSJussi Kivilinna }, { 20699d25917dSJussi Kivilinna .alg = "ctr(serpent)", 20709d25917dSJussi Kivilinna .test = alg_test_skcipher, 20719d25917dSJussi Kivilinna .suite = { 20729d25917dSJussi Kivilinna .cipher = { 20739d25917dSJussi Kivilinna .enc = { 20749d25917dSJussi Kivilinna .vecs = serpent_ctr_enc_tv_template, 20759d25917dSJussi Kivilinna .count = SERPENT_CTR_ENC_TEST_VECTORS 20769d25917dSJussi Kivilinna }, 20779d25917dSJussi Kivilinna .dec = { 20789d25917dSJussi Kivilinna .vecs = serpent_ctr_dec_tv_template, 20799d25917dSJussi Kivilinna .count = SERPENT_CTR_DEC_TEST_VECTORS 20809d25917dSJussi Kivilinna } 20819d25917dSJussi Kivilinna } 20829d25917dSJussi Kivilinna } 20839d25917dSJussi Kivilinna }, { 2084573da620SJussi Kivilinna .alg = "ctr(twofish)", 2085573da620SJussi Kivilinna .test = alg_test_skcipher, 2086573da620SJussi Kivilinna .suite = { 2087573da620SJussi Kivilinna .cipher = { 2088573da620SJussi Kivilinna .enc = { 2089573da620SJussi Kivilinna .vecs = tf_ctr_enc_tv_template, 2090573da620SJussi Kivilinna .count = TF_CTR_ENC_TEST_VECTORS 2091573da620SJussi Kivilinna }, 2092573da620SJussi Kivilinna .dec = { 2093573da620SJussi Kivilinna .vecs = tf_ctr_dec_tv_template, 2094573da620SJussi Kivilinna .count = TF_CTR_DEC_TEST_VECTORS 2095573da620SJussi Kivilinna } 2096573da620SJussi Kivilinna } 2097573da620SJussi Kivilinna } 2098573da620SJussi Kivilinna }, { 2099da7f033dSHerbert Xu .alg = "cts(cbc(aes))", 21001aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2101da7f033dSHerbert Xu .suite = { 2102da7f033dSHerbert Xu .cipher = { 2103da7f033dSHerbert Xu .enc = { 2104da7f033dSHerbert Xu .vecs = cts_mode_enc_tv_template, 2105da7f033dSHerbert Xu .count = CTS_MODE_ENC_TEST_VECTORS 2106da7f033dSHerbert Xu }, 2107da7f033dSHerbert Xu .dec = { 2108da7f033dSHerbert Xu .vecs = cts_mode_dec_tv_template, 2109da7f033dSHerbert Xu .count = CTS_MODE_DEC_TEST_VECTORS 2110da7f033dSHerbert Xu } 2111da7f033dSHerbert Xu } 2112da7f033dSHerbert Xu } 2113da7f033dSHerbert Xu }, { 2114da7f033dSHerbert Xu .alg = "deflate", 2115da7f033dSHerbert Xu .test = alg_test_comp, 21160818904dSMilan Broz .fips_allowed = 1, 2117da7f033dSHerbert Xu .suite = { 2118da7f033dSHerbert Xu .comp = { 2119da7f033dSHerbert Xu .comp = { 2120da7f033dSHerbert Xu .vecs = deflate_comp_tv_template, 2121da7f033dSHerbert Xu .count = DEFLATE_COMP_TEST_VECTORS 2122da7f033dSHerbert Xu }, 2123da7f033dSHerbert Xu .decomp = { 2124da7f033dSHerbert Xu .vecs = deflate_decomp_tv_template, 2125da7f033dSHerbert Xu .count = DEFLATE_DECOMP_TEST_VECTORS 2126da7f033dSHerbert Xu } 2127da7f033dSHerbert Xu } 2128da7f033dSHerbert Xu } 2129da7f033dSHerbert Xu }, { 2130863b557aSYouquan, Song .alg = "ecb(__aes-aesni)", 2131863b557aSYouquan, Song .test = alg_test_null, 21326c79294fSMilan Broz .fips_allowed = 1, 2133863b557aSYouquan, Song }, { 2134da7f033dSHerbert Xu .alg = "ecb(aes)", 21351aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2136a1915d51SJarod Wilson .fips_allowed = 1, 2137da7f033dSHerbert Xu .suite = { 2138da7f033dSHerbert Xu .cipher = { 2139da7f033dSHerbert Xu .enc = { 2140da7f033dSHerbert Xu .vecs = aes_enc_tv_template, 2141da7f033dSHerbert Xu .count = AES_ENC_TEST_VECTORS 2142da7f033dSHerbert Xu }, 2143da7f033dSHerbert Xu .dec = { 2144da7f033dSHerbert Xu .vecs = aes_dec_tv_template, 2145da7f033dSHerbert Xu .count = AES_DEC_TEST_VECTORS 2146da7f033dSHerbert Xu } 2147da7f033dSHerbert Xu } 2148da7f033dSHerbert Xu } 2149da7f033dSHerbert Xu }, { 2150da7f033dSHerbert Xu .alg = "ecb(anubis)", 21511aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2152da7f033dSHerbert Xu .suite = { 2153da7f033dSHerbert Xu .cipher = { 2154da7f033dSHerbert Xu .enc = { 2155da7f033dSHerbert Xu .vecs = anubis_enc_tv_template, 2156da7f033dSHerbert Xu .count = ANUBIS_ENC_TEST_VECTORS 2157da7f033dSHerbert Xu }, 2158da7f033dSHerbert Xu .dec = { 2159da7f033dSHerbert Xu .vecs = anubis_dec_tv_template, 2160da7f033dSHerbert Xu .count = ANUBIS_DEC_TEST_VECTORS 2161da7f033dSHerbert Xu } 2162da7f033dSHerbert Xu } 2163da7f033dSHerbert Xu } 2164da7f033dSHerbert Xu }, { 2165da7f033dSHerbert Xu .alg = "ecb(arc4)", 21661aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2167da7f033dSHerbert Xu .suite = { 2168da7f033dSHerbert Xu .cipher = { 2169da7f033dSHerbert Xu .enc = { 2170da7f033dSHerbert Xu .vecs = arc4_enc_tv_template, 2171da7f033dSHerbert Xu .count = ARC4_ENC_TEST_VECTORS 2172da7f033dSHerbert Xu }, 2173da7f033dSHerbert Xu .dec = { 2174da7f033dSHerbert Xu .vecs = arc4_dec_tv_template, 2175da7f033dSHerbert Xu .count = ARC4_DEC_TEST_VECTORS 2176da7f033dSHerbert Xu } 2177da7f033dSHerbert Xu } 2178da7f033dSHerbert Xu } 2179da7f033dSHerbert Xu }, { 2180da7f033dSHerbert Xu .alg = "ecb(blowfish)", 21811aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2182da7f033dSHerbert Xu .suite = { 2183da7f033dSHerbert Xu .cipher = { 2184da7f033dSHerbert Xu .enc = { 2185da7f033dSHerbert Xu .vecs = bf_enc_tv_template, 2186da7f033dSHerbert Xu .count = BF_ENC_TEST_VECTORS 2187da7f033dSHerbert Xu }, 2188da7f033dSHerbert Xu .dec = { 2189da7f033dSHerbert Xu .vecs = bf_dec_tv_template, 2190da7f033dSHerbert Xu .count = BF_DEC_TEST_VECTORS 2191da7f033dSHerbert Xu } 2192da7f033dSHerbert Xu } 2193da7f033dSHerbert Xu } 2194da7f033dSHerbert Xu }, { 2195da7f033dSHerbert Xu .alg = "ecb(camellia)", 21961aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2197da7f033dSHerbert Xu .suite = { 2198da7f033dSHerbert Xu .cipher = { 2199da7f033dSHerbert Xu .enc = { 2200da7f033dSHerbert Xu .vecs = camellia_enc_tv_template, 2201da7f033dSHerbert Xu .count = CAMELLIA_ENC_TEST_VECTORS 2202da7f033dSHerbert Xu }, 2203da7f033dSHerbert Xu .dec = { 2204da7f033dSHerbert Xu .vecs = camellia_dec_tv_template, 2205da7f033dSHerbert Xu .count = CAMELLIA_DEC_TEST_VECTORS 2206da7f033dSHerbert Xu } 2207da7f033dSHerbert Xu } 2208da7f033dSHerbert Xu } 2209da7f033dSHerbert Xu }, { 2210da7f033dSHerbert Xu .alg = "ecb(cast5)", 22111aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2212da7f033dSHerbert Xu .suite = { 2213da7f033dSHerbert Xu .cipher = { 2214da7f033dSHerbert Xu .enc = { 2215da7f033dSHerbert Xu .vecs = cast5_enc_tv_template, 2216da7f033dSHerbert Xu .count = CAST5_ENC_TEST_VECTORS 2217da7f033dSHerbert Xu }, 2218da7f033dSHerbert Xu .dec = { 2219da7f033dSHerbert Xu .vecs = cast5_dec_tv_template, 2220da7f033dSHerbert Xu .count = CAST5_DEC_TEST_VECTORS 2221da7f033dSHerbert Xu } 2222da7f033dSHerbert Xu } 2223da7f033dSHerbert Xu } 2224da7f033dSHerbert Xu }, { 2225da7f033dSHerbert Xu .alg = "ecb(cast6)", 22261aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2227da7f033dSHerbert Xu .suite = { 2228da7f033dSHerbert Xu .cipher = { 2229da7f033dSHerbert Xu .enc = { 2230da7f033dSHerbert Xu .vecs = cast6_enc_tv_template, 2231da7f033dSHerbert Xu .count = CAST6_ENC_TEST_VECTORS 2232da7f033dSHerbert Xu }, 2233da7f033dSHerbert Xu .dec = { 2234da7f033dSHerbert Xu .vecs = cast6_dec_tv_template, 2235da7f033dSHerbert Xu .count = CAST6_DEC_TEST_VECTORS 2236da7f033dSHerbert Xu } 2237da7f033dSHerbert Xu } 2238da7f033dSHerbert Xu } 2239da7f033dSHerbert Xu }, { 2240da7f033dSHerbert Xu .alg = "ecb(des)", 22411aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2242a1915d51SJarod Wilson .fips_allowed = 1, 2243da7f033dSHerbert Xu .suite = { 2244da7f033dSHerbert Xu .cipher = { 2245da7f033dSHerbert Xu .enc = { 2246da7f033dSHerbert Xu .vecs = des_enc_tv_template, 2247da7f033dSHerbert Xu .count = DES_ENC_TEST_VECTORS 2248da7f033dSHerbert Xu }, 2249da7f033dSHerbert Xu .dec = { 2250da7f033dSHerbert Xu .vecs = des_dec_tv_template, 2251da7f033dSHerbert Xu .count = DES_DEC_TEST_VECTORS 2252da7f033dSHerbert Xu } 2253da7f033dSHerbert Xu } 2254da7f033dSHerbert Xu } 2255da7f033dSHerbert Xu }, { 2256da7f033dSHerbert Xu .alg = "ecb(des3_ede)", 22571aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2258a1915d51SJarod Wilson .fips_allowed = 1, 2259da7f033dSHerbert Xu .suite = { 2260da7f033dSHerbert Xu .cipher = { 2261da7f033dSHerbert Xu .enc = { 2262da7f033dSHerbert Xu .vecs = des3_ede_enc_tv_template, 2263da7f033dSHerbert Xu .count = DES3_EDE_ENC_TEST_VECTORS 2264da7f033dSHerbert Xu }, 2265da7f033dSHerbert Xu .dec = { 2266da7f033dSHerbert Xu .vecs = des3_ede_dec_tv_template, 2267da7f033dSHerbert Xu .count = DES3_EDE_DEC_TEST_VECTORS 2268da7f033dSHerbert Xu } 2269da7f033dSHerbert Xu } 2270da7f033dSHerbert Xu } 2271da7f033dSHerbert Xu }, { 2272da7f033dSHerbert Xu .alg = "ecb(khazad)", 22731aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2274da7f033dSHerbert Xu .suite = { 2275da7f033dSHerbert Xu .cipher = { 2276da7f033dSHerbert Xu .enc = { 2277da7f033dSHerbert Xu .vecs = khazad_enc_tv_template, 2278da7f033dSHerbert Xu .count = KHAZAD_ENC_TEST_VECTORS 2279da7f033dSHerbert Xu }, 2280da7f033dSHerbert Xu .dec = { 2281da7f033dSHerbert Xu .vecs = khazad_dec_tv_template, 2282da7f033dSHerbert Xu .count = KHAZAD_DEC_TEST_VECTORS 2283da7f033dSHerbert Xu } 2284da7f033dSHerbert Xu } 2285da7f033dSHerbert Xu } 2286da7f033dSHerbert Xu }, { 2287da7f033dSHerbert Xu .alg = "ecb(seed)", 22881aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2289da7f033dSHerbert Xu .suite = { 2290da7f033dSHerbert Xu .cipher = { 2291da7f033dSHerbert Xu .enc = { 2292da7f033dSHerbert Xu .vecs = seed_enc_tv_template, 2293da7f033dSHerbert Xu .count = SEED_ENC_TEST_VECTORS 2294da7f033dSHerbert Xu }, 2295da7f033dSHerbert Xu .dec = { 2296da7f033dSHerbert Xu .vecs = seed_dec_tv_template, 2297da7f033dSHerbert Xu .count = SEED_DEC_TEST_VECTORS 2298da7f033dSHerbert Xu } 2299da7f033dSHerbert Xu } 2300da7f033dSHerbert Xu } 2301da7f033dSHerbert Xu }, { 2302da7f033dSHerbert Xu .alg = "ecb(serpent)", 23031aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2304da7f033dSHerbert Xu .suite = { 2305da7f033dSHerbert Xu .cipher = { 2306da7f033dSHerbert Xu .enc = { 2307da7f033dSHerbert Xu .vecs = serpent_enc_tv_template, 2308da7f033dSHerbert Xu .count = SERPENT_ENC_TEST_VECTORS 2309da7f033dSHerbert Xu }, 2310da7f033dSHerbert Xu .dec = { 2311da7f033dSHerbert Xu .vecs = serpent_dec_tv_template, 2312da7f033dSHerbert Xu .count = SERPENT_DEC_TEST_VECTORS 2313da7f033dSHerbert Xu } 2314da7f033dSHerbert Xu } 2315da7f033dSHerbert Xu } 2316da7f033dSHerbert Xu }, { 2317da7f033dSHerbert Xu .alg = "ecb(tea)", 23181aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2319da7f033dSHerbert Xu .suite = { 2320da7f033dSHerbert Xu .cipher = { 2321da7f033dSHerbert Xu .enc = { 2322da7f033dSHerbert Xu .vecs = tea_enc_tv_template, 2323da7f033dSHerbert Xu .count = TEA_ENC_TEST_VECTORS 2324da7f033dSHerbert Xu }, 2325da7f033dSHerbert Xu .dec = { 2326da7f033dSHerbert Xu .vecs = tea_dec_tv_template, 2327da7f033dSHerbert Xu .count = TEA_DEC_TEST_VECTORS 2328da7f033dSHerbert Xu } 2329da7f033dSHerbert Xu } 2330da7f033dSHerbert Xu } 2331da7f033dSHerbert Xu }, { 2332da7f033dSHerbert Xu .alg = "ecb(tnepres)", 23331aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2334da7f033dSHerbert Xu .suite = { 2335da7f033dSHerbert Xu .cipher = { 2336da7f033dSHerbert Xu .enc = { 2337da7f033dSHerbert Xu .vecs = tnepres_enc_tv_template, 2338da7f033dSHerbert Xu .count = TNEPRES_ENC_TEST_VECTORS 2339da7f033dSHerbert Xu }, 2340da7f033dSHerbert Xu .dec = { 2341da7f033dSHerbert Xu .vecs = tnepres_dec_tv_template, 2342da7f033dSHerbert Xu .count = TNEPRES_DEC_TEST_VECTORS 2343da7f033dSHerbert Xu } 2344da7f033dSHerbert Xu } 2345da7f033dSHerbert Xu } 2346da7f033dSHerbert Xu }, { 2347da7f033dSHerbert Xu .alg = "ecb(twofish)", 23481aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2349da7f033dSHerbert Xu .suite = { 2350da7f033dSHerbert Xu .cipher = { 2351da7f033dSHerbert Xu .enc = { 2352da7f033dSHerbert Xu .vecs = tf_enc_tv_template, 2353da7f033dSHerbert Xu .count = TF_ENC_TEST_VECTORS 2354da7f033dSHerbert Xu }, 2355da7f033dSHerbert Xu .dec = { 2356da7f033dSHerbert Xu .vecs = tf_dec_tv_template, 2357da7f033dSHerbert Xu .count = TF_DEC_TEST_VECTORS 2358da7f033dSHerbert Xu } 2359da7f033dSHerbert Xu } 2360da7f033dSHerbert Xu } 2361da7f033dSHerbert Xu }, { 2362da7f033dSHerbert Xu .alg = "ecb(xeta)", 23631aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2364da7f033dSHerbert Xu .suite = { 2365da7f033dSHerbert Xu .cipher = { 2366da7f033dSHerbert Xu .enc = { 2367da7f033dSHerbert Xu .vecs = xeta_enc_tv_template, 2368da7f033dSHerbert Xu .count = XETA_ENC_TEST_VECTORS 2369da7f033dSHerbert Xu }, 2370da7f033dSHerbert Xu .dec = { 2371da7f033dSHerbert Xu .vecs = xeta_dec_tv_template, 2372da7f033dSHerbert Xu .count = XETA_DEC_TEST_VECTORS 2373da7f033dSHerbert Xu } 2374da7f033dSHerbert Xu } 2375da7f033dSHerbert Xu } 2376da7f033dSHerbert Xu }, { 2377da7f033dSHerbert Xu .alg = "ecb(xtea)", 23781aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2379da7f033dSHerbert Xu .suite = { 2380da7f033dSHerbert Xu .cipher = { 2381da7f033dSHerbert Xu .enc = { 2382da7f033dSHerbert Xu .vecs = xtea_enc_tv_template, 2383da7f033dSHerbert Xu .count = XTEA_ENC_TEST_VECTORS 2384da7f033dSHerbert Xu }, 2385da7f033dSHerbert Xu .dec = { 2386da7f033dSHerbert Xu .vecs = xtea_dec_tv_template, 2387da7f033dSHerbert Xu .count = XTEA_DEC_TEST_VECTORS 2388da7f033dSHerbert Xu } 2389da7f033dSHerbert Xu } 2390da7f033dSHerbert Xu } 2391da7f033dSHerbert Xu }, { 2392da7f033dSHerbert Xu .alg = "gcm(aes)", 2393da7f033dSHerbert Xu .test = alg_test_aead, 2394a1915d51SJarod Wilson .fips_allowed = 1, 2395da7f033dSHerbert Xu .suite = { 2396da7f033dSHerbert Xu .aead = { 2397da7f033dSHerbert Xu .enc = { 2398da7f033dSHerbert Xu .vecs = aes_gcm_enc_tv_template, 2399da7f033dSHerbert Xu .count = AES_GCM_ENC_TEST_VECTORS 2400da7f033dSHerbert Xu }, 2401da7f033dSHerbert Xu .dec = { 2402da7f033dSHerbert Xu .vecs = aes_gcm_dec_tv_template, 2403da7f033dSHerbert Xu .count = AES_GCM_DEC_TEST_VECTORS 2404da7f033dSHerbert Xu } 2405da7f033dSHerbert Xu } 2406da7f033dSHerbert Xu } 2407da7f033dSHerbert Xu }, { 2408507069c9SYouquan, Song .alg = "ghash", 2409507069c9SYouquan, Song .test = alg_test_hash, 241018c0ebd2SJarod Wilson .fips_allowed = 1, 2411507069c9SYouquan, Song .suite = { 2412507069c9SYouquan, Song .hash = { 2413507069c9SYouquan, Song .vecs = ghash_tv_template, 2414507069c9SYouquan, Song .count = GHASH_TEST_VECTORS 2415507069c9SYouquan, Song } 2416507069c9SYouquan, Song } 2417507069c9SYouquan, Song }, { 2418a482b081SSonic Zhang .alg = "hmac(crc32)", 2419a482b081SSonic Zhang .test = alg_test_hash, 2420a482b081SSonic Zhang .suite = { 2421a482b081SSonic Zhang .hash = { 2422a482b081SSonic Zhang .vecs = bfin_crc_tv_template, 2423a482b081SSonic Zhang .count = BFIN_CRC_TEST_VECTORS 2424a482b081SSonic Zhang } 2425a482b081SSonic Zhang } 2426a482b081SSonic Zhang }, { 2427da7f033dSHerbert Xu .alg = "hmac(md5)", 2428da7f033dSHerbert Xu .test = alg_test_hash, 2429da7f033dSHerbert Xu .suite = { 2430da7f033dSHerbert Xu .hash = { 2431da7f033dSHerbert Xu .vecs = hmac_md5_tv_template, 2432da7f033dSHerbert Xu .count = HMAC_MD5_TEST_VECTORS 2433da7f033dSHerbert Xu } 2434da7f033dSHerbert Xu } 2435da7f033dSHerbert Xu }, { 2436da7f033dSHerbert Xu .alg = "hmac(rmd128)", 2437da7f033dSHerbert Xu .test = alg_test_hash, 2438da7f033dSHerbert Xu .suite = { 2439da7f033dSHerbert Xu .hash = { 2440da7f033dSHerbert Xu .vecs = hmac_rmd128_tv_template, 2441da7f033dSHerbert Xu .count = HMAC_RMD128_TEST_VECTORS 2442da7f033dSHerbert Xu } 2443da7f033dSHerbert Xu } 2444da7f033dSHerbert Xu }, { 2445da7f033dSHerbert Xu .alg = "hmac(rmd160)", 2446da7f033dSHerbert Xu .test = alg_test_hash, 2447da7f033dSHerbert Xu .suite = { 2448da7f033dSHerbert Xu .hash = { 2449da7f033dSHerbert Xu .vecs = hmac_rmd160_tv_template, 2450da7f033dSHerbert Xu .count = HMAC_RMD160_TEST_VECTORS 2451da7f033dSHerbert Xu } 2452da7f033dSHerbert Xu } 2453da7f033dSHerbert Xu }, { 2454da7f033dSHerbert Xu .alg = "hmac(sha1)", 2455da7f033dSHerbert Xu .test = alg_test_hash, 2456a1915d51SJarod Wilson .fips_allowed = 1, 2457da7f033dSHerbert Xu .suite = { 2458da7f033dSHerbert Xu .hash = { 2459da7f033dSHerbert Xu .vecs = hmac_sha1_tv_template, 2460da7f033dSHerbert Xu .count = HMAC_SHA1_TEST_VECTORS 2461da7f033dSHerbert Xu } 2462da7f033dSHerbert Xu } 2463da7f033dSHerbert Xu }, { 2464da7f033dSHerbert Xu .alg = "hmac(sha224)", 2465da7f033dSHerbert Xu .test = alg_test_hash, 2466a1915d51SJarod Wilson .fips_allowed = 1, 2467da7f033dSHerbert Xu .suite = { 2468da7f033dSHerbert Xu .hash = { 2469da7f033dSHerbert Xu .vecs = hmac_sha224_tv_template, 2470da7f033dSHerbert Xu .count = HMAC_SHA224_TEST_VECTORS 2471da7f033dSHerbert Xu } 2472da7f033dSHerbert Xu } 2473da7f033dSHerbert Xu }, { 2474da7f033dSHerbert Xu .alg = "hmac(sha256)", 2475da7f033dSHerbert Xu .test = alg_test_hash, 2476a1915d51SJarod Wilson .fips_allowed = 1, 2477da7f033dSHerbert Xu .suite = { 2478da7f033dSHerbert Xu .hash = { 2479da7f033dSHerbert Xu .vecs = hmac_sha256_tv_template, 2480da7f033dSHerbert Xu .count = HMAC_SHA256_TEST_VECTORS 2481da7f033dSHerbert Xu } 2482da7f033dSHerbert Xu } 2483da7f033dSHerbert Xu }, { 2484da7f033dSHerbert Xu .alg = "hmac(sha384)", 2485da7f033dSHerbert Xu .test = alg_test_hash, 2486a1915d51SJarod Wilson .fips_allowed = 1, 2487da7f033dSHerbert Xu .suite = { 2488da7f033dSHerbert Xu .hash = { 2489da7f033dSHerbert Xu .vecs = hmac_sha384_tv_template, 2490da7f033dSHerbert Xu .count = HMAC_SHA384_TEST_VECTORS 2491da7f033dSHerbert Xu } 2492da7f033dSHerbert Xu } 2493da7f033dSHerbert Xu }, { 2494da7f033dSHerbert Xu .alg = "hmac(sha512)", 2495da7f033dSHerbert Xu .test = alg_test_hash, 2496a1915d51SJarod Wilson .fips_allowed = 1, 2497da7f033dSHerbert Xu .suite = { 2498da7f033dSHerbert Xu .hash = { 2499da7f033dSHerbert Xu .vecs = hmac_sha512_tv_template, 2500da7f033dSHerbert Xu .count = HMAC_SHA512_TEST_VECTORS 2501da7f033dSHerbert Xu } 2502da7f033dSHerbert Xu } 2503da7f033dSHerbert Xu }, { 2504da7f033dSHerbert Xu .alg = "lrw(aes)", 25051aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2506da7f033dSHerbert Xu .suite = { 2507da7f033dSHerbert Xu .cipher = { 2508da7f033dSHerbert Xu .enc = { 2509da7f033dSHerbert Xu .vecs = aes_lrw_enc_tv_template, 2510da7f033dSHerbert Xu .count = AES_LRW_ENC_TEST_VECTORS 2511da7f033dSHerbert Xu }, 2512da7f033dSHerbert Xu .dec = { 2513da7f033dSHerbert Xu .vecs = aes_lrw_dec_tv_template, 2514da7f033dSHerbert Xu .count = AES_LRW_DEC_TEST_VECTORS 2515da7f033dSHerbert Xu } 2516da7f033dSHerbert Xu } 2517da7f033dSHerbert Xu } 2518da7f033dSHerbert Xu }, { 25190840605eSJussi Kivilinna .alg = "lrw(camellia)", 25200840605eSJussi Kivilinna .test = alg_test_skcipher, 25210840605eSJussi Kivilinna .suite = { 25220840605eSJussi Kivilinna .cipher = { 25230840605eSJussi Kivilinna .enc = { 25240840605eSJussi Kivilinna .vecs = camellia_lrw_enc_tv_template, 25250840605eSJussi Kivilinna .count = CAMELLIA_LRW_ENC_TEST_VECTORS 25260840605eSJussi Kivilinna }, 25270840605eSJussi Kivilinna .dec = { 25280840605eSJussi Kivilinna .vecs = camellia_lrw_dec_tv_template, 25290840605eSJussi Kivilinna .count = CAMELLIA_LRW_DEC_TEST_VECTORS 25300840605eSJussi Kivilinna } 25310840605eSJussi Kivilinna } 25320840605eSJussi Kivilinna } 25330840605eSJussi Kivilinna }, { 25349b8b0405SJohannes Goetzfried .alg = "lrw(cast6)", 25359b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 25369b8b0405SJohannes Goetzfried .suite = { 25379b8b0405SJohannes Goetzfried .cipher = { 25389b8b0405SJohannes Goetzfried .enc = { 25399b8b0405SJohannes Goetzfried .vecs = cast6_lrw_enc_tv_template, 25409b8b0405SJohannes Goetzfried .count = CAST6_LRW_ENC_TEST_VECTORS 25419b8b0405SJohannes Goetzfried }, 25429b8b0405SJohannes Goetzfried .dec = { 25439b8b0405SJohannes Goetzfried .vecs = cast6_lrw_dec_tv_template, 25449b8b0405SJohannes Goetzfried .count = CAST6_LRW_DEC_TEST_VECTORS 25459b8b0405SJohannes Goetzfried } 25469b8b0405SJohannes Goetzfried } 25479b8b0405SJohannes Goetzfried } 25489b8b0405SJohannes Goetzfried }, { 2549d7bfc0faSJussi Kivilinna .alg = "lrw(serpent)", 2550d7bfc0faSJussi Kivilinna .test = alg_test_skcipher, 2551d7bfc0faSJussi Kivilinna .suite = { 2552d7bfc0faSJussi Kivilinna .cipher = { 2553d7bfc0faSJussi Kivilinna .enc = { 2554d7bfc0faSJussi Kivilinna .vecs = serpent_lrw_enc_tv_template, 2555d7bfc0faSJussi Kivilinna .count = SERPENT_LRW_ENC_TEST_VECTORS 2556d7bfc0faSJussi Kivilinna }, 2557d7bfc0faSJussi Kivilinna .dec = { 2558d7bfc0faSJussi Kivilinna .vecs = serpent_lrw_dec_tv_template, 2559d7bfc0faSJussi Kivilinna .count = SERPENT_LRW_DEC_TEST_VECTORS 2560d7bfc0faSJussi Kivilinna } 2561d7bfc0faSJussi Kivilinna } 2562d7bfc0faSJussi Kivilinna } 2563d7bfc0faSJussi Kivilinna }, { 25640b2a1551SJussi Kivilinna .alg = "lrw(twofish)", 25650b2a1551SJussi Kivilinna .test = alg_test_skcipher, 25660b2a1551SJussi Kivilinna .suite = { 25670b2a1551SJussi Kivilinna .cipher = { 25680b2a1551SJussi Kivilinna .enc = { 25690b2a1551SJussi Kivilinna .vecs = tf_lrw_enc_tv_template, 25700b2a1551SJussi Kivilinna .count = TF_LRW_ENC_TEST_VECTORS 25710b2a1551SJussi Kivilinna }, 25720b2a1551SJussi Kivilinna .dec = { 25730b2a1551SJussi Kivilinna .vecs = tf_lrw_dec_tv_template, 25740b2a1551SJussi Kivilinna .count = TF_LRW_DEC_TEST_VECTORS 25750b2a1551SJussi Kivilinna } 25760b2a1551SJussi Kivilinna } 25770b2a1551SJussi Kivilinna } 25780b2a1551SJussi Kivilinna }, { 2579da7f033dSHerbert Xu .alg = "lzo", 2580da7f033dSHerbert Xu .test = alg_test_comp, 25810818904dSMilan Broz .fips_allowed = 1, 2582da7f033dSHerbert Xu .suite = { 2583da7f033dSHerbert Xu .comp = { 2584da7f033dSHerbert Xu .comp = { 2585da7f033dSHerbert Xu .vecs = lzo_comp_tv_template, 2586da7f033dSHerbert Xu .count = LZO_COMP_TEST_VECTORS 2587da7f033dSHerbert Xu }, 2588da7f033dSHerbert Xu .decomp = { 2589da7f033dSHerbert Xu .vecs = lzo_decomp_tv_template, 2590da7f033dSHerbert Xu .count = LZO_DECOMP_TEST_VECTORS 2591da7f033dSHerbert Xu } 2592da7f033dSHerbert Xu } 2593da7f033dSHerbert Xu } 2594da7f033dSHerbert Xu }, { 2595da7f033dSHerbert Xu .alg = "md4", 2596da7f033dSHerbert Xu .test = alg_test_hash, 2597da7f033dSHerbert Xu .suite = { 2598da7f033dSHerbert Xu .hash = { 2599da7f033dSHerbert Xu .vecs = md4_tv_template, 2600da7f033dSHerbert Xu .count = MD4_TEST_VECTORS 2601da7f033dSHerbert Xu } 2602da7f033dSHerbert Xu } 2603da7f033dSHerbert Xu }, { 2604da7f033dSHerbert Xu .alg = "md5", 2605da7f033dSHerbert Xu .test = alg_test_hash, 2606da7f033dSHerbert Xu .suite = { 2607da7f033dSHerbert Xu .hash = { 2608da7f033dSHerbert Xu .vecs = md5_tv_template, 2609da7f033dSHerbert Xu .count = MD5_TEST_VECTORS 2610da7f033dSHerbert Xu } 2611da7f033dSHerbert Xu } 2612da7f033dSHerbert Xu }, { 2613da7f033dSHerbert Xu .alg = "michael_mic", 2614da7f033dSHerbert Xu .test = alg_test_hash, 2615da7f033dSHerbert Xu .suite = { 2616da7f033dSHerbert Xu .hash = { 2617da7f033dSHerbert Xu .vecs = michael_mic_tv_template, 2618da7f033dSHerbert Xu .count = MICHAEL_MIC_TEST_VECTORS 2619da7f033dSHerbert Xu } 2620da7f033dSHerbert Xu } 2621da7f033dSHerbert Xu }, { 2622ba0e14acSPuneet Saxena .alg = "ofb(aes)", 2623ba0e14acSPuneet Saxena .test = alg_test_skcipher, 2624ba0e14acSPuneet Saxena .fips_allowed = 1, 2625ba0e14acSPuneet Saxena .suite = { 2626ba0e14acSPuneet Saxena .cipher = { 2627ba0e14acSPuneet Saxena .enc = { 2628ba0e14acSPuneet Saxena .vecs = aes_ofb_enc_tv_template, 2629ba0e14acSPuneet Saxena .count = AES_OFB_ENC_TEST_VECTORS 2630ba0e14acSPuneet Saxena }, 2631ba0e14acSPuneet Saxena .dec = { 2632ba0e14acSPuneet Saxena .vecs = aes_ofb_dec_tv_template, 2633ba0e14acSPuneet Saxena .count = AES_OFB_DEC_TEST_VECTORS 2634ba0e14acSPuneet Saxena } 2635ba0e14acSPuneet Saxena } 2636ba0e14acSPuneet Saxena } 2637ba0e14acSPuneet Saxena }, { 2638da7f033dSHerbert Xu .alg = "pcbc(fcrypt)", 26391aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2640da7f033dSHerbert Xu .suite = { 2641da7f033dSHerbert Xu .cipher = { 2642da7f033dSHerbert Xu .enc = { 2643da7f033dSHerbert Xu .vecs = fcrypt_pcbc_enc_tv_template, 2644da7f033dSHerbert Xu .count = FCRYPT_ENC_TEST_VECTORS 2645da7f033dSHerbert Xu }, 2646da7f033dSHerbert Xu .dec = { 2647da7f033dSHerbert Xu .vecs = fcrypt_pcbc_dec_tv_template, 2648da7f033dSHerbert Xu .count = FCRYPT_DEC_TEST_VECTORS 2649da7f033dSHerbert Xu } 2650da7f033dSHerbert Xu } 2651da7f033dSHerbert Xu } 2652da7f033dSHerbert Xu }, { 2653da7f033dSHerbert Xu .alg = "rfc3686(ctr(aes))", 26541aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2655a1915d51SJarod Wilson .fips_allowed = 1, 2656da7f033dSHerbert Xu .suite = { 2657da7f033dSHerbert Xu .cipher = { 2658da7f033dSHerbert Xu .enc = { 2659f7cb80f2SJarod Wilson .vecs = aes_ctr_rfc3686_enc_tv_template, 2660f7cb80f2SJarod Wilson .count = AES_CTR_3686_ENC_TEST_VECTORS 2661da7f033dSHerbert Xu }, 2662da7f033dSHerbert Xu .dec = { 2663f7cb80f2SJarod Wilson .vecs = aes_ctr_rfc3686_dec_tv_template, 2664f7cb80f2SJarod Wilson .count = AES_CTR_3686_DEC_TEST_VECTORS 2665da7f033dSHerbert Xu } 2666da7f033dSHerbert Xu } 2667da7f033dSHerbert Xu } 2668da7f033dSHerbert Xu }, { 266969435b94SAdrian Hoban .alg = "rfc4106(gcm(aes))", 267069435b94SAdrian Hoban .test = alg_test_aead, 267169435b94SAdrian Hoban .suite = { 267269435b94SAdrian Hoban .aead = { 267369435b94SAdrian Hoban .enc = { 267469435b94SAdrian Hoban .vecs = aes_gcm_rfc4106_enc_tv_template, 267569435b94SAdrian Hoban .count = AES_GCM_4106_ENC_TEST_VECTORS 267669435b94SAdrian Hoban }, 267769435b94SAdrian Hoban .dec = { 267869435b94SAdrian Hoban .vecs = aes_gcm_rfc4106_dec_tv_template, 267969435b94SAdrian Hoban .count = AES_GCM_4106_DEC_TEST_VECTORS 268069435b94SAdrian Hoban } 268169435b94SAdrian Hoban } 268269435b94SAdrian Hoban } 268369435b94SAdrian Hoban }, { 268469435b94SAdrian Hoban 268569435b94SAdrian Hoban 26865d667322SJarod Wilson .alg = "rfc4309(ccm(aes))", 26875d667322SJarod Wilson .test = alg_test_aead, 2688a1915d51SJarod Wilson .fips_allowed = 1, 26895d667322SJarod Wilson .suite = { 26905d667322SJarod Wilson .aead = { 26915d667322SJarod Wilson .enc = { 26925d667322SJarod Wilson .vecs = aes_ccm_rfc4309_enc_tv_template, 26935d667322SJarod Wilson .count = AES_CCM_4309_ENC_TEST_VECTORS 26945d667322SJarod Wilson }, 26955d667322SJarod Wilson .dec = { 26965d667322SJarod Wilson .vecs = aes_ccm_rfc4309_dec_tv_template, 26975d667322SJarod Wilson .count = AES_CCM_4309_DEC_TEST_VECTORS 26985d667322SJarod Wilson } 26995d667322SJarod Wilson } 27005d667322SJarod Wilson } 27015d667322SJarod Wilson }, { 2702da7f033dSHerbert Xu .alg = "rmd128", 2703da7f033dSHerbert Xu .test = alg_test_hash, 2704da7f033dSHerbert Xu .suite = { 2705da7f033dSHerbert Xu .hash = { 2706da7f033dSHerbert Xu .vecs = rmd128_tv_template, 2707da7f033dSHerbert Xu .count = RMD128_TEST_VECTORS 2708da7f033dSHerbert Xu } 2709da7f033dSHerbert Xu } 2710da7f033dSHerbert Xu }, { 2711da7f033dSHerbert Xu .alg = "rmd160", 2712da7f033dSHerbert Xu .test = alg_test_hash, 2713da7f033dSHerbert Xu .suite = { 2714da7f033dSHerbert Xu .hash = { 2715da7f033dSHerbert Xu .vecs = rmd160_tv_template, 2716da7f033dSHerbert Xu .count = RMD160_TEST_VECTORS 2717da7f033dSHerbert Xu } 2718da7f033dSHerbert Xu } 2719da7f033dSHerbert Xu }, { 2720da7f033dSHerbert Xu .alg = "rmd256", 2721da7f033dSHerbert Xu .test = alg_test_hash, 2722da7f033dSHerbert Xu .suite = { 2723da7f033dSHerbert Xu .hash = { 2724da7f033dSHerbert Xu .vecs = rmd256_tv_template, 2725da7f033dSHerbert Xu .count = RMD256_TEST_VECTORS 2726da7f033dSHerbert Xu } 2727da7f033dSHerbert Xu } 2728da7f033dSHerbert Xu }, { 2729da7f033dSHerbert Xu .alg = "rmd320", 2730da7f033dSHerbert Xu .test = alg_test_hash, 2731da7f033dSHerbert Xu .suite = { 2732da7f033dSHerbert Xu .hash = { 2733da7f033dSHerbert Xu .vecs = rmd320_tv_template, 2734da7f033dSHerbert Xu .count = RMD320_TEST_VECTORS 2735da7f033dSHerbert Xu } 2736da7f033dSHerbert Xu } 2737da7f033dSHerbert Xu }, { 2738da7f033dSHerbert Xu .alg = "salsa20", 27391aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2740da7f033dSHerbert Xu .suite = { 2741da7f033dSHerbert Xu .cipher = { 2742da7f033dSHerbert Xu .enc = { 2743da7f033dSHerbert Xu .vecs = salsa20_stream_enc_tv_template, 2744da7f033dSHerbert Xu .count = SALSA20_STREAM_ENC_TEST_VECTORS 2745da7f033dSHerbert Xu } 2746da7f033dSHerbert Xu } 2747da7f033dSHerbert Xu } 2748da7f033dSHerbert Xu }, { 2749da7f033dSHerbert Xu .alg = "sha1", 2750da7f033dSHerbert Xu .test = alg_test_hash, 2751a1915d51SJarod Wilson .fips_allowed = 1, 2752da7f033dSHerbert Xu .suite = { 2753da7f033dSHerbert Xu .hash = { 2754da7f033dSHerbert Xu .vecs = sha1_tv_template, 2755da7f033dSHerbert Xu .count = SHA1_TEST_VECTORS 2756da7f033dSHerbert Xu } 2757da7f033dSHerbert Xu } 2758da7f033dSHerbert Xu }, { 2759da7f033dSHerbert Xu .alg = "sha224", 2760da7f033dSHerbert Xu .test = alg_test_hash, 2761a1915d51SJarod Wilson .fips_allowed = 1, 2762da7f033dSHerbert Xu .suite = { 2763da7f033dSHerbert Xu .hash = { 2764da7f033dSHerbert Xu .vecs = sha224_tv_template, 2765da7f033dSHerbert Xu .count = SHA224_TEST_VECTORS 2766da7f033dSHerbert Xu } 2767da7f033dSHerbert Xu } 2768da7f033dSHerbert Xu }, { 2769da7f033dSHerbert Xu .alg = "sha256", 2770da7f033dSHerbert Xu .test = alg_test_hash, 2771a1915d51SJarod Wilson .fips_allowed = 1, 2772da7f033dSHerbert Xu .suite = { 2773da7f033dSHerbert Xu .hash = { 2774da7f033dSHerbert Xu .vecs = sha256_tv_template, 2775da7f033dSHerbert Xu .count = SHA256_TEST_VECTORS 2776da7f033dSHerbert Xu } 2777da7f033dSHerbert Xu } 2778da7f033dSHerbert Xu }, { 2779da7f033dSHerbert Xu .alg = "sha384", 2780da7f033dSHerbert Xu .test = alg_test_hash, 2781a1915d51SJarod Wilson .fips_allowed = 1, 2782da7f033dSHerbert Xu .suite = { 2783da7f033dSHerbert Xu .hash = { 2784da7f033dSHerbert Xu .vecs = sha384_tv_template, 2785da7f033dSHerbert Xu .count = SHA384_TEST_VECTORS 2786da7f033dSHerbert Xu } 2787da7f033dSHerbert Xu } 2788da7f033dSHerbert Xu }, { 2789da7f033dSHerbert Xu .alg = "sha512", 2790da7f033dSHerbert Xu .test = alg_test_hash, 2791a1915d51SJarod Wilson .fips_allowed = 1, 2792da7f033dSHerbert Xu .suite = { 2793da7f033dSHerbert Xu .hash = { 2794da7f033dSHerbert Xu .vecs = sha512_tv_template, 2795da7f033dSHerbert Xu .count = SHA512_TEST_VECTORS 2796da7f033dSHerbert Xu } 2797da7f033dSHerbert Xu } 2798da7f033dSHerbert Xu }, { 2799da7f033dSHerbert Xu .alg = "tgr128", 2800da7f033dSHerbert Xu .test = alg_test_hash, 2801da7f033dSHerbert Xu .suite = { 2802da7f033dSHerbert Xu .hash = { 2803da7f033dSHerbert Xu .vecs = tgr128_tv_template, 2804da7f033dSHerbert Xu .count = TGR128_TEST_VECTORS 2805da7f033dSHerbert Xu } 2806da7f033dSHerbert Xu } 2807da7f033dSHerbert Xu }, { 2808da7f033dSHerbert Xu .alg = "tgr160", 2809da7f033dSHerbert Xu .test = alg_test_hash, 2810da7f033dSHerbert Xu .suite = { 2811da7f033dSHerbert Xu .hash = { 2812da7f033dSHerbert Xu .vecs = tgr160_tv_template, 2813da7f033dSHerbert Xu .count = TGR160_TEST_VECTORS 2814da7f033dSHerbert Xu } 2815da7f033dSHerbert Xu } 2816da7f033dSHerbert Xu }, { 2817da7f033dSHerbert Xu .alg = "tgr192", 2818da7f033dSHerbert Xu .test = alg_test_hash, 2819da7f033dSHerbert Xu .suite = { 2820da7f033dSHerbert Xu .hash = { 2821da7f033dSHerbert Xu .vecs = tgr192_tv_template, 2822da7f033dSHerbert Xu .count = TGR192_TEST_VECTORS 2823da7f033dSHerbert Xu } 2824da7f033dSHerbert Xu } 2825da7f033dSHerbert Xu }, { 2826f1939f7cSShane Wang .alg = "vmac(aes)", 2827f1939f7cSShane Wang .test = alg_test_hash, 2828f1939f7cSShane Wang .suite = { 2829f1939f7cSShane Wang .hash = { 2830f1939f7cSShane Wang .vecs = aes_vmac128_tv_template, 2831f1939f7cSShane Wang .count = VMAC_AES_TEST_VECTORS 2832f1939f7cSShane Wang } 2833f1939f7cSShane Wang } 2834f1939f7cSShane Wang }, { 2835da7f033dSHerbert Xu .alg = "wp256", 2836da7f033dSHerbert Xu .test = alg_test_hash, 2837da7f033dSHerbert Xu .suite = { 2838da7f033dSHerbert Xu .hash = { 2839da7f033dSHerbert Xu .vecs = wp256_tv_template, 2840da7f033dSHerbert Xu .count = WP256_TEST_VECTORS 2841da7f033dSHerbert Xu } 2842da7f033dSHerbert Xu } 2843da7f033dSHerbert Xu }, { 2844da7f033dSHerbert Xu .alg = "wp384", 2845da7f033dSHerbert Xu .test = alg_test_hash, 2846da7f033dSHerbert Xu .suite = { 2847da7f033dSHerbert Xu .hash = { 2848da7f033dSHerbert Xu .vecs = wp384_tv_template, 2849da7f033dSHerbert Xu .count = WP384_TEST_VECTORS 2850da7f033dSHerbert Xu } 2851da7f033dSHerbert Xu } 2852da7f033dSHerbert Xu }, { 2853da7f033dSHerbert Xu .alg = "wp512", 2854da7f033dSHerbert Xu .test = alg_test_hash, 2855da7f033dSHerbert Xu .suite = { 2856da7f033dSHerbert Xu .hash = { 2857da7f033dSHerbert Xu .vecs = wp512_tv_template, 2858da7f033dSHerbert Xu .count = WP512_TEST_VECTORS 2859da7f033dSHerbert Xu } 2860da7f033dSHerbert Xu } 2861da7f033dSHerbert Xu }, { 2862da7f033dSHerbert Xu .alg = "xcbc(aes)", 2863da7f033dSHerbert Xu .test = alg_test_hash, 2864da7f033dSHerbert Xu .suite = { 2865da7f033dSHerbert Xu .hash = { 2866da7f033dSHerbert Xu .vecs = aes_xcbc128_tv_template, 2867da7f033dSHerbert Xu .count = XCBC_AES_TEST_VECTORS 2868da7f033dSHerbert Xu } 2869da7f033dSHerbert Xu } 2870da7f033dSHerbert Xu }, { 2871da7f033dSHerbert Xu .alg = "xts(aes)", 28721aa4ecd9SHerbert Xu .test = alg_test_skcipher, 28732918aa8dSJarod Wilson .fips_allowed = 1, 2874da7f033dSHerbert Xu .suite = { 2875da7f033dSHerbert Xu .cipher = { 2876da7f033dSHerbert Xu .enc = { 2877da7f033dSHerbert Xu .vecs = aes_xts_enc_tv_template, 2878da7f033dSHerbert Xu .count = AES_XTS_ENC_TEST_VECTORS 2879da7f033dSHerbert Xu }, 2880da7f033dSHerbert Xu .dec = { 2881da7f033dSHerbert Xu .vecs = aes_xts_dec_tv_template, 2882da7f033dSHerbert Xu .count = AES_XTS_DEC_TEST_VECTORS 2883da7f033dSHerbert Xu } 2884da7f033dSHerbert Xu } 2885da7f033dSHerbert Xu } 28860c01aed5SGeert Uytterhoeven }, { 28870840605eSJussi Kivilinna .alg = "xts(camellia)", 28880840605eSJussi Kivilinna .test = alg_test_skcipher, 28890840605eSJussi Kivilinna .suite = { 28900840605eSJussi Kivilinna .cipher = { 28910840605eSJussi Kivilinna .enc = { 28920840605eSJussi Kivilinna .vecs = camellia_xts_enc_tv_template, 28930840605eSJussi Kivilinna .count = CAMELLIA_XTS_ENC_TEST_VECTORS 28940840605eSJussi Kivilinna }, 28950840605eSJussi Kivilinna .dec = { 28960840605eSJussi Kivilinna .vecs = camellia_xts_dec_tv_template, 28970840605eSJussi Kivilinna .count = CAMELLIA_XTS_DEC_TEST_VECTORS 28980840605eSJussi Kivilinna } 28990840605eSJussi Kivilinna } 29000840605eSJussi Kivilinna } 29010840605eSJussi Kivilinna }, { 29029b8b0405SJohannes Goetzfried .alg = "xts(cast6)", 29039b8b0405SJohannes Goetzfried .test = alg_test_skcipher, 29049b8b0405SJohannes Goetzfried .suite = { 29059b8b0405SJohannes Goetzfried .cipher = { 29069b8b0405SJohannes Goetzfried .enc = { 29079b8b0405SJohannes Goetzfried .vecs = cast6_xts_enc_tv_template, 29089b8b0405SJohannes Goetzfried .count = CAST6_XTS_ENC_TEST_VECTORS 29099b8b0405SJohannes Goetzfried }, 29109b8b0405SJohannes Goetzfried .dec = { 29119b8b0405SJohannes Goetzfried .vecs = cast6_xts_dec_tv_template, 29129b8b0405SJohannes Goetzfried .count = CAST6_XTS_DEC_TEST_VECTORS 29139b8b0405SJohannes Goetzfried } 29149b8b0405SJohannes Goetzfried } 29159b8b0405SJohannes Goetzfried } 29169b8b0405SJohannes Goetzfried }, { 291718be20b9SJussi Kivilinna .alg = "xts(serpent)", 291818be20b9SJussi Kivilinna .test = alg_test_skcipher, 291918be20b9SJussi Kivilinna .suite = { 292018be20b9SJussi Kivilinna .cipher = { 292118be20b9SJussi Kivilinna .enc = { 292218be20b9SJussi Kivilinna .vecs = serpent_xts_enc_tv_template, 292318be20b9SJussi Kivilinna .count = SERPENT_XTS_ENC_TEST_VECTORS 292418be20b9SJussi Kivilinna }, 292518be20b9SJussi Kivilinna .dec = { 292618be20b9SJussi Kivilinna .vecs = serpent_xts_dec_tv_template, 292718be20b9SJussi Kivilinna .count = SERPENT_XTS_DEC_TEST_VECTORS 292818be20b9SJussi Kivilinna } 292918be20b9SJussi Kivilinna } 293018be20b9SJussi Kivilinna } 293118be20b9SJussi Kivilinna }, { 2932aed265b9SJussi Kivilinna .alg = "xts(twofish)", 2933aed265b9SJussi Kivilinna .test = alg_test_skcipher, 2934aed265b9SJussi Kivilinna .suite = { 2935aed265b9SJussi Kivilinna .cipher = { 2936aed265b9SJussi Kivilinna .enc = { 2937aed265b9SJussi Kivilinna .vecs = tf_xts_enc_tv_template, 2938aed265b9SJussi Kivilinna .count = TF_XTS_ENC_TEST_VECTORS 2939aed265b9SJussi Kivilinna }, 2940aed265b9SJussi Kivilinna .dec = { 2941aed265b9SJussi Kivilinna .vecs = tf_xts_dec_tv_template, 2942aed265b9SJussi Kivilinna .count = TF_XTS_DEC_TEST_VECTORS 2943aed265b9SJussi Kivilinna } 2944aed265b9SJussi Kivilinna } 2945aed265b9SJussi Kivilinna } 2946aed265b9SJussi Kivilinna }, { 29470c01aed5SGeert Uytterhoeven .alg = "zlib", 29480c01aed5SGeert Uytterhoeven .test = alg_test_pcomp, 29490818904dSMilan Broz .fips_allowed = 1, 29500c01aed5SGeert Uytterhoeven .suite = { 29510c01aed5SGeert Uytterhoeven .pcomp = { 29520c01aed5SGeert Uytterhoeven .comp = { 29530c01aed5SGeert Uytterhoeven .vecs = zlib_comp_tv_template, 29540c01aed5SGeert Uytterhoeven .count = ZLIB_COMP_TEST_VECTORS 29550c01aed5SGeert Uytterhoeven }, 29560c01aed5SGeert Uytterhoeven .decomp = { 29570c01aed5SGeert Uytterhoeven .vecs = zlib_decomp_tv_template, 29580c01aed5SGeert Uytterhoeven .count = ZLIB_DECOMP_TEST_VECTORS 29590c01aed5SGeert Uytterhoeven } 29600c01aed5SGeert Uytterhoeven } 29610c01aed5SGeert Uytterhoeven } 2962da7f033dSHerbert Xu } 2963da7f033dSHerbert Xu }; 2964da7f033dSHerbert Xu 29651aa4ecd9SHerbert Xu static int alg_find_test(const char *alg) 2966da7f033dSHerbert Xu { 2967da7f033dSHerbert Xu int start = 0; 2968da7f033dSHerbert Xu int end = ARRAY_SIZE(alg_test_descs); 2969da7f033dSHerbert Xu 2970da7f033dSHerbert Xu while (start < end) { 2971da7f033dSHerbert Xu int i = (start + end) / 2; 2972da7f033dSHerbert Xu int diff = strcmp(alg_test_descs[i].alg, alg); 2973da7f033dSHerbert Xu 2974da7f033dSHerbert Xu if (diff > 0) { 2975da7f033dSHerbert Xu end = i; 2976da7f033dSHerbert Xu continue; 2977da7f033dSHerbert Xu } 2978da7f033dSHerbert Xu 2979da7f033dSHerbert Xu if (diff < 0) { 2980da7f033dSHerbert Xu start = i + 1; 2981da7f033dSHerbert Xu continue; 2982da7f033dSHerbert Xu } 2983da7f033dSHerbert Xu 29841aa4ecd9SHerbert Xu return i; 2985da7f033dSHerbert Xu } 2986da7f033dSHerbert Xu 29871aa4ecd9SHerbert Xu return -1; 29881aa4ecd9SHerbert Xu } 29891aa4ecd9SHerbert Xu 29901aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 29911aa4ecd9SHerbert Xu { 29921aa4ecd9SHerbert Xu int i; 2993a68f6610SHerbert Xu int j; 2994d12d6b6dSNeil Horman int rc; 29951aa4ecd9SHerbert Xu 29961aa4ecd9SHerbert Xu if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) { 29971aa4ecd9SHerbert Xu char nalg[CRYPTO_MAX_ALG_NAME]; 29981aa4ecd9SHerbert Xu 29991aa4ecd9SHerbert Xu if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >= 30001aa4ecd9SHerbert Xu sizeof(nalg)) 30011aa4ecd9SHerbert Xu return -ENAMETOOLONG; 30021aa4ecd9SHerbert Xu 30031aa4ecd9SHerbert Xu i = alg_find_test(nalg); 30041aa4ecd9SHerbert Xu if (i < 0) 30051aa4ecd9SHerbert Xu goto notest; 30061aa4ecd9SHerbert Xu 3007a3bef3a3SJarod Wilson if (fips_enabled && !alg_test_descs[i].fips_allowed) 3008a3bef3a3SJarod Wilson goto non_fips_alg; 3009a3bef3a3SJarod Wilson 3010941fb328SJarod Wilson rc = alg_test_cipher(alg_test_descs + i, driver, type, mask); 3011941fb328SJarod Wilson goto test_done; 30121aa4ecd9SHerbert Xu } 30131aa4ecd9SHerbert Xu 30141aa4ecd9SHerbert Xu i = alg_find_test(alg); 3015a68f6610SHerbert Xu j = alg_find_test(driver); 3016a68f6610SHerbert Xu if (i < 0 && j < 0) 30171aa4ecd9SHerbert Xu goto notest; 30181aa4ecd9SHerbert Xu 3019a68f6610SHerbert Xu if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) || 3020a68f6610SHerbert Xu (j >= 0 && !alg_test_descs[j].fips_allowed))) 3021a3bef3a3SJarod Wilson goto non_fips_alg; 3022a3bef3a3SJarod Wilson 3023a68f6610SHerbert Xu rc = 0; 3024a68f6610SHerbert Xu if (i >= 0) 3025a68f6610SHerbert Xu rc |= alg_test_descs[i].test(alg_test_descs + i, driver, 30261aa4ecd9SHerbert Xu type, mask); 3027a68f6610SHerbert Xu if (j >= 0) 3028a68f6610SHerbert Xu rc |= alg_test_descs[j].test(alg_test_descs + j, driver, 3029a68f6610SHerbert Xu type, mask); 3030a68f6610SHerbert Xu 3031941fb328SJarod Wilson test_done: 3032d12d6b6dSNeil Horman if (fips_enabled && rc) 3033d12d6b6dSNeil Horman panic("%s: %s alg self test failed in fips mode!\n", driver, alg); 3034d12d6b6dSNeil Horman 303529ecd4abSJarod Wilson if (fips_enabled && !rc) 303629ecd4abSJarod Wilson printk(KERN_INFO "alg: self-tests for %s (%s) passed\n", 303729ecd4abSJarod Wilson driver, alg); 303829ecd4abSJarod Wilson 3039d12d6b6dSNeil Horman return rc; 30401aa4ecd9SHerbert Xu 30411aa4ecd9SHerbert Xu notest: 3042da7f033dSHerbert Xu printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver); 3043da7f033dSHerbert Xu return 0; 3044a3bef3a3SJarod Wilson non_fips_alg: 3045a3bef3a3SJarod Wilson return -EINVAL; 3046da7f033dSHerbert Xu } 30470b767f96SAlexander Shishkin 3048326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */ 30490b767f96SAlexander Shishkin 3050da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test); 3051