1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
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 */
|