1da7f033dSHerbert Xu /* 2da7f033dSHerbert Xu * Algorithm testing framework and tests. 3da7f033dSHerbert Xu * 4da7f033dSHerbert Xu * Copyright (c) 2002 James Morris <jmorris@intercode.com.au> 5da7f033dSHerbert Xu * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org> 6da7f033dSHerbert Xu * Copyright (c) 2007 Nokia Siemens Networks 7da7f033dSHerbert Xu * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au> 8da7f033dSHerbert Xu * 9da7f033dSHerbert Xu * This program is free software; you can redistribute it and/or modify it 10da7f033dSHerbert Xu * under the terms of the GNU General Public License as published by the Free 11da7f033dSHerbert Xu * Software Foundation; either version 2 of the License, or (at your option) 12da7f033dSHerbert Xu * any later version. 13da7f033dSHerbert Xu * 14da7f033dSHerbert Xu */ 15da7f033dSHerbert Xu 16da7f033dSHerbert Xu #include <crypto/hash.h> 17da7f033dSHerbert Xu #include <linux/err.h> 18da7f033dSHerbert Xu #include <linux/module.h> 19da7f033dSHerbert Xu #include <linux/scatterlist.h> 20da7f033dSHerbert Xu #include <linux/slab.h> 21da7f033dSHerbert Xu #include <linux/string.h> 22da7f033dSHerbert Xu 23da7f033dSHerbert Xu #include "internal.h" 24da7f033dSHerbert Xu #include "testmgr.h" 25da7f033dSHerbert Xu 26da7f033dSHerbert Xu /* 27da7f033dSHerbert Xu * Need slab memory for testing (size in number of pages). 28da7f033dSHerbert Xu */ 29da7f033dSHerbert Xu #define XBUFSIZE 8 30da7f033dSHerbert Xu 31da7f033dSHerbert Xu /* 32da7f033dSHerbert Xu * Indexes into the xbuf to simulate cross-page access. 33da7f033dSHerbert Xu */ 34da7f033dSHerbert Xu #define IDX1 32 35da7f033dSHerbert Xu #define IDX2 32400 36da7f033dSHerbert Xu #define IDX3 1 37da7f033dSHerbert Xu #define IDX4 8193 38da7f033dSHerbert Xu #define IDX5 22222 39da7f033dSHerbert Xu #define IDX6 17101 40da7f033dSHerbert Xu #define IDX7 27333 41da7f033dSHerbert Xu #define IDX8 3000 42da7f033dSHerbert Xu 43da7f033dSHerbert Xu /* 44da7f033dSHerbert Xu * Used by test_cipher() 45da7f033dSHerbert Xu */ 46da7f033dSHerbert Xu #define ENCRYPT 1 47da7f033dSHerbert Xu #define DECRYPT 0 48da7f033dSHerbert Xu 49da7f033dSHerbert Xu struct tcrypt_result { 50da7f033dSHerbert Xu struct completion completion; 51da7f033dSHerbert Xu int err; 52da7f033dSHerbert Xu }; 53da7f033dSHerbert Xu 54da7f033dSHerbert Xu struct aead_test_suite { 55da7f033dSHerbert Xu struct { 56da7f033dSHerbert Xu struct aead_testvec *vecs; 57da7f033dSHerbert Xu unsigned int count; 58da7f033dSHerbert Xu } enc, dec; 59da7f033dSHerbert Xu }; 60da7f033dSHerbert Xu 61da7f033dSHerbert Xu struct cipher_test_suite { 62da7f033dSHerbert Xu struct { 63da7f033dSHerbert Xu struct cipher_testvec *vecs; 64da7f033dSHerbert Xu unsigned int count; 65da7f033dSHerbert Xu } enc, dec; 66da7f033dSHerbert Xu }; 67da7f033dSHerbert Xu 68da7f033dSHerbert Xu struct comp_test_suite { 69da7f033dSHerbert Xu struct { 70da7f033dSHerbert Xu struct comp_testvec *vecs; 71da7f033dSHerbert Xu unsigned int count; 72da7f033dSHerbert Xu } comp, decomp; 73da7f033dSHerbert Xu }; 74da7f033dSHerbert Xu 758064efb8SGeert Uytterhoeven struct pcomp_test_suite { 768064efb8SGeert Uytterhoeven struct { 778064efb8SGeert Uytterhoeven struct pcomp_testvec *vecs; 788064efb8SGeert Uytterhoeven unsigned int count; 798064efb8SGeert Uytterhoeven } comp, decomp; 808064efb8SGeert Uytterhoeven }; 818064efb8SGeert Uytterhoeven 82da7f033dSHerbert Xu struct hash_test_suite { 83da7f033dSHerbert Xu struct hash_testvec *vecs; 84da7f033dSHerbert Xu unsigned int count; 85da7f033dSHerbert Xu }; 86da7f033dSHerbert Xu 87da7f033dSHerbert Xu struct alg_test_desc { 88da7f033dSHerbert Xu const char *alg; 89da7f033dSHerbert Xu int (*test)(const struct alg_test_desc *desc, const char *driver, 90da7f033dSHerbert Xu u32 type, u32 mask); 91da7f033dSHerbert Xu 92da7f033dSHerbert Xu union { 93da7f033dSHerbert Xu struct aead_test_suite aead; 94da7f033dSHerbert Xu struct cipher_test_suite cipher; 95da7f033dSHerbert Xu struct comp_test_suite comp; 968064efb8SGeert Uytterhoeven struct pcomp_test_suite pcomp; 97da7f033dSHerbert Xu struct hash_test_suite hash; 98da7f033dSHerbert Xu } suite; 99da7f033dSHerbert Xu }; 100da7f033dSHerbert Xu 101da7f033dSHerbert Xu static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 }; 102da7f033dSHerbert Xu 103da7f033dSHerbert Xu static char *xbuf[XBUFSIZE]; 104da7f033dSHerbert Xu static char *axbuf[XBUFSIZE]; 105da7f033dSHerbert Xu 106da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len) 107da7f033dSHerbert Xu { 108da7f033dSHerbert Xu print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET, 109da7f033dSHerbert Xu 16, 1, 110da7f033dSHerbert Xu buf, len, false); 111da7f033dSHerbert Xu } 112da7f033dSHerbert Xu 113da7f033dSHerbert Xu static void tcrypt_complete(struct crypto_async_request *req, int err) 114da7f033dSHerbert Xu { 115da7f033dSHerbert Xu struct tcrypt_result *res = req->data; 116da7f033dSHerbert Xu 117da7f033dSHerbert Xu if (err == -EINPROGRESS) 118da7f033dSHerbert Xu return; 119da7f033dSHerbert Xu 120da7f033dSHerbert Xu res->err = err; 121da7f033dSHerbert Xu complete(&res->completion); 122da7f033dSHerbert Xu } 123da7f033dSHerbert Xu 124da7f033dSHerbert Xu static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template, 125da7f033dSHerbert Xu unsigned int tcount) 126da7f033dSHerbert Xu { 127da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm)); 128da7f033dSHerbert Xu unsigned int i, j, k, temp; 129da7f033dSHerbert Xu struct scatterlist sg[8]; 130da7f033dSHerbert Xu char result[64]; 131da7f033dSHerbert Xu struct ahash_request *req; 132da7f033dSHerbert Xu struct tcrypt_result tresult; 133da7f033dSHerbert Xu int ret; 134da7f033dSHerbert Xu void *hash_buff; 135da7f033dSHerbert Xu 136da7f033dSHerbert Xu init_completion(&tresult.completion); 137da7f033dSHerbert Xu 138da7f033dSHerbert Xu req = ahash_request_alloc(tfm, GFP_KERNEL); 139da7f033dSHerbert Xu if (!req) { 140da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to allocate request for " 141da7f033dSHerbert Xu "%s\n", algo); 142da7f033dSHerbert Xu ret = -ENOMEM; 143da7f033dSHerbert Xu goto out_noreq; 144da7f033dSHerbert Xu } 145da7f033dSHerbert Xu ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 146da7f033dSHerbert Xu tcrypt_complete, &tresult); 147da7f033dSHerbert Xu 148da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 149da7f033dSHerbert Xu memset(result, 0, 64); 150da7f033dSHerbert Xu 151da7f033dSHerbert Xu hash_buff = xbuf[0]; 152da7f033dSHerbert Xu 153da7f033dSHerbert Xu memcpy(hash_buff, template[i].plaintext, template[i].psize); 154da7f033dSHerbert Xu sg_init_one(&sg[0], hash_buff, template[i].psize); 155da7f033dSHerbert Xu 156da7f033dSHerbert Xu if (template[i].ksize) { 157da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 158da7f033dSHerbert Xu ret = crypto_ahash_setkey(tfm, template[i].key, 159da7f033dSHerbert Xu template[i].ksize); 160da7f033dSHerbert Xu if (ret) { 161da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey failed on " 162da7f033dSHerbert Xu "test %d for %s: ret=%d\n", i + 1, algo, 163da7f033dSHerbert Xu -ret); 164da7f033dSHerbert Xu goto out; 165da7f033dSHerbert Xu } 166da7f033dSHerbert Xu } 167da7f033dSHerbert Xu 168da7f033dSHerbert Xu ahash_request_set_crypt(req, sg, result, template[i].psize); 169da7f033dSHerbert Xu ret = crypto_ahash_digest(req); 170da7f033dSHerbert Xu switch (ret) { 171da7f033dSHerbert Xu case 0: 172da7f033dSHerbert Xu break; 173da7f033dSHerbert Xu case -EINPROGRESS: 174da7f033dSHerbert Xu case -EBUSY: 175da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 176da7f033dSHerbert Xu &tresult.completion); 177da7f033dSHerbert Xu if (!ret && !(ret = tresult.err)) { 178da7f033dSHerbert Xu INIT_COMPLETION(tresult.completion); 179da7f033dSHerbert Xu break; 180da7f033dSHerbert Xu } 181da7f033dSHerbert Xu /* fall through */ 182da7f033dSHerbert Xu default: 183da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: digest failed on test %d " 184da7f033dSHerbert Xu "for %s: ret=%d\n", i + 1, algo, -ret); 185da7f033dSHerbert Xu goto out; 186da7f033dSHerbert Xu } 187da7f033dSHerbert Xu 188da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 189da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 190da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Test %d failed for %s\n", 191da7f033dSHerbert Xu i + 1, algo); 192da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 193da7f033dSHerbert Xu ret = -EINVAL; 194da7f033dSHerbert Xu goto out; 195da7f033dSHerbert Xu } 196da7f033dSHerbert Xu } 197da7f033dSHerbert Xu 198da7f033dSHerbert Xu j = 0; 199da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 200da7f033dSHerbert Xu if (template[i].np) { 201da7f033dSHerbert Xu j++; 202da7f033dSHerbert Xu memset(result, 0, 64); 203da7f033dSHerbert Xu 204da7f033dSHerbert Xu temp = 0; 205da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 206da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 207da7f033dSHerbert Xu sg_set_buf(&sg[k], 208da7f033dSHerbert Xu memcpy(xbuf[IDX[k] >> PAGE_SHIFT] + 209da7f033dSHerbert Xu offset_in_page(IDX[k]), 210da7f033dSHerbert Xu template[i].plaintext + temp, 211da7f033dSHerbert Xu template[i].tap[k]), 212da7f033dSHerbert Xu template[i].tap[k]); 213da7f033dSHerbert Xu temp += template[i].tap[k]; 214da7f033dSHerbert Xu } 215da7f033dSHerbert Xu 216da7f033dSHerbert Xu if (template[i].ksize) { 217da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 218da7f033dSHerbert Xu ret = crypto_ahash_setkey(tfm, template[i].key, 219da7f033dSHerbert Xu template[i].ksize); 220da7f033dSHerbert Xu 221da7f033dSHerbert Xu if (ret) { 222da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey " 223da7f033dSHerbert Xu "failed on chunking test %d " 224da7f033dSHerbert Xu "for %s: ret=%d\n", j, algo, 225da7f033dSHerbert Xu -ret); 226da7f033dSHerbert Xu goto out; 227da7f033dSHerbert Xu } 228da7f033dSHerbert Xu } 229da7f033dSHerbert Xu 230da7f033dSHerbert Xu ahash_request_set_crypt(req, sg, result, 231da7f033dSHerbert Xu template[i].psize); 232da7f033dSHerbert Xu ret = crypto_ahash_digest(req); 233da7f033dSHerbert Xu switch (ret) { 234da7f033dSHerbert Xu case 0: 235da7f033dSHerbert Xu break; 236da7f033dSHerbert Xu case -EINPROGRESS: 237da7f033dSHerbert Xu case -EBUSY: 238da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 239da7f033dSHerbert Xu &tresult.completion); 240da7f033dSHerbert Xu if (!ret && !(ret = tresult.err)) { 241da7f033dSHerbert Xu INIT_COMPLETION(tresult.completion); 242da7f033dSHerbert Xu break; 243da7f033dSHerbert Xu } 244da7f033dSHerbert Xu /* fall through */ 245da7f033dSHerbert Xu default: 246da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: digest failed " 247da7f033dSHerbert Xu "on chunking test %d for %s: " 248da7f033dSHerbert Xu "ret=%d\n", j, algo, -ret); 249da7f033dSHerbert Xu goto out; 250da7f033dSHerbert Xu } 251da7f033dSHerbert Xu 252da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 253da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 254da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Chunking test %d " 255da7f033dSHerbert Xu "failed for %s\n", j, algo); 256da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 257da7f033dSHerbert Xu ret = -EINVAL; 258da7f033dSHerbert Xu goto out; 259da7f033dSHerbert Xu } 260da7f033dSHerbert Xu } 261da7f033dSHerbert Xu } 262da7f033dSHerbert Xu 263da7f033dSHerbert Xu ret = 0; 264da7f033dSHerbert Xu 265da7f033dSHerbert Xu out: 266da7f033dSHerbert Xu ahash_request_free(req); 267da7f033dSHerbert Xu out_noreq: 268da7f033dSHerbert Xu return ret; 269da7f033dSHerbert Xu } 270da7f033dSHerbert Xu 271da7f033dSHerbert Xu static int test_aead(struct crypto_aead *tfm, int enc, 272da7f033dSHerbert Xu struct aead_testvec *template, unsigned int tcount) 273da7f033dSHerbert Xu { 274da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)); 275da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 276da7f033dSHerbert Xu int ret = 0; 277da7f033dSHerbert Xu char *q; 278da7f033dSHerbert Xu char *key; 279da7f033dSHerbert Xu struct aead_request *req; 280da7f033dSHerbert Xu struct scatterlist sg[8]; 281da7f033dSHerbert Xu struct scatterlist asg[8]; 282da7f033dSHerbert Xu const char *e; 283da7f033dSHerbert Xu struct tcrypt_result result; 284da7f033dSHerbert Xu unsigned int authsize; 285da7f033dSHerbert Xu void *input; 286da7f033dSHerbert Xu void *assoc; 287da7f033dSHerbert Xu char iv[MAX_IVLEN]; 288da7f033dSHerbert Xu 289da7f033dSHerbert Xu if (enc == ENCRYPT) 290da7f033dSHerbert Xu e = "encryption"; 291da7f033dSHerbert Xu else 292da7f033dSHerbert Xu e = "decryption"; 293da7f033dSHerbert Xu 294da7f033dSHerbert Xu init_completion(&result.completion); 295da7f033dSHerbert Xu 296da7f033dSHerbert Xu req = aead_request_alloc(tfm, GFP_KERNEL); 297da7f033dSHerbert Xu if (!req) { 298da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to allocate request for " 299da7f033dSHerbert Xu "%s\n", algo); 300da7f033dSHerbert Xu ret = -ENOMEM; 301da7f033dSHerbert Xu goto out; 302da7f033dSHerbert Xu } 303da7f033dSHerbert Xu 304da7f033dSHerbert Xu aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 305da7f033dSHerbert Xu tcrypt_complete, &result); 306da7f033dSHerbert Xu 307da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 308da7f033dSHerbert Xu if (!template[i].np) { 309da7f033dSHerbert Xu j++; 310da7f033dSHerbert Xu 311da7f033dSHerbert Xu /* some tepmplates have no input data but they will 312da7f033dSHerbert Xu * touch input 313da7f033dSHerbert Xu */ 314da7f033dSHerbert Xu input = xbuf[0]; 315da7f033dSHerbert Xu assoc = axbuf[0]; 316da7f033dSHerbert Xu 317da7f033dSHerbert Xu memcpy(input, template[i].input, template[i].ilen); 318da7f033dSHerbert Xu memcpy(assoc, template[i].assoc, template[i].alen); 319da7f033dSHerbert Xu if (template[i].iv) 320da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 321da7f033dSHerbert Xu else 322da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 323da7f033dSHerbert Xu 324da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 325da7f033dSHerbert Xu if (template[i].wk) 326da7f033dSHerbert Xu crypto_aead_set_flags( 327da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 328da7f033dSHerbert Xu 329da7f033dSHerbert Xu key = template[i].key; 330da7f033dSHerbert Xu 331da7f033dSHerbert Xu ret = crypto_aead_setkey(tfm, key, 332da7f033dSHerbert Xu template[i].klen); 333da7f033dSHerbert Xu if (!ret == template[i].fail) { 334da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: setkey failed on " 335da7f033dSHerbert Xu "test %d for %s: flags=%x\n", j, algo, 336da7f033dSHerbert Xu crypto_aead_get_flags(tfm)); 337da7f033dSHerbert Xu goto out; 338da7f033dSHerbert Xu } else if (ret) 339da7f033dSHerbert Xu continue; 340da7f033dSHerbert Xu 341da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 342da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 343da7f033dSHerbert Xu if (ret) { 344da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to set " 345da7f033dSHerbert Xu "authsize to %u on test %d for %s\n", 346da7f033dSHerbert Xu authsize, j, algo); 347da7f033dSHerbert Xu goto out; 348da7f033dSHerbert Xu } 349da7f033dSHerbert Xu 350da7f033dSHerbert Xu sg_init_one(&sg[0], input, 351da7f033dSHerbert Xu template[i].ilen + (enc ? authsize : 0)); 352da7f033dSHerbert Xu 353da7f033dSHerbert Xu sg_init_one(&asg[0], assoc, template[i].alen); 354da7f033dSHerbert Xu 355da7f033dSHerbert Xu aead_request_set_crypt(req, sg, sg, 356da7f033dSHerbert Xu template[i].ilen, iv); 357da7f033dSHerbert Xu 358da7f033dSHerbert Xu aead_request_set_assoc(req, asg, template[i].alen); 359da7f033dSHerbert Xu 360da7f033dSHerbert Xu ret = enc ? 361da7f033dSHerbert Xu crypto_aead_encrypt(req) : 362da7f033dSHerbert Xu crypto_aead_decrypt(req); 363da7f033dSHerbert Xu 364da7f033dSHerbert Xu switch (ret) { 365da7f033dSHerbert Xu case 0: 366e44a1b44SJarod Wilson if (template[i].novrfy) { 367e44a1b44SJarod Wilson /* verification was supposed to fail */ 368e44a1b44SJarod Wilson printk(KERN_ERR "alg: aead: %s failed " 369e44a1b44SJarod Wilson "on test %d for %s: ret was 0, " 370e44a1b44SJarod Wilson "expected -EBADMSG\n", 371e44a1b44SJarod Wilson e, j, algo); 372e44a1b44SJarod Wilson /* so really, we got a bad message */ 373e44a1b44SJarod Wilson ret = -EBADMSG; 374e44a1b44SJarod Wilson goto out; 375e44a1b44SJarod Wilson } 376da7f033dSHerbert Xu break; 377da7f033dSHerbert Xu case -EINPROGRESS: 378da7f033dSHerbert Xu case -EBUSY: 379da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 380da7f033dSHerbert Xu &result.completion); 381da7f033dSHerbert Xu if (!ret && !(ret = result.err)) { 382da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 383da7f033dSHerbert Xu break; 384da7f033dSHerbert Xu } 385e44a1b44SJarod Wilson case -EBADMSG: 386e44a1b44SJarod Wilson if (template[i].novrfy) 387e44a1b44SJarod Wilson /* verification failure was expected */ 388e44a1b44SJarod Wilson continue; 389da7f033dSHerbert Xu /* fall through */ 390da7f033dSHerbert Xu default: 391da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: %s failed on test " 392da7f033dSHerbert Xu "%d for %s: ret=%d\n", e, j, algo, -ret); 393da7f033dSHerbert Xu goto out; 394da7f033dSHerbert Xu } 395da7f033dSHerbert Xu 396da7f033dSHerbert Xu q = input; 397da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 398da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Test %d failed on " 399da7f033dSHerbert Xu "%s for %s\n", j, e, algo); 400da7f033dSHerbert Xu hexdump(q, template[i].rlen); 401da7f033dSHerbert Xu ret = -EINVAL; 402da7f033dSHerbert Xu goto out; 403da7f033dSHerbert Xu } 404da7f033dSHerbert Xu } 405da7f033dSHerbert Xu } 406da7f033dSHerbert Xu 407da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 408da7f033dSHerbert Xu if (template[i].np) { 409da7f033dSHerbert Xu j++; 410da7f033dSHerbert Xu 411da7f033dSHerbert Xu if (template[i].iv) 412da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 413da7f033dSHerbert Xu else 414da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 415da7f033dSHerbert Xu 416da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 417da7f033dSHerbert Xu if (template[i].wk) 418da7f033dSHerbert Xu crypto_aead_set_flags( 419da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 420da7f033dSHerbert Xu key = template[i].key; 421da7f033dSHerbert Xu 422da7f033dSHerbert Xu ret = crypto_aead_setkey(tfm, key, template[i].klen); 423da7f033dSHerbert Xu if (!ret == template[i].fail) { 424da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: setkey failed on " 425da7f033dSHerbert Xu "chunk test %d for %s: flags=%x\n", j, 426da7f033dSHerbert Xu algo, crypto_aead_get_flags(tfm)); 427da7f033dSHerbert Xu goto out; 428da7f033dSHerbert Xu } else if (ret) 429da7f033dSHerbert Xu continue; 430da7f033dSHerbert Xu 431da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 432da7f033dSHerbert Xu 433da7f033dSHerbert Xu ret = -EINVAL; 434da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 435da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 436da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 437da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 438da7f033dSHerbert Xu goto out; 439da7f033dSHerbert Xu 440da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 441da7f033dSHerbert Xu offset_in_page(IDX[k]); 442da7f033dSHerbert Xu 443da7f033dSHerbert Xu memcpy(q, template[i].input + temp, 444da7f033dSHerbert Xu template[i].tap[k]); 445da7f033dSHerbert Xu 446da7f033dSHerbert Xu n = template[i].tap[k]; 447da7f033dSHerbert Xu if (k == template[i].np - 1 && enc) 448da7f033dSHerbert Xu n += authsize; 449da7f033dSHerbert Xu if (offset_in_page(q) + n < PAGE_SIZE) 450da7f033dSHerbert Xu q[n] = 0; 451da7f033dSHerbert Xu 452da7f033dSHerbert Xu sg_set_buf(&sg[k], q, template[i].tap[k]); 453da7f033dSHerbert Xu temp += template[i].tap[k]; 454da7f033dSHerbert Xu } 455da7f033dSHerbert Xu 456da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 457da7f033dSHerbert Xu if (ret) { 458da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to set " 459da7f033dSHerbert Xu "authsize to %u on chunk test %d for " 460da7f033dSHerbert Xu "%s\n", authsize, j, algo); 461da7f033dSHerbert Xu goto out; 462da7f033dSHerbert Xu } 463da7f033dSHerbert Xu 464da7f033dSHerbert Xu if (enc) { 465da7f033dSHerbert Xu if (WARN_ON(sg[k - 1].offset + 466da7f033dSHerbert Xu sg[k - 1].length + authsize > 467da7f033dSHerbert Xu PAGE_SIZE)) { 468da7f033dSHerbert Xu ret = -EINVAL; 469da7f033dSHerbert Xu goto out; 470da7f033dSHerbert Xu } 471da7f033dSHerbert Xu 472da7f033dSHerbert Xu sg[k - 1].length += authsize; 473da7f033dSHerbert Xu } 474da7f033dSHerbert Xu 475da7f033dSHerbert Xu sg_init_table(asg, template[i].anp); 476da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].anp; k++) { 477da7f033dSHerbert Xu sg_set_buf(&asg[k], 478da7f033dSHerbert Xu memcpy(axbuf[IDX[k] >> PAGE_SHIFT] + 479da7f033dSHerbert Xu offset_in_page(IDX[k]), 480da7f033dSHerbert Xu template[i].assoc + temp, 481da7f033dSHerbert Xu template[i].atap[k]), 482da7f033dSHerbert Xu template[i].atap[k]); 483da7f033dSHerbert Xu temp += template[i].atap[k]; 484da7f033dSHerbert Xu } 485da7f033dSHerbert Xu 486da7f033dSHerbert Xu aead_request_set_crypt(req, sg, sg, 487da7f033dSHerbert Xu template[i].ilen, 488da7f033dSHerbert Xu iv); 489da7f033dSHerbert Xu 490da7f033dSHerbert Xu aead_request_set_assoc(req, asg, template[i].alen); 491da7f033dSHerbert Xu 492da7f033dSHerbert Xu ret = enc ? 493da7f033dSHerbert Xu crypto_aead_encrypt(req) : 494da7f033dSHerbert Xu crypto_aead_decrypt(req); 495da7f033dSHerbert Xu 496da7f033dSHerbert Xu switch (ret) { 497da7f033dSHerbert Xu case 0: 498e44a1b44SJarod Wilson if (template[i].novrfy) { 499e44a1b44SJarod Wilson /* verification was supposed to fail */ 500e44a1b44SJarod Wilson printk(KERN_ERR "alg: aead: %s failed " 501e44a1b44SJarod Wilson "on chunk test %d for %s: ret " 502e44a1b44SJarod Wilson "was 0, expected -EBADMSG\n", 503e44a1b44SJarod Wilson e, j, algo); 504e44a1b44SJarod Wilson /* so really, we got a bad message */ 505e44a1b44SJarod Wilson ret = -EBADMSG; 506e44a1b44SJarod Wilson goto out; 507e44a1b44SJarod Wilson } 508da7f033dSHerbert Xu break; 509da7f033dSHerbert Xu case -EINPROGRESS: 510da7f033dSHerbert Xu case -EBUSY: 511da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 512da7f033dSHerbert Xu &result.completion); 513da7f033dSHerbert Xu if (!ret && !(ret = result.err)) { 514da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 515da7f033dSHerbert Xu break; 516da7f033dSHerbert Xu } 517e44a1b44SJarod Wilson case -EBADMSG: 518e44a1b44SJarod Wilson if (template[i].novrfy) 519e44a1b44SJarod Wilson /* verification failure was expected */ 520e44a1b44SJarod Wilson continue; 521da7f033dSHerbert Xu /* fall through */ 522da7f033dSHerbert Xu default: 523da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: %s failed on " 524da7f033dSHerbert Xu "chunk test %d for %s: ret=%d\n", e, j, 525da7f033dSHerbert Xu algo, -ret); 526da7f033dSHerbert Xu goto out; 527da7f033dSHerbert Xu } 528da7f033dSHerbert Xu 529da7f033dSHerbert Xu ret = -EINVAL; 530da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 531da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 532da7f033dSHerbert Xu offset_in_page(IDX[k]); 533da7f033dSHerbert Xu 534da7f033dSHerbert Xu n = template[i].tap[k]; 535da7f033dSHerbert Xu if (k == template[i].np - 1) 536da7f033dSHerbert Xu n += enc ? authsize : -authsize; 537da7f033dSHerbert Xu 538da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, n)) { 539da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Chunk " 540da7f033dSHerbert Xu "test %d failed on %s at page " 541da7f033dSHerbert Xu "%u for %s\n", j, e, k, algo); 542da7f033dSHerbert Xu hexdump(q, n); 543da7f033dSHerbert Xu goto out; 544da7f033dSHerbert Xu } 545da7f033dSHerbert Xu 546da7f033dSHerbert Xu q += n; 547da7f033dSHerbert Xu if (k == template[i].np - 1 && !enc) { 548da7f033dSHerbert Xu if (memcmp(q, template[i].input + 549da7f033dSHerbert Xu temp + n, authsize)) 550da7f033dSHerbert Xu n = authsize; 551da7f033dSHerbert Xu else 552da7f033dSHerbert Xu n = 0; 553da7f033dSHerbert Xu } else { 554da7f033dSHerbert Xu for (n = 0; offset_in_page(q + n) && 555da7f033dSHerbert Xu q[n]; n++) 556da7f033dSHerbert Xu ; 557da7f033dSHerbert Xu } 558da7f033dSHerbert Xu if (n) { 559da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Result " 560da7f033dSHerbert Xu "buffer corruption in chunk " 561da7f033dSHerbert Xu "test %d on %s at page %u for " 562da7f033dSHerbert Xu "%s: %u bytes:\n", j, e, k, 563da7f033dSHerbert Xu algo, n); 564da7f033dSHerbert Xu hexdump(q, n); 565da7f033dSHerbert Xu goto out; 566da7f033dSHerbert Xu } 567da7f033dSHerbert Xu 568da7f033dSHerbert Xu temp += template[i].tap[k]; 569da7f033dSHerbert Xu } 570da7f033dSHerbert Xu } 571da7f033dSHerbert Xu } 572da7f033dSHerbert Xu 573da7f033dSHerbert Xu ret = 0; 574da7f033dSHerbert Xu 575da7f033dSHerbert Xu out: 576da7f033dSHerbert Xu aead_request_free(req); 577da7f033dSHerbert Xu return ret; 578da7f033dSHerbert Xu } 579da7f033dSHerbert Xu 5801aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc, 5811aa4ecd9SHerbert Xu struct cipher_testvec *template, unsigned int tcount) 5821aa4ecd9SHerbert Xu { 5831aa4ecd9SHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm)); 5841aa4ecd9SHerbert Xu unsigned int i, j, k; 5851aa4ecd9SHerbert Xu int ret; 5861aa4ecd9SHerbert Xu char *q; 5871aa4ecd9SHerbert Xu const char *e; 5881aa4ecd9SHerbert Xu void *data; 5891aa4ecd9SHerbert Xu 5901aa4ecd9SHerbert Xu if (enc == ENCRYPT) 5911aa4ecd9SHerbert Xu e = "encryption"; 5921aa4ecd9SHerbert Xu else 5931aa4ecd9SHerbert Xu e = "decryption"; 5941aa4ecd9SHerbert Xu 5951aa4ecd9SHerbert Xu j = 0; 5961aa4ecd9SHerbert Xu for (i = 0; i < tcount; i++) { 5971aa4ecd9SHerbert Xu if (template[i].np) 5981aa4ecd9SHerbert Xu continue; 5991aa4ecd9SHerbert Xu 6001aa4ecd9SHerbert Xu j++; 6011aa4ecd9SHerbert Xu 6021aa4ecd9SHerbert Xu data = xbuf[0]; 6031aa4ecd9SHerbert Xu memcpy(data, template[i].input, template[i].ilen); 6041aa4ecd9SHerbert Xu 6051aa4ecd9SHerbert Xu crypto_cipher_clear_flags(tfm, ~0); 6061aa4ecd9SHerbert Xu if (template[i].wk) 6071aa4ecd9SHerbert Xu crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 6081aa4ecd9SHerbert Xu 6091aa4ecd9SHerbert Xu ret = crypto_cipher_setkey(tfm, template[i].key, 6101aa4ecd9SHerbert Xu template[i].klen); 6111aa4ecd9SHerbert Xu if (!ret == template[i].fail) { 6121aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: setkey failed " 6131aa4ecd9SHerbert Xu "on test %d for %s: flags=%x\n", j, 6141aa4ecd9SHerbert Xu algo, crypto_cipher_get_flags(tfm)); 6151aa4ecd9SHerbert Xu goto out; 6161aa4ecd9SHerbert Xu } else if (ret) 6171aa4ecd9SHerbert Xu continue; 6181aa4ecd9SHerbert Xu 6191aa4ecd9SHerbert Xu for (k = 0; k < template[i].ilen; 6201aa4ecd9SHerbert Xu k += crypto_cipher_blocksize(tfm)) { 6211aa4ecd9SHerbert Xu if (enc) 6221aa4ecd9SHerbert Xu crypto_cipher_encrypt_one(tfm, data + k, 6231aa4ecd9SHerbert Xu data + k); 6241aa4ecd9SHerbert Xu else 6251aa4ecd9SHerbert Xu crypto_cipher_decrypt_one(tfm, data + k, 6261aa4ecd9SHerbert Xu data + k); 6271aa4ecd9SHerbert Xu } 6281aa4ecd9SHerbert Xu 6291aa4ecd9SHerbert Xu q = data; 6301aa4ecd9SHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 6311aa4ecd9SHerbert Xu printk(KERN_ERR "alg: cipher: Test %d failed " 6321aa4ecd9SHerbert Xu "on %s for %s\n", j, e, algo); 6331aa4ecd9SHerbert Xu hexdump(q, template[i].rlen); 6341aa4ecd9SHerbert Xu ret = -EINVAL; 6351aa4ecd9SHerbert Xu goto out; 6361aa4ecd9SHerbert Xu } 6371aa4ecd9SHerbert Xu } 6381aa4ecd9SHerbert Xu 6391aa4ecd9SHerbert Xu ret = 0; 6401aa4ecd9SHerbert Xu 6411aa4ecd9SHerbert Xu out: 6421aa4ecd9SHerbert Xu return ret; 6431aa4ecd9SHerbert Xu } 6441aa4ecd9SHerbert Xu 6451aa4ecd9SHerbert Xu static int test_skcipher(struct crypto_ablkcipher *tfm, int enc, 646da7f033dSHerbert Xu struct cipher_testvec *template, unsigned int tcount) 647da7f033dSHerbert Xu { 648da7f033dSHerbert Xu const char *algo = 649da7f033dSHerbert Xu crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm)); 650da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 651da7f033dSHerbert Xu int ret; 652da7f033dSHerbert Xu char *q; 653da7f033dSHerbert Xu struct ablkcipher_request *req; 654da7f033dSHerbert Xu struct scatterlist sg[8]; 655da7f033dSHerbert Xu const char *e; 656da7f033dSHerbert Xu struct tcrypt_result result; 657da7f033dSHerbert Xu void *data; 658da7f033dSHerbert Xu char iv[MAX_IVLEN]; 659da7f033dSHerbert Xu 660da7f033dSHerbert Xu if (enc == ENCRYPT) 661da7f033dSHerbert Xu e = "encryption"; 662da7f033dSHerbert Xu else 663da7f033dSHerbert Xu e = "decryption"; 664da7f033dSHerbert Xu 665da7f033dSHerbert Xu init_completion(&result.completion); 666da7f033dSHerbert Xu 667da7f033dSHerbert Xu req = ablkcipher_request_alloc(tfm, GFP_KERNEL); 668da7f033dSHerbert Xu if (!req) { 6691aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Failed to allocate request " 6701aa4ecd9SHerbert Xu "for %s\n", algo); 671da7f033dSHerbert Xu ret = -ENOMEM; 672da7f033dSHerbert Xu goto out; 673da7f033dSHerbert Xu } 674da7f033dSHerbert Xu 675da7f033dSHerbert Xu ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 676da7f033dSHerbert Xu tcrypt_complete, &result); 677da7f033dSHerbert Xu 678da7f033dSHerbert Xu j = 0; 679da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 680da7f033dSHerbert Xu if (template[i].iv) 681da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 682da7f033dSHerbert Xu else 683da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 684da7f033dSHerbert Xu 685da7f033dSHerbert Xu if (!(template[i].np)) { 686da7f033dSHerbert Xu j++; 687da7f033dSHerbert Xu 688da7f033dSHerbert Xu data = xbuf[0]; 689da7f033dSHerbert Xu memcpy(data, template[i].input, template[i].ilen); 690da7f033dSHerbert Xu 691da7f033dSHerbert Xu crypto_ablkcipher_clear_flags(tfm, ~0); 692da7f033dSHerbert Xu if (template[i].wk) 693da7f033dSHerbert Xu crypto_ablkcipher_set_flags( 694da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 695da7f033dSHerbert Xu 696da7f033dSHerbert Xu ret = crypto_ablkcipher_setkey(tfm, template[i].key, 697da7f033dSHerbert Xu template[i].klen); 698da7f033dSHerbert Xu if (!ret == template[i].fail) { 6991aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: setkey failed " 700da7f033dSHerbert Xu "on test %d for %s: flags=%x\n", j, 701da7f033dSHerbert Xu algo, crypto_ablkcipher_get_flags(tfm)); 702da7f033dSHerbert Xu goto out; 703da7f033dSHerbert Xu } else if (ret) 704da7f033dSHerbert Xu continue; 705da7f033dSHerbert Xu 706da7f033dSHerbert Xu sg_init_one(&sg[0], data, template[i].ilen); 707da7f033dSHerbert Xu 708da7f033dSHerbert Xu ablkcipher_request_set_crypt(req, sg, sg, 709da7f033dSHerbert Xu template[i].ilen, iv); 710da7f033dSHerbert Xu ret = enc ? 711da7f033dSHerbert Xu crypto_ablkcipher_encrypt(req) : 712da7f033dSHerbert Xu crypto_ablkcipher_decrypt(req); 713da7f033dSHerbert Xu 714da7f033dSHerbert Xu switch (ret) { 715da7f033dSHerbert Xu case 0: 716da7f033dSHerbert Xu break; 717da7f033dSHerbert Xu case -EINPROGRESS: 718da7f033dSHerbert Xu case -EBUSY: 719da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 720da7f033dSHerbert Xu &result.completion); 721da7f033dSHerbert Xu if (!ret && !((ret = result.err))) { 722da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 723da7f033dSHerbert Xu break; 724da7f033dSHerbert Xu } 725da7f033dSHerbert Xu /* fall through */ 726da7f033dSHerbert Xu default: 7271aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: %s failed on " 728da7f033dSHerbert Xu "test %d for %s: ret=%d\n", e, j, algo, 729da7f033dSHerbert Xu -ret); 730da7f033dSHerbert Xu goto out; 731da7f033dSHerbert Xu } 732da7f033dSHerbert Xu 733da7f033dSHerbert Xu q = data; 734da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 7351aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Test %d " 7361aa4ecd9SHerbert Xu "failed on %s for %s\n", j, e, algo); 737da7f033dSHerbert Xu hexdump(q, template[i].rlen); 738da7f033dSHerbert Xu ret = -EINVAL; 739da7f033dSHerbert Xu goto out; 740da7f033dSHerbert Xu } 741da7f033dSHerbert Xu } 742da7f033dSHerbert Xu } 743da7f033dSHerbert Xu 744da7f033dSHerbert Xu j = 0; 745da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 746da7f033dSHerbert Xu 747da7f033dSHerbert Xu if (template[i].iv) 748da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 749da7f033dSHerbert Xu else 750da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 751da7f033dSHerbert Xu 752da7f033dSHerbert Xu if (template[i].np) { 753da7f033dSHerbert Xu j++; 754da7f033dSHerbert Xu 755da7f033dSHerbert Xu crypto_ablkcipher_clear_flags(tfm, ~0); 756da7f033dSHerbert Xu if (template[i].wk) 757da7f033dSHerbert Xu crypto_ablkcipher_set_flags( 758da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 759da7f033dSHerbert Xu 760da7f033dSHerbert Xu ret = crypto_ablkcipher_setkey(tfm, template[i].key, 761da7f033dSHerbert Xu template[i].klen); 762da7f033dSHerbert Xu if (!ret == template[i].fail) { 7631aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: setkey failed " 764da7f033dSHerbert Xu "on chunk test %d for %s: flags=%x\n", 765da7f033dSHerbert Xu j, algo, 766da7f033dSHerbert Xu crypto_ablkcipher_get_flags(tfm)); 767da7f033dSHerbert Xu goto out; 768da7f033dSHerbert Xu } else if (ret) 769da7f033dSHerbert Xu continue; 770da7f033dSHerbert Xu 771da7f033dSHerbert Xu temp = 0; 772da7f033dSHerbert Xu ret = -EINVAL; 773da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 774da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 775da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 776da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 777da7f033dSHerbert Xu goto out; 778da7f033dSHerbert Xu 779da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 780da7f033dSHerbert Xu offset_in_page(IDX[k]); 781da7f033dSHerbert Xu 782da7f033dSHerbert Xu memcpy(q, template[i].input + temp, 783da7f033dSHerbert Xu template[i].tap[k]); 784da7f033dSHerbert Xu 785da7f033dSHerbert Xu if (offset_in_page(q) + template[i].tap[k] < 786da7f033dSHerbert Xu PAGE_SIZE) 787da7f033dSHerbert Xu q[template[i].tap[k]] = 0; 788da7f033dSHerbert Xu 789da7f033dSHerbert Xu sg_set_buf(&sg[k], q, template[i].tap[k]); 790da7f033dSHerbert Xu 791da7f033dSHerbert Xu temp += template[i].tap[k]; 792da7f033dSHerbert Xu } 793da7f033dSHerbert Xu 794da7f033dSHerbert Xu ablkcipher_request_set_crypt(req, sg, sg, 795da7f033dSHerbert Xu template[i].ilen, iv); 796da7f033dSHerbert Xu 797da7f033dSHerbert Xu ret = enc ? 798da7f033dSHerbert Xu crypto_ablkcipher_encrypt(req) : 799da7f033dSHerbert Xu crypto_ablkcipher_decrypt(req); 800da7f033dSHerbert Xu 801da7f033dSHerbert Xu switch (ret) { 802da7f033dSHerbert Xu case 0: 803da7f033dSHerbert Xu break; 804da7f033dSHerbert Xu case -EINPROGRESS: 805da7f033dSHerbert Xu case -EBUSY: 806da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 807da7f033dSHerbert Xu &result.completion); 808da7f033dSHerbert Xu if (!ret && !((ret = result.err))) { 809da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 810da7f033dSHerbert Xu break; 811da7f033dSHerbert Xu } 812da7f033dSHerbert Xu /* fall through */ 813da7f033dSHerbert Xu default: 8141aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: %s failed on " 815da7f033dSHerbert Xu "chunk test %d for %s: ret=%d\n", e, j, 816da7f033dSHerbert Xu algo, -ret); 817da7f033dSHerbert Xu goto out; 818da7f033dSHerbert Xu } 819da7f033dSHerbert Xu 820da7f033dSHerbert Xu temp = 0; 821da7f033dSHerbert Xu ret = -EINVAL; 822da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 823da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 824da7f033dSHerbert Xu offset_in_page(IDX[k]); 825da7f033dSHerbert Xu 826da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, 827da7f033dSHerbert Xu template[i].tap[k])) { 8281aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Chunk " 829da7f033dSHerbert Xu "test %d failed on %s at page " 830da7f033dSHerbert Xu "%u for %s\n", j, e, k, algo); 831da7f033dSHerbert Xu hexdump(q, template[i].tap[k]); 832da7f033dSHerbert Xu goto out; 833da7f033dSHerbert Xu } 834da7f033dSHerbert Xu 835da7f033dSHerbert Xu q += template[i].tap[k]; 836da7f033dSHerbert Xu for (n = 0; offset_in_page(q + n) && q[n]; n++) 837da7f033dSHerbert Xu ; 838da7f033dSHerbert Xu if (n) { 8391aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: " 840da7f033dSHerbert Xu "Result buffer corruption in " 841da7f033dSHerbert Xu "chunk test %d on %s at page " 842da7f033dSHerbert Xu "%u for %s: %u bytes:\n", j, e, 843da7f033dSHerbert Xu k, algo, n); 844da7f033dSHerbert Xu hexdump(q, n); 845da7f033dSHerbert Xu goto out; 846da7f033dSHerbert Xu } 847da7f033dSHerbert Xu temp += template[i].tap[k]; 848da7f033dSHerbert Xu } 849da7f033dSHerbert Xu } 850da7f033dSHerbert Xu } 851da7f033dSHerbert Xu 852da7f033dSHerbert Xu ret = 0; 853da7f033dSHerbert Xu 854da7f033dSHerbert Xu out: 855da7f033dSHerbert Xu ablkcipher_request_free(req); 856da7f033dSHerbert Xu return ret; 857da7f033dSHerbert Xu } 858da7f033dSHerbert Xu 859da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate, 860da7f033dSHerbert Xu struct comp_testvec *dtemplate, int ctcount, int dtcount) 861da7f033dSHerbert Xu { 862da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm)); 863da7f033dSHerbert Xu unsigned int i; 864da7f033dSHerbert Xu char result[COMP_BUF_SIZE]; 865da7f033dSHerbert Xu int ret; 866da7f033dSHerbert Xu 867da7f033dSHerbert Xu for (i = 0; i < ctcount; i++) { 868c79cf910SGeert Uytterhoeven int ilen; 869c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 870da7f033dSHerbert Xu 871da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 872da7f033dSHerbert Xu 873da7f033dSHerbert Xu ilen = ctemplate[i].inlen; 874da7f033dSHerbert Xu ret = crypto_comp_compress(tfm, ctemplate[i].input, 875da7f033dSHerbert Xu ilen, result, &dlen); 876da7f033dSHerbert Xu if (ret) { 877da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: compression failed " 878da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 879da7f033dSHerbert Xu -ret); 880da7f033dSHerbert Xu goto out; 881da7f033dSHerbert Xu } 882da7f033dSHerbert Xu 883b812eb00SGeert Uytterhoeven if (dlen != ctemplate[i].outlen) { 884b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Compression test %d " 885b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 886b812eb00SGeert Uytterhoeven dlen); 887b812eb00SGeert Uytterhoeven ret = -EINVAL; 888b812eb00SGeert Uytterhoeven goto out; 889b812eb00SGeert Uytterhoeven } 890b812eb00SGeert Uytterhoeven 891da7f033dSHerbert Xu if (memcmp(result, ctemplate[i].output, dlen)) { 892da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Compression test %d " 893da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 894da7f033dSHerbert Xu hexdump(result, dlen); 895da7f033dSHerbert Xu ret = -EINVAL; 896da7f033dSHerbert Xu goto out; 897da7f033dSHerbert Xu } 898da7f033dSHerbert Xu } 899da7f033dSHerbert Xu 900da7f033dSHerbert Xu for (i = 0; i < dtcount; i++) { 901c79cf910SGeert Uytterhoeven int ilen; 902c79cf910SGeert Uytterhoeven unsigned int dlen = COMP_BUF_SIZE; 903da7f033dSHerbert Xu 904da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 905da7f033dSHerbert Xu 906da7f033dSHerbert Xu ilen = dtemplate[i].inlen; 907da7f033dSHerbert Xu ret = crypto_comp_decompress(tfm, dtemplate[i].input, 908da7f033dSHerbert Xu ilen, result, &dlen); 909da7f033dSHerbert Xu if (ret) { 910da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: decompression failed " 911da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 912da7f033dSHerbert Xu -ret); 913da7f033dSHerbert Xu goto out; 914da7f033dSHerbert Xu } 915da7f033dSHerbert Xu 916b812eb00SGeert Uytterhoeven if (dlen != dtemplate[i].outlen) { 917b812eb00SGeert Uytterhoeven printk(KERN_ERR "alg: comp: Decompression test %d " 918b812eb00SGeert Uytterhoeven "failed for %s: output len = %d\n", i + 1, algo, 919b812eb00SGeert Uytterhoeven dlen); 920b812eb00SGeert Uytterhoeven ret = -EINVAL; 921b812eb00SGeert Uytterhoeven goto out; 922b812eb00SGeert Uytterhoeven } 923b812eb00SGeert Uytterhoeven 924da7f033dSHerbert Xu if (memcmp(result, dtemplate[i].output, dlen)) { 925da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Decompression test %d " 926da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 927da7f033dSHerbert Xu hexdump(result, dlen); 928da7f033dSHerbert Xu ret = -EINVAL; 929da7f033dSHerbert Xu goto out; 930da7f033dSHerbert Xu } 931da7f033dSHerbert Xu } 932da7f033dSHerbert Xu 933da7f033dSHerbert Xu ret = 0; 934da7f033dSHerbert Xu 935da7f033dSHerbert Xu out: 936da7f033dSHerbert Xu return ret; 937da7f033dSHerbert Xu } 938da7f033dSHerbert Xu 9398064efb8SGeert Uytterhoeven static int test_pcomp(struct crypto_pcomp *tfm, 9408064efb8SGeert Uytterhoeven struct pcomp_testvec *ctemplate, 9418064efb8SGeert Uytterhoeven struct pcomp_testvec *dtemplate, int ctcount, 9428064efb8SGeert Uytterhoeven int dtcount) 9438064efb8SGeert Uytterhoeven { 9448064efb8SGeert Uytterhoeven const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm)); 9458064efb8SGeert Uytterhoeven unsigned int i; 9468064efb8SGeert Uytterhoeven char result[COMP_BUF_SIZE]; 9478064efb8SGeert Uytterhoeven int error; 9488064efb8SGeert Uytterhoeven 9498064efb8SGeert Uytterhoeven for (i = 0; i < ctcount; i++) { 9508064efb8SGeert Uytterhoeven struct comp_request req; 9518064efb8SGeert Uytterhoeven 9528064efb8SGeert Uytterhoeven error = crypto_compress_setup(tfm, ctemplate[i].params, 9538064efb8SGeert Uytterhoeven ctemplate[i].paramsize); 9548064efb8SGeert Uytterhoeven if (error) { 9558064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression setup failed on test " 9568064efb8SGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, error); 9578064efb8SGeert Uytterhoeven return error; 9588064efb8SGeert Uytterhoeven } 9598064efb8SGeert Uytterhoeven 9608064efb8SGeert Uytterhoeven error = crypto_compress_init(tfm); 9618064efb8SGeert Uytterhoeven if (error) { 9628064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression init failed on test " 9638064efb8SGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, error); 9648064efb8SGeert Uytterhoeven return error; 9658064efb8SGeert Uytterhoeven } 9668064efb8SGeert Uytterhoeven 9678064efb8SGeert Uytterhoeven memset(result, 0, sizeof(result)); 9688064efb8SGeert Uytterhoeven 9698064efb8SGeert Uytterhoeven req.next_in = ctemplate[i].input; 9708064efb8SGeert Uytterhoeven req.avail_in = ctemplate[i].inlen / 2; 9718064efb8SGeert Uytterhoeven req.next_out = result; 9728064efb8SGeert Uytterhoeven req.avail_out = ctemplate[i].outlen / 2; 9738064efb8SGeert Uytterhoeven 9748064efb8SGeert Uytterhoeven error = crypto_compress_update(tfm, &req); 9758064efb8SGeert Uytterhoeven if (error && (error != -EAGAIN || req.avail_in)) { 9768064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression update failed on test " 9778064efb8SGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, error); 9788064efb8SGeert Uytterhoeven return error; 9798064efb8SGeert Uytterhoeven } 9808064efb8SGeert Uytterhoeven 9818064efb8SGeert Uytterhoeven /* Add remaining input data */ 9828064efb8SGeert Uytterhoeven req.avail_in += (ctemplate[i].inlen + 1) / 2; 9838064efb8SGeert Uytterhoeven 9848064efb8SGeert Uytterhoeven error = crypto_compress_update(tfm, &req); 9858064efb8SGeert Uytterhoeven if (error && (error != -EAGAIN || req.avail_in)) { 9868064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression update failed on test " 9878064efb8SGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, error); 9888064efb8SGeert Uytterhoeven return error; 9898064efb8SGeert Uytterhoeven } 9908064efb8SGeert Uytterhoeven 9918064efb8SGeert Uytterhoeven /* Provide remaining output space */ 9928064efb8SGeert Uytterhoeven req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2; 9938064efb8SGeert Uytterhoeven 9948064efb8SGeert Uytterhoeven error = crypto_compress_final(tfm, &req); 9958064efb8SGeert Uytterhoeven if (error) { 9968064efb8SGeert Uytterhoeven pr_err("alg: pcomp: compression final failed on test " 9978064efb8SGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, error); 9988064efb8SGeert Uytterhoeven return error; 9998064efb8SGeert Uytterhoeven } 10008064efb8SGeert Uytterhoeven 10018064efb8SGeert Uytterhoeven if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) { 10028064efb8SGeert Uytterhoeven pr_err("alg: comp: Compression test %d failed for %s: " 10038064efb8SGeert Uytterhoeven "output len = %d (expected %d)\n", i + 1, algo, 10048064efb8SGeert Uytterhoeven COMP_BUF_SIZE - req.avail_out, 10058064efb8SGeert Uytterhoeven ctemplate[i].outlen); 10068064efb8SGeert Uytterhoeven return -EINVAL; 10078064efb8SGeert Uytterhoeven } 10088064efb8SGeert Uytterhoeven 10098064efb8SGeert Uytterhoeven if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) { 10108064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Compression test %d failed for " 10118064efb8SGeert Uytterhoeven "%s\n", i + 1, algo); 10128064efb8SGeert Uytterhoeven hexdump(result, ctemplate[i].outlen); 10138064efb8SGeert Uytterhoeven return -EINVAL; 10148064efb8SGeert Uytterhoeven } 10158064efb8SGeert Uytterhoeven } 10168064efb8SGeert Uytterhoeven 10178064efb8SGeert Uytterhoeven for (i = 0; i < dtcount; i++) { 10188064efb8SGeert Uytterhoeven struct comp_request req; 10198064efb8SGeert Uytterhoeven 10208064efb8SGeert Uytterhoeven error = crypto_decompress_setup(tfm, dtemplate[i].params, 10218064efb8SGeert Uytterhoeven dtemplate[i].paramsize); 10228064efb8SGeert Uytterhoeven if (error) { 10238064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression setup failed on " 10248064efb8SGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, 10258064efb8SGeert Uytterhoeven error); 10268064efb8SGeert Uytterhoeven return error; 10278064efb8SGeert Uytterhoeven } 10288064efb8SGeert Uytterhoeven 10298064efb8SGeert Uytterhoeven error = crypto_decompress_init(tfm); 10308064efb8SGeert Uytterhoeven if (error) { 10318064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression init failed on test " 10328064efb8SGeert Uytterhoeven "%d for %s: error=%d\n", i + 1, algo, error); 10338064efb8SGeert Uytterhoeven return error; 10348064efb8SGeert Uytterhoeven } 10358064efb8SGeert Uytterhoeven 10368064efb8SGeert Uytterhoeven memset(result, 0, sizeof(result)); 10378064efb8SGeert Uytterhoeven 10388064efb8SGeert Uytterhoeven req.next_in = dtemplate[i].input; 10398064efb8SGeert Uytterhoeven req.avail_in = dtemplate[i].inlen / 2; 10408064efb8SGeert Uytterhoeven req.next_out = result; 10418064efb8SGeert Uytterhoeven req.avail_out = dtemplate[i].outlen / 2; 10428064efb8SGeert Uytterhoeven 10438064efb8SGeert Uytterhoeven error = crypto_decompress_update(tfm, &req); 10448064efb8SGeert Uytterhoeven if (error && (error != -EAGAIN || req.avail_in)) { 10458064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression update failed on " 10468064efb8SGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, 10478064efb8SGeert Uytterhoeven error); 10488064efb8SGeert Uytterhoeven return error; 10498064efb8SGeert Uytterhoeven } 10508064efb8SGeert Uytterhoeven 10518064efb8SGeert Uytterhoeven /* Add remaining input data */ 10528064efb8SGeert Uytterhoeven req.avail_in += (dtemplate[i].inlen + 1) / 2; 10538064efb8SGeert Uytterhoeven 10548064efb8SGeert Uytterhoeven error = crypto_decompress_update(tfm, &req); 10558064efb8SGeert Uytterhoeven if (error && (error != -EAGAIN || req.avail_in)) { 10568064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression update failed on " 10578064efb8SGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, 10588064efb8SGeert Uytterhoeven error); 10598064efb8SGeert Uytterhoeven return error; 10608064efb8SGeert Uytterhoeven } 10618064efb8SGeert Uytterhoeven 10628064efb8SGeert Uytterhoeven /* Provide remaining output space */ 10638064efb8SGeert Uytterhoeven req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2; 10648064efb8SGeert Uytterhoeven 10658064efb8SGeert Uytterhoeven error = crypto_decompress_final(tfm, &req); 10668064efb8SGeert Uytterhoeven if (error && (error != -EAGAIN || req.avail_in)) { 10678064efb8SGeert Uytterhoeven pr_err("alg: pcomp: decompression final failed on " 10688064efb8SGeert Uytterhoeven "test %d for %s: error=%d\n", i + 1, algo, 10698064efb8SGeert Uytterhoeven error); 10708064efb8SGeert Uytterhoeven return error; 10718064efb8SGeert Uytterhoeven } 10728064efb8SGeert Uytterhoeven 10738064efb8SGeert Uytterhoeven if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) { 10748064efb8SGeert Uytterhoeven pr_err("alg: comp: Decompression test %d failed for " 10758064efb8SGeert Uytterhoeven "%s: output len = %d (expected %d)\n", i + 1, 10768064efb8SGeert Uytterhoeven algo, COMP_BUF_SIZE - req.avail_out, 10778064efb8SGeert Uytterhoeven dtemplate[i].outlen); 10788064efb8SGeert Uytterhoeven return -EINVAL; 10798064efb8SGeert Uytterhoeven } 10808064efb8SGeert Uytterhoeven 10818064efb8SGeert Uytterhoeven if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) { 10828064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Decompression test %d failed for " 10838064efb8SGeert Uytterhoeven "%s\n", i + 1, algo); 10848064efb8SGeert Uytterhoeven hexdump(result, dtemplate[i].outlen); 10858064efb8SGeert Uytterhoeven return -EINVAL; 10868064efb8SGeert Uytterhoeven } 10878064efb8SGeert Uytterhoeven } 10888064efb8SGeert Uytterhoeven 10898064efb8SGeert Uytterhoeven return 0; 10908064efb8SGeert Uytterhoeven } 10918064efb8SGeert Uytterhoeven 1092da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver, 1093da7f033dSHerbert Xu u32 type, u32 mask) 1094da7f033dSHerbert Xu { 1095da7f033dSHerbert Xu struct crypto_aead *tfm; 1096da7f033dSHerbert Xu int err = 0; 1097da7f033dSHerbert Xu 1098da7f033dSHerbert Xu tfm = crypto_alloc_aead(driver, type, mask); 1099da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1100da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to load transform for %s: " 1101da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1102da7f033dSHerbert Xu return PTR_ERR(tfm); 1103da7f033dSHerbert Xu } 1104da7f033dSHerbert Xu 1105da7f033dSHerbert Xu if (desc->suite.aead.enc.vecs) { 1106da7f033dSHerbert Xu err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs, 1107da7f033dSHerbert Xu desc->suite.aead.enc.count); 1108da7f033dSHerbert Xu if (err) 1109da7f033dSHerbert Xu goto out; 1110da7f033dSHerbert Xu } 1111da7f033dSHerbert Xu 1112da7f033dSHerbert Xu if (!err && desc->suite.aead.dec.vecs) 1113da7f033dSHerbert Xu err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs, 1114da7f033dSHerbert Xu desc->suite.aead.dec.count); 1115da7f033dSHerbert Xu 1116da7f033dSHerbert Xu out: 1117da7f033dSHerbert Xu crypto_free_aead(tfm); 1118da7f033dSHerbert Xu return err; 1119da7f033dSHerbert Xu } 1120da7f033dSHerbert Xu 1121da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc, 1122da7f033dSHerbert Xu const char *driver, u32 type, u32 mask) 1123da7f033dSHerbert Xu { 11241aa4ecd9SHerbert Xu struct crypto_cipher *tfm; 1125da7f033dSHerbert Xu int err = 0; 1126da7f033dSHerbert Xu 11271aa4ecd9SHerbert Xu tfm = crypto_alloc_cipher(driver, type, mask); 1128da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1129da7f033dSHerbert Xu printk(KERN_ERR "alg: cipher: Failed to load transform for " 1130da7f033dSHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 1131da7f033dSHerbert Xu return PTR_ERR(tfm); 1132da7f033dSHerbert Xu } 1133da7f033dSHerbert Xu 1134da7f033dSHerbert Xu if (desc->suite.cipher.enc.vecs) { 1135da7f033dSHerbert Xu err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 1136da7f033dSHerbert Xu desc->suite.cipher.enc.count); 1137da7f033dSHerbert Xu if (err) 1138da7f033dSHerbert Xu goto out; 1139da7f033dSHerbert Xu } 1140da7f033dSHerbert Xu 1141da7f033dSHerbert Xu if (desc->suite.cipher.dec.vecs) 1142da7f033dSHerbert Xu err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 1143da7f033dSHerbert Xu desc->suite.cipher.dec.count); 1144da7f033dSHerbert Xu 1145da7f033dSHerbert Xu out: 11461aa4ecd9SHerbert Xu crypto_free_cipher(tfm); 11471aa4ecd9SHerbert Xu return err; 11481aa4ecd9SHerbert Xu } 11491aa4ecd9SHerbert Xu 11501aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc, 11511aa4ecd9SHerbert Xu const char *driver, u32 type, u32 mask) 11521aa4ecd9SHerbert Xu { 11531aa4ecd9SHerbert Xu struct crypto_ablkcipher *tfm; 11541aa4ecd9SHerbert Xu int err = 0; 11551aa4ecd9SHerbert Xu 11561aa4ecd9SHerbert Xu tfm = crypto_alloc_ablkcipher(driver, type, mask); 11571aa4ecd9SHerbert Xu if (IS_ERR(tfm)) { 11581aa4ecd9SHerbert Xu printk(KERN_ERR "alg: skcipher: Failed to load transform for " 11591aa4ecd9SHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 11601aa4ecd9SHerbert Xu return PTR_ERR(tfm); 11611aa4ecd9SHerbert Xu } 11621aa4ecd9SHerbert Xu 11631aa4ecd9SHerbert Xu if (desc->suite.cipher.enc.vecs) { 11641aa4ecd9SHerbert Xu err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 11651aa4ecd9SHerbert Xu desc->suite.cipher.enc.count); 11661aa4ecd9SHerbert Xu if (err) 11671aa4ecd9SHerbert Xu goto out; 11681aa4ecd9SHerbert Xu } 11691aa4ecd9SHerbert Xu 11701aa4ecd9SHerbert Xu if (desc->suite.cipher.dec.vecs) 11711aa4ecd9SHerbert Xu err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 11721aa4ecd9SHerbert Xu desc->suite.cipher.dec.count); 11731aa4ecd9SHerbert Xu 11741aa4ecd9SHerbert Xu out: 1175da7f033dSHerbert Xu crypto_free_ablkcipher(tfm); 1176da7f033dSHerbert Xu return err; 1177da7f033dSHerbert Xu } 1178da7f033dSHerbert Xu 1179da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver, 1180da7f033dSHerbert Xu u32 type, u32 mask) 1181da7f033dSHerbert Xu { 1182da7f033dSHerbert Xu struct crypto_comp *tfm; 1183da7f033dSHerbert Xu int err; 1184da7f033dSHerbert Xu 1185da7f033dSHerbert Xu tfm = crypto_alloc_comp(driver, type, mask); 1186da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1187da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Failed to load transform for %s: " 1188da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1189da7f033dSHerbert Xu return PTR_ERR(tfm); 1190da7f033dSHerbert Xu } 1191da7f033dSHerbert Xu 1192da7f033dSHerbert Xu err = test_comp(tfm, desc->suite.comp.comp.vecs, 1193da7f033dSHerbert Xu desc->suite.comp.decomp.vecs, 1194da7f033dSHerbert Xu desc->suite.comp.comp.count, 1195da7f033dSHerbert Xu desc->suite.comp.decomp.count); 1196da7f033dSHerbert Xu 1197da7f033dSHerbert Xu crypto_free_comp(tfm); 1198da7f033dSHerbert Xu return err; 1199da7f033dSHerbert Xu } 1200da7f033dSHerbert Xu 12018064efb8SGeert Uytterhoeven static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver, 12028064efb8SGeert Uytterhoeven u32 type, u32 mask) 12038064efb8SGeert Uytterhoeven { 12048064efb8SGeert Uytterhoeven struct crypto_pcomp *tfm; 12058064efb8SGeert Uytterhoeven int err; 12068064efb8SGeert Uytterhoeven 12078064efb8SGeert Uytterhoeven tfm = crypto_alloc_pcomp(driver, type, mask); 12088064efb8SGeert Uytterhoeven if (IS_ERR(tfm)) { 12098064efb8SGeert Uytterhoeven pr_err("alg: pcomp: Failed to load transform for %s: %ld\n", 12108064efb8SGeert Uytterhoeven driver, PTR_ERR(tfm)); 12118064efb8SGeert Uytterhoeven return PTR_ERR(tfm); 12128064efb8SGeert Uytterhoeven } 12138064efb8SGeert Uytterhoeven 12148064efb8SGeert Uytterhoeven err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs, 12158064efb8SGeert Uytterhoeven desc->suite.pcomp.decomp.vecs, 12168064efb8SGeert Uytterhoeven desc->suite.pcomp.comp.count, 12178064efb8SGeert Uytterhoeven desc->suite.pcomp.decomp.count); 12188064efb8SGeert Uytterhoeven 12198064efb8SGeert Uytterhoeven crypto_free_pcomp(tfm); 12208064efb8SGeert Uytterhoeven return err; 12218064efb8SGeert Uytterhoeven } 12228064efb8SGeert Uytterhoeven 1223da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver, 1224da7f033dSHerbert Xu u32 type, u32 mask) 1225da7f033dSHerbert Xu { 1226da7f033dSHerbert Xu struct crypto_ahash *tfm; 1227da7f033dSHerbert Xu int err; 1228da7f033dSHerbert Xu 1229da7f033dSHerbert Xu tfm = crypto_alloc_ahash(driver, type, mask); 1230da7f033dSHerbert Xu if (IS_ERR(tfm)) { 1231da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to load transform for %s: " 1232da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 1233da7f033dSHerbert Xu return PTR_ERR(tfm); 1234da7f033dSHerbert Xu } 1235da7f033dSHerbert Xu 1236da7f033dSHerbert Xu err = test_hash(tfm, desc->suite.hash.vecs, desc->suite.hash.count); 1237da7f033dSHerbert Xu 1238da7f033dSHerbert Xu crypto_free_ahash(tfm); 1239da7f033dSHerbert Xu return err; 1240da7f033dSHerbert Xu } 1241da7f033dSHerbert Xu 12428e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc, 12438e3ee85eSHerbert Xu const char *driver, u32 type, u32 mask) 12448e3ee85eSHerbert Xu { 12458e3ee85eSHerbert Xu struct crypto_shash *tfm; 12468e3ee85eSHerbert Xu u32 val; 12478e3ee85eSHerbert Xu int err; 12488e3ee85eSHerbert Xu 12498e3ee85eSHerbert Xu err = alg_test_hash(desc, driver, type, mask); 12508e3ee85eSHerbert Xu if (err) 12518e3ee85eSHerbert Xu goto out; 12528e3ee85eSHerbert Xu 12538e3ee85eSHerbert Xu tfm = crypto_alloc_shash(driver, type, mask); 12548e3ee85eSHerbert Xu if (IS_ERR(tfm)) { 12558e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: " 12568e3ee85eSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 12578e3ee85eSHerbert Xu err = PTR_ERR(tfm); 12588e3ee85eSHerbert Xu goto out; 12598e3ee85eSHerbert Xu } 12608e3ee85eSHerbert Xu 12618e3ee85eSHerbert Xu do { 12628e3ee85eSHerbert Xu struct { 12638e3ee85eSHerbert Xu struct shash_desc shash; 12648e3ee85eSHerbert Xu char ctx[crypto_shash_descsize(tfm)]; 12658e3ee85eSHerbert Xu } sdesc; 12668e3ee85eSHerbert Xu 12678e3ee85eSHerbert Xu sdesc.shash.tfm = tfm; 12688e3ee85eSHerbert Xu sdesc.shash.flags = 0; 12698e3ee85eSHerbert Xu 12708e3ee85eSHerbert Xu *(u32 *)sdesc.ctx = le32_to_cpu(420553207); 12718e3ee85eSHerbert Xu err = crypto_shash_final(&sdesc.shash, (u8 *)&val); 12728e3ee85eSHerbert Xu if (err) { 12738e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Operation failed for " 12748e3ee85eSHerbert Xu "%s: %d\n", driver, err); 12758e3ee85eSHerbert Xu break; 12768e3ee85eSHerbert Xu } 12778e3ee85eSHerbert Xu 12788e3ee85eSHerbert Xu if (val != ~420553207) { 12798e3ee85eSHerbert Xu printk(KERN_ERR "alg: crc32c: Test failed for %s: " 12808e3ee85eSHerbert Xu "%d\n", driver, val); 12818e3ee85eSHerbert Xu err = -EINVAL; 12828e3ee85eSHerbert Xu } 12838e3ee85eSHerbert Xu } while (0); 12848e3ee85eSHerbert Xu 12858e3ee85eSHerbert Xu crypto_free_shash(tfm); 12868e3ee85eSHerbert Xu 12878e3ee85eSHerbert Xu out: 12888e3ee85eSHerbert Xu return err; 12898e3ee85eSHerbert Xu } 12908e3ee85eSHerbert Xu 1291da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */ 1292da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = { 1293da7f033dSHerbert Xu { 1294da7f033dSHerbert Xu .alg = "cbc(aes)", 12951aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1296da7f033dSHerbert Xu .suite = { 1297da7f033dSHerbert Xu .cipher = { 1298da7f033dSHerbert Xu .enc = { 1299da7f033dSHerbert Xu .vecs = aes_cbc_enc_tv_template, 1300da7f033dSHerbert Xu .count = AES_CBC_ENC_TEST_VECTORS 1301da7f033dSHerbert Xu }, 1302da7f033dSHerbert Xu .dec = { 1303da7f033dSHerbert Xu .vecs = aes_cbc_dec_tv_template, 1304da7f033dSHerbert Xu .count = AES_CBC_DEC_TEST_VECTORS 1305da7f033dSHerbert Xu } 1306da7f033dSHerbert Xu } 1307da7f033dSHerbert Xu } 1308da7f033dSHerbert Xu }, { 1309da7f033dSHerbert Xu .alg = "cbc(anubis)", 13101aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1311da7f033dSHerbert Xu .suite = { 1312da7f033dSHerbert Xu .cipher = { 1313da7f033dSHerbert Xu .enc = { 1314da7f033dSHerbert Xu .vecs = anubis_cbc_enc_tv_template, 1315da7f033dSHerbert Xu .count = ANUBIS_CBC_ENC_TEST_VECTORS 1316da7f033dSHerbert Xu }, 1317da7f033dSHerbert Xu .dec = { 1318da7f033dSHerbert Xu .vecs = anubis_cbc_dec_tv_template, 1319da7f033dSHerbert Xu .count = ANUBIS_CBC_DEC_TEST_VECTORS 1320da7f033dSHerbert Xu } 1321da7f033dSHerbert Xu } 1322da7f033dSHerbert Xu } 1323da7f033dSHerbert Xu }, { 1324da7f033dSHerbert Xu .alg = "cbc(blowfish)", 13251aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1326da7f033dSHerbert Xu .suite = { 1327da7f033dSHerbert Xu .cipher = { 1328da7f033dSHerbert Xu .enc = { 1329da7f033dSHerbert Xu .vecs = bf_cbc_enc_tv_template, 1330da7f033dSHerbert Xu .count = BF_CBC_ENC_TEST_VECTORS 1331da7f033dSHerbert Xu }, 1332da7f033dSHerbert Xu .dec = { 1333da7f033dSHerbert Xu .vecs = bf_cbc_dec_tv_template, 1334da7f033dSHerbert Xu .count = BF_CBC_DEC_TEST_VECTORS 1335da7f033dSHerbert Xu } 1336da7f033dSHerbert Xu } 1337da7f033dSHerbert Xu } 1338da7f033dSHerbert Xu }, { 1339da7f033dSHerbert Xu .alg = "cbc(camellia)", 13401aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1341da7f033dSHerbert Xu .suite = { 1342da7f033dSHerbert Xu .cipher = { 1343da7f033dSHerbert Xu .enc = { 1344da7f033dSHerbert Xu .vecs = camellia_cbc_enc_tv_template, 1345da7f033dSHerbert Xu .count = CAMELLIA_CBC_ENC_TEST_VECTORS 1346da7f033dSHerbert Xu }, 1347da7f033dSHerbert Xu .dec = { 1348da7f033dSHerbert Xu .vecs = camellia_cbc_dec_tv_template, 1349da7f033dSHerbert Xu .count = CAMELLIA_CBC_DEC_TEST_VECTORS 1350da7f033dSHerbert Xu } 1351da7f033dSHerbert Xu } 1352da7f033dSHerbert Xu } 1353da7f033dSHerbert Xu }, { 1354da7f033dSHerbert Xu .alg = "cbc(des)", 13551aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1356da7f033dSHerbert Xu .suite = { 1357da7f033dSHerbert Xu .cipher = { 1358da7f033dSHerbert Xu .enc = { 1359da7f033dSHerbert Xu .vecs = des_cbc_enc_tv_template, 1360da7f033dSHerbert Xu .count = DES_CBC_ENC_TEST_VECTORS 1361da7f033dSHerbert Xu }, 1362da7f033dSHerbert Xu .dec = { 1363da7f033dSHerbert Xu .vecs = des_cbc_dec_tv_template, 1364da7f033dSHerbert Xu .count = DES_CBC_DEC_TEST_VECTORS 1365da7f033dSHerbert Xu } 1366da7f033dSHerbert Xu } 1367da7f033dSHerbert Xu } 1368da7f033dSHerbert Xu }, { 1369da7f033dSHerbert Xu .alg = "cbc(des3_ede)", 13701aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1371da7f033dSHerbert Xu .suite = { 1372da7f033dSHerbert Xu .cipher = { 1373da7f033dSHerbert Xu .enc = { 1374da7f033dSHerbert Xu .vecs = des3_ede_cbc_enc_tv_template, 1375da7f033dSHerbert Xu .count = DES3_EDE_CBC_ENC_TEST_VECTORS 1376da7f033dSHerbert Xu }, 1377da7f033dSHerbert Xu .dec = { 1378da7f033dSHerbert Xu .vecs = des3_ede_cbc_dec_tv_template, 1379da7f033dSHerbert Xu .count = DES3_EDE_CBC_DEC_TEST_VECTORS 1380da7f033dSHerbert Xu } 1381da7f033dSHerbert Xu } 1382da7f033dSHerbert Xu } 1383da7f033dSHerbert Xu }, { 1384da7f033dSHerbert Xu .alg = "cbc(twofish)", 13851aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1386da7f033dSHerbert Xu .suite = { 1387da7f033dSHerbert Xu .cipher = { 1388da7f033dSHerbert Xu .enc = { 1389da7f033dSHerbert Xu .vecs = tf_cbc_enc_tv_template, 1390da7f033dSHerbert Xu .count = TF_CBC_ENC_TEST_VECTORS 1391da7f033dSHerbert Xu }, 1392da7f033dSHerbert Xu .dec = { 1393da7f033dSHerbert Xu .vecs = tf_cbc_dec_tv_template, 1394da7f033dSHerbert Xu .count = TF_CBC_DEC_TEST_VECTORS 1395da7f033dSHerbert Xu } 1396da7f033dSHerbert Xu } 1397da7f033dSHerbert Xu } 1398da7f033dSHerbert Xu }, { 1399da7f033dSHerbert Xu .alg = "ccm(aes)", 1400da7f033dSHerbert Xu .test = alg_test_aead, 1401da7f033dSHerbert Xu .suite = { 1402da7f033dSHerbert Xu .aead = { 1403da7f033dSHerbert Xu .enc = { 1404da7f033dSHerbert Xu .vecs = aes_ccm_enc_tv_template, 1405da7f033dSHerbert Xu .count = AES_CCM_ENC_TEST_VECTORS 1406da7f033dSHerbert Xu }, 1407da7f033dSHerbert Xu .dec = { 1408da7f033dSHerbert Xu .vecs = aes_ccm_dec_tv_template, 1409da7f033dSHerbert Xu .count = AES_CCM_DEC_TEST_VECTORS 1410da7f033dSHerbert Xu } 1411da7f033dSHerbert Xu } 1412da7f033dSHerbert Xu } 1413da7f033dSHerbert Xu }, { 1414da7f033dSHerbert Xu .alg = "crc32c", 14158e3ee85eSHerbert Xu .test = alg_test_crc32c, 1416da7f033dSHerbert Xu .suite = { 1417da7f033dSHerbert Xu .hash = { 1418da7f033dSHerbert Xu .vecs = crc32c_tv_template, 1419da7f033dSHerbert Xu .count = CRC32C_TEST_VECTORS 1420da7f033dSHerbert Xu } 1421da7f033dSHerbert Xu } 1422da7f033dSHerbert Xu }, { 1423da7f033dSHerbert Xu .alg = "cts(cbc(aes))", 14241aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1425da7f033dSHerbert Xu .suite = { 1426da7f033dSHerbert Xu .cipher = { 1427da7f033dSHerbert Xu .enc = { 1428da7f033dSHerbert Xu .vecs = cts_mode_enc_tv_template, 1429da7f033dSHerbert Xu .count = CTS_MODE_ENC_TEST_VECTORS 1430da7f033dSHerbert Xu }, 1431da7f033dSHerbert Xu .dec = { 1432da7f033dSHerbert Xu .vecs = cts_mode_dec_tv_template, 1433da7f033dSHerbert Xu .count = CTS_MODE_DEC_TEST_VECTORS 1434da7f033dSHerbert Xu } 1435da7f033dSHerbert Xu } 1436da7f033dSHerbert Xu } 1437da7f033dSHerbert Xu }, { 1438da7f033dSHerbert Xu .alg = "deflate", 1439da7f033dSHerbert Xu .test = alg_test_comp, 1440da7f033dSHerbert Xu .suite = { 1441da7f033dSHerbert Xu .comp = { 1442da7f033dSHerbert Xu .comp = { 1443da7f033dSHerbert Xu .vecs = deflate_comp_tv_template, 1444da7f033dSHerbert Xu .count = DEFLATE_COMP_TEST_VECTORS 1445da7f033dSHerbert Xu }, 1446da7f033dSHerbert Xu .decomp = { 1447da7f033dSHerbert Xu .vecs = deflate_decomp_tv_template, 1448da7f033dSHerbert Xu .count = DEFLATE_DECOMP_TEST_VECTORS 1449da7f033dSHerbert Xu } 1450da7f033dSHerbert Xu } 1451da7f033dSHerbert Xu } 1452da7f033dSHerbert Xu }, { 1453da7f033dSHerbert Xu .alg = "ecb(aes)", 14541aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1455da7f033dSHerbert Xu .suite = { 1456da7f033dSHerbert Xu .cipher = { 1457da7f033dSHerbert Xu .enc = { 1458da7f033dSHerbert Xu .vecs = aes_enc_tv_template, 1459da7f033dSHerbert Xu .count = AES_ENC_TEST_VECTORS 1460da7f033dSHerbert Xu }, 1461da7f033dSHerbert Xu .dec = { 1462da7f033dSHerbert Xu .vecs = aes_dec_tv_template, 1463da7f033dSHerbert Xu .count = AES_DEC_TEST_VECTORS 1464da7f033dSHerbert Xu } 1465da7f033dSHerbert Xu } 1466da7f033dSHerbert Xu } 1467da7f033dSHerbert Xu }, { 1468da7f033dSHerbert Xu .alg = "ecb(anubis)", 14691aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1470da7f033dSHerbert Xu .suite = { 1471da7f033dSHerbert Xu .cipher = { 1472da7f033dSHerbert Xu .enc = { 1473da7f033dSHerbert Xu .vecs = anubis_enc_tv_template, 1474da7f033dSHerbert Xu .count = ANUBIS_ENC_TEST_VECTORS 1475da7f033dSHerbert Xu }, 1476da7f033dSHerbert Xu .dec = { 1477da7f033dSHerbert Xu .vecs = anubis_dec_tv_template, 1478da7f033dSHerbert Xu .count = ANUBIS_DEC_TEST_VECTORS 1479da7f033dSHerbert Xu } 1480da7f033dSHerbert Xu } 1481da7f033dSHerbert Xu } 1482da7f033dSHerbert Xu }, { 1483da7f033dSHerbert Xu .alg = "ecb(arc4)", 14841aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1485da7f033dSHerbert Xu .suite = { 1486da7f033dSHerbert Xu .cipher = { 1487da7f033dSHerbert Xu .enc = { 1488da7f033dSHerbert Xu .vecs = arc4_enc_tv_template, 1489da7f033dSHerbert Xu .count = ARC4_ENC_TEST_VECTORS 1490da7f033dSHerbert Xu }, 1491da7f033dSHerbert Xu .dec = { 1492da7f033dSHerbert Xu .vecs = arc4_dec_tv_template, 1493da7f033dSHerbert Xu .count = ARC4_DEC_TEST_VECTORS 1494da7f033dSHerbert Xu } 1495da7f033dSHerbert Xu } 1496da7f033dSHerbert Xu } 1497da7f033dSHerbert Xu }, { 1498da7f033dSHerbert Xu .alg = "ecb(blowfish)", 14991aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1500da7f033dSHerbert Xu .suite = { 1501da7f033dSHerbert Xu .cipher = { 1502da7f033dSHerbert Xu .enc = { 1503da7f033dSHerbert Xu .vecs = bf_enc_tv_template, 1504da7f033dSHerbert Xu .count = BF_ENC_TEST_VECTORS 1505da7f033dSHerbert Xu }, 1506da7f033dSHerbert Xu .dec = { 1507da7f033dSHerbert Xu .vecs = bf_dec_tv_template, 1508da7f033dSHerbert Xu .count = BF_DEC_TEST_VECTORS 1509da7f033dSHerbert Xu } 1510da7f033dSHerbert Xu } 1511da7f033dSHerbert Xu } 1512da7f033dSHerbert Xu }, { 1513da7f033dSHerbert Xu .alg = "ecb(camellia)", 15141aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1515da7f033dSHerbert Xu .suite = { 1516da7f033dSHerbert Xu .cipher = { 1517da7f033dSHerbert Xu .enc = { 1518da7f033dSHerbert Xu .vecs = camellia_enc_tv_template, 1519da7f033dSHerbert Xu .count = CAMELLIA_ENC_TEST_VECTORS 1520da7f033dSHerbert Xu }, 1521da7f033dSHerbert Xu .dec = { 1522da7f033dSHerbert Xu .vecs = camellia_dec_tv_template, 1523da7f033dSHerbert Xu .count = CAMELLIA_DEC_TEST_VECTORS 1524da7f033dSHerbert Xu } 1525da7f033dSHerbert Xu } 1526da7f033dSHerbert Xu } 1527da7f033dSHerbert Xu }, { 1528da7f033dSHerbert Xu .alg = "ecb(cast5)", 15291aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1530da7f033dSHerbert Xu .suite = { 1531da7f033dSHerbert Xu .cipher = { 1532da7f033dSHerbert Xu .enc = { 1533da7f033dSHerbert Xu .vecs = cast5_enc_tv_template, 1534da7f033dSHerbert Xu .count = CAST5_ENC_TEST_VECTORS 1535da7f033dSHerbert Xu }, 1536da7f033dSHerbert Xu .dec = { 1537da7f033dSHerbert Xu .vecs = cast5_dec_tv_template, 1538da7f033dSHerbert Xu .count = CAST5_DEC_TEST_VECTORS 1539da7f033dSHerbert Xu } 1540da7f033dSHerbert Xu } 1541da7f033dSHerbert Xu } 1542da7f033dSHerbert Xu }, { 1543da7f033dSHerbert Xu .alg = "ecb(cast6)", 15441aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1545da7f033dSHerbert Xu .suite = { 1546da7f033dSHerbert Xu .cipher = { 1547da7f033dSHerbert Xu .enc = { 1548da7f033dSHerbert Xu .vecs = cast6_enc_tv_template, 1549da7f033dSHerbert Xu .count = CAST6_ENC_TEST_VECTORS 1550da7f033dSHerbert Xu }, 1551da7f033dSHerbert Xu .dec = { 1552da7f033dSHerbert Xu .vecs = cast6_dec_tv_template, 1553da7f033dSHerbert Xu .count = CAST6_DEC_TEST_VECTORS 1554da7f033dSHerbert Xu } 1555da7f033dSHerbert Xu } 1556da7f033dSHerbert Xu } 1557da7f033dSHerbert Xu }, { 1558da7f033dSHerbert Xu .alg = "ecb(des)", 15591aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1560da7f033dSHerbert Xu .suite = { 1561da7f033dSHerbert Xu .cipher = { 1562da7f033dSHerbert Xu .enc = { 1563da7f033dSHerbert Xu .vecs = des_enc_tv_template, 1564da7f033dSHerbert Xu .count = DES_ENC_TEST_VECTORS 1565da7f033dSHerbert Xu }, 1566da7f033dSHerbert Xu .dec = { 1567da7f033dSHerbert Xu .vecs = des_dec_tv_template, 1568da7f033dSHerbert Xu .count = DES_DEC_TEST_VECTORS 1569da7f033dSHerbert Xu } 1570da7f033dSHerbert Xu } 1571da7f033dSHerbert Xu } 1572da7f033dSHerbert Xu }, { 1573da7f033dSHerbert Xu .alg = "ecb(des3_ede)", 15741aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1575da7f033dSHerbert Xu .suite = { 1576da7f033dSHerbert Xu .cipher = { 1577da7f033dSHerbert Xu .enc = { 1578da7f033dSHerbert Xu .vecs = des3_ede_enc_tv_template, 1579da7f033dSHerbert Xu .count = DES3_EDE_ENC_TEST_VECTORS 1580da7f033dSHerbert Xu }, 1581da7f033dSHerbert Xu .dec = { 1582da7f033dSHerbert Xu .vecs = des3_ede_dec_tv_template, 1583da7f033dSHerbert Xu .count = DES3_EDE_DEC_TEST_VECTORS 1584da7f033dSHerbert Xu } 1585da7f033dSHerbert Xu } 1586da7f033dSHerbert Xu } 1587da7f033dSHerbert Xu }, { 1588da7f033dSHerbert Xu .alg = "ecb(khazad)", 15891aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1590da7f033dSHerbert Xu .suite = { 1591da7f033dSHerbert Xu .cipher = { 1592da7f033dSHerbert Xu .enc = { 1593da7f033dSHerbert Xu .vecs = khazad_enc_tv_template, 1594da7f033dSHerbert Xu .count = KHAZAD_ENC_TEST_VECTORS 1595da7f033dSHerbert Xu }, 1596da7f033dSHerbert Xu .dec = { 1597da7f033dSHerbert Xu .vecs = khazad_dec_tv_template, 1598da7f033dSHerbert Xu .count = KHAZAD_DEC_TEST_VECTORS 1599da7f033dSHerbert Xu } 1600da7f033dSHerbert Xu } 1601da7f033dSHerbert Xu } 1602da7f033dSHerbert Xu }, { 1603da7f033dSHerbert Xu .alg = "ecb(seed)", 16041aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1605da7f033dSHerbert Xu .suite = { 1606da7f033dSHerbert Xu .cipher = { 1607da7f033dSHerbert Xu .enc = { 1608da7f033dSHerbert Xu .vecs = seed_enc_tv_template, 1609da7f033dSHerbert Xu .count = SEED_ENC_TEST_VECTORS 1610da7f033dSHerbert Xu }, 1611da7f033dSHerbert Xu .dec = { 1612da7f033dSHerbert Xu .vecs = seed_dec_tv_template, 1613da7f033dSHerbert Xu .count = SEED_DEC_TEST_VECTORS 1614da7f033dSHerbert Xu } 1615da7f033dSHerbert Xu } 1616da7f033dSHerbert Xu } 1617da7f033dSHerbert Xu }, { 1618da7f033dSHerbert Xu .alg = "ecb(serpent)", 16191aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1620da7f033dSHerbert Xu .suite = { 1621da7f033dSHerbert Xu .cipher = { 1622da7f033dSHerbert Xu .enc = { 1623da7f033dSHerbert Xu .vecs = serpent_enc_tv_template, 1624da7f033dSHerbert Xu .count = SERPENT_ENC_TEST_VECTORS 1625da7f033dSHerbert Xu }, 1626da7f033dSHerbert Xu .dec = { 1627da7f033dSHerbert Xu .vecs = serpent_dec_tv_template, 1628da7f033dSHerbert Xu .count = SERPENT_DEC_TEST_VECTORS 1629da7f033dSHerbert Xu } 1630da7f033dSHerbert Xu } 1631da7f033dSHerbert Xu } 1632da7f033dSHerbert Xu }, { 1633da7f033dSHerbert Xu .alg = "ecb(tea)", 16341aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1635da7f033dSHerbert Xu .suite = { 1636da7f033dSHerbert Xu .cipher = { 1637da7f033dSHerbert Xu .enc = { 1638da7f033dSHerbert Xu .vecs = tea_enc_tv_template, 1639da7f033dSHerbert Xu .count = TEA_ENC_TEST_VECTORS 1640da7f033dSHerbert Xu }, 1641da7f033dSHerbert Xu .dec = { 1642da7f033dSHerbert Xu .vecs = tea_dec_tv_template, 1643da7f033dSHerbert Xu .count = TEA_DEC_TEST_VECTORS 1644da7f033dSHerbert Xu } 1645da7f033dSHerbert Xu } 1646da7f033dSHerbert Xu } 1647da7f033dSHerbert Xu }, { 1648da7f033dSHerbert Xu .alg = "ecb(tnepres)", 16491aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1650da7f033dSHerbert Xu .suite = { 1651da7f033dSHerbert Xu .cipher = { 1652da7f033dSHerbert Xu .enc = { 1653da7f033dSHerbert Xu .vecs = tnepres_enc_tv_template, 1654da7f033dSHerbert Xu .count = TNEPRES_ENC_TEST_VECTORS 1655da7f033dSHerbert Xu }, 1656da7f033dSHerbert Xu .dec = { 1657da7f033dSHerbert Xu .vecs = tnepres_dec_tv_template, 1658da7f033dSHerbert Xu .count = TNEPRES_DEC_TEST_VECTORS 1659da7f033dSHerbert Xu } 1660da7f033dSHerbert Xu } 1661da7f033dSHerbert Xu } 1662da7f033dSHerbert Xu }, { 1663da7f033dSHerbert Xu .alg = "ecb(twofish)", 16641aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1665da7f033dSHerbert Xu .suite = { 1666da7f033dSHerbert Xu .cipher = { 1667da7f033dSHerbert Xu .enc = { 1668da7f033dSHerbert Xu .vecs = tf_enc_tv_template, 1669da7f033dSHerbert Xu .count = TF_ENC_TEST_VECTORS 1670da7f033dSHerbert Xu }, 1671da7f033dSHerbert Xu .dec = { 1672da7f033dSHerbert Xu .vecs = tf_dec_tv_template, 1673da7f033dSHerbert Xu .count = TF_DEC_TEST_VECTORS 1674da7f033dSHerbert Xu } 1675da7f033dSHerbert Xu } 1676da7f033dSHerbert Xu } 1677da7f033dSHerbert Xu }, { 1678da7f033dSHerbert Xu .alg = "ecb(xeta)", 16791aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1680da7f033dSHerbert Xu .suite = { 1681da7f033dSHerbert Xu .cipher = { 1682da7f033dSHerbert Xu .enc = { 1683da7f033dSHerbert Xu .vecs = xeta_enc_tv_template, 1684da7f033dSHerbert Xu .count = XETA_ENC_TEST_VECTORS 1685da7f033dSHerbert Xu }, 1686da7f033dSHerbert Xu .dec = { 1687da7f033dSHerbert Xu .vecs = xeta_dec_tv_template, 1688da7f033dSHerbert Xu .count = XETA_DEC_TEST_VECTORS 1689da7f033dSHerbert Xu } 1690da7f033dSHerbert Xu } 1691da7f033dSHerbert Xu } 1692da7f033dSHerbert Xu }, { 1693da7f033dSHerbert Xu .alg = "ecb(xtea)", 16941aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1695da7f033dSHerbert Xu .suite = { 1696da7f033dSHerbert Xu .cipher = { 1697da7f033dSHerbert Xu .enc = { 1698da7f033dSHerbert Xu .vecs = xtea_enc_tv_template, 1699da7f033dSHerbert Xu .count = XTEA_ENC_TEST_VECTORS 1700da7f033dSHerbert Xu }, 1701da7f033dSHerbert Xu .dec = { 1702da7f033dSHerbert Xu .vecs = xtea_dec_tv_template, 1703da7f033dSHerbert Xu .count = XTEA_DEC_TEST_VECTORS 1704da7f033dSHerbert Xu } 1705da7f033dSHerbert Xu } 1706da7f033dSHerbert Xu } 1707da7f033dSHerbert Xu }, { 1708da7f033dSHerbert Xu .alg = "gcm(aes)", 1709da7f033dSHerbert Xu .test = alg_test_aead, 1710da7f033dSHerbert Xu .suite = { 1711da7f033dSHerbert Xu .aead = { 1712da7f033dSHerbert Xu .enc = { 1713da7f033dSHerbert Xu .vecs = aes_gcm_enc_tv_template, 1714da7f033dSHerbert Xu .count = AES_GCM_ENC_TEST_VECTORS 1715da7f033dSHerbert Xu }, 1716da7f033dSHerbert Xu .dec = { 1717da7f033dSHerbert Xu .vecs = aes_gcm_dec_tv_template, 1718da7f033dSHerbert Xu .count = AES_GCM_DEC_TEST_VECTORS 1719da7f033dSHerbert Xu } 1720da7f033dSHerbert Xu } 1721da7f033dSHerbert Xu } 1722da7f033dSHerbert Xu }, { 1723da7f033dSHerbert Xu .alg = "hmac(md5)", 1724da7f033dSHerbert Xu .test = alg_test_hash, 1725da7f033dSHerbert Xu .suite = { 1726da7f033dSHerbert Xu .hash = { 1727da7f033dSHerbert Xu .vecs = hmac_md5_tv_template, 1728da7f033dSHerbert Xu .count = HMAC_MD5_TEST_VECTORS 1729da7f033dSHerbert Xu } 1730da7f033dSHerbert Xu } 1731da7f033dSHerbert Xu }, { 1732da7f033dSHerbert Xu .alg = "hmac(rmd128)", 1733da7f033dSHerbert Xu .test = alg_test_hash, 1734da7f033dSHerbert Xu .suite = { 1735da7f033dSHerbert Xu .hash = { 1736da7f033dSHerbert Xu .vecs = hmac_rmd128_tv_template, 1737da7f033dSHerbert Xu .count = HMAC_RMD128_TEST_VECTORS 1738da7f033dSHerbert Xu } 1739da7f033dSHerbert Xu } 1740da7f033dSHerbert Xu }, { 1741da7f033dSHerbert Xu .alg = "hmac(rmd160)", 1742da7f033dSHerbert Xu .test = alg_test_hash, 1743da7f033dSHerbert Xu .suite = { 1744da7f033dSHerbert Xu .hash = { 1745da7f033dSHerbert Xu .vecs = hmac_rmd160_tv_template, 1746da7f033dSHerbert Xu .count = HMAC_RMD160_TEST_VECTORS 1747da7f033dSHerbert Xu } 1748da7f033dSHerbert Xu } 1749da7f033dSHerbert Xu }, { 1750da7f033dSHerbert Xu .alg = "hmac(sha1)", 1751da7f033dSHerbert Xu .test = alg_test_hash, 1752da7f033dSHerbert Xu .suite = { 1753da7f033dSHerbert Xu .hash = { 1754da7f033dSHerbert Xu .vecs = hmac_sha1_tv_template, 1755da7f033dSHerbert Xu .count = HMAC_SHA1_TEST_VECTORS 1756da7f033dSHerbert Xu } 1757da7f033dSHerbert Xu } 1758da7f033dSHerbert Xu }, { 1759da7f033dSHerbert Xu .alg = "hmac(sha224)", 1760da7f033dSHerbert Xu .test = alg_test_hash, 1761da7f033dSHerbert Xu .suite = { 1762da7f033dSHerbert Xu .hash = { 1763da7f033dSHerbert Xu .vecs = hmac_sha224_tv_template, 1764da7f033dSHerbert Xu .count = HMAC_SHA224_TEST_VECTORS 1765da7f033dSHerbert Xu } 1766da7f033dSHerbert Xu } 1767da7f033dSHerbert Xu }, { 1768da7f033dSHerbert Xu .alg = "hmac(sha256)", 1769da7f033dSHerbert Xu .test = alg_test_hash, 1770da7f033dSHerbert Xu .suite = { 1771da7f033dSHerbert Xu .hash = { 1772da7f033dSHerbert Xu .vecs = hmac_sha256_tv_template, 1773da7f033dSHerbert Xu .count = HMAC_SHA256_TEST_VECTORS 1774da7f033dSHerbert Xu } 1775da7f033dSHerbert Xu } 1776da7f033dSHerbert Xu }, { 1777da7f033dSHerbert Xu .alg = "hmac(sha384)", 1778da7f033dSHerbert Xu .test = alg_test_hash, 1779da7f033dSHerbert Xu .suite = { 1780da7f033dSHerbert Xu .hash = { 1781da7f033dSHerbert Xu .vecs = hmac_sha384_tv_template, 1782da7f033dSHerbert Xu .count = HMAC_SHA384_TEST_VECTORS 1783da7f033dSHerbert Xu } 1784da7f033dSHerbert Xu } 1785da7f033dSHerbert Xu }, { 1786da7f033dSHerbert Xu .alg = "hmac(sha512)", 1787da7f033dSHerbert Xu .test = alg_test_hash, 1788da7f033dSHerbert Xu .suite = { 1789da7f033dSHerbert Xu .hash = { 1790da7f033dSHerbert Xu .vecs = hmac_sha512_tv_template, 1791da7f033dSHerbert Xu .count = HMAC_SHA512_TEST_VECTORS 1792da7f033dSHerbert Xu } 1793da7f033dSHerbert Xu } 1794da7f033dSHerbert Xu }, { 1795da7f033dSHerbert Xu .alg = "lrw(aes)", 17961aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1797da7f033dSHerbert Xu .suite = { 1798da7f033dSHerbert Xu .cipher = { 1799da7f033dSHerbert Xu .enc = { 1800da7f033dSHerbert Xu .vecs = aes_lrw_enc_tv_template, 1801da7f033dSHerbert Xu .count = AES_LRW_ENC_TEST_VECTORS 1802da7f033dSHerbert Xu }, 1803da7f033dSHerbert Xu .dec = { 1804da7f033dSHerbert Xu .vecs = aes_lrw_dec_tv_template, 1805da7f033dSHerbert Xu .count = AES_LRW_DEC_TEST_VECTORS 1806da7f033dSHerbert Xu } 1807da7f033dSHerbert Xu } 1808da7f033dSHerbert Xu } 1809da7f033dSHerbert Xu }, { 1810da7f033dSHerbert Xu .alg = "lzo", 1811da7f033dSHerbert Xu .test = alg_test_comp, 1812da7f033dSHerbert Xu .suite = { 1813da7f033dSHerbert Xu .comp = { 1814da7f033dSHerbert Xu .comp = { 1815da7f033dSHerbert Xu .vecs = lzo_comp_tv_template, 1816da7f033dSHerbert Xu .count = LZO_COMP_TEST_VECTORS 1817da7f033dSHerbert Xu }, 1818da7f033dSHerbert Xu .decomp = { 1819da7f033dSHerbert Xu .vecs = lzo_decomp_tv_template, 1820da7f033dSHerbert Xu .count = LZO_DECOMP_TEST_VECTORS 1821da7f033dSHerbert Xu } 1822da7f033dSHerbert Xu } 1823da7f033dSHerbert Xu } 1824da7f033dSHerbert Xu }, { 1825da7f033dSHerbert Xu .alg = "md4", 1826da7f033dSHerbert Xu .test = alg_test_hash, 1827da7f033dSHerbert Xu .suite = { 1828da7f033dSHerbert Xu .hash = { 1829da7f033dSHerbert Xu .vecs = md4_tv_template, 1830da7f033dSHerbert Xu .count = MD4_TEST_VECTORS 1831da7f033dSHerbert Xu } 1832da7f033dSHerbert Xu } 1833da7f033dSHerbert Xu }, { 1834da7f033dSHerbert Xu .alg = "md5", 1835da7f033dSHerbert Xu .test = alg_test_hash, 1836da7f033dSHerbert Xu .suite = { 1837da7f033dSHerbert Xu .hash = { 1838da7f033dSHerbert Xu .vecs = md5_tv_template, 1839da7f033dSHerbert Xu .count = MD5_TEST_VECTORS 1840da7f033dSHerbert Xu } 1841da7f033dSHerbert Xu } 1842da7f033dSHerbert Xu }, { 1843da7f033dSHerbert Xu .alg = "michael_mic", 1844da7f033dSHerbert Xu .test = alg_test_hash, 1845da7f033dSHerbert Xu .suite = { 1846da7f033dSHerbert Xu .hash = { 1847da7f033dSHerbert Xu .vecs = michael_mic_tv_template, 1848da7f033dSHerbert Xu .count = MICHAEL_MIC_TEST_VECTORS 1849da7f033dSHerbert Xu } 1850da7f033dSHerbert Xu } 1851da7f033dSHerbert Xu }, { 1852da7f033dSHerbert Xu .alg = "pcbc(fcrypt)", 18531aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1854da7f033dSHerbert Xu .suite = { 1855da7f033dSHerbert Xu .cipher = { 1856da7f033dSHerbert Xu .enc = { 1857da7f033dSHerbert Xu .vecs = fcrypt_pcbc_enc_tv_template, 1858da7f033dSHerbert Xu .count = FCRYPT_ENC_TEST_VECTORS 1859da7f033dSHerbert Xu }, 1860da7f033dSHerbert Xu .dec = { 1861da7f033dSHerbert Xu .vecs = fcrypt_pcbc_dec_tv_template, 1862da7f033dSHerbert Xu .count = FCRYPT_DEC_TEST_VECTORS 1863da7f033dSHerbert Xu } 1864da7f033dSHerbert Xu } 1865da7f033dSHerbert Xu } 1866da7f033dSHerbert Xu }, { 1867da7f033dSHerbert Xu .alg = "rfc3686(ctr(aes))", 18681aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1869da7f033dSHerbert Xu .suite = { 1870da7f033dSHerbert Xu .cipher = { 1871da7f033dSHerbert Xu .enc = { 1872da7f033dSHerbert Xu .vecs = aes_ctr_enc_tv_template, 1873da7f033dSHerbert Xu .count = AES_CTR_ENC_TEST_VECTORS 1874da7f033dSHerbert Xu }, 1875da7f033dSHerbert Xu .dec = { 1876da7f033dSHerbert Xu .vecs = aes_ctr_dec_tv_template, 1877da7f033dSHerbert Xu .count = AES_CTR_DEC_TEST_VECTORS 1878da7f033dSHerbert Xu } 1879da7f033dSHerbert Xu } 1880da7f033dSHerbert Xu } 1881da7f033dSHerbert Xu }, { 18825d667322SJarod Wilson .alg = "rfc4309(ccm(aes))", 18835d667322SJarod Wilson .test = alg_test_aead, 18845d667322SJarod Wilson .suite = { 18855d667322SJarod Wilson .aead = { 18865d667322SJarod Wilson .enc = { 18875d667322SJarod Wilson .vecs = aes_ccm_rfc4309_enc_tv_template, 18885d667322SJarod Wilson .count = AES_CCM_4309_ENC_TEST_VECTORS 18895d667322SJarod Wilson }, 18905d667322SJarod Wilson .dec = { 18915d667322SJarod Wilson .vecs = aes_ccm_rfc4309_dec_tv_template, 18925d667322SJarod Wilson .count = AES_CCM_4309_DEC_TEST_VECTORS 18935d667322SJarod Wilson } 18945d667322SJarod Wilson } 18955d667322SJarod Wilson } 18965d667322SJarod Wilson }, { 1897da7f033dSHerbert Xu .alg = "rmd128", 1898da7f033dSHerbert Xu .test = alg_test_hash, 1899da7f033dSHerbert Xu .suite = { 1900da7f033dSHerbert Xu .hash = { 1901da7f033dSHerbert Xu .vecs = rmd128_tv_template, 1902da7f033dSHerbert Xu .count = RMD128_TEST_VECTORS 1903da7f033dSHerbert Xu } 1904da7f033dSHerbert Xu } 1905da7f033dSHerbert Xu }, { 1906da7f033dSHerbert Xu .alg = "rmd160", 1907da7f033dSHerbert Xu .test = alg_test_hash, 1908da7f033dSHerbert Xu .suite = { 1909da7f033dSHerbert Xu .hash = { 1910da7f033dSHerbert Xu .vecs = rmd160_tv_template, 1911da7f033dSHerbert Xu .count = RMD160_TEST_VECTORS 1912da7f033dSHerbert Xu } 1913da7f033dSHerbert Xu } 1914da7f033dSHerbert Xu }, { 1915da7f033dSHerbert Xu .alg = "rmd256", 1916da7f033dSHerbert Xu .test = alg_test_hash, 1917da7f033dSHerbert Xu .suite = { 1918da7f033dSHerbert Xu .hash = { 1919da7f033dSHerbert Xu .vecs = rmd256_tv_template, 1920da7f033dSHerbert Xu .count = RMD256_TEST_VECTORS 1921da7f033dSHerbert Xu } 1922da7f033dSHerbert Xu } 1923da7f033dSHerbert Xu }, { 1924da7f033dSHerbert Xu .alg = "rmd320", 1925da7f033dSHerbert Xu .test = alg_test_hash, 1926da7f033dSHerbert Xu .suite = { 1927da7f033dSHerbert Xu .hash = { 1928da7f033dSHerbert Xu .vecs = rmd320_tv_template, 1929da7f033dSHerbert Xu .count = RMD320_TEST_VECTORS 1930da7f033dSHerbert Xu } 1931da7f033dSHerbert Xu } 1932da7f033dSHerbert Xu }, { 1933da7f033dSHerbert Xu .alg = "salsa20", 19341aa4ecd9SHerbert Xu .test = alg_test_skcipher, 1935da7f033dSHerbert Xu .suite = { 1936da7f033dSHerbert Xu .cipher = { 1937da7f033dSHerbert Xu .enc = { 1938da7f033dSHerbert Xu .vecs = salsa20_stream_enc_tv_template, 1939da7f033dSHerbert Xu .count = SALSA20_STREAM_ENC_TEST_VECTORS 1940da7f033dSHerbert Xu } 1941da7f033dSHerbert Xu } 1942da7f033dSHerbert Xu } 1943da7f033dSHerbert Xu }, { 1944da7f033dSHerbert Xu .alg = "sha1", 1945da7f033dSHerbert Xu .test = alg_test_hash, 1946da7f033dSHerbert Xu .suite = { 1947da7f033dSHerbert Xu .hash = { 1948da7f033dSHerbert Xu .vecs = sha1_tv_template, 1949da7f033dSHerbert Xu .count = SHA1_TEST_VECTORS 1950da7f033dSHerbert Xu } 1951da7f033dSHerbert Xu } 1952da7f033dSHerbert Xu }, { 1953da7f033dSHerbert Xu .alg = "sha224", 1954da7f033dSHerbert Xu .test = alg_test_hash, 1955da7f033dSHerbert Xu .suite = { 1956da7f033dSHerbert Xu .hash = { 1957da7f033dSHerbert Xu .vecs = sha224_tv_template, 1958da7f033dSHerbert Xu .count = SHA224_TEST_VECTORS 1959da7f033dSHerbert Xu } 1960da7f033dSHerbert Xu } 1961da7f033dSHerbert Xu }, { 1962da7f033dSHerbert Xu .alg = "sha256", 1963da7f033dSHerbert Xu .test = alg_test_hash, 1964da7f033dSHerbert Xu .suite = { 1965da7f033dSHerbert Xu .hash = { 1966da7f033dSHerbert Xu .vecs = sha256_tv_template, 1967da7f033dSHerbert Xu .count = SHA256_TEST_VECTORS 1968da7f033dSHerbert Xu } 1969da7f033dSHerbert Xu } 1970da7f033dSHerbert Xu }, { 1971da7f033dSHerbert Xu .alg = "sha384", 1972da7f033dSHerbert Xu .test = alg_test_hash, 1973da7f033dSHerbert Xu .suite = { 1974da7f033dSHerbert Xu .hash = { 1975da7f033dSHerbert Xu .vecs = sha384_tv_template, 1976da7f033dSHerbert Xu .count = SHA384_TEST_VECTORS 1977da7f033dSHerbert Xu } 1978da7f033dSHerbert Xu } 1979da7f033dSHerbert Xu }, { 1980da7f033dSHerbert Xu .alg = "sha512", 1981da7f033dSHerbert Xu .test = alg_test_hash, 1982da7f033dSHerbert Xu .suite = { 1983da7f033dSHerbert Xu .hash = { 1984da7f033dSHerbert Xu .vecs = sha512_tv_template, 1985da7f033dSHerbert Xu .count = SHA512_TEST_VECTORS 1986da7f033dSHerbert Xu } 1987da7f033dSHerbert Xu } 1988da7f033dSHerbert Xu }, { 1989da7f033dSHerbert Xu .alg = "tgr128", 1990da7f033dSHerbert Xu .test = alg_test_hash, 1991da7f033dSHerbert Xu .suite = { 1992da7f033dSHerbert Xu .hash = { 1993da7f033dSHerbert Xu .vecs = tgr128_tv_template, 1994da7f033dSHerbert Xu .count = TGR128_TEST_VECTORS 1995da7f033dSHerbert Xu } 1996da7f033dSHerbert Xu } 1997da7f033dSHerbert Xu }, { 1998da7f033dSHerbert Xu .alg = "tgr160", 1999da7f033dSHerbert Xu .test = alg_test_hash, 2000da7f033dSHerbert Xu .suite = { 2001da7f033dSHerbert Xu .hash = { 2002da7f033dSHerbert Xu .vecs = tgr160_tv_template, 2003da7f033dSHerbert Xu .count = TGR160_TEST_VECTORS 2004da7f033dSHerbert Xu } 2005da7f033dSHerbert Xu } 2006da7f033dSHerbert Xu }, { 2007da7f033dSHerbert Xu .alg = "tgr192", 2008da7f033dSHerbert Xu .test = alg_test_hash, 2009da7f033dSHerbert Xu .suite = { 2010da7f033dSHerbert Xu .hash = { 2011da7f033dSHerbert Xu .vecs = tgr192_tv_template, 2012da7f033dSHerbert Xu .count = TGR192_TEST_VECTORS 2013da7f033dSHerbert Xu } 2014da7f033dSHerbert Xu } 2015da7f033dSHerbert Xu }, { 2016da7f033dSHerbert Xu .alg = "wp256", 2017da7f033dSHerbert Xu .test = alg_test_hash, 2018da7f033dSHerbert Xu .suite = { 2019da7f033dSHerbert Xu .hash = { 2020da7f033dSHerbert Xu .vecs = wp256_tv_template, 2021da7f033dSHerbert Xu .count = WP256_TEST_VECTORS 2022da7f033dSHerbert Xu } 2023da7f033dSHerbert Xu } 2024da7f033dSHerbert Xu }, { 2025da7f033dSHerbert Xu .alg = "wp384", 2026da7f033dSHerbert Xu .test = alg_test_hash, 2027da7f033dSHerbert Xu .suite = { 2028da7f033dSHerbert Xu .hash = { 2029da7f033dSHerbert Xu .vecs = wp384_tv_template, 2030da7f033dSHerbert Xu .count = WP384_TEST_VECTORS 2031da7f033dSHerbert Xu } 2032da7f033dSHerbert Xu } 2033da7f033dSHerbert Xu }, { 2034da7f033dSHerbert Xu .alg = "wp512", 2035da7f033dSHerbert Xu .test = alg_test_hash, 2036da7f033dSHerbert Xu .suite = { 2037da7f033dSHerbert Xu .hash = { 2038da7f033dSHerbert Xu .vecs = wp512_tv_template, 2039da7f033dSHerbert Xu .count = WP512_TEST_VECTORS 2040da7f033dSHerbert Xu } 2041da7f033dSHerbert Xu } 2042da7f033dSHerbert Xu }, { 2043da7f033dSHerbert Xu .alg = "xcbc(aes)", 2044da7f033dSHerbert Xu .test = alg_test_hash, 2045da7f033dSHerbert Xu .suite = { 2046da7f033dSHerbert Xu .hash = { 2047da7f033dSHerbert Xu .vecs = aes_xcbc128_tv_template, 2048da7f033dSHerbert Xu .count = XCBC_AES_TEST_VECTORS 2049da7f033dSHerbert Xu } 2050da7f033dSHerbert Xu } 2051da7f033dSHerbert Xu }, { 2052da7f033dSHerbert Xu .alg = "xts(aes)", 20531aa4ecd9SHerbert Xu .test = alg_test_skcipher, 2054da7f033dSHerbert Xu .suite = { 2055da7f033dSHerbert Xu .cipher = { 2056da7f033dSHerbert Xu .enc = { 2057da7f033dSHerbert Xu .vecs = aes_xts_enc_tv_template, 2058da7f033dSHerbert Xu .count = AES_XTS_ENC_TEST_VECTORS 2059da7f033dSHerbert Xu }, 2060da7f033dSHerbert Xu .dec = { 2061da7f033dSHerbert Xu .vecs = aes_xts_dec_tv_template, 2062da7f033dSHerbert Xu .count = AES_XTS_DEC_TEST_VECTORS 2063da7f033dSHerbert Xu } 2064da7f033dSHerbert Xu } 2065da7f033dSHerbert Xu } 20660c01aed5SGeert Uytterhoeven }, { 20670c01aed5SGeert Uytterhoeven .alg = "zlib", 20680c01aed5SGeert Uytterhoeven .test = alg_test_pcomp, 20690c01aed5SGeert Uytterhoeven .suite = { 20700c01aed5SGeert Uytterhoeven .pcomp = { 20710c01aed5SGeert Uytterhoeven .comp = { 20720c01aed5SGeert Uytterhoeven .vecs = zlib_comp_tv_template, 20730c01aed5SGeert Uytterhoeven .count = ZLIB_COMP_TEST_VECTORS 20740c01aed5SGeert Uytterhoeven }, 20750c01aed5SGeert Uytterhoeven .decomp = { 20760c01aed5SGeert Uytterhoeven .vecs = zlib_decomp_tv_template, 20770c01aed5SGeert Uytterhoeven .count = ZLIB_DECOMP_TEST_VECTORS 20780c01aed5SGeert Uytterhoeven } 20790c01aed5SGeert Uytterhoeven } 20800c01aed5SGeert Uytterhoeven } 2081da7f033dSHerbert Xu } 2082da7f033dSHerbert Xu }; 2083da7f033dSHerbert Xu 20841aa4ecd9SHerbert Xu static int alg_find_test(const char *alg) 2085da7f033dSHerbert Xu { 2086da7f033dSHerbert Xu int start = 0; 2087da7f033dSHerbert Xu int end = ARRAY_SIZE(alg_test_descs); 2088da7f033dSHerbert Xu 2089da7f033dSHerbert Xu while (start < end) { 2090da7f033dSHerbert Xu int i = (start + end) / 2; 2091da7f033dSHerbert Xu int diff = strcmp(alg_test_descs[i].alg, alg); 2092da7f033dSHerbert Xu 2093da7f033dSHerbert Xu if (diff > 0) { 2094da7f033dSHerbert Xu end = i; 2095da7f033dSHerbert Xu continue; 2096da7f033dSHerbert Xu } 2097da7f033dSHerbert Xu 2098da7f033dSHerbert Xu if (diff < 0) { 2099da7f033dSHerbert Xu start = i + 1; 2100da7f033dSHerbert Xu continue; 2101da7f033dSHerbert Xu } 2102da7f033dSHerbert Xu 21031aa4ecd9SHerbert Xu return i; 2104da7f033dSHerbert Xu } 2105da7f033dSHerbert Xu 21061aa4ecd9SHerbert Xu return -1; 21071aa4ecd9SHerbert Xu } 21081aa4ecd9SHerbert Xu 21091aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 21101aa4ecd9SHerbert Xu { 21111aa4ecd9SHerbert Xu int i; 2112d12d6b6dSNeil Horman int rc; 21131aa4ecd9SHerbert Xu 21141aa4ecd9SHerbert Xu if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) { 21151aa4ecd9SHerbert Xu char nalg[CRYPTO_MAX_ALG_NAME]; 21161aa4ecd9SHerbert Xu 21171aa4ecd9SHerbert Xu if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >= 21181aa4ecd9SHerbert Xu sizeof(nalg)) 21191aa4ecd9SHerbert Xu return -ENAMETOOLONG; 21201aa4ecd9SHerbert Xu 21211aa4ecd9SHerbert Xu i = alg_find_test(nalg); 21221aa4ecd9SHerbert Xu if (i < 0) 21231aa4ecd9SHerbert Xu goto notest; 21241aa4ecd9SHerbert Xu 21251aa4ecd9SHerbert Xu return alg_test_cipher(alg_test_descs + i, driver, type, mask); 21261aa4ecd9SHerbert Xu } 21271aa4ecd9SHerbert Xu 21281aa4ecd9SHerbert Xu i = alg_find_test(alg); 21291aa4ecd9SHerbert Xu if (i < 0) 21301aa4ecd9SHerbert Xu goto notest; 21311aa4ecd9SHerbert Xu 2132d12d6b6dSNeil Horman rc = alg_test_descs[i].test(alg_test_descs + i, driver, 21331aa4ecd9SHerbert Xu type, mask); 2134d12d6b6dSNeil Horman if (fips_enabled && rc) 2135d12d6b6dSNeil Horman panic("%s: %s alg self test failed in fips mode!\n", driver, alg); 2136d12d6b6dSNeil Horman 2137d12d6b6dSNeil Horman return rc; 21381aa4ecd9SHerbert Xu 21391aa4ecd9SHerbert Xu notest: 2140da7f033dSHerbert Xu printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver); 2141da7f033dSHerbert Xu return 0; 2142da7f033dSHerbert Xu } 2143da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test); 2144da7f033dSHerbert Xu 2145da7f033dSHerbert Xu int __init testmgr_init(void) 2146da7f033dSHerbert Xu { 2147da7f033dSHerbert Xu int i; 2148da7f033dSHerbert Xu 2149da7f033dSHerbert Xu for (i = 0; i < XBUFSIZE; i++) { 2150da7f033dSHerbert Xu xbuf[i] = (void *)__get_free_page(GFP_KERNEL); 2151da7f033dSHerbert Xu if (!xbuf[i]) 2152da7f033dSHerbert Xu goto err_free_xbuf; 2153da7f033dSHerbert Xu } 2154da7f033dSHerbert Xu 2155da7f033dSHerbert Xu for (i = 0; i < XBUFSIZE; i++) { 2156da7f033dSHerbert Xu axbuf[i] = (void *)__get_free_page(GFP_KERNEL); 2157da7f033dSHerbert Xu if (!axbuf[i]) 2158da7f033dSHerbert Xu goto err_free_axbuf; 2159da7f033dSHerbert Xu } 2160da7f033dSHerbert Xu 2161da7f033dSHerbert Xu return 0; 2162da7f033dSHerbert Xu 2163da7f033dSHerbert Xu err_free_axbuf: 2164da7f033dSHerbert Xu for (i = 0; i < XBUFSIZE && axbuf[i]; i++) 2165da7f033dSHerbert Xu free_page((unsigned long)axbuf[i]); 2166da7f033dSHerbert Xu err_free_xbuf: 2167da7f033dSHerbert Xu for (i = 0; i < XBUFSIZE && xbuf[i]; i++) 2168da7f033dSHerbert Xu free_page((unsigned long)xbuf[i]); 2169da7f033dSHerbert Xu 2170da7f033dSHerbert Xu return -ENOMEM; 2171da7f033dSHerbert Xu } 2172da7f033dSHerbert Xu 2173da7f033dSHerbert Xu void testmgr_exit(void) 2174da7f033dSHerbert Xu { 2175da7f033dSHerbert Xu int i; 2176da7f033dSHerbert Xu 2177da7f033dSHerbert Xu for (i = 0; i < XBUFSIZE; i++) 2178da7f033dSHerbert Xu free_page((unsigned long)axbuf[i]); 2179da7f033dSHerbert Xu for (i = 0; i < XBUFSIZE; i++) 2180da7f033dSHerbert Xu free_page((unsigned long)xbuf[i]); 2181da7f033dSHerbert Xu } 2182