blob: 20bb94355c8298469df819b5e9255e734253b66b [file] [log] [blame]
#ifndef _PUBKEY_TEST_H
#define _PUBKEY_TEST_H
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <stdint.h>
#include <ipxe/crypto.h>
#include <ipxe/test.h>
/** A public-key encryption and decryption test */
struct pubkey_test {
/** Public-key algorithm */
struct pubkey_algorithm *pubkey;
/** Private key */
const struct asn1_cursor private;
/** Public key */
const struct asn1_cursor public;
/** Plaintext */
const void *plaintext;
/** Length of plaintext */
size_t plaintext_len;
/** Ciphertext
*
* Note that the encryption process may include some random
* padding, so a given plaintext will encrypt to multiple
* different ciphertexts.
*/
const void *ciphertext;
/** Length of ciphertext */
size_t ciphertext_len;
};
/** A public-key signature test */
struct pubkey_sign_test {
/** Public-key algorithm */
struct pubkey_algorithm *pubkey;
/** Private key */
const struct asn1_cursor private;
/** Public key */
const struct asn1_cursor public;
/** Plaintext */
const void *plaintext;
/** Plaintext length */
size_t plaintext_len;
/** Signature algorithm */
struct digest_algorithm *digest;
/** Signature */
const void *signature;
/** Signature length */
size_t signature_len;
};
/** Define inline private key data */
#define PRIVATE(...) { __VA_ARGS__ }
/** Define inline public key data */
#define PUBLIC(...) { __VA_ARGS__ }
/** Define inline plaintext data */
#define PLAINTEXT(...) { __VA_ARGS__ }
/** Define inline ciphertext data */
#define CIPHERTEXT(...) { __VA_ARGS__ }
/** Define inline signature data */
#define SIGNATURE(...) { __VA_ARGS__ }
/**
* Define a public-key encryption and decryption test
*
* @v name Test name
* @v PUBKEY Public-key algorithm
* @v PRIVATE Private key
* @v PUBLIC Public key
* @v PLAINTEXT Plaintext
* @v CIPHERTEXT Ciphertext
* @ret test Encryption and decryption test
*/
#define PUBKEY_TEST( name, PUBKEY, PRIVATE, PUBLIC, PLAINTEXT, \
CIPHERTEXT ) \
static const uint8_t name ## _private[] = PRIVATE; \
static const uint8_t name ## _public[] = PUBLIC; \
static const uint8_t name ## _plaintext[] = PLAINTEXT; \
static const uint8_t name ## _ciphertext[] = CIPHERTEXT; \
static struct pubkey_test name = { \
.pubkey = PUBKEY, \
.private = { \
.data = name ## _private, \
.len = sizeof ( name ## _private ), \
}, \
.public = { \
.data = name ## _public, \
.len = sizeof ( name ## _public ), \
}, \
.plaintext = name ## _plaintext, \
.plaintext_len = sizeof ( name ## _plaintext ), \
.ciphertext = name ## _ciphertext, \
.ciphertext_len = sizeof ( name ## _ciphertext ), \
}
/**
* Define a public-key signature test
*
* @v name Test name
* @v PUBKEY Public-key algorithm
* @v PRIVATE Private key
* @v PUBLIC Public key
* @v PLAINTEXT Plaintext
* @v DIGEST Digest algorithm
* @v SIGNATURE Signature
* @ret test Signature test
*/
#define PUBKEY_SIGN_TEST( name, PUBKEY, PRIVATE, PUBLIC, PLAINTEXT, \
DIGEST, SIGNATURE ) \
static const uint8_t name ## _private[] = PRIVATE; \
static const uint8_t name ## _public[] = PUBLIC; \
static const uint8_t name ## _plaintext[] = PLAINTEXT; \
static const uint8_t name ## _signature[] = SIGNATURE; \
static struct pubkey_sign_test name = { \
.pubkey = PUBKEY, \
.private = { \
.data = name ## _private, \
.len = sizeof ( name ## _private ), \
}, \
.public = { \
.data = name ## _public, \
.len = sizeof ( name ## _public ), \
}, \
.plaintext = name ## _plaintext, \
.plaintext_len = sizeof ( name ## _plaintext ), \
.digest = DIGEST, \
.signature = name ## _signature, \
.signature_len = sizeof ( name ## _signature ), \
}
extern void pubkey_okx ( struct pubkey_test *test,
const char *file, unsigned int line );
extern void pubkey_sign_okx ( struct pubkey_sign_test *test,
const char *file, unsigned int line );
/**
* Report a public key encryption and decryption test result
*
* @v test Public key encryption and decryption test
*/
#define pubkey_ok( test ) \
pubkey_okx ( test, __FILE__, __LINE__ )
/**
* Report a public key signature test result
*
* @v test Public key signature test
*/
#define pubkey_sign_ok( test ) \
pubkey_sign_okx ( test, __FILE__, __LINE__ )
#endif /* _PUBKEY_TEST_H */