aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/math/numbertheory/monty_exp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/math/numbertheory/monty_exp.cpp')
-rw-r--r--src/lib/math/numbertheory/monty_exp.cpp16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/lib/math/numbertheory/monty_exp.cpp b/src/lib/math/numbertheory/monty_exp.cpp
index 62ba8fcc5..f067f33f8 100644
--- a/src/lib/math/numbertheory/monty_exp.cpp
+++ b/src/lib/math/numbertheory/monty_exp.cpp
@@ -76,22 +76,26 @@ void const_time_lookup(secure_vector<word>& output,
const std::vector<Montgomery_Int>& g,
size_t nibble)
{
+ BOTAN_ASSERT_NOMSG(g.size() % 2 == 0); // actually a power of 2
+
const size_t words = output.size();
clear_mem(output.data(), output.size());
- for(size_t i = 0; i != g.size(); ++i)
+ for(size_t i = 0; i != g.size(); i += 2)
{
- const secure_vector<word>& vec = g[i].repr().get_word_vector();
+ const secure_vector<word>& vec_0 = g[i ].repr().get_word_vector();
+ const secure_vector<word>& vec_1 = g[i+1].repr().get_word_vector();
- BOTAN_ASSERT(vec.size() >= words,
- "Word size as expected in const_time_lookup");
+ BOTAN_ASSERT_NOMSG(vec_0.size() >= words && vec_1.size() >= words);
- const auto mask = CT::Mask<word>::is_equal(i, nibble);
+ const auto mask_0 = CT::Mask<word>::is_equal(nibble, i);
+ const auto mask_1 = CT::Mask<word>::is_equal(nibble, i+1);
for(size_t w = 0; w != words; ++w)
{
- output[w] |= mask.if_set_return(vec[w]);
+ output[w] |= mask_0.if_set_return(vec_0[w]);
+ output[w] |= mask_1.if_set_return(vec_1[w]);
}
}
}