#ifndef _ELLIPTIC_TEST_H #define _ELLIPTIC_TEST_H FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include #include #include /** 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 */