iPXE
Data Structures | Macros | Functions
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(...)   { __VA_ARGS__ }
 Define inline base point. More...
 
#define BASE_GENERATOR   BASE()
 Define base point to be curve's generator. More...
 
#define SCALAR(...)   { __VA_ARGS__ }
 Define inline scalar multiple. More...
 
#define ADDEND(...)   { __VA_ARGS__ }
 Define inline addend point. More...
 
#define AUGEND(...)   { __VA_ARGS__ }
 Define inline augend point. More...
 
#define EXPECTED(...)   { __VA_ARGS__ }
 Define inline expected result point. More...
 
#define EXPECTED_FAIL   EXPECTED()
 Define result as an expected failure. More...
 
#define ELLIPTIC_MULTIPLY_TEST(name, CURVE, BASE, SCALAR, EXPECTED)
 Define an elliptic curve point multiplication test. More...
 
#define ELLIPTIC_ADD_TEST(name, CURVE, ADDEND, AUGEND, EXPECTED)
 Define an elliptic curve point addition test. More...
 
#define elliptic_curve_ok(curve)   elliptic_curve_okx ( curve, __FILE__, __LINE__ )
 Report an elliptic curve sanity test result. More...
 
#define elliptic_multiply_ok(test)   elliptic_multiply_okx ( test, __FILE__, __LINE__ )
 Report an elliptic curve point multiplication test result. More...
 
#define elliptic_add_ok(test)   elliptic_add_okx ( test, __FILE__, __LINE__ )
 Report an elliptic curve point addition test result. More...
 

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. More...
 
void elliptic_multiply_okx (struct elliptic_multiply_test *test, const char *file, unsigned int line)
 Report elliptic curve point multiplication test result. More...
 
void elliptic_add_okx (struct elliptic_add_test *test, const char *file, unsigned int line)
 Report elliptic curve point addition test result. More...
 

Macro Definition Documentation

◆ BASE

#define BASE (   ...)    { __VA_ARGS__ }

Define inline base point.

Definition at line 47 of file elliptic_test.h.

◆ BASE_GENERATOR

#define BASE_GENERATOR   BASE()

Define base point to be curve's generator.

Definition at line 50 of file elliptic_test.h.

◆ SCALAR

#define SCALAR (   ...)    { __VA_ARGS__ }

Define inline scalar multiple.

Definition at line 53 of file elliptic_test.h.

◆ ADDEND

#define ADDEND (   ...)    { __VA_ARGS__ }

Define inline addend point.

Definition at line 56 of file elliptic_test.h.

◆ AUGEND

#define AUGEND (   ...)    { __VA_ARGS__ }

Define inline augend point.

Definition at line 59 of file elliptic_test.h.

◆ EXPECTED

#define EXPECTED (   ...)    { __VA_ARGS__ }

Define inline expected result point.

Definition at line 62 of file elliptic_test.h.

◆ EXPECTED_FAIL

#define EXPECTED_FAIL   EXPECTED()

Define result as an expected failure.

Definition at line 65 of file elliptic_test.h.

◆ 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 ), \
};
const char * name
Definition: ath9k_hw.c:1984
size_t scalar_len
Length of scalar multiple.
Definition: elliptic_test.h:21
An elliptic curve point multiplication test.
Definition: elliptic_test.h:11
#define SCALAR(...)
Define inline scalar multiple.
Definition: elliptic_test.h:53
#define BASE(...)
Define inline base point.
Definition: elliptic_test.h:47
unsigned char uint8_t
Definition: stdint.h:10
#define EXPECTED(...)
Define inline expected result point.
Definition: elliptic_test.h:62
const void * scalar
Scalar multiple.
Definition: elliptic_test.h:19

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.

◆ 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 ), \
};
const char * name
Definition: ath9k_hw.c:1984
#define ADDEND(...)
Define inline addend point.
Definition: elliptic_test.h:56
const void * augend
Augend point.
Definition: elliptic_test.h:37
#define AUGEND(...)
Define inline augend point.
Definition: elliptic_test.h:59
An elliptic curve point addition test.
Definition: elliptic_test.h:29
unsigned char uint8_t
Definition: stdint.h:10
#define EXPECTED(...)
Define inline expected result point.
Definition: elliptic_test.h:62
size_t augend_len
Length of augend point.
Definition: elliptic_test.h:39

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.

