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
@@ -114,15 +114,15 @@
114
114
 
115
115
  #include <assert.h>
116
116
  #include <limits.h>
117
- #include <stdio.h>
118
117
  #include <string.h>
119
118
 
120
119
  #include <openssl/buf.h>
120
+ #include <openssl/bytestring.h>
121
121
  #include <openssl/err.h>
122
122
  #include <openssl/evp.h>
123
123
  #include <openssl/mem.h>
124
124
  #include <openssl/md5.h>
125
- #include <openssl/obj.h>
125
+ #include <openssl/nid.h>
126
126
  #include <openssl/rand.h>
127
127
  #include <openssl/sha.h>
128
128
  #include <openssl/x509.h>
@@ -130,73 +130,148 @@
130
130
  #include "internal.h"
131
131
 
132
132
 
133
+ SSL_HANDSHAKE *ssl_handshake_new(enum ssl_hs_wait_t (*do_handshake)(SSL *ssl)) {
134
+ SSL_HANDSHAKE *hs = OPENSSL_malloc(sizeof(SSL_HANDSHAKE));
135
+ if (hs == NULL) {
136
+ OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
137
+ return NULL;
138
+ }
139
+ memset(hs, 0, sizeof(SSL_HANDSHAKE));
140
+ hs->do_handshake = do_handshake;
141
+ hs->wait = ssl_hs_ok;
142
+ return hs;
143
+ }
144
+
145
+ void ssl_handshake_free(SSL_HANDSHAKE *hs) {
146
+ if (hs == NULL) {
147
+ return;
148
+ }
149
+
150
+ OPENSSL_cleanse(hs->secret, sizeof(hs->secret));
151
+ OPENSSL_cleanse(hs->traffic_secret_0, sizeof(hs->traffic_secret_0));
152
+ SSL_ECDH_CTX_cleanup(&hs->ecdh_ctx);
153
+ OPENSSL_free(hs->key_share_bytes);
154
+ OPENSSL_free(hs->public_key);
155
+ OPENSSL_free(hs->peer_sigalgs);
156
+ OPENSSL_free(hs->peer_psk_identity_hint);
157
+ OPENSSL_free(hs);
158
+ }
159
+
133
160
  /* ssl3_do_write sends |ssl->init_buf| in records of type 'type'
134
- * (SSL3_RT_HANDSHAKE or SSL3_RT_CHANGE_CIPHER_SPEC). It returns -1 on error, 1
135
- * on success or zero if the transmission is still incomplete. */
136
- int ssl3_do_write(SSL *ssl, int type) {
137
- int n;
138
-
139
- n = ssl3_write_bytes(ssl, type, &ssl->init_buf->data[ssl->init_off],
140
- ssl->init_num);
141
- if (n < 0) {
142
- return -1;
161
+ * (SSL3_RT_HANDSHAKE or SSL3_RT_CHANGE_CIPHER_SPEC). It returns 1 on success
162
+ * and <= 0 on error. */
163
+ static int ssl3_do_write(SSL *ssl, int type, const uint8_t *data, size_t len) {
164
+ int ret = ssl3_write_bytes(ssl, type, data, len);
165
+ if (ret <= 0) {
166
+ return ret;
143
167
  }
144
168
 
145
- if (n == ssl->init_num) {
146
- if (ssl->msg_callback) {
147
- ssl->msg_callback(1, ssl->version, type, ssl->init_buf->data,
148
- (size_t)(ssl->init_off + ssl->init_num), ssl,
149
- ssl->msg_callback_arg);
150
- }
151
- return 1;
169
+ /* ssl3_write_bytes writes the data in its entirety. */
170
+ assert((size_t)ret == len);
171
+ ssl_do_msg_callback(ssl, 1 /* write */, type, data, len);
172
+ return 1;
173
+ }
174
+
175
+ int ssl3_init_message(SSL *ssl, CBB *cbb, CBB *body, uint8_t type) {
176
+ CBB_zero(cbb);
177
+ if (ssl->s3->pending_message != NULL) {
178
+ OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
179
+ return 0;
152
180
  }
153
181
 
154
- ssl->init_off += n;
155
- ssl->init_num -= n;
156
- return 0;
182
+ /* Pick a modest size hint to save most of the |realloc| calls. */
183
+ if (!CBB_init(cbb, 64) ||
184
+ !CBB_add_u8(cbb, type) ||
185
+ !CBB_add_u24_length_prefixed(cbb, body)) {
186
+ OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
187
+ return 0;
188
+ }
189
+
190
+ return 1;
191
+ }
192
+
193
+ int ssl3_finish_message(SSL *ssl, CBB *cbb) {
194
+ if (ssl->s3->pending_message != NULL) {
195
+ OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
196
+ return 0;
197
+ }
198
+
199
+ uint8_t *msg = NULL;
200
+ size_t len;
201
+ if (!CBB_finish(cbb, &msg, &len) ||
202
+ len > 0xffffffffu) {
203
+ OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
204
+ OPENSSL_free(msg);
205
+ return 0;
206
+ }
207
+
208
+ ssl3_update_handshake_hash(ssl, msg, len);
209
+
210
+ ssl->s3->pending_message = msg;
211
+ ssl->s3->pending_message_len = (uint32_t)len;
212
+ return 1;
213
+ }
214
+
215
+ int ssl3_write_message(SSL *ssl) {
216
+ if (ssl->s3->pending_message == NULL) {
217
+ OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
218
+ return 0;
219
+ }
220
+
221
+ int ret = ssl3_do_write(ssl, SSL3_RT_HANDSHAKE, ssl->s3->pending_message,
222
+ ssl->s3->pending_message_len);
223
+ if (ret <= 0) {
224
+ return ret;
225
+ }
226
+
227
+ OPENSSL_free(ssl->s3->pending_message);
228
+ ssl->s3->pending_message = NULL;
229
+ ssl->s3->pending_message_len = 0;
230
+ return 1;
157
231
  }
158
232
 
159
233
  int ssl3_send_finished(SSL *ssl, int a, int b) {
160
- uint8_t *p;
161
- int n;
234
+ if (ssl->state == b) {
235
+ return ssl->method->write_message(ssl);
236
+ }
162
237
 
163
- if (ssl->state == a) {
164
- p = ssl_handshake_start(ssl);
238
+ int n = ssl->s3->enc_method->final_finish_mac(ssl, ssl->server,
239
+ ssl->s3->tmp.finish_md);
240
+ if (n == 0) {
241
+ return 0;
242
+ }
243
+ ssl->s3->tmp.finish_md_len = n;
165
244
 
166
- n = ssl->s3->enc_method->final_finish_mac(ssl, ssl->server,
167
- ssl->s3->tmp.finish_md);
168
- if (n == 0) {
169
- return 0;
170
- }
171
- ssl->s3->tmp.finish_md_len = n;
172
- memcpy(p, ssl->s3->tmp.finish_md, n);
173
-
174
- /* Log the master secret, if logging is enabled. */
175
- if (!ssl_log_master_secret(ssl, ssl->s3->client_random, SSL3_RANDOM_SIZE,
176
- ssl->session->master_key,
177
- ssl->session->master_key_length)) {
178
- return 0;
179
- }
245
+ /* Log the master secret, if logging is enabled. */
246
+ if (!ssl_log_secret(ssl, "CLIENT_RANDOM",
247
+ SSL_get_session(ssl)->master_key,
248
+ SSL_get_session(ssl)->master_key_length)) {
249
+ return 0;
250
+ }
180
251
 
181
- /* Copy the finished so we can use it for renegotiation checks */
182
- if (ssl->server) {
183
- assert(n <= EVP_MAX_MD_SIZE);
184
- memcpy(ssl->s3->previous_server_finished, ssl->s3->tmp.finish_md, n);
185
- ssl->s3->previous_server_finished_len = n;
186
- } else {
187
- assert(n <= EVP_MAX_MD_SIZE);
188
- memcpy(ssl->s3->previous_client_finished, ssl->s3->tmp.finish_md, n);
189
- ssl->s3->previous_client_finished_len = n;
190
- }
252
+ /* Copy the finished so we can use it for renegotiation checks */
253
+ if (ssl->server) {
254
+ assert(n <= EVP_MAX_MD_SIZE);
255
+ memcpy(ssl->s3->previous_server_finished, ssl->s3->tmp.finish_md, n);
256
+ ssl->s3->previous_server_finished_len = n;
257
+ } else {
258
+ assert(n <= EVP_MAX_MD_SIZE);
259
+ memcpy(ssl->s3->previous_client_finished, ssl->s3->tmp.finish_md, n);
260
+ ssl->s3->previous_client_finished_len = n;
261
+ }
191
262
 
192
- if (!ssl_set_handshake_header(ssl, SSL3_MT_FINISHED, n)) {
193
- return 0;
194
- }
195
- ssl->state = b;
263
+ CBB cbb, body;
264
+ if (!ssl->method->init_message(ssl, &cbb, &body, SSL3_MT_FINISHED) ||
265
+ !CBB_add_bytes(&body, ssl->s3->tmp.finish_md,
266
+ ssl->s3->tmp.finish_md_len) ||
267
+ !ssl->method->finish_message(ssl, &cbb)) {
268
+ OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
269
+ CBB_cleanup(&cbb);
270
+ return -1;
196
271
  }
197
272
 
198
- /* SSL3_ST_SEND_xxxxxx_HELLO_B */
199
- return ssl_do_write(ssl);
273
+ ssl->state = b;
274
+ return ssl->method->write_message(ssl);
200
275
  }
201
276
 
202
277
  /* ssl3_take_mac calculates the Finished MAC for the handshakes messages seen
@@ -212,34 +287,29 @@ static void ssl3_take_mac(SSL *ssl) {
212
287
  ssl, !ssl->server, ssl->s3->tmp.peer_finish_md);
213
288
  }
214
289
 
215
- int ssl3_get_finished(SSL *ssl, int a, int b) {
216
- int al, finished_len, ok;
217
- long message_len;
218
- uint8_t *p;
219
-
220
- message_len = ssl->method->ssl_get_message(
221
- ssl, a, b, SSL3_MT_FINISHED, EVP_MAX_MD_SIZE, ssl_dont_hash_message, &ok);
222
-
223
- if (!ok) {
224
- return message_len;
290
+ int ssl3_get_finished(SSL *ssl) {
291
+ int al;
292
+ int ret = ssl->method->ssl_get_message(ssl, SSL3_MT_FINISHED,
293
+ ssl_dont_hash_message);
294
+ if (ret <= 0) {
295
+ return ret;
225
296
  }
226
297
 
227
298
  /* Snapshot the finished hash before incorporating the new message. */
228
299
  ssl3_take_mac(ssl);
229
- if (!ssl3_hash_current_message(ssl)) {
300
+ if (!ssl->method->hash_current_message(ssl)) {
230
301
  goto err;
231
302
  }
232
303
 
233
- p = ssl->init_msg;
234
- finished_len = ssl->s3->tmp.peer_finish_md_len;
304
+ size_t finished_len = ssl->s3->tmp.peer_finish_md_len;
235
305
 
236
- if (finished_len != message_len) {
237
- al = SSL_AD_DECODE_ERROR;
238
- OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_DIGEST_LENGTH);
239
- goto f_err;
240
- }
241
-
242
- if (CRYPTO_memcmp(p, ssl->s3->tmp.peer_finish_md, finished_len) != 0) {
306
+ int finished_ok = ssl->init_num == finished_len &&
307
+ CRYPTO_memcmp(ssl->init_msg, ssl->s3->tmp.peer_finish_md,
308
+ finished_len) == 0;
309
+ #if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
310
+ finished_ok = 1;
311
+ #endif
312
+ if (!finished_ok) {
243
313
  al = SSL_AD_DECRYPT_ERROR;
244
314
  OPENSSL_PUT_ERROR(SSL, SSL_R_DIGEST_CHECK_FAILED);
245
315
  goto f_err;
@@ -266,208 +336,338 @@ err:
266
336
  return 0;
267
337
  }
268
338
 
269
- int ssl3_send_change_cipher_spec(SSL *ssl, int a, int b) {
270
- if (ssl->state == a) {
271
- *((uint8_t *)ssl->init_buf->data) = SSL3_MT_CCS;
272
- ssl->init_num = 1;
273
- ssl->init_off = 0;
339
+ int ssl3_send_change_cipher_spec(SSL *ssl) {
340
+ static const uint8_t kChangeCipherSpec[1] = {SSL3_MT_CCS};
341
+
342
+ return ssl3_do_write(ssl, SSL3_RT_CHANGE_CIPHER_SPEC, kChangeCipherSpec,
343
+ sizeof(kChangeCipherSpec));
344
+ }
274
345
 
275
- ssl->state = b;
346
+ int ssl3_output_cert_chain(SSL *ssl) {
347
+ CBB cbb, body;
348
+ if (!ssl->method->init_message(ssl, &cbb, &body, SSL3_MT_CERTIFICATE) ||
349
+ !ssl_add_cert_chain(ssl, &body) ||
350
+ !ssl->method->finish_message(ssl, &cbb)) {
351
+ OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
352
+ CBB_cleanup(&cbb);
353
+ return 0;
276
354
  }
277
355
 
278
- /* SSL3_ST_CW_CHANGE_B */
279
- return ssl3_do_write(ssl, SSL3_RT_CHANGE_CIPHER_SPEC);
356
+ return 1;
280
357
  }
281
358
 
282
- int ssl3_output_cert_chain(SSL *ssl) {
283
- uint8_t *p;
284
- unsigned long l = 3 + SSL_HM_HEADER_LENGTH(ssl);
359
+ size_t ssl_max_handshake_message_len(const SSL *ssl) {
360
+ /* kMaxMessageLen is the default maximum message size for handshakes which do
361
+ * not accept peer certificate chains. */
362
+ static const size_t kMaxMessageLen = 16384;
363
+
364
+ if (SSL_in_init(ssl)) {
365
+ if ((!ssl->server || (ssl->verify_mode & SSL_VERIFY_PEER)) &&
366
+ kMaxMessageLen < ssl->max_cert_list) {
367
+ return ssl->max_cert_list;
368
+ }
369
+ return kMaxMessageLen;
370
+ }
371
+
372
+ if (ssl3_protocol_version(ssl) < TLS1_3_VERSION) {
373
+ /* In TLS 1.2 and below, the largest acceptable post-handshake message is
374
+ * a HelloRequest. */
375
+ return 0;
376
+ }
285
377
 
286
- if (!ssl_add_cert_chain(ssl, &l)) {
378
+ if (ssl->server) {
379
+ /* The largest acceptable post-handshake message for a server is a
380
+ * KeyUpdate. We will never initiate post-handshake auth. */
287
381
  return 0;
288
382
  }
289
383
 
290
- l -= 3 + SSL_HM_HEADER_LENGTH(ssl);
291
- p = ssl_handshake_start(ssl);
292
- l2n3(l, p);
293
- l += 3;
294
- return ssl_set_handshake_header(ssl, SSL3_MT_CERTIFICATE, l);
384
+ /* Clients must accept NewSessionTicket and CertificateRequest, so allow the
385
+ * default size. */
386
+ return kMaxMessageLen;
295
387
  }
296
388
 
297
- /* Obtain handshake message of message type |msg_type| (any if |msg_type| == -1),
298
- * maximum acceptable body length |max|. The first four bytes (msg_type and
299
- * length) are read in state |header_state|, the body is read in state
300
- * |body_state|. */
301
- long ssl3_get_message(SSL *ssl, int header_state, int body_state, int msg_type,
302
- long max, enum ssl_hash_message_t hash_message, int *ok) {
303
- uint8_t *p;
304
- unsigned long l;
305
- long n;
306
- int al;
389
+ static int extend_handshake_buffer(SSL *ssl, size_t length) {
390
+ if (!BUF_MEM_reserve(ssl->init_buf, length)) {
391
+ return -1;
392
+ }
393
+ while (ssl->init_buf->length < length) {
394
+ int ret = ssl3_read_handshake_bytes(
395
+ ssl, (uint8_t *)ssl->init_buf->data + ssl->init_buf->length,
396
+ length - ssl->init_buf->length);
397
+ if (ret <= 0) {
398
+ return ret;
399
+ }
400
+ ssl->init_buf->length += (size_t)ret;
401
+ }
402
+ return 1;
403
+ }
404
+
405
+ static int read_v2_client_hello(SSL *ssl, int *out_is_v2_client_hello) {
406
+ /* Read the first 5 bytes, the size of the TLS record header. This is
407
+ * sufficient to detect a V2ClientHello and ensures that we never read beyond
408
+ * the first record. */
409
+ int ret = ssl_read_buffer_extend_to(ssl, SSL3_RT_HEADER_LENGTH);
410
+ if (ret <= 0) {
411
+ return ret;
412
+ }
413
+ const uint8_t *p = ssl_read_buffer(ssl);
414
+
415
+ /* Some dedicated error codes for protocol mixups should the application wish
416
+ * to interpret them differently. (These do not overlap with ClientHello or
417
+ * V2ClientHello.) */
418
+ if (strncmp("GET ", (const char *)p, 4) == 0 ||
419
+ strncmp("POST ", (const char *)p, 5) == 0 ||
420
+ strncmp("HEAD ", (const char *)p, 5) == 0 ||
421
+ strncmp("PUT ", (const char *)p, 4) == 0) {
422
+ OPENSSL_PUT_ERROR(SSL, SSL_R_HTTP_REQUEST);
423
+ return -1;
424
+ }
425
+ if (strncmp("CONNE", (const char *)p, 5) == 0) {
426
+ OPENSSL_PUT_ERROR(SSL, SSL_R_HTTPS_PROXY_REQUEST);
427
+ return -1;
428
+ }
429
+
430
+ if ((p[0] & 0x80) == 0 || p[2] != SSL2_MT_CLIENT_HELLO ||
431
+ p[3] != SSL3_VERSION_MAJOR) {
432
+ /* Not a V2ClientHello. */
433
+ *out_is_v2_client_hello = 0;
434
+ return 1;
435
+ }
436
+
437
+ /* Determine the length of the V2ClientHello. */
438
+ size_t msg_length = ((p[0] & 0x7f) << 8) | p[1];
439
+ if (msg_length > (1024 * 4)) {
440
+ OPENSSL_PUT_ERROR(SSL, SSL_R_RECORD_TOO_LARGE);
441
+ return -1;
442
+ }
443
+ if (msg_length < SSL3_RT_HEADER_LENGTH - 2) {
444
+ /* Reject lengths that are too short early. We have already read
445
+ * |SSL3_RT_HEADER_LENGTH| bytes, so we should not attempt to process an
446
+ * (invalid) V2ClientHello which would be shorter than that. */
447
+ OPENSSL_PUT_ERROR(SSL, SSL_R_RECORD_LENGTH_MISMATCH);
448
+ return -1;
449
+ }
450
+
451
+ /* Read the remainder of the V2ClientHello. */
452
+ ret = ssl_read_buffer_extend_to(ssl, 2 + msg_length);
453
+ if (ret <= 0) {
454
+ return ret;
455
+ }
456
+
457
+ CBS v2_client_hello;
458
+ CBS_init(&v2_client_hello, ssl_read_buffer(ssl) + 2, msg_length);
459
+
460
+ /* The V2ClientHello without the length is incorporated into the handshake
461
+ * hash. */
462
+ if (!ssl3_update_handshake_hash(ssl, CBS_data(&v2_client_hello),
463
+ CBS_len(&v2_client_hello))) {
464
+ return -1;
465
+ }
466
+
467
+ ssl_do_msg_callback(ssl, 0 /* read */, 0 /* V2ClientHello */,
468
+ CBS_data(&v2_client_hello), CBS_len(&v2_client_hello));
469
+
470
+ uint8_t msg_type;
471
+ uint16_t version, cipher_spec_length, session_id_length, challenge_length;
472
+ CBS cipher_specs, session_id, challenge;
473
+ if (!CBS_get_u8(&v2_client_hello, &msg_type) ||
474
+ !CBS_get_u16(&v2_client_hello, &version) ||
475
+ !CBS_get_u16(&v2_client_hello, &cipher_spec_length) ||
476
+ !CBS_get_u16(&v2_client_hello, &session_id_length) ||
477
+ !CBS_get_u16(&v2_client_hello, &challenge_length) ||
478
+ !CBS_get_bytes(&v2_client_hello, &cipher_specs, cipher_spec_length) ||
479
+ !CBS_get_bytes(&v2_client_hello, &session_id, session_id_length) ||
480
+ !CBS_get_bytes(&v2_client_hello, &challenge, challenge_length) ||
481
+ CBS_len(&v2_client_hello) != 0) {
482
+ OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
483
+ return -1;
484
+ }
485
+
486
+ /* msg_type has already been checked. */
487
+ assert(msg_type == SSL2_MT_CLIENT_HELLO);
488
+
489
+ /* The client_random is the V2ClientHello challenge. Truncate or
490
+ * left-pad with zeros as needed. */
491
+ size_t rand_len = CBS_len(&challenge);
492
+ if (rand_len > SSL3_RANDOM_SIZE) {
493
+ rand_len = SSL3_RANDOM_SIZE;
494
+ }
495
+ uint8_t random[SSL3_RANDOM_SIZE];
496
+ memset(random, 0, SSL3_RANDOM_SIZE);
497
+ memcpy(random + (SSL3_RANDOM_SIZE - rand_len), CBS_data(&challenge),
498
+ rand_len);
499
+
500
+ /* Write out an equivalent SSLv3 ClientHello. */
501
+ size_t max_v3_client_hello = SSL3_HM_HEADER_LENGTH + 2 /* version */ +
502
+ SSL3_RANDOM_SIZE + 1 /* session ID length */ +
503
+ 2 /* cipher list length */ +
504
+ CBS_len(&cipher_specs) / 3 * 2 +
505
+ 1 /* compression length */ + 1 /* compression */;
506
+ CBB client_hello, hello_body, cipher_suites;
507
+ CBB_zero(&client_hello);
508
+ if (!BUF_MEM_reserve(ssl->init_buf, max_v3_client_hello) ||
509
+ !CBB_init_fixed(&client_hello, (uint8_t *)ssl->init_buf->data,
510
+ ssl->init_buf->max) ||
511
+ !CBB_add_u8(&client_hello, SSL3_MT_CLIENT_HELLO) ||
512
+ !CBB_add_u24_length_prefixed(&client_hello, &hello_body) ||
513
+ !CBB_add_u16(&hello_body, version) ||
514
+ !CBB_add_bytes(&hello_body, random, SSL3_RANDOM_SIZE) ||
515
+ /* No session id. */
516
+ !CBB_add_u8(&hello_body, 0) ||
517
+ !CBB_add_u16_length_prefixed(&hello_body, &cipher_suites)) {
518
+ CBB_cleanup(&client_hello);
519
+ OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
520
+ return -1;
521
+ }
522
+
523
+ /* Copy the cipher suites. */
524
+ while (CBS_len(&cipher_specs) > 0) {
525
+ uint32_t cipher_spec;
526
+ if (!CBS_get_u24(&cipher_specs, &cipher_spec)) {
527
+ CBB_cleanup(&client_hello);
528
+ OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
529
+ return -1;
530
+ }
531
+
532
+ /* Skip SSLv2 ciphers. */
533
+ if ((cipher_spec & 0xff0000) != 0) {
534
+ continue;
535
+ }
536
+ if (!CBB_add_u16(&cipher_suites, cipher_spec)) {
537
+ CBB_cleanup(&client_hello);
538
+ OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
539
+ return -1;
540
+ }
541
+ }
542
+
543
+ /* Add the null compression scheme and finish. */
544
+ if (!CBB_add_u8(&hello_body, 1) || !CBB_add_u8(&hello_body, 0) ||
545
+ !CBB_finish(&client_hello, NULL, &ssl->init_buf->length)) {
546
+ CBB_cleanup(&client_hello);
547
+ OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
548
+ return -1;
549
+ }
550
+
551
+ /* Consume and discard the V2ClientHello. */
552
+ ssl_read_buffer_consume(ssl, 2 + msg_length);
553
+ ssl_read_buffer_discard(ssl);
554
+
555
+ *out_is_v2_client_hello = 1;
556
+ return 1;
557
+ }
558
+
559
+ int ssl3_get_message(SSL *ssl, int msg_type,
560
+ enum ssl_hash_message_t hash_message) {
561
+ again:
562
+ /* Re-create the handshake buffer if needed. */
563
+ if (ssl->init_buf == NULL) {
564
+ ssl->init_buf = BUF_MEM_new();
565
+ if (ssl->init_buf == NULL) {
566
+ return -1;
567
+ }
568
+ }
569
+
570
+ if (ssl->server && !ssl->s3->v2_hello_done) {
571
+ /* Bypass the record layer for the first message to handle V2ClientHello. */
572
+ assert(hash_message == ssl_hash_message);
573
+ int is_v2_client_hello = 0;
574
+ int ret = read_v2_client_hello(ssl, &is_v2_client_hello);
575
+ if (ret <= 0) {
576
+ return ret;
577
+ }
578
+ if (is_v2_client_hello) {
579
+ /* V2ClientHello is hashed separately. */
580
+ hash_message = ssl_dont_hash_message;
581
+ }
582
+ ssl->s3->v2_hello_done = 1;
583
+ }
307
584
 
308
585
  if (ssl->s3->tmp.reuse_message) {
309
586
  /* A ssl_dont_hash_message call cannot be combined with reuse_message; the
310
587
  * ssl_dont_hash_message would have to have been applied to the previous
311
588
  * call. */
312
589
  assert(hash_message == ssl_hash_message);
313
- ssl->s3->tmp.reuse_message = 0;
314
- if (msg_type >= 0 && ssl->s3->tmp.message_type != msg_type) {
315
- al = SSL_AD_UNEXPECTED_MESSAGE;
316
- OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_MESSAGE);
317
- goto f_err;
318
- }
319
- *ok = 1;
320
- ssl->state = body_state;
321
- ssl->init_msg = (uint8_t *)ssl->init_buf->data + 4;
322
- ssl->init_num = (int)ssl->s3->tmp.message_size;
323
- return ssl->init_num;
324
- }
325
-
326
- p = (uint8_t *)ssl->init_buf->data;
327
-
328
- if (ssl->state == header_state) {
329
- assert(ssl->init_num < 4);
330
-
331
- for (;;) {
332
- while (ssl->init_num < 4) {
333
- int bytes_read = ssl3_read_bytes(
334
- ssl, SSL3_RT_HANDSHAKE, &p[ssl->init_num], 4 - ssl->init_num, 0);
335
- if (bytes_read <= 0) {
336
- *ok = 0;
337
- return bytes_read;
338
- }
339
- ssl->init_num += bytes_read;
340
- }
341
-
342
- static const uint8_t kHelloRequest[4] = {SSL3_MT_HELLO_REQUEST, 0, 0, 0};
343
- if (ssl->server || memcmp(p, kHelloRequest, sizeof(kHelloRequest)) != 0) {
344
- break;
345
- }
346
-
347
- /* The server may always send 'Hello Request' messages -- we are doing
348
- * a handshake anyway now, so ignore them if their format is correct.
349
- * Does not count for 'Finished' MAC. */
350
- ssl->init_num = 0;
351
-
352
- if (ssl->msg_callback) {
353
- ssl->msg_callback(0, ssl->version, SSL3_RT_HANDSHAKE, p, 4, ssl,
354
- ssl->msg_callback_arg);
355
- }
356
- }
590
+ assert(ssl->init_msg != NULL);
357
591
 
358
- /* ssl->init_num == 4 */
592
+ ssl->s3->tmp.reuse_message = 0;
593
+ hash_message = ssl_dont_hash_message;
594
+ } else {
595
+ ssl3_release_current_message(ssl, 0 /* don't free buffer */);
596
+ }
359
597
 
360
- if (msg_type >= 0 && *p != msg_type) {
361
- al = SSL_AD_UNEXPECTED_MESSAGE;
362
- OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_MESSAGE);
363
- goto f_err;
364
- }
365
- ssl->s3->tmp.message_type = *(p++);
598
+ /* Read the message header, if we haven't yet. */
599
+ int ret = extend_handshake_buffer(ssl, SSL3_HM_HEADER_LENGTH);
600
+ if (ret <= 0) {
601
+ return ret;
602
+ }
366
603
 
367
- n2l3(p, l);
368
- if (l > (unsigned long)max) {
369
- al = SSL_AD_ILLEGAL_PARAMETER;
370
- OPENSSL_PUT_ERROR(SSL, SSL_R_EXCESSIVE_MESSAGE_SIZE);
371
- goto f_err;
372
- }
604
+ /* Parse out the length. Cap it so the peer cannot force us to buffer up to
605
+ * 2^24 bytes. */
606
+ const uint8_t *p = (uint8_t *)ssl->init_buf->data;
607
+ size_t msg_len = (((uint32_t)p[1]) << 16) | (((uint32_t)p[2]) << 8) | p[3];
608
+ if (msg_len > ssl_max_handshake_message_len(ssl)) {
609
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
610
+ OPENSSL_PUT_ERROR(SSL, SSL_R_EXCESSIVE_MESSAGE_SIZE);
611
+ return -1;
612
+ }
373
613
 
374
- if (l && !BUF_MEM_grow_clean(ssl->init_buf, l + 4)) {
375
- OPENSSL_PUT_ERROR(SSL, ERR_R_BUF_LIB);
376
- goto err;
377
- }
378
- ssl->s3->tmp.message_size = l;
379
- ssl->state = body_state;
614
+ /* Read the message body, if we haven't yet. */
615
+ ret = extend_handshake_buffer(ssl, SSL3_HM_HEADER_LENGTH + msg_len);
616
+ if (ret <= 0) {
617
+ return ret;
618
+ }
380
619
 
381
- ssl->init_msg = (uint8_t *)ssl->init_buf->data + 4;
382
- ssl->init_num = 0;
620
+ /* We have now received a complete message. */
621
+ ssl_do_msg_callback(ssl, 0 /* read */, SSL3_RT_HANDSHAKE, ssl->init_buf->data,
622
+ ssl->init_buf->length);
623
+
624
+ ssl->s3->tmp.message_type = ((const uint8_t *)ssl->init_buf->data)[0];
625
+ ssl->init_msg = (uint8_t*)ssl->init_buf->data + SSL3_HM_HEADER_LENGTH;
626
+ ssl->init_num = ssl->init_buf->length - SSL3_HM_HEADER_LENGTH;
627
+
628
+ /* Ignore stray HelloRequest messages in the handshake before TLS 1.3. Per RFC
629
+ * 5246, section 7.4.1.1, the server may send HelloRequest at any time. */
630
+ if (!ssl->server && SSL_in_init(ssl) &&
631
+ (!ssl->s3->have_version || ssl3_protocol_version(ssl) < TLS1_3_VERSION) &&
632
+ ssl->s3->tmp.message_type == SSL3_MT_HELLO_REQUEST &&
633
+ ssl->init_num == 0) {
634
+ goto again;
383
635
  }
384
636
 
385
- /* next state (body_state) */
386
- p = ssl->init_msg;
387
- n = ssl->s3->tmp.message_size - ssl->init_num;
388
- while (n > 0) {
389
- int bytes_read =
390
- ssl3_read_bytes(ssl, SSL3_RT_HANDSHAKE, &p[ssl->init_num], n, 0);
391
- if (bytes_read <= 0) {
392
- ssl->rwstate = SSL_READING;
393
- *ok = 0;
394
- return bytes_read;
395
- }
396
- ssl->init_num += bytes_read;
397
- n -= bytes_read;
637
+ if (msg_type >= 0 && ssl->s3->tmp.message_type != msg_type) {
638
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
639
+ OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_MESSAGE);
640
+ return -1;
398
641
  }
399
642
 
400
643
  /* Feed this message into MAC computation. */
401
644
  if (hash_message == ssl_hash_message && !ssl3_hash_current_message(ssl)) {
402
- goto err;
403
- }
404
- if (ssl->msg_callback) {
405
- ssl->msg_callback(0, ssl->version, SSL3_RT_HANDSHAKE, ssl->init_buf->data,
406
- (size_t)ssl->init_num + 4, ssl, ssl->msg_callback_arg);
645
+ return -1;
407
646
  }
408
- *ok = 1;
409
- return ssl->init_num;
410
647
 
411
- f_err:
412
- ssl3_send_alert(ssl, SSL3_AL_FATAL, al);
413
-
414
- err:
415
- *ok = 0;
416
- return -1;
648
+ return 1;
417
649
  }
418
650
 
419
651
  int ssl3_hash_current_message(SSL *ssl) {
420
- /* The handshake header (different size between DTLS and TLS) is included in
421
- * the hash. */
422
- size_t header_len = ssl->init_msg - (uint8_t *)ssl->init_buf->data;
423
652
  return ssl3_update_handshake_hash(ssl, (uint8_t *)ssl->init_buf->data,
424
- ssl->init_num + header_len);
653
+ ssl->init_buf->length);
425
654
  }
426
655
 
427
- /* ssl3_cert_verify_hash is documented as needing EVP_MAX_MD_SIZE because that
428
- * is sufficient pre-TLS1.2 as well. */
429
- OPENSSL_COMPILE_ASSERT(EVP_MAX_MD_SIZE > MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH,
430
- combined_tls_hash_fits_in_max);
431
-
432
- int ssl3_cert_verify_hash(SSL *ssl, uint8_t *out, size_t *out_len,
433
- const EVP_MD **out_md, int pkey_type) {
434
- /* For TLS v1.2 send signature algorithm and signature using
435
- * agreed digest and cached handshake records. Otherwise, use
436
- * SHA1 or MD5 + SHA1 depending on key type. */
437
- if (ssl3_protocol_version(ssl) >= TLS1_2_VERSION) {
438
- EVP_MD_CTX mctx;
439
- unsigned len;
440
-
441
- EVP_MD_CTX_init(&mctx);
442
- if (!EVP_DigestInit_ex(&mctx, *out_md, NULL) ||
443
- !EVP_DigestUpdate(&mctx, ssl->s3->handshake_buffer->data,
444
- ssl->s3->handshake_buffer->length) ||
445
- !EVP_DigestFinal(&mctx, out, &len)) {
446
- OPENSSL_PUT_ERROR(SSL, ERR_R_EVP_LIB);
447
- EVP_MD_CTX_cleanup(&mctx);
448
- return 0;
449
- }
450
- *out_len = len;
451
- } else if (pkey_type == EVP_PKEY_RSA) {
452
- if (ssl->s3->enc_method->cert_verify_mac(ssl, NID_md5, out) == 0 ||
453
- ssl->s3->enc_method->cert_verify_mac(ssl, NID_sha1,
454
- out + MD5_DIGEST_LENGTH) == 0) {
455
- return 0;
456
- }
457
- *out_len = MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH;
458
- *out_md = EVP_md5_sha1();
459
- } else if (pkey_type == EVP_PKEY_EC) {
460
- if (ssl->s3->enc_method->cert_verify_mac(ssl, NID_sha1, out) == 0) {
461
- return 0;
462
- }
463
- *out_len = SHA_DIGEST_LENGTH;
464
- *out_md = EVP_sha1();
465
- } else {
466
- OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
467
- return 0;
656
+ void ssl3_release_current_message(SSL *ssl, int free_buffer) {
657
+ if (ssl->init_msg != NULL) {
658
+ /* |init_buf| never contains data beyond the current message. */
659
+ assert(SSL3_HM_HEADER_LENGTH + ssl->init_num == ssl->init_buf->length);
660
+
661
+ /* Clear the current message. */
662
+ ssl->init_msg = NULL;
663
+ ssl->init_num = 0;
664
+ ssl->init_buf->length = 0;
468
665
  }
469
666
 
470
- return 1;
667
+ if (free_buffer) {
668
+ BUF_MEM_free(ssl->init_buf);
669
+ ssl->init_buf = NULL;
670
+ }
471
671
  }
472
672
 
473
673
  int ssl_verify_alarm_type(long type) {
@@ -491,6 +691,9 @@ int ssl_verify_alarm_type(long type) {
491
691
  case X509_V_ERR_CRL_NOT_YET_VALID:
492
692
  case X509_V_ERR_CERT_UNTRUSTED:
493
693
  case X509_V_ERR_CERT_REJECTED:
694
+ case X509_V_ERR_HOSTNAME_MISMATCH:
695
+ case X509_V_ERR_EMAIL_MISMATCH:
696
+ case X509_V_ERR_IP_ADDRESS_MISMATCH:
494
697
  al = SSL_AD_BAD_CERTIFICATE;
495
698
  break;
496
699
 
@@ -508,7 +711,10 @@ int ssl_verify_alarm_type(long type) {
508
711
  al = SSL_AD_CERTIFICATE_REVOKED;
509
712
  break;
510
713
 
714
+ case X509_V_ERR_UNSPECIFIED:
511
715
  case X509_V_ERR_OUT_OF_MEM:
716
+ case X509_V_ERR_INVALID_CALL:
717
+ case X509_V_ERR_STORE_LOOKUP:
512
718
  al = SSL_AD_INTERNAL_ERROR;
513
719
  break;
514
720
 
@@ -537,21 +743,3 @@ int ssl_verify_alarm_type(long type) {
537
743
 
538
744
  return al;
539
745
  }
540
-
541
- int ssl_fill_hello_random(uint8_t *out, size_t len, int is_server) {
542
- if (is_server) {
543
- const uint32_t current_time = time(NULL);
544
- uint8_t *p = out;
545
-
546
- if (len < 4) {
547
- return 0;
548
- }
549
- p[0] = current_time >> 24;
550
- p[1] = current_time >> 16;
551
- p[2] = current_time >> 8;
552
- p[3] = current_time;
553
- return RAND_bytes(p + 4, len - 4);
554
- } else {
555
- return RAND_bytes(out, len);
556
- }
557
- }