grpc 1.18.0 → 1.22.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 (428) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +4731 -7404
  3. data/etc/roots.pem +146 -0
  4. data/include/grpc/grpc.h +11 -6
  5. data/include/grpc/grpc_security.h +297 -4
  6. data/include/grpc/grpc_security_constants.h +1 -1
  7. data/include/grpc/impl/codegen/byte_buffer.h +13 -0
  8. data/include/grpc/impl/codegen/gpr_types.h +1 -1
  9. data/include/grpc/impl/codegen/grpc_types.h +30 -7
  10. data/include/grpc/impl/codegen/port_platform.h +88 -7
  11. data/include/grpc/impl/codegen/slice.h +2 -22
  12. data/include/grpc/impl/codegen/status.h +2 -1
  13. data/include/grpc/impl/codegen/sync_posix.h +18 -0
  14. data/include/grpc/slice.h +3 -3
  15. data/src/core/ext/filters/client_channel/backup_poller.cc +21 -16
  16. data/src/core/ext/filters/client_channel/backup_poller.h +8 -2
  17. data/src/core/ext/filters/client_channel/channel_connectivity.cc +3 -1
  18. data/src/core/ext/filters/client_channel/client_channel.cc +2435 -1557
  19. data/src/core/ext/filters/client_channel/client_channel.h +2 -10
  20. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +6 -89
  21. data/src/core/ext/filters/client_channel/client_channel_channelz.h +8 -33
  22. data/src/core/ext/filters/client_channel/client_channel_factory.cc +22 -34
  23. data/src/core/ext/filters/client_channel/client_channel_factory.h +19 -38
  24. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +9 -11
  25. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +179 -0
  26. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +68 -0
  27. data/src/core/ext/filters/client_channel/health/health_check_client.cc +59 -55
  28. data/src/core/ext/filters/client_channel/health/health_check_client.h +20 -9
  29. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +146 -157
  30. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +29 -32
  32. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +844 -859
  33. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +3 -1
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +2 -6
  35. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +6 -2
  36. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +14 -12
  37. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +16 -12
  38. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +3 -3
  39. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +185 -312
  40. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +143 -375
  41. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +192 -245
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +1554 -955
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc +0 -43
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.cc +14 -10
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +2 -2
  46. data/src/core/ext/filters/client_channel/lb_policy.cc +115 -22
  47. data/src/core/ext/filters/client_channel/lb_policy.h +260 -129
  48. data/src/core/ext/filters/client_channel/lb_policy_factory.h +5 -2
  49. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +107 -4
  50. data/src/core/ext/filters/client_channel/lb_policy_registry.h +10 -3
  51. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +96 -0
  52. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +56 -0
  53. data/src/core/ext/filters/client_channel/parse_address.cc +24 -5
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +121 -122
  55. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +84 -2
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +3 -0
  57. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +179 -0
  58. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +24 -10
  59. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +111 -47
  60. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +7 -13
  61. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +2 -2
  62. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +39 -0
  63. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc +0 -6
  64. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -64
  65. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +28 -0
  66. data/src/core/{lib/iomgr/network_status_tracker.cc → ext/filters/client_channel/resolver/dns/dns_resolver_selection.h} +8 -15
  67. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +36 -82
  68. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +111 -72
  69. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +13 -8
  70. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +28 -63
  71. data/src/core/ext/filters/client_channel/resolver.cc +54 -1
  72. data/src/core/ext/filters/client_channel/resolver.h +52 -23
  73. data/src/core/ext/filters/client_channel/resolver_factory.h +3 -1
  74. data/src/core/ext/filters/client_channel/resolver_registry.cc +5 -2
  75. data/src/core/ext/filters/client_channel/resolver_registry.h +5 -4
  76. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +368 -241
  77. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +58 -76
  78. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +543 -0
  79. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +139 -0
  80. data/src/core/ext/filters/client_channel/server_address.cc +4 -54
  81. data/src/core/ext/filters/client_channel/server_address.h +1 -13
  82. data/src/core/ext/filters/client_channel/service_config.cc +329 -0
  83. data/src/core/ext/filters/client_channel/service_config.h +205 -0
  84. data/src/core/ext/filters/client_channel/subchannel.cc +803 -838
  85. data/src/core/ext/filters/client_channel/subchannel.h +295 -128
  86. data/src/core/ext/filters/client_channel/subchannel_interface.h +113 -0
  87. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +97 -0
  88. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +94 -0
  89. data/src/core/ext/filters/deadline/deadline_filter.cc +3 -4
  90. data/src/core/ext/filters/deadline/deadline_filter.h +3 -2
  91. data/src/core/ext/filters/http/client/http_client_filter.cc +7 -5
  92. data/src/core/ext/filters/http/client/http_client_filter.h +1 -1
  93. data/src/core/ext/filters/http/client_authority_filter.cc +6 -3
  94. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +4 -3
  95. data/src/core/ext/filters/http/server/http_server_filter.cc +18 -12
  96. data/src/core/ext/filters/max_age/max_age_filter.cc +5 -2
  97. data/src/core/ext/filters/message_size/message_size_filter.cc +119 -77
  98. data/src/core/ext/filters/message_size/message_size_filter.h +33 -0
  99. data/src/core/ext/transport/chttp2/alpn/alpn.h +1 -1
  100. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +13 -12
  101. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +45 -47
  102. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +134 -143
  103. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +68 -21
  104. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +4 -4
  105. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +4 -4
  106. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +7 -6
  107. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +4 -3
  108. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +9 -7
  109. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +156 -94
  110. data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -2
  111. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -1
  112. data/src/core/ext/transport/chttp2/transport/frame_data.cc +33 -37
  113. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
  114. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +6 -5
  115. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -2
  116. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -4
  117. data/src/core/ext/transport/chttp2/transport/frame_ping.h +1 -1
  118. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +8 -6
  119. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -1
  120. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -4
  121. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
  122. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +7 -6
  123. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +1 -1
  124. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +74 -55
  125. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +33 -11
  126. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +3 -2
  127. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +7 -14
  128. data/src/core/ext/transport/chttp2/transport/hpack_table.h +10 -1
  129. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +9 -5
  130. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +9 -3
  131. data/src/core/ext/transport/chttp2/transport/internal.h +43 -30
  132. data/src/core/ext/transport/chttp2/transport/parsing.cc +52 -70
  133. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +3 -3
  134. data/src/core/ext/transport/chttp2/transport/writing.cc +70 -33
  135. data/src/core/ext/transport/inproc/inproc_transport.cc +26 -18
  136. data/src/core/lib/channel/channel_args.cc +2 -101
  137. data/src/core/lib/channel/channel_args.h +3 -37
  138. data/src/core/lib/channel/channel_stack.h +10 -6
  139. data/src/core/lib/channel/channel_trace.cc +4 -4
  140. data/src/core/lib/channel/channel_trace.h +4 -4
  141. data/src/core/lib/channel/channelz.cc +168 -38
  142. data/src/core/lib/channel/channelz.h +40 -44
  143. data/src/core/lib/channel/channelz_registry.cc +75 -107
  144. data/src/core/lib/channel/channelz_registry.h +10 -28
  145. data/src/core/lib/channel/connected_channel.cc +2 -2
  146. data/src/core/lib/channel/context.h +2 -2
  147. data/src/core/lib/channel/handshaker.cc +151 -218
  148. data/src/core/lib/channel/handshaker.h +110 -101
  149. data/src/core/lib/channel/handshaker_factory.h +11 -19
  150. data/src/core/lib/channel/handshaker_registry.cc +67 -51
  151. data/src/core/lib/channel/handshaker_registry.h +21 -16
  152. data/src/core/lib/compression/algorithm_metadata.h +3 -3
  153. data/src/core/lib/compression/compression.cc +14 -9
  154. data/src/core/lib/compression/compression_args.cc +127 -0
  155. data/src/core/lib/compression/compression_args.h +55 -0
  156. data/src/core/lib/compression/compression_internal.cc +16 -12
  157. data/src/core/lib/compression/compression_internal.h +1 -1
  158. data/src/core/lib/compression/stream_compression.cc +3 -2
  159. data/src/core/lib/compression/stream_compression.h +2 -2
  160. data/src/core/lib/compression/stream_compression_gzip.cc +9 -9
  161. data/src/core/lib/debug/trace.cc +13 -7
  162. data/src/core/lib/debug/trace.h +14 -1
  163. data/src/core/lib/gpr/arena.h +13 -9
  164. data/src/core/lib/gpr/cpu_posix.cc +5 -3
  165. data/src/core/lib/gpr/env.h +3 -6
  166. data/src/core/lib/gpr/env_linux.cc +6 -1
  167. data/src/core/lib/gpr/env_posix.cc +5 -0
  168. data/src/core/lib/gpr/env_windows.cc +7 -5
  169. data/src/core/lib/gpr/log.cc +9 -13
  170. data/src/core/lib/gpr/log_posix.cc +2 -1
  171. data/src/core/lib/gpr/string.cc +20 -7
  172. data/src/core/lib/gpr/string.h +10 -3
  173. data/src/core/lib/gpr/sync_posix.cc +65 -4
  174. data/src/core/lib/gpr/time.cc +8 -0
  175. data/src/core/lib/gpr/time_posix.cc +21 -2
  176. data/src/core/lib/gprpp/arena.cc +103 -0
  177. data/src/core/lib/gprpp/arena.h +121 -0
  178. data/src/core/lib/gprpp/atomic.h +75 -5
  179. data/src/core/lib/gprpp/fork.cc +13 -32
  180. data/src/core/lib/gprpp/fork.h +5 -1
  181. data/src/core/lib/gprpp/global_config.h +96 -0
  182. data/src/core/lib/gprpp/global_config_custom.h +29 -0
  183. data/src/core/lib/gprpp/global_config_env.cc +135 -0
  184. data/src/core/lib/gprpp/global_config_env.h +131 -0
  185. data/src/core/lib/gprpp/global_config_generic.h +44 -0
  186. data/src/core/lib/gprpp/inlined_vector.h +8 -0
  187. data/src/core/lib/gprpp/map.h +436 -0
  188. data/src/core/lib/gprpp/memory.h +2 -2
  189. data/src/core/lib/gprpp/optional.h +48 -0
  190. data/src/core/lib/gprpp/orphanable.h +6 -5
  191. data/src/core/lib/gprpp/{mutex_lock.h → pair.h} +15 -19
  192. data/src/core/lib/gprpp/ref_counted.h +36 -17
  193. data/src/core/lib/gprpp/sync.h +126 -0
  194. data/src/core/lib/gprpp/thd.h +42 -7
  195. data/src/core/lib/gprpp/thd_posix.cc +31 -13
  196. data/src/core/lib/gprpp/thd_windows.cc +47 -34
  197. data/src/core/lib/http/httpcli.cc +6 -5
  198. data/src/core/lib/http/httpcli_security_connector.cc +13 -15
  199. data/src/core/lib/http/parser.cc +3 -2
  200. data/src/core/lib/http/parser.h +2 -1
  201. data/src/core/lib/iomgr/buffer_list.cc +182 -24
  202. data/src/core/lib/iomgr/buffer_list.h +72 -10
  203. data/src/core/lib/iomgr/call_combiner.cc +84 -90
  204. data/src/core/lib/iomgr/call_combiner.h +75 -82
  205. data/src/core/lib/iomgr/cfstream_handle.cc +203 -0
  206. data/src/core/lib/iomgr/cfstream_handle.h +86 -0
  207. data/src/core/lib/iomgr/combiner.cc +11 -3
  208. data/src/core/lib/iomgr/combiner.h +1 -1
  209. data/src/core/lib/iomgr/endpoint.cc +2 -2
  210. data/src/core/lib/iomgr/endpoint.h +3 -2
  211. data/src/core/lib/iomgr/endpoint_cfstream.cc +375 -0
  212. data/src/core/lib/iomgr/endpoint_cfstream.h +49 -0
  213. data/src/core/lib/iomgr/endpoint_pair_windows.cc +2 -2
  214. data/src/core/lib/iomgr/error.cc +21 -17
  215. data/src/core/lib/iomgr/error.h +36 -6
  216. data/src/core/lib/iomgr/error_cfstream.cc +52 -0
  217. data/src/core/lib/iomgr/error_cfstream.h +31 -0
  218. data/src/core/lib/iomgr/error_internal.h +1 -1
  219. data/src/core/lib/iomgr/ev_epoll1_linux.cc +44 -28
  220. data/src/core/lib/iomgr/ev_epollex_linux.cc +173 -194
  221. data/src/core/lib/iomgr/ev_poll_posix.cc +16 -487
  222. data/src/core/lib/iomgr/ev_posix.cc +29 -19
  223. data/src/core/lib/iomgr/ev_posix.h +19 -3
  224. data/src/core/lib/iomgr/ev_windows.cc +2 -2
  225. data/src/core/lib/iomgr/exec_ctx.cc +1 -0
  226. data/src/core/lib/iomgr/exec_ctx.h +137 -8
  227. data/src/core/lib/iomgr/executor.cc +147 -95
  228. data/src/core/lib/iomgr/executor.h +55 -49
  229. data/src/core/lib/iomgr/fork_posix.cc +6 -5
  230. data/src/core/lib/{gprpp/atomic_with_std.h → iomgr/grpc_if_nametoindex.h} +8 -13
  231. data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +42 -0
  232. data/src/core/lib/iomgr/{network_status_tracker.h → grpc_if_nametoindex_unsupported.cc} +15 -9
  233. data/src/core/lib/iomgr/internal_errqueue.cc +3 -5
  234. data/src/core/lib/iomgr/internal_errqueue.h +105 -3
  235. data/src/core/lib/iomgr/iomgr.cc +20 -13
  236. data/src/core/lib/iomgr/iomgr.h +15 -0
  237. data/src/core/lib/iomgr/iomgr_custom.cc +17 -3
  238. data/src/core/lib/iomgr/iomgr_custom.h +2 -0
  239. data/src/core/lib/iomgr/iomgr_internal.cc +10 -0
  240. data/src/core/lib/iomgr/iomgr_internal.h +12 -0
  241. data/src/core/lib/iomgr/iomgr_posix.cc +19 -2
  242. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +93 -0
  243. data/src/core/lib/iomgr/iomgr_windows.cc +18 -2
  244. data/src/core/lib/iomgr/lockfree_event.cc +4 -4
  245. data/src/core/lib/iomgr/port.h +35 -0
  246. data/src/core/lib/iomgr/resolve_address_posix.cc +4 -3
  247. data/src/core/lib/iomgr/resolve_address_windows.cc +2 -1
  248. data/src/core/lib/iomgr/resource_quota.cc +40 -37
  249. data/src/core/lib/iomgr/socket_utils_common_posix.cc +6 -2
  250. data/src/core/lib/iomgr/socket_windows.cc +19 -0
  251. data/src/core/lib/iomgr/socket_windows.h +8 -0
  252. data/src/core/lib/iomgr/tcp_client_cfstream.cc +216 -0
  253. data/src/core/lib/iomgr/tcp_client_custom.cc +2 -2
  254. data/src/core/lib/iomgr/tcp_client_posix.cc +3 -3
  255. data/src/core/lib/iomgr/tcp_client_windows.cc +7 -5
  256. data/src/core/lib/iomgr/tcp_custom.cc +10 -14
  257. data/src/core/lib/iomgr/tcp_posix.cc +256 -140
  258. data/src/core/lib/iomgr/tcp_server.cc +5 -0
  259. data/src/core/lib/iomgr/tcp_server.h +24 -0
  260. data/src/core/lib/iomgr/tcp_server_custom.cc +14 -12
  261. data/src/core/lib/iomgr/tcp_server_posix.cc +86 -12
  262. data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -0
  263. data/src/core/lib/iomgr/tcp_server_windows.cc +13 -11
  264. data/src/core/lib/iomgr/tcp_uv.cc +5 -7
  265. data/src/core/lib/iomgr/tcp_windows.cc +8 -14
  266. data/src/core/lib/iomgr/timer.h +2 -1
  267. data/src/core/lib/iomgr/timer_generic.cc +16 -16
  268. data/src/core/lib/iomgr/timer_manager.cc +20 -11
  269. data/src/core/lib/iomgr/udp_server.cc +8 -6
  270. data/src/core/lib/iomgr/wakeup_fd_posix.cc +1 -19
  271. data/src/core/lib/json/json.cc +1 -4
  272. data/src/core/lib/profiling/basic_timers.cc +10 -4
  273. data/src/core/lib/security/context/security_context.cc +6 -7
  274. data/src/core/lib/security/context/security_context.h +3 -4
  275. data/src/core/lib/security/credentials/alts/alts_credentials.cc +1 -1
  276. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +2 -2
  277. data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -0
  278. data/src/core/lib/security/credentials/credentials.h +9 -1
  279. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +15 -3
  280. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +2 -0
  281. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  282. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +2 -1
  283. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +10 -6
  284. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -1
  285. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +3 -3
  286. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +9 -8
  287. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +20 -2
  288. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +2 -2
  289. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +192 -0
  290. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +210 -0
  291. data/src/core/lib/security/credentials/tls/spiffe_credentials.cc +129 -0
  292. data/src/core/lib/security/credentials/tls/spiffe_credentials.h +62 -0
  293. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +10 -8
  294. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -12
  295. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +7 -5
  296. data/src/core/lib/security/security_connector/local/local_security_connector.cc +10 -8
  297. data/src/core/lib/security/security_connector/security_connector.cc +0 -1
  298. data/src/core/lib/security/security_connector/security_connector.h +3 -3
  299. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +39 -38
  300. data/src/core/lib/security/security_connector/ssl_utils.cc +164 -26
  301. data/src/core/lib/security/security_connector/ssl_utils.h +70 -1
  302. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +426 -0
  303. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +122 -0
  304. data/src/core/lib/security/transport/auth_filters.h +5 -2
  305. data/src/core/lib/security/transport/client_auth_filter.cc +55 -50
  306. data/src/core/lib/security/transport/secure_endpoint.cc +6 -6
  307. data/src/core/lib/security/transport/security_handshaker.cc +271 -303
  308. data/src/core/lib/security/transport/security_handshaker.h +11 -2
  309. data/src/core/lib/security/transport/server_auth_filter.cc +3 -3
  310. data/src/core/lib/slice/b64.h +2 -2
  311. data/src/core/lib/slice/percent_encoding.cc +3 -3
  312. data/src/core/lib/slice/percent_encoding.h +3 -3
  313. data/src/core/lib/slice/slice.cc +174 -122
  314. data/src/core/lib/slice/slice_buffer.cc +54 -21
  315. data/src/core/lib/slice/slice_hash_table.h +4 -4
  316. data/src/core/lib/slice/slice_intern.cc +49 -107
  317. data/src/core/lib/slice/slice_internal.h +264 -3
  318. data/src/core/lib/slice/slice_string_helpers.cc +10 -1
  319. data/src/core/lib/slice/slice_string_helpers.h +3 -1
  320. data/src/core/lib/slice/slice_utils.h +50 -0
  321. data/src/core/lib/slice/slice_weak_hash_table.h +6 -6
  322. data/src/core/lib/surface/api_trace.h +1 -1
  323. data/src/core/lib/surface/byte_buffer_reader.cc +17 -0
  324. data/src/core/lib/surface/call.cc +67 -46
  325. data/src/core/lib/surface/call.h +7 -2
  326. data/src/core/lib/surface/call_details.cc +0 -1
  327. data/src/core/lib/surface/channel.cc +89 -97
  328. data/src/core/lib/surface/channel.h +60 -6
  329. data/src/core/lib/surface/channel_init.h +5 -0
  330. data/src/core/lib/surface/completion_queue.cc +221 -216
  331. data/src/core/lib/surface/completion_queue.h +2 -1
  332. data/src/core/lib/surface/init.cc +82 -33
  333. data/src/core/lib/surface/init.h +1 -0
  334. data/src/core/lib/surface/init_secure.cc +1 -1
  335. data/src/core/lib/surface/lame_client.cc +5 -7
  336. data/src/core/lib/surface/server.cc +42 -47
  337. data/src/core/lib/surface/validate_metadata.cc +14 -8
  338. data/src/core/lib/surface/validate_metadata.h +13 -2
  339. data/src/core/lib/surface/version.cc +1 -1
  340. data/src/core/lib/transport/bdp_estimator.cc +3 -3
  341. data/src/core/lib/transport/bdp_estimator.h +2 -2
  342. data/src/core/lib/transport/connectivity_state.cc +10 -40
  343. data/src/core/lib/transport/connectivity_state.h +0 -8
  344. data/src/core/lib/transport/error_utils.cc +12 -0
  345. data/src/core/lib/transport/metadata.cc +258 -267
  346. data/src/core/lib/transport/metadata.h +227 -16
  347. data/src/core/lib/transport/metadata_batch.cc +1 -1
  348. data/src/core/lib/transport/metadata_batch.h +1 -1
  349. data/src/core/lib/transport/static_metadata.cc +477 -399
  350. data/src/core/lib/transport/static_metadata.h +273 -182
  351. data/src/core/lib/transport/status_metadata.cc +3 -3
  352. data/src/core/lib/transport/timeout_encoding.cc +1 -1
  353. data/src/core/lib/transport/timeout_encoding.h +1 -1
  354. data/src/core/lib/transport/transport.cc +39 -72
  355. data/src/core/lib/transport/transport.h +59 -24
  356. data/src/core/lib/transport/transport_impl.h +1 -1
  357. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +3 -3
  358. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -1
  359. data/src/core/tsi/alts/handshaker/alts_shared_resource.h +1 -1
  360. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +4 -3
  361. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +1 -1
  362. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +1 -1
  363. data/src/core/tsi/fake_transport_security.cc +4 -4
  364. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +1 -1
  365. data/src/core/tsi/ssl_transport_security.cc +12 -10
  366. data/src/core/tsi/ssl_transport_security.h +24 -4
  367. data/src/ruby/bin/math_pb.rb +18 -16
  368. data/src/ruby/ext/grpc/extconf.rb +12 -4
  369. data/src/ruby/ext/grpc/rb_call_credentials.c +8 -5
  370. data/src/ruby/ext/grpc/rb_channel.c +14 -10
  371. data/src/ruby/ext/grpc/rb_channel_credentials.c +8 -4
  372. data/src/ruby/ext/grpc/rb_compression_options.c +9 -7
  373. data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
  374. data/src/ruby/ext/grpc/rb_grpc.c +23 -24
  375. data/src/ruby/ext/grpc/rb_grpc.h +4 -2
  376. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +24 -0
  377. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +36 -0
  378. data/src/ruby/ext/grpc/rb_server.c +8 -4
  379. data/src/ruby/lib/grpc/errors.rb +22 -3
  380. data/src/ruby/lib/grpc/generic/bidi_call.rb +1 -1
  381. data/src/ruby/lib/grpc/generic/rpc_server.rb +2 -2
  382. data/src/ruby/lib/grpc/version.rb +1 -1
  383. data/src/ruby/pb/README.md +1 -1
  384. data/src/ruby/pb/grpc/health/v1/health_pb.rb +13 -10
  385. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +18 -0
  386. data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +3 -1
  387. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +58 -56
  388. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -0
  389. data/src/ruby/spec/errors_spec.rb +141 -0
  390. data/third_party/cares/cares/ares.h +12 -0
  391. data/third_party/cares/cares/ares_create_query.c +5 -1
  392. data/third_party/cares/cares/ares_data.c +74 -73
  393. data/third_party/cares/cares/ares_destroy.c +6 -1
  394. data/third_party/cares/cares/ares_gethostbyaddr.c +5 -5
  395. data/third_party/cares/cares/ares_gethostbyname.c +15 -4
  396. data/third_party/cares/cares/ares_getnameinfo.c +11 -0
  397. data/third_party/cares/cares/ares_init.c +274 -173
  398. data/third_party/cares/cares/ares_library_init.c +21 -3
  399. data/third_party/cares/cares/ares_options.c +6 -2
  400. data/third_party/cares/cares/ares_parse_naptr_reply.c +7 -6
  401. data/third_party/cares/cares/ares_parse_ptr_reply.c +4 -2
  402. data/third_party/cares/cares/ares_platform.c +7 -0
  403. data/third_party/cares/cares/ares_private.h +19 -11
  404. data/third_party/cares/cares/ares_process.c +27 -2
  405. data/third_party/cares/cares/ares_rules.h +1 -1
  406. data/third_party/cares/cares/ares_search.c +7 -0
  407. data/third_party/cares/cares/ares_send.c +6 -0
  408. data/third_party/cares/cares/ares_strsplit.c +174 -0
  409. data/third_party/cares/cares/ares_strsplit.h +43 -0
  410. data/third_party/cares/cares/ares_version.h +4 -4
  411. data/third_party/cares/cares/config-win32.h +1 -1
  412. data/third_party/cares/cares/inet_ntop.c +2 -3
  413. data/third_party/cares/config_darwin/ares_config.h +3 -0
  414. data/third_party/cares/config_freebsd/ares_config.h +3 -0
  415. data/third_party/cares/config_linux/ares_config.h +3 -0
  416. data/third_party/cares/config_openbsd/ares_config.h +3 -0
  417. metadata +83 -48
  418. data/src/core/ext/filters/client_channel/request_routing.cc +0 -936
  419. data/src/core/ext/filters/client_channel/request_routing.h +0 -177
  420. data/src/core/ext/filters/client_channel/subchannel_index.cc +0 -248
  421. data/src/core/ext/filters/client_channel/subchannel_index.h +0 -76
  422. data/src/core/lib/channel/handshaker_factory.cc +0 -42
  423. data/src/core/lib/gpr/arena.cc +0 -192
  424. data/src/core/lib/gprpp/atomic_with_atm.h +0 -57
  425. data/src/core/lib/iomgr/wakeup_fd_cv.cc +0 -107
  426. data/src/core/lib/iomgr/wakeup_fd_cv.h +0 -69
  427. data/src/core/lib/transport/service_config.cc +0 -106
  428. data/src/core/lib/transport/service_config.h +0 -249
