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
@@ -56,23 +56,16 @@
56
56
 
57
57
  #include <openssl/ssl.h>
58
58
 
59
+ #include <assert.h>
59
60
  #include <limits.h>
60
- #include <stdio.h>
61
61
  #include <string.h>
62
62
 
63
63
  #include <openssl/err.h>
64
64
  #include <openssl/mem.h>
65
- #include <openssl/obj.h>
65
+ #include <openssl/nid.h>
66
66
 
67
67
  #include "internal.h"
68
68
 
69
- #if defined(OPENSSL_WINDOWS)
70
- #include <sys/timeb.h>
71
- #else
72
- #include <sys/socket.h>
73
- #include <sys/time.h>
74
- #endif
75
-
76
69
 
77
70
  /* DTLS1_MTU_TIMEOUTS is the maximum number of timeouts to expire
78
71
  * before starting to decrease the MTU. */
@@ -82,8 +75,6 @@
82
75
  * before failing the DTLS handshake. */
83
76
  #define DTLS1_MAX_TIMEOUTS 12
84
77
 
85
- static void get_current_time(const SSL *ssl, struct timeval *out_clock);
86
-
87
78
  int dtls1_new(SSL *ssl) {
88
79
  DTLS1_STATE *d1;
89
80
 
@@ -97,17 +88,6 @@ int dtls1_new(SSL *ssl) {
97
88
  }
98
89
  memset(d1, 0, sizeof *d1);
99
90
 
100
- d1->buffered_messages = pqueue_new();
101
- d1->sent_messages = pqueue_new();
102
-
103
- if (!d1->buffered_messages || !d1->sent_messages) {
104
- pqueue_free(d1->buffered_messages);
105
- pqueue_free(d1->sent_messages);
106
- OPENSSL_free(d1);
107
- ssl3_free(ssl);
108
- return 0;
109
- }
110
-
111
91
  ssl->d1 = d1;
112
92
 
113
93
  /* Set the version to the highest supported version.
@@ -119,23 +99,6 @@ int dtls1_new(SSL *ssl) {
119
99
  return 1;
120
100
  }
121
101
 
122
- static void dtls1_clear_queues(SSL *ssl) {
123
- pitem *item = NULL;
124
- hm_fragment *frag = NULL;
125
-
126
- while ((item = pqueue_pop(ssl->d1->buffered_messages)) != NULL) {
127
- frag = (hm_fragment *)item->data;
128
- dtls1_hm_fragment_free(frag);
129
- pitem_free(item);
130
- }
131
-
132
- while ((item = pqueue_pop(ssl->d1->sent_messages)) != NULL) {
133
- frag = (hm_fragment *)item->data;
134
- dtls1_hm_fragment_free(frag);
135
- pitem_free(item);
136
- }
137
- }
138
-
139
102
  void dtls1_free(SSL *ssl) {
140
103
  ssl3_free(ssl);
141
104
 
@@ -143,38 +106,43 @@ void dtls1_free(SSL *ssl) {
143
106
  return;
144
107
  }
145
108
 
146
- dtls1_clear_queues(ssl);
147
-
148
- pqueue_free(ssl->d1->buffered_messages);
149
- pqueue_free(ssl->d1->sent_messages);
109
+ dtls_clear_incoming_messages(ssl);
110
+ dtls_clear_outgoing_messages(ssl);
150
111
 
151
112
  OPENSSL_free(ssl->d1);
152
113
  ssl->d1 = NULL;
153
114
  }
154
115
 
155
116
  int dtls1_supports_cipher(const SSL_CIPHER *cipher) {
156
- /* DTLS does not support stream ciphers. The NULL cipher is rejected because
157
- * it's not needed. */
158
- return cipher->algorithm_enc != SSL_RC4 && cipher->algorithm_enc != SSL_eNULL;
117
+ return cipher->algorithm_enc != SSL_eNULL;
118
+ }
119
+
120
+ void DTLSv1_set_initial_timeout_duration(SSL *ssl, unsigned int duration_ms) {
121
+ ssl->initial_timeout_duration_ms = duration_ms;
159
122
  }
160
123
 
