grpc 1.33.0.pre1 → 1.34.0

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 (533) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +342 -134
  3. data/include/grpc/grpc.h +1 -2
  4. data/include/grpc/grpc_security.h +149 -172
  5. data/include/grpc/impl/codegen/grpc_types.h +9 -2
  6. data/include/grpc/impl/codegen/port_platform.h +22 -55
  7. data/src/core/ext/filters/client_channel/client_channel.cc +11 -34
  8. data/src/core/ext/filters/client_channel/config_selector.h +2 -3
  9. data/src/core/ext/filters/client_channel/health/health_check_client.cc +4 -1
  10. data/src/core/ext/filters/client_channel/health/health_check_client.h +2 -2
  11. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
  12. data/src/core/ext/filters/client_channel/lb_policy.cc +5 -1
  13. data/src/core/ext/filters/client_channel/lb_policy.h +3 -3
  14. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +1 -1
  15. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +1 -1
  16. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +80 -71
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +3 -1
  18. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +2 -2
  19. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +47 -17
  20. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +2 -2
  21. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +8 -5
  22. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +3 -3
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +1 -1
  24. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +16 -243
  25. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +53 -17
  26. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +809 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +20 -25
  28. data/src/core/ext/filters/client_channel/resolver.cc +3 -1
  29. data/src/core/ext/filters/client_channel/resolver.h +4 -1
  30. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +1 -1
  31. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +1 -1
  32. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +1 -1
  33. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -1
  34. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +1 -1
  35. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +20 -0
  36. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +66 -7
  37. data/src/core/ext/filters/client_channel/resolver_registry.cc +4 -4
  38. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +13 -25
  39. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +1 -1
  40. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +2 -2
  41. data/src/core/ext/filters/client_channel/retry_throttle.h +1 -1
  42. data/src/core/ext/filters/client_channel/server_address.h +0 -4
  43. data/src/core/ext/filters/client_channel/service_config.cc +3 -1
  44. data/src/core/ext/filters/client_channel/service_config.h +1 -1
  45. data/src/core/ext/filters/client_channel/subchannel.cc +18 -15
  46. data/src/core/ext/filters/client_channel/subchannel.h +2 -2
  47. data/src/core/ext/filters/client_channel/subchannel_interface.h +7 -15
  48. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +6 -2
  49. data/src/core/ext/filters/deadline/deadline_filter.cc +83 -77
  50. data/src/core/ext/filters/deadline/deadline_filter.h +7 -11
  51. data/src/core/ext/filters/http/client/http_client_filter.cc +1 -1
  52. data/src/core/ext/filters/http/server/http_server_filter.cc +3 -3
  53. data/src/core/ext/filters/max_age/max_age_filter.cc +1 -1
  54. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +1 -1
  55. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +17 -3
  56. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +7 -7
  57. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +4 -24
  58. data/src/core/ext/transport/chttp2/transport/flow_control.h +2 -2
  59. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
  60. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +12 -8
  61. data/src/core/ext/transport/chttp2/transport/internal.h +0 -1
  62. data/src/core/ext/transport/chttp2/transport/parsing.cc +2 -1
  63. data/src/core/ext/transport/chttp2/transport/writing.cc +1 -2
  64. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +38 -0
  65. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h +30 -0
  66. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +41 -0
  67. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h +35 -0
  68. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +254 -0
  69. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h +105 -0
  70. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +100 -0
  71. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h +45 -0
  72. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +558 -0
  73. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +145 -0
  74. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +53 -0
  75. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h +35 -0
  76. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +133 -0
  77. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h +35 -0
  78. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +127 -0
  79. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h +65 -0
  80. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +56 -0
  81. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h +35 -0
  82. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +266 -0
  83. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +125 -0
  84. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +143 -0
  85. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +55 -0
  86. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +56 -0
  87. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h +35 -0
  88. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +66 -0
  89. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +40 -0
  90. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +263 -0
  91. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h +100 -0
  92. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +233 -0
  93. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +70 -0
  94. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +56 -0
  95. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h +35 -0
  96. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +228 -0
  97. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +80 -0
  98. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +46 -0
  99. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h +35 -0
  100. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +59 -0
  101. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h +35 -0
  102. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +55 -0
  103. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h +35 -0
  104. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +110 -0
  105. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h +50 -0
  106. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +113 -0
  107. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +50 -0
  108. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +146 -0
  109. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h +55 -0
  110. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +50 -0
  111. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h +35 -0
  112. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +190 -0
  113. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +55 -0
  114. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +185 -0
  115. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h +65 -0
  116. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +62 -0
  117. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h +40 -0
  118. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +97 -0
  119. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +40 -0
  120. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +915 -0
  121. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +280 -0
  122. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +71 -0
  123. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h +45 -0
  124. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +64 -0
  125. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h +40 -0
  126. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +511 -0
  127. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +115 -0
  128. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +48 -0
  129. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h +30 -0
  130. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +166 -0
  131. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h +55 -0
  132. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +105 -0
  133. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h +45 -0
  134. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +249 -0
  135. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +60 -0
  136. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +72 -0
  137. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h +35 -0
  138. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +60 -0
  139. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h +35 -0
  140. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +152 -0
  141. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +60 -0
  142. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +83 -0
  143. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h +35 -0
  144. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +82 -0
  145. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h +35 -0
  146. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +83 -0
  147. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h +40 -0
  148. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +86 -0
  149. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h +35 -0
  150. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +74 -0
  151. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h +35 -0
  152. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +64 -0
  153. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h +40 -0
  154. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +54 -0
  155. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h +35 -0
  156. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +53 -0
  157. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h +35 -0
  158. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +73 -0
  159. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h +45 -0
  160. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +72 -0
  161. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h +40 -0
  162. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +81 -0
  163. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h +45 -0
  164. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +92 -0
  165. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h +65 -0
  166. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +95 -0
  167. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h +55 -0
  168. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +34 -0
  169. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.h +30 -0
  170. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +59 -0
  171. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h +40 -0
  172. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +54 -0
  173. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h +45 -0
  174. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +47 -0
  175. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h +35 -0
  176. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +40 -0
  177. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h +30 -0
  178. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +61 -0
  179. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.h +45 -0
  180. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +38 -0
  181. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h +35 -0
  182. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +386 -0
  183. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h +165 -0
  184. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +39 -0
  185. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h +35 -0
  186. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +37 -0
  187. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h +35 -0
  188. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +65 -0
  189. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h +50 -0
  190. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +39 -0
  191. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h +35 -0
  192. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +66 -0
  193. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h +75 -0
  194. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +42 -0
  195. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h +35 -0
  196. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +70 -0
  197. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h +45 -0
  198. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +56 -0
  199. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h +35 -0
  200. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +33 -0
  201. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h +30 -0
  202. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +49 -0
  203. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h +35 -0
  204. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +43 -0
  205. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h +35 -0
  206. data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c +42 -0
  207. data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h +35 -0
  208. data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c +62 -0
  209. data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h +40 -0
  210. data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c +45 -0
  211. data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h +40 -0
  212. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c +49 -0
  213. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h +35 -0
  214. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c +68 -0
  215. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h +40 -0
  216. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c +51 -0
  217. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h +35 -0
  218. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +307 -0
  219. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.h +145 -0
  220. data/src/core/ext/xds/certificate_provider_factory.h +7 -5
  221. data/src/core/ext/xds/certificate_provider_store.cc +84 -0
  222. data/src/core/ext/xds/certificate_provider_store.h +65 -8
  223. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +119 -0
  224. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +72 -0
  225. data/src/core/ext/xds/google_mesh_ca_certificate_provider_factory.cc +28 -140
  226. data/src/core/ext/xds/google_mesh_ca_certificate_provider_factory.h +6 -4
  227. data/src/core/ext/xds/xds_api.cc +241 -718
  228. data/src/core/ext/xds/xds_api.h +50 -9
  229. data/src/core/ext/xds/xds_bootstrap.cc +172 -25
  230. data/src/core/ext/xds/xds_bootstrap.h +23 -7
  231. data/src/core/ext/xds/xds_certificate_provider.cc +240 -0
  232. data/src/core/ext/xds/xds_certificate_provider.h +74 -0
  233. data/src/core/ext/xds/xds_client.cc +161 -128
  234. data/src/core/ext/xds/xds_client.h +12 -11
  235. data/src/core/ext/xds/xds_client_stats.cc +41 -4
  236. data/src/core/ext/xds/xds_client_stats.h +2 -2
  237. data/src/core/lib/channel/channel_args.cc +2 -1
  238. data/src/core/lib/channel/channel_trace.cc +4 -2
  239. data/src/core/lib/channel/channelz.h +2 -2
  240. data/src/core/lib/channel/handshaker.h +2 -2
  241. data/src/core/lib/compression/compression.cc +8 -4
  242. data/src/core/lib/compression/compression_internal.cc +10 -5
  243. data/src/core/lib/compression/compression_internal.h +2 -1
  244. data/src/core/lib/compression/stream_compression_identity.cc +1 -3
  245. data/src/core/lib/debug/stats_data.cc +1 -0
  246. data/src/core/lib/gpr/cpu_iphone.cc +10 -2
  247. data/src/core/lib/gpr/log_linux.cc +17 -3
  248. data/src/core/lib/gpr/log_posix.cc +13 -1
  249. data/src/core/lib/gpr/log_windows.cc +16 -4
  250. data/src/core/lib/gpr/murmur_hash.cc +1 -1
  251. data/src/core/lib/gpr/string.cc +1 -1
  252. data/src/core/lib/gpr/time_precise.cc +3 -2
  253. data/src/core/lib/gpr/tls.h +4 -0
  254. data/src/core/lib/gpr/tls_msvc.h +2 -0
  255. data/src/core/lib/gpr/tls_stdcpp.h +48 -0
  256. data/src/core/lib/gpr/useful.h +5 -4
  257. data/src/core/lib/gprpp/dual_ref_counted.h +44 -49
  258. data/src/core/lib/gprpp/examine_stack.cc +43 -0
  259. data/src/core/lib/gprpp/examine_stack.h +46 -0
  260. data/src/core/lib/gprpp/fork.cc +2 -2
  261. data/src/core/lib/gprpp/manual_constructor.h +1 -1
  262. data/src/core/lib/gprpp/orphanable.h +4 -8
  263. data/src/core/lib/gprpp/ref_counted.h +40 -46
  264. data/src/core/lib/gprpp/ref_counted_ptr.h +9 -11
  265. data/src/core/lib/{security/authorization/mock_cel/statusor.h → gprpp/stat.h} +13 -25
  266. data/src/core/lib/gprpp/stat_posix.cc +49 -0
  267. data/src/core/lib/gprpp/stat_windows.cc +48 -0
  268. data/src/core/lib/gprpp/thd.h +2 -2
  269. data/src/core/lib/gprpp/thd_posix.cc +36 -36
  270. data/src/core/lib/http/parser.cc +46 -25
  271. data/src/core/lib/iomgr/error.cc +2 -1
  272. data/src/core/lib/iomgr/ev_epollex_linux.cc +8 -4
  273. data/src/core/lib/iomgr/exec_ctx.cc +1 -1
  274. data/src/core/lib/iomgr/executor/mpmcqueue.h +5 -5
  275. data/src/core/lib/iomgr/executor/threadpool.h +3 -3
  276. data/src/core/lib/iomgr/parse_address.cc +84 -6
  277. data/src/core/lib/iomgr/parse_address.h +20 -0
  278. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +2 -1
  279. data/src/core/lib/iomgr/python_util.h +3 -3
  280. data/src/core/lib/iomgr/resolve_address_posix.cc +1 -5
  281. data/src/core/lib/iomgr/tcp_posix.cc +3 -2
  282. data/src/core/lib/iomgr/timer_custom.cc +2 -2
  283. data/src/core/lib/iomgr/unix_sockets_posix.cc +27 -15
  284. data/src/core/lib/iomgr/unix_sockets_posix.h +5 -0
  285. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +7 -0
  286. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
  287. data/src/core/lib/json/json.h +2 -2
  288. data/src/core/lib/json/json_reader.cc +8 -4
  289. data/src/core/lib/json/json_util.h +167 -0
  290. data/src/core/lib/json/json_writer.cc +2 -1
  291. data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +3 -1
  292. data/src/core/lib/security/authorization/mock_cel/cel_expression.h +5 -4
  293. data/src/core/lib/security/authorization/mock_cel/cel_value.h +4 -0
  294. data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +6 -6
  295. data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +10 -9
  296. data/src/core/lib/security/context/security_context.h +3 -1
  297. data/src/core/lib/security/credentials/credentials.cc +1 -1
  298. data/src/core/lib/security/credentials/credentials.h +3 -3
  299. data/src/core/lib/security/credentials/external/aws_request_signer.cc +208 -0
  300. data/src/core/lib/security/credentials/external/aws_request_signer.h +73 -0
  301. data/src/core/lib/security/credentials/external/external_account_credentials.cc +311 -0
  302. data/src/core/lib/security/credentials/external/external_account_credentials.h +118 -0
  303. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +136 -0
  304. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +49 -0
  305. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +211 -0
  306. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +59 -0
  307. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +51 -0
  308. data/src/core/lib/security/credentials/jwt/json_token.cc +5 -2
  309. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +4 -3
  310. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -1
  311. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +2 -2
  312. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +35 -5
  313. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +12 -8
  314. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +78 -0
  315. data/src/core/lib/security/{certificate_provider.h → credentials/tls/grpc_tls_certificate_provider.h} +32 -18
  316. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +77 -149
  317. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +58 -187
  318. data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -12
  319. data/src/core/lib/security/credentials/tls/tls_credentials.h +2 -2
  320. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +2 -2
  321. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +88 -0
  322. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +70 -0
  323. data/src/core/lib/security/security_connector/load_system_roots.h +4 -0
  324. data/src/core/lib/security/security_connector/load_system_roots_linux.h +2 -0
  325. data/src/core/lib/security/security_connector/local/local_security_connector.cc +2 -2
  326. data/src/core/lib/security/security_connector/security_connector.cc +1 -1
  327. data/src/core/lib/security/security_connector/security_connector.h +4 -2
  328. data/src/core/lib/security/security_connector/ssl_utils.h +4 -2
  329. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +293 -275
  330. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +106 -61
  331. data/src/core/lib/security/transport/security_handshaker.cc +1 -1
  332. data/src/core/lib/security/transport/server_auth_filter.cc +2 -1
  333. data/src/core/lib/security/util/json_util.h +1 -0
  334. data/src/core/lib/slice/slice.cc +7 -4
  335. data/src/core/lib/slice/slice_buffer.cc +2 -1
  336. data/src/core/lib/slice/slice_intern.cc +2 -2
  337. data/src/core/lib/surface/call.cc +9 -8
  338. data/src/core/lib/surface/completion_queue.cc +7 -6
  339. data/src/core/lib/surface/server.cc +4 -2
  340. data/src/core/lib/surface/server.h +2 -2
  341. data/src/core/lib/surface/validate_metadata.h +3 -0
  342. data/src/core/lib/surface/version.cc +2 -2
  343. data/src/core/lib/transport/authority_override.h +2 -0
  344. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  345. data/src/core/lib/transport/byte_stream.h +3 -3
  346. data/src/core/lib/transport/connectivity_state.h +3 -3
  347. data/src/core/lib/transport/metadata.h +2 -2
  348. data/src/core/lib/transport/timeout_encoding.cc +4 -4
  349. data/src/core/lib/transport/transport.cc +5 -3
  350. data/src/core/lib/transport/transport.h +1 -1
  351. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -4
  352. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +4 -3
  353. data/src/core/tsi/fake_transport_security.cc +1 -0
  354. data/src/core/tsi/local_transport_security.cc +5 -1
  355. data/src/core/tsi/local_transport_security.h +6 -7
  356. data/src/core/tsi/ssl/session_cache/ssl_session.h +3 -0
  357. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -1
  358. data/src/core/tsi/ssl_transport_security.cc +14 -7
  359. data/src/core/tsi/ssl_transport_security.h +3 -0
  360. data/src/core/tsi/transport_security.cc +4 -2
  361. data/src/ruby/ext/grpc/extconf.rb +1 -1
  362. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +22 -14
  363. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +36 -24
  364. data/src/ruby/lib/grpc/version.rb +1 -1
  365. data/third_party/abseil-cpp/absl/algorithm/container.h +59 -22
  366. data/third_party/abseil-cpp/absl/base/attributes.h +99 -38
  367. data/third_party/abseil-cpp/absl/base/call_once.h +1 -1
  368. data/third_party/abseil-cpp/absl/base/casts.h +9 -6
  369. data/third_party/abseil-cpp/absl/base/config.h +60 -17
  370. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +428 -335
  371. data/third_party/abseil-cpp/absl/base/internal/bits.h +17 -16
  372. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +5 -0
  373. data/third_party/abseil-cpp/absl/base/internal/dynamic_annotations.h +398 -0
  374. data/third_party/abseil-cpp/absl/base/internal/invoke.h +4 -4
  375. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +1 -1
  376. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +29 -1
  377. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +2 -2
  378. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +7 -5
  379. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +25 -38
  380. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +19 -25
  381. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +8 -0
  382. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +28 -5
  383. data/third_party/abseil-cpp/absl/base/internal/sysinfo.h +8 -0
  384. data/third_party/abseil-cpp/absl/base/internal/tsan_mutex_interface.h +3 -1
  385. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +2 -2
  386. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +3 -3
  387. data/third_party/abseil-cpp/absl/base/macros.h +36 -109
  388. data/third_party/abseil-cpp/absl/base/optimization.h +61 -1
  389. data/third_party/abseil-cpp/absl/base/options.h +31 -4
  390. data/third_party/abseil-cpp/absl/base/policy_checks.h +1 -1
  391. data/third_party/abseil-cpp/absl/base/thread_annotations.h +94 -39
  392. data/third_party/abseil-cpp/absl/container/fixed_array.h +42 -25
  393. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +2 -1
  394. data/third_party/abseil-cpp/absl/container/inlined_vector.h +33 -36
  395. data/third_party/abseil-cpp/absl/container/internal/common.h +6 -2
  396. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +33 -8
  397. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +49 -29
  398. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +15 -0
  399. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +24 -7
  400. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +2 -1
  401. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +35 -11
  402. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +10 -9
  403. data/third_party/abseil-cpp/absl/container/internal/layout.h +7 -5
  404. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +55 -34
  405. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +5 -4
  406. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +66 -16
  407. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +4 -0
  408. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +13 -4
  409. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +43 -24
  410. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +12 -3
  411. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +10 -2
  412. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +22 -1
  413. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +0 -21
  414. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +12 -1
  415. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +101 -0
  416. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +100 -20
  417. data/third_party/abseil-cpp/absl/functional/bind_front.h +184 -0
  418. data/third_party/abseil-cpp/absl/functional/function_ref.h +1 -1
  419. data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +95 -0
  420. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +2 -2
  421. data/third_party/abseil-cpp/absl/hash/hash.h +6 -5
  422. data/third_party/abseil-cpp/absl/hash/internal/hash.h +73 -65
  423. data/third_party/abseil-cpp/absl/memory/memory.h +4 -0
  424. data/third_party/abseil-cpp/absl/meta/type_traits.h +2 -8
  425. data/third_party/abseil-cpp/absl/numeric/int128.cc +13 -27
  426. data/third_party/abseil-cpp/absl/numeric/int128.h +16 -15
  427. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +51 -0
  428. data/third_party/abseil-cpp/absl/status/status.cc +4 -6
  429. data/third_party/abseil-cpp/absl/status/status.h +502 -113
  430. data/third_party/abseil-cpp/absl/status/status_payload_printer.cc +5 -10
  431. data/third_party/abseil-cpp/absl/strings/charconv.cc +2 -2
  432. data/third_party/abseil-cpp/absl/strings/cord.cc +91 -112
  433. data/third_party/abseil-cpp/absl/strings/cord.h +360 -205
  434. data/third_party/abseil-cpp/absl/strings/escaping.cc +9 -9
  435. data/third_party/abseil-cpp/absl/strings/internal/char_map.h +1 -1
  436. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
  437. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h +2 -2
  438. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +2 -2
  439. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +45 -23
  440. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +222 -136
  441. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +136 -64
  442. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +1 -1
  443. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +14 -21
  444. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -14
  445. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +31 -7
  446. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +147 -135
  447. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +999 -87
  448. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +3 -3
  449. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +4 -12
  450. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +8 -6
  451. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +13 -11
  452. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +2 -2
  453. data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
  454. data/third_party/abseil-cpp/absl/strings/str_cat.h +1 -1
  455. data/third_party/abseil-cpp/absl/strings/str_format.h +289 -13
  456. data/third_party/abseil-cpp/absl/strings/str_split.cc +2 -2
  457. data/third_party/abseil-cpp/absl/strings/str_split.h +1 -0
  458. data/third_party/abseil-cpp/absl/strings/string_view.h +26 -19
  459. data/third_party/abseil-cpp/absl/strings/substitute.cc +5 -5
  460. data/third_party/abseil-cpp/absl/strings/substitute.h +32 -29
  461. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +3 -3
  462. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +3 -3
  463. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +28 -28
  464. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +4 -16
  465. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -1
  466. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +8 -0
  467. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -2
  468. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +75 -64
  469. data/third_party/abseil-cpp/absl/synchronization/mutex.h +15 -6
  470. data/third_party/abseil-cpp/absl/time/civil_time.cc +9 -9
  471. data/third_party/abseil-cpp/absl/time/clock.cc +3 -3
  472. data/third_party/abseil-cpp/absl/time/duration.cc +90 -59
  473. data/third_party/abseil-cpp/absl/time/format.cc +43 -36
  474. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +26 -16
  475. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +4 -2
  476. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +1 -1
  477. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +136 -29
  478. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +13 -21
  479. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +1 -1
  480. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +136 -129
  481. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +4 -5
  482. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +8 -7
  483. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +6 -6
  484. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -1
  485. data/third_party/abseil-cpp/absl/time/time.h +15 -16
  486. data/third_party/abseil-cpp/absl/types/internal/variant.h +4 -4
  487. data/third_party/abseil-cpp/absl/types/optional.h +9 -9
  488. data/third_party/abseil-cpp/absl/types/span.h +49 -36
  489. data/third_party/abseil-cpp/absl/utility/utility.h +2 -2
  490. data/third_party/address_sorting/include/address_sorting/address_sorting.h +2 -0
  491. data/third_party/boringssl-with-bazel/err_data.c +340 -336
  492. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +2 -0
  493. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +173 -35
  494. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +46 -7
  495. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +8 -2
  496. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +90 -63
  497. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +60 -60
  498. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +179 -47
  499. data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +766 -0
  500. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +10 -0
  501. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +5 -3
  502. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +14 -14
  503. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +1 -1
  504. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +24 -0
  505. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +7 -5
  506. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +5 -2
  507. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +4 -0
  508. data/third_party/boringssl-with-bazel/src/include/openssl/des.h +6 -0
  509. data/third_party/boringssl-with-bazel/src/include/openssl/opensslconf.h +3 -0
  510. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +202 -134
  511. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +55 -1
  512. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +4 -0
  513. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +31 -23
  514. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +435 -394
  515. data/third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc +18 -5
  516. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +35 -0
  517. data/third_party/boringssl-with-bazel/src/ssl/internal.h +36 -1
  518. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +42 -1
  519. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +67 -0
  520. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +11 -14
  521. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +216 -11
  522. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +53 -11
  523. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +133 -39
  524. data/third_party/upb/upb/def.c +2169 -0
  525. data/third_party/upb/upb/def.h +330 -0
  526. data/third_party/upb/upb/def.hpp +525 -0
  527. data/third_party/upb/upb/reflection.c +391 -0
  528. data/third_party/upb/upb/reflection.h +168 -0
  529. data/third_party/upb/upb/text_encode.c +398 -0
  530. data/third_party/upb/upb/text_encode.h +35 -0
  531. metadata +227 -37
  532. data/src/core/ext/filters/client_channel/lb_policy/xds/eds_drop.cc +0 -571
  533. data/third_party/abseil-cpp/absl/base/dynamic_annotations.cc +0 -129
