grpc-flamingo 1.11.0 → 1.15.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Makefile +1150 -176
- data/etc/roots.pem +40 -196
- data/include/grpc/grpc.h +49 -8
- data/include/grpc/grpc_security.h +123 -2
- data/include/grpc/grpc_security_constants.h +6 -0
- data/include/grpc/impl/codegen/fork.h +4 -4
- data/include/grpc/impl/codegen/grpc_types.h +26 -5
- data/include/grpc/impl/codegen/log.h +112 -0
- data/include/grpc/impl/codegen/port_platform.h +55 -4
- data/include/grpc/module.modulemap +2 -0
- data/include/grpc/support/log.h +2 -80
- data/include/grpc/support/string_util.h +2 -0
- data/include/grpc/support/sync.h +0 -16
- data/src/boringssl/err_data.c +602 -588
- data/src/core/ext/{census → filters/census}/grpc_context.cc +0 -0
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +1 -1
- data/src/core/ext/filters/client_channel/client_channel.cc +1234 -1070
- data/src/core/ext/filters/client_channel/client_channel.h +5 -0
- data/src/core/ext/filters/client_channel/client_channel_channelz.cc +113 -0
- data/src/core/ext/filters/client_channel/client_channel_channelz.h +71 -0
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +9 -0
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
- data/src/core/ext/filters/client_channel/http_proxy.cc +22 -5
- data/src/core/ext/filters/client_channel/lb_policy.cc +2 -2
- data/src/core/ext/filters/client_channel/lb_policy.h +30 -10
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +11 -9
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +120 -127
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +36 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +36 -102
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +37 -32
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +25 -22
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +4 -2
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/duration.pb.c +19 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/duration.pb.h +54 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/timestamp.pb.c +19 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/timestamp.pb.h +54 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +4 -17
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +37 -63
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +306 -239
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +444 -392
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +538 -98
- data/src/core/ext/filters/client_channel/lb_policy_factory.cc +8 -0
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +4 -0
- data/src/core/ext/filters/client_channel/method_params.h +4 -0
- data/src/core/ext/filters/client_channel/resolver.h +10 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +36 -19
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +320 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +62 -9
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +49 -294
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +537 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +112 -87
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +17 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +6 -5
- data/src/core/ext/filters/{load_reporting/server_load_reporting_filter.h → client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc} +7 -8
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +29 -0
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +32 -15
- data/src/core/ext/filters/client_channel/retry_throttle.h +4 -0
- data/src/core/ext/filters/client_channel/subchannel.cc +58 -15
- data/src/core/ext/filters/client_channel/subchannel.h +11 -0
- data/src/core/ext/filters/deadline/deadline_filter.cc +18 -15
- data/src/core/ext/filters/deadline/deadline_filter.h +5 -5
- data/src/core/ext/filters/http/client/http_client_filter.cc +10 -9
- data/src/core/ext/filters/http/client_authority_filter.cc +6 -5
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +6 -6
- data/src/core/ext/filters/http/server/http_server_filter.cc +123 -131
- data/src/core/ext/filters/http/server/http_server_filter.h +1 -1
- data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +1 -1
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +1 -1
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +3 -2
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +9 -8
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +97 -48
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +10 -7
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +3 -3
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +12 -8
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -3
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/hpack_table.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/parsing.cc +14 -12
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +3 -3
- data/src/core/ext/transport/chttp2/transport/writing.cc +32 -27
- data/src/core/ext/transport/inproc/inproc_transport.cc +87 -49
- data/src/core/lib/channel/channel_args.cc +28 -0
- data/src/core/lib/channel/channel_args.h +4 -0
- data/src/core/lib/channel/channel_stack.cc +22 -29
- data/src/core/lib/channel/channel_stack.h +2 -2
- data/src/core/lib/channel/channel_stack_builder.cc +0 -3
- data/src/core/lib/channel/channel_stack_builder.h +0 -2
- data/src/core/lib/channel/channel_trace.cc +28 -63
- data/src/core/lib/channel/channel_trace.h +13 -17
- data/src/core/lib/channel/channelz.cc +153 -0
- data/src/core/lib/channel/channelz.h +133 -0
- data/src/core/lib/channel/channelz_registry.cc +145 -0
- data/src/core/lib/channel/channelz_registry.h +120 -0
- data/src/core/lib/channel/connected_channel.cc +8 -1
- data/src/core/lib/channel/handshaker.cc +71 -0
- data/src/core/lib/channel/handshaker.h +4 -0
- data/src/core/lib/debug/stats.h +7 -0
- data/src/core/lib/debug/stats_data.cc +5 -0
- data/src/core/lib/debug/stats_data.h +120 -0
- data/src/core/lib/debug/trace.cc +2 -1
- data/src/core/lib/debug/trace.h +12 -1
- data/src/core/lib/gpr/alloc.h +28 -0
- data/src/core/lib/gpr/arena.cc +38 -45
- data/src/core/lib/gpr/log.cc +8 -2
- data/src/core/lib/gpr/log_android.cc +4 -0
- data/src/core/lib/gpr/log_linux.cc +4 -0
- data/src/core/lib/gpr/log_posix.cc +4 -0
- data/src/core/lib/gpr/log_windows.cc +5 -0
- data/src/core/lib/gpr/string.cc +28 -0
- data/src/core/lib/gpr/string.h +10 -0
- data/src/core/lib/gprpp/abstract.h +5 -2
- data/src/core/lib/gprpp/fork.cc +268 -0
- data/src/core/lib/gprpp/fork.h +88 -0
- data/src/core/lib/gprpp/inlined_vector.h +87 -37
- data/src/core/lib/gprpp/memory.h +12 -0
- data/src/core/lib/gprpp/mutex_lock.h +42 -0
- data/src/core/lib/gprpp/orphanable.h +10 -12
- data/src/core/lib/gprpp/ref_counted.h +10 -12
- data/src/core/lib/gprpp/ref_counted_ptr.h +65 -8
- data/src/core/lib/gprpp/thd.h +0 -3
- data/src/core/lib/gprpp/thd_posix.cc +5 -54
- data/src/core/lib/gprpp/thd_windows.cc +0 -7
- data/src/core/lib/http/httpcli_security_connector.cc +1 -3
- data/src/core/lib/iomgr/call_combiner.cc +13 -13
- data/src/core/lib/iomgr/call_combiner.h +84 -1
- data/src/core/lib/iomgr/closure.h +6 -5
- data/src/core/lib/iomgr/combiner.cc +30 -13
- data/src/core/lib/iomgr/combiner.h +1 -1
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -2
- data/src/core/lib/iomgr/error.cc +12 -0
- data/src/core/lib/iomgr/error.h +5 -0
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +138 -51
- data/src/core/lib/iomgr/ev_epollex_linux.cc +276 -93
- data/src/core/lib/iomgr/ev_epollsig_linux.cc +58 -50
- data/src/core/lib/iomgr/ev_poll_posix.cc +163 -42
- data/src/core/lib/iomgr/ev_posix.cc +88 -24
- data/src/core/lib/iomgr/ev_posix.h +48 -12
- data/src/core/lib/iomgr/exec_ctx.cc +15 -9
- data/src/core/lib/iomgr/exec_ctx.h +48 -20
- data/src/core/lib/iomgr/executor.cc +274 -142
- data/src/core/lib/iomgr/executor.h +82 -16
- data/src/core/lib/iomgr/fork_posix.cc +42 -19
- data/src/core/lib/iomgr/iocp_windows.cc +9 -4
- data/src/core/lib/iomgr/iomgr.cc +2 -0
- data/src/core/lib/iomgr/iomgr.h +5 -0
- data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
- data/src/core/lib/iomgr/is_epollexclusive_available.cc +1 -0
- data/src/core/lib/iomgr/lockfree_event.cc +5 -1
- data/src/core/lib/iomgr/polling_entity.cc +11 -2
- data/src/core/lib/iomgr/pollset_custom.cc +2 -2
- data/src/core/lib/iomgr/port.h +51 -1
- data/src/core/lib/iomgr/resolve_address.h +1 -1
- data/src/core/lib/iomgr/resolve_address_posix.cc +4 -3
- data/src/core/lib/iomgr/resolve_address_windows.cc +3 -2
- data/src/core/lib/iomgr/resource_quota.cc +89 -12
- data/src/core/lib/iomgr/resource_quota.h +16 -0
- data/src/core/lib/iomgr/sockaddr_posix.h +1 -1
- data/src/core/lib/iomgr/socket_factory_posix.cc +1 -1
- data/src/core/lib/iomgr/socket_mutator.cc +1 -1
- data/src/core/lib/iomgr/socket_mutator.h +1 -1
- data/src/core/lib/iomgr/socket_utils.h +9 -0
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +29 -1
- data/src/core/lib/iomgr/socket_utils_linux.cc +0 -1
- data/src/core/lib/iomgr/socket_utils_posix.cc +2 -3
- data/src/core/lib/iomgr/socket_utils_posix.h +3 -0
- data/src/core/lib/iomgr/socket_utils_uv.cc +4 -0
- data/src/core/lib/iomgr/socket_utils_windows.cc +4 -0
- data/src/core/lib/iomgr/socket_windows.cc +33 -0
- data/src/core/lib/iomgr/socket_windows.h +6 -0
- data/src/core/lib/iomgr/tcp_client_custom.cc +5 -5
- data/src/core/lib/iomgr/tcp_client_posix.cc +10 -11
- data/src/core/lib/iomgr/tcp_custom.cc +11 -11
- data/src/core/lib/iomgr/tcp_posix.cc +49 -36
- data/src/core/lib/iomgr/tcp_server_custom.cc +5 -5
- data/src/core/lib/iomgr/tcp_server_posix.cc +16 -36
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +17 -5
- data/src/core/lib/iomgr/tcp_server_windows.cc +1 -0
- data/src/core/lib/iomgr/tcp_uv.cc +3 -0
- data/src/core/lib/iomgr/tcp_windows.cc +18 -2
- data/src/core/lib/iomgr/tcp_windows.h +2 -0
- data/src/core/lib/iomgr/timer.h +4 -3
- data/src/core/lib/iomgr/timer_generic.cc +133 -51
- data/src/core/lib/iomgr/timer_manager.cc +12 -14
- data/src/core/lib/iomgr/timer_uv.cc +3 -0
- data/src/core/lib/iomgr/udp_server.cc +106 -52
- data/src/core/lib/iomgr/udp_server.h +8 -4
- data/src/core/lib/json/json.cc +12 -1
- data/src/core/lib/json/json.h +5 -0
- data/src/core/lib/profiling/basic_timers.cc +1 -0
- data/src/core/lib/security/context/security_context.cc +8 -8
- data/src/core/lib/security/context/security_context.h +6 -2
- data/src/core/lib/security/credentials/alts/alts_credentials.h +0 -20
- data/src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc +3 -2
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +7 -7
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h +1 -38
- data/src/core/lib/security/credentials/credentials.h +1 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +89 -115
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +16 -0
- data/src/core/lib/security/credentials/jwt/json_token.h +2 -0
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +2 -0
- data/src/core/lib/security/credentials/local/local_credentials.cc +77 -0
- data/src/core/lib/security/credentials/local/local_credentials.h +40 -0
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +11 -7
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +17 -3
- data/src/core/lib/security/security_connector/alts_security_connector.cc +2 -1
- data/src/core/lib/security/security_connector/load_system_roots.h +29 -0
- data/src/core/lib/{gpr/fork.h → security/security_connector/load_system_roots_fallback.cc} +10 -13
- data/src/core/lib/security/security_connector/load_system_roots_linux.cc +165 -0
- data/src/core/lib/security/security_connector/load_system_roots_linux.h +44 -0
- data/src/core/lib/security/security_connector/local_security_connector.cc +245 -0
- data/src/core/lib/security/security_connector/local_security_connector.h +58 -0
- data/src/core/lib/security/security_connector/security_connector.cc +79 -32
- data/src/core/lib/security/security_connector/security_connector.h +5 -3
- data/src/core/lib/security/transport/client_auth_filter.cc +5 -5
- data/src/core/lib/security/transport/secure_endpoint.cc +2 -2
- data/src/core/lib/security/transport/security_handshaker.cc +7 -2
- data/src/core/lib/security/transport/server_auth_filter.cc +4 -7
- data/src/core/lib/security/util/json_util.cc +4 -0
- data/src/core/lib/slice/slice.cc +6 -2
- data/src/core/lib/slice/slice_buffer.cc +27 -7
- data/src/core/lib/slice/slice_hash_table.h +4 -0
- data/src/core/lib/slice/slice_weak_hash_table.h +4 -0
- data/src/core/lib/surface/call.cc +119 -58
- data/src/core/lib/surface/call.h +7 -0
- data/src/core/lib/surface/channel.cc +50 -18
- data/src/core/lib/surface/channel.h +4 -0
- data/src/core/lib/surface/completion_queue.cc +153 -18
- data/src/core/lib/surface/completion_queue.h +20 -2
- data/src/core/lib/surface/completion_queue_factory.cc +13 -4
- data/src/core/lib/surface/init.cc +7 -8
- data/src/core/lib/surface/init.h +0 -1
- data/src/core/lib/surface/server.cc +16 -0
- data/src/core/lib/surface/version.cc +1 -1
- data/src/core/lib/transport/bdp_estimator.cc +3 -3
- data/src/core/lib/transport/bdp_estimator.h +2 -2
- data/src/core/lib/transport/byte_stream.cc +1 -1
- data/src/core/lib/transport/connectivity_state.cc +6 -7
- data/src/core/lib/transport/service_config.cc +2 -2
- data/src/core/lib/transport/service_config.h +3 -3
- data/src/core/lib/transport/transport.cc +22 -10
- data/src/core/lib/transport/transport.h +18 -18
- data/src/core/lib/transport/transport_op_string.cc +1 -8
- data/src/core/plugin_registry/grpc_plugin_registry.cc +0 -4
- data/src/core/tsi/alts/crypt/aes_gcm.cc +2 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +19 -7
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +10 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h +2 -2
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +38 -3
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +3 -0
- data/src/core/tsi/alts/handshaker/altscontext.pb.c +0 -1
- data/src/core/tsi/alts/handshaker/altscontext.pb.h +1 -2
- data/src/core/tsi/alts/handshaker/handshaker.pb.c +0 -1
- data/src/core/tsi/alts/handshaker/handshaker.pb.h +1 -2
- data/src/core/tsi/alts/handshaker/transport_security_common.pb.c +0 -1
- data/src/core/tsi/alts/handshaker/transport_security_common.pb.h +1 -1
- data/src/core/tsi/alts/handshaker/transport_security_common_api.h +2 -2
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +47 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h +3 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +12 -11
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h +7 -2
- data/src/core/tsi/fake_transport_security.cc +1 -0
- data/src/core/tsi/grpc_shadow_boringssl.h +3006 -0
- data/src/core/tsi/local_transport_security.cc +209 -0
- data/src/core/tsi/local_transport_security.h +51 -0
- data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -0
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +5 -5
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +6 -0
- data/src/core/tsi/ssl_transport_security.cc +245 -116
- data/src/core/tsi/ssl_types.h +2 -0
- data/src/core/tsi/transport_security.cc +14 -0
- data/src/core/tsi/transport_security.h +2 -0
- data/src/core/tsi/transport_security_interface.h +11 -1
- data/src/ruby/bin/math_client.rb +17 -9
- data/src/ruby/ext/grpc/extconf.rb +1 -26
- data/src/ruby/ext/grpc/rb_channel_credentials.c +3 -3
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +42 -16
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +65 -26
- data/src/ruby/lib/grpc/generic/active_call.rb +19 -23
- data/src/ruby/lib/grpc/generic/rpc_server.rb +2 -1
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/generate_proto_ruby.sh +7 -1
- data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +4 -1
- data/src/ruby/spec/call_credentials_spec.rb +1 -1
- data/src/ruby/spec/call_spec.rb +1 -1
- data/src/ruby/spec/channel_credentials_spec.rb +1 -1
- data/src/ruby/spec/channel_spec.rb +1 -1
- data/src/ruby/spec/client_auth_spec.rb +1 -12
- data/src/ruby/spec/client_server_spec.rb +1 -1
- data/src/ruby/spec/compression_options_spec.rb +1 -1
- data/src/ruby/spec/error_sanity_spec.rb +1 -1
- data/src/ruby/spec/generic/client_stub_spec.rb +16 -4
- data/src/ruby/spec/generic/rpc_desc_spec.rb +1 -1
- data/src/ruby/spec/generic/rpc_server_pool_spec.rb +1 -1
- data/src/ruby/spec/generic/service_spec.rb +1 -1
- data/src/ruby/spec/google_rpc_status_utils_spec.rb +1 -12
- data/src/ruby/spec/pb/duplicate/codegen_spec.rb +1 -0
- data/src/ruby/spec/pb/health/checker_spec.rb +1 -1
- data/src/ruby/spec/server_credentials_spec.rb +1 -1
- data/src/ruby/spec/server_spec.rb +1 -1
- data/src/ruby/spec/spec_helper.rb +1 -0
- data/src/ruby/spec/support/services.rb +1 -1
- data/src/ruby/spec/time_consts_spec.rb +1 -1
- data/third_party/address_sorting/address_sorting.c +17 -11
- data/third_party/address_sorting/address_sorting_windows.c +43 -3
- data/third_party/address_sorting/include/address_sorting/address_sorting.h +3 -0
- data/third_party/boringssl/crypto/asn1/a_int.c +33 -28
- data/third_party/boringssl/crypto/asn1/a_mbstr.c +24 -22
- data/third_party/boringssl/crypto/asn1/a_utf8.c +13 -11
- data/third_party/boringssl/crypto/asn1/asn1_locl.h +3 -0
- data/third_party/boringssl/crypto/asn1/tasn_dec.c +40 -19
- data/third_party/boringssl/crypto/bio/fd.c +1 -0
- data/third_party/boringssl/crypto/bio/file.c +2 -0
- data/third_party/boringssl/crypto/bn_extra/convert.c +6 -5
- data/third_party/boringssl/crypto/bytestring/ber.c +1 -4
- data/third_party/boringssl/crypto/bytestring/cbb.c +116 -16
- data/third_party/boringssl/crypto/bytestring/cbs.c +151 -20
- data/third_party/boringssl/crypto/cipher_extra/e_aesccm.c +203 -0
- data/third_party/boringssl/crypto/cipher_extra/e_rc2.c +2 -0
- data/third_party/boringssl/crypto/cipher_extra/e_tls.c +1 -2
- data/third_party/boringssl/crypto/cpu-aarch64-fuchsia.c +55 -0
- data/third_party/boringssl/crypto/cpu-aarch64-linux.c +2 -1
- data/third_party/boringssl/crypto/dsa/dsa.c +16 -54
- data/third_party/boringssl/crypto/ec_extra/ec_asn1.c +9 -10
- data/third_party/boringssl/crypto/ecdh/ecdh.c +4 -3
- data/third_party/boringssl/crypto/fipsmodule/bcm.c +11 -542
- data/third_party/boringssl/crypto/fipsmodule/bn/add.c +57 -112
- data/third_party/boringssl/crypto/fipsmodule/bn/asm/x86_64-gcc.c +4 -3
- data/third_party/boringssl/crypto/fipsmodule/bn/bn.c +128 -70
- data/third_party/boringssl/crypto/fipsmodule/bn/bytes.c +32 -71
- data/third_party/boringssl/crypto/fipsmodule/bn/cmp.c +64 -118
- data/third_party/boringssl/crypto/fipsmodule/bn/div.c +284 -122
- data/third_party/boringssl/crypto/fipsmodule/bn/exponentiation.c +31 -65
- data/third_party/boringssl/crypto/fipsmodule/bn/gcd.c +274 -218
- data/third_party/boringssl/crypto/fipsmodule/bn/generic.c +2 -1
- data/third_party/boringssl/crypto/fipsmodule/bn/internal.h +187 -27
- data/third_party/boringssl/crypto/fipsmodule/bn/jacobi.c +1 -1
- data/third_party/boringssl/crypto/fipsmodule/bn/montgomery.c +124 -81
- data/third_party/boringssl/crypto/fipsmodule/bn/montgomery_inv.c +8 -30
- data/third_party/boringssl/crypto/fipsmodule/bn/mul.c +321 -347
- data/third_party/boringssl/crypto/fipsmodule/bn/prime.c +326 -66
- data/third_party/boringssl/crypto/fipsmodule/bn/random.c +77 -25
- data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.c +199 -222
- data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.h +27 -47
- data/third_party/boringssl/crypto/fipsmodule/bn/shift.c +155 -96
- data/third_party/boringssl/crypto/fipsmodule/bn/sqrt.c +1 -1
- data/third_party/boringssl/crypto/fipsmodule/cipher/e_aes.c +10 -10
- data/third_party/boringssl/crypto/fipsmodule/des/internal.h +2 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/ec.c +78 -47
- data/third_party/boringssl/crypto/fipsmodule/ec/ec_key.c +99 -163
- data/third_party/boringssl/crypto/fipsmodule/ec/ec_montgomery.c +3 -10
- data/third_party/boringssl/crypto/fipsmodule/ec/internal.h +44 -23
- data/third_party/boringssl/crypto/fipsmodule/ec/oct.c +59 -90
- data/third_party/boringssl/crypto/fipsmodule/ec/p224-64.c +38 -65
- data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64-table.h +5378 -5418
- data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.c +17 -26
- data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.h +15 -11
- data/third_party/boringssl/crypto/fipsmodule/ec/simple.c +45 -51
- data/third_party/boringssl/crypto/fipsmodule/ec/{util-64.c → util.c} +0 -5
- data/third_party/boringssl/crypto/fipsmodule/ec/wnaf.c +144 -264
- data/third_party/boringssl/crypto/fipsmodule/ecdsa/ecdsa.c +78 -62
- data/third_party/boringssl/crypto/fipsmodule/modes/ccm.c +256 -0
- data/third_party/boringssl/crypto/fipsmodule/modes/internal.h +36 -32
- data/third_party/boringssl/crypto/fipsmodule/rand/ctrdrbg.c +9 -7
- data/third_party/boringssl/crypto/fipsmodule/rsa/blinding.c +16 -40
- data/third_party/boringssl/crypto/fipsmodule/rsa/internal.h +1 -6
- data/third_party/boringssl/crypto/fipsmodule/rsa/rsa.c +57 -39
- data/third_party/boringssl/crypto/fipsmodule/rsa/rsa_impl.c +309 -142
- data/third_party/boringssl/crypto/fipsmodule/self_check/self_check.c +581 -0
- data/third_party/boringssl/crypto/fipsmodule/tls/internal.h +39 -0
- data/third_party/boringssl/crypto/fipsmodule/tls/kdf.c +165 -0
- data/third_party/boringssl/crypto/internal.h +65 -2
- data/third_party/boringssl/crypto/mem.c +0 -2
- data/third_party/boringssl/crypto/obj/obj.c +6 -73
- data/third_party/boringssl/crypto/thread_pthread.c +35 -5
- data/third_party/boringssl/crypto/x509/a_strex.c +11 -11
- data/third_party/boringssl/crypto/x509/vpm_int.h +1 -0
- data/third_party/boringssl/crypto/x509/x509_vfy.c +4 -0
- data/third_party/boringssl/crypto/x509/x509_vpm.c +44 -22
- data/third_party/boringssl/crypto/x509/x_name.c +13 -0
- data/third_party/boringssl/include/openssl/aead.h +10 -0
- data/third_party/boringssl/include/openssl/asn1.h +2 -3
- data/third_party/boringssl/include/openssl/base.h +5 -14
- data/third_party/boringssl/include/openssl/bio.h +1 -1
- data/third_party/boringssl/include/openssl/bn.h +62 -18
- data/third_party/boringssl/include/openssl/bytestring.h +53 -28
- data/third_party/boringssl/include/openssl/crypto.h +4 -0
- data/third_party/boringssl/include/openssl/ec.h +10 -4
- data/third_party/boringssl/include/openssl/ec_key.h +7 -6
- data/third_party/boringssl/include/openssl/err.h +9 -9
- data/third_party/boringssl/include/openssl/evp.h +1 -1
- data/third_party/boringssl/include/openssl/rsa.h +35 -10
- data/third_party/boringssl/include/openssl/ssl.h +167 -19
- data/third_party/boringssl/include/openssl/ssl3.h +0 -1
- data/third_party/boringssl/include/openssl/stack.h +1 -1
- data/third_party/boringssl/include/openssl/tls1.h +10 -2
- data/third_party/boringssl/include/openssl/x509.h +4 -0
- data/third_party/boringssl/include/openssl/x509v3.h +1 -0
- data/third_party/boringssl/ssl/d1_both.cc +16 -2
- data/third_party/boringssl/ssl/dtls_method.cc +1 -1
- data/third_party/boringssl/ssl/handoff.cc +285 -0
- data/third_party/boringssl/ssl/handshake.cc +26 -12
- data/third_party/boringssl/ssl/handshake_client.cc +101 -95
- data/third_party/boringssl/ssl/handshake_server.cc +14 -2
- data/third_party/boringssl/ssl/internal.h +132 -79
- data/third_party/boringssl/ssl/s3_both.cc +2 -2
- data/third_party/boringssl/ssl/s3_lib.cc +3 -1
- data/third_party/boringssl/ssl/s3_pkt.cc +0 -18
- data/third_party/boringssl/ssl/ssl_aead_ctx.cc +1 -4
- data/third_party/boringssl/ssl/ssl_asn1.cc +47 -43
- data/third_party/boringssl/ssl/ssl_cipher.cc +12 -8
- data/third_party/boringssl/ssl/ssl_key_share.cc +3 -1
- data/third_party/boringssl/ssl/ssl_lib.cc +83 -14
- data/third_party/boringssl/ssl/ssl_privkey.cc +6 -0
- data/third_party/boringssl/ssl/ssl_stat.cc +6 -6
- data/third_party/boringssl/ssl/ssl_versions.cc +12 -85
- data/third_party/boringssl/ssl/ssl_x509.cc +59 -61
- data/third_party/boringssl/ssl/t1_enc.cc +73 -124
- data/third_party/boringssl/ssl/t1_lib.cc +367 -41
- data/third_party/boringssl/ssl/tls13_both.cc +8 -0
- data/third_party/boringssl/ssl/tls13_client.cc +98 -184
- data/third_party/boringssl/ssl/tls13_enc.cc +88 -158
- data/third_party/boringssl/ssl/tls13_server.cc +91 -137
- data/third_party/boringssl/ssl/tls_method.cc +0 -17
- data/third_party/boringssl/ssl/tls_record.cc +1 -10
- data/third_party/boringssl/third_party/fiat/curve25519.c +921 -2753
- data/third_party/boringssl/third_party/fiat/curve25519_tables.h +7880 -0
- data/third_party/boringssl/third_party/fiat/internal.h +32 -20
- data/third_party/boringssl/third_party/fiat/p256.c +1824 -0
- metadata +86 -71
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.cc +0 -253
- data/src/core/ext/filters/load_reporting/server_load_reporting_filter.cc +0 -222
- data/src/core/ext/filters/load_reporting/server_load_reporting_plugin.cc +0 -71
- data/src/core/ext/filters/load_reporting/server_load_reporting_plugin.h +0 -61
- data/src/core/lib/channel/channel_trace_registry.cc +0 -80
- data/src/core/lib/channel/channel_trace_registry.h +0 -43
- data/src/core/lib/gpr/fork.cc +0 -78
- data/src/core/tsi/transport_security_adapter.cc +0 -235
- data/src/core/tsi/transport_security_adapter.h +0 -41
- data/src/ruby/bin/apis/google/protobuf/empty.rb +0 -29
- data/src/ruby/bin/apis/pubsub_demo.rb +0 -241
- data/src/ruby/bin/apis/tech/pubsub/proto/pubsub.rb +0 -159
- data/src/ruby/bin/apis/tech/pubsub/proto/pubsub_services.rb +0 -88
- data/src/ruby/pb/test/client.rb +0 -764
- data/src/ruby/pb/test/server.rb +0 -252
- data/src/ruby/spec/pb/package_with_underscore/checker_spec.rb +0 -54
- data/src/ruby/spec/pb/package_with_underscore/data.proto +0 -23
- data/src/ruby/spec/pb/package_with_underscore/service.proto +0 -23
- data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +0 -247
- data/third_party/boringssl/crypto/fipsmodule/ec/p256-64.c +0 -1674
@@ -71,7 +71,7 @@ uint64_t bn_mont_n0(const BIGNUM *n) {
|
|
71
71
|
// |BN_MONT_CTX_N0_LIMBS| limbs of |n|.
|
72
72
|
uint64_t n_mod_r = n->d[0];
|
73
73
|
#if BN_MONT_CTX_N0_LIMBS == 2
|
74
|
-
if (n->
|
74
|
+
if (n->width > 1) {
|
75
75
|
n_mod_r |= (uint64_t)n->d[1] << BN_BITS2;
|
76
76
|
}
|
77
77
|
#endif
|
@@ -159,10 +159,8 @@ static uint64_t bn_neg_inv_mod_r_u64(uint64_t n) {
|
|
159
159
|
return v;
|
160
160
|
}
|
161
161
|
|
162
|
-
|
163
|
-
|
164
|
-
// odd.
|
165
|
-
int bn_mod_exp_base_2_vartime(BIGNUM *r, unsigned p, const BIGNUM *n) {
|
162
|
+
int bn_mod_exp_base_2_consttime(BIGNUM *r, unsigned p, const BIGNUM *n,
|
163
|
+
BN_CTX *ctx) {
|
166
164
|
assert(!BN_is_zero(n));
|
167
165
|
assert(!BN_is_negative(n));
|
168
166
|
assert(BN_is_odd(n));
|
@@ -171,37 +169,17 @@ int bn_mod_exp_base_2_vartime(BIGNUM *r, unsigned p, const BIGNUM *n) {
|
|
171
169
|
|
172
170
|
unsigned n_bits = BN_num_bits(n);
|
173
171
|
assert(n_bits != 0);
|
172
|
+
assert(p > n_bits);
|
174
173
|
if (n_bits == 1) {
|
175
174
|
return 1;
|
176
175
|
}
|
177
176
|
|
178
|
-
// Set |r| to the
|
179
|
-
|
180
|
-
if (!BN_set_bit(r, n_bits)
|
181
|
-
|
182
|
-
}
|
183
|
-
|
184
|
-
// Unconditionally reduce |r|.
|
185
|
-
assert(BN_cmp(r, n) > 0);
|
186
|
-
if (!BN_usub(r, r, n)) {
|
177
|
+
// Set |r| to the larger power of two smaller than |n|, then shift with
|
178
|
+
// reductions the rest of the way.
|
179
|
+
if (!BN_set_bit(r, n_bits - 1) ||
|
180
|
+
!bn_mod_lshift_consttime(r, r, p - (n_bits - 1), n, ctx)) {
|
187
181
|
return 0;
|
188
182
|
}
|
189
|
-
assert(BN_cmp(r, n) < 0);
|
190
|
-
|
191
|
-
for (unsigned i = n_bits; i < p; ++i) {
|
192
|
-
// This is like |BN_mod_lshift1_quick| except using |BN_usub|.
|
193
|
-
//
|
194
|
-
// TODO: Replace this with the use of a constant-time variant of
|
195
|
-
// |BN_mod_lshift1_quick|.
|
196
|
-
if (!BN_lshift1(r, r)) {
|
197
|
-
return 0;
|
198
|
-
}
|
199
|
-
if (BN_cmp(r, n) >= 0) {
|
200
|
-
if (!BN_usub(r, r, n)) {
|
201
|
-
return 0;
|
202
|
-
}
|
203
|
-
}
|
204
|
-
}
|
205
183
|
|
206
184
|
return 1;
|
207
185
|
}
|
@@ -61,6 +61,7 @@
|
|
61
61
|
|
62
62
|
#include <openssl/err.h>
|
63
63
|
#include <openssl/mem.h>
|
64
|
+
#include <openssl/type_check.h>
|
64
65
|
|
65
66
|
#include "internal.h"
|
66
67
|
#include "../../internal.h"
|
@@ -70,6 +71,13 @@
|
|
70
71
|
#define BN_SQR_RECURSIVE_SIZE_NORMAL BN_MUL_RECURSIVE_SIZE_NORMAL
|
71
72
|
|
72
73
|
|
74
|
+
static void bn_abs_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b,
|
75
|
+
size_t num, BN_ULONG *tmp) {
|
76
|
+
BN_ULONG borrow = bn_sub_words(tmp, a, b, num);
|
77
|
+
bn_sub_words(r, b, a, num);
|
78
|
+
bn_select_words(r, 0 - borrow, r /* tmp < 0 */, tmp /* tmp >= 0 */, num);
|
79
|
+
}
|
80
|
+
|
73
81
|
static void bn_mul_normal(BN_ULONG *r, const BN_ULONG *a, size_t na,
|
74
82
|
const BN_ULONG *b, size_t nb) {
|
75
83
|
if (na < nb) {
|
@@ -279,25 +287,61 @@ BN_ULONG bn_sub_part_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b,
|
|
279
287
|
int cl, int dl);
|
280
288
|
#endif
|
281
289
|
|
290
|
+
// bn_abs_sub_part_words computes |r| = |a| - |b|, storing the absolute value
|
291
|
+
// and returning a mask of all ones if the result was negative and all zeros if
|
292
|
+
// the result was positive. |cl| and |dl| follow the |bn_sub_part_words| calling
|
293
|
+
// convention.
|
294
|
+
//
|
295
|
+
// TODO(davidben): Make this take |size_t|. The |cl| + |dl| calling convention
|
296
|
+
// is confusing. The trouble is 32-bit x86 implements |bn_sub_part_words| in
|
297
|
+
// assembly, but we can probably just delete it?
|
298
|
+
static BN_ULONG bn_abs_sub_part_words(BN_ULONG *r, const BN_ULONG *a,
|
299
|
+
const BN_ULONG *b, int cl, int dl,
|
300
|
+
BN_ULONG *tmp) {
|
301
|
+
BN_ULONG borrow = bn_sub_part_words(tmp, a, b, cl, dl);
|
302
|
+
bn_sub_part_words(r, b, a, cl, -dl);
|
303
|
+
int r_len = cl + (dl < 0 ? -dl : dl);
|
304
|
+
borrow = 0 - borrow;
|
305
|
+
bn_select_words(r, borrow, r /* tmp < 0 */, tmp /* tmp >= 0 */, r_len);
|
306
|
+
return borrow;
|
307
|
+
}
|
308
|
+
|
309
|
+
int bn_abs_sub_consttime(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
|
310
|
+
BN_CTX *ctx) {
|
311
|
+
int cl = a->width < b->width ? a->width : b->width;
|
312
|
+
int dl = a->width - b->width;
|
313
|
+
int r_len = a->width < b->width ? b->width : a->width;
|
314
|
+
BN_CTX_start(ctx);
|
315
|
+
BIGNUM *tmp = BN_CTX_get(ctx);
|
316
|
+
int ok = tmp != NULL &&
|
317
|
+
bn_wexpand(r, r_len) &&
|
318
|
+
bn_wexpand(tmp, r_len);
|
319
|
+
if (ok) {
|
320
|
+
bn_abs_sub_part_words(r->d, a->d, b->d, cl, dl, tmp->d);
|
321
|
+
r->width = r_len;
|
322
|
+
}
|
323
|
+
BN_CTX_end(ctx);
|
324
|
+
return ok;
|
325
|
+
}
|
326
|
+
|
282
327
|
// Karatsuba recursive multiplication algorithm
|
283
328
|
// (cf. Knuth, The Art of Computer Programming, Vol. 2)
|
284
329
|
|
285
|
-
// r
|
286
|
-
// a
|
287
|
-
// n2 must be a power of
|
288
|
-
//
|
289
|
-
//
|
290
|
-
//
|
291
|
-
//
|
292
|
-
//
|
293
|
-
// a[1]*b[1]
|
294
|
-
// dnX may not be positive, but n2/2+dnX has to be
|
330
|
+
// bn_mul_recursive sets |r| to |a| * |b|, using |t| as scratch space. |r| has
|
331
|
+
// length 2*|n2|, |a| has length |n2| + |dna|, |b| has length |n2| + |dnb|, and
|
332
|
+
// |t| has length 4*|n2|. |n2| must be a power of two. Finally, we must have
|
333
|
+
// -|BN_MUL_RECURSIVE_SIZE_NORMAL|/2 <= |dna| <= 0 and
|
334
|
+
// -|BN_MUL_RECURSIVE_SIZE_NORMAL|/2 <= |dnb| <= 0.
|
335
|
+
//
|
336
|
+
// TODO(davidben): Simplify and |size_t| the calling convention around lengths
|
337
|
+
// here.
|
295
338
|
static void bn_mul_recursive(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b,
|
296
339
|
int n2, int dna, int dnb, BN_ULONG *t) {
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
340
|
+
// |n2| is a power of two.
|
341
|
+
assert(n2 != 0 && (n2 & (n2 - 1)) == 0);
|
342
|
+
// Check |dna| and |dnb| are in range.
|
343
|
+
assert(-BN_MUL_RECURSIVE_SIZE_NORMAL/2 <= dna && dna <= 0);
|
344
|
+
assert(-BN_MUL_RECURSIVE_SIZE_NORMAL/2 <= dnb && dnb <= 0);
|
301
345
|
|
302
346
|
// Only call bn_mul_comba 8 if n2 == 8 and the
|
303
347
|
// two arrays are complete [steve]
|
@@ -309,276 +353,212 @@ static void bn_mul_recursive(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b,
|
|
309
353
|
// Else do normal multiply
|
310
354
|
if (n2 < BN_MUL_RECURSIVE_SIZE_NORMAL) {
|
311
355
|
bn_mul_normal(r, a, n2 + dna, b, n2 + dnb);
|
312
|
-
if (
|
356
|
+
if (dna + dnb < 0) {
|
313
357
|
OPENSSL_memset(&r[2 * n2 + dna + dnb], 0,
|
314
358
|
sizeof(BN_ULONG) * -(dna + dnb));
|
315
359
|
}
|
316
360
|
return;
|
317
361
|
}
|
318
362
|
|
319
|
-
//
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
case 2:
|
342
|
-
bn_sub_part_words(t, a, &(a[n]), tna, n - tna); // +
|
343
|
-
bn_sub_part_words(&(t[n]), b, &(b[n]), tnb, n - tnb); // -
|
344
|
-
neg = 1;
|
345
|
-
break;
|
346
|
-
case 3:
|
347
|
-
zero = 1;
|
348
|
-
break;
|
349
|
-
case 4:
|
350
|
-
bn_sub_part_words(t, a, &(a[n]), tna, n - tna);
|
351
|
-
bn_sub_part_words(&(t[n]), &(b[n]), b, tnb, tnb - n);
|
352
|
-
break;
|
353
|
-
}
|
354
|
-
|
363
|
+
// Split |a| and |b| into a0,a1 and b0,b1, where a0 and b0 have size |n|.
|
364
|
+
// Split |t| into t0,t1,t2,t3, each of size |n|, with the remaining 4*|n| used
|
365
|
+
// for recursive calls.
|
366
|
+
// Split |r| into r0,r1,r2,r3. We must contribute a0*b0 to r0,r1, a0*a1+b0*b1
|
367
|
+
// to r1,r2, and a1*b1 to r2,r3. The middle term we will compute as:
|
368
|
+
//
|
369
|
+
// a0*a1 + b0*b1 = (a0 - a1)*(b1 - b0) + a1*b1 + a0*b0
|
370
|
+
//
|
371
|
+
// Note that we know |n| >= |BN_MUL_RECURSIVE_SIZE_NORMAL|/2 above, so
|
372
|
+
// |tna| and |tnb| are non-negative.
|
373
|
+
int n = n2 / 2, tna = n + dna, tnb = n + dnb;
|
374
|
+
|
375
|
+
// t0 = a0 - a1 and t1 = b1 - b0. The result will be multiplied, so we XOR
|
376
|
+
// their sign masks, giving the sign of (a0 - a1)*(b1 - b0). t0 and t1
|
377
|
+
// themselves store the absolute value.
|
378
|
+
BN_ULONG neg = bn_abs_sub_part_words(t, a, &a[n], tna, n - tna, &t[n2]);
|
379
|
+
neg ^= bn_abs_sub_part_words(&t[n], &b[n], b, tnb, tnb - n, &t[n2]);
|
380
|
+
|
381
|
+
// Compute:
|
382
|
+
// t2,t3 = t0 * t1 = |(a0 - a1)*(b1 - b0)|
|
383
|
+
// r0,r1 = a0 * b0
|
384
|
+
// r2,r3 = a1 * b1
|
355
385
|
if (n == 4 && dna == 0 && dnb == 0) {
|
356
|
-
|
357
|
-
if (!zero) {
|
358
|
-
bn_mul_comba4(&(t[n2]), t, &(t[n]));
|
359
|
-
} else {
|
360
|
-
OPENSSL_memset(&(t[n2]), 0, 8 * sizeof(BN_ULONG));
|
361
|
-
}
|
386
|
+
bn_mul_comba4(&t[n2], t, &t[n]);
|
362
387
|
|
363
388
|
bn_mul_comba4(r, a, b);
|
364
|
-
bn_mul_comba4(&
|
389
|
+
bn_mul_comba4(&r[n2], &a[n], &b[n]);
|
365
390
|
} else if (n == 8 && dna == 0 && dnb == 0) {
|
366
|
-
|
367
|
-
if (!zero) {
|
368
|
-
bn_mul_comba8(&(t[n2]), t, &(t[n]));
|
369
|
-
} else {
|
370
|
-
OPENSSL_memset(&(t[n2]), 0, 16 * sizeof(BN_ULONG));
|
371
|
-
}
|
391
|
+
bn_mul_comba8(&t[n2], t, &t[n]);
|
372
392
|
|
373
393
|
bn_mul_comba8(r, a, b);
|
374
|
-
bn_mul_comba8(&
|
394
|
+
bn_mul_comba8(&r[n2], &a[n], &b[n]);
|
375
395
|
} else {
|
376
|
-
p = &
|
377
|
-
|
378
|
-
bn_mul_recursive(&(t[n2]), t, &(t[n]), n, 0, 0, p);
|
379
|
-
} else {
|
380
|
-
OPENSSL_memset(&(t[n2]), 0, n2 * sizeof(BN_ULONG));
|
381
|
-
}
|
396
|
+
BN_ULONG *p = &t[n2 * 2];
|
397
|
+
bn_mul_recursive(&t[n2], t, &t[n], n, 0, 0, p);
|
382
398
|
bn_mul_recursive(r, a, b, n, 0, 0, p);
|
383
|
-
bn_mul_recursive(&
|
399
|
+
bn_mul_recursive(&r[n2], &a[n], &b[n], n, dna, dnb, p);
|
384
400
|
}
|
385
401
|
|
386
|
-
//
|
387
|
-
|
388
|
-
// r[32] holds (b[1]*b[1])
|
402
|
+
// t0,t1,c = r0,r1 + r2,r3 = a0*b0 + a1*b1
|
403
|
+
BN_ULONG c = bn_add_words(t, r, &r[n2], n2);
|
389
404
|
|
390
|
-
|
405
|
+
// t2,t3,c = t0,t1,c + neg*t2,t3 = (a0 - a1)*(b1 - b0) + a1*b1 + a0*b0.
|
406
|
+
// The second term is stored as the absolute value, so we do this with a
|
407
|
+
// constant-time select.
|
408
|
+
BN_ULONG c_neg = c - bn_sub_words(&t[n2 * 2], t, &t[n2], n2);
|
409
|
+
BN_ULONG c_pos = c + bn_add_words(&t[n2], t, &t[n2], n2);
|
410
|
+
bn_select_words(&t[n2], neg, &t[n2 * 2], &t[n2], n2);
|
411
|
+
OPENSSL_COMPILE_ASSERT(sizeof(BN_ULONG) <= sizeof(crypto_word_t),
|
412
|
+
crypto_word_t_too_small);
|
413
|
+
c = constant_time_select_w(neg, c_neg, c_pos);
|
391
414
|
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
// r[10] holds (a[0]*b[0])
|
402
|
-
// r[32] holds (b[1]*b[1])
|
403
|
-
// c1 holds the carry bits
|
404
|
-
c1 += (int)(bn_add_words(&(r[n]), &(r[n]), &(t[n2]), n2));
|
405
|
-
if (c1) {
|
406
|
-
p = &(r[n + n2]);
|
407
|
-
lo = *p;
|
408
|
-
ln = lo + c1;
|
409
|
-
*p = ln;
|
410
|
-
|
411
|
-
// The overflow will stop before we over write
|
412
|
-
// words we should not overwrite
|
413
|
-
if (ln < (BN_ULONG)c1) {
|
414
|
-
do {
|
415
|
-
p++;
|
416
|
-
lo = *p;
|
417
|
-
ln = lo + 1;
|
418
|
-
*p = ln;
|
419
|
-
} while (ln == 0);
|
420
|
-
}
|
415
|
+
// We now have our three components. Add them together.
|
416
|
+
// r1,r2,c = r1,r2 + t2,t3,c
|
417
|
+
c += bn_add_words(&r[n], &r[n], &t[n2], n2);
|
418
|
+
|
419
|
+
// Propagate the carry bit to the end.
|
420
|
+
for (int i = n + n2; i < n2 + n2; i++) {
|
421
|
+
BN_ULONG old = r[i];
|
422
|
+
r[i] = old + c;
|
423
|
+
c = r[i] < old;
|
421
424
|
}
|
425
|
+
|
426
|
+
// The product should fit without carries.
|
427
|
+
assert(c == 0);
|
422
428
|
}
|
423
429
|
|
424
|
-
//
|
425
|
-
//
|
426
|
-
//
|
430
|
+
// bn_mul_part_recursive sets |r| to |a| * |b|, using |t| as scratch space. |r|
|
431
|
+
// has length 4*|n|, |a| has length |n| + |tna|, |b| has length |n| + |tnb|, and
|
432
|
+
// |t| has length 8*|n|. |n| must be a power of two. Additionally, we must have
|
433
|
+
// 0 <= tna < n and 0 <= tnb < n, and |tna| and |tnb| must differ by at most
|
434
|
+
// one.
|
435
|
+
//
|
436
|
+
// TODO(davidben): Make this take |size_t| and perhaps the actual lengths of |a|
|
437
|
+
// and |b|.
|
427
438
|
static void bn_mul_part_recursive(BN_ULONG *r, const BN_ULONG *a,
|
428
439
|
const BN_ULONG *b, int n, int tna, int tnb,
|
429
440
|
BN_ULONG *t) {
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
441
|
+
// |n| is a power of two.
|
442
|
+
assert(n != 0 && (n & (n - 1)) == 0);
|
443
|
+
// Check |tna| and |tnb| are in range.
|
444
|
+
assert(0 <= tna && tna < n);
|
445
|
+
assert(0 <= tnb && tnb < n);
|
446
|
+
assert(-1 <= tna - tnb && tna - tnb <= 1);
|
447
|
+
|
448
|
+
int n2 = n * 2;
|
434
449
|
if (n < 8) {
|
435
450
|
bn_mul_normal(r, a, n + tna, b, n + tnb);
|
451
|
+
OPENSSL_memset(r + n2 + tna + tnb, 0, n2 - tna - tnb);
|
436
452
|
return;
|
437
453
|
}
|
438
454
|
|
439
|
-
//
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
// break;
|
459
|
-
case 2:
|
460
|
-
bn_sub_part_words(t, a, &(a[n]), tna, n - tna); // +
|
461
|
-
bn_sub_part_words(&(t[n]), b, &(b[n]), tnb, n - tnb); // -
|
462
|
-
neg = 1;
|
463
|
-
break;
|
464
|
-
case 3:
|
465
|
-
// break;
|
466
|
-
case 4:
|
467
|
-
bn_sub_part_words(t, a, &(a[n]), tna, n - tna);
|
468
|
-
bn_sub_part_words(&(t[n]), &(b[n]), b, tnb, tnb - n);
|
469
|
-
break;
|
470
|
-
}
|
471
|
-
|
455
|
+
// Split |a| and |b| into a0,a1 and b0,b1, where a0 and b0 have size |n|. |a1|
|
456
|
+
// and |b1| have size |tna| and |tnb|, respectively.
|
457
|
+
// Split |t| into t0,t1,t2,t3, each of size |n|, with the remaining 4*|n| used
|
458
|
+
// for recursive calls.
|
459
|
+
// Split |r| into r0,r1,r2,r3. We must contribute a0*b0 to r0,r1, a0*a1+b0*b1
|
460
|
+
// to r1,r2, and a1*b1 to r2,r3. The middle term we will compute as:
|
461
|
+
//
|
462
|
+
// a0*a1 + b0*b1 = (a0 - a1)*(b1 - b0) + a1*b1 + a0*b0
|
463
|
+
|
464
|
+
// t0 = a0 - a1 and t1 = b1 - b0. The result will be multiplied, so we XOR
|
465
|
+
// their sign masks, giving the sign of (a0 - a1)*(b1 - b0). t0 and t1
|
466
|
+
// themselves store the absolute value.
|
467
|
+
BN_ULONG neg = bn_abs_sub_part_words(t, a, &a[n], tna, n - tna, &t[n2]);
|
468
|
+
neg ^= bn_abs_sub_part_words(&t[n], &b[n], b, tnb, tnb - n, &t[n2]);
|
469
|
+
|
470
|
+
// Compute:
|
471
|
+
// t2,t3 = t0 * t1 = |(a0 - a1)*(b1 - b0)|
|
472
|
+
// r0,r1 = a0 * b0
|
473
|
+
// r2,r3 = a1 * b1
|
472
474
|
if (n == 8) {
|
473
|
-
bn_mul_comba8(&
|
475
|
+
bn_mul_comba8(&t[n2], t, &t[n]);
|
474
476
|
bn_mul_comba8(r, a, b);
|
475
|
-
|
476
|
-
|
477
|
+
|
478
|
+
bn_mul_normal(&r[n2], &a[n], tna, &b[n], tnb);
|
479
|
+
// |bn_mul_normal| only writes |tna| + |tna| words. Zero the rest.
|
480
|
+
OPENSSL_memset(&r[n2 + tna + tnb], 0, sizeof(BN_ULONG) * (n2 - tna - tnb));
|
477
481
|
} else {
|
478
|
-
p = &
|
479
|
-
bn_mul_recursive(&
|
482
|
+
BN_ULONG *p = &t[n2 * 2];
|
483
|
+
bn_mul_recursive(&t[n2], t, &t[n], n, 0, 0, p);
|
480
484
|
bn_mul_recursive(r, a, b, n, 0, 0, p);
|
481
|
-
i = n / 2;
|
482
|
-
// If there is only a bottom half to the number,
|
483
|
-
// just do it
|
484
|
-
if (tna > tnb) {
|
485
|
-
j = tna - i;
|
486
|
-
} else {
|
487
|
-
j = tnb - i;
|
488
|
-
}
|
489
485
|
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
// eg, n == 16, i == 8 and tn == 11
|
495
|
-
bn_mul_part_recursive(&(r[n2]), &(a[n]), &(b[n]), i, tna - i, tnb - i, p);
|
496
|
-
OPENSSL_memset(&(r[n2 + tna + tnb]), 0,
|
497
|
-
sizeof(BN_ULONG) * (n2 - tna - tnb));
|
486
|
+
OPENSSL_memset(&r[n2], 0, sizeof(BN_ULONG) * n2);
|
487
|
+
if (tna < BN_MUL_RECURSIVE_SIZE_NORMAL &&
|
488
|
+
tnb < BN_MUL_RECURSIVE_SIZE_NORMAL) {
|
489
|
+
bn_mul_normal(&r[n2], &a[n], tna, &b[n], tnb);
|
498
490
|
} else {
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
i
|
507
|
-
|
508
|
-
// exclusively because difference
|
509
|
-
// between tna and tnb is 1 or 0
|
510
|
-
if (i < tna || i < tnb) {
|
511
|
-
bn_mul_part_recursive(&(r[n2]), &(a[n]), &(b[n]), i, tna - i,
|
512
|
-
tnb - i, p);
|
513
|
-
break;
|
514
|
-
} else if (i == tna || i == tnb) {
|
515
|
-
bn_mul_recursive(&(r[n2]), &(a[n]), &(b[n]), i, tna - i, tnb - i,
|
516
|
-
p);
|
517
|
-
break;
|
518
|
-
}
|
491
|
+
int i = n;
|
492
|
+
for (;;) {
|
493
|
+
i /= 2;
|
494
|
+
if (i < tna || i < tnb) {
|
495
|
+
// E.g., n == 16, i == 8 and tna == 11. |tna| and |tnb| are within one
|
496
|
+
// of each other, so if |tna| is larger and tna > i, then we know
|
497
|
+
// tnb >= i, and this call is valid.
|
498
|
+
bn_mul_part_recursive(&r[n2], &a[n], &b[n], i, tna - i, tnb - i, p);
|
499
|
+
break;
|
519
500
|
}
|
501
|
+
if (i == tna || i == tnb) {
|
502
|
+
// If there is only a bottom half to the number, just do it. We know
|
503
|
+
// the larger of |tna - i| and |tnb - i| is zero. The other is zero or
|
504
|
+
// -1 by because of |tna| and |tnb| differ by at most one.
|
505
|
+
bn_mul_recursive(&r[n2], &a[n], &b[n], i, tna - i, tnb - i, p);
|
506
|
+
break;
|
507
|
+
}
|
508
|
+
|
509
|
+
// This loop will eventually terminate when |i| falls below
|
510
|
+
// |BN_MUL_RECURSIVE_SIZE_NORMAL| because we know one of |tna| and |tnb|
|
511
|
+
// exceeds that.
|
520
512
|
}
|
521
513
|
}
|
522
514
|
}
|
523
515
|
|
524
|
-
//
|
525
|
-
|
526
|
-
// r[32] holds (b[1]*b[1])
|
516
|
+
// t0,t1,c = r0,r1 + r2,r3 = a0*b0 + a1*b1
|
517
|
+
BN_ULONG c = bn_add_words(t, r, &r[n2], n2);
|
527
518
|
|
528
|
-
|
519
|
+
// t2,t3,c = t0,t1,c + neg*t2,t3 = (a0 - a1)*(b1 - b0) + a1*b1 + a0*b0.
|
520
|
+
// The second term is stored as the absolute value, so we do this with a
|
521
|
+
// constant-time select.
|
522
|
+
BN_ULONG c_neg = c - bn_sub_words(&t[n2 * 2], t, &t[n2], n2);
|
523
|
+
BN_ULONG c_pos = c + bn_add_words(&t[n2], t, &t[n2], n2);
|
524
|
+
bn_select_words(&t[n2], neg, &t[n2 * 2], &t[n2], n2);
|
525
|
+
OPENSSL_COMPILE_ASSERT(sizeof(BN_ULONG) <= sizeof(crypto_word_t),
|
526
|
+
crypto_word_t_too_small);
|
527
|
+
c = constant_time_select_w(neg, c_neg, c_pos);
|
529
528
|
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
} else {
|
534
|
-
// Might have a carry
|
535
|
-
c1 += (int)(bn_add_words(&(t[n2]), &(t[n2]), t, n2));
|
536
|
-
}
|
537
|
-
|
538
|
-
// t[32] holds (a[0]-a[1])*(b[1]-b[0])+(a[0]*b[0])+(a[1]*b[1])
|
539
|
-
// r[10] holds (a[0]*b[0])
|
540
|
-
// r[32] holds (b[1]*b[1])
|
541
|
-
// c1 holds the carry bits
|
542
|
-
c1 += (int)(bn_add_words(&(r[n]), &(r[n]), &(t[n2]), n2));
|
543
|
-
if (c1) {
|
544
|
-
p = &(r[n + n2]);
|
545
|
-
lo = *p;
|
546
|
-
ln = lo + c1;
|
547
|
-
*p = ln;
|
548
|
-
|
549
|
-
// The overflow will stop before we over write
|
550
|
-
// words we should not overwrite
|
551
|
-
if (ln < (BN_ULONG)c1) {
|
552
|
-
do {
|
553
|
-
p++;
|
554
|
-
lo = *p;
|
555
|
-
ln = lo + 1;
|
556
|
-
*p = ln;
|
557
|
-
} while (ln == 0);
|
558
|
-
}
|
559
|
-
}
|
560
|
-
}
|
529
|
+
// We now have our three components. Add them together.
|
530
|
+
// r1,r2,c = r1,r2 + t2,t3,c
|
531
|
+
c += bn_add_words(&r[n], &r[n], &t[n2], n2);
|
561
532
|
|
562
|
-
|
563
|
-
int
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
int j = 0, k;
|
533
|
+
// Propagate the carry bit to the end.
|
534
|
+
for (int i = n + n2; i < n2 + n2; i++) {
|
535
|
+
BN_ULONG old = r[i];
|
536
|
+
r[i] = old + c;
|
537
|
+
c = r[i] < old;
|
538
|
+
}
|
569
539
|
|
570
|
-
|
571
|
-
|
540
|
+
// The product should fit without carries.
|
541
|
+
assert(c == 0);
|
542
|
+
}
|
572
543
|
|
573
|
-
|
544
|
+
// bn_mul_impl implements |BN_mul| and |bn_mul_consttime|. Note this function
|
545
|
+
// breaks |BIGNUM| invariants and may return a negative zero. This is handled by
|
546
|
+
// the callers.
|
547
|
+
static int bn_mul_impl(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
|
548
|
+
BN_CTX *ctx) {
|
549
|
+
int al = a->width;
|
550
|
+
int bl = b->width;
|
551
|
+
if (al == 0 || bl == 0) {
|
574
552
|
BN_zero(r);
|
575
553
|
return 1;
|
576
554
|
}
|
577
|
-
top = al + bl;
|
578
555
|
|
556
|
+
int ret = 0;
|
557
|
+
BIGNUM *rr;
|
579
558
|
BN_CTX_start(ctx);
|
580
|
-
if (
|
581
|
-
|
559
|
+
if (r == a || r == b) {
|
560
|
+
rr = BN_CTX_get(ctx);
|
561
|
+
if (r == NULL) {
|
582
562
|
goto err;
|
583
563
|
}
|
584
564
|
} else {
|
@@ -586,55 +566,55 @@ int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) {
|
|
586
566
|
}
|
587
567
|
rr->neg = a->neg ^ b->neg;
|
588
568
|
|
589
|
-
i = al - bl;
|
569
|
+
int i = al - bl;
|
590
570
|
if (i == 0) {
|
591
571
|
if (al == 8) {
|
592
572
|
if (!bn_wexpand(rr, 16)) {
|
593
573
|
goto err;
|
594
574
|
}
|
595
|
-
rr->
|
575
|
+
rr->width = 16;
|
596
576
|
bn_mul_comba8(rr->d, a->d, b->d);
|
597
577
|
goto end;
|
598
578
|
}
|
599
579
|
}
|
600
580
|
|
581
|
+
int top = al + bl;
|
601
582
|
static const int kMulNormalSize = 16;
|
602
583
|
if (al >= kMulNormalSize && bl >= kMulNormalSize) {
|
603
|
-
if (
|
604
|
-
|
605
|
-
|
584
|
+
if (-1 <= i && i <= 1) {
|
585
|
+
// Find the larger power of two less than or equal to the larger length.
|
586
|
+
int j;
|
606
587
|
if (i >= 0) {
|
607
588
|
j = BN_num_bits_word((BN_ULONG)al);
|
608
|
-
}
|
609
|
-
if (i == -1) {
|
589
|
+
} else {
|
610
590
|
j = BN_num_bits_word((BN_ULONG)bl);
|
611
591
|
}
|
612
592
|
j = 1 << (j - 1);
|
613
593
|
assert(j <= al || j <= bl);
|
614
|
-
|
615
|
-
t = BN_CTX_get(ctx);
|
594
|
+
BIGNUM *t = BN_CTX_get(ctx);
|
616
595
|
if (t == NULL) {
|
617
596
|
goto err;
|
618
597
|
}
|
619
598
|
if (al > j || bl > j) {
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
if (!bn_wexpand(
|
599
|
+
// We know |al| and |bl| are at most one from each other, so if al > j,
|
600
|
+
// bl >= j, and vice versa. Thus we can use |bn_mul_part_recursive|.
|
601
|
+
assert(al >= j && bl >= j);
|
602
|
+
if (!bn_wexpand(t, j * 8) ||
|
603
|
+
!bn_wexpand(rr, j * 4)) {
|
624
604
|
goto err;
|
625
605
|
}
|
626
606
|
bn_mul_part_recursive(rr->d, a->d, b->d, j, al - j, bl - j, t->d);
|
627
607
|
} else {
|
628
|
-
// al <= j
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
|
608
|
+
// al <= j && bl <= j. Additionally, we know j <= al or j <= bl, so one
|
609
|
+
// of al - j or bl - j is zero. The other, by the bound on |i| above, is
|
610
|
+
// zero or -1. Thus, we can use |bn_mul_recursive|.
|
611
|
+
if (!bn_wexpand(t, j * 4) ||
|
612
|
+
!bn_wexpand(rr, j * 2)) {
|
633
613
|
goto err;
|
634
614
|
}
|
635
615
|
bn_mul_recursive(rr->d, a->d, b->d, j, al - j, bl - j, t->d);
|
636
616
|
}
|
637
|
-
rr->
|
617
|
+
rr->width = top;
|
638
618
|
goto end;
|
639
619
|
}
|
640
620
|
}
|
@@ -642,11 +622,10 @@ int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) {
|
|
642
622
|
if (!bn_wexpand(rr, top)) {
|
643
623
|
goto err;
|
644
624
|
}
|
645
|
-
rr->
|
625
|
+
rr->width = top;
|
646
626
|
bn_mul_normal(rr->d, a->d, al, b->d, bl);
|
647
627
|
|
648
628
|
end:
|
649
|
-
bn_correct_top(rr);
|
650
629
|
if (r != rr && !BN_copy(r, rr)) {
|
651
630
|
goto err;
|
652
631
|
}
|
@@ -657,6 +636,26 @@ err:
|
|
657
636
|
return ret;
|
658
637
|
}
|
659
638
|
|
639
|
+
int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) {
|
640
|
+
if (!bn_mul_impl(r, a, b, ctx)) {
|
641
|
+
return 0;
|
642
|
+
}
|
643
|
+
|
644
|
+
// This additionally fixes any negative zeros created by |bn_mul_impl|.
|
645
|
+
bn_set_minimal_width(r);
|
646
|
+
return 1;
|
647
|
+
}
|
648
|
+
|
649
|
+
int bn_mul_consttime(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) {
|
650
|
+
// Prevent negative zeros.
|
651
|
+
if (a->neg || b->neg) {
|
652
|
+
OPENSSL_PUT_ERROR(BN, BN_R_NEGATIVE_NUMBER);
|
653
|
+
return 0;
|
654
|
+
}
|
655
|
+
|
656
|
+
return bn_mul_impl(r, a, b, ctx);
|
657
|
+
}
|
658
|
+
|
660
659
|
int bn_mul_small(BN_ULONG *r, size_t num_r, const BN_ULONG *a, size_t num_a,
|
661
660
|
const BN_ULONG *b, size_t num_b) {
|
662
661
|
if (num_r != num_a + num_b) {
|
@@ -711,25 +710,19 @@ static void bn_sqr_normal(BN_ULONG *r, const BN_ULONG *a, size_t n,
|
|
711
710
|
bn_add_words(r, r, tmp, max);
|
712
711
|
}
|
713
712
|
|
714
|
-
// r
|
715
|
-
//
|
716
|
-
//
|
717
|
-
|
718
|
-
// t must be 2*n words in size
|
719
|
-
// We calculate
|
720
|
-
// a[0]*b[0]
|
721
|
-
// a[0]*b[0]+a[1]*b[1]+(a[0]-a[1])*(b[1]-b[0])
|
722
|
-
// a[1]*b[1]
|
723
|
-
static void bn_sqr_recursive(BN_ULONG *r, const BN_ULONG *a, int n2,
|
713
|
+
// bn_sqr_recursive sets |r| to |a|^2, using |t| as scratch space. |r| has
|
714
|
+
// length 2*|n2|, |a| has length |n2|, and |t| has length 4*|n2|. |n2| must be
|
715
|
+
// a power of two.
|
716
|
+
static void bn_sqr_recursive(BN_ULONG *r, const BN_ULONG *a, size_t n2,
|
724
717
|
BN_ULONG *t) {
|
725
|
-
|
726
|
-
|
727
|
-
BN_ULONG ln, lo, *p;
|
718
|
+
// |n2| is a power of two.
|
719
|
+
assert(n2 != 0 && (n2 & (n2 - 1)) == 0);
|
728
720
|
|
729
721
|
if (n2 == 4) {
|
730
722
|
bn_sqr_comba4(r, a);
|
731
723
|
return;
|
732
|
-
}
|
724
|
+
}
|
725
|
+
if (n2 == 8) {
|
733
726
|
bn_sqr_comba8(r, a);
|
734
727
|
return;
|
735
728
|
}
|
@@ -737,63 +730,48 @@ static void bn_sqr_recursive(BN_ULONG *r, const BN_ULONG *a, int n2,
|
|
737
730
|
bn_sqr_normal(r, a, n2, t);
|
738
731
|
return;
|
739
732
|
}
|
740
|
-
// r=(a[0]-a[1])*(a[1]-a[0])
|
741
|
-
c1 = bn_cmp_words(a, &(a[n]), n);
|
742
|
-
zero = 0;
|
743
|
-
if (c1 > 0) {
|
744
|
-
bn_sub_words(t, a, &(a[n]), n);
|
745
|
-
} else if (c1 < 0) {
|
746
|
-
bn_sub_words(t, &(a[n]), a, n);
|
747
|
-
} else {
|
748
|
-
zero = 1;
|
749
|
-
}
|
750
733
|
|
751
|
-
//
|
752
|
-
|
734
|
+
// Split |a| into a0,a1, each of size |n|.
|
735
|
+
// Split |t| into t0,t1,t2,t3, each of size |n|, with the remaining 4*|n| used
|
736
|
+
// for recursive calls.
|
737
|
+
// Split |r| into r0,r1,r2,r3. We must contribute a0^2 to r0,r1, 2*a0*a1 to
|
738
|
+
// r1,r2, and a1^2 to r2,r3.
|
739
|
+
size_t n = n2 / 2;
|
740
|
+
BN_ULONG *t_recursive = &t[n2 * 2];
|
753
741
|
|
754
|
-
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
|
759
|
-
|
760
|
-
bn_sqr_recursive(
|
761
|
-
|
762
|
-
//
|
763
|
-
|
764
|
-
|
765
|
-
|
766
|
-
|
767
|
-
|
768
|
-
|
769
|
-
|
770
|
-
|
771
|
-
//
|
772
|
-
|
773
|
-
|
774
|
-
//
|
775
|
-
|
776
|
-
|
777
|
-
|
778
|
-
|
779
|
-
ln = lo + c1;
|
780
|
-
*p = ln;
|
781
|
-
|
782
|
-
// The overflow will stop before we over write
|
783
|
-
// words we should not overwrite
|
784
|
-
if (ln < (BN_ULONG)c1) {
|
785
|
-
do {
|
786
|
-
p++;
|
787
|
-
lo = *p;
|
788
|
-
ln = lo + 1;
|
789
|
-
*p = ln;
|
790
|
-
} while (ln == 0);
|
791
|
-
}
|
742
|
+
// t0 = |a0 - a1|.
|
743
|
+
bn_abs_sub_words(t, a, &a[n], n, &t[n]);
|
744
|
+
// t2,t3 = t0^2 = |a0 - a1|^2 = a0^2 - 2*a0*a1 + a1^2
|
745
|
+
bn_sqr_recursive(&t[n2], t, n, t_recursive);
|
746
|
+
|
747
|
+
// r0,r1 = a0^2
|
748
|
+
bn_sqr_recursive(r, a, n, t_recursive);
|
749
|
+
|
750
|
+
// r2,r3 = a1^2
|
751
|
+
bn_sqr_recursive(&r[n2], &a[n], n, t_recursive);
|
752
|
+
|
753
|
+
// t0,t1,c = r0,r1 + r2,r3 = a0^2 + a1^2
|
754
|
+
BN_ULONG c = bn_add_words(t, r, &r[n2], n2);
|
755
|
+
// t2,t3,c = t0,t1,c - t2,t3 = 2*a0*a1
|
756
|
+
c -= bn_sub_words(&t[n2], t, &t[n2], n2);
|
757
|
+
|
758
|
+
// We now have our three components. Add them together.
|
759
|
+
// r1,r2,c = r1,r2 + t2,t3,c
|
760
|
+
c += bn_add_words(&r[n], &r[n], &t[n2], n2);
|
761
|
+
|
762
|
+
// Propagate the carry bit to the end.
|
763
|
+
for (size_t i = n + n2; i < n2 + n2; i++) {
|
764
|
+
BN_ULONG old = r[i];
|
765
|
+
r[i] = old + c;
|
766
|
+
c = r[i] < old;
|
792
767
|
}
|
768
|
+
|
769
|
+
// The square should fit without carries.
|
770
|
+
assert(c == 0);
|
793
771
|
}
|
794
772
|
|
795
773
|
int BN_mul_word(BIGNUM *bn, BN_ULONG w) {
|
796
|
-
if (!bn->
|
774
|
+
if (!bn->width) {
|
797
775
|
return 1;
|
798
776
|
}
|
799
777
|
|
@@ -802,37 +780,34 @@ int BN_mul_word(BIGNUM *bn, BN_ULONG w) {
|
|
802
780
|
return 1;
|
803
781
|
}
|
804
782
|
|
805
|
-
BN_ULONG ll = bn_mul_words(bn->d, bn->d, bn->
|
783
|
+
BN_ULONG ll = bn_mul_words(bn->d, bn->d, bn->width, w);
|
806
784
|
if (ll) {
|
807
|
-
if (!bn_wexpand(bn, bn->
|
785
|
+
if (!bn_wexpand(bn, bn->width + 1)) {
|
808
786
|
return 0;
|
809
787
|
}
|
810
|
-
bn->d[bn->
|
788
|
+
bn->d[bn->width++] = ll;
|
811
789
|
}
|
812
790
|
|
813
791
|
return 1;
|
814
792
|
}
|
815
793
|
|
816
|
-
int
|
817
|
-
int
|
818
|
-
int ret = 0;
|
819
|
-
BIGNUM *tmp, *rr;
|
820
|
-
|
821
|
-
al = a->top;
|
794
|
+
int bn_sqr_consttime(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx) {
|
795
|
+
int al = a->width;
|
822
796
|
if (al <= 0) {
|
823
|
-
r->
|
797
|
+
r->width = 0;
|
824
798
|
r->neg = 0;
|
825
799
|
return 1;
|
826
800
|
}
|
827
801
|
|
802
|
+
int ret = 0;
|
828
803
|
BN_CTX_start(ctx);
|
829
|
-
rr = (a != r) ? r : BN_CTX_get(ctx);
|
830
|
-
tmp = BN_CTX_get(ctx);
|
804
|
+
BIGNUM *rr = (a != r) ? r : BN_CTX_get(ctx);
|
805
|
+
BIGNUM *tmp = BN_CTX_get(ctx);
|
831
806
|
if (!rr || !tmp) {
|
832
807
|
goto err;
|
833
808
|
}
|
834
809
|
|
835
|
-
max = 2 * al; // Non-zero (from above)
|
810
|
+
int max = 2 * al; // Non-zero (from above)
|
836
811
|
if (!bn_wexpand(rr, max)) {
|
837
812
|
goto err;
|
838
813
|
}
|
@@ -846,13 +821,9 @@ int BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx) {
|
|
846
821
|
BN_ULONG t[BN_SQR_RECURSIVE_SIZE_NORMAL * 2];
|
847
822
|
bn_sqr_normal(rr->d, a->d, al, t);
|
848
823
|
} else {
|
849
|
-
|
850
|
-
|
851
|
-
|
852
|
-
j = 1 << (j - 1);
|
853
|
-
k = j + j;
|
854
|
-
if (al == j) {
|
855
|
-
if (!bn_wexpand(tmp, k * 2)) {
|
824
|
+
// If |al| is a power of two, we can use |bn_sqr_recursive|.
|
825
|
+
if (al != 0 && (al & (al - 1)) == 0) {
|
826
|
+
if (!bn_wexpand(tmp, al * 4)) {
|
856
827
|
goto err;
|
857
828
|
}
|
858
829
|
bn_sqr_recursive(rr->d, a->d, al, tmp->d);
|
@@ -866,13 +837,7 @@ int BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx) {
|
|
866
837
|
}
|
867
838
|
|
868
839
|
rr->neg = 0;
|
869
|
-
|
870
|
-
// the square of 'a' will max-1 words.
|
871
|
-
if (a->d[al - 1] == (a->d[al - 1] & BN_MASK2l)) {
|
872
|
-
rr->top = max - 1;
|
873
|
-
} else {
|
874
|
-
rr->top = max;
|
875
|
-
}
|
840
|
+
rr->width = max;
|
876
841
|
|
877
842
|
if (rr != r && !BN_copy(r, rr)) {
|
878
843
|
goto err;
|
@@ -884,6 +849,15 @@ err:
|
|
884
849
|
return ret;
|
885
850
|
}
|
886
851
|
|
852
|
+
int BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx) {
|
853
|
+
if (!bn_sqr_consttime(r, a, ctx)) {
|
854
|
+
return 0;
|
855
|
+
}
|
856
|
+
|
857
|
+
bn_set_minimal_width(r);
|
858
|
+
return 1;
|
859
|
+
}
|
860
|
+
|
887
861
|
int bn_sqr_small(BN_ULONG *r, size_t num_r, const BN_ULONG *a, size_t num_a) {
|
888
862
|
if (num_r != 2 * num_a || num_a > BN_SMALL_MAX_WORDS) {
|
889
863
|
OPENSSL_PUT_ERROR(BN, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
|