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
@@ -70,6 +70,8 @@
70
70
  // this writing, so there is no need for a common collector/padding
71
71
  // implementation yet.
72
72
 
73
+ static int sha512_final_impl(uint8_t *out, SHA512_CTX *sha);
74
+
73
75
  int SHA384_Init(SHA512_CTX *sha) {
74
76
  sha->h[0] = UINT64_C(0xcbbb9d5dc1059ed8);
75
77
  sha->h[1] = UINT64_C(0x629a292a367cd507);
@@ -146,8 +148,8 @@ uint8_t *SHA512_256(const uint8_t *data, size_t len,
146
148
  uint8_t out[SHA512_256_DIGEST_LENGTH]) {
147
149
  SHA512_CTX ctx;
148
150
  SHA512_256_Init(&ctx);
149
- SHA512_Update(&ctx, data, len);
150
- SHA512_Final(out, &ctx);
151
+ SHA512_256_Update(&ctx, data, len);
152
+ SHA512_256_Final(out, &ctx);
151
153
  OPENSSL_cleanse(&ctx, sizeof(ctx));
152
154
  return out;
153
155
  }
@@ -161,7 +163,8 @@ static void sha512_block_data_order(uint64_t *state, const uint8_t *in,
161
163
  int SHA384_Final(uint8_t out[SHA384_DIGEST_LENGTH], SHA512_CTX *sha) {
162
164
  // |SHA384_Init| sets |sha->md_len| to |SHA384_DIGEST_LENGTH|, so this has a
163
165
  // |smaller output.
164
- return SHA512_Final(out, sha);
166
+ assert(sha->md_len == SHA384_DIGEST_LENGTH);
167
+ return sha512_final_impl(out, sha);
165
168
  }
166
169
 
167
170
  int SHA384_Update(SHA512_CTX *sha, const void *data, size_t len) {
@@ -172,11 +175,11 @@ int SHA512_256_Update(SHA512_CTX *sha, const void *data, size_t len) {
172
175
  return SHA512_Update(sha, data, len);
173
176
  }
174
177
 
175
- int SHA512_256_Final(uint8_t out[SHA512_256_DIGEST_LENGTH],
176
- SHA512_CTX *sha) {
178
+ int SHA512_256_Final(uint8_t out[SHA512_256_DIGEST_LENGTH], SHA512_CTX *sha) {
177
179
  // |SHA512_256_Init| sets |sha->md_len| to |SHA512_256_DIGEST_LENGTH|, so this
178
180
  // has a |smaller output.
179
- return SHA512_Final(out, sha);
181
+ assert(sha->md_len == SHA512_256_DIGEST_LENGTH);
182
+ return sha512_final_impl(out, sha);
180
183
  }
181
184
 
182
185
  void SHA512_Transform(SHA512_CTX *c, const uint8_t block[SHA512_CBLOCK]) {
@@ -232,6 +235,15 @@ int SHA512_Update(SHA512_CTX *c, const void *in_data, size_t len) {
232
235
  }
233
236
 
234
237
  int SHA512_Final(uint8_t out[SHA512_DIGEST_LENGTH], SHA512_CTX *sha) {
238
+ // Ideally we would assert |sha->md_len| is |SHA512_DIGEST_LENGTH| to match
239
+ // the size hint, but calling code often pairs |SHA384_Init| with
240
+ // |SHA512_Final| and expects |sha->md_len| to carry the over.
241
+ //
242
+ // TODO(davidben): Add an assert and fix code to match them up.
243
+ return sha512_final_impl(out, sha);
244
+ }
245
+
246
+ static int sha512_final_impl(uint8_t *out, SHA512_CTX *sha) {
235
247
  uint8_t *p = sha->p;
236
248
  size_t n = sha->num;
237
249
 
@@ -244,22 +256,8 @@ int SHA512_Final(uint8_t out[SHA512_DIGEST_LENGTH], SHA512_CTX *sha) {
244
256
  }
245
257
 
246
258
  OPENSSL_memset(p + n, 0, sizeof(sha->p) - 16 - n);
247
- p[sizeof(sha->p) - 1] = (uint8_t)(sha->Nl);
248
- p[sizeof(sha->p) - 2] = (uint8_t)(sha->Nl >> 8);
249
- p[sizeof(sha->p) - 3] = (uint8_t)(sha->Nl >> 16);
250
- p[sizeof(sha->p) - 4] = (uint8_t)(sha->Nl >> 24);
251
- p[sizeof(sha->p) - 5] = (uint8_t)(sha->Nl >> 32);
252
- p[sizeof(sha->p) - 6] = (uint8_t)(sha->Nl >> 40);
253
- p[sizeof(sha->p) - 7] = (uint8_t)(sha->Nl >> 48);
254
- p[sizeof(sha->p) - 8] = (uint8_t)(sha->Nl >> 56);
255
- p[sizeof(sha->p) - 9] = (uint8_t)(sha->Nh);
256
- p[sizeof(sha->p) - 10] = (uint8_t)(sha->Nh >> 8);
257
- p[sizeof(sha->p) - 11] = (uint8_t)(sha->Nh >> 16);
258
- p[sizeof(sha->p) - 12] = (uint8_t)(sha->Nh >> 24);
259
- p[sizeof(sha->p) - 13] = (uint8_t)(sha->Nh >> 32);
260
- p[sizeof(sha->p) - 14] = (uint8_t)(sha->Nh >> 40);
261
- p[sizeof(sha->p) - 15] = (uint8_t)(sha->Nh >> 48);
262
- p[sizeof(sha->p) - 16] = (uint8_t)(sha->Nh >> 56);
259
+ CRYPTO_store_u64_be(p + sizeof(sha->p) - 16, sha->Nh);
260
+ CRYPTO_store_u64_be(p + sizeof(sha->p) - 8, sha->Nl);
263
261
 
264
262
  sha512_block_data_order(sha->h, p, 1);
265
263
 
@@ -356,12 +354,6 @@ static const uint64_t K512[80] = {
356
354
  #define ROTR(x, s) (((x) >> s) | (x) << (64 - s))
357
355
  #endif
358
356
 
359
- static inline uint64_t load_u64_be(const void *ptr) {
360
- uint64_t ret;
361
- OPENSSL_memcpy(&ret, ptr, sizeof(ret));
362
- return CRYPTO_bswap8(ret);
363
- }
364
-
365
357
  #define Sigma0(x) (ROTR((x), 28) ^ ROTR((x), 34) ^ ROTR((x), 39))
366
358
  #define Sigma1(x) (ROTR((x), 14) ^ ROTR((x), 18) ^ ROTR((x), 41))
367
359
  #define sigma0(x) (ROTR((x), 1) ^ ROTR((x), 8) ^ ((x) >> 7))
@@ -392,7 +384,7 @@ static void sha512_block_data_order(uint64_t *state, const uint8_t *in,
392
384
  F[7] = state[7];
393
385
 
394
386
  for (i = 0; i < 16; i++, F--) {
395
- T = load_u64_be(in + i * 8);
387
+ T = CRYPTO_load_u64_be(in + i * 8);
396
388
  F[0] = A;
397
389
  F[4] = E;
398
390
  F[8] = T;
@@ -464,37 +456,37 @@ static void sha512_block_data_order(uint64_t *state, const uint8_t *in,
464
456
  g = state[6];
465
457
  h = state[7];
466
458
 
467
- T1 = X[0] = load_u64_be(in);
459
+ T1 = X[0] = CRYPTO_load_u64_be(in);
468
460
  ROUND_00_15(0, a, b, c, d, e, f, g, h);
469
- T1 = X[1] = load_u64_be(in + 8);
461
+ T1 = X[1] = CRYPTO_load_u64_be(in + 8);
470
462
  ROUND_00_15(1, h, a, b, c, d, e, f, g);
471
- T1 = X[2] = load_u64_be(in + 2 * 8);
463
+ T1 = X[2] = CRYPTO_load_u64_be(in + 2 * 8);
472
464
  ROUND_00_15(2, g, h, a, b, c, d, e, f);
473
- T1 = X[3] = load_u64_be(in + 3 * 8);
465
+ T1 = X[3] = CRYPTO_load_u64_be(in + 3 * 8);
474
466
  ROUND_00_15(3, f, g, h, a, b, c, d, e);
475
- T1 = X[4] = load_u64_be(in + 4 * 8);
467
+ T1 = X[4] = CRYPTO_load_u64_be(in + 4 * 8);
476
468
  ROUND_00_15(4, e, f, g, h, a, b, c, d);
477
- T1 = X[5] = load_u64_be(in + 5 * 8);
469
+ T1 = X[5] = CRYPTO_load_u64_be(in + 5 * 8);
478
470
  ROUND_00_15(5, d, e, f, g, h, a, b, c);
479
- T1 = X[6] = load_u64_be(in + 6 * 8);
471
+ T1 = X[6] = CRYPTO_load_u64_be(in + 6 * 8);
480
472
  ROUND_00_15(6, c, d, e, f, g, h, a, b);
481
- T1 = X[7] = load_u64_be(in + 7 * 8);
473
+ T1 = X[7] = CRYPTO_load_u64_be(in + 7 * 8);
482
474
  ROUND_00_15(7, b, c, d, e, f, g, h, a);
483
- T1 = X[8] = load_u64_be(in + 8 * 8);
475
+ T1 = X[8] = CRYPTO_load_u64_be(in + 8 * 8);
484
476
  ROUND_00_15(8, a, b, c, d, e, f, g, h);
485
- T1 = X[9] = load_u64_be(in + 9 * 8);
477
+ T1 = X[9] = CRYPTO_load_u64_be(in + 9 * 8);
486
478
  ROUND_00_15(9, h, a, b, c, d, e, f, g);
487
- T1 = X[10] = load_u64_be(in + 10 * 8);
479
+ T1 = X[10] = CRYPTO_load_u64_be(in + 10 * 8);
488
480
  ROUND_00_15(10, g, h, a, b, c, d, e, f);
489
- T1 = X[11] = load_u64_be(in + 11 * 8);
481
+ T1 = X[11] = CRYPTO_load_u64_be(in + 11 * 8);
490
482
  ROUND_00_15(11, f, g, h, a, b, c, d, e);
491
- T1 = X[12] = load_u64_be(in + 12 * 8);
483
+ T1 = X[12] = CRYPTO_load_u64_be(in + 12 * 8);
492
484
  ROUND_00_15(12, e, f, g, h, a, b, c, d);
493
- T1 = X[13] = load_u64_be(in + 13 * 8);
485
+ T1 = X[13] = CRYPTO_load_u64_be(in + 13 * 8);
494
486
  ROUND_00_15(13, d, e, f, g, h, a, b, c);
495
- T1 = X[14] = load_u64_be(in + 14 * 8);
487
+ T1 = X[14] = CRYPTO_load_u64_be(in + 14 * 8);
496
488
  ROUND_00_15(14, c, d, e, f, g, h, a, b);
497
- T1 = X[15] = load_u64_be(in + 15 * 8);
489
+ T1 = X[15] = CRYPTO_load_u64_be(in + 15 * 8);
498
490
  ROUND_00_15(15, b, c, d, e, f, g, h, a);
499
491
 
500
492
  for (i = 16; i < 80; i += 16) {
@@ -17,9 +17,10 @@
17
17
 
18
18
  #include <openssl/aead.h>
19
19
  #include <openssl/bytestring.h>
20
+ #include <openssl/curve25519.h>
20
21
  #include <openssl/digest.h>
21
22
  #include <openssl/err.h>
22
- #include <openssl/evp.h>
23
+ #include <openssl/evp_errors.h>
23
24
  #include <openssl/hkdf.h>
24
25
  #include <openssl/sha.h>
25
26
 
@@ -31,9 +32,6 @@
31
32
 
32
33
  #define KEM_CONTEXT_LEN (2 * X25519_PUBLIC_VALUE_LEN)
33
34
 
34
- // HPKE KEM scheme IDs.
35
- #define HPKE_DHKEM_X25519_HKDF_SHA256 0x0020
36
-
37
35
  // This is strlen("HPKE") + 3 * sizeof(uint16_t).
38
36
  #define HPKE_SUITE_ID_LEN 10
39
37
 
@@ -50,8 +48,8 @@ static int add_label_string(CBB *cbb, const char *label) {
50
48
  // that the suite_id used outside of the KEM also includes the kdf_id and
51
49
  // aead_id.
52
50
  static const uint8_t kX25519SuiteID[] = {
53
- 'K', 'E', 'M', HPKE_DHKEM_X25519_HKDF_SHA256 >> 8,
54
- HPKE_DHKEM_X25519_HKDF_SHA256 & 0x00ff};
51
+ 'K', 'E', 'M', EVP_HPKE_DHKEM_X25519_HKDF_SHA256 >> 8,
52
+ EVP_HPKE_DHKEM_X25519_HKDF_SHA256 & 0x00ff};
55
53
 
56
54
  // The suite_id for non-KEM pieces of HPKE is defined as concat("HPKE",
57
55
  // I2OSP(kem_id, 2), I2OSP(kdf_id, 2), I2OSP(aead_id, 2)).
@@ -60,7 +58,7 @@ static int hpke_build_suite_id(uint8_t out[HPKE_SUITE_ID_LEN], uint16_t kdf_id,
60
58
  CBB cbb;
61
59
  int ret = CBB_init_fixed(&cbb, out, HPKE_SUITE_ID_LEN) &&
62
60
  add_label_string(&cbb, "HPKE") &&
63
- CBB_add_u16(&cbb, HPKE_DHKEM_X25519_HKDF_SHA256) &&
61
+ CBB_add_u16(&cbb, EVP_HPKE_DHKEM_X25519_HKDF_SHA256) &&
64
62
  CBB_add_u16(&cbb, kdf_id) &&
65
63
  CBB_add_u16(&cbb, aead_id);
66
64
  CBB_cleanup(&cbb);
@@ -125,11 +123,19 @@ static int hpke_extract_and_expand(const EVP_MD *hkdf_md, uint8_t *out_key,
125
123
  return 1;
126
124
  }
127
125
 
126
+ uint16_t EVP_HPKE_CTX_get_aead_id(const EVP_HPKE_CTX *hpke) {
127
+ return hpke->aead_id;
128
+ }
129
+
130
+ uint16_t EVP_HPKE_CTX_get_kdf_id(const EVP_HPKE_CTX *hpke) {
131
+ return hpke->kdf_id;
132
+ }
133
+
128
134
  const EVP_AEAD *EVP_HPKE_get_aead(uint16_t aead_id) {
129
135
  switch (aead_id) {
130
- case EVP_HPKE_AEAD_AES_GCM_128:
136
+ case EVP_HPKE_AEAD_AES_128_GCM:
131
137
  return EVP_aead_aes_128_gcm();
132
- case EVP_HPKE_AEAD_AES_GCM_256:
138
+ case EVP_HPKE_AEAD_AES_256_GCM:
133
139
  return EVP_aead_aes_256_gcm();
134
140
  case EVP_HPKE_AEAD_CHACHA20POLY1305:
135
141
  return EVP_aead_chacha20_poly1305();
@@ -316,27 +322,44 @@ void EVP_HPKE_CTX_cleanup(EVP_HPKE_CTX *ctx) {
316
322
  EVP_AEAD_CTX_cleanup(&ctx->aead_ctx);
317
323
  }
318
324
 
319
- int EVP_HPKE_CTX_setup_base_s_x25519(
320
- EVP_HPKE_CTX *hpke, uint8_t out_enc[X25519_PUBLIC_VALUE_LEN],
321
- uint16_t kdf_id, uint16_t aead_id,
322
- const uint8_t peer_public_value[X25519_PUBLIC_VALUE_LEN],
323
- const uint8_t *info, size_t info_len) {
325
+ int EVP_HPKE_CTX_setup_base_s_x25519(EVP_HPKE_CTX *hpke, uint8_t *out_enc,
326
+ size_t out_enc_len, uint16_t kdf_id,
327
+ uint16_t aead_id,
328
+ const uint8_t *peer_public_value,
329
+ size_t peer_public_value_len,
330
+ const uint8_t *info, size_t info_len) {
331
+ if (out_enc_len != X25519_PUBLIC_VALUE_LEN) {
332
+ OPENSSL_PUT_ERROR(EVP, EVP_R_INVALID_BUFFER_SIZE);
333
+ return 0;
334
+ }
335
+
324
336
  // The GenerateKeyPair() step technically belongs in the KEM's Encap()
325
337
  // function, but we've moved it up a layer to make it easier for tests to
326
338
  // inject an ephemeral keypair.
327
339
  uint8_t ephemeral_private[X25519_PRIVATE_KEY_LEN];
328
340
  X25519_keypair(out_enc, ephemeral_private);
329
341
  return EVP_HPKE_CTX_setup_base_s_x25519_for_test(
330
- hpke, kdf_id, aead_id, peer_public_value, info, info_len,
331
- ephemeral_private, out_enc);
342
+ hpke, kdf_id, aead_id, peer_public_value, peer_public_value_len, info,
343
+ info_len, ephemeral_private, sizeof(ephemeral_private), out_enc,
344
+ out_enc_len);
332
345
  }
333
346
 
334
347
  int EVP_HPKE_CTX_setup_base_s_x25519_for_test(
335
348
  EVP_HPKE_CTX *hpke, uint16_t kdf_id, uint16_t aead_id,
336
- const uint8_t peer_public_value[X25519_PUBLIC_VALUE_LEN],
337
- const uint8_t *info, size_t info_len,
338
- const uint8_t ephemeral_private[X25519_PRIVATE_KEY_LEN],
339
- const uint8_t ephemeral_public[X25519_PUBLIC_VALUE_LEN]) {
349
+ const uint8_t *peer_public_value, size_t peer_public_value_len,
350
+ const uint8_t *info, size_t info_len, const uint8_t *ephemeral_private,
351
+ size_t ephemeral_private_len, const uint8_t *ephemeral_public,
352
+ size_t ephemeral_public_len) {
353
+ if (peer_public_value_len != X25519_PUBLIC_VALUE_LEN) {
354
+ OPENSSL_PUT_ERROR(EVP, EVP_R_INVALID_PEER_KEY);
355
+ return 0;
356
+ }
357
+ if (ephemeral_private_len != X25519_PRIVATE_KEY_LEN ||
358
+ ephemeral_public_len != X25519_PUBLIC_VALUE_LEN) {
359
+ OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR);
360
+ return 0;
361
+ }
362
+
340
363
  hpke->is_sender = 1;
341
364
  hpke->kdf_id = kdf_id;
342
365
  hpke->aead_id = aead_id;
@@ -355,12 +378,23 @@ int EVP_HPKE_CTX_setup_base_s_x25519_for_test(
355
378
  return 1;
356
379
  }
357
380
 
358
- int EVP_HPKE_CTX_setup_base_r_x25519(
359
- EVP_HPKE_CTX *hpke, uint16_t kdf_id, uint16_t aead_id,
360
- const uint8_t enc[X25519_PUBLIC_VALUE_LEN],
361
- const uint8_t public_key[X25519_PUBLIC_VALUE_LEN],
362
- const uint8_t private_key[X25519_PRIVATE_KEY_LEN], const uint8_t *info,
363
- size_t info_len) {
381
+ int EVP_HPKE_CTX_setup_base_r_x25519(EVP_HPKE_CTX *hpke, uint16_t kdf_id,
382
+ uint16_t aead_id, const uint8_t *enc,
383
+ size_t enc_len, const uint8_t *public_key,
384
+ size_t public_key_len,
385
+ const uint8_t *private_key,
386
+ size_t private_key_len,
387
+ const uint8_t *info, size_t info_len) {
388
+ if (enc_len != X25519_PUBLIC_VALUE_LEN) {
389
+ OPENSSL_PUT_ERROR(EVP, EVP_R_INVALID_PEER_KEY);
390
+ return 0;
391
+ }
392
+ if (public_key_len != X25519_PUBLIC_VALUE_LEN ||
393
+ private_key_len != X25519_PRIVATE_KEY_LEN) {
394
+ OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR);
395
+ return 0;
396
+ }
397
+
364
398
  hpke->is_sender = 0;
365
399
  hpke->kdf_id = kdf_id;
366
400
  hpke->aead_id = aead_id;
@@ -378,29 +412,47 @@ int EVP_HPKE_CTX_setup_base_r_x25519(
378
412
  return 1;
379
413
  }
380
414
 
381
- int EVP_HPKE_CTX_setup_psk_s_x25519(
382
- EVP_HPKE_CTX *hpke, uint8_t out_enc[X25519_PUBLIC_VALUE_LEN],
383
- uint16_t kdf_id, uint16_t aead_id,
384
- const uint8_t peer_public_value[X25519_PUBLIC_VALUE_LEN],
385
- const uint8_t *info, size_t info_len, const uint8_t *psk, size_t psk_len,
386
- const uint8_t *psk_id, size_t psk_id_len) {
415
+ int EVP_HPKE_CTX_setup_psk_s_x25519(EVP_HPKE_CTX *hpke, uint8_t *out_enc,
416
+ size_t out_enc_len, uint16_t kdf_id,
417
+ uint16_t aead_id,
418
+ const uint8_t *peer_public_value,
419
+ size_t peer_public_value_len,
420
+ const uint8_t *info, size_t info_len,
421
+ const uint8_t *psk, size_t psk_len,
422
+ const uint8_t *psk_id, size_t psk_id_len) {
423
+ if (out_enc_len != X25519_PUBLIC_VALUE_LEN) {
424
+ OPENSSL_PUT_ERROR(EVP, EVP_R_INVALID_BUFFER_SIZE);
425
+ return 0;
426
+ }
427
+
387
428
  // The GenerateKeyPair() step technically belongs in the KEM's Encap()
388
429
  // function, but we've moved it up a layer to make it easier for tests to
389
430
  // inject an ephemeral keypair.
390
431
  uint8_t ephemeral_private[X25519_PRIVATE_KEY_LEN];
391
432
  X25519_keypair(out_enc, ephemeral_private);
392
433
  return EVP_HPKE_CTX_setup_psk_s_x25519_for_test(
393
- hpke, kdf_id, aead_id, peer_public_value, info, info_len, psk, psk_len,
394
- psk_id, psk_id_len, ephemeral_private, out_enc);
434
+ hpke, kdf_id, aead_id, peer_public_value, peer_public_value_len, info,
435
+ info_len, psk, psk_len, psk_id, psk_id_len, ephemeral_private,
436
+ sizeof(ephemeral_private), out_enc, out_enc_len);
395
437
  }
396
438
 
397
439
  int EVP_HPKE_CTX_setup_psk_s_x25519_for_test(
398
440
  EVP_HPKE_CTX *hpke, uint16_t kdf_id, uint16_t aead_id,
399
- const uint8_t peer_public_value[X25519_PUBLIC_VALUE_LEN],
441
+ const uint8_t *peer_public_value, size_t peer_public_value_len,
400
442
  const uint8_t *info, size_t info_len, const uint8_t *psk, size_t psk_len,
401
- const uint8_t *psk_id, size_t psk_id_len,
402
- const uint8_t ephemeral_private[X25519_PRIVATE_KEY_LEN],
403
- const uint8_t ephemeral_public[X25519_PUBLIC_VALUE_LEN]) {
443
+ const uint8_t *psk_id, size_t psk_id_len, const uint8_t *ephemeral_private,
444
+ size_t ephemeral_private_len, const uint8_t *ephemeral_public,
445
+ size_t ephemeral_public_len) {
446
+ if (peer_public_value_len != X25519_PUBLIC_VALUE_LEN) {
447
+ OPENSSL_PUT_ERROR(EVP, EVP_R_INVALID_PEER_KEY);
448
+ return 0;
449
+ }
450
+ if (ephemeral_private_len != X25519_PRIVATE_KEY_LEN ||
451
+ ephemeral_public_len != X25519_PUBLIC_VALUE_LEN) {
452
+ OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR);
453
+ return 0;
454
+ }
455
+
404
456
  hpke->is_sender = 1;
405
457
  hpke->kdf_id = kdf_id;
406
458
  hpke->aead_id = aead_id;
@@ -420,12 +472,21 @@ int EVP_HPKE_CTX_setup_psk_s_x25519_for_test(
420
472
  }
421
473
 
422
474
  int EVP_HPKE_CTX_setup_psk_r_x25519(
423
- EVP_HPKE_CTX *hpke, uint16_t kdf_id, uint16_t aead_id,
424
- const uint8_t enc[X25519_PUBLIC_VALUE_LEN],
425
- const uint8_t public_key[X25519_PUBLIC_VALUE_LEN],
426
- const uint8_t private_key[X25519_PRIVATE_KEY_LEN], const uint8_t *info,
475
+ EVP_HPKE_CTX *hpke, uint16_t kdf_id, uint16_t aead_id, const uint8_t *enc,
476
+ size_t enc_len, const uint8_t *public_key, size_t public_key_len,
477
+ const uint8_t *private_key, size_t private_key_len, const uint8_t *info,
427
478
  size_t info_len, const uint8_t *psk, size_t psk_len, const uint8_t *psk_id,
428
479
  size_t psk_id_len) {
480
+ if (enc_len != X25519_PUBLIC_VALUE_LEN) {
481
+ OPENSSL_PUT_ERROR(EVP, EVP_R_INVALID_PEER_KEY);
482
+ return 0;
483
+ }
484
+ if (public_key_len != X25519_PUBLIC_VALUE_LEN ||
485
+ private_key_len != X25519_PRIVATE_KEY_LEN) {
486
+ OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR);
487
+ return 0;
488
+ }
489
+
429
490
  hpke->is_sender = 0;
430
491
  hpke->kdf_id = kdf_id;
431
492
  hpke->aead_id = aead_id;
@@ -33,9 +33,12 @@ extern "C" {
33
33
  //
34
34
  // See https://tools.ietf.org/html/draft-irtf-cfrg-hpke-07.
35
35
 
36
+ // EVP_HPKE_DHKEM_* are KEM identifiers.
37
+ #define EVP_HPKE_DHKEM_X25519_HKDF_SHA256 0x0020
38
+
36
39
  // EVP_HPKE_AEAD_* are AEAD identifiers.
37
- #define EVP_HPKE_AEAD_AES_GCM_128 0x0001
38
- #define EVP_HPKE_AEAD_AES_GCM_256 0x0002
40
+ #define EVP_HPKE_AEAD_AES_128_GCM 0x0001
41
+ #define EVP_HPKE_AEAD_AES_256_GCM 0x0002
39
42
  #define EVP_HPKE_AEAD_CHACHA20POLY1305 0x0003
40
43
 
41
44
  // EVP_HPKE_HKDF_* are HKDF identifiers.
@@ -86,32 +89,35 @@ OPENSSL_EXPORT void EVP_HPKE_CTX_cleanup(EVP_HPKE_CTX *ctx);
86
89
  // recipient's public key). It returns one on success, and zero otherwise. Note
87
90
  // that this function will fail if |peer_public_value| is invalid.
88
91
  //
89
- // This function writes the encapsulated shared secret to |out_enc|.
92
+ // This function writes the encapsulated shared secret, a Diffie-Hellman public
93
+ // key, to |out_enc|. It will fail if the buffer's size in |out_enc_len| is not
94
+ // exactly |X25519_PUBLIC_VALUE_LEN|.
90
95
  OPENSSL_EXPORT int EVP_HPKE_CTX_setup_base_s_x25519(
91
- EVP_HPKE_CTX *hpke, uint8_t out_enc[X25519_PUBLIC_VALUE_LEN],
92
- uint16_t kdf_id, uint16_t aead_id,
93
- const uint8_t peer_public_value[X25519_PUBLIC_VALUE_LEN],
94
- const uint8_t *info, size_t info_len);
96
+ EVP_HPKE_CTX *hpke, uint8_t *out_enc, size_t out_enc_len, uint16_t kdf_id,
97
+ uint16_t aead_id, const uint8_t *peer_public_value,
98
+ size_t peer_public_value_len, const uint8_t *info, size_t info_len);
95
99
 
96
100
  // EVP_HPKE_CTX_setup_base_s_x25519_for_test behaves like
97
101
  // |EVP_HPKE_CTX_setup_base_s_x25519|, but takes a pre-generated ephemeral
98
- // sender key.
102
+ // sender key. The caller ensures that |ephemeral_public| and
103
+ // |ephemeral_private| are a valid keypair.
99
104
  OPENSSL_EXPORT int EVP_HPKE_CTX_setup_base_s_x25519_for_test(
100
105
  EVP_HPKE_CTX *hpke, uint16_t kdf_id, uint16_t aead_id,
101
- const uint8_t peer_public_value[X25519_PUBLIC_VALUE_LEN],
102
- const uint8_t *info, size_t info_len,
103
- const uint8_t ephemeral_private[X25519_PRIVATE_KEY_LEN],
104
- const uint8_t ephemeral_public[X25519_PUBLIC_VALUE_LEN]);
106
+ const uint8_t *peer_public_value, size_t peer_public_value_len,
107
+ const uint8_t *info, size_t info_len, const uint8_t *ephemeral_private,
108
+ size_t ephemeral_private_len, const uint8_t *ephemeral_public,
109
+ size_t ephemeral_public_len);
105
110
 
106
111
  // EVP_HPKE_CTX_setup_base_r_x25519 sets up |hpke| as a recipient context that
107
- // can decrypt messages. |private_key| is the recipient's private key, and |enc|
108
- // is the encapsulated shared secret from the sender. Note that this function
109
- // will fail if |enc| is invalid.
112
+ // can decrypt messages. It returns one on success, and zero otherwise.
113
+ //
114
+ // The recipient's keypair is composed of |public_key| and |private_key|, and
115
+ // |enc| is the encapsulated shared secret from the sender. If |enc| is invalid,
116
+ // this function will fail.
110
117
  OPENSSL_EXPORT int EVP_HPKE_CTX_setup_base_r_x25519(
111
- EVP_HPKE_CTX *hpke, uint16_t kdf_id, uint16_t aead_id,
112
- const uint8_t enc[X25519_PUBLIC_VALUE_LEN],
113
- const uint8_t public_key[X25519_PUBLIC_VALUE_LEN],
114
- const uint8_t private_key[X25519_PRIVATE_KEY_LEN], const uint8_t *info,
118
+ EVP_HPKE_CTX *hpke, uint16_t kdf_id, uint16_t aead_id, const uint8_t *enc,
119
+ size_t enc_len, const uint8_t *public_key, size_t public_key_len,
120
+ const uint8_t *private_key, size_t private_key_len, const uint8_t *info,
115
121
  size_t info_len);
116
122
 
117
123
  // EVP_HPKE_CTX_setup_psk_s_x25519 sets up |hpke| as a sender context that can
@@ -124,39 +130,44 @@ OPENSSL_EXPORT int EVP_HPKE_CTX_setup_base_r_x25519(
124
130
  // must be nonempty (|psk_len| and |psk_id_len| must be non-zero), or this
125
131
  // function will fail.
126
132
  //
127
- // This function writes the encapsulated shared secret to |out_enc|.
133
+ // This function writes the encapsulated shared secret, a Diffie-Hellman public
134
+ // key, to |out_enc|. It will fail if the buffer's size in |out_enc_len| is not
135
+ // exactly |X25519_PUBLIC_VALUE_LEN|.
128
136
  OPENSSL_EXPORT int EVP_HPKE_CTX_setup_psk_s_x25519(
129
- EVP_HPKE_CTX *hpke, uint8_t out_enc[X25519_PUBLIC_VALUE_LEN],
130
- uint16_t kdf_id, uint16_t aead_id,
131
- const uint8_t peer_public_value[X25519_PUBLIC_VALUE_LEN],
132
- const uint8_t *info, size_t info_len, const uint8_t *psk, size_t psk_len,
133
- const uint8_t *psk_id, size_t psk_id_len);
137
+ EVP_HPKE_CTX *hpke, uint8_t *out_enc, size_t out_enc_len, uint16_t kdf_id,
138
+ uint16_t aead_id, const uint8_t *peer_public_value,
139
+ size_t peer_public_value_len, const uint8_t *info, size_t info_len,
140
+ const uint8_t *psk, size_t psk_len, const uint8_t *psk_id,
141
+ size_t psk_id_len);
134
142
 
135
143
  // EVP_HPKE_CTX_setup_psk_s_x25519_for_test behaves like
136
144
  // |EVP_HPKE_CTX_setup_psk_s_x25519|, but takes a pre-generated ephemeral sender
137
- // key.
145
+ // key. The caller ensures that |ephemeral_public| and |ephemeral_private| are a
146
+ // valid keypair.
138
147
  OPENSSL_EXPORT int EVP_HPKE_CTX_setup_psk_s_x25519_for_test(
139
148
  EVP_HPKE_CTX *hpke, uint16_t kdf_id, uint16_t aead_id,
140
- const uint8_t peer_public_value[X25519_PUBLIC_VALUE_LEN],
149
+ const uint8_t *peer_public_value, size_t peer_public_value_len,
141
150
  const uint8_t *info, size_t info_len, const uint8_t *psk, size_t psk_len,
142
- const uint8_t *psk_id, size_t psk_id_len,
143
- const uint8_t ephemeral_private[X25519_PRIVATE_KEY_LEN],
144
- const uint8_t ephemeral_public[X25519_PUBLIC_VALUE_LEN]);
151
+ const uint8_t *psk_id, size_t psk_id_len, const uint8_t *ephemeral_private,
152
+ size_t ephemeral_private_len, const uint8_t *ephemeral_public,
153
+ size_t ephemeral_public_len);
145
154
 
146
155
  // EVP_HPKE_CTX_setup_psk_r_x25519 sets up |hpke| as a recipient context that
147
156
  // can decrypt messages. Future open (decrypt) operations will fail if the
148
- // sender does not possess the PSK indicated by |psk| and |psk_id|.
149
- // |private_key| is the recipient's private key, and |enc| is the encapsulated
150
- // shared secret from the sender. If |enc| is invalid, this function will fail.
157
+ // sender does not possess the PSK indicated by |psk| and |psk_id|. It returns
158
+ // one on success, and zero otherwise.
159
+ //
160
+ // The recipient's keypair is composed of |public_key| and |private_key|, and
161
+ // |enc| is the encapsulated shared secret from the sender. If |enc| is invalid,
162
+ // this function will fail.
151
163
  //
152
164
  // The PSK and its ID must be provided in |psk| and |psk_id|, respectively. Both
153
165
  // must be nonempty (|psk_len| and |psk_id_len| must be non-zero), or this
154
166
  // function will fail.
155
167
  OPENSSL_EXPORT int EVP_HPKE_CTX_setup_psk_r_x25519(
156
- EVP_HPKE_CTX *hpke, uint16_t kdf_id, uint16_t aead_id,
157
- const uint8_t enc[X25519_PUBLIC_VALUE_LEN],
158
- const uint8_t public_key[X25519_PUBLIC_VALUE_LEN],
159
- const uint8_t private_key[X25519_PRIVATE_KEY_LEN], const uint8_t *info,
168
+ EVP_HPKE_CTX *hpke, uint16_t kdf_id, uint16_t aead_id, const uint8_t *enc,
169
+ size_t enc_len, const uint8_t *public_key, size_t public_key_len,
170
+ const uint8_t *private_key, size_t private_key_len, const uint8_t *info,
160
171
  size_t info_len, const uint8_t *psk, size_t psk_len, const uint8_t *psk_id,
161
172
  size_t psk_id_len);
162
173
 
@@ -216,6 +227,16 @@ OPENSSL_EXPORT int EVP_HPKE_CTX_export(const EVP_HPKE_CTX *hpke, uint8_t *out,
216
227
  // set up as a sender.
217
228
  OPENSSL_EXPORT size_t EVP_HPKE_CTX_max_overhead(const EVP_HPKE_CTX *hpke);
218
229
 
230
+ // EVP_HPKE_CTX_get_aead_id returns |hpke|'s configured AEAD. The returned value
231
+ // is one of the |EVP_HPKE_AEAD_*| constants, or zero if the context has not
232
+ // been set up.
233
+ OPENSSL_EXPORT uint16_t EVP_HPKE_CTX_get_aead_id(const EVP_HPKE_CTX *hpke);
234
+
235
+ // EVP_HPKE_CTX_get_aead_id returns |hpke|'s configured KDF. The returned value
236
+ // is one of the |EVP_HPKE_HKDF_*| constants, or zero if the context has not
237
+ // been set up.
238
+ OPENSSL_EXPORT uint16_t EVP_HPKE_CTX_get_kdf_id(const EVP_HPKE_CTX *hpke);
239
+
219
240
  // EVP_HPKE_get_aead returns the AEAD corresponding to |aead_id|, or NULL if
220
241
  // |aead_id| is not a known AEAD identifier.
221
242
  OPENSSL_EXPORT const EVP_AEAD *EVP_HPKE_get_aead(uint16_t aead_id);