void ed_mul_pre_nafwi(ed_t *t, const ed_t p) { int l; bn_t n; bn_null(n); TRY { bn_new(n); ed_curve_get_ord(n); l = bn_bits(n) + 1; l = ((l % ED_DEPTH) == 0 ? (l / ED_DEPTH) : (l / ED_DEPTH) + 1); ed_copy(t[0], p); for (int i = 1; i < l; i++) { ed_dbl(t[i], t[i - 1]); for (int j = 1; j < ED_DEPTH; j++) { ed_dbl(t[i], t[i]); } } ed_norm_sim(t + 1, (const ed_t *)t + 1, l - 1); } CATCH_ANY { THROW(ERR_CAUGHT); } FINALLY { bn_free(n); } }
void ed_mul_pre_combd(ed_t *t, const ed_t p) { int i, j, d, e; bn_t n; bn_null(n); TRY { bn_new(n); ed_curve_get_ord(n); d = bn_bits(n); d = ((d % ED_DEPTH) == 0 ? (d / ED_DEPTH) : (d / ED_DEPTH) + 1); e = (d % 2 == 0 ? (d / 2) : (d / 2) + 1); ed_set_infty(t[0]); ed_copy(t[1], p); for (j = 1; j < ED_DEPTH; j++) { ed_dbl(t[1 << j], t[1 << (j - 1)]); for (i = 1; i < d; i++) { ed_dbl(t[1 << j], t[1 << j]); } #if defined(ED_MIXED) ed_norm(t[1 << j], t[1 << j]); #endif for (i = 1; i < (1 << j); i++) { ed_add(t[(1 << j) + i], t[i], t[1 << j]); } } ed_set_infty(t[1 << ED_DEPTH]); for (j = 1; j < (1 << ED_DEPTH); j++) { ed_dbl(t[(1 << ED_DEPTH) + j], t[j]); for (i = 1; i < e; i++) { ed_dbl(t[(1 << ED_DEPTH) + j], t[(1 << ED_DEPTH) + j]); } } ed_norm_sim(t + 2, (const ed_t *)t + 2, (1 << ED_DEPTH) - 2); ed_norm_sim(t + (1 << ED_DEPTH) + 1, (const ed_t *)t + (1 << ED_DEPTH) + 1, (1 << ED_DEPTH) - 1); } CATCH_ANY { THROW(ERR_CAUGHT); } FINALLY { bn_free(n); } }
void ed_tab(ed_t *t, const ed_t p, int w) { if (w > 2) { ed_dbl(t[0], p); #if defined(ED_MIXED) ed_norm(t[0], t[0]); #endif ed_add(t[1], t[0], p); for (int i = 2; i < (1 << (w - 2)); i++) { ed_add(t[i], t[i - 1], t[0]); } #if defined(ED_MIXED) ed_norm_sim(t + 1, (const ed_t *)t + 1, (1 << (w - 2)) - 1); #endif } ed_copy(t[0], p); }
void ed_mul_pre_combs(ed_t *t, const ed_t p) { int i, j, l; bn_t n; bn_null(n); TRY { bn_new(n); ed_curve_get_ord(n); l = bn_bits(n); l = ((l % ED_DEPTH) == 0 ? (l / ED_DEPTH) : (l / ED_DEPTH) + 1); #if defined(ED_ENDOM) if (ed_curve_is_endom()) { l = bn_bits(n); l = ((l % (2 * ED_DEPTH)) == 0 ? (l / (2 * ED_DEPTH)) : (l / (2 * ED_DEPTH)) + 1); } #endif ed_set_infty(t[0]); ed_copy(t[1], p); for (j = 1; j < ED_DEPTH; j++) { ed_dbl(t[1 << j], t[1 << (j - 1)]); for (i = 1; i < l; i++) { ed_dbl(t[1 << j], t[1 << j]); } #if defined(ED_MIXED) ed_norm(t[1 << j], t[1 << j]); #endif for (i = 1; i < (1 << j); i++) { ed_add(t[(1 << j) + i], t[i], t[1 << j]); } } ed_norm_sim(t + 2, (const ed_t *)t + 2, ED_TABLE_COMBS - 2); } CATCH_ANY { THROW(ERR_CAUGHT); } FINALLY { bn_free(n); } }
void ed_mul_pre_basic(ed_t *t, const ed_t p) { bn_t n; bn_null(n); TRY { bn_new(n); ed_curve_get_ord(n); ed_copy(t[0], p); for (int i = 1; i < bn_bits(n); i++) { ed_dbl(t[i], t[i - 1]); } ed_norm_sim(t + 1, (const ed_t *)t + 1, bn_bits(n) - 1); } CATCH_ANY { THROW(ERR_CAUGHT); } FINALLY { bn_free(n); } }
void ed_mul_slide(ed_t r, const ed_t p, const bn_t k) { ed_t t[1 << (EP_WIDTH - 1)], q; int i, j, l; uint8_t win[RLC_FP_BITS + 1]; ed_null(q); if (bn_is_zero(k) || ed_is_infty(p)) { ed_set_infty(r); return; } TRY { for (i = 0; i < (1 << (EP_WIDTH - 1)); i ++) { ed_null(t[i]); ed_new(t[i]); } ed_new(q); ed_copy(t[0], p); ed_dbl(q, p); #if defined(EP_MIXED) ed_norm(q, q); #endif /* Create table. */ for (i = 1; i < (1 << (EP_WIDTH - 1)); i++) { ed_add(t[i], t[i - 1], q); } #if defined(EP_MIXED) ed_norm_sim(t + 1, (const ed_t *)t + 1, (1 << (EP_WIDTH - 1)) - 1); #endif ed_set_infty(q); l = RLC_FP_BITS + 1; bn_rec_slw(win, &l, k, EP_WIDTH); for (i = 0; i < l; i++) { if (win[i] == 0) { ed_dbl(q, q); } else { for (j = 0; j < util_bits_dig(win[i]); j++) { ed_dbl(q, q); } ed_add(q, q, t[win[i] >> 1]); } } ed_norm(r, q); if (bn_sign(k) == RLC_NEG) { ed_neg(r, r); } } CATCH_ANY { THROW(ERR_CAUGHT); } FINALLY { for (i = 0; i < (1 << (EP_WIDTH - 1)); i++) { ed_free(t[i]); } ed_free(q); } }