| #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> | |
| #include "exchange_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 */ |