grpc 1.84.0 → 1.85.0.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1004) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +40 -27
  3. data/include/grpc/event_engine/memory_allocator.h +1 -0
  4. data/include/grpc/grpc.h +3 -0
  5. data/include/grpc/grpc_security_constants.h +2 -0
  6. data/include/grpc/impl/channel_arg_names.h +4 -0
  7. data/src/core/call/call_filters.h +10 -10
  8. data/src/core/{lib/security/authorization → call}/evaluate_args.cc +22 -1
  9. data/src/core/{lib/security/authorization → call}/evaluate_args.h +19 -5
  10. data/src/core/call/filter_fusion.h +15 -15
  11. data/src/core/call/interception_chain.h +3 -3
  12. data/src/core/call/metadata_batch.cc +1 -0
  13. data/src/core/call/metadata_batch.h +45 -33
  14. data/src/core/call/parsed_metadata.h +3 -3
  15. data/src/core/call/request_buffer.cc +6 -6
  16. data/src/core/call/request_buffer.h +1 -1
  17. data/src/core/channelz/channel_trace.cc +5 -5
  18. data/src/core/channelz/channel_trace.h +1 -1
  19. data/src/core/channelz/channelz.cc +9 -9
  20. data/src/core/channelz/channelz.h +12 -12
  21. data/src/core/channelz/channelz_registry.cc +10 -10
  22. data/src/core/channelz/ztrace_collector.h +5 -5
  23. data/src/core/client_channel/client_channel.cc +4 -4
  24. data/src/core/client_channel/client_channel_filter.cc +14 -14
  25. data/src/core/client_channel/global_subchannel_pool.cc +4 -4
  26. data/src/core/client_channel/subchannel.cc +24 -23
  27. data/src/core/client_channel/subchannel_stream_client.cc +5 -5
  28. data/src/core/credentials/call/external/aws_external_account_credentials.cc +7 -7
  29. data/src/core/credentials/call/external/aws_request_signer.cc +16 -0
  30. data/src/core/credentials/call/external/external_account_credentials.cc +4 -4
  31. data/src/core/credentials/call/regional_access_boundary_fetcher.cc +9 -9
  32. data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.cc +4 -4
  33. data/src/core/credentials/transport/google_default/google_default_credentials.cc +3 -3
  34. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +1 -1
  35. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +9 -9
  36. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +1 -1
  37. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +6 -6
  38. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.cc +3 -3
  39. data/src/core/credentials/transport/tls/grpc_tls_crl_provider.cc +4 -4
  40. data/src/core/credentials/transport/tls/ssl_utils.cc +10 -0
  41. data/src/core/credentials/transport/tls/tls_security_connector.cc +10 -10
  42. data/src/core/credentials/transport/tls/tls_security_connector.h +6 -6
  43. data/src/core/credentials/transport/tls/tls_utils.h +9 -0
  44. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +1 -1
  45. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -1
  46. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +2 -2
  47. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +1 -1
  48. data/src/core/ext/filters/http/message_compress/compression_filter.cc +15 -0
  49. data/src/core/ext/filters/rbac/rbac_filter.h +1 -1
  50. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +5 -5
  51. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +30 -21
  52. data/src/core/ext/transport/chttp2/server/chttp2_server.h +5 -11
  53. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +14 -11
  54. data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -0
  55. data/src/core/ext/transport/chttp2/transport/flow_control.h +0 -4
  56. data/src/core/ext/transport/chttp2/transport/frame.h +9 -0
  57. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +12 -9
  58. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +4 -2
  59. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +16 -18
  60. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +2 -1
  61. data/src/core/ext/transport/chttp2/transport/http2_server_transport.cc +277 -189
  62. data/src/core/ext/transport/chttp2/transport/http2_server_transport.h +40 -17
  63. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +12 -24
  64. data/src/core/ext/transport/chttp2/transport/http2_transport.h +3 -29
  65. data/src/core/ext/transport/chttp2/transport/internal.h +2 -2
  66. data/src/core/ext/transport/chttp2/transport/parsing.cc +3 -2
  67. data/src/core/ext/transport/chttp2/transport/read_context.h +96 -3
  68. data/src/core/ext/transport/chttp2/transport/reclaimer.cc +32 -0
  69. data/src/core/ext/transport/chttp2/transport/reclaimer.h +64 -0
  70. data/src/core/ext/transport/chttp2/transport/security_frame.h +8 -8
  71. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +17 -9
  72. data/src/core/ext/transport/chttp2/transport/write_cycle.h +23 -3
  73. data/src/core/ext/transport/inproc/inproc_transport.cc +5 -5
  74. data/src/core/ext/upb-gen/grpc/channelz/v1/channelz.upb.h +137 -73
  75. data/src/core/ext/upb-gen/grpc/channelz/v1/channelz.upb_minitable.c +45 -25
  76. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/altscontext.upb.h +6 -6
  77. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/altscontext.upb_minitable.c +4 -4
  78. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/altscontext.upb_minitable.h +5 -5
  79. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/handshaker.upb.h +46 -26
  80. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/handshaker.upb_minitable.c +17 -14
  81. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/handshaker.upb_minitable.h +5 -5
  82. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/transport_security_common.upb.h +5 -5
  83. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/transport_security_common.upb_minitable.c +3 -3
  84. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/transport_security_common.upb_minitable.h +5 -5
  85. data/src/core/ext/upb-gen/grpc/health/v1/health.upb.h +329 -0
  86. data/src/core/ext/upb-gen/grpc/health/v1/health.upb_minitable.c +128 -0
  87. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/health/v1/health.upb_minitable.h +8 -5
  88. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lb/v1/load_balancer.upb.h +5 -5
  89. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lb/v1/load_balancer.upb_minitable.c +3 -3
  90. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lb/v1/load_balancer.upb_minitable.h +5 -5
  91. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls.upb.h +185 -23
  92. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls.upb_minitable.c +20 -12
  93. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls.upb_minitable.h +5 -5
  94. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls_config.upb.h +58 -42
  95. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls_config.upb_minitable.c +17 -12
  96. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls_config.upb_minitable.h +5 -5
  97. data/src/core/ext/upbdefs-gen/grpc/channelz/v1/channelz.upbdefs.c +567 -549
  98. data/src/core/ext/upbdefs-gen/grpc/lookup/v1/rls_config.upbdefs.c +182 -0
  99. data/src/core/ext/upbdefs-gen/{src/proto/grpc → grpc}/lookup/v1/rls_config.upbdefs.h +14 -14
  100. data/src/core/filter/ext_proc/ext_proc_filter.cc +1603 -46
  101. data/src/core/filter/ext_proc/ext_proc_filter.h +55 -22
  102. data/src/core/filter/ext_proc/ext_proc_messages.cc +106 -51
  103. data/src/core/filter/ext_proc/ext_proc_messages.h +36 -9
  104. data/src/core/handshaker/handshaker.cc +4 -4
  105. data/src/core/handshaker/http_connect/http_connect_client_handshaker.cc +3 -3
  106. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +10 -10
  107. data/src/core/handshaker/security/secure_endpoint.cc +13 -13
  108. data/src/core/handshaker/security/security_handshaker.cc +6 -6
  109. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +4 -4
  110. data/src/core/lib/channel/channel_args.cc +20 -0
  111. data/src/core/lib/channel/channel_args.h +17 -17
  112. data/src/core/lib/channel/promise_based_filter.cc +2 -2
  113. data/src/core/lib/channel/promise_based_filter.h +66 -27
  114. data/src/core/lib/debug/trace_flags.cc +2 -0
  115. data/src/core/lib/debug/trace_flags.h +1 -0
  116. data/src/core/lib/event_engine/ares_resolver.cc +14 -14
  117. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +7 -7
  118. data/src/core/lib/event_engine/cf_engine/cfsocket_listener.cc +4 -4
  119. data/src/core/lib/event_engine/default_event_engine.cc +5 -5
  120. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +9 -9
  121. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +16 -14
  122. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +6 -6
  123. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +3 -3
  124. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1 -1
  125. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +7 -7
  126. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +17 -17
  127. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +3 -3
  128. data/src/core/lib/event_engine/posix_engine/timer.cc +5 -5
  129. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +5 -5
  130. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +3 -3
  131. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +1 -1
  132. data/src/core/lib/event_engine/thread_pool/thread_count.cc +1 -1
  133. data/src/core/lib/event_engine/thread_pool/thread_count.h +3 -3
  134. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +50 -21
  135. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.cc +3 -3
  136. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +3 -3
  137. data/src/core/lib/event_engine/windows/windows_engine.cc +15 -15
  138. data/src/core/lib/event_engine/windows/windows_listener.cc +6 -6
  139. data/src/core/lib/event_engine/work_queue/basic_work_queue.cc +6 -6
  140. data/src/core/lib/experiments/experiments.cc +48 -0
  141. data/src/core/lib/experiments/experiments.h +24 -0
  142. data/src/core/lib/iomgr/buffer_list.cc +3 -3
  143. data/src/core/lib/iomgr/buffer_list.h +1 -1
  144. data/src/core/lib/iomgr/combiner.cc +0 -1
  145. data/src/core/lib/iomgr/ev_apple.cc +4 -4
  146. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +2 -2
  147. data/src/core/lib/iomgr/tcp_client_posix.cc +3 -3
  148. data/src/core/lib/iomgr/tcp_posix.cc +7 -7
  149. data/src/core/lib/promise/activity.cc +1 -1
  150. data/src/core/lib/promise/activity.h +1 -1
  151. data/src/core/lib/promise/arena_promise.h +7 -7
  152. data/src/core/lib/promise/detail/promise_factory.h +8 -8
  153. data/src/core/lib/promise/detail/promise_like.h +4 -4
  154. data/src/core/lib/promise/inter_activity_latch.h +6 -6
  155. data/src/core/lib/promise/inter_activity_pipe.h +1 -1
  156. data/src/core/lib/promise/observable.h +3 -3
  157. data/src/core/lib/promise/party.cc +1 -1
  158. data/src/core/lib/promise/try_seq.h +2 -2
  159. data/src/core/lib/resource_quota/arena.h +3 -3
  160. data/src/core/lib/resource_quota/memory_quota.cc +16 -16
  161. data/src/core/lib/resource_quota/memory_quota.h +1 -1
  162. data/src/core/lib/resource_quota/thread_quota.cc +3 -3
  163. data/src/core/lib/security/authorization/audit_logging.cc +5 -5
  164. data/src/core/lib/security/authorization/authorization_engine.h +1 -1
  165. data/src/core/lib/security/authorization/grpc_authorization_engine.h +1 -1
  166. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +1 -1
  167. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +1 -1
  168. data/src/core/lib/security/authorization/matchers.h +1 -1
  169. data/src/core/lib/surface/call.cc +8 -7
  170. data/src/core/lib/surface/call.h +3 -3
  171. data/src/core/lib/surface/call_utils.h +4 -0
  172. data/src/core/lib/surface/channel.cc +1 -1
  173. data/src/core/lib/surface/channel.h +1 -1
  174. data/src/core/lib/surface/channel_init.cc +1 -1
  175. data/src/core/lib/surface/init.cc +7 -7
  176. data/src/core/lib/surface/lame_client.cc +1 -1
  177. data/src/core/lib/surface/legacy_channel.cc +2 -2
  178. data/src/core/lib/surface/version.cc +1 -1
  179. data/src/core/lib/transport/transport_framing_endpoint_extension.h +3 -3
  180. data/src/core/load_balancing/autosharding/autosharding.cc +931 -0
  181. data/src/core/load_balancing/autosharding/autosharding.h +78 -0
  182. data/src/core/load_balancing/grpclb/grpclb_client_stats.cc +2 -2
  183. data/src/core/load_balancing/grpclb/load_balancer_api.cc +1 -1
  184. data/src/core/load_balancing/grpclb/load_balancer_api.h +3 -1
  185. data/src/core/load_balancing/health_check_client.cc +7 -7
  186. data/src/core/load_balancing/lb_policy.cc +1 -1
  187. data/src/core/load_balancing/oob_backend_metric.cc +5 -5
  188. data/src/core/load_balancing/outlier_detection/outlier_detection.cc +2 -2
  189. data/src/core/load_balancing/ring_hash/ring_hash.cc +109 -37
  190. data/src/core/load_balancing/rls/rls.cc +23 -17
  191. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +10 -10
  192. data/src/core/load_balancing/xds/cds.cc +6 -5
  193. data/src/core/load_balancing/xds/xds_cluster_impl.cc +2 -2
  194. data/src/core/load_balancing/xds/xds_override_host.cc +10 -10
  195. data/src/core/mitigation_engine/mitigation_engine.h +28 -4
  196. data/src/core/plugin_registry/grpc_plugin_registry.cc +2 -0
  197. data/src/core/resolver/dns/dns_resolver.cc +7 -7
  198. data/src/core/resolver/fake/fake_resolver.cc +5 -5
  199. data/src/core/resolver/google_c2p/google_c2p_resolver.cc +38 -30
  200. data/src/core/server/server.cc +30 -30
  201. data/src/core/server/server.h +4 -3
  202. data/src/core/server/server_config_selector_filter.cc +3 -3
  203. data/src/core/server/xds_server_config_fetcher_legacy.cc +15 -15
  204. data/src/core/telemetry/default_tcp_tracer.cc +1 -1
  205. data/src/core/telemetry/instrument.cc +30 -16
  206. data/src/core/telemetry/instrument.h +3 -3
  207. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +3 -3
  208. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +4 -4
  209. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +2 -2
  210. data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +1 -1
  211. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +1 -1
  212. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +5 -5
  213. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +3 -3
  214. data/src/core/tsi/ssl_transport_security.cc +46 -13
  215. data/src/core/tsi/ssl_transport_security.h +7 -0
  216. data/src/core/tsi/ssl_transport_security_utils.cc +16 -6
  217. data/src/core/util/event_log.cc +3 -3
  218. data/src/core/util/http_client/httpcli.cc +5 -5
  219. data/src/core/util/http_client/httpcli.h +1 -1
  220. data/src/core/util/json/json_object_loader.cc +7 -0
  221. data/src/core/util/json/json_object_loader.h +17 -2
  222. data/src/core/util/latent_see.cc +123 -36
  223. data/src/core/util/latent_see.h +14 -1
  224. data/src/core/util/mpscq.cc +1 -1
  225. data/src/core/util/notification.h +4 -4
  226. data/src/core/util/sync.h +20 -6
  227. data/src/core/util/table.h +20 -22
  228. data/src/core/util/work_serializer.cc +2 -2
  229. data/src/core/xds/grpc/blackboard.cc +4 -3
  230. data/src/core/xds/grpc/certificate_provider_store.cc +2 -2
  231. data/src/core/xds/grpc/streaming_call_promise_wrapper.cc +181 -0
  232. data/src/core/xds/grpc/streaming_call_promise_wrapper.h +213 -0
  233. data/src/core/xds/grpc/xds_bootstrap_grpc_builder.cc +2 -2
  234. data/src/core/xds/grpc/xds_client_grpc.cc +8 -8
  235. data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +2 -2
  236. data/src/core/xds/grpc/xds_endpoint.cc +1 -1
  237. data/src/core/xds/grpc/xds_endpoint_parser.cc +11 -0
  238. data/src/core/xds/grpc/xds_grpc_service_parser.cc +12 -10
  239. data/src/core/xds/grpc/xds_http_ext_proc_filter.cc +17 -14
  240. data/src/core/xds/grpc/xds_matcher.h +2 -2
  241. data/src/core/xds/grpc/xds_transport_grpc.cc +125 -85
  242. data/src/core/xds/grpc/xds_transport_grpc.h +19 -4
  243. data/src/core/xds/xds_client/lrs_client.cc +22 -19
  244. data/src/core/xds/xds_client/xds_client.cc +19 -16
  245. data/src/core/xds/xds_client/xds_transport.h +49 -3
  246. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  247. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
  248. data/src/ruby/lib/grpc/version.rb +1 -1
  249. data/src/ruby/pb/README.md +1 -1
  250. data/src/ruby/pb/generate_proto_ruby.sh +1 -1
  251. data/third_party/abseil-cpp/absl/algorithm/algorithm.h +34 -2
  252. data/third_party/abseil-cpp/absl/algorithm/container.h +345 -147
  253. data/third_party/abseil-cpp/absl/base/attributes.h +67 -44
  254. data/third_party/abseil-cpp/absl/base/call_once.h +1 -0
  255. data/third_party/abseil-cpp/absl/base/casts.cc +61 -0
  256. data/third_party/abseil-cpp/absl/base/casts.h +135 -2
  257. data/third_party/abseil-cpp/absl/base/config.h +63 -41
  258. data/third_party/abseil-cpp/absl/base/fast_type_id.h +30 -2
  259. data/third_party/abseil-cpp/absl/base/internal/dynamic_annotations.h +1 -1
  260. data/third_party/abseil-cpp/absl/base/internal/hardening.h +136 -0
  261. data/third_party/abseil-cpp/absl/base/internal/iterator_traits.h +6 -2
  262. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +39 -4
  263. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +6 -0
  264. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +77 -15
  265. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +3 -4
  266. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +26 -24
  267. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +74 -29
  268. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +1 -11
  269. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +52 -0
  270. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +5 -1
  271. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +5 -0
  272. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h +1 -1
  273. data/third_party/abseil-cpp/absl/base/macros.h +76 -37
  274. data/third_party/abseil-cpp/absl/base/nullability.h +5 -5
  275. data/third_party/abseil-cpp/absl/base/optimization.h +4 -5
  276. data/third_party/abseil-cpp/absl/base/options.h +46 -18
  277. data/third_party/abseil-cpp/absl/base/policy_checks.h +5 -5
  278. data/third_party/abseil-cpp/absl/base/{internal/throw_delegate.cc → throw_delegate.cc} +9 -7
  279. data/third_party/abseil-cpp/absl/base/{internal/throw_delegate.h → throw_delegate.h} +4 -14
  280. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +7 -2
  281. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -2
  282. data/third_party/abseil-cpp/absl/container/btree_map.h +60 -10
  283. data/third_party/abseil-cpp/absl/container/btree_set.h +61 -15
  284. data/third_party/abseil-cpp/absl/container/fixed_array.h +19 -21
  285. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +49 -27
  286. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +50 -26
  287. data/third_party/abseil-cpp/absl/container/inlined_vector.h +42 -36
  288. data/third_party/abseil-cpp/absl/container/internal/btree.h +32 -24
  289. data/third_party/abseil-cpp/absl/container/internal/btree_container.h +30 -22
  290. data/third_party/abseil-cpp/absl/container/internal/common.h +57 -5
  291. data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -1
  292. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +40 -36
  293. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +119 -39
  294. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +14 -2
  295. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +14 -22
  296. data/third_party/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +52 -52
  297. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +7 -7
  298. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +7 -7
  299. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +32 -40
  300. data/third_party/abseil-cpp/absl/container/internal/layout.h +13 -13
  301. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +95 -72
  302. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +633 -365
  303. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +1016 -749
  304. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +0 -1
  305. data/third_party/abseil-cpp/absl/container/node_hash_map.h +58 -35
  306. data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.cc +23 -6
  307. data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.h +7 -1
  308. data/third_party/abseil-cpp/absl/crc/internal/crc.cc +4 -6
  309. data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +41 -0
  310. data/third_party/abseil-cpp/absl/crc/internal/crc_internal.h +0 -16
  311. data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy_x86_arm_combined.cc +5 -0
  312. data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +304 -188
  313. data/third_party/abseil-cpp/absl/crc/internal/non_temporal_arm_intrinsics.h +4 -2
  314. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +2 -2
  315. data/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.h +8 -0
  316. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +4 -4
  317. data/third_party/abseil-cpp/absl/debugging/internal/examine_stack.cc +15 -1
  318. data/third_party/abseil-cpp/absl/debugging/internal/examine_stack.h +7 -1
  319. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +12 -1
  320. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +6 -5
  321. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +13 -11
  322. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +14 -7
  323. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +3 -2
  324. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +6 -1
  325. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +14 -8
  326. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +48 -38
  327. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +4 -0
  328. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +63 -118
  329. data/third_party/abseil-cpp/absl/debugging/stacktrace.h +7 -47
  330. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +20 -2
  331. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +83 -149
  332. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +4 -17
  333. data/third_party/abseil-cpp/absl/debugging/symbolize_unimplemented.inc +4 -4
  334. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +2 -4
  335. data/third_party/abseil-cpp/absl/flags/commandlineflag.h +8 -6
  336. data/third_party/abseil-cpp/absl/flags/declare.h +9 -0
  337. data/third_party/abseil-cpp/absl/flags/flag.h +2 -1
  338. data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h +1 -1
  339. data/third_party/abseil-cpp/absl/flags/internal/flag.cc +19 -18
  340. data/third_party/abseil-cpp/absl/flags/internal/flag.h +33 -34
  341. data/third_party/abseil-cpp/absl/flags/internal/program_name.cc +2 -2
  342. data/third_party/abseil-cpp/absl/flags/marshalling.cc +1 -16
  343. data/third_party/abseil-cpp/absl/flags/marshalling.h +2 -28
  344. data/third_party/abseil-cpp/absl/flags/reflection.cc +11 -7
  345. data/third_party/abseil-cpp/absl/flags/usage_config.cc +2 -2
  346. data/third_party/abseil-cpp/absl/functional/any_invocable.h +22 -19
  347. data/third_party/abseil-cpp/absl/functional/bind_front.h +7 -1
  348. data/third_party/abseil-cpp/absl/functional/function_ref.h +125 -20
  349. data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +43 -31
  350. data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +4 -4
  351. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +44 -6
  352. data/third_party/abseil-cpp/absl/hash/hash.h +1 -1
  353. data/third_party/abseil-cpp/absl/hash/internal/city.cc +39 -51
  354. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +379 -14
  355. data/third_party/abseil-cpp/absl/hash/internal/hash.h +457 -353
  356. data/third_party/abseil-cpp/absl/log/absl_vlog_is_on.h +0 -2
  357. data/third_party/abseil-cpp/absl/log/internal/check_impl.h +2 -1
  358. data/third_party/abseil-cpp/absl/log/internal/check_op.cc +4 -0
  359. data/third_party/abseil-cpp/absl/log/internal/check_op.h +128 -50
  360. data/third_party/abseil-cpp/absl/log/internal/conditions.h +38 -35
  361. data/third_party/abseil-cpp/absl/log/internal/log_impl.h +108 -110
  362. data/third_party/abseil-cpp/absl/log/internal/log_message.cc +10 -6
  363. data/third_party/abseil-cpp/absl/log/internal/log_message.h +19 -1
  364. data/third_party/abseil-cpp/absl/log/internal/log_sink_set.cc +4 -4
  365. data/third_party/abseil-cpp/absl/log/internal/nullstream.h +1 -1
  366. data/third_party/abseil-cpp/absl/log/internal/proto.cc +13 -0
  367. data/third_party/abseil-cpp/absl/log/internal/strip.h +30 -31
  368. data/third_party/abseil-cpp/absl/log/internal/structured_proto.cc +5 -5
  369. data/third_party/abseil-cpp/absl/log/internal/structured_proto.h +6 -5
  370. data/third_party/abseil-cpp/absl/log/internal/vlog_config.cc +30 -30
  371. data/third_party/abseil-cpp/absl/log/internal/vlog_config.h +0 -1
  372. data/third_party/abseil-cpp/absl/log/log.h +2 -2
  373. data/third_party/abseil-cpp/absl/log/log_entry.cc +263 -0
  374. data/third_party/abseil-cpp/absl/log/log_entry.h +2 -0
  375. data/third_party/abseil-cpp/absl/log/vlog_is_on.h +0 -2
  376. data/third_party/abseil-cpp/absl/memory/memory.h +55 -5
  377. data/third_party/abseil-cpp/absl/meta/type_traits.h +161 -56
  378. data/third_party/abseil-cpp/absl/numeric/int128.h +41 -21
  379. data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +16 -22
  380. data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +5 -7
  381. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +32 -4
  382. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +9 -9
  383. data/third_party/abseil-cpp/absl/random/beta_distribution.h +2 -2
  384. data/third_party/abseil-cpp/absl/random/bit_gen_ref.h +26 -53
  385. data/third_party/abseil-cpp/absl/random/discrete_distribution.h +1 -1
  386. data/third_party/abseil-cpp/absl/random/distributions.h +17 -17
  387. data/third_party/abseil-cpp/absl/random/exponential_distribution.h +1 -1
  388. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +8 -21
  389. data/third_party/abseil-cpp/absl/random/internal/entropy_pool.cc +2 -2
  390. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +1 -1
  391. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +1 -1
  392. data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +2 -2
  393. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +2 -2
  394. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +6 -6
  395. data/third_party/abseil-cpp/absl/random/internal/platform.h +0 -13
  396. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +6 -6
  397. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +2 -2
  398. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +6 -5
  399. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +5 -31
  400. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +2 -1
  401. data/third_party/abseil-cpp/absl/random/internal/traits.h +21 -0
  402. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +23 -23
  403. data/third_party/abseil-cpp/absl/random/mocking_access.h +74 -0
  404. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
  405. data/third_party/abseil-cpp/absl/status/internal/status_internal.cc +63 -18
  406. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +30 -4
  407. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +225 -63
  408. data/third_party/abseil-cpp/absl/status/status.cc +66 -70
  409. data/third_party/abseil-cpp/absl/status/status.h +254 -23
  410. data/third_party/abseil-cpp/absl/status/status_payload_printer.h +3 -2
  411. data/third_party/abseil-cpp/absl/status/statusor.h +117 -137
  412. data/third_party/abseil-cpp/absl/strings/ascii.h +10 -6
  413. data/third_party/abseil-cpp/absl/strings/cord.cc +41 -17
  414. data/third_party/abseil-cpp/absl/strings/cord.h +26 -17
  415. data/third_party/abseil-cpp/absl/strings/cord_buffer.h +4 -2
  416. data/third_party/abseil-cpp/absl/strings/escaping.cc +305 -125
  417. data/third_party/abseil-cpp/absl/strings/escaping.h +12 -2
  418. data/third_party/abseil-cpp/absl/strings/internal/append_and_overwrite.h +93 -0
  419. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +2 -2
  420. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc +6 -6
  421. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +27 -21
  422. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +11 -19
  423. data/third_party/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.cc +6 -0
  424. data/third_party/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.h +1 -0
  425. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +0 -141
  426. data/third_party/abseil-cpp/absl/strings/internal/escaping.h +2 -24
  427. data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +31 -36
  428. data/third_party/abseil-cpp/absl/strings/internal/stl_type_traits.h +39 -39
  429. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -22
  430. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +2 -2
  431. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +2 -4
  432. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +921 -231
  433. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +18 -16
  434. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +16 -12
  435. data/third_party/abseil-cpp/absl/strings/internal/stringify_sink.h +12 -0
  436. data/third_party/abseil-cpp/absl/strings/numbers.cc +477 -8
  437. data/third_party/abseil-cpp/absl/strings/numbers.h +29 -12
  438. data/third_party/abseil-cpp/absl/strings/resize_and_overwrite.h +198 -0
  439. data/third_party/abseil-cpp/absl/strings/str_cat.cc +96 -91
  440. data/third_party/abseil-cpp/absl/strings/str_cat.h +53 -13
  441. data/third_party/abseil-cpp/absl/strings/str_split.h +14 -9
  442. data/third_party/abseil-cpp/absl/strings/string_view.h +10 -716
  443. data/third_party/abseil-cpp/absl/strings/substitute.cc +24 -24
  444. data/third_party/abseil-cpp/absl/strings/substitute.h +2 -2
  445. data/third_party/abseil-cpp/absl/synchronization/barrier.cc +1 -1
  446. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +2 -2
  447. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +24 -3
  448. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +30 -33
  449. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -2
  450. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +5 -0
  451. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +41 -29
  452. data/third_party/abseil-cpp/absl/synchronization/mutex.h +199 -94
  453. data/third_party/abseil-cpp/absl/synchronization/notification.cc +5 -5
  454. data/third_party/abseil-cpp/absl/synchronization/notification.h +1 -1
  455. data/third_party/abseil-cpp/absl/time/clock.cc +29 -30
  456. data/third_party/abseil-cpp/absl/time/clock.h +3 -0
  457. data/third_party/abseil-cpp/absl/time/duration.cc +2 -2
  458. data/third_party/abseil-cpp/absl/time/format.cc +3 -10
  459. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +12 -0
  460. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +131 -91
  461. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +6 -103
  462. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.cc +185 -0
  463. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.h +37 -0
  464. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +10 -15
  465. data/third_party/abseil-cpp/absl/time/time.cc +4 -4
  466. data/third_party/abseil-cpp/absl/time/time.h +14 -13
  467. data/third_party/abseil-cpp/absl/types/compare.h +64 -63
  468. data/third_party/abseil-cpp/absl/types/internal/span.h +6 -6
  469. data/third_party/abseil-cpp/absl/types/optional.h +31 -4
  470. data/third_party/abseil-cpp/absl/types/optional_ref.h +295 -0
  471. data/third_party/{boringssl-with-bazel/crypto/x509/x_val.cc → abseil-cpp/absl/types/source_location.cc} +4 -14
  472. data/third_party/abseil-cpp/absl/types/source_location.h +172 -0
  473. data/third_party/abseil-cpp/absl/types/span.h +67 -38
  474. data/third_party/abseil-cpp/absl/types/variant.h +75 -18
  475. data/third_party/abseil-cpp/absl/utility/utility.h +112 -16
  476. data/third_party/boringssl-with-bazel/crypto/aes/aes.cc +3 -0
  477. data/third_party/boringssl-with-bazel/crypto/armv8_feature_parsing.h +67 -0
  478. data/third_party/boringssl-with-bazel/crypto/asn1/a_bitstr.cc +143 -105
  479. data/third_party/boringssl-with-bazel/crypto/asn1/a_bool.cc +5 -8
  480. data/third_party/boringssl-with-bazel/crypto/asn1/a_d2i_fp.cc +3 -3
  481. data/third_party/boringssl-with-bazel/crypto/asn1/a_dup.cc +6 -6
  482. data/third_party/boringssl-with-bazel/crypto/asn1/a_gentm.cc +33 -12
  483. data/third_party/boringssl-with-bazel/crypto/asn1/a_i2d_fp.cc +7 -6
  484. data/third_party/boringssl-with-bazel/crypto/asn1/a_int.cc +80 -52
  485. data/third_party/boringssl-with-bazel/crypto/asn1/a_mbstr.cc +7 -4
  486. data/third_party/boringssl-with-bazel/crypto/asn1/a_object.cc +70 -72
  487. data/third_party/boringssl-with-bazel/crypto/asn1/a_strex.cc +38 -42
  488. data/third_party/boringssl-with-bazel/crypto/asn1/a_strnid.cc +41 -39
  489. data/third_party/boringssl-with-bazel/crypto/asn1/a_time.cc +59 -35
  490. data/third_party/boringssl-with-bazel/crypto/asn1/a_type.cc +275 -15
  491. data/third_party/boringssl-with-bazel/crypto/asn1/a_utctm.cc +32 -13
  492. data/third_party/boringssl-with-bazel/crypto/asn1/asn1_lib.cc +128 -30
  493. data/third_party/boringssl-with-bazel/crypto/asn1/asn_pack.cc +10 -10
  494. data/third_party/boringssl-with-bazel/crypto/asn1/f_int.cc +1 -1
  495. data/third_party/boringssl-with-bazel/crypto/asn1/f_string.cc +1 -1
  496. data/third_party/boringssl-with-bazel/crypto/asn1/internal.h +261 -115
  497. data/third_party/boringssl-with-bazel/crypto/asn1/posix_time.cc +8 -5
  498. data/third_party/boringssl-with-bazel/crypto/asn1/tasn_dec.cc +373 -725
  499. data/third_party/boringssl-with-bazel/crypto/asn1/tasn_enc.cc +211 -526
  500. data/third_party/boringssl-with-bazel/crypto/asn1/tasn_fre.cc +22 -19
  501. data/third_party/boringssl-with-bazel/crypto/asn1/tasn_new.cc +26 -24
  502. data/third_party/boringssl-with-bazel/crypto/asn1/tasn_typ.cc +19 -5
  503. data/third_party/boringssl-with-bazel/crypto/asn1/tasn_utl.cc +47 -51
  504. data/third_party/boringssl-with-bazel/crypto/base64/base64.cc +14 -15
  505. data/third_party/boringssl-with-bazel/crypto/bcm_support.h +7 -29
  506. data/third_party/boringssl-with-bazel/crypto/bio/bio.cc +234 -176
  507. data/third_party/boringssl-with-bazel/crypto/bio/bio_mem.cc +72 -86
  508. data/third_party/boringssl-with-bazel/crypto/bio/connect.cc +153 -199
  509. data/third_party/boringssl-with-bazel/crypto/bio/errno.cc +3 -1
  510. data/third_party/boringssl-with-bazel/crypto/bio/fd.cc +56 -55
  511. data/third_party/boringssl-with-bazel/crypto/bio/file.cc +70 -78
  512. data/third_party/boringssl-with-bazel/crypto/bio/hexdump.cc +6 -4
  513. data/third_party/boringssl-with-bazel/crypto/bio/internal.h +69 -17
  514. data/third_party/boringssl-with-bazel/crypto/bio/pair.cc +117 -136
  515. data/third_party/boringssl-with-bazel/crypto/bio/printf.cc +1 -1
  516. data/third_party/boringssl-with-bazel/crypto/bio/socket.cc +116 -50
  517. data/third_party/boringssl-with-bazel/crypto/bio/socket_helper.cc +53 -5
  518. data/third_party/boringssl-with-bazel/crypto/blake2/blake2.cc +9 -5
  519. data/third_party/boringssl-with-bazel/crypto/bn/bn_asn1.cc +2 -2
  520. data/third_party/boringssl-with-bazel/crypto/bn/convert.cc +56 -70
  521. data/third_party/boringssl-with-bazel/crypto/bn/div.cc +102 -0
  522. data/third_party/boringssl-with-bazel/crypto/bn/exponentiation.cc +26 -42
  523. data/third_party/boringssl-with-bazel/crypto/bn/sqrt.cc +93 -0
  524. data/third_party/boringssl-with-bazel/crypto/buf/buf.cc +6 -5
  525. data/third_party/boringssl-with-bazel/crypto/bytestring/asn1_compat.cc +6 -5
  526. data/third_party/boringssl-with-bazel/crypto/bytestring/ber.cc +22 -20
  527. data/third_party/boringssl-with-bazel/crypto/bytestring/cbb.cc +119 -59
  528. data/third_party/boringssl-with-bazel/crypto/bytestring/cbs.cc +115 -31
  529. data/third_party/boringssl-with-bazel/crypto/bytestring/internal.h +79 -24
  530. data/third_party/boringssl-with-bazel/crypto/bytestring/unicode.cc +2 -2
  531. data/third_party/boringssl-with-bazel/crypto/chacha/chacha.cc +5 -3
  532. data/third_party/boringssl-with-bazel/crypto/chacha/internal.h +23 -22
  533. data/third_party/boringssl-with-bazel/crypto/cipher/derive_key.cc +14 -18
  534. data/third_party/boringssl-with-bazel/crypto/cipher/e_aesctrhmac.cc +73 -58
  535. data/third_party/boringssl-with-bazel/crypto/cipher/e_aeseax.cc +132 -70
  536. data/third_party/boringssl-with-bazel/crypto/cipher/e_aesgcmsiv.cc +390 -249
  537. data/third_party/boringssl-with-bazel/crypto/cipher/e_chacha20poly1305.cc +200 -137
  538. data/third_party/boringssl-with-bazel/crypto/cipher/e_des.cc +45 -29
  539. data/third_party/boringssl-with-bazel/crypto/cipher/e_null.cc +9 -5
  540. data/third_party/boringssl-with-bazel/crypto/cipher/e_rc2.cc +43 -28
  541. data/third_party/boringssl-with-bazel/crypto/cipher/e_rc4.cc +7 -5
  542. data/third_party/boringssl-with-bazel/crypto/cipher/e_tls.cc +250 -237
  543. data/third_party/boringssl-with-bazel/crypto/cipher/get_cipher.cc +12 -12
  544. data/third_party/boringssl-with-bazel/crypto/cipher/internal.h +59 -59
  545. data/third_party/boringssl-with-bazel/crypto/cipher/tls_cbc.cc +111 -111
  546. data/third_party/boringssl-with-bazel/crypto/cms/cms.cc +48 -42
  547. data/third_party/boringssl-with-bazel/crypto/conf/conf.cc +69 -63
  548. data/third_party/boringssl-with-bazel/crypto/conf/internal.h +11 -12
  549. data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_apple.cc +8 -5
  550. data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_fuchsia.cc +6 -1
  551. data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_linux.cc +7 -1
  552. data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_openbsd.cc +7 -21
  553. data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_sysreg.cc +15 -41
  554. data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_win.cc +16 -3
  555. data/third_party/boringssl-with-bazel/crypto/cpu_arm_freebsd.cc +4 -2
  556. data/third_party/boringssl-with-bazel/crypto/cpu_arm_linux.cc +54 -31
  557. data/third_party/boringssl-with-bazel/crypto/cpu_arm_linux.h +79 -101
  558. data/third_party/boringssl-with-bazel/crypto/cpu_intel.cc +51 -45
  559. data/third_party/boringssl-with-bazel/crypto/crypto.cc +26 -55
  560. data/third_party/boringssl-with-bazel/crypto/curve25519/curve25519.cc +28 -25
  561. data/third_party/boringssl-with-bazel/crypto/curve25519/curve25519_tables.h +6 -6
  562. data/third_party/boringssl-with-bazel/crypto/curve25519/internal.h +14 -15
  563. data/third_party/boringssl-with-bazel/crypto/curve25519/spake25519.cc +23 -20
  564. data/third_party/boringssl-with-bazel/crypto/des/des.cc +27 -19
  565. data/third_party/boringssl-with-bazel/crypto/des/internal.h +4 -9
  566. data/third_party/boringssl-with-bazel/crypto/dh/dh_asn1.cc +34 -49
  567. data/third_party/boringssl-with-bazel/crypto/dh/params.cc +44 -41
  568. data/third_party/boringssl-with-bazel/crypto/digest/digest_extra.cc +87 -40
  569. data/third_party/boringssl-with-bazel/crypto/dsa/dsa.cc +237 -260
  570. data/third_party/boringssl-with-bazel/crypto/dsa/dsa_asn1.cc +100 -173
  571. data/third_party/boringssl-with-bazel/crypto/dsa/internal.h +23 -21
  572. data/third_party/boringssl-with-bazel/crypto/ec/ec_asn1.cc +181 -209
  573. data/third_party/boringssl-with-bazel/crypto/ec/ec_derive.cc +26 -28
  574. data/third_party/boringssl-with-bazel/crypto/ec/hash_to_curve.cc +265 -174
  575. data/third_party/boringssl-with-bazel/crypto/ec/internal.h +54 -18
  576. data/third_party/boringssl-with-bazel/crypto/ecdh/ecdh.cc +7 -5
  577. data/third_party/boringssl-with-bazel/crypto/ecdsa/ecdsa_asn1.cc +50 -70
  578. data/third_party/boringssl-with-bazel/crypto/ecdsa/ecdsa_p1363.cc +54 -0
  579. data/third_party/boringssl-with-bazel/crypto/engine/engine.cc +7 -7
  580. data/third_party/boringssl-with-bazel/crypto/err/err.cc +116 -105
  581. data/third_party/boringssl-with-bazel/crypto/err/internal.h +8 -21
  582. data/third_party/boringssl-with-bazel/crypto/evp/evp.cc +238 -166
  583. data/third_party/boringssl-with-bazel/crypto/evp/evp_asn1.cc +202 -234
  584. data/third_party/boringssl-with-bazel/crypto/evp/evp_ctx.cc +260 -159
  585. data/third_party/boringssl-with-bazel/crypto/evp/evp_kem.cc +82 -0
  586. data/third_party/boringssl-with-bazel/crypto/evp/internal.h +292 -137
  587. data/third_party/boringssl-with-bazel/crypto/evp/p_dh.cc +198 -25
  588. data/third_party/boringssl-with-bazel/crypto/evp/p_dsa.cc +333 -0
  589. data/third_party/boringssl-with-bazel/crypto/evp/p_ec.cc +427 -42
  590. data/third_party/boringssl-with-bazel/crypto/evp/p_ed25519.cc +270 -14
  591. data/third_party/boringssl-with-bazel/crypto/evp/p_hkdf.cc +70 -102
  592. data/third_party/boringssl-with-bazel/crypto/evp/p_mldsa.cc +549 -0
  593. data/third_party/boringssl-with-bazel/crypto/evp/p_mlkem.cc +485 -0
  594. data/third_party/boringssl-with-bazel/crypto/evp/p_rsa.cc +666 -158
  595. data/third_party/boringssl-with-bazel/crypto/evp/p_x25519.cc +290 -28
  596. data/third_party/boringssl-with-bazel/crypto/evp/p_xwing.cc +273 -0
  597. data/third_party/boringssl-with-bazel/crypto/evp/pbkdf.cc +14 -7
  598. data/third_party/boringssl-with-bazel/crypto/evp/print.cc +34 -89
  599. data/third_party/boringssl-with-bazel/crypto/evp/scrypt.cc +23 -21
  600. data/third_party/boringssl-with-bazel/crypto/evp/sign.cc +23 -42
  601. data/third_party/boringssl-with-bazel/crypto/ex_data.cc +40 -41
  602. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/aes.cc.inc +34 -28
  603. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/aes_nohw.cc.inc +119 -121
  604. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/cbc.cc.inc +16 -14
  605. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/cfb.cc.inc +12 -10
  606. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/ctr.cc.inc +7 -5
  607. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/gcm.cc.inc +39 -29
  608. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/gcm_nohw.cc.inc +15 -13
  609. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/internal.h +193 -177
  610. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/key_wrap.cc.inc +5 -3
  611. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/mode_wrappers.cc.inc +7 -3
  612. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/ofb.cc.inc +7 -5
  613. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bcm.cc +24 -19
  614. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bcm_interface.h +512 -384
  615. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/add.cc.inc +7 -5
  616. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/asm/x86_64-gcc.cc.inc +63 -44
  617. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/bn.cc.inc +40 -37
  618. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/bytes.cc.inc +27 -22
  619. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/cmp.cc.inc +9 -7
  620. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/ctx.cc.inc +62 -126
  621. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/div.cc.inc +92 -167
  622. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/div_extra.cc.inc +15 -12
  623. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/exponentiation.cc.inc +96 -93
  624. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/gcd.cc.inc +73 -92
  625. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/gcd_extra.cc.inc +59 -71
  626. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/generic.cc.inc +54 -57
  627. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/internal.h +333 -255
  628. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/jacobi.cc.inc +12 -19
  629. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/montgomery.cc.inc +80 -95
  630. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/montgomery_inv.cc.inc +53 -96
  631. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/mul.cc.inc +58 -419
  632. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/prime.cc.inc +164 -213
  633. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/random.cc.inc +27 -26
  634. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/rsaz_exp.cc.inc +12 -10
  635. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/rsaz_exp.h +47 -49
  636. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/shift.cc.inc +14 -17
  637. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/sqrt.cc.inc +19 -108
  638. data/third_party/boringssl-with-bazel/crypto/fipsmodule/cipher/aead.cc.inc +427 -105
  639. data/third_party/boringssl-with-bazel/crypto/fipsmodule/cipher/cipher.cc.inc +412 -212
  640. data/third_party/boringssl-with-bazel/crypto/fipsmodule/cipher/e_aes.cc.inc +230 -225
  641. data/third_party/boringssl-with-bazel/crypto/fipsmodule/cipher/e_aesccm.cc.inc +115 -84
  642. data/third_party/boringssl-with-bazel/crypto/fipsmodule/cipher/internal.h +374 -27
  643. data/third_party/boringssl-with-bazel/crypto/fipsmodule/cmac/cmac.cc.inc +28 -23
  644. data/third_party/boringssl-with-bazel/crypto/fipsmodule/delocate.h +36 -40
  645. data/third_party/boringssl-with-bazel/crypto/fipsmodule/dh/check.cc.inc +68 -78
  646. data/third_party/boringssl-with-bazel/crypto/fipsmodule/dh/dh.cc.inc +154 -196
  647. data/third_party/boringssl-with-bazel/crypto/fipsmodule/dh/internal.h +24 -24
  648. data/third_party/boringssl-with-bazel/crypto/fipsmodule/digest/digest.cc.inc +40 -69
  649. data/third_party/boringssl-with-bazel/crypto/fipsmodule/digest/digests.cc.inc +13 -7
  650. data/third_party/boringssl-with-bazel/crypto/fipsmodule/digest/internal.h +13 -11
  651. data/third_party/boringssl-with-bazel/crypto/fipsmodule/digest/md32_common.h +86 -81
  652. data/third_party/boringssl-with-bazel/crypto/fipsmodule/digestsign/digestsign.cc.inc +38 -34
  653. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/ec.cc.inc +187 -196
  654. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/ec_key.cc.inc +196 -154
  655. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/ec_montgomery.cc.inc +65 -125
  656. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/felem.cc.inc +85 -22
  657. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/internal.h +281 -287
  658. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/oct.cc.inc +23 -22
  659. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/p256.cc.inc +514 -573
  660. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/p256_internal.h +193 -0
  661. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/scalar.cc.inc +44 -39
  662. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/simple.cc.inc +58 -90
  663. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/simple_mul.cc.inc +39 -34
  664. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/util.cc.inc +6 -3
  665. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/wnaf.cc.inc +23 -20
  666. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ecdh/ecdh.cc.inc +6 -3
  667. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ecdsa/ecdsa.cc.inc +47 -37
  668. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ecdsa/internal.h +5 -10
  669. data/third_party/boringssl-with-bazel/crypto/fipsmodule/entropy/internal.h +38 -0
  670. data/third_party/boringssl-with-bazel/crypto/fipsmodule/entropy/jitter.cc.inc +463 -0
  671. data/third_party/boringssl-with-bazel/crypto/fipsmodule/entropy/sha512.cc.inc +329 -0
  672. data/third_party/boringssl-with-bazel/crypto/fipsmodule/hkdf/hkdf.cc.inc +8 -6
  673. data/third_party/boringssl-with-bazel/crypto/fipsmodule/hmac/hmac.cc.inc +19 -16
  674. data/third_party/boringssl-with-bazel/crypto/fipsmodule/keccak/internal.h +41 -15
  675. data/third_party/boringssl-with-bazel/crypto/fipsmodule/keccak/keccak.cc.inc +172 -44
  676. data/third_party/boringssl-with-bazel/crypto/fipsmodule/mldsa/fips_known_values.inc +5 -5
  677. data/third_party/boringssl-with-bazel/crypto/fipsmodule/mldsa/mldsa.cc.inc +1632 -766
  678. data/third_party/boringssl-with-bazel/crypto/fipsmodule/mlkem/fips_known_values.inc +5 -5
  679. data/third_party/boringssl-with-bazel/crypto/fipsmodule/mlkem/mlkem.cc.inc +740 -436
  680. data/third_party/boringssl-with-bazel/crypto/fipsmodule/rand/android_entropy_client.cc.inc +82 -0
  681. data/third_party/boringssl-with-bazel/crypto/fipsmodule/rand/ctrdrbg.cc.inc +240 -53
  682. data/third_party/boringssl-with-bazel/crypto/fipsmodule/rand/internal.h +41 -26
  683. data/third_party/boringssl-with-bazel/crypto/fipsmodule/rand/rand.cc.inc +221 -218
  684. data/third_party/boringssl-with-bazel/crypto/fipsmodule/rsa/internal.h +64 -67
  685. data/third_party/boringssl-with-bazel/crypto/fipsmodule/rsa/padding.cc.inc +49 -57
  686. data/third_party/boringssl-with-bazel/crypto/fipsmodule/rsa/rsa.cc.inc +247 -234
  687. data/third_party/boringssl-with-bazel/crypto/fipsmodule/rsa/rsa_impl.cc.inc +392 -692
  688. data/third_party/boringssl-with-bazel/crypto/fipsmodule/self_check/fips.cc.inc +10 -10
  689. data/third_party/boringssl-with-bazel/crypto/fipsmodule/self_check/self_check.cc.inc +479 -449
  690. data/third_party/boringssl-with-bazel/crypto/fipsmodule/service_indicator/internal.h +34 -11
  691. data/third_party/boringssl-with-bazel/crypto/fipsmodule/service_indicator/service_indicator.cc.inc +46 -43
  692. data/third_party/boringssl-with-bazel/crypto/fipsmodule/sha/internal.h +61 -70
  693. data/third_party/boringssl-with-bazel/crypto/fipsmodule/sha/sha1.cc.inc +27 -13
  694. data/third_party/boringssl-with-bazel/crypto/fipsmodule/sha/sha256.cc.inc +46 -30
  695. data/third_party/boringssl-with-bazel/crypto/fipsmodule/sha/sha512.cc.inc +47 -47
  696. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/address.h +98 -73
  697. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/fors.cc.inc +108 -98
  698. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/fors.h +14 -24
  699. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/merkle.cc.inc +94 -91
  700. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/merkle.h +19 -31
  701. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/params.h +156 -56
  702. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/slhdsa.cc.inc +318 -132
  703. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/thash.cc.inc +234 -81
  704. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/thash.h +20 -34
  705. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/wots.cc.inc +97 -96
  706. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/wots.h +10 -20
  707. data/third_party/boringssl-with-bazel/crypto/fipsmodule/tls/internal.h +2 -16
  708. data/third_party/boringssl-with-bazel/crypto/fipsmodule/tls/kdf.cc.inc +26 -26
  709. data/third_party/boringssl-with-bazel/crypto/fuzzer_mode.cc +5 -5
  710. data/third_party/boringssl-with-bazel/crypto/hpke/hpke.cc +461 -97
  711. data/third_party/boringssl-with-bazel/crypto/hrss/hrss.cc +153 -149
  712. data/third_party/boringssl-with-bazel/crypto/hrss/internal.h +9 -13
  713. data/third_party/boringssl-with-bazel/crypto/internal.h +531 -394
  714. data/third_party/boringssl-with-bazel/crypto/kyber/internal.h +117 -12
  715. data/third_party/boringssl-with-bazel/crypto/kyber/kyber.cc +59 -58
  716. data/third_party/boringssl-with-bazel/crypto/lhash/internal.h +38 -37
  717. data/third_party/boringssl-with-bazel/crypto/lhash/lhash.cc +68 -65
  718. data/third_party/boringssl-with-bazel/crypto/md4/md4.cc +19 -6
  719. data/third_party/boringssl-with-bazel/crypto/md5/internal.h +6 -9
  720. data/third_party/boringssl-with-bazel/crypto/md5/md5.cc +18 -6
  721. data/third_party/boringssl-with-bazel/crypto/mem.cc +61 -65
  722. data/third_party/boringssl-with-bazel/crypto/mem_internal.h +671 -0
  723. data/third_party/boringssl-with-bazel/crypto/mldsa/mldsa.cc +238 -32
  724. data/third_party/boringssl-with-bazel/crypto/mlkem/mlkem.cc +21 -65
  725. data/third_party/boringssl-with-bazel/crypto/obj/obj.cc +132 -157
  726. data/third_party/boringssl-with-bazel/crypto/obj/obj_dat.h +79 -1
  727. data/third_party/boringssl-with-bazel/crypto/obj/obj_xref.cc +14 -11
  728. data/third_party/boringssl-with-bazel/crypto/params_internal.h +30 -0
  729. data/third_party/boringssl-with-bazel/crypto/pem/internal.h +20 -15
  730. data/third_party/boringssl-with-bazel/crypto/pem/pem_all.cc +20 -19
  731. data/third_party/boringssl-with-bazel/crypto/pem/pem_info.cc +72 -76
  732. data/third_party/boringssl-with-bazel/crypto/pem/pem_lib.cc +215 -217
  733. data/third_party/boringssl-with-bazel/crypto/pem/pem_oth.cc +6 -6
  734. data/third_party/boringssl-with-bazel/crypto/pem/pem_pk8.cc +13 -13
  735. data/third_party/boringssl-with-bazel/crypto/pem/pem_pkey.cc +11 -11
  736. data/third_party/boringssl-with-bazel/crypto/pkcs7/internal.h +12 -17
  737. data/third_party/boringssl-with-bazel/crypto/pkcs7/pkcs7.cc +29 -27
  738. data/third_party/boringssl-with-bazel/crypto/pkcs7/pkcs7_x509.cc +55 -49
  739. data/third_party/boringssl-with-bazel/crypto/pkcs8/internal.h +21 -26
  740. data/third_party/boringssl-with-bazel/crypto/pkcs8/p5_pbev2.cc +33 -31
  741. data/third_party/boringssl-with-bazel/crypto/pkcs8/pkcs8.cc +73 -81
  742. data/third_party/boringssl-with-bazel/crypto/pkcs8/pkcs8_x509.cc +139 -138
  743. data/third_party/boringssl-with-bazel/crypto/poly1305/internal.h +3 -7
  744. data/third_party/boringssl-with-bazel/crypto/poly1305/poly1305.cc +5 -4
  745. data/third_party/boringssl-with-bazel/crypto/poly1305/poly1305_arm.cc +43 -47
  746. data/third_party/boringssl-with-bazel/crypto/poly1305/poly1305_vec.cc +29 -26
  747. data/third_party/boringssl-with-bazel/crypto/pool/internal.h +64 -20
  748. data/third_party/boringssl-with-bazel/crypto/pool/pool.cc +177 -157
  749. data/third_party/boringssl-with-bazel/crypto/rand/deterministic.cc +9 -16
  750. data/third_party/boringssl-with-bazel/crypto/rand/fork_detect.cc +70 -42
  751. data/third_party/boringssl-with-bazel/crypto/rand/forkunsafe.cc +7 -7
  752. data/third_party/boringssl-with-bazel/crypto/rand/getentropy.cc +6 -13
  753. data/third_party/boringssl-with-bazel/crypto/rand/internal.h +16 -4
  754. data/third_party/boringssl-with-bazel/crypto/rand/ios.cc +4 -11
  755. data/third_party/boringssl-with-bazel/crypto/rand/rand.cc +11 -9
  756. data/third_party/boringssl-with-bazel/crypto/rand/trusty.cc +4 -11
  757. data/third_party/boringssl-with-bazel/crypto/rand/urandom.cc +16 -195
  758. data/third_party/boringssl-with-bazel/crypto/rand/windows.cc +12 -19
  759. data/third_party/boringssl-with-bazel/crypto/refcount.cc +7 -17
  760. data/third_party/boringssl-with-bazel/crypto/rsa/internal.h +22 -7
  761. data/third_party/boringssl-with-bazel/crypto/rsa/rsa_asn1.cc +199 -78
  762. data/third_party/boringssl-with-bazel/crypto/rsa/rsa_crypt.cc +49 -50
  763. data/third_party/boringssl-with-bazel/crypto/rsa/rsa_extra.cc +11 -0
  764. data/third_party/boringssl-with-bazel/crypto/rsa/rsa_print.cc +4 -6
  765. data/third_party/boringssl-with-bazel/crypto/sha/sha1.cc +3 -0
  766. data/third_party/boringssl-with-bazel/crypto/sha/sha256.cc +3 -1
  767. data/third_party/boringssl-with-bazel/crypto/sha/sha512.cc +6 -4
  768. data/third_party/boringssl-with-bazel/crypto/siphash/siphash.cc +2 -0
  769. data/third_party/boringssl-with-bazel/crypto/slhdsa/slhdsa.cc +43 -6
  770. data/third_party/boringssl-with-bazel/crypto/spake2plus/internal.h +31 -31
  771. data/third_party/boringssl-with-bazel/crypto/spake2plus/spake2plus.cc +1 -1
  772. data/third_party/boringssl-with-bazel/crypto/stack/stack.cc +89 -130
  773. data/third_party/boringssl-with-bazel/crypto/thread.cc +14 -14
  774. data/third_party/boringssl-with-bazel/crypto/thread_none.cc +10 -13
  775. data/third_party/boringssl-with-bazel/crypto/thread_pthread.cc +22 -35
  776. data/third_party/boringssl-with-bazel/crypto/thread_win.cc +29 -40
  777. data/third_party/boringssl-with-bazel/crypto/trust_token/internal.h +81 -88
  778. data/third_party/boringssl-with-bazel/crypto/trust_token/pmbtoken.cc +160 -144
  779. data/third_party/boringssl-with-bazel/crypto/trust_token/trust_token.cc +96 -80
  780. data/third_party/boringssl-with-bazel/crypto/trust_token/voprf.cc +90 -87
  781. data/third_party/boringssl-with-bazel/crypto/x509/a_digest.cc +5 -5
  782. data/third_party/boringssl-with-bazel/crypto/x509/a_sign.cc +51 -48
  783. data/third_party/boringssl-with-bazel/crypto/x509/a_verify.cc +30 -34
  784. data/third_party/boringssl-with-bazel/crypto/x509/algorithm.cc +47 -16
  785. data/third_party/boringssl-with-bazel/crypto/x509/asn1_gen.cc +41 -43
  786. data/third_party/boringssl-with-bazel/crypto/x509/by_dir.cc +183 -237
  787. data/third_party/boringssl-with-bazel/crypto/x509/by_file.cc +29 -30
  788. data/third_party/boringssl-with-bazel/crypto/x509/internal.h +276 -180
  789. data/third_party/boringssl-with-bazel/crypto/x509/name_print.cc +15 -13
  790. data/third_party/boringssl-with-bazel/crypto/x509/policy.cc +415 -525
  791. data/third_party/boringssl-with-bazel/crypto/x509/rsa_pss.cc +94 -271
  792. data/third_party/boringssl-with-bazel/crypto/x509/t_crl.cc +11 -8
  793. data/third_party/boringssl-with-bazel/crypto/x509/t_req.cc +26 -23
  794. data/third_party/boringssl-with-bazel/crypto/x509/t_x509.cc +26 -22
  795. data/third_party/boringssl-with-bazel/crypto/x509/t_x509a.cc +3 -1
  796. data/third_party/boringssl-with-bazel/crypto/x509/v3_akey.cc +69 -76
  797. data/third_party/boringssl-with-bazel/crypto/x509/v3_akeya.cc +2 -2
  798. data/third_party/boringssl-with-bazel/crypto/x509/v3_alt.cc +112 -69
  799. data/third_party/boringssl-with-bazel/crypto/x509/v3_bcons.cc +15 -14
  800. data/third_party/boringssl-with-bazel/crypto/x509/v3_bitst.cc +16 -18
  801. data/third_party/boringssl-with-bazel/crypto/x509/v3_conf.cc +62 -67
  802. data/third_party/boringssl-with-bazel/crypto/x509/v3_cpols.cc +143 -170
  803. data/third_party/boringssl-with-bazel/crypto/x509/v3_crld.cc +121 -165
  804. data/third_party/boringssl-with-bazel/crypto/x509/v3_enum.cc +13 -12
  805. data/third_party/boringssl-with-bazel/crypto/x509/v3_extku.cc +17 -34
  806. data/third_party/boringssl-with-bazel/crypto/x509/v3_genn.cc +20 -10
  807. data/third_party/boringssl-with-bazel/crypto/x509/v3_ia5.cc +22 -18
  808. data/third_party/boringssl-with-bazel/crypto/x509/v3_info.cc +45 -47
  809. data/third_party/boringssl-with-bazel/crypto/x509/v3_int.cc +35 -33
  810. data/third_party/boringssl-with-bazel/crypto/x509/v3_lib.cc +106 -61
  811. data/third_party/boringssl-with-bazel/crypto/x509/v3_ncons.cc +642 -358
  812. data/third_party/boringssl-with-bazel/crypto/x509/v3_ocsp.cc +25 -22
  813. data/third_party/boringssl-with-bazel/crypto/x509/v3_pcons.cc +15 -14
  814. data/third_party/boringssl-with-bazel/crypto/x509/v3_pmaps.cc +16 -15
  815. data/third_party/boringssl-with-bazel/crypto/x509/v3_prn.cc +6 -6
  816. data/third_party/boringssl-with-bazel/crypto/x509/v3_purp.cc +150 -137
  817. data/third_party/boringssl-with-bazel/crypto/x509/v3_skey.cc +23 -26
  818. data/third_party/boringssl-with-bazel/crypto/x509/v3_utl.cc +151 -178
  819. data/third_party/boringssl-with-bazel/crypto/x509/x509.cc +1 -1
  820. data/third_party/boringssl-with-bazel/crypto/x509/x509_att.cc +32 -30
  821. data/third_party/boringssl-with-bazel/crypto/x509/x509_cmp.cc +95 -88
  822. data/third_party/boringssl-with-bazel/crypto/x509/x509_d2.cc +9 -9
  823. data/third_party/boringssl-with-bazel/crypto/x509/x509_def.cc +6 -8
  824. data/third_party/boringssl-with-bazel/crypto/x509/x509_ext.cc +46 -24
  825. data/third_party/boringssl-with-bazel/crypto/x509/x509_lu.cc +211 -195
  826. data/third_party/boringssl-with-bazel/crypto/x509/x509_obj.cc +20 -16
  827. data/third_party/boringssl-with-bazel/crypto/x509/x509_req.cc +37 -46
  828. data/third_party/boringssl-with-bazel/crypto/x509/x509_set.cc +62 -90
  829. data/third_party/boringssl-with-bazel/crypto/x509/x509_trs.cc +18 -13
  830. data/third_party/boringssl-with-bazel/crypto/x509/x509_v3.cc +33 -33
  831. data/third_party/boringssl-with-bazel/crypto/x509/x509_vfy.cc +109 -110
  832. data/third_party/boringssl-with-bazel/crypto/x509/x509_vpm.cc +56 -47
  833. data/third_party/boringssl-with-bazel/crypto/x509/x509cset.cc +27 -40
  834. data/third_party/boringssl-with-bazel/crypto/x509/x509name.cc +77 -67
  835. data/third_party/boringssl-with-bazel/crypto/x509/x509rset.cc +5 -17
  836. data/third_party/boringssl-with-bazel/crypto/x509/x509spki.cc +13 -13
  837. data/third_party/boringssl-with-bazel/crypto/x509/x_algor.cc +131 -24
  838. data/third_party/boringssl-with-bazel/crypto/x509/x_all.cc +72 -39
  839. data/third_party/boringssl-with-bazel/crypto/x509/x_attrib.cc +10 -4
  840. data/third_party/boringssl-with-bazel/crypto/x509/x_crl.cc +77 -44
  841. data/third_party/boringssl-with-bazel/crypto/x509/x_exten.cc +6 -0
  842. data/third_party/boringssl-with-bazel/crypto/x509/x_name.cc +311 -383
  843. data/third_party/boringssl-with-bazel/crypto/x509/x_pubkey.cc +129 -82
  844. data/third_party/boringssl-with-bazel/crypto/x509/x_req.cc +11 -6
  845. data/third_party/boringssl-with-bazel/crypto/x509/x_sig.cc +4 -4
  846. data/third_party/boringssl-with-bazel/crypto/x509/x_spki.cc +11 -1
  847. data/third_party/boringssl-with-bazel/crypto/x509/x_x509.cc +285 -280
  848. data/third_party/boringssl-with-bazel/crypto/x509/x_x509a.cc +60 -60
  849. data/third_party/boringssl-with-bazel/crypto/xwing/xwing.cc +257 -0
  850. data/third_party/boringssl-with-bazel/gen/boringssl_prefix_symbols_internal_x86_64_win_asm.inc +301 -0
  851. data/third_party/boringssl-with-bazel/gen/boringssl_prefix_symbols_internal_x86_win_asm.inc +301 -0
  852. data/third_party/boringssl-with-bazel/gen/crypto/err_data.cc +526 -500
  853. data/third_party/boringssl-with-bazel/include/openssl/aead.h +286 -114
  854. data/third_party/boringssl-with-bazel/include/openssl/aes.h +43 -43
  855. data/third_party/boringssl-with-bazel/include/openssl/asm_base.h +29 -16
  856. data/third_party/boringssl-with-bazel/include/openssl/asn1.h +641 -631
  857. data/third_party/boringssl-with-bazel/include/openssl/asn1t.h +7 -9
  858. data/third_party/boringssl-with-bazel/include/openssl/base.h +34 -54
  859. data/third_party/boringssl-with-bazel/include/openssl/base64.h +30 -30
  860. data/third_party/boringssl-with-bazel/include/openssl/bio.h +373 -316
  861. data/third_party/boringssl-with-bazel/include/openssl/blake2.h +15 -11
  862. data/third_party/boringssl-with-bazel/include/openssl/blowfish.h +10 -3
  863. data/third_party/boringssl-with-bazel/include/openssl/bn.h +298 -306
  864. data/third_party/boringssl-with-bazel/include/openssl/buf.h +14 -14
  865. data/third_party/boringssl-with-bazel/include/openssl/bytestring.h +272 -207
  866. data/third_party/boringssl-with-bazel/include/openssl/cast.h +45 -8
  867. data/third_party/boringssl-with-bazel/include/openssl/chacha.h +3 -3
  868. data/third_party/boringssl-with-bazel/include/openssl/cipher.h +334 -152
  869. data/third_party/boringssl-with-bazel/include/openssl/cmac.h +13 -13
  870. data/third_party/boringssl-with-bazel/include/openssl/cms.h +35 -34
  871. data/third_party/boringssl-with-bazel/include/openssl/conf.h +15 -14
  872. data/third_party/boringssl-with-bazel/include/openssl/crypto.h +15 -13
  873. data/third_party/boringssl-with-bazel/include/openssl/ctrdrbg.h +49 -15
  874. data/third_party/boringssl-with-bazel/include/openssl/curve25519.h +24 -24
  875. data/third_party/boringssl-with-bazel/include/openssl/des.h +22 -16
  876. data/third_party/boringssl-with-bazel/include/openssl/dh.h +95 -95
  877. data/third_party/boringssl-with-bazel/include/openssl/digest.h +140 -71
  878. data/third_party/boringssl-with-bazel/include/openssl/dsa.h +101 -101
  879. data/third_party/boringssl-with-bazel/include/openssl/ec.h +143 -119
  880. data/third_party/boringssl-with-bazel/include/openssl/ec_key.h +97 -97
  881. data/third_party/boringssl-with-bazel/include/openssl/ecdh.h +9 -9
  882. data/third_party/boringssl-with-bazel/include/openssl/ecdsa.h +89 -46
  883. data/third_party/boringssl-with-bazel/include/openssl/engine.h +5 -5
  884. data/third_party/boringssl-with-bazel/include/openssl/err.h +73 -71
  885. data/third_party/boringssl-with-bazel/include/openssl/evp.h +824 -344
  886. data/third_party/boringssl-with-bazel/include/openssl/evp_errors.h +9 -2
  887. data/third_party/boringssl-with-bazel/include/openssl/ex_data.h +27 -32
  888. data/third_party/boringssl-with-bazel/include/openssl/hkdf.h +6 -6
  889. data/third_party/boringssl-with-bazel/include/openssl/hmac.h +31 -31
  890. data/third_party/boringssl-with-bazel/include/openssl/hpke.h +133 -117
  891. data/third_party/boringssl-with-bazel/include/openssl/hrss.h +14 -8
  892. data/third_party/boringssl-with-bazel/include/openssl/kdf.h +20 -19
  893. data/third_party/boringssl-with-bazel/include/openssl/lhash.h +4 -25
  894. data/third_party/boringssl-with-bazel/include/openssl/md4.h +14 -7
  895. data/third_party/boringssl-with-bazel/include/openssl/md5.h +7 -7
  896. data/third_party/boringssl-with-bazel/include/openssl/mem.h +38 -38
  897. data/third_party/boringssl-with-bazel/include/openssl/mldsa.h +380 -24
  898. data/third_party/boringssl-with-bazel/include/openssl/mlkem.h +43 -43
  899. data/third_party/boringssl-with-bazel/include/openssl/nid.h +1297 -2
  900. data/third_party/boringssl-with-bazel/include/openssl/obj.h +49 -49
  901. data/third_party/boringssl-with-bazel/include/openssl/opensslconf.h +30 -0
  902. data/third_party/boringssl-with-bazel/include/openssl/params.h +42 -0
  903. data/third_party/boringssl-with-bazel/include/openssl/pem.h +39 -30
  904. data/third_party/boringssl-with-bazel/include/openssl/pkcs7.h +40 -40
  905. data/third_party/boringssl-with-bazel/include/openssl/pkcs8.h +69 -63
  906. data/third_party/boringssl-with-bazel/include/openssl/poly1305.h +8 -5
  907. data/third_party/boringssl-with-bazel/include/openssl/pool.h +54 -25
  908. data/third_party/boringssl-with-bazel/include/openssl/posix_time.h +6 -6
  909. data/third_party/boringssl-with-bazel/include/openssl/prefix_symbols.h +7866 -0
  910. data/third_party/boringssl-with-bazel/include/openssl/prefix_symbols_internal_S.h +585 -0
  911. data/third_party/boringssl-with-bazel/include/openssl/prefix_symbols_internal_c.h +305 -0
  912. data/third_party/boringssl-with-bazel/include/openssl/rand.h +18 -18
  913. data/third_party/boringssl-with-bazel/include/openssl/rc4.h +4 -4
  914. data/third_party/boringssl-with-bazel/include/openssl/ripemd.h +15 -10
  915. data/third_party/boringssl-with-bazel/include/openssl/rsa.h +272 -235
  916. data/third_party/boringssl-with-bazel/include/openssl/service_indicator.h +4 -81
  917. data/third_party/boringssl-with-bazel/include/openssl/sha.h +43 -166
  918. data/third_party/boringssl-with-bazel/include/openssl/sha2.h +201 -0
  919. data/third_party/boringssl-with-bazel/include/openssl/slhdsa.h +100 -48
  920. data/third_party/boringssl-with-bazel/include/openssl/span.h +190 -75
  921. data/third_party/boringssl-with-bazel/include/openssl/ssl.h +2168 -1567
  922. data/third_party/boringssl-with-bazel/include/openssl/ssl3.h +11 -69
  923. data/third_party/boringssl-with-bazel/include/openssl/stack.h +135 -80
  924. data/third_party/boringssl-with-bazel/include/openssl/target.h +13 -1
  925. data/third_party/boringssl-with-bazel/include/openssl/thread.h +0 -10
  926. data/third_party/boringssl-with-bazel/include/openssl/tls1.h +31 -310
  927. data/third_party/boringssl-with-bazel/include/openssl/tls_prf.h +47 -0
  928. data/third_party/boringssl-with-bazel/include/openssl/trust_token.h +97 -92
  929. data/third_party/boringssl-with-bazel/include/openssl/type_check.h +1 -1
  930. data/third_party/boringssl-with-bazel/include/openssl/x509.h +1805 -1857
  931. data/third_party/boringssl-with-bazel/include/openssl/x509v3.h +1 -1
  932. data/third_party/boringssl-with-bazel/include/openssl/xwing.h +115 -0
  933. data/third_party/boringssl-with-bazel/ssl/bio_ssl.cc +24 -19
  934. data/third_party/boringssl-with-bazel/ssl/d1_both.cc +59 -57
  935. data/third_party/boringssl-with-bazel/ssl/d1_lib.cc +53 -42
  936. data/third_party/boringssl-with-bazel/ssl/d1_pkt.cc +4 -4
  937. data/third_party/boringssl-with-bazel/ssl/d1_srtp.cc +2 -2
  938. data/third_party/boringssl-with-bazel/ssl/dtls_method.cc +10 -10
  939. data/third_party/boringssl-with-bazel/ssl/dtls_record.cc +6 -6
  940. data/third_party/boringssl-with-bazel/ssl/encrypted_client_hello.cc +61 -71
  941. data/third_party/boringssl-with-bazel/ssl/extensions.cc +967 -366
  942. data/third_party/boringssl-with-bazel/ssl/handoff.cc +77 -38
  943. data/third_party/boringssl-with-bazel/ssl/handshake.cc +63 -30
  944. data/third_party/boringssl-with-bazel/ssl/handshake_client.cc +129 -85
  945. data/third_party/boringssl-with-bazel/ssl/handshake_server.cc +116 -68
  946. data/third_party/boringssl-with-bazel/ssl/internal.h +983 -1207
  947. data/third_party/boringssl-with-bazel/ssl/s3_both.cc +34 -29
  948. data/third_party/boringssl-with-bazel/ssl/s3_lib.cc +4 -3
  949. data/third_party/boringssl-with-bazel/ssl/s3_pkt.cc +12 -12
  950. data/third_party/boringssl-with-bazel/ssl/ssl_aead_ctx.cc +5 -5
  951. data/third_party/boringssl-with-bazel/ssl/ssl_asn1.cc +114 -59
  952. data/third_party/boringssl-with-bazel/ssl/ssl_buffer.cc +17 -18
  953. data/third_party/boringssl-with-bazel/ssl/ssl_cert.cc +99 -61
  954. data/third_party/boringssl-with-bazel/ssl/ssl_cipher.cc +143 -134
  955. data/third_party/boringssl-with-bazel/ssl/ssl_credential.cc +188 -90
  956. data/third_party/boringssl-with-bazel/ssl/ssl_file.cc +132 -225
  957. data/third_party/boringssl-with-bazel/ssl/ssl_key_share.cc +79 -7
  958. data/third_party/boringssl-with-bazel/ssl/ssl_lib.cc +698 -302
  959. data/third_party/boringssl-with-bazel/ssl/ssl_privkey.cc +102 -45
  960. data/third_party/boringssl-with-bazel/ssl/ssl_session.cc +117 -102
  961. data/third_party/boringssl-with-bazel/ssl/ssl_transcript.cc +3 -3
  962. data/third_party/boringssl-with-bazel/ssl/ssl_versions.cc +24 -24
  963. data/third_party/boringssl-with-bazel/ssl/ssl_x509.cc +184 -170
  964. data/third_party/boringssl-with-bazel/ssl/t1_enc.cc +12 -10
  965. data/third_party/boringssl-with-bazel/ssl/tls13_both.cc +86 -54
  966. data/third_party/boringssl-with-bazel/ssl/tls13_client.cc +176 -90
  967. data/third_party/boringssl-with-bazel/ssl/tls13_enc.cc +166 -112
  968. data/third_party/boringssl-with-bazel/ssl/tls13_server.cc +188 -97
  969. data/third_party/boringssl-with-bazel/ssl/tls_method.cc +23 -23
  970. data/third_party/boringssl-with-bazel/ssl/tls_record.cc +17 -14
  971. data/third_party/boringssl-with-bazel/third_party/fiat/bedrock_unverified_bareminimum.c.inc +47 -0
  972. data/third_party/boringssl-with-bazel/third_party/fiat/bedrock_unverified_platform.c.inc +137 -0
  973. data/third_party/boringssl-with-bazel/third_party/fiat/curve25519_64_adx.h +37 -33
  974. data/third_party/boringssl-with-bazel/third_party/fiat/p256_64.h +4 -93
  975. data/third_party/boringssl-with-bazel/third_party/fiat/p256_64_msvc.h +4 -69
  976. data/third_party/boringssl-with-bazel/third_party/fiat/p256_field_32.br.c.inc +71 -0
  977. data/third_party/boringssl-with-bazel/third_party/fiat/p256_field_64.br.c.inc +84 -0
  978. data/third_party/boringssl-with-bazel/third_party/fiat/p256_point.br.c.inc +166 -0
  979. metadata +77 -52
  980. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +0 -240
  981. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +0 -56
  982. data/src/core/ext/upb-gen/src/proto/grpc/health/v1/health.upb.h +0 -157
  983. data/src/core/ext/upb-gen/src/proto/grpc/health/v1/health.upb_minitable.c +0 -72
  984. data/src/core/ext/upbdefs-gen/src/proto/grpc/lookup/v1/rls_config.upbdefs.c +0 -181
  985. data/third_party/abseil-cpp/absl/base/internal/identity.h +0 -39
  986. data/third_party/abseil-cpp/absl/base/internal/nullability_deprecated.h +0 -106
  987. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +0 -105
  988. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.h +0 -50
  989. data/third_party/abseil-cpp/absl/strings/string_view.cc +0 -257
  990. data/third_party/boringssl-with-bazel/crypto/evp/p_dh_asn1.cc +0 -142
  991. data/third_party/boringssl-with-bazel/crypto/evp/p_dsa_asn1.cc +0 -279
  992. data/third_party/boringssl-with-bazel/crypto/evp/p_ec_asn1.cc +0 -286
  993. data/third_party/boringssl-with-bazel/crypto/evp/p_ed25519_asn1.cc +0 -225
  994. data/third_party/boringssl-with-bazel/crypto/evp/p_rsa_asn1.cc +0 -198
  995. data/third_party/boringssl-with-bazel/crypto/evp/p_x25519_asn1.cc +0 -237
  996. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/p224-64.cc.inc +0 -1163
  997. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/p256-nistz.cc.inc +0 -741
  998. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/p256-nistz.h +0 -207
  999. data/third_party/boringssl-with-bazel/crypto/fipsmodule/rsa/blinding.cc.inc +0 -147
  1000. data/third_party/boringssl-with-bazel/crypto/rand/getrandom_fillin.h +0 -64
  1001. data/third_party/boringssl-with-bazel/crypto/rand/passive.cc +0 -178
  1002. data/third_party/boringssl-with-bazel/crypto/x509/ext_dat.h +0 -92
  1003. data/third_party/boringssl-with-bazel/include/openssl/bcm_public.h +0 -82
  1004. data/third_party/boringssl-with-bazel/include/openssl/experimental/kyber.h +0 -146