◆ elliptic_curve_ok

#define elliptic_curve_ok (   curve)    elliptic_curve_okx ( curve, __FILE__, __LINE__ )

Report an elliptic curve sanity test result.

Parameters
curveElliptic curve

Definition at line 127 of file elliptic_test.h.

◆ elliptic_multiply_ok

#define elliptic_multiply_ok (   test)    elliptic_multiply_okx ( test, __FILE__, __LINE__ )

Report an elliptic curve point multiplication test result.

Parameters
testElliptic curve point multiplication test

Definition at line 135 of file elliptic_test.h.

◆ elliptic_add_ok

#define elliptic_add_ok (   test)    elliptic_add_okx ( test, __FILE__, __LINE__ )

Report an elliptic curve point addition test result.

Parameters
testElliptic curve point addition test

Definition at line 143 of file elliptic_test.h.

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 
)

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 {
58  bigint_t ( bigint_required_size ( keysize ) ) scalar;
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 }
static int elliptic_multiply(struct elliptic_curve *curve, const void *base, const void *scalar, void *result)
Definition: crypto.h:326
const void * order
Order of the generator (if prime)
Definition: crypto.h:187
static int elliptic_is_infinity(struct elliptic_curve *curve, const void *point)
Definition: crypto.h:321
#define bigint_init(value, data, len)
Initialise big integer.
Definition: bigint.h:61
#define okx(success, file, line)
Report test result.
Definition: test.h:44
#define bigint_done(value, out, len)
Finalise big integer.
Definition: bigint.h:74
size_t keysize
Scalar (and private key) size.
Definition: crypto.h:183
#define bigint_required_size(len)
Determine number of elements required for a big-integer type.
Definition: bigint.h:30
unsigned char uint8_t
Definition: stdint.h:10
struct elliptic_curve * curve
Elliptic curve.
Definition: elliptic_test.h:31
u16 keysize
Length of encryption key to be used, network byte order.
Definition: wpa.h:37
const void * base
Generator base point.
Definition: crypto.h:185
size_t pointsize
Point (and public key) size.
Definition: crypto.h:181
#define bigint_add(addend, value)
Add big integers.
Definition: bigint.h:86
int memcmp(const void *first, const void *second, size_t len)
Compare memory regions.
Definition: string.c:114
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
typedef bigint_t(X25519_SIZE) x25519_t
An X25519 unsigned big integer used in internal calculations.

References elliptic_curve::base, bigint_add, bigint_done, bigint_init, bigint_required_size, bigint_t(), elliptic_is_infinity(), elliptic_multiply(), keysize, elliptic_curve::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 
)

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 }
uint32_t base
Base.
Definition: librm.h:138
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static int elliptic_multiply(struct elliptic_curve *curve, const void *base, const void *scalar, void *result)
Definition: crypto.h:326
#define okx(success, file, line)
Report test result.
Definition: test.h:44
size_t keysize
Scalar (and private key) size.
Definition: crypto.h:183
unsigned char uint8_t
Definition: stdint.h:10
u16 keysize
Length of encryption key to be used, network byte order.
Definition: wpa.h:37
An elliptic curve.
Definition: crypto.h:177
const void * base
Generator base point.
Definition: crypto.h:185
size_t pointsize
Point (and public key) size.
Definition: crypto.h:181
int memcmp(const void *first, const void *second, size_t len)
Compare memory regions.
Definition: string.c:114
static int test
Definition: epic100.c:73

References base, elliptic_curve::base, elliptic_multiply(), keysize, elliptic_curve::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 
)

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 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define okx(success, file, line)
Report test result.
Definition: test.h:44
unsigned char uint8_t
Definition: stdint.h:10
static int elliptic_add(struct elliptic_curve *curve, const void *addend, const void *augend, void *result)
Definition: crypto.h:332
An elliptic curve.
Definition: crypto.h:177
size_t pointsize
Point (and public key) size.
Definition: crypto.h:181
int memcmp(const void *first, const void *second, size_t len)
Compare memory regions.
Definition: string.c:114
static int test
Definition: epic100.c:73

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