grpc 1.0.1 → 1.1.2

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 (705) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +3696 -867
  3. data/etc/roots.pem +39 -111
  4. data/include/grpc/byte_buffer.h +64 -1
  5. data/include/grpc/census.h +40 -96
  6. data/include/grpc/compression.h +2 -1
  7. data/include/grpc/grpc.h +42 -7
  8. data/include/grpc/grpc_posix.h +8 -5
  9. data/include/grpc/impl/codegen/atm.h +3 -0
  10. data/include/grpc/impl/codegen/atm_gcc_atomic.h +2 -0
  11. data/include/grpc/impl/codegen/atm_gcc_sync.h +8 -0
  12. data/include/grpc/impl/codegen/atm_windows.h +4 -0
  13. data/include/grpc/impl/codegen/byte_buffer_reader.h +4 -4
  14. data/include/grpc/impl/codegen/compression_types.h +1 -1
  15. data/include/grpc/impl/codegen/connectivity_state.h +2 -0
  16. data/include/grpc/impl/codegen/exec_ctx_fwd.h +41 -0
  17. data/include/grpc/impl/codegen/gpr_slice.h +84 -0
  18. data/include/grpc/impl/codegen/{alloc.h → gpr_types.h} +30 -29
  19. data/include/grpc/impl/codegen/grpc_types.h +91 -9
  20. data/include/grpc/impl/codegen/port_platform.h +25 -92
  21. data/include/grpc/impl/codegen/slice.h +54 -97
  22. data/include/grpc/impl/codegen/sync.h +0 -253
  23. data/include/grpc/module.modulemap +0 -2
  24. data/include/grpc/slice.h +132 -0
  25. data/include/grpc/{impl/codegen/slice_buffer.h → slice_buffer.h} +22 -39
  26. data/include/grpc/support/alloc.h +40 -1
  27. data/include/grpc/support/log.h +80 -1
  28. data/include/grpc/support/log_windows.h +2 -0
  29. data/include/grpc/support/string_util.h +1 -1
  30. data/include/grpc/support/sync.h +252 -0
  31. data/include/grpc/support/time.h +67 -1
  32. data/src/boringssl/err_data.c +639 -627
  33. data/src/core/ext/census/base_resources.c +71 -0
  34. data/src/core/ext/census/base_resources.h +39 -0
  35. data/src/core/ext/census/gen/census.pb.c +26 -29
  36. data/src/core/ext/census/gen/census.pb.h +68 -67
  37. data/src/core/ext/census/gen/trace_context.pb.c +81 -0
  38. data/src/core/ext/census/gen/trace_context.pb.h +99 -0
  39. data/src/core/ext/census/grpc_filter.c +22 -16
  40. data/src/core/ext/census/grpc_plugin.c +2 -1
  41. data/src/core/ext/census/initialize.c +16 -4
  42. data/src/core/ext/census/mlog.h +1 -1
  43. data/src/core/ext/census/placeholders.c +0 -45
  44. data/src/core/ext/census/resource.c +312 -0
  45. data/src/core/ext/census/resource.h +63 -0
  46. data/src/core/ext/census/trace_context.c +86 -0
  47. data/src/core/ext/census/trace_context.h +68 -0
  48. data/src/core/ext/census/tracing.c +8 -2
  49. data/src/core/ext/{client_config → client_channel}/channel_connectivity.c +8 -4
  50. data/src/core/ext/client_channel/client_channel.c +1218 -0
  51. data/src/core/ext/{client_config → client_channel}/client_channel.h +8 -11
  52. data/src/core/ext/{client_config → client_channel}/client_channel_factory.c +33 -3
  53. data/src/core/ext/{client_config → client_channel}/client_channel_factory.h +15 -8
  54. data/src/core/ext/{client_config/client_config_plugin.c → client_channel/client_channel_plugin.c} +16 -15
  55. data/src/core/ext/{client_config → client_channel}/connector.c +1 -1
  56. data/src/core/ext/{client_config → client_channel}/connector.h +5 -8
  57. data/{include/grpc/support/slice_buffer.h → src/core/ext/client_channel/default_initial_connect_string.c} +4 -5
  58. data/src/core/ext/client_channel/http_connect_handshaker.c +399 -0
  59. data/src/core/ext/client_channel/http_connect_handshaker.h +52 -0
  60. data/src/core/ext/{client_config → client_channel}/initial_connect_string.c +6 -7
  61. data/src/core/ext/{client_config → client_channel}/initial_connect_string.h +10 -10
  62. data/src/core/ext/{client_config → client_channel}/lb_policy.c +11 -11
  63. data/src/core/ext/{client_config → client_channel}/lb_policy.h +68 -27
  64. data/src/core/ext/client_channel/lb_policy_factory.c +163 -0
  65. data/src/core/ext/{client_config → client_channel}/lb_policy_factory.h +64 -9
  66. data/src/core/ext/{client_config → client_channel}/lb_policy_registry.c +6 -4
  67. data/src/core/ext/{client_config → client_channel}/lb_policy_registry.h +4 -4
  68. data/src/core/ext/{client_config → client_channel}/parse_address.c +21 -14
  69. data/src/core/ext/{client_config → client_channel}/parse_address.h +8 -10
  70. data/src/core/ext/{client_config → client_channel}/resolver.c +3 -4
  71. data/src/core/ext/{client_config → client_channel}/resolver.h +11 -15
  72. data/src/core/ext/{client_config → client_channel}/resolver_factory.c +4 -3
  73. data/src/core/ext/{client_config → client_channel}/resolver_factory.h +13 -11
  74. data/src/core/ext/{client_config → client_channel}/resolver_registry.c +54 -34
  75. data/src/core/ext/{client_config → client_channel}/resolver_registry.h +21 -8
  76. data/src/core/ext/{client_config → client_channel}/subchannel.c +208 -119
  77. data/src/core/ext/{client_config → client_channel}/subchannel.h +21 -11
  78. data/src/core/ext/{client_config → client_channel}/subchannel_index.c +6 -17
  79. data/src/core/ext/{client_config → client_channel}/subchannel_index.h +7 -7
  80. data/src/core/ext/{client_config → client_channel}/uri_parser.c +21 -28
  81. data/src/core/ext/{client_config → client_channel}/uri_parser.h +3 -3
  82. data/src/core/ext/lb_policy/grpclb/grpclb.c +1406 -0
  83. data/src/core/ext/lb_policy/grpclb/grpclb.h +44 -0
  84. data/src/core/ext/lb_policy/grpclb/load_balancer_api.c +117 -37
  85. data/src/core/ext/lb_policy/grpclb/load_balancer_api.h +31 -12
  86. data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +6 -36
  87. data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +22 -42
  88. data/src/core/ext/lb_policy/pick_first/pick_first.c +64 -46
  89. data/src/core/ext/lb_policy/round_robin/round_robin.c +324 -160
  90. data/src/core/ext/load_reporting/load_reporting.c +7 -56
  91. data/src/core/ext/load_reporting/load_reporting.h +41 -28
  92. data/src/core/ext/load_reporting/load_reporting_filter.c +132 -42
  93. data/src/core/ext/load_reporting/load_reporting_filter.h +1 -0
  94. data/src/core/ext/resolver/dns/native/dns_resolver.c +88 -80
  95. data/src/core/ext/resolver/sockaddr/sockaddr_resolver.c +57 -102
  96. data/src/core/ext/transport/chttp2/alpn/alpn.c +1 -1
  97. data/src/core/ext/transport/chttp2/client/chttp2_connector.c +253 -0
  98. data/src/core/{lib/iomgr/ev_poll_and_epoll_posix.h → ext/transport/chttp2/client/chttp2_connector.h} +5 -5
  99. data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +31 -160
  100. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.c +5 -5
  101. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c +44 -243
  102. data/src/core/ext/transport/chttp2/server/chttp2_server.c +342 -0
  103. data/src/core/ext/transport/chttp2/server/chttp2_server.h +47 -0
  104. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.c +11 -124
  105. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.c +20 -9
  106. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c +28 -236
  107. data/src/core/ext/transport/chttp2/transport/bin_decoder.c +31 -27
  108. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +5 -4
  109. data/src/core/ext/transport/chttp2/transport/bin_encoder.c +25 -22
  110. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +8 -7
  111. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.c +0 -3
  112. data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +1345 -1521
  113. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -1
  114. data/src/core/ext/transport/chttp2/transport/frame.h +3 -5
  115. data/src/core/ext/transport/chttp2/transport/frame_data.c +50 -47
  116. data/src/core/ext/transport/chttp2/transport/frame_data.h +8 -9
  117. data/src/core/ext/transport/chttp2/transport/frame_goaway.c +19 -21
  118. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +9 -8
  119. data/src/core/ext/transport/chttp2/transport/frame_ping.c +13 -12
  120. data/src/core/ext/transport/chttp2/transport/frame_ping.h +6 -6
  121. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +31 -19
  122. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +8 -7
  123. data/src/core/ext/transport/chttp2/transport/frame_settings.c +22 -25
  124. data/src/core/ext/transport/chttp2/transport/frame_settings.h +9 -8
  125. data/src/core/ext/transport/chttp2/transport/frame_window_update.c +26 -18
  126. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +5 -6
  127. data/src/core/ext/transport/chttp2/transport/hpack_encoder.c +68 -58
  128. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -5
  129. data/src/core/ext/transport/chttp2/transport/hpack_parser.c +327 -214
  130. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +14 -9
  131. data/src/core/ext/transport/chttp2/transport/hpack_table.c +24 -19
  132. data/src/core/ext/transport/chttp2/transport/hpack_table.h +9 -6
  133. data/src/core/ext/transport/chttp2/transport/incoming_metadata.c +2 -2
  134. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +1 -1
  135. data/src/core/ext/transport/chttp2/transport/internal.h +284 -436
  136. data/src/core/ext/transport/chttp2/transport/parsing.c +355 -590
  137. data/src/core/ext/transport/chttp2/transport/stream_lists.c +36 -309
  138. data/src/core/ext/transport/chttp2/transport/stream_map.c +13 -34
  139. data/src/core/ext/transport/chttp2/transport/stream_map.h +3 -4
  140. data/src/core/ext/transport/chttp2/transport/writing.c +174 -286
  141. data/src/core/lib/channel/channel_args.c +70 -13
  142. data/src/core/lib/channel/channel_args.h +28 -2
  143. data/src/core/lib/channel/channel_stack.c +77 -28
  144. data/src/core/lib/channel/channel_stack.h +61 -23
  145. data/src/core/lib/channel/channel_stack_builder.c +33 -25
  146. data/src/core/lib/channel/channel_stack_builder.h +17 -8
  147. data/src/core/lib/channel/compress_filter.c +52 -36
  148. data/src/core/lib/channel/connected_channel.c +20 -12
  149. data/src/core/lib/channel/connected_channel.h +2 -1
  150. data/src/core/lib/channel/context.h +13 -1
  151. data/src/core/lib/channel/deadline_filter.c +344 -0
  152. data/src/core/lib/channel/deadline_filter.h +99 -0
  153. data/src/core/lib/channel/handshaker.c +240 -0
  154. data/src/core/lib/channel/handshaker.h +164 -0
  155. data/src/core/lib/{security/credentials/google_default/credentials_windows.c → channel/handshaker_factory.c} +16 -23
  156. data/src/core/lib/channel/handshaker_factory.h +66 -0
  157. data/src/core/lib/channel/handshaker_registry.c +113 -0
  158. data/src/core/{ext/client_config/client_config.h → lib/channel/handshaker_registry.h} +26 -16
  159. data/src/core/lib/channel/http_client_filter.c +248 -46
  160. data/src/core/lib/channel/http_client_filter.h +3 -0
  161. data/src/core/lib/channel/http_server_filter.c +136 -24
  162. data/src/core/lib/channel/message_size_filter.c +261 -0
  163. data/src/core/lib/channel/message_size_filter.h +39 -0
  164. data/src/core/lib/compression/message_compress.c +43 -37
  165. data/src/core/lib/compression/message_compress.h +7 -5
  166. data/src/core/lib/http/format_request.c +26 -11
  167. data/src/core/lib/http/format_request.h +7 -5
  168. data/src/core/lib/http/httpcli.c +45 -27
  169. data/src/core/lib/http/httpcli.h +4 -4
  170. data/src/core/lib/http/httpcli_security_connector.c +56 -46
  171. data/src/core/lib/http/parser.c +17 -14
  172. data/src/core/lib/http/parser.h +4 -2
  173. data/src/core/lib/iomgr/closure.c +49 -7
  174. data/src/core/lib/iomgr/closure.h +56 -14
  175. data/src/core/lib/iomgr/combiner.c +422 -0
  176. data/src/core/lib/iomgr/combiner.h +64 -0
  177. data/src/core/lib/iomgr/endpoint.c +8 -2
  178. data/src/core/lib/iomgr/endpoint.h +17 -7
  179. data/src/core/lib/iomgr/endpoint_pair.h +3 -2
  180. data/src/core/lib/iomgr/endpoint_pair_posix.c +9 -8
  181. data/src/core/{ext/client_config/lb_policy_factory.c → lib/iomgr/endpoint_pair_uv.c} +18 -13
  182. data/src/core/lib/iomgr/endpoint_pair_windows.c +7 -6
  183. data/src/core/lib/iomgr/error.c +72 -6
  184. data/src/core/lib/iomgr/error.h +30 -3
  185. data/src/core/lib/iomgr/ev_epoll_linux.c +500 -382
  186. data/src/core/lib/iomgr/ev_epoll_linux.h +3 -2
  187. data/src/core/lib/iomgr/ev_poll_posix.c +317 -30
  188. data/src/core/lib/iomgr/ev_poll_posix.h +1 -0
  189. data/src/core/lib/iomgr/ev_posix.c +26 -5
  190. data/src/core/lib/iomgr/ev_posix.h +12 -1
  191. data/src/core/lib/iomgr/exec_ctx.c +27 -94
  192. data/src/core/lib/iomgr/exec_ctx.h +19 -22
  193. data/src/core/lib/iomgr/executor.c +29 -8
  194. data/src/core/lib/iomgr/executor.h +2 -4
  195. data/src/core/lib/iomgr/iocp_windows.c +3 -4
  196. data/src/core/lib/iomgr/iomgr.c +14 -10
  197. data/src/core/lib/iomgr/iomgr.h +6 -2
  198. data/src/core/lib/iomgr/iomgr_posix.c +2 -2
  199. data/src/core/lib/iomgr/iomgr_uv.c +49 -0
  200. data/src/core/lib/iomgr/iomgr_windows.c +2 -2
  201. data/src/core/lib/iomgr/load_file.c +3 -3
  202. data/src/core/lib/iomgr/load_file.h +2 -2
  203. data/src/core/lib/iomgr/network_status_tracker.c +1 -1
  204. data/src/core/lib/iomgr/pollset_set_uv.c +62 -0
  205. data/src/core/lib/iomgr/pollset_set_windows.c +3 -3
  206. data/src/core/lib/iomgr/pollset_uv.c +142 -0
  207. data/src/core/lib/iomgr/pollset_uv.h +42 -0
  208. data/src/core/lib/iomgr/pollset_windows.c +5 -6
  209. data/src/core/lib/iomgr/port.h +129 -0
  210. data/src/core/lib/iomgr/resolve_address.h +2 -1
  211. data/src/core/lib/iomgr/resolve_address_posix.c +14 -13
  212. data/src/core/lib/iomgr/resolve_address_uv.c +233 -0
  213. data/src/core/lib/iomgr/resolve_address_windows.c +14 -12
  214. data/src/core/lib/iomgr/resource_quota.c +832 -0
  215. data/src/core/lib/iomgr/resource_quota.h +159 -0
  216. data/src/core/lib/iomgr/sockaddr.h +10 -2
  217. data/src/core/lib/iomgr/sockaddr_utils.c +63 -36
  218. data/src/core/lib/iomgr/sockaddr_utils.h +14 -14
  219. data/src/core/lib/iomgr/socket_mutator.c +98 -0
  220. data/src/core/lib/iomgr/socket_mutator.h +80 -0
  221. data/src/core/lib/iomgr/socket_utils.h +42 -0
  222. data/src/core/lib/iomgr/socket_utils_common_posix.c +28 -13
  223. data/src/core/lib/iomgr/socket_utils_linux.c +11 -5
  224. data/src/core/lib/iomgr/socket_utils_posix.c +10 -7
  225. data/src/core/lib/iomgr/socket_utils_posix.h +11 -4
  226. data/src/core/lib/iomgr/socket_utils_uv.c +49 -0
  227. data/src/core/lib/iomgr/socket_utils_windows.c +52 -0
  228. data/src/core/lib/iomgr/socket_windows.c +14 -6
  229. data/src/core/lib/iomgr/socket_windows.h +1 -0
  230. data/src/core/lib/iomgr/tcp_client.h +8 -2
  231. data/src/core/lib/iomgr/tcp_client_posix.c +131 -82
  232. data/src/core/lib/iomgr/tcp_client_posix.h +45 -0
  233. data/src/core/lib/iomgr/tcp_client_uv.c +190 -0
  234. data/src/core/lib/iomgr/tcp_client_windows.c +54 -30
  235. data/src/core/lib/iomgr/tcp_posix.c +135 -56
  236. data/src/core/lib/iomgr/tcp_posix.h +2 -2
  237. data/src/core/lib/iomgr/tcp_server.h +14 -6
  238. data/src/core/lib/iomgr/tcp_server_posix.c +154 -118
  239. data/src/core/lib/iomgr/tcp_server_uv.c +388 -0
  240. data/src/core/lib/iomgr/tcp_server_windows.c +127 -100
  241. data/src/core/lib/iomgr/tcp_uv.c +367 -0
  242. data/src/core/lib/iomgr/tcp_uv.h +59 -0
  243. data/src/core/lib/iomgr/tcp_windows.c +65 -48
  244. data/src/core/lib/iomgr/tcp_windows.h +3 -1
  245. data/src/core/lib/iomgr/timer.h +21 -21
  246. data/src/core/lib/iomgr/{timer.c → timer_generic.c} +15 -10
  247. data/src/core/lib/iomgr/timer_generic.h +49 -0
  248. data/src/core/lib/iomgr/timer_heap.c +6 -0
  249. data/src/core/lib/iomgr/timer_uv.c +99 -0
  250. data/src/core/lib/iomgr/timer_uv.h +47 -0
  251. data/src/core/lib/iomgr/udp_server.c +116 -98
  252. data/src/core/lib/iomgr/udp_server.h +5 -3
  253. data/src/core/lib/iomgr/unix_sockets_posix.c +14 -6
  254. data/src/core/lib/iomgr/unix_sockets_posix.h +6 -5
  255. data/src/core/lib/iomgr/unix_sockets_posix_noop.c +4 -4
  256. data/src/core/lib/iomgr/wakeup_fd_cv.c +118 -0
  257. data/src/core/lib/iomgr/wakeup_fd_cv.h +80 -0
  258. data/src/core/lib/iomgr/wakeup_fd_eventfd.c +3 -3
  259. data/src/core/lib/iomgr/wakeup_fd_nospecial.c +3 -3
  260. data/src/core/lib/iomgr/wakeup_fd_pipe.c +12 -6
  261. data/src/core/lib/iomgr/wakeup_fd_posix.c +34 -5
  262. data/src/core/lib/iomgr/wakeup_fd_posix.h +5 -0
  263. data/src/core/lib/iomgr/workqueue.h +12 -20
  264. data/src/core/{ext/client_config/client_config.c → lib/iomgr/workqueue_uv.c} +24 -33
  265. data/{include/grpc/support/slice.h → src/core/lib/iomgr/workqueue_uv.h} +4 -6
  266. data/src/core/lib/iomgr/workqueue_windows.c +9 -8
  267. data/src/core/lib/json/json.c +3 -3
  268. data/src/core/lib/json/json.h +11 -11
  269. data/src/core/lib/json/json_reader.c +9 -5
  270. data/src/core/lib/profiling/basic_timers.c +10 -1
  271. data/src/core/lib/profiling/timers.h +2 -0
  272. data/src/core/lib/security/context/security_context.c +13 -3
  273. data/src/core/lib/security/context/security_context.h +20 -0
  274. data/src/core/lib/security/credentials/composite/composite_credentials.c +28 -14
  275. data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
  276. data/src/core/lib/security/credentials/credentials.c +48 -19
  277. data/src/core/lib/security/credentials/credentials.h +36 -19
  278. data/src/core/lib/security/credentials/credentials_metadata.c +11 -8
  279. data/src/core/lib/security/credentials/fake/fake_credentials.c +15 -11
  280. data/src/core/lib/security/credentials/google_default/{credentials_posix.c → credentials_generic.c} +7 -14
  281. data/src/core/lib/security/credentials/google_default/google_default_credentials.c +33 -21
  282. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +14 -0
  283. data/src/core/lib/security/credentials/iam/iam_credentials.c +3 -2
  284. data/src/core/lib/security/credentials/jwt/json_token.c +1 -0
  285. data/src/core/lib/security/credentials/jwt/json_token.h +1 -1
  286. data/src/core/lib/security/credentials/jwt/jwt_credentials.c +54 -19
  287. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -1
  288. data/src/core/lib/security/credentials/jwt/jwt_verifier.c +129 -79
  289. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +9 -6
  290. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.c +63 -28
  291. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
  292. data/src/core/lib/security/credentials/plugin/plugin_credentials.c +32 -11
  293. data/src/core/lib/security/credentials/ssl/ssl_credentials.c +13 -9
  294. data/src/core/lib/security/transport/client_auth_filter.c +33 -27
  295. data/src/core/lib/security/transport/secure_endpoint.c +93 -68
  296. data/src/core/lib/security/transport/secure_endpoint.h +2 -2
  297. data/src/core/lib/security/transport/security_connector.c +133 -168
  298. data/src/core/lib/security/transport/security_connector.h +31 -46
  299. data/src/core/lib/security/transport/security_handshaker.c +501 -0
  300. data/src/core/lib/security/transport/{handshake.h → security_handshaker.h} +10 -10
  301. data/src/core/lib/security/transport/server_auth_filter.c +50 -38
  302. data/src/core/lib/security/util/b64.c +11 -8
  303. data/src/core/lib/security/util/b64.h +5 -4
  304. data/src/core/lib/slice/percent_encoding.c +182 -0
  305. data/src/core/lib/slice/percent_encoding.h +78 -0
  306. data/src/core/lib/{support → slice}/slice.c +81 -50
  307. data/src/core/lib/{support → slice}/slice_buffer.c +78 -60
  308. data/src/core/lib/slice/slice_internal.h +49 -0
  309. data/src/core/lib/slice/slice_string_helpers.c +90 -0
  310. data/src/core/lib/{iomgr/workqueue_posix.h → slice/slice_string_helpers.h} +18 -18
  311. data/src/core/lib/support/backoff.c +24 -13
  312. data/src/core/lib/support/backoff.h +5 -2
  313. data/src/core/lib/support/env.h +0 -2
  314. data/src/core/lib/support/log.c +5 -4
  315. data/src/core/lib/support/log_linux.c +0 -1
  316. data/src/core/lib/support/log_posix.c +1 -1
  317. data/src/core/lib/support/mpscq.c +83 -0
  318. data/src/core/lib/support/mpscq.h +65 -0
  319. data/src/core/lib/support/string.c +58 -49
  320. data/src/core/lib/support/string.h +11 -8
  321. data/src/core/lib/support/subprocess_posix.c +5 -2
  322. data/src/core/lib/support/thd.c +1 -1
  323. data/src/core/lib/support/time.c +43 -79
  324. data/src/core/lib/support/time_posix.c +1 -1
  325. data/src/core/lib/support/tmpfile.h +0 -2
  326. data/src/core/lib/surface/alarm.c +4 -1
  327. data/src/core/lib/surface/byte_buffer.c +17 -11
  328. data/src/core/lib/surface/byte_buffer_reader.c +23 -15
  329. data/src/core/lib/surface/call.c +294 -276
  330. data/src/core/lib/surface/call.h +24 -9
  331. data/src/core/lib/surface/call_log_batch.c +5 -3
  332. data/src/core/lib/surface/channel.c +127 -111
  333. data/src/core/lib/surface/channel.h +14 -5
  334. data/src/core/lib/surface/channel_init.c +1 -1
  335. data/src/core/lib/surface/channel_init.h +10 -1
  336. data/src/core/lib/surface/channel_ping.c +7 -6
  337. data/src/core/lib/surface/completion_queue.c +154 -18
  338. data/src/core/lib/surface/completion_queue.h +5 -0
  339. data/src/core/lib/surface/init.c +40 -6
  340. data/src/core/lib/surface/init.h +1 -0
  341. data/src/core/lib/surface/init_secure.c +5 -2
  342. data/src/core/lib/surface/lame_client.c +28 -18
  343. data/src/core/lib/surface/server.c +134 -87
  344. data/src/core/lib/surface/server.h +8 -0
  345. data/src/core/lib/surface/validate_metadata.c +1 -1
  346. data/src/core/lib/surface/version.c +3 -1
  347. data/src/core/lib/transport/byte_stream.c +7 -4
  348. data/src/core/lib/transport/byte_stream.h +6 -10
  349. data/src/core/lib/transport/connectivity_state.c +21 -12
  350. data/src/core/lib/transport/connectivity_state.h +4 -1
  351. data/src/core/lib/transport/mdstr_hash_table.c +118 -0
  352. data/src/core/lib/transport/mdstr_hash_table.h +77 -0
  353. data/src/core/lib/transport/metadata.c +83 -60
  354. data/src/core/lib/transport/metadata.h +41 -23
  355. data/src/core/lib/transport/metadata_batch.c +17 -11
  356. data/src/core/lib/transport/metadata_batch.h +20 -6
  357. data/src/core/lib/transport/pid_controller.c +57 -0
  358. data/src/core/lib/transport/pid_controller.h +64 -0
  359. data/src/core/lib/transport/service_config.c +251 -0
  360. data/src/core/lib/transport/service_config.h +71 -0
  361. data/src/core/lib/transport/static_metadata.c +18 -16
  362. data/src/core/lib/transport/static_metadata.h +113 -107
  363. data/src/core/{ext/transport/chttp2 → lib}/transport/timeout_encoding.c +3 -3
  364. data/src/core/{ext/transport/chttp2 → lib}/transport/timeout_encoding.h +7 -7
  365. data/src/core/lib/transport/transport.c +84 -23
  366. data/src/core/lib/transport/transport.h +53 -8
  367. data/src/core/lib/transport/transport_impl.h +3 -0
  368. data/src/core/lib/transport/transport_op_string.c +92 -20
  369. data/src/core/lib/tsi/ssl_transport_security.c +3 -1
  370. data/src/core/plugin_registry/grpc_plugin_registry.c +8 -4
  371. data/src/ruby/ext/grpc/extconf.rb +0 -1
  372. data/src/ruby/ext/grpc/rb_byte_buffer.c +8 -7
  373. data/src/ruby/ext/grpc/rb_call.c +15 -5
  374. data/src/ruby/ext/grpc/rb_channel.c +1 -1
  375. data/src/ruby/ext/grpc/rb_compression_options.c +466 -0
  376. data/src/{core/ext/client_config/default_initial_connect_string.c → ruby/ext/grpc/rb_compression_options.h} +10 -5
  377. data/src/ruby/ext/grpc/rb_grpc.c +3 -1
  378. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +198 -190
  379. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +306 -294
  380. data/src/ruby/ext/grpc/rb_server.c +18 -12
  381. data/src/ruby/lib/grpc/errors.rb +154 -2
  382. data/src/ruby/lib/grpc/generic/active_call.rb +144 -63
  383. data/src/ruby/lib/grpc/generic/bidi_call.rb +18 -2
  384. data/src/ruby/lib/grpc/generic/client_stub.rb +7 -5
  385. data/src/ruby/lib/grpc/generic/rpc_desc.rb +39 -13
  386. data/src/ruby/lib/grpc/generic/rpc_server.rb +51 -24
  387. data/src/ruby/lib/grpc/generic/service.rb +3 -2
  388. data/src/ruby/lib/grpc/version.rb +1 -1
  389. data/src/ruby/pb/grpc/health/checker.rb +3 -1
  390. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +7 -0
  391. data/src/ruby/pb/test/client.rb +307 -7
  392. data/src/ruby/pb/test/server.rb +26 -1
  393. data/src/ruby/spec/compression_options_spec.rb +164 -0
  394. data/src/ruby/spec/error_sanity_spec.rb +64 -0
  395. data/src/ruby/spec/generic/active_call_spec.rb +290 -12
  396. data/src/ruby/spec/generic/client_stub_spec.rb +91 -41
  397. data/src/ruby/spec/generic/rpc_desc_spec.rb +36 -16
  398. data/src/ruby/spec/generic/rpc_server_pool_spec.rb +22 -28
  399. data/src/ruby/spec/generic/rpc_server_spec.rb +6 -6
  400. data/src/ruby/spec/pb/health/checker_spec.rb +27 -19
  401. data/src/ruby/spec/spec_helper.rb +2 -0
  402. data/third_party/boringssl/crypto/aes/aes.c +12 -12
  403. data/third_party/boringssl/crypto/aes/mode_wrappers.c +6 -2
  404. data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +28 -13
  405. data/third_party/boringssl/crypto/asn1/a_gentm.c +2 -0
  406. data/third_party/boringssl/crypto/asn1/a_object.c +7 -3
  407. data/third_party/boringssl/crypto/asn1/a_strnid.c +1 -0
  408. data/third_party/boringssl/crypto/asn1/a_time.c +0 -11
  409. data/third_party/boringssl/crypto/asn1/a_type.c +0 -2
  410. data/third_party/boringssl/crypto/asn1/a_utctm.c +1 -30
  411. data/third_party/boringssl/crypto/asn1/asn1_lib.c +56 -76
  412. data/third_party/boringssl/crypto/asn1/asn1_locl.h +0 -10
  413. data/third_party/boringssl/crypto/asn1/asn1_par.c +0 -322
  414. data/third_party/boringssl/crypto/asn1/f_enum.c +1 -108
  415. data/third_party/boringssl/crypto/asn1/f_int.c +1 -106
  416. data/third_party/boringssl/crypto/asn1/f_string.c +1 -106
  417. data/third_party/boringssl/crypto/asn1/tasn_dec.c +10 -14
  418. data/third_party/boringssl/crypto/asn1/tasn_enc.c +17 -11
  419. data/third_party/boringssl/crypto/asn1/tasn_typ.c +29 -42
  420. data/third_party/boringssl/crypto/asn1/tasn_utl.c +1 -1
  421. data/third_party/boringssl/crypto/base64/base64.c +249 -285
  422. data/third_party/boringssl/crypto/bio/bio.c +13 -23
  423. data/third_party/boringssl/crypto/bio/bio_mem.c +3 -2
  424. data/third_party/boringssl/crypto/bio/connect.c +12 -3
  425. data/third_party/boringssl/crypto/bio/fd.c +22 -15
  426. data/third_party/boringssl/crypto/bio/file.c +2 -38
  427. data/third_party/boringssl/crypto/bio/hexdump.c +1 -2
  428. data/third_party/boringssl/crypto/bio/internal.h +3 -0
  429. data/third_party/boringssl/crypto/bio/pair.c +1 -1
  430. data/third_party/boringssl/crypto/bio/socket.c +10 -2
  431. data/third_party/boringssl/crypto/bio/socket_helper.c +2 -2
  432. data/third_party/boringssl/crypto/bn/asm/x86_64-gcc.c +0 -8
  433. data/third_party/boringssl/crypto/bn/bn.c +38 -0
  434. data/third_party/boringssl/crypto/bn/cmp.c +25 -0
  435. data/third_party/boringssl/crypto/bn/convert.c +73 -76
  436. data/third_party/boringssl/crypto/bn/div.c +136 -70
  437. data/third_party/boringssl/crypto/bn/exponentiation.c +86 -381
  438. data/third_party/boringssl/crypto/bn/gcd.c +213 -296
  439. data/third_party/boringssl/crypto/bn/generic.c +0 -80
  440. data/third_party/boringssl/crypto/bn/internal.h +15 -3
  441. data/third_party/boringssl/crypto/bn/montgomery.c +57 -207
  442. data/third_party/boringssl/crypto/bn/montgomery_inv.c +160 -0
  443. data/third_party/boringssl/crypto/bn/mul.c +2 -1
  444. data/third_party/boringssl/crypto/bn/prime.c +24 -8
  445. data/third_party/boringssl/crypto/bn/random.c +47 -33
  446. data/third_party/boringssl/crypto/bn/sqrt.c +4 -5
  447. data/third_party/boringssl/crypto/buf/buf.c +25 -21
  448. data/third_party/boringssl/crypto/bytestring/ber.c +1 -0
  449. data/third_party/boringssl/crypto/bytestring/cbb.c +50 -22
  450. data/third_party/boringssl/crypto/bytestring/cbs.c +28 -4
  451. data/third_party/boringssl/crypto/chacha/{chacha_generic.c → chacha.c} +56 -29
  452. data/third_party/boringssl/crypto/cipher/aead.c +11 -22
  453. data/third_party/boringssl/crypto/cipher/cipher.c +2 -2
  454. data/third_party/boringssl/crypto/cipher/e_aes.c +53 -103
  455. data/third_party/boringssl/crypto/cipher/e_chacha20poly1305.c +2 -8
  456. data/third_party/boringssl/crypto/cipher/e_des.c +3 -5
  457. data/third_party/boringssl/crypto/cipher/e_null.c +1 -1
  458. data/third_party/boringssl/crypto/cipher/e_rc2.c +1 -1
  459. data/third_party/boringssl/crypto/cipher/e_rc4.c +1 -1
  460. data/third_party/boringssl/crypto/cipher/e_ssl3.c +3 -63
  461. data/third_party/boringssl/crypto/cipher/e_tls.c +12 -83
  462. data/third_party/boringssl/crypto/cipher/internal.h +8 -10
  463. data/third_party/boringssl/crypto/cipher/tls_cbc.c +69 -40
  464. data/third_party/boringssl/crypto/conf/conf.c +2 -1
  465. data/third_party/boringssl/crypto/cpu-aarch64-linux.c +61 -0
  466. data/third_party/boringssl/crypto/cpu-arm-linux.c +360 -0
  467. data/third_party/boringssl/crypto/cpu-arm.c +0 -161
  468. data/third_party/boringssl/crypto/cpu-intel.c +5 -3
  469. data/third_party/boringssl/{ssl/test/scoped_types.h → crypto/cpu-ppc64le.c} +21 -9
  470. data/third_party/boringssl/crypto/crypto.c +29 -7
  471. data/third_party/boringssl/crypto/curve25519/curve25519.c +284 -242
  472. data/third_party/boringssl/crypto/curve25519/internal.h +64 -0
  473. data/third_party/boringssl/crypto/curve25519/spake25519.c +464 -0
  474. data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +21 -0
  475. data/third_party/boringssl/crypto/dh/check.c +22 -6
  476. data/third_party/boringssl/crypto/dh/dh.c +45 -21
  477. data/third_party/boringssl/crypto/dh/dh_asn1.c +96 -20
  478. data/third_party/boringssl/crypto/dh/params.c +30 -78
  479. data/third_party/boringssl/crypto/digest/digest.c +3 -3
  480. data/third_party/boringssl/crypto/dsa/dsa.c +59 -29
  481. data/third_party/boringssl/crypto/dsa/dsa_asn1.c +4 -0
  482. data/third_party/boringssl/crypto/ec/ec.c +84 -140
  483. data/third_party/boringssl/crypto/ec/ec_asn1.c +82 -52
  484. data/third_party/boringssl/crypto/ec/ec_key.c +15 -15
  485. data/third_party/boringssl/crypto/ec/ec_montgomery.c +87 -50
  486. data/third_party/boringssl/crypto/ec/internal.h +12 -36
  487. data/third_party/boringssl/crypto/ec/oct.c +11 -11
  488. data/third_party/boringssl/crypto/ec/p224-64.c +59 -116
  489. data/third_party/boringssl/crypto/ec/p256-64.c +88 -163
  490. data/third_party/boringssl/crypto/ec/p256-x86_64.c +46 -58
  491. data/third_party/boringssl/crypto/ec/simple.c +81 -201
  492. data/third_party/boringssl/crypto/ec/util-64.c +0 -74
  493. data/third_party/boringssl/crypto/ecdh/ecdh.c +7 -1
  494. data/third_party/boringssl/crypto/ecdsa/ecdsa.c +28 -46
  495. data/third_party/boringssl/crypto/ecdsa/ecdsa_asn1.c +1 -0
  496. data/third_party/boringssl/crypto/engine/engine.c +1 -1
  497. data/third_party/boringssl/crypto/err/err.c +3 -3
  498. data/third_party/boringssl/crypto/evp/evp.c +14 -59
  499. data/third_party/boringssl/crypto/evp/evp_asn1.c +144 -87
  500. data/third_party/boringssl/crypto/evp/evp_ctx.c +7 -7
  501. data/third_party/boringssl/crypto/evp/internal.h +4 -46
  502. data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +8 -157
  503. data/third_party/boringssl/crypto/evp/p_ec.c +1 -1
  504. data/third_party/boringssl/crypto/evp/p_ec_asn1.c +22 -170
  505. data/third_party/boringssl/crypto/evp/p_rsa.c +1 -1
  506. data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +10 -548
  507. data/third_party/boringssl/crypto/evp/print.c +520 -0
  508. data/third_party/boringssl/crypto/ex_data.c +4 -6
  509. data/third_party/boringssl/crypto/hkdf/hkdf.c +38 -17
  510. data/third_party/boringssl/crypto/hmac/hmac.c +6 -6
  511. data/third_party/boringssl/crypto/internal.h +57 -77
  512. data/third_party/boringssl/crypto/lhash/lhash.c +6 -10
  513. data/third_party/boringssl/crypto/md4/md4.c +9 -0
  514. data/third_party/boringssl/crypto/mem.c +19 -19
  515. data/third_party/boringssl/crypto/modes/cfb.c +5 -6
  516. data/third_party/boringssl/crypto/modes/ctr.c +10 -18
  517. data/third_party/boringssl/crypto/modes/gcm.c +100 -66
  518. data/third_party/boringssl/crypto/modes/internal.h +15 -27
  519. data/third_party/boringssl/crypto/modes/ofb.c +9 -22
  520. data/third_party/boringssl/crypto/newhope/error_correction.c +131 -0
  521. data/third_party/boringssl/crypto/newhope/internal.h +71 -0
  522. data/third_party/boringssl/crypto/newhope/newhope.c +174 -0
  523. data/third_party/boringssl/crypto/newhope/ntt.c +148 -0
  524. data/third_party/boringssl/crypto/newhope/poly.c +183 -0
  525. data/third_party/boringssl/crypto/newhope/precomp.c +306 -0
  526. data/third_party/boringssl/crypto/newhope/reduce.c +42 -0
  527. data/third_party/boringssl/crypto/obj/obj.c +111 -135
  528. data/third_party/boringssl/crypto/obj/obj_dat.h +4 -10
  529. data/third_party/boringssl/crypto/pem/pem_lib.c +6 -43
  530. data/third_party/boringssl/crypto/pem/pem_pkey.c +10 -19
  531. data/third_party/boringssl/crypto/pkcs8/p5_pbe.c +1 -0
  532. data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +2 -1
  533. data/third_party/boringssl/crypto/pkcs8/p8_pkey.c +2 -2
  534. data/third_party/boringssl/crypto/pkcs8/pkcs8.c +95 -87
  535. data/third_party/boringssl/crypto/{test/test_util.h → poly1305/internal.h} +15 -10
  536. data/third_party/boringssl/crypto/poly1305/poly1305.c +8 -15
  537. data/third_party/boringssl/crypto/poly1305/poly1305_arm.c +1 -0
  538. data/third_party/boringssl/crypto/poly1305/poly1305_vec.c +3 -3
  539. data/third_party/boringssl/crypto/rand/deterministic.c +47 -0
  540. data/third_party/boringssl/crypto/rand/rand.c +4 -1
  541. data/third_party/boringssl/crypto/rand/urandom.c +5 -7
  542. data/third_party/boringssl/crypto/rand/windows.c +5 -8
  543. data/third_party/boringssl/crypto/rc4/rc4.c +24 -209
  544. data/third_party/boringssl/crypto/refcount_lock.c +2 -2
  545. data/third_party/boringssl/crypto/rsa/blinding.c +74 -232
  546. data/third_party/boringssl/crypto/rsa/internal.h +5 -13
  547. data/third_party/boringssl/crypto/rsa/padding.c +64 -63
  548. data/third_party/boringssl/crypto/rsa/rsa.c +50 -28
  549. data/third_party/boringssl/crypto/rsa/rsa_asn1.c +8 -16
  550. data/third_party/boringssl/crypto/rsa/rsa_impl.c +134 -122
  551. data/third_party/boringssl/crypto/sha/sha256.c +2 -2
  552. data/third_party/boringssl/crypto/sha/sha512.c +7 -7
  553. data/third_party/boringssl/crypto/stack/stack.c +13 -22
  554. data/third_party/boringssl/crypto/thread.c +21 -12
  555. data/third_party/boringssl/crypto/thread_none.c +6 -2
  556. data/third_party/boringssl/crypto/thread_pthread.c +16 -7
  557. data/third_party/boringssl/crypto/thread_win.c +38 -85
  558. data/third_party/boringssl/crypto/x509/a_sign.c +3 -3
  559. data/third_party/boringssl/crypto/x509/a_strex.c +1 -1
  560. data/third_party/boringssl/crypto/x509/a_verify.c +2 -2
  561. data/third_party/boringssl/crypto/{evp → x509}/algorithm.c +37 -53
  562. data/third_party/boringssl/crypto/x509/asn1_gen.c +1 -2
  563. data/third_party/boringssl/crypto/x509/by_dir.c +6 -6
  564. data/third_party/boringssl/crypto/x509/internal.h +66 -0
  565. data/third_party/boringssl/crypto/x509/rsa_pss.c +385 -0
  566. data/third_party/boringssl/crypto/x509/t_x509.c +10 -12
  567. data/third_party/boringssl/crypto/x509/x509.c +5 -0
  568. data/third_party/boringssl/crypto/x509/x509_att.c +9 -3
  569. data/third_party/boringssl/crypto/x509/x509_lu.c +34 -44
  570. data/third_party/boringssl/crypto/x509/x509_obj.c +19 -2
  571. data/third_party/boringssl/crypto/x509/x509_r2x.c +9 -5
  572. data/third_party/boringssl/crypto/x509/x509_set.c +5 -0
  573. data/third_party/boringssl/crypto/x509/x509_txt.c +5 -0
  574. data/third_party/boringssl/crypto/x509/x509_vfy.c +63 -32
  575. data/third_party/boringssl/crypto/x509/x509_vpm.c +29 -18
  576. data/third_party/boringssl/crypto/x509/x509cset.c +2 -1
  577. data/third_party/boringssl/crypto/x509/x_crl.c +2 -2
  578. data/third_party/boringssl/crypto/x509/x_name.c +14 -17
  579. data/third_party/boringssl/crypto/x509/x_pubkey.c +10 -7
  580. data/third_party/boringssl/crypto/x509/x_x509.c +67 -6
  581. data/third_party/boringssl/crypto/x509v3/pcy_cache.c +2 -2
  582. data/third_party/boringssl/crypto/x509v3/pcy_tree.c +2 -1
  583. data/third_party/boringssl/crypto/x509v3/v3_conf.c +4 -3
  584. data/third_party/boringssl/crypto/x509v3/v3_cpols.c +5 -0
  585. data/third_party/boringssl/crypto/x509v3/v3_prn.c +0 -3
  586. data/third_party/boringssl/crypto/x509v3/v3_purp.c +2 -2
  587. data/third_party/boringssl/crypto/x509v3/v3_utl.c +2 -1
  588. data/third_party/boringssl/include/openssl/aead.h +72 -73
  589. data/third_party/boringssl/include/openssl/arm_arch.h +0 -6
  590. data/third_party/boringssl/include/openssl/asn1.h +103 -235
  591. data/third_party/boringssl/include/openssl/asn1_mac.h +17 -74
  592. data/third_party/boringssl/include/openssl/asn1t.h +1 -11
  593. data/third_party/boringssl/include/openssl/base.h +145 -3
  594. data/third_party/boringssl/include/openssl/base64.h +20 -17
  595. data/third_party/boringssl/include/openssl/bio.h +59 -34
  596. data/third_party/boringssl/include/openssl/bn.h +118 -51
  597. data/third_party/boringssl/include/openssl/buf.h +15 -0
  598. data/third_party/boringssl/include/openssl/bytestring.h +52 -4
  599. data/third_party/boringssl/include/openssl/chacha.h +2 -2
  600. data/third_party/boringssl/include/openssl/cipher.h +18 -1
  601. data/third_party/boringssl/include/openssl/cmac.h +11 -0
  602. data/third_party/boringssl/include/openssl/conf.h +13 -2
  603. data/third_party/boringssl/include/openssl/cpu.h +20 -23
  604. data/third_party/boringssl/include/openssl/crypto.h +22 -1
  605. data/third_party/boringssl/include/openssl/curve25519.h +96 -4
  606. data/third_party/boringssl/include/openssl/dh.h +71 -16
  607. data/third_party/boringssl/include/openssl/digest.h +38 -11
  608. data/third_party/boringssl/include/openssl/dsa.h +40 -4
  609. data/third_party/boringssl/include/openssl/ec.h +44 -18
  610. data/third_party/boringssl/include/openssl/ec_key.h +27 -6
  611. data/third_party/boringssl/include/openssl/ecdsa.h +11 -0
  612. data/third_party/boringssl/include/openssl/engine.h +11 -0
  613. data/third_party/boringssl/include/openssl/evp.h +52 -88
  614. data/third_party/boringssl/include/openssl/hkdf.h +24 -4
  615. data/third_party/boringssl/include/openssl/hmac.h +20 -6
  616. data/third_party/boringssl/include/openssl/md4.h +4 -0
  617. data/third_party/boringssl/include/openssl/mem.h +19 -0
  618. data/third_party/boringssl/include/openssl/newhope.h +158 -0
  619. data/third_party/boringssl/include/openssl/nid.h +4166 -0
  620. data/third_party/boringssl/include/openssl/obj.h +31 -3
  621. data/third_party/boringssl/include/openssl/obj_mac.h +17 -4143
  622. data/third_party/boringssl/include/openssl/{opensslfeatures.h → opensslconf.h} +3 -3
  623. data/third_party/boringssl/include/openssl/pem.h +5 -0
  624. data/third_party/boringssl/include/openssl/pkcs8.h +12 -0
  625. data/third_party/boringssl/include/openssl/rand.h +6 -0
  626. data/third_party/boringssl/include/openssl/rc4.h +6 -0
  627. data/third_party/boringssl/{crypto/dh/internal.h → include/openssl/ripemd.h} +38 -11
  628. data/third_party/boringssl/include/openssl/rsa.h +127 -65
  629. data/third_party/boringssl/include/openssl/sha.h +14 -10
  630. data/third_party/boringssl/include/openssl/ssl.h +561 -275
  631. data/third_party/boringssl/include/openssl/ssl3.h +18 -25
  632. data/third_party/boringssl/include/openssl/stack.h +2 -4
  633. data/third_party/boringssl/include/openssl/stack_macros.h +321 -353
  634. data/third_party/boringssl/include/openssl/thread.h +31 -13
  635. data/third_party/boringssl/include/openssl/time_support.h +1 -0
  636. data/third_party/boringssl/include/openssl/tls1.h +37 -33
  637. data/third_party/boringssl/include/openssl/x509.h +69 -26
  638. data/third_party/boringssl/include/openssl/x509_vfy.h +12 -10
  639. data/third_party/boringssl/include/openssl/x509v3.h +23 -2
  640. data/third_party/boringssl/ssl/custom_extensions.c +3 -5
  641. data/third_party/boringssl/ssl/d1_both.c +463 -499
  642. data/third_party/boringssl/ssl/d1_lib.c +38 -109
  643. data/third_party/boringssl/ssl/d1_pkt.c +173 -334
  644. data/third_party/boringssl/ssl/d1_srtp.c +20 -18
  645. data/third_party/boringssl/ssl/{d1_meth.c → dtls_method.c} +88 -15
  646. data/third_party/boringssl/ssl/dtls_record.c +27 -26
  647. data/third_party/boringssl/ssl/{s3_clnt.c → handshake_client.c} +816 -904
  648. data/third_party/boringssl/ssl/handshake_server.c +1932 -0
  649. data/third_party/boringssl/ssl/internal.h +712 -439
  650. data/third_party/boringssl/ssl/s3_both.c +445 -257
  651. data/third_party/boringssl/ssl/s3_enc.c +53 -36
  652. data/third_party/boringssl/ssl/s3_lib.c +23 -268
  653. data/third_party/boringssl/ssl/s3_pkt.c +168 -364
  654. data/third_party/boringssl/ssl/ssl_aead_ctx.c +46 -17
  655. data/third_party/boringssl/ssl/ssl_asn1.c +56 -26
  656. data/third_party/boringssl/ssl/ssl_buffer.c +16 -24
  657. data/third_party/boringssl/ssl/ssl_cert.c +324 -49
  658. data/third_party/boringssl/ssl/ssl_cipher.c +205 -150
  659. data/third_party/boringssl/ssl/ssl_ecdh.c +287 -51
  660. data/third_party/boringssl/ssl/ssl_file.c +21 -68
  661. data/third_party/boringssl/ssl/ssl_lib.c +881 -510
  662. data/third_party/boringssl/ssl/ssl_rsa.c +404 -34
  663. data/third_party/boringssl/ssl/ssl_session.c +324 -103
  664. data/third_party/boringssl/ssl/ssl_stat.c +6 -88
  665. data/third_party/boringssl/ssl/t1_enc.c +23 -39
  666. data/third_party/boringssl/ssl/t1_lib.c +1120 -622
  667. data/third_party/boringssl/ssl/tls13_both.c +440 -0
  668. data/third_party/boringssl/ssl/tls13_client.c +682 -0
  669. data/third_party/boringssl/ssl/tls13_enc.c +391 -0
  670. data/third_party/boringssl/ssl/tls13_server.c +672 -0
  671. data/third_party/boringssl/ssl/{s3_meth.c → tls_method.c} +100 -21
  672. data/third_party/boringssl/ssl/tls_record.c +159 -77
  673. data/third_party/nanopb/pb.h +60 -28
  674. data/third_party/nanopb/pb_decode.c +120 -92
  675. data/third_party/nanopb/pb_decode.h +3 -3
  676. data/third_party/nanopb/pb_encode.c +73 -67
  677. data/third_party/nanopb/pb_encode.h +4 -4
  678. metadata +155 -89
  679. data/include/grpc/impl/codegen/byte_buffer.h +0 -122
  680. data/include/grpc/impl/codegen/log.h +0 -118
  681. data/include/grpc/impl/codegen/time.h +0 -130
  682. data/src/core/ext/client_config/client_channel.c +0 -593
  683. data/src/core/ext/client_config/subchannel_call_holder.c +0 -272
  684. data/src/core/ext/client_config/subchannel_call_holder.h +0 -99
  685. data/src/core/lib/iomgr/ev_poll_and_epoll_posix.c +0 -2046
  686. data/src/core/lib/iomgr/workqueue_posix.c +0 -151
  687. data/src/core/lib/security/transport/handshake.c +0 -368
  688. data/third_party/boringssl/crypto/asn1/a_bytes.c +0 -308
  689. data/third_party/boringssl/crypto/asn1/bio_asn1.c +0 -477
  690. data/third_party/boringssl/crypto/asn1/bio_ndef.c +0 -251
  691. data/third_party/boringssl/crypto/asn1/t_pkey.c +0 -110
  692. data/third_party/boringssl/crypto/asn1/tasn_prn.c +0 -596
  693. data/third_party/boringssl/crypto/chacha/chacha_vec.c +0 -328
  694. data/third_party/boringssl/crypto/directory.h +0 -66
  695. data/third_party/boringssl/crypto/directory_posix.c +0 -108
  696. data/third_party/boringssl/crypto/directory_win.c +0 -144
  697. data/third_party/boringssl/crypto/test/scoped_types.h +0 -140
  698. data/third_party/boringssl/include/openssl/pqueue.h +0 -146
  699. data/third_party/boringssl/ssl/d1_clnt.c +0 -561
  700. data/third_party/boringssl/ssl/d1_srvr.c +0 -476
  701. data/third_party/boringssl/ssl/pqueue/pqueue.c +0 -197
  702. data/third_party/boringssl/ssl/s3_srvr.c +0 -2272
  703. data/third_party/boringssl/ssl/test/async_bio.h +0 -45
  704. data/third_party/boringssl/ssl/test/packeted_bio.h +0 -44
  705. data/third_party/boringssl/ssl/test/test_config.h +0 -110
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  *
3
- * Copyright 2015, Google Inc.
3
+ * Copyright 2016, Google Inc.
4
4
  * All rights reserved.
