blob: f03f4ccdbdab51758e5d0c7860bf400611bfdf04 [file] [log] [blame]
Julien Boeufa701ade2015-06-18 15:23:40 +02001/*
2 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02003 * Copyright 2015 gRPC authors.
Julien Boeufa701ade2015-06-18 15:23:40 +02004 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02005 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
Julien Boeufa701ade2015-06-18 15:23:40 +02008 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02009 * http://www.apache.org/licenses/LICENSE-2.0
Julien Boeufa701ade2015-06-18 15:23:40 +020010 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +020011 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
Julien Boeufa701ade2015-06-18 15:23:40 +020016 *
17 */
18
19#include <stdio.h>
20#include <string.h>
21
Julien Boeufa701ade2015-06-18 15:23:40 +020022#include <grpc/grpc_security.h>
Julien Boeufa701ade2015-06-18 15:23:40 +020023#include <grpc/support/alloc.h>
24#include <grpc/support/log.h>
Julien Boeufaaebf7a2016-01-28 17:04:42 -080025#include <grpc/support/string_util.h>
Julien Boeufa701ade2015-06-18 15:23:40 +020026
Mark D. Rothdbdf4952018-01-18 11:21:12 -080027#include "src/core/lib/gpr/env.h"
28#include "src/core/lib/gpr/string.h"
29#include "src/core/lib/gpr/tmpfile.h"
Julien Boeuf8ca294e2016-05-02 14:56:30 -070030#include "src/core/lib/security/context/security_context.h"
Yihua Zhang75f0a9f2018-02-20 10:09:47 -080031#include "src/core/lib/security/security_connector/security_connector.h"
Craig Tillere4222b42016-10-26 17:15:30 -070032#include "src/core/lib/slice/slice_string_helpers.h"
Craig Tillerb29f1fe2017-03-28 15:49:23 -070033#include "src/core/tsi/ssl_transport_security.h"
34#include "src/core/tsi/transport_security.h"
Craig Tiller732a8752016-02-22 15:59:19 -080035#include "test/core/util/test_config.h"
36
Craig Tillerbaa14a92017-11-03 09:09:36 -070037static int check_transport_security_type(const grpc_auth_context* ctx) {
Julien Boeufa701ade2015-06-18 15:23:40 +020038 grpc_auth_property_iterator it = grpc_auth_context_find_properties_by_name(
39 ctx, GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME);
Craig Tillerbaa14a92017-11-03 09:09:36 -070040 const grpc_auth_property* prop = grpc_auth_property_iterator_next(&it);
Craig Tiller4ac2b8e2017-11-10 14:14:17 -080041 if (prop == nullptr) return 0;
Julien Boeufa701ade2015-06-18 15:23:40 +020042 if (strncmp(prop->value, GRPC_SSL_TRANSPORT_SECURITY_TYPE,
43 prop->value_length) != 0) {
44 return 0;
45 }
46 /* Check that we have only one property with this name. */
Craig Tiller4ac2b8e2017-11-10 14:14:17 -080047 if (grpc_auth_property_iterator_next(&it) != nullptr) return 0;
Julien Boeufa701ade2015-06-18 15:23:40 +020048 return 1;
49}
50
Craig Tillerbaa14a92017-11-03 09:09:36 -070051static int check_peer_property(const tsi_peer* peer,
52 const tsi_peer_property* expected) {
Julien Boeufee9d78b2015-12-18 09:50:34 -080053 size_t i;
54 for (i = 0; i < peer->property_count; i++) {
Craig Tillerbaa14a92017-11-03 09:09:36 -070055 const tsi_peer_property* prop = &peer->properties[i];
Julien Boeufee9d78b2015-12-18 09:50:34 -080056 if ((strcmp(prop->name, expected->name) == 0) &&
57 (prop->value.length == expected->value.length) &&
58 (memcmp(prop->value.data, expected->value.data,
59 expected->value.length) == 0)) {
60 return 1;
61 }
62 }
63 return 0; /* Not found... */
64}
65
Craig Tillerbaa14a92017-11-03 09:09:36 -070066static int check_ssl_peer_equivalence(const tsi_peer* original,
67 const tsi_peer* reconstructed) {
Deepak Lukosee61cbe32016-03-14 14:10:44 -070068 /* The reconstructed peer only has CN, SAN and pem cert properties. */
Julien Boeufee9d78b2015-12-18 09:50:34 -080069 size_t i;
70 for (i = 0; i < original->property_count; i++) {
Craig Tillerbaa14a92017-11-03 09:09:36 -070071 const tsi_peer_property* prop = &original->properties[i];
Julien Boeufee9d78b2015-12-18 09:50:34 -080072 if ((strcmp(prop->name, TSI_X509_SUBJECT_COMMON_NAME_PEER_PROPERTY) == 0) ||
73 (strcmp(prop->name, TSI_X509_SUBJECT_ALTERNATIVE_NAME_PEER_PROPERTY) ==
Deepak Lukosee61cbe32016-03-14 14:10:44 -070074 0) ||
75 (strcmp(prop->name, TSI_X509_PEM_CERT_PROPERTY) == 0)) {
Julien Boeufee9d78b2015-12-18 09:50:34 -080076 if (!check_peer_property(reconstructed, prop)) return 0;
77 }
78 }
79 return 1;
80}
81
Julien Boeufa701ade2015-06-18 15:23:40 +020082static void test_unauthenticated_ssl_peer(void) {
83 tsi_peer peer;
Julien Boeufee9d78b2015-12-18 09:50:34 -080084 tsi_peer rpeer;
Craig Tillerbaa14a92017-11-03 09:09:36 -070085 grpc_auth_context* ctx;
Julien Boeufa701ade2015-06-18 15:23:40 +020086 GPR_ASSERT(tsi_construct_peer(1, &peer) == TSI_OK);
87 GPR_ASSERT(tsi_construct_string_peer_property_from_cstring(
88 TSI_CERTIFICATE_TYPE_PEER_PROPERTY, TSI_X509_CERTIFICATE_TYPE,
89 &peer.properties[0]) == TSI_OK);
90 ctx = tsi_ssl_peer_to_auth_context(&peer);
Craig Tiller4ac2b8e2017-11-10 14:14:17 -080091 GPR_ASSERT(ctx != nullptr);
Julien Boeufa701ade2015-06-18 15:23:40 +020092 GPR_ASSERT(!grpc_auth_context_peer_is_authenticated(ctx));
93 GPR_ASSERT(check_transport_security_type(ctx));
94
Julien Boeufee9d78b2015-12-18 09:50:34 -080095 rpeer = tsi_shallow_peer_from_ssl_auth_context(ctx);
96 GPR_ASSERT(check_ssl_peer_equivalence(&peer, &rpeer));
97
98 tsi_shallow_peer_destruct(&rpeer);
Julien Boeufa701ade2015-06-18 15:23:40 +020099 tsi_peer_destruct(&peer);
Craig Tiller991edad2015-06-30 11:40:41 -0700100 GRPC_AUTH_CONTEXT_UNREF(ctx, "test");
Julien Boeufa701ade2015-06-18 15:23:40 +0200101}
102
Craig Tillerbaa14a92017-11-03 09:09:36 -0700103static int check_identity(const grpc_auth_context* ctx,
104 const char* expected_property_name,
105 const char** expected_identities,
Craig Tillerd6c98df2015-08-18 09:33:44 -0700106 size_t num_identities) {
Julien Boeufa701ade2015-06-18 15:23:40 +0200107 grpc_auth_property_iterator it;
Craig Tillerbaa14a92017-11-03 09:09:36 -0700108 const grpc_auth_property* prop;
Julien Boeufa701ade2015-06-18 15:23:40 +0200109 size_t i;
110 GPR_ASSERT(grpc_auth_context_peer_is_authenticated(ctx));
111 it = grpc_auth_context_peer_identity(ctx);
112 for (i = 0; i < num_identities; i++) {
113 prop = grpc_auth_property_iterator_next(&it);
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800114 if (prop == nullptr) {
Julien Boeufa701ade2015-06-18 15:23:40 +0200115 gpr_log(GPR_ERROR, "Expected identity value %s not found.",
116 expected_identities[i]);
117 return 0;
118 }
119 if (strcmp(prop->name, expected_property_name) != 0) {
120 gpr_log(GPR_ERROR, "Expected peer identity property name %s and got %s.",
121 expected_property_name, prop->name);
122 return 0;
123 }
124 if (strncmp(prop->value, expected_identities[i], prop->value_length) != 0) {
125 gpr_log(GPR_ERROR, "Expected peer identity %s and got %s.",
126 expected_identities[i], prop->value);
127 return 0;
128 }
129 }
130 return 1;
131}
132
Craig Tillerbaa14a92017-11-03 09:09:36 -0700133static int check_x509_cn(const grpc_auth_context* ctx,
134 const char* expected_cn) {
Julien Boeufa701ade2015-06-18 15:23:40 +0200135 grpc_auth_property_iterator it = grpc_auth_context_find_properties_by_name(
136 ctx, GRPC_X509_CN_PROPERTY_NAME);
Craig Tillerbaa14a92017-11-03 09:09:36 -0700137 const grpc_auth_property* prop = grpc_auth_property_iterator_next(&it);
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800138 if (prop == nullptr) {
Julien Boeufa701ade2015-06-18 15:23:40 +0200139 gpr_log(GPR_ERROR, "CN property not found.");
140 return 0;
141 }
142 if (strncmp(prop->value, expected_cn, prop->value_length) != 0) {
143 gpr_log(GPR_ERROR, "Expected CN %s and got %s", expected_cn, prop->value);
144 return 0;
145 }
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800146 if (grpc_auth_property_iterator_next(&it) != nullptr) {
Julien Boeufa701ade2015-06-18 15:23:40 +0200147 gpr_log(GPR_ERROR, "Expected only one property for CN.");
148 return 0;
149 }
150 return 1;
151}
152
Craig Tillerbaa14a92017-11-03 09:09:36 -0700153static int check_x509_pem_cert(const grpc_auth_context* ctx,
154 const char* expected_pem_cert) {
Deepak Lukosee61cbe32016-03-14 14:10:44 -0700155 grpc_auth_property_iterator it = grpc_auth_context_find_properties_by_name(
156 ctx, GRPC_X509_PEM_CERT_PROPERTY_NAME);
Craig Tillerbaa14a92017-11-03 09:09:36 -0700157 const grpc_auth_property* prop = grpc_auth_property_iterator_next(&it);
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800158 if (prop == nullptr) {
Deepak Lukosee61cbe32016-03-14 14:10:44 -0700159 gpr_log(GPR_ERROR, "Pem certificate property not found.");
160 return 0;
161 }
162 if (strncmp(prop->value, expected_pem_cert, prop->value_length) != 0) {
163 gpr_log(GPR_ERROR, "Expected pem cert %s and got %s", expected_pem_cert,
164 prop->value);
165 return 0;
166 }
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800167 if (grpc_auth_property_iterator_next(&it) != nullptr) {
Deepak Lukosee61cbe32016-03-14 14:10:44 -0700168 gpr_log(GPR_ERROR, "Expected only one property for pem cert.");
169 return 0;
170 }
171 return 1;
172}
173
Julien Boeufa701ade2015-06-18 15:23:40 +0200174static void test_cn_only_ssl_peer_to_auth_context(void) {
175 tsi_peer peer;
Julien Boeufee9d78b2015-12-18 09:50:34 -0800176 tsi_peer rpeer;
Craig Tillerbaa14a92017-11-03 09:09:36 -0700177 grpc_auth_context* ctx;
178 const char* expected_cn = "cn1";
179 const char* expected_pem_cert = "pem_cert1";
Deepak Lukosee61cbe32016-03-14 14:10:44 -0700180 GPR_ASSERT(tsi_construct_peer(3, &peer) == TSI_OK);
Julien Boeufa701ade2015-06-18 15:23:40 +0200181 GPR_ASSERT(tsi_construct_string_peer_property_from_cstring(
182 TSI_CERTIFICATE_TYPE_PEER_PROPERTY, TSI_X509_CERTIFICATE_TYPE,
183 &peer.properties[0]) == TSI_OK);
184 GPR_ASSERT(tsi_construct_string_peer_property_from_cstring(
185 TSI_X509_SUBJECT_COMMON_NAME_PEER_PROPERTY, expected_cn,
186 &peer.properties[1]) == TSI_OK);
Deepak Lukosee61cbe32016-03-14 14:10:44 -0700187 GPR_ASSERT(tsi_construct_string_peer_property_from_cstring(
188 TSI_X509_PEM_CERT_PROPERTY, expected_pem_cert,
189 &peer.properties[2]) == TSI_OK);
Julien Boeufa701ade2015-06-18 15:23:40 +0200190 ctx = tsi_ssl_peer_to_auth_context(&peer);
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800191 GPR_ASSERT(ctx != nullptr);
Julien Boeufa701ade2015-06-18 15:23:40 +0200192 GPR_ASSERT(grpc_auth_context_peer_is_authenticated(ctx));
193 GPR_ASSERT(check_identity(ctx, GRPC_X509_CN_PROPERTY_NAME, &expected_cn, 1));
194 GPR_ASSERT(check_transport_security_type(ctx));
195 GPR_ASSERT(check_x509_cn(ctx, expected_cn));
Deepak Lukosee61cbe32016-03-14 14:10:44 -0700196 GPR_ASSERT(check_x509_pem_cert(ctx, expected_pem_cert));
Julien Boeufa701ade2015-06-18 15:23:40 +0200197
Julien Boeufee9d78b2015-12-18 09:50:34 -0800198 rpeer = tsi_shallow_peer_from_ssl_auth_context(ctx);
199 GPR_ASSERT(check_ssl_peer_equivalence(&peer, &rpeer));
200
201 tsi_shallow_peer_destruct(&rpeer);
Julien Boeufa701ade2015-06-18 15:23:40 +0200202 tsi_peer_destruct(&peer);
Craig Tiller991edad2015-06-30 11:40:41 -0700203 GRPC_AUTH_CONTEXT_UNREF(ctx, "test");
Julien Boeufa701ade2015-06-18 15:23:40 +0200204}
205
206static void test_cn_and_one_san_ssl_peer_to_auth_context(void) {
207 tsi_peer peer;
Julien Boeufee9d78b2015-12-18 09:50:34 -0800208 tsi_peer rpeer;
Craig Tillerbaa14a92017-11-03 09:09:36 -0700209 grpc_auth_context* ctx;
210 const char* expected_cn = "cn1";
211 const char* expected_san = "san1";
212 const char* expected_pem_cert = "pem_cert1";
Deepak Lukosee61cbe32016-03-14 14:10:44 -0700213 GPR_ASSERT(tsi_construct_peer(4, &peer) == TSI_OK);
Julien Boeufa701ade2015-06-18 15:23:40 +0200214 GPR_ASSERT(tsi_construct_string_peer_property_from_cstring(
215 TSI_CERTIFICATE_TYPE_PEER_PROPERTY, TSI_X509_CERTIFICATE_TYPE,
216 &peer.properties[0]) == TSI_OK);
217 GPR_ASSERT(tsi_construct_string_peer_property_from_cstring(
218 TSI_X509_SUBJECT_COMMON_NAME_PEER_PROPERTY, expected_cn,
219 &peer.properties[1]) == TSI_OK);
220 GPR_ASSERT(tsi_construct_string_peer_property_from_cstring(
221 TSI_X509_SUBJECT_ALTERNATIVE_NAME_PEER_PROPERTY, expected_san,
222 &peer.properties[2]) == TSI_OK);
Deepak Lukosee61cbe32016-03-14 14:10:44 -0700223 GPR_ASSERT(tsi_construct_string_peer_property_from_cstring(
224 TSI_X509_PEM_CERT_PROPERTY, expected_pem_cert,
225 &peer.properties[3]) == TSI_OK);
Julien Boeufa701ade2015-06-18 15:23:40 +0200226 ctx = tsi_ssl_peer_to_auth_context(&peer);
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800227 GPR_ASSERT(ctx != nullptr);
Julien Boeufa701ade2015-06-18 15:23:40 +0200228 GPR_ASSERT(grpc_auth_context_peer_is_authenticated(ctx));
Craig Tillerd6c98df2015-08-18 09:33:44 -0700229 GPR_ASSERT(
230 check_identity(ctx, GRPC_X509_SAN_PROPERTY_NAME, &expected_san, 1));
Julien Boeufa701ade2015-06-18 15:23:40 +0200231 GPR_ASSERT(check_transport_security_type(ctx));
232 GPR_ASSERT(check_x509_cn(ctx, expected_cn));
Deepak Lukosee61cbe32016-03-14 14:10:44 -0700233 GPR_ASSERT(check_x509_pem_cert(ctx, expected_pem_cert));
Julien Boeufa701ade2015-06-18 15:23:40 +0200234
Julien Boeufee9d78b2015-12-18 09:50:34 -0800235 rpeer = tsi_shallow_peer_from_ssl_auth_context(ctx);
236 GPR_ASSERT(check_ssl_peer_equivalence(&peer, &rpeer));
237
238 tsi_shallow_peer_destruct(&rpeer);
Julien Boeufa701ade2015-06-18 15:23:40 +0200239 tsi_peer_destruct(&peer);
Craig Tiller991edad2015-06-30 11:40:41 -0700240 GRPC_AUTH_CONTEXT_UNREF(ctx, "test");
Julien Boeufa701ade2015-06-18 15:23:40 +0200241}
242
243static void test_cn_and_multiple_sans_ssl_peer_to_auth_context(void) {
244 tsi_peer peer;
Julien Boeufee9d78b2015-12-18 09:50:34 -0800245 tsi_peer rpeer;
Craig Tillerbaa14a92017-11-03 09:09:36 -0700246 grpc_auth_context* ctx;
247 const char* expected_cn = "cn1";
248 const char* expected_sans[] = {"san1", "san2", "san3"};
249 const char* expected_pem_cert = "pem_cert1";
Julien Boeufa701ade2015-06-18 15:23:40 +0200250 size_t i;
Deepak Lukosee61cbe32016-03-14 14:10:44 -0700251 GPR_ASSERT(tsi_construct_peer(3 + GPR_ARRAY_SIZE(expected_sans), &peer) ==
Julien Boeufa701ade2015-06-18 15:23:40 +0200252 TSI_OK);
253 GPR_ASSERT(tsi_construct_string_peer_property_from_cstring(
254 TSI_CERTIFICATE_TYPE_PEER_PROPERTY, TSI_X509_CERTIFICATE_TYPE,
255 &peer.properties[0]) == TSI_OK);
256 GPR_ASSERT(tsi_construct_string_peer_property_from_cstring(
257 TSI_X509_SUBJECT_COMMON_NAME_PEER_PROPERTY, expected_cn,
258 &peer.properties[1]) == TSI_OK);
Deepak Lukosee61cbe32016-03-14 14:10:44 -0700259 GPR_ASSERT(tsi_construct_string_peer_property_from_cstring(
260 TSI_X509_PEM_CERT_PROPERTY, expected_pem_cert,
261 &peer.properties[2]) == TSI_OK);
Julien Boeufa701ade2015-06-18 15:23:40 +0200262 for (i = 0; i < GPR_ARRAY_SIZE(expected_sans); i++) {
263 GPR_ASSERT(tsi_construct_string_peer_property_from_cstring(
264 TSI_X509_SUBJECT_ALTERNATIVE_NAME_PEER_PROPERTY,
Deepak Lukosee61cbe32016-03-14 14:10:44 -0700265 expected_sans[i], &peer.properties[3 + i]) == TSI_OK);
Julien Boeufa701ade2015-06-18 15:23:40 +0200266 }
267 ctx = tsi_ssl_peer_to_auth_context(&peer);
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800268 GPR_ASSERT(ctx != nullptr);
Julien Boeufa701ade2015-06-18 15:23:40 +0200269 GPR_ASSERT(grpc_auth_context_peer_is_authenticated(ctx));
270 GPR_ASSERT(check_identity(ctx, GRPC_X509_SAN_PROPERTY_NAME, expected_sans,
271 GPR_ARRAY_SIZE(expected_sans)));
272 GPR_ASSERT(check_transport_security_type(ctx));
273 GPR_ASSERT(check_x509_cn(ctx, expected_cn));
Deepak Lukosee61cbe32016-03-14 14:10:44 -0700274 GPR_ASSERT(check_x509_pem_cert(ctx, expected_pem_cert));
Julien Boeufa701ade2015-06-18 15:23:40 +0200275
Julien Boeufee9d78b2015-12-18 09:50:34 -0800276 rpeer = tsi_shallow_peer_from_ssl_auth_context(ctx);
277 GPR_ASSERT(check_ssl_peer_equivalence(&peer, &rpeer));
278
279 tsi_shallow_peer_destruct(&rpeer);
Julien Boeufa701ade2015-06-18 15:23:40 +0200280 tsi_peer_destruct(&peer);
Craig Tiller991edad2015-06-30 11:40:41 -0700281 GRPC_AUTH_CONTEXT_UNREF(ctx, "test");
Julien Boeufa701ade2015-06-18 15:23:40 +0200282}
283
284static void test_cn_and_multiple_sans_and_others_ssl_peer_to_auth_context(
285 void) {
286 tsi_peer peer;
Julien Boeufee9d78b2015-12-18 09:50:34 -0800287 tsi_peer rpeer;
Craig Tillerbaa14a92017-11-03 09:09:36 -0700288 grpc_auth_context* ctx;
289 const char* expected_cn = "cn1";
290 const char* expected_pem_cert = "pem_cert1";
291 const char* expected_sans[] = {"san1", "san2", "san3"};
Julien Boeufa701ade2015-06-18 15:23:40 +0200292 size_t i;
Deepak Lukosee61cbe32016-03-14 14:10:44 -0700293 GPR_ASSERT(tsi_construct_peer(5 + GPR_ARRAY_SIZE(expected_sans), &peer) ==
Julien Boeufa701ade2015-06-18 15:23:40 +0200294 TSI_OK);
295 GPR_ASSERT(tsi_construct_string_peer_property_from_cstring(
296 TSI_CERTIFICATE_TYPE_PEER_PROPERTY, TSI_X509_CERTIFICATE_TYPE,
297 &peer.properties[0]) == TSI_OK);
298 GPR_ASSERT(tsi_construct_string_peer_property_from_cstring(
299 "foo", "bar", &peer.properties[1]) == TSI_OK);
300 GPR_ASSERT(tsi_construct_string_peer_property_from_cstring(
301 TSI_X509_SUBJECT_COMMON_NAME_PEER_PROPERTY, expected_cn,
302 &peer.properties[2]) == TSI_OK);
303 GPR_ASSERT(tsi_construct_string_peer_property_from_cstring(
304 "chapi", "chapo", &peer.properties[3]) == TSI_OK);
Deepak Lukosee61cbe32016-03-14 14:10:44 -0700305 GPR_ASSERT(tsi_construct_string_peer_property_from_cstring(
306 TSI_X509_PEM_CERT_PROPERTY, expected_pem_cert,
307 &peer.properties[4]) == TSI_OK);
Julien Boeufa701ade2015-06-18 15:23:40 +0200308 for (i = 0; i < GPR_ARRAY_SIZE(expected_sans); i++) {
309 GPR_ASSERT(tsi_construct_string_peer_property_from_cstring(
310 TSI_X509_SUBJECT_ALTERNATIVE_NAME_PEER_PROPERTY,
Deepak Lukosee61cbe32016-03-14 14:10:44 -0700311 expected_sans[i], &peer.properties[5 + i]) == TSI_OK);
Julien Boeufa701ade2015-06-18 15:23:40 +0200312 }
313 ctx = tsi_ssl_peer_to_auth_context(&peer);
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800314 GPR_ASSERT(ctx != nullptr);
Julien Boeufa701ade2015-06-18 15:23:40 +0200315 GPR_ASSERT(grpc_auth_context_peer_is_authenticated(ctx));
316 GPR_ASSERT(check_identity(ctx, GRPC_X509_SAN_PROPERTY_NAME, expected_sans,
317 GPR_ARRAY_SIZE(expected_sans)));
318 GPR_ASSERT(check_transport_security_type(ctx));
319 GPR_ASSERT(check_x509_cn(ctx, expected_cn));
Deepak Lukosee61cbe32016-03-14 14:10:44 -0700320 GPR_ASSERT(check_x509_pem_cert(ctx, expected_pem_cert));
Julien Boeufa701ade2015-06-18 15:23:40 +0200321
Julien Boeufee9d78b2015-12-18 09:50:34 -0800322 rpeer = tsi_shallow_peer_from_ssl_auth_context(ctx);
323 GPR_ASSERT(check_ssl_peer_equivalence(&peer, &rpeer));
324
325 tsi_shallow_peer_destruct(&rpeer);
Julien Boeufa701ade2015-06-18 15:23:40 +0200326 tsi_peer_destruct(&peer);
Craig Tiller991edad2015-06-30 11:40:41 -0700327 GRPC_AUTH_CONTEXT_UNREF(ctx, "test");
Julien Boeufa701ade2015-06-18 15:23:40 +0200328}
329
Craig Tillerbaa14a92017-11-03 09:09:36 -0700330static const char* roots_for_override_api = "roots for override api";
Julien Boeufaaebf7a2016-01-28 17:04:42 -0800331
332static grpc_ssl_roots_override_result override_roots_success(
Craig Tillerbaa14a92017-11-03 09:09:36 -0700333 char** pem_root_certs) {
Julien Boeufaaebf7a2016-01-28 17:04:42 -0800334 *pem_root_certs = gpr_strdup(roots_for_override_api);
335 return GRPC_SSL_ROOTS_OVERRIDE_OK;
336}
337
338static grpc_ssl_roots_override_result override_roots_permanent_failure(
Craig Tillerbaa14a92017-11-03 09:09:36 -0700339 char** pem_root_certs) {
Julien Boeufaaebf7a2016-01-28 17:04:42 -0800340 return GRPC_SSL_ROOTS_OVERRIDE_FAIL_PERMANENTLY;
341}
342
jiangtaoli2016144f5552018-03-23 11:28:48 -0700343namespace grpc_core {
344namespace {
345
346class TestDefafaultSllRootStore : public DefaultSslRootStore {
347 public:
348 static grpc_slice ComputePemRootCertsForTesting() {
349 return ComputePemRootCerts();
350 }
351};
352
353} // namespace
354} // namespace grpc_core
355
356// TODO: Convert this test to C++ test when security_connector implementation
357// is converted to C++.
Julien Boeuf373debd2016-01-27 15:41:12 -0800358static void test_default_ssl_roots(void) {
Craig Tillerbaa14a92017-11-03 09:09:36 -0700359 const char* roots_for_env_var = "roots for env var";
Julien Boeuf373debd2016-01-27 15:41:12 -0800360
Craig Tillerbaa14a92017-11-03 09:09:36 -0700361 char* roots_env_var_file_path;
362 FILE* roots_env_var_file =
Julien Boeuf373debd2016-01-27 15:41:12 -0800363 gpr_tmpfile("test_roots_for_env_var", &roots_env_var_file_path);
364 fwrite(roots_for_env_var, 1, strlen(roots_for_env_var), roots_env_var_file);
365 fclose(roots_env_var_file);
366
Julien Boeuf2757fa82016-01-29 22:13:24 -0800367 /* First let's get the root through the override: set the env to an invalid
368 value. */
369 gpr_setenv(GRPC_DEFAULT_SSL_ROOTS_FILE_PATH_ENV_VAR, "");
Julien Boeufaaebf7a2016-01-28 17:04:42 -0800370 grpc_set_ssl_roots_override_callback(override_roots_success);
jiangtaoli2016144f5552018-03-23 11:28:48 -0700371 grpc_slice roots =
372 grpc_core::TestDefafaultSllRootStore::ComputePemRootCertsForTesting();
Craig Tillerbaa14a92017-11-03 09:09:36 -0700373 char* roots_contents = grpc_slice_to_c_string(roots);
Craig Tillerd41a4a72016-10-26 16:16:06 -0700374 grpc_slice_unref(roots);
Julien Boeuf373debd2016-01-27 15:41:12 -0800375 GPR_ASSERT(strcmp(roots_contents, roots_for_override_api) == 0);
376 gpr_free(roots_contents);
377
378 /* Now let's set the env var: We should get the contents pointed value
379 instead. */
380 gpr_setenv(GRPC_DEFAULT_SSL_ROOTS_FILE_PATH_ENV_VAR, roots_env_var_file_path);
jiangtaoli2016144f5552018-03-23 11:28:48 -0700381 roots = grpc_core::TestDefafaultSllRootStore::ComputePemRootCertsForTesting();
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800382 roots_contents = grpc_slice_to_c_string(roots);
Craig Tillerd41a4a72016-10-26 16:16:06 -0700383 grpc_slice_unref(roots);
Julien Boeuf373debd2016-01-27 15:41:12 -0800384 GPR_ASSERT(strcmp(roots_contents, roots_for_env_var) == 0);
385 gpr_free(roots_contents);
386
387 /* Now reset the env var. We should fall back to the value overridden using
388 the api. */
389 gpr_setenv(GRPC_DEFAULT_SSL_ROOTS_FILE_PATH_ENV_VAR, "");
jiangtaoli2016144f5552018-03-23 11:28:48 -0700390 roots = grpc_core::TestDefafaultSllRootStore::ComputePemRootCertsForTesting();
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800391 roots_contents = grpc_slice_to_c_string(roots);
Craig Tillerd41a4a72016-10-26 16:16:06 -0700392 grpc_slice_unref(roots);
Julien Boeuf373debd2016-01-27 15:41:12 -0800393 GPR_ASSERT(strcmp(roots_contents, roots_for_override_api) == 0);
394 gpr_free(roots_contents);
395
Julien Boeufaaebf7a2016-01-28 17:04:42 -0800396 /* Now setup a permanent failure for the overridden roots and we should get
397 an empty slice. */
398 grpc_set_ssl_roots_override_callback(override_roots_permanent_failure);
jiangtaoli2016144f5552018-03-23 11:28:48 -0700399 roots = grpc_core::TestDefafaultSllRootStore::ComputePemRootCertsForTesting();
Craig Tiller618e67d2016-10-26 21:08:10 -0700400 GPR_ASSERT(GRPC_SLICE_IS_EMPTY(roots));
jiangtaoli2016144f5552018-03-23 11:28:48 -0700401 const tsi_ssl_root_certs_store* root_store =
402 grpc_core::TestDefafaultSllRootStore::GetRootStore();
403 GPR_ASSERT(root_store == nullptr);
Julien Boeufaaebf7a2016-01-28 17:04:42 -0800404
Julien Boeuf373debd2016-01-27 15:41:12 -0800405 /* Cleanup. */
Julien Boeuf373debd2016-01-27 15:41:12 -0800406 remove(roots_env_var_file_path);
Julien Boeuf373debd2016-01-27 15:41:12 -0800407 gpr_free(roots_env_var_file_path);
Julien Boeuf373debd2016-01-27 15:41:12 -0800408}
409
Craig Tillerbaa14a92017-11-03 09:09:36 -0700410int main(int argc, char** argv) {
Julien Boeufa701ade2015-06-18 15:23:40 +0200411 grpc_test_init(argc, argv);
412 grpc_init();
413
414 test_unauthenticated_ssl_peer();
415 test_cn_only_ssl_peer_to_auth_context();
416 test_cn_and_one_san_ssl_peer_to_auth_context();
417 test_cn_and_multiple_sans_ssl_peer_to_auth_context();
418 test_cn_and_multiple_sans_and_others_ssl_peer_to_auth_context();
Julien Boeuf373debd2016-01-27 15:41:12 -0800419 test_default_ssl_roots();
Julien Boeufa701ade2015-06-18 15:23:40 +0200420
421 grpc_shutdown();
422 return 0;
423}