grpc 0.13.1 → 0.14.1.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 +2098 -828
- data/include/grpc/byte_buffer.h +1 -1
- data/include/grpc/byte_buffer_reader.h +1 -20
- data/include/grpc/census.h +4 -4
- data/include/grpc/compression.h +6 -5
- data/include/grpc/grpc.h +31 -20
- data/include/grpc/grpc_security.h +17 -31
- data/include/grpc/grpc_security_constants.h +114 -0
- data/include/grpc/grpc_zookeeper.h +1 -1
- data/include/grpc/impl/codegen/alloc.h +1 -1
- data/include/grpc/impl/codegen/atm.h +1 -1
- data/include/grpc/impl/codegen/atm_gcc_atomic.h +1 -1
- data/include/grpc/impl/codegen/atm_gcc_sync.h +1 -1
- data/include/grpc/impl/codegen/atm_win32.h +1 -1
- data/include/grpc/impl/codegen/byte_buffer.h +1 -1
- data/{src/core/client_config/lb_policies/round_robin.h → include/grpc/impl/codegen/byte_buffer_reader.h} +19 -8
- data/include/grpc/impl/codegen/grpc_types.h +20 -3
- data/include/grpc/impl/codegen/log.h +9 -2
- data/include/grpc/impl/codegen/port_platform.h +102 -17
- data/include/grpc/impl/codegen/propagation_bits.h +3 -3
- data/include/grpc/impl/codegen/slice.h +3 -3
- data/include/grpc/impl/codegen/slice_buffer.h +3 -3
- data/include/grpc/impl/codegen/status.h +1 -1
- data/include/grpc/impl/codegen/sync_generic.h +1 -1
- data/include/grpc/impl/codegen/sync_posix.h +1 -1
- data/include/grpc/impl/codegen/sync_win32.h +1 -1
- data/include/grpc/impl/codegen/time.h +3 -3
- data/include/grpc/status.h +1 -1
- data/include/grpc/support/alloc.h +1 -1
- data/include/grpc/support/atm.h +1 -1
- data/include/grpc/support/atm_gcc_atomic.h +4 -4
- data/include/grpc/support/atm_gcc_sync.h +1 -1
- data/include/grpc/support/atm_win32.h +1 -1
- data/include/grpc/support/avl.h +1 -1
- data/include/grpc/support/cmdline.h +1 -1
- data/include/grpc/support/cpu.h +1 -1
- data/include/grpc/support/histogram.h +1 -1
- data/include/grpc/support/host_port.h +1 -1
- data/include/grpc/support/log.h +1 -1
- data/include/grpc/support/log_win32.h +1 -1
- data/include/grpc/support/port_platform.h +1 -1
- data/include/grpc/support/slice.h +1 -1
- data/include/grpc/support/slice_buffer.h +1 -1
- data/include/grpc/support/string_util.h +3 -1
- data/include/grpc/support/subprocess.h +2 -2
- data/include/grpc/support/sync.h +1 -1
- data/include/grpc/support/sync_generic.h +1 -1
- data/include/grpc/support/sync_posix.h +1 -1
- data/include/grpc/support/sync_win32.h +1 -1
- data/include/grpc/support/thd.h +1 -1
- data/include/grpc/support/time.h +1 -1
- data/include/grpc/support/tls.h +1 -1
- data/include/grpc/support/tls_gcc.h +45 -1
- data/include/grpc/support/tls_msvc.h +3 -3
- data/include/grpc/support/tls_pthread.h +1 -1
- data/include/grpc/support/useful.h +1 -1
- data/src/boringssl/err_data.c +258 -252
- data/src/core/{census → ext/census}/aggregation.h +3 -3
- data/src/core/{statistics → ext/census}/census_interface.h +3 -3
- data/src/core/{statistics → ext/census}/census_rpc_stats.h +4 -4
- data/src/core/{census → ext/census}/context.c +2 -2
- data/src/core/{census → ext/census}/grpc_context.c +2 -2
- data/src/core/{census → ext/census}/grpc_filter.c +30 -16
- data/src/core/{census → ext/census}/grpc_filter.h +4 -4
- data/src/core/ext/census/grpc_plugin.c +82 -0
- data/src/core/{census → ext/census}/initialize.c +1 -1
- data/src/core/{census → ext/census}/mlog.c +2 -2
- data/src/core/{census → ext/census}/mlog.h +4 -4
- data/src/core/{census → ext/census}/operation.c +0 -0
- data/src/core/{census → ext/census}/placeholders.c +0 -0
- data/src/core/{census → ext/census}/rpc_metric_id.h +3 -3
- data/src/core/{census → ext/census}/tracing.c +0 -0
- data/src/core/{surface → ext/client_config}/channel_connectivity.c +8 -21
- data/src/core/{channel → ext/client_config}/client_channel.c +80 -35
- data/src/core/{channel → ext/client_config}/client_channel.h +5 -5
- data/src/core/{client_config/subchannel_factory.c → ext/client_config/client_channel_factory.c} +14 -6
- data/src/core/ext/client_config/client_channel_factory.h +85 -0
- data/src/core/{client_config → ext/client_config}/client_config.c +4 -2
- data/src/core/{client_config → ext/client_config}/client_config.h +4 -4
- data/src/core/ext/client_config/client_config_plugin.c +95 -0
- data/src/core/{client_config → ext/client_config}/connector.c +2 -2
- data/src/core/{client_config → ext/client_config}/connector.h +7 -10
- data/src/core/{client_config → ext/client_config}/default_initial_connect_string.c +1 -1
- data/src/core/{client_config → ext/client_config}/initial_connect_string.c +1 -1
- data/src/core/{client_config → ext/client_config}/initial_connect_string.h +4 -4
- data/src/core/{client_config → ext/client_config}/lb_policy.c +12 -3
- data/src/core/{client_config → ext/client_config}/lb_policy.h +19 -6
- data/src/core/{client_config → ext/client_config}/lb_policy_factory.c +4 -3
- data/src/core/{client_config → ext/client_config}/lb_policy_factory.h +14 -9
- data/src/core/{client_config → ext/client_config}/lb_policy_registry.c +4 -9
- data/src/core/{client_config → ext/client_config}/lb_policy_registry.h +7 -6
- data/src/core/ext/client_config/parse_address.c +137 -0
- data/src/core/ext/client_config/parse_address.h +56 -0
- data/src/core/{client_config → ext/client_config}/resolver.c +1 -1
- data/src/core/{client_config → ext/client_config}/resolver.h +6 -6
- data/src/core/{client_config → ext/client_config}/resolver_factory.c +1 -1
- data/src/core/{client_config → ext/client_config}/resolver_factory.h +7 -7
- data/src/core/{client_config → ext/client_config}/resolver_registry.c +25 -11
- data/src/core/{client_config → ext/client_config}/resolver_registry.h +9 -5
- data/src/core/{client_config → ext/client_config}/subchannel.c +90 -126
- data/src/core/{client_config → ext/client_config}/subchannel.h +15 -15
- data/src/core/{channel → ext/client_config}/subchannel_call_holder.c +9 -8
- data/src/core/{channel → ext/client_config}/subchannel_call_holder.h +7 -7
- data/src/core/{client_config → ext/client_config}/subchannel_index.c +3 -2
- data/src/core/{client_config → ext/client_config}/subchannel_index.h +5 -5
- data/src/core/{client_config → ext/client_config}/uri_parser.c +69 -1
- data/src/core/{client_config → ext/client_config}/uri_parser.h +15 -3
- data/src/core/{client_config/lb_policies → ext/lb_policy/grpclb}/load_balancer_api.c +18 -9
- data/src/core/{client_config/lb_policies → ext/lb_policy/grpclb}/load_balancer_api.h +5 -5
- data/src/core/{proto → ext/lb_policy/grpclb/proto}/grpc/lb/v0/load_balancer.pb.c +1 -1
- data/src/core/{proto → ext/lb_policy/grpclb/proto}/grpc/lb/v0/load_balancer.pb.h +0 -0
- data/src/core/{client_config/lb_policies → ext/lb_policy/pick_first}/pick_first.c +95 -32
- data/src/core/{client_config/lb_policies → ext/lb_policy/round_robin}/round_robin.c +98 -34
- data/src/core/{client_config/resolvers → ext/resolver/dns/native}/dns_resolver.c +83 -39
- data/src/core/{client_config/resolvers → ext/resolver/sockaddr}/sockaddr_resolver.c +66 -169
- data/src/core/{transport/chttp2 → ext/transport/chttp2/alpn}/alpn.c +1 -1
- data/src/core/{transport/chttp2 → ext/transport/chttp2/alpn}/alpn.h +3 -3
- data/src/core/{surface → ext/transport/chttp2/client/insecure}/channel_create.c +65 -59
- data/src/core/{surface → ext/transport/chttp2/client/secure}/secure_channel_create.c +77 -69
- data/src/core/{surface → ext/transport/chttp2/server/insecure}/server_chttp2.c +8 -11
- data/src/core/{security → ext/transport/chttp2/server/secure}/server_secure_chttp2.c +14 -17
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/bin_encoder.c +28 -74
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/bin_encoder.h +5 -5
- data/src/core/ext/transport/chttp2/transport/chttp2_plugin.c +46 -0
- data/src/core/{transport → ext/transport/chttp2/transport}/chttp2_transport.c +551 -310
- data/src/core/{transport → ext/transport/chttp2/transport}/chttp2_transport.h +5 -5
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame.h +3 -3
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_data.c +30 -14
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_data.h +10 -7
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_goaway.c +2 -2
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_goaway.h +5 -5
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_ping.c +2 -2
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_ping.h +5 -5
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_rst_stream.c +9 -5
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_rst_stream.h +8 -6
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_settings.c +6 -6
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_settings.h +5 -5
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_window_update.c +11 -5
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_window_update.h +8 -6
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/hpack_encoder.c +21 -12
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/hpack_encoder.h +8 -6
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/hpack_parser.c +42 -25
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/hpack_parser.h +7 -7
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/hpack_table.c +21 -11
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/hpack_table.h +4 -4
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/http2_errors.h +3 -3
- data/src/core/ext/transport/chttp2/transport/huffsyms.c +105 -0
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/huffsyms.h +3 -3
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/incoming_metadata.c +2 -2
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/incoming_metadata.h +4 -4
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/internal.h +81 -37
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/parsing.c +54 -21
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/status_conversion.c +1 -1
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/status_conversion.h +4 -4
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/stream_lists.c +10 -2
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/stream_map.c +1 -1
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/stream_map.h +3 -3
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/timeout_encoding.c +4 -4
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/timeout_encoding.h +4 -4
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/varint.c +1 -1
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/varint.h +3 -3
- data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/writing.c +30 -20
- data/src/core/{channel → lib/channel}/channel_args.c +3 -15
- data/src/core/{channel → lib/channel}/channel_args.h +11 -15
- data/src/core/{channel → lib/channel}/channel_stack.c +5 -3
- data/src/core/{channel → lib/channel}/channel_stack.h +13 -8
- data/src/core/lib/channel/channel_stack_builder.c +277 -0
- data/src/core/lib/channel/channel_stack_builder.h +161 -0
- data/src/core/{channel → lib/channel}/compress_filter.c +51 -16
- data/src/core/{channel → lib/channel}/compress_filter.h +6 -4
- data/src/core/{channel → lib/channel}/connected_channel.c +34 -24
- data/src/core/lib/channel/connected_channel.h +42 -0
- data/src/core/{channel → lib/channel}/context.h +3 -3
- data/src/core/{channel → lib/channel}/http_client_filter.c +24 -13
- data/src/core/{channel → lib/channel}/http_client_filter.h +4 -4
- data/src/core/{channel → lib/channel}/http_server_filter.c +39 -19
- data/src/core/{channel → lib/channel}/http_server_filter.h +4 -4
- data/src/core/{compression → lib/compression}/algorithm_metadata.h +4 -4
- data/src/core/{compression → lib/compression}/compression_algorithm.c +46 -9
- data/src/core/{compression → lib/compression}/message_compress.c +1 -1
- data/src/core/{compression → lib/compression}/message_compress.h +3 -3
- data/src/core/{debug → lib/debug}/trace.c +2 -2
- data/src/core/{debug → lib/debug}/trace.h +3 -3
- data/src/core/{httpcli → lib/http}/format_request.c +8 -8
- data/src/core/{httpcli → lib/http}/format_request.h +4 -4
- data/src/core/{httpcli → lib/http}/httpcli.c +24 -19
- data/src/core/{httpcli → lib/http}/httpcli.h +14 -33
- data/src/core/{httpcli → lib/http}/httpcli_security_connector.c +5 -5
- data/src/core/lib/http/parser.c +341 -0
- data/src/core/lib/http/parser.h +119 -0
- data/src/core/{iomgr → lib/iomgr}/closure.c +8 -2
- data/src/core/{iomgr → lib/iomgr}/closure.h +7 -4
- data/src/core/{iomgr → lib/iomgr}/endpoint.c +1 -1
- data/src/core/{iomgr → lib/iomgr}/endpoint.h +5 -5
- data/src/core/{iomgr → lib/iomgr}/endpoint_pair.h +4 -4
- data/src/core/{iomgr → lib/iomgr}/endpoint_pair_posix.c +8 -7
- data/src/core/{iomgr → lib/iomgr}/endpoint_pair_windows.c +4 -4
- data/src/core/lib/iomgr/ev_poll_and_epoll_posix.c +1936 -0
- data/src/core/lib/iomgr/ev_poll_and_epoll_posix.h +41 -0
- data/src/core/lib/iomgr/ev_posix.c +164 -0
- data/src/core/lib/iomgr/ev_posix.h +158 -0
- data/src/core/{iomgr → lib/iomgr}/exec_ctx.c +78 -3
- data/src/core/{iomgr → lib/iomgr}/exec_ctx.h +25 -10
- data/src/core/{iomgr → lib/iomgr}/executor.c +3 -3
- data/src/core/{iomgr → lib/iomgr}/executor.h +5 -5
- data/src/core/{iomgr → lib/iomgr}/iocp_windows.c +6 -6
- data/src/core/{iomgr → lib/iomgr}/iocp_windows.h +5 -5
- data/src/core/{iomgr → lib/iomgr}/iomgr.c +13 -10
- data/src/core/{iomgr → lib/iomgr}/iomgr.h +3 -3
- data/src/core/{iomgr → lib/iomgr}/iomgr_internal.h +5 -9
- data/src/core/{iomgr → lib/iomgr}/iomgr_posix.c +6 -6
- data/src/core/{iomgr → lib/iomgr}/iomgr_posix.h +4 -4
- data/src/core/{iomgr → lib/iomgr}/iomgr_windows.c +7 -4
- data/src/core/{iomgr → lib/iomgr}/pollset.h +11 -11
- data/src/core/{iomgr → lib/iomgr}/pollset_set.h +5 -5
- data/src/core/{iomgr → lib/iomgr}/pollset_set_windows.c +2 -2
- data/src/core/lib/iomgr/pollset_set_windows.h +39 -0
- data/src/core/{iomgr → lib/iomgr}/pollset_windows.c +7 -7
- data/src/core/{iomgr → lib/iomgr}/pollset_windows.h +8 -5
- data/src/core/{iomgr → lib/iomgr}/resolve_address.h +10 -9
- data/src/core/{iomgr → lib/iomgr}/resolve_address_posix.c +22 -22
- data/src/core/{iomgr → lib/iomgr}/resolve_address_windows.c +20 -12
- data/src/core/{iomgr → lib/iomgr}/sockaddr.h +5 -5
- data/src/core/{iomgr → lib/iomgr}/sockaddr_posix.h +5 -5
- data/src/core/{iomgr → lib/iomgr}/sockaddr_utils.c +9 -16
- data/src/core/{iomgr → lib/iomgr}/sockaddr_utils.h +4 -4
- data/src/core/{iomgr → lib/iomgr}/sockaddr_win32.h +6 -4
- data/src/core/{iomgr → lib/iomgr}/socket_utils_common_posix.c +29 -7
- data/src/core/{iomgr → lib/iomgr}/socket_utils_linux.c +2 -2
- data/src/core/{iomgr → lib/iomgr}/socket_utils_posix.c +1 -1
- data/src/core/{iomgr → lib/iomgr}/socket_utils_posix.h +14 -4
- data/src/core/{iomgr → lib/iomgr}/socket_windows.c +7 -5
- data/src/core/{iomgr → lib/iomgr}/socket_windows.h +6 -6
- data/src/core/{iomgr → lib/iomgr}/tcp_client.h +6 -6
- data/src/core/{iomgr → lib/iomgr}/tcp_client_posix.c +33 -18
- data/src/core/{iomgr → lib/iomgr}/tcp_client_windows.c +30 -20
- data/src/core/{iomgr → lib/iomgr}/tcp_posix.c +9 -10
- data/src/core/{iomgr → lib/iomgr}/tcp_posix.h +6 -6
- data/src/core/{iomgr → lib/iomgr}/tcp_server.h +6 -6
- data/src/core/{iomgr → lib/iomgr}/tcp_server_posix.c +24 -37
- data/src/core/{iomgr → lib/iomgr}/tcp_server_windows.c +8 -36
- data/src/core/{iomgr → lib/iomgr}/tcp_windows.c +27 -17
- data/src/core/{iomgr → lib/iomgr}/tcp_windows.h +5 -5
- data/src/core/{iomgr → lib/iomgr}/time_averaged_stats.c +1 -1
- data/src/core/{iomgr → lib/iomgr}/time_averaged_stats.h +3 -3
- data/src/core/{iomgr → lib/iomgr}/timer.c +31 -4
- data/src/core/{iomgr → lib/iomgr}/timer.h +6 -7
- data/src/core/{iomgr → lib/iomgr}/timer_heap.c +2 -2
- data/src/core/{iomgr → lib/iomgr}/timer_heap.h +4 -4
- data/src/core/{iomgr → lib/iomgr}/udp_server.c +13 -37
- data/src/core/{iomgr → lib/iomgr}/udp_server.h +11 -10
- data/src/core/lib/iomgr/unix_sockets_posix.c +89 -0
- data/src/core/{client_config/resolvers/sockaddr_resolver.h → lib/iomgr/unix_sockets_posix.h} +15 -11
- data/src/core/lib/iomgr/unix_sockets_posix_noop.c +59 -0
- data/src/core/{iomgr → lib/iomgr}/wakeup_fd_eventfd.c +2 -2
- data/src/core/{iomgr → lib/iomgr}/wakeup_fd_nospecial.c +1 -1
- data/src/core/{iomgr → lib/iomgr}/wakeup_fd_pipe.c +8 -3
- data/src/core/{iomgr → lib/iomgr}/wakeup_fd_pipe.h +4 -4
- data/src/core/{iomgr → lib/iomgr}/wakeup_fd_posix.c +2 -2
- data/src/core/{iomgr → lib/iomgr}/wakeup_fd_posix.h +3 -3
- data/src/core/{iomgr → lib/iomgr}/workqueue.h +10 -10
- data/src/core/{iomgr → lib/iomgr}/workqueue_posix.c +5 -6
- data/src/core/{iomgr → lib/iomgr}/workqueue_posix.h +5 -5
- data/src/core/{iomgr → lib/iomgr}/workqueue_windows.c +1 -1
- data/src/core/{iomgr → lib/iomgr}/workqueue_windows.h +3 -3
- data/src/core/{json → lib/json}/json.c +1 -1
- data/src/core/{json → lib/json}/json.h +4 -4
- data/src/core/{json → lib/json}/json_common.h +3 -3
- data/src/core/{json → lib/json}/json_reader.c +16 -4
- data/src/core/{json → lib/json}/json_reader.h +4 -4
- data/src/core/{json → lib/json}/json_string.c +4 -4
- data/src/core/{json → lib/json}/json_writer.c +1 -1
- data/src/core/{json → lib/json}/json_writer.h +4 -4
- data/src/core/{profiling → lib/profiling}/basic_timers.c +3 -2
- data/src/core/{profiling → lib/profiling}/stap_timers.c +2 -2
- data/src/core/{profiling → lib/profiling}/timers.h +3 -3
- data/src/core/{security → lib/security}/auth_filters.h +4 -4
- data/src/core/{security → lib/security}/b64.c +2 -2
- data/src/core/{security → lib/security}/b64.h +4 -4
- data/src/core/{security → lib/security}/client_auth_filter.c +16 -16
- data/src/core/{security → lib/security}/credentials.c +42 -26
- data/src/core/{security → lib/security}/credentials.h +11 -10
- data/src/core/{security → lib/security}/credentials_metadata.c +1 -1
- data/src/core/{security → lib/security}/credentials_posix.c +3 -3
- data/src/core/{security → lib/security}/credentials_win32.c +3 -3
- data/src/core/{security → lib/security}/google_default_credentials.c +10 -9
- data/src/core/{security → lib/security}/handshake.c +4 -4
- data/src/core/{security → lib/security}/handshake.h +6 -6
- data/src/core/{security → lib/security}/json_token.c +4 -4
- data/src/core/{security → lib/security}/json_token.h +4 -4
- data/src/core/{security → lib/security}/jwt_verifier.c +14 -14
- data/src/core/{security → lib/security}/jwt_verifier.h +5 -5
- data/src/core/{security → lib/security}/secure_endpoint.c +9 -8
- data/src/core/{security → lib/security}/secure_endpoint.h +4 -4
- data/src/core/{security → lib/security}/security_connector.c +53 -21
- data/src/core/{security → lib/security}/security_connector.h +8 -8
- data/src/core/{security → lib/security}/security_context.c +5 -5
- data/src/core/{security → lib/security}/security_context.h +5 -5
- data/src/core/{security → lib/security}/server_auth_filter.c +9 -9
- data/src/core/{support → lib/support}/alloc.c +5 -3
- data/src/core/{support → lib/support}/avl.c +1 -1
- data/src/core/lib/support/backoff.c +76 -0
- data/src/core/lib/support/backoff.h +68 -0
- data/src/core/{support → lib/support}/block_annotate.h +3 -3
- data/src/core/{support → lib/support}/cmdline.c +1 -1
- data/src/core/{support → lib/support}/cpu_iphone.c +0 -0
- data/src/core/{support → lib/support}/cpu_linux.c +2 -2
- data/src/core/{support → lib/support}/cpu_posix.c +2 -2
- data/src/core/{support → lib/support}/cpu_windows.c +0 -0
- data/src/core/{support → lib/support}/env.h +3 -3
- data/src/core/{support → lib/support}/env_linux.c +3 -3
- data/src/core/{support → lib/support}/env_posix.c +2 -2
- data/src/core/{support → lib/support}/env_win32.c +27 -21
- data/src/core/{support → lib/support}/histogram.c +1 -1
- data/src/core/{support → lib/support}/host_port.c +1 -1
- data/src/core/{support → lib/support}/load_file.c +4 -4
- data/src/core/{support → lib/support}/load_file.h +4 -4
- data/src/core/{support → lib/support}/log.c +33 -0
- data/src/core/{support → lib/support}/log_android.c +2 -2
- data/src/core/{support → lib/support}/log_linux.c +6 -5
- data/src/core/{support → lib/support}/log_posix.c +3 -3
- data/src/core/{support → lib/support}/log_win32.c +8 -22
- data/src/core/{support → lib/support}/murmur_hash.c +1 -1
- data/src/core/{support → lib/support}/murmur_hash.h +3 -3
- data/src/core/{support → lib/support}/slice.c +0 -0
- data/src/core/{support → lib/support}/slice_buffer.c +0 -0
- data/src/core/{support → lib/support}/stack_lockfree.c +7 -7
- data/src/core/{support → lib/support}/stack_lockfree.h +3 -3
- data/src/core/{support → lib/support}/string.c +1 -1
- data/src/core/{support → lib/support}/string.h +4 -4
- data/src/core/{support → lib/support}/string_posix.c +1 -1
- data/src/core/{support/string_win32.c → lib/support/string_util_win32.c} +23 -38
- data/src/core/lib/support/string_win32.c +83 -0
- data/src/core/{support → lib/support}/string_win32.h +3 -3
- data/src/core/{support → lib/support}/subprocess_posix.c +3 -3
- data/src/core/{support → lib/support}/subprocess_windows.c +3 -3
- data/src/core/{support → lib/support}/sync.c +2 -2
- data/src/core/{support → lib/support}/sync_posix.c +3 -3
- data/src/core/{support → lib/support}/sync_win32.c +1 -1
- data/src/core/{support → lib/support}/thd.c +0 -0
- data/src/core/{support → lib/support}/thd_internal.h +3 -3
- data/src/core/{support → lib/support}/thd_posix.c +4 -3
- data/src/core/{support → lib/support}/thd_win32.c +1 -1
- data/src/core/{support → lib/support}/time.c +2 -2
- data/src/core/{support → lib/support}/time_posix.c +12 -6
- data/src/core/{support → lib/support}/time_precise.c +0 -0
- data/src/core/{support → lib/support}/time_precise.h +3 -3
- data/src/core/{support → lib/support}/time_win32.c +7 -7
- data/src/core/{support → lib/support}/tls_pthread.c +0 -0
- data/src/core/{support → lib/support}/tmpfile.h +4 -4
- data/src/core/lib/support/tmpfile_msys.c +73 -0
- data/src/core/{support → lib/support}/tmpfile_posix.c +5 -5
- data/src/core/{support → lib/support}/tmpfile_win32.c +5 -5
- data/src/core/{support → lib/support}/wrap_memcpy.c +0 -0
- data/src/core/{surface → lib/surface}/alarm.c +3 -3
- data/src/core/{surface → lib/surface}/api_trace.c +1 -1
- data/src/core/{surface → lib/surface}/api_trace.h +4 -4
- data/src/core/{surface → lib/surface}/byte_buffer.c +3 -3
- data/src/core/{surface → lib/surface}/byte_buffer_reader.c +3 -3
- data/src/core/{surface → lib/surface}/call.c +145 -73
- data/src/core/{surface → lib/surface}/call.h +14 -7
- data/src/core/{surface → lib/surface}/call_details.c +1 -1
- data/src/core/{surface → lib/surface}/call_log_batch.c +2 -2
- data/src/core/{surface → lib/surface}/call_test_only.h +3 -3
- data/src/core/{surface → lib/surface}/channel.c +33 -34
- data/src/core/{surface → lib/surface}/channel.h +9 -9
- data/src/core/lib/surface/channel_init.c +140 -0
- data/src/core/lib/surface/channel_init.h +87 -0
- data/src/core/{surface → lib/surface}/channel_ping.c +4 -4
- data/src/core/lib/surface/channel_stack_type.c +54 -0
- data/src/core/{httpcli/parser.h → lib/surface/channel_stack_type.h} +22 -28
- data/src/core/{surface → lib/surface}/completion_queue.c +15 -11
- data/src/core/{surface → lib/surface}/completion_queue.h +4 -4
- data/src/core/{surface → lib/surface}/event_string.c +2 -2
- data/src/core/{surface → lib/surface}/event_string.h +3 -3
- data/src/core/lib/surface/init.c +217 -0
- data/src/core/{surface → lib/surface}/init.h +4 -3
- data/src/core/lib/surface/init_secure.c +89 -0
- data/src/core/{surface → lib/surface}/lame_client.c +31 -19
- data/src/core/{iomgr/pollset_set_windows.h → lib/surface/lame_client.h} +7 -5
- data/src/core/{surface → lib/surface}/metadata_array.c +1 -1
- data/src/core/{surface → lib/surface}/server.c +208 -183
- data/src/core/{surface → lib/surface}/server.h +6 -11
- data/src/core/{surface → lib/surface}/surface_trace.h +5 -5
- data/src/core/{surface → lib/surface}/validate_metadata.c +1 -1
- data/src/core/{surface → lib/surface}/version.c +2 -2
- data/src/core/{transport → lib/transport}/byte_stream.c +1 -1
- data/src/core/{transport → lib/transport}/byte_stream.h +4 -4
- data/src/core/{transport → lib/transport}/connectivity_state.c +2 -2
- data/src/core/{transport → lib/transport}/connectivity_state.h +4 -4
- data/src/core/{transport → lib/transport}/metadata.c +71 -19
- data/src/core/{transport → lib/transport}/metadata.h +11 -4
- data/src/core/{transport → lib/transport}/metadata_batch.c +2 -2
- data/src/core/{transport → lib/transport}/metadata_batch.h +4 -4
- data/src/core/{transport → lib/transport}/static_metadata.c +100 -32
- data/src/core/{transport → lib/transport}/static_metadata.h +58 -58
- data/src/core/{transport → lib/transport}/transport.c +25 -5
- data/src/core/{transport → lib/transport}/transport.h +41 -16
- data/src/core/{transport → lib/transport}/transport_impl.h +8 -5
- data/src/core/{transport → lib/transport}/transport_op_string.c +2 -2
- data/src/core/{tsi → lib/tsi}/fake_transport_security.c +18 -14
- data/src/core/{tsi → lib/tsi}/fake_transport_security.h +4 -4
- data/src/core/{tsi → lib/tsi}/ssl_transport_security.c +173 -63
- data/src/core/{tsi → lib/tsi}/ssl_transport_security.h +24 -6
- data/src/core/{tsi → lib/tsi}/ssl_types.h +3 -3
- data/src/core/{tsi → lib/tsi}/transport_security.c +12 -28
- data/src/core/{tsi → lib/tsi}/transport_security.h +4 -4
- data/src/core/{tsi → lib/tsi}/transport_security_interface.h +12 -3
- data/src/core/plugin_registry/grpc_plugin_registry.c +66 -0
- data/src/ruby/ext/grpc/extconf.rb +14 -20
- data/src/ruby/ext/grpc/rb_byte_buffer.c +2 -3
- data/src/ruby/ext/grpc/rb_call.c +37 -4
- data/src/ruby/ext/grpc/rb_call_credentials.c +13 -3
- data/src/ruby/ext/grpc/rb_channel.c +2 -3
- data/src/ruby/ext/grpc/rb_channel_args.c +2 -3
- data/src/ruby/ext/grpc/rb_channel_credentials.c +31 -3
- data/src/ruby/ext/grpc/rb_completion_queue.c +2 -2
- data/src/ruby/ext/grpc/rb_event_thread.c +1 -1
- data/src/ruby/ext/grpc/rb_grpc.c +4 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +8 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +14 -2
- data/src/ruby/ext/grpc/rb_server.c +2 -3
- data/src/ruby/ext/grpc/rb_server_credentials.c +16 -13
- data/src/ruby/ext/grpc/rb_signal.c +70 -0
- data/src/ruby/ext/grpc/rb_signal.h +39 -0
- data/src/ruby/lib/grpc.rb +21 -13
- data/src/ruby/lib/grpc/core/time_consts.rb +2 -2
- data/src/ruby/lib/grpc/errors.rb +2 -2
- data/src/ruby/lib/grpc/generic/active_call.rb +10 -3
- data/src/ruby/lib/grpc/generic/bidi_call.rb +2 -2
- data/src/ruby/lib/grpc/generic/client_stub.rb +10 -7
- data/src/ruby/lib/grpc/generic/rpc_desc.rb +2 -2
- data/src/ruby/lib/grpc/generic/rpc_server.rb +21 -61
- data/src/ruby/lib/grpc/generic/service.rb +5 -15
- data/src/ruby/lib/grpc/grpc.rb +3 -3
- data/src/ruby/{bin/interop/interop_server.rb → lib/grpc/signals.rb} +39 -20
- data/src/ruby/lib/grpc/version.rb +2 -2
- data/src/ruby/pb/generate_proto_ruby.sh +9 -2
- data/src/ruby/pb/grpc/health/checker.rb +1 -1
- data/src/ruby/pb/grpc/testing/duplicate/echo_duplicate_services.rb +28 -0
- data/src/ruby/pb/grpc/testing/metrics.rb +28 -0
- data/src/ruby/pb/grpc/testing/metrics_services.rb +27 -0
- data/src/ruby/pb/test/client.rb +12 -23
- data/src/ruby/pb/test/server.rb +1 -1
- data/src/ruby/spec/client_server_spec.rb +1 -1
- data/src/ruby/spec/generic/client_stub_spec.rb +18 -17
- data/src/ruby/spec/generic/rpc_server_spec.rb +23 -7
- data/src/ruby/spec/generic/service_spec.rb +0 -69
- data/src/ruby/{bin/interop/interop_client.rb → spec/pb/duplicate/codegen_spec.rb} +41 -21
- data/src/ruby/spec/pb/health/checker_spec.rb +1 -1
- data/third_party/boringssl/crypto/asn1/a_bitstr.c +184 -176
- data/third_party/boringssl/crypto/asn1/a_bool.c +42 -44
- data/third_party/boringssl/crypto/asn1/a_bytes.c +236 -245
- data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +173 -192
- data/third_party/boringssl/crypto/asn1/a_dup.c +43 -35
- data/third_party/boringssl/crypto/asn1/a_enum.c +107 -109
- data/third_party/boringssl/crypto/asn1/a_gentm.c +180 -181
- data/third_party/boringssl/crypto/asn1/a_i2d_fp.c +73 -80
- data/third_party/boringssl/crypto/asn1/a_int.c +357 -353
- data/third_party/boringssl/crypto/asn1/a_mbstr.c +272 -253
- data/third_party/boringssl/crypto/asn1/a_object.c +293 -309
- data/third_party/boringssl/crypto/asn1/a_octet.c +13 -6
- data/third_party/boringssl/crypto/asn1/a_print.c +54 -52
- data/third_party/boringssl/crypto/asn1/a_strnid.c +179 -157
- data/third_party/boringssl/crypto/asn1/a_time.c +125 -129
- data/third_party/boringssl/crypto/asn1/a_type.c +79 -86
- data/third_party/boringssl/crypto/asn1/a_utctm.c +246 -255
- data/third_party/boringssl/crypto/asn1/a_utf8.c +159 -135
- data/third_party/boringssl/crypto/asn1/asn1_lib.c +361 -368
- data/third_party/boringssl/crypto/asn1/asn1_locl.h +11 -11
- data/third_party/boringssl/crypto/asn1/asn1_par.c +309 -351
- data/third_party/boringssl/crypto/asn1/asn_pack.c +30 -29
- data/third_party/boringssl/crypto/asn1/bio_asn1.c +375 -394
- data/third_party/boringssl/crypto/asn1/bio_ndef.c +146 -149
- data/third_party/boringssl/crypto/asn1/f_enum.c +128 -134
- data/third_party/boringssl/crypto/asn1/f_int.c +131 -139
- data/third_party/boringssl/crypto/asn1/f_string.c +125 -133
- data/third_party/boringssl/crypto/asn1/t_bitst.c +30 -29
- data/third_party/boringssl/crypto/asn1/t_pkey.c +45 -47
- data/third_party/boringssl/crypto/asn1/tasn_dec.c +1099 -1216
- data/third_party/boringssl/crypto/asn1/tasn_enc.c +556 -592
- data/third_party/boringssl/crypto/asn1/tasn_fre.c +175 -193
- data/third_party/boringssl/crypto/asn1/tasn_new.c +271 -288
- data/third_party/boringssl/crypto/asn1/tasn_prn.c +462 -508
- data/third_party/boringssl/crypto/asn1/tasn_typ.c +28 -21
- data/third_party/boringssl/crypto/asn1/x_bignum.c +62 -52
- data/third_party/boringssl/crypto/asn1/x_long.c +101 -86
- data/third_party/boringssl/crypto/bio/buffer.c +3 -3
- data/third_party/boringssl/crypto/bn/asm/x86_64-gcc.c +8 -68
- data/third_party/boringssl/crypto/bn/bn.c +1 -1
- data/third_party/boringssl/crypto/bn/bn_asn1.c +9 -22
- data/third_party/boringssl/crypto/bn/convert.c +9 -4
- data/third_party/boringssl/crypto/bn/div.c +0 -20
- data/third_party/boringssl/crypto/bn/exponentiation.c +22 -13
- data/third_party/boringssl/crypto/bn/generic.c +6 -242
- data/third_party/boringssl/crypto/bn/internal.h +9 -70
- data/third_party/boringssl/crypto/bn/montgomery.c +1 -2
- data/third_party/boringssl/crypto/bn/mul.c +6 -26
- data/third_party/boringssl/crypto/bn/rsaz_exp.c +21 -28
- data/third_party/boringssl/crypto/bytestring/asn1_compat.c +51 -0
- data/third_party/boringssl/crypto/bytestring/ber.c +128 -87
- data/third_party/boringssl/crypto/bytestring/cbb.c +37 -3
- data/third_party/boringssl/crypto/bytestring/internal.h +39 -10
- data/third_party/boringssl/crypto/chacha/chacha_vec.c +18 -13
- data/third_party/boringssl/crypto/cipher/e_aes.c +2 -2
- data/third_party/boringssl/crypto/cipher/e_chacha20poly1305.c +4 -9
- data/third_party/boringssl/crypto/cipher/tls_cbc.c +39 -10
- data/third_party/boringssl/crypto/conf/conf.c +9 -0
- data/third_party/boringssl/crypto/cpu-intel.c +1 -1
- data/third_party/boringssl/crypto/crypto.c +2 -0
- data/third_party/boringssl/crypto/curve25519/curve25519.c +125 -120
- data/third_party/boringssl/crypto/curve25519/internal.h +45 -0
- data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +225 -0
- data/third_party/boringssl/crypto/dh/check.c +32 -10
- data/third_party/boringssl/crypto/dh/dh.c +1 -1
- data/third_party/boringssl/crypto/digest/md32_common.h +0 -60
- data/third_party/boringssl/crypto/dsa/dsa.c +47 -21
- data/third_party/boringssl/crypto/dsa/dsa_asn1.c +249 -64
- data/third_party/boringssl/crypto/ec/ec.c +45 -31
- data/third_party/boringssl/crypto/ec/ec_asn1.c +315 -382
- data/third_party/boringssl/crypto/ec/ec_key.c +1 -4
- data/third_party/boringssl/crypto/ec/ec_montgomery.c +0 -9
- data/third_party/boringssl/crypto/ec/internal.h +1 -19
- data/third_party/boringssl/crypto/ec/oct.c +12 -0
- data/third_party/boringssl/crypto/ec/p224-64.c +4 -65
- data/third_party/boringssl/crypto/ec/p256-64.c +9 -71
- data/third_party/boringssl/crypto/ec/p256-x86_64-table.h +1 -6
- data/third_party/boringssl/crypto/ec/p256-x86_64.c +3 -13
- data/third_party/boringssl/crypto/ec/simple.c +0 -76
- data/third_party/boringssl/crypto/ecdsa/ecdsa.c +1 -1
- data/third_party/boringssl/crypto/ecdsa/ecdsa_asn1.c +10 -24
- data/third_party/boringssl/crypto/evp/evp.c +4 -3
- data/third_party/boringssl/crypto/evp/evp_asn1.c +101 -0
- data/third_party/boringssl/crypto/evp/evp_ctx.c +22 -51
- data/third_party/boringssl/crypto/evp/internal.h +28 -27
- data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +78 -249
- data/third_party/boringssl/crypto/evp/p_ec.c +19 -66
- data/third_party/boringssl/crypto/evp/p_ec_asn1.c +74 -231
- data/third_party/boringssl/crypto/evp/p_rsa.c +90 -13
- data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +49 -48
- data/third_party/boringssl/crypto/internal.h +16 -1
- data/third_party/boringssl/crypto/mem.c +2 -2
- data/third_party/boringssl/crypto/modes/ctr.c +2 -1
- data/third_party/boringssl/crypto/modes/gcm.c +5 -3
- data/third_party/boringssl/crypto/obj/obj_dat.h +6 -3
- data/third_party/boringssl/crypto/pem/pem_all.c +83 -102
- data/third_party/boringssl/crypto/pem/pem_info.c +286 -309
- data/third_party/boringssl/crypto/pem/pem_lib.c +690 -710
- data/third_party/boringssl/crypto/pem/pem_oth.c +15 -16
- data/third_party/boringssl/crypto/pem/pem_pk8.c +132 -119
- data/third_party/boringssl/crypto/pem/pem_pkey.c +144 -220
- data/third_party/boringssl/crypto/pem/pem_x509.c +3 -3
- data/third_party/boringssl/crypto/pem/pem_xaux.c +5 -4
- data/third_party/boringssl/crypto/pkcs8/pkcs8.c +54 -60
- data/third_party/boringssl/crypto/poly1305/poly1305_arm.c +3 -1
- data/third_party/boringssl/crypto/poly1305/poly1305_vec.c +48 -50
- data/third_party/boringssl/crypto/rand/rand.c +2 -0
- data/third_party/boringssl/crypto/rsa/blinding.c +8 -48
- data/third_party/boringssl/crypto/rsa/internal.h +1 -9
- data/third_party/boringssl/crypto/rsa/padding.c +73 -77
- data/third_party/boringssl/crypto/rsa/rsa.c +1 -1
- data/third_party/boringssl/crypto/rsa/rsa_asn1.c +27 -46
- data/third_party/boringssl/crypto/rsa/rsa_impl.c +23 -34
- data/third_party/boringssl/crypto/test/scoped_types.h +3 -0
- data/third_party/boringssl/crypto/thread_win.c +15 -13
- data/third_party/boringssl/crypto/time_support.c +0 -6
- data/third_party/boringssl/crypto/x509/a_digest.c +26 -27
- data/third_party/boringssl/crypto/x509/a_sign.c +63 -64
- data/third_party/boringssl/crypto/x509/a_strex.c +482 -413
- data/third_party/boringssl/crypto/x509/a_verify.c +45 -51
- data/third_party/boringssl/crypto/x509/asn1_gen.c +715 -769
- data/third_party/boringssl/crypto/x509/by_dir.c +355 -393
- data/third_party/boringssl/crypto/x509/by_file.c +186 -206
- data/third_party/boringssl/crypto/x509/charmap.h +11 -11
- data/third_party/boringssl/crypto/x509/i2d_pr.c +21 -22
- data/third_party/boringssl/crypto/x509/t_crl.c +50 -51
- data/third_party/boringssl/crypto/x509/t_x509.c +414 -406
- data/third_party/boringssl/crypto/x509/t_x509a.c +44 -42
- data/third_party/boringssl/crypto/x509/vpm_int.h +13 -13
- data/third_party/boringssl/crypto/x509/x509_att.c +241 -219
- data/third_party/boringssl/crypto/x509/x509_cmp.c +343 -359
- data/third_party/boringssl/crypto/x509/x509_d2.c +36 -35
- data/third_party/boringssl/crypto/x509/x509_def.c +23 -13
- data/third_party/boringssl/crypto/x509/x509_ext.c +75 -75
- data/third_party/boringssl/crypto/x509/x509_lu.c +574 -612
- data/third_party/boringssl/crypto/x509/x509_obj.c +104 -115
- data/third_party/boringssl/crypto/x509/x509_r2x.c +40 -40
- data/third_party/boringssl/crypto/x509/x509_req.c +181 -174
- data/third_party/boringssl/crypto/x509/x509_set.c +71 -76
- data/third_party/boringssl/crypto/x509/x509_trs.c +193 -171
- data/third_party/boringssl/crypto/x509/x509_txt.c +135 -138
- data/third_party/boringssl/crypto/x509/x509_v3.c +174 -167
- data/third_party/boringssl/crypto/x509/x509_vfy.c +2079 -2130
- data/third_party/boringssl/crypto/x509/x509_vpm.c +486 -522
- data/third_party/boringssl/crypto/x509/x509cset.c +96 -99
- data/third_party/boringssl/crypto/x509/x509name.c +280 -275
- data/third_party/boringssl/crypto/x509/x509rset.c +15 -14
- data/third_party/boringssl/crypto/x509/x509spki.c +62 -60
- data/third_party/boringssl/crypto/x509/x509type.c +58 -60
- data/third_party/boringssl/crypto/x509/x_algor.c +70 -73
- data/third_party/boringssl/crypto/x509/x_all.c +282 -328
- data/third_party/boringssl/crypto/x509/x_attrib.c +36 -42
- data/third_party/boringssl/crypto/x509/x_crl.c +397 -418
- data/third_party/boringssl/crypto/x509/x_exten.c +5 -5
- data/third_party/boringssl/crypto/x509/x_info.c +30 -27
- data/third_party/boringssl/crypto/x509/x_name.c +387 -388
- data/third_party/boringssl/crypto/x509/x_pkey.c +32 -29
- data/third_party/boringssl/crypto/x509/x_pubkey.c +261 -280
- data/third_party/boringssl/crypto/x509/x_req.c +30 -33
- data/third_party/boringssl/crypto/x509/x_sig.c +2 -2
- data/third_party/boringssl/crypto/x509/x_spki.c +9 -7
- data/third_party/boringssl/crypto/x509/x_val.c +2 -2
- data/third_party/boringssl/crypto/x509/x_x509.c +120 -119
- data/third_party/boringssl/crypto/x509/x_x509a.c +99 -91
- data/third_party/boringssl/crypto/x509v3/ext_dat.h +57 -51
- data/third_party/boringssl/crypto/x509v3/pcy_cache.c +199 -214
- data/third_party/boringssl/crypto/x509v3/pcy_data.c +57 -64
- data/third_party/boringssl/crypto/x509v3/pcy_int.h +95 -90
- data/third_party/boringssl/crypto/x509v3/pcy_lib.c +86 -87
- data/third_party/boringssl/crypto/x509v3/pcy_map.c +61 -64
- data/third_party/boringssl/crypto/x509v3/pcy_node.c +108 -117
- data/third_party/boringssl/crypto/x509v3/pcy_tree.c +676 -724
- data/third_party/boringssl/crypto/x509v3/v3_akey.c +128 -136
- data/third_party/boringssl/crypto/x509v3/v3_akeya.c +7 -6
- data/third_party/boringssl/crypto/x509v3/v3_alt.c +499 -507
- data/third_party/boringssl/crypto/x509v3/v3_bcons.c +54 -47
- data/third_party/boringssl/crypto/x509v3/v3_bitst.c +67 -67
- data/third_party/boringssl/crypto/x509v3/v3_conf.c +330 -328
- data/third_party/boringssl/crypto/x509v3/v3_cpols.c +354 -338
- data/third_party/boringssl/crypto/x509v3/v3_crld.c +441 -496
- data/third_party/boringssl/crypto/x509v3/v3_enum.c +35 -33
- data/third_party/boringssl/crypto/x509v3/v3_extku.c +66 -63
- data/third_party/boringssl/crypto/x509v3/v3_genn.c +157 -159
- data/third_party/boringssl/crypto/x509v3/v3_ia5.c +45 -43
- data/third_party/boringssl/crypto/x509v3/v3_info.c +124 -112
- data/third_party/boringssl/crypto/x509v3/v3_int.c +30 -26
- data/third_party/boringssl/crypto/x509v3/v3_lib.c +231 -204
- data/third_party/boringssl/crypto/x509v3/v3_ncons.c +353 -381
- data/third_party/boringssl/crypto/x509v3/v3_pci.c +252 -270
- data/third_party/boringssl/crypto/x509v3/v3_pcia.c +9 -8
- data/third_party/boringssl/crypto/x509v3/v3_pcons.c +58 -61
- data/third_party/boringssl/crypto/x509v3/v3_pku.c +35 -34
- data/third_party/boringssl/crypto/x509v3/v3_pmaps.c +72 -74
- data/third_party/boringssl/crypto/x509v3/v3_prn.c +146 -121
- data/third_party/boringssl/crypto/x509v3/v3_purp.c +651 -582
- data/third_party/boringssl/crypto/x509v3/v3_skey.c +76 -72
- data/third_party/boringssl/crypto/x509v3/v3_sxnet.c +139 -131
- data/third_party/boringssl/crypto/x509v3/v3_utl.c +1072 -1068
- data/third_party/boringssl/include/openssl/asn1.h +40 -38
- data/third_party/boringssl/include/openssl/base.h +10 -1
- data/third_party/boringssl/include/openssl/bio.h +10 -11
- data/third_party/boringssl/include/openssl/bn.h +12 -9
- data/third_party/boringssl/include/openssl/buf.h +1 -1
- data/third_party/boringssl/include/openssl/bytestring.h +29 -0
- data/third_party/boringssl/include/openssl/conf.h +25 -0
- data/third_party/boringssl/include/openssl/crypto.h +6 -1
- data/third_party/boringssl/include/openssl/curve25519.h +6 -3
- data/third_party/boringssl/include/openssl/dh.h +7 -3
- data/third_party/boringssl/include/openssl/dsa.h +108 -51
- data/third_party/boringssl/include/openssl/ec.h +46 -21
- data/third_party/boringssl/include/openssl/ec_key.h +78 -42
- data/third_party/boringssl/include/openssl/ecdsa.h +4 -4
- data/third_party/boringssl/include/openssl/err.h +3 -2
- data/third_party/boringssl/include/openssl/evp.h +120 -37
- data/third_party/boringssl/include/openssl/mem.h +4 -13
- data/third_party/boringssl/include/openssl/obj_mac.h +4 -0
- data/third_party/boringssl/include/openssl/pem.h +0 -9
- data/third_party/boringssl/include/openssl/pkcs8.h +6 -2
- data/third_party/boringssl/include/openssl/rand.h +3 -0
- data/third_party/boringssl/include/openssl/rsa.h +42 -42
- data/third_party/boringssl/include/openssl/ssl.h +115 -41
- data/third_party/boringssl/include/openssl/stack.h +0 -3
- data/third_party/boringssl/include/openssl/stack_macros.h +0 -256
- data/third_party/boringssl/include/openssl/tls1.h +1 -1
- data/third_party/boringssl/include/openssl/x509.h +0 -2
- data/third_party/boringssl/include/openssl/x509_vfy.h +5 -0
- data/third_party/boringssl/ssl/d1_both.c +102 -101
- data/third_party/boringssl/ssl/d1_clnt.c +145 -150
- data/third_party/boringssl/ssl/d1_lib.c +63 -62
- data/third_party/boringssl/ssl/d1_pkt.c +73 -71
- data/third_party/boringssl/ssl/d1_srvr.c +116 -125
- data/third_party/boringssl/ssl/dtls_record.c +3 -3
- data/third_party/boringssl/ssl/internal.h +210 -208
- data/third_party/boringssl/ssl/pqueue/pqueue.c +2 -2
- data/third_party/boringssl/ssl/s3_both.c +116 -130
- data/third_party/boringssl/ssl/s3_clnt.c +589 -740
- data/third_party/boringssl/ssl/s3_enc.c +52 -151
- data/third_party/boringssl/ssl/s3_lib.c +70 -76
- data/third_party/boringssl/ssl/s3_pkt.c +105 -144
- data/third_party/boringssl/ssl/s3_srvr.c +542 -806
- data/third_party/boringssl/ssl/ssl_aead_ctx.c +1 -1
- data/third_party/boringssl/ssl/ssl_cert.c +2 -2
- data/third_party/boringssl/ssl/ssl_cipher.c +7 -3
- data/third_party/boringssl/ssl/ssl_ecdh.c +374 -0
- data/third_party/boringssl/ssl/ssl_lib.c +260 -221
- data/third_party/boringssl/ssl/ssl_session.c +17 -17
- data/third_party/boringssl/ssl/t1_enc.c +128 -273
- data/third_party/boringssl/ssl/t1_lib.c +134 -258
- data/third_party/boringssl/ssl/test/test_config.h +2 -0
- data/third_party/boringssl/ssl/tls_record.c +52 -15
- metadata +385 -359
- data/src/core/channel/client_uchannel.c +0 -243
- data/src/core/channel/client_uchannel.h +0 -60
- data/src/core/channel/connected_channel.h +0 -51
- data/src/core/client_config/lb_policies/pick_first.h +0 -43
- data/src/core/client_config/resolvers/dns_resolver.h +0 -42
- data/src/core/client_config/subchannel_factory.h +0 -66
- data/src/core/httpcli/parser.c +0 -211
- data/src/core/iomgr/fd_posix.c +0 -451
- data/src/core/iomgr/fd_posix.h +0 -192
- data/src/core/iomgr/pollset_multipoller_with_epoll.c +0 -324
- data/src/core/iomgr/pollset_multipoller_with_poll_posix.c +0 -234
- data/src/core/iomgr/pollset_posix.c +0 -633
- data/src/core/iomgr/pollset_posix.h +0 -153
- data/src/core/iomgr/pollset_set_posix.c +0 -202
- data/src/core/iomgr/pollset_set_posix.h +0 -45
- data/src/core/surface/init.c +0 -174
- data/src/core/surface/init_secure.c +0 -42
- data/src/core/surface/server_create.c +0 -48
- data/src/core/transport/chttp2/huffsyms.c +0 -297
- data/src/ruby/bin/grpc_ruby_interop_client +0 -33
- data/src/ruby/bin/grpc_ruby_interop_server +0 -33
- data/third_party/boringssl/crypto/dsa/internal.h +0 -78
@@ -1,5 +1,6 @@
|
|
1
1
|
/* v3_utl.c */
|
2
|
-
/*
|
2
|
+
/*
|
3
|
+
* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
|
3
4
|
* project.
|
4
5
|
*/
|
5
6
|
/* ====================================================================
|
@@ -10,7 +11,7 @@
|
|
10
11
|
* are met:
|
11
12
|
*
|
12
13
|
* 1. Redistributions of source code must retain the above copyright
|
13
|
-
* notice, this list of conditions and the following disclaimer.
|
14
|
+
* notice, this list of conditions and the following disclaimer.
|
14
15
|
*
|
15
16
|
* 2. Redistributions in binary form must reproduce the above copyright
|
16
17
|
* notice, this list of conditions and the following disclaimer in
|
@@ -57,7 +58,6 @@
|
|
57
58
|
*/
|
58
59
|
/* X509 v3 extension utilities */
|
59
60
|
|
60
|
-
|
61
61
|
#include <ctype.h>
|
62
62
|
#include <stdio.h>
|
63
63
|
#include <string.h>
|
@@ -72,10 +72,10 @@
|
|
72
72
|
|
73
73
|
#include "../conf/internal.h"
|
74
74
|
|
75
|
-
|
76
75
|
static char *strip_spaces(char *name);
|
77
76
|
static int sk_strcmp(const OPENSSL_STRING *a, const OPENSSL_STRING *b);
|
78
|
-
static STACK_OF(OPENSSL_STRING) *get_email(X509_NAME *name,
|
77
|
+
static STACK_OF(OPENSSL_STRING) *get_email(X509_NAME *name,
|
78
|
+
GENERAL_NAMES *gens);
|
79
79
|
static void str_free(OPENSSL_STRING str);
|
80
80
|
static int append_ia5(STACK_OF(OPENSSL_STRING) **sk, ASN1_IA5STRING *email);
|
81
81
|
|
@@ -87,1236 +87,1240 @@ static int ipv6_hex(unsigned char *out, const char *in, int inlen);
|
|
87
87
|
/* Add a CONF_VALUE name value pair to stack */
|
88
88
|
|
89
89
|
int X509V3_add_value(const char *name, const char *value,
|
90
|
-
|
90
|
+
STACK_OF(CONF_VALUE) **extlist)
|
91
91
|
{
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
92
|
+
CONF_VALUE *vtmp = NULL;
|
93
|
+
char *tname = NULL, *tvalue = NULL;
|
94
|
+
if (name && !(tname = BUF_strdup(name)))
|
95
|
+
goto err;
|
96
|
+
if (value && !(tvalue = BUF_strdup(value)))
|
97
|
+
goto err;
|
98
|
+
if (!(vtmp = CONF_VALUE_new()))
|
99
|
+
goto err;
|
100
|
+
if (!*extlist && !(*extlist = sk_CONF_VALUE_new_null()))
|
101
|
+
goto err;
|
102
|
+
vtmp->section = NULL;
|
103
|
+
vtmp->name = tname;
|
104
|
+
vtmp->value = tvalue;
|
105
|
+
if (!sk_CONF_VALUE_push(*extlist, vtmp))
|
106
|
+
goto err;
|
107
|
+
return 1;
|
108
|
+
err:
|
109
|
+
OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
|
110
|
+
if (vtmp)
|
111
|
+
OPENSSL_free(vtmp);
|
112
|
+
if (tname)
|
113
|
+
OPENSSL_free(tname);
|
114
|
+
if (tvalue)
|
115
|
+
OPENSSL_free(tvalue);
|
116
|
+
return 0;
|
109
117
|
}
|
110
118
|
|
111
119
|
int X509V3_add_value_uchar(const char *name, const unsigned char *value,
|
112
|
-
|
113
|
-
|
114
|
-
return X509V3_add_value(name,(const char *)value,extlist);
|
115
|
-
|
120
|
+
STACK_OF(CONF_VALUE) **extlist)
|
121
|
+
{
|
122
|
+
return X509V3_add_value(name, (const char *)value, extlist);
|
123
|
+
}
|
116
124
|
|
117
125
|
/* Free function for STACK_OF(CONF_VALUE) */
|
118
126
|
|
119
127
|
void X509V3_conf_free(CONF_VALUE *conf)
|
120
128
|
{
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
129
|
+
if (!conf)
|
130
|
+
return;
|
131
|
+
if (conf->name)
|
132
|
+
OPENSSL_free(conf->name);
|
133
|
+
if (conf->value)
|
134
|
+
OPENSSL_free(conf->value);
|
135
|
+
if (conf->section)
|
136
|
+
OPENSSL_free(conf->section);
|
137
|
+
OPENSSL_free(conf);
|
126
138
|
}
|
127
139
|
|
128
140
|
int X509V3_add_value_bool(const char *name, int asn1_bool,
|
129
|
-
|
141
|
+
STACK_OF(CONF_VALUE) **extlist)
|
130
142
|
{
|
131
|
-
|
132
|
-
|
143
|
+
if (asn1_bool)
|
144
|
+
return X509V3_add_value(name, "TRUE", extlist);
|
145
|
+
return X509V3_add_value(name, "FALSE", extlist);
|
133
146
|
}
|
134
147
|
|
135
148
|
int X509V3_add_value_bool_nf(char *name, int asn1_bool,
|
136
|
-
|
149
|
+
STACK_OF(CONF_VALUE) **extlist)
|
137
150
|
{
|
138
|
-
|
139
|
-
|
151
|
+
if (asn1_bool)
|
152
|
+
return X509V3_add_value(name, "TRUE", extlist);
|
153
|
+
return 1;
|
140
154
|
}
|
141
155
|
|
142
|
-
|
143
156
|
char *i2s_ASN1_ENUMERATED(X509V3_EXT_METHOD *method, ASN1_ENUMERATED *a)
|
144
157
|
{
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
158
|
+
BIGNUM *bntmp = NULL;
|
159
|
+
char *strtmp = NULL;
|
160
|
+
if (!a)
|
161
|
+
return NULL;
|
162
|
+
if (!(bntmp = ASN1_ENUMERATED_to_BN(a, NULL)) ||
|
163
|
+
!(strtmp = BN_bn2dec(bntmp)))
|
164
|
+
OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
|
165
|
+
BN_free(bntmp);
|
166
|
+
return strtmp;
|
153
167
|
}
|
154
168
|
|
155
169
|
char *i2s_ASN1_INTEGER(X509V3_EXT_METHOD *method, ASN1_INTEGER *a)
|
156
170
|
{
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
171
|
+
BIGNUM *bntmp = NULL;
|
172
|
+
char *strtmp = NULL;
|
173
|
+
if (!a)
|
174
|
+
return NULL;
|
175
|
+
if (!(bntmp = ASN1_INTEGER_to_BN(a, NULL)) ||
|
176
|
+
!(strtmp = BN_bn2dec(bntmp)))
|
177
|
+
OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
|
178
|
+
BN_free(bntmp);
|
179
|
+
return strtmp;
|
165
180
|
}
|
166
181
|
|
167
182
|
ASN1_INTEGER *s2i_ASN1_INTEGER(X509V3_EXT_METHOD *method, char *value)
|
168
183
|
{
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
184
|
+
BIGNUM *bn = NULL;
|
185
|
+
ASN1_INTEGER *aint;
|
186
|
+
int isneg, ishex;
|
187
|
+
int ret;
|
188
|
+
if (!value) {
|
189
|
+
OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_VALUE);
|
190
|
+
return 0;
|
191
|
+
}
|
192
|
+
bn = BN_new();
|
193
|
+
if (value[0] == '-') {
|
194
|
+
value++;
|
195
|
+
isneg = 1;
|
196
|
+
} else
|
197
|
+
isneg = 0;
|
198
|
+
|
199
|
+
if (value[0] == '0' && ((value[1] == 'x') || (value[1] == 'X'))) {
|
200
|
+
value += 2;
|
201
|
+
ishex = 1;
|
202
|
+
} else
|
203
|
+
ishex = 0;
|
204
|
+
|
205
|
+
if (ishex)
|
206
|
+
ret = BN_hex2bn(&bn, value);
|
207
|
+
else
|
208
|
+
ret = BN_dec2bn(&bn, value);
|
209
|
+
|
210
|
+
if (!ret || value[ret]) {
|
211
|
+
BN_free(bn);
|
212
|
+
OPENSSL_PUT_ERROR(X509V3, X509V3_R_BN_DEC2BN_ERROR);
|
213
|
+
return 0;
|
214
|
+
}
|
215
|
+
|
216
|
+
if (isneg && BN_is_zero(bn))
|
217
|
+
isneg = 0;
|
218
|
+
|
219
|
+
aint = BN_to_ASN1_INTEGER(bn, NULL);
|
220
|
+
BN_free(bn);
|
221
|
+
if (!aint) {
|
222
|
+
OPENSSL_PUT_ERROR(X509V3, X509V3_R_BN_TO_ASN1_INTEGER_ERROR);
|
223
|
+
return 0;
|
224
|
+
}
|
225
|
+
if (isneg)
|
226
|
+
aint->type |= V_ASN1_NEG;
|
227
|
+
return aint;
|
207
228
|
}
|
208
229
|
|
209
230
|
int X509V3_add_value_int(const char *name, ASN1_INTEGER *aint,
|
210
|
-
|
231
|
+
STACK_OF(CONF_VALUE) **extlist)
|
211
232
|
{
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
233
|
+
char *strtmp;
|
234
|
+
int ret;
|
235
|
+
if (!aint)
|
236
|
+
return 1;
|
237
|
+
if (!(strtmp = i2s_ASN1_INTEGER(NULL, aint)))
|
238
|
+
return 0;
|
239
|
+
ret = X509V3_add_value(name, strtmp, extlist);
|
240
|
+
OPENSSL_free(strtmp);
|
241
|
+
return ret;
|
219
242
|
}
|
220
243
|
|
221
244
|
int X509V3_get_value_bool(CONF_VALUE *value, int *asn1_bool)
|
222
245
|
{
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
246
|
+
char *btmp;
|
247
|
+
if (!(btmp = value->value))
|
248
|
+
goto err;
|
249
|
+
if (!strcmp(btmp, "TRUE") || !strcmp(btmp, "true")
|
250
|
+
|| !strcmp(btmp, "Y") || !strcmp(btmp, "y")
|
251
|
+
|| !strcmp(btmp, "YES") || !strcmp(btmp, "yes")) {
|
252
|
+
*asn1_bool = 0xff;
|
253
|
+
return 1;
|
254
|
+
} else if (!strcmp(btmp, "FALSE") || !strcmp(btmp, "false")
|
255
|
+
|| !strcmp(btmp, "N") || !strcmp(btmp, "n")
|
256
|
+
|| !strcmp(btmp, "NO") || !strcmp(btmp, "no")) {
|
257
|
+
*asn1_bool = 0;
|
258
|
+
return 1;
|
259
|
+
}
|
260
|
+
err:
|
261
|
+
OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_BOOLEAN_STRING);
|
262
|
+
X509V3_conf_err(value);
|
263
|
+
return 0;
|
240
264
|
}
|
241
265
|
|
242
266
|
int X509V3_get_value_int(CONF_VALUE *value, ASN1_INTEGER **aint)
|
243
267
|
{
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
268
|
+
ASN1_INTEGER *itmp;
|
269
|
+
if (!(itmp = s2i_ASN1_INTEGER(NULL, value->value))) {
|
270
|
+
X509V3_conf_err(value);
|
271
|
+
return 0;
|
272
|
+
}
|
273
|
+
*aint = itmp;
|
274
|
+
return 1;
|
251
275
|
}
|
252
276
|
|
253
|
-
#define HDR_NAME
|
254
|
-
#define HDR_VALUE
|
277
|
+
#define HDR_NAME 1
|
278
|
+
#define HDR_VALUE 2
|
255
279
|
|
256
|
-
|
280
|
+
/*
|
281
|
+
* #define DEBUG
|
282
|
+
*/
|
257
283
|
|
258
284
|
STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line)
|
259
285
|
{
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
286
|
+
char *p, *q, c;
|
287
|
+
char *ntmp, *vtmp;
|
288
|
+
STACK_OF(CONF_VALUE) *values = NULL;
|
289
|
+
char *linebuf;
|
290
|
+
int state;
|
291
|
+
/* We are going to modify the line so copy it first */
|
292
|
+
linebuf = BUF_strdup(line);
|
293
|
+
if (linebuf == NULL) {
|
294
|
+
OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
|
295
|
+
goto err;
|
296
|
+
}
|
297
|
+
state = HDR_NAME;
|
298
|
+
ntmp = NULL;
|
299
|
+
/* Go through all characters */
|
300
|
+
for (p = linebuf, q = linebuf; (c = *p) && (c != '\r') && (c != '\n');
|
301
|
+
p++) {
|
302
|
+
|
303
|
+
switch (state) {
|
304
|
+
case HDR_NAME:
|
305
|
+
if (c == ':') {
|
306
|
+
state = HDR_VALUE;
|
307
|
+
*p = 0;
|
308
|
+
ntmp = strip_spaces(q);
|
309
|
+
if (!ntmp) {
|
310
|
+
OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_NAME);
|
311
|
+
goto err;
|
312
|
+
}
|
313
|
+
q = p + 1;
|
314
|
+
} else if (c == ',') {
|
315
|
+
*p = 0;
|
316
|
+
ntmp = strip_spaces(q);
|
317
|
+
q = p + 1;
|
292
318
|
#if 0
|
293
|
-
|
319
|
+
printf("%s\n", ntmp);
|
294
320
|
#endif
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
321
|
+
if (!ntmp) {
|
322
|
+
OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_NAME);
|
323
|
+
goto err;
|
324
|
+
}
|
325
|
+
X509V3_add_value(ntmp, NULL, &values);
|
326
|
+
}
|
327
|
+
break;
|
328
|
+
|
329
|
+
case HDR_VALUE:
|
330
|
+
if (c == ',') {
|
331
|
+
state = HDR_NAME;
|
332
|
+
*p = 0;
|
333
|
+
vtmp = strip_spaces(q);
|
308
334
|
#if 0
|
309
|
-
|
335
|
+
printf("%s\n", ntmp);
|
310
336
|
#endif
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
337
|
+
if (!vtmp) {
|
338
|
+
OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_VALUE);
|
339
|
+
goto err;
|
340
|
+
}
|
341
|
+
X509V3_add_value(ntmp, vtmp, &values);
|
342
|
+
ntmp = NULL;
|
343
|
+
q = p + 1;
|
344
|
+
}
|
345
|
+
|
346
|
+
}
|
347
|
+
}
|
348
|
+
|
349
|
+
if (state == HDR_VALUE) {
|
350
|
+
vtmp = strip_spaces(q);
|
325
351
|
#if 0
|
326
|
-
|
352
|
+
printf("%s=%s\n", ntmp, vtmp);
|
327
353
|
#endif
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
354
|
+
if (!vtmp) {
|
355
|
+
OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_VALUE);
|
356
|
+
goto err;
|
357
|
+
}
|
358
|
+
X509V3_add_value(ntmp, vtmp, &values);
|
359
|
+
} else {
|
360
|
+
ntmp = strip_spaces(q);
|
335
361
|
#if 0
|
336
|
-
|
362
|
+
printf("%s\n", ntmp);
|
337
363
|
#endif
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
OPENSSL_free(linebuf);
|
345
|
-
return values;
|
346
|
-
|
347
|
-
err:
|
348
|
-
OPENSSL_free(linebuf);
|
349
|
-
sk_CONF_VALUE_pop_free(values, X509V3_conf_free);
|
350
|
-
return NULL;
|
364
|
+
if (!ntmp) {
|
365
|
+
OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_NAME);
|
366
|
+
goto err;
|
367
|
+
}
|
368
|
+
X509V3_add_value(ntmp, NULL, &values);
|
369
|
+
}
|
370
|
+
OPENSSL_free(linebuf);
|
371
|
+
return values;
|
372
|
+
|
373
|
+
err:
|
374
|
+
OPENSSL_free(linebuf);
|
375
|
+
sk_CONF_VALUE_pop_free(values, X509V3_conf_free);
|
376
|
+
return NULL;
|
351
377
|
|
352
378
|
}
|
353
379
|
|
354
380
|
/* Delete leading and trailing spaces from a string */
|
355
381
|
static char *strip_spaces(char *name)
|
356
382
|
{
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
383
|
+
char *p, *q;
|
384
|
+
/* Skip over leading spaces */
|
385
|
+
p = name;
|
386
|
+
while (*p && isspace((unsigned char)*p))
|
387
|
+
p++;
|
388
|
+
if (!*p)
|
389
|
+
return NULL;
|
390
|
+
q = p + strlen(p) - 1;
|
391
|
+
while ((q != p) && isspace((unsigned char)*q))
|
392
|
+
q--;
|
393
|
+
if (p != q)
|
394
|
+
q[1] = 0;
|
395
|
+
if (!*p)
|
396
|
+
return NULL;
|
397
|
+
return p;
|
367
398
|
}
|
368
399
|
|
369
400
|
/* hex string utilities */
|
370
401
|
|
371
|
-
/*
|
372
|
-
*
|
373
|
-
* @@@ (Contents of buffer are always kept in ASCII, also
|
402
|
+
/*
|
403
|
+
* Given a buffer of length 'len' return a OPENSSL_malloc'ed string with its
|
404
|
+
* hex representation @@@ (Contents of buffer are always kept in ASCII, also
|
405
|
+
* on EBCDIC machines)
|
374
406
|
*/
|
375
407
|
|
376
408
|
char *hex_to_string(const unsigned char *buffer, long len)
|
377
409
|
{
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
410
|
+
char *tmp, *q;
|
411
|
+
const unsigned char *p;
|
412
|
+
int i;
|
413
|
+
static const char hexdig[] = "0123456789ABCDEF";
|
414
|
+
if (!buffer || !len)
|
415
|
+
return NULL;
|
416
|
+
if (!(tmp = OPENSSL_malloc(len * 3 + 1))) {
|
417
|
+
OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
|
418
|
+
return NULL;
|
419
|
+
}
|
420
|
+
q = tmp;
|
421
|
+
for (i = 0, p = buffer; i < len; i++, p++) {
|
422
|
+
*q++ = hexdig[(*p >> 4) & 0xf];
|
423
|
+
*q++ = hexdig[*p & 0xf];
|
424
|
+
*q++ = ':';
|
425
|
+
}
|
426
|
+
q[-1] = 0;
|
427
|
+
|
428
|
+
return tmp;
|
396
429
|
}
|
397
430
|
|
398
|
-
/*
|
399
|
-
* a buffer
|
431
|
+
/*
|
432
|
+
* Give a string of hex digits convert to a buffer
|
400
433
|
*/
|
401
434
|
|
402
435
|
unsigned char *string_to_hex(const char *str, long *len)
|
403
436
|
{
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
437
|
+
unsigned char *hexbuf, *q;
|
438
|
+
unsigned char ch, cl, *p;
|
439
|
+
if (!str) {
|
440
|
+
OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_ARGUMENT);
|
441
|
+
return NULL;
|
442
|
+
}
|
443
|
+
if (!(hexbuf = OPENSSL_malloc(strlen(str) >> 1)))
|
444
|
+
goto err;
|
445
|
+
for (p = (unsigned char *)str, q = hexbuf; *p;) {
|
446
|
+
ch = *p++;
|
447
|
+
if (ch == ':')
|
448
|
+
continue;
|
449
|
+
cl = *p++;
|
450
|
+
if (!cl) {
|
451
|
+
OPENSSL_PUT_ERROR(X509V3, X509V3_R_ODD_NUMBER_OF_DIGITS);
|
452
|
+
OPENSSL_free(hexbuf);
|
453
|
+
return NULL;
|
454
|
+
}
|
455
|
+
if (isupper(ch))
|
456
|
+
ch = tolower(ch);
|
457
|
+
if (isupper(cl))
|
458
|
+
cl = tolower(cl);
|
459
|
+
|
460
|
+
if ((ch >= '0') && (ch <= '9'))
|
461
|
+
ch -= '0';
|
462
|
+
else if ((ch >= 'a') && (ch <= 'f'))
|
463
|
+
ch -= 'a' - 10;
|
464
|
+
else
|
465
|
+
goto badhex;
|
466
|
+
|
467
|
+
if ((cl >= '0') && (cl <= '9'))
|
468
|
+
cl -= '0';
|
469
|
+
else if ((cl >= 'a') && (cl <= 'f'))
|
470
|
+
cl -= 'a' - 10;
|
471
|
+
else
|
472
|
+
goto badhex;
|
473
|
+
|
474
|
+
*q++ = (ch << 4) | cl;
|
475
|
+
}
|
476
|
+
|
477
|
+
if (len)
|
478
|
+
*len = q - hexbuf;
|
479
|
+
|
480
|
+
return hexbuf;
|
481
|
+
|
482
|
+
err:
|
483
|
+
if (hexbuf)
|
484
|
+
OPENSSL_free(hexbuf);
|
485
|
+
OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
|
486
|
+
return NULL;
|
487
|
+
|
488
|
+
badhex:
|
489
|
+
OPENSSL_free(hexbuf);
|
490
|
+
OPENSSL_PUT_ERROR(X509V3, X509V3_R_ILLEGAL_HEX_DIGIT);
|
491
|
+
return NULL;
|
447
492
|
|
448
493
|
}
|
449
494
|
|
450
|
-
/*
|
451
|
-
* cmp or cmp.*
|
495
|
+
/*
|
496
|
+
* V2I name comparison function: returns zero if 'name' matches cmp or cmp.*
|
452
497
|
*/
|
453
498
|
|
454
499
|
int name_cmp(const char *name, const char *cmp)
|
455
500
|
{
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
501
|
+
int len, ret;
|
502
|
+
char c;
|
503
|
+
len = strlen(cmp);
|
504
|
+
if ((ret = strncmp(name, cmp, len)))
|
505
|
+
return ret;
|
506
|
+
c = name[len];
|
507
|
+
if (!c || (c == '.'))
|
508
|
+
return 0;
|
509
|
+
return 1;
|
463
510
|
}
|
464
511
|
|
465
512
|
static int sk_strcmp(const OPENSSL_STRING *a, const OPENSSL_STRING *b)
|
466
513
|
{
|
467
|
-
|
514
|
+
return strcmp(*a, *b);
|
468
515
|
}
|
469
516
|
|
470
517
|
STACK_OF(OPENSSL_STRING) *X509_get1_email(X509 *x)
|
471
518
|
{
|
472
|
-
|
473
|
-
|
519
|
+
GENERAL_NAMES *gens;
|
520
|
+
STACK_OF(OPENSSL_STRING) *ret;
|
474
521
|
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
522
|
+
gens = X509_get_ext_d2i(x, NID_subject_alt_name, NULL, NULL);
|
523
|
+
ret = get_email(X509_get_subject_name(x), gens);
|
524
|
+
sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
|
525
|
+
return ret;
|
479
526
|
}
|
480
527
|
|
481
528
|
STACK_OF(OPENSSL_STRING) *X509_get1_ocsp(X509 *x)
|
482
529
|
{
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
AUTHORITY_INFO_ACCESS_free(info);
|
503
|
-
return ret;
|
530
|
+
AUTHORITY_INFO_ACCESS *info;
|
531
|
+
STACK_OF(OPENSSL_STRING) *ret = NULL;
|
532
|
+
size_t i;
|
533
|
+
|
534
|
+
info = X509_get_ext_d2i(x, NID_info_access, NULL, NULL);
|
535
|
+
if (!info)
|
536
|
+
return NULL;
|
537
|
+
for (i = 0; i < sk_ACCESS_DESCRIPTION_num(info); i++) {
|
538
|
+
ACCESS_DESCRIPTION *ad = sk_ACCESS_DESCRIPTION_value(info, i);
|
539
|
+
if (OBJ_obj2nid(ad->method) == NID_ad_OCSP) {
|
540
|
+
if (ad->location->type == GEN_URI) {
|
541
|
+
if (!append_ia5
|
542
|
+
(&ret, ad->location->d.uniformResourceIdentifier))
|
543
|
+
break;
|
544
|
+
}
|
545
|
+
}
|
546
|
+
}
|
547
|
+
AUTHORITY_INFO_ACCESS_free(info);
|
548
|
+
return ret;
|
504
549
|
}
|
505
550
|
|
506
551
|
STACK_OF(OPENSSL_STRING) *X509_REQ_get1_email(X509_REQ *x)
|
507
552
|
{
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
553
|
+
GENERAL_NAMES *gens;
|
554
|
+
STACK_OF(X509_EXTENSION) *exts;
|
555
|
+
STACK_OF(OPENSSL_STRING) *ret;
|
556
|
+
|
557
|
+
exts = X509_REQ_get_extensions(x);
|
558
|
+
gens = X509V3_get_d2i(exts, NID_subject_alt_name, NULL, NULL);
|
559
|
+
ret = get_email(X509_REQ_get_subject_name(x), gens);
|
560
|
+
sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
|
561
|
+
sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free);
|
562
|
+
return ret;
|
518
563
|
}
|
519
564
|
|
520
|
-
|
521
|
-
|
565
|
+
static STACK_OF(OPENSSL_STRING) *get_email(X509_NAME *name,
|
566
|
+
GENERAL_NAMES *gens)
|
522
567
|
{
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
568
|
+
STACK_OF(OPENSSL_STRING) *ret = NULL;
|
569
|
+
X509_NAME_ENTRY *ne;
|
570
|
+
ASN1_IA5STRING *email;
|
571
|
+
GENERAL_NAME *gen;
|
572
|
+
int i;
|
573
|
+
size_t j;
|
574
|
+
/* Now add any email address(es) to STACK */
|
575
|
+
i = -1;
|
576
|
+
/* First supplied X509_NAME */
|
577
|
+
while ((i = X509_NAME_get_index_by_NID(name,
|
578
|
+
NID_pkcs9_emailAddress, i)) >= 0) {
|
579
|
+
ne = X509_NAME_get_entry(name, i);
|
580
|
+
email = X509_NAME_ENTRY_get_data(ne);
|
581
|
+
if (!append_ia5(&ret, email))
|
582
|
+
return NULL;
|
583
|
+
}
|
584
|
+
for (j = 0; j < sk_GENERAL_NAME_num(gens); j++) {
|
585
|
+
gen = sk_GENERAL_NAME_value(gens, j);
|
586
|
+
if (gen->type != GEN_EMAIL)
|
587
|
+
continue;
|
588
|
+
if (!append_ia5(&ret, gen->d.ia5))
|
589
|
+
return NULL;
|
590
|
+
}
|
591
|
+
return ret;
|
545
592
|
}
|
546
593
|
|
547
594
|
static void str_free(OPENSSL_STRING str)
|
548
595
|
{
|
549
|
-
|
596
|
+
OPENSSL_free(str);
|
550
597
|
}
|
551
598
|
|
552
599
|
static int append_ia5(STACK_OF(OPENSSL_STRING) **sk, ASN1_IA5STRING *email)
|
553
600
|
{
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
601
|
+
char *emtmp;
|
602
|
+
/* First some sanity checks */
|
603
|
+
if (email->type != V_ASN1_IA5STRING)
|
604
|
+
return 1;
|
605
|
+
if (!email->data || !email->length)
|
606
|
+
return 1;
|
607
|
+
if (!*sk)
|
608
|
+
*sk = sk_OPENSSL_STRING_new(sk_strcmp);
|
609
|
+
if (!*sk)
|
610
|
+
return 0;
|
611
|
+
/* Don't add duplicates */
|
612
|
+
if (sk_OPENSSL_STRING_find(*sk, NULL, (char *)email->data))
|
613
|
+
return 1;
|
614
|
+
emtmp = BUF_strdup((char *)email->data);
|
615
|
+
if (!emtmp || !sk_OPENSSL_STRING_push(*sk, emtmp)) {
|
616
|
+
X509_email_free(*sk);
|
617
|
+
*sk = NULL;
|
618
|
+
return 0;
|
619
|
+
}
|
620
|
+
return 1;
|
569
621
|
}
|
570
622
|
|
571
623
|
void X509_email_free(STACK_OF(OPENSSL_STRING) *sk)
|
572
624
|
{
|
573
|
-
|
625
|
+
sk_OPENSSL_STRING_pop_free(sk, str_free);
|
574
626
|
}
|
575
627
|
|
576
|
-
typedef int (*equal_fn)(const unsigned char *pattern, size_t pattern_len,
|
577
|
-
|
578
|
-
|
628
|
+
typedef int (*equal_fn) (const unsigned char *pattern, size_t pattern_len,
|
629
|
+
const unsigned char *subject, size_t subject_len,
|
630
|
+
unsigned int flags);
|
579
631
|
|
580
632
|
/* Skip pattern prefix to match "wildcard" subject */
|
581
633
|
static void skip_prefix(const unsigned char **p, size_t *plen,
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
|
592
|
-
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
|
604
|
-
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
|
609
|
-
|
610
|
-
|
611
|
-
}
|
612
|
-
}
|
634
|
+
const unsigned char *subject, size_t subject_len,
|
635
|
+
unsigned int flags)
|
636
|
+
{
|
637
|
+
const unsigned char *pattern = *p;
|
638
|
+
size_t pattern_len = *plen;
|
639
|
+
|
640
|
+
/*
|
641
|
+
* If subject starts with a leading '.' followed by more octets, and
|
642
|
+
* pattern is longer, compare just an equal-length suffix with the
|
643
|
+
* full subject (starting at the '.'), provided the prefix contains
|
644
|
+
* no NULs.
|
645
|
+
*/
|
646
|
+
if ((flags & _X509_CHECK_FLAG_DOT_SUBDOMAINS) == 0)
|
647
|
+
return;
|
648
|
+
|
649
|
+
while (pattern_len > subject_len && *pattern) {
|
650
|
+
if ((flags & X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS) &&
|
651
|
+
*pattern == '.')
|
652
|
+
break;
|
653
|
+
++pattern;
|
654
|
+
--pattern_len;
|
655
|
+
}
|
656
|
+
|
657
|
+
/* Skip if entire prefix acceptable */
|
658
|
+
if (pattern_len == subject_len) {
|
659
|
+
*p = pattern;
|
660
|
+
*plen = pattern_len;
|
661
|
+
}
|
662
|
+
}
|
613
663
|
|
614
664
|
/* Compare while ASCII ignoring case. */
|
615
665
|
static int equal_nocase(const unsigned char *pattern, size_t pattern_len,
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
|
633
|
-
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
return 1;
|
643
|
-
}
|
666
|
+
const unsigned char *subject, size_t subject_len,
|
667
|
+
unsigned int flags)
|
668
|
+
{
|
669
|
+
skip_prefix(&pattern, &pattern_len, subject, subject_len, flags);
|
670
|
+
if (pattern_len != subject_len)
|
671
|
+
return 0;
|
672
|
+
while (pattern_len) {
|
673
|
+
unsigned char l = *pattern;
|
674
|
+
unsigned char r = *subject;
|
675
|
+
/* The pattern must not contain NUL characters. */
|
676
|
+
if (l == 0)
|
677
|
+
return 0;
|
678
|
+
if (l != r) {
|
679
|
+
if ('A' <= l && l <= 'Z')
|
680
|
+
l = (l - 'A') + 'a';
|
681
|
+
if ('A' <= r && r <= 'Z')
|
682
|
+
r = (r - 'A') + 'a';
|
683
|
+
if (l != r)
|
684
|
+
return 0;
|
685
|
+
}
|
686
|
+
++pattern;
|
687
|
+
++subject;
|
688
|
+
--pattern_len;
|
689
|
+
}
|
690
|
+
return 1;
|
691
|
+
}
|
644
692
|
|
645
693
|
/* Compare using memcmp. */
|
646
694
|
static int equal_case(const unsigned char *pattern, size_t pattern_len,
|
647
|
-
|
648
|
-
|
695
|
+
const unsigned char *subject, size_t subject_len,
|
696
|
+
unsigned int flags)
|
649
697
|
{
|
650
|
-
|
651
|
-
|
652
|
-
|
653
|
-
|
698
|
+
skip_prefix(&pattern, &pattern_len, subject, subject_len, flags);
|
699
|
+
if (pattern_len != subject_len)
|
700
|
+
return 0;
|
701
|
+
return !memcmp(pattern, subject, pattern_len);
|
654
702
|
}
|
655
703
|
|
656
|
-
/*
|
657
|
-
|
704
|
+
/*
|
705
|
+
* RFC 5280, section 7.5, requires that only the domain is compared in a
|
706
|
+
* case-insensitive manner.
|
707
|
+
*/
|
658
708
|
static int equal_email(const unsigned char *a, size_t a_len,
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
709
|
+
const unsigned char *b, size_t b_len,
|
710
|
+
unsigned int unused_flags)
|
711
|
+
{
|
712
|
+
size_t i = a_len;
|
713
|
+
if (a_len != b_len)
|
714
|
+
return 0;
|
715
|
+
/*
|
716
|
+
* We search backwards for the '@' character, so that we do not have to
|
717
|
+
* deal with quoted local-parts. The domain part is compared in a
|
718
|
+
* case-insensitive manner.
|
719
|
+
*/
|
720
|
+
while (i > 0) {
|
721
|
+
--i;
|
722
|
+
if (a[i] == '@' || b[i] == '@') {
|
723
|
+
if (!equal_nocase(a + i, a_len - i, b + i, a_len - i, 0))
|
724
|
+
return 0;
|
725
|
+
break;
|
726
|
+
}
|
727
|
+
}
|
728
|
+
if (i == 0)
|
729
|
+
i = a_len;
|
730
|
+
return equal_case(a, i, b, i, 0);
|
731
|
+
}
|
732
|
+
|
733
|
+
/*
|
734
|
+
* Compare the prefix and suffix with the subject, and check that the
|
735
|
+
* characters in-between are valid.
|
736
|
+
*/
|
686
737
|
static int wildcard_match(const unsigned char *prefix, size_t prefix_len,
|
687
|
-
|
688
|
-
|
689
|
-
|
690
|
-
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
|
696
|
-
|
697
|
-
|
698
|
-
|
699
|
-
|
700
|
-
|
701
|
-
|
702
|
-
|
703
|
-
|
704
|
-
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
|
709
|
-
|
710
|
-
|
711
|
-
|
712
|
-
|
713
|
-
|
714
|
-
|
715
|
-
|
716
|
-
|
717
|
-
|
718
|
-
|
719
|
-
|
720
|
-
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
|
725
|
-
|
726
|
-
|
727
|
-
|
728
|
-
|
729
|
-
|
730
|
-
|
731
|
-
|
732
|
-
|
733
|
-
|
734
|
-
|
735
|
-
|
736
|
-
|
737
|
-
|
738
|
-
#define LABEL_START
|
739
|
-
#define LABEL_END
|
740
|
-
#define LABEL_HYPHEN
|
741
|
-
#define LABEL_IDNA
|
738
|
+
const unsigned char *suffix, size_t suffix_len,
|
739
|
+
const unsigned char *subject, size_t subject_len,
|
740
|
+
unsigned int flags)
|
741
|
+
{
|
742
|
+
const unsigned char *wildcard_start;
|
743
|
+
const unsigned char *wildcard_end;
|
744
|
+
const unsigned char *p;
|
745
|
+
int allow_multi = 0;
|
746
|
+
int allow_idna = 0;
|
747
|
+
|
748
|
+
if (subject_len < prefix_len + suffix_len)
|
749
|
+
return 0;
|
750
|
+
if (!equal_nocase(prefix, prefix_len, subject, prefix_len, flags))
|
751
|
+
return 0;
|
752
|
+
wildcard_start = subject + prefix_len;
|
753
|
+
wildcard_end = subject + (subject_len - suffix_len);
|
754
|
+
if (!equal_nocase(wildcard_end, suffix_len, suffix, suffix_len, flags))
|
755
|
+
return 0;
|
756
|
+
/*
|
757
|
+
* If the wildcard makes up the entire first label, it must match at
|
758
|
+
* least one character.
|
759
|
+
*/
|
760
|
+
if (prefix_len == 0 && *suffix == '.') {
|
761
|
+
if (wildcard_start == wildcard_end)
|
762
|
+
return 0;
|
763
|
+
allow_idna = 1;
|
764
|
+
if (flags & X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS)
|
765
|
+
allow_multi = 1;
|
766
|
+
}
|
767
|
+
/* IDNA labels cannot match partial wildcards */
|
768
|
+
if (!allow_idna &&
|
769
|
+
subject_len >= 4
|
770
|
+
&& OPENSSL_strncasecmp((char *)subject, "xn--", 4) == 0)
|
771
|
+
return 0;
|
772
|
+
/* The wildcard may match a literal '*' */
|
773
|
+
if (wildcard_end == wildcard_start + 1 && *wildcard_start == '*')
|
774
|
+
return 1;
|
775
|
+
/*
|
776
|
+
* Check that the part matched by the wildcard contains only
|
777
|
+
* permitted characters and only matches a single label unless
|
778
|
+
* allow_multi is set.
|
779
|
+
*/
|
780
|
+
for (p = wildcard_start; p != wildcard_end; ++p)
|
781
|
+
if (!(('0' <= *p && *p <= '9') ||
|
782
|
+
('A' <= *p && *p <= 'Z') ||
|
783
|
+
('a' <= *p && *p <= 'z') ||
|
784
|
+
*p == '-' || (allow_multi && *p == '.')))
|
785
|
+
return 0;
|
786
|
+
return 1;
|
787
|
+
}
|
788
|
+
|
789
|
+
#define LABEL_START (1 << 0)
|
790
|
+
#define LABEL_END (1 << 1)
|
791
|
+
#define LABEL_HYPHEN (1 << 2)
|
792
|
+
#define LABEL_IDNA (1 << 3)
|
742
793
|
|
743
794
|
static const unsigned char *valid_star(const unsigned char *p, size_t len,
|
744
|
-
|
745
|
-
|
746
|
-
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
|
751
|
-
|
752
|
-
|
753
|
-
|
754
|
-
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
|
759
|
-
|
760
|
-
|
761
|
-
|
762
|
-
|
763
|
-
|
764
|
-
|
765
|
-
|
766
|
-
|
767
|
-
|
768
|
-
|
769
|
-
|
770
|
-
|
771
|
-
|
772
|
-
|
773
|
-
|
774
|
-
|
775
|
-
|
776
|
-
|
777
|
-
|
778
|
-
|
779
|
-
|
780
|
-
|
781
|
-
|
782
|
-
|
783
|
-
|
784
|
-
|
785
|
-
|
786
|
-
|
787
|
-
|
788
|
-
|
789
|
-
|
790
|
-
|
791
|
-
|
792
|
-
|
793
|
-
|
794
|
-
|
795
|
-
|
796
|
-
|
797
|
-
|
798
|
-
|
799
|
-
|
800
|
-
|
801
|
-
|
802
|
-
|
803
|
-
|
804
|
-
|
805
|
-
|
806
|
-
|
807
|
-
|
808
|
-
|
809
|
-
|
810
|
-
|
811
|
-
|
812
|
-
|
813
|
-
|
814
|
-
|
815
|
-
|
816
|
-
|
817
|
-
|
818
|
-
|
819
|
-
else
|
820
|
-
return NULL;
|
821
|
-
}
|
822
|
-
|
823
|
-
/*
|
824
|
-
* The final label must not end in a hyphen or ".", and
|
825
|
-
* there must be at least two dots after the star.
|
826
|
-
*/
|
827
|
-
if ((state & (LABEL_START | LABEL_HYPHEN)) != 0
|
828
|
-
|| dots < 2)
|
829
|
-
return NULL;
|
830
|
-
return star;
|
831
|
-
}
|
795
|
+
unsigned int flags)
|
796
|
+
{
|
797
|
+
const unsigned char *star = 0;
|
798
|
+
size_t i;
|
799
|
+
int state = LABEL_START;
|
800
|
+
int dots = 0;
|
801
|
+
for (i = 0; i < len; ++i) {
|
802
|
+
/*
|
803
|
+
* Locate first and only legal wildcard, either at the start
|
804
|
+
* or end of a non-IDNA first and not final label.
|
805
|
+
*/
|
806
|
+
if (p[i] == '*') {
|
807
|
+
int atstart = (state & LABEL_START);
|
808
|
+
int atend = (i == len - 1 || p[i + 1] == '.');
|
809
|
+
/*
|
810
|
+
* At most one wildcard per pattern.
|
811
|
+
* No wildcards in IDNA labels.
|
812
|
+
* No wildcards after the first label.
|
813
|
+
*/
|
814
|
+
if (star != NULL || (state & LABEL_IDNA) != 0 || dots)
|
815
|
+
return NULL;
|
816
|
+
/* Only full-label '*.example.com' wildcards? */
|
817
|
+
if ((flags & X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS)
|
818
|
+
&& (!atstart || !atend))
|
819
|
+
return NULL;
|
820
|
+
/* No 'foo*bar' wildcards */
|
821
|
+
if (!atstart && !atend)
|
822
|
+
return NULL;
|
823
|
+
star = &p[i];
|
824
|
+
state &= ~LABEL_START;
|
825
|
+
} else if ((state & LABEL_START) != 0) {
|
826
|
+
/*
|
827
|
+
* At the start of a label, skip any "xn--" and
|
828
|
+
* remain in the LABEL_START state, but set the
|
829
|
+
* IDNA label state
|
830
|
+
*/
|
831
|
+
if ((state & LABEL_IDNA) == 0 && len - i >= 4
|
832
|
+
&& OPENSSL_strncasecmp((char *)&p[i], "xn--", 4) == 0) {
|
833
|
+
i += 3;
|
834
|
+
state |= LABEL_IDNA;
|
835
|
+
continue;
|
836
|
+
}
|
837
|
+
/* Labels must start with a letter or digit */
|
838
|
+
state &= ~LABEL_START;
|
839
|
+
if (('a' <= p[i] && p[i] <= 'z')
|
840
|
+
|| ('A' <= p[i] && p[i] <= 'Z')
|
841
|
+
|| ('0' <= p[i] && p[i] <= '9'))
|
842
|
+
continue;
|
843
|
+
return NULL;
|
844
|
+
} else if (('a' <= p[i] && p[i] <= 'z')
|
845
|
+
|| ('A' <= p[i] && p[i] <= 'Z')
|
846
|
+
|| ('0' <= p[i] && p[i] <= '9')) {
|
847
|
+
state &= LABEL_IDNA;
|
848
|
+
continue;
|
849
|
+
} else if (p[i] == '.') {
|
850
|
+
if (state & (LABEL_HYPHEN | LABEL_START))
|
851
|
+
return NULL;
|
852
|
+
state = LABEL_START;
|
853
|
+
++dots;
|
854
|
+
} else if (p[i] == '-') {
|
855
|
+
if (state & LABEL_HYPHEN)
|
856
|
+
return NULL;
|
857
|
+
state |= LABEL_HYPHEN;
|
858
|
+
} else
|
859
|
+
return NULL;
|
860
|
+
}
|
861
|
+
|
862
|
+
/*
|
863
|
+
* The final label must not end in a hyphen or ".", and
|
864
|
+
* there must be at least two dots after the star.
|
865
|
+
*/
|
866
|
+
if ((state & (LABEL_START | LABEL_HYPHEN)) != 0 || dots < 2)
|
867
|
+
return NULL;
|
868
|
+
return star;
|
869
|
+
}
|
832
870
|
|
833
871
|
/* Compare using wildcards. */
|
834
872
|
static int equal_wildcard(const unsigned char *pattern, size_t pattern_len,
|
835
|
-
|
836
|
-
|
837
|
-
|
838
|
-
|
839
|
-
|
840
|
-
|
841
|
-
|
842
|
-
|
843
|
-
|
844
|
-
|
845
|
-
|
846
|
-
|
847
|
-
|
848
|
-
|
849
|
-
|
850
|
-
|
851
|
-
|
852
|
-
|
853
|
-
|
854
|
-
/*
|
855
|
-
*
|
856
|
-
* type, otherwise convert it
|
873
|
+
const unsigned char *subject, size_t subject_len,
|
874
|
+
unsigned int flags)
|
875
|
+
{
|
876
|
+
const unsigned char *star = NULL;
|
877
|
+
|
878
|
+
/*
|
879
|
+
* Subject names starting with '.' can only match a wildcard pattern
|
880
|
+
* via a subject sub-domain pattern suffix match.
|
881
|
+
*/
|
882
|
+
if (!(subject_len > 1 && subject[0] == '.'))
|
883
|
+
star = valid_star(pattern, pattern_len, flags);
|
884
|
+
if (star == NULL)
|
885
|
+
return equal_nocase(pattern, pattern_len,
|
886
|
+
subject, subject_len, flags);
|
887
|
+
return wildcard_match(pattern, star - pattern,
|
888
|
+
star + 1, (pattern + pattern_len) - star - 1,
|
889
|
+
subject, subject_len, flags);
|
890
|
+
}
|
891
|
+
|
892
|
+
/*
|
893
|
+
* Compare an ASN1_STRING to a supplied string. If they match return 1. If
|
894
|
+
* cmp_type > 0 only compare if string matches the type, otherwise convert it
|
895
|
+
* to UTF8.
|
857
896
|
*/
|
858
897
|
|
859
898
|
static int do_check_string(ASN1_STRING *a, int cmp_type, equal_fn equal,
|
860
|
-
|
861
|
-
|
862
|
-
|
863
|
-
|
864
|
-
|
865
|
-
|
866
|
-
|
867
|
-
|
868
|
-
|
869
|
-
|
870
|
-
|
871
|
-
|
872
|
-
|
873
|
-
|
874
|
-
|
875
|
-
|
876
|
-
|
877
|
-
|
878
|
-
|
879
|
-
|
880
|
-
|
881
|
-
|
882
|
-
|
883
|
-
|
884
|
-
|
885
|
-
|
886
|
-
|
887
|
-
|
888
|
-
|
889
|
-
OPENSSL_free(astr);
|
890
|
-
}
|
891
|
-
return rv;
|
892
|
-
}
|
899
|
+
unsigned int flags, const char *b, size_t blen,
|
900
|
+
char **peername)
|
901
|
+
{
|
902
|
+
int rv = 0;
|
903
|
+
|
904
|
+
if (!a->data || !a->length)
|
905
|
+
return 0;
|
906
|
+
if (cmp_type > 0) {
|
907
|
+
if (cmp_type != a->type)
|
908
|
+
return 0;
|
909
|
+
if (cmp_type == V_ASN1_IA5STRING)
|
910
|
+
rv = equal(a->data, a->length, (unsigned char *)b, blen, flags);
|
911
|
+
else if (a->length == (int)blen && !memcmp(a->data, b, blen))
|
912
|
+
rv = 1;
|
913
|
+
if (rv > 0 && peername)
|
914
|
+
*peername = BUF_strndup((char *)a->data, a->length);
|
915
|
+
} else {
|
916
|
+
int astrlen;
|
917
|
+
unsigned char *astr;
|
918
|
+
astrlen = ASN1_STRING_to_UTF8(&astr, a);
|
919
|
+
if (astrlen < 0)
|
920
|
+
return -1;
|
921
|
+
rv = equal(astr, astrlen, (unsigned char *)b, blen, flags);
|
922
|
+
if (rv > 0 && peername)
|
923
|
+
*peername = BUF_strndup((char *)astr, astrlen);
|
924
|
+
OPENSSL_free(astr);
|
925
|
+
}
|
926
|
+
return rv;
|
927
|
+
}
|
893
928
|
|
894
929
|
static int do_x509_check(X509 *x, const char *chk, size_t chklen,
|
895
|
-
|
896
|
-
|
897
|
-
|
898
|
-
|
899
|
-
|
900
|
-
|
901
|
-
|
902
|
-
|
903
|
-
|
904
|
-
|
905
|
-
|
906
|
-
|
907
|
-
|
908
|
-
|
909
|
-
|
910
|
-
|
911
|
-
|
912
|
-
|
913
|
-
|
914
|
-
|
915
|
-
|
916
|
-
|
917
|
-
|
918
|
-
|
919
|
-
|
920
|
-
|
921
|
-
|
922
|
-
|
923
|
-
|
924
|
-
|
925
|
-
|
926
|
-
|
927
|
-
|
928
|
-
|
929
|
-
|
930
|
-
|
931
|
-
|
932
|
-
|
933
|
-
|
934
|
-
|
935
|
-
|
936
|
-
|
937
|
-
|
938
|
-
|
939
|
-
|
940
|
-
|
941
|
-
|
942
|
-
|
943
|
-
|
944
|
-
|
945
|
-
|
946
|
-
|
947
|
-
|
948
|
-
|
949
|
-
|
950
|
-
|
951
|
-
|
952
|
-
|
953
|
-
|
954
|
-
|
955
|
-
|
956
|
-
|
957
|
-
|
958
|
-
|
959
|
-
|
960
|
-
|
961
|
-
|
962
|
-
|
963
|
-
|
964
|
-
|
965
|
-
|
966
|
-
|
967
|
-
|
968
|
-
|
969
|
-
|
970
|
-
|
971
|
-
|
972
|
-
|
973
|
-
|
974
|
-
|
975
|
-
ne = X509_NAME_get_entry(name, j);
|
976
|
-
str = X509_NAME_ENTRY_get_data(ne);
|
977
|
-
/* Positive on success, negative on error! */
|
978
|
-
if ((rv = do_check_string(str, -1, equal, flags,
|
979
|
-
chk, chklen, peername)) != 0)
|
980
|
-
return rv;
|
981
|
-
}
|
982
|
-
return 0;
|
983
|
-
}
|
930
|
+
unsigned int flags, int check_type, char **peername)
|
931
|
+
{
|
932
|
+
GENERAL_NAMES *gens = NULL;
|
933
|
+
X509_NAME *name = NULL;
|
934
|
+
size_t i;
|
935
|
+
int j;
|
936
|
+
int cnid = NID_undef;
|
937
|
+
int alt_type;
|
938
|
+
int san_present = 0;
|
939
|
+
int rv = 0;
|
940
|
+
equal_fn equal;
|
941
|
+
|
942
|
+
/* See below, this flag is internal-only */
|
943
|
+
flags &= ~_X509_CHECK_FLAG_DOT_SUBDOMAINS;
|
944
|
+
if (check_type == GEN_EMAIL) {
|
945
|
+
cnid = NID_pkcs9_emailAddress;
|
946
|
+
alt_type = V_ASN1_IA5STRING;
|
947
|
+
equal = equal_email;
|
948
|
+
} else if (check_type == GEN_DNS) {
|
949
|
+
cnid = NID_commonName;
|
950
|
+
/* Implicit client-side DNS sub-domain pattern */
|
951
|
+
if (chklen > 1 && chk[0] == '.')
|
952
|
+
flags |= _X509_CHECK_FLAG_DOT_SUBDOMAINS;
|
953
|
+
alt_type = V_ASN1_IA5STRING;
|
954
|
+
if (flags & X509_CHECK_FLAG_NO_WILDCARDS)
|
955
|
+
equal = equal_nocase;
|
956
|
+
else
|
957
|
+
equal = equal_wildcard;
|
958
|
+
} else {
|
959
|
+
alt_type = V_ASN1_OCTET_STRING;
|
960
|
+
equal = equal_case;
|
961
|
+
}
|
962
|
+
|
963
|
+
gens = X509_get_ext_d2i(x, NID_subject_alt_name, NULL, NULL);
|
964
|
+
if (gens) {
|
965
|
+
for (i = 0; i < sk_GENERAL_NAME_num(gens); i++) {
|
966
|
+
GENERAL_NAME *gen;
|
967
|
+
ASN1_STRING *cstr;
|
968
|
+
gen = sk_GENERAL_NAME_value(gens, i);
|
969
|
+
if (gen->type != check_type)
|
970
|
+
continue;
|
971
|
+
san_present = 1;
|
972
|
+
if (check_type == GEN_EMAIL)
|
973
|
+
cstr = gen->d.rfc822Name;
|
974
|
+
else if (check_type == GEN_DNS)
|
975
|
+
cstr = gen->d.dNSName;
|
976
|
+
else
|
977
|
+
cstr = gen->d.iPAddress;
|
978
|
+
/* Positive on success, negative on error! */
|
979
|
+
if ((rv = do_check_string(cstr, alt_type, equal, flags,
|
980
|
+
chk, chklen, peername)) != 0)
|
981
|
+
break;
|
982
|
+
}
|
983
|
+
GENERAL_NAMES_free(gens);
|
984
|
+
if (rv != 0)
|
985
|
+
return rv;
|
986
|
+
if (cnid == NID_undef
|
987
|
+
|| (san_present
|
988
|
+
&& !(flags & X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT)))
|
989
|
+
return 0;
|
990
|
+
}
|
991
|
+
|
992
|
+
/* We're done if CN-ID is not pertinent */
|
993
|
+
if (cnid == NID_undef)
|
994
|
+
return 0;
|
995
|
+
|
996
|
+
j = -1;
|
997
|
+
name = X509_get_subject_name(x);
|
998
|
+
while ((j = X509_NAME_get_index_by_NID(name, cnid, j)) >= 0) {
|
999
|
+
X509_NAME_ENTRY *ne;
|
1000
|
+
ASN1_STRING *str;
|
1001
|
+
ne = X509_NAME_get_entry(name, j);
|
1002
|
+
str = X509_NAME_ENTRY_get_data(ne);
|
1003
|
+
/* Positive on success, negative on error! */
|
1004
|
+
if ((rv = do_check_string(str, -1, equal, flags,
|
1005
|
+
chk, chklen, peername)) != 0)
|
1006
|
+
return rv;
|
1007
|
+
}
|
1008
|
+
return 0;
|
1009
|
+
}
|
984
1010
|
|
985
1011
|
int X509_check_host(X509 *x, const char *chk, size_t chklen,
|
986
|
-
|
987
|
-
|
988
|
-
|
989
|
-
|
990
|
-
|
991
|
-
|
992
|
-
|
993
|
-
|
1012
|
+
unsigned int flags, char **peername)
|
1013
|
+
{
|
1014
|
+
if (chk == NULL)
|
1015
|
+
return -2;
|
1016
|
+
if (memchr(chk, '\0', chklen))
|
1017
|
+
return -2;
|
1018
|
+
return do_x509_check(x, chk, chklen, flags, GEN_DNS, peername);
|
1019
|
+
}
|
994
1020
|
|
995
1021
|
int X509_check_email(X509 *x, const char *chk, size_t chklen,
|
996
|
-
|
997
|
-
|
998
|
-
|
999
|
-
|
1000
|
-
|
1001
|
-
|
1002
|
-
|
1003
|
-
|
1022
|
+
unsigned int flags)
|
1023
|
+
{
|
1024
|
+
if (chk == NULL)
|
1025
|
+
return -2;
|
1026
|
+
if (memchr(chk, '\0', chklen))
|
1027
|
+
return -2;
|
1028
|
+
return do_x509_check(x, chk, chklen, flags, GEN_EMAIL, NULL);
|
1029
|
+
}
|
1004
1030
|
|
1005
1031
|
int X509_check_ip(X509 *x, const unsigned char *chk, size_t chklen,
|
1006
|
-
|
1007
|
-
|
1008
|
-
|
1009
|
-
|
1010
|
-
|
1011
|
-
|
1032
|
+
unsigned int flags)
|
1033
|
+
{
|
1034
|
+
if (chk == NULL)
|
1035
|
+
return -2;
|
1036
|
+
return do_x509_check(x, (char *)chk, chklen, flags, GEN_IPADD, NULL);
|
1037
|
+
}
|
1012
1038
|
|
1013
1039
|
int X509_check_ip_asc(X509 *x, const char *ipasc, unsigned int flags)
|
1014
|
-
|
1015
|
-
|
1016
|
-
|
1017
|
-
|
1018
|
-
|
1019
|
-
|
1020
|
-
|
1021
|
-
|
1022
|
-
|
1023
|
-
|
1024
|
-
|
1025
|
-
|
1026
|
-
/*
|
1027
|
-
* OCTET STRING compatible
|
1040
|
+
{
|
1041
|
+
unsigned char ipout[16];
|
1042
|
+
size_t iplen;
|
1043
|
+
|
1044
|
+
if (ipasc == NULL)
|
1045
|
+
return -2;
|
1046
|
+
iplen = (size_t)a2i_ipadd(ipout, ipasc);
|
1047
|
+
if (iplen == 0)
|
1048
|
+
return -2;
|
1049
|
+
return do_x509_check(x, (char *)ipout, iplen, flags, GEN_IPADD, NULL);
|
1050
|
+
}
|
1051
|
+
|
1052
|
+
/*
|
1053
|
+
* Convert IP addresses both IPv4 and IPv6 into an OCTET STRING compatible
|
1054
|
+
* with RFC3280.
|
1028
1055
|
*/
|
1029
1056
|
|
1030
1057
|
ASN1_OCTET_STRING *a2i_IPADDRESS(const char *ipasc)
|
1031
|
-
|
1032
|
-
|
1033
|
-
|
1034
|
-
|
1058
|
+
{
|
1059
|
+
unsigned char ipout[16];
|
1060
|
+
ASN1_OCTET_STRING *ret;
|
1061
|
+
int iplen;
|
1035
1062
|
|
1036
|
-
|
1063
|
+
/* If string contains a ':' assume IPv6 */
|
1037
1064
|
|
1038
|
-
|
1065
|
+
iplen = a2i_ipadd(ipout, ipasc);
|
1039
1066
|
|
1040
|
-
|
1041
|
-
|
1067
|
+
if (!iplen)
|
1068
|
+
return NULL;
|
1042
1069
|
|
1043
|
-
|
1044
|
-
|
1045
|
-
|
1046
|
-
|
1047
|
-
|
1048
|
-
|
1049
|
-
|
1050
|
-
|
1051
|
-
|
1052
|
-
}
|
1070
|
+
ret = ASN1_OCTET_STRING_new();
|
1071
|
+
if (!ret)
|
1072
|
+
return NULL;
|
1073
|
+
if (!ASN1_OCTET_STRING_set(ret, ipout, iplen)) {
|
1074
|
+
ASN1_OCTET_STRING_free(ret);
|
1075
|
+
return NULL;
|
1076
|
+
}
|
1077
|
+
return ret;
|
1078
|
+
}
|
1053
1079
|
|
1054
1080
|
ASN1_OCTET_STRING *a2i_IPADDRESS_NC(const char *ipasc)
|
1055
|
-
|
1056
|
-
|
1057
|
-
|
1058
|
-
|
1059
|
-
|
1060
|
-
|
1061
|
-
|
1062
|
-
|
1063
|
-
|
1064
|
-
|
1065
|
-
|
1066
|
-
|
1067
|
-
|
1068
|
-
|
1069
|
-
|
1070
|
-
|
1071
|
-
|
1072
|
-
|
1073
|
-
|
1074
|
-
|
1075
|
-
|
1076
|
-
|
1077
|
-
|
1078
|
-
|
1079
|
-
|
1080
|
-
|
1081
|
-
|
1082
|
-
|
1083
|
-
|
1084
|
-
|
1085
|
-
|
1086
|
-
|
1087
|
-
|
1088
|
-
|
1089
|
-
|
1090
|
-
|
1091
|
-
|
1092
|
-
|
1093
|
-
|
1094
|
-
|
1095
|
-
|
1096
|
-
|
1097
|
-
|
1081
|
+
{
|
1082
|
+
ASN1_OCTET_STRING *ret = NULL;
|
1083
|
+
unsigned char ipout[32];
|
1084
|
+
char *iptmp = NULL, *p;
|
1085
|
+
int iplen1, iplen2;
|
1086
|
+
p = strchr(ipasc, '/');
|
1087
|
+
if (!p)
|
1088
|
+
return NULL;
|
1089
|
+
iptmp = BUF_strdup(ipasc);
|
1090
|
+
if (!iptmp)
|
1091
|
+
return NULL;
|
1092
|
+
p = iptmp + (p - ipasc);
|
1093
|
+
*p++ = 0;
|
1094
|
+
|
1095
|
+
iplen1 = a2i_ipadd(ipout, iptmp);
|
1096
|
+
|
1097
|
+
if (!iplen1)
|
1098
|
+
goto err;
|
1099
|
+
|
1100
|
+
iplen2 = a2i_ipadd(ipout + iplen1, p);
|
1101
|
+
|
1102
|
+
OPENSSL_free(iptmp);
|
1103
|
+
iptmp = NULL;
|
1104
|
+
|
1105
|
+
if (!iplen2 || (iplen1 != iplen2))
|
1106
|
+
goto err;
|
1107
|
+
|
1108
|
+
ret = ASN1_OCTET_STRING_new();
|
1109
|
+
if (!ret)
|
1110
|
+
goto err;
|
1111
|
+
if (!ASN1_OCTET_STRING_set(ret, ipout, iplen1 + iplen2))
|
1112
|
+
goto err;
|
1113
|
+
|
1114
|
+
return ret;
|
1115
|
+
|
1116
|
+
err:
|
1117
|
+
if (iptmp)
|
1118
|
+
OPENSSL_free(iptmp);
|
1119
|
+
if (ret)
|
1120
|
+
ASN1_OCTET_STRING_free(ret);
|
1121
|
+
return NULL;
|
1122
|
+
}
|
1098
1123
|
|
1099
1124
|
int a2i_ipadd(unsigned char *ipout, const char *ipasc)
|
1100
|
-
|
1101
|
-
|
1102
|
-
|
1103
|
-
|
1104
|
-
|
1105
|
-
|
1106
|
-
|
1107
|
-
|
1108
|
-
|
1109
|
-
|
1110
|
-
|
1111
|
-
|
1112
|
-
|
1113
|
-
return 4;
|
1114
|
-
}
|
1115
|
-
}
|
1125
|
+
{
|
1126
|
+
/* If string contains a ':' assume IPv6 */
|
1127
|
+
|
1128
|
+
if (strchr(ipasc, ':')) {
|
1129
|
+
if (!ipv6_from_asc(ipout, ipasc))
|
1130
|
+
return 0;
|
1131
|
+
return 16;
|
1132
|
+
} else {
|
1133
|
+
if (!ipv4_from_asc(ipout, ipasc))
|
1134
|
+
return 0;
|
1135
|
+
return 4;
|
1136
|
+
}
|
1137
|
+
}
|
1116
1138
|
|
1117
1139
|
static int ipv4_from_asc(unsigned char *v4, const char *in)
|
1118
|
-
|
1119
|
-
|
1120
|
-
|
1121
|
-
|
1122
|
-
|
1123
|
-
|
1124
|
-
|
1125
|
-
|
1126
|
-
|
1127
|
-
|
1128
|
-
|
1129
|
-
|
1130
|
-
|
1140
|
+
{
|
1141
|
+
int a0, a1, a2, a3;
|
1142
|
+
if (sscanf(in, "%d.%d.%d.%d", &a0, &a1, &a2, &a3) != 4)
|
1143
|
+
return 0;
|
1144
|
+
if ((a0 < 0) || (a0 > 255) || (a1 < 0) || (a1 > 255)
|
1145
|
+
|| (a2 < 0) || (a2 > 255) || (a3 < 0) || (a3 > 255))
|
1146
|
+
return 0;
|
1147
|
+
v4[0] = a0;
|
1148
|
+
v4[1] = a1;
|
1149
|
+
v4[2] = a2;
|
1150
|
+
v4[3] = a3;
|
1151
|
+
return 1;
|
1152
|
+
}
|
1131
1153
|
|
1132
1154
|
typedef struct {
|
1133
|
-
|
1134
|
-
|
1135
|
-
|
1136
|
-
|
1137
|
-
|
1138
|
-
|
1139
|
-
|
1140
|
-
|
1141
|
-
|
1142
|
-
|
1155
|
+
/* Temporary store for IPV6 output */
|
1156
|
+
unsigned char tmp[16];
|
1157
|
+
/* Total number of bytes in tmp */
|
1158
|
+
int total;
|
1159
|
+
/* The position of a zero (corresponding to '::') */
|
1160
|
+
int zero_pos;
|
1161
|
+
/* Number of zeroes */
|
1162
|
+
int zero_cnt;
|
1163
|
+
} IPV6_STAT;
|
1143
1164
|
|
1144
1165
|
static int ipv6_from_asc(unsigned char *v6, const char *in)
|
1145
|
-
|
1146
|
-
|
1147
|
-
|
1148
|
-
|
1149
|
-
|
1150
|
-
|
1151
|
-
|
1152
|
-
|
1153
|
-
|
1154
|
-
|
1155
|
-
|
1156
|
-
|
1157
|
-
|
1158
|
-
|
1159
|
-
|
1160
|
-
|
1161
|
-
|
1162
|
-
|
1163
|
-
|
1164
|
-
|
1165
|
-
|
1166
|
-
|
1167
|
-
|
1168
|
-
|
1169
|
-
|
1170
|
-
|
1171
|
-
|
1172
|
-
|
1173
|
-
|
1174
|
-
|
1175
|
-
|
1176
|
-
|
1177
|
-
|
1178
|
-
|
1179
|
-
|
1180
|
-
|
1181
|
-
|
1182
|
-
|
1183
|
-
|
1184
|
-
|
1185
|
-
|
1186
|
-
|
1187
|
-
|
1188
|
-
|
1189
|
-
|
1190
|
-
|
1191
|
-
|
1192
|
-
|
1193
|
-
|
1194
|
-
|
1195
|
-
|
1196
|
-
|
1197
|
-
|
1198
|
-
|
1199
|
-
|
1200
|
-
|
1201
|
-
|
1202
|
-
|
1203
|
-
|
1204
|
-
|
1205
|
-
|
1206
|
-
|
1207
|
-
v6stat.total - v6stat.zero_pos);
|
1208
|
-
}
|
1209
|
-
else
|
1210
|
-
memcpy(v6, v6stat.tmp, 16);
|
1211
|
-
|
1212
|
-
return 1;
|
1213
|
-
}
|
1166
|
+
{
|
1167
|
+
IPV6_STAT v6stat;
|
1168
|
+
v6stat.total = 0;
|
1169
|
+
v6stat.zero_pos = -1;
|
1170
|
+
v6stat.zero_cnt = 0;
|
1171
|
+
/*
|
1172
|
+
* Treat the IPv6 representation as a list of values separated by ':'.
|
1173
|
+
* The presence of a '::' will parse as one, two or three zero length
|
1174
|
+
* elements.
|
1175
|
+
*/
|
1176
|
+
if (!CONF_parse_list(in, ':', 0, ipv6_cb, &v6stat))
|
1177
|
+
return 0;
|
1178
|
+
|
1179
|
+
/* Now for some sanity checks */
|
1180
|
+
|
1181
|
+
if (v6stat.zero_pos == -1) {
|
1182
|
+
/* If no '::' must have exactly 16 bytes */
|
1183
|
+
if (v6stat.total != 16)
|
1184
|
+
return 0;
|
1185
|
+
} else {
|
1186
|
+
/* If '::' must have less than 16 bytes */
|
1187
|
+
if (v6stat.total == 16)
|
1188
|
+
return 0;
|
1189
|
+
/* More than three zeroes is an error */
|
1190
|
+
if (v6stat.zero_cnt > 3)
|
1191
|
+
return 0;
|
1192
|
+
/* Can only have three zeroes if nothing else present */
|
1193
|
+
else if (v6stat.zero_cnt == 3) {
|
1194
|
+
if (v6stat.total > 0)
|
1195
|
+
return 0;
|
1196
|
+
}
|
1197
|
+
/* Can only have two zeroes if at start or end */
|
1198
|
+
else if (v6stat.zero_cnt == 2) {
|
1199
|
+
if ((v6stat.zero_pos != 0)
|
1200
|
+
&& (v6stat.zero_pos != v6stat.total))
|
1201
|
+
return 0;
|
1202
|
+
} else
|
1203
|
+
/* Can only have one zero if *not* start or end */
|
1204
|
+
{
|
1205
|
+
if ((v6stat.zero_pos == 0)
|
1206
|
+
|| (v6stat.zero_pos == v6stat.total))
|
1207
|
+
return 0;
|
1208
|
+
}
|
1209
|
+
}
|
1210
|
+
|
1211
|
+
/* Format result */
|
1212
|
+
|
1213
|
+
if (v6stat.zero_pos >= 0) {
|
1214
|
+
/* Copy initial part */
|
1215
|
+
memcpy(v6, v6stat.tmp, v6stat.zero_pos);
|
1216
|
+
/* Zero middle */
|
1217
|
+
memset(v6 + v6stat.zero_pos, 0, 16 - v6stat.total);
|
1218
|
+
/* Copy final part */
|
1219
|
+
if (v6stat.total != v6stat.zero_pos)
|
1220
|
+
memcpy(v6 + v6stat.zero_pos + 16 - v6stat.total,
|
1221
|
+
v6stat.tmp + v6stat.zero_pos,
|
1222
|
+
v6stat.total - v6stat.zero_pos);
|
1223
|
+
} else
|
1224
|
+
memcpy(v6, v6stat.tmp, 16);
|
1225
|
+
|
1226
|
+
return 1;
|
1227
|
+
}
|
1214
1228
|
|
1215
1229
|
static int ipv6_cb(const char *elem, int len, void *usr)
|
1216
|
-
|
1217
|
-
|
1218
|
-
|
1219
|
-
|
1220
|
-
|
1221
|
-
|
1222
|
-
|
1223
|
-
|
1224
|
-
|
1225
|
-
|
1226
|
-
|
1227
|
-
|
1228
|
-
|
1229
|
-
|
1230
|
-
|
1231
|
-
|
1232
|
-
|
1233
|
-
|
1234
|
-
|
1235
|
-
|
1236
|
-
|
1237
|
-
|
1238
|
-
|
1239
|
-
|
1240
|
-
|
1241
|
-
|
1242
|
-
|
1243
|
-
|
1244
|
-
|
1245
|
-
|
1246
|
-
|
1247
|
-
|
1248
|
-
|
1249
|
-
|
1250
|
-
|
1251
|
-
|
1252
|
-
}
|
1253
|
-
return 1;
|
1254
|
-
}
|
1255
|
-
|
1256
|
-
/* Convert a string of up to 4 hex digits into the corresponding
|
1257
|
-
* IPv6 form.
|
1230
|
+
{
|
1231
|
+
IPV6_STAT *s = usr;
|
1232
|
+
/* Error if 16 bytes written */
|
1233
|
+
if (s->total == 16)
|
1234
|
+
return 0;
|
1235
|
+
if (len == 0) {
|
1236
|
+
/* Zero length element, corresponds to '::' */
|
1237
|
+
if (s->zero_pos == -1)
|
1238
|
+
s->zero_pos = s->total;
|
1239
|
+
/* If we've already got a :: its an error */
|
1240
|
+
else if (s->zero_pos != s->total)
|
1241
|
+
return 0;
|
1242
|
+
s->zero_cnt++;
|
1243
|
+
} else {
|
1244
|
+
/* If more than 4 characters could be final a.b.c.d form */
|
1245
|
+
if (len > 4) {
|
1246
|
+
/* Need at least 4 bytes left */
|
1247
|
+
if (s->total > 12)
|
1248
|
+
return 0;
|
1249
|
+
/* Must be end of string */
|
1250
|
+
if (elem[len])
|
1251
|
+
return 0;
|
1252
|
+
if (!ipv4_from_asc(s->tmp + s->total, elem))
|
1253
|
+
return 0;
|
1254
|
+
s->total += 4;
|
1255
|
+
} else {
|
1256
|
+
if (!ipv6_hex(s->tmp + s->total, elem, len))
|
1257
|
+
return 0;
|
1258
|
+
s->total += 2;
|
1259
|
+
}
|
1260
|
+
}
|
1261
|
+
return 1;
|
1262
|
+
}
|
1263
|
+
|
1264
|
+
/*
|
1265
|
+
* Convert a string of up to 4 hex digits into the corresponding IPv6 form.
|
1258
1266
|
*/
|
1259
1267
|
|
1260
1268
|
static int ipv6_hex(unsigned char *out, const char *in, int inlen)
|
1261
|
-
|
1262
|
-
|
1263
|
-
|
1264
|
-
|
1265
|
-
|
1266
|
-
|
1267
|
-
|
1268
|
-
|
1269
|
-
|
1270
|
-
|
1271
|
-
|
1272
|
-
|
1273
|
-
|
1274
|
-
|
1275
|
-
|
1276
|
-
|
1277
|
-
|
1278
|
-
|
1279
|
-
|
1280
|
-
|
1281
|
-
|
1282
|
-
|
1283
|
-
|
1284
|
-
|
1285
|
-
|
1286
|
-
|
1287
|
-
|
1288
|
-
|
1289
|
-
|
1290
|
-
|
1291
|
-
|
1292
|
-
|
1293
|
-
|
1294
|
-
|
1295
|
-
|
1296
|
-
|
1297
|
-
|
1298
|
-
|
1299
|
-
|
1300
|
-
|
1301
|
-
|
1302
|
-
|
1303
|
-
|
1304
|
-
|
1305
|
-
|
1306
|
-
|
1307
|
-
|
1308
|
-
|
1309
|
-
|
1310
|
-
|
1311
|
-
|
1312
|
-
|
1313
|
-
|
1314
|
-
|
1315
|
-
|
1316
|
-
|
1317
|
-
|
1318
|
-
|
1319
|
-
|
1320
|
-
}
|
1321
|
-
return 1;
|
1322
|
-
}
|
1269
|
+
{
|
1270
|
+
unsigned char c;
|
1271
|
+
unsigned int num = 0;
|
1272
|
+
if (inlen > 4)
|
1273
|
+
return 0;
|
1274
|
+
while (inlen--) {
|
1275
|
+
c = *in++;
|
1276
|
+
num <<= 4;
|
1277
|
+
if ((c >= '0') && (c <= '9'))
|
1278
|
+
num |= c - '0';
|
1279
|
+
else if ((c >= 'A') && (c <= 'F'))
|
1280
|
+
num |= c - 'A' + 10;
|
1281
|
+
else if ((c >= 'a') && (c <= 'f'))
|
1282
|
+
num |= c - 'a' + 10;
|
1283
|
+
else
|
1284
|
+
return 0;
|
1285
|
+
}
|
1286
|
+
out[0] = num >> 8;
|
1287
|
+
out[1] = num & 0xff;
|
1288
|
+
return 1;
|
1289
|
+
}
|
1290
|
+
|
1291
|
+
int X509V3_NAME_from_section(X509_NAME *nm, STACK_OF (CONF_VALUE) * dn_sk,
|
1292
|
+
unsigned long chtype)
|
1293
|
+
{
|
1294
|
+
CONF_VALUE *v;
|
1295
|
+
int mval;
|
1296
|
+
size_t i;
|
1297
|
+
char *p, *type;
|
1298
|
+
if (!nm)
|
1299
|
+
return 0;
|
1300
|
+
|
1301
|
+
for (i = 0; i < sk_CONF_VALUE_num(dn_sk); i++) {
|
1302
|
+
v = sk_CONF_VALUE_value(dn_sk, i);
|
1303
|
+
type = v->name;
|
1304
|
+
/*
|
1305
|
+
* Skip past any leading X. X: X, etc to allow for multiple instances
|
1306
|
+
*/
|
1307
|
+
for (p = type; *p; p++)
|
1308
|
+
if ((*p == ':') || (*p == ',') || (*p == '.')) {
|
1309
|
+
p++;
|
1310
|
+
if (*p)
|
1311
|
+
type = p;
|
1312
|
+
break;
|
1313
|
+
}
|
1314
|
+
if (*type == '+') {
|
1315
|
+
mval = -1;
|
1316
|
+
type++;
|
1317
|
+
} else
|
1318
|
+
mval = 0;
|
1319
|
+
if (!X509_NAME_add_entry_by_txt(nm, type, chtype,
|
1320
|
+
(unsigned char *)v->value, -1, -1,
|
1321
|
+
mval))
|
1322
|
+
return 0;
|
1323
|
+
|
1324
|
+
}
|
1325
|
+
return 1;
|
1326
|
+
}
|