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 
66  /* Test multiplying base point by group order. Result should
67  * be the point at infinity, which should not be representable
68  * as a point in affine coordinates (and so should fail).
69  */
70  okx ( elliptic_multiply ( curve, curve->base, curve->order,
71  point ) != 0, file, line );
72 
73  /* Test multiplying base point by group order plus one, to get
74  * back to the base point.
75  */
76  bigint_init ( &temp.scalar, curve->order, keysize );
77  bigint_init ( &temp.one, one, sizeof ( one ) );
78  bigint_add ( &temp.one, &temp.scalar );
79  bigint_done ( &temp.scalar, scalar, sizeof ( scalar ) );
80  okx ( elliptic_multiply ( curve, curve->base, scalar, point ) == 0,
81  file, line );
82  okx ( memcmp ( point, curve->base, pointsize ) == 0, file, line );
83 }
static int elliptic_multiply(struct elliptic_curve *curve, const void *base, const void *scalar, void *result)
Definition: crypto.h:311
const void * order
Order of the generator (if prime)
Definition: crypto.h:187
#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_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 92 of file elliptic_test.c.

93  {
94  struct elliptic_curve *curve = test->curve;
95  size_t pointsize = curve->pointsize;
96  size_t keysize = curve->keysize;
97  uint8_t actual[pointsize];
98  const void *base;
99  int rc;
100 
101  /* Sanity checks */
102  okx ( ( test->base_len == pointsize ) || ( ! test->base_len ),
103  file, line );
104  okx ( test->scalar_len == keysize, file, line );
105  okx ( ( test->expected_len == pointsize ) || ( ! test->expected_len ),
106  file, line );
107 
108  /* Perform point multiplication */
109  base = ( test->base_len ? test->base : curve->base );
110  rc = elliptic_multiply ( curve, base, test->scalar, actual );
111  if ( test->expected_len ) {
112  okx ( rc == 0, file, line );
113  } else {
114  okx ( rc != 0, file, line );
115  }
116 
117  /* Check expected result */
118  okx ( memcmp ( actual, test->expected, test->expected_len ) == 0,
119  file, line );
120 }
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:311
#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 129 of file elliptic_test.c.

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