| OLD | NEW |
| 1 /* This Source Code Form is subject to the terms of the Mozilla Public | 1 /* This Source Code Form is subject to the terms of the Mozilla Public |
| 2 * License, v. 2.0. If a copy of the MPL was not distributed with this | 2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
| 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| 4 | 4 |
| 5 /* This file implements moduluar exponentiation using Montgomery's | 5 /* This file implements moduluar exponentiation using Montgomery's |
| 6 * method for modular reduction. This file implements the method | 6 * method for modular reduction. This file implements the method |
| 7 * described as "Improvement 2" in the paper "A Cryptogrpahic Library for | 7 * described as "Improvement 2" in the paper "A Cryptogrpahic Library for |
| 8 * the Motorola DSP56000" by Stephen R. Dusse' and Burton S. Kaliski Jr. | 8 * the Motorola DSP56000" by Stephen R. Dusse' and Burton S. Kaliski Jr. |
| 9 * published in "Advances in Cryptology: Proceedings of EUROCRYPT '90" | 9 * published in "Advances in Cryptology: Proceedings of EUROCRYPT '90" |
| 10 * "Lecture Notes in Computer Science" volume 473, 1991, pg 230-244, | 10 * "Lecture Notes in Computer Science" volume 473, 1991, pg 230-244, |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 mp_err s_mp_redc(mp_int *T, mp_mont_modulus *mmm) | 40 mp_err s_mp_redc(mp_int *T, mp_mont_modulus *mmm) |
| 41 { | 41 { |
| 42 mp_err res; | 42 mp_err res; |
| 43 mp_size i; | 43 mp_size i; |
| 44 | 44 |
| 45 i = (MP_USED(&mmm->N) << 1) + 1; | 45 i = (MP_USED(&mmm->N) << 1) + 1; |
| 46 MP_CHECKOK( s_mp_pad(T, i) ); | 46 MP_CHECKOK( s_mp_pad(T, i) ); |
| 47 for (i = 0; i < MP_USED(&mmm->N); ++i ) { | 47 for (i = 0; i < MP_USED(&mmm->N); ++i ) { |
| 48 mp_digit m_i = MP_DIGIT(T, i) * mmm->n0prime; | 48 mp_digit m_i = MP_DIGIT(T, i) * mmm->n0prime; |
| 49 /* T += N * m_i * (MP_RADIX ** i); */ | 49 /* T += N * m_i * (MP_RADIX ** i); */ |
| 50 MP_CHECKOK( s_mp_mul_d_add_offset(&mmm->N, m_i, T, i) ); | 50 s_mp_mul_d_add_offset(&mmm->N, m_i, T, i); |
| 51 } | 51 } |
| 52 s_mp_clamp(T); | 52 s_mp_clamp(T); |
| 53 | 53 |
| 54 /* T /= R */ | 54 /* T /= R */ |
| 55 s_mp_rshd( T, MP_USED(&mmm->N) ); | 55 s_mp_rshd( T, MP_USED(&mmm->N) ); |
| 56 | 56 |
| 57 if ((res = s_mp_cmp(T, &mmm->N)) >= 0) { | 57 if ((res = s_mp_cmp(T, &mmm->N)) >= 0) { |
| 58 /* T = T - N */ | 58 /* T = T - N */ |
| 59 MP_CHECKOK( s_mp_sub(T, &mmm->N) ); | 59 MP_CHECKOK( s_mp_sub(T, &mmm->N) ); |
| 60 #ifdef DEBUG | 60 #ifdef DEBUG |
| (...skipping 1108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1169 | 1169 |
| 1170 CLEANUP: | 1170 CLEANUP: |
| 1171 mp_clear(&montBase); | 1171 mp_clear(&montBase); |
| 1172 mp_clear(&goodBase); | 1172 mp_clear(&goodBase); |
| 1173 /* Don't mp_clear mmm.N because it is merely a copy of modulus. | 1173 /* Don't mp_clear mmm.N because it is merely a copy of modulus. |
| 1174 ** Just zap it. | 1174 ** Just zap it. |
| 1175 */ | 1175 */ |
| 1176 memset(&mmm, 0, sizeof mmm); | 1176 memset(&mmm, 0, sizeof mmm); |
| 1177 return res; | 1177 return res; |
| 1178 } | 1178 } |
| OLD | NEW |