[crypto] Add an abstraction of an elliptic curve

Define an abstraction of an elliptic curve with a fixed generator and
one supported operation (scalar multiplication of a curve point).

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown
2024-01-30 13:26:36 +00:00
parent 27398f1360
commit 17135c83fb
3 changed files with 57 additions and 0 deletions

View File

@@ -195,6 +195,23 @@ struct pubkey_algorithm {
const void *public_key, size_t public_key_len );
};
/** An elliptic curve */
struct elliptic_curve {
/** Curve name */
const char *name;
/** Key size */
size_t keysize;
/** Multiply scalar by curve point
*
* @v base Base point (or NULL to use generator)
* @v scalar Scalar multiple
* @v result Result point to fill in
* @ret rc Return status code
*/
int ( * multiply ) ( const void *base, const void *scalar,
void *result );
};
static inline void digest_init ( struct digest_algorithm *digest,
void *ctx ) {
digest->init ( ctx );
@@ -302,6 +319,12 @@ static inline int pubkey_match ( struct pubkey_algorithm *pubkey,
public_key_len );
}
static inline int elliptic_multiply ( struct elliptic_curve *curve,
const void *base, const void *scalar,
void *result ) {
return curve->multiply ( base, scalar, result );
}
extern void digest_null_init ( void *ctx );
extern void digest_null_update ( void *ctx, const void *src, size_t len );
extern void digest_null_final ( void *ctx, void *out );

View File

@@ -11,6 +11,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <stdint.h>
#include <ipxe/bigint.h>
#include <ipxe/crypto.h>
/** X25519 unsigned big integer size
*
@@ -88,4 +89,6 @@ extern int x25519_key ( const struct x25519_value *base,
const struct x25519_value *scalar,
struct x25519_value *result );
extern struct elliptic_curve x25519_curve;
#endif /* _IPXE_X25519_H */