diff options
Diffstat (limited to 'nss/lib/freebl/ecl/ec_naf.c')
-rw-r--r-- | nss/lib/freebl/ecl/ec_naf.c | 85 |
1 files changed, 42 insertions, 43 deletions
diff --git a/nss/lib/freebl/ecl/ec_naf.c b/nss/lib/freebl/ecl/ec_naf.c index 3db6f30..cad08cb 100644 --- a/nss/lib/freebl/ecl/ec_naf.c +++ b/nss/lib/freebl/ecl/ec_naf.c @@ -4,22 +4,22 @@ #include "ecl-priv.h" -/* Returns 2^e as an integer. This is meant to be used for small powers of +/* Returns 2^e as an integer. This is meant to be used for small powers of * two. */ int ec_twoTo(int e) { - int a = 1; - int i; + int a = 1; + int i; - for (i = 0; i < e; i++) { - a *= 2; - } - return a; + for (i = 0; i < e; i++) { + a *= 2; + } + return a; } /* Computes the windowed non-adjacent-form (NAF) of a scalar. Out should - * be an array of signed char's to output to, bitsize should be the number + * be an array of signed char's to output to, bitsize should be the number * of bits of out, in is the original scalar, and w is the window size. * NAF is discussed in the paper: D. Hankerson, J. Hernandez and A. * Menezes, "Software implementation of elliptic curve cryptography over @@ -27,43 +27,42 @@ ec_twoTo(int e) mp_err ec_compute_wNAF(signed char *out, int bitsize, const mp_int *in, int w) { - mp_int k; - mp_err res = MP_OKAY; - int i, twowm1, mask; + mp_int k; + mp_err res = MP_OKAY; + int i, twowm1, mask; - twowm1 = ec_twoTo(w - 1); - mask = 2 * twowm1 - 1; + twowm1 = ec_twoTo(w - 1); + mask = 2 * twowm1 - 1; - MP_DIGITS(&k) = 0; - MP_CHECKOK(mp_init_copy(&k, in)); + MP_DIGITS(&k) = 0; + MP_CHECKOK(mp_init_copy(&k, in)); - i = 0; - /* Compute wNAF form */ - while (mp_cmp_z(&k) > 0) { - if (mp_isodd(&k)) { - out[i] = MP_DIGIT(&k, 0) & mask; - if (out[i] >= twowm1) - out[i] -= 2 * twowm1; - - /* Subtract off out[i]. Note mp_sub_d only works with - * unsigned digits */ - if (out[i] >= 0) { - mp_sub_d(&k, out[i], &k); - } else { - mp_add_d(&k, -(out[i]), &k); - } - } else { - out[i] = 0; - } - mp_div_2(&k, &k); - i++; - } - /* Zero out the remaining elements of the out array. */ - for (; i < bitsize + 1; i++) { - out[i] = 0; - } - CLEANUP: - mp_clear(&k); - return res; + i = 0; + /* Compute wNAF form */ + while (mp_cmp_z(&k) > 0) { + if (mp_isodd(&k)) { + out[i] = MP_DIGIT(&k, 0) & mask; + if (out[i] >= twowm1) + out[i] -= 2 * twowm1; + /* Subtract off out[i]. Note mp_sub_d only works with + * unsigned digits */ + if (out[i] >= 0) { + MP_CHECKOK(mp_sub_d(&k, out[i], &k)); + } else { + MP_CHECKOK(mp_add_d(&k, -(out[i]), &k)); + } + } else { + out[i] = 0; + } + MP_CHECKOK(mp_div_2(&k, &k)); + i++; + } + /* Zero out the remaining elements of the out array. */ + for (; i < bitsize + 1; i++) { + out[i] = 0; + } +CLEANUP: + mp_clear(&k); + return res; } |