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