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
@@ -152,6 +152,7 @@
152
152
  #include <utility>
153
153
 
154
154
  #include <openssl/aead.h>
155
+ #include <openssl/curve25519.h>
155
156
  #include <openssl/err.h>
156
157
  #include <openssl/lhash.h>
157
158
  #include <openssl/mem.h>
@@ -161,6 +162,7 @@
161
162
 
162
163
  #include "../crypto/err/internal.h"
163
164
  #include "../crypto/internal.h"
165
+ #include "../crypto/hpke/internal.h"
164
166
 
165
167
 
166
168
  #if defined(OPENSSL_WINDOWS)
@@ -378,6 +380,8 @@ class GrowableArray {
378
380
  return *this;
379
381
  }
380
382
 
383
+ const T *data() const { return array_.data(); }
384
+ T *data() { return array_.data(); }
381
385
  size_t size() const { return size_; }
382
386
  bool empty() const { return size_ == 0; }
383
387
 
@@ -1066,6 +1070,10 @@ class SSLKeyShare {
1066
1070
  // |Serialize|.
1067
1071
  static UniquePtr<SSLKeyShare> Create(CBS *in);
1068
1072
 
1073
+ // Serializes writes the group ID and private key, in a format that can be
1074
+ // read by |Create|.
1075
+ bool Serialize(CBB *out);
1076
+
1069
1077
  // GroupID returns the group ID.
1070
1078
  virtual uint16_t GroupID() const PURE_VIRTUAL;
1071
1079
 
@@ -1090,13 +1098,13 @@ class SSLKeyShare {
1090
1098
  virtual bool Finish(Array<uint8_t> *out_secret, uint8_t *out_alert,
1091
1099
  Span<const uint8_t> peer_key) PURE_VIRTUAL;
1092
1100
 
1093
- // Serialize writes the state of the key exchange to |out|, returning true if
1094
- // successful and false otherwise.
1095
- virtual bool Serialize(CBB *out) { return false; }
1101
+ // SerializePrivateKey writes the private key to |out|, returning true if
1102
+ // successful and false otherwise. It should be called after |Offer|.
1103
+ virtual bool SerializePrivateKey(CBB *out) { return false; }
1096
1104
 
1097
- // Deserialize initializes the state of the key exchange from |in|, returning
1098
- // true if successful and false otherwise. It is called by |Create|.
1099
- virtual bool Deserialize(CBS *in) { return false; }
1105
+ // DeserializePrivateKey initializes the state of the key exchange from |in|,
1106
+ // returning true if successful and false otherwise.
1107
+ virtual bool DeserializePrivateKey(CBS *in) { return false; }
1100
1108
  };
1101
1109
 
1102
1110
  struct NamedGroup {
@@ -1419,7 +1427,88 @@ bool tls13_verify_psk_binder(SSL_HANDSHAKE *hs, SSL_SESSION *session,
1419
1427
  const SSLMessage &msg, CBS *binders);
1420
1428
 
1421
1429
 
1422
- // Encrypted Client Hello.
1430
+ // Encrypted ClientHello.
1431
+
1432
+ class ECHServerConfig {
1433
+ public:
1434
+ ECHServerConfig() : is_retry_config_(false), initialized_(false) {}
1435
+ ECHServerConfig(ECHServerConfig &&other) = default;
1436
+ ~ECHServerConfig() = default;
1437
+ ECHServerConfig &operator=(ECHServerConfig &&) = default;
1438
+
1439
+ // Init parses |ech_config| as an ECHConfig and saves a copy of |private_key|.
1440
+ // It returns true on success and false on error. It will also error if
1441
+ // |private_key| is not a valid X25519 private key or it does not correspond
1442
+ // to the parsed public key.
1443
+ bool Init(Span<const uint8_t> ech_config, Span<const uint8_t> private_key,
1444
+ bool is_retry_config);
1445
+
1446
+ // SupportsCipherSuite returns true when this ECHConfig supports the HPKE
1447
+ // ciphersuite composed of |kdf_id| and |aead_id|. This function must only be
1448
+ // called on an initialized object.
1449
+ bool SupportsCipherSuite(uint16_t kdf_id, uint16_t aead_id) const;
1450
+
1451
+ Span<const uint8_t> raw() const {
1452
+ assert(initialized_);
1453
+ return raw_;
1454
+ }
1455
+ Span<const uint8_t> public_key() const {
1456
+ assert(initialized_);
1457
+ return public_key_;
1458
+ }
1459
+ Span<const uint8_t> private_key() const {
1460
+ assert(initialized_);
1461
+ return MakeConstSpan(private_key_, sizeof(private_key_));
1462
+ }
1463
+ Span<const uint8_t> config_id_sha256() const {
1464
+ assert(initialized_);
1465
+ return MakeConstSpan(config_id_sha256_, sizeof(config_id_sha256_));
1466
+ }
1467
+ bool is_retry_config() const {
1468
+ assert(initialized_);
1469
+ return is_retry_config_;
1470
+ }
1471
+
1472
+ private:
1473
+ Array<uint8_t> raw_;
1474
+ Span<const uint8_t> public_key_;
1475
+ Span<const uint8_t> cipher_suites_;
1476
+
1477
+ // private_key_ is the key corresponding to |public_key|. For clients, it must
1478
+ // be empty (|private_key_present_ == false|). For servers, it must be a valid
1479
+ // X25519 private key.
1480
+ uint8_t private_key_[X25519_PRIVATE_KEY_LEN];
1481
+
1482
+ // config_id_ stores the precomputed result of |ConfigID| for
1483
+ // |EVP_HPKE_HKDF_SHA256|.
1484
+ uint8_t config_id_sha256_[8];
1485
+
1486
+ bool is_retry_config_ : 1;
1487
+ bool initialized_ : 1;
1488
+ };
1489
+
1490
+ // ssl_decode_client_hello_inner recovers the full ClientHelloInner from the
1491
+ // EncodedClientHelloInner |encoded_client_hello_inner| by replacing its
1492
+ // outer_extensions extension with the referenced extensions from the
1493
+ // ClientHelloOuter |client_hello_outer|. If successful, it writes the recovered
1494
+ // ClientHelloInner to |out_client_hello_inner|. It returns true on success and
1495
+ // false on failure.
1496
+ OPENSSL_EXPORT bool ssl_decode_client_hello_inner(
1497
+ SSL *ssl, uint8_t *out_alert, Array<uint8_t> *out_client_hello_inner,
1498
+ Span<const uint8_t> encoded_client_hello_inner,
1499
+ const SSL_CLIENT_HELLO *client_hello_outer);
1500
+
1501
+ // ssl_client_hello_decrypt attempts to decrypt the given |payload| into
1502
+ // |out_encoded_client_hello_inner|. The decrypted value should be an
1503
+ // EncodedClientHelloInner. It returns false if any fatal errors occur and true
1504
+ // otherwise, regardless of whether the decrypt was successful. It sets
1505
+ // |out_encoded_client_hello_inner| to true if the decryption fails, and false
1506
+ // otherwise.
1507
+ bool ssl_client_hello_decrypt(
1508
+ EVP_HPKE_CTX *hpke_ctx, Array<uint8_t> *out_encoded_client_hello_inner,
1509
+ bool *out_is_decrypt_error, const SSL_CLIENT_HELLO *client_hello_outer,
1510
+ uint16_t kdf_id, uint16_t aead_id, Span<const uint8_t> config_id,
1511
+ Span<const uint8_t> enc, Span<const uint8_t> payload);
1423
1512
 
1424
1513
  // tls13_ech_accept_confirmation computes the server's ECH acceptance signal,
1425
1514
  // writing it to |out|. It returns true on success, and false on failure.
@@ -1428,6 +1517,45 @@ bool tls13_ech_accept_confirmation(
1428
1517
  bssl::Span<const uint8_t> server_hello_ech_conf);
1429
1518
 
1430
1519
 
1520
+ // Delegated credentials.
1521
+
1522
+ // This structure stores a delegated credential (DC) as defined by
1523
+ // draft-ietf-tls-subcerts-03.
1524
+ struct DC {
1525
+ static constexpr bool kAllowUniquePtr = true;
1526
+ ~DC();
1527
+
1528
+ // Dup returns a copy of this DC and takes references to |raw| and |pkey|.
1529
+ UniquePtr<DC> Dup();
1530
+
1531
+ // Parse parses the delegated credential stored in |in|. If successful it
1532
+ // returns the parsed structure, otherwise it returns |nullptr| and sets
1533
+ // |*out_alert|.
1534
+ static UniquePtr<DC> Parse(CRYPTO_BUFFER *in, uint8_t *out_alert);
1535
+
1536
+ // raw is the delegated credential encoded as specified in draft-ietf-tls-
1537
+ // subcerts-03.
1538
+ UniquePtr<CRYPTO_BUFFER> raw;
1539
+
1540
+ // expected_cert_verify_algorithm is the signature scheme of the DC public
1541
+ // key.
1542
+ uint16_t expected_cert_verify_algorithm = 0;
1543
+
1544
+ // pkey is the public key parsed from |public_key|.
1545
+ UniquePtr<EVP_PKEY> pkey;
1546
+
1547
+ private:
1548
+ friend DC* New<DC>();
1549
+ DC();
1550
+ };
1551
+
1552
+ // ssl_signing_with_dc returns true if the peer has indicated support for
1553
+ // delegated credentials and this host has sent a delegated credential in
1554
+ // response. If this is true then we've committed to using the DC in the
1555
+ // handshake.
1556
+ bool ssl_signing_with_dc(const SSL_HANDSHAKE *hs);
1557
+
1558
+
1431
1559
  // Handshake functions.
1432
1560
 
1433
1561
  enum ssl_hs_wait_t {
@@ -1449,6 +1577,7 @@ enum ssl_hs_wait_t {
1449
1577
  ssl_hs_read_end_of_early_data,
1450
1578
  ssl_hs_read_change_cipher_spec,
1451
1579
  ssl_hs_certificate_verify,
1580
+ ssl_hs_hints_ready,
1452
1581
  };
1453
1582
 
1454
1583
  enum ssl_grease_index_t {
@@ -1464,6 +1593,7 @@ enum ssl_grease_index_t {
1464
1593
  enum tls12_server_hs_state_t {
1465
1594
  state12_start_accept = 0,
1466
1595
  state12_read_client_hello,
1596
+ state12_read_client_hello_after_ech,
1467
1597
  state12_select_certificate,
1468
1598
  state12_tls13,
1469
1599
  state12_select_parameters,
@@ -1515,46 +1645,26 @@ enum handback_t {
1515
1645
  handback_max_value = handback_tls13,
1516
1646
  };
1517
1647
 
1518
-
1519
- // Delegated credentials.
1520
-
1521
- // This structure stores a delegated credential (DC) as defined by
1522
- // draft-ietf-tls-subcerts-03.
1523
- struct DC {
1648
+ // SSL_HANDSHAKE_HINTS contains handshake hints for a connection. See
1649
+ // |SSL_request_handshake_hints| and related functions.
1650
+ struct SSL_HANDSHAKE_HINTS {
1524
1651
  static constexpr bool kAllowUniquePtr = true;
1525
- ~DC();
1526
1652
 
1527
- // Dup returns a copy of this DC and takes references to |raw| and |pkey|.
1528
- UniquePtr<DC> Dup();
1653
+ Array<uint8_t> server_random;
1529
1654
 
1530
- // Parse parses the delegated credential stored in |in|. If successful it
1531
- // returns the parsed structure, otherwise it returns |nullptr| and sets
1532
- // |*out_alert|.
1533
- static UniquePtr<DC> Parse(CRYPTO_BUFFER *in, uint8_t *out_alert);
1655
+ uint16_t key_share_group_id = 0;
1656
+ Array<uint8_t> key_share_public_key;
1657
+ Array<uint8_t> key_share_secret;
1534
1658
 
1535
- // raw is the delegated credential encoded as specified in draft-ietf-tls-
1536
- // subcerts-03.
1537
- UniquePtr<CRYPTO_BUFFER> raw;
1659
+ uint16_t signature_algorithm = 0;
1660
+ Array<uint8_t> signature_input;
1661
+ Array<uint8_t> signature_spki;
1662
+ Array<uint8_t> signature;
1538
1663
 
1539
- // expected_cert_verify_algorithm is the signature scheme of the DC public
1540
- // key.
1541
- uint16_t expected_cert_verify_algorithm = 0;
1542
-
1543
- // pkey is the public key parsed from |public_key|.
1544
- UniquePtr<EVP_PKEY> pkey;
1545
-
1546
- private:
1547
- friend DC* New<DC>();
1548
- DC();
1664
+ Array<uint8_t> decrypted_psk;
1665
+ bool ignore_psk = false;
1549
1666
  };
1550
1667
 
1551
- // ssl_signing_with_dc returns true if the peer has indicated support for
1552
- // delegated credentials and this host has sent a delegated credential in
1553
- // response. If this is true then we've committed to using the DC in the
1554
- // handshake.
1555
- bool ssl_signing_with_dc(const SSL_HANDSHAKE *hs);
1556
-
1557
-
1558
1668
  struct SSL_HANDSHAKE {
1559
1669
  explicit SSL_HANDSHAKE(SSL *ssl);
1560
1670
  ~SSL_HANDSHAKE();
@@ -1599,6 +1709,17 @@ struct SSL_HANDSHAKE {
1599
1709
  public:
1600
1710
  void ResizeSecrets(size_t hash_len);
1601
1711
 
1712
+ // GetClientHello, on the server, returns either the normal ClientHello
1713
+ // message or the ClientHelloInner if it has been serialized to
1714
+ // |ech_client_hello_buf|. This function should only be called when the
1715
+ // current message is a ClientHello. It returns true on success and false on
1716
+ // error.
1717
+ //
1718
+ // Note that fields of the returned |out_msg| and |out_client_hello| point
1719
+ // into a handshake-owned buffer, so their lifetimes should not exceed this
1720
+ // SSL_HANDSHAKE.
1721
+ bool GetClientHello(SSLMessage *out_msg, SSL_CLIENT_HELLO *out_client_hello);
1722
+
1602
1723
  Span<uint8_t> secret() { return MakeSpan(secret_, hash_len_); }
1603
1724
  Span<uint8_t> early_traffic_secret() {
1604
1725
  return MakeSpan(early_traffic_secret_, hash_len_);
@@ -1651,6 +1772,10 @@ struct SSL_HANDSHAKE {
1651
1772
  // the first ClientHello.
1652
1773
  Array<uint8_t> ech_grease;
1653
1774
 
1775
+ // ech_client_hello_buf, on the server, contains the bytes of the
1776
+ // reconstructed ClientHelloInner message.
1777
+ Array<uint8_t> ech_client_hello_buf;
1778
+
1654
1779
  // key_share_bytes is the value of the previously sent KeyShare extension by
1655
1780
  // the client in TLS 1.3.
1656
1781
  Array<uint8_t> key_share_bytes;
@@ -1687,6 +1812,10 @@ struct SSL_HANDSHAKE {
1687
1812
  // |cert_compression_negotiated| is true.
1688
1813
  uint16_t cert_compression_alg_id;
1689
1814
 
1815
+ // ech_hpke_ctx, on the server, is the HPKE context used to decrypt the
1816
+ // client's ECH payloads.
1817
+ ScopedEVP_HPKE_CTX ech_hpke_ctx;
1818
+
1690
1819
  // server_params, in a TLS 1.2 server, stores the ServerKeyExchange
1691
1820
  // parameters. It has client and server randoms prepended for signing
1692
1821
  // convenience.
@@ -1723,12 +1852,28 @@ struct SSL_HANDSHAKE {
1723
1852
  // the client if |in_early_data| is true.
1724
1853
  UniquePtr<SSL_SESSION> early_session;
1725
1854
 
1855
+ // ech_server_config_list, for servers, is the list of ECHConfig values that
1856
+ // were valid when the server received the first ClientHello. Its value will
1857
+ // not change when the config list on |SSL_CTX| is updated.
1858
+ UniquePtr<SSL_ECH_SERVER_CONFIG_LIST> ech_server_config_list;
1859
+
1726
1860
  // new_cipher is the cipher being negotiated in this handshake.
1727
1861
  const SSL_CIPHER *new_cipher = nullptr;
1728
1862
 
1729
1863
  // key_block is the record-layer key block for TLS 1.2 and earlier.
1730
1864
  Array<uint8_t> key_block;
1731
1865
 
1866
+ // hints contains the handshake hints for this connection. If
1867
+ // |hints_requested| is true, this field is non-null and contains the pending
1868
+ // hints to filled as the predicted handshake progresses. Otherwise, this
1869
+ // field, if non-null, contains hints configured by the caller and will
1870
+ // influence the handshake on match.
1871
+ UniquePtr<SSL_HANDSHAKE_HINTS> hints;
1872
+
1873
+ // ech_accept, on the server, indicates whether the server should overwrite
1874
+ // part of ServerHello.random with the ECH accept_confirmation value.
1875
+ bool ech_accept : 1;
1876
+
1732
1877
  // ech_present, on the server, indicates whether the ClientHello contained an
1733
1878
  // encrypted_client_hello extension.
1734
1879
  bool ech_present : 1;
@@ -1814,6 +1959,11 @@ struct SSL_HANDSHAKE {
1814
1959
  // |SSL_apply_handoff|.
1815
1960
  bool handback : 1;
1816
1961
 
1962
+ // hints_requested indicates the caller has requested handshake hints. Only
1963
+ // the first round-trip of the handshake will complete, after which the
1964
+ // |hints| structure can be serialized.
1965
+ bool hints_requested : 1;
1966
+
1817
1967
  // cert_compression_negotiated is true iff |cert_compression_alg_id| is valid.
1818
1968
  bool cert_compression_negotiated : 1;
1819
1969
 
@@ -1901,10 +2051,10 @@ bool ssl_ext_key_share_parse_serverhello(SSL_HANDSHAKE *hs,
1901
2051
  Array<uint8_t> *out_secret,
1902
2052
  uint8_t *out_alert, CBS *contents);
1903
2053
  bool ssl_ext_key_share_parse_clienthello(SSL_HANDSHAKE *hs, bool *out_found,
1904
- Array<uint8_t> *out_secret,
1905
- uint8_t *out_alert, CBS *contents);
1906
- bool ssl_ext_key_share_add_serverhello(SSL_HANDSHAKE *hs, CBB *out,
1907
- bool dry_run);
2054
+ Span<const uint8_t> *out_peer_key,
2055
+ uint8_t *out_alert,
2056
+ const SSL_CLIENT_HELLO *client_hello);
2057
+ bool ssl_ext_key_share_add_serverhello(SSL_HANDSHAKE *hs, CBB *out);
1908
2058
 
1909
2059
  bool ssl_ext_pre_shared_key_parse_serverhello(SSL_HANDSHAKE *hs,
1910
2060
  uint8_t *out_alert,
@@ -1935,6 +2085,9 @@ bool tls13_get_cert_verify_signature_input(
1935
2085
  SSL_HANDSHAKE *hs, Array<uint8_t> *out,
1936
2086
  enum ssl_cert_verify_context_t cert_verify_context);
1937
2087
 
2088
+ // ssl_is_valid_alpn_list returns whether |in| is a valid ALPN protocol list.
2089
+ bool ssl_is_valid_alpn_list(Span<const uint8_t> in);
2090
+
1938
2091
  // ssl_is_alpn_protocol_allowed returns whether |protocol| is a valid server
1939
2092
  // selection for |hs->ssl|'s client preferences.
1940
2093
  bool ssl_is_alpn_protocol_allowed(const SSL_HANDSHAKE *hs,
@@ -1993,8 +2146,11 @@ bool ssl_log_secret(const SSL *ssl, const char *label,
1993
2146
 
1994
2147
  // ClientHello functions.
1995
2148
 
1996
- bool ssl_client_hello_init(const SSL *ssl, SSL_CLIENT_HELLO *out,
1997
- const SSLMessage &msg);
2149
+ // ssl_client_hello_init parses |body| as a ClientHello message, excluding the
2150
+ // message header, and writes the result to |*out|. It returns true on success
2151
+ // and false on error. This function is exported for testing.
2152
+ OPENSSL_EXPORT bool ssl_client_hello_init(const SSL *ssl, SSL_CLIENT_HELLO *out,
2153
+ Span<const uint8_t> body);
1998
2154
 
1999
2155
  bool ssl_client_hello_get_extension(const SSL_CLIENT_HELLO *client_hello,
2000
2156
  CBS *out, uint16_t extension_type);
@@ -3318,6 +3474,11 @@ struct ssl_ctx_st {
3318
3474
  // The client's Channel ID private key.
3319
3475
  bssl::UniquePtr<EVP_PKEY> channel_id_private;
3320
3476
 
3477
+ // ech_server_config_list contains the server's list of ECHConfig values and
3478
+ // associated private keys. This list may be swapped out at any time, so all
3479
+ // access must be synchronized through |lock|.
3480
+ bssl::UniquePtr<SSL_ECH_SERVER_CONFIG_LIST> ech_server_config_list;
3481
+
3321
3482
  // keylog_callback, if not NULL, is the key logging callback. See
3322
3483
  // |SSL_CTX_set_keylog_callback|.
3323
3484
  void (*keylog_callback)(const SSL *ssl, const char *line) = nullptr;
@@ -3631,5 +3792,18 @@ struct ssl_session_st {
3631
3792
  friend void SSL_SESSION_free(SSL_SESSION *);
3632
3793
  };
3633
3794
 
3795
+ struct ssl_ech_server_config_list_st {
3796
+ ssl_ech_server_config_list_st() = default;
3797
+ ssl_ech_server_config_list_st(const ssl_ech_server_config_list_st &) = delete;
3798
+ ssl_ech_server_config_list_st &operator=(
3799
+ const ssl_ech_server_config_list_st &) = delete;
3800
+
3801
+ bssl::GrowableArray<bssl::ECHServerConfig> configs;
3802
+ CRYPTO_refcount_t references = 1;
3803
+
3804
+ private:
3805
+ ~ssl_ech_server_config_list_st() = default;
3806
+ friend void SSL_ECH_SERVER_CONFIG_LIST_free(SSL_ECH_SERVER_CONFIG_LIST *);
3807
+ };
3634
3808
 
3635
3809
  #endif // OPENSSL_HEADER_SSL_INTERNAL_H
@@ -251,7 +251,8 @@ bool tls_flush_pending_hs_data(SSL *ssl) {
251
251
  MakeConstSpan(reinterpret_cast<const uint8_t *>(pending_hs_data->data),
252
252
  pending_hs_data->length);
253
253
  if (ssl->quic_method) {
254
- if (!ssl->quic_method->add_handshake_data(ssl, ssl->s3->write_level,
254
+ if ((ssl->s3->hs == nullptr || !ssl->s3->hs->hints_requested) &&
255
+ !ssl->quic_method->add_handshake_data(ssl, ssl->s3->write_level,
255
256
  data.data(), data.size())) {
256
257
  OPENSSL_PUT_ERROR(SSL, SSL_R_QUIC_INTERNAL_ERROR);
257
258
  return false;
@@ -322,6 +323,11 @@ int tls_flush_flight(SSL *ssl) {
322
323
  }
323
324
  }
324
325
 
326
+ if (ssl->wbio == nullptr) {
327
+ OPENSSL_PUT_ERROR(SSL, SSL_R_BIO_NOT_SET);
328
+ return -1;
329
+ }
330
+
325
331
  // Write the pending flight.
326
332
  while (ssl->s3->pending_flight_offset < ssl->s3->pending_flight->length) {
327
333
  int ret = BIO_write(
@@ -548,13 +548,11 @@ bool ssl_cert_check_key_usage(const CBS *in, enum ssl_key_usage_t bit) {
548
548
  // subjectPublicKeyInfo
549
549
  !CBS_get_asn1(&tbs_cert, NULL, CBS_ASN1_SEQUENCE) ||
550
550
  // issuerUniqueID
551
- !CBS_get_optional_asn1(
552
- &tbs_cert, NULL, NULL,
553
- CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 1) ||
551
+ !CBS_get_optional_asn1(&tbs_cert, NULL, NULL,
552
+ CBS_ASN1_CONTEXT_SPECIFIC | 1) ||
554
553
  // subjectUniqueID
555
- !CBS_get_optional_asn1(
556
- &tbs_cert, NULL, NULL,
557
- CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 2) ||
554
+ !CBS_get_optional_asn1(&tbs_cert, NULL, NULL,
555
+ CBS_ASN1_CONTEXT_SPECIFIC | 2) ||
558
556
  !CBS_get_optional_asn1(
559
557
  &tbs_cert, &outer_extensions, &has_extensions,
560
558
  CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 3)) {
@@ -124,29 +124,17 @@ class ECKeyShare : public SSLKeyShare {
124
124
  return true;
125
125
  }
126
126
 
127
- bool Serialize(CBB *out) override {
127
+ bool SerializePrivateKey(CBB *out) override {
128
128
  assert(private_key_);
129
- CBB cbb;
130
129
  UniquePtr<EC_GROUP> group(EC_GROUP_new_by_curve_name(nid_));
131
130
  // Padding is added to avoid leaking the length.
132
131
  size_t len = BN_num_bytes(EC_GROUP_get0_order(group.get()));
133
- if (!CBB_add_asn1_uint64(out, group_id_) ||
134
- !CBB_add_asn1(out, &cbb, CBS_ASN1_OCTETSTRING) ||
135
- !BN_bn2cbb_padded(&cbb, len, private_key_.get()) ||
136
- !CBB_flush(out)) {
137
- return false;
138
- }
139
- return true;
132
+ return BN_bn2cbb_padded(out, len, private_key_.get());
140
133
  }
141
134
 
142
- bool Deserialize(CBS *in) override {
135
+ bool DeserializePrivateKey(CBS *in) override {
143
136
  assert(!private_key_);
144
- CBS private_key;
145
- if (!CBS_get_asn1(in, &private_key, CBS_ASN1_OCTETSTRING)) {
146
- return false;
147
- }
148
- private_key_.reset(BN_bin2bn(CBS_data(&private_key),
149
- CBS_len(&private_key), nullptr));
137
+ private_key_.reset(BN_bin2bn(CBS_data(in), CBS_len(in), nullptr));
150
138
  return private_key_ != nullptr;
151
139
  }
152
140
 
@@ -189,16 +177,13 @@ class X25519KeyShare : public SSLKeyShare {
189
177
  return true;
190
178
  }
191
179
 
192
- bool Serialize(CBB *out) override {
193
- return (CBB_add_asn1_uint64(out, GroupID()) &&
194
- CBB_add_asn1_octet_string(out, private_key_, sizeof(private_key_)));
180
+ bool SerializePrivateKey(CBB *out) override {
181
+ return CBB_add_bytes(out, private_key_, sizeof(private_key_));
195
182
  }
196
183
 
197
- bool Deserialize(CBS *in) override {
198
- CBS key;
199
- if (!CBS_get_asn1(in, &key, CBS_ASN1_OCTETSTRING) ||
200
- CBS_len(&key) != sizeof(private_key_) ||
201
- !CBS_copy_bytes(&key, private_key_, sizeof(private_key_))) {
184
+ bool DeserializePrivateKey(CBS *in) override {
185
+ if (CBS_len(in) != sizeof(private_key_) ||
186
+ !CBS_copy_bytes(in, private_key_, sizeof(private_key_))) {
202
187
  return false;
203
188
  }
204
189
  return true;
@@ -339,16 +324,28 @@ UniquePtr<SSLKeyShare> SSLKeyShare::Create(uint16_t group_id) {
339
324
 
340
325
  UniquePtr<SSLKeyShare> SSLKeyShare::Create(CBS *in) {
341
326
  uint64_t group;
342
- if (!CBS_get_asn1_uint64(in, &group) || group > 0xffff) {
327
+ CBS private_key;
328
+ if (!CBS_get_asn1_uint64(in, &group) || group > 0xffff ||
329
+ !CBS_get_asn1(in, &private_key, CBS_ASN1_OCTETSTRING)) {
343
330
  return nullptr;
344
331
  }
345
332
  UniquePtr<SSLKeyShare> key_share = Create(static_cast<uint16_t>(group));
346
- if (!key_share || !key_share->Deserialize(in)) {
333
+ if (!key_share || !key_share->DeserializePrivateKey(&private_key)) {
347
334
  return nullptr;
348
335
  }
349
336
  return key_share;
350
337
  }
351
338
 
339
+ bool SSLKeyShare::Serialize(CBB *out) {
340
+ CBB private_key;
341
+ if (!CBB_add_asn1_uint64(out, GroupID()) ||
342
+ !CBB_add_asn1(out, &private_key, CBS_ASN1_OCTETSTRING) ||
343
+ !SerializePrivateKey(&private_key) || //
344
+ !CBB_flush(out)) {
345
+ return false;
346
+ }
347
+ return true;
348
+ }
352
349
 
353
350
  bool SSLKeyShare::Accept(CBB *out_public_key, Array<uint8_t> *out_secret,
354
351
  uint8_t *out_alert, Span<const uint8_t> peer_key) {