@@ -26,15 +26,39 @@
26
26
  #include <grpc/grpc_security.h>
27
27
  #include <grpc/slice_buffer.h>
28
28
 
29
+ #include "src/core/lib/gprpp/global_config.h"
29
30
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
31
+ #include "src/core/lib/iomgr/error.h"
32
+ #include "src/core/lib/security/security_connector/security_connector.h"
30
33
  #include "src/core/tsi/ssl_transport_security.h"
34
+ #include "src/core/tsi/transport_security.h"
31
35
  #include "src/core/tsi/transport_security_interface.h"
32
36
 
33
- /* --- Util. --- */
37
+ GPR_GLOBAL_CONFIG_DECLARE_STRING(grpc_default_ssl_roots_file_path);
38
+ GPR_GLOBAL_CONFIG_DECLARE_BOOL(grpc_not_use_system_ssl_roots);
39
+
40
+ /* --- Util --- */
34
41
 
35
42
  /* --- URL schemes. --- */
36
43
  #define GRPC_SSL_URL_SCHEME "https"
37
44
 
45
+ /* Check ALPN information returned from SSL handshakes. */
46
+ grpc_error* grpc_ssl_check_alpn(const tsi_peer* peer);
47
+
48
+ /* Check peer name information returned from SSL handshakes. */
49
+ grpc_error* grpc_ssl_check_peer_name(const char* peer_name,
50
+ const tsi_peer* peer);
51
+ /* Compare targer_name information extracted from SSL security connectors. */
52
+ bool grpc_ssl_cmp_target_name(const char* target_name,
53
+ const char* other_target_name,
54
+ const char* overridden_target_name,
55
+ const char* other_overridden_target_name);
56
+ /* Check the host that will be set for a call is acceptable.*/
57
+ bool grpc_ssl_check_call_host(const char* host, const char* target_name,
58
+ const char* overridden_target_name,
59
+ grpc_auth_context* auth_context,
60
+ grpc_closure* on_call_host_checked,
61
+ grpc_error** error);
38
62
  /* Return HTTP2-compliant cipher suites that gRPC accepts by default. */
