diff options
| author | tb <> | 2023-10-19 13:38:12 +0000 |
|---|---|---|
| committer | tb <> | 2023-10-19 13:38:12 +0000 |
| commit | 1cab02ca58aa0b6ea8a4bc60b9f0c2d11be5a60d (patch) | |
| tree | cae40991ad1aae3e1641dcbd51fd898151b33656 /src | |
| parent | ccee90d9ab3953a89f3e0e9eb3833bfa480e4eda (diff) | |
| download | openbsd-1cab02ca58aa0b6ea8a4bc60b9f0c2d11be5a60d.tar.gz openbsd-1cab02ca58aa0b6ea8a4bc60b9f0c2d11be5a60d.tar.bz2 openbsd-1cab02ca58aa0b6ea8a4bc60b9f0c2d11be5a60d.zip | |
Add a few more test cases for mod_exp aliasing
Diffstat (limited to 'src')
| -rw-r--r-- | src/regress/lib/libcrypto/bn/bn_mod_exp.c | 111 |
1 files changed, 78 insertions, 33 deletions
diff --git a/src/regress/lib/libcrypto/bn/bn_mod_exp.c b/src/regress/lib/libcrypto/bn/bn_mod_exp.c index 61157385bf..98b6a5d2ef 100644 --- a/src/regress/lib/libcrypto/bn/bn_mod_exp.c +++ b/src/regress/lib/libcrypto/bn/bn_mod_exp.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: bn_mod_exp.c,v 1.39 2023/10/19 10:17:24 tb Exp $ */ | 1 | /* $OpenBSD: bn_mod_exp.c,v 1.40 2023/10/19 13:38:12 tb Exp $ */ |
| 2 | 2 | ||
| 3 | /* | 3 | /* |
| 4 | * Copyright (c) 2022,2023 Theo Buehler <tb@openbsd.org> | 4 | * Copyright (c) 2022,2023 Theo Buehler <tb@openbsd.org> |
| @@ -561,6 +561,51 @@ test_bn_mod_exp2_mont_crash(void) | |||
| 561 | return failed; | 561 | return failed; |
| 562 | } | 562 | } |
| 563 | 563 | ||
| 564 | const struct aliasing_test_case { | ||
| 565 | BN_ULONG a; | ||
| 566 | BN_ULONG p; | ||
| 567 | BN_ULONG m; | ||
| 568 | } aliasing_test_cases[] = { | ||
| 569 | { | ||
| 570 | .a = 1031, | ||
| 571 | .p = 1033, | ||
| 572 | .m = 1039, | ||
| 573 | }, | ||
| 574 | { | ||
| 575 | .a = 3, | ||
| 576 | .p = 4, | ||
| 577 | .m = 5, | ||
| 578 | }, | ||
| 579 | { | ||
| 580 | .a = 97, | ||
| 581 | .p = 17, | ||
| 582 | .m = 11, | ||
| 583 | }, | ||
| 584 | { | ||
| 585 | .a = 999961, | ||
| 586 | .p = 999979, | ||
| 587 | .m = 999983, | ||
| 588 | }, | ||
| 589 | }; | ||
| 590 | |||
| 591 | #define N_ALIASING_TEST_CASES \ | ||
| 592 | (sizeof(aliasing_test_cases) / sizeof(aliasing_test_cases[0])) | ||
| 593 | |||
| 594 | static void | ||
| 595 | test_bn_mod_exp_aliasing_setup(BIGNUM *want, BIGNUM *a, BIGNUM *p, BIGNUM *m, | ||
| 596 | BN_CTX *ctx, const struct aliasing_test_case *tc) | ||
| 597 | { | ||
| 598 | if (!BN_set_word(a, tc->a)) | ||
| 599 | errx(1, "BN_set_word"); | ||
| 600 | if (!BN_set_word(p, tc->p)) | ||
| 601 | errx(1, "BN_set_word"); | ||
| 602 | if (!BN_set_word(m, tc->m)) | ||
| 603 | errx(1, "BN_set_word"); | ||
| 604 | |||
| 605 | if (!BN_mod_exp_simple(want, a, p, m, ctx)) | ||
| 606 | errx(1, "BN_mod_exp"); | ||
| 607 | } | ||
| 608 | |||
| 564 | static int | 609 | static int |
| 565 | test_mod_exp_aliased(const char *alias, int want_ret, BIGNUM *got, | 610 | test_mod_exp_aliased(const char *alias, int want_ret, BIGNUM *got, |
| 566 | const BIGNUM *want, const BIGNUM *a, const BIGNUM *p, const BIGNUM *m, | 611 | const BIGNUM *want, const BIGNUM *a, const BIGNUM *p, const BIGNUM *m, |
| @@ -576,8 +621,10 @@ test_mod_exp_aliased(const char *alias, int want_ret, BIGNUM *got, | |||
| 576 | else | 621 | else |
| 577 | mod_exp_ret = test->mod_exp_mont_fn(got, a, p, m, ctx, NULL); | 622 | mod_exp_ret = test->mod_exp_mont_fn(got, a, p, m, ctx, NULL); |
| 578 | 623 | ||
| 579 | if (mod_exp_ret != want_ret) | 624 | if (mod_exp_ret != want_ret) { |
| 580 | errx(1, "%s() %s aliased with result failed", test->name, alias); | 625 | warnx("%s() %s aliased with result failed", test->name, alias); |
| 626 | goto err; | ||
| 627 | } | ||
| 581 | 628 | ||
| 582 | if (!mod_exp_ret) | 629 | if (!mod_exp_ret) |
| 583 | goto done; | 630 | goto done; |
| @@ -596,19 +643,34 @@ test_mod_exp_aliased(const char *alias, int want_ret, BIGNUM *got, | |||
| 596 | return ret; | 643 | return ret; |
| 597 | } | 644 | } |
| 598 | 645 | ||
| 599 | static void | 646 | static int |
| 600 | test_bn_mod_exp_aliasing_setup(BIGNUM *want, BIGNUM *a, BIGNUM *p, BIGNUM *m, | 647 | test_bn_mod_exp_aliasing_test(const struct mod_exp_test *test, |
| 601 | BN_CTX *ctx) | 648 | BIGNUM *a, BIGNUM *p, BIGNUM *m, BIGNUM *want, BIGNUM *got, BN_CTX *ctx) |
| 602 | { | 649 | { |
| 603 | if (!BN_set_word(a, 1031)) | 650 | int modulus_alias_works = test->mod_exp_fn != BN_mod_exp_simple; |
| 604 | errx(1, "BN_set_word"); | 651 | size_t i; |
| 605 | if (!BN_set_word(p, 1033)) | 652 | int failed = 0; |
| 606 | errx(1, "BN_set_word"); | ||
| 607 | if (!BN_set_word(m, 1039)) | ||
| 608 | errx(1, "BN_set_word"); | ||
| 609 | 653 | ||
| 610 | if (!BN_mod_exp_simple(want, a, p, m, ctx)) | 654 | for (i = 0; i < N_ALIASING_TEST_CASES; i++) { |
| 611 | errx(1, "BN_mod_exp"); | 655 | const struct aliasing_test_case *tc = &aliasing_test_cases[i]; |
| 656 | |||
| 657 | test_bn_mod_exp_aliasing_setup(want, a, p, m, ctx, tc); | ||
| 658 | if (!test_mod_exp_aliased("nothing", 1, got, want, a, p, m, ctx, | ||
| 659 | test)) | ||
| 660 | failed |= 1; | ||
| 661 | test_bn_mod_exp_aliasing_setup(want, a, p, m, ctx, tc); | ||
| 662 | if (!test_mod_exp_aliased("a", 1, a, want, a, p, m, ctx, test)) | ||
| 663 | failed |= 1; | ||
| 664 | test_bn_mod_exp_aliasing_setup(want, a, p, m, ctx, tc); | ||
| 665 | if (!test_mod_exp_aliased("p", 1, p, want, a, p, m, ctx, test)) | ||
| 666 | failed |= 1; | ||
| 667 | test_bn_mod_exp_aliasing_setup(want, a, p, m, ctx, tc); | ||
| 668 | if (!test_mod_exp_aliased("m", modulus_alias_works, m, want, | ||
| 669 | a, p, m, ctx, test)) | ||
| 670 | failed |= 1; | ||
| 671 | } | ||
| 672 | |||
| 673 | return failed; | ||
| 612 | } | 674 | } |
| 613 | 675 | ||
| 614 | static int | 676 | static int |
| @@ -637,25 +699,8 @@ test_bn_mod_exp_aliasing(void) | |||
| 637 | 699 | ||
| 638 | for (i = 0; i < N_MOD_EXP_FN; i++) { | 700 | for (i = 0; i < N_MOD_EXP_FN; i++) { |
| 639 | const struct mod_exp_test *test = &mod_exp_fn[i]; | 701 | const struct mod_exp_test *test = &mod_exp_fn[i]; |
| 640 | int aliasing_allowed = 1; | 702 | failed |= test_bn_mod_exp_aliasing_test(test, a, p, m, |
| 641 | 703 | want, got, ctx); | |
| 642 | test_bn_mod_exp_aliasing_setup(want, a, p, m, ctx); | ||
| 643 | if (!test_mod_exp_aliased("nothing", 1, got, want, a, p, m, ctx, | ||
| 644 | test)) | ||
| 645 | failed |= 1; | ||
| 646 | test_bn_mod_exp_aliasing_setup(want, a, p, m, ctx); | ||
| 647 | if (!test_mod_exp_aliased("a", 1, a, want, a, p, m, ctx, test)) | ||
| 648 | failed |= 1; | ||
| 649 | test_bn_mod_exp_aliasing_setup(want, a, p, m, ctx); | ||
| 650 | if (!test_mod_exp_aliased("p", 1, p, want, a, p, m, ctx, test)) | ||
| 651 | failed |= 1; | ||
| 652 | |||
| 653 | if (test->mod_exp_fn == BN_mod_exp_simple) | ||
| 654 | aliasing_allowed = 0; | ||
| 655 | test_bn_mod_exp_aliasing_setup(want, a, p, m, ctx); | ||
| 656 | if (!test_mod_exp_aliased("m", aliasing_allowed, m, want, | ||
| 657 | a, p, m, ctx, test)) | ||
| 658 | failed |= 1; | ||
| 659 | } | 704 | } |
| 660 | 705 | ||
| 661 | BN_CTX_end(ctx); | 706 | BN_CTX_end(ctx); |
