grpc 0.12.0 → 0.13.0.pre1.1
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 +5707 -22222
- data/include/grpc/byte_buffer.h +2 -83
- data/include/grpc/census.h +191 -121
- data/include/grpc/compression.h +14 -38
- data/include/grpc/grpc.h +88 -434
- data/include/grpc/grpc_security.h +76 -46
- data/include/grpc/grpc_zookeeper.h +1 -1
- data/include/grpc/impl/codegen/alloc.h +74 -0
- data/include/grpc/impl/codegen/atm.h +92 -0
- data/include/grpc/impl/codegen/atm_gcc_atomic.h +72 -0
- data/include/grpc/impl/codegen/atm_gcc_sync.h +87 -0
- data/include/grpc/impl/codegen/atm_win32.h +125 -0
- data/include/grpc/impl/codegen/byte_buffer.h +121 -0
- data/include/grpc/impl/codegen/compression_types.h +73 -0
- data/include/grpc/impl/codegen/connectivity_state.h +59 -0
- data/include/grpc/impl/codegen/grpc_types.h +373 -0
- data/include/grpc/impl/codegen/log.h +110 -0
- data/include/grpc/impl/codegen/port_platform.h +362 -0
- data/include/grpc/impl/codegen/propagation_bits.h +67 -0
- data/include/grpc/impl/codegen/slice.h +182 -0
- data/include/grpc/impl/codegen/slice_buffer.h +105 -0
- data/include/grpc/impl/codegen/status.h +163 -0
- data/include/grpc/impl/codegen/sync.h +316 -0
- data/include/grpc/impl/codegen/sync_generic.h +55 -0
- data/{src/core/census/context.h → include/grpc/impl/codegen/sync_posix.h} +11 -11
- data/include/grpc/impl/codegen/sync_win32.h +49 -0
- data/include/grpc/impl/codegen/time.h +132 -0
- data/include/grpc/status.h +2 -126
- data/include/grpc/support/alloc.h +2 -35
- data/include/grpc/support/atm.h +2 -55
- data/include/grpc/support/atm_gcc_atomic.h +5 -38
- data/include/grpc/support/atm_gcc_sync.h +2 -50
- data/include/grpc/support/atm_win32.h +2 -88
- data/include/grpc/support/avl.h +7 -7
- data/include/grpc/support/cmdline.h +15 -13
- data/include/grpc/support/cpu.h +5 -3
- data/include/grpc/support/histogram.h +23 -20
- data/include/grpc/support/host_port.h +5 -3
- data/include/grpc/support/log.h +2 -71
- data/include/grpc/support/log_win32.h +2 -2
- data/include/grpc/support/port_platform.h +2 -319
- data/include/grpc/support/slice.h +2 -145
- data/include/grpc/support/slice_buffer.h +2 -65
- data/include/grpc/support/string_util.h +3 -3
- data/include/grpc/support/subprocess.h +8 -6
- data/include/grpc/support/sync.h +2 -278
- data/include/grpc/support/sync_generic.h +2 -18
- data/include/grpc/support/sync_posix.h +2 -10
- data/include/grpc/support/sync_win32.h +2 -12
- data/include/grpc/support/thd.h +11 -11
- data/include/grpc/support/time.h +2 -91
- data/include/grpc/support/tls.h +1 -1
- data/include/grpc/support/tls_gcc.h +1 -1
- data/include/grpc/support/tls_msvc.h +1 -1
- data/include/grpc/support/tls_pthread.h +2 -2
- data/src/boringssl/err_data.c +1252 -0
- data/src/core/census/context.c +492 -8
- data/src/core/census/grpc_filter.c +3 -3
- data/src/core/census/initialize.c +4 -7
- data/src/core/census/operation.c +2 -2
- data/src/core/census/placeholders.c +109 -0
- data/src/core/census/rpc_metric_id.h +6 -6
- data/src/core/census/tracing.c +1 -1
- data/src/core/channel/channel_args.c +4 -3
- data/src/core/channel/channel_stack.c +1 -1
- data/src/core/channel/client_channel.c +18 -14
- data/src/core/channel/client_uchannel.c +3 -3
- data/src/core/channel/compress_filter.c +8 -8
- data/src/core/channel/http_client_filter.c +2 -2
- data/src/core/channel/http_server_filter.c +9 -9
- data/src/core/channel/subchannel_call_holder.c +12 -10
- data/src/core/client_config/lb_policies/pick_first.c +49 -31
- data/src/core/client_config/lb_policies/round_robin.c +7 -7
- data/src/core/client_config/resolvers/dns_resolver.c +3 -3
- data/src/core/client_config/resolvers/sockaddr_resolver.c +5 -5
- data/src/core/client_config/subchannel.c +36 -25
- data/src/core/compression/algorithm.c +3 -3
- data/src/core/httpcli/format_request.c +1 -1
- data/src/core/httpcli/httpcli.c +5 -5
- data/src/core/httpcli/httpcli_security_connector.c +2 -3
- data/src/core/httpcli/parser.c +7 -7
- data/src/core/httpcli/parser.h +1 -1
- data/src/core/iomgr/closure.c +7 -7
- data/src/core/iomgr/closure.h +6 -5
- data/src/core/iomgr/exec_ctx.c +12 -8
- data/src/core/iomgr/exec_ctx.h +12 -5
- data/src/core/iomgr/executor.c +4 -4
- data/src/core/iomgr/executor.h +2 -2
- data/src/core/iomgr/fd_posix.c +28 -17
- data/src/core/iomgr/fd_posix.h +7 -4
- data/src/core/iomgr/iocp_windows.c +6 -8
- data/src/core/iomgr/pollset_multipoller_with_epoll.c +70 -5
- data/src/core/iomgr/pollset_multipoller_with_poll_posix.c +4 -2
- data/src/core/iomgr/pollset_posix.c +15 -15
- data/src/core/iomgr/pollset_posix.h +4 -2
- data/src/core/iomgr/pollset_windows.c +3 -12
- data/src/core/iomgr/resolve_address_posix.c +2 -2
- data/src/core/iomgr/resolve_address_windows.c +2 -2
- data/src/core/iomgr/sockaddr_utils.c +6 -6
- data/src/core/iomgr/sockaddr_win32.h +1 -6
- data/src/core/iomgr/tcp_client_posix.c +7 -7
- data/src/core/iomgr/tcp_client_windows.c +4 -4
- data/src/core/iomgr/tcp_posix.c +14 -8
- data/src/core/iomgr/tcp_posix.h +7 -1
- data/src/core/iomgr/tcp_server.h +40 -20
- data/src/core/iomgr/tcp_server_posix.c +106 -49
- data/src/core/iomgr/tcp_server_windows.c +98 -49
- data/src/core/iomgr/tcp_windows.c +11 -15
- data/src/core/iomgr/timer.c +8 -8
- data/src/core/iomgr/timer.h +1 -1
- data/src/core/iomgr/timer_heap.c +10 -10
- data/src/core/iomgr/timer_heap.h +2 -2
- data/src/core/iomgr/udp_server.c +2 -12
- data/src/core/iomgr/udp_server.h +1 -9
- data/src/core/iomgr/workqueue.h +2 -4
- data/src/core/iomgr/workqueue_posix.c +3 -3
- data/src/core/json/json_reader.c +11 -12
- data/src/core/json/json_reader.h +4 -4
- data/src/core/json/json_string.c +19 -19
- data/src/core/json/json_writer.c +7 -9
- data/src/core/profiling/basic_timers.c +1 -1
- data/src/core/security/base64.c +9 -9
- data/src/core/security/client_auth_filter.c +4 -4
- data/src/core/security/credentials.c +5 -5
- data/src/core/security/google_default_credentials.c +3 -3
- data/src/core/security/handshake.c +6 -5
- data/src/core/security/json_token.c +13 -7
- data/src/core/security/jwt_verifier.c +3 -2
- data/src/core/security/secure_endpoint.c +16 -16
- data/src/core/security/security_connector.c +47 -17
- data/src/core/security/security_connector.h +5 -5
- data/src/core/security/server_auth_filter.c +3 -3
- data/src/core/security/server_secure_chttp2.c +30 -31
- data/src/core/statistics/census_interface.h +2 -2
- data/src/core/statistics/census_rpc_stats.h +3 -3
- data/src/core/support/alloc.c +1 -1
- data/src/core/support/cpu_posix.c +2 -2
- data/src/core/support/env_linux.c +12 -2
- data/src/core/support/env_win32.c +15 -7
- data/src/core/support/histogram.c +5 -5
- data/src/core/support/log_posix.c +1 -1
- data/src/core/support/log_win32.c +4 -3
- data/src/core/support/murmur_hash.c +11 -11
- data/src/core/support/murmur_hash.h +1 -1
- data/src/core/support/slice.c +11 -11
- data/src/core/support/slice_buffer.c +6 -6
- data/src/core/support/stack_lockfree.c +20 -10
- data/src/core/support/string.c +15 -15
- data/src/core/support/string.h +5 -5
- data/src/core/support/string_win32.c +5 -5
- data/src/core/support/subprocess_windows.c +141 -0
- data/src/core/support/sync.c +4 -4
- data/src/core/support/sync_posix.c +2 -2
- data/src/core/support/sync_win32.c +10 -5
- data/src/core/support/time.c +29 -29
- data/src/core/support/time_posix.c +15 -6
- data/src/core/support/time_precise.c +2 -2
- data/src/core/support/time_win32.c +18 -9
- data/src/core/support/tls_pthread.c +1 -1
- data/src/core/support/wrap_memcpy.c +53 -0
- data/src/core/surface/alarm.c +83 -0
- data/src/core/surface/byte_buffer_reader.c +1 -1
- data/src/core/surface/call.c +78 -69
- data/src/core/surface/call.h +2 -2
- data/src/core/surface/call_test_only.h +2 -2
- data/src/core/surface/channel.c +9 -9
- data/src/core/surface/channel.h +1 -1
- data/src/core/surface/channel_connectivity.c +3 -3
- data/src/core/surface/channel_create.c +3 -3
- data/src/core/surface/channel_ping.c +2 -2
- data/src/core/surface/completion_queue.c +11 -12
- data/src/core/surface/completion_queue.h +1 -1
- data/src/core/surface/init.c +7 -5
- data/src/core/surface/lame_client.c +3 -3
- data/src/core/surface/secure_channel_create.c +3 -3
- data/src/core/surface/server.c +28 -28
- data/src/core/surface/server_chttp2.c +8 -8
- data/src/core/surface/server_create.c +1 -4
- data/src/core/surface/validate_metadata.c +3 -3
- data/src/core/surface/version.c +2 -2
- data/src/core/transport/byte_stream.c +8 -6
- data/src/core/transport/byte_stream.h +6 -5
- data/src/core/transport/chttp2/bin_encoder.c +29 -29
- data/src/core/transport/chttp2/frame_data.c +29 -26
- data/src/core/transport/chttp2/frame_data.h +6 -6
- data/src/core/transport/chttp2/frame_goaway.c +30 -30
- data/src/core/transport/chttp2/frame_goaway.h +6 -6
- data/src/core/transport/chttp2/frame_ping.c +6 -6
- data/src/core/transport/chttp2/frame_ping.h +5 -5
- data/src/core/transport/chttp2/frame_rst_stream.c +18 -19
- data/src/core/transport/chttp2/frame_rst_stream.h +4 -4
- data/src/core/transport/chttp2/frame_settings.c +30 -30
- data/src/core/transport/chttp2/frame_settings.h +13 -13
- data/src/core/transport/chttp2/frame_window_update.c +17 -18
- data/src/core/transport/chttp2/frame_window_update.h +5 -7
- data/src/core/transport/chttp2/hpack_encoder.c +69 -73
- data/src/core/transport/chttp2/hpack_encoder.h +16 -16
- data/src/core/transport/chttp2/hpack_parser.c +167 -167
- data/src/core/transport/chttp2/hpack_parser.h +16 -16
- data/src/core/transport/chttp2/hpack_table.c +13 -13
- data/src/core/transport/chttp2/hpack_table.h +11 -11
- data/src/core/transport/chttp2/internal.h +97 -86
- data/src/core/transport/chttp2/parsing.c +25 -25
- data/src/core/transport/chttp2/stream_lists.c +26 -3
- data/src/core/transport/chttp2/stream_map.c +13 -14
- data/src/core/transport/chttp2/stream_map.h +6 -7
- data/src/core/transport/chttp2/timeout_encoding.c +19 -16
- data/src/core/transport/chttp2/varint.c +8 -9
- data/src/core/transport/chttp2/varint.h +7 -8
- data/src/core/transport/chttp2/writing.c +26 -23
- data/src/core/transport/chttp2_transport.c +133 -92
- data/src/core/transport/connectivity_state.c +6 -6
- data/src/core/transport/metadata.c +18 -18
- data/src/core/transport/metadata.h +5 -5
- data/src/core/transport/static_metadata.c +15 -16
- data/src/core/transport/static_metadata.h +5 -5
- data/src/core/transport/transport.c +5 -5
- data/src/core/transport/transport.h +14 -1
- data/src/core/tsi/fake_transport_security.c +7 -7
- data/src/core/tsi/ssl_transport_security.c +6 -4
- data/src/core/tsi/ssl_types.h +55 -0
- data/src/ruby/ext/grpc/extconf.rb +51 -14
- data/src/ruby/ext/grpc/rb_byte_buffer.c +3 -1
- data/src/ruby/ext/grpc/rb_call.c +6 -3
- data/src/ruby/ext/grpc/rb_call_credentials.c +4 -0
- data/src/ruby/ext/grpc/rb_channel.c +4 -2
- data/src/ruby/ext/grpc/rb_channel_args.c +3 -1
- data/src/ruby/ext/grpc/rb_channel_credentials.c +3 -1
- data/src/ruby/ext/grpc/rb_completion_queue.c +3 -1
- data/src/ruby/ext/grpc/rb_event_thread.c +5 -0
- data/src/ruby/ext/grpc/rb_grpc.c +11 -3
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +560 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +843 -0
- data/src/ruby/ext/grpc/rb_loader.c +72 -0
- data/src/ruby/ext/grpc/rb_loader.h +40 -0
- data/src/ruby/ext/grpc/rb_server.c +3 -1
- data/src/ruby/ext/grpc/rb_server_credentials.c +4 -2
- data/src/ruby/lib/grpc/generic/bidi_call.rb +1 -1
- data/src/ruby/lib/grpc/generic/rpc_desc.rb +1 -1
- data/src/ruby/lib/grpc/generic/rpc_server.rb +1 -1
- data/src/ruby/lib/grpc/grpc.rb +34 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/spec/pb/health/checker_spec.rb +1 -1
- data/third_party/boringssl/crypto/aes/aes.c +1142 -0
- data/third_party/boringssl/crypto/aes/internal.h +87 -0
- data/third_party/boringssl/crypto/aes/mode_wrappers.c +108 -0
- data/third_party/boringssl/crypto/asn1/a_bitstr.c +255 -0
- data/third_party/boringssl/crypto/asn1/a_bool.c +112 -0
- data/third_party/boringssl/crypto/asn1/a_bytes.c +317 -0
- data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +286 -0
- data/third_party/boringssl/crypto/asn1/a_dup.c +103 -0
- data/third_party/boringssl/crypto/asn1/a_enum.c +183 -0
- data/third_party/boringssl/crypto/asn1/a_gentm.c +255 -0
- data/third_party/boringssl/crypto/asn1/a_i2d_fp.c +154 -0
- data/third_party/boringssl/crypto/asn1/a_int.c +456 -0
- data/third_party/boringssl/crypto/asn1/a_mbstr.c +390 -0
- data/third_party/boringssl/crypto/asn1/a_object.c +412 -0
- data/third_party/boringssl/crypto/asn1/a_octet.c +70 -0
- data/third_party/boringssl/crypto/asn1/a_print.c +119 -0
- data/third_party/boringssl/crypto/asn1/a_strnid.c +286 -0
- data/third_party/boringssl/crypto/asn1/a_time.c +221 -0
- data/third_party/boringssl/crypto/asn1/a_type.c +160 -0
- data/third_party/boringssl/crypto/asn1/a_utctm.c +342 -0
- data/third_party/boringssl/crypto/asn1/a_utf8.c +210 -0
- data/third_party/boringssl/crypto/asn1/asn1_lib.c +510 -0
- data/third_party/boringssl/crypto/asn1/asn1_locl.h +73 -0
- data/third_party/boringssl/crypto/asn1/asn1_par.c +444 -0
- data/third_party/boringssl/crypto/asn1/asn_pack.c +104 -0
- data/third_party/boringssl/crypto/asn1/bio_asn1.c +496 -0
- data/third_party/boringssl/crypto/asn1/bio_ndef.c +254 -0
- data/third_party/boringssl/crypto/asn1/f_enum.c +206 -0
- data/third_party/boringssl/crypto/asn1/f_int.c +210 -0
- data/third_party/boringssl/crypto/asn1/f_string.c +204 -0
- data/third_party/boringssl/crypto/asn1/t_bitst.c +102 -0
- data/third_party/boringssl/crypto/asn1/t_pkey.c +112 -0
- data/third_party/boringssl/crypto/asn1/tasn_dec.c +1342 -0
- data/third_party/boringssl/crypto/asn1/tasn_enc.c +695 -0
- data/third_party/boringssl/crypto/asn1/tasn_fre.c +264 -0
- data/third_party/boringssl/crypto/asn1/tasn_new.c +398 -0
- data/third_party/boringssl/crypto/asn1/tasn_prn.c +642 -0
- data/third_party/boringssl/crypto/asn1/tasn_typ.c +137 -0
- data/third_party/boringssl/crypto/asn1/tasn_utl.c +266 -0
- data/third_party/boringssl/crypto/asn1/x_bignum.c +143 -0
- data/third_party/boringssl/crypto/asn1/x_long.c +182 -0
- data/third_party/boringssl/crypto/base64/base64.c +478 -0
- data/third_party/boringssl/crypto/bio/bio.c +608 -0
- data/third_party/boringssl/crypto/bio/bio_mem.c +327 -0
- data/third_party/boringssl/crypto/bio/buffer.c +496 -0
- data/third_party/boringssl/crypto/bio/connect.c +544 -0
- data/third_party/boringssl/crypto/bio/fd.c +270 -0
- data/third_party/boringssl/crypto/bio/file.c +349 -0
- data/third_party/boringssl/crypto/bio/hexdump.c +192 -0
- data/third_party/boringssl/crypto/bio/internal.h +108 -0
- data/third_party/boringssl/crypto/bio/pair.c +803 -0
- data/third_party/boringssl/crypto/bio/printf.c +119 -0
- data/third_party/boringssl/crypto/bio/socket.c +195 -0
- data/third_party/boringssl/crypto/bio/socket_helper.c +113 -0
- data/third_party/boringssl/crypto/bn/add.c +377 -0
- data/third_party/boringssl/crypto/bn/asm/x86_64-gcc.c +599 -0
- data/third_party/boringssl/crypto/bn/bn.c +341 -0
- data/third_party/boringssl/crypto/bn/bn_asn1.c +93 -0
- data/third_party/boringssl/crypto/bn/cmp.c +200 -0
- data/third_party/boringssl/crypto/bn/convert.c +597 -0
- data/third_party/boringssl/crypto/bn/ctx.c +311 -0
- data/third_party/boringssl/crypto/bn/div.c +625 -0
- data/third_party/boringssl/crypto/bn/exponentiation.c +1544 -0
- data/third_party/boringssl/crypto/bn/gcd.c +711 -0
- data/third_party/boringssl/crypto/bn/generic.c +1019 -0
- data/third_party/boringssl/crypto/bn/internal.h +294 -0
- data/third_party/boringssl/crypto/bn/kronecker.c +175 -0
- data/third_party/boringssl/crypto/bn/montgomery.c +561 -0
- data/third_party/boringssl/crypto/bn/mul.c +888 -0
- data/third_party/boringssl/crypto/bn/prime.c +845 -0
- data/third_party/boringssl/crypto/bn/random.c +326 -0
- data/third_party/boringssl/crypto/bn/rsaz_exp.c +326 -0
- data/third_party/boringssl/crypto/bn/rsaz_exp.h +56 -0
- data/third_party/boringssl/crypto/bn/shift.c +299 -0
- data/third_party/boringssl/crypto/bn/sqrt.c +505 -0
- data/third_party/boringssl/crypto/buf/buf.c +235 -0
- data/third_party/boringssl/crypto/bytestring/ber.c +221 -0
- data/third_party/boringssl/crypto/bytestring/cbb.c +411 -0
- data/third_party/boringssl/crypto/bytestring/cbs.c +415 -0
- data/third_party/boringssl/crypto/bytestring/internal.h +46 -0
- data/third_party/boringssl/crypto/chacha/chacha_generic.c +140 -0
- data/third_party/boringssl/crypto/chacha/chacha_vec.c +323 -0
- data/third_party/boringssl/crypto/cipher/aead.c +167 -0
- data/third_party/boringssl/crypto/cipher/cipher.c +652 -0
- data/third_party/boringssl/crypto/cipher/derive_key.c +154 -0
- data/third_party/boringssl/crypto/cipher/e_aes.c +1767 -0
- data/third_party/boringssl/crypto/cipher/e_chacha20poly1305.c +311 -0
- data/third_party/boringssl/crypto/cipher/e_des.c +207 -0
- data/third_party/boringssl/crypto/cipher/e_null.c +85 -0
- data/third_party/boringssl/crypto/cipher/e_rc2.c +443 -0
- data/third_party/boringssl/crypto/cipher/e_rc4.c +87 -0
- data/third_party/boringssl/crypto/cipher/e_ssl3.c +463 -0
- data/third_party/boringssl/crypto/cipher/e_tls.c +673 -0
- data/third_party/boringssl/crypto/cipher/internal.h +164 -0
- data/third_party/boringssl/crypto/cipher/tls_cbc.c +495 -0
- data/third_party/boringssl/crypto/cmac/cmac.c +239 -0
- data/third_party/boringssl/crypto/conf/conf.c +778 -0
- data/third_party/boringssl/crypto/conf/conf_def.h +127 -0
- data/third_party/boringssl/crypto/conf/internal.h +31 -0
- data/third_party/boringssl/crypto/cpu-arm.c +199 -0
- data/third_party/boringssl/crypto/cpu-intel.c +261 -0
- data/third_party/boringssl/crypto/crypto.c +140 -0
- data/third_party/boringssl/crypto/curve25519/curve25519.c +4897 -0
- data/third_party/boringssl/crypto/des/des.c +771 -0
- data/third_party/boringssl/crypto/des/internal.h +212 -0
- data/third_party/boringssl/crypto/dh/check.c +180 -0
- data/third_party/boringssl/crypto/dh/dh.c +463 -0
- data/third_party/boringssl/crypto/dh/dh_asn1.c +84 -0
- data/third_party/boringssl/crypto/dh/internal.h +80 -0
- data/third_party/boringssl/crypto/dh/params.c +301 -0
- data/third_party/boringssl/crypto/digest/digest.c +248 -0
- data/third_party/boringssl/crypto/digest/digests.c +321 -0
- data/third_party/boringssl/crypto/digest/internal.h +112 -0
- data/third_party/boringssl/crypto/digest/md32_common.h +322 -0
- data/third_party/boringssl/crypto/directory.h +66 -0
- data/third_party/boringssl/crypto/directory_posix.c +108 -0
- data/third_party/boringssl/crypto/directory_win.c +144 -0
- data/third_party/boringssl/crypto/dsa/dsa.c +908 -0
- data/third_party/boringssl/crypto/dsa/dsa_asn1.c +150 -0
- data/third_party/boringssl/crypto/dsa/internal.h +78 -0
- data/third_party/boringssl/crypto/ec/ec.c +889 -0
- data/third_party/boringssl/crypto/ec/ec_asn1.c +586 -0
- data/third_party/boringssl/crypto/ec/ec_key.c +482 -0
- data/third_party/boringssl/crypto/ec/ec_montgomery.c +280 -0
- data/third_party/boringssl/crypto/ec/internal.h +318 -0
- data/third_party/boringssl/crypto/ec/oct.c +416 -0
- data/third_party/boringssl/crypto/ec/p224-64.c +1305 -0
- data/third_party/boringssl/crypto/ec/p256-64.c +1878 -0
- data/third_party/boringssl/crypto/ec/p256-x86_64-table.h +9548 -0
- data/third_party/boringssl/crypto/ec/p256-x86_64.c +596 -0
- data/third_party/boringssl/crypto/ec/simple.c +1313 -0
- data/third_party/boringssl/crypto/ec/util-64.c +183 -0
- data/third_party/boringssl/crypto/ec/wnaf.c +449 -0
- data/third_party/boringssl/crypto/ecdh/ecdh.c +153 -0
- data/third_party/boringssl/crypto/ecdsa/ecdsa.c +496 -0
- data/third_party/boringssl/crypto/ecdsa/ecdsa_asn1.c +240 -0
- data/third_party/boringssl/crypto/engine/engine.c +96 -0
- data/third_party/boringssl/crypto/err/err.c +756 -0
- data/third_party/boringssl/crypto/evp/algorithm.c +153 -0
- data/third_party/boringssl/crypto/evp/digestsign.c +159 -0
- data/third_party/boringssl/crypto/evp/evp.c +411 -0
- data/third_party/boringssl/crypto/evp/evp_asn1.c +179 -0
- data/third_party/boringssl/crypto/evp/evp_ctx.c +477 -0
- data/third_party/boringssl/crypto/evp/internal.h +278 -0
- data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +588 -0
- data/third_party/boringssl/crypto/evp/p_ec.c +283 -0
- data/third_party/boringssl/crypto/evp/p_ec_asn1.c +562 -0
- data/third_party/boringssl/crypto/evp/p_rsa.c +596 -0
- data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +737 -0
- data/third_party/boringssl/crypto/evp/pbkdf.c +151 -0
- data/third_party/boringssl/crypto/evp/sign.c +151 -0
- data/third_party/boringssl/crypto/ex_data.c +294 -0
- data/third_party/boringssl/crypto/hkdf/hkdf.c +89 -0
- data/third_party/boringssl/crypto/hmac/hmac.c +213 -0
- data/third_party/boringssl/crypto/internal.h +532 -0
- data/third_party/boringssl/crypto/lhash/lhash.c +346 -0
- data/third_party/boringssl/crypto/md4/md4.c +225 -0
- data/third_party/boringssl/crypto/md5/md5.c +275 -0
- data/third_party/boringssl/crypto/mem.c +200 -0
- data/third_party/boringssl/crypto/modes/cbc.c +216 -0
- data/third_party/boringssl/crypto/modes/cfb.c +231 -0
- data/third_party/boringssl/crypto/modes/ctr.c +226 -0
- data/third_party/boringssl/crypto/modes/gcm.c +1252 -0
- data/third_party/boringssl/crypto/modes/internal.h +370 -0
- data/third_party/boringssl/crypto/modes/ofb.c +108 -0
- data/third_party/boringssl/crypto/obj/obj.c +664 -0
- data/third_party/boringssl/crypto/obj/obj_dat.h +5257 -0
- data/third_party/boringssl/crypto/obj/obj_xref.c +124 -0
- data/third_party/boringssl/crypto/obj/obj_xref.h +96 -0
- data/third_party/boringssl/crypto/pem/pem_all.c +281 -0
- data/third_party/boringssl/crypto/pem/pem_info.c +404 -0
- data/third_party/boringssl/crypto/pem/pem_lib.c +835 -0
- data/third_party/boringssl/crypto/pem/pem_oth.c +89 -0
- data/third_party/boringssl/crypto/pem/pem_pk8.c +244 -0
- data/third_party/boringssl/crypto/pem/pem_pkey.c +312 -0
- data/third_party/boringssl/crypto/pem/pem_x509.c +65 -0
- data/third_party/boringssl/crypto/pem/pem_xaux.c +66 -0
- data/third_party/boringssl/crypto/pkcs8/internal.h +83 -0
- data/third_party/boringssl/crypto/pkcs8/p5_pbe.c +150 -0
- data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +440 -0
- data/third_party/boringssl/crypto/pkcs8/p8_pkey.c +85 -0
- data/third_party/boringssl/crypto/pkcs8/pkcs8.c +1217 -0
- data/third_party/boringssl/crypto/poly1305/poly1305.c +331 -0
- data/third_party/boringssl/crypto/poly1305/poly1305_arm.c +301 -0
- data/third_party/boringssl/crypto/poly1305/poly1305_vec.c +892 -0
- data/third_party/boringssl/crypto/rand/internal.h +32 -0
- data/third_party/boringssl/crypto/rand/rand.c +239 -0
- data/third_party/boringssl/crypto/rand/urandom.c +223 -0
- data/third_party/boringssl/crypto/rand/windows.c +56 -0
- data/third_party/boringssl/crypto/rc4/rc4.c +283 -0
- data/third_party/boringssl/crypto/refcount_c11.c +67 -0
- data/third_party/boringssl/crypto/refcount_lock.c +53 -0
- data/third_party/boringssl/crypto/rsa/blinding.c +462 -0
- data/third_party/boringssl/crypto/rsa/internal.h +164 -0
- data/third_party/boringssl/crypto/rsa/padding.c +711 -0
- data/third_party/boringssl/crypto/rsa/rsa.c +808 -0
- data/third_party/boringssl/crypto/rsa/rsa_asn1.c +473 -0
- data/third_party/boringssl/crypto/rsa/rsa_impl.c +1138 -0
- data/third_party/boringssl/crypto/sha/sha1.c +337 -0
- data/third_party/boringssl/crypto/sha/sha256.c +327 -0
- data/third_party/boringssl/crypto/sha/sha512.c +607 -0
- data/third_party/boringssl/crypto/stack/stack.c +386 -0
- data/third_party/boringssl/crypto/test/scoped_types.h +137 -0
- data/third_party/boringssl/crypto/test/test_util.h +35 -0
- data/third_party/boringssl/crypto/thread.c +101 -0
- data/third_party/boringssl/crypto/thread_none.c +55 -0
- data/third_party/boringssl/crypto/thread_pthread.c +167 -0
- data/third_party/boringssl/crypto/thread_win.c +282 -0
- data/third_party/boringssl/crypto/time_support.c +212 -0
- data/third_party/boringssl/crypto/x509/a_digest.c +97 -0
- data/third_party/boringssl/crypto/x509/a_sign.c +136 -0
- data/third_party/boringssl/crypto/x509/a_strex.c +564 -0
- data/third_party/boringssl/crypto/x509/a_verify.c +133 -0
- data/third_party/boringssl/crypto/x509/asn1_gen.c +873 -0
- data/third_party/boringssl/crypto/x509/by_dir.c +491 -0
- data/third_party/boringssl/crypto/x509/by_file.c +295 -0
- data/third_party/boringssl/crypto/x509/charmap.h +15 -0
- data/third_party/boringssl/crypto/x509/i2d_pr.c +84 -0
- data/third_party/boringssl/crypto/x509/pkcs7.c +353 -0
- data/third_party/boringssl/crypto/x509/t_crl.c +129 -0
- data/third_party/boringssl/crypto/x509/t_req.c +246 -0
- data/third_party/boringssl/crypto/x509/t_x509.c +500 -0
- data/third_party/boringssl/crypto/x509/t_x509a.c +109 -0
- data/third_party/boringssl/crypto/x509/vpm_int.h +70 -0
- data/third_party/boringssl/crypto/x509/x509.c +152 -0
- data/third_party/boringssl/crypto/x509/x509_att.c +353 -0
- data/third_party/boringssl/crypto/x509/x509_cmp.c +490 -0
- data/third_party/boringssl/crypto/x509/x509_d2.c +105 -0
- data/third_party/boringssl/crypto/x509/x509_def.c +88 -0
- data/third_party/boringssl/crypto/x509/x509_ext.c +206 -0
- data/third_party/boringssl/crypto/x509/x509_lu.c +738 -0
- data/third_party/boringssl/crypto/x509/x509_obj.c +191 -0
- data/third_party/boringssl/crypto/x509/x509_r2x.c +113 -0
- data/third_party/boringssl/crypto/x509/x509_req.c +315 -0
- data/third_party/boringssl/crypto/x509/x509_set.c +154 -0
- data/third_party/boringssl/crypto/x509/x509_trs.c +304 -0
- data/third_party/boringssl/crypto/x509/x509_txt.c +209 -0
- data/third_party/boringssl/crypto/x509/x509_v3.c +271 -0
- data/third_party/boringssl/crypto/x509/x509_vfy.c +2456 -0
- data/third_party/boringssl/crypto/x509/x509_vpm.c +672 -0
- data/third_party/boringssl/crypto/x509/x509cset.c +172 -0
- data/third_party/boringssl/crypto/x509/x509name.c +381 -0
- data/third_party/boringssl/crypto/x509/x509rset.c +80 -0
- data/third_party/boringssl/crypto/x509/x509spki.c +135 -0
- data/third_party/boringssl/crypto/x509/x509type.c +128 -0
- data/third_party/boringssl/crypto/x509/x_algor.c +154 -0
- data/third_party/boringssl/crypto/x509/x_all.c +547 -0
- data/third_party/boringssl/crypto/x509/x_attrib.c +117 -0
- data/third_party/boringssl/crypto/x509/x_crl.c +560 -0
- data/third_party/boringssl/crypto/x509/x_exten.c +75 -0
- data/third_party/boringssl/crypto/x509/x_info.c +95 -0
- data/third_party/boringssl/crypto/x509/x_name.c +538 -0
- data/third_party/boringssl/crypto/x509/x_pkey.c +100 -0
- data/third_party/boringssl/crypto/x509/x_pubkey.c +384 -0
- data/third_party/boringssl/crypto/x509/x_req.c +112 -0
- data/third_party/boringssl/crypto/x509/x_sig.c +69 -0
- data/third_party/boringssl/crypto/x509/x_spki.c +78 -0
- data/third_party/boringssl/crypto/x509/x_val.c +69 -0
- data/third_party/boringssl/crypto/x509/x_x509.c +227 -0
- data/third_party/boringssl/crypto/x509/x_x509a.c +197 -0
- data/third_party/boringssl/crypto/x509v3/ext_dat.h +129 -0
- data/third_party/boringssl/crypto/x509v3/pcy_cache.c +299 -0
- data/third_party/boringssl/crypto/x509v3/pcy_data.c +137 -0
- data/third_party/boringssl/crypto/x509v3/pcy_int.h +212 -0
- data/third_party/boringssl/crypto/x509v3/pcy_lib.c +165 -0
- data/third_party/boringssl/crypto/x509v3/pcy_map.c +133 -0
- data/third_party/boringssl/crypto/x509v3/pcy_node.c +197 -0
- data/third_party/boringssl/crypto/x509v3/pcy_tree.c +876 -0
- data/third_party/boringssl/crypto/x509v3/v3_akey.c +212 -0
- data/third_party/boringssl/crypto/x509v3/v3_akeya.c +71 -0
- data/third_party/boringssl/crypto/x509v3/v3_alt.c +622 -0
- data/third_party/boringssl/crypto/x509v3/v3_bcons.c +126 -0
- data/third_party/boringssl/crypto/x509v3/v3_bitst.c +141 -0
- data/third_party/boringssl/crypto/x509v3/v3_conf.c +459 -0
- data/third_party/boringssl/crypto/x509v3/v3_cpols.c +475 -0
- data/third_party/boringssl/crypto/x509v3/v3_crld.c +616 -0
- data/third_party/boringssl/crypto/x509v3/v3_enum.c +98 -0
- data/third_party/boringssl/crypto/x509v3/v3_extku.c +145 -0
- data/third_party/boringssl/crypto/x509v3/v3_genn.c +252 -0
- data/third_party/boringssl/crypto/x509v3/v3_ia5.c +117 -0
- data/third_party/boringssl/crypto/x509v3/v3_info.c +200 -0
- data/third_party/boringssl/crypto/x509v3/v3_int.c +87 -0
- data/third_party/boringssl/crypto/x509v3/v3_lib.c +335 -0
- data/third_party/boringssl/crypto/x509v3/v3_ncons.c +510 -0
- data/third_party/boringssl/crypto/x509v3/v3_pci.c +335 -0
- data/third_party/boringssl/crypto/x509v3/v3_pcia.c +56 -0
- data/third_party/boringssl/crypto/x509v3/v3_pcons.c +142 -0
- data/third_party/boringssl/crypto/x509v3/v3_pku.c +109 -0
- data/third_party/boringssl/crypto/x509v3/v3_pmaps.c +156 -0
- data/third_party/boringssl/crypto/x509v3/v3_prn.c +207 -0
- data/third_party/boringssl/crypto/x509v3/v3_purp.c +805 -0
- data/third_party/boringssl/crypto/x509v3/v3_skey.c +148 -0
- data/third_party/boringssl/crypto/x509v3/v3_sxnet.c +266 -0
- data/third_party/boringssl/crypto/x509v3/v3_utl.c +1322 -0
- data/third_party/boringssl/include/openssl/aead.h +346 -0
- data/third_party/boringssl/include/openssl/aes.h +158 -0
- data/third_party/boringssl/include/openssl/arm_arch.h +127 -0
- data/third_party/boringssl/include/openssl/asn1.h +1168 -0
- data/third_party/boringssl/include/openssl/asn1_mac.h +75 -0
- data/third_party/boringssl/include/openssl/asn1t.h +906 -0
- data/third_party/boringssl/include/openssl/base.h +261 -0
- data/third_party/boringssl/include/openssl/base64.h +184 -0
- data/third_party/boringssl/include/openssl/bio.h +902 -0
- data/third_party/boringssl/include/openssl/blowfish.h +93 -0
- data/third_party/boringssl/include/openssl/bn.h +885 -0
- data/third_party/boringssl/include/openssl/buf.h +118 -0
- data/third_party/boringssl/include/openssl/buffer.h +18 -0
- data/third_party/boringssl/include/openssl/bytestring.h +360 -0
- data/third_party/boringssl/include/openssl/cast.h +96 -0
- data/third_party/boringssl/include/openssl/chacha.h +37 -0
- data/third_party/boringssl/include/openssl/cipher.h +571 -0
- data/third_party/boringssl/include/openssl/cmac.h +76 -0
- data/third_party/boringssl/include/openssl/conf.h +145 -0
- data/third_party/boringssl/include/openssl/cpu.h +184 -0
- data/third_party/boringssl/include/openssl/crypto.h +68 -0
- data/third_party/boringssl/include/openssl/curve25519.h +88 -0
- data/third_party/boringssl/include/openssl/des.h +177 -0
- data/third_party/boringssl/include/openssl/dh.h +238 -0
- data/third_party/boringssl/include/openssl/digest.h +258 -0
- data/third_party/boringssl/include/openssl/dsa.h +343 -0
- data/third_party/boringssl/include/openssl/dtls1.h +16 -0
- data/third_party/boringssl/include/openssl/ec.h +355 -0
- data/third_party/boringssl/include/openssl/ec_key.h +280 -0
- data/third_party/boringssl/include/openssl/ecdh.h +102 -0
- data/third_party/boringssl/include/openssl/ecdsa.h +206 -0
- data/third_party/boringssl/include/openssl/engine.h +98 -0
- data/third_party/boringssl/include/openssl/err.h +487 -0
- data/third_party/boringssl/include/openssl/evp.h +750 -0
- data/third_party/boringssl/include/openssl/ex_data.h +213 -0
- data/third_party/boringssl/include/openssl/hkdf.h +44 -0
- data/third_party/boringssl/include/openssl/hmac.h +160 -0
- data/third_party/boringssl/include/openssl/lhash.h +192 -0
- data/third_party/boringssl/include/openssl/lhash_macros.h +132 -0
- data/third_party/boringssl/include/openssl/md4.h +102 -0
- data/third_party/boringssl/include/openssl/md5.h +107 -0
- data/third_party/boringssl/include/openssl/mem.h +140 -0
- data/third_party/boringssl/include/openssl/obj.h +198 -0
- data/third_party/boringssl/include/openssl/obj_mac.h +4140 -0
- data/third_party/boringssl/include/openssl/objects.h +18 -0
- data/third_party/boringssl/include/openssl/opensslfeatures.h +60 -0
- data/third_party/boringssl/include/openssl/opensslv.h +18 -0
- data/third_party/boringssl/include/openssl/ossl_typ.h +18 -0
- data/third_party/boringssl/include/openssl/pem.h +521 -0
- data/third_party/boringssl/include/openssl/pkcs12.h +18 -0
- data/third_party/boringssl/include/openssl/pkcs7.h +16 -0
- data/third_party/boringssl/include/openssl/pkcs8.h +220 -0
- data/third_party/boringssl/include/openssl/poly1305.h +51 -0
- data/third_party/boringssl/include/openssl/pqueue.h +146 -0
- data/third_party/boringssl/include/openssl/rand.h +113 -0
- data/third_party/boringssl/include/openssl/rc4.h +90 -0
- data/third_party/boringssl/include/openssl/rsa.h +637 -0
- data/third_party/boringssl/include/openssl/safestack.h +16 -0
- data/third_party/boringssl/include/openssl/sha.h +256 -0
- data/third_party/boringssl/include/openssl/srtp.h +18 -0
- data/third_party/boringssl/include/openssl/ssl.h +4466 -0
- data/third_party/boringssl/include/openssl/ssl3.h +441 -0
- data/third_party/boringssl/include/openssl/stack.h +298 -0
- data/third_party/boringssl/include/openssl/stack_macros.h +4190 -0
- data/third_party/boringssl/include/openssl/thread.h +173 -0
- data/third_party/boringssl/include/openssl/time_support.h +90 -0
- data/third_party/boringssl/include/openssl/tls1.h +653 -0
- data/third_party/boringssl/include/openssl/type_check.h +91 -0
- data/third_party/boringssl/include/openssl/x509.h +1258 -0
- data/third_party/boringssl/include/openssl/x509_vfy.h +611 -0
- data/third_party/boringssl/include/openssl/x509v3.h +798 -0
- data/third_party/boringssl/ssl/custom_extensions.c +257 -0
- data/third_party/boringssl/ssl/d1_both.c +880 -0
- data/third_party/boringssl/ssl/d1_clnt.c +566 -0
- data/third_party/boringssl/ssl/d1_lib.c +340 -0
- data/third_party/boringssl/ssl/d1_meth.c +130 -0
- data/third_party/boringssl/ssl/d1_pkt.c +578 -0
- data/third_party/boringssl/ssl/d1_srtp.c +234 -0
- data/third_party/boringssl/ssl/d1_srvr.c +485 -0
- data/third_party/boringssl/ssl/dtls_record.c +308 -0
- data/third_party/boringssl/ssl/internal.h +1276 -0
- data/third_party/boringssl/ssl/pqueue/pqueue.c +197 -0
- data/third_party/boringssl/ssl/s3_both.c +571 -0
- data/third_party/boringssl/ssl/s3_clnt.c +2241 -0
- data/third_party/boringssl/ssl/s3_enc.c +494 -0
- data/third_party/boringssl/ssl/s3_lib.c +587 -0
- data/third_party/boringssl/ssl/s3_meth.c +166 -0
- data/third_party/boringssl/ssl/s3_pkt.c +732 -0
- data/third_party/boringssl/ssl/s3_srvr.c +2536 -0
- data/third_party/boringssl/ssl/ssl_aead_ctx.c +300 -0
- data/third_party/boringssl/ssl/ssl_asn1.c +718 -0
- data/third_party/boringssl/ssl/ssl_buffer.c +319 -0
- data/third_party/boringssl/ssl/ssl_cert.c +539 -0
- data/third_party/boringssl/ssl/ssl_cipher.c +2003 -0
- data/third_party/boringssl/ssl/ssl_file.c +633 -0
- data/third_party/boringssl/ssl/ssl_lib.c +2653 -0
- data/third_party/boringssl/ssl/ssl_rsa.c +423 -0
- data/third_party/boringssl/ssl/ssl_session.c +764 -0
- data/third_party/boringssl/ssl/ssl_stat.c +591 -0
- data/third_party/boringssl/ssl/t1_enc.c +708 -0
- data/third_party/boringssl/ssl/t1_lib.c +2905 -0
- data/third_party/boringssl/ssl/test/async_bio.h +45 -0
- data/third_party/boringssl/ssl/test/packeted_bio.h +44 -0
- data/third_party/boringssl/ssl/test/scoped_types.h +28 -0
- data/third_party/boringssl/ssl/test/test_config.h +108 -0
- data/third_party/boringssl/ssl/tls_record.c +342 -0
- data/third_party/zlib/adler32.c +179 -0
- data/third_party/zlib/compress.c +80 -0
- data/third_party/zlib/crc32.c +425 -0
- data/third_party/zlib/crc32.h +441 -0
- data/third_party/zlib/deflate.c +1967 -0
- data/third_party/zlib/deflate.h +346 -0
- data/third_party/zlib/gzclose.c +25 -0
- data/third_party/zlib/gzguts.h +209 -0
- data/third_party/zlib/gzlib.c +634 -0
- data/third_party/zlib/gzread.c +594 -0
- data/third_party/zlib/gzwrite.c +577 -0
- data/third_party/zlib/infback.c +640 -0
- data/third_party/zlib/inffast.c +340 -0
- data/third_party/zlib/inffast.h +11 -0
- data/third_party/zlib/inffixed.h +94 -0
- data/third_party/zlib/inflate.c +1512 -0
- data/third_party/zlib/inflate.h +122 -0
- data/third_party/zlib/inftrees.c +306 -0
- data/third_party/zlib/inftrees.h +62 -0
- data/third_party/zlib/trees.c +1226 -0
- data/third_party/zlib/trees.h +128 -0
- data/third_party/zlib/uncompr.c +59 -0
- data/third_party/zlib/zconf.h +511 -0
- data/third_party/zlib/zlib.h +1768 -0
- data/third_party/zlib/zutil.c +324 -0
- data/third_party/zlib/zutil.h +253 -0
- metadata +492 -25
- data/Rakefile +0 -63
- data/src/ruby/lib/grpc/grpc.so +0 -0
@@ -0,0 +1,133 @@
|
|
1
|
+
/* pcy_map.c */
|
2
|
+
/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
|
3
|
+
* project 2004.
|
4
|
+
*/
|
5
|
+
/* ====================================================================
|
6
|
+
* Copyright (c) 2004 The OpenSSL Project. All rights reserved.
|
7
|
+
*
|
8
|
+
* Redistribution and use in source and binary forms, with or without
|
9
|
+
* modification, are permitted provided that the following conditions
|
10
|
+
* are met:
|
11
|
+
*
|
12
|
+
* 1. Redistributions of source code must retain the above copyright
|
13
|
+
* notice, this list of conditions and the following disclaimer.
|
14
|
+
*
|
15
|
+
* 2. Redistributions in binary form must reproduce the above copyright
|
16
|
+
* notice, this list of conditions and the following disclaimer in
|
17
|
+
* the documentation and/or other materials provided with the
|
18
|
+
* distribution.
|
19
|
+
*
|
20
|
+
* 3. All advertising materials mentioning features or use of this
|
21
|
+
* software must display the following acknowledgment:
|
22
|
+
* "This product includes software developed by the OpenSSL Project
|
23
|
+
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
|
24
|
+
*
|
25
|
+
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
26
|
+
* endorse or promote products derived from this software without
|
27
|
+
* prior written permission. For written permission, please contact
|
28
|
+
* licensing@OpenSSL.org.
|
29
|
+
*
|
30
|
+
* 5. Products derived from this software may not be called "OpenSSL"
|
31
|
+
* nor may "OpenSSL" appear in their names without prior written
|
32
|
+
* permission of the OpenSSL Project.
|
33
|
+
*
|
34
|
+
* 6. Redistributions of any form whatsoever must retain the following
|
35
|
+
* acknowledgment:
|
36
|
+
* "This product includes software developed by the OpenSSL Project
|
37
|
+
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
|
38
|
+
*
|
39
|
+
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
40
|
+
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
41
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
42
|
+
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
43
|
+
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
44
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
45
|
+
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
46
|
+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
47
|
+
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
48
|
+
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
49
|
+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
50
|
+
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
51
|
+
* ====================================================================
|
52
|
+
*
|
53
|
+
* This product includes cryptographic software written by Eric Young
|
54
|
+
* (eay@cryptsoft.com). This product includes software written by Tim
|
55
|
+
* Hudson (tjh@cryptsoft.com).
|
56
|
+
*
|
57
|
+
*/
|
58
|
+
|
59
|
+
#include <openssl/obj.h>
|
60
|
+
#include <openssl/x509.h>
|
61
|
+
#include <openssl/x509v3.h>
|
62
|
+
|
63
|
+
#include "pcy_int.h"
|
64
|
+
|
65
|
+
|
66
|
+
/* Set policy mapping entries in cache.
|
67
|
+
* Note: this modifies the passed POLICY_MAPPINGS structure
|
68
|
+
*/
|
69
|
+
|
70
|
+
int policy_cache_set_mapping(X509 *x, POLICY_MAPPINGS *maps)
|
71
|
+
{
|
72
|
+
POLICY_MAPPING *map;
|
73
|
+
X509_POLICY_DATA *data;
|
74
|
+
X509_POLICY_CACHE *cache = x->policy_cache;
|
75
|
+
size_t i;
|
76
|
+
int ret = 0;
|
77
|
+
if (sk_POLICY_MAPPING_num(maps) == 0)
|
78
|
+
{
|
79
|
+
ret = -1;
|
80
|
+
goto bad_mapping;
|
81
|
+
}
|
82
|
+
for (i = 0; i < sk_POLICY_MAPPING_num(maps); i++)
|
83
|
+
{
|
84
|
+
map = sk_POLICY_MAPPING_value(maps, i);
|
85
|
+
/* Reject if map to or from anyPolicy */
|
86
|
+
if ((OBJ_obj2nid(map->subjectDomainPolicy) == NID_any_policy)
|
87
|
+
|| (OBJ_obj2nid(map->issuerDomainPolicy) == NID_any_policy))
|
88
|
+
{
|
89
|
+
ret = -1;
|
90
|
+
goto bad_mapping;
|
91
|
+
}
|
92
|
+
|
93
|
+
/* Attempt to find matching policy data */
|
94
|
+
data = policy_cache_find_data(cache, map->issuerDomainPolicy);
|
95
|
+
/* If we don't have anyPolicy can't map */
|
96
|
+
if (!data && !cache->anyPolicy)
|
97
|
+
continue;
|
98
|
+
|
99
|
+
/* Create a NODE from anyPolicy */
|
100
|
+
if (!data)
|
101
|
+
{
|
102
|
+
data = policy_data_new(NULL, map->issuerDomainPolicy,
|
103
|
+
cache->anyPolicy->flags
|
104
|
+
& POLICY_DATA_FLAG_CRITICAL);
|
105
|
+
if (!data)
|
106
|
+
goto bad_mapping;
|
107
|
+
data->qualifier_set = cache->anyPolicy->qualifier_set;
|
108
|
+
/*map->issuerDomainPolicy = NULL;*/
|
109
|
+
data->flags |= POLICY_DATA_FLAG_MAPPED_ANY;
|
110
|
+
data->flags |= POLICY_DATA_FLAG_SHARED_QUALIFIERS;
|
111
|
+
if (!sk_X509_POLICY_DATA_push(cache->data, data))
|
112
|
+
{
|
113
|
+
policy_data_free(data);
|
114
|
+
goto bad_mapping;
|
115
|
+
}
|
116
|
+
}
|
117
|
+
else
|
118
|
+
data->flags |= POLICY_DATA_FLAG_MAPPED;
|
119
|
+
if (!sk_ASN1_OBJECT_push(data->expected_policy_set,
|
120
|
+
map->subjectDomainPolicy))
|
121
|
+
goto bad_mapping;
|
122
|
+
map->subjectDomainPolicy = NULL;
|
123
|
+
|
124
|
+
}
|
125
|
+
|
126
|
+
ret = 1;
|
127
|
+
bad_mapping:
|
128
|
+
if (ret == -1)
|
129
|
+
x->ex_flags |= EXFLAG_INVALID_POLICY;
|
130
|
+
sk_POLICY_MAPPING_pop_free(maps, POLICY_MAPPING_free);
|
131
|
+
return ret;
|
132
|
+
|
133
|
+
}
|
@@ -0,0 +1,197 @@
|
|
1
|
+
/* pcy_node.c */
|
2
|
+
/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
|
3
|
+
* project 2004.
|
4
|
+
*/
|
5
|
+
/* ====================================================================
|
6
|
+
* Copyright (c) 2004 The OpenSSL Project. All rights reserved.
|
7
|
+
*
|
8
|
+
* Redistribution and use in source and binary forms, with or without
|
9
|
+
* modification, are permitted provided that the following conditions
|
10
|
+
* are met:
|
11
|
+
*
|
12
|
+
* 1. Redistributions of source code must retain the above copyright
|
13
|
+
* notice, this list of conditions and the following disclaimer.
|
14
|
+
*
|
15
|
+
* 2. Redistributions in binary form must reproduce the above copyright
|
16
|
+
* notice, this list of conditions and the following disclaimer in
|
17
|
+
* the documentation and/or other materials provided with the
|
18
|
+
* distribution.
|
19
|
+
*
|
20
|
+
* 3. All advertising materials mentioning features or use of this
|
21
|
+
* software must display the following acknowledgment:
|
22
|
+
* "This product includes software developed by the OpenSSL Project
|
23
|
+
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
|
24
|
+
*
|
25
|
+
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
26
|
+
* endorse or promote products derived from this software without
|
27
|
+
* prior written permission. For written permission, please contact
|
28
|
+
* licensing@OpenSSL.org.
|
29
|
+
*
|
30
|
+
* 5. Products derived from this software may not be called "OpenSSL"
|
31
|
+
* nor may "OpenSSL" appear in their names without prior written
|
32
|
+
* permission of the OpenSSL Project.
|
33
|
+
*
|
34
|
+
* 6. Redistributions of any form whatsoever must retain the following
|
35
|
+
* acknowledgment:
|
36
|
+
* "This product includes software developed by the OpenSSL Project
|
37
|
+
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
|
38
|
+
*
|
39
|
+
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
40
|
+
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
41
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
42
|
+
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
43
|
+
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
44
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
45
|
+
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
46
|
+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
47
|
+
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
48
|
+
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
49
|
+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
50
|
+
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
51
|
+
* ====================================================================
|
52
|
+
*
|
53
|
+
* This product includes cryptographic software written by Eric Young
|
54
|
+
* (eay@cryptsoft.com). This product includes software written by Tim
|
55
|
+
* Hudson (tjh@cryptsoft.com). */
|
56
|
+
|
57
|
+
#include <openssl/asn1.h>
|
58
|
+
#include <openssl/mem.h>
|
59
|
+
#include <openssl/obj.h>
|
60
|
+
#include <openssl/x509.h>
|
61
|
+
#include <openssl/x509v3.h>
|
62
|
+
|
63
|
+
#include "pcy_int.h"
|
64
|
+
|
65
|
+
|
66
|
+
static int node_cmp(const X509_POLICY_NODE **a,
|
67
|
+
const X509_POLICY_NODE **b)
|
68
|
+
{
|
69
|
+
return OBJ_cmp((*a)->data->valid_policy, (*b)->data->valid_policy);
|
70
|
+
}
|
71
|
+
|
72
|
+
STACK_OF(X509_POLICY_NODE) *policy_node_cmp_new(void)
|
73
|
+
{
|
74
|
+
return sk_X509_POLICY_NODE_new(node_cmp);
|
75
|
+
}
|
76
|
+
|
77
|
+
X509_POLICY_NODE *tree_find_sk(STACK_OF(X509_POLICY_NODE) *nodes,
|
78
|
+
const ASN1_OBJECT *id)
|
79
|
+
{
|
80
|
+
X509_POLICY_DATA n;
|
81
|
+
X509_POLICY_NODE l;
|
82
|
+
size_t idx;
|
83
|
+
|
84
|
+
n.valid_policy = (ASN1_OBJECT *)id;
|
85
|
+
l.data = &n;
|
86
|
+
|
87
|
+
if (!sk_X509_POLICY_NODE_find(nodes, &idx, &l))
|
88
|
+
return NULL;
|
89
|
+
|
90
|
+
return sk_X509_POLICY_NODE_value(nodes, idx);
|
91
|
+
|
92
|
+
}
|
93
|
+
|
94
|
+
X509_POLICY_NODE *level_find_node(const X509_POLICY_LEVEL *level,
|
95
|
+
const X509_POLICY_NODE *parent,
|
96
|
+
const ASN1_OBJECT *id)
|
97
|
+
{
|
98
|
+
X509_POLICY_NODE *node;
|
99
|
+
size_t i;
|
100
|
+
for (i = 0; i < sk_X509_POLICY_NODE_num(level->nodes); i++)
|
101
|
+
{
|
102
|
+
node = sk_X509_POLICY_NODE_value(level->nodes, i);
|
103
|
+
if (node->parent == parent)
|
104
|
+
{
|
105
|
+
if (!OBJ_cmp(node->data->valid_policy, id))
|
106
|
+
return node;
|
107
|
+
}
|
108
|
+
}
|
109
|
+
return NULL;
|
110
|
+
}
|
111
|
+
|
112
|
+
X509_POLICY_NODE *level_add_node(X509_POLICY_LEVEL *level,
|
113
|
+
const X509_POLICY_DATA *data,
|
114
|
+
X509_POLICY_NODE *parent,
|
115
|
+
X509_POLICY_TREE *tree)
|
116
|
+
{
|
117
|
+
X509_POLICY_NODE *node;
|
118
|
+
node = OPENSSL_malloc(sizeof(X509_POLICY_NODE));
|
119
|
+
if (!node)
|
120
|
+
return NULL;
|
121
|
+
node->data = data;
|
122
|
+
node->parent = parent;
|
123
|
+
node->nchild = 0;
|
124
|
+
if (level)
|
125
|
+
{
|
126
|
+
if (OBJ_obj2nid(data->valid_policy) == NID_any_policy)
|
127
|
+
{
|
128
|
+
if (level->anyPolicy)
|
129
|
+
goto node_error;
|
130
|
+
level->anyPolicy = node;
|
131
|
+
}
|
132
|
+
else
|
133
|
+
{
|
134
|
+
|
135
|
+
if (!level->nodes)
|
136
|
+
level->nodes = policy_node_cmp_new();
|
137
|
+
if (!level->nodes)
|
138
|
+
goto node_error;
|
139
|
+
if (!sk_X509_POLICY_NODE_push(level->nodes, node))
|
140
|
+
goto node_error;
|
141
|
+
}
|
142
|
+
}
|
143
|
+
|
144
|
+
if (tree)
|
145
|
+
{
|
146
|
+
if (!tree->extra_data)
|
147
|
+
tree->extra_data = sk_X509_POLICY_DATA_new_null();
|
148
|
+
if (!tree->extra_data)
|
149
|
+
goto node_error;
|
150
|
+
if (!sk_X509_POLICY_DATA_push(tree->extra_data, data))
|
151
|
+
goto node_error;
|
152
|
+
}
|
153
|
+
|
154
|
+
if (parent)
|
155
|
+
parent->nchild++;
|
156
|
+
|
157
|
+
return node;
|
158
|
+
|
159
|
+
node_error:
|
160
|
+
policy_node_free(node);
|
161
|
+
return 0;
|
162
|
+
|
163
|
+
}
|
164
|
+
|
165
|
+
void policy_node_free(X509_POLICY_NODE *node)
|
166
|
+
{
|
167
|
+
OPENSSL_free(node);
|
168
|
+
}
|
169
|
+
|
170
|
+
/* See if a policy node matches a policy OID. If mapping enabled look through
|
171
|
+
* expected policy set otherwise just valid policy.
|
172
|
+
*/
|
173
|
+
|
174
|
+
int policy_node_match(const X509_POLICY_LEVEL *lvl,
|
175
|
+
const X509_POLICY_NODE *node, const ASN1_OBJECT *oid)
|
176
|
+
{
|
177
|
+
size_t i;
|
178
|
+
ASN1_OBJECT *policy_oid;
|
179
|
+
const X509_POLICY_DATA *x = node->data;
|
180
|
+
|
181
|
+
if ( (lvl->flags & X509_V_FLAG_INHIBIT_MAP)
|
182
|
+
|| !(x->flags & POLICY_DATA_FLAG_MAP_MASK))
|
183
|
+
{
|
184
|
+
if (!OBJ_cmp(x->valid_policy, oid))
|
185
|
+
return 1;
|
186
|
+
return 0;
|
187
|
+
}
|
188
|
+
|
189
|
+
for (i = 0; i < sk_ASN1_OBJECT_num(x->expected_policy_set); i++)
|
190
|
+
{
|
191
|
+
policy_oid = sk_ASN1_OBJECT_value(x->expected_policy_set, i);
|
192
|
+
if (!OBJ_cmp(policy_oid, oid))
|
193
|
+
return 1;
|
194
|
+
}
|
195
|
+
return 0;
|
196
|
+
|
197
|
+
}
|
@@ -0,0 +1,876 @@
|
|
1
|
+
/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
|
2
|
+
* project 2004.
|
3
|
+
*/
|
4
|
+
/* ====================================================================
|
5
|
+
* Copyright (c) 2004 The OpenSSL Project. All rights reserved.
|
6
|
+
*
|
7
|
+
* Redistribution and use in source and binary forms, with or without
|
8
|
+
* modification, are permitted provided that the following conditions
|
9
|
+
* are met:
|
10
|
+
*
|
11
|
+
* 1. Redistributions of source code must retain the above copyright
|
12
|
+
* notice, this list of conditions and the following disclaimer.
|
13
|
+
*
|
14
|
+
* 2. Redistributions in binary form must reproduce the above copyright
|
15
|
+
* notice, this list of conditions and the following disclaimer in
|
16
|
+
* the documentation and/or other materials provided with the
|
17
|
+
* distribution.
|
18
|
+
*
|
19
|
+
* 3. All advertising materials mentioning features or use of this
|
20
|
+
* software must display the following acknowledgment:
|
21
|
+
* "This product includes software developed by the OpenSSL Project
|
22
|
+
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
|
23
|
+
*
|
24
|
+
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
25
|
+
* endorse or promote products derived from this software without
|
26
|
+
* prior written permission. For written permission, please contact
|
27
|
+
* licensing@OpenSSL.org.
|
28
|
+
*
|
29
|
+
* 5. Products derived from this software may not be called "OpenSSL"
|
30
|
+
* nor may "OpenSSL" appear in their names without prior written
|
31
|
+
* permission of the OpenSSL Project.
|
32
|
+
*
|
33
|
+
* 6. Redistributions of any form whatsoever must retain the following
|
34
|
+
* acknowledgment:
|
35
|
+
* "This product includes software developed by the OpenSSL Project
|
36
|
+
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
|
37
|
+
*
|
38
|
+
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
39
|
+
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
40
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
41
|
+
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
42
|
+
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
43
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
44
|
+
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
45
|
+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
46
|
+
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
47
|
+
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
48
|
+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
49
|
+
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
50
|
+
* ====================================================================
|
51
|
+
*
|
52
|
+
* This product includes cryptographic software written by Eric Young
|
53
|
+
* (eay@cryptsoft.com). This product includes software written by Tim
|
54
|
+
* Hudson (tjh@cryptsoft.com).
|
55
|
+
*
|
56
|
+
*/
|
57
|
+
|
58
|
+
#include <string.h>
|
59
|
+
|
60
|
+
#include <openssl/mem.h>
|
61
|
+
#include <openssl/obj.h>
|
62
|
+
#include <openssl/stack.h>
|
63
|
+
#include <openssl/thread.h>
|
64
|
+
#include <openssl/x509.h>
|
65
|
+
#include <openssl/x509v3.h>
|
66
|
+
|
67
|
+
#include "pcy_int.h"
|
68
|
+
|
69
|
+
|
70
|
+
/* Enable this to print out the complete policy tree at various point during
|
71
|
+
* evaluation.
|
72
|
+
*/
|
73
|
+
|
74
|
+
/*#define OPENSSL_POLICY_DEBUG*/
|
75
|
+
|
76
|
+
#ifdef OPENSSL_POLICY_DEBUG
|
77
|
+
|
78
|
+
static void expected_print(BIO *err, X509_POLICY_LEVEL *lev,
|
79
|
+
X509_POLICY_NODE *node, int indent)
|
80
|
+
{
|
81
|
+
if ( (lev->flags & X509_V_FLAG_INHIBIT_MAP)
|
82
|
+
|| !(node->data->flags & POLICY_DATA_FLAG_MAP_MASK))
|
83
|
+
BIO_puts(err, " Not Mapped\n");
|
84
|
+
else
|
85
|
+
{
|
86
|
+
int i;
|
87
|
+
STACK_OF(ASN1_OBJECT) *pset = node->data->expected_policy_set;
|
88
|
+
ASN1_OBJECT *oid;
|
89
|
+
BIO_puts(err, " Expected: ");
|
90
|
+
for (i = 0; i < sk_ASN1_OBJECT_num(pset); i++)
|
91
|
+
{
|
92
|
+
oid = sk_ASN1_OBJECT_value(pset, i);
|
93
|
+
if (i)
|
94
|
+
BIO_puts(err, ", ");
|
95
|
+
i2a_ASN1_OBJECT(err, oid);
|
96
|
+
}
|
97
|
+
BIO_puts(err, "\n");
|
98
|
+
}
|
99
|
+
}
|
100
|
+
|
101
|
+
static void tree_print(char *str, X509_POLICY_TREE *tree,
|
102
|
+
X509_POLICY_LEVEL *curr)
|
103
|
+
{
|
104
|
+
X509_POLICY_LEVEL *plev;
|
105
|
+
X509_POLICY_NODE *node;
|
106
|
+
int i;
|
107
|
+
BIO *err;
|
108
|
+
err = BIO_new_fp(stderr, BIO_NOCLOSE);
|
109
|
+
if (!curr)
|
110
|
+
curr = tree->levels + tree->nlevel;
|
111
|
+
else
|
112
|
+
curr++;
|
113
|
+
BIO_printf(err, "Level print after %s\n", str);
|
114
|
+
BIO_printf(err, "Printing Up to Level %ld\n", curr - tree->levels);
|
115
|
+
for (plev = tree->levels; plev != curr; plev++)
|
116
|
+
{
|
117
|
+
BIO_printf(err, "Level %ld, flags = %x\n",
|
118
|
+
plev - tree->levels, plev->flags);
|
119
|
+
for (i = 0; i < sk_X509_POLICY_NODE_num(plev->nodes); i++)
|
120
|
+
{
|
121
|
+
node = sk_X509_POLICY_NODE_value(plev->nodes, i);
|
122
|
+
X509_POLICY_NODE_print(err, node, 2);
|
123
|
+
expected_print(err, plev, node, 2);
|
124
|
+
BIO_printf(err, " Flags: %x\n", node->data->flags);
|
125
|
+
}
|
126
|
+
if (plev->anyPolicy)
|
127
|
+
X509_POLICY_NODE_print(err, plev->anyPolicy, 2);
|
128
|
+
}
|
129
|
+
|
130
|
+
BIO_free(err);
|
131
|
+
|
132
|
+
}
|
133
|
+
#else
|
134
|
+
|
135
|
+
#define tree_print(a,b,c) /* */
|
136
|
+
|
137
|
+
#endif
|
138
|
+
|
139
|
+
/* Initialize policy tree. Return values:
|
140
|
+
* 0 Some internal error occured.
|
141
|
+
* -1 Inconsistent or invalid extensions in certificates.
|
142
|
+
* 1 Tree initialized OK.
|
143
|
+
* 2 Policy tree is empty.
|
144
|
+
* 5 Tree OK and requireExplicitPolicy true.
|
145
|
+
* 6 Tree empty and requireExplicitPolicy true.
|
146
|
+
*/
|
147
|
+
|
148
|
+
static int tree_init(X509_POLICY_TREE **ptree, STACK_OF(X509) *certs,
|
149
|
+
unsigned int flags)
|
150
|
+
{
|
151
|
+
X509_POLICY_TREE *tree;
|
152
|
+
X509_POLICY_LEVEL *level;
|
153
|
+
const X509_POLICY_CACHE *cache;
|
154
|
+
X509_POLICY_DATA *data = NULL;
|
155
|
+
X509 *x;
|
156
|
+
int ret = 1;
|
157
|
+
int i, n;
|
158
|
+
int explicit_policy;
|
159
|
+
int any_skip;
|
160
|
+
int map_skip;
|
161
|
+
*ptree = NULL;
|
162
|
+
n = sk_X509_num(certs);
|
163
|
+
|
164
|
+
#if 0
|
165
|
+
/* Disable policy mapping for now... */
|
166
|
+
flags |= X509_V_FLAG_INHIBIT_MAP;
|
167
|
+
#endif
|
168
|
+
|
169
|
+
if (flags & X509_V_FLAG_EXPLICIT_POLICY)
|
170
|
+
explicit_policy = 0;
|
171
|
+
else
|
172
|
+
explicit_policy = n + 1;
|
173
|
+
|
174
|
+
if (flags & X509_V_FLAG_INHIBIT_ANY)
|
175
|
+
any_skip = 0;
|
176
|
+
else
|
177
|
+
any_skip = n + 1;
|
178
|
+
|
179
|
+
if (flags & X509_V_FLAG_INHIBIT_MAP)
|
180
|
+
map_skip = 0;
|
181
|
+
else
|
182
|
+
map_skip = n + 1;
|
183
|
+
|
184
|
+
/* Can't do anything with just a trust anchor */
|
185
|
+
if (n == 1)
|
186
|
+
return 1;
|
187
|
+
/* First setup policy cache in all certificates apart from the
|
188
|
+
* trust anchor. Note any bad cache results on the way. Also can
|
189
|
+
* calculate explicit_policy value at this point.
|
190
|
+
*/
|
191
|
+
for (i = n - 2; i >= 0; i--)
|
192
|
+
{
|
193
|
+
x = sk_X509_value(certs, i);
|
194
|
+
X509_check_purpose(x, -1, -1);
|
195
|
+
cache = policy_cache_set(x);
|
196
|
+
/* If cache NULL something bad happened: return immediately */
|
197
|
+
if (cache == NULL)
|
198
|
+
return 0;
|
199
|
+
/* If inconsistent extensions keep a note of it but continue */
|
200
|
+
if (x->ex_flags & EXFLAG_INVALID_POLICY)
|
201
|
+
ret = -1;
|
202
|
+
/* Otherwise if we have no data (hence no CertificatePolicies)
|
203
|
+
* and haven't already set an inconsistent code note it.
|
204
|
+
*/
|
205
|
+
else if ((ret == 1) && !cache->data)
|
206
|
+
ret = 2;
|
207
|
+
if (explicit_policy > 0)
|
208
|
+
{
|
209
|
+
if (!(x->ex_flags & EXFLAG_SI))
|
210
|
+
explicit_policy--;
|
211
|
+
if ((cache->explicit_skip != -1)
|
212
|
+
&& (cache->explicit_skip < explicit_policy))
|
213
|
+
explicit_policy = cache->explicit_skip;
|
214
|
+
}
|
215
|
+
}
|
216
|
+
|
217
|
+
if (ret != 1)
|
218
|
+
{
|
219
|
+
if (ret == 2 && !explicit_policy)
|
220
|
+
return 6;
|
221
|
+
return ret;
|
222
|
+
}
|
223
|
+
|
224
|
+
|
225
|
+
/* If we get this far initialize the tree */
|
226
|
+
|
227
|
+
tree = OPENSSL_malloc(sizeof(X509_POLICY_TREE));
|
228
|
+
|
229
|
+
if (!tree)
|
230
|
+
return 0;
|
231
|
+
|
232
|
+
tree->flags = 0;
|
233
|
+
tree->levels = OPENSSL_malloc(sizeof(X509_POLICY_LEVEL) * n);
|
234
|
+
tree->nlevel = 0;
|
235
|
+
tree->extra_data = NULL;
|
236
|
+
tree->auth_policies = NULL;
|
237
|
+
tree->user_policies = NULL;
|
238
|
+
|
239
|
+
if (!tree->levels)
|
240
|
+
{
|
241
|
+
OPENSSL_free(tree);
|
242
|
+
return 0;
|
243
|
+
}
|
244
|
+
|
245
|
+
memset(tree->levels, 0, n * sizeof(X509_POLICY_LEVEL));
|
246
|
+
|
247
|
+
tree->nlevel = n;
|
248
|
+
|
249
|
+
level = tree->levels;
|
250
|
+
|
251
|
+
/* Root data: initialize to anyPolicy */
|
252
|
+
|
253
|
+
data = policy_data_new(NULL, OBJ_nid2obj(NID_any_policy), 0);
|
254
|
+
|
255
|
+
if (!data || !level_add_node(level, data, NULL, tree))
|
256
|
+
goto bad_tree;
|
257
|
+
|
258
|
+
for (i = n - 2; i >= 0; i--)
|
259
|
+
{
|
260
|
+
level++;
|
261
|
+
x = sk_X509_value(certs, i);
|
262
|
+
cache = policy_cache_set(x);
|
263
|
+
level->cert = X509_up_ref(x);
|
264
|
+
|
265
|
+
if (!cache->anyPolicy)
|
266
|
+
level->flags |= X509_V_FLAG_INHIBIT_ANY;
|
267
|
+
|
268
|
+
/* Determine inhibit any and inhibit map flags */
|
269
|
+
if (any_skip == 0)
|
270
|
+
{
|
271
|
+
/* Any matching allowed if certificate is self
|
272
|
+
* issued and not the last in the chain.
|
273
|
+
*/
|
274
|
+
if (!(x->ex_flags & EXFLAG_SI) || (i == 0))
|
275
|
+
level->flags |= X509_V_FLAG_INHIBIT_ANY;
|
276
|
+
}
|
277
|
+
else
|
278
|
+
{
|
279
|
+
if (!(x->ex_flags & EXFLAG_SI))
|
280
|
+
any_skip--;
|
281
|
+
if ((cache->any_skip >= 0)
|
282
|
+
&& (cache->any_skip < any_skip))
|
283
|
+
any_skip = cache->any_skip;
|
284
|
+
}
|
285
|
+
|
286
|
+
if (map_skip == 0)
|
287
|
+
level->flags |= X509_V_FLAG_INHIBIT_MAP;
|
288
|
+
else
|
289
|
+
{
|
290
|
+
if (!(x->ex_flags & EXFLAG_SI))
|
291
|
+
map_skip--;
|
292
|
+
if ((cache->map_skip >= 0)
|
293
|
+
&& (cache->map_skip < map_skip))
|
294
|
+
map_skip = cache->map_skip;
|
295
|
+
}
|
296
|
+
|
297
|
+
}
|
298
|
+
|
299
|
+
*ptree = tree;
|
300
|
+
|
301
|
+
if (explicit_policy)
|
302
|
+
return 1;
|
303
|
+
else
|
304
|
+
return 5;
|
305
|
+
|
306
|
+
bad_tree:
|
307
|
+
|
308
|
+
X509_policy_tree_free(tree);
|
309
|
+
|
310
|
+
return 0;
|
311
|
+
|
312
|
+
}
|
313
|
+
|
314
|
+
static int tree_link_matching_nodes(X509_POLICY_LEVEL *curr,
|
315
|
+
const X509_POLICY_DATA *data)
|
316
|
+
{
|
317
|
+
X509_POLICY_LEVEL *last = curr - 1;
|
318
|
+
X509_POLICY_NODE *node;
|
319
|
+
int matched = 0;
|
320
|
+
size_t i;
|
321
|
+
/* Iterate through all in nodes linking matches */
|
322
|
+
for (i = 0; i < sk_X509_POLICY_NODE_num(last->nodes); i++)
|
323
|
+
{
|
324
|
+
node = sk_X509_POLICY_NODE_value(last->nodes, i);
|
325
|
+
if (policy_node_match(last, node, data->valid_policy))
|
326
|
+
{
|
327
|
+
if (!level_add_node(curr, data, node, NULL))
|
328
|
+
return 0;
|
329
|
+
matched = 1;
|
330
|
+
}
|
331
|
+
}
|
332
|
+
if (!matched && last->anyPolicy)
|
333
|
+
{
|
334
|
+
if (!level_add_node(curr, data, last->anyPolicy, NULL))
|
335
|
+
return 0;
|
336
|
+
}
|
337
|
+
return 1;
|
338
|
+
}
|
339
|
+
|
340
|
+
/* This corresponds to RFC3280 6.1.3(d)(1):
|
341
|
+
* link any data from CertificatePolicies onto matching parent
|
342
|
+
* or anyPolicy if no match.
|
343
|
+
*/
|
344
|
+
|
345
|
+
static int tree_link_nodes(X509_POLICY_LEVEL *curr,
|
346
|
+
const X509_POLICY_CACHE *cache)
|
347
|
+
{
|
348
|
+
size_t i;
|
349
|
+
X509_POLICY_DATA *data;
|
350
|
+
|
351
|
+
for (i = 0; i < sk_X509_POLICY_DATA_num(cache->data); i++)
|
352
|
+
{
|
353
|
+
data = sk_X509_POLICY_DATA_value(cache->data, i);
|
354
|
+
/* If a node is mapped any it doesn't have a corresponding
|
355
|
+
* CertificatePolicies entry.
|
356
|
+
* However such an identical node would be created
|
357
|
+
* if anyPolicy matching is enabled because there would be
|
358
|
+
* no match with the parent valid_policy_set. So we create
|
359
|
+
* link because then it will have the mapping flags
|
360
|
+
* right and we can prune it later.
|
361
|
+
*/
|
362
|
+
#if 0
|
363
|
+
if ((data->flags & POLICY_DATA_FLAG_MAPPED_ANY)
|
364
|
+
&& !(curr->flags & X509_V_FLAG_INHIBIT_ANY))
|
365
|
+
continue;
|
366
|
+
#endif
|
367
|
+
/* Look for matching nodes in previous level */
|
368
|
+
if (!tree_link_matching_nodes(curr, data))
|
369
|
+
return 0;
|
370
|
+
}
|
371
|
+
return 1;
|
372
|
+
}
|
373
|
+
|
374
|
+
/* This corresponds to RFC3280 6.1.3(d)(2):
|
375
|
+
* Create new data for any unmatched policies in the parent and link
|
376
|
+
* to anyPolicy.
|
377
|
+
*/
|
378
|
+
|
379
|
+
static int tree_add_unmatched(X509_POLICY_LEVEL *curr,
|
380
|
+
const X509_POLICY_CACHE *cache,
|
381
|
+
const ASN1_OBJECT *id,
|
382
|
+
X509_POLICY_NODE *node,
|
383
|
+
X509_POLICY_TREE *tree)
|
384
|
+
{
|
385
|
+
X509_POLICY_DATA *data;
|
386
|
+
if (id == NULL)
|
387
|
+
id = node->data->valid_policy;
|
388
|
+
/* Create a new node with qualifiers from anyPolicy and
|
389
|
+
* id from unmatched node.
|
390
|
+
*/
|
391
|
+
data = policy_data_new(NULL, id, node_critical(node));
|
392
|
+
|
393
|
+
if (data == NULL)
|
394
|
+
return 0;
|
395
|
+
/* Curr may not have anyPolicy */
|
396
|
+
data->qualifier_set = cache->anyPolicy->qualifier_set;
|
397
|
+
data->flags |= POLICY_DATA_FLAG_SHARED_QUALIFIERS;
|
398
|
+
if (!level_add_node(curr, data, node, tree))
|
399
|
+
{
|
400
|
+
policy_data_free(data);
|
401
|
+
return 0;
|
402
|
+
}
|
403
|
+
|
404
|
+
return 1;
|
405
|
+
}
|
406
|
+
|
407
|
+
static int tree_link_unmatched(X509_POLICY_LEVEL *curr,
|
408
|
+
const X509_POLICY_CACHE *cache,
|
409
|
+
X509_POLICY_NODE *node,
|
410
|
+
X509_POLICY_TREE *tree)
|
411
|
+
{
|
412
|
+
const X509_POLICY_LEVEL *last = curr - 1;
|
413
|
+
size_t i;
|
414
|
+
|
415
|
+
if ( (last->flags & X509_V_FLAG_INHIBIT_MAP)
|
416
|
+
|| !(node->data->flags & POLICY_DATA_FLAG_MAPPED))
|
417
|
+
{
|
418
|
+
/* If no policy mapping: matched if one child present */
|
419
|
+
if (node->nchild)
|
420
|
+
return 1;
|
421
|
+
if (!tree_add_unmatched(curr, cache, NULL, node, tree))
|
422
|
+
return 0;
|
423
|
+
/* Add it */
|
424
|
+
}
|
425
|
+
else
|
426
|
+
{
|
427
|
+
/* If mapping: matched if one child per expected policy set */
|
428
|
+
STACK_OF(ASN1_OBJECT) *expset = node->data->expected_policy_set;
|
429
|
+
if ((size_t) node->nchild == sk_ASN1_OBJECT_num(expset))
|
430
|
+
return 1;
|
431
|
+
/* Locate unmatched nodes */
|
432
|
+
for (i = 0; i < sk_ASN1_OBJECT_num(expset); i++)
|
433
|
+
{
|
434
|
+
ASN1_OBJECT *oid = sk_ASN1_OBJECT_value(expset, i);
|
435
|
+
if (level_find_node(curr, node, oid))
|
436
|
+
continue;
|
437
|
+
if (!tree_add_unmatched(curr, cache, oid, node, tree))
|
438
|
+
return 0;
|
439
|
+
}
|
440
|
+
|
441
|
+
}
|
442
|
+
|
443
|
+
return 1;
|
444
|
+
|
445
|
+
}
|
446
|
+
|
447
|
+
static int tree_link_any(X509_POLICY_LEVEL *curr,
|
448
|
+
const X509_POLICY_CACHE *cache,
|
449
|
+
X509_POLICY_TREE *tree)
|
450
|
+
{
|
451
|
+
size_t i;
|
452
|
+
/*X509_POLICY_DATA *data;*/
|
453
|
+
X509_POLICY_NODE *node;
|
454
|
+
X509_POLICY_LEVEL *last = curr - 1;
|
455
|
+
|
456
|
+
for (i = 0; i < sk_X509_POLICY_NODE_num(last->nodes); i++)
|
457
|
+
{
|
458
|
+
node = sk_X509_POLICY_NODE_value(last->nodes, i);
|
459
|
+
|
460
|
+
if (!tree_link_unmatched(curr, cache, node, tree))
|
461
|
+
return 0;
|
462
|
+
|
463
|
+
#if 0
|
464
|
+
|
465
|
+
/* Skip any node with any children: we only want unmathced
|
466
|
+
* nodes.
|
467
|
+
*
|
468
|
+
* Note: need something better for policy mapping
|
469
|
+
* because each node may have multiple children
|
470
|
+
*/
|
471
|
+
if (node->nchild)
|
472
|
+
continue;
|
473
|
+
|
474
|
+
/* Create a new node with qualifiers from anyPolicy and
|
475
|
+
* id from unmatched node.
|
476
|
+
*/
|
477
|
+
data = policy_data_new(NULL, node->data->valid_policy,
|
478
|
+
node_critical(node));
|
479
|
+
|
480
|
+
if (data == NULL)
|
481
|
+
return 0;
|
482
|
+
/* Curr may not have anyPolicy */
|
483
|
+
data->qualifier_set = cache->anyPolicy->qualifier_set;
|
484
|
+
data->flags |= POLICY_DATA_FLAG_SHARED_QUALIFIERS;
|
485
|
+
if (!level_add_node(curr, data, node, tree))
|
486
|
+
{
|
487
|
+
policy_data_free(data);
|
488
|
+
return 0;
|
489
|
+
}
|
490
|
+
|
491
|
+
#endif
|
492
|
+
|
493
|
+
}
|
494
|
+
/* Finally add link to anyPolicy */
|
495
|
+
if (last->anyPolicy)
|
496
|
+
{
|
497
|
+
if (!level_add_node(curr, cache->anyPolicy,
|
498
|
+
last->anyPolicy, NULL))
|
499
|
+
return 0;
|
500
|
+
}
|
501
|
+
return 1;
|
502
|
+
}
|
503
|
+
|
504
|
+
/* Prune the tree: delete any child mapped child data on the current level
|
505
|
+
* then proceed up the tree deleting any data with no children. If we ever
|
506
|
+
* have no data on a level we can halt because the tree will be empty.
|
507
|
+
*/
|
508
|
+
|
509
|
+
static int tree_prune(X509_POLICY_TREE *tree, X509_POLICY_LEVEL *curr)
|
510
|
+
{
|
511
|
+
STACK_OF(X509_POLICY_NODE) *nodes;
|
512
|
+
X509_POLICY_NODE *node;
|
513
|
+
int i;
|
514
|
+
nodes = curr->nodes;
|
515
|
+
if (curr->flags & X509_V_FLAG_INHIBIT_MAP)
|
516
|
+
{
|
517
|
+
for (i = sk_X509_POLICY_NODE_num(nodes) - 1; i >= 0; i--)
|
518
|
+
{
|
519
|
+
node = sk_X509_POLICY_NODE_value(nodes, i);
|
520
|
+
/* Delete any mapped data: see RFC3280 XXXX */
|
521
|
+
if (node->data->flags & POLICY_DATA_FLAG_MAP_MASK)
|
522
|
+
{
|
523
|
+
node->parent->nchild--;
|
524
|
+
OPENSSL_free(node);
|
525
|
+
(void)sk_X509_POLICY_NODE_delete(nodes,i);
|
526
|
+
}
|
527
|
+
}
|
528
|
+
}
|
529
|
+
|
530
|
+
for(;;) {
|
531
|
+
--curr;
|
532
|
+
nodes = curr->nodes;
|
533
|
+
for (i = sk_X509_POLICY_NODE_num(nodes) - 1; i >= 0; i--)
|
534
|
+
{
|
535
|
+
node = sk_X509_POLICY_NODE_value(nodes, i);
|
536
|
+
if (node->nchild == 0)
|
537
|
+
{
|
538
|
+
node->parent->nchild--;
|
539
|
+
OPENSSL_free(node);
|
540
|
+
(void)sk_X509_POLICY_NODE_delete(nodes, i);
|
541
|
+
}
|
542
|
+
}
|
543
|
+
if (curr->anyPolicy && !curr->anyPolicy->nchild)
|
544
|
+
{
|
545
|
+
if (curr->anyPolicy->parent)
|
546
|
+
curr->anyPolicy->parent->nchild--;
|
547
|
+
OPENSSL_free(curr->anyPolicy);
|
548
|
+
curr->anyPolicy = NULL;
|
549
|
+
}
|
550
|
+
if (curr == tree->levels)
|
551
|
+
{
|
552
|
+
/* If we zapped anyPolicy at top then tree is empty */
|
553
|
+
if (!curr->anyPolicy)
|
554
|
+
return 2;
|
555
|
+
return 1;
|
556
|
+
}
|
557
|
+
}
|
558
|
+
|
559
|
+
}
|
560
|
+
|
561
|
+
static int tree_add_auth_node(STACK_OF(X509_POLICY_NODE) **pnodes,
|
562
|
+
X509_POLICY_NODE *pcy)
|
563
|
+
{
|
564
|
+
if (!*pnodes)
|
565
|
+
{
|
566
|
+
*pnodes = policy_node_cmp_new();
|
567
|
+
if (!*pnodes)
|
568
|
+
return 0;
|
569
|
+
}
|
570
|
+
else if (sk_X509_POLICY_NODE_find(*pnodes, NULL, pcy))
|
571
|
+
return 1;
|
572
|
+
|
573
|
+
if (!sk_X509_POLICY_NODE_push(*pnodes, pcy))
|
574
|
+
return 0;
|
575
|
+
|
576
|
+
return 1;
|
577
|
+
|
578
|
+
}
|
579
|
+
|
580
|
+
/* Calculate the authority set based on policy tree.
|
581
|
+
* The 'pnodes' parameter is used as a store for the set of policy nodes
|
582
|
+
* used to calculate the user set. If the authority set is not anyPolicy
|
583
|
+
* then pnodes will just point to the authority set. If however the authority
|
584
|
+
* set is anyPolicy then the set of valid policies (other than anyPolicy)
|
585
|
+
* is store in pnodes. The return value of '2' is used in this case to indicate
|
586
|
+
* that pnodes should be freed.
|
587
|
+
*/
|
588
|
+
|
589
|
+
static int tree_calculate_authority_set(X509_POLICY_TREE *tree,
|
590
|
+
STACK_OF(X509_POLICY_NODE) **pnodes)
|
591
|
+
{
|
592
|
+
X509_POLICY_LEVEL *curr;
|
593
|
+
X509_POLICY_NODE *node, *anyptr;
|
594
|
+
STACK_OF(X509_POLICY_NODE) **addnodes;
|
595
|
+
int i;
|
596
|
+
size_t j;
|
597
|
+
curr = tree->levels + tree->nlevel - 1;
|
598
|
+
|
599
|
+
/* If last level contains anyPolicy set is anyPolicy */
|
600
|
+
if (curr->anyPolicy)
|
601
|
+
{
|
602
|
+
if (!tree_add_auth_node(&tree->auth_policies, curr->anyPolicy))
|
603
|
+
return 0;
|
604
|
+
addnodes = pnodes;
|
605
|
+
}
|
606
|
+
else
|
607
|
+
/* Add policies to authority set */
|
608
|
+
addnodes = &tree->auth_policies;
|
609
|
+
|
610
|
+
curr = tree->levels;
|
611
|
+
for (i = 1; i < tree->nlevel; i++)
|
612
|
+
{
|
613
|
+
/* If no anyPolicy node on this this level it can't
|
614
|
+
* appear on lower levels so end search.
|
615
|
+
*/
|
616
|
+
if (!(anyptr = curr->anyPolicy))
|
617
|
+
break;
|
618
|
+
curr++;
|
619
|
+
for (j = 0; j < sk_X509_POLICY_NODE_num(curr->nodes); j++)
|
620
|
+
{
|
621
|
+
node = sk_X509_POLICY_NODE_value(curr->nodes, j);
|
622
|
+
if ((node->parent == anyptr)
|
623
|
+
&& !tree_add_auth_node(addnodes, node))
|
624
|
+
return 0;
|
625
|
+
}
|
626
|
+
}
|
627
|
+
|
628
|
+
if (addnodes == pnodes)
|
629
|
+
return 2;
|
630
|
+
|
631
|
+
*pnodes = tree->auth_policies;
|
632
|
+
|
633
|
+
return 1;
|
634
|
+
}
|
635
|
+
|
636
|
+
static int tree_calculate_user_set(X509_POLICY_TREE *tree,
|
637
|
+
STACK_OF(ASN1_OBJECT) *policy_oids,
|
638
|
+
STACK_OF(X509_POLICY_NODE) *auth_nodes)
|
639
|
+
{
|
640
|
+
size_t i;
|
641
|
+
X509_POLICY_NODE *node;
|
642
|
+
ASN1_OBJECT *oid;
|
643
|
+
|
644
|
+
X509_POLICY_NODE *anyPolicy;
|
645
|
+
X509_POLICY_DATA *extra;
|
646
|
+
|
647
|
+
/* Check if anyPolicy present in authority constrained policy set:
|
648
|
+
* this will happen if it is a leaf node.
|
649
|
+
*/
|
650
|
+
|
651
|
+
if (sk_ASN1_OBJECT_num(policy_oids) <= 0)
|
652
|
+
return 1;
|
653
|
+
|
654
|
+
anyPolicy = tree->levels[tree->nlevel - 1].anyPolicy;
|
655
|
+
|
656
|
+
for (i = 0; i < sk_ASN1_OBJECT_num(policy_oids); i++)
|
657
|
+
{
|
658
|
+
oid = sk_ASN1_OBJECT_value(policy_oids, i);
|
659
|
+
if (OBJ_obj2nid(oid) == NID_any_policy)
|
660
|
+
{
|
661
|
+
tree->flags |= POLICY_FLAG_ANY_POLICY;
|
662
|
+
return 1;
|
663
|
+
}
|
664
|
+
}
|
665
|
+
|
666
|
+
for (i = 0; i < sk_ASN1_OBJECT_num(policy_oids); i++)
|
667
|
+
{
|
668
|
+
oid = sk_ASN1_OBJECT_value(policy_oids, i);
|
669
|
+
node = tree_find_sk(auth_nodes, oid);
|
670
|
+
if (!node)
|
671
|
+
{
|
672
|
+
if (!anyPolicy)
|
673
|
+
continue;
|
674
|
+
/* Create a new node with policy ID from user set
|
675
|
+
* and qualifiers from anyPolicy.
|
676
|
+
*/
|
677
|
+
extra = policy_data_new(NULL, oid,
|
678
|
+
node_critical(anyPolicy));
|
679
|
+
if (!extra)
|
680
|
+
return 0;
|
681
|
+
extra->qualifier_set = anyPolicy->data->qualifier_set;
|
682
|
+
extra->flags = POLICY_DATA_FLAG_SHARED_QUALIFIERS
|
683
|
+
| POLICY_DATA_FLAG_EXTRA_NODE;
|
684
|
+
node = level_add_node(NULL, extra, anyPolicy->parent,
|
685
|
+
tree);
|
686
|
+
}
|
687
|
+
if (!tree->user_policies)
|
688
|
+
{
|
689
|
+
tree->user_policies = sk_X509_POLICY_NODE_new_null();
|
690
|
+
if (!tree->user_policies)
|
691
|
+
return 1;
|
692
|
+
}
|
693
|
+
if (!sk_X509_POLICY_NODE_push(tree->user_policies, node))
|
694
|
+
return 0;
|
695
|
+
}
|
696
|
+
return 1;
|
697
|
+
|
698
|
+
}
|
699
|
+
|
700
|
+
static int tree_evaluate(X509_POLICY_TREE *tree)
|
701
|
+
{
|
702
|
+
int ret, i;
|
703
|
+
X509_POLICY_LEVEL *curr = tree->levels + 1;
|
704
|
+
const X509_POLICY_CACHE *cache;
|
705
|
+
|
706
|
+
for(i = 1; i < tree->nlevel; i++, curr++)
|
707
|
+
{
|
708
|
+
cache = policy_cache_set(curr->cert);
|
709
|
+
if (!tree_link_nodes(curr, cache))
|
710
|
+
return 0;
|
711
|
+
|
712
|
+
if (!(curr->flags & X509_V_FLAG_INHIBIT_ANY)
|
713
|
+
&& !tree_link_any(curr, cache, tree))
|
714
|
+
return 0;
|
715
|
+
tree_print("before tree_prune()", tree, curr);
|
716
|
+
ret = tree_prune(tree, curr);
|
717
|
+
if (ret != 1)
|
718
|
+
return ret;
|
719
|
+
}
|
720
|
+
|
721
|
+
return 1;
|
722
|
+
|
723
|
+
}
|
724
|
+
|
725
|
+
static void exnode_free(X509_POLICY_NODE *node)
|
726
|
+
{
|
727
|
+
if (node->data && (node->data->flags & POLICY_DATA_FLAG_EXTRA_NODE))
|
728
|
+
OPENSSL_free(node);
|
729
|
+
}
|
730
|
+
|
731
|
+
|
732
|
+
void X509_policy_tree_free(X509_POLICY_TREE *tree)
|
733
|
+
{
|
734
|
+
X509_POLICY_LEVEL *curr;
|
735
|
+
int i;
|
736
|
+
|
737
|
+
if (!tree)
|
738
|
+
return;
|
739
|
+
|
740
|
+
sk_X509_POLICY_NODE_free(tree->auth_policies);
|
741
|
+
sk_X509_POLICY_NODE_pop_free(tree->user_policies, exnode_free);
|
742
|
+
|
743
|
+
for(i = 0, curr = tree->levels; i < tree->nlevel; i++, curr++)
|
744
|
+
{
|
745
|
+
if (curr->cert)
|
746
|
+
X509_free(curr->cert);
|
747
|
+
if (curr->nodes)
|
748
|
+
sk_X509_POLICY_NODE_pop_free(curr->nodes,
|
749
|
+
policy_node_free);
|
750
|
+
if (curr->anyPolicy)
|
751
|
+
policy_node_free(curr->anyPolicy);
|
752
|
+
}
|
753
|
+
|
754
|
+
if (tree->extra_data)
|
755
|
+
sk_X509_POLICY_DATA_pop_free(tree->extra_data,
|
756
|
+
policy_data_free);
|
757
|
+
|
758
|
+
OPENSSL_free(tree->levels);
|
759
|
+
OPENSSL_free(tree);
|
760
|
+
|
761
|
+
}
|
762
|
+
|
763
|
+
/* Application policy checking function.
|
764
|
+
* Return codes:
|
765
|
+
* 0 Internal Error.
|
766
|
+
* 1 Successful.
|
767
|
+
* -1 One or more certificates contain invalid or inconsistent extensions
|
768
|
+
* -2 User constrained policy set empty and requireExplicit true.
|
769
|
+
*/
|
770
|
+
|
771
|
+
int X509_policy_check(X509_POLICY_TREE **ptree, int *pexplicit_policy,
|
772
|
+
STACK_OF(X509) *certs,
|
773
|
+
STACK_OF(ASN1_OBJECT) *policy_oids,
|
774
|
+
unsigned int flags)
|
775
|
+
{
|
776
|
+
int ret;
|
777
|
+
X509_POLICY_TREE *tree = NULL;
|
778
|
+
STACK_OF(X509_POLICY_NODE) *nodes, *auth_nodes = NULL;
|
779
|
+
*ptree = NULL;
|
780
|
+
|
781
|
+
*pexplicit_policy = 0;
|
782
|
+
ret = tree_init(&tree, certs, flags);
|
783
|
+
|
784
|
+
switch (ret)
|
785
|
+
{
|
786
|
+
|
787
|
+
/* Tree empty requireExplicit False: OK */
|
788
|
+
case 2:
|
789
|
+
return 1;
|
790
|
+
|
791
|
+
/* Some internal error */
|
792
|
+
case -1:
|
793
|
+
return -1;
|
794
|
+
|
795
|
+
/* Some internal error */
|
796
|
+
case 0:
|
797
|
+
return 0;
|
798
|
+
|
799
|
+
/* Tree empty requireExplicit True: Error */
|
800
|
+
|
801
|
+
case 6:
|
802
|
+
*pexplicit_policy = 1;
|
803
|
+
return -2;
|
804
|
+
|
805
|
+
/* Tree OK requireExplicit True: OK and continue */
|
806
|
+
case 5:
|
807
|
+
*pexplicit_policy = 1;
|
808
|
+
break;
|
809
|
+
|
810
|
+
/* Tree OK: continue */
|
811
|
+
|
812
|
+
case 1:
|
813
|
+
if (!tree)
|
814
|
+
/*
|
815
|
+
* tree_init() returns success and a null tree
|
816
|
+
* if it's just looking at a trust anchor.
|
817
|
+
* I'm not sure that returning success here is
|
818
|
+
* correct, but I'm sure that reporting this
|
819
|
+
* as an internal error which our caller
|
820
|
+
* interprets as a malloc failure is wrong.
|
821
|
+
*/
|
822
|
+
return 1;
|
823
|
+
break;
|
824
|
+
}
|
825
|
+
|
826
|
+
if (!tree) goto error;
|
827
|
+
ret = tree_evaluate(tree);
|
828
|
+
|
829
|
+
tree_print("tree_evaluate()", tree, NULL);
|
830
|
+
|
831
|
+
if (ret <= 0)
|
832
|
+
goto error;
|
833
|
+
|
834
|
+
/* Return value 2 means tree empty */
|
835
|
+
if (ret == 2)
|
836
|
+
{
|
837
|
+
X509_policy_tree_free(tree);
|
838
|
+
if (*pexplicit_policy)
|
839
|
+
return -2;
|
840
|
+
else
|
841
|
+
return 1;
|
842
|
+
}
|
843
|
+
|
844
|
+
/* Tree is not empty: continue */
|
845
|
+
|
846
|
+
ret = tree_calculate_authority_set(tree, &auth_nodes);
|
847
|
+
|
848
|
+
if (!ret)
|
849
|
+
goto error;
|
850
|
+
|
851
|
+
if (!tree_calculate_user_set(tree, policy_oids, auth_nodes))
|
852
|
+
goto error;
|
853
|
+
|
854
|
+
if (ret == 2)
|
855
|
+
sk_X509_POLICY_NODE_free(auth_nodes);
|
856
|
+
|
857
|
+
if (tree)
|
858
|
+
*ptree = tree;
|
859
|
+
|
860
|
+
if (*pexplicit_policy)
|
861
|
+
{
|
862
|
+
nodes = X509_policy_tree_get0_user_policies(tree);
|
863
|
+
if (sk_X509_POLICY_NODE_num(nodes) <= 0)
|
864
|
+
return -2;
|
865
|
+
}
|
866
|
+
|
867
|
+
return 1;
|
868
|
+
|
869
|
+
error:
|
870
|
+
|
871
|
+
X509_policy_tree_free(tree);
|
872
|
+
|
873
|
+
return 0;
|
874
|
+
|
875
|
+
}
|
876
|
+
|