grpc 1.0.1 → 1.1.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +3696 -867
- data/etc/roots.pem +39 -111
- data/include/grpc/byte_buffer.h +64 -1
- data/include/grpc/census.h +40 -96
- data/include/grpc/compression.h +2 -1
- data/include/grpc/grpc.h +42 -7
- data/include/grpc/grpc_posix.h +8 -5
- data/include/grpc/impl/codegen/atm.h +3 -0
- data/include/grpc/impl/codegen/atm_gcc_atomic.h +2 -0
- data/include/grpc/impl/codegen/atm_gcc_sync.h +8 -0
- data/include/grpc/impl/codegen/atm_windows.h +4 -0
- data/include/grpc/impl/codegen/byte_buffer_reader.h +4 -4
- data/include/grpc/impl/codegen/compression_types.h +1 -1
- data/include/grpc/impl/codegen/connectivity_state.h +2 -0
- data/include/grpc/impl/codegen/exec_ctx_fwd.h +41 -0
- data/include/grpc/impl/codegen/gpr_slice.h +84 -0
- data/include/grpc/impl/codegen/{alloc.h → gpr_types.h} +30 -29
- data/include/grpc/impl/codegen/grpc_types.h +91 -9
- data/include/grpc/impl/codegen/port_platform.h +25 -92
- data/include/grpc/impl/codegen/slice.h +54 -97
- data/include/grpc/impl/codegen/sync.h +0 -253
- data/include/grpc/module.modulemap +0 -2
- data/include/grpc/slice.h +132 -0
- data/include/grpc/{impl/codegen/slice_buffer.h → slice_buffer.h} +22 -39
- data/include/grpc/support/alloc.h +40 -1
- data/include/grpc/support/log.h +80 -1
- data/include/grpc/support/log_windows.h +2 -0
- data/include/grpc/support/string_util.h +1 -1
- data/include/grpc/support/sync.h +252 -0
- data/include/grpc/support/time.h +67 -1
- data/src/boringssl/err_data.c +639 -627
- data/src/core/ext/census/base_resources.c +71 -0
- data/src/core/ext/census/base_resources.h +39 -0
- data/src/core/ext/census/gen/census.pb.c +26 -29
- data/src/core/ext/census/gen/census.pb.h +68 -67
- data/src/core/ext/census/gen/trace_context.pb.c +81 -0
- data/src/core/ext/census/gen/trace_context.pb.h +99 -0
- data/src/core/ext/census/grpc_filter.c +22 -16
- data/src/core/ext/census/grpc_plugin.c +2 -1
- data/src/core/ext/census/initialize.c +16 -4
- data/src/core/ext/census/mlog.h +1 -1
- data/src/core/ext/census/placeholders.c +0 -45
- data/src/core/ext/census/resource.c +312 -0
- data/src/core/ext/census/resource.h +63 -0
- data/src/core/ext/census/trace_context.c +86 -0
- data/src/core/ext/census/trace_context.h +68 -0
- data/src/core/ext/census/tracing.c +8 -2
- data/src/core/ext/{client_config → client_channel}/channel_connectivity.c +8 -4
- data/src/core/ext/client_channel/client_channel.c +1218 -0
- data/src/core/ext/{client_config → client_channel}/client_channel.h +8 -11
- data/src/core/ext/{client_config → client_channel}/client_channel_factory.c +33 -3
- data/src/core/ext/{client_config → client_channel}/client_channel_factory.h +15 -8
- data/src/core/ext/{client_config/client_config_plugin.c → client_channel/client_channel_plugin.c} +16 -15
- data/src/core/ext/{client_config → client_channel}/connector.c +1 -1
- data/src/core/ext/{client_config → client_channel}/connector.h +5 -8
- data/{include/grpc/support/slice_buffer.h → src/core/ext/client_channel/default_initial_connect_string.c} +4 -5
- data/src/core/ext/client_channel/http_connect_handshaker.c +399 -0
- data/src/core/ext/client_channel/http_connect_handshaker.h +52 -0
- data/src/core/ext/{client_config → client_channel}/initial_connect_string.c +6 -7
- data/src/core/ext/{client_config → client_channel}/initial_connect_string.h +10 -10
- data/src/core/ext/{client_config → client_channel}/lb_policy.c +11 -11
- data/src/core/ext/{client_config → client_channel}/lb_policy.h +68 -27
- data/src/core/ext/client_channel/lb_policy_factory.c +163 -0
- data/src/core/ext/{client_config → client_channel}/lb_policy_factory.h +64 -9
- data/src/core/ext/{client_config → client_channel}/lb_policy_registry.c +6 -4
- data/src/core/ext/{client_config → client_channel}/lb_policy_registry.h +4 -4
- data/src/core/ext/{client_config → client_channel}/parse_address.c +21 -14
- data/src/core/ext/{client_config → client_channel}/parse_address.h +8 -10
- data/src/core/ext/{client_config → client_channel}/resolver.c +3 -4
- data/src/core/ext/{client_config → client_channel}/resolver.h +11 -15
- data/src/core/ext/{client_config → client_channel}/resolver_factory.c +4 -3
- data/src/core/ext/{client_config → client_channel}/resolver_factory.h +13 -11
- data/src/core/ext/{client_config → client_channel}/resolver_registry.c +54 -34
- data/src/core/ext/{client_config → client_channel}/resolver_registry.h +21 -8
- data/src/core/ext/{client_config → client_channel}/subchannel.c +208 -119
- data/src/core/ext/{client_config → client_channel}/subchannel.h +21 -11
- data/src/core/ext/{client_config → client_channel}/subchannel_index.c +6 -17
- data/src/core/ext/{client_config → client_channel}/subchannel_index.h +7 -7
- data/src/core/ext/{client_config → client_channel}/uri_parser.c +21 -28
- data/src/core/ext/{client_config → client_channel}/uri_parser.h +3 -3
- data/src/core/ext/lb_policy/grpclb/grpclb.c +1406 -0
- data/src/core/ext/lb_policy/grpclb/grpclb.h +44 -0
- data/src/core/ext/lb_policy/grpclb/load_balancer_api.c +117 -37
- data/src/core/ext/lb_policy/grpclb/load_balancer_api.h +31 -12
- data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +6 -36
- data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +22 -42
- data/src/core/ext/lb_policy/pick_first/pick_first.c +64 -46
- data/src/core/ext/lb_policy/round_robin/round_robin.c +324 -160
- data/src/core/ext/load_reporting/load_reporting.c +7 -56
- data/src/core/ext/load_reporting/load_reporting.h +41 -28
- data/src/core/ext/load_reporting/load_reporting_filter.c +132 -42
- data/src/core/ext/load_reporting/load_reporting_filter.h +1 -0
- data/src/core/ext/resolver/dns/native/dns_resolver.c +88 -80
- data/src/core/ext/resolver/sockaddr/sockaddr_resolver.c +57 -102
- data/src/core/ext/transport/chttp2/alpn/alpn.c +1 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.c +253 -0
- data/src/core/{lib/iomgr/ev_poll_and_epoll_posix.h → ext/transport/chttp2/client/chttp2_connector.h} +5 -5
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +31 -160
- data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.c +5 -5
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c +44 -243
- data/src/core/ext/transport/chttp2/server/chttp2_server.c +342 -0
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +47 -0
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.c +11 -124
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.c +20 -9
- data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c +28 -236
- data/src/core/ext/transport/chttp2/transport/bin_decoder.c +31 -27
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +5 -4
- data/src/core/ext/transport/chttp2/transport/bin_encoder.c +25 -22
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +8 -7
- data/src/core/ext/transport/chttp2/transport/chttp2_plugin.c +0 -3
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +1345 -1521
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -1
- data/src/core/ext/transport/chttp2/transport/frame.h +3 -5
- data/src/core/ext/transport/chttp2/transport/frame_data.c +50 -47
- data/src/core/ext/transport/chttp2/transport/frame_data.h +8 -9
- data/src/core/ext/transport/chttp2/transport/frame_goaway.c +19 -21
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +9 -8
- data/src/core/ext/transport/chttp2/transport/frame_ping.c +13 -12
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +6 -6
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +31 -19
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +8 -7
- data/src/core/ext/transport/chttp2/transport/frame_settings.c +22 -25
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +9 -8
- data/src/core/ext/transport/chttp2/transport/frame_window_update.c +26 -18
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +5 -6
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.c +68 -58
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -5
- data/src/core/ext/transport/chttp2/transport/hpack_parser.c +327 -214
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +14 -9
- data/src/core/ext/transport/chttp2/transport/hpack_table.c +24 -19
- data/src/core/ext/transport/chttp2/transport/hpack_table.h +9 -6
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.c +2 -2
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +1 -1
- data/src/core/ext/transport/chttp2/transport/internal.h +284 -436
- data/src/core/ext/transport/chttp2/transport/parsing.c +355 -590
- data/src/core/ext/transport/chttp2/transport/stream_lists.c +36 -309
- data/src/core/ext/transport/chttp2/transport/stream_map.c +13 -34
- data/src/core/ext/transport/chttp2/transport/stream_map.h +3 -4
- data/src/core/ext/transport/chttp2/transport/writing.c +174 -286
- data/src/core/lib/channel/channel_args.c +70 -13
- data/src/core/lib/channel/channel_args.h +28 -2
- data/src/core/lib/channel/channel_stack.c +77 -28
- data/src/core/lib/channel/channel_stack.h +61 -23
- data/src/core/lib/channel/channel_stack_builder.c +33 -25
- data/src/core/lib/channel/channel_stack_builder.h +17 -8
- data/src/core/lib/channel/compress_filter.c +52 -36
- data/src/core/lib/channel/connected_channel.c +20 -12
- data/src/core/lib/channel/connected_channel.h +2 -1
- data/src/core/lib/channel/context.h +13 -1
- data/src/core/lib/channel/deadline_filter.c +344 -0
- data/src/core/lib/channel/deadline_filter.h +99 -0
- data/src/core/lib/channel/handshaker.c +240 -0
- data/src/core/lib/channel/handshaker.h +164 -0
- data/src/core/lib/{security/credentials/google_default/credentials_windows.c → channel/handshaker_factory.c} +16 -23
- data/src/core/lib/channel/handshaker_factory.h +66 -0
- data/src/core/lib/channel/handshaker_registry.c +113 -0
- data/src/core/{ext/client_config/client_config.h → lib/channel/handshaker_registry.h} +26 -16
- data/src/core/lib/channel/http_client_filter.c +248 -46
- data/src/core/lib/channel/http_client_filter.h +3 -0
- data/src/core/lib/channel/http_server_filter.c +136 -24
- data/src/core/lib/channel/message_size_filter.c +261 -0
- data/src/core/lib/channel/message_size_filter.h +39 -0
- data/src/core/lib/compression/message_compress.c +43 -37
- data/src/core/lib/compression/message_compress.h +7 -5
- data/src/core/lib/http/format_request.c +26 -11
- data/src/core/lib/http/format_request.h +7 -5
- data/src/core/lib/http/httpcli.c +45 -27
- data/src/core/lib/http/httpcli.h +4 -4
- data/src/core/lib/http/httpcli_security_connector.c +56 -46
- data/src/core/lib/http/parser.c +17 -14
- data/src/core/lib/http/parser.h +4 -2
- data/src/core/lib/iomgr/closure.c +49 -7
- data/src/core/lib/iomgr/closure.h +56 -14
- data/src/core/lib/iomgr/combiner.c +422 -0
- data/src/core/lib/iomgr/combiner.h +64 -0
- data/src/core/lib/iomgr/endpoint.c +8 -2
- data/src/core/lib/iomgr/endpoint.h +17 -7
- data/src/core/lib/iomgr/endpoint_pair.h +3 -2
- data/src/core/lib/iomgr/endpoint_pair_posix.c +9 -8
- data/src/core/{ext/client_config/lb_policy_factory.c → lib/iomgr/endpoint_pair_uv.c} +18 -13
- data/src/core/lib/iomgr/endpoint_pair_windows.c +7 -6
- data/src/core/lib/iomgr/error.c +72 -6
- data/src/core/lib/iomgr/error.h +30 -3
- data/src/core/lib/iomgr/ev_epoll_linux.c +500 -382
- data/src/core/lib/iomgr/ev_epoll_linux.h +3 -2
- data/src/core/lib/iomgr/ev_poll_posix.c +317 -30
- data/src/core/lib/iomgr/ev_poll_posix.h +1 -0
- data/src/core/lib/iomgr/ev_posix.c +26 -5
- data/src/core/lib/iomgr/ev_posix.h +12 -1
- data/src/core/lib/iomgr/exec_ctx.c +27 -94
- data/src/core/lib/iomgr/exec_ctx.h +19 -22
- data/src/core/lib/iomgr/executor.c +29 -8
- data/src/core/lib/iomgr/executor.h +2 -4
- data/src/core/lib/iomgr/iocp_windows.c +3 -4
- data/src/core/lib/iomgr/iomgr.c +14 -10
- data/src/core/lib/iomgr/iomgr.h +6 -2
- data/src/core/lib/iomgr/iomgr_posix.c +2 -2
- data/src/core/lib/iomgr/iomgr_uv.c +49 -0
- data/src/core/lib/iomgr/iomgr_windows.c +2 -2
- data/src/core/lib/iomgr/load_file.c +3 -3
- data/src/core/lib/iomgr/load_file.h +2 -2
- data/src/core/lib/iomgr/network_status_tracker.c +1 -1
- data/src/core/lib/iomgr/pollset_set_uv.c +62 -0
- data/src/core/lib/iomgr/pollset_set_windows.c +3 -3
- data/src/core/lib/iomgr/pollset_uv.c +142 -0
- data/src/core/lib/iomgr/pollset_uv.h +42 -0
- data/src/core/lib/iomgr/pollset_windows.c +5 -6
- data/src/core/lib/iomgr/port.h +129 -0
- data/src/core/lib/iomgr/resolve_address.h +2 -1
- data/src/core/lib/iomgr/resolve_address_posix.c +14 -13
- data/src/core/lib/iomgr/resolve_address_uv.c +233 -0
- data/src/core/lib/iomgr/resolve_address_windows.c +14 -12
- data/src/core/lib/iomgr/resource_quota.c +832 -0
- data/src/core/lib/iomgr/resource_quota.h +159 -0
- data/src/core/lib/iomgr/sockaddr.h +10 -2
- data/src/core/lib/iomgr/sockaddr_utils.c +63 -36
- data/src/core/lib/iomgr/sockaddr_utils.h +14 -14
- data/src/core/lib/iomgr/socket_mutator.c +98 -0
- data/src/core/lib/iomgr/socket_mutator.h +80 -0
- data/src/core/lib/iomgr/socket_utils.h +42 -0
- data/src/core/lib/iomgr/socket_utils_common_posix.c +28 -13
- data/src/core/lib/iomgr/socket_utils_linux.c +11 -5
- data/src/core/lib/iomgr/socket_utils_posix.c +10 -7
- data/src/core/lib/iomgr/socket_utils_posix.h +11 -4
- data/src/core/lib/iomgr/socket_utils_uv.c +49 -0
- data/src/core/lib/iomgr/socket_utils_windows.c +52 -0
- data/src/core/lib/iomgr/socket_windows.c +14 -6
- data/src/core/lib/iomgr/socket_windows.h +1 -0
- data/src/core/lib/iomgr/tcp_client.h +8 -2
- data/src/core/lib/iomgr/tcp_client_posix.c +131 -82
- data/src/core/lib/iomgr/tcp_client_posix.h +45 -0
- data/src/core/lib/iomgr/tcp_client_uv.c +190 -0
- data/src/core/lib/iomgr/tcp_client_windows.c +54 -30
- data/src/core/lib/iomgr/tcp_posix.c +135 -56
- data/src/core/lib/iomgr/tcp_posix.h +2 -2
- data/src/core/lib/iomgr/tcp_server.h +14 -6
- data/src/core/lib/iomgr/tcp_server_posix.c +154 -118
- data/src/core/lib/iomgr/tcp_server_uv.c +388 -0
- data/src/core/lib/iomgr/tcp_server_windows.c +127 -100
- data/src/core/lib/iomgr/tcp_uv.c +367 -0
- data/src/core/lib/iomgr/tcp_uv.h +59 -0
- data/src/core/lib/iomgr/tcp_windows.c +65 -48
- data/src/core/lib/iomgr/tcp_windows.h +3 -1
- data/src/core/lib/iomgr/timer.h +21 -21
- data/src/core/lib/iomgr/{timer.c → timer_generic.c} +15 -10
- data/src/core/lib/iomgr/timer_generic.h +49 -0
- data/src/core/lib/iomgr/timer_heap.c +6 -0
- data/src/core/lib/iomgr/timer_uv.c +99 -0
- data/src/core/lib/iomgr/timer_uv.h +47 -0
- data/src/core/lib/iomgr/udp_server.c +116 -98
- data/src/core/lib/iomgr/udp_server.h +5 -3
- data/src/core/lib/iomgr/unix_sockets_posix.c +14 -6
- data/src/core/lib/iomgr/unix_sockets_posix.h +6 -5
- data/src/core/lib/iomgr/unix_sockets_posix_noop.c +4 -4
- data/src/core/lib/iomgr/wakeup_fd_cv.c +118 -0
- data/src/core/lib/iomgr/wakeup_fd_cv.h +80 -0
- data/src/core/lib/iomgr/wakeup_fd_eventfd.c +3 -3
- data/src/core/lib/iomgr/wakeup_fd_nospecial.c +3 -3
- data/src/core/lib/iomgr/wakeup_fd_pipe.c +12 -6
- data/src/core/lib/iomgr/wakeup_fd_posix.c +34 -5
- data/src/core/lib/iomgr/wakeup_fd_posix.h +5 -0
- data/src/core/lib/iomgr/workqueue.h +12 -20
- data/src/core/{ext/client_config/client_config.c → lib/iomgr/workqueue_uv.c} +24 -33
- data/{include/grpc/support/slice.h → src/core/lib/iomgr/workqueue_uv.h} +4 -6
- data/src/core/lib/iomgr/workqueue_windows.c +9 -8
- data/src/core/lib/json/json.c +3 -3
- data/src/core/lib/json/json.h +11 -11
- data/src/core/lib/json/json_reader.c +9 -5
- data/src/core/lib/profiling/basic_timers.c +10 -1
- data/src/core/lib/profiling/timers.h +2 -0
- data/src/core/lib/security/context/security_context.c +13 -3
- data/src/core/lib/security/context/security_context.h +20 -0
- data/src/core/lib/security/credentials/composite/composite_credentials.c +28 -14
- data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
- data/src/core/lib/security/credentials/credentials.c +48 -19
- data/src/core/lib/security/credentials/credentials.h +36 -19
- data/src/core/lib/security/credentials/credentials_metadata.c +11 -8
- data/src/core/lib/security/credentials/fake/fake_credentials.c +15 -11
- data/src/core/lib/security/credentials/google_default/{credentials_posix.c → credentials_generic.c} +7 -14
- data/src/core/lib/security/credentials/google_default/google_default_credentials.c +33 -21
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +14 -0
- data/src/core/lib/security/credentials/iam/iam_credentials.c +3 -2
- data/src/core/lib/security/credentials/jwt/json_token.c +1 -0
- data/src/core/lib/security/credentials/jwt/json_token.h +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_credentials.c +54 -19
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.c +129 -79
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +9 -6
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.c +63 -28
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
- data/src/core/lib/security/credentials/plugin/plugin_credentials.c +32 -11
- data/src/core/lib/security/credentials/ssl/ssl_credentials.c +13 -9
- data/src/core/lib/security/transport/client_auth_filter.c +33 -27
- data/src/core/lib/security/transport/secure_endpoint.c +93 -68
- data/src/core/lib/security/transport/secure_endpoint.h +2 -2
- data/src/core/lib/security/transport/security_connector.c +133 -168
- data/src/core/lib/security/transport/security_connector.h +31 -46
- data/src/core/lib/security/transport/security_handshaker.c +501 -0
- data/src/core/lib/security/transport/{handshake.h → security_handshaker.h} +10 -10
- data/src/core/lib/security/transport/server_auth_filter.c +50 -38
- data/src/core/lib/security/util/b64.c +11 -8
- data/src/core/lib/security/util/b64.h +5 -4
- data/src/core/lib/slice/percent_encoding.c +182 -0
- data/src/core/lib/slice/percent_encoding.h +78 -0
- data/src/core/lib/{support → slice}/slice.c +81 -50
- data/src/core/lib/{support → slice}/slice_buffer.c +78 -60
- data/src/core/lib/slice/slice_internal.h +49 -0
- data/src/core/lib/slice/slice_string_helpers.c +90 -0
- data/src/core/lib/{iomgr/workqueue_posix.h → slice/slice_string_helpers.h} +18 -18
- data/src/core/lib/support/backoff.c +24 -13
- data/src/core/lib/support/backoff.h +5 -2
- data/src/core/lib/support/env.h +0 -2
- data/src/core/lib/support/log.c +5 -4
- data/src/core/lib/support/log_linux.c +0 -1
- data/src/core/lib/support/log_posix.c +1 -1
- data/src/core/lib/support/mpscq.c +83 -0
- data/src/core/lib/support/mpscq.h +65 -0
- data/src/core/lib/support/string.c +58 -49
- data/src/core/lib/support/string.h +11 -8
- data/src/core/lib/support/subprocess_posix.c +5 -2
- data/src/core/lib/support/thd.c +1 -1
- data/src/core/lib/support/time.c +43 -79
- data/src/core/lib/support/time_posix.c +1 -1
- data/src/core/lib/support/tmpfile.h +0 -2
- data/src/core/lib/surface/alarm.c +4 -1
- data/src/core/lib/surface/byte_buffer.c +17 -11
- data/src/core/lib/surface/byte_buffer_reader.c +23 -15
- data/src/core/lib/surface/call.c +294 -276
- data/src/core/lib/surface/call.h +24 -9
- data/src/core/lib/surface/call_log_batch.c +5 -3
- data/src/core/lib/surface/channel.c +127 -111
- data/src/core/lib/surface/channel.h +14 -5
- data/src/core/lib/surface/channel_init.c +1 -1
- data/src/core/lib/surface/channel_init.h +10 -1
- data/src/core/lib/surface/channel_ping.c +7 -6
- data/src/core/lib/surface/completion_queue.c +154 -18
- data/src/core/lib/surface/completion_queue.h +5 -0
- data/src/core/lib/surface/init.c +40 -6
- data/src/core/lib/surface/init.h +1 -0
- data/src/core/lib/surface/init_secure.c +5 -2
- data/src/core/lib/surface/lame_client.c +28 -18
- data/src/core/lib/surface/server.c +134 -87
- data/src/core/lib/surface/server.h +8 -0
- data/src/core/lib/surface/validate_metadata.c +1 -1
- data/src/core/lib/surface/version.c +3 -1
- data/src/core/lib/transport/byte_stream.c +7 -4
- data/src/core/lib/transport/byte_stream.h +6 -10
- data/src/core/lib/transport/connectivity_state.c +21 -12
- data/src/core/lib/transport/connectivity_state.h +4 -1
- data/src/core/lib/transport/mdstr_hash_table.c +118 -0
- data/src/core/lib/transport/mdstr_hash_table.h +77 -0
- data/src/core/lib/transport/metadata.c +83 -60
- data/src/core/lib/transport/metadata.h +41 -23
- data/src/core/lib/transport/metadata_batch.c +17 -11
- data/src/core/lib/transport/metadata_batch.h +20 -6
- data/src/core/lib/transport/pid_controller.c +57 -0
- data/src/core/lib/transport/pid_controller.h +64 -0
- data/src/core/lib/transport/service_config.c +251 -0
- data/src/core/lib/transport/service_config.h +71 -0
- data/src/core/lib/transport/static_metadata.c +18 -16
- data/src/core/lib/transport/static_metadata.h +113 -107
- data/src/core/{ext/transport/chttp2 → lib}/transport/timeout_encoding.c +3 -3
- data/src/core/{ext/transport/chttp2 → lib}/transport/timeout_encoding.h +7 -7
- data/src/core/lib/transport/transport.c +84 -23
- data/src/core/lib/transport/transport.h +53 -8
- data/src/core/lib/transport/transport_impl.h +3 -0
- data/src/core/lib/transport/transport_op_string.c +92 -20
- data/src/core/lib/tsi/ssl_transport_security.c +3 -1
- data/src/core/plugin_registry/grpc_plugin_registry.c +8 -4
- data/src/ruby/ext/grpc/extconf.rb +0 -1
- data/src/ruby/ext/grpc/rb_byte_buffer.c +8 -7
- data/src/ruby/ext/grpc/rb_call.c +15 -5
- data/src/ruby/ext/grpc/rb_channel.c +1 -1
- data/src/ruby/ext/grpc/rb_compression_options.c +466 -0
- data/src/{core/ext/client_config/default_initial_connect_string.c → ruby/ext/grpc/rb_compression_options.h} +10 -5
- data/src/ruby/ext/grpc/rb_grpc.c +3 -1
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +198 -190
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +306 -294
- data/src/ruby/ext/grpc/rb_server.c +18 -12
- data/src/ruby/lib/grpc/errors.rb +154 -2
- data/src/ruby/lib/grpc/generic/active_call.rb +144 -63
- data/src/ruby/lib/grpc/generic/bidi_call.rb +18 -2
- data/src/ruby/lib/grpc/generic/client_stub.rb +7 -5
- data/src/ruby/lib/grpc/generic/rpc_desc.rb +39 -13
- data/src/ruby/lib/grpc/generic/rpc_server.rb +51 -24
- data/src/ruby/lib/grpc/generic/service.rb +3 -2
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/grpc/health/checker.rb +3 -1
- data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +7 -0
- data/src/ruby/pb/test/client.rb +307 -7
- data/src/ruby/pb/test/server.rb +26 -1
- data/src/ruby/spec/compression_options_spec.rb +164 -0
- data/src/ruby/spec/error_sanity_spec.rb +64 -0
- data/src/ruby/spec/generic/active_call_spec.rb +290 -12
- data/src/ruby/spec/generic/client_stub_spec.rb +91 -41
- data/src/ruby/spec/generic/rpc_desc_spec.rb +36 -16
- data/src/ruby/spec/generic/rpc_server_pool_spec.rb +22 -28
- data/src/ruby/spec/generic/rpc_server_spec.rb +6 -6
- data/src/ruby/spec/pb/health/checker_spec.rb +27 -19
- data/src/ruby/spec/spec_helper.rb +2 -0
- data/third_party/boringssl/crypto/aes/aes.c +12 -12
- data/third_party/boringssl/crypto/aes/mode_wrappers.c +6 -2
- data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +28 -13
- data/third_party/boringssl/crypto/asn1/a_gentm.c +2 -0
- data/third_party/boringssl/crypto/asn1/a_object.c +7 -3
- data/third_party/boringssl/crypto/asn1/a_strnid.c +1 -0
- data/third_party/boringssl/crypto/asn1/a_time.c +0 -11
- data/third_party/boringssl/crypto/asn1/a_type.c +0 -2
- data/third_party/boringssl/crypto/asn1/a_utctm.c +1 -30
- data/third_party/boringssl/crypto/asn1/asn1_lib.c +56 -76
- data/third_party/boringssl/crypto/asn1/asn1_locl.h +0 -10
- data/third_party/boringssl/crypto/asn1/asn1_par.c +0 -322
- data/third_party/boringssl/crypto/asn1/f_enum.c +1 -108
- data/third_party/boringssl/crypto/asn1/f_int.c +1 -106
- data/third_party/boringssl/crypto/asn1/f_string.c +1 -106
- data/third_party/boringssl/crypto/asn1/tasn_dec.c +10 -14
- data/third_party/boringssl/crypto/asn1/tasn_enc.c +17 -11
- data/third_party/boringssl/crypto/asn1/tasn_typ.c +29 -42
- data/third_party/boringssl/crypto/asn1/tasn_utl.c +1 -1
- data/third_party/boringssl/crypto/base64/base64.c +249 -285
- data/third_party/boringssl/crypto/bio/bio.c +13 -23
- data/third_party/boringssl/crypto/bio/bio_mem.c +3 -2
- data/third_party/boringssl/crypto/bio/connect.c +12 -3
- data/third_party/boringssl/crypto/bio/fd.c +22 -15
- data/third_party/boringssl/crypto/bio/file.c +2 -38
- data/third_party/boringssl/crypto/bio/hexdump.c +1 -2
- data/third_party/boringssl/crypto/bio/internal.h +3 -0
- data/third_party/boringssl/crypto/bio/pair.c +1 -1
- data/third_party/boringssl/crypto/bio/socket.c +10 -2
- data/third_party/boringssl/crypto/bio/socket_helper.c +2 -2
- data/third_party/boringssl/crypto/bn/asm/x86_64-gcc.c +0 -8
- data/third_party/boringssl/crypto/bn/bn.c +38 -0
- data/third_party/boringssl/crypto/bn/cmp.c +25 -0
- data/third_party/boringssl/crypto/bn/convert.c +73 -76
- data/third_party/boringssl/crypto/bn/div.c +136 -70
- data/third_party/boringssl/crypto/bn/exponentiation.c +86 -381
- data/third_party/boringssl/crypto/bn/gcd.c +213 -296
- data/third_party/boringssl/crypto/bn/generic.c +0 -80
- data/third_party/boringssl/crypto/bn/internal.h +15 -3
- data/third_party/boringssl/crypto/bn/montgomery.c +57 -207
- data/third_party/boringssl/crypto/bn/montgomery_inv.c +160 -0
- data/third_party/boringssl/crypto/bn/mul.c +2 -1
- data/third_party/boringssl/crypto/bn/prime.c +24 -8
- data/third_party/boringssl/crypto/bn/random.c +47 -33
- data/third_party/boringssl/crypto/bn/sqrt.c +4 -5
- data/third_party/boringssl/crypto/buf/buf.c +25 -21
- data/third_party/boringssl/crypto/bytestring/ber.c +1 -0
- data/third_party/boringssl/crypto/bytestring/cbb.c +50 -22
- data/third_party/boringssl/crypto/bytestring/cbs.c +28 -4
- data/third_party/boringssl/crypto/chacha/{chacha_generic.c → chacha.c} +56 -29
- data/third_party/boringssl/crypto/cipher/aead.c +11 -22
- data/third_party/boringssl/crypto/cipher/cipher.c +2 -2
- data/third_party/boringssl/crypto/cipher/e_aes.c +53 -103
- data/third_party/boringssl/crypto/cipher/e_chacha20poly1305.c +2 -8
- data/third_party/boringssl/crypto/cipher/e_des.c +3 -5
- data/third_party/boringssl/crypto/cipher/e_null.c +1 -1
- data/third_party/boringssl/crypto/cipher/e_rc2.c +1 -1
- data/third_party/boringssl/crypto/cipher/e_rc4.c +1 -1
- data/third_party/boringssl/crypto/cipher/e_ssl3.c +3 -63
- data/third_party/boringssl/crypto/cipher/e_tls.c +12 -83
- data/third_party/boringssl/crypto/cipher/internal.h +8 -10
- data/third_party/boringssl/crypto/cipher/tls_cbc.c +69 -40
- data/third_party/boringssl/crypto/conf/conf.c +2 -1
- data/third_party/boringssl/crypto/cpu-aarch64-linux.c +61 -0
- data/third_party/boringssl/crypto/cpu-arm-linux.c +360 -0
- data/third_party/boringssl/crypto/cpu-arm.c +0 -161
- data/third_party/boringssl/crypto/cpu-intel.c +5 -3
- data/third_party/boringssl/{ssl/test/scoped_types.h → crypto/cpu-ppc64le.c} +21 -9
- data/third_party/boringssl/crypto/crypto.c +29 -7
- data/third_party/boringssl/crypto/curve25519/curve25519.c +284 -242
- data/third_party/boringssl/crypto/curve25519/internal.h +64 -0
- data/third_party/boringssl/crypto/curve25519/spake25519.c +464 -0
- data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +21 -0
- data/third_party/boringssl/crypto/dh/check.c +22 -6
- data/third_party/boringssl/crypto/dh/dh.c +45 -21
- data/third_party/boringssl/crypto/dh/dh_asn1.c +96 -20
- data/third_party/boringssl/crypto/dh/params.c +30 -78
- data/third_party/boringssl/crypto/digest/digest.c +3 -3
- data/third_party/boringssl/crypto/dsa/dsa.c +59 -29
- data/third_party/boringssl/crypto/dsa/dsa_asn1.c +4 -0
- data/third_party/boringssl/crypto/ec/ec.c +84 -140
- data/third_party/boringssl/crypto/ec/ec_asn1.c +82 -52
- data/third_party/boringssl/crypto/ec/ec_key.c +15 -15
- data/third_party/boringssl/crypto/ec/ec_montgomery.c +87 -50
- data/third_party/boringssl/crypto/ec/internal.h +12 -36
- data/third_party/boringssl/crypto/ec/oct.c +11 -11
- data/third_party/boringssl/crypto/ec/p224-64.c +59 -116
- data/third_party/boringssl/crypto/ec/p256-64.c +88 -163
- data/third_party/boringssl/crypto/ec/p256-x86_64.c +46 -58
- data/third_party/boringssl/crypto/ec/simple.c +81 -201
- data/third_party/boringssl/crypto/ec/util-64.c +0 -74
- data/third_party/boringssl/crypto/ecdh/ecdh.c +7 -1
- data/third_party/boringssl/crypto/ecdsa/ecdsa.c +28 -46
- data/third_party/boringssl/crypto/ecdsa/ecdsa_asn1.c +1 -0
- data/third_party/boringssl/crypto/engine/engine.c +1 -1
- data/third_party/boringssl/crypto/err/err.c +3 -3
- data/third_party/boringssl/crypto/evp/evp.c +14 -59
- data/third_party/boringssl/crypto/evp/evp_asn1.c +144 -87
- data/third_party/boringssl/crypto/evp/evp_ctx.c +7 -7
- data/third_party/boringssl/crypto/evp/internal.h +4 -46
- data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +8 -157
- data/third_party/boringssl/crypto/evp/p_ec.c +1 -1
- data/third_party/boringssl/crypto/evp/p_ec_asn1.c +22 -170
- data/third_party/boringssl/crypto/evp/p_rsa.c +1 -1
- data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +10 -548
- data/third_party/boringssl/crypto/evp/print.c +520 -0
- data/third_party/boringssl/crypto/ex_data.c +4 -6
- data/third_party/boringssl/crypto/hkdf/hkdf.c +38 -17
- data/third_party/boringssl/crypto/hmac/hmac.c +6 -6
- data/third_party/boringssl/crypto/internal.h +57 -77
- data/third_party/boringssl/crypto/lhash/lhash.c +6 -10
- data/third_party/boringssl/crypto/md4/md4.c +9 -0
- data/third_party/boringssl/crypto/mem.c +19 -19
- data/third_party/boringssl/crypto/modes/cfb.c +5 -6
- data/third_party/boringssl/crypto/modes/ctr.c +10 -18
- data/third_party/boringssl/crypto/modes/gcm.c +100 -66
- data/third_party/boringssl/crypto/modes/internal.h +15 -27
- data/third_party/boringssl/crypto/modes/ofb.c +9 -22
- data/third_party/boringssl/crypto/newhope/error_correction.c +131 -0
- data/third_party/boringssl/crypto/newhope/internal.h +71 -0
- data/third_party/boringssl/crypto/newhope/newhope.c +174 -0
- data/third_party/boringssl/crypto/newhope/ntt.c +148 -0
- data/third_party/boringssl/crypto/newhope/poly.c +183 -0
- data/third_party/boringssl/crypto/newhope/precomp.c +306 -0
- data/third_party/boringssl/crypto/newhope/reduce.c +42 -0
- data/third_party/boringssl/crypto/obj/obj.c +111 -135
- data/third_party/boringssl/crypto/obj/obj_dat.h +4 -10
- data/third_party/boringssl/crypto/pem/pem_lib.c +6 -43
- data/third_party/boringssl/crypto/pem/pem_pkey.c +10 -19
- data/third_party/boringssl/crypto/pkcs8/p5_pbe.c +1 -0
- data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +2 -1
- data/third_party/boringssl/crypto/pkcs8/p8_pkey.c +2 -2
- data/third_party/boringssl/crypto/pkcs8/pkcs8.c +95 -87
- data/third_party/boringssl/crypto/{test/test_util.h → poly1305/internal.h} +15 -10
- data/third_party/boringssl/crypto/poly1305/poly1305.c +8 -15
- data/third_party/boringssl/crypto/poly1305/poly1305_arm.c +1 -0
- data/third_party/boringssl/crypto/poly1305/poly1305_vec.c +3 -3
- data/third_party/boringssl/crypto/rand/deterministic.c +47 -0
- data/third_party/boringssl/crypto/rand/rand.c +4 -1
- data/third_party/boringssl/crypto/rand/urandom.c +5 -7
- data/third_party/boringssl/crypto/rand/windows.c +5 -8
- data/third_party/boringssl/crypto/rc4/rc4.c +24 -209
- data/third_party/boringssl/crypto/refcount_lock.c +2 -2
- data/third_party/boringssl/crypto/rsa/blinding.c +74 -232
- data/third_party/boringssl/crypto/rsa/internal.h +5 -13
- data/third_party/boringssl/crypto/rsa/padding.c +64 -63
- data/third_party/boringssl/crypto/rsa/rsa.c +50 -28
- data/third_party/boringssl/crypto/rsa/rsa_asn1.c +8 -16
- data/third_party/boringssl/crypto/rsa/rsa_impl.c +134 -122
- data/third_party/boringssl/crypto/sha/sha256.c +2 -2
- data/third_party/boringssl/crypto/sha/sha512.c +7 -7
- data/third_party/boringssl/crypto/stack/stack.c +13 -22
- data/third_party/boringssl/crypto/thread.c +21 -12
- data/third_party/boringssl/crypto/thread_none.c +6 -2
- data/third_party/boringssl/crypto/thread_pthread.c +16 -7
- data/third_party/boringssl/crypto/thread_win.c +38 -85
- data/third_party/boringssl/crypto/x509/a_sign.c +3 -3
- data/third_party/boringssl/crypto/x509/a_strex.c +1 -1
- data/third_party/boringssl/crypto/x509/a_verify.c +2 -2
- data/third_party/boringssl/crypto/{evp → x509}/algorithm.c +37 -53
- data/third_party/boringssl/crypto/x509/asn1_gen.c +1 -2
- data/third_party/boringssl/crypto/x509/by_dir.c +6 -6
- data/third_party/boringssl/crypto/x509/internal.h +66 -0
- data/third_party/boringssl/crypto/x509/rsa_pss.c +385 -0
- data/third_party/boringssl/crypto/x509/t_x509.c +10 -12
- data/third_party/boringssl/crypto/x509/x509.c +5 -0
- data/third_party/boringssl/crypto/x509/x509_att.c +9 -3
- data/third_party/boringssl/crypto/x509/x509_lu.c +34 -44
- data/third_party/boringssl/crypto/x509/x509_obj.c +19 -2
- data/third_party/boringssl/crypto/x509/x509_r2x.c +9 -5
- data/third_party/boringssl/crypto/x509/x509_set.c +5 -0
- data/third_party/boringssl/crypto/x509/x509_txt.c +5 -0
- data/third_party/boringssl/crypto/x509/x509_vfy.c +63 -32
- data/third_party/boringssl/crypto/x509/x509_vpm.c +29 -18
- data/third_party/boringssl/crypto/x509/x509cset.c +2 -1
- data/third_party/boringssl/crypto/x509/x_crl.c +2 -2
- data/third_party/boringssl/crypto/x509/x_name.c +14 -17
- data/third_party/boringssl/crypto/x509/x_pubkey.c +10 -7
- data/third_party/boringssl/crypto/x509/x_x509.c +67 -6
- data/third_party/boringssl/crypto/x509v3/pcy_cache.c +2 -2
- data/third_party/boringssl/crypto/x509v3/pcy_tree.c +2 -1
- data/third_party/boringssl/crypto/x509v3/v3_conf.c +4 -3
- data/third_party/boringssl/crypto/x509v3/v3_cpols.c +5 -0
- data/third_party/boringssl/crypto/x509v3/v3_prn.c +0 -3
- data/third_party/boringssl/crypto/x509v3/v3_purp.c +2 -2
- data/third_party/boringssl/crypto/x509v3/v3_utl.c +2 -1
- data/third_party/boringssl/include/openssl/aead.h +72 -73
- data/third_party/boringssl/include/openssl/arm_arch.h +0 -6
- data/third_party/boringssl/include/openssl/asn1.h +103 -235
- data/third_party/boringssl/include/openssl/asn1_mac.h +17 -74
- data/third_party/boringssl/include/openssl/asn1t.h +1 -11
- data/third_party/boringssl/include/openssl/base.h +145 -3
- data/third_party/boringssl/include/openssl/base64.h +20 -17
- data/third_party/boringssl/include/openssl/bio.h +59 -34
- data/third_party/boringssl/include/openssl/bn.h +118 -51
- data/third_party/boringssl/include/openssl/buf.h +15 -0
- data/third_party/boringssl/include/openssl/bytestring.h +52 -4
- data/third_party/boringssl/include/openssl/chacha.h +2 -2
- data/third_party/boringssl/include/openssl/cipher.h +18 -1
- data/third_party/boringssl/include/openssl/cmac.h +11 -0
- data/third_party/boringssl/include/openssl/conf.h +13 -2
- data/third_party/boringssl/include/openssl/cpu.h +20 -23
- data/third_party/boringssl/include/openssl/crypto.h +22 -1
- data/third_party/boringssl/include/openssl/curve25519.h +96 -4
- data/third_party/boringssl/include/openssl/dh.h +71 -16
- data/third_party/boringssl/include/openssl/digest.h +38 -11
- data/third_party/boringssl/include/openssl/dsa.h +40 -4
- data/third_party/boringssl/include/openssl/ec.h +44 -18
- data/third_party/boringssl/include/openssl/ec_key.h +27 -6
- data/third_party/boringssl/include/openssl/ecdsa.h +11 -0
- data/third_party/boringssl/include/openssl/engine.h +11 -0
- data/third_party/boringssl/include/openssl/evp.h +52 -88
- data/third_party/boringssl/include/openssl/hkdf.h +24 -4
- data/third_party/boringssl/include/openssl/hmac.h +20 -6
- data/third_party/boringssl/include/openssl/md4.h +4 -0
- data/third_party/boringssl/include/openssl/mem.h +19 -0
- data/third_party/boringssl/include/openssl/newhope.h +158 -0
- data/third_party/boringssl/include/openssl/nid.h +4166 -0
- data/third_party/boringssl/include/openssl/obj.h +31 -3
- data/third_party/boringssl/include/openssl/obj_mac.h +17 -4143
- data/third_party/boringssl/include/openssl/{opensslfeatures.h → opensslconf.h} +3 -3
- data/third_party/boringssl/include/openssl/pem.h +5 -0
- data/third_party/boringssl/include/openssl/pkcs8.h +12 -0
- data/third_party/boringssl/include/openssl/rand.h +6 -0
- data/third_party/boringssl/include/openssl/rc4.h +6 -0
- data/third_party/boringssl/{crypto/dh/internal.h → include/openssl/ripemd.h} +38 -11
- data/third_party/boringssl/include/openssl/rsa.h +127 -65
- data/third_party/boringssl/include/openssl/sha.h +14 -10
- data/third_party/boringssl/include/openssl/ssl.h +561 -275
- data/third_party/boringssl/include/openssl/ssl3.h +18 -25
- data/third_party/boringssl/include/openssl/stack.h +2 -4
- data/third_party/boringssl/include/openssl/stack_macros.h +321 -353
- data/third_party/boringssl/include/openssl/thread.h +31 -13
- data/third_party/boringssl/include/openssl/time_support.h +1 -0
- data/third_party/boringssl/include/openssl/tls1.h +37 -33
- data/third_party/boringssl/include/openssl/x509.h +69 -26
- data/third_party/boringssl/include/openssl/x509_vfy.h +12 -10
- data/third_party/boringssl/include/openssl/x509v3.h +23 -2
- data/third_party/boringssl/ssl/custom_extensions.c +3 -5
- data/third_party/boringssl/ssl/d1_both.c +463 -499
- data/third_party/boringssl/ssl/d1_lib.c +38 -109
- data/third_party/boringssl/ssl/d1_pkt.c +173 -334
- data/third_party/boringssl/ssl/d1_srtp.c +20 -18
- data/third_party/boringssl/ssl/{d1_meth.c → dtls_method.c} +88 -15
- data/third_party/boringssl/ssl/dtls_record.c +27 -26
- data/third_party/boringssl/ssl/{s3_clnt.c → handshake_client.c} +816 -904
- data/third_party/boringssl/ssl/handshake_server.c +1932 -0
- data/third_party/boringssl/ssl/internal.h +712 -439
- data/third_party/boringssl/ssl/s3_both.c +445 -257
- data/third_party/boringssl/ssl/s3_enc.c +53 -36
- data/third_party/boringssl/ssl/s3_lib.c +23 -268
- data/third_party/boringssl/ssl/s3_pkt.c +168 -364
- data/third_party/boringssl/ssl/ssl_aead_ctx.c +46 -17
- data/third_party/boringssl/ssl/ssl_asn1.c +56 -26
- data/third_party/boringssl/ssl/ssl_buffer.c +16 -24
- data/third_party/boringssl/ssl/ssl_cert.c +324 -49
- data/third_party/boringssl/ssl/ssl_cipher.c +205 -150
- data/third_party/boringssl/ssl/ssl_ecdh.c +287 -51
- data/third_party/boringssl/ssl/ssl_file.c +21 -68
- data/third_party/boringssl/ssl/ssl_lib.c +881 -510
- data/third_party/boringssl/ssl/ssl_rsa.c +404 -34
- data/third_party/boringssl/ssl/ssl_session.c +324 -103
- data/third_party/boringssl/ssl/ssl_stat.c +6 -88
- data/third_party/boringssl/ssl/t1_enc.c +23 -39
- data/third_party/boringssl/ssl/t1_lib.c +1120 -622
- data/third_party/boringssl/ssl/tls13_both.c +440 -0
- data/third_party/boringssl/ssl/tls13_client.c +682 -0
- data/third_party/boringssl/ssl/tls13_enc.c +391 -0
- data/third_party/boringssl/ssl/tls13_server.c +672 -0
- data/third_party/boringssl/ssl/{s3_meth.c → tls_method.c} +100 -21
- data/third_party/boringssl/ssl/tls_record.c +159 -77
- data/third_party/nanopb/pb.h +60 -28
- data/third_party/nanopb/pb_decode.c +120 -92
- data/third_party/nanopb/pb_decode.h +3 -3
- data/third_party/nanopb/pb_encode.c +73 -67
- data/third_party/nanopb/pb_encode.h +4 -4
- metadata +155 -89
- data/include/grpc/impl/codegen/byte_buffer.h +0 -122
- data/include/grpc/impl/codegen/log.h +0 -118
- data/include/grpc/impl/codegen/time.h +0 -130
- data/src/core/ext/client_config/client_channel.c +0 -593
- data/src/core/ext/client_config/subchannel_call_holder.c +0 -272
- data/src/core/ext/client_config/subchannel_call_holder.h +0 -99
- data/src/core/lib/iomgr/ev_poll_and_epoll_posix.c +0 -2046
- data/src/core/lib/iomgr/workqueue_posix.c +0 -151
- data/src/core/lib/security/transport/handshake.c +0 -368
- data/third_party/boringssl/crypto/asn1/a_bytes.c +0 -308
- data/third_party/boringssl/crypto/asn1/bio_asn1.c +0 -477
- data/third_party/boringssl/crypto/asn1/bio_ndef.c +0 -251
- data/third_party/boringssl/crypto/asn1/t_pkey.c +0 -110
- data/third_party/boringssl/crypto/asn1/tasn_prn.c +0 -596
- data/third_party/boringssl/crypto/chacha/chacha_vec.c +0 -328
- data/third_party/boringssl/crypto/directory.h +0 -66
- data/third_party/boringssl/crypto/directory_posix.c +0 -108
- data/third_party/boringssl/crypto/directory_win.c +0 -144
- data/third_party/boringssl/crypto/test/scoped_types.h +0 -140
- data/third_party/boringssl/include/openssl/pqueue.h +0 -146
- data/third_party/boringssl/ssl/d1_clnt.c +0 -561
- data/third_party/boringssl/ssl/d1_srvr.c +0 -476
- data/third_party/boringssl/ssl/pqueue/pqueue.c +0 -197
- data/third_party/boringssl/ssl/s3_srvr.c +0 -2272
- data/third_party/boringssl/ssl/test/async_bio.h +0 -45
- data/third_party/boringssl/ssl/test/packeted_bio.h +0 -44
- data/third_party/boringssl/ssl/test/test_config.h +0 -110
@@ -0,0 +1,391 @@
|
|
1
|
+
/* Copyright (c) 2016, Google Inc.
|
2
|
+
*
|
3
|
+
* Permission to use, copy, modify, and/or distribute this software for any
|
4
|
+
* purpose with or without fee is hereby granted, provided that the above
|
5
|
+
* copyright notice and this permission notice appear in all copies.
|
6
|
+
*
|
7
|
+
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
8
|
+
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
9
|
+
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
10
|
+
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
11
|
+
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
12
|
+
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
13
|
+
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
|
14
|
+
|
15
|
+
#include <openssl/ssl.h>
|
16
|
+
|
17
|
+
#include <assert.h>
|
18
|
+
#include <string.h>
|
19
|
+
|
20
|
+
#include <openssl/aead.h>
|
21
|
+
#include <openssl/bytestring.h>
|
22
|
+
#include <openssl/digest.h>
|
23
|
+
#include <openssl/hmac.h>
|
24
|
+
#include <openssl/hkdf.h>
|
25
|
+
#include <openssl/mem.h>
|
26
|
+
|
27
|
+
#include "internal.h"
|
28
|
+
|
29
|
+
|
30
|
+
int tls13_init_key_schedule(SSL *ssl, const uint8_t *resumption_ctx,
|
31
|
+
size_t resumption_ctx_len) {
|
32
|
+
SSL_HANDSHAKE *hs = ssl->s3->hs;
|
33
|
+
const EVP_MD *digest = ssl_get_handshake_digest(ssl_get_algorithm_prf(ssl));
|
34
|
+
|
35
|
+
hs->hash_len = EVP_MD_size(digest);
|
36
|
+
|
37
|
+
/* Save the hash of the resumption context. */
|
38
|
+
unsigned resumption_hash_len;
|
39
|
+
if (!EVP_Digest(resumption_ctx, resumption_ctx_len, hs->resumption_hash,
|
40
|
+
&resumption_hash_len, digest, NULL)) {
|
41
|
+
return 0;
|
42
|
+
}
|
43
|
+
|
44
|
+
/* Initialize the secret to the zero key. */
|
45
|
+
memset(hs->secret, 0, hs->hash_len);
|
46
|
+
|
47
|
+
/* Initialize the rolling hashes and release the handshake buffer. */
|
48
|
+
if (!ssl3_init_handshake_hash(ssl)) {
|
49
|
+
return 0;
|
50
|
+
}
|
51
|
+
ssl3_free_handshake_buffer(ssl);
|
52
|
+
return 1;
|
53
|
+
}
|
54
|
+
|
55
|
+
int tls13_advance_key_schedule(SSL *ssl, const uint8_t *in, size_t len) {
|
56
|
+
SSL_HANDSHAKE *hs = ssl->s3->hs;
|
57
|
+
const EVP_MD *digest = ssl_get_handshake_digest(ssl_get_algorithm_prf(ssl));
|
58
|
+
|
59
|
+
return HKDF_extract(hs->secret, &hs->hash_len, digest, in, len, hs->secret,
|
60
|
+
hs->hash_len);
|
61
|
+
}
|
62
|
+
|
63
|
+
static int hkdf_expand_label(uint8_t *out, const EVP_MD *digest,
|
64
|
+
const uint8_t *secret, size_t secret_len,
|
65
|
+
const uint8_t *label, size_t label_len,
|
66
|
+
const uint8_t *hash, size_t hash_len, size_t len) {
|
67
|
+
static const char kTLS13LabelVersion[] = "TLS 1.3, ";
|
68
|
+
|
69
|
+
CBB cbb, child;
|
70
|
+
uint8_t *hkdf_label;
|
71
|
+
size_t hkdf_label_len;
|
72
|
+
if (!CBB_init(&cbb, 2 + 1 + strlen(kTLS13LabelVersion) + label_len + 1 +
|
73
|
+
hash_len) ||
|
74
|
+
!CBB_add_u16(&cbb, len) ||
|
75
|
+
!CBB_add_u8_length_prefixed(&cbb, &child) ||
|
76
|
+
!CBB_add_bytes(&child, (const uint8_t *)kTLS13LabelVersion,
|
77
|
+
strlen(kTLS13LabelVersion)) ||
|
78
|
+
!CBB_add_bytes(&child, label, label_len) ||
|
79
|
+
!CBB_add_u8_length_prefixed(&cbb, &child) ||
|
80
|
+
!CBB_add_bytes(&child, hash, hash_len) ||
|
81
|
+
!CBB_finish(&cbb, &hkdf_label, &hkdf_label_len)) {
|
82
|
+
CBB_cleanup(&cbb);
|
83
|
+
return 0;
|
84
|
+
}
|
85
|
+
|
86
|
+
int ret = HKDF_expand(out, len, digest, secret, secret_len, hkdf_label,
|
87
|
+
hkdf_label_len);
|
88
|
+
OPENSSL_free(hkdf_label);
|
89
|
+
return ret;
|
90
|
+
}
|
91
|
+
|
92
|
+
int tls13_get_context_hashes(SSL *ssl, uint8_t *out, size_t *out_len) {
|
93
|
+
SSL_HANDSHAKE *hs = ssl->s3->hs;
|
94
|
+
|
95
|
+
EVP_MD_CTX ctx;
|
96
|
+
EVP_MD_CTX_init(&ctx);
|
97
|
+
unsigned handshake_len = 0;
|
98
|
+
int ok = EVP_MD_CTX_copy_ex(&ctx, &ssl->s3->handshake_hash) &&
|
99
|
+
EVP_DigestFinal_ex(&ctx, out, &handshake_len);
|
100
|
+
EVP_MD_CTX_cleanup(&ctx);
|
101
|
+
if (!ok) {
|
102
|
+
return 0;
|
103
|
+
}
|
104
|
+
|
105
|
+
memcpy(out + handshake_len, hs->resumption_hash, hs->hash_len);
|
106
|
+
*out_len = handshake_len + hs->hash_len;
|
107
|
+
return 1;
|
108
|
+
}
|
109
|
+
|
110
|
+
/* derive_secret derives a secret of length |len| and writes the result in |out|
|
111
|
+
* with the given label and the current base secret and most recently-saved
|
112
|
+
* handshake context. It returns one on success and zero on error. */
|
113
|
+
static int derive_secret(SSL *ssl, uint8_t *out, size_t len,
|
114
|
+
const uint8_t *label, size_t label_len) {
|
115
|
+
SSL_HANDSHAKE *hs = ssl->s3->hs;
|
116
|
+
const EVP_MD *digest = ssl_get_handshake_digest(ssl_get_algorithm_prf(ssl));
|
117
|
+
|
118
|
+
uint8_t context_hashes[2 * EVP_MAX_MD_SIZE];
|
119
|
+
size_t context_hashes_len;
|
120
|
+
if (!tls13_get_context_hashes(ssl, context_hashes, &context_hashes_len)) {
|
121
|
+
return 0;
|
122
|
+
}
|
123
|
+
|
124
|
+
return hkdf_expand_label(out, digest, hs->secret, hs->hash_len, label,
|
125
|
+
label_len, context_hashes, context_hashes_len, len);
|
126
|
+
}
|
127
|
+
|
128
|
+
int tls13_set_traffic_key(SSL *ssl, enum tls_record_type_t type,
|
129
|
+
enum evp_aead_direction_t direction,
|
130
|
+
const uint8_t *traffic_secret,
|
131
|
+
size_t traffic_secret_len) {
|
132
|
+
if (traffic_secret_len > 0xff) {
|
133
|
+
OPENSSL_PUT_ERROR(SSL, ERR_R_OVERFLOW);
|
134
|
+
return 0;
|
135
|
+
}
|
136
|
+
|
137
|
+
const char *phase;
|
138
|
+
switch (type) {
|
139
|
+
case type_early_handshake:
|
140
|
+
phase = "early handshake key expansion, ";
|
141
|
+
break;
|
142
|
+
case type_early_data:
|
143
|
+
phase = "early application data key expansion, ";
|
144
|
+
break;
|
145
|
+
case type_handshake:
|
146
|
+
phase = "handshake key expansion, ";
|
147
|
+
break;
|
148
|
+
case type_data:
|
149
|
+
phase = "application data key expansion, ";
|
150
|
+
break;
|
151
|
+
default:
|
152
|
+
return 0;
|
153
|
+
}
|
154
|
+
size_t phase_len = strlen(phase);
|
155
|
+
|
156
|
+
const char *purpose = "client write key";
|
157
|
+
if ((ssl->server && direction == evp_aead_seal) ||
|
158
|
+
(!ssl->server && direction == evp_aead_open)) {
|
159
|
+
purpose = "server write key";
|
160
|
+
}
|
161
|
+
size_t purpose_len = strlen(purpose);
|
162
|
+
|
163
|
+
/* The longest label has length 38 (type_early_data) + 16 (either purpose
|
164
|
+
* value). */
|
165
|
+
uint8_t label[38 + 16];
|
166
|
+
size_t label_len = phase_len + purpose_len;
|
167
|
+
if (label_len > sizeof(label)) {
|
168
|
+
assert(0);
|
169
|
+
return 0;
|
170
|
+
}
|
171
|
+
memcpy(label, phase, phase_len);
|
172
|
+
memcpy(label + phase_len, purpose, purpose_len);
|
173
|
+
|
174
|
+
/* Look up cipher suite properties. */
|
175
|
+
const EVP_AEAD *aead;
|
176
|
+
const EVP_MD *digest = ssl_get_handshake_digest(ssl_get_algorithm_prf(ssl));
|
177
|
+
size_t mac_secret_len, fixed_iv_len;
|
178
|
+
if (!ssl_cipher_get_evp_aead(&aead, &mac_secret_len, &fixed_iv_len,
|
179
|
+
SSL_get_session(ssl)->cipher,
|
180
|
+
ssl3_protocol_version(ssl))) {
|
181
|
+
return 0;
|
182
|
+
}
|
183
|
+
|
184
|
+
/* Derive the key. */
|
185
|
+
size_t key_len = EVP_AEAD_key_length(aead);
|
186
|
+
uint8_t key[EVP_AEAD_MAX_KEY_LENGTH];
|
187
|
+
if (!hkdf_expand_label(key, digest, traffic_secret, traffic_secret_len, label,
|
188
|
+
label_len, NULL, 0, key_len)) {
|
189
|
+
return 0;
|
190
|
+
}
|
191
|
+
|
192
|
+
/* The IV's label ends in "iv" instead of "key". */
|
193
|
+
if (label_len < 3) {
|
194
|
+
assert(0);
|
195
|
+
return 0;
|
196
|
+
}
|
197
|
+
label_len--;
|
198
|
+
label[label_len - 2] = 'i';
|
199
|
+
label[label_len - 1] = 'v';
|
200
|
+
|
201
|
+
/* Derive the IV. */
|
202
|
+
size_t iv_len = EVP_AEAD_nonce_length(aead);
|
203
|
+
uint8_t iv[EVP_AEAD_MAX_NONCE_LENGTH];
|
204
|
+
if (!hkdf_expand_label(iv, digest, traffic_secret, traffic_secret_len, label,
|
205
|
+
label_len, NULL, 0, iv_len)) {
|
206
|
+
return 0;
|
207
|
+
}
|
208
|
+
|
209
|
+
SSL_AEAD_CTX *traffic_aead = SSL_AEAD_CTX_new(
|
210
|
+
direction, ssl3_protocol_version(ssl), SSL_get_session(ssl)->cipher, key,
|
211
|
+
key_len, NULL, 0, iv, iv_len);
|
212
|
+
if (traffic_aead == NULL) {
|
213
|
+
return 0;
|
214
|
+
}
|
215
|
+
|
216
|
+
if (direction == evp_aead_open) {
|
217
|
+
if (!ssl->method->set_read_state(ssl, traffic_aead)) {
|
218
|
+
return 0;
|
219
|
+
}
|
220
|
+
} else {
|
221
|
+
if (!ssl->method->set_write_state(ssl, traffic_aead)) {
|
222
|
+
return 0;
|
223
|
+
}
|
224
|
+
}
|
225
|
+
|
226
|
+
/* Save the traffic secret. */
|
227
|
+
if (direction == evp_aead_open) {
|
228
|
+
memmove(ssl->s3->read_traffic_secret, traffic_secret, traffic_secret_len);
|
229
|
+
ssl->s3->read_traffic_secret_len = traffic_secret_len;
|
230
|
+
} else {
|
231
|
+
memmove(ssl->s3->write_traffic_secret, traffic_secret, traffic_secret_len);
|
232
|
+
ssl->s3->write_traffic_secret_len = traffic_secret_len;
|
233
|
+
}
|
234
|
+
|
235
|
+
return 1;
|
236
|
+
}
|
237
|
+
|
238
|
+
static const char kTLS13LabelHandshakeTraffic[] = "handshake traffic secret";
|
239
|
+
static const char kTLS13LabelApplicationTraffic[] =
|
240
|
+
"application traffic secret";
|
241
|
+
|
242
|
+
int tls13_set_handshake_traffic(SSL *ssl) {
|
243
|
+
SSL_HANDSHAKE *hs = ssl->s3->hs;
|
244
|
+
|
245
|
+
uint8_t traffic_secret[EVP_MAX_MD_SIZE];
|
246
|
+
if (!derive_secret(ssl, traffic_secret, hs->hash_len,
|
247
|
+
(const uint8_t *)kTLS13LabelHandshakeTraffic,
|
248
|
+
strlen(kTLS13LabelHandshakeTraffic)) ||
|
249
|
+
!ssl_log_secret(ssl, "HANDSHAKE_TRAFFIC_SECRET", traffic_secret,
|
250
|
+
hs->hash_len) ||
|
251
|
+
!tls13_set_traffic_key(ssl, type_handshake, evp_aead_open, traffic_secret,
|
252
|
+
hs->hash_len) ||
|
253
|
+
!tls13_set_traffic_key(ssl, type_handshake, evp_aead_seal, traffic_secret,
|
254
|
+
hs->hash_len)) {
|
255
|
+
return 0;
|
256
|
+
}
|
257
|
+
return 1;
|
258
|
+
}
|
259
|
+
|
260
|
+
int tls13_derive_traffic_secret_0(SSL *ssl) {
|
261
|
+
SSL_HANDSHAKE *hs = ssl->s3->hs;
|
262
|
+
|
263
|
+
return derive_secret(ssl, hs->traffic_secret_0, hs->hash_len,
|
264
|
+
(const uint8_t *)kTLS13LabelApplicationTraffic,
|
265
|
+
strlen(kTLS13LabelApplicationTraffic)) &&
|
266
|
+
ssl_log_secret(ssl, "TRAFFIC_SECRET_0", hs->traffic_secret_0,
|
267
|
+
hs->hash_len);
|
268
|
+
}
|
269
|
+
|
270
|
+
int tls13_rotate_traffic_key(SSL *ssl, enum evp_aead_direction_t direction) {
|
271
|
+
const EVP_MD *digest = ssl_get_handshake_digest(ssl_get_algorithm_prf(ssl));
|
272
|
+
|
273
|
+
uint8_t *secret;
|
274
|
+
size_t secret_len;
|
275
|
+
if (direction == evp_aead_open) {
|
276
|
+
secret = ssl->s3->read_traffic_secret;
|
277
|
+
secret_len = ssl->s3->read_traffic_secret_len;
|
278
|
+
} else {
|
279
|
+
secret = ssl->s3->write_traffic_secret;
|
280
|
+
secret_len = ssl->s3->write_traffic_secret_len;
|
281
|
+
}
|
282
|
+
|
283
|
+
if (!hkdf_expand_label(secret, digest, secret, secret_len,
|
284
|
+
(const uint8_t *)kTLS13LabelApplicationTraffic,
|
285
|
+
strlen(kTLS13LabelApplicationTraffic), NULL, 0,
|
286
|
+
secret_len)) {
|
287
|
+
return 0;
|
288
|
+
}
|
289
|
+
|
290
|
+
return tls13_set_traffic_key(ssl, type_data, direction, secret, secret_len);
|
291
|
+
}
|
292
|
+
|
293
|
+
static const char kTLS13LabelExporter[] = "exporter master secret";
|
294
|
+
static const char kTLS13LabelResumption[] = "resumption master secret";
|
295
|
+
|
296
|
+
int tls13_finalize_keys(SSL *ssl) {
|
297
|
+
SSL_HANDSHAKE *hs = ssl->s3->hs;
|
298
|
+
|
299
|
+
ssl->s3->exporter_secret_len = hs->hash_len;
|
300
|
+
ssl->s3->new_session->master_key_length = hs->hash_len;
|
301
|
+
if (!derive_secret(
|
302
|
+
ssl, ssl->s3->exporter_secret, ssl->s3->exporter_secret_len,
|
303
|
+
(const uint8_t *)kTLS13LabelExporter, strlen(kTLS13LabelExporter)) ||
|
304
|
+
!derive_secret(ssl, ssl->s3->new_session->master_key,
|
305
|
+
ssl->s3->new_session->master_key_length,
|
306
|
+
(const uint8_t *)kTLS13LabelResumption,
|
307
|
+
strlen(kTLS13LabelResumption))) {
|
308
|
+
return 0;
|
309
|
+
}
|
310
|
+
|
311
|
+
return 1;
|
312
|
+
}
|
313
|
+
|
314
|
+
int tls13_finished_mac(SSL *ssl, uint8_t *out, size_t *out_len, int is_server) {
|
315
|
+
SSL_HANDSHAKE *hs = ssl->s3->hs;
|
316
|
+
const EVP_MD *digest = ssl_get_handshake_digest(ssl_get_algorithm_prf(ssl));
|
317
|
+
|
318
|
+
uint8_t key[EVP_MAX_MD_SIZE];
|
319
|
+
size_t key_len = EVP_MD_size(digest);
|
320
|
+
|
321
|
+
const uint8_t *traffic_secret;
|
322
|
+
const char *label;
|
323
|
+
if (is_server) {
|
324
|
+
label = "server finished";
|
325
|
+
if (ssl->server) {
|
326
|
+
traffic_secret = ssl->s3->write_traffic_secret;
|
327
|
+
} else {
|
328
|
+
traffic_secret = ssl->s3->read_traffic_secret;
|
329
|
+
}
|
330
|
+
} else {
|
331
|
+
label = "client finished";
|
332
|
+
if (!ssl->server) {
|
333
|
+
traffic_secret = ssl->s3->write_traffic_secret;
|
334
|
+
} else {
|
335
|
+
traffic_secret = ssl->s3->read_traffic_secret;
|
336
|
+
}
|
337
|
+
}
|
338
|
+
|
339
|
+
uint8_t context_hashes[2 * EVP_MAX_MD_SIZE];
|
340
|
+
size_t context_hashes_len;
|
341
|
+
unsigned len;
|
342
|
+
if (!hkdf_expand_label(key, digest, traffic_secret, hs->hash_len,
|
343
|
+
(const uint8_t *)label, strlen(label), NULL, 0,
|
344
|
+
hs->hash_len) ||
|
345
|
+
!tls13_get_context_hashes(ssl, context_hashes, &context_hashes_len) ||
|
346
|
+
HMAC(digest, key, key_len, context_hashes, context_hashes_len, out,
|
347
|
+
&len) == NULL) {
|
348
|
+
return 0;
|
349
|
+
}
|
350
|
+
*out_len = len;
|
351
|
+
return 1;
|
352
|
+
}
|
353
|
+
|
354
|
+
static const char kTLS13LabelResumptionPSK[] = "resumption psk";
|
355
|
+
static const char kTLS13LabelResumptionContext[] = "resumption context";
|
356
|
+
|
357
|
+
int tls13_resumption_psk(SSL *ssl, uint8_t *out, size_t out_len,
|
358
|
+
const SSL_SESSION *session) {
|
359
|
+
const EVP_MD *digest = ssl_get_handshake_digest(ssl_get_algorithm_prf(ssl));
|
360
|
+
return hkdf_expand_label(out, digest, session->master_key,
|
361
|
+
session->master_key_length,
|
362
|
+
(const uint8_t *)kTLS13LabelResumptionPSK,
|
363
|
+
strlen(kTLS13LabelResumptionPSK), NULL, 0, out_len);
|
364
|
+
}
|
365
|
+
|
366
|
+
int tls13_resumption_context(SSL *ssl, uint8_t *out, size_t out_len,
|
367
|
+
const SSL_SESSION *session) {
|
368
|
+
const EVP_MD *digest = ssl_get_handshake_digest(ssl_get_algorithm_prf(ssl));
|
369
|
+
return hkdf_expand_label(out, digest, session->master_key,
|
370
|
+
session->master_key_length,
|
371
|
+
(const uint8_t *)kTLS13LabelResumptionContext,
|
372
|
+
strlen(kTLS13LabelResumptionContext), NULL, 0,
|
373
|
+
out_len);
|
374
|
+
}
|
375
|
+
|
376
|
+
int tls13_export_keying_material(SSL *ssl, uint8_t *out, size_t out_len,
|
377
|
+
const char *label, size_t label_len,
|
378
|
+
const uint8_t *context, size_t context_len,
|
379
|
+
int use_context) {
|
380
|
+
const EVP_MD *digest = ssl_get_handshake_digest(ssl_get_algorithm_prf(ssl));
|
381
|
+
|
382
|
+
const uint8_t *hash = NULL;
|
383
|
+
size_t hash_len = 0;
|
384
|
+
if (use_context) {
|
385
|
+
hash = context;
|
386
|
+
hash_len = context_len;
|
387
|
+
}
|
388
|
+
return hkdf_expand_label(out, digest, ssl->s3->exporter_secret,
|
389
|
+
ssl->s3->exporter_secret_len, (const uint8_t *)label,
|
390
|
+
label_len, hash, hash_len, out_len);
|
391
|
+
}
|
@@ -0,0 +1,672 @@
|
|
1
|
+
/* Copyright (c) 2016, Google Inc.
|
2
|
+
*
|
3
|
+
* Permission to use, copy, modify, and/or distribute this software for any
|
4
|
+
* purpose with or without fee is hereby granted, provided that the above
|
5
|
+
* copyright notice and this permission notice appear in all copies.
|
6
|
+
*
|
7
|
+
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
8
|
+
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
9
|
+
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
10
|
+
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
11
|
+
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
12
|
+
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
13
|
+
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
|
14
|
+
|
15
|
+
#include <openssl/ssl.h>
|
16
|
+
|
17
|
+
#include <assert.h>
|
18
|
+
#include <string.h>
|
19
|
+
|
20
|
+
#include <openssl/bytestring.h>
|
21
|
+
#include <openssl/digest.h>
|
22
|
+
#include <openssl/err.h>
|
23
|
+
#include <openssl/mem.h>
|
24
|
+
#include <openssl/rand.h>
|
25
|
+
#include <openssl/stack.h>
|
26
|
+
|
27
|
+
#include "internal.h"
|
28
|
+
|
29
|
+
|
30
|
+
enum server_hs_state_t {
|
31
|
+
state_process_client_hello = 0,
|
32
|
+
state_select_parameters,
|
33
|
+
state_send_hello_retry_request,
|
34
|
+
state_flush_hello_retry_request,
|
35
|
+
state_process_second_client_hello,
|
36
|
+
state_send_server_hello,
|
37
|
+
state_send_encrypted_extensions,
|
38
|
+
state_send_certificate_request,
|
39
|
+
state_send_server_certificate,
|
40
|
+
state_send_server_certificate_verify,
|
41
|
+
state_complete_server_certificate_verify,
|
42
|
+
state_send_server_finished,
|
43
|
+
state_flush,
|
44
|
+
state_process_client_certificate,
|
45
|
+
state_process_client_certificate_verify,
|
46
|
+
state_process_client_finished,
|
47
|
+
state_send_new_session_ticket,
|
48
|
+
state_flush_new_session_ticket,
|
49
|
+
state_done,
|
50
|
+
};
|
51
|
+
|
52
|
+
static const uint8_t kZeroes[EVP_MAX_MD_SIZE] = {0};
|
53
|
+
|
54
|
+
static int resolve_psk_secret(SSL *ssl) {
|
55
|
+
SSL_HANDSHAKE *hs = ssl->s3->hs;
|
56
|
+
|
57
|
+
if (ssl->s3->tmp.new_cipher->algorithm_auth != SSL_aPSK) {
|
58
|
+
return tls13_advance_key_schedule(ssl, kZeroes, hs->hash_len);
|
59
|
+
}
|
60
|
+
|
61
|
+
uint8_t resumption_psk[EVP_MAX_MD_SIZE];
|
62
|
+
if (!tls13_resumption_psk(ssl, resumption_psk, hs->hash_len,
|
63
|
+
ssl->s3->new_session) ||
|
64
|
+
!tls13_advance_key_schedule(ssl, resumption_psk, hs->hash_len)) {
|
65
|
+
return 0;
|
66
|
+
}
|
67
|
+
|
68
|
+
return 1;
|
69
|
+
}
|
70
|
+
|
71
|
+
static int resolve_ecdhe_secret(SSL *ssl, int *out_need_retry,
|
72
|
+
struct ssl_early_callback_ctx *early_ctx) {
|
73
|
+
*out_need_retry = 0;
|
74
|
+
SSL_HANDSHAKE *hs = ssl->s3->hs;
|
75
|
+
|
76
|
+
if (ssl->s3->tmp.new_cipher->algorithm_mkey != SSL_kECDHE) {
|
77
|
+
return tls13_advance_key_schedule(ssl, kZeroes, hs->hash_len);
|
78
|
+
}
|
79
|
+
|
80
|
+
CBS key_share;
|
81
|
+
if (!ssl_early_callback_get_extension(early_ctx, &key_share,
|
82
|
+
TLSEXT_TYPE_key_share)) {
|
83
|
+
OPENSSL_PUT_ERROR(SSL, SSL_R_MISSING_KEY_SHARE);
|
84
|
+
ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_MISSING_EXTENSION);
|
85
|
+
return ssl_hs_error;
|
86
|
+
}
|
87
|
+
|
88
|
+
int found_key_share;
|
89
|
+
uint8_t *dhe_secret;
|
90
|
+
size_t dhe_secret_len;
|
91
|
+
uint8_t alert = SSL_AD_DECODE_ERROR;
|
92
|
+
if (!ssl_ext_key_share_parse_clienthello(ssl, &found_key_share, &dhe_secret,
|
93
|
+
&dhe_secret_len, &alert,
|
94
|
+
&key_share)) {
|
95
|
+
ssl3_send_alert(ssl, SSL3_AL_FATAL, alert);
|
96
|
+
return 0;
|
97
|
+
}
|
98
|
+
|
99
|
+
if (!found_key_share) {
|
100
|
+
*out_need_retry = 1;
|
101
|
+
return 0;
|
102
|
+
}
|
103
|
+
|
104
|
+
int ok = tls13_advance_key_schedule(ssl, dhe_secret, dhe_secret_len);
|
105
|
+
OPENSSL_free(dhe_secret);
|
106
|
+
return ok;
|
107
|
+
}
|
108
|
+
|
109
|
+
static enum ssl_hs_wait_t do_process_client_hello(SSL *ssl, SSL_HANDSHAKE *hs) {
|
110
|
+
if (!tls13_check_message_type(ssl, SSL3_MT_CLIENT_HELLO)) {
|
111
|
+
return ssl_hs_error;
|
112
|
+
}
|
113
|
+
|
114
|
+
struct ssl_early_callback_ctx client_hello;
|
115
|
+
if (!ssl_early_callback_init(ssl, &client_hello, ssl->init_msg,
|
116
|
+
ssl->init_num)) {
|
117
|
+
OPENSSL_PUT_ERROR(SSL, SSL_R_CLIENTHELLO_PARSE_FAILED);
|
118
|
+
ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
|
119
|
+
return ssl_hs_error;
|
120
|
+
}
|
121
|
+
|
122
|
+
assert(ssl->s3->have_version);
|
123
|
+
|
124
|
+
/* Load the client random. */
|
125
|
+
if (client_hello.random_len != SSL3_RANDOM_SIZE) {
|
126
|
+
OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
|
127
|
+
return -1;
|
128
|
+
}
|
129
|
+
memcpy(ssl->s3->client_random, client_hello.random, client_hello.random_len);
|
130
|
+
|
131
|
+
uint8_t alert = SSL_AD_DECODE_ERROR;
|
132
|
+
SSL_SESSION *session = NULL;
|
133
|
+
CBS pre_shared_key;
|
134
|
+
if (ssl_early_callback_get_extension(&client_hello, &pre_shared_key,
|
135
|
+
TLSEXT_TYPE_pre_shared_key) &&
|
136
|
+
!ssl_ext_pre_shared_key_parse_clienthello(ssl, &session, &alert,
|
137
|
+
&pre_shared_key)) {
|
138
|
+
ssl3_send_alert(ssl, SSL3_AL_FATAL, alert);
|
139
|
+
return 0;
|
140
|
+
}
|
141
|
+
|
142
|
+
uint16_t resumption_cipher;
|
143
|
+
if (session != NULL &&
|
144
|
+
/* We currently only support ECDHE-PSK resumption. */
|
145
|
+
((session->ticket_flags & SSL_TICKET_ALLOW_DHE_RESUMPTION) == 0 ||
|
146
|
+
/* Only resume if the session's version matches. */
|
147
|
+
session->ssl_version != ssl->version ||
|
148
|
+
!ssl_cipher_get_ecdhe_psk_cipher(session->cipher, &resumption_cipher) ||
|
149
|
+
!ssl_client_cipher_list_contains_cipher(&client_hello,
|
150
|
+
resumption_cipher))) {
|
151
|
+
SSL_SESSION_free(session);
|
152
|
+
session = NULL;
|
153
|
+
}
|
154
|
+
|
155
|
+
if (session == NULL) {
|
156
|
+
if (!ssl_get_new_session(ssl, 1 /* server */)) {
|
157
|
+
ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
|
158
|
+
return ssl_hs_error;
|
159
|
+
}
|
160
|
+
} else {
|
161
|
+
/* Only authentication information carries over in TLS 1.3. */
|
162
|
+
ssl->s3->new_session = SSL_SESSION_dup(session, SSL_SESSION_DUP_AUTH_ONLY);
|
163
|
+
if (ssl->s3->new_session == NULL) {
|
164
|
+
ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
|
165
|
+
return ssl_hs_error;
|
166
|
+
}
|
167
|
+
ssl->s3->session_reused = 1;
|
168
|
+
SSL_SESSION_free(session);
|
169
|
+
}
|
170
|
+
|
171
|
+
if (ssl->ctx->dos_protection_cb != NULL &&
|
172
|
+
ssl->ctx->dos_protection_cb(&client_hello) == 0) {
|
173
|
+
/* Connection rejected for DOS reasons. */
|
174
|
+
OPENSSL_PUT_ERROR(SSL, SSL_R_CONNECTION_REJECTED);
|
175
|
+
ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
|
176
|
+
return ssl_hs_error;
|
177
|
+
}
|
178
|
+
|
179
|
+
/* TLS 1.3 requires the peer only advertise the null compression. */
|
180
|
+
if (client_hello.compression_methods_len != 1 ||
|
181
|
+
client_hello.compression_methods[0] != 0) {
|
182
|
+
OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_COMPRESSION_LIST);
|
183
|
+
ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
|
184
|
+
return ssl_hs_error;
|
185
|
+
}
|
186
|
+
|
187
|
+
/* TLS extensions. */
|
188
|
+
if (!ssl_parse_clienthello_tlsext(ssl, &client_hello)) {
|
189
|
+
OPENSSL_PUT_ERROR(SSL, SSL_R_PARSE_TLSEXT);
|
190
|
+
return ssl_hs_error;
|
191
|
+
}
|
192
|
+
|
193
|
+
hs->state = state_select_parameters;
|
194
|
+
return ssl_hs_ok;
|
195
|
+
}
|
196
|
+
|
197
|
+
static enum ssl_hs_wait_t do_select_parameters(SSL *ssl, SSL_HANDSHAKE *hs) {
|
198
|
+
if (!ssl->s3->session_reused) {
|
199
|
+
/* Call |cert_cb| to update server certificates if required. */
|
200
|
+
if (ssl->cert->cert_cb != NULL) {
|
201
|
+
int rv = ssl->cert->cert_cb(ssl, ssl->cert->cert_cb_arg);
|
202
|
+
if (rv == 0) {
|
203
|
+
OPENSSL_PUT_ERROR(SSL, SSL_R_CERT_CB_ERROR);
|
204
|
+
ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
|
205
|
+
return ssl_hs_error;
|
206
|
+
}
|
207
|
+
if (rv < 0) {
|
208
|
+
hs->state = state_select_parameters;
|
209
|
+
return ssl_hs_x509_lookup;
|
210
|
+
}
|
211
|
+
}
|
212
|
+
}
|
213
|
+
|
214
|
+
struct ssl_early_callback_ctx client_hello;
|
215
|
+
if (!ssl_early_callback_init(ssl, &client_hello, ssl->init_msg,
|
216
|
+
ssl->init_num)) {
|
217
|
+
OPENSSL_PUT_ERROR(SSL, SSL_R_CLIENTHELLO_PARSE_FAILED);
|
218
|
+
ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
|
219
|
+
return ssl_hs_error;
|
220
|
+
}
|
221
|
+
|
222
|
+
if (!ssl->s3->session_reused) {
|
223
|
+
const SSL_CIPHER *cipher =
|
224
|
+
ssl3_choose_cipher(ssl, &client_hello, ssl_get_cipher_preferences(ssl));
|
225
|
+
if (cipher == NULL) {
|
226
|
+
OPENSSL_PUT_ERROR(SSL, SSL_R_NO_SHARED_CIPHER);
|
227
|
+
ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
|
228
|
+
return ssl_hs_error;
|
229
|
+
}
|
230
|
+
|
231
|
+
ssl->s3->new_session->cipher = cipher;
|
232
|
+
ssl->s3->tmp.new_cipher = cipher;
|
233
|
+
} else {
|
234
|
+
uint16_t resumption_cipher;
|
235
|
+
if (!ssl_cipher_get_ecdhe_psk_cipher(ssl->s3->new_session->cipher,
|
236
|
+
&resumption_cipher)) {
|
237
|
+
OPENSSL_PUT_ERROR(SSL, SSL_R_NO_SHARED_CIPHER);
|
238
|
+
ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
|
239
|
+
return ssl_hs_error;
|
240
|
+
}
|
241
|
+
ssl->s3->tmp.new_cipher = SSL_get_cipher_by_value(resumption_cipher);
|
242
|
+
}
|
243
|
+
|
244
|
+
ssl->method->received_flight(ssl);
|
245
|
+
|
246
|
+
/* The PRF hash is now known. Set up the key schedule and hash the
|
247
|
+
* ClientHello. */
|
248
|
+
size_t resumption_ctx_len =
|
249
|
+
EVP_MD_size(ssl_get_handshake_digest(ssl_get_algorithm_prf(ssl)));
|
250
|
+
if (ssl->s3->session_reused) {
|
251
|
+
uint8_t resumption_ctx[EVP_MAX_MD_SIZE];
|
252
|
+
if (!tls13_resumption_context(ssl, resumption_ctx, resumption_ctx_len,
|
253
|
+
ssl->s3->new_session) ||
|
254
|
+
!tls13_init_key_schedule(ssl, resumption_ctx, resumption_ctx_len)) {
|
255
|
+
return ssl_hs_error;
|
256
|
+
}
|
257
|
+
} else {
|
258
|
+
if (!tls13_init_key_schedule(ssl, kZeroes, resumption_ctx_len)) {
|
259
|
+
return ssl_hs_error;
|
260
|
+
}
|
261
|
+
}
|
262
|
+
|
263
|
+
/* Resolve PSK and incorporate it into the secret. */
|
264
|
+
if (!resolve_psk_secret(ssl)) {
|
265
|
+
return ssl_hs_error;
|
266
|
+
}
|
267
|
+
|
268
|
+
/* Resolve ECDHE and incorporate it into the secret. */
|
269
|
+
int need_retry;
|
270
|
+
if (!resolve_ecdhe_secret(ssl, &need_retry, &client_hello)) {
|
271
|
+
if (need_retry) {
|
272
|
+
hs->state = state_send_hello_retry_request;
|
273
|
+
return ssl_hs_ok;
|
274
|
+
}
|
275
|
+
return ssl_hs_error;
|
276
|
+
}
|
277
|
+
|
278
|
+
hs->state = state_send_server_hello;
|
279
|
+
return ssl_hs_ok;
|
280
|
+
}
|
281
|
+
|
282
|
+
static enum ssl_hs_wait_t do_send_hello_retry_request(SSL *ssl,
|
283
|
+
SSL_HANDSHAKE *hs) {
|
284
|
+
CBB cbb, body, extensions;
|
285
|
+
uint16_t group_id;
|
286
|
+
if (!ssl->method->init_message(ssl, &cbb, &body,
|
287
|
+
SSL3_MT_HELLO_RETRY_REQUEST) ||
|
288
|
+
!CBB_add_u16(&body, ssl->version) ||
|
289
|
+
!CBB_add_u16(&body, ssl_cipher_get_value(ssl->s3->tmp.new_cipher)) ||
|
290
|
+
!tls1_get_shared_group(ssl, &group_id) ||
|
291
|
+
!CBB_add_u16(&body, group_id) ||
|
292
|
+
!CBB_add_u16_length_prefixed(&body, &extensions) ||
|
293
|
+
!ssl->method->finish_message(ssl, &cbb)) {
|
294
|
+
CBB_cleanup(&cbb);
|
295
|
+
return ssl_hs_error;
|
296
|
+
}
|
297
|
+
|
298
|
+
hs->state = state_flush_hello_retry_request;
|
299
|
+
return ssl_hs_write_message;
|
300
|
+
}
|
301
|
+
|
302
|
+
static enum ssl_hs_wait_t do_flush_hello_retry_request(SSL *ssl,
|
303
|
+
SSL_HANDSHAKE *hs) {
|
304
|
+
hs->state = state_process_second_client_hello;
|
305
|
+
return ssl_hs_flush_and_read_message;
|
306
|
+
}
|
307
|
+
|
308
|
+
static enum ssl_hs_wait_t do_process_second_client_hello(SSL *ssl,
|
309
|
+
SSL_HANDSHAKE *hs) {
|
310
|
+
if (!tls13_check_message_type(ssl, SSL3_MT_CLIENT_HELLO)) {
|
311
|
+
return ssl_hs_error;
|
312
|
+
}
|
313
|
+
|
314
|
+
struct ssl_early_callback_ctx client_hello;
|
315
|
+
if (!ssl_early_callback_init(ssl, &client_hello, ssl->init_msg,
|
316
|
+
ssl->init_num)) {
|
317
|
+
OPENSSL_PUT_ERROR(SSL, SSL_R_CLIENTHELLO_PARSE_FAILED);
|
318
|
+
ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
|
319
|
+
return ssl_hs_error;
|
320
|
+
}
|
321
|
+
|
322
|
+
int need_retry;
|
323
|
+
if (!resolve_ecdhe_secret(ssl, &need_retry, &client_hello)) {
|
324
|
+
if (need_retry) {
|
325
|
+
/* Only send one HelloRetryRequest. */
|
326
|
+
ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
|
327
|
+
OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CURVE);
|
328
|
+
}
|
329
|
+
return ssl_hs_error;
|
330
|
+
}
|
331
|
+
|
332
|
+
if (!ssl->method->hash_current_message(ssl)) {
|
333
|
+
return ssl_hs_error;
|
334
|
+
}
|
335
|
+
|
336
|
+
ssl->method->received_flight(ssl);
|
337
|
+
hs->state = state_send_server_hello;
|
338
|
+
return ssl_hs_ok;
|
339
|
+
}
|
340
|
+
|
341
|
+
static enum ssl_hs_wait_t do_send_server_hello(SSL *ssl, SSL_HANDSHAKE *hs) {
|
342
|
+
CBB cbb, body, extensions;
|
343
|
+
if (!ssl->method->init_message(ssl, &cbb, &body, SSL3_MT_SERVER_HELLO) ||
|
344
|
+
!CBB_add_u16(&body, ssl->version) ||
|
345
|
+
!RAND_bytes(ssl->s3->server_random, sizeof(ssl->s3->server_random)) ||
|
346
|
+
!CBB_add_bytes(&body, ssl->s3->server_random, SSL3_RANDOM_SIZE) ||
|
347
|
+
!CBB_add_u16(&body, ssl_cipher_get_value(ssl->s3->tmp.new_cipher)) ||
|
348
|
+
!CBB_add_u16_length_prefixed(&body, &extensions) ||
|
349
|
+
!ssl_ext_pre_shared_key_add_serverhello(ssl, &extensions) ||
|
350
|
+
!ssl_ext_key_share_add_serverhello(ssl, &extensions) ||
|
351
|
+
!ssl->method->finish_message(ssl, &cbb)) {
|
352
|
+
CBB_cleanup(&cbb);
|
353
|
+
return ssl_hs_error;
|
354
|
+
}
|
355
|
+
|
356
|
+
hs->state = state_send_encrypted_extensions;
|
357
|
+
return ssl_hs_write_message;
|
358
|
+
}
|
359
|
+
|
360
|
+
static enum ssl_hs_wait_t do_send_encrypted_extensions(SSL *ssl,
|
361
|
+
SSL_HANDSHAKE *hs) {
|
362
|
+
if (!tls13_set_handshake_traffic(ssl)) {
|
363
|
+
return ssl_hs_error;
|
364
|
+
}
|
365
|
+
|
366
|
+
CBB cbb, body;
|
367
|
+
if (!ssl->method->init_message(ssl, &cbb, &body,
|
368
|
+
SSL3_MT_ENCRYPTED_EXTENSIONS) ||
|
369
|
+
!ssl_add_serverhello_tlsext(ssl, &body) ||
|
370
|
+
!ssl->method->finish_message(ssl, &cbb)) {
|
371
|
+
CBB_cleanup(&cbb);
|
372
|
+
return ssl_hs_error;
|
373
|
+
}
|
374
|
+
|
375
|
+
hs->state = state_send_certificate_request;
|
376
|
+
return ssl_hs_write_message;
|
377
|
+
}
|
378
|
+
|
379
|
+
static enum ssl_hs_wait_t do_send_certificate_request(SSL *ssl,
|
380
|
+
SSL_HANDSHAKE *hs) {
|
381
|
+
/* Determine whether to request a client certificate. */
|
382
|
+
ssl->s3->tmp.cert_request = !!(ssl->verify_mode & SSL_VERIFY_PEER);
|
383
|
+
/* CertificateRequest may only be sent in certificate-based ciphers. */
|
384
|
+
if (!ssl_cipher_uses_certificate_auth(ssl->s3->tmp.new_cipher)) {
|
385
|
+
ssl->s3->tmp.cert_request = 0;
|
386
|
+
}
|
387
|
+
|
388
|
+
if (!ssl->s3->tmp.cert_request) {
|
389
|
+
/* Skip this state. */
|
390
|
+
hs->state = state_send_server_certificate;
|
391
|
+
return ssl_hs_ok;
|
392
|
+
}
|
393
|
+
|
394
|
+
CBB cbb, body, sigalgs_cbb;
|
395
|
+
if (!ssl->method->init_message(ssl, &cbb, &body,
|
396
|
+
SSL3_MT_CERTIFICATE_REQUEST) ||
|
397
|
+
!CBB_add_u8(&body, 0 /* no certificate_request_context. */)) {
|
398
|
+
goto err;
|
399
|
+
}
|
400
|
+
|
401
|
+
const uint16_t *sigalgs;
|
402
|
+
size_t num_sigalgs = tls12_get_psigalgs(ssl, &sigalgs);
|
403
|
+
if (!CBB_add_u16_length_prefixed(&body, &sigalgs_cbb)) {
|
404
|
+
goto err;
|
405
|
+
}
|
406
|
+
|
407
|
+
for (size_t i = 0; i < num_sigalgs; i++) {
|
408
|
+
if (!CBB_add_u16(&sigalgs_cbb, sigalgs[i])) {
|
409
|
+
goto err;
|
410
|
+
}
|
411
|
+
}
|
412
|
+
|
413
|
+
if (!ssl_add_client_CA_list(ssl, &body) ||
|
414
|
+
!CBB_add_u16(&body, 0 /* empty certificate_extensions. */) ||
|
415
|
+
!ssl->method->finish_message(ssl, &cbb)) {
|
416
|
+
goto err;
|
417
|
+
}
|
418
|
+
|
419
|
+
hs->state = state_send_server_certificate;
|
420
|
+
return ssl_hs_write_message;
|
421
|
+
|
422
|
+
err:
|
423
|
+
CBB_cleanup(&cbb);
|
424
|
+
return ssl_hs_error;
|
425
|
+
}
|
426
|
+
|
427
|
+
static enum ssl_hs_wait_t do_send_server_certificate(SSL *ssl,
|
428
|
+
SSL_HANDSHAKE *hs) {
|
429
|
+
if (!ssl_cipher_uses_certificate_auth(ssl->s3->tmp.new_cipher)) {
|
430
|
+
hs->state = state_send_server_finished;
|
431
|
+
return ssl_hs_ok;
|
432
|
+
}
|
433
|
+
|
434
|
+
if (!ssl_has_certificate(ssl)) {
|
435
|
+
OPENSSL_PUT_ERROR(SSL, SSL_R_NO_CERTIFICATE_SET);
|
436
|
+
return ssl_hs_error;
|
437
|
+
}
|
438
|
+
|
439
|
+
if (!tls13_prepare_certificate(ssl)) {
|
440
|
+
return ssl_hs_error;
|
441
|
+
}
|
442
|
+
|
443
|
+
hs->state = state_send_server_certificate_verify;
|
444
|
+
return ssl_hs_write_message;
|
445
|
+
}
|
446
|
+
|
447
|
+
static enum ssl_hs_wait_t do_send_server_certificate_verify(SSL *ssl,
|
448
|
+
SSL_HANDSHAKE *hs,
|
449
|
+
int is_first_run) {
|
450
|
+
switch (tls13_prepare_certificate_verify(ssl, is_first_run)) {
|
451
|
+
case ssl_private_key_success:
|
452
|
+
hs->state = state_send_server_finished;
|
453
|
+
return ssl_hs_write_message;
|
454
|
+
|
455
|
+
case ssl_private_key_retry:
|
456
|
+
hs->state = state_complete_server_certificate_verify;
|
457
|
+
return ssl_hs_private_key_operation;
|
458
|
+
|
459
|
+
case ssl_private_key_failure:
|
460
|
+
return ssl_hs_error;
|
461
|
+
}
|
462
|
+
|
463
|
+
assert(0);
|
464
|
+
return ssl_hs_error;
|
465
|
+
}
|
466
|
+
|
467
|
+
static enum ssl_hs_wait_t do_send_server_finished(SSL *ssl, SSL_HANDSHAKE *hs) {
|
468
|
+
if (!tls13_prepare_finished(ssl)) {
|
469
|
+
return ssl_hs_error;
|
470
|
+
}
|
471
|
+
|
472
|
+
hs->state = state_flush;
|
473
|
+
return ssl_hs_write_message;
|
474
|
+
}
|
475
|
+
|
476
|
+
static enum ssl_hs_wait_t do_flush(SSL *ssl, SSL_HANDSHAKE *hs) {
|
477
|
+
/* Update the secret to the master secret and derive traffic keys. */
|
478
|
+
if (!tls13_advance_key_schedule(ssl, kZeroes, hs->hash_len) ||
|
479
|
+
!tls13_derive_traffic_secret_0(ssl) ||
|
480
|
+
!tls13_set_traffic_key(ssl, type_data, evp_aead_seal,
|
481
|
+
hs->traffic_secret_0, hs->hash_len)) {
|
482
|
+
return ssl_hs_error;
|
483
|
+
}
|
484
|
+
|
485
|
+
hs->state = state_process_client_certificate;
|
486
|
+
return ssl_hs_flush_and_read_message;
|
487
|
+
}
|
488
|
+
|
489
|
+
static enum ssl_hs_wait_t do_process_client_certificate(SSL *ssl,
|
490
|
+
SSL_HANDSHAKE *hs) {
|
491
|
+
if (!ssl->s3->tmp.cert_request) {
|
492
|
+
/* OpenSSL returns X509_V_OK when no certificates are requested. This is
|
493
|
+
* classed by them as a bug, but it's assumed by at least NGINX. */
|
494
|
+
ssl->s3->new_session->verify_result = X509_V_OK;
|
495
|
+
|
496
|
+
/* Skip this state. */
|
497
|
+
hs->state = state_process_client_finished;
|
498
|
+
return ssl_hs_ok;
|
499
|
+
}
|
500
|
+
|
501
|
+
const int allow_anonymous =
|
502
|
+
(ssl->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT) == 0;
|
503
|
+
|
504
|
+
if (!tls13_check_message_type(ssl, SSL3_MT_CERTIFICATE) ||
|
505
|
+
!tls13_process_certificate(ssl, allow_anonymous) ||
|
506
|
+
!ssl->method->hash_current_message(ssl)) {
|
507
|
+
return ssl_hs_error;
|
508
|
+
}
|
509
|
+
|
510
|
+
/* For historical reasons, the server's copy of the chain does not include the
|
511
|
+
* leaf while the client's does. */
|
512
|
+
if (sk_X509_num(ssl->s3->new_session->cert_chain) > 0) {
|
513
|
+
X509_free(sk_X509_shift(ssl->s3->new_session->cert_chain));
|
514
|
+
}
|
515
|
+
|
516
|
+
hs->state = state_process_client_certificate_verify;
|
517
|
+
return ssl_hs_read_message;
|
518
|
+
}
|
519
|
+
|
520
|
+
static enum ssl_hs_wait_t do_process_client_certificate_verify(
|
521
|
+
SSL *ssl, SSL_HANDSHAKE *hs) {
|
522
|
+
if (ssl->s3->new_session->peer == NULL) {
|
523
|
+
/* Skip this state. */
|
524
|
+
hs->state = state_process_client_finished;
|
525
|
+
return ssl_hs_ok;
|
526
|
+
}
|
527
|
+
|
528
|
+
if (!tls13_check_message_type(ssl, SSL3_MT_CERTIFICATE_VERIFY) ||
|
529
|
+
!tls13_process_certificate_verify(ssl) ||
|
530
|
+
!ssl->method->hash_current_message(ssl)) {
|
531
|
+
return 0;
|
532
|
+
}
|
533
|
+
|
534
|
+
hs->state = state_process_client_finished;
|
535
|
+
return ssl_hs_read_message;
|
536
|
+
}
|
537
|
+
|
538
|
+
static enum ssl_hs_wait_t do_process_client_finished(SSL *ssl,
|
539
|
+
SSL_HANDSHAKE *hs) {
|
540
|
+
if (!tls13_check_message_type(ssl, SSL3_MT_FINISHED) ||
|
541
|
+
!tls13_process_finished(ssl) ||
|
542
|
+
!ssl->method->hash_current_message(ssl) ||
|
543
|
+
/* evp_aead_seal keys have already been switched. */
|
544
|
+
!tls13_set_traffic_key(ssl, type_data, evp_aead_open,
|
545
|
+
hs->traffic_secret_0, hs->hash_len) ||
|
546
|
+
!tls13_finalize_keys(ssl)) {
|
547
|
+
return ssl_hs_error;
|
548
|
+
}
|
549
|
+
|
550
|
+
ssl->method->received_flight(ssl);
|
551
|
+
hs->state = state_send_new_session_ticket;
|
552
|
+
return ssl_hs_ok;
|
553
|
+
}
|
554
|
+
|
555
|
+
static enum ssl_hs_wait_t do_send_new_session_ticket(SSL *ssl,
|
556
|
+
SSL_HANDSHAKE *hs) {
|
557
|
+
SSL_SESSION *session = ssl->s3->new_session;
|
558
|
+
session->tlsext_tick_lifetime_hint = session->timeout;
|
559
|
+
session->ticket_flags = SSL_TICKET_ALLOW_DHE_RESUMPTION;
|
560
|
+
if (!RAND_bytes((uint8_t *)&session->ticket_age_add,
|
561
|
+
sizeof(session->ticket_age_add))) {
|
562
|
+
return 0;
|
563
|
+
}
|
564
|
+
session->ticket_age_add_valid = 1;
|
565
|
+
|
566
|
+
CBB cbb, body, ticket;
|
567
|
+
if (!ssl->method->init_message(ssl, &cbb, &body,
|
568
|
+
SSL3_MT_NEW_SESSION_TICKET) ||
|
569
|
+
!CBB_add_u32(&body, session->tlsext_tick_lifetime_hint) ||
|
570
|
+
!CBB_add_u32(&body, session->ticket_flags) ||
|
571
|
+
!CBB_add_u32(&body, session->ticket_age_add) ||
|
572
|
+
!CBB_add_u16(&body, 0 /* no ticket extensions */) ||
|
573
|
+
!CBB_add_u16_length_prefixed(&body, &ticket) ||
|
574
|
+
!ssl_encrypt_ticket(ssl, &ticket, session) ||
|
575
|
+
!ssl->method->finish_message(ssl, &cbb)) {
|
576
|
+
CBB_cleanup(&cbb);
|
577
|
+
return ssl_hs_error;
|
578
|
+
}
|
579
|
+
|
580
|
+
hs->session_tickets_sent++;
|
581
|
+
|
582
|
+
hs->state = state_flush_new_session_ticket;
|
583
|
+
return ssl_hs_write_message;
|
584
|
+
}
|
585
|
+
|
586
|
+
/* TLS 1.3 recommends single-use tickets, so issue multiple tickets in case the
|
587
|
+
* client makes several connections before getting a renewal. */
|
588
|
+
static const int kNumTickets = 2;
|
589
|
+
|
590
|
+
static enum ssl_hs_wait_t do_flush_new_session_ticket(SSL *ssl,
|
591
|
+
SSL_HANDSHAKE *hs) {
|
592
|
+
if (hs->session_tickets_sent >= kNumTickets) {
|
593
|
+
hs->state = state_done;
|
594
|
+
} else {
|
595
|
+
hs->state = state_send_new_session_ticket;
|
596
|
+
}
|
597
|
+
return ssl_hs_flush;
|
598
|
+
}
|
599
|
+
|
600
|
+
enum ssl_hs_wait_t tls13_server_handshake(SSL *ssl) {
|
601
|
+
SSL_HANDSHAKE *hs = ssl->s3->hs;
|
602
|
+
|
603
|
+
while (hs->state != state_done) {
|
604
|
+
enum ssl_hs_wait_t ret = ssl_hs_error;
|
605
|
+
enum server_hs_state_t state = hs->state;
|
606
|
+
switch (state) {
|
607
|
+
case state_process_client_hello:
|
608
|
+
ret = do_process_client_hello(ssl, hs);
|
609
|
+
break;
|
610
|
+
case state_select_parameters:
|
611
|
+
ret = do_select_parameters(ssl, hs);
|
612
|
+
break;
|
613
|
+
case state_send_hello_retry_request:
|
614
|
+
ret = do_send_hello_retry_request(ssl, hs);
|
615
|
+
break;
|
616
|
+
case state_flush_hello_retry_request:
|
617
|
+
ret = do_flush_hello_retry_request(ssl, hs);
|
618
|
+
break;
|
619
|
+
case state_process_second_client_hello:
|
620
|
+
ret = do_process_second_client_hello(ssl, hs);
|
621
|
+
break;
|
622
|
+
case state_send_server_hello:
|
623
|
+
ret = do_send_server_hello(ssl, hs);
|
624
|
+
break;
|
625
|
+
case state_send_encrypted_extensions:
|
626
|
+
ret = do_send_encrypted_extensions(ssl, hs);
|
627
|
+
break;
|
628
|
+
case state_send_certificate_request:
|
629
|
+
ret = do_send_certificate_request(ssl, hs);
|
630
|
+
break;
|
631
|
+
case state_send_server_certificate:
|
632
|
+
ret = do_send_server_certificate(ssl, hs);
|
633
|
+
break;
|
634
|
+
case state_send_server_certificate_verify:
|
635
|
+
ret = do_send_server_certificate_verify(ssl, hs, 1 /* first run */);
|
636
|
+
break;
|
637
|
+
case state_complete_server_certificate_verify:
|
638
|
+
ret = do_send_server_certificate_verify(ssl, hs, 0 /* complete */);
|
639
|
+
break;
|
640
|
+
case state_send_server_finished:
|
641
|
+
ret = do_send_server_finished(ssl, hs);
|
642
|
+
break;
|
643
|
+
case state_flush:
|
644
|
+
ret = do_flush(ssl, hs);
|
645
|
+
break;
|
646
|
+
case state_process_client_certificate:
|
647
|
+
ret = do_process_client_certificate(ssl, hs);
|
648
|
+
break;
|
649
|
+
case state_process_client_certificate_verify:
|
650
|
+
ret = do_process_client_certificate_verify(ssl, hs);
|
651
|
+
break;
|
652
|
+
case state_process_client_finished:
|
653
|
+
ret = do_process_client_finished(ssl, hs);
|
654
|
+
break;
|
655
|
+
case state_send_new_session_ticket:
|
656
|
+
ret = do_send_new_session_ticket(ssl, hs);
|
657
|
+
break;
|
658
|
+
case state_flush_new_session_ticket:
|
659
|
+
ret = do_flush_new_session_ticket(ssl, hs);
|
660
|
+
break;
|
661
|
+
case state_done:
|
662
|
+
ret = ssl_hs_ok;
|
663
|
+
break;
|
664
|
+
}
|
665
|
+
|
666
|
+
if (ret != ssl_hs_ok) {
|
667
|
+
return ret;
|
668
|
+
}
|
669
|
+
}
|
670
|
+
|
671
|
+
return ssl_hs_ok;
|
672
|
+
}
|