grpc 1.0.1 → 1.1.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +3696 -867
- data/etc/roots.pem +39 -111
- data/include/grpc/byte_buffer.h +64 -1
- data/include/grpc/census.h +40 -96
- data/include/grpc/compression.h +2 -1
- data/include/grpc/grpc.h +42 -7
- data/include/grpc/grpc_posix.h +8 -5
- data/include/grpc/impl/codegen/atm.h +3 -0
- data/include/grpc/impl/codegen/atm_gcc_atomic.h +2 -0
- data/include/grpc/impl/codegen/atm_gcc_sync.h +8 -0
- data/include/grpc/impl/codegen/atm_windows.h +4 -0
- data/include/grpc/impl/codegen/byte_buffer_reader.h +4 -4
- data/include/grpc/impl/codegen/compression_types.h +1 -1
- data/include/grpc/impl/codegen/connectivity_state.h +2 -0
- data/include/grpc/impl/codegen/exec_ctx_fwd.h +41 -0
- data/include/grpc/impl/codegen/gpr_slice.h +84 -0
- data/include/grpc/impl/codegen/{alloc.h → gpr_types.h} +30 -29
- data/include/grpc/impl/codegen/grpc_types.h +91 -9
- data/include/grpc/impl/codegen/port_platform.h +25 -92
- data/include/grpc/impl/codegen/slice.h +54 -97
- data/include/grpc/impl/codegen/sync.h +0 -253
- data/include/grpc/module.modulemap +0 -2
- data/include/grpc/slice.h +132 -0
- data/include/grpc/{impl/codegen/slice_buffer.h → slice_buffer.h} +22 -39
- data/include/grpc/support/alloc.h +40 -1
- data/include/grpc/support/log.h +80 -1
- data/include/grpc/support/log_windows.h +2 -0
- data/include/grpc/support/string_util.h +1 -1
- data/include/grpc/support/sync.h +252 -0
- data/include/grpc/support/time.h +67 -1
- data/src/boringssl/err_data.c +639 -627
- data/src/core/ext/census/base_resources.c +71 -0
- data/src/core/ext/census/base_resources.h +39 -0
- data/src/core/ext/census/gen/census.pb.c +26 -29
- data/src/core/ext/census/gen/census.pb.h +68 -67
- data/src/core/ext/census/gen/trace_context.pb.c +81 -0
- data/src/core/ext/census/gen/trace_context.pb.h +99 -0
- data/src/core/ext/census/grpc_filter.c +22 -16
- data/src/core/ext/census/grpc_plugin.c +2 -1
- data/src/core/ext/census/initialize.c +16 -4
- data/src/core/ext/census/mlog.h +1 -1
- data/src/core/ext/census/placeholders.c +0 -45
- data/src/core/ext/census/resource.c +312 -0
- data/src/core/ext/census/resource.h +63 -0
- data/src/core/ext/census/trace_context.c +86 -0
- data/src/core/ext/census/trace_context.h +68 -0
- data/src/core/ext/census/tracing.c +8 -2
- data/src/core/ext/{client_config → client_channel}/channel_connectivity.c +8 -4
- data/src/core/ext/client_channel/client_channel.c +1218 -0
- data/src/core/ext/{client_config → client_channel}/client_channel.h +8 -11
- data/src/core/ext/{client_config → client_channel}/client_channel_factory.c +33 -3
- data/src/core/ext/{client_config → client_channel}/client_channel_factory.h +15 -8
- data/src/core/ext/{client_config/client_config_plugin.c → client_channel/client_channel_plugin.c} +16 -15
- data/src/core/ext/{client_config → client_channel}/connector.c +1 -1
- data/src/core/ext/{client_config → client_channel}/connector.h +5 -8
- data/{include/grpc/support/slice_buffer.h → src/core/ext/client_channel/default_initial_connect_string.c} +4 -5
- data/src/core/ext/client_channel/http_connect_handshaker.c +399 -0
- data/src/core/ext/client_channel/http_connect_handshaker.h +52 -0
- data/src/core/ext/{client_config → client_channel}/initial_connect_string.c +6 -7
- data/src/core/ext/{client_config → client_channel}/initial_connect_string.h +10 -10
- data/src/core/ext/{client_config → client_channel}/lb_policy.c +11 -11
- data/src/core/ext/{client_config → client_channel}/lb_policy.h +68 -27
- data/src/core/ext/client_channel/lb_policy_factory.c +163 -0
- data/src/core/ext/{client_config → client_channel}/lb_policy_factory.h +64 -9
- data/src/core/ext/{client_config → client_channel}/lb_policy_registry.c +6 -4
- data/src/core/ext/{client_config → client_channel}/lb_policy_registry.h +4 -4
- data/src/core/ext/{client_config → client_channel}/parse_address.c +21 -14
- data/src/core/ext/{client_config → client_channel}/parse_address.h +8 -10
- data/src/core/ext/{client_config → client_channel}/resolver.c +3 -4
- data/src/core/ext/{client_config → client_channel}/resolver.h +11 -15
- data/src/core/ext/{client_config → client_channel}/resolver_factory.c +4 -3
- data/src/core/ext/{client_config → client_channel}/resolver_factory.h +13 -11
- data/src/core/ext/{client_config → client_channel}/resolver_registry.c +54 -34
- data/src/core/ext/{client_config → client_channel}/resolver_registry.h +21 -8
- data/src/core/ext/{client_config → client_channel}/subchannel.c +208 -119
- data/src/core/ext/{client_config → client_channel}/subchannel.h +21 -11
- data/src/core/ext/{client_config → client_channel}/subchannel_index.c +6 -17
- data/src/core/ext/{client_config → client_channel}/subchannel_index.h +7 -7
- data/src/core/ext/{client_config → client_channel}/uri_parser.c +21 -28
- data/src/core/ext/{client_config → client_channel}/uri_parser.h +3 -3
- data/src/core/ext/lb_policy/grpclb/grpclb.c +1406 -0
- data/src/core/ext/lb_policy/grpclb/grpclb.h +44 -0
- data/src/core/ext/lb_policy/grpclb/load_balancer_api.c +117 -37
- data/src/core/ext/lb_policy/grpclb/load_balancer_api.h +31 -12
- data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +6 -36
- data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +22 -42
- data/src/core/ext/lb_policy/pick_first/pick_first.c +64 -46
- data/src/core/ext/lb_policy/round_robin/round_robin.c +324 -160
- data/src/core/ext/load_reporting/load_reporting.c +7 -56
- data/src/core/ext/load_reporting/load_reporting.h +41 -28
- data/src/core/ext/load_reporting/load_reporting_filter.c +132 -42
- data/src/core/ext/load_reporting/load_reporting_filter.h +1 -0
- data/src/core/ext/resolver/dns/native/dns_resolver.c +88 -80
- data/src/core/ext/resolver/sockaddr/sockaddr_resolver.c +57 -102
- data/src/core/ext/transport/chttp2/alpn/alpn.c +1 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.c +253 -0
- data/src/core/{lib/iomgr/ev_poll_and_epoll_posix.h → ext/transport/chttp2/client/chttp2_connector.h} +5 -5
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +31 -160
- data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.c +5 -5
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c +44 -243
- data/src/core/ext/transport/chttp2/server/chttp2_server.c +342 -0
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +47 -0
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.c +11 -124
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.c +20 -9
- data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c +28 -236
- data/src/core/ext/transport/chttp2/transport/bin_decoder.c +31 -27
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +5 -4
- data/src/core/ext/transport/chttp2/transport/bin_encoder.c +25 -22
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +8 -7
- data/src/core/ext/transport/chttp2/transport/chttp2_plugin.c +0 -3
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +1345 -1521
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -1
- data/src/core/ext/transport/chttp2/transport/frame.h +3 -5
- data/src/core/ext/transport/chttp2/transport/frame_data.c +50 -47
- data/src/core/ext/transport/chttp2/transport/frame_data.h +8 -9
- data/src/core/ext/transport/chttp2/transport/frame_goaway.c +19 -21
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +9 -8
- data/src/core/ext/transport/chttp2/transport/frame_ping.c +13 -12
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +6 -6
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +31 -19
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +8 -7
- data/src/core/ext/transport/chttp2/transport/frame_settings.c +22 -25
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +9 -8
- data/src/core/ext/transport/chttp2/transport/frame_window_update.c +26 -18
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +5 -6
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.c +68 -58
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -5
- data/src/core/ext/transport/chttp2/transport/hpack_parser.c +327 -214
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +14 -9
- data/src/core/ext/transport/chttp2/transport/hpack_table.c +24 -19
- data/src/core/ext/transport/chttp2/transport/hpack_table.h +9 -6
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.c +2 -2
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +1 -1
- data/src/core/ext/transport/chttp2/transport/internal.h +284 -436
- data/src/core/ext/transport/chttp2/transport/parsing.c +355 -590
- data/src/core/ext/transport/chttp2/transport/stream_lists.c +36 -309
- data/src/core/ext/transport/chttp2/transport/stream_map.c +13 -34
- data/src/core/ext/transport/chttp2/transport/stream_map.h +3 -4
- data/src/core/ext/transport/chttp2/transport/writing.c +174 -286
- data/src/core/lib/channel/channel_args.c +70 -13
- data/src/core/lib/channel/channel_args.h +28 -2
- data/src/core/lib/channel/channel_stack.c +77 -28
- data/src/core/lib/channel/channel_stack.h +61 -23
- data/src/core/lib/channel/channel_stack_builder.c +33 -25
- data/src/core/lib/channel/channel_stack_builder.h +17 -8
- data/src/core/lib/channel/compress_filter.c +52 -36
- data/src/core/lib/channel/connected_channel.c +20 -12
- data/src/core/lib/channel/connected_channel.h +2 -1
- data/src/core/lib/channel/context.h +13 -1
- data/src/core/lib/channel/deadline_filter.c +344 -0
- data/src/core/lib/channel/deadline_filter.h +99 -0
- data/src/core/lib/channel/handshaker.c +240 -0
- data/src/core/lib/channel/handshaker.h +164 -0
- data/src/core/lib/{security/credentials/google_default/credentials_windows.c → channel/handshaker_factory.c} +16 -23
- data/src/core/lib/channel/handshaker_factory.h +66 -0
- data/src/core/lib/channel/handshaker_registry.c +113 -0
- data/src/core/{ext/client_config/client_config.h → lib/channel/handshaker_registry.h} +26 -16
- data/src/core/lib/channel/http_client_filter.c +248 -46
- data/src/core/lib/channel/http_client_filter.h +3 -0
- data/src/core/lib/channel/http_server_filter.c +136 -24
- data/src/core/lib/channel/message_size_filter.c +261 -0
- data/src/core/lib/channel/message_size_filter.h +39 -0
- data/src/core/lib/compression/message_compress.c +43 -37
- data/src/core/lib/compression/message_compress.h +7 -5
- data/src/core/lib/http/format_request.c +26 -11
- data/src/core/lib/http/format_request.h +7 -5
- data/src/core/lib/http/httpcli.c +45 -27
- data/src/core/lib/http/httpcli.h +4 -4
- data/src/core/lib/http/httpcli_security_connector.c +56 -46
- data/src/core/lib/http/parser.c +17 -14
- data/src/core/lib/http/parser.h +4 -2
- data/src/core/lib/iomgr/closure.c +49 -7
- data/src/core/lib/iomgr/closure.h +56 -14
- data/src/core/lib/iomgr/combiner.c +422 -0
- data/src/core/lib/iomgr/combiner.h +64 -0
- data/src/core/lib/iomgr/endpoint.c +8 -2
- data/src/core/lib/iomgr/endpoint.h +17 -7
- data/src/core/lib/iomgr/endpoint_pair.h +3 -2
- data/src/core/lib/iomgr/endpoint_pair_posix.c +9 -8
- data/src/core/{ext/client_config/lb_policy_factory.c → lib/iomgr/endpoint_pair_uv.c} +18 -13
- data/src/core/lib/iomgr/endpoint_pair_windows.c +7 -6
- data/src/core/lib/iomgr/error.c +72 -6
- data/src/core/lib/iomgr/error.h +30 -3
- data/src/core/lib/iomgr/ev_epoll_linux.c +500 -382
- data/src/core/lib/iomgr/ev_epoll_linux.h +3 -2
- data/src/core/lib/iomgr/ev_poll_posix.c +317 -30
- data/src/core/lib/iomgr/ev_poll_posix.h +1 -0
- data/src/core/lib/iomgr/ev_posix.c +26 -5
- data/src/core/lib/iomgr/ev_posix.h +12 -1
- data/src/core/lib/iomgr/exec_ctx.c +27 -94
- data/src/core/lib/iomgr/exec_ctx.h +19 -22
- data/src/core/lib/iomgr/executor.c +29 -8
- data/src/core/lib/iomgr/executor.h +2 -4
- data/src/core/lib/iomgr/iocp_windows.c +3 -4
- data/src/core/lib/iomgr/iomgr.c +14 -10
- data/src/core/lib/iomgr/iomgr.h +6 -2
- data/src/core/lib/iomgr/iomgr_posix.c +2 -2
- data/src/core/lib/iomgr/iomgr_uv.c +49 -0
- data/src/core/lib/iomgr/iomgr_windows.c +2 -2
- data/src/core/lib/iomgr/load_file.c +3 -3
- data/src/core/lib/iomgr/load_file.h +2 -2
- data/src/core/lib/iomgr/network_status_tracker.c +1 -1
- data/src/core/lib/iomgr/pollset_set_uv.c +62 -0
- data/src/core/lib/iomgr/pollset_set_windows.c +3 -3
- data/src/core/lib/iomgr/pollset_uv.c +142 -0
- data/src/core/lib/iomgr/pollset_uv.h +42 -0
- data/src/core/lib/iomgr/pollset_windows.c +5 -6
- data/src/core/lib/iomgr/port.h +129 -0
- data/src/core/lib/iomgr/resolve_address.h +2 -1
- data/src/core/lib/iomgr/resolve_address_posix.c +14 -13
- data/src/core/lib/iomgr/resolve_address_uv.c +233 -0
- data/src/core/lib/iomgr/resolve_address_windows.c +14 -12
- data/src/core/lib/iomgr/resource_quota.c +832 -0
- data/src/core/lib/iomgr/resource_quota.h +159 -0
- data/src/core/lib/iomgr/sockaddr.h +10 -2
- data/src/core/lib/iomgr/sockaddr_utils.c +63 -36
- data/src/core/lib/iomgr/sockaddr_utils.h +14 -14
- data/src/core/lib/iomgr/socket_mutator.c +98 -0
- data/src/core/lib/iomgr/socket_mutator.h +80 -0
- data/src/core/lib/iomgr/socket_utils.h +42 -0
- data/src/core/lib/iomgr/socket_utils_common_posix.c +28 -13
- data/src/core/lib/iomgr/socket_utils_linux.c +11 -5
- data/src/core/lib/iomgr/socket_utils_posix.c +10 -7
- data/src/core/lib/iomgr/socket_utils_posix.h +11 -4
- data/src/core/lib/iomgr/socket_utils_uv.c +49 -0
- data/src/core/lib/iomgr/socket_utils_windows.c +52 -0
- data/src/core/lib/iomgr/socket_windows.c +14 -6
- data/src/core/lib/iomgr/socket_windows.h +1 -0
- data/src/core/lib/iomgr/tcp_client.h +8 -2
- data/src/core/lib/iomgr/tcp_client_posix.c +131 -82
- data/src/core/lib/iomgr/tcp_client_posix.h +45 -0
- data/src/core/lib/iomgr/tcp_client_uv.c +190 -0
- data/src/core/lib/iomgr/tcp_client_windows.c +54 -30
- data/src/core/lib/iomgr/tcp_posix.c +135 -56
- data/src/core/lib/iomgr/tcp_posix.h +2 -2
- data/src/core/lib/iomgr/tcp_server.h +14 -6
- data/src/core/lib/iomgr/tcp_server_posix.c +154 -118
- data/src/core/lib/iomgr/tcp_server_uv.c +388 -0
- data/src/core/lib/iomgr/tcp_server_windows.c +127 -100
- data/src/core/lib/iomgr/tcp_uv.c +367 -0
- data/src/core/lib/iomgr/tcp_uv.h +59 -0
- data/src/core/lib/iomgr/tcp_windows.c +65 -48
- data/src/core/lib/iomgr/tcp_windows.h +3 -1
- data/src/core/lib/iomgr/timer.h +21 -21
- data/src/core/lib/iomgr/{timer.c → timer_generic.c} +15 -10
- data/src/core/lib/iomgr/timer_generic.h +49 -0
- data/src/core/lib/iomgr/timer_heap.c +6 -0
- data/src/core/lib/iomgr/timer_uv.c +99 -0
- data/src/core/lib/iomgr/timer_uv.h +47 -0
- data/src/core/lib/iomgr/udp_server.c +116 -98
- data/src/core/lib/iomgr/udp_server.h +5 -3
- data/src/core/lib/iomgr/unix_sockets_posix.c +14 -6
- data/src/core/lib/iomgr/unix_sockets_posix.h +6 -5
- data/src/core/lib/iomgr/unix_sockets_posix_noop.c +4 -4
- data/src/core/lib/iomgr/wakeup_fd_cv.c +118 -0
- data/src/core/lib/iomgr/wakeup_fd_cv.h +80 -0
- data/src/core/lib/iomgr/wakeup_fd_eventfd.c +3 -3
- data/src/core/lib/iomgr/wakeup_fd_nospecial.c +3 -3
- data/src/core/lib/iomgr/wakeup_fd_pipe.c +12 -6
- data/src/core/lib/iomgr/wakeup_fd_posix.c +34 -5
- data/src/core/lib/iomgr/wakeup_fd_posix.h +5 -0
- data/src/core/lib/iomgr/workqueue.h +12 -20
- data/src/core/{ext/client_config/client_config.c → lib/iomgr/workqueue_uv.c} +24 -33
- data/{include/grpc/support/slice.h → src/core/lib/iomgr/workqueue_uv.h} +4 -6
- data/src/core/lib/iomgr/workqueue_windows.c +9 -8
- data/src/core/lib/json/json.c +3 -3
- data/src/core/lib/json/json.h +11 -11
- data/src/core/lib/json/json_reader.c +9 -5
- data/src/core/lib/profiling/basic_timers.c +10 -1
- data/src/core/lib/profiling/timers.h +2 -0
- data/src/core/lib/security/context/security_context.c +13 -3
- data/src/core/lib/security/context/security_context.h +20 -0
- data/src/core/lib/security/credentials/composite/composite_credentials.c +28 -14
- data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
- data/src/core/lib/security/credentials/credentials.c +48 -19
- data/src/core/lib/security/credentials/credentials.h +36 -19
- data/src/core/lib/security/credentials/credentials_metadata.c +11 -8
- data/src/core/lib/security/credentials/fake/fake_credentials.c +15 -11
- data/src/core/lib/security/credentials/google_default/{credentials_posix.c → credentials_generic.c} +7 -14
- data/src/core/lib/security/credentials/google_default/google_default_credentials.c +33 -21
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +14 -0
- data/src/core/lib/security/credentials/iam/iam_credentials.c +3 -2
- data/src/core/lib/security/credentials/jwt/json_token.c +1 -0
- data/src/core/lib/security/credentials/jwt/json_token.h +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_credentials.c +54 -19
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.c +129 -79
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +9 -6
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.c +63 -28
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
- data/src/core/lib/security/credentials/plugin/plugin_credentials.c +32 -11
- data/src/core/lib/security/credentials/ssl/ssl_credentials.c +13 -9
- data/src/core/lib/security/transport/client_auth_filter.c +33 -27
- data/src/core/lib/security/transport/secure_endpoint.c +93 -68
- data/src/core/lib/security/transport/secure_endpoint.h +2 -2
- data/src/core/lib/security/transport/security_connector.c +133 -168
- data/src/core/lib/security/transport/security_connector.h +31 -46
- data/src/core/lib/security/transport/security_handshaker.c +501 -0
- data/src/core/lib/security/transport/{handshake.h → security_handshaker.h} +10 -10
- data/src/core/lib/security/transport/server_auth_filter.c +50 -38
- data/src/core/lib/security/util/b64.c +11 -8
- data/src/core/lib/security/util/b64.h +5 -4
- data/src/core/lib/slice/percent_encoding.c +182 -0
- data/src/core/lib/slice/percent_encoding.h +78 -0
- data/src/core/lib/{support → slice}/slice.c +81 -50
- data/src/core/lib/{support → slice}/slice_buffer.c +78 -60
- data/src/core/lib/slice/slice_internal.h +49 -0
- data/src/core/lib/slice/slice_string_helpers.c +90 -0
- data/src/core/lib/{iomgr/workqueue_posix.h → slice/slice_string_helpers.h} +18 -18
- data/src/core/lib/support/backoff.c +24 -13
- data/src/core/lib/support/backoff.h +5 -2
- data/src/core/lib/support/env.h +0 -2
- data/src/core/lib/support/log.c +5 -4
- data/src/core/lib/support/log_linux.c +0 -1
- data/src/core/lib/support/log_posix.c +1 -1
- data/src/core/lib/support/mpscq.c +83 -0
- data/src/core/lib/support/mpscq.h +65 -0
- data/src/core/lib/support/string.c +58 -49
- data/src/core/lib/support/string.h +11 -8
- data/src/core/lib/support/subprocess_posix.c +5 -2
- data/src/core/lib/support/thd.c +1 -1
- data/src/core/lib/support/time.c +43 -79
- data/src/core/lib/support/time_posix.c +1 -1
- data/src/core/lib/support/tmpfile.h +0 -2
- data/src/core/lib/surface/alarm.c +4 -1
- data/src/core/lib/surface/byte_buffer.c +17 -11
- data/src/core/lib/surface/byte_buffer_reader.c +23 -15
- data/src/core/lib/surface/call.c +294 -276
- data/src/core/lib/surface/call.h +24 -9
- data/src/core/lib/surface/call_log_batch.c +5 -3
- data/src/core/lib/surface/channel.c +127 -111
- data/src/core/lib/surface/channel.h +14 -5
- data/src/core/lib/surface/channel_init.c +1 -1
- data/src/core/lib/surface/channel_init.h +10 -1
- data/src/core/lib/surface/channel_ping.c +7 -6
- data/src/core/lib/surface/completion_queue.c +154 -18
- data/src/core/lib/surface/completion_queue.h +5 -0
- data/src/core/lib/surface/init.c +40 -6
- data/src/core/lib/surface/init.h +1 -0
- data/src/core/lib/surface/init_secure.c +5 -2
- data/src/core/lib/surface/lame_client.c +28 -18
- data/src/core/lib/surface/server.c +134 -87
- data/src/core/lib/surface/server.h +8 -0
- data/src/core/lib/surface/validate_metadata.c +1 -1
- data/src/core/lib/surface/version.c +3 -1
- data/src/core/lib/transport/byte_stream.c +7 -4
- data/src/core/lib/transport/byte_stream.h +6 -10
- data/src/core/lib/transport/connectivity_state.c +21 -12
- data/src/core/lib/transport/connectivity_state.h +4 -1
- data/src/core/lib/transport/mdstr_hash_table.c +118 -0
- data/src/core/lib/transport/mdstr_hash_table.h +77 -0
- data/src/core/lib/transport/metadata.c +83 -60
- data/src/core/lib/transport/metadata.h +41 -23
- data/src/core/lib/transport/metadata_batch.c +17 -11
- data/src/core/lib/transport/metadata_batch.h +20 -6
- data/src/core/lib/transport/pid_controller.c +57 -0
- data/src/core/lib/transport/pid_controller.h +64 -0
- data/src/core/lib/transport/service_config.c +251 -0
- data/src/core/lib/transport/service_config.h +71 -0
- data/src/core/lib/transport/static_metadata.c +18 -16
- data/src/core/lib/transport/static_metadata.h +113 -107
- data/src/core/{ext/transport/chttp2 → lib}/transport/timeout_encoding.c +3 -3
- data/src/core/{ext/transport/chttp2 → lib}/transport/timeout_encoding.h +7 -7
- data/src/core/lib/transport/transport.c +84 -23
- data/src/core/lib/transport/transport.h +53 -8
- data/src/core/lib/transport/transport_impl.h +3 -0
- data/src/core/lib/transport/transport_op_string.c +92 -20
- data/src/core/lib/tsi/ssl_transport_security.c +3 -1
- data/src/core/plugin_registry/grpc_plugin_registry.c +8 -4
- data/src/ruby/ext/grpc/extconf.rb +0 -1
- data/src/ruby/ext/grpc/rb_byte_buffer.c +8 -7
- data/src/ruby/ext/grpc/rb_call.c +15 -5
- data/src/ruby/ext/grpc/rb_channel.c +1 -1
- data/src/ruby/ext/grpc/rb_compression_options.c +466 -0
- data/src/{core/ext/client_config/default_initial_connect_string.c → ruby/ext/grpc/rb_compression_options.h} +10 -5
- data/src/ruby/ext/grpc/rb_grpc.c +3 -1
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +198 -190
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +306 -294
- data/src/ruby/ext/grpc/rb_server.c +18 -12
- data/src/ruby/lib/grpc/errors.rb +154 -2
- data/src/ruby/lib/grpc/generic/active_call.rb +144 -63
- data/src/ruby/lib/grpc/generic/bidi_call.rb +18 -2
- data/src/ruby/lib/grpc/generic/client_stub.rb +7 -5
- data/src/ruby/lib/grpc/generic/rpc_desc.rb +39 -13
- data/src/ruby/lib/grpc/generic/rpc_server.rb +51 -24
- data/src/ruby/lib/grpc/generic/service.rb +3 -2
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/grpc/health/checker.rb +3 -1
- data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +7 -0
- data/src/ruby/pb/test/client.rb +307 -7
- data/src/ruby/pb/test/server.rb +26 -1
- data/src/ruby/spec/compression_options_spec.rb +164 -0
- data/src/ruby/spec/error_sanity_spec.rb +64 -0
- data/src/ruby/spec/generic/active_call_spec.rb +290 -12
- data/src/ruby/spec/generic/client_stub_spec.rb +91 -41
- data/src/ruby/spec/generic/rpc_desc_spec.rb +36 -16
- data/src/ruby/spec/generic/rpc_server_pool_spec.rb +22 -28
- data/src/ruby/spec/generic/rpc_server_spec.rb +6 -6
- data/src/ruby/spec/pb/health/checker_spec.rb +27 -19
- data/src/ruby/spec/spec_helper.rb +2 -0
- data/third_party/boringssl/crypto/aes/aes.c +12 -12
- data/third_party/boringssl/crypto/aes/mode_wrappers.c +6 -2
- data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +28 -13
- data/third_party/boringssl/crypto/asn1/a_gentm.c +2 -0
- data/third_party/boringssl/crypto/asn1/a_object.c +7 -3
- data/third_party/boringssl/crypto/asn1/a_strnid.c +1 -0
- data/third_party/boringssl/crypto/asn1/a_time.c +0 -11
- data/third_party/boringssl/crypto/asn1/a_type.c +0 -2
- data/third_party/boringssl/crypto/asn1/a_utctm.c +1 -30
- data/third_party/boringssl/crypto/asn1/asn1_lib.c +56 -76
- data/third_party/boringssl/crypto/asn1/asn1_locl.h +0 -10
- data/third_party/boringssl/crypto/asn1/asn1_par.c +0 -322
- data/third_party/boringssl/crypto/asn1/f_enum.c +1 -108
- data/third_party/boringssl/crypto/asn1/f_int.c +1 -106
- data/third_party/boringssl/crypto/asn1/f_string.c +1 -106
- data/third_party/boringssl/crypto/asn1/tasn_dec.c +10 -14
- data/third_party/boringssl/crypto/asn1/tasn_enc.c +17 -11
- data/third_party/boringssl/crypto/asn1/tasn_typ.c +29 -42
- data/third_party/boringssl/crypto/asn1/tasn_utl.c +1 -1
- data/third_party/boringssl/crypto/base64/base64.c +249 -285
- data/third_party/boringssl/crypto/bio/bio.c +13 -23
- data/third_party/boringssl/crypto/bio/bio_mem.c +3 -2
- data/third_party/boringssl/crypto/bio/connect.c +12 -3
- data/third_party/boringssl/crypto/bio/fd.c +22 -15
- data/third_party/boringssl/crypto/bio/file.c +2 -38
- data/third_party/boringssl/crypto/bio/hexdump.c +1 -2
- data/third_party/boringssl/crypto/bio/internal.h +3 -0
- data/third_party/boringssl/crypto/bio/pair.c +1 -1
- data/third_party/boringssl/crypto/bio/socket.c +10 -2
- data/third_party/boringssl/crypto/bio/socket_helper.c +2 -2
- data/third_party/boringssl/crypto/bn/asm/x86_64-gcc.c +0 -8
- data/third_party/boringssl/crypto/bn/bn.c +38 -0
- data/third_party/boringssl/crypto/bn/cmp.c +25 -0
- data/third_party/boringssl/crypto/bn/convert.c +73 -76
- data/third_party/boringssl/crypto/bn/div.c +136 -70
- data/third_party/boringssl/crypto/bn/exponentiation.c +86 -381
- data/third_party/boringssl/crypto/bn/gcd.c +213 -296
- data/third_party/boringssl/crypto/bn/generic.c +0 -80
- data/third_party/boringssl/crypto/bn/internal.h +15 -3
- data/third_party/boringssl/crypto/bn/montgomery.c +57 -207
- data/third_party/boringssl/crypto/bn/montgomery_inv.c +160 -0
- data/third_party/boringssl/crypto/bn/mul.c +2 -1
- data/third_party/boringssl/crypto/bn/prime.c +24 -8
- data/third_party/boringssl/crypto/bn/random.c +47 -33
- data/third_party/boringssl/crypto/bn/sqrt.c +4 -5
- data/third_party/boringssl/crypto/buf/buf.c +25 -21
- data/third_party/boringssl/crypto/bytestring/ber.c +1 -0
- data/third_party/boringssl/crypto/bytestring/cbb.c +50 -22
- data/third_party/boringssl/crypto/bytestring/cbs.c +28 -4
- data/third_party/boringssl/crypto/chacha/{chacha_generic.c → chacha.c} +56 -29
- data/third_party/boringssl/crypto/cipher/aead.c +11 -22
- data/third_party/boringssl/crypto/cipher/cipher.c +2 -2
- data/third_party/boringssl/crypto/cipher/e_aes.c +53 -103
- data/third_party/boringssl/crypto/cipher/e_chacha20poly1305.c +2 -8
- data/third_party/boringssl/crypto/cipher/e_des.c +3 -5
- data/third_party/boringssl/crypto/cipher/e_null.c +1 -1
- data/third_party/boringssl/crypto/cipher/e_rc2.c +1 -1
- data/third_party/boringssl/crypto/cipher/e_rc4.c +1 -1
- data/third_party/boringssl/crypto/cipher/e_ssl3.c +3 -63
- data/third_party/boringssl/crypto/cipher/e_tls.c +12 -83
- data/third_party/boringssl/crypto/cipher/internal.h +8 -10
- data/third_party/boringssl/crypto/cipher/tls_cbc.c +69 -40
- data/third_party/boringssl/crypto/conf/conf.c +2 -1
- data/third_party/boringssl/crypto/cpu-aarch64-linux.c +61 -0
- data/third_party/boringssl/crypto/cpu-arm-linux.c +360 -0
- data/third_party/boringssl/crypto/cpu-arm.c +0 -161
- data/third_party/boringssl/crypto/cpu-intel.c +5 -3
- data/third_party/boringssl/{ssl/test/scoped_types.h → crypto/cpu-ppc64le.c} +21 -9
- data/third_party/boringssl/crypto/crypto.c +29 -7
- data/third_party/boringssl/crypto/curve25519/curve25519.c +284 -242
- data/third_party/boringssl/crypto/curve25519/internal.h +64 -0
- data/third_party/boringssl/crypto/curve25519/spake25519.c +464 -0
- data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +21 -0
- data/third_party/boringssl/crypto/dh/check.c +22 -6
- data/third_party/boringssl/crypto/dh/dh.c +45 -21
- data/third_party/boringssl/crypto/dh/dh_asn1.c +96 -20
- data/third_party/boringssl/crypto/dh/params.c +30 -78
- data/third_party/boringssl/crypto/digest/digest.c +3 -3
- data/third_party/boringssl/crypto/dsa/dsa.c +59 -29
- data/third_party/boringssl/crypto/dsa/dsa_asn1.c +4 -0
- data/third_party/boringssl/crypto/ec/ec.c +84 -140
- data/third_party/boringssl/crypto/ec/ec_asn1.c +82 -52
- data/third_party/boringssl/crypto/ec/ec_key.c +15 -15
- data/third_party/boringssl/crypto/ec/ec_montgomery.c +87 -50
- data/third_party/boringssl/crypto/ec/internal.h +12 -36
- data/third_party/boringssl/crypto/ec/oct.c +11 -11
- data/third_party/boringssl/crypto/ec/p224-64.c +59 -116
- data/third_party/boringssl/crypto/ec/p256-64.c +88 -163
- data/third_party/boringssl/crypto/ec/p256-x86_64.c +46 -58
- data/third_party/boringssl/crypto/ec/simple.c +81 -201
- data/third_party/boringssl/crypto/ec/util-64.c +0 -74
- data/third_party/boringssl/crypto/ecdh/ecdh.c +7 -1
- data/third_party/boringssl/crypto/ecdsa/ecdsa.c +28 -46
- data/third_party/boringssl/crypto/ecdsa/ecdsa_asn1.c +1 -0
- data/third_party/boringssl/crypto/engine/engine.c +1 -1
- data/third_party/boringssl/crypto/err/err.c +3 -3
- data/third_party/boringssl/crypto/evp/evp.c +14 -59
- data/third_party/boringssl/crypto/evp/evp_asn1.c +144 -87
- data/third_party/boringssl/crypto/evp/evp_ctx.c +7 -7
- data/third_party/boringssl/crypto/evp/internal.h +4 -46
- data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +8 -157
- data/third_party/boringssl/crypto/evp/p_ec.c +1 -1
- data/third_party/boringssl/crypto/evp/p_ec_asn1.c +22 -170
- data/third_party/boringssl/crypto/evp/p_rsa.c +1 -1
- data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +10 -548
- data/third_party/boringssl/crypto/evp/print.c +520 -0
- data/third_party/boringssl/crypto/ex_data.c +4 -6
- data/third_party/boringssl/crypto/hkdf/hkdf.c +38 -17
- data/third_party/boringssl/crypto/hmac/hmac.c +6 -6
- data/third_party/boringssl/crypto/internal.h +57 -77
- data/third_party/boringssl/crypto/lhash/lhash.c +6 -10
- data/third_party/boringssl/crypto/md4/md4.c +9 -0
- data/third_party/boringssl/crypto/mem.c +19 -19
- data/third_party/boringssl/crypto/modes/cfb.c +5 -6
- data/third_party/boringssl/crypto/modes/ctr.c +10 -18
- data/third_party/boringssl/crypto/modes/gcm.c +100 -66
- data/third_party/boringssl/crypto/modes/internal.h +15 -27
- data/third_party/boringssl/crypto/modes/ofb.c +9 -22
- data/third_party/boringssl/crypto/newhope/error_correction.c +131 -0
- data/third_party/boringssl/crypto/newhope/internal.h +71 -0
- data/third_party/boringssl/crypto/newhope/newhope.c +174 -0
- data/third_party/boringssl/crypto/newhope/ntt.c +148 -0
- data/third_party/boringssl/crypto/newhope/poly.c +183 -0
- data/third_party/boringssl/crypto/newhope/precomp.c +306 -0
- data/third_party/boringssl/crypto/newhope/reduce.c +42 -0
- data/third_party/boringssl/crypto/obj/obj.c +111 -135
- data/third_party/boringssl/crypto/obj/obj_dat.h +4 -10
- data/third_party/boringssl/crypto/pem/pem_lib.c +6 -43
- data/third_party/boringssl/crypto/pem/pem_pkey.c +10 -19
- data/third_party/boringssl/crypto/pkcs8/p5_pbe.c +1 -0
- data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +2 -1
- data/third_party/boringssl/crypto/pkcs8/p8_pkey.c +2 -2
- data/third_party/boringssl/crypto/pkcs8/pkcs8.c +95 -87
- data/third_party/boringssl/crypto/{test/test_util.h → poly1305/internal.h} +15 -10
- data/third_party/boringssl/crypto/poly1305/poly1305.c +8 -15
- data/third_party/boringssl/crypto/poly1305/poly1305_arm.c +1 -0
- data/third_party/boringssl/crypto/poly1305/poly1305_vec.c +3 -3
- data/third_party/boringssl/crypto/rand/deterministic.c +47 -0
- data/third_party/boringssl/crypto/rand/rand.c +4 -1
- data/third_party/boringssl/crypto/rand/urandom.c +5 -7
- data/third_party/boringssl/crypto/rand/windows.c +5 -8
- data/third_party/boringssl/crypto/rc4/rc4.c +24 -209
- data/third_party/boringssl/crypto/refcount_lock.c +2 -2
- data/third_party/boringssl/crypto/rsa/blinding.c +74 -232
- data/third_party/boringssl/crypto/rsa/internal.h +5 -13
- data/third_party/boringssl/crypto/rsa/padding.c +64 -63
- data/third_party/boringssl/crypto/rsa/rsa.c +50 -28
- data/third_party/boringssl/crypto/rsa/rsa_asn1.c +8 -16
- data/third_party/boringssl/crypto/rsa/rsa_impl.c +134 -122
- data/third_party/boringssl/crypto/sha/sha256.c +2 -2
- data/third_party/boringssl/crypto/sha/sha512.c +7 -7
- data/third_party/boringssl/crypto/stack/stack.c +13 -22
- data/third_party/boringssl/crypto/thread.c +21 -12
- data/third_party/boringssl/crypto/thread_none.c +6 -2
- data/third_party/boringssl/crypto/thread_pthread.c +16 -7
- data/third_party/boringssl/crypto/thread_win.c +38 -85
- data/third_party/boringssl/crypto/x509/a_sign.c +3 -3
- data/third_party/boringssl/crypto/x509/a_strex.c +1 -1
- data/third_party/boringssl/crypto/x509/a_verify.c +2 -2
- data/third_party/boringssl/crypto/{evp → x509}/algorithm.c +37 -53
- data/third_party/boringssl/crypto/x509/asn1_gen.c +1 -2
- data/third_party/boringssl/crypto/x509/by_dir.c +6 -6
- data/third_party/boringssl/crypto/x509/internal.h +66 -0
- data/third_party/boringssl/crypto/x509/rsa_pss.c +385 -0
- data/third_party/boringssl/crypto/x509/t_x509.c +10 -12
- data/third_party/boringssl/crypto/x509/x509.c +5 -0
- data/third_party/boringssl/crypto/x509/x509_att.c +9 -3
- data/third_party/boringssl/crypto/x509/x509_lu.c +34 -44
- data/third_party/boringssl/crypto/x509/x509_obj.c +19 -2
- data/third_party/boringssl/crypto/x509/x509_r2x.c +9 -5
- data/third_party/boringssl/crypto/x509/x509_set.c +5 -0
- data/third_party/boringssl/crypto/x509/x509_txt.c +5 -0
- data/third_party/boringssl/crypto/x509/x509_vfy.c +63 -32
- data/third_party/boringssl/crypto/x509/x509_vpm.c +29 -18
- data/third_party/boringssl/crypto/x509/x509cset.c +2 -1
- data/third_party/boringssl/crypto/x509/x_crl.c +2 -2
- data/third_party/boringssl/crypto/x509/x_name.c +14 -17
- data/third_party/boringssl/crypto/x509/x_pubkey.c +10 -7
- data/third_party/boringssl/crypto/x509/x_x509.c +67 -6
- data/third_party/boringssl/crypto/x509v3/pcy_cache.c +2 -2
- data/third_party/boringssl/crypto/x509v3/pcy_tree.c +2 -1
- data/third_party/boringssl/crypto/x509v3/v3_conf.c +4 -3
- data/third_party/boringssl/crypto/x509v3/v3_cpols.c +5 -0
- data/third_party/boringssl/crypto/x509v3/v3_prn.c +0 -3
- data/third_party/boringssl/crypto/x509v3/v3_purp.c +2 -2
- data/third_party/boringssl/crypto/x509v3/v3_utl.c +2 -1
- data/third_party/boringssl/include/openssl/aead.h +72 -73
- data/third_party/boringssl/include/openssl/arm_arch.h +0 -6
- data/third_party/boringssl/include/openssl/asn1.h +103 -235
- data/third_party/boringssl/include/openssl/asn1_mac.h +17 -74
- data/third_party/boringssl/include/openssl/asn1t.h +1 -11
- data/third_party/boringssl/include/openssl/base.h +145 -3
- data/third_party/boringssl/include/openssl/base64.h +20 -17
- data/third_party/boringssl/include/openssl/bio.h +59 -34
- data/third_party/boringssl/include/openssl/bn.h +118 -51
- data/third_party/boringssl/include/openssl/buf.h +15 -0
- data/third_party/boringssl/include/openssl/bytestring.h +52 -4
- data/third_party/boringssl/include/openssl/chacha.h +2 -2
- data/third_party/boringssl/include/openssl/cipher.h +18 -1
- data/third_party/boringssl/include/openssl/cmac.h +11 -0
- data/third_party/boringssl/include/openssl/conf.h +13 -2
- data/third_party/boringssl/include/openssl/cpu.h +20 -23
- data/third_party/boringssl/include/openssl/crypto.h +22 -1
- data/third_party/boringssl/include/openssl/curve25519.h +96 -4
- data/third_party/boringssl/include/openssl/dh.h +71 -16
- data/third_party/boringssl/include/openssl/digest.h +38 -11
- data/third_party/boringssl/include/openssl/dsa.h +40 -4
- data/third_party/boringssl/include/openssl/ec.h +44 -18
- data/third_party/boringssl/include/openssl/ec_key.h +27 -6
- data/third_party/boringssl/include/openssl/ecdsa.h +11 -0
- data/third_party/boringssl/include/openssl/engine.h +11 -0
- data/third_party/boringssl/include/openssl/evp.h +52 -88
- data/third_party/boringssl/include/openssl/hkdf.h +24 -4
- data/third_party/boringssl/include/openssl/hmac.h +20 -6
- data/third_party/boringssl/include/openssl/md4.h +4 -0
- data/third_party/boringssl/include/openssl/mem.h +19 -0
- data/third_party/boringssl/include/openssl/newhope.h +158 -0
- data/third_party/boringssl/include/openssl/nid.h +4166 -0
- data/third_party/boringssl/include/openssl/obj.h +31 -3
- data/third_party/boringssl/include/openssl/obj_mac.h +17 -4143
- data/third_party/boringssl/include/openssl/{opensslfeatures.h → opensslconf.h} +3 -3
- data/third_party/boringssl/include/openssl/pem.h +5 -0
- data/third_party/boringssl/include/openssl/pkcs8.h +12 -0
- data/third_party/boringssl/include/openssl/rand.h +6 -0
- data/third_party/boringssl/include/openssl/rc4.h +6 -0
- data/third_party/boringssl/{crypto/dh/internal.h → include/openssl/ripemd.h} +38 -11
- data/third_party/boringssl/include/openssl/rsa.h +127 -65
- data/third_party/boringssl/include/openssl/sha.h +14 -10
- data/third_party/boringssl/include/openssl/ssl.h +561 -275
- data/third_party/boringssl/include/openssl/ssl3.h +18 -25
- data/third_party/boringssl/include/openssl/stack.h +2 -4
- data/third_party/boringssl/include/openssl/stack_macros.h +321 -353
- data/third_party/boringssl/include/openssl/thread.h +31 -13
- data/third_party/boringssl/include/openssl/time_support.h +1 -0
- data/third_party/boringssl/include/openssl/tls1.h +37 -33
- data/third_party/boringssl/include/openssl/x509.h +69 -26
- data/third_party/boringssl/include/openssl/x509_vfy.h +12 -10
- data/third_party/boringssl/include/openssl/x509v3.h +23 -2
- data/third_party/boringssl/ssl/custom_extensions.c +3 -5
- data/third_party/boringssl/ssl/d1_both.c +463 -499
- data/third_party/boringssl/ssl/d1_lib.c +38 -109
- data/third_party/boringssl/ssl/d1_pkt.c +173 -334
- data/third_party/boringssl/ssl/d1_srtp.c +20 -18
- data/third_party/boringssl/ssl/{d1_meth.c → dtls_method.c} +88 -15
- data/third_party/boringssl/ssl/dtls_record.c +27 -26
- data/third_party/boringssl/ssl/{s3_clnt.c → handshake_client.c} +816 -904
- data/third_party/boringssl/ssl/handshake_server.c +1932 -0
- data/third_party/boringssl/ssl/internal.h +712 -439
- data/third_party/boringssl/ssl/s3_both.c +445 -257
- data/third_party/boringssl/ssl/s3_enc.c +53 -36
- data/third_party/boringssl/ssl/s3_lib.c +23 -268
- data/third_party/boringssl/ssl/s3_pkt.c +168 -364
- data/third_party/boringssl/ssl/ssl_aead_ctx.c +46 -17
- data/third_party/boringssl/ssl/ssl_asn1.c +56 -26
- data/third_party/boringssl/ssl/ssl_buffer.c +16 -24
- data/third_party/boringssl/ssl/ssl_cert.c +324 -49
- data/third_party/boringssl/ssl/ssl_cipher.c +205 -150
- data/third_party/boringssl/ssl/ssl_ecdh.c +287 -51
- data/third_party/boringssl/ssl/ssl_file.c +21 -68
- data/third_party/boringssl/ssl/ssl_lib.c +881 -510
- data/third_party/boringssl/ssl/ssl_rsa.c +404 -34
- data/third_party/boringssl/ssl/ssl_session.c +324 -103
- data/third_party/boringssl/ssl/ssl_stat.c +6 -88
- data/third_party/boringssl/ssl/t1_enc.c +23 -39
- data/third_party/boringssl/ssl/t1_lib.c +1120 -622
- data/third_party/boringssl/ssl/tls13_both.c +440 -0
- data/third_party/boringssl/ssl/tls13_client.c +682 -0
- data/third_party/boringssl/ssl/tls13_enc.c +391 -0
- data/third_party/boringssl/ssl/tls13_server.c +672 -0
- data/third_party/boringssl/ssl/{s3_meth.c → tls_method.c} +100 -21
- data/third_party/boringssl/ssl/tls_record.c +159 -77
- data/third_party/nanopb/pb.h +60 -28
- data/third_party/nanopb/pb_decode.c +120 -92
- data/third_party/nanopb/pb_decode.h +3 -3
- data/third_party/nanopb/pb_encode.c +73 -67
- data/third_party/nanopb/pb_encode.h +4 -4
- metadata +155 -89
- data/include/grpc/impl/codegen/byte_buffer.h +0 -122
- data/include/grpc/impl/codegen/log.h +0 -118
- data/include/grpc/impl/codegen/time.h +0 -130
- data/src/core/ext/client_config/client_channel.c +0 -593
- data/src/core/ext/client_config/subchannel_call_holder.c +0 -272
- data/src/core/ext/client_config/subchannel_call_holder.h +0 -99
- data/src/core/lib/iomgr/ev_poll_and_epoll_posix.c +0 -2046
- data/src/core/lib/iomgr/workqueue_posix.c +0 -151
- data/src/core/lib/security/transport/handshake.c +0 -368
- data/third_party/boringssl/crypto/asn1/a_bytes.c +0 -308
- data/third_party/boringssl/crypto/asn1/bio_asn1.c +0 -477
- data/third_party/boringssl/crypto/asn1/bio_ndef.c +0 -251
- data/third_party/boringssl/crypto/asn1/t_pkey.c +0 -110
- data/third_party/boringssl/crypto/asn1/tasn_prn.c +0 -596
- data/third_party/boringssl/crypto/chacha/chacha_vec.c +0 -328
- data/third_party/boringssl/crypto/directory.h +0 -66
- data/third_party/boringssl/crypto/directory_posix.c +0 -108
- data/third_party/boringssl/crypto/directory_win.c +0 -144
- data/third_party/boringssl/crypto/test/scoped_types.h +0 -140
- data/third_party/boringssl/include/openssl/pqueue.h +0 -146
- data/third_party/boringssl/ssl/d1_clnt.c +0 -561
- data/third_party/boringssl/ssl/d1_srvr.c +0 -476
- data/third_party/boringssl/ssl/pqueue/pqueue.c +0 -197
- data/third_party/boringssl/ssl/s3_srvr.c +0 -2272
- data/third_party/boringssl/ssl/test/async_bio.h +0 -45
- data/third_party/boringssl/ssl/test/packeted_bio.h +0 -44
- data/third_party/boringssl/ssl/test/test_config.h +0 -110
data/src/core/lib/security/credentials/google_default/{credentials_posix.c → credentials_generic.c}
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
/*
|
2
2
|
*
|
3
|
-
* Copyright
|
3
|
+
* Copyright 2016, Google Inc.
|
4
4
|
* All rights reserved.
|
5
5
|
*
|
6
6
|
* Redistribution and use in source and binary forms, with or without
|
@@ -31,10 +31,6 @@
|
|
31
31
|
*
|
32
32
|
*/
|
33
33
|
|
34
|
-
#include <grpc/support/port_platform.h>
|
35
|
-
|
36
|
-
#ifdef GPR_POSIX_FILE
|
37
|
-
|
38
34
|
#include "src/core/lib/security/credentials/google_default/google_default_credentials.h"
|
39
35
|
|
40
36
|
#include <grpc/support/alloc.h>
|
@@ -46,16 +42,13 @@
|
|
46
42
|
|
47
43
|
char *grpc_get_well_known_google_credentials_file_path_impl(void) {
|
48
44
|
char *result = NULL;
|
49
|
-
char *
|
50
|
-
if (
|
51
|
-
gpr_log(GPR_ERROR, "Could not get
|
45
|
+
char *base = gpr_getenv(GRPC_GOOGLE_CREDENTIALS_PATH_ENV_VAR);
|
46
|
+
if (base == NULL) {
|
47
|
+
gpr_log(GPR_ERROR, "Could not get " GRPC_GOOGLE_CREDENTIALS_ENV_VAR
|
48
|
+
" environment variable.");
|
52
49
|
return NULL;
|
53
50
|
}
|
54
|
-
gpr_asprintf(&result, "%s
|
55
|
-
|
56
|
-
GRPC_GOOGLE_WELL_KNOWN_CREDENTIALS_FILE);
|
57
|
-
gpr_free(home);
|
51
|
+
gpr_asprintf(&result, "%s/%s", base, GRPC_GOOGLE_CREDENTIALS_PATH_SUFFIX);
|
52
|
+
gpr_free(base);
|
58
53
|
return result;
|
59
54
|
}
|
60
|
-
|
61
|
-
#endif /* GPR_POSIX_FILE */
|
@@ -45,6 +45,8 @@
|
|
45
45
|
#include "src/core/lib/iomgr/polling_entity.h"
|
46
46
|
#include "src/core/lib/security/credentials/jwt/jwt_credentials.h"
|
47
47
|
#include "src/core/lib/security/credentials/oauth2/oauth2_credentials.h"
|
48
|
+
#include "src/core/lib/slice/slice_internal.h"
|
49
|
+
#include "src/core/lib/slice/slice_string_helpers.h"
|
48
50
|
#include "src/core/lib/support/env.h"
|
49
51
|
#include "src/core/lib/support/string.h"
|
50
52
|
#include "src/core/lib/surface/api_trace.h"
|
@@ -100,11 +102,10 @@ static void destroy_pollset(grpc_exec_ctx *exec_ctx, void *p, grpc_error *e) {
|
|
100
102
|
grpc_pollset_destroy(p);
|
101
103
|
}
|
102
104
|
|
103
|
-
static int is_stack_running_on_compute_engine(
|
105
|
+
static int is_stack_running_on_compute_engine(grpc_exec_ctx *exec_ctx) {
|
104
106
|
compute_engine_detector detector;
|
105
107
|
grpc_httpcli_request request;
|
106
108
|
grpc_httpcli_context context;
|
107
|
-
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
108
109
|
grpc_closure destroy_closure;
|
109
110
|
|
110
111
|
/* The http call is local. If it takes more than one sec, it is for sure not
|
@@ -124,13 +125,17 @@ static int is_stack_running_on_compute_engine(void) {
|
|
124
125
|
|
125
126
|
grpc_httpcli_context_init(&context);
|
126
127
|
|
128
|
+
grpc_resource_quota *resource_quota =
|
129
|
+
grpc_resource_quota_create("google_default_credentials");
|
127
130
|
grpc_httpcli_get(
|
128
|
-
|
131
|
+
exec_ctx, &context, &detector.pollent, resource_quota, &request,
|
129
132
|
gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), max_detection_delay),
|
130
|
-
grpc_closure_create(on_compute_engine_detection_http_response, &detector
|
133
|
+
grpc_closure_create(on_compute_engine_detection_http_response, &detector,
|
134
|
+
grpc_schedule_on_exec_ctx),
|
131
135
|
&detector.response);
|
136
|
+
grpc_resource_quota_unref_internal(exec_ctx, resource_quota);
|
132
137
|
|
133
|
-
grpc_exec_ctx_flush(
|
138
|
+
grpc_exec_ctx_flush(exec_ctx);
|
134
139
|
|
135
140
|
/* Block until we get the response. This is not ideal but this should only be
|
136
141
|
called once for the lifetime of the process by the default credentials. */
|
@@ -139,7 +144,7 @@ static int is_stack_running_on_compute_engine(void) {
|
|
139
144
|
grpc_pollset_worker *worker = NULL;
|
140
145
|
if (!GRPC_LOG_IF_ERROR(
|
141
146
|
"pollset_work",
|
142
|
-
grpc_pollset_work(
|
147
|
+
grpc_pollset_work(exec_ctx,
|
143
148
|
grpc_polling_entity_pollset(&detector.pollent),
|
144
149
|
&worker, gpr_now(GPR_CLOCK_MONOTONIC),
|
145
150
|
gpr_inf_future(GPR_CLOCK_MONOTONIC)))) {
|
@@ -151,12 +156,13 @@ static int is_stack_running_on_compute_engine(void) {
|
|
151
156
|
|
152
157
|
grpc_httpcli_context_destroy(&context);
|
153
158
|
grpc_closure_init(&destroy_closure, destroy_pollset,
|
154
|
-
grpc_polling_entity_pollset(&detector.pollent)
|
155
|
-
|
159
|
+
grpc_polling_entity_pollset(&detector.pollent),
|
160
|
+
grpc_schedule_on_exec_ctx);
|
161
|
+
grpc_pollset_shutdown(exec_ctx,
|
156
162
|
grpc_polling_entity_pollset(&detector.pollent),
|
157
163
|
&destroy_closure);
|
158
|
-
grpc_exec_ctx_finish(&exec_ctx);
|
159
164
|
g_polling_mu = NULL;
|
165
|
+
grpc_exec_ctx_flush(exec_ctx);
|
160
166
|
|
161
167
|
gpr_free(grpc_polling_entity_pollset(&detector.pollent));
|
162
168
|
grpc_http_response_destroy(&detector.response);
|
@@ -166,12 +172,12 @@ static int is_stack_running_on_compute_engine(void) {
|
|
166
172
|
|
167
173
|
/* Takes ownership of creds_path if not NULL. */
|
168
174
|
static grpc_error *create_default_creds_from_path(
|
169
|
-
char *creds_path, grpc_call_credentials **creds) {
|
175
|
+
grpc_exec_ctx *exec_ctx, char *creds_path, grpc_call_credentials **creds) {
|
170
176
|
grpc_json *json = NULL;
|
171
177
|
grpc_auth_json_key key;
|
172
178
|
grpc_auth_refresh_token token;
|
173
179
|
grpc_call_credentials *result = NULL;
|
174
|
-
|
180
|
+
grpc_slice creds_data = gpr_empty_slice();
|
175
181
|
grpc_error *error = GRPC_ERROR_NONE;
|
176
182
|
if (creds_path == NULL) {
|
177
183
|
error = GRPC_ERROR_CREATE("creds_path unset");
|
@@ -182,9 +188,9 @@ static grpc_error *create_default_creds_from_path(
|
|
182
188
|
goto end;
|
183
189
|
}
|
184
190
|
json = grpc_json_parse_string_with_len(
|
185
|
-
(char *)
|
191
|
+
(char *)GRPC_SLICE_START_PTR(creds_data), GRPC_SLICE_LENGTH(creds_data));
|
186
192
|
if (json == NULL) {
|
187
|
-
char *dump =
|
193
|
+
char *dump = grpc_dump_slice(creds_data, GPR_DUMP_HEX | GPR_DUMP_ASCII);
|
188
194
|
error = grpc_error_set_str(GRPC_ERROR_CREATE("Failed to parse JSON"),
|
189
195
|
GRPC_ERROR_STR_RAW_BYTES, dump);
|
190
196
|
gpr_free(dump);
|
@@ -196,7 +202,7 @@ static grpc_error *create_default_creds_from_path(
|
|
196
202
|
if (grpc_auth_json_key_is_valid(&key)) {
|
197
203
|
result =
|
198
204
|
grpc_service_account_jwt_access_credentials_create_from_auth_json_key(
|
199
|
-
key, grpc_max_auth_token_lifetime());
|
205
|
+
exec_ctx, key, grpc_max_auth_token_lifetime());
|
200
206
|
if (result == NULL) {
|
201
207
|
error = GRPC_ERROR_CREATE(
|
202
208
|
"grpc_service_account_jwt_access_credentials_create_from_auth_json_"
|
@@ -221,7 +227,7 @@ static grpc_error *create_default_creds_from_path(
|
|
221
227
|
end:
|
222
228
|
GPR_ASSERT((result == NULL) + (error == GRPC_ERROR_NONE) == 1);
|
223
229
|
if (creds_path != NULL) gpr_free(creds_path);
|
224
|
-
|
230
|
+
grpc_slice_unref_internal(exec_ctx, creds_data);
|
225
231
|
if (json != NULL) grpc_json_destroy(json);
|
226
232
|
*creds = result;
|
227
233
|
return error;
|
@@ -232,6 +238,7 @@ grpc_channel_credentials *grpc_google_default_credentials_create(void) {
|
|
232
238
|
grpc_call_credentials *call_creds = NULL;
|
233
239
|
grpc_error *error = GRPC_ERROR_CREATE("Failed to create Google credentials");
|
234
240
|
grpc_error *err;
|
241
|
+
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
235
242
|
|
236
243
|
GRPC_API_TRACE("grpc_google_default_credentials_create(void)", 0, ());
|
237
244
|
|
@@ -246,20 +253,22 @@ grpc_channel_credentials *grpc_google_default_credentials_create(void) {
|
|
246
253
|
|
247
254
|
/* First, try the environment variable. */
|
248
255
|
err = create_default_creds_from_path(
|
249
|
-
gpr_getenv(GRPC_GOOGLE_CREDENTIALS_ENV_VAR), &call_creds);
|
256
|
+
&exec_ctx, gpr_getenv(GRPC_GOOGLE_CREDENTIALS_ENV_VAR), &call_creds);
|
250
257
|
if (err == GRPC_ERROR_NONE) goto end;
|
251
258
|
error = grpc_error_add_child(error, err);
|
252
259
|
|
253
260
|
/* Then the well-known file. */
|
254
261
|
err = create_default_creds_from_path(
|
255
|
-
grpc_get_well_known_google_credentials_file_path(),
|
262
|
+
&exec_ctx, grpc_get_well_known_google_credentials_file_path(),
|
263
|
+
&call_creds);
|
256
264
|
if (err == GRPC_ERROR_NONE) goto end;
|
257
265
|
error = grpc_error_add_child(error, err);
|
258
266
|
|
259
267
|
/* At last try to see if we're on compute engine (do the detection only once
|
260
268
|
since it requires a network test). */
|
261
269
|
if (!compute_engine_detection_done) {
|
262
|
-
int need_compute_engine_creds =
|
270
|
+
int need_compute_engine_creds =
|
271
|
+
is_stack_running_on_compute_engine(&exec_ctx);
|
263
272
|
compute_engine_detection_done = 1;
|
264
273
|
if (need_compute_engine_creds) {
|
265
274
|
call_creds = grpc_google_compute_engine_credentials_create(NULL);
|
@@ -282,8 +291,8 @@ end:
|
|
282
291
|
grpc_composite_channel_credentials_create(ssl_creds, call_creds,
|
283
292
|
NULL));
|
284
293
|
GPR_ASSERT(default_credentials != NULL);
|
285
|
-
grpc_channel_credentials_unref(ssl_creds);
|
286
|
-
grpc_call_credentials_unref(call_creds);
|
294
|
+
grpc_channel_credentials_unref(&exec_ctx, ssl_creds);
|
295
|
+
grpc_call_credentials_unref(&exec_ctx, call_creds);
|
287
296
|
result = default_credentials;
|
288
297
|
} else {
|
289
298
|
gpr_log(GPR_ERROR, "Could not create google default credentials.");
|
@@ -295,18 +304,21 @@ end:
|
|
295
304
|
} else {
|
296
305
|
GRPC_ERROR_UNREF(error);
|
297
306
|
}
|
307
|
+
grpc_exec_ctx_finish(&exec_ctx);
|
298
308
|
return result;
|
299
309
|
}
|
300
310
|
|
301
311
|
void grpc_flush_cached_google_default_credentials(void) {
|
312
|
+
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
302
313
|
gpr_once_init(&g_once, init_default_credentials);
|
303
314
|
gpr_mu_lock(&g_state_mu);
|
304
315
|
if (default_credentials != NULL) {
|
305
|
-
grpc_channel_credentials_unref(default_credentials);
|
316
|
+
grpc_channel_credentials_unref(&exec_ctx, default_credentials);
|
306
317
|
default_credentials = NULL;
|
307
318
|
}
|
308
319
|
compute_engine_detection_done = 0;
|
309
320
|
gpr_mu_unlock(&g_state_mu);
|
321
|
+
grpc_exec_ctx_finish(&exec_ctx);
|
310
322
|
}
|
311
323
|
|
312
324
|
/* -- Well known credentials path. -- */
|
@@ -34,12 +34,26 @@
|
|
34
34
|
#ifndef GRPC_CORE_LIB_SECURITY_CREDENTIALS_GOOGLE_DEFAULT_GOOGLE_DEFAULT_CREDENTIALS_H
|
35
35
|
#define GRPC_CORE_LIB_SECURITY_CREDENTIALS_GOOGLE_DEFAULT_GOOGLE_DEFAULT_CREDENTIALS_H
|
36
36
|
|
37
|
+
#include <grpc/support/port_platform.h>
|
38
|
+
|
37
39
|
#include "src/core/lib/security/credentials/credentials.h"
|
38
40
|
|
39
41
|
#define GRPC_GOOGLE_CLOUD_SDK_CONFIG_DIRECTORY "gcloud"
|
40
42
|
#define GRPC_GOOGLE_WELL_KNOWN_CREDENTIALS_FILE \
|
41
43
|
"application_default_credentials.json"
|
42
44
|
|
45
|
+
#ifdef GPR_WINDOWS
|
46
|
+
#define GRPC_GOOGLE_CREDENTIALS_PATH_ENV_VAR "APPDATA"
|
47
|
+
#define GRPC_GOOGLE_CREDENTIALS_PATH_SUFFIX \
|
48
|
+
GRPC_GOOGLE_CLOUD_SDK_CONFIG_DIRECTORY \
|
49
|
+
"/" GRPC_GOOGLE_WELL_KNOWN_CREDENTIALS_FILE
|
50
|
+
#else
|
51
|
+
#define GRPC_GOOGLE_CREDENTIALS_PATH_ENV_VAR "HOME"
|
52
|
+
#define GRPC_GOOGLE_CREDENTIALS_PATH_SUFFIX \
|
53
|
+
".config/" GRPC_GOOGLE_CLOUD_SDK_CONFIG_DIRECTORY \
|
54
|
+
"/" GRPC_GOOGLE_WELL_KNOWN_CREDENTIALS_FILE
|
55
|
+
#endif
|
56
|
+
|
43
57
|
void grpc_flush_cached_google_default_credentials(void);
|
44
58
|
|
45
59
|
#endif /* GRPC_CORE_LIB_SECURITY_CREDENTIALS_GOOGLE_DEFAULT_GOOGLE_DEFAULT_CREDENTIALS_H \
|
@@ -42,9 +42,10 @@
|
|
42
42
|
#include <grpc/support/string_util.h>
|
43
43
|
#include <grpc/support/sync.h>
|
44
44
|
|
45
|
-
static void iam_destruct(
|
45
|
+
static void iam_destruct(grpc_exec_ctx *exec_ctx,
|
46
|
+
grpc_call_credentials *creds) {
|
46
47
|
grpc_google_iam_credentials *c = (grpc_google_iam_credentials *)creds;
|
47
|
-
grpc_credentials_md_store_unref(c->iam_md);
|
48
|
+
grpc_credentials_md_store_unref(exec_ctx, c->iam_md);
|
48
49
|
}
|
49
50
|
|
50
51
|
static void iam_get_request_metadata(grpc_exec_ctx *exec_ctx,
|
@@ -34,7 +34,7 @@
|
|
34
34
|
#ifndef GRPC_CORE_LIB_SECURITY_CREDENTIALS_JWT_JSON_TOKEN_H
|
35
35
|
#define GRPC_CORE_LIB_SECURITY_CREDENTIALS_JWT_JSON_TOKEN_H
|
36
36
|
|
37
|
-
#include <grpc/
|
37
|
+
#include <grpc/slice.h>
|
38
38
|
#include <openssl/rsa.h>
|
39
39
|
|
40
40
|
#include "src/core/lib/json/json.h"
|
@@ -42,9 +42,10 @@
|
|
42
42
|
#include <grpc/support/string_util.h>
|
43
43
|
#include <grpc/support/sync.h>
|
44
44
|
|
45
|
-
static void jwt_reset_cache(
|
45
|
+
static void jwt_reset_cache(grpc_exec_ctx *exec_ctx,
|
46
|
+
grpc_service_account_jwt_access_credentials *c) {
|
46
47
|
if (c->cached.jwt_md != NULL) {
|
47
|
-
grpc_credentials_md_store_unref(c->cached.jwt_md);
|
48
|
+
grpc_credentials_md_store_unref(exec_ctx, c->cached.jwt_md);
|
48
49
|
c->cached.jwt_md = NULL;
|
49
50
|
}
|
50
51
|
if (c->cached.service_url != NULL) {
|
@@ -54,11 +55,12 @@ static void jwt_reset_cache(grpc_service_account_jwt_access_credentials *c) {
|
|
54
55
|
c->cached.jwt_expiration = gpr_inf_past(GPR_CLOCK_REALTIME);
|
55
56
|
}
|
56
57
|
|
57
|
-
static void jwt_destruct(
|
58
|
+
static void jwt_destruct(grpc_exec_ctx *exec_ctx,
|
59
|
+
grpc_call_credentials *creds) {
|
58
60
|
grpc_service_account_jwt_access_credentials *c =
|
59
61
|
(grpc_service_account_jwt_access_credentials *)creds;
|
60
62
|
grpc_auth_json_key_destruct(&c->key);
|
61
|
-
jwt_reset_cache(c);
|
63
|
+
jwt_reset_cache(exec_ctx, c);
|
62
64
|
gpr_mu_destroy(&c->cache_mu);
|
63
65
|
}
|
64
66
|
|
@@ -92,7 +94,7 @@ static void jwt_get_request_metadata(grpc_exec_ctx *exec_ctx,
|
|
92
94
|
char *jwt = NULL;
|
93
95
|
/* Generate a new jwt. */
|
94
96
|
gpr_mu_lock(&c->cache_mu);
|
95
|
-
jwt_reset_cache(c);
|
97
|
+
jwt_reset_cache(exec_ctx, c);
|
96
98
|
jwt = grpc_jwt_encode_and_sign(&c->key, context.service_url,
|
97
99
|
c->jwt_lifetime, NULL);
|
98
100
|
if (jwt != NULL) {
|
@@ -114,7 +116,7 @@ static void jwt_get_request_metadata(grpc_exec_ctx *exec_ctx,
|
|
114
116
|
if (jwt_md != NULL) {
|
115
117
|
cb(exec_ctx, user_data, jwt_md->entries, jwt_md->num_entries,
|
116
118
|
GRPC_CREDENTIALS_OK, NULL);
|
117
|
-
grpc_credentials_md_store_unref(jwt_md);
|
119
|
+
grpc_credentials_md_store_unref(exec_ctx, jwt_md);
|
118
120
|
} else {
|
119
121
|
cb(exec_ctx, user_data, NULL, 0, GRPC_CREDENTIALS_ERROR,
|
120
122
|
"Could not generate JWT.");
|
@@ -126,7 +128,8 @@ static grpc_call_credentials_vtable jwt_vtable = {jwt_destruct,
|
|
126
128
|
|
127
129
|
grpc_call_credentials *
|
128
130
|
grpc_service_account_jwt_access_credentials_create_from_auth_json_key(
|
129
|
-
grpc_auth_json_key key,
|
131
|
+
grpc_exec_ctx *exec_ctx, grpc_auth_json_key key,
|
132
|
+
gpr_timespec token_lifetime) {
|
130
133
|
grpc_service_account_jwt_access_credentials *c;
|
131
134
|
if (!grpc_auth_json_key_is_valid(&key)) {
|
132
135
|
gpr_log(GPR_ERROR, "Invalid input for jwt credentials creation");
|
@@ -140,22 +143,54 @@ grpc_service_account_jwt_access_credentials_create_from_auth_json_key(
|
|
140
143
|
c->key = key;
|
141
144
|
c->jwt_lifetime = token_lifetime;
|
142
145
|
gpr_mu_init(&c->cache_mu);
|
143
|
-
jwt_reset_cache(c);
|
146
|
+
jwt_reset_cache(exec_ctx, c);
|
144
147
|
return &c->base;
|
145
148
|
}
|
146
149
|
|
150
|
+
static char *redact_private_key(const char *json_key) {
|
151
|
+
char *json_copy = gpr_strdup(json_key);
|
152
|
+
grpc_json *json = grpc_json_parse_string(json_copy);
|
153
|
+
if (!json) {
|
154
|
+
gpr_free(json_copy);
|
155
|
+
return gpr_strdup("<Json failed to parse.>");
|
156
|
+
}
|
157
|
+
const char *redacted = "<redacted>";
|
158
|
+
grpc_json *current = json->child;
|
159
|
+
while (current) {
|
160
|
+
if (current->type == GRPC_JSON_STRING &&
|
161
|
+
strcmp(current->key, "private_key") == 0) {
|
162
|
+
current->value = (char *)redacted;
|
163
|
+
break;
|
164
|
+
}
|
165
|
+
current = current->next;
|
166
|
+
}
|
167
|
+
char *clean_json = grpc_json_dump_to_string(json, 2);
|
168
|
+
gpr_free(json_copy);
|
169
|
+
grpc_json_destroy(json);
|
170
|
+
return clean_json;
|
171
|
+
}
|
172
|
+
|
147
173
|
grpc_call_credentials *grpc_service_account_jwt_access_credentials_create(
|
148
174
|
const char *json_key, gpr_timespec token_lifetime, void *reserved) {
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
175
|
+
if (grpc_api_trace) {
|
176
|
+
char *clean_json = redact_private_key(json_key);
|
177
|
+
gpr_log(GPR_INFO,
|
178
|
+
"grpc_service_account_jwt_access_credentials_create("
|
179
|
+
"json_key=%s, "
|
180
|
+
"token_lifetime="
|
181
|
+
"gpr_timespec { tv_sec: %" PRId64
|
182
|
+
", tv_nsec: %d, clock_type: %d }, "
|
183
|
+
"reserved=%p)",
|
184
|
+
clean_json, token_lifetime.tv_sec, token_lifetime.tv_nsec,
|
185
|
+
(int)token_lifetime.clock_type, reserved);
|
186
|
+
gpr_free(clean_json);
|
187
|
+
}
|
158
188
|
GPR_ASSERT(reserved == NULL);
|
159
|
-
|
160
|
-
|
189
|
+
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
190
|
+
grpc_call_credentials *creds =
|
191
|
+
grpc_service_account_jwt_access_credentials_create_from_auth_json_key(
|
192
|
+
&exec_ctx, grpc_auth_json_key_create_from_string(json_key),
|
193
|
+
token_lifetime);
|
194
|
+
grpc_exec_ctx_finish(&exec_ctx);
|
195
|
+
return creds;
|
161
196
|
}
|
@@ -57,6 +57,7 @@ typedef struct {
|
|
57
57
|
// Takes ownership of the key.
|
58
58
|
grpc_call_credentials *
|
59
59
|
grpc_service_account_jwt_access_credentials_create_from_auth_json_key(
|
60
|
-
grpc_auth_json_key key,
|
60
|
+
grpc_exec_ctx *exec_ctx, grpc_auth_json_key key,
|
61
|
+
gpr_timespec token_lifetime);
|
61
62
|
|
62
63
|
#endif /* GRPC_CORE_LIB_SECURITY_CREDENTIALS_JWT_JWT_CREDENTIALS_H */
|
@@ -36,11 +36,6 @@
|
|
36
36
|
#include <limits.h>
|
37
37
|
#include <string.h>
|
38
38
|
|
39
|
-
#include "src/core/lib/http/httpcli.h"
|
40
|
-
#include "src/core/lib/iomgr/polling_entity.h"
|
41
|
-
#include "src/core/lib/security/util/b64.h"
|
42
|
-
#include "src/core/lib/tsi/ssl_types.h"
|
43
|
-
|
44
39
|
#include <grpc/support/alloc.h>
|
45
40
|
#include <grpc/support/log.h>
|
46
41
|
#include <grpc/support/string_util.h>
|
@@ -48,6 +43,13 @@
|
|
48
43
|
#include <grpc/support/useful.h>
|
49
44
|
#include <openssl/pem.h>
|
50
45
|
|
46
|
+
#include "src/core/lib/http/httpcli.h"
|
47
|
+
#include "src/core/lib/iomgr/polling_entity.h"
|
48
|
+
#include "src/core/lib/security/util/b64.h"
|
49
|
+
#include "src/core/lib/slice/slice_internal.h"
|
50
|
+
#include "src/core/lib/support/string.h"
|
51
|
+
#include "src/core/lib/tsi/ssl_types.h"
|
52
|
+
|
51
53
|
/* --- Utils. --- */
|
52
54
|
|
53
55
|
const char *grpc_jwt_verifier_status_to_string(
|
@@ -84,19 +86,20 @@ static const EVP_MD *evp_md_from_alg(const char *alg) {
|
|
84
86
|
}
|
85
87
|
}
|
86
88
|
|
87
|
-
static grpc_json *parse_json_part_from_jwt(
|
88
|
-
|
89
|
+
static grpc_json *parse_json_part_from_jwt(grpc_exec_ctx *exec_ctx,
|
90
|
+
const char *str, size_t len,
|
91
|
+
grpc_slice *buffer) {
|
89
92
|
grpc_json *json;
|
90
93
|
|
91
|
-
*buffer = grpc_base64_decode_with_len(str, len, 1);
|
92
|
-
if (
|
94
|
+
*buffer = grpc_base64_decode_with_len(exec_ctx, str, len, 1);
|
95
|
+
if (GRPC_SLICE_IS_EMPTY(*buffer)) {
|
93
96
|
gpr_log(GPR_ERROR, "Invalid base64.");
|
94
97
|
return NULL;
|
95
98
|
}
|
96
|
-
json = grpc_json_parse_string_with_len((char *)
|
97
|
-
|
99
|
+
json = grpc_json_parse_string_with_len((char *)GRPC_SLICE_START_PTR(*buffer),
|
100
|
+
GRPC_SLICE_LENGTH(*buffer));
|
98
101
|
if (json == NULL) {
|
99
|
-
|
102
|
+
grpc_slice_unref_internal(exec_ctx, *buffer);
|
100
103
|
gpr_log(GPR_ERROR, "JSON parsing error.");
|
101
104
|
}
|
102
105
|
return json;
|
@@ -129,16 +132,17 @@ typedef struct {
|
|
129
132
|
const char *kid;
|
130
133
|
const char *typ;
|
131
134
|
/* TODO(jboeuf): Add others as needed (jku, jwk, x5u, x5c and so on...). */
|
132
|
-
|
135
|
+
grpc_slice buffer;
|
133
136
|
} jose_header;
|
134
137
|
|
135
|
-
static void jose_header_destroy(jose_header *h) {
|
136
|
-
|
138
|
+
static void jose_header_destroy(grpc_exec_ctx *exec_ctx, jose_header *h) {
|
139
|
+
grpc_slice_unref_internal(exec_ctx, h->buffer);
|
137
140
|
gpr_free(h);
|
138
141
|
}
|
139
142
|
|
140
143
|
/* Takes ownership of json and buffer. */
|
141
|
-
static jose_header *jose_header_from_json(
|
144
|
+
static jose_header *jose_header_from_json(grpc_exec_ctx *exec_ctx,
|
145
|
+
grpc_json *json, grpc_slice buffer) {
|
142
146
|
grpc_json *cur;
|
143
147
|
jose_header *h = gpr_malloc(sizeof(jose_header));
|
144
148
|
memset(h, 0, sizeof(jose_header));
|
@@ -173,7 +177,7 @@ static jose_header *jose_header_from_json(grpc_json *json, gpr_slice buffer) {
|
|
173
177
|
|
174
178
|
error:
|
175
179
|
grpc_json_destroy(json);
|
176
|
-
jose_header_destroy(h);
|
180
|
+
jose_header_destroy(exec_ctx, h);
|
177
181
|
return NULL;
|
178
182
|
}
|
179
183
|
|
@@ -190,12 +194,12 @@ struct grpc_jwt_claims {
|
|
190
194
|
gpr_timespec nbf;
|
191
195
|
|
192
196
|
grpc_json *json;
|
193
|
-
|
197
|
+
grpc_slice buffer;
|
194
198
|
};
|
195
199
|
|
196
|
-
void grpc_jwt_claims_destroy(grpc_jwt_claims *claims) {
|
200
|
+
void grpc_jwt_claims_destroy(grpc_exec_ctx *exec_ctx, grpc_jwt_claims *claims) {
|
197
201
|
grpc_json_destroy(claims->json);
|
198
|
-
|
202
|
+
grpc_slice_unref_internal(exec_ctx, claims->buffer);
|
199
203
|
gpr_free(claims);
|
200
204
|
}
|
201
205
|
|
@@ -240,7 +244,8 @@ gpr_timespec grpc_jwt_claims_not_before(const grpc_jwt_claims *claims) {
|
|
240
244
|
}
|
241
245
|
|
242
246
|
/* Takes ownership of json and buffer even in case of failure. */
|
243
|
-
grpc_jwt_claims *grpc_jwt_claims_from_json(
|
247
|
+
grpc_jwt_claims *grpc_jwt_claims_from_json(grpc_exec_ctx *exec_ctx,
|
248
|
+
grpc_json *json, grpc_slice buffer) {
|
244
249
|
grpc_json *cur;
|
245
250
|
grpc_jwt_claims *claims = gpr_malloc(sizeof(grpc_jwt_claims));
|
246
251
|
memset(claims, 0, sizeof(grpc_jwt_claims));
|
@@ -281,7 +286,7 @@ grpc_jwt_claims *grpc_jwt_claims_from_json(grpc_json *json, gpr_slice buffer) {
|
|
281
286
|
return claims;
|
282
287
|
|
283
288
|
error:
|
284
|
-
grpc_jwt_claims_destroy(claims);
|
289
|
+
grpc_jwt_claims_destroy(exec_ctx, claims);
|
285
290
|
return NULL;
|
286
291
|
}
|
287
292
|
|
@@ -305,6 +310,17 @@ grpc_jwt_verifier_status grpc_jwt_claims_check(const grpc_jwt_claims *claims,
|
|
305
310
|
return GRPC_JWT_VERIFIER_TIME_CONSTRAINT_FAILURE;
|
306
311
|
}
|
307
312
|
|
313
|
+
/* This should be probably up to the upper layer to decide but let's harcode
|
314
|
+
the 99% use case here for email issuers, where the JWT must be self
|
315
|
+
issued. */
|
316
|
+
if (grpc_jwt_issuer_email_domain(claims->iss) != NULL &&
|
317
|
+
claims->sub != NULL && strcmp(claims->iss, claims->sub) != 0) {
|
318
|
+
gpr_log(GPR_ERROR,
|
319
|
+
"Email issuer (%s) cannot assert another subject (%s) than itself.",
|
320
|
+
claims->iss, claims->sub);
|
321
|
+
return GRPC_JWT_VERIFIER_BAD_SUBJECT;
|
322
|
+
}
|
323
|
+
|
308
324
|
if (audience == NULL) {
|
309
325
|
audience_ok = claims->aud == NULL;
|
310
326
|
} else {
|
@@ -333,8 +349,8 @@ typedef struct {
|
|
333
349
|
jose_header *header;
|
334
350
|
grpc_jwt_claims *claims;
|
335
351
|
char *audience;
|
336
|
-
|
337
|
-
|
352
|
+
grpc_slice signature;
|
353
|
+
grpc_slice signed_data;
|
338
354
|
void *user_data;
|
339
355
|
grpc_jwt_verification_done_cb user_cb;
|
340
356
|
grpc_http_response responses[HTTP_RESPONSE_COUNT];
|
@@ -343,7 +359,7 @@ typedef struct {
|
|
343
359
|
/* Takes ownership of the header, claims and signature. */
|
344
360
|
static verifier_cb_ctx *verifier_cb_ctx_create(
|
345
361
|
grpc_jwt_verifier *verifier, grpc_pollset *pollset, jose_header *header,
|
346
|
-
grpc_jwt_claims *claims, const char *audience,
|
362
|
+
grpc_jwt_claims *claims, const char *audience, grpc_slice signature,
|
347
363
|
const char *signed_jwt, size_t signed_jwt_len, void *user_data,
|
348
364
|
grpc_jwt_verification_done_cb cb) {
|
349
365
|
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
@@ -355,19 +371,19 @@ static verifier_cb_ctx *verifier_cb_ctx_create(
|
|
355
371
|
ctx->audience = gpr_strdup(audience);
|
356
372
|
ctx->claims = claims;
|
357
373
|
ctx->signature = signature;
|
358
|
-
ctx->signed_data =
|
374
|
+
ctx->signed_data = grpc_slice_from_copied_buffer(signed_jwt, signed_jwt_len);
|
359
375
|
ctx->user_data = user_data;
|
360
376
|
ctx->user_cb = cb;
|
361
377
|
grpc_exec_ctx_finish(&exec_ctx);
|
362
378
|
return ctx;
|
363
379
|
}
|
364
380
|
|
365
|
-
void verifier_cb_ctx_destroy(verifier_cb_ctx *ctx) {
|
381
|
+
void verifier_cb_ctx_destroy(grpc_exec_ctx *exec_ctx, verifier_cb_ctx *ctx) {
|
366
382
|
if (ctx->audience != NULL) gpr_free(ctx->audience);
|
367
|
-
if (ctx->claims != NULL) grpc_jwt_claims_destroy(ctx->claims);
|
368
|
-
|
369
|
-
|
370
|
-
jose_header_destroy(ctx->header);
|
383
|
+
if (ctx->claims != NULL) grpc_jwt_claims_destroy(exec_ctx, ctx->claims);
|
384
|
+
grpc_slice_unref_internal(exec_ctx, ctx->signature);
|
385
|
+
grpc_slice_unref_internal(exec_ctx, ctx->signed_data);
|
386
|
+
jose_header_destroy(exec_ctx, ctx->header);
|
371
387
|
for (size_t i = 0; i < HTTP_RESPONSE_COUNT; i++) {
|
372
388
|
grpc_http_response_destroy(&ctx->responses[i]);
|
373
389
|
}
|
@@ -447,23 +463,24 @@ end:
|
|
447
463
|
return result;
|
448
464
|
}
|
449
465
|
|
450
|
-
static BIGNUM *bignum_from_base64(const char *b64) {
|
466
|
+
static BIGNUM *bignum_from_base64(grpc_exec_ctx *exec_ctx, const char *b64) {
|
451
467
|
BIGNUM *result = NULL;
|
452
|
-
|
468
|
+
grpc_slice bin;
|
453
469
|
|
454
470
|
if (b64 == NULL) return NULL;
|
455
|
-
bin = grpc_base64_decode(b64, 1);
|
456
|
-
if (
|
471
|
+
bin = grpc_base64_decode(exec_ctx, b64, 1);
|
472
|
+
if (GRPC_SLICE_IS_EMPTY(bin)) {
|
457
473
|
gpr_log(GPR_ERROR, "Invalid base64 for big num.");
|
458
474
|
return NULL;
|
459
475
|
}
|
460
|
-
result = BN_bin2bn(
|
461
|
-
TSI_SIZE_AS_SIZE(
|
462
|
-
|
476
|
+
result = BN_bin2bn(GRPC_SLICE_START_PTR(bin),
|
477
|
+
TSI_SIZE_AS_SIZE(GRPC_SLICE_LENGTH(bin)), NULL);
|
478
|
+
grpc_slice_unref_internal(exec_ctx, bin);
|
463
479
|
return result;
|
464
480
|
}
|
465
481
|
|
466
|
-
static EVP_PKEY *pkey_from_jwk(
|
482
|
+
static EVP_PKEY *pkey_from_jwk(grpc_exec_ctx *exec_ctx, const grpc_json *json,
|
483
|
+
const char *kty) {
|
467
484
|
const grpc_json *key_prop;
|
468
485
|
RSA *rsa = NULL;
|
469
486
|
EVP_PKEY *result = NULL;
|
@@ -480,10 +497,12 @@ static EVP_PKEY *pkey_from_jwk(const grpc_json *json, const char *kty) {
|
|
480
497
|
}
|
481
498
|
for (key_prop = json->child; key_prop != NULL; key_prop = key_prop->next) {
|
482
499
|
if (strcmp(key_prop->key, "n") == 0) {
|
483
|
-
rsa->n =
|
500
|
+
rsa->n =
|
501
|
+
bignum_from_base64(exec_ctx, validate_string_field(key_prop, "n"));
|
484
502
|
if (rsa->n == NULL) goto end;
|
485
503
|
} else if (strcmp(key_prop->key, "e") == 0) {
|
486
|
-
rsa->e =
|
504
|
+
rsa->e =
|
505
|
+
bignum_from_base64(exec_ctx, validate_string_field(key_prop, "e"));
|
487
506
|
if (rsa->e == NULL) goto end;
|
488
507
|
}
|
489
508
|
}
|
@@ -499,7 +518,8 @@ end:
|
|
499
518
|
return result;
|
500
519
|
}
|
501
520
|
|
502
|
-
static EVP_PKEY *find_verification_key(
|
521
|
+
static EVP_PKEY *find_verification_key(grpc_exec_ctx *exec_ctx,
|
522
|
+
const grpc_json *json,
|
503
523
|
const char *header_alg,
|
504
524
|
const char *header_kid) {
|
505
525
|
const grpc_json *jkey;
|
@@ -543,7 +563,7 @@ static EVP_PKEY *find_verification_key(const grpc_json *json,
|
|
543
563
|
}
|
544
564
|
if (alg != NULL && kid != NULL && kty != NULL &&
|
545
565
|
strcmp(kid, header_kid) == 0 && strcmp(alg, header_alg) == 0) {
|
546
|
-
return pkey_from_jwk(jkey, kty);
|
566
|
+
return pkey_from_jwk(exec_ctx, jkey, kty);
|
547
567
|
}
|
548
568
|
}
|
549
569
|
gpr_log(GPR_ERROR,
|
@@ -553,7 +573,7 @@ static EVP_PKEY *find_verification_key(const grpc_json *json,
|
|
553
573
|
}
|
554
574
|
|
555
575
|
static int verify_jwt_signature(EVP_PKEY *key, const char *alg,
|
556
|
-
|
576
|
+
grpc_slice signature, grpc_slice signed_data) {
|
557
577
|
EVP_MD_CTX *md_ctx = EVP_MD_CTX_create();
|
558
578
|
const EVP_MD *md = evp_md_from_alg(alg);
|
559
579
|
int result = 0;
|
@@ -567,13 +587,13 @@ static int verify_jwt_signature(EVP_PKEY *key, const char *alg,
|
|
567
587
|
gpr_log(GPR_ERROR, "EVP_DigestVerifyInit failed.");
|
568
588
|
goto end;
|
569
589
|
}
|
570
|
-
if (EVP_DigestVerifyUpdate(md_ctx,
|
571
|
-
|
590
|
+
if (EVP_DigestVerifyUpdate(md_ctx, GRPC_SLICE_START_PTR(signed_data),
|
591
|
+
GRPC_SLICE_LENGTH(signed_data)) != 1) {
|
572
592
|
gpr_log(GPR_ERROR, "EVP_DigestVerifyUpdate failed.");
|
573
593
|
goto end;
|
574
594
|
}
|
575
|
-
if (EVP_DigestVerifyFinal(md_ctx,
|
576
|
-
|
595
|
+
if (EVP_DigestVerifyFinal(md_ctx, GRPC_SLICE_START_PTR(signature),
|
596
|
+
GRPC_SLICE_LENGTH(signature)) != 1) {
|
577
597
|
gpr_log(GPR_ERROR, "JWT signature verification failed.");
|
578
598
|
goto end;
|
579
599
|
}
|
@@ -597,7 +617,7 @@ static void on_keys_retrieved(grpc_exec_ctx *exec_ctx, void *user_data,
|
|
597
617
|
goto end;
|
598
618
|
}
|
599
619
|
verification_key =
|
600
|
-
find_verification_key(json, ctx->header->alg, ctx->header->kid);
|
620
|
+
find_verification_key(exec_ctx, json, ctx->header->alg, ctx->header->kid);
|
601
621
|
if (verification_key == NULL) {
|
602
622
|
gpr_log(GPR_ERROR, "Could not find verification key with kid %s.",
|
603
623
|
ctx->header->kid);
|
@@ -621,8 +641,8 @@ static void on_keys_retrieved(grpc_exec_ctx *exec_ctx, void *user_data,
|
|
621
641
|
end:
|
622
642
|
if (json != NULL) grpc_json_destroy(json);
|
623
643
|
if (verification_key != NULL) EVP_PKEY_free(verification_key);
|
624
|
-
ctx->user_cb(ctx->user_data, status, claims);
|
625
|
-
verifier_cb_ctx_destroy(ctx);
|
644
|
+
ctx->user_cb(exec_ctx, ctx->user_data, status, claims);
|
645
|
+
verifier_cb_ctx_destroy(exec_ctx, ctx);
|
626
646
|
}
|
627
647
|
|
628
648
|
static void on_openid_config_retrieved(grpc_exec_ctx *exec_ctx, void *user_data,
|
@@ -657,19 +677,26 @@ static void on_openid_config_retrieved(grpc_exec_ctx *exec_ctx, void *user_data,
|
|
657
677
|
*(req.host + (req.http.path - jwks_uri)) = '\0';
|
658
678
|
}
|
659
679
|
|
680
|
+
/* TODO(ctiller): Carry the resource_quota in ctx and share it with the host
|
681
|
+
channel. This would allow us to cancel an authentication query when under
|
682
|
+
extreme memory pressure. */
|
683
|
+
grpc_resource_quota *resource_quota =
|
684
|
+
grpc_resource_quota_create("jwt_verifier");
|
660
685
|
grpc_httpcli_get(
|
661
|
-
exec_ctx, &ctx->verifier->http_ctx, &ctx->pollent, &req,
|
686
|
+
exec_ctx, &ctx->verifier->http_ctx, &ctx->pollent, resource_quota, &req,
|
662
687
|
gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), grpc_jwt_verifier_max_delay),
|
663
|
-
grpc_closure_create(on_keys_retrieved, ctx),
|
688
|
+
grpc_closure_create(on_keys_retrieved, ctx, grpc_schedule_on_exec_ctx),
|
664
689
|
&ctx->responses[HTTP_RESPONSE_KEYS]);
|
690
|
+
grpc_resource_quota_unref_internal(exec_ctx, resource_quota);
|
665
691
|
grpc_json_destroy(json);
|
666
692
|
gpr_free(req.host);
|
667
693
|
return;
|
668
694
|
|
669
695
|
error:
|
670
696
|
if (json != NULL) grpc_json_destroy(json);
|
671
|
-
ctx->user_cb(ctx->user_data, GRPC_JWT_VERIFIER_KEY_RETRIEVAL_ERROR,
|
672
|
-
|
697
|
+
ctx->user_cb(exec_ctx, ctx->user_data, GRPC_JWT_VERIFIER_KEY_RETRIEVAL_ERROR,
|
698
|
+
NULL);
|
699
|
+
verifier_cb_ctx_destroy(exec_ctx, ctx);
|
673
700
|
}
|
674
701
|
|
675
702
|
static email_key_mapping *verifier_get_mapping(grpc_jwt_verifier *v,
|
@@ -699,10 +726,26 @@ static void verifier_put_mapping(grpc_jwt_verifier *v, const char *email_domain,
|
|
699
726
|
GPR_ASSERT(v->num_mappings <= v->allocated_mappings);
|
700
727
|
}
|
701
728
|
|
729
|
+
/* Very non-sophisticated way to detect an email address. Should be good
|
730
|
+
enough for now... */
|
731
|
+
const char *grpc_jwt_issuer_email_domain(const char *issuer) {
|
732
|
+
const char *at_sign = strchr(issuer, '@');
|
733
|
+
if (at_sign == NULL) return NULL;
|
734
|
+
const char *email_domain = at_sign + 1;
|
735
|
+
if (*email_domain == '\0') return NULL;
|
736
|
+
const char *dot = strrchr(email_domain, '.');
|
737
|
+
if (dot == NULL || dot == email_domain) return email_domain;
|
738
|
+
GPR_ASSERT(dot > email_domain);
|
739
|
+
/* There may be a subdomain, we just want the domain. */
|
740
|
+
dot = gpr_memrchr(email_domain, '.', (size_t)(dot - email_domain));
|
741
|
+
if (dot == NULL) return email_domain;
|
742
|
+
return dot + 1;
|
743
|
+
}
|
744
|
+
|
702
745
|
/* Takes ownership of ctx. */
|
703
746
|
static void retrieve_key_and_verify(grpc_exec_ctx *exec_ctx,
|
704
747
|
verifier_cb_ctx *ctx) {
|
705
|
-
const char *
|
748
|
+
const char *email_domain;
|
706
749
|
grpc_closure *http_cb;
|
707
750
|
char *path_prefix = NULL;
|
708
751
|
const char *iss;
|
@@ -727,13 +770,9 @@ static void retrieve_key_and_verify(grpc_exec_ctx *exec_ctx,
|
|
727
770
|
Nobody seems to implement the account/email/webfinger part 2. of the spec
|
728
771
|
so we will rely instead on email/url mappings if we detect such an issuer.
|
729
772
|
Part 4, on the other hand is implemented by both google and salesforce. */
|
730
|
-
|
731
|
-
|
732
|
-
enough for now... */
|
733
|
-
at_sign = strchr(iss, '@');
|
734
|
-
if (at_sign != NULL) {
|
773
|
+
email_domain = grpc_jwt_issuer_email_domain(iss);
|
774
|
+
if (email_domain != NULL) {
|
735
775
|
email_key_mapping *mapping;
|
736
|
-
const char *email_domain = at_sign + 1;
|
737
776
|
GPR_ASSERT(ctx->verifier != NULL);
|
738
777
|
mapping = verifier_get_mapping(ctx->verifier, email_domain);
|
739
778
|
if (mapping == NULL) {
|
@@ -748,7 +787,8 @@ static void retrieve_key_and_verify(grpc_exec_ctx *exec_ctx,
|
|
748
787
|
*(path_prefix++) = '\0';
|
749
788
|
gpr_asprintf(&req.http.path, "/%s/%s", path_prefix, iss);
|
750
789
|
}
|
751
|
-
http_cb =
|
790
|
+
http_cb =
|
791
|
+
grpc_closure_create(on_keys_retrieved, ctx, grpc_schedule_on_exec_ctx);
|
752
792
|
rsp_idx = HTTP_RESPONSE_KEYS;
|
753
793
|
} else {
|
754
794
|
req.host = gpr_strdup(strstr(iss, "https://") == iss ? iss + 8 : iss);
|
@@ -760,21 +800,29 @@ static void retrieve_key_and_verify(grpc_exec_ctx *exec_ctx,
|
|
760
800
|
gpr_asprintf(&req.http.path, "/%s%s", path_prefix,
|
761
801
|
GRPC_OPENID_CONFIG_URL_SUFFIX);
|
762
802
|
}
|
763
|
-
http_cb = grpc_closure_create(on_openid_config_retrieved, ctx
|
803
|
+
http_cb = grpc_closure_create(on_openid_config_retrieved, ctx,
|
804
|
+
grpc_schedule_on_exec_ctx);
|
764
805
|
rsp_idx = HTTP_RESPONSE_OPENID;
|
765
806
|
}
|
766
807
|
|
808
|
+
/* TODO(ctiller): Carry the resource_quota in ctx and share it with the host
|
809
|
+
channel. This would allow us to cancel an authentication query when under
|
810
|
+
extreme memory pressure. */
|
811
|
+
grpc_resource_quota *resource_quota =
|
812
|
+
grpc_resource_quota_create("jwt_verifier");
|
767
813
|
grpc_httpcli_get(
|
768
|
-
exec_ctx, &ctx->verifier->http_ctx, &ctx->pollent, &req,
|
814
|
+
exec_ctx, &ctx->verifier->http_ctx, &ctx->pollent, resource_quota, &req,
|
769
815
|
gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), grpc_jwt_verifier_max_delay),
|
770
816
|
http_cb, &ctx->responses[rsp_idx]);
|
817
|
+
grpc_resource_quota_unref_internal(exec_ctx, resource_quota);
|
771
818
|
gpr_free(req.host);
|
772
819
|
gpr_free(req.http.path);
|
773
820
|
return;
|
774
821
|
|
775
822
|
error:
|
776
|
-
ctx->user_cb(ctx->user_data, GRPC_JWT_VERIFIER_KEY_RETRIEVAL_ERROR,
|
777
|
-
|
823
|
+
ctx->user_cb(exec_ctx, ctx->user_data, GRPC_JWT_VERIFIER_KEY_RETRIEVAL_ERROR,
|
824
|
+
NULL);
|
825
|
+
verifier_cb_ctx_destroy(exec_ctx, ctx);
|
778
826
|
}
|
779
827
|
|
780
828
|
void grpc_jwt_verifier_verify(grpc_exec_ctx *exec_ctx,
|
@@ -787,32 +835,34 @@ void grpc_jwt_verifier_verify(grpc_exec_ctx *exec_ctx,
|
|
787
835
|
grpc_json *json;
|
788
836
|
jose_header *header = NULL;
|
789
837
|
grpc_jwt_claims *claims = NULL;
|
790
|
-
|
791
|
-
|
792
|
-
|
838
|
+
grpc_slice header_buffer;
|
839
|
+
grpc_slice claims_buffer;
|
840
|
+
grpc_slice signature;
|
793
841
|
size_t signed_jwt_len;
|
794
842
|
const char *cur = jwt;
|
795
843
|
|
796
844
|
GPR_ASSERT(verifier != NULL && jwt != NULL && audience != NULL && cb != NULL);
|
797
845
|
dot = strchr(cur, '.');
|
798
846
|
if (dot == NULL) goto error;
|
799
|
-
json = parse_json_part_from_jwt(cur, (size_t)(dot - cur),
|
847
|
+
json = parse_json_part_from_jwt(exec_ctx, cur, (size_t)(dot - cur),
|
848
|
+
&header_buffer);
|
800
849
|
if (json == NULL) goto error;
|
801
|
-
header = jose_header_from_json(json, header_buffer);
|
850
|
+
header = jose_header_from_json(exec_ctx, json, header_buffer);
|
802
851
|
if (header == NULL) goto error;
|
803
852
|
|
804
853
|
cur = dot + 1;
|
805
854
|
dot = strchr(cur, '.');
|
806
855
|
if (dot == NULL) goto error;
|
807
|
-
json = parse_json_part_from_jwt(cur, (size_t)(dot - cur),
|
856
|
+
json = parse_json_part_from_jwt(exec_ctx, cur, (size_t)(dot - cur),
|
857
|
+
&claims_buffer);
|
808
858
|
if (json == NULL) goto error;
|
809
|
-
claims = grpc_jwt_claims_from_json(json, claims_buffer);
|
859
|
+
claims = grpc_jwt_claims_from_json(exec_ctx, json, claims_buffer);
|
810
860
|
if (claims == NULL) goto error;
|
811
861
|
|
812
862
|
signed_jwt_len = (size_t)(dot - jwt);
|
813
863
|
cur = dot + 1;
|
814
|
-
signature = grpc_base64_decode(cur, 1);
|
815
|
-
if (
|
864
|
+
signature = grpc_base64_decode(exec_ctx, cur, 1);
|
865
|
+
if (GRPC_SLICE_IS_EMPTY(signature)) goto error;
|
816
866
|
retrieve_key_and_verify(
|
817
867
|
exec_ctx,
|
818
868
|
verifier_cb_ctx_create(verifier, pollset, header, claims, audience,
|
@@ -820,9 +870,9 @@ void grpc_jwt_verifier_verify(grpc_exec_ctx *exec_ctx,
|
|
820
870
|
return;
|
821
871
|
|
822
872
|
error:
|
823
|
-
if (header != NULL) jose_header_destroy(header);
|
824
|
-
if (claims != NULL) grpc_jwt_claims_destroy(claims);
|
825
|
-
cb(user_data, GRPC_JWT_VERIFIER_BAD_FORMAT, NULL);
|
873
|
+
if (header != NULL) jose_header_destroy(exec_ctx, header);
|
874
|
+
if (claims != NULL) grpc_jwt_claims_destroy(exec_ctx, claims);
|
875
|
+
cb(exec_ctx, user_data, GRPC_JWT_VERIFIER_BAD_FORMAT, NULL);
|
826
876
|
}
|
827
877
|
|
828
878
|
grpc_jwt_verifier *grpc_jwt_verifier_create(
|