aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/powm_mnt.cpp31
1 files changed, 13 insertions, 18 deletions
diff --git a/src/powm_mnt.cpp b/src/powm_mnt.cpp
index d28bfacfe..f527927b5 100644
--- a/src/powm_mnt.cpp
+++ b/src/powm_mnt.cpp
@@ -14,13 +14,19 @@ namespace {
/*************************************************
* Montgomery Reduction *
*************************************************/
-void montgomery_reduce(word z[], u32bit z_size,
- const word x[], u32bit x_size, word u)
+inline void montgomery_reduce(BigInt& out, MemoryRegion<word>& z_buf,
+ const BigInt& x_bn, u32bit x_size, word u)
{
+ const word* x = x_bn.data();
+ word* z = z_buf.begin();
+ u32bit z_size = z_buf.size();
+
bigint_monty_redc(z, z_size, x, x_size, u);
if(bigint_cmp(z + x_size, x_size + 1, x, x_size) >= 0)
bigint_sub2(z + x_size, x_size + 1, x, x_size);
+
+ out.get_reg().set(z + x_size, x_size + 1);
}
/*************************************************
@@ -83,9 +89,7 @@ void Montgomery_Exponentiator::set_base(const BigInt& base)
g[0].data(), g[0].size(), g[0].sig_words(),
R2.data(), R2.size(), R2.sig_words());
- montgomery_reduce(z.begin(), z.size(), modulus.data(), mod_words,
- mod_prime);
- g[0].get_reg().set(z + mod_words, mod_words + 1);
+ montgomery_reduce(g[0], z, modulus, mod_words, mod_prime);
const BigInt& x = g[0];
const u32bit x_sig = x.sig_words();
@@ -100,10 +104,7 @@ void Montgomery_Exponentiator::set_base(const BigInt& base)
x.data(), x.size(), x_sig,
y.data(), y.size(), y_sig);
- montgomery_reduce(z.begin(), z.size(), modulus.data(), mod_words,
- mod_prime);
-
- g[j].get_reg().set(z + mod_words, mod_words + 1);
+ montgomery_reduce(g[j], z, modulus, mod_words, mod_prime);
}
}
@@ -126,9 +127,7 @@ BigInt Montgomery_Exponentiator::execute() const
bigint_sqr(z.begin(), z.size(), workspace,
x.data(), x.size(), x.sig_words());
- montgomery_reduce(z.begin(), z.size(), modulus.data(), mod_words,
- mod_prime);
- x.get_reg().set(z + mod_words, mod_words + 1);
+ montgomery_reduce(x, z, modulus, mod_words, mod_prime);
}
u32bit nibble = exp.get_substring(window_bits*(j-1), window_bits);
@@ -141,18 +140,14 @@ BigInt Montgomery_Exponentiator::execute() const
x.data(), x.size(), x.sig_words(),
y.data(), y.size(), y.sig_words());
- montgomery_reduce(z.begin(), z.size(), modulus.data(), mod_words,
- mod_prime);
- x.get_reg().set(z + mod_words, mod_words + 1);
+ montgomery_reduce(x, z, modulus, mod_words, mod_prime);
}
}
z.clear();
z.copy(x.data(), x.size());
- montgomery_reduce(z.begin(), z.size(), modulus.data(), mod_words,
- mod_prime);
- x.get_reg().set(z + mod_words, mod_words + 1);
+ montgomery_reduce(x, z, modulus, mod_words, mod_prime);
return x;
}