xref: /freebsd-src/crypto/openssh/regress/unittests/authopt/tests.c (revision 1323ec571215a77ddd21294f0871979d5ad6b992)
1*1323ec57SEd Maste /* 	$OpenBSD: tests.c,v 1.3 2021/12/14 21:25:27 deraadt Exp $ */
247dd1d1bSDag-Erling Smørgrav 
347dd1d1bSDag-Erling Smørgrav /*
447dd1d1bSDag-Erling Smørgrav  * Regress test for keys options functions.
547dd1d1bSDag-Erling Smørgrav  *
647dd1d1bSDag-Erling Smørgrav  * Placed in the public domain
747dd1d1bSDag-Erling Smørgrav  */
847dd1d1bSDag-Erling Smørgrav 
919261079SEd Maste #include "includes.h"
1019261079SEd Maste 
1147dd1d1bSDag-Erling Smørgrav #include <sys/types.h>
1247dd1d1bSDag-Erling Smørgrav #include <stdio.h>
1319261079SEd Maste #ifdef HAVE_STDINT_H
1447dd1d1bSDag-Erling Smørgrav #include <stdint.h>
1519261079SEd Maste #endif
1647dd1d1bSDag-Erling Smørgrav #include <stdlib.h>
1747dd1d1bSDag-Erling Smørgrav #include <string.h>
1847dd1d1bSDag-Erling Smørgrav 
1919261079SEd Maste #include "../test_helper/test_helper.h"
2047dd1d1bSDag-Erling Smørgrav 
2147dd1d1bSDag-Erling Smørgrav #include "sshkey.h"
2247dd1d1bSDag-Erling Smørgrav #include "authfile.h"
2347dd1d1bSDag-Erling Smørgrav #include "auth-options.h"
2447dd1d1bSDag-Erling Smørgrav #include "misc.h"
2547dd1d1bSDag-Erling Smørgrav #include "log.h"
2647dd1d1bSDag-Erling Smørgrav 
2747dd1d1bSDag-Erling Smørgrav static struct sshkey *
load_key(const char * name)2847dd1d1bSDag-Erling Smørgrav load_key(const char *name)
2947dd1d1bSDag-Erling Smørgrav {
3047dd1d1bSDag-Erling Smørgrav 	struct sshkey *ret;
3147dd1d1bSDag-Erling Smørgrav 	int r;
3247dd1d1bSDag-Erling Smørgrav 
3347dd1d1bSDag-Erling Smørgrav 	r = sshkey_load_public(test_data_file(name), &ret, NULL);
3447dd1d1bSDag-Erling Smørgrav 	ASSERT_INT_EQ(r, 0);
3547dd1d1bSDag-Erling Smørgrav 	ASSERT_PTR_NE(ret, NULL);
3647dd1d1bSDag-Erling Smørgrav 	return ret;
3747dd1d1bSDag-Erling Smørgrav }
3847dd1d1bSDag-Erling Smørgrav 
3947dd1d1bSDag-Erling Smørgrav static struct sshauthopt *
default_authkey_opts(void)4047dd1d1bSDag-Erling Smørgrav default_authkey_opts(void)
4147dd1d1bSDag-Erling Smørgrav {
4247dd1d1bSDag-Erling Smørgrav 	struct sshauthopt *ret = sshauthopt_new();
4347dd1d1bSDag-Erling Smørgrav 
4447dd1d1bSDag-Erling Smørgrav 	ASSERT_PTR_NE(ret, NULL);
4547dd1d1bSDag-Erling Smørgrav 	ret->permit_port_forwarding_flag = 1;
4647dd1d1bSDag-Erling Smørgrav 	ret->permit_agent_forwarding_flag = 1;
4747dd1d1bSDag-Erling Smørgrav 	ret->permit_x11_forwarding_flag = 1;
4847dd1d1bSDag-Erling Smørgrav 	ret->permit_pty_flag = 1;
4947dd1d1bSDag-Erling Smørgrav 	ret->permit_user_rc = 1;
5047dd1d1bSDag-Erling Smørgrav 	return ret;
5147dd1d1bSDag-Erling Smørgrav }
5247dd1d1bSDag-Erling Smørgrav 
5347dd1d1bSDag-Erling Smørgrav static struct sshauthopt *
default_authkey_restrict_opts(void)5447dd1d1bSDag-Erling Smørgrav default_authkey_restrict_opts(void)
5547dd1d1bSDag-Erling Smørgrav {
5647dd1d1bSDag-Erling Smørgrav 	struct sshauthopt *ret = sshauthopt_new();
5747dd1d1bSDag-Erling Smørgrav 
5847dd1d1bSDag-Erling Smørgrav 	ASSERT_PTR_NE(ret, NULL);
5947dd1d1bSDag-Erling Smørgrav 	ret->permit_port_forwarding_flag = 0;
6047dd1d1bSDag-Erling Smørgrav 	ret->permit_agent_forwarding_flag = 0;
6147dd1d1bSDag-Erling Smørgrav 	ret->permit_x11_forwarding_flag = 0;
6247dd1d1bSDag-Erling Smørgrav 	ret->permit_pty_flag = 0;
6347dd1d1bSDag-Erling Smørgrav 	ret->permit_user_rc = 0;
6447dd1d1bSDag-Erling Smørgrav 	ret->restricted = 1;
6547dd1d1bSDag-Erling Smørgrav 	return ret;
6647dd1d1bSDag-Erling Smørgrav }
6747dd1d1bSDag-Erling Smørgrav 
6847dd1d1bSDag-Erling Smørgrav static char **
commasplit(const char * s,size_t * np)6947dd1d1bSDag-Erling Smørgrav commasplit(const char *s, size_t *np)
7047dd1d1bSDag-Erling Smørgrav {
7147dd1d1bSDag-Erling Smørgrav 	char *ocp, *cp, *cp2, **ret = NULL;
7247dd1d1bSDag-Erling Smørgrav 	size_t n;
7347dd1d1bSDag-Erling Smørgrav 
7447dd1d1bSDag-Erling Smørgrav 	ocp = cp = strdup(s);
7547dd1d1bSDag-Erling Smørgrav 	ASSERT_PTR_NE(cp, NULL);
7647dd1d1bSDag-Erling Smørgrav 	for (n = 0; (cp2 = strsep(&cp, ",")) != NULL;) {
7747dd1d1bSDag-Erling Smørgrav 		ret = recallocarray(ret, n, n + 1, sizeof(*ret));
7847dd1d1bSDag-Erling Smørgrav 		ASSERT_PTR_NE(ret, NULL);
7947dd1d1bSDag-Erling Smørgrav 		cp2 = strdup(cp2);
8047dd1d1bSDag-Erling Smørgrav 		ASSERT_PTR_NE(cp2, NULL);
8147dd1d1bSDag-Erling Smørgrav 		ret[n++] = cp2;
8247dd1d1bSDag-Erling Smørgrav 	}
8347dd1d1bSDag-Erling Smørgrav 	free(ocp);
8447dd1d1bSDag-Erling Smørgrav 	*np = n;
8547dd1d1bSDag-Erling Smørgrav 	return ret;
8647dd1d1bSDag-Erling Smørgrav }
8747dd1d1bSDag-Erling Smørgrav 
8847dd1d1bSDag-Erling Smørgrav static void
compare_opts(const struct sshauthopt * opts,const struct sshauthopt * expected)8947dd1d1bSDag-Erling Smørgrav compare_opts(const struct sshauthopt *opts,
9047dd1d1bSDag-Erling Smørgrav     const struct sshauthopt *expected)
9147dd1d1bSDag-Erling Smørgrav {
9247dd1d1bSDag-Erling Smørgrav 	size_t i;
9347dd1d1bSDag-Erling Smørgrav 
9447dd1d1bSDag-Erling Smørgrav 	ASSERT_PTR_NE(opts, NULL);
9547dd1d1bSDag-Erling Smørgrav 	ASSERT_PTR_NE(expected, NULL);
9647dd1d1bSDag-Erling Smørgrav 	ASSERT_PTR_NE(expected, opts); /* bozo :) */
9747dd1d1bSDag-Erling Smørgrav 
9847dd1d1bSDag-Erling Smørgrav #define FLAG_EQ(x) ASSERT_INT_EQ(opts->x, expected->x)
9947dd1d1bSDag-Erling Smørgrav 	FLAG_EQ(permit_port_forwarding_flag);
10047dd1d1bSDag-Erling Smørgrav 	FLAG_EQ(permit_agent_forwarding_flag);
10147dd1d1bSDag-Erling Smørgrav 	FLAG_EQ(permit_x11_forwarding_flag);
10247dd1d1bSDag-Erling Smørgrav 	FLAG_EQ(permit_pty_flag);
10347dd1d1bSDag-Erling Smørgrav 	FLAG_EQ(permit_user_rc);
10447dd1d1bSDag-Erling Smørgrav 	FLAG_EQ(restricted);
10547dd1d1bSDag-Erling Smørgrav 	FLAG_EQ(cert_authority);
10647dd1d1bSDag-Erling Smørgrav #undef FLAG_EQ
10747dd1d1bSDag-Erling Smørgrav 
10847dd1d1bSDag-Erling Smørgrav #define STR_EQ(x) \
10947dd1d1bSDag-Erling Smørgrav 	do { \
11047dd1d1bSDag-Erling Smørgrav 		if (expected->x == NULL) \
11147dd1d1bSDag-Erling Smørgrav 			ASSERT_PTR_EQ(opts->x, expected->x); \
11247dd1d1bSDag-Erling Smørgrav 		else \
11347dd1d1bSDag-Erling Smørgrav 			ASSERT_STRING_EQ(opts->x, expected->x); \
11447dd1d1bSDag-Erling Smørgrav 	} while (0)
11547dd1d1bSDag-Erling Smørgrav 	STR_EQ(cert_principals);
11647dd1d1bSDag-Erling Smørgrav 	STR_EQ(force_command);
11747dd1d1bSDag-Erling Smørgrav 	STR_EQ(required_from_host_cert);
11847dd1d1bSDag-Erling Smørgrav 	STR_EQ(required_from_host_keys);
11947dd1d1bSDag-Erling Smørgrav #undef STR_EQ
12047dd1d1bSDag-Erling Smørgrav 
12147dd1d1bSDag-Erling Smørgrav #define ARRAY_EQ(nx, x) \
12247dd1d1bSDag-Erling Smørgrav 	do { \
12347dd1d1bSDag-Erling Smørgrav 		ASSERT_SIZE_T_EQ(opts->nx, expected->nx); \
12447dd1d1bSDag-Erling Smørgrav 		if (expected->nx == 0) \
12547dd1d1bSDag-Erling Smørgrav 			break; \
12647dd1d1bSDag-Erling Smørgrav 		for (i = 0; i < expected->nx; i++) \
12747dd1d1bSDag-Erling Smørgrav 			ASSERT_STRING_EQ(opts->x[i], expected->x[i]); \
12847dd1d1bSDag-Erling Smørgrav 	} while (0)
12947dd1d1bSDag-Erling Smørgrav 	ARRAY_EQ(nenv, env);
13047dd1d1bSDag-Erling Smørgrav 	ARRAY_EQ(npermitopen, permitopen);
13147dd1d1bSDag-Erling Smørgrav #undef ARRAY_EQ
13247dd1d1bSDag-Erling Smørgrav }
13347dd1d1bSDag-Erling Smørgrav 
13447dd1d1bSDag-Erling Smørgrav static void
test_authkeys_parse(void)13547dd1d1bSDag-Erling Smørgrav test_authkeys_parse(void)
13647dd1d1bSDag-Erling Smørgrav {
13747dd1d1bSDag-Erling Smørgrav 	struct sshauthopt *opts, *expected;
13847dd1d1bSDag-Erling Smørgrav 	const char *errstr;
13947dd1d1bSDag-Erling Smørgrav 
14047dd1d1bSDag-Erling Smørgrav #define FAIL_TEST(label, keywords) \
14147dd1d1bSDag-Erling Smørgrav 	do { \
14247dd1d1bSDag-Erling Smørgrav 		TEST_START("sshauthopt_parse invalid " label); \
14347dd1d1bSDag-Erling Smørgrav 		opts = sshauthopt_parse(keywords, &errstr); \
14447dd1d1bSDag-Erling Smørgrav 		ASSERT_PTR_EQ(opts, NULL); \
14547dd1d1bSDag-Erling Smørgrav 		ASSERT_PTR_NE(errstr, NULL); \
14647dd1d1bSDag-Erling Smørgrav 		TEST_DONE(); \
14747dd1d1bSDag-Erling Smørgrav 	} while (0)
14847dd1d1bSDag-Erling Smørgrav #define CHECK_SUCCESS_AND_CLEANUP() \
14947dd1d1bSDag-Erling Smørgrav 	do { \
15047dd1d1bSDag-Erling Smørgrav 		if (errstr != NULL) \
15147dd1d1bSDag-Erling Smørgrav 			ASSERT_STRING_EQ(errstr, ""); \
15247dd1d1bSDag-Erling Smørgrav 		compare_opts(opts, expected); \
15347dd1d1bSDag-Erling Smørgrav 		sshauthopt_free(expected); \
15447dd1d1bSDag-Erling Smørgrav 		sshauthopt_free(opts); \
15547dd1d1bSDag-Erling Smørgrav 	} while (0)
15647dd1d1bSDag-Erling Smørgrav 
15747dd1d1bSDag-Erling Smørgrav 	/* Basic tests */
15847dd1d1bSDag-Erling Smørgrav 	TEST_START("sshauthopt_parse empty");
15947dd1d1bSDag-Erling Smørgrav 	expected = default_authkey_opts();
16047dd1d1bSDag-Erling Smørgrav 	opts = sshauthopt_parse("", &errstr);
16147dd1d1bSDag-Erling Smørgrav 	CHECK_SUCCESS_AND_CLEANUP();
16247dd1d1bSDag-Erling Smørgrav 	TEST_DONE();
16347dd1d1bSDag-Erling Smørgrav 
16447dd1d1bSDag-Erling Smørgrav 	TEST_START("sshauthopt_parse trailing whitespace");
16547dd1d1bSDag-Erling Smørgrav 	expected = default_authkey_opts();
16647dd1d1bSDag-Erling Smørgrav 	opts = sshauthopt_parse(" ", &errstr);
16747dd1d1bSDag-Erling Smørgrav 	CHECK_SUCCESS_AND_CLEANUP();
16847dd1d1bSDag-Erling Smørgrav 	TEST_DONE();
16947dd1d1bSDag-Erling Smørgrav 
17047dd1d1bSDag-Erling Smørgrav 	TEST_START("sshauthopt_parse restrict");
17147dd1d1bSDag-Erling Smørgrav 	expected = default_authkey_restrict_opts();
17247dd1d1bSDag-Erling Smørgrav 	opts = sshauthopt_parse("restrict", &errstr);
17347dd1d1bSDag-Erling Smørgrav 	CHECK_SUCCESS_AND_CLEANUP();
17447dd1d1bSDag-Erling Smørgrav 	TEST_DONE();
17547dd1d1bSDag-Erling Smørgrav 
17647dd1d1bSDag-Erling Smørgrav 	/* Invalid syntax */
17747dd1d1bSDag-Erling Smørgrav 	FAIL_TEST("trailing comma", "restrict,");
17847dd1d1bSDag-Erling Smørgrav 	FAIL_TEST("bare comma", ",");
17947dd1d1bSDag-Erling Smørgrav 	FAIL_TEST("unknown option", "BLAH");
18047dd1d1bSDag-Erling Smørgrav 	FAIL_TEST("unknown option with trailing comma", "BLAH,");
18147dd1d1bSDag-Erling Smørgrav 	FAIL_TEST("unknown option with trailing whitespace", "BLAH ");
18247dd1d1bSDag-Erling Smørgrav 
18347dd1d1bSDag-Erling Smørgrav 	/* force_tun_device */
18447dd1d1bSDag-Erling Smørgrav 	TEST_START("sshauthopt_parse tunnel explicit");
18547dd1d1bSDag-Erling Smørgrav 	expected = default_authkey_opts();
18647dd1d1bSDag-Erling Smørgrav 	expected->force_tun_device = 1;
18747dd1d1bSDag-Erling Smørgrav 	opts = sshauthopt_parse("tunnel=\"1\"", &errstr);
18847dd1d1bSDag-Erling Smørgrav 	CHECK_SUCCESS_AND_CLEANUP();
18947dd1d1bSDag-Erling Smørgrav 	TEST_DONE();
19047dd1d1bSDag-Erling Smørgrav 
19147dd1d1bSDag-Erling Smørgrav 	TEST_START("sshauthopt_parse tunnel any");
19247dd1d1bSDag-Erling Smørgrav 	expected = default_authkey_opts();
19347dd1d1bSDag-Erling Smørgrav 	expected->force_tun_device = SSH_TUNID_ANY;
19447dd1d1bSDag-Erling Smørgrav 	opts = sshauthopt_parse("tunnel=\"any\"", &errstr);
19547dd1d1bSDag-Erling Smørgrav 	CHECK_SUCCESS_AND_CLEANUP();
19647dd1d1bSDag-Erling Smørgrav 	TEST_DONE();
19747dd1d1bSDag-Erling Smørgrav 
19847dd1d1bSDag-Erling Smørgrav 	FAIL_TEST("tunnel", "tunnel=\"blah\"");
19947dd1d1bSDag-Erling Smørgrav 
20047dd1d1bSDag-Erling Smørgrav 	/* Flag options */
20147dd1d1bSDag-Erling Smørgrav #define FLAG_TEST(keyword, var, val) \
20247dd1d1bSDag-Erling Smørgrav 	do { \
20347dd1d1bSDag-Erling Smørgrav 		TEST_START("sshauthopt_parse " keyword); \
20447dd1d1bSDag-Erling Smørgrav 		expected = default_authkey_opts(); \
20547dd1d1bSDag-Erling Smørgrav 		expected->var = val; \
20647dd1d1bSDag-Erling Smørgrav 		opts = sshauthopt_parse(keyword, &errstr); \
20747dd1d1bSDag-Erling Smørgrav 		CHECK_SUCCESS_AND_CLEANUP(); \
20847dd1d1bSDag-Erling Smørgrav 		expected = default_authkey_restrict_opts(); \
20947dd1d1bSDag-Erling Smørgrav 		expected->var = val; \
21047dd1d1bSDag-Erling Smørgrav 		opts = sshauthopt_parse("restrict,"keyword, &errstr); \
21147dd1d1bSDag-Erling Smørgrav 		CHECK_SUCCESS_AND_CLEANUP(); \
21247dd1d1bSDag-Erling Smørgrav 		TEST_DONE(); \
21347dd1d1bSDag-Erling Smørgrav 	} while (0)
21447dd1d1bSDag-Erling Smørgrav 	/* Positive flags */
21547dd1d1bSDag-Erling Smørgrav 	FLAG_TEST("cert-authority", cert_authority, 1);
21647dd1d1bSDag-Erling Smørgrav 	FLAG_TEST("port-forwarding", permit_port_forwarding_flag, 1);
21747dd1d1bSDag-Erling Smørgrav 	FLAG_TEST("agent-forwarding", permit_agent_forwarding_flag, 1);
21847dd1d1bSDag-Erling Smørgrav 	FLAG_TEST("x11-forwarding", permit_x11_forwarding_flag, 1);
21947dd1d1bSDag-Erling Smørgrav 	FLAG_TEST("pty", permit_pty_flag, 1);
22047dd1d1bSDag-Erling Smørgrav 	FLAG_TEST("user-rc", permit_user_rc, 1);
22147dd1d1bSDag-Erling Smørgrav 	/* Negative flags */
22247dd1d1bSDag-Erling Smørgrav 	FLAG_TEST("no-port-forwarding", permit_port_forwarding_flag, 0);
22347dd1d1bSDag-Erling Smørgrav 	FLAG_TEST("no-agent-forwarding", permit_agent_forwarding_flag, 0);
22447dd1d1bSDag-Erling Smørgrav 	FLAG_TEST("no-x11-forwarding", permit_x11_forwarding_flag, 0);
22547dd1d1bSDag-Erling Smørgrav 	FLAG_TEST("no-pty", permit_pty_flag, 0);
22647dd1d1bSDag-Erling Smørgrav 	FLAG_TEST("no-user-rc", permit_user_rc, 0);
22747dd1d1bSDag-Erling Smørgrav #undef FLAG_TEST
22847dd1d1bSDag-Erling Smørgrav 	FAIL_TEST("no-cert-authority", "no-cert-authority");
22947dd1d1bSDag-Erling Smørgrav 
23047dd1d1bSDag-Erling Smørgrav 	/* String options */
23147dd1d1bSDag-Erling Smørgrav #define STRING_TEST(keyword, var, val) \
23247dd1d1bSDag-Erling Smørgrav 	do { \
23347dd1d1bSDag-Erling Smørgrav 		TEST_START("sshauthopt_parse " keyword); \
23447dd1d1bSDag-Erling Smørgrav 		expected = default_authkey_opts(); \
23547dd1d1bSDag-Erling Smørgrav 		expected->var = strdup(val); \
23647dd1d1bSDag-Erling Smørgrav 		ASSERT_PTR_NE(expected->var, NULL); \
23747dd1d1bSDag-Erling Smørgrav 		opts = sshauthopt_parse(keyword "=" #val, &errstr); \
23847dd1d1bSDag-Erling Smørgrav 		CHECK_SUCCESS_AND_CLEANUP(); \
23947dd1d1bSDag-Erling Smørgrav 		expected = default_authkey_restrict_opts(); \
24047dd1d1bSDag-Erling Smørgrav 		expected->var = strdup(val); \
24147dd1d1bSDag-Erling Smørgrav 		ASSERT_PTR_NE(expected->var, NULL); \
24247dd1d1bSDag-Erling Smørgrav 		opts = sshauthopt_parse( \
24347dd1d1bSDag-Erling Smørgrav 		    "restrict," keyword "=" #val ",restrict", &errstr); \
24447dd1d1bSDag-Erling Smørgrav 		CHECK_SUCCESS_AND_CLEANUP(); \
24547dd1d1bSDag-Erling Smørgrav 		TEST_DONE(); \
24647dd1d1bSDag-Erling Smørgrav 	} while (0)
24747dd1d1bSDag-Erling Smørgrav 	STRING_TEST("command", force_command, "/bin/true");
24847dd1d1bSDag-Erling Smørgrav 	STRING_TEST("principals", cert_principals, "gregor,josef,K");
24947dd1d1bSDag-Erling Smørgrav 	STRING_TEST("from", required_from_host_keys, "127.0.0.0/8");
25047dd1d1bSDag-Erling Smørgrav #undef STRING_TEST
25147dd1d1bSDag-Erling Smørgrav 	FAIL_TEST("unquoted command", "command=oops");
25247dd1d1bSDag-Erling Smørgrav 	FAIL_TEST("unquoted principals", "principals=estragon");
25347dd1d1bSDag-Erling Smørgrav 	FAIL_TEST("unquoted from", "from=127.0.0.1");
25447dd1d1bSDag-Erling Smørgrav 
25547dd1d1bSDag-Erling Smørgrav 	/* String array option tests */
25647dd1d1bSDag-Erling Smørgrav #define ARRAY_TEST(label, keywords, var, nvar, val) \
25747dd1d1bSDag-Erling Smørgrav 	do { \
25847dd1d1bSDag-Erling Smørgrav 		TEST_START("sshauthopt_parse " label); \
25947dd1d1bSDag-Erling Smørgrav 		expected = default_authkey_opts(); \
26047dd1d1bSDag-Erling Smørgrav 		expected->var = commasplit(val, &expected->nvar); \
26147dd1d1bSDag-Erling Smørgrav 		ASSERT_PTR_NE(expected->var, NULL); \
26247dd1d1bSDag-Erling Smørgrav 		opts = sshauthopt_parse(keywords, &errstr); \
26347dd1d1bSDag-Erling Smørgrav 		CHECK_SUCCESS_AND_CLEANUP(); \
26447dd1d1bSDag-Erling Smørgrav 		expected = default_authkey_restrict_opts(); \
26547dd1d1bSDag-Erling Smørgrav 		expected->var = commasplit(val, &expected->nvar); \
26647dd1d1bSDag-Erling Smørgrav 		ASSERT_PTR_NE(expected->var, NULL); \
26747dd1d1bSDag-Erling Smørgrav 		opts = sshauthopt_parse( \
26847dd1d1bSDag-Erling Smørgrav 		    "restrict," keywords ",restrict", &errstr); \
26947dd1d1bSDag-Erling Smørgrav 		CHECK_SUCCESS_AND_CLEANUP(); \
27047dd1d1bSDag-Erling Smørgrav 		TEST_DONE(); \
27147dd1d1bSDag-Erling Smørgrav 	} while (0)
27247dd1d1bSDag-Erling Smørgrav 	ARRAY_TEST("environment", "environment=\"foo=1\",environment=\"bar=2\"",
27347dd1d1bSDag-Erling Smørgrav 	    env, nenv, "foo=1,bar=2");
27419261079SEd Maste 	ARRAY_TEST("environment", "environment=\"foo=1\",environment=\"foo=2\"",
27519261079SEd Maste 	    env, nenv, "foo=1");
27647dd1d1bSDag-Erling Smørgrav 	ARRAY_TEST("permitopen", "permitopen=\"foo:123\",permitopen=\"bar:*\"",
27747dd1d1bSDag-Erling Smørgrav 	    permitopen, npermitopen, "foo:123,bar:*");
27847dd1d1bSDag-Erling Smørgrav #undef ARRAY_TEST
27947dd1d1bSDag-Erling Smørgrav 	FAIL_TEST("environment", "environment=\",=bah\"");
28047dd1d1bSDag-Erling Smørgrav 	FAIL_TEST("permitopen port", "foo:bar");
28147dd1d1bSDag-Erling Smørgrav 	FAIL_TEST("permitopen missing port", "foo:");
28247dd1d1bSDag-Erling Smørgrav 	FAIL_TEST("permitopen missing port specification", "foo");
28347dd1d1bSDag-Erling Smørgrav 	FAIL_TEST("permitopen invalid host", "[:");
28447dd1d1bSDag-Erling Smørgrav 
28547dd1d1bSDag-Erling Smørgrav #undef CHECK_SUCCESS_AND_CLEANUP
28647dd1d1bSDag-Erling Smørgrav #undef FAIL_TEST
28747dd1d1bSDag-Erling Smørgrav }
28847dd1d1bSDag-Erling Smørgrav 
28947dd1d1bSDag-Erling Smørgrav static void
test_cert_parse(void)29047dd1d1bSDag-Erling Smørgrav test_cert_parse(void)
29147dd1d1bSDag-Erling Smørgrav {
29247dd1d1bSDag-Erling Smørgrav 	struct sshkey *cert;
29347dd1d1bSDag-Erling Smørgrav 	struct sshauthopt *opts, *expected;
29447dd1d1bSDag-Erling Smørgrav 
29547dd1d1bSDag-Erling Smørgrav #define CHECK_SUCCESS_AND_CLEANUP() \
29647dd1d1bSDag-Erling Smørgrav 	do { \
29747dd1d1bSDag-Erling Smørgrav 		compare_opts(opts, expected); \
29847dd1d1bSDag-Erling Smørgrav 		sshauthopt_free(expected); \
29947dd1d1bSDag-Erling Smørgrav 		sshauthopt_free(opts); \
30047dd1d1bSDag-Erling Smørgrav 		sshkey_free(cert); \
30147dd1d1bSDag-Erling Smørgrav 	} while (0)
30247dd1d1bSDag-Erling Smørgrav #define FLAG_TEST(keybase, var) \
30347dd1d1bSDag-Erling Smørgrav 	do { \
30447dd1d1bSDag-Erling Smørgrav 		TEST_START("sshauthopt_from_cert no_" keybase); \
30547dd1d1bSDag-Erling Smørgrav 		cert = load_key("no_" keybase ".cert"); \
30647dd1d1bSDag-Erling Smørgrav 		expected = default_authkey_opts(); \
30747dd1d1bSDag-Erling Smørgrav 		expected->var = 0; \
30847dd1d1bSDag-Erling Smørgrav 		opts = sshauthopt_from_cert(cert); \
30947dd1d1bSDag-Erling Smørgrav 		CHECK_SUCCESS_AND_CLEANUP(); \
31047dd1d1bSDag-Erling Smørgrav 		TEST_DONE(); \
31147dd1d1bSDag-Erling Smørgrav 		TEST_START("sshauthopt_from_cert only_" keybase); \
31247dd1d1bSDag-Erling Smørgrav 		cert = load_key("only_" keybase ".cert"); \
31347dd1d1bSDag-Erling Smørgrav 		expected = sshauthopt_new(); \
31447dd1d1bSDag-Erling Smørgrav 		ASSERT_PTR_NE(expected, NULL); \
31547dd1d1bSDag-Erling Smørgrav 		expected->var = 1; \
31647dd1d1bSDag-Erling Smørgrav 		opts = sshauthopt_from_cert(cert); \
31747dd1d1bSDag-Erling Smørgrav 		CHECK_SUCCESS_AND_CLEANUP(); \
31847dd1d1bSDag-Erling Smørgrav 		TEST_DONE(); \
31947dd1d1bSDag-Erling Smørgrav 	} while (0)
32047dd1d1bSDag-Erling Smørgrav 	FLAG_TEST("agentfwd", permit_agent_forwarding_flag);
32147dd1d1bSDag-Erling Smørgrav 	FLAG_TEST("portfwd", permit_port_forwarding_flag);
32247dd1d1bSDag-Erling Smørgrav 	FLAG_TEST("pty", permit_pty_flag);
32347dd1d1bSDag-Erling Smørgrav 	FLAG_TEST("user_rc", permit_user_rc);
32447dd1d1bSDag-Erling Smørgrav 	FLAG_TEST("x11fwd", permit_x11_forwarding_flag);
32547dd1d1bSDag-Erling Smørgrav #undef FLAG_TEST
32647dd1d1bSDag-Erling Smørgrav 
32747dd1d1bSDag-Erling Smørgrav 	TEST_START("sshauthopt_from_cert all permitted");
32847dd1d1bSDag-Erling Smørgrav 	cert = load_key("all_permit.cert");
32947dd1d1bSDag-Erling Smørgrav 	expected = default_authkey_opts();
33047dd1d1bSDag-Erling Smørgrav 	opts = sshauthopt_from_cert(cert);
33147dd1d1bSDag-Erling Smørgrav 	CHECK_SUCCESS_AND_CLEANUP();
33247dd1d1bSDag-Erling Smørgrav 	TEST_DONE();
33347dd1d1bSDag-Erling Smørgrav 
33447dd1d1bSDag-Erling Smørgrav 	TEST_START("sshauthopt_from_cert nothing permitted");
33547dd1d1bSDag-Erling Smørgrav 	cert = load_key("no_permit.cert");
33647dd1d1bSDag-Erling Smørgrav 	expected = sshauthopt_new();
33747dd1d1bSDag-Erling Smørgrav 	ASSERT_PTR_NE(expected, NULL);
33847dd1d1bSDag-Erling Smørgrav 	opts = sshauthopt_from_cert(cert);
33947dd1d1bSDag-Erling Smørgrav 	CHECK_SUCCESS_AND_CLEANUP();
34047dd1d1bSDag-Erling Smørgrav 	TEST_DONE();
34147dd1d1bSDag-Erling Smørgrav 
34247dd1d1bSDag-Erling Smørgrav 	TEST_START("sshauthopt_from_cert force-command");
34347dd1d1bSDag-Erling Smørgrav 	cert = load_key("force_command.cert");
34447dd1d1bSDag-Erling Smørgrav 	expected = default_authkey_opts();
34547dd1d1bSDag-Erling Smørgrav 	expected->force_command = strdup("foo");
34647dd1d1bSDag-Erling Smørgrav 	ASSERT_PTR_NE(expected->force_command, NULL);
34747dd1d1bSDag-Erling Smørgrav 	opts = sshauthopt_from_cert(cert);
34847dd1d1bSDag-Erling Smørgrav 	CHECK_SUCCESS_AND_CLEANUP();
34947dd1d1bSDag-Erling Smørgrav 	TEST_DONE();
35047dd1d1bSDag-Erling Smørgrav 
35147dd1d1bSDag-Erling Smørgrav 	TEST_START("sshauthopt_from_cert source-address");
35247dd1d1bSDag-Erling Smørgrav 	cert = load_key("sourceaddr.cert");
35347dd1d1bSDag-Erling Smørgrav 	expected = default_authkey_opts();
35447dd1d1bSDag-Erling Smørgrav 	expected->required_from_host_cert = strdup("127.0.0.1/32,::1/128");
35547dd1d1bSDag-Erling Smørgrav 	ASSERT_PTR_NE(expected->required_from_host_cert, NULL);
35647dd1d1bSDag-Erling Smørgrav 	opts = sshauthopt_from_cert(cert);
35747dd1d1bSDag-Erling Smørgrav 	CHECK_SUCCESS_AND_CLEANUP();
35847dd1d1bSDag-Erling Smørgrav 	TEST_DONE();
35947dd1d1bSDag-Erling Smørgrav #undef CHECK_SUCCESS_AND_CLEANUP
36047dd1d1bSDag-Erling Smørgrav 
36147dd1d1bSDag-Erling Smørgrav #define FAIL_TEST(keybase) \
36247dd1d1bSDag-Erling Smørgrav 	do { \
36347dd1d1bSDag-Erling Smørgrav 		TEST_START("sshauthopt_from_cert " keybase); \
36447dd1d1bSDag-Erling Smørgrav 		cert = load_key(keybase ".cert"); \
36547dd1d1bSDag-Erling Smørgrav 		opts = sshauthopt_from_cert(cert); \
36647dd1d1bSDag-Erling Smørgrav 		ASSERT_PTR_EQ(opts, NULL); \
36747dd1d1bSDag-Erling Smørgrav 		sshkey_free(cert); \
36847dd1d1bSDag-Erling Smørgrav 		TEST_DONE(); \
36947dd1d1bSDag-Erling Smørgrav 	} while (0)
37047dd1d1bSDag-Erling Smørgrav 	FAIL_TEST("host");
37147dd1d1bSDag-Erling Smørgrav 	FAIL_TEST("bad_sourceaddr");
37247dd1d1bSDag-Erling Smørgrav 	FAIL_TEST("unknown_critical");
37347dd1d1bSDag-Erling Smørgrav #undef FAIL_TEST
37447dd1d1bSDag-Erling Smørgrav }
37547dd1d1bSDag-Erling Smørgrav 
37647dd1d1bSDag-Erling Smørgrav static void
test_merge(void)37747dd1d1bSDag-Erling Smørgrav test_merge(void)
37847dd1d1bSDag-Erling Smørgrav {
37947dd1d1bSDag-Erling Smørgrav 	struct sshkey *cert;
38047dd1d1bSDag-Erling Smørgrav 	struct sshauthopt *key_opts, *cert_opts, *merge_opts, *expected;
38147dd1d1bSDag-Erling Smørgrav 	const char *errstr;
38247dd1d1bSDag-Erling Smørgrav 
38347dd1d1bSDag-Erling Smørgrav 	/*
38447dd1d1bSDag-Erling Smørgrav 	 * Prepare for a test by making some key and cert options and
38547dd1d1bSDag-Erling Smørgrav 	 * attempting to merge them.
38647dd1d1bSDag-Erling Smørgrav 	 */
38747dd1d1bSDag-Erling Smørgrav #define PREPARE(label, keyname, keywords) \
38847dd1d1bSDag-Erling Smørgrav 	do { \
38947dd1d1bSDag-Erling Smørgrav 		expected = NULL; \
39047dd1d1bSDag-Erling Smørgrav 		TEST_START("sshauthopt_merge " label); \
39147dd1d1bSDag-Erling Smørgrav 		cert = load_key(keyname ".cert"); \
39247dd1d1bSDag-Erling Smørgrav 		cert_opts = sshauthopt_from_cert(cert); \
39347dd1d1bSDag-Erling Smørgrav 		ASSERT_PTR_NE(cert_opts, NULL); \
39447dd1d1bSDag-Erling Smørgrav 		key_opts = sshauthopt_parse(keywords, &errstr); \
39547dd1d1bSDag-Erling Smørgrav 		if (errstr != NULL) \
39647dd1d1bSDag-Erling Smørgrav 			ASSERT_STRING_EQ(errstr, ""); \
39747dd1d1bSDag-Erling Smørgrav 		ASSERT_PTR_NE(key_opts, NULL); \
39847dd1d1bSDag-Erling Smørgrav 		merge_opts = sshauthopt_merge(key_opts, \
39947dd1d1bSDag-Erling Smørgrav 		    cert_opts, &errstr); \
40047dd1d1bSDag-Erling Smørgrav 	} while (0)
40147dd1d1bSDag-Erling Smørgrav 
40247dd1d1bSDag-Erling Smørgrav 	/* Cleanup stuff allocated by PREPARE() */
40347dd1d1bSDag-Erling Smørgrav #define CLEANUP() \
40447dd1d1bSDag-Erling Smørgrav 	do { \
40547dd1d1bSDag-Erling Smørgrav 		sshauthopt_free(expected); \
40647dd1d1bSDag-Erling Smørgrav 		sshauthopt_free(merge_opts); \
40747dd1d1bSDag-Erling Smørgrav 		sshauthopt_free(key_opts); \
40847dd1d1bSDag-Erling Smørgrav 		sshauthopt_free(cert_opts); \
40947dd1d1bSDag-Erling Smørgrav 		sshkey_free(cert); \
41047dd1d1bSDag-Erling Smørgrav 	} while (0)
41147dd1d1bSDag-Erling Smørgrav 
41247dd1d1bSDag-Erling Smørgrav 	/* Check the results of PREPARE() against expectation; calls CLEANUP */
41347dd1d1bSDag-Erling Smørgrav #define CHECK_SUCCESS_AND_CLEANUP() \
41447dd1d1bSDag-Erling Smørgrav 	do { \
41547dd1d1bSDag-Erling Smørgrav 		if (errstr != NULL) \
41647dd1d1bSDag-Erling Smørgrav 			ASSERT_STRING_EQ(errstr, ""); \
41747dd1d1bSDag-Erling Smørgrav 		compare_opts(merge_opts, expected); \
41847dd1d1bSDag-Erling Smørgrav 		CLEANUP(); \
41947dd1d1bSDag-Erling Smørgrav 	} while (0)
42047dd1d1bSDag-Erling Smørgrav 
42147dd1d1bSDag-Erling Smørgrav 	/* Check a single case of merging of flag options */
42247dd1d1bSDag-Erling Smørgrav #define FLAG_CASE(keybase, label, keyname, keywords, mostly_off, var, val) \
42347dd1d1bSDag-Erling Smørgrav 	do { \
42447dd1d1bSDag-Erling Smørgrav 		PREPARE(keybase " " label, keyname, keywords); \
42547dd1d1bSDag-Erling Smørgrav 		expected = mostly_off ? \
42647dd1d1bSDag-Erling Smørgrav 		    sshauthopt_new() : default_authkey_opts(); \
42747dd1d1bSDag-Erling Smørgrav 		expected->var = val; \
42847dd1d1bSDag-Erling Smørgrav 		ASSERT_PTR_NE(expected, NULL); \
42947dd1d1bSDag-Erling Smørgrav 		CHECK_SUCCESS_AND_CLEANUP(); \
43047dd1d1bSDag-Erling Smørgrav 		TEST_DONE(); \
43147dd1d1bSDag-Erling Smørgrav 	} while (0)
43247dd1d1bSDag-Erling Smørgrav 
43347dd1d1bSDag-Erling Smørgrav 	/*
43447dd1d1bSDag-Erling Smørgrav 	 * Fairly exhaustive exercise of a flag option. Tests
43547dd1d1bSDag-Erling Smørgrav 	 * option both set and clear in certificate, set and clear in
43647dd1d1bSDag-Erling Smørgrav 	 * authorized_keys and set and cleared via restrict keyword.
43747dd1d1bSDag-Erling Smørgrav 	 */
43847dd1d1bSDag-Erling Smørgrav #define FLAG_TEST(keybase, keyword, var) \
43947dd1d1bSDag-Erling Smørgrav 	do { \
44047dd1d1bSDag-Erling Smørgrav 		FLAG_CASE(keybase, "keys:default,yes cert:default,no", \
44147dd1d1bSDag-Erling Smørgrav 		    "no_" keybase, keyword, 0, var, 0); \
44247dd1d1bSDag-Erling Smørgrav 		FLAG_CASE(keybase,"keys:-*,yes cert:default,no", \
44347dd1d1bSDag-Erling Smørgrav 		    "no_" keybase, "restrict," keyword, 1, var, 0); \
44447dd1d1bSDag-Erling Smørgrav 		FLAG_CASE(keybase, "keys:default,no cert:default,no", \
44547dd1d1bSDag-Erling Smørgrav 		    "no_" keybase, "no-" keyword, 0, var, 0); \
44647dd1d1bSDag-Erling Smørgrav 		FLAG_CASE(keybase, "keys:-*,no cert:default,no", \
44747dd1d1bSDag-Erling Smørgrav 		    "no_" keybase, "restrict,no-" keyword, 1, var, 0); \
44847dd1d1bSDag-Erling Smørgrav 		\
44947dd1d1bSDag-Erling Smørgrav 		FLAG_CASE(keybase, "keys:default,yes cert:-*,yes", \
45047dd1d1bSDag-Erling Smørgrav 		    "only_" keybase, keyword, 1, var, 1); \
45147dd1d1bSDag-Erling Smørgrav 		FLAG_CASE(keybase,"keys:-*,yes cert:-*,yes", \
45247dd1d1bSDag-Erling Smørgrav 		    "only_" keybase, "restrict," keyword, 1, var, 1); \
45347dd1d1bSDag-Erling Smørgrav 		FLAG_CASE(keybase, "keys:default,no cert:-*,yes", \
45447dd1d1bSDag-Erling Smørgrav 		    "only_" keybase, "no-" keyword, 1, var, 0); \
45547dd1d1bSDag-Erling Smørgrav 		FLAG_CASE(keybase, "keys:-*,no cert:-*,yes", \
45647dd1d1bSDag-Erling Smørgrav 		    "only_" keybase, "restrict,no-" keyword, 1, var, 0); \
45747dd1d1bSDag-Erling Smørgrav 		\
45847dd1d1bSDag-Erling Smørgrav 		FLAG_CASE(keybase, "keys:default,yes cert:-*", \
45947dd1d1bSDag-Erling Smørgrav 		    "no_permit", keyword, 1, var, 0); \
46047dd1d1bSDag-Erling Smørgrav 		FLAG_CASE(keybase,"keys:-*,yes cert:-*", \
46147dd1d1bSDag-Erling Smørgrav 		    "no_permit", "restrict," keyword, 1, var, 0); \
46247dd1d1bSDag-Erling Smørgrav 		FLAG_CASE(keybase, "keys:default,no cert:-*", \
46347dd1d1bSDag-Erling Smørgrav 		    "no_permit", "no-" keyword, 1, var, 0); \
46447dd1d1bSDag-Erling Smørgrav 		FLAG_CASE(keybase, "keys:-*,no cert:-*", \
46547dd1d1bSDag-Erling Smørgrav 		    "no_permit", "restrict,no-" keyword, 1, var, 0); \
46647dd1d1bSDag-Erling Smørgrav 		\
46747dd1d1bSDag-Erling Smørgrav 		FLAG_CASE(keybase, "keys:default,yes cert:*", \
46847dd1d1bSDag-Erling Smørgrav 		    "all_permit", keyword, 0, var, 1); \
46947dd1d1bSDag-Erling Smørgrav 		FLAG_CASE(keybase,"keys:-*,yes cert:*", \
47047dd1d1bSDag-Erling Smørgrav 		    "all_permit", "restrict," keyword, 1, var, 1); \
47147dd1d1bSDag-Erling Smørgrav 		FLAG_CASE(keybase, "keys:default,no cert:*", \
47247dd1d1bSDag-Erling Smørgrav 		    "all_permit", "no-" keyword, 0, var, 0); \
47347dd1d1bSDag-Erling Smørgrav 		FLAG_CASE(keybase, "keys:-*,no cert:*", \
47447dd1d1bSDag-Erling Smørgrav 		    "all_permit", "restrict,no-" keyword, 1, var, 0); \
47547dd1d1bSDag-Erling Smørgrav 		\
47647dd1d1bSDag-Erling Smørgrav 	} while (0)
47747dd1d1bSDag-Erling Smørgrav 	FLAG_TEST("portfwd", "port-forwarding", permit_port_forwarding_flag);
47847dd1d1bSDag-Erling Smørgrav 	FLAG_TEST("agentfwd", "agent-forwarding", permit_agent_forwarding_flag);
47947dd1d1bSDag-Erling Smørgrav 	FLAG_TEST("pty", "pty", permit_pty_flag);
48047dd1d1bSDag-Erling Smørgrav 	FLAG_TEST("user_rc", "user-rc", permit_user_rc);
48147dd1d1bSDag-Erling Smørgrav 	FLAG_TEST("x11fwd", "x11-forwarding", permit_x11_forwarding_flag);
48247dd1d1bSDag-Erling Smørgrav #undef FLAG_TEST
48347dd1d1bSDag-Erling Smørgrav 
48447dd1d1bSDag-Erling Smørgrav 	PREPARE("source-address both", "sourceaddr", "from=\"127.0.0.1\"");
48547dd1d1bSDag-Erling Smørgrav 	expected = default_authkey_opts();
48647dd1d1bSDag-Erling Smørgrav 	expected->required_from_host_cert = strdup("127.0.0.1/32,::1/128");
48747dd1d1bSDag-Erling Smørgrav 	ASSERT_PTR_NE(expected->required_from_host_cert, NULL);
48847dd1d1bSDag-Erling Smørgrav 	expected->required_from_host_keys = strdup("127.0.0.1");
48947dd1d1bSDag-Erling Smørgrav 	ASSERT_PTR_NE(expected->required_from_host_keys, NULL);
49047dd1d1bSDag-Erling Smørgrav 	CHECK_SUCCESS_AND_CLEANUP();
49147dd1d1bSDag-Erling Smørgrav 	TEST_DONE();
49247dd1d1bSDag-Erling Smørgrav 
49347dd1d1bSDag-Erling Smørgrav 	PREPARE("source-address none", "all_permit", "");
49447dd1d1bSDag-Erling Smørgrav 	expected = default_authkey_opts();
49547dd1d1bSDag-Erling Smørgrav 	CHECK_SUCCESS_AND_CLEANUP();
49647dd1d1bSDag-Erling Smørgrav 	TEST_DONE();
49747dd1d1bSDag-Erling Smørgrav 
49847dd1d1bSDag-Erling Smørgrav 	PREPARE("source-address keys", "all_permit", "from=\"127.0.0.1\"");
49947dd1d1bSDag-Erling Smørgrav 	expected = default_authkey_opts();
50047dd1d1bSDag-Erling Smørgrav 	expected->required_from_host_keys = strdup("127.0.0.1");
50147dd1d1bSDag-Erling Smørgrav 	ASSERT_PTR_NE(expected->required_from_host_keys, NULL);
50247dd1d1bSDag-Erling Smørgrav 	CHECK_SUCCESS_AND_CLEANUP();
50347dd1d1bSDag-Erling Smørgrav 	TEST_DONE();
50447dd1d1bSDag-Erling Smørgrav 
50547dd1d1bSDag-Erling Smørgrav 	PREPARE("source-address cert", "sourceaddr", "");
50647dd1d1bSDag-Erling Smørgrav 	expected = default_authkey_opts();
50747dd1d1bSDag-Erling Smørgrav 	expected->required_from_host_cert = strdup("127.0.0.1/32,::1/128");
50847dd1d1bSDag-Erling Smørgrav 	ASSERT_PTR_NE(expected->required_from_host_cert, NULL);
50947dd1d1bSDag-Erling Smørgrav 	CHECK_SUCCESS_AND_CLEANUP();
51047dd1d1bSDag-Erling Smørgrav 	TEST_DONE();
51147dd1d1bSDag-Erling Smørgrav 
51247dd1d1bSDag-Erling Smørgrav 	PREPARE("force-command both", "force_command", "command=\"foo\"");
51347dd1d1bSDag-Erling Smørgrav 	expected = default_authkey_opts();
51447dd1d1bSDag-Erling Smørgrav 	expected->force_command = strdup("foo");
51547dd1d1bSDag-Erling Smørgrav 	ASSERT_PTR_NE(expected->force_command, NULL);
51647dd1d1bSDag-Erling Smørgrav 	CHECK_SUCCESS_AND_CLEANUP();
51747dd1d1bSDag-Erling Smørgrav 	TEST_DONE();
51847dd1d1bSDag-Erling Smørgrav 
51947dd1d1bSDag-Erling Smørgrav 	PREPARE("force-command none", "all_permit", "");
52047dd1d1bSDag-Erling Smørgrav 	expected = default_authkey_opts();
52147dd1d1bSDag-Erling Smørgrav 	CHECK_SUCCESS_AND_CLEANUP();
52247dd1d1bSDag-Erling Smørgrav 	TEST_DONE();
52347dd1d1bSDag-Erling Smørgrav 
52447dd1d1bSDag-Erling Smørgrav 	PREPARE("force-command keys", "all_permit", "command=\"bar\"");
52547dd1d1bSDag-Erling Smørgrav 	expected = default_authkey_opts();
52647dd1d1bSDag-Erling Smørgrav 	expected->force_command = strdup("bar");
52747dd1d1bSDag-Erling Smørgrav 	ASSERT_PTR_NE(expected->force_command, NULL);
52847dd1d1bSDag-Erling Smørgrav 	CHECK_SUCCESS_AND_CLEANUP();
52947dd1d1bSDag-Erling Smørgrav 	TEST_DONE();
53047dd1d1bSDag-Erling Smørgrav 
53147dd1d1bSDag-Erling Smørgrav 	PREPARE("force-command cert", "force_command", "");
53247dd1d1bSDag-Erling Smørgrav 	expected = default_authkey_opts();
53347dd1d1bSDag-Erling Smørgrav 	expected->force_command = strdup("foo");
53447dd1d1bSDag-Erling Smørgrav 	ASSERT_PTR_NE(expected->force_command, NULL);
53547dd1d1bSDag-Erling Smørgrav 	CHECK_SUCCESS_AND_CLEANUP();
53647dd1d1bSDag-Erling Smørgrav 	TEST_DONE();
53747dd1d1bSDag-Erling Smørgrav 
53847dd1d1bSDag-Erling Smørgrav 	PREPARE("force-command mismatch", "force_command", "command=\"bar\"");
53947dd1d1bSDag-Erling Smørgrav 	ASSERT_PTR_EQ(merge_opts, NULL);
54047dd1d1bSDag-Erling Smørgrav 	CLEANUP();
54147dd1d1bSDag-Erling Smørgrav 	TEST_DONE();
54247dd1d1bSDag-Erling Smørgrav 
54347dd1d1bSDag-Erling Smørgrav 	PREPARE("tunnel", "all_permit", "tunnel=\"6\"");
54447dd1d1bSDag-Erling Smørgrav 	expected = default_authkey_opts();
54547dd1d1bSDag-Erling Smørgrav 	expected->force_tun_device = 6;
54647dd1d1bSDag-Erling Smørgrav 	CHECK_SUCCESS_AND_CLEANUP();
54747dd1d1bSDag-Erling Smørgrav 	TEST_DONE();
54847dd1d1bSDag-Erling Smørgrav 
54947dd1d1bSDag-Erling Smørgrav 	PREPARE("permitopen", "all_permit",
55047dd1d1bSDag-Erling Smørgrav 	    "permitopen=\"127.0.0.1:*\",permitopen=\"127.0.0.1:123\"");
55147dd1d1bSDag-Erling Smørgrav 	expected = default_authkey_opts();
55247dd1d1bSDag-Erling Smørgrav 	expected->permitopen = commasplit("127.0.0.1:*,127.0.0.1:123",
55347dd1d1bSDag-Erling Smørgrav 	    &expected->npermitopen);
55447dd1d1bSDag-Erling Smørgrav 	CHECK_SUCCESS_AND_CLEANUP();
55547dd1d1bSDag-Erling Smørgrav 	TEST_DONE();
55647dd1d1bSDag-Erling Smørgrav 
55747dd1d1bSDag-Erling Smørgrav 	PREPARE("environment", "all_permit",
55847dd1d1bSDag-Erling Smørgrav 	    "environment=\"foo=a\",environment=\"bar=b\"");
55947dd1d1bSDag-Erling Smørgrav 	expected = default_authkey_opts();
56047dd1d1bSDag-Erling Smørgrav 	expected->env = commasplit("foo=a,bar=b", &expected->nenv);
56147dd1d1bSDag-Erling Smørgrav 	CHECK_SUCCESS_AND_CLEANUP();
56247dd1d1bSDag-Erling Smørgrav 	TEST_DONE();
56347dd1d1bSDag-Erling Smørgrav }
56447dd1d1bSDag-Erling Smørgrav 
56547dd1d1bSDag-Erling Smørgrav void
tests(void)56647dd1d1bSDag-Erling Smørgrav tests(void)
56747dd1d1bSDag-Erling Smørgrav {
56847dd1d1bSDag-Erling Smørgrav 	extern char *__progname;
56947dd1d1bSDag-Erling Smørgrav 	LogLevel ll = test_is_verbose() ?
57047dd1d1bSDag-Erling Smørgrav 	    SYSLOG_LEVEL_DEBUG3 : SYSLOG_LEVEL_QUIET;
57147dd1d1bSDag-Erling Smørgrav 
57247dd1d1bSDag-Erling Smørgrav 	/* test_cert_parse() are a bit spammy to error() by default... */
57347dd1d1bSDag-Erling Smørgrav 	log_init(__progname, ll, SYSLOG_FACILITY_USER, 1);
57447dd1d1bSDag-Erling Smørgrav 
57547dd1d1bSDag-Erling Smørgrav 	test_authkeys_parse();
57647dd1d1bSDag-Erling Smørgrav 	test_cert_parse();
57747dd1d1bSDag-Erling Smørgrav 	test_merge();
57847dd1d1bSDag-Erling Smørgrav }
579