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.
- checksums.yaml +4 -4
- data/Makefile +40 -27
- data/include/grpc/event_engine/memory_allocator.h +1 -0
- data/include/grpc/grpc.h +3 -0
- data/include/grpc/grpc_security_constants.h +2 -0
- data/include/grpc/impl/channel_arg_names.h +4 -0
- data/src/core/call/call_filters.h +10 -10
- data/src/core/{lib/security/authorization → call}/evaluate_args.cc +22 -1
- data/src/core/{lib/security/authorization → call}/evaluate_args.h +19 -5
- data/src/core/call/filter_fusion.h +15 -15
- data/src/core/call/interception_chain.h +3 -3
- data/src/core/call/metadata_batch.cc +1 -0
- data/src/core/call/metadata_batch.h +45 -33
- data/src/core/call/parsed_metadata.h +3 -3
- data/src/core/call/request_buffer.cc +6 -6
- data/src/core/call/request_buffer.h +1 -1
- data/src/core/channelz/channel_trace.cc +5 -5
- data/src/core/channelz/channel_trace.h +1 -1
- data/src/core/channelz/channelz.cc +9 -9
- data/src/core/channelz/channelz.h +12 -12
- data/src/core/channelz/channelz_registry.cc +10 -10
- data/src/core/channelz/ztrace_collector.h +5 -5
- data/src/core/client_channel/client_channel.cc +4 -4
- data/src/core/client_channel/client_channel_filter.cc +14 -14
- data/src/core/client_channel/global_subchannel_pool.cc +4 -4
- data/src/core/client_channel/subchannel.cc +24 -23
- data/src/core/client_channel/subchannel_stream_client.cc +5 -5
- data/src/core/credentials/call/external/aws_external_account_credentials.cc +7 -7
- data/src/core/credentials/call/external/aws_request_signer.cc +16 -0
- data/src/core/credentials/call/external/external_account_credentials.cc +4 -4
- data/src/core/credentials/call/regional_access_boundary_fetcher.cc +9 -9
- data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.cc +4 -4
- data/src/core/credentials/transport/google_default/google_default_credentials.cc +3 -3
- data/src/core/credentials/transport/ssl/ssl_security_connector.cc +1 -1
- data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +9 -9
- data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +1 -1
- data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +6 -6
- data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.cc +3 -3
- data/src/core/credentials/transport/tls/grpc_tls_crl_provider.cc +4 -4
- data/src/core/credentials/transport/tls/ssl_utils.cc +10 -0
- data/src/core/credentials/transport/tls/tls_security_connector.cc +10 -10
- data/src/core/credentials/transport/tls/tls_security_connector.h +6 -6
- data/src/core/credentials/transport/tls/tls_utils.h +9 -0
- data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +1 -1
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -1
- data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +2 -2
- data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +1 -1
- data/src/core/ext/filters/http/message_compress/compression_filter.cc +15 -0
- data/src/core/ext/filters/rbac/rbac_filter.h +1 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +5 -5
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +30 -21
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +5 -11
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +14 -11
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -0
- data/src/core/ext/transport/chttp2/transport/flow_control.h +0 -4
- data/src/core/ext/transport/chttp2/transport/frame.h +9 -0
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +12 -9
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +4 -2
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +16 -18
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +2 -1
- data/src/core/ext/transport/chttp2/transport/http2_server_transport.cc +277 -189
- data/src/core/ext/transport/chttp2/transport/http2_server_transport.h +40 -17
- data/src/core/ext/transport/chttp2/transport/http2_transport.cc +12 -24
- data/src/core/ext/transport/chttp2/transport/http2_transport.h +3 -29
- data/src/core/ext/transport/chttp2/transport/internal.h +2 -2
- data/src/core/ext/transport/chttp2/transport/parsing.cc +3 -2
- data/src/core/ext/transport/chttp2/transport/read_context.h +96 -3
- data/src/core/ext/transport/chttp2/transport/reclaimer.cc +32 -0
- data/src/core/ext/transport/chttp2/transport/reclaimer.h +64 -0
- data/src/core/ext/transport/chttp2/transport/security_frame.h +8 -8
- data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +17 -9
- data/src/core/ext/transport/chttp2/transport/write_cycle.h +23 -3
- data/src/core/ext/transport/inproc/inproc_transport.cc +5 -5
- data/src/core/ext/upb-gen/grpc/channelz/v1/channelz.upb.h +137 -73
- data/src/core/ext/upb-gen/grpc/channelz/v1/channelz.upb_minitable.c +45 -25
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/altscontext.upb.h +6 -6
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/altscontext.upb_minitable.c +4 -4
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/altscontext.upb_minitable.h +5 -5
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/handshaker.upb.h +46 -26
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/handshaker.upb_minitable.c +17 -14
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/handshaker.upb_minitable.h +5 -5
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/transport_security_common.upb.h +5 -5
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/transport_security_common.upb_minitable.c +3 -3
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/transport_security_common.upb_minitable.h +5 -5
- data/src/core/ext/upb-gen/grpc/health/v1/health.upb.h +329 -0
- data/src/core/ext/upb-gen/grpc/health/v1/health.upb_minitable.c +128 -0
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/health/v1/health.upb_minitable.h +8 -5
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lb/v1/load_balancer.upb.h +5 -5
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lb/v1/load_balancer.upb_minitable.c +3 -3
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lb/v1/load_balancer.upb_minitable.h +5 -5
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls.upb.h +185 -23
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls.upb_minitable.c +20 -12
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls.upb_minitable.h +5 -5
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls_config.upb.h +58 -42
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls_config.upb_minitable.c +17 -12
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls_config.upb_minitable.h +5 -5
- data/src/core/ext/upbdefs-gen/grpc/channelz/v1/channelz.upbdefs.c +567 -549
- data/src/core/ext/upbdefs-gen/grpc/lookup/v1/rls_config.upbdefs.c +182 -0
- data/src/core/ext/upbdefs-gen/{src/proto/grpc → grpc}/lookup/v1/rls_config.upbdefs.h +14 -14
- data/src/core/filter/ext_proc/ext_proc_filter.cc +1603 -46
- data/src/core/filter/ext_proc/ext_proc_filter.h +55 -22
- data/src/core/filter/ext_proc/ext_proc_messages.cc +106 -51
- data/src/core/filter/ext_proc/ext_proc_messages.h +36 -9
- data/src/core/handshaker/handshaker.cc +4 -4
- data/src/core/handshaker/http_connect/http_connect_client_handshaker.cc +3 -3
- data/src/core/handshaker/security/pipelined_secure_endpoint.cc +10 -10
- data/src/core/handshaker/security/secure_endpoint.cc +13 -13
- data/src/core/handshaker/security/security_handshaker.cc +6 -6
- data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +4 -4
- data/src/core/lib/channel/channel_args.cc +20 -0
- data/src/core/lib/channel/channel_args.h +17 -17
- data/src/core/lib/channel/promise_based_filter.cc +2 -2
- data/src/core/lib/channel/promise_based_filter.h +66 -27
- data/src/core/lib/debug/trace_flags.cc +2 -0
- data/src/core/lib/debug/trace_flags.h +1 -0
- data/src/core/lib/event_engine/ares_resolver.cc +14 -14
- data/src/core/lib/event_engine/cf_engine/cf_engine.cc +7 -7
- data/src/core/lib/event_engine/cf_engine/cfsocket_listener.cc +4 -4
- data/src/core/lib/event_engine/default_event_engine.cc +5 -5
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +9 -9
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +16 -14
- data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +6 -6
- data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +3 -3
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1 -1
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +7 -7
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +17 -17
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +3 -3
- data/src/core/lib/event_engine/posix_engine/timer.cc +5 -5
- data/src/core/lib/event_engine/posix_engine/timer_manager.cc +5 -5
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +3 -3
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +1 -1
- data/src/core/lib/event_engine/thread_pool/thread_count.cc +1 -1
- data/src/core/lib/event_engine/thread_pool/thread_count.h +3 -3
- data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +50 -21
- data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.cc +3 -3
- data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +3 -3
- data/src/core/lib/event_engine/windows/windows_engine.cc +15 -15
- data/src/core/lib/event_engine/windows/windows_listener.cc +6 -6
- data/src/core/lib/event_engine/work_queue/basic_work_queue.cc +6 -6
- data/src/core/lib/experiments/experiments.cc +48 -0
- data/src/core/lib/experiments/experiments.h +24 -0
- data/src/core/lib/iomgr/buffer_list.cc +3 -3
- data/src/core/lib/iomgr/buffer_list.h +1 -1
- data/src/core/lib/iomgr/combiner.cc +0 -1
- data/src/core/lib/iomgr/ev_apple.cc +4 -4
- data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +2 -2
- data/src/core/lib/iomgr/tcp_client_posix.cc +3 -3
- data/src/core/lib/iomgr/tcp_posix.cc +7 -7
- data/src/core/lib/promise/activity.cc +1 -1
- data/src/core/lib/promise/activity.h +1 -1
- data/src/core/lib/promise/arena_promise.h +7 -7
- data/src/core/lib/promise/detail/promise_factory.h +8 -8
- data/src/core/lib/promise/detail/promise_like.h +4 -4
- data/src/core/lib/promise/inter_activity_latch.h +6 -6
- data/src/core/lib/promise/inter_activity_pipe.h +1 -1
- data/src/core/lib/promise/observable.h +3 -3
- data/src/core/lib/promise/party.cc +1 -1
- data/src/core/lib/promise/try_seq.h +2 -2
- data/src/core/lib/resource_quota/arena.h +3 -3
- data/src/core/lib/resource_quota/memory_quota.cc +16 -16
- data/src/core/lib/resource_quota/memory_quota.h +1 -1
- data/src/core/lib/resource_quota/thread_quota.cc +3 -3
- data/src/core/lib/security/authorization/audit_logging.cc +5 -5
- data/src/core/lib/security/authorization/authorization_engine.h +1 -1
- data/src/core/lib/security/authorization/grpc_authorization_engine.h +1 -1
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +1 -1
- data/src/core/lib/security/authorization/grpc_server_authz_filter.h +1 -1
- data/src/core/lib/security/authorization/matchers.h +1 -1
- data/src/core/lib/surface/call.cc +8 -7
- data/src/core/lib/surface/call.h +3 -3
- data/src/core/lib/surface/call_utils.h +4 -0
- data/src/core/lib/surface/channel.cc +1 -1
- data/src/core/lib/surface/channel.h +1 -1
- data/src/core/lib/surface/channel_init.cc +1 -1
- data/src/core/lib/surface/init.cc +7 -7
- data/src/core/lib/surface/lame_client.cc +1 -1
- data/src/core/lib/surface/legacy_channel.cc +2 -2
- data/src/core/lib/surface/version.cc +1 -1
- data/src/core/lib/transport/transport_framing_endpoint_extension.h +3 -3
- data/src/core/load_balancing/autosharding/autosharding.cc +931 -0
- data/src/core/load_balancing/autosharding/autosharding.h +78 -0
- data/src/core/load_balancing/grpclb/grpclb_client_stats.cc +2 -2
- data/src/core/load_balancing/grpclb/load_balancer_api.cc +1 -1
- data/src/core/load_balancing/grpclb/load_balancer_api.h +3 -1
- data/src/core/load_balancing/health_check_client.cc +7 -7
- data/src/core/load_balancing/lb_policy.cc +1 -1
- data/src/core/load_balancing/oob_backend_metric.cc +5 -5
- data/src/core/load_balancing/outlier_detection/outlier_detection.cc +2 -2
- data/src/core/load_balancing/ring_hash/ring_hash.cc +109 -37
- data/src/core/load_balancing/rls/rls.cc +23 -17
- data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +10 -10
- data/src/core/load_balancing/xds/cds.cc +6 -5
- data/src/core/load_balancing/xds/xds_cluster_impl.cc +2 -2
- data/src/core/load_balancing/xds/xds_override_host.cc +10 -10
- data/src/core/mitigation_engine/mitigation_engine.h +28 -4
- data/src/core/plugin_registry/grpc_plugin_registry.cc +2 -0
- data/src/core/resolver/dns/dns_resolver.cc +7 -7
- data/src/core/resolver/fake/fake_resolver.cc +5 -5
- data/src/core/resolver/google_c2p/google_c2p_resolver.cc +38 -30
- data/src/core/server/server.cc +30 -30
- data/src/core/server/server.h +4 -3
- data/src/core/server/server_config_selector_filter.cc +3 -3
- data/src/core/server/xds_server_config_fetcher_legacy.cc +15 -15
- data/src/core/telemetry/default_tcp_tracer.cc +1 -1
- data/src/core/telemetry/instrument.cc +30 -16
- data/src/core/telemetry/instrument.h +3 -3
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +3 -3
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +4 -4
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +2 -2
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +1 -1
- data/src/core/tsi/alts/handshaker/transport_security_common_api.h +1 -1
- data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +5 -5
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +3 -3
- data/src/core/tsi/ssl_transport_security.cc +46 -13
- data/src/core/tsi/ssl_transport_security.h +7 -0
- data/src/core/tsi/ssl_transport_security_utils.cc +16 -6
- data/src/core/util/event_log.cc +3 -3
- data/src/core/util/http_client/httpcli.cc +5 -5
- data/src/core/util/http_client/httpcli.h +1 -1
- data/src/core/util/json/json_object_loader.cc +7 -0
- data/src/core/util/json/json_object_loader.h +17 -2
- data/src/core/util/latent_see.cc +123 -36
- data/src/core/util/latent_see.h +14 -1
- data/src/core/util/mpscq.cc +1 -1
- data/src/core/util/notification.h +4 -4
- data/src/core/util/sync.h +20 -6
- data/src/core/util/table.h +20 -22
- data/src/core/util/work_serializer.cc +2 -2
- data/src/core/xds/grpc/blackboard.cc +4 -3
- data/src/core/xds/grpc/certificate_provider_store.cc +2 -2
- data/src/core/xds/grpc/streaming_call_promise_wrapper.cc +181 -0
- data/src/core/xds/grpc/streaming_call_promise_wrapper.h +213 -0
- data/src/core/xds/grpc/xds_bootstrap_grpc_builder.cc +2 -2
- data/src/core/xds/grpc/xds_client_grpc.cc +8 -8
- data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +2 -2
- data/src/core/xds/grpc/xds_endpoint.cc +1 -1
- data/src/core/xds/grpc/xds_endpoint_parser.cc +11 -0
- data/src/core/xds/grpc/xds_grpc_service_parser.cc +12 -10
- data/src/core/xds/grpc/xds_http_ext_proc_filter.cc +17 -14
- data/src/core/xds/grpc/xds_matcher.h +2 -2
- data/src/core/xds/grpc/xds_transport_grpc.cc +125 -85
- data/src/core/xds/grpc/xds_transport_grpc.h +19 -4
- data/src/core/xds/xds_client/lrs_client.cc +22 -19
- data/src/core/xds/xds_client/xds_client.cc +19 -16
- data/src/core/xds/xds_client/xds_transport.h +49 -3
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/README.md +1 -1
- data/src/ruby/pb/generate_proto_ruby.sh +1 -1
- data/third_party/abseil-cpp/absl/algorithm/algorithm.h +34 -2
- data/third_party/abseil-cpp/absl/algorithm/container.h +345 -147
- data/third_party/abseil-cpp/absl/base/attributes.h +67 -44
- data/third_party/abseil-cpp/absl/base/call_once.h +1 -0
- data/third_party/abseil-cpp/absl/base/casts.cc +61 -0
- data/third_party/abseil-cpp/absl/base/casts.h +135 -2
- data/third_party/abseil-cpp/absl/base/config.h +63 -41
- data/third_party/abseil-cpp/absl/base/fast_type_id.h +30 -2
- data/third_party/abseil-cpp/absl/base/internal/dynamic_annotations.h +1 -1
- data/third_party/abseil-cpp/absl/base/internal/hardening.h +136 -0
- data/third_party/abseil-cpp/absl/base/internal/iterator_traits.h +6 -2
- data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +39 -4
- data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +6 -0
- data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +77 -15
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +3 -4
- data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +26 -24
- data/third_party/abseil-cpp/absl/base/internal/spinlock.h +74 -29
- data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +1 -11
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +52 -0
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +5 -1
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +5 -0
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h +1 -1
- data/third_party/abseil-cpp/absl/base/macros.h +76 -37
- data/third_party/abseil-cpp/absl/base/nullability.h +5 -5
- data/third_party/abseil-cpp/absl/base/optimization.h +4 -5
- data/third_party/abseil-cpp/absl/base/options.h +46 -18
- data/third_party/abseil-cpp/absl/base/policy_checks.h +5 -5
- data/third_party/abseil-cpp/absl/base/{internal/throw_delegate.cc → throw_delegate.cc} +9 -7
- data/third_party/abseil-cpp/absl/base/{internal/throw_delegate.h → throw_delegate.h} +4 -14
- data/third_party/abseil-cpp/absl/cleanup/cleanup.h +7 -2
- data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -2
- data/third_party/abseil-cpp/absl/container/btree_map.h +60 -10
- data/third_party/abseil-cpp/absl/container/btree_set.h +61 -15
- data/third_party/abseil-cpp/absl/container/fixed_array.h +19 -21
- data/third_party/abseil-cpp/absl/container/flat_hash_map.h +49 -27
- data/third_party/abseil-cpp/absl/container/flat_hash_set.h +50 -26
- data/third_party/abseil-cpp/absl/container/inlined_vector.h +42 -36
- data/third_party/abseil-cpp/absl/container/internal/btree.h +32 -24
- data/third_party/abseil-cpp/absl/container/internal/btree_container.h +30 -22
- data/third_party/abseil-cpp/absl/container/internal/common.h +57 -5
- data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -1
- data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +40 -36
- data/third_party/abseil-cpp/absl/container/internal/container_memory.h +119 -39
- data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +14 -2
- data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +14 -22
- data/third_party/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +52 -52
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +7 -7
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +7 -7
- data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +32 -40
- data/third_party/abseil-cpp/absl/container/internal/layout.h +13 -13
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +95 -72
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +633 -365
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +1016 -749
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +0 -1
- data/third_party/abseil-cpp/absl/container/node_hash_map.h +58 -35
- data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.cc +23 -6
- data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.h +7 -1
- data/third_party/abseil-cpp/absl/crc/internal/crc.cc +4 -6
- data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +41 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_internal.h +0 -16
- data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy_x86_arm_combined.cc +5 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +304 -188
- data/third_party/abseil-cpp/absl/crc/internal/non_temporal_arm_intrinsics.h +4 -2
- data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +2 -2
- data/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.h +8 -0
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +4 -4
- data/third_party/abseil-cpp/absl/debugging/internal/examine_stack.cc +15 -1
- data/third_party/abseil-cpp/absl/debugging/internal/examine_stack.h +7 -1
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +12 -1
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +6 -5
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +13 -11
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +14 -7
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +3 -2
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +6 -1
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +14 -8
- data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +48 -38
- data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +4 -0
- data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +63 -118
- data/third_party/abseil-cpp/absl/debugging/stacktrace.h +7 -47
- data/third_party/abseil-cpp/absl/debugging/symbolize.cc +20 -2
- data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +83 -149
- data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +4 -17
- data/third_party/abseil-cpp/absl/debugging/symbolize_unimplemented.inc +4 -4
- data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +2 -4
- data/third_party/abseil-cpp/absl/flags/commandlineflag.h +8 -6
- data/third_party/abseil-cpp/absl/flags/declare.h +9 -0
- data/third_party/abseil-cpp/absl/flags/flag.h +2 -1
- data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h +1 -1
- data/third_party/abseil-cpp/absl/flags/internal/flag.cc +19 -18
- data/third_party/abseil-cpp/absl/flags/internal/flag.h +33 -34
- data/third_party/abseil-cpp/absl/flags/internal/program_name.cc +2 -2
- data/third_party/abseil-cpp/absl/flags/marshalling.cc +1 -16
- data/third_party/abseil-cpp/absl/flags/marshalling.h +2 -28
- data/third_party/abseil-cpp/absl/flags/reflection.cc +11 -7
- data/third_party/abseil-cpp/absl/flags/usage_config.cc +2 -2
- data/third_party/abseil-cpp/absl/functional/any_invocable.h +22 -19
- data/third_party/abseil-cpp/absl/functional/bind_front.h +7 -1
- data/third_party/abseil-cpp/absl/functional/function_ref.h +125 -20
- data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +43 -31
- data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +4 -4
- data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +44 -6
- data/third_party/abseil-cpp/absl/hash/hash.h +1 -1
- data/third_party/abseil-cpp/absl/hash/internal/city.cc +39 -51
- data/third_party/abseil-cpp/absl/hash/internal/hash.cc +379 -14
- data/third_party/abseil-cpp/absl/hash/internal/hash.h +457 -353
- data/third_party/abseil-cpp/absl/log/absl_vlog_is_on.h +0 -2
- data/third_party/abseil-cpp/absl/log/internal/check_impl.h +2 -1
- data/third_party/abseil-cpp/absl/log/internal/check_op.cc +4 -0
- data/third_party/abseil-cpp/absl/log/internal/check_op.h +128 -50
- data/third_party/abseil-cpp/absl/log/internal/conditions.h +38 -35
- data/third_party/abseil-cpp/absl/log/internal/log_impl.h +108 -110
- data/third_party/abseil-cpp/absl/log/internal/log_message.cc +10 -6
- data/third_party/abseil-cpp/absl/log/internal/log_message.h +19 -1
- data/third_party/abseil-cpp/absl/log/internal/log_sink_set.cc +4 -4
- data/third_party/abseil-cpp/absl/log/internal/nullstream.h +1 -1
- data/third_party/abseil-cpp/absl/log/internal/proto.cc +13 -0
- data/third_party/abseil-cpp/absl/log/internal/strip.h +30 -31
- data/third_party/abseil-cpp/absl/log/internal/structured_proto.cc +5 -5
- data/third_party/abseil-cpp/absl/log/internal/structured_proto.h +6 -5
- data/third_party/abseil-cpp/absl/log/internal/vlog_config.cc +30 -30
- data/third_party/abseil-cpp/absl/log/internal/vlog_config.h +0 -1
- data/third_party/abseil-cpp/absl/log/log.h +2 -2
- data/third_party/abseil-cpp/absl/log/log_entry.cc +263 -0
- data/third_party/abseil-cpp/absl/log/log_entry.h +2 -0
- data/third_party/abseil-cpp/absl/log/vlog_is_on.h +0 -2
- data/third_party/abseil-cpp/absl/memory/memory.h +55 -5
- data/third_party/abseil-cpp/absl/meta/type_traits.h +161 -56
- data/third_party/abseil-cpp/absl/numeric/int128.h +41 -21
- data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +16 -22
- data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +5 -7
- data/third_party/abseil-cpp/absl/numeric/internal/bits.h +32 -4
- data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +9 -9
- data/third_party/abseil-cpp/absl/random/beta_distribution.h +2 -2
- data/third_party/abseil-cpp/absl/random/bit_gen_ref.h +26 -53
- data/third_party/abseil-cpp/absl/random/discrete_distribution.h +1 -1
- data/third_party/abseil-cpp/absl/random/distributions.h +17 -17
- data/third_party/abseil-cpp/absl/random/exponential_distribution.h +1 -1
- data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +8 -21
- data/third_party/abseil-cpp/absl/random/internal/entropy_pool.cc +2 -2
- data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +1 -1
- data/third_party/abseil-cpp/absl/random/internal/generate_real.h +1 -1
- data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +2 -2
- data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +2 -2
- data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +6 -6
- data/third_party/abseil-cpp/absl/random/internal/platform.h +0 -13
- data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +6 -6
- data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +2 -2
- data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +6 -5
- data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +5 -31
- data/third_party/abseil-cpp/absl/random/internal/seed_material.h +2 -1
- data/third_party/abseil-cpp/absl/random/internal/traits.h +21 -0
- data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +23 -23
- data/third_party/abseil-cpp/absl/random/mocking_access.h +74 -0
- data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
- data/third_party/abseil-cpp/absl/status/internal/status_internal.cc +63 -18
- data/third_party/abseil-cpp/absl/status/internal/status_internal.h +30 -4
- data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +225 -63
- data/third_party/abseil-cpp/absl/status/status.cc +66 -70
- data/third_party/abseil-cpp/absl/status/status.h +254 -23
- data/third_party/abseil-cpp/absl/status/status_payload_printer.h +3 -2
- data/third_party/abseil-cpp/absl/status/statusor.h +117 -137
- data/third_party/abseil-cpp/absl/strings/ascii.h +10 -6
- data/third_party/abseil-cpp/absl/strings/cord.cc +41 -17
- data/third_party/abseil-cpp/absl/strings/cord.h +26 -17
- data/third_party/abseil-cpp/absl/strings/cord_buffer.h +4 -2
- data/third_party/abseil-cpp/absl/strings/escaping.cc +305 -125
- data/third_party/abseil-cpp/absl/strings/escaping.h +12 -2
- data/third_party/abseil-cpp/absl/strings/internal/append_and_overwrite.h +93 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +2 -2
- data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc +6 -6
- data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +27 -21
- data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +11 -19
- data/third_party/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.cc +6 -0
- data/third_party/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.h +1 -0
- data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +0 -141
- data/third_party/abseil-cpp/absl/strings/internal/escaping.h +2 -24
- data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +31 -36
- data/third_party/abseil-cpp/absl/strings/internal/stl_type_traits.h +39 -39
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -22
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +2 -2
- data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +2 -4
- data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +921 -231
- data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +18 -16
- data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +16 -12
- data/third_party/abseil-cpp/absl/strings/internal/stringify_sink.h +12 -0
- data/third_party/abseil-cpp/absl/strings/numbers.cc +477 -8
- data/third_party/abseil-cpp/absl/strings/numbers.h +29 -12
- data/third_party/abseil-cpp/absl/strings/resize_and_overwrite.h +198 -0
- data/third_party/abseil-cpp/absl/strings/str_cat.cc +96 -91
- data/third_party/abseil-cpp/absl/strings/str_cat.h +53 -13
- data/third_party/abseil-cpp/absl/strings/str_split.h +14 -9
- data/third_party/abseil-cpp/absl/strings/string_view.h +10 -716
- data/third_party/abseil-cpp/absl/strings/substitute.cc +24 -24
- data/third_party/abseil-cpp/absl/strings/substitute.h +2 -2
- data/third_party/abseil-cpp/absl/synchronization/barrier.cc +1 -1
- data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +2 -2
- data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +24 -3
- data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +30 -33
- data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -2
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +5 -0
- data/third_party/abseil-cpp/absl/synchronization/mutex.cc +41 -29
- data/third_party/abseil-cpp/absl/synchronization/mutex.h +199 -94
- data/third_party/abseil-cpp/absl/synchronization/notification.cc +5 -5
- data/third_party/abseil-cpp/absl/synchronization/notification.h +1 -1
- data/third_party/abseil-cpp/absl/time/clock.cc +29 -30
- data/third_party/abseil-cpp/absl/time/clock.h +3 -0
- data/third_party/abseil-cpp/absl/time/duration.cc +2 -2
- data/third_party/abseil-cpp/absl/time/format.cc +3 -10
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +12 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +131 -91
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +6 -103
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.cc +185 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.h +37 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +10 -15
- data/third_party/abseil-cpp/absl/time/time.cc +4 -4
- data/third_party/abseil-cpp/absl/time/time.h +14 -13
- data/third_party/abseil-cpp/absl/types/compare.h +64 -63
- data/third_party/abseil-cpp/absl/types/internal/span.h +6 -6
- data/third_party/abseil-cpp/absl/types/optional.h +31 -4
- data/third_party/abseil-cpp/absl/types/optional_ref.h +295 -0
- data/third_party/{boringssl-with-bazel/crypto/x509/x_val.cc → abseil-cpp/absl/types/source_location.cc} +4 -14
- data/third_party/abseil-cpp/absl/types/source_location.h +172 -0
- data/third_party/abseil-cpp/absl/types/span.h +67 -38
- data/third_party/abseil-cpp/absl/types/variant.h +75 -18
- data/third_party/abseil-cpp/absl/utility/utility.h +112 -16
- data/third_party/boringssl-with-bazel/crypto/aes/aes.cc +3 -0
- data/third_party/boringssl-with-bazel/crypto/armv8_feature_parsing.h +67 -0
- data/third_party/boringssl-with-bazel/crypto/asn1/a_bitstr.cc +143 -105
- data/third_party/boringssl-with-bazel/crypto/asn1/a_bool.cc +5 -8
- data/third_party/boringssl-with-bazel/crypto/asn1/a_d2i_fp.cc +3 -3
- data/third_party/boringssl-with-bazel/crypto/asn1/a_dup.cc +6 -6
- data/third_party/boringssl-with-bazel/crypto/asn1/a_gentm.cc +33 -12
- data/third_party/boringssl-with-bazel/crypto/asn1/a_i2d_fp.cc +7 -6
- data/third_party/boringssl-with-bazel/crypto/asn1/a_int.cc +80 -52
- data/third_party/boringssl-with-bazel/crypto/asn1/a_mbstr.cc +7 -4
- data/third_party/boringssl-with-bazel/crypto/asn1/a_object.cc +70 -72
- data/third_party/boringssl-with-bazel/crypto/asn1/a_strex.cc +38 -42
- data/third_party/boringssl-with-bazel/crypto/asn1/a_strnid.cc +41 -39
- data/third_party/boringssl-with-bazel/crypto/asn1/a_time.cc +59 -35
- data/third_party/boringssl-with-bazel/crypto/asn1/a_type.cc +275 -15
- data/third_party/boringssl-with-bazel/crypto/asn1/a_utctm.cc +32 -13
- data/third_party/boringssl-with-bazel/crypto/asn1/asn1_lib.cc +128 -30
- data/third_party/boringssl-with-bazel/crypto/asn1/asn_pack.cc +10 -10
- data/third_party/boringssl-with-bazel/crypto/asn1/f_int.cc +1 -1
- data/third_party/boringssl-with-bazel/crypto/asn1/f_string.cc +1 -1
- data/third_party/boringssl-with-bazel/crypto/asn1/internal.h +261 -115
- data/third_party/boringssl-with-bazel/crypto/asn1/posix_time.cc +8 -5
- data/third_party/boringssl-with-bazel/crypto/asn1/tasn_dec.cc +373 -725
- data/third_party/boringssl-with-bazel/crypto/asn1/tasn_enc.cc +211 -526
- data/third_party/boringssl-with-bazel/crypto/asn1/tasn_fre.cc +22 -19
- data/third_party/boringssl-with-bazel/crypto/asn1/tasn_new.cc +26 -24
- data/third_party/boringssl-with-bazel/crypto/asn1/tasn_typ.cc +19 -5
- data/third_party/boringssl-with-bazel/crypto/asn1/tasn_utl.cc +47 -51
- data/third_party/boringssl-with-bazel/crypto/base64/base64.cc +14 -15
- data/third_party/boringssl-with-bazel/crypto/bcm_support.h +7 -29
- data/third_party/boringssl-with-bazel/crypto/bio/bio.cc +234 -176
- data/third_party/boringssl-with-bazel/crypto/bio/bio_mem.cc +72 -86
- data/third_party/boringssl-with-bazel/crypto/bio/connect.cc +153 -199
- data/third_party/boringssl-with-bazel/crypto/bio/errno.cc +3 -1
- data/third_party/boringssl-with-bazel/crypto/bio/fd.cc +56 -55
- data/third_party/boringssl-with-bazel/crypto/bio/file.cc +70 -78
- data/third_party/boringssl-with-bazel/crypto/bio/hexdump.cc +6 -4
- data/third_party/boringssl-with-bazel/crypto/bio/internal.h +69 -17
- data/third_party/boringssl-with-bazel/crypto/bio/pair.cc +117 -136
- data/third_party/boringssl-with-bazel/crypto/bio/printf.cc +1 -1
- data/third_party/boringssl-with-bazel/crypto/bio/socket.cc +116 -50
- data/third_party/boringssl-with-bazel/crypto/bio/socket_helper.cc +53 -5
- data/third_party/boringssl-with-bazel/crypto/blake2/blake2.cc +9 -5
- data/third_party/boringssl-with-bazel/crypto/bn/bn_asn1.cc +2 -2
- data/third_party/boringssl-with-bazel/crypto/bn/convert.cc +56 -70
- data/third_party/boringssl-with-bazel/crypto/bn/div.cc +102 -0
- data/third_party/boringssl-with-bazel/crypto/bn/exponentiation.cc +26 -42
- data/third_party/boringssl-with-bazel/crypto/bn/sqrt.cc +93 -0
- data/third_party/boringssl-with-bazel/crypto/buf/buf.cc +6 -5
- data/third_party/boringssl-with-bazel/crypto/bytestring/asn1_compat.cc +6 -5
- data/third_party/boringssl-with-bazel/crypto/bytestring/ber.cc +22 -20
- data/third_party/boringssl-with-bazel/crypto/bytestring/cbb.cc +119 -59
- data/third_party/boringssl-with-bazel/crypto/bytestring/cbs.cc +115 -31
- data/third_party/boringssl-with-bazel/crypto/bytestring/internal.h +79 -24
- data/third_party/boringssl-with-bazel/crypto/bytestring/unicode.cc +2 -2
- data/third_party/boringssl-with-bazel/crypto/chacha/chacha.cc +5 -3
- data/third_party/boringssl-with-bazel/crypto/chacha/internal.h +23 -22
- data/third_party/boringssl-with-bazel/crypto/cipher/derive_key.cc +14 -18
- data/third_party/boringssl-with-bazel/crypto/cipher/e_aesctrhmac.cc +73 -58
- data/third_party/boringssl-with-bazel/crypto/cipher/e_aeseax.cc +132 -70
- data/third_party/boringssl-with-bazel/crypto/cipher/e_aesgcmsiv.cc +390 -249
- data/third_party/boringssl-with-bazel/crypto/cipher/e_chacha20poly1305.cc +200 -137
- data/third_party/boringssl-with-bazel/crypto/cipher/e_des.cc +45 -29
- data/third_party/boringssl-with-bazel/crypto/cipher/e_null.cc +9 -5
- data/third_party/boringssl-with-bazel/crypto/cipher/e_rc2.cc +43 -28
- data/third_party/boringssl-with-bazel/crypto/cipher/e_rc4.cc +7 -5
- data/third_party/boringssl-with-bazel/crypto/cipher/e_tls.cc +250 -237
- data/third_party/boringssl-with-bazel/crypto/cipher/get_cipher.cc +12 -12
- data/third_party/boringssl-with-bazel/crypto/cipher/internal.h +59 -59
- data/third_party/boringssl-with-bazel/crypto/cipher/tls_cbc.cc +111 -111
- data/third_party/boringssl-with-bazel/crypto/cms/cms.cc +48 -42
- data/third_party/boringssl-with-bazel/crypto/conf/conf.cc +69 -63
- data/third_party/boringssl-with-bazel/crypto/conf/internal.h +11 -12
- data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_apple.cc +8 -5
- data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_fuchsia.cc +6 -1
- data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_linux.cc +7 -1
- data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_openbsd.cc +7 -21
- data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_sysreg.cc +15 -41
- data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_win.cc +16 -3
- data/third_party/boringssl-with-bazel/crypto/cpu_arm_freebsd.cc +4 -2
- data/third_party/boringssl-with-bazel/crypto/cpu_arm_linux.cc +54 -31
- data/third_party/boringssl-with-bazel/crypto/cpu_arm_linux.h +79 -101
- data/third_party/boringssl-with-bazel/crypto/cpu_intel.cc +51 -45
- data/third_party/boringssl-with-bazel/crypto/crypto.cc +26 -55
- data/third_party/boringssl-with-bazel/crypto/curve25519/curve25519.cc +28 -25
- data/third_party/boringssl-with-bazel/crypto/curve25519/curve25519_tables.h +6 -6
- data/third_party/boringssl-with-bazel/crypto/curve25519/internal.h +14 -15
- data/third_party/boringssl-with-bazel/crypto/curve25519/spake25519.cc +23 -20
- data/third_party/boringssl-with-bazel/crypto/des/des.cc +27 -19
- data/third_party/boringssl-with-bazel/crypto/des/internal.h +4 -9
- data/third_party/boringssl-with-bazel/crypto/dh/dh_asn1.cc +34 -49
- data/third_party/boringssl-with-bazel/crypto/dh/params.cc +44 -41
- data/third_party/boringssl-with-bazel/crypto/digest/digest_extra.cc +87 -40
- data/third_party/boringssl-with-bazel/crypto/dsa/dsa.cc +237 -260
- data/third_party/boringssl-with-bazel/crypto/dsa/dsa_asn1.cc +100 -173
- data/third_party/boringssl-with-bazel/crypto/dsa/internal.h +23 -21
- data/third_party/boringssl-with-bazel/crypto/ec/ec_asn1.cc +181 -209
- data/third_party/boringssl-with-bazel/crypto/ec/ec_derive.cc +26 -28
- data/third_party/boringssl-with-bazel/crypto/ec/hash_to_curve.cc +265 -174
- data/third_party/boringssl-with-bazel/crypto/ec/internal.h +54 -18
- data/third_party/boringssl-with-bazel/crypto/ecdh/ecdh.cc +7 -5
- data/third_party/boringssl-with-bazel/crypto/ecdsa/ecdsa_asn1.cc +50 -70
- data/third_party/boringssl-with-bazel/crypto/ecdsa/ecdsa_p1363.cc +54 -0
- data/third_party/boringssl-with-bazel/crypto/engine/engine.cc +7 -7
- data/third_party/boringssl-with-bazel/crypto/err/err.cc +116 -105
- data/third_party/boringssl-with-bazel/crypto/err/internal.h +8 -21
- data/third_party/boringssl-with-bazel/crypto/evp/evp.cc +238 -166
- data/third_party/boringssl-with-bazel/crypto/evp/evp_asn1.cc +202 -234
- data/third_party/boringssl-with-bazel/crypto/evp/evp_ctx.cc +260 -159
- data/third_party/boringssl-with-bazel/crypto/evp/evp_kem.cc +82 -0
- data/third_party/boringssl-with-bazel/crypto/evp/internal.h +292 -137
- data/third_party/boringssl-with-bazel/crypto/evp/p_dh.cc +198 -25
- data/third_party/boringssl-with-bazel/crypto/evp/p_dsa.cc +333 -0
- data/third_party/boringssl-with-bazel/crypto/evp/p_ec.cc +427 -42
- data/third_party/boringssl-with-bazel/crypto/evp/p_ed25519.cc +270 -14
- data/third_party/boringssl-with-bazel/crypto/evp/p_hkdf.cc +70 -102
- data/third_party/boringssl-with-bazel/crypto/evp/p_mldsa.cc +549 -0
- data/third_party/boringssl-with-bazel/crypto/evp/p_mlkem.cc +485 -0
- data/third_party/boringssl-with-bazel/crypto/evp/p_rsa.cc +666 -158
- data/third_party/boringssl-with-bazel/crypto/evp/p_x25519.cc +290 -28
- data/third_party/boringssl-with-bazel/crypto/evp/p_xwing.cc +273 -0
- data/third_party/boringssl-with-bazel/crypto/evp/pbkdf.cc +14 -7
- data/third_party/boringssl-with-bazel/crypto/evp/print.cc +34 -89
- data/third_party/boringssl-with-bazel/crypto/evp/scrypt.cc +23 -21
- data/third_party/boringssl-with-bazel/crypto/evp/sign.cc +23 -42
- data/third_party/boringssl-with-bazel/crypto/ex_data.cc +40 -41
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/aes.cc.inc +34 -28
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/aes_nohw.cc.inc +119 -121
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/cbc.cc.inc +16 -14
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/cfb.cc.inc +12 -10
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/ctr.cc.inc +7 -5
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/gcm.cc.inc +39 -29
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/gcm_nohw.cc.inc +15 -13
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/internal.h +193 -177
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/key_wrap.cc.inc +5 -3
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/mode_wrappers.cc.inc +7 -3
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/ofb.cc.inc +7 -5
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bcm.cc +24 -19
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bcm_interface.h +512 -384
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/add.cc.inc +7 -5
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/asm/x86_64-gcc.cc.inc +63 -44
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/bn.cc.inc +40 -37
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/bytes.cc.inc +27 -22
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/cmp.cc.inc +9 -7
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/ctx.cc.inc +62 -126
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/div.cc.inc +92 -167
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/div_extra.cc.inc +15 -12
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/exponentiation.cc.inc +96 -93
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/gcd.cc.inc +73 -92
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/gcd_extra.cc.inc +59 -71
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/generic.cc.inc +54 -57
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/internal.h +333 -255
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/jacobi.cc.inc +12 -19
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/montgomery.cc.inc +80 -95
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/montgomery_inv.cc.inc +53 -96
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/mul.cc.inc +58 -419
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/prime.cc.inc +164 -213
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/random.cc.inc +27 -26
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/rsaz_exp.cc.inc +12 -10
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/rsaz_exp.h +47 -49
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/shift.cc.inc +14 -17
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/sqrt.cc.inc +19 -108
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/cipher/aead.cc.inc +427 -105
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/cipher/cipher.cc.inc +412 -212
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/cipher/e_aes.cc.inc +230 -225
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/cipher/e_aesccm.cc.inc +115 -84
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/cipher/internal.h +374 -27
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/cmac/cmac.cc.inc +28 -23
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/delocate.h +36 -40
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/dh/check.cc.inc +68 -78
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/dh/dh.cc.inc +154 -196
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/dh/internal.h +24 -24
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/digest/digest.cc.inc +40 -69
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/digest/digests.cc.inc +13 -7
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/digest/internal.h +13 -11
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/digest/md32_common.h +86 -81
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/digestsign/digestsign.cc.inc +38 -34
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/ec.cc.inc +187 -196
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/ec_key.cc.inc +196 -154
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/ec_montgomery.cc.inc +65 -125
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/felem.cc.inc +85 -22
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/internal.h +281 -287
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/oct.cc.inc +23 -22
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/p256.cc.inc +514 -573
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/p256_internal.h +193 -0
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/scalar.cc.inc +44 -39
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/simple.cc.inc +58 -90
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/simple_mul.cc.inc +39 -34
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/util.cc.inc +6 -3
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/wnaf.cc.inc +23 -20
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ecdh/ecdh.cc.inc +6 -3
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ecdsa/ecdsa.cc.inc +47 -37
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ecdsa/internal.h +5 -10
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/entropy/internal.h +38 -0
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/entropy/jitter.cc.inc +463 -0
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/entropy/sha512.cc.inc +329 -0
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/hkdf/hkdf.cc.inc +8 -6
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/hmac/hmac.cc.inc +19 -16
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/keccak/internal.h +41 -15
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/keccak/keccak.cc.inc +172 -44
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/mldsa/fips_known_values.inc +5 -5
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/mldsa/mldsa.cc.inc +1632 -766
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/mlkem/fips_known_values.inc +5 -5
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/mlkem/mlkem.cc.inc +740 -436
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/rand/android_entropy_client.cc.inc +82 -0
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/rand/ctrdrbg.cc.inc +240 -53
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/rand/internal.h +41 -26
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/rand/rand.cc.inc +221 -218
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/rsa/internal.h +64 -67
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/rsa/padding.cc.inc +49 -57
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/rsa/rsa.cc.inc +247 -234
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/rsa/rsa_impl.cc.inc +392 -692
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/self_check/fips.cc.inc +10 -10
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/self_check/self_check.cc.inc +479 -449
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/service_indicator/internal.h +34 -11
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/service_indicator/service_indicator.cc.inc +46 -43
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/sha/internal.h +61 -70
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/sha/sha1.cc.inc +27 -13
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/sha/sha256.cc.inc +46 -30
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/sha/sha512.cc.inc +47 -47
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/address.h +98 -73
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/fors.cc.inc +108 -98
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/fors.h +14 -24
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/merkle.cc.inc +94 -91
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/merkle.h +19 -31
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/params.h +156 -56
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/slhdsa.cc.inc +318 -132
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/thash.cc.inc +234 -81
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/thash.h +20 -34
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/wots.cc.inc +97 -96
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/wots.h +10 -20
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/tls/internal.h +2 -16
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/tls/kdf.cc.inc +26 -26
- data/third_party/boringssl-with-bazel/crypto/fuzzer_mode.cc +5 -5
- data/third_party/boringssl-with-bazel/crypto/hpke/hpke.cc +461 -97
- data/third_party/boringssl-with-bazel/crypto/hrss/hrss.cc +153 -149
- data/third_party/boringssl-with-bazel/crypto/hrss/internal.h +9 -13
- data/third_party/boringssl-with-bazel/crypto/internal.h +531 -394
- data/third_party/boringssl-with-bazel/crypto/kyber/internal.h +117 -12
- data/third_party/boringssl-with-bazel/crypto/kyber/kyber.cc +59 -58
- data/third_party/boringssl-with-bazel/crypto/lhash/internal.h +38 -37
- data/third_party/boringssl-with-bazel/crypto/lhash/lhash.cc +68 -65
- data/third_party/boringssl-with-bazel/crypto/md4/md4.cc +19 -6
- data/third_party/boringssl-with-bazel/crypto/md5/internal.h +6 -9
- data/third_party/boringssl-with-bazel/crypto/md5/md5.cc +18 -6
- data/third_party/boringssl-with-bazel/crypto/mem.cc +61 -65
- data/third_party/boringssl-with-bazel/crypto/mem_internal.h +671 -0
- data/third_party/boringssl-with-bazel/crypto/mldsa/mldsa.cc +238 -32
- data/third_party/boringssl-with-bazel/crypto/mlkem/mlkem.cc +21 -65
- data/third_party/boringssl-with-bazel/crypto/obj/obj.cc +132 -157
- data/third_party/boringssl-with-bazel/crypto/obj/obj_dat.h +79 -1
- data/third_party/boringssl-with-bazel/crypto/obj/obj_xref.cc +14 -11
- data/third_party/boringssl-with-bazel/crypto/params_internal.h +30 -0
- data/third_party/boringssl-with-bazel/crypto/pem/internal.h +20 -15
- data/third_party/boringssl-with-bazel/crypto/pem/pem_all.cc +20 -19
- data/third_party/boringssl-with-bazel/crypto/pem/pem_info.cc +72 -76
- data/third_party/boringssl-with-bazel/crypto/pem/pem_lib.cc +215 -217
- data/third_party/boringssl-with-bazel/crypto/pem/pem_oth.cc +6 -6
- data/third_party/boringssl-with-bazel/crypto/pem/pem_pk8.cc +13 -13
- data/third_party/boringssl-with-bazel/crypto/pem/pem_pkey.cc +11 -11
- data/third_party/boringssl-with-bazel/crypto/pkcs7/internal.h +12 -17
- data/third_party/boringssl-with-bazel/crypto/pkcs7/pkcs7.cc +29 -27
- data/third_party/boringssl-with-bazel/crypto/pkcs7/pkcs7_x509.cc +55 -49
- data/third_party/boringssl-with-bazel/crypto/pkcs8/internal.h +21 -26
- data/third_party/boringssl-with-bazel/crypto/pkcs8/p5_pbev2.cc +33 -31
- data/third_party/boringssl-with-bazel/crypto/pkcs8/pkcs8.cc +73 -81
- data/third_party/boringssl-with-bazel/crypto/pkcs8/pkcs8_x509.cc +139 -138
- data/third_party/boringssl-with-bazel/crypto/poly1305/internal.h +3 -7
- data/third_party/boringssl-with-bazel/crypto/poly1305/poly1305.cc +5 -4
- data/third_party/boringssl-with-bazel/crypto/poly1305/poly1305_arm.cc +43 -47
- data/third_party/boringssl-with-bazel/crypto/poly1305/poly1305_vec.cc +29 -26
- data/third_party/boringssl-with-bazel/crypto/pool/internal.h +64 -20
- data/third_party/boringssl-with-bazel/crypto/pool/pool.cc +177 -157
- data/third_party/boringssl-with-bazel/crypto/rand/deterministic.cc +9 -16
- data/third_party/boringssl-with-bazel/crypto/rand/fork_detect.cc +70 -42
- data/third_party/boringssl-with-bazel/crypto/rand/forkunsafe.cc +7 -7
- data/third_party/boringssl-with-bazel/crypto/rand/getentropy.cc +6 -13
- data/third_party/boringssl-with-bazel/crypto/rand/internal.h +16 -4
- data/third_party/boringssl-with-bazel/crypto/rand/ios.cc +4 -11
- data/third_party/boringssl-with-bazel/crypto/rand/rand.cc +11 -9
- data/third_party/boringssl-with-bazel/crypto/rand/trusty.cc +4 -11
- data/third_party/boringssl-with-bazel/crypto/rand/urandom.cc +16 -195
- data/third_party/boringssl-with-bazel/crypto/rand/windows.cc +12 -19
- data/third_party/boringssl-with-bazel/crypto/refcount.cc +7 -17
- data/third_party/boringssl-with-bazel/crypto/rsa/internal.h +22 -7
- data/third_party/boringssl-with-bazel/crypto/rsa/rsa_asn1.cc +199 -78
- data/third_party/boringssl-with-bazel/crypto/rsa/rsa_crypt.cc +49 -50
- data/third_party/boringssl-with-bazel/crypto/rsa/rsa_extra.cc +11 -0
- data/third_party/boringssl-with-bazel/crypto/rsa/rsa_print.cc +4 -6
- data/third_party/boringssl-with-bazel/crypto/sha/sha1.cc +3 -0
- data/third_party/boringssl-with-bazel/crypto/sha/sha256.cc +3 -1
- data/third_party/boringssl-with-bazel/crypto/sha/sha512.cc +6 -4
- data/third_party/boringssl-with-bazel/crypto/siphash/siphash.cc +2 -0
- data/third_party/boringssl-with-bazel/crypto/slhdsa/slhdsa.cc +43 -6
- data/third_party/boringssl-with-bazel/crypto/spake2plus/internal.h +31 -31
- data/third_party/boringssl-with-bazel/crypto/spake2plus/spake2plus.cc +1 -1
- data/third_party/boringssl-with-bazel/crypto/stack/stack.cc +89 -130
- data/third_party/boringssl-with-bazel/crypto/thread.cc +14 -14
- data/third_party/boringssl-with-bazel/crypto/thread_none.cc +10 -13
- data/third_party/boringssl-with-bazel/crypto/thread_pthread.cc +22 -35
- data/third_party/boringssl-with-bazel/crypto/thread_win.cc +29 -40
- data/third_party/boringssl-with-bazel/crypto/trust_token/internal.h +81 -88
- data/third_party/boringssl-with-bazel/crypto/trust_token/pmbtoken.cc +160 -144
- data/third_party/boringssl-with-bazel/crypto/trust_token/trust_token.cc +96 -80
- data/third_party/boringssl-with-bazel/crypto/trust_token/voprf.cc +90 -87
- data/third_party/boringssl-with-bazel/crypto/x509/a_digest.cc +5 -5
- data/third_party/boringssl-with-bazel/crypto/x509/a_sign.cc +51 -48
- data/third_party/boringssl-with-bazel/crypto/x509/a_verify.cc +30 -34
- data/third_party/boringssl-with-bazel/crypto/x509/algorithm.cc +47 -16
- data/third_party/boringssl-with-bazel/crypto/x509/asn1_gen.cc +41 -43
- data/third_party/boringssl-with-bazel/crypto/x509/by_dir.cc +183 -237
- data/third_party/boringssl-with-bazel/crypto/x509/by_file.cc +29 -30
- data/third_party/boringssl-with-bazel/crypto/x509/internal.h +276 -180
- data/third_party/boringssl-with-bazel/crypto/x509/name_print.cc +15 -13
- data/third_party/boringssl-with-bazel/crypto/x509/policy.cc +415 -525
- data/third_party/boringssl-with-bazel/crypto/x509/rsa_pss.cc +94 -271
- data/third_party/boringssl-with-bazel/crypto/x509/t_crl.cc +11 -8
- data/third_party/boringssl-with-bazel/crypto/x509/t_req.cc +26 -23
- data/third_party/boringssl-with-bazel/crypto/x509/t_x509.cc +26 -22
- data/third_party/boringssl-with-bazel/crypto/x509/t_x509a.cc +3 -1
- data/third_party/boringssl-with-bazel/crypto/x509/v3_akey.cc +69 -76
- data/third_party/boringssl-with-bazel/crypto/x509/v3_akeya.cc +2 -2
- data/third_party/boringssl-with-bazel/crypto/x509/v3_alt.cc +112 -69
- data/third_party/boringssl-with-bazel/crypto/x509/v3_bcons.cc +15 -14
- data/third_party/boringssl-with-bazel/crypto/x509/v3_bitst.cc +16 -18
- data/third_party/boringssl-with-bazel/crypto/x509/v3_conf.cc +62 -67
- data/third_party/boringssl-with-bazel/crypto/x509/v3_cpols.cc +143 -170
- data/third_party/boringssl-with-bazel/crypto/x509/v3_crld.cc +121 -165
- data/third_party/boringssl-with-bazel/crypto/x509/v3_enum.cc +13 -12
- data/third_party/boringssl-with-bazel/crypto/x509/v3_extku.cc +17 -34
- data/third_party/boringssl-with-bazel/crypto/x509/v3_genn.cc +20 -10
- data/third_party/boringssl-with-bazel/crypto/x509/v3_ia5.cc +22 -18
- data/third_party/boringssl-with-bazel/crypto/x509/v3_info.cc +45 -47
- data/third_party/boringssl-with-bazel/crypto/x509/v3_int.cc +35 -33
- data/third_party/boringssl-with-bazel/crypto/x509/v3_lib.cc +106 -61
- data/third_party/boringssl-with-bazel/crypto/x509/v3_ncons.cc +642 -358
- data/third_party/boringssl-with-bazel/crypto/x509/v3_ocsp.cc +25 -22
- data/third_party/boringssl-with-bazel/crypto/x509/v3_pcons.cc +15 -14
- data/third_party/boringssl-with-bazel/crypto/x509/v3_pmaps.cc +16 -15
- data/third_party/boringssl-with-bazel/crypto/x509/v3_prn.cc +6 -6
- data/third_party/boringssl-with-bazel/crypto/x509/v3_purp.cc +150 -137
- data/third_party/boringssl-with-bazel/crypto/x509/v3_skey.cc +23 -26
- data/third_party/boringssl-with-bazel/crypto/x509/v3_utl.cc +151 -178
- data/third_party/boringssl-with-bazel/crypto/x509/x509.cc +1 -1
- data/third_party/boringssl-with-bazel/crypto/x509/x509_att.cc +32 -30
- data/third_party/boringssl-with-bazel/crypto/x509/x509_cmp.cc +95 -88
- data/third_party/boringssl-with-bazel/crypto/x509/x509_d2.cc +9 -9
- data/third_party/boringssl-with-bazel/crypto/x509/x509_def.cc +6 -8
- data/third_party/boringssl-with-bazel/crypto/x509/x509_ext.cc +46 -24
- data/third_party/boringssl-with-bazel/crypto/x509/x509_lu.cc +211 -195
- data/third_party/boringssl-with-bazel/crypto/x509/x509_obj.cc +20 -16
- data/third_party/boringssl-with-bazel/crypto/x509/x509_req.cc +37 -46
- data/third_party/boringssl-with-bazel/crypto/x509/x509_set.cc +62 -90
- data/third_party/boringssl-with-bazel/crypto/x509/x509_trs.cc +18 -13
- data/third_party/boringssl-with-bazel/crypto/x509/x509_v3.cc +33 -33
- data/third_party/boringssl-with-bazel/crypto/x509/x509_vfy.cc +109 -110
- data/third_party/boringssl-with-bazel/crypto/x509/x509_vpm.cc +56 -47
- data/third_party/boringssl-with-bazel/crypto/x509/x509cset.cc +27 -40
- data/third_party/boringssl-with-bazel/crypto/x509/x509name.cc +77 -67
- data/third_party/boringssl-with-bazel/crypto/x509/x509rset.cc +5 -17
- data/third_party/boringssl-with-bazel/crypto/x509/x509spki.cc +13 -13
- data/third_party/boringssl-with-bazel/crypto/x509/x_algor.cc +131 -24
- data/third_party/boringssl-with-bazel/crypto/x509/x_all.cc +72 -39
- data/third_party/boringssl-with-bazel/crypto/x509/x_attrib.cc +10 -4
- data/third_party/boringssl-with-bazel/crypto/x509/x_crl.cc +77 -44
- data/third_party/boringssl-with-bazel/crypto/x509/x_exten.cc +6 -0
- data/third_party/boringssl-with-bazel/crypto/x509/x_name.cc +311 -383
- data/third_party/boringssl-with-bazel/crypto/x509/x_pubkey.cc +129 -82
- data/third_party/boringssl-with-bazel/crypto/x509/x_req.cc +11 -6
- data/third_party/boringssl-with-bazel/crypto/x509/x_sig.cc +4 -4
- data/third_party/boringssl-with-bazel/crypto/x509/x_spki.cc +11 -1
- data/third_party/boringssl-with-bazel/crypto/x509/x_x509.cc +285 -280
- data/third_party/boringssl-with-bazel/crypto/x509/x_x509a.cc +60 -60
- data/third_party/boringssl-with-bazel/crypto/xwing/xwing.cc +257 -0
- data/third_party/boringssl-with-bazel/gen/boringssl_prefix_symbols_internal_x86_64_win_asm.inc +301 -0
- data/third_party/boringssl-with-bazel/gen/boringssl_prefix_symbols_internal_x86_win_asm.inc +301 -0
- data/third_party/boringssl-with-bazel/gen/crypto/err_data.cc +526 -500
- data/third_party/boringssl-with-bazel/include/openssl/aead.h +286 -114
- data/third_party/boringssl-with-bazel/include/openssl/aes.h +43 -43
- data/third_party/boringssl-with-bazel/include/openssl/asm_base.h +29 -16
- data/third_party/boringssl-with-bazel/include/openssl/asn1.h +641 -631
- data/third_party/boringssl-with-bazel/include/openssl/asn1t.h +7 -9
- data/third_party/boringssl-with-bazel/include/openssl/base.h +34 -54
- data/third_party/boringssl-with-bazel/include/openssl/base64.h +30 -30
- data/third_party/boringssl-with-bazel/include/openssl/bio.h +373 -316
- data/third_party/boringssl-with-bazel/include/openssl/blake2.h +15 -11
- data/third_party/boringssl-with-bazel/include/openssl/blowfish.h +10 -3
- data/third_party/boringssl-with-bazel/include/openssl/bn.h +298 -306
- data/third_party/boringssl-with-bazel/include/openssl/buf.h +14 -14
- data/third_party/boringssl-with-bazel/include/openssl/bytestring.h +272 -207
- data/third_party/boringssl-with-bazel/include/openssl/cast.h +45 -8
- data/third_party/boringssl-with-bazel/include/openssl/chacha.h +3 -3
- data/third_party/boringssl-with-bazel/include/openssl/cipher.h +334 -152
- data/third_party/boringssl-with-bazel/include/openssl/cmac.h +13 -13
- data/third_party/boringssl-with-bazel/include/openssl/cms.h +35 -34
- data/third_party/boringssl-with-bazel/include/openssl/conf.h +15 -14
- data/third_party/boringssl-with-bazel/include/openssl/crypto.h +15 -13
- data/third_party/boringssl-with-bazel/include/openssl/ctrdrbg.h +49 -15
- data/third_party/boringssl-with-bazel/include/openssl/curve25519.h +24 -24
- data/third_party/boringssl-with-bazel/include/openssl/des.h +22 -16
- data/third_party/boringssl-with-bazel/include/openssl/dh.h +95 -95
- data/third_party/boringssl-with-bazel/include/openssl/digest.h +140 -71
- data/third_party/boringssl-with-bazel/include/openssl/dsa.h +101 -101
- data/third_party/boringssl-with-bazel/include/openssl/ec.h +143 -119
- data/third_party/boringssl-with-bazel/include/openssl/ec_key.h +97 -97
- data/third_party/boringssl-with-bazel/include/openssl/ecdh.h +9 -9
- data/third_party/boringssl-with-bazel/include/openssl/ecdsa.h +89 -46
- data/third_party/boringssl-with-bazel/include/openssl/engine.h +5 -5
- data/third_party/boringssl-with-bazel/include/openssl/err.h +73 -71
- data/third_party/boringssl-with-bazel/include/openssl/evp.h +824 -344
- data/third_party/boringssl-with-bazel/include/openssl/evp_errors.h +9 -2
- data/third_party/boringssl-with-bazel/include/openssl/ex_data.h +27 -32
- data/third_party/boringssl-with-bazel/include/openssl/hkdf.h +6 -6
- data/third_party/boringssl-with-bazel/include/openssl/hmac.h +31 -31
- data/third_party/boringssl-with-bazel/include/openssl/hpke.h +133 -117
- data/third_party/boringssl-with-bazel/include/openssl/hrss.h +14 -8
- data/third_party/boringssl-with-bazel/include/openssl/kdf.h +20 -19
- data/third_party/boringssl-with-bazel/include/openssl/lhash.h +4 -25
- data/third_party/boringssl-with-bazel/include/openssl/md4.h +14 -7
- data/third_party/boringssl-with-bazel/include/openssl/md5.h +7 -7
- data/third_party/boringssl-with-bazel/include/openssl/mem.h +38 -38
- data/third_party/boringssl-with-bazel/include/openssl/mldsa.h +380 -24
- data/third_party/boringssl-with-bazel/include/openssl/mlkem.h +43 -43
- data/third_party/boringssl-with-bazel/include/openssl/nid.h +1297 -2
- data/third_party/boringssl-with-bazel/include/openssl/obj.h +49 -49
- data/third_party/boringssl-with-bazel/include/openssl/opensslconf.h +30 -0
- data/third_party/boringssl-with-bazel/include/openssl/params.h +42 -0
- data/third_party/boringssl-with-bazel/include/openssl/pem.h +39 -30
- data/third_party/boringssl-with-bazel/include/openssl/pkcs7.h +40 -40
- data/third_party/boringssl-with-bazel/include/openssl/pkcs8.h +69 -63
- data/third_party/boringssl-with-bazel/include/openssl/poly1305.h +8 -5
- data/third_party/boringssl-with-bazel/include/openssl/pool.h +54 -25
- data/third_party/boringssl-with-bazel/include/openssl/posix_time.h +6 -6
- data/third_party/boringssl-with-bazel/include/openssl/prefix_symbols.h +7866 -0
- data/third_party/boringssl-with-bazel/include/openssl/prefix_symbols_internal_S.h +585 -0
- data/third_party/boringssl-with-bazel/include/openssl/prefix_symbols_internal_c.h +305 -0
- data/third_party/boringssl-with-bazel/include/openssl/rand.h +18 -18
- data/third_party/boringssl-with-bazel/include/openssl/rc4.h +4 -4
- data/third_party/boringssl-with-bazel/include/openssl/ripemd.h +15 -10
- data/third_party/boringssl-with-bazel/include/openssl/rsa.h +272 -235
- data/third_party/boringssl-with-bazel/include/openssl/service_indicator.h +4 -81
- data/third_party/boringssl-with-bazel/include/openssl/sha.h +43 -166
- data/third_party/boringssl-with-bazel/include/openssl/sha2.h +201 -0
- data/third_party/boringssl-with-bazel/include/openssl/slhdsa.h +100 -48
- data/third_party/boringssl-with-bazel/include/openssl/span.h +190 -75
- data/third_party/boringssl-with-bazel/include/openssl/ssl.h +2168 -1567
- data/third_party/boringssl-with-bazel/include/openssl/ssl3.h +11 -69
- data/third_party/boringssl-with-bazel/include/openssl/stack.h +135 -80
- data/third_party/boringssl-with-bazel/include/openssl/target.h +13 -1
- data/third_party/boringssl-with-bazel/include/openssl/thread.h +0 -10
- data/third_party/boringssl-with-bazel/include/openssl/tls1.h +31 -310
- data/third_party/boringssl-with-bazel/include/openssl/tls_prf.h +47 -0
- data/third_party/boringssl-with-bazel/include/openssl/trust_token.h +97 -92
- data/third_party/boringssl-with-bazel/include/openssl/type_check.h +1 -1
- data/third_party/boringssl-with-bazel/include/openssl/x509.h +1805 -1857
- data/third_party/boringssl-with-bazel/include/openssl/x509v3.h +1 -1
- data/third_party/boringssl-with-bazel/include/openssl/xwing.h +115 -0
- data/third_party/boringssl-with-bazel/ssl/bio_ssl.cc +24 -19
- data/third_party/boringssl-with-bazel/ssl/d1_both.cc +59 -57
- data/third_party/boringssl-with-bazel/ssl/d1_lib.cc +53 -42
- data/third_party/boringssl-with-bazel/ssl/d1_pkt.cc +4 -4
- data/third_party/boringssl-with-bazel/ssl/d1_srtp.cc +2 -2
- data/third_party/boringssl-with-bazel/ssl/dtls_method.cc +10 -10
- data/third_party/boringssl-with-bazel/ssl/dtls_record.cc +6 -6
- data/third_party/boringssl-with-bazel/ssl/encrypted_client_hello.cc +61 -71
- data/third_party/boringssl-with-bazel/ssl/extensions.cc +967 -366
- data/third_party/boringssl-with-bazel/ssl/handoff.cc +77 -38
- data/third_party/boringssl-with-bazel/ssl/handshake.cc +63 -30
- data/third_party/boringssl-with-bazel/ssl/handshake_client.cc +129 -85
- data/third_party/boringssl-with-bazel/ssl/handshake_server.cc +116 -68
- data/third_party/boringssl-with-bazel/ssl/internal.h +983 -1207
- data/third_party/boringssl-with-bazel/ssl/s3_both.cc +34 -29
- data/third_party/boringssl-with-bazel/ssl/s3_lib.cc +4 -3
- data/third_party/boringssl-with-bazel/ssl/s3_pkt.cc +12 -12
- data/third_party/boringssl-with-bazel/ssl/ssl_aead_ctx.cc +5 -5
- data/third_party/boringssl-with-bazel/ssl/ssl_asn1.cc +114 -59
- data/third_party/boringssl-with-bazel/ssl/ssl_buffer.cc +17 -18
- data/third_party/boringssl-with-bazel/ssl/ssl_cert.cc +99 -61
- data/third_party/boringssl-with-bazel/ssl/ssl_cipher.cc +143 -134
- data/third_party/boringssl-with-bazel/ssl/ssl_credential.cc +188 -90
- data/third_party/boringssl-with-bazel/ssl/ssl_file.cc +132 -225
- data/third_party/boringssl-with-bazel/ssl/ssl_key_share.cc +79 -7
- data/third_party/boringssl-with-bazel/ssl/ssl_lib.cc +698 -302
- data/third_party/boringssl-with-bazel/ssl/ssl_privkey.cc +102 -45
- data/third_party/boringssl-with-bazel/ssl/ssl_session.cc +117 -102
- data/third_party/boringssl-with-bazel/ssl/ssl_transcript.cc +3 -3
- data/third_party/boringssl-with-bazel/ssl/ssl_versions.cc +24 -24
- data/third_party/boringssl-with-bazel/ssl/ssl_x509.cc +184 -170
- data/third_party/boringssl-with-bazel/ssl/t1_enc.cc +12 -10
- data/third_party/boringssl-with-bazel/ssl/tls13_both.cc +86 -54
- data/third_party/boringssl-with-bazel/ssl/tls13_client.cc +176 -90
- data/third_party/boringssl-with-bazel/ssl/tls13_enc.cc +166 -112
- data/third_party/boringssl-with-bazel/ssl/tls13_server.cc +188 -97
- data/third_party/boringssl-with-bazel/ssl/tls_method.cc +23 -23
- data/third_party/boringssl-with-bazel/ssl/tls_record.cc +17 -14
- data/third_party/boringssl-with-bazel/third_party/fiat/bedrock_unverified_bareminimum.c.inc +47 -0
- data/third_party/boringssl-with-bazel/third_party/fiat/bedrock_unverified_platform.c.inc +137 -0
- data/third_party/boringssl-with-bazel/third_party/fiat/curve25519_64_adx.h +37 -33
- data/third_party/boringssl-with-bazel/third_party/fiat/p256_64.h +4 -93
- data/third_party/boringssl-with-bazel/third_party/fiat/p256_64_msvc.h +4 -69
- data/third_party/boringssl-with-bazel/third_party/fiat/p256_field_32.br.c.inc +71 -0
- data/third_party/boringssl-with-bazel/third_party/fiat/p256_field_64.br.c.inc +84 -0
- data/third_party/boringssl-with-bazel/third_party/fiat/p256_point.br.c.inc +166 -0
- metadata +77 -52
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +0 -240
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +0 -56
- data/src/core/ext/upb-gen/src/proto/grpc/health/v1/health.upb.h +0 -157
- data/src/core/ext/upb-gen/src/proto/grpc/health/v1/health.upb_minitable.c +0 -72
- data/src/core/ext/upbdefs-gen/src/proto/grpc/lookup/v1/rls_config.upbdefs.c +0 -181
- data/third_party/abseil-cpp/absl/base/internal/identity.h +0 -39
- data/third_party/abseil-cpp/absl/base/internal/nullability_deprecated.h +0 -106
- data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +0 -105
- data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.h +0 -50
- data/third_party/abseil-cpp/absl/strings/string_view.cc +0 -257
- data/third_party/boringssl-with-bazel/crypto/evp/p_dh_asn1.cc +0 -142
- data/third_party/boringssl-with-bazel/crypto/evp/p_dsa_asn1.cc +0 -279
- data/third_party/boringssl-with-bazel/crypto/evp/p_ec_asn1.cc +0 -286
- data/third_party/boringssl-with-bazel/crypto/evp/p_ed25519_asn1.cc +0 -225
- data/third_party/boringssl-with-bazel/crypto/evp/p_rsa_asn1.cc +0 -198
- data/third_party/boringssl-with-bazel/crypto/evp/p_x25519_asn1.cc +0 -237
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/p224-64.cc.inc +0 -1163
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/p256-nistz.cc.inc +0 -741
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/p256-nistz.h +0 -207
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/rsa/blinding.cc.inc +0 -147
- data/third_party/boringssl-with-bazel/crypto/rand/getrandom_fillin.h +0 -64
- data/third_party/boringssl-with-bazel/crypto/rand/passive.cc +0 -178
- data/third_party/boringssl-with-bazel/crypto/x509/ext_dat.h +0 -92
- data/third_party/boringssl-with-bazel/include/openssl/bcm_public.h +0 -82
- data/third_party/boringssl-with-bazel/include/openssl/experimental/kyber.h +0 -146
|
@@ -18,62 +18,67 @@
|
|
|
18
18
|
#include <limits.h>
|
|
19
19
|
#include <string.h>
|
|
20
20
|
|
|
21
|
+
#include <utility>
|
|
22
|
+
|
|
21
23
|
#include <openssl/bn.h>
|
|
22
24
|
#include <openssl/err.h>
|
|
23
25
|
#include <openssl/mem.h>
|
|
24
|
-
#include <openssl/thread.h>
|
|
25
26
|
|
|
26
27
|
#include "../../bcm_support.h"
|
|
27
28
|
#include "../../internal.h"
|
|
29
|
+
#include "../../mem_internal.h"
|
|
28
30
|
#include "../bn/internal.h"
|
|
29
31
|
#include "../delocate.h"
|
|
30
32
|
#include "../service_indicator/internal.h"
|
|
31
33
|
#include "internal.h"
|
|
32
34
|
|
|
33
35
|
|
|
36
|
+
using namespace bssl;
|
|
37
|
+
|
|
34
38
|
static_assert(OPENSSL_RSA_MAX_MODULUS_BITS <=
|
|
35
39
|
BN_MONTGOMERY_MAX_WORDS * BN_BITS2,
|
|
36
40
|
"Max RSA size too big for Montgomery arithmetic");
|
|
37
41
|
|
|
38
|
-
int rsa_check_public_key(const RSA *rsa) {
|
|
39
|
-
|
|
42
|
+
int bssl::rsa_check_public_key(const RSA *rsa) {
|
|
43
|
+
auto *impl = FromOpaque(rsa);
|
|
44
|
+
|
|
45
|
+
if (impl->n == nullptr) {
|
|
40
46
|
OPENSSL_PUT_ERROR(RSA, RSA_R_VALUE_MISSING);
|
|
41
47
|
return 0;
|
|
42
48
|
}
|
|
43
49
|
|
|
44
|
-
unsigned n_bits = BN_num_bits(
|
|
50
|
+
unsigned n_bits = BN_num_bits(impl->n.get());
|
|
45
51
|
if (n_bits > OPENSSL_RSA_MAX_MODULUS_BITS) {
|
|
46
52
|
OPENSSL_PUT_ERROR(RSA, RSA_R_MODULUS_TOO_LARGE);
|
|
47
53
|
return 0;
|
|
48
54
|
}
|
|
49
55
|
|
|
50
|
-
|
|
51
|
-
// in 1999.
|
|
52
|
-
if (n_bits < 512) {
|
|
56
|
+
if (n_bits < OPENSSL_RSA_MIN_MODULUS_BITS) {
|
|
53
57
|
OPENSSL_PUT_ERROR(RSA, RSA_R_KEY_SIZE_TOO_SMALL);
|
|
54
58
|
return 0;
|
|
55
59
|
}
|
|
56
60
|
|
|
57
61
|
// RSA moduli must be positive and odd. In addition to being necessary for RSA
|
|
58
62
|
// in general, we cannot setup Montgomery reduction with even moduli.
|
|
59
|
-
if (!BN_is_odd(
|
|
63
|
+
if (!BN_is_odd(impl->n.get()) || BN_is_negative(impl->n.get())) {
|
|
60
64
|
OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_RSA_PARAMETERS);
|
|
61
65
|
return 0;
|
|
62
66
|
}
|
|
63
67
|
|
|
64
68
|
static const unsigned kMaxExponentBits = 33;
|
|
65
|
-
if (
|
|
69
|
+
if (impl->e != nullptr) {
|
|
66
70
|
// Reject e = 1, negative e, and even e. e must be odd to be relatively
|
|
67
71
|
// prime with phi(n).
|
|
68
|
-
unsigned e_bits = BN_num_bits(
|
|
69
|
-
if (e_bits < 2 || BN_is_negative(
|
|
72
|
+
unsigned e_bits = BN_num_bits(impl->e.get());
|
|
73
|
+
if (e_bits < 2 || BN_is_negative(impl->e.get()) ||
|
|
74
|
+
!BN_is_odd(impl->e.get())) {
|
|
70
75
|
OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_E_VALUE);
|
|
71
76
|
return 0;
|
|
72
77
|
}
|
|
73
|
-
if (
|
|
78
|
+
if (impl->flags & RSA_FLAG_LARGE_PUBLIC_EXPONENT) {
|
|
74
79
|
// The caller has requested disabling DoS protections. Still, e must be
|
|
75
80
|
// less than n.
|
|
76
|
-
if (BN_ucmp(
|
|
81
|
+
if (BN_ucmp(impl->n.get(), impl->e.get()) <= 0) {
|
|
77
82
|
OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_E_VALUE);
|
|
78
83
|
return 0;
|
|
79
84
|
}
|
|
@@ -92,11 +97,11 @@ int rsa_check_public_key(const RSA *rsa) {
|
|
|
92
97
|
return 0;
|
|
93
98
|
}
|
|
94
99
|
|
|
95
|
-
// The upper bound on
|
|
100
|
+
// The upper bound on `e_bits` and lower bound on `n_bits` imply e is
|
|
96
101
|
// bounded by n.
|
|
97
|
-
assert(BN_ucmp(
|
|
102
|
+
assert(BN_ucmp(impl->n.get(), impl->e.get()) > 0);
|
|
98
103
|
}
|
|
99
|
-
} else if (!(
|
|
104
|
+
} else if (!(impl->flags & RSA_FLAG_NO_PUBLIC_EXPONENT)) {
|
|
100
105
|
OPENSSL_PUT_ERROR(RSA, RSA_R_VALUE_MISSING);
|
|
101
106
|
return 0;
|
|
102
107
|
}
|
|
@@ -104,290 +109,134 @@ int rsa_check_public_key(const RSA *rsa) {
|
|
|
104
109
|
return 1;
|
|
105
110
|
}
|
|
106
111
|
|
|
107
|
-
static int ensure_fixed_copy(BIGNUM
|
|
108
|
-
|
|
112
|
+
static int ensure_fixed_copy(UniquePtr<BIGNUM> *out, const BIGNUM *in,
|
|
113
|
+
int width) {
|
|
114
|
+
if (*out != nullptr) {
|
|
109
115
|
return 1;
|
|
110
116
|
}
|
|
111
|
-
BIGNUM
|
|
112
|
-
if (copy ==
|
|
113
|
-
BN_free(copy);
|
|
117
|
+
UniquePtr<BIGNUM> copy(BN_dup(in));
|
|
118
|
+
if (copy == nullptr || !bn_resize_words(copy.get(), width)) {
|
|
114
119
|
return 0;
|
|
115
120
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
121
|
+
bn_secret(copy.get());
|
|
122
|
+
*out = std::move(copy);
|
|
119
123
|
return 1;
|
|
120
124
|
}
|
|
121
125
|
|
|
122
|
-
// freeze_private_key finishes initializing
|
|
123
|
-
// After this function has returned,
|
|
124
|
-
// because
|
|
126
|
+
// freeze_private_key finishes initializing `rsa`'s private key components.
|
|
127
|
+
// After this function has returned, `rsa` may not be changed. This is needed
|
|
128
|
+
// because `RSA` is a public struct and, additionally, OpenSSL 1.1.0 opaquified
|
|
125
129
|
// it wrong (see https://github.com/openssl/openssl/issues/5158).
|
|
126
|
-
static int freeze_private_key(
|
|
127
|
-
|
|
130
|
+
static int freeze_private_key(RSAImpl *rsa, BN_CTX *ctx) {
|
|
131
|
+
rsa->lock.LockRead();
|
|
128
132
|
int frozen = rsa->private_key_frozen;
|
|
129
|
-
|
|
133
|
+
rsa->lock.UnlockRead();
|
|
130
134
|
if (frozen) {
|
|
131
135
|
return 1;
|
|
132
136
|
}
|
|
133
137
|
|
|
134
|
-
int ret = 0;
|
|
135
138
|
const BIGNUM *n_fixed;
|
|
136
|
-
|
|
139
|
+
MutexWriteLock lock(&rsa->lock);
|
|
137
140
|
if (rsa->private_key_frozen) {
|
|
138
|
-
|
|
139
|
-
goto err;
|
|
141
|
+
return 1;
|
|
140
142
|
}
|
|
141
143
|
|
|
142
144
|
// Check the public components are within DoS bounds.
|
|
143
145
|
if (!rsa_check_public_key(rsa)) {
|
|
144
|
-
|
|
146
|
+
return 0;
|
|
145
147
|
}
|
|
146
148
|
|
|
147
149
|
// Pre-compute various intermediate values, as well as copies of private
|
|
148
150
|
// exponents with correct widths. Note that other threads may concurrently
|
|
149
|
-
// read from
|
|
150
|
-
// copies. We use
|
|
151
|
-
//
|
|
151
|
+
// read from `rsa->n`, `rsa->e`, etc., so any fixes must be in separate
|
|
152
|
+
// copies. We use `mont_n->N`, `mont_p->N`, and `mont_q->N` as copies of `n`,
|
|
153
|
+
// `p`, and `q` with the correct minimal widths.
|
|
152
154
|
|
|
153
|
-
if (rsa->mont_n ==
|
|
154
|
-
rsa->mont_n
|
|
155
|
-
if (rsa->mont_n ==
|
|
156
|
-
|
|
155
|
+
if (rsa->mont_n == nullptr) {
|
|
156
|
+
rsa->mont_n.reset(BN_MONT_CTX_new_for_modulus(rsa->n.get(), ctx));
|
|
157
|
+
if (rsa->mont_n == nullptr) {
|
|
158
|
+
return 0;
|
|
157
159
|
}
|
|
158
160
|
}
|
|
159
161
|
n_fixed = &rsa->mont_n->N;
|
|
160
162
|
|
|
161
|
-
// The only public upper-bound of
|
|
163
|
+
// The only public upper-bound of `rsa->d` is the bit length of `rsa->n`. The
|
|
162
164
|
// ASN.1 serialization of RSA private keys unfortunately leaks the byte length
|
|
163
|
-
// of
|
|
165
|
+
// of `rsa->d`, but normalize it so we only leak it once, rather than per
|
|
164
166
|
// operation.
|
|
165
|
-
if (rsa->d !=
|
|
166
|
-
!ensure_fixed_copy(&rsa->d_fixed, rsa->d, n_fixed->width)) {
|
|
167
|
-
|
|
167
|
+
if (rsa->d != nullptr &&
|
|
168
|
+
!ensure_fixed_copy(&rsa->d_fixed, rsa->d.get(), n_fixed->width)) {
|
|
169
|
+
return 0;
|
|
168
170
|
}
|
|
169
171
|
|
|
170
|
-
if (rsa->e !=
|
|
172
|
+
if (rsa->e != nullptr && rsa->p != nullptr && rsa->q != nullptr) {
|
|
171
173
|
// TODO: p and q are also CONSTTIME_SECRET but not yet marked as such
|
|
172
174
|
// because the Montgomery code does things like test whether or not values
|
|
173
175
|
// are zero. So the secret marking probably needs to happen inside that
|
|
174
176
|
// code.
|
|
175
177
|
|
|
176
|
-
if (rsa->mont_p ==
|
|
177
|
-
rsa->mont_p
|
|
178
|
-
if (rsa->mont_p ==
|
|
179
|
-
|
|
178
|
+
if (rsa->mont_p == nullptr) {
|
|
179
|
+
rsa->mont_p.reset(BN_MONT_CTX_new_consttime(rsa->p.get(), ctx));
|
|
180
|
+
if (rsa->mont_p == nullptr) {
|
|
181
|
+
return 0;
|
|
180
182
|
}
|
|
181
183
|
}
|
|
182
184
|
|
|
183
|
-
if (rsa->mont_q ==
|
|
184
|
-
rsa->mont_q
|
|
185
|
-
if (rsa->mont_q ==
|
|
186
|
-
|
|
185
|
+
if (rsa->mont_q == nullptr) {
|
|
186
|
+
rsa->mont_q.reset(BN_MONT_CTX_new_consttime(rsa->q.get(), ctx));
|
|
187
|
+
if (rsa->mont_q == nullptr) {
|
|
188
|
+
return 0;
|
|
187
189
|
}
|
|
188
190
|
}
|
|
189
191
|
|
|
190
|
-
if (rsa->dmp1 !=
|
|
192
|
+
if (rsa->dmp1 != nullptr && rsa->dmq1 != nullptr && rsa->iqmp != nullptr) {
|
|
191
193
|
// CRT components are only publicly bounded by their corresponding
|
|
192
194
|
// moduli's bit lengths.
|
|
193
195
|
const BIGNUM *p_fixed = &rsa->mont_p->N;
|
|
194
196
|
const BIGNUM *q_fixed = &rsa->mont_q->N;
|
|
195
|
-
if (!ensure_fixed_copy(&rsa->dmp1_fixed, rsa->dmp1,
|
|
196
|
-
|
|
197
|
-
|
|
197
|
+
if (!ensure_fixed_copy(&rsa->dmp1_fixed, rsa->dmp1.get(),
|
|
198
|
+
p_fixed->width) ||
|
|
199
|
+
!ensure_fixed_copy(&rsa->dmq1_fixed, rsa->dmq1.get(),
|
|
200
|
+
q_fixed->width)) {
|
|
201
|
+
return 0;
|
|
198
202
|
}
|
|
199
203
|
|
|
200
|
-
// Compute
|
|
204
|
+
// Compute `iqmp_mont`, which is `iqmp` in Montgomery form and with the
|
|
201
205
|
// correct bit width.
|
|
202
|
-
if (rsa->iqmp_mont ==
|
|
203
|
-
BIGNUM
|
|
204
|
-
if (iqmp_mont ==
|
|
205
|
-
!BN_to_montgomery(iqmp_mont, rsa->iqmp,
|
|
206
|
-
|
|
207
|
-
|
|
206
|
+
if (rsa->iqmp_mont == nullptr) {
|
|
207
|
+
UniquePtr<BIGNUM> iqmp_mont(BN_new());
|
|
208
|
+
if (iqmp_mont == nullptr ||
|
|
209
|
+
!BN_to_montgomery(iqmp_mont.get(), rsa->iqmp.get(),
|
|
210
|
+
rsa->mont_p.get(), ctx)) {
|
|
211
|
+
return 0;
|
|
208
212
|
}
|
|
209
|
-
rsa->iqmp_mont = iqmp_mont;
|
|
210
|
-
bn_secret(rsa->iqmp_mont);
|
|
213
|
+
rsa->iqmp_mont = std::move(iqmp_mont);
|
|
214
|
+
bn_secret(rsa->iqmp_mont.get());
|
|
211
215
|
}
|
|
212
216
|
}
|
|
213
217
|
}
|
|
214
218
|
|
|
215
219
|
rsa->private_key_frozen = 1;
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
err:
|
|
219
|
-
CRYPTO_MUTEX_unlock_write(&rsa->lock);
|
|
220
|
-
return ret;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
void rsa_invalidate_key(RSA *rsa) {
|
|
224
|
-
rsa->private_key_frozen = 0;
|
|
225
|
-
|
|
226
|
-
BN_MONT_CTX_free(rsa->mont_n);
|
|
227
|
-
rsa->mont_n = NULL;
|
|
228
|
-
BN_MONT_CTX_free(rsa->mont_p);
|
|
229
|
-
rsa->mont_p = NULL;
|
|
230
|
-
BN_MONT_CTX_free(rsa->mont_q);
|
|
231
|
-
rsa->mont_q = NULL;
|
|
232
|
-
|
|
233
|
-
BN_free(rsa->d_fixed);
|
|
234
|
-
rsa->d_fixed = NULL;
|
|
235
|
-
BN_free(rsa->dmp1_fixed);
|
|
236
|
-
rsa->dmp1_fixed = NULL;
|
|
237
|
-
BN_free(rsa->dmq1_fixed);
|
|
238
|
-
rsa->dmq1_fixed = NULL;
|
|
239
|
-
BN_free(rsa->iqmp_mont);
|
|
240
|
-
rsa->iqmp_mont = NULL;
|
|
241
|
-
|
|
242
|
-
for (size_t i = 0; i < rsa->num_blindings; i++) {
|
|
243
|
-
BN_BLINDING_free(rsa->blindings[i]);
|
|
244
|
-
}
|
|
245
|
-
OPENSSL_free(rsa->blindings);
|
|
246
|
-
rsa->blindings = NULL;
|
|
247
|
-
rsa->num_blindings = 0;
|
|
248
|
-
OPENSSL_free(rsa->blindings_inuse);
|
|
249
|
-
rsa->blindings_inuse = NULL;
|
|
250
|
-
rsa->blinding_fork_generation = 0;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
// MAX_BLINDINGS_PER_RSA defines the maximum number of cached BN_BLINDINGs per
|
|
254
|
-
// RSA*. Then this limit is exceeded, BN_BLINDING objects will be created and
|
|
255
|
-
// destroyed as needed.
|
|
256
|
-
#if defined(OPENSSL_TSAN)
|
|
257
|
-
// Smaller under TSAN so that the edge case can be hit with fewer threads.
|
|
258
|
-
#define MAX_BLINDINGS_PER_RSA 2
|
|
259
|
-
#else
|
|
260
|
-
#define MAX_BLINDINGS_PER_RSA 1024
|
|
261
|
-
#endif
|
|
262
|
-
|
|
263
|
-
// rsa_blinding_get returns a BN_BLINDING to use with |rsa|. It does this by
|
|
264
|
-
// allocating one of the cached BN_BLINDING objects in |rsa->blindings|. If
|
|
265
|
-
// none are free, the cache will be extended by a extra element and the new
|
|
266
|
-
// BN_BLINDING is returned.
|
|
267
|
-
//
|
|
268
|
-
// On success, the index of the assigned BN_BLINDING is written to
|
|
269
|
-
// |*index_used| and must be passed to |rsa_blinding_release| when finished.
|
|
270
|
-
static BN_BLINDING *rsa_blinding_get(RSA *rsa, size_t *index_used,
|
|
271
|
-
BN_CTX *ctx) {
|
|
272
|
-
assert(ctx != NULL);
|
|
273
|
-
assert(rsa->mont_n != NULL);
|
|
274
|
-
|
|
275
|
-
BN_BLINDING *ret = NULL;
|
|
276
|
-
const uint64_t fork_generation = CRYPTO_get_fork_generation();
|
|
277
|
-
CRYPTO_MUTEX_lock_write(&rsa->lock);
|
|
278
|
-
|
|
279
|
-
// Wipe the blinding cache on |fork|.
|
|
280
|
-
if (rsa->blinding_fork_generation != fork_generation) {
|
|
281
|
-
for (size_t i = 0; i < rsa->num_blindings; i++) {
|
|
282
|
-
// The inuse flag must be zero unless we were forked from a
|
|
283
|
-
// multi-threaded process, in which case calling back into BoringSSL is
|
|
284
|
-
// forbidden.
|
|
285
|
-
assert(rsa->blindings_inuse[i] == 0);
|
|
286
|
-
BN_BLINDING_invalidate(rsa->blindings[i]);
|
|
287
|
-
}
|
|
288
|
-
rsa->blinding_fork_generation = fork_generation;
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
uint8_t *const free_inuse_flag = reinterpret_cast<uint8_t *>(
|
|
292
|
-
OPENSSL_memchr(rsa->blindings_inuse, 0, rsa->num_blindings));
|
|
293
|
-
size_t new_num_blindings;
|
|
294
|
-
BN_BLINDING **new_blindings;
|
|
295
|
-
uint8_t *new_blindings_inuse;
|
|
296
|
-
if (free_inuse_flag != NULL) {
|
|
297
|
-
*free_inuse_flag = 1;
|
|
298
|
-
*index_used = free_inuse_flag - rsa->blindings_inuse;
|
|
299
|
-
ret = rsa->blindings[*index_used];
|
|
300
|
-
goto out;
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
if (rsa->num_blindings >= MAX_BLINDINGS_PER_RSA) {
|
|
304
|
-
// No |BN_BLINDING| is free and nor can the cache be extended. This index
|
|
305
|
-
// value is magic and indicates to |rsa_blinding_release| that a
|
|
306
|
-
// |BN_BLINDING| was not inserted into the array.
|
|
307
|
-
*index_used = MAX_BLINDINGS_PER_RSA;
|
|
308
|
-
ret = BN_BLINDING_new();
|
|
309
|
-
goto out;
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
// Double the length of the cache.
|
|
313
|
-
static_assert(MAX_BLINDINGS_PER_RSA < UINT_MAX / 2,
|
|
314
|
-
"MAX_BLINDINGS_PER_RSA too large");
|
|
315
|
-
new_num_blindings = rsa->num_blindings * 2;
|
|
316
|
-
if (new_num_blindings == 0) {
|
|
317
|
-
new_num_blindings = 1;
|
|
318
|
-
}
|
|
319
|
-
if (new_num_blindings > MAX_BLINDINGS_PER_RSA) {
|
|
320
|
-
new_num_blindings = MAX_BLINDINGS_PER_RSA;
|
|
321
|
-
}
|
|
322
|
-
assert(new_num_blindings > rsa->num_blindings);
|
|
323
|
-
|
|
324
|
-
new_blindings = reinterpret_cast<BN_BLINDING **>(
|
|
325
|
-
OPENSSL_calloc(new_num_blindings, sizeof(BN_BLINDING *)));
|
|
326
|
-
new_blindings_inuse =
|
|
327
|
-
reinterpret_cast<uint8_t *>(OPENSSL_malloc(new_num_blindings));
|
|
328
|
-
if (new_blindings == NULL || new_blindings_inuse == NULL) {
|
|
329
|
-
goto err;
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
OPENSSL_memcpy(new_blindings, rsa->blindings,
|
|
333
|
-
sizeof(BN_BLINDING *) * rsa->num_blindings);
|
|
334
|
-
OPENSSL_memcpy(new_blindings_inuse, rsa->blindings_inuse, rsa->num_blindings);
|
|
335
|
-
|
|
336
|
-
for (size_t i = rsa->num_blindings; i < new_num_blindings; i++) {
|
|
337
|
-
new_blindings[i] = BN_BLINDING_new();
|
|
338
|
-
if (new_blindings[i] == NULL) {
|
|
339
|
-
for (size_t j = rsa->num_blindings; j < i; j++) {
|
|
340
|
-
BN_BLINDING_free(new_blindings[j]);
|
|
341
|
-
}
|
|
342
|
-
goto err;
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
memset(&new_blindings_inuse[rsa->num_blindings], 0,
|
|
346
|
-
new_num_blindings - rsa->num_blindings);
|
|
347
|
-
|
|
348
|
-
new_blindings_inuse[rsa->num_blindings] = 1;
|
|
349
|
-
*index_used = rsa->num_blindings;
|
|
350
|
-
assert(*index_used != MAX_BLINDINGS_PER_RSA);
|
|
351
|
-
ret = new_blindings[rsa->num_blindings];
|
|
352
|
-
|
|
353
|
-
OPENSSL_free(rsa->blindings);
|
|
354
|
-
rsa->blindings = new_blindings;
|
|
355
|
-
OPENSSL_free(rsa->blindings_inuse);
|
|
356
|
-
rsa->blindings_inuse = new_blindings_inuse;
|
|
357
|
-
rsa->num_blindings = new_num_blindings;
|
|
358
|
-
|
|
359
|
-
goto out;
|
|
360
|
-
|
|
361
|
-
err:
|
|
362
|
-
OPENSSL_free(new_blindings_inuse);
|
|
363
|
-
OPENSSL_free(new_blindings);
|
|
364
|
-
|
|
365
|
-
out:
|
|
366
|
-
CRYPTO_MUTEX_unlock_write(&rsa->lock);
|
|
367
|
-
return ret;
|
|
220
|
+
return 1;
|
|
368
221
|
}
|
|
369
222
|
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
CRYPTO_MUTEX_lock_write(&rsa->lock);
|
|
381
|
-
rsa->blindings_inuse[blinding_index] = 0;
|
|
382
|
-
CRYPTO_MUTEX_unlock_write(&rsa->lock);
|
|
223
|
+
void bssl::rsa_invalidate_key(RSA *rsa) {
|
|
224
|
+
auto *impl = FromOpaque(rsa);
|
|
225
|
+
impl->private_key_frozen = 0;
|
|
226
|
+
impl->mont_n = nullptr;
|
|
227
|
+
impl->mont_p = nullptr;
|
|
228
|
+
impl->mont_q = nullptr;
|
|
229
|
+
impl->d_fixed = nullptr;
|
|
230
|
+
impl->dmp1_fixed = nullptr;
|
|
231
|
+
impl->dmq1_fixed = nullptr;
|
|
232
|
+
impl->iqmp_mont = nullptr;
|
|
383
233
|
}
|
|
384
234
|
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
int padding) {
|
|
235
|
+
int bssl::rsa_default_sign_raw(RSA *rsa, size_t *out_len, uint8_t *out,
|
|
236
|
+
size_t max_out, const uint8_t *in, size_t in_len,
|
|
237
|
+
int padding) {
|
|
389
238
|
const unsigned rsa_size = RSA_size(rsa);
|
|
390
|
-
uint8_t *buf =
|
|
239
|
+
uint8_t *buf = nullptr;
|
|
391
240
|
int i, ret = 0;
|
|
392
241
|
|
|
393
242
|
if (max_out < rsa_size) {
|
|
@@ -396,7 +245,7 @@ int rsa_default_sign_raw(RSA *rsa, size_t *out_len, uint8_t *out,
|
|
|
396
245
|
}
|
|
397
246
|
|
|
398
247
|
buf = reinterpret_cast<uint8_t *>(OPENSSL_malloc(rsa_size));
|
|
399
|
-
if (buf ==
|
|
248
|
+
if (buf == nullptr) {
|
|
400
249
|
goto err;
|
|
401
250
|
}
|
|
402
251
|
|
|
@@ -431,12 +280,15 @@ err:
|
|
|
431
280
|
}
|
|
432
281
|
|
|
433
282
|
|
|
434
|
-
static int rsa_mod_exp_crt(BIGNUM *r0, const BIGNUM *I,
|
|
283
|
+
static int rsa_mod_exp_crt(BIGNUM *r0, const BIGNUM *I, RSAImpl *rsa,
|
|
284
|
+
BN_CTX *ctx);
|
|
285
|
+
|
|
286
|
+
int bssl::rsa_verify_raw_no_self_test(RSA *rsa, size_t *out_len, uint8_t *out,
|
|
287
|
+
size_t max_out, const uint8_t *in,
|
|
288
|
+
size_t in_len, int padding) {
|
|
289
|
+
auto *impl = FromOpaque(rsa);
|
|
435
290
|
|
|
436
|
-
|
|
437
|
-
size_t max_out, const uint8_t *in,
|
|
438
|
-
size_t in_len, int padding) {
|
|
439
|
-
if (rsa->n == NULL || rsa->e == NULL) {
|
|
291
|
+
if (impl->n == nullptr || impl->e == nullptr) {
|
|
440
292
|
OPENSSL_PUT_ERROR(RSA, RSA_R_VALUE_MISSING);
|
|
441
293
|
return 0;
|
|
442
294
|
}
|
|
@@ -446,8 +298,6 @@ int rsa_verify_raw_no_self_test(RSA *rsa, size_t *out_len, uint8_t *out,
|
|
|
446
298
|
}
|
|
447
299
|
|
|
448
300
|
const unsigned rsa_size = RSA_size(rsa);
|
|
449
|
-
BIGNUM *f, *result;
|
|
450
|
-
|
|
451
301
|
if (max_out < rsa_size) {
|
|
452
302
|
OPENSSL_PUT_ERROR(RSA, RSA_R_OUTPUT_BUFFER_TOO_SMALL);
|
|
453
303
|
return 0;
|
|
@@ -458,18 +308,17 @@ int rsa_verify_raw_no_self_test(RSA *rsa, size_t *out_len, uint8_t *out,
|
|
|
458
308
|
return 0;
|
|
459
309
|
}
|
|
460
310
|
|
|
461
|
-
BN_CTX
|
|
462
|
-
if (ctx ==
|
|
311
|
+
UniquePtr<BN_CTX> ctx(BN_CTX_new());
|
|
312
|
+
if (ctx == nullptr) {
|
|
463
313
|
return 0;
|
|
464
314
|
}
|
|
465
315
|
|
|
466
316
|
int ret = 0;
|
|
467
|
-
uint8_t *buf =
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
result
|
|
472
|
-
if (f == NULL || result == NULL) {
|
|
317
|
+
uint8_t *buf = nullptr;
|
|
318
|
+
BN_CTXScope scope(ctx.get());
|
|
319
|
+
BIGNUM *f = BN_CTX_get(ctx.get());
|
|
320
|
+
BIGNUM *result = BN_CTX_get(ctx.get());
|
|
321
|
+
if (f == nullptr || result == nullptr) {
|
|
473
322
|
goto err;
|
|
474
323
|
}
|
|
475
324
|
|
|
@@ -478,22 +327,24 @@ int rsa_verify_raw_no_self_test(RSA *rsa, size_t *out_len, uint8_t *out,
|
|
|
478
327
|
} else {
|
|
479
328
|
// Allocate a temporary buffer to hold the padded plaintext.
|
|
480
329
|
buf = reinterpret_cast<uint8_t *>(OPENSSL_malloc(rsa_size));
|
|
481
|
-
if (buf ==
|
|
330
|
+
if (buf == nullptr) {
|
|
482
331
|
goto err;
|
|
483
332
|
}
|
|
484
333
|
}
|
|
485
334
|
|
|
486
|
-
if (BN_bin2bn(in, in_len, f) ==
|
|
335
|
+
if (BN_bin2bn(in, in_len, f) == nullptr) {
|
|
487
336
|
goto err;
|
|
488
337
|
}
|
|
489
338
|
|
|
490
|
-
if (BN_ucmp(f,
|
|
339
|
+
if (BN_ucmp(f, impl->n.get()) >= 0) {
|
|
491
340
|
OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
|
|
492
341
|
goto err;
|
|
493
342
|
}
|
|
494
343
|
|
|
495
|
-
if (!BN_MONT_CTX_set_locked(&
|
|
496
|
-
|
|
344
|
+
if (!BN_MONT_CTX_set_locked(&impl->mont_n, &impl->lock, impl->n.get(),
|
|
345
|
+
ctx.get()) ||
|
|
346
|
+
!BN_mod_exp_mont(result, f, impl->e.get(), &impl->mont_n->N, ctx.get(),
|
|
347
|
+
impl->mont_n.get())) {
|
|
497
348
|
goto err;
|
|
498
349
|
}
|
|
499
350
|
|
|
@@ -522,8 +373,6 @@ int rsa_verify_raw_no_self_test(RSA *rsa, size_t *out_len, uint8_t *out,
|
|
|
522
373
|
}
|
|
523
374
|
|
|
524
375
|
err:
|
|
525
|
-
BN_CTX_end(ctx);
|
|
526
|
-
BN_CTX_free(ctx);
|
|
527
376
|
if (buf != out) {
|
|
528
377
|
OPENSSL_free(buf);
|
|
529
378
|
}
|
|
@@ -532,96 +381,74 @@ err:
|
|
|
532
381
|
|
|
533
382
|
int RSA_verify_raw(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out,
|
|
534
383
|
const uint8_t *in, size_t in_len, int padding) {
|
|
535
|
-
|
|
384
|
+
boringssl_ensure_rsa_verify_self_test();
|
|
536
385
|
return rsa_verify_raw_no_self_test(rsa, out_len, out, max_out, in, in_len,
|
|
537
386
|
padding);
|
|
538
387
|
}
|
|
539
388
|
|
|
540
|
-
int rsa_default_private_transform(RSA *rsa, uint8_t *out,
|
|
541
|
-
|
|
542
|
-
|
|
389
|
+
int bssl::rsa_default_private_transform(RSA *rsa, uint8_t *out,
|
|
390
|
+
const uint8_t *in, size_t len) {
|
|
391
|
+
auto *impl = FromOpaque(rsa);
|
|
392
|
+
|
|
393
|
+
if (impl->n == nullptr || impl->d == nullptr) {
|
|
543
394
|
OPENSSL_PUT_ERROR(RSA, RSA_R_VALUE_MISSING);
|
|
544
395
|
return 0;
|
|
545
396
|
}
|
|
546
397
|
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
BN_BLINDING *blinding = NULL;
|
|
551
|
-
int ret = 0, do_blinding;
|
|
552
|
-
|
|
553
|
-
ctx = BN_CTX_new();
|
|
554
|
-
if (ctx == NULL) {
|
|
555
|
-
goto err;
|
|
398
|
+
UniquePtr<BN_CTX> ctx(BN_CTX_new());
|
|
399
|
+
if (ctx == nullptr) {
|
|
400
|
+
return 0;
|
|
556
401
|
}
|
|
557
|
-
|
|
558
|
-
f = BN_CTX_get(ctx);
|
|
559
|
-
result = BN_CTX_get(ctx);
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
goto err;
|
|
402
|
+
BN_CTXScope scope(ctx.get());
|
|
403
|
+
BIGNUM *f = BN_CTX_get(ctx.get());
|
|
404
|
+
BIGNUM *result = BN_CTX_get(ctx.get());
|
|
405
|
+
if (f == nullptr || result == nullptr) {
|
|
406
|
+
return 0;
|
|
563
407
|
}
|
|
564
408
|
|
|
565
409
|
// The caller should have ensured this.
|
|
566
|
-
assert(len == BN_num_bytes(
|
|
567
|
-
if (BN_bin2bn(in, len, f) ==
|
|
568
|
-
|
|
410
|
+
assert(len == BN_num_bytes(impl->n.get()));
|
|
411
|
+
if (BN_bin2bn(in, len, f) == nullptr) {
|
|
412
|
+
return 0;
|
|
569
413
|
}
|
|
570
414
|
|
|
571
415
|
// The input to the RSA private transform may be secret, but padding is
|
|
572
416
|
// expected to construct a value within range, so we can leak this comparison.
|
|
573
|
-
if (constant_time_declassify_int(BN_ucmp(f,
|
|
417
|
+
if (constant_time_declassify_int(BN_ucmp(f, impl->n.get()) >= 0)) {
|
|
574
418
|
// Usually the padding functions would catch this.
|
|
575
419
|
OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
|
|
576
|
-
|
|
420
|
+
return 0;
|
|
577
421
|
}
|
|
578
422
|
|
|
579
|
-
if (!freeze_private_key(
|
|
423
|
+
if (!freeze_private_key(impl, ctx.get())) {
|
|
580
424
|
OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
|
|
581
|
-
|
|
425
|
+
return 0;
|
|
582
426
|
}
|
|
583
427
|
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
//
|
|
589
|
-
// those countermeasures is dangerous. However, the Java/Android RSA API
|
|
590
|
-
// requires support for keys where only |d| and |n| (and not |e|) are known.
|
|
591
|
-
// The callers that require that bad behavior must set
|
|
592
|
-
// |RSA_FLAG_NO_BLINDING| or use |RSA_new_private_key_no_e|.
|
|
593
|
-
//
|
|
594
|
-
// TODO(davidben): Update this comment when Conscrypt is updated to use
|
|
595
|
-
// |RSA_new_private_key_no_e|.
|
|
428
|
+
if (impl->e == nullptr && (impl->flags & RSA_FLAG_NO_PUBLIC_EXPONENT) == 0) {
|
|
429
|
+
// Unless the private key was specifically created with an API like
|
|
430
|
+
// `RSA_new_private_key_no_e`, don't allow RSA keys to be missing the public
|
|
431
|
+
// exponent, which disables some fault attack mitigations. (It should not be
|
|
432
|
+
// possible to construct such an `RSA` object in the public API.)
|
|
596
433
|
OPENSSL_PUT_ERROR(RSA, RSA_R_NO_PUBLIC_EXPONENT);
|
|
597
|
-
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
if (do_blinding) {
|
|
601
|
-
blinding = rsa_blinding_get(rsa, &blinding_index, ctx);
|
|
602
|
-
if (blinding == NULL) {
|
|
603
|
-
OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
|
|
604
|
-
goto err;
|
|
605
|
-
}
|
|
606
|
-
if (!BN_BLINDING_convert(f, blinding, rsa->e, rsa->mont_n, ctx)) {
|
|
607
|
-
goto err;
|
|
608
|
-
}
|
|
434
|
+
return 0;
|
|
609
435
|
}
|
|
610
436
|
|
|
611
|
-
if (
|
|
612
|
-
|
|
613
|
-
// Require that we can reduce
|
|
437
|
+
if (impl->p != nullptr && impl->q != nullptr && impl->e != nullptr &&
|
|
438
|
+
impl->dmp1 != nullptr && impl->dmq1 != nullptr && impl->iqmp != nullptr &&
|
|
439
|
+
// Require that we can reduce `f` by `impl->p` and `impl->q` in constant
|
|
614
440
|
// time, which requires primes be the same size, rounded to the Montgomery
|
|
615
|
-
// coefficient. (See
|
|
441
|
+
// coefficient. (See `mod_montgomery`.) This is not required by RFC 8017,
|
|
616
442
|
// but it is true for keys generated by us and all common implementations.
|
|
617
|
-
bn_less_than_montgomery_R(
|
|
618
|
-
bn_less_than_montgomery_R(
|
|
619
|
-
if (!rsa_mod_exp_crt(result, f,
|
|
620
|
-
|
|
443
|
+
bn_less_than_montgomery_R(impl->q.get(), impl->mont_p.get()) &&
|
|
444
|
+
bn_less_than_montgomery_R(impl->p.get(), impl->mont_q.get())) {
|
|
445
|
+
if (!rsa_mod_exp_crt(result, f, impl, ctx.get())) {
|
|
446
|
+
return 0;
|
|
621
447
|
}
|
|
622
|
-
} else if (!BN_mod_exp_mont_consttime(result, f,
|
|
623
|
-
|
|
624
|
-
|
|
448
|
+
} else if (!BN_mod_exp_mont_consttime(result, f, impl->d_fixed.get(),
|
|
449
|
+
impl->n.get(), ctx.get(),
|
|
450
|
+
impl->mont_n.get())) {
|
|
451
|
+
return 0;
|
|
625
452
|
}
|
|
626
453
|
|
|
627
454
|
// Verify the result to protect against fault attacks as described in the
|
|
@@ -632,50 +459,36 @@ int rsa_default_private_transform(RSA *rsa, uint8_t *out, const uint8_t *in,
|
|
|
632
459
|
// works when the CRT isn't used. That attack is much less likely to succeed
|
|
633
460
|
// than the CRT attack, but there have likely been improvements since 1997.
|
|
634
461
|
//
|
|
635
|
-
// This check is cheap assuming
|
|
636
|
-
//
|
|
637
|
-
if (
|
|
638
|
-
BIGNUM *vrfy = BN_CTX_get(ctx);
|
|
639
|
-
if (vrfy ==
|
|
640
|
-
!BN_mod_exp_mont(vrfy, result,
|
|
462
|
+
// This check is cheap assuming `e` is small, which we require in
|
|
463
|
+
// `rsa_check_public_key`.
|
|
464
|
+
if (impl->e != nullptr) {
|
|
465
|
+
BIGNUM *vrfy = BN_CTX_get(ctx.get());
|
|
466
|
+
if (vrfy == nullptr ||
|
|
467
|
+
!BN_mod_exp_mont(vrfy, result, impl->e.get(), impl->n.get(), ctx.get(),
|
|
468
|
+
impl->mont_n.get()) ||
|
|
641
469
|
!constant_time_declassify_int(BN_equal_consttime(vrfy, f))) {
|
|
642
470
|
OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
|
|
643
|
-
|
|
471
|
+
return 0;
|
|
644
472
|
}
|
|
645
473
|
}
|
|
646
474
|
|
|
647
|
-
|
|
648
|
-
goto err;
|
|
649
|
-
}
|
|
650
|
-
|
|
651
|
-
// The computation should have left |result| as a maximally-wide number, so
|
|
475
|
+
// The computation should have left `result` as a maximally-wide number, so
|
|
652
476
|
// that it and serializing does not leak information about the magnitude of
|
|
653
477
|
// the result.
|
|
654
478
|
//
|
|
655
479
|
// See Falko Strenzke, "Manger's Attack revisited", ICICS 2010.
|
|
656
|
-
assert(result->width ==
|
|
480
|
+
assert(result->width == impl->mont_n->N.width);
|
|
657
481
|
bn_assert_fits_in_bytes(result, len);
|
|
658
482
|
if (!BN_bn2bin_padded(out, len, result)) {
|
|
659
483
|
OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
|
|
660
|
-
|
|
661
|
-
}
|
|
662
|
-
|
|
663
|
-
ret = 1;
|
|
664
|
-
|
|
665
|
-
err:
|
|
666
|
-
if (ctx != NULL) {
|
|
667
|
-
BN_CTX_end(ctx);
|
|
668
|
-
BN_CTX_free(ctx);
|
|
669
|
-
}
|
|
670
|
-
if (blinding != NULL) {
|
|
671
|
-
rsa_blinding_release(rsa, blinding, blinding_index);
|
|
484
|
+
return 0;
|
|
672
485
|
}
|
|
673
486
|
|
|
674
|
-
return
|
|
487
|
+
return 1;
|
|
675
488
|
}
|
|
676
489
|
|
|
677
|
-
// mod_montgomery sets
|
|
678
|
-
// modulo
|
|
490
|
+
// mod_montgomery sets `r` to `I` mod `p`. `I` must already be fully reduced
|
|
491
|
+
// modulo `p` times `q`. It returns one on success and zero on error.
|
|
679
492
|
static int mod_montgomery(BIGNUM *r, const BIGNUM *I, const BIGNUM *p,
|
|
680
493
|
const BN_MONT_CTX *mont_p, const BIGNUM *q,
|
|
681
494
|
BN_CTX *ctx) {
|
|
@@ -695,182 +508,106 @@ static int mod_montgomery(BIGNUM *r, const BIGNUM *I, const BIGNUM *p,
|
|
|
695
508
|
return 0;
|
|
696
509
|
}
|
|
697
510
|
|
|
698
|
-
// By precomputing R^3 mod p (normally
|
|
699
|
-
// adjusting the API for
|
|
511
|
+
// By precomputing R^3 mod p (normally `BN_MONT_CTX` only uses R^2 mod p) and
|
|
512
|
+
// adjusting the API for `BN_mod_exp_mont_consttime`, we could instead compute
|
|
700
513
|
// I * R mod p here and save a reduction per prime. But this would require
|
|
701
514
|
// changing the RSAZ code and may not be worth it. Note that the RSAZ code
|
|
702
515
|
// uses a different radix, so it uses R' = 2^1044. There we'd actually want
|
|
703
|
-
// R^2 * R', and would
|
|
704
|
-
// converts
|
|
516
|
+
// R^2 * R', and would further benefit from a precomputed R'^2. It currently
|
|
517
|
+
// converts `mont_p->RR` to R'^2.
|
|
705
518
|
return 1;
|
|
706
519
|
}
|
|
707
520
|
|
|
708
|
-
static int rsa_mod_exp_crt(BIGNUM *r0, const BIGNUM *I,
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
assert(rsa->
|
|
713
|
-
assert(rsa->
|
|
714
|
-
assert(rsa->
|
|
715
|
-
assert(rsa->
|
|
716
|
-
assert(rsa->
|
|
717
|
-
assert(rsa->
|
|
718
|
-
assert(rsa->
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
r1
|
|
725
|
-
|
|
726
|
-
BIGNUM *n, *p, *q;
|
|
727
|
-
if (r1 == NULL || m1 == NULL) {
|
|
728
|
-
goto err;
|
|
521
|
+
static int rsa_mod_exp_crt(BIGNUM *r0, const BIGNUM *I, RSAImpl *rsa,
|
|
522
|
+
BN_CTX *ctx) {
|
|
523
|
+
assert(ctx != nullptr);
|
|
524
|
+
|
|
525
|
+
assert(rsa->n != nullptr);
|
|
526
|
+
assert(rsa->e != nullptr);
|
|
527
|
+
assert(rsa->d != nullptr);
|
|
528
|
+
assert(rsa->p != nullptr);
|
|
529
|
+
assert(rsa->q != nullptr);
|
|
530
|
+
assert(rsa->dmp1 != nullptr);
|
|
531
|
+
assert(rsa->dmq1 != nullptr);
|
|
532
|
+
assert(rsa->iqmp != nullptr);
|
|
533
|
+
|
|
534
|
+
BN_CTXScope scope(ctx);
|
|
535
|
+
BIGNUM *r1 = BN_CTX_get(ctx);
|
|
536
|
+
BIGNUM *m1 = BN_CTX_get(ctx);
|
|
537
|
+
if (r1 == nullptr || m1 == nullptr) {
|
|
538
|
+
return 0;
|
|
729
539
|
}
|
|
730
540
|
|
|
731
|
-
// Use the minimal-width versions of
|
|
541
|
+
// Use the minimal-width versions of `n`, `p`, and `q`. Either works, but if
|
|
732
542
|
// someone gives us non-minimal values, these will be slightly more efficient
|
|
733
543
|
// on the non-Montgomery operations.
|
|
734
|
-
n = &rsa->mont_n->N;
|
|
735
|
-
p = &rsa->mont_p->N;
|
|
736
|
-
q = &rsa->mont_q->N;
|
|
544
|
+
BIGNUM *n = &rsa->mont_n->N;
|
|
545
|
+
BIGNUM *p = &rsa->mont_p->N;
|
|
546
|
+
BIGNUM *q = &rsa->mont_q->N;
|
|
737
547
|
|
|
738
|
-
// This is a pre-condition for
|
|
548
|
+
// This is a pre-condition for `mod_montgomery`. It was already checked by the
|
|
739
549
|
// caller.
|
|
740
550
|
declassify_assert(BN_ucmp(I, n) < 0);
|
|
741
551
|
|
|
742
|
-
if ( //
|
|
743
|
-
!mod_montgomery(r1, I, q, rsa->mont_q, p, ctx) ||
|
|
744
|
-
!BN_mod_exp_mont_consttime(m1, r1, rsa->dmq1_fixed, q, ctx,
|
|
745
|
-
rsa->mont_q) ||
|
|
746
|
-
//
|
|
747
|
-
!mod_montgomery(r1, I, p, rsa->mont_p, q, ctx) ||
|
|
748
|
-
!BN_mod_exp_mont_consttime(r0, r1, rsa->dmp1_fixed, p, ctx,
|
|
749
|
-
rsa->mont_p) ||
|
|
750
|
-
// Compute r0 = r0 - m1 mod p.
|
|
751
|
-
// just run
|
|
752
|
-
// efficient with more cases: if
|
|
753
|
-
//
|
|
552
|
+
if ( // `m1` is the result modulo `q`.
|
|
553
|
+
!mod_montgomery(r1, I, q, rsa->mont_q.get(), p, ctx) ||
|
|
554
|
+
!BN_mod_exp_mont_consttime(m1, r1, rsa->dmq1_fixed.get(), q, ctx,
|
|
555
|
+
rsa->mont_q.get()) ||
|
|
556
|
+
// `r0` is the result modulo `p`.
|
|
557
|
+
!mod_montgomery(r1, I, p, rsa->mont_p.get(), q, ctx) ||
|
|
558
|
+
!BN_mod_exp_mont_consttime(r0, r1, rsa->dmp1_fixed.get(), p, ctx,
|
|
559
|
+
rsa->mont_p.get()) ||
|
|
560
|
+
// Compute r0 = r0 - m1 mod p. `m1` is reduced mod `q`, not `p`, so we
|
|
561
|
+
// just run `mod_montgomery` again for srsaicity. This could be more
|
|
562
|
+
// efficient with more cases: if `p > q`, `m1` is already reduced. If
|
|
563
|
+
// `p < q` but they have the same bit width, `bn_reduce_once` suffices.
|
|
754
564
|
// However, compared to over 2048 Montgomery multiplications above, this
|
|
755
565
|
// difference is not measurable.
|
|
756
|
-
!mod_montgomery(r1, m1, p, rsa->mont_p, q, ctx) ||
|
|
566
|
+
!mod_montgomery(r1, m1, p, rsa->mont_p.get(), q, ctx) ||
|
|
757
567
|
!bn_mod_sub_consttime(r0, r0, r1, p, ctx) ||
|
|
758
568
|
// r0 = r0 * iqmp mod p. We use Montgomery multiplication to compute this
|
|
759
|
-
// in constant time.
|
|
569
|
+
// in constant time. `iqmp_mont` is in Montgomery form and r0 is not, so
|
|
760
570
|
// the result is taken out of Montgomery form.
|
|
761
|
-
!BN_mod_mul_montgomery(r0, r0, rsa->iqmp_mont, rsa->mont_p,
|
|
571
|
+
!BN_mod_mul_montgomery(r0, r0, rsa->iqmp_mont.get(), rsa->mont_p.get(),
|
|
572
|
+
ctx) ||
|
|
762
573
|
// r0 = r0 * q + m1 gives the final result. Reducing modulo q gives m1, so
|
|
763
574
|
// it is correct mod p. Reducing modulo p gives (r0-m1)*iqmp*q + m1 = r0,
|
|
764
575
|
// so it is correct mod q. Finally, the result is bounded by [m1, n + m1),
|
|
765
|
-
// and the result is at least
|
|
576
|
+
// and the result is at least `m1`, so this must be the unique answer in
|
|
766
577
|
// [0, n).
|
|
767
578
|
!bn_mul_consttime(r0, r0, q, ctx) || //
|
|
768
579
|
!bn_uadd_consttime(r0, r0, m1)) {
|
|
769
|
-
|
|
580
|
+
return 0;
|
|
770
581
|
}
|
|
771
582
|
|
|
772
|
-
// The result should be bounded by
|
|
583
|
+
// The result should be bounded by `n`, but fixed-width operations may
|
|
773
584
|
// bound the width slightly higher, so fix it. This trips constant-time checks
|
|
774
585
|
// because a naive data flow analysis does not realize the excess words are
|
|
775
586
|
// publicly zero.
|
|
776
587
|
declassify_assert(BN_cmp(r0, n) < 0);
|
|
777
588
|
bn_assert_fits_in_bytes(r0, BN_num_bytes(n));
|
|
778
589
|
if (!bn_resize_words(r0, n->width)) {
|
|
779
|
-
|
|
590
|
+
return 0;
|
|
780
591
|
}
|
|
781
592
|
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
err:
|
|
785
|
-
BN_CTX_end(ctx);
|
|
786
|
-
return ret;
|
|
593
|
+
return 1;
|
|
787
594
|
}
|
|
788
595
|
|
|
789
|
-
static int ensure_bignum(BIGNUM
|
|
790
|
-
if (*out ==
|
|
791
|
-
|
|
596
|
+
static int ensure_bignum(UniquePtr<BIGNUM> *out) {
|
|
597
|
+
if (*out == nullptr) {
|
|
598
|
+
out->reset(BN_new());
|
|
792
599
|
}
|
|
793
|
-
return *out !=
|
|
600
|
+
return *out != nullptr;
|
|
794
601
|
}
|
|
795
602
|
|
|
796
|
-
//
|
|
797
|
-
//
|
|
798
|
-
//
|
|
799
|
-
//
|
|
800
|
-
// To calculate, use the following Haskell code:
|
|
801
|
-
//
|
|
802
|
-
// import Text.Printf (printf)
|
|
803
|
-
// import Data.List (intercalate)
|
|
804
|
-
//
|
|
805
|
-
// pow2 = 4095
|
|
806
|
-
// target = 2^pow2
|
|
807
|
-
//
|
|
808
|
-
// f x = x*x - (toRational target)
|
|
809
|
-
//
|
|
810
|
-
// fprime x = 2*x
|
|
811
|
-
//
|
|
812
|
-
// newtonIteration x = x - (f x) / (fprime x)
|
|
813
|
-
//
|
|
814
|
-
// converge x =
|
|
815
|
-
// let n = floor x in
|
|
816
|
-
// if n*n - target < 0 && (n+1)*(n+1) - target > 0
|
|
817
|
-
// then n
|
|
818
|
-
// else converge (newtonIteration x)
|
|
819
|
-
//
|
|
820
|
-
// divrem bits x = (x `div` (2^bits), x `rem` (2^bits))
|
|
821
|
-
//
|
|
822
|
-
// bnWords :: Integer -> [Integer]
|
|
823
|
-
// bnWords x =
|
|
824
|
-
// if x == 0
|
|
825
|
-
// then []
|
|
826
|
-
// else let (high, low) = divrem 64 x in low : bnWords high
|
|
827
|
-
//
|
|
828
|
-
// showWord x = let (high, low) = divrem 32 x in printf "TOBN(0x%08x, 0x%08x)"
|
|
829
|
-
// high low
|
|
830
|
-
//
|
|
831
|
-
// output :: String
|
|
832
|
-
// output = intercalate ", " $ map showWord $ bnWords $ converge (2 ^ (pow2
|
|
833
|
-
// `div` 2))
|
|
834
|
-
//
|
|
835
|
-
// To verify this number, check that n² < 2⁴⁰⁹⁵ < (n+1)², where n is value
|
|
836
|
-
// represented here. Note the components are listed in little-endian order. Here
|
|
837
|
-
// is some sample Python code to check:
|
|
838
|
-
//
|
|
839
|
-
// >>> TOBN = lambda a, b: a << 32 | b
|
|
840
|
-
// >>> l = [ <paste the contents of kSqrtTwo> ]
|
|
841
|
-
// >>> n = sum(a * 2**(64*i) for i, a in enumerate(l))
|
|
842
|
-
// >>> n**2 < 2**4095 < (n+1)**2
|
|
843
|
-
// True
|
|
844
|
-
const BN_ULONG kBoringSSLRSASqrtTwo[] = {
|
|
845
|
-
TOBN(0x4d7c60a5, 0xe633e3e1), TOBN(0x5fcf8f7b, 0xca3ea33b),
|
|
846
|
-
TOBN(0xc246785e, 0x92957023), TOBN(0xf9acce41, 0x797f2805),
|
|
847
|
-
TOBN(0xfdfe170f, 0xd3b1f780), TOBN(0xd24f4a76, 0x3facb882),
|
|
848
|
-
TOBN(0x18838a2e, 0xaff5f3b2), TOBN(0xc1fcbdde, 0xa2f7dc33),
|
|
849
|
-
TOBN(0xdea06241, 0xf7aa81c2), TOBN(0xf6a1be3f, 0xca221307),
|
|
850
|
-
TOBN(0x332a5e9f, 0x7bda1ebf), TOBN(0x0104dc01, 0xfe32352f),
|
|
851
|
-
TOBN(0xb8cf341b, 0x6f8236c7), TOBN(0x4264dabc, 0xd528b651),
|
|
852
|
-
TOBN(0xf4d3a02c, 0xebc93e0c), TOBN(0x81394ab6, 0xd8fd0efd),
|
|
853
|
-
TOBN(0xeaa4a089, 0x9040ca4a), TOBN(0xf52f120f, 0x836e582e),
|
|
854
|
-
TOBN(0xcb2a6343, 0x31f3c84d), TOBN(0xc6d5a8a3, 0x8bb7e9dc),
|
|
855
|
-
TOBN(0x460abc72, 0x2f7c4e33), TOBN(0xcab1bc91, 0x1688458a),
|
|
856
|
-
TOBN(0x53059c60, 0x11bc337b), TOBN(0xd2202e87, 0x42af1f4e),
|
|
857
|
-
TOBN(0x78048736, 0x3dfa2768), TOBN(0x0f74a85e, 0x439c7b4a),
|
|
858
|
-
TOBN(0xa8b1fe6f, 0xdc83db39), TOBN(0x4afc8304, 0x3ab8a2c3),
|
|
859
|
-
TOBN(0xed17ac85, 0x83339915), TOBN(0x1d6f60ba, 0x893ba84c),
|
|
860
|
-
TOBN(0x597d89b3, 0x754abe9f), TOBN(0xb504f333, 0xf9de6484),
|
|
861
|
-
};
|
|
862
|
-
const size_t kBoringSSLRSASqrtTwoLen = OPENSSL_ARRAY_SIZE(kBoringSSLRSASqrtTwo);
|
|
863
|
-
|
|
864
|
-
// generate_prime sets |out| to a prime with length |bits| such that |out|-1 is
|
|
865
|
-
// relatively prime to |e|. If |p| is non-NULL, |out| will also not be close to
|
|
866
|
-
// |p|. |sqrt2| must be ⌊2^(bits-1)×√2⌋ (or a slightly overestimate for large
|
|
867
|
-
// sizes), and |pow2_bits_100| must be 2^(bits-100).
|
|
603
|
+
// generate_prime sets `out` to a prime with length `bits` such that `out`-1 is
|
|
604
|
+
// relatively prime to `e`. If `p` is non-NULL, `out` will also not be close to
|
|
605
|
+
// `p`. `pow2_bits_100` must be 2^(bits-100).
|
|
868
606
|
//
|
|
869
607
|
// This function fails with probability around 2^-21.
|
|
870
608
|
static int generate_prime(BIGNUM *out, int bits, const BIGNUM *e,
|
|
871
|
-
const BIGNUM *p, const BIGNUM *
|
|
872
|
-
|
|
873
|
-
BN_GENCB *cb) {
|
|
609
|
+
const BIGNUM *p, const BIGNUM *pow2_bits_100,
|
|
610
|
+
BN_CTX *ctx, BN_GENCB *cb) {
|
|
874
611
|
if (bits < 128 || (bits % BN_BITS2) != 0) {
|
|
875
612
|
OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
|
|
876
613
|
return 0;
|
|
@@ -878,14 +615,14 @@ static int generate_prime(BIGNUM *out, int bits, const BIGNUM *e,
|
|
|
878
615
|
assert(BN_is_pow2(pow2_bits_100));
|
|
879
616
|
assert(BN_is_bit_set(pow2_bits_100, bits - 100));
|
|
880
617
|
|
|
881
|
-
// See FIPS 186-
|
|
618
|
+
// See FIPS 186-5 appendix A.1.3, steps 4 and 5. Note `bits` here is nlen/2.
|
|
882
619
|
|
|
883
|
-
// Use the limit from steps 4.7 and 5.8 for most values of
|
|
884
|
-
// the 186-
|
|
885
|
-
// reachable from
|
|
620
|
+
// Use the limit from steps 4.7 and 5.8 for most values of `e`. When `e` is 3,
|
|
621
|
+
// the 186-5 limit is too low, so we use a higher one. Note this case is not
|
|
622
|
+
// reachable from `RSA_generate_key_fips`.
|
|
886
623
|
//
|
|
887
|
-
//
|
|
888
|
-
// not 1 mod
|
|
624
|
+
// `limit` determines the failure probability. We must find a prime that is
|
|
625
|
+
// not 1 mod `e`. By the prime number theorem, we'll find one with probability
|
|
889
626
|
// p = (e-1)/e * 2/(ln(2)*bits). Note the second term is doubled because we
|
|
890
627
|
// discard even numbers.
|
|
891
628
|
//
|
|
@@ -914,46 +651,37 @@ static int generate_prime(BIGNUM *out, int bits, const BIGNUM *e,
|
|
|
914
651
|
}
|
|
915
652
|
int limit = BN_is_word(e, 3) ? bits * 8 : bits * 5;
|
|
916
653
|
|
|
917
|
-
int
|
|
918
|
-
|
|
654
|
+
int tries = 0, rand_tries = 0;
|
|
655
|
+
BN_CTXScope scope(ctx);
|
|
919
656
|
BIGNUM *tmp = BN_CTX_get(ctx);
|
|
920
|
-
if (tmp ==
|
|
921
|
-
|
|
657
|
+
if (tmp == nullptr) {
|
|
658
|
+
return 0;
|
|
922
659
|
}
|
|
923
660
|
|
|
924
661
|
for (;;) {
|
|
925
|
-
// Generate a random number of length
|
|
926
|
-
// (steps 4.2
|
|
927
|
-
//
|
|
928
|
-
|
|
662
|
+
// Generate a random number of length `bits` where the bottom bit is set and
|
|
663
|
+
// top two bits are set (steps 4.2–4.4 and 5.2–5.4):
|
|
664
|
+
//
|
|
665
|
+
// - Setting the top two bits is permitted by steps 4.2.1 and 5.2.1. Doing
|
|
666
|
+
// so implements steps 4.4 and 5.4 by making this case impossible because
|
|
667
|
+
// √2 < 1.5.
|
|
668
|
+
//
|
|
669
|
+
// - Setting the bottom bit implements steps 4.3 and 5.3.
|
|
670
|
+
if (!BN_rand(out, bits, BN_RAND_TOP_TWO, BN_RAND_BOTTOM_ODD) ||
|
|
929
671
|
!BN_GENCB_call(cb, BN_GENCB_GENERATED, rand_tries++)) {
|
|
930
|
-
|
|
672
|
+
return 0;
|
|
931
673
|
}
|
|
932
674
|
|
|
933
|
-
if (p !=
|
|
934
|
-
// If
|
|
675
|
+
if (p != nullptr) {
|
|
676
|
+
// If `p` and `out` are too close, try again (step 5.5).
|
|
935
677
|
if (!bn_abs_sub_consttime(tmp, out, p, ctx)) {
|
|
936
|
-
|
|
678
|
+
return 0;
|
|
937
679
|
}
|
|
938
680
|
if (BN_cmp(tmp, pow2_bits_100) <= 0) {
|
|
939
681
|
continue;
|
|
940
682
|
}
|
|
941
683
|
}
|
|
942
684
|
|
|
943
|
-
// If out < 2^(bits-1)×√2, try again (steps 4.4 and 5.5). This is equivalent
|
|
944
|
-
// to out <= ⌊2^(bits-1)×√2⌋, or out <= sqrt2 for FIPS key sizes.
|
|
945
|
-
//
|
|
946
|
-
// For larger keys, the comparison is approximate, leaning towards
|
|
947
|
-
// retrying. That is, we reject a negligible fraction of primes that are
|
|
948
|
-
// within the FIPS bound, but we will never accept a prime outside the
|
|
949
|
-
// bound, ensuring the resulting RSA key is the right size.
|
|
950
|
-
//
|
|
951
|
-
// Values over the threshold are discarded, so it is safe to leak this
|
|
952
|
-
// comparison.
|
|
953
|
-
if (constant_time_declassify_int(BN_cmp(out, sqrt2) <= 0)) {
|
|
954
|
-
continue;
|
|
955
|
-
}
|
|
956
|
-
|
|
957
685
|
// RSA key generation's bottleneck is discarding composites. If it fails
|
|
958
686
|
// trial division, do not bother computing a GCD or performing Miller-Rabin.
|
|
959
687
|
if (!bn_odd_number_is_obviously_composite(out)) {
|
|
@@ -963,64 +691,59 @@ static int generate_prime(BIGNUM *out, int bits, const BIGNUM *e,
|
|
|
963
691
|
int relatively_prime;
|
|
964
692
|
if (!bn_usub_consttime(tmp, out, BN_value_one()) ||
|
|
965
693
|
!bn_is_relatively_prime(&relatively_prime, tmp, e, ctx)) {
|
|
966
|
-
|
|
694
|
+
return 0;
|
|
967
695
|
}
|
|
968
696
|
if (constant_time_declassify_int(relatively_prime)) {
|
|
969
|
-
// Test
|
|
697
|
+
// Test `out` for primality (steps 4.5.1 and 5.6.1).
|
|
970
698
|
int is_probable_prime;
|
|
971
699
|
if (!BN_primality_test(&is_probable_prime, out,
|
|
972
700
|
BN_prime_checks_for_generation, ctx, 0, cb)) {
|
|
973
|
-
|
|
701
|
+
return 0;
|
|
974
702
|
}
|
|
975
703
|
if (is_probable_prime) {
|
|
976
|
-
|
|
977
|
-
goto err;
|
|
704
|
+
return 1;
|
|
978
705
|
}
|
|
979
706
|
}
|
|
980
707
|
}
|
|
981
708
|
|
|
982
|
-
// If we've tried too many times to find a prime, abort (steps 4.7 and
|
|
983
|
-
// 5.8).
|
|
709
|
+
// If we've tried too many times to find a prime, abort (steps 4.7 and 5.8).
|
|
984
710
|
tries++;
|
|
985
711
|
if (tries >= limit) {
|
|
986
712
|
OPENSSL_PUT_ERROR(RSA, RSA_R_TOO_MANY_ITERATIONS);
|
|
987
|
-
|
|
713
|
+
return 0;
|
|
988
714
|
}
|
|
989
715
|
if (!BN_GENCB_call(cb, 2, tries)) {
|
|
990
|
-
|
|
716
|
+
return 0;
|
|
991
717
|
}
|
|
992
718
|
}
|
|
993
|
-
|
|
994
|
-
err:
|
|
995
|
-
BN_CTX_end(ctx);
|
|
996
|
-
return ret;
|
|
997
719
|
}
|
|
998
720
|
|
|
999
721
|
// rsa_generate_key_impl generates an RSA key using a generalized version of
|
|
1000
|
-
// FIPS 186-
|
|
722
|
+
// FIPS 186-5 appendix A.1.3. `RSA_generate_key_fips` performs additional checks
|
|
1001
723
|
// for FIPS-compliant key generation.
|
|
1002
724
|
//
|
|
1003
725
|
// This function returns one on success and zero on failure. It has a failure
|
|
1004
726
|
// probability of about 2^-20.
|
|
1005
|
-
static int rsa_generate_key_impl(
|
|
727
|
+
static int rsa_generate_key_impl(RSAImpl *rsa, int bits, const BIGNUM *e_value,
|
|
1006
728
|
BN_GENCB *cb) {
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
729
|
+
if (bits > OPENSSL_RSA_MAX_MODULUS_BITS) {
|
|
730
|
+
OPENSSL_PUT_ERROR(RSA, RSA_R_MODULUS_TOO_LARGE);
|
|
731
|
+
return 0;
|
|
732
|
+
}
|
|
1010
733
|
|
|
1011
|
-
// Always generate RSA keys which are a multiple of 128 bits. Round
|
|
734
|
+
// Always generate RSA keys which are a multiple of 128 bits. Round `bits`
|
|
1012
735
|
// down as needed.
|
|
1013
736
|
bits &= ~127;
|
|
1014
737
|
|
|
1015
738
|
// Reject excessively small keys.
|
|
1016
|
-
if (bits <
|
|
739
|
+
if (bits < OPENSSL_RSA_MIN_MODULUS_BITS) {
|
|
1017
740
|
OPENSSL_PUT_ERROR(RSA, RSA_R_KEY_SIZE_TOO_SMALL);
|
|
1018
741
|
return 0;
|
|
1019
742
|
}
|
|
1020
743
|
|
|
1021
744
|
// Reject excessively large public exponents. Windows CryptoAPI and Go don't
|
|
1022
745
|
// support values larger than 32 bits, so match their limits for generating
|
|
1023
|
-
// keys. (
|
|
746
|
+
// keys. (`rsa_check_public_key` uses a slightly more conservative value, but
|
|
1024
747
|
// we don't need to support generating such keys.)
|
|
1025
748
|
// https://github.com/golang/go/issues/3161
|
|
1026
749
|
// https://msdn.microsoft.com/en-us/library/aa387685(VS.85).aspx
|
|
@@ -1029,29 +752,45 @@ static int rsa_generate_key_impl(RSA *rsa, int bits, const BIGNUM *e_value,
|
|
|
1029
752
|
return 0;
|
|
1030
753
|
}
|
|
1031
754
|
|
|
1032
|
-
|
|
755
|
+
// The smallest reasonable RSA exponent is 3, and it definitely must be odd.
|
|
756
|
+
// Catching these here prevents endless loops or slow computation when trying
|
|
757
|
+
// to generate keys later, and results in a better error code.
|
|
758
|
+
if (
|
|
759
|
+
// Would fail in `bn_lcm_consttime` as it only allows positive integers.
|
|
760
|
+
BN_is_negative(e_value) ||
|
|
761
|
+
// Would fail in `generate_prime` as only one `rsa->p`-1 is coprime with
|
|
762
|
+
// an even `e_value` and that one is a little bit short. (The R in RSA
|
|
763
|
+
// doesn't stand for Rabin.)
|
|
764
|
+
!BN_is_odd(e_value) ||
|
|
765
|
+
// Would loop endlessly because it'll always compute an `rsa->d` exponent
|
|
766
|
+
// of 1, which is too small.
|
|
767
|
+
BN_is_one(e_value)) {
|
|
768
|
+
OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_E_VALUE);
|
|
769
|
+
return 0;
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
UniquePtr<BN_CTX> ctx(BN_CTX_new());
|
|
773
|
+
if (ctx == nullptr) {
|
|
774
|
+
OPENSSL_PUT_ERROR(RSA, ERR_LIB_BN);
|
|
775
|
+
return 0;
|
|
776
|
+
}
|
|
777
|
+
|
|
1033
778
|
int prime_bits = bits / 2;
|
|
1034
|
-
|
|
1035
|
-
BIGNUM *totient
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
pm1 = BN_CTX_get(ctx);
|
|
1043
|
-
qm1 = BN_CTX_get(ctx);
|
|
1044
|
-
sqrt2 = BN_CTX_get(ctx);
|
|
1045
|
-
pow2_prime_bits_100 = BN_CTX_get(ctx);
|
|
1046
|
-
pow2_prime_bits = BN_CTX_get(ctx);
|
|
1047
|
-
if (totient == NULL || pm1 == NULL || qm1 == NULL || sqrt2 == NULL ||
|
|
1048
|
-
pow2_prime_bits_100 == NULL || pow2_prime_bits == NULL ||
|
|
779
|
+
BN_CTXScope scope(ctx.get());
|
|
780
|
+
BIGNUM *totient = BN_CTX_get(ctx.get());
|
|
781
|
+
BIGNUM *pm1 = BN_CTX_get(ctx.get());
|
|
782
|
+
BIGNUM *qm1 = BN_CTX_get(ctx.get());
|
|
783
|
+
BIGNUM *pow2_prime_bits_100 = BN_CTX_get(ctx.get());
|
|
784
|
+
BIGNUM *pow2_prime_bits = BN_CTX_get(ctx.get());
|
|
785
|
+
if (totient == nullptr || pm1 == nullptr || qm1 == nullptr ||
|
|
786
|
+
pow2_prime_bits_100 == nullptr || pow2_prime_bits == nullptr ||
|
|
1049
787
|
!BN_set_bit(pow2_prime_bits_100, prime_bits - 100) ||
|
|
1050
788
|
!BN_set_bit(pow2_prime_bits, prime_bits)) {
|
|
1051
|
-
|
|
789
|
+
OPENSSL_PUT_ERROR(RSA, ERR_LIB_BN);
|
|
790
|
+
return 0;
|
|
1052
791
|
}
|
|
1053
792
|
|
|
1054
|
-
// We need the RSA components non-
|
|
793
|
+
// We need the RSA components non-null.
|
|
1055
794
|
if (!ensure_bignum(&rsa->n) || //
|
|
1056
795
|
!ensure_bignum(&rsa->d) || //
|
|
1057
796
|
!ensure_bignum(&rsa->e) || //
|
|
@@ -1060,229 +799,186 @@ static int rsa_generate_key_impl(RSA *rsa, int bits, const BIGNUM *e_value,
|
|
|
1060
799
|
!ensure_bignum(&rsa->dmp1) || //
|
|
1061
800
|
!ensure_bignum(&rsa->dmq1) || //
|
|
1062
801
|
!ensure_bignum(&rsa->iqmp)) {
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
if (!BN_copy(rsa->e, e_value)) {
|
|
1067
|
-
goto bn_err;
|
|
802
|
+
OPENSSL_PUT_ERROR(RSA, ERR_LIB_BN);
|
|
803
|
+
return 0;
|
|
1068
804
|
}
|
|
1069
805
|
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
}
|
|
1074
|
-
sqrt2_bits = kBoringSSLRSASqrtTwoLen * BN_BITS2;
|
|
1075
|
-
assert(sqrt2_bits == (int)BN_num_bits(sqrt2));
|
|
1076
|
-
if (sqrt2_bits > prime_bits) {
|
|
1077
|
-
// For key sizes up to 4096 (prime_bits = 2048), this is exactly
|
|
1078
|
-
// ⌊2^(prime_bits-1)×√2⌋.
|
|
1079
|
-
if (!BN_rshift(sqrt2, sqrt2, sqrt2_bits - prime_bits)) {
|
|
1080
|
-
goto bn_err;
|
|
1081
|
-
}
|
|
1082
|
-
} else if (prime_bits > sqrt2_bits) {
|
|
1083
|
-
// For key sizes beyond 4096, this is approximate. We err towards retrying
|
|
1084
|
-
// to ensure our key is the right size and round up.
|
|
1085
|
-
if (!BN_add_word(sqrt2, 1) ||
|
|
1086
|
-
!BN_lshift(sqrt2, sqrt2, prime_bits - sqrt2_bits)) {
|
|
1087
|
-
goto bn_err;
|
|
1088
|
-
}
|
|
806
|
+
if (!BN_copy(rsa->e.get(), e_value)) {
|
|
807
|
+
OPENSSL_PUT_ERROR(RSA, ERR_LIB_BN);
|
|
808
|
+
return 0;
|
|
1089
809
|
}
|
|
1090
|
-
assert(prime_bits == (int)BN_num_bits(sqrt2));
|
|
1091
810
|
|
|
1092
811
|
do {
|
|
1093
|
-
// Generate p and q, each of size
|
|
1094
|
-
// appendix FIPS 186-
|
|
812
|
+
// Generate p and q, each of size `prime_bits`, using the steps outlined in
|
|
813
|
+
// appendix FIPS 186-5 appendix C.3.3.
|
|
1095
814
|
//
|
|
1096
|
-
// Each call to
|
|
815
|
+
// Each call to `generate_prime` fails with probability p = 2^-21. The
|
|
1097
816
|
// probability that either call fails is 1 - (1-p)^2, which is around 2^-20.
|
|
1098
|
-
if (!generate_prime(rsa->p, prime_bits, rsa->e,
|
|
1099
|
-
pow2_prime_bits_100, ctx, cb) ||
|
|
817
|
+
if (!generate_prime(rsa->p.get(), prime_bits, rsa->e.get(), nullptr,
|
|
818
|
+
pow2_prime_bits_100, ctx.get(), cb) ||
|
|
1100
819
|
!BN_GENCB_call(cb, 3, 0) ||
|
|
1101
|
-
!generate_prime(rsa->q, prime_bits, rsa->e, rsa->p,
|
|
1102
|
-
pow2_prime_bits_100, ctx, cb) ||
|
|
820
|
+
!generate_prime(rsa->q.get(), prime_bits, rsa->e.get(), rsa->p.get(),
|
|
821
|
+
pow2_prime_bits_100, ctx.get(), cb) ||
|
|
1103
822
|
!BN_GENCB_call(cb, 3, 1)) {
|
|
1104
|
-
|
|
823
|
+
OPENSSL_PUT_ERROR(RSA, ERR_LIB_BN);
|
|
824
|
+
return 0;
|
|
1105
825
|
}
|
|
1106
826
|
|
|
1107
|
-
if (BN_cmp(rsa->p, rsa->q) < 0) {
|
|
1108
|
-
|
|
1109
|
-
rsa->p = rsa->q;
|
|
1110
|
-
rsa->q = tmp;
|
|
827
|
+
if (BN_cmp(rsa->p.get(), rsa->q.get()) < 0) {
|
|
828
|
+
std::swap(rsa->p, rsa->q);
|
|
1111
829
|
}
|
|
1112
830
|
|
|
1113
|
-
// Calculate d = e^(-1) (mod lcm(p-1, q-1)), per FIPS 186-
|
|
1114
|
-
// from typical RSA
|
|
831
|
+
// Calculate d = e^(-1) (mod lcm(p-1, q-1)), per FIPS 186-5. This differs
|
|
832
|
+
// from typical RSA rsaementations which use (p-1)*(q-1).
|
|
1115
833
|
//
|
|
1116
834
|
// Note this means the size of d might reveal information about p-1 and
|
|
1117
835
|
// q-1. However, we do operations with Chinese Remainder Theorem, so we only
|
|
1118
836
|
// use d (mod p-1) and d (mod q-1) as exponents. Using a minimal totient
|
|
1119
837
|
// does not affect those two values.
|
|
1120
838
|
int no_inverse;
|
|
1121
|
-
if (!bn_usub_consttime(pm1, rsa->p, BN_value_one()) ||
|
|
1122
|
-
!bn_usub_consttime(qm1, rsa->q, BN_value_one()) ||
|
|
1123
|
-
!bn_lcm_consttime(totient, pm1, qm1, ctx) ||
|
|
1124
|
-
!bn_mod_inverse_consttime(rsa->d, &no_inverse, rsa->e,
|
|
1125
|
-
|
|
839
|
+
if (!bn_usub_consttime(pm1, rsa->p.get(), BN_value_one()) ||
|
|
840
|
+
!bn_usub_consttime(qm1, rsa->q.get(), BN_value_one()) ||
|
|
841
|
+
!bn_lcm_consttime(totient, pm1, qm1, ctx.get()) ||
|
|
842
|
+
!bn_mod_inverse_consttime(rsa->d.get(), &no_inverse, rsa->e.get(),
|
|
843
|
+
totient, ctx.get())) {
|
|
844
|
+
OPENSSL_PUT_ERROR(RSA, ERR_LIB_BN);
|
|
845
|
+
return 0;
|
|
1126
846
|
}
|
|
1127
847
|
|
|
1128
|
-
// Retry if
|
|
848
|
+
// Retry if `rsa->d` <= 2^`prime_bits`. See appendix A.3.1's guidance on
|
|
1129
849
|
// values for d. When we retry, p and q are discarded, so it is safe to leak
|
|
1130
850
|
// this comparison.
|
|
1131
|
-
} while (
|
|
851
|
+
} while (
|
|
852
|
+
constant_time_declassify_int(BN_cmp(rsa->d.get(), pow2_prime_bits) <= 0));
|
|
1132
853
|
|
|
1133
854
|
assert(BN_num_bits(pm1) == (unsigned)prime_bits);
|
|
1134
855
|
assert(BN_num_bits(qm1) == (unsigned)prime_bits);
|
|
1135
856
|
if ( // Calculate n.
|
|
1136
|
-
!bn_mul_consttime(rsa->n, rsa->p, rsa->q, ctx) ||
|
|
857
|
+
!bn_mul_consttime(rsa->n.get(), rsa->p.get(), rsa->q.get(), ctx.get()) ||
|
|
1137
858
|
// Calculate d mod (p-1).
|
|
1138
|
-
!bn_div_consttime(
|
|
859
|
+
!bn_div_consttime(nullptr, rsa->dmp1.get(), rsa->d.get(), pm1, prime_bits,
|
|
860
|
+
ctx.get()) ||
|
|
1139
861
|
// Calculate d mod (q-1)
|
|
1140
|
-
!bn_div_consttime(
|
|
1141
|
-
|
|
862
|
+
!bn_div_consttime(nullptr, rsa->dmq1.get(), rsa->d.get(), qm1, prime_bits,
|
|
863
|
+
ctx.get())) {
|
|
864
|
+
OPENSSL_PUT_ERROR(RSA, ERR_LIB_BN);
|
|
865
|
+
return 0;
|
|
1142
866
|
}
|
|
1143
|
-
bn_set_minimal_width(rsa->n);
|
|
867
|
+
bn_set_minimal_width(rsa->n.get());
|
|
1144
868
|
|
|
1145
|
-
//
|
|
1146
|
-
bn_declassify(rsa->n);
|
|
869
|
+
// `rsa->n` is computed from the private key, but is public.
|
|
870
|
+
bn_declassify(rsa->n.get());
|
|
1147
871
|
|
|
1148
872
|
// Calculate q^-1 mod p.
|
|
1149
|
-
rsa->mont_p
|
|
1150
|
-
if (rsa->mont_p ==
|
|
1151
|
-
!bn_mod_inverse_secret_prime(rsa->iqmp, rsa->q, rsa->p,
|
|
1152
|
-
rsa->mont_p)) {
|
|
1153
|
-
|
|
873
|
+
rsa->mont_p.reset(BN_MONT_CTX_new_consttime(rsa->p.get(), ctx.get()));
|
|
874
|
+
if (rsa->mont_p == nullptr || //
|
|
875
|
+
!bn_mod_inverse_secret_prime(rsa->iqmp.get(), rsa->q.get(), rsa->p.get(),
|
|
876
|
+
ctx.get(), rsa->mont_p.get())) {
|
|
877
|
+
OPENSSL_PUT_ERROR(RSA, ERR_LIB_BN);
|
|
878
|
+
return 0;
|
|
1154
879
|
}
|
|
1155
880
|
|
|
1156
|
-
// Sanity-check that
|
|
1157
|
-
//
|
|
1158
|
-
if (BN_num_bits(rsa->n) != (unsigned)bits) {
|
|
881
|
+
// Sanity-check that `rsa->n` has the specified size. This is rsaied by
|
|
882
|
+
// `generate_prime`'s bounds.
|
|
883
|
+
if (BN_num_bits(rsa->n.get()) != (unsigned)bits) {
|
|
1159
884
|
OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
|
|
1160
|
-
|
|
885
|
+
return 0;
|
|
1161
886
|
}
|
|
1162
887
|
|
|
1163
888
|
// The key generation process is complex and thus error-prone. It could be
|
|
1164
889
|
// disastrous to generate and then use a bad key so double-check that the key
|
|
1165
|
-
// makes sense. Also, while
|
|
1166
|
-
if (!RSA_check_key(rsa) ||
|
|
1167
|
-
!freeze_private_key(rsa, ctx)) {
|
|
890
|
+
// makes sense. Also, while `rsa` is mutable, fill in the cached components.
|
|
891
|
+
if (!RSA_check_key(rsa) || !freeze_private_key(rsa, ctx.get())) {
|
|
1168
892
|
OPENSSL_PUT_ERROR(RSA, RSA_R_INTERNAL_ERROR);
|
|
1169
|
-
|
|
1170
|
-
}
|
|
1171
|
-
|
|
1172
|
-
ret = 1;
|
|
1173
|
-
|
|
1174
|
-
bn_err:
|
|
1175
|
-
if (!ret) {
|
|
1176
|
-
OPENSSL_PUT_ERROR(RSA, ERR_LIB_BN);
|
|
1177
|
-
}
|
|
1178
|
-
err:
|
|
1179
|
-
if (ctx != NULL) {
|
|
1180
|
-
BN_CTX_end(ctx);
|
|
1181
|
-
BN_CTX_free(ctx);
|
|
893
|
+
return 0;
|
|
1182
894
|
}
|
|
1183
|
-
return ret;
|
|
1184
|
-
}
|
|
1185
895
|
|
|
1186
|
-
|
|
1187
|
-
BN_free(*out);
|
|
1188
|
-
*out = *in;
|
|
1189
|
-
*in = NULL;
|
|
1190
|
-
}
|
|
1191
|
-
|
|
1192
|
-
static void replace_bn_mont_ctx(BN_MONT_CTX **out, BN_MONT_CTX **in) {
|
|
1193
|
-
BN_MONT_CTX_free(*out);
|
|
1194
|
-
*out = *in;
|
|
1195
|
-
*in = NULL;
|
|
896
|
+
return 1;
|
|
1196
897
|
}
|
|
1197
898
|
|
|
1198
|
-
static int RSA_generate_key_ex_maybe_fips(
|
|
899
|
+
static int RSA_generate_key_ex_maybe_fips(RSAImpl *rsa, int bits,
|
|
1199
900
|
const BIGNUM *e_value, BN_GENCB *cb,
|
|
1200
901
|
int check_fips) {
|
|
1201
|
-
|
|
902
|
+
boringssl_ensure_rsa_sign_self_test();
|
|
903
|
+
boringssl_ensure_rsa_verify_self_test();
|
|
1202
904
|
|
|
1203
|
-
if (rsa ==
|
|
905
|
+
if (rsa == nullptr) {
|
|
1204
906
|
OPENSSL_PUT_ERROR(EC, ERR_R_PASSED_NULL_PARAMETER);
|
|
1205
907
|
return 0;
|
|
1206
908
|
}
|
|
1207
909
|
|
|
1208
|
-
|
|
1209
|
-
uint32_t err;
|
|
1210
|
-
int ret = 0;
|
|
910
|
+
UniquePtr<RSAImpl> tmp;
|
|
1211
911
|
|
|
1212
|
-
//
|
|
912
|
+
// `rsa_generate_key_impl`'s 2^-20 failure probability is too high at scale,
|
|
1213
913
|
// so we run the FIPS algorithm four times, bringing it down to 2^-80. We
|
|
1214
|
-
// should just adjust the retry limit, but FIPS 186-
|
|
914
|
+
// should just adjust the retry limit, but FIPS 186-5 prescribes that value
|
|
1215
915
|
// and thus results in unnecessary complexity.
|
|
1216
916
|
int failures = 0;
|
|
1217
917
|
do {
|
|
1218
918
|
ERR_clear_error();
|
|
1219
919
|
// Generate into scratch space, to avoid leaving partial work on failure.
|
|
1220
|
-
tmp
|
|
1221
|
-
if (tmp ==
|
|
1222
|
-
|
|
920
|
+
tmp.reset(FromOpaque(RSA_new()));
|
|
921
|
+
if (tmp == nullptr) {
|
|
922
|
+
return 0;
|
|
1223
923
|
}
|
|
1224
924
|
|
|
1225
|
-
if (rsa_generate_key_impl(tmp, bits, e_value, cb)) {
|
|
925
|
+
if (rsa_generate_key_impl(tmp.get(), bits, e_value, cb)) {
|
|
1226
926
|
break;
|
|
1227
927
|
}
|
|
1228
928
|
|
|
1229
|
-
|
|
1230
|
-
RSA_free(tmp);
|
|
1231
|
-
tmp = NULL;
|
|
929
|
+
tmp = nullptr;
|
|
1232
930
|
failures++;
|
|
1233
931
|
|
|
1234
|
-
// Only retry on
|
|
1235
|
-
// failure in
|
|
1236
|
-
} while (failures < 4 &&
|
|
1237
|
-
|
|
932
|
+
// Only retry on `RSA_R_TOO_MANY_ITERATIONS`. This is so a caller-induced
|
|
933
|
+
// failure in `BN_GENCB_call` is still fatal.
|
|
934
|
+
} while (failures < 4 && ERR_equals(ERR_peek_error(), ERR_LIB_RSA,
|
|
935
|
+
RSA_R_TOO_MANY_ITERATIONS));
|
|
1238
936
|
|
|
1239
|
-
if (tmp ==
|
|
1240
|
-
|
|
937
|
+
if (tmp == nullptr || (check_fips && !RSA_check_fips(tmp.get()))) {
|
|
938
|
+
return 0;
|
|
1241
939
|
}
|
|
1242
940
|
|
|
1243
941
|
rsa_invalidate_key(rsa);
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
942
|
+
rsa->n = std::move(tmp->n);
|
|
943
|
+
rsa->e = std::move(tmp->e);
|
|
944
|
+
rsa->d = std::move(tmp->d);
|
|
945
|
+
rsa->p = std::move(tmp->p);
|
|
946
|
+
rsa->q = std::move(tmp->q);
|
|
947
|
+
rsa->dmp1 = std::move(tmp->dmp1);
|
|
948
|
+
rsa->dmq1 = std::move(tmp->dmq1);
|
|
949
|
+
rsa->iqmp = std::move(tmp->iqmp);
|
|
950
|
+
rsa->mont_n = std::move(tmp->mont_n);
|
|
951
|
+
rsa->mont_p = std::move(tmp->mont_p);
|
|
952
|
+
rsa->mont_q = std::move(tmp->mont_q);
|
|
953
|
+
rsa->d_fixed = std::move(tmp->d_fixed);
|
|
954
|
+
rsa->dmp1_fixed = std::move(tmp->dmp1_fixed);
|
|
955
|
+
rsa->dmq1_fixed = std::move(tmp->dmq1_fixed);
|
|
956
|
+
rsa->iqmp_mont = std::move(tmp->iqmp_mont);
|
|
1259
957
|
rsa->private_key_frozen = tmp->private_key_frozen;
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
out:
|
|
1263
|
-
RSA_free(tmp);
|
|
1264
|
-
return ret;
|
|
958
|
+
return 1;
|
|
1265
959
|
}
|
|
1266
960
|
|
|
1267
961
|
int RSA_generate_key_ex(RSA *rsa, int bits, const BIGNUM *e_value,
|
|
1268
962
|
BN_GENCB *cb) {
|
|
1269
|
-
return RSA_generate_key_ex_maybe_fips(rsa, bits, e_value, cb,
|
|
963
|
+
return RSA_generate_key_ex_maybe_fips(FromOpaque(rsa), bits, e_value, cb,
|
|
1270
964
|
/*check_fips=*/0);
|
|
1271
965
|
}
|
|
1272
966
|
|
|
1273
967
|
int RSA_generate_key_fips(RSA *rsa, int bits, BN_GENCB *cb) {
|
|
1274
|
-
// FIPS 186-4
|
|
968
|
+
// FIPS 186-4 allowed 2048-bit and 3072-bit RSA keys (1024-bit and 1536-bit
|
|
1275
969
|
// primes, respectively) with the prime generation method we use.
|
|
1276
970
|
// Subsequently, IG A.14 stated that larger modulus sizes can be used and ACVP
|
|
1277
|
-
// testing supports 4096 bits
|
|
971
|
+
// testing supports 4096 bits, and FIPS 186-5 allowed all key sizes at least
|
|
972
|
+
// 2048.
|
|
1278
973
|
if (bits != 2048 && bits != 3072 && bits != 4096) {
|
|
1279
974
|
OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_RSA_PARAMETERS);
|
|
1280
975
|
return 0;
|
|
1281
976
|
}
|
|
1282
977
|
|
|
1283
978
|
BIGNUM *e = BN_new();
|
|
1284
|
-
int ret = e !=
|
|
1285
|
-
RSA_generate_key_ex_maybe_fips(rsa, bits, e, cb,
|
|
979
|
+
int ret = e != nullptr && BN_set_word(e, RSA_F4) &&
|
|
980
|
+
RSA_generate_key_ex_maybe_fips(FromOpaque(rsa), bits, e, cb,
|
|
981
|
+
/*check_fips=*/1);
|
|
1286
982
|
BN_free(e);
|
|
1287
983
|
|
|
1288
984
|
if (ret) {
|
|
@@ -1291,10 +987,14 @@ int RSA_generate_key_fips(RSA *rsa, int bits, BN_GENCB *cb) {
|
|
|
1291
987
|
return ret;
|
|
1292
988
|
}
|
|
1293
989
|
|
|
990
|
+
BSSL_NAMESPACE_BEGIN
|
|
991
|
+
|
|
1294
992
|
DEFINE_METHOD_FUNCTION(RSA_METHOD, RSA_default_method) {
|
|
1295
993
|
// All of the methods are NULL to make it easier for the compiler/linker to
|
|
1296
994
|
// drop unused functions. The wrapper functions will select the appropriate
|
|
1297
|
-
//
|
|
995
|
+
// `rsa_default_*` implementation.
|
|
1298
996
|
OPENSSL_memset(out, 0, sizeof(RSA_METHOD));
|
|
1299
997
|
out->common.is_static = 1;
|
|
1300
998
|
}
|
|
999
|
+
|
|
1000
|
+
BSSL_NAMESPACE_END
|