diff options
Diffstat (limited to '')
| -rw-r--r-- | src/regress/lib/libcrypto/bn/general/bntest.c | 89 |
1 files changed, 66 insertions, 23 deletions
diff --git a/src/regress/lib/libcrypto/bn/general/bntest.c b/src/regress/lib/libcrypto/bn/general/bntest.c index 9debc00042..6a9c2e8a53 100644 --- a/src/regress/lib/libcrypto/bn/general/bntest.c +++ b/src/regress/lib/libcrypto/bn/general/bntest.c | |||
| @@ -690,42 +690,85 @@ test_mul(BIO *bp) | |||
| 690 | int | 690 | int |
| 691 | test_sqr(BIO *bp, BN_CTX *ctx) | 691 | test_sqr(BIO *bp, BN_CTX *ctx) |
| 692 | { | 692 | { |
| 693 | BIGNUM a, c,d, e; | 693 | BIGNUM *a, *c, *d, *e; |
| 694 | int i; | 694 | int i, ret = 0; |
| 695 | int rc = 1; | ||
| 696 | 695 | ||
| 697 | BN_init(&a); | 696 | a = BN_new(); |
| 698 | BN_init(&c); | 697 | c = BN_new(); |
| 699 | BN_init(&d); | 698 | d = BN_new(); |
| 700 | BN_init(&e); | 699 | e = BN_new(); |
| 701 | 700 | ||
| 702 | for (i = 0; i < num0; i++) { | 701 | for (i = 0; i < num0; i++) { |
| 703 | BN_bntest_rand(&a, 40 + i*10, 0, 0); | 702 | BN_bntest_rand(a, 40 + i * 10, 0, 0); |
| 704 | a.neg = rand_neg(); | 703 | a->neg = rand_neg(); |
| 705 | BN_sqr(&c, &a, ctx); | 704 | BN_sqr(c, a, ctx); |
| 706 | if (bp != NULL) { | 705 | if (bp != NULL) { |
| 707 | if (!results) { | 706 | if (!results) { |
| 708 | BN_print(bp, &a); | 707 | BN_print(bp, a); |
| 709 | BIO_puts(bp, " * "); | 708 | BIO_puts(bp, " * "); |
| 710 | BN_print(bp, &a); | 709 | BN_print(bp, a); |
| 711 | BIO_puts(bp, " - "); | 710 | BIO_puts(bp, " - "); |
| 712 | } | 711 | } |
| 713 | BN_print(bp, &c); | 712 | BN_print(bp, c); |
| 714 | BIO_puts(bp, "\n"); | 713 | BIO_puts(bp, "\n"); |
| 715 | } | 714 | } |
| 716 | BN_div(&d, &e, &c, &a, ctx); | 715 | BN_div(d, e, c, a, ctx); |
| 717 | BN_sub(&d, &d, &a); | 716 | BN_sub(d, d, a); |
| 718 | if (!BN_is_zero(&d) || !BN_is_zero(&e)) { | 717 | if (!BN_is_zero(d) || !BN_is_zero(e)) { |
| 719 | fprintf(stderr, "Square test failed!\n"); | 718 | fprintf(stderr, "Square test failed!\n"); |
| 720 | rc = 0; | 719 | goto err; |
| 721 | break; | ||
| 722 | } | 720 | } |
| 723 | } | 721 | } |
| 724 | BN_free(&a); | 722 | |
| 725 | BN_free(&c); | 723 | /* Regression test for a BN_sqr overflow bug. */ |
| 726 | BN_free(&d); | 724 | BN_hex2bn(&a, "80000000000000008000000000000001" |
| 727 | BN_free(&e); | 725 | "FFFFFFFFFFFFFFFE0000000000000000"); |
| 728 | return (rc); | 726 | BN_sqr(c, a, ctx); |
| 727 | if (bp != NULL) { | ||
| 728 | if (!results) { | ||
| 729 | BN_print(bp, a); | ||
| 730 | BIO_puts(bp, " * "); | ||
| 731 | BN_print(bp, a); | ||
| 732 | BIO_puts(bp, " - "); | ||
| 733 | } | ||
| 734 | BN_print(bp, c); | ||
| 735 | BIO_puts(bp, "\n"); | ||
| 736 | } | ||
| 737 | BN_mul(d, a, a, ctx); | ||
| 738 | if (BN_cmp(c, d)) { | ||
| 739 | fprintf(stderr, | ||
| 740 | "Square test failed: BN_sqr and BN_mul produce " | ||
| 741 | "different results!\n"); | ||
| 742 | goto err; | ||
| 743 | } | ||
| 744 | |||
| 745 | /* Regression test for a BN_sqr overflow bug. */ | ||
| 746 | BN_hex2bn(&a, "80000000000000000000000080000001" | ||
| 747 | "FFFFFFFE000000000000000000000000"); | ||
| 748 | BN_sqr(c, a, ctx); | ||
| 749 | if (bp != NULL) { | ||
| 750 | if (!results) { | ||
| 751 | BN_print(bp, a); | ||
| 752 | BIO_puts(bp, " * "); | ||
| 753 | BN_print(bp, a); | ||
| 754 | BIO_puts(bp, " - "); | ||
| 755 | } | ||
| 756 | BN_print(bp, c); | ||
| 757 | BIO_puts(bp, "\n"); | ||
| 758 | } | ||
| 759 | BN_mul(d, a, a, ctx); | ||
| 760 | if (BN_cmp(c, d)) { | ||
| 761 | fprintf(stderr, "Square test failed: BN_sqr and BN_mul produce " | ||
| 762 | "different results!\n"); | ||
| 763 | goto err; | ||
| 764 | } | ||
| 765 | ret = 1; | ||
| 766 | err: | ||
| 767 | BN_free(a); | ||
| 768 | BN_free(c); | ||
| 769 | BN_free(d); | ||
| 770 | BN_free(e); | ||
| 771 | return ret; | ||
| 729 | } | 772 | } |
| 730 | 773 | ||
| 731 | int | 774 | int |
