grpc 1.16.0 → 1.17.0.pre1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (173) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +299 -133
  3. data/include/grpc/grpc.h +11 -1
  4. data/include/grpc/grpc_posix.h +0 -8
  5. data/include/grpc/impl/codegen/grpc_types.h +3 -0
  6. data/src/core/ext/filters/client_channel/client_channel.cc +336 -345
  7. data/src/core/ext/filters/client_channel/client_channel.h +6 -2
  8. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +3 -1
  9. data/src/core/ext/filters/client_channel/client_channel_channelz.h +0 -7
  10. data/src/core/ext/filters/client_channel/health/health.pb.c +23 -0
  11. data/src/core/ext/filters/client_channel/health/health.pb.h +73 -0
  12. data/src/core/ext/filters/client_channel/health/health_check_client.cc +652 -0
  13. data/src/core/ext/filters/client_channel/health/health_check_client.h +173 -0
  14. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +2 -1
  15. data/src/core/ext/filters/client_channel/http_proxy.cc +1 -1
  16. data/src/core/ext/filters/client_channel/lb_policy.h +17 -14
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +15 -11
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +21 -15
  19. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +18 -10
  20. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +12 -9
  21. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +19 -8
  22. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +1832 -0
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +36 -0
  24. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel.h +36 -0
  25. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc +107 -0
  26. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.cc +85 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.h +72 -0
  28. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.cc +307 -0
  29. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +89 -0
  30. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +5 -0
  32. data/src/core/ext/filters/client_channel/lb_policy_registry.h +4 -0
  33. data/src/core/ext/filters/client_channel/parse_address.h +1 -1
  34. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +19 -22
  35. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +41 -39
  36. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +3 -2
  37. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +4 -1
  38. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +15 -2
  39. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +5 -1
  40. data/src/core/ext/filters/client_channel/resolver_factory.h +1 -1
  41. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +384 -0
  42. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +146 -0
  43. data/src/core/ext/filters/client_channel/subchannel.cc +361 -103
  44. data/src/core/ext/filters/client_channel/subchannel.h +14 -8
  45. data/src/core/ext/filters/deadline/deadline_filter.cc +19 -23
  46. data/src/core/ext/filters/deadline/deadline_filter.h +9 -13
  47. data/src/core/ext/filters/http/client/http_client_filter.cc +29 -19
  48. data/src/core/ext/filters/http/client_authority_filter.cc +2 -3
  49. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +28 -16
  50. data/src/core/ext/filters/http/server/http_server_filter.cc +31 -20
  51. data/src/core/ext/filters/message_size/message_size_filter.cc +50 -45
  52. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +13 -6
  53. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +1 -1
  54. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +58 -8
  55. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +1 -1
  56. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +175 -173
  57. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +2 -1
  58. data/src/core/ext/transport/chttp2/transport/frame_data.cc +4 -10
  59. data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -12
  60. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -1
  61. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +28 -25
  62. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +0 -12
  63. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +12 -9
  64. data/src/core/ext/transport/chttp2/transport/internal.h +109 -94
  65. data/src/core/ext/transport/chttp2/transport/parsing.cc +4 -2
  66. data/src/core/ext/transport/inproc/inproc_transport.cc +280 -300
  67. data/src/core/lib/channel/channel_stack.cc +5 -4
  68. data/src/core/lib/channel/channel_stack.h +4 -4
  69. data/src/core/lib/channel/channel_stack_builder.cc +14 -2
  70. data/src/core/lib/channel/channel_stack_builder.h +8 -0
  71. data/src/core/lib/channel/channel_trace.cc +6 -2
  72. data/src/core/lib/channel/channelz.cc +137 -5
  73. data/src/core/lib/channel/channelz.h +32 -6
  74. data/src/core/lib/channel/channelz_registry.cc +134 -28
  75. data/src/core/lib/channel/channelz_registry.h +25 -3
  76. data/src/core/lib/channel/context.h +4 -4
  77. data/src/core/lib/channel/handshaker.cc +7 -6
  78. data/src/core/lib/channel/handshaker.h +7 -8
  79. data/src/core/lib/channel/handshaker_factory.cc +3 -2
  80. data/src/core/lib/channel/handshaker_factory.h +2 -0
  81. data/src/core/lib/channel/handshaker_registry.cc +6 -2
  82. data/src/core/lib/channel/handshaker_registry.h +1 -0
  83. data/src/core/lib/gpr/arena.cc +84 -37
  84. data/src/core/lib/gpr/arena.h +2 -0
  85. data/src/core/lib/gpr/mpscq.h +4 -2
  86. data/src/core/lib/gprpp/inlined_vector.h +8 -0
  87. data/src/core/lib/gprpp/ref_counted.h +105 -18
  88. data/src/core/lib/gprpp/ref_counted_ptr.h +11 -0
  89. data/src/core/lib/http/httpcli_security_connector.cc +7 -4
  90. data/src/core/lib/iomgr/call_combiner.cc +2 -0
  91. data/src/core/lib/iomgr/call_combiner.h +2 -2
  92. data/src/core/lib/iomgr/closure.h +1 -0
  93. data/src/core/lib/iomgr/error.cc +16 -31
  94. data/src/core/lib/iomgr/error.h +29 -4
  95. data/src/core/lib/iomgr/error_internal.h +0 -2
  96. data/src/core/lib/iomgr/ev_epoll1_linux.cc +7 -3
  97. data/src/core/lib/iomgr/ev_posix.cc +0 -2
  98. data/src/core/lib/iomgr/polling_entity.h +4 -4
  99. data/src/core/lib/iomgr/resource_quota.cc +64 -10
  100. data/src/core/lib/iomgr/resource_quota.h +21 -6
  101. data/src/core/lib/iomgr/socket_utils_common_posix.cc +11 -5
  102. data/src/core/lib/iomgr/tcp_client_custom.cc +14 -3
  103. data/src/core/lib/iomgr/tcp_client_posix.cc +2 -0
  104. data/src/core/lib/iomgr/tcp_posix.cc +4 -2
  105. data/src/core/lib/iomgr/timer_manager.cc +1 -1
  106. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +3 -4
  107. data/src/core/lib/security/context/security_context.cc +20 -13
  108. data/src/core/lib/security/context/security_context.h +27 -19
  109. data/src/core/lib/security/credentials/alts/alts_credentials.cc +1 -1
  110. data/src/core/lib/security/credentials/credentials.h +2 -2
  111. data/src/core/lib/security/credentials/fake/fake_credentials.cc +1 -0
  112. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +39 -54
  113. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +3 -2
  114. data/src/core/lib/security/credentials/local/local_credentials.cc +1 -1
  115. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +1 -2
  116. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +2 -0
  117. data/src/core/lib/security/security_connector/{alts_security_connector.cc → alts/alts_security_connector.cc} +10 -9
  118. data/src/core/lib/security/security_connector/{alts_security_connector.h → alts/alts_security_connector.h} +3 -3
  119. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +310 -0
  120. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +42 -0
  121. data/src/core/lib/security/security_connector/{local_security_connector.cc → local/local_security_connector.cc} +4 -3
  122. data/src/core/lib/security/security_connector/{local_security_connector.h → local/local_security_connector.h} +3 -3
  123. data/src/core/lib/security/security_connector/security_connector.cc +4 -1039
  124. data/src/core/lib/security/security_connector/security_connector.h +6 -114
  125. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +474 -0
  126. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +77 -0
  127. data/src/core/lib/security/security_connector/ssl_utils.cc +345 -0
  128. data/src/core/lib/security/security_connector/ssl_utils.h +93 -0
  129. data/src/core/lib/security/transport/client_auth_filter.cc +28 -17
  130. data/src/core/lib/security/transport/secure_endpoint.cc +51 -41
  131. data/src/core/lib/security/transport/security_handshaker.cc +6 -7
  132. data/src/core/lib/security/transport/server_auth_filter.cc +39 -31
  133. data/src/core/lib/surface/call.cc +100 -80
  134. data/src/core/lib/surface/call.h +4 -0
  135. data/src/core/lib/surface/channel.cc +27 -13
  136. data/src/core/lib/surface/channel.h +4 -3
  137. data/src/core/lib/surface/completion_queue.cc +8 -1
  138. data/src/core/lib/surface/init.cc +1 -0
  139. data/src/core/lib/surface/server.cc +111 -46
  140. data/src/core/lib/surface/server.h +16 -2
  141. data/src/core/lib/surface/version.cc +2 -2
  142. data/src/core/lib/transport/error_utils.cc +4 -2
  143. data/src/core/lib/transport/metadata.cc +3 -2
  144. data/src/core/lib/transport/metadata.h +3 -2
  145. data/src/core/lib/transport/metadata_batch.cc +1 -0
  146. data/src/core/lib/transport/metadata_batch.h +4 -2
  147. data/src/core/lib/transport/static_metadata.cc +225 -221
  148. data/src/core/lib/transport/static_metadata.h +74 -71
  149. data/src/core/lib/transport/transport.h +44 -26
  150. data/src/core/{ext/filters/client_channel → lib/uri}/uri_parser.cc +1 -1
  151. data/src/core/{ext/filters/client_channel → lib/uri}/uri_parser.h +3 -3
  152. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -4
  153. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +356 -77
  154. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +46 -36
  155. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +83 -0
  156. data/src/core/tsi/alts/handshaker/alts_shared_resource.h +73 -0
  157. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +122 -175
  158. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +33 -22
  159. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +38 -10
  160. data/src/core/tsi/transport_security.cc +18 -1
  161. data/src/core/tsi/transport_security.h +2 -1
  162. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -2
  163. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -3
  164. data/src/ruby/lib/grpc/version.rb +1 -1
  165. data/src/ruby/spec/pb/codegen/grpc/testing/package_options.proto +28 -0
  166. data/src/ruby/spec/pb/codegen/package_option_spec.rb +2 -3
  167. metadata +58 -40
  168. data/src/core/ext/filters/client_channel/method_params.cc +0 -178
  169. data/src/core/ext/filters/client_channel/method_params.h +0 -78
  170. data/src/core/tsi/alts/handshaker/alts_tsi_event.cc +0 -75
  171. data/src/core/tsi/alts/handshaker/alts_tsi_event.h +0 -93
  172. data/src/core/tsi/alts_transport_security.cc +0 -65
  173. data/src/core/tsi/alts_transport_security.h +0 -47
