|  | #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 */ |