| .. | .. |
|---|
| 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); |
|---|