#include <assert.h>
#include <errno.h>
#include <ipxe/init.h>
+#include <ipxe/crypto.h>
#include <ipxe/x25519.h>
/** X25519 reduction constant
/** Constant 121665 (used in the Montgomery ladder) */
static union x25519_oct258 x25519_121665;
+/** Constant g=9 (the group generator) */
+static struct x25519_value x25519_generator = {
+ .raw = { 9, }
+};
+
/**
* Initialise constants
*
/* Fail if result was all zeros (as required by RFC8422) */
return ( bigint_is_zero ( &point.value ) ? -EPERM : 0 );
}
+
+/**
+ * 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
+ */
+static int x25519_curve_multiply ( const void *base, const void *scalar,
+ void *result ) {
+
+ /* Use base point if applicable */
+ if ( ! base )
+ base = &x25519_generator;
+
+ return x25519_key ( base, scalar, result );
+}
+
+/** X25519 elliptic curve */
+struct elliptic_curve x25519_curve = {
+ .name = "x25519",
+ .keysize = sizeof ( struct x25519_value ),
+ .multiply = x25519_curve_multiply,
+};
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 );
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 );
#include <stdint.h>
#include <ipxe/bigint.h>
+#include <ipxe/crypto.h>
/** X25519 unsigned big integer size
*
const struct x25519_value *scalar,
struct x25519_value *result );
+extern struct elliptic_curve x25519_curve;
+
#endif /* _IPXE_X25519_H */