@@ -27,6 +27,7 @@
27
27
 
28
28
  #include "src/core/lib/channel/handshaker.h"
29
29
  #include "src/core/lib/iomgr/endpoint.h"
30
+ #include "src/core/lib/iomgr/pollset.h"
30
31
  #include "src/core/lib/iomgr/tcp_server.h"
31
32
  #include "src/core/tsi/ssl_transport_security.h"
32
33
  #include "src/core/tsi/transport_security_interface.h"
@@ -37,11 +38,6 @@ extern grpc_core::DebugOnlyTraceFlag grpc_trace_security_connector_refcount;
37
38
 
38
39
  typedef enum { GRPC_SECURITY_OK = 0, GRPC_SECURITY_ERROR } grpc_security_status;
39
40
 
40
- /* --- URL schemes. --- */
41
-
42
- #define GRPC_SSL_URL_SCHEME "https"
43
- #define GRPC_FAKE_SECURITY_URL_SCHEME "http+fake_security"
44
-
45
41
  /* --- security_connector object. ---
46
42
 
47
43
  A security connector object represents away to configure the underlying
@@ -125,6 +121,7 @@ struct grpc_channel_security_connector {
125
121
  grpc_closure* on_call_host_checked,
126
122
  grpc_error* error);
127
123
  void (*add_handshakers)(grpc_channel_security_connector* sc,
124
+ grpc_pollset_set* interested_parties,
128
125
  grpc_handshake_manager* handshake_mgr);
129
126
  };
130
127
 
@@ -151,6 +148,7 @@ void grpc_channel_security_connector_cancel_check_call_host(
151
148
  /* Registers handshakers with \a handshake_mgr. */
