grpc 1.37.1 → 1.38.0.pre1

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 (544) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +64 -58
  3. data/include/grpc/event_engine/README.md +38 -0
  4. data/include/grpc/event_engine/channel_args.h +28 -0
  5. data/include/grpc/event_engine/event_engine.h +336 -0
  6. data/include/grpc/event_engine/port.h +39 -0
  7. data/include/grpc/event_engine/slice_allocator.h +81 -0
  8. data/include/grpc/grpc.h +2 -2
  9. data/include/grpc/grpc_security_constants.h +14 -0
  10. data/include/grpc/impl/codegen/grpc_types.h +11 -0
  11. data/include/grpc/impl/codegen/port_platform.h +5 -0
  12. data/include/grpc/module.modulemap +14 -14
  13. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
  14. data/src/core/ext/filters/client_channel/channel_connectivity.cc +177 -202
  15. data/src/core/ext/filters/client_channel/client_channel.cc +628 -3101
  16. data/src/core/ext/filters/client_channel/client_channel.h +489 -55
  17. data/src/core/ext/filters/client_channel/client_channel_channelz.h +1 -1
  18. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -1
  19. data/src/core/ext/filters/client_channel/config_selector.h +1 -1
  20. data/src/core/ext/filters/client_channel/connector.h +1 -1
  21. data/src/core/ext/filters/client_channel/dynamic_filters.cc +9 -10
  22. data/src/core/ext/filters/client_channel/dynamic_filters.h +3 -3
  23. data/src/core/ext/filters/client_channel/health/health_check_client.cc +26 -27
  24. data/src/core/ext/filters/client_channel/health/health_check_client.h +27 -26
  25. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +24 -21
  26. data/src/core/ext/filters/client_channel/lb_policy.cc +1 -1
  27. data/src/core/ext/filters/client_channel/lb_policy.h +4 -4
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -6
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +46 -43
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -1
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +5 -5
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +14 -12
  34. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +4 -4
  35. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +1 -1
  36. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +15 -15
  37. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +36 -30
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +23 -23
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +31 -46
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +84 -61
  41. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -1
  42. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -4
  43. data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -1
  44. data/src/core/ext/filters/client_channel/resolver.h +2 -2
  45. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +23 -15
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +3 -3
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +14 -14
  50. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +33 -24
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
  52. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +1 -1
  53. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  54. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +17 -9
  55. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +20 -28
  56. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +7 -5
  57. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +13 -11
  58. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -1
  59. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +43 -28
  60. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +32 -239
  61. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +20 -49
  62. data/src/core/ext/filters/client_channel/retry_filter.cc +2188 -0
  63. data/src/core/ext/filters/client_channel/retry_filter.h +30 -0
  64. data/src/core/ext/filters/client_channel/retry_service_config.cc +287 -0
  65. data/src/core/ext/filters/client_channel/retry_service_config.h +90 -0
  66. data/src/core/ext/filters/client_channel/server_address.cc +1 -1
  67. data/src/core/ext/filters/client_channel/service_config.cc +15 -14
  68. data/src/core/ext/filters/client_channel/service_config.h +7 -6
  69. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +5 -4
  70. data/src/core/ext/filters/client_channel/service_config_parser.cc +6 -6
  71. data/src/core/ext/filters/client_channel/service_config_parser.h +7 -4
  72. data/src/core/ext/filters/client_channel/subchannel.cc +17 -16
  73. data/src/core/ext/filters/client_channel/subchannel.h +7 -6
  74. data/src/core/ext/filters/client_idle/client_idle_filter.cc +16 -15
  75. data/src/core/ext/filters/deadline/deadline_filter.cc +10 -10
  76. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -18
  77. data/src/core/ext/filters/fault_injection/service_config_parser.cc +5 -5
  78. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  79. data/src/core/ext/filters/http/client/http_client_filter.cc +28 -21
  80. data/src/core/ext/filters/http/client_authority_filter.cc +3 -3
  81. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +23 -22
  82. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +21 -21
  83. data/src/core/ext/filters/http/server/http_server_filter.cc +27 -23
  84. data/src/core/ext/filters/max_age/max_age_filter.cc +12 -10
  85. data/src/core/ext/filters/message_size/message_size_filter.cc +14 -11
  86. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  87. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +4 -3
  88. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +7 -7
  89. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +7 -7
  90. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +2 -2
  91. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +1 -1
  92. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +3 -3
  93. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +44 -45
  94. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -2
  95. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +3 -4
  96. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +2 -2
  97. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +3 -4
  98. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +129 -116
  99. data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -5
  100. data/src/core/ext/transport/chttp2/transport/context_list.h +4 -4
  101. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  102. data/src/core/ext/transport/chttp2/transport/flow_control.h +8 -8
  103. data/src/core/ext/transport/chttp2/transport/frame_data.cc +8 -8
  104. data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -10
  105. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +7 -8
  106. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +6 -6
  107. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +7 -8
  108. data/src/core/ext/transport/chttp2/transport/frame_ping.h +7 -6
  109. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +7 -7
  110. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +6 -6
  111. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -5
  112. data/src/core/ext/transport/chttp2/transport/frame_settings.h +6 -6
  113. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -6
  114. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +4 -6
  115. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +237 -208
  116. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +10 -10
  117. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +4 -3
  118. data/src/core/ext/transport/chttp2/transport/hpack_table.h +4 -4
  119. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +2 -2
  120. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +2 -2
  121. data/src/core/ext/transport/chttp2/transport/internal.h +31 -27
  122. data/src/core/ext/transport/chttp2/transport/parsing.cc +63 -56
  123. data/src/core/ext/transport/chttp2/transport/writing.cc +7 -3
  124. data/src/core/ext/transport/inproc/inproc_transport.cc +30 -29
  125. data/src/core/ext/xds/certificate_provider_factory.h +1 -1
  126. data/src/core/ext/xds/certificate_provider_store.h +3 -3
  127. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +3 -3
  128. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +2 -2
  129. data/src/core/ext/xds/xds_api.cc +101 -93
  130. data/src/core/ext/xds/xds_api.h +6 -6
  131. data/src/core/ext/xds/xds_bootstrap.cc +97 -159
  132. data/src/core/ext/xds/xds_bootstrap.h +19 -24
  133. data/src/core/ext/xds/xds_certificate_provider.cc +4 -4
  134. data/src/core/ext/xds/xds_certificate_provider.h +4 -4
  135. data/src/core/ext/xds/xds_channel_args.h +5 -2
  136. data/src/core/ext/xds/xds_client.cc +310 -178
  137. data/src/core/ext/xds/xds_client.h +41 -27
  138. data/src/core/ext/xds/xds_client_stats.h +3 -2
  139. data/src/core/ext/xds/xds_server_config_fetcher.cc +34 -20
  140. data/src/core/lib/{iomgr → address_utils}/parse_address.cc +17 -17
  141. data/src/core/lib/{iomgr → address_utils}/parse_address.h +7 -7
  142. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.cc +3 -20
  143. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.h +6 -11
  144. data/src/core/lib/channel/channel_stack.cc +10 -9
  145. data/src/core/lib/channel/channel_stack.h +10 -9
  146. data/src/core/lib/channel/channel_stack_builder.cc +2 -2
  147. data/src/core/lib/channel/channel_stack_builder.h +1 -1
  148. data/src/core/lib/channel/channelz.cc +21 -13
  149. data/src/core/lib/channel/connected_channel.cc +4 -4
  150. data/src/core/lib/channel/handshaker.cc +7 -6
  151. data/src/core/lib/channel/handshaker.h +5 -5
  152. data/src/core/lib/event_engine/slice_allocator.cc +59 -0
  153. data/src/core/lib/event_engine/sockaddr.cc +38 -0
  154. data/src/core/lib/gprpp/ref_counted.h +28 -14
  155. data/src/core/lib/gprpp/status_helper.cc +407 -0
  156. data/src/core/lib/gprpp/status_helper.h +180 -0
  157. data/src/core/lib/http/httpcli.cc +11 -11
  158. data/src/core/lib/http/httpcli_security_connector.cc +11 -7
  159. data/src/core/lib/http/parser.cc +16 -16
  160. data/src/core/lib/http/parser.h +4 -4
  161. data/src/core/lib/iomgr/buffer_list.cc +7 -9
  162. data/src/core/lib/iomgr/buffer_list.h +4 -5
  163. data/src/core/lib/iomgr/call_combiner.cc +15 -12
  164. data/src/core/lib/iomgr/call_combiner.h +12 -14
  165. data/src/core/lib/iomgr/cfstream_handle.cc +3 -3
  166. data/src/core/lib/iomgr/cfstream_handle.h +1 -1
  167. data/src/core/lib/iomgr/closure.h +7 -6
  168. data/src/core/lib/iomgr/combiner.cc +14 -12
  169. data/src/core/lib/iomgr/combiner.h +2 -2
  170. data/src/core/lib/iomgr/endpoint.cc +1 -1
  171. data/src/core/lib/iomgr/endpoint.h +2 -2
  172. data/src/core/lib/iomgr/endpoint_cfstream.cc +11 -13
  173. data/src/core/lib/iomgr/endpoint_pair_windows.cc +1 -1
  174. data/src/core/lib/iomgr/error.cc +167 -61
  175. data/src/core/lib/iomgr/error.h +217 -106
  176. data/src/core/lib/iomgr/error_cfstream.cc +3 -2
  177. data/src/core/lib/iomgr/error_cfstream.h +2 -2
  178. data/src/core/lib/iomgr/error_internal.h +5 -1
  179. data/src/core/lib/iomgr/ev_apple.cc +5 -5
  180. data/src/core/lib/iomgr/ev_epoll1_linux.cc +19 -19
  181. data/src/core/lib/iomgr/ev_epollex_linux.cc +48 -45
  182. data/src/core/lib/iomgr/ev_poll_posix.cc +26 -23
  183. data/src/core/lib/iomgr/ev_posix.cc +9 -8
  184. data/src/core/lib/iomgr/ev_posix.h +9 -9
  185. data/src/core/lib/iomgr/exec_ctx.cc +4 -4
  186. data/src/core/lib/iomgr/exec_ctx.h +1 -1
  187. data/src/core/lib/iomgr/executor.cc +8 -8
  188. data/src/core/lib/iomgr/executor.h +2 -2
  189. data/src/core/lib/iomgr/iomgr.cc +1 -1
  190. data/src/core/lib/iomgr/iomgr.h +1 -1
  191. data/src/core/lib/iomgr/iomgr_custom.cc +1 -1
  192. data/src/core/lib/iomgr/iomgr_internal.cc +2 -2
  193. data/src/core/lib/iomgr/iomgr_internal.h +3 -3
  194. data/src/core/lib/iomgr/iomgr_posix.cc +1 -1
  195. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
  196. data/src/core/lib/iomgr/iomgr_windows.cc +1 -1
  197. data/src/core/lib/iomgr/load_file.cc +4 -4
  198. data/src/core/lib/iomgr/load_file.h +2 -2
  199. data/src/core/lib/iomgr/lockfree_event.cc +5 -5
  200. data/src/core/lib/iomgr/lockfree_event.h +1 -1
  201. data/src/core/lib/iomgr/pollset.cc +5 -5
  202. data/src/core/lib/iomgr/pollset.h +9 -9
  203. data/src/core/lib/iomgr/pollset_custom.cc +5 -5
  204. data/src/core/lib/iomgr/pollset_windows.cc +5 -5
  205. data/src/core/lib/iomgr/port.h +1 -1
  206. data/src/core/lib/iomgr/python_util.h +1 -1
  207. data/src/core/lib/iomgr/resolve_address.cc +3 -3
  208. data/src/core/lib/iomgr/resolve_address.h +6 -6
  209. data/src/core/lib/iomgr/resolve_address_custom.cc +10 -9
  210. data/src/core/lib/iomgr/resolve_address_custom.h +3 -3
  211. data/src/core/lib/iomgr/resolve_address_posix.cc +3 -3
  212. data/src/core/lib/iomgr/resolve_address_windows.cc +4 -4
  213. data/src/core/lib/iomgr/resource_quota.cc +11 -10
  214. data/src/core/lib/iomgr/socket_utils_common_posix.cc +22 -20
  215. data/src/core/lib/iomgr/socket_utils_posix.h +20 -20
  216. data/src/core/lib/iomgr/tcp_client_cfstream.cc +4 -4
  217. data/src/core/lib/iomgr/tcp_client_custom.cc +5 -6
  218. data/src/core/lib/iomgr/tcp_client_posix.cc +15 -17
  219. data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
  220. data/src/core/lib/iomgr/tcp_client_windows.cc +5 -5
  221. data/src/core/lib/iomgr/tcp_custom.cc +14 -16
  222. data/src/core/lib/iomgr/tcp_custom.h +13 -12
  223. data/src/core/lib/iomgr/tcp_posix.cc +36 -34
  224. data/src/core/lib/iomgr/tcp_server.cc +6 -6
  225. data/src/core/lib/iomgr/tcp_server.h +12 -11
  226. data/src/core/lib/iomgr/tcp_server_custom.cc +23 -21
  227. data/src/core/lib/iomgr/tcp_server_posix.cc +22 -21
  228. data/src/core/lib/iomgr/tcp_server_utils_posix.h +13 -12
  229. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +19 -17
  230. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +9 -9
  231. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +4 -4
  232. data/src/core/lib/iomgr/tcp_server_windows.cc +26 -25
  233. data/src/core/lib/iomgr/tcp_uv.cc +25 -23
  234. data/src/core/lib/iomgr/tcp_windows.cc +13 -13
  235. data/src/core/lib/iomgr/tcp_windows.h +2 -2
  236. data/src/core/lib/iomgr/timer_custom.cc +2 -1
  237. data/src/core/lib/iomgr/timer_custom.h +1 -1
  238. data/src/core/lib/iomgr/timer_generic.cc +6 -6
  239. data/src/core/lib/iomgr/udp_server.cc +21 -20
  240. data/src/core/lib/iomgr/unix_sockets_posix.cc +3 -3
  241. data/src/core/lib/iomgr/unix_sockets_posix.h +2 -2
  242. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +10 -7
  243. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +3 -3
  244. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +4 -4
  245. data/src/core/lib/iomgr/wakeup_fd_posix.cc +3 -3
  246. data/src/core/lib/iomgr/wakeup_fd_posix.h +8 -6
  247. data/src/core/lib/iomgr/work_serializer.h +17 -1
  248. data/src/core/lib/json/json.h +1 -1
  249. data/src/core/lib/json/json_reader.cc +4 -4
  250. data/src/core/lib/matchers/matchers.cc +39 -39
  251. data/src/core/lib/matchers/matchers.h +28 -28
  252. data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
  253. data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
  254. data/src/core/lib/security/credentials/credentials.h +2 -2
  255. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +17 -13
  256. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +13 -11
  257. data/src/core/lib/security/credentials/external/aws_request_signer.cc +2 -1
  258. data/src/core/lib/security/credentials/external/aws_request_signer.h +1 -1
  259. data/src/core/lib/security/credentials/external/external_account_credentials.cc +15 -12
  260. data/src/core/lib/security/credentials/external/external_account_credentials.h +9 -8
  261. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +5 -4
  262. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -3
  263. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +8 -8
  264. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +9 -7
  265. data/src/core/lib/security/credentials/fake/fake_credentials.cc +2 -2
  266. data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -2
  267. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +9 -9
  268. data/src/core/lib/security/credentials/iam/iam_credentials.cc +2 -2
  269. data/src/core/lib/security/credentials/iam/iam_credentials.h +2 -2
  270. data/src/core/lib/security/credentials/jwt/json_token.cc +2 -2
  271. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +3 -3
  272. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -2
  273. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +7 -5
  274. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +21 -19
  275. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -5
  276. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +5 -5
  277. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -2
  278. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +8 -7
  279. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -9
  280. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +19 -13
  281. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -0
  282. data/src/core/lib/security/credentials/xds/xds_credentials.cc +3 -3
  283. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +13 -3
  284. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -3
  285. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  286. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +12 -2
  287. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -1
  288. data/src/core/lib/security/security_connector/local/local_security_connector.cc +14 -4
  289. data/src/core/lib/security/security_connector/security_connector.h +9 -4
  290. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +16 -6
  291. data/src/core/lib/security/security_connector/ssl_utils.cc +22 -4
  292. data/src/core/lib/security/security_connector/ssl_utils.h +4 -4
  293. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +56 -60
  294. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +66 -48
  295. data/src/core/lib/security/transport/client_auth_filter.cc +18 -10
  296. data/src/core/lib/security/transport/secure_endpoint.cc +4 -4
  297. data/src/core/lib/security/transport/security_handshaker.cc +33 -32
  298. data/src/core/lib/security/transport/server_auth_filter.cc +19 -13
  299. data/src/core/lib/security/transport/tsi_error.cc +2 -1
  300. data/src/core/lib/security/transport/tsi_error.h +2 -1
  301. data/src/core/lib/security/util/json_util.cc +2 -2
  302. data/src/core/lib/security/util/json_util.h +1 -1
  303. data/src/core/lib/surface/call.cc +46 -45
  304. data/src/core/lib/surface/call.h +2 -2
  305. data/src/core/lib/surface/channel.cc +6 -6
  306. data/src/core/lib/surface/channel.h +3 -2
  307. data/src/core/lib/surface/channel_ping.cc +1 -1
  308. data/src/core/lib/surface/completion_queue.cc +46 -47
  309. data/src/core/lib/surface/completion_queue.h +2 -1
  310. data/src/core/lib/surface/lame_client.cc +11 -11
  311. data/src/core/lib/surface/lame_client.h +1 -1
  312. data/src/core/lib/surface/server.cc +28 -22
  313. data/src/core/lib/surface/server.h +16 -15
  314. data/src/core/lib/surface/validate_metadata.cc +7 -7
  315. data/src/core/lib/surface/validate_metadata.h +3 -2
  316. data/src/core/lib/surface/version.cc +4 -2
  317. data/src/core/lib/transport/byte_stream.cc +5 -5
  318. data/src/core/lib/transport/byte_stream.h +8 -8
  319. data/src/core/lib/transport/connectivity_state.cc +1 -1
  320. data/src/core/lib/transport/error_utils.cc +19 -8
  321. data/src/core/lib/transport/error_utils.h +11 -5
  322. data/src/core/lib/transport/metadata_batch.cc +37 -37
  323. data/src/core/lib/transport/metadata_batch.h +19 -18
  324. data/src/core/lib/transport/transport.cc +4 -3
  325. data/src/core/lib/transport/transport.h +4 -4
  326. data/src/core/lib/transport/transport_op_string.cc +5 -5
  327. data/src/core/tsi/alts/crypt/gsec.h +4 -0
  328. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +5 -4
  329. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +7 -6
  330. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +2 -1
  331. data/src/core/tsi/ssl_transport_security.cc +32 -14
  332. data/src/core/tsi/ssl_transport_security.h +3 -4
  333. data/src/ruby/bin/math_services_pb.rb +1 -1
  334. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  335. data/src/ruby/lib/grpc/version.rb +1 -1
  336. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +1 -1
  337. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +6 -6
  338. data/third_party/abseil-cpp/absl/algorithm/container.h +3 -3
  339. data/third_party/abseil-cpp/absl/base/attributes.h +24 -4
  340. data/third_party/abseil-cpp/absl/base/call_once.h +2 -9
  341. data/third_party/abseil-cpp/absl/base/config.h +37 -9
  342. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +24 -10
  343. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +4 -1
  344. data/third_party/abseil-cpp/absl/base/internal/endian.h +61 -0
  345. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +2 -3
  346. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +34 -32
  347. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +16 -6
  348. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +11 -2
  349. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +14 -5
  350. data/third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc +2 -2
  351. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +3 -3
  352. data/third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc +2 -2
  353. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +11 -11
  354. data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +5 -5
  355. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +1 -1
  356. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +5 -2
  357. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +43 -42
  358. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +111 -7
  359. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +0 -76
  360. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +1 -3
  361. data/third_party/abseil-cpp/absl/base/log_severity.h +4 -4
  362. data/third_party/abseil-cpp/absl/base/macros.h +11 -0
  363. data/third_party/abseil-cpp/absl/base/optimization.h +10 -7
  364. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  365. data/third_party/abseil-cpp/absl/base/port.h +0 -1
  366. data/third_party/abseil-cpp/absl/base/thread_annotations.h +1 -1
  367. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -2
  368. data/third_party/abseil-cpp/absl/container/inlined_vector.h +5 -3
  369. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +1 -1
  370. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +5 -1
  371. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +2 -1
  372. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +2 -1
  373. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +141 -66
  374. data/third_party/abseil-cpp/absl/container/internal/layout.h +4 -4
  375. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -1
  376. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +136 -136
  377. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +16 -12
  378. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +5 -2
  379. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +3 -12
  380. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +6 -1
  381. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +3 -5
  382. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +2 -2
  383. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +2 -2
  384. data/third_party/abseil-cpp/absl/hash/internal/city.cc +15 -12
  385. data/third_party/abseil-cpp/absl/hash/internal/city.h +1 -19
  386. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +25 -10
  387. data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -37
  388. data/third_party/abseil-cpp/absl/hash/internal/wyhash.cc +111 -0
  389. data/third_party/abseil-cpp/absl/hash/internal/wyhash.h +48 -0
  390. data/third_party/abseil-cpp/absl/meta/type_traits.h +16 -2
  391. data/third_party/abseil-cpp/absl/numeric/bits.h +177 -0
  392. data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -3
  393. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +358 -0
  394. data/third_party/abseil-cpp/absl/numeric/internal/representation.h +55 -0
  395. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +18 -0
  396. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -7
  397. data/third_party/abseil-cpp/absl/status/status.cc +29 -22
  398. data/third_party/abseil-cpp/absl/status/status.h +81 -20
  399. data/third_party/abseil-cpp/absl/status/statusor.h +3 -3
  400. data/third_party/abseil-cpp/absl/strings/charconv.cc +5 -5
  401. data/third_party/abseil-cpp/absl/strings/cord.cc +326 -371
  402. data/third_party/abseil-cpp/absl/strings/cord.h +182 -64
  403. data/third_party/abseil-cpp/absl/strings/escaping.cc +4 -4
  404. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +6 -6
  405. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +83 -0
  406. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +387 -17
  407. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +146 -0
  408. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +897 -0
  409. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +589 -0
  410. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +114 -0
  411. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +14 -0
  412. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -0
  413. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +15 -1
  414. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +19 -4
  415. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +14 -0
  416. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +36 -18
  417. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +14 -0
  418. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +14 -0
  419. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +14 -0
  420. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +15 -40
  421. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +64 -0
  422. data/third_party/abseil-cpp/absl/strings/match.cc +6 -3
  423. data/third_party/abseil-cpp/absl/strings/match.h +16 -6
  424. data/third_party/abseil-cpp/absl/strings/numbers.cc +132 -4
  425. data/third_party/abseil-cpp/absl/strings/numbers.h +10 -10
  426. data/third_party/abseil-cpp/absl/strings/str_join.h +1 -1
  427. data/third_party/abseil-cpp/absl/strings/str_split.h +38 -4
  428. data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +154 -0
  429. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -1
  430. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +2 -2
  431. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +4 -4
  432. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -65
  433. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -6
  434. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +71 -59
  435. data/third_party/abseil-cpp/absl/synchronization/mutex.h +79 -62
  436. data/third_party/abseil-cpp/absl/time/clock.cc +146 -130
  437. data/third_party/abseil-cpp/absl/time/clock.h +2 -2
  438. data/third_party/abseil-cpp/absl/time/duration.cc +3 -2
  439. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +7 -11
  440. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +7 -1
  441. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +4 -4
  442. data/third_party/abseil-cpp/absl/time/time.cc +4 -3
  443. data/third_party/abseil-cpp/absl/time/time.h +26 -24
  444. data/third_party/abseil-cpp/absl/types/internal/variant.h +1 -1
  445. data/third_party/abseil-cpp/absl/types/variant.h +9 -4
  446. data/third_party/boringssl-with-bazel/err_data.c +477 -461
  447. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +1 -1
  448. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +1 -1
  449. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +18 -8
  450. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -2
  451. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +5 -0
  452. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -1
  453. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +1 -1
  454. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +1 -88
  455. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +14 -3
  456. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +119 -273
  457. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +87 -80
  458. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +1 -0
  459. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +1 -1
  460. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +11 -3
  461. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +25 -2
  462. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +10 -2
  463. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/md32_common.h +4 -43
  464. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +4 -0
  465. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +0 -1
  466. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +0 -4
  467. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +104 -93
  468. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/internal.h +39 -0
  469. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +43 -46
  470. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +43 -46
  471. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +33 -22
  472. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c +9 -8
  473. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +9 -8
  474. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +17 -13
  475. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +1 -22
  476. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +2 -1
  477. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +26 -7
  478. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/fips.c +79 -0
  479. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +14 -9
  480. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +45 -48
  481. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +38 -43
  482. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +37 -45
  483. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +103 -42
  484. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +58 -37
  485. data/third_party/boringssl-with-bazel/src/crypto/internal.h +65 -0
  486. data/third_party/boringssl-with-bazel/src/crypto/mem.c +14 -0
  487. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +3 -3
  488. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +1 -1
  489. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +95 -48
  490. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +1 -1
  491. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +0 -28
  492. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +19 -0
  493. data/third_party/boringssl-with-bazel/src/crypto/x509/t_req.c +2 -0
  494. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +19 -25
  495. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +3 -2
  496. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +39 -89
  497. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +9 -16
  498. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +1 -1
  499. data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +21 -17
  500. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +7 -25
  501. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +5 -0
  502. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +25 -22
  503. data/third_party/boringssl-with-bazel/src/crypto/x509/x_val.c +2 -0
  504. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -4
  505. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
  506. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +1 -0
  507. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +0 -3
  508. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +120 -41
  509. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +9 -0
  510. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +0 -8
  511. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +24 -4
  512. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +5 -2
  513. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +19 -0
  514. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +3 -2
  515. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +1 -38
  516. data/third_party/boringssl-with-bazel/src/{crypto/x509/x509_r2x.c → include/openssl/evp_errors.h} +41 -58
  517. data/third_party/boringssl-with-bazel/src/include/openssl/obj.h +24 -5
  518. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +2 -0
  519. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +9 -1
  520. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +2 -2
  521. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +185 -17
  522. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +1 -0
  523. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +416 -121
  524. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +2 -0
  525. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +5 -0
  526. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +444 -0
  527. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +244 -1
  528. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +43 -12
  529. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +149 -8
  530. data/third_party/boringssl-with-bazel/src/ssl/internal.h +220 -46
  531. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +7 -1
  532. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -6
  533. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +23 -26
  534. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +74 -15
  535. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +98 -64
  536. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +34 -4
  537. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +205 -100
  538. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +4 -2
  539. metadata +68 -45
  540. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +0 -88
  541. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +0 -88
  542. data/third_party/abseil-cpp/absl/base/internal/bits.h +0 -219
  543. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +0 -249
  544. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c +0 -29
