Skip to content

Commit

Permalink
crypto: ecc - remove unnecessary casts
Browse files Browse the repository at this point in the history
ecc software implementation works with chunks of u64 data. There were some
unnecessary casts to u8 and then back to u64 for the ecc keys. This patch
removes the unnecessary casts.

Signed-off-by: Tudor Ambarus <[email protected]>
Signed-off-by: Herbert Xu <[email protected]>
  • Loading branch information
ambarus authored and herbertx committed Jun 10, 2017
1 parent 099054d commit ad26959
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 25 deletions.
28 changes: 13 additions & 15 deletions crypto/ecc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -917,31 +917,30 @@ 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) {
ret = -EINVAL;
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) {
Expand All @@ -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);
Expand All @@ -966,8 +964,8 @@ int ecdh_make_pub_key(unsigned int curve_id, unsigned int ndigits,
}

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;
Expand Down Expand Up @@ -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;
Expand Down
8 changes: 4 additions & 4 deletions crypto/ecc.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
* Returns 0 if the key is acceptable, a negative value otherwise
*/
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);

/**
* ecdh_make_pub_key() - Compute an ECC public key
Expand All @@ -55,7 +55,7 @@ int ecc_is_key_valid(unsigned int curve_id, unsigned int ndigits,
* if an error occurred.
*/
int ecdh_make_pub_key(const unsigned int curve_id, unsigned int ndigits,
const u8 *private_key, u8 *public_key);
const u64 *private_key, u64 *public_key);

/**
* crypto_ecdh_shared_secret() - Compute a shared secret
Expand All @@ -73,6 +73,6 @@ int ecdh_make_pub_key(const unsigned int curve_id, unsigned int ndigits,
* if an error occurred.
*/
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);
#endif
11 changes: 5 additions & 6 deletions crypto/ecdh.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ static int ecdh_set_secret(struct crypto_kpp *tfm, const void *buf,
ctx->ndigits = ndigits;

if (ecc_is_key_valid(ctx->curve_id, ctx->ndigits,
(const u8 *)params.key, params.key_size) < 0)
(const u64 *)params.key, params.key_size) < 0)
return -EINVAL;

memcpy(ctx->private_key, params.key, params.key_size);
Expand All @@ -81,15 +81,14 @@ static int ecdh_compute_value(struct kpp_request *req)
return -EINVAL;

ret = crypto_ecdh_shared_secret(ctx->curve_id, ctx->ndigits,
(const u8 *)ctx->private_key,
(const u8 *)ctx->public_key,
(u8 *)ctx->shared_secret);
ctx->private_key,
ctx->public_key,
ctx->shared_secret);

buf = ctx->shared_secret;
} else {
ret = ecdh_make_pub_key(ctx->curve_id, ctx->ndigits,
(const u8 *)ctx->private_key,
(u8 *)ctx->public_key);
ctx->private_key, ctx->public_key);
buf = ctx->public_key;
/* Public part is a point thus it has both coordinates */
nbytes *= 2;
Expand Down

0 comments on commit ad26959

Please sign in to comment.