mirror of https://github.com/ipxe/ipxe.git
135 lines
3.4 KiB
C
135 lines
3.4 KiB
C
#ifndef _CIPHER_TEST_H
|
|
#define _CIPHER_TEST_H
|
|
|
|
/** @file
|
|
*
|
|
* Cipher self-tests
|
|
*
|
|
*/
|
|
|
|
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
|
|
|
#include <stdint.h>
|
|
#include <ipxe/crypto.h>
|
|
#include <ipxe/test.h>
|
|
|
|
/** 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;
|
|
/** Additional data */
|
|
const void *additional;
|
|
/** Length of additional data */
|
|
size_t additional_len;
|
|
/** Plaintext */
|
|
const void *plaintext;
|
|
/** Ciphertext */
|
|
const void *ciphertext;
|
|
/** Length of text */
|
|
size_t len;
|
|
/** Authentication tag */
|
|
const void *auth;
|
|
/** Length of authentication tag */
|
|
size_t auth_len;
|
|
};
|
|
|
|
/** Define inline key */
|
|
#define KEY(...) { __VA_ARGS__ }
|
|
|
|
/** Define inline initialisation vector */
|
|
#define IV(...) { __VA_ARGS__ }
|
|
|
|
/** Define inline additional data */
|
|
#define ADDITIONAL(...) { __VA_ARGS__ }
|
|
|
|
/** Define inline plaintext data */
|
|
#define PLAINTEXT(...) { __VA_ARGS__ }
|
|
|
|
/** Define inline ciphertext data */
|
|
#define CIPHERTEXT(...) { __VA_ARGS__ }
|
|
|
|
/** Define inline authentication tag */
|
|
#define AUTH(...) { __VA_ARGS__ }
|
|
|
|
/**
|
|
* Define a cipher test
|
|
*
|
|
* @v name Test name
|
|
* @v CIPHER Cipher algorithm
|
|
* @v KEY Key
|
|
* @v IV Initialisation vector
|
|
* @v ADDITIONAL Additional data
|
|
* @v PLAINTEXT Plaintext
|
|
* @v CIPHERTEXT Ciphertext
|
|
* @v AUTH Authentication tag
|
|
* @ret test Cipher test
|
|
*/
|
|
#define CIPHER_TEST( name, CIPHER, KEY, IV, ADDITIONAL, PLAINTEXT, \
|
|
CIPHERTEXT, AUTH ) \
|
|
static const uint8_t name ## _key [] = KEY; \
|
|
static const uint8_t name ## _iv [] = IV; \
|
|
static const uint8_t name ## _additional [] = ADDITIONAL; \
|
|
static const uint8_t name ## _plaintext [] = PLAINTEXT; \
|
|
static const uint8_t name ## _ciphertext \
|
|
[ sizeof ( name ## _plaintext ) ] = CIPHERTEXT; \
|
|
static const uint8_t name ## _auth [] = AUTH; \
|
|
static struct cipher_test name = { \
|
|
.cipher = CIPHER, \
|
|
.key = name ## _key, \
|
|
.key_len = sizeof ( name ## _key ), \
|
|
.iv = name ## _iv, \
|
|
.iv_len = sizeof ( name ## _iv ), \
|
|
.additional = name ## _additional, \
|
|
.additional_len = sizeof ( name ## _additional ), \
|
|
.plaintext = name ## _plaintext, \
|
|
.ciphertext = name ## _ciphertext, \
|
|
.len = sizeof ( name ## _plaintext ), \
|
|
.auth = name ## _auth, \
|
|
.auth_len = sizeof ( name ## _auth ), \
|
|
}
|
|
|
|
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 */
|