summaryrefslogtreecommitdiffstats
path: root/src/tests/elliptic_test.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/tests/elliptic_test.h')
-rw-r--r--src/tests/elliptic_test.h146
1 files changed, 146 insertions, 0 deletions
diff --git a/src/tests/elliptic_test.h b/src/tests/elliptic_test.h
new file mode 100644
index 000000000..eab242f17
--- /dev/null
+++ b/src/tests/elliptic_test.h
@@ -0,0 +1,146 @@
+#ifndef _ELLIPTIC_TEST_H
+#define _ELLIPTIC_TEST_H
+
+FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
+
+#include <stdint.h>
+#include <ipxe/crypto.h>
+#include <ipxe/test.h>
+
+/** An elliptic curve point multiplication test */
+struct elliptic_multiply_test {
+ /** Elliptic curve */
+ struct elliptic_curve *curve;
+ /** Base point */
+ const void *base;
+ /** Length of base point (or 0 to use generator) */
+ size_t base_len;
+ /** Scalar multiple */
+ const void *scalar;
+ /** Length of scalar multiple */
+ size_t scalar_len;
+ /** Expected result point */
+ const void *expected;
+ /** Length of expected result point (or 0 to expect failure) */
+ size_t expected_len;
+};
+
+/** An elliptic curve point addition test */
+struct elliptic_add_test {
+ /** Elliptic curve */
+ struct elliptic_curve *curve;
+ /** Addend point */
+ const void *addend;
+ /** Length of addend point */
+ size_t addend_len;
+ /** Augend point */
+ const void *augend;
+ /** Length of augend point */
+ size_t augend_len;
+ /** Expected result point */
+ const void *expected;
+ /** Length of expected result point (or 0 to expect failure) */
+ size_t expected_len;
+};
+
+/** Define inline base point */
+#define BASE(...) { __VA_ARGS__ }
+
+/** Define base point to be curve's generator */
+#define BASE_GENERATOR BASE()
+
+/** Define inline scalar multiple */
+#define SCALAR(...) { __VA_ARGS__ }
+
+/** Define inline addend point */
+#define ADDEND(...) { __VA_ARGS__ }
+
+/** Define inline augend point */
+#define AUGEND(...) { __VA_ARGS__ }
+
+/** Define inline expected result point */
+#define EXPECTED(...) { __VA_ARGS__ }
+
+/** Define result as an expected failure */
+#define EXPECTED_FAIL EXPECTED()
+
+/**
+ * Define an elliptic curve point multiplication test
+ *
+ * @v name Test name
+ * @v CURVE Elliptic curve
+ * @v BASE Base point
+ * @v SCALAR Scalar multiple
+ * @v EXPECTED Expected result point
+ * @ret test Elliptic curve point multiplication test
+ */
+#define ELLIPTIC_MULTIPLY_TEST( name, CURVE, BASE, SCALAR, EXPECTED ) \
+ static const uint8_t name ## _base[] = BASE; \
+ static const uint8_t name ## _scalar[] = SCALAR; \
+ static const uint8_t name ## _expected[] = EXPECTED; \
+ static struct elliptic_multiply_test name = { \
+ .curve = CURVE, \
+ .base = name ## _base, \
+ .base_len = sizeof ( name ## _base ), \
+ .scalar = name ## _scalar, \
+ .scalar_len = sizeof ( name ## _scalar ), \
+ .expected = name ## _expected, \
+ .expected_len = sizeof ( name ## _expected ), \
+ };
+
+/**
+ * Define an elliptic curve point addition test
+ *
+ * @v name Test name
+ * @v CURVE Elliptic curve
+ * @v ADDEND Addend point
+ * @v AUGEND Augend point
+ * @v EXPECTED Expected result point
+ * @ret test Elliptic curve point multiplication test
+ */
+#define ELLIPTIC_ADD_TEST( name, CURVE, ADDEND, AUGEND, EXPECTED ) \
+ static const uint8_t name ## _addend[] = ADDEND; \
+ static const uint8_t name ## _augend[] = AUGEND; \
+ static const uint8_t name ## _expected[] = EXPECTED; \
+ static struct elliptic_add_test name = { \
+ .curve = CURVE, \
+ .addend = name ## _addend, \
+ .addend_len = sizeof ( name ## _addend ), \
+ .augend = name ## _augend, \
+ .augend_len = sizeof ( name ## _augend ), \
+ .expected = name ## _expected, \
+ .expected_len = sizeof ( name ## _expected ), \
+ };
+
+extern void elliptic_curve_okx ( struct elliptic_curve *curve,
+ const char *file, unsigned int line );
+extern void elliptic_multiply_okx ( struct elliptic_multiply_test *test,
+ const char *file, unsigned int line );
+extern void elliptic_add_okx ( struct elliptic_add_test *test,
+ const char *file, unsigned int line );
+
+/**
+ * Report an elliptic curve sanity test result
+ *
+ * @v curve Elliptic curve
+ */
+#define elliptic_curve_ok( curve ) \
+ elliptic_curve_okx ( curve, __FILE__, __LINE__ )
+
+/**
+ * Report an elliptic curve point multiplication test result
+ *
+ * @v test Elliptic curve point multiplication test
+ */
+#define elliptic_multiply_ok( test ) \
+ elliptic_multiply_okx ( test, __FILE__, __LINE__ )
+
+/**
+ * Report an elliptic curve point addition test result
+ *
+ * @v test Elliptic curve point addition test
+ */
+#define elliptic_add_ok( test ) \
+ elliptic_add_okx ( test, __FILE__, __LINE__ )
+
+#endif /* _ELLIPTIC_TEST_H */