aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTan Swee Heng <thesweeheng@gmail.com>2007-11-29 08:30:11 -0500
committerHerbert Xu <herbert@gondor.apana.org.au>2008-01-10 16:16:25 -0500
commit6d1a69d53a34e6d906551d92e7639b739332b177 (patch)
tree28a0cb065df734099001f7706a059e63d1adebb7
parent0971eb0de9446b66bd45696338f54948314db379 (diff)
[CRYPTO] tcrypt: Support for large test vectors
Currently the number of entries in a cipher test vector template is limited by TVMEMSIZE/sizeof(struct cipher_testvec). This patch circumvents the problem by pointing cipher_tv to each entry in the template, rather than the template itself. Signed-off-by: Tan Swee Heng <thesweeheng@gmail.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--crypto/tcrypt.c70
1 files changed, 34 insertions, 36 deletions
diff --git a/crypto/tcrypt.c b/crypto/tcrypt.c
index 1e12b86bc951..71dc02ae8a43 100644
--- a/crypto/tcrypt.c
+++ b/crypto/tcrypt.c
@@ -471,15 +471,11 @@ static void test_cipher(char *algo, int enc,
471 printk("\ntesting %s %s\n", algo, e); 471 printk("\ntesting %s %s\n", algo, e);
472 472
473 tsize = sizeof (struct cipher_testvec); 473 tsize = sizeof (struct cipher_testvec);
474 tsize *= tcount;
475
476 if (tsize > TVMEMSIZE) { 474 if (tsize > TVMEMSIZE) {
477 printk("template (%u) too big for tvmem (%u)\n", tsize, 475 printk("template (%u) too big for tvmem (%u)\n", tsize,
478 TVMEMSIZE); 476 TVMEMSIZE);
479 return; 477 return;
480 } 478 }
481
482 memcpy(tvmem, template, tsize);
483 cipher_tv = (void *)tvmem; 479 cipher_tv = (void *)tvmem;
484 480
485 init_completion(&result.completion); 481 init_completion(&result.completion);
@@ -503,33 +499,34 @@ static void test_cipher(char *algo, int enc,
503 499
504 j = 0; 500 j = 0;
505 for (i = 0; i < tcount; i++) { 501 for (i = 0; i < tcount; i++) {
506 if (!(cipher_tv[i].np)) { 502 memcpy(cipher_tv, &template[i], tsize);
503 if (!(cipher_tv->np)) {
507 j++; 504 j++;
508 printk("test %u (%d bit key):\n", 505 printk("test %u (%d bit key):\n",
509 j, cipher_tv[i].klen * 8); 506 j, cipher_tv->klen * 8);
510 507
511 crypto_ablkcipher_clear_flags(tfm, ~0); 508 crypto_ablkcipher_clear_flags(tfm, ~0);
512 if (cipher_tv[i].wk) 509 if (cipher_tv->wk)
513 crypto_ablkcipher_set_flags( 510 crypto_ablkcipher_set_flags(
514 tfm, CRYPTO_TFM_REQ_WEAK_KEY); 511 tfm, CRYPTO_TFM_REQ_WEAK_KEY);
515 key = cipher_tv[i].key; 512 key = cipher_tv->key;
516 513
517 ret = crypto_ablkcipher_setkey(tfm, key, 514 ret = crypto_ablkcipher_setkey(tfm, key,
518 cipher_tv[i].klen); 515 cipher_tv->klen);
519 if (ret) { 516 if (ret) {
520 printk("setkey() failed flags=%x\n", 517 printk("setkey() failed flags=%x\n",
521 crypto_ablkcipher_get_flags(tfm)); 518 crypto_ablkcipher_get_flags(tfm));
522 519
523 if (!cipher_tv[i].fail) 520 if (!cipher_tv->fail)
524 goto out; 521 goto out;
525 } 522 }
526 523
527 sg_init_one(&sg[0], cipher_tv[i].input, 524 sg_init_one(&sg[0], cipher_tv->input,
528 cipher_tv[i].ilen); 525 cipher_tv->ilen);
529 526
530 ablkcipher_request_set_crypt(req, sg, sg, 527 ablkcipher_request_set_crypt(req, sg, sg,
531 cipher_tv[i].ilen, 528 cipher_tv->ilen,
532 cipher_tv[i].iv); 529 cipher_tv->iv);
533 530
534 ret = enc ? 531 ret = enc ?
535 crypto_ablkcipher_encrypt(req) : 532 crypto_ablkcipher_encrypt(req) :
@@ -553,11 +550,11 @@ static void test_cipher(char *algo, int enc,
553 } 550 }
554 551
555 q = kmap(sg_page(&sg[0])) + sg[0].offset; 552 q = kmap(sg_page(&sg[0])) + sg[0].offset;
556 hexdump(q, cipher_tv[i].rlen); 553 hexdump(q, cipher_tv->rlen);
557 554
558 printk("%s\n", 555 printk("%s\n",
559 memcmp(q, cipher_tv[i].result, 556 memcmp(q, cipher_tv->result,
560 cipher_tv[i].rlen) ? "fail" : "pass"); 557 cipher_tv->rlen) ? "fail" : "pass");
561 } 558 }
562 } 559 }
563 560
@@ -566,41 +563,42 @@ static void test_cipher(char *algo, int enc,
566 563
567 j = 0; 564 j = 0;
568 for (i = 0; i < tcount; i++) { 565 for (i = 0; i < tcount; i++) {
569 if (cipher_tv[i].np) { 566 memcpy(cipher_tv, &template[i], tsize);
567 if (cipher_tv->np) {
570 j++; 568 j++;
571 printk("test %u (%d bit key):\n", 569 printk("test %u (%d bit key):\n",
572 j, cipher_tv[i].klen * 8); 570 j, cipher_tv->klen * 8);
573 571
574 crypto_ablkcipher_clear_flags(tfm, ~0); 572 crypto_ablkcipher_clear_flags(tfm, ~0);
575 if (cipher_tv[i].wk) 573 if (cipher_tv->wk)
576 crypto_ablkcipher_set_flags( 574 crypto_ablkcipher_set_flags(
577 tfm, CRYPTO_TFM_REQ_WEAK_KEY); 575 tfm, CRYPTO_TFM_REQ_WEAK_KEY);
578 key = cipher_tv[i].key; 576 key = cipher_tv->key;
579 577
580 ret = crypto_ablkcipher_setkey(tfm, key, 578 ret = crypto_ablkcipher_setkey(tfm, key,
581 cipher_tv[i].klen); 579 cipher_tv->klen);
582 if (ret) { 580 if (ret) {
583 printk("setkey() failed flags=%x\n", 581 printk("setkey() failed flags=%x\n",
584 crypto_ablkcipher_get_flags(tfm)); 582 crypto_ablkcipher_get_flags(tfm));
585 583
586 if (!cipher_tv[i].fail) 584 if (!cipher_tv->fail)
587 goto out; 585 goto out;
588 } 586 }
589 587
590 temp = 0; 588 temp = 0;
591 sg_init_table(sg, cipher_tv[i].np); 589 sg_init_table(sg, cipher_tv->np);
592 for (k = 0; k < cipher_tv[i].np; k++) { 590 for (k = 0; k < cipher_tv->np; k++) {
593 memcpy(&xbuf[IDX[k]], 591 memcpy(&xbuf[IDX[k]],
594 cipher_tv[i].input + temp, 592 cipher_tv->input + temp,
595 cipher_tv[i].tap[k]); 593 cipher_tv->tap[k]);
596 temp += cipher_tv[i].tap[k]; 594 temp += cipher_tv->tap[k];
597 sg_set_buf(&sg[k], &xbuf[IDX[k]], 595 sg_set_buf(&sg[k], &xbuf[IDX[k]],
598 cipher_tv[i].tap[k]); 596 cipher_tv->tap[k]);
599 } 597 }
600 598
601 ablkcipher_request_set_crypt(req, sg, sg, 599 ablkcipher_request_set_crypt(req, sg, sg,
602 cipher_tv[i].ilen, 600 cipher_tv->ilen,
603 cipher_tv[i].iv); 601 cipher_tv->iv);
604 602
605 ret = enc ? 603 ret = enc ?
606 crypto_ablkcipher_encrypt(req) : 604 crypto_ablkcipher_encrypt(req) :
@@ -624,15 +622,15 @@ static void test_cipher(char *algo, int enc,
624 } 622 }
625 623
626 temp = 0; 624 temp = 0;
627 for (k = 0; k < cipher_tv[i].np; k++) { 625 for (k = 0; k < cipher_tv->np; k++) {
628 printk("page %u\n", k); 626 printk("page %u\n", k);
629 q = kmap(sg_page(&sg[k])) + sg[k].offset; 627 q = kmap(sg_page(&sg[k])) + sg[k].offset;
630 hexdump(q, cipher_tv[i].tap[k]); 628 hexdump(q, cipher_tv->tap[k]);
631 printk("%s\n", 629 printk("%s\n",
632 memcmp(q, cipher_tv[i].result + temp, 630 memcmp(q, cipher_tv->result + temp,
633 cipher_tv[i].tap[k]) ? "fail" : 631 cipher_tv->tap[k]) ? "fail" :
634 "pass"); 632 "pass");
635 temp += cipher_tv[i].tap[k]; 633 temp += cipher_tv->tap[k];
636 } 634 }
637 } 635 }
638 } 636 }