grpc 1.41.0 → 1.42.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +57 -44
- data/etc/roots.pem +335 -326
- data/include/grpc/event_engine/event_engine.h +82 -42
- data/include/grpc/event_engine/internal/memory_allocator_impl.h +98 -0
- data/include/grpc/event_engine/memory_allocator.h +210 -0
- data/include/grpc/grpc.h +4 -0
- data/include/grpc/grpc_security.h +18 -0
- data/include/grpc/grpc_security_constants.h +1 -0
- data/include/grpc/impl/codegen/port_platform.h +7 -0
- data/src/core/ext/filters/client_channel/backend_metric.cc +18 -19
- data/src/core/ext/filters/client_channel/backup_poller.cc +2 -1
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +71 -89
- data/src/core/ext/filters/client_channel/client_channel.cc +187 -252
- data/src/core/ext/filters/client_channel/client_channel.h +74 -27
- data/src/core/ext/filters/client_channel/client_channel_factory.cc +1 -1
- data/src/core/ext/filters/client_channel/client_channel_factory.h +17 -19
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +8 -14
- data/src/core/ext/filters/client_channel/config_selector.cc +1 -1
- data/src/core/ext/filters/client_channel/config_selector.h +4 -5
- data/src/core/ext/filters/client_channel/connector.h +18 -18
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +1 -1
- data/src/core/ext/filters/client_channel/global_subchannel_pool.h +0 -1
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +12 -11
- data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +4 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -15
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +166 -82
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +4 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +2 -4
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +23 -7
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -10
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -3
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +2502 -0
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +6 -1
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +7 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +6 -2
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +7 -16
- data/src/core/ext/filters/client_channel/lb_policy.h +11 -1
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -0
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +139 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +11 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -3
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +12 -39
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +21 -1
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -2
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +3 -1
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +77 -68
- data/src/core/ext/filters/client_channel/resolver.h +1 -1
- data/src/core/ext/filters/client_channel/resolver_factory.h +2 -0
- data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -8
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +1 -1
- data/src/core/ext/filters/client_channel/retry_filter.cc +48 -86
- data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
- data/src/core/ext/filters/client_channel/retry_throttle.cc +17 -48
- data/src/core/ext/filters/client_channel/server_address.h +1 -1
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +49 -36
- data/src/core/ext/filters/client_channel/subchannel.cc +85 -143
- data/src/core/ext/filters/client_channel/subchannel.h +29 -49
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +22 -7
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +11 -2
- data/src/core/ext/filters/client_idle/client_idle_filter.cc +27 -210
- data/src/core/ext/filters/client_idle/idle_filter_state.cc +96 -0
- data/src/core/ext/filters/client_idle/idle_filter_state.h +66 -0
- data/src/core/ext/filters/deadline/deadline_filter.cc +23 -26
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -19
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -1
- data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
- data/src/core/ext/filters/http/client/http_client_filter.cc +41 -44
- data/src/core/ext/filters/http/client_authority_filter.cc +14 -15
- data/src/core/ext/filters/http/http_filters_plugin.cc +53 -71
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +17 -12
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +1 -1
- data/src/core/ext/filters/http/server/http_server_filter.cc +72 -69
- data/src/core/ext/filters/max_age/max_age_filter.cc +24 -26
- data/src/core/ext/filters/message_size/message_size_filter.cc +19 -16
- data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
- data/src/core/ext/{filters/client_channel → service_config}/service_config.cc +2 -2
- data/src/core/ext/{filters/client_channel → service_config}/service_config.h +4 -4
- data/src/core/ext/service_config/service_config_call_data.h +72 -0
- data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.cc +3 -3
- data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.h +8 -6
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -5
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +19 -24
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +27 -50
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +14 -16
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +59 -58
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +19 -16
- data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -4
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +4 -4
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -3
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/hpack_constants.h +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +41 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -4
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +136 -98
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +27 -8
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +12 -25
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +37 -30
- data/src/core/ext/transport/chttp2/transport/internal.h +4 -3
- data/src/core/ext/transport/chttp2/transport/parsing.cc +30 -173
- data/src/core/ext/transport/chttp2/transport/popularity_count.h +1 -1
- data/src/core/ext/transport/chttp2/transport/writing.cc +29 -22
- data/src/core/ext/transport/inproc/inproc_transport.cc +105 -109
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +68 -34
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +139 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +16 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +53 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +3 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +15 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +13 -8
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +23 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +0 -1
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +14 -11
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +17 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +15 -12
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +49 -19
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +55 -0
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +154 -0
- data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +0 -2
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +58 -0
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +182 -0
- data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +58 -0
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +130 -0
- data/src/core/ext/upb-generated/{udpa/type/v1 → xds/type/v3}/typed_struct.upb.c +7 -7
- data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +83 -0
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +310 -286
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +10 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +101 -88
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +59 -56
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +59 -46
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +78 -82
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +323 -316
- data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +5 -4
- data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +19 -23
- data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +4 -3
- data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +5 -3
- data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +5 -4
- data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +75 -0
- data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.h +50 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +13 -12
- data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +25 -24
- data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +16 -15
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +17 -16
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +33 -32
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +19 -18
- data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +45 -0
- data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +35 -0
- data/src/core/ext/xds/xds_api.cc +325 -362
- data/src/core/ext/xds/xds_api.h +134 -82
- data/src/core/ext/xds/xds_bootstrap.h +10 -0
- data/src/core/ext/xds/xds_certificate_provider.cc +3 -3
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +113 -0
- data/src/core/ext/xds/xds_channel_stack_modifier.h +52 -0
- data/src/core/ext/xds/xds_client.cc +527 -314
- data/src/core/ext/xds/xds_client.h +42 -37
- data/src/core/ext/xds/xds_client_stats.h +1 -1
- data/src/core/ext/xds/xds_server_config_fetcher.cc +5 -7
- data/src/core/lib/address_utils/parse_address.cc +2 -0
- data/src/core/lib/avl/avl.cc +5 -5
- data/src/core/lib/backoff/backoff.cc +1 -1
- data/src/core/lib/channel/channel_args.cc +24 -6
- data/src/core/lib/channel/channel_args.h +9 -0
- data/src/core/lib/channel/channel_stack_builder.cc +3 -3
- data/src/core/lib/channel/channel_trace.cc +1 -1
- data/src/core/lib/channel/channel_trace.h +1 -1
- data/src/core/lib/channel/channelz.cc +3 -3
- data/src/core/lib/channel/channelz.h +2 -2
- data/src/core/lib/channel/channelz_registry.cc +1 -1
- data/src/core/lib/channel/channelz_registry.h +1 -1
- data/src/core/lib/channel/connected_channel.cc +1 -3
- data/src/core/lib/channel/connected_channel.h +1 -2
- data/src/core/lib/compression/compression.cc +2 -2
- data/src/core/lib/compression/compression_args.cc +6 -4
- data/src/core/lib/compression/compression_internal.cc +2 -2
- data/src/core/lib/compression/compression_internal.h +1 -1
- data/src/core/lib/config/core_configuration.cc +44 -2
- data/src/core/lib/config/core_configuration.h +39 -1
- data/src/core/lib/debug/stats.cc +1 -1
- data/src/core/lib/debug/stats_data.cc +13 -13
- data/src/core/lib/gpr/atm.cc +1 -1
- data/src/core/lib/gpr/cpu_posix.cc +1 -1
- data/src/core/lib/gpr/string.cc +2 -2
- data/src/core/lib/gpr/tls.h +1 -1
- data/src/core/lib/gpr/useful.h +79 -32
- data/src/core/lib/gprpp/arena.h +10 -0
- data/src/core/lib/gprpp/bitset.h +38 -16
- data/src/core/lib/gprpp/chunked_vector.h +211 -0
- data/src/core/lib/gprpp/construct_destruct.h +1 -1
- data/src/core/lib/gprpp/match.h +1 -1
- data/src/core/lib/gprpp/memory.h +6 -0
- data/src/core/lib/gprpp/overload.h +1 -1
- data/src/core/lib/gprpp/status_helper.cc +23 -3
- data/src/core/lib/gprpp/status_helper.h +12 -1
- data/src/core/lib/gprpp/table.h +411 -0
- data/src/core/lib/http/httpcli.cc +200 -182
- data/src/core/lib/http/parser.cc +2 -2
- data/src/core/lib/iomgr/call_combiner.cc +28 -10
- data/src/core/lib/iomgr/combiner.cc +6 -21
- data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -6
- data/src/core/lib/iomgr/error.cc +113 -52
- data/src/core/lib/iomgr/error.h +50 -9
- data/src/core/lib/iomgr/error_cfstream.cc +5 -0
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -2
- data/src/core/lib/iomgr/ev_epollex_linux.cc +7 -7
- data/src/core/lib/iomgr/ev_poll_posix.cc +29 -20
- data/src/core/lib/iomgr/event_engine/closure.cc +41 -18
- data/src/core/lib/iomgr/event_engine/closure.h +10 -1
- data/src/core/lib/iomgr/event_engine/endpoint.cc +3 -3
- data/src/core/lib/iomgr/event_engine/iomgr.cc +1 -1
- data/src/core/lib/iomgr/event_engine/pollset.cc +5 -4
- data/src/core/lib/iomgr/event_engine/resolver.cc +10 -7
- data/src/core/lib/iomgr/event_engine/tcp.cc +9 -8
- data/src/core/lib/iomgr/event_engine/timer.cc +7 -2
- data/src/core/lib/iomgr/exec_ctx.cc +1 -9
- data/src/core/lib/iomgr/executor/mpmcqueue.cc +5 -7
- data/src/core/lib/iomgr/executor/mpmcqueue.h +3 -8
- data/src/core/lib/iomgr/executor.cc +6 -20
- data/src/core/lib/iomgr/iomgr.cc +3 -1
- data/src/core/lib/iomgr/iomgr_internal.cc +4 -9
- data/src/core/lib/iomgr/iomgr_internal.h +3 -2
- data/src/core/lib/iomgr/load_file.cc +2 -2
- data/src/core/lib/iomgr/lockfree_event.cc +18 -0
- data/src/core/lib/iomgr/pollset_custom.cc +1 -1
- data/src/core/lib/iomgr/pollset_custom.h +1 -1
- data/src/core/lib/iomgr/resolve_address_posix.cc +5 -7
- data/src/core/lib/iomgr/resource_quota.cc +13 -11
- data/src/core/lib/iomgr/socket_factory_posix.cc +2 -2
- data/src/core/lib/iomgr/socket_mutator.cc +2 -2
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -2
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +5 -3
- data/src/core/lib/iomgr/tcp_client_custom.cc +1 -1
- data/src/core/lib/iomgr/tcp_client_posix.cc +9 -18
- data/src/core/lib/iomgr/tcp_client_windows.cc +2 -3
- data/src/core/lib/iomgr/tcp_posix.cc +4 -5
- data/src/core/lib/iomgr/tcp_server_custom.cc +2 -1
- data/src/core/lib/iomgr/tcp_server_posix.cc +3 -4
- data/src/core/lib/iomgr/tcp_server_windows.cc +4 -5
- data/src/core/lib/iomgr/tcp_windows.cc +2 -2
- data/src/core/lib/iomgr/timer_generic.cc +13 -13
- data/src/core/lib/iomgr/timer_heap.cc +1 -1
- data/src/core/lib/json/json_util.cc +68 -0
- data/src/core/lib/json/json_util.h +57 -99
- data/src/core/lib/json/json_writer.cc +0 -3
- data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
- data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +1 -1
- data/src/core/lib/security/authorization/evaluate_args.cc +14 -12
- data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +13 -1
- data/src/core/lib/security/context/security_context.cc +4 -2
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
- data/src/core/lib/security/credentials/credentials.cc +4 -2
- data/src/core/lib/security/credentials/credentials.h +6 -1
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +47 -11
- data/src/core/lib/security/credentials/external/external_account_credentials.h +1 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -9
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -2
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +2 -2
- data/src/core/lib/security/security_connector/security_connector.cc +9 -4
- data/src/core/lib/security/security_connector/security_connector.h +1 -1
- data/src/core/lib/security/security_connector/ssl_utils.cc +1 -1
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +1 -0
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +0 -2
- data/src/core/lib/security/transport/client_auth_filter.cc +5 -5
- data/src/core/lib/security/transport/security_handshaker.cc +73 -43
- data/src/core/lib/security/transport/server_auth_filter.cc +3 -5
- data/src/core/lib/security/transport/tsi_error.cc +3 -5
- data/src/core/lib/slice/slice.cc +0 -16
- data/src/core/lib/slice/slice_api.cc +39 -0
- data/src/core/lib/slice/slice_buffer.cc +5 -5
- data/src/core/lib/slice/slice_intern.cc +8 -13
- data/src/core/lib/slice/slice_internal.h +1 -244
- data/src/core/lib/slice/slice_refcount.cc +17 -0
- data/src/core/lib/slice/slice_refcount.h +121 -0
- data/src/core/lib/slice/slice_refcount_base.h +173 -0
- data/src/core/lib/slice/slice_split.cc +100 -0
- data/src/core/lib/slice/slice_split.h +40 -0
- data/src/core/lib/slice/slice_string_helpers.cc +0 -83
- data/src/core/lib/slice/slice_string_helpers.h +0 -11
- data/src/core/lib/slice/static_slice.cc +529 -0
- data/src/core/lib/slice/static_slice.h +331 -0
- data/src/core/lib/surface/builtins.cc +49 -0
- data/src/core/{ext/filters/workarounds/workaround_cronet_compression_filter.h → lib/surface/builtins.h} +8 -9
- data/src/core/lib/surface/call.cc +103 -120
- data/src/core/lib/surface/call.h +0 -6
- data/src/core/lib/surface/channel.cc +19 -32
- data/src/core/lib/surface/channel.h +0 -9
- data/src/core/lib/surface/channel_init.cc +23 -76
- data/src/core/lib/surface/channel_init.h +52 -44
- data/src/core/lib/surface/completion_queue.cc +6 -5
- data/src/core/lib/surface/init.cc +0 -39
- data/src/core/lib/surface/init_secure.cc +17 -14
- data/src/core/lib/surface/lame_client.cc +18 -11
- data/src/core/lib/surface/lame_client.h +1 -1
- data/src/core/lib/surface/server.cc +25 -17
- data/src/core/lib/surface/server.h +17 -10
- data/src/core/lib/surface/validate_metadata.cc +5 -2
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/bdp_estimator.cc +1 -1
- data/src/core/lib/transport/error_utils.cc +42 -17
- data/src/core/lib/transport/error_utils.h +1 -1
- data/src/core/lib/transport/metadata.cc +31 -10
- data/src/core/lib/transport/metadata.h +2 -1
- data/src/core/lib/transport/metadata_batch.cc +35 -371
- data/src/core/lib/transport/metadata_batch.h +905 -71
- data/src/core/lib/transport/parsed_metadata.h +263 -0
- data/src/core/lib/transport/pid_controller.cc +4 -4
- data/src/core/lib/transport/static_metadata.cc +714 -846
- data/src/core/lib/transport/static_metadata.h +115 -379
- data/src/core/lib/transport/status_metadata.cc +1 -0
- data/src/core/lib/transport/transport.cc +4 -5
- data/src/core/lib/transport/transport_op_string.cc +40 -20
- data/src/core/plugin_registry/grpc_plugin_registry.cc +64 -43
- data/src/core/tsi/alts/crypt/aes_gcm.cc +3 -1
- data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +13 -12
- data/src/core/tsi/alts/frame_protector/frame_handler.cc +10 -11
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -2
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +12 -2
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +2 -2
- data/src/core/tsi/fake_transport_security.cc +15 -7
- data/src/core/tsi/local_transport_security.cc +36 -73
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +16 -50
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -3
- data/src/core/tsi/ssl_transport_security.cc +10 -2
- data/src/core/tsi/transport_security.cc +12 -0
- data/src/core/tsi/transport_security.h +16 -1
- data/src/core/tsi/transport_security_interface.h +26 -0
- data/src/ruby/ext/grpc/extconf.rb +12 -9
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -2
- data/src/ruby/spec/client_server_spec.rb +1 -1
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +4 -4
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +11 -6
- data/third_party/address_sorting/address_sorting_posix.c +1 -0
- data/third_party/boringssl-with-bazel/err_data.c +278 -272
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +21 -22
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +15 -22
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +13 -7
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c +19 -29
- data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/a_strex.c +268 -271
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +106 -153
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +0 -39
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/charmap.h +0 -0
- data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +38 -0
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +8 -8
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +289 -198
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +8 -8
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +9 -13
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +11 -8
- data/third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c +1 -7
- data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +1 -5
- data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +0 -4
- data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +1 -7
- data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +1 -6
- data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +3 -17
- data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +4 -6
- data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c +9 -0
- data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +8 -0
- data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +38 -47
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c +45 -65
- data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +32 -34
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +21 -3
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.c +3 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +5 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c +5 -9
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +10 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/des.c +10 -11
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/internal.h +1 -3
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +4 -7
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +4 -7
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +24 -9
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +4 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +35 -35
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +11 -10
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +10 -37
- data/third_party/boringssl-with-bazel/src/crypto/internal.h +39 -0
- data/third_party/boringssl-with-bazel/src/crypto/mem.c +12 -9
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c +0 -9
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +0 -8
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c +0 -4
- data/third_party/boringssl-with-bazel/src/crypto/pkcs7/internal.h +16 -7
- data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +9 -4
- data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +151 -12
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +6 -6
- data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +2 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +181 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +246 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +11 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +0 -179
- data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c +4 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +0 -5
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +11 -50
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +2 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +0 -16
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +22 -18
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +11 -8
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +16 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +4 -3
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +24 -5
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +17 -8
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +6 -6
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c +112 -55
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c +2 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +71 -26
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +366 -227
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +2 -9
- data/third_party/boringssl-with-bazel/src/include/openssl/base.h +10 -4
- data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +3 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +3 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +9 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +8 -2
- data/third_party/boringssl-with-bazel/src/include/openssl/hkdf.h +4 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +9 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +0 -20
- data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +12 -5
- data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +5 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/span.h +37 -15
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +28 -14
- data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +31 -32
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +529 -91
- data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +16 -695
- data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +48 -8
- data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +266 -357
- data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +90 -152
- data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +15 -13
- data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +75 -79
- data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +96 -97
- data/third_party/boringssl-with-bazel/src/ssl/internal.h +63 -43
- data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +2 -2
- data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +2 -2
- data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +6 -12
- data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +14 -17
- data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +14 -27
- data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +203 -203
- data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +30 -41
- data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +47 -33
- data/third_party/re2/re2/compile.cc +91 -109
- data/third_party/re2/re2/dfa.cc +27 -39
- data/third_party/re2/re2/filtered_re2.cc +18 -2
- data/third_party/re2/re2/filtered_re2.h +10 -5
- data/third_party/re2/re2/nfa.cc +1 -1
- data/third_party/re2/re2/parse.cc +42 -23
- data/third_party/re2/re2/perl_groups.cc +34 -34
- data/third_party/re2/re2/prefilter.cc +3 -2
- data/third_party/re2/re2/prog.cc +182 -4
- data/third_party/re2/re2/prog.h +28 -9
- data/third_party/re2/re2/re2.cc +87 -118
- data/third_party/re2/re2/re2.h +156 -141
- data/third_party/re2/re2/regexp.cc +12 -5
- data/third_party/re2/re2/regexp.h +8 -2
- data/third_party/re2/re2/set.cc +31 -9
- data/third_party/re2/re2/set.h +9 -4
- data/third_party/re2/re2/simplify.cc +11 -3
- data/third_party/re2/re2/tostring.cc +1 -1
- data/third_party/re2/re2/walker-inl.h +1 -1
- data/third_party/re2/util/mutex.h +2 -2
- data/third_party/re2/util/pcre.h +3 -3
- metadata +83 -70
- data/include/grpc/event_engine/slice_allocator.h +0 -71
- data/src/core/ext/filters/client_channel/service_config_call_data.h +0 -126
- data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +0 -211
- data/src/core/ext/filters/workarounds/workaround_utils.cc +0 -53
- data/src/core/ext/filters/workarounds/workaround_utils.h +0 -39
- data/src/core/ext/transport/chttp2/client/authority.cc +0 -42
- data/src/core/ext/transport/chttp2/client/authority.h +0 -36
- data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc +0 -67
- data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h +0 -74
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +0 -66
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +0 -58
- data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +0 -58
- data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +0 -130
- data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +0 -83
- data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +0 -44
- data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +0 -35
- data/src/core/lib/iomgr/udp_server.cc +0 -747
- data/src/core/lib/iomgr/udp_server.h +0 -103
- data/src/core/lib/transport/authority_override.cc +0 -40
- data/src/core/lib/transport/authority_override.h +0 -37
@@ -54,23 +54,27 @@
|
|
54
54
|
* copied and put under another distribution licence
|
55
55
|
* [including the GNU Public Licence.] */
|
56
56
|
|
57
|
-
#include <openssl/
|
57
|
+
#include <openssl/asn1.h>
|
58
58
|
|
59
|
+
#include <ctype.h>
|
59
60
|
#include <inttypes.h>
|
60
61
|
#include <string.h>
|
61
62
|
|
62
|
-
#include <openssl/
|
63
|
+
#include <openssl/bio.h>
|
63
64
|
#include <openssl/mem.h>
|
64
|
-
#include <openssl/obj.h>
|
65
65
|
|
66
66
|
#include "charmap.h"
|
67
|
-
#include "
|
67
|
+
#include "internal.h"
|
68
68
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
69
|
+
|
70
|
+
// These flags must be distinct from |ESC_FLAGS| and fit in a byte.
|
71
|
+
|
72
|
+
// Character is a valid PrintableString character
|
73
|
+
#define CHARTYPE_PRINTABLESTRING 0x10
|
74
|
+
// Character needs escaping if it is the first character
|
75
|
+
#define CHARTYPE_FIRST_ESC_2253 0x20
|
76
|
+
// Character needs escaping if it is the last character
|
77
|
+
#define CHARTYPE_LAST_ESC_2253 0x40
|
74
78
|
|
75
79
|
#define CHARTYPE_BS_ESC (ASN1_STRFLGS_ESC_2253 | CHARTYPE_FIRST_ESC_2253 | CHARTYPE_LAST_ESC_2253)
|
76
80
|
|
@@ -79,26 +83,12 @@
|
|
79
83
|
ASN1_STRFLGS_ESC_CTRL | \
|
80
84
|
ASN1_STRFLGS_ESC_MSB)
|
81
85
|
|
82
|
-
static int
|
86
|
+
static int maybe_write(BIO *out, const void *buf, int len)
|
83
87
|
{
|
84
|
-
|
85
|
-
|
86
|
-
if (BIO_write(arg, buf, len) != len)
|
87
|
-
return 0;
|
88
|
-
return 1;
|
88
|
+
/* If |out| is NULL, ignore the output but report the length. */
|
89
|
+
return out == NULL || BIO_write(out, buf, len) == len;
|
89
90
|
}
|
90
91
|
|
91
|
-
static int send_fp_chars(void *arg, const void *buf, int len)
|
92
|
-
{
|
93
|
-
if (!arg)
|
94
|
-
return 1;
|
95
|
-
if (fwrite(buf, 1, len, arg) != (unsigned int)len)
|
96
|
-
return 0;
|
97
|
-
return 1;
|
98
|
-
}
|
99
|
-
|
100
|
-
typedef int char_io (void *arg, const void *buf, int len);
|
101
|
-
|
102
92
|
/*
|
103
93
|
* This function handles display of strings, one character at a time. It is
|
104
94
|
* passed an unsigned long for each character because it could come from 2 or
|
@@ -108,20 +98,20 @@ typedef int char_io (void *arg, const void *buf, int len);
|
|
108
98
|
#define HEX_SIZE(type) (sizeof(type)*2)
|
109
99
|
|
110
100
|
static int do_esc_char(uint32_t c, unsigned char flags, char *do_quotes,
|
111
|
-
|
101
|
+
BIO *out)
|
112
102
|
{
|
113
103
|
unsigned char chflgs, chtmp;
|
114
104
|
char tmphex[HEX_SIZE(uint32_t) + 3];
|
115
105
|
|
116
106
|
if (c > 0xffff) {
|
117
107
|
BIO_snprintf(tmphex, sizeof tmphex, "\\W%08" PRIX32, c);
|
118
|
-
if (!
|
108
|
+
if (!maybe_write(out, tmphex, 10))
|
119
109
|
return -1;
|
120
110
|
return 10;
|
121
111
|
}
|
122
112
|
if (c > 0xff) {
|
123
113
|
BIO_snprintf(tmphex, sizeof tmphex, "\\U%04" PRIX32, c);
|
124
|
-
if (!
|
114
|
+
if (!maybe_write(out, tmphex, 6))
|
125
115
|
return -1;
|
126
116
|
return 6;
|
127
117
|
}
|
@@ -135,19 +125,19 @@ static int do_esc_char(uint32_t c, unsigned char flags, char *do_quotes,
|
|
135
125
|
if (chflgs & ASN1_STRFLGS_ESC_QUOTE) {
|
136
126
|
if (do_quotes)
|
137
127
|
*do_quotes = 1;
|
138
|
-
if (!
|
128
|
+
if (!maybe_write(out, &chtmp, 1))
|
139
129
|
return -1;
|
140
130
|
return 1;
|
141
131
|
}
|
142
|
-
if (!
|
132
|
+
if (!maybe_write(out, "\\", 1))
|
143
133
|
return -1;
|
144
|
-
if (!
|
134
|
+
if (!maybe_write(out, &chtmp, 1))
|
145
135
|
return -1;
|
146
136
|
return 2;
|
147
137
|
}
|
148
138
|
if (chflgs & (ASN1_STRFLGS_ESC_CTRL | ASN1_STRFLGS_ESC_MSB)) {
|
149
139
|
BIO_snprintf(tmphex, 11, "\\%02X", chtmp);
|
150
|
-
if (!
|
140
|
+
if (!maybe_write(out, tmphex, 3))
|
151
141
|
return -1;
|
152
142
|
return 3;
|
153
143
|
}
|
@@ -156,11 +146,11 @@ static int do_esc_char(uint32_t c, unsigned char flags, char *do_quotes,
|
|
156
146
|
* character itself: backslash.
|
157
147
|
*/
|
158
148
|
if (chtmp == '\\' && flags & ESC_FLAGS) {
|
159
|
-
if (!
|
149
|
+
if (!maybe_write(out, "\\\\", 2))
|
160
150
|
return -1;
|
161
151
|
return 2;
|
162
152
|
}
|
163
|
-
if (!
|
153
|
+
if (!maybe_write(out, &chtmp, 1))
|
164
154
|
return -1;
|
165
155
|
return 1;
|
166
156
|
}
|
@@ -175,8 +165,7 @@ static int do_esc_char(uint32_t c, unsigned char flags, char *do_quotes,
|
|
175
165
|
*/
|
176
166
|
|
177
167
|
static int do_buf(unsigned char *buf, int buflen,
|
178
|
-
int type, unsigned char flags, char *quotes,
|
179
|
-
void *arg)
|
168
|
+
int type, unsigned char flags, char *quotes, BIO *out)
|
180
169
|
{
|
181
170
|
int i, outlen, len, charwidth;
|
182
171
|
unsigned char orflags, *p, *q;
|
@@ -208,6 +197,8 @@ static int do_buf(unsigned char *buf, int buflen,
|
|
208
197
|
orflags = CHARTYPE_FIRST_ESC_2253;
|
209
198
|
else
|
210
199
|
orflags = 0;
|
200
|
+
/* TODO(davidben): Replace this with |cbs_get_ucs2_be|, etc., to check
|
201
|
+
* for invalid codepoints. */
|
211
202
|
switch (charwidth) {
|
212
203
|
case 4:
|
213
204
|
c = ((uint32_t)*p++) << 24;
|
@@ -248,17 +239,14 @@ static int do_buf(unsigned char *buf, int buflen,
|
|
248
239
|
* otherwise each character will be > 0x7f and so the
|
249
240
|
* character will never be escaped on first and last.
|
250
241
|
*/
|
251
|
-
len =
|
252
|
-
|
253
|
-
quotes, io_ch, arg);
|
242
|
+
len = do_esc_char(utfbuf[i], (unsigned char)(flags | orflags),
|
243
|
+
quotes, out);
|
254
244
|
if (len < 0)
|
255
245
|
return -1;
|
256
246
|
outlen += len;
|
257
247
|
}
|
258
248
|
} else {
|
259
|
-
len =
|
260
|
-
do_esc_char(c, (unsigned char)(flags | orflags), quotes,
|
261
|
-
io_ch, arg);
|
249
|
+
len = do_esc_char(c, (unsigned char)(flags | orflags), quotes, out);
|
262
250
|
if (len < 0)
|
263
251
|
return -1;
|
264
252
|
outlen += len;
|
@@ -269,19 +257,18 @@ static int do_buf(unsigned char *buf, int buflen,
|
|
269
257
|
|
270
258
|
/* This function hex dumps a buffer of characters */
|
271
259
|
|
272
|
-
static int do_hex_dump(
|
273
|
-
int buflen)
|
260
|
+
static int do_hex_dump(BIO *out, unsigned char *buf, int buflen)
|
274
261
|
{
|
275
262
|
static const char hexdig[] = "0123456789ABCDEF";
|
276
263
|
unsigned char *p, *q;
|
277
264
|
char hextmp[2];
|
278
|
-
if (
|
265
|
+
if (out) {
|
279
266
|
p = buf;
|
280
267
|
q = buf + buflen;
|
281
268
|
while (p != q) {
|
282
269
|
hextmp[0] = hexdig[*p >> 4];
|
283
270
|
hextmp[1] = hexdig[*p & 0xf];
|
284
|
-
if (!
|
271
|
+
if (!maybe_write(out, hextmp, 2))
|
285
272
|
return -1;
|
286
273
|
p++;
|
287
274
|
}
|
@@ -292,41 +279,55 @@ static int do_hex_dump(char_io *io_ch, void *arg, unsigned char *buf,
|
|
292
279
|
/*
|
293
280
|
* "dump" a string. This is done when the type is unknown, or the flags
|
294
281
|
* request it. We can either dump the content octets or the entire DER
|
295
|
-
* encoding. This uses the
|
282
|
+
* encoding. This uses the RFC 2253 #01234 format.
|
296
283
|
*/
|
297
284
|
|
298
|
-
static int do_dump(unsigned long lflags,
|
299
|
-
const ASN1_STRING *str)
|
285
|
+
static int do_dump(unsigned long lflags, BIO *out, const ASN1_STRING *str)
|
300
286
|
{
|
301
|
-
|
302
|
-
* Placing the ASN1_STRING in a temp ASN1_TYPE allows the DER encoding to
|
303
|
-
* readily obtained
|
304
|
-
*/
|
305
|
-
ASN1_TYPE t;
|
306
|
-
unsigned char *der_buf, *p;
|
307
|
-
int outlen, der_len;
|
308
|
-
|
309
|
-
if (!io_ch(arg, "#", 1))
|
287
|
+
if (!maybe_write(out, "#", 1)) {
|
310
288
|
return -1;
|
289
|
+
}
|
290
|
+
|
311
291
|
/* If we don't dump DER encoding just dump content octets */
|
312
292
|
if (!(lflags & ASN1_STRFLGS_DUMP_DER)) {
|
313
|
-
outlen = do_hex_dump(
|
314
|
-
if (outlen < 0)
|
293
|
+
int outlen = do_hex_dump(out, str->data, str->length);
|
294
|
+
if (outlen < 0) {
|
315
295
|
return -1;
|
296
|
+
}
|
316
297
|
return outlen + 1;
|
317
298
|
}
|
299
|
+
|
300
|
+
/*
|
301
|
+
* Placing the ASN1_STRING in a temporary ASN1_TYPE allows the DER encoding
|
302
|
+
* to readily obtained.
|
303
|
+
*/
|
304
|
+
ASN1_TYPE t;
|
318
305
|
t.type = str->type;
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
306
|
+
/* Negative INTEGER and ENUMERATED values are the only case where
|
307
|
+
* |ASN1_STRING| and |ASN1_TYPE| types do not match.
|
308
|
+
*
|
309
|
+
* TODO(davidben): There are also some type fields which, in |ASN1_TYPE|, do
|
310
|
+
* not correspond to |ASN1_STRING|. It is unclear whether those are allowed
|
311
|
+
* in |ASN1_STRING| at all, or what the space of allowed types is.
|
312
|
+
* |ASN1_item_ex_d2i| will never produce such a value so, for now, we say
|
313
|
+
* this is an invalid input. But this corner of the library in general
|
314
|
+
* should be more robust. */
|
315
|
+
if (t.type == V_ASN1_NEG_INTEGER) {
|
316
|
+
t.type = V_ASN1_INTEGER;
|
317
|
+
} else if (t.type == V_ASN1_NEG_ENUMERATED) {
|
318
|
+
t.type = V_ASN1_ENUMERATED;
|
319
|
+
}
|
320
|
+
t.value.asn1_string = (ASN1_STRING *)str;
|
321
|
+
unsigned char *der_buf = NULL;
|
322
|
+
int der_len = i2d_ASN1_TYPE(&t, &der_buf);
|
323
|
+
if (der_len < 0) {
|
323
324
|
return -1;
|
324
|
-
|
325
|
-
|
326
|
-
outlen = do_hex_dump(io_ch, arg, der_buf, der_len);
|
325
|
+
}
|
326
|
+
int outlen = do_hex_dump(out, der_buf, der_len);
|
327
327
|
OPENSSL_free(der_buf);
|
328
|
-
if (outlen < 0)
|
328
|
+
if (outlen < 0) {
|
329
329
|
return -1;
|
330
|
+
}
|
330
331
|
return outlen + 1;
|
331
332
|
}
|
332
333
|
|
@@ -353,8 +354,7 @@ static const signed char tag2nbyte[] = {
|
|
353
354
|
* an error occurred.
|
354
355
|
*/
|
355
356
|
|
356
|
-
|
357
|
-
const ASN1_STRING *str)
|
357
|
+
int ASN1_STRING_print_ex(BIO *out, const ASN1_STRING *str, unsigned long lflags)
|
358
358
|
{
|
359
359
|
int outlen, len;
|
360
360
|
int type;
|
@@ -372,7 +372,7 @@ static int do_print_ex(char_io *io_ch, void *arg, unsigned long lflags,
|
|
372
372
|
const char *tagname;
|
373
373
|
tagname = ASN1_tag2str(type);
|
374
374
|
outlen += strlen(tagname);
|
375
|
-
if (!
|
375
|
+
if (!maybe_write(out, tagname, outlen) || !maybe_write(out, ":", 1))
|
376
376
|
return -1;
|
377
377
|
outlen++;
|
378
378
|
}
|
@@ -396,7 +396,7 @@ static int do_print_ex(char_io *io_ch, void *arg, unsigned long lflags,
|
|
396
396
|
}
|
397
397
|
|
398
398
|
if (type == -1) {
|
399
|
-
len = do_dump(lflags,
|
399
|
+
len = do_dump(lflags, out, str);
|
400
400
|
if (len < 0)
|
401
401
|
return -1;
|
402
402
|
outlen += len;
|
@@ -415,217 +415,39 @@ static int do_print_ex(char_io *io_ch, void *arg, unsigned long lflags,
|
|
415
415
|
type |= BUF_TYPE_CONVUTF8;
|
416
416
|
}
|
417
417
|
|
418
|
-
len = do_buf(str->data, str->length, type, flags, "es,
|
418
|
+
len = do_buf(str->data, str->length, type, flags, "es, NULL);
|
419
419
|
if (len < 0)
|
420
420
|
return -1;
|
421
421
|
outlen += len;
|
422
422
|
if (quotes)
|
423
423
|
outlen += 2;
|
424
|
-
if (!
|
424
|
+
if (!out)
|
425
425
|
return outlen;
|
426
|
-
if (quotes && !
|
426
|
+
if (quotes && !maybe_write(out, "\"", 1))
|
427
427
|
return -1;
|
428
|
-
if (do_buf(str->data, str->length, type, flags, NULL,
|
428
|
+
if (do_buf(str->data, str->length, type, flags, NULL, out) < 0)
|
429
429
|
return -1;
|
430
|
-
if (quotes && !
|
430
|
+
if (quotes && !maybe_write(out, "\"", 1))
|
431
431
|
return -1;
|
432
432
|
return outlen;
|
433
433
|
}
|
434
434
|
|
435
|
-
|
436
|
-
|
437
|
-
static int do_indent(char_io *io_ch, void *arg, int indent)
|
438
|
-
{
|
439
|
-
int i;
|
440
|
-
for (i = 0; i < indent; i++)
|
441
|
-
if (!io_ch(arg, " ", 1))
|
442
|
-
return 0;
|
443
|
-
return 1;
|
444
|
-
}
|
445
|
-
|
446
|
-
#define FN_WIDTH_LN 25
|
447
|
-
#define FN_WIDTH_SN 10
|
448
|
-
|
449
|
-
static int do_name_ex(char_io *io_ch, void *arg, const X509_NAME *n,
|
450
|
-
int indent, unsigned long flags)
|
435
|
+
int ASN1_STRING_print_ex_fp(FILE *fp, const ASN1_STRING *str,
|
436
|
+
unsigned long flags)
|
451
437
|
{
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
const char *objbuf;
|
459
|
-
int outlen, len;
|
460
|
-
const char *sep_dn, *sep_mv, *sep_eq;
|
461
|
-
int sep_dn_len, sep_mv_len, sep_eq_len;
|
462
|
-
if (indent < 0)
|
463
|
-
indent = 0;
|
464
|
-
outlen = indent;
|
465
|
-
if (!do_indent(io_ch, arg, indent))
|
466
|
-
return -1;
|
467
|
-
switch (flags & XN_FLAG_SEP_MASK) {
|
468
|
-
case XN_FLAG_SEP_MULTILINE:
|
469
|
-
sep_dn = "\n";
|
470
|
-
sep_dn_len = 1;
|
471
|
-
sep_mv = " + ";
|
472
|
-
sep_mv_len = 3;
|
473
|
-
break;
|
474
|
-
|
475
|
-
case XN_FLAG_SEP_COMMA_PLUS:
|
476
|
-
sep_dn = ",";
|
477
|
-
sep_dn_len = 1;
|
478
|
-
sep_mv = "+";
|
479
|
-
sep_mv_len = 1;
|
480
|
-
indent = 0;
|
481
|
-
break;
|
482
|
-
|
483
|
-
case XN_FLAG_SEP_CPLUS_SPC:
|
484
|
-
sep_dn = ", ";
|
485
|
-
sep_dn_len = 2;
|
486
|
-
sep_mv = " + ";
|
487
|
-
sep_mv_len = 3;
|
488
|
-
indent = 0;
|
489
|
-
break;
|
490
|
-
|
491
|
-
case XN_FLAG_SEP_SPLUS_SPC:
|
492
|
-
sep_dn = "; ";
|
493
|
-
sep_dn_len = 2;
|
494
|
-
sep_mv = " + ";
|
495
|
-
sep_mv_len = 3;
|
496
|
-
indent = 0;
|
497
|
-
break;
|
498
|
-
|
499
|
-
default:
|
500
|
-
return -1;
|
501
|
-
}
|
502
|
-
|
503
|
-
if (flags & XN_FLAG_SPC_EQ) {
|
504
|
-
sep_eq = " = ";
|
505
|
-
sep_eq_len = 3;
|
506
|
-
} else {
|
507
|
-
sep_eq = "=";
|
508
|
-
sep_eq_len = 1;
|
509
|
-
}
|
510
|
-
|
511
|
-
fn_opt = flags & XN_FLAG_FN_MASK;
|
512
|
-
|
513
|
-
cnt = X509_NAME_entry_count(n);
|
514
|
-
for (i = 0; i < cnt; i++) {
|
515
|
-
if (flags & XN_FLAG_DN_REV)
|
516
|
-
ent = X509_NAME_get_entry(n, cnt - i - 1);
|
517
|
-
else
|
518
|
-
ent = X509_NAME_get_entry(n, i);
|
519
|
-
if (prev != -1) {
|
520
|
-
if (prev == ent->set) {
|
521
|
-
if (!io_ch(arg, sep_mv, sep_mv_len))
|
522
|
-
return -1;
|
523
|
-
outlen += sep_mv_len;
|
524
|
-
} else {
|
525
|
-
if (!io_ch(arg, sep_dn, sep_dn_len))
|
526
|
-
return -1;
|
527
|
-
outlen += sep_dn_len;
|
528
|
-
if (!do_indent(io_ch, arg, indent))
|
529
|
-
return -1;
|
530
|
-
outlen += indent;
|
531
|
-
}
|
532
|
-
}
|
533
|
-
prev = ent->set;
|
534
|
-
fn = X509_NAME_ENTRY_get_object(ent);
|
535
|
-
val = X509_NAME_ENTRY_get_data(ent);
|
536
|
-
fn_nid = OBJ_obj2nid(fn);
|
537
|
-
if (fn_opt != XN_FLAG_FN_NONE) {
|
538
|
-
int objlen, fld_len;
|
539
|
-
if ((fn_opt == XN_FLAG_FN_OID) || (fn_nid == NID_undef)) {
|
540
|
-
OBJ_obj2txt(objtmp, sizeof objtmp, fn, 1);
|
541
|
-
fld_len = 0; /* XXX: what should this be? */
|
542
|
-
objbuf = objtmp;
|
543
|
-
} else {
|
544
|
-
if (fn_opt == XN_FLAG_FN_SN) {
|
545
|
-
fld_len = FN_WIDTH_SN;
|
546
|
-
objbuf = OBJ_nid2sn(fn_nid);
|
547
|
-
} else if (fn_opt == XN_FLAG_FN_LN) {
|
548
|
-
fld_len = FN_WIDTH_LN;
|
549
|
-
objbuf = OBJ_nid2ln(fn_nid);
|
550
|
-
} else {
|
551
|
-
fld_len = 0; /* XXX: what should this be? */
|
552
|
-
objbuf = "";
|
553
|
-
}
|
554
|
-
}
|
555
|
-
objlen = strlen(objbuf);
|
556
|
-
if (!io_ch(arg, objbuf, objlen))
|
557
|
-
return -1;
|
558
|
-
if ((objlen < fld_len) && (flags & XN_FLAG_FN_ALIGN)) {
|
559
|
-
if (!do_indent(io_ch, arg, fld_len - objlen))
|
560
|
-
return -1;
|
561
|
-
outlen += fld_len - objlen;
|
562
|
-
}
|
563
|
-
if (!io_ch(arg, sep_eq, sep_eq_len))
|
564
|
-
return -1;
|
565
|
-
outlen += objlen + sep_eq_len;
|
566
|
-
}
|
567
|
-
/*
|
568
|
-
* If the field name is unknown then fix up the DER dump flag. We
|
569
|
-
* might want to limit this further so it will DER dump on anything
|
570
|
-
* other than a few 'standard' fields.
|
571
|
-
*/
|
572
|
-
if ((fn_nid == NID_undef) && (flags & XN_FLAG_DUMP_UNKNOWN_FIELDS))
|
573
|
-
orflags = ASN1_STRFLGS_DUMP_ALL;
|
574
|
-
else
|
575
|
-
orflags = 0;
|
576
|
-
|
577
|
-
len = do_print_ex(io_ch, arg, flags | orflags, val);
|
578
|
-
if (len < 0)
|
438
|
+
BIO *bio = NULL;
|
439
|
+
if (fp != NULL) {
|
440
|
+
/* If |fp| is NULL, this function returns the number of bytes without
|
441
|
+
* writing. */
|
442
|
+
bio = BIO_new_fp(fp, BIO_NOCLOSE);
|
443
|
+
if (bio == NULL) {
|
579
444
|
return -1;
|
580
|
-
|
581
|
-
}
|
582
|
-
return outlen;
|
583
|
-
}
|
584
|
-
|
585
|
-
/* Wrappers round the main functions */
|
586
|
-
|
587
|
-
int X509_NAME_print_ex(BIO *out, const X509_NAME *nm, int indent,
|
588
|
-
unsigned long flags)
|
589
|
-
{
|
590
|
-
if (flags == XN_FLAG_COMPAT)
|
591
|
-
return X509_NAME_print(out, nm, indent);
|
592
|
-
return do_name_ex(send_bio_chars, out, nm, indent, flags);
|
593
|
-
}
|
594
|
-
|
595
|
-
#ifndef OPENSSL_NO_FP_API
|
596
|
-
int X509_NAME_print_ex_fp(FILE *fp, const X509_NAME *nm, int indent,
|
597
|
-
unsigned long flags)
|
598
|
-
{
|
599
|
-
if (flags == XN_FLAG_COMPAT) {
|
600
|
-
BIO *btmp;
|
601
|
-
int ret;
|
602
|
-
btmp = BIO_new_fp(fp, BIO_NOCLOSE);
|
603
|
-
if (!btmp)
|
604
|
-
return -1;
|
605
|
-
ret = X509_NAME_print(btmp, nm, indent);
|
606
|
-
BIO_free(btmp);
|
607
|
-
return ret;
|
445
|
+
}
|
608
446
|
}
|
609
|
-
|
610
|
-
|
611
|
-
|
612
|
-
|
613
|
-
int ASN1_STRING_print_ex(BIO *out, const ASN1_STRING *str, unsigned long flags)
|
614
|
-
{
|
615
|
-
return do_print_ex(send_bio_chars, out, flags, str);
|
616
|
-
}
|
617
|
-
|
618
|
-
#ifndef OPENSSL_NO_FP_API
|
619
|
-
int ASN1_STRING_print_ex_fp(FILE *fp, const ASN1_STRING *str, unsigned long flags)
|
620
|
-
{
|
621
|
-
return do_print_ex(send_fp_chars, fp, flags, str);
|
447
|
+
int ret = ASN1_STRING_print_ex(bio, str, flags);
|
448
|
+
BIO_free(bio);
|
449
|
+
return ret;
|
622
450
|
}
|
623
|
-
#endif
|
624
|
-
|
625
|
-
/*
|
626
|
-
* Utility function: convert any string type to UTF8, returns number of bytes
|
627
|
-
* in output string or a negative error code
|
628
|
-
*/
|
629
451
|
|
630
452
|
int ASN1_STRING_to_UTF8(unsigned char **out, const ASN1_STRING *in)
|
631
453
|
{
|
@@ -643,11 +465,186 @@ int ASN1_STRING_to_UTF8(unsigned char **out, const ASN1_STRING *in)
|
|
643
465
|
stmp.data = NULL;
|
644
466
|
stmp.length = 0;
|
645
467
|
stmp.flags = 0;
|
646
|
-
ret =
|
647
|
-
|
648
|
-
B_ASN1_UTF8STRING);
|
468
|
+
ret = ASN1_mbstring_copy(&str, in->data, in->length, mbflag,
|
469
|
+
B_ASN1_UTF8STRING);
|
649
470
|
if (ret < 0)
|
650
471
|
return ret;
|
651
472
|
*out = stmp.data;
|
652
473
|
return stmp.length;
|
653
474
|
}
|
475
|
+
|
476
|
+
int ASN1_STRING_print(BIO *bp, const ASN1_STRING *v)
|
477
|
+
{
|
478
|
+
int i, n;
|
479
|
+
char buf[80];
|
480
|
+
const char *p;
|
481
|
+
|
482
|
+
if (v == NULL)
|
483
|
+
return (0);
|
484
|
+
n = 0;
|
485
|
+
p = (const char *)v->data;
|
486
|
+
for (i = 0; i < v->length; i++) {
|
487
|
+
if ((p[i] > '~') || ((p[i] < ' ') &&
|
488
|
+
(p[i] != '\n') && (p[i] != '\r')))
|
489
|
+
buf[n] = '.';
|
490
|
+
else
|
491
|
+
buf[n] = p[i];
|
492
|
+
n++;
|
493
|
+
if (n >= 80) {
|
494
|
+
if (BIO_write(bp, buf, n) <= 0)
|
495
|
+
return (0);
|
496
|
+
n = 0;
|
497
|
+
}
|
498
|
+
}
|
499
|
+
if (n > 0)
|
500
|
+
if (BIO_write(bp, buf, n) <= 0)
|
501
|
+
return (0);
|
502
|
+
return (1);
|
503
|
+
}
|
504
|
+
|
505
|
+
int ASN1_TIME_print(BIO *bp, const ASN1_TIME *tm)
|
506
|
+
{
|
507
|
+
if (tm->type == V_ASN1_UTCTIME)
|
508
|
+
return ASN1_UTCTIME_print(bp, tm);
|
509
|
+
if (tm->type == V_ASN1_GENERALIZEDTIME)
|
510
|
+
return ASN1_GENERALIZEDTIME_print(bp, tm);
|
511
|
+
BIO_write(bp, "Bad time value", 14);
|
512
|
+
return (0);
|
513
|
+
}
|
514
|
+
|
515
|
+
static const char *const mon[12] = {
|
516
|
+
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
517
|
+
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
|
518
|
+
};
|
519
|
+
|
520
|
+
int ASN1_GENERALIZEDTIME_print(BIO *bp, const ASN1_GENERALIZEDTIME *tm)
|
521
|
+
{
|
522
|
+
char *v;
|
523
|
+
int gmt = 0;
|
524
|
+
int i;
|
525
|
+
int y = 0, M = 0, d = 0, h = 0, m = 0, s = 0;
|
526
|
+
char *f = NULL;
|
527
|
+
int f_len = 0;
|
528
|
+
|
529
|
+
i = tm->length;
|
530
|
+
v = (char *)tm->data;
|
531
|
+
|
532
|
+
if (i < 12)
|
533
|
+
goto err;
|
534
|
+
if (v[i - 1] == 'Z')
|
535
|
+
gmt = 1;
|
536
|
+
for (i = 0; i < 12; i++)
|
537
|
+
if ((v[i] > '9') || (v[i] < '0'))
|
538
|
+
goto err;
|
539
|
+
y = (v[0] - '0') * 1000 + (v[1] - '0') * 100 + (v[2] - '0') * 10 + (v[3] -
|
540
|
+
'0');
|
541
|
+
M = (v[4] - '0') * 10 + (v[5] - '0');
|
542
|
+
if ((M > 12) || (M < 1))
|
543
|
+
goto err;
|
544
|
+
d = (v[6] - '0') * 10 + (v[7] - '0');
|
545
|
+
h = (v[8] - '0') * 10 + (v[9] - '0');
|
546
|
+
m = (v[10] - '0') * 10 + (v[11] - '0');
|
547
|
+
if (tm->length >= 14 &&
|
548
|
+
(v[12] >= '0') && (v[12] <= '9') &&
|
549
|
+
(v[13] >= '0') && (v[13] <= '9')) {
|
550
|
+
s = (v[12] - '0') * 10 + (v[13] - '0');
|
551
|
+
/* Check for fractions of seconds. */
|
552
|
+
if (tm->length >= 15 && v[14] == '.') {
|
553
|
+
int l = tm->length;
|
554
|
+
f = &v[14]; /* The decimal point. */
|
555
|
+
f_len = 1;
|
556
|
+
while (14 + f_len < l && f[f_len] >= '0' && f[f_len] <= '9')
|
557
|
+
++f_len;
|
558
|
+
}
|
559
|
+
}
|
560
|
+
|
561
|
+
if (BIO_printf(bp, "%s %2d %02d:%02d:%02d%.*s %d%s",
|
562
|
+
mon[M - 1], d, h, m, s, f_len, f, y,
|
563
|
+
(gmt) ? " GMT" : "") <= 0)
|
564
|
+
return (0);
|
565
|
+
else
|
566
|
+
return (1);
|
567
|
+
err:
|
568
|
+
BIO_write(bp, "Bad time value", 14);
|
569
|
+
return (0);
|
570
|
+
}
|
571
|
+
|
572
|
+
// consume_two_digits is a helper function for ASN1_UTCTIME_print. If |*v|,
|
573
|
+
// assumed to be |*len| bytes long, has two leading digits, updates |*out| with
|
574
|
+
// their value, updates |v| and |len|, and returns one. Otherwise, returns
|
575
|
+
// zero.
|
576
|
+
static int consume_two_digits(int* out, const char **v, int *len) {
|
577
|
+
if (*len < 2|| !isdigit((*v)[0]) || !isdigit((*v)[1])) {
|
578
|
+
return 0;
|
579
|
+
}
|
580
|
+
*out = ((*v)[0] - '0') * 10 + ((*v)[1] - '0');
|
581
|
+
*len -= 2;
|
582
|
+
*v += 2;
|
583
|
+
return 1;
|
584
|
+
}
|
585
|
+
|
586
|
+
// consume_zulu_timezone is a helper function for ASN1_UTCTIME_print. If |*v|,
|
587
|
+
// assumed to be |*len| bytes long, starts with "Z" then it updates |*v| and
|
588
|
+
// |*len| and returns one. Otherwise returns zero.
|
589
|
+
static int consume_zulu_timezone(const char **v, int *len) {
|
590
|
+
if (*len == 0 || (*v)[0] != 'Z') {
|
591
|
+
return 0;
|
592
|
+
}
|
593
|
+
|
594
|
+
*len -= 1;
|
595
|
+
*v += 1;
|
596
|
+
return 1;
|
597
|
+
}
|
598
|
+
|
599
|
+
int ASN1_UTCTIME_print(BIO *bp, const ASN1_UTCTIME *tm) {
|
600
|
+
const char *v = (const char *)tm->data;
|
601
|
+
int len = tm->length;
|
602
|
+
int Y = 0, M = 0, D = 0, h = 0, m = 0, s = 0;
|
603
|
+
|
604
|
+
// YYMMDDhhmm are required to be present.
|
605
|
+
if (!consume_two_digits(&Y, &v, &len) ||
|
606
|
+
!consume_two_digits(&M, &v, &len) ||
|
607
|
+
!consume_two_digits(&D, &v, &len) ||
|
608
|
+
!consume_two_digits(&h, &v, &len) ||
|
609
|
+
!consume_two_digits(&m, &v, &len)) {
|
610
|
+
goto err;
|
611
|
+
}
|
612
|
+
// https://tools.ietf.org/html/rfc5280, section 4.1.2.5.1, requires seconds
|
613
|
+
// to be present, but historically this code has forgiven its absence.
|
614
|
+
consume_two_digits(&s, &v, &len);
|
615
|
+
|
616
|
+
// https://tools.ietf.org/html/rfc5280, section 4.1.2.5.1, specifies this
|
617
|
+
// interpretation of the year.
|
618
|
+
if (Y < 50) {
|
619
|
+
Y += 2000;
|
620
|
+
} else {
|
621
|
+
Y += 1900;
|
622
|
+
}
|
623
|
+
if (M > 12 || M == 0) {
|
624
|
+
goto err;
|
625
|
+
}
|
626
|
+
if (D > 31 || D == 0) {
|
627
|
+
goto err;
|
628
|
+
}
|
629
|
+
if (h > 23 || m > 59 || s > 60) {
|
630
|
+
goto err;
|
631
|
+
}
|
632
|
+
|
633
|
+
// https://tools.ietf.org/html/rfc5280, section 4.1.2.5.1, requires the "Z"
|
634
|
+
// to be present, but historically this code has forgiven its absence.
|
635
|
+
const int is_gmt = consume_zulu_timezone(&v, &len);
|
636
|
+
|
637
|
+
// https://tools.ietf.org/html/rfc5280, section 4.1.2.5.1, does not permit
|
638
|
+
// the specification of timezones using the +hhmm / -hhmm syntax, which is
|
639
|
+
// the only other thing that might legitimately be found at the end.
|
640
|
+
if (len) {
|
641
|
+
goto err;
|
642
|
+
}
|
643
|
+
|
644
|
+
return BIO_printf(bp, "%s %2d %02d:%02d:%02d %d%s", mon[M - 1], D, h, m, s, Y,
|
645
|
+
is_gmt ? " GMT" : "") > 0;
|
646
|
+
|
647
|
+
err:
|
648
|
+
BIO_write(bp, "Bad time value", 14);
|
649
|
+
return 0;
|
650
|
+
}
|