crypto: ecc - Export additional helper functions
Export the following additional ECC helper functions: - ecc_alloc_point() - ecc_free_point() - vli_num_bits() - ecc_point_is_zero() This is done to allow future ECC device drivers to re-use existing code, thus simplifying their implementation. Functions are exported using EXPORT_SYMBOL() (instead of EXPORT_SYMBOL_GPL()) to be consistent with the functions already exported by crypto/ecc.c. Exported functions are documented in include/crypto/internal/ecc.h. Signed-off-by: Daniele Alessandrelli <daniele.alessandrelli@intel.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
a745d3ace3
commit
eaffe377e1
12
crypto/ecc.c
12
crypto/ecc.c
|
@ -81,7 +81,7 @@ static void ecc_free_digits_space(u64 *space)
|
||||||
kfree_sensitive(space);
|
kfree_sensitive(space);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ecc_point *ecc_alloc_point(unsigned int ndigits)
|
struct ecc_point *ecc_alloc_point(unsigned int ndigits)
|
||||||
{
|
{
|
||||||
struct ecc_point *p = kmalloc(sizeof(*p), GFP_KERNEL);
|
struct ecc_point *p = kmalloc(sizeof(*p), GFP_KERNEL);
|
||||||
|
|
||||||
|
@ -106,8 +106,9 @@ err_alloc_x:
|
||||||
kfree(p);
|
kfree(p);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(ecc_alloc_point);
|
||||||
|
|
||||||
static void ecc_free_point(struct ecc_point *p)
|
void ecc_free_point(struct ecc_point *p)
|
||||||
{
|
{
|
||||||
if (!p)
|
if (!p)
|
||||||
return;
|
return;
|
||||||
|
@ -116,6 +117,7 @@ static void ecc_free_point(struct ecc_point *p)
|
||||||
kfree_sensitive(p->y);
|
kfree_sensitive(p->y);
|
||||||
kfree_sensitive(p);
|
kfree_sensitive(p);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(ecc_free_point);
|
||||||
|
|
||||||
static void vli_clear(u64 *vli, unsigned int ndigits)
|
static void vli_clear(u64 *vli, unsigned int ndigits)
|
||||||
{
|
{
|
||||||
|
@ -165,7 +167,7 @@ static unsigned int vli_num_digits(const u64 *vli, unsigned int ndigits)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Counts the number of bits required for vli. */
|
/* Counts the number of bits required for vli. */
|
||||||
static unsigned int vli_num_bits(const u64 *vli, unsigned int ndigits)
|
unsigned int vli_num_bits(const u64 *vli, unsigned int ndigits)
|
||||||
{
|
{
|
||||||
unsigned int i, num_digits;
|
unsigned int i, num_digits;
|
||||||
u64 digit;
|
u64 digit;
|
||||||
|
@ -180,6 +182,7 @@ static unsigned int vli_num_bits(const u64 *vli, unsigned int ndigits)
|
||||||
|
|
||||||
return ((num_digits - 1) * 64 + i);
|
return ((num_digits - 1) * 64 + i);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(vli_num_bits);
|
||||||
|
|
||||||
/* Set dest from unaligned bit string src. */
|
/* Set dest from unaligned bit string src. */
|
||||||
void vli_from_be64(u64 *dest, const void *src, unsigned int ndigits)
|
void vli_from_be64(u64 *dest, const void *src, unsigned int ndigits)
|
||||||
|
@ -1062,11 +1065,12 @@ EXPORT_SYMBOL(vli_mod_inv);
|
||||||
/* ------ Point operations ------ */
|
/* ------ Point operations ------ */
|
||||||
|
|
||||||
/* Returns true if p_point is the point at infinity, false otherwise. */
|
/* Returns true if p_point is the point at infinity, false otherwise. */
|
||||||
static bool ecc_point_is_zero(const struct ecc_point *point)
|
bool ecc_point_is_zero(const struct ecc_point *point)
|
||||||
{
|
{
|
||||||
return (vli_is_zero(point->x, point->ndigits) &&
|
return (vli_is_zero(point->x, point->ndigits) &&
|
||||||
vli_is_zero(point->y, point->ndigits));
|
vli_is_zero(point->y, point->ndigits));
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(ecc_point_is_zero);
|
||||||
|
|
||||||
/* Point multiplication algorithm using Montgomery's ladder with co-Z
|
/* Point multiplication algorithm using Montgomery's ladder with co-Z
|
||||||
* coordinates. From https://eprint.iacr.org/2011/338.pdf
|
* coordinates. From https://eprint.iacr.org/2011/338.pdf
|
||||||
|
|
|
@ -225,6 +225,41 @@ void vli_mod_inv(u64 *result, const u64 *input, const u64 *mod,
|
||||||
void vli_mod_mult_slow(u64 *result, const u64 *left, const u64 *right,
|
void vli_mod_mult_slow(u64 *result, const u64 *left, const u64 *right,
|
||||||
const u64 *mod, unsigned int ndigits);
|
const u64 *mod, unsigned int ndigits);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* vli_num_bits() - Counts the number of bits required for vli.
|
||||||
|
*
|
||||||
|
* @vli: vli to check.
|
||||||
|
* @ndigits: Length of the @vli
|
||||||
|
*
|
||||||
|
* Return: The number of bits required to represent @vli.
|
||||||
|
*/
|
||||||
|
unsigned int vli_num_bits(const u64 *vli, unsigned int ndigits);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ecc_aloc_point() - Allocate ECC point.
|
||||||
|
*
|
||||||
|
* @ndigits: Length of vlis in u64 qwords.
|
||||||
|
*
|
||||||
|
* Return: Pointer to the allocated point or NULL if allocation failed.
|
||||||
|
*/
|
||||||
|
struct ecc_point *ecc_alloc_point(unsigned int ndigits);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ecc_free_point() - Free ECC point.
|
||||||
|
*
|
||||||
|
* @p: The point to free.
|
||||||
|
*/
|
||||||
|
void ecc_free_point(struct ecc_point *p);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ecc_point_is_zero() - Check if point is zero.
|
||||||
|
*
|
||||||
|
* @p: Point to check for zero.
|
||||||
|
*
|
||||||
|
* Return: true if point is the point at infinity, false otherwise.
|
||||||
|
*/
|
||||||
|
bool ecc_point_is_zero(const struct ecc_point *point);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ecc_point_mult_shamir() - Add two points multiplied by scalars
|
* ecc_point_mult_shamir() - Add two points multiplied by scalars
|
||||||
*
|
*
|
||||||
|
@ -242,4 +277,5 @@ void ecc_point_mult_shamir(const struct ecc_point *result,
|
||||||
const u64 *x, const struct ecc_point *p,
|
const u64 *x, const struct ecc_point *p,
|
||||||
const u64 *y, const struct ecc_point *q,
|
const u64 *y, const struct ecc_point *q,
|
||||||
const struct ecc_curve *curve);
|
const struct ecc_curve *curve);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue