diff options
author | Tan Swee Heng <thesweeheng@gmail.com> | 2007-11-29 08:30:11 -0500 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2008-01-10 16:16:25 -0500 |
commit | 6d1a69d53a34e6d906551d92e7639b739332b177 (patch) | |
tree | 28a0cb065df734099001f7706a059e63d1adebb7 /crypto/tcrypt.c | |
parent | 0971eb0de9446b66bd45696338f54948314db379 (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>
Diffstat (limited to 'crypto/tcrypt.c')
-rw-r--r-- | crypto/tcrypt.c | 70 |
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 | } |