@@ -40,18 +40,18 @@ bool CredentialOptionSanityCheck(const grpc_tls_credentials_options* options,
40
40
  gpr_log(GPR_ERROR, "TLS credentials options is nullptr.");
41
41
  return false;
42
42
  }
43
- if (options->key_materials_config() == nullptr &&
44
- options->credential_reload_config() == nullptr) {
45
- gpr_log(GPR_ERROR,
46
- "TLS credentials options must specify either key materials or "
47
- "credential reload config.");
48
- return false;
49
- }
43
+ // TODO(ZhenLian): remove this when it is also supported on server side.
50
44
  if (!is_client && options->server_authorization_check_config() != nullptr) {
51
45
  gpr_log(GPR_INFO,
52
46
  "Server's credentials options should not contain server "
53
47
  "authorization check config.");
54
48
  }
49
+ if (options->server_verification_option() != GRPC_TLS_SERVER_VERIFICATION &&
50
+ options->server_authorization_check_config() == nullptr) {
51
+ gpr_log(GPR_ERROR,
52
+ "Should provider custom verifications if bypassing default ones.");
53
+ return false;
54
+ }
55
55
  return true;
56
56
  }
57
57
 
@@ -85,14 +85,16 @@ TlsCredentials::create_security_connector(
85
85
  }
