grpc 1.69.0 → 1.70.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (640) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +251 -249
  3. data/include/grpc/support/atm.h +0 -13
  4. data/src/core/call/request_buffer.cc +224 -0
  5. data/src/core/call/request_buffer.h +192 -0
  6. data/src/core/client_channel/client_channel.cc +2 -3
  7. data/src/core/client_channel/client_channel_args.h +21 -0
  8. data/src/core/client_channel/client_channel_filter.h +1 -3
  9. data/src/core/client_channel/retry_interceptor.cc +406 -0
  10. data/src/core/client_channel/retry_interceptor.h +157 -0
  11. data/src/core/client_channel/retry_service_config.h +13 -0
  12. data/src/core/client_channel/retry_throttle.cc +33 -18
  13. data/src/core/client_channel/retry_throttle.h +3 -3
  14. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +596 -94
  15. data/src/core/ext/transport/chttp2/server/chttp2_server.h +189 -13
  16. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +1 -0
  17. data/src/core/ext/transport/chttp2/transport/frame_security.cc +1 -3
  18. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +40 -1
  19. data/src/core/ext/upb-gen/envoy/admin/v3/config_dump_shared.upb.h +3 -1
  20. data/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb.h +66 -36
  21. data/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb_minitable.c +19 -17
  22. data/src/core/ext/upb-gen/envoy/config/core/v3/base.upb.h +116 -0
  23. data/src/core/ext/upb-gen/envoy/config/core/v3/base.upb_minitable.c +31 -5
  24. data/src/core/ext/upb-gen/envoy/config/core/v3/base.upb_minitable.h +2 -0
  25. data/src/core/ext/upb-gen/envoy/config/core/v3/protocol.upb.h +67 -6
  26. data/src/core/ext/upb-gen/envoy/config/core/v3/protocol.upb_minitable.c +12 -8
  27. data/src/core/ext/upb-gen/envoy/config/core/v3/socket_cmsg_headers.upb.h +151 -0
  28. data/src/core/ext/upb-gen/envoy/config/core/v3/socket_cmsg_headers.upb_minitable.c +60 -0
  29. data/src/core/ext/upb-gen/envoy/config/core/v3/socket_cmsg_headers.upb_minitable.h +32 -0
  30. data/src/core/ext/upb-gen/envoy/config/core/v3/socket_option.upb.h +228 -21
  31. data/src/core/ext/upb-gen/envoy/config/core/v3/socket_option.upb_minitable.c +65 -17
  32. data/src/core/ext/upb-gen/envoy/config/core/v3/socket_option.upb_minitable.h +6 -0
  33. data/src/core/ext/upb-gen/envoy/config/listener/v3/listener_components.upb.h +7 -106
  34. data/src/core/ext/upb-gen/envoy/config/listener/v3/listener_components.upb_minitable.c +7 -28
  35. data/src/core/ext/upb-gen/envoy/config/listener/v3/listener_components.upb_minitable.h +0 -2
  36. data/src/core/ext/upb-gen/envoy/config/listener/v3/quic_config.upb.h +85 -0
  37. data/src/core/ext/upb-gen/envoy/config/listener/v3/quic_config.upb_minitable.c +25 -3
  38. data/src/core/ext/upb-gen/envoy/config/overload/v3/overload.upb.h +2 -1
  39. data/src/core/ext/upb-gen/envoy/config/rbac/v3/rbac.upb.h +152 -0
  40. data/src/core/ext/upb-gen/envoy/config/rbac/v3/rbac.upb_minitable.c +40 -10
  41. data/src/core/ext/upb-gen/envoy/config/rbac/v3/rbac.upb_minitable.h +2 -0
  42. data/src/core/ext/upb-gen/envoy/config/route/v3/route_components.upb.h +135 -4
  43. data/src/core/ext/upb-gen/envoy/config/route/v3/route_components.upb_minitable.c +41 -9
  44. data/src/core/ext/upb-gen/envoy/config/route/v3/route_components.upb_minitable.h +2 -0
  45. data/src/core/ext/upb-gen/envoy/config/trace/v3/trace.upb.h +0 -2
  46. data/src/core/ext/upb-gen/envoy/config/trace/v3/trace.upb_minitable.c +0 -1
  47. data/src/core/ext/upb-gen/envoy/config/trace/v3/trace.upb_minitable.h +0 -1
  48. data/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +16 -0
  49. data/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb_minitable.c +3 -2
  50. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.h +60 -0
  51. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb_minitable.c +13 -2
  52. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/http_11_proxy/v3/upstream_http_11_connect.upb.h +0 -1
  53. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/http_11_proxy/v3/upstream_http_11_connect.upb_minitable.c +0 -1
  54. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +102 -24
  55. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/tls.upb_minitable.c +28 -19
  56. data/src/core/ext/upb-gen/envoy/service/discovery/v3/discovery.upb.h +251 -18
  57. data/src/core/ext/upb-gen/envoy/service/discovery/v3/discovery.upb_minitable.c +41 -16
  58. data/src/core/ext/upb-gen/envoy/service/discovery/v3/discovery.upb_minitable.h +2 -0
  59. data/src/core/ext/upb-gen/envoy/service/status/v3/csds.upb.h +2 -1
  60. data/src/core/ext/upbdefs-gen/envoy/admin/v3/config_dump_shared.upbdefs.c +11 -10
  61. data/src/core/ext/upbdefs-gen/envoy/config/cluster/v3/cluster.upbdefs.c +418 -413
  62. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/base.upbdefs.c +161 -153
  63. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/base.upbdefs.h +5 -0
  64. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/protocol.upbdefs.c +267 -261
  65. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/socket_cmsg_headers.upbdefs.c +46 -0
  66. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/socket_cmsg_headers.upbdefs.h +33 -0
  67. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/socket_option.upbdefs.c +29 -19
  68. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/socket_option.upbdefs.h +15 -0
  69. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/listener_components.upbdefs.c +58 -65
  70. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/listener_components.upbdefs.h +0 -5
  71. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/quic_config.upbdefs.c +73 -63
  72. data/src/core/ext/upbdefs-gen/envoy/config/overload/v3/overload.upbdefs.c +49 -48
  73. data/src/core/ext/upbdefs-gen/envoy/config/rbac/v3/rbac.upbdefs.c +117 -100
  74. data/src/core/ext/upbdefs-gen/envoy/config/rbac/v3/rbac.upbdefs.h +5 -0
  75. data/src/core/ext/upbdefs-gen/envoy/config/route/v3/route_components.upbdefs.c +905 -897
  76. data/src/core/ext/upbdefs-gen/envoy/config/route/v3/route_components.upbdefs.h +5 -0
  77. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/trace.upbdefs.c +15 -18
  78. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +460 -457
  79. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/http_11_proxy/v3/upstream_http_11_connect.upbdefs.c +16 -19
  80. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +95 -95
  81. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +202 -191
  82. data/src/core/ext/upbdefs-gen/envoy/service/discovery/v3/discovery.upbdefs.c +148 -135
  83. data/src/core/ext/upbdefs-gen/envoy/service/discovery/v3/discovery.upbdefs.h +5 -0
  84. data/src/core/ext/upbdefs-gen/envoy/service/status/v3/csds.upbdefs.c +23 -22
  85. data/src/core/filter/filter_args.h +112 -0
  86. data/src/core/handshaker/http_connect/http_connect_handshaker.cc +1 -1
  87. data/src/core/lib/channel/promise_based_filter.h +5 -79
  88. data/src/core/lib/debug/trace_flags.cc +2 -0
  89. data/src/core/lib/debug/trace_flags.h +1 -0
  90. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +14 -0
  91. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +7 -2
  92. data/src/core/lib/event_engine/posix_engine/posix_engine.h +0 -2
  93. data/src/core/lib/event_engine/windows/windows_engine.cc +1 -0
  94. data/src/core/lib/experiments/experiments.cc +90 -39
  95. data/src/core/lib/experiments/experiments.h +43 -24
  96. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +1 -1
  97. data/src/core/lib/promise/activity.cc +2 -0
  98. data/src/core/lib/promise/activity.h +29 -8
  99. data/src/core/lib/promise/map.h +42 -0
  100. data/src/core/lib/promise/party.cc +36 -1
  101. data/src/core/lib/promise/party.h +13 -5
  102. data/src/core/lib/promise/sleep.h +1 -0
  103. data/src/core/lib/promise/status_flag.h +10 -0
  104. data/src/core/lib/resource_quota/arena.h +8 -0
  105. data/src/core/lib/resource_quota/connection_quota.h +4 -0
  106. data/src/core/lib/surface/call_utils.h +2 -0
  107. data/src/core/lib/surface/client_call.cc +43 -35
  108. data/src/core/lib/surface/client_call.h +5 -0
  109. data/src/core/lib/surface/event_string.cc +7 -1
  110. data/src/core/lib/surface/init_internally.h +13 -2
  111. data/src/core/lib/surface/server_call.cc +100 -85
  112. data/src/core/lib/surface/version.cc +2 -2
  113. data/src/core/lib/transport/call_filters.cc +10 -4
  114. data/src/core/lib/transport/call_filters.h +8 -0
  115. data/src/core/lib/transport/call_spine.cc +36 -71
  116. data/src/core/lib/transport/call_spine.h +131 -7
  117. data/src/core/lib/transport/call_state.h +132 -39
  118. data/src/core/lib/transport/interception_chain.cc +8 -0
  119. data/src/core/lib/transport/interception_chain.h +9 -0
  120. data/src/core/load_balancing/endpoint_list.cc +10 -0
  121. data/src/core/load_balancing/endpoint_list.h +13 -6
  122. data/src/core/load_balancing/lb_policy.h +0 -8
  123. data/src/core/load_balancing/pick_first/pick_first.cc +89 -56
  124. data/src/core/load_balancing/ring_hash/ring_hash.cc +158 -70
  125. data/src/core/load_balancing/ring_hash/ring_hash.h +4 -11
  126. data/src/core/load_balancing/round_robin/round_robin.cc +9 -14
  127. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +12 -15
  128. data/src/core/resolver/dns/c_ares/dns_resolver_ares.cc +4 -4
  129. data/src/core/resolver/xds/xds_dependency_manager.cc +139 -135
  130. data/src/core/resolver/xds/xds_dependency_manager.h +24 -18
  131. data/src/core/resolver/xds/xds_resolver.cc +28 -47
  132. data/src/core/server/server.cc +290 -24
  133. data/src/core/server/server.h +199 -61
  134. data/src/core/server/xds_server_config_fetcher.cc +78 -142
  135. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  136. data/src/core/util/backoff.cc +15 -4
  137. data/src/core/util/http_client/httpcli.cc +66 -18
  138. data/src/core/util/http_client/httpcli.h +14 -4
  139. data/src/core/util/matchers.h +5 -10
  140. data/src/core/util/ref_counted.h +1 -0
  141. data/src/core/util/ref_counted_ptr.h +1 -1
  142. data/src/core/util/useful.h +9 -11
  143. data/src/core/xds/grpc/xds_endpoint_parser.cc +54 -23
  144. data/src/core/xds/grpc/xds_metadata.h +8 -0
  145. data/src/core/xds/xds_client/xds_api.cc +0 -223
  146. data/src/core/xds/xds_client/xds_api.h +1 -133
  147. data/src/core/xds/xds_client/xds_client.cc +599 -466
  148. data/src/core/xds/xds_client/xds_client.h +107 -26
  149. data/src/core/xds/xds_client/xds_resource_type_impl.h +10 -5
  150. data/src/ruby/ext/grpc/extconf.rb +1 -0
  151. data/src/ruby/lib/grpc/version.rb +1 -1
  152. data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_bitstr.c → a_bitstr.cc} +3 -2
  153. data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_d2i_fp.c → a_d2i_fp.cc} +1 -1
  154. data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_dup.c → a_dup.cc} +1 -1
  155. data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_i2d_fp.c → a_i2d_fp.cc} +1 -1
  156. data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_int.c → a_int.cc} +2 -1
  157. data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_mbstr.c → a_mbstr.cc} +9 -7
  158. data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_object.c → a_object.cc} +1 -1
  159. data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_strnid.c → a_strnid.cc} +7 -4
  160. data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_type.c → a_type.cc} +4 -4
  161. data/third_party/boringssl-with-bazel/src/crypto/asn1/{asn1_lib.c → asn1_lib.cc} +4 -4
  162. data/third_party/boringssl-with-bazel/src/crypto/asn1/{asn_pack.c → asn_pack.cc} +2 -2
  163. data/third_party/boringssl-with-bazel/src/crypto/asn1/{posix_time.c → posix_time.cc} +2 -2
  164. data/third_party/boringssl-with-bazel/src/crypto/asn1/{tasn_dec.c → tasn_dec.cc} +4 -3
  165. data/third_party/boringssl-with-bazel/src/crypto/asn1/{tasn_enc.c → tasn_enc.cc} +9 -6
  166. data/third_party/boringssl-with-bazel/src/crypto/asn1/{tasn_fre.c → tasn_fre.cc} +14 -20
  167. data/third_party/boringssl-with-bazel/src/crypto/asn1/{tasn_new.c → tasn_new.cc} +7 -6
  168. data/third_party/boringssl-with-bazel/src/crypto/asn1/{tasn_utl.c → tasn_utl.cc} +13 -10
  169. data/third_party/boringssl-with-bazel/src/crypto/base64/{base64.c → base64.cc} +9 -12
  170. data/third_party/boringssl-with-bazel/src/crypto/bcm_support.h +7 -1
  171. data/third_party/boringssl-with-bazel/src/crypto/bio/{bio.c → bio.cc} +32 -58
  172. data/third_party/boringssl-with-bazel/src/crypto/bio/{bio_mem.c → bio_mem.cc} +8 -7
  173. data/third_party/boringssl-with-bazel/src/crypto/bio/{connect.c → connect.cc} +24 -16
  174. data/third_party/boringssl-with-bazel/src/crypto/bio/{file.c → file.cc} +3 -3
  175. data/third_party/boringssl-with-bazel/src/crypto/bio/{pair.c → pair.cc} +22 -20
  176. data/third_party/boringssl-with-bazel/src/crypto/bio/{printf.c → printf.cc} +2 -2
  177. data/third_party/boringssl-with-bazel/src/crypto/bio/{socket_helper.c → socket_helper.cc} +1 -1
  178. data/third_party/boringssl-with-bazel/src/crypto/blake2/{blake2.c → blake2.cc} +2 -2
  179. data/third_party/boringssl-with-bazel/src/crypto/bn_extra/{bn_asn1.c → bn_asn1.cc} +1 -1
  180. data/third_party/boringssl-with-bazel/src/crypto/bn_extra/{convert.c → convert.cc} +21 -21
  181. data/third_party/boringssl-with-bazel/src/crypto/buf/{buf.c → buf.cc} +6 -3
  182. data/third_party/boringssl-with-bazel/src/crypto/bytestring/{asn1_compat.c → asn1_compat.cc} +1 -1
  183. data/third_party/boringssl-with-bazel/src/crypto/bytestring/{ber.c → ber.cc} +1 -1
  184. data/third_party/boringssl-with-bazel/src/crypto/bytestring/{cbb.c → cbb.cc} +33 -49
  185. data/third_party/boringssl-with-bazel/src/crypto/bytestring/{cbs.c → cbs.cc} +20 -27
  186. data/third_party/boringssl-with-bazel/src/crypto/bytestring/internal.h +1 -1
  187. data/third_party/boringssl-with-bazel/src/crypto/bytestring/{unicode.c → unicode.cc} +1 -1
  188. data/third_party/boringssl-with-bazel/src/crypto/chacha/{chacha.c → chacha.cc} +1 -1
  189. data/third_party/boringssl-with-bazel/src/crypto/chacha/internal.h +1 -1
  190. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/{e_aesctrhmac.c → e_aesctrhmac.cc} +1 -1
  191. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/{e_aesgcmsiv.c → e_aesgcmsiv.cc} +23 -26
  192. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/{e_chacha20poly1305.c → e_chacha20poly1305.cc} +1 -8
  193. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/{e_des.c → e_des.cc} +61 -49
  194. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/{e_null.c → e_null.cc} +12 -9
  195. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/{e_rc2.c → e_rc2.cc} +23 -19
  196. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/{e_rc4.c → e_rc4.cc} +10 -8
  197. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/{e_tls.c → e_tls.cc} +2 -1
  198. data/third_party/boringssl-with-bazel/src/crypto/conf/{conf.c → conf.cc} +17 -14
  199. data/third_party/boringssl-with-bazel/src/crypto/conf/internal.h +1 -1
  200. data/third_party/boringssl-with-bazel/src/crypto/{cpu_aarch64_apple.c → cpu_aarch64_apple.cc} +2 -2
  201. data/third_party/boringssl-with-bazel/src/crypto/{cpu_aarch64_fuchsia.c → cpu_aarch64_fuchsia.cc} +2 -2
  202. data/third_party/boringssl-with-bazel/src/crypto/{cpu_aarch64_linux.c → cpu_aarch64_linux.cc} +2 -2
  203. data/third_party/boringssl-with-bazel/src/crypto/{cpu_aarch64_openbsd.c → cpu_aarch64_openbsd.cc} +4 -4
  204. data/third_party/boringssl-with-bazel/src/crypto/{cpu_aarch64_sysreg.c → cpu_aarch64_sysreg.cc} +3 -2
  205. data/third_party/boringssl-with-bazel/src/crypto/{cpu_aarch64_win.c → cpu_aarch64_win.cc} +2 -2
  206. data/third_party/boringssl-with-bazel/src/crypto/{cpu_arm_freebsd.c → cpu_arm_freebsd.cc} +3 -3
  207. data/third_party/boringssl-with-bazel/src/crypto/{cpu_arm_linux.c → cpu_arm_linux.cc} +5 -5
  208. data/third_party/boringssl-with-bazel/src/crypto/cpu_arm_linux.h +1 -1
  209. data/third_party/boringssl-with-bazel/src/crypto/{cpu_intel.c → cpu_intel.cc} +47 -32
  210. data/third_party/boringssl-with-bazel/src/crypto/{crypto.c → crypto.cc} +6 -11
  211. data/third_party/boringssl-with-bazel/src/crypto/curve25519/{curve25519.c → curve25519.cc} +28 -31
  212. data/third_party/boringssl-with-bazel/src/crypto/curve25519/{curve25519_64_adx.c → curve25519_64_adx.cc} +1 -1
  213. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_tables.h +1 -1
  214. data/third_party/boringssl-with-bazel/src/crypto/curve25519/internal.h +1 -1
  215. data/third_party/boringssl-with-bazel/src/crypto/curve25519/{spake25519.c → spake25519.cc} +20 -16
  216. data/third_party/boringssl-with-bazel/src/crypto/dh_extra/{dh_asn1.c → dh_asn1.cc} +2 -2
  217. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/{digest_extra.c → digest_extra.cc} +113 -31
  218. data/third_party/boringssl-with-bazel/src/crypto/dsa/{dsa.c → dsa.cc} +153 -154
  219. data/third_party/boringssl-with-bazel/src/crypto/dsa/{dsa_asn1.c → dsa_asn1.cc} +2 -2
  220. data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +1 -3
  221. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/{ec_asn1.c → ec_asn1.cc} +35 -0
  222. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/{ec_derive.c → ec_derive.cc} +1 -1
  223. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/{hash_to_curve.c → hash_to_curve.cc} +66 -64
  224. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +1 -1
  225. data/third_party/boringssl-with-bazel/src/crypto/ecdsa_extra/{ecdsa_asn1.c → ecdsa_asn1.cc} +15 -25
  226. data/third_party/boringssl-with-bazel/src/crypto/engine/{engine.c → engine.cc} +12 -8
  227. data/third_party/boringssl-with-bazel/src/crypto/err/{err.c → err.cc} +24 -27
  228. data/third_party/boringssl-with-bazel/src/crypto/err/internal.h +1 -1
  229. data/third_party/boringssl-with-bazel/src/crypto/evp/{evp.c → evp.cc} +8 -9
  230. data/third_party/boringssl-with-bazel/src/crypto/evp/{evp_ctx.c → evp_ctx.cc} +7 -8
  231. data/third_party/boringssl-with-bazel/src/crypto/evp/{p_dh.c → p_dh.cc} +23 -14
  232. data/third_party/boringssl-with-bazel/src/crypto/evp/{p_dh_asn1.c → p_dh_asn1.cc} +38 -21
  233. data/third_party/boringssl-with-bazel/src/crypto/evp/{p_dsa_asn1.c → p_dsa_asn1.cc} +19 -24
  234. data/third_party/boringssl-with-bazel/src/crypto/evp/{p_ec.c → p_ec.cc} +20 -23
  235. data/third_party/boringssl-with-bazel/src/crypto/evp/{p_ec_asn1.c → p_ec_asn1.cc} +20 -20
  236. data/third_party/boringssl-with-bazel/src/crypto/evp/{p_ed25519.c → p_ed25519.cc} +22 -19
  237. data/third_party/boringssl-with-bazel/src/crypto/evp/{p_ed25519_asn1.c → p_ed25519_asn1.cc} +14 -13
  238. data/third_party/boringssl-with-bazel/src/crypto/evp/{p_hkdf.c → p_hkdf.cc} +18 -14
  239. data/third_party/boringssl-with-bazel/src/crypto/evp/{p_rsa.c → p_rsa.cc} +38 -37
  240. data/third_party/boringssl-with-bazel/src/crypto/evp/{p_rsa_asn1.c → p_rsa_asn1.cc} +16 -18
  241. data/third_party/boringssl-with-bazel/src/crypto/evp/{p_x25519.c → p_x25519.cc} +22 -19
  242. data/third_party/boringssl-with-bazel/src/crypto/evp/{p_x25519_asn1.c → p_x25519_asn1.cc} +18 -17
  243. data/third_party/boringssl-with-bazel/src/crypto/evp/{pbkdf.c → pbkdf.cc} +2 -2
  244. data/third_party/boringssl-with-bazel/src/crypto/evp/{print.c → print.cc} +4 -5
  245. data/third_party/boringssl-with-bazel/src/crypto/evp/{scrypt.c → scrypt.cc} +7 -5
  246. data/third_party/boringssl-with-bazel/src/crypto/{ex_data.c → ex_data.cc} +3 -4
  247. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/{aes_nohw.c.inc → aes_nohw.cc.inc} +1 -1
  248. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/internal.h +1 -5
  249. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/{key_wrap.c.inc → key_wrap.cc.inc} +1 -1
  250. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/{bcm.c → bcm.cc} +96 -101
  251. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm_interface.h +165 -12
  252. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{add.c.inc → add.cc.inc} +1 -0
  253. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/asm/{x86_64-gcc.c.inc → x86_64-gcc.cc.inc} +4 -4
  254. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{bn.c.inc → bn.cc.inc} +12 -24
  255. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{ctx.c.inc → ctx.cc.inc} +5 -7
  256. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{div.c.inc → div.cc.inc} +29 -38
  257. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{div_extra.c.inc → div_extra.cc.inc} +1 -1
  258. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{exponentiation.c.inc → exponentiation.cc.inc} +22 -22
  259. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{gcd.c.inc → gcd.cc.inc} +3 -6
  260. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{gcd_extra.c.inc → gcd_extra.cc.inc} +33 -25
  261. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{montgomery.c.inc → montgomery.cc.inc} +10 -17
  262. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{mul.c.inc → mul.cc.inc} +11 -15
  263. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{prime.c.inc → prime.cc.inc} +31 -34
  264. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{shift.c.inc → shift.cc.inc} +3 -4
  265. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/{aead.c.inc → aead.cc.inc} +18 -10
  266. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/{cipher.c.inc → cipher.cc.inc} +6 -9
  267. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/{e_aes.c.inc → e_aes.cc.inc} +46 -54
  268. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cmac/{cmac.c.inc → cmac.cc.inc} +6 -6
  269. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/delocate.h +14 -10
  270. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/{dh.c.inc → dh.cc.inc} +15 -19
  271. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/internal.h +1 -3
  272. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/{digest.c.inc → digest.cc.inc} +17 -13
  273. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/{digests.c.inc → digests.cc.inc} +29 -113
  274. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digestsign/{digestsign.c.inc → digestsign.cc.inc} +3 -3
  275. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/builtin_curves.h +1 -1
  276. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{ec.c.inc → ec.cc.inc} +10 -15
  277. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{ec_key.c.inc → ec_key.cc.inc} +12 -14
  278. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{felem.c.inc → felem.cc.inc} +1 -1
  279. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{oct.c.inc → oct.cc.inc} +5 -6
  280. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{p224-64.c.inc → p224-64.cc.inc} +1 -1
  281. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-nistz-table.h +1 -1
  282. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{p256-nistz.c.inc → p256-nistz.cc.inc} +15 -13
  283. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{p256.c.inc → p256.cc.inc} +1 -1
  284. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256_table.h +1 -1
  285. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{scalar.c.inc → scalar.cc.inc} +1 -1
  286. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{simple_mul.c.inc → simple_mul.cc.inc} +1 -1
  287. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{util.c.inc → util.cc.inc} +1 -1
  288. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{wnaf.c.inc → wnaf.cc.inc} +24 -15
  289. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/{ecdh.c.inc → ecdh.cc.inc} +14 -5
  290. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/{ecdsa.c.inc → ecdsa.cc.inc} +6 -7
  291. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/internal.h +1 -1
  292. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/{fips_shared_support.c → fips_shared_support.cc} +2 -3
  293. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/hkdf/{hkdf.c.inc → hkdf.cc.inc} +1 -1
  294. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/hmac/{hmac.c.inc → hmac.cc.inc} +3 -2
  295. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/{gcm.c.inc → gcm.cc.inc} +69 -21
  296. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/{gcm_nohw.c.inc → gcm_nohw.cc.inc} +1 -1
  297. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +53 -33
  298. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/{polyval.c.inc → polyval.cc.inc} +2 -3
  299. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/{ctrdrbg.c.inc → ctrdrbg.cc.inc} +5 -4
  300. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +1 -1
  301. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/{rand.c.inc → rand.cc.inc} +20 -18
  302. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/{blinding.c.inc → blinding.cc.inc} +5 -4
  303. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/{padding.c.inc → padding.cc.inc} +21 -21
  304. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/{rsa.c.inc → rsa.cc.inc} +77 -73
  305. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/{rsa_impl.c.inc → rsa_impl.cc.inc} +50 -53
  306. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/{fips.c.inc → fips.cc.inc} +14 -6
  307. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/{self_check.c.inc → self_check.cc.inc} +56 -52
  308. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/service_indicator/{service_indicator.c.inc → service_indicator.cc.inc} +10 -11
  309. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/internal.h +2 -4
  310. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/{sha1.c.inc → sha1.cc.inc} +26 -33
  311. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/{sha256.c.inc → sha256.cc.inc} +37 -55
  312. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/{sha512.c.inc → sha512.cc.inc} +48 -76
  313. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/internal.h +1 -1
  314. data/third_party/boringssl-with-bazel/src/crypto/hpke/{hpke.c → hpke.cc} +7 -4
  315. data/third_party/boringssl-with-bazel/src/crypto/hrss/{hrss.c → hrss.cc} +53 -110
  316. data/third_party/boringssl-with-bazel/src/crypto/hrss/internal.h +1 -1
  317. data/third_party/boringssl-with-bazel/src/crypto/internal.h +191 -248
  318. data/third_party/boringssl-with-bazel/src/crypto/keccak/internal.h +1 -1
  319. data/third_party/boringssl-with-bazel/src/crypto/keccak/{keccak.c → keccak.cc} +1 -1
  320. data/third_party/boringssl-with-bazel/src/crypto/kyber/internal.h +1 -1
  321. data/third_party/boringssl-with-bazel/src/crypto/kyber/{kyber.c → kyber.cc} +1 -1
  322. data/third_party/boringssl-with-bazel/src/crypto/lhash/{lhash.c → lhash.cc} +8 -7
  323. data/third_party/boringssl-with-bazel/src/crypto/{fipsmodule/md4/md4.c.inc → md4/md4.cc} +8 -12
  324. data/third_party/boringssl-with-bazel/src/crypto/{fipsmodule/md5 → md5}/internal.h +1 -1
  325. data/third_party/boringssl-with-bazel/src/crypto/{fipsmodule/md5/md5.c.inc → md5/md5.cc} +4 -3
  326. data/third_party/boringssl-with-bazel/src/crypto/{mem.c → mem.cc} +34 -22
  327. data/third_party/boringssl-with-bazel/src/crypto/mldsa/internal.h +4 -1
  328. data/third_party/boringssl-with-bazel/src/crypto/mldsa/{mldsa.c → mldsa.cc} +646 -543
  329. data/third_party/boringssl-with-bazel/src/crypto/mlkem/internal.h +1 -1
  330. data/third_party/boringssl-with-bazel/src/crypto/mlkem/mlkem.cc +8 -8
  331. data/third_party/boringssl-with-bazel/src/crypto/obj/{obj.c → obj.cc} +27 -30
  332. data/third_party/boringssl-with-bazel/src/crypto/pem/{pem_info.c → pem_info.cc} +2 -2
  333. data/third_party/boringssl-with-bazel/src/crypto/pem/{pem_lib.c → pem_lib.cc} +3 -4
  334. data/third_party/boringssl-with-bazel/src/crypto/pem/{pem_oth.c → pem_oth.cc} +1 -1
  335. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/internal.h +1 -1
  336. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/{pkcs7.c → pkcs7.cc} +5 -5
  337. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/{pkcs7_x509.c → pkcs7_x509.cc} +26 -25
  338. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +2 -2
  339. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/{p5_pbev2.c → p5_pbev2.cc} +2 -2
  340. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/{pkcs8.c → pkcs8.cc} +159 -158
  341. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/{pkcs8_x509.c → pkcs8_x509.cc} +90 -97
  342. data/third_party/boringssl-with-bazel/src/crypto/poly1305/internal.h +1 -1
  343. data/third_party/boringssl-with-bazel/src/crypto/poly1305/{poly1305.c → poly1305.cc} +3 -3
  344. data/third_party/boringssl-with-bazel/src/crypto/poly1305/{poly1305_arm.c → poly1305_arm.cc} +4 -2
  345. data/third_party/boringssl-with-bazel/src/crypto/poly1305/{poly1305_vec.c → poly1305_vec.cc} +14 -11
  346. data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +1 -1
  347. data/third_party/boringssl-with-bazel/src/crypto/pool/{pool.c → pool.cc} +12 -11
  348. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/{deterministic.c → deterministic.cc} +2 -2
  349. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/{fork_detect.c → fork_detect.cc} +11 -12
  350. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/{forkunsafe.c → forkunsafe.cc} +2 -2
  351. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/{getentropy.c → getentropy.cc} +1 -1
  352. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/getrandom_fillin.h +1 -1
  353. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/{ios.c → ios.cc} +1 -1
  354. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/{passive.c → passive.cc} +22 -18
  355. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/{rand_extra.c → rand_extra.cc} +1 -1
  356. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/sysrand_internal.h +1 -1
  357. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/{trusty.c → trusty.cc} +1 -1
  358. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/{urandom.c → urandom.cc} +7 -7
  359. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/{windows.c → windows.cc} +1 -1
  360. data/third_party/boringssl-with-bazel/src/crypto/{refcount.c → refcount.cc} +1 -1
  361. data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/{rsa_asn1.c → rsa_asn1.cc} +2 -2
  362. data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/{rsa_crypt.c → rsa_crypt.cc} +81 -78
  363. data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_extra.cc +17 -0
  364. data/third_party/boringssl-with-bazel/src/crypto/sha/sha1.cc +52 -0
  365. data/third_party/boringssl-with-bazel/src/crypto/sha/sha256.cc +87 -0
  366. data/third_party/boringssl-with-bazel/src/crypto/sha/sha512.cc +104 -0
  367. data/third_party/boringssl-with-bazel/src/crypto/siphash/{siphash.c → siphash.cc} +1 -1
  368. data/third_party/boringssl-with-bazel/src/crypto/slhdsa/address.h +123 -0
  369. data/third_party/boringssl-with-bazel/src/crypto/slhdsa/fors.cc +169 -0
  370. data/third_party/boringssl-with-bazel/src/crypto/slhdsa/fors.h +58 -0
  371. data/third_party/boringssl-with-bazel/src/crypto/slhdsa/internal.h +63 -0
  372. data/third_party/boringssl-with-bazel/src/crypto/slhdsa/merkle.cc +161 -0
  373. data/third_party/boringssl-with-bazel/src/crypto/slhdsa/merkle.h +70 -0
  374. data/third_party/boringssl-with-bazel/src/crypto/slhdsa/params.h +83 -0
  375. data/third_party/boringssl-with-bazel/src/crypto/slhdsa/slhdsa.cc +307 -0
  376. data/third_party/boringssl-with-bazel/src/crypto/slhdsa/thash.cc +173 -0
  377. data/third_party/boringssl-with-bazel/src/crypto/slhdsa/thash.h +85 -0
  378. data/third_party/boringssl-with-bazel/src/crypto/slhdsa/wots.cc +171 -0
  379. data/third_party/boringssl-with-bazel/src/crypto/slhdsa/wots.h +50 -0
  380. data/third_party/boringssl-with-bazel/src/crypto/stack/{stack.c → stack.cc} +10 -6
  381. data/third_party/boringssl-with-bazel/src/crypto/{thread_none.c → thread_none.cc} +1 -1
  382. data/third_party/boringssl-with-bazel/src/crypto/{thread_pthread.c → thread_pthread.cc} +9 -8
  383. data/third_party/boringssl-with-bazel/src/crypto/{thread_win.c → thread_win.cc} +21 -17
  384. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +1 -1
  385. data/third_party/boringssl-with-bazel/src/crypto/trust_token/{pmbtoken.c → pmbtoken.cc} +146 -158
  386. data/third_party/boringssl-with-bazel/src/crypto/trust_token/{trust_token.c → trust_token.cc} +19 -21
  387. data/third_party/boringssl-with-bazel/src/crypto/trust_token/{voprf.c → voprf.cc} +165 -169
  388. data/third_party/boringssl-with-bazel/src/crypto/x509/{a_digest.c → a_digest.cc} +1 -1
  389. data/third_party/boringssl-with-bazel/src/crypto/x509/{a_sign.c → a_sign.cc} +37 -34
  390. data/third_party/boringssl-with-bazel/src/crypto/x509/{a_verify.c → a_verify.cc} +1 -1
  391. data/third_party/boringssl-with-bazel/src/crypto/x509/{algorithm.c → algorithm.cc} +1 -1
  392. data/third_party/boringssl-with-bazel/src/crypto/x509/{asn1_gen.c → asn1_gen.cc} +5 -6
  393. data/third_party/boringssl-with-bazel/src/crypto/x509/{by_dir.c → by_dir.cc} +7 -6
  394. data/third_party/boringssl-with-bazel/src/crypto/x509/{policy.c → policy.cc} +188 -178
  395. data/third_party/boringssl-with-bazel/src/crypto/x509/{rsa_pss.c → rsa_pss.cc} +48 -44
  396. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_akey.c → v3_akey.cc} +4 -2
  397. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_alt.c → v3_alt.cc} +5 -5
  398. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_bcons.c → v3_bcons.cc} +3 -1
  399. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_bitst.c → v3_bitst.cc} +6 -3
  400. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_conf.c → v3_conf.cc} +5 -5
  401. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_cpols.c → v3_cpols.cc} +47 -41
  402. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_crld.c → v3_crld.cc} +3 -2
  403. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_enum.c → v3_enum.cc} +5 -2
  404. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_extku.c → v3_extku.cc} +3 -1
  405. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_genn.c → v3_genn.cc} +7 -7
  406. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_ia5.c → v3_ia5.cc} +3 -2
  407. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_info.c → v3_info.cc} +4 -2
  408. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_int.c → v3_int.cc} +3 -1
  409. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_lib.c → v3_lib.cc} +9 -6
  410. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_ncons.c → v3_ncons.cc} +3 -3
  411. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_ocsp.c → v3_ocsp.cc} +4 -1
  412. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_pcons.c → v3_pcons.cc} +3 -3
  413. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_pmaps.c → v3_pmaps.cc} +3 -3
  414. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_prn.c → v3_prn.cc} +2 -1
  415. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_purp.c → v3_purp.cc} +16 -8
  416. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_skey.c → v3_skey.cc} +6 -3
  417. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_utl.c → v3_utl.cc} +15 -10
  418. data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_att.c → x509_att.cc} +3 -2
  419. data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_lu.c → x509_lu.cc} +6 -5
  420. data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_v3.c → x509_v3.cc} +2 -2
  421. data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_vfy.c → x509_vfy.cc} +216 -212
  422. data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_vpm.c → x509_vpm.cc} +55 -13
  423. data/third_party/boringssl-with-bazel/src/crypto/x509/{x509spki.c → x509spki.cc} +3 -3
  424. data/third_party/boringssl-with-bazel/src/crypto/x509/{x_all.c → x_all.cc} +10 -6
  425. data/third_party/boringssl-with-bazel/src/crypto/x509/{x_crl.c → x_crl.cc} +6 -6
  426. data/third_party/boringssl-with-bazel/src/crypto/x509/{x_name.c → x_name.cc} +39 -32
  427. data/third_party/boringssl-with-bazel/src/crypto/x509/{x_pubkey.c → x_pubkey.cc} +4 -2
  428. data/third_party/boringssl-with-bazel/src/crypto/x509/{x_x509.c → x_x509.cc} +48 -44
  429. data/third_party/boringssl-with-bazel/src/crypto/x509/{x_x509a.c → x_x509a.cc} +4 -2
  430. data/third_party/boringssl-with-bazel/src/gen/crypto/{err_data.c → err_data.cc} +359 -358
  431. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +1 -1
  432. data/third_party/boringssl-with-bazel/src/include/openssl/asm_base.h +1 -1
  433. data/third_party/boringssl-with-bazel/src/include/openssl/asn1_mac.h +1 -1
  434. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +237 -275
  435. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +12 -5
  436. data/third_party/boringssl-with-bazel/src/include/openssl/bcm_public.h +82 -0
  437. data/third_party/boringssl-with-bazel/src/include/openssl/blake2.h +1 -1
  438. data/third_party/boringssl-with-bazel/src/include/openssl/buffer.h +1 -1
  439. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +1 -1
  440. data/third_party/boringssl-with-bazel/src/include/openssl/chacha.h +1 -1
  441. data/third_party/boringssl-with-bazel/src/include/openssl/cmac.h +1 -1
  442. data/third_party/boringssl-with-bazel/src/include/openssl/cpu.h +1 -1
  443. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +13 -2
  444. data/third_party/boringssl-with-bazel/src/include/openssl/ctrdrbg.h +1 -1
  445. data/third_party/boringssl-with-bazel/src/include/openssl/curve25519.h +1 -1
  446. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +4 -0
  447. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +6 -1
  448. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +4 -0
  449. data/third_party/boringssl-with-bazel/src/include/openssl/dtls1.h +1 -1
  450. data/third_party/boringssl-with-bazel/src/include/openssl/e_os2.h +1 -1
  451. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +17 -1
  452. data/third_party/boringssl-with-bazel/src/include/openssl/engine.h +1 -1
  453. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +1 -1
  454. data/third_party/boringssl-with-bazel/src/include/openssl/experimental/kyber.h +1 -1
  455. data/third_party/boringssl-with-bazel/src/include/openssl/hkdf.h +1 -1
  456. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +1 -1
  457. data/third_party/boringssl-with-bazel/src/include/openssl/hrss.h +1 -1
  458. data/third_party/boringssl-with-bazel/src/include/openssl/is_boringssl.h +1 -1
  459. data/third_party/boringssl-with-bazel/src/include/openssl/kdf.h +1 -1
  460. data/third_party/boringssl-with-bazel/src/include/openssl/mldsa.h +8 -8
  461. data/third_party/boringssl-with-bazel/src/include/openssl/mlkem.h +1 -1
  462. data/third_party/boringssl-with-bazel/src/include/openssl/obj_mac.h +1 -1
  463. data/third_party/boringssl-with-bazel/src/include/openssl/objects.h +1 -1
  464. data/third_party/boringssl-with-bazel/src/include/openssl/opensslconf.h +1 -1
  465. data/third_party/boringssl-with-bazel/src/include/openssl/opensslv.h +1 -1
  466. data/third_party/boringssl-with-bazel/src/include/openssl/ossl_typ.h +1 -1
  467. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs12.h +1 -1
  468. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +1 -1
  469. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +2 -2
  470. data/third_party/boringssl-with-bazel/src/include/openssl/poly1305.h +1 -1
  471. data/third_party/boringssl-with-bazel/src/include/openssl/pool.h +1 -1
  472. data/third_party/boringssl-with-bazel/src/include/openssl/posix_time.h +1 -1
  473. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +1 -1
  474. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +10 -5
  475. data/third_party/boringssl-with-bazel/src/include/openssl/safestack.h +1 -1
  476. data/third_party/boringssl-with-bazel/src/include/openssl/sha.h +2 -40
  477. data/third_party/boringssl-with-bazel/src/include/openssl/siphash.h +1 -1
  478. data/third_party/boringssl-with-bazel/src/include/openssl/slhdsa.h +133 -0
  479. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +6 -1
  480. data/third_party/boringssl-with-bazel/src/include/openssl/srtp.h +1 -1
  481. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +160 -116
  482. data/third_party/boringssl-with-bazel/src/include/openssl/ssl3.h +1 -0
  483. data/third_party/boringssl-with-bazel/src/include/openssl/target.h +1 -1
  484. data/third_party/boringssl-with-bazel/src/include/openssl/thread.h +2 -2
  485. data/third_party/boringssl-with-bazel/src/include/openssl/time.h +1 -1
  486. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +1 -1
  487. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +1 -1
  488. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +1 -1
  489. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3_errors.h +2 -2
  490. data/third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc +2 -6
  491. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +667 -322
  492. data/third_party/boringssl-with-bazel/src/ssl/d1_lib.cc +116 -119
  493. data/third_party/boringssl-with-bazel/src/ssl/d1_pkt.cc +163 -21
  494. data/third_party/boringssl-with-bazel/src/ssl/d1_srtp.cc +4 -12
  495. data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +94 -49
  496. data/third_party/boringssl-with-bazel/src/ssl/dtls_record.cc +296 -198
  497. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +23 -14
  498. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +363 -343
  499. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +48 -58
  500. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +44 -36
  501. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +145 -159
  502. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +65 -58
  503. data/third_party/boringssl-with-bazel/src/ssl/internal.h +910 -356
  504. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +29 -41
  505. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +13 -11
  506. data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +2 -2
  507. data/third_party/boringssl-with-bazel/src/ssl/ssl_aead_ctx.cc +90 -183
  508. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +38 -64
  509. data/third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc +1 -1
  510. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +103 -44
  511. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +210 -220
  512. data/third_party/boringssl-with-bazel/src/ssl/ssl_credential.cc +70 -12
  513. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +20 -17
  514. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +146 -169
  515. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +15 -16
  516. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +79 -95
  517. data/third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc +3 -9
  518. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +91 -16
  519. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +30 -16
  520. data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +51 -56
  521. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +22 -25
  522. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +43 -27
  523. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +63 -59
  524. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +204 -121
  525. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +86 -59
  526. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +51 -62
  527. data/third_party/boringssl-with-bazel/src/ssl/tls_record.cc +37 -25
  528. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_32.h +6 -0
  529. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64.h +6 -0
  530. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64_adx.h +4 -1
  531. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_32.h +1 -1
  532. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64.h +3 -0
  533. metadata +339 -339
  534. data/src/core/ext/upb-gen/envoy/config/trace/v3/opencensus.upb.h +0 -426
  535. data/src/core/ext/upb-gen/envoy/config/trace/v3/opencensus.upb_minitable.c +0 -87
  536. data/src/core/ext/upb-gen/envoy/config/trace/v3/opencensus.upb_minitable.h +0 -32
  537. data/src/core/ext/upb-gen/opencensus/proto/trace/v1/trace_config.upb.h +0 -408
  538. data/src/core/ext/upb-gen/opencensus/proto/trace/v1/trace_config.upb_minitable.c +0 -124
  539. data/src/core/ext/upb-gen/opencensus/proto/trace/v1/trace_config.upb_minitable.h +0 -38
  540. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/opencensus.upbdefs.c +0 -108
  541. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/opencensus.upbdefs.h +0 -33
  542. data/src/core/ext/upbdefs-gen/opencensus/proto/trace/v1/trace_config.upbdefs.c +0 -67
  543. data/src/core/ext/upbdefs-gen/opencensus/proto/trace/v1/trace_config.upbdefs.h +0 -48
  544. data/src/core/util/atm.cc +0 -34
  545. data/third_party/boringssl-with-bazel/src/crypto/dilithium/dilithium.c +0 -1539
  546. data/third_party/boringssl-with-bazel/src/crypto/dilithium/internal.h +0 -58
  547. data/third_party/boringssl-with-bazel/src/crypto/spx/address.c +0 -101
  548. data/third_party/boringssl-with-bazel/src/crypto/spx/address.h +0 -50
  549. data/third_party/boringssl-with-bazel/src/crypto/spx/fors.c +0 -133
  550. data/third_party/boringssl-with-bazel/src/crypto/spx/fors.h +0 -54
  551. data/third_party/boringssl-with-bazel/src/crypto/spx/merkle.c +0 -150
  552. data/third_party/boringssl-with-bazel/src/crypto/spx/merkle.h +0 -61
  553. data/third_party/boringssl-with-bazel/src/crypto/spx/params.h +0 -71
  554. data/third_party/boringssl-with-bazel/src/crypto/spx/spx.c +0 -140
  555. data/third_party/boringssl-with-bazel/src/crypto/spx/spx_util.c +0 -53
  556. data/third_party/boringssl-with-bazel/src/crypto/spx/spx_util.h +0 -44
  557. data/third_party/boringssl-with-bazel/src/crypto/spx/thash.c +0 -136
  558. data/third_party/boringssl-with-bazel/src/crypto/spx/thash.h +0 -70
  559. data/third_party/boringssl-with-bazel/src/crypto/spx/wots.c +0 -135
  560. data/third_party/boringssl-with-bazel/src/crypto/spx/wots.h +0 -45
  561. data/third_party/boringssl-with-bazel/src/include/openssl/experimental/dilithium.h +0 -129
  562. data/third_party/boringssl-with-bazel/src/include/openssl/experimental/spx.h +0 -90
  563. /data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_bool.c → a_bool.cc} +0 -0
  564. /data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_gentm.c → a_gentm.cc} +0 -0
  565. /data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_octet.c → a_octet.cc} +0 -0
  566. /data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_strex.c → a_strex.cc} +0 -0
  567. /data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_time.c → a_time.cc} +0 -0
  568. /data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_utctm.c → a_utctm.cc} +0 -0
  569. /data/third_party/boringssl-with-bazel/src/crypto/asn1/{asn1_par.c → asn1_par.cc} +0 -0
  570. /data/third_party/boringssl-with-bazel/src/crypto/asn1/{f_int.c → f_int.cc} +0 -0
  571. /data/third_party/boringssl-with-bazel/src/crypto/asn1/{f_string.c → f_string.cc} +0 -0
  572. /data/third_party/boringssl-with-bazel/src/crypto/asn1/{tasn_typ.c → tasn_typ.cc} +0 -0
  573. /data/third_party/boringssl-with-bazel/src/crypto/bio/{errno.c → errno.cc} +0 -0
  574. /data/third_party/boringssl-with-bazel/src/crypto/bio/{fd.c → fd.cc} +0 -0
  575. /data/third_party/boringssl-with-bazel/src/crypto/bio/{hexdump.c → hexdump.cc} +0 -0
  576. /data/third_party/boringssl-with-bazel/src/crypto/bio/{socket.c → socket.cc} +0 -0
  577. /data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/{cipher_extra.c → cipher_extra.cc} +0 -0
  578. /data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/{derive_key.c → derive_key.cc} +0 -0
  579. /data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/{tls_cbc.c → tls_cbc.cc} +0 -0
  580. /data/third_party/boringssl-with-bazel/src/crypto/des/{des.c → des.cc} +0 -0
  581. /data/third_party/boringssl-with-bazel/src/crypto/dh_extra/{params.c → params.cc} +0 -0
  582. /data/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/{ecdh_extra.c → ecdh_extra.cc} +0 -0
  583. /data/third_party/boringssl-with-bazel/src/crypto/evp/{evp_asn1.c → evp_asn1.cc} +0 -0
  584. /data/third_party/boringssl-with-bazel/src/crypto/evp/{sign.c → sign.cc} +0 -0
  585. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/{aes.c.inc → aes.cc.inc} +0 -0
  586. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/{mode_wrappers.c.inc → mode_wrappers.cc.inc} +0 -0
  587. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{bytes.c.inc → bytes.cc.inc} +0 -0
  588. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{cmp.c.inc → cmp.cc.inc} +0 -0
  589. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{generic.c.inc → generic.cc.inc} +0 -0
  590. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{jacobi.c.inc → jacobi.cc.inc} +0 -0
  591. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{montgomery_inv.c.inc → montgomery_inv.cc.inc} +0 -0
  592. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{random.c.inc → random.cc.inc} +0 -0
  593. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{rsaz_exp.c.inc → rsaz_exp.cc.inc} +0 -0
  594. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{sqrt.c.inc → sqrt.cc.inc} +0 -0
  595. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/{e_aesccm.c.inc → e_aesccm.cc.inc} +0 -0
  596. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/{check.c.inc → check.cc.inc} +0 -0
  597. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{ec_montgomery.c.inc → ec_montgomery.cc.inc} +0 -0
  598. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{simple.c.inc → simple.cc.inc} +0 -0
  599. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/{cbc.c.inc → cbc.cc.inc} +0 -0
  600. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/{cfb.c.inc → cfb.cc.inc} +0 -0
  601. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/{ctr.c.inc → ctr.cc.inc} +0 -0
  602. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/{ofb.c.inc → ofb.cc.inc} +0 -0
  603. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/{kdf.c.inc → kdf.cc.inc} +0 -0
  604. /data/third_party/boringssl-with-bazel/src/crypto/obj/{obj_xref.c → obj_xref.cc} +0 -0
  605. /data/third_party/boringssl-with-bazel/src/crypto/pem/{pem_all.c → pem_all.cc} +0 -0
  606. /data/third_party/boringssl-with-bazel/src/crypto/pem/{pem_pk8.c → pem_pk8.cc} +0 -0
  607. /data/third_party/boringssl-with-bazel/src/crypto/pem/{pem_pkey.c → pem_pkey.cc} +0 -0
  608. /data/third_party/boringssl-with-bazel/src/crypto/pem/{pem_x509.c → pem_x509.cc} +0 -0
  609. /data/third_party/boringssl-with-bazel/src/crypto/pem/{pem_xaux.c → pem_xaux.cc} +0 -0
  610. /data/third_party/boringssl-with-bazel/src/crypto/rc4/{rc4.c → rc4.cc} +0 -0
  611. /data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/{rsa_print.c → rsa_print.cc} +0 -0
  612. /data/third_party/boringssl-with-bazel/src/crypto/{thread.c → thread.cc} +0 -0
  613. /data/third_party/boringssl-with-bazel/src/crypto/x509/{by_file.c → by_file.cc} +0 -0
  614. /data/third_party/boringssl-with-bazel/src/crypto/x509/{i2d_pr.c → i2d_pr.cc} +0 -0
  615. /data/third_party/boringssl-with-bazel/src/crypto/x509/{name_print.c → name_print.cc} +0 -0
  616. /data/third_party/boringssl-with-bazel/src/crypto/x509/{t_crl.c → t_crl.cc} +0 -0
  617. /data/third_party/boringssl-with-bazel/src/crypto/x509/{t_req.c → t_req.cc} +0 -0
  618. /data/third_party/boringssl-with-bazel/src/crypto/x509/{t_x509.c → t_x509.cc} +0 -0
  619. /data/third_party/boringssl-with-bazel/src/crypto/x509/{t_x509a.c → t_x509a.cc} +0 -0
  620. /data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_akeya.c → v3_akeya.cc} +0 -0
  621. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x509.c → x509.cc} +0 -0
  622. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_cmp.c → x509_cmp.cc} +0 -0
  623. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_d2.c → x509_d2.cc} +0 -0
  624. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_def.c → x509_def.cc} +0 -0
  625. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_ext.c → x509_ext.cc} +0 -0
  626. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_obj.c → x509_obj.cc} +0 -0
  627. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_req.c → x509_req.cc} +0 -0
  628. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_set.c → x509_set.cc} +0 -0
  629. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_trs.c → x509_trs.cc} +0 -0
  630. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_txt.c → x509_txt.cc} +0 -0
  631. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x509cset.c → x509cset.cc} +0 -0
  632. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x509name.c → x509name.cc} +0 -0
  633. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x509rset.c → x509rset.cc} +0 -0
  634. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x_algor.c → x_algor.cc} +0 -0
  635. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x_attrib.c → x_attrib.cc} +0 -0
  636. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x_exten.c → x_exten.cc} +0 -0
  637. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x_req.c → x_req.cc} +0 -0
  638. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x_sig.c → x_sig.cc} +0 -0
  639. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x_spki.c → x_spki.cc} +0 -0
  640. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x_val.c → x_val.cc} +0 -0
