10#include <botan/internal/mp_core.h>
12#include <botan/assert.h>
28 while(lower < bound) {
29 const size_t upper = bound - lower;
32 accum.mul(ws[lower], p[upper]);
33 accum.mul(ws[lower + 1], p[upper - 1]);
34 accum.mul(ws[lower + 2], p[upper - 2]);
35 accum.mul(ws[lower + 3], p[upper - 3]);
36 accum.mul(ws[lower + 4], p[upper - 4]);
37 accum.mul(ws[lower + 5], p[upper - 5]);
38 accum.mul(ws[lower + 6], p[upper - 6]);
39 accum.mul(ws[lower + 7], p[upper - 7]);
40 accum.mul(ws[lower + 8], p[upper - 8]);
41 accum.mul(ws[lower + 9], p[upper - 9]);
42 accum.mul(ws[lower + 10], p[upper - 10]);
43 accum.mul(ws[lower + 11], p[upper - 11]);
44 accum.mul(ws[lower + 12], p[upper - 12]);
45 accum.mul(ws[lower + 13], p[upper - 13]);
46 accum.mul(ws[lower + 14], p[upper - 14]);
47 accum.mul(ws[lower + 15], p[upper - 15]);
49 }
else if(upper >= 8) {
50 accum.mul(ws[lower], p[upper]);
51 accum.mul(ws[lower + 1], p[upper - 1]);
52 accum.mul(ws[lower + 2], p[upper - 2]);
53 accum.mul(ws[lower + 3], p[upper - 3]);
54 accum.mul(ws[lower + 4], p[upper - 4]);
55 accum.mul(ws[lower + 5], p[upper - 5]);
56 accum.mul(ws[lower + 6], p[upper - 6]);
57 accum.mul(ws[lower + 7], p[upper - 7]);
59 }
else if(upper >= 4) {
60 accum.mul(ws[lower], p[upper]);
61 accum.mul(ws[lower + 1], p[upper - 1]);
62 accum.mul(ws[lower + 2], p[upper - 2]);
63 accum.mul(ws[lower + 3], p[upper - 3]);
65 }
else if(upper >= 2) {
66 accum.mul(ws[lower], p[upper]);
67 accum.mul(ws[lower + 1], p[upper - 1]);
70 accum.mul(ws[lower], p[upper]);
91 word r[],
const word z[],
size_t z_size,
const word p[],
size_t p_size,
word p_dash,
word ws[]) {
92 BOTAN_ARG_CHECK(z_size >= 2 * p_size && p_size > 0,
"Invalid sizes for bigint_monty_redc_generic");
100 for(
size_t i = 1; i != p_size; ++i) {
101 mul_rev_range(accum, ws, p, i);
106 for(
size_t i = 0; i != p_size - 1; ++i) {
107 mul_rev_range(accum, &ws[i + 1], &p[i], p_size - (i + 1));
108 accum.
add(z[p_size + i]);
112 accum.
add(z[2 * p_size - 1]);
114 ws[p_size - 1] = accum.
extract();
#define BOTAN_ARG_CHECK(expr, msg)
constexpr W monty_step(W p0, W p_dash)
#define BOTAN_FORCE_INLINE
BOTAN_FUZZER_API void bigint_monty_redc_generic(word r[], const word z[], size_t z_size, const word p[], size_t p_size, word p_dash, word ws[])
constexpr void bigint_monty_maybe_sub(size_t N, W z[], W x0, const W x[], const W p[])
std::conditional_t< HasNative64BitRegisters, std::uint64_t, uint32_t > word