xref: /openbsd-src/regress/usr.bin/ssh/unittests/hostkeys/test_iterate.c (revision 33ada5827e27260bfc1e486f1788d2885ea92e11)
1*33ada582Sdjm /* 	$OpenBSD: test_iterate.c,v 1.9 2024/01/11 01:45:58 djm Exp $ */
2fd82196bSdjm /*
3fd82196bSdjm  * Regress test for hostfile.h hostkeys_foreach()
4fd82196bSdjm  *
5fd82196bSdjm  * Placed in the public domain
6fd82196bSdjm  */
7fd82196bSdjm 
8fd82196bSdjm #include <sys/types.h>
9fd82196bSdjm #include <stdio.h>
10fd82196bSdjm #include <stdint.h>
11fd82196bSdjm #include <stdlib.h>
12fd82196bSdjm #include <string.h>
13fd82196bSdjm 
14fd82196bSdjm #include "test_helper.h"
15fd82196bSdjm 
16fd82196bSdjm #include "sshkey.h"
17fd82196bSdjm #include "authfile.h"
18fd82196bSdjm #include "hostfile.h"
19fd82196bSdjm 
20fd82196bSdjm struct expected {
21fd82196bSdjm 	const char *key_file;		/* Path for key, NULL for none */
22fd82196bSdjm 	int no_parse_status;		/* Expected status w/o key parsing */
23fd82196bSdjm 	int no_parse_keytype;		/* Expected keytype w/o key parsing */
24fd82196bSdjm 	int match_host_p;		/* Match 'prometheus.example.com' */
25fd82196bSdjm 	int match_host_s;		/* Match 'sisyphus.example.com' */
26fd82196bSdjm 	int match_ipv4;			/* Match '192.0.2.1' */
27fd82196bSdjm 	int match_ipv6;			/* Match '2001:db8::1' */
28fd82196bSdjm 	int match_flags;		/* Expected flags from match */
29fd82196bSdjm 	struct hostkey_foreach_line l;	/* Expected line contents */
30fd82196bSdjm };
31fd82196bSdjm 
32fd82196bSdjm struct cbctx {
33fd82196bSdjm 	const struct expected *expected;
34fd82196bSdjm 	size_t nexpected;
35fd82196bSdjm 	size_t i;
36fd82196bSdjm 	int flags;
37fd82196bSdjm 	int match_host_p;
38fd82196bSdjm 	int match_host_s;
39fd82196bSdjm 	int match_ipv4;
40fd82196bSdjm 	int match_ipv6;
41fd82196bSdjm };
42fd82196bSdjm 
43fd82196bSdjm /*
44fd82196bSdjm  * hostkeys_foreach() iterator callback that verifies the line passed
45fd82196bSdjm  * against an array of expected entries.
46fd82196bSdjm  */
47fd82196bSdjm static int
check(struct hostkey_foreach_line * l,void * _ctx)48fd82196bSdjm check(struct hostkey_foreach_line *l, void *_ctx)
49fd82196bSdjm {
50fd82196bSdjm 	struct cbctx *ctx = (struct cbctx *)_ctx;
51fd82196bSdjm 	const struct expected *expected;
5214dfbf97Sdjm 	int parse_key = (ctx->flags & HKF_WANT_PARSE_KEY) != 0;
53fd82196bSdjm 	const int matching = (ctx->flags & HKF_WANT_MATCH) != 0;
54fd82196bSdjm 	u_int expected_status, expected_match;
55*33ada582Sdjm 	int expected_keytype, skip = 0;
56fd82196bSdjm 
57fd82196bSdjm 	test_subtest_info("entry %zu/%zu, file line %ld",
58fd82196bSdjm 	    ctx->i + 1, ctx->nexpected, l->linenum);
59fd82196bSdjm 
60fd82196bSdjm 	for (;;) {
61fd82196bSdjm 		ASSERT_SIZE_T_LT(ctx->i, ctx->nexpected);
62fd82196bSdjm 		expected = ctx->expected + ctx->i++;
63fd82196bSdjm 		/* If we are matching host/IP then skip entries that don't */
64fd82196bSdjm 		if (!matching)
65fd82196bSdjm 			break;
66fd82196bSdjm 		if (ctx->match_host_p && expected->match_host_p)
67fd82196bSdjm 			break;
68fd82196bSdjm 		if (ctx->match_host_s && expected->match_host_s)
69fd82196bSdjm 			break;
70fd82196bSdjm 		if (ctx->match_ipv4 && expected->match_ipv4)
71fd82196bSdjm 			break;
72fd82196bSdjm 		if (ctx->match_ipv6 && expected->match_ipv6)
73fd82196bSdjm 			break;
74fd82196bSdjm 	}
75fd82196bSdjm 	expected_status = (parse_key || expected->no_parse_status < 0) ?
76fd82196bSdjm 	    expected->l.status : (u_int)expected->no_parse_status;
77fd82196bSdjm 	expected_match = expected->l.match;
78fd82196bSdjm #define UPDATE_MATCH_STATUS(x) do { \
79fd82196bSdjm 		if (ctx->x && expected->x) { \
80fd82196bSdjm 			expected_match |= expected->x; \
81fd82196bSdjm 			if (expected_status == HKF_STATUS_OK) \
82fd82196bSdjm 				expected_status = HKF_STATUS_MATCHED; \
83fd82196bSdjm 		} \
84fd82196bSdjm 	} while (0)
8514dfbf97Sdjm 	expected_keytype = (parse_key || expected->no_parse_keytype < 0) ?
8614dfbf97Sdjm 	    expected->l.keytype : expected->no_parse_keytype;
8714dfbf97Sdjm 
88*33ada582Sdjm #ifndef WITH_DSA
89*33ada582Sdjm 	if (expected->l.keytype == KEY_DSA ||
90*33ada582Sdjm 	    expected->no_parse_keytype == KEY_DSA)
91*33ada582Sdjm 		skip = 1;
92*33ada582Sdjm #endif
93*33ada582Sdjm 
94*33ada582Sdjm 	if (skip) {
95*33ada582Sdjm 		expected_status = HKF_STATUS_INVALID;
96*33ada582Sdjm 		expected_keytype = KEY_UNSPEC;
97*33ada582Sdjm 		parse_key = 0;
98*33ada582Sdjm 	}
99fd82196bSdjm 	UPDATE_MATCH_STATUS(match_host_p);
100fd82196bSdjm 	UPDATE_MATCH_STATUS(match_host_s);
101fd82196bSdjm 	UPDATE_MATCH_STATUS(match_ipv4);
102fd82196bSdjm 	UPDATE_MATCH_STATUS(match_ipv6);
103fd82196bSdjm 
104fd82196bSdjm 	ASSERT_PTR_NE(l->path, NULL); /* Don't care about path */
105fd82196bSdjm 	ASSERT_LONG_LONG_EQ(l->linenum, expected->l.linenum);
106fd82196bSdjm 	ASSERT_U_INT_EQ(l->status, expected_status);
107fd82196bSdjm 	ASSERT_U_INT_EQ(l->match, expected_match);
108fd82196bSdjm 	/* Not all test entries contain fulltext */
109fd82196bSdjm 	if (expected->l.line != NULL)
110fd82196bSdjm 		ASSERT_STRING_EQ(l->line, expected->l.line);
111fd82196bSdjm 	ASSERT_INT_EQ(l->marker, expected->l.marker);
112fd82196bSdjm 	/* XXX we skip hashed hostnames for now; implement checking */
113fd82196bSdjm 	if (expected->l.hosts != NULL)
114fd82196bSdjm 		ASSERT_STRING_EQ(l->hosts, expected->l.hosts);
115fd82196bSdjm 	/* Not all test entries contain raw keys */
116fd82196bSdjm 	if (expected->l.rawkey != NULL)
117fd82196bSdjm 		ASSERT_STRING_EQ(l->rawkey, expected->l.rawkey);
118fd82196bSdjm 	/* XXX synthesise raw key for cases lacking and compare */
119fd82196bSdjm 	ASSERT_INT_EQ(l->keytype, expected_keytype);
120fd82196bSdjm 	if (parse_key) {
121fd82196bSdjm 		if (expected->l.key == NULL)
122fd82196bSdjm 			ASSERT_PTR_EQ(l->key, NULL);
123fd82196bSdjm 		if (expected->l.key != NULL) {
124fd82196bSdjm 			ASSERT_PTR_NE(l->key, NULL);
125fd82196bSdjm 			ASSERT_INT_EQ(sshkey_equal(l->key, expected->l.key), 1);
126fd82196bSdjm 		}
127fd82196bSdjm 	}
128fd82196bSdjm 	if (parse_key && !(l->comment == NULL && expected->l.comment == NULL))
129fd82196bSdjm 		ASSERT_STRING_EQ(l->comment, expected->l.comment);
130fd82196bSdjm 	return 0;
131fd82196bSdjm }
132fd82196bSdjm 
133fd82196bSdjm /* Loads public keys for a set of expected results */
134fd82196bSdjm static void
prepare_expected(struct expected * expected,size_t n)135fd82196bSdjm prepare_expected(struct expected *expected, size_t n)
136fd82196bSdjm {
137fd82196bSdjm 	size_t i;
138fd82196bSdjm 
139fd82196bSdjm 	for (i = 0; i < n; i++) {
140fd82196bSdjm 		if (expected[i].key_file == NULL)
141fd82196bSdjm 			continue;
142*33ada582Sdjm #ifndef WITH_DSA
143*33ada582Sdjm 		if (expected[i].l.keytype == KEY_DSA)
144*33ada582Sdjm 			continue;
145*33ada582Sdjm #endif
146fd82196bSdjm 		ASSERT_INT_EQ(sshkey_load_public(
147fd82196bSdjm 		    test_data_file(expected[i].key_file), &expected[i].l.key,
148fd82196bSdjm 		    NULL), 0);
149fd82196bSdjm 	}
150fd82196bSdjm }
151fd82196bSdjm 
1521f1a9c0cSdjm static void
cleanup_expected(struct expected * expected,size_t n)1531f1a9c0cSdjm cleanup_expected(struct expected *expected, size_t n)
1541f1a9c0cSdjm {
1551f1a9c0cSdjm 	size_t i;
1561f1a9c0cSdjm 
1571f1a9c0cSdjm 	for (i = 0; i < n; i++) {
1581f1a9c0cSdjm 		sshkey_free(expected[i].l.key);
1591f1a9c0cSdjm 		expected[i].l.key = NULL;
1601f1a9c0cSdjm 	}
1611f1a9c0cSdjm }
1621f1a9c0cSdjm 
163fd82196bSdjm struct expected expected_full[] = {
164fd82196bSdjm 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
165fd82196bSdjm 		NULL,				/* path, don't care */
166fd82196bSdjm 		1,				/* line number */
167fd82196bSdjm 		HKF_STATUS_COMMENT,		/* status */
168fd82196bSdjm 		0,				/* match flags */
169fd82196bSdjm 		"# Plain host keys, plain host names", /* full line, optional */
170fd82196bSdjm 		MRK_NONE,			/* marker (CA / revoked) */
171fd82196bSdjm 		NULL,				/* hosts text */
172fd82196bSdjm 		NULL,				/* raw key, optional */
173fd82196bSdjm 		KEY_UNSPEC,			/* key type */
174fd82196bSdjm 		NULL,				/* deserialised key */
175fd82196bSdjm 		NULL,				/* comment */
176cd0e447aSdjm 		0,				/* note */
177fd82196bSdjm 	} },
178fd82196bSdjm 	{ "dsa_1.pub" , -1, -1, 0, HKF_MATCH_HOST, 0, 0, -1, {
179fd82196bSdjm 		NULL,
180fd82196bSdjm 		2,
181fd82196bSdjm 		HKF_STATUS_OK,
182fd82196bSdjm 		0,
183fd82196bSdjm 		NULL,
184fd82196bSdjm 		MRK_NONE,
185fd82196bSdjm 		"sisyphus.example.com",
186fd82196bSdjm 		NULL,
187fd82196bSdjm 		KEY_DSA,
188fd82196bSdjm 		NULL,	/* filled at runtime */
189fd82196bSdjm 		"DSA #1",
190cd0e447aSdjm 		0,
191fd82196bSdjm 	} },
192fd82196bSdjm 	{ "ecdsa_1.pub" , -1, -1, 0, HKF_MATCH_HOST, 0, 0, -1, {
193fd82196bSdjm 		NULL,
194fd82196bSdjm 		3,
195fd82196bSdjm 		HKF_STATUS_OK,
196fd82196bSdjm 		0,
197fd82196bSdjm 		NULL,
198fd82196bSdjm 		MRK_NONE,
199fd82196bSdjm 		"sisyphus.example.com",
200fd82196bSdjm 		NULL,
201fd82196bSdjm 		KEY_ECDSA,
202fd82196bSdjm 		NULL,	/* filled at runtime */
203fd82196bSdjm 		"ECDSA #1",
204cd0e447aSdjm 		0,
205fd82196bSdjm 	} },
206fd82196bSdjm 	{ "ed25519_1.pub" , -1, -1, 0, HKF_MATCH_HOST, 0, 0, -1, {
207fd82196bSdjm 		NULL,
208fd82196bSdjm 		4,
209fd82196bSdjm 		HKF_STATUS_OK,
210fd82196bSdjm 		0,
211fd82196bSdjm 		NULL,
212fd82196bSdjm 		MRK_NONE,
213fd82196bSdjm 		"sisyphus.example.com",
214fd82196bSdjm 		NULL,
215fd82196bSdjm 		KEY_ED25519,
216fd82196bSdjm 		NULL,	/* filled at runtime */
217fd82196bSdjm 		"ED25519 #1",
218cd0e447aSdjm 		0,
219fd82196bSdjm 	} },
220fd82196bSdjm 	{ "rsa_1.pub" , -1, -1, 0, HKF_MATCH_HOST, 0, 0, -1, {
221fd82196bSdjm 		NULL,
222cb247215Sdjm 		5,
223fd82196bSdjm 		HKF_STATUS_OK,
224fd82196bSdjm 		0,
225fd82196bSdjm 		NULL,
226fd82196bSdjm 		MRK_NONE,
227fd82196bSdjm 		"sisyphus.example.com",
228fd82196bSdjm 		NULL,
229fd82196bSdjm 		KEY_RSA,
230fd82196bSdjm 		NULL,	/* filled at runtime */
231fd82196bSdjm 		"RSA #1",
232cd0e447aSdjm 		0,
233fd82196bSdjm 	} },
234fd82196bSdjm 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
235fd82196bSdjm 		NULL,
236cb247215Sdjm 		6,
237fd82196bSdjm 		HKF_STATUS_COMMENT,
238fd82196bSdjm 		0,
239fd82196bSdjm 		"",
240fd82196bSdjm 		MRK_NONE,
241fd82196bSdjm 		NULL,
242fd82196bSdjm 		NULL,
243fd82196bSdjm 		KEY_UNSPEC,
244fd82196bSdjm 		NULL,
245fd82196bSdjm 		NULL,
246cd0e447aSdjm 		0,
247fd82196bSdjm 	} },
248fd82196bSdjm 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
249fd82196bSdjm 		NULL,
250cb247215Sdjm 		7,
251fd82196bSdjm 		HKF_STATUS_COMMENT,
252fd82196bSdjm 		0,
253fd82196bSdjm 		"# Plain host keys, hostnames + addresses",
254fd82196bSdjm 		MRK_NONE,
255fd82196bSdjm 		NULL,
256fd82196bSdjm 		NULL,
257fd82196bSdjm 		KEY_UNSPEC,
258fd82196bSdjm 		NULL,
259fd82196bSdjm 		NULL,
260cd0e447aSdjm 		0,
261fd82196bSdjm 	} },
262fd82196bSdjm 	{ "dsa_2.pub" , -1, -1, HKF_MATCH_HOST, 0, HKF_MATCH_IP, HKF_MATCH_IP, -1, {
263fd82196bSdjm 		NULL,
264cb247215Sdjm 		8,
265fd82196bSdjm 		HKF_STATUS_OK,
266fd82196bSdjm 		0,
267fd82196bSdjm 		NULL,
268fd82196bSdjm 		MRK_NONE,
269fd82196bSdjm 		"prometheus.example.com,192.0.2.1,2001:db8::1",
270fd82196bSdjm 		NULL,
271fd82196bSdjm 		KEY_DSA,
272fd82196bSdjm 		NULL,	/* filled at runtime */
273fd82196bSdjm 		"DSA #2",
274cd0e447aSdjm 		0,
275fd82196bSdjm 	} },
276fd82196bSdjm 	{ "ecdsa_2.pub" , -1, -1, HKF_MATCH_HOST, 0, HKF_MATCH_IP, HKF_MATCH_IP, -1, {
277fd82196bSdjm 		NULL,
278cb247215Sdjm 		9,
279fd82196bSdjm 		HKF_STATUS_OK,
280fd82196bSdjm 		0,
281fd82196bSdjm 		NULL,
282fd82196bSdjm 		MRK_NONE,
283fd82196bSdjm 		"prometheus.example.com,192.0.2.1,2001:db8::1",
284fd82196bSdjm 		NULL,
285fd82196bSdjm 		KEY_ECDSA,
286fd82196bSdjm 		NULL,	/* filled at runtime */
287fd82196bSdjm 		"ECDSA #2",
288cd0e447aSdjm 		0,
289fd82196bSdjm 	} },
290fd82196bSdjm 	{ "ed25519_2.pub" , -1, -1, HKF_MATCH_HOST, 0, HKF_MATCH_IP, HKF_MATCH_IP, -1, {
291fd82196bSdjm 		NULL,
292cb247215Sdjm 		10,
293fd82196bSdjm 		HKF_STATUS_OK,
294fd82196bSdjm 		0,
295fd82196bSdjm 		NULL,
296fd82196bSdjm 		MRK_NONE,
297fd82196bSdjm 		"prometheus.example.com,192.0.2.1,2001:db8::1",
298fd82196bSdjm 		NULL,
299fd82196bSdjm 		KEY_ED25519,
300fd82196bSdjm 		NULL,	/* filled at runtime */
301fd82196bSdjm 		"ED25519 #2",
302cd0e447aSdjm 		0,
303fd82196bSdjm 	} },
304fd82196bSdjm 	{ "rsa_2.pub" , -1, -1, HKF_MATCH_HOST, 0, HKF_MATCH_IP, HKF_MATCH_IP, -1, {
305fd82196bSdjm 		NULL,
306cb247215Sdjm 		11,
307fd82196bSdjm 		HKF_STATUS_OK,
308fd82196bSdjm 		0,
309fd82196bSdjm 		NULL,
310fd82196bSdjm 		MRK_NONE,
311fd82196bSdjm 		"prometheus.example.com,192.0.2.1,2001:db8::1",
312fd82196bSdjm 		NULL,
313fd82196bSdjm 		KEY_RSA,
314fd82196bSdjm 		NULL,	/* filled at runtime */
315fd82196bSdjm 		"RSA #2",
316cd0e447aSdjm 		0,
317fd82196bSdjm 	} },
318fd82196bSdjm 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
319fd82196bSdjm 		NULL,
320cb247215Sdjm 		12,
321fd82196bSdjm 		HKF_STATUS_COMMENT,
322fd82196bSdjm 		0,
323fd82196bSdjm 		"",
324fd82196bSdjm 		MRK_NONE,
325fd82196bSdjm 		NULL,
326fd82196bSdjm 		NULL,
327fd82196bSdjm 		KEY_UNSPEC,
328fd82196bSdjm 		NULL,
329fd82196bSdjm 		NULL,
330cd0e447aSdjm 		0,
331fd82196bSdjm 	} },
332fd82196bSdjm 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
333fd82196bSdjm 		NULL,
334cb247215Sdjm 		13,
335fd82196bSdjm 		HKF_STATUS_COMMENT,
336fd82196bSdjm 		0,
337fd82196bSdjm 		"# Some hosts with wildcard names / IPs",
338fd82196bSdjm 		MRK_NONE,
339fd82196bSdjm 		NULL,
340fd82196bSdjm 		NULL,
341fd82196bSdjm 		KEY_UNSPEC,
342fd82196bSdjm 		NULL,
343fd82196bSdjm 		NULL,
344cd0e447aSdjm 		0,
345fd82196bSdjm 	} },
346fd82196bSdjm 	{ "dsa_3.pub" , -1, -1, HKF_MATCH_HOST, HKF_MATCH_HOST, HKF_MATCH_IP, HKF_MATCH_IP, -1, {
347fd82196bSdjm 		NULL,
348cb247215Sdjm 		14,
349fd82196bSdjm 		HKF_STATUS_OK,
350fd82196bSdjm 		0,
351fd82196bSdjm 		NULL,
352fd82196bSdjm 		MRK_NONE,
353fd82196bSdjm 		"*.example.com,192.0.2.*,2001:*",
354fd82196bSdjm 		NULL,
355fd82196bSdjm 		KEY_DSA,
356fd82196bSdjm 		NULL,	/* filled at runtime */
357fd82196bSdjm 		"DSA #3",
358cd0e447aSdjm 		0,
359fd82196bSdjm 	} },
360fd82196bSdjm 	{ "ecdsa_3.pub" , -1, -1, HKF_MATCH_HOST, HKF_MATCH_HOST, HKF_MATCH_IP, HKF_MATCH_IP, -1, {
361fd82196bSdjm 		NULL,
362cb247215Sdjm 		15,
363fd82196bSdjm 		HKF_STATUS_OK,
364fd82196bSdjm 		0,
365fd82196bSdjm 		NULL,
366fd82196bSdjm 		MRK_NONE,
367fd82196bSdjm 		"*.example.com,192.0.2.*,2001:*",
368fd82196bSdjm 		NULL,
369fd82196bSdjm 		KEY_ECDSA,
370fd82196bSdjm 		NULL,	/* filled at runtime */
371fd82196bSdjm 		"ECDSA #3",
372cd0e447aSdjm 		0,
373fd82196bSdjm 	} },
374fd82196bSdjm 	{ "ed25519_3.pub" , -1, -1, HKF_MATCH_HOST, HKF_MATCH_HOST, HKF_MATCH_IP, HKF_MATCH_IP, -1, {
375fd82196bSdjm 		NULL,
376cb247215Sdjm 		16,
377fd82196bSdjm 		HKF_STATUS_OK,
378fd82196bSdjm 		0,
379fd82196bSdjm 		NULL,
380fd82196bSdjm 		MRK_NONE,
381fd82196bSdjm 		"*.example.com,192.0.2.*,2001:*",
382fd82196bSdjm 		NULL,
383fd82196bSdjm 		KEY_ED25519,
384fd82196bSdjm 		NULL,	/* filled at runtime */
385fd82196bSdjm 		"ED25519 #3",
386cd0e447aSdjm 		0,
387fd82196bSdjm 	} },
388fd82196bSdjm 	{ "rsa_3.pub" , -1, -1, HKF_MATCH_HOST, HKF_MATCH_HOST, HKF_MATCH_IP, HKF_MATCH_IP, -1, {
389fd82196bSdjm 		NULL,
390cb247215Sdjm 		17,
391fd82196bSdjm 		HKF_STATUS_OK,
392fd82196bSdjm 		0,
393fd82196bSdjm 		NULL,
394fd82196bSdjm 		MRK_NONE,
395fd82196bSdjm 		"*.example.com,192.0.2.*,2001:*",
396fd82196bSdjm 		NULL,
397fd82196bSdjm 		KEY_RSA,
398fd82196bSdjm 		NULL,	/* filled at runtime */
399fd82196bSdjm 		"RSA #3",
400cd0e447aSdjm 		0,
401fd82196bSdjm 	} },
402fd82196bSdjm 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
403fd82196bSdjm 		NULL,
404cb247215Sdjm 		18,
405fd82196bSdjm 		HKF_STATUS_COMMENT,
406fd82196bSdjm 		0,
407fd82196bSdjm 		"",
408fd82196bSdjm 		MRK_NONE,
409fd82196bSdjm 		NULL,
410fd82196bSdjm 		NULL,
411fd82196bSdjm 		KEY_UNSPEC,
412fd82196bSdjm 		NULL,
413fd82196bSdjm 		NULL,
414cd0e447aSdjm 		0,
415fd82196bSdjm 	} },
416fd82196bSdjm 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
417fd82196bSdjm 		NULL,
418cb247215Sdjm 		19,
419fd82196bSdjm 		HKF_STATUS_COMMENT,
420fd82196bSdjm 		0,
421fd82196bSdjm 		"# Hashed hostname and address entries",
422fd82196bSdjm 		MRK_NONE,
423fd82196bSdjm 		NULL,
424fd82196bSdjm 		NULL,
425fd82196bSdjm 		KEY_UNSPEC,
426fd82196bSdjm 		NULL,
427fd82196bSdjm 		NULL,
428cd0e447aSdjm 		0,
429fd82196bSdjm 	} },
430fd82196bSdjm 	{ "dsa_5.pub" , -1, -1, 0, HKF_MATCH_HOST|HKF_MATCH_HOST_HASHED, 0, 0, -1, {
431fd82196bSdjm 		NULL,
432cb247215Sdjm 		20,
433fd82196bSdjm 		HKF_STATUS_OK,
434fd82196bSdjm 		0,
435fd82196bSdjm 		NULL,
436fd82196bSdjm 		MRK_NONE,
437fd82196bSdjm 		NULL,
438fd82196bSdjm 		NULL,
439fd82196bSdjm 		KEY_DSA,
440fd82196bSdjm 		NULL,	/* filled at runtime */
441fd82196bSdjm 		"DSA #5",
442cd0e447aSdjm 		0,
443fd82196bSdjm 	} },
444fd82196bSdjm 	{ "ecdsa_5.pub" , -1, -1, 0, HKF_MATCH_HOST|HKF_MATCH_HOST_HASHED, 0, 0, -1, {
445fd82196bSdjm 		NULL,
446cb247215Sdjm 		21,
447fd82196bSdjm 		HKF_STATUS_OK,
448fd82196bSdjm 		0,
449fd82196bSdjm 		NULL,
450fd82196bSdjm 		MRK_NONE,
451fd82196bSdjm 		NULL,
452fd82196bSdjm 		NULL,
453fd82196bSdjm 		KEY_ECDSA,
454fd82196bSdjm 		NULL,	/* filled at runtime */
455fd82196bSdjm 		"ECDSA #5",
456cd0e447aSdjm 		0,
457fd82196bSdjm 	} },
458fd82196bSdjm 	{ "ed25519_5.pub" , -1, -1, 0, HKF_MATCH_HOST|HKF_MATCH_HOST_HASHED, 0, 0, -1, {
459fd82196bSdjm 		NULL,
460cb247215Sdjm 		22,
461fd82196bSdjm 		HKF_STATUS_OK,
462fd82196bSdjm 		0,
463fd82196bSdjm 		NULL,
464fd82196bSdjm 		MRK_NONE,
465fd82196bSdjm 		NULL,
466fd82196bSdjm 		NULL,
467fd82196bSdjm 		KEY_ED25519,
468fd82196bSdjm 		NULL,	/* filled at runtime */
469fd82196bSdjm 		"ED25519 #5",
470cd0e447aSdjm 		0,
471fd82196bSdjm 	} },
472fd82196bSdjm 	{ "rsa_5.pub" , -1, -1, 0, HKF_MATCH_HOST|HKF_MATCH_HOST_HASHED, 0, 0, -1, {
473fd82196bSdjm 		NULL,
474cb247215Sdjm 		23,
475fd82196bSdjm 		HKF_STATUS_OK,
476fd82196bSdjm 		0,
477fd82196bSdjm 		NULL,
478fd82196bSdjm 		MRK_NONE,
479fd82196bSdjm 		NULL,
480fd82196bSdjm 		NULL,
481fd82196bSdjm 		KEY_RSA,
482fd82196bSdjm 		NULL,	/* filled at runtime */
483fd82196bSdjm 		"RSA #5",
484cd0e447aSdjm 		0,
485fd82196bSdjm 	} },
486fd82196bSdjm 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
487fd82196bSdjm 		NULL,
488cb247215Sdjm 		24,
489fd82196bSdjm 		HKF_STATUS_COMMENT,
490fd82196bSdjm 		0,
491fd82196bSdjm 		"",
492fd82196bSdjm 		MRK_NONE,
493fd82196bSdjm 		NULL,
494fd82196bSdjm 		NULL,
495fd82196bSdjm 		KEY_UNSPEC,
496fd82196bSdjm 		NULL,
497fd82196bSdjm 		NULL,
498cd0e447aSdjm 		0,
499fd82196bSdjm 	} },
500fd82196bSdjm 	/*
501fd82196bSdjm 	 * The next series have each key listed multiple times, as the
502fd82196bSdjm 	 * hostname and addresses in the pre-hashed known_hosts are split
503fd82196bSdjm 	 * to separate lines.
504fd82196bSdjm 	 */
505fd82196bSdjm 	{ "dsa_6.pub" , -1, -1, HKF_MATCH_HOST|HKF_MATCH_HOST_HASHED, 0, 0, 0, -1, {
506fd82196bSdjm 		NULL,
507cb247215Sdjm 		25,
508fd82196bSdjm 		HKF_STATUS_OK,
509fd82196bSdjm 		0,
510fd82196bSdjm 		NULL,
511fd82196bSdjm 		MRK_NONE,
512fd82196bSdjm 		NULL,
513fd82196bSdjm 		NULL,
514fd82196bSdjm 		KEY_DSA,
515fd82196bSdjm 		NULL,	/* filled at runtime */
516fd82196bSdjm 		"DSA #6",
517cd0e447aSdjm 		0,
518fd82196bSdjm 	} },
519fd82196bSdjm 	{ "dsa_6.pub" , -1, -1, 0, 0, HKF_MATCH_IP|HKF_MATCH_IP_HASHED, 0, -1, {
520fd82196bSdjm 		NULL,
521cb247215Sdjm 		26,
522fd82196bSdjm 		HKF_STATUS_OK,
523fd82196bSdjm 		0,
524fd82196bSdjm 		NULL,
525fd82196bSdjm 		MRK_NONE,
526fd82196bSdjm 		NULL,
527fd82196bSdjm 		NULL,
528fd82196bSdjm 		KEY_DSA,
529fd82196bSdjm 		NULL,	/* filled at runtime */
530fd82196bSdjm 		"DSA #6",
531cd0e447aSdjm 		0,
532fd82196bSdjm 	} },
533fd82196bSdjm 	{ "dsa_6.pub" , -1, -1, 0, 0, 0, HKF_MATCH_IP|HKF_MATCH_IP_HASHED, -1, {
534fd82196bSdjm 		NULL,
535cb247215Sdjm 		27,
536fd82196bSdjm 		HKF_STATUS_OK,
537fd82196bSdjm 		0,
538fd82196bSdjm 		NULL,
539fd82196bSdjm 		MRK_NONE,
540fd82196bSdjm 		NULL,
541fd82196bSdjm 		NULL,
542fd82196bSdjm 		KEY_DSA,
543fd82196bSdjm 		NULL,	/* filled at runtime */
544fd82196bSdjm 		"DSA #6",
545cd0e447aSdjm 		0,
546fd82196bSdjm 	} },
547fd82196bSdjm 	{ "ecdsa_6.pub" , -1, -1, HKF_MATCH_HOST|HKF_MATCH_HOST_HASHED, 0, 0, 0, -1, {
548fd82196bSdjm 		NULL,
549cb247215Sdjm 		28,
550fd82196bSdjm 		HKF_STATUS_OK,
551fd82196bSdjm 		0,
552fd82196bSdjm 		NULL,
553fd82196bSdjm 		MRK_NONE,
554fd82196bSdjm 		NULL,
555fd82196bSdjm 		NULL,
556fd82196bSdjm 		KEY_ECDSA,
557fd82196bSdjm 		NULL,	/* filled at runtime */
558fd82196bSdjm 		"ECDSA #6",
559cd0e447aSdjm 		0,
560fd82196bSdjm 	} },
561fd82196bSdjm 	{ "ecdsa_6.pub" , -1, -1, 0, 0, HKF_MATCH_IP|HKF_MATCH_IP_HASHED, 0, -1, {
562fd82196bSdjm 		NULL,
563cb247215Sdjm 		29,
564fd82196bSdjm 		HKF_STATUS_OK,
565fd82196bSdjm 		0,
566fd82196bSdjm 		NULL,
567fd82196bSdjm 		MRK_NONE,
568fd82196bSdjm 		NULL,
569fd82196bSdjm 		NULL,
570fd82196bSdjm 		KEY_ECDSA,
571fd82196bSdjm 		NULL,	/* filled at runtime */
572fd82196bSdjm 		"ECDSA #6",
573cd0e447aSdjm 		0,
574fd82196bSdjm 	} },
575fd82196bSdjm 	{ "ecdsa_6.pub" , -1, -1, 0, 0, 0, HKF_MATCH_IP|HKF_MATCH_IP_HASHED, -1, {
576fd82196bSdjm 		NULL,
577cb247215Sdjm 		30,
578fd82196bSdjm 		HKF_STATUS_OK,
579fd82196bSdjm 		0,
580fd82196bSdjm 		NULL,
581fd82196bSdjm 		MRK_NONE,
582fd82196bSdjm 		NULL,
583fd82196bSdjm 		NULL,
584fd82196bSdjm 		KEY_ECDSA,
585fd82196bSdjm 		NULL,	/* filled at runtime */
586fd82196bSdjm 		"ECDSA #6",
587cd0e447aSdjm 		0,
588fd82196bSdjm 	} },
589fd82196bSdjm 	{ "ed25519_6.pub" , -1, -1, HKF_MATCH_HOST|HKF_MATCH_HOST_HASHED, 0, 0, 0, -1, {
590fd82196bSdjm 		NULL,
591cb247215Sdjm 		31,
592fd82196bSdjm 		HKF_STATUS_OK,
593fd82196bSdjm 		0,
594fd82196bSdjm 		NULL,
595fd82196bSdjm 		MRK_NONE,
596fd82196bSdjm 		NULL,
597fd82196bSdjm 		NULL,
598fd82196bSdjm 		KEY_ED25519,
599fd82196bSdjm 		NULL,	/* filled at runtime */
600fd82196bSdjm 		"ED25519 #6",
601cd0e447aSdjm 		0,
602fd82196bSdjm 	} },
603fd82196bSdjm 	{ "ed25519_6.pub" , -1, -1, 0, 0, HKF_MATCH_IP|HKF_MATCH_IP_HASHED, 0, -1, {
604fd82196bSdjm 		NULL,
605cb247215Sdjm 		32,
606fd82196bSdjm 		HKF_STATUS_OK,
607fd82196bSdjm 		0,
608fd82196bSdjm 		NULL,
609fd82196bSdjm 		MRK_NONE,
610fd82196bSdjm 		NULL,
611fd82196bSdjm 		NULL,
612fd82196bSdjm 		KEY_ED25519,
613fd82196bSdjm 		NULL,	/* filled at runtime */
614fd82196bSdjm 		"ED25519 #6",
615cd0e447aSdjm 		0,
616fd82196bSdjm 	} },
617fd82196bSdjm 	{ "ed25519_6.pub" , -1, -1, 0, 0, 0, HKF_MATCH_IP|HKF_MATCH_IP_HASHED, -1, {
618fd82196bSdjm 		NULL,
619cb247215Sdjm 		33,
620fd82196bSdjm 		HKF_STATUS_OK,
621fd82196bSdjm 		0,
622fd82196bSdjm 		NULL,
623fd82196bSdjm 		MRK_NONE,
624fd82196bSdjm 		NULL,
625fd82196bSdjm 		NULL,
626fd82196bSdjm 		KEY_ED25519,
627fd82196bSdjm 		NULL,	/* filled at runtime */
628fd82196bSdjm 		"ED25519 #6",
629cd0e447aSdjm 		0,
630fd82196bSdjm 	} },
631fd82196bSdjm 	{ "rsa_6.pub" , -1, -1, HKF_MATCH_HOST|HKF_MATCH_HOST_HASHED, 0, 0, 0, -1, {
632fd82196bSdjm 		NULL,
633cb247215Sdjm 		34,
634fd82196bSdjm 		HKF_STATUS_OK,
635fd82196bSdjm 		0,
636fd82196bSdjm 		NULL,
637fd82196bSdjm 		MRK_NONE,
638fd82196bSdjm 		NULL,
639fd82196bSdjm 		NULL,
640fd82196bSdjm 		KEY_RSA,
641fd82196bSdjm 		NULL,	/* filled at runtime */
642fd82196bSdjm 		"RSA #6",
643cd0e447aSdjm 		0,
644fd82196bSdjm 	} },
645fd82196bSdjm 	{ "rsa_6.pub" , -1, -1, 0, 0, HKF_MATCH_IP|HKF_MATCH_IP_HASHED, 0, -1, {
646fd82196bSdjm 		NULL,
647cb247215Sdjm 		35,
648fd82196bSdjm 		HKF_STATUS_OK,
649fd82196bSdjm 		0,
650fd82196bSdjm 		NULL,
651fd82196bSdjm 		MRK_NONE,
652fd82196bSdjm 		NULL,
653fd82196bSdjm 		NULL,
654fd82196bSdjm 		KEY_RSA,
655fd82196bSdjm 		NULL,	/* filled at runtime */
656fd82196bSdjm 		"RSA #6",
657cd0e447aSdjm 		0,
658fd82196bSdjm 	} },
659fd82196bSdjm 	{ "rsa_6.pub" , -1, -1, 0, 0, 0, HKF_MATCH_IP|HKF_MATCH_IP_HASHED, -1, {
660fd82196bSdjm 		NULL,
661cb247215Sdjm 		36,
662fd82196bSdjm 		HKF_STATUS_OK,
663fd82196bSdjm 		0,
664fd82196bSdjm 		NULL,
665fd82196bSdjm 		MRK_NONE,
666fd82196bSdjm 		NULL,
667fd82196bSdjm 		NULL,
668fd82196bSdjm 		KEY_RSA,
669fd82196bSdjm 		NULL,	/* filled at runtime */
670fd82196bSdjm 		"RSA #6",
671cd0e447aSdjm 		0,
672fd82196bSdjm 	} },
673fd82196bSdjm 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
674fd82196bSdjm 		NULL,
675cb247215Sdjm 		37,
676fd82196bSdjm 		HKF_STATUS_COMMENT,
677fd82196bSdjm 		0,
678fd82196bSdjm 		"",
679fd82196bSdjm 		MRK_NONE,
680fd82196bSdjm 		NULL,
681fd82196bSdjm 		NULL,
682fd82196bSdjm 		KEY_UNSPEC,
683fd82196bSdjm 		NULL,
684fd82196bSdjm 		NULL,
685cd0e447aSdjm 		0,
686fd82196bSdjm 	} },
687fd82196bSdjm 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
688fd82196bSdjm 		NULL,
689cb247215Sdjm 		38,
690fd82196bSdjm 		HKF_STATUS_COMMENT,
691fd82196bSdjm 		0,
692fd82196bSdjm 		"",
693fd82196bSdjm 		MRK_NONE,
694fd82196bSdjm 		NULL,
695fd82196bSdjm 		NULL,
696fd82196bSdjm 		KEY_UNSPEC,
697fd82196bSdjm 		NULL,
698fd82196bSdjm 		NULL,
699cd0e447aSdjm 		0,
700fd82196bSdjm 	} },
701fd82196bSdjm 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
702fd82196bSdjm 		NULL,
703cb247215Sdjm 		39,
704fd82196bSdjm 		HKF_STATUS_COMMENT,
705fd82196bSdjm 		0,
706fd82196bSdjm 		"# Revoked and CA keys",
707fd82196bSdjm 		MRK_NONE,
708fd82196bSdjm 		NULL,
709fd82196bSdjm 		NULL,
710fd82196bSdjm 		KEY_UNSPEC,
711fd82196bSdjm 		NULL,
712fd82196bSdjm 		NULL,
713cd0e447aSdjm 		0,
714fd82196bSdjm 	} },
715fd82196bSdjm 	{ "ed25519_4.pub" , -1, -1, 0, HKF_MATCH_HOST, 0, 0, -1, {
716fd82196bSdjm 		NULL,
717cb247215Sdjm 		40,
718fd82196bSdjm 		HKF_STATUS_OK,
719fd82196bSdjm 		0,
720fd82196bSdjm 		NULL,
721fd82196bSdjm 		MRK_REVOKE,
722fd82196bSdjm 		"sisyphus.example.com",
723fd82196bSdjm 		NULL,
724fd82196bSdjm 		KEY_ED25519,
725fd82196bSdjm 		NULL,	/* filled at runtime */
726fd82196bSdjm 		"ED25519 #4",
727cd0e447aSdjm 		0,
728fd82196bSdjm 	} },
729fd82196bSdjm 	{ "ecdsa_4.pub" , -1, -1, HKF_MATCH_HOST, 0, 0, 0, -1, {
730fd82196bSdjm 		NULL,
731cb247215Sdjm 		41,
732fd82196bSdjm 		HKF_STATUS_OK,
733fd82196bSdjm 		0,
734fd82196bSdjm 		NULL,
735fd82196bSdjm 		MRK_CA,
736fd82196bSdjm 		"prometheus.example.com",
737fd82196bSdjm 		NULL,
738fd82196bSdjm 		KEY_ECDSA,
739fd82196bSdjm 		NULL,	/* filled at runtime */
740fd82196bSdjm 		"ECDSA #4",
741cd0e447aSdjm 		0,
742fd82196bSdjm 	} },
743fd82196bSdjm 	{ "dsa_4.pub" , -1, -1, HKF_MATCH_HOST, HKF_MATCH_HOST, 0, 0, -1, {
744fd82196bSdjm 		NULL,
745cb247215Sdjm 		42,
746fd82196bSdjm 		HKF_STATUS_OK,
747fd82196bSdjm 		0,
748fd82196bSdjm 		NULL,
749fd82196bSdjm 		MRK_CA,
750fd82196bSdjm 		"*.example.com",
751fd82196bSdjm 		NULL,
752fd82196bSdjm 		KEY_DSA,
753fd82196bSdjm 		NULL,	/* filled at runtime */
754fd82196bSdjm 		"DSA #4",
755cd0e447aSdjm 		0,
756fd82196bSdjm 	} },
757fd82196bSdjm 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
758fd82196bSdjm 		NULL,
759cb247215Sdjm 		43,
760fd82196bSdjm 		HKF_STATUS_COMMENT,
761fd82196bSdjm 		0,
762fd82196bSdjm 		"",
763fd82196bSdjm 		MRK_NONE,
764fd82196bSdjm 		NULL,
765fd82196bSdjm 		NULL,
766fd82196bSdjm 		KEY_UNSPEC,
767fd82196bSdjm 		NULL,
768fd82196bSdjm 		NULL,
769cd0e447aSdjm 		0,
770fd82196bSdjm 	} },
771fd82196bSdjm 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
772fd82196bSdjm 		NULL,
773cb247215Sdjm 		44,
774fd82196bSdjm 		HKF_STATUS_COMMENT,
775fd82196bSdjm 		0,
776fd82196bSdjm 		"# Some invalid lines",
777fd82196bSdjm 		MRK_NONE,
778fd82196bSdjm 		NULL,
779fd82196bSdjm 		NULL,
780fd82196bSdjm 		KEY_UNSPEC,
781fd82196bSdjm 		NULL,
782fd82196bSdjm 		NULL,
783cd0e447aSdjm 		0,
784fd82196bSdjm 	} },
785fd82196bSdjm 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
786fd82196bSdjm 		NULL,
787cb247215Sdjm 		45,
788fd82196bSdjm 		HKF_STATUS_INVALID,
789fd82196bSdjm 		0,
790fd82196bSdjm 		NULL,
791fd82196bSdjm 		MRK_ERROR,
792fd82196bSdjm 		NULL,
793fd82196bSdjm 		NULL,
794fd82196bSdjm 		KEY_UNSPEC,
795fd82196bSdjm 		NULL,
796fd82196bSdjm 		NULL,
797cd0e447aSdjm 		0,
798fd82196bSdjm 	} },
799fd82196bSdjm 	{ NULL, -1, -1, 0, HKF_MATCH_HOST, 0, 0, -1, {
800fd82196bSdjm 		NULL,
801cb247215Sdjm 		46,
802fd82196bSdjm 		HKF_STATUS_INVALID,
803fd82196bSdjm 		0,
804fd82196bSdjm 		NULL,
805fd82196bSdjm 		MRK_NONE,
806fd82196bSdjm 		"sisyphus.example.com",
807fd82196bSdjm 		NULL,
808fd82196bSdjm 		KEY_UNSPEC,
809fd82196bSdjm 		NULL,
810fd82196bSdjm 		NULL,
811cd0e447aSdjm 		0,
812fd82196bSdjm 	} },
813fd82196bSdjm 	{ NULL, -1, -1, HKF_MATCH_HOST, 0, 0, 0, -1, {
814fd82196bSdjm 		NULL,
815cb247215Sdjm 		47,
816fd82196bSdjm 		HKF_STATUS_INVALID,
817fd82196bSdjm 		0,
818fd82196bSdjm 		NULL,
819fd82196bSdjm 		MRK_NONE,
820fd82196bSdjm 		"prometheus.example.com",
821fd82196bSdjm 		NULL,
822fd82196bSdjm 		KEY_UNSPEC,
823fd82196bSdjm 		NULL,
824fd82196bSdjm 		NULL,
825cd0e447aSdjm 		0,
826fd82196bSdjm 	} },
827fd82196bSdjm 	{ NULL, -1, -1, 0, HKF_MATCH_HOST, 0, 0, -1, {
828fd82196bSdjm 		NULL,
829cb247215Sdjm 		48,
830fd82196bSdjm 		HKF_STATUS_INVALID,	/* Would be ok if key not parsed */
831fd82196bSdjm 		0,
832fd82196bSdjm 		NULL,
833fd82196bSdjm 		MRK_NONE,
834fd82196bSdjm 		"sisyphus.example.com",
835fd82196bSdjm 		NULL,
836fd82196bSdjm 		KEY_UNSPEC,
837fd82196bSdjm 		NULL,
838fd82196bSdjm 		NULL,
839cd0e447aSdjm 		0,
840fd82196bSdjm 	} },
841fd82196bSdjm 	{ NULL, -1, -1, 0, HKF_MATCH_HOST, 0, 0, -1, {
842fd82196bSdjm 		NULL,
843cb247215Sdjm 		49,
844fd82196bSdjm 		HKF_STATUS_INVALID,
845fd82196bSdjm 		0,
846fd82196bSdjm 		NULL,
847fd82196bSdjm 		MRK_NONE,
848fd82196bSdjm 		"sisyphus.example.com",
849fd82196bSdjm 		NULL,
850fd82196bSdjm 		KEY_UNSPEC,
851fd82196bSdjm 		NULL,	/* filled at runtime */
852fd82196bSdjm 		NULL,
853cd0e447aSdjm 		0,
854fd82196bSdjm 	} },
855fd82196bSdjm 	{ NULL, HKF_STATUS_OK, KEY_RSA, HKF_MATCH_HOST, 0, 0, 0, -1, {
856fd82196bSdjm 		NULL,
857cb247215Sdjm 		50,
858fd82196bSdjm 		HKF_STATUS_INVALID,	/* Would be ok if key not parsed */
859fd82196bSdjm 		0,
860fd82196bSdjm 		NULL,
861fd82196bSdjm 		MRK_NONE,
862fd82196bSdjm 		"prometheus.example.com",
863fd82196bSdjm 		NULL,
864fd82196bSdjm 		KEY_UNSPEC,
865fd82196bSdjm 		NULL,	/* filled at runtime */
866fd82196bSdjm 		NULL,
867cd0e447aSdjm 		0,
868fd82196bSdjm 	} },
869fd82196bSdjm };
870fd82196bSdjm 
871fd82196bSdjm void test_iterate(void);
872fd82196bSdjm 
873fd82196bSdjm void
test_iterate(void)874fd82196bSdjm test_iterate(void)
875fd82196bSdjm {
876fd82196bSdjm 	struct cbctx ctx;
877fd82196bSdjm 
878fd82196bSdjm 	TEST_START("hostkeys_iterate all with key parse");
879fd82196bSdjm 	memset(&ctx, 0, sizeof(ctx));
880fd82196bSdjm 	ctx.expected = expected_full;
881fd82196bSdjm 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
882fd82196bSdjm 	ctx.flags = HKF_WANT_PARSE_KEY;
883fd82196bSdjm 	prepare_expected(expected_full, ctx.nexpected);
884fd82196bSdjm 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
885cd0e447aSdjm 	    check, &ctx, NULL, NULL, ctx.flags, 0), 0);
8861f1a9c0cSdjm 	cleanup_expected(expected_full, ctx.nexpected);
887fd82196bSdjm 	TEST_DONE();
888fd82196bSdjm 
889fd82196bSdjm 	TEST_START("hostkeys_iterate all without key parse");
890fd82196bSdjm 	memset(&ctx, 0, sizeof(ctx));
891fd82196bSdjm 	ctx.expected = expected_full;
892fd82196bSdjm 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
893fd82196bSdjm 	ctx.flags = 0;
894fd82196bSdjm 	prepare_expected(expected_full, ctx.nexpected);
895fd82196bSdjm 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
896cd0e447aSdjm 	    check, &ctx, NULL, NULL, ctx.flags, 0), 0);
8971f1a9c0cSdjm 	cleanup_expected(expected_full, ctx.nexpected);
898fd82196bSdjm 	TEST_DONE();
899fd82196bSdjm 
900fd82196bSdjm 	TEST_START("hostkeys_iterate specify host 1");
901fd82196bSdjm 	memset(&ctx, 0, sizeof(ctx));
902fd82196bSdjm 	ctx.expected = expected_full;
903fd82196bSdjm 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
904fd82196bSdjm 	ctx.flags = 0;
905fd82196bSdjm 	ctx.match_host_p = 1;
906fd82196bSdjm 	prepare_expected(expected_full, ctx.nexpected);
907fd82196bSdjm 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
908cd0e447aSdjm 	    check, &ctx, "prometheus.example.com", NULL, ctx.flags, 0), 0);
9091f1a9c0cSdjm 	cleanup_expected(expected_full, ctx.nexpected);
910fd82196bSdjm 	TEST_DONE();
911fd82196bSdjm 
912fd82196bSdjm 	TEST_START("hostkeys_iterate specify host 2");
913fd82196bSdjm 	memset(&ctx, 0, sizeof(ctx));
914fd82196bSdjm 	ctx.expected = expected_full;
915fd82196bSdjm 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
916fd82196bSdjm 	ctx.flags = 0;
917fd82196bSdjm 	ctx.match_host_s = 1;
918fd82196bSdjm 	prepare_expected(expected_full, ctx.nexpected);
919fd82196bSdjm 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
920cd0e447aSdjm 	    check, &ctx, "sisyphus.example.com", NULL, ctx.flags, 0), 0);
9211f1a9c0cSdjm 	cleanup_expected(expected_full, ctx.nexpected);
922fd82196bSdjm 	TEST_DONE();
923fd82196bSdjm 
924fd82196bSdjm 	TEST_START("hostkeys_iterate match host 1");
925fd82196bSdjm 	memset(&ctx, 0, sizeof(ctx));
926fd82196bSdjm 	ctx.expected = expected_full;
927fd82196bSdjm 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
928fd82196bSdjm 	ctx.flags = HKF_WANT_MATCH;
929fd82196bSdjm 	ctx.match_host_p = 1;
930fd82196bSdjm 	prepare_expected(expected_full, ctx.nexpected);
931fd82196bSdjm 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
932cd0e447aSdjm 	    check, &ctx, "prometheus.example.com", NULL, ctx.flags, 0), 0);
9331f1a9c0cSdjm 	cleanup_expected(expected_full, ctx.nexpected);
934fd82196bSdjm 	TEST_DONE();
935fd82196bSdjm 
936fd82196bSdjm 	TEST_START("hostkeys_iterate match host 2");
937fd82196bSdjm 	memset(&ctx, 0, sizeof(ctx));
938fd82196bSdjm 	ctx.expected = expected_full;
939fd82196bSdjm 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
940fd82196bSdjm 	ctx.flags = HKF_WANT_MATCH;
941fd82196bSdjm 	ctx.match_host_s = 1;
942fd82196bSdjm 	prepare_expected(expected_full, ctx.nexpected);
943fd82196bSdjm 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
944cd0e447aSdjm 	    check, &ctx, "sisyphus.example.com", NULL, ctx.flags, 0), 0);
9451f1a9c0cSdjm 	cleanup_expected(expected_full, ctx.nexpected);
946fd82196bSdjm 	TEST_DONE();
947fd82196bSdjm 
948fd82196bSdjm 	TEST_START("hostkeys_iterate specify host missing");
949fd82196bSdjm 	memset(&ctx, 0, sizeof(ctx));
950fd82196bSdjm 	ctx.expected = expected_full;
951fd82196bSdjm 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
952fd82196bSdjm 	ctx.flags = 0;
953fd82196bSdjm 	prepare_expected(expected_full, ctx.nexpected);
954fd82196bSdjm 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
955cd0e447aSdjm 	    check, &ctx, "actaeon.example.org", NULL, ctx.flags, 0), 0);
9561f1a9c0cSdjm 	cleanup_expected(expected_full, ctx.nexpected);
957fd82196bSdjm 	TEST_DONE();
958fd82196bSdjm 
959fd82196bSdjm 	TEST_START("hostkeys_iterate match host missing");
960fd82196bSdjm 	memset(&ctx, 0, sizeof(ctx));
961fd82196bSdjm 	ctx.expected = expected_full;
962fd82196bSdjm 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
963fd82196bSdjm 	ctx.flags = HKF_WANT_MATCH;
964fd82196bSdjm 	prepare_expected(expected_full, ctx.nexpected);
965fd82196bSdjm 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
966cd0e447aSdjm 	    check, &ctx, "actaeon.example.org", NULL, ctx.flags, 0), 0);
9671f1a9c0cSdjm 	cleanup_expected(expected_full, ctx.nexpected);
968fd82196bSdjm 	TEST_DONE();
969fd82196bSdjm 
970fd82196bSdjm 	TEST_START("hostkeys_iterate specify IPv4");
971fd82196bSdjm 	memset(&ctx, 0, sizeof(ctx));
972fd82196bSdjm 	ctx.expected = expected_full;
973fd82196bSdjm 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
974fd82196bSdjm 	ctx.flags = 0;
975fd82196bSdjm 	ctx.match_ipv4 = 1;
976fd82196bSdjm 	prepare_expected(expected_full, ctx.nexpected);
977fd82196bSdjm 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
978cd0e447aSdjm 	    check, &ctx, "tiresias.example.org", "192.0.2.1", ctx.flags, 0), 0);
9791f1a9c0cSdjm 	cleanup_expected(expected_full, ctx.nexpected);
980fd82196bSdjm 	TEST_DONE();
981fd82196bSdjm 
982fd82196bSdjm 	TEST_START("hostkeys_iterate specify IPv6");
983fd82196bSdjm 	memset(&ctx, 0, sizeof(ctx));
984fd82196bSdjm 	ctx.expected = expected_full;
985fd82196bSdjm 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
986fd82196bSdjm 	ctx.flags = 0;
987fd82196bSdjm 	ctx.match_ipv6 = 1;
988fd82196bSdjm 	prepare_expected(expected_full, ctx.nexpected);
989fd82196bSdjm 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
990cd0e447aSdjm 	    check, &ctx, "tiresias.example.org", "2001:db8::1",
991cd0e447aSdjm 	    ctx.flags, 0), 0);
9921f1a9c0cSdjm 	cleanup_expected(expected_full, ctx.nexpected);
993fd82196bSdjm 	TEST_DONE();
994fd82196bSdjm 
995fd82196bSdjm 	TEST_START("hostkeys_iterate match IPv4");
996fd82196bSdjm 	memset(&ctx, 0, sizeof(ctx));
997fd82196bSdjm 	ctx.expected = expected_full;
998fd82196bSdjm 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
999fd82196bSdjm 	ctx.flags = HKF_WANT_MATCH;
1000fd82196bSdjm 	ctx.match_ipv4 = 1;
1001fd82196bSdjm 	prepare_expected(expected_full, ctx.nexpected);
1002fd82196bSdjm 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
1003cd0e447aSdjm 	    check, &ctx, "tiresias.example.org", "192.0.2.1", ctx.flags, 0), 0);
10041f1a9c0cSdjm 	cleanup_expected(expected_full, ctx.nexpected);
1005fd82196bSdjm 	TEST_DONE();
1006fd82196bSdjm 
1007fd82196bSdjm 	TEST_START("hostkeys_iterate match IPv6");
1008fd82196bSdjm 	memset(&ctx, 0, sizeof(ctx));
1009fd82196bSdjm 	ctx.expected = expected_full;
1010fd82196bSdjm 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
1011fd82196bSdjm 	ctx.flags = HKF_WANT_MATCH;
1012fd82196bSdjm 	ctx.match_ipv6 = 1;
1013fd82196bSdjm 	prepare_expected(expected_full, ctx.nexpected);
1014fd82196bSdjm 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
1015cd0e447aSdjm 	    check, &ctx, "tiresias.example.org", "2001:db8::1",
1016cd0e447aSdjm 	    ctx.flags, 0), 0);
10171f1a9c0cSdjm 	cleanup_expected(expected_full, ctx.nexpected);
1018fd82196bSdjm 	TEST_DONE();
1019fd82196bSdjm 
1020fd82196bSdjm 	TEST_START("hostkeys_iterate specify addr missing");
1021fd82196bSdjm 	memset(&ctx, 0, sizeof(ctx));
1022fd82196bSdjm 	ctx.expected = expected_full;
1023fd82196bSdjm 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
1024fd82196bSdjm 	ctx.flags = 0;
1025fd82196bSdjm 	prepare_expected(expected_full, ctx.nexpected);
1026fd82196bSdjm 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
1027cd0e447aSdjm 	    check, &ctx, "tiresias.example.org", "192.168.0.1",
1028cd0e447aSdjm 	    ctx.flags, 0), 0);
10291f1a9c0cSdjm 	cleanup_expected(expected_full, ctx.nexpected);
1030fd82196bSdjm 	TEST_DONE();
1031fd82196bSdjm 
1032fd82196bSdjm 	TEST_START("hostkeys_iterate match addr missing");
1033fd82196bSdjm 	memset(&ctx, 0, sizeof(ctx));
1034fd82196bSdjm 	ctx.expected = expected_full;
1035fd82196bSdjm 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
1036fd82196bSdjm 	ctx.flags = HKF_WANT_MATCH;
1037fd82196bSdjm 	prepare_expected(expected_full, ctx.nexpected);
1038fd82196bSdjm 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
1039cd0e447aSdjm 	    check, &ctx, "tiresias.example.org", "::1", ctx.flags, 0), 0);
10401f1a9c0cSdjm 	cleanup_expected(expected_full, ctx.nexpected);
1041fd82196bSdjm 	TEST_DONE();
1042fd82196bSdjm 
1043fd82196bSdjm 	TEST_START("hostkeys_iterate specify host 2 and IPv4");
1044fd82196bSdjm 	memset(&ctx, 0, sizeof(ctx));
1045fd82196bSdjm 	ctx.expected = expected_full;
1046fd82196bSdjm 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
1047fd82196bSdjm 	ctx.flags = 0;
1048fd82196bSdjm 	ctx.match_host_s = 1;
1049fd82196bSdjm 	ctx.match_ipv4 = 1;
1050fd82196bSdjm 	prepare_expected(expected_full, ctx.nexpected);
1051fd82196bSdjm 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
1052cd0e447aSdjm 	    check, &ctx, "sisyphus.example.com", "192.0.2.1", ctx.flags, 0), 0);
10531f1a9c0cSdjm 	cleanup_expected(expected_full, ctx.nexpected);
1054fd82196bSdjm 	TEST_DONE();
1055fd82196bSdjm 
1056fd82196bSdjm 	TEST_START("hostkeys_iterate match host 1 and IPv6");
1057fd82196bSdjm 	memset(&ctx, 0, sizeof(ctx));
1058fd82196bSdjm 	ctx.expected = expected_full;
1059fd82196bSdjm 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
1060fd82196bSdjm 	ctx.flags = HKF_WANT_MATCH;
1061fd82196bSdjm 	ctx.match_host_p = 1;
1062fd82196bSdjm 	ctx.match_ipv6 = 1;
1063fd82196bSdjm 	prepare_expected(expected_full, ctx.nexpected);
1064fd82196bSdjm 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
10651f1a9c0cSdjm 	    check, &ctx, "prometheus.example.com",
1066cd0e447aSdjm 	    "2001:db8::1", ctx.flags, 0), 0);
10671f1a9c0cSdjm 	cleanup_expected(expected_full, ctx.nexpected);
1068fd82196bSdjm 	TEST_DONE();
1069fd82196bSdjm 
1070fd82196bSdjm 	TEST_START("hostkeys_iterate specify host 2 and IPv4 w/ key parse");
1071fd82196bSdjm 	memset(&ctx, 0, sizeof(ctx));
1072fd82196bSdjm 	ctx.expected = expected_full;
1073fd82196bSdjm 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
1074fd82196bSdjm 	ctx.flags = HKF_WANT_PARSE_KEY;
1075fd82196bSdjm 	ctx.match_host_s = 1;
1076fd82196bSdjm 	ctx.match_ipv4 = 1;
1077fd82196bSdjm 	prepare_expected(expected_full, ctx.nexpected);
1078fd82196bSdjm 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
1079cd0e447aSdjm 	    check, &ctx, "sisyphus.example.com", "192.0.2.1", ctx.flags, 0), 0);
10801f1a9c0cSdjm 	cleanup_expected(expected_full, ctx.nexpected);
1081fd82196bSdjm 	TEST_DONE();
1082fd82196bSdjm 
1083fd82196bSdjm 	TEST_START("hostkeys_iterate match host 1 and IPv6 w/ key parse");
1084fd82196bSdjm 	memset(&ctx, 0, sizeof(ctx));
1085fd82196bSdjm 	ctx.expected = expected_full;
1086fd82196bSdjm 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
1087fd82196bSdjm 	ctx.flags = HKF_WANT_MATCH|HKF_WANT_PARSE_KEY;
1088fd82196bSdjm 	ctx.match_host_p = 1;
1089fd82196bSdjm 	ctx.match_ipv6 = 1;
1090fd82196bSdjm 	prepare_expected(expected_full, ctx.nexpected);
1091fd82196bSdjm 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
10921f1a9c0cSdjm 	    check, &ctx, "prometheus.example.com",
1093cd0e447aSdjm 	    "2001:db8::1", ctx.flags, 0), 0);
10941f1a9c0cSdjm 	cleanup_expected(expected_full, ctx.nexpected);
1095fd82196bSdjm 	TEST_DONE();
1096fd82196bSdjm }
1097fd82196bSdjm 
1098