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
@@ -24,13 +24,14 @@
|
|
24
24
|
#include <openssl/digest.h>
|
25
25
|
#include <openssl/err.h>
|
26
26
|
#include <openssl/mem.h>
|
27
|
+
#include <openssl/sha.h>
|
27
28
|
#include <openssl/stack.h>
|
28
29
|
|
29
30
|
#include "../crypto/internal.h"
|
30
31
|
#include "internal.h"
|
31
32
|
|
32
33
|
|
33
|
-
|
34
|
+
BSSL_NAMESPACE_BEGIN
|
34
35
|
|
35
36
|
enum client_hs_state_t {
|
36
37
|
state_read_hello_retry_request = 0,
|
@@ -40,6 +41,7 @@ enum client_hs_state_t {
|
|
40
41
|
state_read_certificate_request,
|
41
42
|
state_read_server_certificate,
|
42
43
|
state_read_server_certificate_verify,
|
44
|
+
state_server_certificate_reverify,
|
43
45
|
state_read_server_finished,
|
44
46
|
state_send_end_of_early_data,
|
45
47
|
state_send_client_certificate,
|
@@ -157,21 +159,23 @@ static enum ssl_hs_wait_t do_read_hello_retry_request(SSL_HANDSHAKE *hs) {
|
|
157
159
|
}
|
158
160
|
|
159
161
|
// The group must be supported.
|
160
|
-
if (!tls1_check_group_id(
|
162
|
+
if (!tls1_check_group_id(hs, group_id)) {
|
161
163
|
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
|
162
164
|
OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CURVE);
|
163
165
|
return ssl_hs_error;
|
164
166
|
}
|
165
167
|
|
166
|
-
// Check that the HelloRetryRequest does not request
|
167
|
-
//
|
168
|
-
if (hs->
|
168
|
+
// Check that the HelloRetryRequest does not request a key share that was
|
169
|
+
// provided in the initial ClientHello.
|
170
|
+
if (hs->key_shares[0]->GroupID() == group_id ||
|
171
|
+
(hs->key_shares[1] && hs->key_shares[1]->GroupID() == group_id)) {
|
169
172
|
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
|
170
173
|
OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CURVE);
|
171
174
|
return ssl_hs_error;
|
172
175
|
}
|
173
176
|
|
174
|
-
hs->
|
177
|
+
hs->key_shares[0].reset();
|
178
|
+
hs->key_shares[1].reset();
|
175
179
|
hs->retry_group = group_id;
|
176
180
|
}
|
177
181
|
|
@@ -184,6 +188,7 @@ static enum ssl_hs_wait_t do_read_hello_retry_request(SSL_HANDSHAKE *hs) {
|
|
184
188
|
hs->tls13_state = state_send_second_client_hello;
|
185
189
|
// 0-RTT is rejected if we receive a HelloRetryRequest.
|
186
190
|
if (hs->in_early_data) {
|
191
|
+
ssl->s3->early_data_reason = ssl_early_data_hello_retry_request;
|
187
192
|
return ssl_hs_early_data_rejected;
|
188
193
|
}
|
189
194
|
return ssl_hs_ok;
|
@@ -290,6 +295,16 @@ static enum ssl_hs_wait_t do_read_server_hello(SSL_HANDSHAKE *hs) {
|
|
290
295
|
return ssl_hs_error;
|
291
296
|
}
|
292
297
|
|
298
|
+
// Recheck supported_versions, in case this is the second ServerHello.
|
299
|
+
uint16_t version;
|
300
|
+
if (!have_supported_versions ||
|
301
|
+
!CBS_get_u16(&supported_versions, &version) ||
|
302
|
+
version != ssl->version) {
|
303
|
+
OPENSSL_PUT_ERROR(SSL, SSL_R_SECOND_SERVERHELLO_VERSION_MISMATCH);
|
304
|
+
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
|
305
|
+
return ssl_hs_error;
|
306
|
+
}
|
307
|
+
|
293
308
|
alert = SSL_AD_DECODE_ERROR;
|
294
309
|
if (have_pre_shared_key) {
|
295
310
|
if (ssl->session == NULL) {
|
@@ -316,7 +331,7 @@ static enum ssl_hs_wait_t do_read_server_hello(SSL_HANDSHAKE *hs) {
|
|
316
331
|
return ssl_hs_error;
|
317
332
|
}
|
318
333
|
|
319
|
-
if (!ssl_session_is_context_valid(
|
334
|
+
if (!ssl_session_is_context_valid(hs, ssl->session.get())) {
|
320
335
|
// This is actually a client application bug.
|
321
336
|
OPENSSL_PUT_ERROR(SSL,
|
322
337
|
SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT);
|
@@ -326,7 +341,8 @@ static enum ssl_hs_wait_t do_read_server_hello(SSL_HANDSHAKE *hs) {
|
|
326
341
|
|
327
342
|
ssl->s3->session_reused = true;
|
328
343
|
// Only authentication information carries over in TLS 1.3.
|
329
|
-
hs->new_session =
|
344
|
+
hs->new_session =
|
345
|
+
SSL_SESSION_dup(ssl->session.get(), SSL_SESSION_DUP_AUTH_ONLY);
|
330
346
|
if (!hs->new_session) {
|
331
347
|
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
|
332
348
|
return ssl_hs_error;
|
@@ -349,11 +365,12 @@ static enum ssl_hs_wait_t do_read_server_hello(SSL_HANDSHAKE *hs) {
|
|
349
365
|
|
350
366
|
// Set up the key schedule and incorporate the PSK into the running secret.
|
351
367
|
if (ssl->s3->session_reused) {
|
352
|
-
if (!tls13_init_key_schedule(
|
353
|
-
|
368
|
+
if (!tls13_init_key_schedule(
|
369
|
+
hs, MakeConstSpan(hs->new_session->master_key,
|
370
|
+
hs->new_session->master_key_length))) {
|
354
371
|
return ssl_hs_error;
|
355
372
|
}
|
356
|
-
} else if (!tls13_init_key_schedule(hs, kZeroes, hash_len)) {
|
373
|
+
} else if (!tls13_init_key_schedule(hs, MakeConstSpan(kZeroes, hash_len))) {
|
357
374
|
return ssl_hs_error;
|
358
375
|
}
|
359
376
|
|
@@ -373,19 +390,19 @@ static enum ssl_hs_wait_t do_read_server_hello(SSL_HANDSHAKE *hs) {
|
|
373
390
|
return ssl_hs_error;
|
374
391
|
}
|
375
392
|
|
376
|
-
if (!tls13_advance_key_schedule(hs, dhe_secret
|
393
|
+
if (!tls13_advance_key_schedule(hs, dhe_secret) ||
|
377
394
|
!ssl_hash_message(hs, msg) ||
|
378
395
|
!tls13_derive_handshake_secrets(hs) ||
|
379
|
-
!tls13_set_traffic_key(ssl,
|
380
|
-
hs->
|
396
|
+
!tls13_set_traffic_key(ssl, ssl_encryption_handshake, evp_aead_open,
|
397
|
+
hs->server_handshake_secret())) {
|
381
398
|
return ssl_hs_error;
|
382
399
|
}
|
383
400
|
|
384
401
|
if (!hs->early_data_offered) {
|
385
402
|
// If not sending early data, set client traffic keys now so that alerts are
|
386
403
|
// encrypted.
|
387
|
-
if (!tls13_set_traffic_key(ssl,
|
388
|
-
hs->
|
404
|
+
if (!tls13_set_traffic_key(ssl, ssl_encryption_handshake, evp_aead_seal,
|
405
|
+
hs->client_handshake_secret())) {
|
389
406
|
return ssl_hs_error;
|
390
407
|
}
|
391
408
|
}
|
@@ -417,26 +434,19 @@ static enum ssl_hs_wait_t do_read_encrypted_extensions(SSL_HANDSHAKE *hs) {
|
|
417
434
|
}
|
418
435
|
|
419
436
|
// Store the negotiated ALPN in the session.
|
420
|
-
if (!ssl->s3->alpn_selected
|
421
|
-
|
422
|
-
|
423
|
-
if (hs->new_session->early_alpn == NULL) {
|
424
|
-
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
|
425
|
-
return ssl_hs_error;
|
426
|
-
}
|
427
|
-
hs->new_session->early_alpn_len = ssl->s3->alpn_selected.size();
|
437
|
+
if (!hs->new_session->early_alpn.CopyFrom(ssl->s3->alpn_selected)) {
|
438
|
+
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
|
439
|
+
return ssl_hs_error;
|
428
440
|
}
|
429
441
|
|
430
442
|
if (ssl->s3->early_data_accepted) {
|
431
443
|
if (hs->early_session->cipher != hs->new_session->cipher ||
|
432
|
-
MakeConstSpan(hs->early_session->early_alpn
|
433
|
-
hs->early_session->early_alpn_len) !=
|
444
|
+
MakeConstSpan(hs->early_session->early_alpn) !=
|
434
445
|
ssl->s3->alpn_selected) {
|
435
446
|
OPENSSL_PUT_ERROR(SSL, SSL_R_ALPN_MISMATCH_ON_EARLY_DATA);
|
436
447
|
return ssl_hs_error;
|
437
448
|
}
|
438
|
-
if (ssl->s3->
|
439
|
-
ssl->token_binding_negotiated) {
|
449
|
+
if (ssl->s3->channel_id_valid || ssl->s3->token_binding_negotiated) {
|
440
450
|
OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_EXTENSION_ON_EARLY_DATA);
|
441
451
|
return ssl_hs_error;
|
442
452
|
}
|
@@ -458,6 +468,10 @@ static enum ssl_hs_wait_t do_read_certificate_request(SSL_HANDSHAKE *hs) {
|
|
458
468
|
SSL *const ssl = hs->ssl;
|
459
469
|
// CertificateRequest may only be sent in non-resumption handshakes.
|
460
470
|
if (ssl->s3->session_reused) {
|
471
|
+
if (ssl->ctx->reverify_on_resume && !ssl->s3->early_data_accepted) {
|
472
|
+
hs->tls13_state = state_server_certificate_reverify;
|
473
|
+
return ssl_hs_ok;
|
474
|
+
}
|
461
475
|
hs->tls13_state = state_read_server_finished;
|
462
476
|
return ssl_hs_ok;
|
463
477
|
}
|
@@ -495,7 +509,6 @@ static enum ssl_hs_wait_t do_read_certificate_request(SSL_HANDSHAKE *hs) {
|
|
495
509
|
!have_sigalgs ||
|
496
510
|
!CBS_get_u16_length_prefixed(&sigalgs,
|
497
511
|
&supported_signature_algorithms) ||
|
498
|
-
CBS_len(&supported_signature_algorithms) == 0 ||
|
499
512
|
!tls1_parse_peer_sigalgs(hs, &supported_signature_algorithms)) {
|
500
513
|
ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
|
501
514
|
OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
|
@@ -535,8 +548,13 @@ static enum ssl_hs_wait_t do_read_server_certificate(SSL_HANDSHAKE *hs) {
|
|
535
548
|
if (!ssl->method->get_message(ssl, &msg)) {
|
536
549
|
return ssl_hs_read_message;
|
537
550
|
}
|
538
|
-
|
539
|
-
|
551
|
+
|
552
|
+
if (msg.type != SSL3_MT_COMPRESSED_CERTIFICATE &&
|
553
|
+
!ssl_check_message_type(ssl, msg, SSL3_MT_CERTIFICATE)) {
|
554
|
+
return ssl_hs_error;
|
555
|
+
}
|
556
|
+
|
557
|
+
if (!tls13_process_certificate(hs, msg, false /* certificate required */) ||
|
540
558
|
!ssl_hash_message(hs, msg)) {
|
541
559
|
return ssl_hs_error;
|
542
560
|
}
|
@@ -574,6 +592,21 @@ static enum ssl_hs_wait_t do_read_server_certificate_verify(
|
|
574
592
|
return ssl_hs_ok;
|
575
593
|
}
|
576
594
|
|
595
|
+
static enum ssl_hs_wait_t do_server_certificate_reverify(
|
596
|
+
SSL_HANDSHAKE *hs) {
|
597
|
+
switch (ssl_reverify_peer_cert(hs)) {
|
598
|
+
case ssl_verify_ok:
|
599
|
+
break;
|
600
|
+
case ssl_verify_invalid:
|
601
|
+
return ssl_hs_error;
|
602
|
+
case ssl_verify_retry:
|
603
|
+
hs->tls13_state = state_server_certificate_reverify;
|
604
|
+
return ssl_hs_certificate_verify;
|
605
|
+
}
|
606
|
+
hs->tls13_state = state_read_server_finished;
|
607
|
+
return ssl_hs_ok;
|
608
|
+
}
|
609
|
+
|
577
610
|
static enum ssl_hs_wait_t do_read_server_finished(SSL_HANDSHAKE *hs) {
|
578
611
|
SSL *const ssl = hs->ssl;
|
579
612
|
SSLMessage msg;
|
@@ -581,10 +614,11 @@ static enum ssl_hs_wait_t do_read_server_finished(SSL_HANDSHAKE *hs) {
|
|
581
614
|
return ssl_hs_read_message;
|
582
615
|
}
|
583
616
|
if (!ssl_check_message_type(ssl, msg, SSL3_MT_FINISHED) ||
|
584
|
-
!tls13_process_finished(hs, msg,
|
617
|
+
!tls13_process_finished(hs, msg, false /* don't use saved value */) ||
|
585
618
|
!ssl_hash_message(hs, msg) ||
|
586
619
|
// Update the secret to the master secret and derive traffic keys.
|
587
|
-
!tls13_advance_key_schedule(
|
620
|
+
!tls13_advance_key_schedule(
|
621
|
+
hs, MakeConstSpan(kZeroes, hs->transcript.DigestLen())) ||
|
588
622
|
!tls13_derive_application_secrets(hs)) {
|
589
623
|
return ssl_hs_error;
|
590
624
|
}
|
@@ -599,18 +633,22 @@ static enum ssl_hs_wait_t do_send_end_of_early_data(SSL_HANDSHAKE *hs) {
|
|
599
633
|
|
600
634
|
if (ssl->s3->early_data_accepted) {
|
601
635
|
hs->can_early_write = false;
|
602
|
-
|
603
|
-
|
604
|
-
if (
|
605
|
-
|
606
|
-
|
607
|
-
|
636
|
+
// QUIC omits the EndOfEarlyData message. See draft-ietf-quic-tls-22,
|
637
|
+
// section 8.3.
|
638
|
+
if (ssl->quic_method == nullptr) {
|
639
|
+
ScopedCBB cbb;
|
640
|
+
CBB body;
|
641
|
+
if (!ssl->method->init_message(ssl, cbb.get(), &body,
|
642
|
+
SSL3_MT_END_OF_EARLY_DATA) ||
|
643
|
+
!ssl_add_message_cbb(ssl, cbb.get())) {
|
644
|
+
return ssl_hs_error;
|
645
|
+
}
|
608
646
|
}
|
609
647
|
}
|
610
648
|
|
611
649
|
if (hs->early_data_offered) {
|
612
|
-
if (!tls13_set_traffic_key(ssl,
|
613
|
-
hs->
|
650
|
+
if (!tls13_set_traffic_key(ssl, ssl_encryption_handshake, evp_aead_seal,
|
651
|
+
hs->client_handshake_secret())) {
|
614
652
|
return ssl_hs_error;
|
615
653
|
}
|
616
654
|
}
|
@@ -629,8 +667,8 @@ static enum ssl_hs_wait_t do_send_client_certificate(SSL_HANDSHAKE *hs) {
|
|
629
667
|
}
|
630
668
|
|
631
669
|
// Call cert_cb to update the certificate.
|
632
|
-
if (
|
633
|
-
int rv =
|
670
|
+
if (hs->config->cert->cert_cb != NULL) {
|
671
|
+
int rv = hs->config->cert->cert_cb(ssl, hs->config->cert->cert_cb_arg);
|
634
672
|
if (rv == 0) {
|
635
673
|
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
|
636
674
|
OPENSSL_PUT_ERROR(SSL, SSL_R_CERT_CB_ERROR);
|
@@ -652,9 +690,8 @@ static enum ssl_hs_wait_t do_send_client_certificate(SSL_HANDSHAKE *hs) {
|
|
652
690
|
}
|
653
691
|
|
654
692
|
static enum ssl_hs_wait_t do_send_client_certificate_verify(SSL_HANDSHAKE *hs) {
|
655
|
-
SSL *const ssl = hs->ssl;
|
656
693
|
// Don't send CertificateVerify if there is no certificate.
|
657
|
-
if (!ssl_has_certificate(
|
694
|
+
if (!ssl_has_certificate(hs)) {
|
658
695
|
hs->tls13_state = state_complete_second_flight;
|
659
696
|
return ssl_hs_ok;
|
660
697
|
}
|
@@ -680,13 +717,13 @@ static enum ssl_hs_wait_t do_complete_second_flight(SSL_HANDSHAKE *hs) {
|
|
680
717
|
SSL *const ssl = hs->ssl;
|
681
718
|
|
682
719
|
// Send a Channel ID assertion if necessary.
|
683
|
-
if (ssl->s3->
|
684
|
-
if (!ssl_do_channel_id_callback(
|
720
|
+
if (ssl->s3->channel_id_valid) {
|
721
|
+
if (!ssl_do_channel_id_callback(hs)) {
|
685
722
|
hs->tls13_state = state_complete_second_flight;
|
686
723
|
return ssl_hs_error;
|
687
724
|
}
|
688
725
|
|
689
|
-
if (
|
726
|
+
if (hs->config->channel_id_private == NULL) {
|
690
727
|
return ssl_hs_channel_id_lookup;
|
691
728
|
}
|
692
729
|
|
@@ -705,10 +742,10 @@ static enum ssl_hs_wait_t do_complete_second_flight(SSL_HANDSHAKE *hs) {
|
|
705
742
|
}
|
706
743
|
|
707
744
|
// Derive the final keys and enable them.
|
708
|
-
if (!tls13_set_traffic_key(ssl,
|
709
|
-
hs->
|
710
|
-
!tls13_set_traffic_key(ssl,
|
711
|
-
hs->
|
745
|
+
if (!tls13_set_traffic_key(ssl, ssl_encryption_application, evp_aead_open,
|
746
|
+
hs->server_traffic_secret_0()) ||
|
747
|
+
!tls13_set_traffic_key(ssl, ssl_encryption_application, evp_aead_seal,
|
748
|
+
hs->client_traffic_secret_0()) ||
|
712
749
|
!tls13_derive_resumption_secret(hs)) {
|
713
750
|
return ssl_hs_error;
|
714
751
|
}
|
@@ -744,6 +781,9 @@ enum ssl_hs_wait_t tls13_client_handshake(SSL_HANDSHAKE *hs) {
|
|
744
781
|
case state_read_server_certificate_verify:
|
745
782
|
ret = do_read_server_certificate_verify(hs);
|
746
783
|
break;
|
784
|
+
case state_server_certificate_reverify:
|
785
|
+
ret = do_server_certificate_reverify(hs);
|
786
|
+
break;
|
747
787
|
case state_read_server_finished:
|
748
788
|
ret = do_read_server_finished(hs);
|
749
789
|
break;
|
@@ -794,6 +834,8 @@ const char *tls13_client_handshake_state(SSL_HANDSHAKE *hs) {
|
|
794
834
|
return "TLS 1.3 client read_server_certificate";
|
795
835
|
case state_read_server_certificate_verify:
|
796
836
|
return "TLS 1.3 client read_server_certificate_verify";
|
837
|
+
case state_server_certificate_reverify:
|
838
|
+
return "TLS 1.3 client server_certificate_reverify";
|
797
839
|
case state_read_server_finished:
|
798
840
|
return "TLS 1.3 client read_server_finished";
|
799
841
|
case state_send_end_of_early_data:
|
@@ -811,18 +853,18 @@ const char *tls13_client_handshake_state(SSL_HANDSHAKE *hs) {
|
|
811
853
|
return "TLS 1.3 client unknown";
|
812
854
|
}
|
813
855
|
|
814
|
-
|
856
|
+
bool tls13_process_new_session_ticket(SSL *ssl, const SSLMessage &msg) {
|
815
857
|
if (ssl->s3->write_shutdown != ssl_shutdown_none) {
|
816
858
|
// Ignore tickets on shutdown. Callers tend to indiscriminately call
|
817
859
|
// |SSL_shutdown| before destroying an |SSL|, at which point calling the new
|
818
860
|
// session callback may be confusing.
|
819
|
-
return
|
861
|
+
return true;
|
820
862
|
}
|
821
863
|
|
822
864
|
UniquePtr<SSL_SESSION> session = SSL_SESSION_dup(
|
823
865
|
ssl->s3->established_session.get(), SSL_SESSION_INCLUDE_NONAUTH);
|
824
866
|
if (!session) {
|
825
|
-
return
|
867
|
+
return false;
|
826
868
|
}
|
827
869
|
|
828
870
|
ssl_session_rebase_time(ssl, session.get());
|
@@ -833,12 +875,12 @@ int tls13_process_new_session_ticket(SSL *ssl, const SSLMessage &msg) {
|
|
833
875
|
!CBS_get_u32(&body, &session->ticket_age_add) ||
|
834
876
|
!CBS_get_u8_length_prefixed(&body, &ticket_nonce) ||
|
835
877
|
!CBS_get_u16_length_prefixed(&body, &ticket) ||
|
836
|
-
!
|
878
|
+
!session->ticket.CopyFrom(ticket) ||
|
837
879
|
!CBS_get_u16_length_prefixed(&body, &extensions) ||
|
838
880
|
CBS_len(&body) != 0) {
|
839
881
|
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
|
840
882
|
OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
|
841
|
-
return
|
883
|
+
return false;
|
842
884
|
}
|
843
885
|
|
844
886
|
// Cap the renewable lifetime by the server advertised value. This avoids
|
@@ -848,14 +890,14 @@ int tls13_process_new_session_ticket(SSL *ssl, const SSLMessage &msg) {
|
|
848
890
|
}
|
849
891
|
|
850
892
|
if (!tls13_derive_session_psk(session.get(), ticket_nonce)) {
|
851
|
-
return
|
893
|
+
return false;
|
852
894
|
}
|
853
895
|
|
854
896
|
// Parse out the extensions.
|
855
|
-
bool
|
856
|
-
CBS
|
897
|
+
bool have_early_data = false;
|
898
|
+
CBS early_data;
|
857
899
|
const SSL_EXTENSION_TYPE ext_types[] = {
|
858
|
-
{TLSEXT_TYPE_early_data, &
|
900
|
+
{TLSEXT_TYPE_early_data, &have_early_data, &early_data},
|
859
901
|
};
|
860
902
|
|
861
903
|
uint8_t alert = SSL_AD_DECODE_ERROR;
|
@@ -863,29 +905,43 @@ int tls13_process_new_session_ticket(SSL *ssl, const SSLMessage &msg) {
|
|
863
905
|
OPENSSL_ARRAY_SIZE(ext_types),
|
864
906
|
1 /* ignore unknown */)) {
|
865
907
|
ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
|
866
|
-
return
|
908
|
+
return false;
|
867
909
|
}
|
868
910
|
|
869
|
-
if (
|
870
|
-
if (!CBS_get_u32(&
|
871
|
-
CBS_len(&
|
911
|
+
if (have_early_data) {
|
912
|
+
if (!CBS_get_u32(&early_data, &session->ticket_max_early_data) ||
|
913
|
+
CBS_len(&early_data) != 0) {
|
872
914
|
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
|
873
915
|
OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
|
874
|
-
return
|
916
|
+
return false;
|
917
|
+
}
|
918
|
+
|
919
|
+
// QUIC does not use the max_early_data_size parameter and always sets it to
|
920
|
+
// a fixed value. See draft-ietf-quic-tls-22, section 4.5.
|
921
|
+
if (ssl->quic_method != nullptr &&
|
922
|
+
session->ticket_max_early_data != 0xffffffff) {
|
923
|
+
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
|
924
|
+
OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
|
925
|
+
return false;
|
875
926
|
}
|
876
927
|
}
|
877
928
|
|
878
|
-
session
|
879
|
-
session
|
929
|
+
// Generate a session ID for this session. Some callers expect all sessions to
|
930
|
+
// have a session ID.
|
931
|
+
SHA256(CBS_data(&ticket), CBS_len(&ticket), session->session_id);
|
932
|
+
session->session_id_length = SHA256_DIGEST_LENGTH;
|
933
|
+
|
934
|
+
session->ticket_age_add_valid = true;
|
935
|
+
session->not_resumable = false;
|
880
936
|
|
881
|
-
if ((ssl->
|
882
|
-
ssl->
|
883
|
-
ssl->
|
937
|
+
if ((ssl->session_ctx->session_cache_mode & SSL_SESS_CACHE_CLIENT) &&
|
938
|
+
ssl->session_ctx->new_session_cb != NULL &&
|
939
|
+
ssl->session_ctx->new_session_cb(ssl, session.get())) {
|
884
940
|
// |new_session_cb|'s return value signals that it took ownership.
|
885
941
|
session.release();
|
886
942
|
}
|
887
943
|
|
888
|
-
return
|
944
|
+
return true;
|
889
945
|
}
|
890
946
|
|
891
|
-
|
947
|
+
BSSL_NAMESPACE_END
|
@@ -17,6 +17,7 @@
|
|
17
17
|
#include <assert.h>
|
18
18
|
#include <string.h>
|
19
19
|
|
20
|
+
#include <algorithm>
|
20
21
|
#include <utility>
|
21
22
|
|
22
23
|
#include <openssl/aead.h>
|
@@ -30,181 +31,196 @@
|
|
30
31
|
#include "internal.h"
|
31
32
|
|
32
33
|
|
33
|
-
|
34
|
+
BSSL_NAMESPACE_BEGIN
|
34
35
|
|
35
|
-
static
|
36
|
-
|
36
|
+
static bool init_key_schedule(SSL_HANDSHAKE *hs, uint16_t version,
|
37
|
+
const SSL_CIPHER *cipher) {
|
37
38
|
if (!hs->transcript.InitHash(version, cipher)) {
|
38
|
-
return
|
39
|
+
return false;
|
39
40
|
}
|
40
41
|
|
41
|
-
hs->hash_len = hs->transcript.DigestLen();
|
42
|
-
|
43
42
|
// Initialize the secret to the zero key.
|
44
|
-
|
43
|
+
hs->ResizeSecrets(hs->transcript.DigestLen());
|
44
|
+
OPENSSL_memset(hs->secret().data(), 0, hs->secret().size());
|
45
45
|
|
46
|
-
return
|
46
|
+
return true;
|
47
|
+
}
|
48
|
+
|
49
|
+
static bool hkdf_extract_to_secret(SSL_HANDSHAKE *hs, Span<const uint8_t> in) {
|
50
|
+
size_t len;
|
51
|
+
if (!HKDF_extract(hs->secret().data(), &len, hs->transcript.Digest(),
|
52
|
+
in.data(), in.size(), hs->secret().data(),
|
53
|
+
hs->secret().size())) {
|
54
|
+
return false;
|
55
|
+
}
|
56
|
+
assert(len == hs->secret().size());
|
57
|
+
return true;
|
47
58
|
}
|
48
59
|
|
49
|
-
|
50
|
-
size_t psk_len) {
|
60
|
+
bool tls13_init_key_schedule(SSL_HANDSHAKE *hs, Span<const uint8_t> psk) {
|
51
61
|
if (!init_key_schedule(hs, ssl_protocol_version(hs->ssl), hs->new_cipher)) {
|
52
|
-
return
|
62
|
+
return false;
|
53
63
|
}
|
54
64
|
|
55
65
|
hs->transcript.FreeBuffer();
|
56
|
-
return
|
57
|
-
psk_len, hs->secret, hs->hash_len);
|
66
|
+
return hkdf_extract_to_secret(hs, psk);
|
58
67
|
}
|
59
68
|
|
60
|
-
|
61
|
-
size_t psk_len) {
|
69
|
+
bool tls13_init_early_key_schedule(SSL_HANDSHAKE *hs, Span<const uint8_t> psk) {
|
62
70
|
SSL *const ssl = hs->ssl;
|
63
|
-
return init_key_schedule(hs, ssl_session_protocol_version(ssl->session),
|
71
|
+
return init_key_schedule(hs, ssl_session_protocol_version(ssl->session.get()),
|
64
72
|
ssl->session->cipher) &&
|
65
|
-
|
66
|
-
psk_len, hs->secret, hs->hash_len);
|
73
|
+
hkdf_extract_to_secret(hs, psk);
|
67
74
|
}
|
68
75
|
|
69
|
-
static
|
70
|
-
|
71
|
-
|
72
|
-
const uint8_t *hash, size_t hash_len, size_t len) {
|
73
|
-
static const char kTLS13LabelVersion[] = "tls13 ";
|
76
|
+
static Span<const char> label_to_span(const char *label) {
|
77
|
+
return MakeConstSpan(label, strlen(label));
|
78
|
+
}
|
74
79
|
|
80
|
+
static bool hkdf_expand_label(Span<uint8_t> out, const EVP_MD *digest,
|
81
|
+
Span<const uint8_t> secret,
|
82
|
+
Span<const char> label,
|
83
|
+
Span<const uint8_t> hash) {
|
84
|
+
Span<const char> protocol_label = label_to_span("tls13 ");
|
75
85
|
ScopedCBB cbb;
|
76
86
|
CBB child;
|
77
|
-
uint8_t
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
!CBB_add_u16(cbb.get(), len) ||
|
87
|
+
Array<uint8_t> hkdf_label;
|
88
|
+
if (!CBB_init(cbb.get(), 2 + 1 + protocol_label.size() + label.size() + 1 +
|
89
|
+
hash.size()) ||
|
90
|
+
!CBB_add_u16(cbb.get(), out.size()) ||
|
82
91
|
!CBB_add_u8_length_prefixed(cbb.get(), &child) ||
|
83
|
-
!CBB_add_bytes(&child,
|
84
|
-
|
85
|
-
|
92
|
+
!CBB_add_bytes(&child,
|
93
|
+
reinterpret_cast<const uint8_t *>(protocol_label.data()),
|
94
|
+
protocol_label.size()) ||
|
95
|
+
!CBB_add_bytes(&child, reinterpret_cast<const uint8_t *>(label.data()),
|
96
|
+
label.size()) ||
|
86
97
|
!CBB_add_u8_length_prefixed(cbb.get(), &child) ||
|
87
|
-
!CBB_add_bytes(&child, hash,
|
88
|
-
!
|
89
|
-
return
|
98
|
+
!CBB_add_bytes(&child, hash.data(), hash.size()) ||
|
99
|
+
!CBBFinishArray(cbb.get(), &hkdf_label)) {
|
100
|
+
return false;
|
90
101
|
}
|
91
102
|
|
92
|
-
|
93
|
-
|
94
|
-
OPENSSL_free(hkdf_label);
|
95
|
-
return ret;
|
103
|
+
return HKDF_expand(out.data(), out.size(), digest, secret.data(),
|
104
|
+
secret.size(), hkdf_label.data(), hkdf_label.size());
|
96
105
|
}
|
97
106
|
|
98
107
|
static const char kTLS13LabelDerived[] = "derived";
|
99
108
|
|
100
|
-
|
101
|
-
size_t len) {
|
109
|
+
bool tls13_advance_key_schedule(SSL_HANDSHAKE *hs, Span<const uint8_t> in) {
|
102
110
|
uint8_t derive_context[EVP_MAX_MD_SIZE];
|
103
111
|
unsigned derive_context_len;
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
hs->hash_len, kTLS13LabelDerived,
|
111
|
-
strlen(kTLS13LabelDerived), derive_context,
|
112
|
-
derive_context_len, hs->hash_len)) {
|
113
|
-
return 0;
|
114
|
-
}
|
115
|
-
|
116
|
-
return HKDF_extract(hs->secret, &hs->hash_len, hs->transcript.Digest(), in,
|
117
|
-
len, hs->secret, hs->hash_len);
|
112
|
+
return EVP_Digest(nullptr, 0, derive_context, &derive_context_len,
|
113
|
+
hs->transcript.Digest(), nullptr) &&
|
114
|
+
hkdf_expand_label(hs->secret(), hs->transcript.Digest(), hs->secret(),
|
115
|
+
label_to_span(kTLS13LabelDerived),
|
116
|
+
MakeConstSpan(derive_context, derive_context_len)) &&
|
117
|
+
hkdf_extract_to_secret(hs, in);
|
118
118
|
}
|
119
119
|
|
120
|
-
// derive_secret derives a secret of length |
|
121
|
-
// with the given label
|
122
|
-
// handshake context. It returns
|
123
|
-
|
124
|
-
|
120
|
+
// derive_secret derives a secret of length |out.size()| and writes the result
|
121
|
+
// in |out| with the given label, the current base secret, and the most
|
122
|
+
// recently-saved handshake context. It returns true on success and false on
|
123
|
+
// error.
|
124
|
+
static bool derive_secret(SSL_HANDSHAKE *hs, Span<uint8_t> out,
|
125
|
+
Span<const char> label) {
|
125
126
|
uint8_t context_hash[EVP_MAX_MD_SIZE];
|
126
127
|
size_t context_hash_len;
|
127
128
|
if (!hs->transcript.GetHash(context_hash, &context_hash_len)) {
|
128
|
-
return
|
129
|
+
return false;
|
129
130
|
}
|
130
131
|
|
131
|
-
return hkdf_expand_label(out, hs->transcript.Digest(), hs->secret,
|
132
|
-
|
133
|
-
context_hash_len, len);
|
132
|
+
return hkdf_expand_label(out, hs->transcript.Digest(), hs->secret(), label,
|
133
|
+
MakeConstSpan(context_hash, context_hash_len));
|
134
134
|
}
|
135
135
|
|
136
|
-
|
137
|
-
|
138
|
-
|
136
|
+
bool tls13_set_traffic_key(SSL *ssl, enum ssl_encryption_level_t level,
|
137
|
+
enum evp_aead_direction_t direction,
|
138
|
+
Span<const uint8_t> traffic_secret) {
|
139
139
|
const SSL_SESSION *session = SSL_get_session(ssl);
|
140
140
|
uint16_t version = ssl_session_protocol_version(session);
|
141
141
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
142
|
+
UniquePtr<SSLAEADContext> traffic_aead;
|
143
|
+
if (ssl->quic_method == nullptr) {
|
144
|
+
// Look up cipher suite properties.
|
145
|
+
const EVP_AEAD *aead;
|
146
|
+
size_t discard;
|
147
|
+
if (!ssl_cipher_get_evp_aead(&aead, &discard, &discard, session->cipher,
|
148
|
+
version, SSL_is_dtls(ssl))) {
|
149
|
+
return false;
|
150
|
+
}
|
146
151
|
|
147
|
-
|
148
|
-
const EVP_AEAD *aead;
|
149
|
-
size_t discard;
|
150
|
-
if (!ssl_cipher_get_evp_aead(&aead, &discard, &discard, session->cipher,
|
151
|
-
version, SSL_is_dtls(ssl))) {
|
152
|
-
return 0;
|
153
|
-
}
|
152
|
+
const EVP_MD *digest = ssl_session_get_digest(session);
|
154
153
|
|
155
|
-
|
154
|
+
// Derive the key.
|
155
|
+
size_t key_len = EVP_AEAD_key_length(aead);
|
156
|
+
uint8_t key_buf[EVP_AEAD_MAX_KEY_LENGTH];
|
157
|
+
auto key = MakeSpan(key_buf, key_len);
|
158
|
+
if (!hkdf_expand_label(key, digest, traffic_secret, label_to_span("key"),
|
159
|
+
{})) {
|
160
|
+
return false;
|
161
|
+
}
|
156
162
|
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
163
|
+
// Derive the IV.
|
164
|
+
size_t iv_len = EVP_AEAD_nonce_length(aead);
|
165
|
+
uint8_t iv_buf[EVP_AEAD_MAX_NONCE_LENGTH];
|
166
|
+
auto iv = MakeSpan(iv_buf, iv_len);
|
167
|
+
if (!hkdf_expand_label(iv, digest, traffic_secret, label_to_span("iv"),
|
168
|
+
{})) {
|
169
|
+
return false;
|
170
|
+
}
|
164
171
|
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
172
|
+
|
173
|
+
traffic_aead = SSLAEADContext::Create(direction, session->ssl_version,
|
174
|
+
SSL_is_dtls(ssl), session->cipher,
|
175
|
+
key, Span<const uint8_t>(), iv);
|
176
|
+
} else {
|
177
|
+
// Install a placeholder SSLAEADContext so that SSL accessors work. The
|
178
|
+
// encryption itself will be handled by the SSL_QUIC_METHOD.
|
179
|
+
traffic_aead =
|
180
|
+
SSLAEADContext::CreatePlaceholderForQUIC(version, session->cipher);
|
181
|
+
// QUIC never installs early data keys at the TLS layer.
|
182
|
+
assert(level != ssl_encryption_early_data);
|
171
183
|
}
|
172
184
|
|
173
|
-
UniquePtr<SSLAEADContext> traffic_aead =
|
174
|
-
SSLAEADContext::Create(direction, session->ssl_version, SSL_is_dtls(ssl),
|
175
|
-
session->cipher, MakeConstSpan(key, key_len),
|
176
|
-
Span<const uint8_t>(), MakeConstSpan(iv, iv_len));
|
177
185
|
if (!traffic_aead) {
|
178
|
-
return
|
186
|
+
return false;
|
179
187
|
}
|
180
188
|
|
181
189
|
if (direction == evp_aead_open) {
|
182
190
|
if (!ssl->method->set_read_state(ssl, std::move(traffic_aead))) {
|
183
|
-
return
|
191
|
+
return false;
|
184
192
|
}
|
185
193
|
} else {
|
186
194
|
if (!ssl->method->set_write_state(ssl, std::move(traffic_aead))) {
|
187
|
-
return
|
195
|
+
return false;
|
188
196
|
}
|
189
197
|
}
|
190
198
|
|
191
199
|
// Save the traffic secret.
|
200
|
+
if (traffic_secret.size() >
|
201
|
+
OPENSSL_ARRAY_SIZE(ssl->s3->read_traffic_secret) ||
|
202
|
+
traffic_secret.size() >
|
203
|
+
OPENSSL_ARRAY_SIZE(ssl->s3->write_traffic_secret)) {
|
204
|
+
OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
|
205
|
+
return false;
|
206
|
+
}
|
192
207
|
if (direction == evp_aead_open) {
|
193
|
-
OPENSSL_memmove(ssl->s3->read_traffic_secret, traffic_secret,
|
194
|
-
|
195
|
-
ssl->s3->read_traffic_secret_len =
|
208
|
+
OPENSSL_memmove(ssl->s3->read_traffic_secret, traffic_secret.data(),
|
209
|
+
traffic_secret.size());
|
210
|
+
ssl->s3->read_traffic_secret_len = traffic_secret.size();
|
211
|
+
ssl->s3->read_level = level;
|
196
212
|
} else {
|
197
|
-
OPENSSL_memmove(ssl->s3->write_traffic_secret, traffic_secret,
|
198
|
-
|
199
|
-
ssl->s3->write_traffic_secret_len =
|
213
|
+
OPENSSL_memmove(ssl->s3->write_traffic_secret, traffic_secret.data(),
|
214
|
+
traffic_secret.size());
|
215
|
+
ssl->s3->write_traffic_secret_len = traffic_secret.size();
|
216
|
+
ssl->s3->write_level = level;
|
200
217
|
}
|
201
218
|
|
202
|
-
return
|
219
|
+
return true;
|
203
220
|
}
|
204
221
|
|
205
222
|
|
206
223
|
static const char kTLS13LabelExporter[] = "exp master";
|
207
|
-
static const char kTLS13LabelEarlyExporter[] = "e exp master";
|
208
224
|
|
209
225
|
static const char kTLS13LabelClientEarlyTraffic[] = "c e traffic";
|
210
226
|
static const char kTLS13LabelClientHandshakeTraffic[] = "c hs traffic";
|
@@ -212,125 +228,169 @@ static const char kTLS13LabelServerHandshakeTraffic[] = "s hs traffic";
|
|
212
228
|
static const char kTLS13LabelClientApplicationTraffic[] = "c ap traffic";
|
213
229
|
static const char kTLS13LabelServerApplicationTraffic[] = "s ap traffic";
|
214
230
|
|
215
|
-
|
231
|
+
bool tls13_derive_early_secret(SSL_HANDSHAKE *hs) {
|
216
232
|
SSL *const ssl = hs->ssl;
|
217
|
-
if (!derive_secret(hs, hs->early_traffic_secret,
|
218
|
-
kTLS13LabelClientEarlyTraffic
|
219
|
-
strlen(kTLS13LabelClientEarlyTraffic)) ||
|
233
|
+
if (!derive_secret(hs, hs->early_traffic_secret(),
|
234
|
+
label_to_span(kTLS13LabelClientEarlyTraffic)) ||
|
220
235
|
!ssl_log_secret(ssl, "CLIENT_EARLY_TRAFFIC_SECRET",
|
221
|
-
hs->early_traffic_secret
|
222
|
-
|
223
|
-
kTLS13LabelEarlyExporter,
|
224
|
-
strlen(kTLS13LabelEarlyExporter))) {
|
225
|
-
return 0;
|
236
|
+
hs->early_traffic_secret())) {
|
237
|
+
return false;
|
226
238
|
}
|
227
|
-
|
228
|
-
|
239
|
+
return true;
|
240
|
+
}
|
241
|
+
|
242
|
+
bool tls13_set_early_secret_for_quic(SSL_HANDSHAKE *hs) {
|
243
|
+
SSL *const ssl = hs->ssl;
|
244
|
+
if (ssl->quic_method == nullptr) {
|
245
|
+
return true;
|
246
|
+
}
|
247
|
+
if (ssl->server) {
|
248
|
+
if (!ssl->quic_method->set_encryption_secrets(
|
249
|
+
ssl, ssl_encryption_early_data, hs->early_traffic_secret().data(),
|
250
|
+
/*write_secret=*/nullptr, hs->early_traffic_secret().size())) {
|
251
|
+
OPENSSL_PUT_ERROR(SSL, SSL_R_QUIC_INTERNAL_ERROR);
|
252
|
+
return false;
|
253
|
+
}
|
254
|
+
} else {
|
255
|
+
if (!ssl->quic_method->set_encryption_secrets(
|
256
|
+
ssl, ssl_encryption_early_data, /*read_secret=*/nullptr,
|
257
|
+
hs->early_traffic_secret().data(),
|
258
|
+
hs->early_traffic_secret().size())) {
|
259
|
+
OPENSSL_PUT_ERROR(SSL, SSL_R_QUIC_INTERNAL_ERROR);
|
260
|
+
return false;
|
261
|
+
}
|
262
|
+
}
|
263
|
+
return true;
|
264
|
+
}
|
265
|
+
|
266
|
+
static bool set_quic_secrets(SSL_HANDSHAKE *hs, ssl_encryption_level_t level,
|
267
|
+
Span<const uint8_t> client_write_secret,
|
268
|
+
Span<const uint8_t> server_write_secret) {
|
269
|
+
SSL *const ssl = hs->ssl;
|
270
|
+
assert(client_write_secret.size() == server_write_secret.size());
|
271
|
+
if (ssl->quic_method == nullptr) {
|
272
|
+
return true;
|
273
|
+
}
|
274
|
+
if (!ssl->server) {
|
275
|
+
std::swap(client_write_secret, server_write_secret);
|
276
|
+
}
|
277
|
+
return ssl->quic_method->set_encryption_secrets(
|
278
|
+
ssl, level,
|
279
|
+
/*read_secret=*/client_write_secret.data(),
|
280
|
+
/*write_secret=*/server_write_secret.data(), client_write_secret.size());
|
229
281
|
}
|
230
282
|
|
231
|
-
|
283
|
+
bool tls13_derive_handshake_secrets(SSL_HANDSHAKE *hs) {
|
232
284
|
SSL *const ssl = hs->ssl;
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
hs->
|
285
|
+
if (!derive_secret(hs, hs->client_handshake_secret(),
|
286
|
+
label_to_span(kTLS13LabelClientHandshakeTraffic)) ||
|
287
|
+
!ssl_log_secret(ssl, "CLIENT_HANDSHAKE_TRAFFIC_SECRET",
|
288
|
+
hs->client_handshake_secret()) ||
|
289
|
+
!derive_secret(hs, hs->server_handshake_secret(),
|
290
|
+
label_to_span(kTLS13LabelServerHandshakeTraffic)) ||
|
291
|
+
!ssl_log_secret(ssl, "SERVER_HANDSHAKE_TRAFFIC_SECRET",
|
292
|
+
hs->server_handshake_secret()) ||
|
293
|
+
!set_quic_secrets(hs, ssl_encryption_handshake,
|
294
|
+
hs->client_handshake_secret(),
|
295
|
+
hs->server_handshake_secret())) {
|
296
|
+
return false;
|
297
|
+
}
|
298
|
+
|
299
|
+
return true;
|
243
300
|
}
|
244
301
|
|
245
|
-
|
302
|
+
bool tls13_derive_application_secrets(SSL_HANDSHAKE *hs) {
|
246
303
|
SSL *const ssl = hs->ssl;
|
247
|
-
ssl->s3->exporter_secret_len = hs->
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
304
|
+
ssl->s3->exporter_secret_len = hs->transcript.DigestLen();
|
305
|
+
if (!derive_secret(hs, hs->client_traffic_secret_0(),
|
306
|
+
label_to_span(kTLS13LabelClientApplicationTraffic)) ||
|
307
|
+
!ssl_log_secret(ssl, "CLIENT_TRAFFIC_SECRET_0",
|
308
|
+
hs->client_traffic_secret_0()) ||
|
309
|
+
!derive_secret(hs, hs->server_traffic_secret_0(),
|
310
|
+
label_to_span(kTLS13LabelServerApplicationTraffic)) ||
|
311
|
+
!ssl_log_secret(ssl, "SERVER_TRAFFIC_SECRET_0",
|
312
|
+
hs->server_traffic_secret_0()) ||
|
313
|
+
!derive_secret(
|
314
|
+
hs, MakeSpan(ssl->s3->exporter_secret, ssl->s3->exporter_secret_len),
|
315
|
+
label_to_span(kTLS13LabelExporter)) ||
|
316
|
+
!ssl_log_secret(ssl, "EXPORTER_SECRET",
|
317
|
+
MakeConstSpan(ssl->s3->exporter_secret,
|
318
|
+
ssl->s3->exporter_secret_len)) ||
|
319
|
+
!set_quic_secrets(hs, ssl_encryption_application,
|
320
|
+
hs->client_traffic_secret_0(),
|
321
|
+
hs->server_traffic_secret_0())) {
|
322
|
+
return false;
|
323
|
+
}
|
324
|
+
|
325
|
+
return true;
|
262
326
|
}
|
263
327
|
|
264
328
|
static const char kTLS13LabelApplicationTraffic[] = "traffic upd";
|
265
329
|
|
266
|
-
|
267
|
-
uint8_t
|
268
|
-
size_t secret_len;
|
330
|
+
bool tls13_rotate_traffic_key(SSL *ssl, enum evp_aead_direction_t direction) {
|
331
|
+
Span<uint8_t> secret;
|
269
332
|
if (direction == evp_aead_open) {
|
270
|
-
secret = ssl->s3->read_traffic_secret
|
271
|
-
|
333
|
+
secret = MakeSpan(ssl->s3->read_traffic_secret,
|
334
|
+
ssl->s3->read_traffic_secret_len);
|
272
335
|
} else {
|
273
|
-
secret = ssl->s3->write_traffic_secret
|
274
|
-
|
336
|
+
secret = MakeSpan(ssl->s3->write_traffic_secret,
|
337
|
+
ssl->s3->write_traffic_secret_len);
|
275
338
|
}
|
276
339
|
|
277
340
|
const EVP_MD *digest = ssl_session_get_digest(SSL_get_session(ssl));
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
}
|
283
|
-
|
284
|
-
return tls13_set_traffic_key(ssl, direction, secret, secret_len);
|
341
|
+
return hkdf_expand_label(secret, digest, secret,
|
342
|
+
label_to_span(kTLS13LabelApplicationTraffic), {}) &&
|
343
|
+
tls13_set_traffic_key(ssl, ssl_encryption_application, direction,
|
344
|
+
secret);
|
285
345
|
}
|
286
346
|
|
287
347
|
static const char kTLS13LabelResumption[] = "res master";
|
288
348
|
|
289
|
-
|
290
|
-
if (hs->
|
349
|
+
bool tls13_derive_resumption_secret(SSL_HANDSHAKE *hs) {
|
350
|
+
if (hs->transcript.DigestLen() > SSL_MAX_MASTER_KEY_LENGTH) {
|
291
351
|
OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
|
292
|
-
return
|
352
|
+
return false;
|
293
353
|
}
|
294
|
-
hs->new_session->master_key_length = hs->
|
295
|
-
return derive_secret(
|
296
|
-
|
297
|
-
|
354
|
+
hs->new_session->master_key_length = hs->transcript.DigestLen();
|
355
|
+
return derive_secret(
|
356
|
+
hs,
|
357
|
+
MakeSpan(hs->new_session->master_key, hs->new_session->master_key_length),
|
358
|
+
label_to_span(kTLS13LabelResumption));
|
298
359
|
}
|
299
360
|
|
300
361
|
static const char kTLS13LabelFinished[] = "finished";
|
301
362
|
|
302
363
|
// tls13_verify_data sets |out| to be the HMAC of |context| using a derived
|
303
|
-
// Finished key for both Finished messages and the PSK binder.
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
364
|
+
// Finished key for both Finished messages and the PSK binder. |out| must have
|
365
|
+
// space available for |EVP_MAX_MD_SIZE| bytes.
|
366
|
+
static bool tls13_verify_data(uint8_t *out, size_t *out_len,
|
367
|
+
const EVP_MD *digest, uint16_t version,
|
368
|
+
Span<const uint8_t> secret,
|
369
|
+
Span<const uint8_t> context) {
|
370
|
+
uint8_t key_buf[EVP_MAX_MD_SIZE];
|
371
|
+
auto key = MakeSpan(key_buf, EVP_MD_size(digest));
|
309
372
|
unsigned len;
|
310
|
-
if (!hkdf_expand_label(key, digest, secret,
|
311
|
-
|
312
|
-
HMAC(digest, key,
|
313
|
-
|
373
|
+
if (!hkdf_expand_label(key, digest, secret,
|
374
|
+
label_to_span(kTLS13LabelFinished), {}) ||
|
375
|
+
HMAC(digest, key.data(), key.size(), context.data(), context.size(), out,
|
376
|
+
&len) == nullptr) {
|
377
|
+
return false;
|
314
378
|
}
|
315
379
|
*out_len = len;
|
316
|
-
return
|
380
|
+
return true;
|
317
381
|
}
|
318
382
|
|
319
|
-
|
320
|
-
|
321
|
-
const uint8_t
|
322
|
-
|
323
|
-
traffic_secret = hs->server_handshake_secret;
|
324
|
-
} else {
|
325
|
-
traffic_secret = hs->client_handshake_secret;
|
326
|
-
}
|
383
|
+
bool tls13_finished_mac(SSL_HANDSHAKE *hs, uint8_t *out, size_t *out_len,
|
384
|
+
bool is_server) {
|
385
|
+
Span<const uint8_t> traffic_secret =
|
386
|
+
is_server ? hs->server_handshake_secret() : hs->client_handshake_secret();
|
327
387
|
|
328
388
|
uint8_t context_hash[EVP_MAX_MD_SIZE];
|
329
389
|
size_t context_hash_len;
|
330
390
|
if (!hs->transcript.GetHash(context_hash, &context_hash_len) ||
|
331
|
-
!tls13_verify_data(hs->transcript.Digest(),
|
332
|
-
|
333
|
-
context_hash_len)) {
|
391
|
+
!tls13_verify_data(out, out_len, hs->transcript.Digest(),
|
392
|
+
hs->ssl->version, traffic_secret,
|
393
|
+
MakeConstSpan(context_hash, context_hash_len))) {
|
334
394
|
return 0;
|
335
395
|
}
|
336
396
|
return 1;
|
@@ -340,154 +400,162 @@ static const char kTLS13LabelResumptionPSK[] = "resumption";
|
|
340
400
|
|
341
401
|
bool tls13_derive_session_psk(SSL_SESSION *session, Span<const uint8_t> nonce) {
|
342
402
|
const EVP_MD *digest = ssl_session_get_digest(session);
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
403
|
+
// The session initially stores the resumption_master_secret, which we
|
404
|
+
// override with the PSK.
|
405
|
+
auto session_key = MakeSpan(session->master_key, session->master_key_length);
|
406
|
+
return hkdf_expand_label(session_key, digest, session_key,
|
407
|
+
label_to_span(kTLS13LabelResumptionPSK), nonce);
|
347
408
|
}
|
348
409
|
|
349
410
|
static const char kTLS13LabelExportKeying[] = "exporter";
|
350
411
|
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
412
|
+
bool tls13_export_keying_material(SSL *ssl, Span<uint8_t> out,
|
413
|
+
Span<const uint8_t> secret,
|
414
|
+
Span<const char> label,
|
415
|
+
Span<const uint8_t> context) {
|
355
416
|
if (secret.empty()) {
|
356
417
|
assert(0);
|
357
418
|
OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
|
358
|
-
return
|
419
|
+
return false;
|
359
420
|
}
|
360
421
|
|
361
422
|
const EVP_MD *digest = ssl_session_get_digest(SSL_get_session(ssl));
|
362
423
|
|
363
|
-
uint8_t
|
364
|
-
uint8_t
|
365
|
-
uint8_t derived_secret[EVP_MAX_MD_SIZE];
|
424
|
+
uint8_t hash_buf[EVP_MAX_MD_SIZE];
|
425
|
+
uint8_t export_context_buf[EVP_MAX_MD_SIZE];
|
366
426
|
unsigned hash_len;
|
367
427
|
unsigned export_context_len;
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
428
|
+
if (!EVP_Digest(context.data(), context.size(), hash_buf, &hash_len, digest,
|
429
|
+
nullptr) ||
|
430
|
+
!EVP_Digest(nullptr, 0, export_context_buf, &export_context_len, digest,
|
431
|
+
nullptr)) {
|
432
|
+
return false;
|
433
|
+
}
|
434
|
+
|
435
|
+
auto hash = MakeConstSpan(hash_buf, hash_len);
|
436
|
+
auto export_context = MakeConstSpan(export_context_buf, export_context_len);
|
437
|
+
uint8_t derived_secret_buf[EVP_MAX_MD_SIZE];
|
438
|
+
auto derived_secret = MakeSpan(derived_secret_buf, EVP_MD_size(digest));
|
439
|
+
return hkdf_expand_label(derived_secret, digest, secret, label,
|
440
|
+
export_context) &&
|
441
|
+
hkdf_expand_label(out, digest, derived_secret,
|
442
|
+
label_to_span(kTLS13LabelExportKeying), hash);
|
380
443
|
}
|
381
444
|
|
382
445
|
static const char kTLS13LabelPSKBinder[] = "res binder";
|
383
446
|
|
384
|
-
static
|
385
|
-
|
386
|
-
|
387
|
-
size_t hash_len) {
|
447
|
+
static bool tls13_psk_binder(uint8_t *out, size_t *out_len, uint16_t version,
|
448
|
+
const EVP_MD *digest, Span<const uint8_t> psk,
|
449
|
+
Span<const uint8_t> context) {
|
388
450
|
uint8_t binder_context[EVP_MAX_MD_SIZE];
|
389
451
|
unsigned binder_context_len;
|
390
452
|
if (!EVP_Digest(NULL, 0, binder_context, &binder_context_len, digest, NULL)) {
|
391
|
-
return
|
453
|
+
return false;
|
392
454
|
}
|
393
455
|
|
394
456
|
uint8_t early_secret[EVP_MAX_MD_SIZE] = {0};
|
395
457
|
size_t early_secret_len;
|
396
|
-
if (!HKDF_extract(early_secret, &early_secret_len, digest, psk,
|
397
|
-
NULL, 0)) {
|
398
|
-
return
|
458
|
+
if (!HKDF_extract(early_secret, &early_secret_len, digest, psk.data(),
|
459
|
+
psk.size(), NULL, 0)) {
|
460
|
+
return false;
|
399
461
|
}
|
400
462
|
|
401
|
-
uint8_t
|
402
|
-
|
403
|
-
if (!hkdf_expand_label(binder_key, digest,
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
return
|
463
|
+
uint8_t binder_key_buf[EVP_MAX_MD_SIZE] = {0};
|
464
|
+
auto binder_key = MakeSpan(binder_key_buf, EVP_MD_size(digest));
|
465
|
+
if (!hkdf_expand_label(binder_key, digest,
|
466
|
+
MakeConstSpan(early_secret, early_secret_len),
|
467
|
+
label_to_span(kTLS13LabelPSKBinder),
|
468
|
+
MakeConstSpan(binder_context, binder_context_len)) ||
|
469
|
+
!tls13_verify_data(out, out_len, digest, version, binder_key, context)) {
|
470
|
+
return false;
|
409
471
|
}
|
410
472
|
|
411
|
-
|
473
|
+
assert(*out_len == EVP_MD_size(digest));
|
474
|
+
return true;
|
412
475
|
}
|
413
476
|
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
|
421
|
-
return 0;
|
477
|
+
static bool hash_transcript_and_truncated_client_hello(
|
478
|
+
SSL_HANDSHAKE *hs, uint8_t *out, size_t *out_len, const EVP_MD *digest,
|
479
|
+
Span<const uint8_t> client_hello, size_t binders_len) {
|
480
|
+
// Truncate the ClientHello.
|
481
|
+
if (binders_len + 2 < binders_len || client_hello.size() < binders_len + 2) {
|
482
|
+
return false;
|
422
483
|
}
|
484
|
+
client_hello = client_hello.subspan(0, client_hello.size() - binders_len - 2);
|
423
485
|
|
424
486
|
ScopedEVP_MD_CTX ctx;
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
hs->transcript.buffer().size()) ||
|
431
|
-
!EVP_DigestUpdate(ctx.get(), msg, len - hash_len - 3) ||
|
432
|
-
!EVP_DigestFinal_ex(ctx.get(), context, &context_len)) {
|
433
|
-
return 0;
|
434
|
-
}
|
435
|
-
|
436
|
-
uint8_t verify_data[EVP_MAX_MD_SIZE] = {0};
|
437
|
-
if (!tls13_psk_binder(verify_data, ssl->session->ssl_version, digest,
|
438
|
-
ssl->session->master_key,
|
439
|
-
ssl->session->master_key_length, context, context_len,
|
440
|
-
hash_len)) {
|
441
|
-
return 0;
|
487
|
+
unsigned len;
|
488
|
+
if (!hs->transcript.CopyToHashContext(ctx.get(), digest) ||
|
489
|
+
!EVP_DigestUpdate(ctx.get(), client_hello.data(), client_hello.size()) ||
|
490
|
+
!EVP_DigestFinal_ex(ctx.get(), out, &len)) {
|
491
|
+
return false;
|
442
492
|
}
|
443
493
|
|
444
|
-
|
445
|
-
return
|
494
|
+
*out_len = len;
|
495
|
+
return true;
|
446
496
|
}
|
447
497
|
|
448
|
-
|
449
|
-
|
450
|
-
|
498
|
+
bool tls13_write_psk_binder(SSL_HANDSHAKE *hs, Span<uint8_t> msg) {
|
499
|
+
SSL *const ssl = hs->ssl;
|
500
|
+
const EVP_MD *digest = ssl_session_get_digest(ssl->session.get());
|
501
|
+
size_t hash_len = EVP_MD_size(digest);
|
451
502
|
|
452
|
-
|
453
|
-
|
503
|
+
ScopedEVP_MD_CTX ctx;
|
504
|
+
uint8_t context[EVP_MAX_MD_SIZE];
|
505
|
+
size_t context_len;
|
506
|
+
uint8_t verify_data[EVP_MAX_MD_SIZE];
|
507
|
+
size_t verify_data_len;
|
508
|
+
if (!hash_transcript_and_truncated_client_hello(
|
509
|
+
hs, context, &context_len, digest, msg,
|
510
|
+
1 /* length prefix */ + hash_len) ||
|
511
|
+
!tls13_psk_binder(verify_data, &verify_data_len,
|
512
|
+
ssl->session->ssl_version, digest,
|
513
|
+
MakeConstSpan(ssl->session->master_key,
|
514
|
+
ssl->session->master_key_length),
|
515
|
+
MakeConstSpan(context, context_len)) ||
|
516
|
+
verify_data_len != hash_len) {
|
454
517
|
OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
|
455
|
-
return
|
518
|
+
return false;
|
456
519
|
}
|
457
520
|
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
unsigned context_len;
|
463
|
-
if (!EVP_Digest(CBS_data(&msg.raw), CBS_len(&msg.raw) - CBS_len(binders) - 2,
|
464
|
-
context, &context_len, hs->transcript.Digest(), NULL)) {
|
465
|
-
return 0;
|
466
|
-
}
|
521
|
+
OPENSSL_memcpy(msg.data() + msg.size() - verify_data_len, verify_data,
|
522
|
+
verify_data_len);
|
523
|
+
return true;
|
524
|
+
}
|
467
525
|
|
468
|
-
|
526
|
+
bool tls13_verify_psk_binder(SSL_HANDSHAKE *hs, SSL_SESSION *session,
|
527
|
+
const SSLMessage &msg, CBS *binders) {
|
528
|
+
uint8_t context[EVP_MAX_MD_SIZE];
|
529
|
+
size_t context_len;
|
530
|
+
uint8_t verify_data[EVP_MAX_MD_SIZE];
|
531
|
+
size_t verify_data_len;
|
469
532
|
CBS binder;
|
470
|
-
if (!
|
471
|
-
|
472
|
-
|
533
|
+
if (!hash_transcript_and_truncated_client_hello(hs, context, &context_len,
|
534
|
+
hs->transcript.Digest(),
|
535
|
+
msg.raw, CBS_len(binders)) ||
|
536
|
+
!tls13_psk_binder(
|
537
|
+
verify_data, &verify_data_len, hs->ssl->version,
|
538
|
+
hs->transcript.Digest(),
|
539
|
+
MakeConstSpan(session->master_key, session->master_key_length),
|
540
|
+
MakeConstSpan(context, context_len)) ||
|
473
541
|
// We only consider the first PSK, so compare against the first binder.
|
474
542
|
!CBS_get_u8_length_prefixed(binders, &binder)) {
|
475
543
|
OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
|
476
|
-
return
|
544
|
+
return false;
|
477
545
|
}
|
478
546
|
|
479
|
-
|
480
|
-
CBS_len(&binder) ==
|
481
|
-
CRYPTO_memcmp(CBS_data(&binder), verify_data,
|
547
|
+
bool binder_ok =
|
548
|
+
CBS_len(&binder) == verify_data_len &&
|
549
|
+
CRYPTO_memcmp(CBS_data(&binder), verify_data, verify_data_len) == 0;
|
482
550
|
#if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
|
483
|
-
binder_ok =
|
551
|
+
binder_ok = true;
|
484
552
|
#endif
|
485
553
|
if (!binder_ok) {
|
486
554
|
OPENSSL_PUT_ERROR(SSL, SSL_R_DIGEST_CHECK_FAILED);
|
487
|
-
return
|
555
|
+
return false;
|
488
556
|
}
|
489
557
|
|
490
|
-
return
|
558
|
+
return true;
|
491
559
|
}
|
492
560
|
|
493
|
-
|
561
|
+
BSSL_NAMESPACE_END
|