iPXE
elliptic_test.h File Reference
#include <stdint.h>
#include <ipxe/crypto.h>
#include <ipxe/test.h>

Go to the source code of this file.

Data Structures

struct  elliptic_multiply_test
 An elliptic curve point multiplication test. More...
struct  elliptic_add_test
 An elliptic curve point addition test. More...

Macros

#define BASE(...)
 Define inline base point.
#define BASE_GENERATOR   BASE()
 Define base point to be curve's generator.
#define SCALAR(...)
 Define inline scalar multiple.
#define ADDEND(...)
 Define inline addend point.
#define AUGEND(...)
 Define inline augend point.
#define EXPECTED(...)
 Define inline expected result point.
#define EXPECTED_FAIL   EXPECTED()
 Define result as an expected failure.
#define ELLIPTIC_MULTIPLY_TEST(name, CURVE, BASE, SCALAR, EXPECTED)
 Define an elliptic curve point multiplication test.
#define ELLIPTIC_ADD_TEST(name, CURVE, ADDEND, AUGEND, EXPECTED)
 Define an elliptic curve point addition test.
#define elliptic_curve_ok(curve)
 Report an elliptic curve sanity test result.
#define elliptic_multiply_ok(test)
 Report an elliptic curve point multiplication test result.
#define elliptic_add_ok(test)
 Report an elliptic curve point addition test result.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
void elliptic_curve_okx (struct elliptic_curve *curve, const char *file, unsigned int line)
 Report elliptic curve sanity test result.
void elliptic_multiply_okx (struct elliptic_multiply_test *test, const char *file, unsigned int line)
 Report elliptic curve point multiplication test result.
void elliptic_add_okx (struct elliptic_add_test *test, const char *file, unsigned int line)
 Report elliptic curve point addition test result.

Macro Definition Documentation

◆ BASE

#define BASE ( ...)
Value:
{ __VA_ARGS__ }

Define inline base point.

Definition at line 47 of file elliptic_test.h.

◆ BASE_GENERATOR

◆ SCALAR

◆ ADDEND

#define ADDEND ( ...)
Value:
{ __VA_ARGS__ }

Define inline addend point.

Definition at line 56 of file elliptic_test.h.

Referenced by ELLIPTIC_ADD_TEST(), ELLIPTIC_ADD_TEST(), ELLIPTIC_ADD_TEST(), ELLIPTIC_ADD_TEST(), ELLIPTIC_ADD_TEST(), and ELLIPTIC_ADD_TEST().

◆ AUGEND

#define AUGEND ( ...)
Value:
{ __VA_ARGS__ }

Define inline augend point.

Definition at line 59 of file elliptic_test.h.

Referenced by ELLIPTIC_ADD_TEST(), ELLIPTIC_ADD_TEST(), ELLIPTIC_ADD_TEST(), ELLIPTIC_ADD_TEST(), ELLIPTIC_ADD_TEST(), and ELLIPTIC_ADD_TEST().

◆ EXPECTED

◆ EXPECTED_FAIL

#define EXPECTED_FAIL   EXPECTED()

Define result as an expected failure.

Definition at line 65 of file elliptic_test.h.

Referenced by ELLIPTIC_MULTIPLY_TEST(), ELLIPTIC_MULTIPLY_TEST(), ELLIPTIC_MULTIPLY_TEST(), and ELLIPTIC_MULTIPLY_TEST().

◆ ELLIPTIC_MULTIPLY_TEST

#define ELLIPTIC_MULTIPLY_TEST ( name,
CURVE,
BASE,
SCALAR,
EXPECTED )
Value:
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 BASE
Definition 3c595.h:69
unsigned char uint8_t
Definition stdint.h:10
const char * name
Definition ath9k_hw.c:1986
#define EXPECTED(...)
Define inline expected result point.
#define SCALAR(...)
Define inline scalar multiple.
An elliptic curve point multiplication test.

Define an elliptic curve point multiplication test.

Parameters
nameTest name
CURVEElliptic curve
BASEBase point
SCALARScalar multiple
EXPECTEDExpected result point
Return values
testElliptic curve point multiplication test

Definition at line 77 of file elliptic_test.h.

77#define ELLIPTIC_MULTIPLY_TEST( name, CURVE, BASE, SCALAR, EXPECTED ) \
78 static const uint8_t name ## _base[] = BASE; \
79 static const uint8_t name ## _scalar[] = SCALAR; \
80 static const uint8_t name ## _expected[] = EXPECTED; \
81 static struct elliptic_multiply_test name = { \
82 .curve = CURVE, \
83 .base = name ## _base, \
84 .base_len = sizeof ( name ## _base ), \
85 .scalar = name ## _scalar, \
86 .scalar_len = sizeof ( name ## _scalar ), \
87 .expected = name ## _expected, \
88 .expected_len = sizeof ( name ## _expected ), \
89 };

◆ ELLIPTIC_ADD_TEST

#define ELLIPTIC_ADD_TEST ( name,
CURVE,
ADDEND,
AUGEND,
EXPECTED )
Value:
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 ), \
};
#define ADDEND(...)
Define inline addend point.
#define AUGEND(...)
Define inline augend point.
An elliptic curve point addition test.

