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 75da7f033dSHerbert Xu struct hash_test_suite { 76da7f033dSHerbert Xu struct hash_testvec *vecs; 77da7f033dSHerbert Xu unsigned int count; 78da7f033dSHerbert Xu }; 79da7f033dSHerbert Xu 80da7f033dSHerbert Xu struct alg_test_desc { 81da7f033dSHerbert Xu const char *alg; 82da7f033dSHerbert Xu int (*test)(const struct alg_test_desc *desc, const char *driver, 83da7f033dSHerbert Xu u32 type, u32 mask); 84da7f033dSHerbert Xu 85da7f033dSHerbert Xu union { 86da7f033dSHerbert Xu struct aead_test_suite aead; 87da7f033dSHerbert Xu struct cipher_test_suite cipher; 88da7f033dSHerbert Xu struct comp_test_suite comp; 89da7f033dSHerbert Xu struct hash_test_suite hash; 90da7f033dSHerbert Xu } suite; 91da7f033dSHerbert Xu }; 92da7f033dSHerbert Xu 93da7f033dSHerbert Xu static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 }; 94da7f033dSHerbert Xu 95da7f033dSHerbert Xu static char *xbuf[XBUFSIZE]; 96da7f033dSHerbert Xu static char *axbuf[XBUFSIZE]; 97da7f033dSHerbert Xu 98da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len) 99da7f033dSHerbert Xu { 100da7f033dSHerbert Xu print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET, 101da7f033dSHerbert Xu 16, 1, 102da7f033dSHerbert Xu buf, len, false); 103da7f033dSHerbert Xu } 104da7f033dSHerbert Xu 105da7f033dSHerbert Xu static void tcrypt_complete(struct crypto_async_request *req, int err) 106da7f033dSHerbert Xu { 107da7f033dSHerbert Xu struct tcrypt_result *res = req->data; 108da7f033dSHerbert Xu 109da7f033dSHerbert Xu if (err == -EINPROGRESS) 110da7f033dSHerbert Xu return; 111da7f033dSHerbert Xu 112da7f033dSHerbert Xu res->err = err; 113da7f033dSHerbert Xu complete(&res->completion); 114da7f033dSHerbert Xu } 115da7f033dSHerbert Xu 116da7f033dSHerbert Xu static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template, 117da7f033dSHerbert Xu unsigned int tcount) 118da7f033dSHerbert Xu { 119da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm)); 120da7f033dSHerbert Xu unsigned int i, j, k, temp; 121da7f033dSHerbert Xu struct scatterlist sg[8]; 122da7f033dSHerbert Xu char result[64]; 123da7f033dSHerbert Xu struct ahash_request *req; 124da7f033dSHerbert Xu struct tcrypt_result tresult; 125da7f033dSHerbert Xu int ret; 126da7f033dSHerbert Xu void *hash_buff; 127da7f033dSHerbert Xu 128da7f033dSHerbert Xu init_completion(&tresult.completion); 129da7f033dSHerbert Xu 130da7f033dSHerbert Xu req = ahash_request_alloc(tfm, GFP_KERNEL); 131da7f033dSHerbert Xu if (!req) { 132da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to allocate request for " 133da7f033dSHerbert Xu "%s\n", algo); 134da7f033dSHerbert Xu ret = -ENOMEM; 135da7f033dSHerbert Xu goto out_noreq; 136da7f033dSHerbert Xu } 137da7f033dSHerbert Xu ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 138da7f033dSHerbert Xu tcrypt_complete, &tresult); 139da7f033dSHerbert Xu 140da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 141da7f033dSHerbert Xu memset(result, 0, 64); 142da7f033dSHerbert Xu 143da7f033dSHerbert Xu hash_buff = xbuf[0]; 144da7f033dSHerbert Xu 145da7f033dSHerbert Xu memcpy(hash_buff, template[i].plaintext, template[i].psize); 146da7f033dSHerbert Xu sg_init_one(&sg[0], hash_buff, template[i].psize); 147da7f033dSHerbert Xu 148da7f033dSHerbert Xu if (template[i].ksize) { 149da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 150da7f033dSHerbert Xu ret = crypto_ahash_setkey(tfm, template[i].key, 151da7f033dSHerbert Xu template[i].ksize); 152da7f033dSHerbert Xu if (ret) { 153da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey failed on " 154da7f033dSHerbert Xu "test %d for %s: ret=%d\n", i + 1, algo, 155da7f033dSHerbert Xu -ret); 156da7f033dSHerbert Xu goto out; 157da7f033dSHerbert Xu } 158da7f033dSHerbert Xu } 159da7f033dSHerbert Xu 160da7f033dSHerbert Xu ahash_request_set_crypt(req, sg, result, template[i].psize); 161da7f033dSHerbert Xu ret = crypto_ahash_digest(req); 162da7f033dSHerbert Xu switch (ret) { 163da7f033dSHerbert Xu case 0: 164da7f033dSHerbert Xu break; 165da7f033dSHerbert Xu case -EINPROGRESS: 166da7f033dSHerbert Xu case -EBUSY: 167da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 168da7f033dSHerbert Xu &tresult.completion); 169da7f033dSHerbert Xu if (!ret && !(ret = tresult.err)) { 170da7f033dSHerbert Xu INIT_COMPLETION(tresult.completion); 171da7f033dSHerbert Xu break; 172da7f033dSHerbert Xu } 173da7f033dSHerbert Xu /* fall through */ 174da7f033dSHerbert Xu default: 175da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: digest failed on test %d " 176da7f033dSHerbert Xu "for %s: ret=%d\n", i + 1, algo, -ret); 177da7f033dSHerbert Xu goto out; 178da7f033dSHerbert Xu } 179da7f033dSHerbert Xu 180da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 181da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 182da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Test %d failed for %s\n", 183da7f033dSHerbert Xu i + 1, algo); 184da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 185da7f033dSHerbert Xu ret = -EINVAL; 186da7f033dSHerbert Xu goto out; 187da7f033dSHerbert Xu } 188da7f033dSHerbert Xu } 189da7f033dSHerbert Xu 190da7f033dSHerbert Xu j = 0; 191da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 192da7f033dSHerbert Xu if (template[i].np) { 193da7f033dSHerbert Xu j++; 194da7f033dSHerbert Xu memset(result, 0, 64); 195da7f033dSHerbert Xu 196da7f033dSHerbert Xu temp = 0; 197da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 198da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 199da7f033dSHerbert Xu sg_set_buf(&sg[k], 200da7f033dSHerbert Xu memcpy(xbuf[IDX[k] >> PAGE_SHIFT] + 201da7f033dSHerbert Xu offset_in_page(IDX[k]), 202da7f033dSHerbert Xu template[i].plaintext + temp, 203da7f033dSHerbert Xu template[i].tap[k]), 204da7f033dSHerbert Xu template[i].tap[k]); 205da7f033dSHerbert Xu temp += template[i].tap[k]; 206da7f033dSHerbert Xu } 207da7f033dSHerbert Xu 208da7f033dSHerbert Xu if (template[i].ksize) { 209da7f033dSHerbert Xu crypto_ahash_clear_flags(tfm, ~0); 210da7f033dSHerbert Xu ret = crypto_ahash_setkey(tfm, template[i].key, 211da7f033dSHerbert Xu template[i].ksize); 212da7f033dSHerbert Xu 213da7f033dSHerbert Xu if (ret) { 214da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: setkey " 215da7f033dSHerbert Xu "failed on chunking test %d " 216da7f033dSHerbert Xu "for %s: ret=%d\n", j, algo, 217da7f033dSHerbert Xu -ret); 218da7f033dSHerbert Xu goto out; 219da7f033dSHerbert Xu } 220da7f033dSHerbert Xu } 221da7f033dSHerbert Xu 222da7f033dSHerbert Xu ahash_request_set_crypt(req, sg, result, 223da7f033dSHerbert Xu template[i].psize); 224da7f033dSHerbert Xu ret = crypto_ahash_digest(req); 225da7f033dSHerbert Xu switch (ret) { 226da7f033dSHerbert Xu case 0: 227da7f033dSHerbert Xu break; 228da7f033dSHerbert Xu case -EINPROGRESS: 229da7f033dSHerbert Xu case -EBUSY: 230da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 231da7f033dSHerbert Xu &tresult.completion); 232da7f033dSHerbert Xu if (!ret && !(ret = tresult.err)) { 233da7f033dSHerbert Xu INIT_COMPLETION(tresult.completion); 234da7f033dSHerbert Xu break; 235da7f033dSHerbert Xu } 236da7f033dSHerbert Xu /* fall through */ 237da7f033dSHerbert Xu default: 238da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: digest failed " 239da7f033dSHerbert Xu "on chunking test %d for %s: " 240da7f033dSHerbert Xu "ret=%d\n", j, algo, -ret); 241da7f033dSHerbert Xu goto out; 242da7f033dSHerbert Xu } 243da7f033dSHerbert Xu 244da7f033dSHerbert Xu if (memcmp(result, template[i].digest, 245da7f033dSHerbert Xu crypto_ahash_digestsize(tfm))) { 246da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Chunking test %d " 247da7f033dSHerbert Xu "failed for %s\n", j, algo); 248da7f033dSHerbert Xu hexdump(result, crypto_ahash_digestsize(tfm)); 249da7f033dSHerbert Xu ret = -EINVAL; 250da7f033dSHerbert Xu goto out; 251da7f033dSHerbert Xu } 252da7f033dSHerbert Xu } 253da7f033dSHerbert Xu } 254da7f033dSHerbert Xu 255da7f033dSHerbert Xu ret = 0; 256da7f033dSHerbert Xu 257da7f033dSHerbert Xu out: 258da7f033dSHerbert Xu ahash_request_free(req); 259da7f033dSHerbert Xu out_noreq: 260da7f033dSHerbert Xu return ret; 261da7f033dSHerbert Xu } 262da7f033dSHerbert Xu 263da7f033dSHerbert Xu static int test_aead(struct crypto_aead *tfm, int enc, 264da7f033dSHerbert Xu struct aead_testvec *template, unsigned int tcount) 265da7f033dSHerbert Xu { 266da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)); 267da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 268da7f033dSHerbert Xu int ret = 0; 269da7f033dSHerbert Xu char *q; 270da7f033dSHerbert Xu char *key; 271da7f033dSHerbert Xu struct aead_request *req; 272da7f033dSHerbert Xu struct scatterlist sg[8]; 273da7f033dSHerbert Xu struct scatterlist asg[8]; 274da7f033dSHerbert Xu const char *e; 275da7f033dSHerbert Xu struct tcrypt_result result; 276da7f033dSHerbert Xu unsigned int authsize; 277da7f033dSHerbert Xu void *input; 278da7f033dSHerbert Xu void *assoc; 279da7f033dSHerbert Xu char iv[MAX_IVLEN]; 280da7f033dSHerbert Xu 281da7f033dSHerbert Xu if (enc == ENCRYPT) 282da7f033dSHerbert Xu e = "encryption"; 283da7f033dSHerbert Xu else 284da7f033dSHerbert Xu e = "decryption"; 285da7f033dSHerbert Xu 286da7f033dSHerbert Xu init_completion(&result.completion); 287da7f033dSHerbert Xu 288da7f033dSHerbert Xu req = aead_request_alloc(tfm, GFP_KERNEL); 289da7f033dSHerbert Xu if (!req) { 290da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to allocate request for " 291da7f033dSHerbert Xu "%s\n", algo); 292da7f033dSHerbert Xu ret = -ENOMEM; 293da7f033dSHerbert Xu goto out; 294da7f033dSHerbert Xu } 295da7f033dSHerbert Xu 296da7f033dSHerbert Xu aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 297da7f033dSHerbert Xu tcrypt_complete, &result); 298da7f033dSHerbert Xu 299da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 300da7f033dSHerbert Xu if (!template[i].np) { 301da7f033dSHerbert Xu j++; 302da7f033dSHerbert Xu 303da7f033dSHerbert Xu /* some tepmplates have no input data but they will 304da7f033dSHerbert Xu * touch input 305da7f033dSHerbert Xu */ 306da7f033dSHerbert Xu input = xbuf[0]; 307da7f033dSHerbert Xu assoc = axbuf[0]; 308da7f033dSHerbert Xu 309da7f033dSHerbert Xu memcpy(input, template[i].input, template[i].ilen); 310da7f033dSHerbert Xu memcpy(assoc, template[i].assoc, template[i].alen); 311da7f033dSHerbert Xu if (template[i].iv) 312da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 313da7f033dSHerbert Xu else 314da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 315da7f033dSHerbert Xu 316da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 317da7f033dSHerbert Xu if (template[i].wk) 318da7f033dSHerbert Xu crypto_aead_set_flags( 319da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 320da7f033dSHerbert Xu 321da7f033dSHerbert Xu key = template[i].key; 322da7f033dSHerbert Xu 323da7f033dSHerbert Xu ret = crypto_aead_setkey(tfm, key, 324da7f033dSHerbert Xu template[i].klen); 325da7f033dSHerbert Xu if (!ret == template[i].fail) { 326da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: setkey failed on " 327da7f033dSHerbert Xu "test %d for %s: flags=%x\n", j, algo, 328da7f033dSHerbert Xu crypto_aead_get_flags(tfm)); 329da7f033dSHerbert Xu goto out; 330da7f033dSHerbert Xu } else if (ret) 331da7f033dSHerbert Xu continue; 332da7f033dSHerbert Xu 333da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 334da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 335da7f033dSHerbert Xu if (ret) { 336da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to set " 337da7f033dSHerbert Xu "authsize to %u on test %d for %s\n", 338da7f033dSHerbert Xu authsize, j, algo); 339da7f033dSHerbert Xu goto out; 340da7f033dSHerbert Xu } 341da7f033dSHerbert Xu 342da7f033dSHerbert Xu sg_init_one(&sg[0], input, 343da7f033dSHerbert Xu template[i].ilen + (enc ? authsize : 0)); 344da7f033dSHerbert Xu 345da7f033dSHerbert Xu sg_init_one(&asg[0], assoc, template[i].alen); 346da7f033dSHerbert Xu 347da7f033dSHerbert Xu aead_request_set_crypt(req, sg, sg, 348da7f033dSHerbert Xu template[i].ilen, iv); 349da7f033dSHerbert Xu 350da7f033dSHerbert Xu aead_request_set_assoc(req, asg, template[i].alen); 351da7f033dSHerbert Xu 352da7f033dSHerbert Xu ret = enc ? 353da7f033dSHerbert Xu crypto_aead_encrypt(req) : 354da7f033dSHerbert Xu crypto_aead_decrypt(req); 355da7f033dSHerbert Xu 356da7f033dSHerbert Xu switch (ret) { 357da7f033dSHerbert Xu case 0: 358da7f033dSHerbert Xu break; 359da7f033dSHerbert Xu case -EINPROGRESS: 360da7f033dSHerbert Xu case -EBUSY: 361da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 362da7f033dSHerbert Xu &result.completion); 363da7f033dSHerbert Xu if (!ret && !(ret = result.err)) { 364da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 365da7f033dSHerbert Xu break; 366da7f033dSHerbert Xu } 367da7f033dSHerbert Xu /* fall through */ 368da7f033dSHerbert Xu default: 369da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: %s failed on test " 370da7f033dSHerbert Xu "%d for %s: ret=%d\n", e, j, algo, -ret); 371da7f033dSHerbert Xu goto out; 372da7f033dSHerbert Xu } 373da7f033dSHerbert Xu 374da7f033dSHerbert Xu q = input; 375da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 376da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Test %d failed on " 377da7f033dSHerbert Xu "%s for %s\n", j, e, algo); 378da7f033dSHerbert Xu hexdump(q, template[i].rlen); 379da7f033dSHerbert Xu ret = -EINVAL; 380da7f033dSHerbert Xu goto out; 381da7f033dSHerbert Xu } 382da7f033dSHerbert Xu } 383da7f033dSHerbert Xu } 384da7f033dSHerbert Xu 385da7f033dSHerbert Xu for (i = 0, j = 0; i < tcount; i++) { 386da7f033dSHerbert Xu if (template[i].np) { 387da7f033dSHerbert Xu j++; 388da7f033dSHerbert Xu 389da7f033dSHerbert Xu if (template[i].iv) 390da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 391da7f033dSHerbert Xu else 392da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 393da7f033dSHerbert Xu 394da7f033dSHerbert Xu crypto_aead_clear_flags(tfm, ~0); 395da7f033dSHerbert Xu if (template[i].wk) 396da7f033dSHerbert Xu crypto_aead_set_flags( 397da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 398da7f033dSHerbert Xu key = template[i].key; 399da7f033dSHerbert Xu 400da7f033dSHerbert Xu ret = crypto_aead_setkey(tfm, key, template[i].klen); 401da7f033dSHerbert Xu if (!ret == template[i].fail) { 402da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: setkey failed on " 403da7f033dSHerbert Xu "chunk test %d for %s: flags=%x\n", j, 404da7f033dSHerbert Xu algo, crypto_aead_get_flags(tfm)); 405da7f033dSHerbert Xu goto out; 406da7f033dSHerbert Xu } else if (ret) 407da7f033dSHerbert Xu continue; 408da7f033dSHerbert Xu 409da7f033dSHerbert Xu authsize = abs(template[i].rlen - template[i].ilen); 410da7f033dSHerbert Xu 411da7f033dSHerbert Xu ret = -EINVAL; 412da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 413da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 414da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 415da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 416da7f033dSHerbert Xu goto out; 417da7f033dSHerbert Xu 418da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 419da7f033dSHerbert Xu offset_in_page(IDX[k]); 420da7f033dSHerbert Xu 421da7f033dSHerbert Xu memcpy(q, template[i].input + temp, 422da7f033dSHerbert Xu template[i].tap[k]); 423da7f033dSHerbert Xu 424da7f033dSHerbert Xu n = template[i].tap[k]; 425da7f033dSHerbert Xu if (k == template[i].np - 1 && enc) 426da7f033dSHerbert Xu n += authsize; 427da7f033dSHerbert Xu if (offset_in_page(q) + n < PAGE_SIZE) 428da7f033dSHerbert Xu q[n] = 0; 429da7f033dSHerbert Xu 430da7f033dSHerbert Xu sg_set_buf(&sg[k], q, template[i].tap[k]); 431da7f033dSHerbert Xu temp += template[i].tap[k]; 432da7f033dSHerbert Xu } 433da7f033dSHerbert Xu 434da7f033dSHerbert Xu ret = crypto_aead_setauthsize(tfm, authsize); 435da7f033dSHerbert Xu if (ret) { 436da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to set " 437da7f033dSHerbert Xu "authsize to %u on chunk test %d for " 438da7f033dSHerbert Xu "%s\n", authsize, j, algo); 439da7f033dSHerbert Xu goto out; 440da7f033dSHerbert Xu } 441da7f033dSHerbert Xu 442da7f033dSHerbert Xu if (enc) { 443da7f033dSHerbert Xu if (WARN_ON(sg[k - 1].offset + 444da7f033dSHerbert Xu sg[k - 1].length + authsize > 445da7f033dSHerbert Xu PAGE_SIZE)) { 446da7f033dSHerbert Xu ret = -EINVAL; 447da7f033dSHerbert Xu goto out; 448da7f033dSHerbert Xu } 449da7f033dSHerbert Xu 450da7f033dSHerbert Xu sg[k - 1].length += authsize; 451da7f033dSHerbert Xu } 452da7f033dSHerbert Xu 453da7f033dSHerbert Xu sg_init_table(asg, template[i].anp); 454da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].anp; k++) { 455da7f033dSHerbert Xu sg_set_buf(&asg[k], 456da7f033dSHerbert Xu memcpy(axbuf[IDX[k] >> PAGE_SHIFT] + 457da7f033dSHerbert Xu offset_in_page(IDX[k]), 458da7f033dSHerbert Xu template[i].assoc + temp, 459da7f033dSHerbert Xu template[i].atap[k]), 460da7f033dSHerbert Xu template[i].atap[k]); 461da7f033dSHerbert Xu temp += template[i].atap[k]; 462da7f033dSHerbert Xu } 463da7f033dSHerbert Xu 464da7f033dSHerbert Xu aead_request_set_crypt(req, sg, sg, 465da7f033dSHerbert Xu template[i].ilen, 466da7f033dSHerbert Xu iv); 467da7f033dSHerbert Xu 468da7f033dSHerbert Xu aead_request_set_assoc(req, asg, template[i].alen); 469da7f033dSHerbert Xu 470da7f033dSHerbert Xu ret = enc ? 471da7f033dSHerbert Xu crypto_aead_encrypt(req) : 472da7f033dSHerbert Xu crypto_aead_decrypt(req); 473da7f033dSHerbert Xu 474da7f033dSHerbert Xu switch (ret) { 475da7f033dSHerbert Xu case 0: 476da7f033dSHerbert Xu break; 477da7f033dSHerbert Xu case -EINPROGRESS: 478da7f033dSHerbert Xu case -EBUSY: 479da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 480da7f033dSHerbert Xu &result.completion); 481da7f033dSHerbert Xu if (!ret && !(ret = result.err)) { 482da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 483da7f033dSHerbert Xu break; 484da7f033dSHerbert Xu } 485da7f033dSHerbert Xu /* fall through */ 486da7f033dSHerbert Xu default: 487da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: %s failed on " 488da7f033dSHerbert Xu "chunk test %d for %s: ret=%d\n", e, j, 489da7f033dSHerbert Xu algo, -ret); 490da7f033dSHerbert Xu goto out; 491da7f033dSHerbert Xu } 492da7f033dSHerbert Xu 493da7f033dSHerbert Xu ret = -EINVAL; 494da7f033dSHerbert Xu for (k = 0, temp = 0; k < template[i].np; k++) { 495da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 496da7f033dSHerbert Xu offset_in_page(IDX[k]); 497da7f033dSHerbert Xu 498da7f033dSHerbert Xu n = template[i].tap[k]; 499da7f033dSHerbert Xu if (k == template[i].np - 1) 500da7f033dSHerbert Xu n += enc ? authsize : -authsize; 501da7f033dSHerbert Xu 502da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, n)) { 503da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Chunk " 504da7f033dSHerbert Xu "test %d failed on %s at page " 505da7f033dSHerbert Xu "%u for %s\n", j, e, k, algo); 506da7f033dSHerbert Xu hexdump(q, n); 507da7f033dSHerbert Xu goto out; 508da7f033dSHerbert Xu } 509da7f033dSHerbert Xu 510da7f033dSHerbert Xu q += n; 511da7f033dSHerbert Xu if (k == template[i].np - 1 && !enc) { 512da7f033dSHerbert Xu if (memcmp(q, template[i].input + 513da7f033dSHerbert Xu temp + n, authsize)) 514da7f033dSHerbert Xu n = authsize; 515da7f033dSHerbert Xu else 516da7f033dSHerbert Xu n = 0; 517da7f033dSHerbert Xu } else { 518da7f033dSHerbert Xu for (n = 0; offset_in_page(q + n) && 519da7f033dSHerbert Xu q[n]; n++) 520da7f033dSHerbert Xu ; 521da7f033dSHerbert Xu } 522da7f033dSHerbert Xu if (n) { 523da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Result " 524da7f033dSHerbert Xu "buffer corruption in chunk " 525da7f033dSHerbert Xu "test %d on %s at page %u for " 526da7f033dSHerbert Xu "%s: %u bytes:\n", j, e, k, 527da7f033dSHerbert Xu algo, n); 528da7f033dSHerbert Xu hexdump(q, n); 529da7f033dSHerbert Xu goto out; 530da7f033dSHerbert Xu } 531da7f033dSHerbert Xu 532da7f033dSHerbert Xu temp += template[i].tap[k]; 533da7f033dSHerbert Xu } 534da7f033dSHerbert Xu } 535da7f033dSHerbert Xu } 536da7f033dSHerbert Xu 537da7f033dSHerbert Xu ret = 0; 538da7f033dSHerbert Xu 539da7f033dSHerbert Xu out: 540da7f033dSHerbert Xu aead_request_free(req); 541da7f033dSHerbert Xu return ret; 542da7f033dSHerbert Xu } 543da7f033dSHerbert Xu 544da7f033dSHerbert Xu static int test_cipher(struct crypto_ablkcipher *tfm, int enc, 545da7f033dSHerbert Xu struct cipher_testvec *template, unsigned int tcount) 546da7f033dSHerbert Xu { 547da7f033dSHerbert Xu const char *algo = 548da7f033dSHerbert Xu crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm)); 549da7f033dSHerbert Xu unsigned int i, j, k, n, temp; 550da7f033dSHerbert Xu int ret; 551da7f033dSHerbert Xu char *q; 552da7f033dSHerbert Xu struct ablkcipher_request *req; 553da7f033dSHerbert Xu struct scatterlist sg[8]; 554da7f033dSHerbert Xu const char *e; 555da7f033dSHerbert Xu struct tcrypt_result result; 556da7f033dSHerbert Xu void *data; 557da7f033dSHerbert Xu char iv[MAX_IVLEN]; 558da7f033dSHerbert Xu 559da7f033dSHerbert Xu if (enc == ENCRYPT) 560da7f033dSHerbert Xu e = "encryption"; 561da7f033dSHerbert Xu else 562da7f033dSHerbert Xu e = "decryption"; 563da7f033dSHerbert Xu 564da7f033dSHerbert Xu init_completion(&result.completion); 565da7f033dSHerbert Xu 566da7f033dSHerbert Xu req = ablkcipher_request_alloc(tfm, GFP_KERNEL); 567da7f033dSHerbert Xu if (!req) { 568da7f033dSHerbert Xu printk(KERN_ERR "alg: cipher: Failed to allocate request for " 569da7f033dSHerbert Xu "%s\n", algo); 570da7f033dSHerbert Xu ret = -ENOMEM; 571da7f033dSHerbert Xu goto out; 572da7f033dSHerbert Xu } 573da7f033dSHerbert Xu 574da7f033dSHerbert Xu ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 575da7f033dSHerbert Xu tcrypt_complete, &result); 576da7f033dSHerbert Xu 577da7f033dSHerbert Xu j = 0; 578da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 579da7f033dSHerbert Xu if (template[i].iv) 580da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 581da7f033dSHerbert Xu else 582da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 583da7f033dSHerbert Xu 584da7f033dSHerbert Xu if (!(template[i].np)) { 585da7f033dSHerbert Xu j++; 586da7f033dSHerbert Xu 587da7f033dSHerbert Xu data = xbuf[0]; 588da7f033dSHerbert Xu memcpy(data, template[i].input, template[i].ilen); 589da7f033dSHerbert Xu 590da7f033dSHerbert Xu crypto_ablkcipher_clear_flags(tfm, ~0); 591da7f033dSHerbert Xu if (template[i].wk) 592da7f033dSHerbert Xu crypto_ablkcipher_set_flags( 593da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 594da7f033dSHerbert Xu 595da7f033dSHerbert Xu ret = crypto_ablkcipher_setkey(tfm, template[i].key, 596da7f033dSHerbert Xu template[i].klen); 597da7f033dSHerbert Xu if (!ret == template[i].fail) { 598da7f033dSHerbert Xu printk(KERN_ERR "alg: cipher: setkey failed " 599da7f033dSHerbert Xu "on test %d for %s: flags=%x\n", j, 600da7f033dSHerbert Xu algo, crypto_ablkcipher_get_flags(tfm)); 601da7f033dSHerbert Xu goto out; 602da7f033dSHerbert Xu } else if (ret) 603da7f033dSHerbert Xu continue; 604da7f033dSHerbert Xu 605da7f033dSHerbert Xu sg_init_one(&sg[0], data, template[i].ilen); 606da7f033dSHerbert Xu 607da7f033dSHerbert Xu ablkcipher_request_set_crypt(req, sg, sg, 608da7f033dSHerbert Xu template[i].ilen, iv); 609da7f033dSHerbert Xu ret = enc ? 610da7f033dSHerbert Xu crypto_ablkcipher_encrypt(req) : 611da7f033dSHerbert Xu crypto_ablkcipher_decrypt(req); 612da7f033dSHerbert Xu 613da7f033dSHerbert Xu switch (ret) { 614da7f033dSHerbert Xu case 0: 615da7f033dSHerbert Xu break; 616da7f033dSHerbert Xu case -EINPROGRESS: 617da7f033dSHerbert Xu case -EBUSY: 618da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 619da7f033dSHerbert Xu &result.completion); 620da7f033dSHerbert Xu if (!ret && !((ret = result.err))) { 621da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 622da7f033dSHerbert Xu break; 623da7f033dSHerbert Xu } 624da7f033dSHerbert Xu /* fall through */ 625da7f033dSHerbert Xu default: 626da7f033dSHerbert Xu printk(KERN_ERR "alg: cipher: %s failed on " 627da7f033dSHerbert Xu "test %d for %s: ret=%d\n", e, j, algo, 628da7f033dSHerbert Xu -ret); 629da7f033dSHerbert Xu goto out; 630da7f033dSHerbert Xu } 631da7f033dSHerbert Xu 632da7f033dSHerbert Xu q = data; 633da7f033dSHerbert Xu if (memcmp(q, template[i].result, template[i].rlen)) { 634da7f033dSHerbert Xu printk(KERN_ERR "alg: cipher: Test %d failed " 635da7f033dSHerbert Xu "on %s for %s\n", j, e, algo); 636da7f033dSHerbert Xu hexdump(q, template[i].rlen); 637da7f033dSHerbert Xu ret = -EINVAL; 638da7f033dSHerbert Xu goto out; 639da7f033dSHerbert Xu } 640da7f033dSHerbert Xu } 641da7f033dSHerbert Xu } 642da7f033dSHerbert Xu 643da7f033dSHerbert Xu j = 0; 644da7f033dSHerbert Xu for (i = 0; i < tcount; i++) { 645da7f033dSHerbert Xu 646da7f033dSHerbert Xu if (template[i].iv) 647da7f033dSHerbert Xu memcpy(iv, template[i].iv, MAX_IVLEN); 648da7f033dSHerbert Xu else 649da7f033dSHerbert Xu memset(iv, 0, MAX_IVLEN); 650da7f033dSHerbert Xu 651da7f033dSHerbert Xu if (template[i].np) { 652da7f033dSHerbert Xu j++; 653da7f033dSHerbert Xu 654da7f033dSHerbert Xu crypto_ablkcipher_clear_flags(tfm, ~0); 655da7f033dSHerbert Xu if (template[i].wk) 656da7f033dSHerbert Xu crypto_ablkcipher_set_flags( 657da7f033dSHerbert Xu tfm, CRYPTO_TFM_REQ_WEAK_KEY); 658da7f033dSHerbert Xu 659da7f033dSHerbert Xu ret = crypto_ablkcipher_setkey(tfm, template[i].key, 660da7f033dSHerbert Xu template[i].klen); 661da7f033dSHerbert Xu if (!ret == template[i].fail) { 662da7f033dSHerbert Xu printk(KERN_ERR "alg: cipher: setkey failed " 663da7f033dSHerbert Xu "on chunk test %d for %s: flags=%x\n", 664da7f033dSHerbert Xu j, algo, 665da7f033dSHerbert Xu crypto_ablkcipher_get_flags(tfm)); 666da7f033dSHerbert Xu goto out; 667da7f033dSHerbert Xu } else if (ret) 668da7f033dSHerbert Xu continue; 669da7f033dSHerbert Xu 670da7f033dSHerbert Xu temp = 0; 671da7f033dSHerbert Xu ret = -EINVAL; 672da7f033dSHerbert Xu sg_init_table(sg, template[i].np); 673da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 674da7f033dSHerbert Xu if (WARN_ON(offset_in_page(IDX[k]) + 675da7f033dSHerbert Xu template[i].tap[k] > PAGE_SIZE)) 676da7f033dSHerbert Xu goto out; 677da7f033dSHerbert Xu 678da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 679da7f033dSHerbert Xu offset_in_page(IDX[k]); 680da7f033dSHerbert Xu 681da7f033dSHerbert Xu memcpy(q, template[i].input + temp, 682da7f033dSHerbert Xu template[i].tap[k]); 683da7f033dSHerbert Xu 684da7f033dSHerbert Xu if (offset_in_page(q) + template[i].tap[k] < 685da7f033dSHerbert Xu PAGE_SIZE) 686da7f033dSHerbert Xu q[template[i].tap[k]] = 0; 687da7f033dSHerbert Xu 688da7f033dSHerbert Xu sg_set_buf(&sg[k], q, template[i].tap[k]); 689da7f033dSHerbert Xu 690da7f033dSHerbert Xu temp += template[i].tap[k]; 691da7f033dSHerbert Xu } 692da7f033dSHerbert Xu 693da7f033dSHerbert Xu ablkcipher_request_set_crypt(req, sg, sg, 694da7f033dSHerbert Xu template[i].ilen, iv); 695da7f033dSHerbert Xu 696da7f033dSHerbert Xu ret = enc ? 697da7f033dSHerbert Xu crypto_ablkcipher_encrypt(req) : 698da7f033dSHerbert Xu crypto_ablkcipher_decrypt(req); 699da7f033dSHerbert Xu 700da7f033dSHerbert Xu switch (ret) { 701da7f033dSHerbert Xu case 0: 702da7f033dSHerbert Xu break; 703da7f033dSHerbert Xu case -EINPROGRESS: 704da7f033dSHerbert Xu case -EBUSY: 705da7f033dSHerbert Xu ret = wait_for_completion_interruptible( 706da7f033dSHerbert Xu &result.completion); 707da7f033dSHerbert Xu if (!ret && !((ret = result.err))) { 708da7f033dSHerbert Xu INIT_COMPLETION(result.completion); 709da7f033dSHerbert Xu break; 710da7f033dSHerbert Xu } 711da7f033dSHerbert Xu /* fall through */ 712da7f033dSHerbert Xu default: 713da7f033dSHerbert Xu printk(KERN_ERR "alg: cipher: %s failed on " 714da7f033dSHerbert Xu "chunk test %d for %s: ret=%d\n", e, j, 715da7f033dSHerbert Xu algo, -ret); 716da7f033dSHerbert Xu goto out; 717da7f033dSHerbert Xu } 718da7f033dSHerbert Xu 719da7f033dSHerbert Xu temp = 0; 720da7f033dSHerbert Xu ret = -EINVAL; 721da7f033dSHerbert Xu for (k = 0; k < template[i].np; k++) { 722da7f033dSHerbert Xu q = xbuf[IDX[k] >> PAGE_SHIFT] + 723da7f033dSHerbert Xu offset_in_page(IDX[k]); 724da7f033dSHerbert Xu 725da7f033dSHerbert Xu if (memcmp(q, template[i].result + temp, 726da7f033dSHerbert Xu template[i].tap[k])) { 727da7f033dSHerbert Xu printk(KERN_ERR "alg: cipher: Chunk " 728da7f033dSHerbert Xu "test %d failed on %s at page " 729da7f033dSHerbert Xu "%u for %s\n", j, e, k, algo); 730da7f033dSHerbert Xu hexdump(q, template[i].tap[k]); 731da7f033dSHerbert Xu goto out; 732da7f033dSHerbert Xu } 733da7f033dSHerbert Xu 734da7f033dSHerbert Xu q += template[i].tap[k]; 735da7f033dSHerbert Xu for (n = 0; offset_in_page(q + n) && q[n]; n++) 736da7f033dSHerbert Xu ; 737da7f033dSHerbert Xu if (n) { 738da7f033dSHerbert Xu printk(KERN_ERR "alg: cipher: " 739da7f033dSHerbert Xu "Result buffer corruption in " 740da7f033dSHerbert Xu "chunk test %d on %s at page " 741da7f033dSHerbert Xu "%u for %s: %u bytes:\n", j, e, 742da7f033dSHerbert Xu k, algo, n); 743da7f033dSHerbert Xu hexdump(q, n); 744da7f033dSHerbert Xu goto out; 745da7f033dSHerbert Xu } 746da7f033dSHerbert Xu temp += template[i].tap[k]; 747da7f033dSHerbert Xu } 748da7f033dSHerbert Xu } 749da7f033dSHerbert Xu } 750da7f033dSHerbert Xu 751da7f033dSHerbert Xu ret = 0; 752da7f033dSHerbert Xu 753da7f033dSHerbert Xu out: 754da7f033dSHerbert Xu ablkcipher_request_free(req); 755da7f033dSHerbert Xu return ret; 756da7f033dSHerbert Xu } 757da7f033dSHerbert Xu 758da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate, 759da7f033dSHerbert Xu struct comp_testvec *dtemplate, int ctcount, int dtcount) 760da7f033dSHerbert Xu { 761da7f033dSHerbert Xu const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm)); 762da7f033dSHerbert Xu unsigned int i; 763da7f033dSHerbert Xu char result[COMP_BUF_SIZE]; 764da7f033dSHerbert Xu int ret; 765da7f033dSHerbert Xu 766da7f033dSHerbert Xu for (i = 0; i < ctcount; i++) { 767da7f033dSHerbert Xu int ilen, dlen = COMP_BUF_SIZE; 768da7f033dSHerbert Xu 769da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 770da7f033dSHerbert Xu 771da7f033dSHerbert Xu ilen = ctemplate[i].inlen; 772da7f033dSHerbert Xu ret = crypto_comp_compress(tfm, ctemplate[i].input, 773da7f033dSHerbert Xu ilen, result, &dlen); 774da7f033dSHerbert Xu if (ret) { 775da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: compression failed " 776da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 777da7f033dSHerbert Xu -ret); 778da7f033dSHerbert Xu goto out; 779da7f033dSHerbert Xu } 780da7f033dSHerbert Xu 781da7f033dSHerbert Xu if (memcmp(result, ctemplate[i].output, dlen)) { 782da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Compression test %d " 783da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 784da7f033dSHerbert Xu hexdump(result, dlen); 785da7f033dSHerbert Xu ret = -EINVAL; 786da7f033dSHerbert Xu goto out; 787da7f033dSHerbert Xu } 788da7f033dSHerbert Xu } 789da7f033dSHerbert Xu 790da7f033dSHerbert Xu for (i = 0; i < dtcount; i++) { 791da7f033dSHerbert Xu int ilen, ret, dlen = COMP_BUF_SIZE; 792da7f033dSHerbert Xu 793da7f033dSHerbert Xu memset(result, 0, sizeof (result)); 794da7f033dSHerbert Xu 795da7f033dSHerbert Xu ilen = dtemplate[i].inlen; 796da7f033dSHerbert Xu ret = crypto_comp_decompress(tfm, dtemplate[i].input, 797da7f033dSHerbert Xu ilen, result, &dlen); 798da7f033dSHerbert Xu if (ret) { 799da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: decompression failed " 800da7f033dSHerbert Xu "on test %d for %s: ret=%d\n", i + 1, algo, 801da7f033dSHerbert Xu -ret); 802da7f033dSHerbert Xu goto out; 803da7f033dSHerbert Xu } 804da7f033dSHerbert Xu 805da7f033dSHerbert Xu if (memcmp(result, dtemplate[i].output, dlen)) { 806da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Decompression test %d " 807da7f033dSHerbert Xu "failed for %s\n", i + 1, algo); 808da7f033dSHerbert Xu hexdump(result, dlen); 809da7f033dSHerbert Xu ret = -EINVAL; 810da7f033dSHerbert Xu goto out; 811da7f033dSHerbert Xu } 812da7f033dSHerbert Xu } 813da7f033dSHerbert Xu 814da7f033dSHerbert Xu ret = 0; 815da7f033dSHerbert Xu 816da7f033dSHerbert Xu out: 817da7f033dSHerbert Xu return ret; 818da7f033dSHerbert Xu } 819da7f033dSHerbert Xu 820da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver, 821da7f033dSHerbert Xu u32 type, u32 mask) 822da7f033dSHerbert Xu { 823da7f033dSHerbert Xu struct crypto_aead *tfm; 824da7f033dSHerbert Xu int err = 0; 825da7f033dSHerbert Xu 826da7f033dSHerbert Xu tfm = crypto_alloc_aead(driver, type, mask); 827da7f033dSHerbert Xu if (IS_ERR(tfm)) { 828da7f033dSHerbert Xu printk(KERN_ERR "alg: aead: Failed to load transform for %s: " 829da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 830da7f033dSHerbert Xu return PTR_ERR(tfm); 831da7f033dSHerbert Xu } 832da7f033dSHerbert Xu 833da7f033dSHerbert Xu if (desc->suite.aead.enc.vecs) { 834da7f033dSHerbert Xu err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs, 835da7f033dSHerbert Xu desc->suite.aead.enc.count); 836da7f033dSHerbert Xu if (err) 837da7f033dSHerbert Xu goto out; 838da7f033dSHerbert Xu } 839da7f033dSHerbert Xu 840da7f033dSHerbert Xu if (!err && desc->suite.aead.dec.vecs) 841da7f033dSHerbert Xu err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs, 842da7f033dSHerbert Xu desc->suite.aead.dec.count); 843da7f033dSHerbert Xu 844da7f033dSHerbert Xu out: 845da7f033dSHerbert Xu crypto_free_aead(tfm); 846da7f033dSHerbert Xu return err; 847da7f033dSHerbert Xu } 848da7f033dSHerbert Xu 849da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc, 850da7f033dSHerbert Xu const char *driver, u32 type, u32 mask) 851da7f033dSHerbert Xu { 852da7f033dSHerbert Xu struct crypto_ablkcipher *tfm; 853da7f033dSHerbert Xu int err = 0; 854da7f033dSHerbert Xu 855da7f033dSHerbert Xu tfm = crypto_alloc_ablkcipher(driver, type, mask); 856da7f033dSHerbert Xu if (IS_ERR(tfm)) { 857da7f033dSHerbert Xu printk(KERN_ERR "alg: cipher: Failed to load transform for " 858da7f033dSHerbert Xu "%s: %ld\n", driver, PTR_ERR(tfm)); 859da7f033dSHerbert Xu return PTR_ERR(tfm); 860da7f033dSHerbert Xu } 861da7f033dSHerbert Xu 862da7f033dSHerbert Xu if (desc->suite.cipher.enc.vecs) { 863da7f033dSHerbert Xu err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 864da7f033dSHerbert Xu desc->suite.cipher.enc.count); 865da7f033dSHerbert Xu if (err) 866da7f033dSHerbert Xu goto out; 867da7f033dSHerbert Xu } 868da7f033dSHerbert Xu 869da7f033dSHerbert Xu if (desc->suite.cipher.dec.vecs) 870da7f033dSHerbert Xu err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 871da7f033dSHerbert Xu desc->suite.cipher.dec.count); 872da7f033dSHerbert Xu 873da7f033dSHerbert Xu out: 874da7f033dSHerbert Xu crypto_free_ablkcipher(tfm); 875da7f033dSHerbert Xu return err; 876da7f033dSHerbert Xu } 877da7f033dSHerbert Xu 878da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver, 879da7f033dSHerbert Xu u32 type, u32 mask) 880da7f033dSHerbert Xu { 881da7f033dSHerbert Xu struct crypto_comp *tfm; 882da7f033dSHerbert Xu int err; 883da7f033dSHerbert Xu 884da7f033dSHerbert Xu tfm = crypto_alloc_comp(driver, type, mask); 885da7f033dSHerbert Xu if (IS_ERR(tfm)) { 886da7f033dSHerbert Xu printk(KERN_ERR "alg: comp: Failed to load transform for %s: " 887da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 888da7f033dSHerbert Xu return PTR_ERR(tfm); 889da7f033dSHerbert Xu } 890da7f033dSHerbert Xu 891da7f033dSHerbert Xu err = test_comp(tfm, desc->suite.comp.comp.vecs, 892da7f033dSHerbert Xu desc->suite.comp.decomp.vecs, 893da7f033dSHerbert Xu desc->suite.comp.comp.count, 894da7f033dSHerbert Xu desc->suite.comp.decomp.count); 895da7f033dSHerbert Xu 896da7f033dSHerbert Xu crypto_free_comp(tfm); 897da7f033dSHerbert Xu return err; 898da7f033dSHerbert Xu } 899da7f033dSHerbert Xu 900da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver, 901da7f033dSHerbert Xu u32 type, u32 mask) 902da7f033dSHerbert Xu { 903da7f033dSHerbert Xu struct crypto_ahash *tfm; 904da7f033dSHerbert Xu int err; 905da7f033dSHerbert Xu 906da7f033dSHerbert Xu tfm = crypto_alloc_ahash(driver, type, mask); 907da7f033dSHerbert Xu if (IS_ERR(tfm)) { 908da7f033dSHerbert Xu printk(KERN_ERR "alg: hash: Failed to load transform for %s: " 909da7f033dSHerbert Xu "%ld\n", driver, PTR_ERR(tfm)); 910da7f033dSHerbert Xu return PTR_ERR(tfm); 911da7f033dSHerbert Xu } 912da7f033dSHerbert Xu 913da7f033dSHerbert Xu err = test_hash(tfm, desc->suite.hash.vecs, desc->suite.hash.count); 914da7f033dSHerbert Xu 915da7f033dSHerbert Xu crypto_free_ahash(tfm); 916da7f033dSHerbert Xu return err; 917da7f033dSHerbert Xu } 918da7f033dSHerbert Xu 919da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */ 920da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = { 921da7f033dSHerbert Xu { 922da7f033dSHerbert Xu .alg = "cbc(aes)", 923da7f033dSHerbert Xu .test = alg_test_cipher, 924da7f033dSHerbert Xu .suite = { 925da7f033dSHerbert Xu .cipher = { 926da7f033dSHerbert Xu .enc = { 927da7f033dSHerbert Xu .vecs = aes_cbc_enc_tv_template, 928da7f033dSHerbert Xu .count = AES_CBC_ENC_TEST_VECTORS 929da7f033dSHerbert Xu }, 930da7f033dSHerbert Xu .dec = { 931da7f033dSHerbert Xu .vecs = aes_cbc_dec_tv_template, 932da7f033dSHerbert Xu .count = AES_CBC_DEC_TEST_VECTORS 933da7f033dSHerbert Xu } 934da7f033dSHerbert Xu } 935da7f033dSHerbert Xu } 936da7f033dSHerbert Xu }, { 937da7f033dSHerbert Xu .alg = "cbc(anubis)", 938da7f033dSHerbert Xu .test = alg_test_cipher, 939da7f033dSHerbert Xu .suite = { 940da7f033dSHerbert Xu .cipher = { 941da7f033dSHerbert Xu .enc = { 942da7f033dSHerbert Xu .vecs = anubis_cbc_enc_tv_template, 943da7f033dSHerbert Xu .count = ANUBIS_CBC_ENC_TEST_VECTORS 944da7f033dSHerbert Xu }, 945da7f033dSHerbert Xu .dec = { 946da7f033dSHerbert Xu .vecs = anubis_cbc_dec_tv_template, 947da7f033dSHerbert Xu .count = ANUBIS_CBC_DEC_TEST_VECTORS 948da7f033dSHerbert Xu } 949da7f033dSHerbert Xu } 950da7f033dSHerbert Xu } 951da7f033dSHerbert Xu }, { 952da7f033dSHerbert Xu .alg = "cbc(blowfish)", 953da7f033dSHerbert Xu .test = alg_test_cipher, 954da7f033dSHerbert Xu .suite = { 955da7f033dSHerbert Xu .cipher = { 956da7f033dSHerbert Xu .enc = { 957da7f033dSHerbert Xu .vecs = bf_cbc_enc_tv_template, 958da7f033dSHerbert Xu .count = BF_CBC_ENC_TEST_VECTORS 959da7f033dSHerbert Xu }, 960da7f033dSHerbert Xu .dec = { 961da7f033dSHerbert Xu .vecs = bf_cbc_dec_tv_template, 962da7f033dSHerbert Xu .count = BF_CBC_DEC_TEST_VECTORS 963da7f033dSHerbert Xu } 964da7f033dSHerbert Xu } 965da7f033dSHerbert Xu } 966da7f033dSHerbert Xu }, { 967da7f033dSHerbert Xu .alg = "cbc(camellia)", 968da7f033dSHerbert Xu .test = alg_test_cipher, 969da7f033dSHerbert Xu .suite = { 970da7f033dSHerbert Xu .cipher = { 971da7f033dSHerbert Xu .enc = { 972da7f033dSHerbert Xu .vecs = camellia_cbc_enc_tv_template, 973da7f033dSHerbert Xu .count = CAMELLIA_CBC_ENC_TEST_VECTORS 974da7f033dSHerbert Xu }, 975da7f033dSHerbert Xu .dec = { 976da7f033dSHerbert Xu .vecs = camellia_cbc_dec_tv_template, 977da7f033dSHerbert Xu .count = CAMELLIA_CBC_DEC_TEST_VECTORS 978da7f033dSHerbert Xu } 979da7f033dSHerbert Xu } 980da7f033dSHerbert Xu } 981da7f033dSHerbert Xu }, { 982da7f033dSHerbert Xu .alg = "cbc(des)", 983da7f033dSHerbert Xu .test = alg_test_cipher, 984da7f033dSHerbert Xu .suite = { 985da7f033dSHerbert Xu .cipher = { 986da7f033dSHerbert Xu .enc = { 987da7f033dSHerbert Xu .vecs = des_cbc_enc_tv_template, 988da7f033dSHerbert Xu .count = DES_CBC_ENC_TEST_VECTORS 989da7f033dSHerbert Xu }, 990da7f033dSHerbert Xu .dec = { 991da7f033dSHerbert Xu .vecs = des_cbc_dec_tv_template, 992da7f033dSHerbert Xu .count = DES_CBC_DEC_TEST_VECTORS 993da7f033dSHerbert Xu } 994da7f033dSHerbert Xu } 995da7f033dSHerbert Xu } 996da7f033dSHerbert Xu }, { 997da7f033dSHerbert Xu .alg = "cbc(des3_ede)", 998da7f033dSHerbert Xu .test = alg_test_cipher, 999da7f033dSHerbert Xu .suite = { 1000da7f033dSHerbert Xu .cipher = { 1001da7f033dSHerbert Xu .enc = { 1002da7f033dSHerbert Xu .vecs = des3_ede_cbc_enc_tv_template, 1003da7f033dSHerbert Xu .count = DES3_EDE_CBC_ENC_TEST_VECTORS 1004da7f033dSHerbert Xu }, 1005da7f033dSHerbert Xu .dec = { 1006da7f033dSHerbert Xu .vecs = des3_ede_cbc_dec_tv_template, 1007da7f033dSHerbert Xu .count = DES3_EDE_CBC_DEC_TEST_VECTORS 1008da7f033dSHerbert Xu } 1009da7f033dSHerbert Xu } 1010da7f033dSHerbert Xu } 1011da7f033dSHerbert Xu }, { 1012da7f033dSHerbert Xu .alg = "cbc(twofish)", 1013da7f033dSHerbert Xu .test = alg_test_cipher, 1014da7f033dSHerbert Xu .suite = { 1015da7f033dSHerbert Xu .cipher = { 1016da7f033dSHerbert Xu .enc = { 1017da7f033dSHerbert Xu .vecs = tf_cbc_enc_tv_template, 1018da7f033dSHerbert Xu .count = TF_CBC_ENC_TEST_VECTORS 1019da7f033dSHerbert Xu }, 1020da7f033dSHerbert Xu .dec = { 1021da7f033dSHerbert Xu .vecs = tf_cbc_dec_tv_template, 1022da7f033dSHerbert Xu .count = TF_CBC_DEC_TEST_VECTORS 1023da7f033dSHerbert Xu } 1024da7f033dSHerbert Xu } 1025da7f033dSHerbert Xu } 1026da7f033dSHerbert Xu }, { 1027da7f033dSHerbert Xu .alg = "ccm(aes)", 1028da7f033dSHerbert Xu .test = alg_test_aead, 1029da7f033dSHerbert Xu .suite = { 1030da7f033dSHerbert Xu .aead = { 1031da7f033dSHerbert Xu .enc = { 1032da7f033dSHerbert Xu .vecs = aes_ccm_enc_tv_template, 1033da7f033dSHerbert Xu .count = AES_CCM_ENC_TEST_VECTORS 1034da7f033dSHerbert Xu }, 1035da7f033dSHerbert Xu .dec = { 1036da7f033dSHerbert Xu .vecs = aes_ccm_dec_tv_template, 1037da7f033dSHerbert Xu .count = AES_CCM_DEC_TEST_VECTORS 1038da7f033dSHerbert Xu } 1039da7f033dSHerbert Xu } 1040da7f033dSHerbert Xu } 1041da7f033dSHerbert Xu }, { 1042da7f033dSHerbert Xu .alg = "crc32c", 1043da7f033dSHerbert Xu .test = alg_test_hash, 1044da7f033dSHerbert Xu .suite = { 1045da7f033dSHerbert Xu .hash = { 1046da7f033dSHerbert Xu .vecs = crc32c_tv_template, 1047da7f033dSHerbert Xu .count = CRC32C_TEST_VECTORS 1048da7f033dSHerbert Xu } 1049da7f033dSHerbert Xu } 1050da7f033dSHerbert Xu }, { 1051da7f033dSHerbert Xu .alg = "cts(cbc(aes))", 1052da7f033dSHerbert Xu .test = alg_test_cipher, 1053da7f033dSHerbert Xu .suite = { 1054da7f033dSHerbert Xu .cipher = { 1055da7f033dSHerbert Xu .enc = { 1056da7f033dSHerbert Xu .vecs = cts_mode_enc_tv_template, 1057da7f033dSHerbert Xu .count = CTS_MODE_ENC_TEST_VECTORS 1058da7f033dSHerbert Xu }, 1059da7f033dSHerbert Xu .dec = { 1060da7f033dSHerbert Xu .vecs = cts_mode_dec_tv_template, 1061da7f033dSHerbert Xu .count = CTS_MODE_DEC_TEST_VECTORS 1062da7f033dSHerbert Xu } 1063da7f033dSHerbert Xu } 1064da7f033dSHerbert Xu } 1065da7f033dSHerbert Xu }, { 1066da7f033dSHerbert Xu .alg = "deflate", 1067da7f033dSHerbert Xu .test = alg_test_comp, 1068da7f033dSHerbert Xu .suite = { 1069da7f033dSHerbert Xu .comp = { 1070da7f033dSHerbert Xu .comp = { 1071da7f033dSHerbert Xu .vecs = deflate_comp_tv_template, 1072da7f033dSHerbert Xu .count = DEFLATE_COMP_TEST_VECTORS 1073da7f033dSHerbert Xu }, 1074da7f033dSHerbert Xu .decomp = { 1075da7f033dSHerbert Xu .vecs = deflate_decomp_tv_template, 1076da7f033dSHerbert Xu .count = DEFLATE_DECOMP_TEST_VECTORS 1077da7f033dSHerbert Xu } 1078da7f033dSHerbert Xu } 1079da7f033dSHerbert Xu } 1080da7f033dSHerbert Xu }, { 1081da7f033dSHerbert Xu .alg = "ecb(aes)", 1082da7f033dSHerbert Xu .test = alg_test_cipher, 1083da7f033dSHerbert Xu .suite = { 1084da7f033dSHerbert Xu .cipher = { 1085da7f033dSHerbert Xu .enc = { 1086da7f033dSHerbert Xu .vecs = aes_enc_tv_template, 1087da7f033dSHerbert Xu .count = AES_ENC_TEST_VECTORS 1088da7f033dSHerbert Xu }, 1089da7f033dSHerbert Xu .dec = { 1090da7f033dSHerbert Xu .vecs = aes_dec_tv_template, 1091da7f033dSHerbert Xu .count = AES_DEC_TEST_VECTORS 1092da7f033dSHerbert Xu } 1093da7f033dSHerbert Xu } 1094da7f033dSHerbert Xu } 1095da7f033dSHerbert Xu }, { 1096da7f033dSHerbert Xu .alg = "ecb(anubis)", 1097da7f033dSHerbert Xu .test = alg_test_cipher, 1098da7f033dSHerbert Xu .suite = { 1099da7f033dSHerbert Xu .cipher = { 1100da7f033dSHerbert Xu .enc = { 1101da7f033dSHerbert Xu .vecs = anubis_enc_tv_template, 1102da7f033dSHerbert Xu .count = ANUBIS_ENC_TEST_VECTORS 1103da7f033dSHerbert Xu }, 1104da7f033dSHerbert Xu .dec = { 1105da7f033dSHerbert Xu .vecs = anubis_dec_tv_template, 1106da7f033dSHerbert Xu .count = ANUBIS_DEC_TEST_VECTORS 1107da7f033dSHerbert Xu } 1108da7f033dSHerbert Xu } 1109da7f033dSHerbert Xu } 1110da7f033dSHerbert Xu }, { 1111da7f033dSHerbert Xu .alg = "ecb(arc4)", 1112da7f033dSHerbert Xu .test = alg_test_cipher, 1113da7f033dSHerbert Xu .suite = { 1114da7f033dSHerbert Xu .cipher = { 1115da7f033dSHerbert Xu .enc = { 1116da7f033dSHerbert Xu .vecs = arc4_enc_tv_template, 1117da7f033dSHerbert Xu .count = ARC4_ENC_TEST_VECTORS 1118da7f033dSHerbert Xu }, 1119da7f033dSHerbert Xu .dec = { 1120da7f033dSHerbert Xu .vecs = arc4_dec_tv_template, 1121da7f033dSHerbert Xu .count = ARC4_DEC_TEST_VECTORS 1122da7f033dSHerbert Xu } 1123da7f033dSHerbert Xu } 1124da7f033dSHerbert Xu } 1125da7f033dSHerbert Xu }, { 1126da7f033dSHerbert Xu .alg = "ecb(blowfish)", 1127da7f033dSHerbert Xu .test = alg_test_cipher, 1128da7f033dSHerbert Xu .suite = { 1129da7f033dSHerbert Xu .cipher = { 1130da7f033dSHerbert Xu .enc = { 1131da7f033dSHerbert Xu .vecs = bf_enc_tv_template, 1132da7f033dSHerbert Xu .count = BF_ENC_TEST_VECTORS 1133da7f033dSHerbert Xu }, 1134da7f033dSHerbert Xu .dec = { 1135da7f033dSHerbert Xu .vecs = bf_dec_tv_template, 1136da7f033dSHerbert Xu .count = BF_DEC_TEST_VECTORS 1137da7f033dSHerbert Xu } 1138da7f033dSHerbert Xu } 1139da7f033dSHerbert Xu } 1140da7f033dSHerbert Xu }, { 1141da7f033dSHerbert Xu .alg = "ecb(camellia)", 1142da7f033dSHerbert Xu .test = alg_test_cipher, 1143da7f033dSHerbert Xu .suite = { 1144da7f033dSHerbert Xu .cipher = { 1145da7f033dSHerbert Xu .enc = { 1146da7f033dSHerbert Xu .vecs = camellia_enc_tv_template, 1147da7f033dSHerbert Xu .count = CAMELLIA_ENC_TEST_VECTORS 1148da7f033dSHerbert Xu }, 1149da7f033dSHerbert Xu .dec = { 1150da7f033dSHerbert Xu .vecs = camellia_dec_tv_template, 1151da7f033dSHerbert Xu .count = CAMELLIA_DEC_TEST_VECTORS 1152da7f033dSHerbert Xu } 1153da7f033dSHerbert Xu } 1154da7f033dSHerbert Xu } 1155da7f033dSHerbert Xu }, { 1156da7f033dSHerbert Xu .alg = "ecb(cast5)", 1157da7f033dSHerbert Xu .test = alg_test_cipher, 1158da7f033dSHerbert Xu .suite = { 1159da7f033dSHerbert Xu .cipher = { 1160da7f033dSHerbert Xu .enc = { 1161da7f033dSHerbert Xu .vecs = cast5_enc_tv_template, 1162da7f033dSHerbert Xu .count = CAST5_ENC_TEST_VECTORS 1163da7f033dSHerbert Xu }, 1164da7f033dSHerbert Xu .dec = { 1165da7f033dSHerbert Xu .vecs = cast5_dec_tv_template, 1166da7f033dSHerbert Xu .count = CAST5_DEC_TEST_VECTORS 1167da7f033dSHerbert Xu } 1168da7f033dSHerbert Xu } 1169da7f033dSHerbert Xu } 1170da7f033dSHerbert Xu }, { 1171da7f033dSHerbert Xu .alg = "ecb(cast6)", 1172da7f033dSHerbert Xu .test = alg_test_cipher, 1173da7f033dSHerbert Xu .suite = { 1174da7f033dSHerbert Xu .cipher = { 1175da7f033dSHerbert Xu .enc = { 1176da7f033dSHerbert Xu .vecs = cast6_enc_tv_template, 1177da7f033dSHerbert Xu .count = CAST6_ENC_TEST_VECTORS 1178da7f033dSHerbert Xu }, 1179da7f033dSHerbert Xu .dec = { 1180da7f033dSHerbert Xu .vecs = cast6_dec_tv_template, 1181da7f033dSHerbert Xu .count = CAST6_DEC_TEST_VECTORS 1182da7f033dSHerbert Xu } 1183da7f033dSHerbert Xu } 1184da7f033dSHerbert Xu } 1185da7f033dSHerbert Xu }, { 1186da7f033dSHerbert Xu .alg = "ecb(des)", 1187da7f033dSHerbert Xu .test = alg_test_cipher, 1188da7f033dSHerbert Xu .suite = { 1189da7f033dSHerbert Xu .cipher = { 1190da7f033dSHerbert Xu .enc = { 1191da7f033dSHerbert Xu .vecs = des_enc_tv_template, 1192da7f033dSHerbert Xu .count = DES_ENC_TEST_VECTORS 1193da7f033dSHerbert Xu }, 1194da7f033dSHerbert Xu .dec = { 1195da7f033dSHerbert Xu .vecs = des_dec_tv_template, 1196da7f033dSHerbert Xu .count = DES_DEC_TEST_VECTORS 1197da7f033dSHerbert Xu } 1198da7f033dSHerbert Xu } 1199da7f033dSHerbert Xu } 1200da7f033dSHerbert Xu }, { 1201da7f033dSHerbert Xu .alg = "ecb(des3_ede)", 1202da7f033dSHerbert Xu .test = alg_test_cipher, 1203da7f033dSHerbert Xu .suite = { 1204da7f033dSHerbert Xu .cipher = { 1205da7f033dSHerbert Xu .enc = { 1206da7f033dSHerbert Xu .vecs = des3_ede_enc_tv_template, 1207da7f033dSHerbert Xu .count = DES3_EDE_ENC_TEST_VECTORS 1208da7f033dSHerbert Xu }, 1209da7f033dSHerbert Xu .dec = { 1210da7f033dSHerbert Xu .vecs = des3_ede_dec_tv_template, 1211da7f033dSHerbert Xu .count = DES3_EDE_DEC_TEST_VECTORS 1212da7f033dSHerbert Xu } 1213da7f033dSHerbert Xu } 1214da7f033dSHerbert Xu } 1215da7f033dSHerbert Xu }, { 1216da7f033dSHerbert Xu .alg = "ecb(khazad)", 1217da7f033dSHerbert Xu .test = alg_test_cipher, 1218da7f033dSHerbert Xu .suite = { 1219da7f033dSHerbert Xu .cipher = { 1220da7f033dSHerbert Xu .enc = { 1221da7f033dSHerbert Xu .vecs = khazad_enc_tv_template, 1222da7f033dSHerbert Xu .count = KHAZAD_ENC_TEST_VECTORS 1223da7f033dSHerbert Xu }, 1224da7f033dSHerbert Xu .dec = { 1225da7f033dSHerbert Xu .vecs = khazad_dec_tv_template, 1226da7f033dSHerbert Xu .count = KHAZAD_DEC_TEST_VECTORS 1227da7f033dSHerbert Xu } 1228da7f033dSHerbert Xu } 1229da7f033dSHerbert Xu } 1230da7f033dSHerbert Xu }, { 1231da7f033dSHerbert Xu .alg = "ecb(seed)", 1232da7f033dSHerbert Xu .test = alg_test_cipher, 1233da7f033dSHerbert Xu .suite = { 1234da7f033dSHerbert Xu .cipher = { 1235da7f033dSHerbert Xu .enc = { 1236da7f033dSHerbert Xu .vecs = seed_enc_tv_template, 1237da7f033dSHerbert Xu .count = SEED_ENC_TEST_VECTORS 1238da7f033dSHerbert Xu }, 1239da7f033dSHerbert Xu .dec = { 1240da7f033dSHerbert Xu .vecs = seed_dec_tv_template, 1241da7f033dSHerbert Xu .count = SEED_DEC_TEST_VECTORS 1242da7f033dSHerbert Xu } 1243da7f033dSHerbert Xu } 1244da7f033dSHerbert Xu } 1245da7f033dSHerbert Xu }, { 1246da7f033dSHerbert Xu .alg = "ecb(serpent)", 1247da7f033dSHerbert Xu .test = alg_test_cipher, 1248da7f033dSHerbert Xu .suite = { 1249da7f033dSHerbert Xu .cipher = { 1250da7f033dSHerbert Xu .enc = { 1251da7f033dSHerbert Xu .vecs = serpent_enc_tv_template, 1252da7f033dSHerbert Xu .count = SERPENT_ENC_TEST_VECTORS 1253da7f033dSHerbert Xu }, 1254da7f033dSHerbert Xu .dec = { 1255da7f033dSHerbert Xu .vecs = serpent_dec_tv_template, 1256da7f033dSHerbert Xu .count = SERPENT_DEC_TEST_VECTORS 1257da7f033dSHerbert Xu } 1258da7f033dSHerbert Xu } 1259da7f033dSHerbert Xu } 1260da7f033dSHerbert Xu }, { 1261da7f033dSHerbert Xu .alg = "ecb(tea)", 1262da7f033dSHerbert Xu .test = alg_test_cipher, 1263da7f033dSHerbert Xu .suite = { 1264da7f033dSHerbert Xu .cipher = { 1265da7f033dSHerbert Xu .enc = { 1266da7f033dSHerbert Xu .vecs = tea_enc_tv_template, 1267da7f033dSHerbert Xu .count = TEA_ENC_TEST_VECTORS 1268da7f033dSHerbert Xu }, 1269da7f033dSHerbert Xu .dec = { 1270da7f033dSHerbert Xu .vecs = tea_dec_tv_template, 1271da7f033dSHerbert Xu .count = TEA_DEC_TEST_VECTORS 1272da7f033dSHerbert Xu } 1273da7f033dSHerbert Xu } 1274da7f033dSHerbert Xu } 1275da7f033dSHerbert Xu }, { 1276da7f033dSHerbert Xu .alg = "ecb(tnepres)", 1277da7f033dSHerbert Xu .test = alg_test_cipher, 1278da7f033dSHerbert Xu .suite = { 1279da7f033dSHerbert Xu .cipher = { 1280da7f033dSHerbert Xu .enc = { 1281da7f033dSHerbert Xu .vecs = tnepres_enc_tv_template, 1282da7f033dSHerbert Xu .count = TNEPRES_ENC_TEST_VECTORS 1283da7f033dSHerbert Xu }, 1284da7f033dSHerbert Xu .dec = { 1285da7f033dSHerbert Xu .vecs = tnepres_dec_tv_template, 1286da7f033dSHerbert Xu .count = TNEPRES_DEC_TEST_VECTORS 1287da7f033dSHerbert Xu } 1288da7f033dSHerbert Xu } 1289da7f033dSHerbert Xu } 1290da7f033dSHerbert Xu }, { 1291da7f033dSHerbert Xu .alg = "ecb(twofish)", 1292da7f033dSHerbert Xu .test = alg_test_cipher, 1293da7f033dSHerbert Xu .suite = { 1294da7f033dSHerbert Xu .cipher = { 1295da7f033dSHerbert Xu .enc = { 1296da7f033dSHerbert Xu .vecs = tf_enc_tv_template, 1297da7f033dSHerbert Xu .count = TF_ENC_TEST_VECTORS 1298da7f033dSHerbert Xu }, 1299da7f033dSHerbert Xu .dec = { 1300da7f033dSHerbert Xu .vecs = tf_dec_tv_template, 1301da7f033dSHerbert Xu .count = TF_DEC_TEST_VECTORS 1302da7f033dSHerbert Xu } 1303da7f033dSHerbert Xu } 1304da7f033dSHerbert Xu } 1305da7f033dSHerbert Xu }, { 1306da7f033dSHerbert Xu .alg = "ecb(xeta)", 1307da7f033dSHerbert Xu .test = alg_test_cipher, 1308da7f033dSHerbert Xu .suite = { 1309da7f033dSHerbert Xu .cipher = { 1310da7f033dSHerbert Xu .enc = { 1311da7f033dSHerbert Xu .vecs = xeta_enc_tv_template, 1312da7f033dSHerbert Xu .count = XETA_ENC_TEST_VECTORS 1313da7f033dSHerbert Xu }, 1314da7f033dSHerbert Xu .dec = { 1315da7f033dSHerbert Xu .vecs = xeta_dec_tv_template, 1316da7f033dSHerbert Xu .count = XETA_DEC_TEST_VECTORS 1317da7f033dSHerbert Xu } 1318da7f033dSHerbert Xu } 1319da7f033dSHerbert Xu } 1320da7f033dSHerbert Xu }, { 1321da7f033dSHerbert Xu .alg = "ecb(xtea)", 1322da7f033dSHerbert Xu .test = alg_test_cipher, 1323da7f033dSHerbert Xu .suite = { 1324da7f033dSHerbert Xu .cipher = { 1325da7f033dSHerbert Xu .enc = { 1326da7f033dSHerbert Xu .vecs = xtea_enc_tv_template, 1327da7f033dSHerbert Xu .count = XTEA_ENC_TEST_VECTORS 1328da7f033dSHerbert Xu }, 1329da7f033dSHerbert Xu .dec = { 1330da7f033dSHerbert Xu .vecs = xtea_dec_tv_template, 1331da7f033dSHerbert Xu .count = XTEA_DEC_TEST_VECTORS 1332da7f033dSHerbert Xu } 1333da7f033dSHerbert Xu } 1334da7f033dSHerbert Xu } 1335da7f033dSHerbert Xu }, { 1336da7f033dSHerbert Xu .alg = "gcm(aes)", 1337da7f033dSHerbert Xu .test = alg_test_aead, 1338da7f033dSHerbert Xu .suite = { 1339da7f033dSHerbert Xu .aead = { 1340da7f033dSHerbert Xu .enc = { 1341da7f033dSHerbert Xu .vecs = aes_gcm_enc_tv_template, 1342da7f033dSHerbert Xu .count = AES_GCM_ENC_TEST_VECTORS 1343da7f033dSHerbert Xu }, 1344da7f033dSHerbert Xu .dec = { 1345da7f033dSHerbert Xu .vecs = aes_gcm_dec_tv_template, 1346da7f033dSHerbert Xu .count = AES_GCM_DEC_TEST_VECTORS 1347da7f033dSHerbert Xu } 1348da7f033dSHerbert Xu } 1349da7f033dSHerbert Xu } 1350da7f033dSHerbert Xu }, { 1351da7f033dSHerbert Xu .alg = "hmac(md5)", 1352da7f033dSHerbert Xu .test = alg_test_hash, 1353da7f033dSHerbert Xu .suite = { 1354da7f033dSHerbert Xu .hash = { 1355da7f033dSHerbert Xu .vecs = hmac_md5_tv_template, 1356da7f033dSHerbert Xu .count = HMAC_MD5_TEST_VECTORS 1357da7f033dSHerbert Xu } 1358da7f033dSHerbert Xu } 1359da7f033dSHerbert Xu }, { 1360da7f033dSHerbert Xu .alg = "hmac(rmd128)", 1361da7f033dSHerbert Xu .test = alg_test_hash, 1362da7f033dSHerbert Xu .suite = { 1363da7f033dSHerbert Xu .hash = { 1364da7f033dSHerbert Xu .vecs = hmac_rmd128_tv_template, 1365da7f033dSHerbert Xu .count = HMAC_RMD128_TEST_VECTORS 1366da7f033dSHerbert Xu } 1367da7f033dSHerbert Xu } 1368da7f033dSHerbert Xu }, { 1369da7f033dSHerbert Xu .alg = "hmac(rmd160)", 1370da7f033dSHerbert Xu .test = alg_test_hash, 1371da7f033dSHerbert Xu .suite = { 1372da7f033dSHerbert Xu .hash = { 1373da7f033dSHerbert Xu .vecs = hmac_rmd160_tv_template, 1374da7f033dSHerbert Xu .count = HMAC_RMD160_TEST_VECTORS 1375da7f033dSHerbert Xu } 1376da7f033dSHerbert Xu } 1377da7f033dSHerbert Xu }, { 1378da7f033dSHerbert Xu .alg = "hmac(sha1)", 1379da7f033dSHerbert Xu .test = alg_test_hash, 1380da7f033dSHerbert Xu .suite = { 1381da7f033dSHerbert Xu .hash = { 1382da7f033dSHerbert Xu .vecs = hmac_sha1_tv_template, 1383da7f033dSHerbert Xu .count = HMAC_SHA1_TEST_VECTORS 1384da7f033dSHerbert Xu } 1385da7f033dSHerbert Xu } 1386da7f033dSHerbert Xu }, { 1387da7f033dSHerbert Xu .alg = "hmac(sha224)", 1388da7f033dSHerbert Xu .test = alg_test_hash, 1389da7f033dSHerbert Xu .suite = { 1390da7f033dSHerbert Xu .hash = { 1391da7f033dSHerbert Xu .vecs = hmac_sha224_tv_template, 1392da7f033dSHerbert Xu .count = HMAC_SHA224_TEST_VECTORS 1393da7f033dSHerbert Xu } 1394da7f033dSHerbert Xu } 1395da7f033dSHerbert Xu }, { 1396da7f033dSHerbert Xu .alg = "hmac(sha256)", 1397da7f033dSHerbert Xu .test = alg_test_hash, 1398da7f033dSHerbert Xu .suite = { 1399da7f033dSHerbert Xu .hash = { 1400da7f033dSHerbert Xu .vecs = hmac_sha256_tv_template, 1401da7f033dSHerbert Xu .count = HMAC_SHA256_TEST_VECTORS 1402da7f033dSHerbert Xu } 1403da7f033dSHerbert Xu } 1404da7f033dSHerbert Xu }, { 1405da7f033dSHerbert Xu .alg = "hmac(sha384)", 1406da7f033dSHerbert Xu .test = alg_test_hash, 1407da7f033dSHerbert Xu .suite = { 1408da7f033dSHerbert Xu .hash = { 1409da7f033dSHerbert Xu .vecs = hmac_sha384_tv_template, 1410da7f033dSHerbert Xu .count = HMAC_SHA384_TEST_VECTORS 1411da7f033dSHerbert Xu } 1412da7f033dSHerbert Xu } 1413da7f033dSHerbert Xu }, { 1414da7f033dSHerbert Xu .alg = "hmac(sha512)", 1415da7f033dSHerbert Xu .test = alg_test_hash, 1416da7f033dSHerbert Xu .suite = { 1417da7f033dSHerbert Xu .hash = { 1418da7f033dSHerbert Xu .vecs = hmac_sha512_tv_template, 1419da7f033dSHerbert Xu .count = HMAC_SHA512_TEST_VECTORS 1420da7f033dSHerbert Xu } 1421da7f033dSHerbert Xu } 1422da7f033dSHerbert Xu }, { 1423da7f033dSHerbert Xu .alg = "lrw(aes)", 1424da7f033dSHerbert Xu .test = alg_test_cipher, 1425da7f033dSHerbert Xu .suite = { 1426da7f033dSHerbert Xu .cipher = { 1427da7f033dSHerbert Xu .enc = { 1428da7f033dSHerbert Xu .vecs = aes_lrw_enc_tv_template, 1429da7f033dSHerbert Xu .count = AES_LRW_ENC_TEST_VECTORS 1430da7f033dSHerbert Xu }, 1431da7f033dSHerbert Xu .dec = { 1432da7f033dSHerbert Xu .vecs = aes_lrw_dec_tv_template, 1433da7f033dSHerbert Xu .count = AES_LRW_DEC_TEST_VECTORS 1434da7f033dSHerbert Xu } 1435da7f033dSHerbert Xu } 1436da7f033dSHerbert Xu } 1437da7f033dSHerbert Xu }, { 1438da7f033dSHerbert Xu .alg = "lzo", 1439da7f033dSHerbert Xu .test = alg_test_comp, 1440da7f033dSHerbert Xu .suite = { 1441da7f033dSHerbert Xu .comp = { 1442da7f033dSHerbert Xu .comp = { 1443da7f033dSHerbert Xu .vecs = lzo_comp_tv_template, 1444da7f033dSHerbert Xu .count = LZO_COMP_TEST_VECTORS 1445da7f033dSHerbert Xu }, 1446da7f033dSHerbert Xu .decomp = { 1447da7f033dSHerbert Xu .vecs = lzo_decomp_tv_template, 1448da7f033dSHerbert Xu .count = LZO_DECOMP_TEST_VECTORS 1449da7f033dSHerbert Xu } 1450da7f033dSHerbert Xu } 1451da7f033dSHerbert Xu } 1452da7f033dSHerbert Xu }, { 1453da7f033dSHerbert Xu .alg = "md4", 1454da7f033dSHerbert Xu .test = alg_test_hash, 1455da7f033dSHerbert Xu .suite = { 1456da7f033dSHerbert Xu .hash = { 1457da7f033dSHerbert Xu .vecs = md4_tv_template, 1458da7f033dSHerbert Xu .count = MD4_TEST_VECTORS 1459da7f033dSHerbert Xu } 1460da7f033dSHerbert Xu } 1461da7f033dSHerbert Xu }, { 1462da7f033dSHerbert Xu .alg = "md5", 1463da7f033dSHerbert Xu .test = alg_test_hash, 1464da7f033dSHerbert Xu .suite = { 1465da7f033dSHerbert Xu .hash = { 1466da7f033dSHerbert Xu .vecs = md5_tv_template, 1467da7f033dSHerbert Xu .count = MD5_TEST_VECTORS 1468da7f033dSHerbert Xu } 1469da7f033dSHerbert Xu } 1470da7f033dSHerbert Xu }, { 1471da7f033dSHerbert Xu .alg = "michael_mic", 1472da7f033dSHerbert Xu .test = alg_test_hash, 1473da7f033dSHerbert Xu .suite = { 1474da7f033dSHerbert Xu .hash = { 1475da7f033dSHerbert Xu .vecs = michael_mic_tv_template, 1476da7f033dSHerbert Xu .count = MICHAEL_MIC_TEST_VECTORS 1477da7f033dSHerbert Xu } 1478da7f033dSHerbert Xu } 1479da7f033dSHerbert Xu }, { 1480da7f033dSHerbert Xu .alg = "pcbc(fcrypt)", 1481da7f033dSHerbert Xu .test = alg_test_cipher, 1482da7f033dSHerbert Xu .suite = { 1483da7f033dSHerbert Xu .cipher = { 1484da7f033dSHerbert Xu .enc = { 1485da7f033dSHerbert Xu .vecs = fcrypt_pcbc_enc_tv_template, 1486da7f033dSHerbert Xu .count = FCRYPT_ENC_TEST_VECTORS 1487da7f033dSHerbert Xu }, 1488da7f033dSHerbert Xu .dec = { 1489da7f033dSHerbert Xu .vecs = fcrypt_pcbc_dec_tv_template, 1490da7f033dSHerbert Xu .count = FCRYPT_DEC_TEST_VECTORS 1491da7f033dSHerbert Xu } 1492da7f033dSHerbert Xu } 1493da7f033dSHerbert Xu } 1494da7f033dSHerbert Xu }, { 1495da7f033dSHerbert Xu .alg = "rfc3686(ctr(aes))", 1496da7f033dSHerbert Xu .test = alg_test_cipher, 1497da7f033dSHerbert Xu .suite = { 1498da7f033dSHerbert Xu .cipher = { 1499da7f033dSHerbert Xu .enc = { 1500da7f033dSHerbert Xu .vecs = aes_ctr_enc_tv_template, 1501da7f033dSHerbert Xu .count = AES_CTR_ENC_TEST_VECTORS 1502da7f033dSHerbert Xu }, 1503da7f033dSHerbert Xu .dec = { 1504da7f033dSHerbert Xu .vecs = aes_ctr_dec_tv_template, 1505da7f033dSHerbert Xu .count = AES_CTR_DEC_TEST_VECTORS 1506da7f033dSHerbert Xu } 1507da7f033dSHerbert Xu } 1508da7f033dSHerbert Xu } 1509da7f033dSHerbert Xu }, { 1510da7f033dSHerbert Xu .alg = "rmd128", 1511da7f033dSHerbert Xu .test = alg_test_hash, 1512da7f033dSHerbert Xu .suite = { 1513da7f033dSHerbert Xu .hash = { 1514da7f033dSHerbert Xu .vecs = rmd128_tv_template, 1515da7f033dSHerbert Xu .count = RMD128_TEST_VECTORS 1516da7f033dSHerbert Xu } 1517da7f033dSHerbert Xu } 1518da7f033dSHerbert Xu }, { 1519da7f033dSHerbert Xu .alg = "rmd160", 1520da7f033dSHerbert Xu .test = alg_test_hash, 1521da7f033dSHerbert Xu .suite = { 1522da7f033dSHerbert Xu .hash = { 1523da7f033dSHerbert Xu .vecs = rmd160_tv_template, 1524da7f033dSHerbert Xu .count = RMD160_TEST_VECTORS 1525da7f033dSHerbert Xu } 1526da7f033dSHerbert Xu } 1527da7f033dSHerbert Xu }, { 1528da7f033dSHerbert Xu .alg = "rmd256", 1529da7f033dSHerbert Xu .test = alg_test_hash, 1530da7f033dSHerbert Xu .suite = { 1531da7f033dSHerbert Xu .hash = { 1532da7f033dSHerbert Xu .vecs = rmd256_tv_template, 1533da7f033dSHerbert Xu .count = RMD256_TEST_VECTORS 1534da7f033dSHerbert Xu } 1535da7f033dSHerbert Xu } 1536da7f033dSHerbert Xu }, { 1537da7f033dSHerbert Xu .alg = "rmd320", 1538da7f033dSHerbert Xu .test = alg_test_hash, 1539da7f033dSHerbert Xu .suite = { 1540da7f033dSHerbert Xu .hash = { 1541da7f033dSHerbert Xu .vecs = rmd320_tv_template, 1542da7f033dSHerbert Xu .count = RMD320_TEST_VECTORS 1543da7f033dSHerbert Xu } 1544da7f033dSHerbert Xu } 1545da7f033dSHerbert Xu }, { 1546da7f033dSHerbert Xu .alg = "salsa20", 1547da7f033dSHerbert Xu .test = alg_test_cipher, 1548da7f033dSHerbert Xu .suite = { 1549da7f033dSHerbert Xu .cipher = { 1550da7f033dSHerbert Xu .enc = { 1551da7f033dSHerbert Xu .vecs = salsa20_stream_enc_tv_template, 1552da7f033dSHerbert Xu .count = SALSA20_STREAM_ENC_TEST_VECTORS 1553da7f033dSHerbert Xu } 1554da7f033dSHerbert Xu } 1555da7f033dSHerbert Xu } 1556da7f033dSHerbert Xu }, { 1557da7f033dSHerbert Xu .alg = "sha1", 1558da7f033dSHerbert Xu .test = alg_test_hash, 1559da7f033dSHerbert Xu .suite = { 1560da7f033dSHerbert Xu .hash = { 1561da7f033dSHerbert Xu .vecs = sha1_tv_template, 1562da7f033dSHerbert Xu .count = SHA1_TEST_VECTORS 1563da7f033dSHerbert Xu } 1564da7f033dSHerbert Xu } 1565da7f033dSHerbert Xu }, { 1566da7f033dSHerbert Xu .alg = "sha224", 1567da7f033dSHerbert Xu .test = alg_test_hash, 1568da7f033dSHerbert Xu .suite = { 1569da7f033dSHerbert Xu .hash = { 1570da7f033dSHerbert Xu .vecs = sha224_tv_template, 1571da7f033dSHerbert Xu .count = SHA224_TEST_VECTORS 1572da7f033dSHerbert Xu } 1573da7f033dSHerbert Xu } 1574da7f033dSHerbert Xu }, { 1575da7f033dSHerbert Xu .alg = "sha256", 1576da7f033dSHerbert Xu .test = alg_test_hash, 1577da7f033dSHerbert Xu .suite = { 1578da7f033dSHerbert Xu .hash = { 1579da7f033dSHerbert Xu .vecs = sha256_tv_template, 1580da7f033dSHerbert Xu .count = SHA256_TEST_VECTORS 1581da7f033dSHerbert Xu } 1582da7f033dSHerbert Xu } 1583da7f033dSHerbert Xu }, { 1584da7f033dSHerbert Xu .alg = "sha384", 1585da7f033dSHerbert Xu .test = alg_test_hash, 1586da7f033dSHerbert Xu .suite = { 1587da7f033dSHerbert Xu .hash = { 1588da7f033dSHerbert Xu .vecs = sha384_tv_template, 1589da7f033dSHerbert Xu .count = SHA384_TEST_VECTORS 1590da7f033dSHerbert Xu } 1591da7f033dSHerbert Xu } 1592da7f033dSHerbert Xu }, { 1593da7f033dSHerbert Xu .alg = "sha512", 1594da7f033dSHerbert Xu .test = alg_test_hash, 1595da7f033dSHerbert Xu .suite = { 1596da7f033dSHerbert Xu .hash = { 1597da7f033dSHerbert Xu .vecs = sha512_tv_template, 1598da7f033dSHerbert Xu .count = SHA512_TEST_VECTORS 1599da7f033dSHerbert Xu } 1600da7f033dSHerbert Xu } 1601da7f033dSHerbert Xu }, { 1602da7f033dSHerbert Xu .alg = "tgr128", 1603da7f033dSHerbert Xu .test = alg_test_hash, 1604da7f033dSHerbert Xu .suite = { 1605da7f033dSHerbert Xu .hash = { 1606da7f033dSHerbert Xu .vecs = tgr128_tv_template, 1607da7f033dSHerbert Xu .count = TGR128_TEST_VECTORS 1608da7f033dSHerbert Xu } 1609da7f033dSHerbert Xu } 1610da7f033dSHerbert Xu }, { 1611da7f033dSHerbert Xu .alg = "tgr160", 1612da7f033dSHerbert Xu .test = alg_test_hash, 1613da7f033dSHerbert Xu .suite = { 1614da7f033dSHerbert Xu .hash = { 1615da7f033dSHerbert Xu .vecs = tgr160_tv_template, 1616da7f033dSHerbert Xu .count = TGR160_TEST_VECTORS 1617da7f033dSHerbert Xu } 1618da7f033dSHerbert Xu } 1619da7f033dSHerbert Xu }, { 1620da7f033dSHerbert Xu .alg = "tgr192", 1621da7f033dSHerbert Xu .test = alg_test_hash, 1622da7f033dSHerbert Xu .suite = { 1623da7f033dSHerbert Xu .hash = { 1624da7f033dSHerbert Xu .vecs = tgr192_tv_template, 1625da7f033dSHerbert Xu .count = TGR192_TEST_VECTORS 1626da7f033dSHerbert Xu } 1627da7f033dSHerbert Xu } 1628da7f033dSHerbert Xu }, { 1629da7f033dSHerbert Xu .alg = "wp256", 1630da7f033dSHerbert Xu .test = alg_test_hash, 1631da7f033dSHerbert Xu .suite = { 1632da7f033dSHerbert Xu .hash = { 1633da7f033dSHerbert Xu .vecs = wp256_tv_template, 1634da7f033dSHerbert Xu .count = WP256_TEST_VECTORS 1635da7f033dSHerbert Xu } 1636da7f033dSHerbert Xu } 1637da7f033dSHerbert Xu }, { 1638da7f033dSHerbert Xu .alg = "wp384", 1639da7f033dSHerbert Xu .test = alg_test_hash, 1640da7f033dSHerbert Xu .suite = { 1641da7f033dSHerbert Xu .hash = { 1642da7f033dSHerbert Xu .vecs = wp384_tv_template, 1643da7f033dSHerbert Xu .count = WP384_TEST_VECTORS 1644da7f033dSHerbert Xu } 1645da7f033dSHerbert Xu } 1646da7f033dSHerbert Xu }, { 1647da7f033dSHerbert Xu .alg = "wp512", 1648da7f033dSHerbert Xu .test = alg_test_hash, 1649da7f033dSHerbert Xu .suite = { 1650da7f033dSHerbert Xu .hash = { 1651da7f033dSHerbert Xu .vecs = wp512_tv_template, 1652da7f033dSHerbert Xu .count = WP512_TEST_VECTORS 1653da7f033dSHerbert Xu } 1654da7f033dSHerbert Xu } 1655da7f033dSHerbert Xu }, { 1656da7f033dSHerbert Xu .alg = "xcbc(aes)", 1657da7f033dSHerbert Xu .test = alg_test_hash, 1658da7f033dSHerbert Xu .suite = { 1659da7f033dSHerbert Xu .hash = { 1660da7f033dSHerbert Xu .vecs = aes_xcbc128_tv_template, 1661da7f033dSHerbert Xu .count = XCBC_AES_TEST_VECTORS 1662da7f033dSHerbert Xu } 1663da7f033dSHerbert Xu } 1664da7f033dSHerbert Xu }, { 1665da7f033dSHerbert Xu .alg = "xts(aes)", 1666da7f033dSHerbert Xu .test = alg_test_cipher, 1667da7f033dSHerbert Xu .suite = { 1668da7f033dSHerbert Xu .cipher = { 1669da7f033dSHerbert Xu .enc = { 1670da7f033dSHerbert Xu .vecs = aes_xts_enc_tv_template, 1671da7f033dSHerbert Xu .count = AES_XTS_ENC_TEST_VECTORS 1672da7f033dSHerbert Xu }, 1673da7f033dSHerbert Xu .dec = { 1674da7f033dSHerbert Xu .vecs = aes_xts_dec_tv_template, 1675da7f033dSHerbert Xu .count = AES_XTS_DEC_TEST_VECTORS 1676da7f033dSHerbert Xu } 1677da7f033dSHerbert Xu } 1678da7f033dSHerbert Xu } 1679da7f033dSHerbert Xu } 1680da7f033dSHerbert Xu }; 1681da7f033dSHerbert Xu 1682da7f033dSHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 1683da7f033dSHerbert Xu { 1684da7f033dSHerbert Xu int start = 0; 1685da7f033dSHerbert Xu int end = ARRAY_SIZE(alg_test_descs); 1686da7f033dSHerbert Xu 1687da7f033dSHerbert Xu while (start < end) { 1688da7f033dSHerbert Xu int i = (start + end) / 2; 1689da7f033dSHerbert Xu int diff = strcmp(alg_test_descs[i].alg, alg); 1690da7f033dSHerbert Xu 1691da7f033dSHerbert Xu if (diff > 0) { 1692da7f033dSHerbert Xu end = i; 1693da7f033dSHerbert Xu continue; 1694da7f033dSHerbert Xu } 1695da7f033dSHerbert Xu 1696da7f033dSHerbert Xu if (diff < 0) { 1697da7f033dSHerbert Xu start = i + 1; 1698da7f033dSHerbert Xu continue; 1699da7f033dSHerbert Xu } 1700da7f033dSHerbert Xu 1701da7f033dSHerbert Xu return alg_test_descs[i].test(alg_test_descs + i, driver, 1702da7f033dSHerbert Xu type, mask); 1703da7f033dSHerbert Xu } 1704da7f033dSHerbert Xu 1705da7f033dSHerbert Xu printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver); 1706da7f033dSHerbert Xu return 0; 1707da7f033dSHerbert Xu } 1708da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test); 1709da7f033dSHerbert Xu 1710da7f033dSHerbert Xu int __init testmgr_init(void) 1711da7f033dSHerbert Xu { 1712da7f033dSHerbert Xu int i; 1713da7f033dSHerbert Xu 1714da7f033dSHerbert Xu for (i = 0; i < XBUFSIZE; i++) { 1715da7f033dSHerbert Xu xbuf[i] = (void *)__get_free_page(GFP_KERNEL); 1716da7f033dSHerbert Xu if (!xbuf[i]) 1717da7f033dSHerbert Xu goto err_free_xbuf; 1718da7f033dSHerbert Xu } 1719da7f033dSHerbert Xu 1720da7f033dSHerbert Xu for (i = 0; i < XBUFSIZE; i++) { 1721da7f033dSHerbert Xu axbuf[i] = (void *)__get_free_page(GFP_KERNEL); 1722da7f033dSHerbert Xu if (!axbuf[i]) 1723da7f033dSHerbert Xu goto err_free_axbuf; 1724da7f033dSHerbert Xu } 1725da7f033dSHerbert Xu 1726da7f033dSHerbert Xu return 0; 1727da7f033dSHerbert Xu 1728da7f033dSHerbert Xu err_free_axbuf: 1729da7f033dSHerbert Xu for (i = 0; i < XBUFSIZE && axbuf[i]; i++) 1730da7f033dSHerbert Xu free_page((unsigned long)axbuf[i]); 1731da7f033dSHerbert Xu err_free_xbuf: 1732da7f033dSHerbert Xu for (i = 0; i < XBUFSIZE && xbuf[i]; i++) 1733da7f033dSHerbert Xu free_page((unsigned long)xbuf[i]); 1734da7f033dSHerbert Xu 1735da7f033dSHerbert Xu return -ENOMEM; 1736da7f033dSHerbert Xu } 1737da7f033dSHerbert Xu 1738da7f033dSHerbert Xu void testmgr_exit(void) 1739da7f033dSHerbert Xu { 1740da7f033dSHerbert Xu int i; 1741da7f033dSHerbert Xu 1742da7f033dSHerbert Xu for (i = 0; i < XBUFSIZE; i++) 1743da7f033dSHerbert Xu free_page((unsigned long)axbuf[i]); 1744da7f033dSHerbert Xu for (i = 0; i < XBUFSIZE; i++) 1745da7f033dSHerbert Xu free_page((unsigned long)xbuf[i]); 1746da7f033dSHerbert Xu } 1747