wearefair-grpc 1.3.1.pre.a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.yardopts +1 -0
- data/Makefile +19484 -0
- data/etc/roots.pem +5288 -0
- data/include/grpc/byte_buffer.h +102 -0
- data/include/grpc/byte_buffer_reader.h +39 -0
- data/include/grpc/census.h +484 -0
- data/include/grpc/compression.h +85 -0
- data/include/grpc/grpc.h +509 -0
- data/include/grpc/grpc_cronet.h +51 -0
- data/include/grpc/grpc_posix.h +81 -0
- data/include/grpc/grpc_security.h +390 -0
- data/include/grpc/grpc_security_constants.h +114 -0
- data/include/grpc/impl/codegen/atm.h +100 -0
- data/include/grpc/impl/codegen/atm_gcc_atomic.h +97 -0
- data/include/grpc/impl/codegen/atm_gcc_sync.h +97 -0
- data/include/grpc/impl/codegen/atm_windows.h +140 -0
- data/include/grpc/impl/codegen/byte_buffer_reader.h +57 -0
- data/include/grpc/impl/codegen/compression_types.h +122 -0
- data/include/grpc/impl/codegen/connectivity_state.h +61 -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/gpr_types.h +75 -0
- data/include/grpc/impl/codegen/grpc_types.h +550 -0
- data/include/grpc/impl/codegen/port_platform.h +421 -0
- data/include/grpc/impl/codegen/propagation_bits.h +67 -0
- data/include/grpc/impl/codegen/slice.h +157 -0
- data/include/grpc/impl/codegen/status.h +163 -0
- data/include/grpc/impl/codegen/sync.h +75 -0
- data/include/grpc/impl/codegen/sync_generic.h +55 -0
- data/include/grpc/impl/codegen/sync_posix.h +47 -0
- data/include/grpc/impl/codegen/sync_windows.h +49 -0
- data/include/grpc/load_reporting.h +63 -0
- data/include/grpc/module.modulemap +13 -0
- data/include/grpc/slice.h +168 -0
- data/include/grpc/slice_buffer.h +94 -0
- data/include/grpc/status.h +39 -0
- data/include/grpc/support/alloc.h +82 -0
- data/include/grpc/support/atm.h +39 -0
- data/include/grpc/support/atm_gcc_atomic.h +39 -0
- data/include/grpc/support/atm_gcc_sync.h +39 -0
- data/include/grpc/support/atm_windows.h +39 -0
- data/include/grpc/support/avl.h +97 -0
- data/include/grpc/support/cmdline.h +103 -0
- data/include/grpc/support/cpu.h +59 -0
- data/include/grpc/support/histogram.h +79 -0
- data/include/grpc/support/host_port.h +66 -0
- data/include/grpc/support/log.h +118 -0
- data/include/grpc/support/log_windows.h +53 -0
- data/include/grpc/support/port_platform.h +39 -0
- data/include/grpc/support/string_util.h +64 -0
- data/include/grpc/support/subprocess.h +59 -0
- data/include/grpc/support/sync.h +295 -0
- data/include/grpc/support/sync_generic.h +39 -0
- data/include/grpc/support/sync_posix.h +39 -0
- data/include/grpc/support/sync_windows.h +39 -0
- data/include/grpc/support/thd.h +91 -0
- data/include/grpc/support/time.h +105 -0
- data/include/grpc/support/tls.h +77 -0
- data/include/grpc/support/tls_gcc.h +100 -0
- data/include/grpc/support/tls_msvc.h +56 -0
- data/include/grpc/support/tls_pthread.h +60 -0
- data/include/grpc/support/useful.h +80 -0
- data/src/boringssl/err_data.c +1270 -0
- data/src/core/ext/census/aggregation.h +66 -0
- 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/census_interface.h +76 -0
- data/src/core/ext/census/census_rpc_stats.h +101 -0
- data/src/core/ext/census/context.c +509 -0
- data/src/core/ext/census/gen/census.pb.c +176 -0
- data/src/core/ext/census/gen/census.pb.h +295 -0
- data/src/core/ext/census/gen/trace_context.pb.c +54 -0
- data/src/core/ext/census/gen/trace_context.pb.h +93 -0
- data/src/core/ext/census/grpc_context.c +53 -0
- data/src/core/ext/census/grpc_filter.c +213 -0
- data/src/core/ext/census/grpc_filter.h +44 -0
- data/src/core/ext/census/grpc_plugin.c +85 -0
- data/src/core/ext/census/initialize.c +66 -0
- data/src/core/ext/census/mlog.c +600 -0
- data/src/core/ext/census/mlog.h +95 -0
- data/src/core/ext/census/operation.c +63 -0
- data/src/core/ext/census/placeholders.c +64 -0
- data/src/core/ext/census/resource.c +312 -0
- data/src/core/ext/census/resource.h +63 -0
- data/src/core/ext/census/rpc_metric_id.h +51 -0
- data/src/core/ext/census/trace_context.c +86 -0
- data/src/core/ext/census/trace_context.h +71 -0
- data/src/core/ext/census/trace_label.h +61 -0
- data/src/core/ext/census/trace_propagation.h +63 -0
- data/src/core/ext/census/trace_status.h +45 -0
- data/src/core/ext/census/trace_string.h +50 -0
- data/src/core/ext/census/tracing.c +71 -0
- data/src/core/ext/census/tracing.h +124 -0
- data/src/core/ext/filters/client_channel/channel_connectivity.c +226 -0
- data/src/core/ext/filters/client_channel/client_channel.c +1410 -0
- data/src/core/ext/filters/client_channel/client_channel.h +64 -0
- data/src/core/ext/filters/client_channel/client_channel_factory.c +87 -0
- data/src/core/ext/filters/client_channel/client_channel_factory.h +92 -0
- data/src/core/ext/filters/client_channel/client_channel_plugin.c +106 -0
- data/src/core/ext/filters/client_channel/connector.c +55 -0
- data/src/core/ext/filters/client_channel/connector.h +88 -0
- data/src/core/ext/filters/client_channel/http_connect_handshaker.c +389 -0
- data/src/core/ext/filters/client_channel/http_connect_handshaker.h +49 -0
- data/src/core/ext/filters/client_channel/http_proxy.c +125 -0
- data/src/core/ext/filters/client_channel/http_proxy.h +39 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.c +1419 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +44 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +57 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.c +107 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.c +249 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +105 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +88 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +158 -0
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.c +476 -0
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.c +795 -0
- data/src/core/ext/filters/client_channel/lb_policy.c +167 -0
- data/src/core/ext/filters/client_channel/lb_policy.h +209 -0
- data/src/core/ext/filters/client_channel/lb_policy_factory.c +163 -0
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +134 -0
- data/src/core/ext/filters/client_channel/lb_policy_registry.c +85 -0
- data/src/core/ext/filters/client_channel/lb_policy_registry.h +55 -0
- data/src/core/ext/filters/client_channel/parse_address.c +170 -0
- data/src/core/ext/filters/client_channel/parse_address.h +54 -0
- data/src/core/ext/filters/client_channel/proxy_mapper.c +63 -0
- data/src/core/ext/filters/client_channel/proxy_mapper.h +89 -0
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.c +139 -0
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +59 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.c +350 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +66 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c +319 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.c +289 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +64 -0
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.c +325 -0
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.c +234 -0
- data/src/core/ext/filters/client_channel/resolver.c +88 -0
- data/src/core/ext/filters/client_channel/resolver.h +101 -0
- data/src/core/ext/filters/client_channel/resolver_factory.c +56 -0
- data/src/core/ext/filters/client_channel/resolver_factory.h +85 -0
- data/src/core/ext/filters/client_channel/resolver_registry.c +174 -0
- data/src/core/ext/filters/client_channel/resolver_registry.h +84 -0
- data/src/core/ext/filters/client_channel/retry_throttle.c +210 -0
- data/src/core/ext/filters/client_channel/retry_throttle.h +65 -0
- data/src/core/ext/filters/client_channel/subchannel.c +835 -0
- data/src/core/ext/filters/client_channel/subchannel.h +203 -0
- data/src/core/ext/filters/client_channel/subchannel_index.c +262 -0
- data/src/core/ext/filters/client_channel/subchannel_index.h +77 -0
- data/src/core/ext/filters/client_channel/uri_parser.c +315 -0
- data/src/core/ext/filters/client_channel/uri_parser.h +65 -0
- data/src/core/ext/filters/load_reporting/load_reporting.c +106 -0
- data/src/core/ext/filters/load_reporting/load_reporting.h +73 -0
- data/src/core/ext/filters/load_reporting/load_reporting_filter.c +218 -0
- data/src/core/ext/filters/load_reporting/load_reporting_filter.h +42 -0
- data/src/core/ext/filters/max_age/max_age_filter.c +439 -0
- data/src/core/ext/filters/max_age/max_age_filter.h +39 -0
- data/src/core/ext/transport/chttp2/alpn/alpn.c +56 -0
- data/src/core/ext/transport/chttp2/alpn/alpn.h +49 -0
- data/src/core/ext/transport/chttp2/client/chttp2_connector.c +221 -0
- data/src/core/ext/transport/chttp2/client/chttp2_connector.h +41 -0
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +121 -0
- data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.c +95 -0
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c +239 -0
- data/src/core/ext/transport/chttp2/server/chttp2_server.c +304 -0
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +47 -0
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.c +59 -0
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.c +90 -0
- data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c +101 -0
- data/src/core/ext/transport/chttp2/transport/bin_decoder.c +236 -0
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +67 -0
- data/src/core/ext/transport/chttp2/transport/bin_encoder.c +241 -0
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +54 -0
- data/src/core/ext/transport/chttp2/transport/chttp2_plugin.c +43 -0
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +2847 -0
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +53 -0
- data/src/core/ext/transport/chttp2/transport/frame.h +61 -0
- data/src/core/ext/transport/chttp2/transport/frame_data.c +287 -0
- data/src/core/ext/transport/chttp2/transport/frame_data.h +104 -0
- data/src/core/ext/transport/chttp2/transport/frame_goaway.c +198 -0
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +78 -0
- data/src/core/ext/transport/chttp2/transport/frame_ping.c +145 -0
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +59 -0
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +125 -0
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +58 -0
- data/src/core/ext/transport/chttp2/transport/frame_settings.c +239 -0
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +76 -0
- data/src/core/ext/transport/chttp2/transport/frame_window_update.c +134 -0
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +57 -0
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.c +661 -0
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +107 -0
- data/src/core/ext/transport/chttp2/transport/hpack_parser.c +1734 -0
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +129 -0
- data/src/core/ext/transport/chttp2/transport/hpack_table.c +383 -0
- data/src/core/ext/transport/chttp2/transport/hpack_table.h +112 -0
- data/src/core/ext/transport/chttp2/transport/http2_settings.c +75 -0
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +74 -0
- data/src/core/ext/transport/chttp2/transport/huffsyms.c +105 -0
- data/src/core/ext/transport/chttp2/transport/huffsyms.h +48 -0
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.c +88 -0
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +63 -0
- data/src/core/ext/transport/chttp2/transport/internal.h +852 -0
- data/src/core/ext/transport/chttp2/transport/parsing.c +825 -0
- data/src/core/ext/transport/chttp2/transport/stream_lists.c +194 -0
- data/src/core/ext/transport/chttp2/transport/stream_map.c +176 -0
- data/src/core/ext/transport/chttp2/transport/stream_map.h +83 -0
- data/src/core/ext/transport/chttp2/transport/varint.c +65 -0
- data/src/core/ext/transport/chttp2/transport/varint.h +75 -0
- data/src/core/ext/transport/chttp2/transport/writing.c +429 -0
- data/src/core/lib/channel/channel_args.c +355 -0
- data/src/core/lib/channel/channel_args.h +126 -0
- data/src/core/lib/channel/channel_stack.c +291 -0
- data/src/core/lib/channel/channel_stack.h +319 -0
- data/src/core/lib/channel/channel_stack_builder.c +284 -0
- data/src/core/lib/channel/channel_stack_builder.h +170 -0
- data/src/core/lib/channel/compress_filter.c +353 -0
- data/src/core/lib/channel/compress_filter.h +67 -0
- data/src/core/lib/channel/connected_channel.c +188 -0
- data/src/core/lib/channel/connected_channel.h +48 -0
- data/src/core/lib/channel/context.h +64 -0
- data/src/core/lib/channel/deadline_filter.c +348 -0
- data/src/core/lib/channel/deadline_filter.h +102 -0
- data/src/core/lib/channel/handshaker.c +281 -0
- data/src/core/lib/channel/handshaker.h +182 -0
- data/src/core/lib/channel/handshaker_factory.c +54 -0
- data/src/core/lib/channel/handshaker_factory.h +66 -0
- data/src/core/lib/channel/handshaker_registry.c +113 -0
- data/src/core/lib/channel/handshaker_registry.h +63 -0
- data/src/core/lib/channel/http_client_filter.c +601 -0
- data/src/core/lib/channel/http_client_filter.h +47 -0
- data/src/core/lib/channel/http_server_filter.c +445 -0
- data/src/core/lib/channel/http_server_filter.h +42 -0
- data/src/core/lib/channel/message_size_filter.c +270 -0
- data/src/core/lib/channel/message_size_filter.h +39 -0
- data/src/core/lib/compression/algorithm_metadata.h +53 -0
- data/src/core/lib/compression/compression.c +198 -0
- data/src/core/lib/compression/message_compress.c +204 -0
- data/src/core/lib/compression/message_compress.h +54 -0
- data/src/core/lib/debug/trace.c +140 -0
- data/src/core/lib/debug/trace.h +43 -0
- data/src/core/lib/http/format_request.c +135 -0
- data/src/core/lib/http/format_request.h +47 -0
- data/src/core/lib/http/httpcli.c +336 -0
- data/src/core/lib/http/httpcli.h +141 -0
- data/src/core/lib/http/httpcli_security_connector.c +199 -0
- data/src/core/lib/http/parser.c +379 -0
- data/src/core/lib/http/parser.h +126 -0
- data/src/core/lib/iomgr/closure.c +168 -0
- data/src/core/lib/iomgr/closure.h +153 -0
- data/src/core/lib/iomgr/combiner.c +460 -0
- data/src/core/lib/iomgr/combiner.h +83 -0
- data/src/core/lib/iomgr/endpoint.c +78 -0
- data/src/core/lib/iomgr/endpoint.h +117 -0
- data/src/core/lib/iomgr/endpoint_pair.h +47 -0
- data/src/core/lib/iomgr/endpoint_pair_posix.c +87 -0
- data/src/core/lib/iomgr/endpoint_pair_uv.c +53 -0
- data/src/core/lib/iomgr/endpoint_pair_windows.c +101 -0
- data/src/core/lib/iomgr/error.c +793 -0
- data/src/core/lib/iomgr/error.h +218 -0
- data/src/core/lib/iomgr/error_internal.h +75 -0
- data/src/core/lib/iomgr/ev_epoll_linux.c +1965 -0
- data/src/core/lib/iomgr/ev_epoll_linux.h +48 -0
- data/src/core/lib/iomgr/ev_poll_posix.c +1593 -0
- data/src/core/lib/iomgr/ev_poll_posix.h +42 -0
- data/src/core/lib/iomgr/ev_posix.c +287 -0
- data/src/core/lib/iomgr/ev_posix.h +189 -0
- data/src/core/lib/iomgr/exec_ctx.c +117 -0
- data/src/core/lib/iomgr/exec_ctx.h +117 -0
- data/src/core/lib/iomgr/executor.c +170 -0
- data/src/core/lib/iomgr/executor.h +51 -0
- data/src/core/lib/iomgr/iocp_windows.c +168 -0
- data/src/core/lib/iomgr/iocp_windows.h +55 -0
- data/src/core/lib/iomgr/iomgr.c +183 -0
- data/src/core/lib/iomgr/iomgr.h +47 -0
- data/src/core/lib/iomgr/iomgr_internal.h +58 -0
- data/src/core/lib/iomgr/iomgr_posix.c +56 -0
- data/src/core/lib/iomgr/iomgr_posix.h +39 -0
- data/src/core/lib/iomgr/iomgr_uv.c +49 -0
- data/src/core/lib/iomgr/iomgr_windows.c +76 -0
- data/src/core/lib/iomgr/load_file.c +92 -0
- data/src/core/lib/iomgr/load_file.h +56 -0
- data/src/core/lib/iomgr/lockfree_event.c +238 -0
- data/src/core/lib/iomgr/lockfree_event.h +54 -0
- data/src/core/lib/iomgr/network_status_tracker.c +48 -0
- data/src/core/lib/iomgr/network_status_tracker.h +45 -0
- data/src/core/lib/iomgr/polling_entity.c +104 -0
- data/src/core/lib/iomgr/polling_entity.h +81 -0
- data/src/core/lib/iomgr/pollset.h +97 -0
- data/src/core/lib/iomgr/pollset_set.h +62 -0
- data/src/core/lib/iomgr/pollset_set_uv.c +63 -0
- data/src/core/lib/iomgr/pollset_set_windows.c +64 -0
- data/src/core/lib/iomgr/pollset_set_windows.h +39 -0
- data/src/core/lib/iomgr/pollset_uv.c +156 -0
- data/src/core/lib/iomgr/pollset_uv.h +42 -0
- data/src/core/lib/iomgr/pollset_windows.c +232 -0
- data/src/core/lib/iomgr/pollset_windows.h +78 -0
- data/src/core/lib/iomgr/port.h +138 -0
- data/src/core/lib/iomgr/resolve_address.h +70 -0
- data/src/core/lib/iomgr/resolve_address_posix.c +207 -0
- data/src/core/lib/iomgr/resolve_address_uv.c +284 -0
- data/src/core/lib/iomgr/resolve_address_windows.c +190 -0
- data/src/core/lib/iomgr/resource_quota.c +877 -0
- data/src/core/lib/iomgr/resource_quota.h +167 -0
- data/src/core/lib/iomgr/sockaddr.h +55 -0
- data/src/core/lib/iomgr/sockaddr_posix.h +44 -0
- data/src/core/lib/iomgr/sockaddr_utils.c +272 -0
- data/src/core/lib/iomgr/sockaddr_utils.h +93 -0
- data/src/core/lib/iomgr/sockaddr_windows.h +43 -0
- data/src/core/lib/iomgr/socket_factory_posix.c +110 -0
- data/src/core/lib/iomgr/socket_factory_posix.h +90 -0
- 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 +330 -0
- data/src/core/lib/iomgr/socket_utils_linux.c +57 -0
- data/src/core/lib/iomgr/socket_utils_posix.c +73 -0
- data/src/core/lib/iomgr/socket_utils_posix.h +147 -0
- 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 +167 -0
- data/src/core/lib/iomgr/socket_windows.h +125 -0
- data/src/core/lib/iomgr/tcp_client.h +55 -0
- data/src/core/lib/iomgr/tcp_client_posix.c +368 -0
- data/src/core/lib/iomgr/tcp_client_posix.h +45 -0
- data/src/core/lib/iomgr/tcp_client_uv.c +192 -0
- data/src/core/lib/iomgr/tcp_client_windows.c +260 -0
- data/src/core/lib/iomgr/tcp_posix.c +677 -0
- data/src/core/lib/iomgr/tcp_posix.h +70 -0
- data/src/core/lib/iomgr/tcp_server.h +116 -0
- data/src/core/lib/iomgr/tcp_server_posix.c +579 -0
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +135 -0
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.c +221 -0
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c +196 -0
- data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c +49 -0
- data/src/core/lib/iomgr/tcp_server_uv.c +393 -0
- data/src/core/lib/iomgr/tcp_server_windows.c +558 -0
- data/src/core/lib/iomgr/tcp_uv.c +374 -0
- data/src/core/lib/iomgr/tcp_uv.h +59 -0
- data/src/core/lib/iomgr/tcp_windows.c +462 -0
- data/src/core/lib/iomgr/tcp_windows.h +59 -0
- data/src/core/lib/iomgr/time_averaged_stats.c +77 -0
- data/src/core/lib/iomgr/time_averaged_stats.h +88 -0
- data/src/core/lib/iomgr/timer.h +111 -0
- data/src/core/lib/iomgr/timer_generic.c +567 -0
- data/src/core/lib/iomgr/timer_generic.h +49 -0
- data/src/core/lib/iomgr/timer_heap.c +152 -0
- data/src/core/lib/iomgr/timer_heap.h +57 -0
- data/src/core/lib/iomgr/timer_uv.c +103 -0
- data/src/core/lib/iomgr/timer_uv.h +47 -0
- data/src/core/lib/iomgr/udp_server.c +529 -0
- data/src/core/lib/iomgr/udp_server.h +89 -0
- data/src/core/lib/iomgr/unix_sockets_posix.c +108 -0
- data/src/core/lib/iomgr/unix_sockets_posix.h +56 -0
- data/src/core/lib/iomgr/unix_sockets_posix_noop.c +62 -0
- 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 +97 -0
- data/src/core/lib/iomgr/wakeup_fd_nospecial.c +51 -0
- data/src/core/lib/iomgr/wakeup_fd_pipe.c +112 -0
- data/src/core/lib/iomgr/wakeup_fd_pipe.h +41 -0
- data/src/core/lib/iomgr/wakeup_fd_posix.c +101 -0
- data/src/core/lib/iomgr/wakeup_fd_posix.h +109 -0
- data/src/core/lib/iomgr/workqueue.h +87 -0
- data/src/core/lib/iomgr/workqueue_uv.c +65 -0
- data/src/core/lib/iomgr/workqueue_uv.h +37 -0
- data/src/core/lib/iomgr/workqueue_windows.c +63 -0
- data/src/core/lib/iomgr/workqueue_windows.h +37 -0
- data/src/core/lib/json/json.c +63 -0
- data/src/core/lib/json/json.h +88 -0
- data/src/core/lib/json/json_common.h +49 -0
- data/src/core/lib/json/json_reader.c +675 -0
- data/src/core/lib/json/json_reader.h +160 -0
- data/src/core/lib/json/json_string.c +379 -0
- data/src/core/lib/json/json_writer.c +258 -0
- data/src/core/lib/json/json_writer.h +97 -0
- data/src/core/lib/profiling/basic_timers.c +298 -0
- data/src/core/lib/profiling/stap_timers.c +65 -0
- data/src/core/lib/profiling/timers.h +121 -0
- data/src/core/lib/security/context/security_context.c +350 -0
- data/src/core/lib/security/context/security_context.h +134 -0
- data/src/core/lib/security/credentials/composite/composite_credentials.c +274 -0
- data/src/core/lib/security/credentials/composite/composite_credentials.h +72 -0
- data/src/core/lib/security/credentials/credentials.c +308 -0
- data/src/core/lib/security/credentials/credentials.h +268 -0
- data/src/core/lib/security/credentials/credentials_metadata.c +103 -0
- data/src/core/lib/security/credentials/fake/fake_credentials.c +141 -0
- data/src/core/lib/security/credentials/fake/fake_credentials.h +71 -0
- data/src/core/lib/security/credentials/google_default/credentials_generic.c +54 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.c +337 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +60 -0
- data/src/core/lib/security/credentials/iam/iam_credentials.c +85 -0
- data/src/core/lib/security/credentials/iam/iam_credentials.h +44 -0
- data/src/core/lib/security/credentials/jwt/json_token.c +321 -0
- data/src/core/lib/security/credentials/jwt/json_token.h +88 -0
- data/src/core/lib/security/credentials/jwt/jwt_credentials.c +195 -0
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +63 -0
- data/src/core/lib/security/credentials/jwt/jwt_verifier.c +910 -0
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +140 -0
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.c +468 -0
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +109 -0
- data/src/core/lib/security/credentials/plugin/plugin_credentials.c +153 -0
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +45 -0
- data/src/core/lib/security/credentials/ssl/ssl_credentials.c +242 -0
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +48 -0
- data/src/core/lib/security/transport/auth_filters.h +42 -0
- data/src/core/lib/security/transport/client_auth_filter.c +384 -0
- data/src/core/lib/security/transport/lb_targets_info.c +70 -0
- data/src/core/lib/security/transport/lb_targets_info.h +47 -0
- data/src/core/lib/security/transport/secure_endpoint.c +427 -0
- data/src/core/lib/security/transport/secure_endpoint.h +49 -0
- data/src/core/lib/security/transport/security_connector.c +909 -0
- data/src/core/lib/security/transport/security_connector.h +252 -0
- data/src/core/lib/security/transport/security_handshaker.c +507 -0
- data/src/core/lib/security/transport/security_handshaker.h +49 -0
- data/src/core/lib/security/transport/server_auth_filter.c +277 -0
- data/src/core/lib/security/transport/tsi_error.c +42 -0
- data/src/core/lib/security/transport/tsi_error.h +42 -0
- data/src/core/lib/security/util/json_util.c +61 -0
- data/src/core/lib/security/util/json_util.h +55 -0
- data/src/core/lib/slice/b64.c +251 -0
- data/src/core/lib/slice/b64.h +65 -0
- data/src/core/lib/slice/percent_encoding.c +182 -0
- data/src/core/lib/slice/percent_encoding.h +78 -0
- data/src/core/lib/slice/slice.c +466 -0
- data/src/core/lib/slice/slice_buffer.c +355 -0
- data/src/core/lib/slice/slice_hash_table.c +125 -0
- data/src/core/lib/slice/slice_hash_table.h +77 -0
- data/src/core/lib/slice/slice_intern.c +346 -0
- data/src/core/lib/slice/slice_internal.h +64 -0
- data/src/core/lib/slice/slice_string_helpers.c +95 -0
- data/src/core/lib/slice/slice_string_helpers.h +63 -0
- data/src/core/lib/support/alloc.c +117 -0
- data/src/core/lib/support/arena.c +98 -0
- data/src/core/lib/support/arena.h +54 -0
- data/src/core/lib/support/atm.c +47 -0
- data/src/core/lib/support/avl.c +299 -0
- data/src/core/lib/support/backoff.c +87 -0
- data/src/core/lib/support/backoff.h +71 -0
- data/src/core/lib/support/block_annotate.h +48 -0
- data/src/core/lib/support/cmdline.c +345 -0
- data/src/core/lib/support/cpu_iphone.c +49 -0
- data/src/core/lib/support/cpu_linux.c +83 -0
- data/src/core/lib/support/cpu_posix.c +72 -0
- data/src/core/lib/support/cpu_windows.c +47 -0
- data/src/core/lib/support/env.h +58 -0
- data/src/core/lib/support/env_linux.c +89 -0
- data/src/core/lib/support/env_posix.c +57 -0
- data/src/core/lib/support/env_windows.c +79 -0
- data/src/core/lib/support/histogram.c +243 -0
- data/src/core/lib/support/host_port.c +110 -0
- data/src/core/lib/support/log.c +103 -0
- data/src/core/lib/support/log_android.c +87 -0
- data/src/core/lib/support/log_linux.c +105 -0
- data/src/core/lib/support/log_posix.c +106 -0
- data/src/core/lib/support/log_windows.c +112 -0
- data/src/core/lib/support/mpscq.c +83 -0
- data/src/core/lib/support/mpscq.h +65 -0
- data/src/core/lib/support/murmur_hash.c +94 -0
- data/src/core/lib/support/murmur_hash.h +44 -0
- data/src/core/lib/support/spinlock.h +52 -0
- data/src/core/lib/support/stack_lockfree.c +185 -0
- data/src/core/lib/support/stack_lockfree.h +53 -0
- data/src/core/lib/support/string.c +315 -0
- data/src/core/lib/support/string.h +128 -0
- data/src/core/lib/support/string_posix.c +86 -0
- data/src/core/lib/support/string_util_windows.c +94 -0
- data/src/core/lib/support/string_windows.c +83 -0
- data/src/core/lib/support/string_windows.h +47 -0
- data/src/core/lib/support/subprocess_posix.c +114 -0
- data/src/core/lib/support/subprocess_windows.c +141 -0
- data/src/core/lib/support/sync.c +137 -0
- data/src/core/lib/support/sync_posix.c +113 -0
- data/src/core/lib/support/sync_windows.c +133 -0
- data/src/core/lib/support/thd.c +64 -0
- data/src/core/lib/support/thd_internal.h +39 -0
- data/src/core/lib/support/thd_posix.c +95 -0
- data/src/core/lib/support/thd_windows.c +117 -0
- data/src/core/lib/support/time.c +262 -0
- data/src/core/lib/support/time_posix.c +176 -0
- data/src/core/lib/support/time_precise.c +89 -0
- data/src/core/lib/support/time_precise.h +42 -0
- data/src/core/lib/support/time_windows.c +116 -0
- data/src/core/lib/support/tls_pthread.c +45 -0
- data/src/core/lib/support/tmpfile.h +53 -0
- data/src/core/lib/support/tmpfile_msys.c +73 -0
- data/src/core/lib/support/tmpfile_posix.c +85 -0
- data/src/core/lib/support/tmpfile_windows.c +84 -0
- data/src/core/lib/support/wrap_memcpy.c +55 -0
- data/src/core/lib/surface/alarm.c +87 -0
- data/src/core/lib/surface/api_trace.c +36 -0
- data/src/core/lib/surface/api_trace.h +65 -0
- data/src/core/lib/surface/byte_buffer.c +103 -0
- data/src/core/lib/surface/byte_buffer_reader.c +140 -0
- data/src/core/lib/surface/call.c +1835 -0
- data/src/core/lib/surface/call.h +135 -0
- data/src/core/lib/surface/call_details.c +56 -0
- data/src/core/lib/surface/call_log_batch.c +131 -0
- data/src/core/lib/surface/call_test_only.h +64 -0
- data/src/core/lib/surface/channel.c +434 -0
- data/src/core/lib/surface/channel.h +99 -0
- data/src/core/lib/surface/channel_init.c +140 -0
- data/src/core/lib/surface/channel_init.h +96 -0
- data/src/core/lib/surface/channel_ping.c +80 -0
- data/src/core/lib/surface/channel_stack_type.c +54 -0
- data/src/core/lib/surface/channel_stack_type.h +58 -0
- data/src/core/lib/surface/completion_queue.c +692 -0
- data/src/core/lib/surface/completion_queue.h +102 -0
- data/src/core/lib/surface/completion_queue_factory.c +77 -0
- data/src/core/lib/surface/completion_queue_factory.h +51 -0
- data/src/core/lib/surface/event_string.c +81 -0
- data/src/core/lib/surface/event_string.h +42 -0
- data/src/core/lib/surface/init.c +261 -0
- data/src/core/lib/surface/init.h +42 -0
- data/src/core/lib/surface/init_secure.c +94 -0
- data/src/core/lib/surface/lame_client.c +188 -0
- data/src/core/lib/surface/lame_client.h +41 -0
- data/src/core/lib/surface/metadata_array.c +49 -0
- data/src/core/lib/surface/server.c +1529 -0
- data/src/core/lib/surface/server.h +71 -0
- data/src/core/lib/surface/validate_metadata.c +108 -0
- data/src/core/lib/surface/validate_metadata.h +43 -0
- data/src/core/lib/surface/version.c +41 -0
- data/src/core/lib/transport/bdp_estimator.c +104 -0
- data/src/core/lib/transport/bdp_estimator.h +76 -0
- data/src/core/lib/transport/byte_stream.c +81 -0
- data/src/core/lib/transport/byte_stream.h +85 -0
- data/src/core/lib/transport/connectivity_state.c +219 -0
- data/src/core/lib/transport/connectivity_state.h +101 -0
- data/src/core/lib/transport/error_utils.c +124 -0
- data/src/core/lib/transport/error_utils.h +56 -0
- data/src/core/lib/transport/http2_errors.h +56 -0
- data/src/core/lib/transport/metadata.c +529 -0
- data/src/core/lib/transport/metadata.h +186 -0
- data/src/core/lib/transport/metadata_batch.c +328 -0
- data/src/core/lib/transport/metadata_batch.h +166 -0
- data/src/core/lib/transport/pid_controller.c +78 -0
- data/src/core/lib/transport/pid_controller.h +77 -0
- data/src/core/lib/transport/service_config.c +266 -0
- data/src/core/lib/transport/service_config.h +77 -0
- data/src/core/lib/transport/static_metadata.c +801 -0
- data/src/core/lib/transport/static_metadata.h +557 -0
- data/src/core/lib/transport/status_conversion.c +113 -0
- data/src/core/lib/transport/status_conversion.h +49 -0
- data/src/core/lib/transport/timeout_encoding.c +190 -0
- data/src/core/lib/transport/timeout_encoding.h +49 -0
- data/src/core/lib/transport/transport.c +282 -0
- data/src/core/lib/transport/transport.h +354 -0
- data/src/core/lib/transport/transport_impl.h +90 -0
- data/src/core/lib/transport/transport_op_string.c +217 -0
- data/src/core/plugin_registry/grpc_plugin_registry.c +82 -0
- data/src/core/tsi/fake_transport_security.c +527 -0
- data/src/core/tsi/fake_transport_security.h +61 -0
- data/src/core/tsi/ssl_transport_security.c +1533 -0
- data/src/core/tsi/ssl_transport_security.h +214 -0
- data/src/core/tsi/ssl_types.h +55 -0
- data/src/core/tsi/transport_security.c +266 -0
- data/src/core/tsi/transport_security.h +111 -0
- data/src/core/tsi/transport_security_interface.h +353 -0
- data/src/ruby/bin/apis/google/protobuf/empty.rb +44 -0
- data/src/ruby/bin/apis/pubsub_demo.rb +256 -0
- data/src/ruby/bin/apis/tech/pubsub/proto/pubsub.rb +174 -0
- data/src/ruby/bin/apis/tech/pubsub/proto/pubsub_services.rb +103 -0
- data/src/ruby/bin/math_client.rb +147 -0
- data/src/ruby/bin/math_pb.rb +32 -0
- data/src/ruby/bin/math_server.rb +206 -0
- data/src/ruby/bin/math_services_pb.rb +66 -0
- data/src/ruby/bin/noproto_client.rb +108 -0
- data/src/ruby/bin/noproto_server.rb +112 -0
- data/src/ruby/ext/grpc/extconf.rb +131 -0
- data/src/ruby/ext/grpc/rb_byte_buffer.c +77 -0
- data/src/ruby/ext/grpc/rb_byte_buffer.h +50 -0
- data/src/ruby/ext/grpc/rb_call.c +1009 -0
- data/src/ruby/ext/grpc/rb_call.h +66 -0
- data/src/ruby/ext/grpc/rb_call_credentials.c +295 -0
- data/src/ruby/ext/grpc/rb_call_credentials.h +46 -0
- data/src/ruby/ext/grpc/rb_channel.c +662 -0
- data/src/ruby/ext/grpc/rb_channel.h +49 -0
- data/src/ruby/ext/grpc/rb_channel_args.c +168 -0
- data/src/ruby/ext/grpc/rb_channel_args.h +53 -0
- data/src/ruby/ext/grpc/rb_channel_credentials.c +268 -0
- data/src/ruby/ext/grpc/rb_channel_credentials.h +47 -0
- data/src/ruby/ext/grpc/rb_completion_queue.c +117 -0
- data/src/ruby/ext/grpc/rb_completion_queue.h +51 -0
- data/src/ruby/ext/grpc/rb_compression_options.c +472 -0
- data/src/ruby/ext/grpc/rb_compression_options.h +44 -0
- data/src/ruby/ext/grpc/rb_event_thread.c +158 -0
- data/src/ruby/ext/grpc/rb_event_thread.h +37 -0
- data/src/ruby/ext/grpc/rb_grpc.c +343 -0
- data/src/ruby/ext/grpc/rb_grpc.h +87 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +634 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +955 -0
- data/src/ruby/ext/grpc/rb_loader.c +72 -0
- data/src/ruby/ext/grpc/rb_loader.h +40 -0
- data/src/ruby/ext/grpc/rb_server.c +359 -0
- data/src/ruby/ext/grpc/rb_server.h +47 -0
- data/src/ruby/ext/grpc/rb_server_credentials.c +258 -0
- data/src/ruby/ext/grpc/rb_server_credentials.h +47 -0
- data/src/ruby/lib/grpc/core/time_consts.rb +71 -0
- data/src/ruby/lib/grpc/errors.rb +215 -0
- data/src/ruby/lib/grpc/generic/active_call.rb +547 -0
- data/src/ruby/lib/grpc/generic/bidi_call.rb +229 -0
- data/src/ruby/lib/grpc/generic/client_stub.rb +463 -0
- data/src/ruby/lib/grpc/generic/rpc_desc.rb +173 -0
- data/src/ruby/lib/grpc/generic/rpc_server.rb +476 -0
- data/src/ruby/lib/grpc/generic/service.rb +225 -0
- data/src/ruby/lib/grpc/grpc.rb +39 -0
- data/src/ruby/lib/grpc/grpc_c.bundle +0 -0
- data/src/ruby/lib/grpc/logconfig.rb +59 -0
- data/src/ruby/lib/grpc/notifier.rb +60 -0
- data/src/ruby/lib/grpc/version.rb +33 -0
- data/src/ruby/lib/grpc.rb +49 -0
- data/src/ruby/pb/README.md +42 -0
- data/src/ruby/pb/generate_proto_ruby.sh +58 -0
- data/src/ruby/pb/grpc/health/checker.rb +77 -0
- data/src/ruby/pb/grpc/health/v1/health_pb.rb +28 -0
- data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +56 -0
- data/src/ruby/pb/grpc/testing/duplicate/echo_duplicate_services_pb.rb +58 -0
- data/src/ruby/pb/grpc/testing/metrics_pb.rb +28 -0
- data/src/ruby/pb/grpc/testing/metrics_services_pb.rb +64 -0
- data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +15 -0
- data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +82 -0
- data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +14 -0
- data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +117 -0
- data/src/ruby/pb/test/client.rb +779 -0
- data/src/ruby/pb/test/server.rb +267 -0
- data/src/ruby/spec/call_credentials_spec.rb +57 -0
- data/src/ruby/spec/call_spec.rb +162 -0
- data/src/ruby/spec/channel_connection_spec.rb +141 -0
- data/src/ruby/spec/channel_credentials_spec.rb +97 -0
- data/src/ruby/spec/channel_spec.rb +205 -0
- data/src/ruby/spec/client_server_spec.rb +491 -0
- 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 +632 -0
- data/src/ruby/spec/generic/client_stub_spec.rb +556 -0
- data/src/ruby/spec/generic/rpc_desc_spec.rb +351 -0
- data/src/ruby/spec/generic/rpc_server_pool_spec.rb +142 -0
- data/src/ruby/spec/generic/rpc_server_spec.rb +524 -0
- data/src/ruby/spec/generic/service_spec.rb +276 -0
- data/src/ruby/spec/pb/duplicate/codegen_spec.rb +71 -0
- data/src/ruby/spec/pb/health/checker_spec.rb +222 -0
- data/src/ruby/spec/server_credentials_spec.rb +94 -0
- data/src/ruby/spec/server_spec.rb +205 -0
- data/src/ruby/spec/spec_helper.rb +71 -0
- data/src/ruby/spec/testdata/README +1 -0
- data/src/ruby/spec/testdata/ca.pem +15 -0
- data/src/ruby/spec/testdata/server1.key +16 -0
- data/src/ruby/spec/testdata/server1.pem +16 -0
- data/src/ruby/spec/time_consts_spec.rb +89 -0
- data/third_party/boringssl/crypto/aes/aes.c +1142 -0
- data/third_party/boringssl/crypto/aes/internal.h +87 -0
- data/third_party/boringssl/crypto/aes/mode_wrappers.c +112 -0
- data/third_party/boringssl/crypto/asn1/a_bitstr.c +263 -0
- data/third_party/boringssl/crypto/asn1/a_bool.c +110 -0
- data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +282 -0
- data/third_party/boringssl/crypto/asn1/a_dup.c +111 -0
- data/third_party/boringssl/crypto/asn1/a_enum.c +181 -0
- data/third_party/boringssl/crypto/asn1/a_gentm.c +256 -0
- data/third_party/boringssl/crypto/asn1/a_i2d_fp.c +147 -0
- data/third_party/boringssl/crypto/asn1/a_int.c +460 -0
- data/third_party/boringssl/crypto/asn1/a_mbstr.c +409 -0
- data/third_party/boringssl/crypto/asn1/a_object.c +400 -0
- data/third_party/boringssl/crypto/asn1/a_octet.c +77 -0
- data/third_party/boringssl/crypto/asn1/a_print.c +121 -0
- data/third_party/boringssl/crypto/asn1/a_strnid.c +309 -0
- data/third_party/boringssl/crypto/asn1/a_time.c +206 -0
- data/third_party/boringssl/crypto/asn1/a_type.c +151 -0
- data/third_party/boringssl/crypto/asn1/a_utctm.c +304 -0
- data/third_party/boringssl/crypto/asn1/a_utf8.c +234 -0
- data/third_party/boringssl/crypto/asn1/asn1_lib.c +483 -0
- data/third_party/boringssl/crypto/asn1/asn1_locl.h +63 -0
- data/third_party/boringssl/crypto/asn1/asn1_par.c +80 -0
- data/third_party/boringssl/crypto/asn1/asn_pack.c +105 -0
- data/third_party/boringssl/crypto/asn1/f_enum.c +93 -0
- data/third_party/boringssl/crypto/asn1/f_int.c +97 -0
- data/third_party/boringssl/crypto/asn1/f_string.c +91 -0
- data/third_party/boringssl/crypto/asn1/t_bitst.c +103 -0
- data/third_party/boringssl/crypto/asn1/tasn_dec.c +1221 -0
- data/third_party/boringssl/crypto/asn1/tasn_enc.c +665 -0
- data/third_party/boringssl/crypto/asn1/tasn_fre.c +246 -0
- data/third_party/boringssl/crypto/asn1/tasn_new.c +381 -0
- data/third_party/boringssl/crypto/asn1/tasn_typ.c +131 -0
- data/third_party/boringssl/crypto/asn1/tasn_utl.c +266 -0
- data/third_party/boringssl/crypto/asn1/x_bignum.c +153 -0
- data/third_party/boringssl/crypto/asn1/x_long.c +197 -0
- data/third_party/boringssl/crypto/base64/base64.c +442 -0
- data/third_party/boringssl/crypto/bio/bio.c +598 -0
- data/third_party/boringssl/crypto/bio/bio_mem.c +328 -0
- data/third_party/boringssl/crypto/bio/buffer.c +496 -0
- data/third_party/boringssl/crypto/bio/connect.c +553 -0
- data/third_party/boringssl/crypto/bio/fd.c +277 -0
- data/third_party/boringssl/crypto/bio/file.c +313 -0
- data/third_party/boringssl/crypto/bio/hexdump.c +191 -0
- data/third_party/boringssl/crypto/bio/internal.h +111 -0
- data/third_party/boringssl/crypto/bio/pair.c +803 -0
- data/third_party/boringssl/crypto/bio/printf.c +119 -0
- data/third_party/boringssl/crypto/bio/socket.c +203 -0
- data/third_party/boringssl/crypto/bio/socket_helper.c +113 -0
- data/third_party/boringssl/crypto/bn/add.c +377 -0
- data/third_party/boringssl/crypto/bn/asm/x86_64-gcc.c +531 -0
- data/third_party/boringssl/crypto/bn/bn.c +379 -0
- data/third_party/boringssl/crypto/bn/bn_asn1.c +80 -0
- data/third_party/boringssl/crypto/bn/cmp.c +225 -0
- data/third_party/boringssl/crypto/bn/convert.c +599 -0
- data/third_party/boringssl/crypto/bn/ctx.c +311 -0
- data/third_party/boringssl/crypto/bn/div.c +671 -0
- data/third_party/boringssl/crypto/bn/exponentiation.c +1258 -0
- data/third_party/boringssl/crypto/bn/gcd.c +628 -0
- data/third_party/boringssl/crypto/bn/generic.c +703 -0
- data/third_party/boringssl/crypto/bn/internal.h +245 -0
- data/third_party/boringssl/crypto/bn/kronecker.c +175 -0
- data/third_party/boringssl/crypto/bn/montgomery.c +410 -0
- data/third_party/boringssl/crypto/bn/montgomery_inv.c +160 -0
- data/third_party/boringssl/crypto/bn/mul.c +869 -0
- data/third_party/boringssl/crypto/bn/prime.c +861 -0
- data/third_party/boringssl/crypto/bn/random.c +340 -0
- data/third_party/boringssl/crypto/bn/rsaz_exp.c +319 -0
- data/third_party/boringssl/crypto/bn/rsaz_exp.h +56 -0
- data/third_party/boringssl/crypto/bn/shift.c +299 -0
- data/third_party/boringssl/crypto/bn/sqrt.c +504 -0
- data/third_party/boringssl/crypto/buf/buf.c +239 -0
- data/third_party/boringssl/crypto/bytestring/asn1_compat.c +51 -0
- data/third_party/boringssl/crypto/bytestring/ber.c +263 -0
- data/third_party/boringssl/crypto/bytestring/cbb.c +473 -0
- data/third_party/boringssl/crypto/bytestring/cbs.c +439 -0
- data/third_party/boringssl/crypto/bytestring/internal.h +75 -0
- data/third_party/boringssl/crypto/chacha/chacha.c +167 -0
- data/third_party/boringssl/crypto/cipher/aead.c +156 -0
- data/third_party/boringssl/crypto/cipher/cipher.c +652 -0
- data/third_party/boringssl/crypto/cipher/derive_key.c +154 -0
- data/third_party/boringssl/crypto/cipher/e_aes.c +1717 -0
- data/third_party/boringssl/crypto/cipher/e_chacha20poly1305.c +300 -0
- data/third_party/boringssl/crypto/cipher/e_des.c +205 -0
- data/third_party/boringssl/crypto/cipher/e_null.c +85 -0
- data/third_party/boringssl/crypto/cipher/e_rc2.c +443 -0
- data/third_party/boringssl/crypto/cipher/e_rc4.c +87 -0
- data/third_party/boringssl/crypto/cipher/e_ssl3.c +403 -0
- data/third_party/boringssl/crypto/cipher/e_tls.c +602 -0
- data/third_party/boringssl/crypto/cipher/internal.h +162 -0
- data/third_party/boringssl/crypto/cipher/tls_cbc.c +553 -0
- data/third_party/boringssl/crypto/cmac/cmac.c +239 -0
- data/third_party/boringssl/crypto/conf/conf.c +788 -0
- data/third_party/boringssl/crypto/conf/conf_def.h +127 -0
- data/third_party/boringssl/crypto/conf/internal.h +31 -0
- 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 +38 -0
- data/third_party/boringssl/crypto/cpu-intel.c +263 -0
- data/third_party/boringssl/crypto/cpu-ppc64le.c +40 -0
- data/third_party/boringssl/crypto/crypto.c +164 -0
- data/third_party/boringssl/crypto/curve25519/curve25519.c +4944 -0
- data/third_party/boringssl/crypto/curve25519/internal.h +109 -0
- data/third_party/boringssl/crypto/curve25519/spake25519.c +464 -0
- data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +246 -0
- data/third_party/boringssl/crypto/des/des.c +771 -0
- data/third_party/boringssl/crypto/des/internal.h +212 -0
- data/third_party/boringssl/crypto/dh/check.c +218 -0
- data/third_party/boringssl/crypto/dh/dh.c +487 -0
- data/third_party/boringssl/crypto/dh/dh_asn1.c +160 -0
- data/third_party/boringssl/crypto/dh/params.c +253 -0
- data/third_party/boringssl/crypto/digest/digest.c +248 -0
- data/third_party/boringssl/crypto/digest/digests.c +321 -0
- data/third_party/boringssl/crypto/digest/internal.h +112 -0
- data/third_party/boringssl/crypto/digest/md32_common.h +262 -0
- data/third_party/boringssl/crypto/dsa/dsa.c +964 -0
- data/third_party/boringssl/crypto/dsa/dsa_asn1.c +339 -0
- data/third_party/boringssl/crypto/ec/ec.c +847 -0
- data/third_party/boringssl/crypto/ec/ec_asn1.c +549 -0
- data/third_party/boringssl/crypto/ec/ec_key.c +479 -0
- data/third_party/boringssl/crypto/ec/ec_montgomery.c +308 -0
- data/third_party/boringssl/crypto/ec/internal.h +276 -0
- data/third_party/boringssl/crypto/ec/oct.c +428 -0
- data/third_party/boringssl/crypto/ec/p224-64.c +1187 -0
- data/third_party/boringssl/crypto/ec/p256-64.c +1741 -0
- data/third_party/boringssl/crypto/ec/p256-x86_64-table.h +9543 -0
- data/third_party/boringssl/crypto/ec/p256-x86_64.c +574 -0
- data/third_party/boringssl/crypto/ec/simple.c +1117 -0
- data/third_party/boringssl/crypto/ec/util-64.c +109 -0
- data/third_party/boringssl/crypto/ec/wnaf.c +449 -0
- data/third_party/boringssl/crypto/ecdh/ecdh.c +159 -0
- data/third_party/boringssl/crypto/ecdsa/ecdsa.c +478 -0
- data/third_party/boringssl/crypto/ecdsa/ecdsa_asn1.c +227 -0
- data/third_party/boringssl/crypto/engine/engine.c +96 -0
- data/third_party/boringssl/crypto/err/err.c +756 -0
- data/third_party/boringssl/crypto/evp/digestsign.c +159 -0
- data/third_party/boringssl/crypto/evp/evp.c +367 -0
- data/third_party/boringssl/crypto/evp/evp_asn1.c +337 -0
- data/third_party/boringssl/crypto/evp/evp_ctx.c +448 -0
- data/third_party/boringssl/crypto/evp/internal.h +237 -0
- data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +268 -0
- data/third_party/boringssl/crypto/evp/p_ec.c +236 -0
- data/third_party/boringssl/crypto/evp/p_ec_asn1.c +257 -0
- data/third_party/boringssl/crypto/evp/p_rsa.c +673 -0
- data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +200 -0
- data/third_party/boringssl/crypto/evp/pbkdf.c +151 -0
- data/third_party/boringssl/crypto/evp/print.c +520 -0
- data/third_party/boringssl/crypto/evp/sign.c +151 -0
- data/third_party/boringssl/crypto/ex_data.c +292 -0
- data/third_party/boringssl/crypto/hkdf/hkdf.c +110 -0
- data/third_party/boringssl/crypto/hmac/hmac.c +213 -0
- data/third_party/boringssl/crypto/internal.h +527 -0
- data/third_party/boringssl/crypto/lhash/lhash.c +342 -0
- data/third_party/boringssl/crypto/md4/md4.c +234 -0
- data/third_party/boringssl/crypto/md5/md5.c +275 -0
- data/third_party/boringssl/crypto/mem.c +200 -0
- data/third_party/boringssl/crypto/modes/cbc.c +216 -0
- data/third_party/boringssl/crypto/modes/cfb.c +230 -0
- data/third_party/boringssl/crypto/modes/ctr.c +219 -0
- data/third_party/boringssl/crypto/modes/gcm.c +1288 -0
- data/third_party/boringssl/crypto/modes/internal.h +358 -0
- data/third_party/boringssl/crypto/modes/ofb.c +95 -0
- 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 +640 -0
- data/third_party/boringssl/crypto/obj/obj_dat.h +5254 -0
- data/third_party/boringssl/crypto/obj/obj_xref.c +124 -0
- data/third_party/boringssl/crypto/obj/obj_xref.h +96 -0
- data/third_party/boringssl/crypto/pem/pem_all.c +262 -0
- data/third_party/boringssl/crypto/pem/pem_info.c +381 -0
- data/third_party/boringssl/crypto/pem/pem_lib.c +778 -0
- data/third_party/boringssl/crypto/pem/pem_oth.c +88 -0
- data/third_party/boringssl/crypto/pem/pem_pk8.c +257 -0
- data/third_party/boringssl/crypto/pem/pem_pkey.c +227 -0
- data/third_party/boringssl/crypto/pem/pem_x509.c +65 -0
- data/third_party/boringssl/crypto/pem/pem_xaux.c +67 -0
- data/third_party/boringssl/crypto/pkcs8/internal.h +83 -0
- data/third_party/boringssl/crypto/pkcs8/p5_pbe.c +151 -0
- data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +441 -0
- data/third_party/boringssl/crypto/pkcs8/p8_pkey.c +85 -0
- data/third_party/boringssl/crypto/pkcs8/pkcs8.c +1219 -0
- data/third_party/boringssl/crypto/poly1305/internal.h +40 -0
- data/third_party/boringssl/crypto/poly1305/poly1305.c +324 -0
- data/third_party/boringssl/crypto/poly1305/poly1305_arm.c +304 -0
- data/third_party/boringssl/crypto/poly1305/poly1305_vec.c +890 -0
- data/third_party/boringssl/crypto/rand/deterministic.c +47 -0
- data/third_party/boringssl/crypto/rand/internal.h +32 -0
- data/third_party/boringssl/crypto/rand/rand.c +244 -0
- data/third_party/boringssl/crypto/rand/urandom.c +221 -0
- data/third_party/boringssl/crypto/rand/windows.c +53 -0
- data/third_party/boringssl/crypto/rc4/rc4.c +98 -0
- data/third_party/boringssl/crypto/refcount_c11.c +67 -0
- data/third_party/boringssl/crypto/refcount_lock.c +53 -0
- data/third_party/boringssl/crypto/rsa/blinding.c +264 -0
- data/third_party/boringssl/crypto/rsa/internal.h +148 -0
- data/third_party/boringssl/crypto/rsa/padding.c +708 -0
- data/third_party/boringssl/crypto/rsa/rsa.c +830 -0
- data/third_party/boringssl/crypto/rsa/rsa_asn1.c +446 -0
- data/third_party/boringssl/crypto/rsa/rsa_impl.c +1139 -0
- data/third_party/boringssl/crypto/sha/sha1.c +337 -0
- data/third_party/boringssl/crypto/sha/sha256.c +327 -0
- data/third_party/boringssl/crypto/sha/sha512.c +607 -0
- data/third_party/boringssl/crypto/stack/stack.c +377 -0
- data/third_party/boringssl/crypto/thread.c +110 -0
- data/third_party/boringssl/crypto/thread_none.c +59 -0
- data/third_party/boringssl/crypto/thread_pthread.c +176 -0
- data/third_party/boringssl/crypto/thread_win.c +237 -0
- data/third_party/boringssl/crypto/time_support.c +206 -0
- data/third_party/boringssl/crypto/x509/a_digest.c +96 -0
- data/third_party/boringssl/crypto/x509/a_sign.c +135 -0
- data/third_party/boringssl/crypto/x509/a_strex.c +633 -0
- data/third_party/boringssl/crypto/x509/a_verify.c +127 -0
- data/third_party/boringssl/crypto/x509/algorithm.c +137 -0
- data/third_party/boringssl/crypto/x509/asn1_gen.c +818 -0
- data/third_party/boringssl/crypto/x509/by_dir.c +453 -0
- data/third_party/boringssl/crypto/x509/by_file.c +275 -0
- data/third_party/boringssl/crypto/x509/charmap.h +15 -0
- data/third_party/boringssl/crypto/x509/i2d_pr.c +83 -0
- data/third_party/boringssl/crypto/x509/internal.h +66 -0
- data/third_party/boringssl/crypto/x509/pkcs7.c +353 -0
- data/third_party/boringssl/crypto/x509/rsa_pss.c +385 -0
- data/third_party/boringssl/crypto/x509/t_crl.c +128 -0
- data/third_party/boringssl/crypto/x509/t_req.c +246 -0
- data/third_party/boringssl/crypto/x509/t_x509.c +506 -0
- data/third_party/boringssl/crypto/x509/t_x509a.c +111 -0
- data/third_party/boringssl/crypto/x509/vpm_int.h +70 -0
- data/third_party/boringssl/crypto/x509/x509.c +157 -0
- data/third_party/boringssl/crypto/x509/x509_att.c +381 -0
- data/third_party/boringssl/crypto/x509/x509_cmp.c +474 -0
- data/third_party/boringssl/crypto/x509/x509_d2.c +106 -0
- data/third_party/boringssl/crypto/x509/x509_def.c +98 -0
- data/third_party/boringssl/crypto/x509/x509_ext.c +206 -0
- data/third_party/boringssl/crypto/x509/x509_lu.c +690 -0
- data/third_party/boringssl/crypto/x509/x509_obj.c +197 -0
- data/third_party/boringssl/crypto/x509/x509_r2x.c +117 -0
- data/third_party/boringssl/crypto/x509/x509_req.c +322 -0
- data/third_party/boringssl/crypto/x509/x509_set.c +154 -0
- data/third_party/boringssl/crypto/x509/x509_trs.c +326 -0
- data/third_party/boringssl/crypto/x509/x509_txt.c +211 -0
- data/third_party/boringssl/crypto/x509/x509_v3.c +278 -0
- data/third_party/boringssl/crypto/x509/x509_vfy.c +2436 -0
- data/third_party/boringssl/crypto/x509/x509_vpm.c +647 -0
- data/third_party/boringssl/crypto/x509/x509cset.c +170 -0
- data/third_party/boringssl/crypto/x509/x509name.c +386 -0
- data/third_party/boringssl/crypto/x509/x509rset.c +81 -0
- data/third_party/boringssl/crypto/x509/x509spki.c +137 -0
- data/third_party/boringssl/crypto/x509/x509type.c +126 -0
- data/third_party/boringssl/crypto/x509/x_algor.c +151 -0
- data/third_party/boringssl/crypto/x509/x_all.c +501 -0
- data/third_party/boringssl/crypto/x509/x_attrib.c +111 -0
- data/third_party/boringssl/crypto/x509/x_crl.c +539 -0
- data/third_party/boringssl/crypto/x509/x_exten.c +75 -0
- data/third_party/boringssl/crypto/x509/x_info.c +98 -0
- data/third_party/boringssl/crypto/x509/x_name.c +534 -0
- data/third_party/boringssl/crypto/x509/x_pkey.c +103 -0
- data/third_party/boringssl/crypto/x509/x_pubkey.c +368 -0
- data/third_party/boringssl/crypto/x509/x_req.c +109 -0
- data/third_party/boringssl/crypto/x509/x_sig.c +69 -0
- data/third_party/boringssl/crypto/x509/x_spki.c +80 -0
- data/third_party/boringssl/crypto/x509/x_val.c +69 -0
- data/third_party/boringssl/crypto/x509/x_x509.c +289 -0
- data/third_party/boringssl/crypto/x509/x_x509a.c +205 -0
- data/third_party/boringssl/crypto/x509v3/ext_dat.h +135 -0
- data/third_party/boringssl/crypto/x509v3/pcy_cache.c +284 -0
- data/third_party/boringssl/crypto/x509v3/pcy_data.c +130 -0
- data/third_party/boringssl/crypto/x509v3/pcy_int.h +217 -0
- data/third_party/boringssl/crypto/x509v3/pcy_lib.c +164 -0
- data/third_party/boringssl/crypto/x509v3/pcy_map.c +130 -0
- data/third_party/boringssl/crypto/x509v3/pcy_node.c +188 -0
- data/third_party/boringssl/crypto/x509v3/pcy_tree.c +829 -0
- data/third_party/boringssl/crypto/x509v3/v3_akey.c +204 -0
- data/third_party/boringssl/crypto/x509v3/v3_akeya.c +72 -0
- data/third_party/boringssl/crypto/x509v3/v3_alt.c +614 -0
- data/third_party/boringssl/crypto/x509v3/v3_bcons.c +133 -0
- data/third_party/boringssl/crypto/x509v3/v3_bitst.c +141 -0
- data/third_party/boringssl/crypto/x509v3/v3_conf.c +462 -0
- data/third_party/boringssl/crypto/x509v3/v3_cpols.c +496 -0
- data/third_party/boringssl/crypto/x509v3/v3_crld.c +561 -0
- data/third_party/boringssl/crypto/x509v3/v3_enum.c +100 -0
- data/third_party/boringssl/crypto/x509v3/v3_extku.c +148 -0
- data/third_party/boringssl/crypto/x509v3/v3_genn.c +250 -0
- data/third_party/boringssl/crypto/x509v3/v3_ia5.c +119 -0
- data/third_party/boringssl/crypto/x509v3/v3_info.c +212 -0
- data/third_party/boringssl/crypto/x509v3/v3_int.c +91 -0
- data/third_party/boringssl/crypto/x509v3/v3_lib.c +362 -0
- data/third_party/boringssl/crypto/x509v3/v3_ncons.c +482 -0
- data/third_party/boringssl/crypto/x509v3/v3_pci.c +317 -0
- data/third_party/boringssl/crypto/x509v3/v3_pcia.c +57 -0
- data/third_party/boringssl/crypto/x509v3/v3_pcons.c +139 -0
- data/third_party/boringssl/crypto/x509v3/v3_pku.c +110 -0
- data/third_party/boringssl/crypto/x509v3/v3_pmaps.c +154 -0
- data/third_party/boringssl/crypto/x509v3/v3_prn.c +229 -0
- data/third_party/boringssl/crypto/x509v3/v3_purp.c +874 -0
- data/third_party/boringssl/crypto/x509v3/v3_skey.c +152 -0
- data/third_party/boringssl/crypto/x509v3/v3_sxnet.c +274 -0
- data/third_party/boringssl/crypto/x509v3/v3_utl.c +1327 -0
- data/third_party/boringssl/include/openssl/aead.h +345 -0
- data/third_party/boringssl/include/openssl/aes.h +158 -0
- data/third_party/boringssl/include/openssl/arm_arch.h +121 -0
- data/third_party/boringssl/include/openssl/asn1.h +1038 -0
- data/third_party/boringssl/include/openssl/asn1_mac.h +18 -0
- data/third_party/boringssl/include/openssl/asn1t.h +896 -0
- data/third_party/boringssl/include/openssl/base.h +412 -0
- data/third_party/boringssl/include/openssl/base64.h +187 -0
- data/third_party/boringssl/include/openssl/bio.h +926 -0
- data/third_party/boringssl/include/openssl/blowfish.h +93 -0
- data/third_party/boringssl/include/openssl/bn.h +955 -0
- data/third_party/boringssl/include/openssl/buf.h +133 -0
- data/third_party/boringssl/include/openssl/buffer.h +18 -0
- data/third_party/boringssl/include/openssl/bytestring.h +437 -0
- data/third_party/boringssl/include/openssl/cast.h +96 -0
- data/third_party/boringssl/include/openssl/chacha.h +37 -0
- data/third_party/boringssl/include/openssl/cipher.h +588 -0
- data/third_party/boringssl/include/openssl/cmac.h +87 -0
- data/third_party/boringssl/include/openssl/conf.h +181 -0
- data/third_party/boringssl/include/openssl/cpu.h +181 -0
- data/third_party/boringssl/include/openssl/crypto.h +94 -0
- data/third_party/boringssl/include/openssl/curve25519.h +183 -0
- data/third_party/boringssl/include/openssl/des.h +177 -0
- data/third_party/boringssl/include/openssl/dh.h +297 -0
- data/third_party/boringssl/include/openssl/digest.h +285 -0
- data/third_party/boringssl/include/openssl/dsa.h +436 -0
- data/third_party/boringssl/include/openssl/dtls1.h +16 -0
- data/third_party/boringssl/include/openssl/ec.h +406 -0
- data/third_party/boringssl/include/openssl/ec_key.h +337 -0
- data/third_party/boringssl/include/openssl/ecdh.h +102 -0
- data/third_party/boringssl/include/openssl/ecdsa.h +217 -0
- data/third_party/boringssl/include/openssl/engine.h +109 -0
- data/third_party/boringssl/include/openssl/err.h +488 -0
- data/third_party/boringssl/include/openssl/evp.h +797 -0
- data/third_party/boringssl/include/openssl/ex_data.h +213 -0
- data/third_party/boringssl/include/openssl/hkdf.h +64 -0
- data/third_party/boringssl/include/openssl/hmac.h +174 -0
- data/third_party/boringssl/include/openssl/lhash.h +192 -0
- data/third_party/boringssl/include/openssl/lhash_macros.h +132 -0
- data/third_party/boringssl/include/openssl/md4.h +106 -0
- data/third_party/boringssl/include/openssl/md5.h +107 -0
- data/third_party/boringssl/include/openssl/mem.h +150 -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 +226 -0
- data/third_party/boringssl/include/openssl/obj_mac.h +18 -0
- data/third_party/boringssl/include/openssl/objects.h +18 -0
- data/third_party/boringssl/include/openssl/opensslconf.h +60 -0
- data/third_party/boringssl/include/openssl/opensslv.h +18 -0
- data/third_party/boringssl/include/openssl/ossl_typ.h +18 -0
- data/third_party/boringssl/include/openssl/pem.h +517 -0
- data/third_party/boringssl/include/openssl/pkcs12.h +18 -0
- data/third_party/boringssl/include/openssl/pkcs7.h +16 -0
- data/third_party/boringssl/include/openssl/pkcs8.h +236 -0
- data/third_party/boringssl/include/openssl/poly1305.h +51 -0
- data/third_party/boringssl/include/openssl/rand.h +122 -0
- data/third_party/boringssl/include/openssl/rc4.h +96 -0
- data/third_party/boringssl/include/openssl/ripemd.h +107 -0
- data/third_party/boringssl/include/openssl/rsa.h +699 -0
- data/third_party/boringssl/include/openssl/safestack.h +16 -0
- data/third_party/boringssl/include/openssl/sha.h +260 -0
- data/third_party/boringssl/include/openssl/srtp.h +18 -0
- data/third_party/boringssl/include/openssl/ssl.h +4826 -0
- data/third_party/boringssl/include/openssl/ssl3.h +434 -0
- data/third_party/boringssl/include/openssl/stack.h +293 -0
- data/third_party/boringssl/include/openssl/stack_macros.h +3902 -0
- data/third_party/boringssl/include/openssl/thread.h +191 -0
- data/third_party/boringssl/include/openssl/time_support.h +91 -0
- data/third_party/boringssl/include/openssl/tls1.h +657 -0
- data/third_party/boringssl/include/openssl/type_check.h +91 -0
- data/third_party/boringssl/include/openssl/x509.h +1299 -0
- data/third_party/boringssl/include/openssl/x509_vfy.h +618 -0
- data/third_party/boringssl/include/openssl/x509v3.h +819 -0
- data/third_party/boringssl/ssl/custom_extensions.c +255 -0
- data/third_party/boringssl/ssl/d1_both.c +845 -0
- data/third_party/boringssl/ssl/d1_lib.c +270 -0
- data/third_party/boringssl/ssl/d1_pkt.c +419 -0
- data/third_party/boringssl/ssl/d1_srtp.c +236 -0
- data/third_party/boringssl/ssl/dtls_method.c +203 -0
- data/third_party/boringssl/ssl/dtls_record.c +309 -0
- data/third_party/boringssl/ssl/handshake_client.c +2002 -0
- data/third_party/boringssl/ssl/handshake_server.c +1932 -0
- data/third_party/boringssl/ssl/internal.h +1551 -0
- data/third_party/boringssl/ssl/s3_both.c +745 -0
- data/third_party/boringssl/ssl/s3_enc.c +412 -0
- data/third_party/boringssl/ssl/s3_lib.c +336 -0
- data/third_party/boringssl/ssl/s3_pkt.c +497 -0
- data/third_party/boringssl/ssl/ssl_aead_ctx.c +329 -0
- data/third_party/boringssl/ssl/ssl_asn1.c +748 -0
- data/third_party/boringssl/ssl/ssl_buffer.c +311 -0
- data/third_party/boringssl/ssl/ssl_cert.c +814 -0
- data/third_party/boringssl/ssl/ssl_cipher.c +2062 -0
- data/third_party/boringssl/ssl/ssl_ecdh.c +610 -0
- data/third_party/boringssl/ssl/ssl_file.c +586 -0
- data/third_party/boringssl/ssl/ssl_lib.c +3063 -0
- data/third_party/boringssl/ssl/ssl_rsa.c +793 -0
- data/third_party/boringssl/ssl/ssl_session.c +985 -0
- data/third_party/boringssl/ssl/ssl_stat.c +509 -0
- data/third_party/boringssl/ssl/t1_enc.c +547 -0
- data/third_party/boringssl/ssl/t1_lib.c +3279 -0
- 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/tls_method.c +245 -0
- data/third_party/boringssl/ssl/tls_record.c +461 -0
- data/third_party/cares/ares_build.h +264 -0
- data/third_party/cares/cares/ares.h +636 -0
- data/third_party/cares/cares/ares__close_sockets.c +61 -0
- data/third_party/cares/cares/ares__get_hostent.c +261 -0
- data/third_party/cares/cares/ares__read_line.c +73 -0
- data/third_party/cares/cares/ares__timeval.c +111 -0
- data/third_party/cares/cares/ares_cancel.c +63 -0
- data/third_party/cares/cares/ares_create_query.c +202 -0
- data/third_party/cares/cares/ares_data.c +221 -0
- data/third_party/cares/cares/ares_data.h +72 -0
- data/third_party/cares/cares/ares_destroy.c +108 -0
- data/third_party/cares/cares/ares_dns.h +103 -0
- data/third_party/cares/cares/ares_expand_name.c +205 -0
- data/third_party/cares/cares/ares_expand_string.c +70 -0
- data/third_party/cares/cares/ares_fds.c +59 -0
- data/third_party/cares/cares/ares_free_hostent.c +41 -0
- data/third_party/cares/cares/ares_free_string.c +25 -0
- data/third_party/cares/cares/ares_getenv.c +30 -0
- data/third_party/cares/cares/ares_getenv.h +26 -0
- data/third_party/cares/cares/ares_gethostbyaddr.c +294 -0
- data/third_party/cares/cares/ares_gethostbyname.c +518 -0
- data/third_party/cares/cares/ares_getnameinfo.c +422 -0
- data/third_party/cares/cares/ares_getopt.c +122 -0
- data/third_party/cares/cares/ares_getopt.h +53 -0
- data/third_party/cares/cares/ares_getsock.c +66 -0
- data/third_party/cares/cares/ares_inet_net_pton.h +25 -0
- data/third_party/cares/cares/ares_init.c +2146 -0
- data/third_party/cares/cares/ares_iphlpapi.h +221 -0
- data/third_party/cares/cares/ares_ipv6.h +78 -0
- data/third_party/cares/cares/ares_library_init.c +167 -0
- data/third_party/cares/cares/ares_library_init.h +42 -0
- data/third_party/cares/cares/ares_llist.c +63 -0
- data/third_party/cares/cares/ares_llist.h +39 -0
- data/third_party/cares/cares/ares_mkquery.c +24 -0
- data/third_party/cares/cares/ares_nowarn.c +260 -0
- data/third_party/cares/cares/ares_nowarn.h +61 -0
- data/third_party/cares/cares/ares_options.c +402 -0
- data/third_party/cares/cares/ares_parse_a_reply.c +264 -0
- data/third_party/cares/cares/ares_parse_aaaa_reply.c +264 -0
- data/third_party/cares/cares/ares_parse_mx_reply.c +170 -0
- data/third_party/cares/cares/ares_parse_naptr_reply.c +188 -0
- data/third_party/cares/cares/ares_parse_ns_reply.c +183 -0
- data/third_party/cares/cares/ares_parse_ptr_reply.c +219 -0
- data/third_party/cares/cares/ares_parse_soa_reply.c +133 -0
- data/third_party/cares/cares/ares_parse_srv_reply.c +179 -0
- data/third_party/cares/cares/ares_parse_txt_reply.c +220 -0
- data/third_party/cares/cares/ares_platform.c +11035 -0
- data/third_party/cares/cares/ares_platform.h +43 -0
- data/third_party/cares/cares/ares_private.h +363 -0
- data/third_party/cares/cares/ares_process.c +1359 -0
- data/third_party/cares/cares/ares_query.c +186 -0
- data/third_party/cares/cares/ares_rules.h +125 -0
- data/third_party/cares/cares/ares_search.c +316 -0
- data/third_party/cares/cares/ares_send.c +131 -0
- data/third_party/cares/cares/ares_setup.h +217 -0
- data/third_party/cares/cares/ares_strcasecmp.c +66 -0
- data/third_party/cares/cares/ares_strcasecmp.h +30 -0
- data/third_party/cares/cares/ares_strdup.c +49 -0
- data/third_party/cares/cares/ares_strdup.h +24 -0
- data/third_party/cares/cares/ares_strerror.c +56 -0
- data/third_party/cares/cares/ares_timeout.c +88 -0
- data/third_party/cares/cares/ares_version.c +11 -0
- data/third_party/cares/cares/ares_version.h +24 -0
- data/third_party/cares/cares/ares_writev.c +79 -0
- data/third_party/cares/cares/bitncmp.c +59 -0
- data/third_party/cares/cares/bitncmp.h +26 -0
- data/third_party/cares/cares/config-win32.h +377 -0
- data/third_party/cares/cares/inet_net_pton.c +450 -0
- data/third_party/cares/cares/inet_ntop.c +208 -0
- data/third_party/cares/cares/setup_once.h +554 -0
- data/third_party/cares/cares/windows_port.c +22 -0
- data/third_party/cares/config_darwin/ares_config.h +523 -0
- data/third_party/cares/config_linux/ares_config.h +524 -0
- data/third_party/nanopb/pb.h +579 -0
- data/third_party/nanopb/pb_common.c +97 -0
- data/third_party/nanopb/pb_common.h +42 -0
- data/third_party/nanopb/pb_decode.c +1347 -0
- data/third_party/nanopb/pb_decode.h +149 -0
- data/third_party/nanopb/pb_encode.c +696 -0
- data/third_party/nanopb/pb_encode.h +154 -0
- data/third_party/zlib/adler32.c +179 -0
- data/third_party/zlib/compress.c +80 -0
- data/third_party/zlib/crc32.c +425 -0
- data/third_party/zlib/crc32.h +441 -0
- data/third_party/zlib/deflate.c +1967 -0
- data/third_party/zlib/deflate.h +346 -0
- data/third_party/zlib/gzclose.c +25 -0
- data/third_party/zlib/gzguts.h +209 -0
- data/third_party/zlib/gzlib.c +634 -0
- data/third_party/zlib/gzread.c +594 -0
- data/third_party/zlib/gzwrite.c +577 -0
- data/third_party/zlib/infback.c +640 -0
- data/third_party/zlib/inffast.c +340 -0
- data/third_party/zlib/inffast.h +11 -0
- data/third_party/zlib/inffixed.h +94 -0
- data/third_party/zlib/inflate.c +1512 -0
- data/third_party/zlib/inflate.h +122 -0
- data/third_party/zlib/inftrees.c +306 -0
- data/third_party/zlib/inftrees.h +62 -0
- data/third_party/zlib/trees.c +1226 -0
- data/third_party/zlib/trees.h +128 -0
- data/third_party/zlib/uncompr.c +59 -0
- data/third_party/zlib/zconf.h +511 -0
- data/third_party/zlib/zlib.h +1768 -0
- data/third_party/zlib/zutil.c +324 -0
- data/third_party/zlib/zutil.h +253 -0
- metadata +1397 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/*
|
|
2
|
+
*
|
|
3
|
+
* Copyright 2015, Google Inc.
|
|
4
|
+
* All rights reserved.
|
|
5
|
+
*
|
|
6
|
+
* Redistribution and use in source and binary forms, with or without
|
|
7
|
+
* modification, are permitted provided that the following conditions are
|
|
8
|
+
* met:
|
|
9
|
+
*
|
|
10
|
+
* * Redistributions of source code must retain the above copyright
|
|
11
|
+
* notice, this list of conditions and the following disclaimer.
|
|
12
|
+
* * Redistributions in binary form must reproduce the above
|
|
13
|
+
* copyright notice, this list of conditions and the following disclaimer
|
|
14
|
+
* in the documentation and/or other materials provided with the
|
|
15
|
+
* distribution.
|
|
16
|
+
* * Neither the name of Google Inc. nor the names of its
|
|
17
|
+
* contributors may be used to endorse or promote products derived from
|
|
18
|
+
* this software without specific prior written permission.
|
|
19
|
+
*
|
|
20
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
21
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
22
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
23
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
24
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
25
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
26
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
27
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
28
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
29
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
30
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
31
|
+
*
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
#ifndef GRPC_CORE_LIB_SECURITY_CREDENTIALS_JWT_JSON_TOKEN_H
|
|
35
|
+
#define GRPC_CORE_LIB_SECURITY_CREDENTIALS_JWT_JSON_TOKEN_H
|
|
36
|
+
|
|
37
|
+
#include <grpc/slice.h>
|
|
38
|
+
#include <openssl/rsa.h>
|
|
39
|
+
|
|
40
|
+
#include "src/core/lib/json/json.h"
|
|
41
|
+
|
|
42
|
+
/* --- Constants. --- */
|
|
43
|
+
|
|
44
|
+
#define GRPC_JWT_OAUTH2_AUDIENCE "https://www.googleapis.com/oauth2/v3/token"
|
|
45
|
+
|
|
46
|
+
/* --- auth_json_key parsing. --- */
|
|
47
|
+
|
|
48
|
+
typedef struct {
|
|
49
|
+
const char *type;
|
|
50
|
+
char *private_key_id;
|
|
51
|
+
char *client_id;
|
|
52
|
+
char *client_email;
|
|
53
|
+
RSA *private_key;
|
|
54
|
+
} grpc_auth_json_key;
|
|
55
|
+
|
|
56
|
+
/* Returns 1 if the object is valid, 0 otherwise. */
|
|
57
|
+
int grpc_auth_json_key_is_valid(const grpc_auth_json_key *json_key);
|
|
58
|
+
|
|
59
|
+
/* Creates a json_key object from string. Returns an invalid object if a parsing
|
|
60
|
+
error has been encountered. */
|
|
61
|
+
grpc_auth_json_key grpc_auth_json_key_create_from_string(
|
|
62
|
+
const char *json_string);
|
|
63
|
+
|
|
64
|
+
/* Creates a json_key object from parsed json. Returns an invalid object if a
|
|
65
|
+
parsing error has been encountered. */
|
|
66
|
+
grpc_auth_json_key grpc_auth_json_key_create_from_json(const grpc_json *json);
|
|
67
|
+
|
|
68
|
+
/* Destructs the object. */
|
|
69
|
+
void grpc_auth_json_key_destruct(grpc_auth_json_key *json_key);
|
|
70
|
+
|
|
71
|
+
/* --- json token encoding and signing. --- */
|
|
72
|
+
|
|
73
|
+
/* Caller is responsible for calling gpr_free on the returned value. May return
|
|
74
|
+
NULL on invalid input. The scope parameter may be NULL. */
|
|
75
|
+
char *grpc_jwt_encode_and_sign(const grpc_auth_json_key *json_key,
|
|
76
|
+
const char *audience,
|
|
77
|
+
gpr_timespec token_lifetime, const char *scope);
|
|
78
|
+
|
|
79
|
+
/* Override encode_and_sign function for testing. */
|
|
80
|
+
typedef char *(*grpc_jwt_encode_and_sign_override)(
|
|
81
|
+
const grpc_auth_json_key *json_key, const char *audience,
|
|
82
|
+
gpr_timespec token_lifetime, const char *scope);
|
|
83
|
+
|
|
84
|
+
/* Set a custom encode_and_sign override for testing. */
|
|
85
|
+
void grpc_jwt_encode_and_sign_set_override(
|
|
86
|
+
grpc_jwt_encode_and_sign_override func);
|
|
87
|
+
|
|
88
|
+
#endif /* GRPC_CORE_LIB_SECURITY_CREDENTIALS_JWT_JSON_TOKEN_H */
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/*
|
|
2
|
+
*
|
|
3
|
+
* Copyright 2016, Google Inc.
|
|
4
|
+
* All rights reserved.
|
|
5
|
+
*
|
|
6
|
+
* Redistribution and use in source and binary forms, with or without
|
|
7
|
+
* modification, are permitted provided that the following conditions are
|
|
8
|
+
* met:
|
|
9
|
+
*
|
|
10
|
+
* * Redistributions of source code must retain the above copyright
|
|
11
|
+
* notice, this list of conditions and the following disclaimer.
|
|
12
|
+
* * Redistributions in binary form must reproduce the above
|
|
13
|
+
* copyright notice, this list of conditions and the following disclaimer
|
|
14
|
+
* in the documentation and/or other materials provided with the
|
|
15
|
+
* distribution.
|
|
16
|
+
* * Neither the name of Google Inc. nor the names of its
|
|
17
|
+
* contributors may be used to endorse or promote products derived from
|
|
18
|
+
* this software without specific prior written permission.
|
|
19
|
+
*
|
|
20
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
21
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
22
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
23
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
24
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
25
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
26
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
27
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
28
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
29
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
30
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
31
|
+
*
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
#include "src/core/lib/security/credentials/jwt/jwt_credentials.h"
|
|
35
|
+
|
|
36
|
+
#include <string.h>
|
|
37
|
+
|
|
38
|
+
#include "src/core/lib/surface/api_trace.h"
|
|
39
|
+
|
|
40
|
+
#include <grpc/support/alloc.h>
|
|
41
|
+
#include <grpc/support/log.h>
|
|
42
|
+
#include <grpc/support/string_util.h>
|
|
43
|
+
#include <grpc/support/sync.h>
|
|
44
|
+
|
|
45
|
+
static void jwt_reset_cache(grpc_exec_ctx *exec_ctx,
|
|
46
|
+
grpc_service_account_jwt_access_credentials *c) {
|
|
47
|
+
if (c->cached.jwt_md != NULL) {
|
|
48
|
+
grpc_credentials_md_store_unref(exec_ctx, c->cached.jwt_md);
|
|
49
|
+
c->cached.jwt_md = NULL;
|
|
50
|
+
}
|
|
51
|
+
if (c->cached.service_url != NULL) {
|
|
52
|
+
gpr_free(c->cached.service_url);
|
|
53
|
+
c->cached.service_url = NULL;
|
|
54
|
+
}
|
|
55
|
+
c->cached.jwt_expiration = gpr_inf_past(GPR_CLOCK_REALTIME);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
static void jwt_destruct(grpc_exec_ctx *exec_ctx,
|
|
59
|
+
grpc_call_credentials *creds) {
|
|
60
|
+
grpc_service_account_jwt_access_credentials *c =
|
|
61
|
+
(grpc_service_account_jwt_access_credentials *)creds;
|
|
62
|
+
grpc_auth_json_key_destruct(&c->key);
|
|
63
|
+
jwt_reset_cache(exec_ctx, c);
|
|
64
|
+
gpr_mu_destroy(&c->cache_mu);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
static void jwt_get_request_metadata(grpc_exec_ctx *exec_ctx,
|
|
68
|
+
grpc_call_credentials *creds,
|
|
69
|
+
grpc_polling_entity *pollent,
|
|
70
|
+
grpc_auth_metadata_context context,
|
|
71
|
+
grpc_credentials_metadata_cb cb,
|
|
72
|
+
void *user_data) {
|
|
73
|
+
grpc_service_account_jwt_access_credentials *c =
|
|
74
|
+
(grpc_service_account_jwt_access_credentials *)creds;
|
|
75
|
+
gpr_timespec refresh_threshold = gpr_time_from_seconds(
|
|
76
|
+
GRPC_SECURE_TOKEN_REFRESH_THRESHOLD_SECS, GPR_TIMESPAN);
|
|
77
|
+
|
|
78
|
+
/* See if we can return a cached jwt. */
|
|
79
|
+
grpc_credentials_md_store *jwt_md = NULL;
|
|
80
|
+
{
|
|
81
|
+
gpr_mu_lock(&c->cache_mu);
|
|
82
|
+
if (c->cached.service_url != NULL &&
|
|
83
|
+
strcmp(c->cached.service_url, context.service_url) == 0 &&
|
|
84
|
+
c->cached.jwt_md != NULL &&
|
|
85
|
+
(gpr_time_cmp(gpr_time_sub(c->cached.jwt_expiration,
|
|
86
|
+
gpr_now(GPR_CLOCK_REALTIME)),
|
|
87
|
+
refresh_threshold) > 0)) {
|
|
88
|
+
jwt_md = grpc_credentials_md_store_ref(c->cached.jwt_md);
|
|
89
|
+
}
|
|
90
|
+
gpr_mu_unlock(&c->cache_mu);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (jwt_md == NULL) {
|
|
94
|
+
char *jwt = NULL;
|
|
95
|
+
/* Generate a new jwt. */
|
|
96
|
+
gpr_mu_lock(&c->cache_mu);
|
|
97
|
+
jwt_reset_cache(exec_ctx, c);
|
|
98
|
+
jwt = grpc_jwt_encode_and_sign(&c->key, context.service_url,
|
|
99
|
+
c->jwt_lifetime, NULL);
|
|
100
|
+
if (jwt != NULL) {
|
|
101
|
+
char *md_value;
|
|
102
|
+
gpr_asprintf(&md_value, "Bearer %s", jwt);
|
|
103
|
+
gpr_free(jwt);
|
|
104
|
+
c->cached.jwt_expiration =
|
|
105
|
+
gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), c->jwt_lifetime);
|
|
106
|
+
c->cached.service_url = gpr_strdup(context.service_url);
|
|
107
|
+
c->cached.jwt_md = grpc_credentials_md_store_create(1);
|
|
108
|
+
grpc_credentials_md_store_add_cstrings(
|
|
109
|
+
c->cached.jwt_md, GRPC_AUTHORIZATION_METADATA_KEY, md_value);
|
|
110
|
+
gpr_free(md_value);
|
|
111
|
+
jwt_md = grpc_credentials_md_store_ref(c->cached.jwt_md);
|
|
112
|
+
}
|
|
113
|
+
gpr_mu_unlock(&c->cache_mu);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (jwt_md != NULL) {
|
|
117
|
+
cb(exec_ctx, user_data, jwt_md->entries, jwt_md->num_entries,
|
|
118
|
+
GRPC_CREDENTIALS_OK, NULL);
|
|
119
|
+
grpc_credentials_md_store_unref(exec_ctx, jwt_md);
|
|
120
|
+
} else {
|
|
121
|
+
cb(exec_ctx, user_data, NULL, 0, GRPC_CREDENTIALS_ERROR,
|
|
122
|
+
"Could not generate JWT.");
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
static grpc_call_credentials_vtable jwt_vtable = {jwt_destruct,
|
|
127
|
+
jwt_get_request_metadata};
|
|
128
|
+
|
|
129
|
+
grpc_call_credentials *
|
|
130
|
+
grpc_service_account_jwt_access_credentials_create_from_auth_json_key(
|
|
131
|
+
grpc_exec_ctx *exec_ctx, grpc_auth_json_key key,
|
|
132
|
+
gpr_timespec token_lifetime) {
|
|
133
|
+
grpc_service_account_jwt_access_credentials *c;
|
|
134
|
+
if (!grpc_auth_json_key_is_valid(&key)) {
|
|
135
|
+
gpr_log(GPR_ERROR, "Invalid input for jwt credentials creation");
|
|
136
|
+
return NULL;
|
|
137
|
+
}
|
|
138
|
+
c = gpr_zalloc(sizeof(grpc_service_account_jwt_access_credentials));
|
|
139
|
+
c->base.type = GRPC_CALL_CREDENTIALS_TYPE_JWT;
|
|
140
|
+
gpr_ref_init(&c->base.refcount, 1);
|
|
141
|
+
c->base.vtable = &jwt_vtable;
|
|
142
|
+
c->key = key;
|
|
143
|
+
c->jwt_lifetime = token_lifetime;
|
|
144
|
+
gpr_mu_init(&c->cache_mu);
|
|
145
|
+
jwt_reset_cache(exec_ctx, c);
|
|
146
|
+
return &c->base;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
static char *redact_private_key(const char *json_key) {
|
|
150
|
+
char *json_copy = gpr_strdup(json_key);
|
|
151
|
+
grpc_json *json = grpc_json_parse_string(json_copy);
|
|
152
|
+
if (!json) {
|
|
153
|
+
gpr_free(json_copy);
|
|
154
|
+
return gpr_strdup("<Json failed to parse.>");
|
|
155
|
+
}
|
|
156
|
+
const char *redacted = "<redacted>";
|
|
157
|
+
grpc_json *current = json->child;
|
|
158
|
+
while (current) {
|
|
159
|
+
if (current->type == GRPC_JSON_STRING &&
|
|
160
|
+
strcmp(current->key, "private_key") == 0) {
|
|
161
|
+
current->value = (char *)redacted;
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
current = current->next;
|
|
165
|
+
}
|
|
166
|
+
char *clean_json = grpc_json_dump_to_string(json, 2);
|
|
167
|
+
gpr_free(json_copy);
|
|
168
|
+
grpc_json_destroy(json);
|
|
169
|
+
return clean_json;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
grpc_call_credentials *grpc_service_account_jwt_access_credentials_create(
|
|
173
|
+
const char *json_key, gpr_timespec token_lifetime, void *reserved) {
|
|
174
|
+
if (grpc_api_trace) {
|
|
175
|
+
char *clean_json = redact_private_key(json_key);
|
|
176
|
+
gpr_log(GPR_INFO,
|
|
177
|
+
"grpc_service_account_jwt_access_credentials_create("
|
|
178
|
+
"json_key=%s, "
|
|
179
|
+
"token_lifetime="
|
|
180
|
+
"gpr_timespec { tv_sec: %" PRId64
|
|
181
|
+
", tv_nsec: %d, clock_type: %d }, "
|
|
182
|
+
"reserved=%p)",
|
|
183
|
+
clean_json, token_lifetime.tv_sec, token_lifetime.tv_nsec,
|
|
184
|
+
(int)token_lifetime.clock_type, reserved);
|
|
185
|
+
gpr_free(clean_json);
|
|
186
|
+
}
|
|
187
|
+
GPR_ASSERT(reserved == NULL);
|
|
188
|
+
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
|
189
|
+
grpc_call_credentials *creds =
|
|
190
|
+
grpc_service_account_jwt_access_credentials_create_from_auth_json_key(
|
|
191
|
+
&exec_ctx, grpc_auth_json_key_create_from_string(json_key),
|
|
192
|
+
token_lifetime);
|
|
193
|
+
grpc_exec_ctx_finish(&exec_ctx);
|
|
194
|
+
return creds;
|
|
195
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/*
|
|
2
|
+
*
|
|
3
|
+
* Copyright 2016, Google Inc.
|
|
4
|
+
* All rights reserved.
|
|
5
|
+
*
|
|
6
|
+
* Redistribution and use in source and binary forms, with or without
|
|
7
|
+
* modification, are permitted provided that the following conditions are
|
|
8
|
+
* met:
|
|
9
|
+
*
|
|
10
|
+
* * Redistributions of source code must retain the above copyright
|
|
11
|
+
* notice, this list of conditions and the following disclaimer.
|
|
12
|
+
* * Redistributions in binary form must reproduce the above
|
|
13
|
+
* copyright notice, this list of conditions and the following disclaimer
|
|
14
|
+
* in the documentation and/or other materials provided with the
|
|
15
|
+
* distribution.
|
|
16
|
+
* * Neither the name of Google Inc. nor the names of its
|
|
17
|
+
* contributors may be used to endorse or promote products derived from
|
|
18
|
+
* this software without specific prior written permission.
|
|
19
|
+
*
|
|
20
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
21
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
22
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
23
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
24
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
25
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
26
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
27
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
28
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
29
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
30
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
31
|
+
*
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
#ifndef GRPC_CORE_LIB_SECURITY_CREDENTIALS_JWT_JWT_CREDENTIALS_H
|
|
35
|
+
#define GRPC_CORE_LIB_SECURITY_CREDENTIALS_JWT_JWT_CREDENTIALS_H
|
|
36
|
+
|
|
37
|
+
#include "src/core/lib/security/credentials/credentials.h"
|
|
38
|
+
#include "src/core/lib/security/credentials/jwt/json_token.h"
|
|
39
|
+
|
|
40
|
+
typedef struct {
|
|
41
|
+
grpc_call_credentials base;
|
|
42
|
+
|
|
43
|
+
// Have a simple cache for now with just 1 entry. We could have a map based on
|
|
44
|
+
// the service_url for a more sophisticated one.
|
|
45
|
+
gpr_mu cache_mu;
|
|
46
|
+
struct {
|
|
47
|
+
grpc_credentials_md_store *jwt_md;
|
|
48
|
+
char *service_url;
|
|
49
|
+
gpr_timespec jwt_expiration;
|
|
50
|
+
} cached;
|
|
51
|
+
|
|
52
|
+
grpc_auth_json_key key;
|
|
53
|
+
gpr_timespec jwt_lifetime;
|
|
54
|
+
} grpc_service_account_jwt_access_credentials;
|
|
55
|
+
|
|
56
|
+
// Private constructor for jwt credentials from an already parsed json key.
|
|
57
|
+
// Takes ownership of the key.
|
|
58
|
+
grpc_call_credentials *
|
|
59
|
+
grpc_service_account_jwt_access_credentials_create_from_auth_json_key(
|
|
60
|
+
grpc_exec_ctx *exec_ctx, grpc_auth_json_key key,
|
|
61
|
+
gpr_timespec token_lifetime);
|
|
62
|
+
|
|
63
|
+
#endif /* GRPC_CORE_LIB_SECURITY_CREDENTIALS_JWT_JWT_CREDENTIALS_H */
|
|
@@ -0,0 +1,910 @@
|
|
|
1
|
+
/*
|
|
2
|
+
*
|
|
3
|
+
* Copyright 2015, Google Inc.
|
|
4
|
+
* All rights reserved.
|
|
5
|
+
*
|
|
6
|
+
* Redistribution and use in source and binary forms, with or without
|
|
7
|
+
* modification, are permitted provided that the following conditions are
|
|
8
|
+
* met:
|
|
9
|
+
*
|
|
10
|
+
* * Redistributions of source code must retain the above copyright
|
|
11
|
+
* notice, this list of conditions and the following disclaimer.
|
|
12
|
+
* * Redistributions in binary form must reproduce the above
|
|
13
|
+
* copyright notice, this list of conditions and the following disclaimer
|
|
14
|
+
* in the documentation and/or other materials provided with the
|
|
15
|
+
* distribution.
|
|
16
|
+
* * Neither the name of Google Inc. nor the names of its
|
|
17
|
+
* contributors may be used to endorse or promote products derived from
|
|
18
|
+
* this software without specific prior written permission.
|
|
19
|
+
*
|
|
20
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
21
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
22
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
23
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
24
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
25
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
26
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
27
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
28
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
29
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
30
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
31
|
+
*
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
#include "src/core/lib/security/credentials/jwt/jwt_verifier.h"
|
|
35
|
+
|
|
36
|
+
#include <limits.h>
|
|
37
|
+
#include <string.h>
|
|
38
|
+
|
|
39
|
+
#include <grpc/support/alloc.h>
|
|
40
|
+
#include <grpc/support/log.h>
|
|
41
|
+
#include <grpc/support/string_util.h>
|
|
42
|
+
#include <grpc/support/sync.h>
|
|
43
|
+
#include <grpc/support/useful.h>
|
|
44
|
+
#include <openssl/pem.h>
|
|
45
|
+
|
|
46
|
+
#include "src/core/lib/http/httpcli.h"
|
|
47
|
+
#include "src/core/lib/iomgr/polling_entity.h"
|
|
48
|
+
#include "src/core/lib/slice/b64.h"
|
|
49
|
+
#include "src/core/lib/slice/slice_internal.h"
|
|
50
|
+
#include "src/core/lib/support/string.h"
|
|
51
|
+
#include "src/core/tsi/ssl_types.h"
|
|
52
|
+
|
|
53
|
+
/* --- Utils. --- */
|
|
54
|
+
|
|
55
|
+
const char *grpc_jwt_verifier_status_to_string(
|
|
56
|
+
grpc_jwt_verifier_status status) {
|
|
57
|
+
switch (status) {
|
|
58
|
+
case GRPC_JWT_VERIFIER_OK:
|
|
59
|
+
return "OK";
|
|
60
|
+
case GRPC_JWT_VERIFIER_BAD_SIGNATURE:
|
|
61
|
+
return "BAD_SIGNATURE";
|
|
62
|
+
case GRPC_JWT_VERIFIER_BAD_FORMAT:
|
|
63
|
+
return "BAD_FORMAT";
|
|
64
|
+
case GRPC_JWT_VERIFIER_BAD_AUDIENCE:
|
|
65
|
+
return "BAD_AUDIENCE";
|
|
66
|
+
case GRPC_JWT_VERIFIER_KEY_RETRIEVAL_ERROR:
|
|
67
|
+
return "KEY_RETRIEVAL_ERROR";
|
|
68
|
+
case GRPC_JWT_VERIFIER_TIME_CONSTRAINT_FAILURE:
|
|
69
|
+
return "TIME_CONSTRAINT_FAILURE";
|
|
70
|
+
case GRPC_JWT_VERIFIER_GENERIC_ERROR:
|
|
71
|
+
return "GENERIC_ERROR";
|
|
72
|
+
default:
|
|
73
|
+
return "UNKNOWN";
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
static const EVP_MD *evp_md_from_alg(const char *alg) {
|
|
78
|
+
if (strcmp(alg, "RS256") == 0) {
|
|
79
|
+
return EVP_sha256();
|
|
80
|
+
} else if (strcmp(alg, "RS384") == 0) {
|
|
81
|
+
return EVP_sha384();
|
|
82
|
+
} else if (strcmp(alg, "RS512") == 0) {
|
|
83
|
+
return EVP_sha512();
|
|
84
|
+
} else {
|
|
85
|
+
return NULL;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
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) {
|
|
92
|
+
grpc_json *json;
|
|
93
|
+
|
|
94
|
+
*buffer = grpc_base64_decode_with_len(exec_ctx, str, len, 1);
|
|
95
|
+
if (GRPC_SLICE_IS_EMPTY(*buffer)) {
|
|
96
|
+
gpr_log(GPR_ERROR, "Invalid base64.");
|
|
97
|
+
return NULL;
|
|
98
|
+
}
|
|
99
|
+
json = grpc_json_parse_string_with_len((char *)GRPC_SLICE_START_PTR(*buffer),
|
|
100
|
+
GRPC_SLICE_LENGTH(*buffer));
|
|
101
|
+
if (json == NULL) {
|
|
102
|
+
grpc_slice_unref_internal(exec_ctx, *buffer);
|
|
103
|
+
gpr_log(GPR_ERROR, "JSON parsing error.");
|
|
104
|
+
}
|
|
105
|
+
return json;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
static const char *validate_string_field(const grpc_json *json,
|
|
109
|
+
const char *key) {
|
|
110
|
+
if (json->type != GRPC_JSON_STRING) {
|
|
111
|
+
gpr_log(GPR_ERROR, "Invalid %s field [%s]", key, json->value);
|
|
112
|
+
return NULL;
|
|
113
|
+
}
|
|
114
|
+
return json->value;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
static gpr_timespec validate_time_field(const grpc_json *json,
|
|
118
|
+
const char *key) {
|
|
119
|
+
gpr_timespec result = gpr_time_0(GPR_CLOCK_REALTIME);
|
|
120
|
+
if (json->type != GRPC_JSON_NUMBER) {
|
|
121
|
+
gpr_log(GPR_ERROR, "Invalid %s field [%s]", key, json->value);
|
|
122
|
+
return result;
|
|
123
|
+
}
|
|
124
|
+
result.tv_sec = strtol(json->value, NULL, 10);
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* --- JOSE header. see http://tools.ietf.org/html/rfc7515#section-4 --- */
|
|
129
|
+
|
|
130
|
+
typedef struct {
|
|
131
|
+
const char *alg;
|
|
132
|
+
const char *kid;
|
|
133
|
+
const char *typ;
|
|
134
|
+
/* TODO(jboeuf): Add others as needed (jku, jwk, x5u, x5c and so on...). */
|
|
135
|
+
grpc_slice buffer;
|
|
136
|
+
} jose_header;
|
|
137
|
+
|
|
138
|
+
static void jose_header_destroy(grpc_exec_ctx *exec_ctx, jose_header *h) {
|
|
139
|
+
grpc_slice_unref_internal(exec_ctx, h->buffer);
|
|
140
|
+
gpr_free(h);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/* Takes ownership of json and buffer. */
|
|
144
|
+
static jose_header *jose_header_from_json(grpc_exec_ctx *exec_ctx,
|
|
145
|
+
grpc_json *json, grpc_slice buffer) {
|
|
146
|
+
grpc_json *cur;
|
|
147
|
+
jose_header *h = gpr_zalloc(sizeof(jose_header));
|
|
148
|
+
h->buffer = buffer;
|
|
149
|
+
for (cur = json->child; cur != NULL; cur = cur->next) {
|
|
150
|
+
if (strcmp(cur->key, "alg") == 0) {
|
|
151
|
+
/* We only support RSA-1.5 signatures for now.
|
|
152
|
+
Beware of this if we add HMAC support:
|
|
153
|
+
https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/
|
|
154
|
+
*/
|
|
155
|
+
if (cur->type != GRPC_JSON_STRING || strncmp(cur->value, "RS", 2) ||
|
|
156
|
+
evp_md_from_alg(cur->value) == NULL) {
|
|
157
|
+
gpr_log(GPR_ERROR, "Invalid alg field [%s]", cur->value);
|
|
158
|
+
goto error;
|
|
159
|
+
}
|
|
160
|
+
h->alg = cur->value;
|
|
161
|
+
} else if (strcmp(cur->key, "typ") == 0) {
|
|
162
|
+
h->typ = validate_string_field(cur, "typ");
|
|
163
|
+
if (h->typ == NULL) goto error;
|
|
164
|
+
} else if (strcmp(cur->key, "kid") == 0) {
|
|
165
|
+
h->kid = validate_string_field(cur, "kid");
|
|
166
|
+
if (h->kid == NULL) goto error;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (h->alg == NULL) {
|
|
170
|
+
gpr_log(GPR_ERROR, "Missing alg field.");
|
|
171
|
+
goto error;
|
|
172
|
+
}
|
|
173
|
+
grpc_json_destroy(json);
|
|
174
|
+
h->buffer = buffer;
|
|
175
|
+
return h;
|
|
176
|
+
|
|
177
|
+
error:
|
|
178
|
+
grpc_json_destroy(json);
|
|
179
|
+
jose_header_destroy(exec_ctx, h);
|
|
180
|
+
return NULL;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/* --- JWT claims. see http://tools.ietf.org/html/rfc7519#section-4.1 */
|
|
184
|
+
|
|
185
|
+
struct grpc_jwt_claims {
|
|
186
|
+
/* Well known properties already parsed. */
|
|
187
|
+
const char *sub;
|
|
188
|
+
const char *iss;
|
|
189
|
+
const char *aud;
|
|
190
|
+
const char *jti;
|
|
191
|
+
gpr_timespec iat;
|
|
192
|
+
gpr_timespec exp;
|
|
193
|
+
gpr_timespec nbf;
|
|
194
|
+
|
|
195
|
+
grpc_json *json;
|
|
196
|
+
grpc_slice buffer;
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
void grpc_jwt_claims_destroy(grpc_exec_ctx *exec_ctx, grpc_jwt_claims *claims) {
|
|
200
|
+
grpc_json_destroy(claims->json);
|
|
201
|
+
grpc_slice_unref_internal(exec_ctx, claims->buffer);
|
|
202
|
+
gpr_free(claims);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
const grpc_json *grpc_jwt_claims_json(const grpc_jwt_claims *claims) {
|
|
206
|
+
if (claims == NULL) return NULL;
|
|
207
|
+
return claims->json;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
const char *grpc_jwt_claims_subject(const grpc_jwt_claims *claims) {
|
|
211
|
+
if (claims == NULL) return NULL;
|
|
212
|
+
return claims->sub;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const char *grpc_jwt_claims_issuer(const grpc_jwt_claims *claims) {
|
|
216
|
+
if (claims == NULL) return NULL;
|
|
217
|
+
return claims->iss;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const char *grpc_jwt_claims_id(const grpc_jwt_claims *claims) {
|
|
221
|
+
if (claims == NULL) return NULL;
|
|
222
|
+
return claims->jti;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
const char *grpc_jwt_claims_audience(const grpc_jwt_claims *claims) {
|
|
226
|
+
if (claims == NULL) return NULL;
|
|
227
|
+
return claims->aud;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
gpr_timespec grpc_jwt_claims_issued_at(const grpc_jwt_claims *claims) {
|
|
231
|
+
if (claims == NULL) return gpr_inf_past(GPR_CLOCK_REALTIME);
|
|
232
|
+
return claims->iat;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
gpr_timespec grpc_jwt_claims_expires_at(const grpc_jwt_claims *claims) {
|
|
236
|
+
if (claims == NULL) return gpr_inf_future(GPR_CLOCK_REALTIME);
|
|
237
|
+
return claims->exp;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
gpr_timespec grpc_jwt_claims_not_before(const grpc_jwt_claims *claims) {
|
|
241
|
+
if (claims == NULL) return gpr_inf_past(GPR_CLOCK_REALTIME);
|
|
242
|
+
return claims->nbf;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/* Takes ownership of json and buffer even in case of failure. */
|
|
246
|
+
grpc_jwt_claims *grpc_jwt_claims_from_json(grpc_exec_ctx *exec_ctx,
|
|
247
|
+
grpc_json *json, grpc_slice buffer) {
|
|
248
|
+
grpc_json *cur;
|
|
249
|
+
grpc_jwt_claims *claims = gpr_malloc(sizeof(grpc_jwt_claims));
|
|
250
|
+
memset(claims, 0, sizeof(grpc_jwt_claims));
|
|
251
|
+
claims->json = json;
|
|
252
|
+
claims->buffer = buffer;
|
|
253
|
+
claims->iat = gpr_inf_past(GPR_CLOCK_REALTIME);
|
|
254
|
+
claims->nbf = gpr_inf_past(GPR_CLOCK_REALTIME);
|
|
255
|
+
claims->exp = gpr_inf_future(GPR_CLOCK_REALTIME);
|
|
256
|
+
|
|
257
|
+
/* Per the spec, all fields are optional. */
|
|
258
|
+
for (cur = json->child; cur != NULL; cur = cur->next) {
|
|
259
|
+
if (strcmp(cur->key, "sub") == 0) {
|
|
260
|
+
claims->sub = validate_string_field(cur, "sub");
|
|
261
|
+
if (claims->sub == NULL) goto error;
|
|
262
|
+
} else if (strcmp(cur->key, "iss") == 0) {
|
|
263
|
+
claims->iss = validate_string_field(cur, "iss");
|
|
264
|
+
if (claims->iss == NULL) goto error;
|
|
265
|
+
} else if (strcmp(cur->key, "aud") == 0) {
|
|
266
|
+
claims->aud = validate_string_field(cur, "aud");
|
|
267
|
+
if (claims->aud == NULL) goto error;
|
|
268
|
+
} else if (strcmp(cur->key, "jti") == 0) {
|
|
269
|
+
claims->jti = validate_string_field(cur, "jti");
|
|
270
|
+
if (claims->jti == NULL) goto error;
|
|
271
|
+
} else if (strcmp(cur->key, "iat") == 0) {
|
|
272
|
+
claims->iat = validate_time_field(cur, "iat");
|
|
273
|
+
if (gpr_time_cmp(claims->iat, gpr_time_0(GPR_CLOCK_REALTIME)) == 0)
|
|
274
|
+
goto error;
|
|
275
|
+
} else if (strcmp(cur->key, "exp") == 0) {
|
|
276
|
+
claims->exp = validate_time_field(cur, "exp");
|
|
277
|
+
if (gpr_time_cmp(claims->exp, gpr_time_0(GPR_CLOCK_REALTIME)) == 0)
|
|
278
|
+
goto error;
|
|
279
|
+
} else if (strcmp(cur->key, "nbf") == 0) {
|
|
280
|
+
claims->nbf = validate_time_field(cur, "nbf");
|
|
281
|
+
if (gpr_time_cmp(claims->nbf, gpr_time_0(GPR_CLOCK_REALTIME)) == 0)
|
|
282
|
+
goto error;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return claims;
|
|
286
|
+
|
|
287
|
+
error:
|
|
288
|
+
grpc_jwt_claims_destroy(exec_ctx, claims);
|
|
289
|
+
return NULL;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
grpc_jwt_verifier_status grpc_jwt_claims_check(const grpc_jwt_claims *claims,
|
|
293
|
+
const char *audience) {
|
|
294
|
+
gpr_timespec skewed_now;
|
|
295
|
+
int audience_ok;
|
|
296
|
+
|
|
297
|
+
GPR_ASSERT(claims != NULL);
|
|
298
|
+
|
|
299
|
+
skewed_now =
|
|
300
|
+
gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), grpc_jwt_verifier_clock_skew);
|
|
301
|
+
if (gpr_time_cmp(skewed_now, claims->nbf) < 0) {
|
|
302
|
+
gpr_log(GPR_ERROR, "JWT is not valid yet.");
|
|
303
|
+
return GRPC_JWT_VERIFIER_TIME_CONSTRAINT_FAILURE;
|
|
304
|
+
}
|
|
305
|
+
skewed_now =
|
|
306
|
+
gpr_time_sub(gpr_now(GPR_CLOCK_REALTIME), grpc_jwt_verifier_clock_skew);
|
|
307
|
+
if (gpr_time_cmp(skewed_now, claims->exp) > 0) {
|
|
308
|
+
gpr_log(GPR_ERROR, "JWT is expired.");
|
|
309
|
+
return GRPC_JWT_VERIFIER_TIME_CONSTRAINT_FAILURE;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/* This should be probably up to the upper layer to decide but let's harcode
|
|
313
|
+
the 99% use case here for email issuers, where the JWT must be self
|
|
314
|
+
issued. */
|
|
315
|
+
if (grpc_jwt_issuer_email_domain(claims->iss) != NULL &&
|
|
316
|
+
claims->sub != NULL && strcmp(claims->iss, claims->sub) != 0) {
|
|
317
|
+
gpr_log(GPR_ERROR,
|
|
318
|
+
"Email issuer (%s) cannot assert another subject (%s) than itself.",
|
|
319
|
+
claims->iss, claims->sub);
|
|
320
|
+
return GRPC_JWT_VERIFIER_BAD_SUBJECT;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
if (audience == NULL) {
|
|
324
|
+
audience_ok = claims->aud == NULL;
|
|
325
|
+
} else {
|
|
326
|
+
audience_ok = claims->aud != NULL && strcmp(audience, claims->aud) == 0;
|
|
327
|
+
}
|
|
328
|
+
if (!audience_ok) {
|
|
329
|
+
gpr_log(GPR_ERROR, "Audience mismatch: expected %s and found %s.",
|
|
330
|
+
audience == NULL ? "NULL" : audience,
|
|
331
|
+
claims->aud == NULL ? "NULL" : claims->aud);
|
|
332
|
+
return GRPC_JWT_VERIFIER_BAD_AUDIENCE;
|
|
333
|
+
}
|
|
334
|
+
return GRPC_JWT_VERIFIER_OK;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/* --- verifier_cb_ctx object. --- */
|
|
338
|
+
|
|
339
|
+
typedef enum {
|
|
340
|
+
HTTP_RESPONSE_OPENID = 0,
|
|
341
|
+
HTTP_RESPONSE_KEYS,
|
|
342
|
+
HTTP_RESPONSE_COUNT /* must be last */
|
|
343
|
+
} http_response_index;
|
|
344
|
+
|
|
345
|
+
typedef struct {
|
|
346
|
+
grpc_jwt_verifier *verifier;
|
|
347
|
+
grpc_polling_entity pollent;
|
|
348
|
+
jose_header *header;
|
|
349
|
+
grpc_jwt_claims *claims;
|
|
350
|
+
char *audience;
|
|
351
|
+
grpc_slice signature;
|
|
352
|
+
grpc_slice signed_data;
|
|
353
|
+
void *user_data;
|
|
354
|
+
grpc_jwt_verification_done_cb user_cb;
|
|
355
|
+
grpc_http_response responses[HTTP_RESPONSE_COUNT];
|
|
356
|
+
} verifier_cb_ctx;
|
|
357
|
+
|
|
358
|
+
/* Takes ownership of the header, claims and signature. */
|
|
359
|
+
static verifier_cb_ctx *verifier_cb_ctx_create(
|
|
360
|
+
grpc_jwt_verifier *verifier, grpc_pollset *pollset, jose_header *header,
|
|
361
|
+
grpc_jwt_claims *claims, const char *audience, grpc_slice signature,
|
|
362
|
+
const char *signed_jwt, size_t signed_jwt_len, void *user_data,
|
|
363
|
+
grpc_jwt_verification_done_cb cb) {
|
|
364
|
+
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
|
365
|
+
verifier_cb_ctx *ctx = gpr_zalloc(sizeof(verifier_cb_ctx));
|
|
366
|
+
ctx->verifier = verifier;
|
|
367
|
+
ctx->pollent = grpc_polling_entity_create_from_pollset(pollset);
|
|
368
|
+
ctx->header = header;
|
|
369
|
+
ctx->audience = gpr_strdup(audience);
|
|
370
|
+
ctx->claims = claims;
|
|
371
|
+
ctx->signature = signature;
|
|
372
|
+
ctx->signed_data = grpc_slice_from_copied_buffer(signed_jwt, signed_jwt_len);
|
|
373
|
+
ctx->user_data = user_data;
|
|
374
|
+
ctx->user_cb = cb;
|
|
375
|
+
grpc_exec_ctx_finish(&exec_ctx);
|
|
376
|
+
return ctx;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
void verifier_cb_ctx_destroy(grpc_exec_ctx *exec_ctx, verifier_cb_ctx *ctx) {
|
|
380
|
+
if (ctx->audience != NULL) gpr_free(ctx->audience);
|
|
381
|
+
if (ctx->claims != NULL) grpc_jwt_claims_destroy(exec_ctx, ctx->claims);
|
|
382
|
+
grpc_slice_unref_internal(exec_ctx, ctx->signature);
|
|
383
|
+
grpc_slice_unref_internal(exec_ctx, ctx->signed_data);
|
|
384
|
+
jose_header_destroy(exec_ctx, ctx->header);
|
|
385
|
+
for (size_t i = 0; i < HTTP_RESPONSE_COUNT; i++) {
|
|
386
|
+
grpc_http_response_destroy(&ctx->responses[i]);
|
|
387
|
+
}
|
|
388
|
+
/* TODO: see what to do with claims... */
|
|
389
|
+
gpr_free(ctx);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/* --- grpc_jwt_verifier object. --- */
|
|
393
|
+
|
|
394
|
+
/* Clock skew defaults to one minute. */
|
|
395
|
+
gpr_timespec grpc_jwt_verifier_clock_skew = {60, 0, GPR_TIMESPAN};
|
|
396
|
+
|
|
397
|
+
/* Max delay defaults to one minute. */
|
|
398
|
+
gpr_timespec grpc_jwt_verifier_max_delay = {60, 0, GPR_TIMESPAN};
|
|
399
|
+
|
|
400
|
+
typedef struct {
|
|
401
|
+
char *email_domain;
|
|
402
|
+
char *key_url_prefix;
|
|
403
|
+
} email_key_mapping;
|
|
404
|
+
|
|
405
|
+
struct grpc_jwt_verifier {
|
|
406
|
+
email_key_mapping *mappings;
|
|
407
|
+
size_t num_mappings; /* Should be very few, linear search ok. */
|
|
408
|
+
size_t allocated_mappings;
|
|
409
|
+
grpc_httpcli_context http_ctx;
|
|
410
|
+
};
|
|
411
|
+
|
|
412
|
+
static grpc_json *json_from_http(const grpc_httpcli_response *response) {
|
|
413
|
+
grpc_json *json = NULL;
|
|
414
|
+
|
|
415
|
+
if (response == NULL) {
|
|
416
|
+
gpr_log(GPR_ERROR, "HTTP response is NULL.");
|
|
417
|
+
return NULL;
|
|
418
|
+
}
|
|
419
|
+
if (response->status != 200) {
|
|
420
|
+
gpr_log(GPR_ERROR, "Call to http server failed with error %d.",
|
|
421
|
+
response->status);
|
|
422
|
+
return NULL;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
json = grpc_json_parse_string_with_len(response->body, response->body_length);
|
|
426
|
+
if (json == NULL) {
|
|
427
|
+
gpr_log(GPR_ERROR, "Invalid JSON found in response.");
|
|
428
|
+
}
|
|
429
|
+
return json;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
static const grpc_json *find_property_by_name(const grpc_json *json,
|
|
433
|
+
const char *name) {
|
|
434
|
+
const grpc_json *cur;
|
|
435
|
+
for (cur = json->child; cur != NULL; cur = cur->next) {
|
|
436
|
+
if (strcmp(cur->key, name) == 0) return cur;
|
|
437
|
+
}
|
|
438
|
+
return NULL;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
static EVP_PKEY *extract_pkey_from_x509(const char *x509_str) {
|
|
442
|
+
X509 *x509 = NULL;
|
|
443
|
+
EVP_PKEY *result = NULL;
|
|
444
|
+
BIO *bio = BIO_new(BIO_s_mem());
|
|
445
|
+
size_t len = strlen(x509_str);
|
|
446
|
+
GPR_ASSERT(len < INT_MAX);
|
|
447
|
+
BIO_write(bio, x509_str, (int)len);
|
|
448
|
+
x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL);
|
|
449
|
+
if (x509 == NULL) {
|
|
450
|
+
gpr_log(GPR_ERROR, "Unable to parse x509 cert.");
|
|
451
|
+
goto end;
|
|
452
|
+
}
|
|
453
|
+
result = X509_get_pubkey(x509);
|
|
454
|
+
if (result == NULL) {
|
|
455
|
+
gpr_log(GPR_ERROR, "Cannot find public key in X509 cert.");
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
end:
|
|
459
|
+
BIO_free(bio);
|
|
460
|
+
if (x509 != NULL) X509_free(x509);
|
|
461
|
+
return result;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
static BIGNUM *bignum_from_base64(grpc_exec_ctx *exec_ctx, const char *b64) {
|
|
465
|
+
BIGNUM *result = NULL;
|
|
466
|
+
grpc_slice bin;
|
|
467
|
+
|
|
468
|
+
if (b64 == NULL) return NULL;
|
|
469
|
+
bin = grpc_base64_decode(exec_ctx, b64, 1);
|
|
470
|
+
if (GRPC_SLICE_IS_EMPTY(bin)) {
|
|
471
|
+
gpr_log(GPR_ERROR, "Invalid base64 for big num.");
|
|
472
|
+
return NULL;
|
|
473
|
+
}
|
|
474
|
+
result = BN_bin2bn(GRPC_SLICE_START_PTR(bin),
|
|
475
|
+
TSI_SIZE_AS_SIZE(GRPC_SLICE_LENGTH(bin)), NULL);
|
|
476
|
+
grpc_slice_unref_internal(exec_ctx, bin);
|
|
477
|
+
return result;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
static EVP_PKEY *pkey_from_jwk(grpc_exec_ctx *exec_ctx, const grpc_json *json,
|
|
481
|
+
const char *kty) {
|
|
482
|
+
const grpc_json *key_prop;
|
|
483
|
+
RSA *rsa = NULL;
|
|
484
|
+
EVP_PKEY *result = NULL;
|
|
485
|
+
|
|
486
|
+
GPR_ASSERT(kty != NULL && json != NULL);
|
|
487
|
+
if (strcmp(kty, "RSA") != 0) {
|
|
488
|
+
gpr_log(GPR_ERROR, "Unsupported key type %s.", kty);
|
|
489
|
+
goto end;
|
|
490
|
+
}
|
|
491
|
+
rsa = RSA_new();
|
|
492
|
+
if (rsa == NULL) {
|
|
493
|
+
gpr_log(GPR_ERROR, "Could not create rsa key.");
|
|
494
|
+
goto end;
|
|
495
|
+
}
|
|
496
|
+
for (key_prop = json->child; key_prop != NULL; key_prop = key_prop->next) {
|
|
497
|
+
if (strcmp(key_prop->key, "n") == 0) {
|
|
498
|
+
rsa->n =
|
|
499
|
+
bignum_from_base64(exec_ctx, validate_string_field(key_prop, "n"));
|
|
500
|
+
if (rsa->n == NULL) goto end;
|
|
501
|
+
} else if (strcmp(key_prop->key, "e") == 0) {
|
|
502
|
+
rsa->e =
|
|
503
|
+
bignum_from_base64(exec_ctx, validate_string_field(key_prop, "e"));
|
|
504
|
+
if (rsa->e == NULL) goto end;
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
if (rsa->e == NULL || rsa->n == NULL) {
|
|
508
|
+
gpr_log(GPR_ERROR, "Missing RSA public key field.");
|
|
509
|
+
goto end;
|
|
510
|
+
}
|
|
511
|
+
result = EVP_PKEY_new();
|
|
512
|
+
EVP_PKEY_set1_RSA(result, rsa); /* uprefs rsa. */
|
|
513
|
+
|
|
514
|
+
end:
|
|
515
|
+
if (rsa != NULL) RSA_free(rsa);
|
|
516
|
+
return result;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
static EVP_PKEY *find_verification_key(grpc_exec_ctx *exec_ctx,
|
|
520
|
+
const grpc_json *json,
|
|
521
|
+
const char *header_alg,
|
|
522
|
+
const char *header_kid) {
|
|
523
|
+
const grpc_json *jkey;
|
|
524
|
+
const grpc_json *jwk_keys;
|
|
525
|
+
/* Try to parse the json as a JWK set:
|
|
526
|
+
https://tools.ietf.org/html/rfc7517#section-5. */
|
|
527
|
+
jwk_keys = find_property_by_name(json, "keys");
|
|
528
|
+
if (jwk_keys == NULL) {
|
|
529
|
+
/* Use the google proprietary format which is:
|
|
530
|
+
{ <kid1>: <x5091>, <kid2>: <x5092>, ... } */
|
|
531
|
+
const grpc_json *cur = find_property_by_name(json, header_kid);
|
|
532
|
+
if (cur == NULL) return NULL;
|
|
533
|
+
return extract_pkey_from_x509(cur->value);
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
if (jwk_keys->type != GRPC_JSON_ARRAY) {
|
|
537
|
+
gpr_log(GPR_ERROR,
|
|
538
|
+
"Unexpected value type of keys property in jwks key set.");
|
|
539
|
+
return NULL;
|
|
540
|
+
}
|
|
541
|
+
/* Key format is specified in:
|
|
542
|
+
https://tools.ietf.org/html/rfc7518#section-6. */
|
|
543
|
+
for (jkey = jwk_keys->child; jkey != NULL; jkey = jkey->next) {
|
|
544
|
+
grpc_json *key_prop;
|
|
545
|
+
const char *alg = NULL;
|
|
546
|
+
const char *kid = NULL;
|
|
547
|
+
const char *kty = NULL;
|
|
548
|
+
|
|
549
|
+
if (jkey->type != GRPC_JSON_OBJECT) continue;
|
|
550
|
+
for (key_prop = jkey->child; key_prop != NULL; key_prop = key_prop->next) {
|
|
551
|
+
if (strcmp(key_prop->key, "alg") == 0 &&
|
|
552
|
+
key_prop->type == GRPC_JSON_STRING) {
|
|
553
|
+
alg = key_prop->value;
|
|
554
|
+
} else if (strcmp(key_prop->key, "kid") == 0 &&
|
|
555
|
+
key_prop->type == GRPC_JSON_STRING) {
|
|
556
|
+
kid = key_prop->value;
|
|
557
|
+
} else if (strcmp(key_prop->key, "kty") == 0 &&
|
|
558
|
+
key_prop->type == GRPC_JSON_STRING) {
|
|
559
|
+
kty = key_prop->value;
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
if (alg != NULL && kid != NULL && kty != NULL &&
|
|
563
|
+
strcmp(kid, header_kid) == 0 && strcmp(alg, header_alg) == 0) {
|
|
564
|
+
return pkey_from_jwk(exec_ctx, jkey, kty);
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
gpr_log(GPR_ERROR,
|
|
568
|
+
"Could not find matching key in key set for kid=%s and alg=%s",
|
|
569
|
+
header_kid, header_alg);
|
|
570
|
+
return NULL;
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
static int verify_jwt_signature(EVP_PKEY *key, const char *alg,
|
|
574
|
+
grpc_slice signature, grpc_slice signed_data) {
|
|
575
|
+
EVP_MD_CTX *md_ctx = EVP_MD_CTX_create();
|
|
576
|
+
const EVP_MD *md = evp_md_from_alg(alg);
|
|
577
|
+
int result = 0;
|
|
578
|
+
|
|
579
|
+
GPR_ASSERT(md != NULL); /* Checked before. */
|
|
580
|
+
if (md_ctx == NULL) {
|
|
581
|
+
gpr_log(GPR_ERROR, "Could not create EVP_MD_CTX.");
|
|
582
|
+
goto end;
|
|
583
|
+
}
|
|
584
|
+
if (EVP_DigestVerifyInit(md_ctx, NULL, md, NULL, key) != 1) {
|
|
585
|
+
gpr_log(GPR_ERROR, "EVP_DigestVerifyInit failed.");
|
|
586
|
+
goto end;
|
|
587
|
+
}
|
|
588
|
+
if (EVP_DigestVerifyUpdate(md_ctx, GRPC_SLICE_START_PTR(signed_data),
|
|
589
|
+
GRPC_SLICE_LENGTH(signed_data)) != 1) {
|
|
590
|
+
gpr_log(GPR_ERROR, "EVP_DigestVerifyUpdate failed.");
|
|
591
|
+
goto end;
|
|
592
|
+
}
|
|
593
|
+
if (EVP_DigestVerifyFinal(md_ctx, GRPC_SLICE_START_PTR(signature),
|
|
594
|
+
GRPC_SLICE_LENGTH(signature)) != 1) {
|
|
595
|
+
gpr_log(GPR_ERROR, "JWT signature verification failed.");
|
|
596
|
+
goto end;
|
|
597
|
+
}
|
|
598
|
+
result = 1;
|
|
599
|
+
|
|
600
|
+
end:
|
|
601
|
+
if (md_ctx != NULL) EVP_MD_CTX_destroy(md_ctx);
|
|
602
|
+
return result;
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
static void on_keys_retrieved(grpc_exec_ctx *exec_ctx, void *user_data,
|
|
606
|
+
grpc_error *error) {
|
|
607
|
+
verifier_cb_ctx *ctx = (verifier_cb_ctx *)user_data;
|
|
608
|
+
grpc_json *json = json_from_http(&ctx->responses[HTTP_RESPONSE_KEYS]);
|
|
609
|
+
EVP_PKEY *verification_key = NULL;
|
|
610
|
+
grpc_jwt_verifier_status status = GRPC_JWT_VERIFIER_GENERIC_ERROR;
|
|
611
|
+
grpc_jwt_claims *claims = NULL;
|
|
612
|
+
|
|
613
|
+
if (json == NULL) {
|
|
614
|
+
status = GRPC_JWT_VERIFIER_KEY_RETRIEVAL_ERROR;
|
|
615
|
+
goto end;
|
|
616
|
+
}
|
|
617
|
+
verification_key =
|
|
618
|
+
find_verification_key(exec_ctx, json, ctx->header->alg, ctx->header->kid);
|
|
619
|
+
if (verification_key == NULL) {
|
|
620
|
+
gpr_log(GPR_ERROR, "Could not find verification key with kid %s.",
|
|
621
|
+
ctx->header->kid);
|
|
622
|
+
status = GRPC_JWT_VERIFIER_KEY_RETRIEVAL_ERROR;
|
|
623
|
+
goto end;
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
if (!verify_jwt_signature(verification_key, ctx->header->alg, ctx->signature,
|
|
627
|
+
ctx->signed_data)) {
|
|
628
|
+
status = GRPC_JWT_VERIFIER_BAD_SIGNATURE;
|
|
629
|
+
goto end;
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
status = grpc_jwt_claims_check(ctx->claims, ctx->audience);
|
|
633
|
+
if (status == GRPC_JWT_VERIFIER_OK) {
|
|
634
|
+
/* Pass ownership. */
|
|
635
|
+
claims = ctx->claims;
|
|
636
|
+
ctx->claims = NULL;
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
end:
|
|
640
|
+
if (json != NULL) grpc_json_destroy(json);
|
|
641
|
+
if (verification_key != NULL) EVP_PKEY_free(verification_key);
|
|
642
|
+
ctx->user_cb(exec_ctx, ctx->user_data, status, claims);
|
|
643
|
+
verifier_cb_ctx_destroy(exec_ctx, ctx);
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
static void on_openid_config_retrieved(grpc_exec_ctx *exec_ctx, void *user_data,
|
|
647
|
+
grpc_error *error) {
|
|
648
|
+
const grpc_json *cur;
|
|
649
|
+
verifier_cb_ctx *ctx = (verifier_cb_ctx *)user_data;
|
|
650
|
+
const grpc_http_response *response = &ctx->responses[HTTP_RESPONSE_OPENID];
|
|
651
|
+
grpc_json *json = json_from_http(response);
|
|
652
|
+
grpc_httpcli_request req;
|
|
653
|
+
const char *jwks_uri;
|
|
654
|
+
|
|
655
|
+
/* TODO(jboeuf): Cache the jwks_uri in order to avoid this hop next time. */
|
|
656
|
+
if (json == NULL) goto error;
|
|
657
|
+
cur = find_property_by_name(json, "jwks_uri");
|
|
658
|
+
if (cur == NULL) {
|
|
659
|
+
gpr_log(GPR_ERROR, "Could not find jwks_uri in openid config.");
|
|
660
|
+
goto error;
|
|
661
|
+
}
|
|
662
|
+
jwks_uri = validate_string_field(cur, "jwks_uri");
|
|
663
|
+
if (jwks_uri == NULL) goto error;
|
|
664
|
+
if (strstr(jwks_uri, "https://") != jwks_uri) {
|
|
665
|
+
gpr_log(GPR_ERROR, "Invalid non https jwks_uri: %s.", jwks_uri);
|
|
666
|
+
goto error;
|
|
667
|
+
}
|
|
668
|
+
jwks_uri += 8;
|
|
669
|
+
req.handshaker = &grpc_httpcli_ssl;
|
|
670
|
+
req.host = gpr_strdup(jwks_uri);
|
|
671
|
+
req.http.path = strchr(jwks_uri, '/');
|
|
672
|
+
if (req.http.path == NULL) {
|
|
673
|
+
req.http.path = "";
|
|
674
|
+
} else {
|
|
675
|
+
*(req.host + (req.http.path - jwks_uri)) = '\0';
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
/* TODO(ctiller): Carry the resource_quota in ctx and share it with the host
|
|
679
|
+
channel. This would allow us to cancel an authentication query when under
|
|
680
|
+
extreme memory pressure. */
|
|
681
|
+
grpc_resource_quota *resource_quota =
|
|
682
|
+
grpc_resource_quota_create("jwt_verifier");
|
|
683
|
+
grpc_httpcli_get(
|
|
684
|
+
exec_ctx, &ctx->verifier->http_ctx, &ctx->pollent, resource_quota, &req,
|
|
685
|
+
gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), grpc_jwt_verifier_max_delay),
|
|
686
|
+
grpc_closure_create(on_keys_retrieved, ctx, grpc_schedule_on_exec_ctx),
|
|
687
|
+
&ctx->responses[HTTP_RESPONSE_KEYS]);
|
|
688
|
+
grpc_resource_quota_unref_internal(exec_ctx, resource_quota);
|
|
689
|
+
grpc_json_destroy(json);
|
|
690
|
+
gpr_free(req.host);
|
|
691
|
+
return;
|
|
692
|
+
|
|
693
|
+
error:
|
|
694
|
+
if (json != NULL) grpc_json_destroy(json);
|
|
695
|
+
ctx->user_cb(exec_ctx, ctx->user_data, GRPC_JWT_VERIFIER_KEY_RETRIEVAL_ERROR,
|
|
696
|
+
NULL);
|
|
697
|
+
verifier_cb_ctx_destroy(exec_ctx, ctx);
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
static email_key_mapping *verifier_get_mapping(grpc_jwt_verifier *v,
|
|
701
|
+
const char *email_domain) {
|
|
702
|
+
size_t i;
|
|
703
|
+
if (v->mappings == NULL) return NULL;
|
|
704
|
+
for (i = 0; i < v->num_mappings; i++) {
|
|
705
|
+
if (strcmp(email_domain, v->mappings[i].email_domain) == 0) {
|
|
706
|
+
return &v->mappings[i];
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
return NULL;
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
static void verifier_put_mapping(grpc_jwt_verifier *v, const char *email_domain,
|
|
713
|
+
const char *key_url_prefix) {
|
|
714
|
+
email_key_mapping *mapping = verifier_get_mapping(v, email_domain);
|
|
715
|
+
GPR_ASSERT(v->num_mappings < v->allocated_mappings);
|
|
716
|
+
if (mapping != NULL) {
|
|
717
|
+
gpr_free(mapping->key_url_prefix);
|
|
718
|
+
mapping->key_url_prefix = gpr_strdup(key_url_prefix);
|
|
719
|
+
return;
|
|
720
|
+
}
|
|
721
|
+
v->mappings[v->num_mappings].email_domain = gpr_strdup(email_domain);
|
|
722
|
+
v->mappings[v->num_mappings].key_url_prefix = gpr_strdup(key_url_prefix);
|
|
723
|
+
v->num_mappings++;
|
|
724
|
+
GPR_ASSERT(v->num_mappings <= v->allocated_mappings);
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
/* Very non-sophisticated way to detect an email address. Should be good
|
|
728
|
+
enough for now... */
|
|
729
|
+
const char *grpc_jwt_issuer_email_domain(const char *issuer) {
|
|
730
|
+
const char *at_sign = strchr(issuer, '@');
|
|
731
|
+
if (at_sign == NULL) return NULL;
|
|
732
|
+
const char *email_domain = at_sign + 1;
|
|
733
|
+
if (*email_domain == '\0') return NULL;
|
|
734
|
+
const char *dot = strrchr(email_domain, '.');
|
|
735
|
+
if (dot == NULL || dot == email_domain) return email_domain;
|
|
736
|
+
GPR_ASSERT(dot > email_domain);
|
|
737
|
+
/* There may be a subdomain, we just want the domain. */
|
|
738
|
+
dot = gpr_memrchr(email_domain, '.', (size_t)(dot - email_domain));
|
|
739
|
+
if (dot == NULL) return email_domain;
|
|
740
|
+
return dot + 1;
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
/* Takes ownership of ctx. */
|
|
744
|
+
static void retrieve_key_and_verify(grpc_exec_ctx *exec_ctx,
|
|
745
|
+
verifier_cb_ctx *ctx) {
|
|
746
|
+
const char *email_domain;
|
|
747
|
+
grpc_closure *http_cb;
|
|
748
|
+
char *path_prefix = NULL;
|
|
749
|
+
const char *iss;
|
|
750
|
+
grpc_httpcli_request req;
|
|
751
|
+
memset(&req, 0, sizeof(grpc_httpcli_request));
|
|
752
|
+
req.handshaker = &grpc_httpcli_ssl;
|
|
753
|
+
http_response_index rsp_idx;
|
|
754
|
+
|
|
755
|
+
GPR_ASSERT(ctx != NULL && ctx->header != NULL && ctx->claims != NULL);
|
|
756
|
+
iss = ctx->claims->iss;
|
|
757
|
+
if (ctx->header->kid == NULL) {
|
|
758
|
+
gpr_log(GPR_ERROR, "Missing kid in jose header.");
|
|
759
|
+
goto error;
|
|
760
|
+
}
|
|
761
|
+
if (iss == NULL) {
|
|
762
|
+
gpr_log(GPR_ERROR, "Missing iss in claims.");
|
|
763
|
+
goto error;
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
/* This code relies on:
|
|
767
|
+
https://openid.net/specs/openid-connect-discovery-1_0.html
|
|
768
|
+
Nobody seems to implement the account/email/webfinger part 2. of the spec
|
|
769
|
+
so we will rely instead on email/url mappings if we detect such an issuer.
|
|
770
|
+
Part 4, on the other hand is implemented by both google and salesforce. */
|
|
771
|
+
email_domain = grpc_jwt_issuer_email_domain(iss);
|
|
772
|
+
if (email_domain != NULL) {
|
|
773
|
+
email_key_mapping *mapping;
|
|
774
|
+
GPR_ASSERT(ctx->verifier != NULL);
|
|
775
|
+
mapping = verifier_get_mapping(ctx->verifier, email_domain);
|
|
776
|
+
if (mapping == NULL) {
|
|
777
|
+
gpr_log(GPR_ERROR, "Missing mapping for issuer email.");
|
|
778
|
+
goto error;
|
|
779
|
+
}
|
|
780
|
+
req.host = gpr_strdup(mapping->key_url_prefix);
|
|
781
|
+
path_prefix = strchr(req.host, '/');
|
|
782
|
+
if (path_prefix == NULL) {
|
|
783
|
+
gpr_asprintf(&req.http.path, "/%s", iss);
|
|
784
|
+
} else {
|
|
785
|
+
*(path_prefix++) = '\0';
|
|
786
|
+
gpr_asprintf(&req.http.path, "/%s/%s", path_prefix, iss);
|
|
787
|
+
}
|
|
788
|
+
http_cb =
|
|
789
|
+
grpc_closure_create(on_keys_retrieved, ctx, grpc_schedule_on_exec_ctx);
|
|
790
|
+
rsp_idx = HTTP_RESPONSE_KEYS;
|
|
791
|
+
} else {
|
|
792
|
+
req.host = gpr_strdup(strstr(iss, "https://") == iss ? iss + 8 : iss);
|
|
793
|
+
path_prefix = strchr(req.host, '/');
|
|
794
|
+
if (path_prefix == NULL) {
|
|
795
|
+
req.http.path = gpr_strdup(GRPC_OPENID_CONFIG_URL_SUFFIX);
|
|
796
|
+
} else {
|
|
797
|
+
*(path_prefix++) = 0;
|
|
798
|
+
gpr_asprintf(&req.http.path, "/%s%s", path_prefix,
|
|
799
|
+
GRPC_OPENID_CONFIG_URL_SUFFIX);
|
|
800
|
+
}
|
|
801
|
+
http_cb = grpc_closure_create(on_openid_config_retrieved, ctx,
|
|
802
|
+
grpc_schedule_on_exec_ctx);
|
|
803
|
+
rsp_idx = HTTP_RESPONSE_OPENID;
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
/* TODO(ctiller): Carry the resource_quota in ctx and share it with the host
|
|
807
|
+
channel. This would allow us to cancel an authentication query when under
|
|
808
|
+
extreme memory pressure. */
|
|
809
|
+
grpc_resource_quota *resource_quota =
|
|
810
|
+
grpc_resource_quota_create("jwt_verifier");
|
|
811
|
+
grpc_httpcli_get(
|
|
812
|
+
exec_ctx, &ctx->verifier->http_ctx, &ctx->pollent, resource_quota, &req,
|
|
813
|
+
gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), grpc_jwt_verifier_max_delay),
|
|
814
|
+
http_cb, &ctx->responses[rsp_idx]);
|
|
815
|
+
grpc_resource_quota_unref_internal(exec_ctx, resource_quota);
|
|
816
|
+
gpr_free(req.host);
|
|
817
|
+
gpr_free(req.http.path);
|
|
818
|
+
return;
|
|
819
|
+
|
|
820
|
+
error:
|
|
821
|
+
ctx->user_cb(exec_ctx, ctx->user_data, GRPC_JWT_VERIFIER_KEY_RETRIEVAL_ERROR,
|
|
822
|
+
NULL);
|
|
823
|
+
verifier_cb_ctx_destroy(exec_ctx, ctx);
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
void grpc_jwt_verifier_verify(grpc_exec_ctx *exec_ctx,
|
|
827
|
+
grpc_jwt_verifier *verifier,
|
|
828
|
+
grpc_pollset *pollset, const char *jwt,
|
|
829
|
+
const char *audience,
|
|
830
|
+
grpc_jwt_verification_done_cb cb,
|
|
831
|
+
void *user_data) {
|
|
832
|
+
const char *dot = NULL;
|
|
833
|
+
grpc_json *json;
|
|
834
|
+
jose_header *header = NULL;
|
|
835
|
+
grpc_jwt_claims *claims = NULL;
|
|
836
|
+
grpc_slice header_buffer;
|
|
837
|
+
grpc_slice claims_buffer;
|
|
838
|
+
grpc_slice signature;
|
|
839
|
+
size_t signed_jwt_len;
|
|
840
|
+
const char *cur = jwt;
|
|
841
|
+
|
|
842
|
+
GPR_ASSERT(verifier != NULL && jwt != NULL && audience != NULL && cb != NULL);
|
|
843
|
+
dot = strchr(cur, '.');
|
|
844
|
+
if (dot == NULL) goto error;
|
|
845
|
+
json = parse_json_part_from_jwt(exec_ctx, cur, (size_t)(dot - cur),
|
|
846
|
+
&header_buffer);
|
|
847
|
+
if (json == NULL) goto error;
|
|
848
|
+
header = jose_header_from_json(exec_ctx, json, header_buffer);
|
|
849
|
+
if (header == NULL) goto error;
|
|
850
|
+
|
|
851
|
+
cur = dot + 1;
|
|
852
|
+
dot = strchr(cur, '.');
|
|
853
|
+
if (dot == NULL) goto error;
|
|
854
|
+
json = parse_json_part_from_jwt(exec_ctx, cur, (size_t)(dot - cur),
|
|
855
|
+
&claims_buffer);
|
|
856
|
+
if (json == NULL) goto error;
|
|
857
|
+
claims = grpc_jwt_claims_from_json(exec_ctx, json, claims_buffer);
|
|
858
|
+
if (claims == NULL) goto error;
|
|
859
|
+
|
|
860
|
+
signed_jwt_len = (size_t)(dot - jwt);
|
|
861
|
+
cur = dot + 1;
|
|
862
|
+
signature = grpc_base64_decode(exec_ctx, cur, 1);
|
|
863
|
+
if (GRPC_SLICE_IS_EMPTY(signature)) goto error;
|
|
864
|
+
retrieve_key_and_verify(
|
|
865
|
+
exec_ctx,
|
|
866
|
+
verifier_cb_ctx_create(verifier, pollset, header, claims, audience,
|
|
867
|
+
signature, jwt, signed_jwt_len, user_data, cb));
|
|
868
|
+
return;
|
|
869
|
+
|
|
870
|
+
error:
|
|
871
|
+
if (header != NULL) jose_header_destroy(exec_ctx, header);
|
|
872
|
+
if (claims != NULL) grpc_jwt_claims_destroy(exec_ctx, claims);
|
|
873
|
+
cb(exec_ctx, user_data, GRPC_JWT_VERIFIER_BAD_FORMAT, NULL);
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
grpc_jwt_verifier *grpc_jwt_verifier_create(
|
|
877
|
+
const grpc_jwt_verifier_email_domain_key_url_mapping *mappings,
|
|
878
|
+
size_t num_mappings) {
|
|
879
|
+
grpc_jwt_verifier *v = gpr_zalloc(sizeof(grpc_jwt_verifier));
|
|
880
|
+
grpc_httpcli_context_init(&v->http_ctx);
|
|
881
|
+
|
|
882
|
+
/* We know at least of one mapping. */
|
|
883
|
+
v->allocated_mappings = 1 + num_mappings;
|
|
884
|
+
v->mappings = gpr_malloc(v->allocated_mappings * sizeof(email_key_mapping));
|
|
885
|
+
verifier_put_mapping(v, GRPC_GOOGLE_SERVICE_ACCOUNTS_EMAIL_DOMAIN,
|
|
886
|
+
GRPC_GOOGLE_SERVICE_ACCOUNTS_KEY_URL_PREFIX);
|
|
887
|
+
/* User-Provided mappings. */
|
|
888
|
+
if (mappings != NULL) {
|
|
889
|
+
size_t i;
|
|
890
|
+
for (i = 0; i < num_mappings; i++) {
|
|
891
|
+
verifier_put_mapping(v, mappings[i].email_domain,
|
|
892
|
+
mappings[i].key_url_prefix);
|
|
893
|
+
}
|
|
894
|
+
}
|
|
895
|
+
return v;
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
void grpc_jwt_verifier_destroy(grpc_exec_ctx *exec_ctx, grpc_jwt_verifier *v) {
|
|
899
|
+
size_t i;
|
|
900
|
+
if (v == NULL) return;
|
|
901
|
+
grpc_httpcli_context_destroy(exec_ctx, &v->http_ctx);
|
|
902
|
+
if (v->mappings != NULL) {
|
|
903
|
+
for (i = 0; i < v->num_mappings; i++) {
|
|
904
|
+
gpr_free(v->mappings[i].email_domain);
|
|
905
|
+
gpr_free(v->mappings[i].key_url_prefix);
|
|
906
|
+
}
|
|
907
|
+
gpr_free(v->mappings);
|
|
908
|
+
}
|
|
909
|
+
gpr_free(v);
|
|
910
|
+
}
|