blob: cd65b87032ef229ecd3eb38a994788eff9f5f516 [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>
/**
* Report public key decryption test result
*
* @v pubkey Public key algorithm
* @v key Key
* @v key_len Key length
* @v ciphertext Ciphertext
* @v ciphertext_len Ciphertext length
* @v expected Expected plaintext
* @v expected_len Expected plaintext length
*/
#define pubkey_decrypt_ok( pubkey, key, key_len, ciphertext, \
ciphertext_len, expected, expected_len ) do {\
uint8_t ctx[ (pubkey)->ctxsize ]; \
\
ok ( pubkey_init ( (pubkey), ctx, (key), (key_len) ) == 0 ); \
{ \
size_t max_len = pubkey_max_len ( (pubkey), ctx ); \
uint8_t decrypted[ max_len ]; \
int decrypted_len; \
\
decrypted_len = pubkey_decrypt ( (pubkey), ctx, \
(ciphertext), \
(ciphertext_len), \
decrypted ); \
ok ( decrypted_len == ( ( int ) (expected_len) ) ); \
ok ( memcmp ( decrypted, (expected), \
(expected_len) ) == 0 ); \
} \
pubkey_final ( (pubkey), ctx ); \
} while ( 0 )
/**
* Report public key encryption and decryption test result
*
* @v pubkey Public key algorithm
* @v encrypt_key Encryption key
* @v encrypt_key_len Encryption key length
* @v decrypt_key Decryption key
* @v decrypt_key_len Decryption key length
* @v plaintext Plaintext
* @v plaintext_len Plaintext length
*/
#define pubkey_encrypt_ok( pubkey, encrypt_key, encrypt_key_len, \
decrypt_key, decrypt_key_len, plaintext, \
plaintext_len ) do { \
uint8_t ctx[ (pubkey)->ctxsize ]; \
\
ok ( pubkey_init ( (pubkey), ctx, (encrypt_key), \
(encrypt_key_len) ) == 0 ); \
{ \
size_t max_len = pubkey_max_len ( (pubkey), ctx ); \
uint8_t encrypted[ max_len ]; \
int encrypted_len; \
\
encrypted_len = pubkey_encrypt ( (pubkey), ctx, \
(plaintext), \
(plaintext_len), \
encrypted ); \
ok ( encrypted_len >= 0 ); \
pubkey_decrypt_ok ( (pubkey), (decrypt_key), \
(decrypt_key_len), encrypted, \
encrypted_len, (plaintext), \
(plaintext_len) ); \
} \
pubkey_final ( (pubkey), ctx ); \
} while ( 0 )
/**
* Report public key signature test result
*
* @v pubkey Public key algorithm
* @v key Key
* @v key_len Key length
* @v digest Digest algorithm
* @v plaintext Plaintext
* @v plaintext_len Plaintext length
* @v expected Expected signature
* @v expected_len Expected signature length
*/
#define pubkey_sign_ok( pubkey, key, key_len, digest, plaintext, \
plaintext_len, expected, expected_len ) do { \
uint8_t ctx[ (pubkey)->ctxsize ]; \
uint8_t digestctx[ (digest)->ctxsize ]; \
uint8_t digestout[ (digest)->digestsize ]; \
\
digest_init ( (digest), digestctx ); \
digest_update ( (digest), digestctx, (plaintext), \
(plaintext_len) ); \
digest_final ( (digest), digestctx, digestout ); \
\
ok ( pubkey_init ( (pubkey), ctx, (key), (key_len) ) == 0 ); \
{ \
size_t max_len = pubkey_max_len ( (pubkey), ctx ); \
uint8_t signature[ max_len ]; \
int signature_len; \
\
signature_len = pubkey_sign ( (pubkey), ctx, (digest), \
digestout, signature ); \
ok ( signature_len == ( ( int ) (expected_len) ) ); \
ok ( memcmp ( signature, (expected), \
(expected_len) ) == 0 ); \
} \
pubkey_final ( (pubkey), ctx ); \
} while ( 0 )
/**
* Report public key verification test result
*
* @v pubkey Public key algorithm
* @v key Key
* @v key_len Key length
* @v digest Digest algorithm
* @v plaintext Plaintext
* @v plaintext_len Plaintext length
* @v signature Signature
* @v signature_len Signature length
*/
#define pubkey_verify_ok( pubkey, key, key_len, digest, plaintext, \
plaintext_len, signature, signature_len ) do {\
uint8_t ctx[ (pubkey)->ctxsize ]; \
uint8_t digestctx[ (digest)->ctxsize ]; \
uint8_t digestout[ (digest)->digestsize ]; \
\
digest_init ( (digest), digestctx ); \
digest_update ( (digest), digestctx, (plaintext), \
(plaintext_len) ); \
digest_final ( (digest), digestctx, digestout ); \
\
ok ( pubkey_init ( (pubkey), ctx, (key), (key_len) ) == 0 ); \
ok ( pubkey_verify ( (pubkey), ctx, (digest), digestout, \
(signature), (signature_len) ) == 0 ); \
pubkey_final ( (pubkey), ctx ); \
} while ( 0 )
/**
* Report public key verification test result
*
* @v pubkey Public key algorithm
* @v key Key
* @v key_len Key length
* @v digest Digest algorithm
* @v plaintext Plaintext
* @v plaintext_len Plaintext length
* @v signature Signature
* @v signature_len Signature length
*/
#define pubkey_verify_fail_ok( pubkey, key, key_len, digest, plaintext, \
plaintext_len, signature, \
signature_len ) do { \
uint8_t ctx[ (pubkey)->ctxsize ]; \
uint8_t digestctx[ (digest)->ctxsize ]; \
uint8_t digestout[ (digest)->digestsize ]; \
\
digest_init ( (digest), digestctx ); \
digest_update ( (digest), digestctx, (plaintext), \
(plaintext_len) ); \
digest_final ( (digest), digestctx, digestout ); \
\
ok ( pubkey_init ( (pubkey), ctx, (key), (key_len) ) == 0 ); \
ok ( pubkey_verify ( (pubkey), ctx, (digest), digestout, \
(signature), (signature_len) ) != 0 ); \
pubkey_final ( (pubkey), ctx ); \
} while ( 0 )
#endif /* _PUBKEY_TEST_H */