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
@@ -622,8 +622,8 @@ int BN_mod_exp_mont(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
|
|
622
622
|
|
623
623
|
// Allocate a montgomery context if it was not supplied by the caller.
|
624
624
|
if (mont == NULL) {
|
625
|
-
new_mont =
|
626
|
-
if (new_mont == NULL
|
625
|
+
new_mont = BN_MONT_CTX_new_for_modulus(m, ctx);
|
626
|
+
if (new_mont == NULL) {
|
627
627
|
goto err;
|
628
628
|
}
|
629
629
|
mont = new_mont;
|
@@ -666,22 +666,7 @@ int BN_mod_exp_mont(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
|
|
666
666
|
}
|
667
667
|
}
|
668
668
|
|
669
|
-
|
670
|
-
// close to R and we subtract rather than perform Montgomery reduction.
|
671
|
-
if (m->d[m->top - 1] & (((BN_ULONG)1) << (BN_BITS2 - 1))) {
|
672
|
-
if (!bn_wexpand(r, m->top)) {
|
673
|
-
goto err;
|
674
|
-
}
|
675
|
-
// r = 2^(top*BN_BITS2) - m
|
676
|
-
r->d[0] = 0 - m->d[0];
|
677
|
-
for (int i = 1; i < m->top; i++) {
|
678
|
-
r->d[i] = ~m->d[i];
|
679
|
-
}
|
680
|
-
r->top = m->top;
|
681
|
-
// The upper words will be zero if the corresponding words of |m| were
|
682
|
-
// 0xfff[...], so call |bn_correct_top|.
|
683
|
-
bn_correct_top(r);
|
684
|
-
} else if (!BN_to_montgomery(r, BN_value_one(), mont, ctx)) {
|
669
|
+
if (!bn_one_to_montgomery(r, mont, ctx)) {
|
685
670
|
goto err;
|
686
671
|
}
|
687
672
|
|
@@ -746,8 +731,7 @@ err:
|
|
746
731
|
int bn_mod_exp_mont_small(BN_ULONG *r, size_t num_r, const BN_ULONG *a,
|
747
732
|
size_t num_a, const BN_ULONG *p, size_t num_p,
|
748
733
|
const BN_MONT_CTX *mont) {
|
749
|
-
|
750
|
-
size_t num_n = mont->N.top;
|
734
|
+
size_t num_n = mont->N.width;
|
751
735
|
if (num_n != num_a || num_n != num_r || num_n > BN_SMALL_MAX_WORDS) {
|
752
736
|
OPENSSL_PUT_ERROR(BN, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
|
753
737
|
return 0;
|
@@ -793,16 +777,7 @@ int bn_mod_exp_mont_small(BN_ULONG *r, size_t num_r, const BN_ULONG *a,
|
|
793
777
|
}
|
794
778
|
}
|
795
779
|
|
796
|
-
|
797
|
-
// close to R and we subtract rather than perform Montgomery reduction.
|
798
|
-
if (n[num_n - 1] & (((BN_ULONG)1) << (BN_BITS2 - 1))) {
|
799
|
-
// r = 2^(top*BN_BITS2) - m
|
800
|
-
r[0] = 0 - n[0];
|
801
|
-
for (size_t i = 1; i < num_n; i++) {
|
802
|
-
r[i] = ~n[i];
|
803
|
-
}
|
804
|
-
} else if (!bn_from_montgomery_small(r, num_r, mont->RR.d, mont->RR.top,
|
805
|
-
mont)) {
|
780
|
+
if (!bn_one_to_montgomery_small(r, num_r, mont)) {
|
806
781
|
goto err;
|
807
782
|
}
|
808
783
|
|
@@ -866,7 +841,7 @@ int bn_mod_inverse_prime_mont_small(BN_ULONG *r, size_t num_r,
|
|
866
841
|
const BN_ULONG *a, size_t num_a,
|
867
842
|
const BN_MONT_CTX *mont) {
|
868
843
|
const BN_ULONG *p = mont->N.d;
|
869
|
-
size_t num_p = mont->N.
|
844
|
+
size_t num_p = mont->N.width;
|
870
845
|
if (num_p > BN_SMALL_MAX_WORDS || num_p == 0) {
|
871
846
|
OPENSSL_PUT_ERROR(BN, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
|
872
847
|
return 0;
|
@@ -901,8 +876,8 @@ static void copy_to_prebuf(const BIGNUM *b, int top, unsigned char *buf,
|
|
901
876
|
const int width = 1 << window;
|
902
877
|
BN_ULONG *table = (BN_ULONG *) buf;
|
903
878
|
|
904
|
-
if (top > b->
|
905
|
-
top = b->
|
879
|
+
if (top > b->width) {
|
880
|
+
top = b->width; // this works because 'buf' is explicitly zeroed
|
906
881
|
}
|
907
882
|
|
908
883
|
for (i = 0, j = idx; i < top; i++, j += width) {
|
@@ -955,8 +930,7 @@ static int copy_from_prebuf(BIGNUM *b, int top, unsigned char *buf, int idx,
|
|
955
930
|
}
|
956
931
|
}
|
957
932
|
|
958
|
-
b->
|
959
|
-
bn_correct_top(b);
|
933
|
+
b->width = top;
|
960
934
|
return 1;
|
961
935
|
}
|
962
936
|
|
@@ -1006,8 +980,7 @@ static int copy_from_prebuf(BIGNUM *b, int top, unsigned char *buf, int idx,
|
|
1006
980
|
int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
|
1007
981
|
const BIGNUM *m, BN_CTX *ctx,
|
1008
982
|
const BN_MONT_CTX *mont) {
|
1009
|
-
int i,
|
1010
|
-
int top;
|
983
|
+
int i, ret = 0, window, wvalue;
|
1011
984
|
BN_MONT_CTX *new_mont = NULL;
|
1012
985
|
|
1013
986
|
int numPowers;
|
@@ -1022,9 +995,10 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
|
|
1022
995
|
return 0;
|
1023
996
|
}
|
1024
997
|
|
1025
|
-
|
1026
|
-
|
1027
|
-
|
998
|
+
// Use all bits stored in |p|, rather than |BN_num_bits|, so we do not leak
|
999
|
+
// whether the top bits are zero.
|
1000
|
+
int max_bits = p->width * BN_BITS2;
|
1001
|
+
int bits = max_bits;
|
1028
1002
|
if (bits == 0) {
|
1029
1003
|
// x**0 mod 1 is still zero.
|
1030
1004
|
if (BN_is_one(m)) {
|
@@ -1036,13 +1010,17 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
|
|
1036
1010
|
|
1037
1011
|
// Allocate a montgomery context if it was not supplied by the caller.
|
1038
1012
|
if (mont == NULL) {
|
1039
|
-
new_mont =
|
1040
|
-
if (new_mont == NULL
|
1013
|
+
new_mont = BN_MONT_CTX_new_for_modulus(m, ctx);
|
1014
|
+
if (new_mont == NULL) {
|
1041
1015
|
goto err;
|
1042
1016
|
}
|
1043
1017
|
mont = new_mont;
|
1044
1018
|
}
|
1045
1019
|
|
1020
|
+
// Use the width in |mont->N|, rather than the copy in |m|. The assembly
|
1021
|
+
// implementation assumes it can use |top| to size R.
|
1022
|
+
int top = mont->N.width;
|
1023
|
+
|
1046
1024
|
if (a->neg || BN_ucmp(a, m) >= 0) {
|
1047
1025
|
new_a = BN_new();
|
1048
1026
|
if (new_a == NULL ||
|
@@ -1056,15 +1034,14 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
|
|
1056
1034
|
// If the size of the operands allow it, perform the optimized
|
1057
1035
|
// RSAZ exponentiation. For further information see
|
1058
1036
|
// crypto/bn/rsaz_exp.c and accompanying assembly modules.
|
1059
|
-
if ((16 == a->
|
1037
|
+
if ((16 == a->width) && (16 == p->width) && (BN_num_bits(m) == 1024) &&
|
1060
1038
|
rsaz_avx2_eligible()) {
|
1061
1039
|
if (!bn_wexpand(rr, 16)) {
|
1062
1040
|
goto err;
|
1063
1041
|
}
|
1064
1042
|
RSAZ_1024_mod_exp_avx2(rr->d, a->d, p->d, m->d, mont->RR.d, mont->n0[0]);
|
1065
|
-
rr->
|
1043
|
+
rr->width = 16;
|
1066
1044
|
rr->neg = 0;
|
1067
|
-
bn_correct_top(rr);
|
1068
1045
|
ret = 1;
|
1069
1046
|
goto err;
|
1070
1047
|
}
|
@@ -1110,21 +1087,12 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
|
|
1110
1087
|
// lay down tmp and am right after powers table
|
1111
1088
|
tmp.d = (BN_ULONG *)(powerbuf + sizeof(m->d[0]) * top * numPowers);
|
1112
1089
|
am.d = tmp.d + top;
|
1113
|
-
tmp.
|
1090
|
+
tmp.width = am.width = 0;
|
1114
1091
|
tmp.dmax = am.dmax = top;
|
1115
1092
|
tmp.neg = am.neg = 0;
|
1116
1093
|
tmp.flags = am.flags = BN_FLG_STATIC_DATA;
|
1117
1094
|
|
1118
|
-
|
1119
|
-
// by Shay Gueron's suggestion
|
1120
|
-
if (m->d[top - 1] & (((BN_ULONG)1) << (BN_BITS2 - 1))) {
|
1121
|
-
// 2^(top*BN_BITS2) - m
|
1122
|
-
tmp.d[0] = 0 - m->d[0];
|
1123
|
-
for (i = 1; i < top; i++) {
|
1124
|
-
tmp.d[i] = ~m->d[i];
|
1125
|
-
}
|
1126
|
-
tmp.top = top;
|
1127
|
-
} else if (!BN_to_montgomery(&tmp, BN_value_one(), mont, ctx)) {
|
1095
|
+
if (!bn_one_to_montgomery(&tmp, mont, ctx)) {
|
1128
1096
|
goto err;
|
1129
1097
|
}
|
1130
1098
|
|
@@ -1148,10 +1116,10 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
|
|
1148
1116
|
|
1149
1117
|
// BN_to_montgomery can contaminate words above .top
|
1150
1118
|
// [in BN_DEBUG[_DEBUG] build]...
|
1151
|
-
for (i = am.
|
1119
|
+
for (i = am.width; i < top; i++) {
|
1152
1120
|
am.d[i] = 0;
|
1153
1121
|
}
|
1154
|
-
for (i = tmp.
|
1122
|
+
for (i = tmp.width; i < top; i++) {
|
1155
1123
|
tmp.d[i] = 0;
|
1156
1124
|
}
|
1157
1125
|
|
@@ -1161,7 +1129,7 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
|
|
1161
1129
|
}
|
1162
1130
|
|
1163
1131
|
bn_scatter5(tmp.d, top, powerbuf, 0);
|
1164
|
-
bn_scatter5(am.d, am.
|
1132
|
+
bn_scatter5(am.d, am.width, powerbuf, 1);
|
1165
1133
|
bn_mul_mont(tmp.d, am.d, am.d, np, n0, top);
|
1166
1134
|
bn_scatter5(tmp.d, top, powerbuf, 2);
|
1167
1135
|
|
@@ -1217,7 +1185,6 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
|
|
1217
1185
|
}
|
1218
1186
|
} else {
|
1219
1187
|
const uint8_t *p_bytes = (const uint8_t *)p->d;
|
1220
|
-
int max_bits = p->top * BN_BITS2;
|
1221
1188
|
assert(bits < max_bits);
|
1222
1189
|
// |p = 0| has been handled as a special case, so |max_bits| is at least
|
1223
1190
|
// one word.
|
@@ -1229,7 +1196,7 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
|
|
1229
1196
|
// here is the top bit, inclusive.
|
1230
1197
|
if (bits - 4 >= max_bits - 8) {
|
1231
1198
|
// Read five bits from |bits-4| through |bits|, inclusive.
|
1232
|
-
wvalue = p_bytes[p->
|
1199
|
+
wvalue = p_bytes[p->width * BN_BYTES - 1];
|
1233
1200
|
wvalue >>= (bits - 4) & 7;
|
1234
1201
|
wvalue &= 0x1f;
|
1235
1202
|
bits -= 5;
|
@@ -1248,8 +1215,7 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
|
|
1248
1215
|
}
|
1249
1216
|
|
1250
1217
|
ret = bn_from_montgomery(tmp.d, tmp.d, NULL, np, n0, top);
|
1251
|
-
tmp.
|
1252
|
-
bn_correct_top(&tmp);
|
1218
|
+
tmp.width = top;
|
1253
1219
|
if (ret) {
|
1254
1220
|
if (!BN_copy(rr, &tmp)) {
|
1255
1221
|
ret = 0;
|
@@ -1363,8 +1329,8 @@ int BN_mod_exp2_mont(BIGNUM *rr, const BIGNUM *a1, const BIGNUM *p1,
|
|
1363
1329
|
|
1364
1330
|
// Allocate a montgomery context if it was not supplied by the caller.
|
1365
1331
|
if (mont == NULL) {
|
1366
|
-
new_mont =
|
1367
|
-
if (new_mont == NULL
|
1332
|
+
new_mont = BN_MONT_CTX_new_for_modulus(m, ctx);
|
1333
|
+
if (new_mont == NULL) {
|
1368
1334
|
goto err;
|
1369
1335
|
}
|
1370
1336
|
mont = new_mont;
|
@@ -114,121 +114,310 @@
|
|
114
114
|
|
115
115
|
#include "internal.h"
|
116
116
|
|
117
|
-
static BIGNUM *euclid(BIGNUM *a, BIGNUM *b) {
|
118
|
-
BIGNUM *t;
|
119
|
-
int shifts = 0;
|
120
117
|
|
121
|
-
|
122
|
-
while (!BN_is_zero(b)) {
|
123
|
-
// 0 < b <= a
|
118
|
+
static BN_ULONG word_is_odd_mask(BN_ULONG a) { return (BN_ULONG)0 - (a & 1); }
|
124
119
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
if (BN_cmp(a, b) < 0) {
|
156
|
-
t = a;
|
157
|
-
a = b;
|
158
|
-
b = t;
|
159
|
-
}
|
160
|
-
} else {
|
161
|
-
// a even - b even
|
162
|
-
if (!BN_rshift1(a, a)) {
|
163
|
-
goto err;
|
164
|
-
}
|
165
|
-
if (!BN_rshift1(b, b)) {
|
166
|
-
goto err;
|
167
|
-
}
|
168
|
-
shifts++;
|
169
|
-
}
|
170
|
-
}
|
171
|
-
// 0 <= b <= a
|
120
|
+
static void maybe_rshift1_words(BN_ULONG *a, BN_ULONG mask, BN_ULONG *tmp,
|
121
|
+
size_t num) {
|
122
|
+
bn_rshift1_words(tmp, a, num);
|
123
|
+
bn_select_words(a, mask, tmp, a, num);
|
124
|
+
}
|
125
|
+
|
126
|
+
static void maybe_rshift1_words_carry(BN_ULONG *a, BN_ULONG carry,
|
127
|
+
BN_ULONG mask, BN_ULONG *tmp,
|
128
|
+
size_t num) {
|
129
|
+
maybe_rshift1_words(a, mask, tmp, num);
|
130
|
+
if (num != 0) {
|
131
|
+
carry &= mask;
|
132
|
+
a[num - 1] |= carry << (BN_BITS2-1);
|
133
|
+
}
|
134
|
+
}
|
135
|
+
|
136
|
+
static BN_ULONG maybe_add_words(BN_ULONG *a, BN_ULONG mask, const BN_ULONG *b,
|
137
|
+
BN_ULONG *tmp, size_t num) {
|
138
|
+
BN_ULONG carry = bn_add_words(tmp, a, b, num);
|
139
|
+
bn_select_words(a, mask, tmp, a, num);
|
140
|
+
return carry & mask;
|
141
|
+
}
|
142
|
+
|
143
|
+
static int bn_gcd_consttime(BIGNUM *r, unsigned *out_shift, const BIGNUM *x,
|
144
|
+
const BIGNUM *y, BN_CTX *ctx) {
|
145
|
+
size_t width = x->width > y->width ? x->width : y->width;
|
146
|
+
if (width == 0) {
|
147
|
+
*out_shift = 0;
|
148
|
+
BN_zero(r);
|
149
|
+
return 1;
|
172
150
|
}
|
173
151
|
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
152
|
+
// This is a constant-time implementation of Stein's algorithm (binary GCD).
|
153
|
+
int ret = 0;
|
154
|
+
BN_CTX_start(ctx);
|
155
|
+
BIGNUM *u = BN_CTX_get(ctx);
|
156
|
+
BIGNUM *v = BN_CTX_get(ctx);
|
157
|
+
BIGNUM *tmp = BN_CTX_get(ctx);
|
158
|
+
if (u == NULL || v == NULL || tmp == NULL ||
|
159
|
+
!BN_copy(u, x) ||
|
160
|
+
!BN_copy(v, y) ||
|
161
|
+
!bn_resize_words(u, width) ||
|
162
|
+
!bn_resize_words(v, width) ||
|
163
|
+
!bn_resize_words(tmp, width)) {
|
164
|
+
goto err;
|
165
|
+
}
|
166
|
+
|
167
|
+
// Each loop iteration halves at least one of |u| and |v|. Thus we need at
|
168
|
+
// most the combined bit width of inputs for at least one value to be zero.
|
169
|
+
unsigned x_bits = x->width * BN_BITS2, y_bits = y->width * BN_BITS2;
|
170
|
+
unsigned num_iters = x_bits + y_bits;
|
171
|
+
if (num_iters < x_bits) {
|
172
|
+
OPENSSL_PUT_ERROR(BN, BN_R_BIGNUM_TOO_LONG);
|
173
|
+
goto err;
|
178
174
|
}
|
179
175
|
|
180
|
-
|
176
|
+
unsigned shift = 0;
|
177
|
+
for (unsigned i = 0; i < num_iters; i++) {
|
178
|
+
BN_ULONG both_odd = word_is_odd_mask(u->d[0]) & word_is_odd_mask(v->d[0]);
|
179
|
+
|
180
|
+
// If both |u| and |v| are odd, subtract the smaller from the larger.
|
181
|
+
BN_ULONG u_less_than_v =
|
182
|
+
(BN_ULONG)0 - bn_sub_words(tmp->d, u->d, v->d, width);
|
183
|
+
bn_select_words(u->d, both_odd & ~u_less_than_v, tmp->d, u->d, width);
|
184
|
+
bn_sub_words(tmp->d, v->d, u->d, width);
|
185
|
+
bn_select_words(v->d, both_odd & u_less_than_v, tmp->d, v->d, width);
|
186
|
+
|
187
|
+
// At least one of |u| and |v| is now even.
|
188
|
+
BN_ULONG u_is_odd = word_is_odd_mask(u->d[0]);
|
189
|
+
BN_ULONG v_is_odd = word_is_odd_mask(v->d[0]);
|
190
|
+
assert(!(u_is_odd & v_is_odd));
|
191
|
+
|
192
|
+
// If both are even, the final GCD gains a factor of two.
|
193
|
+
shift += 1 & (~u_is_odd & ~v_is_odd);
|
194
|
+
|
195
|
+
// Halve any which are even.
|
196
|
+
maybe_rshift1_words(u->d, ~u_is_odd, tmp->d, width);
|
197
|
+
maybe_rshift1_words(v->d, ~v_is_odd, tmp->d, width);
|
198
|
+
}
|
199
|
+
|
200
|
+
// One of |u| or |v| is zero at this point. The algorithm usually makes |u|
|
201
|
+
// zero, unless |y| was already zero on input. Fix this by combining the
|
202
|
+
// values.
|
203
|
+
assert(BN_is_zero(u) || BN_is_zero(v));
|
204
|
+
for (size_t i = 0; i < width; i++) {
|
205
|
+
v->d[i] |= u->d[i];
|
206
|
+
}
|
207
|
+
|
208
|
+
*out_shift = shift;
|
209
|
+
ret = bn_set_words(r, v->d, width);
|
181
210
|
|
182
211
|
err:
|
183
|
-
|
212
|
+
BN_CTX_end(ctx);
|
213
|
+
return ret;
|
184
214
|
}
|
185
215
|
|
186
|
-
int BN_gcd(BIGNUM *r, const BIGNUM *
|
187
|
-
|
216
|
+
int BN_gcd(BIGNUM *r, const BIGNUM *x, const BIGNUM *y, BN_CTX *ctx) {
|
217
|
+
unsigned shift;
|
218
|
+
return bn_gcd_consttime(r, &shift, x, y, ctx) &&
|
219
|
+
BN_lshift(r, r, shift);
|
220
|
+
}
|
221
|
+
|
222
|
+
int bn_is_relatively_prime(int *out_relatively_prime, const BIGNUM *x,
|
223
|
+
const BIGNUM *y, BN_CTX *ctx) {
|
188
224
|
int ret = 0;
|
225
|
+
BN_CTX_start(ctx);
|
226
|
+
unsigned shift;
|
227
|
+
BIGNUM *gcd = BN_CTX_get(ctx);
|
228
|
+
if (gcd == NULL ||
|
229
|
+
!bn_gcd_consttime(gcd, &shift, x, y, ctx)) {
|
230
|
+
goto err;
|
231
|
+
}
|
232
|
+
|
233
|
+
// Check that 2^|shift| * |gcd| is one.
|
234
|
+
if (gcd->width == 0) {
|
235
|
+
*out_relatively_prime = 0;
|
236
|
+
} else {
|
237
|
+
BN_ULONG mask = shift | (gcd->d[0] ^ 1);
|
238
|
+
for (int i = 1; i < gcd->width; i++) {
|
239
|
+
mask |= gcd->d[i];
|
240
|
+
}
|
241
|
+
*out_relatively_prime = mask == 0;
|
242
|
+
}
|
243
|
+
ret = 1;
|
244
|
+
|
245
|
+
err:
|
246
|
+
BN_CTX_end(ctx);
|
247
|
+
return ret;
|
248
|
+
}
|
189
249
|
|
250
|
+
int bn_lcm_consttime(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) {
|
190
251
|
BN_CTX_start(ctx);
|
191
|
-
|
192
|
-
|
252
|
+
unsigned shift;
|
253
|
+
BIGNUM *gcd = BN_CTX_get(ctx);
|
254
|
+
int ret = gcd != NULL &&
|
255
|
+
bn_mul_consttime(r, a, b, ctx) &&
|
256
|
+
bn_gcd_consttime(gcd, &shift, a, b, ctx) &&
|
257
|
+
bn_div_consttime(r, NULL, r, gcd, ctx) &&
|
258
|
+
bn_rshift_secret_shift(r, r, shift, ctx);
|
259
|
+
BN_CTX_end(ctx);
|
260
|
+
return ret;
|
261
|
+
}
|
193
262
|
|
194
|
-
|
195
|
-
|
263
|
+
int bn_mod_inverse_consttime(BIGNUM *r, int *out_no_inverse, const BIGNUM *a,
|
264
|
+
const BIGNUM *n, BN_CTX *ctx) {
|
265
|
+
*out_no_inverse = 0;
|
266
|
+
if (BN_is_negative(a) || BN_ucmp(a, n) >= 0) {
|
267
|
+
OPENSSL_PUT_ERROR(BN, BN_R_INPUT_NOT_REDUCED);
|
268
|
+
return 0;
|
196
269
|
}
|
197
|
-
if (
|
198
|
-
|
270
|
+
if (BN_is_zero(a)) {
|
271
|
+
if (BN_is_one(n)) {
|
272
|
+
BN_zero(r);
|
273
|
+
return 1;
|
274
|
+
}
|
275
|
+
*out_no_inverse = 1;
|
276
|
+
OPENSSL_PUT_ERROR(BN, BN_R_NO_INVERSE);
|
277
|
+
return 0;
|
199
278
|
}
|
200
|
-
|
201
|
-
|
279
|
+
|
280
|
+
// This is a constant-time implementation of the extended binary GCD
|
281
|
+
// algorithm. It is adapted from the Handbook of Applied Cryptography, section
|
282
|
+
// 14.4.3, algorithm 14.51, and modified to bound coefficients and avoid
|
283
|
+
// negative numbers.
|
284
|
+
//
|
285
|
+
// For more details and proof of correctness, see
|
286
|
+
// https://github.com/mit-plv/fiat-crypto/pull/333. In particular, see |step|
|
287
|
+
// and |mod_inverse_consttime| for the algorithm in Gallina and see
|
288
|
+
// |mod_inverse_consttime_spec| for the correctness result.
|
289
|
+
|
290
|
+
if (!BN_is_odd(a) && !BN_is_odd(n)) {
|
291
|
+
*out_no_inverse = 1;
|
292
|
+
OPENSSL_PUT_ERROR(BN, BN_R_NO_INVERSE);
|
293
|
+
return 0;
|
202
294
|
}
|
203
295
|
|
204
|
-
a
|
205
|
-
|
296
|
+
// This function exists to compute the RSA private exponent, where |a| is one
|
297
|
+
// word. We'll thus use |a_width| when available.
|
298
|
+
size_t n_width = n->width, a_width = a->width;
|
299
|
+
if (a_width > n_width) {
|
300
|
+
a_width = n_width;
|
301
|
+
}
|
206
302
|
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
303
|
+
int ret = 0;
|
304
|
+
BN_CTX_start(ctx);
|
305
|
+
BIGNUM *u = BN_CTX_get(ctx);
|
306
|
+
BIGNUM *v = BN_CTX_get(ctx);
|
307
|
+
BIGNUM *A = BN_CTX_get(ctx);
|
308
|
+
BIGNUM *B = BN_CTX_get(ctx);
|
309
|
+
BIGNUM *C = BN_CTX_get(ctx);
|
310
|
+
BIGNUM *D = BN_CTX_get(ctx);
|
311
|
+
BIGNUM *tmp = BN_CTX_get(ctx);
|
312
|
+
BIGNUM *tmp2 = BN_CTX_get(ctx);
|
313
|
+
if (u == NULL || v == NULL || A == NULL || B == NULL || C == NULL ||
|
314
|
+
D == NULL || tmp == NULL || tmp2 == NULL ||
|
315
|
+
!BN_copy(u, a) ||
|
316
|
+
!BN_copy(v, n) ||
|
317
|
+
!BN_one(A) ||
|
318
|
+
!BN_one(D) ||
|
319
|
+
// For convenience, size |u| and |v| equivalently.
|
320
|
+
!bn_resize_words(u, n_width) ||
|
321
|
+
!bn_resize_words(v, n_width) ||
|
322
|
+
// |A| and |C| are bounded by |m|.
|
323
|
+
!bn_resize_words(A, n_width) ||
|
324
|
+
!bn_resize_words(C, n_width) ||
|
325
|
+
// |B| and |D| are bounded by |a|.
|
326
|
+
!bn_resize_words(B, a_width) ||
|
327
|
+
!bn_resize_words(D, a_width) ||
|
328
|
+
// |tmp| and |tmp2| may be used at either size.
|
329
|
+
!bn_resize_words(tmp, n_width) ||
|
330
|
+
!bn_resize_words(tmp2, n_width)) {
|
331
|
+
goto err;
|
211
332
|
}
|
212
|
-
|
213
|
-
|
333
|
+
|
334
|
+
// Each loop iteration halves at least one of |u| and |v|. Thus we need at
|
335
|
+
// most the combined bit width of inputs for at least one value to be zero.
|
336
|
+
unsigned a_bits = a_width * BN_BITS2, n_bits = n_width * BN_BITS2;
|
337
|
+
unsigned num_iters = a_bits + n_bits;
|
338
|
+
if (num_iters < a_bits) {
|
339
|
+
OPENSSL_PUT_ERROR(BN, BN_R_BIGNUM_TOO_LONG);
|
214
340
|
goto err;
|
215
341
|
}
|
216
342
|
|
217
|
-
|
343
|
+
// Before and after each loop iteration, the following hold:
|
344
|
+
//
|
345
|
+
// u = A*a - B*n
|
346
|
+
// v = D*n - C*a
|
347
|
+
// 0 < u <= a
|
348
|
+
// 0 <= v <= n
|
349
|
+
// 0 <= A < n
|
350
|
+
// 0 <= B <= a
|
351
|
+
// 0 <= C < n
|
352
|
+
// 0 <= D <= a
|
353
|
+
//
|
354
|
+
// After each loop iteration, u and v only get smaller, and at least one of
|
355
|
+
// them shrinks by at least a factor of two.
|
356
|
+
for (unsigned i = 0; i < num_iters; i++) {
|
357
|
+
BN_ULONG both_odd = word_is_odd_mask(u->d[0]) & word_is_odd_mask(v->d[0]);
|
358
|
+
|
359
|
+
// If both |u| and |v| are odd, subtract the smaller from the larger.
|
360
|
+
BN_ULONG v_less_than_u =
|
361
|
+
(BN_ULONG)0 - bn_sub_words(tmp->d, v->d, u->d, n_width);
|
362
|
+
bn_select_words(v->d, both_odd & ~v_less_than_u, tmp->d, v->d, n_width);
|
363
|
+
bn_sub_words(tmp->d, u->d, v->d, n_width);
|
364
|
+
bn_select_words(u->d, both_odd & v_less_than_u, tmp->d, u->d, n_width);
|
365
|
+
|
366
|
+
// If we updated one of the values, update the corresponding coefficient.
|
367
|
+
BN_ULONG carry = bn_add_words(tmp->d, A->d, C->d, n_width);
|
368
|
+
carry -= bn_sub_words(tmp2->d, tmp->d, n->d, n_width);
|
369
|
+
bn_select_words(tmp->d, carry, tmp->d, tmp2->d, n_width);
|
370
|
+
bn_select_words(A->d, both_odd & v_less_than_u, tmp->d, A->d, n_width);
|
371
|
+
bn_select_words(C->d, both_odd & ~v_less_than_u, tmp->d, C->d, n_width);
|
372
|
+
|
373
|
+
bn_add_words(tmp->d, B->d, D->d, a_width);
|
374
|
+
bn_sub_words(tmp2->d, tmp->d, a->d, a_width);
|
375
|
+
bn_select_words(tmp->d, carry, tmp->d, tmp2->d, a_width);
|
376
|
+
bn_select_words(B->d, both_odd & v_less_than_u, tmp->d, B->d, a_width);
|
377
|
+
bn_select_words(D->d, both_odd & ~v_less_than_u, tmp->d, D->d, a_width);
|
378
|
+
|
379
|
+
// Our loop invariants hold at this point. Additionally, exactly one of |u|
|
380
|
+
// and |v| is now even.
|
381
|
+
BN_ULONG u_is_even = ~word_is_odd_mask(u->d[0]);
|
382
|
+
BN_ULONG v_is_even = ~word_is_odd_mask(v->d[0]);
|
383
|
+
assert(u_is_even != v_is_even);
|
384
|
+
|
385
|
+
// Halve the even one and adjust the corresponding coefficient.
|
386
|
+
maybe_rshift1_words(u->d, u_is_even, tmp->d, n_width);
|
387
|
+
BN_ULONG A_or_B_is_odd =
|
388
|
+
word_is_odd_mask(A->d[0]) | word_is_odd_mask(B->d[0]);
|
389
|
+
BN_ULONG A_carry =
|
390
|
+
maybe_add_words(A->d, A_or_B_is_odd & u_is_even, n->d, tmp->d, n_width);
|
391
|
+
BN_ULONG B_carry =
|
392
|
+
maybe_add_words(B->d, A_or_B_is_odd & u_is_even, a->d, tmp->d, a_width);
|
393
|
+
maybe_rshift1_words_carry(A->d, A_carry, u_is_even, tmp->d, n_width);
|
394
|
+
maybe_rshift1_words_carry(B->d, B_carry, u_is_even, tmp->d, a_width);
|
395
|
+
|
396
|
+
maybe_rshift1_words(v->d, v_is_even, tmp->d, n_width);
|
397
|
+
BN_ULONG C_or_D_is_odd =
|
398
|
+
word_is_odd_mask(C->d[0]) | word_is_odd_mask(D->d[0]);
|
399
|
+
BN_ULONG C_carry =
|
400
|
+
maybe_add_words(C->d, C_or_D_is_odd & v_is_even, n->d, tmp->d, n_width);
|
401
|
+
BN_ULONG D_carry =
|
402
|
+
maybe_add_words(D->d, C_or_D_is_odd & v_is_even, a->d, tmp->d, a_width);
|
403
|
+
maybe_rshift1_words_carry(C->d, C_carry, v_is_even, tmp->d, n_width);
|
404
|
+
maybe_rshift1_words_carry(D->d, D_carry, v_is_even, tmp->d, a_width);
|
405
|
+
}
|
406
|
+
|
407
|
+
assert(BN_is_zero(v));
|
408
|
+
if (!BN_is_one(u)) {
|
409
|
+
*out_no_inverse = 1;
|
410
|
+
OPENSSL_PUT_ERROR(BN, BN_R_NO_INVERSE);
|
218
411
|
goto err;
|
219
412
|
}
|
220
|
-
|
413
|
+
|
414
|
+
ret = BN_copy(r, A) != NULL;
|
221
415
|
|
222
416
|
err:
|
223
417
|
BN_CTX_end(ctx);
|
224
418
|
return ret;
|
225
419
|
}
|
226
420
|
|
227
|
-
// solves ax == 1 (mod n)
|
228
|
-
static int bn_mod_inverse_general(BIGNUM *out, int *out_no_inverse,
|
229
|
-
const BIGNUM *a, const BIGNUM *n,
|
230
|
-
BN_CTX *ctx);
|
231
|
-
|
232
421
|
int BN_mod_inverse_odd(BIGNUM *out, int *out_no_inverse, const BIGNUM *a,
|
233
422
|
const BIGNUM *n, BN_CTX *ctx) {
|
234
423
|
*out_no_inverse = 0;
|
@@ -423,7 +612,7 @@ BIGNUM *BN_mod_inverse(BIGNUM *out, const BIGNUM *a, const BIGNUM *n,
|
|
423
612
|
|
424
613
|
int no_inverse;
|
425
614
|
if (!BN_is_odd(n)) {
|
426
|
-
if (!
|
615
|
+
if (!bn_mod_inverse_consttime(out, &no_inverse, a, n, ctx)) {
|
427
616
|
goto err;
|
428
617
|
}
|
429
618
|
} else if (!BN_mod_inverse_odd(out, &no_inverse, a, n, ctx)) {
|
@@ -469,139 +658,6 @@ err:
|
|
469
658
|
return ret;
|
470
659
|
}
|
471
660
|
|
472
|
-
// bn_mod_inverse_general is the general inversion algorithm that works for
|
473
|
-
// both even and odd |n|. It was specifically designed to contain fewer
|
474
|
-
// branches that may leak sensitive information; see "New Branch Prediction
|
475
|
-
// Vulnerabilities in OpenSSL and Necessary Software Countermeasures" by
|
476
|
-
// Onur Acıçmez, Shay Gueron, and Jean-Pierre Seifert.
|
477
|
-
static int bn_mod_inverse_general(BIGNUM *out, int *out_no_inverse,
|
478
|
-
const BIGNUM *a, const BIGNUM *n,
|
479
|
-
BN_CTX *ctx) {
|
480
|
-
BIGNUM *A, *B, *X, *Y, *M, *D, *T;
|
481
|
-
int ret = 0;
|
482
|
-
int sign;
|
483
|
-
|
484
|
-
*out_no_inverse = 0;
|
485
|
-
|
486
|
-
BN_CTX_start(ctx);
|
487
|
-
A = BN_CTX_get(ctx);
|
488
|
-
B = BN_CTX_get(ctx);
|
489
|
-
X = BN_CTX_get(ctx);
|
490
|
-
D = BN_CTX_get(ctx);
|
491
|
-
M = BN_CTX_get(ctx);
|
492
|
-
Y = BN_CTX_get(ctx);
|
493
|
-
T = BN_CTX_get(ctx);
|
494
|
-
if (T == NULL) {
|
495
|
-
goto err;
|
496
|
-
}
|
497
|
-
|
498
|
-
BIGNUM *R = out;
|
499
|
-
|
500
|
-
BN_zero(Y);
|
501
|
-
if (!BN_one(X) || BN_copy(B, a) == NULL || BN_copy(A, n) == NULL) {
|
502
|
-
goto err;
|
503
|
-
}
|
504
|
-
A->neg = 0;
|
505
|
-
|
506
|
-
sign = -1;
|
507
|
-
// From B = a mod |n|, A = |n| it follows that
|
508
|
-
//
|
509
|
-
// 0 <= B < A,
|
510
|
-
// -sign*X*a == B (mod |n|),
|
511
|
-
// sign*Y*a == A (mod |n|).
|
512
|
-
|
513
|
-
while (!BN_is_zero(B)) {
|
514
|
-
BIGNUM *tmp;
|
515
|
-
|
516
|
-
// 0 < B < A,
|
517
|
-
// (*) -sign*X*a == B (mod |n|),
|
518
|
-
// sign*Y*a == A (mod |n|)
|
519
|
-
|
520
|
-
// (D, M) := (A/B, A%B) ...
|
521
|
-
if (!BN_div(D, M, A, B, ctx)) {
|
522
|
-
goto err;
|
523
|
-
}
|
524
|
-
|
525
|
-
// Now
|
526
|
-
// A = D*B + M;
|
527
|
-
// thus we have
|
528
|
-
// (**) sign*Y*a == D*B + M (mod |n|).
|
529
|
-
|
530
|
-
tmp = A; // keep the BIGNUM object, the value does not matter
|
531
|
-
|
532
|
-
// (A, B) := (B, A mod B) ...
|
533
|
-
A = B;
|
534
|
-
B = M;
|
535
|
-
// ... so we have 0 <= B < A again
|
536
|
-
|
537
|
-
// Since the former M is now B and the former B is now A,
|
538
|
-
// (**) translates into
|
539
|
-
// sign*Y*a == D*A + B (mod |n|),
|
540
|
-
// i.e.
|
541
|
-
// sign*Y*a - D*A == B (mod |n|).
|
542
|
-
// Similarly, (*) translates into
|
543
|
-
// -sign*X*a == A (mod |n|).
|
544
|
-
//
|
545
|
-
// Thus,
|
546
|
-
// sign*Y*a + D*sign*X*a == B (mod |n|),
|
547
|
-
// i.e.
|
548
|
-
// sign*(Y + D*X)*a == B (mod |n|).
|
549
|
-
//
|
550
|
-
// So if we set (X, Y, sign) := (Y + D*X, X, -sign), we arrive back at
|
551
|
-
// -sign*X*a == B (mod |n|),
|
552
|
-
// sign*Y*a == A (mod |n|).
|
553
|
-
// Note that X and Y stay non-negative all the time.
|
554
|
-
|
555
|
-
if (!BN_mul(tmp, D, X, ctx)) {
|
556
|
-
goto err;
|
557
|
-
}
|
558
|
-
if (!BN_add(tmp, tmp, Y)) {
|
559
|
-
goto err;
|
560
|
-
}
|
561
|
-
|
562
|
-
M = Y; // keep the BIGNUM object, the value does not matter
|
563
|
-
Y = X;
|
564
|
-
X = tmp;
|
565
|
-
sign = -sign;
|
566
|
-
}
|
567
|
-
|
568
|
-
if (!BN_is_one(A)) {
|
569
|
-
*out_no_inverse = 1;
|
570
|
-
OPENSSL_PUT_ERROR(BN, BN_R_NO_INVERSE);
|
571
|
-
goto err;
|
572
|
-
}
|
573
|
-
|
574
|
-
// The while loop (Euclid's algorithm) ends when
|
575
|
-
// A == gcd(a,n);
|
576
|
-
// we have
|
577
|
-
// sign*Y*a == A (mod |n|),
|
578
|
-
// where Y is non-negative.
|
579
|
-
|
580
|
-
if (sign < 0) {
|
581
|
-
if (!BN_sub(Y, n, Y)) {
|
582
|
-
goto err;
|
583
|
-
}
|
584
|
-
}
|
585
|
-
// Now Y*a == A (mod |n|).
|
586
|
-
|
587
|
-
// Y*a == 1 (mod |n|)
|
588
|
-
if (!Y->neg && BN_ucmp(Y, n) < 0) {
|
589
|
-
if (!BN_copy(R, Y)) {
|
590
|
-
goto err;
|
591
|
-
}
|
592
|
-
} else {
|
593
|
-
if (!BN_nnmod(R, Y, n, ctx)) {
|
594
|
-
goto err;
|
595
|
-
}
|
596
|
-
}
|
597
|
-
|
598
|
-
ret = 1;
|
599
|
-
|
600
|
-
err:
|
601
|
-
BN_CTX_end(ctx);
|
602
|
-
return ret;
|
603
|
-
}
|
604
|
-
|
605
661
|
int bn_mod_inverse_prime(BIGNUM *out, const BIGNUM *a, const BIGNUM *p,
|
606
662
|
BN_CTX *ctx, const BN_MONT_CTX *mont_p) {
|
607
663
|
BN_CTX_start(ctx);
|