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
@@ -0,0 +1,209 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Copyright 2018 gRPC authors.
|
4
|
+
*
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
* you may not use this file except in compliance with the License.
|
7
|
+
* You may obtain a copy of the License at
|
8
|
+
*
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
*
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
* See the License for the specific language governing permissions and
|
15
|
+
* limitations under the License.
|
16
|
+
*
|
17
|
+
*/
|
18
|
+
|
19
|
+
#include <grpc/support/port_platform.h>
|
20
|
+
|
21
|
+
#include "src/core/tsi/local_transport_security.h"
|
22
|
+
|
23
|
+
#include <stdio.h>
|
24
|
+
#include <stdlib.h>
|
25
|
+
#include <string.h>
|
26
|
+
|
27
|
+
#include <grpc/support/alloc.h>
|
28
|
+
#include <grpc/support/log.h>
|
29
|
+
#include <grpc/support/string_util.h>
|
30
|
+
|
31
|
+
#include "src/core/lib/iomgr/exec_ctx.h"
|
32
|
+
#include "src/core/tsi/transport_security_grpc.h"
|
33
|
+
|
34
|
+
/* Main struct for local TSI zero-copy frame protector. */
|
35
|
+
typedef struct local_zero_copy_grpc_protector {
|
36
|
+
tsi_zero_copy_grpc_protector base;
|
37
|
+
} local_zero_copy_grpc_protector;
|
38
|
+
|
39
|
+
/* Main struct for local TSI handshaker result. */
|
40
|
+
typedef struct local_tsi_handshaker_result {
|
41
|
+
tsi_handshaker_result base;
|
42
|
+
bool is_client;
|
43
|
+
} local_tsi_handshaker_result;
|
44
|
+
|
45
|
+
/* Main struct for local TSI handshaker. */
|
46
|
+
typedef struct local_tsi_handshaker {
|
47
|
+
tsi_handshaker base;
|
48
|
+
bool is_client;
|
49
|
+
} local_tsi_handshaker;
|
50
|
+
|
51
|
+
/* --- tsi_zero_copy_grpc_protector methods implementation. --- */
|
52
|
+
|
53
|
+
static tsi_result local_zero_copy_grpc_protector_protect(
|
54
|
+
tsi_zero_copy_grpc_protector* self, grpc_slice_buffer* unprotected_slices,
|
55
|
+
grpc_slice_buffer* protected_slices) {
|
56
|
+
if (self == nullptr || unprotected_slices == nullptr ||
|
57
|
+
protected_slices == nullptr) {
|
58
|
+
gpr_log(GPR_ERROR, "Invalid nullptr arguments to zero-copy grpc protect.");
|
59
|
+
return TSI_INVALID_ARGUMENT;
|
60
|
+
}
|
61
|
+
grpc_slice_buffer_move_into(unprotected_slices, protected_slices);
|
62
|
+
return TSI_OK;
|
63
|
+
}
|
64
|
+
|
65
|
+
static tsi_result local_zero_copy_grpc_protector_unprotect(
|
66
|
+
tsi_zero_copy_grpc_protector* self, grpc_slice_buffer* protected_slices,
|
67
|
+
grpc_slice_buffer* unprotected_slices) {
|
68
|
+
if (self == nullptr || unprotected_slices == nullptr ||
|
69
|
+
protected_slices == nullptr) {
|
70
|
+
gpr_log(GPR_ERROR,
|
71
|
+
"Invalid nullptr arguments to zero-copy grpc unprotect.");
|
72
|
+
return TSI_INVALID_ARGUMENT;
|
73
|
+
}
|
74
|
+
grpc_slice_buffer_move_into(protected_slices, unprotected_slices);
|
75
|
+
return TSI_OK;
|
76
|
+
}
|
77
|
+
|
78
|
+
static void local_zero_copy_grpc_protector_destroy(
|
79
|
+
tsi_zero_copy_grpc_protector* self) {
|
80
|
+
gpr_free(self);
|
81
|
+
}
|
82
|
+
|
83
|
+
static const tsi_zero_copy_grpc_protector_vtable
|
84
|
+
local_zero_copy_grpc_protector_vtable = {
|
85
|
+
local_zero_copy_grpc_protector_protect,
|
86
|
+
local_zero_copy_grpc_protector_unprotect,
|
87
|
+
local_zero_copy_grpc_protector_destroy};
|
88
|
+
|
89
|
+
tsi_result local_zero_copy_grpc_protector_create(
|
90
|
+
tsi_zero_copy_grpc_protector** protector) {
|
91
|
+
if (grpc_core::ExecCtx::Get() == nullptr || protector == nullptr) {
|
92
|
+
gpr_log(
|
93
|
+
GPR_ERROR,
|
94
|
+
"Invalid nullptr arguments to local_zero_copy_grpc_protector create.");
|
95
|
+
return TSI_INVALID_ARGUMENT;
|
96
|
+
}
|
97
|
+
local_zero_copy_grpc_protector* impl =
|
98
|
+
static_cast<local_zero_copy_grpc_protector*>(gpr_zalloc(sizeof(*impl)));
|
99
|
+
impl->base.vtable = &local_zero_copy_grpc_protector_vtable;
|
100
|
+
*protector = &impl->base;
|
101
|
+
return TSI_OK;
|
102
|
+
}
|
103
|
+
|
104
|
+
/* --- tsi_handshaker_result methods implementation. --- */
|
105
|
+
|
106
|
+
static tsi_result handshaker_result_extract_peer(
|
107
|
+
const tsi_handshaker_result* self, tsi_peer* peer) {
|
108
|
+
return TSI_OK;
|
109
|
+
}
|
110
|
+
|
111
|
+
static tsi_result handshaker_result_create_zero_copy_grpc_protector(
|
112
|
+
const tsi_handshaker_result* self, size_t* max_output_protected_frame_size,
|
113
|
+
tsi_zero_copy_grpc_protector** protector) {
|
114
|
+
if (self == nullptr || protector == nullptr) {
|
115
|
+
gpr_log(GPR_ERROR,
|
116
|
+
"Invalid arguments to create_zero_copy_grpc_protector()");
|
117
|
+
return TSI_INVALID_ARGUMENT;
|
118
|
+
}
|
119
|
+
tsi_result ok = local_zero_copy_grpc_protector_create(protector);
|
120
|
+
if (ok != TSI_OK) {
|
121
|
+
gpr_log(GPR_ERROR, "Failed to create zero-copy grpc protector");
|
122
|
+
}
|
123
|
+
return ok;
|
124
|
+
}
|
125
|
+
|
126
|
+
static void handshaker_result_destroy(tsi_handshaker_result* self) {
|
127
|
+
if (self == nullptr) {
|
128
|
+
return;
|
129
|
+
}
|
130
|
+
local_tsi_handshaker_result* result =
|
131
|
+
reinterpret_cast<local_tsi_handshaker_result*>(
|
132
|
+
const_cast<tsi_handshaker_result*>(self));
|
133
|
+
gpr_free(result);
|
134
|
+
}
|
135
|
+
|
136
|
+
static const tsi_handshaker_result_vtable result_vtable = {
|
137
|
+
handshaker_result_extract_peer,
|
138
|
+
handshaker_result_create_zero_copy_grpc_protector,
|
139
|
+
nullptr, /* handshaker_result_create_frame_protector */
|
140
|
+
nullptr, /* handshaker_result_get_unused_bytes */
|
141
|
+
handshaker_result_destroy};
|
142
|
+
|
143
|
+
static tsi_result create_handshaker_result(bool is_client,
|
144
|
+
tsi_handshaker_result** self) {
|
145
|
+
if (self == nullptr) {
|
146
|
+
gpr_log(GPR_ERROR, "Invalid arguments to create_handshaker_result()");
|
147
|
+
return TSI_INVALID_ARGUMENT;
|
148
|
+
}
|
149
|
+
local_tsi_handshaker_result* result =
|
150
|
+
static_cast<local_tsi_handshaker_result*>(gpr_zalloc(sizeof(*result)));
|
151
|
+
result->is_client = is_client;
|
152
|
+
result->base.vtable = &result_vtable;
|
153
|
+
*self = &result->base;
|
154
|
+
return TSI_OK;
|
155
|
+
}
|
156
|
+
|
157
|
+
/* --- tsi_handshaker methods implementation. --- */
|
158
|
+
|
159
|
+
static tsi_result handshaker_next(
|
160
|
+
tsi_handshaker* self, const unsigned char* received_bytes,
|
161
|
+
size_t received_bytes_size, const unsigned char** bytes_to_send,
|
162
|
+
size_t* bytes_to_send_size, tsi_handshaker_result** result,
|
163
|
+
tsi_handshaker_on_next_done_cb cb, void* user_data) {
|
164
|
+
if (self == nullptr) {
|
165
|
+
gpr_log(GPR_ERROR, "Invalid arguments to handshaker_next()");
|
166
|
+
return TSI_INVALID_ARGUMENT;
|
167
|
+
}
|
168
|
+
/* Note that there is no interaction between TSI peers, and all operations are
|
169
|
+
* local.
|
170
|
+
*/
|
171
|
+
local_tsi_handshaker* handshaker =
|
172
|
+
reinterpret_cast<local_tsi_handshaker*>(self);
|
173
|
+
*bytes_to_send_size = 0;
|
174
|
+
create_handshaker_result(handshaker->is_client, result);
|
175
|
+
return TSI_OK;
|
176
|
+
}
|
177
|
+
|
178
|
+
static void handshaker_destroy(tsi_handshaker* self) {
|
179
|
+
if (self == nullptr) {
|
180
|
+
return;
|
181
|
+
}
|
182
|
+
local_tsi_handshaker* handshaker =
|
183
|
+
reinterpret_cast<local_tsi_handshaker*>(self);
|
184
|
+
gpr_free(handshaker);
|
185
|
+
}
|
186
|
+
|
187
|
+
static const tsi_handshaker_vtable handshaker_vtable = {
|
188
|
+
nullptr, /* get_bytes_to_send_to_peer -- deprecated */
|
189
|
+
nullptr, /* process_bytes_from_peer -- deprecated */
|
190
|
+
nullptr, /* get_result -- deprecated */
|
191
|
+
nullptr, /* extract_peer -- deprecated */
|
192
|
+
nullptr, /* create_frame_protector -- deprecated */
|
193
|
+
handshaker_destroy,
|
194
|
+
handshaker_next,
|
195
|
+
nullptr, /* shutdown */
|
196
|
+
};
|
197
|
+
|
198
|
+
tsi_result local_tsi_handshaker_create(bool is_client, tsi_handshaker** self) {
|
199
|
+
if (self == nullptr) {
|
200
|
+
gpr_log(GPR_ERROR, "Invalid arguments to local_tsi_handshaker_create()");
|
201
|
+
return TSI_INVALID_ARGUMENT;
|
202
|
+
}
|
203
|
+
local_tsi_handshaker* handshaker =
|
204
|
+
static_cast<local_tsi_handshaker*>(gpr_zalloc(sizeof(*handshaker)));
|
205
|
+
handshaker->is_client = is_client;
|
206
|
+
handshaker->base.vtable = &handshaker_vtable;
|
207
|
+
*self = &handshaker->base;
|
208
|
+
return TSI_OK;
|
209
|
+
}
|
@@ -0,0 +1,51 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Copyright 2018 gRPC authors.
|
4
|
+
*
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
* you may not use this file except in compliance with the License.
|
7
|
+
* You may obtain a copy of the License at
|
8
|
+
*
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
*
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
* See the License for the specific language governing permissions and
|
15
|
+
* limitations under the License.
|
16
|
+
*
|
17
|
+
*/
|
18
|
+
|
19
|
+
#ifndef GRPC_CORE_TSI_LOCAL_TRANSPORT_SECURITY_H
|
20
|
+
#define GRPC_CORE_TSI_LOCAL_TRANSPORT_SECURITY_H
|
21
|
+
|
22
|
+
#include <grpc/support/port_platform.h>
|
23
|
+
|
24
|
+
#include <grpc/grpc.h>
|
25
|
+
|
26
|
+
#include "src/core/tsi/transport_security.h"
|
27
|
+
#include "src/core/tsi/transport_security_interface.h"
|
28
|
+
|
29
|
+
#define TSI_LOCAL_NUM_OF_PEER_PROPERTIES 1
|
30
|
+
#define TSI_LOCAL_PROCESS_ID_PEER_PROPERTY "process_id"
|
31
|
+
|
32
|
+
/**
|
33
|
+
* Main struct for local TSI handshaker. All APIs in the header are
|
34
|
+
* thread-comptabile.
|
35
|
+
*/
|
36
|
+
typedef struct local_tsi_handshaker local_tsi_handshaker;
|
37
|
+
|
38
|
+
/**
|
39
|
+
* This method creates a local TSI handshaker instance.
|
40
|
+
*
|
41
|
+
* - is_client: boolean value indicating if the handshaker is used at the client
|
42
|
+
* (is_client = true) or server (is_client = false) side. The parameter is
|
43
|
+
* added for future extension.
|
44
|
+
* - self: address of local TSI handshaker instance to be returned from the
|
45
|
+
* method.
|
46
|
+
*
|
47
|
+
* It returns TSI_OK on success and an error status code on failure.
|
48
|
+
*/
|
49
|
+
tsi_result local_tsi_handshaker_create(bool is_client, tsi_handshaker** self);
|
50
|
+
|
51
|
+
#endif /* GRPC_CORE_TSI_LOCAL_TRANSPORT_SECURITY_H */
|
@@ -18,9 +18,9 @@
|
|
18
18
|
|
19
19
|
#include <grpc/support/port_platform.h>
|
20
20
|
|
21
|
-
#include "src/core/
|
22
|
-
|
21
|
+
#include "src/core/lib/gprpp/mutex_lock.h"
|
23
22
|
#include "src/core/tsi/ssl/session_cache/ssl_session.h"
|
23
|
+
#include "src/core/tsi/ssl/session_cache/ssl_session_cache.h"
|
24
24
|
|
25
25
|
#include <grpc/support/log.h>
|
26
26
|
#include <grpc/support/string_util.h>
|
@@ -97,7 +97,7 @@ SslSessionLRUCache::~SslSessionLRUCache() {
|
|
97
97
|
}
|
98
98
|
|
99
99
|
size_t SslSessionLRUCache::Size() {
|
100
|
-
grpc_core::
|
100
|
+
grpc_core::MutexLock lock(&lock_);
|
101
101
|
return use_order_list_size_;
|
102
102
|
}
|
103
103
|
|
@@ -117,7 +117,7 @@ SslSessionLRUCache::Node* SslSessionLRUCache::FindLocked(
|
|
117
117
|
}
|
118
118
|
|
119
119
|
void SslSessionLRUCache::Put(const char* key, SslSessionPtr session) {
|
120
|
-
grpc_core::
|
120
|
+
grpc_core::MutexLock lock(&lock_);
|
121
121
|
Node* node = FindLocked(grpc_slice_from_static_string(key));
|
122
122
|
if (node != nullptr) {
|
123
123
|
node->SetSession(std::move(session));
|
@@ -140,7 +140,7 @@ void SslSessionLRUCache::Put(const char* key, SslSessionPtr session) {
|
|
140
140
|
}
|
141
141
|
|
142
142
|
SslSessionPtr SslSessionLRUCache::Get(const char* key) {
|
143
|
-
grpc_core::
|
143
|
+
grpc_core::MutexLock lock(&lock_);
|
144
144
|
// Key is only used for lookups.
|
145
145
|
grpc_slice key_slice = grpc_slice_from_static_string(key);
|
146
146
|
Node* node = FindLocked(key_slice);
|
@@ -21,6 +21,8 @@
|
|
21
21
|
|
22
22
|
#include <grpc/support/port_platform.h>
|
23
23
|
|
24
|
+
#include "src/core/tsi/grpc_shadow_boringssl.h"
|
25
|
+
|
24
26
|
#include <grpc/slice.h>
|
25
27
|
#include <grpc/support/sync.h>
|
26
28
|
|
@@ -69,6 +71,10 @@ class SslSessionLRUCache : public grpc_core::RefCounted<SslSessionLRUCache> {
|
|
69
71
|
template <typename T, typename... Args>
|
70
72
|
friend T* grpc_core::New(Args&&... args);
|
71
73
|
|
74
|
+
// So Delete() can call our private dtor.
|
75
|
+
template <typename T>
|
76
|
+
friend void grpc_core::Delete(T*);
|
77
|
+
|
72
78
|
class Node;
|
73
79
|
|
74
80
|
explicit SslSessionLRUCache(size_t capacity);
|
@@ -18,6 +18,8 @@
|
|
18
18
|
|
19
19
|
#include <grpc/support/port_platform.h>
|
20
20
|
|
21
|
+
#include "src/core/tsi/grpc_shadow_boringssl.h"
|
22
|
+
|
21
23
|
#include "src/core/tsi/ssl_transport_security.h"
|
22
24
|
|
23
25
|
#include <limits.h>
|
@@ -57,6 +59,7 @@ extern "C" {
|
|
57
59
|
|
58
60
|
#define TSI_SSL_MAX_PROTECTED_FRAME_SIZE_UPPER_BOUND 16384
|
59
61
|
#define TSI_SSL_MAX_PROTECTED_FRAME_SIZE_LOWER_BOUND 1024
|
62
|
+
#define TSI_SSL_HANDSHAKER_OUTGOING_BUFFER_INITIAL_SIZE 1024
|
60
63
|
|
61
64
|
/* Putting a macro like this and littering the source file with #if is really
|
62
65
|
bad practice.
|
@@ -105,9 +108,19 @@ typedef struct {
|
|
105
108
|
SSL* ssl;
|
106
109
|
BIO* network_io;
|
107
110
|
tsi_result result;
|
111
|
+
unsigned char* outgoing_bytes_buffer;
|
112
|
+
size_t outgoing_bytes_buffer_size;
|
108
113
|
tsi_ssl_handshaker_factory* factory_ref;
|
109
114
|
} tsi_ssl_handshaker;
|
110
115
|
|
116
|
+
typedef struct {
|
117
|
+
tsi_handshaker_result base;
|
118
|
+
SSL* ssl;
|
119
|
+
BIO* network_io;
|
120
|
+
unsigned char* unused_bytes;
|
121
|
+
size_t unused_bytes_size;
|
122
|
+
} tsi_ssl_handshaker_result;
|
123
|
+
|
111
124
|
typedef struct {
|
112
125
|
tsi_frame_protector base;
|
113
126
|
SSL* ssl;
|
@@ -120,12 +133,14 @@ typedef struct {
|
|
120
133
|
/* --- Library Initialization. ---*/
|
121
134
|
|
122
135
|
static gpr_once g_init_openssl_once = GPR_ONCE_INIT;
|
123
|
-
static gpr_mu* g_openssl_mutexes = nullptr;
|
124
136
|
static int g_ssl_ctx_ex_factory_index = -1;
|
137
|
+
static const unsigned char kSslSessionIdContext[] = {'g', 'r', 'p', 'c'};
|
138
|
+
|
139
|
+
#if OPENSSL_VERSION_NUMBER < 0x10100000
|
140
|
+
static gpr_mu* g_openssl_mutexes = nullptr;
|
125
141
|
static void openssl_locking_cb(int mode, int type, const char* file,
|
126
142
|
int line) GRPC_UNUSED;
|
127
143
|
static unsigned long openssl_thread_id_cb(void) GRPC_UNUSED;
|
128
|
-
static const unsigned char kSslSessionIdContext[] = {'g', 'r', 'p', 'c'};
|
129
144
|
|
130
145
|
static void openssl_locking_cb(int mode, int type, const char* file, int line) {
|
131
146
|
if (mode & CRYPTO_LOCK) {
|
@@ -138,22 +153,27 @@ static void openssl_locking_cb(int mode, int type, const char* file, int line) {
|
|
138
153
|
static unsigned long openssl_thread_id_cb(void) {
|
139
154
|
return static_cast<unsigned long>(gpr_thd_currentid());
|
140
155
|
}
|
156
|
+
#endif
|
141
157
|
|
142
158
|
static void init_openssl(void) {
|
143
|
-
int i;
|
144
|
-
int num_locks;
|
145
159
|
SSL_library_init();
|
146
160
|
SSL_load_error_strings();
|
147
161
|
OpenSSL_add_all_algorithms();
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
162
|
+
#if OPENSSL_VERSION_NUMBER < 0x10100000
|
163
|
+
if (!CRYPTO_get_locking_callback()) {
|
164
|
+
int num_locks = CRYPTO_num_locks();
|
165
|
+
GPR_ASSERT(num_locks > 0);
|
166
|
+
g_openssl_mutexes = static_cast<gpr_mu*>(
|
167
|
+
gpr_malloc(static_cast<size_t>(num_locks) * sizeof(gpr_mu)));
|
168
|
+
for (int i = 0; i < num_locks; i++) {
|
169
|
+
gpr_mu_init(&g_openssl_mutexes[i]);
|
170
|
+
}
|
171
|
+
CRYPTO_set_locking_callback(openssl_locking_cb);
|
172
|
+
CRYPTO_set_id_callback(openssl_thread_id_cb);
|
173
|
+
} else {
|
174
|
+
gpr_log(GPR_INFO, "OpenSSL callback has already been set.");
|
175
|
+
}
|
176
|
+
#endif
|
157
177
|
g_ssl_ctx_ex_factory_index =
|
158
178
|
SSL_CTX_get_ex_new_index(0, nullptr, nullptr, nullptr, nullptr);
|
159
179
|
GPR_ASSERT(g_ssl_ctx_ex_factory_index != -1);
|
@@ -198,7 +218,7 @@ static void ssl_log_where_info(const SSL* ssl, int where, int flag,
|
|
198
218
|
/* Used for debugging. TODO(jboeuf): Remove when code is mature enough. */
|
199
219
|
static void ssl_info_callback(const SSL* ssl, int where, int ret) {
|
200
220
|
if (ret == 0) {
|
201
|
-
gpr_log(GPR_ERROR, "ssl_info_callback: error
|
221
|
+
gpr_log(GPR_ERROR, "ssl_info_callback: error occurred.\n");
|
202
222
|
return;
|
203
223
|
}
|
204
224
|
|
@@ -242,14 +262,13 @@ static tsi_result ssl_get_x509_common_name(X509* cert, unsigned char** utf8,
|
|
242
262
|
X509_NAME* subject_name = X509_get_subject_name(cert);
|
243
263
|
int utf8_returned_size = 0;
|
244
264
|
if (subject_name == nullptr) {
|
245
|
-
gpr_log(
|
265
|
+
gpr_log(GPR_INFO, "Could not get subject name from certificate.");
|
246
266
|
return TSI_NOT_FOUND;
|
247
267
|
}
|
248
268
|
common_name_index =
|
249
269
|
X509_NAME_get_index_by_NID(subject_name, NID_commonName, -1);
|
250
270
|
if (common_name_index == -1) {
|
251
|
-
gpr_log(
|
252
|
-
"Could not get common name of subject from certificate.");
|
271
|
+
gpr_log(GPR_INFO, "Could not get common name of subject from certificate.");
|
253
272
|
return TSI_NOT_FOUND;
|
254
273
|
}
|
255
274
|
common_name_entry = X509_NAME_get_entry(subject_name, common_name_index);
|
@@ -987,94 +1006,15 @@ static void tsi_ssl_handshaker_factory_init(
|
|
987
1006
|
gpr_ref_init(&factory->refcount, 1);
|
988
1007
|
}
|
989
1008
|
|
990
|
-
/* ---
|
1009
|
+
/* --- tsi_handshaker_result methods implementation. ---*/
|
991
1010
|
|
992
|
-
static tsi_result
|
993
|
-
|
994
|
-
size_t* bytes_size) {
|
995
|
-
tsi_ssl_handshaker* impl = reinterpret_cast<tsi_ssl_handshaker*>(self);
|
996
|
-
int bytes_read_from_ssl = 0;
|
997
|
-
if (bytes == nullptr || bytes_size == nullptr || *bytes_size == 0 ||
|
998
|
-
*bytes_size > INT_MAX) {
|
999
|
-
return TSI_INVALID_ARGUMENT;
|
1000
|
-
}
|
1001
|
-
GPR_ASSERT(*bytes_size <= INT_MAX);
|
1002
|
-
bytes_read_from_ssl =
|
1003
|
-
BIO_read(impl->network_io, bytes, static_cast<int>(*bytes_size));
|
1004
|
-
if (bytes_read_from_ssl < 0) {
|
1005
|
-
*bytes_size = 0;
|
1006
|
-
if (!BIO_should_retry(impl->network_io)) {
|
1007
|
-
impl->result = TSI_INTERNAL_ERROR;
|
1008
|
-
return impl->result;
|
1009
|
-
} else {
|
1010
|
-
return TSI_OK;
|
1011
|
-
}
|
1012
|
-
}
|
1013
|
-
*bytes_size = static_cast<size_t>(bytes_read_from_ssl);
|
1014
|
-
return BIO_pending(impl->network_io) == 0 ? TSI_OK : TSI_INCOMPLETE_DATA;
|
1015
|
-
}
|
1016
|
-
|
1017
|
-
static tsi_result ssl_handshaker_get_result(tsi_handshaker* self) {
|
1018
|
-
tsi_ssl_handshaker* impl = reinterpret_cast<tsi_ssl_handshaker*>(self);
|
1019
|
-
if ((impl->result == TSI_HANDSHAKE_IN_PROGRESS) &&
|
1020
|
-
SSL_is_init_finished(impl->ssl)) {
|
1021
|
-
impl->result = TSI_OK;
|
1022
|
-
}
|
1023
|
-
return impl->result;
|
1024
|
-
}
|
1025
|
-
|
1026
|
-
static tsi_result ssl_handshaker_process_bytes_from_peer(
|
1027
|
-
tsi_handshaker* self, const unsigned char* bytes, size_t* bytes_size) {
|
1028
|
-
tsi_ssl_handshaker* impl = reinterpret_cast<tsi_ssl_handshaker*>(self);
|
1029
|
-
int bytes_written_into_ssl_size = 0;
|
1030
|
-
if (bytes == nullptr || bytes_size == nullptr || *bytes_size > INT_MAX) {
|
1031
|
-
return TSI_INVALID_ARGUMENT;
|
1032
|
-
}
|
1033
|
-
GPR_ASSERT(*bytes_size <= INT_MAX);
|
1034
|
-
bytes_written_into_ssl_size =
|
1035
|
-
BIO_write(impl->network_io, bytes, static_cast<int>(*bytes_size));
|
1036
|
-
if (bytes_written_into_ssl_size < 0) {
|
1037
|
-
gpr_log(GPR_ERROR, "Could not write to memory BIO.");
|
1038
|
-
impl->result = TSI_INTERNAL_ERROR;
|
1039
|
-
return impl->result;
|
1040
|
-
}
|
1041
|
-
*bytes_size = static_cast<size_t>(bytes_written_into_ssl_size);
|
1042
|
-
|
1043
|
-
if (!tsi_handshaker_is_in_progress(self)) {
|
1044
|
-
impl->result = TSI_OK;
|
1045
|
-
return impl->result;
|
1046
|
-
} else {
|
1047
|
-
/* Get ready to get some bytes from SSL. */
|
1048
|
-
int ssl_result = SSL_do_handshake(impl->ssl);
|
1049
|
-
ssl_result = SSL_get_error(impl->ssl, ssl_result);
|
1050
|
-
switch (ssl_result) {
|
1051
|
-
case SSL_ERROR_WANT_READ:
|
1052
|
-
if (BIO_pending(impl->network_io) == 0) {
|
1053
|
-
/* We need more data. */
|
1054
|
-
return TSI_INCOMPLETE_DATA;
|
1055
|
-
} else {
|
1056
|
-
return TSI_OK;
|
1057
|
-
}
|
1058
|
-
case SSL_ERROR_NONE:
|
1059
|
-
return TSI_OK;
|
1060
|
-
default: {
|
1061
|
-
char err_str[256];
|
1062
|
-
ERR_error_string_n(ERR_get_error(), err_str, sizeof(err_str));
|
1063
|
-
gpr_log(GPR_ERROR, "Handshake failed with fatal error %s: %s.",
|
1064
|
-
ssl_error_string(ssl_result), err_str);
|
1065
|
-
impl->result = TSI_PROTOCOL_FAILURE;
|
1066
|
-
return impl->result;
|
1067
|
-
}
|
1068
|
-
}
|
1069
|
-
}
|
1070
|
-
}
|
1071
|
-
|
1072
|
-
static tsi_result ssl_handshaker_extract_peer(tsi_handshaker* self,
|
1073
|
-
tsi_peer* peer) {
|
1011
|
+
static tsi_result ssl_handshaker_result_extract_peer(
|
1012
|
+
const tsi_handshaker_result* self, tsi_peer* peer) {
|
1074
1013
|
tsi_result result = TSI_OK;
|
1075
1014
|
const unsigned char* alpn_selected = nullptr;
|
1076
1015
|
unsigned int alpn_selected_len;
|
1077
|
-
|
1016
|
+
const tsi_ssl_handshaker_result* impl =
|
1017
|
+
reinterpret_cast<const tsi_ssl_handshaker_result*>(self);
|
1078
1018
|
X509* peer_cert = SSL_get_peer_certificate(impl->ssl);
|
1079
1019
|
if (peer_cert != nullptr) {
|
1080
1020
|
result = peer_from_x509(peer_cert, 1, peer);
|
@@ -1111,21 +1051,23 @@ static tsi_result ssl_handshaker_extract_peer(tsi_handshaker* self,
|
|
1111
1051
|
}
|
1112
1052
|
|
1113
1053
|
const char* session_reused = SSL_session_reused(impl->ssl) ? "true" : "false";
|
1114
|
-
result =
|
1054
|
+
result = tsi_construct_string_peer_property_from_cstring(
|
1115
1055
|
TSI_SSL_SESSION_REUSED_PEER_PROPERTY, session_reused,
|
1116
|
-
|
1056
|
+
&peer->properties[peer->property_count]);
|
1117
1057
|
if (result != TSI_OK) return result;
|
1118
1058
|
peer->property_count++;
|
1119
1059
|
|
1120
1060
|
return result;
|
1121
1061
|
}
|
1122
1062
|
|
1123
|
-
static tsi_result
|
1124
|
-
|
1063
|
+
static tsi_result ssl_handshaker_result_create_frame_protector(
|
1064
|
+
const tsi_handshaker_result* self, size_t* max_output_protected_frame_size,
|
1125
1065
|
tsi_frame_protector** protector) {
|
1126
1066
|
size_t actual_max_output_protected_frame_size =
|
1127
1067
|
TSI_SSL_MAX_PROTECTED_FRAME_SIZE_UPPER_BOUND;
|
1128
|
-
|
1068
|
+
tsi_ssl_handshaker_result* impl =
|
1069
|
+
reinterpret_cast<tsi_ssl_handshaker_result*>(
|
1070
|
+
const_cast<tsi_handshaker_result*>(self));
|
1129
1071
|
tsi_ssl_frame_protector* protector_impl =
|
1130
1072
|
static_cast<tsi_ssl_frame_protector*>(
|
1131
1073
|
gpr_zalloc(sizeof(*protector_impl)));
|
@@ -1153,35 +1095,218 @@ static tsi_result ssl_handshaker_create_frame_protector(
|
|
1153
1095
|
return TSI_INTERNAL_ERROR;
|
1154
1096
|
}
|
1155
1097
|
|
1156
|
-
/* Transfer ownership of ssl and network_io to the frame protector.
|
1157
|
-
* as the caller cannot call anything else but destroy on the handshaker
|
1158
|
-
* after this call. */
|
1098
|
+
/* Transfer ownership of ssl and network_io to the frame protector. */
|
1159
1099
|
protector_impl->ssl = impl->ssl;
|
1160
1100
|
impl->ssl = nullptr;
|
1161
1101
|
protector_impl->network_io = impl->network_io;
|
1162
1102
|
impl->network_io = nullptr;
|
1163
|
-
|
1164
1103
|
protector_impl->base.vtable = &frame_protector_vtable;
|
1165
1104
|
*protector = &protector_impl->base;
|
1166
1105
|
return TSI_OK;
|
1167
1106
|
}
|
1168
1107
|
|
1108
|
+
static tsi_result ssl_handshaker_result_get_unused_bytes(
|
1109
|
+
const tsi_handshaker_result* self, const unsigned char** bytes,
|
1110
|
+
size_t* bytes_size) {
|
1111
|
+
const tsi_ssl_handshaker_result* impl =
|
1112
|
+
reinterpret_cast<const tsi_ssl_handshaker_result*>(self);
|
1113
|
+
*bytes_size = impl->unused_bytes_size;
|
1114
|
+
*bytes = impl->unused_bytes;
|
1115
|
+
return TSI_OK;
|
1116
|
+
}
|
1117
|
+
|
1118
|
+
static void ssl_handshaker_result_destroy(tsi_handshaker_result* self) {
|
1119
|
+
tsi_ssl_handshaker_result* impl =
|
1120
|
+
reinterpret_cast<tsi_ssl_handshaker_result*>(self);
|
1121
|
+
SSL_free(impl->ssl);
|
1122
|
+
BIO_free(impl->network_io);
|
1123
|
+
gpr_free(impl->unused_bytes);
|
1124
|
+
gpr_free(impl);
|
1125
|
+
}
|
1126
|
+
|
1127
|
+
static const tsi_handshaker_result_vtable handshaker_result_vtable = {
|
1128
|
+
ssl_handshaker_result_extract_peer,
|
1129
|
+
nullptr, /* create_zero_copy_grpc_protector */
|
1130
|
+
ssl_handshaker_result_create_frame_protector,
|
1131
|
+
ssl_handshaker_result_get_unused_bytes,
|
1132
|
+
ssl_handshaker_result_destroy,
|
1133
|
+
};
|
1134
|
+
|
1135
|
+
static tsi_result ssl_handshaker_result_create(
|
1136
|
+
tsi_ssl_handshaker* handshaker, const unsigned char* unused_bytes,
|
1137
|
+
size_t unused_bytes_size, tsi_handshaker_result** handshaker_result) {
|
1138
|
+
if (handshaker == nullptr || handshaker_result == nullptr ||
|
1139
|
+
(unused_bytes_size > 0 && unused_bytes == nullptr)) {
|
1140
|
+
return TSI_INVALID_ARGUMENT;
|
1141
|
+
}
|
1142
|
+
tsi_ssl_handshaker_result* result =
|
1143
|
+
static_cast<tsi_ssl_handshaker_result*>(gpr_zalloc(sizeof(*result)));
|
1144
|
+
result->base.vtable = &handshaker_result_vtable;
|
1145
|
+
/* Transfer ownership of ssl and network_io to the handshaker result. */
|
1146
|
+
result->ssl = handshaker->ssl;
|
1147
|
+
handshaker->ssl = nullptr;
|
1148
|
+
result->network_io = handshaker->network_io;
|
1149
|
+
handshaker->network_io = nullptr;
|
1150
|
+
if (unused_bytes_size > 0) {
|
1151
|
+
result->unused_bytes =
|
1152
|
+
static_cast<unsigned char*>(gpr_malloc(unused_bytes_size));
|
1153
|
+
memcpy(result->unused_bytes, unused_bytes, unused_bytes_size);
|
1154
|
+
}
|
1155
|
+
result->unused_bytes_size = unused_bytes_size;
|
1156
|
+
*handshaker_result = &result->base;
|
1157
|
+
return TSI_OK;
|
1158
|
+
}
|
1159
|
+
|
1160
|
+
/* --- tsi_handshaker methods implementation. ---*/
|
1161
|
+
|
1162
|
+
static tsi_result ssl_handshaker_get_bytes_to_send_to_peer(
|
1163
|
+
tsi_ssl_handshaker* impl, unsigned char* bytes, size_t* bytes_size) {
|
1164
|
+
int bytes_read_from_ssl = 0;
|
1165
|
+
if (bytes == nullptr || bytes_size == nullptr || *bytes_size == 0 ||
|
1166
|
+
*bytes_size > INT_MAX) {
|
1167
|
+
return TSI_INVALID_ARGUMENT;
|
1168
|
+
}
|
1169
|
+
GPR_ASSERT(*bytes_size <= INT_MAX);
|
1170
|
+
bytes_read_from_ssl =
|
1171
|
+
BIO_read(impl->network_io, bytes, static_cast<int>(*bytes_size));
|
1172
|
+
if (bytes_read_from_ssl < 0) {
|
1173
|
+
*bytes_size = 0;
|
1174
|
+
if (!BIO_should_retry(impl->network_io)) {
|
1175
|
+
impl->result = TSI_INTERNAL_ERROR;
|
1176
|
+
return impl->result;
|
1177
|
+
} else {
|
1178
|
+
return TSI_OK;
|
1179
|
+
}
|
1180
|
+
}
|
1181
|
+
*bytes_size = static_cast<size_t>(bytes_read_from_ssl);
|
1182
|
+
return BIO_pending(impl->network_io) == 0 ? TSI_OK : TSI_INCOMPLETE_DATA;
|
1183
|
+
}
|
1184
|
+
|
1185
|
+
static tsi_result ssl_handshaker_get_result(tsi_ssl_handshaker* impl) {
|
1186
|
+
if ((impl->result == TSI_HANDSHAKE_IN_PROGRESS) &&
|
1187
|
+
SSL_is_init_finished(impl->ssl)) {
|
1188
|
+
impl->result = TSI_OK;
|
1189
|
+
}
|
1190
|
+
return impl->result;
|
1191
|
+
}
|
1192
|
+
|
1193
|
+
static tsi_result ssl_handshaker_process_bytes_from_peer(
|
1194
|
+
tsi_ssl_handshaker* impl, const unsigned char* bytes, size_t* bytes_size) {
|
1195
|
+
int bytes_written_into_ssl_size = 0;
|
1196
|
+
if (bytes == nullptr || bytes_size == nullptr || *bytes_size > INT_MAX) {
|
1197
|
+
return TSI_INVALID_ARGUMENT;
|
1198
|
+
}
|
1199
|
+
GPR_ASSERT(*bytes_size <= INT_MAX);
|
1200
|
+
bytes_written_into_ssl_size =
|
1201
|
+
BIO_write(impl->network_io, bytes, static_cast<int>(*bytes_size));
|
1202
|
+
if (bytes_written_into_ssl_size < 0) {
|
1203
|
+
gpr_log(GPR_ERROR, "Could not write to memory BIO.");
|
1204
|
+
impl->result = TSI_INTERNAL_ERROR;
|
1205
|
+
return impl->result;
|
1206
|
+
}
|
1207
|
+
*bytes_size = static_cast<size_t>(bytes_written_into_ssl_size);
|
1208
|
+
|
1209
|
+
if (ssl_handshaker_get_result(impl) != TSI_HANDSHAKE_IN_PROGRESS) {
|
1210
|
+
impl->result = TSI_OK;
|
1211
|
+
return impl->result;
|
1212
|
+
} else {
|
1213
|
+
/* Get ready to get some bytes from SSL. */
|
1214
|
+
int ssl_result = SSL_do_handshake(impl->ssl);
|
1215
|
+
ssl_result = SSL_get_error(impl->ssl, ssl_result);
|
1216
|
+
switch (ssl_result) {
|
1217
|
+
case SSL_ERROR_WANT_READ:
|
1218
|
+
if (BIO_pending(impl->network_io) == 0) {
|
1219
|
+
/* We need more data. */
|
1220
|
+
return TSI_INCOMPLETE_DATA;
|
1221
|
+
} else {
|
1222
|
+
return TSI_OK;
|
1223
|
+
}
|
1224
|
+
case SSL_ERROR_NONE:
|
1225
|
+
return TSI_OK;
|
1226
|
+
default: {
|
1227
|
+
char err_str[256];
|
1228
|
+
ERR_error_string_n(ERR_get_error(), err_str, sizeof(err_str));
|
1229
|
+
gpr_log(GPR_ERROR, "Handshake failed with fatal error %s: %s.",
|
1230
|
+
ssl_error_string(ssl_result), err_str);
|
1231
|
+
impl->result = TSI_PROTOCOL_FAILURE;
|
1232
|
+
return impl->result;
|
1233
|
+
}
|
1234
|
+
}
|
1235
|
+
}
|
1236
|
+
}
|
1237
|
+
|
1169
1238
|
static void ssl_handshaker_destroy(tsi_handshaker* self) {
|
1170
1239
|
tsi_ssl_handshaker* impl = reinterpret_cast<tsi_ssl_handshaker*>(self);
|
1171
1240
|
SSL_free(impl->ssl);
|
1172
1241
|
BIO_free(impl->network_io);
|
1242
|
+
gpr_free(impl->outgoing_bytes_buffer);
|
1173
1243
|
tsi_ssl_handshaker_factory_unref(impl->factory_ref);
|
1174
1244
|
gpr_free(impl);
|
1175
1245
|
}
|
1176
1246
|
|
1247
|
+
static tsi_result ssl_handshaker_next(
|
1248
|
+
tsi_handshaker* self, const unsigned char* received_bytes,
|
1249
|
+
size_t received_bytes_size, const unsigned char** bytes_to_send,
|
1250
|
+
size_t* bytes_to_send_size, tsi_handshaker_result** handshaker_result,
|
1251
|
+
tsi_handshaker_on_next_done_cb cb, void* user_data) {
|
1252
|
+
/* Input sanity check. */
|
1253
|
+
if ((received_bytes_size > 0 && received_bytes == nullptr) ||
|
1254
|
+
bytes_to_send == nullptr || bytes_to_send_size == nullptr ||
|
1255
|
+
handshaker_result == nullptr) {
|
1256
|
+
return TSI_INVALID_ARGUMENT;
|
1257
|
+
}
|
1258
|
+
/* If there are received bytes, process them first. */
|
1259
|
+
tsi_ssl_handshaker* impl = reinterpret_cast<tsi_ssl_handshaker*>(self);
|
1260
|
+
tsi_result status = TSI_OK;
|
1261
|
+
size_t bytes_consumed = received_bytes_size;
|
1262
|
+
if (received_bytes_size > 0) {
|
1263
|
+
status = ssl_handshaker_process_bytes_from_peer(impl, received_bytes,
|
1264
|
+
&bytes_consumed);
|
1265
|
+
if (status != TSI_OK) return status;
|
1266
|
+
}
|
1267
|
+
/* Get bytes to send to the peer, if available. */
|
1268
|
+
size_t offset = 0;
|
1269
|
+
do {
|
1270
|
+
size_t to_send_size = impl->outgoing_bytes_buffer_size - offset;
|
1271
|
+
status = ssl_handshaker_get_bytes_to_send_to_peer(
|
1272
|
+
impl, impl->outgoing_bytes_buffer + offset, &to_send_size);
|
1273
|
+
offset += to_send_size;
|
1274
|
+
if (status == TSI_INCOMPLETE_DATA) {
|
1275
|
+
impl->outgoing_bytes_buffer_size *= 2;
|
1276
|
+
impl->outgoing_bytes_buffer = static_cast<unsigned char*>(gpr_realloc(
|
1277
|
+
impl->outgoing_bytes_buffer, impl->outgoing_bytes_buffer_size));
|
1278
|
+
}
|
1279
|
+
} while (status == TSI_INCOMPLETE_DATA);
|
1280
|
+
if (status != TSI_OK) return status;
|
1281
|
+
*bytes_to_send = impl->outgoing_bytes_buffer;
|
1282
|
+
*bytes_to_send_size = offset;
|
1283
|
+
/* If handshake completes, create tsi_handshaker_result. */
|
1284
|
+
if (ssl_handshaker_get_result(impl) == TSI_HANDSHAKE_IN_PROGRESS) {
|
1285
|
+
*handshaker_result = nullptr;
|
1286
|
+
} else {
|
1287
|
+
size_t unused_bytes_size = received_bytes_size - bytes_consumed;
|
1288
|
+
const unsigned char* unused_bytes =
|
1289
|
+
unused_bytes_size == 0 ? nullptr : received_bytes + bytes_consumed;
|
1290
|
+
status = ssl_handshaker_result_create(impl, unused_bytes, unused_bytes_size,
|
1291
|
+
handshaker_result);
|
1292
|
+
if (status == TSI_OK) {
|
1293
|
+
/* Indicates that the handshake has completed and that a handshaker_result
|
1294
|
+
* has been created. */
|
1295
|
+
self->handshaker_result_created = true;
|
1296
|
+
}
|
1297
|
+
}
|
1298
|
+
return status;
|
1299
|
+
}
|
1300
|
+
|
1177
1301
|
static const tsi_handshaker_vtable handshaker_vtable = {
|
1178
|
-
|
1179
|
-
|
1180
|
-
|
1181
|
-
|
1182
|
-
|
1302
|
+
nullptr, /* get_bytes_to_send_to_peer -- deprecated */
|
1303
|
+
nullptr, /* process_bytes_from_peer -- deprecated */
|
1304
|
+
nullptr, /* get_result -- deprecated */
|
1305
|
+
nullptr, /* extract_peer -- deprecated */
|
1306
|
+
nullptr, /* create_frame_protector -- deprecated */
|
1183
1307
|
ssl_handshaker_destroy,
|
1184
|
-
|
1308
|
+
ssl_handshaker_next,
|
1309
|
+
nullptr, /* shutdown */
|
1185
1310
|
};
|
1186
1311
|
|
1187
1312
|
/* --- tsi_ssl_handshaker_factory common methods. --- */
|
@@ -1259,6 +1384,10 @@ static tsi_result create_tsi_ssl_handshaker(SSL_CTX* ctx, int is_client,
|
|
1259
1384
|
impl->ssl = ssl;
|
1260
1385
|
impl->network_io = network_io;
|
1261
1386
|
impl->result = TSI_HANDSHAKE_IN_PROGRESS;
|
1387
|
+
impl->outgoing_bytes_buffer_size =
|
1388
|
+
TSI_SSL_HANDSHAKER_OUTGOING_BUFFER_INITIAL_SIZE;
|
1389
|
+
impl->outgoing_bytes_buffer =
|
1390
|
+
static_cast<unsigned char*>(gpr_zalloc(impl->outgoing_bytes_buffer_size));
|
1262
1391
|
impl->base.vtable = &handshaker_vtable;
|
1263
1392
|
impl->factory_ref = tsi_ssl_handshaker_factory_ref(factory);
|
1264
1393
|
|