blob: 511bdb618108e4f1cddf24a3cb48c54fd62d9aaf [file]
#ifndef _HKDF_TEST_H
#define _HKDF_TEST_H
/** @file
*
* HKDF self-tests
*
*/
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <stdint.h>
#include <ipxe/crypto.h>
#include <ipxe/test.h>
/** Define inline input keying material */
#define IKM(...) { __VA_ARGS__ }
/** Define inline salt */
#define SALT(...) { __VA_ARGS__ }
/** Define inline additional information */
#define INFO(...) { __VA_ARGS__ }
/** Define inline expected pseudorandom key */
#define PRK(...) { __VA_ARGS__ }
/** Define inline absence of expected pseudorandom key */
#define PRK_UNSPECIFIED PRK()
/** Define inline expected output keying material */
#define OKM(...) { __VA_ARGS__ }
/** An HKDF self-test */
struct hkdf_test {
/** Digest algorithm */
struct digest_algorithm *digest;
/** Input keying material */
const void *ikm;
/** Length of input keying material */
size_t ikm_len;
/** Salt */
const void *salt;
/** Length of salt */
size_t salt_len;
/** Additional information */
const void *info;
/** Length of additional information */
size_t info_len;
/** Expected pseudorandom key */
const void *prk;
/** Length of expected pseudorandom key */
size_t prk_len;
/** Expected output keying material */
const void *okm;
/** Length of expected output keying material */
size_t okm_len;
};
/**
* Define an HKDF test
*
* @v name Test name
* @v DIGEST Digest algorithm
* @v SALTED Use salt value
* @v IKM Input keying material
* @v SALT Salt
* @v INFO Additional information
* @v PRK Expected pseudorandom key
* @v OKM Expected output keying material
*/
#define HKDF_TEST( name, DIGEST, SALTED, IKM, SALT, INFO, PRK, OKM ) \
static const uint8_t name ## _ikm[] = IKM; \
static const uint8_t name ## _salt[] = SALT; \
static const uint8_t name ## _info[] = INFO; \
static const uint8_t name ## _prk[] = PRK; \
static const uint8_t name ## _okm[] = OKM; \
static struct hkdf_test name = { \
.digest = DIGEST, \
.ikm = name ## _ikm, \
.ikm_len = sizeof ( name ## _ikm ), \
.salt = ( SALTED ? name ## _salt : NULL ), \
.salt_len = sizeof ( name ## _salt ), \
.info = name ## _info, \
.info_len = sizeof ( name ## _info ), \
.prk = name ## _prk, \
.prk_len = sizeof ( name ## _prk ), \
.okm = name ## _okm, \
.okm_len = sizeof ( name ## _okm ), \
}
extern void hkdf_okx ( struct hkdf_test *test, const char *file,
unsigned int line );
/**
* Report an HKDF test result
*
* @v test HMAC test
*/
#define hkdf_ok( test ) hkdf_okx ( test, __FILE__, __LINE__ )
#endif /* _HKDF_TEST_H */