@@ -12,43 +12,67 @@
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
14
 
15
+ #include <openssl/base.h>
15
16
  #include <openssl/x509.h>
16
17
 
17
18
  #include <assert.h>
18
19
 
20
+ #include <algorithm>
21
+ #include <optional>
22
+ #include <utility>
23
+
19
24
  #include <openssl/mem.h>
20
25
  #include <openssl/obj.h>
26
+ #include <openssl/span.h>
21
27
  #include <openssl/stack.h>
22
28
 
23
29
  #include "../internal.h"
30
+ #include "../mem_internal.h"
24
31
  #include "internal.h"
25
32
 
26
33
 
27
- // This file computes the X.509 policy tree, as described in RFC 5280, section
28
- // 6.1. It differs in that:
34
+ BSSL_NAMESPACE_BEGIN
35
+ namespace {
36
+
37
+ // This file computes the X.509 policy graph, as described in RFC 9618.
38
+ // Implementation notes:
29
39
  //
30
40
  // (1) It does not track "qualifier_set". This is not needed as it is not
31
41
  // output by this implementation.
32
42
  //
33
- // (2) It builds a directed acyclic graph, rather than a tree. When a given
34
- // policy matches multiple parents, RFC 5280 makes a separate node for
35
- // each parent. This representation condenses them into one node with
36
- // multiple parents. Thus we refer to this structure as a "policy graph",
37
- // rather than a "policy tree".
38
- //
39
- // (3) "expected_policy_set" is not tracked explicitly and built temporarily
43
+ // (2) "expected_policy_set" is not tracked explicitly and built temporarily
40
44
  // as part of building the graph.
41
45
  //
42
- // (4) anyPolicy nodes are not tracked explicitly.
46
+ // (3) anyPolicy nodes are not tracked explicitly.
43
47
  //
44
- // (5) Some pruning steps are deferred to when policies are evaluated, as a
48
+ // (4) Some pruning steps are deferred to when policies are evaluated, as a
45
49
  // reachability pass.
46
50
 
47
- // An X509_POLICY_NODE is a node in the policy graph. It corresponds to a node
51
+ bool is_any_policy(const ASN1_OBJECT *obj) {
52
+ return OBJ_obj2nid(obj) == NID_any_policy;
53
+ }
54
+
55
+ // An X509PolicyNode is a node in the policy graph. It corresponds to a node
48
56
  // from RFC 5280, section 6.1.2, step (a), but we store some fields differently.
49
- typedef struct x509_policy_node_st {
57
+ struct X509PolicyNode {
58
+ static std::optional<X509PolicyNode> Create(const ASN1_OBJECT *policy) {
59
+ assert(!is_any_policy(policy));
60
+ X509PolicyNode node;
61
+ node.policy.reset(OBJ_dup(policy));
62
+ if (node.policy == nullptr) {
63
+ return std::nullopt;
64
+ }
65
+ return node;
66
+ }
67
+
68
+ bool operator<(const X509PolicyNode &other) const {
69
+ return OBJ_cmp(policy.get(), other.policy.get()) < 0;
70
+ }
71
+
72
+ bool parent_is_any_policy() const { return parent_policies.empty(); }
73
+
50
74
  // policy is the "valid_policy" field from RFC 5280.
51
- ASN1_OBJECT *policy;
75
+ UniquePtr<ASN1_OBJECT> policy;
52
76
 
53
77
  // parent_policies, if non-empty, is the list of "valid_policy" values for all
54
78
  // nodes which are a parent of this node. In this case, no entry in this list
@@ -56,625 +80,502 @@ typedef struct x509_policy_node_st {
56
80
  // duplicates if the corresponding certificate had duplicate mappings.
57
81
  //
58
82
  // If empty, this node has a single parent, anyPolicy. The node is then a root
59
- // policies, and is in authorities-constrained-policy-set if it has a path to
60
- // a leaf node.
83
+ // policy, and is in authorities-constrained-policy-set if it has a path to a
84
+ // leaf node.
61
85
  //
62
86
  // Note it is not possible for a policy to have both anyPolicy and a
63
87
  // concrete policy as a parent. Section 6.1.3, step (d.1.ii) only runs if
64
88
  // there was no match in step (d.1.i). We do not need to represent a parent
65
89
  // list of, say, {anyPolicy, OID1, OID2}.
66
- STACK_OF(ASN1_OBJECT) *parent_policies;
90
+ Vector<UniquePtr<ASN1_OBJECT>> parent_policies;
67
91
 
68
- // mapped is one if this node matches a policy mapping in the certificate and
69
- // zero otherwise.
70
- int mapped;
92
+ // mapped is whether this node matches a policy mapping in the certificate.
93
+ bool mapped = false;
71
94
 
72
- // reachable is one if this node is reachable from some valid policy in the
73
- // end-entity certificate. It is computed during |has_explicit_policy|.
74
- int reachable;
75
- } X509_POLICY_NODE;
95
+ // reachable is whether this node is reachable from some valid policy in the
96
+ // end-entity certificate. It is computed during `has_explicit_policy`.
97
+ bool reachable = false;
98
+ };
76
99
 
77
- DEFINE_STACK_OF(X509_POLICY_NODE)
78
-
79
- // An X509_POLICY_LEVEL is the collection of nodes at the same depth in the
100
+ // An X509PolicyLevel is the collection of nodes at the same depth in the
80
101
  // policy graph. This structure can also be used to represent a level's
81
- // "expected_policy_set" values. See |process_policy_mappings|.
82
- typedef struct x509_policy_level_st {
83
- // nodes is the list of nodes at this depth, except for the anyPolicy node, if
84
- // any. This list is sorted by policy OID for efficient lookup.
85
- STACK_OF(X509_POLICY_NODE) *nodes;
102
+ // "expected_policy_set" values. See `process_policy_mappings`.
103
+ class X509PolicyLevel {
104
+ public:
105
+ bool has_any_policy() const { return has_any_policy_; }
106
+ bool is_empty() const { return !has_any_policy_ && nodes_.empty(); }
107
+ Span<const X509PolicyNode> nodes() const { return nodes_; }
86
108
 
87
- // has_any_policy is one if there is an anyPolicy node at this depth, and zero
88
- // otherwise.
89
- int has_any_policy;
90
- } X509_POLICY_LEVEL;
109
+ void set_has_any_policy(bool v) { has_any_policy_ = v; }
91
110
 
92
- DEFINE_STACK_OF(X509_POLICY_LEVEL)
111
+ // Although this is mutable, callers may not modify the node's policy.
112
+ Span<X509PolicyNode> nodes() { return Span(nodes_); }
93
113
 
94
- static int is_any_policy(const ASN1_OBJECT *obj) {
95
- return OBJ_obj2nid(obj) == NID_any_policy;
96
- }
97
-
98
- static void x509_policy_node_free(X509_POLICY_NODE *node) {
99
- if (node != NULL) {
100
- ASN1_OBJECT_free(node->policy);
101
- sk_ASN1_OBJECT_pop_free(node->parent_policies, ASN1_OBJECT_free);
102
- OPENSSL_free(node);
103
- }
104
- }
105
-
106
- static X509_POLICY_NODE *x509_policy_node_new(const ASN1_OBJECT *policy) {
107
- assert(!is_any_policy(policy));
108
- X509_POLICY_NODE *node = reinterpret_cast<X509_POLICY_NODE *>(
109
- OPENSSL_zalloc(sizeof(X509_POLICY_NODE)));
110
- if (node == NULL) {
111
- return NULL;
112
- }
113
- node->policy = OBJ_dup(policy);
114
- node->parent_policies = sk_ASN1_OBJECT_new_null();
115
- if (node->policy == NULL || node->parent_policies == NULL) {
116
- x509_policy_node_free(node);
117
- return NULL;
114
+ void Clear() {
115
+ has_any_policy_ = false;
116
+ nodes_.clear();
118
117
  }
119
- return node;
120
- }
121
-
122
- static int x509_policy_node_cmp(const X509_POLICY_NODE *const *a,
123
- const X509_POLICY_NODE *const *b) {
124
- return OBJ_cmp((*a)->policy, (*b)->policy);
125
- }
126
118
 
127
- static void x509_policy_level_free(X509_POLICY_LEVEL *level) {
128
- if (level != NULL) {
129
- sk_X509_POLICY_NODE_pop_free(level->nodes, x509_policy_node_free);
130
- OPENSSL_free(level);
119
+ // Find returns the node corresponding to `policy`, or nullptr if none exists.
120
+ X509PolicyNode *Find(const ASN1_OBJECT *policy) {
121
+ // The list is sorted, so we can binary search.
122
+ auto it = std::lower_bound(
123
+ nodes_.begin(), nodes_.end(), policy,
124
+ [](const X509PolicyNode &node, const ASN1_OBJECT *obj) {
125
+ return OBJ_cmp(node.policy.get(), obj) < 0;
126
+ });
127
+ if (it == nodes_.end() || OBJ_cmp(it->policy.get(), policy) != 0) {
128
+ return nullptr;
129
+ }
130
+ return &*it;
131
131
  }
132
- }
133
132
 
134
- static X509_POLICY_LEVEL *x509_policy_level_new(void) {
135
- X509_POLICY_LEVEL *level = reinterpret_cast<X509_POLICY_LEVEL *>(
136
- OPENSSL_zalloc(sizeof(X509_POLICY_LEVEL)));
137
- if (level == NULL) {
138
- return NULL;
139
- }
140
- level->nodes = sk_X509_POLICY_NODE_new(x509_policy_node_cmp);
141
- if (level->nodes == NULL) {
142
- x509_policy_level_free(level);
143
- return NULL;
133
+ // AddNodes adds the nodes in `nodes`. It returns true on success and false on
134
+ // error. No policy in `nodes` may already be present. This method leaves
135
+ // the objects in `nodes` in a moved-from state.
136
+ //
137
+ // This method re-sorts the nodes, so it runs in time proportional to the
138
+ // total size of the level. However, each level is only added to three times
139
+ // in the course of policy validation.
140
+ bool AddNodes(Span<X509PolicyNode> nodes) {
141
+ if (!nodes_.AppendMove(nodes)) {
142
+ return false;
143
+ }
144
+ std::sort(nodes_.begin(), nodes_.end());
145
+ #if !defined(NDEBUG)
146
+ // There should be no duplicate nodes.
147
+ for (size_t i = 1; i < nodes_.size(); i++) {
148
+ assert(OBJ_cmp(nodes_[i - 1].policy.get(), nodes_[i].policy.get()) != 0);
149
+ }
150
+ #endif
151
+ return true;
144
152
  }
145
- return level;
146
- }
147
-
148
- static int x509_policy_level_is_empty(const X509_POLICY_LEVEL *level) {
149
- return !level->has_any_policy && sk_X509_POLICY_NODE_num(level->nodes) == 0;
150
- }
151
153
 
152
- static void x509_policy_level_clear(X509_POLICY_LEVEL *level) {
153
- level->has_any_policy = 0;
154
- for (size_t i = 0; i < sk_X509_POLICY_NODE_num(level->nodes); i++) {
155
- x509_policy_node_free(sk_X509_POLICY_NODE_value(level->nodes, i));
154
+ // EraseNodesIf removes all nodes that satisfy the predicate `pred`.
155
+ template <typename Pred>
156
+ void EraseNodesIf(Pred pred) {
157
+ nodes_.EraseIf(pred);
156
158
  }
157
- sk_X509_POLICY_NODE_zero(level->nodes);
158
- }
159
-
160
- // x509_policy_level_find returns the node in |level| corresponding to |policy|,
161
- // or NULL if none exists.
162
- static X509_POLICY_NODE *x509_policy_level_find(X509_POLICY_LEVEL *level,
163
- const ASN1_OBJECT *policy) {
164
- assert(sk_X509_POLICY_NODE_is_sorted(level->nodes));
165
- X509_POLICY_NODE node;
166
- node.policy = (ASN1_OBJECT *)policy;
167
- size_t idx;
168
- if (!sk_X509_POLICY_NODE_find(level->nodes, &idx, &node)) {
169
- return NULL;
170
- }
171
- return sk_X509_POLICY_NODE_value(level->nodes, idx);
172
- }
173
159
 
174
- // x509_policy_level_add_nodes adds the nodes in |nodes| to |level|. It returns
175
- // one on success and zero on error. No policy in |nodes| may already be present
176
- // in |level|. This function modifies |nodes| to avoid making a copy, but the
177
- // caller is still responsible for releasing |nodes| itself.
178
- //
179
- // This function is used to add nodes to |level| in bulk, and avoid resorting
180
- // |level| after each addition.
181
- static int x509_policy_level_add_nodes(X509_POLICY_LEVEL *level,
182
- STACK_OF(X509_POLICY_NODE) *nodes) {
183
- for (size_t i = 0; i < sk_X509_POLICY_NODE_num(nodes); i++) {
184
- X509_POLICY_NODE *node = sk_X509_POLICY_NODE_value(nodes, i);
185
- if (!sk_X509_POLICY_NODE_push(level->nodes, node)) {
186
- return 0;
187
- }
188
- sk_X509_POLICY_NODE_set(nodes, i, NULL);
189
- }
190
- sk_X509_POLICY_NODE_sort(level->nodes);
160
+ private:
161
+ // nodes is the list of nodes at this depth, except for the anyPolicy node, if
162
+ // any. This list is sorted by policy OID for efficient lookup.
163
+ Vector<X509PolicyNode> nodes_;
191
164
 
192
- #if !defined(NDEBUG)
193
- // There should be no duplicate nodes.
194
- for (size_t i = 1; i < sk_X509_POLICY_NODE_num(level->nodes); i++) {
195
- assert(OBJ_cmp(sk_X509_POLICY_NODE_value(level->nodes, i - 1)->policy,
196
- sk_X509_POLICY_NODE_value(level->nodes, i)->policy) != 0);
197
- }
198
- #endif
199
- return 1;
200
- }
165
+ // has_any_policy is whether there is an anyPolicy node at this depth.
166
+ bool has_any_policy_ = false;
167
+ };
201
168
 
202
- static int policyinfo_cmp(const POLICYINFO *const *a,
203
- const POLICYINFO *const *b) {
169
+ int policyinfo_cmp(const POLICYINFO *const *a, const POLICYINFO *const *b) {
204
170
  return OBJ_cmp((*a)->policyid, (*b)->policyid);
205
171
  }
206
172
 
207
- static int delete_if_not_in_policies(X509_POLICY_NODE *node, void *data) {
208
- const CERTIFICATEPOLICIES *policies =
209
- reinterpret_cast<CERTIFICATEPOLICIES *>(data);
210
- assert(sk_POLICYINFO_is_sorted(policies));
211
- POLICYINFO info;
212
- info.policyid = node->policy;
213
- if (sk_POLICYINFO_find(policies, NULL, &info)) {
214
- return 0;
215
- }
216
- x509_policy_node_free(node);
217
- return 1;
218
- }
219
-
220
- // process_certificate_policies updates |level| to incorporate |x509|'s
173
+ // process_certificate_policies updates `level` to incorporate `x509`'s
221
174
  // certificate policies extension. This implements steps (d) and (e) of RFC
222
- // 5280, section 6.1.3. |level| must contain the previous level's
175
+ // 5280, section 6.1.3. `level` must contain the previous level's
223
176
  // "expected_policy_set" information. For all but the top-most level, this is
224
- // the output of |process_policy_mappings|. |any_policy_allowed| specifies
177
+ // the output of `process_policy_mappings`. `any_policy_allowed` specifies
225
178
  // whether anyPolicy is allowed or inhibited, taking into account the exception
226
179
  // for self-issued certificates.
227
- static int process_certificate_policies(const X509 *x509,
228
- X509_POLICY_LEVEL *level,
229
- int any_policy_allowed) {
230
- int ret = 0;
180
+ bool process_certificate_policies(const X509 *x509, X509PolicyLevel *level,
181
+ int any_policy_allowed) {
231
182
  int critical;
232
- STACK_OF(X509_POLICY_NODE) *new_nodes = NULL;
233
- CERTIFICATEPOLICIES *policies = reinterpret_cast<CERTIFICATEPOLICIES *>(
234
- X509_get_ext_d2i(x509, NID_certificate_policies, &critical, NULL));
235
-
236
- {
237
- if (policies == NULL) {
238
- if (critical != -1) {
239
- return 0; // Syntax error in the extension.
240
- }
241
-
242
- // RFC 5280, section 6.1.3, step (e).
243
- x509_policy_level_clear(level);
244
- return 1;
183
+ UniquePtr<CERTIFICATEPOLICIES> policies(
184
+ reinterpret_cast<CERTIFICATEPOLICIES *>(X509_get_ext_d2i(
185
+ x509, NID_certificate_policies, &critical, nullptr)));
186
+ if (policies == nullptr) {
187
+ if (critical != -1) {
188
+ return false; // Syntax error in the extension.
245
189
  }
246
190
 
247
- // certificatePolicies may not be empty. See RFC 5280, section 4.2.1.4.
248
- // TODO(https://crbug.com/boringssl/443): Move this check into the parser.
249
- if (sk_POLICYINFO_num(policies) == 0) {
250
- OPENSSL_PUT_ERROR(X509, X509_R_INVALID_POLICY_EXTENSION);
251
- goto err;
252
- }
191
+ // RFC 5280, section 6.1.3, step (e).
192
+ level->Clear();
193
+ return true;
194
+ }
253
195
 
254
- sk_POLICYINFO_set_cmp_func(policies, policyinfo_cmp);
255
- sk_POLICYINFO_sort(policies);
256
- int cert_has_any_policy = 0;
257
- for (size_t i = 0; i < sk_POLICYINFO_num(policies); i++) {
258
- const POLICYINFO *policy = sk_POLICYINFO_value(policies, i);
259
- if (is_any_policy(policy->policyid)) {
260
- cert_has_any_policy = 1;
261
- }
262
- if (i > 0 && OBJ_cmp(sk_POLICYINFO_value(policies, i - 1)->policyid,
263
- policy->policyid) == 0) {
264
- // Per RFC 5280, section 4.2.1.4, |policies| may not have duplicates.
265
- OPENSSL_PUT_ERROR(X509, X509_R_INVALID_POLICY_EXTENSION);
266
- goto err;
267
- }
268
- }
196
+ // certificatePolicies may not be empty. See RFC 5280, section 4.2.1.4.
197
+ // TODO(https://crbug.com/boringssl/443): Move this check into the parser.
198
+ if (sk_POLICYINFO_num(policies.get()) == 0) {
199
+ OPENSSL_PUT_ERROR(X509, X509_R_INVALID_POLICY_EXTENSION);
200
+ return false;
201
+ }
269
202
 
270
- // This does the same thing as RFC 5280, section 6.1.3, step (d), though in
271
- // a slighty different order. |level| currently contains
272
- // "expected_policy_set" values of the previous level. See
273
- // |process_policy_mappings| for details.
274
- const int previous_level_has_any_policy = level->has_any_policy;
275
-
276
- // First, we handle steps (d.1.i) and (d.2). The net effect of these two
277
- // steps is to intersect |level| with |policies|, ignoring anyPolicy if it
278
- // is inhibited.
279
- if (!cert_has_any_policy || !any_policy_allowed) {
280
- sk_X509_POLICY_NODE_delete_if(level->nodes, delete_if_not_in_policies,
281
- policies);
282
- level->has_any_policy = 0;
203
+ sk_POLICYINFO_set_cmp_func(policies.get(), policyinfo_cmp);
204
+ sk_POLICYINFO_sort(policies.get());
205
+ bool cert_has_any_policy = false;
206
+ for (size_t i = 0; i < sk_POLICYINFO_num(policies.get()); i++) {
207
+ const POLICYINFO *policy = sk_POLICYINFO_value(policies.get(), i);
208
+ if (is_any_policy(policy->policyid)) {
209
+ cert_has_any_policy = true;
210
+ }
211
+ if (i > 0 && OBJ_cmp(sk_POLICYINFO_value(policies.get(), i - 1)->policyid,
212
+ policy->policyid) == 0) {
213
+ // Per RFC 5280, section 4.2.1.4, `policies` may not have duplicates.
214
+ OPENSSL_PUT_ERROR(X509, X509_R_INVALID_POLICY_EXTENSION);
215
+ return false;
283
216
  }
217
+ }
284
218
 
285
- // Step (d.1.ii) may attach new nodes to the previous level's anyPolicy
286
- // node.
287
- if (previous_level_has_any_policy) {
288
- new_nodes = sk_X509_POLICY_NODE_new_null();
289
- if (new_nodes == NULL) {
290
- goto err;
291
- }
292
- for (size_t i = 0; i < sk_POLICYINFO_num(policies); i++) {
293
- const POLICYINFO *policy = sk_POLICYINFO_value(policies, i);
294
- // Though we've reordered the steps slightly, |policy| is in |level| if
295
- // and only if it would have been a match in step (d.1.ii).
296
- if (!is_any_policy(policy->policyid) &&
297
- x509_policy_level_find(level, policy->policyid) == NULL) {
298
- X509_POLICY_NODE *node = x509_policy_node_new(policy->policyid);
299
- if (node == NULL || //
300
- !sk_X509_POLICY_NODE_push(new_nodes, node)) {
301
- x509_policy_node_free(node);
302
- goto err;
303
- }
219
+ // This does the same thing as RFC 5280, section 6.1.3, step (d), though in
220
+ // a slightly different order. `level` currently contains
221
+ // "expected_policy_set" values of the previous level. See
222
+ // `process_policy_mappings` for details.
223
+ const bool previous_level_has_any_policy = level->has_any_policy();
224
+
225
+ // First, we handle steps (d.1.i) and (d.2). The net effect of these two
226
+ // steps is to intersect `level` with `policies`, ignoring anyPolicy if it
227
+ // is inhibited.
228
+ if (!cert_has_any_policy || !any_policy_allowed) {
229
+ level->EraseNodesIf([&](const X509PolicyNode &node) {
230
+ assert(sk_POLICYINFO_is_sorted(policies.get()));
231
+ // Erase the node if it not present in the current certificate.
232
+ POLICYINFO info;
233
+ info.policyid = node.policy.get();
234
+ return !sk_POLICYINFO_find(policies.get(), nullptr, &info);
235
+ });
236
+ level->set_has_any_policy(false);
237
+ }
238
+
239
+ // Step (d.1.ii) may attach new nodes to the previous level's anyPolicy
240
+ // node.
241
+ if (previous_level_has_any_policy) {
242
+ Vector<X509PolicyNode> new_nodes;
243
+ for (const POLICYINFO *policy : policies.get()) {
244
+ // Though we've reordered the steps slightly, `policy` is in `level` if
245
+ // and only if it would have been a match in step (d.1.ii).
246
+ if (!is_any_policy(policy->policyid) &&
247
+ level->Find(policy->policyid) == nullptr) {
248
+ auto node = X509PolicyNode::Create(policy->policyid);
249
+ if (!node.has_value() || !new_nodes.Push(*std::move(node))) {
250
+ return false;
304
251
  }
305
252
  }
306
- if (!x509_policy_level_add_nodes(level, new_nodes)) {
307
- goto err;
308
- }
309
253
  }
310
-
311
- ret = 1;
254
+ if (!level->AddNodes(Span(new_nodes))) {
255
+ return false;
256
+ }
312
257
  }
313
258
 
314
- err:
315
- sk_X509_POLICY_NODE_pop_free(new_nodes, x509_policy_node_free);
316
- CERTIFICATEPOLICIES_free(policies);
317
- return ret;
259
+ return true;
318
260
  }
319
261
 
320
- static int compare_issuer_policy(const POLICY_MAPPING *const *a,
321
- const POLICY_MAPPING *const *b) {
262
+ int compare_issuer_policy(const POLICY_MAPPING *const *a,
263
+ const POLICY_MAPPING *const *b) {
322
264
  return OBJ_cmp((*a)->issuerDomainPolicy, (*b)->issuerDomainPolicy);
323
265
  }
324
266
 
325
- static int compare_subject_policy(const POLICY_MAPPING *const *a,
326
- const POLICY_MAPPING *const *b) {
267
+ int compare_subject_policy(const POLICY_MAPPING *const *a,
268
+ const POLICY_MAPPING *const *b) {
327
269
  return OBJ_cmp((*a)->subjectDomainPolicy, (*b)->subjectDomainPolicy);
328
270
  }
329
271
 
330
- static int delete_if_mapped(X509_POLICY_NODE *node, void *data) {
331
- const POLICY_MAPPINGS *mappings = reinterpret_cast<POLICY_MAPPINGS *>(data);
332
- // |mappings| must have been sorted by |compare_issuer_policy|.
333
- assert(sk_POLICY_MAPPING_is_sorted(mappings));
334
- POLICY_MAPPING mapping;
335
- mapping.issuerDomainPolicy = node->policy;
336
- if (!sk_POLICY_MAPPING_find(mappings, /*out_index=*/NULL, &mapping)) {
337
- return 0;
338
- }
339
- x509_policy_node_free(node);
340
- return 1;
341
- }
342
-
343
- // process_policy_mappings processes the policy mappings extension of |cert|,
344
- // whose corresponding graph level is |level|. |mapping_allowed| specifies
272
+ // process_policy_mappings processes the policy mappings extension of `cert`,
273
+ // whose corresponding graph level is `level`. `mapping_allowed` specifies
345
274
  // whether policy mapping is inhibited at this point. On success, it returns an
346
- // |X509_POLICY_LEVEL| containing the "expected_policy_set" for |level|. On
347
- // error, it returns NULL. This implements steps (a) and (b) of RFC 5280,
275
+ // `X509PolicyLevel` containing the "expected_policy_set" for `level`. On error,
276
+ // it returns std::nullopt. This implements steps (a) and (b) of RFC 5280,
348
277
  // section 6.1.4.
349
278
  //
350
- // We represent the "expected_policy_set" as an |X509_POLICY_LEVEL|.
351
- // |has_any_policy| indicates whether there is an anyPolicy node with
279
+ // We represent the "expected_policy_set" as an `X509PolicyLevel`.
280
+ // `has_any_policy` indicates whether there is an anyPolicy node with
352
281
  // "expected_policy_set" of {anyPolicy}. If a node with policy oid P1 contains
353
282
  // P2 in its "expected_policy_set", the level will contain a node of policy P2
354
- // with P1 in |parent_policies|.
283
+ // with P1 in `parent_policies`.
355
284
  //
356
- // This is equivalent to the |X509_POLICY_LEVEL| that would result if the next
357
- // certificats contained anyPolicy. |process_certificate_policies| will filter
285
+ // This is equivalent to the `X509PolicyLevel` that would result if the next
286
+ // certificates contained anyPolicy. `process_certificate_policies` will filter
358
287
  // this result down to compute the actual level.
359
- static X509_POLICY_LEVEL *process_policy_mappings(const X509 *cert,
360
- X509_POLICY_LEVEL *level,
361
- int mapping_allowed) {
362
- int ok = 0;
363
- STACK_OF(X509_POLICY_NODE) *new_nodes = NULL;
364
- X509_POLICY_LEVEL *next = NULL;
288
+ std::optional<X509PolicyLevel> process_policy_mappings(const X509 *cert,
289
+ X509PolicyLevel *level,
290
+ bool mapping_allowed) {
365
291
  int critical;
366
- POLICY_MAPPINGS *mappings = reinterpret_cast<POLICY_MAPPINGS *>(
367
- X509_get_ext_d2i(cert, NID_policy_mappings, &critical, NULL));
292
+ UniquePtr<POLICY_MAPPINGS> mappings(reinterpret_cast<POLICY_MAPPINGS *>(
293
+ X509_get_ext_d2i(cert, NID_policy_mappings, &critical, nullptr)));
294
+ if (mappings == nullptr && critical != -1) {
295
+ // Syntax error in the policy mappings extension.
296
+ return std::nullopt;
297
+ }
368
298
 
369
- {
370
- if (mappings == NULL && critical != -1) {
371
- // Syntax error in the policy mappings extension.
372
- goto err;
299
+ if (mappings != nullptr) {
300
+ // PolicyMappings may not be empty. See RFC 5280, section 4.2.1.5.
301
+ // TODO(https://crbug.com/boringssl/443): Move this check into the parser.
302
+ if (sk_POLICY_MAPPING_num(mappings.get()) == 0) {
303
+ OPENSSL_PUT_ERROR(X509, X509_R_INVALID_POLICY_EXTENSION);
304
+ return std::nullopt;
373
305
  }
374
306
 
375
- if (mappings != NULL) {
376
- // PolicyMappings may not be empty. See RFC 5280, section 4.2.1.5.
377
- // TODO(https://crbug.com/boringssl/443): Move this check into the parser.
378
- if (sk_POLICY_MAPPING_num(mappings) == 0) {
379
- OPENSSL_PUT_ERROR(X509, X509_R_INVALID_POLICY_EXTENSION);
380
- goto err;
307
+ // RFC 5280, section 6.1.4, step (a).
308
+ for (const POLICY_MAPPING *mapping : mappings.get()) {
309
+ if (is_any_policy(mapping->issuerDomainPolicy) ||
310
+ is_any_policy(mapping->subjectDomainPolicy)) {
311
+ return std::nullopt;
381
312
  }
313
+ }
382
314
 
383
- // RFC 5280, section 6.1.4, step (a).
384
- for (size_t i = 0; i < sk_POLICY_MAPPING_num(mappings); i++) {
385
- POLICY_MAPPING *mapping = sk_POLICY_MAPPING_value(mappings, i);
386
- if (is_any_policy(mapping->issuerDomainPolicy) ||
387
- is_any_policy(mapping->subjectDomainPolicy)) {
388
- goto err;
315
+ // Sort to group by issuerDomainPolicy.
316
+ sk_POLICY_MAPPING_set_cmp_func(mappings.get(), compare_issuer_policy);
317
+ sk_POLICY_MAPPING_sort(mappings.get());
318
+
319
+ if (mapping_allowed) {
320
+ // Mark nodes as mapped, and add any nodes to `level` which may be
321
+ // needed as part of RFC 5280, section 6.1.4, step (b.1).
322
+ Vector<X509PolicyNode> new_nodes;
323
+ const ASN1_OBJECT *last_policy = nullptr;
324
+ for (const POLICY_MAPPING *mapping : mappings.get()) {
325
+ // There may be multiple mappings with the same `issuerDomainPolicy`.
326
+ if (last_policy != nullptr &&
327
+ OBJ_cmp(mapping->issuerDomainPolicy, last_policy) == 0) {
328
+ continue;
389
329
  }
390
- }
330
+ last_policy = mapping->issuerDomainPolicy;
391
331
 
392
- // Sort to group by issuerDomainPolicy.
393
- sk_POLICY_MAPPING_set_cmp_func(mappings, compare_issuer_policy);
394
- sk_POLICY_MAPPING_sort(mappings);
395
-
396
- if (mapping_allowed) {
397
- // Mark nodes as mapped, and add any nodes to |level| which may be
398
- // needed as part of RFC 5280, section 6.1.4, step (b.1).
399
- new_nodes = sk_X509_POLICY_NODE_new_null();
400
- if (new_nodes == NULL) {
401
- goto err;
402
- }
403
- const ASN1_OBJECT *last_policy = NULL;
404
- for (size_t i = 0; i < sk_POLICY_MAPPING_num(mappings); i++) {
405
- const POLICY_MAPPING *mapping = sk_POLICY_MAPPING_value(mappings, i);
406
- // There may be multiple mappings with the same |issuerDomainPolicy|.
407
- if (last_policy != NULL &&
408
- OBJ_cmp(mapping->issuerDomainPolicy, last_policy) == 0) {
332
+ X509PolicyNode *node = level->Find(mapping->issuerDomainPolicy);
333
+ if (node != nullptr) {
334
+ node->mapped = true;
335
+ } else {
336
+ if (!level->has_any_policy()) {
409
337
  continue;
410
338
  }
411
- last_policy = mapping->issuerDomainPolicy;
412
-
413
- X509_POLICY_NODE *node =
414
- x509_policy_level_find(level, mapping->issuerDomainPolicy);
415
- if (node == NULL) {
416
- if (!level->has_any_policy) {
417
- continue;
418
- }
419
- node = x509_policy_node_new(mapping->issuerDomainPolicy);
420
- if (node == NULL || //
421
- !sk_X509_POLICY_NODE_push(new_nodes, node)) {
422
- x509_policy_node_free(node);
423
- goto err;
424
- }
339
+ auto new_node = X509PolicyNode::Create(mapping->issuerDomainPolicy);
340
+ if (!new_node.has_value()) {
341
+ return std::nullopt;
342
+ }
343
+ new_node->mapped = true;
344
+ if (!new_nodes.Push(*std::move(new_node))) {
345
+ return std::nullopt;
425
346
  }
426
- node->mapped = 1;
427
- }
428
- if (!x509_policy_level_add_nodes(level, new_nodes)) {
429
- goto err;
430
347
  }
431
- } else {
432
- // RFC 5280, section 6.1.4, step (b.2). If mapping is inhibited, delete
433
- // all mapped nodes.
434
- sk_X509_POLICY_NODE_delete_if(level->nodes, delete_if_mapped, mappings);
435
- sk_POLICY_MAPPING_pop_free(mappings, POLICY_MAPPING_free);
436
- mappings = NULL;
437
348
  }
349
+ if (!level->AddNodes(Span(new_nodes))) {
350
+ return std::nullopt;
351
+ }
352
+ } else {
353
+ // RFC 5280, section 6.1.4, step (b.2). If mapping is inhibited, delete
354
+ // all mapped nodes.
355
+ level->EraseNodesIf([&](const X509PolicyNode &node) {
356
+ // `mappings` must have been sorted by `compare_issuer_policy`.
357
+ assert(sk_POLICY_MAPPING_is_sorted(mappings.get()));
358
+ // Check if the node was mapped.
359
+ POLICY_MAPPING mapping;
360
+ mapping.issuerDomainPolicy = node.policy.get();
361
+ return sk_POLICY_MAPPING_find(mappings.get(), /*out_index=*/nullptr,
362
+ &mapping);
363
+ });
364
+ // Dropping the mappings.
365
+ mappings = nullptr;
438
366
  }
367
+ }
439
368
 
440
- // If a node was not mapped, it retains the original "explicit_policy_set"
441
- // value, itself. Add those to |mappings|.
442
- if (mappings == NULL) {
443
- mappings = sk_POLICY_MAPPING_new_null();
444
- if (mappings == NULL) {
445
- goto err;
446
- }
369
+ // If a node was not mapped, it retains the original "explicit_policy_set"
370
+ // value, itself. Add those to `mappings`.
371
+ if (mappings == nullptr) {
372
+ mappings.reset(sk_POLICY_MAPPING_new_null());
373
+ if (mappings == nullptr) {
374
+ return std::nullopt;
447
375
  }
448
- for (size_t i = 0; i < sk_X509_POLICY_NODE_num(level->nodes); i++) {
449
- X509_POLICY_NODE *node = sk_X509_POLICY_NODE_value(level->nodes, i);
450
- if (!node->mapped) {
451
- POLICY_MAPPING *mapping = POLICY_MAPPING_new();
452
- if (mapping == NULL) {
453
- goto err;
454
- }
455
- mapping->issuerDomainPolicy = OBJ_dup(node->policy);
456
- mapping->subjectDomainPolicy = OBJ_dup(node->policy);
457
- if (mapping->issuerDomainPolicy == NULL ||
458
- mapping->subjectDomainPolicy == NULL ||
459
- !sk_POLICY_MAPPING_push(mappings, mapping)) {
460
- POLICY_MAPPING_free(mapping);
461
- goto err;
462
- }
376
+ }
377
+ for (const X509PolicyNode &node : level->nodes()) {
378
+ if (!node.mapped) {
379
+ UniquePtr<POLICY_MAPPING> mapping(POLICY_MAPPING_new());
380
+ if (mapping == nullptr) {
381
+ return std::nullopt;
382
+ }
383
+ mapping->issuerDomainPolicy = OBJ_dup(node.policy.get());
384
+ mapping->subjectDomainPolicy = OBJ_dup(node.policy.get());
385
+ if (mapping->issuerDomainPolicy == nullptr ||
386
+ mapping->subjectDomainPolicy == nullptr ||
387
+ !PushToStack(mappings.get(), std::move(mapping))) {
388
+ return std::nullopt;
463
389
  }
464
390
  }
391
+ }
465
392
 
466
- // Sort to group by subjectDomainPolicy.
467
- sk_POLICY_MAPPING_set_cmp_func(mappings, compare_subject_policy);
468
- sk_POLICY_MAPPING_sort(mappings);
469
-
470
- // Convert |mappings| to our "expected_policy_set" representation.
471
- next = x509_policy_level_new();
472
- if (next == NULL) {
473
- goto err;
393
+ // Sort to group by subjectDomainPolicy.
394
+ sk_POLICY_MAPPING_set_cmp_func(mappings.get(), compare_subject_policy);
395
+ sk_POLICY_MAPPING_sort(mappings.get());
396
+
397
+ // Convert `mappings` to our "expected_policy_set" representation.
398
+ Vector<X509PolicyNode> next_nodes;
399
+ for (POLICY_MAPPING *mapping : mappings.get()) {
400
+ // Skip mappings where `issuerDomainPolicy` does not appear in the graph.
401
+ if (!level->has_any_policy() &&
402
+ level->Find(mapping->issuerDomainPolicy) == nullptr) {
403
+ continue;
474
404
  }
475
- next->has_any_policy = level->has_any_policy;
476
-
477
- X509_POLICY_NODE *last_node = NULL;
478
- for (size_t i = 0; i < sk_POLICY_MAPPING_num(mappings); i++) {
479
- POLICY_MAPPING *mapping = sk_POLICY_MAPPING_value(mappings, i);
480
- // Skip mappings where |issuerDomainPolicy| does not appear in the graph.
481
- if (!level->has_any_policy &&
482
- x509_policy_level_find(level, mapping->issuerDomainPolicy) == NULL) {
483
- continue;
484
- }
485
-
486
- if (last_node == NULL ||
487
- OBJ_cmp(last_node->policy, mapping->subjectDomainPolicy) != 0) {
488
- last_node = x509_policy_node_new(mapping->subjectDomainPolicy);
489
- if (last_node == NULL ||
490
- !sk_X509_POLICY_NODE_push(next->nodes, last_node)) {
491
- x509_policy_node_free(last_node);
492
- goto err;
493
- }
494
- }
495
405
 
496
- if (!sk_ASN1_OBJECT_push(last_node->parent_policies,
497
- mapping->issuerDomainPolicy)) {
498
- goto err;
406
+ if (next_nodes.empty() || OBJ_cmp(next_nodes.back().policy.get(),
407
+ mapping->subjectDomainPolicy) != 0) {
408
+ auto new_node = X509PolicyNode::Create(mapping->subjectDomainPolicy);
409
+ if (!new_node.has_value() || !next_nodes.Push(*std::move(new_node))) {
410
+ return std::nullopt;
499
411
  }
500
- mapping->issuerDomainPolicy = NULL;
501
412
  }
502
413
 
503
- sk_X509_POLICY_NODE_sort(next->nodes);
504
- ok = 1;
414
+ // `mapping` is going to be destroyed, so steal its policy object.
415
+ UniquePtr<ASN1_OBJECT> policy(
416
+ std::exchange(mapping->issuerDomainPolicy, nullptr));
417
+ if (!next_nodes.back().parent_policies.Push(std::move(policy))) {
418
+ return std::nullopt;
419
+ }
505
420
  }
506
421
 
507
- err:
508
- if (!ok) {
509
- x509_policy_level_free(next);
510
- next = NULL;
422
+ X509PolicyLevel next;
423
+ next.set_has_any_policy(level->has_any_policy());
424
+ if (!next.AddNodes(Span(next_nodes))) {
425
+ return std::nullopt;
511
426
  }
512
-
513
- sk_POLICY_MAPPING_pop_free(mappings, POLICY_MAPPING_free);
514
- sk_X509_POLICY_NODE_pop_free(new_nodes, x509_policy_node_free);
515
427
  return next;
516
428
  }
517
429
 
518
- // apply_skip_certs, if |skip_certs| is non-NULL, sets |*value| to the minimum
519
- // of its current value and |skip_certs|. It returns one on success and zero if
520
- // |skip_certs| is negative.
521
- static int apply_skip_certs(const ASN1_INTEGER *skip_certs, size_t *value) {
522
- if (skip_certs == NULL) {
523
- return 1;
430
+ // apply_skip_certs, if `skip_certs` is non-NULL, sets `*value` to the minimum
431
+ // of its current value and `skip_certs`. It returns true on success and false
432
+ // if `skip_certs` is negative.
433
+ bool apply_skip_certs(const ASN1_INTEGER *skip_certs, size_t *value) {
434
+ if (skip_certs == nullptr) {
435
+ return true;
524
436
  }
525
437
 
526
438
  // TODO(https://crbug.com/boringssl/443): Move this check into the parser.
527
439
  if (skip_certs->type & V_ASN1_NEG) {
528
440
  OPENSSL_PUT_ERROR(X509, X509_R_INVALID_POLICY_EXTENSION);
529
- return 0;
441
+ return false;
530
442
  }
531
443
 
532
- // If |skip_certs| does not fit in |uint64_t|, it must exceed |*value|.
444
+ // If `skip_certs` does not fit in `uint64_t`, it must exceed `*value`.
533
445
  uint64_t u64;
534
446
  if (ASN1_INTEGER_get_uint64(&u64, skip_certs) && u64 < *value) {
535
447
  *value = (size_t)u64;
536
448
  }
537
449
  ERR_clear_error();
538
- return 1;
450
+ return true;
539
451
  }
540
452
 
541
- // process_policy_constraints updates |*explicit_policy|, |*policy_mapping|, and
542
- // |*inhibit_any_policy| according to |x509|'s policy constraints and inhibit
453
+ // process_policy_constraints updates `*explicit_policy`, `*policy_mapping`, and
454
+ // `*inhibit_any_policy` according to `x509`'s policy constraints and inhibit
543
455
  // anyPolicy extensions. It returns one on success and zero on error. This
544
456
  // implements steps (i) and (j) of RFC 5280, section 6.1.4.
545
- static int process_policy_constraints(const X509 *x509, size_t *explicit_policy,
546
- size_t *policy_mapping,
547
- size_t *inhibit_any_policy) {
457
+ bool process_policy_constraints(const X509 *x509, size_t *explicit_policy,
458
+ size_t *policy_mapping,
459
+ size_t *inhibit_any_policy) {
548
460
  int critical;
549
- POLICY_CONSTRAINTS *constraints = reinterpret_cast<POLICY_CONSTRAINTS *>(
550
- X509_get_ext_d2i(x509, NID_policy_constraints, &critical, NULL));
551
- if (constraints == NULL && critical != -1) {
552
- return 0;
553
- }
554
- if (constraints != NULL) {
555
- if (constraints->requireExplicitPolicy == NULL &&
556
- constraints->inhibitPolicyMapping == NULL) {
461
+ UniquePtr<POLICY_CONSTRAINTS> constraints(
462
+ reinterpret_cast<POLICY_CONSTRAINTS *>(
463
+ X509_get_ext_d2i(x509, NID_policy_constraints, &critical, nullptr)));
464
+ if (constraints == nullptr && critical != -1) {
465
+ return false;
466
+ }
467
+ if (constraints != nullptr) {
468
+ if (constraints->requireExplicitPolicy == nullptr &&
469
+ constraints->inhibitPolicyMapping == nullptr) {
557
470
  // Per RFC 5280, section 4.2.1.11, at least one of the fields must be
558
471
  // present.
559
472
  OPENSSL_PUT_ERROR(X509, X509_R_INVALID_POLICY_EXTENSION);
560
- POLICY_CONSTRAINTS_free(constraints);
561
- return 0;
473
+ return false;
562
474
  }
563
- int ok =
564
- apply_skip_certs(constraints->requireExplicitPolicy, explicit_policy) &&
565
- apply_skip_certs(constraints->inhibitPolicyMapping, policy_mapping);
566
- POLICY_CONSTRAINTS_free(constraints);
567
- if (!ok) {
568
- return 0;
475
+ if (!apply_skip_certs(constraints->requireExplicitPolicy,
476
+ explicit_policy) ||
477
+ !apply_skip_certs(constraints->inhibitPolicyMapping, policy_mapping)) {
478
+ return false;
569
479
  }
570
480
  }
571
481
 
572
- ASN1_INTEGER *inhibit_any_policy_ext = reinterpret_cast<ASN1_INTEGER *>(
573
- X509_get_ext_d2i(x509, NID_inhibit_any_policy, &critical, NULL));
574
- if (inhibit_any_policy_ext == NULL && critical != -1) {
575
- return 0;
482
+ UniquePtr<ASN1_INTEGER> inhibit_any_policy_ext(
483
+ reinterpret_cast<ASN1_INTEGER *>(
484
+ X509_get_ext_d2i(x509, NID_inhibit_any_policy, &critical, nullptr)));
485
+ if (inhibit_any_policy_ext == nullptr && critical != -1) {
486
+ return false;
576
487
  }
577
- int ok = apply_skip_certs(inhibit_any_policy_ext, inhibit_any_policy);
578
- ASN1_INTEGER_free(inhibit_any_policy_ext);
579
- return ok;
488
+ return apply_skip_certs(inhibit_any_policy_ext.get(), inhibit_any_policy);
580
489
  }
581
490
 
582
- // has_explicit_policy returns one if the set of authority-space policy OIDs
583
- // |levels| has some non-empty intersection with |user_policies|, and zero
491
+ // has_explicit_policy returns true if the set of authority-space policy OIDs
492
+ // `levels` has some non-empty intersection with `user_policies`, and false
584
493
  // otherwise. This mirrors the logic in RFC 5280, section 6.1.5, step (g). This
585
- // function modifies |levels| and should only be called at the end of policy
494
+ // function modifies `levels` and should only be called at the end of policy
586
495
  // evaluation.
587
- static int has_explicit_policy(STACK_OF(X509_POLICY_LEVEL) *levels,
588
- const STACK_OF(ASN1_OBJECT) *user_policies) {
589
- assert(user_policies == NULL || sk_ASN1_OBJECT_is_sorted(user_policies));
496
+ bool has_explicit_policy(Span<X509PolicyLevel> levels,
497
+ const STACK_OF(ASN1_OBJECT) *user_policies) {
498
+ assert(user_policies == nullptr || sk_ASN1_OBJECT_is_sorted(user_policies));
590
499
 
591
500
  // Step (g.i). If the policy graph is empty, the intersection is empty.
592
- size_t num_levels = sk_X509_POLICY_LEVEL_num(levels);
593
- X509_POLICY_LEVEL *level = sk_X509_POLICY_LEVEL_value(levels, num_levels - 1);
594
- if (x509_policy_level_is_empty(level)) {
595
- return 0;
596
- }
597
-
598
- // If |user_policies| is empty, we interpret it as having a single anyPolicy
599
- // value. The caller may also have supplied anyPolicy explicitly.
600
- int user_has_any_policy = sk_ASN1_OBJECT_num(user_policies) == 0;
601
- for (size_t i = 0; i < sk_ASN1_OBJECT_num(user_policies); i++) {
602
- if (is_any_policy(sk_ASN1_OBJECT_value(user_policies, i))) {
603
- user_has_any_policy = 1;
604
- break;
605
- }
501
+ if (levels.empty() || levels.back().is_empty()) {
502
+ return false;
606
503
  }
607
504
 
608
505
  // Step (g.ii). If the policy graph is not empty and the user set contains
609
506
  // anyPolicy, the intersection is the entire (non-empty) graph.
610
- if (user_has_any_policy) {
611
- return 1;
507
+ //
508
+ // If `user_policies` is empty, we interpret it as having a single anyPolicy
509
+ // value. The caller may also have supplied anyPolicy explicitly.
510
+ if (sk_ASN1_OBJECT_num(user_policies) == 0) {
511
+ return true;
512
+ }
513
+ for (const ASN1_OBJECT *user_policy : user_policies) {
514
+ if (is_any_policy(user_policy)) {
515
+ return true;
516
+ }
612
517
  }
613
518
 
614
519
  // Step (g.iii) does not delete anyPolicy nodes, so if the graph has
615
520
  // anyPolicy, some explicit policy will survive. The actual intersection may
616
521
  // synthesize some nodes in step (g.iii.3), but we do not return the policy
617
522
  // list itself, so we skip actually computing this.
618
- if (level->has_any_policy) {
619
- return 1;
523
+ if (levels.back().has_any_policy()) {
524
+ return true;
620
525
  }
621
526
 
622
527
  // We defer pruning the tree, so as we look for nodes with parent anyPolicy,
623
528
  // step (g.iii.1), we must limit to nodes reachable from the bottommost level.
624
529
  // Start by marking each of those nodes as reachable.
625
- for (size_t i = 0; i < sk_X509_POLICY_NODE_num(level->nodes); i++) {
626
- sk_X509_POLICY_NODE_value(level->nodes, i)->reachable = 1;
530
+ for (X509PolicyNode &node : levels.back().nodes()) {
531
+ node.reachable = true;
627
532
  }
628
533
 
534
+ const size_t num_levels = levels.size();
629
535
  for (size_t i = num_levels - 1; i < num_levels; i--) {
630
- level = sk_X509_POLICY_LEVEL_value(levels, i);
631
- for (size_t j = 0; j < sk_X509_POLICY_NODE_num(level->nodes); j++) {
632
- X509_POLICY_NODE *node = sk_X509_POLICY_NODE_value(level->nodes, j);
633
- if (!node->reachable) {
536
+ X509PolicyLevel &level = levels[i];
537
+ for (X509PolicyNode &node : level.nodes()) {
538
+ if (!node.reachable) {
634
539
  continue;
635
540
  }
636
- if (sk_ASN1_OBJECT_num(node->parent_policies) == 0) {
637
- // |node|'s parent is anyPolicy and is part of "valid_policy_node_set".
638
- // If it exists in |user_policies|, the intersection is non-empty and we
541
+ if (node.parent_is_any_policy()) {
542
+ // `node`'s parent is anyPolicy and is part of "valid_policy_node_set".
543
+ // If it exists in `user_policies`, the intersection is non-empty and we
639
544
  // can return immediately.
640
- if (sk_ASN1_OBJECT_find(user_policies, /*out_index=*/NULL,
641
- node->policy)) {
642
- return 1;
545
+ if (sk_ASN1_OBJECT_find(user_policies, /*out_index=*/nullptr,
546
+ node.policy.get())) {
547
+ return true;
643
548
  }
644
549
  } else if (i > 0) {
645
- // |node|'s parents are concrete policies. Mark the parents reachable,
550
+ // `node`'s parents are concrete policies. Mark the parents reachable,
646
551
  // to be inspected by the next loop iteration.
647
- X509_POLICY_LEVEL *prev = sk_X509_POLICY_LEVEL_value(levels, i - 1);
648
- for (size_t k = 0; k < sk_ASN1_OBJECT_num(node->parent_policies); k++) {
649
- X509_POLICY_NODE *parent = x509_policy_level_find(
650
- prev, sk_ASN1_OBJECT_value(node->parent_policies, k));
651
- if (parent != NULL) {
652
- parent->reachable = 1;
552
+ X509PolicyLevel &prev = levels[i - 1];
553
+ for (const auto &parent_policy : node.parent_policies) {
554
+ X509PolicyNode *parent_node = prev.Find(parent_policy.get());
555
+ if (parent_node != nullptr) {
556
+ parent_node->reachable = true;
653
557
  }
654
558
  }
655
559
  }
656
560
  }
657
561
  }
658
562
 
659
- return 0;
563
+ return false;
660
564
  }
661
565
 
662
- static int asn1_object_cmp(const ASN1_OBJECT *const *a,
663
- const ASN1_OBJECT *const *b) {
566
+ int asn1_object_cmp(const ASN1_OBJECT *const *a, const ASN1_OBJECT *const *b) {
664
567
  return OBJ_cmp(*a, *b);
665
568
  }
666
569
 
570
+ } // namespace
571
+
667
572
  int X509_policy_check(const STACK_OF(X509) *certs,
668
573
  const STACK_OF(ASN1_OBJECT) *user_policies,
669
574
  unsigned long flags, X509 **out_current_cert) {
670
- *out_current_cert = NULL;
671
- int ret = X509_V_ERR_OUT_OF_MEM;
672
- X509_POLICY_LEVEL *level = NULL;
673
- STACK_OF(X509_POLICY_LEVEL) *levels = NULL;
674
- STACK_OF(ASN1_OBJECT) *user_policies_sorted = NULL;
675
- size_t num_certs = sk_X509_num(certs);
575
+ *out_current_cert = nullptr;
676
576
 
677
577
  // Skip policy checking if the chain is just the trust anchor.
578
+ const size_t num_certs = sk_X509_num(certs);
678
579
  if (num_certs <= 1) {
679
580
  return X509_V_OK;
680
581
  }
@@ -686,65 +587,58 @@ int X509_policy_check(const STACK_OF(X509) *certs,
686
587
  (flags & X509_V_FLAG_INHIBIT_ANY) ? 0 : num_certs + 1;
687
588
  size_t policy_mapping = (flags & X509_V_FLAG_INHIBIT_MAP) ? 0 : num_certs + 1;
688
589
 
689
- levels = sk_X509_POLICY_LEVEL_new_null();
690
- if (levels == NULL) {
691
- goto err;
692
- }
693
-
590
+ Vector<X509PolicyLevel> levels;
591
+ std::optional<X509PolicyLevel> level;
694
592
  for (size_t i = num_certs - 2; i < num_certs; i--) {
695
593
  X509 *cert = sk_X509_value(certs, i);
696
- if (!x509v3_cache_extensions(cert)) {
697
- goto err;
594
+ uint32_t ex_flags = X509_get_extension_flags(cert);
595
+ if (ex_flags & EXFLAG_INVALID) {
596
+ return X509_V_ERR_OUT_OF_MEM;
698
597
  }
699
- const int is_self_issued = (cert->ex_flags & EXFLAG_SI) != 0;
598
+ const bool is_self_issued = (ex_flags & EXFLAG_SI) != 0;
700
599
 
701
- if (level == NULL) {
600
+ // In all but the first iteration, the previous iteration will have prepared
601
+ // "expected_policy_set" for us as a staging level.
602
+ if (!level.has_value()) {
702
603
  assert(i == num_certs - 2);
703
- level = x509_policy_level_new();
704
- if (level == NULL) {
705
- goto err;
706
- }
707
- level->has_any_policy = 1;
604
+ level.emplace();
605
+ level->set_has_any_policy(true);
708
606
  }
709
607
 
710
- // RFC 5280, section 6.1.3, steps (d) and (e). |any_policy_allowed| is
608
+ // RFC 5280, section 6.1.3, steps (d) and (e). `any_policy_allowed` is
711
609
  // computed as in step (d.2).
712
610
  const int any_policy_allowed =
713
611
  inhibit_any_policy > 0 || (i > 0 && is_self_issued);
714
- if (!process_certificate_policies(cert, level, any_policy_allowed)) {
715
- ret = X509_V_ERR_INVALID_POLICY_EXTENSION;
612
+ if (!process_certificate_policies(cert, &*level, any_policy_allowed)) {
716
613
  *out_current_cert = cert;
717
- goto err;
614
+ return X509_V_ERR_INVALID_POLICY_EXTENSION;
718
615
  }
719
616
 
720
617
  // RFC 5280, section 6.1.3, step (f).
721
- if (explicit_policy == 0 && x509_policy_level_is_empty(level)) {
722
- ret = X509_V_ERR_NO_EXPLICIT_POLICY;
723
- goto err;
618
+ if (explicit_policy == 0 && level->is_empty()) {
619
+ return X509_V_ERR_NO_EXPLICIT_POLICY;
724
620
  }
725
621
 
726
- // Insert into the list.
727
- if (!sk_X509_POLICY_LEVEL_push(levels, level)) {
728
- goto err;
622
+ // Insert the completed level into the list.
623
+ if (!levels.Push(*std::exchange(level, std::nullopt))) {
624
+ return X509_V_ERR_OUT_OF_MEM;
729
625
  }
730
- X509_POLICY_LEVEL *current_level = level;
731
- level = NULL;
626
+ level = std::nullopt;
732
627
 
733
628
  // If this is not the leaf certificate, we go to section 6.1.4. If it
734
629
  // is the leaf certificate, we go to section 6.1.5 instead.
735
630
  if (i != 0) {
736
631
  // RFC 5280, section 6.1.4, steps (a) and (b).
737
- level = process_policy_mappings(cert, current_level, policy_mapping > 0);
738
- if (level == NULL) {
739
- ret = X509_V_ERR_INVALID_POLICY_EXTENSION;
632
+ level = process_policy_mappings(cert, &levels.back(), policy_mapping > 0);
633
+ if (!level.has_value()) {
740
634
  *out_current_cert = cert;
741
- goto err;
635
+ return X509_V_ERR_INVALID_POLICY_EXTENSION;
742
636
  }
743
637
  }
744
638
 
745
639
  // RFC 5280, section 6.1.4, step (h-j) for non-leaves, and section 6.1.5,
746
640
  // step (a-b) for leaves. In the leaf case, RFC 5280 says only to update
747
- // |explicit_policy|, but |policy_mapping| and |inhibit_any_policy| are no
641
+ // `explicit_policy`, but `policy_mapping` and `inhibit_any_policy` are no
748
642
  // longer read at this point, so we use the same process.
749
643
  if (i == 0 || !is_self_issued) {
750
644
  if (explicit_policy > 0) {
@@ -759,38 +653,34 @@ int X509_policy_check(const STACK_OF(X509) *certs,
759
653
  }
760
654
  if (!process_policy_constraints(cert, &explicit_policy, &policy_mapping,
761
655
  &inhibit_any_policy)) {
762
- ret = X509_V_ERR_INVALID_POLICY_EXTENSION;
763
656
  *out_current_cert = cert;
764
- goto err;
657
+ return X509_V_ERR_INVALID_POLICY_EXTENSION;
765
658
  }
766
659
  }
767
660
 
768
661
  // RFC 5280, section 6.1.5, step (g). We do not output the policy set, so it
769
662
  // is only necessary to check if the user-constrained-policy-set is not empty.
770
663
  if (explicit_policy == 0) {
771
- // Build a sorted copy of |user_policies| for more efficient lookup.
772
- if (user_policies != NULL) {
664
+ // Build a sorted copy of `user_policies` for more efficient lookup.
665
+ STACK_OF(ASN1_OBJECT) *user_policies_sorted = nullptr;
666
+ // `user_policies_sorted`'s contents are owned by `user_policies`, so we do
667
+ // not use `sk_ASN1_OBJECT_pop_free`.
668
+ Cleanup cleanup = [&] { sk_ASN1_OBJECT_free(user_policies_sorted); };
669
+ if (user_policies != nullptr) {
773
670
  user_policies_sorted = sk_ASN1_OBJECT_dup(user_policies);
774
- if (user_policies_sorted == NULL) {
775
- goto err;
671
+ if (user_policies_sorted == nullptr) {
672
+ return X509_V_ERR_OUT_OF_MEM;
776
673
  }
777
674
  sk_ASN1_OBJECT_set_cmp_func(user_policies_sorted, asn1_object_cmp);
778
675
  sk_ASN1_OBJECT_sort(user_policies_sorted);
779
676
  }
780
677
 
781
- if (!has_explicit_policy(levels, user_policies_sorted)) {
782
- ret = X509_V_ERR_NO_EXPLICIT_POLICY;
783
- goto err;
678
+ if (!has_explicit_policy(Span(levels), user_policies_sorted)) {
679
+ return X509_V_ERR_NO_EXPLICIT_POLICY;
784
680
  }
785
681
  }
786
682
 
787
- ret = X509_V_OK;
788
-
789
- err:
790
- x509_policy_level_free(level);
791
- // |user_policies_sorted|'s contents are owned by |user_policies|, so we do
792
- // not use |sk_ASN1_OBJECT_pop_free|.
793
- sk_ASN1_OBJECT_free(user_policies_sorted);
794
- sk_X509_POLICY_LEVEL_pop_free(levels, x509_policy_level_free);
795
- return ret;
683
+ return X509_V_OK;
796
684
  }
685
+
686
+ BSSL_NAMESPACE_END