grpc 1.24.0 → 1.25.0.pre1
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/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 +71 -43
- 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
@@ -155,7 +155,7 @@
|
|
155
155
|
#include "../crypto/internal.h"
|
156
156
|
|
157
157
|
|
158
|
-
|
158
|
+
BSSL_NAMESPACE_BEGIN
|
159
159
|
|
160
160
|
// check_ssl_x509_method asserts that |ssl| has the X509-based method
|
161
161
|
// installed. Calling an X509-based method on an |ssl| with a different method
|
@@ -186,15 +186,11 @@ static UniquePtr<CRYPTO_BUFFER> x509_to_buffer(X509 *x509) {
|
|
186
186
|
}
|
187
187
|
|
188
188
|
// new_leafless_chain returns a fresh stack of buffers set to {NULL}.
|
189
|
-
static STACK_OF(CRYPTO_BUFFER)
|
190
|
-
STACK_OF(CRYPTO_BUFFER)
|
191
|
-
if (chain
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
if (!sk_CRYPTO_BUFFER_push(chain, NULL)) {
|
196
|
-
sk_CRYPTO_BUFFER_free(chain);
|
197
|
-
return NULL;
|
189
|
+
static UniquePtr<STACK_OF(CRYPTO_BUFFER)> new_leafless_chain(void) {
|
190
|
+
UniquePtr<STACK_OF(CRYPTO_BUFFER)> chain(sk_CRYPTO_BUFFER_new_null());
|
191
|
+
if (!chain ||
|
192
|
+
!sk_CRYPTO_BUFFER_push(chain.get(), nullptr)) {
|
193
|
+
return nullptr;
|
198
194
|
}
|
199
195
|
|
200
196
|
return chain;
|
@@ -204,70 +200,64 @@ static STACK_OF(CRYPTO_BUFFER) *new_leafless_chain(void) {
|
|
204
200
|
// forms of elements of |chain|. It returns one on success or zero on error, in
|
205
201
|
// which case no change to |cert->chain| is made. It preverses the existing
|
206
202
|
// leaf from |cert->chain|, if any.
|
207
|
-
static
|
203
|
+
static bool ssl_cert_set_chain(CERT *cert, STACK_OF(X509) *chain) {
|
208
204
|
UniquePtr<STACK_OF(CRYPTO_BUFFER)> new_chain;
|
209
205
|
|
210
|
-
if (cert->chain !=
|
206
|
+
if (cert->chain != nullptr) {
|
211
207
|
new_chain.reset(sk_CRYPTO_BUFFER_new_null());
|
212
208
|
if (!new_chain) {
|
213
|
-
return
|
209
|
+
return false;
|
214
210
|
}
|
215
211
|
|
216
|
-
CRYPTO_BUFFER *leaf = sk_CRYPTO_BUFFER_value(cert->chain, 0);
|
217
|
-
if (!sk_CRYPTO_BUFFER_push(new_chain.get(), leaf)) {
|
218
|
-
return 0;
|
219
|
-
}
|
220
212
|
// |leaf| might be NULL if it's a “leafless” chain.
|
221
|
-
|
222
|
-
|
213
|
+
CRYPTO_BUFFER *leaf = sk_CRYPTO_BUFFER_value(cert->chain.get(), 0);
|
214
|
+
if (!PushToStack(new_chain.get(), UpRef(leaf))) {
|
215
|
+
return false;
|
223
216
|
}
|
224
217
|
}
|
225
218
|
|
226
219
|
for (X509 *x509 : chain) {
|
227
220
|
if (!new_chain) {
|
228
|
-
new_chain
|
221
|
+
new_chain = new_leafless_chain();
|
229
222
|
if (!new_chain) {
|
230
|
-
return
|
223
|
+
return false;
|
231
224
|
}
|
232
225
|
}
|
233
226
|
|
234
227
|
UniquePtr<CRYPTO_BUFFER> buffer = x509_to_buffer(x509);
|
235
228
|
if (!buffer ||
|
236
229
|
!PushToStack(new_chain.get(), std::move(buffer))) {
|
237
|
-
return
|
230
|
+
return false;
|
238
231
|
}
|
239
232
|
}
|
240
233
|
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
return 1;
|
234
|
+
cert->chain = std::move(new_chain);
|
235
|
+
return true;
|
245
236
|
}
|
246
237
|
|
247
238
|
static void ssl_crypto_x509_cert_flush_cached_leaf(CERT *cert) {
|
248
239
|
X509_free(cert->x509_leaf);
|
249
|
-
cert->x509_leaf =
|
240
|
+
cert->x509_leaf = nullptr;
|
250
241
|
}
|
251
242
|
|
252
243
|
static void ssl_crypto_x509_cert_flush_cached_chain(CERT *cert) {
|
253
244
|
sk_X509_pop_free(cert->x509_chain, X509_free);
|
254
|
-
cert->x509_chain =
|
245
|
+
cert->x509_chain = nullptr;
|
255
246
|
}
|
256
247
|
|
257
|
-
static
|
248
|
+
static bool ssl_crypto_x509_check_client_CA_list(
|
258
249
|
STACK_OF(CRYPTO_BUFFER) *names) {
|
259
250
|
for (const CRYPTO_BUFFER *buffer : names) {
|
260
251
|
const uint8_t *inp = CRYPTO_BUFFER_data(buffer);
|
261
|
-
X509_NAME
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
return 0;
|
252
|
+
UniquePtr<X509_NAME> name(
|
253
|
+
d2i_X509_NAME(nullptr, &inp, CRYPTO_BUFFER_len(buffer)));
|
254
|
+
if (name == nullptr ||
|
255
|
+
inp != CRYPTO_BUFFER_data(buffer) + CRYPTO_BUFFER_len(buffer)) {
|
256
|
+
return false;
|
267
257
|
}
|
268
258
|
}
|
269
259
|
|
270
|
-
return
|
260
|
+
return true;
|
271
261
|
}
|
272
262
|
|
273
263
|
static void ssl_crypto_x509_cert_clear(CERT *cert) {
|
@@ -275,7 +265,7 @@ static void ssl_crypto_x509_cert_clear(CERT *cert) {
|
|
275
265
|
ssl_crypto_x509_cert_flush_cached_chain(cert);
|
276
266
|
|
277
267
|
X509_free(cert->x509_stash);
|
278
|
-
cert->x509_stash =
|
268
|
+
cert->x509_stash = nullptr;
|
279
269
|
}
|
280
270
|
|
281
271
|
static void ssl_crypto_x509_cert_free(CERT *cert) {
|
@@ -284,118 +274,131 @@ static void ssl_crypto_x509_cert_free(CERT *cert) {
|
|
284
274
|
}
|
285
275
|
|
286
276
|
static void ssl_crypto_x509_cert_dup(CERT *new_cert, const CERT *cert) {
|
287
|
-
if (cert->verify_store !=
|
277
|
+
if (cert->verify_store != nullptr) {
|
288
278
|
X509_STORE_up_ref(cert->verify_store);
|
289
279
|
new_cert->verify_store = cert->verify_store;
|
290
280
|
}
|
291
281
|
}
|
292
282
|
|
293
|
-
static
|
294
|
-
bssl::UniquePtr<STACK_OF(X509)> chain;
|
295
|
-
if (sk_CRYPTO_BUFFER_num(sess->certs) > 0) {
|
283
|
+
static bool ssl_crypto_x509_session_cache_objects(SSL_SESSION *sess) {
|
284
|
+
bssl::UniquePtr<STACK_OF(X509)> chain, chain_without_leaf;
|
285
|
+
if (sk_CRYPTO_BUFFER_num(sess->certs.get()) > 0) {
|
296
286
|
chain.reset(sk_X509_new_null());
|
297
287
|
if (!chain) {
|
298
288
|
OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
|
299
|
-
return
|
289
|
+
return false;
|
290
|
+
}
|
291
|
+
if (sess->is_server) {
|
292
|
+
// chain_without_leaf is only needed for server sessions. See
|
293
|
+
// |SSL_get_peer_cert_chain|.
|
294
|
+
chain_without_leaf.reset(sk_X509_new_null());
|
295
|
+
if (!chain_without_leaf) {
|
296
|
+
OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
|
297
|
+
return false;
|
298
|
+
}
|
300
299
|
}
|
301
300
|
}
|
302
301
|
|
303
|
-
X509
|
304
|
-
for (CRYPTO_BUFFER *cert : sess->certs) {
|
302
|
+
bssl::UniquePtr<X509> leaf;
|
303
|
+
for (CRYPTO_BUFFER *cert : sess->certs.get()) {
|
305
304
|
UniquePtr<X509> x509(X509_parse_from_buffer(cert));
|
306
305
|
if (!x509) {
|
307
306
|
OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
|
308
|
-
return
|
307
|
+
return false;
|
309
308
|
}
|
310
309
|
if (leaf == nullptr) {
|
311
|
-
leaf = x509
|
310
|
+
leaf = UpRef(x509);
|
311
|
+
} else if (chain_without_leaf &&
|
312
|
+
!PushToStack(chain_without_leaf.get(), UpRef(x509))) {
|
313
|
+
OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
|
314
|
+
return false;
|
312
315
|
}
|
313
316
|
if (!PushToStack(chain.get(), std::move(x509))) {
|
314
317
|
OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
|
315
|
-
return
|
318
|
+
return false;
|
316
319
|
}
|
317
320
|
}
|
318
321
|
|
319
322
|
sk_X509_pop_free(sess->x509_chain, X509_free);
|
320
323
|
sess->x509_chain = chain.release();
|
324
|
+
|
321
325
|
sk_X509_pop_free(sess->x509_chain_without_leaf, X509_free);
|
322
|
-
sess->x509_chain_without_leaf =
|
326
|
+
sess->x509_chain_without_leaf = chain_without_leaf.release();
|
323
327
|
|
324
328
|
X509_free(sess->x509_peer);
|
325
|
-
|
326
|
-
|
327
|
-
}
|
328
|
-
sess->x509_peer = leaf;
|
329
|
-
return 1;
|
329
|
+
sess->x509_peer = leaf.release();
|
330
|
+
return true;
|
330
331
|
}
|
331
332
|
|
332
|
-
static
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
new_session->x509_peer = session->x509_peer;
|
337
|
-
}
|
338
|
-
if (session->x509_chain != NULL) {
|
333
|
+
static bool ssl_crypto_x509_session_dup(SSL_SESSION *new_session,
|
334
|
+
const SSL_SESSION *session) {
|
335
|
+
new_session->x509_peer = UpRef(session->x509_peer).release();
|
336
|
+
if (session->x509_chain != nullptr) {
|
339
337
|
new_session->x509_chain = X509_chain_up_ref(session->x509_chain);
|
340
|
-
if (new_session->x509_chain ==
|
341
|
-
return
|
338
|
+
if (new_session->x509_chain == nullptr) {
|
339
|
+
return false;
|
340
|
+
}
|
341
|
+
}
|
342
|
+
if (session->x509_chain_without_leaf != nullptr) {
|
343
|
+
new_session->x509_chain_without_leaf =
|
344
|
+
X509_chain_up_ref(session->x509_chain_without_leaf);
|
345
|
+
if (new_session->x509_chain_without_leaf == nullptr) {
|
346
|
+
return false;
|
342
347
|
}
|
343
348
|
}
|
344
349
|
|
345
|
-
return
|
350
|
+
return true;
|
346
351
|
}
|
347
352
|
|
348
353
|
static void ssl_crypto_x509_session_clear(SSL_SESSION *session) {
|
349
354
|
X509_free(session->x509_peer);
|
350
|
-
session->x509_peer =
|
355
|
+
session->x509_peer = nullptr;
|
351
356
|
sk_X509_pop_free(session->x509_chain, X509_free);
|
352
|
-
session->x509_chain =
|
357
|
+
session->x509_chain = nullptr;
|
353
358
|
sk_X509_pop_free(session->x509_chain_without_leaf, X509_free);
|
354
|
-
session->x509_chain_without_leaf =
|
359
|
+
session->x509_chain_without_leaf = nullptr;
|
355
360
|
}
|
356
361
|
|
357
|
-
static
|
358
|
-
|
359
|
-
|
362
|
+
static bool ssl_crypto_x509_session_verify_cert_chain(SSL_SESSION *session,
|
363
|
+
SSL_HANDSHAKE *hs,
|
364
|
+
uint8_t *out_alert) {
|
360
365
|
*out_alert = SSL_AD_INTERNAL_ERROR;
|
361
366
|
STACK_OF(X509) *const cert_chain = session->x509_chain;
|
362
|
-
if (cert_chain ==
|
363
|
-
return
|
367
|
+
if (cert_chain == nullptr || sk_X509_num(cert_chain) == 0) {
|
368
|
+
return false;
|
364
369
|
}
|
365
370
|
|
366
|
-
|
367
|
-
|
368
|
-
|
371
|
+
SSL_CTX *ssl_ctx = hs->ssl->ctx.get();
|
372
|
+
X509_STORE *verify_store = ssl_ctx->cert_store;
|
373
|
+
if (hs->config->cert->verify_store != nullptr) {
|
374
|
+
verify_store = hs->config->cert->verify_store;
|
369
375
|
}
|
370
376
|
|
371
377
|
X509 *leaf = sk_X509_value(cert_chain, 0);
|
372
378
|
ScopedX509_STORE_CTX ctx;
|
373
|
-
if (!X509_STORE_CTX_init(ctx.get(), verify_store, leaf, cert_chain)
|
379
|
+
if (!X509_STORE_CTX_init(ctx.get(), verify_store, leaf, cert_chain) ||
|
380
|
+
!X509_STORE_CTX_set_ex_data(
|
381
|
+
ctx.get(), SSL_get_ex_data_X509_STORE_CTX_idx(), hs->ssl) ||
|
382
|
+
// We need to inherit the verify parameters. These can be determined by
|
383
|
+
// the context: if its a server it will verify SSL client certificates or
|
384
|
+
// vice versa.
|
385
|
+
!X509_STORE_CTX_set_default(
|
386
|
+
ctx.get(), hs->ssl->server ? "ssl_client" : "ssl_server") ||
|
387
|
+
// Anything non-default in "param" should overwrite anything in the ctx.
|
388
|
+
!X509_VERIFY_PARAM_set1(X509_STORE_CTX_get0_param(ctx.get()),
|
389
|
+
hs->config->param)) {
|
374
390
|
OPENSSL_PUT_ERROR(SSL, ERR_R_X509_LIB);
|
375
|
-
return
|
391
|
+
return false;
|
376
392
|
}
|
377
|
-
if (!X509_STORE_CTX_set_ex_data(ctx.get(),
|
378
|
-
SSL_get_ex_data_X509_STORE_CTX_idx(), ssl)) {
|
379
|
-
return 0;
|
380
|
-
}
|
381
|
-
|
382
|
-
// We need to inherit the verify parameters. These can be determined by the
|
383
|
-
// context: if its a server it will verify SSL client certificates or vice
|
384
|
-
// versa.
|
385
|
-
X509_STORE_CTX_set_default(ctx.get(),
|
386
|
-
ssl->server ? "ssl_client" : "ssl_server");
|
387
393
|
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
if (ssl->verify_callback) {
|
392
|
-
X509_STORE_CTX_set_verify_cb(ctx.get(), ssl->verify_callback);
|
394
|
+
if (hs->config->verify_callback) {
|
395
|
+
X509_STORE_CTX_set_verify_cb(ctx.get(), hs->config->verify_callback);
|
393
396
|
}
|
394
397
|
|
395
398
|
int verify_ret;
|
396
|
-
if (
|
399
|
+
if (ssl_ctx->app_verify_callback != nullptr) {
|
397
400
|
verify_ret =
|
398
|
-
|
401
|
+
ssl_ctx->app_verify_callback(ctx.get(), ssl_ctx->app_verify_arg);
|
399
402
|
} else {
|
400
403
|
verify_ret = X509_verify_cert(ctx.get());
|
401
404
|
}
|
@@ -403,60 +406,61 @@ static int ssl_crypto_x509_session_verify_cert_chain(SSL_SESSION *session,
|
|
403
406
|
session->verify_result = ctx->error;
|
404
407
|
|
405
408
|
// If |SSL_VERIFY_NONE|, the error is non-fatal, but we keep the result.
|
406
|
-
if (verify_ret <= 0 &&
|
409
|
+
if (verify_ret <= 0 && hs->config->verify_mode != SSL_VERIFY_NONE) {
|
407
410
|
*out_alert = SSL_alert_from_verify_result(ctx->error);
|
408
|
-
return
|
411
|
+
return false;
|
409
412
|
}
|
410
413
|
|
411
414
|
ERR_clear_error();
|
412
|
-
return
|
415
|
+
return true;
|
413
416
|
}
|
414
417
|
|
415
418
|
static void ssl_crypto_x509_hs_flush_cached_ca_names(SSL_HANDSHAKE *hs) {
|
416
419
|
sk_X509_NAME_pop_free(hs->cached_x509_ca_names, X509_NAME_free);
|
417
|
-
hs->cached_x509_ca_names =
|
420
|
+
hs->cached_x509_ca_names = nullptr;
|
418
421
|
}
|
419
422
|
|
420
|
-
static
|
421
|
-
|
422
|
-
if (
|
423
|
-
return
|
423
|
+
static bool ssl_crypto_x509_ssl_new(SSL_HANDSHAKE *hs) {
|
424
|
+
hs->config->param = X509_VERIFY_PARAM_new();
|
425
|
+
if (hs->config->param == nullptr) {
|
426
|
+
return false;
|
424
427
|
}
|
425
|
-
X509_VERIFY_PARAM_inherit(
|
426
|
-
return
|
428
|
+
X509_VERIFY_PARAM_inherit(hs->config->param, hs->ssl->ctx->param);
|
429
|
+
return true;
|
427
430
|
}
|
428
431
|
|
429
|
-
static void ssl_crypto_x509_ssl_flush_cached_client_CA(
|
430
|
-
sk_X509_NAME_pop_free(
|
431
|
-
|
432
|
+
static void ssl_crypto_x509_ssl_flush_cached_client_CA(SSL_CONFIG *cfg) {
|
433
|
+
sk_X509_NAME_pop_free(cfg->cached_x509_client_CA, X509_NAME_free);
|
434
|
+
cfg->cached_x509_client_CA = nullptr;
|
432
435
|
}
|
433
436
|
|
434
|
-
static void
|
435
|
-
|
436
|
-
|
437
|
+
static void ssl_crypto_x509_ssl_config_free(SSL_CONFIG *cfg) {
|
438
|
+
sk_X509_NAME_pop_free(cfg->cached_x509_client_CA, X509_NAME_free);
|
439
|
+
cfg->cached_x509_client_CA = nullptr;
|
440
|
+
X509_VERIFY_PARAM_free(cfg->param);
|
437
441
|
}
|
438
442
|
|
439
|
-
static
|
443
|
+
static bool ssl_crypto_x509_ssl_auto_chain_if_needed(SSL_HANDSHAKE *hs) {
|
440
444
|
// Only build a chain if there are no intermediates configured and the feature
|
441
445
|
// isn't disabled.
|
442
|
-
if ((ssl->mode & SSL_MODE_NO_AUTO_CHAIN) ||
|
443
|
-
!ssl_has_certificate(
|
444
|
-
|
445
|
-
|
446
|
-
return 1;
|
446
|
+
if ((hs->ssl->mode & SSL_MODE_NO_AUTO_CHAIN) ||
|
447
|
+
!ssl_has_certificate(hs) || hs->config->cert->chain == NULL ||
|
448
|
+
sk_CRYPTO_BUFFER_num(hs->config->cert->chain.get()) > 1) {
|
449
|
+
return true;
|
447
450
|
}
|
448
451
|
|
449
|
-
UniquePtr<X509> leaf(
|
450
|
-
|
452
|
+
UniquePtr<X509> leaf(X509_parse_from_buffer(
|
453
|
+
sk_CRYPTO_BUFFER_value(hs->config->cert->chain.get(), 0)));
|
451
454
|
if (!leaf) {
|
452
455
|
OPENSSL_PUT_ERROR(SSL, ERR_R_X509_LIB);
|
453
|
-
return
|
456
|
+
return false;
|
454
457
|
}
|
455
458
|
|
456
459
|
ScopedX509_STORE_CTX ctx;
|
457
|
-
if (!X509_STORE_CTX_init(ctx.get(), ssl->ctx->cert_store, leaf.get(),
|
460
|
+
if (!X509_STORE_CTX_init(ctx.get(), hs->ssl->ctx->cert_store, leaf.get(),
|
461
|
+
NULL)) {
|
458
462
|
OPENSSL_PUT_ERROR(SSL, ERR_R_X509_LIB);
|
459
|
-
return
|
463
|
+
return false;
|
460
464
|
}
|
461
465
|
|
462
466
|
// Attempt to build a chain, ignoring the result.
|
@@ -466,24 +470,24 @@ static int ssl_crypto_x509_ssl_auto_chain_if_needed(SSL *ssl) {
|
|
466
470
|
// Remove the leaf from the generated chain.
|
467
471
|
X509_free(sk_X509_shift(ctx->chain));
|
468
472
|
|
469
|
-
if (!ssl_cert_set_chain(
|
470
|
-
return
|
473
|
+
if (!ssl_cert_set_chain(hs->config->cert.get(), ctx->chain)) {
|
474
|
+
return false;
|
471
475
|
}
|
472
476
|
|
473
|
-
ssl_crypto_x509_cert_flush_cached_chain(
|
477
|
+
ssl_crypto_x509_cert_flush_cached_chain(hs->config->cert.get());
|
474
478
|
|
475
|
-
return
|
479
|
+
return true;
|
476
480
|
}
|
477
481
|
|
478
482
|
static void ssl_crypto_x509_ssl_ctx_flush_cached_client_CA(SSL_CTX *ctx) {
|
479
483
|
sk_X509_NAME_pop_free(ctx->cached_x509_client_CA, X509_NAME_free);
|
480
|
-
ctx->cached_x509_client_CA =
|
484
|
+
ctx->cached_x509_client_CA = nullptr;
|
481
485
|
}
|
482
486
|
|
483
|
-
static
|
487
|
+
static bool ssl_crypto_x509_ssl_ctx_new(SSL_CTX *ctx) {
|
484
488
|
ctx->cert_store = X509_STORE_new();
|
485
489
|
ctx->param = X509_VERIFY_PARAM_new();
|
486
|
-
return (ctx->cert_store !=
|
490
|
+
return (ctx->cert_store != nullptr && ctx->param != nullptr);
|
487
491
|
}
|
488
492
|
|
489
493
|
static void ssl_crypto_x509_ssl_ctx_free(SSL_CTX *ctx) {
|
@@ -505,7 +509,7 @@ const SSL_X509_METHOD ssl_crypto_x509_method = {
|
|
505
509
|
ssl_crypto_x509_session_verify_cert_chain,
|
506
510
|
ssl_crypto_x509_hs_flush_cached_ca_names,
|
507
511
|
ssl_crypto_x509_ssl_new,
|
508
|
-
|
512
|
+
ssl_crypto_x509_ssl_config_free,
|
509
513
|
ssl_crypto_x509_ssl_flush_cached_client_CA,
|
510
514
|
ssl_crypto_x509_ssl_auto_chain_if_needed,
|
511
515
|
ssl_crypto_x509_ssl_ctx_new,
|
@@ -513,7 +517,7 @@ const SSL_X509_METHOD ssl_crypto_x509_method = {
|
|
513
517
|
ssl_crypto_x509_ssl_ctx_flush_cached_client_CA,
|
514
518
|
};
|
515
519
|
|
516
|
-
|
520
|
+
BSSL_NAMESPACE_END
|
517
521
|
|
518
522
|
using namespace bssl;
|
519
523
|
|
@@ -532,39 +536,17 @@ X509 *SSL_get_peer_certificate(const SSL *ssl) {
|
|
532
536
|
|
533
537
|
STACK_OF(X509) *SSL_get_peer_cert_chain(const SSL *ssl) {
|
534
538
|
check_ssl_x509_method(ssl);
|
535
|
-
if (ssl ==
|
536
|
-
return
|
539
|
+
if (ssl == nullptr) {
|
540
|
+
return nullptr;
|
537
541
|
}
|
538
542
|
SSL_SESSION *session = SSL_get_session(ssl);
|
539
|
-
if (session ==
|
540
|
-
|
541
|
-
return NULL;
|
542
|
-
}
|
543
|
-
|
544
|
-
if (!ssl->server) {
|
545
|
-
return session->x509_chain;
|
543
|
+
if (session == nullptr) {
|
544
|
+
return nullptr;
|
546
545
|
}
|
547
546
|
|
548
547
|
// OpenSSL historically didn't include the leaf certificate in the returned
|
549
548
|
// certificate chain, but only for servers.
|
550
|
-
|
551
|
-
session->x509_chain_without_leaf = sk_X509_new_null();
|
552
|
-
if (session->x509_chain_without_leaf == NULL) {
|
553
|
-
return NULL;
|
554
|
-
}
|
555
|
-
|
556
|
-
for (size_t i = 1; i < sk_X509_num(session->x509_chain); i++) {
|
557
|
-
X509 *cert = sk_X509_value(session->x509_chain, i);
|
558
|
-
if (!sk_X509_push(session->x509_chain_without_leaf, cert)) {
|
559
|
-
sk_X509_pop_free(session->x509_chain_without_leaf, X509_free);
|
560
|
-
session->x509_chain_without_leaf = NULL;
|
561
|
-
return NULL;
|
562
|
-
}
|
563
|
-
X509_up_ref(cert);
|
564
|
-
}
|
565
|
-
}
|
566
|
-
|
567
|
-
return session->x509_chain_without_leaf;
|
549
|
+
return ssl->server ? session->x509_chain_without_leaf : session->x509_chain;
|
568
550
|
}
|
569
551
|
|
570
552
|
STACK_OF(X509) *SSL_get_peer_full_cert_chain(const SSL *ssl) {
|
@@ -584,7 +566,10 @@ int SSL_CTX_set_purpose(SSL_CTX *ctx, int purpose) {
|
|
584
566
|
|
585
567
|
int SSL_set_purpose(SSL *ssl, int purpose) {
|
586
568
|
check_ssl_x509_method(ssl);
|
587
|
-
|
569
|
+
if (!ssl->config) {
|
570
|
+
return 0;
|
571
|
+
}
|
572
|
+
return X509_VERIFY_PARAM_set_purpose(ssl->config->param, purpose);
|
588
573
|
}
|
589
574
|
|
590
575
|
int SSL_CTX_set_trust(SSL_CTX *ctx, int trust) {
|
@@ -594,7 +579,10 @@ int SSL_CTX_set_trust(SSL_CTX *ctx, int trust) {
|
|
594
579
|
|
595
580
|
int SSL_set_trust(SSL *ssl, int trust) {
|
596
581
|
check_ssl_x509_method(ssl);
|
597
|
-
|
582
|
+
if (!ssl->config) {
|
583
|
+
return 0;
|
584
|
+
}
|
585
|
+
return X509_VERIFY_PARAM_set_trust(ssl->config->param, trust);
|
598
586
|
}
|
599
587
|
|
600
588
|
int SSL_CTX_set1_param(SSL_CTX *ctx, const X509_VERIFY_PARAM *param) {
|
@@ -604,7 +592,10 @@ int SSL_CTX_set1_param(SSL_CTX *ctx, const X509_VERIFY_PARAM *param) {
|
|
604
592
|
|
605
593
|
int SSL_set1_param(SSL *ssl, const X509_VERIFY_PARAM *param) {
|
606
594
|
check_ssl_x509_method(ssl);
|
607
|
-
|
595
|
+
if (!ssl->config) {
|
596
|
+
return 0;
|
597
|
+
}
|
598
|
+
return X509_VERIFY_PARAM_set1(ssl->config->param, param);
|
608
599
|
}
|
609
600
|
|
610
601
|
X509_VERIFY_PARAM *SSL_CTX_get0_param(SSL_CTX *ctx) {
|
@@ -614,17 +605,29 @@ X509_VERIFY_PARAM *SSL_CTX_get0_param(SSL_CTX *ctx) {
|
|
614
605
|
|
615
606
|
X509_VERIFY_PARAM *SSL_get0_param(SSL *ssl) {
|
616
607
|
check_ssl_x509_method(ssl);
|
617
|
-
|
608
|
+
if (!ssl->config) {
|
609
|
+
assert(ssl->config);
|
610
|
+
return 0;
|
611
|
+
}
|
612
|
+
return ssl->config->param;
|
618
613
|
}
|
619
614
|
|
620
615
|
int SSL_get_verify_depth(const SSL *ssl) {
|
621
616
|
check_ssl_x509_method(ssl);
|
622
|
-
|
617
|
+
if (!ssl->config) {
|
618
|
+
assert(ssl->config);
|
619
|
+
return 0;
|
620
|
+
}
|
621
|
+
return X509_VERIFY_PARAM_get_depth(ssl->config->param);
|
623
622
|
}
|
624
623
|
|
625
624
|
int (*SSL_get_verify_callback(const SSL *ssl))(int, X509_STORE_CTX *) {
|
626
625
|
check_ssl_x509_method(ssl);
|
627
|
-
|
626
|
+
if (!ssl->config) {
|
627
|
+
assert(ssl->config);
|
628
|
+
return 0;
|
629
|
+
}
|
630
|
+
return ssl->config->verify_callback;
|
628
631
|
}
|
629
632
|
|
630
633
|
int SSL_CTX_get_verify_mode(const SSL_CTX *ctx) {
|
@@ -646,15 +649,21 @@ int (*SSL_CTX_get_verify_callback(const SSL_CTX *ctx))(
|
|
646
649
|
void SSL_set_verify(SSL *ssl, int mode,
|
647
650
|
int (*callback)(int ok, X509_STORE_CTX *store_ctx)) {
|
648
651
|
check_ssl_x509_method(ssl);
|
649
|
-
ssl->
|
652
|
+
if (!ssl->config) {
|
653
|
+
return;
|
654
|
+
}
|
655
|
+
ssl->config->verify_mode = mode;
|
650
656
|
if (callback != NULL) {
|
651
|
-
ssl->verify_callback = callback;
|
657
|
+
ssl->config->verify_callback = callback;
|
652
658
|
}
|
653
659
|
}
|
654
660
|
|
655
661
|
void SSL_set_verify_depth(SSL *ssl, int depth) {
|
656
662
|
check_ssl_x509_method(ssl);
|
657
|
-
|
663
|
+
if (!ssl->config) {
|
664
|
+
return;
|
665
|
+
}
|
666
|
+
X509_VERIFY_PARAM_set_depth(ssl->config->param, depth);
|
658
667
|
}
|
659
668
|
|
660
669
|
void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx,
|
@@ -732,12 +741,15 @@ static int ssl_use_certificate(CERT *cert, X509 *x) {
|
|
732
741
|
|
733
742
|
int SSL_use_certificate(SSL *ssl, X509 *x) {
|
734
743
|
check_ssl_x509_method(ssl);
|
735
|
-
|
744
|
+
if (!ssl->config) {
|
745
|
+
return 0;
|
746
|
+
}
|
747
|
+
return ssl_use_certificate(ssl->config->cert.get(), x);
|
736
748
|
}
|
737
749
|
|
738
750
|
int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x) {
|
739
751
|
check_ssl_ctx_x509_method(ctx);
|
740
|
-
return ssl_use_certificate(ctx->cert, x);
|
752
|
+
return ssl_use_certificate(ctx->cert.get(), x);
|
741
753
|
}
|
742
754
|
|
743
755
|
// ssl_cert_cache_leaf_cert sets |cert->x509_leaf|, if currently NULL, from the
|
@@ -750,7 +762,7 @@ static int ssl_cert_cache_leaf_cert(CERT *cert) {
|
|
750
762
|
return 1;
|
751
763
|
}
|
752
764
|
|
753
|
-
CRYPTO_BUFFER *leaf = sk_CRYPTO_BUFFER_value(cert->chain, 0);
|
765
|
+
CRYPTO_BUFFER *leaf = sk_CRYPTO_BUFFER_value(cert->chain.get(), 0);
|
754
766
|
if (!leaf) {
|
755
767
|
return 1;
|
756
768
|
}
|
@@ -770,13 +782,17 @@ static X509 *ssl_cert_get0_leaf(CERT *cert) {
|
|
770
782
|
|
771
783
|
X509 *SSL_get_certificate(const SSL *ssl) {
|
772
784
|
check_ssl_x509_method(ssl);
|
773
|
-
|
785
|
+
if (!ssl->config) {
|
786
|
+
assert(ssl->config);
|
787
|
+
return 0;
|
788
|
+
}
|
789
|
+
return ssl_cert_get0_leaf(ssl->config->cert.get());
|
774
790
|
}
|
775
791
|
|
776
792
|
X509 *SSL_CTX_get0_certificate(const SSL_CTX *ctx) {
|
777
793
|
check_ssl_ctx_x509_method(ctx);
|
778
794
|
MutexWriteLock lock(const_cast<CRYPTO_MUTEX*>(&ctx->lock));
|
779
|
-
return ssl_cert_get0_leaf(ctx->cert);
|
795
|
+
return ssl_cert_get0_leaf(ctx->cert.get());
|
780
796
|
}
|
781
797
|
|
782
798
|
static int ssl_cert_set0_chain(CERT *cert, STACK_OF(X509) *chain) {
|
@@ -807,14 +823,13 @@ static int ssl_cert_append_cert(CERT *cert, X509 *x509) {
|
|
807
823
|
}
|
808
824
|
|
809
825
|
if (cert->chain != NULL) {
|
810
|
-
return PushToStack(cert->chain, std::move(buffer));
|
826
|
+
return PushToStack(cert->chain.get(), std::move(buffer));
|
811
827
|
}
|
812
828
|
|
813
829
|
cert->chain = new_leafless_chain();
|
814
|
-
if (cert->chain
|
815
|
-
!PushToStack(cert->chain, std::move(buffer))) {
|
816
|
-
|
817
|
-
cert->chain = NULL;
|
830
|
+
if (!cert->chain ||
|
831
|
+
!PushToStack(cert->chain.get(), std::move(buffer))) {
|
832
|
+
cert->chain.reset();
|
818
833
|
return 0;
|
819
834
|
}
|
820
835
|
|
@@ -843,32 +858,38 @@ static int ssl_cert_add1_chain_cert(CERT *cert, X509 *x509) {
|
|
843
858
|
|
844
859
|
int SSL_CTX_set0_chain(SSL_CTX *ctx, STACK_OF(X509) *chain) {
|
845
860
|
check_ssl_ctx_x509_method(ctx);
|
846
|
-
return ssl_cert_set0_chain(ctx->cert, chain);
|
861
|
+
return ssl_cert_set0_chain(ctx->cert.get(), chain);
|
847
862
|
}
|
848
863
|
|
849
864
|
int SSL_CTX_set1_chain(SSL_CTX *ctx, STACK_OF(X509) *chain) {
|
850
865
|
check_ssl_ctx_x509_method(ctx);
|
851
|
-
return ssl_cert_set1_chain(ctx->cert, chain);
|
866
|
+
return ssl_cert_set1_chain(ctx->cert.get(), chain);
|
852
867
|
}
|
853
868
|
|
854
869
|
int SSL_set0_chain(SSL *ssl, STACK_OF(X509) *chain) {
|
855
870
|
check_ssl_x509_method(ssl);
|
856
|
-
|
871
|
+
if (!ssl->config) {
|
872
|
+
return 0;
|
873
|
+
}
|
874
|
+
return ssl_cert_set0_chain(ssl->config->cert.get(), chain);
|
857
875
|
}
|
858
876
|
|
859
877
|
int SSL_set1_chain(SSL *ssl, STACK_OF(X509) *chain) {
|
860
878
|
check_ssl_x509_method(ssl);
|
861
|
-
|
879
|
+
if (!ssl->config) {
|
880
|
+
return 0;
|
881
|
+
}
|
882
|
+
return ssl_cert_set1_chain(ssl->config->cert.get(), chain);
|
862
883
|
}
|
863
884
|
|
864
885
|
int SSL_CTX_add0_chain_cert(SSL_CTX *ctx, X509 *x509) {
|
865
886
|
check_ssl_ctx_x509_method(ctx);
|
866
|
-
return ssl_cert_add0_chain_cert(ctx->cert, x509);
|
887
|
+
return ssl_cert_add0_chain_cert(ctx->cert.get(), x509);
|
867
888
|
}
|
868
889
|
|
869
890
|
int SSL_CTX_add1_chain_cert(SSL_CTX *ctx, X509 *x509) {
|
870
891
|
check_ssl_ctx_x509_method(ctx);
|
871
|
-
return ssl_cert_add1_chain_cert(ctx->cert, x509);
|
892
|
+
return ssl_cert_add1_chain_cert(ctx->cert.get(), x509);
|
872
893
|
}
|
873
894
|
|
874
895
|
int SSL_CTX_add_extra_chain_cert(SSL_CTX *ctx, X509 *x509) {
|
@@ -878,12 +899,18 @@ int SSL_CTX_add_extra_chain_cert(SSL_CTX *ctx, X509 *x509) {
|
|
878
899
|
|
879
900
|
int SSL_add0_chain_cert(SSL *ssl, X509 *x509) {
|
880
901
|
check_ssl_x509_method(ssl);
|
881
|
-
|
902
|
+
if (!ssl->config) {
|
903
|
+
return 0;
|
904
|
+
}
|
905
|
+
return ssl_cert_add0_chain_cert(ssl->config->cert.get(), x509);
|
882
906
|
}
|
883
907
|
|
884
908
|
int SSL_add1_chain_cert(SSL *ssl, X509 *x509) {
|
885
909
|
check_ssl_x509_method(ssl);
|
886
|
-
|
910
|
+
if (!ssl->config) {
|
911
|
+
return 0;
|
912
|
+
}
|
913
|
+
return ssl_cert_add1_chain_cert(ssl->config->cert.get(), x509);
|
887
914
|
}
|
888
915
|
|
889
916
|
int SSL_CTX_clear_chain_certs(SSL_CTX *ctx) {
|
@@ -906,9 +933,9 @@ int SSL_clear_chain_certs(SSL *ssl) {
|
|
906
933
|
static int ssl_cert_cache_chain_certs(CERT *cert) {
|
907
934
|
assert(cert->x509_method);
|
908
935
|
|
909
|
-
if (cert->x509_chain !=
|
910
|
-
cert->chain ==
|
911
|
-
sk_CRYPTO_BUFFER_num(cert->chain) < 2) {
|
936
|
+
if (cert->x509_chain != nullptr ||
|
937
|
+
cert->chain == nullptr ||
|
938
|
+
sk_CRYPTO_BUFFER_num(cert->chain.get()) < 2) {
|
912
939
|
return 1;
|
913
940
|
}
|
914
941
|
|
@@ -917,8 +944,8 @@ static int ssl_cert_cache_chain_certs(CERT *cert) {
|
|
917
944
|
return 0;
|
918
945
|
}
|
919
946
|
|
920
|
-
for (size_t i = 1; i < sk_CRYPTO_BUFFER_num(cert->chain); i++) {
|
921
|
-
CRYPTO_BUFFER *buffer = sk_CRYPTO_BUFFER_value(cert->chain, i);
|
947
|
+
for (size_t i = 1; i < sk_CRYPTO_BUFFER_num(cert->chain.get()); i++) {
|
948
|
+
CRYPTO_BUFFER *buffer = sk_CRYPTO_BUFFER_value(cert->chain.get(), i);
|
922
949
|
UniquePtr<X509> x509(X509_parse_from_buffer(buffer));
|
923
950
|
if (!x509 ||
|
924
951
|
!PushToStack(chain.get(), std::move(x509))) {
|
@@ -933,7 +960,7 @@ static int ssl_cert_cache_chain_certs(CERT *cert) {
|
|
933
960
|
int SSL_CTX_get0_chain_certs(const SSL_CTX *ctx, STACK_OF(X509) **out_chain) {
|
934
961
|
check_ssl_ctx_x509_method(ctx);
|
935
962
|
MutexWriteLock lock(const_cast<CRYPTO_MUTEX*>(&ctx->lock));
|
936
|
-
if (!ssl_cert_cache_chain_certs(ctx->cert)) {
|
963
|
+
if (!ssl_cert_cache_chain_certs(ctx->cert.get())) {
|
937
964
|
*out_chain = NULL;
|
938
965
|
return 0;
|
939
966
|
}
|
@@ -949,26 +976,38 @@ int SSL_CTX_get_extra_chain_certs(const SSL_CTX *ctx,
|
|
949
976
|
|
950
977
|
int SSL_get0_chain_certs(const SSL *ssl, STACK_OF(X509) **out_chain) {
|
951
978
|
check_ssl_x509_method(ssl);
|
952
|
-
if (!
|
979
|
+
if (!ssl->config) {
|
980
|
+
assert(ssl->config);
|
981
|
+
return 0;
|
982
|
+
}
|
983
|
+
if (!ssl_cert_cache_chain_certs(ssl->config->cert.get())) {
|
953
984
|
*out_chain = NULL;
|
954
985
|
return 0;
|
955
986
|
}
|
956
987
|
|
957
|
-
*out_chain = ssl->cert->x509_chain;
|
988
|
+
*out_chain = ssl->config->cert->x509_chain;
|
958
989
|
return 1;
|
959
990
|
}
|
960
991
|
|
961
|
-
static SSL_SESSION *ssl_session_new_with_crypto_x509(void) {
|
962
|
-
return ssl_session_new(&ssl_crypto_x509_method).release();
|
963
|
-
}
|
964
|
-
|
965
992
|
SSL_SESSION *d2i_SSL_SESSION_bio(BIO *bio, SSL_SESSION **out) {
|
966
|
-
|
967
|
-
|
993
|
+
uint8_t *data;
|
994
|
+
size_t len;
|
995
|
+
if (!BIO_read_asn1(bio, &data, &len, 1024 * 1024)) {
|
996
|
+
return 0;
|
997
|
+
}
|
998
|
+
bssl::UniquePtr<uint8_t> free_data(data);
|
999
|
+
const uint8_t *ptr = data;
|
1000
|
+
return d2i_SSL_SESSION(out, &ptr, static_cast<long>(len));
|
968
1001
|
}
|
969
1002
|
|
970
1003
|
int i2d_SSL_SESSION_bio(BIO *bio, const SSL_SESSION *session) {
|
971
|
-
|
1004
|
+
uint8_t *data;
|
1005
|
+
size_t len;
|
1006
|
+
if (!SSL_SESSION_to_bytes(session, &data, &len)) {
|
1007
|
+
return 0;
|
1008
|
+
}
|
1009
|
+
bssl::UniquePtr<uint8_t> free_data(data);
|
1010
|
+
return BIO_write_all(bio, data, len);
|
972
1011
|
}
|
973
1012
|
|
974
1013
|
IMPLEMENT_PEM_rw(SSL_SESSION, SSL_SESSION, PEM_STRING_SSL_SESSION, SSL_SESSION)
|
@@ -1000,7 +1039,7 @@ STACK_OF(X509_NAME) *SSL_dup_CA_list(STACK_OF(X509_NAME) *list) {
|
|
1000
1039
|
return sk_X509_NAME_deep_copy(list, X509_NAME_dup, X509_NAME_free);
|
1001
1040
|
}
|
1002
1041
|
|
1003
|
-
static void set_client_CA_list(STACK_OF(CRYPTO_BUFFER)
|
1042
|
+
static void set_client_CA_list(UniquePtr<STACK_OF(CRYPTO_BUFFER)> *ca_list,
|
1004
1043
|
const STACK_OF(X509_NAME) *name_list,
|
1005
1044
|
CRYPTO_BUFFER_POOL *pool) {
|
1006
1045
|
UniquePtr<STACK_OF(CRYPTO_BUFFER)> buffers(sk_CRYPTO_BUFFER_new_null());
|
@@ -1023,14 +1062,16 @@ static void set_client_CA_list(STACK_OF(CRYPTO_BUFFER) **ca_list,
|
|
1023
1062
|
}
|
1024
1063
|
}
|
1025
1064
|
|
1026
|
-
|
1027
|
-
*ca_list = buffers.release();
|
1065
|
+
*ca_list = std::move(buffers);
|
1028
1066
|
}
|
1029
1067
|
|
1030
1068
|
void SSL_set_client_CA_list(SSL *ssl, STACK_OF(X509_NAME) *name_list) {
|
1031
1069
|
check_ssl_x509_method(ssl);
|
1032
|
-
ssl->
|
1033
|
-
|
1070
|
+
if (!ssl->config) {
|
1071
|
+
return;
|
1072
|
+
}
|
1073
|
+
ssl->ctx->x509_method->ssl_flush_cached_client_CA(ssl->config.get());
|
1074
|
+
set_client_CA_list(&ssl->config->client_CA, name_list, ssl->ctx->pool);
|
1034
1075
|
sk_X509_NAME_pop_free(name_list, X509_NAME_free);
|
1035
1076
|
}
|
1036
1077
|
|
@@ -1075,6 +1116,10 @@ static STACK_OF(X509_NAME) *
|
|
1075
1116
|
|
1076
1117
|
STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *ssl) {
|
1077
1118
|
check_ssl_x509_method(ssl);
|
1119
|
+
if (!ssl->config) {
|
1120
|
+
assert(ssl->config);
|
1121
|
+
return NULL;
|
1122
|
+
}
|
1078
1123
|
// For historical reasons, this function is used both to query configuration
|
1079
1124
|
// state on a server as well as handshake state on a client. However, whether
|
1080
1125
|
// |ssl| is a client or server is not known until explicitly configured with
|
@@ -1089,11 +1134,12 @@ STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *ssl) {
|
|
1089
1134
|
return NULL;
|
1090
1135
|
}
|
1091
1136
|
|
1092
|
-
if (ssl->client_CA != NULL) {
|
1137
|
+
if (ssl->config->client_CA != NULL) {
|
1093
1138
|
return buffer_names_to_x509(
|
1094
|
-
ssl->client_CA
|
1139
|
+
ssl->config->client_CA.get(),
|
1140
|
+
(STACK_OF(X509_NAME) **)&ssl->config->cached_x509_client_CA);
|
1095
1141
|
}
|
1096
|
-
return SSL_CTX_get_client_CA_list(ssl->ctx);
|
1142
|
+
return SSL_CTX_get_client_CA_list(ssl->ctx.get());
|
1097
1143
|
}
|
1098
1144
|
|
1099
1145
|
STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *ctx) {
|
@@ -1102,11 +1148,11 @@ STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *ctx) {
|
|
1102
1148
|
// so it needs to lock around updating |cached_x509_client_CA|.
|
1103
1149
|
MutexWriteLock lock(const_cast<CRYPTO_MUTEX *>(&ctx->lock));
|
1104
1150
|
return buffer_names_to_x509(
|
1105
|
-
ctx->client_CA,
|
1151
|
+
ctx->client_CA.get(),
|
1106
1152
|
const_cast<STACK_OF(X509_NAME) **>(&ctx->cached_x509_client_CA));
|
1107
1153
|
}
|
1108
1154
|
|
1109
|
-
static int add_client_CA(STACK_OF(CRYPTO_BUFFER)
|
1155
|
+
static int add_client_CA(UniquePtr<STACK_OF(CRYPTO_BUFFER)> *names, X509 *x509,
|
1110
1156
|
CRYPTO_BUFFER_POOL *pool) {
|
1111
1157
|
if (x509 == NULL) {
|
1112
1158
|
return 0;
|
@@ -1125,8 +1171,8 @@ static int add_client_CA(STACK_OF(CRYPTO_BUFFER) **names, X509 *x509,
|
|
1125
1171
|
}
|
1126
1172
|
|
1127
1173
|
int alloced = 0;
|
1128
|
-
if (*names ==
|
1129
|
-
|
1174
|
+
if (*names == nullptr) {
|
1175
|
+
names->reset(sk_CRYPTO_BUFFER_new_null());
|
1130
1176
|
alloced = 1;
|
1131
1177
|
|
1132
1178
|
if (*names == NULL) {
|
@@ -1134,10 +1180,9 @@ static int add_client_CA(STACK_OF(CRYPTO_BUFFER) **names, X509 *x509,
|
|
1134
1180
|
}
|
1135
1181
|
}
|
1136
1182
|
|
1137
|
-
if (!PushToStack(
|
1183
|
+
if (!PushToStack(names->get(), std::move(buffer))) {
|
1138
1184
|
if (alloced) {
|
1139
|
-
|
1140
|
-
*names = NULL;
|
1185
|
+
names->reset();
|
1141
1186
|
}
|
1142
1187
|
return 0;
|
1143
1188
|
}
|
@@ -1147,11 +1192,14 @@ static int add_client_CA(STACK_OF(CRYPTO_BUFFER) **names, X509 *x509,
|
|
1147
1192
|
|
1148
1193
|
int SSL_add_client_CA(SSL *ssl, X509 *x509) {
|
1149
1194
|
check_ssl_x509_method(ssl);
|
1150
|
-
if (!
|
1195
|
+
if (!ssl->config) {
|
1196
|
+
return 0;
|
1197
|
+
}
|
1198
|
+
if (!add_client_CA(&ssl->config->client_CA, x509, ssl->ctx->pool)) {
|
1151
1199
|
return 0;
|
1152
1200
|
}
|
1153
1201
|
|
1154
|
-
ssl_crypto_x509_ssl_flush_cached_client_CA(ssl);
|
1202
|
+
ssl_crypto_x509_ssl_flush_cached_client_CA(ssl->config.get());
|
1155
1203
|
return 1;
|
1156
1204
|
}
|
1157
1205
|
|
@@ -1166,7 +1214,14 @@ int SSL_CTX_add_client_CA(SSL_CTX *ctx, X509 *x509) {
|
|
1166
1214
|
}
|
1167
1215
|
|
1168
1216
|
static int do_client_cert_cb(SSL *ssl, void *arg) {
|
1169
|
-
|
1217
|
+
// Should only be called during handshake, but check to be sure.
|
1218
|
+
if (!ssl->config) {
|
1219
|
+
assert(ssl->config);
|
1220
|
+
return -1;
|
1221
|
+
}
|
1222
|
+
|
1223
|
+
if (ssl_has_certificate(ssl->s3->hs.get()) ||
|
1224
|
+
ssl->ctx->client_cert_cb == NULL) {
|
1170
1225
|
return 1;
|
1171
1226
|
}
|
1172
1227
|
|
@@ -1230,12 +1285,18 @@ int SSL_CTX_set1_verify_cert_store(SSL_CTX *ctx, X509_STORE *store) {
|
|
1230
1285
|
|
1231
1286
|
int SSL_set0_verify_cert_store(SSL *ssl, X509_STORE *store) {
|
1232
1287
|
check_ssl_x509_method(ssl);
|
1233
|
-
|
1288
|
+
if (!ssl->config) {
|
1289
|
+
return 0;
|
1290
|
+
}
|
1291
|
+
return set_cert_store(&ssl->config->cert->verify_store, store, 0);
|
1234
1292
|
}
|
1235
1293
|
|
1236
1294
|
int SSL_set1_verify_cert_store(SSL *ssl, X509_STORE *store) {
|
1237
1295
|
check_ssl_x509_method(ssl);
|
1238
|
-
|
1296
|
+
if (!ssl->config) {
|
1297
|
+
return 0;
|
1298
|
+
}
|
1299
|
+
return set_cert_store(&ssl->config->cert->verify_store, store, 1);
|
1239
1300
|
}
|
1240
1301
|
|
1241
1302
|
int SSL_alert_from_verify_result(long result) {
|