diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libcrypto/bn/bn_nist.c | 223 |
1 files changed, 137 insertions, 86 deletions
diff --git a/src/lib/libcrypto/bn/bn_nist.c b/src/lib/libcrypto/bn/bn_nist.c index 3a04c471c4..871b37cf89 100644 --- a/src/lib/libcrypto/bn/bn_nist.c +++ b/src/lib/libcrypto/bn/bn_nist.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: bn_nist.c,v 1.19 2021/11/09 18:40:20 bcook Exp $ */ | 1 | /* $OpenBSD: bn_nist.c,v 1.20 2022/05/07 07:47:24 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Written by Nils Larsch for the OpenSSL project | 3 | * Written by Nils Larsch for the OpenSSL project |
| 4 | */ | 4 | */ |
| @@ -62,6 +62,9 @@ | |||
| 62 | 62 | ||
| 63 | #include "bn_lcl.h" | 63 | #include "bn_lcl.h" |
| 64 | 64 | ||
| 65 | #define CTASSERT(x) extern char _ctassert[(x) ? 1 : -1 ] \ | ||
| 66 | __attribute__((__unused__)) | ||
| 67 | |||
| 65 | #define BN_NIST_192_TOP (192+BN_BITS2-1)/BN_BITS2 | 68 | #define BN_NIST_192_TOP (192+BN_BITS2-1)/BN_BITS2 |
| 66 | #define BN_NIST_224_TOP (224+BN_BITS2-1)/BN_BITS2 | 69 | #define BN_NIST_224_TOP (224+BN_BITS2-1)/BN_BITS2 |
| 67 | #define BN_NIST_256_TOP (256+BN_BITS2-1)/BN_BITS2 | 70 | #define BN_NIST_256_TOP (256+BN_BITS2-1)/BN_BITS2 |
| @@ -425,11 +428,7 @@ BN_nist_mod_192(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, BN_CTX *ctx) | |||
| 425 | int top = a->top, i; | 428 | int top = a->top, i; |
| 426 | int carry; | 429 | int carry; |
| 427 | BN_ULONG *r_d, *a_d = a->d; | 430 | BN_ULONG *r_d, *a_d = a->d; |
| 428 | union { | 431 | BN_ULONG bnbuf[BN_NIST_192_TOP] = { 0 }; |
| 429 | BN_ULONG bn[BN_NIST_192_TOP]; | ||
| 430 | unsigned int ui[BN_NIST_192_TOP * | ||
| 431 | sizeof(BN_ULONG) / sizeof(unsigned int)]; | ||
| 432 | } buf; | ||
| 433 | BN_ULONG c_d[BN_NIST_192_TOP], *res; | 432 | BN_ULONG c_d[BN_NIST_192_TOP], *res; |
| 434 | uintptr_t mask; | 433 | uintptr_t mask; |
| 435 | static const BIGNUM _bignum_nist_p_192_sqr = { | 434 | static const BIGNUM _bignum_nist_p_192_sqr = { |
| @@ -460,14 +459,31 @@ BN_nist_mod_192(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, BN_CTX *ctx) | |||
| 460 | } else | 459 | } else |
| 461 | r_d = a_d; | 460 | r_d = a_d; |
| 462 | 461 | ||
| 463 | nist_cp_bn_0(buf.bn, a_d + BN_NIST_192_TOP, top - BN_NIST_192_TOP, | 462 | nist_cp_bn_0(bnbuf, a_d + BN_NIST_192_TOP, top - BN_NIST_192_TOP, |
| 464 | BN_NIST_192_TOP); | 463 | BN_NIST_192_TOP); |
| 465 | 464 | ||
| 466 | #if defined(NIST_INT64) | 465 | #if defined(NIST_INT64) |
| 467 | { | 466 | { |
| 468 | NIST_INT64 acc; /* accumulator */ | 467 | NIST_INT64 acc; /* accumulator */ |
| 469 | unsigned int *rp = (unsigned int *)r_d; | 468 | unsigned int bbuf[BN_NIST_192_TOP * |
| 470 | const unsigned int *bp = (const unsigned int *)buf.ui; | 469 | sizeof(BN_ULONG) / sizeof(unsigned int)]; |
| 470 | unsigned int rbuf[BN_NIST_192_TOP * | ||
| 471 | sizeof(BN_ULONG) / sizeof(unsigned int)]; | ||
| 472 | const unsigned int *bp = bbuf; | ||
| 473 | unsigned int *rp = rbuf; | ||
| 474 | |||
| 475 | CTASSERT(sizeof(bbuf) == sizeof(bnbuf)); | ||
| 476 | CTASSERT(sizeof(rbuf) == sizeof(bnbuf)); | ||
| 477 | |||
| 478 | /* | ||
| 479 | * Avoid strict aliasing violations by copying from an unsigned | ||
| 480 | * long array to an unsigned int array, then copying back the | ||
| 481 | * result. Any sensible compiler will omit the copies, while | ||
| 482 | * avoiding undefined behaviour that would result from unsafe | ||
| 483 | * type punning via pointer type casting. | ||
| 484 | */ | ||
| 485 | memcpy(bbuf, bnbuf, sizeof(bbuf)); | ||
| 486 | memcpy(rbuf, r_d, sizeof(rbuf)); | ||
| 471 | 487 | ||
| 472 | acc = rp[0]; | 488 | acc = rp[0]; |
| 473 | acc += bp[3 * 2 - 6]; | 489 | acc += bp[3 * 2 - 6]; |
| @@ -506,17 +522,19 @@ BN_nist_mod_192(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, BN_CTX *ctx) | |||
| 506 | acc += bp[5 * 2 - 5]; | 522 | acc += bp[5 * 2 - 5]; |
| 507 | rp[5] = (unsigned int)acc; | 523 | rp[5] = (unsigned int)acc; |
| 508 | 524 | ||
| 525 | memcpy(r_d, rbuf, sizeof(rbuf)); | ||
| 526 | |||
| 509 | carry = (int)(acc >> 32); | 527 | carry = (int)(acc >> 32); |
| 510 | } | 528 | } |
| 511 | #else | 529 | #else |
| 512 | { | 530 | { |
| 513 | BN_ULONG t_d[BN_NIST_192_TOP] = {0}; | 531 | BN_ULONG t_d[BN_NIST_192_TOP] = {0}; |
| 514 | 532 | ||
| 515 | nist_set_192(t_d, buf.bn, 0, 3, 3); | 533 | nist_set_192(t_d, bnbuf, 0, 3, 3); |
| 516 | carry = (int)bn_add_words(r_d, r_d, t_d, BN_NIST_192_TOP); | 534 | carry = (int)bn_add_words(r_d, r_d, t_d, BN_NIST_192_TOP); |
| 517 | nist_set_192(t_d, buf.bn, 4, 4, 0); | 535 | nist_set_192(t_d, bnbuf, 4, 4, 0); |
| 518 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_192_TOP); | 536 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_192_TOP); |
| 519 | nist_set_192(t_d, buf.bn, 5, 5, 5) | 537 | nist_set_192(t_d, bnbuf, 5, 5, 5) |
| 520 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_192_TOP); | 538 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_192_TOP); |
| 521 | } | 539 | } |
| 522 | #endif | 540 | #endif |
| @@ -564,17 +582,10 @@ BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, BN_CTX *ctx) | |||
| 564 | int top = a->top, i; | 582 | int top = a->top, i; |
| 565 | int carry; | 583 | int carry; |
| 566 | BN_ULONG *r_d, *a_d = a->d; | 584 | BN_ULONG *r_d, *a_d = a->d; |
| 567 | union { | 585 | BN_ULONG bnbuf[BN_NIST_224_TOP] = { 0 }; |
| 568 | BN_ULONG bn[BN_NIST_224_TOP]; | ||
| 569 | unsigned int ui[BN_NIST_224_TOP * | ||
| 570 | sizeof(BN_ULONG) / sizeof(unsigned int)]; | ||
| 571 | } buf; | ||
| 572 | BN_ULONG c_d[BN_NIST_224_TOP], *res; | 586 | BN_ULONG c_d[BN_NIST_224_TOP], *res; |
| 573 | uintptr_t mask; | 587 | uintptr_t mask; |
| 574 | union { | 588 | bn_addsub_f addsubf; |
| 575 | bn_addsub_f f; | ||
| 576 | uintptr_t p; | ||
| 577 | } u; | ||
| 578 | static const BIGNUM _bignum_nist_p_224_sqr = { | 589 | static const BIGNUM _bignum_nist_p_224_sqr = { |
| 579 | (BN_ULONG *)_nist_p_224_sqr, | 590 | (BN_ULONG *)_nist_p_224_sqr, |
| 580 | sizeof(_nist_p_224_sqr) / sizeof(_nist_p_224_sqr[0]), | 591 | sizeof(_nist_p_224_sqr) / sizeof(_nist_p_224_sqr[0]), |
| @@ -603,26 +614,43 @@ BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, BN_CTX *ctx) | |||
| 603 | } else | 614 | } else |
| 604 | r_d = a_d; | 615 | r_d = a_d; |
| 605 | 616 | ||
| 606 | memset(&buf, 0, sizeof(buf)); | 617 | memset(&bnbuf, 0, sizeof(bnbuf)); |
| 607 | 618 | ||
| 608 | #if BN_BITS2==64 | 619 | #if BN_BITS2==64 |
| 609 | /* copy upper 256 bits of 448 bit number ... */ | 620 | /* copy upper 256 bits of 448 bit number ... */ |
| 610 | nist_cp_bn_0(c_d, a_d + (BN_NIST_224_TOP - 1), | 621 | nist_cp_bn_0(c_d, a_d + (BN_NIST_224_TOP - 1), |
| 611 | top - (BN_NIST_224_TOP - 1), BN_NIST_224_TOP); | 622 | top - (BN_NIST_224_TOP - 1), BN_NIST_224_TOP); |
| 612 | /* ... and right shift by 32 to obtain upper 224 bits */ | 623 | /* ... and right shift by 32 to obtain upper 224 bits */ |
| 613 | nist_set_224(buf.bn, c_d, 14, 13, 12, 11, 10, 9, 8); | 624 | nist_set_224(bnbuf, c_d, 14, 13, 12, 11, 10, 9, 8); |
| 614 | /* truncate lower part to 224 bits too */ | 625 | /* truncate lower part to 224 bits too */ |
| 615 | r_d[BN_NIST_224_TOP - 1] &= BN_MASK2l; | 626 | r_d[BN_NIST_224_TOP - 1] &= BN_MASK2l; |
| 616 | #else | 627 | #else |
| 617 | nist_cp_bn_0(buf.bn, a_d + BN_NIST_224_TOP, | 628 | nist_cp_bn_0(bnbuf, a_d + BN_NIST_224_TOP, |
| 618 | top - BN_NIST_224_TOP, BN_NIST_224_TOP); | 629 | top - BN_NIST_224_TOP, BN_NIST_224_TOP); |
| 619 | #endif | 630 | #endif |
| 620 | 631 | ||
| 621 | #if defined(NIST_INT64) && BN_BITS2!=64 | 632 | #if defined(NIST_INT64) && BN_BITS2!=64 |
| 622 | { | 633 | { |
| 623 | NIST_INT64 acc; /* accumulator */ | 634 | NIST_INT64 acc; /* accumulator */ |
| 624 | unsigned int *rp = (unsigned int *)r_d; | 635 | unsigned int bbuf[BN_NIST_224_TOP * |
| 625 | const unsigned int *bp = (const unsigned int *)buf.ui; | 636 | sizeof(BN_ULONG) / sizeof(unsigned int)]; |
| 637 | unsigned int rbuf[BN_NIST_224_TOP * | ||
| 638 | sizeof(BN_ULONG) / sizeof(unsigned int)]; | ||
| 639 | const unsigned int *bp = bbuf; | ||
| 640 | unsigned int *rp = rbuf; | ||
| 641 | |||
| 642 | CTASSERT(sizeof(bbuf) == sizeof(bnbuf)); | ||
| 643 | CTASSERT(sizeof(rbuf) == sizeof(bnbuf)); | ||
| 644 | |||
| 645 | /* | ||
| 646 | * Avoid strict aliasing violations by copying from an unsigned | ||
| 647 | * long array to an unsigned int array, then copying back the | ||
| 648 | * result. Any sensible compiler will omit the copies, while | ||
| 649 | * avoiding undefined behaviour that would result from unsafe | ||
| 650 | * type punning via pointer type casting. | ||
| 651 | */ | ||
| 652 | memcpy(bbuf, bnbuf, sizeof(bbuf)); | ||
| 653 | memcpy(rbuf, r_d, sizeof(rbuf)); | ||
| 626 | 654 | ||
| 627 | acc = rp[0]; | 655 | acc = rp[0]; |
| 628 | acc -= bp[7 - 7]; | 656 | acc -= bp[7 - 7]; |
| @@ -668,6 +696,8 @@ BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, BN_CTX *ctx) | |||
| 668 | acc -= bp[13 - 7]; | 696 | acc -= bp[13 - 7]; |
| 669 | rp[6] = (unsigned int)acc; | 697 | rp[6] = (unsigned int)acc; |
| 670 | 698 | ||
| 699 | memcpy(r_d, rbuf, sizeof(rbuf)); | ||
| 700 | |||
| 671 | carry = (int)(acc >> 32); | 701 | carry = (int)(acc >> 32); |
| 672 | # if BN_BITS2==64 | 702 | # if BN_BITS2==64 |
| 673 | rp[7] = carry; | 703 | rp[7] = carry; |
| @@ -677,13 +707,13 @@ BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, BN_CTX *ctx) | |||
| 677 | { | 707 | { |
| 678 | BN_ULONG t_d[BN_NIST_224_TOP] = {0}; | 708 | BN_ULONG t_d[BN_NIST_224_TOP] = {0}; |
| 679 | 709 | ||
| 680 | nist_set_224(t_d, buf.bn, 10, 9, 8, 7, 0, 0, 0); | 710 | nist_set_224(t_d, bnbuf, 10, 9, 8, 7, 0, 0, 0); |
| 681 | carry = (int)bn_add_words(r_d, r_d, t_d, BN_NIST_224_TOP); | 711 | carry = (int)bn_add_words(r_d, r_d, t_d, BN_NIST_224_TOP); |
| 682 | nist_set_224(t_d, buf.bn, 0, 13, 12, 11, 0, 0, 0); | 712 | nist_set_224(t_d, bnbuf, 0, 13, 12, 11, 0, 0, 0); |
| 683 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_224_TOP); | 713 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_224_TOP); |
| 684 | nist_set_224(t_d, buf.bn, 13, 12, 11, 10, 9, 8, 7); | 714 | nist_set_224(t_d, bnbuf, 13, 12, 11, 10, 9, 8, 7); |
| 685 | carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_224_TOP); | 715 | carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_224_TOP); |
| 686 | nist_set_224(t_d, buf.bn, 0, 0, 0, 0, 13, 12, 11); | 716 | nist_set_224(t_d, bnbuf, 0, 0, 0, 0, 13, 12, 11); |
| 687 | carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_224_TOP); | 717 | carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_224_TOP); |
| 688 | 718 | ||
| 689 | #if BN_BITS2==64 | 719 | #if BN_BITS2==64 |
| @@ -691,7 +721,7 @@ BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, BN_CTX *ctx) | |||
| 691 | #endif | 721 | #endif |
| 692 | } | 722 | } |
| 693 | #endif | 723 | #endif |
| 694 | u.f = bn_sub_words; | 724 | addsubf = bn_sub_words; |
| 695 | if (carry > 0) { | 725 | if (carry > 0) { |
| 696 | carry = (int)bn_sub_words(r_d, r_d, _nist_p_224[carry - 1], | 726 | carry = (int)bn_sub_words(r_d, r_d, _nist_p_224[carry - 1], |
| 697 | BN_NIST_224_TOP); | 727 | BN_NIST_224_TOP); |
| @@ -707,14 +737,13 @@ BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, BN_CTX *ctx) | |||
| 707 | * adjusted by *subtracting* the latter. */ | 737 | * adjusted by *subtracting* the latter. */ |
| 708 | carry = (int)bn_add_words(r_d, r_d, _nist_p_224[-carry - 1], | 738 | carry = (int)bn_add_words(r_d, r_d, _nist_p_224[-carry - 1], |
| 709 | BN_NIST_224_TOP); | 739 | BN_NIST_224_TOP); |
| 710 | mask = 0 - (uintptr_t)carry; | 740 | if (carry == 0) |
| 711 | u.p = ((uintptr_t)bn_sub_words & mask) | | 741 | addsubf = bn_add_words; |
| 712 | ((uintptr_t)bn_add_words & ~mask); | ||
| 713 | } else | 742 | } else |
| 714 | carry = 1; | 743 | carry = 1; |
| 715 | 744 | ||
| 716 | /* otherwise it's effectively same as in BN_nist_mod_192... */ | 745 | /* otherwise it's effectively same as in BN_nist_mod_192... */ |
| 717 | mask = 0 - (uintptr_t)(*u.f)(c_d, r_d, _nist_p_224[0], BN_NIST_224_TOP); | 746 | mask = 0 - (uintptr_t)(*addsubf)(c_d, r_d, _nist_p_224[0], BN_NIST_224_TOP); |
| 718 | mask &= 0 - (uintptr_t)carry; | 747 | mask &= 0 - (uintptr_t)carry; |
| 719 | res = c_d; | 748 | res = c_d; |
| 720 | res = (BN_ULONG *)(((uintptr_t)res & ~mask) | ((uintptr_t)r_d & mask)); | 749 | res = (BN_ULONG *)(((uintptr_t)res & ~mask) | ((uintptr_t)r_d & mask)); |
| @@ -743,17 +772,10 @@ BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, BN_CTX *ctx) | |||
| 743 | int i, top = a->top; | 772 | int i, top = a->top; |
| 744 | int carry = 0; | 773 | int carry = 0; |
| 745 | BN_ULONG *a_d = a->d, *r_d; | 774 | BN_ULONG *a_d = a->d, *r_d; |
| 746 | union { | 775 | BN_ULONG bnbuf[BN_NIST_256_TOP] = { 0 }; |
| 747 | BN_ULONG bn[BN_NIST_256_TOP]; | ||
| 748 | unsigned int ui[BN_NIST_256_TOP * | ||
| 749 | sizeof(BN_ULONG) / sizeof(unsigned int)]; | ||
| 750 | } buf; | ||
| 751 | BN_ULONG c_d[BN_NIST_256_TOP] = {0}, *res; | 776 | BN_ULONG c_d[BN_NIST_256_TOP] = {0}, *res; |
| 752 | uintptr_t mask; | 777 | uintptr_t mask; |
| 753 | union { | 778 | bn_addsub_f addsubf; |
| 754 | bn_addsub_f f; | ||
| 755 | uintptr_t p; | ||
| 756 | } u; | ||
| 757 | static const BIGNUM _bignum_nist_p_256_sqr = { | 779 | static const BIGNUM _bignum_nist_p_256_sqr = { |
| 758 | (BN_ULONG *)_nist_p_256_sqr, | 780 | (BN_ULONG *)_nist_p_256_sqr, |
| 759 | sizeof(_nist_p_256_sqr) / sizeof(_nist_p_256_sqr[0]), | 781 | sizeof(_nist_p_256_sqr) / sizeof(_nist_p_256_sqr[0]), |
| @@ -782,14 +804,31 @@ BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, BN_CTX *ctx) | |||
| 782 | } else | 804 | } else |
| 783 | r_d = a_d; | 805 | r_d = a_d; |
| 784 | 806 | ||
| 785 | nist_cp_bn_0(buf.bn, a_d + BN_NIST_256_TOP, | 807 | nist_cp_bn_0(bnbuf, a_d + BN_NIST_256_TOP, |
| 786 | top - BN_NIST_256_TOP, BN_NIST_256_TOP); | 808 | top - BN_NIST_256_TOP, BN_NIST_256_TOP); |
| 787 | 809 | ||
| 788 | #if defined(NIST_INT64) | 810 | #if defined(NIST_INT64) |
| 789 | { | 811 | { |
| 790 | NIST_INT64 acc; /* accumulator */ | 812 | NIST_INT64 acc; /* accumulator */ |
| 791 | unsigned int *rp = (unsigned int *)r_d; | 813 | unsigned int bbuf[BN_NIST_256_TOP * |
| 792 | const unsigned int *bp = (const unsigned int *)buf.ui; | 814 | sizeof(BN_ULONG) / sizeof(unsigned int)]; |
| 815 | unsigned int rbuf[BN_NIST_256_TOP * | ||
| 816 | sizeof(BN_ULONG) / sizeof(unsigned int)]; | ||
| 817 | const unsigned int *bp = bbuf; | ||
| 818 | unsigned int *rp = rbuf; | ||
| 819 | |||
| 820 | CTASSERT(sizeof(bbuf) == sizeof(bnbuf)); | ||
| 821 | CTASSERT(sizeof(rbuf) == sizeof(bnbuf)); | ||
| 822 | |||
| 823 | /* | ||
| 824 | * Avoid strict aliasing violations by copying from an unsigned | ||
| 825 | * long array to an unsigned int array, then copying back the | ||
| 826 | * result. Any sensible compiler will omit the copies, while | ||
| 827 | * avoiding undefined behaviour that would result from unsafe | ||
| 828 | * type punning via pointer type casting. | ||
| 829 | */ | ||
| 830 | memcpy(bbuf, bnbuf, sizeof(bbuf)); | ||
| 831 | memcpy(rbuf, r_d, sizeof(rbuf)); | ||
| 793 | 832 | ||
| 794 | acc = rp[0]; | 833 | acc = rp[0]; |
| 795 | acc += bp[8 - 8]; | 834 | acc += bp[8 - 8]; |
| @@ -877,6 +916,8 @@ BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, BN_CTX *ctx) | |||
| 877 | acc -= bp[13 - 8]; | 916 | acc -= bp[13 - 8]; |
| 878 | rp[7] = (unsigned int)acc; | 917 | rp[7] = (unsigned int)acc; |
| 879 | 918 | ||
| 919 | memcpy(r_d, rbuf, sizeof(rbuf)); | ||
| 920 | |||
| 880 | carry = (int)(acc >> 32); | 921 | carry = (int)(acc >> 32); |
| 881 | } | 922 | } |
| 882 | #else | 923 | #else |
| @@ -884,9 +925,9 @@ BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, BN_CTX *ctx) | |||
| 884 | BN_ULONG t_d[BN_NIST_256_TOP] = {0}; | 925 | BN_ULONG t_d[BN_NIST_256_TOP] = {0}; |
| 885 | 926 | ||
| 886 | /*S1*/ | 927 | /*S1*/ |
| 887 | nist_set_256(t_d, buf.bn, 15, 14, 13, 12, 11, 0, 0, 0); | 928 | nist_set_256(t_d, bnbuf, 15, 14, 13, 12, 11, 0, 0, 0); |
| 888 | /*S2*/ | 929 | /*S2*/ |
| 889 | nist_set_256(c_d, buf.bn, 0, 15, 14, 13, 12, 0, 0, 0); | 930 | nist_set_256(c_d, bnbuf, 0, 15, 14, 13, 12, 0, 0, 0); |
| 890 | carry = (int)bn_add_words(t_d, t_d, c_d, BN_NIST_256_TOP); | 931 | carry = (int)bn_add_words(t_d, t_d, c_d, BN_NIST_256_TOP); |
| 891 | /* left shift */ | 932 | /* left shift */ |
| 892 | { | 933 | { |
| @@ -903,41 +944,40 @@ BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, BN_CTX *ctx) | |||
| 903 | } | 944 | } |
| 904 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_256_TOP); | 945 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_256_TOP); |
| 905 | /*S3*/ | 946 | /*S3*/ |
| 906 | nist_set_256(t_d, buf.bn, 15, 14, 0, 0, 0, 10, 9, 8); | 947 | nist_set_256(t_d, bnbuf, 15, 14, 0, 0, 0, 10, 9, 8); |
| 907 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_256_TOP); | 948 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_256_TOP); |
| 908 | /*S4*/ | 949 | /*S4*/ |
| 909 | nist_set_256(t_d, buf.bn, 8, 13, 15, 14, 13, 11, 10, 9); | 950 | nist_set_256(t_d, bnbuf, 8, 13, 15, 14, 13, 11, 10, 9); |
| 910 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_256_TOP); | 951 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_256_TOP); |
| 911 | /*D1*/ | 952 | /*D1*/ |
| 912 | nist_set_256(t_d, buf.bn, 10, 8, 0, 0, 0, 13, 12, 11); | 953 | nist_set_256(t_d, bnbuf, 10, 8, 0, 0, 0, 13, 12, 11); |
| 913 | carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_256_TOP); | 954 | carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_256_TOP); |
| 914 | /*D2*/ | 955 | /*D2*/ |
| 915 | nist_set_256(t_d, buf.bn, 11, 9, 0, 0, 15, 14, 13, 12); | 956 | nist_set_256(t_d, bnbuf, 11, 9, 0, 0, 15, 14, 13, 12); |
| 916 | carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_256_TOP); | 957 | carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_256_TOP); |
| 917 | /*D3*/ | 958 | /*D3*/ |
| 918 | nist_set_256(t_d, buf.bn, 12, 0, 10, 9, 8, 15, 14, 13); | 959 | nist_set_256(t_d, bnbuf, 12, 0, 10, 9, 8, 15, 14, 13); |
| 919 | carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_256_TOP); | 960 | carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_256_TOP); |
| 920 | /*D4*/ | 961 | /*D4*/ |
| 921 | nist_set_256(t_d, buf.bn, 13, 0, 11, 10, 9, 0, 15, 14); | 962 | nist_set_256(t_d, bnbuf, 13, 0, 11, 10, 9, 0, 15, 14); |
| 922 | carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_256_TOP); | 963 | carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_256_TOP); |
| 923 | 964 | ||
| 924 | } | 965 | } |
| 925 | #endif | 966 | #endif |
| 926 | /* see BN_nist_mod_224 for explanation */ | 967 | /* see BN_nist_mod_224 for explanation */ |
| 927 | u.f = bn_sub_words; | 968 | addsubf = bn_sub_words; |
| 928 | if (carry > 0) | 969 | if (carry > 0) |
| 929 | carry = (int)bn_sub_words(r_d, r_d, _nist_p_256[carry - 1], | 970 | carry = (int)bn_sub_words(r_d, r_d, _nist_p_256[carry - 1], |
| 930 | BN_NIST_256_TOP); | 971 | BN_NIST_256_TOP); |
| 931 | else if (carry < 0) { | 972 | else if (carry < 0) { |
| 932 | carry = (int)bn_add_words(r_d, r_d, _nist_p_256[-carry - 1], | 973 | carry = (int)bn_add_words(r_d, r_d, _nist_p_256[-carry - 1], |
| 933 | BN_NIST_256_TOP); | 974 | BN_NIST_256_TOP); |
| 934 | mask = 0 - (uintptr_t)carry; | 975 | if (carry == 0) |
| 935 | u.p = ((uintptr_t)bn_sub_words & mask) | | 976 | addsubf = bn_add_words; |
| 936 | ((uintptr_t)bn_add_words & ~mask); | ||
| 937 | } else | 977 | } else |
| 938 | carry = 1; | 978 | carry = 1; |
| 939 | 979 | ||
| 940 | mask = 0 - (uintptr_t)(*u.f)(c_d, r_d, _nist_p_256[0], BN_NIST_256_TOP); | 980 | mask = 0 - (uintptr_t)(*addsubf)(c_d, r_d, _nist_p_256[0], BN_NIST_256_TOP); |
| 941 | mask &= 0 - (uintptr_t)carry; | 981 | mask &= 0 - (uintptr_t)carry; |
| 942 | res = c_d; | 982 | res = c_d; |
| 943 | res = (BN_ULONG *)(((uintptr_t)res & ~mask) | ((uintptr_t)r_d & mask)); | 983 | res = (BN_ULONG *)(((uintptr_t)res & ~mask) | ((uintptr_t)r_d & mask)); |
| @@ -970,17 +1010,10 @@ BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, BN_CTX *ctx) | |||
| 970 | int i, top = a->top; | 1010 | int i, top = a->top; |
| 971 | int carry = 0; | 1011 | int carry = 0; |
| 972 | BN_ULONG *r_d, *a_d = a->d; | 1012 | BN_ULONG *r_d, *a_d = a->d; |
| 973 | union { | 1013 | BN_ULONG bnbuf[BN_NIST_384_TOP] = { 0 }; |
| 974 | BN_ULONG bn[BN_NIST_384_TOP]; | ||
| 975 | unsigned int ui[BN_NIST_384_TOP * | ||
| 976 | sizeof(BN_ULONG) / sizeof(unsigned int)]; | ||
| 977 | } buf; | ||
| 978 | BN_ULONG c_d[BN_NIST_384_TOP], *res; | 1014 | BN_ULONG c_d[BN_NIST_384_TOP], *res; |
| 979 | uintptr_t mask; | 1015 | uintptr_t mask; |
| 980 | union { | 1016 | bn_addsub_f addsubf; |
| 981 | bn_addsub_f f; | ||
| 982 | uintptr_t p; | ||
| 983 | } u; | ||
| 984 | static const BIGNUM _bignum_nist_p_384_sqr = { | 1017 | static const BIGNUM _bignum_nist_p_384_sqr = { |
| 985 | (BN_ULONG *)_nist_p_384_sqr, | 1018 | (BN_ULONG *)_nist_p_384_sqr, |
| 986 | sizeof(_nist_p_384_sqr) / sizeof(_nist_p_384_sqr[0]), | 1019 | sizeof(_nist_p_384_sqr) / sizeof(_nist_p_384_sqr[0]), |
| @@ -1009,14 +1042,31 @@ BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, BN_CTX *ctx) | |||
| 1009 | } else | 1042 | } else |
| 1010 | r_d = a_d; | 1043 | r_d = a_d; |
| 1011 | 1044 | ||
| 1012 | nist_cp_bn_0(buf.bn, a_d + BN_NIST_384_TOP, | 1045 | nist_cp_bn_0(bnbuf, a_d + BN_NIST_384_TOP, |
| 1013 | top - BN_NIST_384_TOP, BN_NIST_384_TOP); | 1046 | top - BN_NIST_384_TOP, BN_NIST_384_TOP); |
| 1014 | 1047 | ||
| 1015 | #if defined(NIST_INT64) | 1048 | #if defined(NIST_INT64) |
| 1016 | { | 1049 | { |
| 1017 | NIST_INT64 acc; /* accumulator */ | 1050 | NIST_INT64 acc; /* accumulator */ |
| 1018 | unsigned int *rp = (unsigned int *)r_d; | 1051 | unsigned int bbuf[BN_NIST_384_TOP * |
| 1019 | const unsigned int *bp = (const unsigned int *)buf.ui; | 1052 | sizeof(BN_ULONG) / sizeof(unsigned int)]; |
| 1053 | unsigned int rbuf[BN_NIST_384_TOP * | ||
| 1054 | sizeof(BN_ULONG) / sizeof(unsigned int)]; | ||
| 1055 | const unsigned int *bp = bbuf; | ||
| 1056 | unsigned int *rp = rbuf; | ||
| 1057 | |||
| 1058 | CTASSERT(sizeof(bbuf) == sizeof(bnbuf)); | ||
| 1059 | CTASSERT(sizeof(rbuf) == sizeof(bnbuf)); | ||
| 1060 | |||
| 1061 | /* | ||
| 1062 | * Avoid strict aliasing violations by copying from an unsigned | ||
| 1063 | * long array to an unsigned int array, then copying back the | ||
| 1064 | * result. Any sensible compiler will omit the copies, while | ||
| 1065 | * avoiding undefined behaviour that would result from unsafe | ||
| 1066 | * type punning via pointer type casting. | ||
| 1067 | */ | ||
| 1068 | memcpy(bbuf, bnbuf, sizeof(bbuf)); | ||
| 1069 | memcpy(rbuf, r_d, sizeof(rbuf)); | ||
| 1020 | 1070 | ||
| 1021 | acc = rp[0]; | 1071 | acc = rp[0]; |
| 1022 | acc += bp[12 - 12]; | 1072 | acc += bp[12 - 12]; |
| @@ -1131,6 +1181,8 @@ BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, BN_CTX *ctx) | |||
| 1131 | acc -= bp[22 - 12]; | 1181 | acc -= bp[22 - 12]; |
| 1132 | rp[11] = (unsigned int)acc; | 1182 | rp[11] = (unsigned int)acc; |
| 1133 | 1183 | ||
| 1184 | memcpy(r_d, rbuf, sizeof(rbuf)); | ||
| 1185 | |||
| 1134 | carry = (int)(acc >> 32); | 1186 | carry = (int)(acc >> 32); |
| 1135 | } | 1187 | } |
| 1136 | #else | 1188 | #else |
| @@ -1138,7 +1190,7 @@ BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, BN_CTX *ctx) | |||
| 1138 | BN_ULONG t_d[BN_NIST_384_TOP] = {0}; | 1190 | BN_ULONG t_d[BN_NIST_384_TOP] = {0}; |
| 1139 | 1191 | ||
| 1140 | /*S1*/ | 1192 | /*S1*/ |
| 1141 | nist_set_256(t_d, buf.bn, 0, 0, 0, 0, 0, 23 - 4, 22 - 4, | 1193 | nist_set_256(t_d, bnbuf, 0, 0, 0, 0, 0, 23 - 4, 22 - 4, |
| 1142 | 21 - 4); | 1194 | 21 - 4); |
| 1143 | /* left shift */ | 1195 | /* left shift */ |
| 1144 | { | 1196 | { |
| @@ -1155,49 +1207,48 @@ BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, BN_CTX *ctx) | |||
| 1155 | carry = (int)bn_add_words(r_d + (128 / BN_BITS2), | 1207 | carry = (int)bn_add_words(r_d + (128 / BN_BITS2), |
| 1156 | r_d + (128 / BN_BITS2), t_d, BN_NIST_256_TOP); | 1208 | r_d + (128 / BN_BITS2), t_d, BN_NIST_256_TOP); |
| 1157 | /*S2 */ | 1209 | /*S2 */ |
| 1158 | carry += (int)bn_add_words(r_d, r_d, buf.bn, BN_NIST_384_TOP); | 1210 | carry += (int)bn_add_words(r_d, r_d, bnbuf, BN_NIST_384_TOP); |
| 1159 | /*S3*/ | 1211 | /*S3*/ |
| 1160 | nist_set_384(t_d, buf.bn, 20, 19, 18, 17, 16, 15, 14, 13, 12, | 1212 | nist_set_384(t_d, bnbuf, 20, 19, 18, 17, 16, 15, 14, 13, 12, |
| 1161 | 23, 22, 21); | 1213 | 23, 22, 21); |
| 1162 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_384_TOP); | 1214 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_384_TOP); |
| 1163 | /*S4*/ | 1215 | /*S4*/ |
| 1164 | nist_set_384(t_d, buf.bn, 19, 18, 17, 16, 15, 14, 13, 12, 20, | 1216 | nist_set_384(t_d, bnbuf, 19, 18, 17, 16, 15, 14, 13, 12, 20, |
| 1165 | 0, 23, 0); | 1217 | 0, 23, 0); |
| 1166 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_384_TOP); | 1218 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_384_TOP); |
| 1167 | /*S5*/ | 1219 | /*S5*/ |
| 1168 | nist_set_384(t_d, buf.bn, 0,0, 0,0, 23, 22, 21, 20, 0,0, 0, 0); | 1220 | nist_set_384(t_d, bnbuf, 0,0, 0,0, 23, 22, 21, 20, 0,0, 0, 0); |
| 1169 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_384_TOP); | 1221 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_384_TOP); |
| 1170 | /*S6*/ | 1222 | /*S6*/ |
| 1171 | nist_set_384(t_d, buf.bn, 0,0, 0,0, 0,0, 23, 22, 21, 0,0, 20); | 1223 | nist_set_384(t_d, bnbuf, 0,0, 0,0, 0,0, 23, 22, 21, 0,0, 20); |
| 1172 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_384_TOP); | 1224 | carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_384_TOP); |
| 1173 | /*D1*/ | 1225 | /*D1*/ |
| 1174 | nist_set_384(t_d, buf.bn, 22, 21, 20, 19, 18, 17, 16, 15, 14, | 1226 | nist_set_384(t_d, bnbuf, 22, 21, 20, 19, 18, 17, 16, 15, 14, |
| 1175 | 13, 12, 23); | 1227 | 13, 12, 23); |
| 1176 | carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_384_TOP); | 1228 | carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_384_TOP); |
| 1177 | /*D2*/ | 1229 | /*D2*/ |
| 1178 | nist_set_384(t_d, buf.bn, 0,0, 0,0, 0,0, 0,23, 22, 21, 20, 0); | 1230 | nist_set_384(t_d, bnbuf, 0,0, 0,0, 0,0, 0,23, 22, 21, 20, 0); |
| 1179 | carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_384_TOP); | 1231 | carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_384_TOP); |
| 1180 | /*D3*/ | 1232 | /*D3*/ |
| 1181 | nist_set_384(t_d, buf.bn, 0,0, 0,0, 0,0, 0,23, 23, 0,0, 0); | 1233 | nist_set_384(t_d, bnbuf, 0,0, 0,0, 0,0, 0,23, 23, 0,0, 0); |
| 1182 | carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_384_TOP); | 1234 | carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_384_TOP); |
| 1183 | 1235 | ||
| 1184 | } | 1236 | } |
| 1185 | #endif | 1237 | #endif |
| 1186 | /* see BN_nist_mod_224 for explanation */ | 1238 | /* see BN_nist_mod_224 for explanation */ |
| 1187 | u.f = bn_sub_words; | 1239 | addsubf = bn_sub_words; |
| 1188 | if (carry > 0) | 1240 | if (carry > 0) |
| 1189 | carry = (int)bn_sub_words(r_d, r_d, _nist_p_384[carry - 1], | 1241 | carry = (int)bn_sub_words(r_d, r_d, _nist_p_384[carry - 1], |
| 1190 | BN_NIST_384_TOP); | 1242 | BN_NIST_384_TOP); |
| 1191 | else if (carry < 0) { | 1243 | else if (carry < 0) { |
| 1192 | carry = (int)bn_add_words(r_d, r_d, _nist_p_384[-carry - 1], | 1244 | carry = (int)bn_add_words(r_d, r_d, _nist_p_384[-carry - 1], |
| 1193 | BN_NIST_384_TOP); | 1245 | BN_NIST_384_TOP); |
| 1194 | mask = 0 - (uintptr_t)carry; | 1246 | if (carry == 0) |
| 1195 | u.p = ((uintptr_t)bn_sub_words & mask) | | 1247 | addsubf = bn_add_words; |
| 1196 | ((uintptr_t)bn_add_words & ~mask); | ||
| 1197 | } else | 1248 | } else |
| 1198 | carry = 1; | 1249 | carry = 1; |
| 1199 | 1250 | ||
| 1200 | mask = 0 - (uintptr_t)(*u.f)(c_d, r_d, _nist_p_384[0], BN_NIST_384_TOP); | 1251 | mask = 0 - (uintptr_t)(*addsubf)(c_d, r_d, _nist_p_384[0], BN_NIST_384_TOP); |
| 1201 | mask &= 0 - (uintptr_t)carry; | 1252 | mask &= 0 - (uintptr_t)carry; |
| 1202 | res = c_d; | 1253 | res = c_d; |
| 1203 | res = (BN_ULONG *)(((uintptr_t)res & ~mask) | ((uintptr_t)r_d & mask)); | 1254 | res = (BN_ULONG *)(((uintptr_t)res & ~mask) | ((uintptr_t)r_d & mask)); |
