9 #include <botan/internal/mp_core.h>
10 #include <botan/internal/mp_asm.h>
11 #include <botan/internal/mp_asmi.h>
12 #include <botan/mem_ops.h>
22 const word p[],
size_t p_size,
23 word p_dash, word ws[])
25 const size_t blocks_of_8 = p_size - (p_size % 8);
27 for(
size_t i = 0; i != p_size; ++i)
31 const word y = z_i[0] * p_dash;
40 for(
size_t j = 0; j != blocks_of_8; j += 8)
43 for(
size_t j = blocks_of_8; j != p_size; ++j)
46 word z_sum = z_i[p_size] + carry;
47 carry = (z_sum < z_i[p_size]);
50 for(
size_t j = p_size + 1; carry && j != z_size - i; ++j)
58 for(
size_t i = 0; i != p_size; ++i)
59 ws[i] =
word_sub(z[p_size + i], p[i], &borrow);
61 ws[p_size] =
word_sub(z[p_size+p_size], 0, &borrow);
63 copy_mem(ws + p_size + 1, z + p_size, p_size + 1);
65 copy_mem(z, ws + borrow*(p_size+1), p_size + 1);
66 clear_mem(z + p_size + 1, z_size - p_size - 1);
70 const word x[],
size_t x_size,
size_t x_sw,
71 const word y[],
size_t y_size,
size_t y_sw,
72 const word p[],
size_t p_size, word p_dash,
80 &p[0], p_size, p_dash,
85 const word x[],
size_t x_size,
size_t x_sw,
86 const word p[],
size_t p_size, word p_dash,
93 &p[0], p_size, p_dash,
void clear_mem(T *ptr, size_t n)
word word_madd3(word a, word b, word c, word *d)
void bigint_monty_sqr(word z[], size_t z_size, const word x[], size_t x_size, size_t x_sw, const word p[], size_t p_size, word p_dash, word workspace[])
word word8_madd3(word z[8], const word x[8], word y, word carry)
void bigint_monty_redc(word z[], size_t z_size, const word p[], size_t p_size, word p_dash, word workspace[])
void bigint_sqr(word z[], size_t z_size, word workspace[], const word x[], size_t x_size, size_t x_sw)
void copy_mem(T *out, const T *in, size_t n)
void bigint_monty_mul(word z[], size_t z_size, const word x[], size_t x_size, size_t x_sw, const word y[], size_t y_size, size_t y_sw, const word p[], size_t p_size, word p_dash, word workspace[])
void bigint_mul(word z[], size_t z_size, word workspace[], const word x[], size_t x_size, size_t x_sw, const word y[], size_t y_size, size_t y_sw)
word word_sub(word x, word y, word *carry)