Line data Source code
1 : /*
2 : *
3 : * Copyright 2015, Google Inc.
4 : * All rights reserved.
5 : *
6 : * Redistribution and use in source and binary forms, with or without
7 : * modification, are permitted provided that the following conditions are
8 : * met:
9 : *
10 : * * Redistributions of source code must retain the above copyright
11 : * notice, this list of conditions and the following disclaimer.
12 : * * Redistributions in binary form must reproduce the above
13 : * copyright notice, this list of conditions and the following disclaimer
14 : * in the documentation and/or other materials provided with the
15 : * distribution.
16 : * * Neither the name of Google Inc. nor the names of its
17 : * contributors may be used to endorse or promote products derived from
18 : * this software without specific prior written permission.
19 : *
20 : * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 : * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 : * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 : * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 : * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 : * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 : * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 : * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 : * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 : * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 : * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 : *
32 : */
33 :
34 : #include "test/core/end2end/end2end_tests.h"
35 :
36 : #include <stdio.h>
37 : #include <string.h>
38 :
39 : #include "src/core/channel/channel_args.h"
40 : #include "src/core/security/credentials.h"
41 : #include "src/core/support/env.h"
42 : #include "src/core/support/file.h"
43 : #include "src/core/support/string.h"
44 : #include <grpc/support/alloc.h>
45 : #include <grpc/support/host_port.h>
46 : #include <grpc/support/log.h>
47 : #include "test/core/end2end/data/ssl_test_data.h"
48 : #include "test/core/end2end/fixtures/proxy.h"
49 : #include "test/core/util/test_config.h"
50 : #include "test/core/util/port.h"
51 :
52 : typedef struct fullstack_secure_fixture_data {
53 : grpc_end2end_proxy *proxy;
54 : } fullstack_secure_fixture_data;
55 :
56 68 : static grpc_server *create_proxy_server(const char *port) {
57 68 : grpc_server *s = grpc_server_create(NULL, NULL);
58 68 : grpc_ssl_pem_key_cert_pair pem_cert_key_pair = {test_server1_key,
59 : test_server1_cert};
60 68 : grpc_server_credentials *ssl_creds =
61 : grpc_ssl_server_credentials_create(NULL, &pem_cert_key_pair, 1, 0, NULL);
62 68 : GPR_ASSERT(grpc_server_add_secure_http2_port(s, port, ssl_creds));
63 68 : grpc_server_credentials_release(ssl_creds);
64 68 : return s;
65 : }
66 :
67 68 : static grpc_channel *create_proxy_client(const char *target) {
68 : grpc_channel *channel;
69 68 : grpc_credentials *ssl_creds = grpc_ssl_credentials_create(NULL, NULL, NULL);
70 68 : grpc_arg ssl_name_override = {GRPC_ARG_STRING,
71 : GRPC_SSL_TARGET_NAME_OVERRIDE_ARG,
72 : {"foo.test.google.fr"}};
73 : grpc_channel_args client_args;
74 68 : client_args.num_args = 1;
75 68 : client_args.args = &ssl_name_override;
76 68 : channel = grpc_secure_channel_create(ssl_creds, target, &client_args, NULL);
77 68 : grpc_credentials_release(ssl_creds);
78 68 : return channel;
79 : }
80 :
81 : static const grpc_end2end_proxy_def proxy_def = {create_proxy_server,
82 : create_proxy_client};
83 :
84 68 : static grpc_end2end_test_fixture chttp2_create_fixture_secure_fullstack(
85 : grpc_channel_args *client_args, grpc_channel_args *server_args) {
86 : grpc_end2end_test_fixture f;
87 68 : fullstack_secure_fixture_data *ffd =
88 : gpr_malloc(sizeof(fullstack_secure_fixture_data));
89 68 : memset(&f, 0, sizeof(f));
90 :
91 68 : ffd->proxy = grpc_end2end_proxy_create(&proxy_def);
92 :
93 68 : f.fixture_data = ffd;
94 68 : f.cq = grpc_completion_queue_create(NULL);
95 :
96 68 : return f;
97 : }
98 :
99 1 : static void process_auth_failure(void *state, grpc_auth_context *ctx,
100 : const grpc_metadata *md, size_t md_count,
101 : grpc_process_auth_metadata_done_cb cb,
102 : void *user_data) {
103 1 : GPR_ASSERT(state == NULL);
104 1 : cb(user_data, NULL, 0, NULL, 0, GRPC_STATUS_UNAUTHENTICATED, NULL);
105 1 : }
106 :
107 68 : static void chttp2_init_client_secure_fullstack(grpc_end2end_test_fixture *f,
108 : grpc_channel_args *client_args,
109 : grpc_credentials *creds) {
110 68 : fullstack_secure_fixture_data *ffd = f->fixture_data;
111 68 : f->client = grpc_secure_channel_create(
112 : creds, grpc_end2end_proxy_get_client_target(ffd->proxy), client_args,
113 : NULL);
114 68 : GPR_ASSERT(f->client != NULL);
115 68 : grpc_credentials_release(creds);
116 68 : }
117 :
118 69 : static void chttp2_init_server_secure_fullstack(
119 : grpc_end2end_test_fixture *f, grpc_channel_args *server_args,
120 : grpc_server_credentials *server_creds) {
121 69 : fullstack_secure_fixture_data *ffd = f->fixture_data;
122 69 : if (f->server) {
123 1 : grpc_server_destroy(f->server);
124 : }
125 69 : f->server = grpc_server_create(server_args, NULL);
126 69 : grpc_server_register_completion_queue(f->server, f->cq, NULL);
127 69 : GPR_ASSERT(grpc_server_add_secure_http2_port(
128 : f->server, grpc_end2end_proxy_get_server_port(ffd->proxy), server_creds));
129 69 : grpc_server_credentials_release(server_creds);
130 69 : grpc_server_start(f->server);
131 69 : }
132 :
133 68 : void chttp2_tear_down_secure_fullstack(grpc_end2end_test_fixture *f) {
134 68 : fullstack_secure_fixture_data *ffd = f->fixture_data;
135 68 : grpc_end2end_proxy_destroy(ffd->proxy);
136 68 : gpr_free(ffd);
137 68 : }
138 :
139 68 : static void chttp2_init_client_simple_ssl_secure_fullstack(
140 : grpc_end2end_test_fixture *f, grpc_channel_args *client_args) {
141 68 : grpc_credentials *ssl_creds = grpc_ssl_credentials_create(NULL, NULL, NULL);
142 68 : grpc_arg ssl_name_override = {GRPC_ARG_STRING,
143 : GRPC_SSL_TARGET_NAME_OVERRIDE_ARG,
144 : {"foo.test.google.fr"}};
145 68 : grpc_channel_args *new_client_args =
146 : grpc_channel_args_copy_and_add(client_args, &ssl_name_override, 1);
147 68 : chttp2_init_client_secure_fullstack(f, new_client_args, ssl_creds);
148 68 : grpc_channel_args_destroy(new_client_args);
149 68 : }
150 :
151 69 : static int fail_server_auth_check(grpc_channel_args *server_args) {
152 : size_t i;
153 69 : if (server_args == NULL) return 0;
154 5 : for (i = 0; i < server_args->num_args; i++) {
155 3 : if (strcmp(server_args->args[i].key, FAIL_AUTH_CHECK_SERVER_ARG_NAME) ==
156 : 0) {
157 1 : return 1;
158 : }
159 : }
160 2 : return 0;
161 : }
162 :
163 69 : static void chttp2_init_server_simple_ssl_secure_fullstack(
164 : grpc_end2end_test_fixture *f, grpc_channel_args *server_args) {
165 69 : grpc_ssl_pem_key_cert_pair pem_cert_key_pair = {test_server1_key,
166 : test_server1_cert};
167 69 : grpc_server_credentials *ssl_creds =
168 : grpc_ssl_server_credentials_create(NULL, &pem_cert_key_pair, 1, 0, NULL);
169 69 : if (fail_server_auth_check(server_args)) {
170 1 : grpc_auth_metadata_processor processor = {process_auth_failure, NULL, NULL};
171 1 : grpc_server_credentials_set_auth_metadata_processor(ssl_creds, processor);
172 : }
173 69 : chttp2_init_server_secure_fullstack(f, server_args, ssl_creds);
174 69 : }
175 :
176 : /* All test configurations */
177 :
178 : static grpc_end2end_test_config configs[] = {
179 : {"chttp2/simple_ssl_fullstack",
180 : FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
181 : FEATURE_MASK_SUPPORTS_PER_CALL_CREDENTIALS,
182 : chttp2_create_fixture_secure_fullstack,
183 : chttp2_init_client_simple_ssl_secure_fullstack,
184 : chttp2_init_server_simple_ssl_secure_fullstack,
185 : chttp2_tear_down_secure_fullstack},
186 : };
187 :
188 29 : int main(int argc, char **argv) {
189 : size_t i;
190 : FILE *roots_file;
191 29 : size_t roots_size = strlen(test_root_cert);
192 : char *roots_filename;
193 :
194 29 : grpc_test_init(argc, argv);
195 :
196 : /* Set the SSL roots env var. */
197 29 : roots_file = gpr_tmpfile("chttp2_simple_ssl_fullstack_test", &roots_filename);
198 29 : GPR_ASSERT(roots_filename != NULL);
199 29 : GPR_ASSERT(roots_file != NULL);
200 29 : GPR_ASSERT(fwrite(test_root_cert, 1, roots_size, roots_file) == roots_size);
201 29 : fclose(roots_file);
202 29 : gpr_setenv(GRPC_DEFAULT_SSL_ROOTS_FILE_PATH_ENV_VAR, roots_filename);
203 :
204 29 : grpc_init();
205 :
206 58 : for (i = 0; i < sizeof(configs) / sizeof(*configs); i++) {
207 29 : grpc_end2end_tests(configs[i]);
208 : }
209 :
210 29 : grpc_shutdown();
211 :
212 : /* Cleanup. */
213 29 : remove(roots_filename);
214 29 : gpr_free(roots_filename);
215 :
216 29 : return 0;
217 : }
|