Add API for internal functions.
diff --git a/uECC.c b/uECC.c index c1e8794..e5336a0 100644 --- a/uECC.c +++ b/uECC.c
@@ -1281,3 +1281,157 @@ /* Accept only if v == r. */ return (vli_cmp(rx, r, curve->num_words) == 0); } + + +/* -------- "Internal" API -------- */ +unsigned uECC_curve_num_words(uECC_Curve curve) { + return curve->num_words; +} + +unsigned uECC_curve_num_bits(uECC_Curve curve) { + return curve->num_bytes * 8; +} + +unsigned uECC_curve_num_n_words(uECC_Curve curve) { + return curve->num_n_words; +} + +const uECC_word_t *uECC_curve_p(uECC_Curve curve) { + return curve->p; +} + +const uECC_word_t *uECC_curve_n(uECC_Curve curve) { + return curve->n; +} + +const uECC_word_t *uECC_curve_G(uECC_Curve curve) { + return curve->G; +} + +const uECC_word_t *uECC_curve_b(uECC_Curve curve) { + return curve->b; +} + +/* Calculates a = sqrt(a) (mod curve->p) */ +void uECC_mod_sqrt(uECC_word_t *a, uECC_Curve curve) { + curve->mod_sqrt(a, curve); +} + +/* Calculates result = product (mod curve->p), where product is up to + 2 * curve->num_words long. */ +void uECC_mmod_fast(uECC_word_t *result, uECC_word_t *product, uECC_Curve curve) { +#if (uECC_OPTIMIZATION_LEVEL > 0) + curve->mmod_fast(result, product); +#else + vli_mmod(result, product, curve->p, curve->num_words); +#endif +} + +void uECC_vli_clear(uECC_word_t *vli, unsigned num_words) { + vli_clear(vli, num_words); +} + +int uECC_vli_isZero(const uECC_word_t *vli, unsigned num_words) { + return vli_isZero(vli, num_words); +} + +int uECC_vli_testBit(const uECC_word_t *vli, unsigned bit) { + return vli_testBit(vli, bit); +} + +unsigned uECC_vli_numBits(const uECC_word_t *vli, unsigned max_words) { + return uECC_vli_numBits(vli, max_words); +} + +void uECC_vli_set(uECC_word_t *dest, const uECC_word_t *src, unsigned num_words) { + vli_set(dest, src, num_words); +} + +int uECC_vli_cmp(const uECC_word_t *left, + const uECC_word_t *right, + unsigned num_words) { + return vli_cmp(left, right, num_words); +} + +void uECC_vli_rshift1(uECC_word_t *vli, unsigned num_words) { + vli_rshift1(vli, num_words); +} + +uECC_word_t uECC_vli_add(uECC_word_t *result, + const uECC_word_t *left, + const uECC_word_t *right, + unsigned num_words) { + return vli_add(result, left, right, num_words); +} + +uECC_word_t uECC_vli_sub(uECC_word_t *result, + const uECC_word_t *left, + const uECC_word_t *right, + unsigned num_words) { + return vli_sub(result, left, right, num_words); +} + +void uECC_vli_mult(uECC_word_t *result, + const uECC_word_t *left, + const uECC_word_t *right, + unsigned num_words) { + vli_mult(result, left, right, num_words); +} + +void uECC_vli_square(uECC_word_t *result, const uECC_word_t *left, unsigned num_words) { + vli_square(result, left, num_words); +} + +/* Computes result = (left + right) % mod. + Assumes that left < mod and right < mod, and that result does not overlap mod. */ +void uECC_vli_modAdd(uECC_word_t *result, + const uECC_word_t *left, + const uECC_word_t *right, + const uECC_word_t *mod, + unsigned num_words) { + vli_modAdd(result, left, right, mod, num_words); +} + +/* Computes result = (left - right) % mod. + Assumes that left < mod and right < mod, and that result does not overlap mod. */ +void uECC_vli_modSub(uECC_word_t *result, + const uECC_word_t *left, + const uECC_word_t *right, + const uECC_word_t *mod, + unsigned num_words) { + vli_modSub(result, left, right, mod, num_words); +} + +/* Computes result = product % mod, where product is 2 * num_words long. */ +/* Currently only designed to work for curve_p or curve_n. */ +void uECC_vli_mmod(uECC_word_t *result, + uECC_word_t *product, + const uECC_word_t *mod, + unsigned num_words) { + vli_mmod(result, product, mod, num_words); +} + +/* Computes result = 1 / input (mod m) */ +void uECC_vli_modInv(uECC_word_t *result, + const uECC_word_t *input, + const uECC_word_t *m, + unsigned num_words) { + vli_modInv(result, input, m, num_words); +} + +/* Multiply a point by a scalar. Points are represented by the X coordinate followed by + the Y coordinate in the same array, both coordinates are curve->num_words long. Note + that scalar must be curve->num_n_words long (NOT curve->num_words). */ +void uECC_point_mult(uECC_word_t *result, + uECC_word_t *point, + uECC_word_t *scalar, + uECC_Curve curve) { + uECC_word_t tmp1[uECC_MAX_WORDS]; + uECC_word_t tmp2[uECC_MAX_WORDS]; + uECC_word_t *p2[2] = {tmp1, tmp2}; + uECC_word_t carry = regularize_k(scalar, tmp1, tmp2, curve); + + EccPoint_mult(result, point, p2[!carry], 0, + vli_numBits(curve->n, curve->num_n_words) + 1, + curve); +}