| #ifndef _DIGEST_TEST_H | |
| #define _DIGEST_TEST_H | |
| FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); | |
| #include <stdint.h> | |
| #include <ipxe/crypto.h> | |
| #include <ipxe/test.h> | |
| /** A digest test */ | |
| struct digest_test { | |
| /** Digest algorithm */ | |
| struct digest_algorithm *digest; | |
| /** Test data */ | |
| const void *data; | |
| /** Length of test data */ | |
| size_t len; | |
| /** Expected digest value */ | |
| const void *expected; | |
| /** Expected digest length */ | |
| size_t expected_len; | |
| }; | |
| /** Define inline test data */ | |
| #define DATA(...) { __VA_ARGS__ } | |
| /** Define inline expected digest value */ | |
| #define DIGEST(...) { __VA_ARGS__ } | |
| /** | |
| * Define a digest test | |
| * | |
| * @v name Test name | |
| * @v DIGEST Digest algorithm | |
| * @v DATA Test data | |
| * @v EXPECTED Expected digest value | |
| * @ret test Digest test | |
| */ | |
| #define DIGEST_TEST( name, DIGEST, DATA, EXPECTED ) \ | |
| static const uint8_t name ## _data[] = DATA; \ | |
| static const uint8_t name ## _expected[] = EXPECTED; \ | |
| static struct digest_test name = { \ | |
| .digest = DIGEST, \ | |
| .data = name ## _data, \ | |
| .len = sizeof ( name ## _data ), \ | |
| .expected = name ## _expected, \ | |
| .expected_len = sizeof ( name ## _expected ), \ | |
| }; | |
| /** Standard test vector: empty data */ | |
| #define DIGEST_EMPTY DATA() | |
| /** Standard test vector: NIST string "abc" | |
| * | |
| * The NIST Cryptographic Toolkit examples for all digest algorithms | |
| * include a test vector which is the unterminated string | |
| * | |
| * "abc" | |
| */ | |
| #define DIGEST_NIST_ABC \ | |
| DATA ( 0x61, 0x62, 0x63 ) | |
| /** Standard test vector: NIST string "abc...opq" | |
| * | |
| * The NIST Cryptographic Toolkit examples for all 32-bit digest | |
| * algorithms (SHA-1 and the SHA-256 family) include a test vector | |
| * which is the unterminated string | |
| * | |
| * "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" | |
| */ | |
| #define DIGEST_NIST_ABC_OPQ \ | |
| DATA ( 0x61, 0x62, 0x63, 0x64, 0x62, 0x63, 0x64, 0x65, 0x63, \ | |
| 0x64, 0x65, 0x66, 0x64, 0x65, 0x66, 0x67, 0x65, 0x66, \ | |
| 0x67, 0x68, 0x66, 0x67, 0x68, 0x69, 0x67, 0x68, 0x69, \ | |
| 0x6a, 0x68, 0x69, 0x6a, 0x6b, 0x69, 0x6a, 0x6b, 0x6c, \ | |
| 0x6a, 0x6b, 0x6c, 0x6d, 0x6b, 0x6c, 0x6d, 0x6e, 0x6c, \ | |
| 0x6d, 0x6e, 0x6f, 0x6d, 0x6e, 0x6f, 0x70, 0x6e, 0x6f, \ | |
| 0x70, 0x71 ) | |
| /** Standard test vector: NIST string "abc...stu" | |
| * | |
| * The NIST Cryptographic Toolkit examples for all 64-bit digest | |
| * algorithms (SHA-512 family) include a test vector which is the | |
| * unterminated string | |
| * | |
| * "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn" | |
| * "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" | |
| */ | |
| #define DIGEST_NIST_ABC_STU \ | |
| DATA ( 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x62, \ | |
| 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x63, 0x64, \ | |
| 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x64, 0x65, 0x66, \ | |
| 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x65, 0x66, 0x67, 0x68, \ | |
| 0x69, 0x6a, 0x6b, 0x6c, 0x66, 0x67, 0x68, 0x69, 0x6a, \ | |
| 0x6b, 0x6c, 0x6d, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, \ | |
| 0x6d, 0x6e, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, \ | |
| 0x6f, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, \ | |
| 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x6b, \ | |
| 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x6c, 0x6d, \ | |
| 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x6d, 0x6e, 0x6f, \ | |
| 0x70, 0x71, 0x72, 0x73, 0x74, 0x6e, 0x6f, 0x70, 0x71, \ | |
| 0x72, 0x73, 0x74, 0x75 ) | |
| /** | |
| * Report a digest test result | |
| * | |
| * @v test Digest test | |
| */ | |
| #define digest_ok(test) digest_okx ( test, __FILE__, __LINE__ ) | |
| extern void digest_okx ( struct digest_test *test, const char *file, | |
| unsigned int line ); | |
| extern unsigned long digest_cost ( struct digest_algorithm *digest ); | |
| #endif /* _DIGEST_TEST_H */ |