xref: /src/crypto/openssh/regress/unittests/hostkeys/test_iterate.c (revision a91a246563dffa876a52f53a98de4af9fa364c52)
19200ce32SEd Maste /* 	$OpenBSD: test_iterate.c,v 1.9 2024/01/11 01:45:58 djm Exp $ */
2c1e08615SDag-Erling Smørgrav /*
3c1e08615SDag-Erling Smørgrav  * Regress test for hostfile.h hostkeys_foreach()
4c1e08615SDag-Erling Smørgrav  *
5c1e08615SDag-Erling Smørgrav  * Placed in the public domain
6c1e08615SDag-Erling Smørgrav  */
7c1e08615SDag-Erling Smørgrav 
8c1e08615SDag-Erling Smørgrav #include "includes.h"
9c1e08615SDag-Erling Smørgrav 
10c1e08615SDag-Erling Smørgrav #include <sys/types.h>
11c1e08615SDag-Erling Smørgrav #include <stdio.h>
12c1e08615SDag-Erling Smørgrav #ifdef HAVE_STDINT_H
13c1e08615SDag-Erling Smørgrav #include <stdint.h>
14c1e08615SDag-Erling Smørgrav #endif
15c1e08615SDag-Erling Smørgrav #include <stdlib.h>
16c1e08615SDag-Erling Smørgrav #include <string.h>
17c1e08615SDag-Erling Smørgrav 
18c1e08615SDag-Erling Smørgrav #include "../test_helper/test_helper.h"
19c1e08615SDag-Erling Smørgrav 
20c1e08615SDag-Erling Smørgrav #include "sshkey.h"
21c1e08615SDag-Erling Smørgrav #include "authfile.h"
22c1e08615SDag-Erling Smørgrav #include "hostfile.h"
23c1e08615SDag-Erling Smørgrav 
24c1e08615SDag-Erling Smørgrav struct expected {
25c1e08615SDag-Erling Smørgrav 	const char *key_file;		/* Path for key, NULL for none */
26c1e08615SDag-Erling Smørgrav 	int no_parse_status;		/* Expected status w/o key parsing */
27c1e08615SDag-Erling Smørgrav 	int no_parse_keytype;		/* Expected keytype w/o key parsing */
28c1e08615SDag-Erling Smørgrav 	int match_host_p;		/* Match 'prometheus.example.com' */
29c1e08615SDag-Erling Smørgrav 	int match_host_s;		/* Match 'sisyphus.example.com' */
30c1e08615SDag-Erling Smørgrav 	int match_ipv4;			/* Match '192.0.2.1' */
31c1e08615SDag-Erling Smørgrav 	int match_ipv6;			/* Match '2001:db8::1' */
32c1e08615SDag-Erling Smørgrav 	int match_flags;		/* Expected flags from match */
33c1e08615SDag-Erling Smørgrav 	struct hostkey_foreach_line l;	/* Expected line contents */
34c1e08615SDag-Erling Smørgrav };
35c1e08615SDag-Erling Smørgrav 
36c1e08615SDag-Erling Smørgrav struct cbctx {
37c1e08615SDag-Erling Smørgrav 	const struct expected *expected;
38c1e08615SDag-Erling Smørgrav 	size_t nexpected;
39c1e08615SDag-Erling Smørgrav 	size_t i;
40c1e08615SDag-Erling Smørgrav 	int flags;
41c1e08615SDag-Erling Smørgrav 	int match_host_p;
42c1e08615SDag-Erling Smørgrav 	int match_host_s;
43c1e08615SDag-Erling Smørgrav 	int match_ipv4;
44c1e08615SDag-Erling Smørgrav 	int match_ipv6;
45c1e08615SDag-Erling Smørgrav };
46c1e08615SDag-Erling Smørgrav 
47c1e08615SDag-Erling Smørgrav /*
48c1e08615SDag-Erling Smørgrav  * hostkeys_foreach() iterator callback that verifies the line passed
49c1e08615SDag-Erling Smørgrav  * against an array of expected entries.
50c1e08615SDag-Erling Smørgrav  */
51c1e08615SDag-Erling Smørgrav static int
check(struct hostkey_foreach_line * l,void * _ctx)52c1e08615SDag-Erling Smørgrav check(struct hostkey_foreach_line *l, void *_ctx)
53c1e08615SDag-Erling Smørgrav {
54c1e08615SDag-Erling Smørgrav 	struct cbctx *ctx = (struct cbctx *)_ctx;
55c1e08615SDag-Erling Smørgrav 	const struct expected *expected;
56c1e08615SDag-Erling Smørgrav 	int parse_key = (ctx->flags & HKF_WANT_PARSE_KEY) != 0;
57c1e08615SDag-Erling Smørgrav 	const int matching = (ctx->flags & HKF_WANT_MATCH) != 0;
58c1e08615SDag-Erling Smørgrav 	u_int expected_status, expected_match;
590194e6d0SEd Maste 	int expected_keytype, skip = 0;
60c1e08615SDag-Erling Smørgrav 
61c1e08615SDag-Erling Smørgrav 	test_subtest_info("entry %zu/%zu, file line %ld",
62c1e08615SDag-Erling Smørgrav 	    ctx->i + 1, ctx->nexpected, l->linenum);
63c1e08615SDag-Erling Smørgrav 
64c1e08615SDag-Erling Smørgrav 	for (;;) {
65c1e08615SDag-Erling Smørgrav 		ASSERT_SIZE_T_LT(ctx->i, ctx->nexpected);
66c1e08615SDag-Erling Smørgrav 		expected = ctx->expected + ctx->i++;
67c1e08615SDag-Erling Smørgrav 		/* If we are matching host/IP then skip entries that don't */
68c1e08615SDag-Erling Smørgrav 		if (!matching)
69c1e08615SDag-Erling Smørgrav 			break;
70c1e08615SDag-Erling Smørgrav 		if (ctx->match_host_p && expected->match_host_p)
71c1e08615SDag-Erling Smørgrav 			break;
72c1e08615SDag-Erling Smørgrav 		if (ctx->match_host_s && expected->match_host_s)
73c1e08615SDag-Erling Smørgrav 			break;
74c1e08615SDag-Erling Smørgrav 		if (ctx->match_ipv4 && expected->match_ipv4)
75c1e08615SDag-Erling Smørgrav 			break;
76c1e08615SDag-Erling Smørgrav 		if (ctx->match_ipv6 && expected->match_ipv6)
77c1e08615SDag-Erling Smørgrav 			break;
78c1e08615SDag-Erling Smørgrav 	}
79c1e08615SDag-Erling Smørgrav 	expected_status = (parse_key || expected->no_parse_status < 0) ?
80c1e08615SDag-Erling Smørgrav 	    expected->l.status : (u_int)expected->no_parse_status;
81c1e08615SDag-Erling Smørgrav 	expected_match = expected->l.match;
82c1e08615SDag-Erling Smørgrav #define UPDATE_MATCH_STATUS(x) do { \
83c1e08615SDag-Erling Smørgrav 		if (ctx->x && expected->x) { \
84c1e08615SDag-Erling Smørgrav 			expected_match |= expected->x; \
85c1e08615SDag-Erling Smørgrav 			if (expected_status == HKF_STATUS_OK) \
86c1e08615SDag-Erling Smørgrav 				expected_status = HKF_STATUS_MATCHED; \
87c1e08615SDag-Erling Smørgrav 		} \
88c1e08615SDag-Erling Smørgrav 	} while (0)
89c1e08615SDag-Erling Smørgrav 	expected_keytype = (parse_key || expected->no_parse_keytype < 0) ?
90c1e08615SDag-Erling Smørgrav 	    expected->l.keytype : expected->no_parse_keytype;
91c1e08615SDag-Erling Smørgrav 
92c1e08615SDag-Erling Smørgrav #ifndef OPENSSL_HAS_ECC
93c1e08615SDag-Erling Smørgrav 	if (expected->l.keytype == KEY_ECDSA ||
940194e6d0SEd Maste 	    expected->no_parse_keytype == KEY_ECDSA)
950194e6d0SEd Maste 		skip = 1;
960194e6d0SEd Maste #endif /* OPENSSL_HAS_ECC */
979200ce32SEd Maste #ifndef WITH_DSA
989200ce32SEd Maste 	if (expected->l.keytype == KEY_DSA ||
999200ce32SEd Maste 	    expected->no_parse_keytype == KEY_DSA)
1009200ce32SEd Maste 		skip = 1;
1019200ce32SEd Maste #endif
1020194e6d0SEd Maste #ifndef WITH_OPENSSL
1030194e6d0SEd Maste 	if (expected->l.keytype == KEY_DSA ||
1040194e6d0SEd Maste 	    expected->no_parse_keytype == KEY_DSA ||
1050194e6d0SEd Maste 	    expected->l.keytype == KEY_RSA ||
1060194e6d0SEd Maste 	    expected->no_parse_keytype == KEY_RSA ||
1070194e6d0SEd Maste 	    expected->l.keytype == KEY_ECDSA ||
1080194e6d0SEd Maste 	    expected->no_parse_keytype == KEY_ECDSA)
1090194e6d0SEd Maste 		skip = 1;
1100194e6d0SEd Maste #endif /* WITH_OPENSSL */
1110194e6d0SEd Maste 	if (skip) {
112c1e08615SDag-Erling Smørgrav 		expected_status = HKF_STATUS_INVALID;
113c1e08615SDag-Erling Smørgrav 		expected_keytype = KEY_UNSPEC;
114c1e08615SDag-Erling Smørgrav 		parse_key = 0;
115c1e08615SDag-Erling Smørgrav 	}
116c1e08615SDag-Erling Smørgrav 	UPDATE_MATCH_STATUS(match_host_p);
117c1e08615SDag-Erling Smørgrav 	UPDATE_MATCH_STATUS(match_host_s);
118c1e08615SDag-Erling Smørgrav 	UPDATE_MATCH_STATUS(match_ipv4);
119c1e08615SDag-Erling Smørgrav 	UPDATE_MATCH_STATUS(match_ipv6);
120c1e08615SDag-Erling Smørgrav 
121c1e08615SDag-Erling Smørgrav 	ASSERT_PTR_NE(l->path, NULL); /* Don't care about path */
122c1e08615SDag-Erling Smørgrav 	ASSERT_LONG_LONG_EQ(l->linenum, expected->l.linenum);
123c1e08615SDag-Erling Smørgrav 	ASSERT_U_INT_EQ(l->status, expected_status);
124c1e08615SDag-Erling Smørgrav 	ASSERT_U_INT_EQ(l->match, expected_match);
125c1e08615SDag-Erling Smørgrav 	/* Not all test entries contain fulltext */
126c1e08615SDag-Erling Smørgrav 	if (expected->l.line != NULL)
127c1e08615SDag-Erling Smørgrav 		ASSERT_STRING_EQ(l->line, expected->l.line);
128c1e08615SDag-Erling Smørgrav 	ASSERT_INT_EQ(l->marker, expected->l.marker);
129c1e08615SDag-Erling Smørgrav 	/* XXX we skip hashed hostnames for now; implement checking */
130c1e08615SDag-Erling Smørgrav 	if (expected->l.hosts != NULL)
131c1e08615SDag-Erling Smørgrav 		ASSERT_STRING_EQ(l->hosts, expected->l.hosts);
132c1e08615SDag-Erling Smørgrav 	/* Not all test entries contain raw keys */
133c1e08615SDag-Erling Smørgrav 	if (expected->l.rawkey != NULL)
134c1e08615SDag-Erling Smørgrav 		ASSERT_STRING_EQ(l->rawkey, expected->l.rawkey);
135c1e08615SDag-Erling Smørgrav 	/* XXX synthesise raw key for cases lacking and compare */
136c1e08615SDag-Erling Smørgrav 	ASSERT_INT_EQ(l->keytype, expected_keytype);
137c1e08615SDag-Erling Smørgrav 	if (parse_key) {
138c1e08615SDag-Erling Smørgrav 		if (expected->l.key == NULL)
139c1e08615SDag-Erling Smørgrav 			ASSERT_PTR_EQ(l->key, NULL);
140c1e08615SDag-Erling Smørgrav 		if (expected->l.key != NULL) {
141c1e08615SDag-Erling Smørgrav 			ASSERT_PTR_NE(l->key, NULL);
142c1e08615SDag-Erling Smørgrav 			ASSERT_INT_EQ(sshkey_equal(l->key, expected->l.key), 1);
143c1e08615SDag-Erling Smørgrav 		}
144c1e08615SDag-Erling Smørgrav 	}
145c1e08615SDag-Erling Smørgrav 	if (parse_key && !(l->comment == NULL && expected->l.comment == NULL))
146c1e08615SDag-Erling Smørgrav 		ASSERT_STRING_EQ(l->comment, expected->l.comment);
147c1e08615SDag-Erling Smørgrav 	return 0;
148c1e08615SDag-Erling Smørgrav }
149c1e08615SDag-Erling Smørgrav 
150c1e08615SDag-Erling Smørgrav /* Loads public keys for a set of expected results */
151c1e08615SDag-Erling Smørgrav static void
prepare_expected(struct expected * expected,size_t n)152c1e08615SDag-Erling Smørgrav prepare_expected(struct expected *expected, size_t n)
153c1e08615SDag-Erling Smørgrav {
154c1e08615SDag-Erling Smørgrav 	size_t i;
155c1e08615SDag-Erling Smørgrav 
156c1e08615SDag-Erling Smørgrav 	for (i = 0; i < n; i++) {
157c1e08615SDag-Erling Smørgrav 		if (expected[i].key_file == NULL)
158c1e08615SDag-Erling Smørgrav 			continue;
159c1e08615SDag-Erling Smørgrav #ifndef OPENSSL_HAS_ECC
160c1e08615SDag-Erling Smørgrav 		if (expected[i].l.keytype == KEY_ECDSA)
161c1e08615SDag-Erling Smørgrav 			continue;
1620194e6d0SEd Maste #endif /* OPENSSL_HAS_ECC */
1639200ce32SEd Maste #ifndef WITH_DSA
1649200ce32SEd Maste 		if (expected[i].l.keytype == KEY_DSA)
1659200ce32SEd Maste 			continue;
1669200ce32SEd Maste #endif
1670194e6d0SEd Maste #ifndef WITH_OPENSSL
1680194e6d0SEd Maste 		switch (expected[i].l.keytype) {
1690194e6d0SEd Maste 		case KEY_RSA:
1700194e6d0SEd Maste 		case KEY_DSA:
1710194e6d0SEd Maste 		case KEY_ECDSA:
1720194e6d0SEd Maste 			continue;
1730194e6d0SEd Maste 		}
1740194e6d0SEd Maste #endif /* WITH_OPENSSL */
175c1e08615SDag-Erling Smørgrav 		ASSERT_INT_EQ(sshkey_load_public(
176c1e08615SDag-Erling Smørgrav 		    test_data_file(expected[i].key_file), &expected[i].l.key,
177c1e08615SDag-Erling Smørgrav 		    NULL), 0);
178c1e08615SDag-Erling Smørgrav 	}
179c1e08615SDag-Erling Smørgrav }
180c1e08615SDag-Erling Smørgrav 
181d46065dfSDag-Erling Smørgrav static void
cleanup_expected(struct expected * expected,size_t n)182d46065dfSDag-Erling Smørgrav cleanup_expected(struct expected *expected, size_t n)
183d46065dfSDag-Erling Smørgrav {
184d46065dfSDag-Erling Smørgrav 	size_t i;
185d46065dfSDag-Erling Smørgrav 
186d46065dfSDag-Erling Smørgrav 	for (i = 0; i < n; i++) {
187d46065dfSDag-Erling Smørgrav 		sshkey_free(expected[i].l.key);
188d46065dfSDag-Erling Smørgrav 		expected[i].l.key = NULL;
189d46065dfSDag-Erling Smørgrav 	}
190d46065dfSDag-Erling Smørgrav }
191d46065dfSDag-Erling Smørgrav 
192c1e08615SDag-Erling Smørgrav struct expected expected_full[] = {
193c1e08615SDag-Erling Smørgrav 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
194c1e08615SDag-Erling Smørgrav 		NULL,				/* path, don't care */
195c1e08615SDag-Erling Smørgrav 		1,				/* line number */
196c1e08615SDag-Erling Smørgrav 		HKF_STATUS_COMMENT,		/* status */
197c1e08615SDag-Erling Smørgrav 		0,				/* match flags */
198c1e08615SDag-Erling Smørgrav 		"# Plain host keys, plain host names", /* full line, optional */
199c1e08615SDag-Erling Smørgrav 		MRK_NONE,			/* marker (CA / revoked) */
200c1e08615SDag-Erling Smørgrav 		NULL,				/* hosts text */
201c1e08615SDag-Erling Smørgrav 		NULL,				/* raw key, optional */
202c1e08615SDag-Erling Smørgrav 		KEY_UNSPEC,			/* key type */
203c1e08615SDag-Erling Smørgrav 		NULL,				/* deserialised key */
204c1e08615SDag-Erling Smørgrav 		NULL,				/* comment */
205206be79aSEd Maste 		0,				/* note */
206c1e08615SDag-Erling Smørgrav 	} },
207c1e08615SDag-Erling Smørgrav 	{ "dsa_1.pub" , -1, -1, 0, HKF_MATCH_HOST, 0, 0, -1, {
208c1e08615SDag-Erling Smørgrav 		NULL,
209c1e08615SDag-Erling Smørgrav 		2,
210c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
211c1e08615SDag-Erling Smørgrav 		0,
212c1e08615SDag-Erling Smørgrav 		NULL,
213c1e08615SDag-Erling Smørgrav 		MRK_NONE,
214c1e08615SDag-Erling Smørgrav 		"sisyphus.example.com",
215c1e08615SDag-Erling Smørgrav 		NULL,
216c1e08615SDag-Erling Smørgrav 		KEY_DSA,
217c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
218c1e08615SDag-Erling Smørgrav 		"DSA #1",
219206be79aSEd Maste 		0,
220c1e08615SDag-Erling Smørgrav 	} },
221c1e08615SDag-Erling Smørgrav 	{ "ecdsa_1.pub" , -1, -1, 0, HKF_MATCH_HOST, 0, 0, -1, {
222c1e08615SDag-Erling Smørgrav 		NULL,
223c1e08615SDag-Erling Smørgrav 		3,
224c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
225c1e08615SDag-Erling Smørgrav 		0,
226c1e08615SDag-Erling Smørgrav 		NULL,
227c1e08615SDag-Erling Smørgrav 		MRK_NONE,
228c1e08615SDag-Erling Smørgrav 		"sisyphus.example.com",
229c1e08615SDag-Erling Smørgrav 		NULL,
230c1e08615SDag-Erling Smørgrav 		KEY_ECDSA,
231c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
232c1e08615SDag-Erling Smørgrav 		"ECDSA #1",
233206be79aSEd Maste 		0,
234c1e08615SDag-Erling Smørgrav 	} },
235c1e08615SDag-Erling Smørgrav 	{ "ed25519_1.pub" , -1, -1, 0, HKF_MATCH_HOST, 0, 0, -1, {
236c1e08615SDag-Erling Smørgrav 		NULL,
237c1e08615SDag-Erling Smørgrav 		4,
238c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
239c1e08615SDag-Erling Smørgrav 		0,
240c1e08615SDag-Erling Smørgrav 		NULL,
241c1e08615SDag-Erling Smørgrav 		MRK_NONE,
242c1e08615SDag-Erling Smørgrav 		"sisyphus.example.com",
243c1e08615SDag-Erling Smørgrav 		NULL,
244c1e08615SDag-Erling Smørgrav 		KEY_ED25519,
245c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
246c1e08615SDag-Erling Smørgrav 		"ED25519 #1",
247206be79aSEd Maste 		0,
248c1e08615SDag-Erling Smørgrav 	} },
249c1e08615SDag-Erling Smørgrav 	{ "rsa_1.pub" , -1, -1, 0, HKF_MATCH_HOST, 0, 0, -1, {
250c1e08615SDag-Erling Smørgrav 		NULL,
25120adc8f2SDag-Erling Smørgrav 		5,
252c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
253c1e08615SDag-Erling Smørgrav 		0,
254c1e08615SDag-Erling Smørgrav 		NULL,
255c1e08615SDag-Erling Smørgrav 		MRK_NONE,
256c1e08615SDag-Erling Smørgrav 		"sisyphus.example.com",
257c1e08615SDag-Erling Smørgrav 		NULL,
258c1e08615SDag-Erling Smørgrav 		KEY_RSA,
259c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
260c1e08615SDag-Erling Smørgrav 		"RSA #1",
261206be79aSEd Maste 		0,
262c1e08615SDag-Erling Smørgrav 	} },
263c1e08615SDag-Erling Smørgrav 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
264c1e08615SDag-Erling Smørgrav 		NULL,
26520adc8f2SDag-Erling Smørgrav 		6,
266c1e08615SDag-Erling Smørgrav 		HKF_STATUS_COMMENT,
267c1e08615SDag-Erling Smørgrav 		0,
268c1e08615SDag-Erling Smørgrav 		"",
269c1e08615SDag-Erling Smørgrav 		MRK_NONE,
270c1e08615SDag-Erling Smørgrav 		NULL,
271c1e08615SDag-Erling Smørgrav 		NULL,
272c1e08615SDag-Erling Smørgrav 		KEY_UNSPEC,
273c1e08615SDag-Erling Smørgrav 		NULL,
274c1e08615SDag-Erling Smørgrav 		NULL,
275206be79aSEd Maste 		0,
276c1e08615SDag-Erling Smørgrav 	} },
277c1e08615SDag-Erling Smørgrav 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
278c1e08615SDag-Erling Smørgrav 		NULL,
27920adc8f2SDag-Erling Smørgrav 		7,
280c1e08615SDag-Erling Smørgrav 		HKF_STATUS_COMMENT,
281c1e08615SDag-Erling Smørgrav 		0,
282c1e08615SDag-Erling Smørgrav 		"# Plain host keys, hostnames + addresses",
283c1e08615SDag-Erling Smørgrav 		MRK_NONE,
284c1e08615SDag-Erling Smørgrav 		NULL,
285c1e08615SDag-Erling Smørgrav 		NULL,
286c1e08615SDag-Erling Smørgrav 		KEY_UNSPEC,
287c1e08615SDag-Erling Smørgrav 		NULL,
288c1e08615SDag-Erling Smørgrav 		NULL,
289206be79aSEd Maste 		0,
290c1e08615SDag-Erling Smørgrav 	} },
291c1e08615SDag-Erling Smørgrav 	{ "dsa_2.pub" , -1, -1, HKF_MATCH_HOST, 0, HKF_MATCH_IP, HKF_MATCH_IP, -1, {
292c1e08615SDag-Erling Smørgrav 		NULL,
29320adc8f2SDag-Erling Smørgrav 		8,
294c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
295c1e08615SDag-Erling Smørgrav 		0,
296c1e08615SDag-Erling Smørgrav 		NULL,
297c1e08615SDag-Erling Smørgrav 		MRK_NONE,
298c1e08615SDag-Erling Smørgrav 		"prometheus.example.com,192.0.2.1,2001:db8::1",
299c1e08615SDag-Erling Smørgrav 		NULL,
300c1e08615SDag-Erling Smørgrav 		KEY_DSA,
301c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
302c1e08615SDag-Erling Smørgrav 		"DSA #2",
303206be79aSEd Maste 		0,
304c1e08615SDag-Erling Smørgrav 	} },
305c1e08615SDag-Erling Smørgrav 	{ "ecdsa_2.pub" , -1, -1, HKF_MATCH_HOST, 0, HKF_MATCH_IP, HKF_MATCH_IP, -1, {
306c1e08615SDag-Erling Smørgrav 		NULL,
30720adc8f2SDag-Erling Smørgrav 		9,
308c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
309c1e08615SDag-Erling Smørgrav 		0,
310c1e08615SDag-Erling Smørgrav 		NULL,
311c1e08615SDag-Erling Smørgrav 		MRK_NONE,
312c1e08615SDag-Erling Smørgrav 		"prometheus.example.com,192.0.2.1,2001:db8::1",
313c1e08615SDag-Erling Smørgrav 		NULL,
314c1e08615SDag-Erling Smørgrav 		KEY_ECDSA,
315c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
316c1e08615SDag-Erling Smørgrav 		"ECDSA #2",
317206be79aSEd Maste 		0,
318c1e08615SDag-Erling Smørgrav 	} },
319c1e08615SDag-Erling Smørgrav 	{ "ed25519_2.pub" , -1, -1, HKF_MATCH_HOST, 0, HKF_MATCH_IP, HKF_MATCH_IP, -1, {
320c1e08615SDag-Erling Smørgrav 		NULL,
32120adc8f2SDag-Erling Smørgrav 		10,
322c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
323c1e08615SDag-Erling Smørgrav 		0,
324c1e08615SDag-Erling Smørgrav 		NULL,
325c1e08615SDag-Erling Smørgrav 		MRK_NONE,
326c1e08615SDag-Erling Smørgrav 		"prometheus.example.com,192.0.2.1,2001:db8::1",
327c1e08615SDag-Erling Smørgrav 		NULL,
328c1e08615SDag-Erling Smørgrav 		KEY_ED25519,
329c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
330c1e08615SDag-Erling Smørgrav 		"ED25519 #2",
331206be79aSEd Maste 		0,
332c1e08615SDag-Erling Smørgrav 	} },
333c1e08615SDag-Erling Smørgrav 	{ "rsa_2.pub" , -1, -1, HKF_MATCH_HOST, 0, HKF_MATCH_IP, HKF_MATCH_IP, -1, {
334c1e08615SDag-Erling Smørgrav 		NULL,
33520adc8f2SDag-Erling Smørgrav 		11,
336c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
337c1e08615SDag-Erling Smørgrav 		0,
338c1e08615SDag-Erling Smørgrav 		NULL,
339c1e08615SDag-Erling Smørgrav 		MRK_NONE,
340c1e08615SDag-Erling Smørgrav 		"prometheus.example.com,192.0.2.1,2001:db8::1",
341c1e08615SDag-Erling Smørgrav 		NULL,
342c1e08615SDag-Erling Smørgrav 		KEY_RSA,
343c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
344c1e08615SDag-Erling Smørgrav 		"RSA #2",
345206be79aSEd Maste 		0,
346c1e08615SDag-Erling Smørgrav 	} },
347c1e08615SDag-Erling Smørgrav 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
348c1e08615SDag-Erling Smørgrav 		NULL,
34920adc8f2SDag-Erling Smørgrav 		12,
350c1e08615SDag-Erling Smørgrav 		HKF_STATUS_COMMENT,
351c1e08615SDag-Erling Smørgrav 		0,
352c1e08615SDag-Erling Smørgrav 		"",
353c1e08615SDag-Erling Smørgrav 		MRK_NONE,
354c1e08615SDag-Erling Smørgrav 		NULL,
355c1e08615SDag-Erling Smørgrav 		NULL,
356c1e08615SDag-Erling Smørgrav 		KEY_UNSPEC,
357c1e08615SDag-Erling Smørgrav 		NULL,
358c1e08615SDag-Erling Smørgrav 		NULL,
359206be79aSEd Maste 		0,
360c1e08615SDag-Erling Smørgrav 	} },
361c1e08615SDag-Erling Smørgrav 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
362c1e08615SDag-Erling Smørgrav 		NULL,
36320adc8f2SDag-Erling Smørgrav 		13,
364c1e08615SDag-Erling Smørgrav 		HKF_STATUS_COMMENT,
365c1e08615SDag-Erling Smørgrav 		0,
366c1e08615SDag-Erling Smørgrav 		"# Some hosts with wildcard names / IPs",
367c1e08615SDag-Erling Smørgrav 		MRK_NONE,
368c1e08615SDag-Erling Smørgrav 		NULL,
369c1e08615SDag-Erling Smørgrav 		NULL,
370c1e08615SDag-Erling Smørgrav 		KEY_UNSPEC,
371c1e08615SDag-Erling Smørgrav 		NULL,
372c1e08615SDag-Erling Smørgrav 		NULL,
373206be79aSEd Maste 		0,
374c1e08615SDag-Erling Smørgrav 	} },
375c1e08615SDag-Erling Smørgrav 	{ "dsa_3.pub" , -1, -1, HKF_MATCH_HOST, HKF_MATCH_HOST, HKF_MATCH_IP, HKF_MATCH_IP, -1, {
376c1e08615SDag-Erling Smørgrav 		NULL,
37720adc8f2SDag-Erling Smørgrav 		14,
378c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
379c1e08615SDag-Erling Smørgrav 		0,
380c1e08615SDag-Erling Smørgrav 		NULL,
381c1e08615SDag-Erling Smørgrav 		MRK_NONE,
382c1e08615SDag-Erling Smørgrav 		"*.example.com,192.0.2.*,2001:*",
383c1e08615SDag-Erling Smørgrav 		NULL,
384c1e08615SDag-Erling Smørgrav 		KEY_DSA,
385c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
386c1e08615SDag-Erling Smørgrav 		"DSA #3",
387206be79aSEd Maste 		0,
388c1e08615SDag-Erling Smørgrav 	} },
389c1e08615SDag-Erling Smørgrav 	{ "ecdsa_3.pub" , -1, -1, HKF_MATCH_HOST, HKF_MATCH_HOST, HKF_MATCH_IP, HKF_MATCH_IP, -1, {
390c1e08615SDag-Erling Smørgrav 		NULL,
39120adc8f2SDag-Erling Smørgrav 		15,
392c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
393c1e08615SDag-Erling Smørgrav 		0,
394c1e08615SDag-Erling Smørgrav 		NULL,
395c1e08615SDag-Erling Smørgrav 		MRK_NONE,
396c1e08615SDag-Erling Smørgrav 		"*.example.com,192.0.2.*,2001:*",
397c1e08615SDag-Erling Smørgrav 		NULL,
398c1e08615SDag-Erling Smørgrav 		KEY_ECDSA,
399c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
400c1e08615SDag-Erling Smørgrav 		"ECDSA #3",
401206be79aSEd Maste 		0,
402c1e08615SDag-Erling Smørgrav 	} },
403c1e08615SDag-Erling Smørgrav 	{ "ed25519_3.pub" , -1, -1, HKF_MATCH_HOST, HKF_MATCH_HOST, HKF_MATCH_IP, HKF_MATCH_IP, -1, {
404c1e08615SDag-Erling Smørgrav 		NULL,
40520adc8f2SDag-Erling Smørgrav 		16,
406c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
407c1e08615SDag-Erling Smørgrav 		0,
408c1e08615SDag-Erling Smørgrav 		NULL,
409c1e08615SDag-Erling Smørgrav 		MRK_NONE,
410c1e08615SDag-Erling Smørgrav 		"*.example.com,192.0.2.*,2001:*",
411c1e08615SDag-Erling Smørgrav 		NULL,
412c1e08615SDag-Erling Smørgrav 		KEY_ED25519,
413c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
414c1e08615SDag-Erling Smørgrav 		"ED25519 #3",
415206be79aSEd Maste 		0,
416c1e08615SDag-Erling Smørgrav 	} },
417c1e08615SDag-Erling Smørgrav 	{ "rsa_3.pub" , -1, -1, HKF_MATCH_HOST, HKF_MATCH_HOST, HKF_MATCH_IP, HKF_MATCH_IP, -1, {
418c1e08615SDag-Erling Smørgrav 		NULL,
41920adc8f2SDag-Erling Smørgrav 		17,
420c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
421c1e08615SDag-Erling Smørgrav 		0,
422c1e08615SDag-Erling Smørgrav 		NULL,
423c1e08615SDag-Erling Smørgrav 		MRK_NONE,
424c1e08615SDag-Erling Smørgrav 		"*.example.com,192.0.2.*,2001:*",
425c1e08615SDag-Erling Smørgrav 		NULL,
426c1e08615SDag-Erling Smørgrav 		KEY_RSA,
427c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
428c1e08615SDag-Erling Smørgrav 		"RSA #3",
429206be79aSEd Maste 		0,
430c1e08615SDag-Erling Smørgrav 	} },
431c1e08615SDag-Erling Smørgrav 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
432c1e08615SDag-Erling Smørgrav 		NULL,
43320adc8f2SDag-Erling Smørgrav 		18,
434c1e08615SDag-Erling Smørgrav 		HKF_STATUS_COMMENT,
435c1e08615SDag-Erling Smørgrav 		0,
436c1e08615SDag-Erling Smørgrav 		"",
437c1e08615SDag-Erling Smørgrav 		MRK_NONE,
438c1e08615SDag-Erling Smørgrav 		NULL,
439c1e08615SDag-Erling Smørgrav 		NULL,
440c1e08615SDag-Erling Smørgrav 		KEY_UNSPEC,
441c1e08615SDag-Erling Smørgrav 		NULL,
442c1e08615SDag-Erling Smørgrav 		NULL,
443206be79aSEd Maste 		0,
444c1e08615SDag-Erling Smørgrav 	} },
445c1e08615SDag-Erling Smørgrav 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
446c1e08615SDag-Erling Smørgrav 		NULL,
44720adc8f2SDag-Erling Smørgrav 		19,
448c1e08615SDag-Erling Smørgrav 		HKF_STATUS_COMMENT,
449c1e08615SDag-Erling Smørgrav 		0,
450c1e08615SDag-Erling Smørgrav 		"# Hashed hostname and address entries",
451c1e08615SDag-Erling Smørgrav 		MRK_NONE,
452c1e08615SDag-Erling Smørgrav 		NULL,
453c1e08615SDag-Erling Smørgrav 		NULL,
454c1e08615SDag-Erling Smørgrav 		KEY_UNSPEC,
455c1e08615SDag-Erling Smørgrav 		NULL,
456c1e08615SDag-Erling Smørgrav 		NULL,
457206be79aSEd Maste 		0,
458c1e08615SDag-Erling Smørgrav 	} },
459c1e08615SDag-Erling Smørgrav 	{ "dsa_5.pub" , -1, -1, 0, HKF_MATCH_HOST|HKF_MATCH_HOST_HASHED, 0, 0, -1, {
460c1e08615SDag-Erling Smørgrav 		NULL,
46120adc8f2SDag-Erling Smørgrav 		20,
462c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
463c1e08615SDag-Erling Smørgrav 		0,
464c1e08615SDag-Erling Smørgrav 		NULL,
465c1e08615SDag-Erling Smørgrav 		MRK_NONE,
466c1e08615SDag-Erling Smørgrav 		NULL,
467c1e08615SDag-Erling Smørgrav 		NULL,
468c1e08615SDag-Erling Smørgrav 		KEY_DSA,
469c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
470c1e08615SDag-Erling Smørgrav 		"DSA #5",
471206be79aSEd Maste 		0,
472c1e08615SDag-Erling Smørgrav 	} },
473c1e08615SDag-Erling Smørgrav 	{ "ecdsa_5.pub" , -1, -1, 0, HKF_MATCH_HOST|HKF_MATCH_HOST_HASHED, 0, 0, -1, {
474c1e08615SDag-Erling Smørgrav 		NULL,
47520adc8f2SDag-Erling Smørgrav 		21,
476c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
477c1e08615SDag-Erling Smørgrav 		0,
478c1e08615SDag-Erling Smørgrav 		NULL,
479c1e08615SDag-Erling Smørgrav 		MRK_NONE,
480c1e08615SDag-Erling Smørgrav 		NULL,
481c1e08615SDag-Erling Smørgrav 		NULL,
482c1e08615SDag-Erling Smørgrav 		KEY_ECDSA,
483c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
484c1e08615SDag-Erling Smørgrav 		"ECDSA #5",
485206be79aSEd Maste 		0,
486c1e08615SDag-Erling Smørgrav 	} },
487c1e08615SDag-Erling Smørgrav 	{ "ed25519_5.pub" , -1, -1, 0, HKF_MATCH_HOST|HKF_MATCH_HOST_HASHED, 0, 0, -1, {
488c1e08615SDag-Erling Smørgrav 		NULL,
48920adc8f2SDag-Erling Smørgrav 		22,
490c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
491c1e08615SDag-Erling Smørgrav 		0,
492c1e08615SDag-Erling Smørgrav 		NULL,
493c1e08615SDag-Erling Smørgrav 		MRK_NONE,
494c1e08615SDag-Erling Smørgrav 		NULL,
495c1e08615SDag-Erling Smørgrav 		NULL,
496c1e08615SDag-Erling Smørgrav 		KEY_ED25519,
497c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
498c1e08615SDag-Erling Smørgrav 		"ED25519 #5",
499206be79aSEd Maste 		0,
500c1e08615SDag-Erling Smørgrav 	} },
501c1e08615SDag-Erling Smørgrav 	{ "rsa_5.pub" , -1, -1, 0, HKF_MATCH_HOST|HKF_MATCH_HOST_HASHED, 0, 0, -1, {
502c1e08615SDag-Erling Smørgrav 		NULL,
50320adc8f2SDag-Erling Smørgrav 		23,
504c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
505c1e08615SDag-Erling Smørgrav 		0,
506c1e08615SDag-Erling Smørgrav 		NULL,
507c1e08615SDag-Erling Smørgrav 		MRK_NONE,
508c1e08615SDag-Erling Smørgrav 		NULL,
509c1e08615SDag-Erling Smørgrav 		NULL,
510c1e08615SDag-Erling Smørgrav 		KEY_RSA,
511c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
512c1e08615SDag-Erling Smørgrav 		"RSA #5",
513206be79aSEd Maste 		0,
514c1e08615SDag-Erling Smørgrav 	} },
515c1e08615SDag-Erling Smørgrav 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
516c1e08615SDag-Erling Smørgrav 		NULL,
51720adc8f2SDag-Erling Smørgrav 		24,
518c1e08615SDag-Erling Smørgrav 		HKF_STATUS_COMMENT,
519c1e08615SDag-Erling Smørgrav 		0,
520c1e08615SDag-Erling Smørgrav 		"",
521c1e08615SDag-Erling Smørgrav 		MRK_NONE,
522c1e08615SDag-Erling Smørgrav 		NULL,
523c1e08615SDag-Erling Smørgrav 		NULL,
524c1e08615SDag-Erling Smørgrav 		KEY_UNSPEC,
525c1e08615SDag-Erling Smørgrav 		NULL,
526c1e08615SDag-Erling Smørgrav 		NULL,
527206be79aSEd Maste 		0,
528c1e08615SDag-Erling Smørgrav 	} },
529c1e08615SDag-Erling Smørgrav 	/*
530c1e08615SDag-Erling Smørgrav 	 * The next series have each key listed multiple times, as the
531c1e08615SDag-Erling Smørgrav 	 * hostname and addresses in the pre-hashed known_hosts are split
532c1e08615SDag-Erling Smørgrav 	 * to separate lines.
533c1e08615SDag-Erling Smørgrav 	 */
534c1e08615SDag-Erling Smørgrav 	{ "dsa_6.pub" , -1, -1, HKF_MATCH_HOST|HKF_MATCH_HOST_HASHED, 0, 0, 0, -1, {
535c1e08615SDag-Erling Smørgrav 		NULL,
53620adc8f2SDag-Erling Smørgrav 		25,
537c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
538c1e08615SDag-Erling Smørgrav 		0,
539c1e08615SDag-Erling Smørgrav 		NULL,
540c1e08615SDag-Erling Smørgrav 		MRK_NONE,
541c1e08615SDag-Erling Smørgrav 		NULL,
542c1e08615SDag-Erling Smørgrav 		NULL,
543c1e08615SDag-Erling Smørgrav 		KEY_DSA,
544c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
545c1e08615SDag-Erling Smørgrav 		"DSA #6",
546206be79aSEd Maste 		0,
547c1e08615SDag-Erling Smørgrav 	} },
548c1e08615SDag-Erling Smørgrav 	{ "dsa_6.pub" , -1, -1, 0, 0, HKF_MATCH_IP|HKF_MATCH_IP_HASHED, 0, -1, {
549c1e08615SDag-Erling Smørgrav 		NULL,
55020adc8f2SDag-Erling Smørgrav 		26,
551c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
552c1e08615SDag-Erling Smørgrav 		0,
553c1e08615SDag-Erling Smørgrav 		NULL,
554c1e08615SDag-Erling Smørgrav 		MRK_NONE,
555c1e08615SDag-Erling Smørgrav 		NULL,
556c1e08615SDag-Erling Smørgrav 		NULL,
557c1e08615SDag-Erling Smørgrav 		KEY_DSA,
558c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
559c1e08615SDag-Erling Smørgrav 		"DSA #6",
560206be79aSEd Maste 		0,
561c1e08615SDag-Erling Smørgrav 	} },
562c1e08615SDag-Erling Smørgrav 	{ "dsa_6.pub" , -1, -1, 0, 0, 0, HKF_MATCH_IP|HKF_MATCH_IP_HASHED, -1, {
563c1e08615SDag-Erling Smørgrav 		NULL,
56420adc8f2SDag-Erling Smørgrav 		27,
565c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
566c1e08615SDag-Erling Smørgrav 		0,
567c1e08615SDag-Erling Smørgrav 		NULL,
568c1e08615SDag-Erling Smørgrav 		MRK_NONE,
569c1e08615SDag-Erling Smørgrav 		NULL,
570c1e08615SDag-Erling Smørgrav 		NULL,
571c1e08615SDag-Erling Smørgrav 		KEY_DSA,
572c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
573c1e08615SDag-Erling Smørgrav 		"DSA #6",
574206be79aSEd Maste 		0,
575c1e08615SDag-Erling Smørgrav 	} },
576c1e08615SDag-Erling Smørgrav 	{ "ecdsa_6.pub" , -1, -1, HKF_MATCH_HOST|HKF_MATCH_HOST_HASHED, 0, 0, 0, -1, {
577c1e08615SDag-Erling Smørgrav 		NULL,
57820adc8f2SDag-Erling Smørgrav 		28,
579c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
580c1e08615SDag-Erling Smørgrav 		0,
581c1e08615SDag-Erling Smørgrav 		NULL,
582c1e08615SDag-Erling Smørgrav 		MRK_NONE,
583c1e08615SDag-Erling Smørgrav 		NULL,
584c1e08615SDag-Erling Smørgrav 		NULL,
585c1e08615SDag-Erling Smørgrav 		KEY_ECDSA,
586c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
587c1e08615SDag-Erling Smørgrav 		"ECDSA #6",
588206be79aSEd Maste 		0,
589c1e08615SDag-Erling Smørgrav 	} },
590c1e08615SDag-Erling Smørgrav 	{ "ecdsa_6.pub" , -1, -1, 0, 0, HKF_MATCH_IP|HKF_MATCH_IP_HASHED, 0, -1, {
591c1e08615SDag-Erling Smørgrav 		NULL,
59220adc8f2SDag-Erling Smørgrav 		29,
593c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
594c1e08615SDag-Erling Smørgrav 		0,
595c1e08615SDag-Erling Smørgrav 		NULL,
596c1e08615SDag-Erling Smørgrav 		MRK_NONE,
597c1e08615SDag-Erling Smørgrav 		NULL,
598c1e08615SDag-Erling Smørgrav 		NULL,
599c1e08615SDag-Erling Smørgrav 		KEY_ECDSA,
600c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
601c1e08615SDag-Erling Smørgrav 		"ECDSA #6",
602206be79aSEd Maste 		0,
603c1e08615SDag-Erling Smørgrav 	} },
604c1e08615SDag-Erling Smørgrav 	{ "ecdsa_6.pub" , -1, -1, 0, 0, 0, HKF_MATCH_IP|HKF_MATCH_IP_HASHED, -1, {
605c1e08615SDag-Erling Smørgrav 		NULL,
60620adc8f2SDag-Erling Smørgrav 		30,
607c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
608c1e08615SDag-Erling Smørgrav 		0,
609c1e08615SDag-Erling Smørgrav 		NULL,
610c1e08615SDag-Erling Smørgrav 		MRK_NONE,
611c1e08615SDag-Erling Smørgrav 		NULL,
612c1e08615SDag-Erling Smørgrav 		NULL,
613c1e08615SDag-Erling Smørgrav 		KEY_ECDSA,
614c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
615c1e08615SDag-Erling Smørgrav 		"ECDSA #6",
616206be79aSEd Maste 		0,
617c1e08615SDag-Erling Smørgrav 	} },
618c1e08615SDag-Erling Smørgrav 	{ "ed25519_6.pub" , -1, -1, HKF_MATCH_HOST|HKF_MATCH_HOST_HASHED, 0, 0, 0, -1, {
619c1e08615SDag-Erling Smørgrav 		NULL,
62020adc8f2SDag-Erling Smørgrav 		31,
621c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
622c1e08615SDag-Erling Smørgrav 		0,
623c1e08615SDag-Erling Smørgrav 		NULL,
624c1e08615SDag-Erling Smørgrav 		MRK_NONE,
625c1e08615SDag-Erling Smørgrav 		NULL,
626c1e08615SDag-Erling Smørgrav 		NULL,
627c1e08615SDag-Erling Smørgrav 		KEY_ED25519,
628c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
629c1e08615SDag-Erling Smørgrav 		"ED25519 #6",
630206be79aSEd Maste 		0,
631c1e08615SDag-Erling Smørgrav 	} },
632c1e08615SDag-Erling Smørgrav 	{ "ed25519_6.pub" , -1, -1, 0, 0, HKF_MATCH_IP|HKF_MATCH_IP_HASHED, 0, -1, {
633c1e08615SDag-Erling Smørgrav 		NULL,
63420adc8f2SDag-Erling Smørgrav 		32,
635c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
636c1e08615SDag-Erling Smørgrav 		0,
637c1e08615SDag-Erling Smørgrav 		NULL,
638c1e08615SDag-Erling Smørgrav 		MRK_NONE,
639c1e08615SDag-Erling Smørgrav 		NULL,
640c1e08615SDag-Erling Smørgrav 		NULL,
641c1e08615SDag-Erling Smørgrav 		KEY_ED25519,
642c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
643c1e08615SDag-Erling Smørgrav 		"ED25519 #6",
644206be79aSEd Maste 		0,
645c1e08615SDag-Erling Smørgrav 	} },
646c1e08615SDag-Erling Smørgrav 	{ "ed25519_6.pub" , -1, -1, 0, 0, 0, HKF_MATCH_IP|HKF_MATCH_IP_HASHED, -1, {
647c1e08615SDag-Erling Smørgrav 		NULL,
64820adc8f2SDag-Erling Smørgrav 		33,
649c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
650c1e08615SDag-Erling Smørgrav 		0,
651c1e08615SDag-Erling Smørgrav 		NULL,
652c1e08615SDag-Erling Smørgrav 		MRK_NONE,
653c1e08615SDag-Erling Smørgrav 		NULL,
654c1e08615SDag-Erling Smørgrav 		NULL,
655c1e08615SDag-Erling Smørgrav 		KEY_ED25519,
656c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
657c1e08615SDag-Erling Smørgrav 		"ED25519 #6",
658206be79aSEd Maste 		0,
659c1e08615SDag-Erling Smørgrav 	} },
660c1e08615SDag-Erling Smørgrav 	{ "rsa_6.pub" , -1, -1, HKF_MATCH_HOST|HKF_MATCH_HOST_HASHED, 0, 0, 0, -1, {
661c1e08615SDag-Erling Smørgrav 		NULL,
66220adc8f2SDag-Erling Smørgrav 		34,
663c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
664c1e08615SDag-Erling Smørgrav 		0,
665c1e08615SDag-Erling Smørgrav 		NULL,
666c1e08615SDag-Erling Smørgrav 		MRK_NONE,
667c1e08615SDag-Erling Smørgrav 		NULL,
668c1e08615SDag-Erling Smørgrav 		NULL,
669c1e08615SDag-Erling Smørgrav 		KEY_RSA,
670c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
671c1e08615SDag-Erling Smørgrav 		"RSA #6",
672206be79aSEd Maste 		0,
673c1e08615SDag-Erling Smørgrav 	} },
674c1e08615SDag-Erling Smørgrav 	{ "rsa_6.pub" , -1, -1, 0, 0, HKF_MATCH_IP|HKF_MATCH_IP_HASHED, 0, -1, {
675c1e08615SDag-Erling Smørgrav 		NULL,
67620adc8f2SDag-Erling Smørgrav 		35,
677c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
678c1e08615SDag-Erling Smørgrav 		0,
679c1e08615SDag-Erling Smørgrav 		NULL,
680c1e08615SDag-Erling Smørgrav 		MRK_NONE,
681c1e08615SDag-Erling Smørgrav 		NULL,
682c1e08615SDag-Erling Smørgrav 		NULL,
683c1e08615SDag-Erling Smørgrav 		KEY_RSA,
684c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
685c1e08615SDag-Erling Smørgrav 		"RSA #6",
686206be79aSEd Maste 		0,
687c1e08615SDag-Erling Smørgrav 	} },
688c1e08615SDag-Erling Smørgrav 	{ "rsa_6.pub" , -1, -1, 0, 0, 0, HKF_MATCH_IP|HKF_MATCH_IP_HASHED, -1, {
689c1e08615SDag-Erling Smørgrav 		NULL,
69020adc8f2SDag-Erling Smørgrav 		36,
691c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
692c1e08615SDag-Erling Smørgrav 		0,
693c1e08615SDag-Erling Smørgrav 		NULL,
694c1e08615SDag-Erling Smørgrav 		MRK_NONE,
695c1e08615SDag-Erling Smørgrav 		NULL,
696c1e08615SDag-Erling Smørgrav 		NULL,
697c1e08615SDag-Erling Smørgrav 		KEY_RSA,
698c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
699c1e08615SDag-Erling Smørgrav 		"RSA #6",
700206be79aSEd Maste 		0,
701c1e08615SDag-Erling Smørgrav 	} },
702c1e08615SDag-Erling Smørgrav 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
703c1e08615SDag-Erling Smørgrav 		NULL,
70420adc8f2SDag-Erling Smørgrav 		37,
705c1e08615SDag-Erling Smørgrav 		HKF_STATUS_COMMENT,
706c1e08615SDag-Erling Smørgrav 		0,
707c1e08615SDag-Erling Smørgrav 		"",
708c1e08615SDag-Erling Smørgrav 		MRK_NONE,
709c1e08615SDag-Erling Smørgrav 		NULL,
710c1e08615SDag-Erling Smørgrav 		NULL,
711c1e08615SDag-Erling Smørgrav 		KEY_UNSPEC,
712c1e08615SDag-Erling Smørgrav 		NULL,
713c1e08615SDag-Erling Smørgrav 		NULL,
714206be79aSEd Maste 		0,
715c1e08615SDag-Erling Smørgrav 	} },
716c1e08615SDag-Erling Smørgrav 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
717c1e08615SDag-Erling Smørgrav 		NULL,
71820adc8f2SDag-Erling Smørgrav 		38,
719c1e08615SDag-Erling Smørgrav 		HKF_STATUS_COMMENT,
720c1e08615SDag-Erling Smørgrav 		0,
721c1e08615SDag-Erling Smørgrav 		"",
722c1e08615SDag-Erling Smørgrav 		MRK_NONE,
723c1e08615SDag-Erling Smørgrav 		NULL,
724c1e08615SDag-Erling Smørgrav 		NULL,
725c1e08615SDag-Erling Smørgrav 		KEY_UNSPEC,
726c1e08615SDag-Erling Smørgrav 		NULL,
727c1e08615SDag-Erling Smørgrav 		NULL,
728206be79aSEd Maste 		0,
729c1e08615SDag-Erling Smørgrav 	} },
730c1e08615SDag-Erling Smørgrav 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
731c1e08615SDag-Erling Smørgrav 		NULL,
73220adc8f2SDag-Erling Smørgrav 		39,
733c1e08615SDag-Erling Smørgrav 		HKF_STATUS_COMMENT,
734c1e08615SDag-Erling Smørgrav 		0,
735c1e08615SDag-Erling Smørgrav 		"# Revoked and CA keys",
736c1e08615SDag-Erling Smørgrav 		MRK_NONE,
737c1e08615SDag-Erling Smørgrav 		NULL,
738c1e08615SDag-Erling Smørgrav 		NULL,
739c1e08615SDag-Erling Smørgrav 		KEY_UNSPEC,
740c1e08615SDag-Erling Smørgrav 		NULL,
741c1e08615SDag-Erling Smørgrav 		NULL,
742206be79aSEd Maste 		0,
743c1e08615SDag-Erling Smørgrav 	} },
744c1e08615SDag-Erling Smørgrav 	{ "ed25519_4.pub" , -1, -1, 0, HKF_MATCH_HOST, 0, 0, -1, {
745c1e08615SDag-Erling Smørgrav 		NULL,
74620adc8f2SDag-Erling Smørgrav 		40,
747c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
748c1e08615SDag-Erling Smørgrav 		0,
749c1e08615SDag-Erling Smørgrav 		NULL,
750c1e08615SDag-Erling Smørgrav 		MRK_REVOKE,
751c1e08615SDag-Erling Smørgrav 		"sisyphus.example.com",
752c1e08615SDag-Erling Smørgrav 		NULL,
753c1e08615SDag-Erling Smørgrav 		KEY_ED25519,
754c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
755c1e08615SDag-Erling Smørgrav 		"ED25519 #4",
756206be79aSEd Maste 		0,
757c1e08615SDag-Erling Smørgrav 	} },
758c1e08615SDag-Erling Smørgrav 	{ "ecdsa_4.pub" , -1, -1, HKF_MATCH_HOST, 0, 0, 0, -1, {
759c1e08615SDag-Erling Smørgrav 		NULL,
76020adc8f2SDag-Erling Smørgrav 		41,
761c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
762c1e08615SDag-Erling Smørgrav 		0,
763c1e08615SDag-Erling Smørgrav 		NULL,
764c1e08615SDag-Erling Smørgrav 		MRK_CA,
765c1e08615SDag-Erling Smørgrav 		"prometheus.example.com",
766c1e08615SDag-Erling Smørgrav 		NULL,
767c1e08615SDag-Erling Smørgrav 		KEY_ECDSA,
768c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
769c1e08615SDag-Erling Smørgrav 		"ECDSA #4",
770206be79aSEd Maste 		0,
771c1e08615SDag-Erling Smørgrav 	} },
772c1e08615SDag-Erling Smørgrav 	{ "dsa_4.pub" , -1, -1, HKF_MATCH_HOST, HKF_MATCH_HOST, 0, 0, -1, {
773c1e08615SDag-Erling Smørgrav 		NULL,
77420adc8f2SDag-Erling Smørgrav 		42,
775c1e08615SDag-Erling Smørgrav 		HKF_STATUS_OK,
776c1e08615SDag-Erling Smørgrav 		0,
777c1e08615SDag-Erling Smørgrav 		NULL,
778c1e08615SDag-Erling Smørgrav 		MRK_CA,
779c1e08615SDag-Erling Smørgrav 		"*.example.com",
780c1e08615SDag-Erling Smørgrav 		NULL,
781c1e08615SDag-Erling Smørgrav 		KEY_DSA,
782c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
783c1e08615SDag-Erling Smørgrav 		"DSA #4",
784206be79aSEd Maste 		0,
785c1e08615SDag-Erling Smørgrav 	} },
786c1e08615SDag-Erling Smørgrav 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
787c1e08615SDag-Erling Smørgrav 		NULL,
78820adc8f2SDag-Erling Smørgrav 		43,
789c1e08615SDag-Erling Smørgrav 		HKF_STATUS_COMMENT,
790c1e08615SDag-Erling Smørgrav 		0,
791c1e08615SDag-Erling Smørgrav 		"",
792c1e08615SDag-Erling Smørgrav 		MRK_NONE,
793c1e08615SDag-Erling Smørgrav 		NULL,
794c1e08615SDag-Erling Smørgrav 		NULL,
795c1e08615SDag-Erling Smørgrav 		KEY_UNSPEC,
796c1e08615SDag-Erling Smørgrav 		NULL,
797c1e08615SDag-Erling Smørgrav 		NULL,
798206be79aSEd Maste 		0,
799c1e08615SDag-Erling Smørgrav 	} },
800c1e08615SDag-Erling Smørgrav 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
801c1e08615SDag-Erling Smørgrav 		NULL,
80220adc8f2SDag-Erling Smørgrav 		44,
803c1e08615SDag-Erling Smørgrav 		HKF_STATUS_COMMENT,
804c1e08615SDag-Erling Smørgrav 		0,
805c1e08615SDag-Erling Smørgrav 		"# Some invalid lines",
806c1e08615SDag-Erling Smørgrav 		MRK_NONE,
807c1e08615SDag-Erling Smørgrav 		NULL,
808c1e08615SDag-Erling Smørgrav 		NULL,
809c1e08615SDag-Erling Smørgrav 		KEY_UNSPEC,
810c1e08615SDag-Erling Smørgrav 		NULL,
811c1e08615SDag-Erling Smørgrav 		NULL,
812206be79aSEd Maste 		0,
813c1e08615SDag-Erling Smørgrav 	} },
814c1e08615SDag-Erling Smørgrav 	{ NULL, -1, -1, 0, 0, 0, 0, -1, {
815c1e08615SDag-Erling Smørgrav 		NULL,
81620adc8f2SDag-Erling Smørgrav 		45,
817c1e08615SDag-Erling Smørgrav 		HKF_STATUS_INVALID,
818c1e08615SDag-Erling Smørgrav 		0,
819c1e08615SDag-Erling Smørgrav 		NULL,
820c1e08615SDag-Erling Smørgrav 		MRK_ERROR,
821c1e08615SDag-Erling Smørgrav 		NULL,
822c1e08615SDag-Erling Smørgrav 		NULL,
823c1e08615SDag-Erling Smørgrav 		KEY_UNSPEC,
824c1e08615SDag-Erling Smørgrav 		NULL,
825c1e08615SDag-Erling Smørgrav 		NULL,
826206be79aSEd Maste 		0,
827c1e08615SDag-Erling Smørgrav 	} },
828c1e08615SDag-Erling Smørgrav 	{ NULL, -1, -1, 0, HKF_MATCH_HOST, 0, 0, -1, {
829c1e08615SDag-Erling Smørgrav 		NULL,
83020adc8f2SDag-Erling Smørgrav 		46,
831c1e08615SDag-Erling Smørgrav 		HKF_STATUS_INVALID,
832c1e08615SDag-Erling Smørgrav 		0,
833c1e08615SDag-Erling Smørgrav 		NULL,
834c1e08615SDag-Erling Smørgrav 		MRK_NONE,
835c1e08615SDag-Erling Smørgrav 		"sisyphus.example.com",
836c1e08615SDag-Erling Smørgrav 		NULL,
837c1e08615SDag-Erling Smørgrav 		KEY_UNSPEC,
838c1e08615SDag-Erling Smørgrav 		NULL,
839c1e08615SDag-Erling Smørgrav 		NULL,
840206be79aSEd Maste 		0,
841c1e08615SDag-Erling Smørgrav 	} },
842c1e08615SDag-Erling Smørgrav 	{ NULL, -1, -1, HKF_MATCH_HOST, 0, 0, 0, -1, {
843c1e08615SDag-Erling Smørgrav 		NULL,
84420adc8f2SDag-Erling Smørgrav 		47,
845c1e08615SDag-Erling Smørgrav 		HKF_STATUS_INVALID,
846c1e08615SDag-Erling Smørgrav 		0,
847c1e08615SDag-Erling Smørgrav 		NULL,
848c1e08615SDag-Erling Smørgrav 		MRK_NONE,
849c1e08615SDag-Erling Smørgrav 		"prometheus.example.com",
850c1e08615SDag-Erling Smørgrav 		NULL,
851c1e08615SDag-Erling Smørgrav 		KEY_UNSPEC,
852c1e08615SDag-Erling Smørgrav 		NULL,
853c1e08615SDag-Erling Smørgrav 		NULL,
854206be79aSEd Maste 		0,
855c1e08615SDag-Erling Smørgrav 	} },
856c1e08615SDag-Erling Smørgrav 	{ NULL, -1, -1, 0, HKF_MATCH_HOST, 0, 0, -1, {
857c1e08615SDag-Erling Smørgrav 		NULL,
85820adc8f2SDag-Erling Smørgrav 		48,
859c1e08615SDag-Erling Smørgrav 		HKF_STATUS_INVALID,	/* Would be ok if key not parsed */
860c1e08615SDag-Erling Smørgrav 		0,
861c1e08615SDag-Erling Smørgrav 		NULL,
862c1e08615SDag-Erling Smørgrav 		MRK_NONE,
863c1e08615SDag-Erling Smørgrav 		"sisyphus.example.com",
864c1e08615SDag-Erling Smørgrav 		NULL,
865c1e08615SDag-Erling Smørgrav 		KEY_UNSPEC,
866c1e08615SDag-Erling Smørgrav 		NULL,
867c1e08615SDag-Erling Smørgrav 		NULL,
868206be79aSEd Maste 		0,
869c1e08615SDag-Erling Smørgrav 	} },
870c1e08615SDag-Erling Smørgrav 	{ NULL, -1, -1, 0, HKF_MATCH_HOST, 0, 0, -1, {
871c1e08615SDag-Erling Smørgrav 		NULL,
87220adc8f2SDag-Erling Smørgrav 		49,
873c1e08615SDag-Erling Smørgrav 		HKF_STATUS_INVALID,
874c1e08615SDag-Erling Smørgrav 		0,
875c1e08615SDag-Erling Smørgrav 		NULL,
876c1e08615SDag-Erling Smørgrav 		MRK_NONE,
877c1e08615SDag-Erling Smørgrav 		"sisyphus.example.com",
878c1e08615SDag-Erling Smørgrav 		NULL,
879c1e08615SDag-Erling Smørgrav 		KEY_UNSPEC,
880c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
881c1e08615SDag-Erling Smørgrav 		NULL,
882206be79aSEd Maste 		0,
883c1e08615SDag-Erling Smørgrav 	} },
884c1e08615SDag-Erling Smørgrav 	{ NULL, HKF_STATUS_OK, KEY_RSA, HKF_MATCH_HOST, 0, 0, 0, -1, {
885c1e08615SDag-Erling Smørgrav 		NULL,
88620adc8f2SDag-Erling Smørgrav 		50,
887c1e08615SDag-Erling Smørgrav 		HKF_STATUS_INVALID,	/* Would be ok if key not parsed */
888c1e08615SDag-Erling Smørgrav 		0,
889c1e08615SDag-Erling Smørgrav 		NULL,
890c1e08615SDag-Erling Smørgrav 		MRK_NONE,
891c1e08615SDag-Erling Smørgrav 		"prometheus.example.com",
892c1e08615SDag-Erling Smørgrav 		NULL,
893c1e08615SDag-Erling Smørgrav 		KEY_UNSPEC,
894c1e08615SDag-Erling Smørgrav 		NULL,	/* filled at runtime */
895c1e08615SDag-Erling Smørgrav 		NULL,
896206be79aSEd Maste 		0,
897c1e08615SDag-Erling Smørgrav 	} },
898c1e08615SDag-Erling Smørgrav };
899c1e08615SDag-Erling Smørgrav 
900c1e08615SDag-Erling Smørgrav void test_iterate(void);
901c1e08615SDag-Erling Smørgrav 
902c1e08615SDag-Erling Smørgrav void
test_iterate(void)903c1e08615SDag-Erling Smørgrav test_iterate(void)
904c1e08615SDag-Erling Smørgrav {
905c1e08615SDag-Erling Smørgrav 	struct cbctx ctx;
906c1e08615SDag-Erling Smørgrav 
907c1e08615SDag-Erling Smørgrav 	TEST_START("hostkeys_iterate all with key parse");
908c1e08615SDag-Erling Smørgrav 	memset(&ctx, 0, sizeof(ctx));
909c1e08615SDag-Erling Smørgrav 	ctx.expected = expected_full;
910c1e08615SDag-Erling Smørgrav 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
911c1e08615SDag-Erling Smørgrav 	ctx.flags = HKF_WANT_PARSE_KEY;
912c1e08615SDag-Erling Smørgrav 	prepare_expected(expected_full, ctx.nexpected);
913c1e08615SDag-Erling Smørgrav 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
914206be79aSEd Maste 	    check, &ctx, NULL, NULL, ctx.flags, 0), 0);
915d46065dfSDag-Erling Smørgrav 	cleanup_expected(expected_full, ctx.nexpected);
916c1e08615SDag-Erling Smørgrav 	TEST_DONE();
917c1e08615SDag-Erling Smørgrav 
918c1e08615SDag-Erling Smørgrav 	TEST_START("hostkeys_iterate all without key parse");
919c1e08615SDag-Erling Smørgrav 	memset(&ctx, 0, sizeof(ctx));
920c1e08615SDag-Erling Smørgrav 	ctx.expected = expected_full;
921c1e08615SDag-Erling Smørgrav 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
922c1e08615SDag-Erling Smørgrav 	ctx.flags = 0;
923c1e08615SDag-Erling Smørgrav 	prepare_expected(expected_full, ctx.nexpected);
924c1e08615SDag-Erling Smørgrav 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
925206be79aSEd Maste 	    check, &ctx, NULL, NULL, ctx.flags, 0), 0);
926d46065dfSDag-Erling Smørgrav 	cleanup_expected(expected_full, ctx.nexpected);
927c1e08615SDag-Erling Smørgrav 	TEST_DONE();
928c1e08615SDag-Erling Smørgrav 
929c1e08615SDag-Erling Smørgrav 	TEST_START("hostkeys_iterate specify host 1");
930c1e08615SDag-Erling Smørgrav 	memset(&ctx, 0, sizeof(ctx));
931c1e08615SDag-Erling Smørgrav 	ctx.expected = expected_full;
932c1e08615SDag-Erling Smørgrav 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
933c1e08615SDag-Erling Smørgrav 	ctx.flags = 0;
934c1e08615SDag-Erling Smørgrav 	ctx.match_host_p = 1;
935c1e08615SDag-Erling Smørgrav 	prepare_expected(expected_full, ctx.nexpected);
936c1e08615SDag-Erling Smørgrav 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
937206be79aSEd Maste 	    check, &ctx, "prometheus.example.com", NULL, ctx.flags, 0), 0);
938d46065dfSDag-Erling Smørgrav 	cleanup_expected(expected_full, ctx.nexpected);
939c1e08615SDag-Erling Smørgrav 	TEST_DONE();
940c1e08615SDag-Erling Smørgrav 
941c1e08615SDag-Erling Smørgrav 	TEST_START("hostkeys_iterate specify host 2");
942c1e08615SDag-Erling Smørgrav 	memset(&ctx, 0, sizeof(ctx));
943c1e08615SDag-Erling Smørgrav 	ctx.expected = expected_full;
944c1e08615SDag-Erling Smørgrav 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
945c1e08615SDag-Erling Smørgrav 	ctx.flags = 0;
946c1e08615SDag-Erling Smørgrav 	ctx.match_host_s = 1;
947c1e08615SDag-Erling Smørgrav 	prepare_expected(expected_full, ctx.nexpected);
948c1e08615SDag-Erling Smørgrav 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
949206be79aSEd Maste 	    check, &ctx, "sisyphus.example.com", NULL, ctx.flags, 0), 0);
950d46065dfSDag-Erling Smørgrav 	cleanup_expected(expected_full, ctx.nexpected);
951c1e08615SDag-Erling Smørgrav 	TEST_DONE();
952c1e08615SDag-Erling Smørgrav 
953c1e08615SDag-Erling Smørgrav 	TEST_START("hostkeys_iterate match host 1");
954c1e08615SDag-Erling Smørgrav 	memset(&ctx, 0, sizeof(ctx));
955c1e08615SDag-Erling Smørgrav 	ctx.expected = expected_full;
956c1e08615SDag-Erling Smørgrav 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
957c1e08615SDag-Erling Smørgrav 	ctx.flags = HKF_WANT_MATCH;
958c1e08615SDag-Erling Smørgrav 	ctx.match_host_p = 1;
959c1e08615SDag-Erling Smørgrav 	prepare_expected(expected_full, ctx.nexpected);
960c1e08615SDag-Erling Smørgrav 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
961206be79aSEd Maste 	    check, &ctx, "prometheus.example.com", NULL, ctx.flags, 0), 0);
962d46065dfSDag-Erling Smørgrav 	cleanup_expected(expected_full, ctx.nexpected);
963c1e08615SDag-Erling Smørgrav 	TEST_DONE();
964c1e08615SDag-Erling Smørgrav 
965c1e08615SDag-Erling Smørgrav 	TEST_START("hostkeys_iterate match host 2");
966c1e08615SDag-Erling Smørgrav 	memset(&ctx, 0, sizeof(ctx));
967c1e08615SDag-Erling Smørgrav 	ctx.expected = expected_full;
968c1e08615SDag-Erling Smørgrav 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
969c1e08615SDag-Erling Smørgrav 	ctx.flags = HKF_WANT_MATCH;
970c1e08615SDag-Erling Smørgrav 	ctx.match_host_s = 1;
971c1e08615SDag-Erling Smørgrav 	prepare_expected(expected_full, ctx.nexpected);
972c1e08615SDag-Erling Smørgrav 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
973206be79aSEd Maste 	    check, &ctx, "sisyphus.example.com", NULL, ctx.flags, 0), 0);
974d46065dfSDag-Erling Smørgrav 	cleanup_expected(expected_full, ctx.nexpected);
975c1e08615SDag-Erling Smørgrav 	TEST_DONE();
976c1e08615SDag-Erling Smørgrav 
977c1e08615SDag-Erling Smørgrav 	TEST_START("hostkeys_iterate specify host missing");
978c1e08615SDag-Erling Smørgrav 	memset(&ctx, 0, sizeof(ctx));
979c1e08615SDag-Erling Smørgrav 	ctx.expected = expected_full;
980c1e08615SDag-Erling Smørgrav 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
981c1e08615SDag-Erling Smørgrav 	ctx.flags = 0;
982c1e08615SDag-Erling Smørgrav 	prepare_expected(expected_full, ctx.nexpected);
983c1e08615SDag-Erling Smørgrav 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
984206be79aSEd Maste 	    check, &ctx, "actaeon.example.org", NULL, ctx.flags, 0), 0);
985d46065dfSDag-Erling Smørgrav 	cleanup_expected(expected_full, ctx.nexpected);
986c1e08615SDag-Erling Smørgrav 	TEST_DONE();
987c1e08615SDag-Erling Smørgrav 
988c1e08615SDag-Erling Smørgrav 	TEST_START("hostkeys_iterate match host missing");
989c1e08615SDag-Erling Smørgrav 	memset(&ctx, 0, sizeof(ctx));
990c1e08615SDag-Erling Smørgrav 	ctx.expected = expected_full;
991c1e08615SDag-Erling Smørgrav 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
992c1e08615SDag-Erling Smørgrav 	ctx.flags = HKF_WANT_MATCH;
993c1e08615SDag-Erling Smørgrav 	prepare_expected(expected_full, ctx.nexpected);
994c1e08615SDag-Erling Smørgrav 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
995206be79aSEd Maste 	    check, &ctx, "actaeon.example.org", NULL, ctx.flags, 0), 0);
996d46065dfSDag-Erling Smørgrav 	cleanup_expected(expected_full, ctx.nexpected);
997c1e08615SDag-Erling Smørgrav 	TEST_DONE();
998c1e08615SDag-Erling Smørgrav 
999c1e08615SDag-Erling Smørgrav 	TEST_START("hostkeys_iterate specify IPv4");
1000c1e08615SDag-Erling Smørgrav 	memset(&ctx, 0, sizeof(ctx));
1001c1e08615SDag-Erling Smørgrav 	ctx.expected = expected_full;
1002c1e08615SDag-Erling Smørgrav 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
1003c1e08615SDag-Erling Smørgrav 	ctx.flags = 0;
1004c1e08615SDag-Erling Smørgrav 	ctx.match_ipv4 = 1;
1005c1e08615SDag-Erling Smørgrav 	prepare_expected(expected_full, ctx.nexpected);
1006c1e08615SDag-Erling Smørgrav 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
1007206be79aSEd Maste 	    check, &ctx, "tiresias.example.org", "192.0.2.1", ctx.flags, 0), 0);
1008d46065dfSDag-Erling Smørgrav 	cleanup_expected(expected_full, ctx.nexpected);
1009c1e08615SDag-Erling Smørgrav 	TEST_DONE();
1010c1e08615SDag-Erling Smørgrav 
1011c1e08615SDag-Erling Smørgrav 	TEST_START("hostkeys_iterate specify IPv6");
1012c1e08615SDag-Erling Smørgrav 	memset(&ctx, 0, sizeof(ctx));
1013c1e08615SDag-Erling Smørgrav 	ctx.expected = expected_full;
1014c1e08615SDag-Erling Smørgrav 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
1015c1e08615SDag-Erling Smørgrav 	ctx.flags = 0;
1016c1e08615SDag-Erling Smørgrav 	ctx.match_ipv6 = 1;
1017c1e08615SDag-Erling Smørgrav 	prepare_expected(expected_full, ctx.nexpected);
1018c1e08615SDag-Erling Smørgrav 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
1019206be79aSEd Maste 	    check, &ctx, "tiresias.example.org", "2001:db8::1",
1020206be79aSEd Maste 	    ctx.flags, 0), 0);
1021d46065dfSDag-Erling Smørgrav 	cleanup_expected(expected_full, ctx.nexpected);
1022c1e08615SDag-Erling Smørgrav 	TEST_DONE();
1023c1e08615SDag-Erling Smørgrav 
1024c1e08615SDag-Erling Smørgrav 	TEST_START("hostkeys_iterate match IPv4");
1025c1e08615SDag-Erling Smørgrav 	memset(&ctx, 0, sizeof(ctx));
1026c1e08615SDag-Erling Smørgrav 	ctx.expected = expected_full;
1027c1e08615SDag-Erling Smørgrav 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
1028c1e08615SDag-Erling Smørgrav 	ctx.flags = HKF_WANT_MATCH;
1029c1e08615SDag-Erling Smørgrav 	ctx.match_ipv4 = 1;
1030c1e08615SDag-Erling Smørgrav 	prepare_expected(expected_full, ctx.nexpected);
1031c1e08615SDag-Erling Smørgrav 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
1032206be79aSEd Maste 	    check, &ctx, "tiresias.example.org", "192.0.2.1", ctx.flags, 0), 0);
1033d46065dfSDag-Erling Smørgrav 	cleanup_expected(expected_full, ctx.nexpected);
1034c1e08615SDag-Erling Smørgrav 	TEST_DONE();
1035c1e08615SDag-Erling Smørgrav 
1036c1e08615SDag-Erling Smørgrav 	TEST_START("hostkeys_iterate match IPv6");
1037c1e08615SDag-Erling Smørgrav 	memset(&ctx, 0, sizeof(ctx));
1038c1e08615SDag-Erling Smørgrav 	ctx.expected = expected_full;
1039c1e08615SDag-Erling Smørgrav 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
1040c1e08615SDag-Erling Smørgrav 	ctx.flags = HKF_WANT_MATCH;
1041c1e08615SDag-Erling Smørgrav 	ctx.match_ipv6 = 1;
1042c1e08615SDag-Erling Smørgrav 	prepare_expected(expected_full, ctx.nexpected);
1043c1e08615SDag-Erling Smørgrav 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
1044206be79aSEd Maste 	    check, &ctx, "tiresias.example.org", "2001:db8::1",
1045206be79aSEd Maste 	    ctx.flags, 0), 0);
1046d46065dfSDag-Erling Smørgrav 	cleanup_expected(expected_full, ctx.nexpected);
1047c1e08615SDag-Erling Smørgrav 	TEST_DONE();
1048c1e08615SDag-Erling Smørgrav 
1049c1e08615SDag-Erling Smørgrav 	TEST_START("hostkeys_iterate specify addr missing");
1050c1e08615SDag-Erling Smørgrav 	memset(&ctx, 0, sizeof(ctx));
1051c1e08615SDag-Erling Smørgrav 	ctx.expected = expected_full;
1052c1e08615SDag-Erling Smørgrav 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
1053c1e08615SDag-Erling Smørgrav 	ctx.flags = 0;
1054c1e08615SDag-Erling Smørgrav 	prepare_expected(expected_full, ctx.nexpected);
1055c1e08615SDag-Erling Smørgrav 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
1056206be79aSEd Maste 	    check, &ctx, "tiresias.example.org", "192.168.0.1",
1057206be79aSEd Maste 	    ctx.flags, 0), 0);
1058d46065dfSDag-Erling Smørgrav 	cleanup_expected(expected_full, ctx.nexpected);
1059c1e08615SDag-Erling Smørgrav 	TEST_DONE();
1060c1e08615SDag-Erling Smørgrav 
1061c1e08615SDag-Erling Smørgrav 	TEST_START("hostkeys_iterate match addr missing");
1062c1e08615SDag-Erling Smørgrav 	memset(&ctx, 0, sizeof(ctx));
1063c1e08615SDag-Erling Smørgrav 	ctx.expected = expected_full;
1064c1e08615SDag-Erling Smørgrav 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
1065c1e08615SDag-Erling Smørgrav 	ctx.flags = HKF_WANT_MATCH;
1066c1e08615SDag-Erling Smørgrav 	prepare_expected(expected_full, ctx.nexpected);
1067c1e08615SDag-Erling Smørgrav 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
1068206be79aSEd Maste 	    check, &ctx, "tiresias.example.org", "::1", ctx.flags, 0), 0);
1069d46065dfSDag-Erling Smørgrav 	cleanup_expected(expected_full, ctx.nexpected);
1070c1e08615SDag-Erling Smørgrav 	TEST_DONE();
1071c1e08615SDag-Erling Smørgrav 
1072c1e08615SDag-Erling Smørgrav 	TEST_START("hostkeys_iterate specify host 2 and IPv4");
1073c1e08615SDag-Erling Smørgrav 	memset(&ctx, 0, sizeof(ctx));
1074c1e08615SDag-Erling Smørgrav 	ctx.expected = expected_full;
1075c1e08615SDag-Erling Smørgrav 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
1076c1e08615SDag-Erling Smørgrav 	ctx.flags = 0;
1077c1e08615SDag-Erling Smørgrav 	ctx.match_host_s = 1;
1078c1e08615SDag-Erling Smørgrav 	ctx.match_ipv4 = 1;
1079c1e08615SDag-Erling Smørgrav 	prepare_expected(expected_full, ctx.nexpected);
1080c1e08615SDag-Erling Smørgrav 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
1081206be79aSEd Maste 	    check, &ctx, "sisyphus.example.com", "192.0.2.1", ctx.flags, 0), 0);
1082d46065dfSDag-Erling Smørgrav 	cleanup_expected(expected_full, ctx.nexpected);
1083c1e08615SDag-Erling Smørgrav 	TEST_DONE();
1084c1e08615SDag-Erling Smørgrav 
1085c1e08615SDag-Erling Smørgrav 	TEST_START("hostkeys_iterate match host 1 and IPv6");
1086c1e08615SDag-Erling Smørgrav 	memset(&ctx, 0, sizeof(ctx));
1087c1e08615SDag-Erling Smørgrav 	ctx.expected = expected_full;
1088c1e08615SDag-Erling Smørgrav 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
1089c1e08615SDag-Erling Smørgrav 	ctx.flags = HKF_WANT_MATCH;
1090c1e08615SDag-Erling Smørgrav 	ctx.match_host_p = 1;
1091c1e08615SDag-Erling Smørgrav 	ctx.match_ipv6 = 1;
1092c1e08615SDag-Erling Smørgrav 	prepare_expected(expected_full, ctx.nexpected);
1093c1e08615SDag-Erling Smørgrav 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
1094d46065dfSDag-Erling Smørgrav 	    check, &ctx, "prometheus.example.com",
1095206be79aSEd Maste 	    "2001:db8::1", ctx.flags, 0), 0);
1096d46065dfSDag-Erling Smørgrav 	cleanup_expected(expected_full, ctx.nexpected);
1097c1e08615SDag-Erling Smørgrav 	TEST_DONE();
1098c1e08615SDag-Erling Smørgrav 
1099c1e08615SDag-Erling Smørgrav 	TEST_START("hostkeys_iterate specify host 2 and IPv4 w/ key parse");
1100c1e08615SDag-Erling Smørgrav 	memset(&ctx, 0, sizeof(ctx));
1101c1e08615SDag-Erling Smørgrav 	ctx.expected = expected_full;
1102c1e08615SDag-Erling Smørgrav 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
1103c1e08615SDag-Erling Smørgrav 	ctx.flags = HKF_WANT_PARSE_KEY;
1104c1e08615SDag-Erling Smørgrav 	ctx.match_host_s = 1;
1105c1e08615SDag-Erling Smørgrav 	ctx.match_ipv4 = 1;
1106c1e08615SDag-Erling Smørgrav 	prepare_expected(expected_full, ctx.nexpected);
1107c1e08615SDag-Erling Smørgrav 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
1108206be79aSEd Maste 	    check, &ctx, "sisyphus.example.com", "192.0.2.1", ctx.flags, 0), 0);
1109d46065dfSDag-Erling Smørgrav 	cleanup_expected(expected_full, ctx.nexpected);
1110c1e08615SDag-Erling Smørgrav 	TEST_DONE();
1111c1e08615SDag-Erling Smørgrav 
1112c1e08615SDag-Erling Smørgrav 	TEST_START("hostkeys_iterate match host 1 and IPv6 w/ key parse");
1113c1e08615SDag-Erling Smørgrav 	memset(&ctx, 0, sizeof(ctx));
1114c1e08615SDag-Erling Smørgrav 	ctx.expected = expected_full;
1115c1e08615SDag-Erling Smørgrav 	ctx.nexpected = sizeof(expected_full)/sizeof(*expected_full);
1116c1e08615SDag-Erling Smørgrav 	ctx.flags = HKF_WANT_MATCH|HKF_WANT_PARSE_KEY;
1117c1e08615SDag-Erling Smørgrav 	ctx.match_host_p = 1;
1118c1e08615SDag-Erling Smørgrav 	ctx.match_ipv6 = 1;
1119c1e08615SDag-Erling Smørgrav 	prepare_expected(expected_full, ctx.nexpected);
1120c1e08615SDag-Erling Smørgrav 	ASSERT_INT_EQ(hostkeys_foreach(test_data_file("known_hosts"),
1121d46065dfSDag-Erling Smørgrav 	    check, &ctx, "prometheus.example.com",
1122206be79aSEd Maste 	    "2001:db8::1", ctx.flags, 0), 0);
1123d46065dfSDag-Erling Smørgrav 	cleanup_expected(expected_full, ctx.nexpected);
1124c1e08615SDag-Erling Smørgrav 	TEST_DONE();
1125c1e08615SDag-Erling Smørgrav }
1126c1e08615SDag-Erling Smørgrav 
1127