152
149
  void grpc_channel_security_connector_add_handshakers(
153
150
  grpc_channel_security_connector* connector,
151
+ grpc_pollset_set* interested_parties,
154
152
  grpc_handshake_manager* handshake_mgr);
155
153
 
156
154
  /* --- server_security_connector object. ---
@@ -164,6 +162,7 @@ struct grpc_server_security_connector {
164
162
  grpc_security_connector base;
165
163
  grpc_server_credentials* server_creds;
166
164
  void (*add_handshakers)(grpc_server_security_connector* sc,
165
+ grpc_pollset_set* interested_parties,
167
166
  grpc_handshake_manager* handshake_mgr);
168
167
  };
169
168
 
@@ -172,114 +171,7 @@ int grpc_server_security_connector_cmp(grpc_server_security_connector* sc1,
172
171
  grpc_server_security_connector* sc2);
173
172
 
174
173
  void grpc_server_security_connector_add_handshakers(
175
- grpc_server_security_connector* sc, grpc_handshake_manager* handshake_mgr);
176
-
177
- /* --- Creation security connectors. --- */
178
-
179
- /* For TESTING ONLY!
180
- Creates a fake connector that emulates real channel security. */
181
- grpc_channel_security_connector* grpc_fake_channel_security_connector_create(
182
- grpc_channel_credentials* channel_creds,
183
- grpc_call_credentials* request_metadata_creds, const char* target,
184
- const grpc_channel_args* args);
185
-
186
- /* For TESTING ONLY!
187
- Creates a fake connector that emulates real server security. */
188
- grpc_server_security_connector* grpc_fake_server_security_connector_create(
189
- grpc_server_credentials* server_creds);
190
-
191
- /* Config for ssl clients. */
192
-
193
- typedef struct {
194
- tsi_ssl_pem_key_cert_pair* pem_key_cert_pair;
195
- char* pem_root_certs;
196
- verify_peer_options verify_options;
197
- } grpc_ssl_config;
198
-
199
- /* Creates an SSL channel_security_connector.
200
- - request_metadata_creds is the credentials object which metadata
201
- will be sent with each request. This parameter can be NULL.
202
- - config is the SSL config to be used for the SSL channel establishment.
203
- - is_client should be 0 for a server or a non-0 value for a client.
204
- - secure_peer_name is the secure peer name that should be checked in
205
- grpc_channel_security_connector_check_peer. This parameter may be NULL in
206
- which case the peer name will not be checked. Note that if this parameter
207
- is not NULL, then, pem_root_certs should not be NULL either.
208
- - sc is a pointer on the connector to be created.
209
- This function returns GRPC_SECURITY_OK in case of success or a
210
- specific error code otherwise.
211
- */
212
- grpc_security_status grpc_ssl_channel_security_connector_create(
213
- grpc_channel_credentials* channel_creds,
214
- grpc_call_credentials* request_metadata_creds,
215
- const grpc_ssl_config* config, const char* target_name,
216
- const char* overridden_target_name,
217
- tsi_ssl_session_cache* ssl_session_cache,
218
- grpc_channel_security_connector** sc);
219
-
220
- /* Config for ssl servers. */
221
- typedef struct {
222
- tsi_ssl_pem_key_cert_pair* pem_key_cert_pairs;
223
- size_t num_key_cert_pairs;
224
- char* pem_root_certs;
225
- grpc_ssl_client_certificate_request_type client_certificate_request;
226
- } grpc_ssl_server_config;
227
-
228
- /* Creates an SSL server_security_connector.
229
- - config is the SSL config to be used for the SSL channel establishment.
230
- - sc is a pointer on the connector to be created.
231
- This function returns GRPC_SECURITY_OK in case of success or a
232
- specific error code otherwise.
233
- */
234
- grpc_security_status grpc_ssl_server_security_connector_create(
235
- grpc_server_credentials* server_credentials,
236
- grpc_server_security_connector** sc);
237
-
238
- /* Util. */
239
- const tsi_peer_property* tsi_peer_get_property_by_name(const tsi_peer* peer,
240
- const char* name);
241
-
242
- /* Exposed for testing only. */
243
- grpc_auth_context* grpc_ssl_peer_to_auth_context(const tsi_peer* peer);
244
- tsi_peer grpc_shallow_peer_from_ssl_auth_context(
245
- const grpc_auth_context* auth_context);
246
- void grpc_shallow_peer_destruct(tsi_peer* peer);
247
- int grpc_ssl_host_matches_name(const tsi_peer* peer, const char* peer_name);
248
-
249
- /* --- Default SSL Root Store. --- */
250
- namespace grpc_core {
251
-
252
- // The class implements default SSL root store.
253
- class DefaultSslRootStore {
254
- public:
255
- // Gets the default SSL root store. Returns nullptr if not found.
256
- static const tsi_ssl_root_certs_store* GetRootStore();
257
-
258
- // Gets the default PEM root certificate.
259
- static const char* GetPemRootCerts();
260
-
261
- protected:
262
- // Returns default PEM root certificates in nullptr terminated grpc_slice.
263
- // This function is protected instead of private, so that it can be tested.
264
- static grpc_slice ComputePemRootCerts();
265
-
266
- private:
267
- // Construct me not!
268
- DefaultSslRootStore();
269
-
270
- // Initialization of default SSL root store.
271
- static void InitRootStore();
272
-
273
- // One-time initialization of default SSL root store.
274
- static void InitRootStoreOnce();
275
-
276
- // SSL root store in tsi_ssl_root_certs_store object.
277
- static tsi_ssl_root_certs_store* default_root_store_;
278
-
279
- // Default PEM root certificates.
280
- static grpc_slice default_pem_root_certs_;
281
- };
282
-
283
- } // namespace grpc_core
174
+ grpc_server_security_connector* sc, grpc_pollset_set* interested_parties,
175
+ grpc_handshake_manager* handshake_mgr);
284
176
 