39
63
  const char* grpc_get_ssl_cipher_suites(void);
40
64
 
@@ -47,6 +71,18 @@ grpc_get_tsi_client_certificate_request_type(
47
71
  /* Return an array of strings containing alpn protocols. */
48
72
  const char** grpc_fill_alpn_protocol_strings(size_t* num_alpn_protocols);
49
73
 
74
+ /* Initialize TSI SSL server/client handshaker factory. */
75
+ grpc_security_status grpc_ssl_tsi_client_handshaker_factory_init(
76
+ tsi_ssl_pem_key_cert_pair* key_cert_pair, const char* pem_root_certs,
77
+ tsi_ssl_session_cache* ssl_session_cache,
78
+ tsi_ssl_client_handshaker_factory** handshaker_factory);
79
+
80
+ grpc_security_status grpc_ssl_tsi_server_handshaker_factory_init(
81
+ tsi_ssl_pem_key_cert_pair* key_cert_pairs, size_t num_key_cert_pairs,
82
+ const char* pem_root_certs,
83
+ grpc_ssl_client_certificate_request_type client_certificate_request,
84
+ tsi_ssl_server_handshaker_factory** handshaker_factory);
85
+
50
86
  /* Exposed for testing only. */
51
87
  grpc_core::RefCountedPtr<grpc_auth_context> grpc_ssl_peer_to_auth_context(
52
88
  const tsi_peer* peer);
@@ -89,6 +125,39 @@ class DefaultSslRootStore {
89
125
  static grpc_slice default_pem_root_certs_;
90
126
  };
91
127
 
128
+ class PemKeyCertPair {
129
+ public:
130
+ // Construct from the C struct. We steal its members and then immediately
131
+ // free it.
132
+ explicit PemKeyCertPair(grpc_ssl_pem_key_cert_pair* pair)
133
+ : private_key_(const_cast<char*>(pair->private_key)),
134
+ cert_chain_(const_cast<char*>(pair->cert_chain)) {
135
+ gpr_free(pair);
136
+ }
137
+
138
+ // Movable.
139
+ PemKeyCertPair(PemKeyCertPair&& other) {
140
+ private_key_ = std::move(other.private_key_);
141
+ cert_chain_ = std::move(other.cert_chain_);
142
+ }
143
+ PemKeyCertPair& operator=(PemKeyCertPair&& other) {
144
+ private_key_ = std::move(other.private_key_);
145
+ cert_chain_ = std::move(other.cert_chain_);
146
+ return *this;
147
+ }
148
+
149
+ // Not copyable.
150
+ PemKeyCertPair(const PemKeyCertPair&) = delete;
151
+ PemKeyCertPair& operator=(const PemKeyCertPair&) = delete;
152
+
153
+ char* private_key() const { return private_key_.get(); }
154
+ char* cert_chain() const { return cert_chain_.get(); }
155
+
156
+ private:
157
+ grpc_core::UniquePtr<char> private_key_;
158
+ grpc_core::UniquePtr<char> cert_chain_;
159
+ };
160
+
92
161
  } // namespace grpc_core
