grpc 1.9.1 → 1.10.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +2654 -953
- data/etc/roots.pem +282 -683
- data/include/grpc/compression.h +9 -26
- data/include/grpc/grpc.h +10 -24
- data/include/grpc/grpc_security.h +7 -1
- data/include/grpc/impl/codegen/compression_types.h +5 -62
- data/include/grpc/impl/codegen/grpc_types.h +10 -6
- data/include/grpc/module.modulemap +1 -10
- data/include/grpc/support/alloc.h +3 -2
- data/include/grpc/support/log.h +1 -2
- data/{src/core/lib/gpr/thd_internal.h → include/grpc/support/thd_id.h} +23 -9
- data/src/boringssl/err_data.c +550 -496
- data/src/core/ext/census/grpc_context.cc +2 -1
- data/src/core/ext/filters/client_channel/backup_poller.cc +5 -4
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +7 -7
- data/src/core/ext/filters/client_channel/client_channel.cc +162 -172
- data/src/core/ext/filters/client_channel/client_channel_factory.cc +4 -2
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +10 -10
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +18 -14
- data/src/core/ext/filters/client_channel/http_proxy.cc +3 -1
- data/src/core/ext/filters/client_channel/lb_policy.cc +21 -105
- data/src/core/ext/filters/client_channel/lb_policy.h +166 -170
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +41 -36
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +1452 -1459
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +3 -2
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +7 -8
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +27 -27
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +279 -304
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +358 -330
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.cc +30 -41
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +7 -14
- data/src/core/ext/filters/client_channel/lb_policy_factory.cc +8 -21
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +23 -27
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +58 -33
- data/src/core/ext/filters/client_channel/lb_policy_registry.h +25 -12
- data/src/core/ext/filters/client_channel/parse_address.cc +10 -8
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver.cc +6 -52
- data/src/core/ext/filters/client_channel/resolver.h +98 -55
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +266 -237
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +5 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +31 -27
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +244 -207
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +161 -148
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +47 -31
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +126 -126
- data/src/core/ext/filters/client_channel/resolver_factory.h +33 -32
- data/src/core/ext/filters/client_channel/resolver_registry.cc +110 -90
- data/src/core/ext/filters/client_channel/resolver_registry.h +49 -36
- data/src/core/ext/filters/client_channel/retry_throttle.cc +29 -22
- data/src/core/ext/filters/client_channel/subchannel.cc +173 -173
- data/src/core/ext/filters/client_channel/subchannel.h +38 -45
- data/src/core/ext/filters/client_channel/subchannel_index.cc +44 -40
- data/src/core/ext/filters/client_channel/uri_parser.cc +3 -3
- data/src/core/ext/filters/deadline/deadline_filter.cc +27 -18
- data/src/core/ext/filters/http/client/http_client_filter.cc +26 -23
- data/src/core/ext/filters/http/http_filters_plugin.cc +3 -2
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +78 -110
- data/src/core/ext/filters/http/server/http_server_filter.cc +29 -26
- data/src/core/ext/filters/load_reporting/server_load_reporting_filter.cc +9 -11
- data/src/core/ext/filters/load_reporting/server_load_reporting_plugin.cc +2 -1
- data/src/core/ext/filters/max_age/max_age_filter.cc +14 -14
- data/src/core/ext/filters/message_size/message_size_filter.cc +20 -18
- data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +4 -4
- data/src/core/ext/filters/workarounds/workaround_utils.cc +4 -4
- data/src/core/ext/transport/chttp2/alpn/alpn.cc +2 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +10 -10
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +4 -4
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +11 -12
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +16 -13
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +36 -9
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +3 -0
- data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +17 -14
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +139 -145
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +16 -14
- data/src/core/ext/transport/chttp2/transport/flow_control.h +8 -7
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +35 -33
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +27 -25
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +12 -12
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +16 -15
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +19 -19
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +11 -11
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +23 -22
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +35 -35
- data/src/core/ext/transport/chttp2/transport/hpack_table.cc +10 -7
- data/src/core/ext/transport/chttp2/transport/http2_settings.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/internal.h +1 -1
- data/src/core/ext/transport/chttp2/transport/parsing.cc +35 -39
- data/src/core/ext/transport/chttp2/transport/stream_map.cc +8 -7
- data/src/core/ext/transport/chttp2/transport/varint.cc +5 -5
- data/src/core/ext/transport/chttp2/transport/writing.cc +18 -18
- data/src/core/ext/transport/inproc/inproc_transport.cc +43 -23
- data/src/core/lib/{gpr → avl}/avl.cc +61 -57
- data/{include/grpc/support → src/core/lib/avl}/avl.h +25 -35
- data/src/core/lib/backoff/backoff.cc +6 -5
- data/src/core/lib/channel/channel_args.cc +23 -109
- data/src/core/lib/channel/channel_args.h +5 -31
- data/src/core/lib/channel/channel_stack.cc +11 -8
- data/src/core/lib/channel/channel_stack_builder.cc +10 -7
- data/src/core/lib/channel/connected_channel.cc +18 -17
- data/src/core/lib/channel/handshaker.cc +8 -8
- data/src/core/lib/channel/handshaker_registry.cc +3 -2
- data/src/core/lib/compression/algorithm_metadata.h +13 -6
- data/src/core/lib/compression/compression.cc +72 -183
- data/src/core/lib/compression/compression_internal.cc +274 -0
- data/src/core/lib/compression/compression_internal.h +86 -0
- data/src/core/lib/compression/message_compress.cc +15 -15
- data/src/core/lib/compression/message_compress.h +4 -3
- data/src/core/lib/compression/stream_compression_gzip.cc +8 -8
- data/src/core/lib/compression/stream_compression_identity.cc +1 -1
- data/src/core/lib/debug/stats.cc +10 -8
- data/src/core/lib/debug/stats_data.cc +2 -1
- data/src/core/lib/debug/trace.cc +3 -3
- data/src/core/lib/gpr/alloc.cc +7 -11
- data/src/core/lib/gpr/arena.cc +34 -12
- data/src/core/lib/gpr/atm.cc +2 -1
- data/src/core/lib/gpr/cpu_linux.cc +3 -3
- data/src/core/lib/gpr/cpu_posix.cc +2 -1
- data/src/core/lib/gpr/env.h +1 -1
- data/src/core/lib/gpr/env_linux.cc +1 -1
- data/src/core/lib/gpr/env_windows.cc +4 -4
- data/src/core/lib/gpr/fork.cc +16 -2
- data/src/core/lib/gpr/host_port.cc +5 -4
- data/{include/grpc/support → src/core/lib/gpr}/host_port.h +5 -13
- data/src/core/lib/gpr/log.cc +5 -4
- data/src/core/lib/gpr/log_linux.cc +1 -1
- data/src/core/lib/gpr/mpscq.cc +1 -0
- data/src/core/lib/gpr/murmur_hash.cc +4 -4
- data/src/core/lib/gpr/string.cc +19 -16
- data/src/core/lib/gpr/string_posix.cc +3 -3
- data/src/core/lib/gpr/sync_posix.cc +5 -9
- data/src/core/lib/gpr/thd.cc +3 -3
- data/{include/grpc/support → src/core/lib/gpr}/thd.h +20 -28
- data/src/core/lib/gpr/thd_posix.cc +6 -4
- data/src/core/lib/gpr/thd_windows.cc +3 -1
- data/src/core/lib/gpr/time.cc +6 -4
- data/src/core/lib/gpr/time_posix.cc +2 -2
- data/{include/grpc/support → src/core/lib/gpr}/tls.h +6 -6
- data/{include/grpc/support → src/core/lib/gpr}/tls_gcc.h +3 -3
- data/{include/grpc/support → src/core/lib/gpr}/tls_msvc.h +3 -3
- data/src/core/lib/gpr/tls_pthread.cc +1 -1
- data/{include/grpc/support → src/core/lib/gpr}/tls_pthread.h +3 -3
- data/{include/grpc/support → src/core/lib/gpr}/useful.h +3 -3
- data/src/core/lib/{gpr++ → gprpp}/abstract.h +3 -3
- data/src/core/lib/{gpr++ → gprpp}/atomic.h +5 -5
- data/src/core/lib/{gpr++ → gprpp}/atomic_with_atm.h +3 -3
- data/src/core/lib/{gpr++ → gprpp}/atomic_with_std.h +3 -3
- data/src/core/lib/{gpr++ → gprpp}/debug_location.h +3 -3
- data/src/core/lib/{gpr++ → gprpp}/inlined_vector.h +44 -22
- data/src/core/lib/{gpr++ → gprpp}/manual_constructor.h +2 -2
- data/src/core/lib/{gpr++ → gprpp}/memory.h +14 -5
- data/src/core/lib/{gpr++ → gprpp}/orphanable.h +39 -14
- data/src/core/lib/{gpr++ → gprpp}/ref_counted.h +42 -10
- data/src/core/lib/{gpr++ → gprpp}/ref_counted_ptr.h +18 -8
- data/src/core/lib/http/format_request.cc +3 -3
- data/src/core/lib/http/httpcli.cc +6 -7
- data/src/core/lib/http/httpcli_security_connector.cc +10 -10
- data/src/core/lib/http/parser.cc +16 -12
- data/src/core/lib/iomgr/call_combiner.cc +12 -13
- data/src/core/lib/iomgr/closure.h +4 -6
- data/src/core/lib/iomgr/combiner.cc +10 -21
- data/src/core/lib/iomgr/error.cc +50 -55
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +41 -52
- data/src/core/lib/iomgr/ev_epollex_linux.cc +80 -28
- data/src/core/lib/iomgr/ev_epollsig_linux.cc +23 -30
- data/src/core/lib/iomgr/ev_poll_posix.cc +52 -46
- data/src/core/lib/iomgr/ev_posix.cc +47 -6
- data/src/core/lib/iomgr/exec_ctx.cc +10 -10
- data/src/core/lib/iomgr/exec_ctx.h +1 -1
- data/src/core/lib/iomgr/executor.cc +16 -13
- data/src/core/lib/iomgr/fork_posix.cc +1 -3
- data/src/core/lib/iomgr/gethostname_host_name_max.cc +1 -1
- data/src/core/lib/iomgr/iocp_windows.cc +1 -2
- data/src/core/lib/iomgr/iomgr.cc +2 -2
- data/src/core/lib/iomgr/iomgr_uv.cc +2 -0
- data/src/core/lib/iomgr/iomgr_uv.h +1 -1
- data/src/core/lib/iomgr/is_epollexclusive_available.cc +5 -4
- data/src/core/lib/iomgr/load_file.cc +3 -3
- data/src/core/lib/iomgr/pollset_windows.cc +1 -1
- data/src/core/lib/iomgr/resolve_address_posix.cc +10 -9
- data/src/core/lib/iomgr/resolve_address_uv.cc +2 -2
- data/src/core/lib/iomgr/resolve_address_windows.cc +3 -2
- data/src/core/lib/iomgr/resource_quota.cc +36 -34
- data/src/core/lib/iomgr/sockaddr_utils.cc +39 -23
- data/src/core/lib/iomgr/socket_factory_posix.cc +5 -5
- data/src/core/lib/iomgr/socket_mutator.cc +7 -7
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +7 -4
- data/src/core/lib/iomgr/socket_utils_linux.cc +3 -2
- data/src/core/lib/iomgr/tcp_client_posix.cc +7 -6
- data/src/core/lib/iomgr/tcp_client_windows.cc +0 -1
- data/src/core/lib/iomgr/tcp_posix.cc +47 -55
- data/src/core/lib/iomgr/tcp_server_posix.cc +12 -10
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +7 -5
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +4 -3
- data/src/core/lib/iomgr/tcp_windows.cc +1 -1
- data/src/core/lib/iomgr/timer_generic.cc +16 -14
- data/src/core/lib/iomgr/timer_heap.cc +8 -7
- data/src/core/lib/iomgr/timer_manager.cc +4 -3
- data/src/core/lib/iomgr/udp_server.cc +24 -16
- data/src/core/lib/iomgr/unix_sockets_posix.cc +15 -10
- data/src/core/lib/iomgr/wakeup_fd_cv.cc +6 -5
- data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +1 -2
- data/src/core/lib/json/json.cc +1 -1
- data/src/core/lib/json/json_reader.cc +8 -6
- data/src/core/lib/json/json_string.cc +19 -18
- data/src/core/lib/json/json_writer.cc +10 -8
- data/src/core/lib/profiling/basic_timers.cc +1 -1
- data/src/core/lib/profiling/timers.h +3 -20
- data/src/core/lib/security/context/security_context.cc +16 -14
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +17 -14
- data/src/core/lib/security/credentials/credentials.cc +9 -8
- data/src/core/lib/security/credentials/credentials.h +1 -1
- data/src/core/lib/security/credentials/credentials_metadata.cc +2 -2
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +12 -13
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +7 -4
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +5 -3
- data/src/core/lib/security/credentials/jwt/json_token.cc +4 -3
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +7 -7
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +21 -18
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +23 -18
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +11 -7
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +22 -21
- data/src/core/lib/security/{transport → security_connector}/security_connector.cc +46 -43
- data/src/core/lib/security/{transport → security_connector}/security_connector.h +3 -3
- data/src/core/lib/security/transport/client_auth_filter.cc +32 -34
- data/src/core/lib/security/transport/lb_targets_info.cc +7 -5
- data/src/core/lib/security/transport/secure_endpoint.cc +21 -21
- data/src/core/lib/security/transport/security_handshaker.cc +19 -18
- data/src/core/lib/security/transport/security_handshaker.h +1 -1
- data/src/core/lib/security/transport/server_auth_filter.cc +21 -21
- data/src/core/lib/slice/b64.cc +19 -16
- data/src/core/lib/slice/percent_encoding.cc +5 -5
- data/src/core/lib/slice/slice.cc +35 -33
- data/src/core/lib/slice/slice_buffer.cc +16 -14
- data/src/core/lib/slice/slice_hash_table.cc +3 -2
- data/src/core/lib/slice/slice_intern.cc +21 -25
- data/src/core/lib/slice/slice_string_helpers.cc +45 -9
- data/src/core/lib/slice/slice_string_helpers.h +6 -0
- data/src/core/lib/surface/byte_buffer.cc +2 -2
- data/src/core/lib/surface/byte_buffer_reader.cc +6 -3
- data/src/core/lib/surface/call.cc +171 -260
- data/src/core/lib/surface/call_test_only.h +1 -13
- data/src/core/lib/surface/channel.cc +20 -43
- data/src/core/lib/surface/channel_init.cc +7 -7
- data/src/core/lib/surface/channel_ping.cc +2 -2
- data/src/core/lib/surface/completion_queue.cc +69 -75
- data/src/core/lib/surface/init.cc +4 -5
- data/src/core/lib/surface/init_secure.cc +1 -1
- data/src/core/lib/surface/lame_client.cc +1 -1
- data/src/core/lib/surface/server.cc +64 -59
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/bdp_estimator.cc +6 -5
- data/src/core/lib/transport/byte_stream.cc +23 -14
- data/src/core/lib/transport/byte_stream.h +1 -1
- data/src/core/lib/transport/connectivity_state.cc +9 -13
- data/src/core/lib/transport/error_utils.cc +10 -7
- data/src/core/lib/transport/metadata.cc +27 -26
- data/src/core/lib/transport/metadata.h +1 -1
- data/src/core/lib/transport/pid_controller.cc +2 -1
- data/src/core/lib/transport/service_config.cc +5 -5
- data/src/core/lib/transport/static_metadata.cc +225 -222
- data/src/core/lib/transport/static_metadata.h +77 -76
- data/src/core/lib/transport/timeout_encoding.cc +3 -2
- data/src/core/lib/transport/transport.cc +6 -5
- data/src/core/lib/transport/transport_op_string.cc +0 -1
- data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -4
- data/src/core/tsi/alts_transport_security.cc +61 -0
- data/src/core/tsi/{gts_transport_security.h → alts_transport_security.h} +16 -8
- data/src/core/tsi/fake_transport_security.cc +59 -43
- data/src/core/tsi/ssl_transport_security.cc +122 -107
- data/src/core/tsi/transport_security.cc +3 -3
- data/src/core/tsi/transport_security_adapter.cc +16 -10
- data/src/ruby/bin/apis/pubsub_demo.rb +1 -1
- data/src/ruby/ext/grpc/rb_channel.c +3 -4
- data/src/ruby/ext/grpc/rb_compression_options.c +13 -3
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -76
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +8 -120
- data/src/ruby/ext/grpc/rb_server.c +52 -28
- data/src/ruby/lib/grpc/generic/rpc_server.rb +7 -4
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/test/client.rb +1 -1
- data/src/ruby/pb/test/server.rb +1 -1
- data/src/ruby/spec/client_server_spec.rb +4 -2
- data/src/ruby/spec/generic/active_call_spec.rb +2 -1
- data/src/ruby/spec/generic/client_stub_spec.rb +32 -8
- data/src/ruby/spec/server_spec.rb +26 -7
- data/third_party/boringssl/crypto/asn1/a_bitstr.c +7 -2
- data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +15 -0
- data/third_party/boringssl/crypto/asn1/a_gentm.c +1 -1
- data/third_party/boringssl/crypto/asn1/a_print.c +0 -28
- data/third_party/boringssl/crypto/asn1/a_strnid.c +3 -0
- data/third_party/boringssl/crypto/asn1/a_time.c +17 -9
- data/third_party/boringssl/crypto/asn1/a_utctm.c +1 -1
- data/third_party/boringssl/crypto/asn1/asn1_lib.c +5 -49
- data/third_party/boringssl/crypto/asn1/asn1_locl.h +1 -1
- data/third_party/boringssl/crypto/asn1/tasn_dec.c +9 -9
- data/third_party/boringssl/crypto/asn1/tasn_enc.c +0 -6
- data/third_party/boringssl/crypto/asn1/time_support.c +5 -5
- data/third_party/boringssl/crypto/base64/base64.c +65 -43
- data/third_party/boringssl/crypto/bio/bio.c +134 -110
- data/third_party/boringssl/crypto/bio/bio_mem.c +9 -9
- data/third_party/boringssl/crypto/bio/connect.c +17 -17
- data/third_party/boringssl/crypto/bio/fd.c +2 -1
- data/third_party/boringssl/crypto/bio/file.c +14 -14
- data/third_party/boringssl/crypto/bio/hexdump.c +15 -16
- data/third_party/boringssl/crypto/bio/internal.h +14 -14
- data/third_party/boringssl/crypto/bio/pair.c +45 -45
- data/third_party/boringssl/crypto/bio/printf.c +6 -10
- data/third_party/boringssl/crypto/{bn → bn_extra}/bn_asn1.c +9 -9
- data/third_party/boringssl/crypto/{bn → bn_extra}/convert.c +18 -223
- data/third_party/boringssl/crypto/buf/buf.c +20 -44
- data/third_party/boringssl/crypto/bytestring/ber.c +35 -35
- data/third_party/boringssl/crypto/bytestring/cbb.c +24 -24
- data/third_party/boringssl/crypto/bytestring/cbs.c +33 -37
- data/third_party/boringssl/crypto/bytestring/internal.h +38 -38
- data/third_party/boringssl/crypto/chacha/chacha.c +7 -7
- data/third_party/boringssl/crypto/{asn1/t_bitst.c → cipher_extra/cipher_extra.c} +49 -38
- data/third_party/boringssl/crypto/{cipher → cipher_extra}/derive_key.c +0 -2
- data/third_party/boringssl/crypto/cipher_extra/e_aesctrhmac.c +281 -0
- data/third_party/boringssl/crypto/cipher_extra/e_aesgcmsiv.c +867 -0
- data/third_party/boringssl/crypto/cipher_extra/e_chacha20poly1305.c +326 -0
- data/third_party/boringssl/crypto/{cipher → cipher_extra}/e_null.c +0 -1
- data/third_party/boringssl/crypto/{cipher → cipher_extra}/e_rc2.c +22 -10
- data/third_party/boringssl/crypto/{cipher → cipher_extra}/e_rc4.c +0 -0
- data/third_party/boringssl/crypto/{cipher → cipher_extra}/e_ssl3.c +120 -64
- data/third_party/boringssl/crypto/{cipher → cipher_extra}/e_tls.c +220 -141
- data/third_party/boringssl/crypto/{asn1/x_bignum.c → cipher_extra/internal.h} +61 -86
- data/third_party/boringssl/crypto/cipher_extra/tls_cbc.c +482 -0
- data/third_party/boringssl/crypto/cmac/cmac.c +20 -20
- data/third_party/boringssl/crypto/conf/conf.c +32 -20
- data/third_party/boringssl/crypto/conf/internal.h +3 -3
- data/third_party/boringssl/crypto/cpu-aarch64-linux.c +5 -5
- data/third_party/boringssl/crypto/cpu-arm-linux.c +44 -41
- data/third_party/boringssl/crypto/cpu-intel.c +68 -43
- data/third_party/boringssl/crypto/cpu-ppc64le.c +5 -7
- data/third_party/boringssl/crypto/crypto.c +54 -32
- data/third_party/boringssl/crypto/curve25519/curve25519.c +269 -269
- data/third_party/boringssl/crypto/curve25519/internal.h +28 -8
- data/third_party/boringssl/crypto/curve25519/spake25519.c +180 -106
- data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +9 -9
- data/third_party/boringssl/crypto/dh/check.c +33 -34
- data/third_party/boringssl/crypto/dh/dh.c +72 -36
- data/third_party/boringssl/crypto/dh/dh_asn1.c +1 -1
- data/third_party/boringssl/crypto/dh/params.c +1 -161
- data/third_party/boringssl/crypto/digest_extra/digest_extra.c +240 -0
- data/third_party/boringssl/crypto/dsa/dsa.c +127 -87
- data/third_party/boringssl/crypto/dsa/dsa_asn1.c +1 -1
- data/third_party/boringssl/crypto/{ec → ec_extra}/ec_asn1.c +83 -70
- data/third_party/boringssl/crypto/ecdh/ecdh.c +1 -1
- data/third_party/boringssl/crypto/{ecdsa → ecdsa_extra}/ecdsa_asn1.c +86 -31
- data/third_party/boringssl/crypto/engine/engine.c +6 -6
- data/third_party/boringssl/crypto/err/err.c +197 -106
- data/third_party/boringssl/crypto/err/internal.h +58 -0
- data/third_party/boringssl/crypto/evp/digestsign.c +86 -14
- data/third_party/boringssl/crypto/evp/evp.c +6 -11
- data/third_party/boringssl/crypto/evp/evp_asn1.c +17 -17
- data/third_party/boringssl/crypto/evp/evp_ctx.c +15 -11
- data/third_party/boringssl/crypto/evp/internal.h +66 -51
- data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +11 -11
- data/third_party/boringssl/crypto/evp/p_ec.c +10 -8
- data/third_party/boringssl/crypto/evp/p_ec_asn1.c +11 -12
- data/third_party/boringssl/crypto/evp/p_ed25519.c +71 -0
- data/third_party/boringssl/crypto/evp/p_ed25519_asn1.c +190 -0
- data/third_party/boringssl/crypto/evp/p_rsa.c +50 -95
- data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +28 -18
- data/third_party/boringssl/crypto/evp/pbkdf.c +49 -56
- data/third_party/boringssl/crypto/evp/print.c +5 -36
- data/third_party/boringssl/crypto/evp/scrypt.c +209 -0
- data/third_party/boringssl/crypto/ex_data.c +15 -45
- data/third_party/boringssl/crypto/fipsmodule/aes/internal.h +100 -0
- data/third_party/boringssl/crypto/fipsmodule/bcm.c +679 -0
- data/third_party/boringssl/crypto/{bn → fipsmodule/bn}/internal.h +40 -27
- data/third_party/boringssl/crypto/{bn → fipsmodule/bn}/rsaz_exp.h +0 -0
- data/third_party/boringssl/crypto/{cipher → fipsmodule/cipher}/internal.h +34 -67
- data/third_party/boringssl/crypto/fipsmodule/delocate.h +88 -0
- data/third_party/boringssl/crypto/{des → fipsmodule/des}/internal.h +18 -4
- data/third_party/boringssl/crypto/{digest → fipsmodule/digest}/internal.h +18 -18
- data/third_party/boringssl/crypto/{digest → fipsmodule/digest}/md32_common.h +58 -64
- data/third_party/boringssl/crypto/{ec → fipsmodule/ec}/internal.h +58 -52
- data/third_party/boringssl/crypto/{ec → fipsmodule/ec}/p256-x86_64-table.h +11 -11
- data/third_party/boringssl/crypto/{ec → fipsmodule/ec}/p256-x86_64.h +32 -32
- data/third_party/boringssl/crypto/{rand/internal.h → fipsmodule/is_fips.c} +10 -15
- data/third_party/boringssl/crypto/{modes → fipsmodule/modes}/internal.h +112 -119
- data/third_party/boringssl/crypto/fipsmodule/rand/internal.h +92 -0
- data/third_party/boringssl/crypto/{rsa → fipsmodule/rsa}/internal.h +36 -49
- data/third_party/boringssl/crypto/hkdf/hkdf.c +6 -6
- data/third_party/boringssl/crypto/internal.h +301 -233
- data/third_party/boringssl/crypto/lhash/lhash.c +26 -45
- data/third_party/boringssl/crypto/mem.c +76 -33
- data/third_party/boringssl/crypto/obj/obj.c +44 -28
- data/third_party/boringssl/crypto/obj/obj_dat.h +102 -34
- data/third_party/boringssl/crypto/obj/obj_xref.c +6 -6
- data/third_party/boringssl/crypto/pem/pem_info.c +3 -5
- data/third_party/boringssl/crypto/pem/pem_lib.c +1 -6
- data/third_party/boringssl/crypto/pem/pem_pk8.c +1 -0
- data/third_party/boringssl/crypto/pem/pem_pkey.c +1 -1
- data/third_party/boringssl/crypto/pem/pem_xaux.c +0 -2
- data/third_party/boringssl/crypto/pkcs7/internal.h +49 -0
- data/third_party/boringssl/crypto/pkcs7/pkcs7.c +166 -0
- data/third_party/boringssl/crypto/{x509/pkcs7.c → pkcs7/pkcs7_x509.c} +27 -147
- data/third_party/boringssl/crypto/pkcs8/internal.h +34 -16
- data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +120 -39
- data/third_party/boringssl/crypto/pkcs8/pkcs8.c +144 -857
- data/third_party/boringssl/crypto/pkcs8/pkcs8_x509.c +789 -0
- data/third_party/boringssl/crypto/poly1305/internal.h +4 -3
- data/third_party/boringssl/crypto/poly1305/poly1305.c +14 -14
- data/third_party/boringssl/crypto/poly1305/poly1305_arm.c +11 -11
- data/third_party/boringssl/crypto/poly1305/poly1305_vec.c +41 -41
- data/third_party/boringssl/crypto/pool/internal.h +2 -2
- data/third_party/boringssl/crypto/pool/pool.c +15 -15
- data/third_party/boringssl/crypto/{rand → rand_extra}/deterministic.c +7 -7
- data/third_party/boringssl/crypto/rand_extra/forkunsafe.c +46 -0
- data/third_party/boringssl/crypto/{rand → rand_extra}/fuchsia.c +7 -7
- data/third_party/boringssl/crypto/rand_extra/rand_extra.c +70 -0
- data/third_party/boringssl/crypto/{rand → rand_extra}/windows.c +5 -5
- data/third_party/boringssl/crypto/refcount_c11.c +2 -2
- data/third_party/boringssl/crypto/refcount_lock.c +1 -1
- data/third_party/boringssl/crypto/{rsa → rsa_extra}/rsa_asn1.c +12 -120
- data/third_party/boringssl/crypto/stack/stack.c +13 -13
- data/third_party/boringssl/crypto/thread_none.c +1 -1
- data/third_party/boringssl/crypto/thread_pthread.c +1 -1
- data/third_party/boringssl/crypto/thread_win.c +40 -40
- data/third_party/boringssl/crypto/x509/a_sign.c +5 -12
- data/third_party/boringssl/crypto/x509/a_verify.c +6 -18
- data/third_party/boringssl/crypto/x509/algorithm.c +22 -6
- data/third_party/boringssl/crypto/x509/asn1_gen.c +30 -7
- data/third_party/boringssl/crypto/x509/by_dir.c +2 -2
- data/third_party/boringssl/crypto/x509/by_file.c +2 -2
- data/third_party/boringssl/crypto/x509/rsa_pss.c +5 -5
- data/third_party/boringssl/crypto/x509/t_x509.c +2 -1
- data/third_party/boringssl/crypto/x509/x509_def.c +5 -0
- data/third_party/boringssl/crypto/x509/x509_lu.c +35 -4
- data/third_party/boringssl/crypto/x509/x509_set.c +10 -0
- data/third_party/boringssl/crypto/x509/x509_vfy.c +20 -17
- data/third_party/boringssl/crypto/x509/x_name.c +13 -16
- data/third_party/boringssl/crypto/x509/x_x509.c +3 -3
- data/third_party/boringssl/crypto/x509/x_x509a.c +0 -7
- data/third_party/boringssl/crypto/x509v3/ext_dat.h +8 -0
- data/third_party/boringssl/crypto/x509v3/pcy_int.h +2 -2
- data/third_party/boringssl/crypto/x509v3/pcy_lib.c +0 -9
- data/third_party/boringssl/crypto/x509v3/pcy_node.c +1 -1
- data/third_party/boringssl/crypto/x509v3/pcy_tree.c +25 -15
- data/third_party/boringssl/crypto/x509v3/v3_alt.c +21 -11
- data/third_party/boringssl/crypto/x509v3/v3_cpols.c +9 -3
- data/third_party/boringssl/crypto/x509v3/v3_info.c +22 -14
- data/third_party/boringssl/crypto/x509v3/v3_ncons.c +27 -11
- data/third_party/boringssl/crypto/x509v3/v3_pci.c +0 -33
- data/third_party/boringssl/crypto/x509v3/v3_utl.c +4 -4
- data/third_party/boringssl/include/openssl/aead.h +280 -191
- data/third_party/boringssl/include/openssl/aes.h +50 -50
- data/third_party/boringssl/include/openssl/arm_arch.h +12 -12
- data/third_party/boringssl/include/openssl/asn1.h +14 -77
- data/third_party/boringssl/include/openssl/asn1t.h +11 -15
- data/third_party/boringssl/include/openssl/base.h +78 -51
- data/third_party/boringssl/include/openssl/base64.h +68 -68
- data/third_party/boringssl/include/openssl/bio.h +472 -406
- data/third_party/boringssl/include/openssl/blowfish.h +1 -1
- data/third_party/boringssl/include/openssl/bn.h +454 -435
- data/third_party/boringssl/include/openssl/buf.h +27 -27
- data/third_party/boringssl/include/openssl/bytestring.h +282 -267
- data/third_party/boringssl/include/openssl/cast.h +2 -2
- data/third_party/boringssl/include/openssl/chacha.h +5 -5
- data/third_party/boringssl/include/openssl/cipher.h +209 -200
- data/third_party/boringssl/include/openssl/cmac.h +27 -27
- data/third_party/boringssl/include/openssl/conf.h +49 -46
- data/third_party/boringssl/include/openssl/cpu.h +60 -45
- data/third_party/boringssl/include/openssl/crypto.h +59 -35
- data/third_party/boringssl/include/openssl/curve25519.h +97 -92
- data/third_party/boringssl/include/openssl/des.h +25 -25
- data/third_party/boringssl/include/openssl/dh.h +98 -97
- data/third_party/boringssl/include/openssl/digest.h +143 -114
- data/third_party/boringssl/include/openssl/dsa.h +217 -202
- data/third_party/boringssl/include/openssl/ec.h +132 -131
- data/third_party/boringssl/include/openssl/ec_key.h +132 -128
- data/third_party/boringssl/include/openssl/ecdh.h +9 -9
- data/third_party/boringssl/include/openssl/ecdsa.h +66 -66
- data/third_party/boringssl/include/openssl/engine.h +38 -38
- data/third_party/boringssl/include/openssl/err.h +189 -219
- data/third_party/boringssl/include/openssl/evp.h +473 -397
- data/third_party/boringssl/include/openssl/ex_data.h +46 -56
- data/third_party/boringssl/include/openssl/hkdf.h +17 -17
- data/third_party/boringssl/include/openssl/hmac.h +55 -43
- data/third_party/boringssl/include/openssl/is_boringssl.h +16 -0
- data/third_party/boringssl/include/openssl/lhash.h +67 -67
- data/third_party/boringssl/include/openssl/lhash_macros.h +4 -4
- data/third_party/boringssl/include/openssl/md4.h +14 -14
- data/third_party/boringssl/include/openssl/md5.h +14 -14
- data/third_party/boringssl/include/openssl/mem.h +39 -33
- data/third_party/boringssl/include/openssl/nid.h +43 -0
- data/third_party/boringssl/include/openssl/obj.h +93 -87
- data/third_party/boringssl/include/openssl/opensslconf.h +8 -1
- data/third_party/boringssl/include/openssl/pem.h +2 -122
- data/third_party/boringssl/include/openssl/pkcs7.h +68 -2
- data/third_party/boringssl/include/openssl/pkcs8.h +81 -66
- data/third_party/boringssl/include/openssl/poly1305.h +11 -11
- data/third_party/boringssl/include/openssl/pool.h +29 -25
- data/third_party/boringssl/include/openssl/rand.h +48 -45
- data/third_party/boringssl/include/openssl/rc4.h +9 -9
- data/third_party/boringssl/include/openssl/ripemd.h +13 -13
- data/third_party/boringssl/include/openssl/rsa.h +371 -340
- data/third_party/boringssl/include/openssl/sha.h +71 -71
- data/third_party/boringssl/include/openssl/span.h +191 -0
- data/third_party/boringssl/include/openssl/ssl.h +2639 -2519
- data/third_party/boringssl/include/openssl/ssl3.h +39 -122
- data/third_party/boringssl/include/openssl/stack.h +355 -164
- data/third_party/boringssl/include/openssl/thread.h +43 -43
- data/third_party/boringssl/include/openssl/tls1.h +60 -63
- data/third_party/boringssl/include/openssl/type_check.h +10 -14
- data/third_party/boringssl/include/openssl/x509.h +41 -116
- data/third_party/boringssl/include/openssl/x509_vfy.h +17 -25
- data/third_party/boringssl/include/openssl/x509v3.h +27 -21
- data/third_party/boringssl/ssl/{bio_ssl.c → bio_ssl.cc} +9 -5
- data/third_party/boringssl/ssl/{custom_extensions.c → custom_extensions.cc} +19 -12
- data/third_party/boringssl/ssl/{d1_both.c → d1_both.cc} +224 -193
- data/third_party/boringssl/ssl/{d1_lib.c → d1_lib.cc} +86 -79
- data/third_party/boringssl/ssl/{d1_pkt.c → d1_pkt.cc} +55 -87
- data/third_party/boringssl/ssl/{d1_srtp.c → d1_srtp.cc} +12 -16
- data/third_party/boringssl/ssl/{dtls_method.c → dtls_method.cc} +33 -50
- data/third_party/boringssl/ssl/{dtls_record.c → dtls_record.cc} +76 -64
- data/third_party/boringssl/ssl/handshake.cc +547 -0
- data/third_party/boringssl/ssl/handshake_client.cc +1828 -0
- data/third_party/boringssl/ssl/handshake_server.cc +1672 -0
- data/third_party/boringssl/ssl/internal.h +2027 -1280
- data/third_party/boringssl/ssl/s3_both.cc +603 -0
- data/third_party/boringssl/ssl/{s3_lib.c → s3_lib.cc} +22 -10
- data/third_party/boringssl/ssl/{s3_pkt.c → s3_pkt.cc} +171 -75
- data/third_party/boringssl/ssl/ssl_aead_ctx.cc +415 -0
- data/third_party/boringssl/ssl/{ssl_asn1.c → ssl_asn1.cc} +257 -261
- data/third_party/boringssl/ssl/{ssl_buffer.c → ssl_buffer.cc} +81 -97
- data/third_party/boringssl/ssl/{ssl_cert.c → ssl_cert.cc} +304 -414
- data/third_party/boringssl/ssl/{ssl_cipher.c → ssl_cipher.cc} +427 -505
- data/third_party/boringssl/ssl/{ssl_file.c → ssl_file.cc} +24 -16
- data/third_party/boringssl/ssl/ssl_key_share.cc +245 -0
- data/third_party/boringssl/ssl/{ssl_lib.c → ssl_lib.cc} +665 -828
- data/third_party/boringssl/ssl/ssl_privkey.cc +518 -0
- data/third_party/boringssl/ssl/{ssl_session.c → ssl_session.cc} +596 -471
- data/third_party/boringssl/ssl/{ssl_stat.c → ssl_stat.cc} +5 -224
- data/third_party/boringssl/ssl/{ssl_transcript.c → ssl_transcript.cc} +117 -140
- data/third_party/boringssl/ssl/ssl_versions.cc +439 -0
- data/third_party/boringssl/ssl/{ssl_x509.c → ssl_x509.cc} +751 -267
- data/third_party/boringssl/ssl/{t1_enc.c → t1_enc.cc} +120 -161
- data/third_party/boringssl/ssl/{t1_lib.c → t1_lib.cc} +859 -966
- data/third_party/boringssl/ssl/{tls13_both.c → tls13_both.cc} +202 -284
- data/third_party/boringssl/ssl/tls13_client.cc +842 -0
- data/third_party/boringssl/ssl/{tls13_enc.c → tls13_enc.cc} +108 -90
- data/third_party/boringssl/ssl/tls13_server.cc +967 -0
- data/third_party/boringssl/ssl/{tls_method.c → tls_method.cc} +94 -73
- data/third_party/boringssl/ssl/tls_record.cc +675 -0
- metadata +117 -168
- data/include/grpc/support/cmdline.h +0 -88
- data/include/grpc/support/subprocess.h +0 -44
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +0 -29
- data/src/core/ext/filters/client_channel/resolver_factory.cc +0 -40
- data/src/core/lib/gpr/cmdline.cc +0 -330
- data/src/core/lib/gpr/subprocess_posix.cc +0 -99
- data/src/core/lib/gpr/subprocess_windows.cc +0 -126
- data/src/core/lib/surface/alarm.cc +0 -137
- data/src/core/lib/surface/alarm_internal.h +0 -40
- data/src/core/tsi/gts_transport_security.cc +0 -40
- data/third_party/boringssl/crypto/aes/aes.c +0 -1142
- data/third_party/boringssl/crypto/aes/internal.h +0 -87
- data/third_party/boringssl/crypto/aes/key_wrap.c +0 -138
- data/third_party/boringssl/crypto/aes/mode_wrappers.c +0 -112
- data/third_party/boringssl/crypto/asn1/x_long.c +0 -200
- data/third_party/boringssl/crypto/bn/add.c +0 -377
- data/third_party/boringssl/crypto/bn/asm/x86_64-gcc.c +0 -532
- data/third_party/boringssl/crypto/bn/bn.c +0 -365
- data/third_party/boringssl/crypto/bn/cmp.c +0 -239
- data/third_party/boringssl/crypto/bn/ctx.c +0 -313
- data/third_party/boringssl/crypto/bn/div.c +0 -728
- data/third_party/boringssl/crypto/bn/exponentiation.c +0 -1240
- data/third_party/boringssl/crypto/bn/gcd.c +0 -635
- data/third_party/boringssl/crypto/bn/generic.c +0 -707
- data/third_party/boringssl/crypto/bn/kronecker.c +0 -176
- data/third_party/boringssl/crypto/bn/montgomery.c +0 -409
- data/third_party/boringssl/crypto/bn/montgomery_inv.c +0 -207
- data/third_party/boringssl/crypto/bn/mul.c +0 -871
- data/third_party/boringssl/crypto/bn/prime.c +0 -861
- data/third_party/boringssl/crypto/bn/random.c +0 -343
- data/third_party/boringssl/crypto/bn/rsaz_exp.c +0 -254
- data/third_party/boringssl/crypto/bn/shift.c +0 -307
- data/third_party/boringssl/crypto/bn/sqrt.c +0 -506
- data/third_party/boringssl/crypto/cipher/aead.c +0 -156
- data/third_party/boringssl/crypto/cipher/cipher.c +0 -657
- data/third_party/boringssl/crypto/cipher/e_aes.c +0 -1771
- data/third_party/boringssl/crypto/cipher/e_chacha20poly1305.c +0 -276
- data/third_party/boringssl/crypto/cipher/e_des.c +0 -205
- data/third_party/boringssl/crypto/cipher/tls_cbc.c +0 -482
- data/third_party/boringssl/crypto/des/des.c +0 -771
- data/third_party/boringssl/crypto/digest/digest.c +0 -251
- data/third_party/boringssl/crypto/digest/digests.c +0 -358
- data/third_party/boringssl/crypto/ec/ec.c +0 -847
- data/third_party/boringssl/crypto/ec/ec_key.c +0 -479
- data/third_party/boringssl/crypto/ec/ec_montgomery.c +0 -303
- data/third_party/boringssl/crypto/ec/oct.c +0 -416
- data/third_party/boringssl/crypto/ec/p224-64.c +0 -1143
- data/third_party/boringssl/crypto/ec/p256-64.c +0 -1701
- data/third_party/boringssl/crypto/ec/p256-x86_64.c +0 -561
- data/third_party/boringssl/crypto/ec/simple.c +0 -1118
- data/third_party/boringssl/crypto/ec/util-64.c +0 -109
- data/third_party/boringssl/crypto/ec/wnaf.c +0 -458
- data/third_party/boringssl/crypto/ecdsa/ecdsa.c +0 -479
- data/third_party/boringssl/crypto/hmac/hmac.c +0 -215
- data/third_party/boringssl/crypto/md4/md4.c +0 -236
- data/third_party/boringssl/crypto/md5/md5.c +0 -285
- data/third_party/boringssl/crypto/modes/cbc.c +0 -212
- data/third_party/boringssl/crypto/modes/cfb.c +0 -230
- data/third_party/boringssl/crypto/modes/ctr.c +0 -219
- data/third_party/boringssl/crypto/modes/gcm.c +0 -1071
- data/third_party/boringssl/crypto/modes/ofb.c +0 -95
- data/third_party/boringssl/crypto/modes/polyval.c +0 -94
- data/third_party/boringssl/crypto/pkcs8/p8_pkey.c +0 -85
- data/third_party/boringssl/crypto/rand/rand.c +0 -244
- data/third_party/boringssl/crypto/rand/urandom.c +0 -335
- data/third_party/boringssl/crypto/rsa/blinding.c +0 -265
- data/third_party/boringssl/crypto/rsa/padding.c +0 -708
- data/third_party/boringssl/crypto/rsa/rsa.c +0 -830
- data/third_party/boringssl/crypto/rsa/rsa_impl.c +0 -1100
- data/third_party/boringssl/crypto/sha/sha1-altivec.c +0 -346
- data/third_party/boringssl/crypto/sha/sha1.c +0 -355
- data/third_party/boringssl/crypto/sha/sha256.c +0 -329
- data/third_party/boringssl/crypto/sha/sha512.c +0 -609
- data/third_party/boringssl/crypto/x509/x509type.c +0 -126
- data/third_party/boringssl/include/openssl/stack_macros.h +0 -3987
- data/third_party/boringssl/ssl/handshake_client.c +0 -1883
- data/third_party/boringssl/ssl/handshake_server.c +0 -1950
- data/third_party/boringssl/ssl/s3_both.c +0 -895
- data/third_party/boringssl/ssl/ssl_aead_ctx.c +0 -335
- data/third_party/boringssl/ssl/ssl_ecdh.c +0 -465
- data/third_party/boringssl/ssl/ssl_privkey.c +0 -683
- data/third_party/boringssl/ssl/ssl_privkey_cc.cc +0 -76
- data/third_party/boringssl/ssl/tls13_client.c +0 -712
- data/third_party/boringssl/ssl/tls13_server.c +0 -680
- data/third_party/boringssl/ssl/tls_record.c +0 -556
@@ -59,27 +59,18 @@
|
|
59
59
|
#include <limits.h>
|
60
60
|
#include <string.h>
|
61
61
|
|
62
|
-
#include <openssl/asn1.h>
|
63
|
-
#include <openssl/buf.h>
|
64
62
|
#include <openssl/bytestring.h>
|
65
63
|
#include <openssl/cipher.h>
|
66
64
|
#include <openssl/digest.h>
|
67
65
|
#include <openssl/err.h>
|
68
|
-
#include <openssl/hmac.h>
|
69
66
|
#include <openssl/mem.h>
|
70
|
-
#include <openssl/
|
67
|
+
#include <openssl/nid.h>
|
71
68
|
#include <openssl/rand.h>
|
72
|
-
#include <openssl/x509.h>
|
73
69
|
|
74
70
|
#include "internal.h"
|
75
71
|
#include "../internal.h"
|
76
|
-
#include "../bytestring/internal.h"
|
77
72
|
|
78
73
|
|
79
|
-
#define PKCS12_KEY_ID 1
|
80
|
-
#define PKCS12_IV_ID 2
|
81
|
-
#define PKCS12_MAC_ID 3
|
82
|
-
|
83
74
|
static int ascii_to_ucs2(const char *ascii, size_t ascii_len,
|
84
75
|
uint8_t **out, size_t *out_len) {
|
85
76
|
size_t ulen = ascii_len * 2 + 2;
|
@@ -89,6 +80,7 @@ static int ascii_to_ucs2(const char *ascii, size_t ascii_len,
|
|
89
80
|
|
90
81
|
uint8_t *unitmp = OPENSSL_malloc(ulen);
|
91
82
|
if (unitmp == NULL) {
|
83
|
+
OPENSSL_PUT_ERROR(PKCS8, ERR_R_MALLOC_FAILURE);
|
92
84
|
return 0;
|
93
85
|
}
|
94
86
|
for (size_t i = 0; i < ulen - 2; i += 2) {
|
@@ -96,7 +88,7 @@ static int ascii_to_ucs2(const char *ascii, size_t ascii_len,
|
|
96
88
|
unitmp[i + 1] = ascii[i >> 1];
|
97
89
|
}
|
98
90
|
|
99
|
-
|
91
|
+
// Terminate the result with a UCS-2 NUL.
|
100
92
|
unitmp[ulen - 2] = 0;
|
101
93
|
unitmp[ulen - 1] = 0;
|
102
94
|
*out_len = ulen;
|
@@ -104,54 +96,64 @@ static int ascii_to_ucs2(const char *ascii, size_t ascii_len,
|
|
104
96
|
return 1;
|
105
97
|
}
|
106
98
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
/* See https://tools.ietf.org/html/rfc7292#appendix-B. Quoted parts of the
|
113
|
-
* specification have errata applied and other typos fixed. */
|
99
|
+
int pkcs12_key_gen(const char *pass, size_t pass_len, const uint8_t *salt,
|
100
|
+
size_t salt_len, uint8_t id, unsigned iterations,
|
101
|
+
size_t out_len, uint8_t *out, const EVP_MD *md) {
|
102
|
+
// See https://tools.ietf.org/html/rfc7292#appendix-B. Quoted parts of the
|
103
|
+
// specification have errata applied and other typos fixed.
|
114
104
|
|
115
105
|
if (iterations < 1) {
|
116
106
|
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_ITERATION_COUNT);
|
117
107
|
return 0;
|
118
108
|
}
|
119
109
|
|
120
|
-
|
110
|
+
int ret = 0;
|
111
|
+
EVP_MD_CTX ctx;
|
112
|
+
EVP_MD_CTX_init(&ctx);
|
113
|
+
uint8_t *pass_raw = NULL, *I = NULL;
|
114
|
+
size_t pass_raw_len = 0, I_len = 0;
|
115
|
+
// If |pass| is NULL, we use the empty string rather than {0, 0} as the raw
|
116
|
+
// password.
|
117
|
+
if (pass != NULL &&
|
118
|
+
!ascii_to_ucs2(pass, pass_len, &pass_raw, &pass_raw_len)) {
|
119
|
+
goto err;
|
120
|
+
}
|
121
|
+
|
122
|
+
// In the spec, |block_size| is called "v", but measured in bits.
|
121
123
|
size_t block_size = EVP_MD_block_size(md);
|
122
124
|
|
123
|
-
|
124
|
-
|
125
|
+
// 1. Construct a string, D (the "diversifier"), by concatenating v/8 copies
|
126
|
+
// of ID.
|
125
127
|
uint8_t D[EVP_MAX_MD_BLOCK_SIZE];
|
126
128
|
OPENSSL_memset(D, id, block_size);
|
127
129
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
130
|
+
// 2. Concatenate copies of the salt together to create a string S of length
|
131
|
+
// v(ceiling(s/v)) bits (the final copy of the salt may be truncated to
|
132
|
+
// create S). Note that if the salt is the empty string, then so is S.
|
133
|
+
//
|
134
|
+
// 3. Concatenate copies of the password together to create a string P of
|
135
|
+
// length v(ceiling(p/v)) bits (the final copy of the password may be
|
136
|
+
// truncated to create P). Note that if the password is the empty string,
|
137
|
+
// then so is P.
|
138
|
+
//
|
139
|
+
// 4. Set I=S||P to be the concatenation of S and P.
|
138
140
|
if (salt_len + block_size - 1 < salt_len ||
|
139
141
|
pass_raw_len + block_size - 1 < pass_raw_len) {
|
140
142
|
OPENSSL_PUT_ERROR(PKCS8, ERR_R_OVERFLOW);
|
141
|
-
|
143
|
+
goto err;
|
142
144
|
}
|
143
145
|
size_t S_len = block_size * ((salt_len + block_size - 1) / block_size);
|
144
146
|
size_t P_len = block_size * ((pass_raw_len + block_size - 1) / block_size);
|
145
|
-
|
147
|
+
I_len = S_len + P_len;
|
146
148
|
if (I_len < S_len) {
|
147
149
|
OPENSSL_PUT_ERROR(PKCS8, ERR_R_OVERFLOW);
|
148
|
-
|
150
|
+
goto err;
|
149
151
|
}
|
150
152
|
|
151
|
-
|
153
|
+
I = OPENSSL_malloc(I_len);
|
152
154
|
if (I_len != 0 && I == NULL) {
|
153
155
|
OPENSSL_PUT_ERROR(PKCS8, ERR_R_MALLOC_FAILURE);
|
154
|
-
|
156
|
+
goto err;
|
155
157
|
}
|
156
158
|
|
157
159
|
for (size_t i = 0; i < S_len; i++) {
|
@@ -161,13 +163,9 @@ static int pkcs12_key_gen_raw(const uint8_t *pass_raw, size_t pass_raw_len,
|
|
161
163
|
I[i + S_len] = pass_raw[i % pass_raw_len];
|
162
164
|
}
|
163
165
|
|
164
|
-
int ret = 0;
|
165
|
-
EVP_MD_CTX ctx;
|
166
|
-
EVP_MD_CTX_init(&ctx);
|
167
|
-
|
168
166
|
while (out_len != 0) {
|
169
|
-
|
170
|
-
|
167
|
+
// A. Set A_i=H^r(D||I). (i.e., the r-th hash of D||I,
|
168
|
+
// H(H(H(... H(D||I))))
|
171
169
|
uint8_t A[EVP_MAX_MD_SIZE];
|
172
170
|
unsigned A_len;
|
173
171
|
if (!EVP_DigestInit_ex(&ctx, md, NULL) ||
|
@@ -192,16 +190,16 @@ static int pkcs12_key_gen_raw(const uint8_t *pass_raw, size_t pass_raw_len,
|
|
192
190
|
break;
|
193
191
|
}
|
194
192
|
|
195
|
-
|
196
|
-
|
193
|
+
// B. Concatenate copies of A_i to create a string B of length v bits (the
|
194
|
+
// final copy of A_i may be truncated to create B).
|
197
195
|
uint8_t B[EVP_MAX_MD_BLOCK_SIZE];
|
198
196
|
for (size_t i = 0; i < block_size; i++) {
|
199
197
|
B[i] = A[i % A_len];
|
200
198
|
}
|
201
199
|
|
202
|
-
|
203
|
-
|
204
|
-
|
200
|
+
// C. Treating I as a concatenation I_0, I_1, ..., I_(k-1) of v-bit blocks,
|
201
|
+
// where k=ceiling(s/v)+ceiling(p/v), modify I by setting I_j=(I_j+B+1) mod
|
202
|
+
// 2^v for each j.
|
205
203
|
assert(I_len % block_size == 0);
|
206
204
|
for (size_t i = 0; i < I_len; i += block_size) {
|
207
205
|
unsigned carry = 1;
|
@@ -216,32 +214,26 @@ static int pkcs12_key_gen_raw(const uint8_t *pass_raw, size_t pass_raw_len,
|
|
216
214
|
ret = 1;
|
217
215
|
|
218
216
|
err:
|
219
|
-
OPENSSL_cleanse(I, I_len);
|
220
217
|
OPENSSL_free(I);
|
218
|
+
OPENSSL_free(pass_raw);
|
221
219
|
EVP_MD_CTX_cleanup(&ctx);
|
222
220
|
return ret;
|
223
221
|
}
|
224
222
|
|
225
223
|
static int pkcs12_pbe_cipher_init(const struct pbe_suite *suite,
|
226
224
|
EVP_CIPHER_CTX *ctx, unsigned iterations,
|
227
|
-
const
|
225
|
+
const char *pass, size_t pass_len,
|
228
226
|
const uint8_t *salt, size_t salt_len,
|
229
227
|
int is_encrypt) {
|
230
228
|
const EVP_CIPHER *cipher = suite->cipher_func();
|
231
229
|
const EVP_MD *md = suite->md_func();
|
232
230
|
|
233
231
|
uint8_t key[EVP_MAX_KEY_LENGTH];
|
234
|
-
if (!pkcs12_key_gen_raw(pass_raw, pass_raw_len, salt,
|
235
|
-
salt_len, PKCS12_KEY_ID, iterations,
|
236
|
-
EVP_CIPHER_key_length(cipher), key, md)) {
|
237
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_KEY_GEN_ERROR);
|
238
|
-
return 0;
|
239
|
-
}
|
240
|
-
|
241
232
|
uint8_t iv[EVP_MAX_IV_LENGTH];
|
242
|
-
if (!
|
243
|
-
|
244
|
-
|
233
|
+
if (!pkcs12_key_gen(pass, pass_len, salt, salt_len, PKCS12_KEY_ID, iterations,
|
234
|
+
EVP_CIPHER_key_length(cipher), key, md) ||
|
235
|
+
!pkcs12_key_gen(pass, pass_len, salt, salt_len, PKCS12_IV_ID, iterations,
|
236
|
+
EVP_CIPHER_iv_length(cipher), iv, md)) {
|
245
237
|
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_KEY_GEN_ERROR);
|
246
238
|
return 0;
|
247
239
|
}
|
@@ -253,8 +245,8 @@ static int pkcs12_pbe_cipher_init(const struct pbe_suite *suite,
|
|
253
245
|
}
|
254
246
|
|
255
247
|
static int pkcs12_pbe_decrypt_init(const struct pbe_suite *suite,
|
256
|
-
EVP_CIPHER_CTX *ctx, const
|
257
|
-
size_t
|
248
|
+
EVP_CIPHER_CTX *ctx, const char *pass,
|
249
|
+
size_t pass_len, CBS *param) {
|
258
250
|
CBS pbe_param, salt;
|
259
251
|
uint64_t iterations;
|
260
252
|
if (!CBS_get_asn1(param, &pbe_param, CBS_ASN1_SEQUENCE) ||
|
@@ -271,32 +263,52 @@ static int pkcs12_pbe_decrypt_init(const struct pbe_suite *suite,
|
|
271
263
|
return 0;
|
272
264
|
}
|
273
265
|
|
274
|
-
return pkcs12_pbe_cipher_init(suite, ctx, (unsigned)iterations,
|
275
|
-
|
266
|
+
return pkcs12_pbe_cipher_init(suite, ctx, (unsigned)iterations, pass,
|
267
|
+
pass_len, CBS_data(&salt), CBS_len(&salt),
|
276
268
|
0 /* decrypt */);
|
277
269
|
}
|
278
270
|
|
279
271
|
static const struct pbe_suite kBuiltinPBE[] = {
|
280
272
|
{
|
281
|
-
NID_pbe_WithSHA1And40BitRC2_CBC,
|
282
|
-
|
273
|
+
NID_pbe_WithSHA1And40BitRC2_CBC,
|
274
|
+
// 1.2.840.113549.1.12.1.6
|
275
|
+
{0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x0c, 0x01, 0x06},
|
276
|
+
10,
|
277
|
+
EVP_rc2_40_cbc,
|
278
|
+
EVP_sha1,
|
279
|
+
pkcs12_pbe_decrypt_init,
|
283
280
|
},
|
284
281
|
{
|
285
|
-
NID_pbe_WithSHA1And128BitRC4,
|
286
|
-
|
282
|
+
NID_pbe_WithSHA1And128BitRC4,
|
283
|
+
// 1.2.840.113549.1.12.1.1
|
284
|
+
{0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x0c, 0x01, 0x01},
|
285
|
+
10,
|
286
|
+
EVP_rc4,
|
287
|
+
EVP_sha1,
|
288
|
+
pkcs12_pbe_decrypt_init,
|
287
289
|
},
|
288
290
|
{
|
289
|
-
NID_pbe_WithSHA1And3_Key_TripleDES_CBC,
|
290
|
-
|
291
|
+
NID_pbe_WithSHA1And3_Key_TripleDES_CBC,
|
292
|
+
// 1.2.840.113549.1.12.1.3
|
293
|
+
{0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x0c, 0x01, 0x03},
|
294
|
+
10,
|
295
|
+
EVP_des_ede3_cbc,
|
296
|
+
EVP_sha1,
|
297
|
+
pkcs12_pbe_decrypt_init,
|
291
298
|
},
|
292
299
|
{
|
293
|
-
NID_pbes2,
|
300
|
+
NID_pbes2,
|
301
|
+
// 1.2.840.113549.1.5.13
|
302
|
+
{0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x05, 0x0d},
|
303
|
+
9,
|
304
|
+
NULL,
|
305
|
+
NULL,
|
306
|
+
PKCS5_pbe2_decrypt_init,
|
294
307
|
},
|
295
308
|
};
|
296
309
|
|
297
310
|
static const struct pbe_suite *get_pbe_suite(int pbe_nid) {
|
298
|
-
unsigned i;
|
299
|
-
for (i = 0; i < OPENSSL_ARRAY_SIZE(kBuiltinPBE); i++) {
|
311
|
+
for (unsigned i = 0; i < OPENSSL_ARRAY_SIZE(kBuiltinPBE); i++) {
|
300
312
|
if (kBuiltinPBE[i].pbe_nid == pbe_nid) {
|
301
313
|
return &kBuiltinPBE[i];
|
302
314
|
}
|
@@ -305,51 +317,9 @@ static const struct pbe_suite *get_pbe_suite(int pbe_nid) {
|
|
305
317
|
return NULL;
|
306
318
|
}
|
307
319
|
|
308
|
-
/* pass_to_pass_raw performs a password conversion (possibly a no-op)
|
309
|
-
* appropriate to the supplied |pbe_nid|. The input |pass| is treated as a
|
310
|
-
* NUL-terminated string if |pass_len| is -1, otherwise it is treated as a
|
311
|
-
* buffer of the specified length. If the supplied PBE NID sets the
|
312
|
-
* |PBE_UCS2_CONVERT_PASSWORD| flag, the supplied |pass| will be converted to
|
313
|
-
* UCS-2.
|
314
|
-
*
|
315
|
-
* It sets |*out_pass_raw| to a new buffer that must be freed by the caller. It
|
316
|
-
* returns one on success and zero on error. */
|
317
|
-
static int pass_to_pass_raw(int pbe_nid, const char *pass, int pass_len,
|
318
|
-
uint8_t **out_pass_raw, size_t *out_pass_raw_len) {
|
319
|
-
if (pass == NULL) {
|
320
|
-
*out_pass_raw = NULL;
|
321
|
-
*out_pass_raw_len = 0;
|
322
|
-
return 1;
|
323
|
-
}
|
324
|
-
|
325
|
-
if (pass_len == -1) {
|
326
|
-
pass_len = strlen(pass);
|
327
|
-
} else if (pass_len < 0 || pass_len > 2000000000) {
|
328
|
-
OPENSSL_PUT_ERROR(PKCS8, ERR_R_OVERFLOW);
|
329
|
-
return 0;
|
330
|
-
}
|
331
|
-
|
332
|
-
const struct pbe_suite *suite = get_pbe_suite(pbe_nid);
|
333
|
-
if (suite != NULL && (suite->flags & PBE_UCS2_CONVERT_PASSWORD)) {
|
334
|
-
if (!ascii_to_ucs2(pass, pass_len, out_pass_raw, out_pass_raw_len)) {
|
335
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_DECODE_ERROR);
|
336
|
-
return 0;
|
337
|
-
}
|
338
|
-
} else {
|
339
|
-
*out_pass_raw = BUF_memdup(pass, pass_len);
|
340
|
-
if (*out_pass_raw == NULL) {
|
341
|
-
OPENSSL_PUT_ERROR(PKCS8, ERR_R_MALLOC_FAILURE);
|
342
|
-
return 0;
|
343
|
-
}
|
344
|
-
*out_pass_raw_len = (size_t)pass_len;
|
345
|
-
}
|
346
|
-
|
347
|
-
return 1;
|
348
|
-
}
|
349
|
-
|
350
320
|
static int pkcs12_pbe_encrypt_init(CBB *out, EVP_CIPHER_CTX *ctx, int alg,
|
351
|
-
unsigned iterations, const
|
352
|
-
size_t
|
321
|
+
unsigned iterations, const char *pass,
|
322
|
+
size_t pass_len, const uint8_t *salt,
|
353
323
|
size_t salt_len) {
|
354
324
|
const struct pbe_suite *suite = get_pbe_suite(alg);
|
355
325
|
if (suite == NULL) {
|
@@ -357,10 +327,11 @@ static int pkcs12_pbe_encrypt_init(CBB *out, EVP_CIPHER_CTX *ctx, int alg,
|
|
357
327
|
return 0;
|
358
328
|
}
|
359
329
|
|
360
|
-
|
361
|
-
CBB algorithm, param, salt_cbb;
|
330
|
+
// See RFC 2898, appendix A.3.
|
331
|
+
CBB algorithm, oid, param, salt_cbb;
|
362
332
|
if (!CBB_add_asn1(out, &algorithm, CBS_ASN1_SEQUENCE) ||
|
363
|
-
!
|
333
|
+
!CBB_add_asn1(&algorithm, &oid, CBS_ASN1_OBJECT) ||
|
334
|
+
!CBB_add_bytes(&oid, suite->oid, suite->oid_len) ||
|
364
335
|
!CBB_add_asn1(&algorithm, ¶m, CBS_ASN1_SEQUENCE) ||
|
365
336
|
!CBB_add_asn1(¶m, &salt_cbb, CBS_ASN1_OCTETSTRING) ||
|
366
337
|
!CBB_add_bytes(&salt_cbb, salt, salt_len) ||
|
@@ -369,13 +340,13 @@ static int pkcs12_pbe_encrypt_init(CBB *out, EVP_CIPHER_CTX *ctx, int alg,
|
|
369
340
|
return 0;
|
370
341
|
}
|
371
342
|
|
372
|
-
return pkcs12_pbe_cipher_init(suite, ctx, iterations,
|
373
|
-
|
343
|
+
return pkcs12_pbe_cipher_init(suite, ctx, iterations, pass, pass_len, salt,
|
344
|
+
salt_len, 1 /* encrypt */);
|
374
345
|
}
|
375
346
|
|
376
|
-
|
377
|
-
|
378
|
-
|
347
|
+
int pkcs8_pbe_decrypt(uint8_t **out, size_t *out_len, CBS *algorithm,
|
348
|
+
const char *pass, size_t pass_len, const uint8_t *in,
|
349
|
+
size_t in_len) {
|
379
350
|
int ret = 0;
|
380
351
|
uint8_t *buf = NULL;;
|
381
352
|
EVP_CIPHER_CTX ctx;
|
@@ -387,13 +358,19 @@ static int pbe_decrypt(uint8_t **out, size_t *out_len, CBS *algorithm,
|
|
387
358
|
goto err;
|
388
359
|
}
|
389
360
|
|
390
|
-
const struct pbe_suite *suite =
|
361
|
+
const struct pbe_suite *suite = NULL;
|
362
|
+
for (unsigned i = 0; i < OPENSSL_ARRAY_SIZE(kBuiltinPBE); i++) {
|
363
|
+
if (CBS_mem_equal(&obj, kBuiltinPBE[i].oid, kBuiltinPBE[i].oid_len)) {
|
364
|
+
suite = &kBuiltinPBE[i];
|
365
|
+
break;
|
366
|
+
}
|
367
|
+
}
|
391
368
|
if (suite == NULL) {
|
392
369
|
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_UNKNOWN_ALGORITHM);
|
393
370
|
goto err;
|
394
371
|
}
|
395
372
|
|
396
|
-
if (!suite->decrypt_init(suite, &ctx,
|
373
|
+
if (!suite->decrypt_init(suite, &ctx, pass, pass_len, algorithm)) {
|
397
374
|
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_KEYGEN_FAILURE);
|
398
375
|
goto err;
|
399
376
|
}
|
@@ -426,90 +403,44 @@ err:
|
|
426
403
|
return ret;
|
427
404
|
}
|
428
405
|
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
size_t out_len = 0;
|
435
|
-
|
436
|
-
/* Convert the legacy ASN.1 object to a byte string. */
|
437
|
-
int in_len = i2d_X509_SIG(pkcs8, &in);
|
438
|
-
if (in_len < 0) {
|
439
|
-
goto err;
|
440
|
-
}
|
441
|
-
|
442
|
-
/* See RFC 5208, section 6. */
|
443
|
-
CBS cbs, epki, algorithm, ciphertext;
|
444
|
-
CBS_init(&cbs, in, in_len);
|
445
|
-
if (!CBS_get_asn1(&cbs, &epki, CBS_ASN1_SEQUENCE) ||
|
406
|
+
EVP_PKEY *PKCS8_parse_encrypted_private_key(CBS *cbs, const char *pass,
|
407
|
+
size_t pass_len) {
|
408
|
+
// See RFC 5208, section 6.
|
409
|
+
CBS epki, algorithm, ciphertext;
|
410
|
+
if (!CBS_get_asn1(cbs, &epki, CBS_ASN1_SEQUENCE) ||
|
446
411
|
!CBS_get_asn1(&epki, &algorithm, CBS_ASN1_SEQUENCE) ||
|
447
412
|
!CBS_get_asn1(&epki, &ciphertext, CBS_ASN1_OCTETSTRING) ||
|
448
|
-
CBS_len(&epki) != 0
|
449
|
-
CBS_len(&cbs) != 0) {
|
450
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_DECODE_ERROR);
|
451
|
-
goto err;
|
452
|
-
}
|
453
|
-
|
454
|
-
if (!pbe_decrypt(&out, &out_len, &algorithm, pass_raw, pass_raw_len,
|
455
|
-
CBS_data(&ciphertext), CBS_len(&ciphertext))) {
|
456
|
-
goto err;
|
457
|
-
}
|
458
|
-
|
459
|
-
if (out_len > LONG_MAX) {
|
413
|
+
CBS_len(&epki) != 0) {
|
460
414
|
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_DECODE_ERROR);
|
461
|
-
|
415
|
+
return 0;
|
462
416
|
}
|
463
417
|
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_DECODE_ERROR);
|
470
|
-
PKCS8_PRIV_KEY_INFO_free(ret);
|
471
|
-
ret = NULL;
|
418
|
+
uint8_t *out;
|
419
|
+
size_t out_len;
|
420
|
+
if (!pkcs8_pbe_decrypt(&out, &out_len, &algorithm, pass, pass_len,
|
421
|
+
CBS_data(&ciphertext), CBS_len(&ciphertext))) {
|
422
|
+
return 0;
|
472
423
|
}
|
473
424
|
|
474
|
-
|
475
|
-
|
476
|
-
|
425
|
+
CBS pki;
|
426
|
+
CBS_init(&pki, out, out_len);
|
427
|
+
EVP_PKEY *ret = EVP_parse_private_key(&pki);
|
477
428
|
OPENSSL_free(out);
|
478
429
|
return ret;
|
479
430
|
}
|
480
431
|
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
PKCS8_PRIV_KEY_INFO *ret = pkcs8_decrypt_raw(pkcs8, pass_raw, pass_raw_len);
|
491
|
-
|
492
|
-
if (pass_raw) {
|
493
|
-
OPENSSL_cleanse(pass_raw, pass_raw_len);
|
494
|
-
OPENSSL_free(pass_raw);
|
495
|
-
}
|
496
|
-
return ret;
|
497
|
-
}
|
498
|
-
|
499
|
-
static X509_SIG *pkcs8_encrypt_raw(int pbe_nid, const EVP_CIPHER *cipher,
|
500
|
-
const uint8_t *pass_raw, size_t pass_raw_len,
|
501
|
-
const uint8_t *salt, size_t salt_len,
|
502
|
-
int iterations, PKCS8_PRIV_KEY_INFO *p8inf) {
|
503
|
-
X509_SIG *ret = NULL;
|
504
|
-
uint8_t *plaintext = NULL, *salt_buf = NULL, *der = NULL;
|
505
|
-
int plaintext_len = -1;
|
506
|
-
size_t der_len;
|
507
|
-
CBB cbb;
|
508
|
-
CBB_zero(&cbb);
|
432
|
+
int PKCS8_marshal_encrypted_private_key(CBB *out, int pbe_nid,
|
433
|
+
const EVP_CIPHER *cipher,
|
434
|
+
const char *pass, size_t pass_len,
|
435
|
+
const uint8_t *salt, size_t salt_len,
|
436
|
+
int iterations, const EVP_PKEY *pkey) {
|
437
|
+
int ret = 0;
|
438
|
+
uint8_t *plaintext = NULL, *salt_buf = NULL;
|
439
|
+
size_t plaintext_len = 0;
|
509
440
|
EVP_CIPHER_CTX ctx;
|
510
441
|
EVP_CIPHER_CTX_init(&ctx);
|
511
442
|
|
512
|
-
|
443
|
+
// Generate a random salt if necessary.
|
513
444
|
if (salt == NULL) {
|
514
445
|
if (salt_len == 0) {
|
515
446
|
salt_len = PKCS5_SALT_LEN;
|
@@ -528,699 +459,55 @@ static X509_SIG *pkcs8_encrypt_raw(int pbe_nid, const EVP_CIPHER *cipher,
|
|
528
459
|
iterations = PKCS5_DEFAULT_ITERATIONS;
|
529
460
|
}
|
530
461
|
|
531
|
-
|
532
|
-
|
533
|
-
if (
|
462
|
+
// Serialize the input key.
|
463
|
+
CBB plaintext_cbb;
|
464
|
+
if (!CBB_init(&plaintext_cbb, 128) ||
|
465
|
+
!EVP_marshal_private_key(&plaintext_cbb, pkey) ||
|
466
|
+
!CBB_finish(&plaintext_cbb, &plaintext, &plaintext_len)) {
|
467
|
+
CBB_cleanup(&plaintext_cbb);
|
534
468
|
goto err;
|
535
469
|
}
|
536
470
|
|
537
471
|
CBB epki;
|
538
|
-
if (!
|
539
|
-
!CBB_add_asn1(&cbb, &epki, CBS_ASN1_SEQUENCE)) {
|
472
|
+
if (!CBB_add_asn1(out, &epki, CBS_ASN1_SEQUENCE)) {
|
540
473
|
goto err;
|
541
474
|
}
|
542
475
|
|
543
476
|
int alg_ok;
|
544
477
|
if (pbe_nid == -1) {
|
545
478
|
alg_ok = PKCS5_pbe2_encrypt_init(&epki, &ctx, cipher, (unsigned)iterations,
|
546
|
-
|
479
|
+
pass, pass_len, salt, salt_len);
|
547
480
|
} else {
|
548
481
|
alg_ok = pkcs12_pbe_encrypt_init(&epki, &ctx, pbe_nid, (unsigned)iterations,
|
549
|
-
|
482
|
+
pass, pass_len, salt, salt_len);
|
550
483
|
}
|
551
484
|
if (!alg_ok) {
|
552
485
|
goto err;
|
553
486
|
}
|
554
487
|
|
555
|
-
size_t max_out =
|
556
|
-
if (max_out <
|
488
|
+
size_t max_out = plaintext_len + EVP_CIPHER_CTX_block_size(&ctx);
|
489
|
+
if (max_out < plaintext_len) {
|
557
490
|
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_TOO_LONG);
|
558
491
|
goto err;
|
559
492
|
}
|
560
493
|
|
561
494
|
CBB ciphertext;
|
562
|
-
uint8_t *
|
495
|
+
uint8_t *ptr;
|
563
496
|
int n1, n2;
|
564
497
|
if (!CBB_add_asn1(&epki, &ciphertext, CBS_ASN1_OCTETSTRING) ||
|
565
|
-
!CBB_reserve(&ciphertext, &
|
566
|
-
!EVP_CipherUpdate(&ctx,
|
567
|
-
!EVP_CipherFinal_ex(&ctx,
|
498
|
+
!CBB_reserve(&ciphertext, &ptr, max_out) ||
|
499
|
+
!EVP_CipherUpdate(&ctx, ptr, &n1, plaintext, plaintext_len) ||
|
500
|
+
!EVP_CipherFinal_ex(&ctx, ptr + n1, &n2) ||
|
568
501
|
!CBB_did_write(&ciphertext, n1 + n2) ||
|
569
|
-
!
|
502
|
+
!CBB_flush(out)) {
|
570
503
|
goto err;
|
571
504
|
}
|
572
505
|
|
573
|
-
|
574
|
-
const uint8_t *ptr = der;
|
575
|
-
ret = d2i_X509_SIG(NULL, &ptr, der_len);
|
576
|
-
if (ret == NULL || ptr != der + der_len) {
|
577
|
-
OPENSSL_PUT_ERROR(PKCS8, ERR_R_INTERNAL_ERROR);
|
578
|
-
X509_SIG_free(ret);
|
579
|
-
ret = NULL;
|
580
|
-
}
|
506
|
+
ret = 1;
|
581
507
|
|
582
508
|
err:
|
583
|
-
if (plaintext_len > 0) {
|
584
|
-
OPENSSL_cleanse(plaintext, plaintext_len);
|
585
|
-
}
|
586
509
|
OPENSSL_free(plaintext);
|
587
510
|
OPENSSL_free(salt_buf);
|
588
|
-
OPENSSL_free(der);
|
589
|
-
CBB_cleanup(&cbb);
|
590
511
|
EVP_CIPHER_CTX_cleanup(&ctx);
|
591
512
|
return ret;
|
592
513
|
}
|
593
|
-
|
594
|
-
X509_SIG *PKCS8_encrypt(int pbe_nid, const EVP_CIPHER *cipher, const char *pass,
|
595
|
-
int pass_len, const uint8_t *salt, size_t salt_len,
|
596
|
-
int iterations, PKCS8_PRIV_KEY_INFO *p8inf) {
|
597
|
-
uint8_t *pass_raw = NULL;
|
598
|
-
size_t pass_raw_len = 0;
|
599
|
-
if (!pass_to_pass_raw(pbe_nid, pass, pass_len, &pass_raw, &pass_raw_len)) {
|
600
|
-
return NULL;
|
601
|
-
}
|
602
|
-
|
603
|
-
X509_SIG *ret = pkcs8_encrypt_raw(pbe_nid, cipher, pass_raw, pass_raw_len,
|
604
|
-
salt, salt_len, iterations, p8inf);
|
605
|
-
|
606
|
-
if (pass_raw) {
|
607
|
-
OPENSSL_cleanse(pass_raw, pass_raw_len);
|
608
|
-
OPENSSL_free(pass_raw);
|
609
|
-
}
|
610
|
-
return ret;
|
611
|
-
}
|
612
|
-
|
613
|
-
EVP_PKEY *EVP_PKCS82PKEY(PKCS8_PRIV_KEY_INFO *p8) {
|
614
|
-
uint8_t *der = NULL;
|
615
|
-
int der_len = i2d_PKCS8_PRIV_KEY_INFO(p8, &der);
|
616
|
-
if (der_len < 0) {
|
617
|
-
return NULL;
|
618
|
-
}
|
619
|
-
|
620
|
-
CBS cbs;
|
621
|
-
CBS_init(&cbs, der, (size_t)der_len);
|
622
|
-
EVP_PKEY *ret = EVP_parse_private_key(&cbs);
|
623
|
-
if (ret == NULL || CBS_len(&cbs) != 0) {
|
624
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_DECODE_ERROR);
|
625
|
-
EVP_PKEY_free(ret);
|
626
|
-
OPENSSL_free(der);
|
627
|
-
return NULL;
|
628
|
-
}
|
629
|
-
|
630
|
-
OPENSSL_free(der);
|
631
|
-
return ret;
|
632
|
-
}
|
633
|
-
|
634
|
-
PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(EVP_PKEY *pkey) {
|
635
|
-
CBB cbb;
|
636
|
-
uint8_t *der = NULL;
|
637
|
-
size_t der_len;
|
638
|
-
if (!CBB_init(&cbb, 0) ||
|
639
|
-
!EVP_marshal_private_key(&cbb, pkey) ||
|
640
|
-
!CBB_finish(&cbb, &der, &der_len) ||
|
641
|
-
der_len > LONG_MAX) {
|
642
|
-
CBB_cleanup(&cbb);
|
643
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_ENCODE_ERROR);
|
644
|
-
goto err;
|
645
|
-
}
|
646
|
-
|
647
|
-
const uint8_t *p = der;
|
648
|
-
PKCS8_PRIV_KEY_INFO *p8 = d2i_PKCS8_PRIV_KEY_INFO(NULL, &p, (long)der_len);
|
649
|
-
if (p8 == NULL || p != der + der_len) {
|
650
|
-
PKCS8_PRIV_KEY_INFO_free(p8);
|
651
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_DECODE_ERROR);
|
652
|
-
goto err;
|
653
|
-
}
|
654
|
-
|
655
|
-
OPENSSL_free(der);
|
656
|
-
return p8;
|
657
|
-
|
658
|
-
err:
|
659
|
-
OPENSSL_free(der);
|
660
|
-
return NULL;
|
661
|
-
}
|
662
|
-
|
663
|
-
struct pkcs12_context {
|
664
|
-
EVP_PKEY **out_key;
|
665
|
-
STACK_OF(X509) *out_certs;
|
666
|
-
uint8_t *password;
|
667
|
-
size_t password_len;
|
668
|
-
};
|
669
|
-
|
670
|
-
/* PKCS12_handle_sequence parses a BER-encoded SEQUENCE of elements in a PKCS#12
|
671
|
-
* structure. */
|
672
|
-
static int PKCS12_handle_sequence(
|
673
|
-
CBS *sequence, struct pkcs12_context *ctx,
|
674
|
-
int (*handle_element)(CBS *cbs, struct pkcs12_context *ctx)) {
|
675
|
-
uint8_t *der_bytes = NULL;
|
676
|
-
size_t der_len;
|
677
|
-
CBS in;
|
678
|
-
int ret = 0;
|
679
|
-
|
680
|
-
/* Although a BER->DER conversion is done at the beginning of |PKCS12_parse|,
|
681
|
-
* the ASN.1 data gets wrapped in OCTETSTRINGs and/or encrypted and the
|
682
|
-
* conversion cannot see through those wrappings. So each time we step
|
683
|
-
* through one we need to convert to DER again. */
|
684
|
-
if (!CBS_asn1_ber_to_der(sequence, &der_bytes, &der_len)) {
|
685
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_PKCS12_DATA);
|
686
|
-
return 0;
|
687
|
-
}
|
688
|
-
|
689
|
-
if (der_bytes != NULL) {
|
690
|
-
CBS_init(&in, der_bytes, der_len);
|
691
|
-
} else {
|
692
|
-
CBS_init(&in, CBS_data(sequence), CBS_len(sequence));
|
693
|
-
}
|
694
|
-
|
695
|
-
CBS child;
|
696
|
-
if (!CBS_get_asn1(&in, &child, CBS_ASN1_SEQUENCE) ||
|
697
|
-
CBS_len(&in) != 0) {
|
698
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_PKCS12_DATA);
|
699
|
-
goto err;
|
700
|
-
}
|
701
|
-
|
702
|
-
while (CBS_len(&child) > 0) {
|
703
|
-
CBS element;
|
704
|
-
if (!CBS_get_asn1(&child, &element, CBS_ASN1_SEQUENCE)) {
|
705
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_PKCS12_DATA);
|
706
|
-
goto err;
|
707
|
-
}
|
708
|
-
|
709
|
-
if (!handle_element(&element, ctx)) {
|
710
|
-
goto err;
|
711
|
-
}
|
712
|
-
}
|
713
|
-
|
714
|
-
ret = 1;
|
715
|
-
|
716
|
-
err:
|
717
|
-
OPENSSL_free(der_bytes);
|
718
|
-
return ret;
|
719
|
-
}
|
720
|
-
|
721
|
-
/* PKCS12_handle_safe_bag parses a single SafeBag element in a PKCS#12
|
722
|
-
* structure. */
|
723
|
-
static int PKCS12_handle_safe_bag(CBS *safe_bag, struct pkcs12_context *ctx) {
|
724
|
-
CBS bag_id, wrapped_value;
|
725
|
-
if (!CBS_get_asn1(safe_bag, &bag_id, CBS_ASN1_OBJECT) ||
|
726
|
-
!CBS_get_asn1(safe_bag, &wrapped_value,
|
727
|
-
CBS_ASN1_CONTEXT_SPECIFIC | CBS_ASN1_CONSTRUCTED | 0)
|
728
|
-
/* Ignore the bagAttributes field. */) {
|
729
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_PKCS12_DATA);
|
730
|
-
return 0;
|
731
|
-
}
|
732
|
-
|
733
|
-
int nid = OBJ_cbs2nid(&bag_id);
|
734
|
-
if (nid == NID_pkcs8ShroudedKeyBag) {
|
735
|
-
/* See RFC 7292, section 4.2.2. */
|
736
|
-
if (*ctx->out_key) {
|
737
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_MULTIPLE_PRIVATE_KEYS_IN_PKCS12);
|
738
|
-
return 0;
|
739
|
-
}
|
740
|
-
|
741
|
-
if (CBS_len(&wrapped_value) > LONG_MAX) {
|
742
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_PKCS12_DATA);
|
743
|
-
return 0;
|
744
|
-
}
|
745
|
-
|
746
|
-
/* |encrypted| isn't actually an X.509 signature, but it has the same
|
747
|
-
* structure as one and so |X509_SIG| is reused to store it. */
|
748
|
-
const uint8_t *inp = CBS_data(&wrapped_value);
|
749
|
-
X509_SIG *encrypted =
|
750
|
-
d2i_X509_SIG(NULL, &inp, (long)CBS_len(&wrapped_value));
|
751
|
-
if (encrypted == NULL) {
|
752
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_PKCS12_DATA);
|
753
|
-
return 0;
|
754
|
-
}
|
755
|
-
if (inp != CBS_data(&wrapped_value) + CBS_len(&wrapped_value)) {
|
756
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_PKCS12_DATA);
|
757
|
-
X509_SIG_free(encrypted);
|
758
|
-
return 0;
|
759
|
-
}
|
760
|
-
|
761
|
-
PKCS8_PRIV_KEY_INFO *pki =
|
762
|
-
pkcs8_decrypt_raw(encrypted, ctx->password, ctx->password_len);
|
763
|
-
X509_SIG_free(encrypted);
|
764
|
-
if (pki == NULL) {
|
765
|
-
return 0;
|
766
|
-
}
|
767
|
-
|
768
|
-
*ctx->out_key = EVP_PKCS82PKEY(pki);
|
769
|
-
PKCS8_PRIV_KEY_INFO_free(pki);
|
770
|
-
return ctx->out_key != NULL;
|
771
|
-
}
|
772
|
-
|
773
|
-
if (nid == NID_certBag) {
|
774
|
-
/* See RFC 7292, section 4.2.3. */
|
775
|
-
CBS cert_bag, cert_type, wrapped_cert, cert;
|
776
|
-
if (!CBS_get_asn1(&wrapped_value, &cert_bag, CBS_ASN1_SEQUENCE) ||
|
777
|
-
!CBS_get_asn1(&cert_bag, &cert_type, CBS_ASN1_OBJECT) ||
|
778
|
-
!CBS_get_asn1(&cert_bag, &wrapped_cert,
|
779
|
-
CBS_ASN1_CONTEXT_SPECIFIC | CBS_ASN1_CONSTRUCTED | 0) ||
|
780
|
-
!CBS_get_asn1(&wrapped_cert, &cert, CBS_ASN1_OCTETSTRING)) {
|
781
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_PKCS12_DATA);
|
782
|
-
return 0;
|
783
|
-
}
|
784
|
-
|
785
|
-
if (OBJ_cbs2nid(&cert_type) != NID_x509Certificate) {
|
786
|
-
return 1;
|
787
|
-
}
|
788
|
-
|
789
|
-
if (CBS_len(&cert) > LONG_MAX) {
|
790
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_PKCS12_DATA);
|
791
|
-
return 0;
|
792
|
-
}
|
793
|
-
|
794
|
-
const uint8_t *inp = CBS_data(&cert);
|
795
|
-
X509 *x509 = d2i_X509(NULL, &inp, (long)CBS_len(&cert));
|
796
|
-
if (!x509) {
|
797
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_PKCS12_DATA);
|
798
|
-
return 0;
|
799
|
-
}
|
800
|
-
|
801
|
-
if (inp != CBS_data(&cert) + CBS_len(&cert)) {
|
802
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_PKCS12_DATA);
|
803
|
-
X509_free(x509);
|
804
|
-
return 0;
|
805
|
-
}
|
806
|
-
|
807
|
-
if (0 == sk_X509_push(ctx->out_certs, x509)) {
|
808
|
-
X509_free(x509);
|
809
|
-
return 0;
|
810
|
-
}
|
811
|
-
|
812
|
-
return 1;
|
813
|
-
}
|
814
|
-
|
815
|
-
/* Unknown element type - ignore it. */
|
816
|
-
return 1;
|
817
|
-
}
|
818
|
-
|
819
|
-
/* PKCS12_handle_content_info parses a single PKCS#7 ContentInfo element in a
|
820
|
-
* PKCS#12 structure. */
|
821
|
-
static int PKCS12_handle_content_info(CBS *content_info,
|
822
|
-
struct pkcs12_context *ctx) {
|
823
|
-
CBS content_type, wrapped_contents, contents;
|
824
|
-
int nid, ret = 0;
|
825
|
-
uint8_t *storage = NULL;
|
826
|
-
|
827
|
-
if (!CBS_get_asn1(content_info, &content_type, CBS_ASN1_OBJECT) ||
|
828
|
-
!CBS_get_asn1(content_info, &wrapped_contents,
|
829
|
-
CBS_ASN1_CONTEXT_SPECIFIC | CBS_ASN1_CONSTRUCTED | 0) ||
|
830
|
-
CBS_len(content_info) != 0) {
|
831
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_PKCS12_DATA);
|
832
|
-
goto err;
|
833
|
-
}
|
834
|
-
|
835
|
-
nid = OBJ_cbs2nid(&content_type);
|
836
|
-
if (nid == NID_pkcs7_encrypted) {
|
837
|
-
/* See https://tools.ietf.org/html/rfc2315#section-13.
|
838
|
-
*
|
839
|
-
* PKCS#7 encrypted data inside a PKCS#12 structure is generally an
|
840
|
-
* encrypted certificate bag and it's generally encrypted with 40-bit
|
841
|
-
* RC2-CBC. */
|
842
|
-
CBS version_bytes, eci, contents_type, ai, encrypted_contents;
|
843
|
-
uint8_t *out;
|
844
|
-
size_t out_len;
|
845
|
-
|
846
|
-
if (!CBS_get_asn1(&wrapped_contents, &contents, CBS_ASN1_SEQUENCE) ||
|
847
|
-
!CBS_get_asn1(&contents, &version_bytes, CBS_ASN1_INTEGER) ||
|
848
|
-
/* EncryptedContentInfo, see
|
849
|
-
* https://tools.ietf.org/html/rfc2315#section-10.1 */
|
850
|
-
!CBS_get_asn1(&contents, &eci, CBS_ASN1_SEQUENCE) ||
|
851
|
-
!CBS_get_asn1(&eci, &contents_type, CBS_ASN1_OBJECT) ||
|
852
|
-
/* AlgorithmIdentifier, see
|
853
|
-
* https://tools.ietf.org/html/rfc5280#section-4.1.1.2 */
|
854
|
-
!CBS_get_asn1(&eci, &ai, CBS_ASN1_SEQUENCE) ||
|
855
|
-
!CBS_get_asn1_implicit_string(
|
856
|
-
&eci, &encrypted_contents, &storage,
|
857
|
-
CBS_ASN1_CONTEXT_SPECIFIC | 0, CBS_ASN1_OCTETSTRING)) {
|
858
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_PKCS12_DATA);
|
859
|
-
goto err;
|
860
|
-
}
|
861
|
-
|
862
|
-
if (OBJ_cbs2nid(&contents_type) != NID_pkcs7_data) {
|
863
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_PKCS12_DATA);
|
864
|
-
goto err;
|
865
|
-
}
|
866
|
-
|
867
|
-
if (!pbe_decrypt(&out, &out_len, &ai, ctx->password, ctx->password_len,
|
868
|
-
CBS_data(&encrypted_contents),
|
869
|
-
CBS_len(&encrypted_contents))) {
|
870
|
-
goto err;
|
871
|
-
}
|
872
|
-
|
873
|
-
CBS safe_contents;
|
874
|
-
CBS_init(&safe_contents, out, out_len);
|
875
|
-
ret = PKCS12_handle_sequence(&safe_contents, ctx, PKCS12_handle_safe_bag);
|
876
|
-
OPENSSL_free(out);
|
877
|
-
} else if (nid == NID_pkcs7_data) {
|
878
|
-
CBS octet_string_contents;
|
879
|
-
|
880
|
-
if (!CBS_get_asn1(&wrapped_contents, &octet_string_contents,
|
881
|
-
CBS_ASN1_OCTETSTRING)) {
|
882
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_PKCS12_DATA);
|
883
|
-
goto err;
|
884
|
-
}
|
885
|
-
|
886
|
-
ret = PKCS12_handle_sequence(&octet_string_contents, ctx,
|
887
|
-
PKCS12_handle_safe_bag);
|
888
|
-
} else {
|
889
|
-
/* Unknown element type - ignore it. */
|
890
|
-
ret = 1;
|
891
|
-
}
|
892
|
-
|
893
|
-
err:
|
894
|
-
OPENSSL_free(storage);
|
895
|
-
return ret;
|
896
|
-
}
|
897
|
-
|
898
|
-
int PKCS12_get_key_and_certs(EVP_PKEY **out_key, STACK_OF(X509) *out_certs,
|
899
|
-
CBS *ber_in, const char *password) {
|
900
|
-
uint8_t *der_bytes = NULL;
|
901
|
-
size_t der_len;
|
902
|
-
CBS in, pfx, mac_data, authsafe, content_type, wrapped_authsafes, authsafes;
|
903
|
-
uint64_t version;
|
904
|
-
int ret = 0;
|
905
|
-
struct pkcs12_context ctx;
|
906
|
-
const size_t original_out_certs_len = sk_X509_num(out_certs);
|
907
|
-
|
908
|
-
/* The input may be in BER format. */
|
909
|
-
if (!CBS_asn1_ber_to_der(ber_in, &der_bytes, &der_len)) {
|
910
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_PKCS12_DATA);
|
911
|
-
return 0;
|
912
|
-
}
|
913
|
-
if (der_bytes != NULL) {
|
914
|
-
CBS_init(&in, der_bytes, der_len);
|
915
|
-
} else {
|
916
|
-
CBS_init(&in, CBS_data(ber_in), CBS_len(ber_in));
|
917
|
-
}
|
918
|
-
|
919
|
-
*out_key = NULL;
|
920
|
-
OPENSSL_memset(&ctx, 0, sizeof(ctx));
|
921
|
-
|
922
|
-
/* See ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-12/pkcs-12v1.pdf, section
|
923
|
-
* four. */
|
924
|
-
if (!CBS_get_asn1(&in, &pfx, CBS_ASN1_SEQUENCE) ||
|
925
|
-
CBS_len(&in) != 0 ||
|
926
|
-
!CBS_get_asn1_uint64(&pfx, &version)) {
|
927
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_PKCS12_DATA);
|
928
|
-
goto err;
|
929
|
-
}
|
930
|
-
|
931
|
-
if (version < 3) {
|
932
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_PKCS12_VERSION);
|
933
|
-
goto err;
|
934
|
-
}
|
935
|
-
|
936
|
-
if (!CBS_get_asn1(&pfx, &authsafe, CBS_ASN1_SEQUENCE)) {
|
937
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_PKCS12_DATA);
|
938
|
-
goto err;
|
939
|
-
}
|
940
|
-
|
941
|
-
if (CBS_len(&pfx) == 0) {
|
942
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_MISSING_MAC);
|
943
|
-
goto err;
|
944
|
-
}
|
945
|
-
|
946
|
-
if (!CBS_get_asn1(&pfx, &mac_data, CBS_ASN1_SEQUENCE)) {
|
947
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_PKCS12_DATA);
|
948
|
-
goto err;
|
949
|
-
}
|
950
|
-
|
951
|
-
/* authsafe is a PKCS#7 ContentInfo. See
|
952
|
-
* https://tools.ietf.org/html/rfc2315#section-7. */
|
953
|
-
if (!CBS_get_asn1(&authsafe, &content_type, CBS_ASN1_OBJECT) ||
|
954
|
-
!CBS_get_asn1(&authsafe, &wrapped_authsafes,
|
955
|
-
CBS_ASN1_CONTEXT_SPECIFIC | CBS_ASN1_CONSTRUCTED | 0)) {
|
956
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_PKCS12_DATA);
|
957
|
-
goto err;
|
958
|
-
}
|
959
|
-
|
960
|
-
/* The content type can either be |NID_pkcs7_data| or |NID_pkcs7_signed|. The
|
961
|
-
* latter indicates that it's signed by a public key, which isn't
|
962
|
-
* supported. */
|
963
|
-
if (OBJ_cbs2nid(&content_type) != NID_pkcs7_data) {
|
964
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_PKCS12_PUBLIC_KEY_INTEGRITY_NOT_SUPPORTED);
|
965
|
-
goto err;
|
966
|
-
}
|
967
|
-
|
968
|
-
if (!CBS_get_asn1(&wrapped_authsafes, &authsafes, CBS_ASN1_OCTETSTRING)) {
|
969
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_PKCS12_DATA);
|
970
|
-
goto err;
|
971
|
-
}
|
972
|
-
|
973
|
-
ctx.out_key = out_key;
|
974
|
-
ctx.out_certs = out_certs;
|
975
|
-
if (!ascii_to_ucs2(password, password ? strlen(password) : 0, &ctx.password,
|
976
|
-
&ctx.password_len)) {
|
977
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_DECODE_ERROR);
|
978
|
-
goto err;
|
979
|
-
}
|
980
|
-
|
981
|
-
/* Verify the MAC. */
|
982
|
-
{
|
983
|
-
CBS mac, hash_type_seq, hash_oid, salt, expected_mac;
|
984
|
-
uint64_t iterations;
|
985
|
-
int hash_nid;
|
986
|
-
const EVP_MD *md;
|
987
|
-
uint8_t hmac_key[EVP_MAX_MD_SIZE];
|
988
|
-
uint8_t hmac[EVP_MAX_MD_SIZE];
|
989
|
-
unsigned hmac_len;
|
990
|
-
|
991
|
-
if (!CBS_get_asn1(&mac_data, &mac, CBS_ASN1_SEQUENCE) ||
|
992
|
-
!CBS_get_asn1(&mac, &hash_type_seq, CBS_ASN1_SEQUENCE) ||
|
993
|
-
!CBS_get_asn1(&hash_type_seq, &hash_oid, CBS_ASN1_OBJECT) ||
|
994
|
-
!CBS_get_asn1(&mac, &expected_mac, CBS_ASN1_OCTETSTRING) ||
|
995
|
-
!CBS_get_asn1(&mac_data, &salt, CBS_ASN1_OCTETSTRING)) {
|
996
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_PKCS12_DATA);
|
997
|
-
goto err;
|
998
|
-
}
|
999
|
-
|
1000
|
-
/* The iteration count is optional and the default is one. */
|
1001
|
-
iterations = 1;
|
1002
|
-
if (CBS_len(&mac_data) > 0) {
|
1003
|
-
if (!CBS_get_asn1_uint64(&mac_data, &iterations) ||
|
1004
|
-
iterations > UINT_MAX) {
|
1005
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_PKCS12_DATA);
|
1006
|
-
goto err;
|
1007
|
-
}
|
1008
|
-
}
|
1009
|
-
|
1010
|
-
hash_nid = OBJ_cbs2nid(&hash_oid);
|
1011
|
-
if (hash_nid == NID_undef ||
|
1012
|
-
(md = EVP_get_digestbynid(hash_nid)) == NULL) {
|
1013
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_UNKNOWN_HASH);
|
1014
|
-
goto err;
|
1015
|
-
}
|
1016
|
-
|
1017
|
-
if (!pkcs12_key_gen_raw(ctx.password, ctx.password_len, CBS_data(&salt),
|
1018
|
-
CBS_len(&salt), PKCS12_MAC_ID, iterations,
|
1019
|
-
EVP_MD_size(md), hmac_key, md)) {
|
1020
|
-
goto err;
|
1021
|
-
}
|
1022
|
-
|
1023
|
-
if (NULL == HMAC(md, hmac_key, EVP_MD_size(md), CBS_data(&authsafes),
|
1024
|
-
CBS_len(&authsafes), hmac, &hmac_len)) {
|
1025
|
-
goto err;
|
1026
|
-
}
|
1027
|
-
|
1028
|
-
if (!CBS_mem_equal(&expected_mac, hmac, hmac_len)) {
|
1029
|
-
OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_INCORRECT_PASSWORD);
|
1030
|
-
goto err;
|
1031
|
-
}
|
1032
|
-
}
|
1033
|
-
|
1034
|
-
/* authsafes contains a series of PKCS#7 ContentInfos. */
|
1035
|
-
if (!PKCS12_handle_sequence(&authsafes, &ctx, PKCS12_handle_content_info)) {
|
1036
|
-
goto err;
|
1037
|
-
}
|
1038
|
-
|
1039
|
-
ret = 1;
|
1040
|
-
|
1041
|
-
err:
|
1042
|
-
OPENSSL_free(ctx.password);
|
1043
|
-
OPENSSL_free(der_bytes);
|
1044
|
-
if (!ret) {
|
1045
|
-
EVP_PKEY_free(*out_key);
|
1046
|
-
*out_key = NULL;
|
1047
|
-
while (sk_X509_num(out_certs) > original_out_certs_len) {
|
1048
|
-
X509 *x509 = sk_X509_pop(out_certs);
|
1049
|
-
X509_free(x509);
|
1050
|
-
}
|
1051
|
-
}
|
1052
|
-
|
1053
|
-
return ret;
|
1054
|
-
}
|
1055
|
-
|
1056
|
-
void PKCS12_PBE_add(void) {}
|
1057
|
-
|
1058
|
-
struct pkcs12_st {
|
1059
|
-
uint8_t *ber_bytes;
|
1060
|
-
size_t ber_len;
|
1061
|
-
};
|
1062
|
-
|
1063
|
-
PKCS12 *d2i_PKCS12(PKCS12 **out_p12, const uint8_t **ber_bytes,
|
1064
|
-
size_t ber_len) {
|
1065
|
-
PKCS12 *p12;
|
1066
|
-
|
1067
|
-
p12 = OPENSSL_malloc(sizeof(PKCS12));
|
1068
|
-
if (!p12) {
|
1069
|
-
return NULL;
|
1070
|
-
}
|
1071
|
-
|
1072
|
-
p12->ber_bytes = OPENSSL_malloc(ber_len);
|
1073
|
-
if (!p12->ber_bytes) {
|
1074
|
-
OPENSSL_free(p12);
|
1075
|
-
return NULL;
|
1076
|
-
}
|
1077
|
-
|
1078
|
-
OPENSSL_memcpy(p12->ber_bytes, *ber_bytes, ber_len);
|
1079
|
-
p12->ber_len = ber_len;
|
1080
|
-
*ber_bytes += ber_len;
|
1081
|
-
|
1082
|
-
if (out_p12) {
|
1083
|
-
PKCS12_free(*out_p12);
|
1084
|
-
|
1085
|
-
*out_p12 = p12;
|
1086
|
-
}
|
1087
|
-
|
1088
|
-
return p12;
|
1089
|
-
}
|
1090
|
-
|
1091
|
-
PKCS12* d2i_PKCS12_bio(BIO *bio, PKCS12 **out_p12) {
|
1092
|
-
size_t used = 0;
|
1093
|
-
BUF_MEM *buf;
|
1094
|
-
const uint8_t *dummy;
|
1095
|
-
static const size_t kMaxSize = 256 * 1024;
|
1096
|
-
PKCS12 *ret = NULL;
|
1097
|
-
|
1098
|
-
buf = BUF_MEM_new();
|
1099
|
-
if (buf == NULL) {
|
1100
|
-
return NULL;
|
1101
|
-
}
|
1102
|
-
if (BUF_MEM_grow(buf, 8192) == 0) {
|
1103
|
-
goto out;
|
1104
|
-
}
|
1105
|
-
|
1106
|
-
for (;;) {
|
1107
|
-
int n = BIO_read(bio, &buf->data[used], buf->length - used);
|
1108
|
-
if (n < 0) {
|
1109
|
-
if (used == 0) {
|
1110
|
-
goto out;
|
1111
|
-
}
|
1112
|
-
/* Workaround a bug in node.js. It uses a memory BIO for this in the wrong
|
1113
|
-
* mode. */
|
1114
|
-
n = 0;
|
1115
|
-
}
|
1116
|
-
|
1117
|
-
if (n == 0) {
|
1118
|
-
break;
|
1119
|
-
}
|
1120
|
-
used += n;
|
1121
|
-
|
1122
|
-
if (used < buf->length) {
|
1123
|
-
continue;
|
1124
|
-
}
|
1125
|
-
|
1126
|
-
if (buf->length > kMaxSize ||
|
1127
|
-
BUF_MEM_grow(buf, buf->length * 2) == 0) {
|
1128
|
-
goto out;
|
1129
|
-
}
|
1130
|
-
}
|
1131
|
-
|
1132
|
-
dummy = (uint8_t*) buf->data;
|
1133
|
-
ret = d2i_PKCS12(out_p12, &dummy, used);
|
1134
|
-
|
1135
|
-
out:
|
1136
|
-
BUF_MEM_free(buf);
|
1137
|
-
return ret;
|
1138
|
-
}
|
1139
|
-
|
1140
|
-
PKCS12* d2i_PKCS12_fp(FILE *fp, PKCS12 **out_p12) {
|
1141
|
-
BIO *bio;
|
1142
|
-
PKCS12 *ret;
|
1143
|
-
|
1144
|
-
bio = BIO_new_fp(fp, 0 /* don't take ownership */);
|
1145
|
-
if (!bio) {
|
1146
|
-
return NULL;
|
1147
|
-
}
|
1148
|
-
|
1149
|
-
ret = d2i_PKCS12_bio(bio, out_p12);
|
1150
|
-
BIO_free(bio);
|
1151
|
-
return ret;
|
1152
|
-
}
|
1153
|
-
|
1154
|
-
int PKCS12_parse(const PKCS12 *p12, const char *password, EVP_PKEY **out_pkey,
|
1155
|
-
X509 **out_cert, STACK_OF(X509) **out_ca_certs) {
|
1156
|
-
CBS ber_bytes;
|
1157
|
-
STACK_OF(X509) *ca_certs = NULL;
|
1158
|
-
char ca_certs_alloced = 0;
|
1159
|
-
|
1160
|
-
if (out_ca_certs != NULL && *out_ca_certs != NULL) {
|
1161
|
-
ca_certs = *out_ca_certs;
|
1162
|
-
}
|
1163
|
-
|
1164
|
-
if (!ca_certs) {
|
1165
|
-
ca_certs = sk_X509_new_null();
|
1166
|
-
if (ca_certs == NULL) {
|
1167
|
-
OPENSSL_PUT_ERROR(PKCS8, ERR_R_MALLOC_FAILURE);
|
1168
|
-
return 0;
|
1169
|
-
}
|
1170
|
-
ca_certs_alloced = 1;
|
1171
|
-
}
|
1172
|
-
|
1173
|
-
CBS_init(&ber_bytes, p12->ber_bytes, p12->ber_len);
|
1174
|
-
if (!PKCS12_get_key_and_certs(out_pkey, ca_certs, &ber_bytes, password)) {
|
1175
|
-
if (ca_certs_alloced) {
|
1176
|
-
sk_X509_free(ca_certs);
|
1177
|
-
}
|
1178
|
-
return 0;
|
1179
|
-
}
|
1180
|
-
|
1181
|
-
*out_cert = NULL;
|
1182
|
-
if (sk_X509_num(ca_certs) > 0) {
|
1183
|
-
*out_cert = sk_X509_shift(ca_certs);
|
1184
|
-
}
|
1185
|
-
|
1186
|
-
if (out_ca_certs) {
|
1187
|
-
*out_ca_certs = ca_certs;
|
1188
|
-
} else {
|
1189
|
-
sk_X509_pop_free(ca_certs, X509_free);
|
1190
|
-
}
|
1191
|
-
|
1192
|
-
return 1;
|
1193
|
-
}
|
1194
|
-
|
1195
|
-
int PKCS12_verify_mac(const PKCS12 *p12, const char *password,
|
1196
|
-
int password_len) {
|
1197
|
-
if (password == NULL) {
|
1198
|
-
if (password_len != 0) {
|
1199
|
-
return 0;
|
1200
|
-
}
|
1201
|
-
} else if (password_len != -1 &&
|
1202
|
-
(password[password_len] != 0 ||
|
1203
|
-
OPENSSL_memchr(password, 0, password_len) != NULL)) {
|
1204
|
-
return 0;
|
1205
|
-
}
|
1206
|
-
|
1207
|
-
EVP_PKEY *pkey = NULL;
|
1208
|
-
X509 *cert = NULL;
|
1209
|
-
if (!PKCS12_parse(p12, password, &pkey, &cert, NULL)) {
|
1210
|
-
ERR_clear_error();
|
1211
|
-
return 0;
|
1212
|
-
}
|
1213
|
-
|
1214
|
-
EVP_PKEY_free(pkey);
|
1215
|
-
X509_free(cert);
|
1216
|
-
|
1217
|
-
return 1;
|
1218
|
-
}
|
1219
|
-
|
1220
|
-
void PKCS12_free(PKCS12 *p12) {
|
1221
|
-
if (p12 == NULL) {
|
1222
|
-
return;
|
1223
|
-
}
|
1224
|
-
OPENSSL_free(p12->ber_bytes);
|
1225
|
-
OPENSSL_free(p12);
|
1226
|
-
}
|