#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_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; }; /** 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 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_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_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 ), \ }; extern void elliptic_okx ( struct elliptic_test *test, const char *file, unsigned int line ); /** * Report an elliptic curve point multiplication test result * * @v test Elliptic curve point multiplication test */ #define elliptic_ok( test ) elliptic_okx ( test, __FILE__, __LINE__ ) #endif /* _ELLIPTIC_TEST_H */