#ifndef _CIPHER_TEST_H #define _CIPHER_TEST_H /** @file * * Cipher self-tests * */ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include #include #include /** A cipher test */ struct cipher_test { /** Cipher algorithm */ struct cipher_algorithm *cipher; /** Key */ const void *key; /** Length of key */ size_t key_len; /** Initialisation vector */ const void *iv; /** Length of initialisation vector */ size_t iv_len; /** Plaintext */ const void *plaintext; /** Ciphertext */ const void *ciphertext; /** Length of text */ size_t len; }; /** Define inline key */ #define KEY(...) { __VA_ARGS__ } /** Define inline initialisation vector */ #define IV(...) { __VA_ARGS__ } /** Define inline plaintext data */ #define PLAINTEXT(...) { __VA_ARGS__ } /** Define inline ciphertext data */ #define CIPHERTEXT(...) { __VA_ARGS__ } /** * Define a cipher test * * @v name Test name * @v CIPHER Cipher algorithm * @v KEY Key * @v IV Initialisation vector * @v PLAINTEXT Plaintext * @v CIPHERTEXT Ciphertext * @ret test Cipher test */ #define CIPHER_TEST( name, CIPHER, KEY, IV, PLAINTEXT, CIPHERTEXT ) \ static const uint8_t name ## _key [] = KEY; \ static const uint8_t name ## _iv [] = IV; \ static const uint8_t name ## _plaintext [] = PLAINTEXT; \ static const uint8_t name ## _ciphertext \ [ sizeof ( name ## _plaintext ) ] = CIPHERTEXT; \ static struct cipher_test name = { \ .cipher = CIPHER, \ .key = name ## _key, \ .key_len = sizeof ( name ## _key ), \ .iv = name ## _iv, \ .iv_len = sizeof ( name ## _iv ), \ .plaintext = name ## _plaintext, \ .ciphertext = name ## _ciphertext, \ .len = sizeof ( name ## _plaintext ), \ } extern void cipher_encrypt_okx ( struct cipher_test *test, const char *file, unsigned int line ); extern void cipher_decrypt_okx ( struct cipher_test *test, const char *file, unsigned int line ); extern void cipher_okx ( struct cipher_test *test, const char *file, unsigned int line ); extern unsigned long cipher_cost_encrypt ( struct cipher_algorithm *cipher, size_t key_len ); extern unsigned long cipher_cost_decrypt ( struct cipher_algorithm *cipher, size_t key_len ); /** * Report a cipher encryption test result * * @v test Cipher test */ #define cipher_encrypt_ok( test ) \ cipher_encrypt_okx ( test, __FILE__, __LINE__ ) /** * Report a cipher decryption test result * * @v test Cipher test */ #define cipher_decrypt_ok( test ) \ cipher_decrypt_okx ( test, __FILE__, __LINE__ ) /** * Report a cipher encryption and decryption test result * * @v test Cipher test */ #define cipher_ok( test ) \ cipher_okx ( test, __FILE__, __LINE__ ) #endif /* _CIPHER_TEST_H */