mirror of
https://github.com/ipxe/ipxe
synced 2026-10-07 15:05:42 +03:00
Some public key exchange test vector sets provide only the expected shared secret as an output, without specifying the expected public key derived from the private key. Allow key exchange tests to omit the expected public key, so that we can use these public test vectors without needing to synthesize an expected public key value. Signed-off-by: Michael Brown <mcb30@ipxe.org>
90 lines
2.4 KiB
C
90 lines
2.4 KiB
C
#ifndef _EXCHANGE_TEST_H
|
|
#define _EXCHANGE_TEST_H
|
|
|
|
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
|
|
|
#include <stdint.h>
|
|
#include <ipxe/crypto.h>
|
|
#include <ipxe/test.h>
|
|
|
|
/** A key exchange test */
|
|
struct exchange_test {
|
|
/** Key exchange algorithm */
|
|
struct exchange_algorithm *exchange;
|
|
/** Private key */
|
|
const void *private;
|
|
/** Length of private key */
|
|
size_t private_len;
|
|
/** Partner public key */
|
|
const void *partner;
|
|
/** Length of partner key */
|
|
size_t partner_len;
|
|
/** Expected public key */
|
|
const void *public;
|
|
/** Length of expected public key */
|
|
size_t public_len;
|
|
/** Expected shared secret */
|
|
const void *shared;
|
|
/** Length of expected shared secret, or 0 to expect failure */
|
|
size_t shared_len;
|
|
};
|
|
|
|
/** Define inline private key */
|
|
#define PRIVATE(...) { __VA_ARGS__ }
|
|
|
|
/** Define inline partner public key */
|
|
#define PARTNER(...) { __VA_ARGS__ }
|
|
|
|
/** Define inline expected public key */
|
|
#define PUBLIC(...) { __VA_ARGS__ }
|
|
|
|
/** Define inline absence of expected public key */
|
|
#define PUBLIC_UNSPECIFIED PUBLIC()
|
|
|
|
/** Define inline expected shared secret */
|
|
#define SHARED(...) { __VA_ARGS__ }
|
|
|
|
/** Define inline expected failure result */
|
|
#define SHARED_FAIL SHARED()
|
|
|
|
/**
|
|
* Define a key exchange test
|
|
*
|
|
* @v name Test name
|
|
* @v EXCHANGE Key exchange algorithm
|
|
* @v PRIVATE Private key
|
|
* @v PARTNER Partner public key
|
|
* @v PUBLIC Expected public key
|
|
* @v SHARED Expected shared secret
|
|
* @ret test Key exchange test
|
|
*/
|
|
#define EXCHANGE_TEST( name, EXCHANGE, PRIVATE, PARTNER, PUBLIC, \
|
|
SHARED ) \
|
|
static const uint8_t name ## _private[] = PRIVATE; \
|
|
static const uint8_t name ## _partner[] = PARTNER; \
|
|
static const uint8_t name ## _public[] = PUBLIC; \
|
|
static const uint8_t name ## _shared[] = SHARED; \
|
|
static struct exchange_test name = { \
|
|
.exchange = EXCHANGE, \
|
|
.private = name ## _private, \
|
|
.private_len = sizeof ( name ## _private ), \
|
|
.partner = name ## _partner, \
|
|
.partner_len = sizeof ( name ## _partner ), \
|
|
.public = name ## _public, \
|
|
.public_len = sizeof ( name ## _public ), \
|
|
.shared = name ## _shared, \
|
|
.shared_len = sizeof ( name ## _shared ), \
|
|
};
|
|
|
|
/**
|
|
* Report a key exchange test result
|
|
*
|
|
* @v test Key exchange test
|
|
*/
|
|
#define exchange_ok(test) exchange_okx ( test, __FILE__, __LINE__ )
|
|
|
|
extern void exchange_okx ( struct exchange_test *test, const char *file,
|
|
unsigned int line );
|
|
|
|
#endif /* _EXCHANGE_TEST_H */
|