86
86
  grpc_core::RefCountedPtr<grpc_channel_security_connector> sc =
87
87
  grpc_core::TlsChannelSecurityConnector::CreateTlsChannelSecurityConnector(
88
- this->Ref(), std::move(call_creds), target_name,
88
+ this->Ref(), options_, std::move(call_creds), target_name,
89
89
  overridden_target_name, ssl_session_cache);
90
90
  if (sc == nullptr) {
91
91
  return nullptr;
92
92
  }
93
- grpc_arg new_arg = grpc_channel_arg_string_create(
94
- (char*)GRPC_ARG_HTTP2_SCHEME, (char*)"https");
95
- *new_args = grpc_channel_args_copy_and_add(args, &new_arg, 1);
93
+ if (args != nullptr) {
94
+ grpc_arg new_arg = grpc_channel_arg_string_create(
95
+ (char*)GRPC_ARG_HTTP2_SCHEME, (char*)"https");
96
+ *new_args = grpc_channel_args_copy_and_add(args, &new_arg, 1);
97
+ }
96
98
  return sc;
97
99
  }
98
100
 
@@ -106,9 +108,11 @@ TlsServerCredentials::~TlsServerCredentials() {}
106
108
  grpc_core::RefCountedPtr<grpc_server_security_connector>
107
109
  TlsServerCredentials::create_security_connector() {
108
110
  return grpc_core::TlsServerSecurityConnector::
109
- CreateTlsServerSecurityConnector(this->Ref());
111
+ CreateTlsServerSecurityConnector(this->Ref(), options_);
110
112
  }
111
113
 