161
124
  void dtls1_start_timer(SSL *ssl) {
162
- /* If timer is not set, initialize duration with 1 second */
125
+ /* If timer is not set, initialize duration (by default, 1 second) */
163
126
  if (ssl->d1->next_timeout.tv_sec == 0 && ssl->d1->next_timeout.tv_usec == 0) {
164
- ssl->d1->timeout_duration = 1;
127
+ ssl->d1->timeout_duration_ms = ssl->initial_timeout_duration_ms;
165
128
  }
166
129
 
167
130
  /* Set timeout to current time */
168
- get_current_time(ssl, &ssl->d1->next_timeout);
131
+ ssl_get_current_time(ssl, &ssl->d1->next_timeout);
169
132
 
170
133
  /* Add duration to current time */
171
- ssl->d1->next_timeout.tv_sec += ssl->d1->timeout_duration;
172
- BIO_ctrl(SSL_get_rbio(ssl), BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT, 0,
134
+ ssl->d1->next_timeout.tv_sec += ssl->d1->timeout_duration_ms / 1000;
135
+ ssl->d1->next_timeout.tv_usec += (ssl->d1->timeout_duration_ms % 1000) * 1000;
136
+ if (ssl->d1->next_timeout.tv_usec >= 1000000) {
137
+ ssl->d1->next_timeout.tv_sec++;
138
+ ssl->d1->next_timeout.tv_usec -= 1000000;
139
+ }
140
+ BIO_ctrl(ssl->rbio, BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT, 0,
173
141
  &ssl->d1->next_timeout);
174
142
  }
175
143
 
176
144
  int DTLSv1_get_timeout(const SSL *ssl, struct timeval *out) {
177
- if (!SSL_IS_DTLS(ssl)) {
145
+ if (!SSL_is_dtls(ssl)) {
178
146
  return 0;
179
147
  }
180
148
 
@@ -183,9 +151,8 @@ int DTLSv1_get_timeout(const SSL *ssl, struct timeval *out) {
183
151
  return 0;
184
152
  }
185
153
 
186
- /* Get current time */
187
154
  struct timeval timenow;
188
- get_current_time(ssl, &timenow);
155
+ ssl_get_current_time(ssl, &timenow);
189
156
 
190
157
  /* If timer already expired, set remaining time to 0 */
191
158
  if (ssl->d1->next_timeout.tv_sec < timenow.tv_sec ||
@@ -231,9 +198,9 @@ int dtls1_is_timer_expired(SSL *ssl) {
231
198
  }
232
199
 
233
200
  void dtls1_double_timeout(SSL *ssl) {
234
- ssl->d1->timeout_duration *= 2;
235
- if (ssl->d1->timeout_duration > 60) {
236
- ssl->d1->timeout_duration = 60;
201
+ ssl->d1->timeout_duration_ms *= 2;
202
+ if (ssl->d1->timeout_duration_ms > 60000) {
203
+ ssl->d1->timeout_duration_ms = 60000;
237
204
  }
238
205
  dtls1_start_timer(ssl);
239
206
  }
@@ -242,11 +209,11 @@ void dtls1_stop_timer(SSL *ssl) {
242
209
  /* Reset everything */
243
210
  ssl->d1->num_timeouts = 0;
244
211
  memset(&ssl->d1->next_timeout, 0, sizeof(struct timeval));
245
- ssl->d1->timeout_duration = 1;
246
- BIO_ctrl(SSL_get_rbio(ssl), BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT, 0,
212
+ ssl->d1->timeout_duration_ms = ssl->initial_timeout_duration_ms;
213
+ BIO_ctrl(ssl->rbio, BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT, 0,
247
214
  &ssl->d1->next_timeout);
248
215
  /* Clear retransmission buffer */
249
- dtls1_clear_record_buffer(ssl);
216
+ dtls_clear_outgoing_messages(ssl);
250
217
  }
251
218
 
252
219
  int dtls1_check_timeout_num(SSL *ssl) {
@@ -255,8 +222,7 @@ int dtls1_check_timeout_num(SSL *ssl) {
255
222
  /* Reduce MTU after 2 unsuccessful retransmissions */
256
223
  if (ssl->d1->num_timeouts > DTLS1_MTU_TIMEOUTS &&
257
224
  !(SSL_get_options(ssl) & SSL_OP_NO_QUERY_MTU)) {
258
- long mtu = BIO_ctrl(SSL_get_wbio(ssl), BIO_CTRL_DGRAM_GET_FALLBACK_MTU, 0,
259
- NULL);
225
+ long mtu = BIO_ctrl(ssl->wbio, BIO_CTRL_DGRAM_GET_FALLBACK_MTU, 0, NULL);
260
226
  if (mtu >= 0 && mtu <= (1 << 30) && (unsigned)mtu >= dtls1_min_mtu()) {
261
227
  ssl->d1->mtu = (unsigned)mtu;
262
228
  }
@@ -272,7 +238,11 @@ int dtls1_check_timeout_num(SSL *ssl) {
272
238
  }
273
239
 
274
240
  int DTLSv1_handle_timeout(SSL *ssl) {
275
- if (!SSL_IS_DTLS(ssl)) {
241
+ ssl->rwstate = SSL_NOTHING;
242
+ /* Functions which use SSL_get_error must clear the error queue on entry. */
243
+ ERR_clear_error();
244
+
245
+ if (!SSL_is_dtls(ssl)) {
276
246
  return -1;
277
247
  }
278
248
 
@@ -288,54 +258,13 @@ int DTLSv1_handle_timeout(SSL *ssl) {
288
258
  }
289
259
 
290
260
  dtls1_start_timer(ssl);
291
- return dtls1_retransmit_buffered_messages(ssl);
261
+ return dtls1_retransmit_outgoing_messages(ssl);
292
262
  }
293
263
 
294
- static void get_current_time(const SSL *ssl, struct timeval *out_clock) {
295
- if (ssl->ctx->current_time_cb != NULL) {
296
- ssl->ctx->current_time_cb(ssl, out_clock);
297
- return;
298
- }
299
-
300
- #if defined(OPENSSL_WINDOWS)
301
- struct _timeb time;
302
- _ftime(&time);
303
- out_clock->tv_sec = time.time;
304
- out_clock->tv_usec = time.millitm * 1000;
305
- #else
306
- gettimeofday(out_clock, NULL);
307
- #endif
308
- }
309
-
310
- int dtls1_set_handshake_header(SSL *ssl, int htype, unsigned long len) {
311
- uint8_t *message = (uint8_t *)ssl->init_buf->data;
312
- const struct hm_header_st *msg_hdr = &ssl->d1->w_msg_hdr;
313
- uint8_t serialised_header[DTLS1_HM_HEADER_LENGTH];
314
- uint8_t *p = serialised_header;
315
-
316
- ssl->d1->handshake_write_seq = ssl->d1->next_handshake_write_seq;
317
- ssl->d1->next_handshake_write_seq++;
318
-
319
- dtls1_set_message_header(ssl, htype, len, ssl->d1->handshake_write_seq, 0,
320
- len);
321
- ssl->init_num = (int)len + DTLS1_HM_HEADER_LENGTH;
322
- ssl->init_off = 0;
323
-
324
- /* Buffer the message to handle re-xmits */
325
- dtls1_buffer_message(ssl);
326
-
327
- /* Add the new message to the handshake hash. Serialize the message
328
- * header as if it were a single fragment. */
329
- *p++ = msg_hdr->type;
330
- l2n3(msg_hdr->msg_len, p);
331
- s2n(msg_hdr->seq, p);
332
- l2n3(0, p);
333
- l2n3(msg_hdr->msg_len, p);
334
- return ssl3_update_handshake_hash(ssl, serialised_header,
335
- sizeof(serialised_header)) &&
336
- ssl3_update_handshake_hash(ssl, message + DTLS1_HM_HEADER_LENGTH, len);
264
+ void dtls1_expect_flight(SSL *ssl) {
265
+ dtls1_start_timer(ssl);
337
266
  }
338
267
 
339
- int dtls1_handshake_write(SSL *ssl) {
340
- return dtls1_do_handshake_write(ssl, dtls1_use_current_epoch);
268
+ void dtls1_received_flight(SSL *ssl) {
269
+ dtls1_stop_timer(ssl);
341
270
  }
@@ -112,10 +112,11 @@
112
112
  #include <openssl/ssl.h>
113
113
 
114
114
  #include <assert.h>
115
- #include <stdio.h>
116
115
  #include <string.h>
117
116
 
117
+ #include <openssl/bio.h>
118
118
  #include <openssl/buf.h>
119
+ #include <openssl/bytestring.h>
119
120
  #include <openssl/mem.h>
120
121
  #include <openssl/evp.h>
121
122
  #include <openssl/err.h>
@@ -124,60 +125,71 @@
124
125
  #include "internal.h"
125
126
 
126
127
 
127
- static int do_dtls1_write(SSL *ssl, int type, const uint8_t *buf,
128
- unsigned int len, enum dtls1_use_epoch_t use_epoch);
129
-
130
- /* dtls1_get_record reads a new input record. On success, it places it in
131
- * |ssl->s3->rrec| and returns one. Otherwise it returns <= 0 on error or if
132
- * more data is needed. */
133
- static int dtls1_get_record(SSL *ssl) {
128
+ int dtls1_get_record(SSL *ssl) {
134
129
  again:
130
+ switch (ssl->s3->recv_shutdown) {
131
+ case ssl_shutdown_none:
132
+ break;
133
+ case ssl_shutdown_fatal_alert:
134
+ OPENSSL_PUT_ERROR(SSL, SSL_R_PROTOCOL_IS_SHUTDOWN);
135
+ return -1;
136
+ case ssl_shutdown_close_notify:
137
+ return 0;
138
+ }
139
+
135
140
  /* Read a new packet if there is no unconsumed one. */
136
141
  if (ssl_read_buffer_len(ssl) == 0) {
137
- int ret = ssl_read_buffer_extend_to(ssl, 0 /* unused */);
138
- if (ret <= 0) {
139
- return ret;
142
+ int read_ret = ssl_read_buffer_extend_to(ssl, 0 /* unused */);
143
+ if (read_ret < 0 && dtls1_is_timer_expired(ssl)) {
144
+ /* For blocking BIOs, retransmits must be handled internally. */
145
+ int timeout_ret = DTLSv1_handle_timeout(ssl);
146
+ if (timeout_ret <= 0) {
147
+ return timeout_ret;
148
+ }
149
+ goto again;
150
+ }
151
+ if (read_ret <= 0) {
152
+ return read_ret;
140
153
  }
141
154
  }
142
155
  assert(ssl_read_buffer_len(ssl) > 0);
143
156
 
144
- /* Ensure the packet is large enough to decrypt in-place. */
145
- if (ssl_read_buffer_len(ssl) < ssl_record_prefix_len(ssl)) {
146
- ssl_read_buffer_clear(ssl);
147
- goto again;
148
- }
149
-
150
- uint8_t *out = ssl_read_buffer(ssl) + ssl_record_prefix_len(ssl);
151
- size_t max_out = ssl_read_buffer_len(ssl) - ssl_record_prefix_len(ssl);
157
+ CBS body;
152
158
  uint8_t type, alert;
153
- size_t len, consumed;
154
- switch (dtls_open_record(ssl, &type, out, &len, &consumed, &alert, max_out,
155
- ssl_read_buffer(ssl), ssl_read_buffer_len(ssl))) {
156
- case ssl_open_record_success:
157
- ssl_read_buffer_consume(ssl, consumed);
159
+ size_t consumed;
160
+ enum ssl_open_record_t open_ret =
161
+ dtls_open_record(ssl, &type, &body, &consumed, &alert,
162
+ ssl_read_buffer(ssl), ssl_read_buffer_len(ssl));
163
+ ssl_read_buffer_consume(ssl, consumed);
164
+ switch (open_ret) {
165
+ case ssl_open_record_partial:
166
+ /* Impossible in DTLS. */
167
+ break;
158
168
 
159
- if (len > 0xffff) {
169
+ case ssl_open_record_success:
170
+ if (CBS_len(&body) > 0xffff) {
160
171
  OPENSSL_PUT_ERROR(SSL, ERR_R_OVERFLOW);
161
172
  return -1;
162
173
  }
163
174
 
164
175
  SSL3_RECORD *rr = &ssl->s3->rrec;
165
176
  rr->type = type;
166
- rr->length = (uint16_t)len;
167
- rr->data = out;
177
+ rr->length = (uint16_t)CBS_len(&body);
178
+ rr->data = (uint8_t *)CBS_data(&body);
168
179
  return 1;
169
180
 
170
181
  case ssl_open_record_discard:
171
- ssl_read_buffer_consume(ssl, consumed);
172
182
  goto again;
173
183
 
184
+ case ssl_open_record_close_notify:
185
+ return 0;
186
+
187
+ case ssl_open_record_fatal_alert:
188
+ return -1;
189
+
174
190
  case ssl_open_record_error:
175
191
  ssl3_send_alert(ssl, SSL3_AL_FATAL, alert);
176
192
  return -1;
177
-
178
- case ssl_open_record_partial:
179
- /* Impossible in DTLS. */
180
- break;
181
193
  }
182
194
 
183
195
  assert(0);
@@ -185,318 +197,167 @@ again:
185
197
  return -1;
186
198
  }
187
199
 
188
- int dtls1_read_app_data(SSL *ssl, uint8_t *buf, int len, int peek) {
189
- return dtls1_read_bytes(ssl, SSL3_RT_APPLICATION_DATA, buf, len, peek);
190
- }
191
-
192
- int dtls1_read_change_cipher_spec(SSL *ssl) {
193
- uint8_t byte;
194
- int ret = dtls1_read_bytes(ssl, SSL3_RT_CHANGE_CIPHER_SPEC, &byte,
195
- 1 /* len */, 0 /* no peek */);
196
- if (ret <= 0) {
197
- return ret;
198
- }
199
- assert(ret == 1);
200
+ int dtls1_read_app_data(SSL *ssl, int *out_got_handshake, uint8_t *buf, int len,
201
+ int peek) {
202
+ assert(!SSL_in_init(ssl));
200
203
 
201
- if (ssl->s3->rrec.length != 0 || byte != SSL3_MT_CCS) {
202
- OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_CHANGE_CIPHER_SPEC);
203
- ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
204
- return -1;
205
- }
204
+ *out_got_handshake = 0;
205
+ SSL3_RECORD *rr = &ssl->s3->rrec;
206
206
 
207
- if (ssl->msg_callback != NULL) {
208
- ssl->msg_callback(0, ssl->version, SSL3_RT_CHANGE_CIPHER_SPEC, &byte, 1,
209
- ssl, ssl->msg_callback_arg);
207
+ again:
208
+ if (rr->length == 0) {
209
+ int ret = dtls1_get_record(ssl);
210
+ if (ret <= 0) {
211
+ return ret;
212
+ }
210
213
  }
211
214
 
212
- return 1;
213
- }
215
+ if (rr->type == SSL3_RT_HANDSHAKE) {
216
+ /* Parse the first fragment header to determine if this is a pre-CCS or
217
+ * post-CCS handshake record. DTLS resets handshake message numbers on each
218
+ * handshake, so renegotiations and retransmissions are ambiguous. */
219
+ CBS cbs, body;
220
+ struct hm_header_st msg_hdr;
221
+ CBS_init(&cbs, rr->data, rr->length);
222
+ if (!dtls1_parse_fragment(&cbs, &msg_hdr, &body)) {
223
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
224
+ OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_HANDSHAKE_RECORD);
225
+ return -1;
226
+ }
214
227
 
215
- void dtls1_read_close_notify(SSL *ssl) {
216
- /* Bidirectional shutdown doesn't make sense for an unordered transport. DTLS
217
- * alerts also aren't delivered reliably, so we may even time out because the
218
- * peer never received our close_notify. Report to the caller that the channel
219
- * has fully shut down. */
220
- ssl->shutdown |= SSL_RECEIVED_SHUTDOWN;
221
- }
228
+ if (msg_hdr.type == SSL3_MT_FINISHED &&
229
+ msg_hdr.seq == ssl->d1->handshake_read_seq - 1) {
230
+ if (msg_hdr.frag_off == 0) {
231
+ /* Retransmit our last flight of messages. If the peer sends the second
232
+ * Finished, they may not have received ours. Only do this for the
233
+ * first fragment, in case the Finished was fragmented. */
234
+ if (dtls1_check_timeout_num(ssl) < 0) {
235
+ return -1;
236
+ }
222
237
 
223
- /* Return up to 'len' payload bytes received in 'type' records.
224
- * 'type' is one of the following:
225
- *
226
- * - SSL3_RT_HANDSHAKE (when dtls1_get_message calls us)
227
- * - SSL3_RT_CHANGE_CIPHER_SPEC (when dtls1_read_change_cipher_spec calls us)
228
- * - SSL3_RT_APPLICATION_DATA (when dtls1_read_app_data calls us)
229
- *
230
- * If we don't have stored data to work from, read a DTLS record first (possibly
231
- * multiple records if we still don't have anything to return).
232
- *
233
- * This function must handle any surprises the peer may have for us, such as
234
- * Alert records (e.g. close_notify) and out of records. */
235
- int dtls1_read_bytes(SSL *ssl, int type, unsigned char *buf, int len, int peek) {
236
- int al, i, ret;
237
- unsigned int n;
238
- SSL3_RECORD *rr;
239
- void (*cb)(const SSL *ssl, int type, int value) = NULL;
240
-
241
- if ((type != SSL3_RT_APPLICATION_DATA && type != SSL3_RT_HANDSHAKE &&
242
- type != SSL3_RT_CHANGE_CIPHER_SPEC) ||
243
- (peek && type != SSL3_RT_APPLICATION_DATA)) {
244
- OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
245
- return -1;
246
- }
238
+ dtls1_retransmit_outgoing_messages(ssl);
239
+ }
247
240
 
248
- if (!ssl->in_handshake && SSL_in_init(ssl)) {
249
- /* type == SSL3_RT_APPLICATION_DATA */
250
- i = ssl->handshake_func(ssl);
251
- if (i < 0) {
252
- return i;
253
- }
254
- if (i == 0) {
255
- OPENSSL_PUT_ERROR(SSL, SSL_R_SSL_HANDSHAKE_FAILURE);
256
- return -1;
241
+ rr->length = 0;
242
+ goto again;
257
243
  }
258
- }
259
-
260
- start:
261
- ssl->rwstate = SSL_NOTHING;
262
244
 
263
- /* ssl->s3->rrec.type - is the type of record
264
- * ssl->s3->rrec.data - data
265
- * ssl->s3->rrec.off - offset into 'data' for next read
266
- * ssl->s3->rrec.length - number of bytes. */
267
- rr = &ssl->s3->rrec;
245
+ /* Otherwise, this is a pre-CCS handshake message from an unsupported
246
+ * renegotiation attempt. Fall through to the error path. */
247
+ }
268
248
 
269
- /* Check for timeout */
270
- if (DTLSv1_handle_timeout(ssl) > 0) {
271
- goto start;
249
+ if (rr->type != SSL3_RT_APPLICATION_DATA) {
250
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
251
+ OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_RECORD);
252
+ return -1;
272
253
  }
273
254
 
274
- /* get new packet if necessary */
255
+ /* Discard empty records. */
275
256
  if (rr->length == 0) {
276
- ret = dtls1_get_record(ssl);
277
- if (ret <= 0) {
278
- ret = dtls1_read_failed(ssl, ret);
279
- /* anything other than a timeout is an error */
280
- if (ret <= 0) {
281
- return ret;
282
- } else {
283
- goto start;
284
- }
285
- }
257
+ goto again;
286
258
  }
287
259
 
288
- /* we now have a packet which can be read and processed */
289
-
290
- /* If the other end has shut down, throw anything we read away (even in
291
- * 'peek' mode) */
292
- if (ssl->shutdown & SSL_RECEIVED_SHUTDOWN) {
293
- rr->length = 0;
294
- ssl->rwstate = SSL_NOTHING;
295
- return 0;
260
+ if (len <= 0) {
261
+ return len;
296
262
  }
297
263
 
264
+ if ((unsigned)len > rr->length) {
265
+ len = rr->length;
266
+ }
298
267
 
299
- if (type == rr->type) {
300
- /* Make sure that we are not getting application data when we
301
- * are doing a handshake for the first time. */
302
- if (SSL_in_init(ssl) && (type == SSL3_RT_APPLICATION_DATA) &&
303
- (ssl->s3->aead_read_ctx == NULL)) {
304
- /* TODO(davidben): Is this check redundant with the handshake_func
305
- * check? */
306
- al = SSL_AD_UNEXPECTED_MESSAGE;
307
- OPENSSL_PUT_ERROR(SSL, SSL_R_APP_DATA_IN_HANDSHAKE);
308
- goto f_err;
309
- }
310
-
311
- /* Discard empty records. */
268
+ memcpy(buf, rr->data, len);
269
+ if (!peek) {
270
+ /* TODO(davidben): Should the record be truncated instead? This is a
271
+ * datagram transport. See https://crbug.com/boringssl/65. */
272
+ rr->length -= len;
273
+ rr->data += len;
312
274
  if (rr->length == 0) {
313
- goto start;
275
+ /* The record has been consumed, so we may now clear the buffer. */
276
+ ssl_read_buffer_discard(ssl);
314
277
  }
315
-
316
- if (len <= 0) {
317
- return len;
318
- }
319
-
320
- if ((unsigned int)len > rr->length) {
321
- n = rr->length;
322
- } else {
323
- n = (unsigned int)len;
324
- }
325
-
326
- memcpy(buf, rr->data, n);
327
- if (!peek) {
328
- rr->length -= n;
329
- rr->data += n;
330
- if (rr->length == 0) {
331
- /* The record has been consumed, so we may now clear the buffer. */
332
- ssl_read_buffer_discard(ssl);
333
- }
334
- }
335
-
336
- return n;
337
278
  }
338
279
 
339
- /* If we get here, then type != rr->type. */
340
-
341
- /* If an alert record, process one alert out of the record. Note that we allow
342
- * a single record to contain multiple alerts. */
343
- if (rr->type == SSL3_RT_ALERT) {
344
- /* Alerts may not be fragmented. */
345
- if (rr->length < 2) {
346
- al = SSL_AD_DECODE_ERROR;
347
- OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_ALERT);
348
- goto f_err;
349
- }
350
-
351
- if (ssl->msg_callback) {
352
- ssl->msg_callback(0, ssl->version, SSL3_RT_ALERT, rr->data, 2, ssl,
353
- ssl->msg_callback_arg);
354
- }
355
- const uint8_t alert_level = rr->data[0];
356
- const uint8_t alert_descr = rr->data[1];
357
- rr->length -= 2;
358
- rr->data += 2;
359
-
360
- if (ssl->info_callback != NULL) {
361
- cb = ssl->info_callback;
362
- } else if (ssl->ctx->info_callback != NULL) {
363
- cb = ssl->ctx->info_callback;
364
- }
280
+ return len;
281
+ }
365
282
 
366
- if (cb != NULL) {
367
- uint16_t alert = (alert_level << 8) | alert_descr;
368
- cb(ssl, SSL_CB_READ_ALERT, alert);
369
- }
283
+ int dtls1_read_change_cipher_spec(SSL *ssl) {
284
+ SSL3_RECORD *rr = &ssl->s3->rrec;
370
285
 
371
- if (alert_level == SSL3_AL_WARNING) {
372
- ssl->s3->warn_alert = alert_descr;
373
- if (alert_descr == SSL_AD_CLOSE_NOTIFY) {
374
- ssl->shutdown |= SSL_RECEIVED_SHUTDOWN;
375
- return 0;
376
- }
377
- } else if (alert_level == SSL3_AL_FATAL) {
378
- char tmp[16];
379
-
380
- ssl->rwstate = SSL_NOTHING;
381
- ssl->s3->fatal_alert = alert_descr;
382
- OPENSSL_PUT_ERROR(SSL, SSL_AD_REASON_OFFSET + alert_descr);
383
- BIO_snprintf(tmp, sizeof tmp, "%d", alert_descr);
384
- ERR_add_error_data(2, "SSL alert number ", tmp);
385
- ssl->shutdown |= SSL_RECEIVED_SHUTDOWN;
386
- SSL_CTX_remove_session(ssl->ctx, ssl->session);
387
- return 0;
388
- } else {
389
- al = SSL_AD_ILLEGAL_PARAMETER;
390
- OPENSSL_PUT_ERROR(SSL, SSL_R_UNKNOWN_ALERT_TYPE);
391
- goto f_err;
286
+ again:
287
+ if (rr->length == 0) {
288
+ int ret = dtls1_get_record(ssl);
289
+ if (ret <= 0) {
290
+ return ret;
392
291
  }
393
-
394
- goto start;
395
292
  }
396
293
 
397
- /* Cross-epoch records are discarded, but we may receive out-of-order
398
- * application data between ChangeCipherSpec and Finished or a ChangeCipherSpec
399
- * before the appropriate point in the handshake. Those must be silently
400
- * discarded.
401
- *
402
- * However, only allow the out-of-order records in the correct epoch.
403
- * Application data must come in the encrypted epoch, and ChangeCipherSpec in
404
- * the unencrypted epoch (we never renegotiate). Other cases fall through and
405
- * fail with a fatal error. */
406
- if ((rr->type == SSL3_RT_APPLICATION_DATA &&
407
- ssl->s3->aead_read_ctx != NULL) ||
408
- (rr->type == SSL3_RT_CHANGE_CIPHER_SPEC &&
409
- ssl->s3->aead_read_ctx == NULL)) {
294
+ /* Drop handshake records silently. The epochs match, so this must be a
295
+ * retransmit of a message we already received. */
296
+ if (rr->type == SSL3_RT_HANDSHAKE) {
410
297
  rr->length = 0;
411
- goto start;
298
+ goto again;
412
299
  }
413
300
 
414
- if (rr->type == SSL3_RT_HANDSHAKE) {
415
- if (type != SSL3_RT_APPLICATION_DATA) {
416
- /* Out-of-order handshake record while looking for ChangeCipherSpec. Drop
417
- * it silently. */
418
- assert(type == SSL3_RT_CHANGE_CIPHER_SPEC);
419
- rr->length = 0;
420
- goto start;
421
- }
422
-
423
- /* Parse the first fragment header to determine if this is a pre-CCS or
424
- * post-CCS handshake record. DTLS resets handshake message numbers on each
425
- * handshake, so renegotiations and retransmissions are ambiguous. */
426
- if (rr->length < DTLS1_HM_HEADER_LENGTH) {
427
- al = SSL_AD_DECODE_ERROR;
428
- OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_HANDSHAKE_RECORD);
429
- goto f_err;
430
- }
431
- struct hm_header_st msg_hdr;
432
- dtls1_get_message_header(rr->data, &msg_hdr);
301
+ /* Other record types are illegal in this epoch. Note all application data
302
+ * records come in the encrypted epoch. */
303
+ if (rr->type != SSL3_RT_CHANGE_CIPHER_SPEC) {
304
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
305
+ OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_RECORD);
306
+ return -1;
307
+ }
433
308
 
434
- if (msg_hdr.type == SSL3_MT_FINISHED) {
435
- if (msg_hdr.frag_off == 0) {
436
- /* Retransmit our last flight of messages. If the peer sends the second
437
- * Finished, they may not have received ours. Only do this for the
438
- * first fragment, in case the Finished was fragmented. */
439
- if (dtls1_check_timeout_num(ssl) < 0) {
440
- return -1;
441
- }
309
+ if (rr->length != 1 || rr->data[0] != SSL3_MT_CCS) {
310
+ OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_CHANGE_CIPHER_SPEC);
311
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
312
+ return -1;
313
+ }
442
314
 
443
- dtls1_retransmit_buffered_messages(ssl);
444
- }
315
+ ssl_do_msg_callback(ssl, 0 /* read */, SSL3_RT_CHANGE_CIPHER_SPEC, rr->data,
316
+ rr->length);
445
317
 
446
- rr->length = 0;
447
- goto start;
448
- }
318
+ rr->length = 0;
319
+ ssl_read_buffer_discard(ssl);
320
+ return 1;
321
+ }
449
322
 
450
- /* Otherwise, this is a pre-CCS handshake message from an unsupported
451
- * renegotiation attempt. Fall through to the error path. */
323
+ void dtls1_read_close_notify(SSL *ssl) {
324
+ /* Bidirectional shutdown doesn't make sense for an unordered transport. DTLS
325
+ * alerts also aren't delivered reliably, so we may even time out because the
326
+ * peer never received our close_notify. Report to the caller that the channel
327
+ * has fully shut down. */
328
+ if (ssl->s3->recv_shutdown == ssl_shutdown_none) {
329
+ ssl->s3->recv_shutdown = ssl_shutdown_close_notify;
452
330
  }
453
-
454
- al = SSL_AD_UNEXPECTED_MESSAGE;
455
- OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_RECORD);
456
-
457
- f_err:
458
- ssl3_send_alert(ssl, SSL3_AL_FATAL, al);
459
- return -1;
460
331
  }
461
332
 
462
333
  int dtls1_write_app_data(SSL *ssl, const void *buf_, int len) {
463
- int i;
464
-
465
- if (SSL_in_init(ssl) && !ssl->in_handshake) {
466
- i = ssl->handshake_func(ssl);
467
- if (i < 0) {
468
- return i;
469
- }
470
- if (i == 0) {
471
- OPENSSL_PUT_ERROR(SSL, SSL_R_SSL_HANDSHAKE_FAILURE);
472
- return -1;
473
- }
474
- }
334
+ assert(!SSL_in_init(ssl));
475
335
 
476
336
  if (len > SSL3_RT_MAX_PLAIN_LENGTH) {
477
337
  OPENSSL_PUT_ERROR(SSL, SSL_R_DTLS_MESSAGE_TOO_BIG);
478
338
  return -1;
479
339
  }
480
340
 
481
- i = dtls1_write_bytes(ssl, SSL3_RT_APPLICATION_DATA, buf_, len,
482
- dtls1_use_current_epoch);
483
- return i;
484
- }
341
+ if (len < 0) {
342
+ OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_LENGTH);
343
+ return -1;
344
+ }
485
345
 
486
- /* Call this to write data in records of type 'type' It will return <= 0 if not
487
- * all data has been sent or non-blocking IO. */
488
- int dtls1_write_bytes(SSL *ssl, int type, const void *buf, int len,
489
- enum dtls1_use_epoch_t use_epoch) {
490
- int i;
346
+ if (len == 0) {
347
+ return 0;
348
+ }
491
349
 
492
- assert(len <= SSL3_RT_MAX_PLAIN_LENGTH);
493
- ssl->rwstate = SSL_NOTHING;
494
- i = do_dtls1_write(ssl, type, buf, len, use_epoch);
495
- return i;
350
+ int ret = dtls1_write_record(ssl, SSL3_RT_APPLICATION_DATA, buf_, (size_t)len,
351
+ dtls1_use_current_epoch);
352
+ if (ret <= 0) {
353
+ return ret;
354
+ }
355
+ return len;
496
356
  }
497
357
 
498
- static int do_dtls1_write(SSL *ssl, int type, const uint8_t *buf,
499
- unsigned int len, enum dtls1_use_epoch_t use_epoch) {
358
+ int dtls1_write_record(SSL *ssl, int type, const uint8_t *buf, size_t len,
359
+ enum dtls1_use_epoch_t use_epoch) {
360
+ assert(len <= SSL3_RT_MAX_PLAIN_LENGTH);
500
361
  /* There should never be a pending write buffer in DTLS. One can't write half
501
362
  * a datagram, so the write buffer is always dropped in
502
363
  * |ssl_write_buffer_flush|. */
@@ -504,7 +365,7 @@ static int do_dtls1_write(SSL *ssl, int type, const uint8_t *buf,
504
365
 
505
366
  /* If we have an alert to send, lets send it */
506
367
  if (ssl->s3->alert_dispatch) {
507
- int ret = ssl->method->ssl_dispatch_alert(ssl);
368
+ int ret = ssl->method->dispatch_alert(ssl);
508
369
  if (ret <= 0) {
509
370
  return ret;
510
371
  }
@@ -516,10 +377,6 @@ static int do_dtls1_write(SSL *ssl, int type, const uint8_t *buf,
516
377
  return -1;
517
378
  }
518
379
 
519
- if (len == 0) {
520
- return 0;
521
- }
522
-
523
380
  size_t max_out = len + ssl_max_seal_overhead(ssl);
524
381
  uint8_t *out;
525
382
  size_t ciphertext_len;
@@ -535,46 +392,28 @@ static int do_dtls1_write(SSL *ssl, int type, const uint8_t *buf,
535
392
  if (ret <= 0) {
536
393
  return ret;
537
394
  }
538
- return (int)len;
395
+ return 1;
539
396
  }
540
397
 
541
398
  int dtls1_dispatch_alert(SSL *ssl) {
542
- int i, j;
543
- void (*cb)(const SSL *ssl, int type, int value) = NULL;
544
- uint8_t buf[DTLS1_AL_HEADER_LENGTH];
545
- uint8_t *ptr = &buf[0];
546
-
547
399
  ssl->s3->alert_dispatch = 0;
548
-
549
- memset(buf, 0x00, sizeof(buf));
550
- *ptr++ = ssl->s3->send_alert[0];
551
- *ptr++ = ssl->s3->send_alert[1];
552
-
553
- i = do_dtls1_write(ssl, SSL3_RT_ALERT, &buf[0], sizeof(buf),
554
- dtls1_use_current_epoch);
555
- if (i <= 0) {
400
+ int ret = dtls1_write_record(ssl, SSL3_RT_ALERT, &ssl->s3->send_alert[0], 2,
401
+ dtls1_use_current_epoch);
402
+ if (ret <= 0) {
556
403
  ssl->s3->alert_dispatch = 1;
557
- } else {
558
- if (ssl->s3->send_alert[0] == SSL3_AL_FATAL) {
559
- (void)BIO_flush(ssl->wbio);
560
- }
404
+ return ret;
405
+ }
561
406
 
562
- if (ssl->msg_callback) {
563
- ssl->msg_callback(1, ssl->version, SSL3_RT_ALERT, ssl->s3->send_alert, 2,
564
- ssl, ssl->msg_callback_arg);
565
- }
407
+ /* If the alert is fatal, flush the BIO now. */
408
+ if (ssl->s3->send_alert[0] == SSL3_AL_FATAL) {
409
+ BIO_flush(ssl->wbio);
410
+ }
566
411
 
567
- if (ssl->info_callback != NULL) {
568
- cb = ssl->info_callback;
569
- } else if (ssl->ctx->info_callback != NULL) {
570
- cb = ssl->ctx->info_callback;
571
- }
412
+ ssl_do_msg_callback(ssl, 1 /* write */, SSL3_RT_ALERT, ssl->s3->send_alert,
413
+ 2);
572
414
 
573
- if (cb != NULL) {
574
- j = (ssl->s3->send_alert[0] << 8) | ssl->s3->send_alert[1];
575
- cb(ssl, SSL_CB_WRITE_ALERT, j);
576
- }
577
- }
415
+ int alert = (ssl->s3->send_alert[0] << 8) | ssl->s3->send_alert[1];
416
+ ssl_do_info_callback(ssl, SSL_CB_WRITE_ALERT, alert);
578
417
 
579
- return i;
418
+ return 1;
580
419
  }