@@ -15,6 +15,7 @@
15
15
  #include <openssl/ssl.h>
16
16
 
17
17
  #include <openssl/bytestring.h>
18
+ #include <openssl/err.h>
18
19
 
19
20
  #include "internal.h"
20
21
 
@@ -93,7 +94,7 @@ bool SSL_serialize_handoff(const SSL *ssl, CBB *out,
93
94
  !serialize_features(&seq) ||
94
95
  !CBB_flush(out) ||
95
96
  !ssl->method->get_message(ssl, &msg) ||
96
- !ssl_client_hello_init(ssl, out_hello, msg)) {
97
+ !ssl_client_hello_init(ssl, out_hello, msg.body)) {
97
98
  return false;
98
99
  }
99
100
 
@@ -708,3 +709,245 @@ bool SSL_apply_handback(SSL *ssl, Span<const uint8_t> handback) {
708
709
  }
709
710
 
710
711
  BSSL_NAMESPACE_END
712
+
713
+ using namespace bssl;
714
+
715
+ int SSL_serialize_capabilities(const SSL *ssl, CBB *out) {
716
+ CBB seq;
717
+ if (!CBB_add_asn1(out, &seq, CBS_ASN1_SEQUENCE) ||
718
+ !serialize_features(&seq) || //
719
+ !CBB_flush(out)) {
720
+ return 0;
721
+ }
722
+
723
+ return 1;
724
+ }
725
+
726
+ int SSL_request_handshake_hints(SSL *ssl, const uint8_t *client_hello,
727
+ size_t client_hello_len,
728
+ const uint8_t *capabilities,
729
+ size_t capabilities_len) {
730
+ if (SSL_is_dtls(ssl)) {
731
+ OPENSSL_PUT_ERROR(SSL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
732
+ return 0;
733
+ }
734
+
735
+ CBS cbs, seq;
736
+ CBS_init(&cbs, capabilities, capabilities_len);
737
+ UniquePtr<SSL_HANDSHAKE_HINTS> hints = MakeUnique<SSL_HANDSHAKE_HINTS>();
738
+ if (hints == nullptr ||
739
+ !CBS_get_asn1(&cbs, &seq, CBS_ASN1_SEQUENCE) ||
740
+ !apply_remote_features(ssl, &seq)) {
741
+ return 0;
742
+ }
743
+
744
+ SSL3_STATE *const s3 = ssl->s3;
745
+ s3->v2_hello_done = true;
746
+ s3->has_message = true;
747
+
748
+ Array<uint8_t> client_hello_msg;
749
+ ScopedCBB client_hello_cbb;
750
+ CBB client_hello_body;
751
+ if (!ssl->method->init_message(ssl, client_hello_cbb.get(),
752
+ &client_hello_body, SSL3_MT_CLIENT_HELLO) ||
753
+ !CBB_add_bytes(&client_hello_body, client_hello, client_hello_len) ||
754
+ !ssl->method->finish_message(ssl, client_hello_cbb.get(),
755
+ &client_hello_msg)) {
756
+ return 0;
757
+ }
758
+
759
+ s3->hs_buf.reset(BUF_MEM_new());
760
+ if (!s3->hs_buf || !BUF_MEM_append(s3->hs_buf.get(), client_hello_msg.data(),
761
+ client_hello_msg.size())) {
762
+ return 0;
763
+ }
764
+
765
+ s3->hs->hints_requested = true;
766
+ s3->hs->hints = std::move(hints);
767
+ return 1;
768
+ }
769
+
770
+ // |SSL_HANDSHAKE_HINTS| is serialized as the following ASN.1 structure. We use
771
+ // implicit tagging to make it a little more compact.
772
+ //
773
+ // HandshakeHints ::= SEQUENCE {
774
+ // serverRandom [0] IMPLICIT OCTET STRING OPTIONAL,
775
+ // keyShareHint [1] IMPLICIT KeyShareHint OPTIONAL,
776
+ // signatureHint [2] IMPLICIT SignatureHint OPTIONAL,
777
+ // -- At most one of decryptedPSKHint or ignorePSKHint may be present. It
778
+ // -- corresponds to the first entry in pre_shared_keys. TLS 1.2 session
779
+ // -- tickets will use a separate hint, to ensure the caller does not mix
780
+ // -- them up.
781
+ // decryptedPSKHint [3] IMPLICIT OCTET STRING OPTIONAL,
782
+ // ignorePSKHint [4] IMPLICIT NULL OPTIONAL,
783
+ // }
784
+ //
785
+ // KeyShareHint ::= SEQUENCE {
786
+ // groupId INTEGER,
787
+ // publicKey OCTET STRING,
788
+ // secret OCTET STRING,
789
+ // }
790
+ //
791
+ // SignatureHint ::= SEQUENCE {
792
+ // algorithm INTEGER,
793
+ // input OCTET STRING,
794
+ // subjectPublicKeyInfo OCTET STRING,
795
+ // signature OCTET STRING,
796
+ // }
797
+
798
+ // HandshakeHints tags.
799
+ static const unsigned kServerRandomTag = CBS_ASN1_CONTEXT_SPECIFIC | 0;
800
+ static const unsigned kKeyShareHintTag =
801
+ CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 1;
802
+ static const unsigned kSignatureHintTag =
803
+ CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 2;
804
+ static const unsigned kDecryptedPSKTag = CBS_ASN1_CONTEXT_SPECIFIC | 3;
805
+ static const unsigned kIgnorePSKTag = CBS_ASN1_CONTEXT_SPECIFIC | 4;
806
+
807
+ int SSL_serialize_handshake_hints(const SSL *ssl, CBB *out) {
808
+ const SSL_HANDSHAKE *hs = ssl->s3->hs.get();
809
+ if (!ssl->server || !hs->hints_requested) {
810
+ OPENSSL_PUT_ERROR(SSL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
811
+ return 0;
812
+ }
813
+
814
+ const SSL_HANDSHAKE_HINTS *hints = hs->hints.get();
815
+ CBB seq, server_random, key_share_hint, signature_hint, decrypted_psk,
816
+ ignore_psk;
817
+ if (!CBB_add_asn1(out, &seq, CBS_ASN1_SEQUENCE)) {
818
+ return 0;
819
+ }
820
+
821
+ if (!hints->server_random.empty()) {
822
+ if (!CBB_add_asn1(&seq, &server_random, kServerRandomTag) ||
823
+ !CBB_add_bytes(&server_random, hints->server_random.data(),
824
+ hints->server_random.size())) {
825
+ return 0;
826
+ }
827
+ }
828
+
829
+ if (hints->key_share_group_id != 0 && !hints->key_share_public_key.empty() &&
830
+ !hints->key_share_secret.empty()) {
831
+ if (!CBB_add_asn1(&seq, &key_share_hint, kKeyShareHintTag) ||
832
+ !CBB_add_asn1_uint64(&key_share_hint, hints->key_share_group_id) ||
833
+ !CBB_add_asn1_octet_string(&key_share_hint,
834
+ hints->key_share_public_key.data(),
835
+ hints->key_share_public_key.size()) ||
836
+ !CBB_add_asn1_octet_string(&key_share_hint,
837
+ hints->key_share_secret.data(),
838
+ hints->key_share_secret.size())) {
839
+ return 0;
840
+ }
841
+ }
842
+
843
+ if (hints->signature_algorithm != 0 && !hints->signature_input.empty() &&
844
+ !hints->signature.empty()) {
845
+ if (!CBB_add_asn1(&seq, &signature_hint, kSignatureHintTag) ||
846
+ !CBB_add_asn1_uint64(&signature_hint, hints->signature_algorithm) ||
847
+ !CBB_add_asn1_octet_string(&signature_hint,
848
+ hints->signature_input.data(),
849
+ hints->signature_input.size()) ||
850
+ !CBB_add_asn1_octet_string(&signature_hint,
851
+ hints->signature_spki.data(),
852
+ hints->signature_spki.size()) ||
853
+ !CBB_add_asn1_octet_string(&signature_hint, hints->signature.data(),
854
+ hints->signature.size())) {
855
+ return 0;
856
+ }
857
+ }
858
+
859
+ if (!hints->decrypted_psk.empty()) {
860
+ if (!CBB_add_asn1(&seq, &decrypted_psk, kDecryptedPSKTag) ||
861
+ !CBB_add_bytes(&decrypted_psk, hints->decrypted_psk.data(),
862
+ hints->decrypted_psk.size())) {
863
+ return 0;
864
+ }
865
+ }
866
+
867
+ if (hints->ignore_psk && //
868
+ !CBB_add_asn1(&seq, &ignore_psk, kIgnorePSKTag)) {
869
+ return 0;
870
+ }
871
+
872
+ return CBB_flush(out);
873
+ }
874
+
875
+ int SSL_set_handshake_hints(SSL *ssl, const uint8_t *hints, size_t hints_len) {
876
+ if (SSL_is_dtls(ssl)) {
877
+ OPENSSL_PUT_ERROR(SSL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
878
+ return 0;
879
+ }
880
+
881
+ UniquePtr<SSL_HANDSHAKE_HINTS> hints_obj = MakeUnique<SSL_HANDSHAKE_HINTS>();
882
+ if (hints_obj == nullptr) {
883
+ return 0;
884
+ }
885
+
886
+ CBS cbs, seq, server_random, key_share, signature_hint, ticket, ignore_psk;
887
+ int has_server_random, has_key_share, has_signature_hint, has_ticket,
888
+ has_ignore_psk;
889
+ CBS_init(&cbs, hints, hints_len);
890
+ if (!CBS_get_asn1(&cbs, &seq, CBS_ASN1_SEQUENCE) ||
891
+ !CBS_get_optional_asn1(&seq, &server_random, &has_server_random,
892
+ kServerRandomTag) ||
893
+ !CBS_get_optional_asn1(&seq, &key_share, &has_key_share,
894
+ kKeyShareHintTag) ||
895
+ !CBS_get_optional_asn1(&seq, &signature_hint, &has_signature_hint,
896
+ kSignatureHintTag) ||
897
+ !CBS_get_optional_asn1(&seq, &ticket, &has_ticket, kDecryptedPSKTag) ||
898
+ !CBS_get_optional_asn1(&seq, &ignore_psk, &has_ignore_psk,
899
+ kIgnorePSKTag)) {
900
+ OPENSSL_PUT_ERROR(SSL, SSL_R_COULD_NOT_PARSE_HINTS);
901
+ return 0;
902
+ }
903
+
904
+ if (has_server_random && !hints_obj->server_random.CopyFrom(server_random)) {
905
+ return 0;
906
+ }
907
+
908
+ if (has_key_share) {
909
+ uint64_t group_id;
910
+ CBS public_key, secret;
911
+ if (!CBS_get_asn1_uint64(&key_share, &group_id) || //
912
+ group_id == 0 || group_id > 0xffff ||
913
+ !CBS_get_asn1(&key_share, &public_key, CBS_ASN1_OCTETSTRING) ||
914
+ !hints_obj->key_share_public_key.CopyFrom(public_key) ||
915
+ !CBS_get_asn1(&key_share, &secret, CBS_ASN1_OCTETSTRING) ||
916
+ !hints_obj->key_share_secret.CopyFrom(secret)) {
917
+ OPENSSL_PUT_ERROR(SSL, SSL_R_COULD_NOT_PARSE_HINTS);
918
+ return 0;
919
+ }
920
+ hints_obj->key_share_group_id = static_cast<uint16_t>(group_id);
921
+ }
922
+
923
+ if (has_signature_hint) {
924
+ uint64_t sig_alg;
925
+ CBS input, spki, signature;
926
+ if (!CBS_get_asn1_uint64(&signature_hint, &sig_alg) || //
927
+ sig_alg == 0 || sig_alg > 0xffff ||
928
+ !CBS_get_asn1(&signature_hint, &input, CBS_ASN1_OCTETSTRING) ||
929
+ !hints_obj->signature_input.CopyFrom(input) ||
930
+ !CBS_get_asn1(&signature_hint, &spki, CBS_ASN1_OCTETSTRING) ||
931
+ !hints_obj->signature_spki.CopyFrom(spki) ||
932
+ !CBS_get_asn1(&signature_hint, &signature, CBS_ASN1_OCTETSTRING) ||
933
+ !hints_obj->signature.CopyFrom(signature)) {
934
+ OPENSSL_PUT_ERROR(SSL, SSL_R_COULD_NOT_PARSE_HINTS);
935
+ return 0;
936
+ }
937
+ hints_obj->signature_algorithm = static_cast<uint16_t>(sig_alg);
938
+ }
939
+
940
+ if (has_ticket && !hints_obj->decrypted_psk.CopyFrom(ticket)) {
941
+ return 0;
942
+ }
943
+
944
+ if (has_ignore_psk) {
945
+ if (CBS_len(&ignore_psk) != 0) {
946
+ return 0;
947
+ }
948
+ hints_obj->ignore_psk = true;
949
+ }
950
+
951
+ ssl->s3->hs->hints = std::move(hints_obj);
952
+ return 1;
953
+ }
@@ -126,6 +126,7 @@ BSSL_NAMESPACE_BEGIN
126
126
 
127
127
  SSL_HANDSHAKE::SSL_HANDSHAKE(SSL *ssl_arg)
128
128
  : ssl(ssl_arg),
129
+ ech_accept(false),
129
130
  ech_present(false),
130
131
  ech_is_inner_present(false),
131
132
  scts_requested(false),
@@ -148,6 +149,7 @@ SSL_HANDSHAKE::SSL_HANDSHAKE(SSL *ssl_arg)
148
149
  pending_private_key_op(false),
149
150
  grease_seeded(false),
150
151
  handback(false),
152
+ hints_requested(false),
151
153
  cert_compression_negotiated(false),
152
154
  apply_jdk11_workaround(false) {
153
155
  assert(ssl);
@@ -164,6 +166,28 @@ void SSL_HANDSHAKE::ResizeSecrets(size_t hash_len) {
164
166
  hash_len_ = hash_len;
165
167
  }
166
168
 
169
+ bool SSL_HANDSHAKE::GetClientHello(SSLMessage *out_msg,
170
+ SSL_CLIENT_HELLO *out_client_hello) {
171
+ if (!ech_client_hello_buf.empty()) {
172
+ // If the backing buffer is non-empty, the ClientHelloInner has been set.
173
+ out_msg->is_v2_hello = false;
174
+ out_msg->type = SSL3_MT_CLIENT_HELLO;
175
+ out_msg->raw = CBS(ech_client_hello_buf);
176
+ out_msg->body = MakeConstSpan(ech_client_hello_buf).subspan(4);
177
+ } else if (!ssl->method->get_message(ssl, out_msg)) {
178
+ // The message has already been read, so this cannot fail.
179
+ OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
180
+ return false;
181
+ }
182
+
183
+ if (!ssl_client_hello_init(ssl, out_client_hello, out_msg->body)) {
184
+ OPENSSL_PUT_ERROR(SSL, SSL_R_CLIENTHELLO_PARSE_FAILED);
185
+ ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
186
+ return false;
187
+ }
188
+ return true;
189
+ }
190
+
167
191
  UniquePtr<SSL_HANDSHAKE> ssl_handshake_new(SSL *ssl) {
168
192
  UniquePtr<SSL_HANDSHAKE> hs = MakeUnique<SSL_HANDSHAKE>(ssl);
169
193
  if (!hs || !hs->transcript.Init()) {
@@ -552,7 +576,11 @@ const SSL_SESSION *ssl_handshake_session(const SSL_HANDSHAKE *hs) {
552
576
  int ssl_run_handshake(SSL_HANDSHAKE *hs, bool *out_early_return) {
553
577
  SSL *const ssl = hs->ssl;
554
578
  for (;;) {
555
- // Resolve the operation the handshake was waiting on.
579
+ // Resolve the operation the handshake was waiting on. Each condition may
580
+ // halt the handshake by returning, or continue executing if the handshake
581
+ // may immediately proceed. Cases which halt the handshake can clear
582
+ // |hs->wait| to re-enter the state machine on the next iteration, or leave
583
+ // it set to keep the condition sticky.
556
584
  switch (hs->wait) {
557
585
  case ssl_hs_error:
558
586
  ERR_restore_state(hs->error.get());
@@ -570,13 +598,13 @@ int ssl_run_handshake(SSL_HANDSHAKE *hs, bool *out_early_return) {
570
598
  case ssl_hs_read_message:
571
599
  case ssl_hs_read_change_cipher_spec: {
572
600
  if (ssl->quic_method) {
601
+ // QUIC has no ChangeCipherSpec messages.
602
+ assert(hs->wait != ssl_hs_read_change_cipher_spec);
603
+ // The caller should call |SSL_provide_quic_data|. Clear |hs->wait| so
604
+ // the handshake can check if there is sufficient data next iteration.
605
+ ssl->s3->rwstate = SSL_ERROR_WANT_READ;
573
606
  hs->wait = ssl_hs_ok;
574
- // The change cipher spec is omitted in QUIC.
575
- if (hs->wait != ssl_hs_read_change_cipher_spec) {
576
- ssl->s3->rwstate = SSL_ERROR_WANT_READ;
577
- return -1;
578
- }
579
- break;
607
+ return -1;
580
608
  }
581
609
 
582
610
  uint8_t alert = SSL_AD_DECODE_ERROR;
@@ -646,31 +674,30 @@ int ssl_run_handshake(SSL_HANDSHAKE *hs, bool *out_early_return) {
646
674
  return -1;
647
675
  }
648
676
 
677
+ // The following cases are associated with callback APIs which expect to
678
+ // be called each time the state machine runs. Thus they set |hs->wait|
679
+ // to |ssl_hs_ok| so that, next time, we re-enter the state machine and
680
+ // call the callback again.
649
681
  case ssl_hs_x509_lookup:
650
682
  ssl->s3->rwstate = SSL_ERROR_WANT_X509_LOOKUP;
651
683
  hs->wait = ssl_hs_ok;
652
684
  return -1;
653
-
654
685
  case ssl_hs_channel_id_lookup:
655
686
  ssl->s3->rwstate = SSL_ERROR_WANT_CHANNEL_ID_LOOKUP;
656
687
  hs->wait = ssl_hs_ok;
657
688
  return -1;
658
-
659
689
  case ssl_hs_private_key_operation:
660
690
  ssl->s3->rwstate = SSL_ERROR_WANT_PRIVATE_KEY_OPERATION;
661
691
  hs->wait = ssl_hs_ok;
662
692
  return -1;
663
-
664
693
  case ssl_hs_pending_session:
665
694
  ssl->s3->rwstate = SSL_ERROR_PENDING_SESSION;
666
695
  hs->wait = ssl_hs_ok;
667
696
  return -1;
668
-
669
697
  case ssl_hs_pending_ticket:
670
698
  ssl->s3->rwstate = SSL_ERROR_PENDING_TICKET;
671
699
  hs->wait = ssl_hs_ok;
672
700
  return -1;
673
-
674
701
  case ssl_hs_certificate_verify:
675
702
  ssl->s3->rwstate = SSL_ERROR_WANT_CERTIFICATE_VERIFY;
676
703
  hs->wait = ssl_hs_ok;
@@ -687,6 +714,10 @@ int ssl_run_handshake(SSL_HANDSHAKE *hs, bool *out_early_return) {
687
714
  hs->wait = ssl_hs_ok;
688
715
  return 1;
689
716
 
717
+ case ssl_hs_hints_ready:
718
+ ssl->s3->rwstate = SSL_ERROR_HANDSHAKE_HINTS_READY;
719
+ return -1;
720
+
690
721
  case ssl_hs_ok:
691
722
  break;
692
723
  }
@@ -154,6 +154,8 @@
154
154
  #include <openssl/bn.h>
155
155
  #include <openssl/bytestring.h>
156
156
  #include <openssl/cipher.h>
157
+ #include <openssl/curve25519.h>
158
+ #include <openssl/digest.h>
157
159
  #include <openssl/ec.h>
158
160
  #include <openssl/ecdsa.h>
159
161
  #include <openssl/err.h>
@@ -167,6 +169,7 @@
167
169
 
168
170
  #include "internal.h"
169
171
  #include "../crypto/internal.h"
172
+ #include "../crypto/hpke/internal.h"
170
173
 
171
174
 
172
175
  BSSL_NAMESPACE_BEGIN
@@ -563,7 +566,7 @@ static enum ssl_hs_wait_t do_read_client_hello(SSL_HANDSHAKE *hs) {
563
566
  }
564
567
 
565
568
  SSL_CLIENT_HELLO client_hello;
566
- if (!ssl_client_hello_init(ssl, &client_hello, msg)) {
569
+ if (!ssl_client_hello_init(ssl, &client_hello, msg.body)) {
567
570
  OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
568
571
  ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
569
572
  return ssl_hs_error;
@@ -581,12 +584,137 @@ static enum ssl_hs_wait_t do_read_client_hello(SSL_HANDSHAKE *hs) {
581
584
  return ssl_hs_handoff;
582
585
  }
583
586
 
587
+ // If the ClientHello contains an encrypted_client_hello extension (and no
588
+ // ech_is_inner extension), act as a client-facing server and attempt to
589
+ // decrypt the ClientHelloInner.
590
+ CBS ech_body;
591
+ if (ssl_client_hello_get_extension(&client_hello, &ech_body,
592
+ TLSEXT_TYPE_encrypted_client_hello)) {
593
+ CBS unused;
594
+ if (ssl_client_hello_get_extension(&client_hello, &unused,
595
+ TLSEXT_TYPE_ech_is_inner)) {
596
+ OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_EXTENSION);
597
+ ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
598
+ return ssl_hs_error;
599
+ }
600
+
601
+ // Parse a ClientECH out of the extension body.
602
+ uint16_t kdf_id, aead_id;
603
+ CBS config_id, enc, payload;
604
+ if (!CBS_get_u16(&ech_body, &kdf_id) || //
605
+ !CBS_get_u16(&ech_body, &aead_id) ||
606
+ !CBS_get_u8_length_prefixed(&ech_body, &config_id) ||
607
+ !CBS_get_u16_length_prefixed(&ech_body, &enc) ||
608
+ !CBS_get_u16_length_prefixed(&ech_body, &payload) ||
609
+ CBS_len(&ech_body) != 0) {
610
+ OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
611
+ ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
612
+ return ssl_hs_error;
613
+ }
614
+
615
+ {
616
+ MutexReadLock lock(&ssl->ctx->lock);
617
+ hs->ech_server_config_list = UpRef(ssl->ctx->ech_server_config_list);
618
+ }
619
+
620
+ if (hs->ech_server_config_list) {
621
+ for (const ECHServerConfig &ech_config :
622
+ hs->ech_server_config_list->configs) {
623
+ // Skip this config if the client-provided config_id does not match or
624
+ // if the client indicated an unsupported HPKE ciphersuite.
625
+ if (config_id != ech_config.config_id_sha256() ||
626
+ !ech_config.SupportsCipherSuite(kdf_id, aead_id)) {
627
+ continue;
628
+ }
629
+
630
+ static const uint8_t kInfoLabel[] = "tls ech";
631
+ ScopedCBB info_cbb;
632
+ if (!CBB_init(info_cbb.get(),
633
+ sizeof(kInfoLabel) + ech_config.raw().size()) ||
634
+ !CBB_add_bytes(info_cbb.get(), kInfoLabel,
635
+ sizeof(kInfoLabel) /* includes trailing NUL */) ||
636
+ !CBB_add_bytes(info_cbb.get(), ech_config.raw().data(),
637
+ ech_config.raw().size())) {
638
+ OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
639
+ return ssl_hs_error;
640
+ }
641
+
642
+ // Set up a fresh HPKE context for each decryption attempt.
643
+ hs->ech_hpke_ctx.Reset();
644
+
645
+ if (CBS_len(&enc) != X25519_PUBLIC_VALUE_LEN ||
646
+ !EVP_HPKE_CTX_setup_base_r_x25519(
647
+ hs->ech_hpke_ctx.get(), kdf_id, aead_id, CBS_data(&enc),
648
+ CBS_len(&enc), ech_config.public_key().data(),
649
+ ech_config.public_key().size(), ech_config.private_key().data(),
650
+ ech_config.private_key().size(), CBB_data(info_cbb.get()),
651
+ CBB_len(info_cbb.get()))) {
652
+ // Ignore the error and try another ECHConfig.
653
+ ERR_clear_error();
654
+ continue;
655
+ }
656
+ Array<uint8_t> encoded_client_hello_inner;
657
+ bool is_decrypt_error;
658
+ if (!ssl_client_hello_decrypt(hs->ech_hpke_ctx.get(),
659
+ &encoded_client_hello_inner,
660
+ &is_decrypt_error, &client_hello, kdf_id,
661
+ aead_id, config_id, enc, payload)) {
662
+ if (is_decrypt_error) {
663
+ // Ignore the error and try another ECHConfig.
664
+ ERR_clear_error();
665
+ continue;
666
+ }
667
+ OPENSSL_PUT_ERROR(SSL, SSL_R_DECRYPTION_FAILED);
668
+ return ssl_hs_error;
669
+ }
670
+
671
+ // Recover the ClientHelloInner from the EncodedClientHelloInner.
672
+ uint8_t alert = SSL_AD_DECODE_ERROR;
673
+ bssl::Array<uint8_t> client_hello_inner;
674
+ if (!ssl_decode_client_hello_inner(ssl, &alert, &client_hello_inner,
675
+ encoded_client_hello_inner,
676
+ &client_hello)) {
677
+ ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
678
+ OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
679
+ return ssl_hs_error;
680
+ }
681
+ hs->ech_client_hello_buf = std::move(client_hello_inner);
682
+
683
+ // Load the ClientHelloInner into |client_hello|.
684
+ if (!hs->GetClientHello(&msg, &client_hello)) {
685
+ OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
686
+ return ssl_hs_error;
687
+ }
688
+
689
+ hs->ech_accept = true;
690
+ break;
691
+ }
692
+ }
693
+
694
+ // If we did not set |hs->ech_accept| to true, we will send the current
695
+ // ECHConfigs as retry_configs in the ServerHello's encrypted extensions.
696
+ // Proceed with the ClientHelloOuter.
697
+ }
698
+
584
699
  uint8_t alert = SSL_AD_DECODE_ERROR;
585
700
  if (!extract_sni(hs, &alert, &client_hello)) {
586
701
  ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
587
702
  return ssl_hs_error;
588
703
  }
589
704
 
705
+ hs->state = state12_read_client_hello_after_ech;
706
+ return ssl_hs_ok;
707
+ }
708
+
709
+ static enum ssl_hs_wait_t do_read_client_hello_after_ech(SSL_HANDSHAKE *hs) {
710
+ SSL *const ssl = hs->ssl;
711
+
712
+ SSLMessage msg_unused;
713
+ SSL_CLIENT_HELLO client_hello;
714
+ if (!hs->GetClientHello(&msg_unused, &client_hello)) {
715
+ return ssl_hs_error;
716
+ }
717
+
590
718
  // Run the early callback.
591
719
  if (ssl->ctx->select_certificate_cb != NULL) {
592
720
  switch (ssl->ctx->select_certificate_cb(&client_hello)) {
@@ -614,6 +742,7 @@ static enum ssl_hs_wait_t do_read_client_hello(SSL_HANDSHAKE *hs) {
614
742
  hs->apply_jdk11_workaround = true;
615
743
  }
616
744
 
745
+ uint8_t alert = SSL_AD_DECODE_ERROR;
617
746
  if (!negotiate_version(hs, &alert, &client_hello)) {
618
747
  ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
619
748
  return ssl_hs_error;
@@ -657,11 +786,6 @@ static enum ssl_hs_wait_t do_read_client_hello(SSL_HANDSHAKE *hs) {
657
786
  static enum ssl_hs_wait_t do_select_certificate(SSL_HANDSHAKE *hs) {
658
787
  SSL *const ssl = hs->ssl;
659
788
 
660
- SSLMessage msg;
661
- if (!ssl->method->get_message(ssl, &msg)) {
662
- return ssl_hs_read_message;
663
- }
664
-
665
789
  // Call |cert_cb| to update server certificates if required.
666
790
  if (hs->config->cert->cert_cb != NULL) {
667
791
  int rv = hs->config->cert->cert_cb(ssl, hs->config->cert->cert_cb_arg);
@@ -701,10 +825,22 @@ static enum ssl_hs_wait_t do_select_certificate(SSL_HANDSHAKE *hs) {
701
825
  return ssl_hs_ok;
702
826
  }
703
827
 
828
+ // It should not be possible to negotiate TLS 1.2 with ECH. The
829
+ // ClientHelloInner decoding function rejects ClientHellos which offer TLS 1.2
830
+ // or below.
831
+ assert(!hs->ech_accept);
832
+
833
+ // TODO(davidben): Also compute hints for TLS 1.2. When doing so, update the
834
+ // check in bssl_shim.cc to test this.
835
+ if (hs->hints_requested) {
836
+ return ssl_hs_hints_ready;
837
+ }
838
+
704
839
  ssl->s3->early_data_reason = ssl_early_data_protocol_version;
705
840
 
841
+ SSLMessage msg_unused;
706
842
  SSL_CLIENT_HELLO client_hello;
707
- if (!ssl_client_hello_init(ssl, &client_hello, msg)) {
843
+ if (!hs->GetClientHello(&msg_unused, &client_hello)) {
708
844
  return ssl_hs_error;
709
845
  }
710
846
 
@@ -743,7 +879,7 @@ static enum ssl_hs_wait_t do_select_parameters(SSL_HANDSHAKE *hs) {
743
879
  }
744
880
 
745
881
  SSL_CLIENT_HELLO client_hello;
746
- if (!ssl_client_hello_init(ssl, &client_hello, msg)) {
882
+ if (!ssl_client_hello_init(ssl, &client_hello, msg.body)) {
747
883
  return ssl_hs_error;
748
884
  }
749
885
 
@@ -1693,6 +1829,9 @@ enum ssl_hs_wait_t ssl_server_handshake(SSL_HANDSHAKE *hs) {
1693
1829
  case state12_read_client_hello:
1694
1830
  ret = do_read_client_hello(hs);
1695
1831
  break;
1832
+ case state12_read_client_hello_after_ech:
1833
+ ret = do_read_client_hello_after_ech(hs);
1834
+ break;
1696
1835
  case state12_select_certificate:
1697
1836
  ret = do_select_certificate(hs);
1698
1837
  break;
@@ -1773,6 +1912,8 @@ const char *ssl_server_handshake_state(SSL_HANDSHAKE *hs) {
1773
1912
  return "TLS server start_accept";
1774
1913
  case state12_read_client_hello:
1775
1914
  return "TLS server read_client_hello";
1915
+ case state12_read_client_hello_after_ech:
1916
+ return "TLS server read_client_hello_after_ech";
1776
1917
  case state12_select_certificate:
1777
1918
  return "TLS server select_certificate";
1778
1919
  case state12_tls13: