mirror of
https://github.com/kmackay/micro-ecc.git
synced 2026-08-27 12:20:07 +00:00
Cleaned things up a bit.
This commit is contained in:
@@ -43,12 +43,12 @@ static uint32_t curve_p[NUM_ECC_DIGITS] = CONCAT(Curve_P_, ECC_CURVE);
|
||||
static EccPoint curve_G = CONCAT(Curve_G_, ECC_CURVE);
|
||||
static uint32_t curve_n[NUM_ECC_DIGITS] = CONCAT(Curve_N_, ECC_CURVE);
|
||||
|
||||
static void fast_clear(uint32_t *p_array)
|
||||
static void vli_clear(uint32_t *p_vli)
|
||||
{
|
||||
uint i;
|
||||
for(i=0; i<NUM_ECC_DIGITS; ++i)
|
||||
{
|
||||
p_array[i] = 0;
|
||||
p_vli[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -210,32 +210,6 @@ static uint32_t vli_sub(uint32_t *p_result, uint32_t *p_left, uint32_t *p_right)
|
||||
}
|
||||
|
||||
/* Computes p_result = p_left * p_right. */
|
||||
#if ECC_MULT64
|
||||
static void vli_mult(uint32_t *p_result, uint32_t *p_left, uint32_t *p_right)
|
||||
{
|
||||
uint64_t r01 = 0;
|
||||
uint32_t r2 = 0;
|
||||
|
||||
uint i, k;
|
||||
|
||||
/* Compute each digit of p_result in sequence, maintaining the carries. */
|
||||
for(k=0; k < NUM_ECC_DIGITS*2 - 1; ++k)
|
||||
{
|
||||
uint l_min = (k < NUM_ECC_DIGITS ? 0 : (k + 1) - NUM_ECC_DIGITS);
|
||||
for(i=l_min; i<=k && i<NUM_ECC_DIGITS; ++i)
|
||||
{
|
||||
uint64_t l_product = (uint64_t)p_left[i] * p_right[k-i];
|
||||
r01 += l_product;
|
||||
r2 += (r01 < l_product);
|
||||
}
|
||||
p_result[k] = (uint32_t)r01;
|
||||
r01 = (r01 >> 32) | (((uint64_t)r2) << 32);
|
||||
r2 = 0;
|
||||
}
|
||||
|
||||
p_result[NUM_ECC_DIGITS*2 - 1] = (uint32_t)r01;
|
||||
}
|
||||
#else
|
||||
static void vli_mult(uint32_t *p_result, uint32_t *p_left, uint32_t *p_right)
|
||||
{
|
||||
uint64_t r01 = 0;
|
||||
@@ -249,12 +223,16 @@ static void vli_mult(uint32_t *p_result, uint32_t *p_left, uint32_t *p_right)
|
||||
uint l_min = (k < NUM_ECC_DIGITS ? 0 : (k + 1) - NUM_ECC_DIGITS);
|
||||
for(i=l_min; i<=k && i<NUM_ECC_DIGITS; ++i)
|
||||
{
|
||||
#if ECC_SOFT_MULT64
|
||||
uint32_t a0 = p_left[i] & 0xffff;
|
||||
uint32_t a1 = p_left[i] >> 16;
|
||||
uint32_t b0 = p_right[k-i] & 0xffff;
|
||||
uint32_t b1 = p_right[k-i] >> 16;
|
||||
|
||||
uint64_t l_product = (a0 * b0) + (((uint64_t)(a0 * b1) + a1 * b0) << 16) + (((uint64_t)(a1 * b1)) << 32);
|
||||
#else
|
||||
uint64_t l_product = (uint64_t)p_left[i] * p_right[k-i];
|
||||
#endif
|
||||
r01 += l_product;
|
||||
r2 += (r01 < l_product);
|
||||
}
|
||||
@@ -265,7 +243,6 @@ static void vli_mult(uint32_t *p_result, uint32_t *p_left, uint32_t *p_right)
|
||||
|
||||
p_result[NUM_ECC_DIGITS*2 - 1] = (uint32_t)r01;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Computes p_result = (p_left + p_right) % p_mod.
|
||||
Assumes that p_left < p_mod and p_right < p_mod, p_result != p_mod. */
|
||||
@@ -583,35 +560,6 @@ static void vli_modMult(uint32_t *p_result, uint32_t *p_left, uint32_t *p_right,
|
||||
#if ECC_SQUARE_FUNC
|
||||
|
||||
/* Computes p_result = p_left^2. */
|
||||
#if ECC_MULT64
|
||||
static void vli_square(uint32_t *p_result, uint32_t *p_left)
|
||||
{
|
||||
uint64_t r01 = 0;
|
||||
uint32_t r2 = 0;
|
||||
|
||||
uint i, k;
|
||||
for(k=0; k < NUM_ECC_DIGITS*2 - 1; ++k)
|
||||
{
|
||||
uint l_min = (k < NUM_ECC_DIGITS ? 0 : (k + 1) - NUM_ECC_DIGITS);
|
||||
for(i=l_min; i<=k && i<=k-i; ++i)
|
||||
{
|
||||
uint64_t l_product = (uint64_t)p_left[i] * p_left[k-i];
|
||||
if(i < k-i)
|
||||
{
|
||||
r2 += l_product >> 63;
|
||||
l_product *= 2;
|
||||
}
|
||||
r01 += l_product;
|
||||
r2 += (r01 < l_product);
|
||||
}
|
||||
p_result[k] = (uint32_t)r01;
|
||||
r01 = (r01 >> 32) | (((uint64_t)r2) << 32);
|
||||
r2 = 0;
|
||||
}
|
||||
|
||||
p_result[NUM_ECC_DIGITS*2 - 1] = (uint32_t)r01;
|
||||
}
|
||||
#else
|
||||
static void vli_square(uint32_t *p_result, uint32_t *p_left)
|
||||
{
|
||||
uint64_t r01 = 0;
|
||||
@@ -623,13 +571,16 @@ static void vli_square(uint32_t *p_result, uint32_t *p_left)
|
||||
uint l_min = (k < NUM_ECC_DIGITS ? 0 : (k + 1) - NUM_ECC_DIGITS);
|
||||
for(i=l_min; i<=k && i<=k-i; ++i)
|
||||
{
|
||||
#if ECC_SOFT_MULT64
|
||||
uint32_t a0 = p_left[i] & 0xffff;
|
||||
uint32_t a1 = p_left[i] >> 16;
|
||||
uint32_t b0 = p_left[k-i] & 0xffff;
|
||||
uint32_t b1 = p_left[k-i] >> 16;
|
||||
|
||||
uint64_t l_product = (a0 * b0) + (((uint64_t)(a0 * b1) + a1 * b0) << 16) + (((uint64_t)(a1 * b1)) << 32);
|
||||
|
||||
#else
|
||||
uint64_t l_product = (uint64_t)p_left[i] * p_left[k-i];
|
||||
#endif
|
||||
if(i < k-i)
|
||||
{
|
||||
r2 += l_product >> 63;
|
||||
@@ -645,7 +596,6 @@ static void vli_square(uint32_t *p_result, uint32_t *p_left)
|
||||
|
||||
p_result[NUM_ECC_DIGITS*2 - 1] = (uint32_t)r01;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Computes p_result = p_left^2 % p_mod. */
|
||||
static void vli_modSquare(uint32_t *p_result, uint32_t *p_left, uint32_t *p_mod)
|
||||
@@ -674,7 +624,7 @@ static void vli_modDiv(uint32_t *p_result, uint32_t *p_left, uint32_t *p_right,
|
||||
vli_set(a, p_right);
|
||||
vli_set(b, p_mod);
|
||||
vli_set(u, p_left);
|
||||
fast_clear(v);
|
||||
vli_clear(v);
|
||||
|
||||
while ((l_cmpResult = vli_cmp(a, b)) != 0)
|
||||
{
|
||||
@@ -753,7 +703,7 @@ static void vli_modInv(uint32_t *p_result, uint32_t *p_input, uint32_t *p_mod)
|
||||
{
|
||||
uint32_t n[NUM_ECC_DIGITS];
|
||||
|
||||
fast_clear(n);
|
||||
vli_clear(n);
|
||||
n[0] = 1;
|
||||
|
||||
vli_modDiv(p_result, n, p_input, p_mod);
|
||||
@@ -764,8 +714,8 @@ static void vli_modInv(uint32_t *p_result, uint32_t *p_input, uint32_t *p_mod)
|
||||
/* Clears a point (set it to the point at infinity). */
|
||||
static void EccPoint_clear(EccPoint *p_point)
|
||||
{
|
||||
fast_clear(p_point->x);
|
||||
fast_clear(p_point->y);
|
||||
vli_clear(p_point->x);
|
||||
vli_clear(p_point->y);
|
||||
}
|
||||
|
||||
/* Copies a point. */
|
||||
@@ -796,7 +746,7 @@ static void EccPoint_double_projective(EccPoint *P3, uint32_t *Z3, EccPoint *P1,
|
||||
|
||||
if(vli_zero(Z1))
|
||||
{
|
||||
fast_clear(Z3);
|
||||
vli_clear(Z3);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -852,7 +802,7 @@ static void EccPoint_add_mixed(EccPoint *P3, uint32_t *Z3, EccPoint *P1, uint32_
|
||||
if(vli_zero(Z1))
|
||||
{
|
||||
EccPoint_copy(P3, P2);
|
||||
fast_clear(Z3);
|
||||
vli_clear(Z3);
|
||||
Z3[0] = 1;
|
||||
return;
|
||||
}
|
||||
@@ -875,7 +825,7 @@ static void EccPoint_add_mixed(EccPoint *P3, uint32_t *Z3, EccPoint *P1, uint32_
|
||||
}
|
||||
else
|
||||
{
|
||||
fast_clear(Z3);
|
||||
vli_clear(Z3);
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -915,9 +865,9 @@ void EccPoint_mult(EccPoint *p_result, EccPoint *p_point, uint32_t *p_scalar)
|
||||
uint l_carry;
|
||||
int i;
|
||||
|
||||
fast_clear(Z1);
|
||||
fast_clear(l_plus);
|
||||
fast_clear(l_minus);
|
||||
vli_clear(Z1);
|
||||
vli_clear(l_plus);
|
||||
vli_clear(l_minus);
|
||||
|
||||
EccPoint l_neg;
|
||||
vli_set(l_neg.x, p_point->x);
|
||||
@@ -986,7 +936,7 @@ void EccPoint_mult(EccPoint *p_result, EccPoint *p_point, uint32_t *p_scalar)
|
||||
uint l_numBits = vli_numBits(p_scalar);
|
||||
int i;
|
||||
|
||||
fast_clear(Z1);
|
||||
vli_clear(Z1);
|
||||
EccPoint_clear(p_result);
|
||||
|
||||
for(i = l_numBits - 1; i >= 0; --i)
|
||||
|
||||
@@ -5,15 +5,18 @@
|
||||
|
||||
/* Optimization settings. Define as 1 to enable an optimization, 0 to disable it.
|
||||
ECC_SQUARE_FUNC - If enabled, this will cause a specific function to be used for (scalar) squaring instead of the generic
|
||||
multiplication function. Improves speed by about 1-4% (or more if 32-bit multiplications are slow).
|
||||
multiplication function. Improves speed by about 8% .
|
||||
ECC_USE_NAF - If enabled, this will convert the private key to a non-adjacent form before point multiplication.
|
||||
Improves speed by about 10%.
|
||||
ECC_SOFT_MULT64 - For platforms that do not have instructions to allow a fast 64x64 bit multiply (eg Cortex-M0), this option
|
||||
enables code to do 64x64 bit multiplies faster than libgcc does. Improves speed by about 6% on Cortex-M0
|
||||
(with 32-cycle multiply instruction). Do not enable on other platforms since it will lead to larger and slower code!
|
||||
*/
|
||||
#define ECC_SQUARE_FUNC 1
|
||||
#define ECC_USE_NAF 1
|
||||
#define ECC_MULT64 1
|
||||
#define ECC_SOFT_MULT64 1
|
||||
|
||||
#define ECC_CURVE secp160r1
|
||||
#define ECC_CURVE secp128r1
|
||||
|
||||
#define secp128r1 4
|
||||
#define secp160r1 5
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
c, link = emk.module("c", "link")
|
||||
|
||||
default_flags = ["-fno-common", "-Wall", "-Wextra", "-Werror", "-Wno-unused", "-ansi", "-pedantic"]
|
||||
opt_flags = {"dbg":["-g"], "std":["-O1", "-DNDEBUG"], "opt":["-O2", "-DNDEBUG"], "max":["-O3", "-DNDEBUG"]}
|
||||
|
||||
opt_level = "dbg"
|
||||
if "opt" in emk.options:
|
||||
level = emk.options["opt"]
|
||||
if level in opt_flags:
|
||||
opt_level = level
|
||||
emk.options["opt"] = opt_level
|
||||
|
||||
c.flags.extend(default_flags)
|
||||
c.flags.extend(opt_flags[opt_level])
|
||||
|
||||
c.include_dirs.append("$:proj:$")
|
||||
|
||||
@@ -1,3 +1 @@
|
||||
emk.module("c")
|
||||
|
||||
emk.subdir("test")
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@ int randfd;
|
||||
|
||||
void getRandomBytes(void *p_dest, unsigned p_size)
|
||||
{
|
||||
if(read(randfd, p_dest, p_size) != p_size)
|
||||
if(read(randfd, p_dest, p_size) != (int)p_size)
|
||||
{
|
||||
printf("Failed to get random bytes.\n");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user