|
@@ -904,7 +904,7 @@ static inline void ecc_swap_digits(const u64 *in, u64 *out,
|
|
|
}
|
|
|
|
|
|
int ecc_is_key_valid(unsigned int curve_id, unsigned int ndigits,
|
|
|
- const u8 *private_key, unsigned int private_key_len)
|
|
|
+ const u64 *private_key, unsigned int private_key_len)
|
|
|
{
|
|
|
int nbytes;
|
|
|
const struct ecc_curve *curve = ecc_get_curve(curve_id);
|
|
@@ -917,23 +917,22 @@ int ecc_is_key_valid(unsigned int curve_id, unsigned int ndigits,
|
|
|
if (private_key_len != nbytes)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- if (vli_is_zero((const u64 *)&private_key[0], ndigits))
|
|
|
+ if (vli_is_zero(private_key, ndigits))
|
|
|
return -EINVAL;
|
|
|
|
|
|
/* Make sure the private key is in the range [1, n-1]. */
|
|
|
- if (vli_cmp(curve->n, (const u64 *)&private_key[0], ndigits) != 1)
|
|
|
+ if (vli_cmp(curve->n, private_key, ndigits) != 1)
|
|
|
return -EINVAL;
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
int ecdh_make_pub_key(unsigned int curve_id, unsigned int ndigits,
|
|
|
- const u8 *private_key, u8 *public_key)
|
|
|
+ const u64 *private_key, u64 *public_key)
|
|
|
{
|
|
|
int ret = 0;
|
|
|
struct ecc_point *pk;
|
|
|
u64 priv[ndigits];
|
|
|
- unsigned int nbytes;
|
|
|
const struct ecc_curve *curve = ecc_get_curve(curve_id);
|
|
|
|
|
|
if (!private_key || !curve) {
|
|
@@ -941,7 +940,7 @@ int ecdh_make_pub_key(unsigned int curve_id, unsigned int ndigits,
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- ecc_swap_digits((const u64 *)private_key, priv, ndigits);
|
|
|
+ ecc_swap_digits(private_key, priv, ndigits);
|
|
|
|
|
|
pk = ecc_alloc_point(ndigits);
|
|
|
if (!pk) {
|
|
@@ -955,9 +954,8 @@ int ecdh_make_pub_key(unsigned int curve_id, unsigned int ndigits,
|
|
|
goto err_free_point;
|
|
|
}
|
|
|
|
|
|
- nbytes = ndigits << ECC_DIGITS_TO_BYTES_SHIFT;
|
|
|
- ecc_swap_digits(pk->x, (u64 *)public_key, ndigits);
|
|
|
- ecc_swap_digits(pk->y, (u64 *)&public_key[nbytes], ndigits);
|
|
|
+ ecc_swap_digits(pk->x, public_key, ndigits);
|
|
|
+ ecc_swap_digits(pk->y, &public_key[ndigits], ndigits);
|
|
|
|
|
|
err_free_point:
|
|
|
ecc_free_point(pk);
|
|
@@ -966,8 +964,8 @@ out:
|
|
|
}
|
|
|
|
|
|
int crypto_ecdh_shared_secret(unsigned int curve_id, unsigned int ndigits,
|
|
|
- const u8 *private_key, const u8 *public_key,
|
|
|
- u8 *secret)
|
|
|
+ const u64 *private_key, const u64 *public_key,
|
|
|
+ u64 *secret)
|
|
|
{
|
|
|
int ret = 0;
|
|
|
struct ecc_point *product, *pk;
|
|
@@ -997,13 +995,13 @@ int crypto_ecdh_shared_secret(unsigned int curve_id, unsigned int ndigits,
|
|
|
goto err_alloc_product;
|
|
|
}
|
|
|
|
|
|
- ecc_swap_digits((const u64 *)public_key, pk->x, ndigits);
|
|
|
- ecc_swap_digits((const u64 *)&public_key[nbytes], pk->y, ndigits);
|
|
|
- ecc_swap_digits((const u64 *)private_key, priv, ndigits);
|
|
|
+ ecc_swap_digits(public_key, pk->x, ndigits);
|
|
|
+ ecc_swap_digits(&public_key[ndigits], pk->y, ndigits);
|
|
|
+ ecc_swap_digits(private_key, priv, ndigits);
|
|
|
|
|
|
ecc_point_mult(product, pk, priv, rand_z, curve->p, ndigits);
|
|
|
|
|
|
- ecc_swap_digits(product->x, (u64 *)secret, ndigits);
|
|
|
+ ecc_swap_digits(product->x, secret, ndigits);
|
|
|
|
|
|
if (ecc_point_is_zero(product))
|
|
|
ret = -EFAULT;
|