#ifndef _PUBKEY_TEST_H #define _PUBKEY_TEST_H FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include #include #include /** 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 */