93
162
 
94
163
  #endif /* GRPC_CORE_LIB_SECURITY_SECURITY_CONNECTOR_SSL_UTILS_H \
@@ -0,0 +1,426 @@
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/tls/spiffe_security_connector.h"
22
+
23
+ #include <stdbool.h>
24
+ #include <string.h>
25
+
26
+ #include <grpc/grpc.h>
27
+ #include <grpc/support/alloc.h>
28
+ #include <grpc/support/log.h>
29
+ #include <grpc/support/string_util.h>
30
+
31
+ #include "src/core/lib/gpr/host_port.h"
32
+ #include "src/core/lib/security/credentials/ssl/ssl_credentials.h"
33
+ #include "src/core/lib/security/credentials/tls/spiffe_credentials.h"
34
+ #include "src/core/lib/security/security_connector/ssl_utils.h"
35
+ #include "src/core/lib/security/transport/security_handshaker.h"
36
+ #include "src/core/lib/slice/slice_internal.h"
37
+ #include "src/core/lib/transport/transport.h"
38
+ #include "src/core/tsi/ssl_transport_security.h"
39
+ #include "src/core/tsi/transport_security.h"
40
+
41
+ namespace {
42
+
43
+ tsi_ssl_pem_key_cert_pair* ConvertToTsiPemKeyCertPair(
44
+ const grpc_tls_key_materials_config::PemKeyCertPairList& cert_pair_list) {
45
+ tsi_ssl_pem_key_cert_pair* tsi_pairs = nullptr;
46
+ size_t num_key_cert_pairs = cert_pair_list.size();
47
+ if (num_key_cert_pairs > 0) {
48
+ GPR_ASSERT(cert_pair_list.data() != nullptr);
49
+ tsi_pairs = static_cast<tsi_ssl_pem_key_cert_pair*>(
50
+ gpr_zalloc(num_key_cert_pairs * sizeof(tsi_ssl_pem_key_cert_pair)));
51
+ }
52
+ for (size_t i = 0; i < num_key_cert_pairs; i++) {
53
+ GPR_ASSERT(cert_pair_list[i].private_key() != nullptr);
54
+ GPR_ASSERT(cert_pair_list[i].cert_chain() != nullptr);
55
+ tsi_pairs[i].cert_chain = gpr_strdup(cert_pair_list[i].cert_chain());
56
+ tsi_pairs[i].private_key = gpr_strdup(cert_pair_list[i].private_key());
57
+ }
58
+ return tsi_pairs;
59
+ }
60
+
61
+ /** -- Util function to populate SPIFFE server/channel credentials. -- */
62
+ grpc_core::RefCountedPtr<grpc_tls_key_materials_config>
63
+ PopulateSpiffeCredentials(const grpc_tls_credentials_options& options) {
64
+ GPR_ASSERT(options.credential_reload_config() != nullptr ||
65
+ options.key_materials_config() != nullptr);
66
+ grpc_core::RefCountedPtr<grpc_tls_key_materials_config> key_materials_config;
67
+ /* Use credential reload config to fetch credentials. */
68
+ if (options.credential_reload_config() != nullptr) {
69
+ grpc_tls_credential_reload_arg* arg =
70
+ grpc_core::New<grpc_tls_credential_reload_arg>();
71
+ key_materials_config = grpc_tls_key_materials_config_create()->Ref();
72
+ arg->key_materials_config = key_materials_config.get();
73
+ int result = options.credential_reload_config()->Schedule(arg);
74
+ if (result) {
75
+ /* Do not support async credential reload. */
76
+ gpr_log(GPR_ERROR, "Async credential reload is unsupported now.");
77
+ } else {
78
+ grpc_ssl_certificate_config_reload_status status = arg->status;
79
+ if (status == GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED) {
80
+ gpr_log(GPR_DEBUG, "Credential does not change after reload.");
81
+ } else if (status == GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL) {
82
+ gpr_log(GPR_ERROR, "Credential reload failed with an error: %s",
83
+ arg->error_details);
84
+ }
85
+ }
86
+ gpr_free((void*)arg->error_details);
87
+ grpc_core::Delete(arg);
88
+ /* Use existing key materials config. */
89
+ } else {
90
+ key_materials_config = options.key_materials_config()->Ref();
91
+ }
92
+ return key_materials_config;
93
+ }
94
+
95
+ } // namespace
96
+
97
+ SpiffeChannelSecurityConnector::SpiffeChannelSecurityConnector(
98
+ grpc_core::RefCountedPtr<grpc_channel_credentials> channel_creds,
99
+ grpc_core::RefCountedPtr<grpc_call_credentials> request_metadata_creds,
100
+ const char* target_name, const char* overridden_target_name)
101
+ : grpc_channel_security_connector(GRPC_SSL_URL_SCHEME,
102
+ std::move(channel_creds),
103
+ std::move(request_metadata_creds)),
104
+ overridden_target_name_(overridden_target_name == nullptr
105
+ ? nullptr
106
+ : gpr_strdup(overridden_target_name)) {
107
+ check_arg_ = ServerAuthorizationCheckArgCreate(this);
108
+ char* port;
109
+ gpr_split_host_port(target_name, &target_name_, &port);
110
+ gpr_free(port);
111
+ }
112
+
113
+ SpiffeChannelSecurityConnector::~SpiffeChannelSecurityConnector() {
114
+ if (target_name_ != nullptr) {
115
+ gpr_free(target_name_);
116
+ }
117
+ if (overridden_target_name_ != nullptr) {
118
+ gpr_free(overridden_target_name_);
119
+ }
120
+ if (client_handshaker_factory_ != nullptr) {
121
+ tsi_ssl_client_handshaker_factory_unref(client_handshaker_factory_);
122
+ }
123
+ ServerAuthorizationCheckArgDestroy(check_arg_);
124
+ }
125
+
126
+ void SpiffeChannelSecurityConnector::add_handshakers(
127
+ grpc_pollset_set* interested_parties,
128
+ grpc_core::HandshakeManager* handshake_mgr) {
129
+ // Instantiate TSI handshaker.
130
+ tsi_handshaker* tsi_hs = nullptr;
131
+ tsi_result result = tsi_ssl_client_handshaker_factory_create_handshaker(
132
+ client_handshaker_factory_,
133
+ overridden_target_name_ != nullptr ? overridden_target_name_
134
+ : target_name_,
135
+ &tsi_hs);
136
+ if (result != TSI_OK) {
137
+ gpr_log(GPR_ERROR, "Handshaker creation failed with error %s.",
138
+ tsi_result_to_string(result));
139
+ return;
140
+ }
141
+ // Create handshakers.
142
+ handshake_mgr->Add(grpc_core::SecurityHandshakerCreate(tsi_hs, this));
143
+ }
144
+
145
+ void SpiffeChannelSecurityConnector::check_peer(
146
+ tsi_peer peer, grpc_endpoint* ep,
147
+ grpc_core::RefCountedPtr<grpc_auth_context>* auth_context,
148
+ grpc_closure* on_peer_checked) {
149
+ const char* target_name = overridden_target_name_ != nullptr
150
+ ? overridden_target_name_
151
+ : target_name_;
152
+ grpc_error* error = grpc_ssl_check_alpn(&peer);
153
+ if (error != GRPC_ERROR_NONE) {
154
+ GRPC_CLOSURE_SCHED(on_peer_checked, error);
155
+ tsi_peer_destruct(&peer);
156
+ return;
157
+ }
158
+ *auth_context = grpc_ssl_peer_to_auth_context(&peer);
159
+ const SpiffeCredentials* creds =
160
+ static_cast<const SpiffeCredentials*>(channel_creds());
161
+ const grpc_tls_server_authorization_check_config* config =
162
+ creds->options().server_authorization_check_config();
163
+ /* If server authorization config is not null, use it to perform
164
+ * server authorization check. */
165
+ if (config != nullptr) {
166
+ const tsi_peer_property* p =
167
+ tsi_peer_get_property_by_name(&peer, TSI_X509_PEM_CERT_PROPERTY);
168
+ if (p == nullptr) {
169
+ error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
170
+ "Cannot check peer: missing pem cert property.");
171
+ } else {
172
+ char* peer_pem = static_cast<char*>(gpr_malloc(p->value.length + 1));
173
+ memcpy(peer_pem, p->value.data, p->value.length);
174
+ peer_pem[p->value.length] = '\0';
175
+ GPR_ASSERT(check_arg_ != nullptr);
176
+ check_arg_->peer_cert = check_arg_->peer_cert == nullptr
177
+ ? gpr_strdup(peer_pem)
178
+ : check_arg_->peer_cert;
179
+ check_arg_->target_name = check_arg_->target_name == nullptr
180
+ ? gpr_strdup(target_name)
181
+ : check_arg_->target_name;
182
+ on_peer_checked_ = on_peer_checked;
183
+ gpr_free(peer_pem);
184
+ int callback_status = config->Schedule(check_arg_);
185
+ /* Server authorization check is handled asynchronously. */
186
+ if (callback_status) {
187
+ tsi_peer_destruct(&peer);
188
+ return;
189
+ }
190
+ /* Server authorization check is handled synchronously. */
191
+ error = ProcessServerAuthorizationCheckResult(check_arg_);
192
+ }
193
+ }
194
+ GRPC_CLOSURE_SCHED(on_peer_checked, error);
195
+ tsi_peer_destruct(&peer);
196
+ }
197
+
198
+ int SpiffeChannelSecurityConnector::cmp(
199
+ const grpc_security_connector* other_sc) const {
200
+ auto* other =
201
+ reinterpret_cast<const SpiffeChannelSecurityConnector*>(other_sc);
202
+ int c = channel_security_connector_cmp(other);
203
+ if (c != 0) {
204
+ return c;
205
+ }
206
+ return grpc_ssl_cmp_target_name(target_name_, other->target_name_,
207
+ overridden_target_name_,
208
+ other->overridden_target_name_);
209
+ }
210
+
211
+ bool SpiffeChannelSecurityConnector::check_call_host(
212
+ const char* host, grpc_auth_context* auth_context,
213
+ grpc_closure* on_call_host_checked, grpc_error** error) {
214
+ return grpc_ssl_check_call_host(host, target_name_, overridden_target_name_,
215
+ auth_context, on_call_host_checked, error);
216
+ }
217
+
218
+ void SpiffeChannelSecurityConnector::cancel_check_call_host(
219
+ grpc_closure* on_call_host_checked, grpc_error* error) {
220
+ GRPC_ERROR_UNREF(error);
221
+ }
222
+
223
+ grpc_core::RefCountedPtr<grpc_channel_security_connector>
224
+ SpiffeChannelSecurityConnector::CreateSpiffeChannelSecurityConnector(
225
+ grpc_core::RefCountedPtr<grpc_channel_credentials> channel_creds,
226
+ grpc_core::RefCountedPtr<grpc_call_credentials> request_metadata_creds,
227
+ const char* target_name, const char* overridden_target_name,
228
+ tsi_ssl_session_cache* ssl_session_cache) {
229
+ if (channel_creds == nullptr) {
230
+ gpr_log(GPR_ERROR,
231
+ "channel_creds is nullptr in "
232
+ "SpiffeChannelSecurityConnectorCreate()");
233
+ return nullptr;
234
+ }
235
+ if (target_name == nullptr) {
236
+ gpr_log(GPR_ERROR,
237
+ "target_name is nullptr in "
238
+ "SpiffeChannelSecurityConnectorCreate()");
239
+ return nullptr;
240
+ }
241
+ grpc_core::RefCountedPtr<SpiffeChannelSecurityConnector> c =
242
+ grpc_core::MakeRefCounted<SpiffeChannelSecurityConnector>(
243
+ std::move(channel_creds), std::move(request_metadata_creds),
244
+ target_name, overridden_target_name);
245
+ if (c->InitializeHandshakerFactory(ssl_session_cache) != GRPC_SECURITY_OK) {
246
+ return nullptr;
247
+ }
248
+ return c;
249
+ }
250
+
251
+ grpc_security_status
252
+ SpiffeChannelSecurityConnector::InitializeHandshakerFactory(
253
+ tsi_ssl_session_cache* ssl_session_cache) {
254
+ const SpiffeCredentials* creds =
255
+ static_cast<const SpiffeCredentials*>(channel_creds());
256
+ auto key_materials_config = PopulateSpiffeCredentials(creds->options());
257
+ if (key_materials_config->pem_key_cert_pair_list().empty()) {
258
+ key_materials_config->Unref();
259
+ return GRPC_SECURITY_ERROR;
260
+ }
261
+ tsi_ssl_pem_key_cert_pair* pem_key_cert_pair = ConvertToTsiPemKeyCertPair(
262
+ key_materials_config->pem_key_cert_pair_list());
263
+ grpc_security_status status = grpc_ssl_tsi_client_handshaker_factory_init(
264
+ pem_key_cert_pair, key_materials_config->pem_root_certs(),
265
+ ssl_session_cache, &client_handshaker_factory_);
266
+ // Free memory.
267
+ key_materials_config->Unref();
268
+ grpc_tsi_ssl_pem_key_cert_pairs_destroy(pem_key_cert_pair, 1);
269
+ return status;
270
+ }
271
+
272
+ void SpiffeChannelSecurityConnector::ServerAuthorizationCheckDone(
273
+ grpc_tls_server_authorization_check_arg* arg) {
274
+ GPR_ASSERT(arg != nullptr);
275
+ grpc_core::ExecCtx exec_ctx;
276
+ grpc_error* error = ProcessServerAuthorizationCheckResult(arg);
277
+ SpiffeChannelSecurityConnector* connector =
278
+ static_cast<SpiffeChannelSecurityConnector*>(arg->cb_user_data);
279
+ GRPC_CLOSURE_SCHED(connector->on_peer_checked_, error);
280
+ }
281
+
282
+ grpc_error*
283
+ SpiffeChannelSecurityConnector::ProcessServerAuthorizationCheckResult(
284
+ grpc_tls_server_authorization_check_arg* arg) {
285
+ grpc_error* error = GRPC_ERROR_NONE;
286
+ char* msg = nullptr;
287
+ /* Server authorization check is cancelled by caller. */
288
+ if (arg->status == GRPC_STATUS_CANCELLED) {
289
+ gpr_asprintf(&msg,
290
+ "Server authorization check is cancelled by the caller with "
291
+ "error: %s",
292
+ arg->error_details);
293
+ error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg);
294
+ } else if (arg->status == GRPC_STATUS_OK) {
295
+ /* Server authorization check completed successfully but returned check
296
+ * failure. */
297
+ if (!arg->success) {
298
+ gpr_asprintf(&msg, "Server authorization check failed with error: %s",
299
+ arg->error_details);
300
+ error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg);
301
+ }
302
+ /* Server authorization check did not complete correctly. */
303
+ } else {
304
+ gpr_asprintf(
305
+ &msg,
306
+ "Server authorization check did not finish correctly with error: %s",
307
+ arg->error_details);
308
+ error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg);
309
+ }
310
+ gpr_free(msg);
311
+ return error;
312
+ }
313
+
314
+ grpc_tls_server_authorization_check_arg*
315
+ SpiffeChannelSecurityConnector::ServerAuthorizationCheckArgCreate(
316
+ void* user_data) {
317
+ grpc_tls_server_authorization_check_arg* arg =
318
+ grpc_core::New<grpc_tls_server_authorization_check_arg>();
319
+ arg->cb = ServerAuthorizationCheckDone;
320
+ arg->cb_user_data = user_data;
321
+ arg->status = GRPC_STATUS_OK;
322
+ return arg;
323
+ }
324
+
325
+ void SpiffeChannelSecurityConnector::ServerAuthorizationCheckArgDestroy(
326
+ grpc_tls_server_authorization_check_arg* arg) {
327
+ if (arg == nullptr) {
328
+ return;
329
+ }
330
+ gpr_free((void*)arg->target_name);
331
+ gpr_free((void*)arg->peer_cert);
332
+ gpr_free((void*)arg->error_details);
333
+ grpc_core::Delete(arg);
334
+ }
335
+
336
+ SpiffeServerSecurityConnector::SpiffeServerSecurityConnector(
337
+ grpc_core::RefCountedPtr<grpc_server_credentials> server_creds)
338
+ : grpc_server_security_connector(GRPC_SSL_URL_SCHEME,
339
+ std::move(server_creds)) {}
340
+
341
+ SpiffeServerSecurityConnector::~SpiffeServerSecurityConnector() {
342
+ if (server_handshaker_factory_ != nullptr) {
343
+ tsi_ssl_server_handshaker_factory_unref(server_handshaker_factory_);
344
+ }
345
+ }
346
+
347
+ void SpiffeServerSecurityConnector::add_handshakers(
348
+ grpc_pollset_set* interested_parties,
349
+ grpc_core::HandshakeManager* handshake_mgr) {
350
+ /* Create a TLS SPIFFE TSI handshaker for server. */
351
+ RefreshServerHandshakerFactory();
352
+ tsi_handshaker* tsi_hs = nullptr;
353
+ tsi_result result = tsi_ssl_server_handshaker_factory_create_handshaker(
354
+ server_handshaker_factory_, &tsi_hs);
355
+ if (result != TSI_OK) {
356
+ gpr_log(GPR_ERROR, "Handshaker creation failed with error %s.",
357
+ tsi_result_to_string(result));
358
+ return;
359
+ }
360
+ handshake_mgr->Add(grpc_core::SecurityHandshakerCreate(tsi_hs, this));
361
+ }
362
+
363
+ void SpiffeServerSecurityConnector::check_peer(
364
+ tsi_peer peer, grpc_endpoint* ep,
365
+ grpc_core::RefCountedPtr<grpc_auth_context>* auth_context,
366
+ grpc_closure* on_peer_checked) {
367
+ grpc_error* error = grpc_ssl_check_alpn(&peer);
368
+ *auth_context = grpc_ssl_peer_to_auth_context(&peer);
369
+ tsi_peer_destruct(&peer);
370
+ GRPC_CLOSURE_SCHED(on_peer_checked, error);
371
+ }
372
+
373
+ int SpiffeServerSecurityConnector::cmp(
374
+ const grpc_security_connector* other) const {
375
+ return server_security_connector_cmp(
376
+ static_cast<const grpc_server_security_connector*>(other));
377
+ }
378
+
379
+ grpc_core::RefCountedPtr<grpc_server_security_connector>
380
+ SpiffeServerSecurityConnector::CreateSpiffeServerSecurityConnector(
381
+ grpc_core::RefCountedPtr<grpc_server_credentials> server_creds) {
382
+ if (server_creds == nullptr) {
383
+ gpr_log(GPR_ERROR,
384
+ "server_creds is nullptr in "
385
+ "SpiffeServerSecurityConnectorCreate()");
386
+ return nullptr;
387
+ }
388
+ grpc_core::RefCountedPtr<SpiffeServerSecurityConnector> c =
389
+ grpc_core::MakeRefCounted<SpiffeServerSecurityConnector>(
390
+ std::move(server_creds));
391
+ if (c->RefreshServerHandshakerFactory() != GRPC_SECURITY_OK) {
392
+ return nullptr;
393
+ }
394
+ return c;
395
+ }
396
+
397
+ grpc_security_status
398
+ SpiffeServerSecurityConnector::RefreshServerHandshakerFactory() {
399
+ const SpiffeServerCredentials* creds =
400
+ static_cast<const SpiffeServerCredentials*>(server_creds());
401
+ auto key_materials_config = PopulateSpiffeCredentials(creds->options());
402
+ /* Credential reload does NOT take effect and we need to keep using
403
+ * the existing handshaker factory. */
404
+ if (key_materials_config->pem_key_cert_pair_list().empty()) {
405
+ key_materials_config->Unref();
406
+ return GRPC_SECURITY_ERROR;
407
+ }
408
+ /* Credential reload takes effect and we need to free the existing
409
+ * handshaker library. */
410
+ if (server_handshaker_factory_) {
411
+ tsi_ssl_server_handshaker_factory_unref(server_handshaker_factory_);
412
+ }
413
+ tsi_ssl_pem_key_cert_pair* pem_key_cert_pairs = ConvertToTsiPemKeyCertPair(
414
+ key_materials_config->pem_key_cert_pair_list());
415
+ size_t num_key_cert_pairs =
416
+ key_materials_config->pem_key_cert_pair_list().size();
417
+ grpc_security_status status = grpc_ssl_tsi_server_handshaker_factory_init(
418
+ pem_key_cert_pairs, num_key_cert_pairs,
419
+ key_materials_config->pem_root_certs(),
420
+ creds->options().cert_request_type(), &server_handshaker_factory_);
421
+ // Free memory.
422
+ key_materials_config->Unref();
423
+ grpc_tsi_ssl_pem_key_cert_pairs_destroy(pem_key_cert_pairs,
424
+ num_key_cert_pairs);
425
+ return status;
426
+ }
@@ -0,0 +1,122 @@
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
+ #ifndef GRPC_CORE_LIB_SECURITY_SECURITY_CONNECTOR_TLS_SPIFFE_SECURITY_CONNECTOR_H
20
+ #define GRPC_CORE_LIB_SECURITY_SECURITY_CONNECTOR_TLS_SPIFFE_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/tls/grpc_tls_credentials_options.h"
26
+
27
+ #define GRPC_TLS_SPIFFE_TRANSPORT_SECURITY_TYPE "spiffe"
28
+
29
+ // Spiffe channel security connector.
30
+ class SpiffeChannelSecurityConnector final
31
+ : public grpc_channel_security_connector {
32
+ public:
33
+ // static factory method to create a SPIFFE channel security connector.
34
+ static grpc_core::RefCountedPtr<grpc_channel_security_connector>
35
+ CreateSpiffeChannelSecurityConnector(
36
+ grpc_core::RefCountedPtr<grpc_channel_credentials> channel_creds,
37
+ grpc_core::RefCountedPtr<grpc_call_credentials> request_metadata_creds,
38
+ const char* target_name, const char* overridden_target_name,
39
+ tsi_ssl_session_cache* ssl_session_cache);
40
+
41
+ SpiffeChannelSecurityConnector(
42
+ grpc_core::RefCountedPtr<grpc_channel_credentials> channel_creds,
43
+ grpc_core::RefCountedPtr<grpc_call_credentials> request_metadata_creds,
44
+ const char* target_name, const char* overridden_target_name);
45
+ ~SpiffeChannelSecurityConnector() override;
46
+
47
+ void add_handshakers(grpc_pollset_set* interested_parties,
48
+ grpc_core::HandshakeManager* handshake_mgr) override;
49
+
50
+ void check_peer(tsi_peer peer, grpc_endpoint* ep,
51
+ grpc_core::RefCountedPtr<grpc_auth_context>* auth_context,
52
+ grpc_closure* on_peer_checked) override;
53
+
54
+ int cmp(const grpc_security_connector* other_sc) const override;
55
+
56
+ bool check_call_host(const char* host, grpc_auth_context* auth_context,
57
+ grpc_closure* on_call_host_checked,
58
+ grpc_error** error) override;
59
+
60
+ void cancel_check_call_host(grpc_closure* on_call_host_checked,
61
+ grpc_error* error) override;
62
+
63
+ private:
64
+ // Initialize SSL TSI client handshaker factory.
65
+ grpc_security_status InitializeHandshakerFactory(
66
+ tsi_ssl_session_cache* ssl_session_cache);
67
+
68
+ // gRPC-provided callback executed by application, which servers to bring the
69
+ // control back to gRPC core.
70
+ static void ServerAuthorizationCheckDone(
71
+ grpc_tls_server_authorization_check_arg* arg);
72
+
73
+ // A util function to process server authorization check result.
74
+ static grpc_error* ProcessServerAuthorizationCheckResult(
75
+ grpc_tls_server_authorization_check_arg* arg);
76
+
77
+ // A util function to create a server authorization check arg instance.
78
+ static grpc_tls_server_authorization_check_arg*
79
+ ServerAuthorizationCheckArgCreate(void* user_data);
80
+
81
+ // A util function to destroy a server authorization check arg instance.
82
+ static void ServerAuthorizationCheckArgDestroy(
83
+ grpc_tls_server_authorization_check_arg* arg);
84
+
85
+ grpc_closure* on_peer_checked_;
86
+ char* target_name_;
87
+ char* overridden_target_name_;
88
+ tsi_ssl_client_handshaker_factory* client_handshaker_factory_ = nullptr;
89
+ grpc_tls_server_authorization_check_arg* check_arg_;
90
+ };
91
+
92
+ // Spiffe server security connector.
93
+ class SpiffeServerSecurityConnector final
94
+ : public grpc_server_security_connector {
95
+ public:
96
+ // static factory method to create a SPIFFE server security connector.
97
+ static grpc_core::RefCountedPtr<grpc_server_security_connector>
98
+ CreateSpiffeServerSecurityConnector(
99
+ grpc_core::RefCountedPtr<grpc_server_credentials> server_creds);
100
+
101
+ explicit SpiffeServerSecurityConnector(
102
+ grpc_core::RefCountedPtr<grpc_server_credentials> server_creds);
103
+ ~SpiffeServerSecurityConnector() override;
104
+
105
+ void add_handshakers(grpc_pollset_set* interested_parties,
106
+ grpc_core::HandshakeManager* handshake_mgr) override;
107
+
108
+ void check_peer(tsi_peer peer, grpc_endpoint* ep,
109
+ grpc_core::RefCountedPtr<grpc_auth_context>* auth_context,
110
+ grpc_closure* on_peer_checked) override;
111
+
112
+ int cmp(const grpc_security_connector* other) const override;
113
+
114
+ private:
115
+ // A util function to refresh SSL TSI server handshaker factory with a valid
116
+ // credential.
117
+ grpc_security_status RefreshServerHandshakerFactory();
118
+ tsi_ssl_server_handshaker_factory* server_handshaker_factory_ = nullptr;
119
+ };
120
+
121
+ #endif /* GRPC_CORE_LIB_SECURITY_SECURITY_CONNECTOR_TLS_SPIFFE_SECURITY_CONNECTOR_H \
122
+ */
@@ -28,10 +28,13 @@ extern const grpc_channel_filter grpc_client_auth_filter;
28
28
  extern const grpc_channel_filter grpc_server_auth_filter;
29
29
 
30
30
  void grpc_auth_metadata_context_build(
31
- const char* url_scheme, grpc_slice call_host, grpc_slice call_method,
32
- grpc_auth_context* auth_context,
31
+ const char* url_scheme, const grpc_slice& call_host,
32
+ const grpc_slice& call_method, grpc_auth_context* auth_context,
33
33
  grpc_auth_metadata_context* auth_md_context);
34
34
 
35
+ void grpc_auth_metadata_context_copy(grpc_auth_metadata_context* from,
36
+ grpc_auth_metadata_context* to);
37
+
35
38
  void grpc_auth_metadata_context_reset(grpc_auth_metadata_context* context);
36
39
 
37
40
  #endif /* GRPC_CORE_LIB_SECURITY_TRANSPORT_AUTH_FILTERS_H */