xref: /freebsd/contrib/ntp/tests/libntp/digests.c (revision f5f40dd63bc7acbb5312b26ac1ea1103c12352a6)
1e6bfd18dSCy Schubert #include "config.h"
2e6bfd18dSCy Schubert 
3e6bfd18dSCy Schubert #include <fcntl.h>
4e6bfd18dSCy Schubert #include <sys/types.h>
5e6bfd18dSCy Schubert #include <sys/stat.h>
6e6bfd18dSCy Schubert #include <unistd.h>
7e6bfd18dSCy Schubert 
8e6bfd18dSCy Schubert #include "unity.h"
9e6bfd18dSCy Schubert #include "ntp.h"
10e6bfd18dSCy Schubert #include "ntp_stdlib.h"
11e6bfd18dSCy Schubert 
12e6bfd18dSCy Schubert /*
13e6bfd18dSCy Schubert  * tests/libntp/data/ntp.keys has two keys for each algorithm, 50 keyids apart.
14e6bfd18dSCy Schubert  * The first is 20 random ASCII chars, the 2nd 40 random hex values.
15e6bfd18dSCy Schubert  */
16e6bfd18dSCy Schubert #define HEX_KEYID_OFFSET	50
17e6bfd18dSCy Schubert 
18e6bfd18dSCy Schubert /* in generated srcdir.c */
19e6bfd18dSCy Schubert extern const char srcdir[];
20e6bfd18dSCy Schubert 
21e6bfd18dSCy Schubert /* needed by authtrust() */
22e6bfd18dSCy Schubert u_long			current_time;
23e6bfd18dSCy Schubert 
24e6bfd18dSCy Schubert static bool		setup;
25e6bfd18dSCy Schubert static u_int32 *	pkt;
26e6bfd18dSCy Schubert static size_t		pkt_sz;
27e6bfd18dSCy Schubert static u_char *		mac;
28e6bfd18dSCy Schubert 
29e6bfd18dSCy Schubert /* helper routine */
30e6bfd18dSCy Schubert void dump_mac(keyid_t keyid, u_char *pmac, size_t octets);
31e6bfd18dSCy Schubert 
32e6bfd18dSCy Schubert 
33e6bfd18dSCy Schubert /* unity calls setUp before each test routine */
34e6bfd18dSCy Schubert void setUp(void);
35e6bfd18dSCy Schubert void
36e6bfd18dSCy Schubert setUp(void)
37e6bfd18dSCy Schubert {
38e6bfd18dSCy Schubert 	static bool	done_once;
39e6bfd18dSCy Schubert 	const char	msg_rel_fname[] =	"data/mills,david-03.jpg";
40e6bfd18dSCy Schubert 	const char	keys_rel_fname[] =	"data/ntp.keys";
41e6bfd18dSCy Schubert 	char		msg_fname[PATH_MAX];
42e6bfd18dSCy Schubert 	char		keys_fname[PATH_MAX];
43e6bfd18dSCy Schubert 	int		msgf;
44e6bfd18dSCy Schubert 	int		result;
45e6bfd18dSCy Schubert 	struct stat	msg_stat;
46e6bfd18dSCy Schubert 	u_char *	msg;
47e6bfd18dSCy Schubert 	size_t		msg_sz;
48e6bfd18dSCy Schubert 	size_t		pad_sz;
49e6bfd18dSCy Schubert 	ssize_t		octets;
50e6bfd18dSCy Schubert 
51e6bfd18dSCy Schubert 	if (done_once) {
52e6bfd18dSCy Schubert 		return;
53e6bfd18dSCy Schubert 	}
54e6bfd18dSCy Schubert 	done_once = TRUE;
55e6bfd18dSCy Schubert 
56e6bfd18dSCy Schubert 	init_auth();
57e6bfd18dSCy Schubert 
58e6bfd18dSCy Schubert 	snprintf(keys_fname, sizeof(keys_fname), "%s/%s", srcdir,
59e6bfd18dSCy Schubert 		 keys_rel_fname);
60e6bfd18dSCy Schubert 	if (! authreadkeys(keys_fname)) {
61e6bfd18dSCy Schubert 		fprintf(stderr, "could not load keys %s\n", keys_fname);
62e6bfd18dSCy Schubert 		return;
63e6bfd18dSCy Schubert 	}
64e6bfd18dSCy Schubert 
65e6bfd18dSCy Schubert 	snprintf(msg_fname, sizeof(msg_fname), "%s/%s", srcdir, msg_rel_fname);
66e6bfd18dSCy Schubert 	msgf = open(msg_fname, O_RDONLY);
67e6bfd18dSCy Schubert 	if (msgf < 0) {
68e6bfd18dSCy Schubert 		fprintf(stderr, "could not open msg file %s\n", msg_fname);
69e6bfd18dSCy Schubert 		return;
70e6bfd18dSCy Schubert 	}
71e6bfd18dSCy Schubert 
72e6bfd18dSCy Schubert 	result = fstat(msgf, &msg_stat);
73e6bfd18dSCy Schubert 	if (result < 0) {
74e6bfd18dSCy Schubert 		fprintf(stderr, "could not get msg file %s size\n", msg_fname);
75e6bfd18dSCy Schubert 		return;
76e6bfd18dSCy Schubert 	}
77e6bfd18dSCy Schubert 
78e6bfd18dSCy Schubert 	msg_sz = msg_stat.st_size;
79e6bfd18dSCy Schubert 	/* round up to next multiple of 4 as needed by MD5authencrypt() */
80e6bfd18dSCy Schubert 	pad_sz = sizeof(u_int32) - (msg_sz % sizeof(u_int32));
81e6bfd18dSCy Schubert 	if (sizeof(u_int32) == pad_sz) {
82e6bfd18dSCy Schubert 		pad_sz = 0;
83e6bfd18dSCy Schubert 	}
84e6bfd18dSCy Schubert 	/* allocate room for the message, key ID, and MAC */
85e6bfd18dSCy Schubert 	msg = emalloc_zero(msg_sz + pad_sz + MAX_MAC_LEN);
86e6bfd18dSCy Schubert 	octets = read(msgf, msg, msg_sz);
87e6bfd18dSCy Schubert 	if (octets != msg_sz) {
88e6bfd18dSCy Schubert 		fprintf(stderr, "could not read msg from file %s, %u != %u\n",
89e6bfd18dSCy Schubert 			msg_fname, (u_int)octets, (u_int)msg_sz);
90e6bfd18dSCy Schubert 		return;
91e6bfd18dSCy Schubert 	}
92e6bfd18dSCy Schubert 	zero_mem(msg + msg_sz, pad_sz);
93e6bfd18dSCy Schubert 	pkt_sz = msg_sz + pad_sz;
94e6bfd18dSCy Schubert 	mac = (void *)((u_char *)msg + pkt_sz);
95e6bfd18dSCy Schubert 	pkt = (void *)msg;
96e6bfd18dSCy Schubert 
97e6bfd18dSCy Schubert 	setup = TRUE;
98e6bfd18dSCy Schubert }
99e6bfd18dSCy Schubert 
100e6bfd18dSCy Schubert /* reduce code duplication with an ugly macro */
101e6bfd18dSCy Schubert #define TEST_ONE_DIGEST(key, exp_sz, exp_mac)				\
102e6bfd18dSCy Schubert do {									\
103e6bfd18dSCy Schubert 	size_t res_sz;							\
104e6bfd18dSCy Schubert 									\
105e6bfd18dSCy Schubert 	zero_mem(mac, MAX_MAC_LEN);					\
106e6bfd18dSCy Schubert 	if (!auth_findkey(key)) {					\
107e6bfd18dSCy Schubert 		TEST_IGNORE_MESSAGE("MAC unsupported on this system");	\
108e6bfd18dSCy Schubert 		return;							\
109e6bfd18dSCy Schubert 	}								\
110e6bfd18dSCy Schubert 	authtrust((key), 1);						\
111e6bfd18dSCy Schubert 									\
112e6bfd18dSCy Schubert 	res_sz = authencrypt((key), pkt, pkt_sz);			\
113*f5f40dd6SCy Schubert 	if (0 == res_sz) {						\
114e6bfd18dSCy Schubert 		TEST_IGNORE_MESSAGE("Likely OpenSSL 3 failed digest "	\
115e6bfd18dSCy Schubert 				    "init.");				\
116e6bfd18dSCy Schubert 		return;							\
117e6bfd18dSCy Schubert 	}								\
118e6bfd18dSCy Schubert 	TEST_ASSERT_EQUAL_UINT((u_int)((exp_sz) + KEY_MAC_LEN), res_sz);\
119e6bfd18dSCy Schubert 	dump_mac((key), mac, res_sz);					\
120e6bfd18dSCy Schubert 	TEST_ASSERT_EQUAL_HEX8_ARRAY((exp_mac), mac, MAX_MAC_LEN);	\
121e6bfd18dSCy Schubert } while (FALSE)
122e6bfd18dSCy Schubert 
123e6bfd18dSCy Schubert 
124e6bfd18dSCy Schubert #define AES128CMAC_KEYID	1
125e6bfd18dSCy Schubert #undef KEYID_A
126e6bfd18dSCy Schubert #define KEYID_A			AES128CMAC_KEYID
127e6bfd18dSCy Schubert #undef DG_SZ
128e6bfd18dSCy Schubert #define DG_SZ			16
129e6bfd18dSCy Schubert #undef KEYID_B
130e6bfd18dSCy Schubert #define KEYID_B			(KEYID_A + HEX_KEYID_OFFSET)
131e6bfd18dSCy Schubert void test_Digest_AES128CMAC(void);
132e6bfd18dSCy Schubert void test_Digest_AES128CMAC(void)
133e6bfd18dSCy Schubert {
134e6bfd18dSCy Schubert #if defined(OPENSSL) && defined(ENABLE_CMAC)
135e6bfd18dSCy Schubert 	u_char expectedA[MAX_MAC_LEN] =
136e6bfd18dSCy Schubert 		{
137e6bfd18dSCy Schubert 			0, 0, 0, KEYID_A,
138e6bfd18dSCy Schubert 			0x34, 0x5b, 0xcf, 0xa8,
139e6bfd18dSCy Schubert 			0x85, 0x6e, 0x9d, 0x01,
140e6bfd18dSCy Schubert 			0xeb, 0x81, 0x25, 0xc2,
141e6bfd18dSCy Schubert 			0xa4, 0xb8, 0x1b, 0xe0
142e6bfd18dSCy Schubert 		};
143e6bfd18dSCy Schubert 	u_char expectedB[MAX_MAC_LEN] =
144e6bfd18dSCy Schubert 		{
145e6bfd18dSCy Schubert 			0, 0, 0, KEYID_B,
146e6bfd18dSCy Schubert 			0xd1, 0x04, 0x4e, 0xbf,
147e6bfd18dSCy Schubert 			0x79, 0x2d, 0x3a, 0x40,
148e6bfd18dSCy Schubert 			0xcd, 0xdc, 0x5a, 0x44,
149e6bfd18dSCy Schubert 			0xde, 0xe0, 0x0c, 0x84
150e6bfd18dSCy Schubert 		};
151e6bfd18dSCy Schubert 
152e6bfd18dSCy Schubert 	TEST_ASSERT(setup);
153e6bfd18dSCy Schubert 	TEST_ONE_DIGEST(KEYID_A, DG_SZ, expectedA);
154e6bfd18dSCy Schubert 	TEST_ONE_DIGEST(KEYID_B, DG_SZ, expectedB);
155e6bfd18dSCy Schubert #else	/* ! (OPENSSL && ENABLE_CMAC) follows  */
156e6bfd18dSCy Schubert 	TEST_IGNORE_MESSAGE("Skipping, no OPENSSL or not ENABLE_CMAC");
157e6bfd18dSCy Schubert #endif
158e6bfd18dSCy Schubert }
159e6bfd18dSCy Schubert 
160e6bfd18dSCy Schubert 
161e6bfd18dSCy Schubert #define MD4_KEYID		2
162e6bfd18dSCy Schubert #undef KEYID_A
163e6bfd18dSCy Schubert #define KEYID_A			MD4_KEYID
164e6bfd18dSCy Schubert #undef DG_SZ
165e6bfd18dSCy Schubert #define DG_SZ			16
166e6bfd18dSCy Schubert #undef KEYID_B
167e6bfd18dSCy Schubert #define KEYID_B			(KEYID_A + HEX_KEYID_OFFSET)
168e6bfd18dSCy Schubert void test_Digest_MD4(void);
169e6bfd18dSCy Schubert void test_Digest_MD4(void)
170e6bfd18dSCy Schubert {
171e6bfd18dSCy Schubert #ifdef OPENSSL
172e6bfd18dSCy Schubert 	u_char expectedA[MAX_MAC_LEN] =
173e6bfd18dSCy Schubert 		{
174e6bfd18dSCy Schubert 			0, 0, 0, KEYID_A,
175e6bfd18dSCy Schubert 			0xf3, 0x39, 0x34, 0xca,
176e6bfd18dSCy Schubert 			0xe0, 0x48, 0x26, 0x0f,
177e6bfd18dSCy Schubert 			0x13, 0xca, 0x56, 0x9e,
178e6bfd18dSCy Schubert 			0xbc, 0x53, 0x9c, 0x66
179e6bfd18dSCy Schubert 		};
180e6bfd18dSCy Schubert 	u_char expectedB[MAX_MAC_LEN] =
181e6bfd18dSCy Schubert 		{
182e6bfd18dSCy Schubert 			0, 0, 0, KEYID_B,
183e6bfd18dSCy Schubert 			0x5e, 0xe6, 0x81, 0xf2,
184e6bfd18dSCy Schubert 			0x57, 0x57, 0x8a, 0x2b,
185e6bfd18dSCy Schubert 			0xa8, 0x76, 0x8e, 0x7a,
186e6bfd18dSCy Schubert 			0xc4, 0xf4, 0x34, 0x7e
187e6bfd18dSCy Schubert 		};
188e6bfd18dSCy Schubert 
189e6bfd18dSCy Schubert 	TEST_ASSERT(setup);
190e6bfd18dSCy Schubert 	TEST_ONE_DIGEST(KEYID_A, DG_SZ, expectedA);
191e6bfd18dSCy Schubert 	TEST_ONE_DIGEST(KEYID_B, DG_SZ, expectedB);
192e6bfd18dSCy Schubert #else	/* ! OPENSSL follows  */
193e6bfd18dSCy Schubert 	TEST_IGNORE_MESSAGE("Skipping, no OPENSSL");
194e6bfd18dSCy Schubert #endif
195e6bfd18dSCy Schubert }
196e6bfd18dSCy Schubert 
197e6bfd18dSCy Schubert 
198e6bfd18dSCy Schubert #define MD5_KEYID		3
199e6bfd18dSCy Schubert #undef KEYID_A
200e6bfd18dSCy Schubert #define KEYID_A			MD5_KEYID
201e6bfd18dSCy Schubert #undef DG_SZ
202e6bfd18dSCy Schubert #define DG_SZ			16
203e6bfd18dSCy Schubert #undef KEYID_B
204e6bfd18dSCy Schubert #define KEYID_B			(KEYID_A + HEX_KEYID_OFFSET)
205e6bfd18dSCy Schubert void test_Digest_MD5(void);
206e6bfd18dSCy Schubert void test_Digest_MD5(void)
207e6bfd18dSCy Schubert {
208e6bfd18dSCy Schubert 	u_char expectedA[MAX_MAC_LEN] =
209e6bfd18dSCy Schubert 		{
210e6bfd18dSCy Schubert 			0, 0, 0, KEYID_A,
211e6bfd18dSCy Schubert 			0xa6, 0x8d, 0x3a, 0xfe,
212e6bfd18dSCy Schubert 			0x52, 0xe5, 0xf7, 0xe9,
213e6bfd18dSCy Schubert 			0x4c, 0x97, 0x72, 0x16,
214e6bfd18dSCy Schubert 			0x7c, 0x28, 0x18, 0xaf
215e6bfd18dSCy Schubert 		};
216e6bfd18dSCy Schubert 	u_char expectedB[MAX_MAC_LEN] =
217e6bfd18dSCy Schubert 		{
218e6bfd18dSCy Schubert 			0, 0, 0, KEYID_B,
219e6bfd18dSCy Schubert 			0xd4, 0x11, 0x2c, 0xc6,
220e6bfd18dSCy Schubert 			0x66, 0x74, 0x46, 0x8b,
221e6bfd18dSCy Schubert 			0x12, 0xb1, 0x8c, 0x49,
222e6bfd18dSCy Schubert 			0xb0, 0x06, 0xda, 0x34
223e6bfd18dSCy Schubert 		};
224e6bfd18dSCy Schubert 
225e6bfd18dSCy Schubert 	TEST_ASSERT(setup);
226e6bfd18dSCy Schubert 	TEST_ONE_DIGEST(KEYID_A, DG_SZ, expectedA);
227e6bfd18dSCy Schubert 	TEST_ONE_DIGEST(KEYID_B, DG_SZ, expectedB);
228e6bfd18dSCy Schubert }
229e6bfd18dSCy Schubert 
230e6bfd18dSCy Schubert 
231e6bfd18dSCy Schubert #define MDC2_KEYID		4
232e6bfd18dSCy Schubert #undef KEYID_A
233e6bfd18dSCy Schubert #define KEYID_A			MDC2_KEYID
234e6bfd18dSCy Schubert #undef DG_SZ
235e6bfd18dSCy Schubert #define DG_SZ			16
236e6bfd18dSCy Schubert #undef KEYID_B
237e6bfd18dSCy Schubert #define KEYID_B			(KEYID_A + HEX_KEYID_OFFSET)
238e6bfd18dSCy Schubert void test_Digest_MDC2(void);
239e6bfd18dSCy Schubert void test_Digest_MDC2(void)
240e6bfd18dSCy Schubert {
241e6bfd18dSCy Schubert #ifdef OPENSSL
242e6bfd18dSCy Schubert 	u_char expectedA[MAX_MAC_LEN] =
243e6bfd18dSCy Schubert 		{
244e6bfd18dSCy Schubert 			0, 0, 0, KEYID_A,
245e6bfd18dSCy Schubert 			0xa0, 0xfc, 0x18, 0xb6,
246e6bfd18dSCy Schubert 			0xea, 0xba, 0xa5, 0x27,
247e6bfd18dSCy Schubert 			0xc9, 0x64, 0x0e, 0x41,
248e6bfd18dSCy Schubert 			0x95, 0x90, 0x5d, 0xf5
249e6bfd18dSCy Schubert 		};
250e6bfd18dSCy Schubert 	u_char expectedB[MAX_MAC_LEN] =
251e6bfd18dSCy Schubert 		{
252e6bfd18dSCy Schubert 			0, 0, 0, KEYID_B,
253e6bfd18dSCy Schubert 			0xe3, 0x2c, 0x1e, 0x64,
254e6bfd18dSCy Schubert 			0x7f, 0x85, 0x81, 0xe7,
255e6bfd18dSCy Schubert 			0x3b, 0xc3, 0x93, 0x5e,
256e6bfd18dSCy Schubert 			0xcd, 0x0e, 0x89, 0xeb
257e6bfd18dSCy Schubert 		};
258e6bfd18dSCy Schubert 
259e6bfd18dSCy Schubert 	TEST_ASSERT(setup);
260e6bfd18dSCy Schubert 	TEST_ONE_DIGEST(KEYID_A, DG_SZ, expectedA);
261e6bfd18dSCy Schubert 	TEST_ONE_DIGEST(KEYID_B, DG_SZ, expectedB);
262e6bfd18dSCy Schubert #else	/* ! OPENSSL follows  */
263e6bfd18dSCy Schubert 	TEST_IGNORE_MESSAGE("Skipping, no OPENSSL");
264e6bfd18dSCy Schubert #endif
265e6bfd18dSCy Schubert }
266e6bfd18dSCy Schubert 
267e6bfd18dSCy Schubert 
268e6bfd18dSCy Schubert #define RIPEMD160_KEYID		5
269e6bfd18dSCy Schubert #undef KEYID_A
270e6bfd18dSCy Schubert #define KEYID_A			RIPEMD160_KEYID
271e6bfd18dSCy Schubert #undef DG_SZ
272e6bfd18dSCy Schubert #define DG_SZ			20
273e6bfd18dSCy Schubert #undef KEYID_B
274e6bfd18dSCy Schubert #define KEYID_B			(KEYID_A + HEX_KEYID_OFFSET)
275e6bfd18dSCy Schubert void test_Digest_RIPEMD160(void);
276e6bfd18dSCy Schubert void test_Digest_RIPEMD160(void)
277e6bfd18dSCy Schubert {
278e6bfd18dSCy Schubert #ifdef OPENSSL
279e6bfd18dSCy Schubert 	u_char expectedA[MAX_MAC_LEN] =
280e6bfd18dSCy Schubert 		{
281e6bfd18dSCy Schubert 			0, 0, 0, KEYID_A,
282e6bfd18dSCy Schubert 			0x8c, 0x3e, 0x55, 0xbb,
283e6bfd18dSCy Schubert 			0xec, 0x7c, 0xf6, 0x30,
284e6bfd18dSCy Schubert 			0xef, 0xd1, 0x45, 0x8c,
285e6bfd18dSCy Schubert 			0xdd, 0x29, 0x32, 0x7e,
286e6bfd18dSCy Schubert 			0x04, 0x87, 0x6c, 0xd7
287e6bfd18dSCy Schubert 		};
288e6bfd18dSCy Schubert 	u_char expectedB[MAX_MAC_LEN] =
289e6bfd18dSCy Schubert 		{
290e6bfd18dSCy Schubert 			0, 0, 0, KEYID_B,
291e6bfd18dSCy Schubert 			0x2d, 0x4a, 0x48, 0xdd,
292e6bfd18dSCy Schubert 			0x28, 0x02, 0xb4, 0x9d,
293e6bfd18dSCy Schubert 			0xe3, 0x6d, 0x1b, 0x90,
294e6bfd18dSCy Schubert 			0x2b, 0xc4, 0x3f, 0xe5,
295e6bfd18dSCy Schubert 			0x19, 0x60, 0x12, 0xbc
296e6bfd18dSCy Schubert 		};
297e6bfd18dSCy Schubert 
298e6bfd18dSCy Schubert 	TEST_ASSERT(setup);
299e6bfd18dSCy Schubert 	TEST_ONE_DIGEST(KEYID_A, DG_SZ, expectedA);
300e6bfd18dSCy Schubert 	TEST_ONE_DIGEST(KEYID_B, DG_SZ, expectedB);
301e6bfd18dSCy Schubert #else	/* ! OPENSSL follows  */
302e6bfd18dSCy Schubert 	TEST_IGNORE_MESSAGE("Skipping, no OPENSSL");
303e6bfd18dSCy Schubert #endif
304e6bfd18dSCy Schubert }
305e6bfd18dSCy Schubert 
306e6bfd18dSCy Schubert 
307e6bfd18dSCy Schubert #define SHA1_KEYID		6
308e6bfd18dSCy Schubert #undef KEYID_A
309e6bfd18dSCy Schubert #define KEYID_A			SHA1_KEYID
310e6bfd18dSCy Schubert #undef DG_SZ
311e6bfd18dSCy Schubert #define DG_SZ			20
312e6bfd18dSCy Schubert #undef KEYID_B
313e6bfd18dSCy Schubert #define KEYID_B			(KEYID_A + HEX_KEYID_OFFSET)
314e6bfd18dSCy Schubert void test_Digest_SHA1(void);
315e6bfd18dSCy Schubert void test_Digest_SHA1(void)
316e6bfd18dSCy Schubert {
317e6bfd18dSCy Schubert #ifdef OPENSSL
318e6bfd18dSCy Schubert 	u_char expectedA[MAX_MAC_LEN] =
319e6bfd18dSCy Schubert 		{
320e6bfd18dSCy Schubert 			0, 0, 0, KEYID_A,
321e6bfd18dSCy Schubert 			0xe2, 0xc6, 0x17, 0x71,
322e6bfd18dSCy Schubert 			0x03, 0xc1, 0x85, 0x56,
323e6bfd18dSCy Schubert 			0x35, 0xc7, 0x4e, 0x75,
324e6bfd18dSCy Schubert 			0x79, 0x82, 0x9d, 0xcb,
325e6bfd18dSCy Schubert 			0x2d, 0x06, 0x0e, 0xfa
326e6bfd18dSCy Schubert 		};
327e6bfd18dSCy Schubert 	u_char expectedB[MAX_MAC_LEN] =
328e6bfd18dSCy Schubert 		{
329e6bfd18dSCy Schubert 			0, 0, 0, KEYID_B,
330e6bfd18dSCy Schubert 			0x01, 0x16, 0x37, 0xb4,
331e6bfd18dSCy Schubert 			0xf5, 0x2d, 0xe0, 0x97,
332e6bfd18dSCy Schubert 			0xaf, 0xd8, 0x58, 0xf7,
333e6bfd18dSCy Schubert 			0xad, 0xb3, 0x7e, 0x38,
334e6bfd18dSCy Schubert 			0x86, 0x85, 0x78, 0x44
335e6bfd18dSCy Schubert 		};
336e6bfd18dSCy Schubert 
337e6bfd18dSCy Schubert 	TEST_ASSERT(setup);
338e6bfd18dSCy Schubert 	TEST_ONE_DIGEST(KEYID_A, DG_SZ, expectedA);
339e6bfd18dSCy Schubert 	TEST_ONE_DIGEST(KEYID_B, DG_SZ, expectedB);
340e6bfd18dSCy Schubert #else	/* ! OPENSSL follows  */
341e6bfd18dSCy Schubert 	TEST_IGNORE_MESSAGE("Skipping, no OPENSSL");
342e6bfd18dSCy Schubert #endif
343e6bfd18dSCy Schubert }
344e6bfd18dSCy Schubert 
345e6bfd18dSCy Schubert 
346e6bfd18dSCy Schubert #define SHAKE128_KEYID		7
347e6bfd18dSCy Schubert #undef KEYID_A
348e6bfd18dSCy Schubert #define KEYID_A			SHAKE128_KEYID
349e6bfd18dSCy Schubert #undef DG_SZ
350e6bfd18dSCy Schubert #define DG_SZ			16
351e6bfd18dSCy Schubert #undef KEYID_B
352e6bfd18dSCy Schubert #define KEYID_B			(KEYID_A + HEX_KEYID_OFFSET)
353e6bfd18dSCy Schubert void test_Digest_SHAKE128(void);
354e6bfd18dSCy Schubert void test_Digest_SHAKE128(void)
355e6bfd18dSCy Schubert {
356e6bfd18dSCy Schubert #ifdef OPENSSL
357e6bfd18dSCy Schubert 	u_char expectedA[MAX_MAC_LEN] =
358e6bfd18dSCy Schubert 		{
359e6bfd18dSCy Schubert 			0, 0, 0, KEYID_A,
360e6bfd18dSCy Schubert 			0x5c, 0x0c, 0x1a, 0x85,
361e6bfd18dSCy Schubert 			0xad, 0x03, 0xb2, 0x9a,
362e6bfd18dSCy Schubert 			0xe4, 0x75, 0x37, 0x93,
363e6bfd18dSCy Schubert 			0xaa, 0xa6, 0xcd, 0x76
364e6bfd18dSCy Schubert 		};
365e6bfd18dSCy Schubert 	u_char expectedB[MAX_MAC_LEN] =
366e6bfd18dSCy Schubert 		{
367e6bfd18dSCy Schubert 			0, 0, 0, KEYID_B,
368e6bfd18dSCy Schubert 			0x07, 0x04, 0x63, 0xcc,
369e6bfd18dSCy Schubert 			0x46, 0xaf, 0xca, 0x00,
370e6bfd18dSCy Schubert 			0x7d, 0xd1, 0x5a, 0x39,
371e6bfd18dSCy Schubert 			0xfd, 0x34, 0xca, 0x10
372e6bfd18dSCy Schubert 		};
373e6bfd18dSCy Schubert 
374e6bfd18dSCy Schubert 	TEST_ASSERT(setup);
375e6bfd18dSCy Schubert 	TEST_ONE_DIGEST(KEYID_A, DG_SZ, expectedA);
376e6bfd18dSCy Schubert 	TEST_ONE_DIGEST(KEYID_B, DG_SZ, expectedB);
377e6bfd18dSCy Schubert #else	/* ! OPENSSL follows  */
378e6bfd18dSCy Schubert 	TEST_IGNORE_MESSAGE("Skipping, no OPENSSL");
379e6bfd18dSCy Schubert #endif
380e6bfd18dSCy Schubert }
381e6bfd18dSCy Schubert 
382e6bfd18dSCy Schubert 
383*f5f40dd6SCy Schubert #define DSA_KEYID		8
384*f5f40dd6SCy Schubert #undef KEYID_A
385*f5f40dd6SCy Schubert #define KEYID_A			DSA_KEYID
386*f5f40dd6SCy Schubert #undef DG_SZ
387*f5f40dd6SCy Schubert #define DG_SZ			20
388*f5f40dd6SCy Schubert #undef KEYID_B
389*f5f40dd6SCy Schubert #define KEYID_B			(KEYID_A + HEX_KEYID_OFFSET)
390*f5f40dd6SCy Schubert void test_Digest_DSA(void);
391*f5f40dd6SCy Schubert void test_Digest_DSA(void)
392*f5f40dd6SCy Schubert {
393*f5f40dd6SCy Schubert #ifdef OPENSSL
394*f5f40dd6SCy Schubert 	u_char expectedA[MAX_MAC_LEN] =
395*f5f40dd6SCy Schubert 		{
396*f5f40dd6SCy Schubert 			0, 0, 0, KEYID_A,
397*f5f40dd6SCy Schubert 			0xaf, 0xa0, 0x1d, 0x0c,
398*f5f40dd6SCy Schubert 			0x92, 0xcb, 0xca, 0x95,
399*f5f40dd6SCy Schubert 			0x0d, 0x57, 0x60, 0x49,
400*f5f40dd6SCy Schubert 			0xe5, 0x28, 0x03, 0xf2,
401*f5f40dd6SCy Schubert 			0x7b, 0x5b, 0xb1, 0x4a
402*f5f40dd6SCy Schubert 		};
403*f5f40dd6SCy Schubert 	u_char expectedB[MAX_MAC_LEN] =
404*f5f40dd6SCy Schubert 		{
405*f5f40dd6SCy Schubert 			0, 0, 0, KEYID_B,
406*f5f40dd6SCy Schubert 			0x77, 0xcd, 0x88, 0xc2,
407*f5f40dd6SCy Schubert 			0xed, 0x5d, 0x57, 0xc5,
408*f5f40dd6SCy Schubert 			0x28, 0x92, 0xf0, 0x21,
409*f5f40dd6SCy Schubert 			0x2b, 0xb9, 0x48, 0xac,
410*f5f40dd6SCy Schubert 			0xfe, 0x9f, 0xf5, 0x1c
411*f5f40dd6SCy Schubert 		};
412*f5f40dd6SCy Schubert 
413*f5f40dd6SCy Schubert 	TEST_ASSERT(setup);
414*f5f40dd6SCy Schubert 	TEST_ONE_DIGEST(KEYID_A, DG_SZ, expectedA);
415*f5f40dd6SCy Schubert 	TEST_ONE_DIGEST(KEYID_B, DG_SZ, expectedB);
416*f5f40dd6SCy Schubert #else	/* ! OPENSSL follows  */
417*f5f40dd6SCy Schubert 	TEST_IGNORE_MESSAGE("Skipping, no OPENSSL");
418*f5f40dd6SCy Schubert #endif
419*f5f40dd6SCy Schubert }
420*f5f40dd6SCy Schubert 
421*f5f40dd6SCy Schubert 
422*f5f40dd6SCy Schubert #define DSA_SHA_KEYID		9
423*f5f40dd6SCy Schubert #undef KEYID_A
424*f5f40dd6SCy Schubert #define KEYID_A			DSA_SHA_KEYID
425*f5f40dd6SCy Schubert #undef DG_SZ
426*f5f40dd6SCy Schubert #define DG_SZ			20
427*f5f40dd6SCy Schubert #undef KEYID_B
428*f5f40dd6SCy Schubert #define KEYID_B			(KEYID_A + HEX_KEYID_OFFSET)
429*f5f40dd6SCy Schubert void test_Digest_DSA_SHA(void);
430*f5f40dd6SCy Schubert void test_Digest_DSA_SHA(void)
431*f5f40dd6SCy Schubert {
432*f5f40dd6SCy Schubert #ifdef OPENSSL
433*f5f40dd6SCy Schubert 	u_char expectedA[MAX_MAC_LEN] =
434*f5f40dd6SCy Schubert 		{
435*f5f40dd6SCy Schubert 			0, 0, 0, KEYID_A,
436*f5f40dd6SCy Schubert 			0x7c, 0xb5, 0x79, 0xd0,
437*f5f40dd6SCy Schubert 			0xf2, 0xcd, 0x47, 0xc0,
438*f5f40dd6SCy Schubert 			0x21, 0xf3, 0xf5, 0x04,
439*f5f40dd6SCy Schubert 			0x10, 0xc4, 0x59, 0x5c,
440*f5f40dd6SCy Schubert 			0xd9, 0xa4, 0x4f, 0x3b
441*f5f40dd6SCy Schubert 		};
442*f5f40dd6SCy Schubert 	u_char expectedB[MAX_MAC_LEN] =
443*f5f40dd6SCy Schubert 		{
444*f5f40dd6SCy Schubert 			0, 0, 0, KEYID_B,
445*f5f40dd6SCy Schubert 			0xb9, 0xca, 0xa6, 0x8e,
446*f5f40dd6SCy Schubert 			0xd3, 0xcb, 0x94, 0x6a,
447*f5f40dd6SCy Schubert 			0x6d, 0xae, 0xb4, 0xc8,
448*f5f40dd6SCy Schubert 			0x0e, 0xc9, 0xf6, 0xed,
449*f5f40dd6SCy Schubert 			0x58, 0x1a, 0xed, 0x22
450*f5f40dd6SCy Schubert 		};
451*f5f40dd6SCy Schubert 
452*f5f40dd6SCy Schubert 	TEST_ASSERT(setup);
453*f5f40dd6SCy Schubert 	TEST_ONE_DIGEST(KEYID_A, DG_SZ, expectedA);
454*f5f40dd6SCy Schubert 	TEST_ONE_DIGEST(KEYID_B, DG_SZ, expectedB);
455*f5f40dd6SCy Schubert #else	/* ! OPENSSL follows  */
456*f5f40dd6SCy Schubert 	TEST_IGNORE_MESSAGE("Skipping, no OPENSSL");
457*f5f40dd6SCy Schubert #endif
458*f5f40dd6SCy Schubert }
459*f5f40dd6SCy Schubert 
460*f5f40dd6SCy Schubert 
461*f5f40dd6SCy Schubert #define SHA_KEYID		10
462*f5f40dd6SCy Schubert #undef KEYID_A
463*f5f40dd6SCy Schubert #define KEYID_A			SHA_KEYID
464*f5f40dd6SCy Schubert #undef DG_SZ
465*f5f40dd6SCy Schubert #define DG_SZ			20
466*f5f40dd6SCy Schubert #undef KEYID_B
467*f5f40dd6SCy Schubert #define KEYID_B			(KEYID_A + HEX_KEYID_OFFSET)
468*f5f40dd6SCy Schubert void test_Digest_SHA(void);
469*f5f40dd6SCy Schubert void test_Digest_SHA(void)
470*f5f40dd6SCy Schubert {
471*f5f40dd6SCy Schubert #ifdef OPENSSL
472*f5f40dd6SCy Schubert 	u_char expectedA[MAX_MAC_LEN] =
473*f5f40dd6SCy Schubert 		{
474*f5f40dd6SCy Schubert 			0, 0, 0, KEYID_A,
475*f5f40dd6SCy Schubert 			0xd5, 0xbd, 0xb8, 0x55,
476*f5f40dd6SCy Schubert 			0x9b, 0x9e, 0x5e, 0x8f,
477*f5f40dd6SCy Schubert 			0x1a, 0x3d, 0x99, 0x60,
478*f5f40dd6SCy Schubert 			0xbd, 0x70, 0x0c, 0x5c,
479*f5f40dd6SCy Schubert 			0x68, 0xae, 0xb0, 0xbd
480*f5f40dd6SCy Schubert 		};
481*f5f40dd6SCy Schubert 	u_char expectedB[MAX_MAC_LEN] =
482*f5f40dd6SCy Schubert 		{
483*f5f40dd6SCy Schubert 			0, 0, 0, KEYID_B,
484*f5f40dd6SCy Schubert 			0x63, 0x05, 0x41, 0x45,
485*f5f40dd6SCy Schubert 			0xe9, 0x61, 0x84, 0xe7,
486*f5f40dd6SCy Schubert 			0xc6, 0x94, 0x24, 0xa4,
487*f5f40dd6SCy Schubert 			0x84, 0x76, 0xc7, 0xc9,
488*f5f40dd6SCy Schubert 			0xdd, 0x80, 0x80, 0x89
489*f5f40dd6SCy Schubert 		};
490*f5f40dd6SCy Schubert 
491*f5f40dd6SCy Schubert 	TEST_ASSERT(setup);
492*f5f40dd6SCy Schubert 	TEST_ONE_DIGEST(KEYID_A, DG_SZ, expectedA);
493*f5f40dd6SCy Schubert 	TEST_ONE_DIGEST(KEYID_B, DG_SZ, expectedB);
494*f5f40dd6SCy Schubert #else	/* ! OPENSSL follows  */
495*f5f40dd6SCy Schubert 	TEST_IGNORE_MESSAGE("Skipping, no OPENSSL");
496*f5f40dd6SCy Schubert #endif
497*f5f40dd6SCy Schubert }
498*f5f40dd6SCy Schubert 
499*f5f40dd6SCy Schubert 
500e6bfd18dSCy Schubert /*
501e6bfd18dSCy Schubert  * Dump a MAC in a form easy to cut and paste into the expected declaration.
502e6bfd18dSCy Schubert  */
503e6bfd18dSCy Schubert void dump_mac(
504e6bfd18dSCy Schubert 	keyid_t		keyid,
505e6bfd18dSCy Schubert 	u_char *	pmac,
506e6bfd18dSCy Schubert 	size_t		octets
507e6bfd18dSCy Schubert 	)
508e6bfd18dSCy Schubert {
509e6bfd18dSCy Schubert 	char	dump[128];
510e6bfd18dSCy Schubert 	size_t	dc = 0;
511e6bfd18dSCy Schubert 	size_t	idx;
512e6bfd18dSCy Schubert 
513e6bfd18dSCy Schubert 	dc += snprintf(dump + dc, sizeof(dump) - dc, "digest with key %u { ", keyid);
514e6bfd18dSCy Schubert 
515*f5f40dd6SCy Schubert 	for (idx = 4; idx < octets; idx++) {
516*f5f40dd6SCy Schubert 		if (14 == idx) {
517e6bfd18dSCy Schubert 			msyslog(LOG_DEBUG, "%s", dump);
518e6bfd18dSCy Schubert 			dc = 0;
519e6bfd18dSCy Schubert 		}
520e6bfd18dSCy Schubert 		if (dc < sizeof(dump)) {
521e6bfd18dSCy Schubert 			dc += snprintf(dump + dc, sizeof(dump) - dc,
522e6bfd18dSCy Schubert 				       "0x%02x, ", pmac[idx]);
523e6bfd18dSCy Schubert 		}
524e6bfd18dSCy Schubert 	}
525e6bfd18dSCy Schubert 
526e6bfd18dSCy Schubert 	if (dc < sizeof(dump)) {
527e6bfd18dSCy Schubert 		dc += snprintf(dump + dc, sizeof(dump) - dc, "}");
528e6bfd18dSCy Schubert 	}
529e6bfd18dSCy Schubert 
530e6bfd18dSCy Schubert 	msyslog(LOG_DEBUG, "%s", dump);
531e6bfd18dSCy Schubert }
532e6bfd18dSCy Schubert 
533