grpc 1.24.0 → 1.25.0
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 +306 -243
- data/etc/roots.pem +0 -100
- data/include/grpc/grpc_security.h +44 -18
- data/include/grpc/impl/codegen/grpc_types.h +15 -0
- data/include/grpc/impl/codegen/port_platform.h +27 -11
- data/include/grpc/impl/codegen/sync_generic.h +1 -1
- data/src/boringssl/err_data.c +695 -650
- data/src/core/ext/filters/client_channel/client_channel.cc +257 -179
- data/src/core/ext/filters/client_channel/client_channel.h +24 -0
- data/src/core/ext/filters/client_channel/client_channel_channelz.cc +2 -3
- data/src/core/ext/filters/client_channel/client_channel_factory.h +1 -5
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +18 -45
- data/src/core/ext/filters/client_channel/health/health_check_client.h +5 -13
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy.cc +2 -3
- data/src/core/ext/filters/client_channel/lb_policy.h +65 -55
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +14 -14
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +113 -36
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +14 -19
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +36 -13
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +3 -10
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +814 -1589
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +2 -5
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +3 -6
- data/src/core/ext/filters/client_channel/resolver.cc +1 -2
- data/src/core/ext/filters/client_channel/resolver.h +8 -16
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +25 -8
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +46 -12
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +10 -17
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +7 -8
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -4
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +111 -44
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +22 -14
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +29 -10
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +27 -36
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +7 -10
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +60 -16
- data/src/core/ext/filters/client_channel/resolver_factory.h +4 -8
- data/src/core/ext/filters/client_channel/resolver_registry.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver_registry.h +1 -1
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +7 -10
- data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +7 -8
- data/src/core/ext/filters/client_channel/resolving_lb_policy.h +1 -1
- data/src/core/ext/filters/client_channel/retry_throttle.cc +5 -5
- data/src/core/ext/filters/client_channel/retry_throttle.h +1 -4
- data/src/core/ext/filters/client_channel/service_config.h +8 -8
- data/src/core/ext/filters/client_channel/subchannel.cc +53 -86
- data/src/core/ext/filters/client_channel/subchannel.h +7 -9
- data/src/core/ext/filters/client_channel/subchannel_interface.h +9 -13
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +3 -6
- data/src/core/ext/filters/client_channel/{lb_policy/xds/xds_load_balancer_api.cc → xds/xds_api.cc} +169 -52
- data/src/core/ext/filters/client_channel/xds/xds_api.h +171 -0
- data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +450 -0
- data/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +99 -0
- data/src/core/ext/filters/client_channel/{lb_policy/xds → xds}/xds_channel.h +8 -6
- data/src/core/ext/filters/client_channel/xds/xds_channel_args.h +26 -0
- data/src/core/ext/filters/client_channel/{lb_policy/xds → xds}/xds_channel_secure.cc +28 -11
- data/src/core/ext/filters/client_channel/xds/xds_client.cc +1413 -0
- data/src/core/ext/filters/client_channel/xds/xds_client.h +221 -0
- data/src/core/ext/filters/client_channel/{lb_policy/xds → xds}/xds_client_stats.cc +1 -5
- data/src/core/ext/filters/client_channel/{lb_policy/xds → xds}/xds_client_stats.h +3 -4
- data/src/core/ext/filters/deadline/deadline_filter.cc +20 -20
- data/src/core/ext/filters/http/client/http_client_filter.cc +15 -15
- data/src/core/ext/filters/http/client_authority_filter.cc +14 -14
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +12 -12
- data/src/core/ext/filters/max_age/max_age_filter.cc +59 -50
- data/src/core/ext/filters/message_size/message_size_filter.cc +18 -18
- data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +15 -14
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +233 -175
- data/src/core/ext/transport/chttp2/transport/flow_control.h +21 -24
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +253 -163
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +24 -12
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +2 -3
- data/src/core/ext/transport/chttp2/transport/internal.h +13 -15
- data/src/core/ext/transport/chttp2/transport/writing.cc +3 -0
- data/src/core/ext/transport/inproc/inproc_transport.cc +20 -13
- data/src/core/lib/channel/channel_args.cc +16 -0
- data/src/core/lib/channel/channel_args.h +22 -0
- data/src/core/lib/channel/channelz.cc +5 -6
- data/src/core/lib/channel/channelz.h +1 -1
- data/src/core/lib/channel/connected_channel.cc +20 -20
- data/src/core/lib/channel/handshaker.h +3 -4
- data/src/core/lib/channel/handshaker_factory.h +1 -3
- data/src/core/lib/debug/trace.h +3 -2
- data/src/core/lib/gprpp/arena.cc +3 -3
- data/src/core/lib/gprpp/arena.h +2 -3
- data/src/core/lib/gprpp/inlined_vector.h +9 -0
- data/src/core/lib/gprpp/map.h +3 -501
- data/src/core/lib/gprpp/memory.h +45 -41
- data/src/core/lib/gprpp/mpscq.cc +108 -0
- data/src/core/lib/gprpp/mpscq.h +98 -0
- data/src/core/lib/gprpp/orphanable.h +6 -11
- data/src/core/lib/gprpp/ref_counted.h +25 -19
- data/src/core/lib/gprpp/set.h +33 -0
- data/src/core/lib/gprpp/thd.h +2 -4
- data/src/core/lib/http/httpcli.cc +1 -1
- data/src/core/lib/http/httpcli_security_connector.cc +15 -11
- data/src/core/lib/http/parser.cc +1 -1
- data/src/core/lib/iomgr/buffer_list.cc +4 -5
- data/src/core/lib/iomgr/buffer_list.h +5 -6
- data/src/core/lib/iomgr/call_combiner.cc +4 -5
- data/src/core/lib/iomgr/call_combiner.h +2 -2
- data/src/core/lib/iomgr/cfstream_handle.h +3 -5
- data/src/core/lib/iomgr/closure.h +8 -3
- data/src/core/lib/iomgr/combiner.cc +45 -82
- data/src/core/lib/iomgr/combiner.h +32 -8
- data/src/core/lib/iomgr/endpoint_cfstream.cc +5 -3
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +19 -15
- data/src/core/lib/iomgr/ev_poll_posix.cc +3 -1
- data/src/core/lib/iomgr/exec_ctx.h +4 -3
- data/src/core/lib/iomgr/executor.cc +4 -2
- data/src/core/lib/iomgr/executor.h +3 -0
- data/src/core/lib/iomgr/executor/mpmcqueue.h +3 -6
- data/src/core/lib/iomgr/executor/threadpool.cc +1 -2
- data/src/core/lib/iomgr/executor/threadpool.h +7 -11
- data/src/core/lib/iomgr/resource_quota.cc +55 -51
- data/src/core/lib/iomgr/resource_quota.h +13 -9
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +13 -0
- data/src/core/lib/iomgr/socket_utils_posix.h +4 -0
- data/src/core/lib/iomgr/tcp_client_posix.cc +4 -11
- data/src/core/lib/iomgr/tcp_custom.cc +9 -7
- data/src/core/lib/iomgr/tcp_posix.cc +20 -16
- data/src/core/lib/iomgr/tcp_server.h +1 -4
- data/src/core/lib/iomgr/tcp_server_custom.cc +5 -5
- data/src/core/lib/iomgr/tcp_server_posix.cc +1 -1
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +2 -11
- data/src/core/lib/iomgr/timer_custom.cc +2 -2
- data/src/core/lib/iomgr/udp_server.cc +3 -2
- data/src/core/lib/iomgr/udp_server.h +6 -12
- data/src/core/lib/json/json.h +1 -1
- data/src/core/lib/json/json_string.cc +2 -2
- data/src/core/lib/profiling/basic_timers.cc +2 -2
- data/src/core/lib/security/credentials/alts/alts_credentials.cc +2 -2
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +1 -1
- data/src/core/lib/security/credentials/credentials.h +4 -20
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +4 -4
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -3
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +64 -0
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +4 -4
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +9 -7
- data/src/core/lib/security/security_connector/load_system_roots_linux.cc +2 -0
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +4 -4
- data/src/core/lib/security/security_connector/security_connector.cc +1 -0
- data/src/core/lib/security/security_connector/security_connector.h +19 -17
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +8 -5
- data/src/core/lib/security/security_connector/ssl_utils.cc +2 -2
- data/src/core/lib/security/security_connector/ssl_utils.h +1 -1
- data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +14 -6
- data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +4 -2
- data/src/core/lib/security/transport/client_auth_filter.cc +17 -17
- data/src/core/lib/security/transport/security_handshaker.cc +29 -13
- data/src/core/lib/security/transport/security_handshaker.h +4 -2
- data/src/core/lib/security/transport/server_auth_filter.cc +14 -14
- data/src/core/lib/slice/slice.cc +2 -10
- data/src/core/lib/slice/slice_hash_table.h +4 -6
- data/src/core/lib/slice/slice_intern.cc +42 -39
- data/src/core/lib/slice/slice_internal.h +3 -3
- data/src/core/lib/slice/slice_utils.h +21 -4
- data/src/core/lib/slice/slice_weak_hash_table.h +4 -6
- data/src/core/lib/surface/call.cc +3 -3
- data/src/core/lib/surface/channel.cc +7 -0
- data/src/core/lib/surface/completion_queue.cc +12 -11
- data/src/core/lib/surface/completion_queue.h +4 -2
- data/src/core/lib/surface/init.cc +1 -0
- data/src/core/lib/surface/lame_client.cc +33 -18
- data/src/core/lib/surface/server.cc +77 -76
- data/src/core/lib/surface/version.cc +1 -1
- data/src/core/lib/transport/byte_stream.h +3 -7
- data/src/core/lib/transport/connectivity_state.cc +112 -98
- data/src/core/lib/transport/connectivity_state.h +100 -50
- data/src/core/lib/transport/static_metadata.cc +276 -288
- data/src/core/lib/transport/static_metadata.h +73 -76
- data/src/core/lib/transport/status_conversion.cc +1 -1
- data/src/core/lib/transport/status_metadata.cc +1 -1
- data/src/core/lib/transport/transport.cc +2 -2
- data/src/core/lib/transport/transport.h +12 -4
- data/src/core/lib/transport/transport_op_string.cc +14 -11
- data/src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc +1 -1
- data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +1 -1
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +5 -5
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +12 -2
- data/src/core/tsi/fake_transport_security.cc +7 -5
- data/src/core/tsi/grpc_shadow_boringssl.h +2918 -2627
- data/src/core/tsi/local_transport_security.cc +8 -6
- data/src/core/tsi/ssl/session_cache/ssl_session.h +1 -3
- data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -2
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +7 -5
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -6
- data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +1 -2
- data/src/core/tsi/ssl_transport_security.cc +12 -12
- data/src/core/tsi/ssl_transport_security.h +2 -2
- data/src/core/tsi/transport_security_grpc.cc +7 -0
- data/src/core/tsi/transport_security_grpc.h +6 -0
- data/src/ruby/ext/grpc/extconf.rb +1 -0
- data/src/ruby/ext/grpc/rb_call.c +1 -1
- data/src/ruby/ext/grpc/rb_channel.c +1 -1
- data/src/ruby/lib/grpc/generic/bidi_call.rb +1 -1
- data/src/ruby/lib/grpc/generic/rpc_server.rb +1 -1
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/spec/google_rpc_status_utils_spec.rb +2 -2
- data/third_party/boringssl/crypto/asn1/a_bool.c +18 -5
- data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +17 -221
- data/third_party/boringssl/crypto/asn1/a_dup.c +0 -24
- data/third_party/boringssl/crypto/asn1/a_enum.c +2 -2
- data/third_party/boringssl/crypto/asn1/a_i2d_fp.c +10 -72
- data/third_party/boringssl/crypto/asn1/a_int.c +12 -71
- data/third_party/boringssl/crypto/asn1/a_mbstr.c +110 -216
- data/third_party/boringssl/crypto/asn1/a_object.c +16 -5
- data/third_party/boringssl/crypto/asn1/a_strnid.c +1 -0
- data/third_party/boringssl/crypto/asn1/asn1_lib.c +5 -1
- data/third_party/boringssl/crypto/asn1/tasn_enc.c +3 -1
- data/third_party/boringssl/crypto/base64/base64.c +2 -2
- data/third_party/boringssl/crypto/bio/bio.c +73 -9
- data/third_party/boringssl/crypto/bio/connect.c +4 -0
- data/third_party/boringssl/crypto/bio/fd.c +4 -0
- data/third_party/boringssl/crypto/bio/file.c +5 -2
- data/third_party/boringssl/crypto/bio/socket.c +4 -0
- data/third_party/boringssl/crypto/bio/socket_helper.c +4 -0
- data/third_party/boringssl/crypto/bn_extra/convert.c +11 -7
- data/third_party/boringssl/crypto/bytestring/ber.c +8 -4
- data/third_party/boringssl/crypto/bytestring/cbb.c +19 -7
- data/third_party/boringssl/crypto/bytestring/cbs.c +28 -15
- data/third_party/boringssl/crypto/bytestring/internal.h +28 -7
- data/third_party/boringssl/crypto/bytestring/unicode.c +155 -0
- data/third_party/boringssl/crypto/chacha/chacha.c +36 -19
- data/third_party/boringssl/crypto/chacha/internal.h +45 -0
- data/third_party/boringssl/crypto/cipher_extra/cipher_extra.c +29 -0
- data/third_party/boringssl/crypto/cipher_extra/e_aesccm.c +269 -25
- data/third_party/boringssl/crypto/cipher_extra/e_aesctrhmac.c +16 -14
- data/third_party/boringssl/crypto/cipher_extra/e_aesgcmsiv.c +54 -38
- data/third_party/boringssl/crypto/cipher_extra/e_chacha20poly1305.c +133 -41
- data/third_party/boringssl/crypto/cipher_extra/e_tls.c +23 -15
- data/third_party/boringssl/crypto/cipher_extra/tls_cbc.c +24 -15
- data/third_party/boringssl/crypto/cmac/cmac.c +62 -25
- data/third_party/boringssl/crypto/conf/conf.c +7 -0
- data/third_party/boringssl/crypto/cpu-arm-linux.c +4 -148
- data/third_party/boringssl/crypto/cpu-arm-linux.h +201 -0
- data/third_party/boringssl/crypto/cpu-intel.c +45 -51
- data/third_party/boringssl/crypto/crypto.c +39 -22
- data/third_party/boringssl/crypto/curve25519/spake25519.c +1 -1
- data/third_party/boringssl/crypto/dsa/dsa.c +77 -53
- data/third_party/boringssl/crypto/ec_extra/ec_asn1.c +20 -8
- data/third_party/boringssl/crypto/ec_extra/ec_derive.c +96 -0
- data/third_party/boringssl/crypto/{ecdh/ecdh.c → ecdh_extra/ecdh_extra.c} +20 -58
- data/third_party/boringssl/crypto/ecdsa_extra/ecdsa_asn1.c +1 -9
- data/third_party/boringssl/crypto/engine/engine.c +2 -1
- data/third_party/boringssl/crypto/err/err.c +2 -0
- data/third_party/boringssl/crypto/err/internal.h +2 -2
- data/third_party/boringssl/crypto/evp/evp.c +89 -8
- data/third_party/boringssl/crypto/evp/evp_asn1.c +56 -5
- data/third_party/boringssl/crypto/evp/evp_ctx.c +52 -14
- data/third_party/boringssl/crypto/evp/internal.h +18 -1
- data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +5 -0
- data/third_party/boringssl/crypto/evp/p_ec.c +51 -3
- data/third_party/boringssl/crypto/evp/p_ec_asn1.c +6 -7
- data/third_party/boringssl/crypto/evp/p_ed25519.c +36 -3
- data/third_party/boringssl/crypto/evp/p_ed25519_asn1.c +76 -45
- data/third_party/boringssl/crypto/evp/p_rsa.c +3 -1
- data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +5 -0
- data/third_party/boringssl/crypto/evp/p_x25519.c +110 -0
- data/third_party/boringssl/crypto/evp/p_x25519_asn1.c +249 -0
- data/third_party/boringssl/crypto/evp/scrypt.c +6 -2
- data/third_party/boringssl/crypto/fipsmodule/aes/aes.c +34 -274
- data/third_party/boringssl/crypto/fipsmodule/aes/internal.h +161 -21
- data/third_party/boringssl/crypto/fipsmodule/aes/key_wrap.c +111 -13
- data/third_party/boringssl/crypto/fipsmodule/aes/mode_wrappers.c +17 -21
- data/third_party/boringssl/crypto/fipsmodule/bcm.c +119 -7
- data/third_party/boringssl/crypto/fipsmodule/bn/bn.c +19 -2
- data/third_party/boringssl/crypto/fipsmodule/bn/cmp.c +2 -2
- data/third_party/boringssl/crypto/fipsmodule/bn/ctx.c +93 -160
- data/third_party/boringssl/crypto/fipsmodule/bn/div.c +48 -57
- data/third_party/boringssl/crypto/fipsmodule/bn/div_extra.c +87 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/exponentiation.c +143 -211
- data/third_party/boringssl/crypto/fipsmodule/bn/gcd.c +0 -305
- data/third_party/boringssl/crypto/fipsmodule/bn/gcd_extra.c +325 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/internal.h +168 -50
- data/third_party/boringssl/crypto/fipsmodule/bn/montgomery.c +68 -92
- data/third_party/boringssl/crypto/fipsmodule/bn/montgomery_inv.c +7 -6
- data/third_party/boringssl/crypto/fipsmodule/bn/mul.c +11 -14
- data/third_party/boringssl/crypto/fipsmodule/bn/prime.c +358 -443
- data/third_party/boringssl/crypto/fipsmodule/bn/random.c +25 -35
- data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.c +20 -25
- data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.h +76 -5
- data/third_party/boringssl/crypto/fipsmodule/bn/shift.c +14 -14
- data/third_party/boringssl/crypto/fipsmodule/cipher/cipher.c +7 -2
- data/third_party/boringssl/crypto/fipsmodule/cipher/e_aes.c +383 -516
- data/third_party/boringssl/crypto/fipsmodule/cipher/e_des.c +4 -0
- data/third_party/boringssl/crypto/fipsmodule/cipher/internal.h +3 -4
- data/third_party/boringssl/crypto/fipsmodule/delocate.h +3 -2
- data/third_party/boringssl/crypto/fipsmodule/digest/digest.c +32 -17
- data/third_party/boringssl/crypto/fipsmodule/digest/md32_common.h +3 -3
- data/third_party/boringssl/crypto/fipsmodule/ec/ec.c +228 -122
- data/third_party/boringssl/crypto/fipsmodule/ec/ec_key.c +34 -8
- data/third_party/boringssl/crypto/fipsmodule/ec/ec_montgomery.c +311 -98
- data/third_party/boringssl/crypto/fipsmodule/ec/felem.c +82 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/internal.h +263 -97
- data/third_party/boringssl/crypto/fipsmodule/ec/oct.c +22 -59
- data/third_party/boringssl/crypto/fipsmodule/ec/p224-64.c +317 -234
- data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64-table.h +9473 -9475
- data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.c +313 -109
- data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.h +36 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/scalar.c +96 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/simple.c +126 -792
- data/third_party/boringssl/crypto/fipsmodule/ec/simple_mul.c +84 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/util.c +163 -12
- data/third_party/boringssl/crypto/fipsmodule/ec/wnaf.c +84 -211
- data/third_party/boringssl/crypto/fipsmodule/ecdh/ecdh.c +122 -0
- data/third_party/boringssl/crypto/fipsmodule/ecdsa/ecdsa.c +60 -205
- data/third_party/boringssl/crypto/fipsmodule/fips_shared_support.c +32 -0
- data/third_party/boringssl/crypto/fipsmodule/is_fips.c +2 -0
- data/third_party/boringssl/crypto/fipsmodule/md4/md4.c +3 -1
- data/third_party/boringssl/crypto/fipsmodule/md5/internal.h +37 -0
- data/third_party/boringssl/crypto/fipsmodule/md5/md5.c +11 -8
- data/third_party/boringssl/crypto/fipsmodule/modes/cbc.c +35 -79
- data/third_party/boringssl/crypto/fipsmodule/modes/cfb.c +7 -39
- data/third_party/boringssl/crypto/fipsmodule/modes/ctr.c +7 -27
- data/third_party/boringssl/crypto/fipsmodule/modes/gcm.c +123 -309
- data/third_party/boringssl/crypto/fipsmodule/modes/internal.h +189 -126
- data/third_party/boringssl/crypto/fipsmodule/modes/ofb.c +3 -2
- data/third_party/boringssl/crypto/fipsmodule/rand/ctrdrbg.c +2 -2
- data/third_party/boringssl/crypto/fipsmodule/rand/internal.h +35 -0
- data/third_party/boringssl/crypto/fipsmodule/rand/rand.c +24 -19
- data/third_party/boringssl/crypto/fipsmodule/rand/urandom.c +256 -77
- data/third_party/boringssl/crypto/fipsmodule/rsa/padding.c +10 -7
- data/third_party/boringssl/crypto/fipsmodule/rsa/rsa.c +5 -1
- data/third_party/boringssl/crypto/fipsmodule/rsa/rsa_impl.c +131 -14
- data/third_party/boringssl/crypto/fipsmodule/self_check/self_check.c +83 -10
- data/third_party/boringssl/crypto/fipsmodule/sha/internal.h +53 -0
- data/third_party/boringssl/crypto/fipsmodule/sha/sha1.c +9 -13
- data/third_party/boringssl/crypto/fipsmodule/sha/sha256.c +18 -12
- data/third_party/boringssl/crypto/fipsmodule/sha/sha512.c +95 -168
- data/third_party/boringssl/crypto/hrss/hrss.c +2201 -0
- data/third_party/boringssl/crypto/hrss/internal.h +62 -0
- data/third_party/boringssl/crypto/internal.h +95 -20
- data/third_party/boringssl/crypto/lhash/lhash.c +45 -33
- data/third_party/boringssl/crypto/mem.c +39 -2
- data/third_party/boringssl/crypto/obj/obj.c +4 -4
- data/third_party/boringssl/crypto/obj/obj_dat.h +6181 -875
- data/third_party/boringssl/crypto/pem/pem_all.c +2 -3
- data/third_party/boringssl/crypto/pem/pem_info.c +144 -162
- data/third_party/boringssl/crypto/pem/pem_lib.c +53 -52
- data/third_party/boringssl/crypto/pem/pem_pkey.c +13 -21
- data/third_party/boringssl/crypto/pkcs7/pkcs7.c +15 -22
- data/third_party/boringssl/crypto/pkcs7/pkcs7_x509.c +168 -16
- data/third_party/boringssl/crypto/pkcs8/internal.h +11 -0
- data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +24 -15
- data/third_party/boringssl/crypto/pkcs8/pkcs8.c +42 -25
- data/third_party/boringssl/crypto/pkcs8/pkcs8_x509.c +559 -43
- data/third_party/boringssl/crypto/pool/internal.h +1 -1
- data/third_party/boringssl/crypto/pool/pool.c +21 -0
- data/third_party/boringssl/crypto/rand_extra/deterministic.c +8 -0
- data/third_party/boringssl/crypto/rand_extra/fuchsia.c +1 -14
- data/third_party/boringssl/crypto/refcount_lock.c +2 -2
- data/third_party/boringssl/crypto/rsa_extra/rsa_print.c +22 -0
- data/third_party/boringssl/crypto/siphash/siphash.c +80 -0
- data/third_party/boringssl/crypto/stack/stack.c +83 -32
- data/third_party/boringssl/crypto/thread_none.c +2 -2
- data/third_party/boringssl/crypto/thread_pthread.c +2 -2
- data/third_party/boringssl/crypto/thread_win.c +38 -19
- data/third_party/boringssl/crypto/x509/a_strex.c +22 -2
- data/third_party/boringssl/crypto/x509/asn1_gen.c +2 -1
- data/third_party/boringssl/crypto/x509/by_dir.c +7 -0
- data/third_party/boringssl/crypto/x509/by_file.c +12 -10
- data/third_party/boringssl/crypto/x509/t_crl.c +5 -8
- data/third_party/boringssl/crypto/x509/t_req.c +1 -3
- data/third_party/boringssl/crypto/x509/t_x509.c +5 -8
- data/third_party/boringssl/crypto/x509/x509_cmp.c +1 -1
- data/third_party/boringssl/crypto/x509/x509_def.c +1 -1
- data/third_party/boringssl/crypto/x509/x509_lu.c +114 -5
- data/third_party/boringssl/crypto/x509/x509_req.c +20 -0
- data/third_party/boringssl/crypto/x509/x509_set.c +5 -0
- data/third_party/boringssl/crypto/x509/x509_trs.c +1 -0
- data/third_party/boringssl/crypto/x509/x509_txt.c +4 -5
- data/third_party/boringssl/crypto/x509/x509_vfy.c +145 -138
- data/third_party/boringssl/crypto/x509/x509_vpm.c +2 -0
- data/third_party/boringssl/crypto/x509/x509cset.c +40 -0
- data/third_party/boringssl/crypto/x509/x509name.c +2 -3
- data/third_party/boringssl/crypto/x509/x_all.c +109 -210
- data/third_party/boringssl/crypto/x509/x_x509.c +6 -0
- data/third_party/boringssl/crypto/x509v3/ext_dat.h +1 -3
- data/third_party/boringssl/crypto/x509v3/internal.h +56 -0
- data/third_party/boringssl/crypto/x509v3/pcy_cache.c +2 -0
- data/third_party/boringssl/crypto/x509v3/pcy_node.c +1 -0
- data/third_party/boringssl/crypto/x509v3/pcy_tree.c +4 -2
- data/third_party/boringssl/crypto/x509v3/v3_akey.c +5 -2
- data/third_party/boringssl/crypto/x509v3/v3_alt.c +19 -13
- data/third_party/boringssl/crypto/x509v3/v3_conf.c +2 -1
- data/third_party/boringssl/crypto/x509v3/v3_cpols.c +3 -2
- data/third_party/boringssl/crypto/x509v3/v3_genn.c +1 -6
- data/third_party/boringssl/crypto/x509v3/v3_lib.c +1 -0
- data/third_party/boringssl/crypto/x509v3/v3_ocsp.c +68 -0
- data/third_party/boringssl/crypto/x509v3/v3_pci.c +2 -1
- data/third_party/boringssl/crypto/x509v3/v3_purp.c +47 -69
- data/third_party/boringssl/crypto/x509v3/v3_skey.c +5 -2
- data/third_party/boringssl/crypto/x509v3/v3_utl.c +69 -25
- data/third_party/boringssl/include/openssl/aead.h +45 -19
- data/third_party/boringssl/include/openssl/aes.h +32 -7
- data/third_party/boringssl/include/openssl/asn1.h +7 -77
- data/third_party/boringssl/include/openssl/base.h +120 -6
- data/third_party/boringssl/include/openssl/base64.h +4 -1
- data/third_party/boringssl/include/openssl/bio.h +112 -81
- data/third_party/boringssl/include/openssl/blowfish.h +3 -3
- data/third_party/boringssl/include/openssl/bn.h +55 -29
- data/third_party/boringssl/include/openssl/buf.h +2 -2
- data/third_party/boringssl/include/openssl/bytestring.h +54 -32
- data/third_party/boringssl/include/openssl/cast.h +2 -2
- data/third_party/boringssl/include/openssl/cipher.h +46 -16
- data/third_party/boringssl/include/openssl/cmac.h +6 -2
- data/third_party/boringssl/include/openssl/conf.h +3 -6
- data/third_party/boringssl/include/openssl/cpu.h +25 -9
- data/third_party/boringssl/include/openssl/crypto.h +32 -10
- data/third_party/boringssl/include/openssl/curve25519.h +4 -4
- data/third_party/boringssl/include/openssl/dh.h +3 -2
- data/third_party/boringssl/include/openssl/digest.h +21 -7
- data/third_party/boringssl/include/openssl/dsa.h +8 -2
- data/third_party/boringssl/include/openssl/e_os2.h +18 -0
- data/third_party/boringssl/include/openssl/ec.h +25 -21
- data/third_party/boringssl/include/openssl/ec_key.h +36 -8
- data/third_party/boringssl/include/openssl/ecdh.h +17 -0
- data/third_party/boringssl/include/openssl/ecdsa.h +3 -3
- data/third_party/boringssl/include/openssl/engine.h +4 -4
- data/third_party/boringssl/include/openssl/err.h +3 -0
- data/third_party/boringssl/include/openssl/evp.h +199 -42
- data/third_party/boringssl/include/openssl/hmac.h +4 -4
- data/third_party/boringssl/include/openssl/hrss.h +100 -0
- data/third_party/boringssl/include/openssl/lhash.h +131 -23
- data/third_party/boringssl/include/openssl/md4.h +6 -4
- data/third_party/boringssl/include/openssl/md5.h +6 -4
- data/third_party/boringssl/include/openssl/mem.h +6 -2
- data/third_party/boringssl/include/openssl/nid.h +3 -0
- data/third_party/boringssl/include/openssl/obj.h +3 -0
- data/third_party/boringssl/include/openssl/pem.h +102 -64
- data/third_party/boringssl/include/openssl/pkcs7.h +136 -3
- data/third_party/boringssl/include/openssl/pkcs8.h +42 -3
- data/third_party/boringssl/include/openssl/pool.h +13 -2
- data/third_party/boringssl/include/openssl/ripemd.h +5 -4
- data/third_party/boringssl/include/openssl/rsa.h +46 -15
- data/third_party/boringssl/include/openssl/sha.h +40 -28
- data/third_party/boringssl/include/openssl/siphash.h +37 -0
- data/third_party/boringssl/include/openssl/span.h +17 -9
- data/third_party/boringssl/include/openssl/ssl.h +766 -393
- data/third_party/boringssl/include/openssl/ssl3.h +4 -3
- data/third_party/boringssl/include/openssl/stack.h +134 -77
- data/third_party/boringssl/include/openssl/thread.h +1 -1
- data/third_party/boringssl/include/openssl/tls1.h +25 -9
- data/third_party/boringssl/include/openssl/type_check.h +14 -15
- data/third_party/boringssl/include/openssl/x509.h +28 -3
- data/third_party/boringssl/include/openssl/x509_vfy.h +98 -32
- data/third_party/boringssl/include/openssl/x509v3.h +17 -13
- data/third_party/boringssl/ssl/d1_both.cc +9 -18
- data/third_party/boringssl/ssl/d1_lib.cc +4 -3
- data/third_party/boringssl/ssl/d1_pkt.cc +4 -4
- data/third_party/boringssl/ssl/d1_srtp.cc +15 -15
- data/third_party/boringssl/ssl/dtls_method.cc +0 -1
- data/third_party/boringssl/ssl/dtls_record.cc +28 -28
- data/third_party/boringssl/ssl/handoff.cc +295 -91
- data/third_party/boringssl/ssl/handshake.cc +133 -72
- data/third_party/boringssl/ssl/handshake_client.cc +218 -189
- data/third_party/boringssl/ssl/handshake_server.cc +399 -272
- data/third_party/boringssl/ssl/internal.h +1413 -928
- data/third_party/boringssl/ssl/s3_both.cc +175 -36
- data/third_party/boringssl/ssl/s3_lib.cc +9 -13
- data/third_party/boringssl/ssl/s3_pkt.cc +63 -29
- data/third_party/boringssl/ssl/ssl_aead_ctx.cc +55 -35
- data/third_party/boringssl/ssl/ssl_asn1.cc +57 -73
- data/third_party/boringssl/ssl/ssl_buffer.cc +13 -12
- data/third_party/boringssl/ssl/ssl_cert.cc +313 -210
- data/third_party/boringssl/ssl/ssl_cipher.cc +159 -221
- data/third_party/boringssl/ssl/ssl_file.cc +2 -0
- data/third_party/boringssl/ssl/ssl_key_share.cc +164 -19
- data/third_party/boringssl/ssl/ssl_lib.cc +847 -555
- data/third_party/boringssl/ssl/ssl_privkey.cc +441 -111
- data/third_party/boringssl/ssl/ssl_session.cc +230 -178
- data/third_party/boringssl/ssl/ssl_transcript.cc +21 -142
- data/third_party/boringssl/ssl/ssl_versions.cc +88 -93
- data/third_party/boringssl/ssl/ssl_x509.cc +279 -218
- data/third_party/boringssl/ssl/t1_enc.cc +5 -96
- data/third_party/boringssl/ssl/t1_lib.cc +931 -678
- data/third_party/boringssl/ssl/tls13_both.cc +251 -121
- data/third_party/boringssl/ssl/tls13_client.cc +129 -73
- data/third_party/boringssl/ssl/tls13_enc.cc +350 -282
- data/third_party/boringssl/ssl/tls13_server.cc +259 -192
- data/third_party/boringssl/ssl/tls_method.cc +26 -21
- data/third_party/boringssl/ssl/tls_record.cc +42 -47
- data/third_party/boringssl/third_party/fiat/curve25519.c +261 -1324
- data/third_party/boringssl/third_party/fiat/curve25519_32.h +911 -0
- data/third_party/boringssl/third_party/fiat/curve25519_64.h +559 -0
- data/third_party/boringssl/third_party/fiat/p256.c +238 -999
- data/third_party/boringssl/third_party/fiat/p256_32.h +3226 -0
- data/third_party/boringssl/third_party/fiat/p256_64.h +1217 -0
- data/third_party/upb/upb/port_def.inc +1 -1
- data/third_party/upb/upb/table.c +2 -1
- metadata +72 -44
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +0 -127
- data/src/core/lib/gpr/mpscq.cc +0 -117
- data/src/core/lib/gpr/mpscq.h +0 -88
- data/src/core/lib/gprpp/abstract.h +0 -47
- data/src/core/lib/gprpp/pair.h +0 -38
- data/third_party/boringssl/crypto/cipher_extra/e_ssl3.c +0 -460
- data/third_party/boringssl/crypto/fipsmodule/modes/ccm.c +0 -256
- data/third_party/boringssl/include/openssl/lhash_macros.h +0 -174
- data/third_party/boringssl/ssl/custom_extensions.cc +0 -265
@@ -170,34 +170,10 @@
|
|
170
170
|
#include "../crypto/internal.h"
|
171
171
|
|
172
172
|
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
state_read_client_hello,
|
178
|
-
state_select_certificate,
|
179
|
-
state_tls13,
|
180
|
-
state_select_parameters,
|
181
|
-
state_send_server_hello,
|
182
|
-
state_send_server_certificate,
|
183
|
-
state_send_server_key_exchange,
|
184
|
-
state_send_server_hello_done,
|
185
|
-
state_read_client_certificate,
|
186
|
-
state_verify_client_certificate,
|
187
|
-
state_read_client_key_exchange,
|
188
|
-
state_read_client_certificate_verify,
|
189
|
-
state_read_change_cipher_spec,
|
190
|
-
state_process_change_cipher_spec,
|
191
|
-
state_read_next_proto,
|
192
|
-
state_read_channel_id,
|
193
|
-
state_read_client_finished,
|
194
|
-
state_send_server_finished,
|
195
|
-
state_finish_server_handshake,
|
196
|
-
state_done,
|
197
|
-
};
|
198
|
-
|
199
|
-
int ssl_client_cipher_list_contains_cipher(const SSL_CLIENT_HELLO *client_hello,
|
200
|
-
uint16_t id) {
|
173
|
+
BSSL_NAMESPACE_BEGIN
|
174
|
+
|
175
|
+
bool ssl_client_cipher_list_contains_cipher(
|
176
|
+
const SSL_CLIENT_HELLO *client_hello, uint16_t id) {
|
201
177
|
CBS cipher_suites;
|
202
178
|
CBS_init(&cipher_suites, client_hello->cipher_suites,
|
203
179
|
client_hello->cipher_suites_len);
|
@@ -205,19 +181,19 @@ int ssl_client_cipher_list_contains_cipher(const SSL_CLIENT_HELLO *client_hello,
|
|
205
181
|
while (CBS_len(&cipher_suites) > 0) {
|
206
182
|
uint16_t got_id;
|
207
183
|
if (!CBS_get_u16(&cipher_suites, &got_id)) {
|
208
|
-
return
|
184
|
+
return false;
|
209
185
|
}
|
210
186
|
|
211
187
|
if (got_id == id) {
|
212
|
-
return
|
188
|
+
return true;
|
213
189
|
}
|
214
190
|
}
|
215
191
|
|
216
|
-
return
|
192
|
+
return false;
|
217
193
|
}
|
218
194
|
|
219
|
-
static
|
220
|
-
|
195
|
+
static bool negotiate_version(SSL_HANDSHAKE *hs, uint8_t *out_alert,
|
196
|
+
const SSL_CLIENT_HELLO *client_hello) {
|
221
197
|
SSL *const ssl = hs->ssl;
|
222
198
|
assert(!ssl->s3->have_version);
|
223
199
|
CBS supported_versions, versions;
|
@@ -228,7 +204,7 @@ static int negotiate_version(SSL_HANDSHAKE *hs, uint8_t *out_alert,
|
|
228
204
|
CBS_len(&versions) == 0) {
|
229
205
|
OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
|
230
206
|
*out_alert = SSL_AD_DECODE_ERROR;
|
231
|
-
return
|
207
|
+
return false;
|
232
208
|
}
|
233
209
|
} else {
|
234
210
|
// Convert the ClientHello version to an equivalent supported_versions
|
@@ -237,7 +213,6 @@ static int negotiate_version(SSL_HANDSHAKE *hs, uint8_t *out_alert,
|
|
237
213
|
0x03, 0x03, // TLS 1.2
|
238
214
|
0x03, 0x02, // TLS 1.1
|
239
215
|
0x03, 0x01, // TLS 1
|
240
|
-
0x03, 0x00, // SSL 3
|
241
216
|
};
|
242
217
|
|
243
218
|
static const uint8_t kDTLSVersions[] = {
|
@@ -256,12 +231,10 @@ static int negotiate_version(SSL_HANDSHAKE *hs, uint8_t *out_alert,
|
|
256
231
|
versions_len);
|
257
232
|
} else {
|
258
233
|
if (client_hello->version >= TLS1_2_VERSION) {
|
259
|
-
versions_len = 8;
|
260
|
-
} else if (client_hello->version >= TLS1_1_VERSION) {
|
261
234
|
versions_len = 6;
|
262
|
-
} else if (client_hello->version >=
|
235
|
+
} else if (client_hello->version >= TLS1_1_VERSION) {
|
263
236
|
versions_len = 4;
|
264
|
-
} else if (client_hello->version >=
|
237
|
+
} else if (client_hello->version >= TLS1_VERSION) {
|
265
238
|
versions_len = 2;
|
266
239
|
}
|
267
240
|
CBS_init(&versions, kTLSVersions + sizeof(kTLSVersions) - versions_len,
|
@@ -270,7 +243,7 @@ static int negotiate_version(SSL_HANDSHAKE *hs, uint8_t *out_alert,
|
|
270
243
|
}
|
271
244
|
|
272
245
|
if (!ssl_negotiate_version(hs, out_alert, &ssl->version, &versions)) {
|
273
|
-
return
|
246
|
+
return false;
|
274
247
|
}
|
275
248
|
|
276
249
|
// At this point, the connection's version is known and |ssl->version| is
|
@@ -284,10 +257,10 @@ static int negotiate_version(SSL_HANDSHAKE *hs, uint8_t *out_alert,
|
|
284
257
|
ssl_protocol_version(ssl) < hs->max_version) {
|
285
258
|
OPENSSL_PUT_ERROR(SSL, SSL_R_INAPPROPRIATE_FALLBACK);
|
286
259
|
*out_alert = SSL3_AD_INAPPROPRIATE_FALLBACK;
|
287
|
-
return
|
260
|
+
return false;
|
288
261
|
}
|
289
262
|
|
290
|
-
return
|
263
|
+
return true;
|
291
264
|
}
|
292
265
|
|
293
266
|
static UniquePtr<STACK_OF(SSL_CIPHER)> ssl_parse_client_cipher_list(
|
@@ -327,11 +300,10 @@ static UniquePtr<STACK_OF(SSL_CIPHER)> ssl_parse_client_cipher_list(
|
|
327
300
|
static void ssl_get_compatible_server_ciphers(SSL_HANDSHAKE *hs,
|
328
301
|
uint32_t *out_mask_k,
|
329
302
|
uint32_t *out_mask_a) {
|
330
|
-
SSL *const ssl = hs->ssl;
|
331
303
|
uint32_t mask_k = 0;
|
332
304
|
uint32_t mask_a = 0;
|
333
305
|
|
334
|
-
if (ssl_has_certificate(
|
306
|
+
if (ssl_has_certificate(hs)) {
|
335
307
|
mask_a |= ssl_cipher_auth_mask_for_key(hs->local_pubkey.get());
|
336
308
|
if (EVP_PKEY_id(hs->local_pubkey.get()) == EVP_PKEY_RSA) {
|
337
309
|
mask_k |= SSL_kRSA;
|
@@ -345,7 +317,7 @@ static void ssl_get_compatible_server_ciphers(SSL_HANDSHAKE *hs,
|
|
345
317
|
}
|
346
318
|
|
347
319
|
// PSK requires a server callback.
|
348
|
-
if (
|
320
|
+
if (hs->config->psk_server_callback != NULL) {
|
349
321
|
mask_k |= SSL_kPSK;
|
350
322
|
mask_a |= SSL_aPSK;
|
351
323
|
}
|
@@ -356,14 +328,14 @@ static void ssl_get_compatible_server_ciphers(SSL_HANDSHAKE *hs,
|
|
356
328
|
|
357
329
|
static const SSL_CIPHER *ssl3_choose_cipher(
|
358
330
|
SSL_HANDSHAKE *hs, const SSL_CLIENT_HELLO *client_hello,
|
359
|
-
const
|
331
|
+
const SSLCipherPreferenceList *server_pref) {
|
360
332
|
SSL *const ssl = hs->ssl;
|
361
|
-
STACK_OF(SSL_CIPHER) *prio, *allow;
|
333
|
+
const STACK_OF(SSL_CIPHER) *prio, *allow;
|
362
334
|
// in_group_flags will either be NULL, or will point to an array of bytes
|
363
335
|
// which indicate equal-preference groups in the |prio| stack. See the
|
364
|
-
// comment about |in_group_flags| in the |
|
336
|
+
// comment about |in_group_flags| in the |SSLCipherPreferenceList|
|
365
337
|
// struct.
|
366
|
-
const
|
338
|
+
const bool *in_group_flags;
|
367
339
|
// group_min contains the minimal index so far found in a group, or -1 if no
|
368
340
|
// such value exists yet.
|
369
341
|
int group_min = -1;
|
@@ -375,13 +347,13 @@ static const SSL_CIPHER *ssl3_choose_cipher(
|
|
375
347
|
}
|
376
348
|
|
377
349
|
if (ssl->options & SSL_OP_CIPHER_SERVER_PREFERENCE) {
|
378
|
-
prio = server_pref->ciphers;
|
350
|
+
prio = server_pref->ciphers.get();
|
379
351
|
in_group_flags = server_pref->in_group_flags;
|
380
352
|
allow = client_pref.get();
|
381
353
|
} else {
|
382
354
|
prio = client_pref.get();
|
383
355
|
in_group_flags = NULL;
|
384
|
-
allow = server_pref->ciphers;
|
356
|
+
allow = server_pref->ciphers.get();
|
385
357
|
}
|
386
358
|
|
387
359
|
uint32_t mask_k, mask_a;
|
@@ -399,7 +371,7 @@ static const SSL_CIPHER *ssl3_choose_cipher(
|
|
399
371
|
(c->algorithm_auth & mask_a) &&
|
400
372
|
// Check the cipher is in the |allow| list.
|
401
373
|
sk_SSL_CIPHER_find(allow, &cipher_index, c)) {
|
402
|
-
if (in_group_flags != NULL && in_group_flags[i]
|
374
|
+
if (in_group_flags != NULL && in_group_flags[i]) {
|
403
375
|
// This element of |prio| is in a group. Update the minimum index found
|
404
376
|
// so far and continue looking.
|
405
377
|
if (group_min == -1 || (size_t)group_min > cipher_index) {
|
@@ -413,7 +385,7 @@ static const SSL_CIPHER *ssl3_choose_cipher(
|
|
413
385
|
}
|
414
386
|
}
|
415
387
|
|
416
|
-
if (in_group_flags != NULL && in_group_flags[i]
|
388
|
+
if (in_group_flags != NULL && !in_group_flags[i] && group_min != -1) {
|
417
389
|
// We are about to leave a group, but we found a match in it, so that's
|
418
390
|
// our answer.
|
419
391
|
return sk_SSL_CIPHER_value(allow, group_min);
|
@@ -425,10 +397,160 @@ static const SSL_CIPHER *ssl3_choose_cipher(
|
|
425
397
|
|
426
398
|
static enum ssl_hs_wait_t do_start_accept(SSL_HANDSHAKE *hs) {
|
427
399
|
ssl_do_info_callback(hs->ssl, SSL_CB_HANDSHAKE_START, 1);
|
428
|
-
hs->state =
|
400
|
+
hs->state = state12_read_client_hello;
|
429
401
|
return ssl_hs_ok;
|
430
402
|
}
|
431
403
|
|
404
|
+
// is_probably_jdk11_with_tls13 returns whether |client_hello| was probably sent
|
405
|
+
// from a JDK 11 client with both TLS 1.3 and a prior version enabled.
|
406
|
+
static bool is_probably_jdk11_with_tls13(const SSL_CLIENT_HELLO *client_hello) {
|
407
|
+
// JDK 11 ClientHellos contain a number of unusual properties which should
|
408
|
+
// limit false positives.
|
409
|
+
|
410
|
+
// JDK 11 does not support ChaCha20-Poly1305. This is unusual: many modern
|
411
|
+
// clients implement ChaCha20-Poly1305.
|
412
|
+
if (ssl_client_cipher_list_contains_cipher(
|
413
|
+
client_hello, TLS1_CK_CHACHA20_POLY1305_SHA256 & 0xffff)) {
|
414
|
+
return false;
|
415
|
+
}
|
416
|
+
|
417
|
+
// JDK 11 always sends extensions in a particular order.
|
418
|
+
constexpr uint16_t kMaxFragmentLength = 0x0001;
|
419
|
+
constexpr uint16_t kStatusRequestV2 = 0x0011;
|
420
|
+
static CONSTEXPR_ARRAY struct {
|
421
|
+
uint16_t id;
|
422
|
+
bool required;
|
423
|
+
} kJavaExtensions[] = {
|
424
|
+
{TLSEXT_TYPE_server_name, false},
|
425
|
+
{kMaxFragmentLength, false},
|
426
|
+
{TLSEXT_TYPE_status_request, false},
|
427
|
+
{TLSEXT_TYPE_supported_groups, true},
|
428
|
+
{TLSEXT_TYPE_ec_point_formats, false},
|
429
|
+
{TLSEXT_TYPE_signature_algorithms, true},
|
430
|
+
// Java always sends signature_algorithms_cert.
|
431
|
+
{TLSEXT_TYPE_signature_algorithms_cert, true},
|
432
|
+
{TLSEXT_TYPE_application_layer_protocol_negotiation, false},
|
433
|
+
{kStatusRequestV2, false},
|
434
|
+
{TLSEXT_TYPE_extended_master_secret, false},
|
435
|
+
{TLSEXT_TYPE_supported_versions, true},
|
436
|
+
{TLSEXT_TYPE_cookie, false},
|
437
|
+
{TLSEXT_TYPE_psk_key_exchange_modes, true},
|
438
|
+
{TLSEXT_TYPE_key_share, true},
|
439
|
+
{TLSEXT_TYPE_renegotiate, false},
|
440
|
+
{TLSEXT_TYPE_pre_shared_key, false},
|
441
|
+
};
|
442
|
+
Span<const uint8_t> sigalgs, sigalgs_cert;
|
443
|
+
bool has_status_request = false, has_status_request_v2 = false;
|
444
|
+
CBS extensions, supported_groups;
|
445
|
+
CBS_init(&extensions, client_hello->extensions, client_hello->extensions_len);
|
446
|
+
for (const auto &java_extension : kJavaExtensions) {
|
447
|
+
CBS copy = extensions;
|
448
|
+
uint16_t id;
|
449
|
+
if (CBS_get_u16(©, &id) && id == java_extension.id) {
|
450
|
+
// The next extension is the one we expected.
|
451
|
+
extensions = copy;
|
452
|
+
CBS body;
|
453
|
+
if (!CBS_get_u16_length_prefixed(&extensions, &body)) {
|
454
|
+
return false;
|
455
|
+
}
|
456
|
+
switch (id) {
|
457
|
+
case TLSEXT_TYPE_status_request:
|
458
|
+
has_status_request = true;
|
459
|
+
break;
|
460
|
+
case kStatusRequestV2:
|
461
|
+
has_status_request_v2 = true;
|
462
|
+
break;
|
463
|
+
case TLSEXT_TYPE_signature_algorithms:
|
464
|
+
sigalgs = body;
|
465
|
+
break;
|
466
|
+
case TLSEXT_TYPE_signature_algorithms_cert:
|
467
|
+
sigalgs_cert = body;
|
468
|
+
break;
|
469
|
+
case TLSEXT_TYPE_supported_groups:
|
470
|
+
supported_groups = body;
|
471
|
+
break;
|
472
|
+
}
|
473
|
+
} else if (java_extension.required) {
|
474
|
+
return false;
|
475
|
+
}
|
476
|
+
}
|
477
|
+
if (CBS_len(&extensions) != 0) {
|
478
|
+
return false;
|
479
|
+
}
|
480
|
+
|
481
|
+
// JDK 11 never advertises X25519. It is not offered by default, and
|
482
|
+
// -Djdk.tls.namedGroups=x25519 does not work. This is unusual: many modern
|
483
|
+
// clients implement X25519.
|
484
|
+
while (CBS_len(&supported_groups) > 0) {
|
485
|
+
uint16_t group;
|
486
|
+
if (!CBS_get_u16(&supported_groups, &group) ||
|
487
|
+
group == SSL_CURVE_X25519) {
|
488
|
+
return false;
|
489
|
+
}
|
490
|
+
}
|
491
|
+
|
492
|
+
if (// JDK 11 always sends the same contents in signature_algorithms and
|
493
|
+
// signature_algorithms_cert. This is unusual: signature_algorithms_cert,
|
494
|
+
// if omitted, is treated as if it were signature_algorithms.
|
495
|
+
sigalgs != sigalgs_cert ||
|
496
|
+
// When TLS 1.2 or below is enabled, JDK 11 sends status_request_v2 iff it
|
497
|
+
// sends status_request. This is unusual: status_request_v2 is not widely
|
498
|
+
// implemented.
|
499
|
+
has_status_request != has_status_request_v2) {
|
500
|
+
return false;
|
501
|
+
}
|
502
|
+
|
503
|
+
return true;
|
504
|
+
}
|
505
|
+
|
506
|
+
static bool extract_sni(SSL_HANDSHAKE *hs, uint8_t *out_alert,
|
507
|
+
const SSL_CLIENT_HELLO *client_hello) {
|
508
|
+
SSL *const ssl = hs->ssl;
|
509
|
+
CBS sni;
|
510
|
+
if (!ssl_client_hello_get_extension(client_hello, &sni,
|
511
|
+
TLSEXT_TYPE_server_name)) {
|
512
|
+
// No SNI extension to parse.
|
513
|
+
return true;
|
514
|
+
}
|
515
|
+
|
516
|
+
CBS server_name_list, host_name;
|
517
|
+
uint8_t name_type;
|
518
|
+
if (!CBS_get_u16_length_prefixed(&sni, &server_name_list) ||
|
519
|
+
!CBS_get_u8(&server_name_list, &name_type) ||
|
520
|
+
// Although the server_name extension was intended to be extensible to
|
521
|
+
// new name types and multiple names, OpenSSL 1.0.x had a bug which meant
|
522
|
+
// different name types will cause an error. Further, RFC 4366 originally
|
523
|
+
// defined syntax inextensibly. RFC 6066 corrected this mistake, but
|
524
|
+
// adding new name types is no longer feasible.
|
525
|
+
//
|
526
|
+
// Act as if the extensibility does not exist to simplify parsing.
|
527
|
+
!CBS_get_u16_length_prefixed(&server_name_list, &host_name) ||
|
528
|
+
CBS_len(&server_name_list) != 0 ||
|
529
|
+
CBS_len(&sni) != 0) {
|
530
|
+
*out_alert = SSL_AD_DECODE_ERROR;
|
531
|
+
return false;
|
532
|
+
}
|
533
|
+
|
534
|
+
if (name_type != TLSEXT_NAMETYPE_host_name ||
|
535
|
+
CBS_len(&host_name) == 0 ||
|
536
|
+
CBS_len(&host_name) > TLSEXT_MAXLEN_host_name ||
|
537
|
+
CBS_contains_zero_byte(&host_name)) {
|
538
|
+
*out_alert = SSL_AD_UNRECOGNIZED_NAME;
|
539
|
+
return false;
|
540
|
+
}
|
541
|
+
|
542
|
+
// Copy the hostname as a string.
|
543
|
+
char *raw = nullptr;
|
544
|
+
if (!CBS_strdup(&host_name, &raw)) {
|
545
|
+
*out_alert = SSL_AD_INTERNAL_ERROR;
|
546
|
+
return false;
|
547
|
+
}
|
548
|
+
ssl->s3->hostname.reset(raw);
|
549
|
+
|
550
|
+
hs->should_ack_sni = true;
|
551
|
+
return true;
|
552
|
+
}
|
553
|
+
|
432
554
|
static enum ssl_hs_wait_t do_read_client_hello(SSL_HANDSHAKE *hs) {
|
433
555
|
SSL *const ssl = hs->ssl;
|
434
556
|
|
@@ -441,10 +563,6 @@ static enum ssl_hs_wait_t do_read_client_hello(SSL_HANDSHAKE *hs) {
|
|
441
563
|
return ssl_hs_error;
|
442
564
|
}
|
443
565
|
|
444
|
-
if (ssl->handoff) {
|
445
|
-
return ssl_hs_handoff;
|
446
|
-
}
|
447
|
-
|
448
566
|
SSL_CLIENT_HELLO client_hello;
|
449
567
|
if (!ssl_client_hello_init(ssl, &client_hello, msg)) {
|
450
568
|
OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
|
@@ -452,6 +570,16 @@ static enum ssl_hs_wait_t do_read_client_hello(SSL_HANDSHAKE *hs) {
|
|
452
570
|
return ssl_hs_error;
|
453
571
|
}
|
454
572
|
|
573
|
+
if (hs->config->handoff) {
|
574
|
+
return ssl_hs_handoff;
|
575
|
+
}
|
576
|
+
|
577
|
+
uint8_t alert = SSL_AD_DECODE_ERROR;
|
578
|
+
if (!extract_sni(hs, &alert, &client_hello)) {
|
579
|
+
ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
|
580
|
+
return ssl_hs_error;
|
581
|
+
}
|
582
|
+
|
455
583
|
// Run the early callback.
|
456
584
|
if (ssl->ctx->select_certificate_cb != NULL) {
|
457
585
|
switch (ssl->ctx->select_certificate_cb(&client_hello)) {
|
@@ -470,11 +598,15 @@ static enum ssl_hs_wait_t do_read_client_hello(SSL_HANDSHAKE *hs) {
|
|
470
598
|
}
|
471
599
|
|
472
600
|
// Freeze the version range after the early callback.
|
473
|
-
if (!ssl_get_version_range(
|
601
|
+
if (!ssl_get_version_range(hs, &hs->min_version, &hs->max_version)) {
|
474
602
|
return ssl_hs_error;
|
475
603
|
}
|
476
604
|
|
477
|
-
|
605
|
+
if (hs->config->jdk11_workaround &&
|
606
|
+
is_probably_jdk11_with_tls13(&client_hello)) {
|
607
|
+
hs->apply_jdk11_workaround = true;
|
608
|
+
}
|
609
|
+
|
478
610
|
if (!negotiate_version(hs, &alert, &client_hello)) {
|
479
611
|
ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
|
480
612
|
return ssl_hs_error;
|
@@ -505,7 +637,7 @@ static enum ssl_hs_wait_t do_read_client_hello(SSL_HANDSHAKE *hs) {
|
|
505
637
|
return ssl_hs_error;
|
506
638
|
}
|
507
639
|
|
508
|
-
hs->state =
|
640
|
+
hs->state = state12_select_certificate;
|
509
641
|
return ssl_hs_ok;
|
510
642
|
}
|
511
643
|
|
@@ -518,8 +650,8 @@ static enum ssl_hs_wait_t do_select_certificate(SSL_HANDSHAKE *hs) {
|
|
518
650
|
}
|
519
651
|
|
520
652
|
// Call |cert_cb| to update server certificates if required.
|
521
|
-
if (
|
522
|
-
int rv =
|
653
|
+
if (hs->config->cert->cert_cb != NULL) {
|
654
|
+
int rv = hs->config->cert->cert_cb(ssl, hs->config->cert->cert_cb_arg);
|
523
655
|
if (rv == 0) {
|
524
656
|
OPENSSL_PUT_ERROR(SSL, SSL_R_CERT_CB_ERROR);
|
525
657
|
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
|
@@ -534,12 +666,30 @@ static enum ssl_hs_wait_t do_select_certificate(SSL_HANDSHAKE *hs) {
|
|
534
666
|
return ssl_hs_error;
|
535
667
|
}
|
536
668
|
|
669
|
+
if (hs->ocsp_stapling_requested &&
|
670
|
+
ssl->ctx->legacy_ocsp_callback != nullptr) {
|
671
|
+
switch (ssl->ctx->legacy_ocsp_callback(
|
672
|
+
ssl, ssl->ctx->legacy_ocsp_callback_arg)) {
|
673
|
+
case SSL_TLSEXT_ERR_OK:
|
674
|
+
break;
|
675
|
+
case SSL_TLSEXT_ERR_NOACK:
|
676
|
+
hs->ocsp_stapling_requested = false;
|
677
|
+
break;
|
678
|
+
default:
|
679
|
+
OPENSSL_PUT_ERROR(SSL, SSL_R_OCSP_CB_ERROR);
|
680
|
+
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
|
681
|
+
return ssl_hs_error;
|
682
|
+
}
|
683
|
+
}
|
684
|
+
|
537
685
|
if (ssl_protocol_version(ssl) >= TLS1_3_VERSION) {
|
538
686
|
// Jump to the TLS 1.3 state machine.
|
539
|
-
hs->state =
|
687
|
+
hs->state = state12_tls13;
|
540
688
|
return ssl_hs_ok;
|
541
689
|
}
|
542
690
|
|
691
|
+
ssl->s3->early_data_reason = ssl_early_data_protocol_version;
|
692
|
+
|
543
693
|
SSL_CLIENT_HELLO client_hello;
|
544
694
|
if (!ssl_client_hello_init(ssl, &client_hello, msg)) {
|
545
695
|
return ssl_hs_error;
|
@@ -547,22 +697,24 @@ static enum ssl_hs_wait_t do_select_certificate(SSL_HANDSHAKE *hs) {
|
|
547
697
|
|
548
698
|
// Negotiate the cipher suite. This must be done after |cert_cb| so the
|
549
699
|
// certificate is finalized.
|
550
|
-
hs->
|
551
|
-
|
700
|
+
SSLCipherPreferenceList *prefs = hs->config->cipher_list
|
701
|
+
? hs->config->cipher_list.get()
|
702
|
+
: ssl->ctx->cipher_list.get();
|
703
|
+
hs->new_cipher = ssl3_choose_cipher(hs, &client_hello, prefs);
|
552
704
|
if (hs->new_cipher == NULL) {
|
553
705
|
OPENSSL_PUT_ERROR(SSL, SSL_R_NO_SHARED_CIPHER);
|
554
706
|
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
|
555
707
|
return ssl_hs_error;
|
556
708
|
}
|
557
709
|
|
558
|
-
hs->state =
|
710
|
+
hs->state = state12_select_parameters;
|
559
711
|
return ssl_hs_ok;
|
560
712
|
}
|
561
713
|
|
562
714
|
static enum ssl_hs_wait_t do_tls13(SSL_HANDSHAKE *hs) {
|
563
715
|
enum ssl_hs_wait_t wait = tls13_server_handshake(hs);
|
564
716
|
if (wait == ssl_hs_ok) {
|
565
|
-
hs->state =
|
717
|
+
hs->state = state12_finish_server_handshake;
|
566
718
|
return ssl_hs_ok;
|
567
719
|
}
|
568
720
|
|
@@ -586,7 +738,7 @@ static enum ssl_hs_wait_t do_select_parameters(SSL_HANDSHAKE *hs) {
|
|
586
738
|
UniquePtr<SSL_SESSION> session;
|
587
739
|
bool tickets_supported = false, renew_ticket = false;
|
588
740
|
enum ssl_hs_wait_t wait = ssl_get_prev_session(
|
589
|
-
|
741
|
+
hs, &session, &tickets_supported, &renew_ticket, &client_hello);
|
590
742
|
if (wait != ssl_hs_ok) {
|
591
743
|
return wait;
|
592
744
|
}
|
@@ -611,7 +763,7 @@ static enum ssl_hs_wait_t do_select_parameters(SSL_HANDSHAKE *hs) {
|
|
611
763
|
if (session) {
|
612
764
|
// Use the old session.
|
613
765
|
hs->ticket_expected = renew_ticket;
|
614
|
-
ssl->session = session
|
766
|
+
ssl->session = std::move(session);
|
615
767
|
ssl->s3->session_reused = true;
|
616
768
|
} else {
|
617
769
|
hs->ticket_expected = tickets_supported;
|
@@ -638,10 +790,10 @@ static enum ssl_hs_wait_t do_select_parameters(SSL_HANDSHAKE *hs) {
|
|
638
790
|
hs->new_session->cipher = hs->new_cipher;
|
639
791
|
|
640
792
|
// Determine whether to request a client certificate.
|
641
|
-
hs->cert_request = !!(
|
793
|
+
hs->cert_request = !!(hs->config->verify_mode & SSL_VERIFY_PEER);
|
642
794
|
// Only request a certificate if Channel ID isn't negotiated.
|
643
|
-
if ((
|
644
|
-
ssl->s3->
|
795
|
+
if ((hs->config->verify_mode & SSL_VERIFY_PEER_IF_NO_OBC) &&
|
796
|
+
ssl->s3->channel_id_valid) {
|
645
797
|
hs->cert_request = false;
|
646
798
|
}
|
647
799
|
// CertificateRequest may only be sent in certificate-based ciphers.
|
@@ -672,25 +824,32 @@ static enum ssl_hs_wait_t do_select_parameters(SSL_HANDSHAKE *hs) {
|
|
672
824
|
return ssl_hs_error;
|
673
825
|
}
|
674
826
|
|
675
|
-
//
|
676
|
-
|
827
|
+
// Handback includes the whole handshake transcript, so we cannot free the
|
828
|
+
// transcript buffer in the handback case.
|
829
|
+
if (!hs->cert_request && !hs->handback) {
|
677
830
|
hs->transcript.FreeBuffer();
|
678
831
|
}
|
679
832
|
|
680
833
|
ssl->method->next_message(ssl);
|
681
834
|
|
682
|
-
hs->state =
|
835
|
+
hs->state = state12_send_server_hello;
|
683
836
|
return ssl_hs_ok;
|
684
837
|
}
|
685
838
|
|
839
|
+
static void copy_suffix(Span<uint8_t> out, Span<const uint8_t> in) {
|
840
|
+
out = out.subspan(out.size() - in.size());
|
841
|
+
assert(out.size() == in.size());
|
842
|
+
OPENSSL_memcpy(out.data(), in.data(), in.size());
|
843
|
+
}
|
844
|
+
|
686
845
|
static enum ssl_hs_wait_t do_send_server_hello(SSL_HANDSHAKE *hs) {
|
687
846
|
SSL *const ssl = hs->ssl;
|
688
847
|
|
689
848
|
// We only accept ChannelIDs on connections with ECDHE in order to avoid a
|
690
849
|
// known attack while we fix ChannelID itself.
|
691
|
-
if (ssl->s3->
|
850
|
+
if (ssl->s3->channel_id_valid &&
|
692
851
|
(hs->new_cipher->algorithm_mkey & SSL_kECDHE) == 0) {
|
693
|
-
ssl->s3->
|
852
|
+
ssl->s3->channel_id_valid = false;
|
694
853
|
}
|
695
854
|
|
696
855
|
// If this is a resumption and the original handshake didn't support
|
@@ -698,7 +857,7 @@ static enum ssl_hs_wait_t do_send_server_hello(SSL_HANDSHAKE *hs) {
|
|
698
857
|
// session and so cannot resume with ChannelIDs.
|
699
858
|
if (ssl->session != NULL &&
|
700
859
|
ssl->session->original_handshake_hash_len == 0) {
|
701
|
-
ssl->s3->
|
860
|
+
ssl->s3->channel_id_valid = false;
|
702
861
|
}
|
703
862
|
|
704
863
|
struct OPENSSL_timeval now;
|
@@ -711,20 +870,27 @@ static enum ssl_hs_wait_t do_send_server_hello(SSL_HANDSHAKE *hs) {
|
|
711
870
|
return ssl_hs_error;
|
712
871
|
}
|
713
872
|
|
714
|
-
// Implement the TLS 1.3 anti-downgrade feature
|
715
|
-
|
716
|
-
|
717
|
-
|
718
|
-
|
719
|
-
|
720
|
-
|
721
|
-
|
722
|
-
|
873
|
+
// Implement the TLS 1.3 anti-downgrade feature.
|
874
|
+
if (ssl_supports_version(hs, TLS1_3_VERSION)) {
|
875
|
+
if (ssl_protocol_version(ssl) == TLS1_2_VERSION) {
|
876
|
+
if (hs->apply_jdk11_workaround) {
|
877
|
+
// JDK 11 implements the TLS 1.3 downgrade signal, so we cannot send it
|
878
|
+
// here. However, the signal is only effective if all TLS 1.2
|
879
|
+
// ServerHellos produced by the server are marked. Thus we send a
|
880
|
+
// different non-standard signal for the time being, until JDK 11.0.2 is
|
881
|
+
// released and clients have updated.
|
882
|
+
copy_suffix(ssl->s3->server_random, kJDK11DowngradeRandom);
|
883
|
+
} else {
|
884
|
+
copy_suffix(ssl->s3->server_random, kTLS13DowngradeRandom);
|
885
|
+
}
|
886
|
+
} else {
|
887
|
+
copy_suffix(ssl->s3->server_random, kTLS12DowngradeRandom);
|
888
|
+
}
|
723
889
|
}
|
724
890
|
|
725
891
|
const SSL_SESSION *session = hs->new_session.get();
|
726
|
-
if (ssl->session !=
|
727
|
-
session = ssl->session;
|
892
|
+
if (ssl->session != nullptr) {
|
893
|
+
session = ssl->session.get();
|
728
894
|
}
|
729
895
|
|
730
896
|
ScopedCBB cbb;
|
@@ -744,9 +910,9 @@ static enum ssl_hs_wait_t do_send_server_hello(SSL_HANDSHAKE *hs) {
|
|
744
910
|
}
|
745
911
|
|
746
912
|
if (ssl->session != NULL) {
|
747
|
-
hs->state =
|
913
|
+
hs->state = state12_send_server_finished;
|
748
914
|
} else {
|
749
|
-
hs->state =
|
915
|
+
hs->state = state12_send_server_certificate;
|
750
916
|
}
|
751
917
|
return ssl_hs_ok;
|
752
918
|
}
|
@@ -756,12 +922,12 @@ static enum ssl_hs_wait_t do_send_server_certificate(SSL_HANDSHAKE *hs) {
|
|
756
922
|
ScopedCBB cbb;
|
757
923
|
|
758
924
|
if (ssl_cipher_uses_certificate_auth(hs->new_cipher)) {
|
759
|
-
if (!ssl_has_certificate(
|
925
|
+
if (!ssl_has_certificate(hs)) {
|
760
926
|
OPENSSL_PUT_ERROR(SSL, SSL_R_NO_CERTIFICATE_SET);
|
761
927
|
return ssl_hs_error;
|
762
928
|
}
|
763
929
|
|
764
|
-
if (!ssl_output_cert_chain(
|
930
|
+
if (!ssl_output_cert_chain(hs)) {
|
765
931
|
return ssl_hs_error;
|
766
932
|
}
|
767
933
|
|
@@ -771,9 +937,10 @@ static enum ssl_hs_wait_t do_send_server_certificate(SSL_HANDSHAKE *hs) {
|
|
771
937
|
SSL3_MT_CERTIFICATE_STATUS) ||
|
772
938
|
!CBB_add_u8(&body, TLSEXT_STATUSTYPE_ocsp) ||
|
773
939
|
!CBB_add_u24_length_prefixed(&body, &ocsp_response) ||
|
774
|
-
!CBB_add_bytes(
|
775
|
-
|
776
|
-
|
940
|
+
!CBB_add_bytes(
|
941
|
+
&ocsp_response,
|
942
|
+
CRYPTO_BUFFER_data(hs->config->cert->ocsp_response.get()),
|
943
|
+
CRYPTO_BUFFER_len(hs->config->cert->ocsp_response.get())) ||
|
777
944
|
!ssl_add_message_cbb(ssl, cbb.get())) {
|
778
945
|
OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
|
779
946
|
return ssl_hs_error;
|
@@ -785,8 +952,7 @@ static enum ssl_hs_wait_t do_send_server_certificate(SSL_HANDSHAKE *hs) {
|
|
785
952
|
uint32_t alg_k = hs->new_cipher->algorithm_mkey;
|
786
953
|
uint32_t alg_a = hs->new_cipher->algorithm_auth;
|
787
954
|
if (ssl_cipher_requires_server_key_exchange(hs->new_cipher) ||
|
788
|
-
((alg_a & SSL_aPSK) &&
|
789
|
-
|
955
|
+
((alg_a & SSL_aPSK) && hs->config->psk_identity_hint)) {
|
790
956
|
// Pre-allocate enough room to comfortably fit an ECDHE public key. Prepend
|
791
957
|
// the client and server randoms for the signing transcript.
|
792
958
|
CBB child;
|
@@ -798,10 +964,12 @@ static enum ssl_hs_wait_t do_send_server_certificate(SSL_HANDSHAKE *hs) {
|
|
798
964
|
|
799
965
|
// PSK ciphers begin with an identity hint.
|
800
966
|
if (alg_a & SSL_aPSK) {
|
801
|
-
size_t len =
|
802
|
-
|
967
|
+
size_t len = hs->config->psk_identity_hint == nullptr
|
968
|
+
? 0
|
969
|
+
: strlen(hs->config->psk_identity_hint.get());
|
803
970
|
if (!CBB_add_u16_length_prefixed(cbb.get(), &child) ||
|
804
|
-
!CBB_add_bytes(&child,
|
971
|
+
!CBB_add_bytes(&child,
|
972
|
+
(const uint8_t *)hs->config->psk_identity_hint.get(),
|
805
973
|
len)) {
|
806
974
|
return ssl_hs_error;
|
807
975
|
}
|
@@ -818,12 +986,12 @@ static enum ssl_hs_wait_t do_send_server_certificate(SSL_HANDSHAKE *hs) {
|
|
818
986
|
hs->new_session->group_id = group_id;
|
819
987
|
|
820
988
|
// Set up ECDH, generate a key, and emit the public half.
|
821
|
-
hs->
|
822
|
-
if (!hs->
|
989
|
+
hs->key_shares[0] = SSLKeyShare::Create(group_id);
|
990
|
+
if (!hs->key_shares[0] ||
|
823
991
|
!CBB_add_u8(cbb.get(), NAMED_CURVE_TYPE) ||
|
824
992
|
!CBB_add_u16(cbb.get(), group_id) ||
|
825
993
|
!CBB_add_u8_length_prefixed(cbb.get(), &child) ||
|
826
|
-
!hs->
|
994
|
+
!hs->key_shares[0]->Offer(&child)) {
|
827
995
|
return ssl_hs_error;
|
828
996
|
}
|
829
997
|
} else {
|
@@ -835,7 +1003,7 @@ static enum ssl_hs_wait_t do_send_server_certificate(SSL_HANDSHAKE *hs) {
|
|
835
1003
|
}
|
836
1004
|
}
|
837
1005
|
|
838
|
-
hs->state =
|
1006
|
+
hs->state = state12_send_server_key_exchange;
|
839
1007
|
return ssl_hs_ok;
|
840
1008
|
}
|
841
1009
|
|
@@ -843,7 +1011,7 @@ static enum ssl_hs_wait_t do_send_server_key_exchange(SSL_HANDSHAKE *hs) {
|
|
843
1011
|
SSL *const ssl = hs->ssl;
|
844
1012
|
|
845
1013
|
if (hs->server_params.size() == 0) {
|
846
|
-
hs->state =
|
1014
|
+
hs->state = state12_send_server_hello_done;
|
847
1015
|
return ssl_hs_ok;
|
848
1016
|
}
|
849
1017
|
|
@@ -860,7 +1028,7 @@ static enum ssl_hs_wait_t do_send_server_key_exchange(SSL_HANDSHAKE *hs) {
|
|
860
1028
|
|
861
1029
|
// Add a signature.
|
862
1030
|
if (ssl_cipher_uses_certificate_auth(hs->new_cipher)) {
|
863
|
-
if (!ssl_has_private_key(
|
1031
|
+
if (!ssl_has_private_key(hs)) {
|
864
1032
|
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
|
865
1033
|
return ssl_hs_error;
|
866
1034
|
}
|
@@ -868,6 +1036,7 @@ static enum ssl_hs_wait_t do_send_server_key_exchange(SSL_HANDSHAKE *hs) {
|
|
868
1036
|
// Determine the signature algorithm.
|
869
1037
|
uint16_t signature_algorithm;
|
870
1038
|
if (!tls1_choose_signature_algorithm(hs, &signature_algorithm)) {
|
1039
|
+
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
|
871
1040
|
return ssl_hs_error;
|
872
1041
|
}
|
873
1042
|
if (ssl_protocol_version(ssl) >= TLS1_2_VERSION) {
|
@@ -907,7 +1076,7 @@ static enum ssl_hs_wait_t do_send_server_key_exchange(SSL_HANDSHAKE *hs) {
|
|
907
1076
|
|
908
1077
|
hs->server_params.Reset();
|
909
1078
|
|
910
|
-
hs->state =
|
1079
|
+
hs->state = state12_send_server_hello_done;
|
911
1080
|
return ssl_hs_ok;
|
912
1081
|
}
|
913
1082
|
|
@@ -923,12 +1092,14 @@ static enum ssl_hs_wait_t do_send_server_hello_done(SSL_HANDSHAKE *hs) {
|
|
923
1092
|
SSL3_MT_CERTIFICATE_REQUEST) ||
|
924
1093
|
!CBB_add_u8_length_prefixed(&body, &cert_types) ||
|
925
1094
|
!CBB_add_u8(&cert_types, SSL3_CT_RSA_SIGN) ||
|
926
|
-
(
|
927
|
-
|
1095
|
+
!CBB_add_u8(&cert_types, TLS_CT_ECDSA_SIGN) ||
|
1096
|
+
// TLS 1.2 has no way to specify different signature algorithms for
|
1097
|
+
// certificates and the online signature, so emit the more restrictive
|
1098
|
+
// certificate list.
|
928
1099
|
(ssl_protocol_version(ssl) >= TLS1_2_VERSION &&
|
929
1100
|
(!CBB_add_u16_length_prefixed(&body, &sigalgs_cbb) ||
|
930
|
-
!tls12_add_verify_sigalgs(ssl, &sigalgs_cbb))) ||
|
931
|
-
!ssl_add_client_CA_list(
|
1101
|
+
!tls12_add_verify_sigalgs(ssl, &sigalgs_cbb, true /* certs */))) ||
|
1102
|
+
!ssl_add_client_CA_list(hs, &body) ||
|
932
1103
|
!ssl_add_message_cbb(ssl, cbb.get())) {
|
933
1104
|
OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
|
934
1105
|
return ssl_hs_error;
|
@@ -942,15 +1113,18 @@ static enum ssl_hs_wait_t do_send_server_hello_done(SSL_HANDSHAKE *hs) {
|
|
942
1113
|
return ssl_hs_error;
|
943
1114
|
}
|
944
1115
|
|
945
|
-
hs->state =
|
1116
|
+
hs->state = state12_read_client_certificate;
|
946
1117
|
return ssl_hs_flush;
|
947
1118
|
}
|
948
1119
|
|
949
1120
|
static enum ssl_hs_wait_t do_read_client_certificate(SSL_HANDSHAKE *hs) {
|
950
1121
|
SSL *const ssl = hs->ssl;
|
951
1122
|
|
1123
|
+
if (hs->handback && hs->new_cipher->algorithm_mkey == SSL_kECDHE) {
|
1124
|
+
return ssl_hs_handback;
|
1125
|
+
}
|
952
1126
|
if (!hs->cert_request) {
|
953
|
-
hs->state =
|
1127
|
+
hs->state = state12_verify_client_certificate;
|
954
1128
|
return ssl_hs_ok;
|
955
1129
|
}
|
956
1130
|
|
@@ -959,26 +1133,7 @@ static enum ssl_hs_wait_t do_read_client_certificate(SSL_HANDSHAKE *hs) {
|
|
959
1133
|
return ssl_hs_read_message;
|
960
1134
|
}
|
961
1135
|
|
962
|
-
if (msg
|
963
|
-
if (ssl->version == SSL3_VERSION &&
|
964
|
-
msg.type == SSL3_MT_CLIENT_KEY_EXCHANGE) {
|
965
|
-
// In SSL 3.0, the Certificate message is omitted to signal no
|
966
|
-
// certificate.
|
967
|
-
if (ssl->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT) {
|
968
|
-
OPENSSL_PUT_ERROR(SSL, SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
|
969
|
-
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
|
970
|
-
return ssl_hs_error;
|
971
|
-
}
|
972
|
-
|
973
|
-
// OpenSSL returns X509_V_OK when no certificates are received. This is
|
974
|
-
// classed by them as a bug, but it's assumed by at least NGINX.
|
975
|
-
hs->new_session->verify_result = X509_V_OK;
|
976
|
-
hs->state = state_verify_client_certificate;
|
977
|
-
return ssl_hs_ok;
|
978
|
-
}
|
979
|
-
|
980
|
-
OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_MESSAGE);
|
981
|
-
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
|
1136
|
+
if (!ssl_check_message_type(ssl, msg, SSL3_MT_CERTIFICATE)) {
|
982
1137
|
return ssl_hs_error;
|
983
1138
|
}
|
984
1139
|
|
@@ -988,17 +1143,14 @@ static enum ssl_hs_wait_t do_read_client_certificate(SSL_HANDSHAKE *hs) {
|
|
988
1143
|
|
989
1144
|
CBS certificate_msg = msg.body;
|
990
1145
|
uint8_t alert = SSL_AD_DECODE_ERROR;
|
991
|
-
|
992
|
-
|
993
|
-
ssl->retain_only_sha256_of_client_certs
|
1146
|
+
if (!ssl_parse_cert_chain(&alert, &hs->new_session->certs, &hs->peer_pubkey,
|
1147
|
+
hs->config->retain_only_sha256_of_client_certs
|
994
1148
|
? hs->new_session->peer_sha256
|
995
|
-
:
|
1149
|
+
: nullptr,
|
996
1150
|
&certificate_msg, ssl->ctx->pool)) {
|
997
1151
|
ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
|
998
1152
|
return ssl_hs_error;
|
999
1153
|
}
|
1000
|
-
sk_CRYPTO_BUFFER_pop_free(hs->new_session->certs, CRYPTO_BUFFER_free);
|
1001
|
-
hs->new_session->certs = chain.release();
|
1002
1154
|
|
1003
1155
|
if (CBS_len(&certificate_msg) != 0 ||
|
1004
1156
|
!ssl->ctx->x509_method->session_cache_objects(hs->new_session.get())) {
|
@@ -1007,19 +1159,11 @@ static enum ssl_hs_wait_t do_read_client_certificate(SSL_HANDSHAKE *hs) {
|
|
1007
1159
|
return ssl_hs_error;
|
1008
1160
|
}
|
1009
1161
|
|
1010
|
-
if (sk_CRYPTO_BUFFER_num(hs->new_session->certs) == 0) {
|
1162
|
+
if (sk_CRYPTO_BUFFER_num(hs->new_session->certs.get()) == 0) {
|
1011
1163
|
// No client certificate so the handshake buffer may be discarded.
|
1012
1164
|
hs->transcript.FreeBuffer();
|
1013
1165
|
|
1014
|
-
|
1015
|
-
// Certificate message.
|
1016
|
-
if (ssl->version == SSL3_VERSION) {
|
1017
|
-
OPENSSL_PUT_ERROR(SSL, SSL_R_NO_CERTIFICATES_RETURNED);
|
1018
|
-
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
|
1019
|
-
return ssl_hs_error;
|
1020
|
-
}
|
1021
|
-
|
1022
|
-
if (ssl->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT) {
|
1166
|
+
if (hs->config->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT) {
|
1023
1167
|
// Fail for TLS only if we required a certificate
|
1024
1168
|
OPENSSL_PUT_ERROR(SSL, SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
|
1025
1169
|
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
|
@@ -1029,18 +1173,18 @@ static enum ssl_hs_wait_t do_read_client_certificate(SSL_HANDSHAKE *hs) {
|
|
1029
1173
|
// OpenSSL returns X509_V_OK when no certificates are received. This is
|
1030
1174
|
// classed by them as a bug, but it's assumed by at least NGINX.
|
1031
1175
|
hs->new_session->verify_result = X509_V_OK;
|
1032
|
-
} else if (
|
1176
|
+
} else if (hs->config->retain_only_sha256_of_client_certs) {
|
1033
1177
|
// The hash will have been filled in.
|
1034
1178
|
hs->new_session->peer_sha256_valid = 1;
|
1035
1179
|
}
|
1036
1180
|
|
1037
1181
|
ssl->method->next_message(ssl);
|
1038
|
-
hs->state =
|
1182
|
+
hs->state = state12_verify_client_certificate;
|
1039
1183
|
return ssl_hs_ok;
|
1040
1184
|
}
|
1041
1185
|
|
1042
1186
|
static enum ssl_hs_wait_t do_verify_client_certificate(SSL_HANDSHAKE *hs) {
|
1043
|
-
if (sk_CRYPTO_BUFFER_num(hs->new_session->certs) > 0) {
|
1187
|
+
if (sk_CRYPTO_BUFFER_num(hs->new_session->certs.get()) > 0) {
|
1044
1188
|
switch (ssl_verify_peer_cert(hs)) {
|
1045
1189
|
case ssl_verify_ok:
|
1046
1190
|
break;
|
@@ -1051,7 +1195,7 @@ static enum ssl_hs_wait_t do_verify_client_certificate(SSL_HANDSHAKE *hs) {
|
|
1051
1195
|
}
|
1052
1196
|
}
|
1053
1197
|
|
1054
|
-
hs->state =
|
1198
|
+
hs->state = state12_read_client_key_exchange;
|
1055
1199
|
return ssl_hs_ok;
|
1056
1200
|
}
|
1057
1201
|
|
@@ -1089,28 +1233,25 @@ static enum ssl_hs_wait_t do_read_client_key_exchange(SSL_HANDSHAKE *hs) {
|
|
1089
1233
|
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
|
1090
1234
|
return ssl_hs_error;
|
1091
1235
|
}
|
1092
|
-
|
1093
|
-
if (!CBS_strdup(&psk_identity, &
|
1236
|
+
char *raw = nullptr;
|
1237
|
+
if (!CBS_strdup(&psk_identity, &raw)) {
|
1094
1238
|
OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
|
1095
1239
|
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
|
1096
1240
|
return ssl_hs_error;
|
1097
1241
|
}
|
1242
|
+
hs->new_session->psk_identity.reset(raw);
|
1098
1243
|
}
|
1099
1244
|
|
1100
1245
|
// Depending on the key exchange method, compute |premaster_secret|.
|
1101
1246
|
Array<uint8_t> premaster_secret;
|
1102
1247
|
if (alg_k & SSL_kRSA) {
|
1103
1248
|
CBS encrypted_premaster_secret;
|
1104
|
-
if (
|
1105
|
-
|
1106
|
-
|
1107
|
-
|
1108
|
-
|
1109
|
-
|
1110
|
-
return ssl_hs_error;
|
1111
|
-
}
|
1112
|
-
} else {
|
1113
|
-
encrypted_premaster_secret = client_key_exchange;
|
1249
|
+
if (!CBS_get_u16_length_prefixed(&client_key_exchange,
|
1250
|
+
&encrypted_premaster_secret) ||
|
1251
|
+
CBS_len(&client_key_exchange) != 0) {
|
1252
|
+
OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
|
1253
|
+
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
|
1254
|
+
return ssl_hs_error;
|
1114
1255
|
}
|
1115
1256
|
|
1116
1257
|
// Allocate a buffer large enough for an RSA decryption.
|
@@ -1139,6 +1280,8 @@ static enum ssl_hs_wait_t do_read_client_key_exchange(SSL_HANDSHAKE *hs) {
|
|
1139
1280
|
return ssl_hs_error;
|
1140
1281
|
}
|
1141
1282
|
|
1283
|
+
CONSTTIME_SECRET(decrypt_buf.data(), decrypt_len);
|
1284
|
+
|
1142
1285
|
// Prepare a random premaster, to be used on invalid padding. See RFC 5246,
|
1143
1286
|
// section 7.4.7.1.
|
1144
1287
|
if (!premaster_secret.Init(SSL_MAX_MASTER_KEY_LENGTH) ||
|
@@ -1188,13 +1331,14 @@ static enum ssl_hs_wait_t do_read_client_key_exchange(SSL_HANDSHAKE *hs) {
|
|
1188
1331
|
|
1189
1332
|
// Compute the premaster.
|
1190
1333
|
uint8_t alert = SSL_AD_DECODE_ERROR;
|
1191
|
-
if (!hs->
|
1334
|
+
if (!hs->key_shares[0]->Finish(&premaster_secret, &alert, peer_key)) {
|
1192
1335
|
ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
|
1193
1336
|
return ssl_hs_error;
|
1194
1337
|
}
|
1195
1338
|
|
1196
1339
|
// The key exchange state may now be discarded.
|
1197
|
-
hs->
|
1340
|
+
hs->key_shares[0].reset();
|
1341
|
+
hs->key_shares[1].reset();
|
1198
1342
|
} else if (!(alg_k & SSL_kPSK)) {
|
1199
1343
|
OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
|
1200
1344
|
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
|
@@ -1204,7 +1348,7 @@ static enum ssl_hs_wait_t do_read_client_key_exchange(SSL_HANDSHAKE *hs) {
|
|
1204
1348
|
// For a PSK cipher suite, the actual pre-master secret is combined with the
|
1205
1349
|
// pre-shared key.
|
1206
1350
|
if (alg_a & SSL_aPSK) {
|
1207
|
-
if (
|
1351
|
+
if (hs->config->psk_server_callback == NULL) {
|
1208
1352
|
OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
|
1209
1353
|
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
|
1210
1354
|
return ssl_hs_error;
|
@@ -1212,8 +1356,8 @@ static enum ssl_hs_wait_t do_read_client_key_exchange(SSL_HANDSHAKE *hs) {
|
|
1212
1356
|
|
1213
1357
|
// Look up the key for the identity.
|
1214
1358
|
uint8_t psk[PSK_MAX_PSK_LEN];
|
1215
|
-
unsigned psk_len =
|
1216
|
-
ssl, hs->new_session->psk_identity, psk, sizeof(psk));
|
1359
|
+
unsigned psk_len = hs->config->psk_server_callback(
|
1360
|
+
ssl, hs->new_session->psk_identity.get(), psk, sizeof(psk));
|
1217
1361
|
if (psk_len > PSK_MAX_PSK_LEN) {
|
1218
1362
|
OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
|
1219
1363
|
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
|
@@ -1260,9 +1404,11 @@ static enum ssl_hs_wait_t do_read_client_key_exchange(SSL_HANDSHAKE *hs) {
|
|
1260
1404
|
return ssl_hs_error;
|
1261
1405
|
}
|
1262
1406
|
hs->new_session->extended_master_secret = hs->extended_master_secret;
|
1407
|
+
CONSTTIME_DECLASSIFY(hs->new_session->master_key,
|
1408
|
+
hs->new_session->master_key_length);
|
1263
1409
|
|
1264
1410
|
ssl->method->next_message(ssl);
|
1265
|
-
hs->state =
|
1411
|
+
hs->state = state12_read_client_certificate_verify;
|
1266
1412
|
return ssl_hs_ok;
|
1267
1413
|
}
|
1268
1414
|
|
@@ -1273,7 +1419,7 @@ static enum ssl_hs_wait_t do_read_client_certificate_verify(SSL_HANDSHAKE *hs) {
|
|
1273
1419
|
// CertificateVerify is required if and only if there's a client certificate.
|
1274
1420
|
if (!hs->peer_pubkey) {
|
1275
1421
|
hs->transcript.FreeBuffer();
|
1276
|
-
hs->state =
|
1422
|
+
hs->state = state12_read_change_cipher_spec;
|
1277
1423
|
return ssl_hs_ok;
|
1278
1424
|
}
|
1279
1425
|
|
@@ -1317,34 +1463,8 @@ static enum ssl_hs_wait_t do_read_client_certificate_verify(SSL_HANDSHAKE *hs) {
|
|
1317
1463
|
return ssl_hs_error;
|
1318
1464
|
}
|
1319
1465
|
|
1320
|
-
|
1321
|
-
|
1322
|
-
// single final digest and signature, and must be special-cased.
|
1323
|
-
if (ssl_protocol_version(ssl) == SSL3_VERSION) {
|
1324
|
-
uint8_t digest[EVP_MAX_MD_SIZE];
|
1325
|
-
size_t digest_len;
|
1326
|
-
if (!hs->transcript.GetSSL3CertVerifyHash(
|
1327
|
-
digest, &digest_len, hs->new_session.get(), signature_algorithm)) {
|
1328
|
-
return ssl_hs_error;
|
1329
|
-
}
|
1330
|
-
|
1331
|
-
UniquePtr<EVP_PKEY_CTX> pctx(
|
1332
|
-
EVP_PKEY_CTX_new(hs->peer_pubkey.get(), nullptr));
|
1333
|
-
sig_ok = pctx &&
|
1334
|
-
EVP_PKEY_verify_init(pctx.get()) &&
|
1335
|
-
EVP_PKEY_verify(pctx.get(), CBS_data(&signature),
|
1336
|
-
CBS_len(&signature), digest, digest_len);
|
1337
|
-
} else {
|
1338
|
-
sig_ok =
|
1339
|
-
ssl_public_key_verify(ssl, signature, signature_algorithm,
|
1340
|
-
hs->peer_pubkey.get(), hs->transcript.buffer());
|
1341
|
-
}
|
1342
|
-
|
1343
|
-
#if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
|
1344
|
-
sig_ok = true;
|
1345
|
-
ERR_clear_error();
|
1346
|
-
#endif
|
1347
|
-
if (!sig_ok) {
|
1466
|
+
if (!ssl_public_key_verify(ssl, signature, signature_algorithm,
|
1467
|
+
hs->peer_pubkey.get(), hs->transcript.buffer())) {
|
1348
1468
|
OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_SIGNATURE);
|
1349
1469
|
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECRYPT_ERROR);
|
1350
1470
|
return ssl_hs_error;
|
@@ -1358,12 +1478,15 @@ static enum ssl_hs_wait_t do_read_client_certificate_verify(SSL_HANDSHAKE *hs) {
|
|
1358
1478
|
}
|
1359
1479
|
|
1360
1480
|
ssl->method->next_message(ssl);
|
1361
|
-
hs->state =
|
1481
|
+
hs->state = state12_read_change_cipher_spec;
|
1362
1482
|
return ssl_hs_ok;
|
1363
1483
|
}
|
1364
1484
|
|
1365
1485
|
static enum ssl_hs_wait_t do_read_change_cipher_spec(SSL_HANDSHAKE *hs) {
|
1366
|
-
hs->
|
1486
|
+
if (hs->handback && hs->ssl->session != NULL) {
|
1487
|
+
return ssl_hs_handback;
|
1488
|
+
}
|
1489
|
+
hs->state = state12_process_change_cipher_spec;
|
1367
1490
|
return ssl_hs_read_change_cipher_spec;
|
1368
1491
|
}
|
1369
1492
|
|
@@ -1372,7 +1495,7 @@ static enum ssl_hs_wait_t do_process_change_cipher_spec(SSL_HANDSHAKE *hs) {
|
|
1372
1495
|
return ssl_hs_error;
|
1373
1496
|
}
|
1374
1497
|
|
1375
|
-
hs->state =
|
1498
|
+
hs->state = state12_read_next_proto;
|
1376
1499
|
return ssl_hs_ok;
|
1377
1500
|
}
|
1378
1501
|
|
@@ -1380,7 +1503,7 @@ static enum ssl_hs_wait_t do_read_next_proto(SSL_HANDSHAKE *hs) {
|
|
1380
1503
|
SSL *const ssl = hs->ssl;
|
1381
1504
|
|
1382
1505
|
if (!hs->next_proto_neg_seen) {
|
1383
|
-
hs->state =
|
1506
|
+
hs->state = state12_read_channel_id;
|
1384
1507
|
return ssl_hs_ok;
|
1385
1508
|
}
|
1386
1509
|
|
@@ -1408,15 +1531,15 @@ static enum ssl_hs_wait_t do_read_next_proto(SSL_HANDSHAKE *hs) {
|
|
1408
1531
|
}
|
1409
1532
|
|
1410
1533
|
ssl->method->next_message(ssl);
|
1411
|
-
hs->state =
|
1534
|
+
hs->state = state12_read_channel_id;
|
1412
1535
|
return ssl_hs_ok;
|
1413
1536
|
}
|
1414
1537
|
|
1415
1538
|
static enum ssl_hs_wait_t do_read_channel_id(SSL_HANDSHAKE *hs) {
|
1416
1539
|
SSL *const ssl = hs->ssl;
|
1417
1540
|
|
1418
|
-
if (!ssl->s3->
|
1419
|
-
hs->state =
|
1541
|
+
if (!ssl->s3->channel_id_valid) {
|
1542
|
+
hs->state = state12_read_client_finished;
|
1420
1543
|
return ssl_hs_ok;
|
1421
1544
|
}
|
1422
1545
|
|
@@ -1432,7 +1555,7 @@ static enum ssl_hs_wait_t do_read_channel_id(SSL_HANDSHAKE *hs) {
|
|
1432
1555
|
}
|
1433
1556
|
|
1434
1557
|
ssl->method->next_message(ssl);
|
1435
|
-
hs->state =
|
1558
|
+
hs->state = state12_read_client_finished;
|
1436
1559
|
return ssl_hs_ok;
|
1437
1560
|
}
|
1438
1561
|
|
@@ -1444,15 +1567,15 @@ static enum ssl_hs_wait_t do_read_client_finished(SSL_HANDSHAKE *hs) {
|
|
1444
1567
|
}
|
1445
1568
|
|
1446
1569
|
if (ssl->session != NULL) {
|
1447
|
-
hs->state =
|
1570
|
+
hs->state = state12_finish_server_handshake;
|
1448
1571
|
} else {
|
1449
|
-
hs->state =
|
1572
|
+
hs->state = state12_send_server_finished;
|
1450
1573
|
}
|
1451
1574
|
|
1452
1575
|
// If this is a full handshake with ChannelID then record the handshake
|
1453
1576
|
// hashes in |hs->new_session| in case we need them to verify a
|
1454
1577
|
// ChannelID signature on a resumption of this session in the future.
|
1455
|
-
if (ssl->session == NULL && ssl->s3->
|
1578
|
+
if (ssl->session == NULL && ssl->s3->channel_id_valid &&
|
1456
1579
|
!tls1_record_handshake_hashes_for_channel_id(hs)) {
|
1457
1580
|
return ssl_hs_error;
|
1458
1581
|
}
|
@@ -1473,7 +1596,8 @@ static enum ssl_hs_wait_t do_send_server_finished(SSL_HANDSHAKE *hs) {
|
|
1473
1596
|
} else {
|
1474
1597
|
// We are renewing an existing session. Duplicate the session to adjust
|
1475
1598
|
// the timeout.
|
1476
|
-
session_copy =
|
1599
|
+
session_copy =
|
1600
|
+
SSL_SESSION_dup(ssl->session.get(), SSL_SESSION_INCLUDE_NONAUTH);
|
1477
1601
|
if (!session_copy) {
|
1478
1602
|
return ssl_hs_error;
|
1479
1603
|
}
|
@@ -1488,7 +1612,7 @@ static enum ssl_hs_wait_t do_send_server_finished(SSL_HANDSHAKE *hs) {
|
|
1488
1612
|
SSL3_MT_NEW_SESSION_TICKET) ||
|
1489
1613
|
!CBB_add_u32(&body, session->timeout) ||
|
1490
1614
|
!CBB_add_u16_length_prefixed(&body, &ticket) ||
|
1491
|
-
!ssl_encrypt_ticket(
|
1615
|
+
!ssl_encrypt_ticket(hs, &ticket, session) ||
|
1492
1616
|
!ssl_add_message_cbb(ssl, cbb.get())) {
|
1493
1617
|
return ssl_hs_error;
|
1494
1618
|
}
|
@@ -1501,9 +1625,9 @@ static enum ssl_hs_wait_t do_send_server_finished(SSL_HANDSHAKE *hs) {
|
|
1501
1625
|
}
|
1502
1626
|
|
1503
1627
|
if (ssl->session != NULL) {
|
1504
|
-
hs->state =
|
1628
|
+
hs->state = state12_read_change_cipher_spec;
|
1505
1629
|
} else {
|
1506
|
-
hs->state =
|
1630
|
+
hs->state = state12_finish_server_handshake;
|
1507
1631
|
}
|
1508
1632
|
return ssl_hs_flush;
|
1509
1633
|
}
|
@@ -1511,98 +1635,101 @@ static enum ssl_hs_wait_t do_send_server_finished(SSL_HANDSHAKE *hs) {
|
|
1511
1635
|
static enum ssl_hs_wait_t do_finish_server_handshake(SSL_HANDSHAKE *hs) {
|
1512
1636
|
SSL *const ssl = hs->ssl;
|
1513
1637
|
|
1638
|
+
if (hs->handback) {
|
1639
|
+
return ssl_hs_handback;
|
1640
|
+
}
|
1641
|
+
|
1514
1642
|
ssl->method->on_handshake_complete(ssl);
|
1515
1643
|
|
1516
1644
|
// If we aren't retaining peer certificates then we can discard it now.
|
1517
|
-
if (hs->new_session != NULL &&
|
1518
|
-
|
1519
|
-
hs->new_session->certs
|
1645
|
+
if (hs->new_session != NULL &&
|
1646
|
+
hs->config->retain_only_sha256_of_client_certs) {
|
1647
|
+
hs->new_session->certs.reset();
|
1520
1648
|
ssl->ctx->x509_method->session_clear(hs->new_session.get());
|
1521
1649
|
}
|
1522
1650
|
|
1523
1651
|
if (ssl->session != NULL) {
|
1524
|
-
|
1525
|
-
ssl->s3->established_session.reset(ssl->session);
|
1652
|
+
ssl->s3->established_session = UpRef(ssl->session);
|
1526
1653
|
} else {
|
1527
1654
|
ssl->s3->established_session = std::move(hs->new_session);
|
1528
|
-
ssl->s3->established_session->not_resumable =
|
1655
|
+
ssl->s3->established_session->not_resumable = false;
|
1529
1656
|
}
|
1530
1657
|
|
1531
1658
|
hs->handshake_finalized = true;
|
1532
1659
|
ssl->s3->initial_handshake_complete = true;
|
1533
1660
|
ssl_update_cache(hs, SSL_SESS_CACHE_SERVER);
|
1534
1661
|
|
1535
|
-
hs->state =
|
1662
|
+
hs->state = state12_done;
|
1536
1663
|
return ssl_hs_ok;
|
1537
1664
|
}
|
1538
1665
|
|
1539
1666
|
enum ssl_hs_wait_t ssl_server_handshake(SSL_HANDSHAKE *hs) {
|
1540
|
-
while (hs->state !=
|
1667
|
+
while (hs->state != state12_done) {
|
1541
1668
|
enum ssl_hs_wait_t ret = ssl_hs_error;
|
1542
|
-
enum
|
1543
|
-
static_cast<enum
|
1669
|
+
enum tls12_server_hs_state_t state =
|
1670
|
+
static_cast<enum tls12_server_hs_state_t>(hs->state);
|
1544
1671
|
switch (state) {
|
1545
|
-
case
|
1672
|
+
case state12_start_accept:
|
1546
1673
|
ret = do_start_accept(hs);
|
1547
1674
|
break;
|
1548
|
-
case
|
1675
|
+
case state12_read_client_hello:
|
1549
1676
|
ret = do_read_client_hello(hs);
|
1550
1677
|
break;
|
1551
|
-
case
|
1678
|
+
case state12_select_certificate:
|
1552
1679
|
ret = do_select_certificate(hs);
|
1553
1680
|
break;
|
1554
|
-
case
|
1681
|
+
case state12_tls13:
|
1555
1682
|
ret = do_tls13(hs);
|
1556
1683
|
break;
|
1557
|
-
case
|
1684
|
+
case state12_select_parameters:
|
1558
1685
|
ret = do_select_parameters(hs);
|
1559
1686
|
break;
|
1560
|
-
case
|
1687
|
+
case state12_send_server_hello:
|
1561
1688
|
ret = do_send_server_hello(hs);
|
1562
1689
|
break;
|
1563
|
-
case
|
1690
|
+
case state12_send_server_certificate:
|
1564
1691
|
ret = do_send_server_certificate(hs);
|
1565
1692
|
break;
|
1566
|
-
case
|
1693
|
+
case state12_send_server_key_exchange:
|
1567
1694
|
ret = do_send_server_key_exchange(hs);
|
1568
1695
|
break;
|
1569
|
-
case
|
1696
|
+
case state12_send_server_hello_done:
|
1570
1697
|
ret = do_send_server_hello_done(hs);
|
1571
1698
|
break;
|
1572
|
-
case
|
1699
|
+
case state12_read_client_certificate:
|
1573
1700
|
ret = do_read_client_certificate(hs);
|
1574
1701
|
break;
|
1575
|
-
case
|
1702
|
+
case state12_verify_client_certificate:
|
1576
1703
|
ret = do_verify_client_certificate(hs);
|
1577
1704
|
break;
|
1578
|
-
case
|
1705
|
+
case state12_read_client_key_exchange:
|
1579
1706
|
ret = do_read_client_key_exchange(hs);
|
1580
1707
|
break;
|
1581
|
-
case
|
1708
|
+
case state12_read_client_certificate_verify:
|
1582
1709
|
ret = do_read_client_certificate_verify(hs);
|
1583
1710
|
break;
|
1584
|
-
case
|
1711
|
+
case state12_read_change_cipher_spec:
|
1585
1712
|
ret = do_read_change_cipher_spec(hs);
|
1586
1713
|
break;
|
1587
|
-
case
|
1714
|
+
case state12_process_change_cipher_spec:
|
1588
1715
|
ret = do_process_change_cipher_spec(hs);
|
1589
1716
|
break;
|
1590
|
-
case
|
1717
|
+
case state12_read_next_proto:
|
1591
1718
|
ret = do_read_next_proto(hs);
|
1592
1719
|
break;
|
1593
|
-
case
|
1720
|
+
case state12_read_channel_id:
|
1594
1721
|
ret = do_read_channel_id(hs);
|
1595
1722
|
break;
|
1596
|
-
case
|
1723
|
+
case state12_read_client_finished:
|
1597
1724
|
ret = do_read_client_finished(hs);
|
1598
1725
|
break;
|
1599
|
-
case
|
1726
|
+
case state12_send_server_finished:
|
1600
1727
|
ret = do_send_server_finished(hs);
|
1601
1728
|
break;
|
1602
|
-
case
|
1729
|
+
case state12_finish_server_handshake:
|
1603
1730
|
ret = do_finish_server_handshake(hs);
|
1604
1731
|
break;
|
1605
|
-
case
|
1732
|
+
case state12_done:
|
1606
1733
|
ret = ssl_hs_ok;
|
1607
1734
|
break;
|
1608
1735
|
}
|
@@ -1621,54 +1748,54 @@ enum ssl_hs_wait_t ssl_server_handshake(SSL_HANDSHAKE *hs) {
|
|
1621
1748
|
}
|
1622
1749
|
|
1623
1750
|
const char *ssl_server_handshake_state(SSL_HANDSHAKE *hs) {
|
1624
|
-
enum
|
1625
|
-
static_cast<enum
|
1751
|
+
enum tls12_server_hs_state_t state =
|
1752
|
+
static_cast<enum tls12_server_hs_state_t>(hs->state);
|
1626
1753
|
switch (state) {
|
1627
|
-
case
|
1754
|
+
case state12_start_accept:
|
1628
1755
|
return "TLS server start_accept";
|
1629
|
-
case
|
1756
|
+
case state12_read_client_hello:
|
1630
1757
|
return "TLS server read_client_hello";
|
1631
|
-
case
|
1758
|
+
case state12_select_certificate:
|
1632
1759
|
return "TLS server select_certificate";
|
1633
|
-
case
|
1760
|
+
case state12_tls13:
|
1634
1761
|
return tls13_server_handshake_state(hs);
|
1635
|
-
case
|
1762
|
+
case state12_select_parameters:
|
1636
1763
|
return "TLS server select_parameters";
|
1637
|
-
case
|
1764
|
+
case state12_send_server_hello:
|
1638
1765
|
return "TLS server send_server_hello";
|
1639
|
-
case
|
1766
|
+
case state12_send_server_certificate:
|
1640
1767
|
return "TLS server send_server_certificate";
|
1641
|
-
case
|
1768
|
+
case state12_send_server_key_exchange:
|
1642
1769
|
return "TLS server send_server_key_exchange";
|
1643
|
-
case
|
1770
|
+
case state12_send_server_hello_done:
|
1644
1771
|
return "TLS server send_server_hello_done";
|
1645
|
-
case
|
1772
|
+
case state12_read_client_certificate:
|
1646
1773
|
return "TLS server read_client_certificate";
|
1647
|
-
case
|
1774
|
+
case state12_verify_client_certificate:
|
1648
1775
|
return "TLS server verify_client_certificate";
|
1649
|
-
case
|
1776
|
+
case state12_read_client_key_exchange:
|
1650
1777
|
return "TLS server read_client_key_exchange";
|
1651
|
-
case
|
1778
|
+
case state12_read_client_certificate_verify:
|
1652
1779
|
return "TLS server read_client_certificate_verify";
|
1653
|
-
case
|
1780
|
+
case state12_read_change_cipher_spec:
|
1654
1781
|
return "TLS server read_change_cipher_spec";
|
1655
|
-
case
|
1782
|
+
case state12_process_change_cipher_spec:
|
1656
1783
|
return "TLS server process_change_cipher_spec";
|
1657
|
-
case
|
1784
|
+
case state12_read_next_proto:
|
1658
1785
|
return "TLS server read_next_proto";
|
1659
|
-
case
|
1786
|
+
case state12_read_channel_id:
|
1660
1787
|
return "TLS server read_channel_id";
|
1661
|
-
case
|
1788
|
+
case state12_read_client_finished:
|
1662
1789
|
return "TLS server read_client_finished";
|
1663
|
-
case
|
1790
|
+
case state12_send_server_finished:
|
1664
1791
|
return "TLS server send_server_finished";
|
1665
|
-
case
|
1792
|
+
case state12_finish_server_handshake:
|
1666
1793
|
return "TLS server finish_server_handshake";
|
1667
|
-
case
|
1794
|
+
case state12_done:
|
1668
1795
|
return "TLS server done";
|
1669
1796
|
}
|
1670
1797
|
|
1671
1798
|
return "TLS server unknown";
|
1672
1799
|
}
|
1673
1800
|
|
1674
|
-
|
1801
|
+
BSSL_NAMESPACE_END
|