.. | .. |
---|
610 | 610 | BIGNUM **modulusp, BIGNUM **exponent_BN, BIGNUM **r_squaredp, |
---|
611 | 611 | BIGNUM **c_factorp, BIGNUM **np_factorp) |
---|
612 | 612 | { |
---|
613 | | - BIGNUM *big1, *big2, *big32, *big2_32, *big4100, *big2180; |
---|
| 613 | + BIGNUM *big1, *big2, *big32, *big2_32, *big4100, *big2180, *big4228; |
---|
614 | 614 | BIGNUM *n, *e, *r, *r_squared, *tmp, *c_factor, *np_factor; |
---|
615 | 615 | const BIGNUM *key_n, *key_e; |
---|
616 | 616 | BN_CTX *bn_ctx = BN_CTX_new(); |
---|
.. | .. |
---|
622 | 622 | big32 = BN_new(); |
---|
623 | 623 | big4100 = BN_new(); |
---|
624 | 624 | big2180 = BN_new(); |
---|
| 625 | + big4228 = BN_new(); |
---|
625 | 626 | |
---|
626 | 627 | r = BN_new(); |
---|
627 | 628 | r_squared = BN_new(); |
---|
.. | .. |
---|
631 | 632 | big2_32 = BN_new(); |
---|
632 | 633 | n = BN_new(); |
---|
633 | 634 | e = BN_new(); |
---|
634 | | - if (!big1 || !big2 || !big32 || !big4100 || !big2180 || !r || |
---|
| 635 | + if (!big1 || !big2 || !big32 || !big4100 || !big2180 || !big4228 || !r || |
---|
635 | 636 | !r_squared || !tmp || !big2_32 || !n || !e || |
---|
636 | 637 | !c_factor || !np_factor) { |
---|
637 | 638 | fprintf(stderr, "Out of memory (bignum)\n"); |
---|
.. | .. |
---|
645 | 646 | if (!BN_copy(n, key_n) || !BN_copy(e, key_e) || |
---|
646 | 647 | !BN_set_word(big1, 1L) || |
---|
647 | 648 | !BN_set_word(big2, 2L) || !BN_set_word(big32, 32L) || |
---|
648 | | - !BN_set_word(big4100, 4100L) || !BN_set_word(big2180, 2180L)) |
---|
| 649 | + !BN_set_word(big4100, 4100L) || !BN_set_word(big2180, 2180L) || |
---|
| 650 | + !BN_set_word(big4228, 4228L)) |
---|
649 | 651 | ret = -1; |
---|
650 | 652 | |
---|
651 | 653 | /* big2_32 = 2^32 */ |
---|
.. | .. |
---|
675 | 677 | ret = -1; |
---|
676 | 678 | |
---|
677 | 679 | /* Calculate np_factor = 2^2180 div n */ |
---|
678 | | - if (!BN_exp(tmp, big2, big2180, bn_ctx) || |
---|
679 | | - !BN_div(np_factor, NULL, tmp, n, bn_ctx)) |
---|
680 | | - ret = -1; |
---|
| 680 | + if (BN_num_bits(n) == 2048) { |
---|
| 681 | + if (!BN_exp(tmp, big2, big2180, bn_ctx) || |
---|
| 682 | + !BN_div(np_factor, NULL, tmp, n, bn_ctx)) |
---|
| 683 | + ret = -1; |
---|
| 684 | + } else {/* Calculate 4096 np_factor = 2^4228 div n */ |
---|
| 685 | + if (!BN_exp(tmp, big2, big4228, bn_ctx) || |
---|
| 686 | + !BN_div(np_factor, NULL, tmp, n, bn_ctx)) |
---|
| 687 | + ret = -1; |
---|
| 688 | + } |
---|
681 | 689 | |
---|
682 | 690 | *modulusp = n; |
---|
683 | 691 | *exponent_BN = e; |
---|
.. | .. |
---|
690 | 698 | BN_free(big32); |
---|
691 | 699 | BN_free(big4100); |
---|
692 | 700 | BN_free(big2180); |
---|
| 701 | + BN_free(big4228); |
---|
693 | 702 | BN_free(r); |
---|
694 | 703 | BN_free(tmp); |
---|
695 | 704 | BN_free(big2_32); |
---|