iPXE
hmac_test.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2022 Michael Brown <mbrown@fensystems.co.uk>.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of the
7 * License, or any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17 * 02110-1301, USA.
18 *
19 * You can also choose to distribute this program under the terms of
20 * the Unmodified Binary Distribution Licence (as given in the file
21 * COPYING.UBDL), provided that you have satisfied its requirements.
22 */
23
24FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
25
26/** @file
27 *
28 * HMAC self-tests
29 *
30 */
31
32/* Forcibly enable assertions */
33#undef NDEBUG
34
35#include <string.h>
36#include <ipxe/hmac.h>
37#include <ipxe/md5.h>
38#include <ipxe/sha1.h>
39#include <ipxe/sha256.h>
40#include <ipxe/test.h>
41#include "hmac_test.h"
42
43/**
44 * Report an HMAC test result
45 *
46 * @v test HMAC test
47 * @v file Test code file
48 * @v line Test code line
49 */
50void hmac_okx ( struct hmac_test *test, const char *file,
51 unsigned int line ) {
52 struct digest_algorithm *digest = test->digest;
53 uint8_t ctx[ hmac_ctxsize ( digest ) ];
54 uint8_t key[ hmac_keysize ( digest ) ];
55 uint8_t hmac[digest->digestsize];
56
57 /* Sanity checks */
58 okx ( sizeof ( ctx ) == ( digest->ctxsize + digest->blocksize ),
59 file, line );
60 okx ( sizeof ( key ) == digest->blocksize, file, line );
61 okx ( test->expected_len > 0, file, line );
62 okx ( test->expected_len <= digest->digestsize, file, line );
63
64 /* Calculate HMAC */
65 DBGC ( test, "HMAC-%s key:\n", digest->name );
66 DBGC_HDA ( test, 0, test->key, test->key_len );
67 DBGC ( test, "HMAC-%s data:\n", digest->name );
68 DBGC_HDA ( test, 0, test->data, test->data_len );
69 hmac_init ( digest, ctx, test->key, test->key_len );
70 hmac_update ( digest, ctx, test->data, test->data_len );
71 hmac_final ( digest, ctx, hmac );
72 DBGC ( test, "HMAC-%s result:\n", digest->name );
73 DBGC_HDA ( test, 0, hmac, sizeof ( hmac ) );
74 okx ( memcmp ( hmac, test->expected, test->expected_len ) == 0,
75 file, line );
76
77 /* Calculate HMAC using reduced key */
78 hmac_key ( digest, ctx, test->key, test->key_len, key );
79 DBGC ( test, "HMAC-%s key:\n", digest->name );
80 DBGC_HDA ( test, 0, key, sizeof ( key ) );
81 hmac_init_key ( digest, ctx, key );
82 hmac_update ( digest, ctx, test->data, test->data_len );
83 hmac_final ( digest, ctx, hmac );
84 DBGC ( test, "HMAC-%s result:\n", digest->name );
85 DBGC_HDA ( test, 0, hmac, sizeof ( hmac ) );
86 okx ( memcmp ( hmac, test->expected, test->expected_len ) == 0,
87 file, line );
88}
89
90/* Empty key and data */
91HMAC_TEST ( hmac_empty, &sha256_algorithm, KEY(), DATA(),
92 EXPECTED ( 0xb6, 0x13, 0x67, 0x9a, 0x08, 0x14, 0xd9, 0xec, 0x77,
93 0x2f, 0x95, 0xd7, 0x78, 0xc3, 0x5f, 0xc5, 0xff, 0x16,
94 0x97, 0xc4, 0x93, 0x71, 0x56, 0x53, 0xc6, 0xc7, 0x12,
95 0x14, 0x42, 0x92, 0xc5, 0xad ) );
96
97/* "Hello world" */
99 KEY ( 'H', 'e', 'l', 'l', 'o' ),
100 DATA ( 'W', 'o', 'r', 'l', 'd' ),
101 EXPECTED ( 0x59, 0x16, 0x8e, 0x30, 0x9f, 0x2c, 0x97, 0xdd, 0x04,
102 0xe4, 0x5b, 0xe3, 0xe7, 0x9b, 0xd9, 0xac, 0xb6, 0xd2,
103 0x2f, 0xda, 0x65, 0x46, 0xc0, 0x0c, 0x53, 0x92, 0x82,
104 0xc4, 0x1e, 0xeb, 0x91, 0x6e ) );
105
106/* "Hello world" using SHA-1 */
107HMAC_TEST ( hmac_hw_sha1, &sha1_algorithm,
108 KEY ( 'H', 'e', 'l', 'l', 'o' ),
109 DATA ( 'W', 'o', 'r', 'l', 'd' ),
110 EXPECTED ( 0x9e, 0x29, 0xcf, 0x6d, 0x48, 0x90, 0x49, 0x9e, 0xf8,
111 0x5a, 0x31, 0x47, 0x55, 0x7b, 0x1a, 0x45, 0xd5, 0xae,
112 0xd1, 0x77 ) );
113
114/* "Hello world" using MD5 */
115HMAC_TEST ( hmac_hw_md5, &md5_algorithm,
116 KEY ( 'H', 'e', 'l', 'l', 'o' ),
117 DATA ( 'W', 'o', 'r', 'l', 'd' ),
118 EXPECTED ( 0xc7, 0x1c, 0x0c, 0xd0, 0xdc, 0x24, 0x49, 0xbd, 0xd8,
119 0x9d, 0x28, 0xeb, 0x03, 0xbe, 0xf2, 0x04 ) );
120
121/* Block-length key */
123 KEY ( 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
124 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13,
125 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
126 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
127 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
128 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
129 0x3c, 0x3d, 0x3e, 0x3f ),
130 DATA ( 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd' ),
131 EXPECTED ( 0xdd, 0x05, 0xcc, 0xe6, 0xd6, 0xaf, 0x91, 0x61, 0x4b,
132 0xaf, 0x35, 0x6b, 0x86, 0x0a, 0x05, 0x67, 0x25, 0x22,
133 0xf0, 0x54, 0xd2, 0x5f, 0xd7, 0xe1, 0x54, 0x26, 0x01,
134 0x16, 0xfd, 0x8a, 0xf3, 0x5b ) );
135
136/* Over-length key */
138 KEY ( 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
139 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13,
140 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
141 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
142 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
143 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
144 0x3c, 0x3d, 0x3e, 0x3f, 0x40 ),
145 DATA ( 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd' ),
146 EXPECTED ( 0x4f, 0x0f, 0x42, 0x07, 0xda, 0x84, 0x3d, 0x2a, 0x34,
147 0xae, 0x5d, 0xd9, 0x05, 0x1e, 0x96, 0xa8, 0xb6, 0xef,
148 0xa1, 0xcd, 0x49, 0x5b, 0xea, 0x30, 0xbf, 0x47, 0x3b,
149 0xdc, 0xa9, 0x86, 0xbb, 0x31 ) );
150
151/**
152 * Perform HMAC self-tests
153 *
154 */
155static void hmac_test_exec ( void ) {
156
157 hmac_ok ( &hmac_empty );
158 hmac_ok ( &hmac_hw );
159 hmac_ok ( &hmac_hw_sha1 );
160 hmac_ok ( &hmac_hw_md5 );
161 hmac_ok ( &hmac_maxlen );
162 hmac_ok ( &hmac_overlen );
163}
164
165/** HMAC self-tests */
167 .name = "hmac",
168 .exec = hmac_test_exec,
169};
struct golan_eq_context ctx
Definition CIB_PRM.h:0
union @162305117151260234136356364136041353210355154177 key
#define DATA(...)
Define inline data.
Definition acpi_test.c:74
unsigned char uint8_t
Definition stdint.h:10
#define KEY(...)
Define inline key.
Definition cipher_test.h:45
#define EXPECTED(...)
Define inline expected result point.
static int test
Definition epic100.c:73
#define DBGC(...)
Definition compiler.h:530
#define DBGC_HDA(...)
Definition compiler.h:531
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
Definition compiler.h:921
void hmac_init(struct digest_algorithm *digest, void *ctx, const void *secret, size_t len)
Initialise HMAC.
Definition hmac.c:106
void hmac_final(struct digest_algorithm *digest, void *ctx, void *hmac)
Finalise HMAC.
Definition hmac.c:124
void hmac_key(struct digest_algorithm *digest, void *ctx, const void *secret, size_t len, void *key)
Construct HMAC reduced key.
Definition hmac.c:59
void hmac_init_key(struct digest_algorithm *digest, void *ctx, const void *key)
Initialise HMAC from reduced key.
Definition hmac.c:82
Keyed-Hashing for Message Authentication.
static void hmac_update(struct digest_algorithm *digest, void *ctx, const void *data, size_t len)
Update HMAC.
Definition hmac.h:62
static size_t hmac_ctxsize(struct digest_algorithm *digest)
Calculate HMAC context size.
Definition hmac.h:48
static size_t hmac_keysize(struct digest_algorithm *digest)
Calculate HMAC reduced key size.
Definition hmac.h:35
void hmac_okx(struct hmac_test *test, const char *file, unsigned int line)
Report an HMAC test result.
Definition hmac_test.c:50
static void hmac_test_exec(void)
Perform HMAC self-tests.
Definition hmac_test.c:155
HMAC self-tests.
#define HMAC_TEST(name, DIGEST, KEY, DATA, EXPECTED)
Define an HMAC test.
Definition hmac_test.h:53
#define hmac_ok(test)
Report an HMAC test result.
Definition hmac_test.h:75
String functions.
MD5 algorithm.
struct digest_algorithm md5_algorithm
SHA-1 algorithm.
struct digest_algorithm sha1_algorithm
SHA-256 algorithm.
struct digest_algorithm sha256_algorithm
int memcmp(const void *first, const void *second, size_t len)
Compare memory regions.
Definition string.c:115
A message digest algorithm.
Definition crypto.h:19
size_t digestsize
Digest size.
Definition crypto.h:27
size_t blocksize
Block size.
Definition crypto.h:25
size_t ctxsize
Context size.
Definition crypto.h:23
const char * name
Algorithm name.
Definition crypto.h:21
An HMAC test.
Definition hmac_test.h:26
A self-test set.
Definition test.h:15
Self-test infrastructure.
#define okx(success, file, line)
Report test result.
Definition test.h:44
#define __self_test
Declare a self-test.
Definition test.h:32