@@ -155,7 +155,6 @@
155
155
  #include <utility>
156
156
 
157
157
  #include <openssl/aead.h>
158
- #include <openssl/aes.h>
159
158
  #include <openssl/curve25519.h>
160
159
  #include <openssl/err.h>
161
160
  #include <openssl/hpke.h>
@@ -189,13 +188,60 @@ struct SSL_X509_METHOD;
189
188
 
190
189
  // C++ utilities.
191
190
 
191
+ // Fill-ins for various functions in C++17.
192
+ // TODO(crbug.com/42290600): Replace these with the standard ones when we
193
+ // require C++17.
194
+
195
+ template <typename ForwardIt>
196
+ ForwardIt cxx17_uninitialized_default_construct_n(ForwardIt first, size_t n) {
197
+ using T = typename std::iterator_traits<ForwardIt>::value_type;
198
+ while (n > 0) {
199
+ new (std::addressof(*first)) T;
200
+ first++;
201
+ n--;
202
+ }
203
+ return first;
204
+ }
205
+
206
+ template <typename ForwardIt>
207
+ ForwardIt cxx17_uninitialized_value_construct_n(ForwardIt first, size_t n) {
208
+ using T = typename std::iterator_traits<ForwardIt>::value_type;
209
+ while (n > 0) {
210
+ new (std::addressof(*first)) T();
211
+ first++;
212
+ n--;
213
+ }
214
+ return first;
215
+ }
216
+
217
+ template <typename InputIt, typename OutputIt>
218
+ InputIt cxx17_uninitialized_move(InputIt first, InputIt last, OutputIt out) {
219
+ using OutputT = typename std::iterator_traits<OutputIt>::value_type;
220
+ for (; first != last; ++first) {
221
+ new (std::addressof(*out)) OutputT(std::move(*first));
222
+ ++out;
223
+ }
224
+ return out;
225
+ }
226
+
227
+ template <typename ForwardIt>
228
+ ForwardIt cxx17_destroy_n(ForwardIt first, size_t n) {
229
+ using T = typename std::iterator_traits<ForwardIt>::value_type;
230
+ while (n > 0) {
231
+ first->~T();
232
+ first++;
233
+ n--;
234
+ }
235
+ return first;
236
+ }
237
+
192
238
  // New behaves like |new| but uses |OPENSSL_malloc| for memory allocation. It