Define an elliptic curve point addition test.

Parameters
nameTest name
CURVEElliptic curve
ADDENDAddend point
AUGENDAugend point
EXPECTEDExpected result point
Return values
testElliptic curve point multiplication test

Definition at line 101 of file elliptic_test.h.

101#define ELLIPTIC_ADD_TEST( name, CURVE, ADDEND, AUGEND, EXPECTED ) \
102 static const uint8_t name ## _addend[] = ADDEND; \
103 static const uint8_t name ## _augend[] = AUGEND; \
104 static const uint8_t name ## _expected[] = EXPECTED; \
105 static struct elliptic_add_test name = { \
106 .curve = CURVE, \
107 .addend = name ## _addend, \
108 .addend_len = sizeof ( name ## _addend ), \
109 .augend = name ## _augend, \
110 .augend_len = sizeof ( name ## _augend ), \
111 .expected = name ## _expected, \
112 .expected_len = sizeof ( name ## _expected ), \
113 };

◆ elliptic_curve_ok

#define elliptic_curve_ok ( curve)
Value:
elliptic_curve_okx ( curve, __FILE__, __LINE__ )
void elliptic_curve_okx(struct elliptic_curve *curve, const char *file, unsigned int line)
Report elliptic curve sanity test result.

Report an elliptic curve sanity test result.

Parameters
curveElliptic curve

Definition at line 127 of file elliptic_test.h.

127#define elliptic_curve_ok( curve ) \
128 elliptic_curve_okx ( curve, __FILE__, __LINE__ )

Referenced by p256_test_exec(), and p384_test_exec().

◆ elliptic_multiply_ok

#define elliptic_multiply_ok ( test)
Value:
elliptic_multiply_okx ( test, __FILE__, __LINE__ )
void elliptic_multiply_okx(struct elliptic_multiply_test *test, const char *file, unsigned int line)
Report elliptic curve point multiplication test result.
static int test
Definition epic100.c:73

Report an elliptic curve point multiplication test result.

Parameters
testElliptic curve point multiplication test

Definition at line 135 of file elliptic_test.h.

135#define elliptic_multiply_ok( test ) \
136 elliptic_multiply_okx ( test, __FILE__, __LINE__ )

Referenced by p256_test_exec(), and p384_test_exec().

◆ elliptic_add_ok

#define elliptic_add_ok ( test)
Value:
elliptic_add_okx ( test, __FILE__, __LINE__ )
void elliptic_add_okx(struct elliptic_add_test *test, const char *file, unsigned int line)
Report elliptic curve point addition test result.

Report an elliptic curve point addition test result.

Parameters
testElliptic curve point addition test

Definition at line 143 of file elliptic_test.h.

143#define elliptic_add_ok( test ) \
144 elliptic_add_okx ( test, __FILE__, __LINE__ )

Referenced by p256_test_exec(), and p384_test_exec().

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ elliptic_curve_okx()

void elliptic_curve_okx ( struct elliptic_curve * curve,
const char * file,
unsigned int line )
extern

Report elliptic curve sanity test result.

Parameters
curveElliptic curve
fileTest code file
lineTest code line

Definition at line 50 of file elliptic_test.c.

51 {
52 static const uint8_t one[] = { 1 };
53 size_t pointsize = curve->pointsize;
54 size_t keysize = curve->keysize;
55 uint8_t point[pointsize];
56 uint8_t scalar[keysize];
57 struct {
60 } temp;
61
62 /* Check that curve has the required properties */
63 okx ( curve->base != NULL, file, line );
64 okx ( curve->order != NULL, file, line );
65 okx ( ( ! elliptic_is_infinity ( curve, curve->base ) ), file, line );
66
67 /* Test multiplying base point by group order. Result should
68 * be the point at infinity.
69 */
70 okx ( elliptic_multiply ( curve, curve->base, curve->order,
71 point ) == 0, file, line );
72 okx ( elliptic_is_infinity ( curve, point ), file, line );
73
74 /* Test multiplying base point by group order plus one, to get
75 * back to the base point.
76 */
77 bigint_init ( &temp.scalar, curve->order, keysize );
78 bigint_init ( &temp.one, one, sizeof ( one ) );
79 bigint_add ( &temp.one, &temp.scalar );
80 bigint_done ( &temp.scalar, scalar, sizeof ( scalar ) );
81 okx ( elliptic_multiply ( curve, curve->base, scalar, point ) == 0,
82 file, line );
83 okx ( memcmp ( point, curve->base, pointsize ) == 0, file, line );
84}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
#define bigint_t(size)
Define a big-integer type.
Definition bigint.h:20
#define bigint_required_size(len)
Determine number of elements required for a big-integer type.
Definition bigint.h:31
#define bigint_done(value, out, len)
Finalise big integer.
Definition bigint.h:75
#define bigint_add(addend, value)
Add big integers.
Definition bigint.h:87
#define bigint_init(value, data, len)
Initialise big integer.
Definition bigint.h:62
static int elliptic_multiply(struct elliptic_curve *curve, const void *base, const void *scalar, void *result)
Definition crypto.h:327
static int elliptic_is_infinity(struct elliptic_curve *curve, const void *point)
Definition crypto.h:322
int memcmp(const void *first, const void *second, size_t len)
Compare memory regions.
Definition string.c:115
const void * order
Order of the generator (if prime)
Definition crypto.h:188
size_t keysize
Scalar (and private key) size.
Definition crypto.h:184
size_t pointsize
Point (and public key) size.
Definition crypto.h:182
const void * base
Generator base point.
Definition crypto.h:186
#define okx(success, file, line)
Report test result.
Definition test.h:44
u16 keysize
Length of encryption key to be used, network byte order.
Definition wpa.h:10

References elliptic_curve::base, bigint_add, bigint_done, bigint_init, bigint_required_size, bigint_t, elliptic_is_infinity(), elliptic_multiply(), elliptic_curve::keysize, keysize, memcmp(), NULL, okx, elliptic_curve::order, and elliptic_curve::pointsize.

◆ elliptic_multiply_okx()

void elliptic_multiply_okx ( struct elliptic_multiply_test * test,
const char * file,
unsigned int line )
extern

Report elliptic curve point multiplication test result.

Parameters
testElliptic curve point multiplication test
fileTest code file
lineTest code line

Definition at line 93 of file elliptic_test.c.

94 {
95 struct elliptic_curve *curve = test->curve;
96 size_t pointsize = curve->pointsize;
97 size_t keysize = curve->keysize;
98 uint8_t actual[pointsize];
99 const void *base;
100 int rc;
101
102 /* Sanity checks */
103 okx ( ( test->base_len == pointsize ) || ( ! test->base_len ),
104 file, line );
105 okx ( test->scalar_len == keysize, file, line );
106 okx ( ( test->expected_len == pointsize ) || ( ! test->expected_len ),
107 file, line );
108
109 /* Perform point multiplication */
110 base = ( test->base_len ? test->base : curve->base );
111 rc = elliptic_multiply ( curve, base, test->scalar, actual );
112 if ( test->expected_len ) {
113 okx ( rc == 0, file, line );
114 } else {
115 okx ( rc != 0, file, line );
116 }
117
118 /* Check expected result */
119 okx ( memcmp ( actual, test->expected, test->expected_len ) == 0,
120 file, line );
121}
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
uint32_t base
Base.
Definition librm.h:3
An elliptic curve.
Definition crypto.h:178

References base, elliptic_curve::base, elliptic_multiply(), elliptic_curve::keysize, keysize, memcmp(), okx, elliptic_curve::pointsize, rc, and test.

◆ elliptic_add_okx()

void elliptic_add_okx ( struct elliptic_add_test * test,
const char * file,
unsigned int line )
extern

Report elliptic curve point addition test result.

Parameters
testElliptic curve point addition test
fileTest code file
lineTest code line

Definition at line 130 of file elliptic_test.c.

131 {
132 struct elliptic_curve *curve = test->curve;
133 size_t pointsize = curve->pointsize;
134 uint8_t actual[pointsize];
135 int rc;
136
137 /* Sanity checks */
138 okx ( test->addend_len == pointsize, file, line );
139 okx ( test->augend_len == pointsize, file, line );
140 okx ( ( test->expected_len == pointsize ) || ( ! test->expected_len ),
141 file, line );
142
143 /* Perform point addition */
144 rc = elliptic_add ( curve, test->addend, test->augend, actual );
145 if ( test->expected_len ) {
146 okx ( rc == 0, file, line );
147 } else {
148 okx ( rc != 0, file, line );
149 }
150
151 /* Check expected result */
152 okx ( memcmp ( actual, test->expected, test->expected_len ) == 0,
153 file, line );
154}
static int elliptic_add(struct elliptic_curve *curve, const void *addend, const void *augend, void *result)
Definition crypto.h:333

References elliptic_add(), memcmp(), okx, elliptic_curve::pointsize, rc, and test.