1 /* 2 * Algorithm testing framework and tests. 3 * 4 * Copyright (c) 2002 James Morris <jmorris@intercode.com.au> 5 * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org> 6 * Copyright (c) 2007 Nokia Siemens Networks 7 * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au> 8 * 9 * This program is free software; you can redistribute it and/or modify it 10 * under the terms of the GNU General Public License as published by the Free 11 * Software Foundation; either version 2 of the License, or (at your option) 12 * any later version. 13 * 14 */ 15 16 #include <crypto/hash.h> 17 #include <linux/err.h> 18 #include <linux/module.h> 19 #include <linux/scatterlist.h> 20 #include <linux/slab.h> 21 #include <linux/string.h> 22 #include <crypto/rng.h> 23 24 #include "internal.h" 25 26 #ifndef CONFIG_CRYPTO_MANAGER_TESTS 27 28 /* a perfect nop */ 29 int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 30 { 31 return 0; 32 } 33 34 #else 35 36 #include "testmgr.h" 37 38 /* 39 * Need slab memory for testing (size in number of pages). 40 */ 41 #define XBUFSIZE 8 42 43 /* 44 * Indexes into the xbuf to simulate cross-page access. 45 */ 46 #define IDX1 32 47 #define IDX2 32400 48 #define IDX3 1 49 #define IDX4 8193 50 #define IDX5 22222 51 #define IDX6 17101 52 #define IDX7 27333 53 #define IDX8 3000 54 55 /* 56 * Used by test_cipher() 57 */ 58 #define ENCRYPT 1 59 #define DECRYPT 0 60 61 struct tcrypt_result { 62 struct completion completion; 63 int err; 64 }; 65 66 struct aead_test_suite { 67 struct { 68 struct aead_testvec *vecs; 69 unsigned int count; 70 } enc, dec; 71 }; 72 73 struct cipher_test_suite { 74 struct { 75 struct cipher_testvec *vecs; 76 unsigned int count; 77 } enc, dec; 78 }; 79 80 struct comp_test_suite { 81 struct { 82 struct comp_testvec *vecs; 83 unsigned int count; 84 } comp, decomp; 85 }; 86 87 struct pcomp_test_suite { 88 struct { 89 struct pcomp_testvec *vecs; 90 unsigned int count; 91 } comp, decomp; 92 }; 93 94 struct hash_test_suite { 95 struct hash_testvec *vecs; 96 unsigned int count; 97 }; 98 99 struct cprng_test_suite { 100 struct cprng_testvec *vecs; 101 unsigned int count; 102 }; 103 104 struct alg_test_desc { 105 const char *alg; 106 int (*test)(const struct alg_test_desc *desc, const char *driver, 107 u32 type, u32 mask); 108 int fips_allowed; /* set if alg is allowed in fips mode */ 109 110 union { 111 struct aead_test_suite aead; 112 struct cipher_test_suite cipher; 113 struct comp_test_suite comp; 114 struct pcomp_test_suite pcomp; 115 struct hash_test_suite hash; 116 struct cprng_test_suite cprng; 117 } suite; 118 }; 119 120 static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 }; 121 122 static void hexdump(unsigned char *buf, unsigned int len) 123 { 124 print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET, 125 16, 1, 126 buf, len, false); 127 } 128 129 static void tcrypt_complete(struct crypto_async_request *req, int err) 130 { 131 struct tcrypt_result *res = req->data; 132 133 if (err == -EINPROGRESS) 134 return; 135 136 res->err = err; 137 complete(&res->completion); 138 } 139 140 static int testmgr_alloc_buf(char *buf[XBUFSIZE]) 141 { 142 int i; 143 144 for (i = 0; i < XBUFSIZE; i++) { 145 buf[i] = (void *)__get_free_page(GFP_KERNEL); 146 if (!buf[i]) 147 goto err_free_buf; 148 } 149 150 return 0; 151 152 err_free_buf: 153 while (i-- > 0) 154 free_page((unsigned long)buf[i]); 155 156 return -ENOMEM; 157 } 158 159 static void testmgr_free_buf(char *buf[XBUFSIZE]) 160 { 161 int i; 162 163 for (i = 0; i < XBUFSIZE; i++) 164 free_page((unsigned long)buf[i]); 165 } 166 167 static int do_one_async_hash_op(struct ahash_request *req, 168 struct tcrypt_result *tr, 169 int ret) 170 { 171 if (ret == -EINPROGRESS || ret == -EBUSY) { 172 ret = wait_for_completion_interruptible(&tr->completion); 173 if (!ret) 174 ret = tr->err; 175 INIT_COMPLETION(tr->completion); 176 } 177 return ret; 178 } 179 180 static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template, 181 unsigned int tcount, bool use_digest) 182 { 183 const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm)); 184 unsigned int i, j, k, temp; 185 struct scatterlist sg[8]; 186 char result[64]; 187 struct ahash_request *req; 188 struct tcrypt_result tresult; 189 void *hash_buff; 190 char *xbuf[XBUFSIZE]; 191 int ret = -ENOMEM; 192 193 if (testmgr_alloc_buf(xbuf)) 194 goto out_nobuf; 195 196 init_completion(&tresult.completion); 197 198 req = ahash_request_alloc(tfm, GFP_KERNEL); 199 if (!req) { 200 printk(KERN_ERR "alg: hash: Failed to allocate request for " 201 "%s\n", algo); 202 goto out_noreq; 203 } 204 ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 205 tcrypt_complete, &tresult); 206 207 j = 0; 208 for (i = 0; i < tcount; i++) { 209 if (template[i].np) 210 continue; 211 212 j++; 213 memset(result, 0, 64); 214 215 hash_buff = xbuf[0]; 216 217 memcpy(hash_buff, template[i].plaintext, template[i].psize); 218 sg_init_one(&sg[0], hash_buff, template[i].psize); 219 220 if (template[i].ksize) { 221 crypto_ahash_clear_flags(tfm, ~0); 222 ret = crypto_ahash_setkey(tfm, template[i].key, 223 template[i].ksize); 224 if (ret) { 225 printk(KERN_ERR "alg: hash: setkey failed on " 226 "test %d for %s: ret=%d\n", j, algo, 227 -ret); 228 goto out; 229 } 230 } 231 232 ahash_request_set_crypt(req, sg, result, template[i].psize); 233 if (use_digest) { 234 ret = do_one_async_hash_op(req, &tresult, 235 crypto_ahash_digest(req)); 236 if (ret) { 237 pr_err("alg: hash: digest failed on test %d " 238 "for %s: ret=%d\n", j, algo, -ret); 239 goto out; 240 } 241 } else { 242 ret = do_one_async_hash_op(req, &tresult, 243 crypto_ahash_init(req)); 244 if (ret) { 245 pr_err("alt: hash: init failed on test %d " 246 "for %s: ret=%d\n", j, algo, -ret); 247 goto out; 248 } 249 ret = do_one_async_hash_op(req, &tresult, 250 crypto_ahash_update(req)); 251 if (ret) { 252 pr_err("alt: hash: update failed on test %d " 253 "for %s: ret=%d\n", j, algo, -ret); 254 goto out; 255 } 256 ret = do_one_async_hash_op(req, &tresult, 257 crypto_ahash_final(req)); 258 if (ret) { 259 pr_err("alt: hash: final failed on test %d " 260 "for %s: ret=%d\n", j, algo, -ret); 261 goto out; 262 } 263 } 264 265 if (memcmp(result, template[i].digest, 266 crypto_ahash_digestsize(tfm))) { 267 printk(KERN_ERR "alg: hash: Test %d failed for %s\n", 268 j, algo); 269 hexdump(result, crypto_ahash_digestsize(tfm)); 270 ret = -EINVAL; 271 goto out; 272 } 273 } 274 275 j = 0; 276 for (i = 0; i < tcount; i++) { 277 if (template[i].np) { 278 j++; 279 memset(result, 0, 64); 280 281 temp = 0; 282 sg_init_table(sg, template[i].np); 283 ret = -EINVAL; 284 for (k = 0; k < template[i].np; k++) { 285 if (WARN_ON(offset_in_page(IDX[k]) + 286 template[i].tap[k] > PAGE_SIZE)) 287 goto out; 288 sg_set_buf(&sg[k], 289 memcpy(xbuf[IDX[k] >> PAGE_SHIFT] + 290 offset_in_page(IDX[k]), 291 template[i].plaintext + temp, 292 template[i].tap[k]), 293 template[i].tap[k]); 294 temp += template[i].tap[k]; 295 } 296 297 if (template[i].ksize) { 298 crypto_ahash_clear_flags(tfm, ~0); 299 ret = crypto_ahash_setkey(tfm, template[i].key, 300 template[i].ksize); 301 302 if (ret) { 303 printk(KERN_ERR "alg: hash: setkey " 304 "failed on chunking test %d " 305 "for %s: ret=%d\n", j, algo, 306 -ret); 307 goto out; 308 } 309 } 310 311 ahash_request_set_crypt(req, sg, result, 312 template[i].psize); 313 ret = crypto_ahash_digest(req); 314 switch (ret) { 315 case 0: 316 break; 317 case -EINPROGRESS: 318 case -EBUSY: 319 ret = wait_for_completion_interruptible( 320 &tresult.completion); 321 if (!ret && !(ret = tresult.err)) { 322 INIT_COMPLETION(tresult.completion); 323 break; 324 } 325 /* fall through */ 326 default: 327 printk(KERN_ERR "alg: hash: digest failed " 328 "on chunking test %d for %s: " 329 "ret=%d\n", j, algo, -ret); 330 goto out; 331 } 332 333 if (memcmp(result, template[i].digest, 334 crypto_ahash_digestsize(tfm))) { 335 printk(KERN_ERR "alg: hash: Chunking test %d " 336 "failed for %s\n", j, algo); 337 hexdump(result, crypto_ahash_digestsize(tfm)); 338 ret = -EINVAL; 339 goto out; 340 } 341 } 342 } 343 344 ret = 0; 345 346 out: 347 ahash_request_free(req); 348 out_noreq: 349 testmgr_free_buf(xbuf); 350 out_nobuf: 351 return ret; 352 } 353 354 static int test_aead(struct crypto_aead *tfm, int enc, 355 struct aead_testvec *template, unsigned int tcount) 356 { 357 const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)); 358 unsigned int i, j, k, n, temp; 359 int ret = -ENOMEM; 360 char *q; 361 char *key; 362 struct aead_request *req; 363 struct scatterlist sg[8]; 364 struct scatterlist asg[8]; 365 const char *e; 366 struct tcrypt_result result; 367 unsigned int authsize; 368 void *input; 369 void *assoc; 370 char iv[MAX_IVLEN]; 371 char *xbuf[XBUFSIZE]; 372 char *axbuf[XBUFSIZE]; 373 374 if (testmgr_alloc_buf(xbuf)) 375 goto out_noxbuf; 376 if (testmgr_alloc_buf(axbuf)) 377 goto out_noaxbuf; 378 379 if (enc == ENCRYPT) 380 e = "encryption"; 381 else 382 e = "decryption"; 383 384 init_completion(&result.completion); 385 386 req = aead_request_alloc(tfm, GFP_KERNEL); 387 if (!req) { 388 printk(KERN_ERR "alg: aead: Failed to allocate request for " 389 "%s\n", algo); 390 goto out; 391 } 392 393 aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 394 tcrypt_complete, &result); 395 396 for (i = 0, j = 0; i < tcount; i++) { 397 if (!template[i].np) { 398 j++; 399 400 /* some tepmplates have no input data but they will 401 * touch input 402 */ 403 input = xbuf[0]; 404 assoc = axbuf[0]; 405 406 ret = -EINVAL; 407 if (WARN_ON(template[i].ilen > PAGE_SIZE || 408 template[i].alen > PAGE_SIZE)) 409 goto out; 410 411 memcpy(input, template[i].input, template[i].ilen); 412 memcpy(assoc, template[i].assoc, template[i].alen); 413 if (template[i].iv) 414 memcpy(iv, template[i].iv, MAX_IVLEN); 415 else 416 memset(iv, 0, MAX_IVLEN); 417 418 crypto_aead_clear_flags(tfm, ~0); 419 if (template[i].wk) 420 crypto_aead_set_flags( 421 tfm, CRYPTO_TFM_REQ_WEAK_KEY); 422 423 key = template[i].key; 424 425 ret = crypto_aead_setkey(tfm, key, 426 template[i].klen); 427 if (!ret == template[i].fail) { 428 printk(KERN_ERR "alg: aead: setkey failed on " 429 "test %d for %s: flags=%x\n", j, algo, 430 crypto_aead_get_flags(tfm)); 431 goto out; 432 } else if (ret) 433 continue; 434 435 authsize = abs(template[i].rlen - template[i].ilen); 436 ret = crypto_aead_setauthsize(tfm, authsize); 437 if (ret) { 438 printk(KERN_ERR "alg: aead: Failed to set " 439 "authsize to %u on test %d for %s\n", 440 authsize, j, algo); 441 goto out; 442 } 443 444 sg_init_one(&sg[0], input, 445 template[i].ilen + (enc ? authsize : 0)); 446 447 sg_init_one(&asg[0], assoc, template[i].alen); 448 449 aead_request_set_crypt(req, sg, sg, 450 template[i].ilen, iv); 451 452 aead_request_set_assoc(req, asg, template[i].alen); 453 454 ret = enc ? 455 crypto_aead_encrypt(req) : 456 crypto_aead_decrypt(req); 457 458 switch (ret) { 459 case 0: 460 if (template[i].novrfy) { 461 /* verification was supposed to fail */ 462 printk(KERN_ERR "alg: aead: %s failed " 463 "on test %d for %s: ret was 0, " 464 "expected -EBADMSG\n", 465 e, j, algo); 466 /* so really, we got a bad message */ 467 ret = -EBADMSG; 468 goto out; 469 } 470 break; 471 case -EINPROGRESS: 472 case -EBUSY: 473 ret = wait_for_completion_interruptible( 474 &result.completion); 475 if (!ret && !(ret = result.err)) { 476 INIT_COMPLETION(result.completion); 477 break; 478 } 479 case -EBADMSG: 480 if (template[i].novrfy) 481 /* verification failure was expected */ 482 continue; 483 /* fall through */ 484 default: 485 printk(KERN_ERR "alg: aead: %s failed on test " 486 "%d for %s: ret=%d\n", e, j, algo, -ret); 487 goto out; 488 } 489 490 q = input; 491 if (memcmp(q, template[i].result, template[i].rlen)) { 492 printk(KERN_ERR "alg: aead: Test %d failed on " 493 "%s for %s\n", j, e, algo); 494 hexdump(q, template[i].rlen); 495 ret = -EINVAL; 496 goto out; 497 } 498 } 499 } 500 501 for (i = 0, j = 0; i < tcount; i++) { 502 if (template[i].np) { 503 j++; 504 505 if (template[i].iv) 506 memcpy(iv, template[i].iv, MAX_IVLEN); 507 else 508 memset(iv, 0, MAX_IVLEN); 509 510 crypto_aead_clear_flags(tfm, ~0); 511 if (template[i].wk) 512 crypto_aead_set_flags( 513 tfm, CRYPTO_TFM_REQ_WEAK_KEY); 514 key = template[i].key; 515 516 ret = crypto_aead_setkey(tfm, key, template[i].klen); 517 if (!ret == template[i].fail) { 518 printk(KERN_ERR "alg: aead: setkey failed on " 519 "chunk test %d for %s: flags=%x\n", j, 520 algo, crypto_aead_get_flags(tfm)); 521 goto out; 522 } else if (ret) 523 continue; 524 525 authsize = abs(template[i].rlen - template[i].ilen); 526 527 ret = -EINVAL; 528 sg_init_table(sg, template[i].np); 529 for (k = 0, temp = 0; k < template[i].np; k++) { 530 if (WARN_ON(offset_in_page(IDX[k]) + 531 template[i].tap[k] > PAGE_SIZE)) 532 goto out; 533 534 q = xbuf[IDX[k] >> PAGE_SHIFT] + 535 offset_in_page(IDX[k]); 536 537 memcpy(q, template[i].input + temp, 538 template[i].tap[k]); 539 540 n = template[i].tap[k]; 541 if (k == template[i].np - 1 && enc) 542 n += authsize; 543 if (offset_in_page(q) + n < PAGE_SIZE) 544 q[n] = 0; 545 546 sg_set_buf(&sg[k], q, template[i].tap[k]); 547 temp += template[i].tap[k]; 548 } 549 550 ret = crypto_aead_setauthsize(tfm, authsize); 551 if (ret) { 552 printk(KERN_ERR "alg: aead: Failed to set " 553 "authsize to %u on chunk test %d for " 554 "%s\n", authsize, j, algo); 555 goto out; 556 } 557 558 if (enc) { 559 if (WARN_ON(sg[k - 1].offset + 560 sg[k - 1].length + authsize > 561 PAGE_SIZE)) { 562 ret = -EINVAL; 563 goto out; 564 } 565 566 sg[k - 1].length += authsize; 567 } 568 569 sg_init_table(asg, template[i].anp); 570 ret = -EINVAL; 571 for (k = 0, temp = 0; k < template[i].anp; k++) { 572 if (WARN_ON(offset_in_page(IDX[k]) + 573 template[i].atap[k] > PAGE_SIZE)) 574 goto out; 575 sg_set_buf(&asg[k], 576 memcpy(axbuf[IDX[k] >> PAGE_SHIFT] + 577 offset_in_page(IDX[k]), 578 template[i].assoc + temp, 579 template[i].atap[k]), 580 template[i].atap[k]); 581 temp += template[i].atap[k]; 582 } 583 584 aead_request_set_crypt(req, sg, sg, 585 template[i].ilen, 586 iv); 587 588 aead_request_set_assoc(req, asg, template[i].alen); 589 590 ret = enc ? 591 crypto_aead_encrypt(req) : 592 crypto_aead_decrypt(req); 593 594 switch (ret) { 595 case 0: 596 if (template[i].novrfy) { 597 /* verification was supposed to fail */ 598 printk(KERN_ERR "alg: aead: %s failed " 599 "on chunk test %d for %s: ret " 600 "was 0, expected -EBADMSG\n", 601 e, j, algo); 602 /* so really, we got a bad message */ 603 ret = -EBADMSG; 604 goto out; 605 } 606 break; 607 case -EINPROGRESS: 608 case -EBUSY: 609 ret = wait_for_completion_interruptible( 610 &result.completion); 611 if (!ret && !(ret = result.err)) { 612 INIT_COMPLETION(result.completion); 613 break; 614 } 615 case -EBADMSG: 616 if (template[i].novrfy) 617 /* verification failure was expected */ 618 continue; 619 /* fall through */ 620 default: 621 printk(KERN_ERR "alg: aead: %s failed on " 622 "chunk test %d for %s: ret=%d\n", e, j, 623 algo, -ret); 624 goto out; 625 } 626 627 ret = -EINVAL; 628 for (k = 0, temp = 0; k < template[i].np; k++) { 629 q = xbuf[IDX[k] >> PAGE_SHIFT] + 630 offset_in_page(IDX[k]); 631 632 n = template[i].tap[k]; 633 if (k == template[i].np - 1) 634 n += enc ? authsize : -authsize; 635 636 if (memcmp(q, template[i].result + temp, n)) { 637 printk(KERN_ERR "alg: aead: Chunk " 638 "test %d failed on %s at page " 639 "%u for %s\n", j, e, k, algo); 640 hexdump(q, n); 641 goto out; 642 } 643 644 q += n; 645 if (k == template[i].np - 1 && !enc) { 646 if (memcmp(q, template[i].input + 647 temp + n, authsize)) 648 n = authsize; 649 else 650 n = 0; 651 } else { 652 for (n = 0; offset_in_page(q + n) && 653 q[n]; n++) 654 ; 655 } 656 if (n) { 657 printk(KERN_ERR "alg: aead: Result " 658 "buffer corruption in chunk " 659 "test %d on %s at page %u for " 660 "%s: %u bytes:\n", j, e, k, 661 algo, n); 662 hexdump(q, n); 663 goto out; 664 } 665 666 temp += template[i].tap[k]; 667 } 668 } 669 } 670 671 ret = 0; 672 673 out: 674 aead_request_free(req); 675 testmgr_free_buf(axbuf); 676 out_noaxbuf: 677 testmgr_free_buf(xbuf); 678 out_noxbuf: 679 return ret; 680 } 681 682 static int test_cipher(struct crypto_cipher *tfm, int enc, 683 struct cipher_testvec *template, unsigned int tcount) 684 { 685 const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm)); 686 unsigned int i, j, k; 687 char *q; 688 const char *e; 689 void *data; 690 char *xbuf[XBUFSIZE]; 691 int ret = -ENOMEM; 692 693 if (testmgr_alloc_buf(xbuf)) 694 goto out_nobuf; 695 696 if (enc == ENCRYPT) 697 e = "encryption"; 698 else 699 e = "decryption"; 700 701 j = 0; 702 for (i = 0; i < tcount; i++) { 703 if (template[i].np) 704 continue; 705 706 j++; 707 708 ret = -EINVAL; 709 if (WARN_ON(template[i].ilen > PAGE_SIZE)) 710 goto out; 711 712 data = xbuf[0]; 713 memcpy(data, template[i].input, template[i].ilen); 714 715 crypto_cipher_clear_flags(tfm, ~0); 716 if (template[i].wk) 717 crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY); 718 719 ret = crypto_cipher_setkey(tfm, template[i].key, 720 template[i].klen); 721 if (!ret == template[i].fail) { 722 printk(KERN_ERR "alg: cipher: setkey failed " 723 "on test %d for %s: flags=%x\n", j, 724 algo, crypto_cipher_get_flags(tfm)); 725 goto out; 726 } else if (ret) 727 continue; 728 729 for (k = 0; k < template[i].ilen; 730 k += crypto_cipher_blocksize(tfm)) { 731 if (enc) 732 crypto_cipher_encrypt_one(tfm, data + k, 733 data + k); 734 else 735 crypto_cipher_decrypt_one(tfm, data + k, 736 data + k); 737 } 738 739 q = data; 740 if (memcmp(q, template[i].result, template[i].rlen)) { 741 printk(KERN_ERR "alg: cipher: Test %d failed " 742 "on %s for %s\n", j, e, algo); 743 hexdump(q, template[i].rlen); 744 ret = -EINVAL; 745 goto out; 746 } 747 } 748 749 ret = 0; 750 751 out: 752 testmgr_free_buf(xbuf); 753 out_nobuf: 754 return ret; 755 } 756 757 static int test_skcipher(struct crypto_ablkcipher *tfm, int enc, 758 struct cipher_testvec *template, unsigned int tcount) 759 { 760 const char *algo = 761 crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm)); 762 unsigned int i, j, k, n, temp; 763 char *q; 764 struct ablkcipher_request *req; 765 struct scatterlist sg[8]; 766 const char *e; 767 struct tcrypt_result result; 768 void *data; 769 char iv[MAX_IVLEN]; 770 char *xbuf[XBUFSIZE]; 771 int ret = -ENOMEM; 772 773 if (testmgr_alloc_buf(xbuf)) 774 goto out_nobuf; 775 776 if (enc == ENCRYPT) 777 e = "encryption"; 778 else 779 e = "decryption"; 780 781 init_completion(&result.completion); 782 783 req = ablkcipher_request_alloc(tfm, GFP_KERNEL); 784 if (!req) { 785 printk(KERN_ERR "alg: skcipher: Failed to allocate request " 786 "for %s\n", algo); 787 goto out; 788 } 789 790 ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 791 tcrypt_complete, &result); 792 793 j = 0; 794 for (i = 0; i < tcount; i++) { 795 if (template[i].iv) 796 memcpy(iv, template[i].iv, MAX_IVLEN); 797 else 798 memset(iv, 0, MAX_IVLEN); 799 800 if (!(template[i].np)) { 801 j++; 802 803 ret = -EINVAL; 804 if (WARN_ON(template[i].ilen > PAGE_SIZE)) 805 goto out; 806 807 data = xbuf[0]; 808 memcpy(data, template[i].input, template[i].ilen); 809 810 crypto_ablkcipher_clear_flags(tfm, ~0); 811 if (template[i].wk) 812 crypto_ablkcipher_set_flags( 813 tfm, CRYPTO_TFM_REQ_WEAK_KEY); 814 815 ret = crypto_ablkcipher_setkey(tfm, template[i].key, 816 template[i].klen); 817 if (!ret == template[i].fail) { 818 printk(KERN_ERR "alg: skcipher: setkey failed " 819 "on test %d for %s: flags=%x\n", j, 820 algo, crypto_ablkcipher_get_flags(tfm)); 821 goto out; 822 } else if (ret) 823 continue; 824 825 sg_init_one(&sg[0], data, template[i].ilen); 826 827 ablkcipher_request_set_crypt(req, sg, sg, 828 template[i].ilen, iv); 829 ret = enc ? 830 crypto_ablkcipher_encrypt(req) : 831 crypto_ablkcipher_decrypt(req); 832 833 switch (ret) { 834 case 0: 835 break; 836 case -EINPROGRESS: 837 case -EBUSY: 838 ret = wait_for_completion_interruptible( 839 &result.completion); 840 if (!ret && !((ret = result.err))) { 841 INIT_COMPLETION(result.completion); 842 break; 843 } 844 /* fall through */ 845 default: 846 printk(KERN_ERR "alg: skcipher: %s failed on " 847 "test %d for %s: ret=%d\n", e, j, algo, 848 -ret); 849 goto out; 850 } 851 852 q = data; 853 if (memcmp(q, template[i].result, template[i].rlen)) { 854 printk(KERN_ERR "alg: skcipher: Test %d " 855 "failed on %s for %s\n", j, e, algo); 856 hexdump(q, template[i].rlen); 857 ret = -EINVAL; 858 goto out; 859 } 860 } 861 } 862 863 j = 0; 864 for (i = 0; i < tcount; i++) { 865 866 if (template[i].iv) 867 memcpy(iv, template[i].iv, MAX_IVLEN); 868 else 869 memset(iv, 0, MAX_IVLEN); 870 871 if (template[i].np) { 872 j++; 873 874 crypto_ablkcipher_clear_flags(tfm, ~0); 875 if (template[i].wk) 876 crypto_ablkcipher_set_flags( 877 tfm, CRYPTO_TFM_REQ_WEAK_KEY); 878 879 ret = crypto_ablkcipher_setkey(tfm, template[i].key, 880 template[i].klen); 881 if (!ret == template[i].fail) { 882 printk(KERN_ERR "alg: skcipher: setkey failed " 883 "on chunk test %d for %s: flags=%x\n", 884 j, algo, 885 crypto_ablkcipher_get_flags(tfm)); 886 goto out; 887 } else if (ret) 888 continue; 889 890 temp = 0; 891 ret = -EINVAL; 892 sg_init_table(sg, template[i].np); 893 for (k = 0; k < template[i].np; k++) { 894 if (WARN_ON(offset_in_page(IDX[k]) + 895 template[i].tap[k] > PAGE_SIZE)) 896 goto out; 897 898 q = xbuf[IDX[k] >> PAGE_SHIFT] + 899 offset_in_page(IDX[k]); 900 901 memcpy(q, template[i].input + temp, 902 template[i].tap[k]); 903 904 if (offset_in_page(q) + template[i].tap[k] < 905 PAGE_SIZE) 906 q[template[i].tap[k]] = 0; 907 908 sg_set_buf(&sg[k], q, template[i].tap[k]); 909 910 temp += template[i].tap[k]; 911 } 912 913 ablkcipher_request_set_crypt(req, sg, sg, 914 template[i].ilen, iv); 915 916 ret = enc ? 917 crypto_ablkcipher_encrypt(req) : 918 crypto_ablkcipher_decrypt(req); 919 920 switch (ret) { 921 case 0: 922 break; 923 case -EINPROGRESS: 924 case -EBUSY: 925 ret = wait_for_completion_interruptible( 926 &result.completion); 927 if (!ret && !((ret = result.err))) { 928 INIT_COMPLETION(result.completion); 929 break; 930 } 931 /* fall through */ 932 default: 933 printk(KERN_ERR "alg: skcipher: %s failed on " 934 "chunk test %d for %s: ret=%d\n", e, j, 935 algo, -ret); 936 goto out; 937 } 938 939 temp = 0; 940 ret = -EINVAL; 941 for (k = 0; k < template[i].np; k++) { 942 q = xbuf[IDX[k] >> PAGE_SHIFT] + 943 offset_in_page(IDX[k]); 944 945 if (memcmp(q, template[i].result + temp, 946 template[i].tap[k])) { 947 printk(KERN_ERR "alg: skcipher: Chunk " 948 "test %d failed on %s at page " 949 "%u for %s\n", j, e, k, algo); 950 hexdump(q, template[i].tap[k]); 951 goto out; 952 } 953 954 q += template[i].tap[k]; 955 for (n = 0; offset_in_page(q + n) && q[n]; n++) 956 ; 957 if (n) { 958 printk(KERN_ERR "alg: skcipher: " 959 "Result buffer corruption in " 960 "chunk test %d on %s at page " 961 "%u for %s: %u bytes:\n", j, e, 962 k, algo, n); 963 hexdump(q, n); 964 goto out; 965 } 966 temp += template[i].tap[k]; 967 } 968 } 969 } 970 971 ret = 0; 972 973 out: 974 ablkcipher_request_free(req); 975 testmgr_free_buf(xbuf); 976 out_nobuf: 977 return ret; 978 } 979 980 static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate, 981 struct comp_testvec *dtemplate, int ctcount, int dtcount) 982 { 983 const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm)); 984 unsigned int i; 985 char result[COMP_BUF_SIZE]; 986 int ret; 987 988 for (i = 0; i < ctcount; i++) { 989 int ilen; 990 unsigned int dlen = COMP_BUF_SIZE; 991 992 memset(result, 0, sizeof (result)); 993 994 ilen = ctemplate[i].inlen; 995 ret = crypto_comp_compress(tfm, ctemplate[i].input, 996 ilen, result, &dlen); 997 if (ret) { 998 printk(KERN_ERR "alg: comp: compression failed " 999 "on test %d for %s: ret=%d\n", i + 1, algo, 1000 -ret); 1001 goto out; 1002 } 1003 1004 if (dlen != ctemplate[i].outlen) { 1005 printk(KERN_ERR "alg: comp: Compression test %d " 1006 "failed for %s: output len = %d\n", i + 1, algo, 1007 dlen); 1008 ret = -EINVAL; 1009 goto out; 1010 } 1011 1012 if (memcmp(result, ctemplate[i].output, dlen)) { 1013 printk(KERN_ERR "alg: comp: Compression test %d " 1014 "failed for %s\n", i + 1, algo); 1015 hexdump(result, dlen); 1016 ret = -EINVAL; 1017 goto out; 1018 } 1019 } 1020 1021 for (i = 0; i < dtcount; i++) { 1022 int ilen; 1023 unsigned int dlen = COMP_BUF_SIZE; 1024 1025 memset(result, 0, sizeof (result)); 1026 1027 ilen = dtemplate[i].inlen; 1028 ret = crypto_comp_decompress(tfm, dtemplate[i].input, 1029 ilen, result, &dlen); 1030 if (ret) { 1031 printk(KERN_ERR "alg: comp: decompression failed " 1032 "on test %d for %s: ret=%d\n", i + 1, algo, 1033 -ret); 1034 goto out; 1035 } 1036 1037 if (dlen != dtemplate[i].outlen) { 1038 printk(KERN_ERR "alg: comp: Decompression test %d " 1039 "failed for %s: output len = %d\n", i + 1, algo, 1040 dlen); 1041 ret = -EINVAL; 1042 goto out; 1043 } 1044 1045 if (memcmp(result, dtemplate[i].output, dlen)) { 1046 printk(KERN_ERR "alg: comp: Decompression test %d " 1047 "failed for %s\n", i + 1, algo); 1048 hexdump(result, dlen); 1049 ret = -EINVAL; 1050 goto out; 1051 } 1052 } 1053 1054 ret = 0; 1055 1056 out: 1057 return ret; 1058 } 1059 1060 static int test_pcomp(struct crypto_pcomp *tfm, 1061 struct pcomp_testvec *ctemplate, 1062 struct pcomp_testvec *dtemplate, int ctcount, 1063 int dtcount) 1064 { 1065 const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm)); 1066 unsigned int i; 1067 char result[COMP_BUF_SIZE]; 1068 int res; 1069 1070 for (i = 0; i < ctcount; i++) { 1071 struct comp_request req; 1072 unsigned int produced = 0; 1073 1074 res = crypto_compress_setup(tfm, ctemplate[i].params, 1075 ctemplate[i].paramsize); 1076 if (res) { 1077 pr_err("alg: pcomp: compression setup failed on test " 1078 "%d for %s: error=%d\n", i + 1, algo, res); 1079 return res; 1080 } 1081 1082 res = crypto_compress_init(tfm); 1083 if (res) { 1084 pr_err("alg: pcomp: compression init failed on test " 1085 "%d for %s: error=%d\n", i + 1, algo, res); 1086 return res; 1087 } 1088 1089 memset(result, 0, sizeof(result)); 1090 1091 req.next_in = ctemplate[i].input; 1092 req.avail_in = ctemplate[i].inlen / 2; 1093 req.next_out = result; 1094 req.avail_out = ctemplate[i].outlen / 2; 1095 1096 res = crypto_compress_update(tfm, &req); 1097 if (res < 0 && (res != -EAGAIN || req.avail_in)) { 1098 pr_err("alg: pcomp: compression update failed on test " 1099 "%d for %s: error=%d\n", i + 1, algo, res); 1100 return res; 1101 } 1102 if (res > 0) 1103 produced += res; 1104 1105 /* Add remaining input data */ 1106 req.avail_in += (ctemplate[i].inlen + 1) / 2; 1107 1108 res = crypto_compress_update(tfm, &req); 1109 if (res < 0 && (res != -EAGAIN || req.avail_in)) { 1110 pr_err("alg: pcomp: compression update failed on test " 1111 "%d for %s: error=%d\n", i + 1, algo, res); 1112 return res; 1113 } 1114 if (res > 0) 1115 produced += res; 1116 1117 /* Provide remaining output space */ 1118 req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2; 1119 1120 res = crypto_compress_final(tfm, &req); 1121 if (res < 0) { 1122 pr_err("alg: pcomp: compression final failed on test " 1123 "%d for %s: error=%d\n", i + 1, algo, res); 1124 return res; 1125 } 1126 produced += res; 1127 1128 if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) { 1129 pr_err("alg: comp: Compression test %d failed for %s: " 1130 "output len = %d (expected %d)\n", i + 1, algo, 1131 COMP_BUF_SIZE - req.avail_out, 1132 ctemplate[i].outlen); 1133 return -EINVAL; 1134 } 1135 1136 if (produced != ctemplate[i].outlen) { 1137 pr_err("alg: comp: Compression test %d failed for %s: " 1138 "returned len = %u (expected %d)\n", i + 1, 1139 algo, produced, ctemplate[i].outlen); 1140 return -EINVAL; 1141 } 1142 1143 if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) { 1144 pr_err("alg: pcomp: Compression test %d failed for " 1145 "%s\n", i + 1, algo); 1146 hexdump(result, ctemplate[i].outlen); 1147 return -EINVAL; 1148 } 1149 } 1150 1151 for (i = 0; i < dtcount; i++) { 1152 struct comp_request req; 1153 unsigned int produced = 0; 1154 1155 res = crypto_decompress_setup(tfm, dtemplate[i].params, 1156 dtemplate[i].paramsize); 1157 if (res) { 1158 pr_err("alg: pcomp: decompression setup failed on " 1159 "test %d for %s: error=%d\n", i + 1, algo, res); 1160 return res; 1161 } 1162 1163 res = crypto_decompress_init(tfm); 1164 if (res) { 1165 pr_err("alg: pcomp: decompression init failed on test " 1166 "%d for %s: error=%d\n", i + 1, algo, res); 1167 return res; 1168 } 1169 1170 memset(result, 0, sizeof(result)); 1171 1172 req.next_in = dtemplate[i].input; 1173 req.avail_in = dtemplate[i].inlen / 2; 1174 req.next_out = result; 1175 req.avail_out = dtemplate[i].outlen / 2; 1176 1177 res = crypto_decompress_update(tfm, &req); 1178 if (res < 0 && (res != -EAGAIN || req.avail_in)) { 1179 pr_err("alg: pcomp: decompression update failed on " 1180 "test %d for %s: error=%d\n", i + 1, algo, res); 1181 return res; 1182 } 1183 if (res > 0) 1184 produced += res; 1185 1186 /* Add remaining input data */ 1187 req.avail_in += (dtemplate[i].inlen + 1) / 2; 1188 1189 res = crypto_decompress_update(tfm, &req); 1190 if (res < 0 && (res != -EAGAIN || req.avail_in)) { 1191 pr_err("alg: pcomp: decompression update failed on " 1192 "test %d for %s: error=%d\n", i + 1, algo, res); 1193 return res; 1194 } 1195 if (res > 0) 1196 produced += res; 1197 1198 /* Provide remaining output space */ 1199 req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2; 1200 1201 res = crypto_decompress_final(tfm, &req); 1202 if (res < 0 && (res != -EAGAIN || req.avail_in)) { 1203 pr_err("alg: pcomp: decompression final failed on " 1204 "test %d for %s: error=%d\n", i + 1, algo, res); 1205 return res; 1206 } 1207 if (res > 0) 1208 produced += res; 1209 1210 if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) { 1211 pr_err("alg: comp: Decompression test %d failed for " 1212 "%s: output len = %d (expected %d)\n", i + 1, 1213 algo, COMP_BUF_SIZE - req.avail_out, 1214 dtemplate[i].outlen); 1215 return -EINVAL; 1216 } 1217 1218 if (produced != dtemplate[i].outlen) { 1219 pr_err("alg: comp: Decompression test %d failed for " 1220 "%s: returned len = %u (expected %d)\n", i + 1, 1221 algo, produced, dtemplate[i].outlen); 1222 return -EINVAL; 1223 } 1224 1225 if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) { 1226 pr_err("alg: pcomp: Decompression test %d failed for " 1227 "%s\n", i + 1, algo); 1228 hexdump(result, dtemplate[i].outlen); 1229 return -EINVAL; 1230 } 1231 } 1232 1233 return 0; 1234 } 1235 1236 1237 static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template, 1238 unsigned int tcount) 1239 { 1240 const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm)); 1241 int err = 0, i, j, seedsize; 1242 u8 *seed; 1243 char result[32]; 1244 1245 seedsize = crypto_rng_seedsize(tfm); 1246 1247 seed = kmalloc(seedsize, GFP_KERNEL); 1248 if (!seed) { 1249 printk(KERN_ERR "alg: cprng: Failed to allocate seed space " 1250 "for %s\n", algo); 1251 return -ENOMEM; 1252 } 1253 1254 for (i = 0; i < tcount; i++) { 1255 memset(result, 0, 32); 1256 1257 memcpy(seed, template[i].v, template[i].vlen); 1258 memcpy(seed + template[i].vlen, template[i].key, 1259 template[i].klen); 1260 memcpy(seed + template[i].vlen + template[i].klen, 1261 template[i].dt, template[i].dtlen); 1262 1263 err = crypto_rng_reset(tfm, seed, seedsize); 1264 if (err) { 1265 printk(KERN_ERR "alg: cprng: Failed to reset rng " 1266 "for %s\n", algo); 1267 goto out; 1268 } 1269 1270 for (j = 0; j < template[i].loops; j++) { 1271 err = crypto_rng_get_bytes(tfm, result, 1272 template[i].rlen); 1273 if (err != template[i].rlen) { 1274 printk(KERN_ERR "alg: cprng: Failed to obtain " 1275 "the correct amount of random data for " 1276 "%s (requested %d, got %d)\n", algo, 1277 template[i].rlen, err); 1278 goto out; 1279 } 1280 } 1281 1282 err = memcmp(result, template[i].result, 1283 template[i].rlen); 1284 if (err) { 1285 printk(KERN_ERR "alg: cprng: Test %d failed for %s\n", 1286 i, algo); 1287 hexdump(result, template[i].rlen); 1288 err = -EINVAL; 1289 goto out; 1290 } 1291 } 1292 1293 out: 1294 kfree(seed); 1295 return err; 1296 } 1297 1298 static int alg_test_aead(const struct alg_test_desc *desc, const char *driver, 1299 u32 type, u32 mask) 1300 { 1301 struct crypto_aead *tfm; 1302 int err = 0; 1303 1304 tfm = crypto_alloc_aead(driver, type, mask); 1305 if (IS_ERR(tfm)) { 1306 printk(KERN_ERR "alg: aead: Failed to load transform for %s: " 1307 "%ld\n", driver, PTR_ERR(tfm)); 1308 return PTR_ERR(tfm); 1309 } 1310 1311 if (desc->suite.aead.enc.vecs) { 1312 err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs, 1313 desc->suite.aead.enc.count); 1314 if (err) 1315 goto out; 1316 } 1317 1318 if (!err && desc->suite.aead.dec.vecs) 1319 err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs, 1320 desc->suite.aead.dec.count); 1321 1322 out: 1323 crypto_free_aead(tfm); 1324 return err; 1325 } 1326 1327 static int alg_test_cipher(const struct alg_test_desc *desc, 1328 const char *driver, u32 type, u32 mask) 1329 { 1330 struct crypto_cipher *tfm; 1331 int err = 0; 1332 1333 tfm = crypto_alloc_cipher(driver, type, mask); 1334 if (IS_ERR(tfm)) { 1335 printk(KERN_ERR "alg: cipher: Failed to load transform for " 1336 "%s: %ld\n", driver, PTR_ERR(tfm)); 1337 return PTR_ERR(tfm); 1338 } 1339 1340 if (desc->suite.cipher.enc.vecs) { 1341 err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 1342 desc->suite.cipher.enc.count); 1343 if (err) 1344 goto out; 1345 } 1346 1347 if (desc->suite.cipher.dec.vecs) 1348 err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 1349 desc->suite.cipher.dec.count); 1350 1351 out: 1352 crypto_free_cipher(tfm); 1353 return err; 1354 } 1355 1356 static int alg_test_skcipher(const struct alg_test_desc *desc, 1357 const char *driver, u32 type, u32 mask) 1358 { 1359 struct crypto_ablkcipher *tfm; 1360 int err = 0; 1361 1362 tfm = crypto_alloc_ablkcipher(driver, type, mask); 1363 if (IS_ERR(tfm)) { 1364 printk(KERN_ERR "alg: skcipher: Failed to load transform for " 1365 "%s: %ld\n", driver, PTR_ERR(tfm)); 1366 return PTR_ERR(tfm); 1367 } 1368 1369 if (desc->suite.cipher.enc.vecs) { 1370 err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs, 1371 desc->suite.cipher.enc.count); 1372 if (err) 1373 goto out; 1374 } 1375 1376 if (desc->suite.cipher.dec.vecs) 1377 err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs, 1378 desc->suite.cipher.dec.count); 1379 1380 out: 1381 crypto_free_ablkcipher(tfm); 1382 return err; 1383 } 1384 1385 static int alg_test_comp(const struct alg_test_desc *desc, const char *driver, 1386 u32 type, u32 mask) 1387 { 1388 struct crypto_comp *tfm; 1389 int err; 1390 1391 tfm = crypto_alloc_comp(driver, type, mask); 1392 if (IS_ERR(tfm)) { 1393 printk(KERN_ERR "alg: comp: Failed to load transform for %s: " 1394 "%ld\n", driver, PTR_ERR(tfm)); 1395 return PTR_ERR(tfm); 1396 } 1397 1398 err = test_comp(tfm, desc->suite.comp.comp.vecs, 1399 desc->suite.comp.decomp.vecs, 1400 desc->suite.comp.comp.count, 1401 desc->suite.comp.decomp.count); 1402 1403 crypto_free_comp(tfm); 1404 return err; 1405 } 1406 1407 static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver, 1408 u32 type, u32 mask) 1409 { 1410 struct crypto_pcomp *tfm; 1411 int err; 1412 1413 tfm = crypto_alloc_pcomp(driver, type, mask); 1414 if (IS_ERR(tfm)) { 1415 pr_err("alg: pcomp: Failed to load transform for %s: %ld\n", 1416 driver, PTR_ERR(tfm)); 1417 return PTR_ERR(tfm); 1418 } 1419 1420 err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs, 1421 desc->suite.pcomp.decomp.vecs, 1422 desc->suite.pcomp.comp.count, 1423 desc->suite.pcomp.decomp.count); 1424 1425 crypto_free_pcomp(tfm); 1426 return err; 1427 } 1428 1429 static int alg_test_hash(const struct alg_test_desc *desc, const char *driver, 1430 u32 type, u32 mask) 1431 { 1432 struct crypto_ahash *tfm; 1433 int err; 1434 1435 tfm = crypto_alloc_ahash(driver, type, mask); 1436 if (IS_ERR(tfm)) { 1437 printk(KERN_ERR "alg: hash: Failed to load transform for %s: " 1438 "%ld\n", driver, PTR_ERR(tfm)); 1439 return PTR_ERR(tfm); 1440 } 1441 1442 err = test_hash(tfm, desc->suite.hash.vecs, 1443 desc->suite.hash.count, true); 1444 if (!err) 1445 err = test_hash(tfm, desc->suite.hash.vecs, 1446 desc->suite.hash.count, false); 1447 1448 crypto_free_ahash(tfm); 1449 return err; 1450 } 1451 1452 static int alg_test_crc32c(const struct alg_test_desc *desc, 1453 const char *driver, u32 type, u32 mask) 1454 { 1455 struct crypto_shash *tfm; 1456 u32 val; 1457 int err; 1458 1459 err = alg_test_hash(desc, driver, type, mask); 1460 if (err) 1461 goto out; 1462 1463 tfm = crypto_alloc_shash(driver, type, mask); 1464 if (IS_ERR(tfm)) { 1465 printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: " 1466 "%ld\n", driver, PTR_ERR(tfm)); 1467 err = PTR_ERR(tfm); 1468 goto out; 1469 } 1470 1471 do { 1472 struct { 1473 struct shash_desc shash; 1474 char ctx[crypto_shash_descsize(tfm)]; 1475 } sdesc; 1476 1477 sdesc.shash.tfm = tfm; 1478 sdesc.shash.flags = 0; 1479 1480 *(u32 *)sdesc.ctx = le32_to_cpu(420553207); 1481 err = crypto_shash_final(&sdesc.shash, (u8 *)&val); 1482 if (err) { 1483 printk(KERN_ERR "alg: crc32c: Operation failed for " 1484 "%s: %d\n", driver, err); 1485 break; 1486 } 1487 1488 if (val != ~420553207) { 1489 printk(KERN_ERR "alg: crc32c: Test failed for %s: " 1490 "%d\n", driver, val); 1491 err = -EINVAL; 1492 } 1493 } while (0); 1494 1495 crypto_free_shash(tfm); 1496 1497 out: 1498 return err; 1499 } 1500 1501 static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver, 1502 u32 type, u32 mask) 1503 { 1504 struct crypto_rng *rng; 1505 int err; 1506 1507 rng = crypto_alloc_rng(driver, type, mask); 1508 if (IS_ERR(rng)) { 1509 printk(KERN_ERR "alg: cprng: Failed to load transform for %s: " 1510 "%ld\n", driver, PTR_ERR(rng)); 1511 return PTR_ERR(rng); 1512 } 1513 1514 err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count); 1515 1516 crypto_free_rng(rng); 1517 1518 return err; 1519 } 1520 1521 static int alg_test_null(const struct alg_test_desc *desc, 1522 const char *driver, u32 type, u32 mask) 1523 { 1524 return 0; 1525 } 1526 1527 /* Please keep this list sorted by algorithm name. */ 1528 static const struct alg_test_desc alg_test_descs[] = { 1529 { 1530 .alg = "__driver-cbc-aes-aesni", 1531 .test = alg_test_null, 1532 .suite = { 1533 .cipher = { 1534 .enc = { 1535 .vecs = NULL, 1536 .count = 0 1537 }, 1538 .dec = { 1539 .vecs = NULL, 1540 .count = 0 1541 } 1542 } 1543 } 1544 }, { 1545 .alg = "__driver-ecb-aes-aesni", 1546 .test = alg_test_null, 1547 .suite = { 1548 .cipher = { 1549 .enc = { 1550 .vecs = NULL, 1551 .count = 0 1552 }, 1553 .dec = { 1554 .vecs = NULL, 1555 .count = 0 1556 } 1557 } 1558 } 1559 }, { 1560 .alg = "__ghash-pclmulqdqni", 1561 .test = alg_test_null, 1562 .suite = { 1563 .hash = { 1564 .vecs = NULL, 1565 .count = 0 1566 } 1567 } 1568 }, { 1569 .alg = "ansi_cprng", 1570 .test = alg_test_cprng, 1571 .fips_allowed = 1, 1572 .suite = { 1573 .cprng = { 1574 .vecs = ansi_cprng_aes_tv_template, 1575 .count = ANSI_CPRNG_AES_TEST_VECTORS 1576 } 1577 } 1578 }, { 1579 .alg = "cbc(aes)", 1580 .test = alg_test_skcipher, 1581 .fips_allowed = 1, 1582 .suite = { 1583 .cipher = { 1584 .enc = { 1585 .vecs = aes_cbc_enc_tv_template, 1586 .count = AES_CBC_ENC_TEST_VECTORS 1587 }, 1588 .dec = { 1589 .vecs = aes_cbc_dec_tv_template, 1590 .count = AES_CBC_DEC_TEST_VECTORS 1591 } 1592 } 1593 } 1594 }, { 1595 .alg = "cbc(anubis)", 1596 .test = alg_test_skcipher, 1597 .suite = { 1598 .cipher = { 1599 .enc = { 1600 .vecs = anubis_cbc_enc_tv_template, 1601 .count = ANUBIS_CBC_ENC_TEST_VECTORS 1602 }, 1603 .dec = { 1604 .vecs = anubis_cbc_dec_tv_template, 1605 .count = ANUBIS_CBC_DEC_TEST_VECTORS 1606 } 1607 } 1608 } 1609 }, { 1610 .alg = "cbc(blowfish)", 1611 .test = alg_test_skcipher, 1612 .suite = { 1613 .cipher = { 1614 .enc = { 1615 .vecs = bf_cbc_enc_tv_template, 1616 .count = BF_CBC_ENC_TEST_VECTORS 1617 }, 1618 .dec = { 1619 .vecs = bf_cbc_dec_tv_template, 1620 .count = BF_CBC_DEC_TEST_VECTORS 1621 } 1622 } 1623 } 1624 }, { 1625 .alg = "cbc(camellia)", 1626 .test = alg_test_skcipher, 1627 .suite = { 1628 .cipher = { 1629 .enc = { 1630 .vecs = camellia_cbc_enc_tv_template, 1631 .count = CAMELLIA_CBC_ENC_TEST_VECTORS 1632 }, 1633 .dec = { 1634 .vecs = camellia_cbc_dec_tv_template, 1635 .count = CAMELLIA_CBC_DEC_TEST_VECTORS 1636 } 1637 } 1638 } 1639 }, { 1640 .alg = "cbc(des)", 1641 .test = alg_test_skcipher, 1642 .suite = { 1643 .cipher = { 1644 .enc = { 1645 .vecs = des_cbc_enc_tv_template, 1646 .count = DES_CBC_ENC_TEST_VECTORS 1647 }, 1648 .dec = { 1649 .vecs = des_cbc_dec_tv_template, 1650 .count = DES_CBC_DEC_TEST_VECTORS 1651 } 1652 } 1653 } 1654 }, { 1655 .alg = "cbc(des3_ede)", 1656 .test = alg_test_skcipher, 1657 .fips_allowed = 1, 1658 .suite = { 1659 .cipher = { 1660 .enc = { 1661 .vecs = des3_ede_cbc_enc_tv_template, 1662 .count = DES3_EDE_CBC_ENC_TEST_VECTORS 1663 }, 1664 .dec = { 1665 .vecs = des3_ede_cbc_dec_tv_template, 1666 .count = DES3_EDE_CBC_DEC_TEST_VECTORS 1667 } 1668 } 1669 } 1670 }, { 1671 .alg = "cbc(twofish)", 1672 .test = alg_test_skcipher, 1673 .suite = { 1674 .cipher = { 1675 .enc = { 1676 .vecs = tf_cbc_enc_tv_template, 1677 .count = TF_CBC_ENC_TEST_VECTORS 1678 }, 1679 .dec = { 1680 .vecs = tf_cbc_dec_tv_template, 1681 .count = TF_CBC_DEC_TEST_VECTORS 1682 } 1683 } 1684 } 1685 }, { 1686 .alg = "ccm(aes)", 1687 .test = alg_test_aead, 1688 .fips_allowed = 1, 1689 .suite = { 1690 .aead = { 1691 .enc = { 1692 .vecs = aes_ccm_enc_tv_template, 1693 .count = AES_CCM_ENC_TEST_VECTORS 1694 }, 1695 .dec = { 1696 .vecs = aes_ccm_dec_tv_template, 1697 .count = AES_CCM_DEC_TEST_VECTORS 1698 } 1699 } 1700 } 1701 }, { 1702 .alg = "crc32c", 1703 .test = alg_test_crc32c, 1704 .fips_allowed = 1, 1705 .suite = { 1706 .hash = { 1707 .vecs = crc32c_tv_template, 1708 .count = CRC32C_TEST_VECTORS 1709 } 1710 } 1711 }, { 1712 .alg = "cryptd(__driver-ecb-aes-aesni)", 1713 .test = alg_test_null, 1714 .suite = { 1715 .cipher = { 1716 .enc = { 1717 .vecs = NULL, 1718 .count = 0 1719 }, 1720 .dec = { 1721 .vecs = NULL, 1722 .count = 0 1723 } 1724 } 1725 } 1726 }, { 1727 .alg = "cryptd(__ghash-pclmulqdqni)", 1728 .test = alg_test_null, 1729 .suite = { 1730 .hash = { 1731 .vecs = NULL, 1732 .count = 0 1733 } 1734 } 1735 }, { 1736 .alg = "ctr(aes)", 1737 .test = alg_test_skcipher, 1738 .fips_allowed = 1, 1739 .suite = { 1740 .cipher = { 1741 .enc = { 1742 .vecs = aes_ctr_enc_tv_template, 1743 .count = AES_CTR_ENC_TEST_VECTORS 1744 }, 1745 .dec = { 1746 .vecs = aes_ctr_dec_tv_template, 1747 .count = AES_CTR_DEC_TEST_VECTORS 1748 } 1749 } 1750 } 1751 }, { 1752 .alg = "cts(cbc(aes))", 1753 .test = alg_test_skcipher, 1754 .suite = { 1755 .cipher = { 1756 .enc = { 1757 .vecs = cts_mode_enc_tv_template, 1758 .count = CTS_MODE_ENC_TEST_VECTORS 1759 }, 1760 .dec = { 1761 .vecs = cts_mode_dec_tv_template, 1762 .count = CTS_MODE_DEC_TEST_VECTORS 1763 } 1764 } 1765 } 1766 }, { 1767 .alg = "deflate", 1768 .test = alg_test_comp, 1769 .suite = { 1770 .comp = { 1771 .comp = { 1772 .vecs = deflate_comp_tv_template, 1773 .count = DEFLATE_COMP_TEST_VECTORS 1774 }, 1775 .decomp = { 1776 .vecs = deflate_decomp_tv_template, 1777 .count = DEFLATE_DECOMP_TEST_VECTORS 1778 } 1779 } 1780 } 1781 }, { 1782 .alg = "ecb(__aes-aesni)", 1783 .test = alg_test_null, 1784 .suite = { 1785 .cipher = { 1786 .enc = { 1787 .vecs = NULL, 1788 .count = 0 1789 }, 1790 .dec = { 1791 .vecs = NULL, 1792 .count = 0 1793 } 1794 } 1795 } 1796 }, { 1797 .alg = "ecb(aes)", 1798 .test = alg_test_skcipher, 1799 .fips_allowed = 1, 1800 .suite = { 1801 .cipher = { 1802 .enc = { 1803 .vecs = aes_enc_tv_template, 1804 .count = AES_ENC_TEST_VECTORS 1805 }, 1806 .dec = { 1807 .vecs = aes_dec_tv_template, 1808 .count = AES_DEC_TEST_VECTORS 1809 } 1810 } 1811 } 1812 }, { 1813 .alg = "ecb(anubis)", 1814 .test = alg_test_skcipher, 1815 .suite = { 1816 .cipher = { 1817 .enc = { 1818 .vecs = anubis_enc_tv_template, 1819 .count = ANUBIS_ENC_TEST_VECTORS 1820 }, 1821 .dec = { 1822 .vecs = anubis_dec_tv_template, 1823 .count = ANUBIS_DEC_TEST_VECTORS 1824 } 1825 } 1826 } 1827 }, { 1828 .alg = "ecb(arc4)", 1829 .test = alg_test_skcipher, 1830 .suite = { 1831 .cipher = { 1832 .enc = { 1833 .vecs = arc4_enc_tv_template, 1834 .count = ARC4_ENC_TEST_VECTORS 1835 }, 1836 .dec = { 1837 .vecs = arc4_dec_tv_template, 1838 .count = ARC4_DEC_TEST_VECTORS 1839 } 1840 } 1841 } 1842 }, { 1843 .alg = "ecb(blowfish)", 1844 .test = alg_test_skcipher, 1845 .suite = { 1846 .cipher = { 1847 .enc = { 1848 .vecs = bf_enc_tv_template, 1849 .count = BF_ENC_TEST_VECTORS 1850 }, 1851 .dec = { 1852 .vecs = bf_dec_tv_template, 1853 .count = BF_DEC_TEST_VECTORS 1854 } 1855 } 1856 } 1857 }, { 1858 .alg = "ecb(camellia)", 1859 .test = alg_test_skcipher, 1860 .suite = { 1861 .cipher = { 1862 .enc = { 1863 .vecs = camellia_enc_tv_template, 1864 .count = CAMELLIA_ENC_TEST_VECTORS 1865 }, 1866 .dec = { 1867 .vecs = camellia_dec_tv_template, 1868 .count = CAMELLIA_DEC_TEST_VECTORS 1869 } 1870 } 1871 } 1872 }, { 1873 .alg = "ecb(cast5)", 1874 .test = alg_test_skcipher, 1875 .suite = { 1876 .cipher = { 1877 .enc = { 1878 .vecs = cast5_enc_tv_template, 1879 .count = CAST5_ENC_TEST_VECTORS 1880 }, 1881 .dec = { 1882 .vecs = cast5_dec_tv_template, 1883 .count = CAST5_DEC_TEST_VECTORS 1884 } 1885 } 1886 } 1887 }, { 1888 .alg = "ecb(cast6)", 1889 .test = alg_test_skcipher, 1890 .suite = { 1891 .cipher = { 1892 .enc = { 1893 .vecs = cast6_enc_tv_template, 1894 .count = CAST6_ENC_TEST_VECTORS 1895 }, 1896 .dec = { 1897 .vecs = cast6_dec_tv_template, 1898 .count = CAST6_DEC_TEST_VECTORS 1899 } 1900 } 1901 } 1902 }, { 1903 .alg = "ecb(des)", 1904 .test = alg_test_skcipher, 1905 .fips_allowed = 1, 1906 .suite = { 1907 .cipher = { 1908 .enc = { 1909 .vecs = des_enc_tv_template, 1910 .count = DES_ENC_TEST_VECTORS 1911 }, 1912 .dec = { 1913 .vecs = des_dec_tv_template, 1914 .count = DES_DEC_TEST_VECTORS 1915 } 1916 } 1917 } 1918 }, { 1919 .alg = "ecb(des3_ede)", 1920 .test = alg_test_skcipher, 1921 .fips_allowed = 1, 1922 .suite = { 1923 .cipher = { 1924 .enc = { 1925 .vecs = des3_ede_enc_tv_template, 1926 .count = DES3_EDE_ENC_TEST_VECTORS 1927 }, 1928 .dec = { 1929 .vecs = des3_ede_dec_tv_template, 1930 .count = DES3_EDE_DEC_TEST_VECTORS 1931 } 1932 } 1933 } 1934 }, { 1935 .alg = "ecb(khazad)", 1936 .test = alg_test_skcipher, 1937 .suite = { 1938 .cipher = { 1939 .enc = { 1940 .vecs = khazad_enc_tv_template, 1941 .count = KHAZAD_ENC_TEST_VECTORS 1942 }, 1943 .dec = { 1944 .vecs = khazad_dec_tv_template, 1945 .count = KHAZAD_DEC_TEST_VECTORS 1946 } 1947 } 1948 } 1949 }, { 1950 .alg = "ecb(seed)", 1951 .test = alg_test_skcipher, 1952 .suite = { 1953 .cipher = { 1954 .enc = { 1955 .vecs = seed_enc_tv_template, 1956 .count = SEED_ENC_TEST_VECTORS 1957 }, 1958 .dec = { 1959 .vecs = seed_dec_tv_template, 1960 .count = SEED_DEC_TEST_VECTORS 1961 } 1962 } 1963 } 1964 }, { 1965 .alg = "ecb(serpent)", 1966 .test = alg_test_skcipher, 1967 .suite = { 1968 .cipher = { 1969 .enc = { 1970 .vecs = serpent_enc_tv_template, 1971 .count = SERPENT_ENC_TEST_VECTORS 1972 }, 1973 .dec = { 1974 .vecs = serpent_dec_tv_template, 1975 .count = SERPENT_DEC_TEST_VECTORS 1976 } 1977 } 1978 } 1979 }, { 1980 .alg = "ecb(tea)", 1981 .test = alg_test_skcipher, 1982 .suite = { 1983 .cipher = { 1984 .enc = { 1985 .vecs = tea_enc_tv_template, 1986 .count = TEA_ENC_TEST_VECTORS 1987 }, 1988 .dec = { 1989 .vecs = tea_dec_tv_template, 1990 .count = TEA_DEC_TEST_VECTORS 1991 } 1992 } 1993 } 1994 }, { 1995 .alg = "ecb(tnepres)", 1996 .test = alg_test_skcipher, 1997 .suite = { 1998 .cipher = { 1999 .enc = { 2000 .vecs = tnepres_enc_tv_template, 2001 .count = TNEPRES_ENC_TEST_VECTORS 2002 }, 2003 .dec = { 2004 .vecs = tnepres_dec_tv_template, 2005 .count = TNEPRES_DEC_TEST_VECTORS 2006 } 2007 } 2008 } 2009 }, { 2010 .alg = "ecb(twofish)", 2011 .test = alg_test_skcipher, 2012 .suite = { 2013 .cipher = { 2014 .enc = { 2015 .vecs = tf_enc_tv_template, 2016 .count = TF_ENC_TEST_VECTORS 2017 }, 2018 .dec = { 2019 .vecs = tf_dec_tv_template, 2020 .count = TF_DEC_TEST_VECTORS 2021 } 2022 } 2023 } 2024 }, { 2025 .alg = "ecb(xeta)", 2026 .test = alg_test_skcipher, 2027 .suite = { 2028 .cipher = { 2029 .enc = { 2030 .vecs = xeta_enc_tv_template, 2031 .count = XETA_ENC_TEST_VECTORS 2032 }, 2033 .dec = { 2034 .vecs = xeta_dec_tv_template, 2035 .count = XETA_DEC_TEST_VECTORS 2036 } 2037 } 2038 } 2039 }, { 2040 .alg = "ecb(xtea)", 2041 .test = alg_test_skcipher, 2042 .suite = { 2043 .cipher = { 2044 .enc = { 2045 .vecs = xtea_enc_tv_template, 2046 .count = XTEA_ENC_TEST_VECTORS 2047 }, 2048 .dec = { 2049 .vecs = xtea_dec_tv_template, 2050 .count = XTEA_DEC_TEST_VECTORS 2051 } 2052 } 2053 } 2054 }, { 2055 .alg = "gcm(aes)", 2056 .test = alg_test_aead, 2057 .fips_allowed = 1, 2058 .suite = { 2059 .aead = { 2060 .enc = { 2061 .vecs = aes_gcm_enc_tv_template, 2062 .count = AES_GCM_ENC_TEST_VECTORS 2063 }, 2064 .dec = { 2065 .vecs = aes_gcm_dec_tv_template, 2066 .count = AES_GCM_DEC_TEST_VECTORS 2067 } 2068 } 2069 } 2070 }, { 2071 .alg = "ghash", 2072 .test = alg_test_hash, 2073 .suite = { 2074 .hash = { 2075 .vecs = ghash_tv_template, 2076 .count = GHASH_TEST_VECTORS 2077 } 2078 } 2079 }, { 2080 .alg = "hmac(md5)", 2081 .test = alg_test_hash, 2082 .suite = { 2083 .hash = { 2084 .vecs = hmac_md5_tv_template, 2085 .count = HMAC_MD5_TEST_VECTORS 2086 } 2087 } 2088 }, { 2089 .alg = "hmac(rmd128)", 2090 .test = alg_test_hash, 2091 .suite = { 2092 .hash = { 2093 .vecs = hmac_rmd128_tv_template, 2094 .count = HMAC_RMD128_TEST_VECTORS 2095 } 2096 } 2097 }, { 2098 .alg = "hmac(rmd160)", 2099 .test = alg_test_hash, 2100 .suite = { 2101 .hash = { 2102 .vecs = hmac_rmd160_tv_template, 2103 .count = HMAC_RMD160_TEST_VECTORS 2104 } 2105 } 2106 }, { 2107 .alg = "hmac(sha1)", 2108 .test = alg_test_hash, 2109 .fips_allowed = 1, 2110 .suite = { 2111 .hash = { 2112 .vecs = hmac_sha1_tv_template, 2113 .count = HMAC_SHA1_TEST_VECTORS 2114 } 2115 } 2116 }, { 2117 .alg = "hmac(sha224)", 2118 .test = alg_test_hash, 2119 .fips_allowed = 1, 2120 .suite = { 2121 .hash = { 2122 .vecs = hmac_sha224_tv_template, 2123 .count = HMAC_SHA224_TEST_VECTORS 2124 } 2125 } 2126 }, { 2127 .alg = "hmac(sha256)", 2128 .test = alg_test_hash, 2129 .fips_allowed = 1, 2130 .suite = { 2131 .hash = { 2132 .vecs = hmac_sha256_tv_template, 2133 .count = HMAC_SHA256_TEST_VECTORS 2134 } 2135 } 2136 }, { 2137 .alg = "hmac(sha384)", 2138 .test = alg_test_hash, 2139 .fips_allowed = 1, 2140 .suite = { 2141 .hash = { 2142 .vecs = hmac_sha384_tv_template, 2143 .count = HMAC_SHA384_TEST_VECTORS 2144 } 2145 } 2146 }, { 2147 .alg = "hmac(sha512)", 2148 .test = alg_test_hash, 2149 .fips_allowed = 1, 2150 .suite = { 2151 .hash = { 2152 .vecs = hmac_sha512_tv_template, 2153 .count = HMAC_SHA512_TEST_VECTORS 2154 } 2155 } 2156 }, { 2157 .alg = "lrw(aes)", 2158 .test = alg_test_skcipher, 2159 .suite = { 2160 .cipher = { 2161 .enc = { 2162 .vecs = aes_lrw_enc_tv_template, 2163 .count = AES_LRW_ENC_TEST_VECTORS 2164 }, 2165 .dec = { 2166 .vecs = aes_lrw_dec_tv_template, 2167 .count = AES_LRW_DEC_TEST_VECTORS 2168 } 2169 } 2170 } 2171 }, { 2172 .alg = "lzo", 2173 .test = alg_test_comp, 2174 .suite = { 2175 .comp = { 2176 .comp = { 2177 .vecs = lzo_comp_tv_template, 2178 .count = LZO_COMP_TEST_VECTORS 2179 }, 2180 .decomp = { 2181 .vecs = lzo_decomp_tv_template, 2182 .count = LZO_DECOMP_TEST_VECTORS 2183 } 2184 } 2185 } 2186 }, { 2187 .alg = "md4", 2188 .test = alg_test_hash, 2189 .suite = { 2190 .hash = { 2191 .vecs = md4_tv_template, 2192 .count = MD4_TEST_VECTORS 2193 } 2194 } 2195 }, { 2196 .alg = "md5", 2197 .test = alg_test_hash, 2198 .suite = { 2199 .hash = { 2200 .vecs = md5_tv_template, 2201 .count = MD5_TEST_VECTORS 2202 } 2203 } 2204 }, { 2205 .alg = "michael_mic", 2206 .test = alg_test_hash, 2207 .suite = { 2208 .hash = { 2209 .vecs = michael_mic_tv_template, 2210 .count = MICHAEL_MIC_TEST_VECTORS 2211 } 2212 } 2213 }, { 2214 .alg = "pcbc(fcrypt)", 2215 .test = alg_test_skcipher, 2216 .suite = { 2217 .cipher = { 2218 .enc = { 2219 .vecs = fcrypt_pcbc_enc_tv_template, 2220 .count = FCRYPT_ENC_TEST_VECTORS 2221 }, 2222 .dec = { 2223 .vecs = fcrypt_pcbc_dec_tv_template, 2224 .count = FCRYPT_DEC_TEST_VECTORS 2225 } 2226 } 2227 } 2228 }, { 2229 .alg = "rfc3686(ctr(aes))", 2230 .test = alg_test_skcipher, 2231 .fips_allowed = 1, 2232 .suite = { 2233 .cipher = { 2234 .enc = { 2235 .vecs = aes_ctr_rfc3686_enc_tv_template, 2236 .count = AES_CTR_3686_ENC_TEST_VECTORS 2237 }, 2238 .dec = { 2239 .vecs = aes_ctr_rfc3686_dec_tv_template, 2240 .count = AES_CTR_3686_DEC_TEST_VECTORS 2241 } 2242 } 2243 } 2244 }, { 2245 .alg = "rfc4309(ccm(aes))", 2246 .test = alg_test_aead, 2247 .fips_allowed = 1, 2248 .suite = { 2249 .aead = { 2250 .enc = { 2251 .vecs = aes_ccm_rfc4309_enc_tv_template, 2252 .count = AES_CCM_4309_ENC_TEST_VECTORS 2253 }, 2254 .dec = { 2255 .vecs = aes_ccm_rfc4309_dec_tv_template, 2256 .count = AES_CCM_4309_DEC_TEST_VECTORS 2257 } 2258 } 2259 } 2260 }, { 2261 .alg = "rmd128", 2262 .test = alg_test_hash, 2263 .suite = { 2264 .hash = { 2265 .vecs = rmd128_tv_template, 2266 .count = RMD128_TEST_VECTORS 2267 } 2268 } 2269 }, { 2270 .alg = "rmd160", 2271 .test = alg_test_hash, 2272 .suite = { 2273 .hash = { 2274 .vecs = rmd160_tv_template, 2275 .count = RMD160_TEST_VECTORS 2276 } 2277 } 2278 }, { 2279 .alg = "rmd256", 2280 .test = alg_test_hash, 2281 .suite = { 2282 .hash = { 2283 .vecs = rmd256_tv_template, 2284 .count = RMD256_TEST_VECTORS 2285 } 2286 } 2287 }, { 2288 .alg = "rmd320", 2289 .test = alg_test_hash, 2290 .suite = { 2291 .hash = { 2292 .vecs = rmd320_tv_template, 2293 .count = RMD320_TEST_VECTORS 2294 } 2295 } 2296 }, { 2297 .alg = "salsa20", 2298 .test = alg_test_skcipher, 2299 .suite = { 2300 .cipher = { 2301 .enc = { 2302 .vecs = salsa20_stream_enc_tv_template, 2303 .count = SALSA20_STREAM_ENC_TEST_VECTORS 2304 } 2305 } 2306 } 2307 }, { 2308 .alg = "sha1", 2309 .test = alg_test_hash, 2310 .fips_allowed = 1, 2311 .suite = { 2312 .hash = { 2313 .vecs = sha1_tv_template, 2314 .count = SHA1_TEST_VECTORS 2315 } 2316 } 2317 }, { 2318 .alg = "sha224", 2319 .test = alg_test_hash, 2320 .fips_allowed = 1, 2321 .suite = { 2322 .hash = { 2323 .vecs = sha224_tv_template, 2324 .count = SHA224_TEST_VECTORS 2325 } 2326 } 2327 }, { 2328 .alg = "sha256", 2329 .test = alg_test_hash, 2330 .fips_allowed = 1, 2331 .suite = { 2332 .hash = { 2333 .vecs = sha256_tv_template, 2334 .count = SHA256_TEST_VECTORS 2335 } 2336 } 2337 }, { 2338 .alg = "sha384", 2339 .test = alg_test_hash, 2340 .fips_allowed = 1, 2341 .suite = { 2342 .hash = { 2343 .vecs = sha384_tv_template, 2344 .count = SHA384_TEST_VECTORS 2345 } 2346 } 2347 }, { 2348 .alg = "sha512", 2349 .test = alg_test_hash, 2350 .fips_allowed = 1, 2351 .suite = { 2352 .hash = { 2353 .vecs = sha512_tv_template, 2354 .count = SHA512_TEST_VECTORS 2355 } 2356 } 2357 }, { 2358 .alg = "tgr128", 2359 .test = alg_test_hash, 2360 .suite = { 2361 .hash = { 2362 .vecs = tgr128_tv_template, 2363 .count = TGR128_TEST_VECTORS 2364 } 2365 } 2366 }, { 2367 .alg = "tgr160", 2368 .test = alg_test_hash, 2369 .suite = { 2370 .hash = { 2371 .vecs = tgr160_tv_template, 2372 .count = TGR160_TEST_VECTORS 2373 } 2374 } 2375 }, { 2376 .alg = "tgr192", 2377 .test = alg_test_hash, 2378 .suite = { 2379 .hash = { 2380 .vecs = tgr192_tv_template, 2381 .count = TGR192_TEST_VECTORS 2382 } 2383 } 2384 }, { 2385 .alg = "vmac(aes)", 2386 .test = alg_test_hash, 2387 .suite = { 2388 .hash = { 2389 .vecs = aes_vmac128_tv_template, 2390 .count = VMAC_AES_TEST_VECTORS 2391 } 2392 } 2393 }, { 2394 .alg = "wp256", 2395 .test = alg_test_hash, 2396 .suite = { 2397 .hash = { 2398 .vecs = wp256_tv_template, 2399 .count = WP256_TEST_VECTORS 2400 } 2401 } 2402 }, { 2403 .alg = "wp384", 2404 .test = alg_test_hash, 2405 .suite = { 2406 .hash = { 2407 .vecs = wp384_tv_template, 2408 .count = WP384_TEST_VECTORS 2409 } 2410 } 2411 }, { 2412 .alg = "wp512", 2413 .test = alg_test_hash, 2414 .suite = { 2415 .hash = { 2416 .vecs = wp512_tv_template, 2417 .count = WP512_TEST_VECTORS 2418 } 2419 } 2420 }, { 2421 .alg = "xcbc(aes)", 2422 .test = alg_test_hash, 2423 .suite = { 2424 .hash = { 2425 .vecs = aes_xcbc128_tv_template, 2426 .count = XCBC_AES_TEST_VECTORS 2427 } 2428 } 2429 }, { 2430 .alg = "xts(aes)", 2431 .test = alg_test_skcipher, 2432 .suite = { 2433 .cipher = { 2434 .enc = { 2435 .vecs = aes_xts_enc_tv_template, 2436 .count = AES_XTS_ENC_TEST_VECTORS 2437 }, 2438 .dec = { 2439 .vecs = aes_xts_dec_tv_template, 2440 .count = AES_XTS_DEC_TEST_VECTORS 2441 } 2442 } 2443 } 2444 }, { 2445 .alg = "zlib", 2446 .test = alg_test_pcomp, 2447 .suite = { 2448 .pcomp = { 2449 .comp = { 2450 .vecs = zlib_comp_tv_template, 2451 .count = ZLIB_COMP_TEST_VECTORS 2452 }, 2453 .decomp = { 2454 .vecs = zlib_decomp_tv_template, 2455 .count = ZLIB_DECOMP_TEST_VECTORS 2456 } 2457 } 2458 } 2459 } 2460 }; 2461 2462 static int alg_find_test(const char *alg) 2463 { 2464 int start = 0; 2465 int end = ARRAY_SIZE(alg_test_descs); 2466 2467 while (start < end) { 2468 int i = (start + end) / 2; 2469 int diff = strcmp(alg_test_descs[i].alg, alg); 2470 2471 if (diff > 0) { 2472 end = i; 2473 continue; 2474 } 2475 2476 if (diff < 0) { 2477 start = i + 1; 2478 continue; 2479 } 2480 2481 return i; 2482 } 2483 2484 return -1; 2485 } 2486 2487 int alg_test(const char *driver, const char *alg, u32 type, u32 mask) 2488 { 2489 int i; 2490 int j; 2491 int rc; 2492 2493 if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) { 2494 char nalg[CRYPTO_MAX_ALG_NAME]; 2495 2496 if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >= 2497 sizeof(nalg)) 2498 return -ENAMETOOLONG; 2499 2500 i = alg_find_test(nalg); 2501 if (i < 0) 2502 goto notest; 2503 2504 if (fips_enabled && !alg_test_descs[i].fips_allowed) 2505 goto non_fips_alg; 2506 2507 rc = alg_test_cipher(alg_test_descs + i, driver, type, mask); 2508 goto test_done; 2509 } 2510 2511 i = alg_find_test(alg); 2512 j = alg_find_test(driver); 2513 if (i < 0 && j < 0) 2514 goto notest; 2515 2516 if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) || 2517 (j >= 0 && !alg_test_descs[j].fips_allowed))) 2518 goto non_fips_alg; 2519 2520 rc = 0; 2521 if (i >= 0) 2522 rc |= alg_test_descs[i].test(alg_test_descs + i, driver, 2523 type, mask); 2524 if (j >= 0) 2525 rc |= alg_test_descs[j].test(alg_test_descs + j, driver, 2526 type, mask); 2527 2528 test_done: 2529 if (fips_enabled && rc) 2530 panic("%s: %s alg self test failed in fips mode!\n", driver, alg); 2531 2532 if (fips_enabled && !rc) 2533 printk(KERN_INFO "alg: self-tests for %s (%s) passed\n", 2534 driver, alg); 2535 2536 return rc; 2537 2538 notest: 2539 printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver); 2540 return 0; 2541 non_fips_alg: 2542 return -EINVAL; 2543 } 2544 2545 #endif /* CONFIG_CRYPTO_MANAGER_TESTS */ 2546 2547 EXPORT_SYMBOL_GPL(alg_test); 2548