285
177
  #endif /* GRPC_CORE_LIB_SECURITY_SECURITY_CONNECTOR_SECURITY_CONNECTOR_H */
@@ -0,0 +1,474 @@
1
+ /*
2
+ *
3
+ * Copyright 2018 gRPC authors.
4
+ *
5
+ * 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
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * 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.
16
+ *
17
+ */
18
+
19
+ #include <grpc/support/port_platform.h>
20
+
21
+ #include "src/core/lib/security/security_connector/ssl/ssl_security_connector.h"
22
+
23
+ #include <stdbool.h>
24
+
25
+ #include <grpc/support/alloc.h>
26
+ #include <grpc/support/log.h>
27
+ #include <grpc/support/string_util.h>
28
+
29
+ #include "src/core/ext/transport/chttp2/alpn/alpn.h"
30
+ #include "src/core/lib/channel/handshaker.h"
31
+ #include "src/core/lib/gpr/host_port.h"
32
+ #include "src/core/lib/gpr/string.h"
33
+ #include "src/core/lib/security/context/security_context.h"
34
+ #include "src/core/lib/security/credentials/credentials.h"
35
+ #include "src/core/lib/security/credentials/ssl/ssl_credentials.h"
36
+ #include "src/core/lib/security/security_connector/load_system_roots.h"
37
+ #include "src/core/lib/security/security_connector/ssl_utils.h"
38
+ #include "src/core/lib/security/transport/security_handshaker.h"
39
+ #include "src/core/tsi/ssl_transport_security.h"
40
+ #include "src/core/tsi/transport_security.h"
41
+
42
+ typedef struct {
43
+ grpc_channel_security_connector base;
44
+ tsi_ssl_client_handshaker_factory* client_handshaker_factory;
45
+ char* target_name;
46
+ char* overridden_target_name;
47
+ const verify_peer_options* verify_options;
48
+ } grpc_ssl_channel_security_connector;
49
+
50
+ typedef struct {
51
+ grpc_server_security_connector base;
52
+ tsi_ssl_server_handshaker_factory* server_handshaker_factory;
53
+ } grpc_ssl_server_security_connector;
54
+
55
+ static bool server_connector_has_cert_config_fetcher(
56
+ grpc_ssl_server_security_connector* c) {
57
+ GPR_ASSERT(c != nullptr);
58
+ grpc_ssl_server_credentials* server_creds =
59
+ reinterpret_cast<grpc_ssl_server_credentials*>(c->base.server_creds);
60
+ GPR_ASSERT(server_creds != nullptr);
61
+ return server_creds->certificate_config_fetcher.cb != nullptr;
62
+ }
63
+
64
+ static void ssl_channel_destroy(grpc_security_connector* sc) {
65
+ grpc_ssl_channel_security_connector* c =
66
+ reinterpret_cast<grpc_ssl_channel_security_connector*>(sc);
67
+ grpc_channel_credentials_unref(c->base.channel_creds);
68
+ grpc_call_credentials_unref(c->base.request_metadata_creds);
69
+ tsi_ssl_client_handshaker_factory_unref(c->client_handshaker_factory);
70
+ c->client_handshaker_factory = nullptr;
71
+ if (c->target_name != nullptr) gpr_free(c->target_name);
72
+ if (c->overridden_target_name != nullptr) gpr_free(c->overridden_target_name);
73
+ gpr_free(sc);
74
+ }
75
+
76
+ static void ssl_server_destroy(grpc_security_connector* sc) {
77
+ grpc_ssl_server_security_connector* c =
78
+ reinterpret_cast<grpc_ssl_server_security_connector*>(sc);
79
+ grpc_server_credentials_unref(c->base.server_creds);
80
+ tsi_ssl_server_handshaker_factory_unref(c->server_handshaker_factory);
81
+ c->server_handshaker_factory = nullptr;
82
+ gpr_free(sc);
83
+ }
84
+
85
+ static void ssl_channel_add_handshakers(grpc_channel_security_connector* sc,
86
+ grpc_pollset_set* interested_parties,
87
+ grpc_handshake_manager* handshake_mgr) {
88
+ grpc_ssl_channel_security_connector* c =
89
+ reinterpret_cast<grpc_ssl_channel_security_connector*>(sc);
90
+ // Instantiate TSI handshaker.
91
+ tsi_handshaker* tsi_hs = nullptr;
92
+ tsi_result result = tsi_ssl_client_handshaker_factory_create_handshaker(
93
+ c->client_handshaker_factory,
94
+ c->overridden_target_name != nullptr ? c->overridden_target_name
95
+ : c->target_name,
96
+ &tsi_hs);
97
+ if (result != TSI_OK) {
98
+ gpr_log(GPR_ERROR, "Handshaker creation failed with error %s.",
99
+ tsi_result_to_string(result));
100
+ return;
101
+ }
102
+ // Create handshakers.
103
+ grpc_handshake_manager_add(
104
+ handshake_mgr, grpc_security_handshaker_create(tsi_hs, &sc->base));
105
+ }
106
+
107
+ /* Attempts to replace the server_handshaker_factory with a new factory using
108
+ * the provided grpc_ssl_server_certificate_config. Should new factory creation
109
+ * fail, the existing factory will not be replaced. Returns true on success (new
110
+ * factory created). */
111
+ static bool try_replace_server_handshaker_factory(
112
+ grpc_ssl_server_security_connector* sc,
113
+ const grpc_ssl_server_certificate_config* config) {
114
+ if (config == nullptr) {
115
+ gpr_log(GPR_ERROR,
116
+ "Server certificate config callback returned invalid (NULL) "
117
+ "config.");
118
+ return false;
119
+ }
120
+ gpr_log(GPR_DEBUG, "Using new server certificate config (%p).", config);
121
+
122
+ size_t num_alpn_protocols = 0;
123
+ const char** alpn_protocol_strings =
124
+ grpc_fill_alpn_protocol_strings(&num_alpn_protocols);
125
+ tsi_ssl_pem_key_cert_pair* cert_pairs = grpc_convert_grpc_to_tsi_cert_pairs(
126
+ config->pem_key_cert_pairs, config->num_key_cert_pairs);
127
+ tsi_ssl_server_handshaker_factory* new_handshaker_factory = nullptr;
128
+ grpc_ssl_server_credentials* server_creds =
129
+ reinterpret_cast<grpc_ssl_server_credentials*>(sc->base.server_creds);
130
+ tsi_result result = tsi_create_ssl_server_handshaker_factory_ex(
131
+ cert_pairs, config->num_key_cert_pairs, config->pem_root_certs,
132
+ grpc_get_tsi_client_certificate_request_type(
133
+ server_creds->config.client_certificate_request),
134
+ grpc_get_ssl_cipher_suites(), alpn_protocol_strings,
135
+ static_cast<uint16_t>(num_alpn_protocols), &new_handshaker_factory);
136
+ gpr_free(cert_pairs);
137
+ gpr_free((void*)alpn_protocol_strings);
138
+
139
+ if (result != TSI_OK) {
140
+ gpr_log(GPR_ERROR, "Handshaker factory creation failed with %s.",
141
+ tsi_result_to_string(result));
142
+ return false;
143
+ }
144
+ tsi_ssl_server_handshaker_factory_unref(sc->server_handshaker_factory);
145
+ sc->server_handshaker_factory = new_handshaker_factory;
146
+ return true;
147
+ }
148
+
149
+ /* Attempts to fetch the server certificate config if a callback is available.
150
+ * Current certificate config will continue to be used if the callback returns
151
+ * an error. Returns true if new credentials were sucessfully loaded. */
152
+ static bool try_fetch_ssl_server_credentials(
153
+ grpc_ssl_server_security_connector* sc) {
154
+ grpc_ssl_server_certificate_config* certificate_config = nullptr;
155
+ bool status;
156
+
157
+ GPR_ASSERT(sc != nullptr);
158
+ if (!server_connector_has_cert_config_fetcher(sc)) return false;
159
+
160
+ grpc_ssl_server_credentials* server_creds =
161
+ reinterpret_cast<grpc_ssl_server_credentials*>(sc->base.server_creds);
162
+ grpc_ssl_certificate_config_reload_status cb_result =
163
+ server_creds->certificate_config_fetcher.cb(
164
+ server_creds->certificate_config_fetcher.user_data,
165
+ &certificate_config);
166
+ if (cb_result == GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED) {
167
+ gpr_log(GPR_DEBUG, "No change in SSL server credentials.");
168
+ status = false;
169
+ } else if (cb_result == GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW) {
170
+ status = try_replace_server_handshaker_factory(sc, certificate_config);
171
+ } else {
172
+ // Log error, continue using previously-loaded credentials.
173
+ gpr_log(GPR_ERROR,
174
+ "Failed fetching new server credentials, continuing to "
175
+ "use previously-loaded credentials.");
176
+ status = false;
177
+ }
178
+
179
+ if (certificate_config != nullptr) {
180
+ grpc_ssl_server_certificate_config_destroy(certificate_config);
181
+ }
182
+ return status;
183
+ }
184
+
185
+ static void ssl_server_add_handshakers(grpc_server_security_connector* sc,
186
+ grpc_pollset_set* interested_parties,
187
+ grpc_handshake_manager* handshake_mgr) {
188
+ grpc_ssl_server_security_connector* c =
189
+ reinterpret_cast<grpc_ssl_server_security_connector*>(sc);
190
+ // Instantiate TSI handshaker.
191
+ try_fetch_ssl_server_credentials(c);
192
+ tsi_handshaker* tsi_hs = nullptr;
193
+ tsi_result result = tsi_ssl_server_handshaker_factory_create_handshaker(
194
+ c->server_handshaker_factory, &tsi_hs);
195
+ if (result != TSI_OK) {
196
+ gpr_log(GPR_ERROR, "Handshaker creation failed with error %s.",
197
+ tsi_result_to_string(result));
198
+ return;
199
+ }
200
+ // Create handshakers.
201
+ grpc_handshake_manager_add(
202
+ handshake_mgr, grpc_security_handshaker_create(tsi_hs, &sc->base));
203
+ }
204
+
205
+ static grpc_error* ssl_check_peer(grpc_security_connector* sc,
206
+ const char* peer_name, const tsi_peer* peer,
207
+ grpc_auth_context** auth_context) {
208
+ #if TSI_OPENSSL_ALPN_SUPPORT
209
+ /* Check the ALPN if ALPN is supported. */
210
+ const tsi_peer_property* p =
211
+ tsi_peer_get_property_by_name(peer, TSI_SSL_ALPN_SELECTED_PROTOCOL);
212
+ if (p == nullptr) {
213
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
214
+ "Cannot check peer: missing selected ALPN property.");
215
+ }
216
+ if (!grpc_chttp2_is_alpn_version_supported(p->value.data, p->value.length)) {
217
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
218
+ "Cannot check peer: invalid ALPN value.");
219
+ }
220
+ #endif /* TSI_OPENSSL_ALPN_SUPPORT */
221
+ /* Check the peer name if specified. */
222
+ if (peer_name != nullptr && !grpc_ssl_host_matches_name(peer, peer_name)) {
223
+ char* msg;
224
+ gpr_asprintf(&msg, "Peer name %s is not in peer certificate", peer_name);
225
+ grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg);
226
+ gpr_free(msg);
227
+ return error;
228
+ }
229
+ *auth_context = grpc_ssl_peer_to_auth_context(peer);
230
+ return GRPC_ERROR_NONE;
231
+ }
232
+
233
+ static void ssl_channel_check_peer(grpc_security_connector* sc, tsi_peer peer,
234
+ grpc_auth_context** auth_context,
235
+ grpc_closure* on_peer_checked) {
236
+ grpc_ssl_channel_security_connector* c =
237
+ reinterpret_cast<grpc_ssl_channel_security_connector*>(sc);
238
+ const char* target_name = c->overridden_target_name != nullptr
239
+ ? c->overridden_target_name
240
+ : c->target_name;
241
+ grpc_error* error = ssl_check_peer(sc, target_name, &peer, auth_context);
242
+ if (error == GRPC_ERROR_NONE &&
243
+ c->verify_options->verify_peer_callback != nullptr) {
244
+ const tsi_peer_property* p =
245
+ tsi_peer_get_property_by_name(&peer, TSI_X509_PEM_CERT_PROPERTY);
246
+ if (p == nullptr) {
247
+ error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
248
+ "Cannot check peer: missing pem cert property.");
249
+ } else {
250
+ char* peer_pem = static_cast<char*>(gpr_malloc(p->value.length + 1));
251
+ memcpy(peer_pem, p->value.data, p->value.length);
252
+ peer_pem[p->value.length] = '\0';
253
+ int callback_status = c->verify_options->verify_peer_callback(
254
+ target_name, peer_pem,
255
+ c->verify_options->verify_peer_callback_userdata);
256
+ gpr_free(peer_pem);
257
+ if (callback_status) {
258
+ char* msg;
259
+ gpr_asprintf(&msg, "Verify peer callback returned a failure (%d)",
260
+ callback_status);
261
+ error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg);
262
+ gpr_free(msg);
263
+ }
264
+ }
265
+ }
266
+ GRPC_CLOSURE_SCHED(on_peer_checked, error);
267
+ tsi_peer_destruct(&peer);
268
+ }
269
+
270
+ static void ssl_server_check_peer(grpc_security_connector* sc, tsi_peer peer,
271
+ grpc_auth_context** auth_context,
272
+ grpc_closure* on_peer_checked) {
273
+ grpc_error* error = ssl_check_peer(sc, nullptr, &peer, auth_context);
274
+ tsi_peer_destruct(&peer);
275
+ GRPC_CLOSURE_SCHED(on_peer_checked, error);
276
+ }
277
+
278
+ static int ssl_channel_cmp(grpc_security_connector* sc1,
279
+ grpc_security_connector* sc2) {
280
+ grpc_ssl_channel_security_connector* c1 =
281
+ reinterpret_cast<grpc_ssl_channel_security_connector*>(sc1);
282
+ grpc_ssl_channel_security_connector* c2 =
283
+ reinterpret_cast<grpc_ssl_channel_security_connector*>(sc2);
284
+ int c = grpc_channel_security_connector_cmp(&c1->base, &c2->base);
285
+ if (c != 0) return c;
286
+ c = strcmp(c1->target_name, c2->target_name);
287
+ if (c != 0) return c;
288
+ return (c1->overridden_target_name == nullptr ||
289
+ c2->overridden_target_name == nullptr)
290
+ ? GPR_ICMP(c1->overridden_target_name, c2->overridden_target_name)
291
+ : strcmp(c1->overridden_target_name, c2->overridden_target_name);
292
+ }
293
+
294
+ static int ssl_server_cmp(grpc_security_connector* sc1,
295
+ grpc_security_connector* sc2) {
296
+ return grpc_server_security_connector_cmp(
297
+ reinterpret_cast<grpc_server_security_connector*>(sc1),
298
+ reinterpret_cast<grpc_server_security_connector*>(sc2));
299
+ }
300
+
301
+ static bool ssl_channel_check_call_host(grpc_channel_security_connector* sc,
302
+ const char* host,
303
+ grpc_auth_context* auth_context,
304
+ grpc_closure* on_call_host_checked,
305
+ grpc_error** error) {
306
+ grpc_ssl_channel_security_connector* c =
307
+ reinterpret_cast<grpc_ssl_channel_security_connector*>(sc);
308
+ grpc_security_status status = GRPC_SECURITY_ERROR;
309
+ tsi_peer peer = grpc_shallow_peer_from_ssl_auth_context(auth_context);
310
+ if (grpc_ssl_host_matches_name(&peer, host)) status = GRPC_SECURITY_OK;
311
+ /* If the target name was overridden, then the original target_name was
312
+ 'checked' transitively during the previous peer check at the end of the
313
+ handshake. */
314
+ if (c->overridden_target_name != nullptr &&
315
+ strcmp(host, c->target_name) == 0) {
316
+ status = GRPC_SECURITY_OK;
317
+ }
318
+ if (status != GRPC_SECURITY_OK) {
319
+ *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
320
+ "call host does not match SSL server name");
321
+ }
322
+ grpc_shallow_peer_destruct(&peer);
323
+ return true;
324
+ }
325
+
326
+ static void ssl_channel_cancel_check_call_host(
327
+ grpc_channel_security_connector* sc, grpc_closure* on_call_host_checked,
328
+ grpc_error* error) {
329
+ GRPC_ERROR_UNREF(error);
330
+ }
331
+
332
+ static grpc_security_connector_vtable ssl_channel_vtable = {
333
+ ssl_channel_destroy, ssl_channel_check_peer, ssl_channel_cmp};
334
+
335
+ static grpc_security_connector_vtable ssl_server_vtable = {
336
+ ssl_server_destroy, ssl_server_check_peer, ssl_server_cmp};
337
+
338
+ grpc_security_status grpc_ssl_channel_security_connector_create(
339
+ grpc_channel_credentials* channel_creds,
340
+ grpc_call_credentials* request_metadata_creds,
341
+ const grpc_ssl_config* config, const char* target_name,
342
+ const char* overridden_target_name,
343
+ tsi_ssl_session_cache* ssl_session_cache,
344
+ grpc_channel_security_connector** sc) {
345
+ tsi_result result = TSI_OK;
346
+ grpc_ssl_channel_security_connector* c;
347
+ char* port;
348
+ bool has_key_cert_pair;
349
+ tsi_ssl_client_handshaker_options options;
350
+ memset(&options, 0, sizeof(options));
351
+ options.alpn_protocols =
352
+ grpc_fill_alpn_protocol_strings(&options.num_alpn_protocols);
353
+
354
+ if (config == nullptr || target_name == nullptr) {
355
+ gpr_log(GPR_ERROR, "An ssl channel needs a config and a target name.");
356
+ goto error;
357
+ }
358
+ if (config->pem_root_certs == nullptr) {
359
+ // Use default root certificates.
360
+ options.pem_root_certs = grpc_core::DefaultSslRootStore::GetPemRootCerts();
361
+ options.root_store = grpc_core::DefaultSslRootStore::GetRootStore();
362
+ if (options.pem_root_certs == nullptr) {
363
+ gpr_log(GPR_ERROR, "Could not get default pem root certs.");
364
+ goto error;
365
+ }
366
+ } else {
367
+ options.pem_root_certs = config->pem_root_certs;
368
+ }
369
+ c = static_cast<grpc_ssl_channel_security_connector*>(
370
+ gpr_zalloc(sizeof(grpc_ssl_channel_security_connector)));
371
+
372
+ gpr_ref_init(&c->base.base.refcount, 1);
373
+ c->base.base.vtable = &ssl_channel_vtable;
374
+ c->base.base.url_scheme = GRPC_SSL_URL_SCHEME;
375
+ c->base.channel_creds = grpc_channel_credentials_ref(channel_creds);
376
+ c->base.request_metadata_creds =
377
+ grpc_call_credentials_ref(request_metadata_creds);
378
+ c->base.check_call_host = ssl_channel_check_call_host;
379
+ c->base.cancel_check_call_host = ssl_channel_cancel_check_call_host;
380
+ c->base.add_handshakers = ssl_channel_add_handshakers;
381
+ gpr_split_host_port(target_name, &c->target_name, &port);
382
+ gpr_free(port);
383
+ if (overridden_target_name != nullptr) {
384
+ c->overridden_target_name = gpr_strdup(overridden_target_name);
385
+ }
386
+ c->verify_options = &config->verify_options;
387
+
388
+ has_key_cert_pair = config->pem_key_cert_pair != nullptr &&
389
+ config->pem_key_cert_pair->private_key != nullptr &&
390
+ config->pem_key_cert_pair->cert_chain != nullptr;
391
+ if (has_key_cert_pair) {
392
+ options.pem_key_cert_pair = config->pem_key_cert_pair;
393
+ }
394
+ options.cipher_suites = grpc_get_ssl_cipher_suites();
395
+ options.session_cache = ssl_session_cache;
396
+ result = tsi_create_ssl_client_handshaker_factory_with_options(
397
+ &options, &c->client_handshaker_factory);
398
+ if (result != TSI_OK) {
399
+ gpr_log(GPR_ERROR, "Handshaker factory creation failed with %s.",
400
+ tsi_result_to_string(result));
401
+ ssl_channel_destroy(&c->base.base);
402
+ *sc = nullptr;
403
+ goto error;
404
+ }
405
+ *sc = &c->base;
406
+ gpr_free((void*)options.alpn_protocols);
407
+ return GRPC_SECURITY_OK;
408
+
409
+ error:
410
+ gpr_free((void*)options.alpn_protocols);
411
+ return GRPC_SECURITY_ERROR;
412
+ }
413
+
414
+ static grpc_ssl_server_security_connector*
415
+ grpc_ssl_server_security_connector_initialize(
416
+ grpc_server_credentials* server_creds) {
417
+ grpc_ssl_server_security_connector* c =
418
+ static_cast<grpc_ssl_server_security_connector*>(
419
+ gpr_zalloc(sizeof(grpc_ssl_server_security_connector)));
420
+ gpr_ref_init(&c->base.base.refcount, 1);
421
+ c->base.base.url_scheme = GRPC_SSL_URL_SCHEME;
422
+ c->base.base.vtable = &ssl_server_vtable;
423
+ c->base.add_handshakers = ssl_server_add_handshakers;
424
+ c->base.server_creds = grpc_server_credentials_ref(server_creds);
425
+ return c;
426
+ }
427
+
428
+ grpc_security_status grpc_ssl_server_security_connector_create(
429
+ grpc_server_credentials* gsc, grpc_server_security_connector** sc) {
430
+ tsi_result result = TSI_OK;
431
+ grpc_ssl_server_credentials* server_credentials =
432
+ reinterpret_cast<grpc_ssl_server_credentials*>(gsc);
433
+ grpc_security_status retval = GRPC_SECURITY_OK;
434
+
435
+ GPR_ASSERT(server_credentials != nullptr);
436
+ GPR_ASSERT(sc != nullptr);
437
+
438
+ grpc_ssl_server_security_connector* c =
439
+ grpc_ssl_server_security_connector_initialize(gsc);
440
+ if (server_connector_has_cert_config_fetcher(c)) {
441
+ // Load initial credentials from certificate_config_fetcher:
442
+ if (!try_fetch_ssl_server_credentials(c)) {
443
+ gpr_log(GPR_ERROR, "Failed loading SSL server credentials from fetcher.");
444
+ retval = GRPC_SECURITY_ERROR;
445
+ }
446
+ } else {
447
+ size_t num_alpn_protocols = 0;
448
+ const char** alpn_protocol_strings =
449
+ grpc_fill_alpn_protocol_strings(&num_alpn_protocols);
450
+ result = tsi_create_ssl_server_handshaker_factory_ex(
451
+ server_credentials->config.pem_key_cert_pairs,
452
+ server_credentials->config.num_key_cert_pairs,
453
+ server_credentials->config.pem_root_certs,
454
+ grpc_get_tsi_client_certificate_request_type(
455
+ server_credentials->config.client_certificate_request),
456
+ grpc_get_ssl_cipher_suites(), alpn_protocol_strings,
457
+ static_cast<uint16_t>(num_alpn_protocols),
458
+ &c->server_handshaker_factory);
459
+ gpr_free((void*)alpn_protocol_strings);
460
+ if (result != TSI_OK) {
461
+ gpr_log(GPR_ERROR, "Handshaker factory creation failed with %s.",
462
+ tsi_result_to_string(result));
463
+ retval = GRPC_SECURITY_ERROR;
464
+ }
465
+ }
466
+
467
+ if (retval == GRPC_SECURITY_OK) {
468
+ *sc = &c->base;
469
+ } else {
470
+ if (c != nullptr) ssl_server_destroy(&c->base.base);
471
+ if (sc != nullptr) *sc = nullptr;
472
+ }
473
+ return retval;
474
+ }