| #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 */ |