5
5
  *
6
6
  * Redistribution and use in source and binary forms, with or without
@@ -31,10 +31,6 @@
31
31
  *
32
32
  */
33
33
 
34
- #include <grpc/support/port_platform.h>
35
-
36
- #ifdef GPR_POSIX_FILE
37
-
38
34
  #include "src/core/lib/security/credentials/google_default/google_default_credentials.h"
39
35
 
40
36
  #include <grpc/support/alloc.h>
@@ -46,16 +42,13 @@
46
42
 
47
43
  char *grpc_get_well_known_google_credentials_file_path_impl(void) {
48
44
  char *result = NULL;
49
- char *home = gpr_getenv("HOME");
50
- if (home == NULL) {
51
- gpr_log(GPR_ERROR, "Could not get HOME environment variable.");
45
+ char *base = gpr_getenv(GRPC_GOOGLE_CREDENTIALS_PATH_ENV_VAR);
46
+ if (base == NULL) {
47
+ gpr_log(GPR_ERROR, "Could not get " GRPC_GOOGLE_CREDENTIALS_ENV_VAR
48
+ " environment variable.");
52
49
  return NULL;
53
50
  }
54
- gpr_asprintf(&result, "%s/.config/%s/%s", home,
55
- GRPC_GOOGLE_CLOUD_SDK_CONFIG_DIRECTORY,
56
- GRPC_GOOGLE_WELL_KNOWN_CREDENTIALS_FILE);
57
- gpr_free(home);
51
+ gpr_asprintf(&result, "%s/%s", base, GRPC_GOOGLE_CREDENTIALS_PATH_SUFFIX);
52
+ gpr_free(base);
58
53
  return result;
59
54
  }
60
-
61
- #endif /* GPR_POSIX_FILE */
@@ -45,6 +45,8 @@
45
45
  #include "src/core/lib/iomgr/polling_entity.h"
46
46
  #include "src/core/lib/security/credentials/jwt/jwt_credentials.h"
47
47
  #include "src/core/lib/security/credentials/oauth2/oauth2_credentials.h"
48
+ #include "src/core/lib/slice/slice_internal.h"
49
+ #include "src/core/lib/slice/slice_string_helpers.h"
48
50
  #include "src/core/lib/support/env.h"
49
51
  #include "src/core/lib/support/string.h"
50
52
  #include "src/core/lib/surface/api_trace.h"
@@ -100,11 +102,10 @@ static void destroy_pollset(grpc_exec_ctx *exec_ctx, void *p, grpc_error *e) {
100
102
  grpc_pollset_destroy(p);
101
103
  }
102
104
 
103
- static int is_stack_running_on_compute_engine(void) {
105
+ static int is_stack_running_on_compute_engine(grpc_exec_ctx *exec_ctx) {
104
106
  compute_engine_detector detector;
105
107
  grpc_httpcli_request request;
106
108
  grpc_httpcli_context context;
107
- grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
108
109
  grpc_closure destroy_closure;
109
110
 
110
111
  /* The http call is local. If it takes more than one sec, it is for sure not
@@ -124,13 +125,17 @@ static int is_stack_running_on_compute_engine(void) {
124
125
 
125
126
  grpc_httpcli_context_init(&context);
126
127
 
128
+ grpc_resource_quota *resource_quota =
129
+ grpc_resource_quota_create("google_default_credentials");
127
130
  grpc_httpcli_get(
128
- &exec_ctx, &context, &detector.pollent, &request,
131
+ exec_ctx, &context, &detector.pollent, resource_quota, &request,
129
132
  gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), max_detection_delay),
130
- grpc_closure_create(on_compute_engine_detection_http_response, &detector),
133
+ grpc_closure_create(on_compute_engine_detection_http_response, &detector,
134
+ grpc_schedule_on_exec_ctx),
131
135
  &detector.response);
136
+ grpc_resource_quota_unref_internal(exec_ctx, resource_quota);
132
137
 
133
- grpc_exec_ctx_flush(&exec_ctx);
138
+ grpc_exec_ctx_flush(exec_ctx);
134
139
 
135
140
  /* Block until we get the response. This is not ideal but this should only be
136
141
  called once for the lifetime of the process by the default credentials. */
@@ -139,7 +144,7 @@ static int is_stack_running_on_compute_engine(void) {
139
144
  grpc_pollset_worker *worker = NULL;
140
145
  if (!GRPC_LOG_IF_ERROR(
141
146
  "pollset_work",
142
- grpc_pollset_work(&exec_ctx,
147
+ grpc_pollset_work(exec_ctx,
143
148
  grpc_polling_entity_pollset(&detector.pollent),
144
149
  &worker, gpr_now(GPR_CLOCK_MONOTONIC),
145
150
  gpr_inf_future(GPR_CLOCK_MONOTONIC)))) {
@@ -151,12 +156,13 @@ static int is_stack_running_on_compute_engine(void) {
151
156
 
152
157
  grpc_httpcli_context_destroy(&context);
153
158
  grpc_closure_init(&destroy_closure, destroy_pollset,
154
- grpc_polling_entity_pollset(&detector.pollent));
155
- grpc_pollset_shutdown(&exec_ctx,
159
+ grpc_polling_entity_pollset(&detector.pollent),
160
+ grpc_schedule_on_exec_ctx);
161
+ grpc_pollset_shutdown(exec_ctx,
156
162
  grpc_polling_entity_pollset(&detector.pollent),
157
163
  &destroy_closure);
158
- grpc_exec_ctx_finish(&exec_ctx);
159
164
  g_polling_mu = NULL;
165
+ grpc_exec_ctx_flush(exec_ctx);
160
166
 
161
167
  gpr_free(grpc_polling_entity_pollset(&detector.pollent));
162
168
  grpc_http_response_destroy(&detector.response);
@@ -166,12 +172,12 @@ static int is_stack_running_on_compute_engine(void) {
166
172
 
167
173
  /* Takes ownership of creds_path if not NULL. */
168
174
  static grpc_error *create_default_creds_from_path(
169
- char *creds_path, grpc_call_credentials **creds) {
175
+ grpc_exec_ctx *exec_ctx, char *creds_path, grpc_call_credentials **creds) {
170
176
  grpc_json *json = NULL;
171
177
  grpc_auth_json_key key;
172
178
  grpc_auth_refresh_token token;
173
179
  grpc_call_credentials *result = NULL;
174
- gpr_slice creds_data = gpr_empty_slice();
180
+ grpc_slice creds_data = gpr_empty_slice();
175
181
  grpc_error *error = GRPC_ERROR_NONE;
176
182
  if (creds_path == NULL) {
177
183
  error = GRPC_ERROR_CREATE("creds_path unset");
@@ -182,9 +188,9 @@ static grpc_error *create_default_creds_from_path(
182
188
  goto end;
183
189
  }
184
190
  json = grpc_json_parse_string_with_len(
185
- (char *)GPR_SLICE_START_PTR(creds_data), GPR_SLICE_LENGTH(creds_data));
191
+ (char *)GRPC_SLICE_START_PTR(creds_data), GRPC_SLICE_LENGTH(creds_data));
186
192
  if (json == NULL) {
187
- char *dump = gpr_dump_slice(creds_data, GPR_DUMP_HEX | GPR_DUMP_ASCII);
193
+ char *dump = grpc_dump_slice(creds_data, GPR_DUMP_HEX | GPR_DUMP_ASCII);
188
194
  error = grpc_error_set_str(GRPC_ERROR_CREATE("Failed to parse JSON"),
189
195
  GRPC_ERROR_STR_RAW_BYTES, dump);
190
196
  gpr_free(dump);
@@ -196,7 +202,7 @@ static grpc_error *create_default_creds_from_path(
196
202
  if (grpc_auth_json_key_is_valid(&key)) {
197
203
  result =
198
204
  grpc_service_account_jwt_access_credentials_create_from_auth_json_key(
199
- key, grpc_max_auth_token_lifetime());
205
+ exec_ctx, key, grpc_max_auth_token_lifetime());
200
206
  if (result == NULL) {
201
207
  error = GRPC_ERROR_CREATE(
202
208
  "grpc_service_account_jwt_access_credentials_create_from_auth_json_"
@@ -221,7 +227,7 @@ static grpc_error *create_default_creds_from_path(
221
227
  end:
222
228
  GPR_ASSERT((result == NULL) + (error == GRPC_ERROR_NONE) == 1);
223
229
  if (creds_path != NULL) gpr_free(creds_path);
224
- gpr_slice_unref(creds_data);
230
+ grpc_slice_unref_internal(exec_ctx, creds_data);
225
231
  if (json != NULL) grpc_json_destroy(json);
226
232
  *creds = result;
227
233
  return error;
@@ -232,6 +238,7 @@ grpc_channel_credentials *grpc_google_default_credentials_create(void) {
232
238
  grpc_call_credentials *call_creds = NULL;
233
239
  grpc_error *error = GRPC_ERROR_CREATE("Failed to create Google credentials");
234
240
  grpc_error *err;
241
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
235
242
 
236
243
  GRPC_API_TRACE("grpc_google_default_credentials_create(void)", 0, ());
237
244
 
@@ -246,20 +253,22 @@ grpc_channel_credentials *grpc_google_default_credentials_create(void) {
246
253
 
247
254
  /* First, try the environment variable. */
248
255
  err = create_default_creds_from_path(
249
- gpr_getenv(GRPC_GOOGLE_CREDENTIALS_ENV_VAR), &call_creds);
256
+ &exec_ctx, gpr_getenv(GRPC_GOOGLE_CREDENTIALS_ENV_VAR), &call_creds);
250
257
  if (err == GRPC_ERROR_NONE) goto end;
251
258
  error = grpc_error_add_child(error, err);
252
259
 
253
260
  /* Then the well-known file. */
254
261
  err = create_default_creds_from_path(
255
- grpc_get_well_known_google_credentials_file_path(), &call_creds);
262
+ &exec_ctx, grpc_get_well_known_google_credentials_file_path(),
263
+ &call_creds);
256
264
  if (err == GRPC_ERROR_NONE) goto end;
257
265
  error = grpc_error_add_child(error, err);
258
266
 
259
267
  /* At last try to see if we're on compute engine (do the detection only once
260
268
  since it requires a network test). */
261
269
  if (!compute_engine_detection_done) {
262
- int need_compute_engine_creds = is_stack_running_on_compute_engine();
270
+ int need_compute_engine_creds =
271
+ is_stack_running_on_compute_engine(&exec_ctx);
263
272
  compute_engine_detection_done = 1;
264
273
  if (need_compute_engine_creds) {
265
274
  call_creds = grpc_google_compute_engine_credentials_create(NULL);
@@ -282,8 +291,8 @@ end:
282
291
  grpc_composite_channel_credentials_create(ssl_creds, call_creds,
283
292
  NULL));
284
293
  GPR_ASSERT(default_credentials != NULL);
285
- grpc_channel_credentials_unref(ssl_creds);
286
- grpc_call_credentials_unref(call_creds);
294
+ grpc_channel_credentials_unref(&exec_ctx, ssl_creds);
295
+ grpc_call_credentials_unref(&exec_ctx, call_creds);
287
296
  result = default_credentials;
288
297
  } else {
289
298
  gpr_log(GPR_ERROR, "Could not create google default credentials.");
@@ -295,18 +304,21 @@ end:
295
304
  } else {
296
305
  GRPC_ERROR_UNREF(error);
297
306
  }
307
+ grpc_exec_ctx_finish(&exec_ctx);
298
308
  return result;
299
309
  }
300
310
 
301
311
  void grpc_flush_cached_google_default_credentials(void) {
312
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
302
313
  gpr_once_init(&g_once, init_default_credentials);
303
314
  gpr_mu_lock(&g_state_mu);
304
315
  if (default_credentials != NULL) {
305
- grpc_channel_credentials_unref(default_credentials);
316
+ grpc_channel_credentials_unref(&exec_ctx, default_credentials);
306
317
  default_credentials = NULL;
307
318
  }
308
319
  compute_engine_detection_done = 0;
309
320
  gpr_mu_unlock(&g_state_mu);
321
+ grpc_exec_ctx_finish(&exec_ctx);
310
322
  }
311
323
 
312
324
  /* -- Well known credentials path. -- */
@@ -34,12 +34,26 @@
34
34
  #ifndef GRPC_CORE_LIB_SECURITY_CREDENTIALS_GOOGLE_DEFAULT_GOOGLE_DEFAULT_CREDENTIALS_H
35
35
  #define GRPC_CORE_LIB_SECURITY_CREDENTIALS_GOOGLE_DEFAULT_GOOGLE_DEFAULT_CREDENTIALS_H
36
36
 
37
+ #include <grpc/support/port_platform.h>
38
+
37
39
  #include "src/core/lib/security/credentials/credentials.h"
38
40
 
39
41
  #define GRPC_GOOGLE_CLOUD_SDK_CONFIG_DIRECTORY "gcloud"
40
42
  #define GRPC_GOOGLE_WELL_KNOWN_CREDENTIALS_FILE \
41
43
  "application_default_credentials.json"
42
44
 
45
+ #ifdef GPR_WINDOWS
46
+ #define GRPC_GOOGLE_CREDENTIALS_PATH_ENV_VAR "APPDATA"
47
+ #define GRPC_GOOGLE_CREDENTIALS_PATH_SUFFIX \
48
+ GRPC_GOOGLE_CLOUD_SDK_CONFIG_DIRECTORY \
49
+ "/" GRPC_GOOGLE_WELL_KNOWN_CREDENTIALS_FILE
50
+ #else
51
+ #define GRPC_GOOGLE_CREDENTIALS_PATH_ENV_VAR "HOME"
52
+ #define GRPC_GOOGLE_CREDENTIALS_PATH_SUFFIX \
53
+ ".config/" GRPC_GOOGLE_CLOUD_SDK_CONFIG_DIRECTORY \
54
+ "/" GRPC_GOOGLE_WELL_KNOWN_CREDENTIALS_FILE
55
+ #endif
56
+
43
57
  void grpc_flush_cached_google_default_credentials(void);
44
58
 
45
59
  #endif /* GRPC_CORE_LIB_SECURITY_CREDENTIALS_GOOGLE_DEFAULT_GOOGLE_DEFAULT_CREDENTIALS_H \
@@ -42,9 +42,10 @@
42
42
  #include <grpc/support/string_util.h>
43
43
  #include <grpc/support/sync.h>
44
44
 
45
- static void iam_destruct(grpc_call_credentials *creds) {
45
+ static void iam_destruct(grpc_exec_ctx *exec_ctx,
46
+ grpc_call_credentials *creds) {
46
47
  grpc_google_iam_credentials *c = (grpc_google_iam_credentials *)creds;
47
- grpc_credentials_md_store_unref(c->iam_md);
48
+ grpc_credentials_md_store_unref(exec_ctx, c->iam_md);
48
49
  }
49
50
 
50
51
  static void iam_get_request_metadata(grpc_exec_ctx *exec_ctx,
@@ -38,6 +38,7 @@
38
38
  #include <grpc/support/alloc.h>
39
39
  #include <grpc/support/log.h>
40
40
  #include <grpc/support/string_util.h>
41
+ #include <grpc/support/time.h>
41
42
 
42
43
  #include "src/core/lib/security/util/b64.h"
43
44
  #include "src/core/lib/security/util/json_util.h"
@@ -34,7 +34,7 @@
34
34
  #ifndef GRPC_CORE_LIB_SECURITY_CREDENTIALS_JWT_JSON_TOKEN_H
35
35
  #define GRPC_CORE_LIB_SECURITY_CREDENTIALS_JWT_JSON_TOKEN_H
36
36
 
37
- #include <grpc/support/slice.h>
37
+ #include <grpc/slice.h>
38
38
  #include <openssl/rsa.h>
39
39
 
40
40
  #include "src/core/lib/json/json.h"
@@ -42,9 +42,10 @@
42
42
  #include <grpc/support/string_util.h>
43
43
  #include <grpc/support/sync.h>
44
44
 
45
- static void jwt_reset_cache(grpc_service_account_jwt_access_credentials *c) {
45
+ static void jwt_reset_cache(grpc_exec_ctx *exec_ctx,
46
+ grpc_service_account_jwt_access_credentials *c) {
46
47
  if (c->cached.jwt_md != NULL) {
47
- grpc_credentials_md_store_unref(c->cached.jwt_md);
48
+ grpc_credentials_md_store_unref(exec_ctx, c->cached.jwt_md);
48
49
  c->cached.jwt_md = NULL;
49
50
  }
50
51
  if (c->cached.service_url != NULL) {
@@ -54,11 +55,12 @@ static void jwt_reset_cache(grpc_service_account_jwt_access_credentials *c) {
54
55
  c->cached.jwt_expiration = gpr_inf_past(GPR_CLOCK_REALTIME);
55
56
  }
56
57
 
57
- static void jwt_destruct(grpc_call_credentials *creds) {
58
+ static void jwt_destruct(grpc_exec_ctx *exec_ctx,
59
+ grpc_call_credentials *creds) {
58
60
  grpc_service_account_jwt_access_credentials *c =
59
61
  (grpc_service_account_jwt_access_credentials *)creds;
60
62
  grpc_auth_json_key_destruct(&c->key);
61
- jwt_reset_cache(c);
63
+ jwt_reset_cache(exec_ctx, c);
62
64
  gpr_mu_destroy(&c->cache_mu);
63
65
  }
64
66
 
@@ -92,7 +94,7 @@ static void jwt_get_request_metadata(grpc_exec_ctx *exec_ctx,
92
94
  char *jwt = NULL;
93
95
  /* Generate a new jwt. */
94
96
  gpr_mu_lock(&c->cache_mu);
95
- jwt_reset_cache(c);
97
+ jwt_reset_cache(exec_ctx, c);
96
98
  jwt = grpc_jwt_encode_and_sign(&c->key, context.service_url,
97
99
  c->jwt_lifetime, NULL);
98
100
  if (jwt != NULL) {
@@ -114,7 +116,7 @@ static void jwt_get_request_metadata(grpc_exec_ctx *exec_ctx,
114
116
  if (jwt_md != NULL) {
115
117
  cb(exec_ctx, user_data, jwt_md->entries, jwt_md->num_entries,
116
118
  GRPC_CREDENTIALS_OK, NULL);
117
- grpc_credentials_md_store_unref(jwt_md);
119
+ grpc_credentials_md_store_unref(exec_ctx, jwt_md);
118
120
  } else {
119
121
  cb(exec_ctx, user_data, NULL, 0, GRPC_CREDENTIALS_ERROR,
120
122
  "Could not generate JWT.");
@@ -126,7 +128,8 @@ static grpc_call_credentials_vtable jwt_vtable = {jwt_destruct,
126
128
 
127
129
  grpc_call_credentials *
128
130
  grpc_service_account_jwt_access_credentials_create_from_auth_json_key(
129
- grpc_auth_json_key key, gpr_timespec token_lifetime) {
131
+ grpc_exec_ctx *exec_ctx, grpc_auth_json_key key,
132
+ gpr_timespec token_lifetime) {
130
133
  grpc_service_account_jwt_access_credentials *c;
131
134
  if (!grpc_auth_json_key_is_valid(&key)) {
132
135
  gpr_log(GPR_ERROR, "Invalid input for jwt credentials creation");
@@ -140,22 +143,54 @@ grpc_service_account_jwt_access_credentials_create_from_auth_json_key(
140
143
  c->key = key;
141
144
  c->jwt_lifetime = token_lifetime;
142
145
  gpr_mu_init(&c->cache_mu);
143
- jwt_reset_cache(c);
146
+ jwt_reset_cache(exec_ctx, c);
144
147
  return &c->base;
145
148
  }
146
149
 
150
+ static char *redact_private_key(const char *json_key) {
151
+ char *json_copy = gpr_strdup(json_key);
152
+ grpc_json *json = grpc_json_parse_string(json_copy);
153
+ if (!json) {
154
+ gpr_free(json_copy);
155
+ return gpr_strdup("<Json failed to parse.>");
156
+ }
157
+ const char *redacted = "<redacted>";
158
+ grpc_json *current = json->child;
159
+ while (current) {
160
+ if (current->type == GRPC_JSON_STRING &&
161
+ strcmp(current->key, "private_key") == 0) {
162
+ current->value = (char *)redacted;
163
+ break;
164
+ }
165
+ current = current->next;
166
+ }
167
+ char *clean_json = grpc_json_dump_to_string(json, 2);
168
+ gpr_free(json_copy);
169
+ grpc_json_destroy(json);
170
+ return clean_json;
171
+ }
172
+
147
173
  grpc_call_credentials *grpc_service_account_jwt_access_credentials_create(
148
174
  const char *json_key, gpr_timespec token_lifetime, void *reserved) {
149
- GRPC_API_TRACE(
150
- "grpc_service_account_jwt_access_credentials_create("
151
- "json_key=%s, "
152
- "token_lifetime="
153
- "gpr_timespec { tv_sec: %" PRId64
154
- ", tv_nsec: %d, clock_type: %d }, "
155
- "reserved=%p)",
156
- 5, (json_key, token_lifetime.tv_sec, token_lifetime.tv_nsec,
157
- (int)token_lifetime.clock_type, reserved));
175
+ if (grpc_api_trace) {
176
+ char *clean_json = redact_private_key(json_key);
177
+ gpr_log(GPR_INFO,
178
+ "grpc_service_account_jwt_access_credentials_create("
179
+ "json_key=%s, "
180
+ "token_lifetime="
181
+ "gpr_timespec { tv_sec: %" PRId64
182
+ ", tv_nsec: %d, clock_type: %d }, "
183
+ "reserved=%p)",
184
+ clean_json, token_lifetime.tv_sec, token_lifetime.tv_nsec,
185
+ (int)token_lifetime.clock_type, reserved);
186
+ gpr_free(clean_json);
187
+ }
158
188
  GPR_ASSERT(reserved == NULL);
159
- return grpc_service_account_jwt_access_credentials_create_from_auth_json_key(
160
- grpc_auth_json_key_create_from_string(json_key), token_lifetime);
189
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
190
+ grpc_call_credentials *creds =
191
+ grpc_service_account_jwt_access_credentials_create_from_auth_json_key(
192
+ &exec_ctx, grpc_auth_json_key_create_from_string(json_key),
193
+ token_lifetime);
194
+ grpc_exec_ctx_finish(&exec_ctx);
195
+ return creds;
161
196
  }
@@ -57,6 +57,7 @@ typedef struct {
57
57
  // Takes ownership of the key.
58
58
  grpc_call_credentials *
59
59
  grpc_service_account_jwt_access_credentials_create_from_auth_json_key(
60
- grpc_auth_json_key key, gpr_timespec token_lifetime);
60
+ grpc_exec_ctx *exec_ctx, grpc_auth_json_key key,
61
+ gpr_timespec token_lifetime);
61
62
 
62
63
  #endif /* GRPC_CORE_LIB_SECURITY_CREDENTIALS_JWT_JWT_CREDENTIALS_H */
@@ -36,11 +36,6 @@
36
36
  #include <limits.h>
37
37
  #include <string.h>
38
38
 
39
- #include "src/core/lib/http/httpcli.h"
40
- #include "src/core/lib/iomgr/polling_entity.h"
41
- #include "src/core/lib/security/util/b64.h"
42
- #include "src/core/lib/tsi/ssl_types.h"
43
-
44
39
  #include <grpc/support/alloc.h>
45
40
  #include <grpc/support/log.h>
46
41
  #include <grpc/support/string_util.h>
@@ -48,6 +43,13 @@
48
43
  #include <grpc/support/useful.h>
49
44
  #include <openssl/pem.h>
50
45
 
46
+ #include "src/core/lib/http/httpcli.h"
47
+ #include "src/core/lib/iomgr/polling_entity.h"
48
+ #include "src/core/lib/security/util/b64.h"
49
+ #include "src/core/lib/slice/slice_internal.h"
50
+ #include "src/core/lib/support/string.h"
51
+ #include "src/core/lib/tsi/ssl_types.h"
52
+
51
53
  /* --- Utils. --- */
52
54
 
53
55
  const char *grpc_jwt_verifier_status_to_string(
@@ -84,19 +86,20 @@ static const EVP_MD *evp_md_from_alg(const char *alg) {
84
86
  }
85
87
  }
86
88
 
87
- static grpc_json *parse_json_part_from_jwt(const char *str, size_t len,
88
- gpr_slice *buffer) {
89
+ static grpc_json *parse_json_part_from_jwt(grpc_exec_ctx *exec_ctx,
90
+ const char *str, size_t len,
91
+ grpc_slice *buffer) {
89
92
  grpc_json *json;
90
93
 
91
- *buffer = grpc_base64_decode_with_len(str, len, 1);
92
- if (GPR_SLICE_IS_EMPTY(*buffer)) {
94
+ *buffer = grpc_base64_decode_with_len(exec_ctx, str, len, 1);
95
+ if (GRPC_SLICE_IS_EMPTY(*buffer)) {
93
96
  gpr_log(GPR_ERROR, "Invalid base64.");
94
97
  return NULL;
95
98
  }
96
- json = grpc_json_parse_string_with_len((char *)GPR_SLICE_START_PTR(*buffer),
97
- GPR_SLICE_LENGTH(*buffer));
99
+ json = grpc_json_parse_string_with_len((char *)GRPC_SLICE_START_PTR(*buffer),
100
+ GRPC_SLICE_LENGTH(*buffer));
98
101
  if (json == NULL) {
99
- gpr_slice_unref(*buffer);
102
+ grpc_slice_unref_internal(exec_ctx, *buffer);
100
103
  gpr_log(GPR_ERROR, "JSON parsing error.");
101
104
  }
102
105
  return json;
@@ -129,16 +132,17 @@ typedef struct {
129
132
  const char *kid;
130
133
  const char *typ;
131
134
  /* TODO(jboeuf): Add others as needed (jku, jwk, x5u, x5c and so on...). */
132
- gpr_slice buffer;
135
+ grpc_slice buffer;
133
136
  } jose_header;
134
137
 
135
- static void jose_header_destroy(jose_header *h) {
136
- gpr_slice_unref(h->buffer);
138
+ static void jose_header_destroy(grpc_exec_ctx *exec_ctx, jose_header *h) {
139
+ grpc_slice_unref_internal(exec_ctx, h->buffer);
137
140
  gpr_free(h);
138
141
  }
139
142
 
140
143
  /* Takes ownership of json and buffer. */
141
- static jose_header *jose_header_from_json(grpc_json *json, gpr_slice buffer) {
144
+ static jose_header *jose_header_from_json(grpc_exec_ctx *exec_ctx,
145
+ grpc_json *json, grpc_slice buffer) {
142
146
  grpc_json *cur;
143
147
  jose_header *h = gpr_malloc(sizeof(jose_header));
144
148
  memset(h, 0, sizeof(jose_header));
@@ -173,7 +177,7 @@ static jose_header *jose_header_from_json(grpc_json *json, gpr_slice buffer) {
173
177
 
174
178
  error:
175
179
  grpc_json_destroy(json);
176
- jose_header_destroy(h);
180
+ jose_header_destroy(exec_ctx, h);
177
181
  return NULL;
178
182
  }
179
183
 
@@ -190,12 +194,12 @@ struct grpc_jwt_claims {
190
194
  gpr_timespec nbf;
191
195
 
192
196
  grpc_json *json;
193
- gpr_slice buffer;
197
+ grpc_slice buffer;
194
198
  };
195
199
 
196
- void grpc_jwt_claims_destroy(grpc_jwt_claims *claims) {
200
+ void grpc_jwt_claims_destroy(grpc_exec_ctx *exec_ctx, grpc_jwt_claims *claims) {
197
201
  grpc_json_destroy(claims->json);
198
- gpr_slice_unref(claims->buffer);
202
+ grpc_slice_unref_internal(exec_ctx, claims->buffer);
199
203
  gpr_free(claims);
200
204
  }
201
205
 
@@ -240,7 +244,8 @@ gpr_timespec grpc_jwt_claims_not_before(const grpc_jwt_claims *claims) {
240
244
  }
241
245
 
242
246
  /* Takes ownership of json and buffer even in case of failure. */
243
- grpc_jwt_claims *grpc_jwt_claims_from_json(grpc_json *json, gpr_slice buffer) {
247
+ grpc_jwt_claims *grpc_jwt_claims_from_json(grpc_exec_ctx *exec_ctx,
248
+ grpc_json *json, grpc_slice buffer) {
244
249
  grpc_json *cur;
245
250
  grpc_jwt_claims *claims = gpr_malloc(sizeof(grpc_jwt_claims));
246
251
  memset(claims, 0, sizeof(grpc_jwt_claims));
@@ -281,7 +286,7 @@ grpc_jwt_claims *grpc_jwt_claims_from_json(grpc_json *json, gpr_slice buffer) {
281
286
  return claims;
282
287
 
283
288
  error:
284
- grpc_jwt_claims_destroy(claims);
289
+ grpc_jwt_claims_destroy(exec_ctx, claims);
285
290
  return NULL;
286
291
  }
287
292
 
@@ -305,6 +310,17 @@ grpc_jwt_verifier_status grpc_jwt_claims_check(const grpc_jwt_claims *claims,
305
310
  return GRPC_JWT_VERIFIER_TIME_CONSTRAINT_FAILURE;
306
311
  }
307
312
 
313
+ /* This should be probably up to the upper layer to decide but let's harcode
314
+ the 99% use case here for email issuers, where the JWT must be self
315
+ issued. */
316
+ if (grpc_jwt_issuer_email_domain(claims->iss) != NULL &&
317
+ claims->sub != NULL && strcmp(claims->iss, claims->sub) != 0) {
318
+ gpr_log(GPR_ERROR,
319
+ "Email issuer (%s) cannot assert another subject (%s) than itself.",
320
+ claims->iss, claims->sub);
321
+ return GRPC_JWT_VERIFIER_BAD_SUBJECT;
322
+ }
323
+
308
324
  if (audience == NULL) {
309
325
  audience_ok = claims->aud == NULL;
310
326
  } else {
@@ -333,8 +349,8 @@ typedef struct {
333
349
  jose_header *header;
334
350
  grpc_jwt_claims *claims;
335
351
  char *audience;
336
- gpr_slice signature;
337
- gpr_slice signed_data;
352
+ grpc_slice signature;
353
+ grpc_slice signed_data;
338
354
  void *user_data;
339
355
  grpc_jwt_verification_done_cb user_cb;
340
356
  grpc_http_response responses[HTTP_RESPONSE_COUNT];
@@ -343,7 +359,7 @@ typedef struct {
343
359
  /* Takes ownership of the header, claims and signature. */
344
360
  static verifier_cb_ctx *verifier_cb_ctx_create(
345
361
  grpc_jwt_verifier *verifier, grpc_pollset *pollset, jose_header *header,
346
- grpc_jwt_claims *claims, const char *audience, gpr_slice signature,
362
+ grpc_jwt_claims *claims, const char *audience, grpc_slice signature,
347
363
  const char *signed_jwt, size_t signed_jwt_len, void *user_data,
348
364
  grpc_jwt_verification_done_cb cb) {
349
365
  grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
@@ -355,19 +371,19 @@ static verifier_cb_ctx *verifier_cb_ctx_create(
355
371
  ctx->audience = gpr_strdup(audience);
356
372
  ctx->claims = claims;
357
373
  ctx->signature = signature;
358
- ctx->signed_data = gpr_slice_from_copied_buffer(signed_jwt, signed_jwt_len);
374
+ ctx->signed_data = grpc_slice_from_copied_buffer(signed_jwt, signed_jwt_len);
359
375
  ctx->user_data = user_data;
360
376
  ctx->user_cb = cb;
361
377
  grpc_exec_ctx_finish(&exec_ctx);
362
378
  return ctx;
363
379
  }
364
380
 
365
- void verifier_cb_ctx_destroy(verifier_cb_ctx *ctx) {
381
+ void verifier_cb_ctx_destroy(grpc_exec_ctx *exec_ctx, verifier_cb_ctx *ctx) {
366
382
  if (ctx->audience != NULL) gpr_free(ctx->audience);
367
- if (ctx->claims != NULL) grpc_jwt_claims_destroy(ctx->claims);
368
- gpr_slice_unref(ctx->signature);
369
- gpr_slice_unref(ctx->signed_data);
370
- jose_header_destroy(ctx->header);
383
+ if (ctx->claims != NULL) grpc_jwt_claims_destroy(exec_ctx, ctx->claims);
384
+ grpc_slice_unref_internal(exec_ctx, ctx->signature);
385
+ grpc_slice_unref_internal(exec_ctx, ctx->signed_data);
386
+ jose_header_destroy(exec_ctx, ctx->header);
371
387
  for (size_t i = 0; i < HTTP_RESPONSE_COUNT; i++) {
372
388
  grpc_http_response_destroy(&ctx->responses[i]);
373
389
  }
@@ -447,23 +463,24 @@ end:
447
463
  return result;
448
464
  }
449
465
 
450
- static BIGNUM *bignum_from_base64(const char *b64) {
466
+ static BIGNUM *bignum_from_base64(grpc_exec_ctx *exec_ctx, const char *b64) {
451
467
  BIGNUM *result = NULL;
452
- gpr_slice bin;
468
+ grpc_slice bin;
453
469
 
454
470
  if (b64 == NULL) return NULL;
455
- bin = grpc_base64_decode(b64, 1);
456
- if (GPR_SLICE_IS_EMPTY(bin)) {
471
+ bin = grpc_base64_decode(exec_ctx, b64, 1);
472
+ if (GRPC_SLICE_IS_EMPTY(bin)) {
457
473
  gpr_log(GPR_ERROR, "Invalid base64 for big num.");
458
474
  return NULL;
459
475
  }
460
- result = BN_bin2bn(GPR_SLICE_START_PTR(bin),
461
- TSI_SIZE_AS_SIZE(GPR_SLICE_LENGTH(bin)), NULL);
462
- gpr_slice_unref(bin);
476
+ result = BN_bin2bn(GRPC_SLICE_START_PTR(bin),
477
+ TSI_SIZE_AS_SIZE(GRPC_SLICE_LENGTH(bin)), NULL);
478
+ grpc_slice_unref_internal(exec_ctx, bin);
463
479
  return result;
464
480
  }
465
481
 
466
- static EVP_PKEY *pkey_from_jwk(const grpc_json *json, const char *kty) {
482
+ static EVP_PKEY *pkey_from_jwk(grpc_exec_ctx *exec_ctx, const grpc_json *json,
483
+ const char *kty) {
467
484
  const grpc_json *key_prop;
468
485
  RSA *rsa = NULL;
469
486
  EVP_PKEY *result = NULL;
@@ -480,10 +497,12 @@ static EVP_PKEY *pkey_from_jwk(const grpc_json *json, const char *kty) {
480
497
  }
481
498
  for (key_prop = json->child; key_prop != NULL; key_prop = key_prop->next) {
482
499
  if (strcmp(key_prop->key, "n") == 0) {
483
- rsa->n = bignum_from_base64(validate_string_field(key_prop, "n"));
500
+ rsa->n =
501
+ bignum_from_base64(exec_ctx, validate_string_field(key_prop, "n"));
484
502
  if (rsa->n == NULL) goto end;
485
503
  } else if (strcmp(key_prop->key, "e") == 0) {
486
- rsa->e = bignum_from_base64(validate_string_field(key_prop, "e"));
504
+ rsa->e =
505
+ bignum_from_base64(exec_ctx, validate_string_field(key_prop, "e"));
487
506
  if (rsa->e == NULL) goto end;
488
507
  }
489
508
  }
@@ -499,7 +518,8 @@ end:
499
518
  return result;
500
519
  }
501
520
 
502
- static EVP_PKEY *find_verification_key(const grpc_json *json,
521
+ static EVP_PKEY *find_verification_key(grpc_exec_ctx *exec_ctx,
522
+ const grpc_json *json,
503
523
  const char *header_alg,
504
524
  const char *header_kid) {
505
525
  const grpc_json *jkey;
@@ -543,7 +563,7 @@ static EVP_PKEY *find_verification_key(const grpc_json *json,
543
563
  }
544
564
  if (alg != NULL && kid != NULL && kty != NULL &&
545
565
  strcmp(kid, header_kid) == 0 && strcmp(alg, header_alg) == 0) {
546
- return pkey_from_jwk(jkey, kty);
566
+ return pkey_from_jwk(exec_ctx, jkey, kty);
547
567
  }
548
568
  }
549
569
  gpr_log(GPR_ERROR,
@@ -553,7 +573,7 @@ static EVP_PKEY *find_verification_key(const grpc_json *json,
553
573
  }
554
574
 
555
575
  static int verify_jwt_signature(EVP_PKEY *key, const char *alg,
556
- gpr_slice signature, gpr_slice signed_data) {
576
+ grpc_slice signature, grpc_slice signed_data) {
557
577
  EVP_MD_CTX *md_ctx = EVP_MD_CTX_create();
558
578
  const EVP_MD *md = evp_md_from_alg(alg);
559
579
  int result = 0;
@@ -567,13 +587,13 @@ static int verify_jwt_signature(EVP_PKEY *key, const char *alg,
567
587
  gpr_log(GPR_ERROR, "EVP_DigestVerifyInit failed.");
568
588
  goto end;
569
589
  }
570
- if (EVP_DigestVerifyUpdate(md_ctx, GPR_SLICE_START_PTR(signed_data),
571
- GPR_SLICE_LENGTH(signed_data)) != 1) {
590
+ if (EVP_DigestVerifyUpdate(md_ctx, GRPC_SLICE_START_PTR(signed_data),
591
+ GRPC_SLICE_LENGTH(signed_data)) != 1) {
572
592
  gpr_log(GPR_ERROR, "EVP_DigestVerifyUpdate failed.");
573
593
  goto end;
574
594
  }
575
- if (EVP_DigestVerifyFinal(md_ctx, GPR_SLICE_START_PTR(signature),
576
- GPR_SLICE_LENGTH(signature)) != 1) {
595
+ if (EVP_DigestVerifyFinal(md_ctx, GRPC_SLICE_START_PTR(signature),
596
+ GRPC_SLICE_LENGTH(signature)) != 1) {
577
597
  gpr_log(GPR_ERROR, "JWT signature verification failed.");
578
598
  goto end;
579
599
  }
@@ -597,7 +617,7 @@ static void on_keys_retrieved(grpc_exec_ctx *exec_ctx, void *user_data,
597
617
  goto end;
598
618
  }
599
619
  verification_key =
600
- find_verification_key(json, ctx->header->alg, ctx->header->kid);
620
+ find_verification_key(exec_ctx, json, ctx->header->alg, ctx->header->kid);
601
621
  if (verification_key == NULL) {
602
622
  gpr_log(GPR_ERROR, "Could not find verification key with kid %s.",
603
623
  ctx->header->kid);
@@ -621,8 +641,8 @@ static void on_keys_retrieved(grpc_exec_ctx *exec_ctx, void *user_data,
621
641
  end:
622
642
  if (json != NULL) grpc_json_destroy(json);
623
643
  if (verification_key != NULL) EVP_PKEY_free(verification_key);
624
- ctx->user_cb(ctx->user_data, status, claims);
625
- verifier_cb_ctx_destroy(ctx);
644
+ ctx->user_cb(exec_ctx, ctx->user_data, status, claims);
645
+ verifier_cb_ctx_destroy(exec_ctx, ctx);
626
646
  }
627
647
 
628
648
  static void on_openid_config_retrieved(grpc_exec_ctx *exec_ctx, void *user_data,
@@ -657,19 +677,26 @@ static void on_openid_config_retrieved(grpc_exec_ctx *exec_ctx, void *user_data,
657
677
  *(req.host + (req.http.path - jwks_uri)) = '\0';
658
678
  }
659
679
 
680
+ /* TODO(ctiller): Carry the resource_quota in ctx and share it with the host
681
+ channel. This would allow us to cancel an authentication query when under
682
+ extreme memory pressure. */
683
+ grpc_resource_quota *resource_quota =
684
+ grpc_resource_quota_create("jwt_verifier");
660
685
  grpc_httpcli_get(
661
- exec_ctx, &ctx->verifier->http_ctx, &ctx->pollent, &req,
686
+ exec_ctx, &ctx->verifier->http_ctx, &ctx->pollent, resource_quota, &req,
662
687
  gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), grpc_jwt_verifier_max_delay),
663
- grpc_closure_create(on_keys_retrieved, ctx),
688
+ grpc_closure_create(on_keys_retrieved, ctx, grpc_schedule_on_exec_ctx),
664
689
  &ctx->responses[HTTP_RESPONSE_KEYS]);
690
+ grpc_resource_quota_unref_internal(exec_ctx, resource_quota);
665
691
  grpc_json_destroy(json);
666
692
  gpr_free(req.host);
667
693
  return;
668
694
 
669
695
  error:
670
696
  if (json != NULL) grpc_json_destroy(json);
671
- ctx->user_cb(ctx->user_data, GRPC_JWT_VERIFIER_KEY_RETRIEVAL_ERROR, NULL);
672
- verifier_cb_ctx_destroy(ctx);
697
+ ctx->user_cb(exec_ctx, ctx->user_data, GRPC_JWT_VERIFIER_KEY_RETRIEVAL_ERROR,
698
+ NULL);
699
+ verifier_cb_ctx_destroy(exec_ctx, ctx);
673
700
  }
674
701
 
675
702
  static email_key_mapping *verifier_get_mapping(grpc_jwt_verifier *v,
@@ -699,10 +726,26 @@ static void verifier_put_mapping(grpc_jwt_verifier *v, const char *email_domain,
699
726
  GPR_ASSERT(v->num_mappings <= v->allocated_mappings);
700
727
  }
701
728
 
729
+ /* Very non-sophisticated way to detect an email address. Should be good
730
+ enough for now... */
731
+ const char *grpc_jwt_issuer_email_domain(const char *issuer) {
732
+ const char *at_sign = strchr(issuer, '@');
733
+ if (at_sign == NULL) return NULL;
734
+ const char *email_domain = at_sign + 1;
735
+ if (*email_domain == '\0') return NULL;
736
+ const char *dot = strrchr(email_domain, '.');
737
+ if (dot == NULL || dot == email_domain) return email_domain;
738
+ GPR_ASSERT(dot > email_domain);
739
+ /* There may be a subdomain, we just want the domain. */
740
+ dot = gpr_memrchr(email_domain, '.', (size_t)(dot - email_domain));
741
+ if (dot == NULL) return email_domain;
742
+ return dot + 1;
743
+ }
744
+
702
745
  /* Takes ownership of ctx. */
703
746
  static void retrieve_key_and_verify(grpc_exec_ctx *exec_ctx,
704
747
  verifier_cb_ctx *ctx) {
705
- const char *at_sign;
748
+ const char *email_domain;
706
749
  grpc_closure *http_cb;
707
750
  char *path_prefix = NULL;
708
751
  const char *iss;
@@ -727,13 +770,9 @@ static void retrieve_key_and_verify(grpc_exec_ctx *exec_ctx,
727
770
  Nobody seems to implement the account/email/webfinger part 2. of the spec
728
771
  so we will rely instead on email/url mappings if we detect such an issuer.
729
772
  Part 4, on the other hand is implemented by both google and salesforce. */
730
-
731
- /* Very non-sophisticated way to detect an email address. Should be good
732
- enough for now... */
733
- at_sign = strchr(iss, '@');
734
- if (at_sign != NULL) {
773
+ email_domain = grpc_jwt_issuer_email_domain(iss);
774
+ if (email_domain != NULL) {
735
775
  email_key_mapping *mapping;
736
- const char *email_domain = at_sign + 1;
737
776
  GPR_ASSERT(ctx->verifier != NULL);
738
777
  mapping = verifier_get_mapping(ctx->verifier, email_domain);
739
778
  if (mapping == NULL) {
@@ -748,7 +787,8 @@ static void retrieve_key_and_verify(grpc_exec_ctx *exec_ctx,
748
787
  *(path_prefix++) = '\0';
749
788
  gpr_asprintf(&req.http.path, "/%s/%s", path_prefix, iss);
750
789
  }
751
- http_cb = grpc_closure_create(on_keys_retrieved, ctx);
790
+ http_cb =
791
+ grpc_closure_create(on_keys_retrieved, ctx, grpc_schedule_on_exec_ctx);
752
792
  rsp_idx = HTTP_RESPONSE_KEYS;
753
793
  } else {
754
794
  req.host = gpr_strdup(strstr(iss, "https://") == iss ? iss + 8 : iss);
@@ -760,21 +800,29 @@ static void retrieve_key_and_verify(grpc_exec_ctx *exec_ctx,
760
800
  gpr_asprintf(&req.http.path, "/%s%s", path_prefix,
761
801
  GRPC_OPENID_CONFIG_URL_SUFFIX);
762
802
  }
763
- http_cb = grpc_closure_create(on_openid_config_retrieved, ctx);
803
+ http_cb = grpc_closure_create(on_openid_config_retrieved, ctx,
804
+ grpc_schedule_on_exec_ctx);
764
805
  rsp_idx = HTTP_RESPONSE_OPENID;
765
806
  }
766
807
 
808
+ /* TODO(ctiller): Carry the resource_quota in ctx and share it with the host
809
+ channel. This would allow us to cancel an authentication query when under
810
+ extreme memory pressure. */
811
+ grpc_resource_quota *resource_quota =
812
+ grpc_resource_quota_create("jwt_verifier");
767
813
  grpc_httpcli_get(
768
- exec_ctx, &ctx->verifier->http_ctx, &ctx->pollent, &req,
814
+ exec_ctx, &ctx->verifier->http_ctx, &ctx->pollent, resource_quota, &req,
769
815
  gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), grpc_jwt_verifier_max_delay),
770
816
  http_cb, &ctx->responses[rsp_idx]);
817
+ grpc_resource_quota_unref_internal(exec_ctx, resource_quota);
771
818
  gpr_free(req.host);
772
819
  gpr_free(req.http.path);
773
820
  return;
774
821
 
775
822
  error:
776
- ctx->user_cb(ctx->user_data, GRPC_JWT_VERIFIER_KEY_RETRIEVAL_ERROR, NULL);
777
- verifier_cb_ctx_destroy(ctx);
823
+ ctx->user_cb(exec_ctx, ctx->user_data, GRPC_JWT_VERIFIER_KEY_RETRIEVAL_ERROR,
824
+ NULL);
825
+ verifier_cb_ctx_destroy(exec_ctx, ctx);
778
826
  }
779
827
 
780
828
  void grpc_jwt_verifier_verify(grpc_exec_ctx *exec_ctx,
@@ -787,32 +835,34 @@ void grpc_jwt_verifier_verify(grpc_exec_ctx *exec_ctx,
787
835
  grpc_json *json;
788
836
  jose_header *header = NULL;
789
837
  grpc_jwt_claims *claims = NULL;
790
- gpr_slice header_buffer;
791
- gpr_slice claims_buffer;
792
- gpr_slice signature;
838
+ grpc_slice header_buffer;
839
+ grpc_slice claims_buffer;
840
+ grpc_slice signature;
793
841
  size_t signed_jwt_len;
794
842
  const char *cur = jwt;
795
843
 
796
844
  GPR_ASSERT(verifier != NULL && jwt != NULL && audience != NULL && cb != NULL);
797
845
  dot = strchr(cur, '.');
798
846
  if (dot == NULL) goto error;
799
- json = parse_json_part_from_jwt(cur, (size_t)(dot - cur), &header_buffer);
847
+ json = parse_json_part_from_jwt(exec_ctx, cur, (size_t)(dot - cur),
848
+ &header_buffer);
800
849
  if (json == NULL) goto error;
801
- header = jose_header_from_json(json, header_buffer);
850
+ header = jose_header_from_json(exec_ctx, json, header_buffer);
802
851
  if (header == NULL) goto error;
803
852
 
804
853
  cur = dot + 1;
805
854
  dot = strchr(cur, '.');
806
855
  if (dot == NULL) goto error;
807
- json = parse_json_part_from_jwt(cur, (size_t)(dot - cur), &claims_buffer);
856
+ json = parse_json_part_from_jwt(exec_ctx, cur, (size_t)(dot - cur),
857
+ &claims_buffer);
808
858
  if (json == NULL) goto error;
809
- claims = grpc_jwt_claims_from_json(json, claims_buffer);
859
+ claims = grpc_jwt_claims_from_json(exec_ctx, json, claims_buffer);
810
860
  if (claims == NULL) goto error;
811
861
 
812
862
  signed_jwt_len = (size_t)(dot - jwt);
813
863
  cur = dot + 1;
814
- signature = grpc_base64_decode(cur, 1);
815
- if (GPR_SLICE_IS_EMPTY(signature)) goto error;
864
+ signature = grpc_base64_decode(exec_ctx, cur, 1);
865
+ if (GRPC_SLICE_IS_EMPTY(signature)) goto error;
816
866
  retrieve_key_and_verify(
817
867
  exec_ctx,
818
868
  verifier_cb_ctx_create(verifier, pollset, header, claims, audience,
@@ -820,9 +870,9 @@ void grpc_jwt_verifier_verify(grpc_exec_ctx *exec_ctx,
820
870
  return;
821
871
 
822
872
  error:
823
- if (header != NULL) jose_header_destroy(header);
824
- if (claims != NULL) grpc_jwt_claims_destroy(claims);
825
- cb(user_data, GRPC_JWT_VERIFIER_BAD_FORMAT, NULL);
873
+ if (header != NULL) jose_header_destroy(exec_ctx, header);
874
+ if (claims != NULL) grpc_jwt_claims_destroy(exec_ctx, claims);
875
+ cb(exec_ctx, user_data, GRPC_JWT_VERIFIER_BAD_FORMAT, NULL);
826
876
  }
827
877
 
828
878
  grpc_jwt_verifier *grpc_jwt_verifier_create(