SSL test framework: port NPN and ALPN tests
[openssl.git] / test / ssl_test_ctx_test.c
1 /*
2  * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the OpenSSL license (the "License").  You may not use
5  * this file except in compliance with the License.  You can obtain a copy
6  * in the file LICENSE in the source distribution or at
7  * https://www.openssl.org/source/license.html
8  */
9
10 /*
11  * Ideally, CONF should offer standard parsing methods and cover them
12  * in tests. But since we have no CONF tests, we use a custom test for now.
13  */
14
15 #include <stdio.h>
16 #include <string.h>
17
18 #include "e_os.h"
19 #include "ssl_test_ctx.h"
20 #include "testutil.h"
21 #include <openssl/e_os2.h>
22 #include <openssl/err.h>
23 #include <openssl/conf.h>
24 #include <openssl/ssl.h>
25
26 static CONF *conf = NULL;
27
28 typedef struct ssl_test_ctx_test_fixture {
29     const char *test_case_name;
30     const char *test_section;
31     /* Expected parsed configuration. */
32     SSL_TEST_CTX *expected_ctx;
33 } SSL_TEST_CTX_TEST_FIXTURE;
34
35 /* Returns 1 if the contexts are equal, 0 otherwise. */
36 static int SSL_TEST_CTX_equal(SSL_TEST_CTX *ctx, SSL_TEST_CTX *ctx2)
37 {
38     if (ctx->expected_result != ctx2->expected_result) {
39         fprintf(stderr, "ExpectedResult mismatch: %s vs %s.\n",
40                 ssl_test_result_name(ctx->expected_result),
41                 ssl_test_result_name(ctx2->expected_result));
42         return 0;
43     }
44     if (ctx->client_alert != ctx2->client_alert) {
45         fprintf(stderr, "ClientAlert mismatch: %s vs %s.\n",
46                 ssl_alert_name(ctx->client_alert),
47                 ssl_alert_name(ctx2->client_alert));
48         return 0;
49     }
50     if (ctx->server_alert != ctx2->server_alert) {
51         fprintf(stderr, "ServerAlert mismatch: %s vs %s.\n",
52                 ssl_alert_name(ctx->server_alert),
53                 ssl_alert_name(ctx2->server_alert));
54         return 0;
55     }
56     if (ctx->protocol != ctx2->protocol) {
57         fprintf(stderr, "ClientAlert mismatch: %s vs %s.\n",
58                 ssl_protocol_name(ctx->protocol),
59                 ssl_protocol_name(ctx2->protocol));
60         return 0;
61     }
62     if (ctx->client_verify_callback != ctx2->client_verify_callback) {
63         fprintf(stderr, "ClientVerifyCallback mismatch: %s vs %s.\n",
64                 ssl_verify_callback_name(ctx->client_verify_callback),
65                 ssl_verify_callback_name(ctx2->client_verify_callback));
66         return 0;
67     }
68     if (ctx->servername != ctx2->servername) {
69         fprintf(stderr, "ServerName mismatch: %s vs %s.\n",
70                 ssl_servername_name(ctx->servername),
71                 ssl_servername_name(ctx2->servername));
72         return 0;
73     }
74     if (ctx->expected_servername != ctx2->expected_servername) {
75         fprintf(stderr, "ExpectedServerName mismatch: %s vs %s.\n",
76                 ssl_servername_name(ctx->expected_servername),
77                 ssl_servername_name(ctx2->expected_servername));
78         return 0;
79     }
80     if (ctx->servername_callback != ctx2->servername_callback) {
81         fprintf(stderr, "ServerNameCallback mismatch: %s vs %s.\n",
82                 ssl_servername_callback_name(ctx->servername_callback),
83                 ssl_servername_callback_name(ctx2->servername_callback));
84         return 0;
85     }
86     if (ctx->session_ticket_expected != ctx2->session_ticket_expected) {
87         fprintf(stderr, "SessionTicketExpected mismatch: %s vs %s.\n",
88                 ssl_session_ticket_name(ctx->session_ticket_expected),
89                 ssl_session_ticket_name(ctx2->session_ticket_expected));
90         return 0;
91     }
92     if (!strings_equal("ClientNPNProtocols", ctx->client_npn_protocols,
93                        ctx2->client_npn_protocols))
94         return 0;
95
96     if (!strings_equal("ServerNPNProtocols", ctx->server_npn_protocols,
97                        ctx2->server_npn_protocols))
98         return 0;
99     if (!strings_equal("Server2NPNProtocols", ctx->server_npn_protocols,
100                        ctx2->server_npn_protocols))
101         return 0;
102     if (!strings_equal("ExpectedNPNProtocol", ctx->expected_npn_protocol,
103                        ctx2->expected_npn_protocol))
104         return 0;
105     if (!strings_equal("ClientALPNProtocols", ctx->client_alpn_protocols,
106                        ctx2->client_alpn_protocols))
107         return 0;
108
109     if (!strings_equal("ServerALPNProtocols", ctx->server_alpn_protocols,
110                        ctx2->server_alpn_protocols))
111         return 0;
112     if (!strings_equal("Server2ALPNProtocols", ctx->server_alpn_protocols,
113                        ctx2->server_alpn_protocols))
114         return 0;
115     if (!strings_equal("ExpectedALPNProtocol", ctx->expected_alpn_protocol,
116                        ctx2->expected_alpn_protocol))
117         return 0;
118     return 1;
119 }
120
121 static SSL_TEST_CTX_TEST_FIXTURE set_up(const char *const test_case_name)
122 {
123     SSL_TEST_CTX_TEST_FIXTURE fixture;
124     fixture.test_case_name = test_case_name;
125     fixture.expected_ctx = SSL_TEST_CTX_new();
126     OPENSSL_assert(fixture.expected_ctx != NULL);
127     return fixture;
128 }
129
130 static int execute_test(SSL_TEST_CTX_TEST_FIXTURE fixture)
131 {
132     int success = 0;
133
134     SSL_TEST_CTX *ctx = SSL_TEST_CTX_create(conf, fixture.test_section);
135
136     if (ctx == NULL) {
137         fprintf(stderr, "Failed to parse good configuration %s.\n",
138                 fixture.test_section);
139         goto err;
140     }
141
142     if (!SSL_TEST_CTX_equal(ctx, fixture.expected_ctx))
143         goto err;
144
145     success = 1;
146  err:
147     SSL_TEST_CTX_free(ctx);
148     return success;
149 }
150
151 static int execute_failure_test(SSL_TEST_CTX_TEST_FIXTURE fixture)
152 {
153     SSL_TEST_CTX *ctx = SSL_TEST_CTX_create(conf, fixture.test_section);
154
155     if (ctx != NULL) {
156         fprintf(stderr, "Parsing bad configuration %s succeeded.\n",
157                 fixture.test_section);
158         SSL_TEST_CTX_free(ctx);
159         return 0;
160     }
161
162     return 1;
163 }
164
165 static void tear_down(SSL_TEST_CTX_TEST_FIXTURE fixture)
166 {
167     SSL_TEST_CTX_free(fixture.expected_ctx);
168     ERR_print_errors_fp(stderr);
169 }
170
171 #define SETUP_SSL_TEST_CTX_TEST_FIXTURE()                       \
172     SETUP_TEST_FIXTURE(SSL_TEST_CTX_TEST_FIXTURE, set_up)
173 #define EXECUTE_SSL_TEST_CTX_TEST()             \
174     EXECUTE_TEST(execute_test, tear_down)
175 #define EXECUTE_SSL_TEST_CTX_FAILURE_TEST()             \
176     EXECUTE_TEST(execute_failure_test, tear_down)
177
178 static int test_empty_configuration()
179 {
180     SETUP_SSL_TEST_CTX_TEST_FIXTURE();
181     fixture.test_section = "ssltest_default";
182     fixture.expected_ctx->expected_result = SSL_TEST_SUCCESS;
183     EXECUTE_SSL_TEST_CTX_TEST();
184 }
185
186 static int test_good_configuration()
187 {
188     SETUP_SSL_TEST_CTX_TEST_FIXTURE();
189     fixture.test_section = "ssltest_good";
190     fixture.expected_ctx->expected_result = SSL_TEST_SERVER_FAIL;
191     fixture.expected_ctx->client_alert = SSL_AD_UNKNOWN_CA;
192     fixture.expected_ctx->server_alert = 0;  /* No alert. */
193     fixture.expected_ctx->protocol = TLS1_1_VERSION;
194     fixture.expected_ctx->client_verify_callback = SSL_TEST_VERIFY_REJECT_ALL;
195     fixture.expected_ctx->servername = SSL_TEST_SERVERNAME_SERVER2;
196     fixture.expected_ctx->expected_servername = SSL_TEST_SERVERNAME_SERVER2;
197     fixture.expected_ctx->servername_callback =
198         SSL_TEST_SERVERNAME_IGNORE_MISMATCH;
199     fixture.expected_ctx->session_ticket_expected = SSL_TEST_SESSION_TICKET_YES;
200     fixture.expected_ctx->method = SSL_TEST_METHOD_DTLS;
201     fixture.expected_ctx->client_npn_protocols = OPENSSL_strdup("foo,bar");
202     fixture.expected_ctx->server2_alpn_protocols = OPENSSL_strdup("baz");
203     OPENSSL_assert(fixture.expected_ctx->client_npn_protocols != NULL);
204     OPENSSL_assert(fixture.expected_ctx->server2_alpn_protocols != NULL);
205     EXECUTE_SSL_TEST_CTX_TEST();
206 }
207
208 static const char *bad_configurations[] = {
209     "ssltest_unknown_option",
210     "ssltest_unknown_expected_result",
211     "ssltest_unknown_alert",
212     "ssltest_unknown_protocol",
213     "ssltest_unknown_verify_callback",
214     "ssltest_unknown_servername",
215     "ssltest_unknown_servername_callback",
216     "ssltest_unknown_session_ticket_expected",
217     "ssltest_unknown_method",
218 };
219
220 static int test_bad_configuration(int idx)
221 {
222         SETUP_SSL_TEST_CTX_TEST_FIXTURE();
223         fixture.test_section = bad_configurations[idx];
224         EXECUTE_SSL_TEST_CTX_FAILURE_TEST();
225 }
226
227 int main(int argc, char **argv)
228 {
229     int result = 0;
230
231     if (argc != 2)
232         return 1;
233
234     conf = NCONF_new(NULL);
235     OPENSSL_assert(conf != NULL);
236
237     /* argv[1] should point to test/ssl_test_ctx_test.conf */
238     OPENSSL_assert(NCONF_load(conf, argv[1], NULL) > 0);
239
240
241     ADD_TEST(test_empty_configuration);
242     ADD_TEST(test_good_configuration);
243     ADD_ALL_TESTS(test_bad_configuration, OSSL_NELEM(bad_configurations));
244
245     result = run_tests(argv[0]);
246
247     NCONF_free(conf);
248
249     return result;
250 }