193
239
  // returns nullptr on allocation error. It only implements single-object
194
240
  // allocation and not new T[n].
195
241
  //
196
242
  // Note: unlike |new|, this does not support non-public constructors.
197
243
  template <typename T, typename... Args>
198
- T *New(Args &&... args) {
244
+ T *New(Args &&...args) {
199
245
  void *t = OPENSSL_malloc(sizeof(T));
200
246
  if (t == nullptr) {
201
247
  return nullptr;
@@ -226,7 +272,7 @@ struct DeleterImpl<T, std::enable_if_t<T::kAllowUniquePtr>> {
226
272
  // MakeUnique behaves like |std::make_unique| but returns nullptr on allocation
227
273
  // error.
228
274
  template <typename T, typename... Args>
229
- UniquePtr<T> MakeUnique(Args &&... args) {
275
+ UniquePtr<T> MakeUnique(Args &&...args) {
230
276
  return UniquePtr<T>(New<T>(std::forward<Args>(args)...));
231
277
  }
232
278
 
@@ -253,8 +299,14 @@ class Array {
253
299
  size_t size() const { return size_; }
254
300
  bool empty() const { return size_ == 0; }
255
301
 
256
- const T &operator[](size_t i) const { return data_[i]; }
257
- T &operator[](size_t i) { return data_[i]; }
302
+ const T &operator[](size_t i) const {
303
+ BSSL_CHECK(i < size_);
304
+ return data_[i];
305
+ }
306
+ T &operator[](size_t i) {
307
+ BSSL_CHECK(i < size_);
308
+ return data_[i];
309
+ }
258
310
 
259
311
  T *begin() { return data_; }
260
312
  const T *begin() const { return data_; }
@@ -266,9 +318,7 @@ class Array {
266
318
  // Reset releases the current contents of the array and takes ownership of the
267
319
  // raw pointer supplied by the caller.
268
320
  void Reset(T *new_data, size_t new_size) {
269
- for (size_t i = 0; i < size_; i++) {
270
- data_[i].~T();
271
- }
321
+ cxx17_destroy_n(data_, size_);
272
322
  OPENSSL_free(data_);
273
323
  data_ = new_data;
274
324
  size_ = new_size;
@@ -284,38 +334,35 @@ class Array {
284
334
  }
285
335
 
286
336
  // Init replaces the array with a newly-allocated array of |new_size|
287
- // default-constructed copies of |T|. It returns true on success and false on
288
- // error.
289
- //
290
- // Note that if |T| is a primitive type like |uint8_t|, it is uninitialized.
337
+ // value-constructed copies of |T|. It returns true on success and false on
338
+ // error. If |T| is a primitive type like |uint8_t|, value-construction means
339
+ // it will be zero-initialized.
291
340
  bool Init(size_t new_size) {
292
- Reset();
293
- if (new_size == 0) {
294
- return true;
295
- }
296
-
297
- if (new_size > std::numeric_limits<size_t>::max() / sizeof(T)) {
298
- OPENSSL_PUT_ERROR(SSL, ERR_R_OVERFLOW);
341
+ if (!InitUninitialized(new_size)) {
299
342
  return false;
300
343
  }
301
- data_ = reinterpret_cast<T *>(OPENSSL_malloc(new_size * sizeof(T)));
302
- if (data_ == nullptr) {
344
+ cxx17_uninitialized_value_construct_n(data_, size_);
345
+ return true;
346
+ }
347
+
348
+ // InitForOverwrite behaves like |Init| but it default-constructs each element
349
+ // instead. This means that, if |T| is a primitive type, the array will be
350
+ // uninitialized and thus must be filled in by the caller.
351
+ bool InitForOverwrite(size_t new_size) {
352
+ if (!InitUninitialized(new_size)) {
303
353
  return false;
304
354
  }
305
- size_ = new_size;
306
- for (size_t i = 0; i < size_; i++) {
307
- new (&data_[i]) T;
308
- }
355
+ cxx17_uninitialized_default_construct_n(data_, size_);
309
356
  return true;
310
357
  }
311
358
 
312
359
  // CopyFrom replaces the array with a newly-allocated copy of |in|. It returns
313
360
  // true on success and false on error.
314
361
  bool CopyFrom(Span<const T> in) {
315
- if (!Init(in.size())) {
362
+ if (!InitUninitialized(in.size())) {
316
363
  return false;
317
364
  }
318
- std::copy(in.begin(), in.end(), data_);
365
+ std::uninitialized_copy(in.begin(), in.end(), data_);
319
366
  return true;
320
367
  }
321
368
 
@@ -325,55 +372,79 @@ class Array {
325
372
  if (new_size > size_) {
326
373
  abort();
327
374
  }
328
- for (size_t i = new_size; i < size_; i++) {
329
- data_[i].~T();
330
- }
375
+ cxx17_destroy_n(data_ + new_size, size_ - new_size);
331
376
  size_ = new_size;
332
377
  }
333
378
 
334
379
  private:
380
+ // InitUninitialized replaces the array with a newly-allocated array of
381
+ // |new_size| elements, but whose constructor has not yet run. On success, the
382
+ // elements must be constructed before returning control to the caller.
383
+ bool InitUninitialized(size_t new_size) {
384
+ Reset();
385
+ if (new_size == 0) {
386
+ return true;
387
+ }
388
+
389
+ if (new_size > std::numeric_limits<size_t>::max() / sizeof(T)) {
390
+ OPENSSL_PUT_ERROR(SSL, ERR_R_OVERFLOW);
391
+ return false;
392
+ }
393
+ data_ = reinterpret_cast<T *>(OPENSSL_malloc(new_size * sizeof(T)));
394
+ if (data_ == nullptr) {
395
+ return false;
396
+ }
397
+ size_ = new_size;
398
+ return true;
399
+ }
400
+
335
401
  T *data_ = nullptr;
336
402
  size_t size_ = 0;
337
403
  };
338
404
 
339
- // GrowableArray<T> is an array that owns elements of |T|, backed by an
340
- // Array<T>. When necessary, pushing will automatically trigger a resize.
341
- //
342
- // Note, for simplicity, this class currently differs from |std::vector| in that
343
- // |T| must be efficiently default-constructible. Allocated elements beyond the
344
- // end of the array are constructed and destructed.
405
+ // Vector<T> is a resizable array of elements of |T|.
345
406
  template <typename T>
346
- class GrowableArray {
407
+ class Vector {
347
408
  public:
348
- GrowableArray() = default;
349
- GrowableArray(const GrowableArray &) = delete;
350
- GrowableArray(GrowableArray &&other) { *this = std::move(other); }
351
- ~GrowableArray() {}
352
-
353
- GrowableArray &operator=(const GrowableArray &) = delete;
354
- GrowableArray &operator=(GrowableArray &&other) {
355
- size_ = other.size_;
356
- other.size_ = 0;
357
- array_ = std::move(other.array_);
409
+ Vector() = default;
410
+ Vector(const Vector &) = delete;
411
+ Vector(Vector &&other) { *this = std::move(other); }
412
+ ~Vector() { clear(); }
413
+
414
+ Vector &operator=(const Vector &) = delete;
415
+ Vector &operator=(Vector &&other) {
416
+ clear();
417
+ std::swap(data_, other.data_);
418
+ std::swap(size_, other.size_);
419
+ std::swap(capacity_, other.capacity_);
358
420
  return *this;
359
421
  }
360
422
 
361
- const T *data() const { return array_.data(); }
362
- T *data() { return array_.data(); }
423
+ const T *data() const { return data_; }
424
+ T *data() { return data_; }
363
425
  size_t size() const { return size_; }
364
426
  bool empty() const { return size_ == 0; }
365
427
 
366
- const T &operator[](size_t i) const { return array_[i]; }
367
- T &operator[](size_t i) { return array_[i]; }
428
+ const T &operator[](size_t i) const {
429
+ BSSL_CHECK(i < size_);
430
+ return data_[i];
431
+ }
432
+ T &operator[](size_t i) {
433
+ BSSL_CHECK(i < size_);
434
+ return data_[i];
435
+ }
368
436
 
369
- T *begin() { return array_.data(); }
370
- const T *begin() const { return array_.data(); }
371
- T *end() { return array_.data() + size_; }
372
- const T *end() const { return array_.data() + size_; }
437
+ T *begin() { return data_; }
438
+ const T *begin() const { return data_; }
439
+ T *end() { return data_ + size_; }
440
+ const T *end() const { return data_ + size_; }
373
441
 
374
442
  void clear() {
443
+ cxx17_destroy_n(data_, size_);
444
+ OPENSSL_free(data_);
445
+ data_ = nullptr;
375
446
  size_ = 0;
376
- array_.Reset();
447
+ capacity_ = 0;
377
448
  }
378
449
 
379
450
  // Push adds |elem| at the end of the internal array, growing if necessary. It
@@ -382,7 +453,7 @@ class GrowableArray {
382
453
  if (!MaybeGrow()) {
383
454
  return false;
384
455
  }
385
- array_[size_] = std::move(elem);
456
+ new (&data_[size_]) T(std::move(elem));
386
457
  size_++;
387
458
  return true;
388
459
  }
@@ -390,10 +461,14 @@ class GrowableArray {
390
461
  // CopyFrom replaces the contents of the array with a copy of |in|. It returns
391
462
  // true on success and false on allocation error.
392
463
  bool CopyFrom(Span<const T> in) {
393
- if (!array_.CopyFrom(in)) {
464
+ Array<T> copy;
465
+ if (!copy.CopyFrom(in)) {
394
466
  return false;
395
467
  }
396
- size_ = in.size();
468
+
469
+ clear();
470
+ copy.Release(&data_, &size_);
471
+ capacity_ = size_;
397
472
  return true;
398
473
  }
399
474
 
@@ -401,39 +476,249 @@ class GrowableArray {
401
476
  // If there is no room for one more element, creates a new backing array with
402
477
  // double the size of the old one and copies elements over.
403
478
  bool MaybeGrow() {
404
- if (array_.size() == 0) {
405
- return array_.Init(kDefaultSize);
406
- }
407
479
  // No need to grow if we have room for one more T.
408
- if (size_ < array_.size()) {
480
+ if (size_ < capacity_) {
409
481
  return true;
410
482
  }
411
- // Double the array's size if it's safe to do so.
412
- if (array_.size() > std::numeric_limits<size_t>::max() / 2) {
483
+ size_t new_capacity = kDefaultSize;
484
+ if (capacity_ > 0) {
485
+ // Double the array's size if it's safe to do so.
486
+ if (capacity_ > std::numeric_limits<size_t>::max() / 2) {
487
+ OPENSSL_PUT_ERROR(SSL, ERR_R_OVERFLOW);
488
+ return false;
489
+ }
490
+ new_capacity = capacity_ * 2;
491
+ }
492
+ if (new_capacity > std::numeric_limits<size_t>::max() / sizeof(T)) {
413
493
  OPENSSL_PUT_ERROR(SSL, ERR_R_OVERFLOW);
414
494
  return false;
415
495
  }
416
- Array<T> new_array;
417
- if (!new_array.Init(array_.size() * 2)) {
496
+ T *new_data =
497
+ reinterpret_cast<T *>(OPENSSL_malloc(new_capacity * sizeof(T)));
498
+ if (new_data == nullptr) {
418
499
  return false;
419
500
  }
420
- for (size_t i = 0; i < array_.size(); i++) {
421
- new_array[i] = std::move(array_[i]);
422
- }
423
- array_ = std::move(new_array);
424
-
501
+ size_t new_size = size_;
502
+ cxx17_uninitialized_move(begin(), end(), new_data);
503
+ clear();
504
+ data_ = new_data;
505
+ size_ = new_size;
506
+ capacity_ = new_capacity;
425
507
  return true;
426
508
  }
427
509
 
428
- // |size_| is the number of elements stored in this GrowableArray.
510
+ // data_ is a pointer to |capacity_| objects of size |T|, the first |size_| of
511
+ // which are constructed.
512
+ T *data_ = nullptr;
513
+ // |size_| is the number of elements stored in this Vector.
429
514
  size_t size_ = 0;
430
- // |array_| is the backing array. Note that |array_.size()| is this
431
- // GrowableArray's current capacity and that |size_ <= array_.size()|.
432
- Array<T> array_;
515
+ // |capacity_| is the number of elements allocated in this Vector.
516
+ size_t capacity_ = 0;
433
517
  // |kDefaultSize| is the default initial size of the backing array.
434
518
  static constexpr size_t kDefaultSize = 16;
435
519
  };
436
520
 
521
+ // A PackedSize is an integer that can store values from 0 to N, represented as
522
+ // a minimal-width integer.
523
+ template <size_t N>
524
+ using PackedSize = std::conditional_t<
525
+ N <= 0xff, uint8_t,
526
+ std::conditional_t<N <= 0xffff, uint16_t,
527
+ std::conditional_t<N <= 0xffffffff, uint32_t, size_t>>>;
528
+
529
+ // An InplaceVector is like a Vector, but stores up to N elements inline in the
530
+ // object. It is inspired by std::inplace_vector in C++26.
531
+ template <typename T, size_t N>
532
+ class InplaceVector {
533
+ public:
534
+ InplaceVector() = default;
535
+ InplaceVector(const InplaceVector &other) { *this = other; }
536
+ InplaceVector(InplaceVector &&other) { *this = std::move(other); }
537
+ ~InplaceVector() { clear(); }
538
+ InplaceVector &operator=(const InplaceVector &other) {
539
+ if (this != &other) {
540
+ CopyFrom(other);
541
+ }
542
+ return *this;
543
+ }
544
+ InplaceVector &operator=(InplaceVector &&other) {
545
+ clear();
546
+ cxx17_uninitialized_move(other.begin(), other.end(), data());
547
+ size_ = other.size();
548
+ return *this;
549
+ }
550
+
551
+ const T *data() const { return reinterpret_cast<const T *>(storage_); }
552
+ T *data() { return reinterpret_cast<T *>(storage_); }
553
+ size_t size() const { return size_; }
554
+ static constexpr size_t capacity() { return N; }
555
+ bool empty() const { return size_ == 0; }
556
+
557
+ const T &operator[](size_t i) const {
558
+ BSSL_CHECK(i < size_);
559
+ return data()[i];
560
+ }
561
+ T &operator[](size_t i) {
562
+ BSSL_CHECK(i < size_);
563
+ return data()[i];
564
+ }
565
+
566
+ T *begin() { return data(); }
567
+ const T *begin() const { return data(); }
568
+ T *end() { return data() + size_; }
569
+ const T *end() const { return data() + size_; }
570
+
571
+ void clear() { Shrink(0); }
572
+
573
+ // Shrink resizes the vector to |new_size|, which must not be larger than the
574
+ // current size. Unlike |Resize|, this can be called when |T| is not
575
+ // default-constructible.
576
+ void Shrink(size_t new_size) {
577
+ BSSL_CHECK(new_size <= size_);
578
+ cxx17_destroy_n(data() + new_size, size_ - new_size);
579
+ size_ = static_cast<PackedSize<N>>(new_size);
580
+ }
581
+
582
+ // TryResize resizes the vector to |new_size| and returns true, or returns
583
+ // false if |new_size| is too large. Any newly-added elements are
584
+ // value-initialized.
585
+ bool TryResize(size_t new_size) {
586
+ if (new_size <= size_) {
587
+ Shrink(new_size);
588
+ return true;
589
+ }
590
+ if (new_size > capacity()) {
591
+ return false;
592
+ }
593
+ cxx17_uninitialized_value_construct_n(data() + size_, new_size - size_);
594
+ size_ = static_cast<PackedSize<N>>(new_size);
595
+ return true;
596
+ }
597
+
598
+ // TryResizeForOverwrite behaves like |TryResize|, but newly-added elements
599
+ // are default-initialized, so POD types may contain uninitialized values that
600
+ // the caller is responsible for filling in.
601
+ bool TryResizeForOverwrite(size_t new_size) {
602
+ if (new_size <= size_) {
603
+ Shrink(new_size);
604
+ return true;
605
+ }
606
+ if (new_size > capacity()) {
607
+ return false;
608
+ }
609
+ cxx17_uninitialized_default_construct_n(data() + size_, new_size - size_);
610
+ size_ = static_cast<PackedSize<N>>(new_size);
611
+ return true;
612
+ }
613
+
614
+ // TryCopyFrom sets the vector to a copy of |in| and returns true, or returns
615
+ // false if |in| is too large.
616
+ bool TryCopyFrom(Span<const T> in) {
617
+ if (in.size() > capacity()) {
618
+ return false;
619
+ }
620
+ clear();
621
+ std::uninitialized_copy(in.begin(), in.end(), data());
622
+ size_ = in.size();
623
+ return true;
624
+ }
625
+
626
+ // TryPushBack appends |val| to the vector and returns a pointer to the
627
+ // newly-inserted value, or nullptr if the vector is at capacity.
628
+ T *TryPushBack(T val) {
629
+ if (size() >= capacity()) {
630
+ return nullptr;
631
+ }
632
+ T *ret = &data()[size_];
633
+ new (ret) T(std::move(val));
634
+ size_++;
635
+ return ret;
636
+ }
637
+
638
+ // The following methods behave like their |Try*| counterparts, but abort the
639
+ // program on failure.
640
+ void Resize(size_t size) { BSSL_CHECK(TryResize(size)); }
641
+ void ResizeForOverwrite(size_t size) {
642
+ BSSL_CHECK(TryResizeForOverwrite(size));
643
+ }
644
+ void CopyFrom(Span<const T> in) { BSSL_CHECK(TryCopyFrom(in)); }
645
+ T &PushBack(T val) {
646
+ T *ret = TryPushBack(std::move(val));
647
+ BSSL_CHECK(ret != nullptr);
648
+ return *ret;
649
+ }
650
+
651
+ template <typename Pred>
652
+ void EraseIf(Pred pred) {
653
+ // See if anything needs to be erased at all. This avoids a self-move.
654
+ auto iter = std::find_if(begin(), end(), pred);
655
+ if (iter == end()) {
656
+ return;
657
+ }
658
+
659
+ // Elements before the first to be erased may be left as-is.
660
+ size_t new_size = iter - begin();
661
+ // Swap all subsequent elements in if they are to be kept.
662
+ for (size_t i = new_size + 1; i < size(); i++) {
663
+ if (!pred((*this)[i])) {
664
+ (*this)[new_size] = std::move((*this)[i]);
665
+ new_size++;
666
+ }
667
+ }
668
+
669
+ Shrink(new_size);
670
+ }
671
+
672
+ private:
673
+ alignas(T) char storage_[sizeof(T[N])];
674
+ PackedSize<N> size_ = 0;
675
+ };
676
+
677
+ // An MRUQueue maintains a queue of up to |N| objects of type |T|. If the queue
678
+ // is at capacity, adding to the queue pops the least recently added element.
679
+ template <typename T, size_t N>
680
+ class MRUQueue {
681
+ public:
682
+ static constexpr bool kAllowUniquePtr = true;
683
+
684
+ MRUQueue() = default;
685
+
686
+ // If we ever need to make this type movable, we could. (The defaults almost
687
+ // work except we need |start_| to be reset when moved-from.)
688
+ MRUQueue(const MRUQueue &other) = delete;
689
+ MRUQueue &operator=(const MRUQueue &other) = delete;
690
+
691
+ bool empty() const { return size() == 0; }
692
+ size_t size() const { return storage_.size(); }
693
+
694
+ T &operator[](size_t i) {
695
+ BSSL_CHECK(i < size());
696
+ return storage_[(start_ + i) % N];
697
+ }
698
+ const T &operator[](size_t i) const {
699
+ return (*const_cast<MRUQueue *>(this))[i];
700
+ }
701
+
702
+ void Clear() {
703
+ storage_.clear();
704
+ start_ = 0;
705
+ }
706
+
707
+ void PushBack(T t) {
708
+ if (storage_.size() < N) {
709
+ assert(start_ == 0);
710
+ storage_.PushBack(std::move(t));
711
+ } else {
712
+ (*this)[0] = std::move(t);
713
+ start_ = (start_ + 1) % N;
714
+ }
715
+ }
716
+
717
+ private:
718
+ InplaceVector<T, N> storage_;
719
+ PackedSize<N> start_ = 0;
720
+ };
721
+
437
722
  // CBBFinishArray behaves like |CBB_finish| but stores the result in an Array.
438
723
  OPENSSL_EXPORT bool CBBFinishArray(CBB *cbb, Array<uint8_t> *out);
439
724
 
@@ -548,6 +833,11 @@ bool ssl_add_supported_versions(const SSL_HANDSHAKE *hs, CBB *cbb,
548
833
  bool ssl_negotiate_version(SSL_HANDSHAKE *hs, uint8_t *out_alert,
549
834
  uint16_t *out_version, const CBS *peer_versions);
550
835
 
836
+ // ssl_has_final_version returns whether |ssl| has determined the final version.
837
+ // This may be used to distinguish the predictive 0-RTT version from the final
838
+ // one.
839
+ bool ssl_has_final_version(const SSL *ssl);
840
+
551
841
  // ssl_protocol_version returns |ssl|'s protocol version. It is an error to
552
842
  // call this function before the version is determined.
553
843
  uint16_t ssl_protocol_version(const SSL *ssl);
@@ -672,7 +962,7 @@ Span<const SSL_CIPHER> AllCiphers();
672
962
  bool ssl_cipher_get_evp_aead(const EVP_AEAD **out_aead,
673
963
  size_t *out_mac_secret_len,
674
964
  size_t *out_fixed_iv_len, const SSL_CIPHER *cipher,
675
- uint16_t version, bool is_dtls);
965
+ uint16_t version);
676
966
 
677
967
  // ssl_get_handshake_digest returns the |EVP_MD| corresponding to |version| and
678
968
  // |cipher|.
@@ -733,7 +1023,7 @@ OPENSSL_EXPORT bool ssl_cipher_is_deprecated(const SSL_CIPHER *cipher);
733
1023
  // buffer and running hash.
734
1024
  class SSLTranscript {
735
1025
  public:
736
- SSLTranscript();
1026
+ explicit SSLTranscript(bool is_dtls);
737
1027
  ~SSLTranscript();
738
1028
 
739
1029
  SSLTranscript(SSLTranscript &&other) = default;
@@ -796,10 +1086,23 @@ class SSLTranscript {
796
1086
  bool from_server) const;
797
1087
 
798
1088
  private:
1089
+ // HashBuffer initializes |ctx| to use |digest| and writes the contents of
1090
+ // |buffer_| to |ctx|. If this SSLTranscript is for DTLS 1.3, the appropriate
1091
+ // bytes in |buffer_| will be skipped when hashing the buffer.
1092
+ bool HashBuffer(EVP_MD_CTX *ctx, const EVP_MD *digest) const;
1093
+
1094
+ // AddToBufferOrHash directly adds the contents of |in| to |buffer_| and/or
1095
+ // |hash_|.
1096
+ bool AddToBufferOrHash(Span<const uint8_t> in);
1097
+
799
1098
  // buffer_, if non-null, contains the handshake transcript.
800
1099
  UniquePtr<BUF_MEM> buffer_;
801
1100
  // hash, if initialized with an |EVP_MD|, maintains the handshake hash.
802
1101
  ScopedEVP_MD_CTX hash_;
1102
+ // is_dtls_ indicates whether this is a transcript for a DTLS connection.
1103
+ bool is_dtls_ : 1;
1104
+ // version_ contains the version for the connection (if known).
1105
+ uint16_t version_ = 0;
803
1106
  };
804
1107
 
805
1108
  // tls1_prf computes the PRF function for |ssl|. It fills |out|, using |secret|
@@ -812,21 +1115,11 @@ bool tls1_prf(const EVP_MD *digest, Span<uint8_t> out,
812
1115
 
813
1116
  // Encryption layer.
814
1117
 
815
- class RecordNumberEncrypter {
816
- public:
817
- virtual ~RecordNumberEncrypter() = default;
818
- static constexpr bool kAllowUniquePtr = true;
819
-
820
- virtual size_t KeySize() = 0;
821
- virtual bool SetKey(Span<const uint8_t> key) = 0;
822
- virtual bool GenerateMask(Span<uint8_t> out, Span<const uint8_t> sample) = 0;
823
- };
824
-
825
1118
  // SSLAEADContext contains information about an AEAD that is being used to
826
1119
  // encrypt an SSL connection.
827
1120
  class SSLAEADContext {
828
1121
  public:
829
- SSLAEADContext(uint16_t version, bool is_dtls, const SSL_CIPHER *cipher);
1122
+ explicit SSLAEADContext(const SSL_CIPHER *cipher);
830
1123
  ~SSLAEADContext();
831
1124
  static constexpr bool kAllowUniquePtr = true;
832
1125
 
@@ -834,38 +1127,23 @@ class SSLAEADContext {
834
1127
  SSLAEADContext &operator=(const SSLAEADContext &&) = delete;
835
1128
 
836
1129
  // CreateNullCipher creates an |SSLAEADContext| for the null cipher.
837
- static UniquePtr<SSLAEADContext> CreateNullCipher(bool is_dtls);
1130
+ static UniquePtr<SSLAEADContext> CreateNullCipher();
838
1131
 
839
1132
  // Create creates an |SSLAEADContext| using the supplied key material. It
840
1133
  // returns nullptr on error. Only one of |Open| or |Seal| may be used with the
841
- // resulting object, depending on |direction|. |version| is the normalized
842
- // protocol version, so DTLS 1.0 is represented as 0x0301, not 0xffef.
1134
+ // resulting object, depending on |direction|. |version| is the wire version.
843
1135
  static UniquePtr<SSLAEADContext> Create(enum evp_aead_direction_t direction,
844
- uint16_t version, bool is_dtls,
1136
+ uint16_t version,
845
1137
  const SSL_CIPHER *cipher,
846
1138
  Span<const uint8_t> enc_key,
847
1139
  Span<const uint8_t> mac_key,
848
1140
  Span<const uint8_t> fixed_iv);
849
1141
 
850
1142
  // CreatePlaceholderForQUIC creates a placeholder |SSLAEADContext| for the
851
- // given cipher and version. The resulting object can be queried for various
852
- // properties but cannot encrypt or decrypt data.
1143
+ // given cipher. The resulting object can be queried for various properties
1144
+ // but cannot encrypt or decrypt data.
853
1145
  static UniquePtr<SSLAEADContext> CreatePlaceholderForQUIC(
854
- uint16_t version, const SSL_CIPHER *cipher);
855
-
856
- // SetVersionIfNullCipher sets the version the SSLAEADContext for the null
857
- // cipher, to make version-specific determinations in the record layer prior
858
- // to a cipher being selected.
859
- void SetVersionIfNullCipher(uint16_t version);
860
-
861
- // ProtocolVersion returns the protocol version associated with this
862
- // SSLAEADContext. It can only be called once |version_| has been set to a
863
- // valid value.
864
- uint16_t ProtocolVersion() const;
865
-
866
- // RecordVersion returns the record version that should be used with this
867
- // SSLAEADContext for record construction and crypto.
868
- uint16_t RecordVersion() const;
1146
+ const SSL_CIPHER *cipher);
869
1147
 
870
1148
  const SSL_CIPHER *cipher() const { return cipher_; }
871
1149
 
@@ -878,6 +1156,10 @@ class SSLAEADContext {
878
1156
  // MaxOverhead returns the maximum overhead of calling |Seal|.
879
1157
  size_t MaxOverhead() const;
880
1158
 
1159
+ // MaxSealInputLen returns the maximum length for |Seal| that can fit in
1160
+ // |max_out| output bytes, or zero if no input may fit.
1161
+ size_t MaxSealInputLen(size_t max_out) const;
1162
+
881
1163
  // SuffixLen calculates the suffix length written by |SealScatter| and writes
882
1164
  // it to |*out_suffix_len|. It returns true on success and false on error.
883
1165
  // |in_len| and |extra_in_len| should equal the argument of the same names
@@ -927,17 +1209,6 @@ class SSLAEADContext {
927
1209
 
928
1210
  bool GetIV(const uint8_t **out_iv, size_t *out_iv_len) const;
929
1211
 
930
- RecordNumberEncrypter *GetRecordNumberEncrypter() {
931
- return rn_encrypter_.get();
932
- }
933
-
934
- // GenerateRecordNumberMask computes the mask used for DTLS 1.3 record number
935
- // encryption (RFC 9147 section 4.2.3), writing it to |out|. The |out| buffer
936
- // must be sized to AES_BLOCK_SIZE. The |sample| buffer must be at least 16
937
- // bytes, as required by the AES and ChaCha20 cipher suites in RFC 9147. Extra
938
- // bytes in |sample| will be ignored.
939
- bool GenerateRecordNumberMask(Span<uint8_t> out, Span<const uint8_t> sample);
940
-
941
1212
  private:
942
1213
  // GetAdditionalData returns the additional data, writing into |storage| if
943
1214
  // necessary.
@@ -946,19 +1217,12 @@ class SSLAEADContext {
946
1217
  uint64_t seqnum, size_t plaintext_len,
947
1218
  Span<const uint8_t> header);
948
1219
 
949
- void CreateRecordNumberEncrypter();
950
-
951
1220
  const SSL_CIPHER *cipher_;
952
1221
  ScopedEVP_AEAD_CTX ctx_;
953
1222
  // fixed_nonce_ contains any bytes of the nonce that are fixed for all
954
1223
  // records.
955
- uint8_t fixed_nonce_[12];
956
- uint8_t fixed_nonce_len_ = 0, variable_nonce_len_ = 0;
957
- // version_ is the wire version that should be used with this AEAD.
958
- uint16_t version_;
959
- UniquePtr<RecordNumberEncrypter> rn_encrypter_;
960
- // is_dtls_ is whether DTLS is being used with this AEAD.
961
- bool is_dtls_;
1224
+ InplaceVector<uint8_t, 12> fixed_nonce_;
1225
+ uint8_t variable_nonce_len_ = 0;
962
1226
  // variable_nonce_included_in_record_ is true if the variable nonce
963
1227
  // for a record is included as a prefix before the ciphertext.
964
1228
  bool variable_nonce_included_in_record_ : 1;
@@ -976,57 +1240,31 @@ class SSLAEADContext {
976
1240
  bool ad_is_header_ : 1;
977
1241
  };
978
1242
 
979
- class AESRecordNumberEncrypter : public RecordNumberEncrypter {
980
- public:
981
- bool SetKey(Span<const uint8_t> key) override;
982
- bool GenerateMask(Span<uint8_t> out, Span<const uint8_t> sample) override;
983
1243
 
984
- private:
985
- AES_KEY key_;
986
- };
1244
+ // DTLS replay bitmap.
987
1245
 
988
- class AES128RecordNumberEncrypter : public AESRecordNumberEncrypter {
1246
+ // DTLSReplayBitmap maintains a sliding window of sequence numbers to detect
1247
+ // replayed packets.
1248
+ class DTLSReplayBitmap {
989
1249
  public:
990
- size_t KeySize() override;
991
- };
1250
+ // ShouldDiscard returns true if |seq_num| has been seen in
1251
+ // |bitmap| or is stale. Otherwise it returns false.
1252
+ bool ShouldDiscard(uint64_t seqnum) const;
992
1253
 
993
- class AES256RecordNumberEncrypter : public AESRecordNumberEncrypter {
994
- public:
995
- size_t KeySize() override;
996
- };
1254
+ // Record updates the bitmap to record receipt of sequence number
1255
+ // |seq_num|. It slides the window forward if needed. It is an error to call
1256
+ // this function on a stale sequence number.
1257
+ void Record(uint64_t seqnum);
997
1258
 
998
- class ChaChaRecordNumberEncrypter : public RecordNumberEncrypter {
999
- public:
1000
- size_t KeySize() override;
1001
- bool SetKey(Span<const uint8_t> key) override;
1002
- bool GenerateMask(Span<uint8_t> out, Span<const uint8_t> sample) override;
1259
+ uint64_t max_seq_num() const { return max_seq_num_; }
1003
1260
 
1004
1261
  private:
1005
- static const size_t kKeySize = 32;
1006
- uint8_t key_[kKeySize];
1007
- };
1008
-
1009
- #if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
1010
- class NullRecordNumberEncrypter : public RecordNumberEncrypter {
1011
- public:
1012
- size_t KeySize() override;
1013
- bool SetKey(Span<const uint8_t> key) override;
1014
- bool GenerateMask(Span<uint8_t> out, Span<const uint8_t> sample) override;
1015
- };
1016
- #endif // BORINGSSL_UNSAFE_FUZZER_MODE
1017
-
1018
-
1019
- // DTLS replay bitmap.
1020
-
1021
- // DTLS1_BITMAP maintains a sliding window of 64 sequence numbers to detect
1022
- // replayed packets. It should be initialized by zeroing every field.
1023
- struct DTLS1_BITMAP {
1024
1262
  // map is a bitset of sequence numbers that have been seen. Bit i corresponds
1025
- // to |max_seq_num - i|.
1026
- std::bitset<256> map;
1027
- // max_seq_num is the largest sequence number seen so far as a 64-bit
1263
+ // to |max_seq_num_ - i|.
1264
+ std::bitset<256> map_;
1265
+ // max_seq_num_ is the largest sequence number seen so far as a 64-bit
1028
1266
  // integer.
1029
- uint64_t max_seq_num = 0;
1267
+ uint64_t max_seq_num_ = 0;
1030
1268
  };
1031
1269
 
1032
1270
  // reconstruct_seqnum takes the low order bits of a record sequence number from
@@ -1038,11 +1276,89 @@ struct DTLS1_BITMAP {
1038
1276
  // successfully deprotected in this epoch. This function returns the sequence
1039
1277
  // number that is numerically closest to one plus |max_valid_seqnum| that when
1040
1278
  // bitwise and-ed with |seq_mask| equals |wire_seq|.
1279
+ //
1280
+ // |max_valid_seqnum| must be most 2^48-1, in which case the output will also be
1281
+ // at most 2^48-1.
1041
1282
  OPENSSL_EXPORT uint64_t reconstruct_seqnum(uint16_t wire_seq, uint64_t seq_mask,
1042
1283
  uint64_t max_valid_seqnum);
1043
1284
 
1285
+
1044
1286
  // Record layer.
1045
1287
 
1288
+ class DTLSRecordNumber {
1289
+ public:
1290
+ static constexpr uint64_t kMaxSequence = (uint64_t{1} << 48) - 1;
1291
+
1292
+ DTLSRecordNumber() = default;
1293
+ DTLSRecordNumber(uint16_t epoch, uint64_t sequence) {
1294
+ BSSL_CHECK(sequence <= kMaxSequence);
1295
+ combined_ = (uint64_t{epoch} << 48) | sequence;
1296
+ }
1297
+
1298
+ static DTLSRecordNumber FromCombined(uint64_t combined) {
1299
+ return DTLSRecordNumber(combined);
1300
+ }
1301
+
1302
+ bool operator==(DTLSRecordNumber r) const {
1303
+ return combined() == r.combined();
1304
+ }
1305
+ bool operator!=(DTLSRecordNumber r) const { return !((*this) == r); }
1306
+ bool operator<(DTLSRecordNumber r) const { return combined() < r.combined(); }
1307
+
1308
+ uint64_t combined() const { return combined_; }
1309
+ uint16_t epoch() const { return combined_ >> 48; }
1310
+ uint64_t sequence() const { return combined_ & kMaxSequence; }
1311
+
1312
+ bool HasNext() const { return sequence() < kMaxSequence; }
1313
+ DTLSRecordNumber Next() const {
1314
+ BSSL_CHECK(HasNext());
1315
+ // This will not overflow into the epoch.
1316
+ return DTLSRecordNumber::FromCombined(combined_ + 1);
1317
+ }
1318
+
1319
+ private:
1320
+ explicit DTLSRecordNumber(uint64_t combined) : combined_(combined) {}
1321
+
1322
+ uint64_t combined_ = 0;
1323
+ };
1324
+
1325
+ class RecordNumberEncrypter {
1326
+ public:
1327
+ static constexpr bool kAllowUniquePtr = true;
1328
+ static constexpr size_t kMaxKeySize = 32;
1329
+
1330
+ // Create returns a DTLS 1.3 record number encrypter for |traffic_secret|, or
1331
+ // nullptr on error.
1332
+ static UniquePtr<RecordNumberEncrypter> Create(
1333
+ const SSL_CIPHER *cipher, Span<const uint8_t> traffic_secret);
1334
+
1335
+ virtual ~RecordNumberEncrypter() = default;
1336
+ virtual size_t KeySize() = 0;
1337
+ virtual bool SetKey(Span<const uint8_t> key) = 0;
1338
+ virtual bool GenerateMask(Span<uint8_t> out, Span<const uint8_t> sample) = 0;
1339
+ };
1340
+
1341
+ struct DTLSReadEpoch {
1342
+ static constexpr bool kAllowUniquePtr = true;
1343
+
1344
+ // TODO(davidben): This could be made slightly more compact if |bitmap| stored
1345
+ // a DTLSRecordNumber.
1346
+ uint16_t epoch = 0;
1347
+ UniquePtr<SSLAEADContext> aead;
1348
+ UniquePtr<RecordNumberEncrypter> rn_encrypter;
1349
+ DTLSReplayBitmap bitmap;
1350
+ };
1351
+
1352
+ struct DTLSWriteEpoch {
1353
+ static constexpr bool kAllowUniquePtr = true;
1354
+
1355
+ uint16_t epoch() const { return next_record.epoch(); }
1356
+
1357
+ DTLSRecordNumber next_record;
1358
+ UniquePtr<SSLAEADContext> aead;
1359
+ UniquePtr<RecordNumberEncrypter> rn_encrypter;
1360
+ };
1361
+
1046
1362
  // ssl_record_prefix_len returns the length of the prefix before the ciphertext
1047
1363
  // of a record for |ssl|.
1048
1364
  //
@@ -1087,8 +1403,10 @@ enum ssl_open_record_t tls_open_record(SSL *ssl, uint8_t *out_type,
1087
1403
 
1088
1404
  // dtls_open_record implements |tls_open_record| for DTLS. It only returns
1089
1405
  // |ssl_open_record_partial| if |in| was empty and sets |*out_consumed| to
1090
- // zero. The caller should read one packet and try again.
1406
+ // zero. The caller should read one packet and try again. On success,
1407
+ // |*out_number| is set to the record number of the record.
1091
1408
  enum ssl_open_record_t dtls_open_record(SSL *ssl, uint8_t *out_type,
1409
+ DTLSRecordNumber *out_number,
1092
1410
  Span<uint8_t> *out,
1093
1411
  size_t *out_consumed,
1094
1412
  uint8_t *out_alert, Span<uint8_t> in);
@@ -1123,13 +1441,18 @@ size_t dtls_max_seal_overhead(const SSL *ssl, uint16_t epoch);
1123
1441
  // front of the plaintext when sealing a record in-place.
1124
1442
  size_t dtls_seal_prefix_len(const SSL *ssl, uint16_t epoch);
1125
1443
 
1444
+ // dtls_seal_max_input_len returns the maximum number of input bytes that can
1445
+ // fit in a record of up to |max_out| bytes, or zero if none may fit.
1446
+ size_t dtls_seal_max_input_len(const SSL *ssl, uint16_t epoch, size_t max_out);
1447
+
1126
1448
  // dtls_seal_record implements |tls_seal_record| for DTLS. |epoch| selects which
1127
1449
  // epoch's cipher state to use. Unlike |tls_seal_record|, |in| and |out| may
1128
1450
  // alias but, if they do, |in| must be exactly |dtls_seal_prefix_len| bytes
1129
- // ahead of |out|.
1130
- bool dtls_seal_record(SSL *ssl, uint8_t *out, size_t *out_len, size_t max_out,
1131
- uint8_t type, const uint8_t *in, size_t in_len,
1132
- uint16_t epoch);
1451
+ // ahead of |out|. On success, |*out_number| is set to the record number of the
1452
+ // record.
1453
+ bool dtls_seal_record(SSL *ssl, DTLSRecordNumber *out_number, uint8_t *out,
1454
+ size_t *out_len, size_t max_out, uint8_t type,
1455
+ const uint8_t *in, size_t in_len, uint16_t epoch);
1133
1456
 
1134
1457
  // ssl_process_alert processes |in| as an alert and updates |ssl|'s shutdown
1135
1458
  // state. It returns one of |ssl_open_record_discard|, |ssl_open_record_error|,
@@ -1201,8 +1524,7 @@ class SSLKeyShare {
1201
1524
  // |out_ciphertext|, and sets |*out_secret| to the shared secret. On failure,
1202
1525
  // it returns false and sets |*out_alert| to an alert to send to the peer.
1203
1526
  virtual bool Encap(CBB *out_ciphertext, Array<uint8_t> *out_secret,
1204
- uint8_t *out_alert,
1205
- Span<const uint8_t> peer_key) = 0;
1527
+ uint8_t *out_alert, Span<const uint8_t> peer_key) = 0;
1206
1528
 
1207
1529
  // Decap decapsulates the symmetric secret in |ciphertext|. On success, it
1208
1530
  // returns true and sets |*out_secret| to the shared secret. On failure, it
@@ -1288,21 +1610,13 @@ bool dtls_has_unprocessed_handshake_data(const SSL *ssl);
1288
1610
  // tls_flush_pending_hs_data flushes any handshake plaintext data.
1289
1611
  bool tls_flush_pending_hs_data(SSL *ssl);
1290
1612
 
1291
- struct DTLS_OUTGOING_MESSAGE {
1292
- DTLS_OUTGOING_MESSAGE() {}
1293
- DTLS_OUTGOING_MESSAGE(const DTLS_OUTGOING_MESSAGE &) = delete;
1294
- DTLS_OUTGOING_MESSAGE &operator=(const DTLS_OUTGOING_MESSAGE &) = delete;
1295
-
1296
- void Clear();
1297
-
1298
- Array<uint8_t> data;
1299
- uint16_t epoch = 0;
1300
- bool is_ccs = false;
1301
- };
1302
-
1303
1613
  // dtls_clear_outgoing_messages releases all buffered outgoing messages.
1304
1614
  void dtls_clear_outgoing_messages(SSL *ssl);
1305
1615
 
1616
+ // dtls_clear_unused_write_epochs releases any write epochs that are no longer
1617
+ // needed.
1618
+ void dtls_clear_unused_write_epochs(SSL *ssl);
1619
+
1306
1620
 
1307
1621
  // Callbacks.
1308
1622
 
@@ -1425,32 +1739,51 @@ enum ssl_key_usage_t {
1425
1739
  OPENSSL_EXPORT bool ssl_cert_check_key_usage(const CBS *in,
1426
1740
  enum ssl_key_usage_t bit);
1427
1741
 
1742
+ // ssl_cert_extract_issuer parses the DER-encoded, X.509 certificate in |in|
1743
+ // and extracts the issuer. On success it returns true and the DER encoded
1744
+ // issuer is in |out_dn|, otherwise it returns false.
1745
+ OPENSSL_EXPORT bool ssl_cert_extract_issuer(const CBS *in, CBS *out_dn);
1746
+
1747
+ // ssl_cert_matches_issuer parses the DER-encoded, X.509 certificate in |in|
1748
+ // and returns true if its issuer is an exact match for the DER encoded
1749
+ // distinguished name in |dn|
1750
+ bool ssl_cert_matches_issuer(const CBS *in, const CBS *dn);
1751
+
1428
1752
  // ssl_cert_parse_pubkey extracts the public key from the DER-encoded, X.509
1429
1753
  // certificate in |in|. It returns an allocated |EVP_PKEY| or else returns
1430
1754
  // nullptr and pushes to the error queue.
1431
1755
  UniquePtr<EVP_PKEY> ssl_cert_parse_pubkey(const CBS *in);
1432
1756
 
1433
- // ssl_parse_client_CA_list parses a CA list from |cbs| in the format used by a
1434
- // TLS CertificateRequest message. On success, it returns a newly-allocated
1435
- // |CRYPTO_BUFFER| list and advances |cbs|. Otherwise, it returns nullptr and
1436
- // sets |*out_alert| to an alert to send to the peer.
1437
- UniquePtr<STACK_OF(CRYPTO_BUFFER)> ssl_parse_client_CA_list(SSL *ssl,
1438
- uint8_t *out_alert,
1439
- CBS *cbs);
1757
+ // SSL_parse_CA_list parses a CA list from |cbs| in the format used by a TLS
1758
+ // CertificateRequest message and Certificate Authorities extension. On success,
1759
+ // it returns a newly-allocated |CRYPTO_BUFFER| list and advances
1760
+ // |cbs|. Otherwise, it returns nullptr and sets |*out_alert| to an alert to
1761
+ // send to the peer.
1762
+ UniquePtr<STACK_OF(CRYPTO_BUFFER)> SSL_parse_CA_list(SSL *ssl,
1763
+ uint8_t *out_alert,
1764
+ CBS *cbs);
1440
1765
 
1441
- // ssl_has_client_CAs returns there are configured CAs.
1766
+ // ssl_has_client_CAs returns whether there are configured CAs.
1442
1767
  bool ssl_has_client_CAs(const SSL_CONFIG *cfg);
1443
1768
 
1444
1769
  // ssl_add_client_CA_list adds the configured CA list to |cbb| in the format
1445
1770
  // used by a TLS CertificateRequest message. It returns true on success and
1446
1771
  // false on error.
1447
- bool ssl_add_client_CA_list(SSL_HANDSHAKE *hs, CBB *cbb);
1772
+ bool ssl_add_client_CA_list(const SSL_HANDSHAKE *hs, CBB *cbb);
1773
+
1774
+ // ssl_has_CA_names returns whether there are configured CA names.
1775
+ bool ssl_has_CA_names(const SSL_CONFIG *cfg);
1776
+
1777
+ // ssl_add_CA_names adds the configured CA_names list to |cbb| in the format
1778
+ // used by a TLS Certificate Authorities extension. It returns true on success
1779
+ // and false on error.
1780
+ bool ssl_add_CA_names(const SSL_HANDSHAKE *hs, CBB *cbb);
1448
1781
 
1449
1782
  // ssl_check_leaf_certificate returns one if |pkey| and |leaf| are suitable as
1450
1783
  // a server's leaf certificate for |hs|. Otherwise, it returns zero and pushes
1451
1784
  // an error on the error queue.
1452
1785
  bool ssl_check_leaf_certificate(SSL_HANDSHAKE *hs, EVP_PKEY *pkey,
1453
- const CRYPTO_BUFFER *leaf);
1786
+ const CRYPTO_BUFFER *leaf);
1454
1787
 
1455
1788
 
1456
1789
  // TLS 1.3 key derivation.
@@ -1677,7 +2010,7 @@ struct ssl_credential_st : public bssl::RefCounted<ssl_credential_st> {
1677
2010
  ssl_credential_st &operator=(const ssl_credential_st &) = delete;
1678
2011
 
1679
2012
  // Dup returns a copy of the credential, or nullptr on error. The |ex_data|
1680
- // values are not copied. This is only used on the default credential, whose
2013
+ // values are not copied. This is only used on the legacy credential, whose
1681
2014
  // |ex_data| is inaccessible.
1682
2015
  bssl::UniquePtr<SSL_CREDENTIAL> Dup() const;
1683
2016
 
@@ -1711,6 +2044,10 @@ struct ssl_credential_st : public bssl::RefCounted<ssl_credential_st> {
1711
2044
  // returns one on success and zero on error.
1712
2045
  bool AppendIntermediateCert(bssl::UniquePtr<CRYPTO_BUFFER> cert);
1713
2046
 
2047
+ // ChainContainsIssuer returns true if |dn| is a byte for byte match with the
2048
+ // issuer of any certificate in |chain|, false otherwise.
2049
+ bool ChainContainsIssuer(bssl::Span<const uint8_t> dn) const;
2050
+
1714
2051
  // type is the credential type and determines which other fields apply.
1715
2052
  bssl::SSLCredentialType type;
1716
2053
 
@@ -1758,6 +2095,11 @@ struct ssl_credential_st : public bssl::RefCounted<ssl_credential_st> {
1758
2095
 
1759
2096
  CRYPTO_EX_DATA ex_data;
1760
2097
 
2098
+ // must_match_issuer is a flag indicating that this credential should be
2099
+ // considered only when it matches a peer request for a particular issuer via
2100
+ // a negotiation mechanism (such as the certificate_authorities extension).
2101
+ bool must_match_issuer = false;
2102
+
1761
2103
  private:
1762
2104
  friend RefCounted;
1763
2105
  ~ssl_credential_st();
@@ -1773,6 +2115,10 @@ BSSL_NAMESPACE_BEGIN
1773
2115
  // The pointers in the result are only valid until |hs| is next mutated.
1774
2116
  bool ssl_get_credential_list(SSL_HANDSHAKE *hs, Array<SSL_CREDENTIAL *> *out);
1775
2117
 
2118
+ // ssl_credential_matches_requested_issuers returns true if |cred| is a
2119
+ // usable match for any requested issuers in |hs|.
2120
+ bool ssl_credential_matches_requested_issuers(SSL_HANDSHAKE *hs,
2121
+ const SSL_CREDENTIAL *cred);
1776
2122
 
1777
2123
  // Handshake functions.
1778
2124
 
@@ -1927,18 +2273,13 @@ struct SSL_HANDSHAKE {
1927
2273
  // |SSL_OP_NO_*| and |SSL_CTX_set_max_proto_version| APIs.
1928
2274
  uint16_t max_version = 0;
1929
2275
 
1930
- private:
1931
- size_t hash_len_ = 0;
1932
- uint8_t secret_[SSL_MAX_MD_SIZE] = {0};
1933
- uint8_t early_traffic_secret_[SSL_MAX_MD_SIZE] = {0};
1934
- uint8_t client_handshake_secret_[SSL_MAX_MD_SIZE] = {0};
1935
- uint8_t server_handshake_secret_[SSL_MAX_MD_SIZE] = {0};
1936
- uint8_t client_traffic_secret_0_[SSL_MAX_MD_SIZE] = {0};
1937
- uint8_t server_traffic_secret_0_[SSL_MAX_MD_SIZE] = {0};
1938
- uint8_t expected_client_finished_[SSL_MAX_MD_SIZE] = {0};
1939
-
1940
- public:
1941
- void ResizeSecrets(size_t hash_len);
2276
+ InplaceVector<uint8_t, SSL_MAX_MD_SIZE> secret;
2277
+ InplaceVector<uint8_t, SSL_MAX_MD_SIZE> early_traffic_secret;
2278
+ InplaceVector<uint8_t, SSL_MAX_MD_SIZE> client_handshake_secret;
2279
+ InplaceVector<uint8_t, SSL_MAX_MD_SIZE> server_handshake_secret;
2280
+ InplaceVector<uint8_t, SSL_MAX_MD_SIZE> client_traffic_secret_0;
2281
+ InplaceVector<uint8_t, SSL_MAX_MD_SIZE> server_traffic_secret_0;
2282
+ InplaceVector<uint8_t, SSL_MAX_MD_SIZE> expected_client_finished;
1942
2283
 
1943
2284
  // GetClientHello, on the server, returns either the normal ClientHello
1944
2285
  // message or the ClientHelloInner if it has been serialized to
@@ -1951,29 +2292,6 @@ struct SSL_HANDSHAKE {
1951
2292
  // SSL_HANDSHAKE.
1952
2293
  bool GetClientHello(SSLMessage *out_msg, SSL_CLIENT_HELLO *out_client_hello);
1953
2294
 
1954
- Span<uint8_t> secret() { return MakeSpan(secret_, hash_len_); }
1955
- Span<const uint8_t> secret() const {
1956
- return MakeConstSpan(secret_, hash_len_);
1957
- }
1958
- Span<uint8_t> early_traffic_secret() {
1959
- return MakeSpan(early_traffic_secret_, hash_len_);
1960
- }
1961
- Span<uint8_t> client_handshake_secret() {
1962
- return MakeSpan(client_handshake_secret_, hash_len_);
1963
- }
1964
- Span<uint8_t> server_handshake_secret() {
1965
- return MakeSpan(server_handshake_secret_, hash_len_);
1966
- }
1967
- Span<uint8_t> client_traffic_secret_0() {
1968
- return MakeSpan(client_traffic_secret_0_, hash_len_);
1969
- }
1970
- Span<uint8_t> server_traffic_secret_0() {
1971
- return MakeSpan(server_traffic_secret_0_, hash_len_);
1972
- }
1973
- Span<uint8_t> expected_client_finished() {
1974
- return MakeSpan(expected_client_finished_, hash_len_);
1975
- }
1976
-
1977
2295
  union {
1978
2296
  // sent is a bitset where the bits correspond to elements of kExtensions
1979
2297
  // in extensions.cc. Each bit is set if that extension was sent in a
@@ -2014,7 +2332,8 @@ struct SSL_HANDSHAKE {
2014
2332
 
2015
2333
  // dtls_cookie is the value of the cookie in DTLS HelloVerifyRequest. If
2016
2334
  // empty, either none was received or HelloVerifyRequest contained an empty
2017
- // cookie.
2335
+ // cookie. Check the received_hello_verify_request field to distinguish an
2336
+ // empty cookie from no HelloVerifyRequest message being received.
2018
2337
  Array<uint8_t> dtls_cookie;
2019
2338
 
2020
2339
  // ech_client_outer contains the outer ECH extension to send in the
@@ -2078,8 +2397,8 @@ struct SSL_HANDSHAKE {
2078
2397
  // server when using a TLS 1.2 PSK key exchange.
2079
2398
  UniquePtr<char> peer_psk_identity_hint;
2080
2399
 
2081
- // ca_names, on the client, contains the list of CAs received in a
2082
- // CertificateRequest message.
2400
+ // ca_names contains the list of CAs received via the Certificate Authorities
2401
+ // extension in our peer's CertificateRequest or ClientHello message
2083
2402
  UniquePtr<STACK_OF(CRYPTO_BUFFER)> ca_names;
2084
2403
 
2085
2404
  // cached_x509_ca_names contains a cache of parsed versions of the elements of
@@ -2181,6 +2500,10 @@ struct SSL_HANDSHAKE {
2181
2500
  // the handshake.
2182
2501
  bool can_early_write : 1;
2183
2502
 
2503
+ // is_early_version is true if the protocol version configured is not
2504
+ // necessarily the final version and is just the predicted 0-RTT version.
2505
+ bool is_early_version : 1;
2506
+
2184
2507
  // next_proto_neg_seen is one of NPN was negotiated.
2185
2508
  bool next_proto_neg_seen : 1;
2186
2509
 
@@ -2222,6 +2545,10 @@ struct SSL_HANDSHAKE {
2222
2545
  // handshake.
2223
2546
  bool channel_id_negotiated : 1;
2224
2547
 
2548
+ // received_hello_verify_request is true if we received a HelloVerifyRequest
2549
+ // message from the server.
2550
+ bool received_hello_verify_request : 1;
2551
+
2225
2552
  // client_version is the value sent or received in the ClientHello version.
2226
2553
  uint16_t client_version = 0;
2227
2554
 
@@ -2241,8 +2568,7 @@ struct SSL_HANDSHAKE {
2241
2568
  uint8_t ech_config_id = 0;
2242
2569
 
2243
2570
  // session_id is the session ID in the ClientHello.
2244
- uint8_t session_id[SSL_MAX_SSL_SESSION_ID_LENGTH] = {0};
2245
- uint8_t session_id_len = 0;
2571
+ InplaceVector<uint8_t, SSL_MAX_SSL_SESSION_ID_LENGTH> session_id;
2246
2572
 
2247
2573
  // grease_seed is the entropy for GREASE values.
2248
2574
  uint8_t grease_seed[ssl_grease_last_index + 1] = {0};
@@ -2278,10 +2604,9 @@ const char *ssl_server_handshake_state(SSL_HANDSHAKE *hs);
2278
2604
  const char *tls13_client_handshake_state(SSL_HANDSHAKE *hs);
2279
2605
  const char *tls13_server_handshake_state(SSL_HANDSHAKE *hs);
2280
2606
 
2281
- // tls13_add_key_update queues a KeyUpdate message on |ssl|. The
2282
- // |update_requested| argument must be one of |SSL_KEY_UPDATE_REQUESTED| or
2283
- // |SSL_KEY_UPDATE_NOT_REQUESTED|.
2284
- bool tls13_add_key_update(SSL *ssl, int update_requested);
2607
+ // tls13_add_key_update queues a KeyUpdate message on |ssl|. |request_type| must
2608
+ // be one of |SSL_KEY_UPDATE_REQUESTED| or |SSL_KEY_UPDATE_NOT_REQUESTED|.
2609
+ bool tls13_add_key_update(SSL *ssl, int request_type);
2285
2610
 
2286
2611
  // tls13_post_handshake processes a post-handshake message. It returns true on
2287
2612
  // success and false on failure.
@@ -2542,32 +2867,32 @@ struct CERT {
2542
2867
  explicit CERT(const SSL_X509_METHOD *x509_method);
2543
2868
  ~CERT();
2544
2869
 
2545
- bool is_valid() const { return default_credential != nullptr; }
2870
+ bool is_valid() const { return legacy_credential != nullptr; }
2546
2871
 
2547
2872
  // credentials is the list of credentials to select between. Elements of this
2548
2873
  // array immutable.
2549
- GrowableArray<UniquePtr<SSL_CREDENTIAL>> credentials;
2874
+ Vector<UniquePtr<SSL_CREDENTIAL>> credentials;
2550
2875
 
2551
- // default_credential is the credential configured by the legacy,
2876
+ // legacy_credential is the credential configured by the legacy
2552
2877
  // non-credential-based APIs. If IsComplete() returns true, it is appended to
2553
2878
  // the list of credentials.
2554
- UniquePtr<SSL_CREDENTIAL> default_credential;
2879
+ UniquePtr<SSL_CREDENTIAL> legacy_credential;
2555
2880
 
2556
2881
  // x509_method contains pointers to functions that might deal with |X509|
2557
2882
  // compatibility, or might be a no-op, depending on the application.
2558
2883
  const SSL_X509_METHOD *x509_method = nullptr;
2559
2884
 
2560
- // x509_chain may contain a parsed copy of |chain[1..]| from the default
2885
+ // x509_chain may contain a parsed copy of |chain[1..]| from the legacy
2561
2886
  // credential. This is only used as a cache in order to implement “get0”
2562
2887
  // functions that return a non-owning pointer to the certificate chain.
2563
2888
  STACK_OF(X509) *x509_chain = nullptr;
2564
2889
 
2565
2890
  // x509_leaf may contain a parsed copy of the first element of |chain| from
2566
- // the default credential. This is only used as a cache in order to implement
2891
+ // the legacy credential. This is only used as a cache in order to implement
2567
2892
  // “get0” functions that return a non-owning pointer to the certificate chain.
2568
2893
  X509 *x509_leaf = nullptr;
2569
2894
 
2570
- // x509_stash contains the last |X509| object append to the default
2895
+ // x509_stash contains the last |X509| object append to the legacy
2571
2896
  // credential's chain. This is a workaround for some third-party code that
2572
2897
  // continue to use an |X509| object even after passing ownership with an
2573
2898
  // “add0” function.
@@ -2588,8 +2913,7 @@ struct CERT {
2588
2913
 
2589
2914
  // sid_ctx partitions the session space within a shared session cache or
2590
2915
  // ticket key. Only sessions with a matching value will be accepted.
2591
- uint8_t sid_ctx_length = 0;
2592
- uint8_t sid_ctx[SSL_MAX_SID_CTX_LENGTH] = {0};
2916
+ InplaceVector<uint8_t, SSL_MAX_SID_CTX_LENGTH> sid_ctx;
2593
2917
  };
2594
2918
 
2595
2919
  // |SSL_PROTOCOL_METHOD| abstracts between TLS and DTLS.
@@ -2638,25 +2962,37 @@ struct SSL_PROTOCOL_METHOD {
2638
2962
  // add_change_cipher_spec adds a ChangeCipherSpec record to the pending
2639
2963
  // flight. It returns true on success and false on error.
2640
2964
  bool (*add_change_cipher_spec)(SSL *ssl);
2641
- // flush_flight flushes the pending flight to the transport. It returns one on
2642
- // success and <= 0 on error.
2643
- int (*flush_flight)(SSL *ssl);
2965
+ // finish_flight marks the pending flight as finished and ready to send.
2966
+ // |flush| must be called to write it.
2967
+ void (*finish_flight)(SSL *ssl);
2968
+ // schedule_ack schedules a DTLS 1.3 ACK to be sent, without an ACK delay.
2969
+ // |flush| must be called to write it.
2970
+ void (*schedule_ack)(SSL *ssl);
2971
+ // flush writes any scheduled data to the transport. It returns one on success
2972
+ // and <= 0 on error.
2973
+ int (*flush)(SSL *ssl);
2644
2974
  // on_handshake_complete is called when the handshake is complete.
2645
2975
  void (*on_handshake_complete)(SSL *ssl);
2646
2976
  // set_read_state sets |ssl|'s read cipher state and level to |aead_ctx| and
2647
- // |level|. In QUIC, |aead_ctx| is a placeholder object and |secret_for_quic|
2648
- // is the original secret. This function returns true on success and false on
2649
- // error.
2977
+ // |level|. In QUIC, |aead_ctx| is a placeholder object. In TLS 1.3,
2978
+ // |traffic_secret| is the original traffic secret. This function returns true
2979
+ // on success and false on error.
2980
+ //
2981
+ // TODO(crbug.com/371998381): Take the traffic secrets as input and let the
2982
+ // function create the SSLAEADContext.
2650
2983
  bool (*set_read_state)(SSL *ssl, ssl_encryption_level_t level,
2651
2984
  UniquePtr<SSLAEADContext> aead_ctx,
2652
- Span<const uint8_t> secret_for_quic);
2985
+ Span<const uint8_t> traffic_secret);
2653
2986
  // set_write_state sets |ssl|'s write cipher state and level to |aead_ctx| and
2654
- // |level|. In QUIC, |aead_ctx| is a placeholder object and |secret_for_quic|
2655
- // is the original secret. This function returns true on success and false on
2656
- // error.
2987
+ // |level|. In QUIC, |aead_ctx| is a placeholder object In TLS 1.3,
2988
+ // |traffic_secret| is the original traffic secret. This function returns true
2989
+ // on success and false on error.
2990
+ //
2991
+ // TODO(crbug.com/371998381): Take the traffic secrets as input and let the
2992
+ // function create the SSLAEADContext.
2657
2993
  bool (*set_write_state)(SSL *ssl, ssl_encryption_level_t level,
2658
2994
  UniquePtr<SSLAEADContext> aead_ctx,
2659
- Span<const uint8_t> secret_for_quic);
2995
+ Span<const uint8_t> traffic_secret);
2660
2996
  };
2661
2997
 
2662
2998
  // The following wrappers call |open_*| but handle |read_shutdown| correctly.
@@ -2682,10 +3018,10 @@ ssl_open_record_t ssl_open_app_data(SSL *ssl, Span<uint8_t> *out,
2682
3018
  Span<uint8_t> in);
2683
3019
 
2684
3020
  struct SSL_X509_METHOD {
2685
- // check_client_CA_list returns one if |names| is a good list of X.509
2686
- // distinguished names and zero otherwise. This is used to ensure that we can
2687
- // reject unparsable values at handshake time when using crypto/x509.
2688
- bool (*check_client_CA_list)(STACK_OF(CRYPTO_BUFFER) *names);
3021
+ // check_CA_list returns one if |names| is a good list of X.509 distinguished
3022
+ // names and zero otherwise. This is used to ensure that we can reject
3023
+ // unparsable values at handshake time when using crypto/x509.
3024
+ bool (*check_CA_list)(STACK_OF(CRYPTO_BUFFER) *names);
2689
3025
 
2690
3026
  // cert_clear frees and NULLs all X509 certificate-related state.
2691
3027
  void (*cert_clear)(CERT *cert);
@@ -2846,8 +3182,14 @@ struct SSL3_STATE {
2846
3182
  // needs re-doing when in SSL_accept or SSL_connect
2847
3183
  int rwstate = SSL_ERROR_NONE;
2848
3184
 
2849
- enum ssl_encryption_level_t read_level = ssl_encryption_initial;
2850
- enum ssl_encryption_level_t write_level = ssl_encryption_initial;
3185
+ enum ssl_encryption_level_t quic_read_level = ssl_encryption_initial;
3186
+ enum ssl_encryption_level_t quic_write_level = ssl_encryption_initial;
3187
+
3188
+ // version is the protocol version, or zero if the version has not yet been
3189
+ // set. In clients offering 0-RTT, this version will initially be set to the
3190
+ // early version, then switched to the final version. To distinguish these
3191
+ // cases, use |ssl_has_final_version|.
3192
+ uint16_t version = 0;
2851
3193
 
2852
3194
  // early_data_skipped is the amount of early data that has been skipped by the
2853
3195
  // record layer.
@@ -2870,10 +3212,6 @@ struct SSL3_STATE {
2870
3212
  // messages when 0RTT is rejected.
2871
3213
  bool skip_early_data : 1;
2872
3214
 
2873
- // have_version is true if the connection's final version is known. Otherwise
2874
- // the version has not been negotiated yet.
2875
- bool have_version : 1;
2876
-
2877
3215
  // v2_hello_done is true if the peer's V2ClientHello, if any, has been handled
2878
3216
  // and future messages should use the record layer.
2879
3217
  bool v2_hello_done : 1;
@@ -2899,8 +3237,10 @@ struct SSL3_STATE {
2899
3237
  // Channel ID and the |channel_id| field is filled in.
2900
3238
  bool channel_id_valid : 1;
2901
3239
 
2902
- // key_update_pending is true if we have a KeyUpdate acknowledgment
2903
- // outstanding.
3240
+ // key_update_pending is true if we are in the process of sending a KeyUpdate
3241
+ // message. As a DoS mitigation (and a requirement in DTLS), we never send
3242
+ // more than one KeyUpdate at once. In DTLS, this tracks whether there is an
3243
+ // unACKed KeyUpdate.
2904
3244
  bool key_update_pending : 1;
2905
3245
 
2906
3246
  // early_data_accepted is true if early data was accepted by the server.
@@ -2957,18 +3297,13 @@ struct SSL3_STATE {
2957
3297
  // one.
2958
3298
  UniquePtr<SSL_HANDSHAKE> hs;
2959
3299
 
2960
- uint8_t write_traffic_secret[SSL_MAX_MD_SIZE] = {0};
2961
- uint8_t read_traffic_secret[SSL_MAX_MD_SIZE] = {0};
2962
- uint8_t exporter_secret[SSL_MAX_MD_SIZE] = {0};
2963
- uint8_t write_traffic_secret_len = 0;
2964
- uint8_t read_traffic_secret_len = 0;
2965
- uint8_t exporter_secret_len = 0;
3300
+ InplaceVector<uint8_t, SSL_MAX_MD_SIZE> write_traffic_secret;
3301
+ InplaceVector<uint8_t, SSL_MAX_MD_SIZE> read_traffic_secret;
3302
+ InplaceVector<uint8_t, SSL_MAX_MD_SIZE> exporter_secret;
2966
3303
 
2967
3304
  // Connection binding to prevent renegotiation attacks
2968
- uint8_t previous_client_finished[12] = {0};
2969
- uint8_t previous_client_finished_len = 0;
2970
- uint8_t previous_server_finished_len = 0;
2971
- uint8_t previous_server_finished[12] = {0};
3305
+ InplaceVector<uint8_t, 12> previous_client_finished;
3306
+ InplaceVector<uint8_t, 12> previous_server_finished;
2972
3307
 
2973
3308
  uint8_t send_alert[2] = {0};
2974
3309
 
@@ -3031,9 +3366,47 @@ static_assert(DTLS1_RT_MAX_HEADER_LENGTH >= DTLS1_3_RECORD_HEADER_WRITE_LENGTH,
3031
3366
 
3032
3367
  #define DTLS1_HM_HEADER_LENGTH 12
3033
3368
 
3034
- #define DTLS1_CCS_HEADER_LENGTH 1
3369
+ // A DTLSMessageBitmap maintains a list of bits which may be marked to indicate
3370
+ // a portion of a message was received or ACKed.
3371
+ class DTLSMessageBitmap {
3372
+ public:
3373
+ // A Range represents a range of bits from |start|, inclusive, to |end|,
3374
+ // exclusive.
3375
+ struct Range {
3376
+ size_t start = 0;
3377
+ size_t end = 0;
3378
+
3379
+ bool empty() const { return start == end; }
3380
+ size_t size() const { return end - start; }
3381
+ bool operator==(const Range &r) const {
3382
+ return start == r.start && end == r.end;
3383
+ }
3384
+ bool operator!=(const Range &r) const { return !(*this == r); }
3385
+ };
3386
+
3387
+ // Init initializes the structure with |num_bits| unmarked bits, from zero
3388
+ // to |num_bits - 1|.
3389
+ bool Init(size_t num_bits);
3390
+
3391
+ // MarkRange marks the bits from |start|, inclusive, to |end|, exclusive.
3392
+ void MarkRange(size_t start, size_t end);
3393
+
3394
+ // NextUnmarkedRange returns the next range of unmarked bits, starting from
3395
+ // |start|, inclusive. If all bits after |start| are marked, it returns an
3396
+ // empty range.
3397
+ Range NextUnmarkedRange(size_t start) const;
3035
3398
 
3036
- #define DTLS1_AL_HEADER_LENGTH 2
3399
+ // IsComplete returns whether every bit in the bitmask has been marked.
3400
+ bool IsComplete() const { return bytes_.empty(); }
3401
+
3402
+ private:
3403
+ // bytes_ contains the unmarked bits. We maintain an invariant: if |bytes_| is
3404
+ // not empty, some bit is unset.
3405
+ Array<uint8_t> bytes_;
3406
+ // first_unmarked_byte_ is the index of first byte in |bytes_| that is not
3407
+ // 0xff. This is maintained to amortize checking if the message is complete.
3408
+ size_t first_unmarked_byte_ = 0;
3409
+ };
3037
3410
 
3038
3411
  struct hm_header_st {
3039
3412
  uint8_t type;
@@ -3043,28 +3416,47 @@ struct hm_header_st {
3043
3416
  uint32_t frag_len;
3044
3417
  };
3045
3418
 
3046
- // An hm_fragment is an incoming DTLS message, possibly not yet assembled.
3047
- struct hm_fragment {
3419
+ // An DTLSIncomingMessage is an incoming DTLS message, possibly not yet
3420
+ // assembled.
3421
+ struct DTLSIncomingMessage {
3048
3422
  static constexpr bool kAllowUniquePtr = true;
3049
3423
 
3050
- hm_fragment() {}
3051
- hm_fragment(const hm_fragment &) = delete;
3052
- hm_fragment &operator=(const hm_fragment &) = delete;
3053
-
3054
- ~hm_fragment();
3424
+ Span<uint8_t> msg() { return MakeSpan(data).subspan(DTLS1_HM_HEADER_LENGTH); }
3425
+ Span<const uint8_t> msg() const {
3426
+ return MakeSpan(data).subspan(DTLS1_HM_HEADER_LENGTH);
3427
+ }
3428
+ size_t msg_len() const { return msg().size(); }
3055
3429
 
3056
3430
  // type is the type of the message.
3057
3431
  uint8_t type = 0;
3058
3432
  // seq is the sequence number of this message.
3059
3433
  uint16_t seq = 0;
3060
- // msg_len is the length of the message body.
3061
- uint32_t msg_len = 0;
3062
- // data is a pointer to the message, including message header. It has length
3063
- // |DTLS1_HM_HEADER_LENGTH| + |msg_len|.
3064
- uint8_t *data = nullptr;
3065
- // reassembly is a bitmask of |msg_len| bits corresponding to which parts of
3066
- // the message have been received. It is NULL if the message is complete.
3067
- uint8_t *reassembly = nullptr;
3434
+ // data contains the message, including the message header of length
3435
+ // |DTLS1_HM_HEADER_LENGTH|.
3436
+ Array<uint8_t> data;
3437
+ // reassembly tracks which parts of the message have been received.
3438
+ DTLSMessageBitmap reassembly;
3439
+ };
3440
+
3441
+ struct DTLSOutgoingMessage {
3442
+ size_t msg_len() const {
3443
+ assert(!is_ccs);
3444
+ assert(data.size() >= DTLS1_HM_HEADER_LENGTH);
3445
+ return data.size() - DTLS1_HM_HEADER_LENGTH;
3446
+ }
3447
+
3448
+ bool IsFullyAcked() const {
3449
+ // ACKs only exist in DTLS 1.3, which does not send ChangeCipherSpec.
3450
+ return !is_ccs && acked.IsComplete();
3451
+ }
3452
+
3453
+ Array<uint8_t> data;
3454
+ uint16_t epoch = 0;
3455
+ bool is_ccs = false;
3456
+ // acked tracks which bits of the message have been ACKed by the peer. If
3457
+ // |msg_len| is zero, it tracks one bit for whether the header has been
3458
+ // received.
3459
+ DTLSMessageBitmap acked;
3068
3460
  };
3069
3461
 
3070
3462
  struct OPENSSL_timeval {
@@ -3072,12 +3464,111 @@ struct OPENSSL_timeval {
3072
3464
  uint32_t tv_usec;
3073
3465
  };
3074
3466
 
3467
+ struct DTLSTimer {
3468
+ public:
3469
+ static constexpr uint64_t kNever = UINT64_MAX;
3470
+
3471
+ // StartMicroseconds schedules the timer to expire the specified number of
3472
+ // microseconds from |now|.
3473
+ void StartMicroseconds(OPENSSL_timeval now, uint64_t microseconds);
3474
+
3475
+ // Stop disables the timer.
3476
+ void Stop();
3477
+
3478
+ // IsExpired returns true if the timer was set and is expired at time |now|.
3479
+ bool IsExpired(OPENSSL_timeval now) const;
3480
+
3481
+ // IsSet returns true if the timer is scheduled or expired, and false if it is
3482
+ // stopped.
3483
+ bool IsSet() const;
3484
+
3485
+ // MicrosecondsRemaining returns the time remaining, in microseconds, at
3486
+ // |now|, or |kNever| if the timer is unset.
3487
+ uint64_t MicrosecondsRemaining(OPENSSL_timeval now) const;
3488
+
3489
+ private:
3490
+ // expire_time_ is the time when the timer expires, or zero if the timer is
3491
+ // unset.
3492
+ //
3493
+ // TODO(crbug.com/366284846): This is an extremely inconvenient time
3494
+ // representation. Switch libssl to something like a 64-bit count of
3495
+ // microseconds. While it's decidedly past 1970 now, zero is a less obviously
3496
+ // sound distinguished value for the monotonic clock, so maybe we should use a
3497
+ // different distinguished time, like |INT64_MAX| in the microseconds
3498
+ // representation.
3499
+ OPENSSL_timeval expire_time_ = {0, 0};
3500
+ };
3501
+
3502
+ // DTLS_MAX_EXTRA_WRITE_EPOCHS is the maximum number of additional write epochs
3503
+ // that DTLS may need to retain.
3504
+ //
3505
+ // The maximum is, as a DTLS 1.3 server, immediately after sending Finished. At
3506
+ // this point, the current epoch is the application write keys (epoch 3), but we
3507
+ // may have ServerHello (epoch 0) and EncryptedExtensions (epoch 1) to
3508
+ // retransmit. KeyUpdate does not increase this count. If the server were to
3509
+ // initiate KeyUpdate from this state, it would not apply the new epoch until
3510
+ // the client's ACKs have caught up. At that point, epochs 0 and 1 can be
3511
+ // discarded.
3512
+ #define DTLS_MAX_EXTRA_WRITE_EPOCHS 2
3513
+
3514
+ // DTLS_MAX_ACK_BUFFER is the maximum number of records worth of data we'll keep
3515
+ // track of with DTLS 1.3 ACKs. When we exceed this value, information about
3516
+ // stale records will be dropped. This will not break the connection but may
3517
+ // cause ACKs to perform worse and retransmit unnecessary information.
3518
+ #define DTLS_MAX_ACK_BUFFER 32
3519
+
3520
+ // A DTLSSentRecord records information about a record we sent. Each record
3521
+ // covers all bytes from |first_msg_start| (inclusive) of |first_msg| to
3522
+ // |last_msg_end| (exclusive) of |last_msg|. Messages are referenced by index
3523
+ // into |outgoing_messages|. |last_msg_end| may be |outgoing_messages.size()| if
3524
+ // |last_msg_end| is zero.
3525
+ //
3526
+ // When the message is empty, |first_msg_start| and |last_msg_end| are
3527
+ // maintained as if there is a single bit in the message representing the
3528
+ // header. See |acked| in DTLSOutgoingMessage.
3529
+ struct DTLSSentRecord {
3530
+ DTLSRecordNumber number;
3531
+ PackedSize<SSL_MAX_HANDSHAKE_FLIGHT> first_msg = 0;
3532
+ PackedSize<SSL_MAX_HANDSHAKE_FLIGHT> last_msg = 0;
3533
+ uint32_t first_msg_start = 0;
3534
+ uint32_t last_msg_end = 0;
3535
+ };
3536
+
3537
+ enum class QueuedKeyUpdate {
3538
+ kNone,
3539
+ kUpdateNotRequested,
3540
+ kUpdateRequested,
3541
+ };
3542
+
3543
+ // DTLS_PREV_READ_EPOCH_EXPIRE_SECONDS is how long to retain the previous read
3544
+ // epoch in DTLS 1.3. This value is set based on the following:
3545
+ //
3546
+ // - Section 4.2.1 of RFC 9147 recommends retaining past read epochs for the
3547
+ // default TCP MSL. This accommodates packet reordering with KeyUpdate.
3548
+ //
3549
+ // - Section 5.8.1 of RFC 9147 requires being capable of ACKing the client's
3550
+ // final flight for at least twice the default MSL. That requires retaining
3551
+ // epoch 2 after the handshake.
3552
+ //
3553
+ // - Section 4 of RFC 9293 defines the MSL to be two minutes.
3554
+ #define DTLS_PREV_READ_EPOCH_EXPIRE_SECONDS (4 * 60)
3555
+
3556
+ struct DTLSPrevReadEpoch {
3557
+ static constexpr bool kAllowUniquePtr = true;
3558
+ DTLSReadEpoch epoch;
3559
+ // expire is the expiration time of the read epoch, expressed as a POSIX
3560
+ // timestamp in seconds.
3561
+ uint64_t expire;
3562
+ };
3563
+
3075
3564
  struct DTLS1_STATE {
3076
3565
  static constexpr bool kAllowUniquePtr = true;
3077
3566
 
3078
3567
  DTLS1_STATE();
3079
3568
  ~DTLS1_STATE();
3080
3569
 
3570
+ bool Init();
3571
+
3081
3572
  // has_change_cipher_spec is true if we have received a ChangeCipherSpec from
3082
3573
  // the peer in this epoch.
3083
3574
  bool has_change_cipher_spec : 1;
@@ -3092,36 +3583,63 @@ struct DTLS1_STATE {
3092
3583
  // peer sent the final flight.
3093
3584
  bool flight_has_reply : 1;
3094
3585
 
3095
- // The current data and handshake epoch. This is initially undefined, and
3096
- // starts at zero once the initial handshake is completed.
3097
- uint16_t r_epoch = 0;
3098
- uint16_t w_epoch = 0;
3586
+ // handshake_write_overflow and handshake_read_overflow are true if
3587
+ // handshake_write_seq and handshake_read_seq, respectively have overflowed.
3588
+ bool handshake_write_overflow : 1;
3589
+ bool handshake_read_overflow : 1;
3099
3590
 
3100
- // records being received in the current epoch
3101
- DTLS1_BITMAP bitmap;
3591
+ // sending_flight and sending_ack are true if we are in the process of sending
3592
+ // a handshake flight and ACK, respectively.
3593
+ bool sending_flight : 1;
3594
+ bool sending_ack : 1;
3595
+
3596
+ // queued_key_update, if not kNone, indicates we've queued a KeyUpdate message
3597
+ // to send after the current flight is ACKed.
3598
+ QueuedKeyUpdate queued_key_update : 2;
3102
3599
 
3103
3600
  uint16_t handshake_write_seq = 0;
3104
3601
  uint16_t handshake_read_seq = 0;
3105
3602
 
3106
- // save last sequence number for retransmissions
3107
- uint64_t last_write_sequence = 0;
3108
- UniquePtr<SSLAEADContext> last_aead_write_ctx;
3603
+ // read_epoch is the current read epoch.
3604
+ DTLSReadEpoch read_epoch;
3605
+
3606
+ // next_read_epoch is the next read epoch in DTLS 1.3. It will become
3607
+ // current once a record is received from it.
3608
+ UniquePtr<DTLSReadEpoch> next_read_epoch;
3609
+
3610
+ // prev_read_epoch is the previous read epoch in DTLS 1.3.
3611
+ UniquePtr<DTLSPrevReadEpoch> prev_read_epoch;
3109
3612
 
3613
+ // write_epoch is the current DTLS write epoch. Non-retransmit records will
3614
+ // generally use this epoch.
3615
+ // TODO(crbug.com/381113363): 0-RTT will be the exception, when implemented.
3616
+ DTLSWriteEpoch write_epoch;
3110
3617
 
3111
- // In DTLS 1.3, this contains the write AEAD for the initial encryption level.
3112
- // TODO(crbug.com/boringssl/715): Drop this when it is no longer needed.
3113
- UniquePtr<SSLAEADContext> initial_aead_write_ctx;
3618
+ // extra_write_epochs is the collection available write epochs.
3619
+ InplaceVector<UniquePtr<DTLSWriteEpoch>, DTLS_MAX_EXTRA_WRITE_EPOCHS>
3620
+ extra_write_epochs;
3114
3621
 
3115
3622
  // incoming_messages is a ring buffer of incoming handshake messages that have
3116
3623
  // yet to be processed. The front of the ring buffer is message number
3117
3624
  // |handshake_read_seq|, at position |handshake_read_seq| %
3118
3625
  // |SSL_MAX_HANDSHAKE_FLIGHT|.
3119
- UniquePtr<hm_fragment> incoming_messages[SSL_MAX_HANDSHAKE_FLIGHT];
3626
+ UniquePtr<DTLSIncomingMessage> incoming_messages[SSL_MAX_HANDSHAKE_FLIGHT];
3120
3627
 
3121
3628
  // outgoing_messages is the queue of outgoing messages from the last handshake
3122
3629
  // flight.
3123
- DTLS_OUTGOING_MESSAGE outgoing_messages[SSL_MAX_HANDSHAKE_FLIGHT];
3124
- uint8_t outgoing_messages_len = 0;
3630
+ InplaceVector<DTLSOutgoingMessage, SSL_MAX_HANDSHAKE_FLIGHT>
3631
+ outgoing_messages;
3632
+
3633
+ // sent_records is a queue of records we sent, for processing ACKs. To save
3634
+ // memory in the steady state, the structure is stored on the heap and dropped
3635
+ // when empty.
3636
+ UniquePtr<MRUQueue<DTLSSentRecord, DTLS_MAX_ACK_BUFFER>> sent_records;
3637
+
3638
+ // records_to_ack is a queue of received records that we should ACK. This is
3639
+ // not stored on the heap because, in the steady state, DTLS 1.3 does not
3640
+ // necessarily empty this list. (We probably could drop records from here once
3641
+ // they are sufficiently old.)
3642
+ MRUQueue<DTLSRecordNumber, DTLS_MAX_ACK_BUFFER> records_to_ack;
3125
3643
 
3126
3644
  // outgoing_written is the number of outgoing messages that have been
3127
3645
  // written.
@@ -3136,12 +3654,15 @@ struct DTLS1_STATE {
3136
3654
  // the last time it was reset.
3137
3655
  unsigned num_timeouts = 0;
3138
3656
 
3139
- // Indicates when the last handshake msg or heartbeat sent will
3140
- // timeout.
3141
- struct OPENSSL_timeval next_timeout = {0, 0};
3657
+ // retransmit_timer tracks when to schedule the next DTLS retransmit if we do
3658
+ // not hear from the peer.
3659
+ DTLSTimer retransmit_timer;
3660
+
3661
+ // ack_timer tracks when to send an ACK.
3662
+ DTLSTimer ack_timer;
3142
3663
 
3143
3664
  // timeout_duration_ms is the timeout duration in milliseconds.
3144
- unsigned timeout_duration_ms = 0;
3665
+ uint32_t timeout_duration_ms = 0;
3145
3666
  };
3146
3667
 
3147
3668
  // An ALPSConfig is a pair of ALPN protocol and settings value to use with ALPS.
@@ -3207,6 +3728,13 @@ struct SSL_CONFIG {
3207
3728
  // |client_CA|.
3208
3729
  STACK_OF(X509_NAME) *cached_x509_client_CA = nullptr;
3209
3730
 
3731
+ // For client side, keep the list of CA distinguished names we can use
3732
+ // for the Certificate Authorities extension.
3733
+ // TODO(bbe) having this separate from the client side (above) is mildly
3734
+ // silly, but OpenSSL has *_client_CA API's for this exposed, and for the
3735
+ // moment we are not crossing those streams.
3736
+ UniquePtr<STACK_OF(CRYPTO_BUFFER)> CA_names;
3737
+
3210
3738
  Array<uint16_t> supported_group_list; // our list
3211
3739
 
3212
3740
  // channel_id_private is the client's Channel ID private key, or null if
@@ -3219,7 +3747,7 @@ struct SSL_CONFIG {
3219
3747
 
3220
3748
  // alps_configs contains the list of supported protocols to use with ALPS,
3221
3749
  // along with their corresponding ALPS values.
3222
- GrowableArray<ALPSConfig> alps_configs;
3750
+ Vector<ALPSConfig> alps_configs;
3223
3751
 
3224
3752
  // Contains the QUIC transport params that this endpoint will send.
3225
3753
  Array<uint8_t> quic_transport_params;
@@ -3330,10 +3858,15 @@ bool ssl_is_key_type_supported(int key_type);
3330
3858
  // counterpart to |privkey|. Otherwise it returns false and pushes a helpful
3331
3859
  // message on the error queue.
3332
3860
  bool ssl_compare_public_and_private_key(const EVP_PKEY *pubkey,
3333
- const EVP_PKEY *privkey);
3861
+ const EVP_PKEY *privkey);
3334
3862
  bool ssl_get_new_session(SSL_HANDSHAKE *hs);
3863
+
3864
+ // ssl_encrypt_ticket encrypt a ticket for |session| and writes the result to
3865
+ // |out|. It returns true on success and false on error. If, on success, nothing
3866
+ // was written to |out|, the caller should skip sending a ticket.
3335
3867
  bool ssl_encrypt_ticket(SSL_HANDSHAKE *hs, CBB *out,
3336
3868
  const SSL_SESSION *session);
3869
+
3337
3870
  bool ssl_ctx_rotate_ticket_encryption_key(SSL_CTX *ctx);
3338
3871
 
3339
3872
  // ssl_session_new returns a newly-allocated blank |SSL_SESSION| or nullptr on
@@ -3354,6 +3887,20 @@ OPENSSL_EXPORT UniquePtr<SSL_SESSION> SSL_SESSION_parse(
3354
3887
  // error.
3355
3888
  OPENSSL_EXPORT bool ssl_session_serialize(const SSL_SESSION *in, CBB *cbb);
3356
3889
 
3890
+ enum class SSLSessionType {
3891
+ // The session is not resumable.
3892
+ kNotResumable,
3893
+ // The session uses a TLS 1.2 session ID.
3894
+ kID,
3895
+ // The session uses a TLS 1.2 ticket.
3896
+ kTicket,
3897
+ // The session uses a TLS 1.3 pre-shared key.
3898
+ kPreSharedKey,
3899
+ };
3900
+
3901
+ // ssl_session_get_type returns the type of |session|.
3902
+ SSLSessionType ssl_session_get_type(const SSL_SESSION *session);
3903
+
3357
3904
  // ssl_session_is_context_valid returns whether |session|'s session ID context
3358
3905
  // matches the one set on |hs|.
3359
3906
  bool ssl_session_is_context_valid(const SSL_HANDSHAKE *hs,
@@ -3438,13 +3985,15 @@ bool tls_init_message(const SSL *ssl, CBB *cbb, CBB *body, uint8_t type);
3438
3985
  bool tls_finish_message(const SSL *ssl, CBB *cbb, Array<uint8_t> *out_msg);
3439
3986
  bool tls_add_message(SSL *ssl, Array<uint8_t> msg);
3440
3987
  bool tls_add_change_cipher_spec(SSL *ssl);
3441
- int tls_flush_flight(SSL *ssl);
3988
+ int tls_flush(SSL *ssl);
3442
3989
 
3443
3990
  bool dtls1_init_message(const SSL *ssl, CBB *cbb, CBB *body, uint8_t type);
3444
3991
  bool dtls1_finish_message(const SSL *ssl, CBB *cbb, Array<uint8_t> *out_msg);
3445
3992
  bool dtls1_add_message(SSL *ssl, Array<uint8_t> msg);
3446
3993
  bool dtls1_add_change_cipher_spec(SSL *ssl);
3447
- int dtls1_flush_flight(SSL *ssl);
3994
+ void dtls1_finish_flight(SSL *ssl);
3995
+ void dtls1_schedule_ack(SSL *ssl);
3996
+ int dtls1_flush(SSL *ssl);
3448
3997
 
3449
3998
  // ssl_add_message_cbb finishes the handshake message in |cbb| and adds it to
3450
3999
  // the pending flight. It returns true on success and false on error.
@@ -3454,6 +4003,9 @@ bool ssl_add_message_cbb(SSL *ssl, CBB *cbb);
3454
4003
  // on success and false on allocation failure.
3455
4004
  bool ssl_hash_message(SSL_HANDSHAKE *hs, const SSLMessage &msg);
3456
4005
 
4006
+ ssl_open_record_t dtls1_process_ack(SSL *ssl, uint8_t *out_alert,
4007
+ DTLSRecordNumber ack_record_number,
4008
+ Span<const uint8_t> data);
3457
4009
  ssl_open_record_t dtls1_open_app_data(SSL *ssl, Span<uint8_t> *out,
3458
4010
  size_t *out_consumed, uint8_t *out_alert,
3459
4011
  Span<uint8_t> in);
@@ -3469,19 +4021,27 @@ int dtls1_write_app_data(SSL *ssl, bool *out_needs_handshake,
3469
4021
  int dtls1_write_record(SSL *ssl, int type, Span<const uint8_t> in,
3470
4022
  uint16_t epoch);
3471
4023
 
3472
- int dtls1_retransmit_outgoing_messages(SSL *ssl);
3473
4024
  bool dtls1_parse_fragment(CBS *cbs, struct hm_header_st *out_hdr,
3474
4025
  CBS *out_body);
3475
- bool dtls1_check_timeout_num(SSL *ssl);
3476
4026
 
3477
- void dtls1_start_timer(SSL *ssl);
4027
+ // DTLS1_MTU_TIMEOUTS is the maximum number of retransmit timeouts to expire
4028
+ // before starting to decrease the MTU.
4029
+ #define DTLS1_MTU_TIMEOUTS 2
4030
+
4031
+ // DTLS1_MAX_TIMEOUTS is the maximum number of retransmit timeouts to expire
4032
+ // before failing the DTLS handshake.
4033
+ #define DTLS1_MAX_TIMEOUTS 12
4034
+
3478
4035
  void dtls1_stop_timer(SSL *ssl);
3479
- bool dtls1_is_timer_expired(SSL *ssl);
4036
+
3480
4037
  unsigned int dtls1_min_mtu(void);
3481
4038
 
3482
4039
  bool dtls1_new(SSL *ssl);
3483
4040
  void dtls1_free(SSL *ssl);
3484
4041
 
4042
+ bool dtls1_process_handshake_fragments(SSL *ssl, uint8_t *out_alert,
4043
+ DTLSRecordNumber record_number,
4044
+ Span<const uint8_t> record);
3485
4045
  bool dtls1_get_message(const SSL *ssl, SSLMessage *out);
3486
4046
  ssl_open_record_t dtls1_open_handshake(SSL *ssl, size_t *out_consumed,
3487
4047
  uint8_t *out_alert, Span<uint8_t> in);
@@ -3500,8 +4060,11 @@ bool tls1_configure_aead(SSL *ssl, evp_aead_direction_t direction,
3500
4060
 
3501
4061
  bool tls1_change_cipher_state(SSL_HANDSHAKE *hs,
3502
4062
  evp_aead_direction_t direction);
3503
- int tls1_generate_master_secret(SSL_HANDSHAKE *hs, uint8_t *out,
3504
- Span<const uint8_t> premaster);
4063
+
4064
+ // tls1_generate_master_secret computes the master secret from |premaster| and
4065
+ // writes it to |out|. |out| must have size |SSL3_MASTER_SECRET_SIZE|.
4066
+ bool tls1_generate_master_secret(SSL_HANDSHAKE *hs, Span<uint8_t> out,
4067
+ Span<const uint8_t> premaster);
3505
4068
 
3506
4069
  // tls1_get_grouplist returns the locally-configured group preference list.
3507
4070
  Span<const uint16_t> tls1_get_grouplist(const SSL_HANDSHAKE *ssl);
@@ -3580,9 +4143,7 @@ bool ssl_can_write(const SSL *ssl);
3580
4143
  // ssl_can_read returns wheter |ssl| is allowed to read.
3581
4144
  bool ssl_can_read(const SSL *ssl);
3582
4145
 
3583
- void ssl_get_current_time(const SSL *ssl, struct OPENSSL_timeval *out_clock);
3584
- void ssl_ctx_get_current_time(const SSL_CTX *ctx,
3585
- struct OPENSSL_timeval *out_clock);
4146
+ OPENSSL_timeval ssl_ctx_get_current_time(const SSL_CTX *ctx);
3586
4147
 
3587
4148
  // ssl_reset_error_state resets state for |SSL_get_error|.
3588
4149
  void ssl_reset_error_state(SSL *ssl);
@@ -3713,6 +4274,8 @@ struct ssl_ctx_st : public bssl::RefCounted<ssl_ctx_st> {
3713
4274
  // |client_CA|.
3714
4275
  STACK_OF(X509_NAME) *cached_x509_client_CA = nullptr;
3715
4276
 
4277
+ // What we put in client hello in the CA extension.
4278
+ bssl::UniquePtr<STACK_OF(CRYPTO_BUFFER)> CA_names;
3716
4279
 
3717
4280
  // Default values to use in SSL structures follow (these are copied by
3718
4281
  // SSL_new)
@@ -3822,7 +4385,7 @@ struct ssl_ctx_st : public bssl::RefCounted<ssl_ctx_st> {
3822
4385
  bssl::UniquePtr<STACK_OF(SRTP_PROTECTION_PROFILE)> srtp_profiles;
3823
4386
 
3824
4387
  // Defined compression algorithms for certificates.
3825
- bssl::GrowableArray<bssl::CertCompressionAlg> cert_compression_algs;
4388
+ bssl::Vector<bssl::CertCompressionAlg> cert_compression_algs;
3826
4389
 
3827
4390
  // Supported group values inherited by SSL structure
3828
4391
  bssl::Array<uint16_t> supported_group_list;
@@ -3939,9 +4502,6 @@ struct ssl_st {
3939
4502
  // that instead, and skip the null check.)
3940
4503
  bssl::UniquePtr<bssl::SSL_CONFIG> config;
3941
4504
 
3942
- // version is the protocol version.
3943
- uint16_t version = 0;
3944
-
3945
4505
  uint16_t max_send_fragment = 0;
3946
4506
 
3947
4507
  // There are 2 BIO's even though they are normally both the same. This is so
@@ -3967,11 +4527,9 @@ struct ssl_st {
3967
4527
  // session info
3968
4528
 
3969
4529
  // initial_timeout_duration_ms is the default DTLS timeout duration in
3970
- // milliseconds. It's used to initialize the timer any time it's restarted.
3971
- //
3972
- // RFC 6347 states that implementations SHOULD use an initial timer value of 1
3973
- // second.
3974
- unsigned initial_timeout_duration_ms = 1000;
4530
+ // milliseconds. It's used to initialize the timer any time it's restarted. We
4531
+ // default to RFC 9147's recommendation for real-time applications, 400ms.
4532
+ uint32_t initial_timeout_duration_ms = 400;
3975
4533
 
3976
4534
  // session is the configured session to be offered by the client. This session
3977
4535
  // is immutable.
@@ -4032,17 +4590,14 @@ struct ssl_session_st : public bssl::RefCounted<ssl_session_st> {
4032
4590
  // session. In TLS 1.3 and up, it is the resumption PSK for sessions handed to
4033
4591
  // the caller, but it stores the resumption secret when stored on |SSL|
4034
4592
  // objects.
4035
- uint8_t secret_length = 0;
4036
- uint8_t secret[SSL_MAX_MASTER_KEY_LENGTH] = {0};
4593
+ bssl::InplaceVector<uint8_t, SSL_MAX_MASTER_KEY_LENGTH> secret;
4594
+
4595
+ bssl::InplaceVector<uint8_t, SSL_MAX_SSL_SESSION_ID_LENGTH> session_id;
4037
4596
 
4038
- // session_id - valid?
4039
- uint8_t session_id_length = 0;
4040
- uint8_t session_id[SSL_MAX_SSL_SESSION_ID_LENGTH] = {0};
4041
4597
  // this is used to determine whether the session is being reused in
4042
4598
  // the appropriate context. It is up to the application to set this,
4043
4599
  // via SSL_new
4044
- uint8_t sid_ctx_length = 0;
4045
- uint8_t sid_ctx[SSL_MAX_SID_CTX_LENGTH] = {0};
4600
+ bssl::InplaceVector<uint8_t, SSL_MAX_SID_CTX_LENGTH> sid_ctx;
4046
4601
 
4047
4602
  bssl::UniquePtr<char> psk_identity;
4048
4603
 
@@ -4105,8 +4660,7 @@ struct ssl_session_st : public bssl::RefCounted<ssl_session_st> {
4105
4660
  // original_handshake_hash contains the handshake hash (either SHA-1+MD5 or
4106
4661
  // SHA-2, depending on TLS version) for the original, full handshake that
4107
4662
  // created a session. This is used by Channel IDs during resumption.
4108
- uint8_t original_handshake_hash[EVP_MAX_MD_SIZE] = {0};
4109
- uint8_t original_handshake_hash_len = 0;
4663
+ bssl::InplaceVector<uint8_t, EVP_MAX_MD_SIZE> original_handshake_hash;
4110
4664
 
4111
4665
  uint32_t ticket_lifetime_hint = 0; // Session lifetime hint in seconds
4112
4666
 
@@ -4166,7 +4720,7 @@ struct ssl_session_st : public bssl::RefCounted<ssl_session_st> {
4166
4720
  struct ssl_ech_keys_st : public bssl::RefCounted<ssl_ech_keys_st> {
4167
4721
  ssl_ech_keys_st() : RefCounted(CheckSubClass()) {}
4168
4722
 
4169
- bssl::GrowableArray<bssl::UniquePtr<bssl::ECHServerConfig>> configs;
4723
+ bssl::Vector<bssl::UniquePtr<bssl::ECHServerConfig>> configs;
4170
4724
 
4171
4725
  private:
4172
4726
  friend RefCounted;