#include "mult.h" #include "point.h" void scalar_mult_inner(bn_t *scalar, point_t *point, curve_t *curve, point_t *out) { point_t *q = point_copy(point); point_t *r = point_copy(curve->neutral); {% if scalarmult.complete %} size_t bits = bn_bit_length(&curve->n); {% else %} size_t bits = bn_bit_length(scalar); {% endif %} {%- if scalarmult.always %} point_t *dummy = point_new(); {%- endif %} bn_t copy; bn_init(©); bn_copy(scalar, ©); for (int i = 0; i < bits; i++) { if (bn_get_bit(©, 0) == 1) { point_accumulate(r, q, curve, r); } else { {%- if scalarmult.always %} point_accumulate(r, q, curve, dummy); {%- endif %} } point_dbl(q, curve, q); bn_rsh(©, 1, ©); } {%- if "scl" in scalarmult.formulas %} point_scl(r, curve, r); {%- endif %} point_set(r, out); point_free(q); point_free(r); bn_clear(©); {%- if scalarmult.always %} point_free(dummy); {%- endif %} }