114
+ /** -- Wrapper APIs declared in grpc_security.h -- **/
115
+
112
116
  grpc_channel_credentials* grpc_tls_credentials_create(
113
117
  grpc_tls_credentials_options* options) {
114
118
  if (!CredentialOptionSanityCheck(options, true /* is_client */)) {
@@ -38,7 +38,7 @@ class TlsCredentials final : public grpc_channel_credentials {
38
38
  const char* target_name, const grpc_channel_args* args,
39
39
  grpc_channel_args** new_args) override;
40
40
 
41
- const grpc_tls_credentials_options& options() const { return *options_; }
41
+ grpc_tls_credentials_options* options() const { return options_.get(); }
42
42
 
43
43
  private:
44
44
  grpc_core::RefCountedPtr<grpc_tls_credentials_options> options_;
@@ -53,7 +53,7 @@ class TlsServerCredentials final : public grpc_server_credentials {
53
53
  grpc_core::RefCountedPtr<grpc_server_security_connector>
54
54
  create_security_connector() override;
55
55
 
56
- const grpc_tls_credentials_options& options() const { return *options_; }
56
+ grpc_tls_credentials_options* options() const { return options_.get(); }
57
57
 
58
58
  private:
59
59
  grpc_core::RefCountedPtr<grpc_tls_credentials_options> options_;
@@ -223,7 +223,7 @@ static void fake_check_peer(
223
223
  }
224
224
  prop_name = peer.properties[0].name;
225
225
  if (prop_name == nullptr ||
226
- strcmp(prop_name, TSI_CERTIFICATE_TYPE_PEER_PROPERTY)) {
226
+ strcmp(prop_name, TSI_CERTIFICATE_TYPE_PEER_PROPERTY) != 0) {
227
227
  error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
228
228
  absl::StrCat("Unexpected property in fake peer: ",
229
229
  prop_name == nullptr ? "<EMPTY>" : prop_name)
@@ -231,7 +231,7 @@ static void fake_check_peer(
231
231
  goto end;
232
232
  }
233
233
  if (strncmp(peer.properties[0].value.data, TSI_FAKE_CERTIFICATE_TYPE,
234
- peer.properties[0].value.length)) {
234
+ peer.properties[0].value.length) != 0) {
235
235
  error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
236
236
  "Invalid value for cert type property.");
237
237
  goto end;
@@ -0,0 +1,88 @@
1
+ //
2
+ //
3
+ // Copyright 2020 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/insecure/insecure_security_connector.h"
22
+
23
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
24
+ #include "src/core/lib/security/transport/security_handshaker.h"
25
+ #include "src/core/tsi/local_transport_security.h"
26
+
27
+ namespace grpc_core {
28
+
29
+ const char kInsecureTransportSecurityType[] = "insecure";
30
+
31
+ // check_call_host and cancel_check_call_host are no-ops since we want to
32
+ // provide an insecure channel.
33
+ bool InsecureChannelSecurityConnector::check_call_host(
34
+ absl::string_view host, grpc_auth_context* auth_context,
35
+ grpc_closure* on_call_host_checked, grpc_error** error) {
36
+ *error = GRPC_ERROR_NONE;
37
+ return true;
38
+ }
39
+
40
+ void InsecureChannelSecurityConnector::cancel_check_call_host(
41
+ grpc_closure* on_call_host_checked, grpc_error* error) {
42
+ GRPC_ERROR_UNREF(error);
43
+ }
44
+
45
+ // add_handshakers should have been a no-op but we need to add a minimalist
46
+ // security handshaker so that check_peer is invoked and an auth_context is
47
+ // created with the security level of TSI_SECURITY_NONE.
48
+ void InsecureChannelSecurityConnector::add_handshakers(
49
+ const grpc_channel_args* args, grpc_pollset_set* /* interested_parties */,
50
+ HandshakeManager* handshake_manager) {
51
+ tsi_handshaker* handshaker = nullptr;
52
+ // Re-use local_tsi_handshaker_create as a minimalist handshaker.
53
+ GPR_ASSERT(tsi_local_handshaker_create(true /* is_client */, &handshaker) ==
54
+ TSI_OK);
55
+ handshake_manager->Add(SecurityHandshakerCreate(handshaker, this, args));
56
+ }
57
+
58
+ void InsecureChannelSecurityConnector::check_peer(
59
+ tsi_peer peer, grpc_endpoint* ep,
60
+ RefCountedPtr<grpc_auth_context>* auth_context,
61
+ grpc_closure* on_peer_checked) {
62
+ *auth_context = MakeAuthContext();
63
+ tsi_peer_destruct(&peer);
64
+ ExecCtx::Run(DEBUG_LOCATION, on_peer_checked, GRPC_ERROR_NONE);
65
+ }
66
+
67
+ int InsecureChannelSecurityConnector::cmp(
68
+ const grpc_security_connector* other_sc) const {
69
+ return channel_security_connector_cmp(
70
+ static_cast<const grpc_channel_security_connector*>(other_sc));
71
+ }
72
+
73
+ RefCountedPtr<grpc_auth_context>
74
+ InsecureChannelSecurityConnector::MakeAuthContext() {
75
+ auto ctx = MakeRefCounted<grpc_auth_context>(nullptr);
76
+ grpc_auth_context_add_cstring_property(
77
+ ctx.get(), GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME,
78
+ kInsecureTransportSecurityType);
79
+ GPR_ASSERT(grpc_auth_context_set_peer_identity_property_name(
80
+ ctx.get(), GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME) == 1);
81
+ const char* security_level = tsi_security_level_to_string(TSI_SECURITY_NONE);
82
+ grpc_auth_context_add_property(ctx.get(),
83
+ GRPC_TRANSPORT_SECURITY_LEVEL_PROPERTY_NAME,
84
+ security_level, strlen(security_level));
85
+ return ctx;
86
+ }
87
+
88
+ } // namespace grpc_core
@@ -0,0 +1,70 @@
1
+ //
2
+ //
3
+ // Copyright 2020 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
+ #ifndef GRPC_CORE_LIB_SECURITY_SECURITY_CONNECTOR_INSECURE_INSECURE_SECURITY_CONNECTOR_H
20
+ #define GRPC_CORE_LIB_SECURITY_SECURITY_CONNECTOR_INSECURE_INSECURE_SECURITY_CONNECTOR_H
21
+
22
+ #include <grpc/support/port_platform.h>
23
+
24
+ #include "src/core/lib/security/context/security_context.h"
25
+ #include "src/core/lib/security/credentials/credentials.h"
26
+ #include "src/core/lib/security/security_connector/security_connector.h"
27
+
28
+ namespace grpc_core {
29
+
30
+ extern const char kInsecureTransportSecurityType[];
31
+
32
+ class InsecureChannelSecurityConnector
33
+ : public grpc_channel_security_connector {
34
+ public:
35
+ InsecureChannelSecurityConnector(
36
+ grpc_core::RefCountedPtr<grpc_channel_credentials> channel_creds,
37
+ grpc_core::RefCountedPtr<grpc_call_credentials> request_metadata_creds)
38
+ : grpc_channel_security_connector(/* url_scheme */ nullptr,
39
+ std::move(channel_creds),
40
+ std::move(request_metadata_creds)) {}
41
+
42
+ bool check_call_host(absl::string_view host, grpc_auth_context* auth_context,
43
+ grpc_closure* on_call_host_checked,
44
+ grpc_error** error) override;
45
+
46
+ void cancel_check_call_host(grpc_closure* on_call_host_checked,
47
+ grpc_error* error) override;
48
+
49
+ void add_handshakers(const grpc_channel_args* args,
50
+ grpc_pollset_set* /* interested_parties */,
51
+ grpc_core::HandshakeManager* handshake_manager) override;
52
+
53
+ void check_peer(tsi_peer peer, grpc_endpoint* ep,
54
+ grpc_core::RefCountedPtr<grpc_auth_context>* auth_context,
55
+ grpc_closure* on_peer_checked) override;
56
+
57
+ int cmp(const grpc_security_connector* other_sc) const override;
58
+
59
+ // Exposed for testing purposes only.
60
+ // Create an auth context which is necessary to pass the santiy check in
61
+ // client_auth_filter that verifies if the peer's auth context is obtained
62
+ // during handshakes. The auth context is only checked for its existence and
63
+ // not actually used.
64
+ static RefCountedPtr<grpc_auth_context> MakeAuthContext();
65
+ };
66
+
67
+ } // namespace grpc_core
68
+
69
+ #endif /* GRPC_CORE_LIB_SECURITY_SECURITY_CONNECTOR_INSECURE_INSECURE_SECURITY_CONNECTOR_H \
70
+ */
@@ -19,6 +19,10 @@
19
19
  #ifndef GRPC_CORE_LIB_SECURITY_SECURITY_CONNECTOR_LOAD_SYSTEM_ROOTS_H
20
20
  #define GRPC_CORE_LIB_SECURITY_SECURITY_CONNECTOR_LOAD_SYSTEM_ROOTS_H
21
21
 
22
+ #include <grpc/support/port_platform.h>
23
+
24
+ #include <grpc/slice.h>
25
+
22
26
  namespace grpc_core {
23
27
 
24
28
  // Returns a slice containing roots from the OS trust store
@@ -21,6 +21,8 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
+ #include <grpc/slice.h>
25
+
24
26
  #ifdef GPR_LINUX
25
27
 
26
28
  namespace grpc_core {
@@ -157,7 +157,7 @@ class grpc_local_channel_security_connector final
157
157
  const grpc_channel_args* args, grpc_pollset_set* /*interested_parties*/,
158
158
  grpc_core::HandshakeManager* handshake_manager) override {
159
159
  tsi_handshaker* handshaker = nullptr;
160
- GPR_ASSERT(local_tsi_handshaker_create(true /* is_client */, &handshaker) ==
160
+ GPR_ASSERT(tsi_local_handshaker_create(true /* is_client */, &handshaker) ==
161
161
  TSI_OK);
162
162
  handshake_manager->Add(
163
163
  grpc_core::SecurityHandshakerCreate(handshaker, this, args));
@@ -215,7 +215,7 @@ class grpc_local_server_security_connector final
215
215
  const grpc_channel_args* args, grpc_pollset_set* /*interested_parties*/,
216
216
  grpc_core::HandshakeManager* handshake_manager) override {
217
217
  tsi_handshaker* handshaker = nullptr;
218
- GPR_ASSERT(local_tsi_handshaker_create(false /* is_client */,
218
+ GPR_ASSERT(tsi_local_handshaker_create(false /* is_client */,
219
219
  &handshaker) == TSI_OK);
220
220
  handshake_manager->Add(
221
221
  grpc_core::SecurityHandshakerCreate(handshaker, this, args));
@@ -109,7 +109,7 @@ grpc_arg grpc_security_connector_to_arg(grpc_security_connector* sc) {
109
109
  }
110
110
 
111
111
  grpc_security_connector* grpc_security_connector_from_arg(const grpc_arg* arg) {
112
- if (strcmp(arg->key, GRPC_ARG_SECURITY_CONNECTOR)) return nullptr;
112
+ if (strcmp(arg->key, GRPC_ARG_SECURITY_CONNECTOR) != 0) return nullptr;
113
113
  if (arg->type != GRPC_ARG_POINTER) {
114
114
  gpr_log(GPR_ERROR, "Invalid type %d for arg %s", arg->type,
115
115
  GRPC_ARG_SECURITY_CONNECTOR);
@@ -49,9 +49,11 @@ class grpc_security_connector
49
49
  public:
50
50
  explicit grpc_security_connector(const char* url_scheme)
51
51
  : grpc_core::RefCounted<grpc_security_connector>(
52
- &grpc_trace_security_connector_refcount),
52
+ GRPC_TRACE_FLAG_ENABLED(grpc_trace_security_connector_refcount)
53
+ ? "security_connector_refcount"
54
+ : nullptr),
53
55
  url_scheme_(url_scheme) {}
54
- virtual ~grpc_security_connector() = default;
56
+ ~grpc_security_connector() override = default;
55
57
 
56
58
  /* Check the peer. Callee takes ownership of the peer object.
57
59
  When done, sets *auth_context and invokes on_peer_checked. */
@@ -154,11 +154,11 @@ class PemKeyCertPair {
154
154
  }
155
155
 
156
156
  // Movable.
157
- PemKeyCertPair(PemKeyCertPair&& other) {
157
+ PemKeyCertPair(PemKeyCertPair&& other) noexcept {
158
158
  private_key_ = std::move(other.private_key_);
159
159
  cert_chain_ = std::move(other.cert_chain_);
160
160
  }
161
- PemKeyCertPair& operator=(PemKeyCertPair&& other) {
161
+ PemKeyCertPair& operator=(PemKeyCertPair&& other) noexcept {
162
162
  private_key_ = std::move(other.private_key_);
163
163
  cert_chain_ = std::move(other.cert_chain_);
164
164
  return *this;
@@ -187,6 +187,8 @@ class PemKeyCertPair {
187
187
  grpc_core::UniquePtr<char> cert_chain_;
188
188
  };
189
189
 
190
+ typedef absl::InlinedVector<grpc_core::PemKeyCertPair, 1> PemKeyCertPairList;
191
+
190
192
  } // namespace grpc_core
191
193
 
192
194
  #endif /* GRPC_CORE_LIB_SECURITY_SECURITY_CONNECTOR_SSL_UTILS_H \
@@ -46,7 +46,7 @@ namespace grpc_core {
46
46
  namespace {
47
47
 
48
48
  tsi_ssl_pem_key_cert_pair* ConvertToTsiPemKeyCertPair(
49
- const grpc_tls_key_materials_config::PemKeyCertPairList& cert_pair_list) {
49
+ const grpc_core::PemKeyCertPairList& cert_pair_list) {
50
50
  tsi_ssl_pem_key_cert_pair* tsi_pairs = nullptr;
51
51
  size_t num_key_cert_pairs = cert_pair_list.size();
52
52
  if (num_key_cert_pairs > 0) {
@@ -65,127 +65,120 @@ tsi_ssl_pem_key_cert_pair* ConvertToTsiPemKeyCertPair(
65
65
 
66
66
  } // namespace
67
67
 
68
- grpc_status_code TlsFetchKeyMaterials(
69
- const grpc_core::RefCountedPtr<grpc_tls_key_materials_config>&
70
- key_materials_config,
71
- const grpc_tls_credentials_options& options, bool is_server,
72
- grpc_ssl_certificate_config_reload_status* status) {
73
- GPR_ASSERT(key_materials_config != nullptr);
74
- GPR_ASSERT(status != nullptr);
75
- bool is_key_materials_empty =
76
- key_materials_config->pem_key_cert_pair_list().empty();
77
- grpc_tls_credential_reload_config* credential_reload_config =
78
- options.credential_reload_config();
79
- /** If there are no key materials and no credential reload config and the
80
- * caller is a server, then return an error. We do not require that a client
81
- * always provision certificates. **/
82
- if (credential_reload_config == nullptr && is_key_materials_empty &&
83
- is_server) {
68
+ // -------------------channel security connector-------------------
69
+ grpc_core::RefCountedPtr<grpc_channel_security_connector>
70
+ TlsChannelSecurityConnector::CreateTlsChannelSecurityConnector(
71
+ grpc_core::RefCountedPtr<grpc_channel_credentials> ch_creds,
72
+ grpc_core::RefCountedPtr<grpc_tls_credentials_options> options,
73
+ grpc_core::RefCountedPtr<grpc_call_credentials> request_metadata_creds,
74
+ const char* target_name, const char* overridden_target_name,
75
+ tsi_ssl_session_cache* ssl_session_cache) {
76
+ if (ch_creds == nullptr) {
84
77
  gpr_log(GPR_ERROR,
85
- "Either credential reload config or key materials should be "
86
- "provisioned.");
87
- return GRPC_STATUS_FAILED_PRECONDITION;
88
- }
89
- grpc_status_code reload_status = GRPC_STATUS_OK;
90
- /** Use |credential_reload_config| to update |key_materials_config|. **/
91
- if (credential_reload_config != nullptr) {
92
- grpc_tls_credential_reload_arg* arg = new grpc_tls_credential_reload_arg();
93
- arg->key_materials_config = key_materials_config.get();
94
- arg->error_details = new grpc_tls_error_details();
95
- int result = credential_reload_config->Schedule(arg);
96
- if (result) {
97
- /** Credential reloading is performed async. This is not yet supported.
98
- * **/
99
- gpr_log(GPR_ERROR, "Async credential reload is unsupported now.");
100
- *status = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED;
101
- reload_status =
102
- is_key_materials_empty ? GRPC_STATUS_UNIMPLEMENTED : GRPC_STATUS_OK;
103
- } else {
104
- /** Credential reloading is performed sync. **/
105
- *status = arg->status;
106
- if (arg->status == GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED) {
107
- /* Key materials is not empty. */
108
- gpr_log(GPR_DEBUG, "Credential does not change after reload.");
109
- } else if (arg->status == GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL) {
110
- gpr_log(GPR_ERROR, "Credential reload failed with an error:");
111
- if (arg->error_details != nullptr) {
112
- gpr_log(GPR_ERROR, "%s", arg->error_details->error_details().c_str());
113
- }
114
- reload_status =
115
- is_key_materials_empty ? GRPC_STATUS_INTERNAL : GRPC_STATUS_OK;
116
- }
117
- }
118
- delete arg->error_details;
119
- /** If the credential reload config was constructed via a wrapped language,
120
- * then |arg->context| and |arg->destroy_context| will not be nullptr. In
121
- * this case, we must destroy |arg->context|, which stores the wrapped
122
- * language-version of the credential reload arg. **/
123
- if (arg->destroy_context != nullptr) {
124
- arg->destroy_context(arg->context);
125
- }
126
- delete arg;
78
+ "channel_creds is nullptr in "
79
+ "TlsChannelSecurityConnectorCreate()");
80
+ return nullptr;
127
81
  }
128
- return reload_status;
129
- }
130
-
131
- grpc_error* TlsCheckHostName(const char* peer_name, const tsi_peer* peer) {
132
- /* Check the peer name if specified. */
133
- if (peer_name != nullptr && !grpc_ssl_host_matches_name(peer, peer_name)) {
134
- return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
135
- absl::StrCat("Peer name ", peer_name, " is not in peer certificate")
136
- .c_str());
82
+ if (options == nullptr) {
83
+ gpr_log(GPR_ERROR,
84
+ "options is nullptr in "
85
+ "TlsChannelSecurityConnectorCreate()");
86
+ return nullptr;
137
87
  }
138
- return GRPC_ERROR_NONE;
88
+ if (target_name == nullptr) {
89
+ gpr_log(GPR_ERROR,
90
+ "target_name is nullptr in "
91
+ "TlsChannelSecurityConnectorCreate()");
92
+ return nullptr;
93
+ }
94
+ grpc_core::RefCountedPtr<TlsChannelSecurityConnector> c =
95
+ grpc_core::MakeRefCounted<TlsChannelSecurityConnector>(
96
+ std::move(ch_creds), std::move(options),
97
+ std::move(request_metadata_creds), target_name,
98
+ overridden_target_name, ssl_session_cache);
99
+ return c;
139
100
  }
140
101
 
141
102
  TlsChannelSecurityConnector::TlsChannelSecurityConnector(
142
- grpc_core::RefCountedPtr<grpc_channel_credentials> channel_creds,
103
+ grpc_core::RefCountedPtr<grpc_channel_credentials> ch_creds,
104
+ grpc_core::RefCountedPtr<grpc_tls_credentials_options> options,
143
105
  grpc_core::RefCountedPtr<grpc_call_credentials> request_metadata_creds,
144
- const char* target_name, const char* overridden_target_name)
145
- : grpc_channel_security_connector(GRPC_SSL_URL_SCHEME,
146
- std::move(channel_creds),
106
+ const char* target_name, const char* overridden_target_name,
107
+ tsi_ssl_session_cache* ssl_session_cache)
108
+ : grpc_channel_security_connector(GRPC_SSL_URL_SCHEME, std::move(ch_creds),
147
109
  std::move(request_metadata_creds)),
110
+ options_(std::move(options)),
148
111
  overridden_target_name_(
149
- overridden_target_name == nullptr ? "" : overridden_target_name) {
150
- key_materials_config_ = grpc_tls_key_materials_config_create()->Ref();
112
+ overridden_target_name == nullptr ? "" : overridden_target_name),
113
+ ssl_session_cache_(ssl_session_cache) {
114
+ if (ssl_session_cache_ != nullptr) {
115
+ tsi_ssl_session_cache_ref(ssl_session_cache_);
116
+ }
151
117
  check_arg_ = ServerAuthorizationCheckArgCreate(this);
152
118
  absl::string_view host;
153
119
  absl::string_view port;
154
120
  grpc_core::SplitHostPort(target_name, &host, &port);
155
121
  target_name_ = std::string(host);
122
+ // Create a watcher.
123
+ auto watcher_ptr = absl::make_unique<TlsChannelCertificateWatcher>(this);
124
+ certificate_watcher_ = watcher_ptr.get();
125
+ // Register the watcher with the distributor.
126
+ grpc_tls_certificate_distributor* distributor =
127
+ options_->certificate_distributor();
128
+ absl::optional<std::string> watched_root_cert_name;
129
+ if (options_->watch_root_cert()) {
130
+ watched_root_cert_name = options_->root_cert_name();
131
+ }
132
+ absl::optional<std::string> watched_identity_cert_name;
133
+ if (options_->watch_identity_pair()) {
134
+ watched_identity_cert_name = options_->identity_cert_name();
135
+ }
136
+ distributor->WatchTlsCertificates(std::move(watcher_ptr),
137
+ watched_root_cert_name,
138
+ watched_identity_cert_name);
156
139
  }
157
140
 
158
141
  TlsChannelSecurityConnector::~TlsChannelSecurityConnector() {
142
+ if (ssl_session_cache_ != nullptr) {
143
+ tsi_ssl_session_cache_unref(ssl_session_cache_);
144
+ }
145
+ // Cancel all the watchers.
146
+ grpc_tls_certificate_distributor* distributor =
147
+ options_->certificate_distributor();
148
+ distributor->CancelTlsCertificatesWatch(certificate_watcher_);
159
149
  if (client_handshaker_factory_ != nullptr) {
160
150
  tsi_ssl_client_handshaker_factory_unref(client_handshaker_factory_);
161
151
  }
162
- if (key_materials_config_.get() != nullptr) {
163
- key_materials_config_.get()->Unref();
152
+ if (check_arg_ != nullptr) {
153
+ ServerAuthorizationCheckArgDestroy(check_arg_);
164
154
  }
165
- ServerAuthorizationCheckArgDestroy(check_arg_);
166
155
  }
167
156
 
168
157
  void TlsChannelSecurityConnector::add_handshakers(
169
158
  const grpc_channel_args* args, grpc_pollset_set* /*interested_parties*/,
170
159
  grpc_core::HandshakeManager* handshake_mgr) {
171
- if (RefreshHandshakerFactory() != GRPC_SECURITY_OK) {
172
- gpr_log(GPR_ERROR, "Handshaker factory refresh failed.");
173
- return;
174
- }
175
- // Instantiate TSI handshaker.
176
- tsi_handshaker* tsi_hs = nullptr;
177
- tsi_result result = tsi_ssl_client_handshaker_factory_create_handshaker(
178
- client_handshaker_factory_,
179
- overridden_target_name_.empty() ? target_name_.c_str()
180
- : overridden_target_name_.c_str(),
181
- &tsi_hs);
182
- if (result != TSI_OK) {
183
- gpr_log(GPR_ERROR, "Handshaker creation failed with error %s.",
184
- tsi_result_to_string(result));
160
+ grpc_core::MutexLock lock(&mu_);
161
+ if (client_handshaker_factory_ != nullptr) {
162
+ // Instantiate TSI handshaker.
163
+ tsi_handshaker* tsi_hs = nullptr;
164
+ tsi_result result = tsi_ssl_client_handshaker_factory_create_handshaker(
165
+ client_handshaker_factory_,
166
+ overridden_target_name_.empty() ? target_name_.c_str()
167
+ : overridden_target_name_.c_str(),
168
+ &tsi_hs);
169
+ if (result != TSI_OK) {
170
+ gpr_log(GPR_ERROR, "Handshaker creation failed with error %s.",
171
+ tsi_result_to_string(result));
172
+ return;
173
+ }
174
+ // Create handshakers.
175
+ handshake_mgr->Add(grpc_core::SecurityHandshakerCreate(tsi_hs, this, args));
185
176
  return;
186
177
  }
187
- // Create handshakers.
188
- handshake_mgr->Add(grpc_core::SecurityHandshakerCreate(tsi_hs, this, args));
178
+ // TODO(ZhenLian): Implement the logic(delegation to
179
+ // BlockOnInitialCredentialHandshaker) when certificates are not ready.
180
+ gpr_log(GPR_ERROR, "%s not supported yet.",
181
+ "Client BlockOnInitialCredentialHandshaker");
189
182
  }
190
183
 
191
184
  void TlsChannelSecurityConnector::check_peer(
@@ -203,12 +196,9 @@ void TlsChannelSecurityConnector::check_peer(
203
196
  }
204
197
  *auth_context =
205
198
  grpc_ssl_peer_to_auth_context(&peer, GRPC_TLS_TRANSPORT_SECURITY_TYPE);
206
- const TlsCredentials* creds =
207
- static_cast<const TlsCredentials*>(channel_creds());
208
- if (creds->options().server_verification_option() ==
209
- GRPC_TLS_SERVER_VERIFICATION) {
199
+ if (options_->server_verification_option() == GRPC_TLS_SERVER_VERIFICATION) {
210
200
  /* Do the default host name check if specifying the target name. */
211
- error = TlsCheckHostName(target_name, &peer);
201
+ error = internal::TlsCheckHostName(target_name, &peer);
212
202
  if (error != GRPC_ERROR_NONE) {
213
203
  grpc_core::ExecCtx::Run(DEBUG_LOCATION, on_peer_checked, error);
214
204
  tsi_peer_destruct(&peer);
@@ -217,7 +207,7 @@ void TlsChannelSecurityConnector::check_peer(
217
207
  }
218
208
  /* Do the custom server authorization check, if specified by the user. */
219
209
  const grpc_tls_server_authorization_check_config* config =
220
- creds->options().server_authorization_check_config();
210
+ options_->server_authorization_check_config();
221
211
  /* If server authorization config is not null, use it to perform
222
212
  * server authorization check. */
223
213
  if (config != nullptr) {
@@ -289,105 +279,86 @@ void TlsChannelSecurityConnector::cancel_check_call_host(
289
279
  GRPC_ERROR_UNREF(error);
290
280
  }
291
281
 
292
- grpc_core::RefCountedPtr<grpc_channel_security_connector>
293
- TlsChannelSecurityConnector::CreateTlsChannelSecurityConnector(
294
- grpc_core::RefCountedPtr<grpc_channel_credentials> channel_creds,
295
- grpc_core::RefCountedPtr<grpc_call_credentials> request_metadata_creds,
296
- const char* target_name, const char* overridden_target_name,
297
- tsi_ssl_session_cache* ssl_session_cache) {
298
- if (channel_creds == nullptr) {
299
- gpr_log(GPR_ERROR,
300
- "channel_creds is nullptr in "
301
- "TlsChannelSecurityConnectorCreate()");
302
- return nullptr;
282
+ void TlsChannelSecurityConnector::TlsChannelCertificateWatcher::
283
+ OnCertificatesChanged(
284
+ absl::optional<absl::string_view> root_certs,
285
+ absl::optional<grpc_core::PemKeyCertPairList> key_cert_pairs) {
286
+ GPR_ASSERT(security_connector_ != nullptr);
287
+ grpc_core::MutexLock lock(&security_connector_->mu_);
288
+ if (root_certs.has_value()) {
289
+ security_connector_->pem_root_certs_ = root_certs;
290
+ }
291
+ if (key_cert_pairs.has_value()) {
292
+ security_connector_->pem_key_cert_pair_list_ = std::move(key_cert_pairs);
293
+ }
294
+ bool root_being_watched = security_connector_->options_->watch_root_cert();
295
+ bool root_has_value = security_connector_->pem_root_certs_.has_value();
296
+ bool identity_being_watched =
297
+ security_connector_->options_->watch_identity_pair();
298
+ bool identity_has_value =
299
+ security_connector_->pem_key_cert_pair_list_.has_value();
300
+ if ((root_being_watched && root_has_value && identity_being_watched &&
301
+ identity_has_value) ||
302
+ (root_being_watched && root_has_value && !identity_being_watched) ||
303
+ (!root_being_watched && identity_being_watched && identity_has_value)) {
304
+ if (security_connector_->UpdateHandshakerFactoryLocked() !=
305
+ GRPC_SECURITY_OK) {
306
+ gpr_log(GPR_ERROR, "Update handshaker factory failed.");
307
+ }
303
308
  }
304
- if (target_name == nullptr) {
309
+ }
310
+
311
+ // TODO(ZhenLian): implement the logic to signal waiting handshakers once
312
+ // BlockOnInitialCredentialHandshaker is implemented.
313
+ void TlsChannelSecurityConnector::TlsChannelCertificateWatcher::OnError(
314
+ grpc_error* root_cert_error, grpc_error* identity_cert_error) {
315
+ if (root_cert_error != GRPC_ERROR_NONE) {
305
316
  gpr_log(GPR_ERROR,
306
- "target_name is nullptr in "
307
- "TlsChannelSecurityConnectorCreate()");
308
- return nullptr;
317
+ "TlsChannelCertificateWatcher getting root_cert_error: %s",
318
+ grpc_error_string(root_cert_error));
309
319
  }
310
- grpc_core::RefCountedPtr<TlsChannelSecurityConnector> c =
311
- grpc_core::MakeRefCounted<TlsChannelSecurityConnector>(
312
- std::move(channel_creds), std::move(request_metadata_creds),
313
- target_name, overridden_target_name);
314
- if (c->InitializeHandshakerFactory(ssl_session_cache) != GRPC_SECURITY_OK) {
315
- gpr_log(GPR_ERROR, "Could not initialize client handshaker factory.");
316
- return nullptr;
320
+ if (identity_cert_error != GRPC_ERROR_NONE) {
321
+ gpr_log(GPR_ERROR,
322
+ "TlsChannelCertificateWatcher getting identity_cert_error: %s",
323
+ grpc_error_string(identity_cert_error));
317
324
  }
318
- return c;
325
+ GRPC_ERROR_UNREF(root_cert_error);
326
+ GRPC_ERROR_UNREF(identity_cert_error);
319
327
  }
320
328
 
321
- grpc_security_status TlsChannelSecurityConnector::ReplaceHandshakerFactory(
322
- tsi_ssl_session_cache* ssl_session_cache) {
323
- const TlsCredentials* creds =
324
- static_cast<const TlsCredentials*>(channel_creds());
329
+ // TODO(ZhenLian): implement the logic to signal waiting handshakers once
330
+ // BlockOnInitialCredentialHandshaker is implemented.
331
+ grpc_security_status
332
+ TlsChannelSecurityConnector::UpdateHandshakerFactoryLocked() {
325
333
  bool skip_server_certificate_verification =
326
- creds->options().server_verification_option() ==
334
+ options_->server_verification_option() ==
327
335
  GRPC_TLS_SKIP_ALL_SERVER_VERIFICATION;
328
336
  /* Free the client handshaker factory if exists. */
329
- if (client_handshaker_factory_) {
337
+ if (client_handshaker_factory_ != nullptr) {
330
338
  tsi_ssl_client_handshaker_factory_unref(client_handshaker_factory_);
331
339
  }
332
- tsi_ssl_pem_key_cert_pair* pem_key_cert_pair = ConvertToTsiPemKeyCertPair(
333
- key_materials_config_->pem_key_cert_pair_list());
340
+ std::string pem_root_certs;
341
+ if (pem_root_certs_.has_value()) {
342
+ // TODO(ZhenLian): update the underlying TSI layer to use C++ types like
343
+ // std::string and absl::string_view to avoid making another copy here.
344
+ pem_root_certs = std::string(*pem_root_certs_);
345
+ }
346
+ tsi_ssl_pem_key_cert_pair* pem_key_cert_pair = nullptr;
347
+ if (pem_key_cert_pair_list_.has_value()) {
348
+ pem_key_cert_pair = ConvertToTsiPemKeyCertPair(*pem_key_cert_pair_list_);
349
+ }
334
350
  grpc_security_status status = grpc_ssl_tsi_client_handshaker_factory_init(
335
- pem_key_cert_pair, key_materials_config_->pem_root_certs(),
351
+ pem_key_cert_pair,
352
+ pem_root_certs.empty() ? nullptr : pem_root_certs.c_str(),
336
353
  skip_server_certificate_verification,
337
- grpc_get_tsi_tls_version(creds->options().min_tls_version()),
338
- grpc_get_tsi_tls_version(creds->options().max_tls_version()),
339
- ssl_session_cache, &client_handshaker_factory_);
354
+ grpc_get_tsi_tls_version(options_->min_tls_version()),
355
+ grpc_get_tsi_tls_version(options_->max_tls_version()), ssl_session_cache_,
356
+ &client_handshaker_factory_);
340
357
  /* Free memory. */
341
- grpc_tsi_ssl_pem_key_cert_pairs_destroy(pem_key_cert_pair, 1);
342
- return status;
343
- }
344
-
345
- grpc_security_status TlsChannelSecurityConnector::InitializeHandshakerFactory(
346
- tsi_ssl_session_cache* ssl_session_cache) {
347
- grpc_core::MutexLock lock(&mu_);
348
- const TlsCredentials* creds =
349
- static_cast<const TlsCredentials*>(channel_creds());
350
- grpc_tls_key_materials_config* key_materials_config =
351
- creds->options().key_materials_config();
352
- // key_materials_config_->set_key_materials will handle the copying of the key
353
- // materials users provided
354
- if (key_materials_config != nullptr) {
355
- key_materials_config_->set_key_materials(
356
- key_materials_config->pem_root_certs(),
357
- key_materials_config->pem_key_cert_pair_list());
358
- }
359
- grpc_ssl_certificate_config_reload_status reload_status =
360
- GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED;
361
- /** If |creds->options()| has a credential reload config, then the call to
362
- * |TlsFetchKeyMaterials| will use it to update the root cert and
363
- * pem-key-cert-pair list stored in |key_materials_config_|. **/
364
- if (TlsFetchKeyMaterials(key_materials_config_, creds->options(), false,
365
- &reload_status) != GRPC_STATUS_OK) {
366
- /* Raise an error if key materials are not populated. */
367
- return GRPC_SECURITY_ERROR;
368
- }
369
- return ReplaceHandshakerFactory(ssl_session_cache);
370
- }
371
-
372
- grpc_security_status TlsChannelSecurityConnector::RefreshHandshakerFactory() {
373
- grpc_core::MutexLock lock(&mu_);
374
- const TlsCredentials* creds =
375
- static_cast<const TlsCredentials*>(channel_creds());
376
- grpc_ssl_certificate_config_reload_status reload_status =
377
- GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED;
378
- /** If |creds->options()| has a credential reload config, then the call to
379
- * |TlsFetchKeyMaterials| will use it to update the root cert and
380
- * pem-key-cert-pair list stored in |key_materials_config_|. **/
381
- if (TlsFetchKeyMaterials(key_materials_config_, creds->options(), false,
382
- &reload_status) != GRPC_STATUS_OK) {
383
- return GRPC_SECURITY_ERROR;
384
- }
385
- if (reload_status != GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW) {
386
- // Re-use existing handshaker factory.
387
- return GRPC_SECURITY_OK;
388
- } else {
389
- return ReplaceHandshakerFactory(nullptr);
358
+ if (pem_key_cert_pair != nullptr) {
359
+ grpc_tsi_ssl_pem_key_cert_pairs_destroy(pem_key_cert_pair, 1);
390
360
  }
361
+ return status;
391
362
  }
392
363
 
393
364
  void TlsChannelSecurityConnector::ServerAuthorizationCheckDone(
@@ -457,40 +428,86 @@ void TlsChannelSecurityConnector::ServerAuthorizationCheckArgDestroy(
457
428
  delete arg;
458
429
  }
459
430
 
431
+ // -------------------server security connector-------------------
432
+ grpc_core::RefCountedPtr<grpc_server_security_connector>
433
+ TlsServerSecurityConnector::CreateTlsServerSecurityConnector(
434
+ grpc_core::RefCountedPtr<grpc_server_credentials> server_creds,
435
+ grpc_core::RefCountedPtr<grpc_tls_credentials_options> options) {
436
+ if (server_creds == nullptr) {
437
+ gpr_log(GPR_ERROR,
438
+ "server_creds is nullptr in "
439
+ "TlsServerSecurityConnectorCreate()");
440
+ return nullptr;
441
+ }
442
+ if (options == nullptr) {
443
+ gpr_log(GPR_ERROR,
444
+ "options is nullptr in "
445
+ "TlsServerSecurityConnectorCreate()");
446
+ return nullptr;
447
+ }
448
+ grpc_core::RefCountedPtr<TlsServerSecurityConnector> c =
449
+ grpc_core::MakeRefCounted<TlsServerSecurityConnector>(
450
+ std::move(server_creds), std::move(options));
451
+ return c;
452
+ }
453
+
460
454
  TlsServerSecurityConnector::TlsServerSecurityConnector(
461
- grpc_core::RefCountedPtr<grpc_server_credentials> server_creds)
455
+ grpc_core::RefCountedPtr<grpc_server_credentials> server_creds,
456
+ grpc_core::RefCountedPtr<grpc_tls_credentials_options> options)
462
457
  : grpc_server_security_connector(GRPC_SSL_URL_SCHEME,
463
- std::move(server_creds)) {
464
- key_materials_config_ = grpc_tls_key_materials_config_create()->Ref();
458
+ std::move(server_creds)),
459
+ options_(std::move(options)) {
460
+ // Create a watcher.
461
+ auto watcher_ptr = absl::make_unique<TlsServerCertificateWatcher>(this);
462
+ certificate_watcher_ = watcher_ptr.get();
463
+ // Register the watcher with the distributor.
464
+ grpc_tls_certificate_distributor* distributor =
465
+ options_->certificate_distributor();
466
+ absl::optional<std::string> watched_root_cert_name;
467
+ if (options_->watch_root_cert()) {
468
+ watched_root_cert_name = options_->root_cert_name();
469
+ }
470
+ absl::optional<std::string> watched_identity_cert_name;
471
+ if (options_->watch_identity_pair()) {
472
+ watched_identity_cert_name = options_->identity_cert_name();
473
+ }
474
+ distributor->WatchTlsCertificates(std::move(watcher_ptr),
475
+ watched_root_cert_name,
476
+ watched_identity_cert_name);
465
477
  }
466
478
 
467
479
  TlsServerSecurityConnector::~TlsServerSecurityConnector() {
480
+ // Cancel all the watchers.
481
+ grpc_tls_certificate_distributor* distributor =
482
+ options_->certificate_distributor();
483
+ distributor->CancelTlsCertificatesWatch(certificate_watcher_);
468
484
  if (server_handshaker_factory_ != nullptr) {
469
485
  tsi_ssl_server_handshaker_factory_unref(server_handshaker_factory_);
470
486
  }
471
- if (key_materials_config_.get() != nullptr) {
472
- key_materials_config_.get()->Unref();
473
- }
474
487
  }
475
488
 
476
489
  void TlsServerSecurityConnector::add_handshakers(
477
490
  const grpc_channel_args* args, grpc_pollset_set* /*interested_parties*/,
478
491
  grpc_core::HandshakeManager* handshake_mgr) {
479
- /* Refresh handshaker factory if needed. */
480
- if (RefreshHandshakerFactory() != GRPC_SECURITY_OK) {
481
- gpr_log(GPR_ERROR, "Handshaker factory refresh failed.");
482
- return;
483
- }
484
- /* Create a TLS TSI handshaker for server. */
485
- tsi_handshaker* tsi_hs = nullptr;
486
- tsi_result result = tsi_ssl_server_handshaker_factory_create_handshaker(
487
- server_handshaker_factory_, &tsi_hs);
488
- if (result != TSI_OK) {
489
- gpr_log(GPR_ERROR, "Handshaker creation failed with error %s.",
490
- tsi_result_to_string(result));
492
+ grpc_core::MutexLock lock(&mu_);
493
+ if (server_handshaker_factory_ != nullptr) {
494
+ // Instantiate TSI handshaker.
495
+ tsi_handshaker* tsi_hs = nullptr;
496
+ tsi_result result = tsi_ssl_server_handshaker_factory_create_handshaker(
497
+ server_handshaker_factory_, &tsi_hs);
498
+ if (result != TSI_OK) {
499
+ gpr_log(GPR_ERROR, "Handshaker creation failed with error %s.",
500
+ tsi_result_to_string(result));
501
+ return;
502
+ }
503
+ // Create handshakers.
504
+ handshake_mgr->Add(grpc_core::SecurityHandshakerCreate(tsi_hs, this, args));
491
505
  return;
492
506
  }
493
- handshake_mgr->Add(grpc_core::SecurityHandshakerCreate(tsi_hs, this, args));
507
+ // TODO(ZhenLian): Implement the logic(delegation to
508
+ // BlockOnInitialCredentialHandshaker) when certificates are not ready.
509
+ gpr_log(GPR_ERROR, "%s not supported yet.",
510
+ "Server BlockOnInitialCredentialHandshaker");
494
511
  }
495
512
 
496
513
  void TlsServerSecurityConnector::check_peer(
@@ -510,43 +527,79 @@ int TlsServerSecurityConnector::cmp(
510
527
  static_cast<const grpc_server_security_connector*>(other));
511
528
  }
512
529
 
513
- grpc_core::RefCountedPtr<grpc_server_security_connector>
514
- TlsServerSecurityConnector::CreateTlsServerSecurityConnector(
515
- grpc_core::RefCountedPtr<grpc_server_credentials> server_creds) {
516
- if (server_creds == nullptr) {
530
+ void TlsServerSecurityConnector::TlsServerCertificateWatcher::
531
+ OnCertificatesChanged(
532
+ absl::optional<absl::string_view> root_certs,
533
+ absl::optional<grpc_core::PemKeyCertPairList> key_cert_pairs) {
534
+ GPR_ASSERT(security_connector_ != nullptr);
535
+ grpc_core::MutexLock lock(&security_connector_->mu_);
536
+ if (root_certs.has_value()) {
537
+ security_connector_->pem_root_certs_ = root_certs;
538
+ }
539
+ if (key_cert_pairs.has_value()) {
540
+ security_connector_->pem_key_cert_pair_list_ = std::move(key_cert_pairs);
541
+ }
542
+ bool root_being_watched = security_connector_->options_->watch_root_cert();
543
+ bool root_has_value = security_connector_->pem_root_certs_.has_value();
544
+ bool identity_being_watched =
545
+ security_connector_->options_->watch_identity_pair();
546
+ bool identity_has_value =
547
+ security_connector_->pem_key_cert_pair_list_.has_value();
548
+ if ((root_being_watched && root_has_value && identity_being_watched &&
549
+ identity_has_value) ||
550
+ (root_being_watched && root_has_value && !identity_being_watched) ||
551
+ (!root_being_watched && identity_being_watched && identity_has_value)) {
552
+ if (security_connector_->UpdateHandshakerFactoryLocked() !=
553
+ GRPC_SECURITY_OK) {
554
+ gpr_log(GPR_ERROR, "Update handshaker factory failed.");
555
+ }
556
+ }
557
+ }
558
+
559
+ // TODO(ZhenLian): implement the logic to signal waiting handshakers once
560
+ // BlockOnInitialCredentialHandshaker is implemented.
561
+ void TlsServerSecurityConnector::TlsServerCertificateWatcher::OnError(
562
+ grpc_error* root_cert_error, grpc_error* identity_cert_error) {
563
+ if (root_cert_error != GRPC_ERROR_NONE) {
517
564
  gpr_log(GPR_ERROR,
518
- "server_creds is nullptr in "
519
- "TlsServerSecurityConnectorCreate()");
520
- return nullptr;
565
+ "TlsServerCertificateWatcher getting root_cert_error: %s",
566
+ grpc_error_string(root_cert_error));
521
567
  }
522
- grpc_core::RefCountedPtr<TlsServerSecurityConnector> c =
523
- grpc_core::MakeRefCounted<TlsServerSecurityConnector>(
524
- std::move(server_creds));
525
- if (c->InitializeHandshakerFactory() != GRPC_SECURITY_OK) {
526
- gpr_log(GPR_ERROR, "Could not initialize server handshaker factory.");
527
- return nullptr;
568
+ if (identity_cert_error != GRPC_ERROR_NONE) {
569
+ gpr_log(GPR_ERROR,
570
+ "TlsServerCertificateWatcher getting identity_cert_error: %s",
571
+ grpc_error_string(identity_cert_error));
528
572
  }
529
- return c;
573
+ GRPC_ERROR_UNREF(root_cert_error);
574
+ GRPC_ERROR_UNREF(identity_cert_error);
530
575
  }
531
576
 
532
- grpc_security_status TlsServerSecurityConnector::ReplaceHandshakerFactory() {
533
- const TlsServerCredentials* creds =
534
- static_cast<const TlsServerCredentials*>(server_creds());
577
+ // TODO(ZhenLian): implement the logic to signal waiting handshakers once
578
+ // BlockOnInitialCredentialHandshaker is implemented.
579
+ grpc_security_status
580
+ TlsServerSecurityConnector::UpdateHandshakerFactoryLocked() {
535
581
  /* Free the server handshaker factory if exists. */
536
- if (server_handshaker_factory_) {
582
+ if (server_handshaker_factory_ != nullptr) {
537
583
  tsi_ssl_server_handshaker_factory_unref(server_handshaker_factory_);
538
584
  }
539
- GPR_ASSERT(!key_materials_config_->pem_key_cert_pair_list().empty());
540
- tsi_ssl_pem_key_cert_pair* pem_key_cert_pairs = ConvertToTsiPemKeyCertPair(
541
- key_materials_config_->pem_key_cert_pair_list());
542
- size_t num_key_cert_pairs =
543
- key_materials_config_->pem_key_cert_pair_list().size();
585
+ // The identity certs on the server side shouldn't be empty.
586
+ GPR_ASSERT(pem_key_cert_pair_list_.has_value());
587
+ GPR_ASSERT(!(*pem_key_cert_pair_list_).empty());
588
+ std::string pem_root_certs;
589
+ if (pem_root_certs_.has_value()) {
590
+ // TODO(ZhenLian): update the underlying TSI layer to use C++ types like
591
+ // std::string and absl::string_view to avoid making another copy here.
592
+ pem_root_certs = std::string(*pem_root_certs_);
593
+ }
594
+ tsi_ssl_pem_key_cert_pair* pem_key_cert_pairs = nullptr;
595
+ pem_key_cert_pairs = ConvertToTsiPemKeyCertPair(*pem_key_cert_pair_list_);
596
+ size_t num_key_cert_pairs = (*pem_key_cert_pair_list_).size();
544
597
  grpc_security_status status = grpc_ssl_tsi_server_handshaker_factory_init(
545
598
  pem_key_cert_pairs, num_key_cert_pairs,
546
- key_materials_config_->pem_root_certs(),
547
- creds->options().cert_request_type(),
548
- grpc_get_tsi_tls_version(creds->options().min_tls_version()),
549
- grpc_get_tsi_tls_version(creds->options().max_tls_version()),
599
+ pem_root_certs.empty() ? nullptr : pem_root_certs.c_str(),
600
+ options_->cert_request_type(),
601
+ grpc_get_tsi_tls_version(options_->min_tls_version()),
602
+ grpc_get_tsi_tls_version(options_->max_tls_version()),
550
603
  &server_handshaker_factory_);
551
604
  /* Free memory. */
552
605
  grpc_tsi_ssl_pem_key_cert_pairs_destroy(pem_key_cert_pairs,
@@ -554,53 +607,18 @@ grpc_security_status TlsServerSecurityConnector::ReplaceHandshakerFactory() {
554
607
  return status;
555
608
  }
556
609
 
557
- grpc_security_status TlsServerSecurityConnector::InitializeHandshakerFactory() {
558
- grpc_core::MutexLock lock(&mu_);
559
- const TlsServerCredentials* creds =
560
- static_cast<const TlsServerCredentials*>(server_creds());
561
- grpc_tls_key_materials_config* key_materials_config =
562
- creds->options().key_materials_config();
563
- if (key_materials_config != nullptr) {
564
- key_materials_config_->set_key_materials(
565
- key_materials_config->pem_root_certs(),
566
- key_materials_config->pem_key_cert_pair_list());
567
- }
568
- grpc_ssl_certificate_config_reload_status reload_status =
569
- GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED;
570
- /** If |creds->options()| has a credential reload config, then the call to
571
- * |TlsFetchKeyMaterials| will use it to update the root cert and
572
- * pem-key-cert-pair list stored in |key_materials_config_|. Otherwise, it
573
- * will return |GRPC_STATUS_OK| if |key_materials_config_| already has
574
- * credentials, and an error code if not. **/
575
- if (TlsFetchKeyMaterials(key_materials_config_, creds->options(), true,
576
- &reload_status) != GRPC_STATUS_OK) {
577
- /* Raise an error if key materials are not populated. */
578
- return GRPC_SECURITY_ERROR;
579
- }
580
- return ReplaceHandshakerFactory();
581
- }
610
+ namespace internal {
582
611
 
583
- grpc_security_status TlsServerSecurityConnector::RefreshHandshakerFactory() {
584
- grpc_core::MutexLock lock(&mu_);
585
- const TlsServerCredentials* creds =
586
- static_cast<const TlsServerCredentials*>(server_creds());
587
- grpc_ssl_certificate_config_reload_status reload_status =
588
- GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED;
589
- /** If |creds->options()| has a credential reload config, then the call to
590
- * |TlsFetchKeyMaterials| will use it to update the root cert and
591
- * pem-key-cert-pair list stored in |key_materials_config_|. Otherwise, it
592
- * will return |GRPC_STATUS_OK| if |key_materials_config_| already has
593
- * credentials, and an error code if not. **/
594
- if (TlsFetchKeyMaterials(key_materials_config_, creds->options(), true,
595
- &reload_status) != GRPC_STATUS_OK) {
596
- return GRPC_SECURITY_ERROR;
597
- }
598
- if (reload_status != GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW) {
599
- /* At this point, we should have key materials populated. */
600
- return GRPC_SECURITY_OK;
601
- } else {
602
- return ReplaceHandshakerFactory();
612
+ grpc_error* TlsCheckHostName(const char* peer_name, const tsi_peer* peer) {
613
+ /* Check the peer name if specified. */
614
+ if (peer_name != nullptr && !grpc_ssl_host_matches_name(peer, peer_name)) {
615
+ return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
616
+ absl::StrCat("Peer name ", peer_name, " is not in peer certificate")
617
+ .c_str());
603
618
  }
619
+ return GRPC_ERROR_NONE;
604
620
  }
605
621
 
622
+ } // namespace internal
623
+
606
624
  } // namespace grpc_core